Repository: facebook/igl Branch: main Commit: 8673f9c38a7a Files: 1071 Total size: 16.0 MB Directory structure: gitextract_czmiq_qe/ ├── .clang-format ├── .claude/ │ └── CLAUDE.md ├── .cmake-format ├── .github/ │ ├── pull_request_template.md │ └── workflows/ │ ├── c-cpp.yml │ ├── cmake-install-test.yml │ └── doc-build.yml ├── .gitignore ├── CMakeLists.txt ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── IGLU/ │ ├── CMakeLists.txt │ ├── bitmap/ │ │ ├── BitmapWriter.cpp │ │ └── BitmapWriter.h │ ├── command_buffer_allocator/ │ │ ├── ICommandBufferAllocator.cpp │ │ └── ICommandBufferAllocator.h │ ├── imgui/ │ │ ├── InputListener.cpp │ │ ├── InputListener.h │ │ ├── KeyCodeTranslator.cpp │ │ ├── KeyCodeTranslator.h │ │ ├── Session.cpp │ │ ├── Session.h │ │ ├── compile_shaders.bat │ │ ├── compile_shaders.py │ │ ├── imgui_ps_d3d12.hlsl │ │ ├── imgui_ps_d3d12_fxc.h │ │ ├── imgui_vs_d3d12.hlsl │ │ └── imgui_vs_d3d12_fxc.h │ ├── managedUniformBuffer/ │ │ ├── ManagedUniformBuffer.cpp │ │ └── ManagedUniformBuffer.h │ ├── sentinel/ │ │ ├── Assert.h │ │ ├── Buffer.cpp │ │ ├── Buffer.h │ │ ├── CommandBuffer.cpp │ │ ├── CommandBuffer.h │ │ ├── CommandQueue.cpp │ │ ├── CommandQueue.h │ │ ├── Device.cpp │ │ ├── Device.h │ │ ├── Framebuffer.cpp │ │ ├── Framebuffer.h │ │ ├── PlatformDevice.cpp │ │ └── PlatformDevice.h │ ├── shaderCross/ │ │ ├── ShaderCross.cpp │ │ ├── ShaderCross.h │ │ ├── ShaderCrossUniformBuffer.cpp │ │ └── ShaderCrossUniformBuffer.h │ ├── simdtypes/ │ │ ├── SimdTypes.h │ │ └── SimdUtilities.h │ ├── simple_renderer/ │ │ ├── Drawable.cpp │ │ ├── Drawable.h │ │ ├── ForwardRenderPass.cpp │ │ ├── ForwardRenderPass.h │ │ ├── Material.cpp │ │ ├── Material.h │ │ ├── ParametricVertexData.cpp │ │ ├── ParametricVertexData.h │ │ ├── ShaderProgram.cpp │ │ ├── ShaderProgram.h │ │ ├── ShaderUniforms.cpp │ │ ├── ShaderUniforms.h │ │ ├── VertexData.cpp │ │ └── VertexData.h │ ├── state_pool/ │ │ ├── ComputePipelineStatePool.cpp │ │ ├── ComputePipelineStatePool.h │ │ ├── DepthStencilStatePool.cpp │ │ ├── DepthStencilStatePool.h │ │ ├── RenderPipelineStatePool.cpp │ │ ├── RenderPipelineStatePool.h │ │ ├── StatePool.h │ │ ├── VertexInputStatePool.cpp │ │ └── VertexInputStatePool.h │ ├── texture_accessor/ │ │ ├── ITextureAccessor.h │ │ ├── MetalTextureAccessor.h │ │ ├── MetalTextureAccessor.mm │ │ ├── OpenGLTextureAccessor.cpp │ │ ├── OpenGLTextureAccessor.h │ │ ├── TextureAccessorFactory.cpp │ │ ├── TextureAccessorFactory.h │ │ ├── VulkanTextureAccessor.cpp │ │ └── VulkanTextureAccessor.h │ ├── texture_loader/ │ │ ├── DataReader.cpp │ │ ├── DataReader.h │ │ ├── IData.cpp │ │ ├── IData.h │ │ ├── ITextureLoader.cpp │ │ ├── ITextureLoader.h │ │ ├── ITextureLoaderFactory.cpp │ │ ├── ITextureLoaderFactory.h │ │ ├── TextureLoaderFactory.cpp │ │ ├── TextureLoaderFactory.h │ │ ├── ktx/ │ │ │ ├── TextureLoaderFactory.cpp │ │ │ └── TextureLoaderFactory.h │ │ ├── ktx1/ │ │ │ ├── Header.cpp │ │ │ ├── Header.h │ │ │ ├── TextureLoaderFactory.cpp │ │ │ └── TextureLoaderFactory.h │ │ ├── ktx2/ │ │ │ ├── Header.cpp │ │ │ ├── Header.h │ │ │ ├── TextureLoaderFactory.cpp │ │ │ └── TextureLoaderFactory.h │ │ ├── stb_hdr/ │ │ │ ├── Header.cpp │ │ │ ├── Header.h │ │ │ ├── TextureLoaderFactory.cpp │ │ │ └── TextureLoaderFactory.h │ │ ├── stb_image/ │ │ │ ├── TextureLoaderFactory.cpp │ │ │ └── TextureLoaderFactory.h │ │ ├── stb_jpeg/ │ │ │ ├── Header.cpp │ │ │ ├── Header.h │ │ │ ├── TextureLoaderFactory.cpp │ │ │ └── TextureLoaderFactory.h │ │ ├── stb_png/ │ │ │ ├── Header.cpp │ │ │ ├── Header.h │ │ │ ├── TextureLoaderFactory.cpp │ │ │ └── TextureLoaderFactory.h │ │ └── xtc1/ │ │ ├── Header.cpp │ │ ├── Header.h │ │ ├── TextureLoaderFactory.cpp │ │ └── TextureLoaderFactory.h │ └── uniform/ │ ├── Collection.cpp │ ├── Collection.h │ ├── CollectionEncoder.cpp │ ├── CollectionEncoder.h │ ├── Descriptor.cpp │ ├── Descriptor.h │ ├── Encoder.cpp │ ├── Encoder.h │ └── Trait.h ├── LICENSE.md ├── README.md ├── ROADMAP.md ├── build/ │ └── .gitignore ├── cmake/ │ ├── IGLConfig.cmake.in │ └── install.cmake ├── deploy_content.py ├── deploy_deps.py ├── docs/ │ ├── .gitignore │ ├── Makefile │ ├── README.md │ ├── make.bat │ ├── requirements.txt │ └── source/ │ ├── _extensions/ │ │ └── style.py │ ├── conf.py │ ├── data/ │ │ └── placeholder │ ├── getting-started/ │ │ └── index.md │ ├── index.md │ ├── introduction.md │ ├── theme/ │ │ ├── extra.css │ │ └── sphinx_literate.css │ └── video/ │ └── placeholder ├── getting-started.md ├── samples/ │ ├── android/ │ │ ├── opengl/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── facebook/ │ │ │ │ └── igl/ │ │ │ │ └── sample/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ ├── SampleActivity.java │ │ │ │ ├── SampleLib.java │ │ │ │ └── SampleView.java │ │ │ └── jni/ │ │ │ ├── Jni.cpp │ │ │ ├── TinyRenderer.cpp │ │ │ └── TinyRenderer.h │ │ └── vulkan/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── facebook/ │ │ │ └── igl/ │ │ │ └── sample/ │ │ │ ├── AndroidManifest.xml │ │ │ └── SampleActivity.java │ │ └── jni/ │ │ └── Tiny.cpp │ ├── desktop/ │ │ ├── CMakeLists.txt │ │ └── Tiny/ │ │ ├── Tiny.cpp │ │ ├── Tiny_Mesh.cpp │ │ └── Tiny_MeshLarge.cpp │ ├── ios/ │ │ └── snapshot_test_support/ │ │ ├── IGLBytesToUIImage.h │ │ ├── IGLBytesToUIImage.mm │ │ ├── IGLSnapshotTestCase.h │ │ ├── IGLSnapshotTestCase.mm │ │ ├── TinyRenderable.cpp │ │ └── TinyRenderable.hpp │ └── wasm/ │ ├── CMakeLists.txt │ ├── Common.cpp │ ├── Common.h │ ├── Tiny_Mesh.cpp │ ├── Triangle.cpp │ └── igl.html ├── shell/ │ ├── CMakeLists.txt │ ├── android/ │ │ ├── CMakeLists.txt │ │ ├── java/ │ │ │ └── com/ │ │ │ └── facebook/ │ │ │ └── igl/ │ │ │ └── sample/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── SampleActivity.java │ │ │ ├── SampleLib.java │ │ │ ├── SampleView.java │ │ │ └── VulkanView.java │ │ └── jni/ │ │ ├── Jni.cpp │ │ ├── TinyRenderer.cpp │ │ └── TinyRenderer.h │ ├── apps/ │ │ └── SessionApp.cpp │ ├── ios/ │ │ ├── AppDelegate.h │ │ ├── AppDelegate.mm │ │ ├── BackendVersion.h │ │ ├── BackendVersion.mm │ │ ├── CMakeLists.txt │ │ ├── IglShellPlatformAdapter.h │ │ ├── IglShellPlatformAdapterInternal.hpp │ │ ├── IglSurfaceTexturesAdapter.h │ │ ├── IglSurfaceTexturesAdapterInternal.hpp │ │ ├── RenderSessionController.h │ │ ├── RenderSessionController.mm │ │ ├── RenderSessionFactoryAdapter.h │ │ ├── RenderSessionFactoryAdapterInternal.hpp │ │ ├── RenderSessionFactoryProvider.h │ │ ├── RenderSessionFactoryProvider.mm │ │ ├── View.h │ │ ├── View.m │ │ ├── ViewController.h │ │ ├── ViewController.mm │ │ └── main.mm │ ├── mac/ │ │ ├── AppDelegate.h │ │ ├── AppDelegate.mm │ │ ├── CMakeLists.txt │ │ ├── GLView.h │ │ ├── GLView.mm │ │ ├── HeadlessView.h │ │ ├── HeadlessView.mm │ │ ├── MetalView.h │ │ ├── MetalView.m │ │ ├── ViewController.h │ │ ├── ViewController.mm │ │ ├── VulkanView.h │ │ ├── VulkanView.mm │ │ └── main.mm │ ├── openxr/ │ │ ├── CMakeLists.txt │ │ ├── XrApp.h │ │ ├── XrComposition.cpp │ │ ├── XrComposition.h │ │ ├── XrCompositionProjection.cpp │ │ ├── XrCompositionProjection.h │ │ ├── XrCompositionQuad.cpp │ │ ├── XrCompositionQuad.h │ │ ├── XrHands.cpp │ │ ├── XrHands.h │ │ ├── XrLog.cpp │ │ ├── XrLog.h │ │ ├── XrPassthrough.cpp │ │ ├── XrPassthrough.h │ │ ├── XrPlatform.h │ │ ├── XrRefreshRate.cpp │ │ ├── XrRefreshRate.h │ │ ├── XrSwapchainProvider.cpp │ │ ├── XrSwapchainProvider.h │ │ ├── impl/ │ │ │ ├── XrAppImpl.h │ │ │ └── XrSwapchainProviderImpl.h │ │ └── mobile/ │ │ ├── AndroidMain.cpp │ │ ├── XrApp.cpp │ │ ├── java/ │ │ │ └── com/ │ │ │ └── facebook/ │ │ │ └── igl/ │ │ │ └── shell/ │ │ │ └── openxr/ │ │ │ ├── gles/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── MainActivity.java │ │ │ └── vulkan/ │ │ │ ├── AndroidManifest.xml │ │ │ └── MainActivity.java │ │ ├── opengl/ │ │ │ ├── XrAppImplGLES.cpp │ │ │ ├── XrAppImplGLES.h │ │ │ ├── XrSwapchainProviderImplGLES.cpp │ │ │ └── XrSwapchainProviderImplGLES.h │ │ └── vulkan/ │ │ ├── XrAppImplVulkan.cpp │ │ ├── XrAppImplVulkan.h │ │ ├── XrSwapchainProviderImplVulkan.cpp │ │ └── XrSwapchainProviderImplVulkan.h │ ├── renderSessionTests/ │ │ ├── BasicFramebufferTests.cpp │ │ └── IGLSampleTests.cpp │ ├── renderSessions/ │ │ ├── BasicFramebufferSession.cpp │ │ ├── BasicFramebufferSession.h │ │ ├── BindGroupSession.cpp │ │ ├── BindGroupSession.h │ │ ├── BindlessBufferSession.cpp │ │ ├── BindlessBufferSession.h │ │ ├── BufferMappingSession.cpp │ │ ├── BufferMappingSession.h │ │ ├── CheckerboardMipmapSession.cpp │ │ ├── CheckerboardMipmapSession.h │ │ ├── ColorSession.cpp │ │ ├── ColorSession.h │ │ ├── CopyOperationsSession.cpp │ │ ├── CopyOperationsSession.h │ │ ├── DepthBiasSession.cpp │ │ ├── DepthBiasSession.h │ │ ├── DrawInstancedSession.cpp │ │ ├── DrawInstancedSession.h │ │ ├── EmptySession.cpp │ │ ├── EmptySession.h │ │ ├── FireworksSession.cpp │ │ ├── FireworksSession.h │ │ ├── GPUStressSession.cpp │ │ ├── GPUStressSession.h │ │ ├── GPUTimerSession.cpp │ │ ├── GPUTimerSession.h │ │ ├── HandsOpenXRSession.cpp │ │ ├── HandsOpenXRSession.h │ │ ├── HelloOpenXRSession.cpp │ │ ├── HelloOpenXRSession.h │ │ ├── HelloWorldSession.cpp │ │ ├── HelloWorldSession.h │ │ ├── ImguiSession.cpp │ │ ├── ImguiSession.h │ │ ├── MRTSession.cpp │ │ ├── MRTSession.h │ │ ├── MeshShaderTriangleSession.cpp │ │ ├── MeshShaderTriangleSession.h │ │ ├── MultiDrawIndexedIndirectSession.cpp │ │ ├── MultiDrawIndexedIndirectSession.h │ │ ├── ScissorTestSession.cpp │ │ ├── ScissorTestSession.h │ │ ├── StencilOutlineSession.cpp │ │ ├── StencilOutlineSession.h │ │ ├── TQMultiRenderPassSession.cpp │ │ ├── TQMultiRenderPassSession.h │ │ ├── TQSession.cpp │ │ ├── TQSession.h │ │ ├── TextureViewSession.cpp │ │ ├── TextureViewSession.h │ │ ├── Textured3DCubeSession.cpp │ │ ├── Textured3DCubeSession.h │ │ ├── TinyMeshBindGroupSession.cpp │ │ ├── TinyMeshBindGroupSession.h │ │ ├── TinyMeshSession.cpp │ │ ├── TinyMeshSession.h │ │ ├── WireframeSession.cpp │ │ ├── WireframeSession.h │ │ ├── YUVColorSession.cpp │ │ └── YUVColorSession.h │ ├── resources/ │ │ ├── images/ │ │ │ ├── macbeth.ktx │ │ │ ├── macbeth.ktx2 │ │ │ ├── output_frame_900.420p.txt │ │ │ ├── output_frame_900.420p.yuv │ │ │ ├── output_frame_900.nv12.txt │ │ │ └── output_frame_900.nv12.yuv │ │ ├── mac/ │ │ │ ├── Assets.xcassets/ │ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── Contents.json │ │ │ ├── Base.lproj/ │ │ │ │ └── MainMenu.xib │ │ │ ├── Entitlements.plist │ │ │ └── Info.plist │ │ ├── models/ │ │ │ └── DamagedHelmet.gltf │ │ └── shaders/ │ │ ├── ShaderLibraryTest-ios.metallib │ │ ├── ShaderLibraryTest-macos.metallib │ │ └── ShaderLibraryTest.metal │ ├── shared/ │ │ ├── extension/ │ │ │ ├── Extension.h │ │ │ ├── ExtensionLoader.cpp │ │ │ ├── ExtensionLoader.h │ │ │ ├── SymbolFactoryLoader.cpp │ │ │ └── SymbolFactoryLoader.h │ │ ├── fileLoader/ │ │ │ ├── FileLoader.cpp │ │ │ ├── FileLoader.h │ │ │ ├── android/ │ │ │ │ ├── FileLoaderAndroid.cpp │ │ │ │ └── FileLoaderAndroid.h │ │ │ ├── apple/ │ │ │ │ ├── FileLoaderApple.h │ │ │ │ └── FileLoaderApple.mm │ │ │ ├── linux/ │ │ │ │ ├── FileLoaderLinux.cpp │ │ │ │ └── FileLoaderLinux.h │ │ │ └── win/ │ │ │ ├── FileLoaderWin.cpp │ │ │ └── FileLoaderWin.h │ │ ├── imageLoader/ │ │ │ ├── ImageLoader.cpp │ │ │ ├── ImageLoader.h │ │ │ └── tests/ │ │ │ └── ImageLoaderTest.cpp │ │ ├── imageWriter/ │ │ │ ├── ImageWriter.h │ │ │ ├── android/ │ │ │ │ └── ImageWriterAndroid.h │ │ │ ├── ios/ │ │ │ │ ├── ImageWriterIos.h │ │ │ │ └── ImageWriterIos.mm │ │ │ ├── linux/ │ │ │ │ └── ImageWriterLinux.h │ │ │ ├── mac/ │ │ │ │ └── ImageWriterMac.h │ │ │ ├── stb/ │ │ │ │ ├── ImageWriterSTB.cpp │ │ │ │ └── ImageWriterSTB.h │ │ │ └── win/ │ │ │ └── ImageWriterWin.h │ │ ├── input/ │ │ │ ├── InputDispatcher.cpp │ │ │ ├── InputDispatcher.h │ │ │ ├── IntentListener.h │ │ │ ├── KeyListener.h │ │ │ ├── MouseListener.h │ │ │ ├── RayListener.h │ │ │ └── TouchListener.h │ │ ├── netservice/ │ │ │ ├── NetService.h │ │ │ ├── NetServiceExtension.cpp │ │ │ ├── NetServiceExtension.h │ │ │ ├── NetServiceFactory.h │ │ │ ├── Stream.h │ │ │ ├── apple/ │ │ │ │ ├── NetServiceApple.h │ │ │ │ ├── NetServiceApple.mm │ │ │ │ ├── NetServiceExtensionApple.h │ │ │ │ ├── NetServiceExtensionApple.mm │ │ │ │ ├── StreamApple.h │ │ │ │ └── StreamApple.mm │ │ │ └── zeromq/ │ │ │ ├── NetServiceExtensionZeroMQ.h │ │ │ ├── NetServiceZeroMQ.h │ │ │ └── StreamZeroMQ.h │ │ ├── platform/ │ │ │ ├── DisplayContext.h │ │ │ ├── Factory.cpp │ │ │ ├── Factory.h │ │ │ ├── Platform.cpp │ │ │ ├── Platform.h │ │ │ ├── android/ │ │ │ │ ├── PlatformAndroid.cpp │ │ │ │ └── PlatformAndroid.h │ │ │ ├── ios/ │ │ │ │ ├── PlatformIos.h │ │ │ │ └── PlatformIos.mm │ │ │ ├── linux/ │ │ │ │ ├── PlatformLinux.cpp │ │ │ │ └── PlatformLinux.h │ │ │ ├── mac/ │ │ │ │ ├── PlatformMac.cpp │ │ │ │ └── PlatformMac.h │ │ │ └── win/ │ │ │ ├── PlatformWin.cpp │ │ │ └── PlatformWin.h │ │ ├── renderSession/ │ │ │ ├── AppParams.h │ │ │ ├── BenchmarkTracker.cpp │ │ │ ├── BenchmarkTracker.h │ │ │ ├── DefaultRenderSessionFactory.h │ │ │ ├── DefaultSession.h │ │ │ ├── DepthParams.h │ │ │ ├── Fov.h │ │ │ ├── Hands.h │ │ │ ├── IRenderSessionFactory.h │ │ │ ├── QuadLayerParams.h │ │ │ ├── RenderMode.h │ │ │ ├── RenderSession.cpp │ │ │ ├── RenderSession.h │ │ │ ├── RenderSessionConfig.h │ │ │ ├── RenderSessionLoader.hpp │ │ │ ├── RenderSessionRegistry.cpp │ │ │ ├── RenderSessionRegistry.hpp │ │ │ ├── RenderSessionWindowConfig.h │ │ │ ├── ScreenshotTestRenderSessionHelper.cpp │ │ │ ├── ScreenshotTestRenderSessionHelper.h │ │ │ ├── ShaderProvider.h │ │ │ ├── ShaderStagesCreator.cpp │ │ │ ├── ShaderStagesCreator.h │ │ │ ├── ShellParams.cpp │ │ │ ├── ShellParams.h │ │ │ ├── ShellType.h │ │ │ └── ViewParams.h │ │ └── testShell/ │ │ ├── TestShell.cpp │ │ └── TestShell.h │ └── windows/ │ ├── CMakeLists.txt │ ├── common/ │ │ ├── GlfwShell.cpp │ │ └── GlfwShell.h │ ├── d3d12/ │ │ └── App.cpp │ ├── opengl/ │ │ ├── App.cpp │ │ └── AutoContextReleaseDevice.h │ ├── opengles/ │ │ └── App.cpp │ └── vulkan/ │ └── App.cpp ├── src/ │ └── igl/ │ ├── Assert.cpp │ ├── Assert.h │ ├── Buffer.h │ ├── CMakeLists.txt │ ├── Color.h │ ├── ColorSpace.h │ ├── CommandBuffer.h │ ├── CommandEncoder.h │ ├── CommandQueue.h │ ├── Common.cpp │ ├── Common.h │ ├── ComputeCommandEncoder.h │ ├── ComputePipelineState.h │ ├── Config.h │ ├── Core.h │ ├── DebugMacros.h │ ├── DepthStencilState.cpp │ ├── DepthStencilState.h │ ├── Device.cpp │ ├── Device.h │ ├── DeviceFeatures.h │ ├── FPSCounter.h │ ├── Format.h │ ├── Framebuffer.h │ ├── FramebufferWrapper.cpp │ ├── FramebufferWrapper.h │ ├── HWDevice.h │ ├── IGL.h │ ├── IGLFolly.h │ ├── IGLSafeC.h │ ├── IResourceTracker.h │ ├── ITrackedResource.h │ ├── Log.cpp │ ├── Log.h │ ├── Macros.h │ ├── NameHandle.cpp │ ├── NameHandle.h │ ├── PlatformDevice.h │ ├── RenderCommandEncoder.h │ ├── RenderPass.h │ ├── RenderPipelineReflection.h │ ├── RenderPipelineState.cpp │ ├── RenderPipelineState.h │ ├── SamplerState.cpp │ ├── SamplerState.h │ ├── Shader.cpp │ ├── Shader.h │ ├── ShaderCreator.cpp │ ├── ShaderCreator.h │ ├── Texture.cpp │ ├── Texture.h │ ├── TextureFormat.h │ ├── Timer.h │ ├── TimestampQueries.h │ ├── Uniform.cpp │ ├── Uniform.h │ ├── VertexInputState.cpp │ ├── VertexInputState.h │ ├── android/ │ │ ├── LogDefault.cpp │ │ ├── LogDefault.h │ │ ├── NativeHWBuffer.cpp │ │ └── NativeHWBuffer.h │ ├── apple/ │ │ ├── LogDefault.cpp │ │ └── LogDefault.h │ ├── base/ │ │ ├── Common.h │ │ ├── IAttachmentInterop.h │ │ ├── IDeviceBase.h │ │ ├── IFramebufferInterop.h │ │ └── IStagingBufferInterop.h │ ├── d3d12/ │ │ ├── Buffer.cpp │ │ ├── Buffer.h │ │ ├── CMakeLists.txt │ │ ├── CommandBuffer.cpp │ │ ├── CommandBuffer.h │ │ ├── CommandQueue.cpp │ │ ├── CommandQueue.h │ │ ├── Common.cpp │ │ ├── Common.h │ │ ├── ComputeCommandEncoder.cpp │ │ ├── ComputeCommandEncoder.h │ │ ├── ComputePipelineState.cpp │ │ ├── ComputePipelineState.h │ │ ├── D3D12AllocatorPool.cpp │ │ ├── D3D12AllocatorPool.h │ │ ├── D3D12Context.cpp │ │ ├── D3D12Context.h │ │ ├── D3D12DeviceCapabilities.cpp │ │ ├── D3D12DeviceCapabilities.h │ │ ├── D3D12FenceWaiter.cpp │ │ ├── D3D12FenceWaiter.h │ │ ├── D3D12FrameManager.cpp │ │ ├── D3D12FrameManager.h │ │ ├── D3D12Headers.h │ │ ├── D3D12ImmediateCommands.cpp │ │ ├── D3D12ImmediateCommands.h │ │ ├── D3D12PipelineBuilder.cpp │ │ ├── D3D12PipelineBuilder.h │ │ ├── D3D12PipelineCache.cpp │ │ ├── D3D12PipelineCache.h │ │ ├── D3D12PresentManager.cpp │ │ ├── D3D12PresentManager.h │ │ ├── D3D12ReflectionUtils.cpp │ │ ├── D3D12ReflectionUtils.h │ │ ├── D3D12ResourcesBinder.cpp │ │ ├── D3D12ResourcesBinder.h │ │ ├── D3D12RootSignatureKey.h │ │ ├── D3D12SamplerCache.h │ │ ├── D3D12StagingDevice.cpp │ │ ├── D3D12StagingDevice.h │ │ ├── D3D12StateTransition.h │ │ ├── D3D12Telemetry.h │ │ ├── DXCCompiler.cpp │ │ ├── DXCCompiler.h │ │ ├── DepthStencilState.h │ │ ├── DescriptorHeapManager.cpp │ │ ├── DescriptorHeapManager.h │ │ ├── Device.cpp │ │ ├── Device.h │ │ ├── Framebuffer.cpp │ │ ├── Framebuffer.h │ │ ├── HeadlessContext.cpp │ │ ├── HeadlessContext.h │ │ ├── PlatformDevice.cpp │ │ ├── PlatformDevice.h │ │ ├── RenderCommandEncoder.cpp │ │ ├── RenderCommandEncoder.h │ │ ├── RenderPipelineState.cpp │ │ ├── RenderPipelineState.h │ │ ├── SamplerState.cpp │ │ ├── SamplerState.h │ │ ├── ShaderModule.cpp │ │ ├── ShaderModule.h │ │ ├── Texture.cpp │ │ ├── Texture.h │ │ ├── TextureCopyUtils.cpp │ │ ├── TextureCopyUtils.h │ │ ├── Timer.cpp │ │ ├── Timer.h │ │ ├── UploadRingBuffer.cpp │ │ ├── UploadRingBuffer.h │ │ └── VertexInputState.h │ ├── glslang/ │ │ ├── CMakeLists.txt │ │ ├── GlslCompiler.cpp │ │ ├── GlslCompiler.h │ │ ├── GlslangHelpers.c │ │ └── GlslangHelpers.h │ ├── metal/ │ │ ├── Buffer.h │ │ ├── Buffer.mm │ │ ├── BufferSynchronizationManager.h │ │ ├── BufferSynchronizationManager.mm │ │ ├── CMakeLists.txt │ │ ├── ColorSpace.h │ │ ├── ColorSpace.mm │ │ ├── CommandBuffer.h │ │ ├── CommandBuffer.mm │ │ ├── CommandQueue.h │ │ ├── CommandQueue.mm │ │ ├── ComputeCommandEncoder.h │ │ ├── ComputeCommandEncoder.mm │ │ ├── ComputePipelineState.h │ │ ├── ComputePipelineState.mm │ │ ├── DepthStencilState.h │ │ ├── DepthStencilState.mm │ │ ├── Device.h │ │ ├── Device.mm │ │ ├── DeviceFeatureSet.h │ │ ├── DeviceFeatureSet.mm │ │ ├── DeviceStatistics.h │ │ ├── DeviceStatistics.mm │ │ ├── Framebuffer.h │ │ ├── Framebuffer.mm │ │ ├── HWDevice.h │ │ ├── HWDevice.mm │ │ ├── PlatformDevice.h │ │ ├── PlatformDevice.mm │ │ ├── RenderCommandEncoder.h │ │ ├── RenderCommandEncoder.mm │ │ ├── RenderPipelineReflection.h │ │ ├── RenderPipelineReflection.mm │ │ ├── RenderPipelineState.h │ │ ├── RenderPipelineState.mm │ │ ├── Result.h │ │ ├── SamplerState.h │ │ ├── SamplerState.mm │ │ ├── Shader.h │ │ ├── Shader.mm │ │ ├── Texture.h │ │ ├── Texture.mm │ │ ├── Timer.h │ │ ├── TimestampQueries.h │ │ ├── TimestampQueries.mm │ │ ├── VertexInputState.h │ │ ├── VertexInputState.mm │ │ ├── ios/ │ │ │ ├── Device.h │ │ │ ├── Device.mm │ │ │ ├── Framebuffer.h │ │ │ └── Framebuffer.mm │ │ └── macos/ │ │ ├── Device.h │ │ ├── Device.mm │ │ ├── Framebuffer.h │ │ └── Framebuffer.mm │ ├── opengl/ │ │ ├── Buffer.cpp │ │ ├── Buffer.h │ │ ├── CMakeLists.txt │ │ ├── CommandBuffer.cpp │ │ ├── CommandBuffer.h │ │ ├── CommandQueue.cpp │ │ ├── CommandQueue.h │ │ ├── ComputeCommandAdapter.cpp │ │ ├── ComputeCommandAdapter.h │ │ ├── ComputeCommandEncoder.cpp │ │ ├── ComputeCommandEncoder.h │ │ ├── ComputePipelineState.cpp │ │ ├── ComputePipelineState.h │ │ ├── Config.h │ │ ├── DepthStencilState.cpp │ │ ├── DepthStencilState.h │ │ ├── DestructionGuard.cpp │ │ ├── DestructionGuard.h │ │ ├── Device.cpp │ │ ├── Device.h │ │ ├── DeviceFeatureSet.cpp │ │ ├── DeviceFeatureSet.h │ │ ├── DummyTexture.h │ │ ├── Framebuffer.cpp │ │ ├── Framebuffer.h │ │ ├── FramebufferWrapper.h │ │ ├── GLFunc.cpp │ │ ├── GLFunc.h │ │ ├── GLIncludes.h │ │ ├── HWDevice.cpp │ │ ├── HWDevice.h │ │ ├── IContext.cpp │ │ ├── IContext.h │ │ ├── PlatformDevice.cpp │ │ ├── PlatformDevice.h │ │ ├── RenderCommandAdapter.cpp │ │ ├── RenderCommandAdapter.h │ │ ├── RenderCommandEncoder.cpp │ │ ├── RenderCommandEncoder.h │ │ ├── RenderPipelineReflection.cpp │ │ ├── RenderPipelineReflection.h │ │ ├── RenderPipelineState.cpp │ │ ├── RenderPipelineState.h │ │ ├── SamplerState.cpp │ │ ├── SamplerState.h │ │ ├── Shader.cpp │ │ ├── Shader.h │ │ ├── Texture.cpp │ │ ├── Texture.h │ │ ├── TextureBuffer.cpp │ │ ├── TextureBuffer.h │ │ ├── TextureBufferBase.cpp │ │ ├── TextureBufferBase.h │ │ ├── TextureBufferExternal.cpp │ │ ├── TextureBufferExternal.h │ │ ├── TextureTarget.cpp │ │ ├── TextureTarget.h │ │ ├── Timer.cpp │ │ ├── Timer.h │ │ ├── TimestampQueries.cpp │ │ ├── TimestampQueries.h │ │ ├── UnbindPolicy.h │ │ ├── UniformAdapter.cpp │ │ ├── UniformAdapter.h │ │ ├── UniformBuffer.cpp │ │ ├── UniformBuffer.h │ │ ├── Version.cpp │ │ ├── Version.h │ │ ├── VertexArrayObject.cpp │ │ ├── VertexArrayObject.h │ │ ├── VertexInputState.cpp │ │ ├── VertexInputState.h │ │ ├── ViewTextureTarget.cpp │ │ ├── ViewTextureTarget.h │ │ ├── WithContext.cpp │ │ ├── WithContext.h │ │ ├── egl/ │ │ │ ├── Context.cpp │ │ │ ├── Context.h │ │ │ ├── Device.cpp │ │ │ ├── Device.h │ │ │ ├── HWDevice.cpp │ │ │ ├── HWDevice.h │ │ │ ├── PlatformDevice.cpp │ │ │ ├── PlatformDevice.h │ │ │ └── android/ │ │ │ ├── NativeHWBuffer.cpp │ │ │ └── NativeHWBuffer.h │ │ ├── empty/ │ │ │ ├── Context.cpp │ │ │ ├── Context.h │ │ │ ├── Device.cpp │ │ │ ├── Device.h │ │ │ ├── HWDevice.cpp │ │ │ └── HWDevice.h │ │ ├── glx/ │ │ │ ├── Context.cpp │ │ │ ├── Context.h │ │ │ ├── Device.cpp │ │ │ ├── Device.h │ │ │ ├── HWDevice.cpp │ │ │ ├── HWDevice.h │ │ │ ├── PlatformDevice.cpp │ │ │ └── PlatformDevice.h │ │ ├── ios/ │ │ │ ├── Context.h │ │ │ ├── Context.mm │ │ │ ├── Device.h │ │ │ ├── Device.mm │ │ │ ├── HWDevice.h │ │ │ ├── HWDevice.mm │ │ │ ├── PlatformDevice.h │ │ │ ├── PlatformDevice.mm │ │ │ ├── TextureBuffer.h │ │ │ └── TextureBuffer.mm │ │ ├── macos/ │ │ │ ├── Context.h │ │ │ ├── Context.mm │ │ │ ├── Device.h │ │ │ ├── Device.mm │ │ │ ├── HWDevice.h │ │ │ ├── HWDevice.mm │ │ │ ├── PlatformDevice.h │ │ │ ├── PlatformDevice.mm │ │ │ ├── TextureBuffer.h │ │ │ └── TextureBuffer.mm │ │ ├── util/ │ │ │ ├── TextureFormat.cpp │ │ │ └── TextureFormat.h │ │ ├── webgl/ │ │ │ ├── Context.cpp │ │ │ ├── Context.h │ │ │ ├── Device.cpp │ │ │ ├── Device.h │ │ │ ├── HWDevice.cpp │ │ │ ├── HWDevice.h │ │ │ ├── PlatformDevice.cpp │ │ │ └── PlatformDevice.h │ │ └── wgl/ │ │ ├── Context.cpp │ │ ├── Context.h │ │ ├── Device.cpp │ │ ├── Device.h │ │ ├── HWDevice.cpp │ │ ├── HWDevice.h │ │ ├── PlatformDevice.cpp │ │ └── PlatformDevice.h │ ├── tests/ │ │ ├── Assert.cpp │ │ ├── Backend.cpp │ │ ├── Blending.cpp │ │ ├── Buffer.cpp │ │ ├── CMakeLists.txt │ │ ├── Color.cpp │ │ ├── ColorSpace.cpp │ │ ├── CommandBuffer.cpp │ │ ├── Common.cpp │ │ ├── ComputeCommandEncoder.cpp │ │ ├── Device.cpp │ │ ├── DeviceFeatureSet.cpp │ │ ├── Framebuffer.cpp │ │ ├── FramebufferInterop.cpp │ │ ├── Hash.cpp │ │ ├── IglTestsTSANSuppressions.txt │ │ ├── Log.cpp │ │ ├── Multiview.cpp │ │ ├── NameHandleTests.cpp │ │ ├── RenderCommandEncoder.cpp │ │ ├── Resource.cpp │ │ ├── ShaderLibrary.cpp │ │ ├── ShaderModule.cpp │ │ ├── Texture.cpp │ │ ├── Texture.h │ │ ├── TextureArray.cpp │ │ ├── TextureArrayFloat.cpp │ │ ├── TextureCube.cpp │ │ ├── TextureFloat.cpp │ │ ├── TextureFormat.cpp │ │ ├── TextureFormatProperties.cpp │ │ ├── TextureHalfFloat.cpp │ │ ├── TextureMipmap.cpp │ │ ├── TextureRangeDesc.cpp │ │ ├── TexturesRGB.cpp │ │ ├── VertexInputState.cpp │ │ ├── android/ │ │ │ └── NativeHWBuffer.cpp │ │ ├── data/ │ │ │ ├── ShaderData.h │ │ │ ├── TextureData.h │ │ │ └── VertexIndexData.h │ │ ├── iglu/ │ │ │ ├── ManagedUniformBuffer.cpp │ │ │ ├── ShaderCrossTest.cpp │ │ │ ├── ShaderUniformsTest.cpp │ │ │ ├── StatePool.cpp │ │ │ ├── TextureAccessor.cpp │ │ │ ├── UniformCollection.cpp │ │ │ ├── UniformDescriptor.cpp │ │ │ ├── UniformTests.h │ │ │ ├── bitmap/ │ │ │ │ └── BitmapWriterTest.cpp │ │ │ └── texture_loader/ │ │ │ ├── BaseTextureLoader.cpp │ │ │ ├── IDataTest.cpp │ │ │ ├── Ktx1TextureLoaderTest.cpp │ │ │ ├── Ktx2TextureLoaderTest.cpp │ │ │ ├── StbHdrTextureLoaderTest.cpp │ │ │ ├── StbJpegTextureLoaderTest.cpp │ │ │ ├── StbPngTextureLoaderTest.cpp │ │ │ ├── TextureLoaderFactoryTest.cpp │ │ │ └── Xtc1TextureLoaderTest.cpp │ │ ├── main.cpp │ │ ├── metal/ │ │ │ ├── BindGroup.mm │ │ │ ├── Buffer.mm │ │ │ ├── BufferSynchronizationManager.mm │ │ │ ├── BytesBinding.mm │ │ │ ├── ColorSpace.mm │ │ │ ├── CommandBuffer.mm │ │ │ ├── CommandBufferOps.mm │ │ │ ├── CommandQueue.mm │ │ │ ├── ComputeCommandEncoder.mm │ │ │ ├── ComputePipelineState.mm │ │ │ ├── DepthStencilCreation.mm │ │ │ ├── DepthStencilState.mm │ │ │ ├── Device.mm │ │ │ ├── DeviceFeatureSet.mm │ │ │ ├── DeviceStatistics.mm │ │ │ ├── DrawCall.mm │ │ │ ├── ErrorPaths.mm │ │ │ ├── Framebuffer.mm │ │ │ ├── HWDevice.mm │ │ │ ├── IndirectDraw.mm │ │ │ ├── MeshShader.mm │ │ │ ├── PlatformDevice.mm │ │ │ ├── RenderCommandEncoder.mm │ │ │ ├── RenderEncoderState.mm │ │ │ ├── RenderPass.mm │ │ │ ├── RenderPipelineCreation.mm │ │ │ ├── RenderPipelineReflection.mm │ │ │ ├── RenderPipelineState.mm │ │ │ ├── SamplerCreation.mm │ │ │ ├── SamplerState.mm │ │ │ ├── ShaderLibrary.mm │ │ │ ├── StorageMode.mm │ │ │ ├── Texture.mm │ │ │ ├── TextureDataRoundtrip.mm │ │ │ ├── Timer.mm │ │ │ └── VertexInputState.mm │ │ ├── ogl/ │ │ │ ├── BindlessTextures.cpp │ │ │ ├── BlendModeConversion.cpp │ │ │ ├── BufferMapping.cpp │ │ │ ├── CommandBufferOGL.cpp │ │ │ ├── CompressedTexture.cpp │ │ │ ├── ComputeCommandAdapter.cpp │ │ │ ├── ComputePipelineStateOGL.cpp │ │ │ ├── Context.cpp │ │ │ ├── CopyTexSubImage.cpp │ │ │ ├── CubeMapAttachment.cpp │ │ │ ├── DebugOutput.cpp │ │ │ ├── DepthRange.cpp │ │ │ ├── DepthStencilState.cpp │ │ │ ├── DestructionGuard.cpp │ │ │ ├── Device.cpp │ │ │ ├── DeviceFeatureSetFull.cpp │ │ │ ├── ExtensionDetection.cpp │ │ │ ├── FeatureLimits.cpp │ │ │ ├── FramebufferBlit.cpp │ │ │ ├── HWDevice.cpp │ │ │ ├── ImageLoadStore.cpp │ │ │ ├── InvalidateFramebuffer.cpp │ │ │ ├── MSAATextureAttachment.cpp │ │ │ ├── Memcpy.cpp │ │ │ ├── MemoryObjectImport.cpp │ │ │ ├── MultiviewFramebuffer.cpp │ │ │ ├── PipelineState.cpp │ │ │ ├── PlatformDevice.cpp │ │ │ ├── RenderCommandAdapter.cpp │ │ │ ├── RenderPipelineReflection.cpp │ │ │ ├── RenderStateApplication.cpp │ │ │ ├── Resource.cpp │ │ │ ├── SRGBWriteControl.cpp │ │ │ ├── SamplerState.cpp │ │ │ ├── SyncObjects.cpp │ │ │ ├── Texture.cpp │ │ │ ├── Texture3D.cpp │ │ │ ├── TextureBuffer.cpp │ │ │ ├── TextureBufferBase.cpp │ │ │ ├── TextureTarget.cpp │ │ │ ├── Timer.cpp │ │ │ ├── UniformAdapter.cpp │ │ │ ├── UniformBlockBuffer.cpp │ │ │ ├── UniformBuffer.cpp │ │ │ ├── Version.cpp │ │ │ ├── VertexArrayObjectOGL.cpp │ │ │ ├── VertexInputState.cpp │ │ │ ├── ViewTextureTarget.cpp │ │ │ ├── ios/ │ │ │ │ └── TextureBuffer.mm │ │ │ └── macos/ │ │ │ └── TextureBuffer.mm │ │ ├── util/ │ │ │ ├── Color.h │ │ │ ├── Common.cpp │ │ │ ├── Common.h │ │ │ ├── Half.h │ │ │ ├── SpvModules.cpp │ │ │ ├── SpvModules.h │ │ │ ├── TestDevice.cpp │ │ │ ├── TestDevice.h │ │ │ ├── TestErrorGuard.cpp │ │ │ ├── TestErrorGuard.h │ │ │ ├── TextureFormatTestBase.cpp │ │ │ ├── TextureFormatTestBase.h │ │ │ ├── TextureValidationHelpers.h │ │ │ ├── device/ │ │ │ │ ├── MetalTestDevice.h │ │ │ │ ├── MetalTestDevice.mm │ │ │ │ ├── TestDevice.cpp │ │ │ │ ├── TestDevice.h │ │ │ │ ├── d3d12/ │ │ │ │ │ ├── TestDevice.cpp │ │ │ │ │ └── TestDevice.h │ │ │ │ ├── metal/ │ │ │ │ │ ├── TestDevice.h │ │ │ │ │ └── TestDevice.mm │ │ │ │ ├── opengl/ │ │ │ │ │ ├── TestDevice.cpp │ │ │ │ │ └── TestDevice.h │ │ │ │ └── vulkan/ │ │ │ │ ├── TestDevice.cpp │ │ │ │ └── TestDevice.h │ │ │ └── simdstub.h │ │ └── vulkan/ │ │ ├── ColorSpace.cpp │ │ ├── CommandBufferVulkanTest.cpp │ │ ├── CommonTest.cpp │ │ ├── ComputeCommandEncoderVulkanTest.cpp │ │ ├── DescriptorPoolArenaTest.cpp │ │ ├── Device.cpp │ │ ├── DeviceExtendedVulkanTest.cpp │ │ ├── FramebufferVulkanTest.cpp │ │ ├── ImageLayoutTransitionTest.cpp │ │ ├── PipelineStateTest.cpp │ │ ├── RenderCommandEncoderVulkanTest.cpp │ │ ├── RenderPipelineStateTest.cpp │ │ ├── ResourcesBinderTest.cpp │ │ ├── SpvConstantSpecializationExtendedTest.cpp │ │ ├── SpvConstantSpecializationTest.cpp │ │ ├── SpvReflectionTest.cpp │ │ ├── Texture.cpp │ │ ├── TextureFormat.cpp │ │ ├── TextureVulkanExtendedTest.cpp │ │ ├── VulkanBufferTest.cpp │ │ ├── VulkanContextExtendedTest.cpp │ │ ├── VulkanDescriptorSetLayoutTest.cpp │ │ ├── VulkanFeaturesTest.cpp │ │ ├── VulkanFenceTest.cpp │ │ ├── VulkanHelpersTest.cpp │ │ ├── VulkanImageTest.cpp │ │ ├── VulkanImageViewTest.cpp │ │ ├── VulkanImmediateCommandsTest.cpp │ │ ├── VulkanPipelineBuilderTest.cpp │ │ ├── VulkanQueuePool.cpp │ │ ├── VulkanRenderPassBuilderTest.cpp │ │ ├── VulkanSemaphoreExtendedTest.cpp │ │ ├── VulkanStagingDeviceTest.cpp │ │ ├── VulkanSwapchainExtendedTest.cpp │ │ └── VulkanSwapchainTest.cpp │ ├── vulkan/ │ │ ├── Buffer.cpp │ │ ├── Buffer.h │ │ ├── CMakeLists.txt │ │ ├── CommandBuffer.cpp │ │ ├── CommandBuffer.h │ │ ├── CommandQueue.cpp │ │ ├── CommandQueue.h │ │ ├── Common.cpp │ │ ├── Common.h │ │ ├── ComputeCommandEncoder.cpp │ │ ├── ComputeCommandEncoder.h │ │ ├── ComputePipelineState.cpp │ │ ├── ComputePipelineState.h │ │ ├── Device.cpp │ │ ├── Device.h │ │ ├── Framebuffer.cpp │ │ ├── Framebuffer.h │ │ ├── HWDevice.cpp │ │ ├── HWDevice.h │ │ ├── PipelineState.cpp │ │ ├── PipelineState.h │ │ ├── PlatformDevice.cpp │ │ ├── PlatformDevice.h │ │ ├── RenderCommandEncoder.cpp │ │ ├── RenderCommandEncoder.h │ │ ├── RenderPipelineReflection.cpp │ │ ├── RenderPipelineReflection.h │ │ ├── RenderPipelineState.cpp │ │ ├── RenderPipelineState.h │ │ ├── ResourcesBinder.cpp │ │ ├── ResourcesBinder.h │ │ ├── SamplerState.cpp │ │ ├── SamplerState.h │ │ ├── ShaderModule.cpp │ │ ├── ShaderModule.h │ │ ├── Texture.cpp │ │ ├── Texture.h │ │ ├── VulkanBuffer.cpp │ │ ├── VulkanBuffer.h │ │ ├── VulkanContext.cpp │ │ ├── VulkanContext.h │ │ ├── VulkanDescriptorSetLayout.cpp │ │ ├── VulkanDescriptorSetLayout.h │ │ ├── VulkanFeatures.cpp │ │ ├── VulkanFeatures.h │ │ ├── VulkanFence.cpp │ │ ├── VulkanFence.h │ │ ├── VulkanFramebuffer.cpp │ │ ├── VulkanFramebuffer.h │ │ ├── VulkanFunctionTable.c │ │ ├── VulkanFunctionTable.h │ │ ├── VulkanHelpers.c │ │ ├── VulkanHelpers.h │ │ ├── VulkanImage.cpp │ │ ├── VulkanImage.h │ │ ├── VulkanImageView.cpp │ │ ├── VulkanImageView.h │ │ ├── VulkanImmediateCommands.cpp │ │ ├── VulkanImmediateCommands.h │ │ ├── VulkanPipelineBuilder.cpp │ │ ├── VulkanPipelineBuilder.h │ │ ├── VulkanQueuePool.cpp │ │ ├── VulkanQueuePool.h │ │ ├── VulkanRenderPassBuilder.cpp │ │ ├── VulkanRenderPassBuilder.h │ │ ├── VulkanSemaphore.cpp │ │ ├── VulkanSemaphore.h │ │ ├── VulkanShaderModule.cpp │ │ ├── VulkanShaderModule.h │ │ ├── VulkanStagingDevice.cpp │ │ ├── VulkanStagingDevice.h │ │ ├── VulkanSwapchain.cpp │ │ ├── VulkanSwapchain.h │ │ ├── VulkanTexture.cpp │ │ ├── VulkanTexture.h │ │ ├── VulkanVma.h │ │ ├── android/ │ │ │ ├── NativeHWBuffer.cpp │ │ │ └── NativeHWBuffer.h │ │ ├── moltenvk/ │ │ │ ├── MoltenVkHelpers.h │ │ │ └── MoltenVkHelpers.mm │ │ └── util/ │ │ ├── SpvConstantSpecialization.cpp │ │ ├── SpvConstantSpecialization.h │ │ ├── SpvReflection.cpp │ │ ├── SpvReflection.h │ │ ├── TextureFormat.cpp │ │ └── TextureFormat.h │ └── win/ │ ├── LogDefault.cpp │ └── LogDefault.h └── third-party/ ├── .gitignore ├── bootstrap-content.json ├── bootstrap-deps.json └── bootstrap.py ================================================ FILE CONTENTS ================================================ ================================================ FILE: .clang-format ================================================ --- AccessModifierOffset: -1 AlignAfterOpenBracket: Align AlignConsecutiveAssignments: false AlignConsecutiveDeclarations: false AlignEscapedNewlines: Left # AlingOperands: true # Unsupported AlignTrailingComments: false AllowAllParametersOfDeclarationOnNextLine: false AllowShortBlocksOnASingleLine: false AllowShortCaseLabelsOnASingleLine: false AllowShortFunctionsOnASingleLine: Empty AllowShortIfStatementsOnASingleLine: false AllowShortLoopsOnASingleLine: false AlwaysBreakAfterReturnType: None AlwaysBreakBeforeMultilineStrings: true AlwaysBreakTemplateDeclarations: true BinPackArguments: false BinPackParameters: false BreakBeforeBinaryOperators: false BreakBeforeBraces: Attach BreakBeforeInheritanceComma: false BreakBeforeTernaryOperators: true BreakConstructorInitializers: AfterColon BreakStringLiterals: true ColumnLimit: 100 CompactNamespaces: false ConstructorInitializerAllOnOneLineOrOnePerLine: true ConstructorInitializerIndentWidth: 2 ContinuationIndentWidth: 4 Cpp11BracedListStyle: true DerivePointerAlignment: false FixNamespaceComments: true SortIncludes: true IncludeBlocks: Regroup IncludeCategories: # Making gtest/gmock show up first - Regex: '^((<|")(gtest/|gmock/|folly/portability/(GTest|GMock|GFlags)))' Priority: -10 MainIncludeChar: Any IncludeIsMainRegex: '(Test)?$' IndentCaseLabels: false IndentPPDirectives: None IndentWidth: 2 IndentWrappedFunctionNames: false KeepEmptyLinesAtTheStartOfBlocks: false # LanguageKind: Cpp # Unsupported MaxEmptyLinesToKeep: 1 NamespaceIndentation: None # ObjCBinPackProtocolList: Never # Unsupported ObjCBlockIndentWidth: 2 ObjCSpaceAfterProperty: true ObjCSpaceBeforeProtocolList: true PenaltyBreakAssignment: 5 PenaltyBreakBeforeFirstCallParameter: 10 PenaltyBreakComment: 60 PenaltyBreakFirstLessLess: 20 PenaltyBreakString: 1000 PenaltyExcessCharacter: 1000000 PenaltyReturnTypeOnItsOwnLine: 200 PointerAlignment: Left QualifierAlignment: Left ReflowComments: true SortUsingDeclarations: true SpaceAfterCStyleCast: false SpaceAfterTemplateKeyword: false SpaceBeforeAssignmentOperators: true # SpaceBeforeCtorInitializerColon: false # Unsupported # SpaceBeforeInheritanceColon: false # Unsupported SpaceBeforeParens: ControlStatements # SpaceBeforeRangeBasedForLoopColon: true # Unsupported SpaceInEmptyParentheses: false SpacesBeforeTrailingComments: 1 SpacesInAngles: false SpacesInContainerLiterals: true SpacesInCStyleCastParentheses: false SpacesInParentheses: false SpacesInSquareBrackets: false Standard: Cpp11 TabWidth: 2 UseTab: Never ... ================================================ FILE: .claude/CLAUDE.md ================================================ # IGL Project Instructions ## Diff Formatting - Use Markdown formatting in diff summaries, titles, and test plans. - Diff titles should start with the relevant backend prefix, e.g., `igl | vulkan |`, `igl | metal |`, `igl | opengl |`. Use `igl | cmake |` for CMake-related changes, `igl | github |` for purely open-source related changes, and `igl |` alone for changes not specific to a single backend. - Always add trailing `()` to function and method names mentioned in titles, summaries, test plans, and actual code comments (e.g., `createInstance()`, `enable()`). Do not add `()` to type or class names (e.g., `RenderPipelineState`, `TextureDesc`). ## Coding Style - Use C++20 designated initializers whenever possible. - For NESTED designated initializers that fit on a single line, omit the trailing comma. - Prefer `const` for local variables whenever possible. Be aggressive, i.e., the structure `RenderPipelineDesc` can be initialized like that with all the nested fields, including attachments. ================================================ FILE: .cmake-format ================================================ { "_help_parse": "Options affecting listfile parsing", "parse": { "_help_additional_commands": [ "Specify structure for custom cmake functions" ], "additional_commands": { "foo": { "flags": [ "BAR", "BAZ" ], "kwargs": { "HEADERS": "*", "SOURCES": "*", "DEPENDS": "*" } } }, "_help_override_spec": [ "Override configurations per-command where available" ], "override_spec": {}, "_help_vartags": [ "Specify variable tags." ], "vartags": [], "_help_proptags": [ "Specify property tags." ], "proptags": [] }, "_help_format": "Options affecting formatting.", "format": { "_help_disable": [ "Disable formatting entirely, making cmake-format a no-op" ], "disable": false, "_help_line_width": [ "How wide to allow formatted cmake files" ], "line_width": 130, "_help_tab_size": [ "How many spaces to tab for indent" ], "tab_size": 2, "_help_use_tabchars": [ "If true, lines are indented using tab characters (utf-8", "0x09) instead of space characters (utf-8 0x20).", "In cases where the layout would require a fractional tab", "character, the behavior of the fractional indentation is", "governed by " ], "use_tabchars": false, "_help_fractional_tab_policy": [ "If is True, then the value of this variable", "indicates how fractional indentions are handled during", "whitespace replacement. If set to 'use-space', fractional", "indentation is left as spaces (utf-8 0x20). If set to", "`round-up` fractional indentation is replaced with a single", "tab character (utf-8 0x09) effectively shifting the column", "to the next tabstop" ], "fractional_tab_policy": "use-space", "_help_max_subgroups_hwrap": [ "If an argument group contains more than this many sub-groups", "(parg or kwarg groups) then force it to a vertical layout." ], "max_subgroups_hwrap": 8, "_help_max_pargs_hwrap": [ "If a positional argument group contains more than this many", "arguments, then force it to a vertical layout." ], "max_pargs_hwrap": 8, "_help_max_rows_cmdline": [ "If a cmdline positional group consumes more than this many", "lines without nesting, then invalidate the layout (and nest)" ], "max_rows_cmdline": 2, "_help_separate_ctrl_name_with_space": [ "If true, separate flow control names from their parentheses", "with a space" ], "separate_ctrl_name_with_space": false, "_help_separate_fn_name_with_space": [ "If true, separate function names from parentheses with a", "space" ], "separate_fn_name_with_space": false, "_help_dangle_parens": [ "If a statement is wrapped to more than one line, than dangle", "the closing parenthesis on its own line." ], "dangle_parens": false, "_help_dangle_align": [ "If the trailing parenthesis must be 'dangled' on its on", "line, then align it to this reference: `prefix`: the start", "of the statement, `prefix-indent`: the start of the", "statement, plus one indentation level, `child`: align to", "the column of the arguments" ], "dangle_align": "prefix", "_help_min_prefix_chars": [ "If the statement spelling length (including space and", "parenthesis) is smaller than this amount, then force reject", "nested layouts." ], "min_prefix_chars": 4, "_help_max_prefix_chars": [ "If the statement spelling length (including space and", "parenthesis) is larger than the tab width by more than this", "amount, then force reject un-nested layouts." ], "max_prefix_chars": 10, "_help_max_lines_hwrap": [ "If a candidate layout is wrapped horizontally but it exceeds", "this many lines, then reject the layout." ], "max_lines_hwrap": 2, "_help_line_ending": [ "What style line endings to use in the output." ], "line_ending": "unix", "_help_command_case": [ "Format command names consistently as 'lower' or 'upper' case" ], "command_case": "canonical", "_help_keyword_case": [ "Format keywords consistently as 'lower' or 'upper' case" ], "keyword_case": "upper", "_help_always_wrap": [ "A list of command names which should always be wrapped" ], "always_wrap": [], "_help_enable_sort": [ "If true, the argument lists which are known to be sortable", "will be sorted lexicographicall" ], "enable_sort": true, "_help_autosort": [ "If true, the parsers may infer whether or not an argument", "list is sortable (without annotation)." ], "autosort": false, "_help_require_valid_layout": [ "By default, if cmake-format cannot successfully fit", "everything into the desired linewidth it will apply the", "last, most agressive attempt that it made. If this flag is", "True, however, cmake-format will print error, exit with non-", "zero status code, and write-out nothing" ], "require_valid_layout": false, "_help_layout_passes": [ "A dictionary mapping layout nodes to a list of wrap", "decisions. See the documentation for more information." ], "layout_passes": {} }, "_help_markup": "Options affecting comment reflow and formatting.", "markup": { "_help_bullet_char": [ "What character to use for bulleted lists" ], "bullet_char": "*", "_help_enum_char": [ "What character to use as punctuation after numerals in an", "enumerated list" ], "enum_char": ".", "_help_first_comment_is_literal": [ "If comment markup is enabled, don't reflow the first comment", "block in each listfile. Use this to preserve formatting of", "your copyright/license statements." ], "first_comment_is_literal": false, "_help_literal_comment_pattern": [ "If comment markup is enabled, don't reflow any comment block", "which matches this (regex) pattern. Default is `None`", "(disabled)." ], "literal_comment_pattern": ".*", "_help_fence_pattern": [ "Regular expression to match preformat fences in comments", "default= ``r'^\\s*([`~]{3}[`~]*)(.*)$'``" ], "fence_pattern": "^\\s*([`~]{3}[`~]*)(.*)$", "_help_ruler_pattern": [ "Regular expression to match rulers in comments default=", "``r'^\\s*[^\\w\\s]{3}.*[^\\w\\s]{3}$'``" ], "ruler_pattern": "^\\s*[^\\w\\s]{3}.*[^\\w\\s]{3}$", "_help_explicit_trailing_pattern": [ "If a comment line matches starts with this pattern then it", "is explicitly a trailing comment for the preceeding", "argument. Default is '#<'" ], "explicit_trailing_pattern": "#<", "_help_hashruler_min_length": [ "If a comment line starts with at least this many consecutive", "hash characters, then don't lstrip() them off. This allows", "for lazy hash rulers where the first hash char is not", "separated by space" ], "hashruler_min_length": 10, "_help_canonicalize_hashrulers": [ "If true, then insert a space between the first hash char and", "remaining hash chars in a hash ruler, and normalize its", "length to fill the column" ], "canonicalize_hashrulers": true, "_help_enable_markup": [ "enable comment markup parsing and reflow" ], "enable_markup": true }, "_help_lint": "Options affecting the linter", "lint": { "_help_disabled_codes": [ "a list of lint codes to disable" ], "disabled_codes": [], "_help_function_pattern": [ "regular expression pattern describing valid function names" ], "function_pattern": "[0-9a-z_]+", "_help_macro_pattern": [ "regular expression pattern describing valid macro names" ], "macro_pattern": "[0-9A-Z_]+", "_help_global_var_pattern": [ "regular expression pattern describing valid names for", "variables with global (cache) scope" ], "global_var_pattern": "[A-Z][0-9A-Z_]+", "_help_internal_var_pattern": [ "regular expression pattern describing valid names for", "variables with global scope (but internal semantic)" ], "internal_var_pattern": "_[A-Z][0-9A-Z_]+", "_help_local_var_pattern": [ "regular expression pattern describing valid names for", "variables with local scope" ], "local_var_pattern": "[a-z][a-z0-9_]+", "_help_private_var_pattern": [ "regular expression pattern describing valid names for", "privatedirectory variables" ], "private_var_pattern": "_[0-9a-z_]+", "_help_public_var_pattern": [ "regular expression pattern describing valid names for public", "directory variables" ], "public_var_pattern": "[A-Z][0-9A-Z_]+", "_help_argument_var_pattern": [ "regular expression pattern describing valid names for", "function/macro arguments and loop variables." ], "argument_var_pattern": "[a-z][a-z0-9_]+", "_help_keyword_pattern": [ "regular expression pattern describing valid names for", "keywords used in functions or macros" ], "keyword_pattern": "[A-Z][0-9A-Z_]+", "_help_max_conditionals_custom_parser": [ "In the heuristic for C0201, how many conditionals to match", "within a loop in before considering the loop a parser." ], "max_conditionals_custom_parser": 2, "_help_min_statement_spacing": [ "Require at least this many newlines between statements" ], "min_statement_spacing": 1, "_help_max_statement_spacing": [ "Require no more than this many newlines between statements" ], "max_statement_spacing": 2, "max_returns": 6, "max_branches": 12, "max_arguments": 5, "max_localvars": 15, "max_statements": 50 }, "_help_encode": "Options affecting file encoding", "encode": { "_help_emit_byteorder_mark": [ "If true, emit the unicode byte-order mark (BOM) at the start", "of the file" ], "emit_byteorder_mark": false, "_help_input_encoding": [ "Specify the encoding of the input file. Defaults to utf-8" ], "input_encoding": "utf-8", "_help_output_encoding": [ "Specify the encoding of the output file. Defaults to utf-8.", "Note that cmake only claims to support utf-8 so be careful", "when using anything else" ], "output_encoding": "utf-8" }, "_help_misc": "Miscellaneous configurations options.", "misc": { "_help_per_command": [ "A dictionary containing any per-command configuration", "overrides. Currently only `command_case` is supported." ], "per_command": {} } } ================================================ FILE: .github/pull_request_template.md ================================================ Our [contribution guidelines](https://github.com/facebook/igl/blob/main/CONTRIBUTING.md): ## Pull Requests We actively welcome your pull requests. Here's the procedure to submit pull requests to IGL: 1. **Submit an issue describing your proposed changes.** 2. The repo owner will respond to your issue. 3. If your proposed changes are accepted, fork the repo and develop & test your changes. 4. If you've added code that should be tested, add tests (and ensure they do pass). 5. Verify your changes work as expected on all relevant rendering backends, and also test them when any combination of backends is disabled using the `IGL_WITH_*` CMake options. 6. If you've changed APIs, update the documentation. 7. Make sure your code lints (run `clang-format` or use `.clang-format` in Visual Studio). 8. If you haven't already, complete the Contributor License Agreement ("CLA"). 9. Please respect `// @fb-only` comments and do not delete them! 10. Open a pull request. ## Dependencies One of our design objectives is that IGL itself should have as few dependencies as possible. No new third-party dependencies will be accepted unless they are absolutely critical to the core functionality of IGL. **Please include a link to the related (and accepted) GitHub issue in this PR!** ================================================ FILE: .github/workflows/c-cpp.yml ================================================ name: C/C++ CI on: push: branches: [ "**" ] pull_request: branches: [ "**" ] # https://github.com/git-lfs/git-lfs/issues/5749 env: GIT_CLONE_PROTECTION_ACTIVE: false jobs: build: name: "Android (Ubuntu)" runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 with: submodules: recursive - name: Free up disk space run: | df -h sudo rm -rf /usr/share/dotnet /opt/ghc sudo docker system prune --all --force --volumes sudo apt-get clean -y df -h - name: Set up NDK uses: nttld/setup-ndk@v1 with: ndk-version: r26b - name: Set up JDK uses: actions/setup-java@v5 with: java-version: 21 distribution: 'oracle' - name: Assemble APK debug run: | cd build/android chmod +x ./gradlew ./gradlew assembleDebug cmake-build: strategy: fail-fast: false matrix: config: - { name: "Windows - MSVC 2022", os: windows-latest, build_type: "Debug", cc: "cl", cxx: "cl", generators: "Visual Studio 17 2022", cmake_args: "-DIGL_WITH_TRACY=ON -DIGL_WITH_TESTS=ON" } - { name: "Windows - MSVC 2022 (no OpenGL)", os: windows-latest, build_type: "Debug", cc: "cl", cxx: "cl", generators: "Visual Studio 17 2022", cmake_args: "-DIGL_WITH_TRACY=ON -DIGL_WITH_TESTS=ON -DIGL_WITH_OPENGL=OFF" } - { name: "Ubuntu - Clang", os: ubuntu-latest, build_type: "Debug", cc: "clang", cxx: "clang++", generators: "Unix Makefiles", cmake_args: "-DIGL_WITH_TRACY=ON" } - { name: "Ubuntu - GCC", os: ubuntu-latest, build_type: "Debug", cc: "gcc", cxx: "g++", generators: "Unix Makefiles", # TODO: Fix killing GCC process on Github CI when IGL_WITH_SHELL is ON. cmake_args: "-DIGL_WITH_TRACY=ON -DIGL_WITH_SHELL=OFF" } # https://github.com/emscripten-core/emscripten/pull/20802#issuecomment-1858114093 # - { # name: "Emscripten (Ubuntu)", # os: ubuntu-latest, # build_type: "Debug", # cc: "emcc", # cxx: "em++", # generators: "Ninja", # } # - { # name: "macOS - Clang (Xcode)", # os: macos-latest, # build_type: "Debug", # cc: "clang", # cxx: "clang++", # generators: "Xcode", # cmake_args: "-DIGL_WITH_VULKAN=OFF" # } # - { # name: "macOS - Clang (Unix Makefiles)", # os: macos-latest, # build_type: "Debug", # cc: "clang", # cxx: "clang++", # generators: "Unix Makefiles", # cmake_args: "-DIGL_WITH_VULKAN=OFF" # } runs-on: ${{ matrix.config.os }} steps: - uses: actions/checkout@v6 with: submodules: recursive - if: startsWith(matrix.config.os, 'windows') run: | git config --system core.longpaths true - if: startsWith(matrix.config.name, 'Emscripten') run: | sudo sed -i 's/azure\.//' /etc/apt/sources.list sudo apt-get update sudo apt-get install -y clang emscripten xorg-dev libxinerama-dev libxcursor-dev libgles2-mesa-dev libegl1-mesa-dev libglfw3-dev libglew-dev libstdc++-12-dev - if: startsWith(matrix.config.name, 'Ubuntu' ) run: | sudo sed -i 's/azure\.//' /etc/apt/sources.list sudo apt-get update sudo apt-get install -y clang xorg-dev libxinerama-dev libxcursor-dev libgles2-mesa-dev libegl1-mesa-dev libglfw3-dev libglew-dev libstdc++-12-dev - name: Prepare Vulkan SDK uses: jakoch/install-vulkan-sdk-action@v1.2.5 with: vulkan_version: 1.4.309.0 install_runtime: true cache: true stripdown: true - name: Get the number of CPU cores uses: SimenB/github-actions-cpu-cores@v2 - name: Build shell: bash env: CC: ${{ matrix.config.cc }} CXX: ${{ matrix.config.cxx }} if: ${{ matrix.config.name != 'Emscripten (Ubuntu)' }} run: | cmake ${{ env.CMAKE_GENERATOR }} -S "${{ github.workspace }}" -B build ${{ matrix.config.cmake_args }} cd build cmake --build . --parallel ${{ steps.cpu-cores.outputs.count }} - name: Build Emscripten shell: bash env: CC: ${{ matrix.config.cc }} CXX: ${{ matrix.config.cxx }} if: ${{ matrix.config.name == 'Emscripten (Ubuntu)' }} run: | emcmake cmake ${{ env.CMAKE_GENERATOR }} -S "${{ github.workspace }}" -B build ${{ matrix.config.cmake_args }} cd build cmake --build . --parallel ${{ steps.cpu-cores.outputs.count }} cmake-test-ubuntu: strategy: fail-fast: false matrix: config: - { name: "Ubuntu - Clang", os: ubuntu-latest, build_type: "Debug", cc: "clang-16", cxx: "clang++-16", generators: "Unix Makefiles", } runs-on: ${{ matrix.config.os }} steps: - uses: actions/checkout@v6 with: submodules: recursive - name: Install Ubuntu packages shell: bash run: | sudo apt-get update sudo apt-get install -y gcc-13 clang-16 xorg-dev libxinerama-dev libxcursor-dev libgles2-mesa-dev libegl1-mesa-dev libglfw3-dev libglew-dev libstdc++-12-dev extra-cmake-modules libxkbcommon-x11-dev wayland-protocols ninja-build sudo apt-get install -y mesa-vulkan-drivers libvulkan1 vulkan-tools vulkan-validationlayers cmake --version vulkaninfo - name: Install Vulkan SDK uses: jakoch/install-vulkan-sdk-action@v1.2.5 with: vulkan_version: 1.4.309.0 install_runtime: true cache: true stripdown: true - name: Get the number of CPU cores uses: SimenB/github-actions-cpu-cores@v2 - name: Check disk space run: df -h - name: Build shell: bash env: CC: ${{ matrix.config.cc }} CXX: ${{ matrix.config.cxx }} run: | cmake ${{ env.CMAKE_GENERATOR }} -S "${{ github.workspace }}" -B build ${{ matrix.config.cmake_args }} -DCMAKE_BUILD_TYPE=Debug cd build cmake --build . --target Tiny --parallel ${{ steps.cpu-cores.outputs.count }} cmake --build . --target BasicFramebufferSession_vulkan --parallel ${{ steps.cpu-cores.outputs.count }} cmake --build . --target BindGroupSession_vulkan --parallel ${{ steps.cpu-cores.outputs.count }} cmake --build . --target ColorSession_vulkan --parallel ${{ steps.cpu-cores.outputs.count }} cmake --build . --target DrawInstancedSession_vulkan --parallel ${{ steps.cpu-cores.outputs.count }} cmake --build . --target GPUStressSession_vulkan --parallel ${{ steps.cpu-cores.outputs.count }} cmake --build . --target HelloWorldSession_vulkan --parallel ${{ steps.cpu-cores.outputs.count }} cmake --build . --target ImguiSession_vulkan --parallel ${{ steps.cpu-cores.outputs.count }} cmake --build . --target MRTSession_vulkan --parallel ${{ steps.cpu-cores.outputs.count }} cmake --build . --target Textured3DCubeSession_vulkan --parallel ${{ steps.cpu-cores.outputs.count }} cmake --build . --target TextureViewSession_vulkan --parallel ${{ steps.cpu-cores.outputs.count }} cmake --build . --target TinyMeshBindGroupSession_vulkan --parallel ${{ steps.cpu-cores.outputs.count }} cmake --build . --target TinyMeshSession_vulkan --parallel ${{ steps.cpu-cores.outputs.count }} cmake --build . --target TQSession_vulkan --parallel ${{ steps.cpu-cores.outputs.count }} cmake --build . --target YUVColorSession_vulkan --parallel ${{ steps.cpu-cores.outputs.count }} - name: Run tests (shell) run: | ls build/shell ./build/shell/BasicFramebufferSession_vulkan --headless --viewport-size 1600x900 --screenshot-file BasicFramebufferSession.png ./build/shell/BindGroupSession_vulkan --headless --viewport-size 1600x900 --screenshot-file BindGroupSession.png ./build/shell/ColorSession_vulkan --headless --viewport-size 1600x900 --screenshot-file ColorSession.png ./build/shell/DrawInstancedSession_vulkan --headless --viewport-size 1600x900 --screenshot-file DrawInstancedSession.png ./build/shell/GPUStressSession_vulkan --headless --viewport-size 1600x900 --screenshot-file GPUStressSession.png ./build/shell/HelloWorldSession_vulkan --headless --viewport-size 1600x900 --screenshot-file HelloWorldSession.png ./build/shell/ImguiSession_vulkan --headless --viewport-size 1600x900 --screenshot-file ImguiSession.png ./build/shell/MRTSession_vulkan --headless --viewport-size 1600x900 --screenshot-file MRTSession.png ./build/shell/Textured3DCubeSession_vulkan --headless --viewport-size 1600x900 --screenshot-file Textured3DCubeSession.png ./build/shell/TextureViewSession_vulkan --headless --viewport-size 1600x900 --screenshot-file TextureViewSession.png ./build/shell/TinyMeshBindGroupSession_vulkan --headless --viewport-size 1600x900 --screenshot-file TinyMeshBindGroupSession.png ./build/shell/TinyMeshSession_vulkan --headless --viewport-size 1600x900 --screenshot-file TinyMeshSession.png ./build/shell/TQSession_vulkan --headless --viewport-size 1600x900 --screenshot-file TQSession.png ./build/shell/YUVColorSession_vulkan --headless --viewport-size 1600x900 --screenshot-file YUVColorSession.png - name: Run tests (desktop) run: | ls build/samples/desktop #./build/samples/desktop/Tiny --headless - name: Upload artifacts uses: actions/upload-artifact@v6 with: name: Screenshots path: | BasicFramebufferSession.png BindGroupSession.png ColorSession.png DrawInstancedSession.png GPUStressSession.png HelloWorldSession.png ImguiSession.png MRTSession.png Textured3DCubeSession.png TextureViewSession.png TinyMeshBindGroupSession.png TinyMeshSession.png TQSession.png YUVColorSession.png if-no-files-found: error retention-days: 5 overwrite: true ================================================ FILE: .github/workflows/cmake-install-test.yml ================================================ name: CMake Install Test on: push: branches: [ "**" ] paths: - 'CMakeLists.txt' - 'cmake/**' - 'src/**' - 'IGLU/**' - '.github/workflows/cmake-install-test.yml' pull_request: branches: [ "**" ] paths: - 'CMakeLists.txt' - 'cmake/**' - 'src/**' - 'IGLU/**' - '.github/workflows/cmake-install-test.yml' # https://github.com/git-lfs/git-lfs/issues/5749 env: GIT_CLONE_PROTECTION_ACTIVE: false jobs: install-test: strategy: fail-fast: false matrix: config: - { name: "Ubuntu - Clang", os: ubuntu-latest, build_type: "Release", cc: "clang", cxx: "clang++", generators: "Unix Makefiles", cmake_args: "-DIGL_ENABLE_INSTALL=ON -DIGL_WITH_SAMPLES=OFF -DIGL_WITH_SHELL=OFF -DIGL_WITH_TESTS=OFF" } runs-on: ${{ matrix.config.os }} name: ${{ matrix.config.name }} steps: - uses: actions/checkout@v6 with: submodules: recursive - if: startsWith(matrix.config.os, 'windows') run: | git config --system core.longpaths true - if: startsWith(matrix.config.name, 'Ubuntu') && !matrix.config.android run: | sudo sed -i 's/azure\.//' /etc/apt/sources.list sudo apt-get update sudo apt-get install -y clang xorg-dev libxinerama-dev libxcursor-dev libgles2-mesa-dev libegl1-mesa-dev libglfw3-dev libglew-dev libstdc++-12-dev - name: Prepare Vulkan SDK if: ${{ !contains(matrix.config.cmake_args, 'IGL_WITH_VULKAN=OFF') }} uses: jakoch/install-vulkan-sdk-action@v1.1.1 with: vulkan_version: 1.4.304.1 install_runtime: true cache: true stripdown: true - name: Get the number of CPU cores uses: SimenB/github-actions-cpu-cores@v2 - name: Configure CMake shell: bash env: CC: ${{ matrix.config.cc }} CXX: ${{ matrix.config.cxx }} run: | # Set up platform-specific CMake arguments CMAKE_PLATFORM_ARGS="" cmake -G "${{ matrix.config.generators }}" \ -S "${{ github.workspace }}" \ -B build \ -DCMAKE_BUILD_TYPE=${{ matrix.config.build_type }} \ -DCMAKE_INSTALL_PREFIX="${{ github.workspace }}/install" \ $CMAKE_PLATFORM_ARGS \ ${{ matrix.config.cmake_args }} - name: Build shell: bash run: | cd build cmake --build . --parallel ${{ steps.cpu-cores.outputs.count }} --config ${{ matrix.config.build_type }} - name: Install shell: bash run: | cd build cmake --install . --config ${{ matrix.config.build_type }} - name: Verify Installation Structure shell: bash run: | echo "=== Verifying Installation Structure ===" # Check install directory exists if [ ! -d "${{ github.workspace }}/install" ]; then echo "ERROR: Install directory not found!" exit 1 fi # Check for library directory if [ ! -d "${{ github.workspace }}/install/lib" ]; then echo "ERROR: lib directory not found!" exit 1 fi # Check for include directory if [ ! -d "${{ github.workspace }}/install/include" ]; then echo "ERROR: include directory not found!" exit 1 fi # Check for CMake config if [ ! -f "${{ github.workspace }}/install/lib/cmake/IGL/IGLConfig.cmake" ]; then echo "ERROR: IGLConfig.cmake not found!" exit 1 fi # List installed files for debugging echo "=== Installed Libraries ===" find "${{ github.workspace }}/install/lib" -name "*.a" -o -name "*.lib" -o -name "*.so" -o -name "*.dylib" -o -name "*.dll" || true echo "=== Installed Headers ===" find "${{ github.workspace }}/install/include" -type d | head -10 echo "=== CMake Config Files ===" find "${{ github.workspace }}/install" -name "*.cmake" | head -10 - name: Test find_package Integration if: ${{ !matrix.config.android && !matrix.config.ios }} shell: bash run: | echo "=== Testing find_package Integration ===" # Create test project directory mkdir -p test-project # Create CMakeLists.txt cat > test-project/CMakeLists.txt << 'EOF' cmake_minimum_required(VERSION 3.19) project(IGLInstallTest) # Set C++ standard to match IGL requirements set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) # Find IGL find_package(IGL REQUIRED) # Print information message(STATUS "IGL_FOUND: ${IGL_FOUND}") message(STATUS "IGL_VERSION: ${IGL_VERSION}") # Create test executable add_executable(igl_install_test main.cpp) target_link_libraries(igl_install_test PRIVATE IGL::IGLLibrary) # Test component discovery if(TARGET IGL::IGLOpenGL) message(STATUS "OpenGL backend available") target_link_libraries(igl_install_test PRIVATE IGL::IGLOpenGL) target_compile_definitions(igl_install_test PRIVATE HAVE_OPENGL=1) endif() if(TARGET IGL::IGLVulkan) message(STATUS "Vulkan backend available") target_link_libraries(igl_install_test PRIVATE IGL::IGLVulkan) target_compile_definitions(igl_install_test PRIVATE HAVE_VULKAN=1) endif() if(TARGET IGL::IGLMetal) message(STATUS "Metal backend available") target_link_libraries(igl_install_test PRIVATE IGL::IGLMetal) target_compile_definitions(igl_install_test PRIVATE HAVE_METAL=1) endif() EOF # Create main.cpp cat > test-project/main.cpp << 'EOF' #include #include int main() { std::cout << "IGL Install Test - SUCCESS!" << std::endl; std::cout << "IGL library linking works correctly!" << std::endl; #ifdef HAVE_OPENGL std::cout << "OpenGL backend: Available" << std::endl; #endif #ifdef HAVE_VULKAN std::cout << "Vulkan backend: Available" << std::endl; #endif #ifdef HAVE_METAL std::cout << "Metal backend: Available" << std::endl; #endif // Test basic IGL functionality auto backendType = igl::BackendType::OpenGL; std::cout << "IGL BackendType test: " << static_cast(backendType) << std::endl; return 0; } EOF - name: Build Test Project if: ${{ !matrix.config.android && !matrix.config.ios }} shell: bash run: | cd test-project cmake -B build -DCMAKE_BUILD_TYPE=${{ matrix.config.build_type }} -DCMAKE_PREFIX_PATH="${{ github.workspace }}/install" . cmake --build build --config ${{ matrix.config.build_type }} - name: Run Test Executable if: ${{ !matrix.config.android && !matrix.config.ios }} shell: bash run: | cd test-project if [ "${{ matrix.config.os }}" = "windows-latest" ]; then ./build/${{ matrix.config.build_type }}/igl_install_test.exe else ./build/igl_install_test fi - name: Test Install Disabled (Control Test) shell: bash env: CC: ${{ matrix.config.cc }} CXX: ${{ matrix.config.cxx }} run: | echo "=== Testing Install Disabled ===" # Clean and configure without install rm -rf build-control # Create cmake args without the install flag CMAKE_ARGS="${{ matrix.config.cmake_args }}" CMAKE_ARGS_CLEAN=$(echo "$CMAKE_ARGS" | sed 's/-DIGL_ENABLE_INSTALL=ON//g') # Set up platform-specific CMake arguments (same as configure step) CMAKE_PLATFORM_ARGS="" cmake -G "${{ matrix.config.generators }}" \ -S "${{ github.workspace }}" \ -B build-control \ -DCMAKE_BUILD_TYPE=${{ matrix.config.build_type }} \ -DIGL_ENABLE_INSTALL=OFF \ $CMAKE_PLATFORM_ARGS \ $CMAKE_ARGS_CLEAN # Build should succeed cd build-control cmake --build . --parallel ${{ steps.cpu-cores.outputs.count }} --config ${{ matrix.config.build_type }} # Verify no install targets are created if cmake --build . --target install 2>/dev/null; then echo "WARNING: Install succeeded when it should be disabled" else echo "SUCCESS: Install properly disabled" fi # Test that install doesn't break when new targets are added install-backward-compatibility: runs-on: ubuntu-latest name: "Backward Compatibility Test" steps: - uses: actions/checkout@v6 with: submodules: recursive - run: | sudo sed -i 's/azure\.//' /etc/apt/sources.list sudo apt-get update sudo apt-get install -y clang xorg-dev libxinerama-dev libxcursor-dev libgles2-mesa-dev libegl1-mesa-dev libglfw3-dev libglew-dev libstdc++-12-dev - name: Test Default Build (Install Disabled) run: | cmake -B build-default . cmake --build build-default --parallel 2 echo "SUCCESS: Default build works with install code present" - name: Test All Backends Enabled run: | cmake -B build-all \ -DIGL_ENABLE_INSTALL=ON \ -DCMAKE_INSTALL_PREFIX=install-all \ . cmake --build build-all --parallel 2 cmake --install build-all # Verify all components are installed find install-all -name "*.a" | grep -E "(IGLLibrary|IGLOpenGL|IGLVulkan|IGLUimgui)" | wc -l | grep -v "^0$" echo "SUCCESS: All backends install correctly" ================================================ FILE: .github/workflows/doc-build.yml ================================================ name: Doc Build on: push: branches: - main paths: - 'docs/**' pull_request: types: opened branches: - main paths: - 'docs/**' jobs: build_docs_job: runs-on: ubuntu-latest strategy: matrix: python-version: [3.6] steps: - name: Checkout uses: actions/checkout@v6 - name: Dependencies run: | echo `python3 --version` sudo apt-get install -y python3-sphinx python3 -m pip install --upgrade pip python3 -m pip install setuptools id: build - name: Build the docset run: | cd docs pip install -r requirements.txt make html - name: Get output time run: echo "The time was ${{ steps.build.outputs.time }}" - name: Deploy uses: JamesIves/github-pages-deploy-action@v4 with: BRANCH: gh-pages # The branch the action should deploy to FOLDER: ./docs/build/html # The folder the action should deploy ================================================ FILE: .gitignore ================================================ .idea .vscode ================================================ FILE: CMakeLists.txt ================================================ # Copyright (c) Meta Platforms, Inc. and affiliates. # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. cmake_minimum_required(VERSION 3.19) project("IGL" CXX C) # cmake-format: off option(IGL_WITH_SAMPLES "Enable sample demo apps" ON) option(IGL_WITH_OPENGL "Enable IGL/OpenGL" ON) option(IGL_WITH_OPENGLES "Enable IGL/OpenGL ES" OFF) option(IGL_WITH_VULKAN "Enable IGL/Vulkan" ON) option(IGL_WITH_METAL "Enable IGL/Metal" ON) option(IGL_WITH_WEBGL "Enable IGL/WebGL" OFF) option(IGL_WITH_D3D12 "Enable IGL/DirectX 12" OFF) option(IGL_WITH_IGLU "Enable IGLU utils" ON) option(IGL_WITH_SHELL "Enable Shell utils" ON) option(IGL_WITH_TESTS "Enable IGL tests (gtest)" OFF) option(IGL_WITH_TRACY "Enable Tracy profiler" OFF) option(IGL_WITH_TRACY_GPU "Enable Tracy profiler for the GPU" OFF) option(IGL_WITH_OPENXR "Enable OpenXR" OFF) option(IGL_ENFORCE_LOGS "Enable logs in Release builds" ON) option(IGL_DEPLOY_DEPS "Deploy dependencies via CMake" ON) option(IGL_ENABLE_INSTALL "Enable install targets for IGL" OFF) # cmake-format: on if(DEFINED ENV{VULKAN_SDK}) message(STATUS "VULKAN_SDK=$ENV{VULKAN_SDK}") if(NOT EXISTS $ENV{VULKAN_SDK}) message(FATAL_ERROR "$ENV{VULKAN_SDK} does not exist.") endif() endif() if(IOS) if(IGL_WITH_OPENGL) set(IGL_WITH_OPENGLES ON) endif() set(IGL_WITH_OPENGL OFF) set(IGL_WITH_VULKAN OFF) set(IGL_WITH_WEBGL OFF) endif() if(NOT APPLE) set(IGL_WITH_METAL OFF) endif() if(NOT WIN32) set(IGL_WITH_D3D12 OFF) endif() if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") # disable for all targets due to warnings in third-party code add_definitions(-Wno-nullability-completeness) elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU") add_compile_options($<$:-Wno-volatile>) endif() if(ANDROID) if(IGL_WITH_OPENGL) set(IGL_WITH_OPENGLES ON) endif() set(IGL_WITH_OPENGL OFF) set(IGL_WITH_VULKAN ON) set(IGL_WITH_WEBGL OFF) elseif(UNIX) # disable for all targets due to warnings in third-party code add_compile_options($<$:-Wno-deprecated-volatile>) add_definitions(-Wno-attributes) endif() if(EMSCRIPTEN) if(IGL_WITH_OPENXR) message(FATAL_ERROR "OpenXR is not supported on Emscripten.") endif() set(IGL_WITH_IGLU ON) set(IGL_WITH_OPENGL OFF) set(IGL_WITH_OPENGLES OFF) set(IGL_WITH_VULKAN OFF) set(IGL_WITH_WEBGL ON) set(IGL_WITH_SHELL OFF) # shell doesn't supported yet endif() set_property(GLOBAL PROPERTY USE_FOLDERS ON) function(igl_set_folder target folder_name) set_property(TARGET ${target} PROPERTY FOLDER ${folder_name}) endfunction() function(igl_set_cxxstd target cpp_version) set_property(TARGET ${target} PROPERTY CXX_STANDARD ${cpp_version}) set_property(TARGET ${target} PROPERTY CXX_STANDARD_REQUIRED ON) endfunction() # cmake-format: off message(STATUS "IGL_WITH_SAMPLES = ${IGL_WITH_SAMPLES}") message(STATUS "IGL_WITH_OPENGL = ${IGL_WITH_OPENGL}") message(STATUS "IGL_WITH_OPENGLES = ${IGL_WITH_OPENGLES}") message(STATUS "IGL_WITH_VULKAN = ${IGL_WITH_VULKAN}") message(STATUS "IGL_WITH_METAL = ${IGL_WITH_METAL}") message(STATUS "IGL_WITH_WEBGL = ${IGL_WITH_WEBGL}") message(STATUS "IGL_WITH_D3D12 = ${IGL_WITH_D3D12}") message(STATUS "IGL_WITH_IGLU = ${IGL_WITH_IGLU}") message(STATUS "IGL_WITH_SHELL = ${IGL_WITH_SHELL}") message(STATUS "IGL_WITH_TESTS = ${IGL_WITH_TESTS}") message(STATUS "IGL_WITH_TRACY = ${IGL_WITH_TRACY}") message(STATUS "IGL_WITH_TRACY_GPU = ${IGL_WITH_TRACY_GPU}") message(STATUS "IGL_WITH_OPENXR = ${IGL_WITH_OPENXR}") message(STATUS "IGL_ENFORCE_LOGS = ${IGL_ENFORCE_LOGS}") message(STATUS "IGL_DEPLOY_DEPS = ${IGL_DEPLOY_DEPS}") # cmake-format: on if(APPLE) if(IGL_WITH_OPENXR) message(FATAL_ERROR "OpenXR is not supported on Apple (yet).") endif() if(NOT (IGL_WITH_OPENGL OR IGL_WITH_VULKAN OR IGL_WITH_OPENGLES OR IGL_WITH_METAL OR IGL_WITH_WEBGL)) message(FATAL_ERROR "At least one rendering backend should be defined (OpenGL, Vulkan or Metal).") endif() else() if(NOT (IGL_WITH_OPENGL OR IGL_WITH_VULKAN OR IGL_WITH_OPENGLES OR IGL_WITH_WEBGL OR IGL_WITH_D3D12)) message(FATAL_ERROR "At least one rendering backend should be defined (OpenGL, Vulkan, or DirectX 12).") endif() endif() if(IGL_WITH_SHELL AND (NOT IGL_WITH_IGLU)) message(FATAL_ERROR "IGL_WITH_SHELL requires enabling IGL_WITH_IGLU.") endif() if(APPLE) enable_language(OBJC) enable_language(OBJCXX) endif() if(NOT DEFINED CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Debug") endif() message(STATUS "IGL generator : " ${CMAKE_GENERATOR}) message(STATUS "IGL build type: " ${CMAKE_BUILD_TYPE}) set(IGL_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}) set(IGL_DEPS_CACHE_FILE "${IGL_ROOT_DIR}/third-party/.bootstrap-deps.json") find_package(Python3 COMPONENTS Interpreter) message(STATUS "IGL_ROOT_DIR = " ${IGL_ROOT_DIR}) # Enable local "in-tree" builds if(${CMAKE_CURRENT_SOURCE_DIR} MATCHES "^.*fbsource.*") get_filename_component(REPO_ROOT_DIR "../../../.." ABSOLUTE) message(STATUS "REPO_ROOT_DIR = " ${REPO_ROOT_DIR}) include_directories(${REPO_ROOT_DIR}) endif() # Enables multithreaded compilation and a conformant preprocessor on visual studio if(MSVC) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") endif() if(IGL_DEPLOY_DEPS) # deploy dependencies during configuration execute_process(COMMAND ${Python3_EXECUTABLE} deploy_deps.py WORKING_DIRECTORY ${IGL_ROOT_DIR} COMMAND_ERROR_IS_FATAL ANY) if(NOT EXISTS ${IGL_DEPS_CACHE_FILE}) message(FATAL_ERROR "Cannot deploy dependencies.") endif() # regenerate dependencies when .bootstrap-deps.json is older than bootstrap-deps.json add_custom_command(COMMAND ${Python3_EXECUTABLE} deploy_deps.py OUTPUT ${IGL_DEPS_CACHE_FILE} DEPENDS "${IGL_ROOT_DIR}/third-party/bootstrap-deps.json" WORKING_DIRECTORY ${IGL_ROOT_DIR}) add_custom_target(IGLDependencies DEPENDS ${IGL_DEPS_CACHE_FILE}) igl_set_folder(IGLDependencies "IGL") endif() if (NOT IGL_WITH_TRACY AND IGL_WITH_TRACY_GPU) message(FATAL_ERROR "IGL_WITH_TRACY must be enabled to use Tracy's GPU profiling") endif() if(IGL_WITH_TRACY) add_definitions("-DTRACY_ENABLE=1") add_definitions("-DTRACY_VK_USE_SYMBOL_TABLE=1") add_subdirectory(third-party/deps/src/tracy) igl_set_folder(TracyClient "third-party") endif() if(IGL_WITH_OPENXR) add_subdirectory(third-party/deps/src/openxr-sdk) igl_set_folder(openxr_loader "third-party/OpenXR") endif() if(WIN32 AND IGL_WITH_D3D12) set(DIRECTX_HEADERS_ROOT "${IGL_ROOT_DIR}/third-party/deps/src/DirectX-Headers") if(EXISTS "${DIRECTX_HEADERS_ROOT}/CMakeLists.txt") add_subdirectory("${DIRECTX_HEADERS_ROOT}" "${CMAKE_BINARY_DIR}/DirectX-Headers") set(DIRECTX_HEADERS_INCLUDE_DIR "${DIRECTX_HEADERS_ROOT}/include/directx") else() message(FATAL_ERROR "DirectX-Headers dependency not found. Run deploy_deps.py to download third-party/deps/src/DirectX-Headers.") endif() endif() add_subdirectory(src/igl) if(IGL_WITH_TRACY) target_compile_definitions(IGLLibrary PUBLIC "IGL_WITH_TRACY=1") if(IGL_WITH_TRACY_GPU) target_compile_definitions(IGLLibrary PUBLIC "IGL_WITH_TRACY_GPU=1") endif() endif() if(IGL_DEPLOY_DEPS) add_dependencies(IGLLibrary IGLDependencies) endif() if(IGL_ENFORCE_LOGS) target_compile_definitions(IGLLibrary PUBLIC "IGL_FORCE_ENABLE_LOGS=1") endif() if(UNIX AND NOT APPLE AND NOT ANDROID AND NOT EMSCRIPTEN) if(IGL_WITH_SAMPLES OR IGL_WITH_SHELL) target_compile_definitions(IGLLibrary PUBLIC "IGL_PLATFORM_LINUX_USE_EGL=0") else() target_compile_definitions(IGLLibrary PUBLIC "IGL_PLATFORM_LINUX_USE_EGL=1") endif() endif() # in the client code, use IGL_BACKEND_* macros instead of IGL_BACKEND_ENABLE_* if(IGL_WITH_OPENGL) target_compile_definitions(IGLLibrary PUBLIC "IGL_BACKEND_ENABLE_OPENGL=1") endif() if(IGL_WITH_OPENGLES OR IGL_WITH_WEBGL) target_compile_definitions(IGLLibrary PUBLIC "IGL_BACKEND_ENABLE_OPENGL=1") endif() if(IGL_WITH_VULKAN) target_compile_definitions(IGLLibrary PUBLIC "IGL_BACKEND_ENABLE_VULKAN=1") endif() if(IGL_WITH_IGLU) target_compile_definitions(IGLLibrary PUBLIC "IGL_WITH_IGLU=1") endif() if(APPLE AND IGL_WITH_METAL) target_compile_definitions(IGLLibrary PUBLIC "IGL_BACKEND_ENABLE_METAL=1") endif() if(WIN32 AND IGL_WITH_D3D12) target_compile_definitions(IGLLibrary PUBLIC "IGL_BACKEND_ENABLE_D3D12=1") endif() if(NOT IGL_WITH_VULKAN) target_sources(IGLLibrary PRIVATE "src/igl/vulkan/util/TextureFormat.cpp") endif() target_compile_definitions(IGLLibrary PUBLIC "IGL_CMAKE_BUILD=1") include_directories(.) # Enable CTest at top-level when tests are requested so `ctest` can discover tests if(IGL_WITH_TESTS) include(CTest) enable_testing() endif() if(IGL_WITH_IGLU OR IGL_WITH_SAMPLES) add_library(IGLstb third-party/deps/patches/stb_impl/stb_image.c third-party/deps/patches/stb_impl/stb_image_resize.c third-party/deps/patches/stb_impl/stb_image_write.c) target_include_directories(IGLstb PUBLIC "third-party/deps/src/stb") target_include_directories(IGLstb PUBLIC "third-party/deps/src") igl_set_folder(IGLstb "IGL") endif() if (IGL_WITH_IGLU) include_directories("third-party/deps/src/imgui") add_subdirectory(IGLU) if(IGL_WITH_SHELL) include_directories("third-party/deps/src/stb") add_subdirectory(shell) endif() endif() if(IGL_WITH_SAMPLES) if (EMSCRIPTEN) add_subdirectory(samples/wasm) else() include_directories("third-party/deps/src") include_directories("third-party/deps/src/bc7enc") include_directories("third-party/deps/src/gli") include_directories("third-party/deps/src/glm") include_directories("third-party/deps/src/stb") include_directories("third-party/deps/src/taskflow") include_directories("third-party/deps/src/3D-Graphics-Rendering-Cookbook") if(WIN32 OR (UNIX AND NOT APPLE AND NOT ANDROID)) # cmake-format: off set(GLFW_BUILD_DOCS OFF CACHE BOOL "") set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "") set(GLFW_BUILD_TESTS OFF CACHE BOOL "") set(GLFW_INSTALL OFF CACHE BOOL "") set(GLFW_VULKAN_STATIC OFF CACHE BOOL "") # cmake-format: on add_subdirectory(third-party/deps/src/glfw) igl_set_folder(update_mappings "third-party/GLFW3") endif() if(UNIX AND NOT APPLE AND NOT ANDROID) find_package(OpenGL REQUIRED) endif() add_subdirectory(third-party/deps/src/bc7enc) igl_set_cxxstd(bc7enc 17) add_subdirectory(third-party/deps/src/meshoptimizer) add_subdirectory(third-party/deps/src/tinyobjloader) igl_set_folder(bc7enc "third-party") igl_set_folder(meshoptimizer "third-party") igl_set_folder(tinyobjloader "third-party/tinyobjloader") igl_set_folder(uninstall "third-party/tinyobjloader") if(NOT APPLE AND NOT ANDROID) add_subdirectory(samples/desktop) igl_set_folder(glfw "third-party/GLFW3") endif() endif() endif() if (IGL_WITH_VULKAN OR IGL_WITH_IGLU OR IGL_WITH_SAMPLES) add_subdirectory(third-party/deps/src/fmt "fmt") igl_set_folder(fmt "third-party") endif() if (IGL_WITH_IGLU OR IGL_WITH_SAMPLES) set(KTX_FEATURE_DOC OFF CACHE BOOL "") if (NOT EMSCRIPTEN) set(KTX_FEATURE_GL_UPLOAD OFF CACHE BOOL "") endif() set(KTX_FEATURE_JNI OFF CACHE BOOL "") set(KTX_FEATURE_KTX1 ON CACHE BOOL "") set(KTX_FEATURE_KTX2 ON CACHE BOOL "") set(KTX_FEATURE_LOADTEST_APPS OFF CACHE BOOL "") set(KTX_FEATURE_STATIC_LIBRARY ON CACHE BOOL "") set(KTX_FEATURE_TESTS OFF CACHE BOOL "") set(KTX_FEATURE_TOOLS OFF CACHE BOOL "") set(KTX_FEATURE_VK_UPLOAD OFF CACHE BOOL "") add_subdirectory(third-party/deps/src/ktx-software) if(TARGET astcenc-avx2-static) igl_set_folder(astcenc-avx2-static "third-party/ktx-software") endif() igl_set_folder(ktx "third-party/ktx-software") igl_set_folder(ktx_read "third-party/ktx-software") igl_set_folder(ktx_version "third-party/ktx-software") igl_set_folder(obj_basisu_cbind "third-party/ktx-software") igl_set_folder(objUtil "third-party/ktx-software") endif() if(IGL_WITH_TRACY) target_link_libraries(IGLLibrary PUBLIC TracyClient) endif() if(IGL_WITH_OPENXR) target_compile_definitions(IGLLibrary PUBLIC "IGL_WITH_OPENXR=1") target_link_libraries(IGLLibrary PUBLIC OpenXR::openxr_loader) target_include_directories(IGLLibrary PUBLIC "${IGL_ROOT_DIR}/third-party/deps/src/openxr-sdk/include") endif() if(IGL_ENABLE_INSTALL) include(cmake/install.cmake) endif() ================================================ FILE: CODE_OF_CONDUCT.md ================================================ # Code of Conduct ## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to make participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. ## Our Standards Examples of behavior that contributes to creating a positive environment include: * Using welcoming and inclusive language * Being respectful of differing viewpoints and experiences * Gracefully accepting constructive criticism * Focusing on what is best for the community * Showing empathy towards other community members Examples of unacceptable behavior by participants include: * The use of sexualized language or imagery and unwelcome sexual attention or advances * Trolling, insulting/derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or electronic address, without explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ## Scope This Code of Conduct applies within all project spaces, and it also applies when an individual is representing the project or its community in public spaces. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at . All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html [homepage]: https://www.contributor-covenant.org For answers to common questions about this code of conduct, see https://www.contributor-covenant.org/faq ================================================ FILE: CONTRIBUTING.md ================================================ # Contributing to IGL We want to make contributing to this project as easy and transparent as possible. ## Pull Requests We actively welcome your pull requests. Here's the procedure to submit pull requests to IGL: 1. Submit an issue describing your proposed changes. 2. The repo owner will respond to your issue. 3. If your proposed changes are accepted, fork the repo and develop & test your changes. 4. If you've added code that should be tested, add tests (and ensure they do pass). 5. Verify your changes work as expected on all relevant rendering backends, and also test them when any combination of backends is disabled using the `IGL_WITH_*` CMake options. 6. If you've changed APIs, update the documentation. 7. Make sure your code lints (run `clang-format` or use `.clang-format` in Visual Studio). 8. If you haven't already, complete the Contributor License Agreement ("CLA"). 9. Please respect `// @fb-only` comments and do not delete them! 10. Open a pull request. ## Dependencies One of our design objectives is that IGL itself should have as few dependencies as possible. No new third-party dependencies will be accepted unless they are absolutely critical to the core functionality of IGL. ## Contributor License Agreement ("CLA") In order to accept your pull request, we need you to submit a CLA. You only need to do this once to work on any of Facebook's open source projects. Complete your CLA here: ## Issues We use GitHub issues to track public bugs. Please ensure your description is clear and has sufficient instructions to be able to reproduce the issue. Facebook has a [bounty program](https://www.facebook.com/whitehat/) for the safe disclosure of security bugs. In those cases, please go through the process outlined on that page and do not file a public issue. ## License By contributing to igl, you agree that your contributions will be licensed under the LICENSE file in the root directory of this source tree. ================================================ FILE: IGLU/CMakeLists.txt ================================================ # Copyright (c) Meta Platforms, Inc. and affiliates. # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. cmake_minimum_required(VERSION 3.19) set(PROJECT_NAME "IGLU") macro(ADD_IGLU_MODULE module) file(GLOB_RECURSE SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${module}/*.cpp ${module}/*.mm) file(GLOB_RECURSE HEADER_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${module}/*.h) if((NOT IGL_WITH_OPENGL) AND (NOT IGL_WITH_OPENGLES)) list(REMOVE_ITEM SRC_FILES ${module}/OpenGLTextureAccessor.cpp) list(REMOVE_ITEM HEADER_FILES ${module}/OpenGLTextureAccessor.h) endif() if(NOT IGL_WITH_METAL) list(REMOVE_ITEM SRC_FILES ${module}/MetalTextureAccessor.mm) list(REMOVE_ITEM HEADER_FILES ${module}/MetalTextureAccessor.h) endif() add_library(IGLU${module} ${SRC_FILES} ${HEADER_FILES}) igl_set_cxxstd(IGLU${module} 20) igl_set_folder(IGLU${module} "IGL/${PROJECT_NAME}") target_link_libraries(IGLU${module} PRIVATE IGLLibrary) target_include_directories(IGLU${module} PUBLIC "${CMAKE_CURRENT_BINARY_DIR}/include") target_include_directories(IGLU${module} PUBLIC "${CMAKE_CURRENT_BINARY_DIR}/include_${module}") target_include_directories(IGLU${module} PUBLIC "${IGL_ROOT_DIR}") endmacro() add_iglu_module(imgui) add_iglu_module(managedUniformBuffer) add_iglu_module(sentinel) add_iglu_module(simple_renderer) add_iglu_module(state_pool) add_iglu_module(shaderCross) add_iglu_module(texture_accessor) add_iglu_module(texture_loader) add_iglu_module(uniform) # header-only add_library(IGLUsimdtypes INTERFACE) target_include_directories(IGLUsimdtypes INTERFACE "simdtypes") target_link_libraries(IGLUtexture_loader PRIVATE IGLstb) target_link_libraries(IGLUtexture_loader PRIVATE ktx) if(IGL_WITH_SHELL) target_link_libraries(IGLUimgui PRIVATE IGLShellShared) else() target_sources(IGLUimgui PRIVATE "${IGL_ROOT_DIR}/shell/shared/input/InputDispatcher.cpp") endif() # ImGui target_sources(IGLUimgui PRIVATE "${IGL_ROOT_DIR}/third-party/deps/src/imgui/imgui.cpp") target_sources(IGLUimgui PRIVATE "${IGL_ROOT_DIR}/third-party/deps/src/imgui/imgui_demo.cpp") target_sources(IGLUimgui PRIVATE "${IGL_ROOT_DIR}/third-party/deps/src/imgui/imgui_draw.cpp") target_sources(IGLUimgui PRIVATE "${IGL_ROOT_DIR}/third-party/deps/src/imgui/imgui_tables.cpp") target_sources(IGLUimgui PRIVATE "${IGL_ROOT_DIR}/third-party/deps/src/imgui/imgui_widgets.cpp") target_include_directories(IGLUimgui PUBLIC "${IGL_ROOT_DIR}/third-party/deps/src/imgui") target_include_directories(IGLUtexture_accessor PUBLIC "${IGL_ROOT_DIR}/third-party/deps/src/glew/include") if(UNIX) if (CMAKE_C_COMPILER_ID STREQUAL "GNU") target_compile_options(IGLUimgui PUBLIC $<$:-Wno-volatile>) endif() endif() # SPIRV-Cross # cmake-format: off set(SPIRV_CROSS_SHARED OFF CACHE BOOL "") set(SPIRV_CROSS_STATIC ON CACHE BOOL "") set(SPIRV_CROSS_CLI OFF CACHE BOOL "") set(SPIRV_CROSS_ENABLE_TESTS OFF CACHE BOOL "") set(SPIRV_CROSS_ENABLE_GLSL ON CACHE BOOL "") set(SPIRV_CROSS_ENABLE_HLSL OFF CACHE BOOL "") set(SPIRV_CROSS_ENABLE_MSL ON CACHE BOOL "") set(SPIRV_CROSS_ENABLE_CPP OFF CACHE BOOL "") set(SPIRV_CROSS_ENABLE_REFLECT OFF CACHE BOOL "") set(SPIRV_CROSS_SKIP_INSTALL ON CACHE BOOL "") add_subdirectory(${IGL_ROOT_DIR}/third-party/deps/src/SPIRV-Cross "SPIRV-Cross") igl_set_folder(spirv-cross-core "third-party/spirv-cross/spirv-cross-core") igl_set_folder(spirv-cross-glsl "third-party/spirv-cross/spirv-cross-glsl") igl_set_folder(spirv-cross-msl "third-party/spirv-cross/spirv-cross-msl") igl_set_folder(spirv-cross-util "third-party/spirv-cross/spirv-cross-util") igl_set_folder(spirv-cross-c "third-party/spirv-cross/spirv-cross-c") # cmake-format: on target_include_directories(IGLUshaderCross PRIVATE "${IGL_ROOT_DIR}/third-party/deps/src/SPIRV-Cross" "${IGL_ROOT_DIR}/third-party/deps/src/glslang") target_link_libraries(IGLUshaderCross PRIVATE IGLGlslang IGLUmanagedUniformBuffer spirv-cross-core spirv-cross-glsl spirv-cross-msl spirv-cross-util spirv-cross-c) ================================================ FILE: IGLU/bitmap/BitmapWriter.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include namespace igl::iglu { namespace { #if defined(_MSC_VER) #pragma pack(push, 1) #endif struct BMPHeader { // Bitmap file header uint16_t signature = 0x4D42; // Signature ("BM" in ASCII), default value 0x4D42 for BMP format uint32_t fileSize = 0; uint16_t reserved1 = 0; uint16_t reserved2 = 0; uint32_t dataOffset = sizeof(BMPHeader); // Offset to the start of image data // DIB header (Bitmap information header) uint32_t headerSize = 40; // Size of the DIB header int32_t imageWidth = 0; int32_t imageHeight = 0; uint16_t colorPlanes = 1; // Number of color planes uint16_t bitsPerPixel = 24; uint32_t compression = 0; // Compression method (initialized to 0 for no compression) uint32_t imageSizeBytes = 0; int32_t horizontalResolution = 0; // Horizontal resolution in pixels per meter int32_t verticalResolution = 0; // Vertical resolution in pixels per meter uint32_t numColors = 0; // Number of colors in the color palette uint32_t importantColors = 0; // Number of important colors used } #if defined(__GNUC__) || defined(__clang__) __attribute__((packed)) #endif ; #if defined(_MSC_VER) #pragma pack(pop) #endif struct BufferOffsets { size_t r; size_t g; size_t b; }; BufferOffsets getBufferOffsets(TextureFormat format) { switch (format) { case igl::TextureFormat::RGBA_UNorm8: case igl::TextureFormat::RGBX_UNorm8: case igl::TextureFormat::RGBA_SRGB: { return {.r = 0, .g = 1, .b = 2}; } case igl::TextureFormat::BGRA_UNorm8: case igl::TextureFormat::BGRA_SRGB: { return {.r = 2, .g = 1, .b = 0}; } default: IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); return {.r = 0, .g = 1, .b = 2}; } } } // namespace bool isSupportedBitmapTextureFormat(TextureFormat format) { switch (format) { case igl::TextureFormat::RGBA_UNorm8: case igl::TextureFormat::RGBX_UNorm8: case igl::TextureFormat::RGBA_SRGB: case igl::TextureFormat::BGRA_UNorm8: case igl::TextureFormat::BGRA_SRGB: return true; default: return false; } } void writeBitmap(std::ostream& stream, std::shared_ptr texture, IDevice& device, bool flipY) { IGL_DEBUG_ASSERT(texture); IGL_DEBUG_ASSERT(texture->getType() == igl::TextureType::TwoD); IGL_DEBUG_ASSERT(isSupportedBitmapTextureFormat(texture->getFormat())); const auto textureAccessor = ::iglu::textureaccessor::TextureAccessorFactory::createTextureAccessor( device.getBackendType(), texture, device); const igl::CommandQueueDesc desc{}; Result result; const auto commandQueue = device.createCommandQueue(desc, &result); if (!IGL_DEBUG_VERIFY(result.isOk()) || !IGL_DEBUG_VERIFY(commandQueue)) { return; } textureAccessor->requestBytes(*commandQueue, nullptr); const auto& buffer = textureAccessor->getBytes(); const auto size = texture->getSize(); const TextureRangeDesc textureRange = texture->getFullRange(); const auto& properties = texture->getProperties(); const uint32_t bytesPerRow = properties.getBytesPerRow(textureRange); std::vector imageData; imageData.reserve(size.width * size.height * 3); IGL_DEBUG_ASSERT(buffer.size() == size.height * bytesPerRow); const auto bufferOffsets = getBufferOffsets(texture->getFormat()); for (size_t y = 0; y < size.height; ++y) { const size_t row = flipY ? size.height - y - 1 : y; for (size_t byte = 0; byte < bytesPerRow; byte += 4) { const size_t index = row * bytesPerRow + byte; const uint8_t r = buffer[index + bufferOffsets.r]; const uint8_t g = buffer[index + bufferOffsets.g]; const uint8_t b = buffer[index + bufferOffsets.b]; imageData.push_back(b); imageData.push_back(g); imageData.push_back(r); } } writeBitmap(stream, static_cast(imageData.data()), size.width, size.height); } void writeBitmap(std::ostream& stream, const uint8_t* imageData, uint32_t width, uint32_t height) { const uint32_t imageSize = width * height * 3; BMPHeader header{ .fileSize = static_cast(sizeof(BMPHeader) + imageSize), .imageWidth = static_cast(width), .imageHeight = static_cast(height), .imageSizeBytes = static_cast(imageSize), }; stream.write(reinterpret_cast(&header), sizeof(header)); stream.write(reinterpret_cast(imageData), imageSize); } } // namespace igl::iglu ================================================ FILE: IGLU/bitmap/BitmapWriter.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::iglu { // Check if a texture format is supported by the bitmap writer bool isSupportedBitmapTextureFormat(TextureFormat format); // Write the contents of a texture to a bitmap file void writeBitmap(std::ostream& stream, std::shared_ptr texture, IDevice& device, bool flipY = false); void writeBitmap(std::ostream& stream, const uint8_t* imageData, uint32_t width, uint32_t height); } // namespace igl::iglu ================================================ FILE: IGLU/command_buffer_allocator/ICommandBufferAllocator.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace iglu::command_buffer_allocator { ICommandBufferAllocator::CommandBufferScope::CommandBufferScope( ICommandBufferAllocator& allocator, igl::ICommandBuffer& commandBuffer, bool shouldFinalizeCommandBuffer) noexcept : allocator_(allocator), commandBuffer_(commandBuffer), shouldFinalizeCommandBuffer_(shouldFinalizeCommandBuffer) {} ICommandBufferAllocator::CommandBufferScope::~CommandBufferScope() noexcept { if (shouldFinalizeCommandBuffer_) { allocator_.finalizeCommandBuffer(); } } igl::ICommandBuffer& ICommandBufferAllocator::CommandBufferScope::commandBuffer() noexcept { return commandBuffer_; } const igl::ICommandBuffer& ICommandBufferAllocator::CommandBufferScope::commandBuffer() const noexcept { return commandBuffer_; } } // namespace iglu::command_buffer_allocator ================================================ FILE: IGLU/command_buffer_allocator/ICommandBufferAllocator.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace iglu::command_buffer_allocator { /** * ICommandBuffer Allocator is am interface to allocate Command Buffers and submit them all at once. */ class ICommandBufferAllocator { public: ICommandBufferAllocator() = default; virtual ~ICommandBufferAllocator() = default; struct CommandBufferScopeConfig { bool present = false; std::shared_ptr presentTexture = nullptr; bool waitUntilScheduled = false; bool waitUntilCompleted = false; std::string debugName = ""; }; struct CommandBufferScope { public: ~CommandBufferScope() noexcept; static void* operator new(size_t) = delete; // stack allocation only [[nodiscard]] igl::ICommandBuffer& commandBuffer() noexcept; [[nodiscard]] const igl::ICommandBuffer& commandBuffer() const noexcept; private: friend class ICommandBufferAllocator; CommandBufferScope(ICommandBufferAllocator& allocator, igl::ICommandBuffer& commandBuffer, bool shouldFinalizeCommandBuffer) noexcept; ICommandBufferAllocator& allocator_; igl::ICommandBuffer& commandBuffer_; bool shouldFinalizeCommandBuffer_ = false; }; virtual void createCommandBuffer(const std::string& debugName) noexcept = 0; [[nodiscard]] virtual CommandBufferScope commandBufferScope() noexcept = 0; [[nodiscard]] virtual CommandBufferScope commandBufferScope( ICommandBufferAllocator& allocator, igl::ICommandBuffer& commandBuffer, bool shouldFinalizeCommandBuffer) noexcept { return {allocator, commandBuffer, shouldFinalizeCommandBuffer}; } [[nodiscard]] virtual CommandBufferScope commandBufferScope( CommandBufferScopeConfig config) noexcept = 0; virtual void finalizeCommandBuffer() noexcept = 0; }; } // namespace iglu::command_buffer_allocator ================================================ FILE: IGLU/imgui/InputListener.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include "InputListener.h" #include "KeyCodeTranslator.h" // ImGui has a very awkward expectation when it comes to processing inputs and making decisions // based on them. This is what it expects clients to do, in order, every frame: // 1. Send ImGui all events via the input parameters in ImGuiIO. // 2. Call ImGui::NewFrame -- that's when events are processed. // 3. Read the output parameters of ImGuiIO to know which events it wants to capture. // 4. Forward uncaptured events to other systems. // // This is an awkward expectation and we currently don't follow it. Instead, we process events // before calling ImGui::NewFrame and immediately check whether ImGui wants to capture events, which // is one frame old. This can be a source of problems if we have multiple input listeners and // depending on how they process inputs. namespace iglu::imgui { InputListener::InputListener(ImGuiContext* context) { context_ = context; } bool InputListener::process(const igl::shell::MouseButtonEvent& event) { makeCurrentContext(); ImGuiIO& io = ImGui::GetIO(); io.MousePos = ImVec2(event.x, event.y); io.MouseDown[event.button] = event.isDown; return io.WantCaptureMouse; } bool InputListener::process(const igl::shell::MouseMotionEvent& event) { makeCurrentContext(); ImGuiIO& io = ImGui::GetIO(); io.MousePos = ImVec2(event.x, event.y); return io.WantCaptureMouse; } bool InputListener::process(const igl::shell::MouseWheelEvent& event) { makeCurrentContext(); ImGuiIO& io = ImGui::GetIO(); io.MouseWheelH = event.dx; io.MouseWheel = event.dy; return io.WantCaptureMouse; } bool InputListener::process(const igl::shell::TouchEvent& event) { makeCurrentContext(); ImGuiIO& io = ImGui::GetIO(); io.MousePos = ImVec2(event.x, event.y); io.MouseDown[0] = event.isDown; return io.WantCaptureMouse; } void InputListener::makeCurrentContext() const { ImGui::SetCurrentContext(context_); } bool InputListener::process(const igl::shell::KeyEvent& event) { makeCurrentContext(); ImGuiIO& io = ImGui::GetIO(); ImGuiKey key = keyFromShellKeyEvent(event); if (key != ImGuiKey_None) { io.AddKeyEvent(key, event.isDown); } return io.WantCaptureKeyboard; } bool InputListener::process(const igl::shell::CharEvent& event) { makeCurrentContext(); ImGuiIO& io = ImGui::GetIO(); io.AddInputCharacter(event.character); return io.WantTextInput; } } // namespace iglu::imgui ================================================ FILE: IGLU/imgui/InputListener.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include "imgui.h" #include // IWYU pragma: export #include #include namespace iglu::imgui { class InputListener : public igl::shell::IMouseListener, public igl::shell::ITouchListener, public igl::shell::IKeyListener { public: explicit InputListener(ImGuiContext* context); ~InputListener() override = default; protected: bool process(const igl::shell::MouseButtonEvent& event) override; bool process(const igl::shell::MouseMotionEvent& event) override; bool process(const igl::shell::MouseWheelEvent& event) override; bool process(const igl::shell::TouchEvent& event) override; bool process(const igl::shell::KeyEvent& event) override; bool process(const igl::shell::CharEvent& event) override; private: ImGuiContext* context_; void makeCurrentContext() const; }; } // namespace iglu::imgui ================================================ FILE: IGLU/imgui/KeyCodeTranslator.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include "KeyCodeTranslator.h" #include #if IGL_PLATFORM_APPLE namespace { enum KeyModifiers { kVK_Return = 0x24, kVK_Tab = 0x30, kVK_Delete = 0x33, kVK_Escape = 0x35, kVK_Shift = 0x38, kVK_Option = 0x3A, kVK_Control = 0x3B, kVK_RightArrow = 0x7C, kVK_LeftArrow = 0x7B, kVK_DownArrow = 0x7D, kVK_UpArrow = 0x7E, kVK_ForwardDelete = 0x75, kVK_Home = 0x73, kVK_End = 0x77, kVK_PageUp = 0x74, kVK_PageDown = 0x79, }; [[maybe_unused]] ImGuiKey keyFromShellKeyEventApple(igl::shell::KeyEvent event) { int keyCode = event.key; switch (keyCode) { case kVK_Return: return ImGuiKey_Enter; case kVK_Tab: return ImGuiKey_Tab; case kVK_Delete: return ImGuiKey_Backspace; case kVK_ForwardDelete: return ImGuiKey_Delete; case kVK_Escape: return ImGuiKey_Escape; case kVK_Shift: return ImGuiKey_LeftShift; case kVK_Option: return ImGuiKey_LeftAlt; case kVK_Control: return ImGuiKey_LeftCtrl; case kVK_LeftArrow: return ImGuiKey_LeftArrow; case kVK_RightArrow: return ImGuiKey_RightArrow; case kVK_UpArrow: return ImGuiKey_UpArrow; case kVK_DownArrow: return ImGuiKey_DownArrow; case kVK_Home: return ImGuiKey_Home; case kVK_End: return ImGuiKey_End; case kVK_PageUp: return ImGuiKey_PageUp; case kVK_PageDown: return ImGuiKey_PageDown; default: return ImGuiKey_None; } } } // namespace #endif namespace iglu::imgui { ImGuiKey keyFromShellKeyEvent(igl::shell::KeyEvent event) { #if IGL_PLATFORM_APPLE return keyFromShellKeyEventApple(event); #else // For non-Apple platforms, return ImGuiKey_None for unmapped keys // to avoid passing invalid key codes to ImGui return ImGuiKey_None; #endif } } // namespace iglu::imgui ================================================ FILE: IGLU/imgui/KeyCodeTranslator.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include "imgui.h" #include namespace iglu::imgui { ImGuiKey keyFromShellKeyEvent(igl::shell::KeyEvent event); } // namespace iglu::imgui ================================================ FILE: IGLU/imgui/Session.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include "Session.h" #include #include #include // D3D12 FXC precompiled shaders #include "imgui_ps_d3d12_fxc.h" #include "imgui_vs_d3d12_fxc.h" namespace iglu::imgui { /* internal renderer -- based on imgui_impl_metal.mm */ #define PLAIN_SHADER_STRINGIFY(...) #__VA_ARGS__ #define PLAIN_SHADER(...) PLAIN_SHADER_STRINGIFY(__VA_ARGS__) static const char* metalShaderStr() { return PLAIN_SHADER( using namespace metal; struct Uniforms { float4x4 projectionMatrix; }; struct VertexIn { float2 position [[attribute(0)]]; float2 texCoords [[attribute(1)]]; float4 color [[attribute(2)]]; }; struct VertexOut { float4 position [[position]]; float2 texCoords; float4 color; }; vertex VertexOut vertex_main(VertexIn in [[stage_in]], constant Uniforms & uniforms [[buffer(1)]]) { VertexOut out; out.position = uniforms.projectionMatrix * float4(in.position, 0, 1); out.texCoords = in.texCoords; out.color = in.color; return out; } fragment half4 fragment_main(VertexOut in [[stage_in]], texture2d texture [[texture(0)]]) { constexpr sampler linearSampler( coord::normalized, min_filter::linear, mag_filter::linear, mip_filter::linear); half4 texColor = texture.sample(linearSampler, in.texCoords); return half4(in.color) * texColor; } ); } static std::string getOpenGLVertexShaderSource(igl::ShaderVersion shaderVersion) { std::string shader; if (shaderVersion.majorVersion > 1 || shaderVersion.minorVersion > 30 || shaderVersion.family == igl::ShaderFamily::GlslEs) { #if IGL_PLATFORM_MACOSX shader += "#version 100\n"; #endif shader += "precision mediump float;"; } shader += PLAIN_SHADER(attribute vec2 position; attribute vec2 texCoords; attribute vec4 color; uniform mat4 projectionMatrix; varying vec2 Frag_UV; varying vec4 Frag_Color; void main() { Frag_UV = texCoords; Frag_Color = color; gl_Position = projectionMatrix * vec4(position.xy, 0, 1); }); return shader; } static const char* getVulkanVertexShaderSource() { return R"( layout(location = 0) in vec2 position; layout(location = 1) in vec2 texCoords; layout(location = 2) in vec4 col; layout (location = 0) out vec4 color; layout (location = 1) out vec2 uv; layout(push_constant) uniform PushConstants { mat4 proj; } pc; out gl_PerVertex { vec4 gl_Position; }; void main() { color = col; uv = texCoords; gl_Position = pc.proj * vec4(position.xy, 0, 1); })"; } static std::string getOpenGLFragmentShaderSource(igl::ShaderVersion shaderVersion) { std::string shader; if (shaderVersion.majorVersion > 1 || shaderVersion.minorVersion > 30 || shaderVersion.family == igl::ShaderFamily::GlslEs) { #if IGL_PLATFORM_MACOSX shader += "#version 100\n"; #endif shader += "precision mediump float;"; } shader += PLAIN_SHADER(uniform sampler2D texture; varying vec2 Frag_UV; varying vec4 Frag_Color; void main() { gl_FragColor = Frag_Color * texture2D(texture, Frag_UV.st); }); return shader; } static const char* getVulkanFragmentShaderSource() { return R"( layout(location = 0) out vec4 fColor; layout(location = 0) in vec4 color; layout(location = 1) in vec2 uv; layout (set = 0, binding = 0) uniform sampler2D uTex; void main() { fColor = color * texture(uTex, uv); })"; } // Note: D3D12 shader source functions are kept for reference but not used. // The D3D12 backend uses pre-compiled binary shaders. #if IGL_PLATFORM_WINDOWS static const char* getD3D12VertexShaderSource() { return R"( cbuffer Uniforms : register(b0) { float4x4 projectionMatrix; }; struct VSInput { float2 position : POSITION; float2 uv : TEXCOORD0; float4 color : COLOR; }; struct PSInput { float4 position : SV_Position; float4 color : COLOR; float2 uv : TEXCOORD0; }; PSInput main(VSInput input) { PSInput output; // Column-major multiplication to match the CPU-side matrix format // In HLSL: mul(vector, matrix) treats matrix as column-major output.position = mul(float4(input.position.xy, 0, 1), projectionMatrix); output.color = input.color; output.uv = input.uv; return output; })"; } static const char* getD3D12FragmentShaderSource() { return R"( struct PSInput { float4 position : SV_Position; float4 color : COLOR; float2 uv : TEXCOORD0; }; Texture2D tex : register(t0); SamplerState uSampler : register(s0); float4 main(PSInput input) : SV_Target { return input.color * tex.Sample(uSampler, input.uv); })"; } #endif static std::unique_ptr getShaderStagesForBackend(igl::IDevice& device) { igl::Result result; switch (device.getBackendType()) { case igl::BackendType::Invalid: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; case igl::BackendType::Vulkan: { return igl::ShaderStagesCreator::fromModuleStringInput(device, getVulkanVertexShaderSource(), "main", "Shader Module: imgui::vertex", getVulkanFragmentShaderSource(), "main", "Shader Module: imgui::fragment", &result); } // @fb-only // @fb-only // @fb-only case igl::BackendType::Custom: IGL_DEBUG_ABORT("IGLSamples not set up for Custom"); return nullptr; case igl::BackendType::Metal: { return igl::ShaderStagesCreator::fromLibraryStringInput( device, metalShaderStr(), "vertex_main", "fragment_main", "", &result); } case igl::BackendType::OpenGL: { auto shaderVersion = device.getShaderVersion(); const std::string vertexStr = getOpenGLVertexShaderSource(shaderVersion); const std::string fragmentStr = getOpenGLFragmentShaderSource(shaderVersion); return igl::ShaderStagesCreator::fromModuleStringInput( device, vertexStr.c_str(), "main", "", fragmentStr.c_str(), "main", "", &result); } case igl::BackendType::D3D12: { return igl::ShaderStagesCreator::fromModuleBinaryInput(device, _tmp_imgui_vs_fxc_cso, _tmp_imgui_vs_fxc_cso_len, "main", "Shader Module: imgui::vertex (D3D12)", _tmp_imgui_ps_fxc_cso, _tmp_imgui_ps_fxc_cso_len, "main", "Shader Module: imgui::fragment (D3D12)", &result); } } IGL_UNREACHABLE_RETURN(nullptr) } namespace { struct DrawableData { std::shared_ptr vertexData; std::shared_ptr drawable; DrawableData(igl::IDevice& device, const std::shared_ptr& inputState, const std::shared_ptr& material) { IGL_DEBUG_ASSERT(sizeof(ImDrawIdx) == 2, "The constants below may not work with the ImGui data."); const size_t kMaxVertices = (1l << 16); const size_t kMaxVertexBufferSize = kMaxVertices * sizeof(ImDrawVert); const size_t kMaxIndexBufferSize = kMaxVertices * sizeof(ImDrawIdx); const igl::BufferDesc vbDesc{.type = igl::BufferDesc::BufferTypeBits::Vertex, .data = nullptr, .length = kMaxVertexBufferSize, .storage = igl::ResourceStorage::Shared, .hint = 0, .debugName = "vertex (" + material->name + ")"}; const igl::BufferDesc ibDesc{.type = igl::BufferDesc::BufferTypeBits::Index, .data = nullptr, .length = kMaxIndexBufferSize, .storage = igl::ResourceStorage::Shared, .hint = 0, .debugName = "index (" + material->name + ")"}; iglu::vertexdata::PrimitiveDesc primitiveDesc; primitiveDesc.numEntries = 0; vertexData = std::make_shared( inputState, device.createBuffer(vbDesc, nullptr), device.createBuffer(ibDesc, nullptr), sizeof(ImDrawIdx) == sizeof(uint16_t) ? igl::IndexFormat::UInt16 : igl::IndexFormat::UInt32, primitiveDesc); drawable = std::make_shared(vertexData, material); } }; } // namespace class Session::Renderer { public: explicit Renderer(igl::IDevice& device); ~Renderer(); Renderer(const Renderer&) = delete; Renderer& operator=(const Renderer&) = delete; Renderer(Renderer&&) = delete; Renderer& operator=(Renderer&&) = delete; void newFrame(const igl::FramebufferDesc& desc); void renderDrawData(igl::IDevice& device, igl::IRenderCommandEncoder& cmdEncoder, ImDrawData* drawData); bool dumpRenderDrawDataInfo{false}; private: std::shared_ptr vertexInputState_; std::shared_ptr material_; std::vector drawables_[3]; // list of drawables to be reused every 3 frames size_t nextBufferingIndex_ = 0; igl::RenderPipelineDesc renderPipelineDesc_; std::shared_ptr fontTexture_; std::shared_ptr linearSampler_; }; Session::Renderer::Renderer(igl::IDevice& device) { ImGuiIO& io = ImGui::GetIO(); io.BackendRendererName = "imgui_impl_igl"; linearSampler_ = device.createSamplerState(igl::SamplerStateDesc::newLinear(), nullptr); { // init fonts unsigned char* pixels = nullptr; int width = 0, height = 0; io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); igl::TextureDesc desc = igl::TextureDesc::new2D(igl::TextureFormat::RGBA_UNorm8, width, height, igl::TextureDesc::TextureUsageBits::Sampled); desc.debugName = "IGLU/imgui/Session.cpp:Session::Renderer::_fontTexture"; fontTexture_ = device.createTexture(desc, nullptr); fontTexture_->upload(igl::TextureRangeDesc::new2D(0, 0, width, height), pixels); io.Fonts->TexID = reinterpret_cast(fontTexture_.get()); } { igl::VertexInputStateDesc inputDesc; inputDesc.numAttributes = 3; inputDesc.attributes[0] = igl::VertexAttribute{ .bufferIndex = 0, .format = igl::VertexAttributeFormat::Float2, .offset = offsetof(ImDrawVert, pos), .name = "position", .location = 0, }; inputDesc.attributes[1] = igl::VertexAttribute{ .bufferIndex = 0, .format = igl::VertexAttributeFormat::Float2, .offset = offsetof(ImDrawVert, uv), .name = "texCoords", .location = 1, }; inputDesc.attributes[2] = igl::VertexAttribute{ .bufferIndex = 0, .format = igl::VertexAttributeFormat::UByte4Norm, .offset = offsetof(ImDrawVert, col), .name = "color", .location = 2, }; inputDesc.numInputBindings = 1; inputDesc.inputBindings[0].stride = sizeof(ImDrawVert); vertexInputState_ = device.createVertexInputState(inputDesc, nullptr); } { auto stages = getShaderStagesForBackend(device); auto program = std::make_shared( device, std::move(stages), vertexInputState_); material_ = std::make_shared(device, "imgui"); material_->setShaderProgram(device, program); material_->cullMode = igl::CullMode::Disabled; material_->blendMode = iglu::material::BlendMode::Translucent(); // @fb-only // D3D12 and Vulkan use direct slot binding, OpenGL/Metal use named binding const bool usesDirectBinding = (device.getBackendType() == igl::BackendType::Vulkan || device.getBackendType() == igl::BackendType::D3D12); if (!usesDirectBinding) { material_->shaderUniforms().setTexture("texture", fontTexture_.get(), linearSampler_); } } } Session::Renderer::~Renderer() { const ImGuiIO& io = ImGui::GetIO(); fontTexture_ = nullptr; io.Fonts->TexID = 0; } void Session::Renderer::newFrame(const igl::FramebufferDesc& desc) { IGL_DEBUG_ASSERT(desc.colorAttachments[0].texture); renderPipelineDesc_.targetDesc.colorAttachments.resize(1); renderPipelineDesc_.targetDesc.colorAttachments[0].textureFormat = desc.colorAttachments[0].texture->getFormat(); renderPipelineDesc_.targetDesc.depthAttachmentFormat = desc.depthAttachment.texture ? desc.depthAttachment.texture->getFormat() : igl::TextureFormat::Invalid; renderPipelineDesc_.targetDesc.stencilAttachmentFormat = desc.stencilAttachment.texture ? desc.stencilAttachment.texture->getFormat() : igl::TextureFormat::Invalid; renderPipelineDesc_.sampleCount = desc.colorAttachments[0].texture->getSamples(); } void Session::Renderer::renderDrawData(igl::IDevice& device, igl::IRenderCommandEncoder& cmdEncoder, ImDrawData* drawData) { // Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != // framebuffer coordinates) const int fbWidth = (int)(drawData->DisplaySize.x * drawData->FramebufferScale.x); const int fbHeight = (int)(drawData->DisplaySize.y * drawData->FramebufferScale.y); if (dumpRenderDrawDataInfo) { // throttle or turn off due to swamping other messages IGL_LOG_INFO( "ImGui renderDrawData: DisplaySize=(%.1f,%.1f), FramebufferScale=(%.1f,%.1f), fb=(%d,%d), " "CmdLists=%d, TotalVtx=%d, TotalIdx=%d\n", drawData->DisplaySize.x, drawData->DisplaySize.y, drawData->FramebufferScale.x, drawData->FramebufferScale.y, fbWidth, fbHeight, drawData->CmdListsCount, drawData->TotalVtxCount, drawData->TotalIdxCount); } if (fbWidth <= 0 || fbHeight <= 0 || drawData->CmdListsCount == 0) { IGL_LOG_INFO("ImGui renderDrawData: Early return (invalid dimensions or no command lists)\n"); return; } cmdEncoder.pushDebugGroupLabel("ImGui Rendering", igl::Color(0, 1, 0)); const igl::Viewport viewport = { /*.x = */ .x = 0.0, /*.y = */ .y = 0.0, /*.width = */ .width = (drawData->DisplaySize.x * drawData->FramebufferScale.x), /*.height = */ .height = (drawData->DisplaySize.y * drawData->FramebufferScale.y), }; cmdEncoder.bindViewport(viewport); using namespace iglu::simdtypes; float4x4 orthoProjection{}; { // setup projection matrix const float l = drawData->DisplayPos.x; const float r = drawData->DisplayPos.x + drawData->DisplaySize.x; const float t = drawData->DisplayPos.y; const float b = drawData->DisplayPos.y + drawData->DisplaySize.y; orthoProjection.columns[0] = float4{2.0f / (r - l), 0.0f, 0.0f, 0.0f}; orthoProjection.columns[1] = float4{0.0f, 2.0f / (t - b), 0.0f, 0.0f}; orthoProjection.columns[2] = float4{0.0f, 0.0f, -1.0f, 0.0f}; orthoProjection.columns[3] = float4{(r + l) / (l - r), (t + b) / (b - t), 0.0f, 1.0f}; // D3D12 and Vulkan use direct slot binding, OpenGL/Metal use named binding const bool usesDirectBinding = (device.getBackendType() == igl::BackendType::Vulkan || device.getBackendType() == igl::BackendType::D3D12); if (!usesDirectBinding) { material_->shaderUniforms().setFloat4x4(igl::genNameHandle("projectionMatrix"), orthoProjection); } } const ImVec2 clipOff = drawData->DisplayPos; // (0,0) unless using multi-viewports const ImVec2 clipScale = drawData->FramebufferScale; // (1,1) unless using retina display which are often (2,2) // Since vertex buffers are updated every frame, we must use triple buffering for Metal to work std::vector& curFrameDrawables = drawables_[nextBufferingIndex_]; nextBufferingIndex_ = (nextBufferingIndex_ + 1) % 3; const bool isOpenGL = device.getBackendType() == igl::BackendType::OpenGL; const bool isVulkan = device.getBackendType() == igl::BackendType::Vulkan; const bool isD3D12 = device.getBackendType() == igl::BackendType::D3D12; const bool usesDirectBinding = isVulkan || isD3D12; ImTextureID lastBoundTextureId = 0; for (int n = 0; n < drawData->CmdListsCount; n++) { const ImDrawList* cmdList = drawData->CmdLists[n]; if (n >= curFrameDrawables.size()) { curFrameDrawables.emplace_back(device, vertexInputState_, material_); } const DrawableData& drawableData = curFrameDrawables[n]; // Upload vertex/index buffers drawableData.vertexData->vertexBuffer().upload( cmdList->VtxBuffer.Data, {cmdList->VtxBuffer.Size * sizeof(ImDrawVert), 0}); drawableData.vertexData->indexBuffer().upload(cmdList->IdxBuffer.Data, {cmdList->IdxBuffer.Size * sizeof(ImDrawIdx), 0}); for (int cmdI = 0; cmdI < cmdList->CmdBuffer.Size; cmdI++) { const ImDrawCmd cmd = cmdList->CmdBuffer[cmdI]; IGL_DEBUG_ASSERT(cmd.UserCallback == nullptr); const ImVec2 clipMin((cmd.ClipRect.x - clipOff.x) * clipScale.x, (cmd.ClipRect.y - clipOff.y) * clipScale.y); const ImVec2 clipMax((cmd.ClipRect.z - clipOff.x) * clipScale.x, (cmd.ClipRect.w - clipOff.y) * clipScale.y); if (clipMax.x <= clipMin.x || clipMax.y <= clipMin.y) { continue; } // OpenGL Y-axis goes up (Vulkan and Metal are good) // https://www.saschawillems.de/blog/2019/03/29/flipping-the-vulkan-viewport/ const igl::ScissorRect rect{.x = uint32_t(clipMin.x), .y = isOpenGL ? uint32_t(viewport.height - clipMax.y) : uint32_t(clipMin.y), .width = uint32_t(clipMax.x - clipMin.x), .height = uint32_t(clipMax.y - clipMin.y)}; cmdEncoder.bindScissorRect(rect); if (cmd.TextureId != lastBoundTextureId) { lastBoundTextureId = cmd.TextureId; auto* tex = reinterpret_cast((ImTextureID)(intptr_t)cmd.TextureId); if (usesDirectBinding) { // D3D12 and Vulkan use direct slot binding // @fb-only // Add Vulkan support for texture reflection info in ShaderUniforms so we don't need to // bind the texture directly cmdEncoder.bindTexture(0, igl::BindTarget::kFragment, tex); cmdEncoder.bindSamplerState(0, igl::BindTarget::kFragment, linearSampler_.get()); } else { material_->shaderUniforms().setTexture( "texture", tex ? tex : fontTexture_.get(), linearSampler_); } } drawableData.vertexData->primitiveDesc().numEntries = cmd.ElemCount; drawableData.vertexData->primitiveDesc().offset = cmd.IdxOffset * sizeof(ImDrawIdx); drawableData.drawable->draw(device, cmdEncoder, renderPipelineDesc_, usesDirectBinding ? sizeof(orthoProjection) : 0, &orthoProjection); } } if (isOpenGL) { // disable scissor cmdEncoder.bindScissorRect(igl::ScissorRect()); } cmdEncoder.popDebugGroupLabel(); } /* public API */ Session::Session(igl::IDevice& device, igl::shell::InputDispatcher& inputDispatcher, bool needInitializeSession /* = true */) : inputDispatcher_(inputDispatcher) { context_ = ImGui::CreateContext(); makeCurrentContext(); ImGuiStyle& style = ImGui::GetStyle(); style.TouchExtraPadding = ImVec2(5, 5); // adjust to make touches more accurate if (needInitializeSession) { initialize(device); } } void Session::initialize(igl::IDevice& device) { if (!isInitialized_) { inputListener_ = std::make_shared(context_); renderer_ = std::make_unique(device); inputDispatcher_.addMouseListener(inputListener_); inputDispatcher_.addTouchListener(inputListener_); inputDispatcher_.addKeyListener(inputListener_); isInitialized_ = true; } } Session::~Session() { makeCurrentContext(); inputDispatcher_.removeTouchListener(inputListener_); inputDispatcher_.removeMouseListener(inputListener_); inputDispatcher_.removeKeyListener(inputListener_); renderer_ = nullptr; inputListener_ = nullptr; ImGui::DestroyContext(); } void Session::beginFrame(const igl::FramebufferDesc& desc, float displayScale) { makeCurrentContext(); IGL_DEBUG_ASSERT(desc.colorAttachments[0].texture); const igl::Size size = desc.colorAttachments[0].texture->getSize(); ImGuiIO& io = ImGui::GetIO(); io.DisplaySize = ImVec2(size.width / displayScale, size.height / displayScale); io.DisplayFramebufferScale = ImVec2(displayScale, displayScale); io.IniFilename = nullptr; renderer_->newFrame(desc); ImGui::NewFrame(); } void Session::endFrame(igl::IDevice& device, igl::IRenderCommandEncoder& cmdEncoder) { makeCurrentContext(); ImGui::EndFrame(); ImGui::Render(); renderer_->renderDrawData(device, cmdEncoder, ImGui::GetDrawData()); } void Session::makeCurrentContext() const { ImGui::SetCurrentContext(context_); } void Session::drawFPS(float fps) const { // a nice FPS counter const ImGuiWindowFlags flags = ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoMove; const ImGuiViewport* v = ImGui::GetMainViewport(); IGL_DEBUG_ASSERT(v); ImGui::SetNextWindowPos( { v->WorkPos.x + v->WorkSize.x - 15.0f, v->WorkPos.y + 15.0f, }, ImGuiCond_Always, {1.0f, 0.0f}); ImGui::SetNextWindowBgAlpha(0.30f); ImGui::SetNextWindowSize(ImVec2(ImGui::CalcTextSize("FPS : _______").x, 0)); if (ImGui::Begin("##FPS", nullptr, flags)) { ImGui::Text("FPS : %i", (int)fps); ImGui::Text("Ms : %.1f", 1000.0 / fps); } ImGui::End(); } } // namespace iglu::imgui ================================================ FILE: IGLU/imgui/Session.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include "imgui.h" #include #include #include #include #include #include #include #include namespace iglu::imgui { class Session { public: void beginFrame(const igl::FramebufferDesc& desc, float displayScale); void endFrame(igl::IDevice& device, igl::IRenderCommandEncoder& cmdEncoder); Session(igl::IDevice& device, igl::shell::InputDispatcher& inputDispatcher, bool needInitializeSession = true); ~Session(); void initialize(igl::IDevice& device); void drawFPS(float fps) const; private: class Renderer; igl::shell::InputDispatcher& inputDispatcher_; std::shared_ptr inputListener_; ImGuiContext* context_; std::unique_ptr renderer_; bool isInitialized_ = false; void makeCurrentContext() const; }; } // namespace iglu::imgui ================================================ FILE: IGLU/imgui/compile_shaders.bat ================================================ @REM Copyright (c) Meta Platforms, Inc. and affiliates. @REM @REM This source code is licensed under the MIT license found in the @REM LICENSE file in the root directory of this source tree. @echo off REM Compile D3D12 ImGui shaders set FXC="C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64\fxc.exe" echo Compiling vertex shader... %FXC% /T vs_5_0 /E main /Fo imgui_vs_d3d12_fxc.cso imgui_vs_d3d12.hlsl if %ERRORLEVEL% NEQ 0 ( echo Vertex shader compilation failed! exit /b 1 ) echo Compiling pixel shader... %FXC% /T ps_5_0 /E main /Fo imgui_ps_d3d12_fxc.cso imgui_ps_d3d12.hlsl if %ERRORLEVEL% NEQ 0 ( echo Pixel shader compilation failed! exit /b 1 ) echo Converting to C header files... python -c "import sys; data = open('imgui_vs_d3d12_fxc.cso', 'rb').read(); print('unsigned char _tmp_imgui_vs_fxc_cso[] = {'); print(', '.join(f'0x{b:02x}' for b in data)); print('};'); print(f'unsigned int _tmp_imgui_vs_fxc_cso_len = {len(data)};')" > imgui_vs_d3d12_fxc.h python -c "import sys; data = open('imgui_ps_d3d12_fxc.cso', 'rb').read(); print('unsigned char _tmp_imgui_ps_fxc_cso[] = {'); print(', '.join(f'0x{b:02x}' for b in data)); print('};'); print(f'unsigned int _tmp_imgui_ps_fxc_cso_len = {len(data)};')" > imgui_ps_d3d12_fxc.h echo Done! ================================================ FILE: IGLU/imgui/compile_shaders.py ================================================ #!/usr/bin/env fbpython # Copyright (c) Meta Platforms, Inc. and affiliates. # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. """Compile D3D12 ImGui shaders""" import os import subprocess import sys FXC = r"C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64\fxc.exe" def compile_shader(shader_file, profile, output_cso): """Compile HLSL shader to CSO""" print(f"Compiling {shader_file}...") cmd = [FXC, "/T", profile, "/E", "main", "/Fo", output_cso, shader_file] result = subprocess.run(cmd, capture_output=True, text=True) if result.returncode != 0: print(f"ERROR: {result.stderr}") return False print(f" SUCCESS: {output_cso}") return True def cso_to_header(cso_file, header_file, var_name): """Convert CSO binary to C header""" print(f"Converting {cso_file} to {header_file}...") with open(cso_file, "rb") as f: data = f.read() with open(header_file, "w") as f: f.write(f"unsigned char {var_name}[] = {{\n") for i in range(0, len(data), 12): chunk = data[i : i + 12] hex_bytes = ", ".join(f"0x{b:02x}" for b in chunk) f.write(f" {hex_bytes},\n") f.write("};\n") f.write(f"unsigned int {var_name}_len = {len(data)};\n") print(f" SUCCESS: {header_file} ({len(data)} bytes)") def main(): os.chdir(os.path.dirname(os.path.abspath(__file__))) # Compile vertex shader if not compile_shader("imgui_vs_d3d12.hlsl", "vs_5_0", "imgui_vs_d3d12_fxc.cso"): return 1 # Compile pixel shader if not compile_shader("imgui_ps_d3d12.hlsl", "ps_5_0", "imgui_ps_d3d12_fxc.cso"): return 1 # Convert to headers cso_to_header( "imgui_vs_d3d12_fxc.cso", "imgui_vs_d3d12_fxc.h", "_tmp_imgui_vs_fxc_cso" ) cso_to_header( "imgui_ps_d3d12_fxc.cso", "imgui_ps_d3d12_fxc.h", "_tmp_imgui_ps_fxc_cso" ) print("\nAll shaders compiled successfully!") return 0 if __name__ == "__main__": sys.exit(main()) ================================================ FILE: IGLU/imgui/imgui_ps_d3d12.hlsl ================================================ struct PSInput { float4 position : SV_Position; float4 color : COLOR; float2 uv : TEXCOORD0; }; Texture2D tex : register(t0); SamplerState uSampler : register(s0); float4 main(PSInput input) : SV_Target { return input.color * tex.Sample(uSampler, input.uv); } ================================================ FILE: IGLU/imgui/imgui_ps_d3d12_fxc.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ unsigned char _tmp_imgui_ps_fxc_cso[] = { 0x44, 0x58, 0x42, 0x43, 0xc7, 0x1a, 0xe2, 0x1a, 0x98, 0xf2, 0xe6, 0x19, 0xb5, 0xee, 0x27, 0x5c, 0x23, 0xba, 0x44, 0xe8, 0x01, 0x00, 0x00, 0x00, 0xdc, 0x02, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x64, 0x01, 0x00, 0x00, 0x98, 0x01, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x52, 0x44, 0x45, 0x46, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, 0x52, 0x44, 0x31, 0x31, 0x3c, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x75, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x00, 0x74, 0x65, 0x78, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, 0x30, 0x2e, 0x31, 0x00, 0xab, 0xab, 0xab, 0x49, 0x53, 0x47, 0x4e, 0x6c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x53, 0x56, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0xab, 0x4f, 0x53, 0x47, 0x4e, 0x2c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x00, 0xab, 0xab, 0x53, 0x48, 0x45, 0x58, 0xa0, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x6a, 0x08, 0x00, 0x01, 0x5a, 0x00, 0x00, 0x03, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x18, 0x00, 0x04, 0x00, 0x70, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x62, 0x10, 0x00, 0x03, 0xf2, 0x10, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x62, 0x10, 0x00, 0x03, 0x32, 0x10, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x03, 0xf2, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x8b, 0xc2, 0x00, 0x00, 0x80, 0x43, 0x55, 0x15, 0x00, 0xf2, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x10, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x46, 0x7e, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x07, 0xf2, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0e, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x1e, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x53, 0x54, 0x41, 0x54, 0x94, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; unsigned int _tmp_imgui_ps_fxc_cso_len = 732; ================================================ FILE: IGLU/imgui/imgui_vs_d3d12.hlsl ================================================ cbuffer PushConstants : register(b2) { float4x4 projectionMatrix; }; struct VSInput { float2 position : POSITION; float2 uv : TEXCOORD0; float4 color : COLOR; }; struct PSInput { float4 position : SV_Position; float4 color : COLOR; float2 uv : TEXCOORD0; }; PSInput main(VSInput input) { PSInput output; output.position = mul(projectionMatrix, float4(input.position.xy, 0, 1)); output.color = input.color; output.uv = input.uv; return output; } ================================================ FILE: IGLU/imgui/imgui_vs_d3d12_fxc.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ unsigned char _tmp_imgui_vs_fxc_cso[] = { 0x44, 0x58, 0x42, 0x43, 0x88, 0x6b, 0x5b, 0xc2, 0xa4, 0x0d, 0x87, 0x32, 0x35, 0x37, 0x7f, 0xab, 0x1e, 0xce, 0x0b, 0xbf, 0x01, 0x00, 0x00, 0x00, 0xdc, 0x03, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x50, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x34, 0x02, 0x00, 0x00, 0x40, 0x03, 0x00, 0x00, 0x52, 0x44, 0x45, 0x46, 0x14, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x05, 0xfe, 0xff, 0x00, 0x01, 0x00, 0x00, 0xec, 0x00, 0x00, 0x00, 0x52, 0x44, 0x31, 0x31, 0x3c, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x50, 0x75, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x00, 0xab, 0xab, 0x5c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x00, 0xab, 0xab, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbd, 0x00, 0x00, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, 0x30, 0x2e, 0x31, 0x00, 0x49, 0x53, 0x47, 0x4e, 0x68, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x00, 0x4f, 0x53, 0x47, 0x4e, 0x6c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x0c, 0x00, 0x00, 0x53, 0x56, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0xab, 0x53, 0x48, 0x45, 0x58, 0x04, 0x01, 0x00, 0x00, 0x50, 0x00, 0x01, 0x00, 0x41, 0x00, 0x00, 0x00, 0x6a, 0x08, 0x00, 0x01, 0x59, 0x00, 0x00, 0x04, 0x46, 0x8e, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x03, 0x32, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x03, 0x32, 0x10, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x03, 0xf2, 0x10, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x04, 0xf2, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x03, 0xf2, 0x20, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x03, 0x32, 0x20, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x08, 0xf2, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x15, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x8e, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x0a, 0xf2, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x8e, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0e, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xf2, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0e, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x8e, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x05, 0xf2, 0x20, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x46, 0x1e, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x05, 0x32, 0x20, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x46, 0x10, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x53, 0x54, 0x41, 0x54, 0x94, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; unsigned int _tmp_imgui_vs_fxc_cso_len = 988; ================================================ FILE: IGLU/managedUniformBuffer/ManagedUniformBuffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #if defined(IGL_CMAKE_BUILD) #include #else #include #endif #if IGL_PLATFORM_APPLE #include #if IGL_PLATFORM_IOS_SIMULATOR #include #include #include #endif #endif namespace iglu { ManagedUniformBuffer::ManagedUniformBuffer(igl::IDevice& device, const ManagedUniformBufferInfo& info) : uniformInfo(info) { igl::BufferDesc desc; desc.length = info.length; if (!IGL_DEBUG_VERIFY(desc.length != 0)) { result.code = igl::Result::Code::ArgumentInvalid; return; } // Currently, the OpenGL code path always uses individual uniforms so no need to allocate a // buffer. bool createBuffer = device.getBackendType() != igl::BackendType::OpenGL; // Allocate memory if (device.getBackendType() == igl::BackendType::Metal) { #if IGL_PLATFORM_APPLE // Metal must be page aligned auto pageSize = getpagesize(); length_ = desc.length; const int roundVal = 16; // bindBytes requires specific alignment. Algin to 16b is a safe bet. length_ = ((length_ + roundVal - 1) / roundVal) * roundVal; useBindBytes_ = (length_ < pageSize); if (useBindBytes_) { data_ = malloc(length_); createBuffer = false; } else { auto pagesRequired = desc.length / pageSize; if (desc.length % pageSize != 0) { pagesRequired++; } desc.length = pagesRequired * pageSize; #if IGL_PLATFORM_IOS_SIMULATOR // The simulator will crash if we use memory created with posix_memalign, so we use this // per what documentation says here // https://developer.apple.com/documentation/metal/gpu_selection_in_macos/selecting_device_objects_for_compute_processing?language=objc#3544751 vmAllocLength_ = desc.length; kern_return_t err = vm_allocate( (vm_map_t)mach_task_self(), (vm_address_t*)&data_, vmAllocLength_, VM_FLAGS_ANYWHERE); if (err != KERN_SUCCESS) { data_ = nullptr; } #else auto failure = posix_memalign(&data_, pageSize, desc.length); if (failure) { data_ = nullptr; } #endif } #endif } else { data_ = malloc(desc.length); } if (data_ == nullptr) { result.code = igl::Result::Code::RuntimeError; return; } if (createBuffer) { desc.data = data_; desc.type = igl::BufferDesc::BufferTypeBits::Uniform; desc.storage = igl::ResourceStorage::Shared; if (device.hasFeature(igl::DeviceFeatures::BufferNoCopy)) { desc.type |= igl::BufferDesc::BufferAPIHintBits::NoCopy; } buffer_ = device.createBuffer(desc, &result); } } ManagedUniformBuffer::~ManagedUniformBuffer() { #if IGL_PLATFORM_IOS_SIMULATOR if (vmAllocLength_) { // if vmAllocLength_ is nonzero it implies we used vm_alloc to allocate the memory vm_deallocate((vm_map_t)mach_task_self(), (vm_address_t)data_, vmAllocLength_); } else { #endif free(data_); #if IGL_PLATFORM_IOS_SIMULATOR } #endif } void ManagedUniformBuffer::bind(const igl::IDevice& device, const igl::IRenderPipelineState& pipelineState, igl::IRenderCommandEncoder& encoder) { if (device.getBackendType() == igl::BackendType::OpenGL) { #if IGL_BACKEND_OPENGL && !IGL_PLATFORM_MACCATALYST for (auto& uniform : uniformInfo.uniforms) { // Since the backend is opengl, getIndexByName's igl::ShaderStage parameter is ignored and // will work when binding vertex/fragment // Might be optimized to use NameHandle uniform.location = pipelineState.getIndexByName(igl::genNameHandle(uniform.name), igl::ShaderStage::Fragment); if (uniform.location >= 0) { encoder.bindUniform(uniform, data_); } else { IGL_LOG_ERROR_ONCE("The uniform %s was not found in shader\n", uniform.name.c_str()); } } #else IGL_DEBUG_ABORT("Should not use OpenGL backend on Mac Catalyst, use Metal instead\n"); #endif } else { if (useBindBytes_) { encoder.bindBytes(uniformInfo.index, igl::BindTarget::kAllGraphics, data_, length_); } else { // Need to ensure the latest data is present in the buffer // TODO: Have callers handle this when data has changed. void* data = data_; if (buffer_->acceptedApiHints() & igl::BufferDesc::BufferAPIHintBits::NoCopy) { data = nullptr; } buffer_->upload(data, {buffer_->getSizeInBytes(), 0}); encoder.bindBuffer(uniformInfo.index, buffer_.get()); } } } void ManagedUniformBuffer::bind(const igl::IDevice& device, const igl::IComputePipelineState& pipelineState, igl::IComputeCommandEncoder& encoder) { if (device.getBackendType() == igl::BackendType::OpenGL) { for (auto& uniform : uniformInfo.uniforms) { uniform.location = pipelineState.getIndexByName(igl::genNameHandle(uniform.name)); if (uniform.location >= 0) { encoder.bindUniform(uniform, data_); } else { IGL_LOG_ERROR_ONCE("The uniform %s was not found in shader\n", uniform.name.c_str()); } } } else { if (useBindBytes_) { encoder.bindBytes(uniformInfo.index, data_, length_); } else { // Need to ensure the latest data is present in the buffer // TODO: Have callers handle this when data has changed. void* data = data_; if (buffer_->acceptedApiHints() & igl::BufferDesc::BufferAPIHintBits::NoCopy) { data = nullptr; } buffer_->upload(data, {buffer_->getSizeInBytes(), 0}); encoder.bindBuffer(static_cast(uniformInfo.index), buffer_.get()); } } } void* ManagedUniformBuffer::getData() { return data_; } void ManagedUniformBuffer::buildUniformLUT() { uniformLUT_ = std::make_unique>(); for (size_t i = 0; i < uniformInfo.uniforms.size(); ++i) { auto& uniform = uniformInfo.uniforms[i]; uniformLUT_->insert({uniform.name, i}); } } static int findUniformByName(const std::vector& uniforms, const char* name) { for (size_t i = 0; i < uniforms.size(); ++i) { if (strcmp(name, uniforms[i].name.c_str()) == 0) { return i; } } return -1; } int ManagedUniformBuffer::getIndex(const char* name) const { if (uniformLUT_) { auto search = uniformLUT_->find(name); return search != uniformLUT_->end() ? (int)search->second : -1; } else { return findUniformByName(uniformInfo.uniforms, name); } } bool ManagedUniformBuffer::updateData(const char* name, const void* data, size_t dataSize) { IGL_DEBUG_ASSERT(name); const int index = getIndex(name); if (index >= 0) { auto& uniform = uniformInfo.uniforms[index]; if (strcmp(name, uniform.name.c_str()) == 0) { // If dataSize is smaller than the expected size, we will just update as client requested. // This could mean the user knows only a portion of the uniform data needs updating // However, if dataSize is larger than or equal to what we expect for this uniform, we will // only copy data up to the expected data size for this uniform const size_t uniformDataSize = getUniformDataSizeInternal(uniform); if (dataSize > uniformDataSize) { dataSize = uniformDataSize; #if IGL_DEBUG IGL_LOG_INFO_ONCE( "IGLU/ManagedBufferBuffer/updateData: dataSize is larger than expected. This could be " "benign. See comments in updateData for more details. \n"); #endif } char* ptr = reinterpret_cast(data_); checked_memcpy(ptr + uniform.offset, uniformDataSize, data, dataSize); return true; } } #ifndef GTEST IGL_DEBUG_ABORT("call to updateData: uniform with name %s not found, skipping update\n", name); #endif return false; } size_t ManagedUniformBuffer::getUniformDataSize(const char* name) { for (auto& uniform : uniformInfo.uniforms) { if (strcmp(name, uniform.name.c_str()) == 0) { return getUniformDataSizeInternal(uniform); } } return 0; } // return the type of the uniform // return igl::UniformType::Invalid if name invalid igl::UniformType ManagedUniformBuffer::getUniformType(const char* name) const { auto index = findUniformByName(uniformInfo.uniforms, name); if (index != -1) { const auto& u = uniformInfo.uniforms.at(index); return u.type; } return igl::UniformType::Invalid; } size_t ManagedUniformBuffer::getUniformDataSizeInternal(igl::UniformDesc& uniform) { const size_t uniformDataSize = uniform.elementStride != 0 ? uniform.numElements * uniform.elementStride : uniform.numElements * igl::sizeForUniformType(uniform.type); return uniformDataSize; } } // namespace iglu ================================================ FILE: IGLU/managedUniformBuffer/ManagedUniformBuffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace iglu { struct ManagedUniformBufferInfo { int index = -1; size_t length = 0; std::vector uniforms; }; class ManagedUniformBuffer { public: igl::Result result; ManagedUniformBufferInfo uniformInfo; ManagedUniformBuffer(igl::IDevice& device, const ManagedUniformBufferInfo& info); ~ManagedUniformBuffer(); // This function takes a chunk of data and use it to update the value of uniform 'name' bool updateData(const char* name, const void* data, size_t dataSize); // This function returns the expected data size for uniform with given name // If uniform has type UniformType::Float3, this function will return // 3 * sizeof(float) if elementStride is zero and return elementStride otherwise // if no uniform with given name exists, the function will return 0 size_t getUniformDataSize(const char* name); // return the type of the uniform // return igl::UniformType::Invalid if name invalid igl::UniformType getUniformType(const char* name) const; void bind(const igl::IDevice& device, const igl::IRenderPipelineState& pipelineState, igl::IRenderCommandEncoder& encoder); void bind(const igl::IDevice& device, const igl::IComputePipelineState& pipelineState, igl::IComputeCommandEncoder& encoder); void* getData(); void buildUniformLUT(); int getIndex(const char* name) const; private: size_t getUniformDataSizeInternal(igl::UniformDesc& uniform); void* data_ = nullptr; int length_ = 0; std::shared_ptr buffer_ = nullptr; std::unique_ptr> uniformLUT_ = nullptr; #if IGL_PLATFORM_IOS_SIMULATOR /// If we're in the simulator we need to hold onto length so we can deallocate memory buffer /// properly. /// If this is non-zero implies that we used vm alloc to allocate the memory instead of malloc /// since we don't hold onto the device to be able to use in the destructor size_t vmAllocLength_ = 0; #endif bool useBindBytes_ = false; }; } // namespace iglu ================================================ FILE: IGLU/sentinel/Assert.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #define IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert) \ IGL_DEBUG_ASSERT(!(shouldAssert), "Sentinel implementation should NOT be reached") ================================================ FILE: IGLU/sentinel/Buffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @MARK:COVERAGE_EXCLUDE_FILE #include #include #include namespace iglu::sentinel { Buffer::Buffer(bool shouldAssert, size_t size) : size_(size), shouldAssert_(shouldAssert) {} igl::Result Buffer::upload(const void* IGL_NULLABLE /*data*/, const igl::BufferRange& /*range*/) { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return igl::Result(igl::Result::Code::Unimplemented, "Not Implemented"); } void* IGL_NULLABLE Buffer::map(const igl::BufferRange& /*range*/, igl::Result* IGL_NULLABLE /*outResult*/) { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return nullptr; } void Buffer::unmap() { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); } igl::BufferDesc::BufferAPIHint Buffer::requestedApiHints() const noexcept { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return 0; } igl::BufferDesc::BufferAPIHint Buffer::acceptedApiHints() const noexcept { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return 0; } igl::ResourceStorage Buffer::storage() const noexcept { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return igl::ResourceStorage::Invalid; } size_t Buffer::getSizeInBytes() const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return size_; } uint64_t Buffer::gpuAddress(size_t /*offset*/) const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return 0; } igl::BufferDesc::BufferType Buffer::getBufferType() const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return 0; } } // namespace iglu::sentinel ================================================ FILE: IGLU/sentinel/Buffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace iglu::sentinel { /** * Sentinel Buffer intended for safe use where access to a real buffer is not available. * Use cases include returning a reference to a buffer from a raw pointer when a valid buffer is not * available. * All methods return nullptr, the default value or an error. */ class Buffer : public igl::IBuffer { public: explicit Buffer(bool shouldAssert = true, size_t size = 0); [[nodiscard]] igl::Result upload(const void* IGL_NULLABLE data, const igl::BufferRange& range) final; void* IGL_NULLABLE map(const igl::BufferRange& range, igl::Result* IGL_NULLABLE outResult) final; void unmap() final; [[nodiscard]] igl::BufferDesc::BufferAPIHint requestedApiHints() const noexcept final; [[nodiscard]] igl::BufferDesc::BufferAPIHint acceptedApiHints() const noexcept final; [[nodiscard]] igl::ResourceStorage storage() const noexcept final; [[nodiscard]] size_t getSizeInBytes() const final; [[nodiscard]] uint64_t gpuAddress(size_t offset = 0) const final; [[nodiscard]] igl::BufferDesc::BufferType getBufferType() const final; private: size_t size_; [[maybe_unused]] bool shouldAssert_; }; } // namespace iglu::sentinel ================================================ FILE: IGLU/sentinel/CommandBuffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @MARK:COVERAGE_EXCLUDE_FILE #include #include #include namespace iglu::sentinel { CommandBuffer::CommandBuffer(bool shouldAssert) : igl::ICommandBuffer({.debugName = "SentinelCommandBuffer"}), shouldAssert_(shouldAssert) {} std::unique_ptr CommandBuffer::createRenderCommandEncoder( const igl::RenderPassDesc& /*renderPass*/, const std::shared_ptr& /*framebuffer*/, const igl::Dependencies& /*dependencies*/, igl::Result* IGL_NULLABLE /*outResult*/) { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return nullptr; } std::unique_ptr CommandBuffer::createComputeCommandEncoder() { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return nullptr; } void CommandBuffer::present(const std::shared_ptr& /*surface*/) const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); } void CommandBuffer::waitUntilScheduled() { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); } void CommandBuffer::waitUntilCompleted() { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); } void CommandBuffer::pushDebugGroupLabel(const char* /*label*/, const igl::Color& /*color*/) const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); } void CommandBuffer::popDebugGroupLabel() const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); } void CommandBuffer::copyBuffer(igl::IBuffer& src, igl::IBuffer& dst, uint64_t srcOffset, uint64_t dstOffset, uint64_t size) { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); } void CommandBuffer::copyTextureToBuffer(igl::ITexture& src, igl::IBuffer& dst, uint64_t dstOffset, uint32_t level, uint32_t layer) { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); } } // namespace iglu::sentinel ================================================ FILE: IGLU/sentinel/CommandBuffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace iglu::sentinel { /** * Sentinel CommandBuffer intended for safe use where access to a real command buffer is not * available. * Use cases include returning a reference to a command buffer from a raw pointer when a * valid command buffer is not available. * All methods return nullptr, the default value or an error. */ class CommandBuffer final : public igl::ICommandBuffer { public: explicit CommandBuffer(bool shouldAssert = true); [[nodiscard]] std::unique_ptr createRenderCommandEncoder( const igl::RenderPassDesc& /*renderPass*/, const std::shared_ptr& /*framebuffer*/, const igl::Dependencies& /*dependencies*/, igl::Result* IGL_NULLABLE /*outResult*/) final; [[nodiscard]] std::unique_ptr createComputeCommandEncoder() final; void present(const std::shared_ptr& /*surface*/) const final; void waitUntilScheduled() final; void waitUntilCompleted() final; void pushDebugGroupLabel(const char* IGL_NONNULL /*label*/, const igl::Color& /*color*/ = igl::Color(1, 1, 1, 1)) const final; void popDebugGroupLabel() const final; void copyBuffer(igl::IBuffer& src, igl::IBuffer& dst, uint64_t srcOffset, uint64_t dstOffset, uint64_t size) final; void copyTextureToBuffer(igl::ITexture& src, igl::IBuffer& dst, uint64_t dstOffset, uint32_t level, uint32_t layer) final; private: [[maybe_unused]] bool shouldAssert_; }; } // namespace iglu::sentinel ================================================ FILE: IGLU/sentinel/CommandQueue.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @MARK:COVERAGE_EXCLUDE_FILE #include #include namespace iglu::sentinel { CommandQueue::CommandQueue(bool shouldAssert) : shouldAssert_(shouldAssert) {} std::shared_ptr CommandQueue::createCommandBuffer( const igl::CommandBufferDesc& /*desc*/, igl::Result* IGL_NULLABLE /*outResult*/) { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return nullptr; } igl::SubmitHandle CommandQueue::submit(const igl::ICommandBuffer& /*commandBuffer*/, bool /*endOfFrame*/) { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return 0; } } // namespace iglu::sentinel ================================================ FILE: IGLU/sentinel/CommandQueue.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace iglu::sentinel { /** * Sentinel CommandQueue intended for safe use where access to a real command queue is not * available. * Use cases include returning a reference to a command queue from a raw pointer when a * valid command queue is not available. * All methods return nullptr, the default value or an error. */ class CommandQueue final : public igl::ICommandQueue { public: explicit CommandQueue(bool shouldAssert = true); [[nodiscard]] std::shared_ptr createCommandBuffer( const igl::CommandBufferDesc& desc, igl::Result* IGL_NULLABLE outResult) final; igl::SubmitHandle submit(const igl::ICommandBuffer& commandBuffer, bool endOfFrame = false) final; private: [[maybe_unused]] bool shouldAssert_; }; } // namespace iglu::sentinel ================================================ FILE: IGLU/sentinel/Device.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @MARK:COVERAGE_EXCLUDE_FILE #include #include #include #include namespace iglu::sentinel { Device::Device(bool shouldAssert) : platformDevice_(shouldAssert), shouldAssert_(shouldAssert) {} bool Device::hasFeature(igl::DeviceFeatures /*feature*/) const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return false; } bool Device::hasRequirement(igl::DeviceRequirement /*requirement*/) const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return false; } igl::ICapabilities::TextureFormatCapabilities Device::getTextureFormatCapabilities( igl::TextureFormat /*format*/) const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return TextureFormatCapabilityBits::Unsupported; } bool Device::getFeatureLimits(igl::DeviceFeatureLimits /*featureLimits*/, size_t& /*result*/) const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return false; } igl::ShaderVersion Device::getShaderVersion() const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return {}; } igl::BackendVersion Device::getBackendVersion() const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return {}; } std::shared_ptr Device::createCommandQueue( const igl::CommandQueueDesc& /*desc*/, igl::Result* IGL_NULLABLE /*outResult*/) noexcept { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return nullptr; } std::unique_ptr Device::createBuffer( const igl::BufferDesc& /*desc*/, igl::Result* IGL_NULLABLE /*outResult*/) const noexcept { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return nullptr; } std::shared_ptr Device::createDepthStencilState( const igl::DepthStencilStateDesc& /*desc*/, igl::Result* IGL_NULLABLE /*outResult*/) const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return nullptr; } std::shared_ptr Device::createSamplerState( const igl::SamplerStateDesc& /*desc*/, igl::Result* IGL_NULLABLE /*outResult*/) const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return nullptr; } std::shared_ptr Device::createTexture(const igl::TextureDesc& /*desc*/, igl::Result* IGL_NULLABLE /*outResult*/) const noexcept { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return nullptr; } std::shared_ptr Device::createTextureView( std::shared_ptr texture, const igl::TextureViewDesc& desc, igl::Result* IGL_NULLABLE /*outResult*/) const noexcept { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return nullptr; } std::shared_ptr Device::createVertexInputState( const igl::VertexInputStateDesc& /*desc*/, igl::Result* IGL_NULLABLE /*outResult*/) const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return nullptr; } std::shared_ptr Device::createComputePipeline( const igl::ComputePipelineDesc& /*desc*/, igl::Result* IGL_NULLABLE /*outResult*/) const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return nullptr; } std::shared_ptr Device::createRenderPipeline( const igl::RenderPipelineDesc& /*desc*/, igl::Result* IGL_NULLABLE /*outResult*/) const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return nullptr; } std::shared_ptr Device::createShaderModule( const igl::ShaderModuleDesc& /*desc*/, igl::Result* IGL_NULLABLE /*outResult*/) const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return nullptr; } std::shared_ptr Device::createFramebuffer( const igl::FramebufferDesc& /*desc*/, igl::Result* IGL_NULLABLE /*outResult*/) { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return nullptr; } const igl::IPlatformDevice& Device::getPlatformDevice() const noexcept { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return platformDevice_; } bool Device::verifyScope() { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return false; } igl::BackendType Device::getBackendType() const { return igl::BackendType::Invalid; } size_t Device::getCurrentDrawCount() const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return 0; } size_t Device::getShaderCompilationCount() const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return 0; } std::unique_ptr Device::createShaderLibrary( const igl::ShaderLibraryDesc& /*desc*/, igl::Result* IGL_NULLABLE /*outResult*/) const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return nullptr; } void Device::updateSurface(void* IGL_NONNULL /*nativeWindowType*/) {} std::unique_ptr Device::createShaderStages( const igl::ShaderStagesDesc& /*desc*/, igl::Result* IGL_NULLABLE /*outResult*/) const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return nullptr; } igl::Holder Device::createBindGroup( const igl::BindGroupTextureDesc& /*desc*/, const igl::IRenderPipelineState* IGL_NULLABLE /*compatiblePipeline*/, igl::Result* IGL_NULLABLE /*outResult*/) { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return {}; } igl::Holder Device::createBindGroup( const igl::BindGroupBufferDesc& /*desc*/, igl::Result* IGL_NULLABLE /*outResult*/) { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return {}; } std::shared_ptr Device::createTimer( igl::Result* IGL_NULLABLE /*outResult*/) const noexcept { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return {}; } void Device::destroy(igl::BindGroupTextureHandle /*handle*/) { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); } void Device::destroy(igl::BindGroupBufferHandle /*handle*/) { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); } void Device::destroy(igl::SamplerHandle /*handle*/) { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); } } // namespace iglu::sentinel ================================================ FILE: IGLU/sentinel/Device.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace iglu::sentinel { /** * Sentinel Device intended for safe use where access to a real device is not available. * Use cases include returning a reference to a device from a raw pointer when a valid device is not * available. * All methods return nullptr, the default value or an error. */ class Device final : public igl::IDevice { public: explicit Device(bool shouldAssert = true); [[nodiscard]] igl::Holder createBindGroup( const igl::BindGroupTextureDesc& desc, const igl::IRenderPipelineState* IGL_NULLABLE compatiblePipeline, igl::Result* IGL_NULLABLE outResult) final; [[nodiscard]] igl::Holder createBindGroup( const igl::BindGroupBufferDesc& desc, igl::Result* IGL_NULLABLE outResult) final; void destroy(igl::BindGroupTextureHandle handle) final; void destroy(igl::BindGroupBufferHandle handle) final; void destroy(igl::SamplerHandle handle) final; [[nodiscard]] bool hasFeature(igl::DeviceFeatures feature) const final; [[nodiscard]] bool hasRequirement(igl::DeviceRequirement requirement) const final; [[nodiscard]] TextureFormatCapabilities getTextureFormatCapabilities( igl::TextureFormat format) const final; [[nodiscard]] bool getFeatureLimits(igl::DeviceFeatureLimits featureLimits, size_t& result) const final; [[nodiscard]] igl::ShaderVersion getShaderVersion() const final; [[nodiscard]] igl::BackendVersion getBackendVersion() const final; [[nodiscard]] std::shared_ptr createCommandQueue( const igl::CommandQueueDesc& desc, igl::Result* IGL_NULLABLE outResult) noexcept final; [[nodiscard]] std::unique_ptr createBuffer(const igl::BufferDesc& desc, igl::Result* IGL_NULLABLE outResult) const noexcept final; [[nodiscard]] std::shared_ptr createDepthStencilState( const igl::DepthStencilStateDesc& desc, igl::Result* IGL_NULLABLE outResult) const final; [[nodiscard]] std::shared_ptr createSamplerState( const igl::SamplerStateDesc& desc, igl::Result* IGL_NULLABLE outResult) const final; [[nodiscard]] std::shared_ptr createTexture(const igl::TextureDesc& desc, igl::Result* IGL_NULLABLE outResult) const noexcept final; [[nodiscard]] std::shared_ptr createTextureView( std::shared_ptr texture, const igl::TextureViewDesc& desc, igl::Result* IGL_NULLABLE outResult) const noexcept final; [[nodiscard]] std::shared_ptr createVertexInputState( const igl::VertexInputStateDesc& desc, igl::Result* IGL_NULLABLE outResult) const final; [[nodiscard]] std::shared_ptr createComputePipeline( const igl::ComputePipelineDesc& desc, igl::Result* IGL_NULLABLE outResult) const final; [[nodiscard]] std::shared_ptr createRenderPipeline( const igl::RenderPipelineDesc& desc, igl::Result* IGL_NULLABLE outResult) const final; [[nodiscard]] std::shared_ptr createShaderModule( const igl::ShaderModuleDesc& desc, igl::Result* IGL_NULLABLE outResult) const final; [[nodiscard]] std::shared_ptr createFramebuffer( const igl::FramebufferDesc& desc, igl::Result* IGL_NULLABLE outResult) final; [[nodiscard]] std::shared_ptr createTimer( igl::Result* IGL_NULLABLE outResult) const noexcept final; [[nodiscard]] const igl::IPlatformDevice& getPlatformDevice() const noexcept final; [[nodiscard]] bool verifyScope() final; [[nodiscard]] igl::BackendType getBackendType() const final; [[nodiscard]] size_t getCurrentDrawCount() const final; [[nodiscard]] size_t getShaderCompilationCount() const final; [[nodiscard]] std::unique_ptr createShaderLibrary( const igl::ShaderLibraryDesc& desc, igl::Result* IGL_NULLABLE outResult) const final; void updateSurface(void* IGL_NONNULL nativeWindowType) final; [[nodiscard]] std::unique_ptr createShaderStages( const igl::ShaderStagesDesc& desc, igl::Result* IGL_NULLABLE outResult) const final; [[nodiscard]] void* IGL_NULLABLE getNativeDevice() const override { return nullptr; } private: PlatformDevice platformDevice_; [[maybe_unused]] bool shouldAssert_; }; } // namespace iglu::sentinel ================================================ FILE: IGLU/sentinel/Framebuffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @MARK:COVERAGE_EXCLUDE_FILE #include #include namespace iglu::sentinel { Framebuffer::Framebuffer(bool shouldAssert) : shouldAssert_(shouldAssert) {} std::vector Framebuffer::getColorAttachmentIndices() const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return {}; } std::shared_ptr Framebuffer::getColorAttachment(size_t /*index*/) const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return nullptr; } std::shared_ptr Framebuffer::getResolveColorAttachment(size_t /*index*/) const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return nullptr; } std::shared_ptr Framebuffer::getDepthAttachment() const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return nullptr; } std::shared_ptr Framebuffer::getResolveDepthAttachment() const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return nullptr; } std::shared_ptr Framebuffer::getStencilAttachment() const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return nullptr; } igl::FramebufferMode Framebuffer::getMode() const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return igl::FramebufferMode::Mono; } bool Framebuffer::isSwapchainBound() const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return false; } void Framebuffer::copyBytesColorAttachment(igl::ICommandQueue& /*cmdQueue*/, size_t /*index*/, void* /*pixelBytes*/, const igl::TextureRangeDesc& /*range*/, size_t /*bytesPerRow*/) const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); } void Framebuffer::copyBytesDepthAttachment(igl::ICommandQueue& /*cmdQueue*/, void* /*pixelBytes*/, const igl::TextureRangeDesc& /*range*/, size_t /*bytesPerRow*/) const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); } void Framebuffer::copyBytesStencilAttachment(igl::ICommandQueue& /*cmdQueue*/, void* /*pixelBytes*/, const igl::TextureRangeDesc& /*range*/, size_t /*bytesPerRow*/) const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); } void Framebuffer::copyTextureColorAttachment(igl::ICommandQueue& /*cmdQueue*/, size_t /*index*/, std::shared_ptr /*destTexture*/, const igl::TextureRangeDesc& /*range*/) const { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); } void Framebuffer::updateDrawable(std::shared_ptr /*texture*/) { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); } void Framebuffer::updateDrawable(igl::SurfaceTextures /*surfaceTextures*/) { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); } void Framebuffer::updateResolveAttachment(std::shared_ptr /*texture*/) { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); } } // namespace iglu::sentinel ================================================ FILE: IGLU/sentinel/Framebuffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace iglu::sentinel { /** * Sentinel Frambuffer intended for safe use where access to a real framebuffer is not available. * Use cases include returning a reference to a framebuffer from a raw pointer when a * valid framebuffer is not available. * All methods return nullptr, the default value or an error. */ class Framebuffer : public igl::IFramebuffer { public: explicit Framebuffer(bool shouldAssert = true); [[nodiscard]] std::vector getColorAttachmentIndices() const final; [[nodiscard]] std::shared_ptr getColorAttachment(size_t index) const final; [[nodiscard]] std::shared_ptr getResolveColorAttachment(size_t index) const final; [[nodiscard]] std::shared_ptr getDepthAttachment() const final; [[nodiscard]] std::shared_ptr getResolveDepthAttachment() const final; [[nodiscard]] std::shared_ptr getStencilAttachment() const final; [[nodiscard]] igl::FramebufferMode getMode() const final; [[nodiscard]] bool isSwapchainBound() const final; void copyBytesColorAttachment(igl::ICommandQueue& cmdQueue, size_t index, void* pixelBytes, const igl::TextureRangeDesc& range, size_t bytesPerRow = 0) const final; void copyBytesDepthAttachment(igl::ICommandQueue& cmdQueue, void* pixelBytes, const igl::TextureRangeDesc& range, size_t bytesPerRow = 0) const final; void copyBytesStencilAttachment(igl::ICommandQueue& cmdQueue, void* pixelBytes, const igl::TextureRangeDesc& range, size_t bytesPerRow = 0) const final; void copyTextureColorAttachment(igl::ICommandQueue& cmdQueue, size_t index, std::shared_ptr destTexture, const igl::TextureRangeDesc& range) const final; void updateDrawable(std::shared_ptr texture) final; void updateDrawable(igl::SurfaceTextures surfaceTextures) final; void updateResolveAttachment(std::shared_ptr texture) final; private: [[maybe_unused]] bool shouldAssert_; }; } // namespace iglu::sentinel ================================================ FILE: IGLU/sentinel/PlatformDevice.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @MARK:COVERAGE_EXCLUDE_FILE #include #include namespace iglu::sentinel { PlatformDevice::PlatformDevice(bool shouldAssert) : shouldAssert_(shouldAssert) {} bool PlatformDevice::isType(igl::PlatformDeviceType /*t*/) const noexcept { IGLU_SENTINEL_ASSERT_IF_NOT(shouldAssert_); return false; } } // namespace iglu::sentinel ================================================ FILE: IGLU/sentinel/PlatformDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace iglu::sentinel { /** * Sentinel PlatformDevice intended for safe use where access to a real platform device is not * available. * Use cases include returning a reference to a platform device from a raw pointer when a * valid platform device is not available. * All methods return nullptr, the default value or an error. */ class PlatformDevice final : public igl::IPlatformDevice { public: explicit PlatformDevice(bool shouldAssert = true); [[nodiscard]] bool isType(igl::PlatformDeviceType t) const noexcept final; private: [[maybe_unused]] bool shouldAssert_; }; } // namespace iglu::sentinel ================================================ FILE: IGLU/shaderCross/ShaderCross.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include namespace iglu { ShaderCross::ShaderCross(igl::IDevice& device) noexcept : device_(device) { igl::glslang::initializeCompiler(); } ShaderCross::~ShaderCross() noexcept { igl::glslang::finalizeCompiler(); } std::string ShaderCross::entryPointName(igl::ShaderStage /*stage*/) const noexcept { if (device_.getBackendType() == igl::BackendType::Metal) { return "main0"; } if (device_.getBackendType() == igl::BackendType::OpenGL) { return "main"; } return {}; } std::string ShaderCross::crossCompileFromVulkanSource(const char* source, igl::ShaderStage stage, igl::Result* IGL_NULLABLE outResult) const noexcept { if (device_.getBackendType() == igl::BackendType::Vulkan) { return source; } // Compile to SPIR-V. std::vector spirvCode; glslang_resource_t resource{}; glslangGetDefaultResource(&resource); const auto result = igl::glslang::compileShader(stage, source, spirvCode, &resource); if (!result.isOk()) { if (outResult) { *outResult = result; } return {}; } // Cross-compile to MSL. if (device_.getBackendType() == igl::BackendType::Metal) { spirv_cross::CompilerMSL mslCompiler(std::move(spirvCode)); spirv_cross::CompilerMSL::Options options; #if IGL_PLATFORM_MACOSX options.platform = spirv_cross::CompilerMSL::Options::macOS; #else options.platform = spirv_cross::CompilerMSL::Options::iOS; #endif options.set_msl_version(2, 2); options.enable_decoration_binding = true; mslCompiler.set_msl_options(options); try { return mslCompiler.compile(); } catch (const spirv_cross::CompilerError& e) { if (outResult) { *outResult = igl::Result(igl::Result::Code::RuntimeError, e.what()); } return {}; } } // Cross-compile to GLSL. if (device_.getBackendType() == igl::BackendType::OpenGL) { const auto shaderVersion = device_.getShaderVersion(); spirv_cross::CompilerGLSL glslCompiler(std::move(spirvCode)); spirv_cross::CompilerGLSL::Options options; options.version = static_cast(shaderVersion.majorVersion * 100) + shaderVersion.minorVersion; options.es = (shaderVersion.family == igl::ShaderFamily::GlslEs); options.emit_push_constant_as_uniform_buffer = true; options.emit_uniform_buffer_as_plain_uniforms = true; options.enable_420pack_extension = device_.hasFeature(igl::DeviceFeatures::ExplicitBindingExt); // In multiview mode in IGL, 2 views are always used. const auto& exts = glslCompiler.get_declared_extensions(); const auto& caps = glslCompiler.get_declared_capabilities(); if (stage == igl::ShaderStage::Vertex && (std::any_of(std::begin(exts), std::end(exts), [](const std::string& ext) { return ext == "GL_OVR_multiview2"; }) || std::any_of(std::begin(caps), std::end(caps), [](const spv::Capability cap) { return cap == spv::Capability::CapabilityMultiView; }))) { options.ovr_multiview_view_count = 2; } glslCompiler.set_common_options(options); try { return glslCompiler.compile(); } catch (const spirv_cross::CompilerError& e) { if (outResult) { *outResult = igl::Result(igl::Result::Code::RuntimeError, e.what()); } return {}; } } if (outResult) { *outResult = igl::Result(igl::Result::Code::Unimplemented, "Cross-compilation is not implemented."); } return {}; } } // namespace iglu ================================================ FILE: IGLU/shaderCross/ShaderCross.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace iglu { /// Wrapper for SPIR-V cross compiler to generate IGL-compatible shader sources for different /// backends. class ShaderCross final { public: explicit ShaderCross(igl::IDevice& device) noexcept; ~ShaderCross() noexcept; ShaderCross(const ShaderCross&) = delete; ShaderCross& operator=(const ShaderCross&) = delete; ShaderCross(ShaderCross&&) = delete; ShaderCross& operator=(ShaderCross&&) = delete; [[nodiscard]] std::string entryPointName(igl::ShaderStage stage) const noexcept; [[nodiscard]] std::string crossCompileFromVulkanSource(const char* source, igl::ShaderStage stage, igl::Result* IGL_NULLABLE outResult) const noexcept; private: igl::IDevice& device_; }; } // namespace iglu ================================================ FILE: IGLU/shaderCross/ShaderCrossUniformBuffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include namespace iglu { namespace { [[nodiscard]] ManagedUniformBufferInfo getSpirvCrossCompatibleManagedUniformBufferInfo( const std::string& uboBlockName, ManagedUniformBufferInfo info) noexcept { for (auto& uniform : info.uniforms) { uniform.name = uboBlockName + "." + uniform.name; } return info; } } // namespace ShaderCrossUniformBuffer::ShaderCrossUniformBuffer(igl::IDevice& device, const std::string& uboBlockName, ManagedUniformBufferInfo info) : ManagedUniformBuffer( device, getSpirvCrossCompatibleManagedUniformBufferInfo(uboBlockName, std::move(info))) {} } // namespace iglu ================================================ FILE: IGLU/shaderCross/ShaderCrossUniformBuffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace iglu { /// Extension for ManagedUniformBuffer that enables OpenGL bindings in the form /// they implemented in SPIRV-Cross (UBOs are converted to plain uniforms). class ShaderCrossUniformBuffer : public ManagedUniformBuffer { public: ShaderCrossUniformBuffer(igl::IDevice& device, const std::string& uboBlockName, ManagedUniformBufferInfo info); }; } // namespace iglu ================================================ FILE: IGLU/simdtypes/SimdTypes.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include // This would use IGL defines, but we can avoid importing all of IGL by doing this #if defined(__APPLE__) #include #endif // defined(__APPLE__) /// Polyfill to make it so we don't have to have ifdefs in code namespace iglu::simdtypes { // Use Apple-provided simd if available. #if defined(__APPLE__) using float4x4 = simd::float4x4; using float3x3 = simd::float3x3; using float3x4 = simd::float3x4; using float2x2 = simd::float2x2; using float4 = simd::float4; using float3 = simd::float3; using float2 = simd::float2; using float1 = simd::float1; using int1 = simd::int1; using int2 = simd::int2; using int3 = simd::int3; using int4 = simd::int4; using bool1 = simd_bool; #else // Apple simd is not available, make use custom. #if defined(__clang__) using float4 = float __attribute__((ext_vector_type(4))); // simd/vector_types.h // Vectors of this type are padded to have the same size and alignment as simd_float4. using float3 = float __attribute__((ext_vector_type(4))); using float2 = float __attribute__((ext_vector_type(2))); using float1 = float; using int1 = int; using int2 = int __attribute__((ext_vector_type(2))); // Vectors of this type are padded to have the same size and alignment as simd_float4. using int3 = int __attribute__((ext_vector_type(4))); using int4 = int __attribute__((ext_vector_type(4))); using bool1 = bool; #elif defined(__GNUC__) using float4 = float __attribute__((vector_size(sizeof(float) * 4))); // simd/vector_types.h // Vectors of this type are padded to have the same size and alignment as simd_float4. using float3 = float __attribute__((vector_size(sizeof(float) * 4))); using float2 = float __attribute__((vector_size(sizeof(float) * 2))); using float1 = float; using int1 = int; using int2 = int __attribute__((vector_size(sizeof(float) * 2))); // Vectors of this type are padded to have the same size and alignment as simd_float4. using int3 = int __attribute__((vector_size(sizeof(int) * 4))); using int4 = int __attribute__((vector_size(sizeof(float) * 4))); using bool1 = bool; #else // Not available clang or GCC vector extensions - create custom structs struct float4 final { float x; float y; float z; float w; float operator[](const unsigned index) const { assert(index < 4); return (&x)[index]; } float& operator[](const unsigned index) { assert(index < 4); return (&x)[index]; } }; static_assert(sizeof(float4) == 4 * sizeof(float)); // simd/vector_types.h // Vectors of this type are padded to have the same size and alignment as simd_float4. using float3 = float4; struct float2 final { float x; float y; float operator[](const unsigned index) const { assert(index < 2); return (&x)[index]; } float& operator[](const unsigned index) { assert(index < 2); return (&x)[index]; } }; static_assert(sizeof(float2) == 2 * sizeof(float)); using float1 = float; struct int4 final { int x; int y; int z; int w; int operator[](const unsigned index) const { assert(index < 4); return (&x)[index]; } int& operator[](const unsigned index) { assert(index < 4); return (&x)[index]; } }; static_assert(sizeof(int4) == 4 * sizeof(int)); // Vectors of this type are padded to have the same size and alignment as simd_int4. using int3 = int4; struct int2 final { int x; int y; int operator[](const unsigned index) const { assert(index < 2); return (&x)[index]; } int& operator[](const unsigned index) { assert(index < 2); return (&x)[index]; } }; static_assert(sizeof(int2) == 2 * sizeof(int)); using int1 = int; using bool1 = bool; #endif struct Float4x4 { float4 columns[4]; Float4x4() = default; explicit Float4x4(float val) { columns[0] = float4{val, 0.0, 0.0, 0.0}; columns[1] = float4{0.0, val, 0.0, 0.0}; columns[2] = float4{0.0, 0.0, val, 0.0}; columns[3] = float4{0.0, 0.0, 0.0, val}; } explicit Float4x4(float4 diag) { columns[0] = float4{diag[0], 0.0, 0.0, 0.0}; columns[1] = float4{0.0, diag[1], 0.0, 0.0}; columns[2] = float4{0.0, 0.0, diag[2], 0.0}; columns[3] = float4{0.0, 0.0, 0.0, diag[3]}; } Float4x4(float4 c0, float4 c1, float4 c2, float4 c3) { columns[0] = c0; columns[1] = c1; columns[2] = c2; columns[3] = c3; } // TODO BE remove this float* explicit Float4x4(const float* vals) { columns[0] = float4{vals[0], vals[1], vals[2], vals[3]}; columns[1] = float4{vals[4], vals[5], vals[6], vals[7]}; columns[2] = float4{vals[8], vals[9], vals[10], vals[11]}; columns[3] = float4{vals[12], vals[13], vals[14], vals[15]}; } }; struct Float3x4 { float4 columns[3]; Float3x4() = default; explicit Float3x4(float val) { columns[0] = float4{val, 0.0, 0.0, 0.0}; columns[1] = float4{0.0, val, 0.0, 0.0}; columns[2] = float4{0.0, 0.0, val, 0.0}; } explicit Float3x4(float3 diag) { columns[0] = float4{diag[0], 0.0, 0.0, 0.0}; columns[1] = float4{0.0, diag[1], 0.0, 0.0}; columns[2] = float4{0.0, 0.0, diag[2], 0.0}; } Float3x4(float4 c0, float4 c1, float4 c2) { columns[0] = c0; columns[1] = c1; columns[2] = c2; } // TODO BE remove this float* explicit Float3x4(const float* vals) { columns[0] = float4{vals[0], vals[1], vals[2], vals[3]}; columns[1] = float4{vals[4], vals[5], vals[6], vals[7]}; columns[2] = float4{vals[8], vals[9], vals[10], vals[11]}; } }; struct Float3x3 { float3 columns[3]; Float3x3() = default; explicit Float3x3(float val) { columns[0] = float3{val, 0.0, 0.0}; columns[1] = float3{0.0, val, 0.0}; columns[2] = float3{0.0, 0.0, val}; } explicit Float3x3(float3 diag) { columns[0] = float3{diag[0], 0.0, 0.0}; columns[1] = float3{0.0, diag[1], 0.0}; columns[2] = float3{0.0, 0.0, diag[2]}; } Float3x3(float3 c0, float3 c1, float3 c2) { columns[0] = c0; columns[1] = c1; columns[2] = c2; } }; struct Float2x2 { float2 columns[2]; Float2x2() = default; explicit Float2x2(float val) { columns[0] = float2{val, 0.0}; columns[1] = float2{0.0, val}; } explicit Float2x2(float2 diag) { columns[0] = float2{diag[0], 0.0}; columns[1] = float2{0.0, diag[1]}; } Float2x2(float2 c0, float2 c1) { columns[0] = c0; columns[1] = c1; } }; using float4x4 = Float4x4; using float3x4 = Float3x4; using float3x3 = Float3x3; using float2x2 = Float2x2; #endif // defined(__APPLE__) } // namespace iglu::simdtypes ================================================ FILE: IGLU/simdtypes/SimdUtilities.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace iglu::simdtypes { #if defined(__APPLE__) inline float1 clamp(float1 x, float1 min, float1 max) { return simd_clamp(x, min, max); } inline float1 fract(float1 x) { return simd_fract(x); } inline float4x4 inverse(const float4x4& m) { return simd_inverse(m); } // result = m * v; inline float4 multiply(const float4x4& m, const float4& v) { return simd_mul(m, v); } // result = m1 * m2 inline float4x4 multiply(const float4x4& m1, const float4x4& m2) { return simd_mul(m1, m2); } #else inline float1 clamp(float1 x, float1 min, float1 max) { if (x < min) { return min; } if (x > max) { return max; } return x; } inline float1 fract(float1 x) { return x - floor(x); } inline float4x4 inverse(const float4x4& m) { float4x4 result{}; result.columns[0][0] = m.columns[1][1] * m.columns[2][2] * m.columns[3][3] - m.columns[1][1] * m.columns[2][3] * m.columns[3][2] - m.columns[2][1] * m.columns[1][2] * m.columns[3][3] + m.columns[2][1] * m.columns[1][3] * m.columns[3][2] + m.columns[3][1] * m.columns[1][2] * m.columns[2][3] - m.columns[3][1] * m.columns[1][3] * m.columns[2][2]; result.columns[1][0] = -m.columns[1][0] * m.columns[2][2] * m.columns[3][3] + m.columns[1][0] * m.columns[2][3] * m.columns[3][2] + m.columns[2][0] * m.columns[1][2] * m.columns[3][3] - m.columns[2][0] * m.columns[1][3] * m.columns[3][2] - m.columns[3][0] * m.columns[1][2] * m.columns[2][3] + m.columns[3][0] * m.columns[1][3] * m.columns[2][2]; result.columns[2][0] = m.columns[1][0] * m.columns[2][1] * m.columns[3][3] - m.columns[1][0] * m.columns[2][3] * m.columns[3][1] - m.columns[2][0] * m.columns[1][1] * m.columns[3][3] + m.columns[2][0] * m.columns[1][3] * m.columns[3][1] + m.columns[3][0] * m.columns[1][1] * m.columns[2][3] - m.columns[3][0] * m.columns[1][3] * m.columns[2][1]; result.columns[3][0] = -m.columns[1][0] * m.columns[2][1] * m.columns[3][2] + m.columns[1][0] * m.columns[2][2] * m.columns[3][1] + m.columns[2][0] * m.columns[1][1] * m.columns[3][2] - m.columns[2][0] * m.columns[1][2] * m.columns[3][1] - m.columns[3][0] * m.columns[1][1] * m.columns[2][2] + m.columns[3][0] * m.columns[1][2] * m.columns[2][1]; result.columns[0][1] = -m.columns[0][1] * m.columns[2][2] * m.columns[3][3] + m.columns[0][1] * m.columns[2][3] * m.columns[3][2] + m.columns[2][1] * m.columns[0][2] * m.columns[3][3] - m.columns[2][1] * m.columns[0][3] * m.columns[3][2] - m.columns[3][1] * m.columns[0][2] * m.columns[2][3] + m.columns[3][1] * m.columns[0][3] * m.columns[2][2]; result.columns[1][1] = m.columns[0][0] * m.columns[2][2] * m.columns[3][3] - m.columns[0][0] * m.columns[2][3] * m.columns[3][2] - m.columns[2][0] * m.columns[0][2] * m.columns[3][3] + m.columns[2][0] * m.columns[0][3] * m.columns[3][2] + m.columns[3][0] * m.columns[0][2] * m.columns[2][3] - m.columns[3][0] * m.columns[0][3] * m.columns[2][2]; result.columns[2][1] = -m.columns[0][0] * m.columns[2][1] * m.columns[3][3] + m.columns[0][0] * m.columns[2][3] * m.columns[3][1] + m.columns[2][0] * m.columns[0][1] * m.columns[3][3] - m.columns[2][0] * m.columns[0][3] * m.columns[3][1] - m.columns[3][0] * m.columns[0][1] * m.columns[2][3] + m.columns[3][0] * m.columns[0][3] * m.columns[2][1]; result.columns[3][1] = m.columns[0][0] * m.columns[2][1] * m.columns[3][2] - m.columns[0][0] * m.columns[2][2] * m.columns[3][1] - m.columns[2][0] * m.columns[0][1] * m.columns[3][2] + m.columns[2][0] * m.columns[0][2] * m.columns[3][1] + m.columns[3][0] * m.columns[0][1] * m.columns[2][2] - m.columns[3][0] * m.columns[0][2] * m.columns[2][1]; result.columns[0][2] = m.columns[0][1] * m.columns[1][2] * m.columns[3][3] - m.columns[0][1] * m.columns[1][3] * m.columns[3][2] - m.columns[1][1] * m.columns[0][2] * m.columns[3][3] + m.columns[1][1] * m.columns[0][3] * m.columns[3][2] + m.columns[3][1] * m.columns[0][2] * m.columns[1][3] - m.columns[3][1] * m.columns[0][3] * m.columns[1][2]; result.columns[1][2] = -m.columns[0][0] * m.columns[1][2] * m.columns[3][3] + m.columns[0][0] * m.columns[1][3] * m.columns[3][2] + m.columns[1][0] * m.columns[0][2] * m.columns[3][3] - m.columns[1][0] * m.columns[0][3] * m.columns[3][2] - m.columns[3][0] * m.columns[0][2] * m.columns[1][3] + m.columns[3][0] * m.columns[0][3] * m.columns[1][2]; result.columns[2][2] = m.columns[0][0] * m.columns[1][1] * m.columns[3][3] - m.columns[0][0] * m.columns[1][3] * m.columns[3][1] - m.columns[1][0] * m.columns[0][1] * m.columns[3][3] + m.columns[1][0] * m.columns[0][3] * m.columns[3][1] + m.columns[3][0] * m.columns[0][1] * m.columns[1][3] - m.columns[3][0] * m.columns[0][3] * m.columns[1][1]; result.columns[3][2] = -m.columns[0][0] * m.columns[1][1] * m.columns[3][2] + m.columns[0][0] * m.columns[1][2] * m.columns[3][1] + m.columns[1][0] * m.columns[0][1] * m.columns[3][2] - m.columns[1][0] * m.columns[0][2] * m.columns[3][1] - m.columns[3][0] * m.columns[0][1] * m.columns[1][2] + m.columns[3][0] * m.columns[0][2] * m.columns[1][1]; result.columns[0][3] = -m.columns[0][1] * m.columns[1][2] * m.columns[2][3] + m.columns[0][1] * m.columns[1][3] * m.columns[2][2] + m.columns[1][1] * m.columns[0][2] * m.columns[2][3] - m.columns[1][1] * m.columns[0][3] * m.columns[2][2] - m.columns[2][1] * m.columns[0][2] * m.columns[1][3] + m.columns[2][1] * m.columns[0][3] * m.columns[1][2]; result.columns[1][3] = m.columns[0][0] * m.columns[1][2] * m.columns[2][3] - m.columns[0][0] * m.columns[1][3] * m.columns[2][2] - m.columns[1][0] * m.columns[0][2] * m.columns[2][3] + m.columns[1][0] * m.columns[0][3] * m.columns[2][2] + m.columns[2][0] * m.columns[0][2] * m.columns[1][3] - m.columns[2][0] * m.columns[0][3] * m.columns[1][2]; result.columns[2][3] = -m.columns[0][0] * m.columns[1][1] * m.columns[2][3] + m.columns[0][0] * m.columns[1][3] * m.columns[2][1] + m.columns[1][0] * m.columns[0][1] * m.columns[2][3] - m.columns[1][0] * m.columns[0][3] * m.columns[2][1] - m.columns[2][0] * m.columns[0][1] * m.columns[1][3] + m.columns[2][0] * m.columns[0][3] * m.columns[1][1]; result.columns[3][3] = m.columns[0][0] * m.columns[1][1] * m.columns[2][2] - m.columns[0][0] * m.columns[1][2] * m.columns[2][1] - m.columns[1][0] * m.columns[0][1] * m.columns[2][2] + m.columns[1][0] * m.columns[0][2] * m.columns[2][1] + m.columns[2][0] * m.columns[0][1] * m.columns[1][2] - m.columns[2][0] * m.columns[0][2] * m.columns[1][1]; float det = m.columns[0][0] * result.columns[0][0] + m.columns[0][1] * result.columns[1][0] + m.columns[0][2] * result.columns[2][0] + m.columns[0][3] * result.columns[3][0]; if (det == 0) { return float4x4(1.0); } det = 1.0f / det; for (auto& column : result.columns) { for (int j = 0; j < 4; j++) { column[j] *= det; } } return result; } // result = m * v; inline float4 multiply(const float4x4& m, const float4& v) { float4 result; result[0] = m.columns[0][0] * v[0] + m.columns[1][0] * v[1] + m.columns[2][0] * v[2] + m.columns[3][0] * v[3]; result[1] = m.columns[0][1] * v[0] + m.columns[1][1] * v[1] + m.columns[2][1] * v[2] + m.columns[3][1] * v[3]; result[2] = m.columns[0][2] * v[0] + m.columns[1][2] * v[1] + m.columns[2][2] * v[2] + m.columns[3][2] * v[3]; result[3] = m.columns[0][3] * v[0] + m.columns[1][3] * v[1] + m.columns[2][3] * v[2] + m.columns[3][3] * v[3]; return result; } // result = m1 * m2 inline float4x4 multiply(const float4x4& m1, const float4x4& m2) { float4x4 result{}; result.columns[0] = multiply(m1, m2.columns[0]); result.columns[1] = multiply(m1, m2.columns[1]); result.columns[2] = multiply(m1, m2.columns[2]); result.columns[3] = multiply(m1, m2.columns[3]); return result; } #endif } // namespace iglu::simdtypes ================================================ FILE: IGLU/simple_renderer/Drawable.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @MARK:COVERAGE_EXCLUDE_FILE #include "Drawable.h" #include namespace iglu::drawable { Drawable::Drawable(std::shared_ptr vertexData, std::shared_ptr material) : vertexData_(std::move(vertexData)), material_(std::move(material)) {} void Drawable::draw(igl::IDevice& device, igl::IRenderCommandEncoder& commandEncoder, const igl::RenderPipelineDesc& pipelineDesc, size_t pushConstantsDataSize, const void* pushConstantsData) { // Assumption: _vertexData and _material are immutable const size_t pipelineDescHash = std::hash()(pipelineDesc); if (!pipelineState_ || pipelineDescHash != lastPipelineDescHash_) { igl::RenderPipelineDesc mutablePipelineDesc = pipelineDesc; vertexData_->populatePipelineDescriptor(mutablePipelineDesc); material_->populatePipelineDescriptor(mutablePipelineDesc); pipelineState_ = device.createRenderPipeline(mutablePipelineDesc, nullptr); lastPipelineDescHash_ = pipelineDescHash; } commandEncoder.bindRenderPipelineState(pipelineState_); material_->bind(device, *pipelineState_, commandEncoder); if (pushConstantsData && pushConstantsDataSize) { commandEncoder.bindPushConstants(pushConstantsData, pushConstantsDataSize); } vertexData_->draw(commandEncoder); } } // namespace iglu::drawable ================================================ FILE: IGLU/simple_renderer/Drawable.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @MARK:COVERAGE_EXCLUDE_FILE #pragma once #include #include #include namespace iglu::drawable { /// A drawable aggregates all the data and configurations for a single draw call. /// class Drawable final { public: /// Binds all relevant states and issues a draw call on 'commandEncoder'. /// It takes a render pipeline descriptor as input, which is expected to be /// populated with accurate framebuffer information; all other "draw call" /// related configurations will be handled internally. void draw(igl::IDevice& device, igl::IRenderCommandEncoder& commandEncoder, const igl::RenderPipelineDesc& pipelineDesc, size_t pushConstantsDataSize = 0, const void* pushConstantsData = nullptr); /// A Drawable is "immutable" in that there's no API to modify its inputs after /// creation. They're lightweight objects and should be recreated instead of updated. Drawable(std::shared_ptr vertexData, std::shared_ptr material); ~Drawable() = default; private: std::shared_ptr vertexData_; std::shared_ptr material_; std::shared_ptr pipelineState_; size_t lastPipelineDescHash_ = 0; }; } // namespace iglu::drawable ================================================ FILE: IGLU/simple_renderer/ForwardRenderPass.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @MARK:COVERAGE_EXCLUDE_FILE #include "ForwardRenderPass.h" #include namespace iglu::renderpass { ForwardRenderPass::ForwardRenderPass(igl::IDevice& device) { const igl::CommandQueueDesc desc{}; commandQueue_ = device.createCommandQueue(desc, nullptr); backendType_ = device.getBackendType(); } void ForwardRenderPass::begin(std::shared_ptr target, const igl::RenderPassDesc* renderPassDescOverride) { IGL_DEBUG_ASSERT(!isActive(), "Drawing already in progress"); framebuffer_ = std::move(target); renderPipelineDesc_.targetDesc.colorAttachments.resize(1); renderPipelineDesc_.targetDesc.colorAttachments[0].textureFormat = framebuffer_->getColorAttachment(0)->getFormat(); auto depthAttachment = framebuffer_->getDepthAttachment(); renderPipelineDesc_.targetDesc.depthAttachmentFormat = depthAttachment ? depthAttachment->getFormat() : igl::TextureFormat::Invalid; auto stencilAttachment = framebuffer_->getStencilAttachment(); renderPipelineDesc_.targetDesc.stencilAttachmentFormat = stencilAttachment ? stencilAttachment->getFormat() : igl::TextureFormat::Invalid; igl::RenderPassDesc defaultRenderPassDesc; defaultRenderPassDesc.colorAttachments.resize(1); defaultRenderPassDesc.colorAttachments[0].loadAction = igl::LoadAction::Clear; defaultRenderPassDesc.colorAttachments[0].storeAction = igl::StoreAction::Store; defaultRenderPassDesc.colorAttachments[0].clearColor = {0.0, 0.0, 0.0, 1.0}; defaultRenderPassDesc.depthAttachment.clearDepth = 1.0f; const igl::RenderPassDesc* finalDesc = renderPassDescOverride ? renderPassDescOverride : &defaultRenderPassDesc; const igl::CommandBufferDesc cbDesc; commandBuffer_ = commandQueue_->createCommandBuffer(cbDesc, nullptr); commandEncoder_ = commandBuffer_->createRenderCommandEncoder(*finalDesc, framebuffer_, {}, nullptr); } void ForwardRenderPass::draw(drawable::Drawable& drawable, igl::IDevice& device) const { IGL_DEBUG_ASSERT(isActive(), "Drawing not in progress"); drawable.draw(device, *commandEncoder_, renderPipelineDesc_); } void ForwardRenderPass::end(bool shouldPresent) { IGL_DEBUG_ASSERT(isActive(), "Drawing not in progress"); commandEncoder_->endEncoding(); if (shouldPresent) { commandBuffer_->present(framebuffer_->getColorAttachment(0)); } commandQueue_->submit(*commandBuffer_); commandEncoder_ = nullptr; commandBuffer_ = nullptr; framebuffer_ = nullptr; } void ForwardRenderPass::bindViewport(const igl::Viewport& viewport, const igl::Size& surfaceSize) { IGL_DEBUG_ASSERT(isActive(), "Drawing not in progress"); if (backendType_ == igl::BackendType::Metal) { // In Metal, framebuffer origin is top left but the argument assumes bottom left igl::Viewport flippedViewport = viewport; flippedViewport.y = surfaceSize.height - viewport.y - viewport.height; commandEncoder_->bindViewport(flippedViewport); } else { commandEncoder_->bindViewport(viewport); } } bool ForwardRenderPass::isActive() const { return framebuffer_ != nullptr; } igl::IFramebuffer& ForwardRenderPass::activeTarget() { IGL_DEBUG_ASSERT(isActive(), "No valid target when not active"); return *framebuffer_; } igl::IRenderCommandEncoder& ForwardRenderPass::activeCommandEncoder() { IGL_DEBUG_ASSERT(isActive(), "No valid command encoder when not active"); return *commandEncoder_; } } // namespace iglu::renderpass ================================================ FILE: IGLU/simple_renderer/ForwardRenderPass.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @MARK:COVERAGE_EXCLUDE_FILE #pragma once #include #include #include #include #include namespace iglu::renderpass { /// A simple "render pass" abstraction that hides low level graphics API details /// like command queue, command encoder, render pipeline state and presentation. /// /// An application frame will always have one render pass targeting the "onscreen" /// framebuffer, but it can have multiple intermediate offscreen render passes. class ForwardRenderPass final { public: /// Call before any graphics bind/draw calls to this render pass. void begin(std::shared_ptr target, const igl::RenderPassDesc* renderPassDescOverride = nullptr); /// Call once per drawable. void draw(drawable::Drawable& drawable, igl::IDevice& device) const; /// Call after all drawing within this render pass is finished. The 'present' /// parameter controls whether to present the target framebuffer and must be set /// to true exactly once per frame, when targeting the "onscreen" framebuffer. void end(bool present = false); /// Optional. By default, a viewport matching the size of the target framebuffer /// will be used. /// /// [Convention] Framebuffer origin is bottom left corner. void bindViewport(const igl::Viewport& viewport, const igl::Size& surfaceSize); //// The render pass is considered active when in between begin() and end() calls. bool isActive() const; igl::IFramebuffer& activeTarget(); igl::IRenderCommandEncoder& activeCommandEncoder(); explicit ForwardRenderPass(igl::IDevice& device); ~ForwardRenderPass() = default; private: igl::BackendType backendType_; std::shared_ptr commandQueue_; std::shared_ptr framebuffer_; igl::RenderPipelineDesc renderPipelineDesc_; std::shared_ptr commandBuffer_; std::unique_ptr commandEncoder_; }; } // namespace iglu::renderpass ================================================ FILE: IGLU/simple_renderer/Material.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @MARK:COVERAGE_EXCLUDE_FILE #include "Material.h" #include namespace iglu::material { Material::Material(igl::IDevice& device, std::string name) : name(std::move(name)) { setDepthTestConfig(device, depthTestConfig_); } std::shared_ptr Material::shaderProgram() const { return shaderProgram_; } void Material::setShaderProgram(igl::IDevice& device, const std::shared_ptr& program) { shaderProgram_ = program; shaderUniforms_ = std::make_unique(device, shaderProgram_->renderPipelineReflection()); } ShaderUniforms& Material::shaderUniforms() const { return *shaderUniforms_; } DepthTestConfig Material::depthTestConfig() const { return depthTestConfig_; } void Material::setDepthTestConfig(igl::IDevice& device, const DepthTestConfig& config) { depthTestConfig_ = config; igl::DepthStencilStateDesc depthDesc{ .compareFunction = (depthTestConfig_ != DepthTestConfig::Disable) ? igl::CompareFunction::Less : igl::CompareFunction::AlwaysPass, .isDepthWriteEnabled = (depthTestConfig_ == DepthTestConfig::Enable), }; depthState_ = device.createDepthStencilState(depthDesc, nullptr); } void Material::populatePipelineDescriptor(igl::RenderPipelineDesc& pipelineDesc) const { // Assumption: 'blendMode' only applies to the first color attachment if (!pipelineDesc.targetDesc.colorAttachments.empty()) { auto& colorAttachment = pipelineDesc.targetDesc.colorAttachments[0]; if (blendMode == BlendMode::Opaque()) { colorAttachment.blendEnabled = false; } else { colorAttachment.blendEnabled = true; colorAttachment.srcRGBBlendFactor = blendMode.srcRGB; colorAttachment.dstRGBBlendFactor = blendMode.dstRGB; colorAttachment.rgbBlendOp = blendMode.opRGB; colorAttachment.srcAlphaBlendFactor = blendMode.srcAlpha; colorAttachment.dstAlphaBlendFactor = blendMode.dstAlpha; colorAttachment.alphaBlendOp = blendMode.opAlpha; } } pipelineDesc.cullMode = cullMode; shaderProgram_->populatePipelineDescriptor(pipelineDesc); } void Material::bind(igl::IDevice& device, igl::IRenderPipelineState& pipelineState, igl::IRenderCommandEncoder& commandEncoder) { shaderUniforms_->bind(device, pipelineState, commandEncoder); commandEncoder.bindDepthStencilState(depthState_); } } // namespace iglu::material ================================================ FILE: IGLU/simple_renderer/Material.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @MARK:COVERAGE_EXCLUDE_FILE #pragma once #include "ShaderProgram.h" #include "ShaderUniforms.h" #include #include namespace iglu::material { enum class DepthTestConfig { Disable, Enable, EnableNoWrite, }; /// Aggregates all blend mode related configurations. class BlendMode { public: igl::BlendFactor srcRGB; igl::BlendFactor dstRGB; igl::BlendOp opRGB; igl::BlendFactor srcAlpha; igl::BlendFactor dstAlpha; igl::BlendOp opAlpha; BlendMode(); BlendMode(igl::BlendFactor src, igl::BlendFactor dst) : BlendMode(src, dst, igl::BlendOp::Add, src, dst, igl::BlendOp::Add) {} BlendMode(igl::BlendFactor srcRGB, igl::BlendFactor dstRGB, igl::BlendOp opRGB, igl::BlendFactor srcAlpha, igl::BlendFactor dstAlpha, igl::BlendOp opAlpha) : srcRGB(srcRGB), dstRGB(dstRGB), opRGB(opRGB), srcAlpha(srcAlpha), dstAlpha(dstAlpha), opAlpha(opAlpha) {} static BlendMode Opaque() { return {igl::BlendFactor::One, igl::BlendFactor::Zero}; } static BlendMode Translucent() { return {igl::BlendFactor::SrcAlpha, igl::BlendFactor::OneMinusSrcAlpha, igl::BlendOp::Add, igl::BlendFactor::One, igl::BlendFactor::OneMinusSrcAlpha, igl::BlendOp::Add}; } static BlendMode Additive() { return {igl::BlendFactor::SrcAlpha, igl::BlendFactor::One}; } static BlendMode Premultiplied() { return {igl::BlendFactor::One, igl::BlendFactor::OneMinusSrcAlpha}; } bool operator==(const BlendMode& other) const { return srcRGB == other.srcRGB && dstRGB == other.dstRGB && opRGB == other.opRGB && srcAlpha == other.srcAlpha && dstAlpha == other.dstAlpha && opAlpha == other.opAlpha; } }; /// Aggregates all configurations that affect how vertex data will be rendered. It also /// simplifies render pipeline state manipulation. /// /// A "material" is typically associated with artistic inputs to renderable objects. The /// shader program and its inputs are the most obvious example of controlling the looks of a /// renderable object, but there are other pipeline states that are relevant. class Material final { public: std::string name = ""; BlendMode blendMode = BlendMode::Opaque(); igl::CullMode cullMode = igl::CullMode::Back; [[nodiscard]] std::shared_ptr shaderProgram() const; void setShaderProgram(igl::IDevice& device, const std::shared_ptr& shaderProgram); /// There's a 1-to-1 correspondence between the ShaderProgram and the ShaderUniforms object. /// Don't cache this returned object, as changing the shader program will create a new one. [[nodiscard]] ShaderUniforms& shaderUniforms() const; [[nodiscard]] DepthTestConfig depthTestConfig() const; void setDepthTestConfig(igl::IDevice& device, const DepthTestConfig& config); /// Populates a pipeline descriptor for drawing using this Material. void populatePipelineDescriptor(igl::RenderPipelineDesc& pipelineDesc) const; /// Binds all relevant states in 'encoder' in preparation for drawing. void bind(igl::IDevice& device, igl::IRenderPipelineState& pipelineState, igl::IRenderCommandEncoder& commandEncoder); explicit Material(igl::IDevice& device, std::string name = ""); ~Material() = default; private: std::shared_ptr shaderProgram_; std::unique_ptr shaderUniforms_; std::shared_ptr depthState_; DepthTestConfig depthTestConfig_ = DepthTestConfig::Disable; }; } // namespace iglu::material ================================================ FILE: IGLU/simple_renderer/ParametricVertexData.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @MARK:COVERAGE_EXCLUDE_FILE #include "ParametricVertexData.h" #include namespace iglu::vertexdata { // Assumption: for OpenGL and Metal, respectively static const std::pair kSAttrPosition("a_position", 0); static const std::pair kSAttrUv("a_uv", 1); namespace Quad { igl::VertexInputStateDesc inputStateDesc() { igl::VertexInputStateDesc inputDesc; inputDesc.numAttributes = 2; inputDesc.attributes[0] = { .bufferIndex = 0, .format = igl::VertexAttributeFormat::Float3, .offset = offsetof(VertexPosUv, position), .name = kSAttrPosition.first, .location = kSAttrPosition.second, }, inputDesc.attributes[1] = { .bufferIndex = 0, .format = igl::VertexAttributeFormat::Float2, .offset = offsetof(VertexPosUv, uv), .name = kSAttrUv.first, .location = kSAttrUv.second, }; inputDesc.numInputBindings = 1; inputDesc.inputBindings[0].stride = sizeof(VertexPosUv); return inputDesc; } std::shared_ptr create(igl::IDevice& device, iglu::simdtypes::float2 posMin, iglu::simdtypes::float2 posMax, iglu::simdtypes::float2 uvMin, iglu::simdtypes::float2 uvMax) { // - UV origin: bottom left // - Vertex layout: // 0 -- 2 // | | // | | // 1 -- 3 const std::array vertexData{ VertexPosUv{.position = {posMin[0], posMax[1], 0.0}, .uv = {uvMin[0], uvMax[1]}}, VertexPosUv{.position = {posMin[0], posMin[1], 0.0}, .uv = {uvMin[0], uvMin[1]}}, VertexPosUv{.position = {posMax[0], posMax[1], 0.0}, .uv = {uvMax[0], uvMax[1]}}, VertexPosUv{.position = {posMax[0], posMin[1], 0.0}, .uv = {uvMax[0], uvMin[1]}}, }; const std::array indexData{uint16_t{0}, uint16_t{1}, uint16_t{2}, uint16_t{3}}; const igl::BufferDesc vbDesc{.type = igl::BufferDesc::BufferTypeBits::Vertex, .data = vertexData.data(), .length = sizeof(VertexPosUv) * vertexData.size()}; const igl::BufferDesc ibDesc{.type = igl::BufferDesc::BufferTypeBits::Index, .data = indexData.data(), .length = sizeof(uint16_t) * indexData.size()}; const igl::VertexInputStateDesc inputDesc = inputStateDesc(); const std::shared_ptr vertexInput = device.createVertexInputState(inputDesc, nullptr); PrimitiveDesc primitiveDesc; primitiveDesc.numEntries = sizeof(indexData) / sizeof(indexData[0]); std::shared_ptr vertData = std::make_shared(vertexInput, device.createBuffer(vbDesc, nullptr), device.createBuffer(ibDesc, nullptr), igl::IndexFormat::UInt16, primitiveDesc, igl::PrimitiveType::TriangleStrip); return vertData; } } // namespace Quad namespace RenderToTextureQuad { igl::VertexInputStateDesc inputStateDesc() { return Quad::inputStateDesc(); } std::shared_ptr create(igl::IDevice& device, iglu::simdtypes::float2 posMin, iglu::simdtypes::float2 posMax, iglu::simdtypes::float2 uvMin, iglu::simdtypes::float2 uvMax) { iglu::simdtypes::float2 uvMinAdjusted = uvMin; iglu::simdtypes::float2 uvMaxAdjusted = uvMax; // Here's how to think about the conventions that led to this workaround. // // Summary of conventions: // - In OpenGL, all origins (texture, framebuffer, clip) are the bottom left corner. // - In Metal, texture and framebuffer origins are the top left corner. // - The conventions in this library follow OpenGL. For example: // - This file creates VertexData with UV origin at the bottom left. // - The first pixel in a texture is expected to be the bottom left. // - ForwardRenderPass assumes the viewport (framebuffer space) origin is the bottom left. // - We are forced to have our own conventions because the graphics APIs have their own // conventions that aren't compatible with each other. Furthermore, we must correct for them. // // Correcting for discrepancies across graphics APIs: // - Although we can modify texture content, texture coordinates, viewport and clip space at // will to handle discrepancies across graphics APIs, none provide a way to alter the origin // of a framebuffer. // - When a framebuffer color attachment is used a shader program input, things break. Our // convention is to use bottom left origin for texture data, which matches the origin of OpenGL // framebuffer; all good. However, in Metal, the origin of framebuffer attachments is top left, // so our color attachment texture is flipped in relation to textures loaded from images. // - If we followed Metal's coordinate conventions instead, we'd have the same problem but in // OpenGL. This problem can't be avoided because the APIs don't allow us to compensate for // our conventions, no matter what they are. // // This workaround doesn't cover use cases like: // - Imported 3D meshes // - Shaders that use a combination of color attachments and image-based textures as input // A general solution to this problem would involve being able to tell shader code about the // orientation of every input texture and a strict set of conventions in shader code to ensure // texture sampling accounts for that information. // // Some external resources I found useful for understanding this issue: // - https://veldrid.dev/articles/backend-differences.html // - http://hacksoflife.blogspot.com/2019/04/keeping-blue-side-up-coordinate.html // if (device.getBackendType() == igl::BackendType::Metal) { uvMinAdjusted[1] = 1.0f - uvMinAdjusted[1]; uvMaxAdjusted[1] = 1.0f - uvMaxAdjusted[1]; } return Quad::create(device, posMin, posMax, uvMinAdjusted, uvMaxAdjusted); } } // namespace RenderToTextureQuad } // namespace iglu::vertexdata ================================================ FILE: IGLU/simple_renderer/ParametricVertexData.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @MARK:COVERAGE_EXCLUDE_FILE #pragma once #include "VertexData.h" #include #include namespace iglu::vertexdata { // [Convention] UV origin is bottom left and +Y points up. struct VertexPosUv { iglu::simdtypes::float3 position; iglu::simdtypes::float2 uv; }; /// Simple XY-aligned quad. namespace Quad { /// Descriptor matching the VertexPosUv type used in 'create'. igl::VertexInputStateDesc inputStateDesc(); std::shared_ptr create(igl::IDevice& device, iglu::simdtypes::float2 posMin, iglu::simdtypes::float2 posMax, iglu::simdtypes::float2 uvMin, iglu::simdtypes::float2 uvMax); } // namespace Quad /// Simple XY-aligned quad. /// /// Use RenderToTextureQuad instead of Quad if you're rendering to a texture and your results /// are flipped on some graphics backends. Use it in one of two ways: /// 1. When rendering into a texture in a **full screen** pass /// 2. In draw calls where **all** the inputs to your shader program are color attachments /// /// An in-depth explanation of the problem, solution and limitations can be found in the /// implementation file. namespace RenderToTextureQuad { /// Descriptor matching the VertexPosUv type used in 'create'. igl::VertexInputStateDesc inputStateDesc(); std::shared_ptr create(igl::IDevice& device, iglu::simdtypes::float2 posMin, iglu::simdtypes::float2 posMax, iglu::simdtypes::float2 uvMin, iglu::simdtypes::float2 uvMax); } // namespace RenderToTextureQuad } // namespace iglu::vertexdata ================================================ FILE: IGLU/simple_renderer/ShaderProgram.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @MARK:COVERAGE_EXCLUDE_FILE #include "ShaderProgram.h" #include #include namespace iglu::material { #define CHECK_RESULT(res, outResPtr) \ if (!res.isOk()) { \ if (outResPtr != nullptr) { \ *outResPtr = res; \ } else { \ IGL_DEBUG_ABORT("%s", res.message.c_str()); \ } \ return; \ } ShaderProgram::ShaderProgram(igl::IDevice& device, std::shared_ptr vertexShader, std::shared_ptr fragmentShader, std::shared_ptr vis, igl::Result* outResult) { igl::Result result; shaderStages_ = igl::ShaderStagesCreator::fromRenderModules( device, std::move(vertexShader), std::move(fragmentShader), &result); CHECK_RESULT(result, outResult); init(device, std::move(vis), outResult); } ShaderProgram::ShaderProgram(igl::IDevice& device, std::shared_ptr shaderStages, std::shared_ptr vis, igl::Result* outResult) : shaderStages_(std::move(shaderStages)) { init(device, std::move(vis), outResult); } void ShaderProgram::init(igl::IDevice& device, std::shared_ptr vis, igl::Result* outResult) { igl::Result result; igl::RenderPipelineDesc pipelineDesc; pipelineDesc.shaderStages = shaderStages_; pipelineDesc.vertexInputState = std::move(vis); pipelineDesc.targetDesc.colorAttachments.resize(1); pipelineDesc.targetDesc.colorAttachments[0].textureFormat = igl::TextureFormat::RGBA_UNorm8; auto pipelineState = device.createRenderPipeline(pipelineDesc, &result); CHECK_RESULT(result, outResult); // Note that the check above might early return! reflection_ = pipelineState->renderPipelineReflection(); } const igl::IRenderPipelineReflection& ShaderProgram::renderPipelineReflection() const { return *reflection_; } void ShaderProgram::populatePipelineDescriptor(igl::RenderPipelineDesc& pipelineDesc) const { pipelineDesc.shaderStages = shaderStages_; for (const auto& entry : reflection_->allTextures()) { pipelineDesc.fragmentUnitSamplerMap[entry.textureIndex] = igl::genNameHandle(entry.name); } } } // namespace iglu::material ================================================ FILE: IGLU/simple_renderer/ShaderProgram.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @MARK:COVERAGE_EXCLUDE_FILE #pragma once #include #include #include namespace iglu::material { /// Aggregates a vertex and a fragment module to extract shader reflection /// information that can be used ahead of drawing. class ShaderProgram final { public: /// Retrieve shader reflection information. This is particularly useful in /// scenarios where the application can't make fixed assumptions about the /// layout of the uniforms within a shader. [[nodiscard]] const igl::IRenderPipelineReflection& renderPipelineReflection() const; /// Populates a pipeline descriptor for drawing using this shader program. void populatePipelineDescriptor(igl::RenderPipelineDesc& pipelineDesc) const; ShaderProgram(igl::IDevice& device, std::shared_ptr vertexShader, std::shared_ptr fragmentShader, std::shared_ptr vis = nullptr, igl::Result* outResult = nullptr); ShaderProgram(igl::IDevice& device, std::shared_ptr shaderStages, std::shared_ptr vis = nullptr, igl::Result* outResult = nullptr); ~ShaderProgram() = default; private: void init(igl::IDevice& device, std::shared_ptr vis, igl::Result* outResult); std::shared_ptr shaderStages_; std::shared_ptr reflection_; }; } // namespace iglu::material ================================================ FILE: IGLU/simple_renderer/ShaderUniforms.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "ShaderUniforms.h" #include #include #include #if IGL_BACKEND_OPENGL // RenderPipelineState.h is included below for OpenGL-specific functionality #include #endif #if defined(IGL_CMAKE_BUILD) #include #else #include #endif #include #include #include #include namespace { // For Suballocated uniform buffers, try to allocate at most a buffer of size 64K. // We will clamp the size to the limits of the device. // For example, on the Quest 2 GPU, maxUniformBufferSize is 64k, so we are using it all. constexpr size_t kMaxSuballocatedBufferSizeBytes = 65536; uint8_t bindTargetForShaderStage(igl::ShaderStage stage) { switch (stage) { case igl::ShaderStage::Vertex: return igl::BindTarget::kVertex; case igl::ShaderStage::Fragment: return igl::BindTarget::kFragment; case igl::ShaderStage::Compute: default: IGL_DEBUG_ABORT("invalid shader stage for rendering: %d", (int)stage); return 0; } } } // namespace namespace iglu::material { ShaderUniforms::ShaderUniforms(igl::IDevice& device, const igl::IRenderPipelineReflection& reflection, bool enableSuballocationforVulkan) : device_(device) { bool hasBindBytesFeature = device.hasFeature(igl::DeviceFeatures::BindBytes); size_t bindBytesLimit = 0; if (!device.getFeatureLimits(igl::DeviceFeatureLimits::MaxBindBytesBytes, bindBytesLimit)) { IGL_LOG_ERROR("[IGL][Warning] Failed to get MaxBindBytesBytes value. Turning off bind bytes"); hasBindBytesFeature = false; } size_t uniformBufferLimit = 0; device.getFeatureLimits(igl::DeviceFeatureLimits::MaxUniformBufferBytes, uniformBufferLimit); const bool isSuballocated = enableSuballocationforVulkan && device_.getBackendType() == igl::BackendType::Vulkan; for (const igl::BufferArgDesc& iglDesc : reflection.allUniformBuffers()) { const size_t length = iglDesc.bufferDataSize; IGL_DEBUG_ASSERT(length > 0, "unexpected buffer with size 0"); IGL_DEBUG_ASSERT(length <= kMaxSuballocatedBufferSizeBytes && (uniformBufferLimit == 0 || length <= uniformBufferLimit), "buffer size exceeds limits"); const size_t bufferAllocationLength = std::min(isSuballocated ? kMaxSuballocatedBufferSizeBytes : length, uniformBufferLimit != 0 ? uniformBufferLimit : std::numeric_limits::max()); const std::string vertexBufferPrefix = "vertexBuffer."; if (device.getBackendType() == igl::BackendType::Metal && iglDesc.name.toString().substr(0, vertexBufferPrefix.length()) == vertexBufferPrefix) { continue; } bool createBuffer = false; if (device_.getBackendType() == igl::BackendType::OpenGL) { // On OpenGL, create buffers only when dealing with uniform blocks (and not single uniforms) createBuffer = iglDesc.isUniformBlock; } else if (device_.getBackendType() == igl::BackendType::Vulkan) { createBuffer = true; } else if (device_.getBackendType() == igl::BackendType::Metal) { // On Metal, need to create buffers only when data > 4kb createBuffer = !hasBindBytesFeature || length > bindBytesLimit; } else if (device_.getBackendType() == igl::BackendType::D3D12) { // D3D12 does not support bindBytes, always create buffers createBuffer = true; } std::shared_ptr buffer = nullptr; if (createBuffer) { const auto backendType = device_.getBackendType(); const igl::BufferDesc desc{ .type = igl::BufferDesc::BufferTypeBits::Uniform, .length = bufferAllocationLength, .storage = igl::ResourceStorage::Shared, .hint = static_cast( igl::BufferDesc::BufferAPIHintBits::UniformBlock | ((backendType == igl::BackendType::Metal || backendType == igl::BackendType::Vulkan || backendType == igl::BackendType::D3D12) ? igl::BufferDesc::BufferAPIHintBits::Ring : 0)), }; buffer = device.createBuffer(desc, nullptr); } // All uniform updates will be made to this malloc'ed data block, // which will later be uploaded to the buffer (if using buffer) void* data = malloc(bufferAllocationLength); if (data == nullptr) { continue; } auto allocation = std::make_shared(data, bufferAllocationLength, buffer); allocations_.push_back(allocation); std::shared_ptr bufferDesc = std::make_shared(); bufferDesc->iglBufferDesc = iglDesc; bufferDesc->allocation = allocation; if (isSuballocated) { bufferDesc->isSuballocated = true; // In Vulkan, Uniform buffers must have offets that are a multiple of // VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment size_t alignement = 0; device.getFeatureLimits(igl::DeviceFeatureLimits::BufferAlignment, alignement); // Align the suballocation size to the physical device alignment bufferDesc->suballocationsSize = (length + alignement - 1) & ~(alignement - 1); } for (int i = 0; i < static_cast(iglDesc.members.size()); ++i) { const auto& uniformDesc = iglDesc.members[i]; const UniformDesc uniform{.iglMemberDesc = uniformDesc, .buffer = bufferDesc}; allUniformsByName_.insert({uniformDesc.name, uniform}); bufferDesc->uniforms.push_back(uniform); bufferDesc->memberIndices[uniformDesc.name] = i; } bufferDescs_.insert({iglDesc.name, std::move(bufferDesc)}); } for (const igl::TextureArgDesc& iglDesc : reflection.allTextures()) { textureDescs_.push_back(iglDesc); allTexturesByName_[iglDesc.name] = TextureSlot{.texture = nullptr, .rawTexture = nullptr}; } } ShaderUniforms::~ShaderUniforms() { for (auto& allocation : allocations_) { free(allocation->ptr); } } igl::NameHandle ShaderUniforms::MemoizedQualifiedMemberNameCalculator::getQualifiedMemberName( const igl::NameHandle& /*blockTypeName*/, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName) const { const std::pair key = {blockInstanceName, memberName}; auto it = qualifiedMemberNameCache_.find(key); if (it != qualifiedMemberNameCache_.end()) { return it->second; } auto qualifiedMemberName = igl::genNameHandle(blockInstanceName.toString() + "." + memberName.toString()); qualifiedMemberNameCache_.insert({key, qualifiedMemberName}); return qualifiedMemberName; } igl::NameHandle ShaderUniforms::getQualifiedMemberName(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName) { return memoizedQualifiedMemberNameCalculator_.getQualifiedMemberName( blockTypeName, blockInstanceName, memberName); } std::vector> ShaderUniforms::getPossibleBufferAndMemberNames(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName) { /** Given an SparkSL/GLSL3 interface block: ``` uniform BlockTypeName { float f; } blockInstanceName; ``` The corresponding Legacy GLSL code: ``` struct BlockTypeName { float f; } uniform BlockTypeName blockInstanceName; ``` The corresponding Metal code: ``` struct BlockTypeName { float f; }; main(BlockTypeName& blockInstanceName) { ... } ``` In OpenGL3, the name of the buffer block is `BlockTypeName` and the member name is 'memberName'. In legacy OpenGL, we treat each member of the struct an individual uniform, so both the buffer name and member name are `blockInstanceName.f` In Metal, the name of the block is `blockInstanceName` and the member name is 'memberName'. */ if (device_.getBackendType() == igl::BackendType::Metal) { return {{blockInstanceName, memberName}}; } else { if (device_.getBackendType() == igl::BackendType::OpenGL) { auto qualifiedName = ShaderUniforms::getQualifiedMemberName(blockTypeName, blockInstanceName, memberName); return {{blockTypeName, memberName}, {qualifiedName, qualifiedName}}; } return {{blockTypeName, memberName}}; } } void ShaderUniforms::setUniformBytes(const UniformDesc& uniformDesc, const void* data, size_t elementSize, size_t count, size_t arrayIndex) { if (arrayIndex + count > uniformDesc.iglMemberDesc.arrayLength) { IGL_LOG_ERROR_ONCE("[IGL][Error] Invalid range for uniform %s: %zu,%zu,%zu\n", uniformDesc.iglMemberDesc.name.c_str(), arrayIndex, count, uniformDesc.iglMemberDesc.arrayLength); return; } auto strongBuffer = uniformDesc.buffer.lock(); if (!strongBuffer) { IGL_LOG_ERROR_ONCE("[IGL][Error] null uniform buffer %s!\n", uniformDesc.iglMemberDesc.name.c_str()); return; } uintptr_t subAllocatedOffset = 0; if (strongBuffer->isSuballocated && strongBuffer->currentAllocation >= 0) { subAllocatedOffset = strongBuffer->currentAllocation * strongBuffer->suballocationsSize; } const uintptr_t offset = uniformDesc.iglMemberDesc.offset + elementSize * arrayIndex + subAllocatedOffset; auto err = try_checked_memcpy((uint8_t*)strongBuffer->allocation->ptr + offset, // destination strongBuffer->allocation->size - offset, // max destination size data, // source elementSize * count // num bytes to copy ); if (err != 0) { IGL_LOG_ERROR_ONCE("[IGL][Error] Failed to update uniform buffer\n"); } } void ShaderUniforms::setUniformBytes(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const void* data, size_t elementSize, size_t count, size_t arrayIndex) { auto possibleBufferNames = getPossibleBufferAndMemberNames(blockTypeName, blockInstanceName, memberName); for (auto& [bufferName, bufferMemberName] : possibleBufferNames) { auto range = bufferDescs_.equal_range(bufferName); if (range.first == range.second) { continue; } for (auto bufferDescIt = range.first; bufferDescIt != range.second; ++bufferDescIt) { auto& bufferDesc = bufferDescIt->second; auto memberIndexIt = bufferDesc->memberIndices.find(bufferMemberName); if (memberIndexIt == bufferDesc->memberIndices.end()) { IGL_LOG_ERROR_ONCE( "Member %s not found in buffer %s", bufferMemberName.c_str(), bufferName.c_str()); continue; } auto& uniformDesc = bufferDesc->uniforms[memberIndexIt->second]; setUniformBytes(uniformDesc, data, elementSize, count, arrayIndex); } return; } IGL_LOG_ERROR_ONCE("Buffer block not found: %s", blockTypeName.c_str()); } void ShaderUniforms::setUniformBytes(const igl::NameHandle& name, const void* data, size_t elementSize, size_t count, size_t arrayIndex) { auto range = allUniformsByName_.equal_range(name); if (range.first == range.second) { IGL_LOG_ERROR_ONCE("[IGL][Error] Invalid uniform name: %s\n", name.c_str()); return; } for (auto it = range.first; it != range.second; ++it) { auto& uniformDesc = it->second; setUniformBytes(uniformDesc, data, elementSize, count, arrayIndex); } } void ShaderUniforms::setBool(const igl::NameHandle& uniformName, const bool& value, size_t arrayIndex) { setUniformBytes(uniformName, &value, sizeof(bool), 1, arrayIndex); } void ShaderUniforms::setBool(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const bool& value, size_t arrayIndex) { setUniformBytes( blockTypeName, blockInstanceName, memberName, &value, sizeof(bool), 1, arrayIndex); } void ShaderUniforms::setBoolArray(const igl::NameHandle& uniformName, const bool* value, size_t count, size_t arrayIndex) { setUniformBytes(uniformName, value, sizeof(bool), count, arrayIndex); } void ShaderUniforms::setBoolArray(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const bool* value, size_t count, size_t arrayIndex) { setUniformBytes( blockTypeName, blockInstanceName, memberName, value, sizeof(bool), count, arrayIndex); } void ShaderUniforms::setFloat(const igl::NameHandle& uniformName, const iglu::simdtypes::float1& value, size_t arrayIndex) { setUniformBytes(uniformName, &value, sizeof(iglu::simdtypes::float1), 1, arrayIndex); } void ShaderUniforms::setFloat(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const iglu::simdtypes::float1& value, size_t arrayIndex) { setUniformBytes(blockTypeName, blockInstanceName, memberName, &value, sizeof(iglu::simdtypes::float1), 1, arrayIndex); } void ShaderUniforms::setFloatArray(const igl::NameHandle& uniformName, const iglu::simdtypes::float1* value, size_t count, size_t arrayIndex) { setUniformBytes(uniformName, value, sizeof(iglu::simdtypes::float1), count, arrayIndex); } void ShaderUniforms::setFloatArray(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const iglu::simdtypes::float1* value, size_t count, size_t arrayIndex) { setUniformBytes(blockTypeName, blockInstanceName, memberName, value, sizeof(iglu::simdtypes::float1), count, arrayIndex); } void ShaderUniforms::setFloat2(const igl::NameHandle& uniformName, const iglu::simdtypes::float2& value, size_t arrayIndex) { setUniformBytes(uniformName, &value, sizeof(iglu::simdtypes::float2), 1, arrayIndex); } void ShaderUniforms::setFloat2(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const iglu::simdtypes::float2& value, size_t arrayIndex) { setUniformBytes(blockTypeName, blockInstanceName, memberName, &value, sizeof(iglu::simdtypes::float2), 1, arrayIndex); } void ShaderUniforms::setFloat2Array(const igl::NameHandle& uniformName, const iglu::simdtypes::float2* value, size_t count, size_t arrayIndex) { setUniformBytes(uniformName, value, sizeof(iglu::simdtypes::float2), count, arrayIndex); } void ShaderUniforms::setFloat2Array(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const iglu::simdtypes::float2* value, size_t count, size_t arrayIndex) { setUniformBytes(blockTypeName, blockInstanceName, memberName, value, sizeof(iglu::simdtypes::float2), count, arrayIndex); } void ShaderUniforms::setFloat3(const igl::NameHandle& uniformName, const iglu::simdtypes::float3& value, size_t arrayIndex) { setUniformBytes(uniformName, &value, sizeof(float[3]), 1, arrayIndex); } void ShaderUniforms::setFloat3Array(const igl::NameHandle& uniformName, const iglu::simdtypes::float3* value, size_t count, size_t arrayIndex) { if (device_.getBackendType() == igl::BackendType::Metal) { setUniformBytes(uniformName, value, sizeof(iglu::simdtypes::float3), count, arrayIndex); } else { // simdtypes::float3 is padded to have an extra float. // This code path should not be used for Vulkan. (it should only be used for OpenGL when uniform // blocks are not used). const size_t size = sizeof(float) * 3u * count; IGL_DEBUG_ASSERT(size <= 65536); float* IGL_RESTRICT packedArray = reinterpret_cast(alloca(size)); float* IGL_RESTRICT packedArrayPtr = packedArray; const float* paddedArrayPtr = reinterpret_cast(value); for (size_t i = 0; i < count; i++) { for (int j = 0; j < 3; j++) { *packedArrayPtr++ = *paddedArrayPtr++; } paddedArrayPtr++; // padded float } setUniformBytes(uniformName, packedArray, size, 1, arrayIndex); } } void ShaderUniforms::setFloat4(const igl::NameHandle& uniformName, const iglu::simdtypes::float4& value, size_t arrayIndex) { setUniformBytes(uniformName, &value, sizeof(iglu::simdtypes::float4), 1, arrayIndex); } void ShaderUniforms::setFloat4(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const iglu::simdtypes::float4& value, size_t arrayIndex) { setUniformBytes(blockTypeName, blockInstanceName, memberName, &value, sizeof(iglu::simdtypes::float4), 1, arrayIndex); } void ShaderUniforms::setFloat4Array(const igl::NameHandle& uniformName, const iglu::simdtypes::float4* value, size_t count, size_t arrayIndex) { setUniformBytes(uniformName, value, sizeof(iglu::simdtypes::float4), count, arrayIndex); } void ShaderUniforms::setFloat4Array(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const iglu::simdtypes::float4* value, size_t count, size_t arrayIndex) { setUniformBytes(blockTypeName, blockInstanceName, memberName, value, sizeof(iglu::simdtypes::float4), count, arrayIndex); } void ShaderUniforms::setFloat2x2(const igl::NameHandle& uniformName, const iglu::simdtypes::float2x2& value, size_t arrayIndex) { setUniformBytes(uniformName, &value, sizeof(iglu::simdtypes::float2x2), 1, arrayIndex); } void ShaderUniforms::setFloat2x2(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const iglu::simdtypes::float2x2& value, size_t arrayIndex) { setUniformBytes(blockTypeName, blockInstanceName, memberName, &value, sizeof(iglu::simdtypes::float2x2), 1, arrayIndex); } void ShaderUniforms::setFloat2x2Array(const igl::NameHandle& uniformName, const iglu::simdtypes::float2x2* value, size_t count, size_t arrayIndex) { setUniformBytes(uniformName, value, sizeof(iglu::simdtypes::float2x2), count, arrayIndex); } void ShaderUniforms::setFloat2x2Array(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const iglu::simdtypes::float2x2* value, size_t count, size_t arrayIndex) { setUniformBytes(blockTypeName, blockInstanceName, memberName, value, sizeof(iglu::simdtypes::float2x2), count, arrayIndex); } void ShaderUniforms::setFloat3x3(const igl::NameHandle& uniformName, const iglu::simdtypes::float3x3& value, size_t arrayIndex) { if (device_.getBackendType() == igl::BackendType::Metal || device_.getBackendType() == igl::BackendType::Vulkan) { setUniformBytes(uniformName, &value, sizeof(iglu::simdtypes::float3x3), 1, arrayIndex); } else { // simdtypes::float3x3 has an extra float per float-vector. // Remove it so we can send the packed version to OpenGL float packedMatrix[9] = {0.0f}; const auto* paddedMatrixPtr = reinterpret_cast(&value); float* packedMatrixPtr = packedMatrix; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { *packedMatrixPtr++ = *paddedMatrixPtr++; } paddedMatrixPtr++; // padded float } setUniformBytes(uniformName, &packedMatrix, sizeof(packedMatrix), 1, arrayIndex); } } void ShaderUniforms::setFloat3x3(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& uniformName, const iglu::simdtypes::float3x3& value, size_t arrayIndex) { const bool isOglBlock = device_.getBackendType() == igl::BackendType::OpenGL && bufferDescs_.find(blockTypeName) != bufferDescs_.end(); if (device_.getBackendType() == igl::BackendType::Metal || device_.getBackendType() == igl::BackendType::Vulkan || isOglBlock) { setUniformBytes(blockTypeName, blockInstanceName, uniformName, &value, sizeof(iglu::simdtypes::float3x3), 1, arrayIndex); } else { // simdtypes::float3x3 has an extra float per float-vector. // Remove it so we can send the packed version to OpenGL std::array packedMatrix{}; const auto* paddedMatrixPtr = reinterpret_cast(&value); float* packedMatrixPtr = packedMatrix.data(); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { *packedMatrixPtr++ = *paddedMatrixPtr++; } paddedMatrixPtr++; // padded float } setUniformBytes(blockTypeName, blockInstanceName, uniformName, &packedMatrix, sizeof(packedMatrix), 1, arrayIndex); } } void ShaderUniforms::setFloat3x3Array(const igl::NameHandle& uniformName, const iglu::simdtypes::float3x3* value, size_t count, size_t arrayIndex) { if (device_.getBackendType() == igl::BackendType::Metal || device_.getBackendType() == igl::BackendType::Vulkan) { setUniformBytes(uniformName, value, sizeof(iglu::simdtypes::float3x3), count, arrayIndex); } else { // simdtypes::float3x3 has an extra float per float-vector. // Remove it so we can send the packed version to OpenGL const auto* paddedMatrixPtr = reinterpret_cast(value); auto* packedMatrix = new float[9 * count]; auto* packedMatrixPtr = packedMatrix; for (int n = 0; n < count; n++) { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { *packedMatrixPtr++ = *paddedMatrixPtr++; } paddedMatrixPtr++; // skip over padded float } } setUniformBytes(uniformName, packedMatrix, sizeof(float) * 9, count, arrayIndex); delete[] packedMatrix; } } void ShaderUniforms::setFloat3x3Array(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const iglu::simdtypes::float3x3* value, size_t count, size_t arrayIndex) { auto isOglBlock = device_.getBackendType() == igl::BackendType::OpenGL && bufferDescs_.find(blockTypeName) != bufferDescs_.end(); if (device_.getBackendType() == igl::BackendType::Metal || device_.getBackendType() == igl::BackendType::Vulkan || isOglBlock) { setUniformBytes(blockTypeName, blockInstanceName, memberName, value, sizeof(iglu::simdtypes::float3x3), count, arrayIndex); } else { // simdtypes::float3x3 has an extra float per float-vector. // Remove it so we can send the packed version to OpenGL const size_t size = sizeof(float) * 9u * count; IGL_DEBUG_ASSERT(size <= 65536); float* IGL_RESTRICT packedMatrix = reinterpret_cast(alloca(size)); float* IGL_RESTRICT packedMatrixPtr = packedMatrix; const auto* paddedMatrixPtr = reinterpret_cast(value); for (size_t n = 0; n < count; n++) { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { *packedMatrixPtr++ = *paddedMatrixPtr++; } paddedMatrixPtr++; // skip over padded float } } setUniformBytes(blockTypeName, blockInstanceName, memberName, packedMatrix, sizeof(float) * 9, count, arrayIndex); } } void ShaderUniforms::setFloat4x4(const igl::NameHandle& uniformName, const iglu::simdtypes::float4x4& value, size_t arrayIndex) { setUniformBytes(uniformName, &value, sizeof(iglu::simdtypes::float4x4), 1, arrayIndex); } void ShaderUniforms::setFloat4x4(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const iglu::simdtypes::float4x4& value, size_t arrayIndex) { setUniformBytes(blockTypeName, blockInstanceName, memberName, &value, sizeof(iglu::simdtypes::float4x4), 1, arrayIndex); } void ShaderUniforms::setFloat4x4Array(const igl::NameHandle& uniformName, const iglu::simdtypes::float4x4* value, size_t count, size_t arrayIndex) { setUniformBytes(uniformName, value, sizeof(iglu::simdtypes::float4x4), count, arrayIndex); } void ShaderUniforms::setFloat4x4Array(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const iglu::simdtypes::float4x4* value, size_t count, size_t arrayIndex) { setUniformBytes(blockTypeName, blockInstanceName, memberName, value, sizeof(iglu::simdtypes::float4x4), count, arrayIndex); } void ShaderUniforms::setInt(const igl::NameHandle& uniformName, const iglu::simdtypes::int1& value, size_t arrayIndex) { setUniformBytes(uniformName, &value, sizeof(iglu::simdtypes::int1), 1, arrayIndex); } void ShaderUniforms::setInt(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const iglu::simdtypes::int1& value, size_t arrayIndex) { setUniformBytes(blockTypeName, blockInstanceName, memberName, &value, sizeof(iglu::simdtypes::int1), 1, arrayIndex); } void ShaderUniforms::setInt2(const igl::NameHandle& uniformName, const iglu::simdtypes::int2& value, size_t arrayIndex) { setUniformBytes(uniformName, &value, sizeof(iglu::simdtypes::int2), 1, arrayIndex); } void ShaderUniforms::setInt2(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const iglu::simdtypes::int2& value, size_t arrayIndex) { setUniformBytes(blockTypeName, blockInstanceName, memberName, &value, sizeof(iglu::simdtypes::int2), 1, arrayIndex); } void ShaderUniforms::setIntArray(const igl::NameHandle& uniformName, const iglu::simdtypes::int1* value, size_t count, size_t arrayIndex) { setUniformBytes(uniformName, value, sizeof(iglu::simdtypes::int1), count, arrayIndex); } void ShaderUniforms::setIntArray(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const iglu::simdtypes::int1* value, size_t count, size_t arrayIndex) { setUniformBytes(blockTypeName, blockInstanceName, memberName, value, sizeof(iglu::simdtypes::int1), count, arrayIndex); } void ShaderUniforms::setTexture(const std::string& name, const std::shared_ptr& value, const std::shared_ptr& sampler, IGL_MAYBE_UNUSED size_t arrayIndex) { IGL_DEBUG_ASSERT(arrayIndex == 0, "texture arrays not supported"); auto it = allTexturesByName_.find(name); if (it == allTexturesByName_.end()) { IGL_LOG_ERROR_ONCE("[IGL][Error] Invalid texture name: %s\n", name.c_str()); return; } allTexturesByName_[name] = TextureSlot{.texture = value, .rawTexture = value.get()}; allSamplersByName_[name] = SamplerSlot{.sampler = sampler, .rawSampler = sampler.get()}; } void ShaderUniforms::setTexture(const std::string& name, igl::ITexture* value, const std::shared_ptr& sampler) { auto it = allTexturesByName_.find(name); if (it == allTexturesByName_.end()) { IGL_LOG_ERROR_ONCE("[IGL][Error] Invalid texture name: %s\n", name.c_str()); return; } allTexturesByName_[name] = TextureSlot{.texture = nullptr, .rawTexture = value}; // non-owning allSamplersByName_[name] = SamplerSlot{.sampler = sampler, .rawSampler = sampler.get()}; // owning } void ShaderUniforms::setTexture(const std::string& name, igl::ITexture* value, igl::ISamplerState* sampler) { auto it = allTexturesByName_.find(name); if (it == allTexturesByName_.end()) { IGL_LOG_ERROR_ONCE("[IGL][Error] Invalid texture name: %s\n", name.c_str()); return; } allTexturesByName_[name] = TextureSlot{.texture = nullptr, .rawTexture = value}; // non-owning allSamplersByName_[name] = SamplerSlot{.sampler = nullptr, .rawSampler = sampler}; // non-owning } #if IGL_BACKEND_OPENGL void ShaderUniforms::bindUniformOpenGL(const igl::NameHandle& uniformName, const UniformDesc& uniformDesc, const igl::IRenderPipelineState& pipelineState, igl::IRenderCommandEncoder& encoder) { const igl::BufferArgDesc::BufferMemberDesc& iglMemberDesc = uniformDesc.iglMemberDesc; igl::UniformDesc desc{ .location = pipelineState.getIndexByName(uniformName, igl::ShaderStage::Fragment), .type = iglMemberDesc.type, .numElements = iglMemberDesc.arrayLength, .offset = iglMemberDesc.offset, .elementStride = igl::sizeForUniformType(iglMemberDesc.type), }; if (desc.location >= 0) { auto strongBuffer = uniformDesc.buffer.lock(); if (strongBuffer) { // We are binding individual uniforms. Confirm that iglBuffer is null IGL_DEBUG_ASSERT(strongBuffer->allocation->iglBuffer == nullptr); encoder.bindUniform(desc, strongBuffer->allocation->ptr); } } else { IGL_LOG_ERROR_ONCE("[IGL][Error] Uniform not found in shader: %s\n", uniformName.c_str()); } } #endif void ShaderUniforms::bindBuffer(igl::IDevice& device, const igl::IRenderPipelineState& pipelineState, igl::IRenderCommandEncoder& encoder, BufferDesc* buffer) { if (!buffer) { return; } if (device.getBackendType() == igl::BackendType::OpenGL) { #if IGL_BACKEND_OPENGL const auto& uniformName = buffer->iglBufferDesc.name; if (buffer->iglBufferDesc.isUniformBlock) { IGL_DEBUG_ASSERT(buffer->allocation->iglBuffer != nullptr); buffer->allocation->iglBuffer->upload(buffer->allocation->ptr, igl::BufferRange(buffer->allocation->size, 0)); const auto& glPipelineState = static_cast(pipelineState); encoder.bindBuffer(glPipelineState.getUniformBlockBindingPoint(uniformName), buffer->allocation->iglBuffer.get()); } else { // not a uniform block IGL_DEBUG_ASSERT(buffer->iglBufferDesc.name == buffer->iglBufferDesc.members[0].name); IGL_DEBUG_ASSERT(buffer->uniforms.size() == 1); IGL_DEBUG_ASSERT(buffer->iglBufferDesc.name == buffer->uniforms[0].iglMemberDesc.name); auto& uniformDesc = buffer->uniforms[0]; bindUniformOpenGL(uniformName, uniformDesc, pipelineState, encoder); } #endif } else { if (buffer->allocation->iglBuffer) { uintptr_t subAllocatedOffset = 0; size_t uploadSize = buffer->allocation->size; if (buffer->isSuballocated && buffer->currentAllocation >= 0) { subAllocatedOffset = buffer->currentAllocation * buffer->suballocationsSize; uploadSize = buffer->suballocationsSize; } buffer->allocation->iglBuffer->upload((uint8_t*)buffer->allocation->ptr + subAllocatedOffset, igl::BufferRange(uploadSize, subAllocatedOffset)); encoder.bindBuffer(buffer->iglBufferDesc.bufferIndex, buffer->allocation->iglBuffer.get(), subAllocatedOffset); } else { encoder.bindBytes(buffer->iglBufferDesc.bufferIndex, bindTargetForShaderStage(buffer->iglBufferDesc.shaderStage), buffer->allocation->ptr, buffer->iglBufferDesc.bufferDataSize); } } } // Bind the block which the specified uniform belongs to. void ShaderUniforms::bind(igl::IDevice& device, const igl::IRenderPipelineState& pipelineState, igl::IRenderCommandEncoder& encoder, const igl::NameHandle& uniformName) { auto range = allUniformsByName_.equal_range(uniformName); if (range.first == range.second) { IGL_LOG_ERROR_ONCE("[IGL][Error] Invalid uniform name: %s\n", uniformName.c_str()); return; } for (auto it = range.first; it != range.second; ++it) { auto strongBuffer = it->second.buffer.lock(); bindBuffer(device, pipelineState, encoder, strongBuffer.get()); } } void ShaderUniforms::bind(igl::IDevice& device, const igl::IRenderPipelineState& pipelineState, igl::IRenderCommandEncoder& encoder, const igl::NameHandle& blockName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName) { auto possibleBufferNames = getPossibleBufferAndMemberNames(blockName, blockInstanceName, memberName); for (auto& [bufferName, bufferMemberName] : possibleBufferNames) { auto range = bufferDescs_.equal_range(bufferName); for (auto bufferDescIt = range.first; bufferDescIt != range.second; ++bufferDescIt) { bindBuffer(device, pipelineState, encoder, bufferDescIt->second.get()); } } } void ShaderUniforms::bind(igl::IDevice& device, const igl::IRenderPipelineState& pipelineState, igl::IRenderCommandEncoder& encoder) { for (auto& [name, bufferDesc] : bufferDescs_) { bindBuffer(device, pipelineState, encoder, bufferDesc.get()); } for (auto& textureDesc : textureDescs_) { auto textureIt = allTexturesByName_.find(textureDesc.name); auto samplerIt = allSamplersByName_.find(textureDesc.name); if (textureIt == allTexturesByName_.end() || samplerIt == allSamplersByName_.end()) { IGL_LOG_ERROR_ONCE("[IGL][Warning] No texture set for sampler: %s\n", textureDesc.name.c_str()); continue; } encoder.bindTexture(textureDesc.textureIndex, bindTargetForShaderStage(textureDesc.shaderStage), textureIt->second.rawTexture ? textureIt->second.rawTexture : textureIt->second.texture.get()); // Assumption: each texture has an associated sampler at the same index in Metal encoder.bindSamplerState(textureDesc.textureIndex, bindTargetForShaderStage(textureDesc.shaderStage), samplerIt->second.rawSampler ? samplerIt->second.rawSampler : samplerIt->second.sampler.get()); } } igl::Result ShaderUniforms::setSuballocationIndex(const igl::NameHandle& name, int index) { if (device_.getBackendType() != igl::BackendType::Vulkan) { return igl::Result(igl::Result::Code::Unsupported, "Suballocation is only available for Vulkan for now"); } if (index < 0) { return igl::Result(igl::Result::Code::ArgumentOutOfRange, "Invalid argument, index cannot be < 0"); } auto range = allUniformsByName_.equal_range(name); if (range.first == range.second) { return igl::Result(igl::Result::Code::RuntimeError, "Could not find uniform " + name.toString()); } // At least one of the uniforms should be updated bool setIndexSuccess = false; for (auto it = range.first; it != range.second; ++it) { auto& uniformDesc = it->second; auto strongBuffer = uniformDesc.buffer.lock(); if (!strongBuffer || !strongBuffer->isSuballocated) { continue; } // if index already exists, just update the allocation index if (std::find(strongBuffer->suballocations.begin(), strongBuffer->suballocations.end(), index) != strongBuffer->suballocations.end()) { strongBuffer->currentAllocation = index; } else { // Add new allocation // Make sure we have enough space auto currentSize = strongBuffer->suballocations.size() * strongBuffer->suballocationsSize; if (currentSize + strongBuffer->suballocationsSize > strongBuffer->allocation->size) { return igl::Result(igl::Result::Code::ArgumentOutOfRange, "Cannot add new suballocation, exceeding buffer size of " + std::to_string(strongBuffer->allocation->size)); } strongBuffer->currentAllocation = index; strongBuffer->suballocations.push_back(index); } setIndexSuccess = true; } if (setIndexSuccess) { return igl::Result(); } else { return igl::Result(igl::Result::Code::RuntimeError, "Could not update suballocation index for " + name.toString()); } } bool ShaderUniforms::containsUniform(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName) { auto possibleBufferNames = getPossibleBufferAndMemberNames(blockTypeName, blockInstanceName, memberName); for (auto& [bufferName, bufferMemberName] : possibleBufferNames) { auto bufferDescIt = bufferDescs_.find(bufferName); if (bufferDescIt == bufferDescs_.end()) { continue; } auto& bufferDesc = bufferDescIt->second; if (bufferDesc->memberIndices.find(bufferMemberName) != bufferDesc->memberIndices.end()) { return true; } } return false; } } // namespace iglu::material ================================================ FILE: IGLU/simple_renderer/ShaderUniforms.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include #include #include #include namespace iglu::material { /// Handles allocation, updating and binding of shader uniforms. It uses reflection /// information to generate the underlying data and provides a simple API to manipulate it. class ShaderUniforms final { public: // Setters: use these to update uniforms, individually or in bulk. void setBool(const igl::NameHandle& uniformName, const bool& value, size_t arrayIndex = 0); void setBool(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const bool& value, size_t arrayIndex = 0); void setBoolArray(const igl::NameHandle& uniformName, const bool* value, size_t count = 1, size_t arrayIndex = 0); void setBoolArray(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const bool* value, size_t count = 1, size_t arrayIndex = 0); void setFloat(const igl::NameHandle& uniformName, const iglu::simdtypes::float1& value, size_t arrayIndex = 0); void setFloat(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const iglu::simdtypes::float1& value, size_t arrayIndex = 0); void setFloatArray(const igl::NameHandle& uniformName, const iglu::simdtypes::float1* value, size_t count = 1, size_t arrayIndex = 0); void setFloatArray(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const iglu::simdtypes::float1* value, size_t count = 1, size_t arrayIndex = 0); void setFloat2(const igl::NameHandle& uniformName, const iglu::simdtypes::float2& value, size_t arrayIndex = 0); void setFloat2(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const iglu::simdtypes::float2& value, size_t arrayIndex = 0); void setFloat2Array(const igl::NameHandle& uniformName, const iglu::simdtypes::float2* value, size_t count = 1, size_t arrayIndex = 0); void setFloat2Array(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const iglu::simdtypes::float2* value, size_t count = 1, size_t arrayIndex = 0); void setFloat3(const igl::NameHandle& uniformName, const iglu::simdtypes::float3& value, size_t arrayIndex = 0); void setFloat3Array(const igl::NameHandle& uniformName, const iglu::simdtypes::float3* value, size_t count = 1, size_t arrayIndex = 0); void setFloat4(const igl::NameHandle& uniformName, const iglu::simdtypes::float4& value, size_t arrayIndex = 0); void setFloat4(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const iglu::simdtypes::float4& value, size_t arrayIndex = 0); void setFloat4Array(const igl::NameHandle& uniformName, const iglu::simdtypes::float4* value, size_t count = 1, size_t arrayIndex = 0); void setFloat4Array(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const iglu::simdtypes::float4* value, size_t count = 1, size_t arrayIndex = 0); void setFloat2x2(const igl::NameHandle& uniformName, const iglu::simdtypes::float2x2& value, size_t arrayIndex = 0); void setFloat2x2(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const iglu::simdtypes::float2x2& value, size_t arrayIndex = 0); void setFloat2x2Array(const igl::NameHandle& uniformName, const iglu::simdtypes::float2x2* value, size_t count = 1, size_t arrayIndex = 0); void setFloat2x2Array(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const iglu::simdtypes::float2x2* value, size_t count = 1, size_t arrayIndex = 0); void setFloat3x3(const igl::NameHandle& uniformName, const iglu::simdtypes::float3x3& value, size_t arrayIndex = 0); void setFloat3x3(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& uniformName, const iglu::simdtypes::float3x3& value, size_t arrayIndex = 0); void setFloat3x3Array(const igl::NameHandle& uniformName, const iglu::simdtypes::float3x3* value, size_t count = 1, size_t arrayIndex = 0); void setFloat3x3Array(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const iglu::simdtypes::float3x3* value, size_t count = 1, size_t arrayIndex = 0); void setFloat4x4(const igl::NameHandle& uniformName, const iglu::simdtypes::float4x4& value, size_t arrayIndex = 0); void setFloat4x4(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const iglu::simdtypes::float4x4& value, size_t arrayIndex = 0); void setFloat4x4Array(const igl::NameHandle& uniformName, const iglu::simdtypes::float4x4* value, size_t count = 1, size_t arrayIndex = 0); void setFloat4x4Array(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const iglu::simdtypes::float4x4* value, size_t count = 1, size_t arrayIndex = 0); void setInt(const igl::NameHandle& uniformName, const iglu::simdtypes::int1& value, size_t arrayIndex = 0); void setInt(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const iglu::simdtypes::int1& value, size_t arrayIndex = 0); void setIntArray(const igl::NameHandle& uniformName, const iglu::simdtypes::int1* value, size_t count = 1, size_t arrayIndex = 0); void setIntArray(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const iglu::simdtypes::int1* value, size_t count = 1, size_t arrayIndex = 0); void setInt2(const igl::NameHandle& uniformName, const iglu::simdtypes::int2& value, size_t arrayIndex = 0); void setInt2(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const iglu::simdtypes::int2& value, size_t arrayIndex = 0); void setTexture(const std::string& name, const std::shared_ptr& value, const std::shared_ptr& sampler, size_t arrayIndex = 0); void setTexture(const std::string& name, igl::ITexture* value, const std::shared_ptr& sampler); void setTexture(const std::string& name, igl::ITexture* value, igl::ISamplerState* sampler); /// Binds all relevant states in 'encoder' in preparation for drawing. void bind(igl::IDevice& device, const igl::IRenderPipelineState& pipelineState, igl::IRenderCommandEncoder& encoder); void bind(igl::IDevice& device, const igl::IRenderPipelineState& pipelineState, igl::IRenderCommandEncoder& encoder, const igl::NameHandle& uniformName); void bind(igl::IDevice& device, const igl::IRenderPipelineState& pipelineState, igl::IRenderCommandEncoder& encoder, const igl::NameHandle& blockName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName); /** * Uniform/Storage buffers can be suballocated, for scenarios where * we only want to update a portion of a buffer * * Each allocation has the same size, so we don't need to track * the size per allocation. When setSubAllocationIndex is called followed * by the uniform being updated, it will only update with the offset = index * allocationSize * * @param name The uniform name * @param index The index within the buffer * @return indices whether setting the index was successful or not */ igl::Result setSuballocationIndex(const igl::NameHandle& name, int index); inline bool containsUniform(const igl::NameHandle& uniformName) const { return allUniformsByName_.count(uniformName) > 0; } bool containsUniform(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName); class MemoizedQualifiedMemberNameCalculator { public: igl::NameHandle getQualifiedMemberName(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName) const; private: mutable std::unordered_map, igl::NameHandle> qualifiedMemberNameCache_; }; igl::NameHandle getQualifiedMemberName(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName); ShaderUniforms(igl::IDevice& device, const igl::IRenderPipelineReflection& reflection, bool enableSuballocationforVulkan = true); ~ShaderUniforms(); private: struct BufferAllocation { void* ptr = nullptr; size_t size = 0; std::shared_ptr iglBuffer; bool dirty = false; BufferAllocation(void* ptr, size_t size, std::shared_ptr buffer) : ptr(ptr), size(size), iglBuffer(std::move(buffer)) {} }; struct BufferDesc; struct UniformDesc { igl::BufferArgDesc::BufferMemberDesc iglMemberDesc; std::weak_ptr buffer; }; struct BufferDesc { igl::BufferArgDesc iglBufferDesc; std::shared_ptr allocation; std::vector uniforms; std::unordered_map memberIndices; // For suballocation: bool isSuballocated = false; size_t suballocationsSize = 0; // this is a fixed size int currentAllocation = -1; // Which allocation are we updating/binding? std::vector suballocations; }; igl::IDevice& device_; std::vector> allocations_; std::unordered_multimap> bufferDescs_; std::unordered_multimap allUniformsByName_; MemoizedQualifiedMemberNameCalculator memoizedQualifiedMemberNameCalculator_; struct TextureSlot { std::shared_ptr texture; igl::ITexture* rawTexture = nullptr; }; struct SamplerSlot { std::shared_ptr sampler; igl::ISamplerState* rawSampler = nullptr; }; std::vector textureDescs_; std::unordered_map allTexturesByName_; std::unordered_map allSamplersByName_; std::vector> getPossibleBufferAndMemberNames( const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName); void setUniformBytes(const UniformDesc& uniformDesc, const void* data, size_t elementSize, size_t count, size_t arrayIndex); void setUniformBytes(const igl::NameHandle& blockTypeName, const igl::NameHandle& blockInstanceName, const igl::NameHandle& memberName, const void* data, size_t elementSize, size_t count, size_t arrayIndex); void setUniformBytes(const igl::NameHandle& name, const void* data, size_t elementSize, size_t count, size_t arrayIndex); void bindUniformOpenGL(const igl::NameHandle& uniformName, const UniformDesc& uniformDesc, const igl::IRenderPipelineState& pipelineState, igl::IRenderCommandEncoder& encoder); void bindBuffer(igl::IDevice& device, const igl::IRenderPipelineState& pipelineState, igl::IRenderCommandEncoder& encoder, BufferDesc* buffer); }; } // namespace iglu::material ================================================ FILE: IGLU/simple_renderer/VertexData.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @MARK:COVERAGE_EXCLUDE_FILE #include "VertexData.h" #include namespace iglu::vertexdata { VertexData::VertexData(std::shared_ptr vis, std::shared_ptr vertexBuffer, std::shared_ptr indexBuffer, igl::IndexFormat indexBufferFormat, const PrimitiveDesc& primitiveDesc, igl::PrimitiveType topology) : vis_(std::move(vis)), vb_(std::move(vertexBuffer)), ib_(std::move(indexBuffer)), ibFormat_(indexBufferFormat), primitiveDesc_(primitiveDesc), usedBytes_(vb_->getSizeInBytes()), topology_(topology) {} VertexData::VertexData(igl::IDevice& device, const std::shared_ptr& vis, size_t bufferSize) : VertexData(vis, device.createBuffer(igl::BufferDesc{.type = igl::BufferDesc::BufferTypeBits::Vertex, .data = nullptr, .length = bufferSize, .storage = igl::ResourceStorage::Shared}, nullptr), nullptr, igl::IndexFormat::UInt16, {}, igl::PrimitiveType::Point) { usedBytes_ = 0; } void VertexData::populatePipelineDescriptor(igl::RenderPipelineDesc& pipelineDesc) const { pipelineDesc.vertexInputState = vis_; pipelineDesc.topology = topology_; pipelineDesc.frontFaceWinding = primitiveDesc_.frontFaceWinding; } bool VertexData::appendData(const void* data, size_t size, size_t numPrimitives) { IGL_DEBUG_ASSERT(vb_); if (!vb_) { return false; } if (usedBytes_ + size > vb_->getSizeInBytes()) { return false; } vb_->upload(data, {size, usedBytes_}); primitiveDesc_.numEntries += numPrimitives; usedBytes_ += size; return true; } void VertexData::draw(igl::IRenderCommandEncoder& commandEncoder) { if (primitiveDesc_.numEntries == 0) { return; } // Assumption: we don't need buffer offset if (vb_) { commandEncoder.bindVertexBuffer(0, *vb_); } if (ib_) { commandEncoder.bindIndexBuffer(*ib_, ibFormat_, primitiveDesc_.offset); commandEncoder.drawIndexed(primitiveDesc_.numEntries); } else { commandEncoder.draw(primitiveDesc_.numEntries, 1, primitiveDesc_.offset); } } PrimitiveDesc& VertexData::primitiveDesc() { return primitiveDesc_; } std::shared_ptr VertexData::vertexInputState() { return vis_; } } // namespace iglu::vertexdata ================================================ FILE: IGLU/simple_renderer/VertexData.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @MARK:COVERAGE_EXCLUDE_FILE #pragma once #include #include #include namespace iglu::vertexdata { /// Describes how the underlying APIs should interpret the buffers when drawing. struct PrimitiveDesc { size_t numEntries = 0; size_t offset = 0; igl::WindingMode frontFaceWinding = igl::WindingMode::CounterClockwise; }; /// Consolidates all vertex data input in a single place. Also handles binding and drawing. class VertexData final { public: /// Preparates some of the rendering pipeline descriptors for this vertex data. Must be called /// before draw(). void populatePipelineDescriptor(igl::RenderPipelineDesc& pipelineDesc) const; /// Invokes the draw command of the lower level APIs. void draw(igl::IRenderCommandEncoder& commandEncoder); PrimitiveDesc& primitiveDesc(); std::shared_ptr vertexInputState(); /// The arguments fully describe the vertex data and how various aspects of /// the rendering pipeline should interpret that data. /// @param vis Describes the layout of all the buffers /// @param vertexBuffer Buffer that contains the actual vertex information. /// @param indexBuffer Optional. /// @param indexBufferFormat 16 or 32-bit format. Ignored when indexBuffer is nullptr. /// @param primitiveDesc Additional information for the internal draw commands. VertexData(std::shared_ptr vis, std::shared_ptr vertexBuffer, std::shared_ptr indexBuffer, igl::IndexFormat indexBufferFormat, const PrimitiveDesc& primitiveDesc, igl::PrimitiveType topology = igl::PrimitiveType::Triangle); VertexData(igl::IDevice& device, const std::shared_ptr& vis, size_t bufferSize); ~VertexData() = default; /// Appends data to the vertex buffer. /// @param data Pointer to the new data. The memory will be copied. /// @param size Size of the new data. /// @param numPrimitives The number of draw primitives the new data /// corresponds to. The internal PrimitiveDesc will be updated. bool appendData(const void* data, size_t size, size_t numPrimitives); igl::IBuffer& indexBuffer() { IGL_DEBUG_ASSERT(ib_); return *ib_; } igl::IBuffer& vertexBuffer() { IGL_DEBUG_ASSERT(vb_); return *vb_; } protected: std::shared_ptr vis_; std::shared_ptr vb_; std::shared_ptr ib_; igl::IndexFormat ibFormat_ = igl::IndexFormat::UInt16; PrimitiveDesc primitiveDesc_; size_t usedBytes_ = 0; const igl::PrimitiveType topology_ = igl::PrimitiveType::Triangle; }; } // namespace iglu::vertexdata ================================================ FILE: IGLU/state_pool/ComputePipelineStatePool.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace iglu::state_pool { std::shared_ptr ComputePipelineStatePool::createStateObject( igl::IDevice& dev, const igl::ComputePipelineDesc& desc, igl::Result* outResult) { return dev.createComputePipeline(desc, outResult); } } // namespace iglu::state_pool ================================================ FILE: IGLU/state_pool/ComputePipelineStatePool.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl { class IDevice; } // namespace igl namespace iglu::state_pool { class ComputePipelineStatePool : public LRUStatePool { public: private: std::shared_ptr createStateObject( igl::IDevice& dev, const igl::ComputePipelineDesc& desc, igl::Result* outResult) override; }; } // namespace iglu::state_pool ================================================ FILE: IGLU/state_pool/DepthStencilStatePool.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace iglu::state_pool { std::shared_ptr DepthStencilStatePool::createStateObject( igl::IDevice& dev, const igl::DepthStencilStateDesc& desc, igl::Result* outResult) { return dev.createDepthStencilState(desc, outResult); } } // namespace iglu::state_pool ================================================ FILE: IGLU/state_pool/DepthStencilStatePool.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl { class IDevice; } // namespace igl namespace iglu::state_pool { class DepthStencilStatePool : public LRUStatePool { public: private: std::shared_ptr createStateObject(igl::IDevice& dev, const igl::DepthStencilStateDesc& desc, igl::Result* outResult) override; }; } // namespace iglu::state_pool ================================================ FILE: IGLU/state_pool/RenderPipelineStatePool.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include using namespace igl; namespace iglu::state_pool { ///-------------------------------------- /// MARK: - RenderPipelineStatePool std::shared_ptr RenderPipelineStatePool::createStateObject( igl::IDevice& dev, const igl::RenderPipelineDesc& desc, igl::Result* outResult) { return dev.createRenderPipeline(desc, outResult); } ///-------------------------------------- /// MARK: - CountedRenderPipelineStatePool CountedRenderPipelineStatePool::CountedRenderPipelineStatePool(uint8_t compactDelay) noexcept : compactDelay_(compactDelay) {} std::shared_ptr CountedRenderPipelineStatePool::getOrCreate( igl::IDevice& dev, const igl::RenderPipelineDesc& desc, igl::Result* outResult) { auto stateIt = cache_.find(desc); if (stateIt != cache_.end()) { Result::setOk(outResult); // Reset the counter, we are using things. stateIt->second.second = 0; return stateIt->second.first; } auto state = dev.createRenderPipeline(desc, outResult); if (state) { cache_.emplace(desc, std::make_pair(state, 0)); Result::setOk(outResult); return state; } return nullptr; } void CountedRenderPipelineStatePool::compact() { auto it = cache_.begin(); while (it != cache_.end()) { // Only care about compacting the ones that own uniquely if (it->second.first.use_count() == 1) { auto& itemDelay = it->second.second; itemDelay += 1; if (itemDelay > compactDelay_) { it = cache_.erase(it); continue; } } it++; } } } // namespace iglu::state_pool ================================================ FILE: IGLU/state_pool/RenderPipelineStatePool.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl { class IDevice; } // namespace igl namespace iglu::state_pool { class RenderPipelineStatePool : public LRUStatePool { public: private: std::shared_ptr createStateObject(igl::IDevice& dev, const igl::RenderPipelineDesc& desc, igl::Result* outResult) override; }; /// Version of render pipeline state pool that does reference and "use count"ing. /// Compacts and removes the cached pipeline states on expiration of use, if there class CountedRenderPipelineStatePool final : public IStatePool { public: /// Create pipeline state pool, with a specified delay after which - a given pipeline /// state is no longer being pooled. explicit CountedRenderPipelineStatePool(uint8_t compactDelay) noexcept; std::shared_ptr getOrCreate(igl::IDevice& dev, const igl::RenderPipelineDesc& desc, igl::Result* outResult) override; /// Compact the render pipeline state, triggering deletion of elements in the /// pool that are expired. void compact(); private: const uint8_t compactDelay_; std::unordered_map, uint32_t>> cache_; }; } // namespace iglu::state_pool ================================================ FILE: IGLU/state_pool/StatePool.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include namespace igl { class IDevice; } namespace iglu::state_pool { ///-------------------------------------- /// MARK: - IStatePool /// Abstract class that describes a state pool of `TStateObject` objects, /// that are created based off of a given `TDescriptor` and cached in a pool. template class IStatePool { public: /// Get or create a given state object, given a descriptor. virtual std::shared_ptr getOrCreate(igl::IDevice& dev, const TDescriptor& desc, igl::Result* outResult) = 0; virtual ~IStatePool() = default; }; ///-------------------------------------- /// MARK: - LRUStatePool template class LRUStatePool : public IStatePool { public: void setCacheSize(uint32_t maxCacheSize) { maxCacheSize_ = maxCacheSize; while (stateList_.size() >= maxCacheSize_) { deleteLastUsed(); } } // Implememnts LRU Cache https://www.geeksforgeeks.org/lru-cache-implementation/ // Gets or creates a state object and moves the strong reference to it to the beginning of the // pool's queue so it remains in cache longer if frequently used std::shared_ptr getOrCreate(igl::IDevice& dev, const TDescriptor& desc, igl::Result* outResult) final { auto it = stateMap_.find(desc); if (it != stateMap_.cend()) { // Cache hit if (it->second != stateList_.begin()) { stateList_.splice(stateList_.begin(), stateList_, it->second); } } else { // Cache miss if (stateList_.size() >= maxCacheSize_) { // If the cache is full delete the last used deleteLastUsed(); } // Add new element to start of queue auto stateResource = createStateObject(dev, desc, outResult); if (!IGL_DEBUG_VERIFY(stateResource != nullptr)) { return nullptr; } auto stateDesc = desc; // force r-value c-tor: pair(U1&& x, U2&& y) stateList_.push_front(TStateItem(std::move(stateDesc), std::move(stateResource))); it = stateMap_.insert(std::make_pair(desc, stateList_.begin())).first; } return it->second->second; } private: using TStateItem = std::pair>; virtual std::shared_ptr createStateObject(igl::IDevice& dev, const TDescriptor& desc, igl::Result* outResult) = 0; void deleteLastUsed() { auto& last = stateList_.back(); auto key = last.first; stateList_.pop_back(); stateMap_.erase(key); } // Queue to store the values std::list stateList_; // Map to check existance std::unordered_map::iterator> stateMap_; uint32_t maxCacheSize_ = 1024; // maximum capacity of cache }; } // namespace iglu::state_pool ================================================ FILE: IGLU/state_pool/VertexInputStatePool.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace iglu::state_pool { std::shared_ptr VertexInputStatePool::createStateObject( igl::IDevice& dev, const igl::VertexInputStateDesc& desc, igl::Result* outResult) { return dev.createVertexInputState(desc, outResult); } } // namespace iglu::state_pool ================================================ FILE: IGLU/state_pool/VertexInputStatePool.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl { class IDevice; } // namespace igl namespace iglu::state_pool { class VertexInputStatePool : public LRUStatePool { public: private: std::shared_ptr createStateObject(igl::IDevice& dev, const igl::VertexInputStateDesc& desc, igl::Result* outResult) override; }; } // namespace iglu::state_pool ================================================ FILE: IGLU/texture_accessor/ITextureAccessor.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace iglu::textureaccessor { enum class RequestStatus : uint8_t { Ready = 0, NotInitialized, InProgress, }; /// Interface for getting CPU access to GPU texture data class ITextureAccessor { public: explicit ITextureAccessor(std::shared_ptr texture) : texture_(std::move(texture)) {} virtual ~ITextureAccessor() = default; // Start reading data from the ITexture GPU resource, to be accessed later // Receive an optional texture an input. It MUST be the same size as previous texture virtual void requestBytes(igl::ICommandQueue& commandQueue, std::shared_ptr texture = nullptr) = 0; // Get the status of the request. Returns RequestStatus::Ready if requestBytes() has finished // reading texture data. virtual RequestStatus getRequestStatus() = 0; /** Get the texture bytes read by requestBytes(). If there is an in-progress read, we will synchronously wait for it to complete and then return the data. */ virtual std::vector& getBytes() = 0; // copy data into preallocated buffer, returns copied data in bytes virtual size_t copyBytes(unsigned char* ptr, size_t length) = 0; // Synchronously read the bytes of the ITexture. This is not recommended; using requestBytes() and // getBytes() is more performant when getBytes() is called later. // Receive an optional texture an input. It MUST be the same size as previous texture std::vector& requestAndGetBytesSync( igl::ICommandQueue& commandQueue, std::shared_ptr texture = nullptr) { requestBytes(commandQueue, std::move(texture)); return getBytes(); } // Synchronously read the bytes of the ITexture. This is not recommended; using requestBytes() and // copyBytes() is more performant when copyBytes() is called later. // Receive an optional texture an input. It MUST be the same size as previous texture size_t requestAndCopyBytesSync(igl::ICommandQueue& commandQueue, unsigned char* ptr, size_t length, std::shared_ptr texture = nullptr) { requestBytes(commandQueue, std::move(texture)); return copyBytes(ptr, length); } [[nodiscard]] std::shared_ptr getTexture() const { return texture_; } protected: std::shared_ptr texture_; }; } // namespace iglu::textureaccessor ================================================ FILE: IGLU/texture_accessor/MetalTextureAccessor.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include "ITextureAccessor.h" #include #include #include #include namespace iglu::textureaccessor { class MetalTextureAccessor : public ITextureAccessor { public: MetalTextureAccessor(std::shared_ptr texture, igl::IDevice& device); void requestBytes(igl::ICommandQueue& commandQueue, std::shared_ptr texture = nullptr) override; RequestStatus getRequestStatus() override; std::vector& getBytes() override; size_t copyBytes(unsigned char* ptr, size_t length) override; private: std::vector latestBytesRead_; RequestStatus status_ = RequestStatus::NotInitialized; size_t textureWidth_ = 0; size_t textureHeight_ = 0; size_t textureBytesPerRow_ = 0; size_t textureBytesPerImage_ = 0; std::shared_ptr readBuffer_ = nullptr; std::shared_ptr lastRequestCommandBuffer_ = nullptr; }; } // namespace iglu::textureaccessor ================================================ FILE: IGLU/texture_accessor/MetalTextureAccessor.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "MetalTextureAccessor.h" #include "ITextureAccessor.h" #include #include #include #include #include #if defined(IGL_CMAKE_BUILD) #include #else #include #endif namespace iglu::textureaccessor { MetalTextureAccessor::MetalTextureAccessor(std::shared_ptr texture, igl::IDevice& device) : ITextureAccessor(std::move(texture)) { auto& iglMetalTexture = static_cast(*texture_); IGL_DEBUG_ASSERT(iglMetalTexture.get() != nullptr); const auto dimensions = iglMetalTexture.getDimensions(); textureWidth_ = dimensions.width; textureHeight_ = dimensions.height; const auto& properties = iglMetalTexture.getProperties(); textureBytesPerRow_ = properties.getBytesPerRow(textureWidth_); textureBytesPerImage_ = properties.getBytesPerRange(iglMetalTexture.getFullRange()); latestBytesRead_.resize(textureBytesPerImage_); igl::BufferDesc readBufferDesc; readBufferDesc.storage = igl::ResourceStorage::Shared; readBufferDesc.length = textureBytesPerImage_; igl::Result res; readBuffer_ = device.createBuffer(readBufferDesc, &res); IGL_DEBUG_ASSERT(res.isOk()); IGL_DEBUG_ASSERT(static_cast(*readBuffer_).get() != nullptr); } void MetalTextureAccessor::requestBytes(igl::ICommandQueue& commandQueue, std::shared_ptr texture) { if (texture) { IGL_DEBUG_ASSERT(textureWidth_ == texture->getDimensions().width && textureHeight_ == texture->getDimensions().height); texture_ = std::move(texture); } auto metalTexture = static_cast(*texture_).get(); IGL_DEBUG_ASSERT(metalTexture != nullptr); auto metalReadBuffer = static_cast(*readBuffer_).get(); igl::Result res; const igl::CommandBufferDesc desc; auto iglMtlCommandBuffer = commandQueue.createCommandBuffer(desc, &res); IGL_DEBUG_ASSERT(res.isOk()); auto metalCmdBuffer = static_cast(*iglMtlCommandBuffer).get(); id blitEncoder = [metalCmdBuffer blitCommandEncoder]; [blitEncoder copyFromTexture:metalTexture sourceSlice:0 sourceLevel:0 sourceOrigin:MTLOriginMake(0, 0, 0) sourceSize:MTLSizeMake(textureWidth_, textureHeight_, 1) toBuffer:metalReadBuffer destinationOffset:0 destinationBytesPerRow:textureBytesPerRow_ destinationBytesPerImage:textureBytesPerImage_]; [blitEncoder endEncoding]; lastRequestCommandBuffer_ = iglMtlCommandBuffer; status_ = RequestStatus::InProgress; [metalCmdBuffer addCompletedHandler:^(id cb) { checked_memcpy_robust(latestBytesRead_.data(), latestBytesRead_.size(), metalReadBuffer.contents, metalReadBuffer.length, textureBytesPerImage_); status_ = RequestStatus::Ready; }]; [metalCmdBuffer commit]; } size_t MetalTextureAccessor::copyBytes(unsigned char* ptr, size_t length) { if (length < latestBytesRead_.size()) { return 0; } const size_t count = latestBytesRead_.size(); checked_memcpy_robust(ptr, length, latestBytesRead_.data(), count, count); return count; } RequestStatus MetalTextureAccessor::getRequestStatus() { return status_; } std::vector& MetalTextureAccessor::getBytes() { if (status_ == RequestStatus::InProgress) { lastRequestCommandBuffer_->waitUntilCompleted(); } return latestBytesRead_; } } // namespace iglu::textureaccessor ================================================ FILE: IGLU/texture_accessor/OpenGLTextureAccessor.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "OpenGLTextureAccessor.h" #include "ITextureAccessor.h" #if IGL_BACKEND_OPENGL #include #include #include #include #include #include #if defined(IGL_CMAKE_BUILD) #include #else #include #endif namespace iglu::textureaccessor { OpenGLTextureAccessor::OpenGLTextureAccessor(std::shared_ptr texture, igl::IDevice& device) : ITextureAccessor(std::move(texture)) { // glReadPixels requires a that the texture be attached to a framebuffer igl::FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = texture_; frameBuffer_ = device.createFramebuffer(framebufferDesc, nullptr); auto& oglTexture = static_cast(*texture_); const auto dimensions = oglTexture.getDimensions(); textureWidth_ = dimensions.width; textureHeight_ = dimensions.height; textureBytesPerImage_ = oglTexture.getProperties().getBytesPerRange(oglTexture.getFullRange()); latestBytesRead_.resize(textureBytesPerImage_); auto& context = oglTexture.getContext(); const auto& deviceFeatures = context.deviceFeatures(); asyncReadbackSupported_ = deviceFeatures.hasInternalFeature(igl::opengl::InternalFeatures::PixelBufferObject) && deviceFeatures.hasInternalFeature(igl::opengl::InternalFeatures::Sync) && deviceFeatures.hasFeature(igl::DeviceFeatures::MapBufferRange); if (asyncReadbackSupported_) { // Create PBO and allocate size context.genBuffers((GLsizei)1, &pboId_); context.bindBuffer(GL_PIXEL_PACK_BUFFER, pboId_); context.bufferData(GL_PIXEL_PACK_BUFFER, textureBytesPerImage_, nullptr, GL_DYNAMIC_READ); context.bindBuffer(GL_PIXEL_PACK_BUFFER, 0); } } void OpenGLTextureAccessor::requestBytes(igl::ICommandQueue& commandQueue, std::shared_ptr texture) { dataCopied_ = false; if (texture) { IGL_DEBUG_ASSERT(textureWidth_ == texture->getDimensions().width && textureHeight_ == texture->getDimensions().height); texture_ = std::move(texture); frameBuffer_->updateDrawable(texture_); textureAttached_ = false; } if (asyncReadbackSupported_) { auto& glTexture = static_cast(*texture_); auto& context = glTexture.getContext(); auto* oglFrameBuffer = static_cast(&(*frameBuffer_)); oglFrameBuffer->bindBuffer(); oglFrameBuffer->bindBufferForRead(); if (!textureAttached_) { igl::opengl::Texture::AttachmentParams params{ .face = 0, .mipLevel = 0, .layer = 0, .read = true, .stereo = false, }; glTexture.attachAsColor(0u, params); textureAttached_ = true; } const auto& properties = glTexture.getProperties(); context.pixelStorei(GL_PACK_ALIGNMENT, glTexture.getAlignment(properties.getBytesPerRow(textureWidth_))); // Start transferring from framebuffer -> PBO context.bindBuffer(GL_PIXEL_PACK_BUFFER, pboId_); context.readPixels(0, 0, textureWidth_, textureHeight_, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); context.bindBuffer(GL_PIXEL_PACK_BUFFER, 0); sync_ = context.fenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); status_ = RequestStatus::InProgress; return; } // Async readback not supported const auto range = igl::TextureRangeDesc::new2D(0, 0, textureWidth_, textureHeight_); frameBuffer_->copyBytesColorAttachment(commandQueue, 0, latestBytesRead_.data(), range); dataCopied_ = true; status_ = RequestStatus::Ready; } RequestStatus OpenGLTextureAccessor::getRequestStatus() { if (asyncReadbackSupported_ && status_ == RequestStatus::InProgress) { auto& texture = static_cast(*texture_); auto& context = texture.getContext(); // If a read is in progress, check whether it has completed int result = 0; int valuesLength = 0; context.getSynciv(sync_, GL_SYNC_STATUS, 1, &valuesLength, &result); IGL_DEBUG_ASSERT(valuesLength == 1); status_ = result == GL_SIGNALED ? RequestStatus::Ready : RequestStatus::InProgress; if (status_ == RequestStatus::Ready) { context.deleteSync(sync_); sync_ = nullptr; } } return status_; } std::vector& OpenGLTextureAccessor::getBytes() { copyBytes(latestBytesRead_.data(), latestBytesRead_.size()); return latestBytesRead_; } size_t OpenGLTextureAccessor::copyBytes(unsigned char* ptr, size_t length) { if (length < textureBytesPerImage_) { dataCopied_ = false; return 0; } if (asyncReadbackSupported_ && status_ != RequestStatus::NotInitialized && !dataCopied_) { auto& texture = static_cast(*texture_); auto& context = texture.getContext(); context.bindBuffer(GL_PIXEL_PACK_BUFFER, pboId_); auto* bytes = context.mapBufferRange(GL_PIXEL_PACK_BUFFER, 0, textureBytesPerImage_, GL_MAP_READ_BIT); if (IGL_DEBUG_VERIFY(bytes)) { checked_memcpy_robust(ptr, length, bytes, textureBytesPerImage_, textureBytesPerImage_); length = textureBytesPerImage_; dataCopied_ = true; status_ = RequestStatus::Ready; } else { dataCopied_ = false; length = 0; } context.unmapBuffer(GL_PIXEL_PACK_BUFFER); context.bindBuffer(GL_PIXEL_PACK_BUFFER, 0); if (sync_ != nullptr) { context.deleteSync(sync_); sync_ = nullptr; } } return length; } } // namespace iglu::textureaccessor #endif ================================================ FILE: IGLU/texture_accessor/OpenGLTextureAccessor.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include "ITextureAccessor.h" #include #include #include #include #if IGL_BACKEND_OPENGL #include namespace iglu::textureaccessor { class OpenGLTextureAccessor : public ITextureAccessor { public: OpenGLTextureAccessor(std::shared_ptr texture, igl::IDevice& device); void requestBytes(igl::ICommandQueue& commandQueue, std::shared_ptr texture = nullptr) override; RequestStatus getRequestStatus() override; std::vector& getBytes() override; size_t copyBytes(unsigned char* ptr, size_t length) override; private: std::vector latestBytesRead_; RequestStatus status_ = RequestStatus::NotInitialized; std::shared_ptr frameBuffer_; size_t textureWidth_ = 0; size_t textureHeight_ = 0; size_t textureBytesPerImage_ = 0; GLuint pboId_ = 0; GLsync sync_ = nullptr; bool dataCopied_ = false; bool asyncReadbackSupported_ = false; bool textureAttached_ = false; }; } // namespace iglu::textureaccessor #endif ================================================ FILE: IGLU/texture_accessor/TextureAccessorFactory.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "TextureAccessorFactory.h" #include "ITextureAccessor.h" #if IGL_BACKEND_OPENGL #include "OpenGLTextureAccessor.h" #endif #if IGL_BACKEND_VULKAN #include "VulkanTextureAccessor.h" #endif #include #if IGL_PLATFORM_APPLE #include "MetalTextureAccessor.h" #endif namespace iglu::textureaccessor { std::unique_ptr TextureAccessorFactory::createTextureAccessor( igl::BackendType backendType, const std::shared_ptr& texture, igl::IDevice& device) { switch (backendType) { #if IGL_BACKEND_OPENGL case igl::BackendType::OpenGL: return std::make_unique(texture, device); #endif // IGL_BACKEND_OPENGL #if IGL_PLATFORM_APPLE case igl::BackendType::Metal: return std::make_unique(texture, device); #endif // IGL_PLATFORM_APPLE #if IGL_BACKEND_VULKAN case igl::BackendType::Vulkan: return std::make_unique(texture); #endif default: IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); return nullptr; } } } // namespace iglu::textureaccessor ================================================ FILE: IGLU/texture_accessor/TextureAccessorFactory.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include "ITextureAccessor.h" #include #include #include namespace iglu::textureaccessor { class TextureAccessorFactory { public: static std::unique_ptr createTextureAccessor( igl::BackendType backendType, const std::shared_ptr& texture, igl::IDevice& device); }; } // namespace iglu::textureaccessor ================================================ FILE: IGLU/texture_accessor/VulkanTextureAccessor.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "VulkanTextureAccessor.h" #include "ITextureAccessor.h" #if IGL_BACKEND_VULKAN #include #include #include #include #endif #if defined(IGL_CMAKE_BUILD) #include #else #include #endif namespace iglu::textureaccessor { VulkanTextureAccessor::VulkanTextureAccessor(std::shared_ptr texture) : ITextureAccessor(std::move(texture)) { assignTexture(texture_); } void VulkanTextureAccessor::assignTexture(std::shared_ptr texture) { if (!texture) { return; } #if IGL_BACKEND_VULKAN auto* vkTexture = static_cast(texture.get()); const igl::vulkan::VulkanImage& vkImage = vkTexture->getVulkanTexture().image_; vkImage_ = vkImage.getVkImage(); ctx_ = vkImage.ctx_; vkImageAspectFlags_ = vkTexture->getVulkanTexture().imageView_.getVkImageAspectFlags(); const auto textureFormatProperties = igl::TextureFormatProperties::fromTextureFormat(texture->getFormat()); numBytesRequired_ = static_cast(textureFormatProperties.getBytesPerRow(texture->getSize().width) * textureFormatProperties.getRows(texture->getFullRange())); textureWidth_ = texture->getSize().width; textureHeight_ = texture->getSize().height; vkImageFormat_ = vkImage.imageFormat_; vkImageLayout_ = vkImage.imageLayout_; bytesPerRow_ = textureFormatProperties.getBytesPerRow(texture->getSize().width); #endif texture_ = std::move(texture); } void VulkanTextureAccessor::requestBytes(igl::ICommandQueue& /*commandQueue*/, std::shared_ptr texture) { status_ = RequestStatus::InProgress; if (texture != nullptr) { assignTexture(texture); } if (numBytesRequired_ != latestBytesRead_.size()) { latestBytesRead_.resize(numBytesRequired_); } IGL_DEBUG_ASSERT(texture_ != nullptr, "texture_ is nullptr"); status_ = RequestStatus::Ready; } size_t VulkanTextureAccessor::copyBytes(unsigned char* ptr, size_t length) { if (length < numBytesRequired_) { return 0; } #if IGL_BACKEND_VULKAN ctx_->stagingDevice_->getImageData2D( vkImage_, 0, 0, VkRect2D{VkOffset2D{0, 0}, VkExtent2D{textureWidth_, textureHeight_}}, igl::TextureFormatProperties::fromTextureFormat(texture_->getFormat()), vkImageFormat_, vkImageLayout_, VK_IMAGE_ASPECT_COLOR_BIT, ptr, bytesPerRow_, false); #endif return numBytesRequired_; } RequestStatus VulkanTextureAccessor::getRequestStatus() { return status_; } std::vector& VulkanTextureAccessor::getBytes() { copyBytes(latestBytesRead_.data(), latestBytesRead_.size()); return latestBytesRead_; } } // namespace iglu::textureaccessor ================================================ FILE: IGLU/texture_accessor/VulkanTextureAccessor.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include "ITextureAccessor.h" #include #include #include #if IGL_BACKEND_VULKAN #include #endif namespace iglu::textureaccessor { class VulkanTextureAccessor : public ITextureAccessor { public: explicit VulkanTextureAccessor(std::shared_ptr texture); void requestBytes(igl::ICommandQueue& commandQueue, std::shared_ptr texture = nullptr) override; RequestStatus getRequestStatus() override; std::vector& getBytes() override; size_t copyBytes(unsigned char* ptr, size_t length) override; private: void assignTexture(std::shared_ptr texture); private: std::vector latestBytesRead_; RequestStatus status_ = RequestStatus::NotInitialized; #if IGL_BACKEND_VULKAN const igl::vulkan::VulkanContext* ctx_ = nullptr; VkImage vkImage_ = VK_NULL_HANDLE; VkFormat vkImageFormat_ = VK_FORMAT_UNDEFINED; VkImageLayout vkImageLayout_ = VK_IMAGE_LAYOUT_UNDEFINED; VkImageAspectFlags vkImageAspectFlags_ = 0; uint32_t textureWidth_ = 0; uint32_t textureHeight_ = 0; size_t bytesPerRow_ = 0; #endif size_t numBytesRequired_ = 0; }; } // namespace iglu::textureaccessor ================================================ FILE: IGLU/texture_loader/DataReader.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include namespace iglu::textureloader { std::optional DataReader::tryCreate(const uint8_t* FOLLY_NONNULL data, uint32_t size, igl::Result* IGL_NULLABLE outResult) { if (data == nullptr) { igl::Result::setResult(outResult, igl::Result::Code::ArgumentInvalid, "data is nullptr."); return {}; } return DataReader(data, size); } DataReader::DataReader(const uint8_t* FOLLY_NONNULL data, uint32_t size) noexcept : data_(data), size_(size) {} const uint8_t* DataReader::data() const noexcept { return data_; } uint32_t DataReader::size() const noexcept { return size_; } const uint8_t* IGL_NULLABLE DataReader::tryAt(uint32_t offset, igl::Result* IGL_NULLABLE outResult) const noexcept { if (!ensureLength(0, offset, outResult)) { return nullptr; } return at(offset); } const uint8_t* IGL_NONNULL DataReader::at(uint32_t offset) const noexcept { IGL_DEBUG_ASSERT(size_ >= offset); return data_ + offset; } bool DataReader::tryAdvance(uint32_t bytesToAdvance, igl::Result* IGL_NULLABLE outResult) noexcept { if (!ensureLength(bytesToAdvance, 0, outResult)) { return false; } advance(bytesToAdvance); return true; } bool DataReader::ensureLength(uint32_t requestedLength, uint32_t offset, igl::Result* IGL_NULLABLE outResult) const noexcept { if (offset > size_ || requestedLength > size_ - offset) { igl::Result::setResult( outResult, igl::Result::Code::InvalidOperation, "data size is too small."); return false; } return true; } void DataReader::advance(uint32_t bytesToAdvance) noexcept { IGL_DEBUG_ASSERT(size_ >= bytesToAdvance); data_ += bytesToAdvance; size_ -= bytesToAdvance; } } // namespace iglu::textureloader ================================================ FILE: IGLU/texture_loader/DataReader.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl { class IDevice; } // namespace igl namespace iglu::textureloader { /// Helper class for reading data class DataReader { public: static std::optional tryCreate(const uint8_t* IGL_NONNULL data, uint32_t size, igl::Result* IGL_NULLABLE outResult); [[nodiscard]] const uint8_t* IGL_NONNULL data() const noexcept; [[nodiscard]] uint32_t size() const noexcept; [[nodiscard]] const uint8_t* IGL_NULLABLE tryAt(uint32_t offset, igl::Result* IGL_NULLABLE outResult) const noexcept; [[nodiscard]] const uint8_t* IGL_NONNULL at(uint32_t offset) const noexcept; template [[nodiscard]] const T* IGL_NULLABLE tryAs(igl::Result* IGL_NULLABLE outResult) const noexcept { static_assert(sizeof(T) <= std::numeric_limits::max()); if (!ensureLength(static_cast(sizeof(T)), 0, outResult)) { return nullptr; } return as(); } template [[nodiscard]] const T* IGL_NONNULL as() const noexcept { static_assert(sizeof(T) <= std::numeric_limits::max()); IGL_DEBUG_ASSERT(size_ >= static_cast(sizeof(T))); return reinterpret_cast(data_); } template [[nodiscard]] const T* IGL_NULLABLE tryAsAt(uint32_t offset, igl::Result* IGL_NULLABLE outResult) const noexcept { static_assert(sizeof(T) <= std::numeric_limits::max()); if (!ensureLength(static_cast(sizeof(T)), offset, outResult)) { return nullptr; } return asAt(offset); } template [[nodiscard]] const T* IGL_NONNULL asAt(uint32_t offset) const noexcept { static_assert(sizeof(T) <= std::numeric_limits::max()); IGL_DEBUG_ASSERT(size_ >= offset + static_cast(sizeof(T))); return reinterpret_cast(data_ + offset); } template [[nodiscard]] bool tryRead(T& outValue, igl::Result* IGL_NULLABLE outResult) const noexcept { static_assert(sizeof(T) <= std::numeric_limits::max()); if (!ensureLength(static_cast(sizeof(T)), 0, outResult)) { return false; } outValue = read(); return true; } template [[nodiscard]] const T& read() const noexcept { static_assert(sizeof(T) <= std::numeric_limits::max()); return *as(); } template [[nodiscard]] bool tryReadAt(uint32_t offset, T& outValue, igl::Result* IGL_NULLABLE outResult) const noexcept { static_assert(sizeof(T) <= std::numeric_limits::max()); if (!ensureLength(static_cast(sizeof(T)), offset, outResult)) { return false; } outValue = readAt(offset); return true; } template [[nodiscard]] const T& readAt(uint32_t offset) const noexcept { static_assert(sizeof(T) <= std::numeric_limits::max()); return *asAt(offset); } template [[nodiscard]] bool tryAdvance(igl::Result* IGL_NULLABLE outResult) noexcept { static_assert(sizeof(T) <= std::numeric_limits::max()); return tryAdvance(static_cast(sizeof(T)), outResult); } [[nodiscard]] bool tryAdvance(uint32_t bytesToAdvance, igl::Result* IGL_NULLABLE outResult) noexcept; template void advance() noexcept { static_assert(sizeof(T) <= std::numeric_limits::max()); advance(static_cast(sizeof(T))); } void advance(uint32_t bytesToAdvance) noexcept; private: DataReader(const uint8_t* IGL_NONNULL data, uint32_t size) noexcept; [[nodiscard]] bool ensureLength(uint32_t requestedLength, uint32_t offset, igl::Result* IGL_NULLABLE outResult) const noexcept; // Prevent heap allocation static void* IGL_NONNULL operator new(std::size_t); static void* IGL_NONNULL operator new[](std::size_t); const uint8_t* FOLLY_NONNULL data_; uint32_t size_; }; } // namespace iglu::textureloader ================================================ FILE: IGLU/texture_loader/IData.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include namespace iglu::textureloader { namespace { class ByteData final : public IData { public: ByteData(std::unique_ptr data, uint64_t size) noexcept; ~ByteData() final = default; [[nodiscard]] const uint8_t* IGL_NONNULL data() const noexcept final; [[nodiscard]] uint64_t size() const noexcept final; [[nodiscard]] ExtractedData extractData() noexcept final; private: std::unique_ptr data_; uint64_t size_ = 0; }; ByteData::ByteData(std::unique_ptr data, uint64_t size) noexcept : data_(std::move(data)), size_(size) {} const uint8_t* IGL_NONNULL ByteData::data() const noexcept { IGL_DEBUG_ASSERT(data_ != nullptr); return data_.get(); } uint64_t ByteData::size() const noexcept { return size_; } IData::ExtractedData ByteData::extractData() noexcept { return { .data = data_.release(), .size = size_, .deleter = [](void* d) { delete[] reinterpret_cast(d); }, }; } } // namespace std::unique_ptr IData::tryCreate(std::unique_ptr data, uint64_t size, igl::Result* IGL_NULLABLE outResult) { if (data == nullptr) { igl::Result::setResult(outResult, igl::Result::Code::ArgumentNull, "data is nullptr"); return nullptr; } if (size == 0u) { igl::Result::setResult(outResult, igl::Result::Code::ArgumentInvalid, "size is 0"); return nullptr; } return std::make_unique(std::move(data), size); } } // namespace iglu::textureloader ================================================ FILE: IGLU/texture_loader/IData.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace iglu::textureloader { /// Interface for accessing data. class IData { protected: IData() noexcept = default; public: using Deleter = void (*)(void*); virtual ~IData() = default; static std::unique_ptr tryCreate(std::unique_ptr data, uint64_t size, igl::Result* IGL_NULLABLE outResult); /// @returns a read-only pointer to the data. May be nullptr. [[nodiscard]] virtual const uint8_t* IGL_NONNULL data() const noexcept = 0; /// @returns the size of the data in bytes. [[nodiscard]] virtual uint64_t size() const noexcept = 0; struct ExtractedData { /// Pointer to data. May be nullptr. const void* data = nullptr; /// Size in bytes of the data. uint64_t size = 0u; /// A deleter that can be use to free data. May be nullptr. void (*deleter)(void*) = nullptr; }; /// Extracts data from this IData and returns it in an ExtractedData struct. After this method, /// the behavior of data() and size() are undefined. [[nodiscard]] virtual ExtractedData extractData() noexcept; }; [[nodiscard]] inline IData::ExtractedData IData::extractData() noexcept { return { .data = const_cast(data()), .size = size(), }; } } // namespace iglu::textureloader ================================================ FILE: IGLU/texture_loader/ITextureLoader.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include namespace iglu::textureloader { /// Interface for getting CPU access to GPU texture data ITextureLoader::ITextureLoader(DataReader reader, igl::TextureDesc::TextureUsage usage) noexcept : reader_(reader) { IGL_DEBUG_ASSERT(reader.data() != nullptr && reader.size() > 0); desc_.usage = usage; } igl::TextureDesc& ITextureLoader::mutableDescriptor() noexcept { return desc_; } const igl::TextureDesc& ITextureLoader::descriptor() const noexcept { return desc_; } [[nodiscard]] uint32_t ITextureLoader::memorySizeInBytes() const noexcept { const auto properties = igl::TextureFormatProperties::fromTextureFormat(desc_.format); const igl::TextureRangeDesc range = { .width = desc_.width, .height = desc_.height, .depth = desc_.depth, .numLayers = desc_.numLayers, .numMipLevels = shouldGenerateMipmaps() ? 1 : desc_.numMipLevels, .numFaces = desc_.type == igl::TextureType::Cube ? 6u : 1u, }; // If the format is a variable length format, we need to sum up the size of each mip level // as specified in the KTX file if (properties.isVariableLength()) { uint32_t size = 0; for (uint32_t mipLevel = range.mipLevel; mipLevel < (range.mipLevel + range.numMipLevels); mipLevel++) { size += getMemorySizeInBytesFromFile(mipLevel); } return size; } return static_cast(properties.getBytesPerRange(range)); } bool ITextureLoader::isSupported(const igl::ICapabilities& capabilities) const noexcept { return isSupported(capabilities, desc_.usage); } bool ITextureLoader::isSupported(const igl::ICapabilities& capabilities, igl::TextureDesc::TextureUsage usage) const noexcept { const auto caps = capabilities.getTextureFormatCapabilities(desc_.format); const bool isSampled = (usage & igl::TextureDesc::TextureUsageBits::Sampled) != 0; const bool isAttachment = (usage & igl::TextureDesc::TextureUsageBits::Attachment) != 0; const bool isStorage = (usage & igl::TextureDesc::TextureUsageBits::Storage) != 0; if (isSampled && isAttachment && !igl::contains(caps, igl::ICapabilities::TextureFormatCapabilityBits::SampledAttachment)) { return false; } else if (isSampled && !igl::contains(caps, igl::ICapabilities::TextureFormatCapabilityBits::Sampled)) { return false; } else if (isAttachment && !igl::contains(caps, igl::ICapabilities::TextureFormatCapabilityBits::Attachment)) { return false; } else if (isStorage && !igl::contains(caps, igl::ICapabilities::TextureFormatCapabilityBits::Storage)) { return false; } return true; } std::shared_ptr ITextureLoader::create(const igl::IDevice& device, igl::Result* IGL_NULLABLE outResult) const noexcept { return create(device, desc_.format, desc_.usage, outResult); } std::shared_ptr ITextureLoader::create(const igl::IDevice& device, igl::TextureFormat preferredFormat, igl::Result* IGL_NULLABLE outResult) const noexcept { return create(device, preferredFormat, desc_.usage, outResult); } std::shared_ptr ITextureLoader::create(const igl::IDevice& device, igl::TextureDesc::TextureUsage usage, igl::Result* IGL_NULLABLE outResult) const noexcept { return create(device, igl::TextureFormat::Invalid, usage, outResult); } std::shared_ptr ITextureLoader::create(const igl::IDevice& device, igl::TextureFormat preferredFormat, igl::TextureDesc::TextureUsage usage, igl::Result* IGL_NULLABLE outResult) const noexcept { igl::TextureDesc desc = desc_; desc.format = preferredFormat == igl::TextureFormat::Invalid ? desc_.format : preferredFormat; desc.usage = usage; IGL_DEBUG_ASSERT(isSupported(device, usage)); return device.createTexture(desc, outResult); } void ITextureLoader::upload(igl::ITexture& texture, igl::Result* IGL_NULLABLE outResult) const noexcept { const auto dimensions = texture.getDimensions(); if (texture.getType() != desc_.type || (desc_.numMipLevels > 1 && texture.getNumMipLevels() != desc_.numMipLevels) || texture.getNumLayers() != desc_.numLayers || dimensions.width != desc_.width || dimensions.height != desc_.height || dimensions.depth != desc_.depth || texture.getFormat() != desc_.format) { igl::Result::setResult( outResult, igl::Result::Code::InvalidOperation, "Texture descriptor mismatch."); return; } uploadInternal(texture, outResult); } std::unique_ptr ITextureLoader::load(igl::Result* IGL_NULLABLE outResult) const noexcept { return loadInternal(outResult); } void ITextureLoader::loadToExternalMemory(uint8_t* IGL_NONNULL data, uint32_t length, igl::Result* IGL_NULLABLE outResult) const noexcept { if (data == nullptr) { igl::Result::setResult(outResult, igl::Result::Code::ArgumentNull, "data is nullptr."); return; } if (length < memorySizeInBytes()) { igl::Result::setResult(outResult, igl::Result::Code::ArgumentInvalid, "length is too short."); return; } return loadToExternalMemoryInternal(data, length, outResult); } DataReader& ITextureLoader::reader() noexcept { return reader_; } const DataReader& ITextureLoader::reader() const noexcept { return reader_; } void ITextureLoader::defaultUpload(igl::ITexture& texture, igl::Result* IGL_NULLABLE outResult) const noexcept { std::unique_ptr data; if (!canUploadSourceData()) { data = load(outResult); if (!data) { return; } } const auto range = shouldGenerateMipmaps() ? texture.getFullRange() : texture.getFullMipRange(); auto result = texture.upload(range, data ? data->data() : reader_.data()); igl::Result::setResult(outResult, std::move(result)); } std::unique_ptr ITextureLoader::defaultLoad( igl::Result* IGL_NULLABLE outResult) const noexcept { const uint32_t length = memorySizeInBytes(); auto data = std::make_unique(length); if (!data) { igl::Result::setResult(outResult, igl::Result::Code::RuntimeError, "out of memory."); return nullptr; } loadToExternalMemory(data.get(), length, outResult); return IData::tryCreate(std::move(data), length, outResult); } void ITextureLoader::defaultLoadToExternalMemory(uint8_t* IGL_NONNULL data, uint32_t length, igl::Result* IGL_NULLABLE outResult) const noexcept { if (reader_.size() != length) { igl::Result::setResult( outResult, igl::Result::Code::ArgumentInvalid, "length doesn't match reader length."); return; } checked_memcpy(data, length, reader_.data(), length); } } // namespace iglu::textureloader ================================================ FILE: IGLU/texture_loader/ITextureLoader.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl { class ICapabilities; class IDevice; } // namespace igl namespace iglu::textureloader { /// Interface for getting CPU access to GPU texture data class ITextureLoader { protected: explicit ITextureLoader( DataReader reader, igl::TextureDesc::TextureUsage usage = igl::TextureDesc::TextureUsageBits::Sampled) noexcept; public: virtual ~ITextureLoader() = default; [[nodiscard]] const igl::TextureDesc& descriptor() const noexcept; [[nodiscard]] virtual std::vector mipLevelBytes() const noexcept { return {}; } [[nodiscard]] uint32_t memorySizeInBytes() const noexcept; [[nodiscard]] bool isSupported(const igl::ICapabilities& capabilities) const noexcept; [[nodiscard]] bool isSupported(const igl::ICapabilities& capabilities, igl::TextureDesc::TextureUsage usage) const noexcept; [[nodiscard]] std::shared_ptr create(const igl::IDevice& device, igl::Result* IGL_NULLABLE outResult) const noexcept; [[nodiscard]] std::shared_ptr create(const igl::IDevice& device, igl::TextureFormat preferredFormat, igl::Result* IGL_NULLABLE outResult) const noexcept; [[nodiscard]] std::shared_ptr create(const igl::IDevice& device, igl::TextureFormat preferredFormat, igl::TextureDesc::TextureUsage usage, igl::Result* IGL_NULLABLE outResult) const noexcept; [[nodiscard]] std::shared_ptr create(const igl::IDevice& device, igl::TextureDesc::TextureUsage usage, igl::Result* IGL_NULLABLE outResult) const noexcept; [[nodiscard]] virtual bool canUploadSourceData() const noexcept { return false; } [[nodiscard]] virtual bool canUseExternalMemory() const noexcept { return false; } void upload(igl::ITexture& texture, igl::Result* IGL_NULLABLE outResult) const noexcept; [[nodiscard]] std::unique_ptr load(igl::Result* IGL_NULLABLE outResult) const noexcept; void loadToExternalMemory(uint8_t* IGL_NONNULL data, uint32_t length, igl::Result* IGL_NULLABLE outResult) const noexcept; [[nodiscard]] virtual bool shouldGenerateMipmaps() const noexcept { return desc_.numMipLevels > 1; } protected: [[nodiscard]] DataReader& reader() noexcept; [[nodiscard]] const DataReader& reader() const noexcept; [[nodiscard]] igl::TextureDesc& mutableDescriptor() noexcept; virtual void uploadInternal(igl::ITexture& texture, igl::Result* IGL_NULLABLE outResult) const noexcept { defaultUpload(texture, outResult); } [[nodiscard]] virtual std::unique_ptr loadInternal( igl::Result* IGL_NULLABLE outResult) const noexcept { return defaultLoad(outResult); } virtual void loadToExternalMemoryInternal(uint8_t* IGL_NONNULL data, uint32_t length, igl::Result* IGL_NULLABLE outResult) const noexcept { defaultLoadToExternalMemory(data, length, outResult); } [[nodiscard]] virtual size_t getMemorySizeInBytesFromFile(uint32_t miplevel) const noexcept { return 0; } private: void defaultUpload(igl::ITexture& texture, igl::Result* IGL_NULLABLE outResult) const noexcept; [[nodiscard]] std::unique_ptr defaultLoad( igl::Result* IGL_NULLABLE outResult) const noexcept; void defaultLoadToExternalMemory(uint8_t* IGL_NONNULL data, uint32_t length, igl::Result* IGL_NULLABLE outResult) const noexcept; igl::TextureDesc desc_; DataReader reader_; }; } // namespace iglu::textureloader ================================================ FILE: IGLU/texture_loader/ITextureLoaderFactory.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include namespace iglu::textureloader { bool ITextureLoaderFactory::canCreate(const uint8_t* IGL_NONNULL headerData, uint32_t headerLength, igl::Result* IGL_NULLABLE outResult) const noexcept { auto maybeReader = DataReader::tryCreate(headerData, headerLength, outResult); if (!maybeReader.has_value()) { return false; } return canCreate(*maybeReader, outResult); } bool ITextureLoaderFactory::canCreate(DataReader headerReader, igl::Result* IGL_NULLABLE outResult) const noexcept { if (headerReader.data() == nullptr) { igl::Result::setResult( outResult, igl::Result::Code::ArgumentInvalid, "Reader's data is nullptr."); return false; } if (headerReader.size() < minHeaderLength()) { igl::Result::setResult( outResult, igl::Result::Code::ArgumentOutOfRange, "Not enough data for header."); return false; } return canCreateInternal(headerReader, outResult); } std::unique_ptr ITextureLoaderFactory::tryCreate(const uint8_t* IGL_NONNULL data, uint32_t length, igl::Result* IGL_NULLABLE outResult) const noexcept { return tryCreate(data, length, igl::TextureFormat::Invalid, outResult); } std::unique_ptr ITextureLoaderFactory::tryCreate(const uint8_t* IGL_NONNULL data, uint32_t length, igl::TextureFormat preferredFormat, igl::Result* IGL_NULLABLE outResult) const noexcept { auto maybeReader = DataReader::tryCreate(data, length, outResult); if (!maybeReader.has_value()) { return nullptr; } return tryCreate(*maybeReader, preferredFormat, outResult); } std::unique_ptr ITextureLoaderFactory::tryCreate(DataReader reader, igl::Result* IGL_NULLABLE outResult) const noexcept { return tryCreate(reader, igl::TextureFormat::Invalid, outResult); } std::unique_ptr ITextureLoaderFactory::tryCreate(DataReader reader, igl::TextureFormat preferredFormat, igl::Result* IGL_NULLABLE outResult) const noexcept { if (!canCreate(reader, outResult)) { return nullptr; } return tryCreateInternal(reader, preferredFormat, outResult); } } // namespace iglu::textureloader ================================================ FILE: IGLU/texture_loader/ITextureLoaderFactory.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace iglu::textureloader { /// Interface for creating ITextureLoader instances for a specific format. class ITextureLoaderFactory { protected: ITextureLoaderFactory() = default; public: virtual ~ITextureLoaderFactory() = default; [[nodiscard]] virtual uint32_t minHeaderLength() const noexcept = 0; [[nodiscard]] virtual uint32_t maxHeaderLength() const noexcept { return minHeaderLength(); } [[nodiscard]] bool canCreate(const uint8_t* IGL_NONNULL headerData, uint32_t headerLength, igl::Result* IGL_NULLABLE outResult) const noexcept; [[nodiscard]] bool canCreate(DataReader headerReader, igl::Result* IGL_NULLABLE outResult) const noexcept; [[nodiscard]] std::unique_ptr tryCreate(const uint8_t* IGL_NONNULL data, uint32_t length, igl::Result* IGL_NULLABLE outResult) const noexcept; [[nodiscard]] std::unique_ptr tryCreate(const uint8_t* IGL_NONNULL data, uint32_t length, igl::TextureFormat preferredFormat, igl::Result* IGL_NULLABLE outResult) const noexcept; [[nodiscard]] std::unique_ptr tryCreate(DataReader reader, igl::Result* IGL_NULLABLE outResult) const noexcept; [[nodiscard]] std::unique_ptr tryCreate(DataReader reader, igl::TextureFormat preferredFormat, igl::Result* IGL_NULLABLE outResult) const noexcept; protected: [[nodiscard]] virtual bool canCreateInternal(DataReader headerReader, igl::Result* IGL_NULLABLE outResult) const noexcept = 0; [[nodiscard]] virtual std::unique_ptr tryCreateInternal( DataReader reader, igl::TextureFormat preferredFormat, igl::Result* IGL_NULLABLE outResult) const noexcept = 0; }; } // namespace iglu::textureloader ================================================ FILE: IGLU/texture_loader/TextureLoaderFactory.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include namespace iglu::textureloader { TextureLoaderFactory::TextureLoaderFactory( std::vector>&& factories) : factories_(std::move(factories)), minHeaderLength_(0), maxHeaderLength_(0) { bool first = true; for (const auto& factory : factories_) { if (first) { minHeaderLength_ = factory->minHeaderLength(); } else { minHeaderLength_ = std::min(minHeaderLength_, factory->minHeaderLength()); } maxHeaderLength_ = std::max(maxHeaderLength_, factory->maxHeaderLength()); first = false; } } uint32_t TextureLoaderFactory::minHeaderLength() const noexcept { return minHeaderLength_; } uint32_t TextureLoaderFactory::maxHeaderLength() const noexcept { return maxHeaderLength_; } bool TextureLoaderFactory::canCreateInternal(DataReader headerReader, igl::Result* IGL_NULLABLE outResult) const noexcept { for (const auto& factory : factories_) { if (factory->canCreate(headerReader, nullptr)) { return true; } } igl::Result::setResult(outResult, igl::Result::Code::RuntimeError, "No factory found."); return false; } std::unique_ptr TextureLoaderFactory::tryCreateInternal( DataReader reader, igl::TextureFormat preferredFormat, igl::Result* IGL_NULLABLE outResult) const noexcept { for (const auto& factory : factories_) { auto loader = factory->tryCreate(reader, preferredFormat, nullptr); if (loader) { return loader; } } igl::Result::setResult(outResult, igl::Result::Code::RuntimeError, "No factory found."); return nullptr; } } // namespace iglu::textureloader ================================================ FILE: IGLU/texture_loader/TextureLoaderFactory.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace iglu::textureloader { /// Factory for creating ITextureLoader instances for supported formats. class TextureLoaderFactory : public ITextureLoaderFactory { using Super = ITextureLoaderFactory; public: explicit TextureLoaderFactory(std::vector>&& factories); ~TextureLoaderFactory() override = default; [[nodiscard]] uint32_t minHeaderLength() const noexcept final; [[nodiscard]] uint32_t maxHeaderLength() const noexcept final; protected: [[nodiscard]] bool canCreateInternal(DataReader headerReader, igl::Result* IGL_NULLABLE outResult) const noexcept final; [[nodiscard]] std::unique_ptr tryCreateInternal( DataReader reader, igl::TextureFormat preferredFormat, igl::Result* IGL_NULLABLE outResult) const noexcept final; private: std::vector> factories_; uint32_t minHeaderLength_; uint32_t maxHeaderLength_; }; } // namespace iglu::textureloader ================================================ FILE: IGLU/texture_loader/ktx/TextureLoaderFactory.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include // @fb-only // @fb-only // @fb-only namespace iglu::textureloader::ktx { namespace { struct KtxDeleter { void operator()(void* p) const { ktxTexture_Destroy(ktxTexture(p)); } }; class TextureLoader : public ITextureLoader { using Super = ITextureLoader; public: TextureLoader(DataReader reader, const igl::TextureRangeDesc& range, igl::TextureFormat format, std::unique_ptr texture) noexcept; [[nodiscard]] bool canUploadSourceData() const noexcept final; [[nodiscard]] bool shouldGenerateMipmaps() const noexcept final; [[nodiscard]] size_t getMemorySizeInBytesFromFile(uint32_t miplevel) const noexcept final { // Structure to hold the data for the callback function struct Data { uint32_t mipLevel = 0; ktx_uint64_t size = 0; }; // Store the mip level in the userData struct Data userData = { .mipLevel = miplevel, }; // Callback function to iterate over the mip levels and calculate the total size // Passed to the ktxTexture_IterateLevelFaces function PFNKTXITERCB iterCb = [](int miplevel, int face, int width, int height, int depth, ktx_uint64_t faceLodSize, void* pixels, void* userdata) -> ktx_error_code_e { Data* data = static_cast(userdata); data->size += (data->mipLevel == miplevel) ? faceLodSize : 0; return KTX_SUCCESS; }; const auto result = ktxTexture_IterateLevelFaces(texture_.get(), iterCb, &userData); if (result == KTX_SUCCESS) { return userData.size; } return 0; } [[nodiscard]] std::vector mipLevelBytes() const noexcept override { std::vector mipLevelBytes; mipLevelBytes.reserve(descriptor().numMipLevels); for (uint32_t i = 0; i < descriptor().numMipLevels; ++i) { mipLevelBytes.push_back(static_cast(getMemorySizeInBytesFromFile(i))); } return mipLevelBytes; } private: void uploadInternal(igl::ITexture& texture, igl::Result* IGL_NULLABLE outResult) const noexcept final; void loadToExternalMemoryInternal(uint8_t* IGL_NONNULL data, uint32_t length, igl::Result* IGL_NULLABLE outResult) const noexcept final; std::unique_ptr texture_; }; TextureLoader::TextureLoader(DataReader reader, const igl::TextureRangeDesc& range, igl::TextureFormat format, std::unique_ptr texture) noexcept : Super(reader), texture_(std::move(texture)) { auto& desc = mutableDescriptor(); desc.format = format; desc.numLayers = range.numLayers; desc.width = range.width; desc.height = range.height; desc.depth = range.depth; desc.numMipLevels = shouldGenerateMipmaps() ? igl::TextureDesc::calcNumMipLevels(desc.width, desc.height, desc.depth) : range.numMipLevels; if (range.numFaces == 6u) { desc.type = igl::TextureType::Cube; } else if (desc.depth > 1) { desc.type = igl::TextureType::ThreeD; } else if (desc.numLayers > 1) { desc.type = igl::TextureType::TwoDArray; } else { desc.type = igl::TextureType::TwoD; } } bool TextureLoader::canUploadSourceData() const noexcept { return true; } bool TextureLoader::shouldGenerateMipmaps() const noexcept { return texture_->generateMipmaps; } void TextureLoader::uploadInternal(igl::ITexture& texture, igl::Result* IGL_NULLABLE outResult) const noexcept { const auto& desc = descriptor(); size_t offset = 0; for (uint32_t mipLevel = 0; mipLevel < desc.numMipLevels && mipLevel < texture_->numLevels; ++mipLevel) { const auto ktxResult = ktxTexture_GetImageOffset(ktxTexture(texture_.get()), mipLevel, 0, 0, &offset); if (ktxResult != KTX_SUCCESS) { IGL_LOG_ERROR( "Error getting KTX texture data: %d %s\n", ktxResult, ktxErrorString(ktxResult)); igl::Result::setResult( outResult, igl::Result::Code::RuntimeError, "Error getting KTX texture data."); } texture.upload(texture.getFullRange(mipLevel), texture_->pData + offset); } igl::Result::setOk(outResult); } void TextureLoader::loadToExternalMemoryInternal(uint8_t* IGL_NONNULL data, uint32_t length, igl::Result* IGL_NULLABLE outResult) const noexcept { const auto& desc = descriptor(); size_t offsetDestination = 0; size_t offsetSource = 0; for (uint32_t mipLevel = 0; mipLevel < desc.numMipLevels && mipLevel < texture_->numLevels; ++mipLevel) { auto ktxResult = ktxTexture_GetImageOffset(ktxTexture(texture_.get()), mipLevel, 0, 0, &offsetSource); if (ktxResult != KTX_SUCCESS) { IGL_LOG_ERROR( "Error getting KTX texture data: %d %s\n", ktxResult, ktxErrorString(ktxResult)); igl::Result::setResult( outResult, igl::Result::Code::RuntimeError, "Error getting KTX texture data."); } ktx_size_t mipLevelLength = 0; // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only mipLevelLength = ktxTexture_GetImageSize(ktxTexture(texture_.get()), mipLevel); // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // Naively, we could just check mipmapLength > length - offset. However, // if offset is very large, e.g. size_t(-1), then destination_size - offset // will overflow `size_t` and hence act additive to destination_size. // // To avoid this, we properly compute the available_size and then check that. const size_t availableSize = offsetSource > length ? 0 : length - offsetSource; if (mipLevelLength > availableSize) { igl::Result::setResult( outResult, igl::Result::Code::InvalidOperation, "data length is too small."); return; } checked_memcpy_offset( data, length, offsetDestination, texture_->pData + offsetSource, mipLevelLength); offsetDestination += mipLevelLength; } } } // namespace std::unique_ptr TextureLoaderFactory::tryCreateInternal( DataReader reader, igl::TextureFormat /*preferredFormat*/, igl::Result* IGL_NULLABLE outResult) const noexcept { const auto range = textureRange(reader); auto result = range.validate(); if (!result.isOk()) { igl::Result::setResult(outResult, std::move(result)); return nullptr; } if (!validate(reader, range, outResult)) { return nullptr; } ktxTexture* rawTexture = nullptr; const auto ktxResult = ktxTexture_CreateFromMemory( reader.data(), reader.size(), KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT, &rawTexture); if (ktxResult != KTX_SUCCESS || rawTexture == nullptr) { IGL_LOG_ERROR("Error loading KTX texture: %d %s\n", ktxResult, ktxErrorString(ktxResult)); igl::Result::setResult( outResult, igl::Result::Code::RuntimeError, "Error loading KTX texture."); if (rawTexture != nullptr) { ktxTexture_Destroy(rawTexture); } return nullptr; } auto texture = std::unique_ptr(rawTexture); if (ktxTexture_NeedsTranscoding(rawTexture)) { #if IGL_PLATFORM_ANDROID || IGL_PLATFORM_IOS constexpr ktx_transcode_fmt_e transcodeFormat = KTX_TTF_ASTC_4x4_RGBA; #else constexpr ktx_transcode_fmt_e transcodeFormat = KTX_TTF_BC7_RGBA; #endif const auto transcodingResult = ktxTexture2_TranscodeBasis(reinterpret_cast(rawTexture), transcodeFormat, 0); if (transcodingResult != KTX_SUCCESS) { IGL_LOG_ERROR("Error transcoding KTX texture: %d %s\n", transcodingResult, ktxErrorString(transcodingResult)); igl::Result::setResult( outResult, igl::Result::Code::RuntimeError, "Error transcoding KTX texture."); return nullptr; } } const auto format = textureFormat(rawTexture); if (format == igl::TextureFormat::Invalid) { igl::Result::setResult( outResult, igl::Result::Code::RuntimeError, "Unsupported KTX texture format."); return nullptr; } if (texture->numFaces == 6u && texture->numLayers > 1u) { igl::Result::setResult( outResult, igl::Result::Code::InvalidOperation, "Texture cube arrays not supported."); return nullptr; } if (texture->numLayers > 1 && texture->baseDepth > 1u) { igl::Result::setResult( outResult, igl::Result::Code::InvalidOperation, "3D texture arrays not supported."); return nullptr; } if (texture->numFaces != 1u && texture->numFaces != 6u) { igl::Result::setResult(outResult, igl::Result::Code::InvalidOperation, "faces must be 1 or 6."); return nullptr; } if (texture->numFaces == 6u && texture->baseDepth != 1u) { igl::Result::setResult( outResult, igl::Result::Code::InvalidOperation, "depth must be 1 for cube textures."); return nullptr; } if (texture->numFaces == 6u && texture->baseWidth != texture->baseHeight) { igl::Result::setResult(outResult, igl::Result::Code::InvalidOperation, "pixelWidth must match pixelHeight for cube textures."); return nullptr; } return std::make_unique(reader, range, format, std::move(texture)); } } // namespace iglu::textureloader::ktx ================================================ FILE: IGLU/texture_loader/ktx/TextureLoaderFactory.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include struct ktxTexture; namespace iglu::textureloader::ktx { /** * @brief ITextureLoaderFactory base class for loading KTX v1 and v2 textures */ class TextureLoaderFactory : public ITextureLoaderFactory { protected: TextureLoaderFactory() noexcept = default; [[nodiscard]] virtual igl::TextureRangeDesc textureRange(DataReader reader) const noexcept = 0; [[nodiscard]] virtual bool validate(DataReader reader, const igl::TextureRangeDesc& range, igl::Result* IGL_NULLABLE outResult) const noexcept = 0; [[nodiscard]] virtual igl::TextureFormat textureFormat( const ktxTexture* IGL_NONNULL texture) const noexcept = 0; private: [[nodiscard]] std::unique_ptr tryCreateInternal( DataReader reader, igl::TextureFormat preferredFormat, // Ignored for KTX textures igl::Result* IGL_NULLABLE outResult) const noexcept final; }; } // namespace iglu::textureloader::ktx ================================================ FILE: IGLU/texture_loader/ktx1/Header.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace iglu::textureloader::ktx1 { namespace { constexpr const Tag kKtx1FileIdentifier{ {0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A}}; } // namespace bool Header::tagIsValid() const noexcept { return std::memcmp(tag.data(), kKtx1FileIdentifier.data(), kKtx1FileIdentifier.size()) == 0; } } // namespace iglu::textureloader::ktx1 ================================================ FILE: IGLU/texture_loader/ktx1/Header.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace iglu::textureloader::ktx1 { using Tag = std::array; struct Header { Tag tag; uint32_t endianness; // always little Endian uint32_t glType; // For compressed textures, this should always be 0 uint32_t glTypeSize; // For compressed textures, this should always be 1 uint32_t glFormat; uint32_t glInternalFormat; uint32_t glBaseInternalFormat; uint32_t pixelWidth; uint32_t pixelHeight; uint32_t pixelDepth; uint32_t numberOfArrayElements; // Always 0 for non-array textures uint32_t numberOfFaces; // Always 1 for non cubemap textures uint32_t numberOfMipmapLevels; uint32_t bytesOfKeyValueData; // 0 - extra key-value isn't needed at the moment [[nodiscard]] bool tagIsValid() const noexcept; }; static_assert(sizeof(Header) == 13 * sizeof(uint32_t) + 12); constexpr uint32_t kHeaderLength = static_cast(sizeof(Header)); } // namespace iglu::textureloader::ktx1 ================================================ FILE: IGLU/texture_loader/ktx1/TextureLoaderFactory.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include namespace iglu::textureloader::ktx1 { uint32_t TextureLoaderFactory::minHeaderLength() const noexcept { return kHeaderLength; } bool TextureLoaderFactory::canCreateInternal(DataReader headerReader, igl::Result* IGL_NULLABLE outResult) const noexcept { if (headerReader.data() == nullptr) { igl::Result::setResult( outResult, igl::Result::Code::ArgumentInvalid, "Reader's data is nullptr."); return false; } if (headerReader.size() < kHeaderLength) { igl::Result::setResult( outResult, igl::Result::Code::ArgumentOutOfRange, "Not enough data for header."); return false; } const Header* header = headerReader.as
(); if (!header->tagIsValid()) { igl::Result::setResult(outResult, igl::Result::Code::InvalidOperation, "Incorrect identifier."); return false; } if (igl::opengl::util::glTextureFormatToTextureFormat( header->glInternalFormat, header->glFormat, header->glType) == igl::TextureFormat::Invalid) { igl::Result::setResult( outResult, igl::Result::Code::InvalidOperation, "Unrecognized texture format."); return false; } return true; } igl::TextureRangeDesc TextureLoaderFactory::textureRange(DataReader reader) const noexcept { const Header* header = reader.as
(); igl::TextureRangeDesc range; range.numMipLevels = std::max(header->numberOfMipmapLevels, 1u); range.numLayers = std::max(header->numberOfArrayElements, 1u); range.numFaces = header->numberOfFaces; range.width = std::max(header->pixelWidth, 1u); range.height = std::max(header->pixelHeight, 1u); range.depth = std::max(header->pixelDepth, 1u); return range; } bool TextureLoaderFactory::validate(DataReader reader, const igl::TextureRangeDesc& range, igl::Result* IGL_NULLABLE outResult) const noexcept { const Header* header = reader.as
(); const uint32_t length = reader.size(); const auto format = igl::opengl::util::glTextureFormatToTextureFormat( header->glInternalFormat, header->glFormat, header->glType); const auto properties = igl::TextureFormatProperties::fromTextureFormat(format); const size_t rangeBytesAsSizeT = properties.getBytesPerRange(range); if (rangeBytesAsSizeT > static_cast(length)) { igl::Result::setResult(outResult, igl::Result::Code::InvalidOperation, "Length is too short."); return false; } const uint32_t rangeBytes = static_cast(rangeBytesAsSizeT); const uint32_t expectedLength = kHeaderLength + header->bytesOfKeyValueData + header->numberOfMipmapLevels * static_cast(sizeof(uint32_t)) + rangeBytes; if (length < expectedLength) { igl::Result::setResult( outResult, igl::Result::Code::InvalidOperation, "Length shorter than expected length."); return false; } const bool isCubeTexture = header->numberOfFaces == 6u; uint32_t offset = kHeaderLength + header->bytesOfKeyValueData; for (size_t mipLevel = 0; mipLevel < range.numMipLevels; ++mipLevel) { uint32_t imageSize = 0; if (!reader.tryReadAt(offset, imageSize, outResult)) { return false; } const size_t expectedBytes = properties.getBytesPerRange(range.atMipLevel(mipLevel).atFace(0)); const size_t expectedCubeBytes = expectedBytes * static_cast(6); if (imageSize != expectedBytes) { igl::Result::setResult( outResult, igl::Result::Code::InvalidOperation, "Unexpected image size."); return false; } offset += 4u; offset += static_cast(isCubeTexture ? expectedCubeBytes : expectedBytes); } return true; } igl::TextureFormat TextureLoaderFactory::textureFormat(const ktxTexture* texture) const noexcept { if (texture->classId == ktxTexture1_c) { const auto* texture1 = reinterpret_cast(texture); return igl::opengl::util::glTextureFormatToTextureFormat( texture1->glInternalformat, texture1->glFormat, texture1->glType); } return igl::TextureFormat::Invalid; } } // namespace iglu::textureloader::ktx1 ================================================ FILE: IGLU/texture_loader/ktx1/TextureLoaderFactory.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace iglu::textureloader::ktx1 { /** * @brief ITextureLoaderFactory implementation for KTX v1 texture containers * @note Texture container format specifications: * https://registry.khronos.org/KTX/specs/1.0/ktxspec.v1.html */ class TextureLoaderFactory final : public ktx::TextureLoaderFactory { public: explicit TextureLoaderFactory() noexcept = default; [[nodiscard]] uint32_t minHeaderLength() const noexcept final; private: [[nodiscard]] bool canCreateInternal(DataReader headerReader, igl::Result* IGL_NULLABLE outResult) const noexcept final; [[nodiscard]] igl::TextureRangeDesc textureRange(DataReader reader) const noexcept final; [[nodiscard]] bool validate(DataReader reader, const igl::TextureRangeDesc& range, igl::Result* IGL_NULLABLE outResult) const noexcept final; [[nodiscard]] igl::TextureFormat textureFormat( const ktxTexture* IGL_NONNULL texture) const noexcept final; }; } // namespace iglu::textureloader::ktx1 ================================================ FILE: IGLU/texture_loader/ktx2/Header.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace iglu::textureloader::ktx2 { namespace { constexpr const Tag kKtx2FileIdentifier{ {0xAB, 0x4B, 0x54, 0x58, 0x20, 0x32, 0x30, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A}}; } // namespace bool Header::tagIsValid() const noexcept { return std::memcmp(tag.data(), kKtx2FileIdentifier.data(), kKtx2FileIdentifier.size()) == 0; } } // namespace iglu::textureloader::ktx2 ================================================ FILE: IGLU/texture_loader/ktx2/Header.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace iglu::textureloader::ktx2 { using Tag = std::array; struct Header { Tag tag; uint32_t vkFormat; uint32_t typeSize; uint32_t pixelWidth; uint32_t pixelHeight; uint32_t pixelDepth; uint32_t layerCount; uint32_t faceCount; uint32_t levelCount; uint32_t supercompressionScheme; uint32_t dfdByteOffset; uint32_t dfdByteLength; uint32_t kvdByteOffset; uint32_t kvdByteLength; uint64_t sgdByteOffset; uint64_t sgdByteLength; [[nodiscard]] bool tagIsValid() const noexcept; }; static_assert(sizeof(Header) == 13 * sizeof(uint32_t) + 2 * sizeof(uint64_t) + 12); constexpr uint32_t kHeaderLength = static_cast(sizeof(Header)); } // namespace iglu::textureloader::ktx2 ================================================ FILE: IGLU/texture_loader/ktx2/TextureLoaderFactory.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #if IGL_BACKEND_D3D12 && !IGL_BACKEND_VULKAN // Provide a fallback for D3D12-only builds where Vulkan support is not compiled in. namespace igl::vulkan::util { inline igl::TextureFormat vkTextureFormatToTextureFormat(int32_t /*vkFormat*/) { return igl::TextureFormat::Invalid; } } // namespace igl::vulkan::util #endif // @fb-only // @fb-only // @fb-only namespace iglu::textureloader::ktx2 { namespace { template T align(T offset, T alignment) { return (offset + (alignment - 1)) & ~(alignment - 1); } } // namespace uint32_t TextureLoaderFactory::minHeaderLength() const noexcept { return kHeaderLength; } bool TextureLoaderFactory::canCreateInternal(DataReader headerReader, igl::Result* IGL_NULLABLE outResult) const noexcept { if (headerReader.data() == nullptr) { igl::Result::setResult( outResult, igl::Result::Code::ArgumentInvalid, "Reader's data is nullptr."); return false; } if (headerReader.size() < kHeaderLength) { igl::Result::setResult( outResult, igl::Result::Code::ArgumentOutOfRange, "Not enough data for header."); return false; } const Header* header = headerReader.as
(); if (!header->tagIsValid()) { igl::Result::setResult(outResult, igl::Result::Code::InvalidOperation, "Incorrect identifier."); return false; } // vkFormat = 0 means basis universal or some non-Vulkan format. // In either case, we need to process the DFD to understand whether we can really handle the // format or not. if (header->vkFormat != 0 && igl::vulkan::util::vkTextureFormatToTextureFormat(static_cast(header->vkFormat)) == igl::TextureFormat::Invalid) { igl::Result::setResult( outResult, igl::Result::Code::InvalidOperation, "Unrecognized texture format."); return false; } return true; } igl::TextureRangeDesc TextureLoaderFactory::textureRange(DataReader reader) const noexcept { const Header* header = reader.as
(); const igl::TextureRangeDesc range{ .width = std::max(header->pixelWidth, 1u), .height = std::max(header->pixelHeight, 1u), .depth = std::max(header->pixelDepth, 1u), .numLayers = std::max(header->layerCount, 1u), .numMipLevels = std::max(header->levelCount, 1u), .numFaces = header->faceCount, }; return range; } bool TextureLoaderFactory::validate(DataReader reader, const igl::TextureRangeDesc& range, igl::Result* IGL_NULLABLE outResult) const noexcept { const Header* header = reader.as
(); const uint32_t length = reader.size(); if (header->sgdByteLength > std::numeric_limits::max()) { igl::Result::setResult(outResult, igl::Result::Code::InvalidOperation, "Super compression global data is too large to fit in uint32_t."); return false; } const uint32_t sgdByteLength = static_cast(header->sgdByteLength); if (static_cast(header->dfdByteLength) + static_cast(header->kvdByteLength) + header->sgdByteLength > static_cast(length)) { igl::Result::setResult(outResult, igl::Result::Code::InvalidOperation, "Length is too short."); return false; } if (header->vkFormat != 0u) { const auto format = igl::vulkan::util::vkTextureFormatToTextureFormat(static_cast(header->vkFormat)); const auto properties = igl::TextureFormatProperties::fromTextureFormat(format); const uint32_t mipLevelAlignment = std::lcm(static_cast(properties.bytesPerBlock), 4u); size_t rangeBytesAsSizeT = 0; for (uint32_t mipLevel = 0; mipLevel < range.numMipLevels; ++mipLevel) { rangeBytesAsSizeT += align(properties.getBytesPerRange(range.atMipLevel(mipLevel)), static_cast(mipLevelAlignment)); } if (rangeBytesAsSizeT > length) { igl::Result::setResult( outResult, igl::Result::Code::InvalidOperation, "Length is too short."); return false; } const uint32_t rangeBytes = static_cast(rangeBytesAsSizeT); // Mipmap metadata is: // UInt64 byteOffset // UInt64 byteLength // UInt64 uncompressedByteLength const uint32_t mipmapMetadataLength = range.numMipLevels * 24u; const uint32_t preSupercompressionMetadataLength = kHeaderLength + mipmapMetadataLength + header->dfdByteLength + header->kvdByteLength; const uint32_t metadataLength = sgdByteLength > 0 ? align(preSupercompressionMetadataLength, 8u) + sgdByteLength : preSupercompressionMetadataLength; uint32_t expectedDataOffset = align(metadataLength, mipLevelAlignment); const uint32_t expectedLength = expectedDataOffset + rangeBytes; if (length < expectedLength) { igl::Result::setResult( outResult, igl::Result::Code::InvalidOperation, "Length shorter than expected length."); return false; } for (uint32_t i = 0; i < range.numMipLevels; ++i) { // ktx2 stores actual mip data in 'reverse' order (smallest images to largest) but the // metadata in 'normal' order (largest to smallest). We process the list in the same order the // data is stored to simplify the bookkeeping validation. const uint32_t mipLevel = range.numMipLevels - i - 1; const uint32_t offset = kHeaderLength + static_cast(mipLevel) * 24u; const uint64_t byteOffset = reader.readAt(offset); const uint64_t byteLength = reader.readAt(offset + 8u); const uint64_t uncompressedByteLength = reader.readAt(offset + 16u); if (byteLength != uncompressedByteLength && header->supercompressionScheme == 0) { igl::Result::setResult( outResult, igl::Result::Code::InvalidOperation, "Unexpected difference between byteLength and uncompressedByteLength."); return false; } if (byteOffset != static_cast(expectedDataOffset)) { igl::Result::setResult( outResult, igl::Result::Code::InvalidOperation, "Unexpected byteOffset."); return false; } if (static_cast(uncompressedByteLength) != properties.getBytesPerRange(range.atMipLevel(mipLevel))) { igl::Result::setResult( outResult, igl::Result::Code::InvalidOperation, "Unexpected byteLength."); return false; } expectedDataOffset = align(expectedDataOffset + static_cast(byteLength), mipLevelAlignment); } } return true; } namespace { // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only } // namespace igl::TextureFormat TextureLoaderFactory::textureFormat(const ktxTexture* texture) const noexcept { if (texture->classId == ktxTexture2_c) { // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only const auto* texture2 = reinterpret_cast(texture); return igl::vulkan::util::vkTextureFormatToTextureFormat( static_cast(texture2->vkFormat)); // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only } return igl::TextureFormat::Invalid; } } // namespace iglu::textureloader::ktx2 ================================================ FILE: IGLU/texture_loader/ktx2/TextureLoaderFactory.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace iglu::textureloader::ktx2 { /** * @brief ITextureLoaderFactory implementation for KTX v2 texture containers * @note Texture container format specifications: * https://registry.khronos.org/KTX/specs/2.0/ktxspec.v2.html */ class TextureLoaderFactory final : public ktx::TextureLoaderFactory { public: explicit TextureLoaderFactory() noexcept = default; [[nodiscard]] uint32_t minHeaderLength() const noexcept final; private: [[nodiscard]] bool canCreateInternal(DataReader headerReader, igl::Result* IGL_NULLABLE outResult) const noexcept final; [[nodiscard]] igl::TextureRangeDesc textureRange(DataReader reader) const noexcept final; [[nodiscard]] bool validate(DataReader reader, const igl::TextureRangeDesc& range, igl::Result* IGL_NULLABLE outResult) const noexcept final; [[nodiscard]] igl::TextureFormat textureFormat( const ktxTexture* IGL_NONNULL texture) const noexcept final; }; } // namespace iglu::textureloader::ktx2 ================================================ FILE: IGLU/texture_loader/stb_hdr/Header.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace iglu::textureloader::stb::hdr { namespace { constexpr const Tag kRadianceFileIdentifier{ {'#', '?', 'R', 'A', 'D', 'I', 'A', 'N', 'C', 'E', '\n'}}; constexpr const std::array kRgbeFileIdentifier{{'#', '?', 'R', 'G', 'B', 'E', '\n'}}; } // namespace bool Header::tagIsValid() const noexcept { return std::memcmp(tag.data(), kRadianceFileIdentifier.data(), kRadianceFileIdentifier.size()) == 0 || std::memcmp(tag.data(), kRgbeFileIdentifier.data(), kRgbeFileIdentifier.size()) == 0; } } // namespace iglu::textureloader::stb::hdr ================================================ FILE: IGLU/texture_loader/stb_hdr/Header.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace iglu::textureloader::stb::hdr { using Tag = std::array; struct Header { Tag tag; [[nodiscard]] bool tagIsValid() const noexcept; }; static_assert(sizeof(Header) == 11); constexpr uint32_t kHeaderLength = static_cast(sizeof(Header)); } // namespace iglu::textureloader::stb::hdr ================================================ FILE: IGLU/texture_loader/stb_hdr/TextureLoaderFactory.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace iglu::textureloader::stb::hdr { TextureLoaderFactory::TextureLoaderFactory() noexcept : image::TextureLoaderFactory(true) {} uint32_t TextureLoaderFactory::minHeaderLength() const noexcept { return kHeaderLength; } bool TextureLoaderFactory::isIdentifierValid(DataReader headerReader) const noexcept { const Header* header = headerReader.as
(); return header->tagIsValid(); } } // namespace iglu::textureloader::stb::hdr ================================================ FILE: IGLU/texture_loader/stb_hdr/TextureLoaderFactory.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace iglu::textureloader::stb::hdr { /** * @brief ITextureLoaderFactory implementation for Radiance HDR files * @note File format specification: * https://radsite.lbl.gov/radiance/refer/filefmts.pdf */ class TextureLoaderFactory final : public image::TextureLoaderFactory { public: TextureLoaderFactory() noexcept; [[nodiscard]] uint32_t minHeaderLength() const noexcept final; private: [[nodiscard]] bool isIdentifierValid(DataReader headerReader) const noexcept final; }; } // namespace iglu::textureloader::stb::hdr ================================================ FILE: IGLU/texture_loader/stb_image/TextureLoaderFactory.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #ifdef WIN32 #define STBI_MSC_SECURE_CRT #endif // Do not use #define STB_IMAGE_IMPLEMENTATION // Instead rely on //arvr/third-party/stb:stb_image to provide the implementation #include namespace iglu::textureloader::stb::image { struct StbImageDeleter { void operator()(void* p) const { stbi_image_free(p); } }; namespace { class StbImageData : public IData { public: StbImageData(uint8_t* data, uint64_t size); [[nodiscard]] const uint8_t* IGL_NONNULL data() const noexcept final; [[nodiscard]] uint64_t size() const noexcept final; [[nodiscard]] ExtractedData extractData() noexcept final; private: std::unique_ptr data_; uint64_t size_; }; StbImageData::StbImageData(uint8_t* data, uint64_t size) : data_(std::unique_ptr(data)), size_(size) {} [[nodiscard]] const uint8_t* IGL_NONNULL StbImageData::data() const noexcept { IGL_DEBUG_ASSERT(data_ != nullptr); return data_.get(); } [[nodiscard]] uint64_t StbImageData::size() const noexcept { return size_; } IData::ExtractedData StbImageData::extractData() noexcept { return { .data = data_.release(), .size = size_, .deleter = &stbi_image_free, }; } class TextureLoader : public ITextureLoader { using Super = ITextureLoader; public: explicit TextureLoader(DataReader reader, int width, int height, bool isFloatFormat, igl::TextureFormat preferredFormat) noexcept; [[nodiscard]] bool canUploadSourceData() const noexcept final; [[nodiscard]] bool shouldGenerateMipmaps() const noexcept final; private: std::unique_ptr loadInternal(igl::Result* IGL_NULLABLE outResult) const noexcept final; bool isFloatFormat_; }; TextureLoader::TextureLoader(DataReader reader, int width, int height, bool isFloatFormat, igl::TextureFormat preferredFormat) noexcept : Super(reader), isFloatFormat_(isFloatFormat) { auto& desc = mutableDescriptor(); desc.format = preferredFormat != igl::TextureFormat::Invalid ? preferredFormat : (isFloatFormat ? igl::TextureFormat::RGBA_F32 : igl::TextureFormat::RGBA_UNorm8); desc.numLayers = 1; desc.width = static_cast(width); desc.height = static_cast(height); desc.depth = 1; desc.type = igl::TextureType::TwoD; // Floating point mipmaps not always supported desc.numMipLevels = isFloatFormat ? 1 : igl::TextureDesc::calcNumMipLevels(desc.width, desc.height); } bool TextureLoader::canUploadSourceData() const noexcept { return false; } bool TextureLoader::shouldGenerateMipmaps() const noexcept { return descriptor().numMipLevels > 1; } std::unique_ptr TextureLoader::loadInternal( igl::Result* IGL_NULLABLE outResult) const noexcept { const auto r = reader(); const int length = r.size() > std::numeric_limits::max() ? std::numeric_limits::max() : static_cast(r.size()); int x = 0, y = 0, comp = 0; void* data = nullptr; // Pass 4 for desired_channels to force RGBA instead of RGB. if (isFloatFormat_) { data = stbi_loadf_from_memory(r.data(), static_cast(length), &x, &y, &comp, 4); } else { data = stbi_load_from_memory(r.data(), static_cast(length), &x, &y, &comp, 4); } if (data == nullptr) { igl::Result::setResult(outResult, igl::Result::Code::RuntimeError, "Could not load image daa."); return nullptr; } return std::make_unique(reinterpret_cast(data), memorySizeInBytes()); } } // namespace TextureLoaderFactory::TextureLoaderFactory(bool isFloatFormat) noexcept : isFloatFormat_(isFloatFormat) {} bool TextureLoaderFactory::canCreateInternal(DataReader headerReader, igl::Result* IGL_NULLABLE outResult) const noexcept { if (!isIdentifierValid(headerReader)) { igl::Result::setResult(outResult, igl::Result::Code::InvalidOperation, "Incorrect identifier."); return false; } return true; } std::unique_ptr TextureLoaderFactory::tryCreateInternal( DataReader reader, igl::TextureFormat preferredFormat, igl::Result* IGL_NULLABLE outResult) const noexcept { const int length = reader.size() > std::numeric_limits::max() ? std::numeric_limits::max() : static_cast(reader.size()); int x = 0, y = 0, comp = 0; if (stbi_info_from_memory(reader.data(), length, &x, &y, &comp) == 0) { igl::Result::setResult( outResult, igl::Result::Code::InvalidOperation, "Could not get HDR metadata."); return nullptr; } if (x < 0 || y < 0 || comp < 0 || comp > 4) { igl::Result::setResult(outResult, igl::Result::Code::InvalidOperation, "Invalid HDR metadata."); return nullptr; } // Ensure the raw decompressed data size won't overflow signed int range when stb_image computes // it internally. PNG depth can be up to 16 bits, making the worst-case raw data size // approximately 2 * x * y * comp + y bytes. stb_image passes this value as int to // stbi_zlib_decode_malloc_guesssize_headerflag, so it must fit within INT_MAX to avoid // sign-extension to a huge size_t in malloc. const auto rawSizeEstimate = static_cast(x) * static_cast(y) * static_cast(comp) * 2 + static_cast(y); if (rawSizeEstimate > static_cast(std::numeric_limits::max())) { igl::Result::setResult(outResult, igl::Result::Code::InvalidOperation, "Image is too large."); return nullptr; } return std::make_unique(reader, x, y, isFloatFormat_, preferredFormat); } } // namespace iglu::textureloader::stb::image ================================================ FILE: IGLU/texture_loader/stb_image/TextureLoaderFactory.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace iglu::textureloader::stb::image { /** * @brief ITextureLoaderFactory base class for loading textures with STB Image */ class TextureLoaderFactory : public ITextureLoaderFactory { protected: explicit TextureLoaderFactory(bool isFloatFormat = false) noexcept; [[nodiscard]] virtual bool isIdentifierValid(DataReader headerReader) const noexcept = 0; private: [[nodiscard]] bool canCreateInternal(DataReader headerReader, igl::Result* IGL_NULLABLE outResult) const noexcept final; [[nodiscard]] std::unique_ptr tryCreateInternal( DataReader reader, igl::TextureFormat preferredFormat, igl::Result* IGL_NULLABLE outResult) const noexcept final; bool isFloatFormat_; }; } // namespace iglu::textureloader::stb::image ================================================ FILE: IGLU/texture_loader/stb_jpeg/Header.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace iglu::textureloader::stb::jpeg { namespace { constexpr const Tag kJpegFileIdentifier{{0xFF, 0xD8, 0xFF}}; } // namespace bool Header::tagIsValid() const noexcept { return std::memcmp(tag.data(), kJpegFileIdentifier.data(), kJpegFileIdentifier.size()) == 0; } } // namespace iglu::textureloader::stb::jpeg ================================================ FILE: IGLU/texture_loader/stb_jpeg/Header.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace iglu::textureloader::stb::jpeg { using Tag = std::array; struct Header { Tag tag; [[nodiscard]] bool tagIsValid() const noexcept; }; static_assert(sizeof(Header) == 3); constexpr uint32_t kHeaderLength = static_cast(sizeof(Header)); } // namespace iglu::textureloader::stb::jpeg ================================================ FILE: IGLU/texture_loader/stb_jpeg/TextureLoaderFactory.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace iglu::textureloader::stb::jpeg { uint32_t TextureLoaderFactory::minHeaderLength() const noexcept { return kHeaderLength; } bool TextureLoaderFactory::isIdentifierValid(DataReader headerReader) const noexcept { const Header* header = headerReader.as
(); return header->tagIsValid(); } } // namespace iglu::textureloader::stb::jpeg ================================================ FILE: IGLU/texture_loader/stb_jpeg/TextureLoaderFactory.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace iglu::textureloader::stb::jpeg { /** * @brief ITextureLoaderFactory implementation for JPEG files */ class TextureLoaderFactory final : public image::TextureLoaderFactory { public: TextureLoaderFactory() noexcept = default; [[nodiscard]] uint32_t minHeaderLength() const noexcept final; private: [[nodiscard]] bool isIdentifierValid(DataReader headerReader) const noexcept final; }; } // namespace iglu::textureloader::stb::jpeg ================================================ FILE: IGLU/texture_loader/stb_png/Header.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace iglu::textureloader::stb::png { namespace { constexpr const Tag kPngFileIdentifier{{0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a}}; } // namespace bool Header::tagIsValid() const noexcept { return std::memcmp(tag.data(), kPngFileIdentifier.data(), kPngFileIdentifier.size()) == 0; } } // namespace iglu::textureloader::stb::png ================================================ FILE: IGLU/texture_loader/stb_png/Header.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace iglu::textureloader::stb::png { using Tag = std::array; struct Header { Tag tag; [[nodiscard]] bool tagIsValid() const noexcept; }; static_assert(sizeof(Header) == 8); constexpr uint32_t kHeaderLength = static_cast(sizeof(Header)); } // namespace iglu::textureloader::stb::png ================================================ FILE: IGLU/texture_loader/stb_png/TextureLoaderFactory.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace iglu::textureloader::stb::png { uint32_t TextureLoaderFactory::minHeaderLength() const noexcept { // Require enough bytes for the full minimal PNG structure used by tests: // - 8-byte file signature // - IHDR chunk header + data + CRC // - IDAT chunk header + CRC (empty data) // // This ensures truncated buffers that still contain a valid PNG signature // are rejected early, while minimally valid headers succeed. constexpr uint32_t kMinimalPngHeaderLength = 45u; return kMinimalPngHeaderLength; } bool TextureLoaderFactory::isIdentifierValid(DataReader headerReader) const noexcept { const Header* header = headerReader.as
(); return header->tagIsValid(); } } // namespace iglu::textureloader::stb::png ================================================ FILE: IGLU/texture_loader/stb_png/TextureLoaderFactory.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace iglu::textureloader::stb::png { /** * @brief ITextureLoaderFactory implementation for PNG files */ class TextureLoaderFactory final : public image::TextureLoaderFactory { public: TextureLoaderFactory() noexcept = default; [[nodiscard]] uint32_t minHeaderLength() const noexcept final; private: [[nodiscard]] bool isIdentifierValid(DataReader headerReader) const noexcept final; }; } // namespace iglu::textureloader::stb::png ================================================ FILE: IGLU/texture_loader/xtc1/Header.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace iglu::textureloader::xtc1 { namespace { constexpr const Tag kXtc1FileIdentifier{0x49, 0x56, 0x41, 0x4e}; } // namespace bool Header::tagIsValid() const noexcept { return std::memcmp(magicTag.data(), kXtc1FileIdentifier.data(), kXtc1FileIdentifier.size()) == 0; } } // namespace iglu::textureloader::xtc1 ================================================ FILE: IGLU/texture_loader/xtc1/Header.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace iglu::textureloader::xtc1 { using Tag = std::array; // NOLINTNEXTLINE(cppcoreguidelines-pro-type-member-init) struct Header { static constexpr uint32_t kMaxMips = 12; static constexpr uint32_t kVersion = 0x00010002; Tag magicTag{0x49, 0x56, 0x41, 0x4e}; uint32_t version{kVersion}; uint32_t width{0}; uint32_t height{0}; union { struct { uint32_t numChannels : 3; uint32_t lossless : 1; uint32_t impasto : 1; uint32_t numMips : 4; }; uint32_t flags{0}; }; uint32_t mipSizes[kMaxMips]{}; uint32_t padding{0}; [[nodiscard]] bool tagIsValid() const noexcept; }; constexpr uint32_t kHeaderLength = static_cast(sizeof(Header)); } // namespace iglu::textureloader::xtc1 ================================================ FILE: IGLU/texture_loader/xtc1/TextureLoaderFactory.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #if defined(IGL_CMAKE_BUILD) #include #else #include #endif namespace iglu::textureloader::xtc1 { #if !defined(IGL_CMAKE_BUILD) namespace { // Helper function to determine XTC1 texture format based on number of channels igl::TextureFormat getXTC1Format(uint32_t numChannels) { switch (numChannels) { case 1: // @fb-only case 3: // @fb-only case 4: // @fb-only default: return igl::TextureFormat::Invalid; } } class TextureLoader final : public ITextureLoader { public: explicit TextureLoader(DataReader reader) noexcept : ITextureLoader(reader) { const Header* header = this->reader().as
(); // Determine the appropriate XTC1 compressed format based on number of channels igl::TextureFormat format = getXTC1Format(header->numChannels); igl::TextureDesc desc = igl::TextureDesc::new2D( format, header->width, header->height, igl::TextureDesc::TextureUsageBits::Sampled); mutableDescriptor() = desc; } protected: [[nodiscard]] std::unique_ptr loadInternal( igl::Result* IGL_NULLABLE outResult) const noexcept override { const uint8_t* compressedData = reader().data() + sizeof(Header); // Calculate the size of compressed data // For XTC1, each 16x16 block is 128 bytes, but the actual size varies due to variable length // encoding. We use the total file size minus the header size. const uint32_t compressedSize = reader().size() - sizeof(Header); // Return the compressed data as-is without decompression auto data = std::make_unique(compressedSize); auto err = try_checked_memcpy((uint8_t*)data.get(), compressedSize, compressedData, compressedSize); if (err != 0) { IGL_LOG_ERROR_ONCE("[IGL][Error] Failed to update texture buffer\n"); } return IData::tryCreate(std::move(data), compressedSize, outResult); } }; } // namespace uint32_t TextureLoaderFactory::minHeaderLength() const noexcept { return kHeaderLength; } bool TextureLoaderFactory::canCreateInternal(DataReader headerReader, igl::Result* IGL_NULLABLE outResult) const noexcept { if (headerReader.size() < kHeaderLength) { igl::Result::setResult( outResult, igl::Result::Code::ArgumentInvalid, "Header too small for XTC1 texture"); return false; } const Header* header = headerReader.as
(); const bool isValid = header->tagIsValid(); if (!isValid) { igl::Result::setResult( outResult, igl::Result::Code::ArgumentInvalid, "Invalid XTC1 texture header"); } return isValid; } std::unique_ptr TextureLoaderFactory::tryCreateInternal( DataReader reader, igl::TextureFormat preferredFormat, igl::Result* IGL_NULLABLE outResult) const noexcept { if (reader.size() < kHeaderLength) { igl::Result::setResult( outResult, igl::Result::Code::ArgumentInvalid, "Data too small for XTC1 texture"); return nullptr; } return std::make_unique(reader); } #else // Stub implementations for open source builds uint32_t TextureLoaderFactory::minHeaderLength() const noexcept { return 0; } bool TextureLoaderFactory::canCreateInternal(DataReader headerReader, igl::Result* IGL_NULLABLE outResult) const noexcept { igl::Result::setResult( outResult, igl::Result::Code::Unsupported, "XTC1 texture format not supported in this build"); return false; } std::unique_ptr TextureLoaderFactory::tryCreateInternal( DataReader reader, igl::TextureFormat preferredFormat, igl::Result* IGL_NULLABLE outResult) const noexcept { igl::Result::setResult( outResult, igl::Result::Code::Unsupported, "XTC1 texture format not supported in this build"); return nullptr; } #endif } // namespace iglu::textureloader::xtc1 ================================================ FILE: IGLU/texture_loader/xtc1/TextureLoaderFactory.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace iglu::textureloader::xtc1 { class TextureLoaderFactory final : public ITextureLoaderFactory { public: explicit TextureLoaderFactory() noexcept = default; [[nodiscard]] uint32_t minHeaderLength() const noexcept final; private: [[nodiscard]] bool canCreateInternal(DataReader headerReader, igl::Result* IGL_NULLABLE outResult) const noexcept final; [[nodiscard]] std::unique_ptr tryCreateInternal( DataReader reader, igl::TextureFormat preferredFormat, igl::Result* IGL_NULLABLE outResult) const noexcept final; }; } // namespace iglu::textureloader::xtc1 ================================================ FILE: IGLU/uniform/Collection.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace iglu::uniform { void Collection::update(const Collection& changes) { for (const auto& [key, value] : changes.descriptors_) { // Update should only modify values already in receiver; catch caller error otherwise IGL_DEBUG_ASSERT(descriptors_.find(key) != descriptors_.cend()); IGL_DEBUG_ASSERT(descriptors_.find(key)->second->getType() == value->getType()); auto indices = descriptors_[key]->getIndices(); // grab before old desc is nuked descriptors_[key] = value; descriptors_[key]->setIndices(indices); // propagate indices to descriptors } } void Collection::set(const igl::NameHandle& name, std::unique_ptr value) { if (descriptors_.find(name) == descriptors_.cend()) { names_.push_back(name); } descriptors_[name] = std::move(value); } void Collection::clear(const igl::NameHandle& name) { names_.erase(std::remove(names_.begin(), names_.end(), name), names_.end()); descriptors_.erase(name); } std::vector Collection::getNames() const noexcept { IGL_LOG_INFO_ONCE("Collection::getNames() is deprecated. Use Collection::names() instead\n"); std::vector ret; ret.reserve(descriptors_.size()); for (const auto& desc : descriptors_) { ret.push_back(desc.first); } return ret; } bool Collection::contains(const igl::NameHandle& name) const { return descriptors_.find(name) != descriptors_.end(); } const Descriptor& Collection::get(const igl::NameHandle& name) const { auto it = descriptors_.find(name); IGL_DEBUG_ASSERT(descriptors_.cend() != it); // already exists IGL_DEBUG_ASSERT(it->second); // unique_ptr not null return *(it->second); } Descriptor& Collection::get(const igl::NameHandle& name) { return const_cast(static_cast(this)->get(name)); } bool Collection::operator==(const Collection& rhs) const noexcept { return descriptors_ == rhs.descriptors_; } bool Collection::operator!=(const Collection& rhs) const noexcept { return !operator==(rhs); } } // namespace iglu::uniform ================================================ FILE: IGLU/uniform/Collection.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include namespace iglu::uniform { // Collection // // Holds a collection of uniform Descriptor instances keyed by igl::NameHandle // // To submit uniforms to the GPU, use uniform::Encoder. struct Collection { public: Collection() = default; void update(const Collection& changes); // Sets the given uniform value. void set(const igl::NameHandle& name, std::unique_ptr value); void clear(const igl::NameHandle& name); template void set(const igl::NameHandle& name, T value) { auto& uniform = getOrCreate(name); *uniform = std::move(value); } // Gets the reference of the descriptor with the given name and type. // If a descriptor with that name doesn't exist, a new descriptor with the given // name and type is created. // // ## Implementation Notes // // To implement getOrCreate, we use SFINAE (https://en.cppreference.com/w/cpp/types/enable_if) // to conditionally remove functions from overload resolution based on type traits // and to provide separate function overloads for different type traits: // // 1. for a T type that's *not* a vector // 2. for a T type that's a vector // // ## Appendix: Alternative // // An alternative that doesn't rely on SFINAE trickery: // // struct Detail { // template struct DescSelector; // // template // struct DescSelector { using Type = DescriptorValue; }; // // template // struct DescSelector { using Type = DescriptorVector; }; // // template // using DescSelector_t = typename DescSelector::Type; // }; // // template // auto& getOrCreate(const igl::NameHandle& name) { // using Desc = Detail::DescSelector_t::value>; // auto& uniform = findOrCreate(name); // return uniform; // } // 1. Override for a T type that's *not* a vector template::value, std::nullptr_t> = nullptr> auto& getOrCreate(const igl::NameHandle& name) { using Desc = DescriptorValue; auto& uniform = findOrCreate(name); return uniform; } // 2. Override for a T type that's a vector template::value, std::nullptr_t> = nullptr> auto& getOrCreate(const igl::NameHandle& name) { using Desc = DescriptorVector; auto& uniform = findOrCreate(name); return uniform; } // Gets the reference of the descriptor with the given name const Descriptor& get(const igl::NameHandle& name) const; Descriptor& get(const igl::NameHandle& name); // Checks if the name is in the collection bool contains(const igl::NameHandle& name) const; // DEPRECATED: use names() instead // Gets the list of NameHandles [[nodiscard]] std::vector getNames() const noexcept; const std::vector& names() const noexcept { return names_; } bool operator==(const Collection& rhs) const noexcept; bool operator!=(const Collection& rhs) const noexcept; private: template Desc& findOrCreate(const igl::NameHandle& name) { auto& entry = descriptors_[name]; // Create entry with the type Desc if it doesn't exist if (!entry) { entry = std::make_unique(); names_.push_back(name); } return static_cast(*entry); } private: std::unordered_map> descriptors_; std::vector names_; }; } // namespace iglu::uniform ================================================ FILE: IGLU/uniform/CollectionEncoder.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace iglu::uniform { CollectionEncoder::CollectionEncoder(igl::BackendType backendType) : backendType_(backendType) {} void CollectionEncoder::operator()( const Collection& collection, igl::IRenderCommandEncoder& commandEncoder, uint8_t bindTarget, const std::vector& uniformNames) const noexcept { const Encoder uniformEncoder(backendType_); for (const auto& name : uniformNames) { uniformEncoder(commandEncoder, bindTarget, collection.get(name)); } } } // namespace iglu::uniform ================================================ FILE: IGLU/uniform/CollectionEncoder.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl { class IRenderCommandEncoder; } // namespace igl namespace iglu::uniform { struct Collection; // CollectionEncoder // // Submits uniforms corresponding to uniformNames in the source collection // class CollectionEncoder { public: explicit CollectionEncoder(igl::BackendType backendType); void operator()(const Collection& collection, igl::IRenderCommandEncoder& commandEncoder, uint8_t bindTarget, const std::vector& uniformNames) const noexcept; private: igl::BackendType backendType_; }; } // namespace iglu::uniform ================================================ FILE: IGLU/uniform/Descriptor.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include namespace iglu::uniform { Descriptor::Descriptor(igl::UniformType type) : type_(type) {} igl::UniformType Descriptor::getType() const noexcept { return type_; } int Descriptor::getIndex(igl::ShaderStage stage) const noexcept { return indices_[EnumToValue(stage)]; } void Descriptor::setIndex(igl::ShaderStage stage, int newValue) noexcept { indices_[EnumToValue(stage)] = newValue; } #if IGL_BACKEND_OPENGL void Descriptor::toUniformDescriptor(int location, igl::UniformDesc& outDescriptor) const noexcept { outDescriptor.location = location; outDescriptor.offset = 0; outDescriptor.type = type_; outDescriptor.numElements = size(); outDescriptor.elementStride = igl::sizeForUniformType(type_); } #endif } // namespace iglu::uniform ================================================ FILE: IGLU/uniform/Descriptor.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include #include namespace iglu::uniform { // ---------------------------------------------------------------------------- namespace { enum class Alignment { Packed, Aligned }; template struct PackedValue { T value; static_assert(Trait::kPadding == 0, "!"); PackedValue() = default; explicit PackedValue(T v) : value(std::move(v)) {} void* data(Alignment /*unused*/) noexcept { return &value; } [[nodiscard]] const void* data(Alignment /*unused*/) const noexcept { return &value; } }; template struct AlignedValue { static_assert(Trait::kPadding > 0, "Only T types that require padding should be used!"); T value; uint8_t padding[Trait::kPadding]; // pads the end of the struct to ensure alignment AlignedValue() = default; explicit AlignedValue(T v) : value(std::move(v)) {} void* data(Alignment /*unused*/) noexcept { return &value; } [[nodiscard]] const void* data(Alignment /*unused*/) const noexcept { return &value; } }; template struct AlignedElement : AlignedValue { using AlignedValue::AlignedValue; }; // glm::mat3 requires padding within each row, not just at the end // If aligned data is requested, an update occurs: packed => aligned template<> struct AlignedElement { using Self = AlignedElement; using AlignedMat3 = Trait::Aligned; glm::mat3 value; // this is the "source of truth" mutable AlignedMat3 valueAligned; // padded element shadows value // NOLINTNEXTLINE(clang-diagnostic-unused-member-function) AlignedElement() = default; // NOLINTNEXTLINE(clang-diagnostic-unused-member-function) explicit AlignedElement(glm::mat3 v) : value(v) {} // NOLINTNEXTLINE(clang-diagnostic-unused-member-function) void* data(Alignment alignment) noexcept { return const_cast(static_cast(this)->data(alignment)); } const void* data(Alignment alignment) const noexcept { if (Alignment::Aligned == alignment) { Trait::toAligned(valueAligned, value); // Sync from source of truth return &valueAligned; } IGL_DEBUG_ASSERT(Alignment::Packed == alignment); return &value; } }; template struct AlignedElementInVector : AlignedValue { using AlignedValue::AlignedValue; AlignedElementInVector& operator=(const U& src) noexcept { this->value = src; return *this; } }; // glm::mat3 needs specialization b/c requires padding within each row, not just at the end template<> struct AlignedElementInVector : PackedValue::Aligned> { using PackedValue::Aligned>::PackedValue; // NOLINTNEXTLINE(clang-diagnostic-unused-member-function) AlignedElementInVector& operator=(const glm::mat3& src) noexcept { Trait::toAligned(this->value, src); return *this; } }; } // namespace // ---------------------------------------------------------------------------- // Descriptor, DescriptorValue, DescriptorVector // // These classes are intended to be used to encapsulate simple uniforms. In particular, // it's designed for the use case of small uniforms < 4KB (vs uniform buffers/blocks) // // Descriptor is the base interface so you can hold heterogeneous collections // of different uniforms, i.e. a mix of DescriptorValue and DescriptorVector // with different T types. // // To store the actual uniform data, you instantiate one of the following: // // * DescriptorValue is for single T values. // * DescriptorVector is for a vector of T values. // // To submit this uniform to the GPU, use uniform::Encoder. struct Descriptor { protected: explicit Descriptor(igl::UniformType type); public: virtual ~Descriptor() = default; [[nodiscard]] virtual const void* data(Alignment alignment) const noexcept = 0; [[nodiscard]] virtual size_t numBytes(Alignment alignment) const noexcept = 0; [[nodiscard]] virtual size_t size() const noexcept { return 1; } [[nodiscard]] igl::UniformType getType() const noexcept; [[nodiscard]] int getIndex(igl::ShaderStage stage) const noexcept; void setIndex(igl::ShaderStage stage, int newValue) noexcept; using Indices = std::array; [[nodiscard]] Indices getIndices() const noexcept { return indices_; } void setIndices(Indices indices) noexcept { indices_ = indices; } void toUniformDescriptor(int location, igl::UniformDesc& outDescriptor) const noexcept; private: igl::UniformType type_ = igl::UniformType::Invalid; Indices indices_ = {-1, -1}; // index for each shader stage }; // ---------------------------------------------------------------------------- // DescriptorValue // // DescriptorValue represents a single value uniform // // glm::vec4 red(1.0f, 0.0f, 0.0f, 1.0f) // DescriptorValue colorUniform(std::move(red)); // // You can access the underlying value using pointer semantics: // // glm::vec4& color = *colorUniform; // template class DescriptorValue : public Descriptor { static constexpr bool kNoPadding = (Trait::kPadding == 0); template using PackedElement = PackedValue; using Element = std::conditional_t, AlignedElement>; public: using Self = DescriptorValue; DescriptorValue() : Descriptor(Trait::kValue) {} explicit DescriptorValue(T value) : Descriptor(Trait::kValue), element_(std::move(value)) {} [[nodiscard]] const void* data(Alignment alignment) const noexcept override { return element_.data(alignment); } [[nodiscard]] size_t numBytes(Alignment alignment) const noexcept override { IGL_DEBUG_ASSERT(sizeForUniformType(getType()) <= sizeof(Element)); // NOTE: Any padding required for T to be aligned will be present in Element return sizeof(T) + (Alignment::Packed == alignment ? 0 : Trait::kPadding); } const T& operator*() const noexcept { return element_.value; } T& operator*() noexcept { return element_.value; } private: Element element_; }; // ---------------------------------------------------------------------------- // DescriptorVector // // DescriptorVector represents a vector of T values. It provides underlying // storage for the data: // // size_t numParticles = 10; // std::vector colors; // colors.reserve(numParticles); // for(int i = 0; i < numParticles; ++i) { // colors.emplace_back(1.0, 1.0, (float)i/numParticles); // } // DescriptorVector particleColors(std::move(colors)); // // You can access the underlying vector using pointer semantics: // // std::vector& colors = *particleColors; // // NOTE: DescriptorVector will have a parallel internal std::vector where each // element is aligned for T types that require it. // template> class DescriptorVector : public Descriptor { static constexpr bool kNoPadding = (Trait::kPadding == 0); struct PackedContainer { Vector values; PackedContainer() = default; explicit PackedContainer(Vector vec) : values(std::move(vec)) {} void* data(Alignment /*unused*/) noexcept { return values.data(); } [[nodiscard]] const void* data(Alignment /*unused*/) const noexcept { return values.data(); } [[nodiscard]] size_t elementSize(Alignment /*unused*/) const noexcept { return sizeof(T); } }; // Contains both packed and aligned vectors // If aligned data is requested, an update occurs: packed => aligned struct DualContainer { Vector values; // this is the "source of truth" // padded elements shadow those in values mutable std::vector> valuesAligned; DualContainer() = default; explicit DualContainer(Vector vec) : values(std::move(vec)) {} void* data(Alignment /*alignment*/) noexcept { return const_cast(static_cast(this)->data()); } const void* data(Alignment alignment) const noexcept { if (Alignment::Aligned == alignment) { // Sync from source of truth const size_t numElements = values.size(); valuesAligned.resize(numElements); for (size_t i = 0; i < numElements; ++i) { const auto& src = values[i]; auto& dst = valuesAligned[i]; dst = src; } return valuesAligned.data(); } IGL_DEBUG_ASSERT(Alignment::Packed == alignment); return values.data(); } size_t elementSize(Alignment alignment) const noexcept { return (Alignment::Packed == alignment ? sizeof(T) : sizeof(AlignedElementInVector)); } }; using Container = std::conditional_t; public: using Self = DescriptorVector; DescriptorVector() : Descriptor(Trait::kValue) {} explicit DescriptorVector(Vector values) : Descriptor(Trait::kValue), container_(std::move(values)) {} [[nodiscard]] const void* data(Alignment alignment) const noexcept override { return container_.data(alignment); } [[nodiscard]] size_t numBytes(Alignment alignment) const noexcept override { size_t elementSize = container_.elementSize(alignment); IGL_DEBUG_ASSERT(sizeForUniformType(getType()) <= elementSize); return container_.values.size() * elementSize; } [[nodiscard]] size_t size() const noexcept override { return container_.values.size(); } const Vector& operator*() const noexcept { return container_.values; } Vector& operator*() noexcept { return container_.values; } private: Container container_; }; // ---------------------------------------------------------------------------- } // namespace iglu::uniform ================================================ FILE: IGLU/uniform/Encoder.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include // IWYU pragma: keep namespace iglu::uniform { // ---------------------------------------------------------------------------- namespace { #if IGL_BACKEND_OPENGL void bindRenderUniform(igl::IRenderCommandEncoder& encoder, int bufferIndex, const Descriptor& uniform) { // The openGL backend shaders use uniforms instead of uniformBlocks igl::UniformDesc descriptor; uniform.toUniformDescriptor(bufferIndex, descriptor); const void* data = uniform.data(Alignment::Packed); encoder.bindUniform(descriptor, data); } void bindComputeUniform(igl::IComputeCommandEncoder& encoder, int bufferIndex, const Descriptor& uniform) { // The openGL backend shaders use uniforms instead of uniformBlocks igl::UniformDesc descriptor; uniform.toUniformDescriptor(bufferIndex, descriptor); const void* data = uniform.data(Alignment::Packed); encoder.bindUniform(descriptor, data); } #endif void encodeRenderUniform(igl::IRenderCommandEncoder& encoder, int bufferIndex, uint8_t bindTarget, const Descriptor& uniform, Alignment alignment) { const void* data = uniform.data(alignment); const size_t numBytes = uniform.numBytes(alignment); IGL_DEBUG_ASSERT(numBytes <= 4 * 1024, "bindBytes should only be used for uniforms smaller than 4kb"); encoder.bindBytes(bufferIndex, bindTarget, data, static_cast(numBytes)); } void encodeAlignedCompute(igl::IComputeCommandEncoder& encoder, int bufferIndex, const Descriptor& uniform) { const void* data = uniform.data(Alignment::Aligned); const size_t numBytes = uniform.numBytes(Alignment::Aligned); IGL_DEBUG_ASSERT(numBytes <= 4 * 1024, "bindBytes should only be used for uniforms smaller than 4kb"); encoder.bindBytes(bufferIndex, data, static_cast(numBytes)); } } // namespace // ---------------------------------------------------------------------------- Encoder::Encoder(igl::BackendType backendType) : backendType_(backendType) {} void Encoder::operator()(igl::IRenderCommandEncoder& encoder, uint8_t bindTarget, const Descriptor& uniform) const noexcept { const int bufferIndex = uniform.getIndex(bindTarget == igl::BindTarget::kVertex ? igl::ShaderStage::Vertex : igl::ShaderStage::Fragment); if (!IGL_DEBUG_VERIFY(bufferIndex >= 0)) { return; } if (backendType_ == igl::BackendType::OpenGL) { #if IGL_BACKEND_OPENGL bindRenderUniform(encoder, bufferIndex, uniform); #else IGL_DEBUG_ASSERT_NOT_REACHED(); #endif } else if (backendType_ == igl::BackendType::Metal) { encodeRenderUniform(encoder, bufferIndex, bindTarget, uniform, Alignment::Aligned); } else if (backendType_ == igl::BackendType::Vulkan) { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); // @fb-only // @fb-only } else { IGL_DEBUG_ASSERT_NOT_REACHED(); } } void Encoder::operator()(igl::IComputeCommandEncoder& encoder, const Descriptor& uniform) const noexcept { const int bufferIndex = uniform.getIndex(igl::ShaderStage::Compute); if (!IGL_DEBUG_VERIFY(bufferIndex >= 0)) { return; } if (backendType_ == igl::BackendType::OpenGL) { #if IGL_BACKEND_OPENGL bindComputeUniform(encoder, bufferIndex, uniform); #else IGL_DEBUG_ASSERT_NOT_REACHED(); #endif } else if (backendType_ == igl::BackendType::Metal) { encodeAlignedCompute(encoder, bufferIndex, uniform); } else if (backendType_ == igl::BackendType::Vulkan) { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); // @fb-only // @fb-only } } } // namespace iglu::uniform ================================================ FILE: IGLU/uniform/Encoder.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl { class IComputeCommandEncoder; } // namespace igl namespace iglu::uniform { struct Descriptor; // Encoder submits an uniform described by Descriptor. // // It handles backend-specific details: // * For Metal, it calls igl::IRenderCommandEncoder::bindBytes() or // igl::IComputeCommandEncoder::bindBytes() // * For OpenGL, it calls igl::RenderCommandEncoder::bindUniform() or // igl::IComputeCommandEncoder::bindUniform() class Encoder { public: explicit Encoder(igl::BackendType backendType); void operator()(igl::IRenderCommandEncoder& encoder, uint8_t bindTarget, const Descriptor& uniform) const noexcept; void operator()(igl::IComputeCommandEncoder& encoder, const Descriptor& uniform) const noexcept; private: igl::BackendType backendType_; }; } // namespace iglu::uniform ================================================ FILE: IGLU/uniform/Trait.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include // IWYU pragma: keep #include namespace iglu::uniform { // ---------------------------------------------------------------------------- namespace { template class REF> struct IsSpecialization : std::false_type {}; template class REF, typename... Args> struct IsSpecialization, REF> : std::true_type {}; } // namespace // ---------------------------------------------------------------------------- template struct Trait { static constexpr igl::UniformType kValue = igl::UniformType::Invalid; static constexpr size_t kPadding = 0; }; template<> struct Trait { using Aligned = bool; static constexpr igl::UniformType kValue = igl::UniformType::Boolean; static constexpr size_t kPadding = 0; }; template<> struct Trait { using Aligned = int; static constexpr igl::UniformType kValue = igl::UniformType::Int; static constexpr size_t kPadding = 0; }; template<> struct Trait { using Aligned = glm::ivec2; static constexpr igl::UniformType kValue = igl::UniformType::Int2; static constexpr size_t kPadding = 0; }; template<> struct Trait { using Aligned = glm::ivec4; static constexpr igl::UniformType kValue = igl::UniformType::Int3; static constexpr size_t kPadding = sizeof(Aligned) - sizeof(glm::ivec3); }; template<> struct Trait { using Aligned = glm::ivec4; static constexpr igl::UniformType kValue = igl::UniformType::Int4; static constexpr size_t kPadding = 0; }; template<> struct Trait { using Aligned = float; static constexpr igl::UniformType kValue = igl::UniformType::Float; static constexpr size_t kPadding = 0; }; template<> struct Trait { using Aligned = glm::vec2; static constexpr igl::UniformType kValue = igl::UniformType::Float2; static constexpr size_t kPadding = 0; }; template<> struct Trait { using Aligned = glm::vec4; static constexpr igl::UniformType kValue = igl::UniformType::Float3; static constexpr size_t kPadding = sizeof(Aligned) - sizeof(glm::vec3); }; template<> struct Trait { using Aligned = glm::vec4; static constexpr igl::UniformType kValue = igl::UniformType::Float4; static constexpr size_t kPadding = 0; }; template<> struct Trait { using Aligned = glm::mat2; static constexpr igl::UniformType kValue = igl::UniformType::Mat2x2; static constexpr size_t kPadding = 0; }; template<> struct Trait { using Aligned = std::array; // each row of matrix is 16-byte aligned static_assert(sizeof(Aligned) == 3 * sizeof(glm::vec4), "Aligned is the wrong size!"); static void toAligned(Aligned& outData, const glm::mat3& src) noexcept { const auto* srcMatrix = static_cast(glm::value_ptr(src)); for (int i = 0; i < 3; i++) { auto* outRow = static_cast(glm::value_ptr(outData[i])); for (int j = 0; j < 3; j++) { *outRow++ = *srcMatrix++; } } } static constexpr igl::UniformType kValue = igl::UniformType::Mat3x3; static constexpr size_t kPadding = sizeof(Aligned) - sizeof(glm::mat3); }; template<> struct Trait { using Aligned = glm::mat4; static constexpr igl::UniformType kValue = igl::UniformType::Mat4x4; static constexpr size_t kPadding = 0; }; } // namespace iglu::uniform ================================================ FILE: LICENSE.md ================================================ MIT License Copyright (c) Meta Platforms, Inc. and affiliates. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ## Dependencies 3D-Graphics-Rendering-Cookbook https://github.com/PacktPublishing/3D-Graphics-Rendering-Cookbook/blob/master/LICENSE Amazon Lumberyard Bistro https://developer.nvidia.com/orca/amazon-lumberyard-bistro https://casual-effects.com/data/ bc7env https://github.com/richgel999/bc7enc/blob/master/LICENSE Big Buck Bunny - the Peach open movie project https://peach.blender.org/about/ Bootstrap https://github.com/corporateshark/bootstrapping/blob/master/LICENSE Color Checker https://en.wikipedia.org/wiki/File:Color_Checker.pdf Damaged Helmet https://github.com/KhronosGroup/glTF-Sample-Models/blob/master/2.0/DamagedHelmet/README.md EGL https://github.com/McNopper/EGL/blob/master/EGL/LICENCE.txt fmt https://github.com/fmtlib/fmt/blob/master/LICENSE.rst glew https://github.com/nigels-com/glew/blob/master/LICENSE.txt glfw https://github.com/glfw/glfw/blob/master/LICENSE.md glm https://github.com/g-truc/glm glslang https://github.com/KhronosGroup/glslang/blob/main/LICENSE.txt googletest https://github.com/google/googletest/blob/main/LICENSE imgui https://github.com/ocornut/imgui/blob/master/LICENSE.txt ios-cmake https://github.com/leetal/ios-cmake/blob/master/LICENSE.md KTX-Software https://github.com/KhronosGroup/KTX-Software/blob/main/LICENSE.md LightweightVK https://github.com/corporateshark/lightweightvk/blob/main/LICENSE.md Meshoptimizer https://github.com/zeux/meshoptimizer/blob/master/LICENSE.md Spark SL https://github.com/facebook/igl/releases/download/SparkSL/SparkSL.LICENSE stb https://github.com/nothings/stb/blob/master/LICENSE taskflow https://github.com/taskflow/taskflow/blob/master/LICENSE tinyobjloader https://github.com/tinyobjloader/tinyobjloader/blob/release/LICENSE tracy https://github.com/wolfpld/tracy/blob/master/LICENSE volk https://github.com/zeux/volk/blob/master/LICENSE.md Vulkan Memory Allocator https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator/blob/master/LICENSE.txt ================================================ FILE: README.md ================================================
IGL Logo [![Build Status](https://github.com/facebook/igl/actions/workflows/c-cpp.yml/badge.svg)](https://github.com/facebook/igl/actions)
Intermediate Graphics Library (IGL) is a cross-platform library that commands the GPU. It encapsulates common GPU functionality with a low-level cross-platform interface. IGL is designed to support multiple backends implemented on top of various graphics APIs (e.g. OpenGL, Metal and Vulkan) with a common interface. There are a lot of good options for abstracting GPU API's; each making different trade-offs. We designed IGL around the following priorities: 1. *Low-level, forward-looking API.* IGL embraces modern abstractions (command buffers, state containers, bindless, etc) and is designed to give more control than OpenGL's state machine API. As a result, IGL can have leaner backends for modern API's (e.g. Metal, Vulkan). 2. *Minimal overhead for C++.* IGL supports new or existing native rendering code without overhead of language interop or the need for other language runtimes. 3. *Reach + scale in production.* IGL has been globally battle-tested for broad device reliability (especially the long-tail of Android devices as well as Quest 2/3/Pro compatibility for OpenGL/Vulkan) *and* performance-tuned on our apps. ## Supported rendering backends * Metal 2+ * OpenGL 2.x (requires [GL_ARB_framebuffer_object](https://registry.khronos.org/OpenGL/extensions/ARB/ARB_framebuffer_object.txt)) * OpenGL 3.1+ * OpenGL ES 2.0+ * Vulkan 1.2 * WebGL 2.0 ## Supported platforms * Android * iOS * Linux * macOS * Windows * WebAssembly ## API Support | | Windows | Linux | macOS | iOS | Android | | ------------------------ | -------------------------- | -------------------------- | ----------------------------- | ----------------------------- | ---------------------------------- | | Vulkan 1.2 | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: (MoltenVK) | :heavy_multiplication_x: | :heavy_check_mark: (Quest 2/3/Pro) | | OpenGL ES 2.0 - 3.0 | :heavy_check_mark: (Angle) | :heavy_check_mark: (Angle) | :heavy_multiplication_x: | :heavy_check_mark: | :heavy_check_mark: | | OpenGL ES 3.1 - 3.2 | :heavy_check_mark: (Angle) | :heavy_check_mark: (Angle) | :heavy_multiplication_x: | :heavy_multiplication_x: | :heavy_check_mark: | | OpenGL 3.1 - 4.6 | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_multiplication_x: | :heavy_multiplication_x: | | Metal 2 | :heavy_multiplication_x: | :heavy_multiplication_x: | :heavy_check_mark: | :heavy_check_mark: | :heavy_multiplication_x: | ## Build Before building, run the deployment scripts: ``` python3 deploy_content.py python3 deploy_deps.py ``` These scripts download external third-party dependencies. Please check [Dependencies](./LICENSE.md) for the full list. * Windows ``` cd build cmake .. -G "Visual Studio 17 2022" ``` * Linux ``` sudo apt-get install clang xorg-dev libxinerama-dev libxcursor-dev libgles2-mesa-dev libegl1-mesa-dev libglfw3-dev libglew-dev libstdc++-12-dev cd build cmake .. -G "Unix Makefiles" ``` * macOS ``` cd build cmake .. -G "Xcode" -DIGL_WITH_VULKAN=OFF ``` * iOS ``` cd build cmake .. -G Xcode -DCMAKE_TOOLCHAIN_FILE=../third-party/deps/src/ios-cmake/ios.toolchain.cmake -DDEPLOYMENT_TARGET=13.0 -DPLATFORM=OS64 ``` * Android The Gradle project is located within the [build/android](./build/android/) folder. * WebAssembly Please install [Emscripten](https://emscripten.org/docs/getting_started/downloads.html) and [Ninja](https://ninja-build.org/). ``` cd build emcmake cmake .. -G Ninja cmake --build . ``` ## Screenshots ![image](.github/screenshot01.png) ![image](.github/screenshot02.png) ## License IGL is released under the MIT license, see [LICENSE.md](./LICENSE.md) for the full text as well as third-party library acknowledgements. SparkSL Compiler is released under the SparkSL Compiler License, see [LICENSE](https://github.com/facebook/igl/releases/download/SparkSL/SparkSL.LICENSE) for full text. ================================================ FILE: ROADMAP.md ================================================ We deeply appreciate and value the significance of Open Source projects. It is with great pleasure that we would like to share our admiration for your roadmap vision. Should you require additional ideas for areas in which we can contribute, we have prepared a selection that we believe will be of interest to you. Our plans encompass the following projects: ## IGL Open Source effort: * Support SparkSL CLI tools to utilize SparkSL shaders in RenderSessions. * Develop new RenderSession examples. * Add OpenXR Android project. ## IGL evolution: * Implement Queries support. * Develop a Synchronization primitives API (addressing dependencies between drawcalls, also known as framegraph). * Enable asynchronous loading of resources. * Provide a Multi-threading API. * Enhance sRGB support. * Finish MSAA (Multi-Sample Anti-Aliasing) support. * Ensure consistent instrumentation coverage. * Achieve consistent resource tracking coverage. Furthermore, we would like to present some ideas for potential supporters: ## How you can help: * Assist with new API porting, such as DirectX, WebGPU, or any preferred platform of your choice. * Contribute to the creation of additional examples, elevating their quality and diversity. * Explore fancy projects involving web-based tools and integration with IDEs. * Collaborate on the development of an IGL command capture and playback system. Offer expertise in playback on varying backends, providing an added bonus to the functionality. We firmly believe that by collaborating on these initiatives, we can collectively foster an environment of growth and advancement in the field of graphics development. Thank you for considering our contributions and for the opportunity to be part of your vision. ================================================ FILE: build/.gitignore ================================================ * *.* !.gitignore !android/ !android/** android/.gitignore ================================================ FILE: cmake/IGLConfig.cmake.in ================================================ # Copyright (c) Meta Platforms, Inc. and affiliates. # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. # IGLConfig.cmake.in - CMake configuration file for IGL # This file allows users to find and use IGL with find_package(IGL) # # This file is still essential even with dynamic target discovery because: # 1. It provides the find_package(IGL) interface for users # 2. It manages system dependencies (OpenGL, Vulkan, etc.) # 3. It validates requested components # 4. It creates convenient interface targets like IGL::IGL # 5. It works with the dynamically discovered targets from install.cmake @PACKAGE_INIT@ # Include required CMake modules include(CMakeFindDependencyMacro) include(CMakePackageConfigHelpers) # Try to find optional dependencies (third-party libs were removed from exported targets) # These are only needed if user wants to use IGL features that depend on them # Try to find fmt (optional) find_package(fmt QUIET) if(fmt_FOUND) message(STATUS "IGL: Found fmt library") else() message(STATUS "IGL: fmt library not found - some features may not be available") endif() # Find required system dependencies before including targets # These dependencies are needed by the exported targets # Find required system dependencies before including targets # These dependencies are needed by the exported targets # Find Threads (required by glslang and other components) find_package(Threads REQUIRED) # Find dependencies based on what targets are actually available # This approach is more efficient and only searches for what's needed # Find dependencies based on what targets are actually available # Find fmt (commonly used by IGL) # find_dependency(fmt QUIET) # if(NOT fmt_FOUND) # message(STATUS "IGL: fmt library not found - using built-in version") # endif() # Include the targets file first (if it exists) if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/IGLTargets.cmake") include("${CMAKE_CURRENT_LIST_DIR}/IGLTargets.cmake") set(IGL_TARGETS_AVAILABLE TRUE) else() message(STATUS "IGL: No library targets available - header-only installation") set(IGL_TARGETS_AVAILABLE FALSE) endif() # Check which backends are available and find their dependencies (only if targets are available) if(IGL_TARGETS_AVAILABLE) if(TARGET IGL::IGLOpenGL) find_package(OpenGL QUIET) if(NOT OpenGL_FOUND) message(STATUS "IGL: OpenGL not found - IGLOpenGL backend may not work properly") endif() endif() if(TARGET IGL::IGLVulkan) find_package(Vulkan QUIET) if(NOT Vulkan_FOUND) message(STATUS "IGL: Vulkan SDK not found - IGLVulkan backend may not work properly") endif() endif() endif() # Find optional dependencies only if explicitly requested if(IGL_FIND_COMPONENTS) if("Shell" IN_LIST IGL_FIND_COMPONENTS OR "samples" IN_LIST IGL_FIND_COMPONENTS) find_package(glfw3 QUIET) if(NOT glfw3_FOUND) message(STATUS "IGL: GLFW not found - shell and samples may not be available") endif() endif() if("OpenXR" IN_LIST IGL_FIND_COMPONENTS) find_package(OpenXR QUIET) if(NOT OpenXR_FOUND) message(STATUS "IGL: OpenXR SDK not found - VR/AR features not available") endif() endif() endif() # Dynamically discover available components by checking exported targets set(IGL_AVAILABLE_COMPONENTS "") # Get all available IGL targets and extract component names get_property(available_targets DIRECTORY PROPERTY IMPORTED_TARGETS) if(NOT available_targets) # Fallback: get targets from current directory execute_process(COMMAND ${CMAKE_COMMAND} -E echo "Discovering available IGL targets..." OUTPUT_QUIET) endif() # Function to extract component name from target function(extract_component_name target_name result_var) # Remove IGL:: namespace prefix string(REPLACE "IGL::" "" component_name "${target_name}") set(${result_var} "${component_name}" PARENT_SCOPE) endfunction() # Check for core and common targets set(IGL_EXPECTED_TARGETS "IGL::IGLLibrary" "IGL::IGLOpenGL" "IGL::IGLVulkan" "IGL::IGLMetal" "IGL::IGLGlslang" "IGL::IGLstb" "IGL::IGLUimgui" "IGL::IGLUmanagedUniformBuffer" "IGL::IGLUsentinel" "IGL::IGLUshaderCross" "IGL::IGLUsimple_renderer" "IGL::IGLUstate_pool" "IGL::IGLUtexture_accessor" "IGL::IGLUtexture_loader" "IGL::IGLUuniform" "IGL::IGLUsimdtypes") # Only discover components if targets are available if(IGL_TARGETS_AVAILABLE) foreach(expected_target ${IGL_EXPECTED_TARGETS}) if(TARGET ${expected_target}) extract_component_name(${expected_target} component_name) list(APPEND IGL_AVAILABLE_COMPONENTS ${component_name}) endif() endforeach() else() # For header-only installation, mark as having core headers available list(APPEND IGL_AVAILABLE_COMPONENTS "Headers") endif() # Check if requested components are available if(IGL_FIND_COMPONENTS) foreach(component ${IGL_FIND_COMPONENTS}) if(NOT ${component} IN_LIST IGL_AVAILABLE_COMPONENTS) set(IGL_FOUND FALSE) set(IGL_NOT_FOUND_MESSAGE "Component ${component} is not available") return() endif() endforeach() endif() # Set up interface targets for convenience (only if targets are available) if(IGL_TARGETS_AVAILABLE AND NOT TARGET IGL::IGL) # Create main interface target that includes core library add_library(IGL::IGL INTERFACE IMPORTED) # Always link core library if available if(TARGET IGL::IGLLibrary) target_link_libraries(IGL::IGL INTERFACE IGL::IGLLibrary) endif() # Dynamically add available backend libraries set(IGL_BACKEND_TARGETS "IGL::IGLOpenGL" "IGL::IGLVulkan" "IGL::IGLMetal") foreach(backend_target ${IGL_BACKEND_TARGETS}) if(TARGET ${backend_target}) target_link_libraries(IGL::IGL INTERFACE ${backend_target}) endif() endforeach() # Add commonly used IGLU components to the main target set(IGL_COMMON_IGLU_TARGETS "IGL::IGLUsimdtypes" "IGL::IGLUsentinel" "IGL::IGLstb") foreach(iglu_target ${IGL_COMMON_IGLU_TARGETS}) if(TARGET ${iglu_target}) target_link_libraries(IGL::IGL INTERFACE ${iglu_target}) endif() endforeach() elseif(NOT IGL_TARGETS_AVAILABLE) # For header-only installation, create a minimal interface target with just include directories if(NOT TARGET IGL::IGL) add_library(IGL::IGL INTERFACE IMPORTED) set_target_properties(IGL::IGL PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_INSTALL_INCLUDEDIR}") message(STATUS "IGL: Created header-only interface target IGL::IGL") endif() endif() # Print information about found IGL if(NOT IGL_FIND_QUIETLY) if(IGL_TARGETS_AVAILABLE) message(STATUS "Found IGL with library targets") else() message(STATUS "Found IGL (headers only)") endif() message(STATUS "Available components: ${IGL_AVAILABLE_COMPONENTS}") endif() # Check if all required components were found if(IGL_FIND_COMPONENTS) foreach(component ${IGL_FIND_COMPONENTS}) if(NOT ${component} IN_LIST IGL_AVAILABLE_COMPONENTS) if(IGL_FIND_REQUIRED_${component}) set(IGL_FOUND FALSE) if(NOT IGL_TARGETS_AVAILABLE) set(IGL_NOT_FOUND_MESSAGE "Required component ${component} is not available (header-only installation)") else() set(IGL_NOT_FOUND_MESSAGE "Required component ${component} is not available") endif() return() endif() endif() endforeach() endif() set(IGL_FOUND TRUE) ================================================ FILE: cmake/install.cmake ================================================ # Copyright (c) Meta Platforms, Inc. and affiliates. # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. # IGL Install Configuration # This file contains all install logic to minimize changes to original CMake files if(NOT IGL_ENABLE_INSTALL) return() endif() include(GNUInstallDirs) include(CMakePackageConfigHelpers) message(STATUS "Configuring IGL install targets...") message(STATUS "Note: fmt target gets special handling to fix PUBLIC_HEADER path conflicts") message(STATUS " We clear fmt's PUBLIC_HEADER and install headers manually from correct location") # Function to fix include directories for install function(igl_fix_target_includes target_name) if(NOT TARGET ${target_name}) return() endif() get_target_property(current_includes ${target_name} INTERFACE_INCLUDE_DIRECTORIES) if(current_includes) set(new_includes "") foreach(include_dir ${current_includes}) # Filter out problematic include directories if("${include_dir}" MATCHES "${CMAKE_BINARY_DIR}") # For build directory paths, convert them to build interface only # This prevents them from being included in the install interface list(APPEND new_includes "$") continue() endif() # Convert known paths to generator expressions if("${include_dir}" STREQUAL "${IGL_ROOT_DIR}/src") list(APPEND new_includes "$" "$") elseif("${include_dir}" STREQUAL "${IGL_ROOT_DIR}/third-party/deps/src/glm") list(APPEND new_includes "$" "$") elseif("${include_dir}" STREQUAL "${CMAKE_SOURCE_DIR}/third-party/deps/src/stb" OR "${include_dir}" STREQUAL "third-party/deps/src/stb") list(APPEND new_includes "$" "$") elseif("${include_dir}" STREQUAL "${CMAKE_SOURCE_DIR}/third-party/deps/src" OR "${include_dir}" STREQUAL "third-party/deps/src") list(APPEND new_includes "$" "$") elseif("${include_dir}" STREQUAL "${CMAKE_SOURCE_DIR}/IGLU/simdtypes" OR "${include_dir}" STREQUAL "simdtypes") list(APPEND new_includes "$" "$") elseif("${include_dir}" STREQUAL "${IGL_ROOT_DIR}") # Convert IGL_ROOT_DIR to appropriate interface list(APPEND new_includes "$" "$") else() # For other paths, try to convert them to generator expressions string(REPLACE "${CMAKE_SOURCE_DIR}/" "" relative_path "${include_dir}") string(REPLACE "${IGL_ROOT_DIR}/" "" relative_path2 "${include_dir}") if(NOT "${relative_path}" STREQUAL "${include_dir}") # Path was under CMAKE_SOURCE_DIR, use relative path list(APPEND new_includes "$") elseif(NOT "${relative_path2}" STREQUAL "${include_dir}") # Path was under IGL_ROOT_DIR, use relative path list(APPEND new_includes "$") else() # For other paths, keep as build interface only if not problematic if(NOT "${include_dir}" MATCHES "^${CMAKE_SOURCE_DIR}" AND NOT "${include_dir}" MATCHES "^${IGL_ROOT_DIR}") list(APPEND new_includes "$") endif() endif() endif() endforeach() if(new_includes) set_target_properties(${target_name} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${new_includes}") endif() endif() endfunction() # This function is no longer needed since we preserve all dependencies # Function to setup install for any target function(igl_setup_target_install target_name) if(NOT TARGET ${target_name}) message(STATUS " - Skipping ${target_name}: target not found") return() endif() get_target_property(target_type ${target_name} TYPE) # Only process libraries and executables if(NOT target_type MATCHES "^(STATIC_LIBRARY|SHARED_LIBRARY|MODULE_LIBRARY|INTERFACE_LIBRARY)$") message(STATUS " - Skipping ${target_name}: not a library") return() endif() message(STATUS " - Configuring install for: ${target_name}") # Special handling for fmt target - fix PUBLIC_HEADER issues if("${target_name}" STREQUAL "fmt") message(STATUS " - Applying special handling for fmt target") # Get current PUBLIC_HEADER value for debugging get_target_property(fmt_public_headers ${target_name} PUBLIC_HEADER) message(STATUS " - Original PUBLIC_HEADER: ${fmt_public_headers}") # Clear the problematic PUBLIC_HEADER property set_target_properties(${target_name} PROPERTIES PUBLIC_HEADER "") message(STATUS " - Cleared PUBLIC_HEADER to avoid path conflicts") # We'll install fmt headers manually via igl_install_headers endif() # Fix include directories before install igl_fix_target_includes(${target_name}) # Install the target install( TARGETS ${target_name} EXPORT IGLTargets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR} PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) # Set export properties set_target_properties(${target_name} PROPERTIES EXPORT_NAME ${target_name}) # Create alias if it doesn't exist if(NOT TARGET IGL::${target_name}) if(target_type STREQUAL "INTERFACE_LIBRARY") add_library(IGL::${target_name} ALIAS ${target_name}) else() add_library(IGL::${target_name} ALIAS ${target_name}) endif() endif() message(STATUS " - Successfully configured install for: ${target_name}") endfunction() # Function to install headers for a directory function(igl_install_headers source_dir dest_dir) if(EXISTS "${source_dir}") install( DIRECTORY "${source_dir}/" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${dest_dir}" FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp" PATTERN "*.inl" PATTERN "tests" EXCLUDE PATTERN "test" EXCLUDE PATTERN ".git" EXCLUDE) message(STATUS " - Configured headers install: ${source_dir} -> ${dest_dir}") endif() endfunction() # Get all targets dynamically get_property(ALL_DISCOVERED_TARGETS GLOBAL PROPERTY TARGETS) # Backup method: If global property doesn't work, try to discover known targets manually if(NOT ALL_DISCOVERED_TARGETS) message(STATUS "Global TARGETS property is empty, trying backup discovery method...") # List of known possible IGL targets that might exist set(POTENTIAL_IGL_TARGETS # Core IGL targets IGLLibrary IGLOpenGL IGLMetal IGLVulkan IGLGlslang IGLstb # IGLU targets IGLUimgui IGLUmanagedUniformBuffer IGLUsentinel IGLUshaderCross IGLUsimple_renderer IGLUstate_pool IGLUtexture_accessor IGLUtexture_loader IGLUuniform IGLUsimdtypes IGLUbitmap # Shell targets IGLShellShared # Third-party core libraries fmt glslang SPIRV spirv-cross-core spirv-cross-glsl spirv-cross-msl spirv-cross-util spirv-cross-c glslang-default-resource-limits # Graphics and media libraries ktx ktx_read ktx_version obj_basisu_cbind objUtil TracyClient bc7enc meshoptimizer tinyobjloader # ASTC encoder variants (for different SIMD instructions) astcenc-native-static astcenc-neon-static astcenc-avx2-static astcenc-sse4.1-static astcenc-sse2-static astcenc-none-static # Additional third-party libraries that might be built glfw glew glew_s zlibstatic) # Check which of these targets actually exist foreach(potential_target ${POTENTIAL_IGL_TARGETS}) if(TARGET ${potential_target}) list(APPEND ALL_DISCOVERED_TARGETS ${potential_target}) message(STATUS " - Found target: ${potential_target}") endif() endforeach() if(ALL_DISCOVERED_TARGETS) list(LENGTH ALL_DISCOVERED_TARGETS found_count) message(STATUS "Backup discovery found ${found_count} targets") else() message(STATUS "No targets found even with backup method") endif() endif() # Function to check if a target should be installed function(should_install_target target_name result_var) if(NOT TARGET ${target_name}) set(${result_var} FALSE PARENT_SCOPE) return() endif() get_target_property(target_type ${target_name} TYPE) # Only consider libraries (skip executables, utilities, tests) if(NOT target_type MATCHES "^(STATIC_LIBRARY|SHARED_LIBRARY|MODULE_LIBRARY|INTERFACE_LIBRARY)$") set(${result_var} FALSE PARENT_SCOPE) return() endif() # Skip test-related targets if("${target_name}" MATCHES "[Tt]est|TEST|gtest|benchmark") set(${result_var} FALSE PARENT_SCOPE) return() endif() # Skip CMake internal targets if("${target_name}" MATCHES "^(cmake_|CMake)") set(${result_var} FALSE PARENT_SCOPE) return() endif() # Skip utility targets that shouldn't be exported if("${target_name}" MATCHES "^(uninstall|doc|docs|example|sample)") set(${result_var} FALSE PARENT_SCOPE) return() endif() # Always include IGL/IGLU targets (highest priority) if("${target_name}" MATCHES "^(IGL|IGLU)") set(${result_var} TRUE PARENT_SCOPE) return() endif() # Include known important third-party libraries if("${target_name}" MATCHES "^(fmt|glslang|SPIRV|spirv-cross|ktx|glfw|glew|TracyClient|astcenc|meshoptimizer|tinyobjloader|bc7enc|stb)") set(${result_var} TRUE PARENT_SCOPE) return() endif() # Include other common third-party targets that might be useful if("${target_name}" MATCHES "^(zlibstatic|zlib|png|jpeg|freetype)") set(${result_var} TRUE PARENT_SCOPE) return() endif() # For unknown targets, be more permissive - include them unless they're clearly utilities if(NOT "${target_name}" MATCHES "^(build|install|package|doc|example|sample|util|tool)") set(${result_var} TRUE PARENT_SCOPE) return() endif() # By default, don't install set(${result_var} FALSE PARENT_SCOPE) endfunction() # Filter targets that should be installed set(ALL_TARGETS "") set(SKIPPED_TARGETS "") if(NOT ALL_DISCOVERED_TARGETS) message(WARNING "No targets discovered at all! This might indicate a CMake configuration issue.") message(STATUS "Current CMAKE_BINARY_DIR: ${CMAKE_BINARY_DIR}") message(STATUS "Current CMAKE_SOURCE_DIR: ${CMAKE_SOURCE_DIR}") return() endif() foreach(target IN LISTS ALL_DISCOVERED_TARGETS) should_install_target(${target} should_install) if(should_install) list(APPEND ALL_TARGETS ${target}) message(STATUS " ✓ Will install target: ${target}") else() list(APPEND SKIPPED_TARGETS ${target}) # Only show first few skipped targets to avoid spam list(LENGTH SKIPPED_TARGETS skipped_count) if(skipped_count LESS 10) message(STATUS " ✗ Skipping target: ${target}") endif() endif() endforeach() list(LENGTH ALL_DISCOVERED_TARGETS total_targets) list(LENGTH ALL_TARGETS installable_targets) list(LENGTH SKIPPED_TARGETS skipped_count) message(STATUS "Target discovery summary:") message(STATUS " - Total targets found: ${total_targets}") message(STATUS " - Targets to install: ${installable_targets}") message(STATUS " - Targets skipped: ${skipped_count}") if(installable_targets EQUAL 0) message(STATUS "Discovered targets were:") foreach(target IN LISTS ALL_DISCOVERED_TARGETS) get_target_property(target_type ${target} TYPE) message(STATUS " - ${target} (${target_type})") endforeach() endif() # Track if any targets were actually configured for install set(IGL_TARGETS_CONFIGURED FALSE) foreach(target IN LISTS ALL_TARGETS) if(TARGET ${target}) igl_setup_target_install(${target}) set(IGL_TARGETS_CONFIGURED TRUE) endif() endforeach() # Check if we have any targets to export if(NOT IGL_TARGETS_CONFIGURED) message(WARNING "No IGL targets were found for installation. This may be due to:") message(WARNING " - All backends disabled (OpenGL, Vulkan, Metal)") message(WARNING " - Missing core library targets") message(WARNING " - Configuration issues") # Still install headers even if no targets are available message(STATUS "Installing headers only (no library targets available)") igl_install_headers("${CMAKE_SOURCE_DIR}/src/igl" "igl") igl_install_headers("${CMAKE_SOURCE_DIR}/IGLU" "IGLU") # Create a minimal config file without targets configure_package_config_file( "${CMAKE_CURRENT_LIST_DIR}/IGLConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake/IGLConfigHeadersOnly.cmake" INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/IGL" NO_SET_AND_CHECK_MACRO NO_CHECK_REQUIRED_COMPONENTS_MACRO) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/cmake/IGLConfigHeadersOnly.cmake" DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/IGL" RENAME "IGLConfig.cmake") message(STATUS "IGL header-only install configuration completed.") return() endif() # Install headers igl_install_headers("${CMAKE_SOURCE_DIR}/src/igl" "igl") igl_install_headers("${CMAKE_SOURCE_DIR}/IGLU" "IGLU") igl_install_headers("${CMAKE_SOURCE_DIR}/third-party/deps/src/glm/glm" "glm") igl_install_headers("${CMAKE_SOURCE_DIR}/third-party/deps/src/stb" "stb") # Special handling for fmt headers (since we cleared PUBLIC_HEADER for fmt target) if(TARGET fmt) message(STATUS "Installing fmt headers manually to avoid PUBLIC_HEADER conflicts") # Verify the fmt headers source directory exists set(FMT_HEADERS_SOURCE "${CMAKE_SOURCE_DIR}/third-party/deps/src/fmt/include/fmt") if(EXISTS "${FMT_HEADERS_SOURCE}") message(STATUS " ✓ fmt headers source found: ${FMT_HEADERS_SOURCE}") # Check if args.h specifically exists if(EXISTS "${FMT_HEADERS_SOURCE}/args.h") message(STATUS " ✓ args.h confirmed at: ${FMT_HEADERS_SOURCE}/args.h") else() message(STATUS " ✗ args.h missing at: ${FMT_HEADERS_SOURCE}/args.h") endif() igl_install_headers("${FMT_HEADERS_SOURCE}" "fmt") message(STATUS " → fmt headers will be installed to: ${CMAKE_INSTALL_INCLUDEDIR}/fmt") else() message(WARNING "fmt headers source directory not found: ${FMT_HEADERS_SOURCE}") endif() else() message(STATUS "fmt target not found - skipping manual header installation") endif() # Platform-specific headers if(WIN32) install(FILES "${CMAKE_SOURCE_DIR}/src/igl/win/LogDefault.h" DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/igl/win) endif() if(ANDROID) install(FILES "${CMAKE_SOURCE_DIR}/src/igl/android/LogDefault.h" "${CMAKE_SOURCE_DIR}/src/igl/android/NativeHWBuffer.h" DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/igl/android) endif() # Generate CMake config files configure_package_config_file( "${CMAKE_CURRENT_LIST_DIR}/IGLConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake/IGLConfig.cmake" INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/IGL" NO_SET_AND_CHECK_MACRO NO_CHECK_REQUIRED_COMPONENTS_MACRO) # Install CMake config files install(FILES "${CMAKE_CURRENT_BINARY_DIR}/cmake/IGLConfig.cmake" DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/IGL") # Only install export targets if we have any get_property(IGL_EXPORT_TARGETS GLOBAL PROPERTY EXPORT_IGLTargets_TARGETS) if(IGL_EXPORT_TARGETS OR IGL_TARGETS_CONFIGURED) install(EXPORT IGLTargets FILE IGLTargets.cmake NAMESPACE IGL:: DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/IGL") message(STATUS "Configured install for export with targets: ${IGL_EXPORT_TARGETS}") else() message(WARNING "No targets found in IGLTargets export - skipping export installation") endif() message(STATUS "IGL install configuration completed.") ================================================ FILE: deploy_content.py ================================================ #!/usr/bin/python3 # Copyright (c) Meta Platforms, Inc. and affiliates. # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. import os import platform import sys folder = "third-party" script = os.path.join(folder, "bootstrap.py") json = os.path.join(folder, "bootstrap-content.json") base = os.path.join(folder, "content") try: os.mkdir(base) except FileExistsError: pass # @fb-only # @fb-only # @fb-only # @fb-only # @fb-only # @fb-only # @fb-only # @fb-only os.system( '"{}" {} -b {} --bootstrap-file={}'.format(sys.executable, script, base, json) ) ================================================ FILE: deploy_deps.py ================================================ #!/usr/bin/python3 # Copyright (c) Meta Platforms, Inc. and affiliates. # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. import os import sys folder = "third-party" script = os.path.join(folder, "bootstrap.py") json = os.path.join(folder, "bootstrap-deps.json") base = os.path.join(folder, "deps") os.system( '"{}" {} -b {} --bootstrap-file={} --break-on-first-error'.format( sys.executable, script, base, json ) ) ================================================ FILE: docs/.gitignore ================================================ venv/ build/ ================================================ FILE: docs/Makefile ================================================ # Minimal makefile for Sphinx documentation # # You can set these variables from the command line, and also # from the environment for the first two. SPHINXOPTS ?= SPHINXBUILD ?= sphinx-build SOURCEDIR = source BUILDDIR = build # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) .PHONY: help Makefile # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) ================================================ FILE: docs/README.md ================================================
IGL Logo [![Build Status](https://github.com/facebook/igl/actions/workflows/doc-build.yml/badge.svg)](https://github.com/facebook/igl/actions)
IGL Documentation Source ======================== This is the documentation source for [IGL](https://www.github.com/facebook/igl) ## Building the documentation The documentation template is based on [Sphinx](https://www.sphinx-doc.org/) and [Furo](https://github.com/pradyunsg/furo) and requires [Python](https://www.python.org/) and [virtualenv](https://virtualenv.pypa.io/en/latest/). The process described below works on the Mac. Building the documentation on Windows may require significant more work to adjust the version of the packages listed in the [requirements.txt](https://github.com/facebook/igl/blob/main/docs/requirements.txt) file. The process of building the documentation on Linux has not been tested. 1. Set up a Python virtual environment using `virtualenv` and activate it: ```shell-script virtualenv venv source ./venv/bin/activate ``` 2. Once in the virtual environment, install the required Python packages: ```shell-script pip install -r requirements.txt ``` 3. Build the website using make. ```shell-script make html ``` The generated website will be output to [docs/build/html](https://github.com/facebook/igl/tree/gh-pages). ================================================ FILE: docs/make.bat ================================================ @ECHO OFF pushd %~dp0 REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set SOURCEDIR=source set BUILDDIR=build %SPHINXBUILD% >NUL 2>NUL if errorlevel 9009 ( echo. echo.The 'sphinx-build' command was not found. Make sure you have Sphinx echo.installed, then set the SPHINXBUILD environment variable to point echo.to the full path of the 'sphinx-build' executable. Alternatively you echo.may add the Sphinx directory to PATH. echo. echo.If you don't have Sphinx installed, grab it from echo.https://www.sphinx-doc.org/ exit /b 1 ) if "%1" == "" goto help %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% goto end :help %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% :end popd ================================================ FILE: docs/requirements.txt ================================================ sphinx==5.3.0 myst-parser furo sphinx-copybutton sphinxext-opengraph sphinx-favicon sphinx-inline-tabs ================================================ FILE: docs/source/_extensions/style.py ================================================ from pygments.filters import VisibleWhitespaceFilter from pygments.lexers.compiled import CppLexer, RustLexer from pygments.lexers.make import CMakeLexer from sphinx.highlighting import lexers def setup(app): """Replace tabs with 4 spaces""" lexers["C++"] = CppLexer() lexers["rust"] = RustLexer() lexers["CMake"] = CMakeLexer() ws_filter = VisibleWhitespaceFilter(tabs=" ", tabsize=4) for lx in lexers.values(): lx.add_filter(ws_filter) ================================================ FILE: docs/source/conf.py ================================================ # Copyright (c) Meta Platforms, Inc. and affiliates. # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. # @fb-only # # For the full list of built-in configuration values, see the documentation: # https://www.sphinx-doc.org/en/master/usage/configuration.html # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # import sys from os.path import abspath, dirname, join sys.path.append(abspath(join(dirname(__file__), "_extensions"))) print(abspath(join(dirname(__file__), "_extensions"))) # -- Project information ----------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information project = "IGL" copyright = "2023, Meta" author = "Meta IGL" # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration extensions = [ "myst_parser", "sphinxext.opengraph", "sphinx_copybutton", "sphinx_favicon", "sphinx_inline_tabs", "style", # "sphinx_literate", ] templates_path = ["_templates"] exclude_patterns = ["build", "Thumbs.db", ".DS_Store", "README.md", "venv", "tmp"] myst_heading_anchors = 3 myst_enable_extensions = [ "amsmath", "dollarmath", ] # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output html_theme = "furo" html_theme_options = { "announcement": "Important This documentation is a work in progress!", "dark_logo": "igl-full-color-white.svg", "light_logo": "igl-full-color-black.svg", "sidebar_hide_name": True, "navigation_with_keys": True, "light_css_variables": { "color-brand-primary": "#ac2800", # or #ac2800 "color-brand-content": "#007cac", # #05acc8 #0089BD }, "dark_css_variables": { "color-brand-primary": "#ce5733", "color-brand-content": "#38a6b9", # #05acc8 #0089BD }, "footer_icons": [ { "name": "GitHub", "url": "https://github.com/facebook/igl", "html": """ """, "class": "", }, ], "source_repository": "https://github.com/facebook/igl", "source_branch": "main", "source_directory": ".", "top_of_page_button": None, } # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ["images", "data", "theme", "video"] html_css_files = [ "extra.css", "sphinx_literate.css", ] # Syntax highlighting of code blocks pygments_style = "sphinx" pygments_dark_style = "monokai" # -- Options for sphinx-favicon ----------------------------------------- favicons = [ { "rel": "icon", "static-file": "favicon/favicon.svg", "type": "image/svg+xml", }, { "rel": "icon", "sizes": "16x16", "href": "favicon/favicon-16x16.png", "type": "image/png", }, { "rel": "icon", "sizes": "32x32", "href": "favicon/favicon-32x32.png", "type": "image/png", }, { "rel": "apple-touch-icon", "sizes": "180x180", "href": "favicon/apple-touch-icon-180x180.png", "type": "image/png", }, ] ================================================ FILE: docs/source/data/placeholder ================================================ delete this file once this folder has some real data ================================================ FILE: docs/source/getting-started/index.md ================================================ Getting started =============== ```{toctree} :maxdepth: 2 ```` ================================================ FILE: docs/source/index.md ================================================ Intermediate Graphics Library (IGL) =================================== Intermediate Graphics Library (IGL) is a cross-platform library that commands the GPU. It encapsulates common GPU functionality with a low-level cross-platform interface. IGL is designed to support multiple backends implemented on top of various graphics APIs (e.g. OpenGL, Metal and Vulkan) with a common interface. Contents ======== ```{toctree} :titlesonly: :maxdepth: 2 introduction getting-started/index ``` ================================================ FILE: docs/source/introduction.md ================================================ Introduction ============ Supported rendering backends ---------------------------- * Metal 2+ * OpenGL 2.x (requires [GL_ARB_framebuffer_object](https://registry.khronos.org/OpenGL/extensions/ARB/ARB_framebuffer_object.txt)) * OpenGL 3.1+ * OpenGL ES 2.0+ * Vulkan 1.1 (requires [VK_KHR_buffer_device_address](https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_buffer_device_address.html) and [VK_EXT_descriptor_indexing](https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_descriptor_indexing.html)) * WebGL 2.0 Supported platforms ------------------- * Android * iOS * Linux * macOS * Windows * WebAssembly ================================================ FILE: docs/source/theme/extra.css ================================================ ul.simple, ol.simple { padding-left: 1.6rem; } ul.simple li:not(:last-child), ol.simple li:not(:last-child) { margin-bottom: 0.5rem; } body .with-shadow { box-shadow: 0 0 6px 0 rgba(0, 0, 0, 0.25); } @media (prefers-color-scheme: dark) { body[data-theme="dark"] .with-shadow, body:not([data-theme="light"]) .with-shadow { box-shadow: 0 0 6px 0 rgba(0, 0, 0, 0.7); } } figcaption { font-style: italic; font-size: 1.0rem; } figcaption p { margin-top: 0; } ================================================ FILE: docs/source/theme/sphinx_literate.css ================================================ .lit-block-wrapper { position: relative; } .lit-block-wrapper .lit-block-footer { text-align: right; font-size: 0.8em; position: absolute; bottom: -0.7em; right: 0.5em; margin-top: 0; color: rgba(0, 0, 0, 0.39); background-color: #3e3d35; border-radius: 0.3em; padding: 0 0.3em; } .lit-block-wrapper .lit-block-footer .lit-name { color: rgba(0, 0, 0, 0.94); } ================================================ FILE: docs/source/video/placeholder ================================================ delete this file once this folder has some real data ================================================ FILE: getting-started.md ================================================ # Examples 1) [Tiny](./samples/desktop/Tiny/Tiny.cpp) A basic example showing how to render a triangle. ![image](.github/screenshot_Tiny.png) 2) [Tiny_Mesh](./samples/desktop/Tiny/Tiny_Mesh.cpp) An intermediate example showing how to render multiple textured meshes and ImGui integration. ![image](.github/screenshot_TinyMesh.png) 3) [Tiny_MeshLarge](./samples/desktop/Tiny/Tiny_MeshLarge.cpp) A complex example demonstrating most of IGL features and rendering the Lumberyard Bistro mesh. Learn how to draw the rest of the owl. ![image](.github/screenshot01.png) # RenderSessions RenderSessions use iglshell functionality that provides platform abstraction and basic application functionality. We provide some basic examples that you can use in your projects 1) [EmptySession](./shell/renderSessions/EmptySession.cpp) An empty session. You can use it as a template for a new project ![image](.github/screenshot_EmptySession.png) 2) [BasicFramebufferSession](./shell/renderSessions/BasicFramebufferSession.cpp) A basic session showing how to create a framebuffer ![image](.github/screenshot_BasicFramebufferSession.png) 3) [HelloWorldSession](./shell/renderSessions/HelloWorldSession.cpp) A basic session showing how to render a triangle ![image](.github/screenshot_HelloWorldSession.png) 4) [ColorSession](./shell/renderSessions/ColorSession.cpp) A basic session showing how to render a textured quad ![image](.github/screenshot_ColorSession.png) 5) [ImguiSession](./shell/renderSessions/ImguiSession.cpp) A basic session showing how to use ImGUI with IGL ![image](.github/screenshot_ImguiSession.png) 6) [MRTSession](./shell/renderSessions/MRTSession.cpp) A basic session showing how to use multiple render targets feature ![image](.github/screenshot_MRTSession.png) 7) [Textured3DCubeSession](./shell/renderSessions/Textured3DCubeSession.cpp) A basic session showing how to use 3D textures ![image](.github/screenshot_Textured3DCubeSession.png) 8) [TQMultiRenderPassSession](./shell/renderSessions/TQMultiRenderPassSession.cpp) A basic session showing how to use multiple render passes ![image](.github/screenshot_TQMultiRenderPassSession.png) And many more sessions are coming! ================================================ FILE: samples/android/opengl/java/com/facebook/igl/sample/AndroidManifest.xml ================================================ ================================================ FILE: samples/android/opengl/java/com/facebook/igl/sample/SampleActivity.java ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only package com.facebook.igl.sample.opengl; import android.app.Activity; import android.os.Bundle; public class SampleActivity extends Activity { SampleView mView; @Override protected void onCreate(Bundle icicle) { super.onCreate(icicle); mView = new SampleView(getApplication()); setContentView(mView); } @Override protected void onPause() { super.onPause(); mView.onPause(); } @Override protected void onResume() { super.onResume(); mView.onResume(); } } ================================================ FILE: samples/android/opengl/java/com/facebook/igl/sample/SampleLib.java ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ package com.facebook.igl.sample.opengl; // Wrapper for our native C++ library, which implements the actual rendering. public class SampleLib { static { System.loadLibrary("sampleOpenGLJni"); } public static native void init(); public static native void surfaceChanged(); public static native void render(); } ================================================ FILE: samples/android/opengl/java/com/facebook/igl/sample/SampleView.java ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only package com.facebook.igl.sample.opengl; import android.content.Context; import android.graphics.PixelFormat; import android.opengl.GLSurfaceView; import android.util.Log; import javax.microedition.khronos.egl.EGL10; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.egl.EGLContext; import javax.microedition.khronos.egl.EGLDisplay; import javax.microedition.khronos.opengles.GL10; /// Simple view that sets up a GLES 2.0 rendering context class SampleView extends GLSurfaceView { private static String TAG = "SampleView"; public SampleView(Context context) { super(context); setEGLContextFactory(new ContextFactory()); // Set the view to be transluscent since we provide an alpha channel below. this.getHolder().setFormat(PixelFormat.TRANSLUCENT); setEGLConfigChooser(new ConfigChooser()); setRenderer(new Renderer()); } /// Context factory: handles creating the EGL context for this view with the correct settings. private static class ContextFactory implements GLSurfaceView.EGLContextFactory { public EGLContext createContext(EGL10 egl, EGLDisplay display, EGLConfig eglConfig) { final int EGL_CONTEXT_CLIENT_VERSION = 0x3098; int[] attrib_list = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE}; EGLContext context = egl.eglCreateContext(display, eglConfig, EGL10.EGL_NO_CONTEXT, attrib_list); checkEglError("Error creating EGL context", egl); return context; } public void destroyContext(EGL10 egl, EGLDisplay display, EGLContext context) { egl.eglDestroyContext(display, context); } } private static void checkEglError(String prompt, EGL10 egl) { int error; while ((error = egl.eglGetError()) != EGL10.EGL_SUCCESS) { Log.e(TAG, String.format("%s: EGL error: 0x%x", prompt, error)); } } /// Config chooser: handles specifying the requirements for the EGL config and choosing the // correct one. private static class ConfigChooser implements GLSurfaceView.EGLConfigChooser { public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) { final int EGL_OPENGL_ES2_BIT = 4; // Set ourselves a strict configuration: RGBA8888, 16-bit depth buffer, no stencil. final int[] configAttribs = { EGL10.EGL_RED_SIZE, 8, EGL10.EGL_GREEN_SIZE, 8, EGL10.EGL_BLUE_SIZE, 8, EGL10.EGL_ALPHA_SIZE, 8, EGL10.EGL_DEPTH_SIZE, 16, EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL10.EGL_NONE }; int[] numConfigs = new int[1]; egl.eglChooseConfig(display, configAttribs, null, 0, numConfigs); if (numConfigs[0] <= 0) { throw new IllegalArgumentException("Couldn't find an appropriate EGL config"); } EGLConfig[] configs = new EGLConfig[1]; egl.eglChooseConfig(display, configAttribs, configs, 1, numConfigs); return configs[0]; } } /// Renderer: This class communicates with our JNI library to implement the OpenGL rendering. private static class Renderer implements GLSurfaceView.Renderer { public void onSurfaceCreated(GL10 gl, EGLConfig config) { SampleLib.init(); } public void onSurfaceChanged(GL10 gl, int width, int height) { SampleLib.surfaceChanged(); } public void onDrawFrame(GL10 gl) { SampleLib.render(); } } } ================================================ FILE: samples/android/opengl/jni/Jni.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include "TinyRenderer.h" #include namespace igl_samples::android { namespace { std::unique_ptr renderer; } // namespace extern "C" { JNIEXPORT void JNICALL Java_com_facebook_igl_sample_opengl_SampleLib_init(JNIEnv* env, jobject obj); JNIEXPORT void JNICALL Java_com_facebook_igl_sample_opengl_SampleLib_surfaceChanged(JNIEnv* env, jobject obj); JNIEXPORT void JNICALL Java_com_facebook_igl_sample_opengl_SampleLib_render(JNIEnv* env, jobject obj); }; JNIEXPORT void JNICALL Java_com_facebook_igl_sample_opengl_SampleLib_init(JNIEnv* /*env*/, jobject /*obj*/) { renderer = std::make_unique(); renderer->init(); } JNIEXPORT void JNICALL Java_com_facebook_igl_sample_opengl_SampleLib_surfaceChanged(JNIEnv* /*env*/, jobject /*obj*/) { renderer->onSurfacesChanged(); } JNIEXPORT void JNICALL Java_com_facebook_igl_sample_opengl_SampleLib_render(JNIEnv* /*env*/, jobject /*obj*/) { if (renderer != nullptr) { renderer->render(); } } } // namespace igl_samples::android ================================================ FILE: samples/android/opengl/jni/TinyRenderer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include "TinyRenderer.h" #include #include #include #include #include #include #include #include #define IGL_SAMPLE_LOG_INFO(...) \ __android_log_print(ANDROID_LOG_INFO, "libsampleOpenGLJni", __VA_ARGS__) #define IGL_SAMPLE_LOG_ERROR(...) \ __android_log_print(ANDROID_LOG_ERROR, "libsampleOpenGLJni", __VA_ARGS__) namespace igl_samples::android { using namespace igl; namespace { void throwOnBadResult(const Result& result) { if (result.code != Result::Code::Ok) { std::stringstream errorMsg; errorMsg << "IGL error:\nCode: " << static_cast(result.code) << "\nMessage: " << result.message; IGL_SAMPLE_LOG_ERROR("%s", errorMsg.str().c_str()); throw std::runtime_error(errorMsg.str()); } } const std::string kVertexShader = R"( precision highp float; attribute vec3 position; attribute vec2 uv_in; varying vec2 uv; void main() { gl_Position = vec4(position, 1.0); uv = uv_in; } )"; const std::string kFragmentShader = R"( precision highp float; varying vec2 uv; void main() { gl_FragColor = vec4(uv, 0, 1); } )"; } // namespace void TinyRenderer::init() { Result result; { // Initialize the device auto hwDevice = opengl::egl::HWDevice(); device_ = hwDevice.create(&result); throwOnBadResult(result); } { // Initialize the vertex buffers, index buffers, and shaders struct VertexPosUv { std::array position; std::array uv; }; static VertexPosUv vertexData[] = { {.position = {-0.8f, 0.8f, 0.0}, .uv = {0.0, 1.0}}, {.position = {0.8f, 0.8f, 0.0}, .uv = {1.0, 1.0}}, {.position = {-0.8f, -0.8f, 0.0}, .uv = {0.0, 0.0}}, {.position = {0.8f, -0.8f, 0.0}, .uv = {1.0, 0.0}}, }; static uint16_t indexData[] = { 0, 1, 2, 1, 3, 2, }; const BufferDesc vertexBufferDesc = BufferDesc{BufferDesc::BufferTypeBits::Vertex, vertexData, sizeof(vertexData)}; vertexBuffer_ = device_->createBuffer(vertexBufferDesc, &result); throwOnBadResult(result); const BufferDesc indexBufferDesc = BufferDesc{BufferDesc::BufferTypeBits::Index, indexData, sizeof(indexData)}; indexBuffer_ = device_->createBuffer(indexBufferDesc, &result); throwOnBadResult(result); VertexInputStateDesc vertexInputDesc; vertexInputDesc.numAttributes = 2; vertexInputDesc.attributes[0] = VertexAttribute( 0, VertexAttributeFormat::Float3, offsetof(VertexPosUv, position), "position"); vertexInputDesc.attributes[1] = VertexAttribute(0, VertexAttributeFormat::Float2, offsetof(VertexPosUv, uv), "uv_in"); vertexInputDesc.numInputBindings = 1; vertexInputDesc.inputBindings[0].stride = sizeof(VertexPosUv); vertexInputState_ = device_->createVertexInputState(vertexInputDesc, &result); throwOnBadResult(result); } { shaderStages_ = ShaderStagesCreator::fromModuleStringInput( *device_, kVertexShader.c_str(), "main", "", kFragmentShader.c_str(), "main", "", &result); throwOnBadResult(result); } { // Initialize command queue const CommandQueueDesc commandQueueDesc = {}; commandQueue_ = device_->createCommandQueue(commandQueueDesc, &result); throwOnBadResult(result); } { // Set up our render pass descriptor renderPassDesc_.colorAttachments.resize(1); renderPassDesc_.colorAttachments[0].loadAction = LoadAction::Clear; renderPassDesc_.colorAttachments[0].storeAction = StoreAction::Store; renderPassDesc_.colorAttachments[0].clearColor = {0.0, 0.0, 0.5, 1.0}; } } void TinyRenderer::render() { Result result; // Create or update the framebuffer for the current frame auto viewTexture = device_->getPlatformDevice()->createTextureFromNativeDrawable( &result); throwOnBadResult(result); if (framebuffer_ == nullptr) { FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = viewTexture; framebuffer_ = device_->createFramebuffer(framebufferDesc, &result); throwOnBadResult(result); } else { framebuffer_->updateDrawable(viewTexture); } // Create pipeline state object if needed if (pipelineState_ == nullptr) { RenderPipelineDesc pipelineDesc; pipelineDesc.vertexInputState = vertexInputState_; pipelineDesc.shaderStages = shaderStages_; pipelineDesc.targetDesc.colorAttachments.resize(1); pipelineDesc.targetDesc.colorAttachments[0].textureFormat = viewTexture->getProperties().format; pipelineDesc.targetDesc.colorAttachments[0].blendEnabled = true; pipelineDesc.targetDesc.colorAttachments[0].rgbBlendOp = BlendOp::Add; pipelineDesc.targetDesc.colorAttachments[0].alphaBlendOp = BlendOp::Add; pipelineDesc.targetDesc.colorAttachments[0].srcRGBBlendFactor = BlendFactor::SrcAlpha; pipelineDesc.targetDesc.colorAttachments[0].srcAlphaBlendFactor = BlendFactor::SrcAlpha; pipelineDesc.targetDesc.colorAttachments[0].dstRGBBlendFactor = BlendFactor::OneMinusSrcAlpha; pipelineDesc.targetDesc.colorAttachments[0].dstAlphaBlendFactor = BlendFactor::OneMinusSrcAlpha; pipelineDesc.cullMode = CullMode::Back; pipelineDesc.frontFaceWinding = WindingMode::Clockwise; pipelineState_ = device_->createRenderPipeline(pipelineDesc, &result); throwOnBadResult(result); } // Create and submit command buffers const CommandBufferDesc commandBufferDesc; const std::shared_ptr buffer = commandQueue_->createCommandBuffer(commandBufferDesc, &result); throwOnBadResult(result); auto cmds = buffer->createRenderCommandEncoder(renderPassDesc_, framebuffer_); cmds->bindVertexBuffer(0, *vertexBuffer_); cmds->bindIndexBuffer(*indexBuffer_, IndexFormat::UInt16); cmds->bindRenderPipelineState(pipelineState_); cmds->drawIndexed(6); cmds->endEncoding(); buffer->present(viewTexture); commandQueue_->submit(*buffer); } void TinyRenderer::onSurfacesChanged() { auto* readSurface = eglGetCurrentSurface(EGL_READ); auto* drawSurface = eglGetCurrentSurface(EGL_DRAW); Result result; device_->getPlatformDevice()->updateSurfaces( readSurface, drawSurface, &result); throwOnBadResult(result); } } // namespace igl_samples::android ================================================ FILE: samples/android/opengl/jni/TinyRenderer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include namespace igl_samples::android { class TinyRenderer final { public: void init(); void render(); void onSurfacesChanged(); private: std::unique_ptr device_; std::shared_ptr commandQueue_; std::shared_ptr pipelineState_; std::shared_ptr vertexInputState_; std::shared_ptr shaderStages_; std::shared_ptr vertexBuffer_; std::shared_ptr indexBuffer_; std::shared_ptr framebuffer_; igl::RenderPassDesc renderPassDesc_; }; } // namespace igl_samples::android ================================================ FILE: samples/android/vulkan/java/com/facebook/igl/sample/AndroidManifest.xml ================================================ ================================================ FILE: samples/android/vulkan/java/com/facebook/igl/sample/SampleActivity.java ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only package com.facebook.igl.sample.vulkan; import android.app.NativeActivity; import android.os.Bundle; public class SampleActivity extends NativeActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } static { System.loadLibrary("sampleVulkan"); } } ================================================ FILE: samples/android/vulkan/jni/Tiny.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include #include #include #include #define IGL_SAMPLE_LOG_INFO(...) \ __android_log_print(ANDROID_LOG_INFO, "libsampleVulkanJni", __VA_ARGS__) #define IGL_SAMPLE_LOG_ERROR(...) \ __android_log_print(ANDROID_LOG_ERROR, "libsampleVulkanJni", __VA_ARGS__) namespace igl_samples::android { using namespace igl; namespace { std::unique_ptr device; std::shared_ptr commandQueue; std::shared_ptr framebuffer; RenderPassDesc renderPass; std::shared_ptr renderPipelineStateTriangle; ANativeWindow* window; uint32_t width, height; bool initialized; const char* codeVS = R"( #version 460 layout (location=0) out vec3 color; const vec2 pos[3] = vec2[3]( vec2(-0.6, -0.4), vec2( 0.6, -0.4), vec2( 0.0, 0.6) ); const vec3 col[3] = vec3[3]( vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0), vec3(0.0, 0.0, 1.0) ); void main() { gl_Position = vec4(pos[gl_VertexIndex], 0.0, 1.0); color = col[gl_VertexIndex]; } )"; const char* codeFS = R"( #version 460 layout (location=0) in vec3 color; layout (location=0) out vec4 out_FragColor; void main() { out_FragColor = vec4(color, 1.0); }; )"; void initWindow(ANativeWindow* nativeWindow) { // Get the Window first ANativeWindow_acquire(nativeWindow); window = nativeWindow; if (nativeWindow == nullptr) { IGL_SAMPLE_LOG_ERROR("ANativeWindow is null"); return; } width = ANativeWindow_getWidth(nativeWindow); height = ANativeWindow_getHeight(nativeWindow); IGL_SAMPLE_LOG_INFO("window size: [%d, %d]", width, height); } void initIGL() { // create a device const igl::vulkan::VulkanContextConfig ctxConfig; auto ctx = vulkan::HWDevice::createContext(ctxConfig, window); std::vector devices = vulkan::HWDevice::queryDevices(*ctx, HWDeviceQueryDesc(HWDeviceType::IntegratedGpu), nullptr); device = vulkan::HWDevice::create(std::move(ctx), devices[0], (uint32_t)width, (uint32_t)height); IGL_DEBUG_ASSERT(device); // Command queue: backed by different types of GPU HW queues CommandQueueDesc desc{}; commandQueue = device->createCommandQueue(desc, nullptr); renderPass.colorAttachments.emplace_back(); renderPass.colorAttachments.back().loadAction = LoadAction::Clear; renderPass.colorAttachments.back().storeAction = StoreAction::Store; renderPass.colorAttachments.back().clearColor = {0.4f, 0.0f, 0.0f, 1.0f}; renderPass.depthAttachment.loadAction = LoadAction::DontCare; } void createFramebuffer(const std::shared_ptr& nativeDrawable) { FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = nativeDrawable; framebuffer = device->createFramebuffer(framebufferDesc, nullptr); IGL_DEBUG_ASSERT(framebuffer); } void createRenderPipeline() { if (renderPipelineStateTriangle) { return; } IGL_DEBUG_ASSERT(framebuffer); RenderPipelineDesc desc; desc.targetDesc.colorAttachments.resize(1); desc.targetDesc.colorAttachments[0].textureFormat = framebuffer->getColorAttachment(0)->getProperties().format; if (framebuffer->getDepthAttachment()) { desc.targetDesc.depthAttachmentFormat = framebuffer->getDepthAttachment()->getProperties().format; } desc.shaderStages = ShaderStagesCreator::fromModuleStringInput( *device, codeVS, "main", "", codeFS, "main", "", nullptr); renderPipelineStateTriangle = device->createRenderPipeline(desc, nullptr); } std::shared_ptr getVulkanNativeDrawable() { const auto& vkPlatformDevice = device->getPlatformDevice(); IGL_DEBUG_ASSERT(vkPlatformDevice != nullptr); Result ret; std::shared_ptr drawable = vkPlatformDevice->createTextureFromNativeDrawable(&ret); IGL_DEBUG_ASSERT(ret.isOk()); return drawable; } void render() { if (!initialized) { return; } auto nativeDrawable = getVulkanNativeDrawable(); framebuffer->updateDrawable(nativeDrawable); // Command buffers (1-N per thread): create, submit and forget CommandBufferDesc cbDesc; std::shared_ptr buffer = commandQueue->createCommandBuffer(cbDesc, nullptr); const igl::Viewport viewport = {.x = 0.0f, .y = 0.0f, .width = (float)width, .height = (float)height, .minDepth = 0.0f, .maxDepth = +1.0f}; const igl::ScissorRect scissor = { .x = 0, .y = 0, .width = (uint32_t)width, .height = (uint32_t)height}; // This will clear the framebuffer auto commands = buffer->createRenderCommandEncoder(renderPass, framebuffer); commands->bindRenderPipelineState(renderPipelineStateTriangle); commands->bindViewport(viewport); commands->bindScissorRect(scissor); // VK_EXT_debug_utils support doesn't exist yet // commands->pushDebugGroupLabel("Render Triangle", igl::Color(1, 0, 0)); commands->draw(3, 0, 3); // commands->popDebugGroupLabel(); commands->endEncoding(); buffer->present(nativeDrawable); commandQueue->submit(*buffer); } void initialize(android_app* app) { if (initialized) { return; } initWindow(app->window); initIGL(); createFramebuffer(getVulkanNativeDrawable()); createRenderPipeline(); initialized = true; } } // namespace // Android NativeActivity functions extern "C" { void handleCmd(struct android_app* app, int32_t cmd) {} static void handleAppCmd(struct android_app* app, int32_t appCmd) { switch (appCmd) { case APP_CMD_SAVE_STATE: break; case APP_CMD_INIT_WINDOW: initialize(app); break; case APP_CMD_TERM_WINDOW: break; case APP_CMD_GAINED_FOCUS: break; case APP_CMD_LOST_FOCUS: break; case APP_CMD_PAUSE: case APP_CMD_DESTROY: case APP_CMD_STOP: // destroy all the Vulkan stuff before closing the window renderPipelineStateTriangle = nullptr; framebuffer = nullptr; device.reset(nullptr); initialized = false; break; } } void android_main(struct android_app* app) { app->onAppCmd = handleAppCmd; while (app->destroyRequested == 0) { for (;;) { int events = 0; struct android_poll_source* source = nullptr; if (ALooper_pollAll(0, nullptr, &events, (void**)&source) < 0) { break; } if (source != nullptr) { source->process(app, source); } } render(); } } } } // namespace igl_samples::android ================================================ FILE: samples/desktop/CMakeLists.txt ================================================ # Copyright (c) Meta Platforms, Inc. and affiliates. # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. cmake_minimum_required(VERSION 3.19) set(PROJECT_NAME "IGL Samples") if(MSVC) add_definitions(-D_CONSOLE) endif() if(WIN32) add_definitions("-DVK_USE_PLATFORM_WIN32_KHR=1") add_definitions("-DNOMINMAX") endif() macro(ADD_DEMO app) add_executable(${app} "Tiny/${app}.cpp") igl_set_cxxstd(${app} 20) igl_set_folder(${app} ${PROJECT_NAME}) target_link_libraries(${app} PUBLIC IGLLibrary) target_link_libraries(${app} PRIVATE bc7enc) target_link_libraries(${app} PRIVATE meshoptimizer) target_link_libraries(${app} PRIVATE tinyobjloader) target_link_libraries(${app} PRIVATE glfw) target_link_libraries(${app} PRIVATE ktx) if(IGL_WITH_IGLU) target_link_libraries(${app} PRIVATE IGLUimgui) target_link_libraries(${app} PRIVATE IGLUsimple_renderer) target_link_libraries(${app} PRIVATE IGLUtexture_loader) endif() if(UNIX) target_link_libraries(${app} PRIVATE EGL) endif() target_link_libraries(${app} PRIVATE IGLstb) # For D3D12 builds on Windows, ensure dxil.dll is deployed next to sample # executables so that DXC/DXIL validation and signed DXIL shaders work in # both Debug and Release configurations. This mirrors the behavior used for # render sessions (shell/windows/CMakeLists.txt) and unit tests # (test_all_unittests.bat). if(IGL_WITH_D3D12 AND WIN32 AND MSVC) find_file(DXIL_DLL_FOR_${app} NAMES dxil.dll PATHS "C:/Program Files (x86)/Windows Kits/10/bin/10.0.22621.0/x64" "C:/Program Files (x86)/Windows Kits/10/bin/10.0.22000.0/x64" "C:/Program Files (x86)/Windows Kits/10/bin/10.0.19041.0/x64" "$ENV{WindowsSdkBinPath}/x64" NO_DEFAULT_PATH ) if(DXIL_DLL_FOR_${app}) add_custom_command(TARGET ${app} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${DXIL_DLL_FOR_${app}}" "$/" COMMENT "Copying dxil.dll for ${app}" ) endif() endif() endmacro() if(IGL_WITH_OPENGL OR IGL_WITH_VULKAN) add_demo("Tiny") endif() if(IGL_WITH_VULKAN) # this demo app does not work without Vulkan (yet) add_demo("Tiny_Mesh") endif() # Tiny_MeshLarge can run on Vulkan/OpenGL; expose it for D3D12 configs too so the binary is available. if(IGL_WITH_OPENGL OR IGL_WITH_VULKAN OR IGL_WITH_D3D12) add_demo("Tiny_MeshLarge") target_sources( Tiny_MeshLarge PUBLIC "${IGL_ROOT_DIR}/third-party/deps/src/3D-Graphics-Rendering-Cookbook/shared/UtilsCubemap.cpp") if(NOT IGL_WITH_VULKAN) target_sources(Tiny_MeshLarge PUBLIC "${IGL_ROOT_DIR}/src/igl/vulkan/util/TextureFormat.cpp") endif() else() message(STATUS "Skipping Tiny_MeshLarge: no compatible backend enabled (needs OpenGL/Vulkan/D3D12)") endif() ================================================ FILE: samples/desktop/Tiny/Tiny.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #define GLFW_INCLUDE_NONE #include #include #if defined(_XLESS_GLFW_) // do nothing #elif IGL_PLATFORM_WINDOWS #define GLFW_EXPOSE_NATIVE_WIN32 #define GLFW_EXPOSE_NATIVE_WGL #elif IGL_PLATFORM_APPLE #define GLFW_EXPOSE_NATIVE_COCOA #elif IGL_PLATFORM_LINUX #define GLFW_EXPOSE_NATIVE_X11 #define GLFW_EXPOSE_NATIVE_GLX #else #error Unsupported OS #endif // NOLINTNEXTLINE(facebook-unused-include-check) #include #include #include #include #define USE_OPENGL_BACKEND 0 #if IGL_BACKEND_OPENGL && !IGL_BACKEND_VULKAN // no IGL/Vulkan was compiled in, switch to IGL/OpenGL #undef USE_OPENGL_BACKEND #define USE_OPENGL_BACKEND 1 #endif // NOLINTBEGIN(facebook-unused-include-check) // clang-format off #if USE_OPENGL_BACKEND #if IGL_PLATFORM_WINDOWS #include #include #include #include #elif IGL_PLATFORM_LINUX #include #include #include #include #endif #else #include #include #include #include #include #endif // USE_OPENGL_BACKEND // clang-format on // NOLINTEND(facebook-unused-include-check) #define ENABLE_MULTIPLE_COLOR_ATTACHMENTS 0 #if ENABLE_MULTIPLE_COLOR_ATTACHMENTS static const uint32_t kNumColorAttachments = 4; #else static const uint32_t kNumColorAttachments = 1; #endif // NOLINTBEGIN(facebook-unused-include-check) #if defined(__cpp_lib_format) && !IGL_PLATFORM_APPLE #include #define IGL_FORMAT std::format #else #include #define IGL_FORMAT fmt::format #endif // __cpp_lib_format // NOLINTEND(facebook-unused-include-check) static std::string codeVS = R"( #version 460 layout (location=0) out vec3 color; const vec2 pos[3] = vec2[3]( vec2(-0.6, -0.4), vec2( 0.6, -0.4), vec2( 0.0, 0.6) ); const vec3 col[3] = vec3[3]( vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0), vec3(0.0, 0.0, 1.0) ); void main() { gl_Position = vec4(pos[gl_VertexIndex], 0.0, 1.0); color = col[gl_VertexIndex]; } )"; #if ENABLE_MULTIPLE_COLOR_ATTACHMENTS const char* codeFS = R"( #version 460 layout (location=0) in vec3 color; layout (location=0) out vec4 out_FragColor; layout (location=1) out vec4 out_FragColor1; void main() { out_FragColor = vec4(color, 1.0); out_FragColor1 = vec4(1.0, 0.0, 0.0, 1.0); }; )"; #else const static char* codeFS = R"( #version 460 layout (location=0) in vec3 color; layout (location=0) out vec4 out_FragColor; void main() { out_FragColor = vec4(color, 1.0); }; )"; #endif using namespace igl; static int width = 1024; static int height = 768; static std::unique_ptr device; static std::shared_ptr commandQueue; static RenderPassDesc renderPass; static std::shared_ptr framebuffer; static std::shared_ptr renderPipelineStateTriangle; static GLFWwindow* initIGL(bool isHeadless, bool enableVulkanValidationLayers) { if (!glfwInit()) { printf("glfwInit() failed"); return nullptr; } #if USE_OPENGL_BACKEND glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE); glfwWindowHint(GLFW_VISIBLE, true); glfwWindowHint(GLFW_DOUBLEBUFFER, true); glfwWindowHint(GLFW_SRGB_CAPABLE, true); glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_API); #else glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); #endif glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); #if USE_OPENGL_BACKEND const char* title = "OpenGL Triangle"; #else const char* title = "Vulkan Triangle"; #endif GLFWwindow* window = isHeadless ? nullptr : glfwCreateWindow(width, height, title, nullptr, nullptr); if (window) { glfwSetErrorCallback([](int error, const char* description) { printf("GLFW Error (%i): %s\n", error, description); }); glfwSetKeyCallback(window, [](GLFWwindow* window, int key, int, int action, int) { if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) { glfwSetWindowShouldClose(window, GLFW_TRUE); } }); // @lint-ignore CLANGTIDY glfwSetWindowSizeCallback(window, [](GLFWwindow* /*window*/, int w, int h) { width = w; height = h; printf("Window resized! width=%d, height=%d\n", width, height); #if !USE_OPENGL_BACKEND auto* vulkanDevice = static_cast(device.get()); auto& ctx = vulkanDevice->getVulkanContext(); ctx.initSwapchain(width, height); #endif }); glfwGetWindowSize(window, &width, &height); } // create a device { #if USE_OPENGL_BACKEND #if IGL_PLATFORM_WINDOWS auto ctx = std::make_unique(GetDC(glfwGetWin32Window(window)), glfwGetWGLContext(window)); device = std::make_unique(std::move(ctx)); #elif IGL_PLATFORM_LINUX auto ctx = std::make_unique( nullptr, glfwGetX11Display(), (igl::opengl::glx::GLXDrawable)glfwGetX11Window(window), (igl::opengl::glx::GLXContext)glfwGetGLXContext(window)); device = std::make_unique(std::move(ctx)); #endif #else const igl::vulkan::VulkanContextConfig cfg{ .terminateOnValidationError = false, .enableValidation = enableVulkanValidationLayers, .headless = isHeadless, }; #ifdef _WIN32 auto ctx = vulkan::HWDevice::createContext(cfg, window ? (void*)glfwGetWin32Window(window) : nullptr); #elif IGL_PLATFORM_APPLE auto ctx = vulkan::HWDevice::createContext(cfg, window ? (void*)glfwGetCocoaWindow(window) : nullptr); #elif defined(_XLESS_GLFW_) auto ctx = vulkan::HWDevice::createContext(cfg, nullptr, nullptr); #elif IGL_PLATFORM_LINUX auto ctx = vulkan::HWDevice::createContext( cfg, window ? (void*)glfwGetX11Window(window) : nullptr, (void*)glfwGetX11Display()); #else #error Unsupported OS #endif std::vector devices = vulkan::HWDevice::queryDevices(*ctx, HWDeviceQueryDesc(HWDeviceType::DiscreteGpu), nullptr); if (devices.empty()) { devices = vulkan::HWDevice::queryDevices( *ctx, HWDeviceQueryDesc(HWDeviceType::IntegratedGpu), nullptr); } if (devices.empty() || cfg.headless) { // LavaPipe etc devices = vulkan::HWDevice::queryDevices( *ctx, HWDeviceQueryDesc(HWDeviceType::SoftwareGpu), nullptr); } device = vulkan::HWDevice::create(std::move(ctx), devices[0], (uint32_t)width, (uint32_t)height); #endif IGL_DEBUG_ASSERT(device); } commandQueue = device->createCommandQueue({}, nullptr); renderPass.colorAttachments.resize(kNumColorAttachments); // first color attachment for (auto i = 0; i < kNumColorAttachments; ++i) { // Generate sparse color attachments by skipping alternate slots if (i & 0x1) { continue; } renderPass.colorAttachments[i] = { .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, .clearColor = {1.0f, 1.0f, 1.0f, 1.0f}, }; } renderPass.depthAttachment.loadAction = LoadAction::DontCare; return window; } static void createRenderPipeline() { if (renderPipelineStateTriangle) { return; } IGL_DEBUG_ASSERT(framebuffer); RenderPipelineDesc desc; desc.targetDesc.colorAttachments.resize(kNumColorAttachments); for (auto i = 0; i < kNumColorAttachments; ++i) { // @fb-only if (framebuffer->getColorAttachment(i)) { desc.targetDesc.colorAttachments[i].textureFormat = framebuffer->getColorAttachment(i)->getFormat(); } } if (framebuffer->getDepthAttachment()) { desc.targetDesc.depthAttachmentFormat = framebuffer->getDepthAttachment()->getFormat(); } #if USE_OPENGL_BACKEND codeVS = std::regex_replace(codeVS, std::regex("gl_VertexIndex"), "gl_VertexID"); #endif desc.shaderStages = ShaderStagesCreator::fromModuleStringInput( *device, codeVS.c_str(), "main", "", codeFS, "main", "", nullptr); renderPipelineStateTriangle = device->createRenderPipeline(desc, nullptr); IGL_DEBUG_ASSERT(renderPipelineStateTriangle); } static std::shared_ptr getNativeDrawable() { Result ret; std::shared_ptr drawable; #if USE_OPENGL_BACKEND #if IGL_PLATFORM_WINDOWS const auto& platformDevice = device->getPlatformDevice(); IGL_DEBUG_ASSERT(platformDevice != nullptr); drawable = platformDevice->createTextureFromNativeDrawable(&ret); #elif IGL_PLATFORM_LINUX const auto& platformDevice = device->getPlatformDevice(); IGL_DEBUG_ASSERT(platformDevice != nullptr); drawable = platformDevice->createTextureFromNativeDrawable(width, height, &ret); #endif #else const auto& platformDevice = device->getPlatformDevice(); IGL_DEBUG_ASSERT(platformDevice != nullptr); drawable = platformDevice->createTextureFromNativeDrawable(&ret); #endif IGL_DEBUG_ASSERT(ret.isOk(), ret.message.c_str()); return drawable; } static void createFramebuffer(const std::shared_ptr& nativeDrawable) { FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = nativeDrawable; for (auto i = 1; i < kNumColorAttachments; ++i) { // Generate sparse color attachments by skipping alternate slots if (i & 0x1) { continue; } const TextureDesc desc = TextureDesc::new2D( nativeDrawable->getFormat(), nativeDrawable->getDimensions().width, nativeDrawable->getDimensions().height, TextureDesc::TextureUsageBits::Attachment | TextureDesc::TextureUsageBits::Sampled, IGL_FORMAT("{}C{}", framebufferDesc.debugName.c_str(), i - 1).c_str()); framebufferDesc.colorAttachments[i].texture = device->createTexture(desc, nullptr); } framebuffer = device->createFramebuffer(framebufferDesc, nullptr); IGL_DEBUG_ASSERT(framebuffer); } static void render(const std::shared_ptr& nativeDrawable) { if (!nativeDrawable) { return; } const auto size = framebuffer->getColorAttachment(0)->getSize(); if (size.width != width || size.height != height) { createFramebuffer(nativeDrawable); } else { framebuffer->updateDrawable(nativeDrawable); } // Command buffers (1-N per thread): create, submit and forget const CommandBufferDesc cbDesc; const std::shared_ptr buffer = commandQueue->createCommandBuffer(cbDesc, nullptr); const igl::Viewport viewport = {.x = 0.0f, .y = 0.0f, .width = (float)width, .height = (float)height, .minDepth = 0.0f, .maxDepth = +1.0f}; const igl::ScissorRect scissor = { .x = 0, .y = 0, .width = (uint32_t)width, .height = (uint32_t)height}; // This will clear the framebuffer auto commands = buffer->createRenderCommandEncoder(renderPass, framebuffer); commands->bindRenderPipelineState(renderPipelineStateTriangle); commands->bindViewport(viewport); commands->bindScissorRect(scissor); commands->pushDebugGroupLabel("Render Triangle", igl::Color(1, 0, 0)); commands->draw(3); commands->popDebugGroupLabel(); commands->endEncoding(); buffer->present(nativeDrawable); commandQueue->submit(*buffer); } int main(int argc, char* argv[]) { bool isHeadless = false; bool enableVulkanValidationLayers = true; for (int i = 1; i < argc; i++) { if (!strcmp(argv[i], "--headless")) { isHeadless = true; } else if (!strcmp(argv[i], "--disable-vulkan-validation-layers")) { enableVulkanValidationLayers = false; } } GLFWwindow* window = initIGL(isHeadless, enableVulkanValidationLayers); createFramebuffer(getNativeDrawable()); createRenderPipeline(); // Main loop while (!window || !glfwWindowShouldClose(window)) { render(getNativeDrawable()); if (window) { glfwPollEvents(); } else { printf("We are running headless - breaking after 1 frame\n"); std::shared_ptr texture = framebuffer->getColorAttachment(0); const Dimensions dim = texture->getDimensions(); std::vector pixelsRGBA(dim.width * dim.height * 4); std::vector pixelsRGB(dim.width * dim.height * 3); framebuffer->copyBytesColorAttachment(*commandQueue, 0, pixelsRGBA.data(), TextureRangeDesc::new2D(0, 0, dim.width, dim.height)); if (texture->getFormat() == igl::TextureFormat::BGRA_UNorm8 || texture->getFormat() == igl::TextureFormat::BGRA_SRGB) { // swap R-B for (uint32_t i = 0; i < pixelsRGBA.size(); i += 4) { std::swap(pixelsRGBA[i + 0], pixelsRGBA[i + 2]); } } // convert to RGB for (uint32_t i = 0; i < pixelsRGB.size() / 3; i++) { pixelsRGB[3 * i + 0] = pixelsRGBA[4 * i + 0]; pixelsRGB[3 * i + 1] = pixelsRGBA[4 * i + 1]; pixelsRGB[3 * i + 2] = pixelsRGBA[4 * i + 2]; } const char* fileName = "Tiny.png"; IGLLog(IGLLogInfo, "Writing screenshot to: '%s'\n", fileName); stbi_flip_vertically_on_write(1); stbi_write_png(fileName, (int)dim.width, (int)dim.height, 3, pixelsRGB.data(), 0); break; } } // destroy all the Vulkan stuff before closing the window renderPipelineStateTriangle = nullptr; framebuffer = nullptr; device.reset(nullptr); glfwDestroyWindow(window); glfwTerminate(); return 0; } ================================================ FILE: samples/desktop/Tiny/Tiny_Mesh.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #define GLFW_INCLUDE_NONE #include #include #if !defined(_USE_MATH_DEFINES) #define _USE_MATH_DEFINES // NOLINT(bugprone-reserved-identifier) #endif // _USE_MATH_DEFINES #include #include #include #include #if defined(_XLESS_GLFW_) // do nothing #elif IGL_PLATFORM_WINDOWS #define GLFW_EXPOSE_NATIVE_WIN32 #define GLFW_EXPOSE_NATIVE_WGL #elif IGL_PLATFORM_APPLE #define GLFW_EXPOSE_NATIVE_COCOA #elif IGL_PLATFORM_LINUX #define GLFW_EXPOSE_NATIVE_X11 #define GLFW_EXPOSE_NATIVE_GLX #else #error Unsupported OS #endif // NOLINTNEXTLINE(facebook-unused-include-check) #include #include #include #include #include #include #include #include #include #include #include #include #define TINY_TEST_USE_DEPTH_BUFFER 1 #define TINY_TEST_USE_ASYNC_SCREENSHOTS 1 #define USE_OPENGL_BACKEND 0 #if IGL_BACKEND_OPENGL && !IGL_BACKEND_VULKAN // no IGL/Vulkan was compiled in, switch to IGL/OpenGL #undef USE_OPENGL_BACKEND #define USE_OPENGL_BACKEND 1 #endif constexpr uint32_t kNumCubes = 16; #if IGL_WITH_IGLU #include namespace { std::unique_ptr imguiSession_; igl::shell::InputDispatcher inputDispatcher_; } // namespace #endif // IGL_WITH_IGLU namespace { const char* codeVS = R"( layout (location=0) in vec3 pos; layout (location=1) in vec3 col; layout (location=2) in vec2 st; layout (location=0) out vec3 color; layout (location=1) out vec2 uv; layout (set = 1, binding = 0, std140) uniform UniformsPerFrame { mat4 proj; mat4 view; } perFrame; layout (set = 1, binding = 1, std140) uniform UniformsPerObject { mat4 model; } perObject; void main() { mat4 proj = perFrame.proj; mat4 view = perFrame.view; mat4 model = perObject.model; gl_Position = proj * view * model * vec4(pos, 1.0); color = col; uv = st; } )"; const char* codeFS = R"( layout (location=0) in vec3 color; layout (location=1) in vec2 uv; layout (location=0) out vec4 out_FragColor; layout (set = 0, binding = 0) uniform sampler2D uTex0; layout (set = 0, binding = 1) uniform sampler2D uTex1; void main() { vec4 t0 = texture(uTex0, 2.0 * uv); vec4 t1 = texture(uTex1, uv); out_FragColor = vec4(color * (t0.rgb + t1.rgb), 1.0); }; )"; using namespace igl; using glm::mat4; using glm::vec2; using glm::vec3; using glm::vec4; vec3 axis_[kNumCubes]; GLFWwindow* window_ = nullptr; int width_ = 1024; int height_ = 768; igl::FPSCounter fps_; bool saveScreenshot_ = false; [[maybe_unused]] igl::SubmitHandle screenshotSubmitHandle_ = {}; constexpr uint32_t kNumBufferedFrames = 3; std::unique_ptr device_; std::shared_ptr commandQueue_; RenderPassDesc renderPass_; FramebufferDesc framebufferDesc_; std::shared_ptr framebuffer_; std::shared_ptr renderPipelineState_Mesh_; std::shared_ptr vb0_, ib0_; // buffers for vertices and indices std::shared_ptr screenCopy_; std::vector> ubPerFrame_, ubPerObject_; std::shared_ptr vertexInput0_; std::shared_ptr depthStencilState_; std::shared_ptr texture0_, texture1_; std::shared_ptr sampler_; struct VertexPosUvw { vec3 position; vec3 color; vec2 uv; }; struct UniformsPerFrame { mat4 proj; mat4 view; }; struct UniformsPerObject { mat4 model; }; const float half = 1.0f; // UV-mapped cube with indices: 24 vertices, 36 indices const VertexPosUvw vertexData0[] = { // top {.position = {-half, -half, +half}, .color = {0.0, 0.0, 1.0}, .uv = {0, 0}}, // 0 {.position = {+half, -half, +half}, .color = {1.0, 0.0, 1.0}, .uv = {1, 0}}, // 1 {.position = {+half, +half, +half}, .color = {1.0, 1.0, 1.0}, .uv = {1, 1}}, // 2 {.position = {-half, +half, +half}, .color = {0.0, 1.0, 1.0}, .uv = {0, 1}}, // 3 // bottom {.position = {-half, -half, -half}, .color = {1.0, 1.0, 1.0}, .uv = {0, 0}}, // 4 {.position = {-half, +half, -half}, .color = {0.0, 1.0, 0.0}, .uv = {0, 1}}, // 5 {.position = {+half, +half, -half}, .color = {1.0, 1.0, 0.0}, .uv = {1, 1}}, // 6 {.position = {+half, -half, -half}, .color = {1.0, 0.0, 0.0}, .uv = {1, 0}}, // 7 // left {.position = {+half, +half, -half}, .color = {1.0, 1.0, 0.0}, .uv = {1, 0}}, // 8 {.position = {-half, +half, -half}, .color = {0.0, 1.0, 0.0}, .uv = {0, 0}}, // 9 {.position = {-half, +half, +half}, .color = {0.0, 1.0, 1.0}, .uv = {0, 1}}, // 10 {.position = {+half, +half, +half}, .color = {1.0, 1.0, 1.0}, .uv = {1, 1}}, // 11 // right {.position = {-half, -half, -half}, .color = {1.0, 1.0, 1.0}, .uv = {0, 0}}, // 12 {.position = {+half, -half, -half}, .color = {1.0, 0.0, 0.0}, .uv = {1, 0}}, // 13 {.position = {+half, -half, +half}, .color = {1.0, 0.0, 1.0}, .uv = {1, 1}}, // 14 {.position = {-half, -half, +half}, .color = {0.0, 0.0, 1.0}, .uv = {0, 1}}, // 15 // front {.position = {+half, -half, -half}, .color = {1.0, 0.0, 0.0}, .uv = {0, 0}}, // 16 {.position = {+half, +half, -half}, .color = {1.0, 1.0, 0.0}, .uv = {1, 0}}, // 17 {.position = {+half, +half, +half}, .color = {1.0, 1.0, 1.0}, .uv = {1, 1}}, // 18 {.position = {+half, -half, +half}, .color = {1.0, 0.0, 1.0}, .uv = {0, 1}}, // 19 // back {.position = {-half, +half, -half}, .color = {0.0, 1.0, 0.0}, .uv = {1, 0}}, // 20 {.position = {-half, -half, -half}, .color = {1.0, 1.0, 1.0}, .uv = {0, 0}}, // 21 {.position = {-half, -half, +half}, .color = {0.0, 0.0, 1.0}, .uv = {0, 1}}, // 22 {.position = {-half, +half, +half}, .color = {0.0, 1.0, 1.0}, .uv = {1, 1}}, // 23 }; const uint16_t indexData[] = {0, 1, 2, 2, 3, 0, 4, 5, 6, 6, 7, 4, 8, 9, 10, 10, 11, 8, 12, 13, 14, 14, 15, 12, 16, 17, 18, 18, 19, 16, 20, 21, 22, 22, 23, 20}; UniformsPerFrame perFrame; UniformsPerObject perObject[kNumCubes]; GLFWwindow* initIGL(bool isHeadless, bool enableVulkanValidationLayers) { if (!glfwInit()) { printf("glfwInit() failed"); return nullptr; } glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); GLFWwindow* window = isHeadless ? nullptr : glfwCreateWindow(1280, 1024, "Vulkan Mesh", nullptr, nullptr); if (!isHeadless && !window) { glfwTerminate(); return nullptr; } if (window) { glfwSetErrorCallback([](int error, const char* description) { printf("GLFW Error (%i): %s\n", error, description); }); glfwSetKeyCallback(window, [](GLFWwindow* window, int key, int, int action, int) { if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) { glfwSetWindowShouldClose(window, GLFW_TRUE); } if (key == GLFW_KEY_T && action == GLFW_PRESS) { texture1_.reset(); } if (key == GLFW_KEY_C && action == GLFW_PRESS) { saveScreenshot_ = true; } }); // @lint-ignore CLANGTIDY glfwSetWindowSizeCallback(window, [](GLFWwindow* /*window*/, int width, int height) { printf("Window resized! width=%d, height=%d\n", width, height); width_ = width; height_ = height; #if !USE_OPENGL_BACKEND auto* vulkanDevice = static_cast(device_.get()); auto& ctx = vulkanDevice->getVulkanContext(); ctx.initSwapchain(width_, height_); #endif }); #if IGL_WITH_IGLU glfwSetCursorPosCallback(window, [](auto* window, double x, double y) { inputDispatcher_.queueEvent(igl::shell::MouseMotionEvent(x, y, 0, 0)); }); glfwSetMouseButtonCallback(window, [](auto* window, int button, int action, int mods) { double xpos = 0.0, ypos = 0.0; glfwGetCursorPos(window, &xpos, &ypos); using igl::shell::MouseButton; const MouseButton iglButton = (button == GLFW_MOUSE_BUTTON_LEFT) ? MouseButton::Left : (button == GLFW_MOUSE_BUTTON_RIGHT ? MouseButton::Right : MouseButton::Middle); inputDispatcher_.queueEvent( igl::shell::MouseButtonEvent(iglButton, action == GLFW_PRESS, (float)xpos, (float)ypos)); }); #endif // IGL_WITH_IGLU glfwGetWindowSize(window, &width_, &height_); } // create a device { const igl::vulkan::VulkanContextConfig cfg = { .terminateOnValidationError = true, .enableValidation = enableVulkanValidationLayers, .headless = isHeadless, }; #ifdef _WIN32 auto ctx = vulkan::HWDevice::createContext(cfg, window ? (void*)glfwGetWin32Window(window) : nullptr); #elif IGL_PLATFORM_APPLE auto ctx = vulkan::HWDevice::createContext(cfg, window ? (void*)glfwGetCocoaWindow(window) : nullptr); #elif defined(_XLESS_GLFW_) auto ctx = vulkan::HWDevice::createContext(cfg, nullptr, nullptr); #elif IGL_PLATFORM_LINUX auto ctx = vulkan::HWDevice::createContext(cfg, window ? (void*)glfwGetX11Window(window) : nullptr, window ? (void*)glfwGetX11Display() : nullptr); #else #error Unsupported OS #endif std::vector devices = vulkan::HWDevice::queryDevices(*ctx, HWDeviceQueryDesc(HWDeviceType::DiscreteGpu), nullptr); if (devices.empty()) { devices = vulkan::HWDevice::queryDevices( *ctx, HWDeviceQueryDesc(HWDeviceType::IntegratedGpu), nullptr); } if (devices.empty() || cfg.headless) { // LavaPipe etc devices = vulkan::HWDevice::queryDevices( *ctx, HWDeviceQueryDesc(HWDeviceType::SoftwareGpu), nullptr); } device_ = vulkan::HWDevice::create(std::move(ctx), devices[0], (uint32_t)width_, (uint32_t)height_); IGL_DEBUG_ASSERT(device_); } // Vertex buffer, Index buffer and Vertex Input. Buffers are allocated in GPU memory. vb0_ = device_->createBuffer(BufferDesc{BufferDesc::BufferTypeBits::Vertex, vertexData0, sizeof(vertexData0), ResourceStorage::Private, 0, "Buffer: vertex"}, nullptr); ib0_ = device_->createBuffer(BufferDesc{BufferDesc::BufferTypeBits::Index, indexData, sizeof(indexData), ResourceStorage::Private, 0, "Buffer: index"}, nullptr); screenCopy_ = device_->createBuffer(BufferDesc{BufferDesc::BufferTypeBits::Storage, nullptr, width_ * height_ * sizeof(uint32_t), ResourceStorage::Shared, 0, "Buffer: screen copy"}, nullptr); // create an Uniform buffers to store uniforms for 2 objects for (uint32_t i = 0; i != kNumBufferedFrames; i++) { ubPerFrame_.push_back(device_->createBuffer(BufferDesc{BufferDesc::BufferTypeBits::Uniform, &perFrame, sizeof(UniformsPerFrame), ResourceStorage::Shared, 0, "Buffer: uniforms (per frame)"}, nullptr)); ubPerObject_.push_back(device_->createBuffer(BufferDesc{BufferDesc::BufferTypeBits::Uniform, perObject, kNumCubes * sizeof(UniformsPerObject), ResourceStorage::Shared, 0, "Buffer: uniforms (per object)"}, nullptr)); } { VertexInputStateDesc desc; desc.numAttributes = 3; desc.attributes[0].format = VertexAttributeFormat::Float3; desc.attributes[0].offset = offsetof(VertexPosUvw, position); desc.attributes[0].bufferIndex = 0; desc.attributes[0].location = 0; desc.attributes[1].format = VertexAttributeFormat::Float3; desc.attributes[1].offset = offsetof(VertexPosUvw, color); desc.attributes[1].bufferIndex = 0; desc.attributes[1].location = 1; desc.attributes[2].format = VertexAttributeFormat::Float2; desc.attributes[2].offset = offsetof(VertexPosUvw, uv); desc.attributes[2].bufferIndex = 0; desc.attributes[2].location = 2; desc.numInputBindings = 1; desc.inputBindings[0].stride = sizeof(VertexPosUvw); vertexInput0_ = device_->createVertexInputState(desc, nullptr); } { DepthStencilStateDesc desc; desc.isDepthWriteEnabled = true; desc.compareFunction = igl::CompareFunction::Less; depthStencilState_ = device_->createDepthStencilState(desc, nullptr); } { const uint32_t texWidth = 256; const uint32_t texHeight = 256; const TextureDesc desc = TextureDesc::new2D(igl::TextureFormat::BGRA_UNorm8, texWidth, texHeight, TextureDesc::TextureUsageBits::Sampled, "XOR pattern"); texture0_ = device_->createTexture(desc, nullptr); std::vector pixels(texWidth * texHeight); for (uint32_t y = 0; y != texHeight; y++) { for (uint32_t x = 0; x != texWidth; x++) { // create a XOR pattern pixels[y * texWidth + x] = 0xFF000000 + ((x ^ y) << 16) + ((x ^ y) << 8) + (x ^ y); } } texture0_->upload(TextureRangeDesc::new2D(0, 0, texWidth, texHeight), pixels.data()); } { using namespace std::filesystem; path dir = current_path(); // find IGLU somewhere above our current directory // @fb-only const char* contentFolder = "third-party/content/src/"; // @fb-only while (dir != current_path().root_path() && !exists(dir / path(contentFolder))) { dir = dir.parent_path(); } int32_t texWidth = 0; int32_t texHeight = 0; int32_t channels = 0; uint8_t* pixels = stbi_load( (dir / path(contentFolder) / path("bistro/BuildingTextures/wood_polished_01_diff.png")) .string() .c_str(), &texWidth, &texHeight, &channels, 4); IGL_DEBUG_ASSERT(pixels, "Cannot load textures. Run `deploy_content.py` before running this app."); const TextureDesc desc = TextureDesc::new2D(igl::TextureFormat::RGBA_UNorm8, texWidth, texHeight, TextureDesc::TextureUsageBits::Sampled, "wood_polished_01_diff.png"); texture1_ = device_->createTexture(desc, nullptr); texture1_->upload(TextureRangeDesc::new2D(0, 0, texWidth, texHeight), pixels); stbi_image_free(pixels); } { igl::SamplerStateDesc desc = igl::SamplerStateDesc::newLinear(); desc.addressModeU = igl::SamplerAddressMode::Repeat; desc.addressModeV = igl::SamplerAddressMode::Repeat; desc.debugName = "Sampler: linear"; sampler_ = device_->createSamplerState(desc, nullptr); } // Command queue: backed by different types of GPU HW queues CommandQueueDesc desc{}; commandQueue_ = device_->createCommandQueue(desc, nullptr); renderPass_.colorAttachments.push_back({ .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, .clearColor = {1.0f, 0.0f, 0.0f, 1.0f}, }); #if TINY_TEST_USE_DEPTH_BUFFER renderPass_.depthAttachment = { .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, // save it so we can display it via ImGui .clearDepth = 1.0, }; #else renderPass_.depthAttachment = { .loadAction = LoadAction::DontCare, }; #endif // TINY_TEST_USE_DEPTH_BUFFER // initialize random rotation axes for all cubes for (auto& axi : axis_) { axi = glm::sphericalRand(1.0f); } return window; } void createRenderPipeline() { if (renderPipelineState_Mesh_) { return; } IGL_DEBUG_ASSERT(framebuffer_); RenderPipelineDesc desc; desc.targetDesc.colorAttachments.resize(1); desc.targetDesc.colorAttachments[0].textureFormat = framebuffer_->getColorAttachment(0)->getFormat(); if (framebuffer_->getDepthAttachment()) { desc.targetDesc.depthAttachmentFormat = framebuffer_->getDepthAttachment()->getFormat(); } desc.vertexInputState = vertexInput0_; desc.shaderStages = ShaderStagesCreator::fromModuleStringInput( *device_, codeVS, "main", "", codeFS, "main", "", nullptr); #if !TINY_TEST_USE_DEPTH_BUFFER desc.cullMode = igl::CullMode::Back; #endif // TINY_TEST_USE_DEPTH_BUFFER desc.frontFaceWinding = igl::WindingMode::Clockwise; desc.debugName = igl::genNameHandle("Pipeline: mesh"); renderPipelineState_Mesh_ = device_->createRenderPipeline(desc, nullptr); } std::shared_ptr getVulkanNativeDrawable() { const auto& vkPlatformDevice = device_->getPlatformDevice(); IGL_DEBUG_ASSERT(vkPlatformDevice != nullptr); Result ret; std::shared_ptr drawable = vkPlatformDevice->createTextureFromNativeDrawable(&ret); IGL_DEBUG_ASSERT(ret.isOk()); return drawable; } std::shared_ptr getVulkanNativeDepth() { const auto& vkPlatformDevice = device_->getPlatformDevice(); IGL_DEBUG_ASSERT(vkPlatformDevice != nullptr); Result ret; std::shared_ptr drawable = vkPlatformDevice->createTextureFromNativeDepth(width_, height_, &ret); IGL_DEBUG_ASSERT(ret.isOk()); return drawable; } void createFramebuffer(const std::shared_ptr& nativeDrawable) { framebufferDesc_.colorAttachments[0].texture = nativeDrawable; #if TINY_TEST_USE_DEPTH_BUFFER framebufferDesc_.depthAttachment.texture = getVulkanNativeDepth(); #endif // TINY_TEST_USE_DEPTH_BUFFER framebuffer_ = device_->createFramebuffer(framebufferDesc_, nullptr); IGL_DEBUG_ASSERT(framebuffer_); } void render(const std::shared_ptr& nativeDrawable, uint32_t frameIndex) { IGL_PROFILER_FUNCTION(); if (!nativeDrawable) { return; } #if IGL_WITH_IGLU imguiSession_->beginFrame(framebufferDesc_, 1.0f); ImGui::Begin("Texture Viewer", nullptr, ImGuiWindowFlags_AlwaysAutoResize); ImGui::Image(ImTextureID(texture1_.get()), ImVec2(512, 512)); ImGui::End(); inputDispatcher_.processEvents(); #endif // IGL_WITH_IGLU const auto size = framebuffer_->getColorAttachment(0)->getSize(); if (size.width != width_ || size.height != height_) { createFramebuffer(nativeDrawable); } else { framebuffer_->updateDrawable(nativeDrawable); } // from igl/shell/renderSessions/Textured3DCubeSession.cpp const float fov = float(45.0f * (M_PI / 180.0f)); const float aspectRatio = (float)width_ / (float)height_; perFrame.proj = glm::perspectiveLH(fov, aspectRatio, 0.1f, 500.0f); // place a "camera" behind the cubes, the distance depends on the total number of cubes perFrame.view = glm::translate(mat4(1.0f), vec3(0.0f, 0.0f, sqrtf(kNumCubes / 16) * 20.0f * half)); ubPerFrame_[frameIndex]->upload(&perFrame, igl::BufferRange(sizeof(perFrame))); // rotate cubes around random axes for (uint32_t i = 0; i != kNumCubes; i++) { const float direction = powf(-1, (float)(i + 1)); const uint32_t cubesInLine = (uint32_t)sqrt(kNumCubes); const vec3 offset = vec3(-1.5f * sqrt(kNumCubes) + 4.0f * (i % cubesInLine), -1.5f * sqrt(kNumCubes) + 4.0f * (i / cubesInLine), 0); perObject[i].model = glm::rotate(glm::translate(mat4(1.0f), offset), direction * (float)glfwGetTime(), axis_[i]); } ubPerObject_[frameIndex]->upload(&perObject, igl::BufferRange(sizeof(perObject))); // Command buffers (1-N per thread): create, submit and forget CommandBufferDesc cbDesc; std::shared_ptr buffer = commandQueue_->createCommandBuffer(cbDesc, nullptr); const igl::Viewport viewport = {.x = 0.0f, .y = 0.0f, .width = (float)width_, .height = (float)height_, .minDepth = 0.0f, .maxDepth = +1.0f}; const igl::ScissorRect scissor = { .x = 0, .y = 0, .width = (uint32_t)width_, .height = (uint32_t)height_}; // This will clear the framebuffer auto commands = buffer->createRenderCommandEncoder(renderPass_, framebuffer_); commands->bindRenderPipelineState(renderPipelineState_Mesh_); commands->bindViewport(viewport); commands->bindScissorRect(scissor); commands->pushDebugGroupLabel("Render Mesh", igl::Color(1, 0, 0)); commands->bindVertexBuffer(0, *vb0_); commands->bindDepthStencilState(depthStencilState_); commands->bindBuffer(0, ubPerFrame_[frameIndex].get()); commands->bindTexture(0, igl::BindTarget::kFragment, texture0_.get()); commands->bindTexture(1, igl::BindTarget::kFragment, texture1_.get()); commands->bindSamplerState(0, igl::BindTarget::kFragment, sampler_.get()); commands->bindSamplerState(1, igl::BindTarget::kFragment, sampler_.get()); // Draw 2 cubes: we use uniform buffer to update matrices commands->bindIndexBuffer(*ib0_, IndexFormat::UInt16); for (uint32_t i = 0; i != kNumCubes; i++) { commands->bindBuffer(1, ubPerObject_[frameIndex].get(), i * sizeof(UniformsPerObject)); commands->drawIndexed(3u * 6u * 2u); } commands->popDebugGroupLabel(); #if IGL_WITH_IGLU imguiSession_->drawFPS(fps_.getAverageFPS()); imguiSession_->endFrame(*device_, *commands); #endif // IGL_WITH_IGLU commands->endEncoding(); if (saveScreenshot_) { buffer->copyTextureToBuffer(*nativeDrawable, *screenCopy_, 0); } buffer->present(nativeDrawable); auto submitHandle = commandQueue_->submit(*buffer); if (auto* pd = device_->getPlatformDevice(); saveScreenshot_) { saveScreenshot_ = false; #if TINY_TEST_USE_ASYNC_SCREENSHOTS pd->deferredTask(std::packaged_task([]() { void* data = screenCopy_->map(BufferRange(screenCopy_->getSizeInBytes()), nullptr); stbi_write_bmp("screenshot.bmp", width_, height_, 4, data); screenCopy_->unmap(); IGL_LOG_INFO("Screenshot saved.\n"); }), submitHandle); #else // store the submit handle from which we want to capture a screenshot screenshotSubmitHandle_ = submitHandle; } else if (screenshotSubmitHandle_ && // we poll the submit handle every frame until it's ready pd->waitOnSubmitHandle(screenshotSubmitHandle_, 0)) { void* data = screenCopy_->map(BufferRange(screenCopy_->getSizeInBytes()), nullptr); stbi_write_bmp("screenshot.bmp", width_, height_, 4, data); screenCopy_->unmap(); screenshotSubmitHandle_ = {}; IGL_LOG_INFO("Screenshot saved.\n"); #endif // TINY_TEST_USE_ASYNC_SCREENSHOTS } } } // namespace int main(int argc, char* argv[]) { bool isHeadless = false; bool enableVulkanValidationLayers = true; for (int i = 1; i < argc; i++) { if (!strcmp(argv[i], "--headless")) { isHeadless = true; } else if (!strcmp(argv[i], "--disable-vulkan-validation-layers")) { enableVulkanValidationLayers = false; } } window_ = initIGL(isHeadless, enableVulkanValidationLayers); createFramebuffer(getVulkanNativeDrawable()); createRenderPipeline(); #if IGL_WITH_IGLU imguiSession_ = std::make_unique(*device_, inputDispatcher_); #endif // IGL_WITH_IGLU double prevTime = glfwGetTime(); uint32_t frameIndex = 0; // Main loop while (!window_ || !glfwWindowShouldClose(window_)) { const double newTime = glfwGetTime(); fps_.updateFPS(newTime - prevTime); prevTime = newTime; render(getVulkanNativeDrawable(), frameIndex); frameIndex = (frameIndex + 1) % kNumBufferedFrames; if (window_) { glfwPollEvents(); } else { printf("We are running headless - breaking after 1 frame\n"); std::shared_ptr texture = framebuffer_->getColorAttachment(0); const Dimensions dim = texture->getDimensions(); std::vector pixelsRGBA(dim.width * dim.height * 4); std::vector pixelsRGB(dim.width * dim.height * 3); framebuffer_->copyBytesColorAttachment(*commandQueue_, 0, pixelsRGBA.data(), TextureRangeDesc::new2D(0, 0, dim.width, dim.height)); if (texture->getFormat() == igl::TextureFormat::BGRA_UNorm8 || texture->getFormat() == igl::TextureFormat::BGRA_SRGB) { // swap R-B for (uint32_t i = 0; i < pixelsRGBA.size(); i += 4) { std::swap(pixelsRGBA[i + 0], pixelsRGBA[i + 2]); } } // convert to RGB for (uint32_t i = 0; i < pixelsRGB.size() / 3; i++) { pixelsRGB[3 * i + 0] = pixelsRGBA[4 * i + 0]; pixelsRGB[3 * i + 1] = pixelsRGBA[4 * i + 1]; pixelsRGB[3 * i + 2] = pixelsRGBA[4 * i + 2]; } const char* fileName = "TinyMesh.png"; IGLLog(IGLLogInfo, "Writing screenshot to: '%s'\n", fileName); stbi_flip_vertically_on_write(1); stbi_write_png(fileName, (int)dim.width, (int)dim.height, 3, pixelsRGB.data(), 0); break; } } #if IGL_WITH_IGLU imguiSession_ = nullptr; #endif // IGL_WITH_IGLU // destroy all the Vulkan stuff before closing the window vb0_ = nullptr; ib0_ = nullptr; screenCopy_ = nullptr; ubPerFrame_.clear(); ubPerObject_.clear(); renderPipelineState_Mesh_ = nullptr; texture0_ = nullptr; texture1_ = nullptr; sampler_ = nullptr; framebufferDesc_ = {}; framebuffer_ = nullptr; device_.reset(nullptr); glfwDestroyWindow(window_); glfwTerminate(); return 0; } ================================================ FILE: samples/desktop/Tiny/Tiny_MeshLarge.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ /* * A brief tutorial how to run this beast: * * 1) Run the script "deploy_deps.py" from the IGL root folder. * 2) Run the script "deploy_content.py" from the IGL root folder. * 3) Run this app. * */ // @fb-only #define GLFW_INCLUDE_NONE #if !defined(_USE_MATH_DEFINES) #define _USE_MATH_DEFINES #endif // _USE_MATH_DEFINES #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define USE_TEXTURE_LOADER 0 #define USE_OPENGL_BACKEND 0 #if IGL_BACKEND_OPENGL && !IGL_BACKEND_VULKAN // no IGL/Vulkan was compiled in, switch to IGL/OpenGL #undef USE_OPENGL_BACKEND #define USE_OPENGL_BACKEND 1 #endif #if USE_OPENGL_BACKEND // for KTX textures #define VK_FORMAT_R32G32B32A32_SFLOAT 109 #define VK_FORMAT_BC7_UNORM_BLOCK 145 #endif // USE_OPENGL_BACKEND #if defined(__cpp_lib_format) && !IGL_PLATFORM_APPLE #include #define IGL_FORMAT std::format #else #include #define IGL_FORMAT fmt::format #endif // __cpp_lib_format // NOLINTBEGIN(facebook-unused-include-check) // clang-format off #if USE_OPENGL_BACKEND #include #include #include #if IGL_PLATFORM_WINDOWS #include #include #include #include #elif IGL_PLATFORM_LINUX #include #include #include #include #endif #else #include #include #include #include #include #endif // clang-format on // NOLINTEND(facebook-unused-include-check) #include // NOLINTBEGIN(facebook-unused-include-check) #if defined(_XLESS_GLFW_) // do nothing #elif defined(_WIN32) #define GLFW_EXPOSE_NATIVE_WIN32 #define GLFW_EXPOSE_NATIVE_WGL #elif defined(__APPLE__) #define GLFW_EXPOSE_NATIVE_COCOA #elif defined(__linux__) #define GLFW_EXPOSE_NATIVE_X11 #define GLFW_EXPOSE_NATIVE_GLX #else #error Unsupported OS #endif #include // NOLINTEND(facebook-unused-include-check) // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only #if IGL_WITH_IGLU #include #endif // IGL_WITH_IGLU #if USE_TEXTURE_LOADER #include #include static_assert(IGL_WITH_IGLU != 0, "USE_TEXTURE_LOADER can be enabled only together with IGL_WITH_IGLU"); #endif // USE_TEXTURE_LOADER namespace { constexpr uint32_t kMeshCacheVersion = 0xC0DE0009; #if USE_OPENGL_BACKEND constexpr bool kEnableCompression = false; #else constexpr bool kEnableCompression = true; constexpr bool kPreferIntegratedGPU = false; #endif // USE_OPENGL_BACKEND std::string contentRootFolder; #if IGL_WITH_IGLU std::unique_ptr imguiSession; igl::shell::InputDispatcher inputDispatcher; #endif // IGL_WITH_IGLU #if USE_TEXTURE_LOADER void loadKtxTexture(const igl::IDevice& device, igl::ICommandQueue& commandQueue, const std::string filename, std::shared_ptr& texture, bool generateMipmaps) { igl::Result result; if (!filename.empty() && filename.back() != '2' && std::filesystem::exists(filename + "2")) { loadKtxTexture(device, commandQueue, filename + "2", texture, generateMipmaps); return; } const auto size = std::filesystem::file_size(filename); FILE* file = std::fopen(filename.c_str(), "rb"); if (!IGL_DEBUG_VERIFY(file)) { return; } std::unique_ptr data = std::make_unique(size); std::fread(data.get(), 1, size, file); std::fclose(file); iglu::textureloader::ktx1::TextureLoaderFactory factory1; iglu::textureloader::ktx2::TextureLoaderFactory factory2; iglu::textureloader::ITextureLoaderFactory* factory = filename.back() == '2' ? static_cast(&factory2) : &factory1; auto loader = factory->tryCreate(data.get(), size, &result); if (!IGL_DEBUG_VERIFY(loader && result.isOk())) { return; } if (!texture) { IGL_DEBUG_ASSERT(loader->isSupported(device)); texture = loader->create(device, &result); if (!IGL_DEBUG_VERIFY(texture && result.isOk())) { return; } } IGL_DEBUG_ASSERT(loader->isSupported(device, texture->getUsage())); loader->upload(*texture, &result); if (IGL_DEBUG_VERIFY(result.isOk())) { if (generateMipmaps) { texture->generateMipmap(commandQueue); } } } #endif // USE_TEXTURE_LOADER const char* kCodeComputeTest = R"( layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; #ifdef VULKAN // kBinding_StorageImages in VulkanContext.cpp layout (set = 3, binding = 6, rgba8) uniform readonly image2D kTextures2Din[]; layout (set = 3, binding = 6, rgba8) uniform writeonly image2D kTextures2Dout[]; layout(push_constant) uniform PushConstants { uint textureId; } pc; #else layout (binding = 2, rgba8) uniform readonly image2D kTextures2Din; layout (binding = 2, rgba8) uniform writeonly image2D kTextures2Dout; #endif vec4 imageLoad2D(ivec2 uv) { #ifdef VULKAN return imageLoad(kTextures2Din[pc.textureId], uv); #else return imageLoad(kTextures2Din, uv); #endif } void imageStore2D(ivec2 uv, vec4 data) { #ifdef VULKAN imageStore(kTextures2Dout[pc.textureId], uv, data); #else imageStore(kTextures2Dout, uv, data); #endif } void main() { vec4 pixel = imageLoad2D(ivec2(gl_GlobalInvocationID.xy)); float luminance = dot(pixel, vec4(0.299, 0.587, 0.114, 0.0)); // https://www.w3.org/TR/AERT/#color-contrast imageStore2D(ivec2(gl_GlobalInvocationID.xy), vec4(vec3(luminance), 1.0)); } )"; const char* kCodeFullscreenVS = R"( layout (location=0) out vec2 uv; void main() { // generate a triangle covering the entire screen uv = vec2((gl_VertexIndex << 1) & 2, gl_VertexIndex & 2); #ifdef VULKAN gl_Position = vec4(uv * vec2(2, -2) + vec2(-1, 1), 0.0, 1.0); #else gl_Position = vec4(uv * vec2(2, 2) + vec2(-1, -1), 0.0, 1.0); #endif } )"; const char* kCodeFullscreenFS = R"( layout (location=0) in vec2 uv; layout (location=0) out vec4 out_FragColor; #ifdef VULKAN layout(set = 0, binding = 0) uniform sampler2D texFullScreen; #else uniform sampler2D texFullScreen; #endif void main() { out_FragColor = texture(texFullScreen, uv); } )"; const char* kCodeVS = R"( layout (location=0) in vec3 pos; layout (location=1) in vec3 normal; layout (location=2) in vec2 uv; #ifdef VULKAN layout (location=3) in uint mtlIndex; #else layout (location=3) in float mtlIndex; #endif struct UniformsPerFrame { mat4 proj; mat4 view; mat4 light; int bDrawNormals; int bDebugLines; vec2 padding; }; struct UniformsPerObject { mat4 model; }; struct Material { vec4 ambient; vec4 diffuse; int texAmbient; int texDiffuse; int texAlpha; int padding; }; #ifdef VULKAN layout(set = 1, binding = 0, std140) uniform PerFrame { UniformsPerFrame perFrame; }; layout(set = 1, binding = 1, std140) uniform PerObject { UniformsPerObject perObject; }; layout(set = 1, binding = 2, std430) readonly buffer Materials { Material mtl[]; } mat; #else uniform PerFrame { UniformsPerFrame perFrame; }; uniform PerObject { UniformsPerObject perObject; }; uniform MeshMaterials { Material materials[132]; }; #endif // output struct PerVertex { vec3 normal; vec2 uv; vec4 shadowCoords; }; layout (location=0) out PerVertex vtx; layout (location=5) flat out Material mtl; // void main() { mat4 proj = perFrame.proj; mat4 view = perFrame.view; mat4 model = perObject.model; mat4 light = perFrame.light; #ifdef VULKAN mtl = mat.mtl[uint(mtlIndex)]; #else mtl = materials[int(mtlIndex)]; #endif gl_Position = proj * view * model * vec4(pos, 1.0); // Compute the normal in world-space mat3 norm_matrix = transpose(inverse(mat3(model))); vtx.normal = normalize(norm_matrix * normal); vtx.uv = uv; vtx.shadowCoords = light * model * vec4(pos, 1.0); } )"; const char* kCodeVS_Wireframe = R"( layout (location=0) in vec3 pos; struct UniformsPerFrame { mat4 proj; mat4 view; }; struct UniformsPerObject { mat4 model; }; #ifdef VULKAN layout(set = 1, binding = 0, std140) #endif uniform PerFrame { UniformsPerFrame perFrame; }; #ifdef VULKAN layout(set = 1, binding = 1, std140) #endif uniform PerObject{ UniformsPerObject perObject; }; void main() { mat4 proj = perFrame.proj; mat4 view = perFrame.view; mat4 model = perObject.model; gl_Position = proj * view * model * vec4(pos, 1.0); } )"; const char* kCodeFS_Wireframe = R"( layout (location=0) out vec4 out_FragColor; void main() { out_FragColor = vec4(1.0); }; )"; const char* kCodeFS = R"( struct UniformsPerFrame { mat4 proj; mat4 view; mat4 light; int bDrawNormals; int bDebugLines; vec2 padding; }; #ifdef VULKAN layout(set = 1, binding = 0, std140) #endif uniform PerFrame { UniformsPerFrame perFrame; }; struct Material { vec4 ambient; vec4 diffuse; int texAmbient; int texDiffuse; int texAlpha; int padding; }; struct PerVertex { vec3 normal; vec2 uv; vec4 shadowCoords; }; layout (location=0) in PerVertex vtx; layout (location=5) flat in Material mtl; layout (location=0) out vec4 out_FragColor; #ifdef VULKAN layout(set = 0, binding = 0) uniform sampler2DShadow texShadow; layout(set = 0, binding = 4) uniform samplerCube texSkyboxIrradiance; vec4 textureBindless2D(uint textureid, vec2 uv) { return texture(sampler2D(kTextures2D[textureid], kSamplers[1]), uv); } #else layout(binding = 0) uniform sampler2D texShadow; layout(binding = 1) uniform sampler2D texAmbient; layout(binding = 2) uniform sampler2D texDiffuse; layout(binding = 3) uniform sampler2D texAlpha; layout(binding = 4) uniform samplerCube texSkyboxIrradiance; #endif // VULKAN float PCF3(vec3 uvw) { float size = 1.0 / float( textureSize(texShadow, 0).x ); float shadow = 0.0; for (int v=-1; v<=+1; v++) for (int u=-1; u<=+1; u++) #ifdef VULKAN shadow += texture(texShadow, uvw + size * vec3(u, v, 0)); #else shadow += (uvw.z <= texture(texShadow, uvw.xy + size * vec2(u, v) ).r) ? 1.0 : 0.0; #endif return shadow / 9; } float shadow(vec4 s) { s = s / s.w; if (s.z > -1.0 && s.z < 1.0) { float depthBias = -0.00005; #ifdef VULKAN s.y = 1.0 - s.y; #endif float shadowSample = PCF3(vec3(s.x, s.y, s.z + depthBias)); return mix(0.3, 1.0, shadowSample); } return 1.0; } void main() { #ifdef VULKAN vec4 alpha = textureBindless2D(mtl.texAlpha, vtx.uv); if (mtl.texAlpha > 0 && alpha.r < 0.5) discard; vec4 Ka = mtl.ambient * textureBindless2D(mtl.texAmbient, vtx.uv); vec4 Kd = mtl.diffuse * textureBindless2D(mtl.texDiffuse, vtx.uv); #else vec4 alpha = texture(texAlpha, vtx.uv); // check it is not a dummy 1x1 texture if (textureSize(texAlpha, 0).x > 1 && alpha.r < 0.5) discard; vec4 Ka = mtl.ambient * texture(texAmbient, vtx.uv); vec4 Kd = mtl.diffuse * texture(texDiffuse, vtx.uv); #endif bool drawNormals = perFrame.bDrawNormals > 0; if (Kd.a < 0.5) discard; vec3 n = normalize(vtx.normal); float NdotL1 = clamp(dot(n, normalize(vec3(-1, 1,+1))), 0.0, 1.0); float NdotL2 = clamp(dot(n, normalize(vec3(-1, 1,-1))), 0.0, 1.0); float NdotL = 0.5 * (NdotL1+NdotL2); // IBL diffuse const vec4 f0 = vec4(0.04); vec4 diffuse = texture(texSkyboxIrradiance, n) * Kd * (vec4(1.0) - f0); out_FragColor = drawNormals ? vec4(0.5 * (n+vec3(1.0)), 1.0) : Ka + diffuse * shadow(vtx.shadowCoords); }; )"; const char* kShadowVS = R"( layout (location=0) in vec3 pos; struct UniformsPerFrame { mat4 proj; mat4 view; mat4 light; int bDrawNormals; int bDebugLines; vec2 padding; }; struct UniformsPerObject { mat4 model; }; #ifdef VULKAN layout(set = 1, binding = 0, std140) uniform PerFrame { UniformsPerFrame perFrame; }; layout(set = 1, binding = 1, std140) uniform PerObject { UniformsPerObject perObject; }; #else uniform ShadowFrameUniforms { UniformsPerFrame perFrame; }; uniform ShadowObjectUniforms { UniformsPerObject perObject; }; #endif void main() { mat4 proj = perFrame.proj; mat4 view = perFrame.view; mat4 model = perObject.model; gl_Position = proj * view * model * vec4(pos, 1.0); } )"; const char* kShadowFS = R"( void main() { }; )"; const char* kSkyboxVS = R"( layout (location=0) out vec3 textureCoords; const vec3 positions[8] = vec3[8]( vec3(-1.0,-1.0, 1.0), vec3( 1.0,-1.0, 1.0), vec3( 1.0, 1.0, 1.0), vec3(-1.0, 1.0, 1.0), vec3(-1.0,-1.0,-1.0), vec3( 1.0,-1.0,-1.0), vec3( 1.0, 1.0,-1.0), vec3(-1.0, 1.0,-1.0) ); const int indices[36] = int[36]( 0, 1, 2, 2, 3, 0, 1, 5, 6, 6, 2, 1, 7, 6, 5, 5, 4, 7, 4, 0, 3, 3, 7, 4, 4, 5, 1, 1, 0, 4, 3, 2, 6, 6, 7, 3 ); struct UniformsPerFrame { mat4 proj; mat4 view; mat4 light; int bDrawNormals; int bDebugLines; vec2 padding; }; #ifdef VULKAN layout(set = 1, binding = 0, std140) uniform PerFrame { UniformsPerFrame perFrame; }; #else uniform SkyboxFrameUniforms { UniformsPerFrame perFrame; }; #endif void main() { mat4 proj = perFrame.proj; mat4 view = perFrame.view; // discard translation view = mat4(view[0], view[1], view[2], vec4(0, 0, 0, 1)); mat4 transform = proj * view; vec3 pos = positions[indices[gl_VertexIndex]]; gl_Position = (transform * vec4(pos, 1.0)).xyww; // skybox textureCoords = pos; #ifdef VULKAN // Draws the skybox edges. One color per edge const bool drawDebugLines = perFrame.bDebugLines > 0; if (drawDebugLines) { const int[12][2] edgeIndices = { {0,1}, {1,2}, {2,3}, {3,0}, {4,5}, {5,6}, {6,7}, {7,4}, {0,4}, {1,5}, {2,6}, {3,7} }; const vec4 edgeColors[12] = vec4[12]( vec4( 1, 0, 0, 1), vec4( 1, 1, 0, 1), vec4( 0, 1, 0, 1), vec4( 0, 1, 1, 1), vec4( 1, 0, 1, 1), vec4( 0, 0, 1, 1), vec4( 1, 1, 1, 1), vec4( 0, 0, 0, 1), vec4(0.5, 0.7, 0.8, 1), vec4(0.4, 0.4, 0.4, 1), vec4( 1, 0.3, 0.6, 1), vec4( 1, 0.8, 0, 1) ); uint index = gl_VertexIndex / 3; drawLine(positions[edgeIndices[index][0]], positions[edgeIndices[index][1]], edgeColors[index], edgeColors[index], transform); } #endif } )"; const char* kSkyboxFS = R"( layout (location=0) in vec3 textureCoords; layout (location=0) out vec4 out_FragColor; #ifdef VULKAN layout(set = 0, binding = 1) uniform samplerCube texSkybox; #else uniform samplerCube texSkybox; #endif void main() { out_FragColor = texture(texSkybox, textureCoords); } )"; // @fb-only // @fb-only // @fb-only using namespace igl; using glm::mat4; using glm::vec2; using glm::vec3; using glm::vec4; int width_ = 1920; int height_ = 1080; igl::FPSCounter fps_; constexpr uint32_t kNumBufferedFrames = 3; std::unique_ptr device_; std::shared_ptr commandQueue_; RenderPassDesc renderPassOffscreen_; RenderPassDesc renderPassMain_; RenderPassDesc renderPassShadow_; std::shared_ptr fbMain_; // swapchain std::shared_ptr fbOffscreen_; std::shared_ptr fbShadowMap_; std::shared_ptr computePipelineState_Grayscale_; std::shared_ptr renderPipelineState_Mesh_; std::shared_ptr renderPipelineState_MeshWireframe_; std::shared_ptr renderPipelineState_Shadow_; std::shared_ptr renderPipelineState_Skybox_; std::shared_ptr renderPipelineState_Fullscreen_; std::shared_ptr vb0_, ib0_; // buffers for vertices and indices std::shared_ptr sbMaterials_; // storage buffer for materials std::vector> ubPerFrame_, ubPerFrameShadow_, ubPerObject_; std::shared_ptr vertexInput0_; std::shared_ptr vertexInputShadows_; std::shared_ptr depthStencilState_; std::shared_ptr depthStencilStateLEqual_; std::shared_ptr sampler; std::shared_ptr samplerShadow; std::shared_ptr textureDummyWhite_; #if USE_OPENGL_BACKEND std::shared_ptr textureDummyBlack_; #endif // USE_OPENGL_BACKEND std::shared_ptr skyboxTextureReference_; std::shared_ptr skyboxTextureIrradiance_; // scene navigation CameraPositioner_FirstPerson positioner_(vec3(-100, 40, -47), vec3(0, 35, 0), vec3(0, 1, 0)); Camera camera(positioner_); glm::vec2 mousePos_ = glm::vec2(0.0f); bool mousePressed_ = false; bool enableComputePass_ = false; bool enableWireframe_ = false; bool isShadowMapDirty_ = true; struct VertexData { vec3 position; uint32_t normal{}; // Int_2_10_10_10_REV uint32_t uv{}; // hvec2 uint32_t mtlIndex{}; }; std::vector vertexData_; std::vector indexData_; std::vector shapeVertexCnt_; struct UniformsPerFrame { mat4 proj; mat4 view; mat4 light; int bDrawNormals = 0; int bDebugLines = 0; vec2 padding; } perFrame_; struct UniformsPerObject { mat4 model; }; #define MAX_MATERIAL_NAME 128 struct CachedMaterial { char name[MAX_MATERIAL_NAME] = {}; vec3 ambient = vec3(0.0f); vec3 diffuse = vec3(0.0f); char ambient_texname[MAX_MATERIAL_NAME] = {}; char diffuse_texname[MAX_MATERIAL_NAME] = {}; char alpha_texname[MAX_MATERIAL_NAME] = {}; }; // this goes into our GLSL shaders struct GPUMaterial { vec4 ambient = vec4(0.0f); vec4 diffuse = vec4(0.0f); uint32_t texAmbient = 0; uint32_t texDiffuse = 0; uint32_t texAlpha = 0; uint32_t padding[1]; }; static_assert(sizeof(GPUMaterial) % 16 == 0); std::vector cachedMaterials_; std::vector materials_; struct MaterialTextures { std::shared_ptr ambient; std::shared_ptr diffuse; std::shared_ptr alpha; }; std::vector textures_; // same indexing as in materials_ struct LoadedImage { int w = 0; int h = 0; uint8_t* pixels = nullptr; int channels = 0; std::string debugName; std::string compressedFileName; }; struct LoadedMaterial { size_t idx = 0; LoadedImage ambient; LoadedImage diffuse; LoadedImage alpha; }; // file name -> LoadedImage std::mutex imagesCacheMutex_; std::unordered_map imagesCache_; // accessible only from the loader thread // pool (multiple threads) std::unordered_map> texturesCache_; // accessible only from // the main thread std::vector loadedMaterials_; std::mutex loadedMaterialsMutex_; std::atomic loaderShouldExit_ = false; std::atomic remainingMaterialsToLoad_ = 0; std::unique_ptr loaderPool_ = std::make_unique(std::max(2u, std::thread::hardware_concurrency() / 2)); std::string convertFileName(std::string fileName) { // generate compressed filename const std::string compressedPathPrefix = contentRootFolder; if (fileName.find(compressedPathPrefix) == 0) { // remove leading path fileName = fileName.substr(compressedPathPrefix.length()); } std::replace(fileName.begin(), fileName.end(), ':', '_'); std::replace(fileName.begin(), fileName.end(), '.', '_'); std::replace(fileName.begin(), fileName.end(), '/', '_'); std::replace(fileName.begin(), fileName.end(), '\\', '_'); // return absolute compressed filename return compressedPathPrefix + fileName + ".ktx2"; } [[maybe_unused]] void stringReplaceAll(std::string& s, const std::string& searchString, const std::string& replaceString) { size_t pos = 0; while ((pos = s.find(searchString, pos)) != std::string::npos) { s.replace(pos, searchString.length(), replaceString); } } GLFWwindow* initIGL(bool isHeadless, bool enableVulkanValidationLayers) { if (!glfwInit()) { printf("glfwInit() failed"); return nullptr; } #if USE_OPENGL_BACKEND glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_VISIBLE, true); glfwWindowHint(GLFW_DOUBLEBUFFER, true); glfwWindowHint(GLFW_SRGB_CAPABLE, true); glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_API); const char* title = "OpenGL Mesh"; #else glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); const char* title = "Vulkan Mesh"; #endif glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE); GLFWwindow* window = nullptr; if (!isHeadless) { // render full screen without overlapping taskbar GLFWmonitor* monitor = glfwGetPrimaryMonitor(); const GLFWvidmode* mode = glfwGetVideoMode(monitor); int posX = 0; int posY = 0; int width = mode->width; int height = mode->height; glfwGetMonitorWorkarea(monitor, &posX, &posY, &width, &height); window = glfwCreateWindow(width, height, title, nullptr, nullptr); glfwSetWindowPos(window, posX, posY); glfwSetErrorCallback([](int error, const char* description) { printf("GLFW Error (%i): %s\n", error, description); }); glfwSetCursorPosCallback(window, [](auto* window, double x, double y) { int fbWidth = 0, fbHeight = 0; glfwGetFramebufferSize(window, &fbWidth, &fbHeight); mousePos_ = vec2(x / fbWidth, 1.0f - y / fbHeight); #if IGL_WITH_IGLU inputDispatcher.queueEvent(igl::shell::MouseMotionEvent(x, y, 0, 0)); #endif // IGL_WITH_IGLU }); glfwSetMouseButtonCallback(window, [](auto* window, int button, int action, int /*mods*/) { #if IGL_WITH_IGLU if (!ImGui::GetIO().WantCaptureMouse) { #endif // IGL_WITH_IGLU if (button == GLFW_MOUSE_BUTTON_LEFT) { mousePressed_ = (action == GLFW_PRESS); } #if IGL_WITH_IGLU } else { // release the mouse mousePressed_ = false; } double xpos = NAN, ypos = NAN; glfwGetCursorPos(window, &xpos, &ypos); using igl::shell::MouseButton; const MouseButton iglButton = (button == GLFW_MOUSE_BUTTON_LEFT) ? MouseButton::Left : (button == GLFW_MOUSE_BUTTON_RIGHT ? MouseButton::Right : MouseButton::Middle); inputDispatcher.queueEvent( igl::shell::MouseButtonEvent(iglButton, action == GLFW_PRESS, (float)xpos, (float)ypos)); #endif // IGL_WITH_IGLU }); glfwSetKeyCallback(window, [](GLFWwindow* window, int key, int, int action, int mods) { const bool pressed = action != GLFW_RELEASE; if (key == GLFW_KEY_ESCAPE && pressed) { glfwSetWindowShouldClose(window, GLFW_TRUE); } if (key == GLFW_KEY_N && pressed) { perFrame_.bDrawNormals = (perFrame_.bDrawNormals + 1) % 2; } if (key == GLFW_KEY_C && pressed) { enableComputePass_ = !enableComputePass_; } if (key == GLFW_KEY_T && pressed) { enableWireframe_ = !enableWireframe_; } if (key == GLFW_KEY_ESCAPE && pressed) { glfwSetWindowShouldClose(window, GLFW_TRUE); } if (key == GLFW_KEY_W) { positioner_.movement_.forward_ = pressed; } if (key == GLFW_KEY_S) { positioner_.movement_.backward_ = pressed; } if (key == GLFW_KEY_A) { positioner_.movement_.left_ = pressed; } if (key == GLFW_KEY_D) { positioner_.movement_.right_ = pressed; } if (key == GLFW_KEY_1) { positioner_.movement_.up_ = pressed; } if (key == GLFW_KEY_2) { positioner_.movement_.down_ = pressed; } if (mods & GLFW_MOD_SHIFT) { positioner_.movement_.fastSpeed_ = pressed; } if (key == GLFW_KEY_LEFT_SHIFT || key == GLFW_KEY_RIGHT_SHIFT) { positioner_.movement_.fastSpeed_ = pressed; } if (key == GLFW_KEY_SPACE) { positioner_.setUpVector(vec3(0.0f, 1.0f, 0.0f)); } if (key == GLFW_KEY_L && pressed) { perFrame_.bDebugLines = (perFrame_.bDebugLines + 1) % 2; } }); glfwGetWindowSize(window, &width_, &height_); } // create a device { { const Result result; #if USE_OPENGL_BACKEND #if IGL_PLATFORM_WINDOWS auto ctx = std::make_unique(GetDC(glfwGetWin32Window(window_)), glfwGetWGLContext(window_)); device_ = std::make_unique(std::move(ctx)); #elif IGL_PLATFORM_LINUX auto ctx = std::make_unique( nullptr, glfwGetX11Display(), (igl::opengl::glx::GLXDrawable)glfwGetX11Window(window_), (igl::opengl::glx::GLXContext)glfwGetGLXContext(window_)); device_ = std::make_unique(std::move(ctx)); #endif #else const igl::vulkan::VulkanContextConfig cfg = { .terminateOnValidationError = false, .enableValidation = enableVulkanValidationLayers, .enableDescriptorIndexing = true, .headless = isHeadless, }; #if defined(_XLESS_GLFW_) auto ctx = vulkan::HWDevice::createContext(cfg, nullptr); #elif defined(_WIN32) auto ctx = vulkan::HWDevice::createContext( cfg, window ? (void*)glfwGetWin32Window(window) : nullptr); #elif defined(__APPLE__) auto ctx = vulkan::HWDevice::createContext( cfg, window ? (void*)glfwGetCocoaWindow(window) : nullptr); #elif defined(__linux__) auto ctx = vulkan::HWDevice::createContext( cfg, window ? (void*)glfwGetX11Window(window) : nullptr, (void*)glfwGetX11Display()); #else #error Unsupported OS #endif const HWDeviceType hardwareType = kPreferIntegratedGPU ? HWDeviceType::IntegratedGpu : HWDeviceType::DiscreteGpu; std::vector devices = vulkan::HWDevice::queryDevices(*ctx, HWDeviceQueryDesc(hardwareType), nullptr); if (devices.empty()) { const HWDeviceType fallbackHardwareType = !kPreferIntegratedGPU ? HWDeviceType::IntegratedGpu : HWDeviceType::DiscreteGpu; devices = vulkan::HWDevice::queryDevices(*ctx, HWDeviceQueryDesc(fallbackHardwareType), nullptr); } if (devices.empty() || cfg.headless) { // LavaPipe etc devices = vulkan::HWDevice::queryDevices( *ctx, HWDeviceQueryDesc(HWDeviceType::SoftwareGpu), nullptr); } IGL_DEBUG_ASSERT(!devices.empty(), "GPU is not found"); device_ = vulkan::HWDevice::create(std::move(ctx), devices[0], (uint32_t)width_, (uint32_t)height_); #endif IGL_DEBUG_ASSERT(device_); } } return window; } namespace { void normalizeName(std::string& name) { #if defined(__linux__) std::replace(name.begin(), name.end(), '\\', '/'); #endif } } // namespace bool loadAndCache(const char* cacheFileName) { // load 3D model and cache it IGL_LOG_INFO("Loading `exterior.obj`... It can take a while in debug builds...\n"); tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; const bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, (contentRootFolder + "src/bistro/Exterior/exterior.obj").c_str(), (contentRootFolder + "src/bistro/Exterior/").c_str()); if (!IGL_DEBUG_VERIFY(ret)) { IGL_DEBUG_ASSERT(ret, "Did you read the tutorial at the top of this file?"); return false; } // loop over shapes as described in https://github.com/tinyobjloader/tinyobjloader std::vector> resplitShapes; std::vector shapeData; resplitShapes.resize(materials.size()); int prevIndex = shapes[0].mesh.material_ids[0]; for (auto& shape : shapes) { size_t index_offset = 0; for (size_t f = 0; f < shape.mesh.num_face_vertices.size(); f++) { IGL_DEBUG_ASSERT(shape.mesh.num_face_vertices[f] == 3); for (size_t v = 0; v < 3; v++) { const tinyobj::index_t idx = shape.mesh.indices[index_offset + v]; const vec3 pos(attrib.vertices[3 * size_t(idx.vertex_index) + 0], attrib.vertices[3 * size_t(idx.vertex_index) + 1], attrib.vertices[3 * size_t(idx.vertex_index) + 2]); const bool hasNormal = (idx.normal_index >= 0); const vec3 normal = hasNormal ? vec3(attrib.normals[3 * size_t(idx.normal_index) + 0], attrib.normals[3 * size_t(idx.normal_index) + 1], attrib.normals[3 * size_t(idx.normal_index) + 2]) : vec3(0, 0, 1); const bool hasUV = (idx.texcoord_index >= 0); const vec2 uv = hasUV ? vec2(attrib.texcoords[2 * size_t(idx.texcoord_index) + 0], attrib.texcoords[2 * size_t(idx.texcoord_index) + 1]) : vec2(0); const int mtlIndex = shape.mesh.material_ids[f]; IGL_DEBUG_ASSERT(mtlIndex >= 0 && mtlIndex < materials.size()); if (prevIndex != mtlIndex) { resplitShapes[prevIndex].insert( resplitShapes[prevIndex].end(), shapeData.begin(), shapeData.end()); shapeData.clear(); prevIndex = mtlIndex; } vertexData_.push_back({pos, glm::packSnorm3x10_1x2(vec4(normal, 0)), glm::packHalf2x16(uv), (uint32_t)mtlIndex}); shapeData.push_back({pos, glm::packSnorm3x10_1x2(vec4(normal, 0)), glm::packHalf2x16(uv), (uint32_t)mtlIndex}); } index_offset += 3; } } resplitShapes[prevIndex].insert( resplitShapes[prevIndex].end(), shapeData.begin(), shapeData.end()); shapeData.clear(); for (auto shape : resplitShapes) { shapeData.insert(shapeData.end(), shape.begin(), shape.end()); shapeVertexCnt_.emplace_back((uint32_t)shape.size()); } // repack the mesh as described in https://github.com/zeux/meshoptimizer { // 1. Generate an index buffer const size_t indexCount = vertexData_.size(); std::vector remap(indexCount); const size_t vertexCount = meshopt_generateVertexRemap( remap.data(), nullptr, indexCount, vertexData_.data(), indexCount, sizeof(VertexData)); // 2. Remap vertices std::vector remappedVertices; indexData_.resize(indexCount); remappedVertices.resize(vertexCount); meshopt_remapIndexBuffer(indexData_.data(), nullptr, indexCount, remap.data()); meshopt_remapVertexBuffer( remappedVertices.data(), vertexData_.data(), indexCount, sizeof(VertexData), remap.data()); vertexData_ = remappedVertices; // 3. Optimize for the GPU vertex cache reuse and overdraw meshopt_optimizeVertexCache(indexData_.data(), indexData_.data(), indexCount, vertexCount); meshopt_optimizeOverdraw(indexData_.data(), indexData_.data(), indexCount, &vertexData_[0].position.x, vertexCount, sizeof(VertexData), 1.05f); meshopt_optimizeVertexFetch(vertexData_.data(), indexData_.data(), indexCount, vertexData_.data(), vertexCount, sizeof(VertexData)); } // loop over materials for (auto& m : materials) { CachedMaterial mtl; mtl.ambient = vec3(m.ambient[0], m.ambient[1], m.ambient[2]); mtl.diffuse = vec3(m.diffuse[0], m.diffuse[1], m.diffuse[2]); IGL_DEBUG_ASSERT(m.name.length() < MAX_MATERIAL_NAME); IGL_DEBUG_ASSERT(m.ambient_texname.length() < MAX_MATERIAL_NAME); IGL_DEBUG_ASSERT(m.diffuse_texname.length() < MAX_MATERIAL_NAME); IGL_DEBUG_ASSERT(m.alpha_texname.length() < MAX_MATERIAL_NAME); strcat(mtl.name, m.name.c_str()); normalizeName(m.ambient_texname); normalizeName(m.diffuse_texname); normalizeName(m.alpha_texname); strcat(mtl.ambient_texname, m.ambient_texname.c_str()); strcat(mtl.diffuse_texname, m.diffuse_texname.c_str()); strcat(mtl.alpha_texname, m.alpha_texname.c_str()); cachedMaterials_.push_back(mtl); } IGL_LOG_INFO("Caching mesh...\n"); FILE* cacheFile = fopen(cacheFileName, "wb"); if (!cacheFile) { return false; } const uint32_t numMaterials = (uint32_t)cachedMaterials_.size(); const uint32_t numVertices = (uint32_t)vertexData_.size(); const uint32_t numIndices = (uint32_t)indexData_.size(); fwrite(&kMeshCacheVersion, sizeof(kMeshCacheVersion), 1, cacheFile); fwrite(&numMaterials, sizeof(numMaterials), 1, cacheFile); fwrite(&numVertices, sizeof(numVertices), 1, cacheFile); fwrite(&numIndices, sizeof(numIndices), 1, cacheFile); fwrite(cachedMaterials_.data(), sizeof(CachedMaterial), numMaterials, cacheFile); fwrite(vertexData_.data(), sizeof(VertexData), numVertices, cacheFile); fwrite(indexData_.data(), sizeof(uint32_t), numIndices, cacheFile); const uint32_t numShapes = (uint32_t)shapeData.size(); fwrite(&numShapes, sizeof(numShapes), 1, cacheFile); fwrite(shapeData.data(), sizeof(VertexData), numShapes, cacheFile); const uint32_t numShapeVertices = (uint32_t)shapeVertexCnt_.size(); fwrite(&numShapeVertices, sizeof(numShapeVertices), 1, cacheFile); fwrite(shapeVertexCnt_.data(), sizeof(uint32_t), numShapeVertices, cacheFile); #if USE_OPENGL_BACKEND vertexData_.clear(); vertexData_.assign(shapeData.begin(), shapeData.end()); #endif return fclose(cacheFile) == 0; } bool loadFromCache(const char* cacheFileName) { FILE* cacheFile = fopen(cacheFileName, "rb"); IGL_SCOPE_EXIT { if (cacheFile) { fclose(cacheFile); } }; if (!cacheFile) { return false; } #define CHECK_READ(expected, read) \ if ((read) != (expected)) { \ return false; \ } uint32_t versionProbe = 0; CHECK_READ(1, fread(&versionProbe, sizeof(versionProbe), 1, cacheFile)); if (versionProbe != kMeshCacheVersion) { IGL_LOG_INFO("Cache file has wrong version id\n"); return false; } uint32_t numMaterials = 0; uint32_t numVertices = 0; uint32_t numIndices = 0; CHECK_READ(1, fread(&numMaterials, sizeof(numMaterials), 1, cacheFile)); CHECK_READ(1, fread(&numVertices, sizeof(numVertices), 1, cacheFile)); CHECK_READ(1, fread(&numIndices, sizeof(numIndices), 1, cacheFile)); cachedMaterials_.resize(numMaterials); vertexData_.resize(numVertices); indexData_.resize(numIndices); CHECK_READ(numMaterials, fread(cachedMaterials_.data(), sizeof(CachedMaterial), numMaterials, cacheFile)); #if !USE_OPENGL_BACKEND CHECK_READ(numVertices, fread(vertexData_.data(), sizeof(VertexData), numVertices, cacheFile)); CHECK_READ(numIndices, fread(indexData_.data(), sizeof(uint32_t), numIndices, cacheFile)); #else fseek(cacheFile, sizeof(VertexData) * numVertices + sizeof(uint32_t) * numIndices, SEEK_CUR); CHECK_READ(1, fread(&numVertices, sizeof(numVertices), 1, cacheFile)); vertexData_.resize(numVertices); CHECK_READ(numVertices, fread(vertexData_.data(), sizeof(VertexData), numVertices, cacheFile)); uint32_t numShapeVertices = 0; CHECK_READ(1, fread(&numShapeVertices, sizeof(numShapeVertices), 1, cacheFile)); shapeVertexCnt_.resize(numShapeVertices); CHECK_READ(numShapeVertices, fread(shapeVertexCnt_.data(), sizeof(uint32_t), numShapeVertices, cacheFile)); #endif #undef CHECK_READ return true; } void initModel(int numSamplesMSAA) { // @fb-only // @fb-only // @fb-only // @fb-only { const TextureDesc desc = TextureDesc::new2D(igl::TextureFormat::RGBA_UNorm8, 1, 1, TextureDesc::TextureUsageBits::Sampled, "dummy 1x1 (white)"); textureDummyWhite_ = device_->createTexture(desc, nullptr); const uint32_t pixel = 0xFFFFFFFF; textureDummyWhite_->upload(TextureRangeDesc::new2D(0, 0, 1, 1), &pixel); } { #if USE_OPENGL_BACKEND { const TextureDesc desc = TextureDesc::new2D(igl::TextureFormat::RGBA_UNorm8, 1, 1, TextureDesc::TextureUsageBits::Sampled, "dummy 1x1 (black)"); textureDummyBlack_ = device_->createTexture(desc, nullptr); const uint32_t pixel = 0xFF000000; textureDummyBlack_->upload(TextureRangeDesc::new2D(0, 0, 1, 1), &pixel); } const auto bufType = BufferDesc::BufferTypeBits::Uniform; const auto hint = BufferDesc::BufferAPIHintBits::UniformBlock; #else const auto bufType = BufferDesc::BufferTypeBits::Uniform; const auto hint = 0; #endif // create an Uniform buffers to store uniforms for 2 objects for (uint32_t i = 0; i != kNumBufferedFrames; i++) { ubPerFrame_.push_back( device_->createBuffer(BufferDesc{bufType, nullptr, sizeof(UniformsPerFrame), ResourceStorage::Shared, hint, "uniforms (per frame) " + std::to_string(i)}, nullptr)); ubPerFrameShadow_.push_back( device_->createBuffer(BufferDesc{bufType, nullptr, sizeof(UniformsPerFrame), ResourceStorage::Shared, hint, "uniforms (per frame shadow) " + std::to_string(i)}, nullptr)); ubPerObject_.push_back( device_->createBuffer(BufferDesc{bufType, nullptr, sizeof(UniformsPerObject), ResourceStorage::Shared, hint, "uniforms (per object) " + std::to_string(i)}, nullptr)); } } { const VertexInputStateDesc desc = { .numAttributes = 4, .attributes = { { .format = VertexAttributeFormat::Float3, .offset = offsetof(VertexData, position), .name = "pos", .location = 0, }, { .format = VertexAttributeFormat::Int_2_10_10_10_REV, .offset = offsetof(VertexData, normal), .name = "normal", .location = 1, }, { .format = VertexAttributeFormat::HalfFloat2, .offset = offsetof(VertexData, uv), .name = "uv", .location = 2, }, { .format = VertexAttributeFormat::UInt1, .offset = offsetof(VertexData, mtlIndex), .name = "mtlIndex", .location = 3, }, }, .numInputBindings = 1, .inputBindings = {{.stride = sizeof(VertexData)}}, }; vertexInput0_ = device_->createVertexInputState(desc, nullptr); } { const VertexInputStateDesc desc = { .numAttributes = 1, .attributes = {{ .format = VertexAttributeFormat::Float3, .offset = offsetof(VertexData, position), .name = "pos", .location = 0, }}, .numInputBindings = 1, .inputBindings = {{.stride = sizeof(VertexData)}}, }; vertexInputShadows_ = device_->createVertexInputState(desc, nullptr); } depthStencilState_ = device_->createDepthStencilState( {.compareFunction = igl::CompareFunction::Less, .isDepthWriteEnabled = true}, nullptr); depthStencilStateLEqual_ = device_->createDepthStencilState( {.compareFunction = igl::CompareFunction::LessEqual, .isDepthWriteEnabled = true}, nullptr); { igl::SamplerStateDesc desc = igl::SamplerStateDesc::newLinear(); desc.addressModeU = igl::SamplerAddressMode::Repeat; desc.addressModeV = igl::SamplerAddressMode::Repeat; desc.mipFilter = igl::SamplerMipFilter::Linear; desc.debugName = "Sampler: linear"; sampler = device_->createSamplerState(desc, nullptr); desc.addressModeU = igl::SamplerAddressMode::Clamp; desc.addressModeV = igl::SamplerAddressMode::Clamp; desc.mipFilter = igl::SamplerMipFilter::Disabled; desc.debugName = "Sampler: shadow"; desc.depthCompareEnabled = true; desc.depthCompareFunction = igl::CompareFunction::LessEqual; samplerShadow = device_->createSamplerState(desc, nullptr); } commandQueue_ = device_->createCommandQueue({}, nullptr); renderPassOffscreen_.colorAttachments.emplace_back(); renderPassOffscreen_.colorAttachments.back().loadAction = LoadAction::Clear; renderPassOffscreen_.colorAttachments.back().storeAction = numSamplesMSAA > 1 ? StoreAction::MsaaResolve : StoreAction::Store; renderPassOffscreen_.colorAttachments.back().clearColor = {0.0f, 0.0f, 0.0f, 1.0f}; renderPassOffscreen_.depthAttachment.loadAction = LoadAction::Clear; renderPassOffscreen_.depthAttachment.storeAction = StoreAction::DontCare; renderPassOffscreen_.depthAttachment.clearDepth = 1.0f; renderPassMain_.colorAttachments.emplace_back(); renderPassMain_.colorAttachments.back().loadAction = LoadAction::Clear; renderPassMain_.colorAttachments.back().storeAction = StoreAction::Store; renderPassMain_.colorAttachments.back().clearColor = {0.0f, 0.0f, 0.0f, 1.0f}; renderPassMain_.depthAttachment.loadAction = LoadAction::Clear; renderPassMain_.depthAttachment.storeAction = StoreAction::DontCare; renderPassMain_.depthAttachment.clearDepth = 1.0f; #if USE_OPENGL_BACKEND renderPassShadow_.colorAttachments.push_back(igl::RenderPassDesc::ColorAttachmentDesc{}); renderPassShadow_.colorAttachments.back().loadAction = LoadAction::Clear; renderPassShadow_.colorAttachments.back().storeAction = StoreAction::Store; renderPassShadow_.colorAttachments.back().clearColor = {0.0f, 0.0f, 0.0f, 1.0f}; #endif renderPassShadow_.depthAttachment.loadAction = LoadAction::Clear; renderPassShadow_.depthAttachment.storeAction = StoreAction::Store; renderPassShadow_.depthAttachment.clearDepth = 1.0f; const std::string cacheFileName = contentRootFolder + "cache.data"; if (!loadFromCache(cacheFileName.c_str())) { if (!IGL_DEBUG_VERIFY(loadAndCache(cacheFileName.c_str()))) { IGL_DEBUG_ABORT("Cannot load 3D model"); } } #if USE_OPENGL_BACKEND const uint32_t id = 0; #else const uint32_t id = (uint32_t)textureDummyWhite_->getTextureId(); #endif for (const auto& mtl : cachedMaterials_) { materials_.push_back(GPUMaterial{.ambient = vec4(mtl.ambient, 1.0f), .diffuse = vec4(mtl.diffuse, 1.0f), .texAmbient = id, .texDiffuse = id}); } { #if USE_OPENGL_BACKEND const auto bufType = BufferDesc::BufferTypeBits::Uniform; const auto hint = BufferDesc::BufferAPIHintBits::UniformBlock; #else const auto bufType = BufferDesc::BufferTypeBits::Storage; const auto hint = 0; #endif sbMaterials_ = device_->createBuffer(BufferDesc{bufType, materials_.data(), sizeof(GPUMaterial) * materials_.size(), ResourceStorage::Private, hint, "materials"}, nullptr); vb0_ = device_->createBuffer(BufferDesc{BufferDesc::BufferTypeBits::Vertex, vertexData_.data(), sizeof(VertexData) * vertexData_.size(), ResourceStorage::Private, hint, "vertex"}, nullptr); ib0_ = device_->createBuffer(BufferDesc{BufferDesc::BufferTypeBits::Index, indexData_.data(), sizeof(uint32_t) * indexData_.size(), ResourceStorage::Private, hint, "index"}, nullptr); } } void createComputePipeline() { if (computePipelineState_Grayscale_) { return; } ComputePipelineDesc desc; #if USE_OPENGL_BACKEND std::string computeCode = std::string("#version 460") + kCodeComputeTest; kCodeComputeTest = computeCode.c_str(); #endif desc.shaderStages = ShaderStagesCreator::fromModuleStringInput( *device_, kCodeComputeTest, "main", "Shader Module: grayscale (comp)", nullptr); computePipelineState_Grayscale_ = device_->createComputePipeline(desc, nullptr); } void createRenderPipelines(int numSamplesMSAA) { if (renderPipelineState_Mesh_) { return; } IGL_DEBUG_ASSERT(fbMain_); { RenderPipelineDesc desc; desc.targetDesc.colorAttachments.resize(1); desc.targetDesc.colorAttachments[0].textureFormat = fbMain_->getColorAttachment(0)->getFormat(); if (fbMain_->getDepthAttachment()) { desc.targetDesc.depthAttachmentFormat = fbMain_->getDepthAttachment()->getFormat(); } desc.vertexInputState = vertexInput0_; // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only #if USE_OPENGL_BACKEND std::string vsCode = std::string("#version 460") + kCodeVS; kCodeVS = vsCode.c_str(); std::string fsCode = std::string("#version 460") + kCodeFS; kCodeFS = fsCode.c_str(); #endif desc.shaderStages = ShaderStagesCreator::fromModuleStringInput(*device_, kCodeVS, "main", "Shader Module: main (vert)", kCodeFS, "main", "Shader Module: main (frag)", nullptr); // @fb-only #if USE_OPENGL_BACKEND desc.uniformBlockBindingMap.emplace( 0, std::vector>{ std::make_pair(IGL_NAMEHANDLE("PerFrame"), igl::NameHandle{})}); desc.uniformBlockBindingMap.emplace( 1, std::vector>{ std::make_pair(IGL_NAMEHANDLE("PerObject"), igl::NameHandle{})}); desc.uniformBlockBindingMap.emplace( 2, std::vector>{ std::make_pair(IGL_NAMEHANDLE("MeshMaterials"), igl::NameHandle{})}); #endif desc.cullMode = igl::CullMode::Back; desc.frontFaceWinding = igl::WindingMode::CounterClockwise; desc.sampleCount = numSamplesMSAA; desc.debugName = IGL_NAMEHANDLE("Pipeline: mesh"); #if USE_OPENGL_BACKEND desc.fragmentUnitSamplerMap[0] = IGL_NAMEHANDLE("texShadow"); desc.fragmentUnitSamplerMap[1] = IGL_NAMEHANDLE("texAmbient"); desc.fragmentUnitSamplerMap[2] = IGL_NAMEHANDLE("texDiffuse"); desc.fragmentUnitSamplerMap[3] = IGL_NAMEHANDLE("texAlpha"); desc.fragmentUnitSamplerMap[4] = IGL_NAMEHANDLE("texSkyboxIrradiance"); #endif renderPipelineState_Mesh_ = device_->createRenderPipeline(desc, nullptr); desc.polygonFillMode = igl::PolygonFillMode::Line; desc.vertexInputState = vertexInputShadows_; // positions-only #if USE_OPENGL_BACKEND const std::string vsCodeWireframe = std::string("#version 460") + kCodeVS_Wireframe; kCodeVS_Wireframe = vsCodeWireframe.c_str(); const std::string fsCodeWireframe = std::string("#version 460") + kCodeFS_Wireframe; kCodeFS_Wireframe = fsCodeWireframe.c_str(); desc.fragmentUnitSamplerMap.clear(); desc.uniformBlockBindingMap.clear(); desc.uniformBlockBindingMap.emplace( 0, std::vector>{ std::make_pair(IGL_NAMEHANDLE("PerFrame"), igl::NameHandle{})}); desc.uniformBlockBindingMap.emplace( 1, std::vector>{ std::make_pair(IGL_NAMEHANDLE("PerObject"), igl::NameHandle{})}); #endif desc.shaderStages = ShaderStagesCreator::fromModuleStringInput(*device_, kCodeVS_Wireframe, "main", "Shader Module: main wireframe (vert)", kCodeFS_Wireframe, "main", "Shader Module: main wireframe (frag)", nullptr); renderPipelineState_MeshWireframe_ = device_->createRenderPipeline(desc, nullptr); } // shadow { RenderPipelineDesc desc; desc.targetDesc.colorAttachments.clear(); desc.targetDesc.depthAttachmentFormat = fbShadowMap_->getDepthAttachment()->getFormat(); desc.vertexInputState = vertexInputShadows_; #if USE_OPENGL_BACKEND std::string vsCode = std::string("#version 460") + kShadowVS; kShadowVS = vsCode.c_str(); std::string fsCode = std::string("#version 460") + kShadowFS; kShadowFS = fsCode.c_str(); #endif desc.shaderStages = ShaderStagesCreator::fromModuleStringInput(*device_, kShadowVS, "main", "Shader Module: shadow (vert)", kShadowFS, "main", "Shader Module: shadow (frag)", nullptr); #if USE_OPENGL_BACKEND size_t bindingPoint = 0; desc.uniformBlockBindingMap[bindingPoint++].emplace_back( std::make_pair(IGL_NAMEHANDLE("ShadowFrameUniforms"), igl::NameHandle{})); desc.uniformBlockBindingMap[bindingPoint++].emplace_back( std::make_pair(IGL_NAMEHANDLE("ShadowObjectUniforms"), igl::NameHandle{})); #endif desc.cullMode = igl::CullMode::Disabled; desc.debugName = IGL_NAMEHANDLE("Pipeline: shadow"); renderPipelineState_Shadow_ = device_->createRenderPipeline(desc, nullptr); } // fullscreen { RenderPipelineDesc desc; desc.targetDesc.colorAttachments.resize(1); desc.targetDesc.colorAttachments[0].textureFormat = fbMain_->getColorAttachment(0)->getFormat(); if (fbMain_->getDepthAttachment()) { desc.targetDesc.depthAttachmentFormat = fbMain_->getDepthAttachment()->getFormat(); } #if USE_OPENGL_BACKEND std::string vsCode = std::string("#version 460") + kCodeFullscreenVS; stringReplaceAll(vsCode, "gl_VertexIndex", "gl_VertexID"); kCodeFullscreenVS = vsCode.c_str(); std::string fsCode = std::string("#version 460") + kCodeFullscreenFS; kCodeFullscreenFS = fsCode.c_str(); #endif desc.shaderStages = ShaderStagesCreator::fromModuleStringInput(*device_, kCodeFullscreenVS, "main", "Shader Module: fullscreen (vert)", kCodeFullscreenFS, "main", "Shader Module: fullscreen (frag)", nullptr); desc.cullMode = igl::CullMode::Disabled; desc.debugName = IGL_NAMEHANDLE("Pipeline: fullscreen"); desc.fragmentUnitSamplerMap[0] = IGL_NAMEHANDLE("texFullScreen"); renderPipelineState_Fullscreen_ = device_->createRenderPipeline(desc, nullptr); } } void createRenderPipelineSkybox(int numSamplesMSAA) { if (renderPipelineState_Skybox_) { return; } IGL_DEBUG_ASSERT(fbMain_); RenderPipelineDesc desc; desc.targetDesc.colorAttachments.resize(1); desc.targetDesc.colorAttachments[0].textureFormat = fbMain_->getColorAttachment(0)->getFormat(); if (fbMain_->getDepthAttachment()) { desc.targetDesc.depthAttachmentFormat = fbMain_->getDepthAttachment()->getFormat(); } // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only #if USE_OPENGL_BACKEND std::string vsCode = std::string("#version 460") + kSkyboxVS; stringReplaceAll(vsCode, "gl_VertexIndex", "gl_VertexID"); kSkyboxVS = vsCode.c_str(); std::string fsCode = std::string("#version 460") + kSkyboxFS; kSkyboxFS = fsCode.c_str(); #endif desc.shaderStages = ShaderStagesCreator::fromModuleStringInput(*device_, kSkyboxVS, "main", "Shader Module: skybox (vert)", kSkyboxFS, "main", "Shader Module: skybox (frag)", nullptr); // @fb-only #if USE_OPENGL_BACKEND size_t bindingPoint = 0; desc.uniformBlockBindingMap[bindingPoint++].emplace_back( std::make_pair(IGL_NAMEHANDLE("SkyboxFrameUniforms"), igl::NameHandle{})); #endif desc.cullMode = igl::CullMode::Front; desc.frontFaceWinding = igl::WindingMode::CounterClockwise; desc.sampleCount = numSamplesMSAA; desc.debugName = IGL_NAMEHANDLE("Pipeline: skybox"); #if USE_OPENGL_BACKEND desc.fragmentUnitSamplerMap[1] = IGL_NAMEHANDLE("texSkybox"); #endif renderPipelineState_Skybox_ = device_->createRenderPipeline(desc, nullptr); } std::shared_ptr getNativeDrawable() { IGL_PROFILER_FUNCTION(); Result ret; std::shared_ptr drawable; #if USE_OPENGL_BACKEND #if IGL_PLATFORM_WINDOWS const auto& platformDevice = device_->getPlatformDevice(); IGL_DEBUG_ASSERT(platformDevice != nullptr); drawable = platformDevice->createTextureFromNativeDrawable(&ret); #elif IGL_PLATFORM_LINUX const auto& platformDevice = device_->getPlatformDevice(); IGL_DEBUG_ASSERT(platformDevice != nullptr); drawable = platformDevice->createTextureFromNativeDrawable(width_, height_, &ret); #endif #else const auto& platformDevice = device_->getPlatformDevice(); IGL_DEBUG_ASSERT(platformDevice != nullptr); drawable = platformDevice->createTextureFromNativeDrawable(&ret); #endif IGL_DEBUG_ASSERT(ret.isOk(), ret.message.c_str()); IGL_DEBUG_ASSERT(drawable != nullptr); return drawable; } std::shared_ptr getNativeDepthDrawable() { IGL_PROFILER_FUNCTION(); Result ret; std::shared_ptr drawable; #if USE_OPENGL_BACKEND #if IGL_PLATFORM_WINDOWS const auto& platformDevice = device_->getPlatformDevice(); IGL_DEBUG_ASSERT(platformDevice != nullptr); drawable = platformDevice->createTextureFromNativeDepth(width_, height_, &ret); #elif IGL_PLATFORM_LINUX const auto& platformDevice = device_->getPlatformDevice(); IGL_DEBUG_ASSERT(platformDevice != nullptr); drawable = platformDevice->createTextureFromNativeDepth(width_, height_, &ret); #endif #else const auto& platformDevice = device_->getPlatformDevice(); IGL_DEBUG_ASSERT(platformDevice != nullptr); drawable = platformDevice->createTextureFromNativeDepth(width_, height_, &ret); #endif IGL_DEBUG_ASSERT(ret.isOk(), ret.message.c_str()); IGL_DEBUG_ASSERT(drawable != nullptr); return drawable; } void createFramebuffer(const std::shared_ptr& nativeDrawable) { FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = nativeDrawable; framebufferDesc.depthAttachment.texture = getNativeDepthDrawable(); fbMain_ = device_->createFramebuffer(framebufferDesc, nullptr); IGL_DEBUG_ASSERT(fbMain_); } void createShadowMap() { const uint32_t w = 4096; const uint32_t h = 4096; auto desc = TextureDesc::new2D(igl::TextureFormat::Z_UNorm16, w, h, TextureDesc::TextureUsageBits::Attachment | TextureDesc::TextureUsageBits::Sampled, "Shadow map"); desc.numMipLevels = TextureDesc::calcNumMipLevels(w, h); Result ret; const std::shared_ptr shadowMap = device_->createTexture(desc, &ret); IGL_DEBUG_ASSERT(ret.isOk()); FramebufferDesc framebufferDesc; framebufferDesc.depthAttachment.texture = shadowMap; fbShadowMap_ = device_->createFramebuffer(framebufferDesc, nullptr); IGL_DEBUG_ASSERT(fbShadowMap_); } void createOffscreenFramebuffer(int numSamplesMSAA) { const uint32_t w = width_; const uint32_t h = height_; Result ret; auto descDepth = TextureDesc::new2D(igl::TextureFormat::Z_UNorm24, w, h, TextureDesc::TextureUsageBits::Attachment | TextureDesc::TextureUsageBits::Sampled, "Offscreen framebuffer (d)"); descDepth.numMipLevels = TextureDesc::calcNumMipLevels(w, h); if (numSamplesMSAA > 1) { descDepth.usage = TextureDesc::TextureUsageBits::Attachment; descDepth.numSamples = numSamplesMSAA; descDepth.numMipLevels = 1; descDepth.storage = ResourceStorage::Memoryless; } const std::shared_ptr texDepth = device_->createTexture(descDepth, &ret); IGL_DEBUG_ASSERT(ret.isOk()); TextureDesc::TextureUsage usage = TextureDesc::TextureUsageBits::Attachment | TextureDesc::TextureUsageBits::Sampled; const TextureFormat format = igl::TextureFormat::RGBA_UNorm8; #if !USE_OPENGL_BACKEND usage |= TextureDesc::TextureUsageBits::Storage; // compute shader postprocessing #endif auto descColor = TextureDesc::new2D(format, w, h, usage, "Offscreen framebuffer (c)"); descColor.numMipLevels = TextureDesc::calcNumMipLevels(w, h); if (numSamplesMSAA > 1) { descColor.usage = TextureDesc::TextureUsageBits::Attachment; descColor.numSamples = numSamplesMSAA; descColor.numMipLevels = 1; descColor.storage = ResourceStorage::Memoryless; } const std::shared_ptr texColor = device_->createTexture(descColor, &ret); IGL_DEBUG_ASSERT(ret.isOk()); FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = texColor; framebufferDesc.depthAttachment.texture = texDepth; if (numSamplesMSAA > 1) { auto descColorResolve = TextureDesc::new2D(format, w, h, usage, "Offscreen framebuffer (c - resolve)"); descColorResolve.usage = usage; const std::shared_ptr texResolveColor = device_->createTexture(descColorResolve, &ret); IGL_DEBUG_ASSERT(ret.isOk()); framebufferDesc.colorAttachments[0].resolveTexture = texResolveColor; } fbOffscreen_ = device_->createFramebuffer(framebufferDesc, nullptr); IGL_DEBUG_ASSERT(fbOffscreen_); } void render(const std::shared_ptr& nativeDrawable, uint32_t frameIndex, int numSamplesMSAA) { IGL_PROFILER_FUNCTION(); fbMain_->updateDrawable(nativeDrawable); // from igl/shell/renderSessions/Textured3DCubeSession.cpp const float fov = float(45.0f * (M_PI / 180.0f)); const float aspectRatio = (float)width_ / (float)height_; const mat4 shadowProj = glm::perspective(float(60.0f * (M_PI / 180.0f)), 1.0f, 10.0f, 4000.0f); const mat4 shadowView = mat4(vec4(0.772608519f, 0.532385886f, -0.345892131f, 0), vec4(0, 0.544812560f, 0.838557839f, 0), vec4(0.634882748f, -0.647876859f, 0.420926809f, 0), vec4(-58.9244843f, -30.4530792f, -508.410126f, 1.0f)); #if USE_OPENGL_BACKEND const mat4 scaleBias = mat4(0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.5, 0.5, 0.5, 1.0); #else const mat4 scaleBias = mat4(0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.5, 0.5, 0.0, 1.0); #endif perFrame_.proj = glm::perspective(fov, aspectRatio, 0.5f, 500.0f); perFrame_.view = camera.getViewMatrix(); perFrame_.light = scaleBias * shadowProj * shadowView; ubPerFrame_[frameIndex]->upload(&perFrame_, igl::BufferRange(sizeof(perFrame_), 0)); { UniformsPerFrame perFrameShadow; perFrameShadow.proj = shadowProj; perFrameShadow.view = shadowView; ubPerFrameShadow_[frameIndex]->upload(&perFrameShadow, igl::BufferRange(sizeof(perFrameShadow), 0)); } UniformsPerObject perObject; perObject.model = glm::scale(mat4(1.0f), vec3(0.05f)); ubPerObject_[frameIndex]->upload(&perObject, igl::BufferRange(sizeof(perObject), 0)); // Command buffers (1-N per thread): create, submit and forget // Pass 1: shadows if (isShadowMapDirty_) { const std::shared_ptr buffer = commandQueue_->createCommandBuffer(CommandBufferDesc(), nullptr); auto commands = buffer->createRenderCommandEncoder(renderPassShadow_, fbShadowMap_); commands->bindRenderPipelineState(renderPipelineState_Shadow_); commands->pushDebugGroupLabel("Render Shadows", igl::Color(1, 0, 0)); commands->bindDepthStencilState(depthStencilState_); commands->bindVertexBuffer(0, *vb0_); #if USE_OPENGL_BACKEND const auto& glPipelineState = static_cast(renderPipelineState_Shadow_.get()); const int ubPerFrameShadowIdx = glPipelineState->getUniformBlockBindingPoint(IGL_NAMEHANDLE(("ShadowFrameUniforms"))); const int ubPerObjectIdx = glPipelineState->getUniformBlockBindingPoint(IGL_NAMEHANDLE(("ShadowObjectUniforms"))); #else const int ubPerFrameShadowIdx = 0; const int ubPerObjectIdx = 1; #endif commands->bindBuffer(ubPerFrameShadowIdx, ubPerFrameShadow_[frameIndex].get()); commands->bindBuffer(ubPerObjectIdx, ubPerObject_[frameIndex].get()); #if USE_OPENGL_BACKEND int start = 0; for (auto numVertices : shapeVertexCnt_) { commands->draw(numVertices, 1, start); start += numVertices; } #else commands->bindIndexBuffer(*ib0_, igl::IndexFormat::UInt32); commands->drawIndexed(indexData_.size()); #endif commands->popDebugGroupLabel(); commands->endEncoding(); buffer->present(fbShadowMap_->getDepthAttachment()); commandQueue_->submit(*buffer); fbShadowMap_->getDepthAttachment()->generateMipmap(*commandQueue_); isShadowMapDirty_ = false; } // Pass 2: mesh { const std::shared_ptr buffer = commandQueue_->createCommandBuffer(CommandBufferDesc(), nullptr); // This will clear the framebuffer auto commands = buffer->createRenderCommandEncoder(renderPassOffscreen_, fbOffscreen_); // Scene commands->bindRenderPipelineState(renderPipelineState_Mesh_); commands->pushDebugGroupLabel("Render Mesh", igl::Color(1, 0, 0)); commands->bindDepthStencilState(depthStencilState_); commands->bindVertexBuffer(0, *vb0_); #if USE_OPENGL_BACKEND const auto& glPipelineState = static_cast(renderPipelineState_Mesh_.get()); const int ubPerFrameIdx = glPipelineState->getUniformBlockBindingPoint(IGL_NAMEHANDLE(("PerFrame"))); const int ubPerObjectIdx = glPipelineState->getUniformBlockBindingPoint(IGL_NAMEHANDLE(("PerObject"))); const int sbIdx = glPipelineState->getUniformBlockBindingPoint(IGL_NAMEHANDLE(("MeshMaterials"))); #else const int ubPerFrameIdx = 0; const int ubPerObjectIdx = 1; const int sbIdx = 2; #endif commands->bindBuffer(ubPerFrameIdx, ubPerFrame_[frameIndex].get()); commands->bindBuffer(ubPerObjectIdx, ubPerObject_[frameIndex].get()); commands->bindBuffer(sbIdx, sbMaterials_.get()); commands->bindTexture(0, igl::BindTarget::kFragment, fbShadowMap_->getDepthAttachment().get()); commands->bindTexture(4, igl::BindTarget::kFragment, skyboxTextureIrradiance_.get()); commands->bindSamplerState(0, igl::BindTarget::kFragment, samplerShadow.get()); commands->bindSamplerState(1, igl::BindTarget::kFragment, sampler.get()); commands->bindSamplerState(2, igl::BindTarget::kFragment, sampler.get()); commands->bindSamplerState(3, igl::BindTarget::kFragment, sampler.get()); commands->bindSamplerState(4, igl::BindTarget::kFragment, sampler.get()); #if USE_OPENGL_BACKEND commands->bindVertexBuffer(0, *vb0_); int shapeStart = 0; for (auto numVertices : shapeVertexCnt_) { const uint32_t imageIdx = (uint32_t)vertexData_[shapeStart].mtlIndex; const auto ambientTextureReference = strstr(cachedMaterials_[imageIdx].name, "MASTER_Glass_") ? textureDummyWhite_ : textures_[imageIdx].ambient ? textures_[imageIdx].ambient : textureDummyBlack_; const auto diffuseTextureReference = strstr(cachedMaterials_[imageIdx].name, "MASTER_Glass_Clean") ? textureDummyWhite_ : textures_[imageIdx].diffuse ? textures_[imageIdx].diffuse : textureDummyBlack_; const auto alphaTextureReference = strstr(cachedMaterials_[imageIdx].name, "MASTER_Glass_") ? textureDummyWhite_ : textures_[imageIdx].alpha ? textures_[imageIdx].alpha : textureDummyBlack_; commands->bindTexture(1, igl::BindTarget::kFragment, ambientTextureReference.get()); commands->bindTexture(2, igl::BindTarget::kFragment, diffuseTextureReference.get()); commands->bindTexture(3, igl::BindTarget::kFragment, alphaTextureReference.get()); commands->draw(numVertices, 1, shapeStart); if (enableWireframe_) { commands->bindRenderPipelineState(renderPipelineState_MeshWireframe_); commands->bindVertexBuffer(0, *vb0_); commands->draw(numVertices, 1, shapeStart); // Bind the non-wireframe pipeline and the vertex buffer commands->bindRenderPipelineState(renderPipelineState_Mesh_); commands->bindVertexBuffer(0, *vb0_); } shapeStart += numVertices; } #else commands->bindTexture(0, igl::BindTarget::kFragment, fbShadowMap_->getDepthAttachment().get()); commands->bindTexture(1, igl::BindTarget::kFragment, skyboxTextureIrradiance_.get()); commands->bindSamplerState(0, igl::BindTarget::kFragment, samplerShadow.get()); commands->bindSamplerState(1, igl::BindTarget::kFragment, sampler.get()); commands->bindIndexBuffer(*ib0_, IndexFormat::UInt32); commands->drawIndexed(indexData_.size()); if (enableWireframe_) { commands->bindRenderPipelineState(renderPipelineState_MeshWireframe_); commands->drawIndexed(indexData_.size()); } #endif commands->popDebugGroupLabel(); // Skybox commands->bindRenderPipelineState(renderPipelineState_Skybox_); commands->bindTexture(1, igl::BindTarget::kFragment, skyboxTextureReference_.get()); commands->bindSamplerState(1, igl::BindTarget::kFragment, sampler.get()); commands->pushDebugGroupLabel("Render Skybox", igl::Color(0, 1, 0)); commands->bindDepthStencilState(depthStencilStateLEqual_); commands->draw(3u * 6u * 2u); commands->popDebugGroupLabel(); commands->endEncoding(); #if !USE_OPENGL_BACKEND buffer->present(fbOffscreen_->getColorAttachment(0)); #endif commandQueue_->submit(*buffer); #if USE_OPENGL_BACKEND if (kNumSamplesMSAA == 1) { fbOffscreen_->getColorAttachment(0)->generateMipmap(*commandQueue_.get()); } #endif } // Pass 3: compute shader post-processing if (enableComputePass_) { const std::shared_ptr buffer = commandQueue_->createCommandBuffer( CommandBufferDesc{.debugName = "computeBuffer"}, nullptr); auto commands = buffer->createComputeCommandEncoder(); commands->bindComputePipelineState(computePipelineState_Grayscale_); ITexture* tex = numSamplesMSAA > 1 ? fbOffscreen_->getResolveColorAttachment(0).get() : fbOffscreen_->getColorAttachment(0).get(); #if !USE_OPENGL_BACKEND const uint32_t textureId = tex->getTextureId(); commands->bindPushConstants(&textureId, sizeof(textureId)); #endif commands->bindTexture(0, tex); commands->dispatchThreadGroups(igl::Dimensions(width_, height_, 1), igl::Dimensions()); commands->endEncoding(); commandQueue_->submit(*buffer); } // Pass 4: render into the swapchain image { const std::shared_ptr buffer = commandQueue_->createCommandBuffer(CommandBufferDesc(), nullptr); // This will clear the framebuffer auto commands = buffer->createRenderCommandEncoder(renderPassMain_, fbMain_); commands->bindRenderPipelineState(renderPipelineState_Fullscreen_); commands->pushDebugGroupLabel("Swapchain Output", igl::Color(1, 0, 0)); commands->bindTexture(0, igl::BindTarget::kFragment, numSamplesMSAA > 1 ? fbOffscreen_->getResolveColorAttachment(0).get() : fbOffscreen_->getColorAttachment(0).get()); commands->bindSamplerState(0, igl::BindTarget::kFragment, sampler.get()); commands->draw(3); commands->popDebugGroupLabel(); #if IGL_WITH_IGLU imguiSession->endFrame(*device_, *commands); #endif // IGL_WITH_IGLU commands->endEncoding(); buffer->present(fbMain_->getColorAttachment(0)); commandQueue_->submit(*buffer); } #if !USE_OPENGL_BACKEND fbMain_->getDepthAttachment()->generateMipmap(*commandQueue_); #endif } void generateCompressedTexture(const LoadedImage& img) { if (loaderShouldExit_.load(std::memory_order_acquire)) { return; } printf("...compressing texture to %s\n", img.compressedFileName.c_str()); const auto numMipLevels = TextureDesc::calcNumMipLevels(img.w, img.h); // Go over all generated mipmap and create a compressed texture // Create ktx2 texture hard coded and support only BC7 format ktxTextureCreateInfo createInfo = { .vkFormat = VK_FORMAT_BC7_UNORM_BLOCK, .baseWidth = static_cast(img.w), .baseHeight = static_cast(img.h), .baseDepth = 1u, .numDimensions = 2u, .numLevels = numMipLevels, .numLayers = 1u, .numFaces = 1u, .generateMipmaps = KTX_FALSE, // Mipmaps are explicitly provided }; ktxTexture2* texture = nullptr; auto error = ktxTexture2_Create(&createInfo, KTX_TEXTURE_CREATE_ALLOC_STORAGE, &texture); IGL_DEBUG_ASSERT(error == KTX_SUCCESS); IGL_SCOPE_EXIT { ktxTexture_Destroy(ktxTexture(texture)); }; uint32_t w = img.w; uint32_t h = img.h; for (uint32_t i = 0; i < numMipLevels; ++i) { std::vector destPixels(w * h * img.channels); // resize stbir_resize_uint8((const unsigned char*)img.pixels, (int)img.w, (int)img.h, 0, (unsigned char*)destPixels.data(), w, h, 0, (int)img.channels); // compress auto packedImage16 = Compress::getCompressedImage( destPixels.data(), w, h, img.channels, false, &loaderShouldExit_); ktxTexture_SetImageFromMemory(ktxTexture(texture), i, 0, 0, reinterpret_cast(packedImage16.data()), sizeof(block16) * packedImage16.size()); h = h > 1 ? h >> 1 : 1; w = w > 1 ? w >> 1 : 1; if (loaderShouldExit_.load(std::memory_order_acquire)) { return; } } ktxTexture_WriteToNamedFile(ktxTexture(texture), img.compressedFileName.c_str()); } LoadedImage loadImage(const char* fileName, int channels) { if (!fileName || !*fileName) { return {}; } const std::string debugName = IGL_FORMAT("{} ({})", fileName, channels).c_str(); { const std::lock_guard lock(imagesCacheMutex_); const auto it = imagesCache_.find(debugName); if (it != imagesCache_.end()) { IGL_DEBUG_ASSERT(channels == it->second.channels); return it->second; } } LoadedImage img; img.compressedFileName = convertFileName(fileName); img.pixels = stbi_load(fileName, &img.w, &img.h, nullptr, channels); img.channels = channels; img.debugName = debugName; if ((img.pixels != nullptr) && kEnableCompression && (channels != 1) && !std::filesystem::exists(img.compressedFileName.c_str())) { generateCompressedTexture(img); } const std::lock_guard lock(imagesCacheMutex_); imagesCache_[fileName] = img; return img; } void loadMaterial(size_t i) { static const std::string pathPrefix = contentRootFolder + "src/bistro/Exterior/"; IGL_SCOPE_EXIT { remainingMaterialsToLoad_.fetch_sub(1u, std::memory_order_release); }; #define LOAD_TEX(result, tex, channels) \ std::string tmp##result = cachedMaterials_[i].tex; \ std::replace(tmp##result.begin(), tmp##result.end(), '\\', '/'); \ const LoadedImage result = std::string(cachedMaterials_[i].tex).empty() \ ? LoadedImage() \ : loadImage((pathPrefix + tmp##result).c_str(), channels); \ if (loaderShouldExit_.load(std::memory_order_acquire)) { \ return; \ } LOAD_TEX(ambient, ambient_texname, 4); LOAD_TEX(diffuse, diffuse_texname, 4); LOAD_TEX(alpha, alpha_texname, 1); #undef LOAD_TEX const LoadedMaterial mtl{.idx = i, .ambient = ambient, .diffuse = diffuse, .alpha = alpha}; if (!mtl.ambient.pixels && !mtl.diffuse.pixels) { // skip missing textures materials_[i].texDiffuse = 0; } else { const std::lock_guard guard(loadedMaterialsMutex_); loadedMaterials_.push_back(mtl); remainingMaterialsToLoad_.fetch_add(1u, std::memory_order_release); } } void loadMaterials(bool isHeadless) { stbi_set_flip_vertically_on_load(1); textures_.resize(cachedMaterials_.size()); remainingMaterialsToLoad_ = (uint32_t)cachedMaterials_.size(); for (size_t i = 0; i != cachedMaterials_.size(); i++) { loaderPool_->silent_async([i]() { loadMaterial(i); }); } } void loadCubemapTexture(const std::string& fileNameKTX, std::shared_ptr& tex) { if (!std::filesystem::exists(fileNameKTX)) { return; } #if USE_TEXTURE_LOADER loadKtxTexture(*device_, *commandQueue_, fileNameKTX, tex, !kEnableCompression); #else ktxTexture2* texture = nullptr; auto error = ktxTexture2_CreateFromNamedFile( fileNameKTX.c_str(), KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT, &texture); IGL_DEBUG_ASSERT(error == KTX_SUCCESS); IGL_SCOPE_EXIT { ktxTexture_Destroy(ktxTexture(texture)); }; if (!IGL_DEBUG_VERIFY(texture->vkFormat == VK_FORMAT_R32G32B32A32_SFLOAT)) { IGL_DEBUG_ABORT("Texture format not supported"); return; } auto texRefRange = TextureRangeDesc::new2D( 0, 0, static_cast(texture->baseWidth), static_cast(texture->baseHeight)); // If compression is enabled, upload all mip levels if (kEnableCompression) { texRefRange.numMipLevels = TextureDesc::calcNumMipLevels(texRefRange.width, texRefRange.height); } auto desc = TextureDesc::newCube(igl::vulkan::util::vkTextureFormatToTextureFormat(texture->vkFormat), texRefRange.width, texRefRange.height, TextureDesc::TextureUsageBits::Sampled, fileNameKTX.c_str()); desc.numMipLevels = texRefRange.numMipLevels; tex = device_->createTexture(desc, nullptr); IGL_DEBUG_ASSERT(tex); for (uint8_t face = 0; face < 6; ++face) { for (size_t i = 0; i < desc.numMipLevels; ++i) { size_t offset = 0; error = ktxTexture_GetImageOffset(ktxTexture(texture), i, 0, face, &offset); IGL_DEBUG_ASSERT(error == KTX_SUCCESS); tex->upload(tex->getCubeFaceRange(face, i), texture->pData + offset); } } if (!kEnableCompression) { tex->generateMipmap(*commandQueue_); } #endif // IGL_WITH_IGLU } ktxTexture2* bitmapToCube(Bitmap& bmp) { IGL_DEBUG_ASSERT(bmp.comp_ == 3); // RGB IGL_DEBUG_ASSERT(bmp.type_ == eBitmapType_Cube); IGL_DEBUG_ASSERT(bmp.fmt_ == eBitmapFormat_Float); const int w = bmp.w_; const int h = bmp.h_; const auto numMipLevels = TextureDesc::calcNumMipLevels(w, h); // Create ktx2 texture // hard coded and support only BC7 format ktxTextureCreateInfo createInfo = { .vkFormat = VK_FORMAT_R32G32B32A32_SFLOAT, .baseWidth = static_cast(w), .baseHeight = static_cast(h), .baseDepth = 1u, .numDimensions = 2u, .numLevels = numMipLevels, .numLayers = 1u, .numFaces = 6u, .generateMipmaps = KTX_FALSE, // Mipmaps are explicitly provided }; ktxTexture2* texture = nullptr; auto error = ktxTexture2_Create(&createInfo, KTX_TEXTURE_CREATE_ALLOC_STORAGE, &texture); IGL_DEBUG_ASSERT(error == KTX_SUCCESS); const size_t numFacePixels = static_cast(w) * static_cast(h); const std::unique_ptr facePixels = std::make_unique(numFacePixels * static_cast(4)); for (size_t face = 0; face != 6; face++) { float* dst = facePixels.get(); const vec3* src = reinterpret_cast(bmp.data_.data()) + face * numFacePixels; for (int y = 0; y != h; y++) { for (int x = 0; x != w; x++) { const vec3& rgb = src[x + y * w]; *dst++ = rgb.x; *dst++ = rgb.y; *dst++ = rgb.z; *dst++ = 0.0f; } } ktxTexture_SetImageFromMemory(ktxTexture(texture), 0, 0, face, reinterpret_cast(facePixels.get()), sizeof(float) * numFacePixels * static_cast(4)); } return texture; } void generateMipmaps(const std::string& outFilename, ktxTexture2* cubemap) { IGL_LOG_INFO("Generating mipmaps"); const std::unique_ptr buffer = std::make_unique(static_cast(cubemap->baseWidth) * static_cast(cubemap->baseHeight) * static_cast(4)); auto prevWidth = cubemap->baseWidth; auto prevHeight = cubemap->baseHeight; for (size_t face = 0; face < 6; ++face) { IGL_LOG_INFO("."); for (size_t miplevel = 1; miplevel < cubemap->numLevels; ++miplevel) { IGL_LOG_INFO(":"); const auto width = prevWidth > 1 ? prevWidth >> 1 : 1; const auto height = prevHeight > 1 ? prevWidth >> 1 : 1; size_t prevOffset = 0; auto error = ktxTexture_GetImageOffset(ktxTexture(cubemap), miplevel - 1, 0, face, &prevOffset); IGL_DEBUG_ASSERT(error == KTX_SUCCESS); stbir_resize_float(reinterpret_cast(cubemap->pData + prevOffset), prevWidth, prevHeight, 0, buffer.get(), width, height, 0, 4); ktxTexture_SetImageFromMemory(ktxTexture(cubemap), miplevel, 0, face, reinterpret_cast(buffer.get()), sizeof(float) * width * height * 4); prevWidth = width; prevHeight = height; } prevWidth = cubemap->baseWidth; prevHeight = cubemap->baseHeight; } IGL_LOG_INFO("\n"); ktxTexture_WriteToNamedFile(ktxTexture(cubemap), outFilename.c_str()); } void processCubemap(const std::string& inFilename, const std::string& outFilenameEnv, const std::string& outFilenameIrr) { int sourceWidth = 0, sourceHeight = 0; float* pxs = stbi_loadf(inFilename.c_str(), &sourceWidth, &sourceHeight, nullptr, 3); IGL_SCOPE_EXIT { if (pxs) { stbi_image_free(pxs); } }; if (!IGL_DEBUG_VERIFY(pxs != nullptr)) { IGL_DEBUG_ABORT("Did you read the tutorial at the top of Tiny_MeshLarge.cpp?"); return; } // Environment map { Bitmap bmp = convertEquirectangularMapToCubeMapFaces( Bitmap(sourceWidth, sourceHeight, 3, eBitmapFormat_Float, pxs)); ktxTexture2* cube = bitmapToCube(bmp); generateMipmaps(outFilenameEnv, cube); } // Irradiance map { constexpr int dstW = 256; constexpr int dstH = 128; std::vector out(dstW * dstH); convolveDiffuse((vec3*)pxs, sourceWidth, sourceHeight, dstW, dstH, out.data(), 1024); Bitmap bmp = convertEquirectangularMapToCubeMapFaces( Bitmap(dstW, dstH, 3, eBitmapFormat_Float, out.data())); ktxTexture2* cube = bitmapToCube(bmp); generateMipmaps(outFilenameIrr, cube); IGL_SCOPE_EXIT { ktxTexture_Destroy(ktxTexture(cube)); }; } } void loadSkyboxTexture() { static const std::string skyboxFileName{"immenstadter_horn_2k"}; static const std::string skyboxSubdir{"src/skybox_hdr/"}; static const std::string fileNameRefKTX = contentRootFolder + skyboxFileName + "_ReferenceMap.ktx2"; static const std::string fileNameIrrKTX = contentRootFolder + skyboxFileName + "_IrradianceMap.ktx2"; if (!std::filesystem::exists(fileNameRefKTX) || !std::filesystem::exists(fileNameIrrKTX)) { IGL_LOG_INFO("Cubemap in KTX format not found. Extracting from HDR file...\n"); static const std::string inFilename = contentRootFolder + skyboxSubdir + skyboxFileName + ".hdr"; processCubemap(inFilename, fileNameRefKTX, fileNameIrrKTX); } loadCubemapTexture(fileNameRefKTX, skyboxTextureReference_); loadCubemapTexture(fileNameIrrKTX, skyboxTextureIrradiance_); } std::shared_ptr createTexture(const LoadedImage& img) { if (!img.pixels) { return nullptr; } const auto it = texturesCache_.find(img.debugName); if (it != texturesCache_.end()) { return it->second; } igl::TextureFormat fmt = igl::TextureFormat::Invalid; if (img.channels == 1) { fmt = igl::TextureFormat::R_UNorm8; } else if (img.channels == 4) { fmt = kEnableCompression ? igl::TextureFormat::RGBA_BC7_UNORM_4x4 : igl::TextureFormat::RGBA_UNorm8; } TextureDesc desc = TextureDesc::new2D( fmt, img.w, img.h, TextureDesc::TextureUsageBits::Sampled, img.debugName.c_str()); desc.numMipLevels = TextureDesc::calcNumMipLevels(img.w, img.h); auto tex = device_->createTexture(desc, nullptr); if (kEnableCompression && img.channels == 4 && std::filesystem::exists(img.compressedFileName.c_str())) { #if USE_TEXTURE_LOADER loadKtxTexture(*device_, *commandQueue_, img.compressedFileName, tex, false); #else // Uploading the texture const auto rangeDesc = TextureRangeDesc::new2D(0, 0, img.w, img.h, 0, desc.numMipLevels); ktxTexture* texture = nullptr; auto error = ktxTexture_CreateFromNamedFile( img.compressedFileName.c_str(), KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT, &texture); if (IGL_DEBUG_VERIFY_NOT(error != KTX_SUCCESS)) { printf("Failed to load %s\n", img.compressedFileName.c_str()); } IGL_SCOPE_EXIT { ktxTexture_Destroy(ktxTexture(texture)); }; for (size_t i = 0; i < desc.numMipLevels; ++i) { size_t offset = 0; error = ktxTexture_GetImageOffset(ktxTexture(texture), i, 0, 0, &offset); IGL_DEBUG_ASSERT(error == KTX_SUCCESS); tex->upload(rangeDesc.atMipLevel(i), texture->pData + offset); } #endif // USE_TEXTURE_LOADER } else { tex->upload(TextureRangeDesc::new2D(0, 0, img.w, img.h), img.pixels); tex->generateMipmap(*commandQueue_); } texturesCache_[img.debugName] = tex; return tex; } void processLoadedMaterials() { int numLoaded = 0; const int kMaxMaterialsPerFrame = 5; for (; numLoaded < kMaxMaterialsPerFrame; numLoaded++) { LoadedMaterial mtl; { const std::lock_guard guard(loadedMaterialsMutex_); if (loadedMaterials_.empty()) { break; } else { mtl = loadedMaterials_.back(); loadedMaterials_.pop_back(); remainingMaterialsToLoad_.fetch_sub(1u, std::memory_order_release); } } MaterialTextures tex; tex.ambient = createTexture(mtl.ambient); tex.diffuse = createTexture(mtl.diffuse); tex.alpha = createTexture(mtl.alpha); // update GPU materials textures_[mtl.idx] = tex; #if !USE_OPENGL_BACKEND materials_[mtl.idx].texAmbient = tex.ambient ? (uint32_t)tex.ambient->getTextureId() : 0; materials_[mtl.idx].texDiffuse = tex.diffuse ? (uint32_t)tex.diffuse->getTextureId() : 0; materials_[mtl.idx].texAlpha = tex.alpha ? (uint32_t)tex.alpha->getTextureId() : 0; IGL_DEBUG_ASSERT(materials_[mtl.idx].texAmbient >= 0); IGL_DEBUG_ASSERT(materials_[mtl.idx].texDiffuse >= 0); IGL_DEBUG_ASSERT(materials_[mtl.idx].texAlpha >= 0); #endif } if (numLoaded) { sbMaterials_->upload(materials_.data(), BufferRange(sizeof(GPUMaterial) * materials_.size())); } } } // namespace int main(int argc, char* argv[]) { bool isHeadless = false; bool enableVulkanValidationLayers = true; for (int i = 1; i < argc; i++) { if (!strcmp(argv[i], "--headless")) { isHeadless = true; } else if (!strcmp(argv[i], "--disable-vulkan-validation-layers")) { enableVulkanValidationLayers = false; } } #if defined(IGL_USE_STATIC_LAVAPIPE) const int kNumSamplesMSAA = 1; #else const int kNumSamplesMSAA = isHeadless ? 1 : 8; #endif // find the content folder { using namespace std::filesystem; path subdir("third-party/content/"); // @fb-only path dir = current_path(); // find the content somewhere above our current build directory while (dir != current_path().root_path() && !exists(dir / subdir)) { dir = dir.parent_path(); } if (!exists(dir / subdir)) { printf("Cannot find the content directory. Run `deploy_content.py` before running this app."); IGL_DEBUG_ASSERT_NOT_REACHED(); return EXIT_FAILURE; } contentRootFolder = (dir / subdir).string(); } GLFWwindow* window = initIGL(isHeadless, enableVulkanValidationLayers); initModel(kNumSamplesMSAA); if (kEnableCompression) { printf( "Compressing textures... It can take a while in debug builds...(needs to be done once)\n"); } loadSkyboxTexture(); loadMaterials(isHeadless); createFramebuffer(getNativeDrawable()); createShadowMap(); createOffscreenFramebuffer(kNumSamplesMSAA); createRenderPipelines(kNumSamplesMSAA); createRenderPipelineSkybox(kNumSamplesMSAA); createComputePipeline(); #if IGL_WITH_IGLU imguiSession = std::make_unique(*device_, inputDispatcher); #endif // IGL_WITH_IGLU // In headless mode, wait for all textures to be loaded before rendering if (isHeadless) { printf("Waiting for all textures to load...\n"); while (remainingMaterialsToLoad_.load(std::memory_order_acquire) > 0) { processLoadedMaterials(); std::this_thread::sleep_for(std::chrono::milliseconds(10)); } printf("All textures loaded.\n"); } double prevTime = glfwGetTime(); uint32_t frameIndex = 0; // Main loop while (!window || !glfwWindowShouldClose(window)) { { FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = getNativeDrawable(); framebufferDesc.depthAttachment.texture = getNativeDepthDrawable(); #if IGL_WITH_IGLU imguiSession->beginFrame(framebufferDesc, 1.0f); ImGui::SetNextWindowCollapsed(true, ImGuiCond_FirstUseEver); ImGui::ShowDemoWindow(); ImGui::Begin("Keyboard hints:", nullptr, ImGuiWindowFlags_AlwaysAutoResize); ImGui::Text("W/S/A/D - camera movement"); ImGui::Text("1/2 - camera up/down"); ImGui::Text("Shift - fast movement"); ImGui::Text("C - toggle compute shader postprocessing"); ImGui::Text("N - toggle normals"); ImGui::Text("T - toggle wireframe"); ImGui::End(); if (textures_[1].diffuse) { ImGui::Begin("Texture Viewer", nullptr, ImGuiWindowFlags_AlwaysAutoResize); ImGui::Image(ImTextureID(textures_[1].diffuse.get()), ImVec2(256, 256)); ImGui::End(); } if (const uint32_t num = remainingMaterialsToLoad_.load(std::memory_order_acquire)) { ImGui::SetNextWindowPos(ImVec2(0, 0)); ImGui::Begin( "Loading...", nullptr, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoInputs); ImGui::ProgressBar(1.0f - float(num) / cachedMaterials_.size(), ImVec2(ImGui::GetIO().DisplaySize.x, 32)); ImGui::End(); } imguiSession->drawFPS(fps_.getAverageFPS()); #endif // IGL_WITH_IGLU } processLoadedMaterials(); const double newTime = glfwGetTime(); const double delta = newTime - prevTime; fps_.updateFPS(delta); positioner_.update(delta, mousePos_, mousePressed_); prevTime = newTime; #if IGL_WITH_IGLU inputDispatcher.processEvents(); #endif // IGL_WITH_IGLU render(getNativeDrawable(), frameIndex, kNumSamplesMSAA); frameIndex = (frameIndex + 1) % kNumBufferedFrames; if (window) { glfwPollEvents(); } else { printf("We are running headless - breaking after 1 frame\n"); std::shared_ptr texture = fbMain_->getColorAttachment(0); const Dimensions dim = texture->getDimensions(); std::vector pixelsRGBA(dim.width * dim.height * 4); std::vector pixelsRGB(dim.width * dim.height * 3); fbMain_->copyBytesColorAttachment(*commandQueue_, 0, pixelsRGBA.data(), TextureRangeDesc::new2D(0, 0, dim.width, dim.height)); if (texture->getFormat() == igl::TextureFormat::BGRA_UNorm8 || texture->getFormat() == igl::TextureFormat::BGRA_SRGB) { // swap R-B for (uint32_t i = 0; i < pixelsRGBA.size(); i += 4) { std::swap(pixelsRGBA[i + 0], pixelsRGBA[i + 2]); } } // convert to RGB for (uint32_t i = 0; i < pixelsRGB.size() / 3; i++) { pixelsRGB[3 * i + 0] = pixelsRGBA[4 * i + 0]; pixelsRGB[3 * i + 1] = pixelsRGBA[4 * i + 1]; pixelsRGB[3 * i + 2] = pixelsRGBA[4 * i + 2]; } const char* fileName = "TinyMeshLarge.png"; IGLLog(IGLLogInfo, "Writing screenshot to: '%s'\n", fileName); stbi_flip_vertically_on_write(1); stbi_write_png(fileName, (int)dim.width, (int)dim.height, 3, pixelsRGB.data(), 0); break; } } loaderShouldExit_.store(true, std::memory_order_release); #if IGL_WITH_IGLU imguiSession = nullptr; #endif // IGL_WITH_IGLU // destroy all the Vulkan stuff before closing the window vb0_ = nullptr; ib0_ = nullptr; sbMaterials_ = nullptr; ubPerFrame_.clear(); ubPerFrameShadow_.clear(); ubPerObject_.clear(); renderPipelineState_Mesh_ = nullptr; renderPipelineState_MeshWireframe_ = nullptr; renderPipelineState_Shadow_ = nullptr; renderPipelineState_Skybox_ = nullptr; renderPipelineState_Fullscreen_ = nullptr; computePipelineState_Grayscale_ = nullptr; textureDummyWhite_ = nullptr; #if USE_OPENGL_BACKEND textureDummyBlack_ = nullptr; #endif // USE_OPENGL_BACKEND skyboxTextureReference_ = nullptr; skyboxTextureIrradiance_ = nullptr; textures_.clear(); texturesCache_.clear(); sampler = nullptr; samplerShadow = nullptr; fbMain_ = nullptr; fbShadowMap_ = nullptr; fbOffscreen_ = nullptr; device_.reset(nullptr); glfwDestroyWindow(window); glfwTerminate(); printf("Waiting for the loader thread to exit...\n"); loaderPool_ = nullptr; return 0; } ================================================ FILE: samples/ios/snapshot_test_support/IGLBytesToUIImage.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #import #import @class UIImage; NS_ASSUME_NONNULL_BEGIN extern "C" { // NOLINTNEXTLINE(readability-identifier-naming) UIImage* IGLRGBABytesToUIImage(void* bytes, size_t width, size_t height); // NOLINTNEXTLINE(readability-identifier-naming) UIImage* IGLFramebufferToUIImage(const igl::IFramebuffer& framebuffer, igl::ICommandQueue& commandQueue, size_t width, size_t height); } NS_ASSUME_NONNULL_END ================================================ FILE: samples/ios/snapshot_test_support/IGLBytesToUIImage.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #import "IGLBytesToUIImage.h" #import #import #import #import #import #import #import #import #import // NOLINTNEXTLINE(readability-identifier-naming) UIImage* IGLRGBABytesToUIImage(void* bytes, size_t width, size_t height) { auto data = [NSData dataWithBytes:bytes length:width * height * 4]; auto* const colorSpace = CGColorSpaceCreateDeviceRGB(); auto* const provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data); auto* const cgImage = CGImageCreate(width, height, 8, 32, width * 4, colorSpace, kCGImageAlphaLast, provider, nullptr, NO, kCGRenderingIntentDefault); CGColorSpaceRelease(colorSpace); CGDataProviderRelease(provider); const CGRect bounds = CGRectMake(0, 0, width, height); UIGraphicsBeginImageContextWithOptions(bounds.size, NO, 0); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSaveGState(context); CGContextDrawImage(context, bounds, cgImage); CGContextRestoreGState(context); UIImage* snapshot = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); CGImageRelease(cgImage); return snapshot; } // NOLINTNEXTLINE(readability-identifier-naming) UIImage* IGLFramebufferToUIImage(const igl::IFramebuffer& framebuffer, igl::ICommandQueue& commandQueue, size_t width, size_t height) { if (framebuffer.getColorAttachment(0)->getProperties().format != igl::TextureFormat::RGBA_UNorm8) { NSCAssert(false, @"Only BGRA texture format is supported"); return nil; } auto pixels = std::vector(width * height); framebuffer.copyBytesColorAttachment( commandQueue, 0, pixels.data(), igl::TextureRangeDesc::new2D(0, 0, width, height)); return IGLRGBABytesToUIImage(pixels.data(), width, height); } ================================================ FILE: samples/ios/snapshot_test_support/IGLSnapshotTestCase.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #import @interface IGLSnapshotTestCase : FBServerSnapshotTestCase @end ================================================ FILE: samples/ios/snapshot_test_support/IGLSnapshotTestCase.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #import "IGLSnapshotTestCase.h" #import "IGLBytesToUIImage.h" #import "TinyRenderable.hpp" #import #import // IWYU pragma: keep #import #import #import // IWYU pragma: keep #import // IWYU pragma: keep #include #include @implementation IGLSnapshotTestCase { std::shared_ptr _device; std::shared_ptr _commandQueue; std::shared_ptr _framebuffer; igl::BackendType _backendType; std::shared_ptr _renderable; } - (void)setUp { [super setUp]; _renderable = std::make_shared(); _backendType = igl::BackendType::OpenGL; [self initIGL]; } - (void)initIGL { igl::HWDeviceQueryDesc queryDesc(igl::HWDeviceType::DiscreteGpu); if (_backendType == igl::BackendType::Metal) { igl::metal::HWDevice hwDevice; auto hwDevices = hwDevice.queryDevices(queryDesc, nullptr); _device = hwDevice.create(hwDevices[0], nullptr); } else if (_backendType == igl::BackendType::OpenGL) { igl::opengl::ios::HWDevice hwDevice; _device = hwDevice.create(nullptr); } igl::Result result; igl::DeviceScope scope(*_device); igl::CommandQueueDesc desc{}; _commandQueue = _device->createCommandQueue(desc, &result); IGL_DEBUG_ASSERT( result.isOk(), "Simple sample create command queue failed: %s\n", result.message.c_str()); } - (std::shared_ptr)createOrUpdateFramebuffer { IGL_DEBUG_ASSERT(_device->verifyScope()); auto texDesc = igl::TextureDesc::new2D( igl::TextureFormat::RGBA_UNorm8, 720, 1280, igl::TextureDesc::TextureUsageBits::Attachment); std::shared_ptr targetTexture = _device->createTexture(texDesc, nullptr); if (_framebuffer) { _framebuffer->updateDrawable(targetTexture); } else { igl::Result result; igl::FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = targetTexture; _framebuffer = _device->createFramebuffer(framebufferDesc, &result); IGL_DEBUG_ASSERT(result.isOk(), "Could not create framebuffer %s\n", result.message.c_str()); _renderable->initialize(*_device, *_framebuffer); } return targetTexture; } - (void)render { igl::DeviceScope scope(*_device); auto nativeDrawable = [self createOrUpdateFramebuffer]; igl::Result result; igl::CommandBufferDesc cbDesc; auto commandBuffer = _commandQueue->createCommandBuffer(cbDesc, &result); IGL_DEBUG_ASSERT(result.isOk(), "Could not create cmd buffer %s\n", result.message.c_str()); igl::RenderPassDesc renderPass; renderPass.colorAttachments.resize(1); renderPass.colorAttachments[0].loadAction = igl::LoadAction::Clear; renderPass.colorAttachments[0].storeAction = igl::StoreAction::Store; renderPass.colorAttachments[0].clearColor = {1.0, 1.0, 1.0, 1.0}; auto cmds = commandBuffer->createRenderCommandEncoder(renderPass, _framebuffer); IGL_DEBUG_BUFFER_LABEL_START(commandBuffer, "draw renderable"); _renderable->submit(*cmds); IGL_DEBUG_BUFFER_LABEL_END(commandBuffer); cmds->endEncoding(); _commandQueue->submit(*commandBuffer); // Guarantees ordering between command buffers } - (void)testTinySample { [self render]; auto image = IGLFramebufferToUIImage(*_framebuffer, *_commandQueue, 720, 1280); FBRecordSnapshotData([[FBServerSnapshotTestData alloc] initWithSnapshot:image coverageInfo:nil configuration:nil identifier:nil metadata:nil]); } @end ================================================ FILE: samples/ios/snapshot_test_support/TinyRenderable.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "TinyRenderable.hpp" #include #include #include #import #import #import namespace { std::shared_ptr createCheckerboardTexture(igl::IDevice& device) { const size_t kWidth = 4, kHeight = 4; const uint32_t kData[kWidth][kHeight] = { {0xFF000000, 0xFF000000, 0xFFFFFFFF, 0xFFFFFFFF}, {0xFF000000, 0xFF000000, 0xFFFFFFFF, 0xFFFFFFFF}, {0xFFFFFFFF, 0xFFFFFFFF, 0xFF000000, 0xFF000000}, {0xFFFFFFFF, 0xFFFFFFFF, 0xFF000000, 0xFF000000}, }; igl::Result result; const igl::TextureDesc desc = igl::TextureDesc::new2D(igl::TextureFormat::RGBA_UNorm8, kWidth, kHeight, igl::TextureDesc::TextureUsageBits::Sampled); auto texture = device.createTexture(desc, &result); IGL_DEBUG_ASSERT(result.isOk(), "Create texture failed: %s\n", result.message.c_str()); const auto range = igl::TextureRangeDesc::new2D(0, 0, kWidth, kHeight); texture->upload(range, kData); return texture; } const char kMSLShaderSource[] = R"(#include #include #line 0 using namespace metal; struct VertexIn { float3 position [[attribute(0)]]; float2 uv [[attribute(1)]]; }; struct VertexOut { float4 position [[position]]; float2 uv; }; vertex VertexOut vertexShader( uint vid [[vertex_id]], constant VertexIn * vertices [[buffer(0)]]) { VertexOut out; out.position = float4(vertices[vid].position, 1.0); out.uv = vertices[vid].uv; return out; } fragment float4 fragmentShader( VertexOut IN [[stage_in]], texture2d diffuseTex [[texture(0)]]) { constexpr sampler linearSampler( mag_filter::linear, min_filter::linear); return diffuseTex.sample(linearSampler, IN.uv); })"; // const size_t kMSLShaderSourceLen = sizeof(kMSLShaderSource)/sizeof(kMSLShaderSource[0]) - 1; const char kGLSLShaderSourceVertex[] = R"(#line 0 precision highp float; attribute vec3 position; attribute vec2 uv_in; varying vec2 uv; void main() { gl_Position = vec4(position, 1.0); uv = uv_in; })"; // const size_t kGLSLShaderSourceVertexLen = // sizeof(kGLSLShaderSourceVertex)/sizeof(kGLSLShaderSourceVertex[0]) - 1; const char kGLSLShaderSourceFragment[] = R"(#line 0 precision highp float; uniform sampler2D inputImage; varying vec2 uv; void main() { gl_FragColor = texture2D(inputImage, uv); })"; // const size_t kGLSLShaderSourceFragmentLen = // sizeof(kGLSLShaderSourceFragment)/sizeof(kGLSLShaderSourceFragment[0]) - 1; std::unique_ptr getShaderStagesForBackend(igl::IDevice& device) { switch (device.getBackendType()) { case igl::BackendType::Invalid: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; case igl::BackendType::Vulkan: IGL_DEBUG_ABORT("IGLSamples not set up for Vulkan"); return nullptr; case igl::BackendType::Custom: IGL_DEBUG_ABORT("IGLSamples not set up for Custom"); return nullptr; case igl::BackendType::D3D12: IGL_DEBUG_ABORT("IGLSamples not set up for D3D12"); return nullptr; // @fb-only // @fb-only // @fb-only case igl::BackendType::Metal: { igl::Result result; auto stages = igl::ShaderStagesCreator::fromLibraryStringInput( device, kMSLShaderSource, "vertexShader", "fragmentShader", "", &result); IGL_DEBUG_ASSERT(result.isOk(), "Shader stage creation failed: %s\n", result.message.c_str()); return stages; } case igl::BackendType::OpenGL: { igl::Result result; auto stages = igl::ShaderStagesCreator::fromModuleStringInput(device, kGLSLShaderSourceVertex, "main", "", kGLSLShaderSourceFragment, "main", "", &result); IGL_DEBUG_ASSERT(result.isOk(), "Shader stage creation failed: %s\n", result.message.c_str()); return stages; } } IGL_UNREACHABLE_RETURN(nullptr) } const size_t kTextureUnit = 0; } // namespace // ---------------------------------------------------------------------------- namespace iglu::kit { const nlohmann::json& TinyRenderable::getProperties() const { static const nlohmann::json kJ; // = { // "name", "tiny", // {"backends", { // {"opengl", "metal"} // }}, // {"snapshot-test", true}, // }; return kJ; } void TinyRenderable::initialize(igl::IDevice& device, const igl::IFramebuffer& framebuffer) { IGL_DEBUG_ASSERT(device.verifyScope()); igl::Result result; shaderStages_ = getShaderStagesForBackend(device); IGL_DEBUG_ASSERT(shaderStages_ != nullptr); // Vertex buffer struct VertexPosUv { simd::float3 position; // SIMD 128b aligned simd::float2 uv; // SIMD 128b aligned }; const float kMax = 20; const VertexPosUv kVertexData[] = { {.position = {-0.9f, 0.9f, 0.0}, .uv = {0.0, kMax}}, {.position = {0.9f, 0.9f, 0.0}, .uv = {kMax, kMax}}, {.position = {-0.9f, -0.9f, 0.0}, .uv = {0.0, 0.0}}, {.position = {0.9f, -0.9f, 0.0}, .uv = {kMax, 0.0}}, }; const igl::BufferDesc vbDesc = igl::BufferDesc{igl::BufferDesc::BufferTypeBits::Vertex, kVertexData, sizeof(kVertexData)}; vertexBuffer_ = device.createBuffer(vbDesc, &result); IGL_DEBUG_ASSERT(result.isOk(), "create buffer failed: %s\n", result.message.c_str()); // Index buffer const uint16_t kIndexData[] = {0, 1, 2, 1, 3, 2}; auto ibDesc = igl::BufferDesc{igl::BufferDesc::BufferTypeBits::Index, kIndexData, sizeof(kIndexData)}; indexBuffer_ = device.createBuffer(ibDesc, &result); IGL_DEBUG_ASSERT(result.isOk(), "create buffer failed: %s\n", result.message.c_str()); // Vertex input state igl::VertexInputStateDesc inputDesc; inputDesc.numAttributes = 2; inputDesc.attributes[0] = igl::VertexAttribute( 0, igl::VertexAttributeFormat::Float3, offsetof(VertexPosUv, position), "position", 0); inputDesc.attributes[1] = igl::VertexAttribute( 0, igl::VertexAttributeFormat::Float2, offsetof(VertexPosUv, uv), "uv_in", 1); inputDesc.numInputBindings = 1; inputDesc.inputBindings[0].stride = sizeof(VertexPosUv); vertexInput_ = device.createVertexInputState(inputDesc, &result); IGL_DEBUG_ASSERT(result.isOk(), "create vertex state failed: %s\n", result.message.c_str()); // Sampler & Texture igl::SamplerStateDesc samplerDesc; samplerDesc.addressModeU = igl::SamplerAddressMode::Repeat; samplerDesc.addressModeV = igl::SamplerAddressMode::Repeat; samplerDesc.minFilter = samplerDesc.magFilter = igl::SamplerMinMagFilter::Nearest; samplerDesc.magFilter = samplerDesc.magFilter = igl::SamplerMinMagFilter::Nearest; sampler_ = device.createSamplerState(samplerDesc, nullptr); texture_ = createCheckerboardTexture(device); igl::RenderPipelineDesc graphicsDesc; graphicsDesc.vertexInputState = vertexInput_; graphicsDesc.shaderStages = shaderStages_; auto indices = framebuffer.getColorAttachmentIndices(); IGL_DEBUG_ASSERT(!indices.empty()); graphicsDesc.targetDesc.colorAttachments.resize(1); auto textureFormat = framebuffer.getColorAttachment(indices[0])->getProperties().format; graphicsDesc.targetDesc.colorAttachments[0].textureFormat = textureFormat; graphicsDesc.targetDesc.colorAttachments[0].blendEnabled = true; graphicsDesc.targetDesc.colorAttachments[0].rgbBlendOp = igl::BlendOp::Add; graphicsDesc.targetDesc.colorAttachments[0].alphaBlendOp = igl::BlendOp::Add; graphicsDesc.targetDesc.colorAttachments[0].srcRGBBlendFactor = igl::BlendFactor::SrcAlpha; graphicsDesc.targetDesc.colorAttachments[0].srcAlphaBlendFactor = igl::BlendFactor::SrcAlpha; graphicsDesc.targetDesc.colorAttachments[0].dstRGBBlendFactor = igl::BlendFactor::OneMinusSrcAlpha; graphicsDesc.targetDesc.colorAttachments[0].dstAlphaBlendFactor = igl::BlendFactor::OneMinusSrcAlpha; graphicsDesc.fragmentUnitSamplerMap[kTextureUnit] = IGL_NAMEHANDLE("inputImage"); graphicsDesc.cullMode = igl::CullMode::Back; graphicsDesc.frontFaceWinding = igl::WindingMode::Clockwise; pipelineState_ = device.createRenderPipeline(graphicsDesc, &result); IGL_DEBUG_ASSERT(result.isOk(), "create pipeline failed: %s\n", result.message.c_str()); } void TinyRenderable::update(igl::IDevice& device) { // no-op } void TinyRenderable::submit(igl::IRenderCommandEncoder& cmds) { // Draw call 0 // clang-format off cmds.bindVertexBuffer(0, *vertexBuffer_); cmds.bindRenderPipelineState(pipelineState_); cmds.bindTexture(kTextureUnit, igl::BindTarget::kFragment, texture_.get()); cmds.bindSamplerState(kTextureUnit, igl::BindTarget::kFragment, sampler_.get()); cmds.bindIndexBuffer(*indexBuffer_, igl::IndexFormat::UInt16); cmds.drawIndexed(6); // clang-format on } } // namespace iglu::kit ================================================ FILE: samples/ios/snapshot_test_support/TinyRenderable.hpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl { class IRenderPipelineState; class IVertexInputState; class IShaderStages; class IBuffer; class IBuffer; class ITexture; class ISamplerState; } // namespace igl namespace iglu::kit { class TinyRenderable : public IRenderable { public: ~TinyRenderable() override = default; [[nodiscard]] const nlohmann::json& getProperties() const override; void initialize(igl::IDevice& device, const igl::IFramebuffer& framebuffer) override; void update(igl::IDevice& device) override; void submit(igl::IRenderCommandEncoder& cmds) override; private: // PipelineState std::shared_ptr pipelineState_; std::shared_ptr vertexInput_; std::shared_ptr shaderStages_; // Draw data std::shared_ptr vertexBuffer_; std::shared_ptr indexBuffer_; std::shared_ptr texture_; std::shared_ptr sampler_; // std::shared_ptr uniformBuffer_; }; } // namespace iglu::kit ================================================ FILE: samples/wasm/CMakeLists.txt ================================================ # Copyright (c) Meta Platforms, Inc. and affiliates. # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. cmake_minimum_required(VERSION 3.19) set(PROJECT_NAME "IGL Samples") macro(ADD_DEMO app shellHTML) add_executable(${app} "${app}.cpp" "Common.cpp") set(CMAKE_EXECUTABLE_SUFFIX ".html") igl_set_cxxstd(${app} 20) igl_set_folder(${app} ${PROJECT_NAME}) target_link_libraries(${app} PUBLIC IGLLibrary) set_target_properties( ${app} PROPERTIES LINK_FLAGS "-s USE_WEBGL2=1 -s USE_GLFW=3 -s GL_SUPPORT_AUTOMATIC_ENABLE_EXTENSIONS=1 -s GL_EMULATE_GLES_VERSION_STRING_FORMAT=1 -s ALLOW_MEMORY_GROWTH=1 -s SINGLE_FILE=1 -s LLD_REPORT_UNDEFINED --shell-file ${shellHTML}" ) endmacro() add_demo("Tiny_Mesh" "${IGL_ROOT_DIR}/samples/wasm/igl.html") add_demo("Triangle" "${IGL_ROOT_DIR}/samples/wasm/igl.html") ================================================ FILE: samples/wasm/Common.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include "Common.h" #include #include void getRenderingBufferSize(int& width, int& height) { double cssWidth = 0.0; double cssHeight = 0.0; emscripten_get_element_css_size("#canvas", &cssWidth, &cssHeight); double devicePixelRatio = emscripten_get_device_pixel_ratio(); width = cssWidth * devicePixelRatio; height = cssHeight * devicePixelRatio; IGL_DEBUG_ASSERT(width > 0 && height > 0, "zero or negative size"); } ================================================ FILE: samples/wasm/Common.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once void getRenderingBufferSize(int& width, int& height); ================================================ FILE: samples/wasm/Tiny_Mesh.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace igl; using glm::mat4; using glm::vec2; using glm::vec3; using glm::vec4; constexpr uint32_t kNumCubes = 16; constexpr uint32_t kNumBufferedFrames = 3; constexpr const char* codeVS = R"(#version 300 es precision mediump float; layout (location=0) in vec3 pos; layout (location=1) in vec3 col; layout (location=2) in vec2 st; out vec3 color; out vec2 uv; layout(std140) uniform perFrame { mat4 proj; mat4 view; }; layout(std140) uniform perObject { mat4 model; }; void main() { mat4 proj = proj; mat4 view = view; mat4 model = model; gl_Position = proj * view * model * vec4(pos, 1.0); color = col; uv = st; } )"; constexpr const char* codeFS = R"(#version 300 es precision mediump float; in vec3 color; in vec2 uv; out vec4 out_FragColor; uniform sampler2D texture0; uniform sampler2D texture1; void main() { vec4 t0 = texture(texture0, 2.0*uv); vec4 t1 = texture(texture1, uv); out_FragColor = vec4(color * (t0.rgb + t1.rgb), 1.0); } )"; vec3 axis_[kNumCubes]; std::shared_ptr device_; const char* canvas = "#canvas"; int width_ = 1024; int height_ = 768; igl::FPSCounter fps_; std::shared_ptr framebuffer_; std::shared_ptr commandQueue_; RenderPassDesc renderPass_; FramebufferDesc framebufferDesc_; std::shared_ptr renderPipelineState_Mesh_; std::shared_ptr vb0_, ib0_; std::vector> ubPerFrame_, ubPerObject_; std::shared_ptr vertexInput0_; std::shared_ptr depthStencilState_; std::shared_ptr texture0_, texture1_; std::shared_ptr sampler_; struct VertexPosUvw { vec3 position; vec3 color; vec2 uv; }; struct UniformsPerFrame { mat4 proj; mat4 view; }; struct alignas(256) UniformsPerObject { mat4 model; }; const float half = 1.0f; // UV-mapped cube with indices: 24 vertices, 36 indices static VertexPosUvw vertexData0[] = { // top {{-half, -half, +half}, {0.0, 0.0, 1.0}, {0, 0}}, // 0 {{+half, -half, +half}, {1.0, 0.0, 1.0}, {1, 0}}, // 1 {{+half, +half, +half}, {1.0, 1.0, 1.0}, {1, 1}}, // 2 {{-half, +half, +half}, {0.0, 1.0, 1.0}, {0, 1}}, // 3 // bottom {{-half, -half, -half}, {1.0, 1.0, 1.0}, {0, 0}}, // 4 {{-half, +half, -half}, {0.0, 1.0, 0.0}, {0, 1}}, // 5 {{+half, +half, -half}, {1.0, 1.0, 0.0}, {1, 1}}, // 6 {{+half, -half, -half}, {1.0, 0.0, 0.0}, {1, 0}}, // 7 // left {{+half, +half, -half}, {1.0, 1.0, 0.0}, {1, 0}}, // 8 {{-half, +half, -half}, {0.0, 1.0, 0.0}, {0, 0}}, // 9 {{-half, +half, +half}, {0.0, 1.0, 1.0}, {0, 1}}, // 10 {{+half, +half, +half}, {1.0, 1.0, 1.0}, {1, 1}}, // 11 // right {{-half, -half, -half}, {1.0, 1.0, 1.0}, {0, 0}}, // 12 {{+half, -half, -half}, {1.0, 0.0, 0.0}, {1, 0}}, // 13 {{+half, -half, +half}, {1.0, 0.0, 1.0}, {1, 1}}, // 14 {{-half, -half, +half}, {0.0, 0.0, 1.0}, {0, 1}}, // 15 // front {{+half, -half, -half}, {1.0, 0.0, 0.0}, {0, 0}}, // 16 {{+half, +half, -half}, {1.0, 1.0, 0.0}, {1, 0}}, // 17 {{+half, +half, +half}, {1.0, 1.0, 1.0}, {1, 1}}, // 18 {{+half, -half, +half}, {1.0, 0.0, 1.0}, {0, 1}}, // 19 // back {{-half, +half, -half}, {0.0, 1.0, 0.0}, {1, 0}}, // 20 {{-half, -half, -half}, {1.0, 1.0, 1.0}, {0, 0}}, // 21 {{-half, -half, +half}, {0.0, 0.0, 1.0}, {0, 1}}, // 22 {{-half, +half, +half}, {0.0, 1.0, 1.0}, {1, 1}}, // 23 }; static uint16_t indexData[] = {0, 1, 2, 2, 3, 0, 4, 5, 6, 6, 7, 4, 8, 9, 10, 10, 11, 8, 12, 13, 14, 14, 15, 12, 16, 17, 18, 18, 19, 16, 20, 21, 22, 22, 23, 20}; UniformsPerFrame perFrame; UniformsPerObject perObject[kNumCubes]; static std::shared_ptr getNativeDrawable() { Result ret; auto platformDevice = static_cast(device_.get()) ->getPlatformDevice(); IGL_DEBUG_ASSERT(platformDevice != nullptr); getRenderingBufferSize(width_, height_); std::shared_ptr drawable = platformDevice->createTextureFromNativeDrawable(width_, height_, &ret); IGL_DEBUG_ASSERT(ret.isOk(), ret.message.c_str()); IGL_DEBUG_ASSERT(drawable != nullptr); return drawable; } static void createFramebuffer(const std::shared_ptr& nativeDrawable) { FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = nativeDrawable; framebuffer_ = device_->createFramebuffer(framebufferDesc, nullptr); IGL_DEBUG_ASSERT(framebuffer_); } bool initialize() { EmscriptenWebGLContextAttributes attrs; emscripten_webgl_init_context_attributes(&attrs); attrs.majorVersion = 3; attrs.minorVersion = 0; attrs.premultipliedAlpha = false; attrs.alpha = false; attrs.powerPreference = EM_WEBGL_POWER_PREFERENCE_DEFAULT; device_ = std::make_unique( std::make_unique<::igl::opengl::webgl::Context>(attrs, canvas)); auto platformDevice = static_cast(device_.get()) ->getPlatformDevice(); getRenderingBufferSize(width_, height_); igl::TextureDesc depthDesc = igl::TextureDesc::new2D(igl::TextureFormat::Z_UNorm24, width_, height_, 0); depthDesc.usage = igl::TextureDesc::TextureUsageBits::Attachment; depthDesc.storage = igl::ResourceStorage::Private; auto depthTexture = device_->createTexture(depthDesc, nullptr); createFramebuffer(getNativeDrawable()); renderPass_.colorAttachments.resize(1); renderPass_.colorAttachments[0] = igl::RenderPassDesc::ColorAttachmentDesc{}; renderPass_.colorAttachments[0].loadAction = LoadAction::Clear; renderPass_.colorAttachments[0].storeAction = StoreAction::Store; renderPass_.colorAttachments[0].clearColor = {1.0f, 0.0f, 1.0f, 1.0f}; renderPass_.depthAttachment.clearDepth = 1.0; renderPass_.depthAttachment.loadAction = LoadAction::DontCare; CommandQueueDesc desc{}; commandQueue_ = device_->createCommandQueue(desc, nullptr); // Vertex buffer, Index buffer and Vertex Input. Buffers are allocated in GPU memory. vb0_ = device_->createBuffer(BufferDesc{BufferDesc::BufferTypeBits::Vertex, vertexData0, sizeof(vertexData0), ResourceStorage::Private, 0, "Buffer: vertex"}, nullptr); ib0_ = device_->createBuffer(BufferDesc{BufferDesc::BufferTypeBits::Index, indexData, sizeof(indexData), ResourceStorage::Private, 0, "Buffer: index"}, nullptr); // create an Uniform buffers to store uniforms for 2 objects for (uint32_t i = 0; i != kNumBufferedFrames; i++) { ubPerFrame_.push_back( device_->createBuffer(BufferDesc{BufferDesc::BufferTypeBits::Uniform, &perFrame, sizeof(UniformsPerFrame), ResourceStorage::Shared, BufferDesc::BufferAPIHintBits::UniformBlock, "Buffer: uniforms (per frame)"}, nullptr)); ubPerObject_.push_back( device_->createBuffer(BufferDesc{BufferDesc::BufferTypeBits::Uniform, perObject, kNumCubes * sizeof(UniformsPerObject), ResourceStorage::Shared, BufferDesc::BufferAPIHintBits::UniformBlock, "Buffer: uniforms (per object)"}, nullptr)); } { VertexInputStateDesc desc; desc.numAttributes = 3; desc.attributes[0].format = VertexAttributeFormat::Float3; desc.attributes[0].offset = offsetof(VertexPosUvw, position); desc.attributes[0].bufferIndex = 0; desc.attributes[0].name = "pos"; desc.attributes[0].location = 0; desc.attributes[1].format = VertexAttributeFormat::Float3; desc.attributes[1].offset = offsetof(VertexPosUvw, color); desc.attributes[1].bufferIndex = 0; desc.attributes[1].name = "col"; desc.attributes[1].location = 1; desc.attributes[2].format = VertexAttributeFormat::Float2; desc.attributes[2].offset = offsetof(VertexPosUvw, uv); desc.attributes[2].bufferIndex = 0; desc.attributes[2].name = "st"; desc.attributes[2].location = 2; desc.numInputBindings = 1; desc.inputBindings[0].stride = sizeof(VertexPosUvw); vertexInput0_ = device_->createVertexInputState(desc, nullptr); } { DepthStencilStateDesc desc; desc.isDepthWriteEnabled = true; desc.compareFunction = igl::CompareFunction::Less; depthStencilState_ = device_->createDepthStencilState(desc, nullptr); } { const uint32_t texWidth = 256; const uint32_t texHeight = 256; const TextureDesc desc = TextureDesc::new2D(igl::TextureFormat::RGBA_UNorm8, texWidth, texHeight, TextureDesc::TextureUsageBits::Sampled, "XOR pattern 1"); texture0_ = device_->createTexture(desc, nullptr); std::vector pixels(texWidth * texHeight); for (uint32_t y = 0; y != texHeight; y++) { for (uint32_t x = 0; x != texWidth; x++) { // create a XOR pattern 1 pixels[y * texWidth + x] = 0xFF000000 + ((x ^ y) << 16) + ((x ^ y) << 8) + (x ^ y); } } texture0_->upload(TextureRangeDesc::new2D(0, 0, texWidth, texHeight), pixels.data()); } { const uint32_t texWidth = 256; const uint32_t texHeight = 256; const TextureDesc desc = TextureDesc::new2D(igl::TextureFormat::RGBA_UNorm8, texWidth, texHeight, TextureDesc::TextureUsageBits::Sampled, "XOR pattern 2"); texture1_ = device_->createTexture(desc, nullptr); std::vector pixels(texWidth * texHeight); for (uint32_t y = 0; y != texHeight; y++) { for (uint32_t x = 0; x != texWidth; x++) { // create a XOR pattern 2 pixels[y * texWidth + x] = 0x00FF0000 + ((x ^ y) << 16) + ((x ^ y) << 8) + (x ^ y); } } texture1_->upload(TextureRangeDesc::new2D(0, 0, texWidth, texHeight), pixels.data()); } { igl::SamplerStateDesc desc = igl::SamplerStateDesc::newLinear(); desc.addressModeU = igl::SamplerAddressMode::Repeat; desc.addressModeV = igl::SamplerAddressMode::Repeat; desc.debugName = "Sampler: linear"; sampler_ = device_->createSamplerState(desc, nullptr); } // initialize random rotation axes for all cubes for (uint32_t i = 0; i != kNumCubes; i++) { axis_[i] = glm::sphericalRand(1.0f); } return true; } static void createRenderPipeline() { if (renderPipelineState_Mesh_) { return; } IGL_DEBUG_ASSERT(framebuffer_); RenderPipelineDesc desc; desc.targetDesc.colorAttachments.resize(1); desc.targetDesc.colorAttachments[0].textureFormat = framebuffer_->getColorAttachment(0)->getFormat(); if (framebuffer_->getDepthAttachment()) { desc.targetDesc.depthAttachmentFormat = framebuffer_->getDepthAttachment()->getFormat(); } desc.vertexInputState = vertexInput0_; desc.shaderStages = ShaderStagesCreator::fromModuleStringInput( *device_, codeVS, "main", "", codeFS, "main", "", nullptr); desc.frontFaceWinding = igl::WindingMode::Clockwise; desc.debugName = igl::genNameHandle("Pipeline: mesh"); desc.fragmentUnitSamplerMap[0] = IGL_NAMEHANDLE("texture0"); desc.fragmentUnitSamplerMap[1] = IGL_NAMEHANDLE("texture1"); desc.uniformBlockBindingMap[0] = {std::make_pair(IGL_NAMEHANDLE("PerFrame"), igl::NameHandle{})}; desc.uniformBlockBindingMap[1] = {std::make_pair(IGL_NAMEHANDLE("PerObject"), igl::NameHandle{})}; renderPipelineState_Mesh_ = device_->createRenderPipeline(desc, nullptr); } void onDraw(void*) { static uint32_t frameIndex = 0; static float time_ = 0.0f; // from igl/shell/renderSessions/Textured3DCubeSession.cpp const float fov = float(45.0f * (M_PI / 180.0f)); const float aspectRatio = (float)width_ / (float)height_; perFrame.proj = glm::perspectiveLH(fov, aspectRatio, 0.1f, 500.0f); // place a "camera" behind the cubes, the distance depends on the total number of cubes perFrame.view = glm::translate(mat4(1.0f), vec3(0.0f, 0.0f, sqrtf(kNumCubes / 16) * 20.0f * half)); ubPerFrame_[frameIndex]->upload(&perFrame, igl::BufferRange(sizeof(perFrame))); // rotate cubes around random axes for (uint32_t i = 0; i != kNumCubes; i++) { const float direction = powf(-1, (float)(i + 1)); const uint32_t cubesInLine = (uint32_t)sqrt(kNumCubes); const vec3 offset = vec3(-1.5f * sqrt(kNumCubes) + 4.0f * (i % cubesInLine), -1.5f * sqrt(kNumCubes) + 4.0f * (i / cubesInLine), 0); perObject[i].model = glm::rotate(glm::translate(mat4(1.0f), offset), direction * time_, axis_[i]); } ubPerObject_[frameIndex]->upload(&perObject, igl::BufferRange(sizeof(perObject))); // Command buffers (1-N per thread): create, submit and forget CommandBufferDesc cbDesc; std::shared_ptr buffer = commandQueue_->createCommandBuffer(cbDesc, nullptr); const igl::Viewport viewport = {0.0f, 0.0f, (float)width_, (float)height_, 0.0f, +1.0f}; const igl::ScissorRect scissor = {0, 0, (uint32_t)width_, (uint32_t)height_}; // This will clear the framebuffer auto commands = buffer->createRenderCommandEncoder(renderPass_, framebuffer_); commands->bindRenderPipelineState(renderPipelineState_Mesh_); commands->bindViewport(viewport); commands->bindScissorRect(scissor); commands->pushDebugGroupLabel("Render Mesh", igl::Color(1, 0, 0)); commands->bindVertexBuffer(0, *vb0_); commands->bindDepthStencilState(depthStencilState_); commands->bindBuffer(0, ubPerFrame_[frameIndex].get()); commands->bindTexture(0, igl::BindTarget::kFragment, texture0_.get()); commands->bindTexture(1, igl::BindTarget::kFragment, texture1_.get()); commands->bindSamplerState(0, igl::BindTarget::kFragment, sampler_.get()); commands->bindIndexBuffer(*ib0_, IndexFormat::UInt16); // Draw 2 cubes: we use uniform buffer to update matrices for (uint32_t i = 0; i != kNumCubes; i++) { commands->bindBuffer(1, ubPerObject_[frameIndex].get(), i * sizeof(UniformsPerObject)); commands->drawIndexed(3u * 6u * 2u); } commands->popDebugGroupLabel(); commands->endEncoding(); buffer->present(getNativeDrawable()); commandQueue_->submit(*buffer); frameIndex = (frameIndex + 1) % kNumBufferedFrames; time_ += 0.001; } int main(int argc, char* argv[]) { if (initialize()) { createRenderPipeline(); auto context = static_cast(&device_->getContext()); context->setCanvasBufferSize(width_, height_); emscripten_set_main_loop_arg(onDraw, 0, 0, 1); while (1) { onDraw(0); } } return EXIT_FAILURE; // not reached } ================================================ FILE: samples/wasm/Triangle.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #ifndef __EMSCRIPTEN__ #error Unsupported OS #endif #include #define GLFW_INCLUDE_NONE #include #include #include #include #include constexpr const char* codeVS = R"(#version 300 es precision highp float; out vec3 vColor; const vec2 pos[3] = vec2[3]( vec2(-0.6, -0.4), vec2( 0.6, -0.4), vec2( 0.0, 0.6) ); const vec3 col[3] = vec3[3]( vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0), vec3(0.0, 0.0, 1.0) ); void main() { gl_Position = vec4(pos[gl_VertexID], 0.0, 1.0); vColor = col[gl_VertexID]; } )"; constexpr const char* codeFS = R"(#version 300 es precision highp float; in vec3 vColor; layout (location=0) out vec4 oColor; void main() { oColor = vec4(vColor, 1.0); } )"; using namespace igl; GLFWwindow* window_ = nullptr; int width_ = 0; int height_ = 0; std::unique_ptr device_; std::shared_ptr commandQueue_; RenderPassDesc renderPass_; std::shared_ptr framebuffer_; std::shared_ptr renderPipelineState_Triangle_; static bool initWindow(GLFWwindow** outWindow) { if (!glfwInit()) { return false; } glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE); glfwWindowHint(GLFW_VISIBLE, true); glfwWindowHint(GLFW_DOUBLEBUFFER, true); glfwWindowHint(GLFW_SRGB_CAPABLE, true); glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_API); glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); getRenderingBufferSize(width_, height_); GLFWwindow* window = glfwCreateWindow(width_, height_, "WebGL Triangle", nullptr, nullptr); if (!window) { glfwTerminate(); return false; } glfwSetErrorCallback([](int error, const char* description) { printf("GLFW Error (%i): %s\n", error, description); }); glfwSetKeyCallback(window, [](GLFWwindow* window, int key, int, int action, int) { if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) { glfwSetWindowShouldClose(window, GLFW_TRUE); } }); // @lint-ignore CLANGTIDY glfwSetWindowSizeCallback(window, [](GLFWwindow* /*window*/, int width, int height) { printf("Window resized! width=%d, height=%d\n", width, height); }); if (outWindow) { *outWindow = window; } return true; } static void initIGL() { // create a device { auto ctx = std::make_unique("#canvas"); device_ = std::make_unique(std::move(ctx)); IGL_DEBUG_ASSERT(device_); } // Command queue: backed by different types of GPU HW queues CommandQueueDesc desc{}; commandQueue_ = device_->createCommandQueue(desc, nullptr); // Color attachment renderPass_.colorAttachments[0] = igl::RenderPassDesc::ColorAttachmentDesc{}; renderPass_.colorAttachments[0].loadAction = LoadAction::Clear; renderPass_.colorAttachments[0].storeAction = StoreAction::Store; renderPass_.colorAttachments[0].clearColor = {1.0f, 1.0f, 1.0f, 1.0f}; renderPass_.depthAttachment.loadAction = LoadAction::DontCare; } static void createRenderPipeline() { if (renderPipelineState_Triangle_) { return; } IGL_DEBUG_ASSERT(framebuffer_); RenderPipelineDesc desc; desc.targetDesc.colorAttachments.resize(1); // @fb-only if (framebuffer_->getColorAttachment(0)) { desc.targetDesc.colorAttachments[0].textureFormat = framebuffer_->getColorAttachment(0)->getFormat(); } if (framebuffer_->getDepthAttachment()) { desc.targetDesc.depthAttachmentFormat = framebuffer_->getDepthAttachment()->getFormat(); } desc.shaderStages = ShaderStagesCreator::fromModuleStringInput( *device_, codeVS, "main", "", codeFS, "main", "", nullptr); renderPipelineState_Triangle_ = device_->createRenderPipeline(desc, nullptr); IGL_DEBUG_ASSERT(renderPipelineState_Triangle_); } static std::shared_ptr getNativeDrawable() { const auto& platformDevice = device_->getPlatformDevice(); IGL_DEBUG_ASSERT(platformDevice != nullptr); getRenderingBufferSize(width_, height_); Result ret; std::shared_ptr drawable = platformDevice->createTextureFromNativeDrawable(width_, height_, &ret); IGL_DEBUG_ASSERT(ret.isOk(), ret.message.c_str()); IGL_DEBUG_ASSERT(drawable != nullptr); return drawable; } static void createFramebuffer(const std::shared_ptr& nativeDrawable) { FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = nativeDrawable; const TextureDesc desc = TextureDesc::new2D(nativeDrawable->getFormat(), nativeDrawable->getDimensions().width, nativeDrawable->getDimensions().height, TextureDesc::TextureUsageBits::Attachment | TextureDesc::TextureUsageBits::Sampled, framebufferDesc.debugName.c_str()); framebufferDesc.colorAttachments[1].texture = device_->createTexture(desc, nullptr); framebuffer_ = device_->createFramebuffer(framebufferDesc, nullptr); IGL_DEBUG_ASSERT(framebuffer_); } static void render(const std::shared_ptr& nativeDrawable) { const auto size = framebuffer_->getColorAttachment(0)->getSize(); if (size.width != width_ || size.height != height_) { createFramebuffer(nativeDrawable); } else { framebuffer_->updateDrawable(nativeDrawable); } // Command buffers (1-N per thread): create, submit and forget CommandBufferDesc cbDesc; std::shared_ptr buffer = commandQueue_->createCommandBuffer(cbDesc, nullptr); const igl::Viewport viewport = {0.0f, 0.0f, (float)width_, (float)height_, 0.0f, +1.0f}; const igl::ScissorRect scissor = {0, 0, (uint32_t)width_, (uint32_t)height_}; // This will clear the framebuffer auto commands = buffer->createRenderCommandEncoder(renderPass_, framebuffer_); commands->bindRenderPipelineState(renderPipelineState_Triangle_); commands->bindViewport(viewport); commands->bindScissorRect(scissor); commands->pushDebugGroupLabel("Render Triangle", igl::Color(1, 0, 0)); commands->draw(3, 0, 3); commands->popDebugGroupLabel(); commands->endEncoding(); buffer->present(nativeDrawable); commandQueue_->submit(*buffer); } void emscriptenMainLoopCallback() { render(getNativeDrawable()); glfwPollEvents(); } int main(int argc, char* argv[]) { renderPass_.colorAttachments.resize(1); initWindow(&window_); initIGL(); createFramebuffer(getNativeDrawable()); createRenderPipeline(); // Main loop emscripten_set_main_loop(&emscriptenMainLoopCallback, 0, 1); renderPipelineState_Triangle_.reset(); framebuffer_.reset(); commandQueue_.reset(); device_.reset(nullptr); glfwDestroyWindow(window_); glfwTerminate(); return 0; } ================================================ FILE: samples/wasm/igl.html ================================================ IGL WebGL Sample
Loading
{{{ SCRIPT }}} ================================================ FILE: shell/CMakeLists.txt ================================================ # Copyright (c) Meta Platforms, Inc. and affiliates. # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. cmake_minimum_required(VERSION 3.19) set(PROJECT_NAME "Shell") if(WIN32) add_definitions("-DNOMINMAX") add_definitions("-D_USE_MATH_DEFINES=1") endif() file(GLOB SHELL_SHARED_SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} shared/fileLoader/*.cpp shared/imageLoader/*.cpp shared/extension/*.cpp shared/input/*.cpp shared/platform/*.cpp shared/renderSession/*.cpp shared/netservice/*.cpp) if(APPLE) file(GLOB SHELL_FILELOADER_PLATFORM_SRC LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} shared/fileLoader/apple/*.cpp) elseif(ANDROID) file(GLOB SHELL_FILELOADER_PLATFORM_SRC LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} shared/fileLoader/android/*.cpp) elseif(UNIX AND NOT APPLE) file(GLOB SHELL_FILELOADER_PLATFORM_SRC LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} shared/fileLoader/linux/*.cpp) elseif(WIN32) file(GLOB SHELL_FILELOADER_PLATFORM_SRC LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} shared/fileLoader/win/*.cpp) else() set(SHELL_FILELOADER_PLATFORM_SRC) endif() list(APPEND SHELL_SHARED_SRC_FILES ${SHELL_FILELOADER_PLATFORM_SRC}) file(GLOB SHELL_SHARED_HEADER_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} shared/fileLoader/*.h shared/imageLoader/*.h shared/extension/*.h shared/input/*.h shared/platform/*.h shared/renderSession/*.h shared/netservice/*.h) add_library(IGLShellShared ${SHELL_SHARED_SRC_FILES} ${SHELL_SHARED_HEADER_FILES}) target_include_directories(IGLShellShared PUBLIC "${CMAKE_CURRENT_BINARY_DIR}/include_renderSessions") target_include_directories(IGLShellShared PUBLIC "${CMAKE_CURRENT_BINARY_DIR}/include_shared") target_link_libraries(IGLShellShared PUBLIC fmt) target_link_libraries(IGLShellShared PUBLIC IGLLibrary) target_link_libraries(IGLShellShared PUBLIC IGLUimgui) target_link_libraries(IGLShellShared PUBLIC IGLUmanagedUniformBuffer) target_link_libraries(IGLShellShared PUBLIC IGLUsimdtypes) target_link_libraries(IGLShellShared PUBLIC IGLUsimple_renderer) target_link_libraries(IGLShellShared PUBLIC IGLUshaderCross) target_link_libraries(IGLShellShared PUBLIC IGLUtexture_accessor) target_link_libraries(IGLShellShared PUBLIC IGLUtexture_loader) target_link_libraries(IGLShellShared PUBLIC IGLUuniform) target_link_libraries(IGLShellShared PUBLIC IGLstb) igl_set_folder(IGLShellShared "IGL") igl_set_cxxstd(IGLShellShared 20) if(WIN32 OR UNIX AND NOT APPLE AND NOT ANDROID) add_subdirectory(windows) endif() if(APPLE) if(IOS) add_subdirectory(ios) else() add_subdirectory(mac) endif() endif() if(ANDROID) set(android_jni) add_subdirectory(android) endif() if(IGL_WITH_OPENXR) add_subdirectory(openxr) endif() macro(ADD_SHELL_SESSION target libs) set(shell_srcs apps/SessionApp.cpp renderSessions/${target}.cpp renderSessions/${target}.h) add_shell_session_with_srcs(${target} "${shell_srcs}" "${libs}") endmacro() macro(ADD_SHELL_SESSION_OPENXR_SIM target libs) set(shell_srcs apps/SessionApp.cpp renderSessions/${target}.cpp renderSessions/${target}.h) if(WIN32) if(IGL_WITH_VULKAN) set(compile_defs "USE_VULKAN_BACKEND" "XR_USE_PLATFORM_WIN32" "XR_USE_GRAPHICS_API_VULKAN") add_shell_session_backend_openxr_sim(${target} vulkan "${shell_srcs}" "${libs}" "${compile_defs}") endif() if(IGL_WITH_OPENGL) set(compile_defs "USE_OPENGL_BACKEND" "XR_USE_PLATFORM_WIN32" "XR_USE_GRAPHICS_API_OPENGL") add_shell_session_backend_openxr_sim(${target} opengl "${shell_srcs}" "${libs}" "${compile_defs}") endif() if(IGL_WITH_OPENGLES) message(FATAL_ERROR "OpenGL ES for Windows OpenXR is not supported") endif() endif() endmacro() if(IGL_WITH_SAMPLES) add_shell_session(BasicFramebufferSession "") add_shell_session(BindGroupSession "") add_shell_session(BindlessBufferSession "") add_shell_session(BufferMappingSession "") add_shell_session(CheckerboardMipmapSession "") add_shell_session(ColorSession "") add_shell_session(CopyOperationsSession "") add_shell_session(DepthBiasSession "") add_shell_session(DrawInstancedSession "") add_shell_session(EmptySession "") add_shell_session(FireworksSession "") add_shell_session(GPUStressSession "") add_shell_session(GPUTimerSession "") add_shell_session(HelloWorldSession "") add_shell_session(ImguiSession "") add_shell_session(MeshShaderTriangleSession "") add_shell_session(MRTSession "") add_shell_session(MultiDrawIndexedIndirectSession "") add_shell_session(ScissorTestSession "") add_shell_session(StencilOutlineSession "") add_shell_session(Textured3DCubeSession "") add_shell_session(TextureViewSession "") add_shell_session(TinyMeshBindGroupSession "") add_shell_session(TinyMeshSession "") add_shell_session(TQMultiRenderPassSession "") add_shell_session(TQSession "") add_shell_session(WireframeSession "") add_shell_session(YUVColorSession "") if(IGL_WITH_OPENXR) if(ANDROID) add_shell_session(HelloOpenXRSession "") add_shell_session(HandsOpenXRSession "") endif() if(WIN32) add_shell_session_openxr_sim(HelloOpenXRSession "") endif() endif() endif() if(IGL_WITH_OPENXR AND ANDROID) set(IGL_OPENXR_RENDER_SESSION CACHE STRING "Textured3DCubeSession") if(DEFINED ENV{ANDROID_NDK}) cmake_path(SET NDK_PATH $ENV{ANDROID_NDK}) elseif(DEFINED ENV{NDK_ROOT}) cmake_path(SET NDK_PATH $ENV{NDK_ROOT}) else() message(FATAL_ERROR "Android NDK not found, check environment variables ANDROID_NDK and NDK_ROOT") endif() if(IGL_WITH_VULKAN) add_library(openxr-vulkan-Jni SHARED openxr/mobile/XrApp.cpp openxr/mobile/AndroidMain.cpp "${NDK_PATH}/sources/android/native_app_glue/android_native_app_glue.c") target_include_directories(openxr-vulkan-Jni PRIVATE "${NDK_PATH}/sources/android/native_app_glue") target_link_libraries(openxr-vulkan-Jni PRIVATE IGLShellShared IGLShellOpenXR_AndroidVulkan ${IGL_OPENXR_RENDER_SESSION}) target_compile_definitions(openxr-vulkan-Jni PRIVATE "USE_VULKAN_BACKEND" "XR_USE_PLATFORM_ANDROID" "XR_USE_GRAPHICS_API_VULKAN") endif() if(IGL_WITH_OPENGLES) add_library(openxr-gles-Jni SHARED openxr/mobile/XrApp.cpp openxr/mobile/AndroidMain.cpp "${NDK_PATH}/sources/android/native_app_glue/android_native_app_glue.c") target_include_directories(openxr-gles-Jni PRIVATE "${NDK_PATH}/sources/android/native_app_glue") target_link_libraries(openxr-gles-Jni PRIVATE IGLShellShared IGLShellOpenXR_AndroidOpenGLES ${IGL_OPENXR_RENDER_SESSION}) target_compile_definitions(openxr-gles-Jni PRIVATE "USE_OPENGL_BACKEND" "XR_USE_PLATFORM_ANDROID" "XR_USE_GRAPHICS_API_OPENGL_ES") endif() endif() ================================================ FILE: shell/android/CMakeLists.txt ================================================ # Copyright (c) Meta Platforms, Inc. and affiliates. # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. cmake_minimum_required(VERSION 3.19) set(PROJECT_NAME "Android") file(GLOB PLATFORM_SHARED_SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ../shared/imageLoader/android/*.cpp ../shared/imageWriter/android/*.cpp ../shared/imageWriter/stb/*.cpp ../shared/fileLoader/android/*.cpp ../shared/platform/android/*.cpp) file(GLOB PLATFORM_SHARED_HEADER_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ../shared/imageLoader/android/*.h ../shared/imageWriter/android/*.h ../shared/fileLoader/android/*.h ../shared/platform/android/*.h) add_library(IGLShellPlatform ${PLATFORM_SHARED_SRC_FILES} ${PLATFORM_SHARED_HEADER_FILES}) target_link_libraries(IGLShellPlatform PUBLIC IGLLibrary) target_include_directories(IGLShellPlatform PUBLIC "${IGL_ROOT_DIR}/third-party/deps/src") igl_set_folder(IGLShellPlatform "IGL") igl_set_cxxstd(IGLShellPlatform 20) find_library(log-lib log) find_library(android-lib android) function(ADD_SHELL_SESSION_WITH_SRCS target srcs libs) file(GLOB PLATFORM_SHELL_SRC_FILES LIST_DIRECTORIES false ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/jni/*.cpp) add_library(${target} SHARED ${srcs} "${PLATFORM_SHELL_SRC_FILES}") target_compile_definitions(${target} PRIVATE "IGL_SHELL_SESSION=${target}") target_link_libraries(${target} PUBLIC ${libs}) target_link_libraries(${target} PUBLIC IGLShellShared) target_link_libraries(${target} PUBLIC IGLShellPlatform) target_link_libraries(${target} PUBLIC ${log-lib}) target_link_libraries(${target} PUBLIC ${android-lib}) endfunction() ================================================ FILE: shell/android/java/com/facebook/igl/sample/AndroidManifest.xml ================================================ ================================================ FILE: shell/android/java/com/facebook/igl/sample/SampleActivity.java ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only package com.facebook.igl.shell; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.view.Gravity; import android.view.SurfaceView; import android.view.View; import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.TextView; public class SampleActivity extends Activity implements View.OnClickListener { // UI LinearLayout mMainView; LinearLayout mTabBar; FrameLayout mBackendViewFrame; // initialize runtime backend configuration / context private int curConfig = 0; private SampleLib.RenderSessionConfig[] mConfigs; private SurfaceView[] mTabViews; private final int selectedTabColor = Color.BLUE; private final int unSelectedTabColor = Color.GRAY; protected boolean mEnableStencilBuffer = false; @Override protected void onCreate(Bundle icicle) { super.onCreate(icicle); // Keep screen on during benchmark - prevents the activity from going to sleep getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); // configure the mainview mMainView = new LinearLayout(this); mMainView.setOrientation(LinearLayout.VERTICAL); // build tab bar from a horizontal linearlayout mTabBar = new LinearLayout(this); mTabBar.setOrientation(LinearLayout.HORIZONTAL); mTabBar.setGravity(Gravity.CENTER); mTabBar.setPadding(10, 5, 10, 5); // set up tab and cached sample view for different backend types mBackendViewFrame = new FrameLayout(this); mConfigs = SampleLib.getRenderSessionConfigs(); mTabViews = new SurfaceView[mConfigs.length]; for (int i = 0; i < mConfigs.length; i++) { // configure and insert tab TextView item = new TextView(this); item.setId(i); item.setText(mConfigs[i].displayName); item.setPadding(20, 0, 20, 0); item.setOnClickListener(this); mTabBar.addView(item); // initialize sampleView for each backend type SurfaceView backendView = null; if (mConfigs[i].version.flavor == SampleLib.BackendFlavor.Vulkan) { backendView = new VulkanView( getApplication(), mConfigs[i].version, mConfigs[i].swapchainColorTextureFormat, getIntent()); } else if (mConfigs[i].version.flavor == SampleLib.BackendFlavor.OpenGL_ES) { backendView = new SampleView( getApplication(), mConfigs[i].version, mConfigs[i].swapchainColorTextureFormat, mEnableStencilBuffer, getIntent()); ((SampleView) backendView).onPause(); } // set current backend tab as selected if (curConfig == i) { item.setTextColor(selectedTabColor); mBackendViewFrame.addView(backendView); } else { item.setTextColor(unSelectedTabColor); } // cache sampleView in map for reference mTabViews[i] = backendView; } // setup and display the mainview mMainView.addView(mTabBar); mMainView.addView(mBackendViewFrame); setContentView(mMainView); } @Override public void onClick(View view) { int prevConfig = curConfig; for (int i = 0; i < mTabBar.getChildCount(); i++) { TextView item = (TextView) mTabBar.getChildAt(i); // if not the selected tab, reset the tab status and skip if (view.getId() != item.getId()) { item.setTextColor(unSelectedTabColor); continue; } // reset main view if the selected backend is not the current if (prevConfig != i) { if (mConfigs[prevConfig].version.flavor != SampleLib.BackendFlavor.Vulkan) { ((SampleView) mTabViews[prevConfig]).onPause(); } item.setTextColor(selectedTabColor); curConfig = i; mBackendViewFrame.removeAllViews(); SurfaceView surfaceView = mTabViews[curConfig]; mBackendViewFrame.addView(surfaceView); SampleLib.setActiveBackendVersion(mConfigs[curConfig].version); if (mConfigs[curConfig].version.flavor != SampleLib.BackendFlavor.Vulkan) { ((SampleView) mTabViews[curConfig]).onResume(); } } } } @Override protected void onPause() { super.onPause(); if (mConfigs[curConfig].version.flavor != SampleLib.BackendFlavor.Vulkan) { ((SampleView) mTabViews[curConfig]).onPause(); } } @Override protected void onResume() { super.onResume(); if (mConfigs[curConfig].version.flavor != SampleLib.BackendFlavor.Vulkan) { ((SampleView) mTabViews[curConfig]).onResume(); } } } ================================================ FILE: shell/android/java/com/facebook/igl/sample/SampleLib.java ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only package com.facebook.igl.shell; import android.content.Intent; import android.content.res.AssetManager; import android.view.Surface; // Wrapper for our native C++ library, which implements the actual rendering. public class SampleLib { static { System.loadLibrary("sampleJni"); } // Must match igl/Common.h public static enum BackendFlavor { Invalid, OpenGL, OpenGL_ES, Metal, Vulkan, // @fb-only } // Must match igl/DeviceFeatures.h public static class BackendVersion { BackendFlavor flavor; byte majorVersion; byte minorVersion; public BackendVersion(BackendFlavor flavor, byte majorVersion, byte minorVersion) { this.flavor = flavor; this.majorVersion = majorVersion; this.minorVersion = minorVersion; } } public static native RenderSessionConfig[] getRenderSessionConfigs(); public static native void init( BackendVersion backendVersion, int swapchainColorTextureFormat, AssetManager assetManager, Surface surface, Intent intent); public static native void setActiveBackendVersion(BackendVersion backendVersion); public static native void surfaceChanged(Surface surface, int width, int height); public static native boolean render(float displayScale); public static native void touchEvent(boolean isDown, float x, float y, float dx, float dy); public static native void setClearColorValue(float r, float g, float b, float a); public static native boolean isSRGBTextureFormat(int textureFormat); public static native void surfaceDestroyed(Surface surface); public static class RenderSessionConfig { String displayName; BackendVersion version; int swapchainColorTextureFormat; public RenderSessionConfig( String displayName, BackendVersion version, int swapchainColorTextureFormat) { this.displayName = displayName; this.version = version; this.swapchainColorTextureFormat = swapchainColorTextureFormat; } } } ================================================ FILE: shell/android/java/com/facebook/igl/sample/SampleView.java ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only package com.facebook.igl.shell; import android.content.Context; import android.content.Intent; import android.graphics.PixelFormat; import android.opengl.EGL15; import android.opengl.GLSurfaceView; import android.util.Log; import android.view.MotionEvent; import java.util.concurrent.CountDownLatch; import javax.microedition.khronos.egl.EGL10; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.egl.EGLContext; import javax.microedition.khronos.egl.EGLDisplay; import javax.microedition.khronos.egl.EGLSurface; import javax.microedition.khronos.opengles.GL10; /// Simple view that sets up a GLES 2.0 rendering context public class SampleView extends GLSurfaceView { private static String TAG = "SampleView"; private float lastTouchX = 0.0f; private float lastTouchY = 0.0f; private CountDownLatch renderSessionInitLatch = new CountDownLatch(1); private Intent mIntent; public SampleView( Context context, SampleLib.BackendVersion backendVersion, int swapchainColorTextureFormat, boolean enableStencilBuffer, Intent intent) { super(context); init(context, backendVersion, swapchainColorTextureFormat, enableStencilBuffer, intent); } public SampleView( Context context, SampleLib.BackendVersion backendVersion, int swapchainColorTextureFormat, Intent intent) { super(context); init(context, backendVersion, swapchainColorTextureFormat, false, intent); } private void init( Context context, SampleLib.BackendVersion backendVersion, int swapchainColorTextureFormat, boolean enableStencilBuffer, Intent intent) { // Uncomment to attach debugging // android.os.Debug.waitForDebugger(); mIntent = intent; setEGLContextFactory(new ContextFactory(backendVersion)); // Set the view to be transluscent since we provide an alpha channel below. this.getHolder().setFormat(PixelFormat.TRANSLUCENT); setEGLWindowSurfaceFactory( new SurfaceFactory(SampleLib.isSRGBTextureFormat(swapchainColorTextureFormat))); setEGLConfigChooser(new ConfigChooser(backendVersion, enableStencilBuffer)); setRenderer( new Renderer( context, backendVersion, swapchainColorTextureFormat, renderSessionInitLatch, mIntent)); } public boolean isRenderSessionInitialized() { return renderSessionInitLatch.getCount() == 0; } public void awaitRenderSessionInitialization() throws InterruptedException { renderSessionInitLatch.await(); } @Override public void setBackgroundColor(int color) { int A = (color >> 24) & 0xff; int R = (color >> 16) & 0xff; int G = (color >> 8) & 0xff; int B = (color) & 0xff; SampleLib.setClearColorValue(R, G, B, A); } @Override public boolean onTouchEvent(MotionEvent e) { float x = e.getX(); float y = e.getY(); float dx = x - lastTouchX; float dy = y - lastTouchY; lastTouchX = x; lastTouchY = y; switch (e.getAction()) { case MotionEvent.ACTION_DOWN: SampleLib.touchEvent(true, x, y, 0, 0); return true; case MotionEvent.ACTION_MOVE: SampleLib.touchEvent(true, x, y, dx, dy); return true; case MotionEvent.ACTION_UP: SampleLib.touchEvent(false, x, y, 0, 0); return true; } return false; } /// Context factory: handles creating the EGL context for this view with the correct settings. private static class ContextFactory implements GLSurfaceView.EGLContextFactory { private final SampleLib.BackendVersion mBackendVersion; public ContextFactory(SampleLib.BackendVersion version) { mBackendVersion = version; } public EGLContext createContext(EGL10 egl, EGLDisplay display, EGLConfig eglConfig) { final int EGL_CONTEXT_CLIENT_VERSION = 0x3098; int[] attrib_list = { EGL_CONTEXT_CLIENT_VERSION, mBackendVersion.majorVersion, EGL10.EGL_NONE }; EGLContext context = egl.eglCreateContext(display, eglConfig, EGL10.EGL_NO_CONTEXT, attrib_list); checkEglError("Error creating EGL context", egl); return context; } public void destroyContext(EGL10 egl, EGLDisplay display, EGLContext context) { egl.eglDestroyContext(display, context); } } private static void checkEglError(String prompt, EGL10 egl) { int error; while ((error = egl.eglGetError()) != EGL10.EGL_SUCCESS) { Log.e(TAG, String.format("%s: EGL error: 0x%x", prompt, error)); } } private static class SurfaceFactory implements GLSurfaceView.EGLWindowSurfaceFactory { final int EGL_GL_COLORSPACE_KHR = 0x309D; final int EGL_GL_COLORSPACE_SRGB_KHR = 0x3089; final int EGL_GL_COLORSPACE_LINEAR_KHR = 0x308A; private boolean mIsSRGBColorSpace; SurfaceFactory(boolean isSRGB) { mIsSRGBColorSpace = isSRGB; } @Override public EGLSurface createWindowSurface( EGL10 egl10, EGLDisplay eglDisplay, EGLConfig eglConfig, Object nativeWindow) { String eglExtensionString = egl10.eglQueryString(eglDisplay, egl10.EGL_EXTENSIONS); if (!eglExtensionString.contains("EGL_KHR_gl_colorspace")) { return egl10.eglCreateWindowSurface(eglDisplay, eglConfig, nativeWindow, null); } int[] configAttribs = { EGL_GL_COLORSPACE_KHR, (mIsSRGBColorSpace ? EGL_GL_COLORSPACE_SRGB_KHR : EGL_GL_COLORSPACE_LINEAR_KHR), EGL10.EGL_NONE }; return egl10.eglCreateWindowSurface(eglDisplay, eglConfig, nativeWindow, configAttribs); } @Override public void destroySurface(EGL10 egl10, EGLDisplay eglDisplay, EGLSurface eglSurface) { egl10.eglDestroySurface(eglDisplay, eglSurface); } } /// Config chooser: handles specifying the requirements for the EGL config and choosing the // correct one. private static class ConfigChooser implements GLSurfaceView.EGLConfigChooser { private final SampleLib.BackendVersion mBackendVersion; private boolean mEnableStencilBuffer = false; public ConfigChooser(SampleLib.BackendVersion version, boolean enableStencilBuffer) { mBackendVersion = version; mEnableStencilBuffer = enableStencilBuffer; } public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) { final int EGL_OPENGL_ES2_BIT = 4; // Set ourselves a strict configuration: RGBA8888, 16-bit depth buffer, no stencil. final int[] configAttribs = { EGL10.EGL_RED_SIZE, 8, EGL10.EGL_GREEN_SIZE, 8, EGL10.EGL_BLUE_SIZE, 8, EGL10.EGL_ALPHA_SIZE, 8, EGL10.EGL_DEPTH_SIZE, 16, EGL10.EGL_STENCIL_SIZE, mEnableStencilBuffer ? 8 : 0, EGL10.EGL_RENDERABLE_TYPE, (mBackendVersion.majorVersion == (byte) 3) ? EGL15.EGL_OPENGL_ES3_BIT : EGL_OPENGL_ES2_BIT, EGL10.EGL_NONE }; int[] numConfigs = new int[1]; egl.eglChooseConfig(display, configAttribs, null, 0, numConfigs); if (numConfigs[0] <= 0) { throw new IllegalArgumentException("Couldn't find an appropriate EGL config"); } EGLConfig[] configs = new EGLConfig[1]; egl.eglChooseConfig(display, configAttribs, configs, 1, numConfigs); return configs[0]; } } /// Renderer: This class communicates with our JNI library to implement the OpenGL rendering. private static class Renderer implements GLSurfaceView.Renderer { private final Context mContext; private final Intent mIntent; private final SampleLib.BackendVersion mBackendVersion; private final int mSwapchainColorTextureFormat; private CountDownLatch mRenderSessionInitLatch; Renderer( Context context, SampleLib.BackendVersion backendVersion, int swapchainColorTextureFormat, CountDownLatch renderSessionInitLatch, Intent intent) { mContext = context; mIntent = intent; mBackendVersion = backendVersion; mSwapchainColorTextureFormat = swapchainColorTextureFormat; mRenderSessionInitLatch = renderSessionInitLatch; } public void onSurfaceCreated(GL10 gl, EGLConfig config) { SampleLib.init( mBackendVersion, mSwapchainColorTextureFormat, mContext.getAssets(), null, mIntent); // Signal that application has being started. mRenderSessionInitLatch.countDown(); } public void onSurfaceChanged(GL10 gl, int width, int height) { SampleLib.surfaceChanged(null, width, height); } public void onDrawFrame(GL10 gl) { boolean shouldExit = SampleLib.render(mContext.getResources().getDisplayMetrics().density); if (shouldExit) { android.util.Log.i( "igl", "[IGL Benchmark] Java: Benchmark complete, waiting for logs to flush..."); // Give logcat time to flush the final report before killing the process try { Thread.sleep(2000); } catch (InterruptedException e) { // Ignore } android.util.Log.i("igl", "[IGL Benchmark] Java: Exiting process"); System.exit(0); } } } } ================================================ FILE: shell/android/java/com/facebook/igl/sample/VulkanView.java ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only package com.facebook.igl.shell; import android.content.Context; import android.content.Intent; import android.graphics.PixelFormat; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.util.Log; import android.view.Choreographer; import android.view.MotionEvent; import android.view.Surface; import android.view.SurfaceHolder; import android.view.SurfaceView; // Simple view that sets up a Vulkan Render view public class VulkanView extends SurfaceView implements SurfaceHolder.Callback2, Choreographer.FrameCallback { private static String TAG = "VulkanView"; private float lastTouchX = 0.0f; private float lastTouchY = 0.0f; Context mContext; RenderThread mRenderThread; private final SampleLib.BackendVersion mBackendVersion; private final int mSwapchainColorTextureFormat; private Intent mIntent; public VulkanView( Context context, SampleLib.BackendVersion backendVersion, int swapchainColorTextureFormat, Intent intent) { super(context); // Set the view to be translucent since we provide an alpha channel below. this.getHolder().setFormat(PixelFormat.TRANSLUCENT); this.getHolder().addCallback(this); mContext = context; mBackendVersion = backendVersion; mSwapchainColorTextureFormat = swapchainColorTextureFormat; mIntent = intent; } @Override public boolean onTouchEvent(MotionEvent e) { float x = e.getX(); float y = e.getY(); float dx = x - lastTouchX; float dy = y - lastTouchY; lastTouchX = x; lastTouchY = y; switch (e.getAction()) { case MotionEvent.ACTION_DOWN: SampleLib.touchEvent(true, x, y, 0, 0); return true; case MotionEvent.ACTION_MOVE: SampleLib.touchEvent(true, x, y, dx, dy); return true; case MotionEvent.ACTION_UP: SampleLib.touchEvent(false, x, y, 0, 0); return true; } return false; } @Override public void surfaceRedrawNeeded(SurfaceHolder surfaceHolder) {} @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { // Start rendering on the RenderThread mRenderThread = new RenderThread(mContext, surfaceHolder, mBackendVersion, mSwapchainColorTextureFormat); mRenderThread.setName("Vulkan Render Thread"); mRenderThread.start(); mRenderThread.waitUntilReady(); RenderHandler rh = mRenderThread.getHandler(); if (rh != null) { rh.sendSurfaceCreated(); // start the draw events Choreographer.getInstance().postFrameCallback(this); } } @Override public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) { RenderHandler rh = mRenderThread.getHandler(); if (rh != null) { rh.sendSurfaceChanged(format, width, height); } } @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { // Stop render thread RenderHandler rh = mRenderThread.getHandler(); if (rh != null) { rh.sendShutdown(); try { mRenderThread.join(); } catch (InterruptedException ie) { // not expected throw new RuntimeException("join was interrupted", ie); } } mRenderThread = null; // If the callback was posted, remove it. Without this, we could get one more // call on doFrame(). Choreographer.getInstance().removeFrameCallback(this); } /* * Choreographer callback, called near vsync. * * @see android.view.Choreographer.FrameCallback#doFrame(long) */ @Override public void doFrame(long frameTimeNanos) { RenderHandler rh = mRenderThread.getHandler(); if (rh != null) { Choreographer.getInstance().postFrameCallback(this); rh.sendDoFrame(frameTimeNanos); } } // Rendering thread private class RenderThread extends Thread { private Context mContext; private SurfaceHolder mSurfaceHolder; private volatile RenderHandler mHandler; private Object mStartLock = new Object(); private boolean mReady = false; private final SampleLib.BackendVersion mBackendVersion; private final int mSwapchainColorTextureFormat; public RenderThread( Context context, SurfaceHolder surfaceHolder, SampleLib.BackendVersion backendVersion, int swapchainColorTextureformat) { mContext = context; mSurfaceHolder = surfaceHolder; mBackendVersion = backendVersion; mSwapchainColorTextureFormat = swapchainColorTextureformat; } public RenderHandler getHandler() { return mHandler; } @Override public void run() { Looper.prepare(); mHandler = new RenderHandler(this); synchronized (mStartLock) { mReady = true; mStartLock.notify(); // signal waitUntilReady() } Looper.loop(); // surface has been destroyed synchronized (mStartLock) { mReady = false; } Surface surface = mSurfaceHolder.getSurface(); SampleLib.surfaceDestroyed(surface); } public void waitUntilReady() { synchronized (mStartLock) { while (!mReady) { try { mStartLock.wait(); } catch (InterruptedException ie) { /* not expected */ } } } } public void surfaceCreated() { Log.d(TAG, "SurfaceCreated"); Surface surface = mSurfaceHolder.getSurface(); SampleLib.init( mBackendVersion, mSwapchainColorTextureFormat, mContext.getAssets(), surface, mIntent); } public void surfaceChanged(int width, int height) { Surface surface = mSurfaceHolder.getSurface(); SampleLib.surfaceChanged(surface, width, height); } /** draw frame in response to a vsync event. */ private void doFrame(long timeStampNanos) { long diff = System.nanoTime() - timeStampNanos; long max = 16666667l - 2000000; // if we're within 2ms, don't bother if (diff > max) { // too much, drop a frame Log.d( TAG, "diff is " + (diff / 1000000.0) + " ms, max " + (max / 1000000.0) + ", skipping render"); return; } boolean shouldExit = SampleLib.render(mContext.getResources().getDisplayMetrics().density); if (shouldExit) { android.util.Log.i( "igl", "[IGL Benchmark] Java: Benchmark complete, waiting for logs to flush..."); // Give logcat time to flush the final report before killing the process try { Thread.sleep(2000); } catch (InterruptedException e) { // Ignore } android.util.Log.i("igl", "[IGL Benchmark] Java: Exiting process"); System.exit(0); } } private void shutdown() { Log.d(TAG, "shutdown"); Looper.myLooper().quit(); } } /** * Handler for RenderThread. Used for messages sent from the UI thread to the render thread. * *

The object is created on the render thread, and the various "send" methods are called from * the UI thread. */ private static class RenderHandler extends Handler { private static final int MSG_SURFACE_CREATED = 0; private static final int MSG_SURFACE_CHANGED = 1; private static final int MSG_DO_FRAME = 2; private static final int MSG_SHUTDOWN = 3; private RenderThread mRenderThread; public RenderHandler(RenderThread rt) { mRenderThread = rt; } public void sendSurfaceCreated() { sendMessage(obtainMessage(RenderHandler.MSG_SURFACE_CREATED)); } public void sendSurfaceChanged(@SuppressWarnings("unused") int format, int width, int height) { // ignore format sendMessage(obtainMessage(RenderHandler.MSG_SURFACE_CHANGED, width, height)); } public void sendDoFrame(long frameTimeNanos) { sendMessage( obtainMessage( RenderHandler.MSG_DO_FRAME, (int) (frameTimeNanos >> 32), (int) frameTimeNanos)); } public void sendShutdown() { sendMessage(obtainMessage(RenderHandler.MSG_SHUTDOWN)); } @Override // runs on RenderThread public void handleMessage(Message msg) { int what = msg.what; // Log.d(TAG, "RenderHandler [" + this + "]: what=" + what); if (mRenderThread == null) { Log.w(TAG, "RenderHandler.handleMessage: mRenderThread is null"); return; } switch (what) { case MSG_SURFACE_CREATED: mRenderThread.surfaceCreated(); break; case MSG_SURFACE_CHANGED: mRenderThread.surfaceChanged(msg.arg1, msg.arg2); break; case MSG_DO_FRAME: long timestamp = (((long) msg.arg1) << 32) | (((long) msg.arg2) & 0xffffffffL); mRenderThread.doFrame(timestamp); break; case MSG_SHUTDOWN: mRenderThread.shutdown(); break; default: throw new RuntimeException("unknown message " + what); } } } } ================================================ FILE: shell/android/jni/Jni.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include "TinyRenderer.h" #include #include #include #include #include #include namespace igl::samples { namespace { [[maybe_unused]] std::string toString(std::optional backendVersion) { if (!backendVersion) { return "{}"; } std::string str; switch (backendVersion->flavor) { case BackendFlavor::Invalid: str = "Invalid"; break; case BackendFlavor::OpenGL: str = "OpenGL"; break; case BackendFlavor::OpenGL_ES: str = "OpenGL_ES"; break; case BackendFlavor::Metal: str = "Metal"; break; case BackendFlavor::Vulkan: str = "Vulkan"; break; case BackendFlavor::D3D12: str = "D3D12"; break; // @fb-only // @fb-only // @fb-only } str += " " + std::to_string(static_cast(backendVersion->majorVersion)) + " " + std::to_string(static_cast(backendVersion->minorVersion)); return str; } [[maybe_unused]] std::string toString(std::optional rendererIndex) { if (!rendererIndex) { return "{}"; } return std::to_string(*rendererIndex); } std::unique_ptr factory; std::vector> renderers; std::optional activeBackendVersion; constexpr auto* kBackendFlavorClassName = "com/facebook/igl/shell/SampleLib$BackendFlavor"; constexpr auto* kBackendVersionClassName = "com/facebook/igl/shell/SampleLib$BackendVersion"; constexpr auto* kRenderSessionConfigClassName = "com/facebook/igl/shell/SampleLib$RenderSessionConfig"; std::string toTypeSignature(const char* className) { return std::string("L") + className + std::string(";"); } BackendFlavor toBackendFlavor(JNIEnv* env, jobject jbackendVersion) { auto* jclass = env->GetObjectClass(jbackendVersion); auto* jordinal = env->GetMethodID(jclass, "ordinal", "()I"); const auto ordinal = env->CallIntMethod(jbackendVersion, jordinal); return static_cast(static_cast(ordinal)); } jobject toJava(JNIEnv* env, BackendFlavor backendFlavor) { jclass jclass = env->FindClass(kBackendFlavorClassName); const std::string returnType = std::string("()[") + toTypeSignature(kBackendFlavorClassName); jmethodID values = env->GetStaticMethodID(jclass, "values", returnType.c_str()); auto* backendFlavorValues = (jobjectArray)env->CallStaticObjectMethod(jclass, values); jobject backendFlavorValue = env->GetObjectArrayElement(backendFlavorValues, static_cast(backendFlavor)); env->DeleteLocalRef(backendFlavorValues); return backendFlavorValue; } std::optional toBackendVersion(JNIEnv* env, jobject jbackendVersion) { if (!jbackendVersion) { return {}; } auto* jclass = env->GetObjectClass(jbackendVersion); auto* jflavor = env->GetFieldID(jclass, "flavor", toTypeSignature(kBackendFlavorClassName).c_str()); auto* jmajorVersion = env->GetFieldID(jclass, "majorVersion", "B"); auto* jminorVersion = env->GetFieldID(jclass, "minorVersion", "B"); return BackendVersion{ .flavor = toBackendFlavor(env, env->GetObjectField(jbackendVersion, jflavor)), .majorVersion = static_cast(env->GetByteField(jbackendVersion, jmajorVersion)), .minorVersion = static_cast(env->GetByteField(jbackendVersion, jminorVersion))}; } jobject toJava(JNIEnv* env, BackendVersion backendVersion) { jclass jclass = env->FindClass(kBackendVersionClassName); const std::string methodSignature = std::string("(") + toTypeSignature(kBackendFlavorClassName) + "BB)V"; jmethodID constructor = env->GetMethodID(jclass, "", methodSignature.c_str()); jobject jbackendFlavor = toJava(env, backendVersion.flavor); jobject ret = env->NewObject(jclass, constructor, jbackendFlavor, backendVersion.majorVersion, backendVersion.minorVersion); env->DeleteLocalRef(jbackendFlavor); return ret; } jobject toJava(JNIEnv* env, const shell::RenderSessionConfig& config) { jclass jclass = env->FindClass(kRenderSessionConfigClassName); const std::string methodSignature = std::string("(Ljava/lang/String;") + toTypeSignature(kBackendVersionClassName) + "I)V"; jmethodID constructor = env->GetMethodID(jclass, "", methodSignature.c_str()); jstring jdisplayName = env->NewStringUTF(config.displayName.c_str()); jobject jbackendVersion = toJava(env, config.backendVersion); const jint jswapchainColorTextureFormat = static_cast(config.swapchainColorTextureFormat); jobject ret = env->NewObject( jclass, constructor, jdisplayName, jbackendVersion, jswapchainColorTextureFormat); env->DeleteLocalRef(jdisplayName); env->DeleteLocalRef(jbackendVersion); return ret; } jobjectArray toJava(JNIEnv* env, const std::vector& configs) { jobjectArray ret = nullptr; auto* jclass = env->FindClass(kRenderSessionConfigClassName); ret = env->NewObjectArray(configs.size(), jclass, nullptr); for (size_t i = 0; i < configs.size(); ++i) { env->SetObjectArrayElement(ret, i, toJava(env, configs[i])); } return ret; } std::optional findRendererIndex(std::optional backendVersion) { if (!backendVersion) { return {}; } for (size_t i = 0; i < renderers.size(); ++i) { if (renderers[i]->backendVersion() == backendVersion) { return i; } } return {}; } } // namespace extern "C" { JNIEXPORT jobjectArray JNICALL Java_com_facebook_igl_shell_SampleLib_getRenderSessionConfigs(JNIEnv* env, jobject obj); JNIEXPORT void JNICALL Java_com_facebook_igl_shell_SampleLib_init(JNIEnv* env, jobject obj, jobject jbackendVersion, jint jswapchainColorTextureFormat, jobject javaAssetManager, jobject surface, jobject intent); JNIEXPORT void JNICALL Java_com_facebook_igl_shell_SampleLib_setActiveBackendVersion(JNIEnv* env, jobject obj, jobject jbackendVersion); JNIEXPORT void JNICALL Java_com_facebook_igl_shell_SampleLib_surfaceChanged(JNIEnv* env, jobject obj, jobject surface, jint width, jint height); JNIEXPORT jboolean JNICALL Java_com_facebook_igl_shell_SampleLib_render(JNIEnv* env, jobject obj, jfloat displayScale); JNIEXPORT void JNICALL Java_com_facebook_igl_shell_SampleLib_surfaceDestroyed(JNIEnv* env, jobject obj, jobject surface); JNIEXPORT void JNICALL Java_com_facebook_igl_shell_SampleLib_touchEvent(JNIEnv* env, jobject obj, jboolean isDown, jfloat x, jfloat y, jfloat dx, jfloat dy); JNIEXPORT void JNICALL Java_com_facebook_igl_shell_SampleLib_setClearColorValue(JNIEnv* env, jobject obj, jfloat r, jfloat g, jfloat b, jfloat a); JNIEXPORT bool JNICALL Java_com_facebook_igl_shell_SampleLib_isSRGBTextureFormat(JNIEnv* env, jobject obj, int textureFormat); }; JNIEXPORT jobjectArray JNICALL Java_com_facebook_igl_shell_SampleLib_getRenderSessionConfigs(JNIEnv* env, jobject /*obj*/) { if (!factory) { factory = shell::createDefaultRenderSessionFactory(); } constexpr igl::TextureFormat kSwapchainColorTextureFormat = igl::TextureFormat::BGRA_SRGB; std::vector suggestedConfigs = { #if IGL_BACKEND_OPENGL { .displayName = "OpenGL ES 3", .backendVersion = {.flavor = igl::BackendFlavor::OpenGL_ES, .majorVersion = 3, .minorVersion = 0}, .swapchainColorTextureFormat = kSwapchainColorTextureFormat, }, { .displayName = "OpenGL ES 2", .backendVersion = {.flavor = igl::BackendFlavor::OpenGL_ES, .majorVersion = 2, .minorVersion = 0}, .swapchainColorTextureFormat = kSwapchainColorTextureFormat, }, #endif #if IGL_BACKEND_VULKAN { .displayName = "Vulkan", .backendVersion = {.flavor = igl::BackendFlavor::Vulkan, .majorVersion = 1, .minorVersion = 1}, .swapchainColorTextureFormat = kSwapchainColorTextureFormat, }, #endif }; const auto requestedConfigs = factory->requestedSessionConfigs(shell::ShellType::Android, std::move(suggestedConfigs)); return toJava(env, requestedConfigs); } // Helper function to extract all Intent extras as command-line style arguments [[maybe_unused]] static std::vector extractIntentExtras(JNIEnv* env, jobject intent) { std::vector extras; if (!intent) { return extras; } // Get Intent class and getExtras method jclass intentClass = env->GetObjectClass(intent); jmethodID getExtrasMethod = env->GetMethodID(intentClass, "getExtras", "()Landroid/os/Bundle;"); if (!getExtrasMethod) { IGL_LOG_ERROR("Failed to get getExtras method\n"); return extras; } // Get the Bundle containing extras jobject bundle = env->CallObjectMethod(intent, getExtrasMethod); if (!bundle) { IGL_LOG_INFO("No extras found in Intent\n"); return extras; } // Get Bundle class and keySet method jclass bundleClass = env->GetObjectClass(bundle); jmethodID keySetMethod = env->GetMethodID(bundleClass, "keySet", "()Ljava/util/Set;"); if (!keySetMethod) { IGL_LOG_ERROR("Failed to get keySet method\n"); env->DeleteLocalRef(bundle); return extras; } // Get the Set of keys jobject keySet = env->CallObjectMethod(bundle, keySetMethod); if (!keySet) { IGL_LOG_INFO("No keys found in Bundle\n"); env->DeleteLocalRef(bundle); return extras; } // Get Set class and iterator method jclass setClass = env->GetObjectClass(keySet); jmethodID iteratorMethod = env->GetMethodID(setClass, "iterator", "()Ljava/util/Iterator;"); if (!iteratorMethod) { IGL_LOG_ERROR("Failed to get iterator method\n"); env->DeleteLocalRef(keySet); env->DeleteLocalRef(bundle); return extras; } // Get the Iterator jobject iterator = env->CallObjectMethod(keySet, iteratorMethod); if (!iterator) { IGL_LOG_ERROR("Failed to get iterator\n"); env->DeleteLocalRef(keySet); env->DeleteLocalRef(bundle); return extras; } // Get Iterator class methods jclass iteratorClass = env->GetObjectClass(iterator); jmethodID hasNextMethod = env->GetMethodID(iteratorClass, "hasNext", "()Z"); jmethodID nextMethod = env->GetMethodID(iteratorClass, "next", "()Ljava/lang/Object;"); if (!hasNextMethod || !nextMethod) { IGL_LOG_ERROR("Failed to get iterator methods\n"); env->DeleteLocalRef(iterator); env->DeleteLocalRef(keySet); env->DeleteLocalRef(bundle); return extras; } // Get Bundle.get method to retrieve values jmethodID getMethod = env->GetMethodID(bundleClass, "get", "(Ljava/lang/String;)Ljava/lang/Object;"); if (!getMethod) { IGL_LOG_ERROR("Failed to get Bundle.get method\n"); env->DeleteLocalRef(iterator); env->DeleteLocalRef(keySet); env->DeleteLocalRef(bundle); return extras; } // Iterate through all keys while (env->CallBooleanMethod(iterator, hasNextMethod)) { jobject keyObj = env->CallObjectMethod(iterator, nextMethod); if (!keyObj) { continue; } // Convert key to string jstring keyStr = static_cast(keyObj); const char* keyChars = env->GetStringUTFChars(keyStr, nullptr); std::string key(keyChars); env->ReleaseStringUTFChars(keyStr, keyChars); // Get the value for this key jobject valueObj = env->CallObjectMethod(bundle, getMethod, keyStr); std::string value; if (valueObj) { // Convert value to string (works for most common types) jclass objectClass = env->GetObjectClass(valueObj); jmethodID toStringMethod = env->GetMethodID(objectClass, "toString", "()Ljava/lang/String;"); if (toStringMethod) { jstring valueStr = static_cast(env->CallObjectMethod(valueObj, toStringMethod)); if (valueStr) { const char* valueChars = env->GetStringUTFChars(valueStr, nullptr); value = std::string(valueChars); env->ReleaseStringUTFChars(valueStr, valueChars); env->DeleteLocalRef(valueStr); } } env->DeleteLocalRef(valueObj); } else { value = "null"; } // Add the key as a command-line argument extras.emplace_back(key); // Add the value as a separate argument if it's not empty and not "null" if (!value.empty() && value != "null") { extras.emplace_back(value); } IGL_LOG_INFO("Intent extra: %s = %s\n", key.c_str(), value.c_str()); env->DeleteLocalRef(keyObj); } // Clean up local references env->DeleteLocalRef(iterator); env->DeleteLocalRef(keySet); env->DeleteLocalRef(bundle); return extras; } JNIEXPORT void JNICALL Java_com_facebook_igl_shell_SampleLib_init(JNIEnv* env, jobject /*obj*/, jobject jbackendVersion, jint jtextureFormat, jobject javaAssetManager, jobject surface, jobject intent) { const auto backendVersion = toBackendVersion(env, jbackendVersion); const auto swapchainColorTextureFormat = static_cast(jtextureFormat); const auto rendererIndex = findRendererIndex(backendVersion); if (backendVersion && !rendererIndex) { auto renderer = std::make_unique(); auto cmdLine = extractIntentExtras(env, intent); IGL_LOG_INFO("init: creating backend renderer cmd line: %d\n", cmdLine.size()); for ([[maybe_unused]] const auto& cmd : cmdLine) { IGL_LOG_INFO("Param: %s\n", cmd.c_str()); } renderer->init(AAssetManager_fromJava(env, javaAssetManager), surface ? ANativeWindow_fromSurface(env, surface) : nullptr, *factory, *backendVersion, swapchainColorTextureFormat, cmdLine); renderers.emplace_back(std::move(renderer)); IGL_LOG_INFO("init: creating backend renderer: %s\n", toString(backendVersion).c_str()); } else if (rendererIndex && backendVersion && backendVersion->flavor == BackendFlavor::Vulkan) { IGL_LOG_INFO("init: Updating backend renderer: %s\n", toString(backendVersion).c_str()); renderers[*rendererIndex]->recreateSwapchain(ANativeWindow_fromSurface(env, surface), true); } else { IGL_LOG_INFO("init: no changes: %s\n", toString(backendVersion).c_str()); } activeBackendVersion = backendVersion; } // NOLINTBEGIN(misc-use-internal-linkage) JNIEXPORT jboolean JNICALL Java_com_facebook_igl_shell_SampleLib_isBackendVersionSupported(JNIEnv* env, jobject /*obj*/, jobject jbackendVersion) { [[maybe_unused]] const auto backendVersion = toBackendVersion(env, jbackendVersion); IGL_LOG_INFO("isBackendVersionSupported: %s\n", toString(backendVersion).c_str()); #if IGL_BACKEND_OPENGL if (backendVersion && backendVersion->flavor == BackendFlavor::OpenGL_ES) { return JNI_TRUE; } #endif #if IGL_BACKEND_VULKAN if (backendVersion && backendVersion->flavor == BackendFlavor::Vulkan) { return JNI_TRUE; } #endif return JNI_FALSE; } // NOLINTEND(misc-use-internal-linkage) JNIEXPORT void JNICALL Java_com_facebook_igl_shell_SampleLib_setActiveBackendVersion(JNIEnv* env, jobject /*obj*/, jobject jbackendVersion) { activeBackendVersion = toBackendVersion(env, jbackendVersion); IGL_LOG_INFO("setActiveBackendVersion: %s activeRenderIndex: %s\n", toString(activeBackendVersion).c_str(), toString(findRendererIndex(activeBackendVersion)).c_str()); } JNIEXPORT void JNICALL Java_com_facebook_igl_shell_SampleLib_surfaceChanged(JNIEnv* env, jobject /*obj*/, jobject surface, jint width, jint height) { const auto activeRendererIndex = findRendererIndex(activeBackendVersion); IGL_LOG_INFO("surfaceChanged: %s rendererIndex: %s\n", toString(activeBackendVersion).c_str(), toString(activeRendererIndex).c_str()); if (!activeRendererIndex) { return; } renderers[*activeRendererIndex]->onSurfacesChanged( surface ? ANativeWindow_fromSurface(env, surface) : nullptr, width, height); } JNIEXPORT jboolean JNICALL Java_com_facebook_igl_shell_SampleLib_render(JNIEnv* /*env*/, jobject /*obj*/, jfloat displayScale) { const auto activeRendererIndex = findRendererIndex(activeBackendVersion); if (!activeRendererIndex) { return JNI_FALSE; } bool shouldExit = renderers[*activeRendererIndex]->render(displayScale); return shouldExit ? JNI_TRUE : JNI_FALSE; } JNIEXPORT void JNICALL Java_com_facebook_igl_shell_SampleLib_surfaceDestroyed(JNIEnv* env, jobject /*obj*/, jobject surface) {} JNIEXPORT void JNICALL Java_com_facebook_igl_shell_SampleLib_touchEvent(JNIEnv* /*env*/, jobject /*obj*/, jboolean isDown, jfloat x, jfloat y, jfloat dx, jfloat dy) { const auto activeRendererIndex = findRendererIndex(activeBackendVersion); if (!activeRendererIndex) { return; } renderers[*activeRendererIndex]->touchEvent(isDown != 0u, x, y, dx, dy); } JNIEXPORT void JNICALL Java_com_facebook_igl_shell_SampleLib_setClearColorValue(JNIEnv* /*env*/, jobject /*obj*/, jfloat r, jfloat g, jfloat b, jfloat a) { const auto activeRendererIndex = findRendererIndex(activeBackendVersion); if (!activeRendererIndex) { return; } renderers[*activeRendererIndex]->setClearColorValue(r, g, b, a); } JNIEXPORT bool JNICALL Java_com_facebook_igl_shell_SampleLib_isSRGBTextureFormat(JNIEnv* env, jobject obj, int textureFormat) { return textureFormat == (int)igl::TextureFormat::RGBA_SRGB || textureFormat == (int)igl::TextureFormat::BGRA_SRGB; } } // namespace igl::samples ================================================ FILE: shell/android/jni/TinyRenderer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include "TinyRenderer.h" #include #include #include #if IGL_BACKEND_OPENGL #include #include #endif #include #include #include #include #include #include #if IGL_BACKEND_VULKAN #include #include #include #endif #include #include #include namespace { // Helper functions to read Android system properties std::optional getAndroidSystemProperty(const char* keyName) noexcept { std::array value{}; int len = __system_property_get(keyName, value.data()); if (len > 0) { return std::string(value.data()); } return std::nullopt; } std::optional getAndroidSystemPropertyBool(const char* keyName) noexcept { auto prop = getAndroidSystemProperty(keyName); if (!prop.has_value()) { return std::nullopt; } const auto& value = prop.value(); if (value == "true" || value == "1") { return true; } if (value == "false" || value == "0") { return false; } return std::nullopt; } std::optional getAndroidSystemPropertyInt(const char* keyName) noexcept { auto prop = getAndroidSystemProperty(keyName); if (!prop.has_value()) { return std::nullopt; } try { return std::stoi(prop.value()); } catch (...) { return std::nullopt; } } std::optional getAndroidSystemPropertySizeT(const char* keyName) noexcept { auto prop = getAndroidSystemProperty(keyName); if (!prop.has_value()) { return std::nullopt; } try { return std::stoul(prop.value()); } catch (...) { return std::nullopt; } } // Read shell parameters from Android system properties void readShellParamsFromAndroidProps(igl::shell::ShellParams& shellParams, const char* prefix) noexcept { std::string prefixStr(prefix); prefixStr += "."; // Read ShellParams auto headless = getAndroidSystemPropertyBool((prefixStr + "headless").c_str()); if (headless.has_value()) { shellParams.isHeadless = headless.value(); if (shellParams.isHeadless && shellParams.screenshotNumber == ~0u) { shellParams.screenshotNumber = 0; } } auto disableVulkanValidation = getAndroidSystemPropertyBool((prefixStr + "disable-vulkan-validation-layers").c_str()); if (disableVulkanValidation.has_value()) { shellParams.enableVulkanValidationLayers = !disableVulkanValidation.value(); } auto screenshotFile = getAndroidSystemProperty((prefixStr + "screenshot-file").c_str()); if (screenshotFile.has_value()) { shellParams.screenshotFileName = screenshotFile.value(); } auto screenshotNumber = getAndroidSystemPropertyInt((prefixStr + "screenshot-number").c_str()); if (screenshotNumber.has_value()) { shellParams.screenshotNumber = static_cast(screenshotNumber.value()); } auto viewportSize = getAndroidSystemProperty((prefixStr + "viewport-size").c_str()); if (viewportSize.has_value()) { unsigned int w = 0; unsigned int h = 0; if (sscanf(viewportSize.value().c_str(), "%ux%u", &w, &h) == 2) { if (w && h) { shellParams.viewportSize = glm::vec2(w, h); } } } auto fpsThrottle = getAndroidSystemPropertyInt((prefixStr + "fps-throttle").c_str()); if (fpsThrottle.has_value()) { shellParams.fpsThrottleMs = static_cast(fpsThrottle.value()); } auto fpsThrottleRandom = getAndroidSystemPropertyBool((prefixStr + "fps-throttle-random").c_str()); if (fpsThrottleRandom.has_value()) { shellParams.fpsThrottleRandom = fpsThrottleRandom.value(); } auto freezeAtFrame = getAndroidSystemPropertyInt((prefixStr + "freeze-at-frame").c_str()); if (freezeAtFrame.has_value()) { shellParams.freezeAtFrame = static_cast(freezeAtFrame.value()); } // Read BenchmarkRenderSessionParams - always try to read them auto timeout = getAndroidSystemPropertySizeT((prefixStr + "timeout").c_str()); auto sessions = getAndroidSystemPropertySizeT((prefixStr + "sessions").c_str()); auto logReporter = getAndroidSystemPropertyBool((prefixStr + "log-reporter").c_str()); auto offscreenOnly = getAndroidSystemPropertyBool((prefixStr + "offscreen-only").c_str()); auto benchmark = getAndroidSystemPropertyBool((prefixStr + "benchmark").c_str()); // Read new benchmark parameters auto benchmarkDuration = getAndroidSystemPropertySizeT((prefixStr + "benchmark-duration").c_str()); auto reportInterval = getAndroidSystemPropertySizeT((prefixStr + "report-interval").c_str()); auto hiccupMultiplier = getAndroidSystemProperty((prefixStr + "hiccup-multiplier").c_str()); auto renderBufferSize = getAndroidSystemPropertySizeT((prefixStr + "render-buffer-size").c_str()); // Debug: Log what benchmark properties were found if (benchmark.has_value() || benchmarkDuration.has_value() || reportInterval.has_value()) { __android_log_print( ANDROID_LOG_INFO, "igl", "[IGL Benchmark] System props prefix: %s\n", prefixStr.c_str()); __android_log_print( ANDROID_LOG_INFO, "igl", "[IGL Benchmark] benchmark=%s, duration=%s, interval=%s\n", benchmark.has_value() ? (benchmark.value() ? "true" : "false") : "not set", benchmarkDuration.has_value() ? std::to_string(benchmarkDuration.value()).c_str() : "not set", reportInterval.has_value() ? std::to_string(reportInterval.value()).c_str() : "not set"); } // Read custom parameters using __system_property_foreach (API 26+) // Custom parameters are any properties under the prefix that are not standard params std::vector> customParams; #if __ANDROID_API__ >= 26 // Known standard parameter names to exclude from custom params static const std::unordered_set standardParams = {"headless", "disable-vulkan-validation-layers", "screenshot-file", "screenshot-number", "viewport-size", "fps-throttle", "fps-throttle-random", "freeze-at-frame", "timeout", "sessions", "log-reporter", "offscreen-only", "benchmark", "benchmark-duration", "run-time", "report-interval", "hiccup-multiplier", "render-buffer-size"}; struct CallbackData { const std::string& prefix; const std::unordered_set& standardParams; std::vector>* customParams; }; CallbackData callbackData{prefixStr, standardParams, &customParams}; __system_property_foreach( [](const prop_info* pi, void* cookie) { auto* data = reinterpret_cast(cookie); // Get property name char name[PROP_NAME_MAX]; char value[PROP_VALUE_MAX]; __system_property_read(pi, name, value); std::string propName(name); // Check if property starts with our prefix if (propName.rfind(data->prefix, 0) == 0) { // Extract the key (remove prefix) std::string key = propName.substr(data->prefix.length()); // Only add if not empty and not a standard parameter if (!key.empty() && data->standardParams.find(key) == data->standardParams.end()) { data->customParams->emplace_back(key, std::string(value)); } } }, reinterpret_cast(&callbackData)); #endif // If any benchmark parameter is set (including custom params), create the benchmark params if (timeout.has_value() || sessions.has_value() || logReporter.has_value() || offscreenOnly.has_value() || benchmark.has_value() || benchmarkDuration.has_value() || reportInterval.has_value() || hiccupMultiplier.has_value() || renderBufferSize.has_value() || !customParams.empty()) { if (!shellParams.benchmarkParams.has_value()) { shellParams.benchmarkParams = igl::shell::BenchmarkRenderSessionParams(); } if (timeout.has_value()) { shellParams.benchmarkParams->renderSessionTimeoutMs = timeout.value(); } if (sessions.has_value()) { shellParams.benchmarkParams->numSessionsToRun = sessions.value(); } if (logReporter.has_value()) { shellParams.benchmarkParams->logReporter = logReporter.value(); } if (offscreenOnly.has_value()) { shellParams.benchmarkParams->offscreenRenderingOnly = offscreenOnly.value(); } // Apply new benchmark parameters if (benchmarkDuration.has_value()) { shellParams.benchmarkParams->benchmarkDurationMs = benchmarkDuration.value(); } if (reportInterval.has_value()) { shellParams.benchmarkParams->reportIntervalMs = reportInterval.value(); } if (hiccupMultiplier.has_value()) { try { shellParams.benchmarkParams->hiccupMultiplier = std::stod(hiccupMultiplier.value()); } catch (...) { // Ignore parse errors, keep default } } if (renderBufferSize.has_value()) { shellParams.benchmarkParams->renderTimeBufferSize = renderBufferSize.value(); } // Add custom parameters for (const auto& [key, value] : customParams) { shellParams.benchmarkParams->customParams.emplace_back(key, value); } } } // Stores the current EGL context when created, and restores it when destroyed. struct ContextGuard { ContextGuard(const igl::IDevice& device) { #if IGL_BACKEND_OPENGL backend_ = device.getBackendType(); if (backend_ == igl::BackendType::OpenGL) { display_ = eglGetCurrentDisplay(); context_ = eglGetCurrentContext(); readSurface_ = eglGetCurrentSurface(EGL_READ); drawSurface_ = eglGetCurrentSurface(EGL_DRAW); } #endif } ~ContextGuard() { #if IGL_BACKEND_OPENGL if (backend_ == igl::BackendType::OpenGL) { eglMakeCurrent(display_, readSurface_, drawSurface_, context_); } #endif } ContextGuard(const ContextGuard&) = delete; ContextGuard& operator=(const ContextGuard&) = delete; ContextGuard(ContextGuard&&) = delete; ContextGuard& operator=(ContextGuard&&) = delete; private: #if IGL_BACKEND_OPENGL igl::BackendType backend_; EGLDisplay display_; EGLContext context_; EGLSurface readSurface_; EGLSurface drawSurface_; #endif }; } // namespace namespace igl::samples { using namespace igl; void TinyRenderer::init(AAssetManager* mgr, ANativeWindow* nativeWindow, shell::IRenderSessionFactory& factory, BackendVersion backendVersion, TextureFormat swapchainColorTextureFormat, const std::vector& args) { backendVersion_ = backendVersion; nativeWindow_ = nativeWindow; Result result; const igl::HWDeviceQueryDesc queryDesc(HWDeviceType::IntegratedGpu); std::unique_ptr d; // Read shell params from Android system properties first readShellParamsFromAndroidProps(shellParams_, factory.getAndroidSystemPropsPrefix()); // Debug: Log if benchmark params were set if (shellParams_.benchmarkParams.has_value()) { __android_log_print(ANDROID_LOG_INFO, "igl", "[IGL Benchmark] benchmarkParams SET after reading props: duration=%zu, " "interval=%zu\n", shellParams_.benchmarkParams->benchmarkDurationMs, shellParams_.benchmarkParams->reportIntervalMs); } else { __android_log_print( ANDROID_LOG_INFO, "igl", "[IGL Benchmark] benchmarkParams NOT SET after reading props\n"); } // Parse shell params from command line (overrides properties) shell::parseShellParams(args, shellParams_); // Debug: Log after command line parsing if (shellParams_.benchmarkParams.has_value()) { __android_log_print(ANDROID_LOG_INFO, "igl", "[IGL Benchmark] benchmarkParams SET after parseShellParams: duration=%zu, " "interval=%zu\n", shellParams_.benchmarkParams->benchmarkDurationMs, shellParams_.benchmarkParams->reportIntervalMs); } switch (backendVersion_.flavor) { #if IGL_BACKEND_OPENGL case igl::BackendFlavor::OpenGL_ES: { auto hwDevice = opengl::egl::HWDevice(); // Decide which backend api to use, default as GLES3 d = hwDevice.create(backendVersion_, &result); shellParams_.shouldPresent = false; if (shellParams_.isHeadless) { width_ = static_cast(shellParams_.viewportSize.x); height_ = static_cast(shellParams_.viewportSize.y); } if (swapchainColorTextureFormat == TextureFormat::Invalid) { swapchainColorTextureFormat_ = TextureFormat::RGBA_SRGB; } if (!d->hasFeature(DeviceFeatures::SRGB) && !d->hasFeature(DeviceFeatures::SRGBSwapchain)) { swapchainColorTextureFormat_ = TextureFormat::RGBA_UNorm8; } break; } #endif #if IGL_BACKEND_VULKAN case igl::BackendFlavor::Vulkan: { IGL_DEBUG_ASSERT(nativeWindow != nullptr); vulkan::VulkanContextConfig config; config.terminateOnValidationError = true; config.requestedSwapChainTextureFormat = swapchainColorTextureFormat; // Don't use headless mode on Android - instead we'll render to offscreen surface config.headless = false; auto ctx = vulkan::HWDevice::createContext(config, nativeWindow); auto devices = vulkan::HWDevice::queryDevices(*ctx, HWDeviceQueryDesc(HWDeviceType::Unknown), &result); if (!result.isOk()) { __android_log_print(ANDROID_LOG_ERROR, "igl", "Error: %s\n", result.message.c_str()); } IGL_DEBUG_ASSERT(result.isOk()); if (shellParams_.isHeadless) { // Use viewport size from shell params for headless mode width_ = static_cast(shellParams_.viewportSize.x); height_ = static_cast(shellParams_.viewportSize.y); } else { width_ = static_cast(ANativeWindow_getWidth(nativeWindow)); height_ = static_cast(ANativeWindow_getHeight(nativeWindow)); } // https://github.com/gpuweb/gpuweb/issues/4283 // Only 49.5% of Android devices support dualSrcBlend. // Android devices that do not support dualSrcBlend primarily use ARM, ImgTec, and Qualcomm // GPUs. // https://vulkan.gpuinfo.org/listdevicescoverage.php?feature=dualSrcBlend&platform=android&option=not igl::vulkan::VulkanFeatures vulkanFeatures(config); vulkanFeatures.vkPhysicalDeviceFeatures2.features.dualSrcBlend = VK_FALSE; d = vulkan::HWDevice::create(std::move(ctx), devices[0], width_, // width height_, // height,, 0, nullptr, &vulkanFeatures, "TinyRenderer", &result); break; } #endif default: { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); return; } } IGL_DEBUG_ASSERT(d != nullptr); // We want to catch failed device creation instead of letting implicitly fail IGL_SOFT_ASSERT(result.isOk()); if (d) { platform_ = std::make_shared(std::move(d)); IGL_DEBUG_ASSERT(platform_ != nullptr); static_cast(platform_->getFileLoader()).setAssetManager(mgr); const ContextGuard guard(platform_->getDevice()); // wrap 'session_' operations session_ = factory.createRenderSession(platform_); session_->setShellParams(shellParams_); IGL_DEBUG_ASSERT(session_ != nullptr); session_->initialize(); } } void TinyRenderer::recreateSwapchain(ANativeWindow* nativeWindow, bool createSurface) { #if IGL_BACKEND_VULKAN nativeWindow_ = nativeWindow; if (!shellParams_.isHeadless) { width_ = static_cast(ANativeWindow_getWidth(nativeWindow)); height_ = static_cast(ANativeWindow_getHeight(nativeWindow)); } auto* platformDevice = platform_->getDevice().getPlatformDevice(); // need clear the cached textures before recreate swap chain. platformDevice->clear(); auto& vulkanDevice = static_cast(platform_->getDevice()); auto& vkContext = vulkanDevice.getVulkanContext(); if (createSurface) { vkContext.createSurface(nativeWindow, nullptr); } vkContext.initSwapchain(width_, height_); // need release frame buffer when recreate swap chain session_->releaseFramebuffer(); #endif } bool TinyRenderer::render(float displayScale) { // process user input IGL_DEBUG_ASSERT(platform_ != nullptr); platform_->getInputDispatcher().processEvents(); // draw Result result; SurfaceTextures surfaceTextures; if (shellParams_.isHeadless) { // In headless mode, create offscreen textures instead of native drawable textures auto& device = platform_->getDevice(); // Create or reuse offscreen color texture if (!offscreenColorTexture_ || offscreenColorTexture_->getSize().width != width_ || offscreenColorTexture_->getSize().height != height_) { TextureDesc colorTexDesc = TextureDesc::new2D(swapchainColorTextureFormat_, width_, height_, TextureDesc::TextureUsageBits::Attachment | TextureDesc::TextureUsageBits::Sampled); colorTexDesc.storage = ResourceStorage::Private; offscreenColorTexture_ = device.createTexture(colorTexDesc, &result); IGL_DEBUG_ASSERT(result.isOk()); IGL_SOFT_ASSERT(result.isOk()); } // Create or reuse offscreen depth texture if (!offscreenDepthTexture_ || offscreenDepthTexture_->getSize().width != width_ || offscreenDepthTexture_->getSize().height != height_) { TextureDesc depthTexDesc = TextureDesc::new2D( TextureFormat::Z_UNorm24, width_, height_, TextureDesc::TextureUsageBits::Attachment); depthTexDesc.storage = ResourceStorage::Private; offscreenDepthTexture_ = device.createTexture(depthTexDesc, &result); IGL_DEBUG_ASSERT(result.isOk()); IGL_SOFT_ASSERT(result.isOk()); } surfaceTextures.color = offscreenColorTexture_; surfaceTextures.depth = offscreenDepthTexture_; } else { // Normal mode: create surface textures from native drawable switch (backendVersion_.flavor) { #if IGL_BACKEND_OPENGL case igl::BackendFlavor::OpenGL_ES: { auto* platformDevice = platform_->getDevice().getPlatformDevice(); surfaceTextures.color = platformDevice->createTextureFromNativeDrawable(swapchainColorTextureFormat_, &result); surfaceTextures.depth = platformDevice->createTextureFromNativeDepth(igl::TextureFormat::Z_UNorm24, &result); break; } #endif #if IGL_BACKEND_VULKAN case igl::BackendFlavor::Vulkan: { auto* platformDevice = platform_->getDevice().getPlatformDevice(); surfaceTextures.color = platformDevice->createTextureFromNativeDrawable(&result); surfaceTextures.depth = platformDevice->createTextureFromNativeDepth(width_, height_, &result); break; } #endif default: Result::setResult(&result, Result::Code::Unsupported, "Invalid backend"); break; } IGL_DEBUG_ASSERT(result.isOk()); IGL_SOFT_ASSERT(result.isOk()); } const ContextGuard guard(platform_->getDevice()); // wrap 'session_' operations platform_->getDevice().setCurrentThread(); session_->setPixelsPerPoint(displayScale); session_->runUpdate(std::move(surfaceTextures)); // Return true if the application should exit (e.g., benchmark timeout) return session_->appParams().exitRequested; } void TinyRenderer::onSurfacesChanged(ANativeWindow* /*surface*/, int width, int height) { if (shellParams_.isHeadless) { return; } width_ = static_cast(width); height_ = static_cast(height); #if IGL_BACKEND_OPENGL if (backendVersion_.flavor == igl::BackendFlavor::OpenGL_ES) { auto* readSurface = eglGetCurrentSurface(EGL_READ); auto* drawSurface = eglGetCurrentSurface(EGL_DRAW); IGL_DEBUG_ASSERT(platform_ != nullptr); Result result; platform_->getDevice().getPlatformDevice()->updateSurfaces( readSurface, drawSurface, &result); IGL_DEBUG_ASSERT(result.isOk()); IGL_SOFT_ASSERT(result.isOk()); } #endif #if IGL_BACKEND_VULKAN if (backendVersion_.flavor == igl::BackendFlavor::Vulkan) { recreateSwapchain(nativeWindow_, false); platform_->updatePreRotationMatrix(); } #endif } void TinyRenderer::touchEvent(bool isDown, float x, float y, float dx, float dy) { const float scale = platform_->getDisplayContext().pixelsPerPoint; IGL_DEBUG_ASSERT(scale > 0.0f); platform_->getInputDispatcher().queueEvent( igl::shell::TouchEvent(isDown, x / scale, y / scale, dx / scale, dy / scale)); } void TinyRenderer::setClearColorValue(float r, float g, float b, float a) { shellParams_.clearColorValue = {r, g, b, a}; } } // namespace igl::samples ================================================ FILE: shell/android/jni/TinyRenderer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include #include #include #include #include namespace igl::samples { class TinyRenderer final { public: void init(AAssetManager* mgr, ANativeWindow* nativeWindow, shell::IRenderSessionFactory& factor, BackendVersion backendVersion, TextureFormat swapchainColorTextureFormat, const std::vector& args = {}); void recreateSwapchain(ANativeWindow* nativeWindow, bool createSurface); // only for Vulkan /// @brief Renders a frame /// @param displayScale The display scale factor /// @return true if the application should exit (e.g., benchmark timeout) bool render(float displayScale); void onSurfacesChanged(ANativeWindow* nativeWindow, int width, int height); void touchEvent(bool isDown, float x, float y, float dx, float dy); void setClearColorValue(float r, float g, float b, float a); [[nodiscard]] const BackendVersion& backendVersion() const noexcept { return backendVersion_; } private: BackendVersion backendVersion_; std::shared_ptr platform_; std::unique_ptr session_; shell::ShellParams shellParams_; uint32_t width_ = 0; uint32_t height_ = 0; TextureFormat swapchainColorTextureFormat_ = TextureFormat::RGBA_UNorm8; ANativeWindow* nativeWindow_ = nullptr; // Offscreen textures for headless rendering std::shared_ptr offscreenColorTexture_; std::shared_ptr offscreenDepthTexture_; }; } // namespace igl::samples ================================================ FILE: shell/apps/SessionApp.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #if !defined(IGL_SHELL_SESSION) #error "IGL_SHELL_SESSION must be defined"; #endif #if !defined(IGL_CMAKE_BUILD) #define IGL_SHELL_PATH #else #define IGL_SHELL_PATH #endif // IGL_CMAKE_BUILD #include IGL_SHELL_PATH #include namespace igl::shell { class RenderSessionFactory final : public IRenderSessionFactory { public: std::unique_ptr createRenderSession( std::shared_ptr platform) noexcept final; }; std::unique_ptr createDefaultRenderSessionFactory() { return std::make_unique(); } std::unique_ptr RenderSessionFactory::createRenderSession( std::shared_ptr platform) noexcept { return std::make_unique(std::move(platform)); } } // namespace igl::shell ================================================ FILE: shell/ios/AppDelegate.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #import // IWYU pragma: export #import // IWYU pragma: export #import // IWYU pragma: export #import // IWYU pragma: export @interface AppDelegate : UIResponder @property (strong, nonatomic) UIWindow* window; @end ================================================ FILE: shell/ios/AppDelegate.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #import "AppDelegate.h" #include "RenderSessionFactoryAdapterInternal.hpp" #import "RenderSessionFactoryProvider.h" // @donotremove #import "ViewController.h" // @donotremove #import #import #import #import #import #import #import #include #include #include #include #if IGL_BACKEND_OPENGL #include #endif @interface AppDelegate () { RenderSessionFactoryProvider* _factoryProvider; } - (void)addTab:(igl::shell::RenderSessionConfig)config viewControllers:(NSMutableArray*)viewControllers; @end @implementation AppDelegate @synthesize window = _window; - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; _factoryProvider = [[RenderSessionFactoryProvider alloc] init]; NSMutableArray* viewControllers = [NSMutableArray array]; std::vector suggestedSessionConfigs = { #if IGL_BACKEND_METAL { .displayName = "Metal", .backendVersion = {.flavor = igl::BackendFlavor::Metal, .majorVersion = 3, .minorVersion = 0}, .swapchainColorTextureFormat = igl::TextureFormat::BGRA_SRGB, .depthTextureFormat = igl::TextureFormat::S8_UInt_Z32_UNorm, }, #endif #if IGL_BACKEND_OPENGL #if GL_ES_VERSION_3_0 { .displayName = "OpenGL ES 3.0", .backendVersion = {.flavor = igl::BackendFlavor::OpenGL_ES, .majorVersion = 3, .minorVersion = 0}, .swapchainColorTextureFormat = igl::TextureFormat::BGRA_SRGB, .depthTextureFormat = igl::TextureFormat::S8_UInt_Z24_UNorm, }, #endif { .displayName = "OpenGL ES 2.0", .backendVersion = {.flavor = igl::BackendFlavor::OpenGL_ES, .majorVersion = 2, .minorVersion = 0}, .swapchainColorTextureFormat = igl::TextureFormat::BGRA_SRGB, .depthTextureFormat = igl::TextureFormat::S8_UInt_Z24_UNorm, }, #endif // @fb-only // clang-format off // @fb-only // clang-format on // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only }; const auto requestedSessionConfigs = _factoryProvider.adapter->factory->requestedSessionConfigs( igl::shell::ShellType::iOS, std::move(suggestedSessionConfigs)); for (const auto& sessionConfig : requestedSessionConfigs) { [self addTab:sessionConfig viewControllers:viewControllers]; } UITabBarController* tabBarController = [[UITabBarController alloc] initWithNibName:nil bundle:nil]; tabBarController.delegate = self; tabBarController.viewControllers = viewControllers; tabBarController.tabBar.translucent = NO; if (@available(iOS 13.0, *)) { tabBarController.tabBar.backgroundColor = UIColor.systemBackgroundColor; } self.window.rootViewController = tabBarController; [self.window makeKeyAndVisible]; return YES; } - (void)addTab:(igl::shell::RenderSessionConfig)config viewControllers:(NSMutableArray*)viewControllers { bool supported = false; #if IGL_BACKEND_METAL if (config.backendVersion.flavor == igl::BackendFlavor::Metal) { supported = true; } #endif #if IGL_BACKEND_OPENGL if (config.backendVersion.flavor == igl::BackendFlavor::OpenGL_ES) { supported = true; } #endif // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only if (!IGL_DEBUG_VERIFY(supported)) { return; } UIViewController* viewController = [[ViewController alloc] init:config factoryProvider:_factoryProvider frame:self.window.frame]; viewController.tabBarItem = [[UITabBarItem alloc] initWithTitle:[NSString stringWithUTF8String:config.displayName.c_str()] image:nil tag:0]; [viewControllers addObject:viewController]; } @end ================================================ FILE: shell/ios/BackendVersion.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only // NOTE: This is a pure Obj-C compatible header (no C++) to simplify bridging with Swift #import // MUST match igl/Common.h typedef NS_ENUM(NSUInteger, BackendFlavor) { kBackendFlavorInvalid, kBackendFlavorOpenGL, kBackendFlavorOpenGLES, kBackendFlavorMetal, kBackendFlavorVulkan, // @fb-only }; @interface BackendVersion : NSObject - (instancetype)init:(BackendFlavor)flavor majorVersion:(UInt8)majorVersion minorVersion:(UInt8)minorVersion; @property (readonly) BackendFlavor flavor; @property (readonly) UInt8 majorVersion; @property (readonly) UInt8 minorVersion; @end ================================================ FILE: shell/ios/BackendVersion.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #import "BackendVersion.h" @implementation BackendVersion { BackendFlavor _flavor; UInt8 _majorVersion; UInt8 _minorVersion; } - (instancetype)init:(BackendFlavor)flavor majorVersion:(UInt8)majorVersion minorVersion:(UInt8)minorVersion { if (self = [super init]) { self->_flavor = flavor; self->_majorVersion = majorVersion; self->_minorVersion = minorVersion; } return self; } - (BackendFlavor)flavor { return _flavor; } - (UInt8)majorVersion { return _majorVersion; } - (UInt8)minorVersion { return _minorVersion; } @end ================================================ FILE: shell/ios/CMakeLists.txt ================================================ # Copyright (c) Meta Platforms, Inc. and affiliates. # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. cmake_minimum_required(VERSION 3.19) set(PROJECT_NAME "iOS") file(GLOB PLATFORM_SHARED_SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ../shared/fileLoader/apple/*.mm ../shared/imageWriter/ios/*.mm ../shared/platform/ios/*.mm) file(GLOB PLATFORM_SHARED_HEADER_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ../shared/fileLoader/apple/*.h ../shared/imageWriter/ios/*.h ../shared/platform/ios/*.h) add_library(IGLShellPlatform ${PLATFORM_SHARED_SRC_FILES} ${PLATFORM_SHARED_HEADER_FILES}) target_link_libraries(IGLShellPlatform PUBLIC IGLLibrary) set_target_properties(IGLShellPlatform PROPERTIES XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_WEAK YES) set_target_properties(IGLShellPlatform PROPERTIES XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC YES) target_link_libraries(IGLShellPlatform PUBLIC IGLLibrary) igl_set_folder(IGLShellPlatform "IGL") igl_set_cxxstd(IGLShellPlatform 20) set_target_properties(IGLShellShared PROPERTIES XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_WEAK YES) set_target_properties(IGLShellShared PROPERTIES XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC YES) function(ADD_SHELL_SESSION_WITH_SRCS target srcs libs) file(GLOB PLATFORM_SHELL_SRC_FILES LIST_DIRECTORIES false ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/*.mm ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/*.m) file(GLOB PLATFORM_SHELL_HEADER_FILES LIST_DIRECTORIES false ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/*.h) file(GLOB RESOURCES LIST_DIRECTORIES false ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../resources/images/*.png) add_executable(${target} MACOSX_BUNDLE ${srcs} "${PLATFORM_SHELL_SRC_FILES}" "${PLATFORM_SHELL_HEADER_FILES}" "${RESOURCES}") igl_set_folder(${target} "IGL Shell Sessions") igl_set_cxxstd(${target} 20) target_compile_definitions(${target} PRIVATE "IGL_SHELL_SESSION=${target}") target_link_libraries(${target} PUBLIC ${libs}) target_link_libraries(${target} PUBLIC IGLShellShared) target_link_libraries(${target} PUBLIC IGLShellPlatform) set_target_properties(${target} PROPERTIES XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_WEAK YES) set_target_properties(${target} PROPERTIES XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC YES) target_link_libraries( ${target} PUBLIC "-framework AVFoundation" "-framework CoreGraphics" "-framework CoreMotion" "-framework Foundation" "-framework Metal" "-framework MetalKit" "-framework QuartzCore" "-framework UIKit") set_target_properties( ${target} PROPERTIES MACOSX_BUNDLE TRUE MACOSX_BUNDLE_BUNDLE_NAME "${target}" MACOSX_BUNDLE_GUI_IDENTIFIER "com.meta.${target}" MACOSX_BUNDLE_BUNDLE_VERSION "1.0.0" MACOSX_BUNDLE_SHORT_VERSION_STRING "1.0.0" RESOURCE "${RESOURCES}" ) endfunction() ================================================ FILE: shell/ios/IglShellPlatformAdapter.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only // NOTE: This is a pure Obj-C compatible header (no C++) to simplify bridging with Swift // Opaque wrapper around C++ type // NOLINTNEXTLINE(facebook-unused-forward-decls) typedef struct IglShellPlatformAdapter* IglShellPlatformAdapterPtr; ================================================ FILE: shell/ios/IglShellPlatformAdapterInternal.hpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only // NOTE: Only include this in the Obj-C++ implementation (.mm) file // Use the public header in pure Obj-C files #include "IglShellPlatformAdapter.h" #include struct IglShellPlatformAdapter { igl::shell::Platform* platform; }; ================================================ FILE: shell/ios/IglSurfaceTexturesAdapter.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only // NOTE: This is a pure Obj-C compatible header (no C++) to simplify bridging with Swift // NOLINTNEXTLINE(facebook-unused-forward-decls) typedef struct IglSurfaceTexturesAdapter* IglSurfacesTextureAdapterPtr; ================================================ FILE: shell/ios/IglSurfaceTexturesAdapterInternal.hpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only // NOTE: Only include this in the Obj-C++ implementation (.mm) file // Use the public header in pure Obj-C files #include "IglSurfaceTexturesAdapter.h" #include struct IglSurfaceTexturesAdapter { igl::SurfaceTextures surfaceTextures; }; ================================================ FILE: shell/ios/RenderSessionController.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only // NOTE: This is a pure Obj-C compatible header (no C++) to simplify bridging with Swift #import "BackendVersion.h" #import "IglShellPlatformAdapter.h" #import "IglSurfaceTexturesAdapter.h" #import "RenderSessionFactoryProvider.h" #import #import typedef int IglBackendFlavor; typedef int IglOpenglRenderingAPI; @protocol IglSurfaceTexturesProvider - (IglSurfacesTextureAdapterPtr)createSurfaceTextures; @end @protocol IglShellPlatformAdapter - (IglShellPlatformAdapterPtr)adapter; @end @interface RenderSessionController : NSObject - (instancetype)initWithBackendVersion:(BackendVersion*)backendVersion factoryProvider:(RenderSessionFactoryProvider*)factoryProvider surfaceProvider:(id)provider; - (void)initializeDevice; - (void)start; - (void)stop; - (void)tick; - (void)releaseSessionFrameBuffer; - (void)setFrame:(CGRect)frame; @end ================================================ FILE: shell/ios/RenderSessionController.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #import "RenderSessionController.h" #import "IglShellPlatformAdapterInternal.hpp" #import "IglSurfaceTexturesAdapterInternal.hpp" #import "RenderSessionFactoryAdapterInternal.hpp" #import #import #import #import #if IGL_BACKEND_METAL #import #import #endif #if IGL_BACKEND_OPENGL #include #endif // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only #include #include #include #include @interface RenderSessionController () { igl::BackendVersion _backendVersion; CGRect _frame; CADisplayLink* _renderTimer; std::unique_ptr _session; std::shared_ptr _platform; IglShellPlatformAdapter _platformAdapter; igl::shell::IRenderSessionFactory* _factory; id _surfaceTexturesProvider; } - (igl::BackendVersion)toBackendVersion:(BackendVersion*)version; @end @implementation RenderSessionController - (instancetype)initWithBackendVersion:(BackendVersion*)backendVersion factoryProvider:(RenderSessionFactoryProvider*)factoryProvider surfaceProvider:(id)provider { if (self = [super init]) { self->_backendVersion = [self toBackendVersion:backendVersion]; _factory = [factoryProvider adapter]->factory; _frame = CGRectMake(0, 0, 1024, 768); // choose some default // @fb-only // @fb-only _surfaceTexturesProvider = provider; } return self; } - (void)initializeDevice { igl::HWDeviceQueryDesc queryDesc(igl::HWDeviceType::DiscreteGpu); std::unique_ptr device; switch (_backendVersion.flavor) { case igl::BackendFlavor::Metal: { #if IGL_BACKEND_METAL igl::metal::HWDevice hwDevice; auto hwDevices = hwDevice.queryDevices(queryDesc, nullptr); device = hwDevice.create(hwDevices[0], nullptr); #endif break; } case igl::BackendFlavor::OpenGL_ES: { #if IGL_BACKEND_OPENGL device = igl::opengl::ios::HWDevice().create(_backendVersion, nullptr); #endif break; } // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only default: IGL_DEBUG_ABORT("IGL Samples not set up for backend(%d)", (int)_backendVersion.flavor); break; } _platform = std::make_shared(std::move(device)); _platformAdapter.platform = _platform.get(); _session = _factory->createRenderSession(_platform); IGL_DEBUG_ASSERT(_session, "createDefaultRenderSession() must return a valid session"); _session->initialize(); } // @protocol IglShellPlatformAdapter - (IglShellPlatformAdapterPtr)adapter { return &_platformAdapter; } - (void)start { if (_backendVersion.flavor != igl::BackendFlavor::Metal) { // Render at 60hz _renderTimer = [CADisplayLink displayLinkWithTarget:self selector:@selector(tick)]; [_renderTimer addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; } } - (void)stop { [_renderTimer removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; _renderTimer = nullptr; } - (void)tick { igl::DeviceScope scope(_platform->getDevice()); // @fb-only // @fb-only IglSurfaceTexturesAdapter* adapter = [_surfaceTexturesProvider createSurfaceTextures]; // @fb-only // @fb-only // process user input _platform->getInputDispatcher().processEvents(); // draw if (_backendVersion.flavor == igl::BackendFlavor::Metal) { _session->setPixelsPerPoint((float)[UIScreen mainScreen].scale); } else if (_backendVersion.flavor == igl::BackendFlavor::OpenGL) { _session->setPixelsPerPoint(1.0f); } _session->update(adapter ? std::move(adapter->surfaceTextures) : igl::SurfaceTextures{}); } - (void)releaseSessionFrameBuffer { if (_session) { _session->releaseFramebuffer(); } } - (void)setFrame:(CGRect)frame { self->_frame = frame; } - (igl::BackendVersion)toBackendVersion:(BackendVersion*)version { return {.flavor = static_cast(version.flavor), .majorVersion = version.majorVersion, .minorVersion = version.minorVersion}; } @end ================================================ FILE: shell/ios/RenderSessionFactoryAdapter.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only // NOTE: This is a pure Obj-C compatible header (no C++) to simplify bridging with Swift // Opaque wrapper around C++ type // NOLINTNEXTLINE(facebook-unused-forward-decls) typedef struct RenderSessionFactoryAdapter* RenderSessionFactoryAdapterPtr; ================================================ FILE: shell/ios/RenderSessionFactoryAdapterInternal.hpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only // NOTE: Only include this in the Obj-C++ implementation (.mm) file // Use the public header in pure Obj-C files #include "RenderSessionFactoryAdapter.h" #include struct RenderSessionFactoryAdapter { igl::shell::IRenderSessionFactory* factory; }; ================================================ FILE: shell/ios/RenderSessionFactoryProvider.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only // NOTE: This is a pure Obj-C compatible header (no C++) to simplify bridging with Swift #import "RenderSessionFactoryAdapter.h" #import typedef int IglBackendFlavor; typedef int IglOpenglRenderingAPI; @protocol RenderSessionFactoryAdapter - (RenderSessionFactoryAdapterPtr)adapter; @end @interface RenderSessionFactoryProvider : NSObject - (instancetype)init; @end ================================================ FILE: shell/ios/RenderSessionFactoryProvider.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #import "RenderSessionFactoryProvider.h" #import "RenderSessionFactoryAdapterInternal.hpp" #include #include @interface RenderSessionFactoryProvider () { std::unique_ptr _factory; RenderSessionFactoryAdapter _adapter; } @end @implementation RenderSessionFactoryProvider - (instancetype)init { if (self = [super init]) { _factory = igl::shell::createDefaultRenderSessionFactory(); _adapter.factory = _factory.get(); } return self; } // @protocol RenderSessionFactoryAdapter - (RenderSessionFactoryAdapterPtr)adapter { return &_adapter; } @end ================================================ FILE: shell/ios/View.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #import #import @protocol TouchDelegate - (void)touchBegan:(UITouch*)touch; - (void)touchEnded:(UITouch*)touch; - (void)touchMoved:(UITouch*)touch; @end @protocol ViewSizeChangeDelegate - (void)onViewSizeChange; @end @interface BaseView : UIView - (instancetype)initWithTouchDelegate:(id)delegate; @end @interface MetalView : MTKView - (void)setTouchDelegate:(id)delegate; @end @interface OpenGLView : BaseView @property (nonatomic, weak, nullable) id viewSizeChangeDelegate; @end ================================================ FILE: shell/ios/View.m ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #import "View.h" #import @implementation BaseView { id __weak _delegate; } - (instancetype)initWithTouchDelegate:(id)delegate { if (self = [super init]) { self->_delegate = delegate; } return self; } - (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { [self->_delegate touchBegan:touches.anyObject]; } - (void)touchesMoved:(NSSet*)touches withEvent:(nullable UIEvent*)event { [self->_delegate touchMoved:touches.anyObject]; } - (void)touchesEnded:(NSSet*)touches withEvent:(nullable UIEvent*)event { [self->_delegate touchEnded:touches.anyObject]; } - (void)touchesCanceled:(NSSet*)touches withEvent:(nullable UIEvent*)event { [self->_delegate touchEnded:touches.anyObject]; } @end @implementation MetalView { id __weak _touchDelegate; } - (void)setTouchDelegate:(id)delegate { self->_touchDelegate = delegate; } - (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { [self->_touchDelegate touchBegan:touches.anyObject]; } - (void)touchesMoved:(NSSet*)touches withEvent:(nullable UIEvent*)event { [self->_touchDelegate touchMoved:touches.anyObject]; } - (void)touchesEnded:(NSSet*)touches withEvent:(nullable UIEvent*)event { [self->_touchDelegate touchEnded:touches.anyObject]; } - (void)touchesCanceled:(NSSet*)touches withEvent:(nullable UIEvent*)event { [self->_touchDelegate touchEnded:touches.anyObject]; } + (Class)layerClass { #if TARGET_OS_SIMULATOR if (@available(iOS 13.0, *)) { return [CAMetalLayer class]; } return [CALayer class]; #else return [CAMetalLayer class]; #endif } @end @implementation OpenGLView @synthesize viewSizeChangeDelegate = _viewSizeChangeDelegate; - (void)layoutSubviews { [super layoutSubviews]; if (self.viewSizeChangeDelegate) { [self.viewSizeChangeDelegate onViewSizeChange]; } } + (Class)layerClass { return [CAEAGLLayer class]; } @end ================================================ FILE: shell/ios/ViewController.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #import "RenderSessionFactoryProvider.h" #import #import #import @interface ViewController : UIViewController - (instancetype)init:(igl::shell::RenderSessionConfig)config factoryProvider:(RenderSessionFactoryProvider*)factoryProvider frame:(CGRect)frame; @end ================================================ FILE: shell/ios/ViewController.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #import "ViewController.h" #import "BackendVersion.h" #import "IglShellPlatformAdapter.h" #import "IglShellPlatformAdapterInternal.hpp" // IWYU pragma: keep #import "IglSurfaceTexturesAdapter.h" #import "IglSurfaceTexturesAdapterInternal.hpp" // IWYU pragma: keep #import "RenderSessionController.h" // IWYU pragma: keep #import "RenderSessionFactoryProvider.h" #import "View.h" #import #include #import // IWYU pragma: keep #include #if IGL_BACKEND_METAL #import #include #include #endif #if IGL_BACKEND_OPENGL #include #include #endif // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only #include #include #include #include #include @interface ViewController () { igl::shell::RenderSessionConfig _config; CALayer* _layer; CGRect _frame; id _currentDrawable; id _depthStencilTexture; RenderSessionController* _renderSessionController; IglSurfaceTexturesAdapter _surfaceTexturesAdapter; } - (BackendVersion*)toBackendVersion:(igl::BackendVersion)iglBackendVersion; @end @implementation ViewController - (void)drawInMTKView:(nonnull MTKView*)view { _currentDrawable = view.currentDrawable; _depthStencilTexture = view.depthStencilTexture; IGL_DEBUG_ASSERT(_renderSessionController); [_renderSessionController tick]; } - (void)mtkView:(nonnull MTKView*)view drawableSizeWillChange:(CGSize)size { [_renderSessionController releaseSessionFrameBuffer]; } - (void)onViewSizeChange { [_renderSessionController releaseSessionFrameBuffer]; } - (instancetype)init:(igl::shell::RenderSessionConfig)config factoryProvider:(RenderSessionFactoryProvider*)factoryProvider frame:(CGRect)frame { if (self = [super initWithNibName:nil bundle:nil]) { self->_config = config; self->_frame = frame; _renderSessionController = [[RenderSessionController alloc] initWithBackendVersion:[self toBackendVersion:config.backendVersion] factoryProvider:factoryProvider surfaceProvider:self]; } return self; } - (void)initRenderSessionController { IGL_DEBUG_ASSERT(_renderSessionController); // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only [_renderSessionController initializeDevice]; } - (igl::shell::Platform*)platform { IglShellPlatformAdapter* adapter = [_renderSessionController adapter]; IGL_DEBUG_ASSERT(adapter); return adapter->platform; } // clang-format off - (igl::SurfaceTextures)createSurfaceTexturesInternal { [[maybe_unused]] auto& device = [self platform]->getDevice(); switch (_config.backendVersion.flavor) { #if IGL_BACKEND_METAL case igl::BackendFlavor::Metal: { auto *platformDevice = device.getPlatformDevice(); IGL_DEBUG_ASSERT(platformDevice); return igl::SurfaceTextures{ .color = platformDevice->createTextureFromNativeDrawable(_currentDrawable, nullptr), .depth = platformDevice->createTextureFromNativeDepth(_depthStencilTexture, nullptr), }; } #endif #if IGL_BACKEND_OPENGL case igl::BackendFlavor::OpenGL_ES: { auto *platformDevice = device.getPlatformDevice(); IGL_DEBUG_ASSERT(platformDevice); return igl::SurfaceTextures{ .color = platformDevice->createTextureFromNativeDrawable((CAEAGLLayer*)_layer, nullptr), .depth = platformDevice->createTextureFromNativeDepth((CAEAGLLayer*)_layer, _config.depthTextureFormat, nullptr), }; } #endif // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only default: { IGL_DEBUG_ASSERT_NOT_REACHED(); return igl::SurfaceTextures{}; } } } // clang-format on // Protocol IglSurfaceTexturesProvider - (IglSurfacesTextureAdapterPtr)createSurfaceTextures { _surfaceTexturesAdapter.surfaceTextures = [self createSurfaceTexturesInternal]; return &_surfaceTexturesAdapter; } - (void)loadView { switch (_config.backendVersion.flavor) { case igl::BackendFlavor::Invalid: IGL_DEBUG_ASSERT_NOT_REACHED(); break; case igl::BackendFlavor::Metal: { #if IGL_BACKEND_METAL [self initRenderSessionController]; auto d = static_cast([self platform]->getDevice()).get(); auto metalView = [[MetalView alloc] initWithFrame:_frame device:d]; metalView.colorPixelFormat = igl::metal::Texture::textureFormatToMTLPixelFormat(_config.swapchainColorTextureFormat); metalView.depthStencilPixelFormat = MTLPixelFormatDepth32Float_Stencil8; metalView.delegate = self; [metalView setTouchDelegate:self]; self.view = metalView; _layer = metalView.layer; #endif break; } case igl::BackendFlavor::OpenGL_ES: { #if IGL_BACKEND_OPENGL auto openGLView = [[OpenGLView alloc] initWithTouchDelegate:self]; openGLView.viewSizeChangeDelegate = self; NSString* drawablePropertyColorFormat = kEAGLColorFormatRGBA8; switch (_config.swapchainColorTextureFormat) { case igl::TextureFormat::BGRA_UNorm8: drawablePropertyColorFormat = kEAGLColorFormatRGBA8; break; case igl::TextureFormat::BGRA_SRGB: drawablePropertyColorFormat = kEAGLColorFormatSRGBA8; break; default: break; } ((CAEAGLLayer*)openGLView.layer).drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:drawablePropertyColorFormat, kEAGLDrawablePropertyColorFormat, nil]; self.view = openGLView; #endif break; } case igl::BackendFlavor::OpenGL: IGL_DEBUG_ABORT("IGL Samples not set up for Desktop OpenGL backend"); break; case igl::BackendFlavor::Vulkan: IGL_DEBUG_ABORT("IGL Samples not set up for Vulkan backend"); break; case igl::BackendFlavor::D3D12: IGL_DEBUG_ABORT("IGL Samples not set up for D3D12 backend"); break; // @fb-only // @fb-only // @fb-only } } - (void)viewDidLoad { [super viewDidLoad]; if (_config.backendVersion.flavor != igl::BackendFlavor::Metal) { _layer = self.view.layer; [self initRenderSessionController]; } } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; if (_config.backendVersion.flavor != igl::BackendFlavor::Metal) { IGL_DEBUG_ASSERT(_renderSessionController); [_renderSessionController start]; } } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; if (_config.backendVersion.flavor != igl::BackendFlavor::Metal) { IGL_DEBUG_ASSERT(_renderSessionController); [_renderSessionController stop]; } } - (void)touchBegan:(UITouch*)touch { CGPoint curPoint = [touch locationInView:self.view]; CGPoint lastPoint = [touch previousLocationInView:self.view]; [self platform]->getInputDispatcher().queueEvent(igl::shell::TouchEvent( true, curPoint.x, curPoint.y, curPoint.x - lastPoint.x, curPoint.y - lastPoint.y)); } - (void)touchEnded:(UITouch*)touch { CGPoint curPoint = [touch locationInView:self.view]; CGPoint lastPoint = [touch previousLocationInView:self.view]; [self platform]->getInputDispatcher().queueEvent(igl::shell::TouchEvent( false, curPoint.x, curPoint.y, curPoint.x - lastPoint.x, curPoint.y - lastPoint.y)); } - (void)touchMoved:(UITouch*)touch { CGPoint curPoint = [touch locationInView:self.view]; CGPoint lastPoint = [touch previousLocationInView:self.view]; [self platform]->getInputDispatcher().queueEvent(igl::shell::TouchEvent( true, curPoint.x, curPoint.y, curPoint.x - lastPoint.x, curPoint.y - lastPoint.y)); } - (BackendVersion*)toBackendVersion:(igl::BackendVersion)iglBackendVersion { return [[BackendVersion alloc] init:static_cast(iglBackendVersion.flavor) majorVersion:iglBackendVersion.majorVersion minorVersion:iglBackendVersion.minorVersion]; } @end ================================================ FILE: shell/ios/main.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #import "AppDelegate.h" #import #import #import int main(int argc, char* argv[]) { igl::shell::Platform::initializeCommandLineArgs(argc, argv); @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } ================================================ FILE: shell/mac/AppDelegate.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #import @interface AppDelegate : NSObject @end ================================================ FILE: shell/mac/AppDelegate.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only // @lint-ignore-every CLANGTIDY NonLocalizedStringChecker #import "AppDelegate.h" #import "ViewController.h" #include #include #import // IWYU pragma: keep namespace { #if IGL_BACKEND_OPENGL NSColorSpace* colorSpaceToNSColorSpace(igl::ColorSpace colorSpace) { switch (colorSpace) { case igl::ColorSpace::SRGB_LINEAR: return [NSColorSpace sRGBColorSpace]; // closest thing to linear srgb case igl::ColorSpace::SRGB_NONLINEAR: return [NSColorSpace sRGBColorSpace]; case igl::ColorSpace::DISPLAY_P3_NONLINEAR: return [NSColorSpace displayP3ColorSpace]; case igl::ColorSpace::DISPLAY_P3_LINEAR: return [NSColorSpace displayP3ColorSpace]; case igl::ColorSpace::EXTENDED_SRGB_LINEAR: return [NSColorSpace extendedSRGBColorSpace]; case igl::ColorSpace::DCI_P3_NONLINEAR: return [NSColorSpace displayP3ColorSpace]; case igl::ColorSpace::ADOBERGB_LINEAR: return [NSColorSpace adobeRGB1998ColorSpace]; case igl::ColorSpace::ADOBERGB_NONLINEAR: return [NSColorSpace adobeRGB1998ColorSpace]; case igl::ColorSpace::PASS_THROUGH: return nil; case igl::ColorSpace::EXTENDED_SRGB_NONLINEAR: return [NSColorSpace extendedSRGBColorSpace]; case igl::ColorSpace::DISPLAY_NATIVE_AMD: return [NSColorSpace deviceRGBColorSpace]; case igl::ColorSpace::BT709_LINEAR: case igl::ColorSpace::BT709_NONLINEAR: case igl::ColorSpace::BT2020_LINEAR: case igl::ColorSpace::HDR10_ST2084: case igl::ColorSpace::DOLBYVISION: case igl::ColorSpace::HDR10_HLG: case igl::ColorSpace::BT2020_NONLINEAR: case igl::ColorSpace::BT601_NONLINEAR: case igl::ColorSpace::BT2100_HLG_NONLINEAR: case igl::ColorSpace::BT2100_PQ_NONLINEAR: IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); return [NSColorSpace sRGBColorSpace]; } IGL_UNREACHABLE_RETURN([NSColorSpace sRGBColorSpace]); } #endif } // namespace @interface AppDelegate () @property (weak) IBOutlet NSWindow* window; @property NSTabViewController* tabViewController; @property std::shared_ptr factory; - (void)addTab:(igl::shell::RenderSessionWindowConfig)windowConfig sessionConfig:(igl::shell::RenderSessionConfig)sessionConfig frame:(CGRect)frame; @end @implementation AppDelegate - (void)applicationDidFinishLaunching:(NSNotification*)aNotification { [self setupViewController]; [self.window makeKeyAndOrderFront:nil]; [self.window makeFirstResponder:self.tabViewController.view]; } - (void)setupViewController { self.tabViewController = [[NSTabViewController alloc] init]; self.factory = igl::shell::createDefaultRenderSessionFactory(); igl::shell::RenderSessionWindowConfig suggestedWindowConfig = { .width = 1024, .height = 768, .windowMode = igl::shell::WindowMode::Window, }; constexpr auto kColorFramebufferFormat = igl::TextureFormat::BGRA_SRGB; std::vector suggestedSessionConfigs = { #if IGL_BACKEND_HEADLESS { .displayName = "Headless", .backendVersion = {.flavor = igl::BackendFlavor::Invalid, .majorVersion = 0, .minorVersion = 0}, .swapchainColorTextureFormat = igl::TextureFormat::RGBA_SRGB, // special case that should // probably go through // swiftshader instead }, #endif #if IGL_BACKEND_METAL { .displayName = "Metal", .backendVersion = {.flavor = igl::BackendFlavor::Metal, .majorVersion = 3, .minorVersion = 0}, .swapchainColorTextureFormat = kColorFramebufferFormat, }, #endif #if IGL_BACKEND_OPENGL { .displayName = "OGL 4.1", .backendVersion = {.flavor = igl::BackendFlavor::OpenGL, .majorVersion = 4, .minorVersion = 1}, .swapchainColorTextureFormat = kColorFramebufferFormat, }, // clang-format off // @fb-only // clang-format on // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only #endif // @fb-only // clang-format off // @fb-only // clang-format on // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only #if IGL_BACKEND_VULKAN { #if IGL_USE_STATIC_LAVAPIPE .displayName = "Vulkan (Lavapipe)", #else .displayName = "Vulkan", #endif .backendVersion = {.flavor = igl::BackendFlavor::Vulkan, .majorVersion = 1, .minorVersion = 1}, .swapchainColorTextureFormat = kColorFramebufferFormat, }, #endif }; const auto requestedWindowConfig = self.factory->requestedWindowConfig(igl::shell::ShellType::Mac, suggestedWindowConfig); IGL_DEBUG_ASSERT(requestedWindowConfig.windowMode == igl::shell::WindowMode::Window || requestedWindowConfig.windowMode == igl::shell::WindowMode::MaximizedWindow); CGRect frame = requestedWindowConfig.windowMode == igl::shell::WindowMode::Window ? [self.window frame] : [[NSScreen mainScreen] frame]; if (requestedWindowConfig.windowMode == igl::shell::WindowMode::Window) { frame.size = CGSizeMake(requestedWindowConfig.width, requestedWindowConfig.height); } const auto requestedSessionConfigs = self.factory->requestedSessionConfigs( igl::shell::ShellType::Mac, std::move(suggestedSessionConfigs)); for (const auto& sessionConfig : requestedSessionConfigs) { [self addTab:requestedWindowConfig sessionConfig:sessionConfig frame:frame]; } } - (void)addTab:(igl::shell::RenderSessionWindowConfig)windowConfig sessionConfig:(igl::shell::RenderSessionConfig)sessionConfig frame:(CGRect)frame { ViewController* viewController = nullptr; bool supported = false; #if IGL_BACKEND_HEADLESS if (sessionConfig.backendVersion.flavor == igl::BackendFlavor::Invalid) { supported = true; } #endif #if IGL_BACKEND_METAL if (sessionConfig.backendVersion.flavor == igl::BackendFlavor::Metal) { supported = true; } #endif #if IGL_BACKEND_OPENGL if (sessionConfig.backendVersion.flavor == igl::BackendFlavor::OpenGL) { supported = true; NSColorSpace* metalColorSpace = colorSpaceToNSColorSpace(viewController.colorSpace); [self.window setColorSpace:metalColorSpace]; } #endif // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only #if IGL_BACKEND_VULKAN if (sessionConfig.backendVersion.flavor == igl::BackendFlavor::Vulkan) { supported = true; } #endif if (!IGL_DEBUG_VERIFY(supported)) { return; } NSTabViewItem* tabViewItem = [[NSTabViewItem alloc] initWithIdentifier:nil]; viewController = [[ViewController alloc] initWithFrame:frame factory:*self.factory config:sessionConfig]; tabViewItem.viewController = viewController; tabViewItem.label = [NSString stringWithUTF8String:sessionConfig.displayName.c_str()]; [self.tabViewController addTabViewItem:tabViewItem]; self.window.contentViewController = self.tabViewController; [self.window setFrame:viewController.frame display:YES animate:false]; } - (void)tearDownViewController { if (self.tabViewController != nil) { for (NSInteger i = 0; i < [[self.tabViewController tabViewItems] count]; ++i) { NSTabViewItem* item = [self.tabViewController tabViewItems][i]; ViewController* controller = (ViewController*)item.viewController; [controller teardown]; } } self.tabViewController = nil; self.window.contentViewController = nil; } - (IBAction)didClickTearDownViewController:(id)sender { [self tearDownViewController]; } - (IBAction)didClickReloadViewController:(id)sender { [self tearDownViewController]; [self setupViewController]; } - (void)applicationWillTerminate:(NSNotification*)aNotification { // Insert code here to tear down your application [self tearDownViewController]; } - (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication*)sender { return YES; } @end ================================================ FILE: shell/mac/CMakeLists.txt ================================================ # Copyright (c) Meta Platforms, Inc. and affiliates. # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. cmake_minimum_required(VERSION 3.19) set(PROJECT_NAME "Mac") file(GLOB PLATFORM_SHARED_SRC_CPP_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ../shared/imageWriter/stb/*.cpp ../shared/platform/mac/*.cpp) file(GLOB PLATFORM_SHARED_SRC_OBJC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ../shared/fileLoader/apple/*.mm ../shared/imageWriter/mac/*.mm) file(GLOB PLATFORM_SHARED_HEADER_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ../shared/fileLoader/apple/*.h ../shared/imageWriter/mac/*.h ../shared/imageWriter/stb/*.h ../shared/platform/mac/*.h) add_library(IGLShellPlatform ${PLATFORM_SHARED_SRC_CPP_FILES} ${PLATFORM_SHARED_SRC_OBJC_FILES} ${PLATFORM_SHARED_HEADER_FILES}) target_link_libraries(IGLShellPlatform PUBLIC IGLLibrary) igl_set_folder(IGLShellPlatform "IGL") igl_set_cxxstd(IGLShellPlatform 20) if(CMAKE_GENERATOR STREQUAL "Xcode") set_target_properties(IGLShellShared PROPERTIES XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_WEAK YES) set_target_properties(IGLShellShared PROPERTIES XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC YES) set_target_properties(IGLShellPlatform PROPERTIES XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_WEAK YES) set_target_properties(IGLShellPlatform PROPERTIES XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC YES) else() set_source_files_properties(${PLATFORM_SHARED_SRC_OBJC_FILES} PROPERTIES COMPILE_OPTIONS "-fobjc-arc;-fobjc-weak") endif() function(ADD_SHELL_SESSION_WITH_SRCS target srcs libs) set(XIBFILE ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../resources/mac/Base.lproj/MainMenu.xib) file(GLOB SHELL_SESSION_SRC_FILES LIST_DIRECTORIES false ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/*.mm ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/*.m) file(GLOB SHELL_SESSION_HEADER_FILES LIST_DIRECTORIES false ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/*.h) file(GLOB RESOURCES LIST_DIRECTORIES false ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../resources/images/*.png) add_executable(${target} MACOSX_BUNDLE ${srcs} "${SHELL_SESSION_SRC_FILES}" "${SHELL_SESSION_SHELL_HEADER_FILES}" "${XIBFILE}" "${RESOURCES}") igl_set_folder(${target} "IGL Shell Sessions") igl_set_cxxstd(${target} 20) target_compile_definitions(${target} PRIVATE "IGL_SHELL_SESSION=${target}") target_link_libraries(${target} PUBLIC ${libs}) target_link_libraries(${target} PUBLIC IGLShellShared) target_link_libraries(${target} PUBLIC IGLShellPlatform) if(CMAKE_GENERATOR STREQUAL "Xcode") set_target_properties(${target} PROPERTIES XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_WEAK YES) set_target_properties(${target} PROPERTIES XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC YES) else() set_source_files_properties(${SHELL_SESSION_SRC_FILES} PROPERTIES COMPILE_OPTIONS "-fobjc-arc;-fobjc-weak") # See https://catfox.life/2022/08/14/compiling-xibs-with-cmake-without-xcode/ find_program(IBTOOL ibtool REQUIRED) get_filename_component(XIBFILENAME ${XIBFILE} NAME_WE) add_custom_command(TARGET ${target} POST_BUILD COMMAND ${IBTOOL} --compile ${CMAKE_CURRENT_BINARY_DIR}/${target}.app/Contents/Resources/${XIBFILENAME}.nib ${XIBFILE} COMMENT "Compiling NIB file ${XIBFILE}.nib") endif() target_link_libraries( ${target} PUBLIC "-framework AVFoundation" "-framework CoreGraphics" "-framework CoreMotion" "-framework AppKit" "-framework Metal" "-framework MetalKit" "-framework OpenGL" "-framework QuartzCore") set_target_properties(${target} PROPERTIES MACOSX_BUNDLE TRUE RESOURCE "${XIBFILE}") set_source_files_properties(${RESOURCES} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) endfunction() ================================================ FILE: shell/mac/GLView.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #import @interface GLView : NSOpenGLView { } - (void)startTimer; - (void)stopTimer; @end ================================================ FILE: shell/mac/GLView.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #import "GLView.h" #import "AppDelegate.h" #import "ViewController.h" #import @interface GLView () { CVDisplayLinkRef _displayLink; // display link for managing rendering thread } @property (weak) ViewController* viewController; @end @implementation GLView { NSTrackingArea* _trackingArea; // needed for mouseMoved: events } @synthesize viewController = _viewController; - (id)initWithFrame:(NSRect)frame { if (self = [super initWithFrame:frame]) { [self addFullScreenTrackingArea]; } return self; } - (void)addFullScreenTrackingArea { _trackingArea = [[NSTrackingArea alloc] initWithRect:self.bounds options:NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | NSTrackingActiveInKeyWindow owner:self userInfo:nil]; [self addTrackingArea:_trackingArea]; } - (void)updateTrackingAreas { [self removeTrackingArea:_trackingArea]; [self addFullScreenTrackingArea]; } - (void)dealloc { CVDisplayLinkRelease(_displayLink); } - (void)prepareOpenGL { [super prepareOpenGL]; NSApplication* app = [NSApplication sharedApplication]; NSWindow* window = [app windows][0]; NSTabViewController* tabController = (NSTabViewController*)window.contentViewController; NSTabViewItem* item = tabController.tabViewItems[tabController.selectedTabViewItemIndex]; ViewController* controller = (ViewController*)item.viewController; self.viewController = controller; [controller initModule]; [self initTimer]; [self startTimer]; } static CVReturn displayLinkCallback(CVDisplayLinkRef /*displayLink*/, const CVTimeStamp* /*now*/, const CVTimeStamp* /*outputTime*/, CVOptionFlags /*flagsIn*/, CVOptionFlags* /*flagsOut*/, void* userdata) { // TODO: For some reason, OpenGL is crashing when called from display link thread // so we use setNeedsDisplay for now. [(__bridge GLView*)userdata performSelectorOnMainThread:@selector(invalidateFrame) withObject:nil waitUntilDone:NO]; return kCVReturnSuccess; } - (void)initTimer { // Synchronize buffer swaps with vertical refresh rate GLint swapInt = 1; [[self openGLContext] setValues:&swapInt forParameter:NSOpenGLContextParameterSwapInterval]; // Create a display link capable of being used with all active displays CVDisplayLinkCreateWithActiveCGDisplays(&_displayLink); // Set the renderer output callback function CVDisplayLinkSetOutputCallback(_displayLink, &displayLinkCallback, (__bridge void*)self); // Set the display link for the current renderer NSOpenGLContext* glContext = [self openGLContext]; CGLContextObj cglContext = [glContext CGLContextObj]; CGLPixelFormatObj cglPixelFormat = [[glContext pixelFormat] CGLPixelFormatObj]; CVDisplayLinkSetCurrentCGDisplayFromOpenGLContext(_displayLink, cglContext, cglPixelFormat); } - (void)startTimer { CVDisplayLinkStart(_displayLink); } - (void)stopTimer { CVDisplayLinkStop(_displayLink); } - (void)invalidateFrame { [self setNeedsDisplay:YES]; } - (void)drawRect:(NSRect)bounds { [self.viewController render]; } @end ================================================ FILE: shell/mac/HeadlessView.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #import @interface HeadlessView : NSView { } - (void)startTimer; - (void)stopTimer; - (void)prepareHeadless; @end ================================================ FILE: shell/mac/HeadlessView.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #import "HeadlessView.h" #import "ViewController.h" #import #import #import #import #import #import @interface HeadlessView () { CVDisplayLinkRef _displayLink; // display link for managing rendering thread NSTrackingArea* _trackingArea; // needed for mouseMoved: events } @property (weak) ViewController* viewController; @end @implementation HeadlessView @synthesize viewController = _viewController; - (void)dealloc { CVDisplayLinkRelease(_displayLink); } - (void)prepareHeadless { NSApplication* app = [NSApplication sharedApplication]; NSWindow* window = [app windows][0]; NSTabViewController* tabController = (NSTabViewController*)window.contentViewController; NSTabViewItem* item = tabController.tabViewItems[tabController.selectedTabViewItemIndex]; ViewController* controller = (ViewController*)item.viewController; self.viewController = controller; [controller initModule]; [self initTimer]; [self startTimer]; } static CVReturn displayLinkCallback( CVDisplayLinkRef /*displayLink*/, // NOLINT(readability-identifier-naming) const CVTimeStamp* /*now*/, const CVTimeStamp* /*outputTime*/, CVOptionFlags /*flagsIn*/, CVOptionFlags* /*flagsOut*/, void* userdata) { auto view = (__bridge HeadlessView*)userdata; [view.viewController performSelectorOnMainThread:@selector(render) withObject:nil waitUntilDone:YES]; return kCVReturnSuccess; } - (void)initTimer { // Create a display link capable of being used with all active displays CVDisplayLinkCreateWithActiveCGDisplays(&_displayLink); // Set the renderer output callback function CVDisplayLinkSetOutputCallback(_displayLink, &displayLinkCallback, (__bridge void*)self); } - (void)startTimer { CVDisplayLinkStart(_displayLink); } - (void)stopTimer { CVDisplayLinkStop(_displayLink); } - (void)addFullScreenTrackingArea { _trackingArea = [[NSTrackingArea alloc] initWithRect:self.bounds options:NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | NSTrackingActiveInKeyWindow owner:self userInfo:nil]; [self addTrackingArea:_trackingArea]; } - (void)updateTrackingAreas { [self removeTrackingArea:_trackingArea]; [self addFullScreenTrackingArea]; } @end ================================================ FILE: shell/mac/MetalView.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #import @interface MetalView : MTKView { } - (void)setViewController:(NSViewController*)newController; @end ================================================ FILE: shell/mac/MetalView.m ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #import "MetalView.h" @implementation MetalView { NSTrackingArea* _trackingArea; // needed for mouseMoved: events IBOutlet NSViewController* _viewController; } - (id)initWithFrame:(NSRect)frame device:(nullable id)device { if (self = [super initWithFrame:frame device:device]) { [self addFullScreenTrackingArea]; } return self; } - (void)setViewController:(NSViewController*)newController { if (_viewController) { NSResponder* _Nullable controllerNextResponder = [_viewController nextResponder]; [super setNextResponder:controllerNextResponder]; [_viewController setNextResponder:nil]; } _viewController = newController; if (newController) { NSResponder* _Nullable ownNextResponder = [self nextResponder]; [super setNextResponder:_viewController]; [_viewController setNextResponder:ownNextResponder]; } } - (void)addFullScreenTrackingArea { _trackingArea = [[NSTrackingArea alloc] initWithRect:self.bounds options:NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | NSTrackingActiveInKeyWindow owner:self userInfo:nil]; [self addTrackingArea:_trackingArea]; } - (void)updateTrackingAreas { [self removeTrackingArea:_trackingArea]; [self addFullScreenTrackingArea]; } - (void)setNextResponder:(NSResponder*)newNextResponder { if (_viewController) { [_viewController setNextResponder:newNextResponder]; return; } [super setNextResponder:newNextResponder]; } - (BOOL)acceptsFirstResponder { return YES; } - (void)keyUp:(NSEvent*)event { if (_viewController) { [_viewController keyUp:event]; } } - (void)keyDown:(NSEvent*)event { if (_viewController) { [_viewController keyDown:event]; } } @end ================================================ FILE: shell/mac/ViewController.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #import // IWYU pragma: keep #import #import #import #import NS_ASSUME_NONNULL_BEGIN @interface ViewController : NSViewController @property (nonatomic) NSView* iglView; - (instancetype)initWithFrame:(CGRect)frame factory:(igl::shell::IRenderSessionFactory&)factory config:(igl::shell::RenderSessionConfig)config; // Explicitly disable superclass' designated initializers - (instancetype)initWithNibName:(nullable NSNibName)nibNameOrNil bundle:(nullable NSBundle*)nibBundleOrNil NS_UNAVAILABLE; - (nullable instancetype)initWithCoder:(NSCoder*)coder NS_UNAVAILABLE; - (void)initModule; - (void)render; - (void)teardown; - (CGRect)frame; - (igl::ColorSpace)colorSpace; @end NS_ASSUME_NONNULL_END ================================================ FILE: shell/mac/ViewController.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #import "ViewController.h" #import "GLView.h" #import "HeadlessView.h" #import "MetalView.h" // @fb-only #import #import #import #import #import #import #include #import #import #if IGL_BACKEND_METAL #include #include #include #include #endif #if IGL_BACKEND_OPENGL #include #include #include #endif #include #include #include #include // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only #if IGL_BACKEND_VULKAN #import "VulkanView.h" #include #include #include #endif #import #import using namespace igl; @interface ViewController () { igl::shell::IRenderSessionFactory* _factory; igl::shell::RenderSessionConfig _config; igl::shell::ShellParams _shellParams; CGRect _frame; CVDisplayLinkRef _displayLink; // For OpenGL (via GLView) and opt-in Metal timer rendering id _currentDrawable; id _depthStencilTexture; std::shared_ptr _shellPlatform; std::unique_ptr _session; float _kMouseSpeed; } @end @implementation ViewController @synthesize iglView = _iglView; ///-------------------------------------- /// MARK: - Init ///-------------------------------------- - (instancetype)initWithFrame:(CGRect)frame factory:(igl::shell::IRenderSessionFactory&)factory config:(igl::shell::RenderSessionConfig)config { self = [super initWithNibName:nil bundle:nil]; if (!self) { return self; } self->_config = std::move(config); self->_factory = &factory; self->_shellParams = igl::shell::ShellParams(); self->_shellParams.viewportSize.x = frame.size.width; self->_shellParams.viewportSize.y = frame.size.height; self->_frame = frame; self->_kMouseSpeed = 0.05f; self->_currentDrawable = nil; self->_depthStencilTexture = nil; return self; } - (void)initModule { } - (void)teardown { if (_session) { _session->teardown(); } _session = nullptr; _shellPlatform = nullptr; } - (void)render { if (_session == nullptr) { return; } const NSRect contentRect = self.view.frame; _shellParams.viewportSize = glm::vec2(contentRect.size.width, contentRect.size.height); _shellParams.viewportScale = self.view.window.backingScaleFactor; _session->setShellParams(_shellParams); // process user input _shellPlatform->getInputDispatcher().processEvents(); igl::SurfaceTextures surfaceTextures; if (_config.backendVersion.flavor != igl::BackendFlavor::Invalid && _shellPlatform->getDevicePtr() != nullptr) { // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // surface textures surfaceTextures = igl::SurfaceTextures{.color = [self createTextureFromNativeDrawable], .depth = [self createTextureFromNativeDepth]}; IGL_DEBUG_ASSERT(surfaceTextures.color != nullptr && surfaceTextures.depth != nullptr); const auto& dims = surfaceTextures.color->getDimensions(); _shellParams.nativeSurfaceDimensions = glm::ivec2{dims.width, dims.height}; // update retina scale float pixelsPerPoint = _shellParams.nativeSurfaceDimensions.x / _shellParams.viewportSize.x; _session->setPixelsPerPoint(pixelsPerPoint); // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only } // Use runUpdate() which automatically handles benchmark timing, reporting, and expiration _session->runUpdate(std::move(surfaceTextures)); if (_session->appParams().exitRequested) { [[NSApplication sharedApplication] terminate:nil]; } } - (void)loadView { // We don't care about the device type, just // return something that works HWDeviceQueryDesc queryDesc(HWDeviceType::Unknown); switch (_config.backendVersion.flavor) { case igl::BackendFlavor::Invalid: { auto headlessView = [[HeadlessView alloc] initWithFrame:_frame]; self.view = headlessView; // @fb-only // @fb-only // Headless platform does not run on a real device _shellPlatform = std::make_shared(nullptr); [headlessView prepareHeadless]; break; } #if IGL_BACKEND_METAL case igl::BackendFlavor::Metal: { auto hwDevices = metal::HWDevice().queryDevices(queryDesc, nullptr); auto device = metal::HWDevice().create(hwDevices[0], nullptr); auto d = static_cast(device.get())->get(); auto metalView = [[MetalView alloc] initWithFrame:_frame device:d]; metalView.depthStencilPixelFormat = MTLPixelFormatDepth32Float_Stencil8; metalView.delegate = self; metalView.colorPixelFormat = metal::Texture::textureFormatToMTLPixelFormat(_config.swapchainColorTextureFormat); metalView.colorspace = metal::colorSpaceToCGColorSpace(_config.swapchainColorSpace); metalView.framebufferOnly = NO; [metalView setViewController:self]; self.view = metalView; _shellPlatform = std::make_shared(std::move(device)); break; } #endif #if IGL_BACKEND_OPENGL case igl::BackendFlavor::OpenGL: { const bool enableStencilBuffer = _config.depthTextureFormat == igl::TextureFormat::S8_UInt_Z24_UNorm || _config.depthTextureFormat == igl::TextureFormat::S_UInt8; const NSOpenGLPixelFormatAttribute stencilSize = enableStencilBuffer ? 8 : 0; NSOpenGLPixelFormat* pixelFormat; if (_config.backendVersion.majorVersion == 4 && _config.backendVersion.minorVersion == 1) { static NSOpenGLPixelFormatAttribute attributes[] = { NSOpenGLPFADoubleBuffer, NSOpenGLPFAAllowOfflineRenderers, NSOpenGLPFAMultisample, 1, NSOpenGLPFASampleBuffers, 1, NSOpenGLPFASamples, 4, NSOpenGLPFAColorSize, 32, NSOpenGLPFADepthSize, 24, NSOpenGLPFAStencilSize, stencilSize, NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion4_1Core, 0, }; pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes]; IGL_DEBUG_ASSERT(pixelFormat, "Requested attributes not supported"); } else if (_config.backendVersion.majorVersion == 3 && _config.backendVersion.minorVersion == 2) { static NSOpenGLPixelFormatAttribute attributes[] = { NSOpenGLPFADoubleBuffer, NSOpenGLPFAAllowOfflineRenderers, NSOpenGLPFAMultisample, 1, NSOpenGLPFASampleBuffers, 1, NSOpenGLPFASamples, 4, NSOpenGLPFAColorSize, 32, NSOpenGLPFADepthSize, 24, NSOpenGLPFAStencilSize, stencilSize, NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core, 0, }; pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes]; } else if (_config.backendVersion.majorVersion == 2 && _config.backendVersion.minorVersion == 1) { static NSOpenGLPixelFormatAttribute attributes[] = { NSOpenGLPFADoubleBuffer, NSOpenGLPFAAllowOfflineRenderers, NSOpenGLPFAMultisample, 1, NSOpenGLPFASampleBuffers, 1, NSOpenGLPFASamples, 4, NSOpenGLPFAColorSize, 32, NSOpenGLPFADepthSize, 24, NSOpenGLPFAStencilSize, stencilSize, NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersionLegacy, 0, }; pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes]; } else { IGL_DEBUG_ABORT("Unsupported OpenGL version: %u.%u\n", _config.backendVersion.majorVersion, _config.backendVersion.minorVersion); } auto openGLView = [[GLView alloc] initWithFrame:_frame pixelFormat:pixelFormat]; igl::Result result; auto context = igl::opengl::macos::Context::createContext(openGLView.openGLContext, &result); IGL_DEBUG_ASSERT(result.isOk()); _shellPlatform = std::make_shared( opengl::macos::HWDevice().createWithContext(std::move(context), nullptr)); auto& device = _shellPlatform->getDevice(); auto* platformDevice = device.getPlatformDevice(); platformDevice->setNativeDrawableTextureFormat(_config.swapchainColorTextureFormat, nullptr); self.view = openGLView; break; } #endif #if IGL_BACKEND_VULKAN case igl::BackendFlavor::Vulkan: { auto vulkanView = [[VulkanView alloc] initWithFrame:_frame]; self.view = vulkanView; // vulkanView.wantsLayer = // YES; // Back the view with a layer created by the makeBackingLayer method. igl::vulkan::VulkanContextConfig vulkanContextConfig; vulkanContextConfig.terminateOnValidationError = true; vulkanContextConfig.swapChainColorSpace = _config.swapchainColorSpace; vulkanContextConfig.requestedSwapChainTextureFormat = _config.swapchainColorTextureFormat; auto context = igl::vulkan::HWDevice::createContext(vulkanContextConfig, (__bridge void*)vulkanView); auto devices = igl::vulkan::HWDevice::queryDevices( *context, igl::HWDeviceQueryDesc(igl::HWDeviceType::DiscreteGpu), nullptr); if (devices.empty()) { devices = igl::vulkan::HWDevice::queryDevices( *context, igl::HWDeviceQueryDesc(igl::HWDeviceType::IntegratedGpu), nullptr); } if (devices.empty()) { devices = igl::vulkan::HWDevice::queryDevices( *context, igl::HWDeviceQueryDesc(igl::HWDeviceType::SoftwareGpu), nullptr); } auto device = igl::vulkan::HWDevice::create( std::move(context), devices[0], 0, 0, 0, nullptr, nullptr, "IGL Shell", nullptr); _shellPlatform = std::make_shared(std::move(device)); [vulkanView prepareVulkan:_shellPlatform.get()]; break; } #endif // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only default: { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); break; } } _session = _factory->createRenderSession(_shellPlatform); IGL_DEBUG_ASSERT(_session, "createDefaultRenderSession() must return a valid session"); // Get initial native surface dimensions _shellParams.nativeSurfaceDimensions = glm::ivec2(2048, 1536); auto args = shell::convertArgvToParams(igl::shell::Platform::argc(), igl::shell::Platform::argv()); shell::parseShellParams(args, _shellParams); // When timer rendering is opted in, configure the Metal view for external // CVDisplayLink-driven rendering instead of MTKView's internal display link // (which may not fire for non-frontmost apps on macOS). if (_shellParams.useTimerRendering && [self.view isKindOfClass:[MetalView class]]) { MetalView* metalView = (MetalView*)self.view; metalView.enableSetNeedsDisplay = YES; metalView.paused = YES; } _session->setShellParams(_shellParams); _session->initialize(); } static CVReturn metalDisplayLinkCallback(CVDisplayLinkRef /*displayLink*/, const CVTimeStamp* /*now*/, const CVTimeStamp* /*outputTime*/, CVOptionFlags /*flagsIn*/, CVOptionFlags* /*flagsOut*/, void* userdata) { [(__bridge ViewController*)userdata performSelectorOnMainThread:@selector(triggerMetalRender) withObject:nil waitUntilDone:NO]; return kCVReturnSuccess; } - (void)triggerMetalRender { [self.view setNeedsDisplay:YES]; } - (void)viewDidAppear { if ([self.view isKindOfClass:[MetalView class]]) { if (_shellParams.useTimerRendering) { // Use a CVDisplayLink to drive Metal rendering, synced to the display refresh // rate. MTKView's internal CVDisplayLink may not fire for non-frontmost apps // (e.g., when launched from automated tools for screenshot capture). CVDisplayLinkCreateWithActiveCGDisplays(&_displayLink); CVDisplayLinkSetOutputCallback(_displayLink, &metalDisplayLinkCallback, (__bridge void*)self); CVDisplayLinkStart(_displayLink); } else { MetalView* v = (MetalView*)self.view; v.paused = NO; } } else if ([self.view isKindOfClass:[GLView class]]) { GLView* v = (GLView*)self.view; [v startTimer]; } [self.view.window makeFirstResponder:self]; } - (void)viewWillDisappear { if ([self.view isKindOfClass:[MetalView class]]) { if (_shellParams.useTimerRendering) { CVDisplayLinkStop(_displayLink); CVDisplayLinkRelease(_displayLink); _displayLink = NULL; } else { MetalView* v = (MetalView*)self.view; v.paused = YES; } } else if ([self.view isKindOfClass:[GLView class]]) { GLView* v = (GLView*)self.view; [v stopTimer]; } } - (void)drawInMTKView:(nonnull MTKView*)view { @autoreleasepool { _currentDrawable = view.currentDrawable; _depthStencilTexture = view.depthStencilTexture; [self render]; _currentDrawable = nil; } } - (void)mtkView:(nonnull MTKView*)view drawableSizeWillChange:(CGSize)size { _frame.size = size; } - (void)mtkView:(nonnull MTKView*)view drawableSizeDidChange:(CGSize)size { } - (std::shared_ptr)createTextureFromNativeDrawable { switch (_config.backendVersion.flavor) { #if IGL_BACKEND_METAL case igl::BackendFlavor::Metal: { auto& device = _shellPlatform->getDevice(); auto* platformDevice = device.getPlatformDevice(); IGL_DEBUG_ASSERT(platformDevice); IGL_DEBUG_ASSERT(_currentDrawable != nil); auto texture = platformDevice->createTextureFromNativeDrawable(_currentDrawable, nullptr); return texture; } #endif #if IGL_BACKEND_OPENGL case igl::BackendFlavor::OpenGL: { auto& device = _shellPlatform->getDevice(); auto* platformDevice = device.getPlatformDevice(); IGL_DEBUG_ASSERT(platformDevice); auto texture = platformDevice->createTextureFromNativeDrawable(nullptr); return texture; } #endif #if IGL_BACKEND_VULKAN case igl::BackendFlavor::Vulkan: { auto& device = _shellPlatform->getDevice(); auto* platformDevice = device.getPlatformDevice(); IGL_DEBUG_ASSERT(platformDevice); auto texture = platformDevice->createTextureFromNativeDrawable(nullptr); return texture; } #endif // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only default: { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); return nullptr; } } } - (std::shared_ptr)createTextureFromNativeDepth { switch (_config.backendVersion.flavor) { #if IGL_BACKEND_METAL case igl::BackendFlavor::Metal: { auto& device = _shellPlatform->getDevice(); auto* platformDevice = device.getPlatformDevice(); IGL_DEBUG_ASSERT(platformDevice); auto texture = platformDevice->createTextureFromNativeDepth(_depthStencilTexture, nullptr); return texture; } #endif #if IGL_BACKEND_OPENGL case igl::BackendFlavor::OpenGL: { auto& device = _shellPlatform->getDevice(); auto* platformDevice = device.getPlatformDevice(); IGL_DEBUG_ASSERT(platformDevice); auto texture = platformDevice->createTextureFromNativeDepth(nullptr); return texture; } #endif #if IGL_BACKEND_VULKAN case igl::BackendFlavor::Vulkan: { auto& device = static_cast(_shellPlatform->getDevice()); auto extents = device.getVulkanContext().getSwapchainExtent(); auto* platformDevice = _shellPlatform->getDevice().getPlatformDevice(); IGL_DEBUG_ASSERT(platformDevice); auto texture = platformDevice->createTextureFromNativeDepth(extents.width, extents.height, nullptr); return texture; } #endif // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only default: { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); return nullptr; } } } - (BOOL)acceptsFirstResponder { return YES; } - (NSPoint)locationForEvent:(NSEvent*)event { NSRect contentRect = self.view.frame; NSPoint pos = [event locationInWindow]; return NSMakePoint(pos.x, contentRect.size.height - pos.y); } static uint32_t getModifiers(NSEvent* event) { uint32_t modifiers = igl::shell::kKeyEventModifierNone; const NSUInteger flags = [event modifierFlags] & NSEventModifierFlagDeviceIndependentFlagsMask; if (flags & NSEventModifierFlagShift) { modifiers |= igl::shell::kKeyEventModifierShift; } if (flags & NSEventModifierFlagCapsLock) { modifiers |= igl::shell::kKeyEventModifierCapsLock; } if (flags & NSEventModifierFlagControl) { modifiers |= igl::shell::kKeyEventModifierControl; } if (flags & NSEventModifierFlagOption) { modifiers |= igl::shell::kKeyEventModifierOption; } if (flags & NSEventModifierFlagCommand) { modifiers |= igl::shell::kKeyEventModifierCommand; } if (flags & NSEventModifierFlagNumericPad) { modifiers |= igl::shell::kKeyEventModifierNumLock; } return modifiers; } - (void)keyUp:(NSEvent*)event { _shellPlatform->getInputDispatcher().queueEvent( igl::shell::KeyEvent(false, event.keyCode, getModifiers(event))); } - (void)keyDown:(NSEvent*)event { _shellPlatform->getInputDispatcher().queueEvent( igl::shell::KeyEvent(true, event.keyCode, getModifiers(event))); std::string characters([event.characters UTF8String]); for (const auto& c : characters) { _shellPlatform->getInputDispatcher().queueEvent(igl::shell::CharEvent{.character = c}); } } - (void)mouseDown:(NSEvent*)event { NSPoint curPoint = [self locationForEvent:event]; _shellPlatform->getInputDispatcher().queueEvent( igl::shell::MouseButtonEvent(igl::shell::MouseButton::Left, true, curPoint.x, curPoint.y)); } - (void)rightMouseDown:(NSEvent*)event { NSPoint curPoint = [self locationForEvent:event]; _shellPlatform->getInputDispatcher().queueEvent( igl::shell::MouseButtonEvent(igl::shell::MouseButton::Right, true, curPoint.x, curPoint.y)); } - (void)otherMouseDown:(NSEvent*)event { NSPoint curPoint = [self locationForEvent:event]; _shellPlatform->getInputDispatcher().queueEvent( igl::shell::MouseButtonEvent(igl::shell::MouseButton::Middle, true, curPoint.x, curPoint.y)); } - (void)mouseUp:(NSEvent*)event { NSPoint curPoint = [self locationForEvent:event]; _shellPlatform->getInputDispatcher().queueEvent( igl::shell::MouseButtonEvent(igl::shell::MouseButton::Left, false, curPoint.x, curPoint.y)); } - (void)rightMouseUp:(NSEvent*)event { NSPoint curPoint = [self locationForEvent:event]; _shellPlatform->getInputDispatcher().queueEvent( igl::shell::MouseButtonEvent(igl::shell::MouseButton::Right, false, curPoint.x, curPoint.y)); } - (void)otherMouseUp:(NSEvent*)event { NSPoint curPoint = [self locationForEvent:event]; _shellPlatform->getInputDispatcher().queueEvent( igl::shell::MouseButtonEvent(igl::shell::MouseButton::Middle, false, curPoint.x, curPoint.y)); } - (void)mouseMoved:(NSEvent*)event { NSPoint curPoint = [self locationForEvent:event]; _shellPlatform->getInputDispatcher().queueEvent( igl::shell::MouseMotionEvent(curPoint.x, curPoint.y, event.deltaX, event.deltaY)); } - (void)mouseDragged:(NSEvent*)event { NSPoint curPoint = [self locationForEvent:event]; _shellPlatform->getInputDispatcher().queueEvent( igl::shell::MouseMotionEvent(curPoint.x, curPoint.y, event.deltaX, event.deltaY)); } - (void)rightMouseDragged:(NSEvent*)event { NSPoint curPoint = [self locationForEvent:event]; _shellPlatform->getInputDispatcher().queueEvent( igl::shell::MouseMotionEvent(curPoint.x, curPoint.y, event.deltaX, event.deltaY)); } - (void)otherMouseDragged:(NSEvent*)event { NSPoint curPoint = [self locationForEvent:event]; _shellPlatform->getInputDispatcher().queueEvent( igl::shell::MouseMotionEvent(curPoint.x, curPoint.y, event.deltaX, event.deltaY)); } - (void)scrollWheel:(NSEvent*)event { _shellPlatform->getInputDispatcher().queueEvent(igl::shell::MouseWheelEvent( event.scrollingDeltaX * _kMouseSpeed, event.scrollingDeltaY * _kMouseSpeed)); } - (CGRect)frame { return _frame; } - (igl::ColorSpace)colorSpace { return _config.swapchainColorSpace; } @end ================================================ FILE: shell/mac/VulkanView.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #import #include #include @interface VulkanView : NSView { } - (void)startTimer; - (void)stopTimer; - (void)prepareVulkan:(igl::shell::Platform*)platform; - (void)viewDidChangeBackingProperties; - (void)frameDidChange:(NSNotification*)notification; - (void)updateSwapchain; @end ================================================ FILE: shell/mac/VulkanView.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #import "VulkanView.h" #import "AppDelegate.h" #import "ViewController.h" // IWYU pragma: keep #import #if IGL_BACKEND_VULKAN #include #include #include #endif @interface VulkanView () { CVDisplayLinkRef _displayLink; // display link for managing rendering thread igl::shell::Platform* _shellPlatform; IBOutlet NSViewController* _viewController; } @end @implementation VulkanView - (void)dealloc { CVDisplayLinkRelease(_displayLink); _shellPlatform = nullptr; } - (void)prepareVulkan:(igl::shell::Platform*)platform { NSApplication* app = [NSApplication sharedApplication]; NSWindow* window = [app windows][0]; NSTabViewController* tabController = (NSTabViewController*)window.contentViewController; NSTabViewItem* item = tabController.tabViewItems[tabController.selectedTabViewItemIndex]; ViewController* controller = (ViewController*)item.viewController; self->_viewController = controller; _shellPlatform = platform; self.postsFrameChangedNotifications = YES; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(frameDidChange:) name:NSViewFrameDidChangeNotification object:self]; [controller initModule]; [self initTimer]; [self startTimer]; } static CVReturn displayLinkCallback(CVDisplayLinkRef /*displayLink*/, const CVTimeStamp* /*now*/, const CVTimeStamp* /*outputTime*/, CVOptionFlags /*flagsIn*/, CVOptionFlags* /*flagsOut*/, void* userdata) { auto view = (__bridge VulkanView*)userdata; [view->_viewController performSelectorOnMainThread:@selector(render) withObject:nil waitUntilDone:NO]; return kCVReturnSuccess; } - (void)initTimer { // Create a display link capable of being used with all active displays CVDisplayLinkCreateWithActiveCGDisplays(&_displayLink); // Set the renderer output callback function CVDisplayLinkSetOutputCallback(_displayLink, &displayLinkCallback, (__bridge void*)self); } - (void)startTimer { CVDisplayLinkStart(_displayLink); } - (void)stopTimer { CVDisplayLinkStop(_displayLink); } /** Indicates that the view wants to draw using the backing layer instead of using drawRect:. */ - (BOOL)wantsUpdateLayer { return YES; } - (void)viewDidChangeBackingProperties { [self updateSwapchain]; } - (void)updateSwapchain { const NSRect contentRect = [self frame]; const NSRect imageRect = [self convertRectToBacking:contentRect]; const float xscale = imageRect.size.width / contentRect.size.width; if (self.layer != nil && xscale != [self.layer contentsScale]) { [self.layer setContentsScale:xscale]; } #if IGL_BACKEND_VULKAN if (_shellPlatform != nullptr) { auto& device = static_cast(_shellPlatform->getDevice()); const igl::vulkan::VulkanContext& vulkanContext = device.getVulkanContext(); auto extents = vulkanContext.getSwapchainExtent(); if (imageRect.size.width != extents.width || imageRect.size.height != extents.height) { device.getVulkanContext().initSwapchain(imageRect.size.width, imageRect.size.height); } } #endif // IGL_BACKEND_VULKAN } - (void)frameDidChange:(NSNotification*)notification { [self updateSwapchain]; } /** Returns a Metal-compatible layer. */ + (Class)layerClass { return [CAMetalLayer class]; } /** If the wantsLayer property is set to YES, this method will be invoked to return a layer * instance. */ - (CALayer*)makeBackingLayer { CALayer* layer = [self.class.layerClass layer]; NSScreen* screen = [NSScreen mainScreen]; CGFloat factor = [screen backingScaleFactor]; layer.contentsScale = factor; return layer; } - (BOOL)acceptsFirstResponder { return YES; } - (void)keyUp:(NSEvent*)event { if (_viewController) { [_viewController keyUp:event]; } } - (void)keyDown:(NSEvent*)event { if (_viewController) { [_viewController keyDown:event]; } } @end ================================================ FILE: shell/mac/main.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #import #import int main(int argc, char* argv[]) { igl::shell::Platform::initializeCommandLineArgs(argc, argv); return NSApplicationMain(argc, (const char**)argv); } ================================================ FILE: shell/openxr/CMakeLists.txt ================================================ # Copyright (c) Meta Platforms, Inc. and affiliates. # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. cmake_minimum_required(VERSION 3.19) set(PROJECT_NAME "IGLShellOpenXR") file(GLOB SHELL_OPENXR_SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ../openxr/impl/*.cpp ../openxr/*.cpp) file(GLOB SHELL_OPENXR_HEADER_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ../openxr/impl/*.h ../openxr/*.h) macro(ADD_SHELL_LIBRARY name srcs) set (extra_srcs ${ARGN}) add_library(${name} ${srcs} ${extra_srcs}) target_link_libraries(${name} PUBLIC IGLLibrary) target_include_directories(${name} PUBLIC "${IGL_ROOT_DIR}/third-party/deps/src/openxr-sdk/src/common") target_include_directories(${name} PUBLIC "${CMAKE_CURRENT_BINARY_DIR}/include_shell_openxr") igl_set_folder(${name} "IGL") igl_set_cxxstd(${name} 20) endmacro() if(ANDROID) if(IGL_WITH_VULKAN) file(GLOB SHELL_OPENXR_PLATFORM_ANDROID_VULKAN_SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ../openxr/mobile/vulkan/*.cpp) file(GLOB SHELL_OPENXR_PLATFORM_ANDROID_VULKAN_HEADER_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ../openxr/mobile/vulkan/*.h) add_shell_library(IGLShellOpenXR_AndroidVulkan ${SHELL_OPENXR_SRC_FILES} ${SHELL_OPENXR_HEADER_FILES} ${SHELL_OPENXR_PLATFORM_ANDROID_VULKAN_SRC_FILES} ${SHELL_OPENXR_PLATFORM_ANDROID_VULKAN_HEADER_FILES}) target_compile_definitions(IGLShellOpenXR_AndroidVulkan PRIVATE "USE_VULKAN_BACKEND" "XR_USE_PLATFORM_ANDROID" "XR_USE_GRAPHICS_API_VULKAN") endif() if(IGL_WITH_OPENGLES) file(GLOB SHELL_OPENXR_PLATFORM_ANDROID_GL_SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ../openxr/mobile/opengl/*.cpp) file(GLOB SHELL_OPENXR_PLATFORM_ANDROID_GL_HEADER_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ../openxr/mobile/opengl/*.h) add_shell_library(IGLShellOpenXR_AndroidOpenGLES ${SHELL_OPENXR_SRC_FILES} ${SHELL_OPENXR_HEADER_FILES} ${SHELL_OPENXR_PLATFORM_ANDROID_GL_SRC_FILES} ${SHELL_OPENXR_PLATFORM_ANDROID_GL_HEADER_FILES}) target_compile_definitions(IGLShellOpenXR_AndroidOpenGLES PRIVATE "USE_OPENGL_BACKEND" "XR_USE_PLATFORM_ANDROID" "XR_USE_GRAPHICS_API_OPENGL_ES") endif() endif() if(WIN32) if(IGL_WITH_VULKAN) file(GLOB SHELL_OPENXR_PLATFORM_ANDROID_VULKAN_SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ../openxr/mobile/vulkan/*.cpp) file(GLOB SHELL_OPENXR_PLATFORM_ANDROID_VULKAN_HEADER_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ../openxr/mobile/vulkan/*.h) add_shell_library(IGLShellOpenXR_sim_vulkan ../openxr/mobile/XrApp.cpp ../openxr/mobile/AndroidMain.cpp ${SHELL_OPENXR_SRC_FILES} ${SHELL_OPENXR_HEADER_FILES} ${SHELL_OPENXR_PLATFORM_ANDROID_VULKAN_SRC_FILES} ${SHELL_OPENXR_PLATFORM_ANDROID_VULKAN_HEADER_FILES}) igl_set_folder(IGLShellOpenXR_sim_vulkan "IGL Shell App/vulkan") target_include_directories(IGLShellOpenXR_sim_vulkan PRIVATE "${IGL_ROOT_DIR}/third-party/deps/src/openxr-sdk/src/common") target_compile_definitions(IGLShellOpenXR_sim_vulkan PRIVATE "USE_VULKAN_BACKEND" "XR_USE_PLATFORM_WIN32" "XR_USE_GRAPHICS_API_VULKAN") endif() if(IGL_WITH_OPENGL) file(GLOB SHELL_OPENXR_PLATFORM_ANDROID_OPENGL_SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ../openxr/mobile/opengl/*.cpp) file(GLOB SHELL_OPENXR_PLATFORM_ANDROID_OPENGL_HEADER_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ../openxr/mobile/opengl/*.h) add_shell_library(IGLShellOpenXR_sim_opengl ../openxr/mobile/XrApp.cpp ../openxr/mobile/AndroidMain.cpp ${SHELL_OPENXR_SRC_FILES} ${SHELL_OPENXR_HEADER_FILES} ${SHELL_OPENXR_PLATFORM_ANDROID_OPENGL_SRC_FILES} ${SHELL_OPENXR_PLATFORM_ANDROID_OPENGL_HEADER_FILES}) igl_set_folder(IGLShellOpenXR_sim_opengl "IGL Shell App/opengl") target_include_directories(IGLShellOpenXR_sim_opengl PRIVATE "${IGL_ROOT_DIR}/third-party/deps/src/openxr-sdk/src/common") target_compile_definitions(IGLShellOpenXR_sim_opengl PRIVATE "USE_OPENGL_BACKEND" "XR_USE_PLATFORM_WIN32" "XR_USE_GRAPHICS_API_OPENGL") endif() endif() ================================================ FILE: shell/openxr/XrApp.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include struct android_app; struct AAssetManager; // forward declarations namespace igl::shell::openxr { class XrHands; class XrSwapchainProvider; class XrPassthrough; namespace impl { class XrAppImpl; } } // namespace igl::shell::openxr namespace igl::shell::openxr { class XrApp { public: XrApp(std::unique_ptr&& impl, bool shouldPresent = true); ~XrApp(); inline bool initialized() const { return initialized_; } struct InitParams { XrRefreshRate::Params refreshRateParams; }; bool initialize(const struct android_app* app, const InitParams& params); XrInstance instance() const; void handleXrEvents(); void handleActionView(const std::string& data); void update(); void setNativeWindow(void* win) { nativeWindow_ = win; } void* nativeWindow() const { return nativeWindow_; } void setResumed(bool resumed) { resumed_ = resumed; } bool resumed() const { return resumed_; } bool sessionActive() const { return sessionActive_; } XrSession session() const; private: bool checkExtensions(); bool createInstance(); bool createSystem(); bool enumerateViewConfigurations(); void enumerateReferenceSpaces(); void enumerateBlendModes(); void updateSwapchainProviders(); void handleSessionStateChanges(XrSessionState state); void createShellSession(std::unique_ptr device, AAssetManager* assetMgr); void createSpaces(); XrFrameState beginFrame(); void render(); void endFrame(XrFrameState frameState); void updateQuadComposition() noexcept; [[nodiscard]] inline bool passthroughSupported() const noexcept; [[nodiscard]] inline bool passthroughEnabled() const noexcept; [[nodiscard]] inline bool handTrackingSupported() const noexcept; [[nodiscard]] inline bool handTrackingMeshSupported() const noexcept; [[nodiscard]] inline bool refreshRateExtensionSupported() const noexcept; [[nodiscard]] inline bool instanceCreateInfoAndroidSupported() const noexcept; [[nodiscard]] inline bool alphaBlendCompositionSupported() const noexcept; void* nativeWindow_ = nullptr; bool resumed_ = false; bool sessionActive_ = false; std::vector extensions_; std::vector enabledExtensions_; XrInstanceProperties instanceProps_ = { .type = XR_TYPE_INSTANCE_PROPERTIES, .next = nullptr, }; XrSystemHandTrackingPropertiesEXT handTrackingSystemProps_ = { .type = XR_TYPE_SYSTEM_HAND_TRACKING_PROPERTIES_EXT, .next = nullptr, }; XrSystemProperties systemProps_ = { .type = XR_TYPE_SYSTEM_PROPERTIES, .next = &handTrackingSystemProps_, }; #if IGL_PLATFORM_ANDROID XrInstanceCreateInfoAndroidKHR instanceCreateInfoAndroid_ = { .type = XR_TYPE_INSTANCE_CREATE_INFO_ANDROID_KHR, }; #endif // IGL_PLATFORM_ANDROID std::unordered_set supportedOptionalXrExtensions_; XrInstance instance_ = XR_NULL_HANDLE; XrSystemId systemId_ = XR_NULL_SYSTEM_ID; XrSession session_ = XR_NULL_HANDLE; bool useSinglePassStereo_ = true; bool additiveBlendingSupported_ = false; bool useQuadLayerComposition_ = false; XrViewConfigurationProperties viewConfigProps_ = {.type = XR_TYPE_VIEW_CONFIGURATION_PROPERTIES}; std::array viewports_{}; std::array views_{}; std::array viewStagePoses_{}; std::array viewTransforms_{}; std::array cameraPositions_{}; std::vector> compositionLayers_; XrSpace headSpace_ = XR_NULL_HANDLE; XrSpace currentSpace_ = XR_NULL_HANDLE; bool stageSpaceSupported_ = false; std::unique_ptr passthrough_; std::unique_ptr hands_; std::unique_ptr refreshRate_; std::unique_ptr impl_; bool initialized_ = false; std::shared_ptr platform_; std::unique_ptr renderSession_; igl::shell::RenderSessionConfig sessionConfig_; std::unique_ptr shellParams_; }; } // namespace igl::shell::openxr ================================================ FILE: shell/openxr/XrComposition.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include namespace igl::shell::openxr { namespace { inline void copyFov(Fov& dst, const XrFovf& src) { dst.angleLeft = src.angleLeft; dst.angleRight = src.angleRight; dst.angleUp = src.angleUp; dst.angleDown = src.angleDown; } } // namespace XrComposition::XrComposition(impl::XrAppImpl& appImpl, std::shared_ptr platform, XrSession session, bool useSinglePassStereo) noexcept : appImpl_(appImpl), platform_(std::move(platform)), session_(session), useSinglePassStereo_(useSinglePassStereo) {} XrComposition::~XrComposition() noexcept = default; void XrComposition::updateSwapchainImageInfo( std::array swapchainImageInfo) noexcept { if (swapchainImageInfo == swapchainImageInfo_) { return; } swapchainImageInfo_ = swapchainImageInfo; if (useSinglePassStereo_ && (swapchainImageInfo_[0] != swapchainImageInfo_[1])) { IGL_LOG_ERROR("Single pass stereo requires identical swapchain image info.\n"); swapchainProviders_ = {}; return; } for (uint32_t i = 0; i < renderPassesCount(); ++i) { swapchainProviders_[i] = std::make_unique(appImpl_.createSwapchainProviderImpl(), platform_, session_, swapchainImageInfo_[i], useSinglePassStereo_ ? kNumViews : 1u); if (!swapchainProviders_[i]->initialize()) { swapchainProviders_ = {}; return; } } } [[nodiscard]] bool XrComposition::isValid() noexcept { // Need to check only the first swapchain provider. return swapchainProviders_[0] != nullptr; } uint32_t XrComposition::renderPassesCount() noexcept { return useSinglePassStereo_ ? 1u : kNumViews; } SurfaceTextures XrComposition::beginRendering( uint32_t renderPassIndex, const std::array& views, const std::array& viewTransforms, const std::array& cameraPositions, std::vector& viewParams) noexcept { if (useSinglePassStereo_) { IGL_DEBUG_ASSERT(viewParams.size() == kNumViews); for (uint8_t i = 0; i < kNumViews; ++i) { viewParams[i].viewMatrix = viewTransforms[i]; viewParams[i].cameraPosition = cameraPositions[i]; viewParams[i].viewIndex = i; copyFov(viewParams[i].fov, views[i].fov); } } else { IGL_DEBUG_ASSERT(viewParams.size() == 1); viewParams[0].viewMatrix = viewTransforms[renderPassIndex]; viewParams[0].cameraPosition = cameraPositions[renderPassIndex]; viewParams[0].viewIndex = static_cast(renderPassIndex); copyFov(viewParams[0].fov, views[renderPassIndex].fov); } return swapchainProviders_[renderPassIndex]->getSurfaceTextures(); } void XrComposition::endRendering(uint32_t renderPassIndex) noexcept { swapchainProviders_[renderPassIndex]->releaseSwapchainImages(); } } // namespace igl::shell::openxr ================================================ FILE: shell/openxr/XrComposition.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include #include #include #include #include namespace igl::shell::openxr { namespace impl { class XrAppImpl; } // namespace impl class XrComposition { public: static constexpr uint8_t kNumViews = 2; // 2 for stereo XrComposition(impl::XrAppImpl& appImpl, std::shared_ptr platform, XrSession session, bool useSinglePassStereo) noexcept; virtual ~XrComposition() noexcept; void updateSwapchainImageInfo( std::array swapchainImageInfo) noexcept; [[nodiscard]] bool isValid() noexcept; [[nodiscard]] uint32_t renderPassesCount() noexcept; [[nodiscard]] SurfaceTextures beginRendering( uint32_t renderPassIndex, const std::array& views, const std::array& viewTransforms, const std::array& cameraPositions, std::vector& viewParams) noexcept; void endRendering(uint32_t renderPassIndex) noexcept; virtual void doComposition(const DepthParams& depthParams, const std::array& views, const std::array& viewStagePoses, XrSpace currentSpace, XrCompositionLayerFlags compositionFlags, std::vector& layers) noexcept = 0; protected: impl::XrAppImpl& appImpl_; std::shared_ptr platform_; // NOLINTNEXTLINE(misc-misplaced-const) const XrSession session_; std::array swapchainImageInfo_; // If useSinglePassStereo_ is true, only one XrSwapchainProvider is used (with index 0). std::array, kNumViews> swapchainProviders_{}; const bool useSinglePassStereo_; }; } // namespace igl::shell::openxr ================================================ FILE: shell/openxr/XrCompositionProjection.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include namespace igl::shell::openxr { XrCompositionProjection::XrCompositionProjection(impl::XrAppImpl& appImpl, std::shared_ptr platform, XrSession session, bool useSinglePassStereo) noexcept : XrComposition(appImpl, std::move(platform), session, useSinglePassStereo) {} // NOLINTNEXTLINE(bugprone-exception-escape) void XrCompositionProjection::doComposition( const DepthParams& depthParams, const std::array& views, const std::array& viewStagePoses, XrSpace currentSpace, XrCompositionLayerFlags compositionFlags, std::vector& layers) noexcept { for (uint8_t view = 0; view < kNumViews; ++view) { const auto subImageIndex = useSinglePassStereo_ ? static_cast(view) : 0u; const auto swapchainProviderIndex = useSinglePassStereo_ ? 0u : static_cast(view); const XrRect2Di imageRect = {{0, 0}, { static_cast(swapchainImageInfo_[view].imageWidth), static_cast(swapchainImageInfo_[view].imageHeight), }}; depthInfos_[view] = {.type = XR_TYPE_COMPOSITION_LAYER_DEPTH_INFO_KHR, .next = nullptr, .subImage = { swapchainProviders_[swapchainProviderIndex]->depthSwapchain(), imageRect, subImageIndex, }, .minDepth = depthParams.minDepth, .maxDepth = depthParams.maxDepth, .nearZ = depthParams.nearZ, .farZ = depthParams.farZ}; projectionViews_[view] = {.type = XR_TYPE_COMPOSITION_LAYER_PROJECTION_VIEW, .next = &depthInfos_[view], .pose = viewStagePoses[view], .fov = views[view].fov, .subImage = { swapchainProviders_[swapchainProviderIndex]->colorSwapchain(), imageRect, subImageIndex, }}; } projectionLayer_ = { .type = XR_TYPE_COMPOSITION_LAYER_PROJECTION, .next = nullptr, .layerFlags = compositionFlags, .space = currentSpace, .viewCount = static_cast(kNumViews), .views = projectionViews_.data(), }; layers.push_back(reinterpret_cast(&projectionLayer_)); } } // namespace igl::shell::openxr ================================================ FILE: shell/openxr/XrCompositionProjection.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::shell::openxr { class XrCompositionProjection final : public XrComposition { public: XrCompositionProjection(impl::XrAppImpl& appImpl, std::shared_ptr platform, XrSession session, bool useSinglePassStereo) noexcept; void doComposition(const DepthParams& depthParams, const std::array& views, const std::array& viewStagePoses, XrSpace currentSpace, XrCompositionLayerFlags compositionFlags, std::vector& layers) noexcept override; private: std::array projectionViews_{}; std::array depthInfos_{}; XrCompositionLayerProjection projectionLayer_{}; }; } // namespace igl::shell::openxr ================================================ FILE: shell/openxr/XrCompositionQuad.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include namespace igl::shell::openxr { namespace { #ifdef XR_FB_composition_layer_alpha_blend inline XrBlendFactorFB iglToOpenXR(BlendFactor factor) noexcept { switch (factor) { case igl::BlendFactor::Zero: return XR_BLEND_FACTOR_ZERO_FB; case igl::BlendFactor::One: return XR_BLEND_FACTOR_ONE_FB; case igl::BlendFactor::SrcAlpha: return XR_BLEND_FACTOR_SRC_ALPHA_FB; case igl::BlendFactor::OneMinusSrcAlpha: return XR_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA_FB; case igl::BlendFactor::DstAlpha: return XR_BLEND_FACTOR_DST_ALPHA_FB; case igl::BlendFactor::OneMinusDstAlpha: return XR_BLEND_FACTOR_ONE_MINUS_DST_ALPHA_FB; default: IGL_DEBUG_ABORT("Not supported blend factor (%d)", static_cast(factor)); break; } return XR_BLEND_FACTOR_ZERO_FB; } #endif // XR_FB_composition_layer_alpha_blend } // namespace XrCompositionQuad::XrCompositionQuad(impl::XrAppImpl& appImpl, std::shared_ptr platform, XrSession session, bool useSinglePassStereo, bool isAlphaBlendCompositionSupported, const QuadLayerInfo& info) noexcept : XrComposition(appImpl, std::move(platform), session, useSinglePassStereo), isAlphaBlendCompositionSupported_(isAlphaBlendCompositionSupported) { updateQuadLayerInfo(info); } void XrCompositionQuad::updateQuadLayerInfo(const QuadLayerInfo& info) noexcept { info_ = info; #ifdef XR_FB_composition_layer_alpha_blend customBlending_ = {.type = XR_TYPE_COMPOSITION_LAYER_ALPHA_BLEND_FB, .next = nullptr, .srcFactorColor = iglToOpenXR(info.customSrcRGBBlendFactor), .dstFactorColor = iglToOpenXR(info.customDstRGBBlendFactor), .srcFactorAlpha = iglToOpenXR(info.customSrcAlphaBlendFactor), .dstFactorAlpha = iglToOpenXR(info.customDstAlphaBlendFactor)}; #endif } // NOLINTNEXTLINE(bugprone-exception-escape) void XrCompositionQuad::doComposition( const DepthParams& /* depthParams */, const std::array& /* views */, const std::array& /* viewStagePoses */, XrSpace currentSpace, XrCompositionLayerFlags compositionFlags, std::vector& layers) noexcept { compositionFlags |= (info_.blendMode == igl::shell::LayerBlendMode::AlphaBlend) ? XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT : 0; for (uint8_t view = 0; view < kNumViews; ++view) { const auto subImageIndex = useSinglePassStereo_ ? static_cast(view) : 0u; const auto swapchainProviderIndex = useSinglePassStereo_ ? 0u : static_cast(view); const XrRect2Di imageRect = {{0, 0}, { static_cast(swapchainImageInfo_[view].imageWidth), static_cast(swapchainImageInfo_[view].imageHeight), }}; quadLayers_[view] = { .type = XR_TYPE_COMPOSITION_LAYER_QUAD, #ifdef XR_FB_composition_layer_alpha_blend .next = (isAlphaBlendCompositionSupported_ && info_.blendMode == igl::shell::LayerBlendMode::Custom) ? &customBlending_ : nullptr, #else .next = nullptr, #endif // XR_FB_composition_layer_alpha_blend .layerFlags = compositionFlags, .space = currentSpace, .eyeVisibility = (view == 0) ? XR_EYE_VISIBILITY_LEFT : XR_EYE_VISIBILITY_RIGHT, .subImage = { swapchainProviders_[swapchainProviderIndex]->colorSwapchain(), imageRect, subImageIndex, }, .pose = {.orientation = {0.f, 0.f, 0.f, 1.f}, .position = {info_.position.x, info_.position.y, info_.position.z}}, .size = {info_.size.x, info_.size.y}, }; layers.push_back(reinterpret_cast(&quadLayers_[view])); } } } // namespace igl::shell::openxr ================================================ FILE: shell/openxr/XrCompositionQuad.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::shell::openxr { class XrCompositionQuad final : public XrComposition { public: XrCompositionQuad(impl::XrAppImpl& appImpl, std::shared_ptr platform, XrSession session, bool useSinglePassStereo, bool isAlphaBlendCompositionSupported, const QuadLayerInfo& quadLayerInfo) noexcept; void updateQuadLayerInfo(const QuadLayerInfo& info) noexcept; void doComposition(const DepthParams& depthParams, const std::array& views, const std::array& viewStagePoses, XrSpace currentSpace, XrCompositionLayerFlags compositionFlags, std::vector& layers) noexcept override; private: #ifdef XR_FB_composition_layer_alpha_blend XrCompositionLayerAlphaBlendFB customBlending_{}; #endif std::array quadLayers_{}; QuadLayerInfo info_; const bool isAlphaBlendCompositionSupported_; }; } // namespace igl::shell::openxr ================================================ FILE: shell/openxr/XrHands.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include namespace igl::shell::openxr { namespace { inline glm::quat glmQuatFromXrQuat(const XrQuaternionf& quat) noexcept { return {quat.w, quat.x, quat.y, quat.z}; } inline glm::vec4 glmVecFromXrVec(const XrVector4f& vec) noexcept { return {vec.x, vec.y, vec.z, vec.w}; } inline glm::vec4 glmVecFromXrVec(const XrVector4sFB& vec) noexcept { return {vec.x, vec.y, vec.z, vec.w}; } inline glm::vec3 glmVecFromXrVec(const XrVector3f& vec) noexcept { return {vec.x, vec.y, vec.z}; } inline glm::vec2 glmVecFromXrVec(const XrVector2f& vec) noexcept { return {vec.x, vec.y}; } inline Pose poseFromXrPose(const XrPosef& pose) noexcept { return Pose{ .orientation = glmQuatFromXrQuat(pose.orientation), .position = glmVecFromXrVec(pose.position), }; } inline int64_t currentTimeInNs() { const auto now = std::chrono::steady_clock::now(); return std::chrono::duration_cast(now.time_since_epoch()).count(); } } // namespace XrHands::XrHands(XrInstance instance, XrSession session, bool handMeshSupported) noexcept : instance_(instance), session_(session), handMeshSupported_(handMeshSupported) { XR_CHECK(xrGetInstanceProcAddr( instance_, "xrCreateHandTrackerEXT", (PFN_xrVoidFunction*)(&xrCreateHandTrackerEXT_))); IGL_DEBUG_ASSERT(xrCreateHandTrackerEXT_ != nullptr); XR_CHECK(xrGetInstanceProcAddr( instance_, "xrDestroyHandTrackerEXT", (PFN_xrVoidFunction*)(&xrDestroyHandTrackerEXT_))); IGL_DEBUG_ASSERT(xrDestroyHandTrackerEXT_ != nullptr); XR_CHECK(xrGetInstanceProcAddr( instance_, "xrLocateHandJointsEXT", (PFN_xrVoidFunction*)(&xrLocateHandJointsEXT_))); IGL_DEBUG_ASSERT(xrLocateHandJointsEXT_ != nullptr); if (handMeshSupported) { XR_CHECK(xrGetInstanceProcAddr( instance_, "xrGetHandMeshFB", (PFN_xrVoidFunction*)(&xrGetHandMeshFB_))); IGL_DEBUG_ASSERT(xrGetHandMeshFB_ != nullptr); } } XrHands::~XrHands() noexcept { if (leftHandTracker_ != XR_NULL_HANDLE) { xrDestroyHandTrackerEXT_(leftHandTracker_); } if (rightHandTracker_ != XR_NULL_HANDLE) { xrDestroyHandTrackerEXT_(rightHandTracker_); } } // NOLINTNEXTLINE(bugprone-exception-escape) const std::vector& XrHands::getExtensions() noexcept { static const std::vector kExtensions{ XR_EXT_HAND_TRACKING_EXTENSION_NAME, XR_FB_HAND_TRACKING_MESH_EXTENSION_NAME, }; return kExtensions; } bool XrHands::initialize() noexcept { std::array dataSources = { XR_HAND_TRACKING_DATA_SOURCE_UNOBSTRUCTED_EXT, XR_HAND_TRACKING_DATA_SOURCE_CONTROLLER_EXT, }; const XrHandTrackingDataSourceInfoEXT dataSourceInfo{ .type = XR_TYPE_HAND_TRACKING_DATA_SOURCE_INFO_EXT, .requestedDataSourceCount = static_cast(dataSources.size()), .requestedDataSources = dataSources.data()}; XrHandTrackerCreateInfoEXT createInfo{ .type = XR_TYPE_HAND_TRACKER_CREATE_INFO_EXT, .next = &dataSourceInfo, .hand = XR_HAND_LEFT_EXT, .handJointSet = XR_HAND_JOINT_SET_DEFAULT_EXT, }; XrResult result(XR_SUCCESS); XR_CHECK(result = xrCreateHandTrackerEXT_(session_, &createInfo, &leftHandTracker_)); if (result != XR_SUCCESS) { IGL_LOG_ERROR("xrCreateHandTrackerEXT (left hand) failed.\n"); return false; } createInfo.hand = XR_HAND_RIGHT_EXT; XR_CHECK(result = xrCreateHandTrackerEXT_(session_, &createInfo, &rightHandTracker_)); if (result != XR_SUCCESS) { IGL_LOG_ERROR("xrCreateHandTrackerEXT (right hand) failed.\n"); return false; } return true; } void XrHands::updateMeshes(std::array& handMeshes) noexcept { if (!handMeshSupported_) { return; } XrResult result(XR_SUCCESS); XrHandTrackerEXT trackers[] = {leftHandTracker_, rightHandTracker_}; for (uint8_t i = 0; i < 2; ++i) { XrHandTrackingMeshFB mesh{XR_TYPE_HAND_TRACKING_MESH_FB}; XR_CHECK(result = xrGetHandMeshFB_(trackers[i], &mesh)); if (result != XR_SUCCESS) { continue; } IGL_DEBUG_ASSERT(mesh.jointCountOutput <= XR_HAND_JOINT_COUNT_EXT); XrPosef jointBindPoses[XR_HAND_JOINT_COUNT_EXT]{}; XrHandJointEXT jointParents[XR_HAND_JOINT_COUNT_EXT]{}; float jointRadii[XR_HAND_JOINT_COUNT_EXT]{}; mesh.jointCapacityInput = mesh.jointCountOutput; mesh.vertexCapacityInput = mesh.vertexCountOutput; mesh.indexCapacityInput = mesh.indexCountOutput; std::vector vertexPositions(mesh.vertexCapacityInput); std::vector vertexNormals(mesh.vertexCapacityInput); std::vector vertexUVs(mesh.vertexCapacityInput); std::vector vertexBlendIndices(mesh.vertexCapacityInput); std::vector vertexBlendWeights(mesh.vertexCapacityInput); handMeshes[i].indices.resize(mesh.indexCapacityInput); mesh.jointBindPoses = jointBindPoses; mesh.jointParents = jointParents; mesh.jointRadii = jointRadii; mesh.vertexPositions = vertexPositions.data(); mesh.vertexNormals = vertexNormals.data(); mesh.vertexUVs = vertexUVs.data(); mesh.vertexBlendIndices = vertexBlendIndices.data(); mesh.vertexBlendWeights = vertexBlendWeights.data(); mesh.indices = handMeshes[i].indices.data(); XR_CHECK(result = xrGetHandMeshFB_(trackers[i], &mesh)); if (result != XR_SUCCESS) { continue; } handMeshes[i].vertexCountOutput = mesh.vertexCountOutput; handMeshes[i].indexCountOutput = mesh.indexCountOutput; handMeshes[i].jointCountOutput = mesh.jointCountOutput; handMeshes[i].vertexPositions.reserve(mesh.vertexCountOutput); handMeshes[i].vertexNormals.reserve(mesh.vertexCountOutput); handMeshes[i].vertexUVs.reserve(mesh.vertexCountOutput); handMeshes[i].vertexBlendIndices.reserve(mesh.vertexCountOutput); handMeshes[i].vertexBlendWeights.reserve(mesh.vertexCountOutput); handMeshes[i].jointBindPoses.reserve(mesh.jointCountOutput); for (uint32_t j = 0; j < mesh.vertexCountOutput; ++j) { handMeshes[i].vertexPositions.emplace_back(glmVecFromXrVec(mesh.vertexPositions[j])); handMeshes[i].vertexUVs.emplace_back(glmVecFromXrVec(mesh.vertexUVs[j])); handMeshes[i].vertexNormals.emplace_back(glmVecFromXrVec(mesh.vertexNormals[j])); handMeshes[i].vertexBlendIndices.emplace_back(glmVecFromXrVec(mesh.vertexBlendIndices[j])); handMeshes[i].vertexBlendWeights.emplace_back(glmVecFromXrVec(mesh.vertexBlendWeights[j])); } for (uint32_t j = 0; j < mesh.jointCountOutput; ++j) { handMeshes[i].jointBindPoses.emplace_back(poseFromXrPose(mesh.jointBindPoses[j])); } } } void XrHands::updateTracking( XrSpace currentSpace, std::array& handTracking) noexcept { // NOLINT(bugprone-exception-escape) XrResult result(XR_SUCCESS); XrHandTrackerEXT trackers[] = {leftHandTracker_, rightHandTracker_}; for (uint8_t i = 0; i < 2; ++i) { XrHandJointLocationEXT jointLocations[XR_HAND_JOINT_COUNT_EXT]; XrHandJointVelocityEXT jointVelocities[XR_HAND_JOINT_COUNT_EXT]; XrHandJointVelocitiesEXT velocities{.type = XR_TYPE_HAND_JOINT_VELOCITIES_EXT, .next = nullptr, .jointCount = XR_HAND_JOINT_COUNT_EXT, .jointVelocities = jointVelocities}; XrHandJointLocationsEXT locations{.type = XR_TYPE_HAND_JOINT_LOCATIONS_EXT, .next = &velocities, .jointCount = XR_HAND_JOINT_COUNT_EXT, .jointLocations = jointLocations}; XrHandJointsMotionRangeInfoEXT motionRangeInfo{XR_TYPE_HAND_JOINTS_MOTION_RANGE_INFO_EXT}; motionRangeInfo.handJointsMotionRange = XR_HAND_JOINTS_MOTION_RANGE_CONFORMING_TO_CONTROLLER_EXT; const XrHandJointsLocateInfoEXT locateInfo{.type = XR_TYPE_HAND_JOINTS_LOCATE_INFO_EXT, .next = &motionRangeInfo, .baseSpace = currentSpace, .time = currentTimeInNs()}; handTracking[i].jointPose.resize(XR_HAND_JOINT_COUNT_EXT); handTracking[i].jointVelocity.resize(XR_HAND_JOINT_COUNT_EXT); handTracking[i].isJointTracked.resize(XR_HAND_JOINT_COUNT_EXT); XR_CHECK(result = xrLocateHandJointsEXT_(trackers[i], &locateInfo, &locations)); if (result != XR_SUCCESS) { for (size_t jointIndex = 0; jointIndex < XR_HAND_JOINT_COUNT_EXT; ++jointIndex) { handTracking[i].isJointTracked[jointIndex] = false; } continue; } if (!locations.isActive) { for (size_t jointIndex = 0; jointIndex < XR_HAND_JOINT_COUNT_EXT; ++jointIndex) { handTracking[i].isJointTracked[jointIndex] = false; } continue; } constexpr XrSpaceLocationFlags isValid = XR_SPACE_LOCATION_ORIENTATION_VALID_BIT | XR_SPACE_LOCATION_POSITION_VALID_BIT; for (size_t jointIndex = 0; jointIndex < XR_HAND_JOINT_COUNT_EXT; ++jointIndex) { if ((jointLocations[jointIndex].locationFlags & isValid) != 0) { handTracking[i].jointPose[jointIndex] = poseFromXrPose(jointLocations[jointIndex].pose); handTracking[i].jointVelocity[jointIndex].linear = glmVecFromXrVec(jointVelocities[jointIndex].linearVelocity); handTracking[i].jointVelocity[jointIndex].angular = glmVecFromXrVec(jointVelocities[jointIndex].angularVelocity); handTracking[i].isJointTracked[jointIndex] = true; } else { handTracking[i].isJointTracked[jointIndex] = false; } } } } } // namespace igl::shell::openxr ================================================ FILE: shell/openxr/XrHands.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::shell::openxr { class XrHands final { public: XrHands(XrInstance instance, XrSession session, bool handMeshSupported) noexcept; ~XrHands() noexcept; XrHands(const XrHands&) = delete; XrHands& operator=(const XrHands&) = delete; XrHands(XrHands&&) = delete; XrHands& operator=(XrHands&&) = delete; [[nodiscard]] static const std::vector& getExtensions() noexcept; [[nodiscard]] bool initialize() noexcept; void updateTracking(XrSpace currentSpace, std::array& handTracking) noexcept; void updateMeshes(std::array& handMeshes) noexcept; private: const XrInstance instance_; const XrSession session_; const bool handMeshSupported_; // API PFN_xrCreateHandTrackerEXT xrCreateHandTrackerEXT_ = nullptr; PFN_xrDestroyHandTrackerEXT xrDestroyHandTrackerEXT_ = nullptr; PFN_xrLocateHandJointsEXT xrLocateHandJointsEXT_ = nullptr; PFN_xrGetHandMeshFB xrGetHandMeshFB_ = nullptr; XrHandTrackerEXT leftHandTracker_ = XR_NULL_HANDLE; XrHandTrackerEXT rightHandTracker_ = XR_NULL_HANDLE; }; } // namespace igl::shell::openxr ================================================ FILE: shell/openxr/XrLog.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "XrLog.h" #include extern XrInstance getXrInstance(); namespace igl::shell::openxr { #if IGL_DEBUG void checkXRErrors(XrResult result, const char* function) { if (XR_FAILED(result)) { char errorBuffer[XR_MAX_RESULT_STRING_SIZE + 1] = {}; xrResultToString(getXrInstance(), result, errorBuffer); IGL_LOG_ERROR("OpenXR error: %s %s", function, errorBuffer); } } #endif } // namespace igl::shell::openxr ================================================ FILE: shell/openxr/XrLog.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::shell::openxr { #if IGL_DEBUG void checkXRErrors(XrResult result, const char* function); #endif } // namespace igl::shell::openxr #if IGL_DEBUG #define XR_CHECK(func) igl::shell::openxr::checkXRErrors(func, #func) #else #define XR_CHECK(func) func #endif ================================================ FILE: shell/openxr/XrPassthrough.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include namespace igl::shell::openxr { XrPassthrough::XrPassthrough(XrInstance instance, XrSession session) noexcept : instance_(instance), session_(session) { XR_CHECK(xrGetInstanceProcAddr( instance_, "xrCreatePassthroughFB", (PFN_xrVoidFunction*)(&xrCreatePassthroughFB_))); XR_CHECK(xrGetInstanceProcAddr( instance_, "xrDestroyPassthroughFB", (PFN_xrVoidFunction*)(&xrDestroyPassthroughFB_))); XR_CHECK(xrGetInstanceProcAddr( instance_, "xrPassthroughStartFB", (PFN_xrVoidFunction*)(&xrPassthroughStartFB_))); XR_CHECK(xrGetInstanceProcAddr( instance_, "xrPassthroughPauseFB", (PFN_xrVoidFunction*)(&xrPassthroughPauseFB_))); XR_CHECK(xrGetInstanceProcAddr(instance_, "xrCreatePassthroughLayerFB", (PFN_xrVoidFunction*)(&xrCreatePassthroughLayerFB_))); XR_CHECK(xrGetInstanceProcAddr(instance_, "xrDestroyPassthroughLayerFB", (PFN_xrVoidFunction*)(&xrDestroyPassthroughLayerFB_))); XR_CHECK(xrGetInstanceProcAddr(instance_, "xrPassthroughLayerSetStyleFB", (PFN_xrVoidFunction*)(&xrPassthroughLayerSetStyleFB_))); } XrPassthrough::~XrPassthrough() noexcept { if (passthroughLayer_ != XR_NULL_HANDLE) { xrDestroyPassthroughLayerFB_(passthroughLayer_); } if (passthrough_ != XR_NULL_HANDLE) { xrDestroyPassthroughFB_(passthrough_); } } // NOLINTNEXTLINE(bugprone-exception-escape) const std::vector& XrPassthrough::getExtensions() noexcept { static const std::vector kExtensions{XR_FB_PASSTHROUGH_EXTENSION_NAME}; return kExtensions; } bool XrPassthrough::initialize() noexcept { const XrPassthroughCreateInfoFB passthroughInfo{ .type = XR_TYPE_PASSTHROUGH_CREATE_INFO_FB, .next = nullptr, .flags = XR_PASSTHROUGH_IS_RUNNING_AT_CREATION_BIT_FB, }; XrResult result(XR_SUCCESS); XR_CHECK(result = xrCreatePassthroughFB_(session_, &passthroughInfo, &passthrough_)); if (result != XR_SUCCESS) { IGL_LOG_ERROR("xrCreatePassthroughFB failed.\n"); return false; } const XrPassthroughLayerCreateInfoFB layerInfo{ .type = XR_TYPE_PASSTHROUGH_LAYER_CREATE_INFO_FB, .next = nullptr, .passthrough = passthrough_, .flags = XR_PASSTHROUGH_IS_RUNNING_AT_CREATION_BIT_FB, .purpose = XR_PASSTHROUGH_LAYER_PURPOSE_RECONSTRUCTION_FB, }; XR_CHECK(result = xrCreatePassthroughLayerFB_(session_, &layerInfo, &passthroughLayer_)); if (result != XR_SUCCESS) { IGL_LOG_ERROR("xrCreatePassthroughLayerFB failed.\n"); return false; } const XrPassthroughStyleFB style{.type = XR_TYPE_PASSTHROUGH_STYLE_FB, .next = nullptr, .textureOpacityFactor = 1.0f, .edgeColor = {0.0f, 0.0f, 0.0f, 0.0f}}; XR_CHECK(result = xrPassthroughLayerSetStyleFB_(passthroughLayer_, &style)); if (result != XR_SUCCESS) { IGL_LOG_ERROR("xrPassthroughLayerSetStyleFB failed.\n"); return false; } compositionLayer_.next = nullptr; compositionLayer_.layerHandle = passthroughLayer_; return true; } void XrPassthrough::setOpacity(float opacity) noexcept { IGL_DEBUG_ASSERT(opacity >= 0.0f && opacity <= 1.0f); if (passthroughLayer_ == XR_NULL_HANDLE || opacity_ == opacity) { return; } opacity_ = opacity; const XrPassthroughStyleFB style{ .type = XR_TYPE_PASSTHROUGH_STYLE_FB, .next = nullptr, .textureOpacityFactor = opacity, .edgeColor = {0.0f, 0.0f, 0.0f, 0.0f}, }; XR_CHECK(xrPassthroughLayerSetStyleFB_(passthroughLayer_, &style)); } void XrPassthrough::setEnabled(bool enabled) noexcept { if (enabled_ == enabled) { return; } enabled_ = enabled; XrResult result(XR_SUCCESS); if (enabled_) { XR_CHECK(result = xrPassthroughStartFB_(passthrough_)); if (result != XR_SUCCESS) { IGL_LOG_ERROR("xrPassthroughStartFB failed.\n"); } } else { XR_CHECK(result = xrPassthroughPauseFB_(passthrough_)); if (result != XR_SUCCESS) { IGL_LOG_ERROR("xrPassthroughPauseFB failed.\n"); } } } void XrPassthrough::injectLayer( // NOLINT(bugprone-exception-escape) std::vector& layers) noexcept { layers.push_back(reinterpret_cast(&compositionLayer_)); } } // namespace igl::shell::openxr ================================================ FILE: shell/openxr/XrPassthrough.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::shell::openxr { class XrPassthrough final { public: XrPassthrough(XrInstance instance, XrSession session) noexcept; ~XrPassthrough() noexcept; XrPassthrough(const XrPassthrough&) = delete; XrPassthrough& operator=(const XrPassthrough&) = delete; XrPassthrough(XrPassthrough&&) = delete; XrPassthrough& operator=(XrPassthrough&&) = delete; [[nodiscard]] static const std::vector& getExtensions() noexcept; [[nodiscard]] bool initialize() noexcept; void setEnabled(bool enabled) noexcept; void setOpacity(float opacity) noexcept; void injectLayer(std::vector& layers) noexcept; private: const XrInstance instance_; const XrSession session_; // API PFN_xrCreatePassthroughFB xrCreatePassthroughFB_ = nullptr; PFN_xrDestroyPassthroughFB xrDestroyPassthroughFB_ = nullptr; PFN_xrPassthroughStartFB xrPassthroughStartFB_ = nullptr; PFN_xrPassthroughPauseFB xrPassthroughPauseFB_ = nullptr; PFN_xrCreatePassthroughLayerFB xrCreatePassthroughLayerFB_ = nullptr; PFN_xrDestroyPassthroughLayerFB xrDestroyPassthroughLayerFB_ = nullptr; PFN_xrPassthroughLayerSetStyleFB xrPassthroughLayerSetStyleFB_ = nullptr; XrPassthroughFB passthrough_ = XR_NULL_HANDLE; XrPassthroughLayerFB passthroughLayer_ = XR_NULL_HANDLE; XrCompositionLayerPassthroughFB compositionLayer_{XR_TYPE_COMPOSITION_LAYER_PASSTHROUGH_FB}; bool enabled_ = false; float opacity_ = 1.0f; }; } // namespace igl::shell::openxr ================================================ FILE: shell/openxr/XrPlatform.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include // IWYU pragma: export #if defined(USE_VULKAN_BACKEND) && IGL_BACKEND_VULKAN #include // IWYU pragma: export #endif // defined(USE_VULKAN_BACKEND) && IGL_BACKEND_VULKAN #if defined(USE_OPENGL_BACKEND) && IGL_BACKEND_OPENGL #include // IWYU pragma: export #endif // defined(USE_OPENGL_BACKEND) && IGL_BACKEND_OPENGL #if IGL_PLATFORM_ANDROID #include // IWYU pragma: export #include // IWYU pragma: export #if IGL_BACKEND_OPENGL #include // IWYU pragma: export #endif // IGL_BACKEND_OPENGL #endif // IGL_PLATFORM_ANDROID #if IGL_PLATFORM_WINDOWS #if !defined(WIN32_LEAN_AND_MEAN) #define WIN32_LEAN_AND_MEAN #endif #include // IWYU pragma: export #include // IWYU pragma: export #endif // IGL_PLATFORM_WINDOWS #include // IWYU pragma: export #include // IWYU pragma: export ================================================ FILE: shell/openxr/XrRefreshRate.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include namespace igl::shell::openxr { XrRefreshRate::XrRefreshRate(XrInstance instance, XrSession session) noexcept : session_(session) { XR_CHECK(xrGetInstanceProcAddr( instance, "xrGetDisplayRefreshRateFB", (PFN_xrVoidFunction*)(&xrGetDisplayRefreshRateFB_))); IGL_DEBUG_ASSERT(xrGetDisplayRefreshRateFB_ != nullptr); XR_CHECK(xrGetInstanceProcAddr(instance, "xrEnumerateDisplayRefreshRatesFB", (PFN_xrVoidFunction*)(&xrEnumerateDisplayRefreshRatesFB_))); IGL_DEBUG_ASSERT(xrEnumerateDisplayRefreshRatesFB_ != nullptr); XR_CHECK(xrGetInstanceProcAddr(instance, "xrRequestDisplayRefreshRateFB", (PFN_xrVoidFunction*)(&xrRequestDisplayRefreshRateFB_))); IGL_DEBUG_ASSERT(xrRequestDisplayRefreshRateFB_ != nullptr); } XrRefreshRate::~XrRefreshRate() noexcept = default; bool XrRefreshRate::initialize(const Params& params) noexcept { queryCurrentRefreshRate(); if (params.refreshRateMode == RefreshRateMode::kUseMaxRefreshRate) { setMaxRefreshRate(); } else if (params.refreshRateMode == RefreshRateMode::kUseSpecificRefreshRate) { setRefreshRate(params.desiredSpecificRefreshRate); } else { // Do nothing. Use default refresh rate. } querySupportedRefreshRates(); return true; } // NOLINTNEXTLINE(bugprone-exception-escape) const std::vector& XrRefreshRate::getExtensions() noexcept { static const std::vector kExtensions{XR_FB_DISPLAY_REFRESH_RATE_EXTENSION_NAME}; return kExtensions; } float XrRefreshRate::getCurrentRefreshRate() const noexcept { return currentRefreshRate_; } float XrRefreshRate::getMaxRefreshRate() const noexcept { const std::vector& supportedRefreshRates = getSupportedRefreshRates(); if (supportedRefreshRates.empty()) { return 0.0f; } const float maxRefreshRate = supportedRefreshRates.back(); return maxRefreshRate; } bool XrRefreshRate::setRefreshRate(float refreshRate) noexcept { if ((refreshRate == currentRefreshRate_) || !isRefreshRateSupported(refreshRate)) { return false; } const XrResult result = xrRequestDisplayRefreshRateFB_(session_, refreshRate); if (result != XR_SUCCESS) { return false; } IGL_LOG_INFO( "setRefreshRate changed from %.2f Hz to %.2f Hz\n", currentRefreshRate_, refreshRate); currentRefreshRate_ = refreshRate; return true; } void XrRefreshRate::setMaxRefreshRate() noexcept { const float maxRefreshRate = getMaxRefreshRate(); IGL_LOG_INFO("maxRefreshRate = %.2f Hz\n", maxRefreshRate); if (maxRefreshRate > 0.0f) { setRefreshRate(maxRefreshRate); } } bool XrRefreshRate::isRefreshRateSupported(float refreshRate) const noexcept { const std::vector& supportedRefreshRates = getSupportedRefreshRates(); return std::find(supportedRefreshRates.begin(), supportedRefreshRates.end(), refreshRate) != supportedRefreshRates.end(); } const std::vector& XrRefreshRate::getSupportedRefreshRates() const noexcept { return supportedRefreshRates_; } void XrRefreshRate::queryCurrentRefreshRate() noexcept { const XrResult result = xrGetDisplayRefreshRateFB_(session_, ¤tRefreshRate_); if (result == XR_SUCCESS) { IGL_LOG_INFO("getCurrentRefreshRate success, current Hz = %.2f.\n", currentRefreshRate_); } } // NOLINTNEXTLINE(bugprone-exception-escape) void XrRefreshRate::querySupportedRefreshRates() noexcept { if (!supportedRefreshRates_.empty()) { return; } uint32_t numRefreshRates = 0; XrResult result = xrEnumerateDisplayRefreshRatesFB_(session_, 0, &numRefreshRates, nullptr); if ((result == XR_SUCCESS) && (numRefreshRates > 0)) { supportedRefreshRates_.resize(numRefreshRates); result = xrEnumerateDisplayRefreshRatesFB_( session_, numRefreshRates, &numRefreshRates, supportedRefreshRates_.data()); if (result == XR_SUCCESS) { std::sort(supportedRefreshRates_.begin(), supportedRefreshRates_.end()); } for (const float refreshRate : supportedRefreshRates_) { (void)refreshRate; IGL_LOG_INFO("querySupportedRefreshRates Hz = %.2f.\n", refreshRate); } } } } // namespace igl::shell::openxr ================================================ FILE: shell/openxr/XrRefreshRate.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::shell::openxr { class XrRefreshRate final { public: enum RefreshRateMode : uint8_t { kUseDefault = 0, kUseMaxRefreshRate, kUseSpecificRefreshRate, }; struct Params { RefreshRateMode refreshRateMode = RefreshRateMode::kUseDefault; float desiredSpecificRefreshRate = 90.0f; }; XrRefreshRate(XrInstance instance, XrSession session) noexcept; ~XrRefreshRate() noexcept; [[nodiscard]] bool initialize(const Params& params) noexcept; [[nodiscard]] static const std::vector& getExtensions() noexcept; [[nodiscard]] float getCurrentRefreshRate() const noexcept; [[nodiscard]] float getMaxRefreshRate() const noexcept; bool setRefreshRate(float refreshRate) noexcept; void setMaxRefreshRate() noexcept; [[nodiscard]] bool isRefreshRateSupported(float refreshRate) const noexcept; [[nodiscard]] const std::vector& getSupportedRefreshRates() const noexcept; private: void queryCurrentRefreshRate() noexcept; void querySupportedRefreshRates() noexcept; // NOLINTNEXTLINE(misc-misplaced-const) const XrSession session_; // API PFN_xrGetDisplayRefreshRateFB xrGetDisplayRefreshRateFB_ = nullptr; PFN_xrEnumerateDisplayRefreshRatesFB xrEnumerateDisplayRefreshRatesFB_ = nullptr; PFN_xrRequestDisplayRefreshRateFB xrRequestDisplayRefreshRateFB_ = nullptr; std::vector supportedRefreshRates_; float currentRefreshRate_ = 0.0f; }; } // namespace igl::shell::openxr ================================================ FILE: shell/openxr/XrSwapchainProvider.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include #include namespace igl::shell::openxr { namespace { // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) [[nodiscard]] int64_t findFormat(const std::vector& sortedSwapchainFormats, const std::vector& formats) noexcept { for (const int64_t format : formats) { if (std::binary_search(sortedSwapchainFormats.begin(), sortedSwapchainFormats.end(), format)) { return format; } } return impl::kSwapchainImageInvalidFormat; } } // namespace XrSwapchainProvider::XrSwapchainProvider(std::unique_ptr&& impl, std::shared_ptr platform, XrSession session, impl::SwapchainImageInfo swapchainImageInfo, uint8_t numViews) noexcept : impl_(std::move(impl)), platform_(std::move(platform)), session_(session), swapchainImageInfo_(swapchainImageInfo), numViews_(numViews) {} XrSwapchainProvider::~XrSwapchainProvider() noexcept { if (colorSwapchain_ != XR_NULL_HANDLE) { xrDestroySwapchain(colorSwapchain_); } if (depthSwapchain_ != XR_NULL_HANDLE) { xrDestroySwapchain(depthSwapchain_); } } bool XrSwapchainProvider::initialize() noexcept { uint32_t numSwapchainFormats = 0; XR_CHECK(xrEnumerateSwapchainFormats(session_, 0, &numSwapchainFormats, nullptr)); std::vector swapchainFormats(numSwapchainFormats); XR_CHECK(xrEnumerateSwapchainFormats( session_, numSwapchainFormats, &numSwapchainFormats, swapchainFormats.data())); std::sort(swapchainFormats.begin(), swapchainFormats.end()); swapchainImageInfo_.colorFormat = findFormat(swapchainFormats, swapchainImageInfo_.colorFormat != impl::kSwapchainImageInvalidFormat ? std::vector{swapchainImageInfo_.colorFormat} : impl_->preferredColorFormats()); if (swapchainImageInfo_.colorFormat == impl::kSwapchainImageInvalidFormat) { IGL_DEBUG_ABORT("No supported color format found"); return false; } colorSwapchain_ = createXrSwapchain(XR_SWAPCHAIN_USAGE_COLOR_ATTACHMENT_BIT, swapchainImageInfo_.colorFormat); swapchainImageInfo_.depthFormat = findFormat(swapchainFormats, swapchainImageInfo_.depthFormat != impl::kSwapchainImageInvalidFormat ? std::vector{swapchainImageInfo_.depthFormat} : impl_->preferredDepthFormats()); if (swapchainImageInfo_.depthFormat == impl::kSwapchainImageInvalidFormat) { IGL_DEBUG_ABORT("No supported depth format found"); return false; } depthSwapchain_ = createXrSwapchain(XR_SWAPCHAIN_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, swapchainImageInfo_.depthFormat); impl_->enumerateImages( platform_->getDevice(), colorSwapchain_, depthSwapchain_, swapchainImageInfo_, numViews_); return true; } XrSwapchain XrSwapchainProvider::createXrSwapchain(XrSwapchainUsageFlags extraUsageFlags, int64_t format) noexcept { const XrSwapchainCreateInfo swapChainCreateInfo = {.type = XR_TYPE_SWAPCHAIN_CREATE_INFO, .next = nullptr, .usageFlags = XR_SWAPCHAIN_USAGE_SAMPLED_BIT | extraUsageFlags, .format = format, .sampleCount = 1, .width = swapchainImageInfo_.imageWidth, .height = swapchainImageInfo_.imageHeight, .faceCount = 1, .arraySize = numViews_, .mipCount = 1}; XrSwapchain swapchain = nullptr; XR_CHECK(xrCreateSwapchain(session_, &swapChainCreateInfo, &swapchain)); IGL_LOG_INFO("XrSwapchain created\n"); IGL_LOG_INFO("XrSwapchain image width: %d\n", swapchainImageInfo_.imageWidth); IGL_LOG_INFO("XrSwapchain image height: %d\n", swapchainImageInfo_.imageHeight); return swapchain; } SurfaceTextures XrSwapchainProvider::getSurfaceTextures() const noexcept { return impl_->getSurfaceTextures( platform_->getDevice(), colorSwapchain_, depthSwapchain_, swapchainImageInfo_, numViews_); } void XrSwapchainProvider::releaseSwapchainImages() const noexcept { const XrSwapchainImageReleaseInfo releaseInfo = {XR_TYPE_SWAPCHAIN_IMAGE_RELEASE_INFO}; XR_CHECK(xrReleaseSwapchainImage(colorSwapchain_, &releaseInfo)); XR_CHECK(xrReleaseSwapchainImage(depthSwapchain_, &releaseInfo)); } } // namespace igl::shell::openxr ================================================ FILE: shell/openxr/XrSwapchainProvider.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include #include #include #include // forward declarations namespace igl::shell::openxr { class XrSwapchainProvider { public: XrSwapchainProvider(std::unique_ptr&& impl, std::shared_ptr platform, XrSession session, impl::SwapchainImageInfo swapchainImageInfo, uint8_t numViews) noexcept; ~XrSwapchainProvider() noexcept; XrSwapchainProvider(const XrSwapchainProvider&) = delete; XrSwapchainProvider& operator=(const XrSwapchainProvider&) = delete; XrSwapchainProvider(XrSwapchainProvider&&) = delete; XrSwapchainProvider& operator=(XrSwapchainProvider&&) = delete; [[nodiscard]] bool initialize() noexcept; [[nodiscard]] inline uint32_t currentImageIndex() const noexcept { return currentImageIndex_; } [[nodiscard]] SurfaceTextures getSurfaceTextures() const noexcept; void releaseSwapchainImages() const noexcept; [[nodiscard]] inline XrSwapchain colorSwapchain() const noexcept { return colorSwapchain_; } [[nodiscard]] inline XrSwapchain depthSwapchain() const noexcept { return depthSwapchain_; } private: XrSwapchain createXrSwapchain(XrSwapchainUsageFlags extraUsageFlags, int64_t format) noexcept; std::unique_ptr impl_; std::shared_ptr platform_; const XrSession session_; impl::SwapchainImageInfo swapchainImageInfo_; XrSwapchain colorSwapchain_ = XR_NULL_HANDLE; XrSwapchain depthSwapchain_ = XR_NULL_HANDLE; uint32_t currentImageIndex_ = 0; const uint8_t numViews_ = 1; // The number of layers of the underlying swapchain image would match numViews_. }; } // namespace igl::shell::openxr ================================================ FILE: shell/openxr/impl/XrAppImpl.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include namespace igl::shell::openxr::impl { class XrSwapchainProviderImpl; class XrAppImpl { public: virtual ~XrAppImpl() = default; [[nodiscard]] virtual RenderSessionConfig suggestedSessionConfig() const = 0; [[nodiscard]] virtual std::vector getXrRequiredExtensions() const = 0; [[nodiscard]] virtual std::vector getXrOptionalExtensions() const = 0; [[nodiscard]] virtual std::unique_ptr initIGL(XrInstance instance, XrSystemId systemId) = 0; [[nodiscard]] virtual XrSession initXrSession(XrInstance instance, XrSystemId systemId, IDevice& device, const RenderSessionConfig& sessionConfig) = 0; [[nodiscard]] virtual std::unique_ptr createSwapchainProviderImpl() const = 0; }; } // namespace igl::shell::openxr::impl ================================================ FILE: shell/openxr/impl/XrSwapchainProviderImpl.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include namespace igl::shell::openxr::impl { constexpr int64_t kSwapchainImageInvalidFormat = -1; struct SwapchainImageInfo { int64_t colorFormat = kSwapchainImageInvalidFormat; int64_t depthFormat = kSwapchainImageInvalidFormat; uint32_t imageWidth = 0; uint32_t imageHeight = 0; }; inline bool operator==(const SwapchainImageInfo& lhs, const SwapchainImageInfo& rhs) noexcept { return (lhs.colorFormat == rhs.colorFormat && lhs.depthFormat == rhs.depthFormat && lhs.imageWidth == rhs.imageWidth && lhs.imageHeight == rhs.imageHeight); } class XrSwapchainProviderImpl { public: virtual ~XrSwapchainProviderImpl() noexcept = default; [[nodiscard]] virtual std::vector preferredColorFormats() const noexcept = 0; [[nodiscard]] virtual std::vector preferredDepthFormats() const noexcept = 0; virtual void enumerateImages(IDevice& device, XrSwapchain colorSwapchain, XrSwapchain depthSwapchain, const SwapchainImageInfo& swapchainImageInfo, uint8_t numViews) noexcept = 0; [[nodiscard]] virtual SurfaceTextures getSurfaceTextures( IDevice& device, XrSwapchain colorSwapchain, XrSwapchain depthSwapchain, const SwapchainImageInfo& swapchainImageInfo, uint8_t numViews) noexcept = 0; protected: std::vector> colorTextures_; std::vector> depthTextures_; }; } // namespace igl::shell::openxr::impl ================================================ FILE: shell/openxr/mobile/AndroidMain.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #if IGL_PLATFORM_ANDROID #include #endif // IGL_PLATFORM_ANDROID #include #include #include // #define ATTACH_DEBUGGER #ifdef ATTACH_DEBUGGER #include #endif #include #if defined(USE_VULKAN_BACKEND) #include #elif defined(USE_OPENGL_BACKEND) #include #endif #if IGL_PLATFORM_WINDOWS #include "ShellScalingApi.h" #endif // IGL_PLATFORM_WINDOWS static XrInstance gInstance; // This function cannot be declared as `static` due to our Android GitHub builds // @lint-ignore CLANGTIDY XrInstance getXrInstance() { return gInstance; } #if IGL_PLATFORM_ANDROID namespace { std::vector gActionViewQueue; } // namespace extern "C" { void processActionView(JNIEnv* env, jstring data) { if (env == nullptr || data == nullptr) { return; } const jsize stringLength = env->GetStringUTFLength(data); const char* stringChars = env->GetStringUTFChars(data, nullptr); if (stringLength == 0 || stringChars == nullptr) { return; } gActionViewQueue.emplace_back(stringChars, stringLength); env->ReleaseStringUTFChars(data, stringChars); } JNIEXPORT void JNICALL Java_com_facebook_igl_shell_openxr_vulkan_MainActivity_onActionView(JNIEnv* env, jclass /*clazz*/, jstring data) { processActionView(env, data); } JNIEXPORT void JNICALL Java_com_facebook_igl_shell_openxr_gles_MainActivity_onActionView(JNIEnv* env, jclass /*clazz*/, jstring data) { processActionView(env, data); } } using namespace igl::shell::openxr; static void handleInitWindow(const struct android_app* app) { auto* xrApp = static_cast(app->userData); if (xrApp) { xrApp->setNativeWindow(app->window); } } static void handleTermWindow(const struct android_app* app) { auto* xrApp = static_cast(app->userData); if (xrApp) { xrApp->setNativeWindow(nullptr); } } static void handleResume(const struct android_app* app) { auto* xrApp = static_cast(app->userData); if (xrApp) { xrApp->setResumed(true); } } static void handlePause(const struct android_app* app) { auto* xrApp = static_cast(app->userData); if (xrApp) { xrApp->setResumed(false); } } static void handleDestroy(const struct android_app* app) { auto* xrApp = static_cast(app->userData); if (xrApp) { xrApp->setNativeWindow(nullptr); } } static void handleAppCmd(struct android_app* app, int32_t appCmd) { switch (appCmd) { case APP_CMD_INIT_WINDOW: IGL_LOG_INFO("APP_CMD_INIT_WINDOW"); handleInitWindow(app); break; case APP_CMD_TERM_WINDOW: IGL_LOG_INFO("APP_CMD_TERM_WINDOW"); handleTermWindow(app); break; case APP_CMD_RESUME: IGL_LOG_INFO("APP_CMD_RESUME"); handleResume(app); break; case APP_CMD_PAUSE: IGL_LOG_INFO("APP_CMD_PAUSE"); handlePause(app); break; case APP_CMD_STOP: IGL_LOG_INFO("APP_CMD_PAUSE"); break; case APP_CMD_DESTROY: IGL_LOG_INFO("APP_CMD_DESTROY"); handleDestroy(app); break; } } void android_main(struct android_app* app) { JNIEnv* env = nullptr; app->activity->vm->AttachCurrentThread(&env, nullptr); #ifdef ATTACH_DEBUGGER sleep(20); #endif #if defined(USE_VULKAN_BACKEND) auto xrApp = std::make_unique(std::make_unique()); #elif defined(USE_OPENGL_BACKEND) auto xrApp = std::make_unique(std::make_unique()); #endif if (!xrApp->initialize(app, {})) { return; } gInstance = xrApp->instance(); app->onAppCmd = handleAppCmd; app->userData = xrApp.get(); while (app->destroyRequested == 0) { for (;;) { int events = 0; struct android_poll_source* source = nullptr; // If the timeout is zero, returns immediately without blocking. // If the timeout is negative, waits indefinitely until an event appears. const int timeout = (!xrApp->resumed() && !xrApp->sessionActive() && app->destroyRequested == 0) ? -1 : 0; if (ALooper_pollAll(timeout, nullptr, &events, (void**)&source) < 0) { break; } if (source != nullptr) { source->process(app, source); } } xrApp->handleXrEvents(); if (!xrApp->sessionActive()) { continue; } for (const auto& actionView : gActionViewQueue) { xrApp->handleActionView(actionView); } gActionViewQueue.clear(); xrApp->update(); } app->activity->vm->DetachCurrentThread(); } #else // To run via MetaXR Simulator or Monado. int main(int argc, const char* argv[]) { #if IGL_PLATFORM_WINDOWS SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE); #endif // IGL_PLATFORM_WINDOWS #if defined(USE_VULKAN_BACKEND) // Do not present running on MetaXR Simulator. It has its own composition and present. auto xrApp = std::make_unique( std::make_unique(), false /* shouldPresent */); #elif defined(USE_OPENGL_BACKEND) // Do not present running on MetaXR Simulator. It has its own composition and present. auto xrApp = std::make_unique( std::make_unique(), false /* shouldPresent */); #endif if (!xrApp->initialize(nullptr, {})) { return 1; } gInstance = xrApp->instance(); xrApp->setResumed(true); for (;;) { xrApp->handleXrEvents(); if (!xrApp->sessionActive()) { break; } xrApp->update(); } return 0; } #endif // IGL_PLATFORM_ANDROID ================================================ FILE: shell/openxr/mobile/XrApp.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include #if IGL_PLATFORM_ANDROID #include // Ignore unused-include-check // @lint-ignore CLANGTIDY #include #endif #include #include #if IGL_PLATFORM_ANDROID #include #include #endif #if IGL_PLATFORM_WINDOWS #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #if !IGL_PLATFORM_ANDROID struct android_app {}; struct AAssetManager {}; #endif namespace igl::shell::openxr { constexpr auto kAppName = "IGL Shell OpenXR"; constexpr auto kEngineName = "IGL"; constexpr auto kSupportedViewConfigType = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO; XrApp::XrApp(std::unique_ptr&& impl, bool shouldPresent) : impl_(std::move(impl)), shellParams_(std::make_unique()) { shellParams_->shouldPresent = shouldPresent; viewports_.fill({XR_TYPE_VIEW_CONFIGURATION_VIEW}); views_.fill({XR_TYPE_VIEW}); #ifdef USE_COMPOSITION_LAYER_QUAD useQuadLayerComposition_ = true; #endif } XrApp::~XrApp() { if (!initialized_) { return; } renderSession_.reset(); compositionLayers_.clear(); passthrough_.reset(); hands_.reset(); if (currentSpace_ != XR_NULL_HANDLE) { xrDestroySpace(currentSpace_); } if (headSpace_ != XR_NULL_HANDLE) { xrDestroySpace(headSpace_); } if (session_ != XR_NULL_HANDLE) { xrDestroySession(session_); } if (instance_ != XR_NULL_HANDLE) { xrDestroyInstance(instance_); } platform_.reset(); } XrInstance XrApp::instance() const { return instance_; } XrSession XrApp::session() const { return session_; } bool XrApp::checkExtensions() { PFN_xrEnumerateInstanceExtensionProperties xrEnumerateInstanceExtensionProperties = nullptr; const XrResult result = xrGetInstanceProcAddr(XR_NULL_HANDLE, "xrEnumerateInstanceExtensionProperties", (PFN_xrVoidFunction*)&xrEnumerateInstanceExtensionProperties); XR_CHECK(result); if (result != XR_SUCCESS) { IGL_LOG_ERROR("Failed to get xrEnumerateInstanceExtensionProperties function pointer.\n"); return false; } uint32_t numExtensions = 0; XR_CHECK(xrEnumerateInstanceExtensionProperties(nullptr, 0, &numExtensions, nullptr)); IGL_LOG_INFO("xrEnumerateInstanceExtensionProperties found %u extension(s).\n", numExtensions); extensions_.resize(numExtensions, {XR_TYPE_EXTENSION_PROPERTIES}); XR_CHECK(xrEnumerateInstanceExtensionProperties( nullptr, numExtensions, &numExtensions, extensions_.data())); for (uint32_t i = 0; i < numExtensions; i++) { IGL_LOG_INFO("Extension #%d = '%s'.\n", i, extensions_[i].extensionName); } auto checkExtensionSupported = [this](const char* name) { return std::any_of(std::begin(extensions_), std::end(extensions_), [&](const XrExtensionProperties& extension) { return strcmp(extension.extensionName, name) == 0; }); }; // Check all required extensions are supported. auto requiredExtensionsImpl = impl_->getXrRequiredExtensions(); for (const char* requiredExtension : requiredExtensionsImpl) { if (!checkExtensionSupported(requiredExtension)) { IGL_LOG_ERROR("Extension %s is required, but not supported.\n", requiredExtension); return false; } } auto checkNeedEnableExtension = [this](const char* name) { return std::find_if(std::begin(enabledExtensions_), std::end(enabledExtensions_), [&](const char* extensionName) { return strcmp(extensionName, name) == 0; }) == std::end(enabledExtensions_); }; // Add required extensions to enabledExtensions_. for (const char* requiredExtension : requiredExtensionsImpl) { if (checkNeedEnableExtension(requiredExtension)) { IGL_LOG_INFO("Extension %s is enabled.\n", requiredExtension); enabledExtensions_.push_back(requiredExtension); } } // Get list of all optional extensions. auto optionalExtensionsImpl = impl_->getXrOptionalExtensions(); std::vector additionalOptionalExtensions = { #if IGL_PLATFORM_ANDROID XR_KHR_ANDROID_CREATE_INSTANCE_EXTENSION_NAME, #endif // IGL_PLATFORM_ANDROID #ifdef XR_FB_composition_layer_alpha_blend XR_FB_COMPOSITION_LAYER_ALPHA_BLEND_EXTENSION_NAME, #endif // XR_FB_composition_layer_alpha_blend }; optionalExtensionsImpl.insert(optionalExtensionsImpl.end(), std::begin(XrPassthrough::getExtensions()), std::end(XrPassthrough::getExtensions())); optionalExtensionsImpl.insert(optionalExtensionsImpl.end(), std::begin(XrHands::getExtensions()), std::end(XrHands::getExtensions())); optionalExtensionsImpl.insert(optionalExtensionsImpl.end(), std::begin(XrRefreshRate::getExtensions()), std::end(XrRefreshRate::getExtensions())); optionalExtensionsImpl.insert(optionalExtensionsImpl.end(), std::begin(additionalOptionalExtensions), std::end(additionalOptionalExtensions)); // Add optional extensions to enabledExtensions_. for (const char* optionalExtension : optionalExtensionsImpl) { if (checkExtensionSupported(optionalExtension)) { supportedOptionalXrExtensions_.insert(optionalExtension); if (checkNeedEnableExtension(optionalExtension)) { IGL_LOG_INFO("Extension %s is enabled.\n", optionalExtension); enabledExtensions_.push_back(optionalExtension); } } else { IGL_LOG_INFO("Warning: Extension %s is not supported.\n", optionalExtension); } } return true; } bool XrApp::createInstance() { XrApplicationInfo appInfo = {}; strcpy(appInfo.applicationName, kAppName); appInfo.applicationVersion = 0; strcpy(appInfo.engineName, kEngineName); appInfo.engineVersion = 0; appInfo.apiVersion = XR_MAKE_VERSION(1, 0, 34); const XrInstanceCreateInfo instanceCreateInfo = { .type = XR_TYPE_INSTANCE_CREATE_INFO, #if IGL_PLATFORM_ANDROID .next = instanceCreateInfoAndroidSupported() ? &instanceCreateInfoAndroid_ : nullptr, #else .next = nullptr, #endif // IGL_PLATFORM_ANDROID .createFlags = 0, .applicationInfo = appInfo, .enabledApiLayerCount = 0, .enabledApiLayerNames = nullptr, .enabledExtensionCount = static_cast(enabledExtensions_.size()), .enabledExtensionNames = enabledExtensions_.data(), }; const XrResult initResult = xrCreateInstance(&instanceCreateInfo, &instance_); XR_CHECK(initResult); if (initResult != XR_SUCCESS) { IGL_LOG_ERROR("Failed to create XR instance: %d.\n", initResult); return false; } XR_CHECK(xrGetInstanceProperties(instance_, &instanceProps_)); IGL_LOG_INFO("Runtime %s: Version : %u.%u.%u\n", instanceProps_.runtimeName, XR_VERSION_MAJOR(instanceProps_.runtimeVersion), XR_VERSION_MINOR(instanceProps_.runtimeVersion), XR_VERSION_PATCH(instanceProps_.runtimeVersion)); return true; } // namespace igl::shell::openxr bool XrApp::createSystem() { const XrSystemGetInfo systemGetInfo = { .type = XR_TYPE_SYSTEM_GET_INFO, .formFactor = XR_FORM_FACTOR_HEAD_MOUNTED_DISPLAY, }; const XrResult result = xrGetSystem(instance_, &systemGetInfo, &systemId_); XR_CHECK(result); if (result != XR_SUCCESS) { IGL_LOG_ERROR("Failed to get system.\n"); return false; } XR_CHECK(xrGetSystemProperties(instance_, systemId_, &systemProps_)); IGL_LOG_INFO( "System Properties: Name=%s VendorId=%x\n", systemProps_.systemName, systemProps_.vendorId); IGL_LOG_INFO("System Graphics Properties: MaxWidth=%d MaxHeight=%d MaxLayers=%d\n", systemProps_.graphicsProperties.maxSwapchainImageWidth, systemProps_.graphicsProperties.maxSwapchainImageHeight, systemProps_.graphicsProperties.maxLayerCount); IGL_LOG_INFO("System Tracking Properties: OrientationTracking=%s PositionTracking=%s\n", systemProps_.trackingProperties.orientationTracking ? "True" : "False", systemProps_.trackingProperties.positionTracking ? "True" : "False"); IGL_LOG_INFO("System Hand Tracking Properties: Supported=%s\n", handTrackingSystemProps_.supportsHandTracking ? "True" : "False"); return true; } bool XrApp::enumerateViewConfigurations() { uint32_t numViewConfigs = 0; XR_CHECK(xrEnumerateViewConfigurations(instance_, systemId_, 0, &numViewConfigs, nullptr)); std::vector viewConfigTypes(numViewConfigs); XR_CHECK(xrEnumerateViewConfigurations( instance_, systemId_, numViewConfigs, &numViewConfigs, viewConfigTypes.data())); IGL_LOG_INFO("Available Viewport Configuration Types: %d\n", numViewConfigs); auto foundViewConfig = false; for (auto& viewConfigType : viewConfigTypes) { IGL_LOG_INFO("View configuration type %d : %s\n", viewConfigType, viewConfigType == kSupportedViewConfigType ? "Selected" : ""); if (viewConfigType != kSupportedViewConfigType) { continue; } // Check properties XrViewConfigurationProperties viewConfigProps = {XR_TYPE_VIEW_CONFIGURATION_PROPERTIES}; XR_CHECK( xrGetViewConfigurationProperties(instance_, systemId_, viewConfigType, &viewConfigProps)); IGL_LOG_INFO("FovMutable=%s ConfigurationType %d\n", viewConfigProps.fovMutable ? "true" : "false", viewConfigProps.viewConfigurationType); // Check views uint32_t numViewports = 0; XR_CHECK(xrEnumerateViewConfigurationViews( instance_, systemId_, viewConfigType, 0, &numViewports, nullptr)); if (!IGL_DEBUG_VERIFY(numViewports == XrComposition::kNumViews)) { IGL_LOG_ERROR( "numViewports must be %d. Make sure XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO is used.\n", XrComposition::kNumViews); return false; } XR_CHECK(xrEnumerateViewConfigurationViews( instance_, systemId_, viewConfigType, numViewports, &numViewports, viewports_.data())); for (auto& view : viewports_) { (void)view; // doesn't compile in release for unused variable IGL_LOG_INFO("Viewport [%d]: Recommended Width=%d Height=%d SampleCount=%d\n", view, view.recommendedImageRectWidth, view.recommendedImageRectHeight, view.recommendedSwapchainSampleCount); IGL_LOG_INFO("Viewport [%d]: Max Width=%d Height=%d SampleCount=%d\n", view, view.maxImageRectWidth, view.maxImageRectHeight, view.maxSwapchainSampleCount); } viewConfigProps_ = viewConfigProps; foundViewConfig = true; break; } IGL_DEBUG_ASSERT( foundViewConfig, "XrViewConfigurationType %d not found.", kSupportedViewConfigType); return true; } void XrApp::enumerateReferenceSpaces() { uint32_t numRefSpaceTypes = 0; XR_CHECK(xrEnumerateReferenceSpaces(session_, 0, &numRefSpaceTypes, nullptr)); std::vector refSpaceTypes(numRefSpaceTypes); XR_CHECK(xrEnumerateReferenceSpaces( session_, numRefSpaceTypes, &numRefSpaceTypes, refSpaceTypes.data())); stageSpaceSupported_ = std::any_of(std::begin(refSpaceTypes), std::end(refSpaceTypes), [](const auto& type) { return type == XR_REFERENCE_SPACE_TYPE_STAGE; }); IGL_LOG_INFO("OpenXR stage reference space is %s\n", stageSpaceSupported_ ? "supported" : "not supported"); } void XrApp::enumerateBlendModes() { uint32_t numBlendModes = 0; XR_CHECK(xrEnumerateEnvironmentBlendModes( instance_, systemId_, kSupportedViewConfigType, 0, &numBlendModes, nullptr)); std::vector blendModes(numBlendModes); XR_CHECK(xrEnumerateEnvironmentBlendModes(instance_, systemId_, kSupportedViewConfigType, numBlendModes, &numBlendModes, blendModes.data())); additiveBlendingSupported_ = std::any_of(std::begin(blendModes), std::end(blendModes), [](const auto& type) { return type == XR_ENVIRONMENT_BLEND_MODE_ADDITIVE; }); IGL_LOG_INFO("OpenXR additive blending %s\n", additiveBlendingSupported_ ? "supported" : "not supported"); } bool XrApp::initialize(const struct android_app* app, const InitParams& params) { if (initialized_) { return false; } #if IGL_PLATFORM_ANDROID PFN_xrInitializeLoaderKHR xrInitializeLoaderKHR = nullptr; XR_CHECK(xrGetInstanceProcAddr( XR_NULL_HANDLE, "xrInitializeLoaderKHR", (PFN_xrVoidFunction*)&xrInitializeLoaderKHR)); if (xrInitializeLoaderKHR) { XrLoaderInitInfoAndroidKHR loaderInitializeInfoAndroid = { XR_TYPE_LOADER_INIT_INFO_ANDROID_KHR, nullptr, app->activity->vm, app->activity->clazz, }; XR_CHECK(xrInitializeLoaderKHR((XrLoaderInitInfoBaseHeaderKHR*)&loaderInitializeInfoAndroid)); } instanceCreateInfoAndroid_.applicationVM = app->activity->vm; instanceCreateInfoAndroid_.applicationActivity = app->activity->clazz; #endif if (!checkExtensions()) { return false; } if (!createInstance()) { return false; } if (!createSystem()) { return false; } if (!enumerateViewConfigurations()) { return false; } std::unique_ptr device; device = impl_->initIGL(instance_, systemId_); if (!device) { IGL_LOG_ERROR("Failed to initialize IGL\n"); return false; } #if IGL_WGL // Single stereo render pass is not supported for OpenGL on Windows. useSinglePassStereo_ = false; #else useSinglePassStereo_ = useSinglePassStereo_ && device->hasFeature(igl::DeviceFeatures::Multiview); #endif #if IGL_PLATFORM_ANDROID createShellSession(std::move(device), app->activity->assetManager); #else createShellSession(std::move(device), nullptr); #endif session_ = impl_->initXrSession(instance_, systemId_, platform_->getDevice(), sessionConfig_); if (session_ == XR_NULL_HANDLE) { IGL_LOG_ERROR("Failed to initialize graphics system\n"); return false; } // The following are initialization steps that happen after XrSession is created. enumerateReferenceSpaces(); enumerateBlendModes(); createSpaces(); if (passthroughSupported()) { passthrough_ = std::make_unique(instance_, session_); if (!passthrough_->initialize()) { return false; } } if (handTrackingSupported()) { hands_ = std::make_unique(instance_, session_, handTrackingMeshSupported()); if (!hands_->initialize()) { return false; } } if (refreshRateExtensionSupported()) { refreshRate_ = std::make_unique(instance_, session_); if (!refreshRate_->initialize(params.refreshRateParams)) { return false; } } if (hands_) { hands_->updateMeshes(shellParams_->handMeshes); } IGL_DEBUG_ASSERT(renderSession_ != nullptr); renderSession_->initialize(); if (useQuadLayerComposition_) { updateQuadComposition(); } else { compositionLayers_.emplace_back(std::make_unique( *impl_, platform_, session_, useSinglePassStereo_)); compositionLayers_.back()->updateSwapchainImageInfo( {impl::SwapchainImageInfo{ .imageWidth = viewports_[0].recommendedImageRectWidth, .imageHeight = viewports_[0].recommendedImageRectHeight, }, impl::SwapchainImageInfo{ .imageWidth = viewports_[1].recommendedImageRectWidth, .imageHeight = viewports_[1].recommendedImageRectHeight, }}); } initialized_ = true; return initialized_; } // NOLINTNEXTLINE(bugprone-exception-escape) void XrApp::updateQuadComposition() noexcept { const auto& appParams = renderSession_->appParams(); constexpr uint32_t kQuadLayerDefaultImageSize = 1024; const auto aspect = appParams.sizeY / appParams.sizeX; QuadLayerParams quadLayersParams = { .layerInfo = {{ #if USE_LOCAL_AR_SPACE .position = {0.0f, 0.0f, -1.0f}, #else .position = {0.0f, 0.0f, 0.0f}, #endif .size = {appParams.sizeX, appParams.sizeY}, .blendMode = LayerBlendMode::AlphaBlend, .imageWidth = kQuadLayerDefaultImageSize, .imageHeight = static_cast(kQuadLayerDefaultImageSize * aspect), }}}; if (appParams.quadLayerParamsGetter) { auto params = appParams.quadLayerParamsGetter(); if (params.numQuads() > 0) { quadLayersParams = std::move(params); } } std::array swapchainImageInfo{}; for (size_t i = 0; i < quadLayersParams.numQuads(); ++i) { swapchainImageInfo.fill({ .imageWidth = quadLayersParams.layerInfo[i].imageWidth, .imageHeight = quadLayersParams.layerInfo[i].imageHeight, }); if (i < compositionLayers_.size()) { auto* quadLayer = static_cast(compositionLayers_[i].get()); quadLayer->updateQuadLayerInfo(quadLayersParams.layerInfo[i]); quadLayer->updateSwapchainImageInfo(swapchainImageInfo); } else { compositionLayers_.emplace_back( std::make_unique(*impl_, platform_, session_, useSinglePassStereo_, alphaBlendCompositionSupported(), quadLayersParams.layerInfo[i])); compositionLayers_.back()->updateSwapchainImageInfo(swapchainImageInfo); } } // Remove any layers that are no longer needed. compositionLayers_.resize(quadLayersParams.numQuads()); } void XrApp::createShellSession(std::unique_ptr device, AAssetManager* assetMgr) { #if IGL_PLATFORM_ANDROID platform_ = std::make_shared(std::move(device)); IGL_DEBUG_ASSERT(platform_ != nullptr); static_cast(platform_->getFileLoader()).setAssetManager(assetMgr); #elif IGL_PLATFORM_APPLE platform_ = std::make_shared(std::move(device)); #elif IGL_PLATFORM_WINDOWS platform_ = std::make_shared(std::move(device)); #endif auto factory = igl::shell::createDefaultRenderSessionFactory(); const auto requestedSessionConfigs = factory->requestedSessionConfigs(shell::ShellType::OpenXR, {impl_->suggestedSessionConfig()}); if (IGL_DEBUG_VERIFY_NOT(requestedSessionConfigs.size() != 1)) { return; } sessionConfig_ = requestedSessionConfigs[0]; renderSession_ = factory->createRenderSession(platform_); shellParams_->shellControlsViewParams = true; shellParams_->rightHandedCoordinateSystem = true; shellParams_->renderMode = useSinglePassStereo_ ? RenderMode::SinglePassStereo : RenderMode::DualPassStereo; shellParams_->viewParams.resize(useSinglePassStereo_ ? 2 : 1); renderSession_->setShellParams(*shellParams_); } void XrApp::createSpaces() { XrReferenceSpaceCreateInfo spaceCreateInfo = { XR_TYPE_REFERENCE_SPACE_CREATE_INFO, nullptr, XR_REFERENCE_SPACE_TYPE_VIEW, {{0.0f, 0.0f, 0.0f, 1.0f}}, }; XR_CHECK(xrCreateReferenceSpace(session_, &spaceCreateInfo, &headSpace_)); #if USE_LOCAL_AR_SPACE spaceCreateInfo.referenceSpaceType = XR_REFERENCE_SPACE_TYPE_LOCAL; #else spaceCreateInfo.referenceSpaceType = stageSpaceSupported_ ? XR_REFERENCE_SPACE_TYPE_STAGE : XR_REFERENCE_SPACE_TYPE_LOCAL; #endif XR_CHECK(xrCreateReferenceSpace(session_, &spaceCreateInfo, ¤tSpace_)); } void XrApp::handleXrEvents() { XrEventDataBuffer eventDataBuffer = {}; // Poll for events for (;;) { auto* baseEventHeader = (XrEventDataBaseHeader*)(&eventDataBuffer); baseEventHeader->type = XR_TYPE_EVENT_DATA_BUFFER; baseEventHeader->next = nullptr; const XrResult res = xrPollEvent(instance_, &eventDataBuffer); XR_CHECK(res); if (res != XR_SUCCESS) { break; } switch (baseEventHeader->type) { case XR_TYPE_EVENT_DATA_EVENTS_LOST: IGL_LOG_INFO("xrPollEvent: received XR_TYPE_EVENT_DATA_EVENTS_LOST event\n"); break; case XR_TYPE_EVENT_DATA_INSTANCE_LOSS_PENDING: IGL_LOG_INFO("xrPollEvent: received XR_TYPE_EVENT_DATA_INSTANCE_LOSS_PENDING event\n"); break; case XR_TYPE_EVENT_DATA_INTERACTION_PROFILE_CHANGED: IGL_LOG_INFO("xrPollEvent: received XR_TYPE_EVENT_DATA_INTERACTION_PROFILE_CHANGED event\n"); break; case XR_TYPE_EVENT_DATA_PERF_SETTINGS_EXT: { const XrEventDataPerfSettingsEXT* perfSettingsEvent = (XrEventDataPerfSettingsEXT*)(baseEventHeader); (void)perfSettingsEvent; // suppress unused warning IGL_LOG_INFO( "xrPollEvent: received XR_TYPE_EVENT_DATA_PERF_SETTINGS_EXT event: type %d subdomain %d " ": level %d -> level %d\n", perfSettingsEvent->type, perfSettingsEvent->subDomain, perfSettingsEvent->fromLevel, perfSettingsEvent->toLevel); } break; case XR_TYPE_EVENT_DATA_REFERENCE_SPACE_CHANGE_PENDING: IGL_LOG_INFO( "xrPollEvent: received XR_TYPE_EVENT_DATA_REFERENCE_SPACE_CHANGE_PENDING event\n"); break; case XR_TYPE_EVENT_DATA_SESSION_STATE_CHANGED: { const XrEventDataSessionStateChanged* sessionStateChangedEvent = (XrEventDataSessionStateChanged*)(baseEventHeader); IGL_LOG_INFO( "xrPollEvent: received XR_TYPE_EVENT_DATA_SESSION_STATE_CHANGED: %d for session %p at " "time %lld\n", sessionStateChangedEvent->state, (void*)sessionStateChangedEvent->session, sessionStateChangedEvent->time); switch (sessionStateChangedEvent->state) { case XR_SESSION_STATE_READY: case XR_SESSION_STATE_STOPPING: handleSessionStateChanges(sessionStateChangedEvent->state); break; default: break; } } break; default: IGL_LOG_INFO("xrPollEvent: Unknown event\n"); break; } } } void XrApp::handleActionView(const std::string& data) { if (platform_ != nullptr) { IntentEvent event; event.type = igl::shell::IntentType::ActionView; event.data = data; platform_->getInputDispatcher().queueEvent(event); } } void XrApp::handleSessionStateChanges(XrSessionState state) { if (state == XR_SESSION_STATE_READY) { #if !defined(IGL_CMAKE_BUILD) assert(resumed_); #endif // IGL_CMAKE_BUILD assert(sessionActive_ == false); const XrSessionBeginInfo sessionBeginInfo{ XR_TYPE_SESSION_BEGIN_INFO, nullptr, viewConfigProps_.viewConfigurationType, }; const XrResult result = xrBeginSession(session_, &sessionBeginInfo); XR_CHECK(result); sessionActive_ = (result == XR_SUCCESS); IGL_LOG_INFO("XR session active\n"); } else if (state == XR_SESSION_STATE_STOPPING) { assert(sessionActive_); XR_CHECK(xrEndSession(session_)); sessionActive_ = false; IGL_LOG_INFO("XR session inactive\n"); } } XrFrameState XrApp::beginFrame() { if (passthrough_) { const bool ptEnabled = passthroughEnabled(); passthrough_->setEnabled(ptEnabled); if (ptEnabled) { passthrough_->setOpacity(renderSession_->appParams().passthroughOpacity); } } if (useQuadLayerComposition_) { updateQuadComposition(); } const XrFrameWaitInfo waitFrameInfo = {XR_TYPE_FRAME_WAIT_INFO}; XrFrameState frameState = {XR_TYPE_FRAME_STATE}; XR_CHECK(xrWaitFrame(session_, &waitFrameInfo, &frameState)); const XrFrameBeginInfo beginFrameInfo = {XR_TYPE_FRAME_BEGIN_INFO}; XR_CHECK(xrBeginFrame(session_, &beginFrameInfo)); XrSpaceLocation loc = { loc.type = XR_TYPE_SPACE_LOCATION, }; XR_CHECK(xrLocateSpace(headSpace_, currentSpace_, frameState.predictedDisplayTime, &loc)); const XrPosef headPose = loc.pose; XrViewState viewState = {XR_TYPE_VIEW_STATE}; const XrViewLocateInfo projectionInfo = { XR_TYPE_VIEW_LOCATE_INFO, nullptr, viewConfigProps_.viewConfigurationType, frameState.predictedDisplayTime, headSpace_, }; uint32_t numViews = views_.size(); XR_CHECK(xrLocateViews( session_, &projectionInfo, &viewState, views_.size(), &numViews, views_.data())); for (size_t i = 0; i < XrComposition::kNumViews; i++) { const XrPosef eyePose = views_[i].pose; XrPosef_Multiply(&viewStagePoses_[i], &headPose, &eyePose); XrPosef viewTransformXrPosef{}; XrPosef_Invert(&viewTransformXrPosef, &viewStagePoses_[i]); XrMatrix4x4f xrMat4{}; XrMatrix4x4f_CreateFromRigidTransform(&xrMat4, &viewTransformXrPosef); viewTransforms_[i] = glm::make_mat4(xrMat4.m); cameraPositions_[i] = glm::vec3(eyePose.position.x, eyePose.position.y, eyePose.position.z); } if (hands_) { hands_->updateTracking(currentSpace_, shellParams_->handTracking); } return frameState; } void XrApp::render() { if (passthrough_) { if (passthroughEnabled()) { shellParams_->clearColorValue = Color{0.0f, 0.0f, 0.0f, 0.0f}; } else { shellParams_->clearColorValue.reset(); } } #if USE_FORCE_ZERO_CLEAR else { shellParams_->clearColorValue = Color{0.0f, 0.0f, 0.0f, 0.0f}; } #endif for (size_t layerIndex = 0; layerIndex < compositionLayers_.size(); ++layerIndex) { if (!compositionLayers_[layerIndex]->isValid()) { continue; } for (uint32_t i = 0; i < compositionLayers_[layerIndex]->renderPassesCount(); ++i) { auto surfaceTextures = compositionLayers_[layerIndex]->beginRendering( i, views_, viewTransforms_, cameraPositions_, shellParams_->viewParams); renderSession_->setCurrentQuadLayer(useQuadLayerComposition_ ? layerIndex : 0); renderSession_->update(std::move(surfaceTextures)); compositionLayers_[layerIndex]->endRendering(i); } } } void XrApp::endFrame(XrFrameState frameState) { XrCompositionLayerFlags compositionFlags = XR_COMPOSITION_LAYER_CORRECT_CHROMATIC_ABERRATION_BIT; if (passthroughEnabled()) { compositionFlags |= XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT; } std::vector layers; layers.reserve(1 + compositionLayers_.size() * (useQuadLayerComposition_ ? 2 : 1)); if (passthroughEnabled()) { passthrough_->injectLayer(layers); } const auto& appParams = renderSession_->appParams(); for (const auto& layer : compositionLayers_) { if (layer->isValid()) { layer->doComposition( appParams.depthParams, views_, viewStagePoses_, currentSpace_, compositionFlags, layers); } } const XrFrameEndInfo endFrameInfo{ .type = XR_TYPE_FRAME_END_INFO, .next = nullptr, .displayTime = frameState.predictedDisplayTime, .environmentBlendMode = additiveBlendingSupported_ ? XR_ENVIRONMENT_BLEND_MODE_ADDITIVE : XR_ENVIRONMENT_BLEND_MODE_OPAQUE, .layerCount = static_cast(layers.size()), .layers = layers.data(), }; XR_CHECK(xrEndFrame(session_, &endFrameInfo)); } void XrApp::update() { if (!initialized_ || !resumed_ || !sessionActive_) { return; } if (platform_ != nullptr) { platform_->getInputDispatcher().processEvents(); } auto frameState = beginFrame(); render(); endFrame(frameState); } bool XrApp::passthroughSupported() const noexcept { // NOLINT(bugprone-exception-escape) return supportedOptionalXrExtensions_.count(XR_FB_PASSTHROUGH_EXTENSION_NAME) != 0; } bool XrApp::passthroughEnabled() const noexcept { // NOLINT(bugprone-exception-escape) if (!renderSession_ || !passthrough_) { return false; } const auto& appParams = renderSession_->appParams(); return appParams.passthroughGetter ? appParams.passthroughGetter() : useQuadLayerComposition_; } bool XrApp::handTrackingSupported() const noexcept { // NOLINT(bugprone-exception-escape) #if IGL_PLATFORM_ANDROID return supportedOptionalXrExtensions_.count(XR_EXT_HAND_TRACKING_EXTENSION_NAME) != 0 && handTrackingSystemProps_.supportsHandTracking != 0u; #endif // IGL_PLATFORM_ANDROID return false; } bool XrApp::handTrackingMeshSupported() const noexcept { // NOLINT(bugprone-exception-escape) #if IGL_PLATFORM_ANDROID return supportedOptionalXrExtensions_.count(XR_FB_HAND_TRACKING_MESH_EXTENSION_NAME) != 0; #endif // IGL_PLATFORM_ANDROID return false; } bool XrApp::refreshRateExtensionSupported() const noexcept { // NOLINT(bugprone-exception-escape) return supportedOptionalXrExtensions_.count(XR_FB_DISPLAY_REFRESH_RATE_EXTENSION_NAME) != 0; } bool XrApp::instanceCreateInfoAndroidSupported() const noexcept { // NOLINT(bugprone-exception-escape) #if IGL_PLATFORM_ANDROID return supportedOptionalXrExtensions_.count(XR_KHR_ANDROID_CREATE_INSTANCE_EXTENSION_NAME) != 0; #endif // IGL_PLATFORM_ANDROID return false; } bool XrApp::alphaBlendCompositionSupported() const noexcept { // NOLINT(bugprone-exception-escape) #ifdef XR_FB_composition_layer_alpha_blend return supportedOptionalXrExtensions_.count(XR_FB_COMPOSITION_LAYER_ALPHA_BLEND_EXTENSION_NAME) != 0; #endif // XR_FB_composition_layer_alpha_blend return false; } } // namespace igl::shell::openxr ================================================ FILE: shell/openxr/mobile/java/com/facebook/igl/shell/openxr/gles/AndroidManifest.xml ================================================ ================================================ FILE: shell/openxr/mobile/java/com/facebook/igl/shell/openxr/gles/MainActivity.java ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only package com.facebook.igl.shell.openxr.gles; import android.content.Intent; public class MainActivity extends android.app.NativeActivity { static { System.loadLibrary("openxr-gles-Jni"); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); if (intent != null && Intent.ACTION_VIEW.equals(intent.getAction())) { onActionView(intent.getStringExtra("data")); } } private native void onActionView(String data); } ================================================ FILE: shell/openxr/mobile/java/com/facebook/igl/shell/openxr/vulkan/AndroidManifest.xml ================================================ ================================================ FILE: shell/openxr/mobile/java/com/facebook/igl/shell/openxr/vulkan/MainActivity.java ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only package com.facebook.igl.shell.openxr.vulkan; import android.content.Intent; public class MainActivity extends android.app.NativeActivity { static { System.loadLibrary("openxr-vulkan-Jni"); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); if (intent != null && Intent.ACTION_VIEW.equals(intent.getAction())) { onActionView(intent.getStringExtra("data")); } } private native void onActionView(String data); } ================================================ FILE: shell/openxr/mobile/opengl/XrAppImplGLES.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #if IGL_WGL #include #include #else #include #include #endif // IGL_WGL #include #include namespace igl::shell::openxr::mobile { RenderSessionConfig XrAppImplGLES::suggestedSessionConfig() const { return {.displayName = "OpenGL ES 3.2", .backendVersion = {.flavor = igl::BackendFlavor::OpenGL_ES, .majorVersion = 3, .minorVersion = 2}, .swapchainColorTextureFormat = igl::TextureFormat::RGBA_SRGB}; } std::vector XrAppImplGLES::getXrRequiredExtensions() const { return { #if IGL_WGL XR_KHR_OPENGL_ENABLE_EXTENSION_NAME, #else XR_KHR_OPENGL_ES_ENABLE_EXTENSION_NAME, #endif // IGL_WGL XR_KHR_COMPOSITION_LAYER_DEPTH_EXTENSION_NAME, }; } std::vector XrAppImplGLES::getXrOptionalExtensions() const { return {}; } std::unique_ptr XrAppImplGLES::initIGL(XrInstance instance, XrSystemId systemId) { // Get the graphics requirements. // XR_ERROR_GRAPHICS_REQUIREMENTS_CALL_MISSING is returned on calls to xrCreateSession // if this function has not been called for the instance and systemId before xrCreateSession. #if IGL_WGL PFN_xrGetOpenGLGraphicsRequirementsKHR pfnGetOpenGLGraphicsRequirementsKHR = NULL; XR_CHECK(xrGetInstanceProcAddr(instance, "xrGetOpenGLGraphicsRequirementsKHR", (PFN_xrVoidFunction*)(&pfnGetOpenGLGraphicsRequirementsKHR))); XR_CHECK(pfnGetOpenGLGraphicsRequirementsKHR(instance, systemId, &graphicsRequirements_)); auto hwDevice = opengl::wgl::HWDevice(); #else PFN_xrGetOpenGLESGraphicsRequirementsKHR pfnGetOpenGLESGraphicsRequirementsKHR = nullptr; XR_CHECK(xrGetInstanceProcAddr(instance, "xrGetOpenGLESGraphicsRequirementsKHR", (PFN_xrVoidFunction*)(&pfnGetOpenGLESGraphicsRequirementsKHR))); XR_CHECK(pfnGetOpenGLESGraphicsRequirementsKHR(instance, systemId, &graphicsRequirements_)); auto hwDevice = opengl::egl::HWDevice(); #endif // IGL_WGL Result result; return hwDevice.create(&result); } XrSession XrAppImplGLES::initXrSession(XrInstance instance, XrSystemId systemId, IDevice& device, const RenderSessionConfig& sessionConfig) { IGL_DEBUG_ASSERT(sessionConfig.backendVersion.flavor == igl::BackendFlavor::OpenGL_ES); sessionConfig_ = sessionConfig; device_ = &device; const auto& glDevice = static_cast(device); // Downcast is safe here #if IGL_WGL const auto& context = static_cast(glDevice.getContext()); // Downcast is safe here XrGraphicsBindingOpenGLWin32KHR graphicsBindingGL = { .type = XR_TYPE_GRAPHICS_BINDING_OPENGL_WIN32_KHR, .next = nullptr, .hDC = context.getDeviceContext(), .hGLRC = context.getRenderContext()}; #else const auto& context = static_cast(glDevice.getContext()); // Downcast is safe here XrGraphicsBindingOpenGLESAndroidKHR graphicsBindingGL = { .type = XR_TYPE_GRAPHICS_BINDING_OPENGL_ES_ANDROID_KHR, .next = nullptr, .display = context.getDisplay(), .config = context.getConfig(), .context = context.get(), }; #endif // IGL_WGL const XrSessionCreateInfo sessionCreateInfo = { .type = XR_TYPE_SESSION_CREATE_INFO, .next = &graphicsBindingGL, .createFlags = 0, .systemId = systemId, }; XrResult xrResult(XR_SUCCESS); XrSession session = nullptr; XR_CHECK(xrResult = xrCreateSession(instance, &sessionCreateInfo, &session)); if (xrResult != XR_SUCCESS) { IGL_LOG_ERROR("Failed to create XR session: %d.\n", xrResult); return XR_NULL_HANDLE; } IGL_LOG_INFO("XR session created.\n"); return session; } std::unique_ptr XrAppImplGLES::createSwapchainProviderImpl() const { if (IGL_DEBUG_VERIFY(device_)) { return std::make_unique( *device_, sessionConfig_.swapchainColorTextureFormat); } return nullptr; } } // namespace igl::shell::openxr::mobile ================================================ FILE: shell/openxr/mobile/opengl/XrAppImplGLES.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::shell::openxr::mobile { class XrAppImplGLES final : public impl::XrAppImpl { public: [[nodiscard]] RenderSessionConfig suggestedSessionConfig() const override; [[nodiscard]] std::vector getXrRequiredExtensions() const override; [[nodiscard]] std::vector getXrOptionalExtensions() const override; [[nodiscard]] std::unique_ptr initIGL(XrInstance instance, XrSystemId systemId) override; [[nodiscard]] XrSession initXrSession(XrInstance instance, XrSystemId systemId, igl::IDevice& device, const RenderSessionConfig& sessionConfig) override; [[nodiscard]] std::unique_ptr createSwapchainProviderImpl() const override; private: #if IGL_WGL XrGraphicsRequirementsOpenGLKHR graphicsRequirements_ = { .type = XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_KHR, }; #else XrGraphicsRequirementsOpenGLESKHR graphicsRequirements_ = { .type = XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_ES_KHR, }; #endif // IGL_WGL igl::IDevice* device_ = nullptr; RenderSessionConfig sessionConfig_; }; } // namespace igl::shell::openxr::mobile ================================================ FILE: shell/openxr/mobile/opengl/XrSwapchainProviderImplGLES.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include #include #include namespace igl::shell::openxr::mobile { namespace { void enumerateSwapchainImages(XrSwapchain swapchain, std::vector& outImages) { uint32_t numImages = 0; XR_CHECK(xrEnumerateSwapchainImages(swapchain, 0, &numImages, nullptr)); IGL_LOG_INFO("XRSwapchain numImages: %d\n", numImages); #if IGL_WGL std::vector xrImages(numImages, { .type = XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_KHR, .next = nullptr, }); #else std::vector xrImages( numImages, { .type = XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_ES_KHR, .next = nullptr, }); #endif // IGL_WGL XR_CHECK(xrEnumerateSwapchainImages( swapchain, numImages, &numImages, (XrSwapchainImageBaseHeader*)xrImages.data())); outImages.resize(0); std::transform(xrImages.cbegin(), xrImages.cend(), std::back_inserter(outImages), [](const auto& xrImage) { return xrImage.image; }); } std::shared_ptr getSurfaceTexture(IDevice& device, const XrSwapchain& swapchain, const impl::SwapchainImageInfo& swapchainImageInfo, uint8_t numViews, const std::vector& images, TextureFormat externalTextureFormat, std::vector>& inOutTextures) { uint32_t imageIndex = 0; const XrSwapchainImageAcquireInfo acquireInfo{XR_TYPE_SWAPCHAIN_IMAGE_ACQUIRE_INFO}; XR_CHECK(xrAcquireSwapchainImage(swapchain, &acquireInfo, &imageIndex)); XrSwapchainImageWaitInfo waitInfo{XR_TYPE_SWAPCHAIN_IMAGE_WAIT_INFO}; waitInfo.timeout = XR_INFINITE_DURATION; XR_CHECK(xrWaitSwapchainImage(swapchain, &waitInfo)); const auto glTexture = images[imageIndex]; if (imageIndex >= inOutTextures.size()) { inOutTextures.resize(static_cast(imageIndex) + 1, nullptr); } auto texture = inOutTextures[imageIndex]; if (!texture || swapchainImageInfo.imageWidth != texture->getSize().width || swapchainImageInfo.imageHeight != texture->getSize().height) { auto* const platformDevice = device.getPlatformDevice(); texture = platformDevice->createTextureBufferExternal( glTexture, numViews > 1 ? GL_TEXTURE_2D_ARRAY : GL_TEXTURE_2D, igl::TextureDesc::TextureUsageBits::Attachment, swapchainImageInfo.imageWidth, swapchainImageInfo.imageHeight, externalTextureFormat, numViews); if (!texture) { IGL_LOG_ERROR("Failed to create ITexture from swapchain image.\n"); return {}; } inOutTextures[imageIndex] = std::move(texture); } return inOutTextures[imageIndex]; } } // namespace XrSwapchainProviderImplGLES::XrSwapchainProviderImplGLES(const igl::IDevice& device, TextureFormat preferredColorFormat) { const auto& openglDevice = static_cast(device); igl::opengl::Texture::FormatDescGL formatDescGL; igl::opengl::Texture::toFormatDescGL(openglDevice.getContext(), preferredColorFormat, TextureDesc::TextureUsageBits::Attachment | TextureDesc::TextureUsageBits::Sampled, formatDescGL); preferredColorFormat_ = formatDescGL.internalFormat; } void XrSwapchainProviderImplGLES::enumerateImages( IDevice& /*device*/, XrSwapchain colorSwapchain, XrSwapchain depthSwapchain, const impl::SwapchainImageInfo& /* swapchainImageInfo */, uint8_t /* numViews */) noexcept { // NOLINT(bugprone-exception-escape) enumerateSwapchainImages(colorSwapchain, colorImages_); enumerateSwapchainImages(depthSwapchain, depthImages_); } SurfaceTextures XrSwapchainProviderImplGLES::getSurfaceTextures( IDevice& device, XrSwapchain colorSwapchain, XrSwapchain depthSwapchain, const impl::SwapchainImageInfo& swapchainImageInfo, uint8_t numViews) noexcept { // NOLINT(bugprone-exception-escape) // Assume sized format so format / type are not needed. auto iglColorFormat = igl::opengl::Texture::glInternalFormatToTextureFormat( static_cast(swapchainImageInfo.colorFormat), 0, 0); auto colorTexture = getSurfaceTexture(device, colorSwapchain, swapchainImageInfo, numViews, colorImages_, iglColorFormat, colorTextures_); auto iglDepthFormat = igl::opengl::Texture::glInternalFormatToTextureFormat( static_cast(swapchainImageInfo.depthFormat), 0, 0); auto depthTexture = getSurfaceTexture(device, depthSwapchain, swapchainImageInfo, numViews, depthImages_, iglDepthFormat, depthTextures_); return {.color = colorTexture, .depth = depthTexture}; } } // namespace igl::shell::openxr::mobile ================================================ FILE: shell/openxr/mobile/opengl/XrSwapchainProviderImplGLES.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include namespace igl::shell::openxr::mobile { class XrSwapchainProviderImplGLES final : public impl::XrSwapchainProviderImpl { public: XrSwapchainProviderImplGLES(const igl::IDevice& device, igl::TextureFormat preferredColorFormat); // NOLINTNEXTLINE(bugprone-exception-escape) [[nodiscard]] std::vector preferredColorFormats() const noexcept final { return {preferredColorFormat_}; } // NOLINTNEXTLINE(bugprone-exception-escape) [[nodiscard]] std::vector preferredDepthFormats() const noexcept final { return {GL_DEPTH_COMPONENT16}; } void enumerateImages(igl::IDevice& device, XrSwapchain colorSwapchain, XrSwapchain depthSwapchain, const impl::SwapchainImageInfo& swapchainImageInfo, uint8_t numViews) noexcept final; [[nodiscard]] igl::SurfaceTextures getSurfaceTextures( igl::IDevice& device, XrSwapchain colorSwapchain, XrSwapchain depthSwapchain, const impl::SwapchainImageInfo& swapchainImageInfo, uint8_t numViews) noexcept final; private: int64_t preferredColorFormat_; std::vector colorImages_; std::vector depthImages_; }; } // namespace igl::shell::openxr::mobile ================================================ FILE: shell/openxr/mobile/vulkan/XrAppImplVulkan.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include #include #include namespace igl::shell::openxr::mobile { RenderSessionConfig XrAppImplVulkan::suggestedSessionConfig() const { return {.displayName = "Vulkan 1.1", .backendVersion = {.flavor = igl::BackendFlavor::Vulkan, .majorVersion = 1, .minorVersion = 1}, .swapchainColorTextureFormat = igl::TextureFormat::RGBA_SRGB}; } std::vector XrAppImplVulkan::getXrRequiredExtensions() const { return { XR_KHR_VULKAN_ENABLE_EXTENSION_NAME, XR_KHR_COMPOSITION_LAYER_DEPTH_EXTENSION_NAME, }; } std::vector XrAppImplVulkan::getXrOptionalExtensions() const { return { #if IGL_PLATFORM_ANDROID XR_FB_SWAPCHAIN_UPDATE_STATE_VULKAN_EXTENSION_NAME, #endif }; } std::unique_ptr XrAppImplVulkan::initIGL(XrInstance instance, XrSystemId systemId) { // Get the API requirements. // XR_ERROR_GRAPHICS_REQUIREMENTS_CALL_MISSING is returned on calls to xrCreateSession // if this function has not been called for the instance and systemId before xrCreateSession. PFN_xrGetVulkanGraphicsRequirementsKHR pfnGetVulkanGraphicsRequirementsKHR = nullptr; XR_CHECK(xrGetInstanceProcAddr(instance, "xrGetVulkanGraphicsRequirementsKHR", (PFN_xrVoidFunction*)(&pfnGetVulkanGraphicsRequirementsKHR))); XR_CHECK(pfnGetVulkanGraphicsRequirementsKHR(instance, systemId, &graphicsRequirements_)); // Get required instance extensions PFN_xrGetVulkanInstanceExtensionsKHR pfnGetVulkanInstanceExtensionsKHR = nullptr; XR_CHECK(xrGetInstanceProcAddr(instance, "xrGetVulkanInstanceExtensionsKHR", (PFN_xrVoidFunction*)(&pfnGetVulkanInstanceExtensionsKHR))); uint32_t bufferSize = 0; XR_CHECK(pfnGetVulkanInstanceExtensionsKHR(instance, systemId, 0, &bufferSize, nullptr)); requiredVkInstanceExtensionsBuffer_.resize(bufferSize); XR_CHECK(pfnGetVulkanInstanceExtensionsKHR( instance, systemId, bufferSize, &bufferSize, requiredVkInstanceExtensionsBuffer_.data())); requiredVkInstanceExtensions_ = processExtensionsBuffer(requiredVkInstanceExtensionsBuffer_); IGL_LOG_INFO("Number of required Vulkan extensions: %d\n", requiredVkInstanceExtensions_.size()); // Get the required device extensions. bufferSize = 0; PFN_xrGetVulkanDeviceExtensionsKHR pfnGetVulkanDeviceExtensionsKHR = nullptr; XR_CHECK(xrGetInstanceProcAddr(instance, "xrGetVulkanDeviceExtensionsKHR", (PFN_xrVoidFunction*)(&pfnGetVulkanDeviceExtensionsKHR))); XR_CHECK(pfnGetVulkanDeviceExtensionsKHR(instance, systemId, 0, &bufferSize, nullptr)); requiredVkDeviceExtensionsBuffer_.resize(bufferSize); XR_CHECK(pfnGetVulkanDeviceExtensionsKHR( instance, systemId, bufferSize, &bufferSize, requiredVkDeviceExtensionsBuffer_.data())); requiredVkDeviceExtensions_ = processExtensionsBuffer(requiredVkDeviceExtensionsBuffer_); const igl::vulkan::VulkanContextConfig cfg = { .numExtraInstanceExtensions = requiredVkInstanceExtensions_.size(), .extraInstanceExtensions = requiredVkInstanceExtensions_.data(), }; auto context = igl::vulkan::HWDevice::createContext(cfg, nullptr); PFN_xrGetVulkanGraphicsDeviceKHR pfnGetVulkanGraphicsDeviceKHR = nullptr; XR_CHECK(xrGetInstanceProcAddr(instance, "xrGetVulkanGraphicsDeviceKHR", (PFN_xrVoidFunction*)(&pfnGetVulkanGraphicsDeviceKHR))); const std::vector devices = vulkan::HWDevice::queryDevices(*context, HWDeviceQueryDesc(HWDeviceType::Unknown), nullptr); if (devices.empty()) { IGL_LOG_ERROR("IGL: Failed to find a suitable Vulkan hardware device.\n"); return nullptr; } // Let OpenXR find a suitable Vulkan physical device. VkPhysicalDevice physicalDevice = VK_NULL_HANDLE; XR_CHECK( pfnGetVulkanGraphicsDeviceKHR(instance, systemId, context->getVkInstance(), &physicalDevice)); if (physicalDevice == VK_NULL_HANDLE) { IGL_LOG_ERROR("OpenXR: Failed to get vulkan physical device.\n"); return nullptr; } HWDeviceDesc hwDevice(0, HWDeviceType::Unknown); for (const auto& device : devices) { if (device.guid == reinterpret_cast(physicalDevice)) { hwDevice = device; IGL_LOG_INFO("IGL: Selected hardware device: %s", device.name.c_str()); break; } } auto device = igl::vulkan::HWDevice::create(std::move(context), hwDevice, 0, 0, requiredVkDeviceExtensions_.size(), requiredVkDeviceExtensions_.data(), nullptr, "IGL Shell OpenXR", nullptr); return device; } XrSession XrAppImplVulkan::initXrSession(XrInstance instance, XrSystemId systemId, IDevice& device, const RenderSessionConfig& sessionConfig) { IGL_DEBUG_ASSERT(sessionConfig.backendVersion.flavor == igl::BackendFlavor::Vulkan); sessionConfig_ = sessionConfig; const auto& vkDevice = static_cast(device); // Downcast is safe here // Bind Vulkan to XR session XrGraphicsBindingVulkanKHR graphicsBinding = { XR_TYPE_GRAPHICS_BINDING_VULKAN_KHR, nullptr, vkDevice.getVulkanContext().getVkInstance(), vkDevice.getVulkanContext().getVkPhysicalDevice(), vkDevice.getVulkanContext().getVkDevice(), vkDevice.getVulkanContext().deviceQueues_.graphicsQueueFamilyIndex, 0, }; const XrSessionCreateInfo sessionCreateInfo = { .type = XR_TYPE_SESSION_CREATE_INFO, .next = &graphicsBinding, .createFlags = 0, .systemId = systemId, }; XrSession session = nullptr; const XrResult xrResult = xrCreateSession(instance, &sessionCreateInfo, &session); XR_CHECK(xrResult); if (xrResult != XR_SUCCESS) { IGL_LOG_ERROR("Failed to create XR session: %d\n", xrResult); return XR_NULL_HANDLE; } IGL_LOG_INFO("XR session created.\n"); return session; } // namespace igl::shell::openxr::mobile std::unique_ptr XrAppImplVulkan::createSwapchainProviderImpl() const { return std::make_unique( sessionConfig_.swapchainColorTextureFormat); } std::vector XrAppImplVulkan::processExtensionsBuffer(std::vector& buffer) { std::vector extensions; auto skip = false; for (auto& ch : buffer) { if (skip) { if (ch == ' ') { ch = '\0'; skip = false; } else if (ch == '\0') { break; } } else { extensions.push_back(&ch); skip = true; } } return extensions; } } // namespace igl::shell::openxr::mobile ================================================ FILE: shell/openxr/mobile/vulkan/XrAppImplVulkan.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::shell::openxr::mobile { class XrAppImplVulkan : public impl::XrAppImpl { public: [[nodiscard]] RenderSessionConfig suggestedSessionConfig() const override; [[nodiscard]] std::vector getXrRequiredExtensions() const override; [[nodiscard]] std::vector getXrOptionalExtensions() const override; [[nodiscard]] std::unique_ptr initIGL(XrInstance instance, XrSystemId systemId) override; [[nodiscard]] XrSession initXrSession(XrInstance instance, XrSystemId systemId, IDevice& device, const RenderSessionConfig& sessionConfig) override; [[nodiscard]] std::unique_ptr createSwapchainProviderImpl() const override; private: std::vector processExtensionsBuffer(std::vector& buffer); XrGraphicsRequirementsVulkanKHR graphicsRequirements_ = { .type = XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN_KHR, }; std::vector requiredVkInstanceExtensions_; std::vector requiredVkInstanceExtensionsBuffer_; std::vector requiredVkDeviceExtensions_; std::vector requiredVkDeviceExtensionsBuffer_; RenderSessionConfig sessionConfig_; }; } // namespace igl::shell::openxr::mobile ================================================ FILE: shell/openxr/mobile/vulkan/XrSwapchainProviderImplVulkan.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include #include #include #include namespace igl::shell::openxr::mobile { namespace { void enumerateSwapchainImages( IDevice& device, XrSwapchain swapchain, VkFormat format, const impl::SwapchainImageInfo& swapchainImageInfo, uint8_t numViews, VkImageUsageFlags usageFlags, VkImageAspectFlags aspectMask, std::vector>& outVulkanTextures) { uint32_t numImages = 0; XR_CHECK(xrEnumerateSwapchainImages(swapchain, 0, &numImages, nullptr)); IGL_LOG_INFO("XRSwapchain numImages: %d\n", numImages); std::vector images( numImages, {.type = XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR, .next = nullptr}); XR_CHECK(xrEnumerateSwapchainImages( swapchain, numImages, &numImages, (XrSwapchainImageBaseHeader*)images.data())); const auto& actualDevice = static_cast(device); const auto& ctx = actualDevice.getVulkanContext(); outVulkanTextures.reserve(numImages); const bool isDepth = ((aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) != 0); for (uint32_t i = 0; i < numImages; ++i) { auto image = igl::vulkan::VulkanImage( ctx, images[i].image, fmt::format("Image: swapchain {} #{}", isDepth ? "depth" : "color", i).c_str(), usageFlags, true, VkExtent3D{swapchainImageInfo.imageWidth, swapchainImageInfo.imageHeight, 0}, VK_IMAGE_TYPE_2D, format, 1, numViews); auto imageView = image.createImageView( numViews > 1 ? VK_IMAGE_VIEW_TYPE_2D_ARRAY : VK_IMAGE_VIEW_TYPE_2D, format, aspectMask, 0, VK_REMAINING_MIP_LEVELS, 0, numViews, fmt::format("Image View: swapchain {} #{}", isDepth ? "depth" : "color", i).c_str()); outVulkanTextures.emplace_back( std::make_shared(std::move(image), std::move(imageView))); } } std::shared_ptr getSurfaceTexture( IDevice& device, const XrSwapchain& swapchain, const impl::SwapchainImageInfo& swapchainImageInfo, uint8_t numViews, const std::vector>& vulkanTextures, VkFormat externalTextureFormat, std::vector>& inOutTextures) { uint32_t imageIndex = 0; const XrSwapchainImageAcquireInfo acquireInfo{XR_TYPE_SWAPCHAIN_IMAGE_ACQUIRE_INFO}; XR_CHECK(xrAcquireSwapchainImage(swapchain, &acquireInfo, &imageIndex)); XrSwapchainImageWaitInfo waitInfo{XR_TYPE_SWAPCHAIN_IMAGE_WAIT_INFO}; waitInfo.timeout = XR_INFINITE_DURATION; XR_CHECK(xrWaitSwapchainImage(swapchain, &waitInfo)); auto vulkanTexture = vulkanTextures[imageIndex]; if (imageIndex >= inOutTextures.size()) { inOutTextures.resize((size_t)imageIndex + 1, nullptr); } auto& actualDevice = static_cast(device); const auto iglFormat = vulkan::vkFormatToTextureFormat(externalTextureFormat); const auto texture = inOutTextures[imageIndex]; // allocate new drawable textures if its null or mismatches in size or format if (!texture || swapchainImageInfo.imageWidth != texture->getSize().width || swapchainImageInfo.imageHeight != texture->getSize().height || iglFormat != texture->getProperties().format) { TextureDesc textureDesc; if (numViews > 1) { textureDesc = TextureDesc::new2DArray(iglFormat, swapchainImageInfo.imageWidth, swapchainImageInfo.imageHeight, numViews, TextureDesc::TextureUsageBits::Attachment, "SwapChain Texture"); } else { textureDesc = TextureDesc::new2D(iglFormat, swapchainImageInfo.imageWidth, swapchainImageInfo.imageHeight, TextureDesc::TextureUsageBits::Attachment, "SwapChain Texture"); } inOutTextures[imageIndex] = std::make_shared(actualDevice, vulkanTexture, textureDesc); } return inOutTextures[imageIndex]; } } // namespace XrSwapchainProviderImplVulkan::XrSwapchainProviderImplVulkan(TextureFormat preferredColorFormat) { preferredColorFormat_ = vulkan::textureFormatToVkFormat(preferredColorFormat); } void XrSwapchainProviderImplVulkan::enumerateImages( IDevice& device, XrSwapchain colorSwapchain, XrSwapchain depthSwapchain, const impl::SwapchainImageInfo& swapchainImageInfo, uint8_t numViews) noexcept { // NOLINT(bugprone-exception-escape) enumerateSwapchainImages(device, colorSwapchain, static_cast(swapchainImageInfo.colorFormat), swapchainImageInfo, numViews, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_ASPECT_COLOR_BIT, vulkanColorTextures_); auto vkDepthFormat = static_cast(swapchainImageInfo.depthFormat); VkImageAspectFlags depthAspectFlags = 0; if (igl::vulkan::hasDepth(vkDepthFormat)) { depthAspectFlags |= VK_IMAGE_ASPECT_DEPTH_BIT; } if (igl::vulkan::hasStencil(vkDepthFormat)) { depthAspectFlags |= VK_IMAGE_ASPECT_STENCIL_BIT; } enumerateSwapchainImages(device, depthSwapchain, vkDepthFormat, swapchainImageInfo, numViews, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, depthAspectFlags, vulkanDepthTextures_); } SurfaceTextures XrSwapchainProviderImplVulkan::getSurfaceTextures( IDevice& device, XrSwapchain colorSwapchain, XrSwapchain depthSwapchain, const impl::SwapchainImageInfo& swapchainImageInfo, uint8_t numViews) noexcept { // NOLINT(bugprone-exception-escape) auto colorTexture = getSurfaceTexture(device, colorSwapchain, swapchainImageInfo, numViews, vulkanColorTextures_, static_cast(swapchainImageInfo.colorFormat), colorTextures_); auto depthTexture = getSurfaceTexture(device, depthSwapchain, swapchainImageInfo, numViews, vulkanDepthTextures_, static_cast(swapchainImageInfo.depthFormat), depthTextures_); return {.color = colorTexture, .depth = depthTexture}; } } // namespace igl::shell::openxr::mobile ================================================ FILE: shell/openxr/mobile/vulkan/XrSwapchainProviderImplVulkan.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::shell::openxr::mobile { class XrSwapchainProviderImplVulkan final : public impl::XrSwapchainProviderImpl { public: explicit XrSwapchainProviderImplVulkan(TextureFormat preferredColorFormat); // NOLINTNEXTLINE(bugprone-exception-escape) [[nodiscard]] std::vector preferredColorFormats() const noexcept final { return {preferredColorFormat_}; } // NOLINTNEXTLINE(bugprone-exception-escape) [[nodiscard]] std::vector preferredDepthFormats() const noexcept final { return {VK_FORMAT_D16_UNORM, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT}; } void enumerateImages(IDevice& device, XrSwapchain colorSwapchain, XrSwapchain depthSwapchain, const impl::SwapchainImageInfo& swapchainImageInfo, uint8_t numViews) noexcept final; [[nodiscard]] SurfaceTextures getSurfaceTextures( IDevice& device, XrSwapchain colorSwapchain, XrSwapchain depthSwapchain, const impl::SwapchainImageInfo& swapchainImageInfo, uint8_t numViews) noexcept final; private: int64_t preferredColorFormat_; std::vector> vulkanColorTextures_; std::vector> vulkanDepthTextures_; }; } // namespace igl::shell::openxr::mobile ================================================ FILE: shell/renderSessionTests/BasicFramebufferTests.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include class BasicFrameBufferTests : public igl::shell::TestShell {}; TEST_F(BasicFrameBufferTests, BasicFramebufferSession) { igl::shell::BasicFramebufferSession test(platform_); run(test, 1); } ================================================ FILE: shell/renderSessionTests/IGLSampleTests.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include class IGLSampleTests : public igl::shell::TestShell {}; TEST_F(IGLSampleTests, ColorSession) { igl::shell::ColorSession test(platform_); run(test, 1); } TEST_F(IGLSampleTests, EmptySession) { igl::shell::EmptySession test(platform_); run(test, 1); } TEST_F(IGLSampleTests, GraphSampleSession) { igl::shell::GraphSampleSession test(platform_); run(test, 1); } TEST_F(IGLSampleTests, MSAASession) { igl::shell::MSAASession test(platform_); run(test, 1); } TEST_F(IGLSampleTests, TextureAccessorSession) { igl::shell::TextureAccessorSession test(platform_); run(test, 1); } TEST_F(IGLSampleTests, TextureRotationSession) { igl::shell::TextureRotationSession test(platform_); run(test, 1); } TEST_F(IGLSampleTests, Textured3DCubeSession) { igl::shell::Textured3DCubeSession test(platform_); run(test, 1); } TEST_F(IGLSampleTests, TQSession) { igl::shell::TQSession test(platform_); run(test, 1); } TEST_F(IGLSampleTests, ComputeSession) { igl::shell::ComputeSession test(platform_); run(test, 1); } TEST_F(IGLSampleTests, MRTSession) { igl::shell::MRTSession test(platform_); run(test, 1); } TEST_F(IGLSampleTests, TQMultiRenderPassSession) { igl::shell::TQMultiRenderPassSession test(platform_); run(test, 1); } TEST_F(IGLSampleTests, UniformTestSession) { igl::shell::UniformTestSession test(platform_); run(test, 1); } TEST_F(IGLSampleTests, UniformPackedTestSession) { igl::shell::UniformPackedTestSession test(platform_); run(test, 1); } TEST_F(IGLSampleTests, UniformArrayTestSession) { igl::shell::UniformArrayTestSession test(platform_); run(test, 1); } TEST_F(IGLSampleTests, ResourceTrackerSession) { #if IGL_PLATFORM_ANDROID constexpr size_t kNumBytesDefaultImage = 256; igl::shell::ResourceTrackerSession test(platform_, kNumBytesDefaultImage); #else igl::shell::ResourceTrackerSession test(platform_); #endif run(test, 1); } TEST_F(IGLSampleTests, ShaderCompilationTestSession) { igl::shell::ShaderCompilationTestSession test(platform_); run(test, 1); } ================================================ FILE: shell/renderSessions/BasicFramebufferSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include namespace igl::shell { void BasicFramebufferSession::initialize() noexcept { // Create commandQueue commandQueue_ = getPlatform().getDevice().createCommandQueue({}, nullptr); IGL_DEBUG_ASSERT(commandQueue_ != nullptr); renderPass_ = { .colorAttachments = {{ .loadAction = igl::LoadAction::Clear, .storeAction = igl::StoreAction::Store, .clearColor = getPreferredClearColor(), }}, }; } void BasicFramebufferSession::update(SurfaceTextures surfaceTextures) noexcept { // Create/update framebuffer if (framebuffer_ == nullptr) { framebuffer_ = getPlatform().getDevice().createFramebuffer( { .colorAttachments = {{.texture = surfaceTextures.color}}, }, nullptr); IGL_DEBUG_ASSERT(framebuffer_ != nullptr); } else { framebuffer_->updateDrawable(surfaceTextures.color); } // Create/submit command buffer const auto buffer = commandQueue_->createCommandBuffer({}, nullptr); IGL_DEBUG_ASSERT(buffer != nullptr); const auto commands = buffer->createRenderCommandEncoder(renderPass_, framebuffer_); IGL_DEBUG_ASSERT(commands != nullptr); commands->endEncoding(); IGL_DEBUG_ASSERT(commandQueue_ != nullptr); if (shellParams().shouldPresent) { buffer->present(framebuffer_->getColorAttachment(0)); } commandQueue_->submit(*buffer); } } // namespace igl::shell ================================================ FILE: shell/renderSessions/BasicFramebufferSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include #include namespace igl::shell { class BasicFramebufferSession : public RenderSession { public: explicit BasicFramebufferSession(std::shared_ptr platform) : RenderSession(std::move(platform)) {} void initialize() noexcept override; void update(SurfaceTextures surfaceTextures) noexcept override; private: std::shared_ptr framebuffer_; RenderPassDesc renderPass_; }; } // namespace igl::shell ================================================ FILE: shell/renderSessions/BindGroupSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include #include #include #include #include #if IGL_BACKEND_OPENGL #include #endif namespace { struct VertexPosUvw { glm::vec3 position; glm::vec3 color; glm::vec2 uv; }; const float kHalf = 1.0f; // UV-mapped cube with indices: 24 vertices, 36 indices const VertexPosUvw kVertexData0[] = { // top {.position = {-kHalf, -kHalf, +kHalf}, .color = {0.5, 0.5, 1.0}, .uv = {0, 0}}, // 0 {.position = {+kHalf, -kHalf, +kHalf}, .color = {1.0, 0.0, 1.0}, .uv = {1, 0}}, // 1 {.position = {+kHalf, +kHalf, +kHalf}, .color = {1.0, 1.0, 1.0}, .uv = {1, 1}}, // 2 {.position = {-kHalf, +kHalf, +kHalf}, .color = {0.5, 1.0, 1.0}, .uv = {0, 1}}, // 3 // bottom {.position = {-kHalf, -kHalf, -kHalf}, .color = {1.0, 1.0, 1.0}, .uv = {0, 0}}, // 4 {.position = {-kHalf, +kHalf, -kHalf}, .color = {0.5, 1.0, 0.5}, .uv = {0, 1}}, // 5 {.position = {+kHalf, +kHalf, -kHalf}, .color = {1.0, 1.0, 0.5}, .uv = {1, 1}}, // 6 {.position = {+kHalf, -kHalf, -kHalf}, .color = {1.0, 0.5, 0.5}, .uv = {1, 0}}, // 7 // left {.position = {+kHalf, +kHalf, -kHalf}, .color = {1.0, 1.0, 0.5}, .uv = {1, 0}}, // 8 {.position = {-kHalf, +kHalf, -kHalf}, .color = {0.5, 1.0, 0.5}, .uv = {0, 0}}, // 9 {.position = {-kHalf, +kHalf, +kHalf}, .color = {0.5, 1.0, 1.0}, .uv = {0, 1}}, // 10 {.position = {+kHalf, +kHalf, +kHalf}, .color = {1.0, 1.0, 1.0}, .uv = {1, 1}}, // 11 // right {.position = {-kHalf, -kHalf, -kHalf}, .color = {1.0, 1.0, 1.0}, .uv = {0, 0}}, // 12 {.position = {+kHalf, -kHalf, -kHalf}, .color = {1.0, 0.5, 0.5}, .uv = {1, 0}}, // 13 {.position = {+kHalf, -kHalf, +kHalf}, .color = {1.0, 0.5, 1.0}, .uv = {1, 1}}, // 14 {.position = {-kHalf, -kHalf, +kHalf}, .color = {0.5, 0.5, 1.0}, .uv = {0, 1}}, // 15 // front {.position = {+kHalf, -kHalf, -kHalf}, .color = {1.0, 0.5, 0.5}, .uv = {0, 0}}, // 16 {.position = {+kHalf, +kHalf, -kHalf}, .color = {1.0, 1.0, 0.5}, .uv = {1, 0}}, // 17 {.position = {+kHalf, +kHalf, +kHalf}, .color = {1.0, 1.0, 1.0}, .uv = {1, 1}}, // 18 {.position = {+kHalf, -kHalf, +kHalf}, .color = {1.0, 0.5, 1.0}, .uv = {0, 1}}, // 19 // back {.position = {-kHalf, +kHalf, -kHalf}, .color = {0.5, 1.0, 0.5}, .uv = {1, 0}}, // 20 {.position = {-kHalf, -kHalf, -kHalf}, .color = {1.0, 1.0, 1.0}, .uv = {0, 0}}, // 21 {.position = {-kHalf, -kHalf, +kHalf}, .color = {0.5, 0.5, 1.0}, .uv = {0, 1}}, // 22 {.position = {-kHalf, +kHalf, +kHalf}, .color = {0.5, 1.0, 1.0}, .uv = {1, 1}}, // 23 }; const uint16_t kIndexData[] = {0, 1, 2, 2, 3, 0, 4, 5, 6, 6, 7, 4, 8, 9, 10, 10, 11, 8, 12, 13, 14, 14, 15, 12, 16, 17, 18, 18, 19, 16, 20, 21, 22, 22, 23, 20}; std::string getProlog(igl::IDevice& device) { #if IGL_BACKEND_OPENGL const auto shaderVersion = device.getShaderVersion(); if (shaderVersion.majorVersion >= 3 || shaderVersion.minorVersion >= 30) { std::string prependVersionString = igl::opengl::getStringFromShaderVersion(shaderVersion); prependVersionString += "\nprecision highp float;\n"; return prependVersionString; } #else (void)device; // Suppress unused parameter warning #endif // IGL_BACKEND_OPENGL return ""; } std::string getMetalShaderSource() { return R"( #include #include using namespace metal; struct VertexUniformBlock { float4x4 mvpMatrix; }; struct VertexIn { float3 position [[attribute(0)]]; float2 uv [[attribute(1)]]; float3 color [[attribute(2)]]; }; struct VertexOut { float4 position [[position]]; float2 uv; float4 color; }; vertex VertexOut vertexShader(VertexIn in [[stage_in]], constant VertexUniformBlock &vUniform[[buffer(1)]]) { VertexOut out; out.position = vUniform.mvpMatrix * float4(in.position, 1.0); out.uv = in.uv; out.color = float4(in.color, 1.0); return out; } fragment float4 fragmentShader( VertexOut in[[stage_in]], texture2d tex0 [[texture(0)]], texture2d tex1 [[texture(1)]], sampler linearSampler [[sampler(0)]]) { constexpr sampler s(s_address::clamp_to_edge, t_address::clamp_to_edge, min_filter::linear, mag_filter::linear); return tex0.sample(s, in.uv) * tex1.sample(s, in.uv) * in.color; } )"; } std::string getOpenGLFragmentShaderSource(igl::IDevice& device) { return getProlog(device) + std::string(R"( precision highp float; precision highp sampler2D; in vec2 uv; in vec4 color; uniform sampler2D input2D; uniform sampler2D inputXOR; out vec4 fragmentColor; void main() { fragmentColor = texture(input2D, uv) * texture(inputXOR, uv) * color; })"); } std::string getOpenGLVertexShaderSource(igl::IDevice& device) { return getProlog(device) + R"( precision highp float; uniform mat4 mvpMatrix; in vec3 position; in vec2 uv_in; in vec3 color_in; out vec2 uv; out vec4 color; void main() { gl_Position = mvpMatrix * vec4(position, 1.0); uv = uv_in; color = vec4(color_in, 1.0); })"; } const char* getVulkanFragmentShaderSource() { return R"( precision highp float; layout(location = 0) in vec2 uv; layout(location = 1) in vec4 color; layout(location = 0) out vec4 out_FragColor; layout(set = 0, binding = 0) uniform sampler2D in_texture0; layout(set = 0, binding = 1) uniform sampler2D in_texture1; void main() { out_FragColor = texture(in_texture0, uv) * texture(in_texture1, uv) * color; })"; } const char* getVulkanVertexShaderSource() { return R"( precision highp float; layout (set = 1, binding = 1, std140) uniform PerFrame { mat4 mvpMatrix; } perFrame; layout(location = 0) in vec3 position; layout(location = 1) in vec2 uvw_in; layout(location = 2) in vec3 color_in; layout(location = 0) out vec2 uvw; layout(location = 1) out vec4 color; void main() { gl_Position = perFrame.mvpMatrix * vec4(position, 1.0); uvw = uvw_in; color = vec4(color_in, 1.0); })"; } std::unique_ptr getShaderStagesForBackend(igl::IDevice& device) { switch (device.getBackendType()) { case igl::BackendType::Invalid: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; case igl::BackendType::Vulkan: return igl::ShaderStagesCreator::fromModuleStringInput(device, getVulkanVertexShaderSource(), "main", "", getVulkanFragmentShaderSource(), "main", "", nullptr); return nullptr; case igl::BackendType::D3D12: { // D3D12 HLSL shaders using register bindings static const char* kVS = R"( cbuffer PerFrame : register(b1) { float4x4 mvpMatrix; }; struct VSInput { float3 position : POSITION; float2 uvw : TEXCOORD0; float3 color_in : COLOR0; }; struct VSOutput { float4 position : SV_POSITION; float2 uv : TEXCOORD0; float4 color : COLOR0; }; VSOutput main(VSInput input) { VSOutput output; output.position = mul(mvpMatrix, float4(input.position, 1.0)); output.uv = input.uvw; output.color = float4(input.color_in, 1.0); return output; } )"; static const char* kPS = R"( Texture2D in_texture0 : register(t0); Texture2D in_texture1 : register(t1); SamplerState sampler0 : register(s0); SamplerState sampler1 : register(s1); struct PSInput { float4 position : SV_POSITION; float2 uv : TEXCOORD0; float4 color : COLOR0; }; float4 main(PSInput input) : SV_Target { float4 tex0 = in_texture0.Sample(sampler0, input.uv); float4 tex1 = in_texture1.Sample(sampler1, input.uv); return tex0 * tex1 * input.color; } )"; return igl::ShaderStagesCreator::fromModuleStringInput( device, kVS, "main", "", kPS, "main", "", nullptr); } case igl::BackendType::Custom: IGL_DEBUG_ABORT("IGLSamples not set up for Custom"); return nullptr; // @fb-only // @fb-only // @fb-only case igl::BackendType::Metal: return igl::ShaderStagesCreator::fromLibraryStringInput( device, getMetalShaderSource().c_str(), "vertexShader", "fragmentShader", "", nullptr); case igl::BackendType::OpenGL: return igl::ShaderStagesCreator::fromModuleStringInput( device, getOpenGLVertexShaderSource(device).c_str(), "main", "", getOpenGLFragmentShaderSource(device).c_str(), "main", "", nullptr); } IGL_UNREACHABLE_RETURN(nullptr) } } // namespace namespace igl::shell { void BindGroupSession::createSamplerAndTextures(const igl::IDevice& device) { // Sampler & Texture auto sampler = device.createSamplerState(SamplerStateDesc::newLinearMipmapped(), nullptr); std::shared_ptr tex0, tex1; { auto imageData = getPlatform().getImageLoader().loadImageData("igl.png"); TextureDesc desc = igl::TextureDesc::new2D(igl::TextureFormat::RGBA_UNorm8, imageData.desc.width, imageData.desc.height, igl::TextureDesc::TextureUsageBits::Sampled | igl::TextureDesc::TextureUsageBits::Attachment, "igl.png"); desc.numMipLevels = TextureDesc::calcNumMipLevels(imageData.desc.width, imageData.desc.height); tex0 = device.createTexture(desc, nullptr); tex0->upload(tex0->getFullRange(), imageData.data->data()); tex0->generateMipmap(*commandQueue_); } { const uint32_t texWidth = 256; const uint32_t texHeight = 256; TextureDesc desc = TextureDesc::new2D(igl::TextureFormat::BGRA_UNorm8, texWidth, texHeight, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment, "XOR pattern"); desc.numMipLevels = TextureDesc::calcNumMipLevels(texWidth, texHeight); tex1 = getPlatform().getDevice().createTexture(desc, nullptr); std::vector pixels(static_cast(texWidth * texHeight)); for (uint32_t y = 0; y != texHeight; y++) { for (uint32_t x = 0; x != texWidth; x++) { // create a XOR pattern pixels[y * texWidth + x] = 0xFF000000 + ((x ^ y) << 16) + ((x ^ y) << 8) + (x ^ y); } } tex1->upload(TextureRangeDesc::new2D(0, 0, texWidth, texHeight), pixels.data()); tex1->generateMipmap(*commandQueue_); } bindGroupTextures_ = getPlatform().getDevice().createBindGroup(BindGroupTextureDesc{ .textures = {tex0, tex1}, .samplers = {sampler, sampler}, .debugName = "bindGroupTextures_", }); } BindGroupSession::BindGroupSession(std::shared_ptr platform) : RenderSession(std::move(platform)) { imguiSession_ = std::make_unique(getPlatform().getDevice(), getPlatform().getInputDispatcher()); } void BindGroupSession::initialize() noexcept { auto& device = getPlatform().getDevice(); // Vertex buffer, Index buffer and Vertex Input vb0_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Vertex, .data = kVertexData0, .length = sizeof(kVertexData0)}, nullptr); ib0_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Index, .data = kIndexData, .length = sizeof(kIndexData)}, nullptr); const VertexInputStateDesc inputDesc = { .numAttributes = 3, .attributes = {{.bufferIndex = 0, .format = VertexAttributeFormat::Float3, .offset = offsetof(VertexPosUvw, position), .name = "position", .location = 0}, {.bufferIndex = 0, .format = VertexAttributeFormat::Float2, .offset = offsetof(VertexPosUvw, uv), .name = "uv_in", .location = 1}, {.bufferIndex = 0, .format = VertexAttributeFormat::Float3, .offset = offsetof(VertexPosUvw, color), .name = "color_in", .location = 2}}, .numInputBindings = 1, .inputBindings = {{.stride = sizeof(VertexPosUvw)}}, }; vertexInput0_ = device.createVertexInputState(inputDesc, nullptr); createSamplerAndTextures(device); shaderStages_ = getShaderStagesForBackend(device); // Command queue: backed by different types of GPU HW queues commandQueue_ = device.createCommandQueue({}, nullptr); renderPass_ = { .colorAttachments = {{ .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, .clearColor = getPreferredClearColor(), }}, .depthAttachment = { .loadAction = LoadAction::Clear, .storeAction = StoreAction::DontCare, .clearDepth = 1.0, }, }; } void BindGroupSession::update(SurfaceTextures surfaceTextures) noexcept { auto& device = getPlatform().getDevice(); const float deltaSeconds = getDeltaSeconds(); fps_.updateFPS(deltaSeconds); // cube animation const glm::mat4 projectionMat = glm::perspectiveLH( glm::radians(45.0f), surfaceTextures.color->getAspectRatio(), 0.1f, 100.0f); angle_ += 180.0f * deltaSeconds; vertexParameters_.mvpMatrix = projectionMat * glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.f, 8.0f)) * glm::rotate(glm::mat4(1.0f), -0.2f, glm::vec3(1.0f, 0.0f, 0.0f)) * glm::rotate(glm::mat4(1.0f), glm::radians(angle_), glm::vec3(0.0f, 1.0f, 0.0f)); Result ret; if (framebuffer_ == nullptr) { framebufferDesc_.colorAttachments[0].texture = surfaceTextures.color; framebufferDesc_.depthAttachment.texture = surfaceTextures.depth; framebuffer_ = device.createFramebuffer(framebufferDesc_, &ret); IGL_DEBUG_ASSERT(ret.isOk()); IGL_DEBUG_ASSERT(framebuffer_ != nullptr); } else { framebuffer_->updateDrawable(surfaceTextures.color); } if (pipelineState_ == nullptr) { pipelineState_ = device.createRenderPipeline( RenderPipelineDesc{ .vertexInputState = vertexInput0_, .shaderStages = shaderStages_, .targetDesc = { .colorAttachments = {{ .textureFormat = framebuffer_->getColorAttachment(0)->getProperties().format, }}, .depthAttachmentFormat = framebuffer_->getDepthAttachment()->getProperties().format, }, .cullMode = igl::CullMode::Back, .frontFaceWinding = igl::WindingMode::Clockwise, .fragmentUnitSamplerMap = {{0, IGL_NAMEHANDLE("input2D")}, {1, IGL_NAMEHANDLE("inputXOR")}}, }, &ret); IGL_DEBUG_ASSERT(ret.isOk()); } const auto buffer = commandQueue_->createCommandBuffer({}, nullptr); const std::shared_ptr commands = buffer->createRenderCommandEncoder(renderPass_, framebuffer_); const iglu::ManagedUniformBufferInfo info = { .index = 1, .length = sizeof(VertexFormat), .uniforms = {{.name = "mvpMatrix", .type = igl::UniformType::Mat4x4, .offset = offsetof(VertexFormat, mvpMatrix)}}, }; const std::shared_ptr vertUniformBuffer = std::make_shared(device, info); IGL_DEBUG_ASSERT(vertUniformBuffer->result.isOk()); *static_cast(vertUniformBuffer->getData()) = vertexParameters_; vertUniformBuffer->bind(device, *pipelineState_, *commands); commands->bindBindGroup(bindGroupTextures_); commands->bindRenderPipelineState(pipelineState_); commands->bindVertexBuffer(0, *vb0_); commands->bindIndexBuffer(*ib0_, IndexFormat::UInt16); commands->drawIndexed(static_cast(3u * 6u * 2u)); imguiSession_->beginFrame(framebufferDesc_, getPlatform().getDisplayContext().pixelsPerPoint); imguiSession_->drawFPS(fps_.getAverageFPS()); imguiSession_->endFrame(device, *commands); commands->endEncoding(); if (shellParams().shouldPresent) { buffer->present(framebuffer_->getColorAttachment(0)); } commandQueue_->submit(*buffer); } } // namespace igl::shell ================================================ FILE: shell/renderSessions/BindGroupSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include #include #include #include #include namespace igl::shell { struct VertexFormat { glm::mat4 mvpMatrix; }; class BindGroupSession : public RenderSession { public: explicit BindGroupSession(std::shared_ptr platform); void initialize() noexcept override; void update(SurfaceTextures surfaceTextures) noexcept override; private: RenderPassDesc renderPass_; FramebufferDesc framebufferDesc_; std::shared_ptr pipelineState_; std::shared_ptr vertexInput0_; std::shared_ptr shaderStages_; std::shared_ptr vb0_, ib0_; // Buffers for vertices and indices (or constants) std::shared_ptr framebuffer_; Holder bindGroupTextures_; std::unique_ptr imguiSession_; VertexFormat vertexParameters_; FPSCounter fps_; float angle_ = 0; void createSamplerAndTextures(const IDevice& /*device*/); }; } // namespace igl::shell ================================================ FILE: shell/renderSessions/BindlessBufferSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include namespace igl::shell { namespace { struct VertexPosColor { iglu::simdtypes::float3 position; iglu::simdtypes::float4 color; }; // A simple colored triangle, same as HelloWorldSession. VertexPosColor vertexData[] = { {.position = {-0.6f, -0.4f, 0.0}, .color = {1.0, 0.0, 0.0, 1.0}}, {.position = {0.6f, -0.4f, 0.0}, .color = {0.0, 1.0, 0.0, 1.0}}, {.position = {0.0f, 0.6f, 0.0}, .color = {0.0, 0.0, 1.0, 1.0}}, }; uint16_t indexData[] = { 0, 1, 2, }; // Push constant data: holds a GPU buffer address (uint64_t) plus padding. struct PushConstantData { uint64_t vertexBufferAddress; uint32_t pad0; uint32_t pad1; }; std::string getVersion() { return {"#version 100"}; } std::string getMetalShaderSource() { return R"( using namespace metal; typedef struct { float3 position [[attribute(0)]]; float4 color [[attribute(1)]]; } VertexIn; typedef struct { float4 position [[position]]; float4 color; } VertexOut; vertex VertexOut vertexShader( uint vid [[vertex_id]], constant VertexIn * vertices [[buffer(1)]]) { VertexOut out; out.position = float4(vertices[vid].position, 1.0); out.color = vertices[vid].color; return out; } fragment float4 fragmentShader( VertexOut IN [[stage_in]]) { return IN.color; } )"; } std::string getOpenGLVertexShaderSource() { return getVersion() + R"( precision highp float; attribute vec3 position; attribute vec4 color_in; varying vec4 vColor; void main() { gl_Position = vec4(position, 1.0); vColor = color_in; })"; } std::string getOpenGLFragmentShaderSource() { return getVersion() + std::string(R"( precision highp float; varying vec4 vColor; void main() { gl_FragColor = vColor; })"); } // Vulkan vertex shader using buffer_reference to access vertex data via a GPU address // passed through push constants. This demonstrates bindless buffer access. std::string getVulkanBindlessVertexShaderSource() { return R"( #version 450 #extension GL_EXT_buffer_reference : require #extension GL_EXT_buffer_reference2 : require layout(buffer_reference, std430, buffer_reference_align = 4) readonly buffer VertexBuffer { float data[]; }; layout(push_constant) uniform PushConstants { VertexBuffer vertexBufferAddress; } pc; layout(location = 0) out vec4 color; void main() { // Each vertex has 8 floats: 4 for position (float3 padded to float4) + 4 for color // Note: iglu::simdtypes::float3 is padded to 16 bytes (same as float4) int base = gl_VertexIndex * 8; vec3 position = vec3( pc.vertexBufferAddress.data[base + 0], pc.vertexBufferAddress.data[base + 1], pc.vertexBufferAddress.data[base + 2]); // Skip base+3 (padding) color = vec4( pc.vertexBufferAddress.data[base + 4], pc.vertexBufferAddress.data[base + 5], pc.vertexBufferAddress.data[base + 6], pc.vertexBufferAddress.data[base + 7]); gl_Position = vec4(position, 1.0); } )"; } // Standard Vulkan vertex shader using regular vertex attributes (fallback). std::string getVulkanStandardVertexShaderSource() { return R"( layout(location = 0) in vec3 position; layout(location = 1) in vec4 color_in; layout(location = 0) out vec4 color; void main() { gl_Position = vec4(position, 1.0); color = color_in; } )"; } std::string getVulkanFragmentShaderSource() { return R"( layout(location = 0) in vec4 color; layout(location = 0) out vec4 out_FragColor; void main() { out_FragColor = color; } )"; } std::unique_ptr getShaderStagesForBackend(IDevice& device, bool useBindlessShader) { switch (device.getBackendType()) { case igl::BackendType::Invalid: case igl::BackendType::Custom: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; case igl::BackendType::Vulkan: { const auto& vsSource = useBindlessShader ? getVulkanBindlessVertexShaderSource() : getVulkanStandardVertexShaderSource(); return igl::ShaderStagesCreator::fromModuleStringInput(device, vsSource.c_str(), "main", "", getVulkanFragmentShaderSource().c_str(), "main", "", nullptr); } // @fb-only // @fb-only // @fb-only case igl::BackendType::Metal: return igl::ShaderStagesCreator::fromLibraryStringInput( device, getMetalShaderSource().c_str(), "vertexShader", "fragmentShader", "", nullptr); case igl::BackendType::OpenGL: return igl::ShaderStagesCreator::fromModuleStringInput(device, getOpenGLVertexShaderSource().c_str(), "main", "", getOpenGLFragmentShaderSource().c_str(), "main", "", nullptr); case igl::BackendType::D3D12: { static const char* kVS = R"( struct VSIn { float3 position : POSITION; float4 color : COLOR; }; struct VSOut { float4 position : SV_POSITION; float4 color : COLOR; }; VSOut main(VSIn v) { VSOut o; o.position = float4(v.position, 1.0); o.color = v.color; return o; } )"; static const char* kPS = R"( struct PSIn { float4 position : SV_POSITION; float4 color : COLOR; }; float4 main(PSIn i) : SV_TARGET { return i.color; } )"; return igl::ShaderStagesCreator::fromModuleStringInput( device, kVS, "main", "", kPS, "main", "", nullptr); } } IGL_UNREACHABLE_RETURN(nullptr) } } // namespace void BindlessBufferSession::initialize() noexcept { auto& device = getPlatform().getDevice(); // Check if buffer device address (bindless buffers) is supported. isBindlessSupported_ = device.hasFeature(DeviceFeatures::BufferDeviceAddress) && device.getBackendType() == igl::BackendType::Vulkan; if (isBindlessSupported_) { IGL_LOG_INFO( "BindlessBufferSession: Buffer device address is supported. " "Using bindless rendering path.\n"); } else { IGL_LOG_INFO( "BindlessBufferSession: Buffer device address is NOT supported. " "Falling back to standard vertex attribute binding.\n"); } // Create vertex and index buffers. vertexBuffer_ = device.createBuffer( BufferDesc{.type = BufferDesc::BufferTypeBits::Vertex | BufferDesc::BufferTypeBits::Storage, .data = vertexData, .length = sizeof(vertexData)}, nullptr); IGL_DEBUG_ASSERT(vertexBuffer_ != nullptr); indexBuffer_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Index, .data = indexData, .length = sizeof(indexData)}, nullptr); IGL_DEBUG_ASSERT(indexBuffer_ != nullptr); // When buffer device address is used, vertex data is fetched via buffer_reference // (programmable vertex pulling), so we do not need a vertex input state. // Otherwise, we use the standard vertex input layout. if (!isBindlessSupported_) { vertexInputState_ = device.createVertexInputState( VertexInputStateDesc{ .numAttributes = 2, .attributes = { VertexAttribute{.bufferIndex = 1, .format = VertexAttributeFormat::Float3, .offset = offsetof(VertexPosColor, position), .name = "position", .location = 0}, VertexAttribute{.bufferIndex = 1, .format = VertexAttributeFormat::Float4, .offset = offsetof(VertexPosColor, color), .name = "color_in", .location = 1}, }, .numInputBindings = 1, .inputBindings = {{}, {.stride = sizeof(VertexPosColor)}}, }, nullptr); IGL_DEBUG_ASSERT(vertexInputState_ != nullptr); } if (isBindlessSupported_) { // Log the GPU address of the vertex buffer. const uint64_t gpuAddr = vertexBuffer_->gpuAddress(0); IGL_LOG_INFO("BindlessBufferSession: Vertex buffer GPU address = 0x%llx\n", (unsigned long long)gpuAddr); } shaderStages_ = getShaderStagesForBackend(device, isBindlessSupported_); IGL_DEBUG_ASSERT(shaderStages_ != nullptr); // Command queue commandQueue_ = device.createCommandQueue(CommandQueueDesc{}, nullptr); IGL_DEBUG_ASSERT(commandQueue_ != nullptr); renderPass_ = { .colorAttachments = { { .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, .clearColor = getPreferredClearColor(), }, }, .depthAttachment = { .loadAction = LoadAction::Clear, .clearDepth = 1.0, }, }; } void BindlessBufferSession::update(SurfaceTextures textures) noexcept { Result ret; // Create or update framebuffer. if (framebuffer_ == nullptr) { framebuffer_ = getPlatform().getDevice().createFramebuffer( FramebufferDesc{ .colorAttachments = {{.texture = textures.color}}, .depthAttachment = {.texture = textures.depth}, .stencilAttachment = textures.depth && textures.depth->getProperties().hasStencil() ? FramebufferDesc::AttachmentDesc{.texture = textures.depth} : FramebufferDesc::AttachmentDesc{}, }, &ret); IGL_DEBUG_ASSERT(ret.isOk()); IGL_DEBUG_ASSERT(framebuffer_ != nullptr); } else { framebuffer_->updateDrawable(textures); } // Create graphics pipeline (cached). if (pipelineState_ == nullptr) { pipelineState_ = getPlatform().getDevice().createRenderPipeline( RenderPipelineDesc{ .vertexInputState = vertexInputState_, .shaderStages = shaderStages_, .targetDesc = { .colorAttachments = {{.textureFormat = framebuffer_->getColorAttachment(0)->getFormat()}}, .depthAttachmentFormat = framebuffer_->getDepthAttachment()->getFormat(), .stencilAttachmentFormat = framebuffer_->getStencilAttachment() ? framebuffer_->getStencilAttachment()->getFormat() : igl::TextureFormat::Invalid, }, .cullMode = igl::CullMode::Disabled, .frontFaceWinding = igl::WindingMode::CounterClockwise, }, nullptr); IGL_DEBUG_ASSERT(pipelineState_ != nullptr); } // Create command buffer. auto buffer = commandQueue_->createCommandBuffer(CommandBufferDesc{}, nullptr); IGL_DEBUG_ASSERT(buffer != nullptr); auto drawableSurface = framebuffer_->getColorAttachment(0); // Encode render commands. const std::shared_ptr commands = buffer->createRenderCommandEncoder(renderPass_, framebuffer_); IGL_DEBUG_ASSERT(commands != nullptr); if (commands) { commands->bindRenderPipelineState(pipelineState_); if (isBindlessSupported_) { // Bindless path: pass the vertex buffer GPU address via push constants. // The shader reads vertex data directly from the buffer address. PushConstantData pc = {}; pc.vertexBufferAddress = vertexBuffer_->gpuAddress(0); commands->bindPushConstants(&pc, sizeof(pc), 0); commands->bindIndexBuffer(*indexBuffer_, IndexFormat::UInt16); commands->drawIndexed(3); } else { // Standard path: bind vertex buffer using traditional vertex attributes. commands->bindVertexBuffer(1, *vertexBuffer_); commands->bindIndexBuffer(*indexBuffer_, IndexFormat::UInt16); commands->drawIndexed(3); } commands->endEncoding(); } IGL_DEBUG_ASSERT(buffer != nullptr); if (shellParams().shouldPresent) { buffer->present(drawableSurface); } IGL_DEBUG_ASSERT(commandQueue_ != nullptr); commandQueue_->submit(*buffer); RenderSession::update(textures); } } // namespace igl::shell ================================================ FILE: shell/renderSessions/BindlessBufferSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include #include #include namespace igl::shell { class BindlessBufferSession : public RenderSession { public: explicit BindlessBufferSession(std::shared_ptr platform) : RenderSession(std::move(platform)) {} void initialize() noexcept override; void update(SurfaceTextures surfaceTextures) noexcept override; private: std::shared_ptr framebuffer_; std::shared_ptr pipelineState_; std::shared_ptr vertexBuffer_; std::shared_ptr indexBuffer_; std::shared_ptr vertexInputState_; std::shared_ptr shaderStages_; RenderPassDesc renderPass_; std::shared_ptr uniformBuffer_; bool isBindlessSupported_ = false; }; } // namespace igl::shell ================================================ FILE: shell/renderSessions/BufferMappingSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include namespace igl::shell { namespace { struct VertexPosColor { iglu::simdtypes::float3 position; iglu::simdtypes::float4 color; }; uint16_t indexData[] = { 2, 1, 0, }; std::string getVersion() { return {"#version 100"}; } std::string getMetalShaderSource() { return R"( using namespace metal; typedef struct { float3 position [[attribute(0)]]; float4 color [[attribute(1)]]; } VertexIn; typedef struct { float4 position [[position]]; float4 color; } VertexOut; vertex VertexOut vertexShader( uint vid [[vertex_id]], constant VertexIn * vertices [[buffer(1)]]) { VertexOut out; out.position = float4(vertices[vid].position, 1.0); out.color = vertices[vid].color; return out; } fragment float4 fragmentShader( VertexOut IN [[stage_in]]) { return IN.color; } )"; } std::string getOpenGLVertexShaderSource() { return getVersion() + R"( precision highp float; attribute vec3 position; attribute vec4 color_in; varying vec4 vColor; void main() { gl_Position = vec4(position, 1.0); vColor = color_in; })"; } std::string getOpenGLFragmentShaderSource() { return getVersion() + std::string(R"( precision highp float; varying vec4 vColor; void main() { gl_FragColor = vColor; })"); } std::string getVulkanVertexShaderSource() { return R"( layout(location = 0) in vec3 position; layout(location = 1) in vec4 color_in; layout(location = 0) out vec4 color; void main() { gl_Position = vec4(position, 1.0); color = color_in; } )"; } std::string getVulkanFragmentShaderSource() { return R"( layout(location = 0) in vec4 color; layout(location = 0) out vec4 out_FragColor; void main() { out_FragColor = color; } )"; } std::unique_ptr getShaderStagesForBackend(IDevice& device) { switch (device.getBackendType()) { case igl::BackendType::Invalid: case igl::BackendType::Custom: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; case igl::BackendType::Vulkan: return igl::ShaderStagesCreator::fromModuleStringInput(device, getVulkanVertexShaderSource().c_str(), "main", "", getVulkanFragmentShaderSource().c_str(), "main", "", nullptr); // @fb-only // @fb-only // @fb-only case igl::BackendType::Metal: return igl::ShaderStagesCreator::fromLibraryStringInput( device, getMetalShaderSource().c_str(), "vertexShader", "fragmentShader", "", nullptr); case igl::BackendType::OpenGL: return igl::ShaderStagesCreator::fromModuleStringInput(device, getOpenGLVertexShaderSource().c_str(), "main", "", getOpenGLFragmentShaderSource().c_str(), "main", "", nullptr); case igl::BackendType::D3D12: { static const char* kVS = R"( struct VSIn { float3 position : POSITION; float4 color : COLOR; }; struct VSOut { float4 position : SV_POSITION; float4 color : COLOR; }; VSOut main(VSIn v) { VSOut o; o.position = float4(v.position, 1.0); o.color = v.color; return o; } )"; static const char* kPS = R"( struct PSIn { float4 position : SV_POSITION; float4 color : COLOR; }; float4 main(PSIn i) : SV_TARGET { return i.color; } )"; return igl::ShaderStagesCreator::fromModuleStringInput( device, kVS, "main", "", kPS, "main", "", nullptr); } } IGL_UNREACHABLE_RETURN(nullptr) } } // namespace void BufferMappingSession::initialize() noexcept { auto& device = getPlatform().getDevice(); // Vertex buffer: use ResourceStorage::Shared so it can be mapped for CPU writes each frame. // Unlike HelloWorldSession which uploads static data at creation time, we pass nullptr here // and will fill the buffer via map()/unmap() every frame. vertexBuffer_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Vertex, .length = sizeof(VertexPosColor) * 3, .storage = ResourceStorage::Shared}, nullptr); IGL_DEBUG_ASSERT(vertexBuffer_ != nullptr); // Index buffer (static, does not need mapping) indexBuffer_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Index, .data = indexData, .length = sizeof(indexData)}, nullptr); IGL_DEBUG_ASSERT(indexBuffer_ != nullptr); vertexInputState_ = device.createVertexInputState( VertexInputStateDesc{ .numAttributes = 2, .attributes = { VertexAttribute{.bufferIndex = 1, .format = VertexAttributeFormat::Float3, .offset = offsetof(VertexPosColor, position), .name = "position", .location = 0}, VertexAttribute{.bufferIndex = 1, .format = VertexAttributeFormat::Float4, .offset = offsetof(VertexPosColor, color), .name = "color_in", .location = 1}, }, .numInputBindings = 1, .inputBindings = {{}, {.stride = sizeof(VertexPosColor)}}, }, nullptr); IGL_DEBUG_ASSERT(vertexInputState_ != nullptr); shaderStages_ = getShaderStagesForBackend(device); IGL_DEBUG_ASSERT(shaderStages_ != nullptr); // Command queue commandQueue_ = device.createCommandQueue(CommandQueueDesc{}, nullptr); IGL_DEBUG_ASSERT(commandQueue_ != nullptr); renderPass_ = { .colorAttachments = { { .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, .clearColor = getPreferredClearColor(), }, }, .depthAttachment = { .loadAction = LoadAction::Clear, .clearDepth = 1.0, }, }; } void BufferMappingSession::update(SurfaceTextures textures) noexcept { Result ret; if (framebuffer_ == nullptr) { framebuffer_ = getPlatform().getDevice().createFramebuffer( FramebufferDesc{ .colorAttachments = {{.texture = textures.color}}, .depthAttachment = {.texture = textures.depth}, .stencilAttachment = textures.depth && textures.depth->getProperties().hasStencil() ? FramebufferDesc::AttachmentDesc{.texture = textures.depth} : FramebufferDesc::AttachmentDesc{}, }, &ret); IGL_DEBUG_ASSERT(ret.isOk()); IGL_DEBUG_ASSERT(framebuffer_ != nullptr); } else { framebuffer_->updateDrawable(textures); } // --- Dynamic vertex update via buffer mapping --- // Map the vertex buffer to get a CPU-writable pointer. The buffer was created with // ResourceStorage::Shared, which keeps memory accessible to both CPU and GPU. auto* mapped = static_cast( vertexBuffer_->map(BufferRange(sizeof(VertexPosColor) * 3, 0), &ret)); IGL_DEBUG_ASSERT(ret.isOk()); if (mapped) { // Animate vertex positions: the triangle vertices oscillate using sin/cos of frameCount_. const float t = static_cast(frameCount_) * 0.02f; const float dx = std::sin(t) * 0.3f; const float dy = std::cos(t) * 0.2f; mapped[0] = VertexPosColor{ .position = {-0.6f + dx, -0.4f + dy, 0.0f}, .color = {1.0f, 0.0f, 0.0f, 1.0f}, }; mapped[1] = VertexPosColor{ .position = {0.6f - dx, -0.4f - dy, 0.0f}, .color = {0.0f, 1.0f, 0.0f, 1.0f}, }; mapped[2] = VertexPosColor{ .position = {0.0f + dy, 0.6f + dx, 0.0f}, .color = {0.0f, 0.0f, 1.0f, 1.0f}, }; // Unmap the buffer before submitting GPU work. The GPU must not read from a mapped buffer. vertexBuffer_->unmap(); } // Alternative approach (non-mapping): you could also update buffer data via upload(): // VertexPosColor verts[3] = { ... }; // vertexBuffer_->upload(verts, BufferRange(sizeof(verts), 0)); // upload() copies data into the buffer without requiring map/unmap, but mapping can be // more efficient when updating large buffers since it avoids an extra copy. frameCount_++; // Graphics pipeline (created once and cached) if (pipelineState_ == nullptr) { pipelineState_ = getPlatform().getDevice().createRenderPipeline( RenderPipelineDesc{ .vertexInputState = vertexInputState_, .shaderStages = shaderStages_, .targetDesc = { .colorAttachments = {{.textureFormat = framebuffer_->getColorAttachment(0)->getFormat()}}, .depthAttachmentFormat = framebuffer_->getDepthAttachment()->getFormat(), .stencilAttachmentFormat = framebuffer_->getStencilAttachment() ? framebuffer_->getStencilAttachment()->getFormat() : igl::TextureFormat::Invalid, }, .cullMode = igl::CullMode::Back, .frontFaceWinding = igl::WindingMode::Clockwise, }, nullptr); IGL_DEBUG_ASSERT(pipelineState_ != nullptr); } // Command Buffers auto buffer = commandQueue_->createCommandBuffer(CommandBufferDesc{}, nullptr); IGL_DEBUG_ASSERT(buffer != nullptr); auto drawableSurface = framebuffer_->getColorAttachment(0); // Submit commands const std::shared_ptr commands = buffer->createRenderCommandEncoder(renderPass_, framebuffer_); IGL_DEBUG_ASSERT(commands != nullptr); if (commands) { commands->bindVertexBuffer(1, *vertexBuffer_); commands->bindRenderPipelineState(pipelineState_); commands->bindIndexBuffer(*indexBuffer_, IndexFormat::UInt16); commands->drawIndexed(3); commands->endEncoding(); } IGL_DEBUG_ASSERT(buffer != nullptr); if (shellParams().shouldPresent) { buffer->present(drawableSurface); } IGL_DEBUG_ASSERT(commandQueue_ != nullptr); commandQueue_->submit(*buffer); RenderSession::update(textures); } } // namespace igl::shell ================================================ FILE: shell/renderSessions/BufferMappingSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include #include #include namespace igl::shell { class BufferMappingSession : public RenderSession { public: explicit BufferMappingSession(std::shared_ptr platform) : RenderSession(std::move(platform)) {} void initialize() noexcept override; void update(SurfaceTextures surfaceTextures) noexcept override; private: std::shared_ptr framebuffer_; std::shared_ptr pipelineState_; std::shared_ptr vertexBuffer_; std::shared_ptr indexBuffer_; std::shared_ptr vertexInputState_; std::shared_ptr shaderStages_; RenderPassDesc renderPass_; size_t frameCount_ = 0; }; } // namespace igl::shell ================================================ FILE: shell/renderSessions/CheckerboardMipmapSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include #include #include // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only namespace igl::shell { namespace { struct VertexPosUv { iglu::simdtypes::float3 position; iglu::simdtypes::float2 uv; }; const VertexPosUv kVertexData[] = { {.position = {-0.9f, 0.9f, 0.0}, .uv = {0.0, 1.0}}, {.position = {0.9f, 0.9f, 0.0}, .uv = {1.0, 1.0}}, {.position = {-0.9f, -0.9f, 0.0}, .uv = {0.0, 0.0}}, {.position = {0.9f, -0.9f, 0.0}, .uv = {1.0, 0.0}}, }; const uint16_t kIndexData[] = {0, 1, 2, 1, 3, 2}; // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only glm::mat4 getMVP(float aspectRatio) noexcept { const glm::vec3 eye = {0, 0, 2.5}; const glm::vec3 ballCenter = {0, 0, 0}; const float fov = M_PI / 4; const glm::mat4 view = glm::lookAt(glm::vec3(eye.x, eye.y, eye.z), glm::vec3(ballCenter.x, ballCenter.y, ballCenter.z), glm::vec3(0.0, 1.0, 0.0)); const glm::mat4 projection = glm::perspective(fov, aspectRatio, 0.1f, 10.f); return projection * view; } BufferDesc getVertexBufferDesc(const igl::IDevice& device) { // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only return {.type = BufferDesc::BufferTypeBits::Vertex, .data = kVertexData, .length = sizeof(kVertexData)}; } uint32_t getVertexBufferIndex(const igl::IDevice& device) { // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only return 1; } ResourceStorage getIndexBufferResourceStorage(const igl::IDevice& device) { // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only return igl::BufferDesc{}.storage; } std::string getVersion() { return "#version 100"; } std::string getMetalShaderSource() { return R"( using namespace metal; typedef struct { float4x4 mvp; } UniformBlock; typedef struct { float3 position [[attribute(0)]]; float2 uv [[attribute(1)]]; } VertexIn; typedef struct { float4 position [[position]]; float2 uv; } VertexOut; vertex VertexOut vertexShader( uint vid [[vertex_id]], constant VertexIn * vertices [[buffer(1)]], constant UniformBlock * ub [[buffer(0)]]) { VertexOut out; out.position = ub->mvp * float4(vertices[vid].position, 1.0); out.uv = vertices[vid].uv; return out; } fragment float4 fragmentShader( VertexOut IN [[stage_in]], texture2d diffuseTex [[texture(0)]], sampler linearSampler [[sampler(0)]], constant UniformBlock * ub [[buffer(0)]]) { float4 tex = diffuseTex.sample(linearSampler, IN.uv); return tex; } )"; } std::string getOpenGLVertexShaderSource() { return getVersion() + R"( precision highp float; attribute vec3 position; attribute vec2 uv_in; uniform mat4 mvp; uniform sampler2D inputImage; varying vec2 uv; void main() { gl_Position = mvp * vec4(position, 1.0); uv = uv_in; })"; } std::string getOpenGLFragmentShaderSource() { return getVersion() + std::string(R"( precision highp float; uniform sampler2D inputImage; varying vec2 uv; void main() { gl_FragColor = texture2D(inputImage, uv); })"); } std::string getVulkanVertexShaderSource() { return R"( precision highp float; layout(location = 0) in vec3 position; layout(location = 1) in vec2 uv_in; layout(std140, set = 1, binding = 0) uniform Uniforms { mat4 mvpMatrix; } perFrame; layout(location = 0) out vec2 uv; void main() { gl_Position = perFrame.mvpMatrix * vec4(position, 1.0); uv = uv_in; } )"; } std::string getVulkanFragmentShaderSource() { return R"( layout(location = 0) in vec2 uv; layout(location = 0) out vec4 out_FragColor; layout(set = 0, binding = 0) uniform sampler2D inputImage; void main() { out_FragColor = texture(inputImage, uv); } )"; } // @fb-only std::unique_ptr getShaderStagesForBackend(IDevice& device) { switch (device.getBackendType()) { case igl::BackendType::Invalid: case igl::BackendType::Custom: default: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only case igl::BackendType::Vulkan: { auto vertexSource = getVulkanVertexShaderSource(); if (device.hasFeature(DeviceFeatures::Multiview)) { vertexSource = R"(#version 450 )" + vertexSource; } return igl::ShaderStagesCreator::fromModuleStringInput(device, vertexSource.c_str(), "main", "", getVulkanFragmentShaderSource().c_str(), "main", "", nullptr); } case igl::BackendType::Metal: return igl::ShaderStagesCreator::fromLibraryStringInput( device, getMetalShaderSource().c_str(), "vertexShader", "fragmentShader", "", nullptr); case igl::BackendType::OpenGL: return igl::ShaderStagesCreator::fromModuleStringInput(device, getOpenGLVertexShaderSource().c_str(), "main", "", getOpenGLFragmentShaderSource().c_str(), "main", "", nullptr); } IGL_UNREACHABLE_RETURN(nullptr) } } // namespace void CheckerboardMipmapSession::initialize() noexcept { auto& device = getPlatform().getDevice(); const BufferDesc vb0Desc = getVertexBufferDesc(device); vb0_ = device.createBuffer(vb0Desc, nullptr); IGL_DEBUG_ASSERT(vb0_ != nullptr); const BufferDesc ibDesc{.type = BufferDesc::BufferTypeBits::Index, .data = kIndexData, .length = sizeof(kIndexData), .storage = getIndexBufferResourceStorage(device), .debugName = "index"}; ib0_ = device.createBuffer(ibDesc, nullptr); IGL_DEBUG_ASSERT(ib0_ != nullptr); const auto vertexBufferIndex = getVertexBufferIndex(getPlatform().getDevice()); VertexInputStateDesc inputDesc = { .numAttributes = 2, .attributes = { { .bufferIndex = vertexBufferIndex, .format = VertexAttributeFormat::Float3, .offset = offsetof(VertexPosUv, position), .name = "position", .location = 0, }, { .bufferIndex = vertexBufferIndex, .format = VertexAttributeFormat::Float2, .offset = offsetof(VertexPosUv, uv), .name = "uv_in", .location = 1, }, }, .numInputBindings = 1, }; inputDesc.inputBindings[vertexBufferIndex].stride = sizeof(VertexPosUv); vertexInput0_ = device.createVertexInputState(inputDesc, nullptr); IGL_DEBUG_ASSERT(vertexInput0_ != nullptr); // Sampler & Texture with mipmaps enabled const SamplerStateDesc samplerDesc{ .minFilter = SamplerMinMagFilter::Linear, .magFilter = SamplerMinMagFilter::Linear, .mipFilter = SamplerMipFilter::Linear, // Enable mipmap filtering }; samp0_ = device.createSamplerState(samplerDesc, nullptr); IGL_DEBUG_ASSERT(samp0_ != nullptr); // Load checkerboard texture tex0_ = getPlatform().loadTexture("checker.png", true); IGL_DEBUG_ASSERT(tex0_ != nullptr); { Result result; const auto tempCommandQueue = device.createCommandQueue({}, &result); IGL_DEBUG_ASSERT(result.isOk(), "Error %d: %s", result.code, result.message.c_str()); IGL_DEBUG_ASSERT(tempCommandQueue); if (tex0_->isRequiredGenerateMipmap()) { tex0_->generateMipmap(*tempCommandQueue, nullptr); } } shaderStages_ = getShaderStagesForBackend(device); IGL_DEBUG_ASSERT(shaderStages_ != nullptr); // Command queue: backed by different types of GPU HW queues commandQueue_ = device.createCommandQueue(CommandQueueDesc{}, nullptr); IGL_DEBUG_ASSERT(commandQueue_ != nullptr); renderPass_.colorAttachments.resize(1); renderPass_.colorAttachments[0].loadAction = LoadAction::Clear; renderPass_.colorAttachments[0].storeAction = StoreAction::Store; renderPass_.colorAttachments[0].clearColor = getPreferredClearColor(); renderPass_.depthAttachment.loadAction = LoadAction::Clear; renderPass_.depthAttachment.clearDepth = 1.0; } void CheckerboardMipmapSession::update(SurfaceTextures surfaceTextures) noexcept { Result ret; if (framebuffer_ == nullptr) { FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = surfaceTextures.color; framebufferDesc.depthAttachment.texture = surfaceTextures.depth; IGL_DEBUG_ASSERT(framebufferDesc.depthAttachment.texture != nullptr); framebuffer_ = getPlatform().getDevice().createFramebuffer(framebufferDesc, &ret); IGL_DEBUG_ASSERT(ret.isOk()); IGL_DEBUG_ASSERT(framebuffer_ != nullptr); } else { framebuffer_->updateDrawable(surfaceTextures.color); } const size_t textureUnit = 0; // Graphics pipeline: state batch that fully configures GPU for rendering if (pipelineState_ == nullptr) { const RenderPipelineDesc graphicsDesc = { .vertexInputState = vertexInput0_, .shaderStages = shaderStages_, .targetDesc = { .colorAttachments = {{ {.textureFormat = framebuffer_->getColorAttachment(0)->getProperties().format}, }}, .depthAttachmentFormat = framebuffer_->getDepthAttachment()->getProperties().format, }, .cullMode = igl::CullMode::Disabled, .frontFaceWinding = igl::WindingMode::Clockwise, .fragmentUnitSamplerMap = {{textureUnit, IGL_NAMEHANDLE("inputImage")}}, }; pipelineState_ = getPlatform().getDevice().createRenderPipeline(graphicsDesc, nullptr); IGL_DEBUG_ASSERT(pipelineState_ != nullptr); } // Create uniform buffer for platforms that need it (Metal, Vulkan, etc.) if (getPlatform().getDevice().hasFeature(DeviceFeatures::UniformBlocks) && !mvpUniformBuffer_) { const BufferDesc bufDesc{.type = BufferDesc::BufferTypeBits::Uniform, .length = sizeof(glm::mat4), .storage = ResourceStorage::Shared}; mvpUniformBuffer_ = getPlatform().getDevice().createBuffer(bufDesc, &ret); IGL_DEBUG_ASSERT(mvpUniformBuffer_ != nullptr); } // Update the angle to rotate the plane. Value obtained empirically so that the rotation isn't too // fast/slow #if ROTATE_PLANE planeAngle_ += 0.0016f; #endif const auto aspectRatio = surfaceTextures.color->getAspectRatio(); const glm::mat4 staticViewProjection = getMVP(aspectRatio); const glm::mat4 viewProjection = glm::rotate(staticViewProjection, planeAngle_, glm::vec3(0.0, 1.f, 0.0)); // Command buffer: create, submit and forget auto buffer = commandQueue_->createCommandBuffer(CommandBufferDesc{}, nullptr); IGL_DEBUG_ASSERT(buffer != nullptr); auto commands = buffer->createRenderCommandEncoder(renderPass_, framebuffer_); IGL_DEBUG_ASSERT(commands != nullptr); if (commands) { commands->bindRenderPipelineState(pipelineState_); commands->bindVertexBuffer(getVertexBufferIndex(getPlatform().getDevice()), *vb0_); commands->bindTexture(textureUnit, BindTarget::kFragment, tex0_.get()); commands->bindSamplerState(textureUnit, BindTarget::kFragment, samp0_.get()); // Set the MVP matrix uniform // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only } else { // @fb-only} // @fb-only { // @fb-only if (getPlatform().getDevice().hasFeature(DeviceFeatures::BindUniform)) { // OpenGL path: bind uniform directly const UniformDesc uniformDesc = { .location = pipelineState_->getIndexByName(IGL_NAMEHANDLE("mvp"), ShaderStage::Vertex), .type = UniformType::Mat4x4, .offset = 0, }; commands->bindUniform(uniformDesc, &viewProjection[0][0]); } else if (getPlatform().getDevice().hasFeature(DeviceFeatures::UniformBlocks)) { // Metal/Vulkan path: upload to buffer and bind buffer mvpUniformBuffer_->upload(&viewProjection[0][0], BufferRange{sizeof(glm::mat4)}); commands->bindBuffer(0, mvpUniformBuffer_.get(), 0); } } commands->bindIndexBuffer(*ib0_, IndexFormat::UInt16); commands->drawIndexed(6); commands->endEncoding(); } if (buffer) { if (shellParams().shouldPresent) { buffer->present(framebuffer_->getColorAttachment(0)); } } IGL_DEBUG_ASSERT(commandQueue_ != nullptr); commandQueue_->submit(*buffer); RenderSession::update(surfaceTextures); } } // namespace igl::shell ================================================ FILE: shell/renderSessions/CheckerboardMipmapSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include #include #include namespace igl::shell { #define ROTATE_PLANE 1 class CheckerboardMipmapSession : public RenderSession { public: explicit CheckerboardMipmapSession(std::shared_ptr platform) : RenderSession(std::move(platform)) {} void initialize() noexcept override; void update(SurfaceTextures surfaceTextures) noexcept override; private: RenderPassDesc renderPass_; std::shared_ptr pipelineState_; std::shared_ptr vertexInput0_; std::shared_ptr shaderStages_; std::shared_ptr vb0_, ib0_; std::shared_ptr tex0_; std::shared_ptr samp0_; std::shared_ptr framebuffer_; std::shared_ptr commandQueue_; std::shared_ptr mvpUniformBuffer_; // Initial angle of the plane, so that it starts at an angle float planeAngle_ = M_PI / 4.0f; }; } // namespace igl::shell ================================================ FILE: shell/renderSessions/ColorSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include #include #include #include #include // @fb-only // @fb-only // @fb-only namespace igl::shell { namespace { struct VertexPosUv { iglu::simdtypes::float3 position; iglu::simdtypes::float2 uv; }; const VertexPosUv kVertexData[] = { {.position = {-1.f, 1.f, 0.0}, .uv = {0.0, 0.0}}, {.position = {1.f, 1.f, 0.0}, .uv = {1.0, 0.0}}, {.position = {-1.f, -1.f, 0.0}, .uv = {0.0, 1.0}}, {.position = {1.f, -1.f, 0.0}, .uv = {1.0, 1.0}}, }; const uint16_t kIndexData[] = {0, 1, 2, 1, 3, 2}; // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only BufferDesc getVertexBufferDesc(const igl::IDevice& device) { // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only return {.type = BufferDesc::BufferTypeBits::Vertex, .data = kVertexData, .length = sizeof(kVertexData), .debugName = "vertex"}; } uint32_t getVertexBufferIndex(const igl::IDevice& device) { // @fb-only // @fb-only return 0; // @fb-only // @fb-only return 1; } ResourceStorage getIndexBufferResourceStorage(const igl::IDevice& device) { // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only return igl::BufferDesc{}.storage; } std::string getVersion() { return "#version 100"; } std::string getMetalShaderSource() { return R"( using namespace metal; typedef struct { float3 color; float4x4 mvp; } UniformBlock; typedef struct { float3 position [[attribute(0)]]; float2 uv [[attribute(1)]]; } VertexIn; typedef struct { float4 position [[position]]; float2 uv; } VertexOut; vertex VertexOut vertexShader( uint vid [[vertex_id]], constant VertexIn * vertices [[buffer(1)]], constant UniformBlock * ub [[buffer(0)]]) { VertexOut out; out.position = ub->mvp * float4(vertices[vid].position, 1.0); out.uv = vertices[vid].uv; return out; } fragment float4 fragmentShader( VertexOut IN [[stage_in]], texture2d diffuseTex [[texture(0)]], sampler linearSampler [[sampler(0)]], constant UniformBlock * ub [[buffer(0)]]) { float4 tex = diffuseTex.sample(linearSampler, IN.uv); return float4(ub->color.r, ub->color.g, ub->color.b, 1.0) * tex; } )"; } std::string getMetalShaderSourceGradient() { return R"( using namespace metal; typedef struct { float3 color; float4x4 mvp; } UniformBlock; typedef struct { float3 position [[attribute(0)]]; float2 uv [[attribute(1)]]; } VertexIn; typedef struct { float4 position [[position]]; float2 uv; } VertexOut; vertex VertexOut vertexShader( uint vid [[vertex_id]], constant VertexIn * vertices [[buffer(1)]]) { VertexOut out; out.position = float4(vertices[vid].position, 1.0); out.uv = vertices[vid].uv; return out; } fragment float4 fragmentShader( VertexOut IN [[stage_in]], texture2d diffuseTex [[texture(0)]], sampler linearSampler [[sampler(0)]], constant UniformBlock * color [[buffer(0)]]) { float numSteps = 20.0; float uvX; if (IN.uv.y<0.25) { uvX = IN.uv.x; } else if (IN.uv.y<0.5) { uvX = floor(IN.uv.x*numSteps+0.5)/numSteps; } else if (IN.uv.y<0.75) { uvX = 1.0-IN.uv.x; } else { uvX = floor((1.0-IN.uv.x)*numSteps+0.5)/numSteps; } return float4(uvX, uvX, uvX, 1.0); } )"; } std::string getOpenGLVertexShaderSource() { return getVersion() + R"( precision highp float; attribute vec3 position; attribute vec2 uv_in; uniform vec3 color; uniform mat4 mvp; uniform sampler2D inputImage; varying vec3 vColor; varying vec2 uv; void main() { gl_Position = mvp * vec4(position, 1.0); uv = uv_in; // position.xy * 0.5 + 0.5; vColor = color; })"; } std::string getOpenGLFragmentShaderSource() { return getVersion() + std::string(R"( precision highp float; uniform vec3 color; uniform mat4 mvp; uniform sampler2D inputImage; varying vec3 vColor; varying vec2 uv; void main() { gl_FragColor = vec4(vColor, 1.0) * texture2D(inputImage, uv); })"); } std::string getOpenGLFragmentShaderSourceGradient() { return getVersion() + R"( precision highp float; uniform vec3 color; uniform mat4 mvp; uniform sampler2D inputImage; varying vec3 vColor; varying vec2 uv; void main() { float numSteps = 20.0; float uvX; if (uv.y<0.25) { uvX = uv.x; } else if (uv.y<0.5) { uvX = floor(uv.x*numSteps+0.5)/numSteps; } else if (uv.y<0.75) { uvX = 1.0-uv.x; } else { uvX = floor((1.0-uv.x)*numSteps+0.5)/numSteps; } gl_FragColor = vec4(vec3(uvX), 1.0); } )"; } std::string getVulkanVertexShaderSource() { return R"(precision highp float; layout(location = 0) in vec3 position; layout(location = 1) in vec2 uv_in; layout(location = 0) out vec2 uv; layout(location = 1) out vec3 color; layout (set = 1, binding = 0, std140) uniform UniformsPerObject { vec3 color; mat4 mvp; } perObject; void main() { gl_Position = perObject.mvp * vec4(position, 1.0); uv = uv_in; color = perObject.color; } )"; } std::string getVulkanFragmentShaderSource() { return R"( layout(location = 0) in vec2 uv; layout(location = 1) in vec3 color; layout(location = 0) out vec4 out_FragColor; layout(set = 0, binding = 0) uniform sampler2D in_texture; void main() { out_FragColor = vec4(color, 1.0) * texture(in_texture, uv); } )"; } std::string getVulkanFragmentShaderSourceGradient() { return R"( layout(location = 0) in vec2 uv; layout(location = 1) in vec3 color; layout(location = 0) out vec4 out_FragColor; void main() { float numSteps = 20.0; float uvX; if (uv.y<0.25) { uvX = uv.x; } else if (uv.y<0.5) { uvX = floor(uv.x*numSteps+0.5)/numSteps; } else if (uv.y<0.75) { uvX = 1.0-uv.x; } else { uvX = floor((1.0-uv.x)*numSteps+0.5)/numSteps; } out_FragColor = vec4(vec3(uvX), 1.0); } )"; } // @fb-only } // namespace std::unique_ptr ColorSession::getShaderStagesForBackend(IDevice& device) { switch (device.getBackendType()) { case igl::BackendType::Invalid: case igl::BackendType::Custom: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; case igl::BackendType::Vulkan: { auto vertexSource = getVulkanVertexShaderSource(); if (device.hasFeature(DeviceFeatures::Multiview)) { vertexSource = R"(#version 450 #extension GL_OVR_multiview2 : require layout(num_views = 2) in;)" + vertexSource; } return igl::ShaderStagesCreator::fromModuleStringInput( device, vertexSource.c_str(), "main", "", colorTestModes_ == ColorTestModes::Gradient ? getVulkanFragmentShaderSourceGradient().c_str() : getVulkanFragmentShaderSource().c_str(), "main", "", nullptr); } // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only case igl::BackendType::Metal: return igl::ShaderStagesCreator::fromLibraryStringInput( device, colorTestModes_ == ColorTestModes::Gradient ? getMetalShaderSourceGradient().c_str() : getMetalShaderSource().c_str(), "vertexShader", "fragmentShader", "", nullptr); case igl::BackendType::D3D12: { if (colorTestModes_ == ColorTestModes::Gradient) { // Gradient mode - no MVP matrix, just positional gradient static const char* kVS = R"( cbuffer UniformBlock : register(b0) { float3 color; float4x4 mvp; }; struct VSInput { float3 position : POSITION; float2 uv : TEXCOORD0; }; struct VSOutput { float4 position : SV_POSITION; float2 uv : TEXCOORD0; }; VSOutput main(VSInput input) { VSOutput output; output.position = float4(input.position, 1.0); output.uv = input.uv; return output; } )"; static const char* kPS = R"( cbuffer UniformBlock : register(b0) { float3 color; float4x4 mvp; }; Texture2D diffuseTex : register(t0); SamplerState linearSampler : register(s0); struct PSInput { float4 position : SV_POSITION; float2 uv : TEXCOORD0; }; float4 main(PSInput input) : SV_Target { float numSteps = 20.0; float uvX; if (input.uv.y < 0.25) { uvX = input.uv.x; } else if (input.uv.y < 0.5) { uvX = floor(input.uv.x * numSteps) / numSteps; } else if (input.uv.y < 0.75) { uvX = (floor(input.uv.x * numSteps) + 0.5) / numSteps; } else { uvX = 1.0 - input.uv.x; } return float4(uvX, input.uv.y, 0.5, 1.0); } )"; return igl::ShaderStagesCreator::fromModuleStringInput( device, kVS, "main", "", kPS, "main", "", nullptr); } else { // Regular textured mode static const char* kVS = R"( cbuffer UniformBlock : register(b0) { float3 color; float4x4 mvp; }; struct VSInput { float3 position : POSITION; float2 uv : TEXCOORD0; }; struct VSOutput { float4 position : SV_POSITION; float2 uv : TEXCOORD0; }; VSOutput main(VSInput input) { VSOutput output; output.position = mul(mvp, float4(input.position, 1.0)); output.uv = input.uv; return output; } )"; static const char* kPS = R"( cbuffer UniformBlock : register(b0) { float3 color; float4x4 mvp; }; Texture2D diffuseTex : register(t0); SamplerState linearSampler : register(s0); struct PSInput { float4 position : SV_POSITION; float2 uv : TEXCOORD0; }; float4 main(PSInput input) : SV_Target { float4 tex = diffuseTex.Sample(linearSampler, input.uv); return float4(color.r, color.g, color.b, 1.0) * tex; } )"; return igl::ShaderStagesCreator::fromModuleStringInput( device, kVS, "main", "", kPS, "main", "", nullptr); } } case igl::BackendType::OpenGL: return igl::ShaderStagesCreator::fromModuleStringInput( device, getOpenGLVertexShaderSource().c_str(), "main", "", colorTestModes_ == ColorTestModes::Gradient ? getOpenGLFragmentShaderSourceGradient().c_str() : getOpenGLFragmentShaderSource().c_str(), "main", "", nullptr); } IGL_UNREACHABLE_RETURN(nullptr) } void ColorSession::initialize() noexcept { IDevice& device = getPlatform().getDevice(); const glm::vec3 fLinearOrangeColor = (swapchainColorTextureformat_ == igl::TextureFormat::RGBA_SRGB && device.hasFeature(DeviceFeatures::SRGB)) ? glm::vec3(glm::convertSRGBToLinear(glm::dvec3{1.0, 0.5, 0.0})) : glm::vec3{1.0f, 0.5f, 0.0f}; const iglu::simdtypes::float3 gpuLinearOrangeColor = { fLinearOrangeColor.x, fLinearOrangeColor.y, fLinearOrangeColor.z}; // Vertex & Index buffer vb0_ = device.createBuffer(getVertexBufferDesc(device), nullptr); IGL_DEBUG_ASSERT(vb0_ != nullptr); ib0_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Index, .data = kIndexData, .length = sizeof(kIndexData), .storage = getIndexBufferResourceStorage(device), .debugName = "index"}, nullptr); IGL_DEBUG_ASSERT(ib0_ != nullptr); const uint32_t vertexBufferIndex = getVertexBufferIndex(device); VertexInputStateDesc inputDesc = { .numAttributes = 2, .attributes = { {.bufferIndex = vertexBufferIndex, .format = VertexAttributeFormat::Float3, .offset = offsetof(VertexPosUv, position), .name = "position", .location = 0}, {.bufferIndex = vertexBufferIndex, .format = VertexAttributeFormat::Float2, .offset = offsetof(VertexPosUv, uv), .name = "uv_in", .location = 1}, }, .numInputBindings = 1, }; inputDesc.inputBindings[vertexBufferIndex].stride = sizeof(VertexPosUv); vertexInput0_ = device.createVertexInputState(inputDesc, nullptr); IGL_DEBUG_ASSERT(vertexInput0_ != nullptr); // Sampler & Texture samp0_ = device.createSamplerState( SamplerStateDesc{ .minFilter = SamplerMinMagFilter::Linear, .magFilter = SamplerMinMagFilter::Linear, .debugName = "Sampler: linear", }, nullptr); IGL_DEBUG_ASSERT(samp0_ != nullptr); if (colorTestModes_ == ColorTestModes::MacbethTexture) { tex0_ = getPlatform().loadTexture("macbeth.png", true, swapchainColorTextureformat_); } else if (colorTestModes_ == ColorTestModes::MacbethTextureKtx) { tex0_ = getPlatform().loadTexture("macbeth.ktx", true, swapchainColorTextureformat_); } else if (colorTestModes_ == ColorTestModes::MacbethTextureKtx2) { tex0_ = getPlatform().loadTexture("macbeth.ktx2", true, swapchainColorTextureformat_); } else if (colorTestModes_ == ColorTestModes::OrangeTexture) { tex0_ = getPlatform().loadTexture("orange.png", true, swapchainColorTextureformat_); } else if (colorTestModes_ == ColorTestModes::OrangeClear) { tex0_ = getPlatform().loadTexture(igl::shell::ImageLoader::white()); setPreferredClearColor( Color{fLinearOrangeColor.x, fLinearOrangeColor.y, fLinearOrangeColor.z, 1.0f}); } else if (colorTestModes_ == ColorTestModes::Gradient) { tex0_ = getPlatform().loadTexture(igl::shell::ImageLoader::white()); } shaderStages_ = getShaderStagesForBackend(device); IGL_DEBUG_ASSERT(shaderStages_ != nullptr); // Command queue commandQueue_ = device.createCommandQueue({}, nullptr); IGL_DEBUG_ASSERT(commandQueue_ != nullptr); renderPass_ = { .colorAttachments = {{ .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, .clearColor = getPreferredClearColor(), }}, .depthAttachment = {.loadAction = LoadAction::Clear, .clearDepth = 1.0}, }; // init uniforms const glm::mat4x4 mvp(1.0f); memcpy(&fragmentParameters_.mvp, &mvp, sizeof(mvp)); fragmentParameters_.color = (colorTestModes_ == ColorTestModes::OrangeClear) ? gpuLinearOrangeColor : iglu::simdtypes::float3{1.0f, 1.0f, 1.0f}; fragmentParamBuffer_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Uniform, .data = &fragmentParameters_, .length = sizeof(fragmentParameters_), .storage = ResourceStorage::Shared, .debugName = "uniforms"}, nullptr); IGL_DEBUG_ASSERT(fragmentParamBuffer_ != nullptr); } void ColorSession::update(SurfaceTextures surfaceTextures) noexcept { if (framebuffer_ == nullptr) { Result ret; framebuffer_ = getPlatform().getDevice().createFramebuffer( FramebufferDesc{ .colorAttachments = {{.texture = surfaceTextures.color}}, .depthAttachment = {.texture = surfaceTextures.depth}, .mode = surfaceTextures.color->getNumLayers() > 1 ? FramebufferMode::Stereo : FramebufferMode::Mono, }, &ret); IGL_DEBUG_ASSERT(ret.isOk()); IGL_DEBUG_ASSERT(framebuffer_ != nullptr); } else { framebuffer_->updateDrawable(surfaceTextures.color); } const size_t textureUnit = 0; // Graphics pipeline if (pipelineState_ == nullptr) { pipelineState_ = getPlatform().getDevice().createRenderPipeline( RenderPipelineDesc{ .vertexInputState = vertexInput0_, .shaderStages = shaderStages_, .targetDesc = { .colorAttachments = {{ .textureFormat = framebuffer_->getColorAttachment(0)->getProperties().format, .blendEnabled = true, .rgbBlendOp = BlendOp::Add, .alphaBlendOp = BlendOp::Add, .srcRGBBlendFactor = BlendFactor::SrcAlpha, .srcAlphaBlendFactor = BlendFactor::SrcAlpha, .dstRGBBlendFactor = BlendFactor::OneMinusSrcAlpha, .dstAlphaBlendFactor = BlendFactor::OneMinusSrcAlpha, }}, .depthAttachmentFormat = framebuffer_->getDepthAttachment()->getProperties().format, }, .cullMode = igl::CullMode::Back, .frontFaceWinding = igl::WindingMode::Clockwise, .fragmentUnitSamplerMap = {{textureUnit, IGL_NAMEHANDLE("inputImage")}}, }, nullptr); IGL_DEBUG_ASSERT(pipelineState_ != nullptr); } // Command Buffers const auto buffer = commandQueue_->createCommandBuffer({}, nullptr); IGL_DEBUG_ASSERT(buffer != nullptr); const auto drawableSurface = framebuffer_->getColorAttachment(0); framebuffer_->updateDrawable(drawableSurface); // Uniform: "color" fragmentUniformDescriptors_.emplace_back(); // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only if (getPlatform().getDevice().hasFeature(DeviceFeatures::BindUniform)) { fragmentUniformDescriptors_.back().location = pipelineState_->getIndexByName("color", igl::ShaderStage::Fragment); } fragmentUniformDescriptors_.back().type = UniformType::Float3; fragmentUniformDescriptors_.back().offset = offsetof(FragmentFormat, color); // Uniform: "mvp" fragmentUniformDescriptors_.emplace_back(); // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only if (getPlatform().getDevice().hasFeature(DeviceFeatures::BindUniform)) { fragmentUniformDescriptors_.back().location = pipelineState_->getIndexByName("mvp", igl::ShaderStage::Fragment); } fragmentUniformDescriptors_.back().type = UniformType::Mat4x4; fragmentUniformDescriptors_.back().offset = offsetof(FragmentFormat, mvp); const auto& mvp = getPlatform().getDisplayContext().preRotationMatrix; memcpy(&fragmentParameters_.mvp, &mvp, sizeof(mvp)); fragmentParamBuffer_->upload(&fragmentParameters_, {sizeof(fragmentParameters_)}); // Submit commands const auto commands = buffer->createRenderCommandEncoder(renderPass_, framebuffer_); IGL_DEBUG_ASSERT(commands != nullptr); if (commands) { commands->bindVertexBuffer(getVertexBufferIndex(getPlatform().getDevice()), *vb0_); commands->bindRenderPipelineState(pipelineState_); if (getPlatform().getDevice().hasFeature(DeviceFeatures::BindUniform)) { // Bind non block uniforms for (const auto& uniformDesc : fragmentUniformDescriptors_) { commands->bindUniform(uniformDesc, &fragmentParameters_); } } else if (getPlatform().getDevice().hasFeature(DeviceFeatures::UniformBlocks)) { // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only commands->bindBuffer(0, fragmentParamBuffer_.get()); // @fb-only } else { IGL_DEBUG_ASSERT_NOT_REACHED(); } // if (colorTestModes_ != ColorTestModes::eGradient) { commands->bindTexture(textureUnit, BindTarget::kFragment, tex0_.get()); commands->bindSamplerState(textureUnit, BindTarget::kFragment, samp0_.get()); //} commands->bindIndexBuffer(*ib0_, IndexFormat::UInt16); commands->drawIndexed(6); commands->endEncoding(); } IGL_DEBUG_ASSERT(buffer != nullptr); if (shellParams().shouldPresent) { buffer->present(drawableSurface); } IGL_DEBUG_ASSERT(commandQueue_ != nullptr); commandQueue_->submit(*buffer, true); RenderSession::update(surfaceTextures); } } // namespace igl::shell ================================================ FILE: shell/renderSessions/ColorSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include #include #include namespace igl::shell { class ColorSession : public RenderSession { struct FragmentFormat { iglu::simdtypes::float3 color; iglu::simdtypes::float4x4 mvp; }; public: explicit ColorSession(std::shared_ptr platform) : RenderSession(std::move(platform)) {} void initialize() noexcept override; void update(SurfaceTextures surfaceTextures) noexcept override; enum class ColorTestModes { MacbethTexture, MacbethTextureKtx, MacbethTextureKtx2, OrangeTexture, OrangeClear, Gradient, }; void setTestMode(ColorTestModes colorTestModes) noexcept { colorTestModes_ = colorTestModes; } void setSwapchainColorTextureformat(TextureFormat swapchainColorTextureformat) { swapchainColorTextureformat_ = swapchainColorTextureformat; } private: std::unique_ptr getShaderStagesForBackend(IDevice& device); ColorTestModes colorTestModes_ = ColorTestModes::MacbethTexture; std::shared_ptr pipelineState_; std::shared_ptr vertexInput0_; std::shared_ptr samp0_; std::shared_ptr shaderStages_; std::shared_ptr vb0_; std::shared_ptr ib0_; std::shared_ptr fragmentParamBuffer_; std::shared_ptr depthTexture_; std::shared_ptr tex0_; RenderPassDesc renderPass_; FragmentFormat fragmentParameters_{}; std::vector fragmentUniformDescriptors_; std::vector vertexUniformDescriptors_; TextureFormat swapchainColorTextureformat_ = TextureFormat::RGBA_SRGB; }; } // namespace igl::shell ================================================ FILE: shell/renderSessions/CopyOperationsSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include #include namespace igl::shell { namespace { struct VertexPosColor { iglu::simdtypes::float3 position; iglu::simdtypes::float4 color; }; VertexPosColor vertexData[] = { {.position = {-0.6f, -0.4f, 0.0}, .color = {1.0, 0.0, 0.0, 1.0}}, {.position = {0.6f, -0.4f, 0.0}, .color = {0.0, 1.0, 0.0, 1.0}}, {.position = {0.0f, 0.6f, 0.0}, .color = {0.0, 0.0, 1.0, 1.0}}, }; uint16_t indexData[] = { 2, 1, 0, }; std::string getVersion() { return {"#version 100"}; } std::string getMetalShaderSource() { return R"( using namespace metal; typedef struct { float3 position [[attribute(0)]]; float4 color [[attribute(1)]]; } VertexIn; typedef struct { float4 position [[position]]; float4 color; } VertexOut; vertex VertexOut vertexShader( uint vid [[vertex_id]], constant VertexIn * vertices [[buffer(1)]]) { VertexOut out; out.position = float4(vertices[vid].position, 1.0); out.color = vertices[vid].color; return out; } fragment float4 fragmentShader( VertexOut IN [[stage_in]]) { return IN.color; } )"; } std::string getOpenGLVertexShaderSource() { return getVersion() + R"( precision highp float; attribute vec3 position; attribute vec4 color_in; varying vec4 vColor; void main() { gl_Position = vec4(position, 1.0); vColor = color_in; })"; } std::string getOpenGLFragmentShaderSource() { return getVersion() + std::string(R"( precision highp float; varying vec4 vColor; void main() { gl_FragColor = vColor; })"); } std::string getVulkanVertexShaderSource() { return R"( layout(location = 0) in vec3 position; layout(location = 1) in vec4 color_in; layout(location = 0) out vec4 color; void main() { gl_Position = vec4(position, 1.0); color = color_in; } )"; } std::string getVulkanFragmentShaderSource() { return R"( layout(location = 0) in vec4 color; layout(location = 0) out vec4 out_FragColor; void main() { out_FragColor = color; } )"; } std::unique_ptr getShaderStagesForBackend(IDevice& device) { switch (device.getBackendType()) { case igl::BackendType::Invalid: case igl::BackendType::Custom: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; case igl::BackendType::Vulkan: return igl::ShaderStagesCreator::fromModuleStringInput(device, getVulkanVertexShaderSource().c_str(), "main", "", getVulkanFragmentShaderSource().c_str(), "main", "", nullptr); // @fb-only // @fb-only // @fb-only case igl::BackendType::Metal: return igl::ShaderStagesCreator::fromLibraryStringInput( device, getMetalShaderSource().c_str(), "vertexShader", "fragmentShader", "", nullptr); case igl::BackendType::OpenGL: return igl::ShaderStagesCreator::fromModuleStringInput(device, getOpenGLVertexShaderSource().c_str(), "main", "", getOpenGLFragmentShaderSource().c_str(), "main", "", nullptr); case igl::BackendType::D3D12: { static const char* kVS = R"( struct VSIn { float3 position : POSITION; float4 color : COLOR; }; struct VSOut { float4 position : SV_POSITION; float4 color : COLOR; }; VSOut main(VSIn v) { VSOut o; o.position = float4(v.position, 1.0); o.color = v.color; return o; } )"; static const char* kPS = R"( struct PSIn { float4 position : SV_POSITION; float4 color : COLOR; }; float4 main(PSIn i) : SV_TARGET { return i.color; } )"; return igl::ShaderStagesCreator::fromModuleStringInput( device, kVS, "main", "", kPS, "main", "", nullptr); } } IGL_UNREACHABLE_RETURN(nullptr) } } // namespace void CopyOperationsSession::initialize() noexcept { auto& device = getPlatform().getDevice(); // Create source vertex buffer with vertex data srcVertexBuffer_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Vertex, .data = vertexData, .length = sizeof(vertexData)}, nullptr); IGL_DEBUG_ASSERT(srcVertexBuffer_ != nullptr); // Create destination vertex buffer (same size, no initial data) dstVertexBuffer_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Vertex, .data = nullptr, .length = sizeof(vertexData)}, nullptr); IGL_DEBUG_ASSERT(dstVertexBuffer_ != nullptr); // Index buffer indexBuffer_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Index, .data = indexData, .length = sizeof(indexData)}, nullptr); IGL_DEBUG_ASSERT(indexBuffer_ != nullptr); vertexInputState_ = device.createVertexInputState( VertexInputStateDesc{ .numAttributes = 2, .attributes = { VertexAttribute{.bufferIndex = 1, .format = VertexAttributeFormat::Float3, .offset = offsetof(VertexPosColor, position), .name = "position", .location = 0}, VertexAttribute{.bufferIndex = 1, .format = VertexAttributeFormat::Float4, .offset = offsetof(VertexPosColor, color), .name = "color_in", .location = 1}, }, .numInputBindings = 1, .inputBindings = {{}, {.stride = sizeof(VertexPosColor)}}, }, nullptr); IGL_DEBUG_ASSERT(vertexInputState_ != nullptr); shaderStages_ = getShaderStagesForBackend(device); IGL_DEBUG_ASSERT(shaderStages_ != nullptr); // Command queue commandQueue_ = device.createCommandQueue(CommandQueueDesc{}, nullptr); IGL_DEBUG_ASSERT(commandQueue_ != nullptr); renderPass_ = { .colorAttachments = { { .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, .clearColor = getPreferredClearColor(), }, }, .depthAttachment = { .loadAction = LoadAction::Clear, .clearDepth = 1.0, }, }; } void CopyOperationsSession::update(SurfaceTextures textures) noexcept { Result ret; // Create or update framebuffer if (framebuffer_ == nullptr) { framebuffer_ = getPlatform().getDevice().createFramebuffer( FramebufferDesc{ .colorAttachments = {{.texture = textures.color}}, .depthAttachment = {.texture = textures.depth}, .stencilAttachment = textures.depth && textures.depth->getProperties().hasStencil() ? FramebufferDesc::AttachmentDesc{.texture = textures.depth} : FramebufferDesc::AttachmentDesc{}, }, &ret); IGL_DEBUG_ASSERT(ret.isOk()); IGL_DEBUG_ASSERT(framebuffer_ != nullptr); } else { framebuffer_->updateDrawable(textures); } // Create graphics pipeline (cached) if (pipelineState_ == nullptr) { pipelineState_ = getPlatform().getDevice().createRenderPipeline( RenderPipelineDesc{ .vertexInputState = vertexInputState_, .shaderStages = shaderStages_, .targetDesc = { .colorAttachments = {{.textureFormat = framebuffer_->getColorAttachment(0)->getFormat()}}, .depthAttachmentFormat = framebuffer_->getDepthAttachment()->getFormat(), .stencilAttachmentFormat = framebuffer_->getStencilAttachment() ? framebuffer_->getStencilAttachment()->getFormat() : igl::TextureFormat::Invalid, }, .cullMode = igl::CullMode::Back, .frontFaceWinding = igl::WindingMode::Clockwise, }, nullptr); IGL_DEBUG_ASSERT(pipelineState_ != nullptr); } // Create command buffer auto buffer = commandQueue_->createCommandBuffer(CommandBufferDesc{}, nullptr); IGL_DEBUG_ASSERT(buffer != nullptr); // Step 1: Buffer-to-buffer copy (once) // Copy vertex data from srcVertexBuffer_ to dstVertexBuffer_ using ICommandBuffer::copyBuffer() if (!hasCopied_) { buffer->copyBuffer(*srcVertexBuffer_, *dstVertexBuffer_, 0, 0, sizeof(vertexData)); hasCopied_ = true; IGL_LOG_INFO("[CopyOperationsSession] Copied %zu bytes from src to dst vertex buffer\n", sizeof(vertexData)); } auto drawableSurface = framebuffer_->getColorAttachment(0); // Step 2: Render the triangle using the DESTINATION buffer (the copied one) const std::shared_ptr commands = buffer->createRenderCommandEncoder(renderPass_, framebuffer_); IGL_DEBUG_ASSERT(commands != nullptr); if (commands) { commands->bindVertexBuffer(1, *dstVertexBuffer_); commands->bindRenderPipelineState(pipelineState_); commands->bindIndexBuffer(*indexBuffer_, IndexFormat::UInt16); commands->drawIndexed(3); commands->endEncoding(); } IGL_DEBUG_ASSERT(buffer != nullptr); if (shellParams().shouldPresent) { buffer->present(drawableSurface); } IGL_DEBUG_ASSERT(commandQueue_ != nullptr); commandQueue_->submit(*buffer); // Step 3: Framebuffer readback -- read rendered pixels and log first pixel color // Uses IFramebuffer::copyBytesColorAttachment() to demonstrate GPU-to-CPU readback if (!hasReadBack_) { const auto colorAttachment = framebuffer_->getColorAttachment(0); if (colorAttachment) { const uint32_t width = colorAttachment->getDimensions().width; const uint32_t height = colorAttachment->getDimensions().height; if (width > 0 && height > 0) { std::vector pixels(static_cast(width) * height); framebuffer_->copyBytesColorAttachment( *commandQueue_, 0, pixels.data(), TextureRangeDesc::new2D(0, 0, width, height)); // Log first pixel RGBA (packed as 0xAABBGGRR in most backends) const uint32_t firstPixel = pixels[0]; const uint8_t r = static_cast(firstPixel & 0xFF); const uint8_t g = static_cast((firstPixel >> 8) & 0xFF); const uint8_t b = static_cast((firstPixel >> 16) & 0xFF); const uint8_t a = static_cast((firstPixel >> 24) & 0xFF); IGL_LOG_INFO( "[CopyOperationsSession] Framebuffer readback: first pixel RGBA = (%u, %u, %u, %u)\n", r, g, b, a); hasReadBack_ = true; } } } RenderSession::update(textures); } } // namespace igl::shell ================================================ FILE: shell/renderSessions/CopyOperationsSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include #include #include namespace igl::shell { class CopyOperationsSession : public RenderSession { public: explicit CopyOperationsSession(std::shared_ptr platform) : RenderSession(std::move(platform)) {} void initialize() noexcept override; void update(SurfaceTextures surfaceTextures) noexcept override; private: std::shared_ptr framebuffer_; std::shared_ptr pipelineState_; std::shared_ptr srcVertexBuffer_; std::shared_ptr dstVertexBuffer_; std::shared_ptr indexBuffer_; std::shared_ptr vertexInputState_; std::shared_ptr shaderStages_; RenderPassDesc renderPass_; bool hasCopied_ = false; bool hasReadBack_ = false; }; } // namespace igl::shell ================================================ FILE: shell/renderSessions/DepthBiasSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include namespace igl::shell { namespace { // Shadow map resolution constexpr uint32_t kShadowMapSize = 1024; struct VertexPosNormal { iglu::simdtypes::float3 position; iglu::simdtypes::float3 normal; }; // clang-format off // Floor quad (two triangles) lying on the Y=-0.5 plane // Triangle (floating above the floor) casting a shadow VertexPosNormal vertexData[] = { // Floor quad vertices (indices 0-3) {.position = {-1.0f, -0.5f, -1.0f}, .normal = {0.0f, 1.0f, 0.0f}}, {.position = {1.0f, -0.5f, -1.0f}, .normal = {0.0f, 1.0f, 0.0f}}, {.position = {1.0f, -0.5f, 1.0f}, .normal = {0.0f, 1.0f, 0.0f}}, {.position = {-1.0f, -0.5f, 1.0f}, .normal = {0.0f, 1.0f, 0.0f}}, // Triangle vertices (indices 4-6), floating above the floor {.position = {-0.3f, 0.3f, 0.0f}, .normal = {0.0f, 0.0f, -1.0f}}, {.position = {0.3f, 0.3f, 0.0f}, .normal = {0.0f, 0.0f, -1.0f}}, {.position = {0.0f, 0.7f, 0.0f}, .normal = {0.0f, 0.0f, -1.0f}}, }; uint16_t indexData[] = { // Floor quad (two triangles) 0, 1, 2, 0, 2, 3, // Floating triangle 4, 5, 6, }; // clang-format on constexpr size_t kFloorIndexCount = 6; constexpr size_t kTriangleIndexCount = 3; constexpr size_t kTotalIndexCount = kFloorIndexCount + kTriangleIndexCount; // =========================================================================== // Shadow pass shaders: depth-only, simple transform from light's perspective // =========================================================================== // A simple orthographic light view-projection applied to each vertex. // The light looks down along -Y with a slight tilt. std::string getShadowMetalShaderSource() { return R"( using namespace metal; typedef struct { float3 position [[attribute(0)]]; float3 normal [[attribute(1)]]; } VertexIn; typedef struct { float4 position [[position]]; } VertexOut; vertex VertexOut shadowVertexShader( uint vid [[vertex_id]], constant VertexIn * vertices [[buffer(1)]]) { VertexOut out; // Simple orthographic projection from light's point of view // Light is above, looking down along -Y float3 p = vertices[vid].position; out.position = float4(p.x * 0.5, -p.z * 0.5, (p.y + 1.0) * 0.5, 1.0); return out; } fragment float4 shadowFragmentShader( VertexOut IN [[stage_in]]) { return float4(0.0); } )"; } std::string getShadowOpenGLVertexShaderSource() { return R"(#version 100 precision highp float; attribute vec3 position; attribute vec3 normal; void main() { // Simple orthographic projection from light's point of view gl_Position = vec4(position.x * 0.5, -position.z * 0.5, (position.y + 1.0) * 0.5, 1.0); })"; } std::string getShadowOpenGLFragmentShaderSource() { return R"(#version 100 precision highp float; void main() { gl_FragColor = vec4(0.0); })"; } std::string getShadowVulkanVertexShaderSource() { return R"( layout(location = 0) in vec3 position; layout(location = 1) in vec3 normal; void main() { // Simple orthographic projection from light's point of view gl_Position = vec4(position.x * 0.5, -position.z * 0.5, (position.y + 1.0) * 0.5, 1.0); } )"; } std::string getShadowVulkanFragmentShaderSource() { return R"( layout(location = 0) out vec4 out_FragColor; void main() { out_FragColor = vec4(0.0); } )"; } std::unique_ptr getShadowShaderStagesForBackend(IDevice& device) { switch (device.getBackendType()) { case igl::BackendType::Invalid: case igl::BackendType::Custom: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; case igl::BackendType::Vulkan: return igl::ShaderStagesCreator::fromModuleStringInput( device, getShadowVulkanVertexShaderSource().c_str(), "main", "", getShadowVulkanFragmentShaderSource().c_str(), "main", "", nullptr); // @fb-only // @fb-only // @fb-only case igl::BackendType::Metal: return igl::ShaderStagesCreator::fromLibraryStringInput(device, getShadowMetalShaderSource().c_str(), "shadowVertexShader", "shadowFragmentShader", "", nullptr); case igl::BackendType::OpenGL: return igl::ShaderStagesCreator::fromModuleStringInput( device, getShadowOpenGLVertexShaderSource().c_str(), "main", "", getShadowOpenGLFragmentShaderSource().c_str(), "main", "", nullptr); case igl::BackendType::D3D12: { static const char* kVS = R"( struct VSIn { float3 position : POSITION; float3 normal : NORMAL; }; struct VSOut { float4 position : SV_POSITION; }; VSOut main(VSIn v) { VSOut o; o.position = float4(v.position.x * 0.5, -v.position.z * 0.5, (v.position.y + 1.0) * 0.5, 1.0); return o; } )"; static const char* kPS = R"( struct PSIn { float4 position : SV_POSITION; }; float4 main(PSIn i) : SV_TARGET { return float4(0.0, 0.0, 0.0, 0.0); } )"; return igl::ShaderStagesCreator::fromModuleStringInput( device, kVS, "main", "", kPS, "main", "", nullptr); } } IGL_UNREACHABLE_RETURN(nullptr) } // =========================================================================== // Main pass shaders: render scene with basic shadow testing // =========================================================================== // The main pass transforms vertices for the camera view, and also computes // shadow-map texture coordinates (the same transform used in the shadow pass). // The fragment shader samples the shadow map to determine if a fragment is // in shadow and darkens it accordingly. std::string getMainMetalShaderSource() { return R"( using namespace metal; typedef struct { float3 position [[attribute(0)]]; float3 normal [[attribute(1)]]; } VertexIn; typedef struct { float4 position [[position]]; float3 normal; float3 shadowCoord; } VertexOut; vertex VertexOut vertexShader( uint vid [[vertex_id]], constant VertexIn * vertices [[buffer(1)]]) { VertexOut out; float3 p = vertices[vid].position; // Camera: simple perspective-like view out.position = float4(p.x * 0.8, p.y * 0.8 + 0.1, p.z * 0.1 + 0.5, 1.0); out.normal = vertices[vid].normal; // Shadow map coords: same transform as shadow pass, mapped to [0,1] out.shadowCoord = float3(p.x * 0.5 * 0.5 + 0.5, -p.z * 0.5 * 0.5 + 0.5, (p.y + 1.0) * 0.5); return out; } fragment float4 fragmentShader( VertexOut IN [[stage_in]], depth2d shadowMap [[texture(0)]], sampler shadowSampler [[sampler(0)]]) { // Base color: light gray for floor, blue for triangle float3 baseColor = (IN.normal.y > 0.5) ? float3(0.8, 0.8, 0.8) : float3(0.2, 0.5, 1.0); // Simple diffuse lighting from above float3 lightDir = normalize(float3(0.3, 1.0, 0.5)); float ndotl = max(dot(IN.normal, lightDir), 0.3); // Shadow test float shadowDepth = shadowMap.sample(shadowSampler, IN.shadowCoord.xy); float shadow = (IN.shadowCoord.z > shadowDepth + 0.005) ? 0.4 : 1.0; return float4(baseColor * ndotl * shadow, 1.0); } )"; } std::string getMainOpenGLVertexShaderSource() { return R"(#version 100 precision highp float; attribute vec3 position; attribute vec3 normal; varying vec3 vNormal; varying vec3 vShadowCoord; void main() { // Camera transform gl_Position = vec4(position.x * 0.8, position.y * 0.8 + 0.1, position.z * 0.1 + 0.5, 1.0); vNormal = normal; // Shadow map coords vShadowCoord = vec3(position.x * 0.5 * 0.5 + 0.5, -position.z * 0.5 * 0.5 + 0.5, (position.y + 1.0) * 0.5); })"; } std::string getMainOpenGLFragmentShaderSource() { return R"(#version 100 precision highp float; varying vec3 vNormal; varying vec3 vShadowCoord; uniform sampler2D shadowMap; void main() { // Base color vec3 baseColor = (vNormal.y > 0.5) ? vec3(0.8, 0.8, 0.8) : vec3(0.2, 0.5, 1.0); // Simple diffuse lighting vec3 lightDir = normalize(vec3(0.3, 1.0, 0.5)); float ndotl = max(dot(vNormal, lightDir), 0.3); // Shadow test float shadowDepth = texture2D(shadowMap, vShadowCoord.xy).r; float shadow = (vShadowCoord.z > shadowDepth + 0.005) ? 0.4 : 1.0; gl_FragColor = vec4(baseColor * ndotl * shadow, 1.0); })"; } std::string getMainVulkanVertexShaderSource() { return R"( layout(location = 0) in vec3 position; layout(location = 1) in vec3 normal; layout(location = 0) out vec3 vNormal; layout(location = 1) out vec3 vShadowCoord; void main() { // Camera transform gl_Position = vec4(position.x * 0.8, position.y * 0.8 + 0.1, position.z * 0.1 + 0.5, 1.0); vNormal = normal; // Shadow map coords vShadowCoord = vec3(position.x * 0.5 * 0.5 + 0.5, -position.z * 0.5 * 0.5 + 0.5, (position.y + 1.0) * 0.5); } )"; } std::string getMainVulkanFragmentShaderSource() { return R"( layout(location = 0) in vec3 vNormal; layout(location = 1) in vec3 vShadowCoord; layout(location = 0) out vec4 out_FragColor; layout(set = 0, binding = 0) uniform sampler2D shadowMap; void main() { // Base color vec3 baseColor = (vNormal.y > 0.5) ? vec3(0.8, 0.8, 0.8) : vec3(0.2, 0.5, 1.0); // Simple diffuse lighting vec3 lightDir = normalize(vec3(0.3, 1.0, 0.5)); float ndotl = max(dot(vNormal, lightDir), 0.3); // Shadow test float shadowDepth = texture(shadowMap, vShadowCoord.xy).r; float shadow = (vShadowCoord.z > shadowDepth + 0.005) ? 0.4 : 1.0; out_FragColor = vec4(baseColor * ndotl * shadow, 1.0); } )"; } std::unique_ptr getMainShaderStagesForBackend(IDevice& device) { switch (device.getBackendType()) { case igl::BackendType::Invalid: case igl::BackendType::Custom: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; case igl::BackendType::Vulkan: return igl::ShaderStagesCreator::fromModuleStringInput( device, getMainVulkanVertexShaderSource().c_str(), "main", "", getMainVulkanFragmentShaderSource().c_str(), "main", "", nullptr); // @fb-only // @fb-only // @fb-only case igl::BackendType::Metal: return igl::ShaderStagesCreator::fromLibraryStringInput( device, getMainMetalShaderSource().c_str(), "vertexShader", "fragmentShader", "", nullptr); case igl::BackendType::OpenGL: return igl::ShaderStagesCreator::fromModuleStringInput( device, getMainOpenGLVertexShaderSource().c_str(), "main", "", getMainOpenGLFragmentShaderSource().c_str(), "main", "", nullptr); case igl::BackendType::D3D12: { static const char* kVS = R"( struct VSIn { float3 position : POSITION; float3 normal : NORMAL; }; struct VSOut { float4 position : SV_POSITION; float3 normal : NORMAL; float3 shadowCoord : TEXCOORD0; }; VSOut main(VSIn v) { VSOut o; o.position = float4(v.position.x * 0.8, v.position.y * 0.8 + 0.1, v.position.z * 0.1 + 0.5, 1.0); o.normal = v.normal; o.shadowCoord = float3(v.position.x * 0.5 * 0.5 + 0.5, -v.position.z * 0.5 * 0.5 + 0.5, (v.position.y + 1.0) * 0.5); return o; } )"; static const char* kPS = R"( Texture2D shadowMap : register(t0); SamplerState shadowSampler : register(s0); struct PSIn { float4 position : SV_POSITION; float3 normal : NORMAL; float3 shadowCoord : TEXCOORD0; }; float4 main(PSIn i) : SV_TARGET { // Base color float3 baseColor = (i.normal.y > 0.5) ? float3(0.8, 0.8, 0.8) : float3(0.2, 0.5, 1.0); // Simple diffuse lighting float3 lightDir = normalize(float3(0.3, 1.0, 0.5)); float ndotl = max(dot(i.normal, lightDir), 0.3); // Shadow test float shadowDepth = shadowMap.Sample(shadowSampler, i.shadowCoord.xy).r; float shadow = (i.shadowCoord.z > shadowDepth + 0.005) ? 0.4 : 1.0; return float4(baseColor * ndotl * shadow, 1.0); } )"; return igl::ShaderStagesCreator::fromModuleStringInput( device, kVS, "main", "", kPS, "main", "", nullptr); } } IGL_UNREACHABLE_RETURN(nullptr) } } // namespace void DepthBiasSession::initialize() noexcept { auto& device = getPlatform().getDevice(); // Vertex & Index buffer vertexBuffer_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Vertex, .data = vertexData, .length = sizeof(vertexData)}, nullptr); IGL_DEBUG_ASSERT(vertexBuffer_ != nullptr); indexBuffer_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Index, .data = indexData, .length = sizeof(indexData)}, nullptr); IGL_DEBUG_ASSERT(indexBuffer_ != nullptr); // Vertex input state: position (float3) + normal (float3) vertexInputState_ = device.createVertexInputState( VertexInputStateDesc{ .numAttributes = 2, .attributes = { VertexAttribute{.bufferIndex = 1, .format = VertexAttributeFormat::Float3, .offset = offsetof(VertexPosNormal, position), .name = "position", .location = 0}, VertexAttribute{.bufferIndex = 1, .format = VertexAttributeFormat::Float3, .offset = offsetof(VertexPosNormal, normal), .name = "normal", .location = 1}, }, .numInputBindings = 1, .inputBindings = {{}, {.stride = sizeof(VertexPosNormal)}}, }, nullptr); IGL_DEBUG_ASSERT(vertexInputState_ != nullptr); // Shader stages for both passes shadowShaderStages_ = getShadowShaderStagesForBackend(device); IGL_DEBUG_ASSERT(shadowShaderStages_ != nullptr); shaderStages_ = getMainShaderStagesForBackend(device); IGL_DEBUG_ASSERT(shaderStages_ != nullptr); // Command queue commandQueue_ = device.createCommandQueue(CommandQueueDesc{}, nullptr); IGL_DEBUG_ASSERT(commandQueue_ != nullptr); // Depth stencil state: depth testing and depth writes enabled { DepthStencilStateDesc desc; desc.compareFunction = CompareFunction::Less; desc.isDepthWriteEnabled = true; depthStencilState_ = device.createDepthStencilState(desc, nullptr); IGL_DEBUG_ASSERT(depthStencilState_ != nullptr); } // Sampler for the shadow map shadowSampler_ = device.createSamplerState( SamplerStateDesc{ .minFilter = SamplerMinMagFilter::Nearest, .magFilter = SamplerMinMagFilter::Nearest, .addressModeU = SamplerAddressMode::Clamp, .addressModeV = SamplerAddressMode::Clamp, .debugName = "Shadow Sampler", }, nullptr); IGL_DEBUG_ASSERT(shadowSampler_ != nullptr); // Shadow render pass descriptor: depth-only, no color attachment shadowRenderPass_ = { .depthAttachment = { .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, .clearDepth = 1.0, }, }; // Main render pass descriptor renderPass_ = { .colorAttachments = { { .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, .clearColor = getPreferredClearColor(), }, }, .depthAttachment = { .loadAction = LoadAction::Clear, .clearDepth = 1.0, }, }; } void DepthBiasSession::update(SurfaceTextures textures) noexcept { Result ret; auto& device = getPlatform().getDevice(); // Create the shadow map texture (depth-only, also sampled for shadow testing) if (shadowMap_ == nullptr) { shadowMap_ = device.createTexture(TextureDesc::new2D(TextureFormat::Z_UNorm24, kShadowMapSize, kShadowMapSize, TextureDesc::TextureUsageBits::Attachment | TextureDesc::TextureUsageBits::Sampled, "Shadow Map"), &ret); IGL_DEBUG_ASSERT(ret.isOk()); IGL_DEBUG_ASSERT(shadowMap_ != nullptr); } // Create shadow framebuffer (depth-only, no color attachment) if (shadowFramebuffer_ == nullptr) { shadowFramebuffer_ = device.createFramebuffer( FramebufferDesc{ .depthAttachment = {.texture = shadowMap_}, }, &ret); IGL_DEBUG_ASSERT(ret.isOk()); IGL_DEBUG_ASSERT(shadowFramebuffer_ != nullptr); } // Create or update main framebuffer if (framebuffer_ == nullptr) { framebuffer_ = device.createFramebuffer( FramebufferDesc{ .colorAttachments = {{.texture = textures.color}}, .depthAttachment = {.texture = textures.depth}, .stencilAttachment = textures.depth && textures.depth->getProperties().hasStencil() ? FramebufferDesc::AttachmentDesc{.texture = textures.depth} : FramebufferDesc::AttachmentDesc{}, }, &ret); IGL_DEBUG_ASSERT(ret.isOk()); IGL_DEBUG_ASSERT(framebuffer_ != nullptr); } else { framebuffer_->updateDrawable(textures); } // Shadow pipeline state (lazy, cached) if (shadowPipelineState_ == nullptr) { shadowPipelineState_ = device.createRenderPipeline( RenderPipelineDesc{ .vertexInputState = vertexInputState_, .shaderStages = shadowShaderStages_, .targetDesc = { .depthAttachmentFormat = shadowMap_->getFormat(), }, .cullMode = igl::CullMode::Back, .frontFaceWinding = igl::WindingMode::CounterClockwise, }, nullptr); IGL_DEBUG_ASSERT(shadowPipelineState_ != nullptr); } // Main pipeline state (lazy, cached) if (pipelineState_ == nullptr) { pipelineState_ = device.createRenderPipeline( RenderPipelineDesc{ .vertexInputState = vertexInputState_, .shaderStages = shaderStages_, .targetDesc = { .colorAttachments = {{.textureFormat = framebuffer_->getColorAttachment(0)->getFormat()}}, .depthAttachmentFormat = framebuffer_->getDepthAttachment()->getFormat(), .stencilAttachmentFormat = framebuffer_->getStencilAttachment() ? framebuffer_->getStencilAttachment()->getFormat() : igl::TextureFormat::Invalid, }, .cullMode = igl::CullMode::Back, .frontFaceWinding = igl::WindingMode::CounterClockwise, .fragmentUnitSamplerMap = {{0, IGL_NAMEHANDLE("shadowMap")}}, }, nullptr); IGL_DEBUG_ASSERT(pipelineState_ != nullptr); } // Create command buffer auto buffer = commandQueue_->createCommandBuffer(CommandBufferDesc{}, nullptr); IGL_DEBUG_ASSERT(buffer != nullptr); auto drawableSurface = framebuffer_->getColorAttachment(0); // ----------------------------------------------------------------------- // Pass 1: Render scene to shadow map (depth-only) with depth bias // ----------------------------------------------------------------------- { const std::shared_ptr commands = buffer->createRenderCommandEncoder(shadowRenderPass_, shadowFramebuffer_); IGL_DEBUG_ASSERT(commands != nullptr); if (commands) { commands->bindVertexBuffer(1, *vertexBuffer_); commands->bindRenderPipelineState(shadowPipelineState_); commands->bindDepthStencilState(depthStencilState_); commands->bindIndexBuffer(*indexBuffer_, IndexFormat::UInt16); // KEY API CALL: Apply depth bias to prevent shadow acne. // depthBias: constant offset added to fragment depth // slopeScale: scales the bias based on the polygon slope relative to the light // clamp: maximum absolute depth bias value (0 = unclamped) commands->setDepthBias(0.005f, 1.5f, 0.0f); commands->drawIndexed(kTotalIndexCount); commands->endEncoding(); } } // ----------------------------------------------------------------------- // Pass 2: Render scene with shadow testing // ----------------------------------------------------------------------- { const std::shared_ptr commands = buffer->createRenderCommandEncoder(renderPass_, framebuffer_); IGL_DEBUG_ASSERT(commands != nullptr); if (commands) { commands->bindVertexBuffer(1, *vertexBuffer_); commands->bindRenderPipelineState(pipelineState_); commands->bindDepthStencilState(depthStencilState_); commands->bindIndexBuffer(*indexBuffer_, IndexFormat::UInt16); // Bind the shadow map texture for shadow testing in the fragment shader commands->bindTexture(0, BindTarget::kFragment, shadowMap_.get()); commands->bindSamplerState(0, BindTarget::kFragment, shadowSampler_.get()); commands->drawIndexed(kTotalIndexCount); commands->endEncoding(); } } IGL_DEBUG_ASSERT(buffer != nullptr); if (shellParams().shouldPresent) { buffer->present(drawableSurface); } IGL_DEBUG_ASSERT(commandQueue_ != nullptr); commandQueue_->submit(*buffer); RenderSession::update(textures); } } // namespace igl::shell ================================================ FILE: shell/renderSessions/DepthBiasSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include #include #include namespace igl::shell { class DepthBiasSession : public RenderSession { public: explicit DepthBiasSession(std::shared_ptr platform) : RenderSession(std::move(platform)) {} void initialize() noexcept override; void update(SurfaceTextures surfaceTextures) noexcept override; private: std::shared_ptr pipelineState_; std::shared_ptr shadowPipelineState_; std::shared_ptr depthStencilState_; std::shared_ptr vertexInputState_; std::shared_ptr shaderStages_; std::shared_ptr shadowShaderStages_; std::shared_ptr vertexBuffer_; std::shared_ptr indexBuffer_; std::shared_ptr shadowMap_; std::shared_ptr shadowSampler_; std::shared_ptr shadowFramebuffer_; RenderPassDesc renderPass_; RenderPassDesc shadowRenderPass_; }; } // namespace igl::shell ================================================ FILE: shell/renderSessions/DrawInstancedSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #if IGL_BACKEND_OPENGL #include #endif namespace igl::shell { namespace { [[maybe_unused]] void stringReplaceAll(std::string& s, const std::string& searchString, const std::string& replaceString) { size_t pos = 0; while ((pos = s.find(searchString, pos)) != std::string::npos) { s.replace(pos, searchString.length(), replaceString); } } const char* getMetalShaderSource() { return R"( #include #include using namespace metal; constant float2 pos[6] = { float2(-0.05f, 0.05f), float2( 0.05f, -0.05f), float2( -0.05f, -0.05f), float2(-0.05f, 0.05f), float2(0.05f, -0.05f), float2(0.05f, 0.05f) }; constant float3 col[6] = { float3(1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 0.0, 1.0), float3(1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 0.0, 1.0) }; struct VertexIn{ float2 offset [[attribute(0)]]; }; struct VertexOut { float4 position [[position]]; float3 uvw; }; vertex VertexOut vertexShader(uint vid [[vertex_id]], constant VertexIn * vertices [[buffer(1)]], VertexIn in [[stage_in]]) { VertexOut out; out.position = float4(pos[vid] + in.offset, 0.0, 1.0); out.uvw = col[vid]; return out; } fragment float4 fragmentShader( VertexOut in[[stage_in]]) { float4 tex = float4(in.uvw,1.0); return tex; } )"; } const char* getVulkanVertexShaderSource() { return R"(#version 460 layout (location=0) in vec2 offset; layout (location=0) out vec3 color; const vec2 pos[6] = vec2[6]( vec2(-0.05f, 0.05f), vec2( 0.05f, -0.05f), vec2( -0.05f, -0.05f), vec2(-0.05f, 0.05f), vec2(0.05f, -0.05f), vec2(0.05f, 0.05f) ); const vec3 col[6] = vec3[6]( vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0), vec3(0.0, 0.0, 1.0), vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0), vec3(0.0, 0.0, 1.0) ); void main() { gl_Position = vec4(pos[gl_VertexIndex] + offset , 0.0, 1.0); color = col[gl_VertexIndex]; } )"; } const char* getVulkanFragmentShaderSource() { return R"(#version 460 precision mediump float; precision highp int; layout (location=0) in vec3 color; layout (location=0) out vec4 out_FragColor; void main() { out_FragColor = vec4(color, 1.0); } )"; } std::unique_ptr getShaderStagesForBackend(IDevice& device) { switch (device.getBackendType()) { case igl::BackendType::Invalid: case igl::BackendType::Custom: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; case igl::BackendType::Vulkan: return igl::ShaderStagesCreator::fromModuleStringInput(device, getVulkanVertexShaderSource(), "main", "", getVulkanFragmentShaderSource(), "main", "", nullptr); return nullptr; // @fb-only // @fb-only // @fb-only case igl::BackendType::Metal: return igl::ShaderStagesCreator::fromLibraryStringInput( device, getMetalShaderSource(), "vertexShader", "fragmentShader", "", nullptr); case igl::BackendType::OpenGL: { #if IGL_BACKEND_OPENGL auto glVersion = static_cast(device).getContext().deviceFeatures().getGLVersion(); if (glVersion > igl::opengl::GLVersion::v2_1) { auto usesOpenGLES = igl::opengl::DeviceFeatureSet::usesOpenGLES(); std::string codeVS(getVulkanVertexShaderSource()); stringReplaceAll(codeVS, "gl_VertexIndex", "gl_VertexID"); stringReplaceAll(codeVS, "460", usesOpenGLES ? "300 es" : "410"); std::string codeFS(getVulkanFragmentShaderSource()); stringReplaceAll(codeFS, "460", usesOpenGLES ? "300 es" : "410"); if (usesOpenGLES) { stringReplaceAll(codeVS, "layout (location=0) out", "out"); stringReplaceAll(codeFS, "layout (location=0) out", "out"); stringReplaceAll(codeFS, "layout (location=0) in", "in"); } return igl::ShaderStagesCreator::fromModuleStringInput( device, codeVS.c_str(), "main", "", codeFS.c_str(), "main", "", nullptr); } else { IGL_DEBUG_ABORT("This sample is incompatible with OpenGL 2.1"); return nullptr; } #else return nullptr; #endif // IGL_BACKEND_OPENGL } case igl::BackendType::D3D12: { // D3D12 instanced drawing shader // Note: D3D12 clip space Y is flipped vs Vulkan, so we negate Y to match Vulkan behavior static const char* kVS = R"( static const float2 pos[6] = { float2(-0.05f, 0.05f), float2( 0.05f, -0.05f), float2(-0.05f, -0.05f), float2(-0.05f, 0.05f), float2( 0.05f, -0.05f), float2( 0.05f, 0.05f) }; static const float3 col[6] = { float3(1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 0.0, 1.0), float3(1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 0.0, 1.0) }; struct VSIn { float2 offset : TEXCOORD0; }; struct VSOut { float4 position : SV_POSITION; float3 color : TEXCOORD0; }; VSOut main(VSIn v, uint vid : SV_VertexID) { VSOut o; float2 p = pos[vid] + v.offset; o.position = float4(p.x, -p.y, 0.0, 1.0); // Flip Y for D3D12 clip space o.color = col[vid]; return o; } )"; static const char* kPS = R"( struct PSIn { float4 position : SV_POSITION; float3 color : TEXCOORD0; }; float4 main(PSIn i) : SV_TARGET { return float4(i.color, 1.0); } )"; return igl::ShaderStagesCreator::fromModuleStringInput( device, kVS, "main", "", kPS, "main", "", nullptr); } } IGL_UNREACHABLE_RETURN(nullptr) } } // namespace void DrawInstancedSession::initialize() noexcept { // Command queue: backed by different types of GPU HW queues commandQueue_ = getPlatform().getDevice().createCommandQueue({}, nullptr); renderPass_.colorAttachments = {{ .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, .clearColor = getPreferredClearColor(), }}; renderPass_.depthAttachment = {.loadAction = LoadAction::DontCare}; // Create Index Buffer const int16_t indexes[6] = {0, 1, 2, 3, 4, 5}; indexBuffer_ = getPlatform().getDevice().createBuffer( BufferDesc{ .type = BufferDesc::BufferTypeBits::Index, .data = &indexes, .length = sizeof(indexes)}, nullptr); IGL_DEBUG_ASSERT(indexBuffer_); } void DrawInstancedSession::update(SurfaceTextures surfaceTextures) noexcept { const auto dimensions = surfaceTextures.color->getDimensions(); framebuffer_ = getPlatform().getDevice().createFramebuffer( FramebufferDesc{.colorAttachments = {{.texture = surfaceTextures.color}}}, nullptr); IGL_DEBUG_ASSERT(framebuffer_); if (!renderPipelineStateTriangle_) { const VertexInputStateDesc inputDesc = { .numAttributes = 1, .attributes = { { .bufferIndex = 1, .format = VertexAttributeFormat::Float2, .offset = 0, .name = "offset", .location = 0, }, }, .numInputBindings = 1, .inputBindings = { {}, { .stride = sizeof(float) * 2, .sampleFunction = igl::VertexSampleFunction::Instance, }, }, }; auto vertexInput0 = getPlatform().getDevice().createVertexInputState(inputDesc, nullptr); IGL_DEBUG_ASSERT(vertexInput0 != nullptr); const RenderPipelineDesc desc = { .vertexInputState = vertexInput0, .shaderStages = getShaderStagesForBackend(getPlatform().getDevice()), .targetDesc = { .colorAttachments = { { .textureFormat = framebuffer_->getColorAttachment(0) ? framebuffer_->getColorAttachment(0)->getProperties().format : TextureFormat::Invalid, }, }, .depthAttachmentFormat = framebuffer_->getDepthAttachment() ? framebuffer_->getDepthAttachment()->getProperties().format : TextureFormat::Invalid, }, }; renderPipelineStateTriangle_ = getPlatform().getDevice().createRenderPipeline(desc, nullptr); IGL_DEBUG_ASSERT(renderPipelineStateTriangle_); } if (!vertexBuffer_) { glm::vec2 translations[100]; int index = 0; const float offset = 0.1f; for (int y = -10; y < 10; y += 2) { for (int x = -10; x < 10; x += 2) { glm::vec2 translation; translation.x = (float)x / 10.0f + offset; translation.y = (float)y / 10.0f + offset; translations[index++] = translation; } } vertexBuffer_ = getPlatform().getDevice().createBuffer( BufferDesc{.type = BufferDesc::BufferTypeBits::Vertex, .data = translations, .length = sizeof(glm::vec2) * 100}, nullptr); IGL_DEBUG_ASSERT(vertexBuffer_); } framebuffer_->updateDrawable(surfaceTextures.color); // Command buffers (1-N per thread): create, submit and forget const std::shared_ptr buffer = commandQueue_->createCommandBuffer({}, nullptr); const igl::Viewport viewport = {.x = 0.0f, .y = 0.0f, .width = (float)dimensions.width, .height = (float)dimensions.height, .minDepth = 0.0f, .maxDepth = +1.0f}; const igl::ScissorRect scissor = { .x = 0, .y = 0, .width = (uint32_t)dimensions.width, .height = (uint32_t)dimensions.height}; // This will clear the framebuffer auto commands = buffer->createRenderCommandEncoder(renderPass_, framebuffer_); commands->bindRenderPipelineState(renderPipelineStateTriangle_); commands->bindViewport(viewport); commands->bindScissorRect(scissor); commands->pushDebugGroupLabel("Render Triangle", Color(1, 0, 0)); commands->bindVertexBuffer(1, *vertexBuffer_); commands->bindIndexBuffer(*indexBuffer_, IndexFormat::UInt16); commands->drawIndexed(6, 100); commands->popDebugGroupLabel(); commands->endEncoding(); if (shellParams().shouldPresent) { buffer->present(surfaceTextures.color); } commandQueue_->submit(*buffer); RenderSession::update(surfaceTextures); } } // namespace igl::shell ================================================ FILE: shell/renderSessions/DrawInstancedSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include #include namespace igl::shell { class DrawInstancedSession : public RenderSession { public: explicit DrawInstancedSession(std::shared_ptr platform) : RenderSession(std::move(platform)) {} void initialize() noexcept override; void update(SurfaceTextures surfaceTextures) noexcept override; private: RenderPassDesc renderPass_; std::shared_ptr renderPipelineStateTriangle_; std::shared_ptr vertexBuffer_; std::shared_ptr indexBuffer_; }; } // namespace igl::shell ================================================ FILE: shell/renderSessions/EmptySession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include namespace igl::shell { void EmptySession::initialize() noexcept { getPlatform().getDevice(); } void EmptySession::update(SurfaceTextures surfaceTextures) noexcept {} } // namespace igl::shell ================================================ FILE: shell/renderSessions/EmptySession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include namespace igl::shell { class EmptySession : public RenderSession { public: explicit EmptySession(std::shared_ptr platform) : RenderSession(std::move(platform)) {} void initialize() noexcept override; void update(SurfaceTextures surfaceTextures) noexcept override; private: }; } // namespace igl::shell ================================================ FILE: shell/renderSessions/FireworksSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @MARK:COVERAGE_EXCLUDE_FILE // Ported from the LightweightVK sample app `008_MeshShaderFireworks.cpp` // (https://github.com/corporateshark/lightweightvk). Uses vertex shader // billboarding with 4 vertices per particle instead of mesh shaders. #include #include #include #include #include #include #include #include #include #if IGL_BACKEND_OPENGL #include #endif // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only namespace igl::shell { namespace { // Uniforms: projection * view matrix (2 entries for single-pass stereo) struct Uniforms { glm::mat4 mvp[2]; }; [[maybe_unused]] glm::mat4 perspectiveAsymmetricFovRH(const igl::shell::Fov& fov, float nearZ, float farZ) { const float tanLeft = tanf(fov.angleLeft); const float tanRight = tanf(fov.angleRight); const float tanDown = tanf(fov.angleDown); const float tanUp = tanf(fov.angleUp); const float tanWidth = tanRight - tanLeft; const float tanHeight = tanUp - tanDown; glm::mat4 mat; mat[0][0] = 2.0f / tanWidth; mat[1][0] = 0.0f; mat[2][0] = (tanRight + tanLeft) / tanWidth; mat[3][0] = 0.0f; mat[0][1] = 0.0f; mat[1][1] = 2.0f / tanHeight; mat[2][1] = (tanUp + tanDown) / tanHeight; mat[3][1] = 0.0f; mat[0][2] = 0.0f; mat[1][2] = 0.0f; mat[2][2] = -(farZ + nearZ) / (farZ - nearZ); mat[3][2] = -2.0f * farZ * nearZ / (farZ - nearZ); mat[0][3] = 0.0f; mat[1][3] = 0.0f; mat[2][3] = -1.0f; mat[3][3] = 0.0f; return mat; } [[maybe_unused]] void stringReplaceAll(std::string& s, const std::string& searchString, const std::string& replaceString) { size_t pos = 0; while ((pos = s.find(searchString, pos)) != std::string::npos) { s.replace(pos, searchString.length(), replaceString); } } // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // normal (builtin, location 2) = per-vertex particle color (RGB), stored in VertexPTN::nor // // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // Each particle is a billboarded quad: 4 vertices, 6 indices. // The vertex shader expands particle center + corner offset into a screen-aligned quad. [[nodiscard]] std::string getVulkanVertexShaderSource(bool stereoRendering) { const std::string prolog = stereoRendering ? R"(#version 460 #extension GL_OVR_multiview2 : require layout(num_views = 2) in; #define VIEW_ID int(gl_ViewID_OVR) )" : R"(#version 460 #define VIEW_ID 0 )"; return prolog + R"( layout (location=0) in vec3 pos; layout (location=1) in vec3 color; layout (location=2) in float flare; layout (location=3) in vec2 corner; layout (set = 1, binding = 0, std140) uniform UniformBlock { mat4 mvp[2]; } ub; layout (location=0) out vec3 vColor; layout (location=1) out vec2 vUV; void main() { vec4 center = ub.mvp[VIEW_ID] * vec4(pos, 1.0); vec2 size = flare > 0.5 ? vec2(0.05, 0.25) : vec2(0.15, 0.15); vec3 col = flare > 0.5 ? 0.5 * color : color; // Billboard offset in clip space vec2 offset = corner * size; gl_Position = center + vec4(offset, 0.0, 0.0); vColor = col; vUV = corner * 0.5 + 0.5; } )"; } const char* getVulkanFragmentShaderSource() { return R"(#version 460 precision mediump float; layout (location=0) in vec3 vColor; layout (location=1) in vec2 vUV; layout (location=0) out vec4 out_FragColor; layout(set = 0, binding = 0) uniform sampler2D particleTex; void main() { float alpha = texture(particleTex, vUV).r; out_FragColor = vec4(vColor * alpha, alpha); } )"; } const char* getMetalShaderSource() { return R"( #include #include using namespace metal; struct Uniforms { float4x4 mvp[2]; }; struct VertexIn { packed_float3 pos; packed_float3 color; float flare; packed_float2 corner; }; struct VertexOut { float4 position [[position]]; float3 color; float2 uv; }; vertex VertexOut vertexShader( uint vid [[vertex_id]], constant VertexIn* vertices [[buffer(1)]], constant Uniforms& ub [[buffer(0)]]) { VertexIn v = vertices[vid]; VertexOut out; float3 pos = float3(v.pos); float3 col = float3(v.color); float2 crn = float2(v.corner); float4 center = ub.mvp[0] * float4(pos, 1.0); float2 size = v.flare > 0.5 ? float2(0.05, 0.25) : float2(0.15, 0.15); float3 color = v.flare > 0.5 ? 0.5 * col : col; float2 offset = crn * size; out.position = center + float4(offset, 0.0, 0.0); out.color = color; out.uv = crn * 0.5 + 0.5; return out; } fragment float4 fragmentShader( VertexOut in [[stage_in]], texture2d particleTex [[texture(0)]], sampler linearSampler [[sampler(0)]]) { float alpha = particleTex.sample(linearSampler, in.uv).r; return float4(in.color * alpha, alpha); } )"; } const char* getD3D12VertexShaderSource() { return R"( cbuffer UniformBlock : register(b0) { float4x4 mvp[2]; }; struct VSInput { float3 pos : POSITION; float3 color : COLOR0; float flare : TEXCOORD0; float2 corner : TEXCOORD1; }; struct VSOutput { float4 position : SV_POSITION; float3 color : COLOR0; float2 uv : TEXCOORD0; }; VSOutput main(VSInput input) { VSOutput output; float4 center = mul(mvp[0], float4(input.pos, 1.0)); float2 size = input.flare > 0.5 ? float2(0.05, 0.25) : float2(0.15, 0.15); float3 color = input.flare > 0.5 ? 0.5 * input.color : input.color; float2 offset = input.corner * size; output.position = center + float4(offset.x, -offset.y, 0.0, 0.0); output.color = color; output.uv = input.corner * 0.5 + 0.5; return output; } )"; } const char* getD3D12FragmentShaderSource() { return R"( Texture2D particleTex : register(t0); SamplerState linearSampler : register(s0); struct PSInput { float4 position : SV_POSITION; float3 color : COLOR0; float2 uv : TEXCOORD0; }; float4 main(PSInput input) : SV_Target { float alpha = particleTex.Sample(linearSampler, input.uv).r; return float4(input.color * alpha, alpha); } )"; } // Interleaved vertex: particle data + corner offset struct InterleavedVertex { glm::vec3 pos; glm::vec3 color; float flare; glm::vec2 corner; }; const glm::vec2 kCornerOffsets[4] = { {-1.0f, -1.0f}, {+1.0f, -1.0f}, {-1.0f, +1.0f}, {+1.0f, +1.0f}, }; } // namespace // --- Particle --- FireworksSession::ParticleStateMessage FireworksSession::Particle::step(const glm::vec3& gravity) { pos += velocity; velocity += gravity; ttl--; if (fadingOut) { const float t = static_cast(ttl) / static_cast(initialLifetime); currentColor = baseColor * std::max(t, 0.0f); } if (ttl < 0) { return ParticleStateMessage::Kill; } return emission ? ParticleStateMessage::Emission : ParticleStateMessage::None; } // --- ParticleSystem --- void FireworksSession::ParticleSystem::nextFrame(const glm::vec3& gravity, const glm::vec3& viewerPos, std::mt19937& rng) { std::uniform_real_distribution dist01(0.0f, 1.0f); int32_t processedParticles = 0; for (int32_t i = 0; i < kMaxParticles; i++) { if (particles[i].alive) { processedParticles++; switch (particles[i].step(gravity)) { case ParticleStateMessage::None: break; case ParticleStateMessage::Kill: if (particles[i].spawnExplosion) { addExplosion(particles[i].pos, viewerPos, rng); } particles[i].alive = false; totalParticles--; break; case ParticleStateMessage::Emission: { Particle trail; trail.pos = particles[i].pos; trail.velocity = particles[i].velocity * (dist01(rng) * 0.8f + 0.1f); trail.baseColor = particles[i].currentColor * 0.9f; trail.currentColor = trail.baseColor; trail.ttl = particles[i].ttl >> 2; trail.initialLifetime = std::max(trail.ttl, 1); trail.alive = true; trail.fadingOut = true; addParticle(trail); break; } } } else if (queuedParticles > 0) { particles[i] = particlesStack[--queuedParticles]; totalParticles++; } else if (processedParticles >= totalParticles) { return; } } } void FireworksSession::ParticleSystem::addParticle(const Particle& particle) { if (queuedParticles < kMaxParticles) { particlesStack[queuedParticles++] = particle; } } void FireworksSession::ParticleSystem::addExplosion(const glm::vec3& pos, const glm::vec3& viewerPos, std::mt19937& rng) { const glm::vec3 palette[3] = { {0.15f, 0.2f, 1.0f}, {1.0f, 0.15f, 0.2f}, {0.1f, 1.0f, 0.15f}, }; // Build an orthonormal basis for the explosion plane perpendicular to the view direction const glm::vec3 toViewer = viewerPos - pos; const float dist = glm::length(toViewer); // Fallback axes if viewer is at the explosion center glm::vec3 right(1.0f, 0.0f, 0.0f); glm::vec3 up(0.0f, 1.0f, 0.0f); if (dist > 0.001f) { const glm::vec3 viewDir = toViewer / dist; // Choose a reference vector that isn't parallel to viewDir const glm::vec3 ref = fabsf(viewDir.y) < 0.99f ? glm::vec3(0.0f, 1.0f, 0.0f) : glm::vec3(1.0f, 0.0f, 0.0f); right = glm::normalize(glm::cross(ref, viewDir)); up = glm::cross(viewDir, right); } std::uniform_real_distribution dist01(0.0f, 1.0f); std::uniform_int_distribution palDist(0, 2); const int32_t paletteIndex = palDist(rng); for (int32_t i = 0; i < 300; i++) { const float radius = dist01(rng) / 10.0f; const float angle = dist01(rng) * 2.0f * static_cast(M_PI); const float depthSpread = (dist01(rng) * 100.0f - 50.0f) / 5000.0f; const glm::vec3 vel = radius * cosf(angle) * right + radius * sinf(angle) * up + depthSpread * glm::normalize(toViewer.length() > 0.001f ? toViewer : glm::vec3(0.0f, 0.0f, 1.0f)); const glm::vec3 color = palette[paletteIndex] + glm::vec3(dist01(rng) / 5.0f, dist01(rng) / 5.0f, dist01(rng) / 5.0f); const int32_t lifetime = 90 + static_cast(dist01(rng) * 20.0f); addParticle({ .pos = pos, .velocity = vel, .baseColor = color, .currentColor = color, .ttl = lifetime, .initialLifetime = lifetime, .alive = true, .fadingOut = true, .emission = true, }); } } // --- FireworksSession --- void FireworksSession::generateParticleTexture(std::vector& image) { const auto numPixels = static_cast(kParticleTextureSize) * kParticleTextureSize; // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only image.resize(numPixels); // @fb-only const float center = 0.5f * (kParticleTextureSize - 1); for (int32_t y = 0; y < kParticleTextureSize; y++) { for (int32_t x = 0; x < kParticleTextureSize; x++) { const float dx = static_cast(x) - center; const float dy = static_cast(y) - center; const float dist = sqrtf(dx * dx + dy * dy); const float normalizedDist = dist < center ? dist / center : 1.0f; const float falloff = 1.0f - normalizedDist; const auto value = static_cast(fminf(255.0f, fmaxf(0.0f, falloff * falloff * falloff * 255.0f))); const size_t pixel = static_cast(y) * kParticleTextureSize + x; // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only { image[pixel] = value; } } } } std::unique_ptr FireworksSession::getShaderStagesForBackend(IDevice& device, bool stereoRendering) { switch (device.getBackendType()) { case igl::BackendType::Invalid: case igl::BackendType::Custom: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; case igl::BackendType::Vulkan: { const std::string vsSource = getVulkanVertexShaderSource(stereoRendering); return igl::ShaderStagesCreator::fromModuleStringInput( device, vsSource.c_str(), "main", "", getVulkanFragmentShaderSource(), "main", "", nullptr); } // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only case igl::BackendType::Metal: return igl::ShaderStagesCreator::fromLibraryStringInput( device, getMetalShaderSource(), "vertexShader", "fragmentShader", "", nullptr); case igl::BackendType::D3D12: return igl::ShaderStagesCreator::fromModuleStringInput(device, getD3D12VertexShaderSource(), "main", "", getD3D12FragmentShaderSource(), "main", "", nullptr); case igl::BackendType::OpenGL: { #if IGL_BACKEND_OPENGL auto glVersion = static_cast(device).getContext().deviceFeatures().getGLVersion(); if (glVersion <= igl::opengl::GLVersion::v2_1) { // GLSL 120: attribute/varying, plain uniforms, texture2D const char* vs120 = R"(#version 120 attribute vec3 pos; attribute vec3 color; attribute float flare; attribute vec2 corner; uniform mat4 mvp[2]; varying vec3 vColor; varying vec2 vUV; void main() { vec4 center = mvp[0] * vec4(pos, 1.0); vec2 size = flare > 0.5 ? vec2(0.05, 0.25) : vec2(0.15, 0.15); vec3 col = flare > 0.5 ? 0.5 * color : color; vec2 offset = corner * size; gl_Position = center + vec4(offset, 0.0, 0.0); vColor = col; vUV = corner * 0.5 + 0.5; } )"; const char* fs120 = R"(#version 120 varying vec3 vColor; varying vec2 vUV; uniform sampler2D particleTex; void main() { float alpha = texture2D(particleTex, vUV).r; gl_FragColor = vec4(vColor * alpha, alpha); } )"; return igl::ShaderStagesCreator::fromModuleStringInput( device, vs120, "main", "", fs120, "main", "", nullptr); } auto usesOpenGLES = igl::opengl::DeviceFeatureSet::usesOpenGLES(); std::string codeVS(getVulkanVertexShaderSource(false)); stringReplaceAll(codeVS, "gl_VertexIndex", "gl_VertexID"); stringReplaceAll(codeVS, "#version 460", usesOpenGLES ? "#version 300 es" : "#version 410"); stringReplaceAll(codeVS, "layout (set = 1, binding = 0, std140) uniform UniformBlock", "layout (std140) uniform UniformBlock"); std::string codeFS(getVulkanFragmentShaderSource()); stringReplaceAll(codeFS, "#version 460", usesOpenGLES ? "#version 300 es" : "#version 410"); stringReplaceAll(codeFS, "precision mediump float;\n", ""); stringReplaceAll(codeFS, "layout(set = 0, binding = 0) uniform", "uniform"); return igl::ShaderStagesCreator::fromModuleStringInput( device, codeVS.c_str(), "main", "", codeFS.c_str(), "main", "", nullptr); #else return nullptr; #endif // IGL_BACKEND_OPENGL } } IGL_UNREACHABLE_RETURN(nullptr) } void FireworksSession::initialize() noexcept { auto& device = getPlatform().getDevice(); // Enable passthrough so the background is transparent, dimmed to 0.2 appParamsRef().passthroughGetter = []() { return true; }; appParamsRef().passthroughOpacity = 0.2f; // Allocate particle system on the heap particleSystem_ = std::make_unique(); commandQueue_ = device.createCommandQueue({}, nullptr); IGL_DEBUG_ASSERT(commandQueue_ != nullptr); renderPass_.colorAttachments = {{ .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, .clearColor = {0.0f, 0.0f, 0.0f, 1.0f}, }}; renderPass_.depthAttachment = {.loadAction = LoadAction::DontCare}; // Particle texture std::vector texData; generateParticleTexture(texData); // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only const auto texFormat = TextureFormat::R_UNorm8; // @fb-only const TextureDesc texDesc = TextureDesc::new2D(texFormat, kParticleTextureSize, kParticleTextureSize, TextureDesc::TextureUsageBits::Sampled, "Particle Texture"); particleTexture_ = device.createTexture(texDesc, nullptr); IGL_DEBUG_ASSERT(particleTexture_ != nullptr); particleTexture_->upload( TextureRangeDesc::new2D(0, 0, kParticleTextureSize, kParticleTextureSize), texData.data()); sampler_ = device.createSamplerState( SamplerStateDesc{ .minFilter = SamplerMinMagFilter::Linear, .magFilter = SamplerMinMagFilter::Linear, .debugName = "Sampler: linear", }, nullptr); IGL_DEBUG_ASSERT(sampler_ != nullptr); // Uniform buffer const Uniforms uniforms{.mvp = {glm::mat4(1.0f), glm::mat4(1.0f)}}; uniformBuffer_ = device.createBuffer( { .type = BufferDesc::BufferTypeBits::Uniform, .data = &uniforms, .length = sizeof(Uniforms), .storage = ResourceStorage::Shared, .hint = BufferDesc::BufferAPIHintBits::UniformBlock, .debugName = "fireworks_uniforms", }, nullptr); IGL_DEBUG_ASSERT(uniformBuffer_ != nullptr); // Pre-allocate vertex buffer for max particles * 4 vertices const size_t maxVerts = static_cast(kMaxParticles) * 4; // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only const auto vbStorage = ResourceStorage::Shared; const size_t vertexStride = sizeof(InterleavedVertex); const auto ibStorage = ResourceStorage::Shared; // @fb-only vertexBuffer_ = device.createBuffer( { .type = BufferDesc::BufferTypeBits::Vertex, .length = maxVerts * vertexStride, .storage = vbStorage, .debugName = "fireworks_vertices", }, nullptr); IGL_DEBUG_ASSERT(vertexBuffer_ != nullptr); // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // Pre-allocate index buffer (uint16: max vertices = 16384*4 = 65536 <= 65536) const size_t maxIndices = static_cast(kMaxParticles) * 6; std::vector indices(maxIndices); for (int32_t i = 0; i < kMaxParticles; i++) { const uint16_t base = static_cast(i) * 4; const size_t idx = static_cast(i) * 6; indices[idx + 0] = base + 0; indices[idx + 1] = base + 1; indices[idx + 2] = base + 2; indices[idx + 3] = base + 1; indices[idx + 4] = base + 3; indices[idx + 5] = base + 2; } indexBuffer_ = device.createBuffer( { .type = BufferDesc::BufferTypeBits::Index, .data = indices.data(), .length = maxIndices * sizeof(uint16_t), .storage = ibStorage, .debugName = "fireworks_indices", }, nullptr); IGL_DEBUG_ASSERT(indexBuffer_ != nullptr); gpuVertices_.reserve(static_cast(kMaxParticles)); } void FireworksSession::update(SurfaceTextures surfaceTextures) noexcept { if (!surfaceTextures.color) { return; } auto& device = getPlatform().getDevice(); const auto dimensions = surfaceTextures.color->getDimensions(); // Detect single-pass stereo: viewParams has 2 entries and surface texture is a 2-layer array const bool useStereo = shellParams().shellControlsViewParams && shellParams().viewParams.size() > 1 && surfaceTextures.color->getNumLayers() > 1; // Create/update framebuffer if (framebuffer_ == nullptr) { const auto mode = useStereo ? FramebufferMode::Stereo : FramebufferMode::Mono; framebuffer_ = device.createFramebuffer( FramebufferDesc{ .colorAttachments = {{.texture = surfaceTextures.color}}, .mode = mode, }, nullptr); IGL_DEBUG_ASSERT(framebuffer_ != nullptr); } else { framebuffer_->updateDrawable(surfaceTextures.color); } // Create pipeline on first use if (!renderPipelineState_) { auto shaderStages = getShaderStagesForBackend(device, useStereo); if (!shaderStages) { return; } // @fb-only // @fb-only // @fb-only // @fb-only const uint32_t vbIndex = 1u; // @fb-only VertexInputStateDesc inputDesc = { .numAttributes = 4, .attributes = { { .bufferIndex = vbIndex, .format = VertexAttributeFormat::Float3, .offset = offsetof(InterleavedVertex, pos), .name = "pos", .location = 0, }, { .bufferIndex = vbIndex, .format = VertexAttributeFormat::Float3, .offset = offsetof(InterleavedVertex, color), .name = "color", .location = 1, }, { .bufferIndex = vbIndex, .format = VertexAttributeFormat::Float1, .offset = offsetof(InterleavedVertex, flare), .name = "flare", .location = 2, }, { .bufferIndex = vbIndex, .format = VertexAttributeFormat::Float2, .offset = offsetof(InterleavedVertex, corner), .name = "corner", .location = 3, }, }, .numInputBindings = 1, }; // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only { inputDesc.inputBindings[vbIndex].stride = sizeof(InterleavedVertex); } vertexInput_ = device.createVertexInputState(inputDesc, nullptr); IGL_DEBUG_ASSERT(vertexInput_ != nullptr); const RenderPipelineDesc pipelineDesc = { .vertexInputState = vertexInput_, .shaderStages = std::move(shaderStages), .targetDesc = { .colorAttachments = {{ .textureFormat = framebuffer_->getColorAttachment(0) ? framebuffer_->getColorAttachment(0)->getProperties().format : TextureFormat::Invalid, .blendEnabled = true, .rgbBlendOp = BlendOp::Add, .alphaBlendOp = BlendOp::Add, .srcRGBBlendFactor = BlendFactor::SrcAlpha, .srcAlphaBlendFactor = BlendFactor::SrcAlpha, .dstRGBBlendFactor = BlendFactor::One, .dstAlphaBlendFactor = BlendFactor::One, }}, }, .cullMode = igl::CullMode::Disabled, .fragmentUnitSamplerMap = {{0, IGL_NAMEHANDLE("particleTex")}}, }; renderPipelineState_ = device.createRenderPipeline(pipelineDesc, nullptr); IGL_DEBUG_ASSERT(renderPipelineState_ != nullptr); } // Update uniforms: build per-eye MVP matrices const float aspectRatio = static_cast(dimensions.width) / static_cast(dimensions.height); // Scene offset: place particle origin 8m in front of the viewer const glm::mat4 sceneOffset = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -8.0f)); const glm::mat4 monoProj = glm::perspective(glm::radians(90.0f), aspectRatio, 0.1f, 100.0f); Uniforms uniforms{}; if (useStereo) { // Anchor the scene in world space on the first stereo frame: // compute a model matrix that places the fireworks 8m in front of the initial head pose. if (!sceneAnchored_) { const glm::mat4 headPose = glm::inverse(shellParams().viewParams[0].viewMatrix); sceneModelMatrix_ = headPose * sceneOffset; sceneAnchored_ = true; } // Single-pass stereo: fill both MVP matrices from shell-provided view params for (size_t i = 0; i < std::min(shellParams().viewParams.size(), size_t(2)); ++i) { const auto viewIdx = shellParams().viewParams[i].viewIndex; const glm::mat4 proj = perspectiveAsymmetricFovRH(shellParams().viewParams[i].fov, 0.1f, 100.0f); uniforms.mvp[viewIdx] = proj * shellParams().viewParams[i].viewMatrix * sceneModelMatrix_; } } else { uniforms.mvp[0] = monoProj * sceneOffset; uniforms.mvp[1] = uniforms.mvp[0]; } // Compute head position and forward direction in scene-local space so // new rockets launch in front of wherever the user is currently looking, // and explosions orient toward the viewer. // In scene-local space, the initial head is at (0, 0, 8) looking toward -Z. // Fireworks originally launch 8 units ahead at (spreadX, -5, 0). glm::vec3 viewerLocalPos(0.0f, 0.0f, 8.0f); // default: initial head position glm::vec2 launchCenter(0.0f, 0.0f); // XZ center of launch area glm::vec2 launchPerp(1.0f, 0.0f); // perpendicular spread direction if (useStereo && sceneAnchored_) { const glm::mat4 invScene = glm::inverse(sceneModelMatrix_); const glm::mat4 headPose = glm::inverse(shellParams().viewParams[0].viewMatrix); // Head position in scene-local space viewerLocalPos = glm::vec3(invScene * headPose[3]); // Head forward direction in scene-local XZ plane const glm::vec3 fwd3 = glm::vec3(invScene * headPose * glm::vec4(0.0f, 0.0f, -1.0f, 0.0f)); const glm::vec2 fwd(fwd3.x, fwd3.z); const float fwdLen = glm::length(fwd); if (fwdLen > 0.001f) { const glm::vec2 fwdNorm = fwd / fwdLen; // Launch center: 8 units ahead of head in XZ launchCenter = glm::vec2(viewerLocalPos.x, viewerLocalPos.z) + fwdNorm * 8.0f; // Spread direction: perpendicular to forward in XZ launchPerp = glm::vec2(-fwdNorm.y, fwdNorm.x); } } // Simulate particles (single-pass: update() called once per frame) { const float deltaSeconds = getDeltaSeconds(); const glm::vec3 gravity(0.0f, -0.001f, 0.0f); accTime_ += deltaSeconds; while (accTime_ >= kTimeQuantum) { accTime_ -= kTimeQuantum; particleSystem_->nextFrame(gravity, viewerLocalPos, rng_); // Randomly shoot new fireworks in front of the user std::uniform_real_distribution dist01(0.0f, 1.0f); if (dist01(rng_) * 150.0f <= 1.0f) { const glm::vec3 baseColor(0.8f, 0.9f, 1.0f); const float spread = (dist01(rng_) * 100.0f - 50.0f) / 10.0f; const glm::vec2 launchXZ = launchCenter + launchPerp * spread; particleSystem_->addParticle({ .pos = glm::vec3(launchXZ.x, -5.0f, launchXZ.y), .velocity = glm::vec3((dist01(rng_) * 100.0f - 50.0f) / 500.0f, 0.25f + dist01(rng_) * 0.4f, (dist01(rng_) * 100.0f - 50.0f) / 500.0f), .baseColor = baseColor, .currentColor = baseColor, .ttl = 20, .initialLifetime = 20, .alive = true, .flare = true, .spawnExplosion = true, }); } } } // Build vertex data (4 vertices per particle). size_t numParticles = 0; // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // clang-format off // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // clang-format on // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only { // Collect alive particles into GPU vertex data gpuVertices_.clear(); for (int32_t i = 0; i < kMaxParticles; i++) { if (particleSystem_->particles[i].alive) { const auto& p = particleSystem_->particles[i]; gpuVertices_.push_back({ .pos = p.pos, .color = p.currentColor, .flare = p.flare ? 1.0f : 0.0f, }); } } numParticles = gpuVertices_.size(); std::vector interleavedVerts; interleavedVerts.reserve(numParticles * 4); for (size_t i = 0; i < numParticles; i++) { const auto& gv = gpuVertices_[i]; for (auto kCornerOffset : kCornerOffsets) { interleavedVerts.push_back({ .pos = gv.pos, .color = gv.color, .flare = gv.flare, .corner = kCornerOffset, }); } } if (!interleavedVerts.empty()) { vertexBuffer_->upload(interleavedVerts.data(), BufferRange(interleavedVerts.size() * sizeof(InterleavedVertex), 0)); } } // @fb-only // @fb-only // @fb-only // @fb-only { uniformBuffer_->upload(&uniforms, BufferRange(sizeof(Uniforms), 0)); } // Use shell-provided clear color (transparent for passthrough, black otherwise) if (shellParams().clearColorValue.has_value()) { const auto& c = shellParams().clearColorValue.value(); renderPass_.colorAttachments[0].clearColor = {c.r, c.g, c.b, c.a}; } // Render const auto buffer = commandQueue_->createCommandBuffer({}, nullptr); IGL_DEBUG_ASSERT(buffer != nullptr); const igl::Viewport viewport = {0.0f, 0.0f, static_cast(dimensions.width), static_cast(dimensions.height), 0.0f, +1.0f}; const igl::ScissorRect scissor = { 0, 0, static_cast(dimensions.width), static_cast(dimensions.height)}; auto commands = buffer->createRenderCommandEncoder(renderPass_, framebuffer_); IGL_DEBUG_ASSERT(commands != nullptr); if (commands) { commands->bindRenderPipelineState(renderPipelineState_); commands->bindViewport(viewport); commands->bindScissorRect(scissor); commands->pushDebugGroupLabel("Fireworks", Color(1, 0.5f, 0)); // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only { commands->bindVertexBuffer(1, *vertexBuffer_); if (device.hasFeature(DeviceFeatures::UniformBlocks)) { commands->bindBuffer(0, uniformBuffer_.get()); } else if (device.hasFeature(DeviceFeatures::BindUniform)) { const UniformDesc mvpDesc = { .location = renderPipelineState_->getIndexByName("mvp", ShaderStage::Vertex), .type = UniformType::Mat4x4, .numElements = 2, .offset = offsetof(Uniforms, mvp), }; commands->bindUniform(mvpDesc, &uniforms); } } commands->bindTexture(0, BindTarget::kFragment, particleTexture_.get()); commands->bindSamplerState(0, BindTarget::kFragment, sampler_.get()); commands->bindIndexBuffer(*indexBuffer_, IndexFormat::UInt16); if (numParticles > 0) { commands->drawIndexed(numParticles * 6); } commands->popDebugGroupLabel(); commands->endEncoding(); } if (shellParams().shouldPresent) { buffer->present(surfaceTextures.color); } commandQueue_->submit(*buffer); RenderSession::update(surfaceTextures); } } // namespace igl::shell ================================================ FILE: shell/renderSessions/FireworksSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @MARK:COVERAGE_EXCLUDE_FILE // Ported from the LightweightVK sample app `008_MeshShaderFireworks.cpp` // (https://github.com/corporateshark/lightweightvk). Uses vertex shader // billboarding with 4 vertices per particle instead of mesh shaders. #pragma once #include #include #include #include #include #include #include namespace igl::shell { class FireworksSession : public RenderSession { public: explicit FireworksSession(std::shared_ptr platform) : RenderSession(std::move(platform)) {} void initialize() noexcept override; void update(SurfaceTextures surfaceTextures) noexcept override; private: // @fb-only // @fb-only // @fb-only static constexpr int32_t kMaxParticles = 16384; // @fb-only static constexpr int32_t kParticleTextureSize = 64; enum class ParticleStateMessage : uint8_t { None = 0, Kill = 1, Emission = 2, }; struct Particle { glm::vec3 pos{0.0f}; glm::vec3 velocity{0.0f}; glm::vec3 baseColor{0.0f}; glm::vec3 currentColor{0.0f}; int32_t ttl{0}; int32_t initialLifetime{1}; bool alive{false}; bool flare{false}; bool spawnExplosion{false}; bool fadingOut{false}; bool emission{false}; ParticleStateMessage step(const glm::vec3& gravity); }; struct ParticleSystem { std::vector particles; std::vector particlesStack; int32_t totalParticles{0}; int32_t queuedParticles{0}; ParticleSystem() : particles(kMaxParticles), particlesStack(kMaxParticles) {} void nextFrame(const glm::vec3& gravity, const glm::vec3& viewerPos, std::mt19937& rng); void addParticle(const Particle& particle); void addExplosion(const glm::vec3& pos, const glm::vec3& viewerPos, std::mt19937& rng); }; struct GpuVertex { glm::vec3 pos; glm::vec3 color; float flare{0.0f}; }; std::unique_ptr getShaderStagesForBackend(IDevice& device, bool stereoRendering); void generateParticleTexture(std::vector& image); RenderPassDesc renderPass_; std::shared_ptr renderPipelineState_; std::shared_ptr vertexInput_; std::shared_ptr vertexBuffer_; std::shared_ptr indexBuffer_; std::shared_ptr particleTexture_; std::shared_ptr sampler_; std::shared_ptr uniformBuffer_; std::unique_ptr particleSystem_; std::vector gpuVertices_; // @fb-only // @fb-only // @fb-only std::mt19937 rng_{42}; double accTime_{0.0}; glm::mat4 sceneModelMatrix_{1.0f}; bool sceneAnchored_{false}; static constexpr float kTimeQuantum = 0.02f; }; } // namespace igl::shell ================================================ FILE: shell/renderSessions/GPUStressSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace { uint32_t customArc4random() { return static_cast(rand()) * (0xffffffff / RAND_MAX); } } // namespace #if IGL_PLATFORM_ANDROID #include #include #endif namespace igl::shell { namespace { constexpr uint32_t kMsaaSamples = 4u; // this is the max number possible constexpr float kScaleFill = 1.f; constexpr float kHalf = .5f; } // namespace GPUStressSession::GPUStressSession(std::shared_ptr platform) : RenderSession(std::move(platform)), fps_(false), vertexData0_{ VertexPosUvw{.position = {-kHalf, kHalf, -kHalf}, .uvw = {0.0, 1.0, 0.0, 1.0}, .baseColor = {1.0, 1.0, 1.0, 1.0}}, VertexPosUvw{.position = {kHalf, kHalf, -kHalf}, .uvw = {1.0, 1.0, 1.0, 1.0}, .baseColor = {1.0, 1.0, 1.0, 1.0}}, VertexPosUvw{.position = {-kHalf, -kHalf, -kHalf}, .uvw = {0.0, 0.0, 0.0, 0.0}, .baseColor = {1.0, 1.0, 1.0, 1.0}}, VertexPosUvw{.position = {kHalf, -kHalf, -kHalf}, .uvw = {1.0, 0.0, 1.0, 0.0}, .baseColor = {1.0, 1.0, 1.0, 1.0}}, VertexPosUvw{.position = {kHalf, kHalf, kHalf}, .uvw = {1.0, 1.0, 1.0, 1.0}, .baseColor = {1.0, 1.0, 1.0, 1.0}}, VertexPosUvw{.position = {-kHalf, kHalf, kHalf}, .uvw = {0.0, 1.0, 0.0, 1.0}, .baseColor = {1.0, 1.0, 1.0, 1.0}}, VertexPosUvw{.position = {kHalf, -kHalf, kHalf}, .uvw = {1.0, 0.0, 1.0, 0.0}, .baseColor = {1.0, 1.0, 1.0, 1.0}}, VertexPosUvw{.position = {-kHalf, -kHalf, kHalf}, .uvw = {0.0, 0.0, 0.0, 0.0}, .baseColor = {1.0, 1.0, 1.0, 1.0}}, }, indexData0_{0, 1, 2, 1, 3, 2, 1, 4, 3, 4, 6, 3, 4, 5, 6, 5, 7, 6, 5, 0, 7, 0, 2, 7, 5, 4, 0, 4, 1, 0, 2, 3, 7, 3, 6, 7}, indexData_{indexData0_.begin(), indexData0_.end()} {}; namespace { // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) std::string getLightingFunc(const char* matrixProj, const char* matrixMod) { const std::string var1 = matrixProj; const std::string var2 = matrixMod; auto func = std::string( R"( vec3 calcLighting(vec3 lightDir, vec3 lightPosition, vec3 normal, float attenuation, vec3 color) { normal.xyz = ()" + var1 + "*" + var2 + R"(* vec4(normal, 0.f)).xyz; normal = normalize(normal); float angle = dot(normalize(lightDir), normal); float distance = length(lightPosition - screen_pos); float intensity = smoothstep(attenuation, 0.f, distance); intensity = clamp(intensity, 0.0, 1.0); return intensity * color * angle; } )"); return func; } } // namespace std::string GPUStressSession::getLightingCalc() const { std::string params = "\nvec4 lightFactor = color;\n"; if (lightCount_) { params = "\nvec4 lightFactor = vec4(0.2, 0.2, 0.2, 1.0);\n"; } for (int i = 0; i < lightCount_; ++i) { char tmp[256]; snprintf(tmp, sizeof(tmp), "const vec3 lightColor%d = vec3(%f, %f, %f);\n", i, i % 3 == 0 ? 1.0 : static_cast(customArc4random() % 32) / 32.f, i % 3 == 1 ? 1.0 : static_cast(customArc4random() % 32) / 32.f, i % 3 == 2 ? 1.0 : static_cast(customArc4random() % 32) / 32.f); params += tmp; snprintf(tmp, sizeof(tmp), "const vec3 lightPos%d = vec3(%f, %f, %f);\n", i, -1.f + static_cast(customArc4random() % 32) / 16.f, -1.f + static_cast(customArc4random() % 32) / 16.f, -1.f + static_cast(customArc4random() % 32) / 16.f); params += tmp; snprintf( tmp, sizeof(tmp), "lightFactor.xyz += calcLighting(-lightPos%d, lightPos%d, color.xyz, 1.0, lightColor%d);\n", i, i, i); params += tmp; } return params; } namespace { std::string getVulkanVertexShaderSource(bool multiView) { return std::string(multiView ? "\n#define MULTIVIEW 1\n" : "") + R"( #ifdef MULTIVIEW #extension GL_EXT_multiview : enable #endif layout(location = 0) in vec3 position; layout(location = 1) in vec4 uvw_in; layout(location = 2) in vec4 base_color; layout (location = 0) out vec4 color; layout (location = 1) out vec4 uv; layout (location = 2) out vec3 screen_pos; layout(push_constant) uniform PushConstants { mat4 projectionMatrix; mat4 modelViewMatrix; } pc; out gl_PerVertex { vec4 gl_Position; }; void main() { #ifdef MULTIVIEW color = vec4(base_color.x, abs(float(gl_ViewIndex)-1.f) * base_color.y, base_color.z, base_color.w); #elif color = base_color; #endif uv = uvw_in; gl_Position = pc.projectionMatrix * pc.modelViewMatrix * vec4(position.xyz, 1.0); screen_pos = gl_Position.xyz/gl_Position.w; })"; } } // namespace std::string GPUStressSession::getVulkanFragmentShaderSource() const { return R"( layout(location = 0) out vec4 fColor; layout(location = 0) in vec4 color; layout(location = 1) in vec4 uv; layout(location = 2) in vec3 screen_pos; layout (set = 0, binding = 0) uniform sampler2D uTex; layout (set = 0, binding = 1) uniform sampler2D uTex2; layout(push_constant) uniform PushConstants { mat4 projectionMatrix; mat4 modelViewMatrix; } pc; )" + getLightingFunc("pc.projectionMatrix", "pc.modelViewMatrix") + R"( void main() {)" + getLightingCalc() + R"( fColor = lightFactor * texture(uTex2, uv.xy) * texture(uTex, uv.zw); })"; } std::unique_ptr GPUStressSession::getShaderStagesForBackend( IDevice& device) const noexcept { const bool multiView = device.hasFeature(DeviceFeatures::Multiview); switch (device.getBackendType()) { // @fb-only // @fb-only // @fb-only case igl::BackendType::Vulkan: return igl::ShaderStagesCreator::fromModuleStringInput( device, getVulkanVertexShaderSource(multiView).c_str(), "main", "", getVulkanFragmentShaderSource().c_str(), "main", "", nullptr); default: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; } } void GPUStressSession::addNormalsToCube() { if (!lightCount_) { return; } const size_t faceCount = indexData_.size() / 6; bool normalSet[36] = {false}; for (size_t j = 0; j < faceCount; j++) { const size_t offset = j * 6; auto vec1 = vertexData0_.at(indexData_[offset + 1]).position - vertexData0_.at(indexData_[offset + 2]).position; auto vec2 = vertexData0_.at(indexData_[offset + 1]).position - vertexData0_.at(indexData_.at(offset + 0)).position; auto normal = glm::normalize(glm::cross(vec1, vec2)); std::vector indexremap; indexremap.resize(24, -1); for (size_t i = offset; i < offset + 6; i++) { const size_t oldIndex = indexData_[i]; if (indexremap.at(oldIndex) != -1) { indexData_.at(i) = indexremap[oldIndex]; } else if (!normalSet[oldIndex]) { vertexData_.at(oldIndex).baseColor = glm::vec4(normal, 1.0); normalSet[oldIndex] = true; indexremap.at(oldIndex) = oldIndex; } else { auto vertex = vertexData0_.at(oldIndex); vertex.baseColor = glm::vec4(normal, 1.0); vertexData_.push_back(vertex); const size_t nextIndex = (vertexData_.size() - 1); indexData_.at(i) = nextIndex; normalSet[nextIndex] = true; indexremap.at(oldIndex) = nextIndex; } } } } namespace { bool isDeviceCompatible(IDevice& device) noexcept { const auto backendtype = device.getBackendType(); if (backendtype == BackendType::OpenGL) { const auto shaderVersion = device.getShaderVersion(); if (shaderVersion.majorVersion >= 3 || shaderVersion.minorVersion >= 30) { return true; } } if (backendtype == BackendType::Vulkan) { return true; } return false; } int setCurrentThreadAffinityMask(int mask) { #if IGL_PLATFORM_ANDROID int err, syscallres; const pid_t pid = gettid(); syscallres = syscall(__NR_sched_setaffinity, pid, sizeof(mask), &mask); if (syscallres) { err = errno; IGL_LOG_ERROR("Set thread affinity failed. with mask 0x%x and error 0x%x\n", mask, err); return err; } #else IGL_LOG_ERROR("Set thread affinity not supported on this platorm"); return -1; #endif return 0; } double calcPi(int numberOfDivisions, int core) { double pi = 0.0; if (core >= 0) { setCurrentThreadAffinityMask((1 << core)); } for (int i = 0; i <= numberOfDivisions; ++i) { const double numerator = 1.0; const double denominator = std::sqrt(1.0 + std::pow(-1.0, i)); if (denominator > 0.f) { pi += numerator / denominator; } } return pi * 4.0; } } // namespace void GPUStressSession::thrashCPU() noexcept { static std::vector> futures; static unsigned int threadSpawnId = 0; if (goSlowOnCpu_) { // don't fall off the array while (threadIds_.size() < threadCount_) { threadIds_.push_back(-1); } if (!threadCount_) { pi_ = calcPi(goSlowOnCpu_, -1); } while (futures.size() < threadCount_) { auto future = std::async(std::launch::async, [this] { return calcPi(goSlowOnCpu_, threadIds_[threadSpawnId % threadCount_]); }); futures.push_back(std::move(future)); threadSpawnId++; } for (int i = futures.size() - 1; i > -1; i--) { auto& future = futures.at(i); // Use wait_for() with zero milliseconds to check thread status. auto status = future.wait_for(std::chrono::milliseconds(0)); if (status == std::future_status::ready) { pi_ += future.get(); futures.erase(futures.begin() + i); } } } } float GPUStressSession::doReadWrite(std::vector>>& memBlock, // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) int numBlocks, int numRows, int numCols, int threadId) { if (threadId != -1) { setCurrentThreadAffinityMask(1 << threadId); } std::mt19937 gen(0); std::uniform_int_distribution<> randBlocks(0, numBlocks - 1); std::uniform_int_distribution<> randRows(0, numRows - 1); std::uniform_int_distribution<> randCols(0, numCols - 1); float sum = 0.f; for (int i = 0; i < memoryWrites_; i++) { const int block = randBlocks(gen); const int row = randRows(gen); const int col = randCols(gen); memBlock[block].at(row)[col] = customArc4random(); } for (int i = 0; i < memoryReads_; i++) { const int block = randBlocks(gen); const int row = randRows(gen); const int col = randCols(gen); sum += i % 1 ? -1.f : 1.f * memBlock.at(block)[row][col]; } return sum; } void GPUStressSession::allocateMemory() { if (thrashMemory_) { const static size_t kBlocks = memorySize_; const static size_t kRows = 1024; const static size_t kCols = 1024; if (memBlock_.empty()) { memBlock_.resize((kBlocks)); for (auto& block : memBlock_) { block.resize(kRows); for (auto& row : block) { row.resize(kCols, 0); for (int i = 0; i < kCols; i++) { row.at(i) = (i); } } } } } } void GPUStressSession::thrashMemory() noexcept { if (!thrashMemory_) { return; } const static size_t kBlocks = memorySize_; const static size_t kRows = 1024; const static size_t kCols = 1024; if (!threadCount_) { memoryVal_.store(doReadWrite(memBlock_, kBlocks, kRows, kCols, -1)); } else { static std::vector> futures; static int memoryThreadId = 0; while (futures.size() < threadCount_) { auto future = std::async(std::launch::async, [this] { return doReadWrite( memBlock_, kBlocks, kRows, kCols, threadIds_[memoryThreadId % threadCount_]); }); futures.push_back(std::move(future)); memoryThreadId++; } for (int i = futures.size() - 1; i > -1; i--) { auto& future = futures.at(i); // Use wait_for() with zero milliseconds to check thread status. auto status = future.wait_for(std::chrono::milliseconds(0)); if (status == std::future_status::ready) { memoryVal_.store(future.get()); futures.erase(futures.begin() + i); } } } } // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) void GPUStressSession::getOffset(int counter, float& x, float& y, float& z) { if (testOverdraw_) { x = 0.f; y = 0.f; z = counter % 2 ? -kHalf / static_cast(cubeCount_) : kHalf / static_cast(cubeCount_); z *= counter / 2.f; return; } const float grid = std::ceil(std::pow(cubeCount_, 1.0f / 3.0f)); const int igrid = (int)grid; // const float fgrid = static_cast(igrid); x = static_cast((counter % igrid) - grid / 2); z = (static_cast(counter / (igrid * igrid)) - grid / 2.f); y = (static_cast((counter % (igrid * igrid)) / igrid) - grid / 2.f); } glm::vec3 GPUStressSession::animateCube(int counter, float x, float y, float scale, int frameCount) { struct AnimationInfo { glm::vec3 velocity; glm::vec3 lastPos; }; static std::vector animations; if (animations.size() < counter) { AnimationInfo info; info.velocity = glm::vec3(1.f * (counter % 2 ? 1.0 : -1.0), 1.f - (float)(counter % 3), 0.f); info.lastPos = glm::vec3(x, y, 0); animations.push_back(info); } float velocityScale = 1.f; if (dropFrameX_ && (frameCount % dropFrameX_) < dropFrameCount_) { velocityScale = 0.f; } else if (dropFrameX_ && (frameCount % dropFrameX_) == dropFrameCount_) { velocityScale = 1.f + (float)dropFrameCount_; } const glm::vec3 pos = animations[counter].lastPos + animations[counter].velocity * velocityScale * scale * .005f; // check for collisons; const float radius = .75 * scale; if (pos.x + radius > 1.f) { animations[counter].velocity.x = -1.f; } if (pos.x - radius < -1.f) { animations[counter].velocity.x = 1.f; } if (pos.y + radius > 1.f) { animations[counter].velocity.y = -1.f; } if (pos.y - radius < -1.f) { animations[counter].velocity.y = 1.f; } animations[counter].lastPos = pos; return pos; } void GPUStressSession::createSamplerAndTextures(const igl::IDevice& device) { // Sampler & Texture SamplerStateDesc samplerDesc; samplerDesc.minFilter = samplerDesc.magFilter = SamplerMinMagFilter::Linear; samplerDesc.addressModeU = SamplerAddressMode::MirrorRepeat; samplerDesc.addressModeV = SamplerAddressMode::MirrorRepeat; samplerDesc.addressModeW = SamplerAddressMode::MirrorRepeat; samp0_ = device.createSamplerState(samplerDesc, nullptr); samp1_ = device.createSamplerState(samplerDesc, nullptr); tex0_ = getPlatform().loadTexture("macbeth.png"); tex1_ = getPlatform().loadTexture("igl.png"); } void GPUStressSession::createCubes() { // only reset once - on mac we hit this path multiple times for different // devices vertexData_ = vertexData0_; indexData_ = indexData0_; addNormalsToCube(); // setup for lighting if appropriate const float grid = std::ceil(std::pow(cubeCount_, 1.0f / 3.0f)); const int vertexCount = vertexData_.size(); const int indexCount = indexData_.size(); std::mt19937 gen(0); std::uniform_real_distribution<> dis(0, 1.f); const float scale = 1.f / grid; const int uvScale = 1.f / grid; glm::vec2 offset = glm::vec2(0.f, 0.f); // Vertex buffer, Index buffer and Vertex Input for (int i = 1; i < cubeCount_; i++) { float x = NAN, y = NAN, z = NAN; getOffset(i, x, y, z); glm::vec4 color(1.0, 1.0, 1.0, 1.f); color[0] = (dis(gen)); color[1] = (dis(gen)); color[2] = (dis(gen)); for (int j = 0; j < vertexCount; j++) { VertexPosUvw newPoint = vertexData_.at(j); newPoint.position += (glm::vec3(x, y, z)); newPoint.uvw *= glm::vec4(uvScale, uvScale, 1.f, 1.f); newPoint.uvw += glm::vec4(offset.x, offset.y, 0.f, 0.f); if (!lightCount_) { newPoint.baseColor = color; } vertexData_.push_back(newPoint); } for (int j = 0; j < indexCount; j++) { indexData_.push_back(static_cast(indexData_.at(j) + i * (vertexCount))); } offset.x += 1.f / grid; if (offset.x > 1.f) { offset.x = 0.f; offset.y += 1.f / grid; } } if (!testOverdraw_) // we want to fill up the screen here { for (auto& i : vertexData_) { i.position.x *= scale; i.position.y *= scale; i.position.z *= scale; } } auto& device = getPlatform().getDevice(); const BufferDesc vb0Desc{.type = BufferDesc::BufferTypeBits::Vertex, .data = vertexData_.data(), .length = sizeof(VertexPosUvw) * vertexData_.size()}; vb0_ = device.createBuffer(vb0Desc, nullptr); const BufferDesc ibDesc{.type = BufferDesc::BufferTypeBits::Index, .data = indexData_.data(), .length = sizeof(uint16_t) * indexData_.size()}; ib0_ = device.createBuffer(ibDesc, nullptr); VertexInputStateDesc inputDesc = { .numAttributes = 3, .attributes = { {.bufferIndex = 0, .format = VertexAttributeFormat::Float3, .offset = offsetof(VertexPosUvw, position), .name = "position", .location = 0}, {.bufferIndex = 0, .format = VertexAttributeFormat::Float4, .offset = offsetof(VertexPosUvw, uvw), .name = "uvw_in", .location = 1}, {.bufferIndex = 0, .format = VertexAttributeFormat::Float4, .offset = offsetof(VertexPosUvw, baseColor), .name = "base_color", .location = 2}, }, .numInputBindings = 1, .inputBindings = {{.stride = sizeof(VertexPosUvw)}}, }; vertexInput0_ = device.createVertexInputState(inputDesc, nullptr); } void GPUStressSession::processCustomParameter(const std::string& key, const std::string& value) { auto toLower = [](std::string str) { std::transform(str.begin(), str.end(), str.begin(), ::tolower); return str; }; const std::string lowerKey = toLower(key); if (lowerKey == "numthreads") { setNumThreads(std::stoi(value)); } else if (lowerKey == "thrashmemory") { setThrashMemory(toLower(value) == "true" || value == "1"); } else if (lowerKey == "memorysize") { setMemorySize(static_cast(std::stoull(value))); } else if (lowerKey == "memoryreads") { setMemoryReads(static_cast(std::stoull(value))); } else if (lowerKey == "memorywrites") { setMemoryWrites(static_cast(std::stoull(value))); } else if (lowerKey == "goslowoncpu") { setGoSlowOnCpu(std::stoi(value)); } else if (lowerKey == "cubecount") { setCubeCount(std::stoi(value)); } else if (lowerKey == "drawcount") { setDrawCount(std::stoi(value)); } else if (lowerKey == "testoverdraw") { setTestOverdraw(toLower(value) == "true" || value == "1"); } else if (lowerKey == "enableblending") { setEnableBlending(toLower(value) == "true" || value == "1"); } else if (lowerKey == "usemsaa") { setUseMSAA(toLower(value) == "true" || value == "1"); } else if (lowerKey == "lightcount") { setLightCount(std::stoi(value)); } else if (lowerKey == "threadcore") { const size_t commaPos = value.find(','); if (commaPos != std::string::npos) { int thread = std::stoi(value.substr(0, commaPos)); int core = std::stoi(value.substr(commaPos + 1)); if (thread >= 0 && threadCount_ > 0) { setThreadCore(thread, core); } else { IGL_LOG_ERROR( "Invalid threadCore parameter: thread=%d, threadCount=%d. Ensure numThreads > 0 is " "set before threadCore.", thread, threadCount_.load()); } } } else if (lowerKey == "dropframeinterval") { setDropFrameInterval(std::stoi(value)); } else if (lowerKey == "dropframecount") { setDropFrameCount(std::stoi(value)); } else if (lowerKey == "rotatecubes") { setRotateCubes(toLower(value) == "true" || value == "1"); } } void GPUStressSession::initialize() noexcept { pipelineState_ = nullptr; vertexInput0_ = nullptr; vb0_ = nullptr; ib0_ = nullptr; // Buffers for vertices and indices (or constants) samp0_ = nullptr; samp1_ = nullptr; framebuffer_ = nullptr; vertexData_.resize(0); // recalc verts indexData_.resize(36); // keep the first 36 indices // this is sets the size of our 'app window' so we can shrink the number of // changed pixels we send to the delphi. appParamsRef().sizeX = .5f; appParamsRef().sizeY = .5f; // Process custom parameters from ShellParams if (shellParams().benchmarkParams.has_value()) { const auto& benchmarkParams = shellParams().benchmarkParams.value(); const auto& customParams = benchmarkParams.customParams; for (const auto& [key, value] : customParams) { IGL_LOG_DEBUG("Processing custom parameter: '%s' = '%s'", key.c_str(), value.c_str()); processCustomParameter(key, value); } } auto& device = getPlatform().getDevice(); if (!isDeviceCompatible(device)) { return; } createCubes(); if (!imguiSession_) { imguiSession_ = std::make_unique(getPlatform().getDevice(), getPlatform().getInputDispatcher()); } createSamplerAndTextures(device); shaderStages_ = getShaderStagesForBackend(device); // Command queue: backed by different types of GPU HW queues const CommandQueueDesc desc{}; commandQueue_ = device.createCommandQueue(desc, nullptr); tex0_->generateMipmap(*commandQueue_); tex1_->generateMipmap(*commandQueue_); // Set up vertex uniform data vertexParameters_.scaleZ = 1.0f; renderPass_.colorAttachments.resize(1); renderPass_.colorAttachments[0].loadAction = LoadAction::Clear; renderPass_.colorAttachments[0].storeAction = StoreAction::Store; renderPass_.colorAttachments[0].clearColor = {0.0, 0.0, 0.0f, 0.0f}; renderPass_.depthAttachment.loadAction = LoadAction::Clear; renderPass_.depthAttachment.clearDepth = 1.0; if (useMSAA_) { renderPass_.colorAttachments[0].storeAction = igl::StoreAction::MsaaResolve; } DepthStencilStateDesc depthDesc; depthDesc.isDepthWriteEnabled = true; depthDesc.compareFunction = igl::CompareFunction::Less; depthStencilState_ = device.createDepthStencilState(depthDesc, nullptr); } void GPUStressSession::setProjectionMatrix(float aspectRatio) { // perspective projection constexpr float fov = 45.0f * (M_PI / 180.0f); glm::mat4 projectionMat = glm::perspectiveLH(fov, aspectRatio, .1f, 2.1f); if (testOverdraw_ || !rotateCubes_) { projectionMat = glm::orthoLH_ZO(-kHalf, kHalf, -kHalf / aspectRatio, kHalf / aspectRatio, .1f, 2.1f); } vertexParameters_.projectionMatrix = projectionMat; } // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) void GPUStressSession::setModelViewMatrix(float angle, float scaleZ, float offsetX, float offsetY, float offsetZ) { float divisor = std::ceil(std::sqrt(static_cast(drawCount_))) / (kHalf * kScaleFill); if (testOverdraw_) { divisor = 1.f; offsetX = 0.f; offsetY = 0.f; } const float cosAngle = std::cos(angle); const float sinAngle = std::sin(angle); const glm::vec4 v0(cosAngle / divisor, 0.f, -sinAngle / divisor, 0.f); const glm::vec4 v1(0.f, 1.f / divisor, 0.f, 0.f); const glm::vec4 v2(sinAngle / divisor, 0.f, cosAngle / divisor, 0.f); const glm::vec4 v3(offsetX, offsetY, 1.f + offsetZ, 1.f); const glm::mat4 test(v0, v1, v2, v3); vertexParameters_.modelViewMatrix = test; vertexParameters_.scaleZ = scaleZ; } void GPUStressSession::initState(const igl::SurfaceTextures& surfaceTextures) { Result ret; // TODO: fix framebuffers so you can update the resolve texture if (framebuffer_ == nullptr) { FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = surfaceTextures.color; framebufferDesc.depthAttachment.texture = surfaceTextures.depth; framebufferDesc.mode = surfaceTextures.color->getNumLayers() > 1 ? FramebufferMode::Stereo : FramebufferMode::Mono; if (useMSAA_) { const auto dimensions = surfaceTextures.color->getDimensions(); const TextureDesc fbTexDesc = {.width = dimensions.width, .height = dimensions.height, .depth = 1, .numLayers = surfaceTextures.color->getNumLayers(), .numSamples = kMsaaSamples, .usage = TextureDesc::TextureUsageBits::Attachment, .numMipLevels = 1, .type = surfaceTextures.color->getNumLayers() > 1 ? TextureType::TwoDArray : TextureType::TwoD, .format = surfaceTextures.color->getFormat(), .storage = igl::ResourceStorage::Private}; framebufferDesc.colorAttachments[0].texture = getPlatform().getDevice().createTexture(fbTexDesc, nullptr); framebufferDesc.colorAttachments[0].resolveTexture = surfaceTextures.color; const igl::TextureDesc depthDesc = {.width = dimensions.width, .height = dimensions.height, .depth = 1, .numLayers = surfaceTextures.depth->getNumLayers(), .numSamples = kMsaaSamples, .usage = TextureDesc::TextureUsageBits::Attachment, .numMipLevels = 1, .type = surfaceTextures.depth->getNumLayers() > 1 ? TextureType::TwoDArray : TextureType::TwoD, .format = surfaceTextures.depth->getFormat(), .storage = igl::ResourceStorage::Private}; framebufferDesc.depthAttachment.texture = getPlatform().getDevice().createTexture(depthDesc, nullptr); } framebuffer_ = getPlatform().getDevice().createFramebuffer(framebufferDesc, &ret); IGL_DEBUG_ASSERT(ret.isOk()); IGL_DEBUG_ASSERT(framebuffer_ != nullptr); } if (useMSAA_) { framebuffer_->updateResolveAttachment(surfaceTextures.color); } else { framebuffer_->updateDrawable(surfaceTextures.color); } constexpr uint32_t textureUnit = 0; if (pipelineState_ == nullptr) { RenderPipelineDesc graphicsDesc = { .vertexInputState = vertexInput0_, .shaderStages = shaderStages_, .targetDesc = { .colorAttachments = {{ .textureFormat = framebuffer_->getColorAttachment(0)->getProperties().format, .blendEnabled = enableBlending_, .rgbBlendOp = BlendOp::Add, .alphaBlendOp = BlendOp::Add, .srcRGBBlendFactor = BlendFactor::SrcAlpha, .srcAlphaBlendFactor = BlendFactor::SrcAlpha, .dstRGBBlendFactor = BlendFactor::OneMinusSrcAlpha, .dstAlphaBlendFactor = BlendFactor::OneMinusSrcAlpha, }}, .depthAttachmentFormat = framebuffer_->getDepthAttachment()->getProperties().format, }, .cullMode = igl::CullMode::Back, .frontFaceWinding = igl::WindingMode::Clockwise, .fragmentUnitSamplerMap = {{textureUnit, IGL_NAMEHANDLE("inputImage")}}, }; graphicsDesc.sampleCount = useMSAA_ ? kMsaaSamples : 1; pipelineState_ = getPlatform().getDevice().createRenderPipeline(graphicsDesc, nullptr); } } void GPUStressSession::drawCubes(const igl::SurfaceTextures& surfaceTextures, std::shared_ptr commands) { static float angle = 0.0f; static int frameCount = 0; frameCount++; angle += 0.005f; // rotating animation static float scaleZ = 1.0f, ss = 0.005f; scaleZ += ss; scaleZ = scaleZ < 0.0f ? 0.0f : scaleZ > 1.0 ? 1.0f : scaleZ; if (scaleZ <= 0.05f || scaleZ >= 1.0f) { ss *= -1.0f; } auto& device = getPlatform().getDevice(); // cube animation constexpr uint32_t textureUnit = 0; constexpr uint32_t textureUnit1 = 1; const int grid = static_cast(std::ceil(std::sqrt(static_cast(drawCount_)))); const float divisor = .5 / static_cast(grid); const float scale = 1.f / std::ceil(std::pow(cubeCount_, 1.0f / 3.0f)); int counter = 0; setProjectionMatrix(surfaceTextures.color->getAspectRatio()); commands->bindIndexBuffer(*ib0_, IndexFormat::UInt16); std::shared_ptr vertUniformBuffer = nullptr; for (int i = -grid / 2; i < grid / 2 + grid % 2; i++) { for (int j = -grid / 2; j < grid / 2 + grid % 2; j++) { if (counter >= drawCount_) { break; } counter++; float x = static_cast(j) * divisor; float y = static_cast(i) * divisor; if (dropFrameX_) { auto offset = animateCube(counter, x, y, scale, frameCount); x = offset.x; y = offset.y; } setModelViewMatrix((testOverdraw_ || !rotateCubes_) ? 0.f : angle, scaleZ, x, y, 0.f); // note that we are deliberately binding redundant state - the goal here // is to tax the driver. The giant vertex buffer (cubeCount_) will stress // just the gpu commands->bindVertexBuffer(0, *vb0_); commands->bindTexture(textureUnit, BindTarget::kFragment, tex0_.get()); commands->bindSamplerState(textureUnit, BindTarget::kFragment, samp0_.get()); commands->bindTexture(textureUnit1, BindTarget::kFragment, tex1_.get()); commands->bindSamplerState(textureUnit1, BindTarget::kFragment, samp1_.get()); commands->bindRenderPipelineState(pipelineState_); commands->bindDepthStencilState(depthStencilState_); // Bind Vertex Uniform Data if (device.getBackendType() == BackendType::Vulkan) { commands->bindPushConstants(&vertexParameters_, sizeof(vertexParameters_) - sizeof(float)); // z isn't used } else { if (!vertUniformBuffer) { iglu::ManagedUniformBufferInfo info; info.index = 1; info.length = sizeof(VertexFormat); info.uniforms = std::vector{ UniformDesc{.name = "projectionMatrix", .location = -1, .type = igl::UniformType::Mat4x4, .numElements = 1, .offset = offsetof(VertexFormat, projectionMatrix), .elementStride = 0}, UniformDesc{.name = "modelViewMatrix", .location = -1, .type = igl::UniformType::Mat4x4, .numElements = 1, .offset = offsetof(VertexFormat, modelViewMatrix), .elementStride = 0}, UniformDesc{.name = "scaleZ", .location = -1, .type = igl::UniformType::Float, .numElements = 1, .offset = offsetof(VertexFormat, scaleZ), .elementStride = 0}}; vertUniformBuffer = std::make_shared(device, info); IGL_DEBUG_ASSERT(vertUniformBuffer->result.isOk()); } *static_cast(vertUniformBuffer->getData()) = vertexParameters_; vertUniformBuffer->bind(device, *pipelineState_, *commands); } commands->drawIndexed(indexData_.size()); } } } void GPUStressSession::update(SurfaceTextures surfaceTextures) noexcept { auto& device = getPlatform().getDevice(); if (!isDeviceCompatible(device)) { return; } if (forceReset_) { memBlock_.resize(0); forceReset_ = false; initialize(); } allocateMemory(); thrashCPU(); thrashMemory(); fps_.updateFPS(getDeltaSeconds()); initState(surfaceTextures); // Command buffers (1-N per thread): create, submit and forget auto buffer = commandQueue_->createCommandBuffer(CommandBufferDesc{}, nullptr); const std::shared_ptr commands = buffer->createRenderCommandEncoder(renderPass_, framebuffer_); FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = framebuffer_->getColorAttachment(0); framebufferDesc.depthAttachment.texture = framebuffer_->getDepthAttachment(); // setup UI const ImGuiViewport* v = ImGui::GetMainViewport(); imguiSession_->beginFrame(framebufferDesc, getPlatform().getDisplayContext().pixelsPerPoint); bool open = false; ImGui::SetNextWindowPos( { v->WorkPos.x + v->WorkSize.x - 60.0f, v->WorkPos.y + v->WorkSize.y * .25f + 15.0f, }, ImGuiCond_Always, {1.0f, 0.0f}); ImGui::Begin("GPU", &open, ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoBackground); ImGui::SetWindowFontScale(2.f); // draw stuff drawCubes(surfaceTextures, commands); { // Draw using ImGui every frame ImGui::TextColored(ImVec4(1.f, 0.f, 0.f, 1.f), "FPS: (%f) PI: (%lf) Memory (%f)", fps_.getAverageFPS(), pi_, memoryVal_.load()); ImGui::End(); imguiSession_->endFrame(getPlatform().getDevice(), *commands); } commands->endEncoding(); if (shellParams().shouldPresent) { buffer->present(useMSAA_ ? framebuffer_->getResolveColorAttachment(0) : framebuffer_->getColorAttachment(0)); } commandQueue_->submit(*buffer); // Guarantees ordering between command buffers } void GPUStressSession::setNumThreads(int numThreads) { threadCount_ = numThreads; } void GPUStressSession::setThrashMemory(bool thrashMemory) { thrashMemory_ = thrashMemory; } void GPUStressSession::setMemorySize(size_t memorySize) { if (memorySize != memorySize_) { memorySize_ = memorySize; forceReset_ = true; } } void GPUStressSession::setMemoryReads(size_t memoryReads) { memoryReads_ = memoryReads; } void GPUStressSession::setMemoryWrites(size_t memoryWrites) { memoryWrites_ = memoryWrites; } void GPUStressSession::setGoSlowOnCpu(int goSlowOnCpu) { goSlowOnCpu_ = goSlowOnCpu; } void GPUStressSession::setCubeCount(int count) { if (cubeCount_ != count) { forceReset_ = true; cubeCount_ = count; } } void GPUStressSession::setDrawCount(int count) { drawCount_ = count; } void GPUStressSession::setTestOverdraw(bool testOverdraw) { if (testOverdraw != testOverdraw_) { testOverdraw_ = testOverdraw; forceReset_ = true; } } void GPUStressSession::setEnableBlending(bool enableBlending) { if (enableBlending != enableBlending_) { enableBlending_ = enableBlending; forceReset_ = true; } } void GPUStressSession::setUseMSAA(bool useMSAA) { if (useMSAA_ != useMSAA) { useMSAA_ = useMSAA; forceReset_ = true; } } void GPUStressSession::setLightCount(int lightCount) { if (lightCount_ != lightCount) { lightCount_ = lightCount; forceReset_ = true; } } void GPUStressSession::setThreadCore(int thread, int core) { threadIds_[thread % threadCount_] = core; } int GPUStressSession::getNumThreads() const { return threadCount_; } bool GPUStressSession::getThrashMemory() const { return thrashMemory_; } size_t GPUStressSession::getMemorySize() const { return memorySize_; } size_t GPUStressSession::getMemoryReads() const { return memoryReads_; } size_t GPUStressSession::getMemoryWrites() const { return memoryWrites_; } bool GPUStressSession::getGoSlowOnCpu() const { return goSlowOnCpu_ != 0; } int GPUStressSession::getCubeCount() const { return cubeCount_; } int GPUStressSession::getDrawCount() const { return drawCount_; } bool GPUStressSession::getTestOverdraw() const { return testOverdraw_; } bool GPUStressSession::getEnableBlending() const { return enableBlending_; } bool GPUStressSession::getUseMSAA() const { return useMSAA_; } int GPUStressSession::getLightCount() const { return lightCount_; } std::vector GPUStressSession::getThreadsCores() const { return threadIds_; } void GPUStressSession::setDropFrameInterval(int numberOfFramesBetweenDrops) { dropFrameX_ = numberOfFramesBetweenDrops; } int GPUStressSession::getDropFrameInterval() const { return dropFrameX_; } void GPUStressSession::setDropFrameCount(int numberOfFramesToDrop) { dropFrameCount_ = numberOfFramesToDrop; } int GPUStressSession::getDropFrameCount() const { return dropFrameCount_; } void GPUStressSession::setRotateCubes(bool bRotate) { rotateCubes_ = bRotate; } bool GPUStressSession::getRotateCubes() const { return rotateCubes_; } std::string GPUStressSession::getCurrentUsageString() const { char output[2048]; snprintf(output, sizeof(output), "cubes: %d, draws: %d, lights: %d, threads: %d, cpu load: %d, memory reads: %lu , " "memory writes: %lu, " "msaa %s , blending %s, framerate: %.2f,", cubeCount_.load(), drawCount_.load(), lightCount_.load(), threadCount_.load(), goSlowOnCpu_.load(), memoryReads_.load() * (thrashMemory_ ? 1 : 0), memoryWrites_.load() * (thrashMemory_ ? 1 : 0), useMSAA_ ? "on" : "off", enableBlending_ ? "on" : "off ", fps_.getAverageFPS()); return output; } void GPUStressSession::setNumLayers(size_t numLayers) { #if !defined(IGL_PLATFORM_WINDOWS) igl::shell::QuadLayerParams params; params.layerInfo.reserve(numLayers); for (int i = 0; i < numLayers; i++) { params.layerInfo.emplace_back({.position = {0.f, 0.f, 0.f}, .size = {1.f, 1.f}, .blendMode = igl::shell::LayerBlendMode::AlphaBlend}); } appParamsRef().quadLayerParamsGetter = [params]() -> igl::shell::QuadLayerParams { return params; }; #endif } } // namespace igl::shell ================================================ FILE: shell/renderSessions/GPUStressSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include #include #include #include #include #include #include #include namespace igl::shell { struct VertexFormat { glm::mat4 projectionMatrix; glm::mat4 modelViewMatrix; float scaleZ{}; }; class GPUStressSession : public RenderSession { public: explicit GPUStressSession(std::shared_ptr platform); void initialize() noexcept override; void update(SurfaceTextures surfaceTextures) noexcept override; void setNumLayers(size_t numLayers); void setNumThreads(int numThreads); void setThrashMemory(bool thrashMemory); void setMemorySize(size_t memorySize); void setMemoryReads(size_t memoryReads); void setMemoryWrites(size_t memoryWrites); void setGoSlowOnCpu(int goSlowOnCpu); void setCubeCount(int cubeCount); void setDrawCount(int drawCount); void setTestOverdraw(bool testOverdraw); void setEnableBlending(bool enableBlending); void setUseMSAA(bool useMSAA); void setLightCount(int lightCount); void setThreadCore(int thread, int core); void setDropFrameInterval(int numberOfFramesBetweenDrops); void setDropFrameCount(int numberOfFramesToDrop); void setRotateCubes(bool rotate); [[nodiscard]] int getNumThreads() const; [[nodiscard]] bool getThrashMemory() const; [[nodiscard]] size_t getMemorySize() const; [[nodiscard]] size_t getMemoryReads() const; [[nodiscard]] size_t getMemoryWrites() const; [[nodiscard]] bool getGoSlowOnCpu() const; [[nodiscard]] int getCubeCount() const; [[nodiscard]] int getDrawCount() const; [[nodiscard]] bool getTestOverdraw() const; [[nodiscard]] bool getEnableBlending() const; [[nodiscard]] bool getUseMSAA() const; [[nodiscard]] int getLightCount() const; [[nodiscard]] std::vector getThreadsCores() const; [[nodiscard]] std::string getCurrentUsageString() const; [[nodiscard]] int getDropFrameInterval() const; [[nodiscard]] int getDropFrameCount() const; [[nodiscard]] bool getRotateCubes() const; private: struct VertexPosUvw { glm::vec3 position; glm::vec4 uvw; glm::vec4 baseColor; }; [[nodiscard]] std::string getLightingCalc() const; [[nodiscard]] std::string getVulkanFragmentShaderSource() const; std::unique_ptr getShaderStagesForBackend(IDevice& device) const noexcept; void addNormalsToCube(); void processCustomParameter(const std::string& key, const std::string& value); RenderPassDesc renderPass_; std::shared_ptr pipelineState_; std::shared_ptr vertexInput0_; std::shared_ptr shaderStages_; std::shared_ptr vb0_, ib0_; // Buffers for vertices and indices (or constants) std::shared_ptr tex0_; std::shared_ptr tex1_; std::shared_ptr samp0_; std::shared_ptr samp1_; std::shared_ptr framebuffer_; std::unique_ptr imguiSession_; std::shared_ptr depthStencilState_; VertexFormat vertexParameters_; // utility fns void createSamplerAndTextures(const IDevice& /*device*/); void setModelViewMatrix(float angle, float scaleZ, float offsetX, float offsetY, float offsetZ); void setProjectionMatrix(float aspectRatio); void drawCubes(const igl::SurfaceTextures& surfaceTextures, std::shared_ptr commands); void initState(const igl::SurfaceTextures& surfaceTextures); void createCubes(); void initSystemSettings(); void thrashCPU() noexcept; float doReadWrite(std::vector>>& memBlock, // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) int numBlocks, int numRows, int numCols, int threadId); void allocateMemory(); void thrashMemory() noexcept; // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) void getOffset(int counter, float& x, float& y, float& z); glm::vec3 animateCube(int counter, float x, float y, float scale, int frameCount); FPSCounter fps_; std::vector vertexData0_; std::vector indexData0_; std::vector vertexData_; std::vector indexData_; std::atomic forceReset_{false}; std::atomic cubeCount_ = 1; // number of cubes in the vertex buffer // number of times to draw the vertex buffer (triangles = 12 * kDrawCount * // kCubeCount) std::atomic drawCount_ = 50; // turn this on and set kDrawCount to 1. Cube count will be the number of // layers you'll see std::atomic testOverdraw_ = false; std::atomic enableBlending_ = false; // turn this on to see the effects of alpha blending // make this number little to make all the cubes tiny on screen so fill isn't a // problem std::atomic useMSAA_ = true; // each light will add about 45 ish instructions to your pixel shader (tested // using powerVR compiler so grain of salt)arc lint --engine LintCPP std::atomic lightCount_ = 5; // number of times to do a lof of math that does not calculate pi std::atomic goSlowOnCpu_ = 10000; // max10000000; // cpu threads - these are really necessary to get our CPU usage up to 100% // (otherwise the framerate just throttles) std::atomic threadCount_ = 1; std::atomic thrashMemory_ = true; std::atomic memorySize_ = 64; // in MB std::atomic memoryReads_ = 10000; // max 1000000; std::atomic memoryWrites_ = 10000; // 100000; std::vector threadIds_ = {-1, -1, -1, -1, -1, -1, -1, -1}; std::atomic dropFrameX_ = 0; std::atomic dropFrameCount_ = 2; std::atomic rotateCubes_ = true; std::atomic memoryVal_ = 0.0f; double pi_ = 0.f; std::vector>> memBlock_; }; } // namespace igl::shell ================================================ FILE: shell/renderSessions/GPUTimerSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include namespace igl::shell { namespace { struct VertexPosColor { iglu::simdtypes::float3 position; iglu::simdtypes::float4 color; }; VertexPosColor vertexData[] = { {.position = {-0.6f, -0.4f, 0.0}, .color = {1.0, 0.0, 0.0, 1.0}}, {.position = {0.6f, -0.4f, 0.0}, .color = {0.0, 1.0, 0.0, 1.0}}, {.position = {0.0f, 0.6f, 0.0}, .color = {0.0, 0.0, 1.0, 1.0}}, }; uint16_t indexData[] = { 2, 1, 0, }; std::string getVersion() { return {"#version 100"}; } std::string getMetalShaderSource() { return R"( using namespace metal; typedef struct { float3 position [[attribute(0)]]; float4 color [[attribute(1)]]; } VertexIn; typedef struct { float4 position [[position]]; float4 color; } VertexOut; vertex VertexOut vertexShader( uint vid [[vertex_id]], constant VertexIn * vertices [[buffer(1)]]) { VertexOut out; out.position = float4(vertices[vid].position, 1.0); out.color = vertices[vid].color; return out; } fragment float4 fragmentShader( VertexOut IN [[stage_in]]) { return IN.color; } )"; } std::string getOpenGLVertexShaderSource() { return getVersion() + R"( precision highp float; attribute vec3 position; attribute vec4 color_in; varying vec4 vColor; void main() { gl_Position = vec4(position, 1.0); vColor = color_in; })"; } std::string getOpenGLFragmentShaderSource() { return getVersion() + std::string(R"( precision highp float; varying vec4 vColor; void main() { gl_FragColor = vColor; })"); } std::string getVulkanVertexShaderSource() { return R"( layout(location = 0) in vec3 position; layout(location = 1) in vec4 color_in; layout(location = 0) out vec4 color; void main() { gl_Position = vec4(position, 1.0); color = color_in; } )"; } std::string getVulkanFragmentShaderSource() { return R"( layout(location = 0) in vec4 color; layout(location = 0) out vec4 out_FragColor; void main() { out_FragColor = color; } )"; } std::unique_ptr getShaderStagesForBackend(IDevice& device) { switch (device.getBackendType()) { case igl::BackendType::Invalid: case igl::BackendType::Custom: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; case igl::BackendType::Vulkan: return igl::ShaderStagesCreator::fromModuleStringInput(device, getVulkanVertexShaderSource().c_str(), "main", "", getVulkanFragmentShaderSource().c_str(), "main", "", nullptr); // @fb-only // @fb-only // @fb-only case igl::BackendType::Metal: return igl::ShaderStagesCreator::fromLibraryStringInput( device, getMetalShaderSource().c_str(), "vertexShader", "fragmentShader", "", nullptr); case igl::BackendType::OpenGL: return igl::ShaderStagesCreator::fromModuleStringInput(device, getOpenGLVertexShaderSource().c_str(), "main", "", getOpenGLFragmentShaderSource().c_str(), "main", "", nullptr); case igl::BackendType::D3D12: { static const char* kVS = R"( struct VSIn { float3 position : POSITION; float4 color : COLOR; }; struct VSOut { float4 position : SV_POSITION; float4 color : COLOR; }; VSOut main(VSIn v) { VSOut o; o.position = float4(v.position, 1.0); o.color = v.color; return o; } )"; static const char* kPS = R"( struct PSIn { float4 position : SV_POSITION; float4 color : COLOR; }; float4 main(PSIn i) : SV_TARGET { return i.color; } )"; return igl::ShaderStagesCreator::fromModuleStringInput( device, kVS, "main", "", kPS, "main", "", nullptr); } } IGL_UNREACHABLE_RETURN(nullptr) } } // namespace void GPUTimerSession::initialize() noexcept { auto& device = getPlatform().getDevice(); // Vertex & Index buffer vb0_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Vertex, .data = vertexData, .length = sizeof(vertexData)}, nullptr); IGL_DEBUG_ASSERT(vb0_ != nullptr); ib0_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Index, .data = indexData, .length = sizeof(indexData)}, nullptr); IGL_DEBUG_ASSERT(ib0_ != nullptr); vertexInput0_ = device.createVertexInputState( VertexInputStateDesc{ .numAttributes = 2, .attributes = { VertexAttribute{.bufferIndex = 1, .format = VertexAttributeFormat::Float3, .offset = offsetof(VertexPosColor, position), .name = "position", .location = 0}, VertexAttribute{.bufferIndex = 1, .format = VertexAttributeFormat::Float4, .offset = offsetof(VertexPosColor, color), .name = "color_in", .location = 1}, }, .numInputBindings = 1, .inputBindings = {{}, {.stride = sizeof(VertexPosColor)}}, }, nullptr); IGL_DEBUG_ASSERT(vertexInput0_ != nullptr); shaderStages_ = getShaderStagesForBackend(device); IGL_DEBUG_ASSERT(shaderStages_ != nullptr); // Command queue commandQueue_ = device.createCommandQueue(CommandQueueDesc{}, nullptr); IGL_DEBUG_ASSERT(commandQueue_ != nullptr); // GPU Timer Result timerResult; timer_ = device.createTimer(&timerResult); if (!timerResult.isOk() || timer_ == nullptr) { IGL_LOG_INFO("GPU Timer: creation not supported on this backend.\n"); } renderPass_ = { .colorAttachments = { { .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, .clearColor = getPreferredClearColor(), }, }, .depthAttachment = { .loadAction = LoadAction::Clear, .clearDepth = 1.0, }, }; } void GPUTimerSession::update(SurfaceTextures textures) noexcept { Result ret; if (framebuffer_ == nullptr) { framebuffer_ = getPlatform().getDevice().createFramebuffer( FramebufferDesc{ .colorAttachments = {{.texture = textures.color}}, .depthAttachment = {.texture = textures.depth}, .stencilAttachment = textures.depth && textures.depth->getProperties().hasStencil() ? FramebufferDesc::AttachmentDesc{.texture = textures.depth} : FramebufferDesc::AttachmentDesc{}, }, &ret); IGL_DEBUG_ASSERT(ret.isOk()); IGL_DEBUG_ASSERT(framebuffer_ != nullptr); } else { framebuffer_->updateDrawable(textures); } // Graphics pipeline if (pipelineState_ == nullptr) { pipelineState_ = getPlatform().getDevice().createRenderPipeline( RenderPipelineDesc{ .vertexInputState = vertexInput0_, .shaderStages = shaderStages_, .targetDesc = { .colorAttachments = {{.textureFormat = framebuffer_->getColorAttachment(0)->getFormat()}}, .depthAttachmentFormat = framebuffer_->getDepthAttachment()->getFormat(), .stencilAttachmentFormat = framebuffer_->getStencilAttachment() ? framebuffer_->getStencilAttachment()->getFormat() : igl::TextureFormat::Invalid, }, .cullMode = igl::CullMode::Back, .frontFaceWinding = igl::WindingMode::Clockwise, }, nullptr); IGL_DEBUG_ASSERT(pipelineState_ != nullptr); } // Command Buffer with GPU timer attached auto buffer = commandQueue_->createCommandBuffer( CommandBufferDesc{.debugName = "GPUTimerSession", .timer = timer_}, nullptr); IGL_DEBUG_ASSERT(buffer != nullptr); auto drawableSurface = framebuffer_->getColorAttachment(0); // Submit commands const std::shared_ptr commands = buffer->createRenderCommandEncoder(renderPass_, framebuffer_); IGL_DEBUG_ASSERT(commands != nullptr); if (commands) { commands->bindVertexBuffer(1, *vb0_); commands->bindRenderPipelineState(pipelineState_); commands->bindIndexBuffer(*ib0_, IndexFormat::UInt16); commands->drawIndexed(3); commands->endEncoding(); } IGL_DEBUG_ASSERT(buffer != nullptr); if (shellParams().shouldPresent) { buffer->present(drawableSurface); } IGL_DEBUG_ASSERT(commandQueue_ != nullptr); commandQueue_->submit(*buffer); // Log GPU timing results if (timer_ != nullptr && timer_->resultsAvailable()) { const uint64_t elapsedNanos = timer_->getElapsedTimeNanos(); const double elapsedMs = static_cast(elapsedNanos) / 1000000.0; IGL_LOG_INFO("GPU Timer: render pass took %.3f ms (%llu ns)\n", elapsedMs, (unsigned long long)elapsedNanos); } RenderSession::update(textures); } } // namespace igl::shell ================================================ FILE: shell/renderSessions/GPUTimerSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include #include #include #include namespace igl::shell { class GPUTimerSession : public RenderSession { public: explicit GPUTimerSession(std::shared_ptr platform) : RenderSession(std::move(platform)) {} void initialize() noexcept override; void update(SurfaceTextures surfaceTextures) noexcept override; private: std::shared_ptr pipelineState_; RenderPassDesc renderPass_; std::shared_ptr shaderStages_; std::shared_ptr vertexInput0_; std::shared_ptr framebuffer_; std::shared_ptr depthTexture_; std::shared_ptr vb0_; std::shared_ptr ib0_; std::shared_ptr timer_; }; } // namespace igl::shell ================================================ FILE: shell/renderSessions/HandsOpenXRSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace igl::shell { namespace { struct Vertex { glm::vec3 position; glm::vec3 normal; glm::vec4 weight; glm::vec4 joint; }; [[nodiscard]] const char* getVulkanFragmentShaderSource() { return R"(#version 450 precision highp float; layout(location = 0) in vec3 worldNormal; layout(location = 0) out vec4 fragmentColor; void main() { float att = max(dot(worldNormal, -normalize(vec3(-0.1, -1, 0))), 0.3); fragmentColor = vec4(att, att, att, 1.0); })"; } [[nodiscard]] std::string getVertexShaderProlog(bool stereoRendering) { return stereoRendering ? R"(#version 450 #extension GL_OVR_multiview2 : require layout(num_views = 2) in; precision highp float; #define VIEW_ID int(gl_ViewID_OVR) )" : R"(#version 450 precision highp float; #define VIEW_ID perFrame.viewId )"; } [[nodiscard]] std::string getVulkanVertexShaderSource(bool stereoRendering) { return getVertexShaderProlog(stereoRendering) + R"( layout(location = 0) in vec3 position; layout(location = 1) in vec3 normal; layout(location = 2) in vec4 weight; layout(location = 3) in vec4 joint; #define XR_HAND_JOINT_COUNT_EXT 26 layout (set = 1, binding = 1, std140) uniform PerFrame { mat4 jointMatrices[XR_HAND_JOINT_COUNT_EXT]; mat4 viewProjectionMatrix[2]; int viewId; } perFrame; layout(location = 0) out vec3 worldNormal; void main() { mat4 world = perFrame.jointMatrices[int(joint.x)] * mat4(weight.x) + perFrame.jointMatrices[int(joint.y)] * mat4(weight.y) + perFrame.jointMatrices[int(joint.z)] * mat4(weight.z) + perFrame.jointMatrices[int(joint.w)] * mat4(weight.w); worldNormal = (world * vec4(normal, 0.0)).xyz; vec4 worldPos = world * vec4(position, 1.0); gl_Position = perFrame.viewProjectionMatrix[VIEW_ID] * vec4(worldPos.xyz, 1.0); })"; } [[nodiscard]] std::unique_ptr getShaderStagesForBackend( IDevice& device, const iglu::ShaderCross& shaderCross, bool stereoRendering) noexcept { switch (device.getBackendType()) { case igl::BackendType::Metal: IGL_DEBUG_ABORT("Metal is not supported"); return nullptr; // @fb-only // @fb-only // @fb-only case igl::BackendType::Vulkan: return igl::ShaderStagesCreator::fromModuleStringInput( device, getVulkanVertexShaderSource(stereoRendering).c_str(), "main", "", getVulkanFragmentShaderSource(), "main", "", nullptr); case igl::BackendType::OpenGL: { Result res; const auto vs = shaderCross.crossCompileFromVulkanSource( getVulkanVertexShaderSource(stereoRendering).c_str(), igl::ShaderStage::Vertex, &res); IGL_DEBUG_ASSERT(res.isOk(), res.message.c_str()); const auto fs = shaderCross.crossCompileFromVulkanSource( getVulkanFragmentShaderSource(), igl::ShaderStage::Fragment, &res); IGL_DEBUG_ASSERT(res.isOk(), res.message.c_str()); return igl::ShaderStagesCreator::fromModuleStringInput( device, vs.c_str(), shaderCross.entryPointName(igl::ShaderStage::Vertex), "", fs.c_str(), shaderCross.entryPointName(igl::ShaderStage::Fragment), "", nullptr); } default: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; } } [[nodiscard]] bool isDeviceCompatible(IDevice& device) noexcept { return device.hasFeature(DeviceFeatures::Multiview); } [[nodiscard]] glm::mat4 perspectiveAsymmetricFovRH(const igl::shell::Fov& fov, float nearZ, float farZ) noexcept { glm::mat4 mat; const float tanLeft = tanf(fov.angleLeft); const float tanRight = tanf(fov.angleRight); const float tanDown = tanf(fov.angleDown); const float tanUp = tanf(fov.angleUp); const float tanWidth = tanRight - tanLeft; const float tanHeight = tanUp - tanDown; mat[0][0] = 2.0f / tanWidth; mat[1][0] = 0.0f; mat[2][0] = (tanRight + tanLeft) / tanWidth; mat[3][0] = 0.0f; mat[0][1] = 0.0f; mat[1][1] = 2.0f / tanHeight; mat[2][1] = (tanUp + tanDown) / tanHeight; mat[3][1] = 0.0f; mat[0][2] = 0.0f; mat[1][2] = 0.0f; mat[2][2] = -(farZ + nearZ) / (farZ - nearZ); mat[3][2] = -2.0f * farZ * nearZ / (farZ - nearZ); mat[0][3] = 0.0f; mat[1][3] = 0.0f; mat[2][3] = -1.0f; mat[3][3] = 0.0f; return mat; } [[nodiscard]] inline glm::mat4 poseToMat4(const Pose& pose) noexcept { return glm::translate(glm::mat4(1.0), glm::vec3(pose.position)) * glm::toMat4(pose.orientation); } } // namespace void HandsOpenXRSession::initialize() noexcept { auto& device = getPlatform().getDevice(); if (!isDeviceCompatible(device)) { return; } if (shellParams().handMeshes[0].vertexCountOutput == 0 && shellParams().handMeshes[1].vertexCountOutput == 0) { return; } const bool stereoRendering = shellParams().viewParams.size() > 1; const auto& handMeshes = shellParams().handMeshes; std::vector vertexData; std::vector indices; vertexData.reserve(handMeshes[0].vertexCountOutput + handMeshes[1].vertexCountOutput); indices.reserve(handMeshes[0].indexCountOutput + handMeshes[1].indexCountOutput); for (uint8_t i = 0; i < 2; ++i) { handsDrawParams_[i].indexCount = handMeshes[i].indexCountOutput; handsDrawParams_[i].indexBufferOffset = indices.size() * sizeof(uint16_t); const uint16_t baseVertex = static_cast(vertexData.size()); for (size_t j = 0; j < handMeshes[i].vertexCountOutput; ++j) { Vertex v; v.position = handMeshes[i].vertexPositions[j]; v.normal = handMeshes[i].vertexNormals[j]; v.weight = handMeshes[i].vertexBlendWeights[j]; v.joint = handMeshes[i].vertexBlendIndices[j]; vertexData.push_back(v); } for (size_t j = 0; j < handMeshes[i].indexCountOutput; ++j) { indices.push_back(baseVertex + static_cast(handMeshes[i].indices[j])); } for (size_t j = 0; j < handMeshes[i].jointBindPoses.size(); ++j) { jointInvBindMatrix_[i][j] = glm::inverse(poseToMat4(handMeshes[i].jointBindPoses[j])); } } const BufferDesc vb0Desc = BufferDesc{ BufferDesc::BufferTypeBits::Vertex, vertexData.data(), sizeof(Vertex) * vertexData.size()}; vb0_ = device.createBuffer(vb0Desc, nullptr); const BufferDesc ibDesc = BufferDesc{ BufferDesc::BufferTypeBits::Index, indices.data(), sizeof(uint16_t) * indices.size()}; ib0_ = device.createBuffer(ibDesc, nullptr); const VertexInputStateDesc inputDesc = { .numAttributes = 4, .attributes = { {.bufferIndex = 0, .format = VertexAttributeFormat::Float3, .offset = offsetof(Vertex, position), .name = "position", .location = 0}, {.bufferIndex = 0, .format = VertexAttributeFormat::Float3, .offset = offsetof(Vertex, normal), .name = "normal", .location = 1}, {.bufferIndex = 0, .format = VertexAttributeFormat::Float4, .offset = offsetof(Vertex, weight), .name = "weight", .location = 2}, {.bufferIndex = 0, .format = VertexAttributeFormat::Float4, .offset = offsetof(Vertex, joint), .name = "joint", .location = 3}, }, .numInputBindings = 1, .inputBindings = {{.stride = sizeof(Vertex)}}, }; vertexInput0_ = device.createVertexInputState(inputDesc, nullptr); const iglu::ShaderCross shaderCross(device); shaderStages_ = getShaderStagesForBackend(device, shaderCross, stereoRendering); // Command queue: backed by different types of GPU HW queues const CommandQueueDesc desc{}; commandQueue_ = device.createCommandQueue(desc, nullptr); renderPass_.colorAttachments.resize(1); renderPass_.colorAttachments[0].loadAction = LoadAction::Clear; renderPass_.colorAttachments[0].storeAction = StoreAction::Store; #if defined(IGL_OPENXR_MR_MODE) renderPass_.colorAttachments[0].clearColor = {0.0, 0.0, 1.0, 0.0f}; #else renderPass_.colorAttachments[0].clearColor = {0.0, 0.0, 1.0, 1.0f}; #endif renderPass_.depthAttachment.loadAction = LoadAction::Clear; renderPass_.depthAttachment.clearDepth = 1.0; } void HandsOpenXRSession::update(SurfaceTextures surfaceTextures) noexcept { auto& device = getPlatform().getDevice(); if (!isDeviceCompatible(device)) { return; } if (shellParams().handMeshes[0].vertexCountOutput == 0 && shellParams().handMeshes[1].vertexCountOutput == 0) { return; } // Update uniforms. for (size_t i = 0; i < std::min(shellParams().viewParams.size(), size_t(2)); ++i) { const auto currentViewId = shellParams().viewParams[i].viewIndex; ub_.viewProjectionMatrix[currentViewId] = perspectiveAsymmetricFovRH(shellParams().viewParams[i].fov, 0.1f, 100.0f) * shellParams().viewParams[i].viewMatrix; ub_.viewId = currentViewId; } IGL_DEBUG_ASSERT(!shellParams().viewParams.empty()); const auto viewIndex = shellParams().viewParams[0].viewIndex; Result ret; if (framebuffer_[viewIndex] == nullptr) { FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = surfaceTextures.color; framebufferDesc.depthAttachment.texture = surfaceTextures.depth; framebufferDesc.mode = surfaceTextures.color->getNumLayers() > 1 ? FramebufferMode::Stereo : FramebufferMode::Mono; framebuffer_[viewIndex] = getPlatform().getDevice().createFramebuffer(framebufferDesc, &ret); IGL_DEBUG_ASSERT(ret.isOk()); IGL_DEBUG_ASSERT(framebuffer_[viewIndex] != nullptr); } else { framebuffer_[viewIndex]->updateDrawable(surfaceTextures.color); } if (pipelineState_ == nullptr) { const RenderPipelineDesc graphicsDesc = { .vertexInputState = vertexInput0_, .shaderStages = shaderStages_, .targetDesc = { .colorAttachments = { { .textureFormat = framebuffer_[viewIndex] ->getColorAttachment(0) ->getProperties() .format, }, }, .depthAttachmentFormat = framebuffer_[viewIndex]->getDepthAttachment()->getProperties().format, }, .cullMode = igl::CullMode::Back, .frontFaceWinding = igl::WindingMode::CounterClockwise, }; pipelineState_ = getPlatform().getDevice().createRenderPipeline(graphicsDesc, nullptr); } if (depthStencilState_ == nullptr) { DepthStencilStateDesc depthStencilDesc; depthStencilDesc.isDepthWriteEnabled = true; depthStencilDesc.compareFunction = CompareFunction::LessEqual; depthStencilState_ = getPlatform().getDevice().createDepthStencilState(depthStencilDesc, nullptr); } // Command buffers (1-N per thread): create, submit and forget auto buffer = commandQueue_->createCommandBuffer(CommandBufferDesc{}, nullptr); const std::shared_ptr commands = buffer->createRenderCommandEncoder(renderPass_, framebuffer_[viewIndex]); commands->pushDebugGroupLabel("HandsOpenXRSession Commands", Color(0.0f, 1.0f, 0.0f)); commands->bindVertexBuffer(0, *vb0_); commands->bindRenderPipelineState(pipelineState_); commands->bindDepthStencilState(depthStencilState_); iglu::ManagedUniformBufferInfo info; info.index = 1; info.length = sizeof(UniformBlock); info.uniforms = std::vector{UniformDesc{ .name = "jointMatrices", .location = -1, .type = igl::UniformType::Mat4x4, .numElements = kMaxJoints, .offset = offsetof(UniformBlock, jointMatrices), .elementStride = sizeof(glm::mat4), }, UniformDesc{.name = "viewProjectionMatrix", .location = -1, .type = igl::UniformType::Mat4x4, .numElements = 2, .offset = offsetof(UniformBlock, viewProjectionMatrix), .elementStride = sizeof(glm::mat4)}, UniformDesc{ .name = "viewId", .location = -1, .type = igl::UniformType::Int, .numElements = 1, .offset = offsetof(UniformBlock, viewId), .elementStride = 0, }}; std::shared_ptr ubos[2]; for (int i = 0; i < 2; ++i) { const auto& handTracking = shellParams().handTracking[i]; IGL_DEBUG_ASSERT(handTracking.jointPose.size() <= kMaxJoints); for (size_t j = 0; j < handTracking.jointPose.size(); ++j) { ub_.jointMatrices[j] = poseToMat4(handTracking.jointPose[j]) * jointInvBindMatrix_[i][j]; } ubos[i] = std::make_shared(device, "perFrame", info); IGL_DEBUG_ASSERT(ubos[i]->result.isOk()); *static_cast(ubos[i]->getData()) = ub_; ubos[i]->bind(device, *pipelineState_, *commands); commands->bindIndexBuffer(*ib0_, IndexFormat::UInt16, handsDrawParams_[i].indexBufferOffset); commands->drawIndexed(handsDrawParams_[i].indexCount); } commands->popDebugGroupLabel(); commands->endEncoding(); if (shellParams().shouldPresent) { buffer->present(framebuffer_[viewIndex]->getColorAttachment(0)); } commandQueue_->submit(*buffer); // Guarantees ordering between command buffers } } // namespace igl::shell ================================================ FILE: shell/renderSessions/HandsOpenXRSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include #include #include #include #include namespace igl::shell { constexpr int kMaxJoints = 26; struct UniformBlock { glm::mat4 jointMatrices[kMaxJoints]{}; glm::mat4 viewProjectionMatrix[2]{}; int viewId = 0; }; class HandsOpenXRSession : public RenderSession { public: explicit HandsOpenXRSession(std::shared_ptr platform) : RenderSession(std::move(platform)) {} void initialize() noexcept override; void update(SurfaceTextures surfaceTextures) noexcept override; private: RenderPassDesc renderPass_; std::shared_ptr pipelineState_; std::shared_ptr depthStencilState_; std::shared_ptr vertexInput0_; std::shared_ptr shaderStages_; std::shared_ptr vb0_, ib0_; std::shared_ptr framebuffer_[2]; std::array, 2> jointInvBindMatrix_; struct DrawParams { size_t indexCount = 0; size_t indexBufferOffset = 0; } handsDrawParams_[2]; UniformBlock ub_; }; } // namespace igl::shell ================================================ FILE: shell/renderSessions/HelloOpenXRSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include #include #include #include #include #include #include #include namespace igl::shell { namespace { struct VertexPosUvw { glm::vec3 position; glm::vec3 uvw; }; const float kHalf = 1.0f; const VertexPosUvw kVertexData0[] = { {.position = {-kHalf, kHalf, -kHalf}, .uvw = {0.0, 1.0, 0.0}}, {.position = {kHalf, kHalf, -kHalf}, .uvw = {1.0, 1.0, 0.0}}, {.position = {-kHalf, -kHalf, -kHalf}, .uvw = {0.0, 0.0, 0.0}}, {.position = {kHalf, -kHalf, -kHalf}, .uvw = {1.0, 0.0, 0.0}}, {.position = {kHalf, kHalf, kHalf}, .uvw = {1.0, 1.0, 1.0}}, {.position = {-kHalf, kHalf, kHalf}, .uvw = {0.0, 1.0, 1.0}}, {.position = {kHalf, -kHalf, kHalf}, .uvw = {1.0, 0.0, 1.0}}, {.position = {-kHalf, -kHalf, kHalf}, .uvw = {0.0, 0.0, 1.0}}, }; constexpr uint16_t kIndexData[] = {0, 1, 2, 1, 3, 2, 1, 4, 3, 4, 6, 3, 4, 5, 6, 5, 7, 6, 5, 0, 7, 0, 2, 7, 5, 4, 0, 4, 1, 0, 2, 3, 7, 3, 6, 7}; [[nodiscard]] const char* getVulkanFragmentShaderSource() { return R"(#version 450 precision highp float; precision highp sampler2D; layout(location = 0) in vec3 uvw; layout(location = 1) in vec3 color; layout(set = 0, binding = 0) uniform sampler2D inputImage; layout(location = 0) out vec4 fragmentColor; void main() { fragmentColor = texture(inputImage, uvw.xy) * vec4(color, 1.0); })"; } [[nodiscard]] std::string getVertexShaderProlog(bool stereoRendering) { return stereoRendering ? R"(#version 450 #extension GL_OVR_multiview2 : require layout(num_views = 2) in; precision highp float; #define VIEW_ID int(gl_ViewID_OVR) )" : R"(#version 450 precision highp float; #define VIEW_ID perFrame.viewId )"; } [[nodiscard]] std::string getVulkanVertexShaderSource(bool stereoRendering) { return getVertexShaderProlog(stereoRendering) + R"( layout (set = 1, binding = 1, std140) uniform PerFrame { mat4 modelMatrix; mat4 viewProjectionMatrix[2]; float scaleZ; int viewId; } perFrame; layout(location = 0) in vec3 position; layout(location = 1) in vec3 uvw_in; layout(location = 0) out vec3 uvw; layout(location = 1) out vec3 color; void main() { mat4 mvpMatrix = perFrame.viewProjectionMatrix[VIEW_ID] * perFrame.modelMatrix; gl_Position = mvpMatrix * vec4(position, 1.0); uvw = vec3(uvw_in.x, uvw_in.y, (uvw_in.z - 0.5) * perFrame.scaleZ + 0.5); color = vec3(1.0, 1.0, 0.0); })"; } [[nodiscard]] std::unique_ptr getShaderStagesForBackend( IDevice& device, const iglu::ShaderCross& shaderCross, bool stereoRendering) noexcept { switch (device.getBackendType()) { case igl::BackendType::Metal: IGL_DEBUG_ABORT("Metal is not supported"); return nullptr; // @fb-only // @fb-only // @fb-only case igl::BackendType::Vulkan: return igl::ShaderStagesCreator::fromModuleStringInput( device, getVulkanVertexShaderSource(stereoRendering).c_str(), "main", "", getVulkanFragmentShaderSource(), "main", "", nullptr); case igl::BackendType::OpenGL: { Result res; const auto vs = shaderCross.crossCompileFromVulkanSource( getVulkanVertexShaderSource(stereoRendering).c_str(), igl::ShaderStage::Vertex, &res); IGL_DEBUG_ASSERT(res.isOk(), res.message.c_str()); const auto fs = shaderCross.crossCompileFromVulkanSource( getVulkanFragmentShaderSource(), igl::ShaderStage::Fragment, &res); IGL_DEBUG_ASSERT(res.isOk(), res.message.c_str()); return igl::ShaderStagesCreator::fromModuleStringInput( device, vs.c_str(), shaderCross.entryPointName(igl::ShaderStage::Vertex), "", fs.c_str(), shaderCross.entryPointName(igl::ShaderStage::Fragment), "", nullptr); } default: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; } } [[nodiscard]] bool isDeviceCompatible(IDevice& device) noexcept { return device.hasFeature(DeviceFeatures::Multiview); } [[nodiscard]] glm::mat4 perspectiveAsymmetricFovRH(const igl::shell::Fov& fov, float nearZ, float farZ) noexcept { glm::mat4 mat; const float tanLeft = tanf(fov.angleLeft); const float tanRight = tanf(fov.angleRight); const float tanDown = tanf(fov.angleDown); const float tanUp = tanf(fov.angleUp); const float tanWidth = tanRight - tanLeft; const float tanHeight = tanUp - tanDown; mat[0][0] = 2.0f / tanWidth; mat[1][0] = 0.0f; mat[2][0] = (tanRight + tanLeft) / tanWidth; mat[3][0] = 0.0f; mat[0][1] = 0.0f; mat[1][1] = 2.0f / tanHeight; mat[2][1] = (tanUp + tanDown) / tanHeight; mat[3][1] = 0.0f; mat[0][2] = 0.0f; mat[1][2] = 0.0f; mat[2][2] = -(farZ + nearZ) / (farZ - nearZ); mat[3][2] = -2.0f * farZ * nearZ / (farZ - nearZ); mat[0][3] = 0.0f; mat[1][3] = 0.0f; mat[2][3] = -1.0f; mat[3][3] = 0.0f; return mat; } } // namespace void HelloOpenXRSession::createSamplerAndTextures(const igl::IDevice& device) { // Sampler & Texture samp0_ = device.createSamplerState( SamplerStateDesc{ .minFilter = SamplerMinMagFilter::Linear, .magFilter = SamplerMinMagFilter::Linear, .addressModeU = SamplerAddressMode::MirrorRepeat, .addressModeV = SamplerAddressMode::MirrorRepeat, .addressModeW = SamplerAddressMode::MirrorRepeat, }, nullptr); tex0_ = getPlatform().loadTexture("macbeth.png"); } void HelloOpenXRSession::initialize() noexcept { auto& device = getPlatform().getDevice(); if (!isDeviceCompatible(device)) { return; } // Vertex buffer, Index buffer and Vertex Input const BufferDesc vb0Desc{.type = BufferDesc::BufferTypeBits::Vertex, .data = kVertexData0, .length = sizeof(kVertexData0)}; vb0_ = device.createBuffer(vb0Desc, nullptr); const BufferDesc ibDesc{ .type = BufferDesc::BufferTypeBits::Index, .data = kIndexData, .length = sizeof(kIndexData)}; ib0_ = device.createBuffer(ibDesc, nullptr); const VertexInputStateDesc inputDesc = { .numAttributes = 2, .attributes = { {.bufferIndex = 0, .format = VertexAttributeFormat::Float3, .offset = offsetof(VertexPosUvw, position), .name = "position", .location = 0}, {.bufferIndex = 0, .format = VertexAttributeFormat::Float3, .offset = offsetof(VertexPosUvw, uvw), .name = "uvw_in", .location = 1}, }, .numInputBindings = 1, .inputBindings = {{.stride = sizeof(VertexPosUvw)}}, }; vertexInput0_ = device.createVertexInputState(inputDesc, nullptr); const bool stereoRendering = shellParams().viewParams.size() > 1; createSamplerAndTextures(device); const iglu::ShaderCross shaderCross(device); shaderStages_ = getShaderStagesForBackend(device, shaderCross, stereoRendering); // Command queue: backed by different types of GPU HW queues commandQueue_ = device.createCommandQueue(CommandQueueDesc{}, nullptr); // Set up vertex uniform data ub_.scaleZ = 1.0f; renderPass_ = { .colorAttachments = { { .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, #if defined(IGL_OPENXR_MR_MODE) .clearColor = {0.0, 0.0, 1.0, 0.0f}, #else .clearColor = {0.0, 0.0, 1.0, 1.0f}, #endif }, }, .depthAttachment = {.loadAction = LoadAction::Clear, .clearDepth = 1.0}, }; } void HelloOpenXRSession::updateUniformBlock() { // rotating animation static float angle = 0.0f, scaleZ = 1.0f, ss = 0.005f; angle += 0.005f; scaleZ += ss; scaleZ = scaleZ < 0.0f ? 0.0f : (scaleZ > 1.0 ? 1.0f : scaleZ); if (scaleZ <= 0.05f || scaleZ >= 1.0f) { ss *= -1.0f; } const glm::mat4 rotMat = glm::rotate(glm::mat4(1.0f), angle, glm::vec3(0.0f, 1.0f, 0.0f)) * glm::rotate(glm::mat4(1.0f), -0.2f, glm::vec3(1.0f, 0.0f, 0.0f)); ub_.modelMatrix = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.f, -8.0f)) * rotMat * glm::scale(glm::mat4(1.0f), glm::vec3(1.0f, 1.0f, scaleZ)); for (size_t i = 0; i < std::min(shellParams().viewParams.size(), size_t(2)); ++i) { const auto viewIndex = shellParams().viewParams[i].viewIndex; ub_.viewProjectionMatrix[viewIndex] = perspectiveAsymmetricFovRH(shellParams().viewParams[i].fov, 0.1f, 100.0f) * shellParams().viewParams[i].viewMatrix; ub_.viewId = viewIndex; } ub_.scaleZ = scaleZ; } void HelloOpenXRSession::update(SurfaceTextures surfaceTextures) noexcept { auto& device = getPlatform().getDevice(); if (!isDeviceCompatible(device)) { return; } updateUniformBlock(); IGL_DEBUG_ASSERT(!shellParams().viewParams.empty()); const auto viewIndex = shellParams().viewParams[0].viewIndex; Result ret; if (framebuffer_[viewIndex] == nullptr) { const FramebufferMode mode = surfaceTextures.color->getNumLayers() > 1 ? FramebufferMode::Stereo : FramebufferMode::Mono; framebuffer_[viewIndex] = getPlatform().getDevice().createFramebuffer( FramebufferDesc{ .colorAttachments = {{.texture = surfaceTextures.color}}, .depthAttachment = {.texture = surfaceTextures.depth}, .mode = mode, }, &ret); IGL_DEBUG_ASSERT(ret.isOk()); IGL_DEBUG_ASSERT(framebuffer_[viewIndex] != nullptr); } else { framebuffer_[viewIndex]->updateDrawable(surfaceTextures.color); } constexpr uint32_t textureUnit = 0; if (pipelineState_ == nullptr) { // Graphics pipeline: state batch that fully configures GPU for rendering pipelineState_ = getPlatform().getDevice().createRenderPipeline( RenderPipelineDesc{ .vertexInputState = vertexInput0_, .shaderStages = shaderStages_, .targetDesc = { .colorAttachments = { { .textureFormat = framebuffer_[viewIndex] ->getColorAttachment(0) ->getProperties() .format, }, }, .depthAttachmentFormat = framebuffer_[viewIndex]->getDepthAttachment()->getProperties().format, }, .cullMode = igl::CullMode::Back, .frontFaceWinding = igl::WindingMode::CounterClockwise, .fragmentUnitSamplerMap = {{textureUnit, IGL_NAMEHANDLE("inputImage")}}, }, nullptr); } // Command buffers (1-N per thread): create, submit and forget auto buffer = commandQueue_->createCommandBuffer(CommandBufferDesc{}, nullptr); const std::shared_ptr commands = buffer->createRenderCommandEncoder(renderPass_, framebuffer_[viewIndex]); commands->pushDebugGroupLabel("HelloOpenXRSession Commands", Color(0.0f, 1.0f, 0.0f)); commands->bindVertexBuffer(0, *vb0_); const iglu::ManagedUniformBufferInfo info = { .index = 1, .length = sizeof(UniformBlock), .uniforms = { { .name = "modelMatrix", .location = -1, .type = igl::UniformType::Mat4x4, .numElements = 1, .offset = offsetof(UniformBlock, modelMatrix), .elementStride = 0, }, { .name = "viewProjectionMatrix", .location = -1, .type = igl::UniformType::Mat4x4, .numElements = 2, .offset = offsetof(UniformBlock, viewProjectionMatrix), .elementStride = sizeof(glm::mat4), }, { .name = "scaleZ", .location = -1, .type = igl::UniformType::Float, .numElements = 1, .offset = offsetof(UniformBlock, scaleZ), .elementStride = 0, }, { .name = "viewId", .location = -1, .type = igl::UniformType::Int, .numElements = 1, .offset = offsetof(UniformBlock, viewId), .elementStride = 0, }, }, }; const auto ubo = std::make_shared(device, "perFrame", info); IGL_DEBUG_ASSERT(ubo->result.isOk()); *static_cast(ubo->getData()) = ub_; ubo->bind(device, *pipelineState_, *commands); commands->bindTexture(textureUnit, BindTarget::kFragment, tex0_.get()); commands->bindSamplerState(textureUnit, BindTarget::kFragment, samp0_.get()); commands->bindRenderPipelineState(pipelineState_); commands->bindIndexBuffer(*ib0_, IndexFormat::UInt16); commands->drawIndexed(static_cast(3u * 6u * 2u)); commands->popDebugGroupLabel(); commands->endEncoding(); if (shellParams().shouldPresent) { buffer->present(framebuffer_[viewIndex]->getColorAttachment(0)); } commandQueue_->submit(*buffer); // Guarantees ordering between command buffers } } // namespace igl::shell ================================================ FILE: shell/renderSessions/HelloOpenXRSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include #include #include #include namespace igl::shell { struct UniformBlock { glm::mat4 modelMatrix = glm::mat4(1.0); glm::mat4 viewProjectionMatrix[2]{}; float scaleZ{}; int viewId = 0; }; class HelloOpenXRSession : public RenderSession { public: explicit HelloOpenXRSession(std::shared_ptr platform) : RenderSession(std::move(platform)) {} void initialize() noexcept override; void update(SurfaceTextures surfaceTextures) noexcept override; private: RenderPassDesc renderPass_; std::shared_ptr pipelineState_; std::shared_ptr vertexInput0_; std::shared_ptr shaderStages_; std::shared_ptr vb0_, ib0_; // Buffers for vertices and indices (or constants) std::shared_ptr tex0_; std::shared_ptr samp0_; std::shared_ptr framebuffer_[2]; UniformBlock ub_; // utility fns void createSamplerAndTextures(const IDevice& /*device*/); void updateUniformBlock(); }; } // namespace igl::shell ================================================ FILE: shell/renderSessions/HelloWorldSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include namespace igl::shell { namespace { struct VertexPosColor { iglu::simdtypes::float3 position; iglu::simdtypes::float4 color; }; const VertexPosColor kVertexData[] = { {.position = {-0.6f, -0.4f, 0.0}, .color = {1.0, 0.0, 0.0, 1.0}}, {.position = {0.6f, -0.4f, 0.0}, .color = {0.0, 1.0, 0.0, 1.0}}, {.position = {0.0f, 0.6f, 0.0}, .color = {0.0, 0.0, 1.0, 1.0}}, }; const uint16_t kIndexData[] = { 2, 1, 0, }; std::string getVersion() { return {"#version 100"}; } std::string getMetalShaderSource() { return R"( using namespace metal; typedef struct { float3 position [[attribute(0)]]; float4 color [[attribute(1)]]; } VertexIn; typedef struct { float4 position [[position]]; float4 color; } VertexOut; vertex VertexOut vertexShader( uint vid [[vertex_id]], constant VertexIn * vertices [[buffer(1)]]) { VertexOut out; out.position = float4(vertices[vid].position, 1.0); out.color = vertices[vid].color; return out; } fragment float4 fragmentShader( VertexOut IN [[stage_in]]) { return IN.color; } )"; } std::string getOpenGLVertexShaderSource() { return getVersion() + R"( precision highp float; attribute vec3 position; attribute vec4 color_in; varying vec4 vColor; void main() { gl_Position = vec4(position, 1.0); vColor = color_in; })"; } std::string getOpenGLFragmentShaderSource() { return getVersion() + std::string(R"( precision highp float; varying vec4 vColor; void main() { gl_FragColor = vColor; })"); } std::string getVulkanVertexShaderSource() { return R"( layout(location = 0) in vec3 position; layout(location = 1) in vec4 color_in; layout(location = 0) out vec4 color; void main() { gl_Position = vec4(position, 1.0); color = color_in; } )"; } std::string getVulkanFragmentShaderSource() { return R"( layout(location = 0) in vec4 color; layout(location = 0) out vec4 out_FragColor; void main() { out_FragColor = color; } )"; } std::unique_ptr getShaderStagesForBackend(IDevice& device) { switch (device.getBackendType()) { case igl::BackendType::Invalid: case igl::BackendType::Custom: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; case igl::BackendType::Vulkan: return igl::ShaderStagesCreator::fromModuleStringInput(device, getVulkanVertexShaderSource().c_str(), "main", "", getVulkanFragmentShaderSource().c_str(), "main", "", nullptr); // @fb-only // @fb-only // @fb-only case igl::BackendType::Metal: return igl::ShaderStagesCreator::fromLibraryStringInput( device, getMetalShaderSource().c_str(), "vertexShader", "fragmentShader", "", nullptr); case igl::BackendType::OpenGL: return igl::ShaderStagesCreator::fromModuleStringInput(device, getOpenGLVertexShaderSource().c_str(), "main", "", getOpenGLFragmentShaderSource().c_str(), "main", "", nullptr); case igl::BackendType::D3D12: { static const char* kVS = R"( struct VSIn { float3 position : POSITION; float4 color : COLOR; }; struct VSOut { float4 position : SV_POSITION; float4 color : COLOR; }; VSOut main(VSIn v) { VSOut o; o.position = float4(v.position, 1.0); o.color = v.color; return o; } )"; static const char* kPS = R"( struct PSIn { float4 position : SV_POSITION; float4 color : COLOR; }; float4 main(PSIn i) : SV_TARGET { return i.color; } )"; return igl::ShaderStagesCreator::fromModuleStringInput( device, kVS, "main", "", kPS, "main", "", nullptr); } } IGL_UNREACHABLE_RETURN(nullptr) } } // namespace void HelloWorldSession::initialize() noexcept { auto& device = getPlatform().getDevice(); // Vertex & Index buffer vb0_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Vertex, .data = kVertexData, .length = sizeof(kVertexData)}, nullptr); IGL_DEBUG_ASSERT(vb0_ != nullptr); ib0_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Index, .data = kIndexData, .length = sizeof(kIndexData)}, nullptr); IGL_DEBUG_ASSERT(ib0_ != nullptr); vertexInput0_ = device.createVertexInputState( VertexInputStateDesc{ .numAttributes = 2, .attributes = { VertexAttribute{.bufferIndex = 1, .format = VertexAttributeFormat::Float3, .offset = offsetof(VertexPosColor, position), .name = "position", .location = 0}, VertexAttribute{.bufferIndex = 1, .format = VertexAttributeFormat::Float4, .offset = offsetof(VertexPosColor, color), .name = "color_in", .location = 1}, }, .numInputBindings = 1, .inputBindings = {{}, {.stride = sizeof(VertexPosColor)}}, }, nullptr); IGL_DEBUG_ASSERT(vertexInput0_ != nullptr); shaderStages_ = getShaderStagesForBackend(device); IGL_DEBUG_ASSERT(shaderStages_ != nullptr); // Command queue commandQueue_ = device.createCommandQueue(CommandQueueDesc{}, nullptr); IGL_DEBUG_ASSERT(commandQueue_ != nullptr); renderPass_ = { .colorAttachments = { { .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, .clearColor = getPreferredClearColor(), }, }, .depthAttachment = { .loadAction = LoadAction::Clear, .clearDepth = 1.0, }, }; } void HelloWorldSession::update(SurfaceTextures textures) noexcept { Result ret; if (framebuffer_ == nullptr) { framebuffer_ = getPlatform().getDevice().createFramebuffer( FramebufferDesc{ .colorAttachments = {{.texture = textures.color}}, .depthAttachment = {.texture = textures.depth}, .stencilAttachment = textures.depth && textures.depth->getProperties().hasStencil() ? FramebufferDesc::AttachmentDesc{.texture = textures.depth} : FramebufferDesc::AttachmentDesc{}, }, &ret); IGL_DEBUG_ASSERT(ret.isOk()); IGL_DEBUG_ASSERT(framebuffer_ != nullptr); } else { framebuffer_->updateDrawable(textures); } // Graphics pipeline if (pipelineState_ == nullptr) { pipelineState_ = getPlatform().getDevice().createRenderPipeline( RenderPipelineDesc{ .vertexInputState = vertexInput0_, .shaderStages = shaderStages_, .targetDesc = { .colorAttachments = {{.textureFormat = framebuffer_->getColorAttachment(0)->getFormat()}}, .depthAttachmentFormat = framebuffer_->getDepthAttachment()->getFormat(), .stencilAttachmentFormat = framebuffer_->getStencilAttachment() ? framebuffer_->getStencilAttachment()->getFormat() : igl::TextureFormat::Invalid, }, .cullMode = igl::CullMode::Back, .frontFaceWinding = igl::WindingMode::Clockwise, }, nullptr); IGL_DEBUG_ASSERT(pipelineState_ != nullptr); } // Command Buffers const auto buffer = commandQueue_->createCommandBuffer(CommandBufferDesc{}, nullptr); IGL_DEBUG_ASSERT(buffer != nullptr); const auto drawableSurface = framebuffer_->getColorAttachment(0); // Submit commands const std::shared_ptr commands = buffer->createRenderCommandEncoder(renderPass_, framebuffer_); IGL_DEBUG_ASSERT(commands != nullptr); if (commands) { commands->bindVertexBuffer(1, *vb0_); commands->bindRenderPipelineState(pipelineState_); commands->bindIndexBuffer(*ib0_, IndexFormat::UInt16); commands->drawIndexed(3); commands->endEncoding(); } IGL_DEBUG_ASSERT(buffer != nullptr); if (shellParams().shouldPresent) { buffer->present(drawableSurface); } IGL_DEBUG_ASSERT(commandQueue_ != nullptr); commandQueue_->submit(*buffer); RenderSession::update(textures); } } // namespace igl::shell ================================================ FILE: shell/renderSessions/HelloWorldSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include #include #include namespace igl::shell { class HelloWorldSession : public RenderSession { public: explicit HelloWorldSession(std::shared_ptr platform) : RenderSession(std::move(platform)) {} void initialize() noexcept override; void update(SurfaceTextures surfaceTextures) noexcept override; private: std::shared_ptr pipelineState_; RenderPassDesc renderPass_; std::shared_ptr shaderStages_; std::shared_ptr vertexInput0_; std::shared_ptr framebuffer_; std::shared_ptr depthTexture_; std::shared_ptr renderPipelineStateTriangle_; std::shared_ptr vb0_; std::shared_ptr ib0_; std::vector vertexUniformDescriptors_; }; } // namespace igl::shell ================================================ FILE: shell/renderSessions/ImguiSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include namespace igl::shell { void ImguiSession::initialize() noexcept { commandQueue_ = getPlatform().getDevice().createCommandQueue({}, nullptr); // Create the ImGui session imguiSession_ = std::make_unique(getPlatform().getDevice(), getPlatform().getInputDispatcher()); } void ImguiSession::update(SurfaceTextures surfaceTextures) noexcept { const igl::DeviceScope deviceScope(getPlatform().getDevice()); auto cmdBuffer = commandQueue_->createCommandBuffer({}, nullptr); const FramebufferDesc framebufferDesc = { .colorAttachments = {{.texture = surfaceTextures.color}}, }; if (outputFramebuffer_) { outputFramebuffer_->updateDrawable(surfaceTextures.color); } else { outputFramebuffer_ = getPlatform().getDevice().createFramebuffer(framebufferDesc, nullptr); } const RenderPassDesc renderPassDesc = { .colorAttachments = {{ .loadAction = igl::LoadAction::Clear, .storeAction = igl::StoreAction::Store, .clearColor = getPreferredClearColor(), }}, }; auto encoder = cmdBuffer->createRenderCommandEncoder(renderPassDesc, outputFramebuffer_); { // Draw using ImGui every frame imguiSession_->beginFrame(framebufferDesc, getPlatform().getDisplayContext().pixelsPerPoint); ImGui::ShowDemoWindow(); imguiSession_->endFrame(getPlatform().getDevice(), *encoder); } encoder->endEncoding(); if (shellParams().shouldPresent) { cmdBuffer->present(surfaceTextures.color); } commandQueue_->submit(*cmdBuffer); } } // namespace igl::shell ================================================ FILE: shell/renderSessions/ImguiSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include #include #include #include namespace igl::shell { class ImguiSession : public RenderSession { public: explicit ImguiSession(std::shared_ptr platform) : RenderSession(std::move(platform)) {} void initialize() noexcept override; void update(SurfaceTextures surfaceTextures) noexcept override; private: std::shared_ptr outputFramebuffer_; std::unique_ptr imguiSession_; }; } // namespace igl::shell ================================================ FILE: shell/renderSessions/MRTSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include #include #include #include #include #if IGL_BACKEND_OPENGL #include #endif namespace igl::shell { struct VertexPosUv { iglu::simdtypes::float3 position; // SIMD 128b aligned iglu::simdtypes::float2 uv; // SIMD 128b aligned }; static const VertexPosUv kVertexData0[] = { {.position = {-0.9f, 0.9f, 0.0}, .uv = {0.0, 1.0}}, {.position = {-0.05f, 0.9f, 0.0}, .uv = {1.0, 1.0}}, {.position = {-0.9f, -0.9f, 0.0}, .uv = {0.0, 0.0}}, {.position = {-0.05f, -0.9f, 0.0}, .uv = {1.0, 0.0}}, }; static const VertexPosUv kVertexData1[] = { {.position = {0.05f, 0.9f, 0.0}, .uv = {0.0, 1.0}}, {.position = {0.90f, 0.9f, 0.0}, .uv = {1.0, 1.0}}, {.position = {0.05f, -0.9f, 0.0}, .uv = {0.0, 0.0}}, {.position = {0.90f, -0.9f, 0.0}, .uv = {1.0, 0.0}}, }; static const uint16_t kIndexData[] = { 0, 1, 2, 1, 3, 2, }; enum class ShaderPrecision { Low, Medium, High }; static std::string getPrecisionProlog(ShaderPrecision precision) { #if IGL_BACKEND_OPENGL && IGL_OPENGL_ES switch (precision) { case ShaderPrecision::Low: return {"precision lowp float;"}; case ShaderPrecision::Medium: return {"precision mediump float;"}; case ShaderPrecision::High: return {"precision highp float;"}; } #else return std::string(); #endif } static std::string getVersionProlog() { #if IGL_BACKEND_OPENGL #if IGL_OPENGL_ES return "#version 300 es\n"; #else return "#version 410\n"; #endif #else return ""; #endif } static std::string getMetalShaderSource(int metalShaderIdx) { switch (metalShaderIdx) { case 0: return R"( #include #include #line 0 using namespace metal; struct VertexIn { float3 position [[attribute(0)]]; float2 uv [[attribute(1)]]; }; struct VertexOut { float4 position [[position]]; float2 uv; }; vertex VertexOut vertexShader( uint vid [[vertex_id]], constant VertexIn * vertices [[buffer(0)]]) { VertexOut out; out.position = float4(vertices[vid].position, 1.0); out.uv = vertices[vid].uv; return out; } struct FragmentOutput { float4 colorOutGreen [[color(0)]]; float4 colorOutRed [[color(1)]]; }; fragment FragmentOutput fragmentShader(VertexOut IN [[stage_in]], texture2d diffuseTex [[texture(0)]]) { constexpr sampler linearSampler(mag_filter::linear, min_filter::linear); FragmentOutput f; float4 c = diffuseTex.sample(linearSampler, IN.uv); f.colorOutRed.r = c.r; f.colorOutRed.g = 0.0; f.colorOutRed.b = 0.0; f.colorOutRed.a = 1.0; f.colorOutGreen.r = 0.0; f.colorOutGreen.g = c.g; f.colorOutGreen.b = 0.0; f.colorOutGreen.a = 1.0; return f; })"; default: return R"( #include #include #line 0 using namespace metal; struct VertexIn { float3 position [[attribute(0)]]; float2 uv [[attribute(1)]]; }; struct VertexOut { float4 position [[position]]; float2 uv; }; vertex VertexOut vertexShader( uint vid [[vertex_id]], constant VertexIn * vertices [[buffer(0)]]) { VertexOut out; out.position = float4(vertices[vid].position, 1.0); out.uv = vertices[vid].uv; return out; } fragment float4 fragmentShader(VertexOut IN [[stage_in]], texture2d greenTex [[texture(0)]], texture2d redTex [[texture(1)]]) { constexpr sampler linearSampler(mag_filter::linear, min_filter::linear); float4 c = greenTex.sample(linearSampler, IN.uv) + redTex.sample(linearSampler, IN.uv); return c; })"; } } static std::string getOpenGLVertexShaderSource() { return getVersionProlog() + getPrecisionProlog(ShaderPrecision::High) + R"( in vec3 position; in vec2 uv_in; out vec2 uv; void main() { gl_Position = vec4(position, 1.0); uv = uv_in; })"; } static std::string getOpenGLFragmentShaderSource(int programIndex) { if (programIndex == 0) { return getVersionProlog() + getPrecisionProlog(ShaderPrecision::High) + R"( uniform sampler2D inputImage; in vec2 uv; layout(location = 0) out vec4 colorGreen; layout(location = 1) out vec4 colorRed; void main() { vec4 c = texture(inputImage, uv); colorGreen = vec4(0., c.g, 0., 1.0); colorRed = vec4(c.r, 0., 0., 1.0); })"; } else { return getVersionProlog() + getPrecisionProlog(ShaderPrecision::High) + R"( uniform sampler2D colorRed; uniform sampler2D colorGreen; in vec2 uv; out vec4 colorOut; void main() { colorOut = texture(colorRed, uv) + texture(colorGreen, uv); })"; } } static std::string getVulkanVertexShaderSource() { return getPrecisionProlog(ShaderPrecision::High) + R"( layout(location = 0) in vec3 position; layout(location = 1) in vec2 uv_in; layout(location = 0) out vec2 uv; void main() { gl_Position = vec4(position, 1.0); uv = uv_in; })"; } static std::string getVulkanFragmentShaderSource(int programIndex) { if (programIndex == 0) { return getPrecisionProlog(ShaderPrecision::High) + R"( layout(location = 0) in vec2 uv; layout(location = 0) out vec4 colorGreen; layout(location = 1) out vec4 colorRed; layout(set = 0, binding = 0) uniform sampler2D in_texture; void main() { vec4 c = texture(in_texture, uv); colorGreen = vec4(0., c.g, 0., 1.0); colorRed = vec4(c.r, 0., 0., 1.0); })"; } else { return getPrecisionProlog(ShaderPrecision::High) + R"( layout(location = 0) in vec2 uv; layout(location = 0) out vec4 out_FragColor; layout(set = 0, binding = 0) uniform sampler2D in_texture_green; layout(set = 0, binding = 1) uniform sampler2D in_texture_red; void main() { vec2 uv1 = vec2(uv.x, 1.0-uv.y); out_FragColor = texture(in_texture_green, uv1) + texture(in_texture_red, uv1); })"; } } static std::unique_ptr createShaderStagesForBackend(const IDevice& device, int programIndex) { switch (device.getBackendType()) { case igl::BackendType::Invalid: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; case igl::BackendType::Vulkan: return igl::ShaderStagesCreator::fromModuleStringInput( device, getVulkanVertexShaderSource().c_str(), "main", "", getVulkanFragmentShaderSource(programIndex).c_str(), "main", "", nullptr); case igl::BackendType::Custom: IGL_DEBUG_ABORT("No Custom shader available"); return nullptr; // @fb-only // @fb-only // @fb-only case igl::BackendType::D3D12: { if (programIndex == 0) { // First pass: write to SV_Target0 and SV_Target1 static const char* kVS = R"( struct VSIn { float3 position: POSITION; float2 uv: TEXCOORD0; }; struct VSOut { float4 position: SV_POSITION; float2 uv: TEXCOORD0; }; VSOut main(VSIn v){ VSOut o; o.position=float4(v.position,1); o.uv=v.uv; return o; } )"; static const char* kPS = R"( Texture2D inputImage : register(t0); SamplerState s0 : register(s0); struct PSIn { float4 position: SV_POSITION; float2 uv: TEXCOORD0; }; struct PSOut { float4 colorGreen: SV_Target0; float4 colorRed: SV_Target1; }; PSOut main(PSIn i){ float4 c = inputImage.Sample(s0, i.uv); // Input PNG data arrives as BGRA, so route blue channel into the second target. PSOut o; o.colorGreen=float4(0,c.g,0,1); o.colorRed=float4(c.b,0,0,1); return o; } )"; return igl::ShaderStagesCreator::fromModuleStringInput( device, kVS, "main", "", kPS, "main", "", nullptr); } else { // Second pass: sample two textures and output sum static const char* kVS = R"( struct VSIn { float3 position: POSITION; float2 uv: TEXCOORD0; }; struct VSOut { float4 position: SV_POSITION; float2 uv: TEXCOORD0; }; VSOut main(VSIn v){ VSOut o; o.position=float4(v.position,1); o.uv=v.uv; return o; } )"; static const char* kPS = R"( Texture2D colorGreen : register(t0); Texture2D colorRed : register(t1); SamplerState s0 : register(s0); struct PSIn { float4 position: SV_POSITION; float2 uv: TEXCOORD0; }; float4 main(PSIn i) : SV_Target { float2 uv1=float2(i.uv.x, 1.0 - i.uv.y); return colorGreen.Sample(s0, uv1) + colorRed.Sample(s0, uv1); } )"; return igl::ShaderStagesCreator::fromModuleStringInput( device, kVS, "main", "", kPS, "main", "", nullptr); } } case igl::BackendType::OpenGL: return igl::ShaderStagesCreator::fromModuleStringInput( device, getOpenGLVertexShaderSource().c_str(), "main", "", getOpenGLFragmentShaderSource(programIndex).c_str(), "main", "", nullptr); case igl::BackendType::Metal: return igl::ShaderStagesCreator::fromLibraryStringInput( device, getMetalShaderSource(programIndex).c_str(), "vertexShader", "fragmentShader", "", nullptr); } IGL_UNREACHABLE_RETURN(nullptr) } static bool isDeviceCompatible(IDevice& device) noexcept { return device.hasFeature(DeviceFeatures::MultipleRenderTargets); } void MRTSession::initialize() noexcept { auto& device = getPlatform().getDevice(); if (!isDeviceCompatible(device)) { return; } // Vertex buffer, Index buffer and Vertex Input vb0_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Vertex, .data = kVertexData0, .length = sizeof(kVertexData0)}, nullptr); vb1_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Vertex, .data = kVertexData1, .length = sizeof(kVertexData1)}, nullptr); ib0_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Index, .data = kIndexData, .length = sizeof(kIndexData)}, nullptr); vertexInput_ = device.createVertexInputState( VertexInputStateDesc{ .numAttributes = 2, .attributes = { VertexAttribute{.bufferIndex = 0, .format = VertexAttributeFormat::Float3, .offset = offsetof(VertexPosUv, position), .name = "position", .location = 0}, VertexAttribute{.bufferIndex = 0, .format = VertexAttributeFormat::Float2, .offset = offsetof(VertexPosUv, uv), .name = "uv_in", .location = 1}, }, .numInputBindings = 1, .inputBindings = {{.stride = sizeof(VertexPosUv)}}, }, nullptr); // Sampler & Texture samp0_ = device.createSamplerState( SamplerStateDesc{ .minFilter = SamplerMinMagFilter::Linear, .magFilter = SamplerMinMagFilter::Linear, .debugName = "Sampler: linear", }, nullptr); tex0_ = getPlatform().loadTexture("igl.png"); shaderStagesMRT_ = createShaderStagesForBackend(device, 0); shaderStagesDisplayLast_ = createShaderStagesForBackend(device, 1); commandQueue_ = device.createCommandQueue({}, nullptr); tex0_->generateMipmap(*commandQueue_); renderPassMRT_ = { .colorAttachments = {{ { .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, .clearColor = getPreferredClearColor(), }, { .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, .clearColor = getPreferredClearColor(), }, }}, }; renderPassDisplayLast_ = { .colorAttachments = {{ { .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, .clearColor = getPreferredClearColor(), }, }}, }; } // NOLINTNEXTLINE(facebook-hte-ConstantArgumentPassByValue) void MRTSession::update(const igl::SurfaceTextures surfaceTextures) noexcept { auto& device = getPlatform().getDevice(); if (!isDeviceCompatible(device)) { return; } createOrUpdateFramebufferMRT(surfaceTextures); const size_t textureUnit = 0; // Graphics pipeline: state batch that fully configures GPU for rendering if (pipelineStateMRT_ == nullptr) { pipelineStateMRT_ = device.createRenderPipeline( RenderPipelineDesc{ .vertexInputState = vertexInput_, .shaderStages = shaderStagesMRT_, .targetDesc = { .colorAttachments = { { .textureFormat = surfaceTextures.color->getProperties().format, .blendEnabled = true, .rgbBlendOp = BlendOp::Add, .alphaBlendOp = BlendOp::Add, .srcRGBBlendFactor = BlendFactor::SrcAlpha, .srcAlphaBlendFactor = BlendFactor::SrcAlpha, .dstRGBBlendFactor = BlendFactor::OneMinusSrcAlpha, .dstAlphaBlendFactor = BlendFactor::OneMinusSrcAlpha, }, { .textureFormat = surfaceTextures.color->getProperties().format, .blendEnabled = true, .rgbBlendOp = BlendOp::Add, .alphaBlendOp = BlendOp::Add, .srcRGBBlendFactor = BlendFactor::SrcAlpha, .srcAlphaBlendFactor = BlendFactor::SrcAlpha, .dstRGBBlendFactor = BlendFactor::OneMinusSrcAlpha, .dstAlphaBlendFactor = BlendFactor::OneMinusSrcAlpha, }, }, }, .cullMode = igl::CullMode::Back, .frontFaceWinding = igl::WindingMode::Clockwise, .fragmentUnitSamplerMap = {{textureUnit, IGL_NAMEHANDLE("inputImage")}}, }, nullptr); } const std::shared_ptr buffer = commandQueue_->createCommandBuffer({}, nullptr); auto commands = buffer->createRenderCommandEncoder(renderPassMRT_, framebufferMRT_); commands->bindIndexBuffer(*ib0_, IndexFormat::UInt16); // Draw call 0 // clang-format off commands->bindVertexBuffer(0, *vb0_); commands->bindRenderPipelineState(pipelineStateMRT_); commands->bindTexture(textureUnit, BindTarget::kFragment, tex0_.get()); commands->bindSamplerState(textureUnit, BindTarget::kFragment, samp0_.get()); commands->drawIndexed(6); // clang-format on // Draw call 1 // clang-format off commands->bindVertexBuffer(0, *vb1_); commands->drawIndexed(6); // clang-format on commands->endEncoding(); createOrUpdateFramebufferDisplayLast(surfaceTextures); if (pipelineStateLastDisplay_ == nullptr) { pipelineStateLastDisplay_ = device.createRenderPipeline( RenderPipelineDesc{ .vertexInputState = vertexInput_, .shaderStages = shaderStagesDisplayLast_, .targetDesc = { .colorAttachments = { { .textureFormat = surfaceTextures.color->getProperties().format, }, }, }, .cullMode = igl::CullMode::Back, .frontFaceWinding = igl::WindingMode::Clockwise, .fragmentUnitSamplerMap = { {textureUnit, IGL_NAMEHANDLE("colorRed")}, {textureUnit + 1, IGL_NAMEHANDLE("colorGreen")}, }, }, nullptr); } // Command buffers (1-N per thread): create, submit and forget commands = buffer->createRenderCommandEncoder(renderPassDisplayLast_, framebufferDisplayLast_); commands->bindIndexBuffer(*ib0_, IndexFormat::UInt16); // Draw call 0 // clang-format off commands->bindRenderPipelineState(pipelineStateLastDisplay_); const auto green = framebufferMRT_->getColorAttachment(0); commands->bindTexture(textureUnit, BindTarget::kFragment, green.get()); commands->bindSamplerState(textureUnit, BindTarget::kFragment, samp0_.get()); const auto red = framebufferMRT_->getColorAttachment(1); commands->bindTexture(textureUnit+1, BindTarget::kFragment, red.get()); commands->bindSamplerState(textureUnit+1, BindTarget::kFragment, samp0_.get()); commands->bindVertexBuffer(0, *vb0_); commands->drawIndexed(6); commands->bindVertexBuffer(0, *vb1_); commands->drawIndexed(6); // clang-format on commands->endEncoding(); if (shellParams().shouldPresent) { buffer->present(surfaceTextures.color); } commandQueue_->submit(*buffer); // Guarantees ordering between command buffers } std::shared_ptr MRTSession::createTexture2D(const std::shared_ptr& tex) { const auto dimensions = tex->getDimensions(); TextureDesc desc = TextureDesc::new2D(tex->getProperties().format, dimensions.width, dimensions.height, TextureDesc::TextureUsageBits::Attachment | TextureDesc::TextureUsageBits::Sampled); desc.debugName = "shell/renderSessions/MRTSession.cpp:MRTSession::createTexture2D()"; return getPlatform().getDevice().createTexture(desc, nullptr); } void MRTSession::createOrUpdateFramebufferDisplayLast(const igl::SurfaceTextures& surfaceTextures) { if (framebufferDisplayLast_) { framebufferDisplayLast_->updateDrawable(surfaceTextures.color); return; } // Framebuffer & Texture const FramebufferDesc framebufferDesc = { .colorAttachments = {{.texture = surfaceTextures.color}}, }; framebufferDisplayLast_ = getPlatform().getDevice().createFramebuffer(framebufferDesc, nullptr); } void MRTSession::createOrUpdateFramebufferMRT(const igl::SurfaceTextures& surfaceTextures) { if (framebufferMRT_) { return; } if (tex1_ == nullptr) { tex1_ = createTexture2D(surfaceTextures.color); } if (tex2_ == nullptr) { tex2_ = createTexture2D(surfaceTextures.color); } // Framebuffer & Texture const FramebufferDesc framebufferDesc = { .colorAttachments = { {.texture = tex1_}, {.texture = tex2_}, }, }; framebufferMRT_ = getPlatform().getDevice().createFramebuffer(framebufferDesc, nullptr); } } // namespace igl::shell ================================================ FILE: shell/renderSessions/MRTSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include #include namespace igl::shell { class MRTSession : public RenderSession { public: explicit MRTSession(std::shared_ptr platform) : RenderSession(std::move(platform)) {} void initialize() noexcept override; void update(SurfaceTextures surfaceTextures) noexcept override; private: std::shared_ptr createTexture2D(const std::shared_ptr& tex); void createOrUpdateFramebufferDisplayLast(const igl::SurfaceTextures& surfaceTextures); void createOrUpdateFramebufferMRT(const igl::SurfaceTextures& surfaceTextures); private: // for the MRT pass RenderPassDesc renderPassMRT_; std::shared_ptr framebufferMRT_; std::shared_ptr pipelineStateMRT_; std::shared_ptr shaderStagesMRT_; // for last display pass RenderPassDesc renderPassDisplayLast_; std::shared_ptr framebufferDisplayLast_; std::shared_ptr pipelineStateLastDisplay_; std::shared_ptr shaderStagesDisplayLast_; std::shared_ptr vertexInput_; std::shared_ptr vb0_, vb1_, ib0_; std::shared_ptr tex0_; // Textures std::shared_ptr tex1_; // for MRT attachment 0 std::shared_ptr tex2_; // for MRT attachment 1 std::shared_ptr samp0_; // Samplers for texture (mipmap, clamp, linear etc.) }; } // namespace igl::shell ================================================ FILE: shell/renderSessions/MeshShaderTriangleSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include namespace igl::shell { namespace { std::string getMetalTaskShaderSource() { return R"( using namespace metal; [[object]] void taskMain(mesh_grid_properties meshGridProperties) { meshGridProperties.set_threadgroups_per_grid(uint3(1, 1, 1)); } )"; } std::string getMetalMeshShaderSource() { return R"( using namespace metal; struct VertexOut{ float4 position [[position]]; float4 color [[user(locn0)]]; }; struct UniformBlock { float4x4 mvpMatrix; }; using TriangleMeshType = metal::mesh; constant float4 vertexData[3] = {{-0.6f, -0.4f, 0.0, 1.0}, {0.6f, -0.4f, 0.0, 1.0}, {0.0f, 0.6f, 0.0, 1.0}}; constant float4 colorData[3] = {{1.0, 0.0, 0.0, 1.0}, {0.0, 1.0, 0.0, 1.0}, {0.0, 0.0, 1.0, 1.0}}; [[mesh]] void meshMain(TriangleMeshType output, constant UniformBlock &vUniform[[buffer(1)]]) { output.set_primitive_count(1); for (int i = 0; i != 3; ++i){ VertexOut v; v.position = vUniform.mvpMatrix * vertexData[i]; v.color = colorData[i]; output.set_vertex(i, v); } output.set_index(0, 0); output.set_index(1, 1); output.set_index(2, 2); } )"; } std::string getMetalFragmentShaderSource() { return R"( using namespace metal; struct FS_IN{ float4 color [[user(locn0)]]; }; fragment float4 fragmentMain(FS_IN in [[stage_in]]) { return in.color; } )"; } std::string getVulkanTaskShaderSource() { return R"( #version 460 #extension GL_EXT_mesh_shader : enable layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; void main(){ EmitMeshTasksEXT(1,1,1); } )"; } std::string getVulkanMeshShaderSource() { return R"( #version 460 #extension GL_EXT_mesh_shader : enable layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; layout(set = 1, binding = 1, std140) uniform UniformBlock { mat4 mvpMatrix; }; layout(location = 0) out PerVertexData {vec4 color; } v_out[]; layout(triangles, max_vertices = 3, max_primitives = 1) out; const vec4 vertexData[3] = {{-0.6f, -0.4f, 0.0, 1.0}, {0.6f, -0.4f, 0.0, 1.0}, {0.0f, 0.6f, 0.0, 1.0}}; const vec4 colorData[3] = {{1.0, 0.0, 0.0, 1.0}, {0.0, 1.0, 0.0, 1.0}, {0.0, 0.0, 1.0, 1.0}}; void main(){ SetMeshOutputsEXT(3, 1); for (int i = 0; i != 3; ++i) { gl_MeshVerticesEXT[i].gl_Position = mvpMatrix * vertexData[i]; v_out[i].color = colorData[i]; } gl_PrimitiveTriangleIndicesEXT[0] = uvec3(0, 1, 2); } )"; } std::string getVulkanFragmentShaderSource() { return R"( #version 460 layout(location = 0) in vec4 color; layout(location = 0) out vec4 out_FragColor; void main() { out_FragColor = color; } )"; } std::unique_ptr getShaderStagesForBackend(IDevice& device) { std::string taskShader, meshShader, fragmentShader; std::string taskShaderEntryPoint, meshShaderEntryPoint, fragmentShaderEntryPoint; switch (device.getBackendType()) { case igl::BackendType::Metal: taskShader = getMetalTaskShaderSource(); meshShader = getMetalMeshShaderSource(); fragmentShader = getMetalFragmentShaderSource(); taskShaderEntryPoint = "taskMain"; meshShaderEntryPoint = "meshMain"; fragmentShaderEntryPoint = "fragmentMain"; break; case igl::BackendType::Vulkan: taskShader = getVulkanTaskShaderSource(); meshShader = getVulkanMeshShaderSource(); fragmentShader = getVulkanFragmentShaderSource(); taskShaderEntryPoint = "main"; meshShaderEntryPoint = "main"; fragmentShaderEntryPoint = "main"; break; default: break; } if (taskShader.empty() || meshShader.empty() || fragmentShader.empty()) { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); return nullptr; } auto taskModule = igl::ShaderModuleCreator::fromStringInput( device, taskShader.c_str(), {.stage = igl::ShaderStage::Task, .entryPoint = taskShaderEntryPoint}, "task shader", nullptr); auto meshModule = igl::ShaderModuleCreator::fromStringInput( device, meshShader.c_str(), {.stage = igl::ShaderStage::Mesh, .entryPoint = meshShaderEntryPoint}, "mesh shader", nullptr); auto fragmentModule = igl::ShaderModuleCreator::fromStringInput( device, fragmentShader.c_str(), {.stage = igl::ShaderStage::Fragment, .entryPoint = fragmentShaderEntryPoint}, "fragment shader", nullptr); Result result; auto shaderStages = igl::ShaderStagesCreator::fromMeshRenderModules( device, taskModule, meshModule, fragmentModule, &result); IGL_DEBUG_ASSERT(shaderStages); return shaderStages; } } // namespace void MeshShaderTriangleSession::initialize() noexcept { auto& device = getPlatform().getDevice(); if (!device.hasFeature(DeviceFeatures::MeshShaders)) { IGL_DEBUG_ABORT("Mesh shaders are not supported.\n"); return; }; shaderStages_ = getShaderStagesForBackend(device); IGL_DEBUG_ASSERT(shaderStages_ != nullptr); BufferDesc uboDesc; uboDesc.type = igl::BufferDesc::BufferTypeBits::Uniform; uboDesc.storage = igl::ResourceStorage::Shared; uboDesc.length = sizeof(glm::mat4); ubo_ = device.createBuffer(uboDesc, nullptr); IGL_DEBUG_ASSERT(ubo_ != nullptr); // Command queue commandQueue_ = device.createCommandQueue({}, nullptr); IGL_DEBUG_ASSERT(commandQueue_ != nullptr); renderPass_.colorAttachments = {{ .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, .clearColor = getPreferredClearColor(), }}; renderPass_.depthAttachment = { .loadAction = LoadAction::Clear, .clearDepth = 1.0, }; } void MeshShaderTriangleSession::update(SurfaceTextures surfaceTextures) noexcept { Result ret; if (!framebuffer_) { const FramebufferDesc framebufferDesc = { .colorAttachments = {{.texture = surfaceTextures.color}}, .depthAttachment = {.texture = surfaceTextures.depth}, .stencilAttachment = (surfaceTextures.depth && surfaceTextures.depth->getProperties().hasStencil()) ? igl::FramebufferDesc::AttachmentDesc{.texture = surfaceTextures.depth} : igl::FramebufferDesc::AttachmentDesc{}, }; framebuffer_ = getPlatform().getDevice().createFramebuffer(framebufferDesc, &ret); IGL_DEBUG_ASSERT(ret.isOk()); IGL_DEBUG_ASSERT(framebuffer_ != nullptr); } else { framebuffer_->updateDrawable(surfaceTextures); } // Graphics pipeline if (!pipelineState_) { const RenderPipelineDesc graphicsDesc = { .shaderStages = shaderStages_, .targetDesc = { .colorAttachments = {{.textureFormat = framebuffer_->getColorAttachment(0)->getFormat()}}, .depthAttachmentFormat = framebuffer_->getDepthAttachment()->getFormat(), .stencilAttachmentFormat = framebuffer_->getStencilAttachment() ? framebuffer_->getStencilAttachment()->getFormat() : igl::TextureFormat::Invalid, }, .cullMode = igl::CullMode::Disabled, .frontFaceWinding = igl::WindingMode::Clockwise, }; pipelineState_ = getPlatform().getDevice().createRenderPipeline(graphicsDesc, &ret); IGL_DEBUG_ASSERT(ret.isOk()); IGL_DEBUG_ASSERT(pipelineState_ != nullptr); } // Command Buffers auto buffer = commandQueue_->createCommandBuffer({}, &ret); IGL_DEBUG_ASSERT(ret.isOk()); IGL_DEBUG_ASSERT(buffer != nullptr); auto drawableSurface = framebuffer_->getColorAttachment(0); frameNum_ = (++frameNum_) % 360; const float angle = (float)frameNum_ * M_PI / 180.0f; const glm::mat4 matrix = glm::rotate(glm::mat4(1.0f), angle, glm::vec3(0.0f, 0.0f, 1.0f)); ubo_->upload(&matrix, {sizeof(matrix)}); // Submit commands const std::shared_ptr commands = buffer->createRenderCommandEncoder(renderPass_, framebuffer_); IGL_DEBUG_ASSERT(commands != nullptr); commands->bindRenderPipelineState(pipelineState_); commands->bindBuffer(1, BindTarget::kMesh, ubo_.get()); commands->drawMeshTasks({1, 1, 1}, {1, 1, 1}, {1, 1, 1}); commands->endEncoding(); IGL_DEBUG_ASSERT(buffer != nullptr); if (shellParams().shouldPresent) { buffer->present(drawableSurface); } IGL_DEBUG_ASSERT(commandQueue_ != nullptr); commandQueue_->submit(*buffer); RenderSession::update(surfaceTextures); } } // namespace igl::shell ================================================ FILE: shell/renderSessions/MeshShaderTriangleSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include #include #include namespace igl::shell { class MeshShaderTriangleSession : public RenderSession { public: explicit MeshShaderTriangleSession(std::shared_ptr platform) : RenderSession(std::move(platform)) {} void initialize() noexcept override; void update(SurfaceTextures surfaceTextures) noexcept override; private: std::shared_ptr pipelineState_; RenderPassDesc renderPass_; std::shared_ptr shaderStages_; std::shared_ptr framebuffer_; std::shared_ptr ubo_; int frameNum_ = 0; }; } // namespace igl::shell ================================================ FILE: shell/renderSessions/MultiDrawIndexedIndirectSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include namespace igl::shell { namespace { struct DrawElementsIndirectCommand { uint32_t count; uint32_t instanceCount; uint32_t firstIndex; int32_t baseVertex; uint32_t reservedMustBeZero; }; struct VertexPosColor { iglu::simdtypes::float3 position; iglu::simdtypes::float4 color; }; // Triangle (red) at left, Square (green) at center, Pentagon (blue) at right. // All shapes share one vertex buffer; index buffer selects which vertices to draw. // clang-format off VertexPosColor vertexData[] = { // --- Triangle (3 vertices, red) --- // Vertices 0-2 {.position = {-0.9f, 0.0f, 0.0f}, .color = {1.0f, 0.0f, 0.0f, 1.0f}}, {.position = {-0.5f, 0.0f, 0.0f}, .color = {1.0f, 0.0f, 0.0f, 1.0f}}, {.position = {-0.7f, 0.4f, 0.0f}, .color = {1.0f, 0.0f, 0.0f, 1.0f}}, // --- Square (4 vertices, green) --- // Vertices 3-6 {.position = {-0.2f, -0.2f, 0.0f}, .color = {0.0f, 1.0f, 0.0f, 1.0f}}, {.position = {0.2f, -0.2f, 0.0f}, .color = {0.0f, 1.0f, 0.0f, 1.0f}}, {.position = {0.2f, 0.2f, 0.0f}, .color = {0.0f, 1.0f, 0.0f, 1.0f}}, {.position = {-0.2f, 0.2f, 0.0f}, .color = {0.0f, 1.0f, 0.0f, 1.0f}}, // --- Pentagon (5 vertices, blue) --- // Vertices 7-11 {.position = {0.7f, 0.35f, 0.0f}, .color = {0.0f, 0.0f, 1.0f, 1.0f}}, {.position = {0.52f, 0.05f, 0.0f}, .color = {0.0f, 0.0f, 1.0f, 1.0f}}, {.position = {0.58f, -0.3f, 0.0f}, .color = {0.0f, 0.0f, 1.0f, 1.0f}}, {.position = {0.82f, -0.3f, 0.0f}, .color = {0.0f, 0.0f, 1.0f, 1.0f}}, {.position = {0.88f, 0.05f, 0.0f}, .color = {0.0f, 0.0f, 1.0f, 1.0f}}, }; // Index data: triangle (3 indices), square as 2 triangles (6 indices), // pentagon as 3 triangles (9 indices). uint16_t indexData[] = { // Triangle (indices 0-2, referencing vertices 0-2) 0, 1, 2, // Square (indices 3-8, referencing vertices 3-6, two triangles) 3, 4, 5, 3, 5, 6, // Pentagon (indices 9-17, referencing vertices 7-11, three triangles) 7, 8, 9, 7, 9, 10, 7, 10, 11, }; // clang-format on std::string getVersion() { return {"#version 100"}; } std::string getMetalShaderSource() { return R"( using namespace metal; typedef struct { float3 position [[attribute(0)]]; float4 color [[attribute(1)]]; } VertexIn; typedef struct { float4 position [[position]]; float4 color; } VertexOut; vertex VertexOut vertexShader( uint vid [[vertex_id]], constant VertexIn * vertices [[buffer(1)]]) { VertexOut out; out.position = float4(vertices[vid].position, 1.0); out.color = vertices[vid].color; return out; } fragment float4 fragmentShader( VertexOut IN [[stage_in]]) { return IN.color; } )"; } std::string getOpenGLVertexShaderSource() { return getVersion() + R"( precision highp float; attribute vec3 position; attribute vec4 color_in; varying vec4 vColor; void main() { gl_Position = vec4(position, 1.0); vColor = color_in; })"; } std::string getOpenGLFragmentShaderSource() { return getVersion() + std::string(R"( precision highp float; varying vec4 vColor; void main() { gl_FragColor = vColor; })"); } std::string getVulkanVertexShaderSource() { return R"( layout(location = 0) in vec3 position; layout(location = 1) in vec4 color_in; layout(location = 0) out vec4 color; void main() { gl_Position = vec4(position, 1.0); color = color_in; } )"; } std::string getVulkanFragmentShaderSource() { return R"( layout(location = 0) in vec4 color; layout(location = 0) out vec4 out_FragColor; void main() { out_FragColor = color; } )"; } std::unique_ptr getShaderStagesForBackend(IDevice& device) { switch (device.getBackendType()) { case igl::BackendType::Invalid: case igl::BackendType::Custom: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; case igl::BackendType::Vulkan: return igl::ShaderStagesCreator::fromModuleStringInput(device, getVulkanVertexShaderSource().c_str(), "main", "", getVulkanFragmentShaderSource().c_str(), "main", "", nullptr); // @fb-only // @fb-only // @fb-only case igl::BackendType::Metal: return igl::ShaderStagesCreator::fromLibraryStringInput( device, getMetalShaderSource().c_str(), "vertexShader", "fragmentShader", "", nullptr); case igl::BackendType::OpenGL: return igl::ShaderStagesCreator::fromModuleStringInput(device, getOpenGLVertexShaderSource().c_str(), "main", "", getOpenGLFragmentShaderSource().c_str(), "main", "", nullptr); case igl::BackendType::D3D12: { static const char* kVS = R"( struct VSIn { float3 position : POSITION; float4 color : COLOR; }; struct VSOut { float4 position : SV_POSITION; float4 color : COLOR; }; VSOut main(VSIn v) { VSOut o; o.position = float4(v.position, 1.0); o.color = v.color; return o; } )"; static const char* kPS = R"( struct PSIn { float4 position : SV_POSITION; float4 color : COLOR; }; float4 main(PSIn i) : SV_TARGET { return i.color; } )"; return igl::ShaderStagesCreator::fromModuleStringInput( device, kVS, "main", "", kPS, "main", "", nullptr); } } IGL_UNREACHABLE_RETURN(nullptr) } } // namespace void MultiDrawIndexedIndirectSession::initialize() noexcept { auto& device = getPlatform().getDevice(); // Vertex buffer (all shapes share one buffer) vertexBuffer_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Vertex, .data = vertexData, .length = sizeof(vertexData)}, nullptr); IGL_DEBUG_ASSERT(vertexBuffer_ != nullptr); // Index buffer (indices for all shapes consecutively) indexBuffer_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Index, .data = indexData, .length = sizeof(indexData)}, nullptr); IGL_DEBUG_ASSERT(indexBuffer_ != nullptr); // Indirect buffer with 3 DrawElementsIndirectCommand entries { DrawElementsIndirectCommand indirectCommands[3]; // Command 0: Triangle (3 indices starting at firstIndex=0, baseVertex=0) indirectCommands[0].count = 3; indirectCommands[0].instanceCount = 1; indirectCommands[0].firstIndex = 0; indirectCommands[0].baseVertex = 0; indirectCommands[0].reservedMustBeZero = 0; // Command 1: Square (6 indices starting at firstIndex=3, baseVertex=0) indirectCommands[1].count = 6; indirectCommands[1].instanceCount = 1; indirectCommands[1].firstIndex = 3; indirectCommands[1].baseVertex = 0; indirectCommands[1].reservedMustBeZero = 0; // Command 2: Pentagon (9 indices starting at firstIndex=9, baseVertex=0) indirectCommands[2].count = 9; indirectCommands[2].instanceCount = 1; indirectCommands[2].firstIndex = 9; indirectCommands[2].baseVertex = 0; indirectCommands[2].reservedMustBeZero = 0; BufferDesc indirectBufDesc; indirectBufDesc.type = BufferDesc::BufferTypeBits::Storage | BufferDesc::BufferTypeBits::Indirect; indirectBufDesc.data = indirectCommands; indirectBufDesc.length = sizeof(indirectCommands); indirectBuffer_ = device.createBuffer(indirectBufDesc, nullptr); IGL_DEBUG_ASSERT(indirectBuffer_ != nullptr); } // Vertex input state vertexInputState_ = device.createVertexInputState( VertexInputStateDesc{ .numAttributes = 2, .attributes = { VertexAttribute{.bufferIndex = 1, .format = VertexAttributeFormat::Float3, .offset = offsetof(VertexPosColor, position), .name = "position", .location = 0}, VertexAttribute{.bufferIndex = 1, .format = VertexAttributeFormat::Float4, .offset = offsetof(VertexPosColor, color), .name = "color_in", .location = 1}, }, .numInputBindings = 1, .inputBindings = {{}, {.stride = sizeof(VertexPosColor)}}, }, nullptr); IGL_DEBUG_ASSERT(vertexInputState_ != nullptr); // Shaders shaderStages_ = getShaderStagesForBackend(device); IGL_DEBUG_ASSERT(shaderStages_ != nullptr); // Command queue commandQueue_ = device.createCommandQueue(CommandQueueDesc{}, nullptr); IGL_DEBUG_ASSERT(commandQueue_ != nullptr); // Render pass renderPass_ = { .colorAttachments = { { .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, .clearColor = getPreferredClearColor(), }, }, .depthAttachment = { .loadAction = LoadAction::Clear, .clearDepth = 1.0, }, }; } void MultiDrawIndexedIndirectSession::update(SurfaceTextures textures) noexcept { Result ret; // Create/update framebuffer if (framebuffer_ == nullptr) { framebuffer_ = getPlatform().getDevice().createFramebuffer( FramebufferDesc{ .colorAttachments = {{.texture = textures.color}}, .depthAttachment = {.texture = textures.depth}, .stencilAttachment = textures.depth && textures.depth->getProperties().hasStencil() ? FramebufferDesc::AttachmentDesc{.texture = textures.depth} : FramebufferDesc::AttachmentDesc{}, }, &ret); IGL_DEBUG_ASSERT(ret.isOk()); IGL_DEBUG_ASSERT(framebuffer_ != nullptr); } else { framebuffer_->updateDrawable(textures); } // Graphics pipeline (cached) if (pipelineState_ == nullptr) { pipelineState_ = getPlatform().getDevice().createRenderPipeline( RenderPipelineDesc{ .vertexInputState = vertexInputState_, .shaderStages = shaderStages_, .targetDesc = { .colorAttachments = {{.textureFormat = framebuffer_->getColorAttachment(0)->getFormat()}}, .depthAttachmentFormat = framebuffer_->getDepthAttachment()->getFormat(), .stencilAttachmentFormat = framebuffer_->getStencilAttachment() ? framebuffer_->getStencilAttachment()->getFormat() : igl::TextureFormat::Invalid, }, .cullMode = igl::CullMode::Back, .frontFaceWinding = igl::WindingMode::CounterClockwise, }, nullptr); IGL_DEBUG_ASSERT(pipelineState_ != nullptr); } // Command buffer auto buffer = commandQueue_->createCommandBuffer(CommandBufferDesc{}, nullptr); IGL_DEBUG_ASSERT(buffer != nullptr); auto drawableSurface = framebuffer_->getColorAttachment(0); // Render commands const std::shared_ptr commands = buffer->createRenderCommandEncoder(renderPass_, framebuffer_); IGL_DEBUG_ASSERT(commands != nullptr); if (commands) { commands->bindVertexBuffer(1, *vertexBuffer_); commands->bindRenderPipelineState(pipelineState_); commands->bindIndexBuffer(*indexBuffer_, IndexFormat::UInt16); // Issue all 3 draw calls (triangle, square, pentagon) from the indirect buffer commands->multiDrawIndexedIndirect(*indirectBuffer_, 0, 3, sizeof(DrawElementsIndirectCommand)); commands->endEncoding(); } IGL_DEBUG_ASSERT(buffer != nullptr); if (shellParams().shouldPresent) { buffer->present(drawableSurface); } IGL_DEBUG_ASSERT(commandQueue_ != nullptr); commandQueue_->submit(*buffer); RenderSession::update(textures); } } // namespace igl::shell ================================================ FILE: shell/renderSessions/MultiDrawIndexedIndirectSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include #include #include namespace igl::shell { class MultiDrawIndexedIndirectSession : public RenderSession { public: explicit MultiDrawIndexedIndirectSession(std::shared_ptr platform) : RenderSession(std::move(platform)) {} void initialize() noexcept override; void update(SurfaceTextures surfaceTextures) noexcept override; private: std::shared_ptr pipelineState_; std::shared_ptr vertexBuffer_; std::shared_ptr indexBuffer_; std::shared_ptr indirectBuffer_; std::shared_ptr vertexInputState_; std::shared_ptr shaderStages_; RenderPassDesc renderPass_; }; } // namespace igl::shell ================================================ FILE: shell/renderSessions/ScissorTestSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include namespace igl::shell { namespace { struct VertexPosColor { iglu::simdtypes::float3 position; iglu::simdtypes::float4 color; }; // Full-screen quad covering the entire NDC range [-1, 1]. // We draw this quad 4 times, each with a different solid color and scissor rect. // The scissor rectangles will clip each draw to a different quadrant. // RED quad (top-left quadrant) VertexPosColor redQuadData[] = { {.position = {-1.0f, -1.0f, 0.0f}, .color = {1.0f, 0.0f, 0.0f, 1.0f}}, {.position = {1.0f, -1.0f, 0.0f}, .color = {1.0f, 0.0f, 0.0f, 1.0f}}, {.position = {1.0f, 1.0f, 0.0f}, .color = {1.0f, 0.0f, 0.0f, 1.0f}}, {.position = {-1.0f, 1.0f, 0.0f}, .color = {1.0f, 0.0f, 0.0f, 1.0f}}, }; // GREEN quad (top-right quadrant) VertexPosColor greenQuadData[] = { {.position = {-1.0f, -1.0f, 0.0f}, .color = {0.0f, 1.0f, 0.0f, 1.0f}}, {.position = {1.0f, -1.0f, 0.0f}, .color = {0.0f, 1.0f, 0.0f, 1.0f}}, {.position = {1.0f, 1.0f, 0.0f}, .color = {0.0f, 1.0f, 0.0f, 1.0f}}, {.position = {-1.0f, 1.0f, 0.0f}, .color = {0.0f, 1.0f, 0.0f, 1.0f}}, }; // BLUE quad (bottom-left quadrant) VertexPosColor blueQuadData[] = { {.position = {-1.0f, -1.0f, 0.0f}, .color = {0.0f, 0.0f, 1.0f, 1.0f}}, {.position = {1.0f, -1.0f, 0.0f}, .color = {0.0f, 0.0f, 1.0f, 1.0f}}, {.position = {1.0f, 1.0f, 0.0f}, .color = {0.0f, 0.0f, 1.0f, 1.0f}}, {.position = {-1.0f, 1.0f, 0.0f}, .color = {0.0f, 0.0f, 1.0f, 1.0f}}, }; // YELLOW quad (bottom-right quadrant) VertexPosColor yellowQuadData[] = { {.position = {-1.0f, -1.0f, 0.0f}, .color = {1.0f, 1.0f, 0.0f, 1.0f}}, {.position = {1.0f, -1.0f, 0.0f}, .color = {1.0f, 1.0f, 0.0f, 1.0f}}, {.position = {1.0f, 1.0f, 0.0f}, .color = {1.0f, 1.0f, 0.0f, 1.0f}}, {.position = {-1.0f, 1.0f, 0.0f}, .color = {1.0f, 1.0f, 0.0f, 1.0f}}, }; // Indices for a quad (two triangles) uint16_t quadIndices[] = { 0, 1, 2, 0, 2, 3, }; std::string getVersion() { return {"#version 100"}; } std::string getMetalShaderSource() { return R"( using namespace metal; typedef struct { float3 position [[attribute(0)]]; float4 color [[attribute(1)]]; } VertexIn; typedef struct { float4 position [[position]]; float4 color; } VertexOut; vertex VertexOut vertexShader( uint vid [[vertex_id]], constant VertexIn * vertices [[buffer(1)]]) { VertexOut out; out.position = float4(vertices[vid].position, 1.0); out.color = vertices[vid].color; return out; } fragment float4 fragmentShader( VertexOut IN [[stage_in]]) { return IN.color; } )"; } std::string getOpenGLVertexShaderSource() { return getVersion() + R"( precision highp float; attribute vec3 position; attribute vec4 color_in; varying vec4 vColor; void main() { gl_Position = vec4(position, 1.0); vColor = color_in; })"; } std::string getOpenGLFragmentShaderSource() { return getVersion() + std::string(R"( precision highp float; varying vec4 vColor; void main() { gl_FragColor = vColor; })"); } std::string getVulkanVertexShaderSource() { return R"( layout(location = 0) in vec3 position; layout(location = 1) in vec4 color_in; layout(location = 0) out vec4 color; void main() { gl_Position = vec4(position, 1.0); color = color_in; } )"; } std::string getVulkanFragmentShaderSource() { return R"( layout(location = 0) in vec4 color; layout(location = 0) out vec4 out_FragColor; void main() { out_FragColor = color; } )"; } std::unique_ptr getShaderStagesForBackend(IDevice& device) { switch (device.getBackendType()) { case igl::BackendType::Invalid: case igl::BackendType::Custom: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; case igl::BackendType::Vulkan: return igl::ShaderStagesCreator::fromModuleStringInput(device, getVulkanVertexShaderSource().c_str(), "main", "", getVulkanFragmentShaderSource().c_str(), "main", "", nullptr); // @fb-only // @fb-only // @fb-only case igl::BackendType::Metal: return igl::ShaderStagesCreator::fromLibraryStringInput( device, getMetalShaderSource().c_str(), "vertexShader", "fragmentShader", "", nullptr); case igl::BackendType::OpenGL: return igl::ShaderStagesCreator::fromModuleStringInput(device, getOpenGLVertexShaderSource().c_str(), "main", "", getOpenGLFragmentShaderSource().c_str(), "main", "", nullptr); case igl::BackendType::D3D12: { static const char* kVS = R"( struct VSIn { float3 position : POSITION; float4 color : COLOR; }; struct VSOut { float4 position : SV_POSITION; float4 color : COLOR; }; VSOut main(VSIn v) { VSOut o; o.position = float4(v.position, 1.0); o.color = v.color; return o; } )"; static const char* kPS = R"( struct PSIn { float4 position : SV_POSITION; float4 color : COLOR; }; float4 main(PSIn i) : SV_TARGET { return i.color; } )"; return igl::ShaderStagesCreator::fromModuleStringInput( device, kVS, "main", "", kPS, "main", "", nullptr); } } IGL_UNREACHABLE_RETURN(nullptr) } } // namespace void ScissorTestSession::initialize() noexcept { auto& device = getPlatform().getDevice(); // Create 4 vertex buffers, one for each colored quad redVertexBuffer_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Vertex, .data = redQuadData, .length = sizeof(redQuadData)}, nullptr); greenVertexBuffer_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Vertex, .data = greenQuadData, .length = sizeof(greenQuadData)}, nullptr); blueVertexBuffer_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Vertex, .data = blueQuadData, .length = sizeof(blueQuadData)}, nullptr); yellowVertexBuffer_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Vertex, .data = yellowQuadData, .length = sizeof(yellowQuadData)}, nullptr); // Shared index buffer for all quads indexBuffer_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Index, .data = quadIndices, .length = sizeof(quadIndices)}, nullptr); IGL_DEBUG_ASSERT(indexBuffer_ != nullptr); vertexInputState_ = device.createVertexInputState( VertexInputStateDesc{ .numAttributes = 2, .attributes = { VertexAttribute{.bufferIndex = 1, .format = VertexAttributeFormat::Float3, .offset = offsetof(VertexPosColor, position), .name = "position", .location = 0}, VertexAttribute{.bufferIndex = 1, .format = VertexAttributeFormat::Float4, .offset = offsetof(VertexPosColor, color), .name = "color_in", .location = 1}, }, .numInputBindings = 1, .inputBindings = {{}, {.stride = sizeof(VertexPosColor)}}, }, nullptr); IGL_DEBUG_ASSERT(vertexInputState_ != nullptr); shaderStages_ = getShaderStagesForBackend(device); IGL_DEBUG_ASSERT(shaderStages_ != nullptr); // Command queue commandQueue_ = device.createCommandQueue(CommandQueueDesc{}, nullptr); IGL_DEBUG_ASSERT(commandQueue_ != nullptr); renderPass_ = { .colorAttachments = { { .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, .clearColor = getPreferredClearColor(), }, }, .depthAttachment = { .loadAction = LoadAction::Clear, .clearDepth = 1.0, }, }; } void ScissorTestSession::update(SurfaceTextures textures) noexcept { Result ret; if (framebuffer_ == nullptr) { framebuffer_ = getPlatform().getDevice().createFramebuffer( FramebufferDesc{ .colorAttachments = {{.texture = textures.color}}, .depthAttachment = {.texture = textures.depth}, .stencilAttachment = textures.depth && textures.depth->getProperties().hasStencil() ? FramebufferDesc::AttachmentDesc{.texture = textures.depth} : FramebufferDesc::AttachmentDesc{}, }, &ret); IGL_DEBUG_ASSERT(ret.isOk()); IGL_DEBUG_ASSERT(framebuffer_ != nullptr); } else { framebuffer_->updateDrawable(textures); } // Graphics pipeline if (pipelineState_ == nullptr) { pipelineState_ = getPlatform().getDevice().createRenderPipeline( RenderPipelineDesc{ .vertexInputState = vertexInputState_, .shaderStages = shaderStages_, .targetDesc = { .colorAttachments = {{.textureFormat = framebuffer_->getColorAttachment(0)->getFormat()}}, .depthAttachmentFormat = framebuffer_->getDepthAttachment()->getFormat(), .stencilAttachmentFormat = framebuffer_->getStencilAttachment() ? framebuffer_->getStencilAttachment()->getFormat() : igl::TextureFormat::Invalid, }, .cullMode = igl::CullMode::Disabled, .frontFaceWinding = igl::WindingMode::CounterClockwise, }, nullptr); IGL_DEBUG_ASSERT(pipelineState_ != nullptr); } // Command Buffers auto buffer = commandQueue_->createCommandBuffer(CommandBufferDesc{}, nullptr); IGL_DEBUG_ASSERT(buffer != nullptr); auto drawableSurface = framebuffer_->getColorAttachment(0); // Get framebuffer dimensions const uint32_t width = drawableSurface->getDimensions().width; const uint32_t height = drawableSurface->getDimensions().height; const uint32_t halfWidth = width / 2; const uint32_t halfHeight = height / 2; // Submit commands const std::shared_ptr commands = buffer->createRenderCommandEncoder(renderPass_, framebuffer_); IGL_DEBUG_ASSERT(commands != nullptr); if (commands) { commands->bindRenderPipelineState(pipelineState_); commands->bindIndexBuffer(*indexBuffer_, IndexFormat::UInt16); // Full-screen viewport commands->bindViewport(Viewport{.x = 0.0f, .y = 0.0f, .width = static_cast(width), .height = static_cast(height), .minDepth = 0.0f, .maxDepth = 1.0f}); // Draw 4 full-screen quads, each clipped by a different scissor rectangle // to show only in its designated quadrant. // 1. RED quad - TOP-LEFT quadrant commands->bindScissorRect( ScissorRect{.x = 0, .y = 0, .width = halfWidth, .height = halfHeight}); commands->bindVertexBuffer(1, *redVertexBuffer_); commands->drawIndexed(6); // 2. GREEN quad - TOP-RIGHT quadrant commands->bindScissorRect( ScissorRect{.x = halfWidth, .y = 0, .width = halfWidth, .height = halfHeight}); commands->bindVertexBuffer(1, *greenVertexBuffer_); commands->drawIndexed(6); // 3. BLUE quad - BOTTOM-LEFT quadrant commands->bindScissorRect( ScissorRect{.x = 0, .y = halfHeight, .width = halfWidth, .height = halfHeight}); commands->bindVertexBuffer(1, *blueVertexBuffer_); commands->drawIndexed(6); // 4. YELLOW quad - BOTTOM-RIGHT quadrant commands->bindScissorRect( ScissorRect{.x = halfWidth, .y = halfHeight, .width = halfWidth, .height = halfHeight}); commands->bindVertexBuffer(1, *yellowVertexBuffer_); commands->drawIndexed(6); commands->endEncoding(); } IGL_DEBUG_ASSERT(buffer != nullptr); if (shellParams().shouldPresent) { buffer->present(drawableSurface); } IGL_DEBUG_ASSERT(commandQueue_ != nullptr); commandQueue_->submit(*buffer); frameCount_++; RenderSession::update(textures); } } // namespace igl::shell ================================================ FILE: shell/renderSessions/ScissorTestSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include #include #include namespace igl::shell { class ScissorTestSession : public RenderSession { public: explicit ScissorTestSession(std::shared_ptr platform) : RenderSession(std::move(platform)) {} void initialize() noexcept override; void update(SurfaceTextures surfaceTextures) noexcept override; private: std::shared_ptr framebuffer_; std::shared_ptr pipelineState_; std::shared_ptr redVertexBuffer_; std::shared_ptr greenVertexBuffer_; std::shared_ptr blueVertexBuffer_; std::shared_ptr yellowVertexBuffer_; std::shared_ptr indexBuffer_; std::shared_ptr vertexInputState_; std::shared_ptr shaderStages_; std::shared_ptr commandQueue_; RenderPassDesc renderPass_; size_t frameCount_ = 0; }; } // namespace igl::shell ================================================ FILE: shell/renderSessions/StencilOutlineSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include namespace igl::shell { namespace { struct VertexPosColor { iglu::simdtypes::float3 position; iglu::simdtypes::float4 color; }; // A hexagon shape for a more interesting outline demo VertexPosColor vertexData[] = { // Center {.position = {0.0f, 0.0f, 0.0f}, .color = {0.2f, 0.6f, 1.0f, 1.0f}}, // Hexagon vertices (6 points) {.position = {0.0f, 0.5f, 0.0f}, .color = {0.4f, 0.8f, 1.0f, 1.0f}}, {.position = {0.433f, 0.25f, 0.0f}, .color = {0.3f, 0.7f, 1.0f, 1.0f}}, {.position = {0.433f, -0.25f, 0.0f}, .color = {0.2f, 0.6f, 0.9f, 1.0f}}, {.position = {0.0f, -0.5f, 0.0f}, .color = {0.1f, 0.5f, 0.8f, 1.0f}}, {.position = {-0.433f, -0.25f, 0.0f}, .color = {0.2f, 0.6f, 0.9f, 1.0f}}, {.position = {-0.433f, 0.25f, 0.0f}, .color = {0.3f, 0.7f, 1.0f, 1.0f}}, }; // Triangles forming the hexagon (6 triangles, all sharing center vertex 0) uint16_t indexData[] = { 0, 1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 5, 0, 5, 6, 0, 6, 1, }; // --------------------------------------------------------------------------- // Object shaders: standard position + color passthrough // --------------------------------------------------------------------------- std::string getVersion() { return {"#version 100"}; } std::string getMetalShaderSource() { return R"( using namespace metal; typedef struct { float3 position [[attribute(0)]]; float4 color [[attribute(1)]]; } VertexIn; typedef struct { float4 position [[position]]; float4 color; } VertexOut; vertex VertexOut vertexShader( uint vid [[vertex_id]], constant VertexIn * vertices [[buffer(1)]]) { VertexOut out; out.position = float4(vertices[vid].position, 1.0); out.color = vertices[vid].color; return out; } fragment float4 fragmentShader( VertexOut IN [[stage_in]]) { return IN.color; } )"; } std::string getOpenGLVertexShaderSource() { return getVersion() + R"( precision highp float; attribute vec3 position; attribute vec4 color_in; varying vec4 vColor; void main() { gl_Position = vec4(position, 1.0); vColor = color_in; })"; } std::string getOpenGLFragmentShaderSource() { return getVersion() + std::string(R"( precision highp float; varying vec4 vColor; void main() { gl_FragColor = vColor; })"); } std::string getVulkanVertexShaderSource() { return R"( layout(location = 0) in vec3 position; layout(location = 1) in vec4 color_in; layout(location = 0) out vec4 color; void main() { gl_Position = vec4(position, 1.0); color = color_in; } )"; } std::string getVulkanFragmentShaderSource() { return R"( layout(location = 0) in vec4 color; layout(location = 0) out vec4 out_FragColor; void main() { out_FragColor = color; } )"; } std::unique_ptr getShaderStagesForBackend(IDevice& device) { switch (device.getBackendType()) { case igl::BackendType::Invalid: case igl::BackendType::Custom: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; case igl::BackendType::Vulkan: return igl::ShaderStagesCreator::fromModuleStringInput(device, getVulkanVertexShaderSource().c_str(), "main", "", getVulkanFragmentShaderSource().c_str(), "main", "", nullptr); // @fb-only // @fb-only // @fb-only case igl::BackendType::Metal: return igl::ShaderStagesCreator::fromLibraryStringInput( device, getMetalShaderSource().c_str(), "vertexShader", "fragmentShader", "", nullptr); case igl::BackendType::OpenGL: return igl::ShaderStagesCreator::fromModuleStringInput(device, getOpenGLVertexShaderSource().c_str(), "main", "", getOpenGLFragmentShaderSource().c_str(), "main", "", nullptr); case igl::BackendType::D3D12: { static const char* kVS = R"( struct VSIn { float3 position : POSITION; float4 color : COLOR; }; struct VSOut { float4 position : SV_POSITION; float4 color : COLOR; }; VSOut main(VSIn v) { VSOut o; o.position = float4(v.position, 1.0); o.color = v.color; return o; } )"; static const char* kPS = R"( struct PSIn { float4 position : SV_POSITION; float4 color : COLOR; }; float4 main(PSIn i) : SV_TARGET { return i.color; } )"; return igl::ShaderStagesCreator::fromModuleStringInput( device, kVS, "main", "", kPS, "main", "", nullptr); } } IGL_UNREACHABLE_RETURN(nullptr) } // --------------------------------------------------------------------------- // Outline shaders: scale geometry up by 1.1x and output solid outline color // --------------------------------------------------------------------------- std::string getOutlineMetalShaderSource() { return R"( using namespace metal; typedef struct { float3 position [[attribute(0)]]; float4 color [[attribute(1)]]; } VertexIn; typedef struct { float4 position [[position]]; } VertexOut; vertex VertexOut outlineVertexShader( uint vid [[vertex_id]], constant VertexIn * vertices [[buffer(1)]]) { VertexOut out; out.position = float4(vertices[vid].position * 1.1, 1.0); return out; } fragment float4 outlineFragmentShader( VertexOut IN [[stage_in]]) { return float4(1.0, 0.5, 0.0, 1.0); } )"; } std::string getOutlineOpenGLVertexShaderSource() { return getVersion() + R"( precision highp float; attribute vec3 position; attribute vec4 color_in; void main() { gl_Position = vec4(position * 1.1, 1.0); })"; } std::string getOutlineOpenGLFragmentShaderSource() { return getVersion() + std::string(R"( precision highp float; void main() { gl_FragColor = vec4(1.0, 0.5, 0.0, 1.0); })"); } std::string getOutlineVulkanVertexShaderSource() { return R"( layout(location = 0) in vec3 position; layout(location = 1) in vec4 color_in; void main() { gl_Position = vec4(position * 1.1, 1.0); } )"; } std::string getOutlineVulkanFragmentShaderSource() { return R"( layout(location = 0) out vec4 out_FragColor; void main() { out_FragColor = vec4(1.0, 0.5, 0.0, 1.0); } )"; } std::unique_ptr getOutlineShaderStagesForBackend(IDevice& device) { switch (device.getBackendType()) { case igl::BackendType::Invalid: case igl::BackendType::Custom: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; case igl::BackendType::Vulkan: return igl::ShaderStagesCreator::fromModuleStringInput( device, getOutlineVulkanVertexShaderSource().c_str(), "main", "", getOutlineVulkanFragmentShaderSource().c_str(), "main", "", nullptr); // @fb-only // @fb-only // @fb-only case igl::BackendType::Metal: return igl::ShaderStagesCreator::fromLibraryStringInput(device, getOutlineMetalShaderSource().c_str(), "outlineVertexShader", "outlineFragmentShader", "", nullptr); case igl::BackendType::OpenGL: return igl::ShaderStagesCreator::fromModuleStringInput( device, getOutlineOpenGLVertexShaderSource().c_str(), "main", "", getOutlineOpenGLFragmentShaderSource().c_str(), "main", "", nullptr); case igl::BackendType::D3D12: { static const char* kVS = R"( struct VSIn { float3 position : POSITION; float4 color : COLOR; }; struct VSOut { float4 position : SV_POSITION; }; VSOut main(VSIn v) { VSOut o; o.position = float4(v.position * 1.1, 1.0); return o; } )"; static const char* kPS = R"( struct PSIn { float4 position : SV_POSITION; }; float4 main(PSIn i) : SV_TARGET { return float4(1.0, 0.5, 0.0, 1.0); } )"; return igl::ShaderStagesCreator::fromModuleStringInput( device, kVS, "main", "", kPS, "main", "", nullptr); } } IGL_UNREACHABLE_RETURN(nullptr) } } // namespace void StencilOutlineSession::initialize() noexcept { auto& device = getPlatform().getDevice(); // Vertex & Index buffer vertexBuffer_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Vertex, .data = vertexData, .length = sizeof(vertexData)}, nullptr); IGL_DEBUG_ASSERT(vertexBuffer_ != nullptr); indexBuffer_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Index, .data = indexData, .length = sizeof(indexData)}, nullptr); IGL_DEBUG_ASSERT(indexBuffer_ != nullptr); vertexInputState_ = device.createVertexInputState( VertexInputStateDesc{ .numAttributes = 2, .attributes = { VertexAttribute{.bufferIndex = 1, .format = VertexAttributeFormat::Float3, .offset = offsetof(VertexPosColor, position), .name = "position", .location = 0}, VertexAttribute{.bufferIndex = 1, .format = VertexAttributeFormat::Float4, .offset = offsetof(VertexPosColor, color), .name = "color_in", .location = 1}, }, .numInputBindings = 1, .inputBindings = {{}, {.stride = sizeof(VertexPosColor)}}, }, nullptr); IGL_DEBUG_ASSERT(vertexInputState_ != nullptr); // Create shader stages for both object and outline shaderStages_ = getShaderStagesForBackend(device); IGL_DEBUG_ASSERT(shaderStages_ != nullptr); outlineShaderStages_ = getOutlineShaderStagesForBackend(device); IGL_DEBUG_ASSERT(outlineShaderStages_ != nullptr); // Command queue commandQueue_ = device.createCommandQueue(CommandQueueDesc{}, nullptr); IGL_DEBUG_ASSERT(commandQueue_ != nullptr); // Depth/stencil state for the first pass: always pass stencil test, write reference value { DepthStencilStateDesc desc; desc.compareFunction = CompareFunction::AlwaysPass; desc.isDepthWriteEnabled = true; StencilStateDesc stencilWrite; stencilWrite.stencilCompareFunction = CompareFunction::AlwaysPass; stencilWrite.stencilFailureOperation = StencilOperation::Keep; stencilWrite.depthFailureOperation = StencilOperation::Keep; stencilWrite.depthStencilPassOperation = StencilOperation::Replace; stencilWrite.readMask = 0xFF; stencilWrite.writeMask = 0xFF; desc.frontFaceStencil = stencilWrite; desc.backFaceStencil = stencilWrite; depthStencilStateWrite_ = device.createDepthStencilState(desc, nullptr); IGL_DEBUG_ASSERT(depthStencilStateWrite_ != nullptr); } // Depth/stencil state for the outline pass: draw only where stencil != reference value { DepthStencilStateDesc desc; desc.compareFunction = CompareFunction::AlwaysPass; desc.isDepthWriteEnabled = false; StencilStateDesc stencilOutline; stencilOutline.stencilCompareFunction = CompareFunction::NotEqual; stencilOutline.stencilFailureOperation = StencilOperation::Keep; stencilOutline.depthFailureOperation = StencilOperation::Keep; stencilOutline.depthStencilPassOperation = StencilOperation::Keep; stencilOutline.readMask = 0xFF; stencilOutline.writeMask = 0x00; desc.frontFaceStencil = stencilOutline; desc.backFaceStencil = stencilOutline; depthStencilStateOutline_ = device.createDepthStencilState(desc, nullptr); IGL_DEBUG_ASSERT(depthStencilStateOutline_ != nullptr); } // Render pass descriptor with color, depth, and stencil clear renderPass_ = { .colorAttachments = { { .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, .clearColor = getPreferredClearColor(), }, }, .depthAttachment = { .loadAction = LoadAction::Clear, .clearDepth = 1.0, }, .stencilAttachment = { .loadAction = LoadAction::Clear, .clearStencil = 0, }, }; } void StencilOutlineSession::update(SurfaceTextures textures) noexcept { Result ret; // Create or update framebuffer (with stencil attachment if depth texture has stencil) if (framebuffer_ == nullptr) { framebuffer_ = getPlatform().getDevice().createFramebuffer( FramebufferDesc{ .colorAttachments = {{.texture = textures.color}}, .depthAttachment = {.texture = textures.depth}, .stencilAttachment = textures.depth && textures.depth->getProperties().hasStencil() ? FramebufferDesc::AttachmentDesc{.texture = textures.depth} : FramebufferDesc::AttachmentDesc{}, }, &ret); IGL_DEBUG_ASSERT(ret.isOk()); IGL_DEBUG_ASSERT(framebuffer_ != nullptr); } else { framebuffer_->updateDrawable(textures); } // Create object pipeline state (lazy, cached) if (pipelineState_ == nullptr) { pipelineState_ = getPlatform().getDevice().createRenderPipeline( RenderPipelineDesc{ .vertexInputState = vertexInputState_, .shaderStages = shaderStages_, .targetDesc = { .colorAttachments = {{.textureFormat = framebuffer_->getColorAttachment(0)->getFormat()}}, .depthAttachmentFormat = framebuffer_->getDepthAttachment()->getFormat(), .stencilAttachmentFormat = framebuffer_->getStencilAttachment() ? framebuffer_->getStencilAttachment()->getFormat() : igl::TextureFormat::Invalid, }, .cullMode = igl::CullMode::Back, .frontFaceWinding = igl::WindingMode::Clockwise, }, nullptr); IGL_DEBUG_ASSERT(pipelineState_ != nullptr); } // Create outline pipeline state (lazy, cached) if (outlinePipelineState_ == nullptr) { outlinePipelineState_ = getPlatform().getDevice().createRenderPipeline( RenderPipelineDesc{ .vertexInputState = vertexInputState_, .shaderStages = outlineShaderStages_, .targetDesc = { .colorAttachments = {{.textureFormat = framebuffer_->getColorAttachment(0)->getFormat()}}, .depthAttachmentFormat = framebuffer_->getDepthAttachment()->getFormat(), .stencilAttachmentFormat = framebuffer_->getStencilAttachment() ? framebuffer_->getStencilAttachment()->getFormat() : igl::TextureFormat::Invalid, }, .cullMode = igl::CullMode::Back, .frontFaceWinding = igl::WindingMode::Clockwise, }, nullptr); IGL_DEBUG_ASSERT(outlinePipelineState_ != nullptr); } // Command Buffers auto buffer = commandQueue_->createCommandBuffer(CommandBufferDesc{}, nullptr); IGL_DEBUG_ASSERT(buffer != nullptr); auto drawableSurface = framebuffer_->getColorAttachment(0); // Submit commands const std::shared_ptr commands = buffer->createRenderCommandEncoder(renderPass_, framebuffer_); IGL_DEBUG_ASSERT(commands != nullptr); if (commands) { commands->bindVertexBuffer(1, *vertexBuffer_); commands->bindIndexBuffer(*indexBuffer_, IndexFormat::UInt16); // --- Pass 1: Draw the object and write stencil reference value --- commands->bindDepthStencilState(depthStencilStateWrite_); commands->setStencilReferenceValue(1); commands->bindRenderPipelineState(pipelineState_); commands->drawIndexed(18); // 6 triangles * 3 indices // --- Pass 2: Draw the scaled-up outline where stencil != reference --- commands->bindDepthStencilState(depthStencilStateOutline_); commands->setStencilReferenceValue(1); commands->bindRenderPipelineState(outlinePipelineState_); commands->drawIndexed(18); // 6 triangles * 3 indices commands->endEncoding(); } IGL_DEBUG_ASSERT(buffer != nullptr); if (shellParams().shouldPresent) { buffer->present(drawableSurface); } IGL_DEBUG_ASSERT(commandQueue_ != nullptr); commandQueue_->submit(*buffer); RenderSession::update(textures); } } // namespace igl::shell ================================================ FILE: shell/renderSessions/StencilOutlineSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include #include #include namespace igl::shell { class StencilOutlineSession : public RenderSession { public: explicit StencilOutlineSession(std::shared_ptr platform) : RenderSession(std::move(platform)) {} void initialize() noexcept override; void update(SurfaceTextures surfaceTextures) noexcept override; private: std::shared_ptr framebuffer_; std::shared_ptr pipelineState_; std::shared_ptr outlinePipelineState_; std::shared_ptr depthStencilStateWrite_; std::shared_ptr depthStencilStateOutline_; std::shared_ptr vertexBuffer_; std::shared_ptr indexBuffer_; std::shared_ptr vertexInputState_; std::shared_ptr shaderStages_; std::shared_ptr outlineShaderStages_; RenderPassDesc renderPass_; }; } // namespace igl::shell ================================================ FILE: shell/renderSessions/TQMultiRenderPassSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include namespace igl::shell { struct VertexPosUv { iglu::simdtypes::float3 position; // SIMD 128b aligned iglu::simdtypes::float2 uv; // SIMD 128b aligned }; // clang-format off static const VertexPosUv vertexData0[] = { {.position = {-1.0f, 1.0f, 0.0f}, .uv = {0.0f, 1.0f}}, {.position = { 1.0f, 1.0f, 0.0f}, .uv = {1.0f, 1.0f}}, {.position = {-1.0f, -1.0f, 0.0f}, .uv = {0.0f, 0.0f}}, {.position = { 1.0f, -1.0f, 0.0f}, .uv = {1.0f, 0.0f}}, }; static const VertexPosUv vertexData1[] = { {.position = {-0.8f, 0.8f, 0.0f}, .uv = {0.0f, 1.0f}}, {.position = { 0.8f, 0.8f, 0.0f}, .uv = {1.0f, 1.0f}}, {.position = {-0.8f, -0.8f, 0.0f}, .uv = {0.0f, 0.0f}}, {.position = { 0.8f, -0.8f, 0.0f}, .uv = {1.0f, 0.0f}}, }; static constexpr uint16_t indexData[] = {0, 1, 2, 1, 3, 2}; // clang-format on static std::string getMetalShaderSource() { return R"( using namespace metal; typedef struct { float3 color; } UniformBlock; typedef struct { float3 position [[attribute(0)]]; float2 uv [[attribute(1)]]; } VertexIn; typedef struct { float4 position [[position]]; float2 uv; } VertexOut; vertex VertexOut vertexShader( uint vid [[vertex_id]], constant VertexIn * vertices [[buffer(0)]]) { VertexOut out; out.position = float4(vertices[vid].position, 1.0); out.uv = vertices[vid].uv; return out; } fragment float4 fragmentShader( VertexOut IN [[stage_in]], texture2d diffuseTex [[texture(0)]], sampler linearSampler [[sampler(0)]], constant UniformBlock * color [[buffer(0)]]) { float4 tex = diffuseTex.sample(linearSampler, IN.uv); return float4(color->color.r, color->color.g, color->color.b, 1.0) * tex; } )"; } static std::string getOpenGLVertexShaderSource() { return R"(#version 100 attribute vec3 position; attribute vec2 uv_in; varying vec2 uv; void main() { gl_Position = vec4(position, 1.0); uv = uv_in; // position.xy * 0.5 + 0.5; })"; } static std::string getOpenGLFragmentShaderSource() { return R"(#version 100 precision highp float; uniform vec3 color; uniform sampler2D inputImage; varying vec2 uv; void main() { gl_FragColor = vec4(color, 1.0) * texture2D(inputImage, uv); })"; } static std::string getD3D12VertexShaderSource() { return R"( struct VertexIn { float3 position : POSITION; float2 uv : TEXCOORD0; }; struct VertexOut { float4 position : SV_Position; float2 uv : TEXCOORD0; }; VertexOut main(VertexIn IN) { VertexOut OUT; OUT.position = float4(IN.position, 1.0); OUT.uv = IN.uv; return OUT; } )"; } static std::string getD3D12FragmentShaderSource() { return R"( cbuffer UniformBlock : register(b0) { float3 color; }; Texture2D inputImage : register(t0); SamplerState linearSampler : register(s0); struct VertexOut { float4 position : SV_Position; float2 uv : TEXCOORD0; }; float4 main(VertexOut IN) : SV_Target { float4 tex = inputImage.Sample(linearSampler, IN.uv); return float4(color.r, color.g, color.b, 1.0) * tex; } )"; } static std::unique_ptr getShaderStagesForBackend(IDevice& device) { switch (device.getBackendType()) { case igl::BackendType::Invalid: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; case igl::BackendType::Vulkan: IGL_DEBUG_ABORT("IGLSamples not set up for Vulkan"); return nullptr; case igl::BackendType::Custom: IGL_DEBUG_ABORT("IGLSamples not set up for Custom"); return nullptr; // @fb-only // @fb-only // @fb-only case igl::BackendType::Metal: return igl::ShaderStagesCreator::fromLibraryStringInput( device, getMetalShaderSource().c_str(), "vertexShader", "fragmentShader", "", nullptr); case igl::BackendType::OpenGL: return igl::ShaderStagesCreator::fromModuleStringInput(device, getOpenGLVertexShaderSource().c_str(), "main", "", getOpenGLFragmentShaderSource().c_str(), "main", "", nullptr); case igl::BackendType::D3D12: return igl::ShaderStagesCreator::fromModuleStringInput(device, getD3D12VertexShaderSource().c_str(), "main", "", getD3D12FragmentShaderSource().c_str(), "main", "", nullptr); } IGL_UNREACHABLE_RETURN(nullptr) } static void render(std::shared_ptr& buffer, std::shared_ptr& vertexBuffer, std::shared_ptr& inputTexture, std::shared_ptr& pipelineState, std::shared_ptr& framebuffer, RenderPassDesc& renderPass, std::shared_ptr& samplerState, std::shared_ptr& ib, size_t textureUnit, BackendType& backend, std::shared_ptr& fragmentParamBuffer, std::vector& fragmentUniformDescriptors, FragmentFormat fragmentParameters) { // Submit commands const std::shared_ptr commands = buffer->createRenderCommandEncoder(renderPass, framebuffer); commands->bindRenderPipelineState(pipelineState); if (backend != igl::BackendType::OpenGL) { if (fragmentParamBuffer) { commands->bindBuffer(0, fragmentParamBuffer.get()); } } else { // Bind non block uniforms for (const auto& uniformDesc : fragmentUniformDescriptors) { commands->bindUniform(uniformDesc, &fragmentParameters); } } commands->bindTexture(textureUnit, BindTarget::kFragment, inputTexture.get()); commands->bindSamplerState(textureUnit, BindTarget::kFragment, samplerState.get()); commands->bindVertexBuffer(0, *vertexBuffer); commands->bindIndexBuffer(*ib, IndexFormat::UInt16); commands->drawIndexed(6); commands->endEncoding(); } void TQMultiRenderPassSession::initialize() noexcept { auto& device = getPlatform().getDevice(); // Vertex buffer, Index buffer and Vertex Input vb0_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Vertex, .data = vertexData0, .length = sizeof(vertexData0)}, nullptr); vb1_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Vertex, .data = vertexData1, .length = sizeof(vertexData1)}, nullptr); ib0_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Index, .data = indexData, .length = sizeof(indexData)}, nullptr); const VertexInputStateDesc inputDesc = { .numAttributes = 2, .attributes = { { .bufferIndex = 0, .format = VertexAttributeFormat::Float3, .offset = offsetof(VertexPosUv, position), .name = "position", .location = 0, }, { .bufferIndex = 0, .format = VertexAttributeFormat::Float2, .offset = offsetof(VertexPosUv, uv), .name = "uv_in", .location = 1, }, }, .numInputBindings = 1, .inputBindings = { { .stride = sizeof(VertexPosUv), }, }, }; vertexInputState_ = device.createVertexInputState(inputDesc, nullptr); // Sampler & Texture samplerState_ = device.createSamplerState( SamplerStateDesc{ .minFilter = SamplerMinMagFilter::Linear, .magFilter = SamplerMinMagFilter::Linear, .debugName = "Sampler: linear", }, nullptr); tex0_ = getPlatform().loadTexture("igl.png"); shaderStages_ = getShaderStagesForBackend(device); // Command queue commandQueue_ = device.createCommandQueue(CommandQueueDesc{}, nullptr); renderPass0_ = { .colorAttachments = { { .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, .clearColor = getPreferredClearColor(), }, }, .depthAttachment = {.loadAction = LoadAction::Clear, .clearDepth = 1.0}, }; renderPass1_ = { .colorAttachments = { { .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, .clearColor = getPreferredClearColor(), }, }, .depthAttachment = {.loadAction = LoadAction::Clear, .clearDepth = 1.0}, }; // init uniforms fragmentParameters_ = FragmentFormat{{1.0f, 1.0f, 1.0f}}; fragmentParamBuffer_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Uniform, .data = &fragmentParameters_, .length = sizeof(fragmentParameters_), .storage = ResourceStorage::Shared}, nullptr); } void TQMultiRenderPassSession::update(SurfaceTextures surfaceTextures) noexcept { Result ret; if (framebuffer0_ == nullptr) { const auto dimensions = surfaceTextures.color->getDimensions(); const igl::TextureDesc desc1 = igl::TextureDesc::new2D(igl::TextureFormat::RGBA_UNorm8, dimensions.width, dimensions.height, igl::TextureDesc::TextureUsageBits::Sampled | igl::TextureDesc::TextureUsageBits::Attachment); tex1_ = getPlatform().getDevice().createTexture(desc1, nullptr); framebuffer0_ = getPlatform().getDevice().createFramebuffer( FramebufferDesc{ .colorAttachments = {{.texture = tex1_}}, .depthAttachment = { .texture = getPlatform().getDevice().createTexture( TextureDesc{ .width = dimensions.width, .height = dimensions.height, .usage = igl::TextureDesc::TextureUsageBits::Attachment, .type = TextureType::TwoD, .format = igl::TextureFormat::Z_UNorm24, .storage = igl::ResourceStorage::Private, }, &ret), }, }, &ret); IGL_DEBUG_ASSERT(ret.isOk()); IGL_DEBUG_ASSERT(framebuffer0_ != nullptr); } if (framebuffer1_ == nullptr) { framebuffer1_ = getPlatform().getDevice().createFramebuffer( FramebufferDesc{ .colorAttachments = {{.texture = surfaceTextures.color}}, .depthAttachment = {.texture = surfaceTextures.depth}, }, &ret); IGL_DEBUG_ASSERT(ret.isOk()); IGL_DEBUG_ASSERT(framebuffer1_ != nullptr); } else { framebuffer1_->updateDrawable(surfaceTextures); } const size_t textureUnit = 0; // Graphics pipeline if (pipelineState0_ == nullptr) { pipelineState0_ = getPlatform().getDevice().createRenderPipeline( RenderPipelineDesc{ .vertexInputState = vertexInputState_, .shaderStages = shaderStages_, .targetDesc = { .colorAttachments = { { .textureFormat = tex1_->getProperties().format, }, }, .depthAttachmentFormat = framebuffer0_->getDepthAttachment()->getProperties().format, }, .cullMode = igl::CullMode::Back, .frontFaceWinding = igl::WindingMode::Clockwise, .fragmentUnitSamplerMap = {{textureUnit, IGL_NAMEHANDLE("inputImage")}}, }, nullptr); pipelineState1_ = getPlatform().getDevice().createRenderPipeline( RenderPipelineDesc{ .vertexInputState = vertexInputState_, .shaderStages = shaderStages_, .targetDesc = { .colorAttachments = { { .textureFormat = framebuffer1_->getColorAttachment(0)->getProperties().format, }, }, .depthAttachmentFormat = framebuffer1_->getDepthAttachment()->getProperties().format, }, .cullMode = igl::CullMode::Back, .frontFaceWinding = igl::WindingMode::Clockwise, .fragmentUnitSamplerMap = {{textureUnit, IGL_NAMEHANDLE("inputImage")}}, }, nullptr); // Set up uniform descriptors fragmentUniformDescriptors_.emplace_back(); } // Command buffer auto buffer = commandQueue_->createCommandBuffer({}, nullptr); // Draw render pass 0 auto drawableSurface = framebuffer1_->getColorAttachment(0); framebuffer1_->updateDrawable(drawableSurface); if (!fragmentUniformDescriptors_.empty()) { fragmentUniformDescriptors_.back().location = pipelineState0_->getIndexByName("color", igl::ShaderStage::Fragment); fragmentUniformDescriptors_.back().type = UniformType::Float3; fragmentUniformDescriptors_.back().offset = offsetof(FragmentFormat, color); } BackendType backendType = getPlatform().getDevice().getBackendType(); // Draw render pass 0 render(buffer, vb0_, tex0_, pipelineState0_, framebuffer0_, renderPass0_, samplerState_, ib0_, textureUnit, backendType, fragmentParamBuffer_, fragmentUniformDescriptors_, fragmentParameters_); // Draw render pass 1 render(buffer, vb1_, tex1_, pipelineState1_, framebuffer1_, renderPass1_, samplerState_, ib0_, textureUnit, backendType, fragmentParamBuffer_, fragmentUniformDescriptors_, fragmentParameters_); if (shellParams().shouldPresent) { buffer->present(drawableSurface); } commandQueue_->submit(*buffer); } } // namespace igl::shell ================================================ FILE: shell/renderSessions/TQMultiRenderPassSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include #include namespace igl::shell { class TQMultiRenderPassSession : public RenderSession { public: explicit TQMultiRenderPassSession(std::shared_ptr platform) : RenderSession(std::move(platform)) {} void initialize() noexcept override; void update(SurfaceTextures surfaceTextures) noexcept override; private: std::shared_ptr device_; std::shared_ptr shaderStages_; std::shared_ptr vertexInputState_; std::shared_ptr samplerState_; FragmentFormat fragmentParameters_{}; std::vector fragmentUniformDescriptors_; std::shared_ptr fragmentParamBuffer_; std::shared_ptr vb0_; std::shared_ptr vb1_; std::shared_ptr ib0_; std::shared_ptr depthTexture_; std::shared_ptr tex0_; std::shared_ptr tex1_; std::shared_ptr pipelineState0_; std::shared_ptr pipelineState1_; RenderPassDesc renderPass0_; RenderPassDesc renderPass1_; std::shared_ptr framebuffer0_; std::shared_ptr framebuffer1_; }; } // namespace igl::shell ================================================ FILE: shell/renderSessions/TQSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include // @fb-only // @fb-only // @fb-only // @fb-only namespace igl::shell { namespace { struct VertexPosUv { iglu::simdtypes::float3 position; iglu::simdtypes::float2 uv; }; std::string getVersion() { return {"#version 100"}; } std::string getMetalShaderSource() { return R"( using namespace metal; typedef struct { float3 color; } UniformBlock; typedef struct { float3 position [[attribute(0)]]; float2 uv [[attribute(1)]]; } VertexIn; typedef struct { float4 position [[position]]; float2 uv; } VertexOut; vertex VertexOut vertexShader( uint vid [[vertex_id]], constant VertexIn * vertices [[buffer(1)]]) { VertexOut out; out.position = float4(vertices[vid].position, 1.0); out.uv = vertices[vid].uv; return out; } fragment float4 fragmentShader( VertexOut IN [[stage_in]], texture2d diffuseTex [[texture(0)]], sampler linearSampler [[sampler(0)]], constant UniformBlock * color [[buffer(0)]]) { float4 tex = diffuseTex.sample(linearSampler, IN.uv); return float4(color->color.r, color->color.g, color->color.b, 1.0) * tex; } )"; } std::string getD3D12VertexShaderSource() { return R"( struct UniformsPerObject { float3 color; }; cbuffer PerObject : register(b0) { UniformsPerObject perObject; }; struct VSInput { float3 position : POSITION; float2 uv_in : TEXCOORD0; }; struct VSOutput { float4 position : SV_POSITION; float2 uv : TEXCOORD0; float3 color : COLOR0; }; VSOutput main(VSInput input) { VSOutput output; output.position = float4(input.position, 1.0); output.uv = input.uv_in; output.color = perObject.color; return output; } )"; } std::string getD3D12FragmentShaderSource() { return R"( Texture2D in_texture : register(t0); SamplerState in_sampler : register(s0); struct PSInput { float4 position : SV_POSITION; float2 uv : TEXCOORD0; float3 color : COLOR0; }; float4 main(PSInput input) : SV_Target { return float4(input.color, 1.0) * in_texture.Sample(in_sampler, input.uv); } )"; } std::string getOpenGLVertexShaderSource() { return getVersion() + R"( precision highp float; attribute vec3 position; attribute vec2 uv_in; varying vec2 uv; void main() { gl_Position = vec4(position, 1.0); uv = uv_in; // position.xy * 0.5 + 0.5; })"; } std::string getOpenGLFragmentShaderSource() { return getVersion() + std::string(R"( precision highp float; uniform vec3 color; uniform sampler2D inputImage; varying vec2 uv; void main() { gl_FragColor = vec4(color, 1.0) * texture2D(inputImage, uv); })"); } std::string getVulkanVertexShaderSource() { return R"( layout(location = 0) in vec3 position; layout(location = 1) in vec2 uv_in; layout(location = 0) out vec2 uv; layout(location = 1) out vec3 color; struct UniformsPerObject { vec3 color; }; layout (set = 1, binding = 0, std140) uniform PerObject { UniformsPerObject perObject; } object; void main() { gl_Position = vec4(position, 1.0); uv = uv_in; color = object.perObject.color; } )"; } std::string getVulkanFragmentShaderSource() { return R"( layout(location = 0) in vec2 uv; layout(location = 1) in vec3 color; layout(location = 0) out vec4 out_FragColor; layout(set = 0, binding = 0) uniform sampler2D in_texture; void main() { out_FragColor = vec4(color, 1.0) * texture(in_texture, uv); } )"; } std::unique_ptr getShaderStagesForBackend(IDevice& device) { switch (device.getBackendType()) { case igl::BackendType::Invalid: case igl::BackendType::Custom: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; case igl::BackendType::Vulkan: return igl::ShaderStagesCreator::fromModuleStringInput(device, getVulkanVertexShaderSource().c_str(), "main", "", getVulkanFragmentShaderSource().c_str(), "main", "", nullptr); // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only case igl::BackendType::Metal: return igl::ShaderStagesCreator::fromLibraryStringInput( device, getMetalShaderSource().c_str(), "vertexShader", "fragmentShader", "", nullptr); case igl::BackendType::OpenGL: return igl::ShaderStagesCreator::fromModuleStringInput(device, getOpenGLVertexShaderSource().c_str(), "main", "", getOpenGLFragmentShaderSource().c_str(), "main", "", nullptr); case igl::BackendType::D3D12: return igl::ShaderStagesCreator::fromModuleStringInput(device, getD3D12VertexShaderSource().c_str(), "main", "", getD3D12FragmentShaderSource().c_str(), "main", "", nullptr); } IGL_UNREACHABLE_RETURN(nullptr) } // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only BufferDesc getVertexBufferDesc(const igl::IDevice& device, const VertexPosUv* vertexData) { // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only return {.type = BufferDesc::BufferTypeBits::Vertex, .data = vertexData, .length = sizeof(VertexPosUv) * 4}; } uint32_t getVertexBufferIndex(const igl::IDevice& device) { // @fb-only // @fb-only return 0; // @fb-only // @fb-only return 1; } ResourceStorage getIndexBufferResourceStorage(const igl::IDevice& device) { // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only return igl::BufferDesc{}.storage; } } // namespace void TQSession::initialize() noexcept { auto& device = getPlatform().getDevice(); // Vertex & Index buffer const VertexPosUv vertexData[] = { {.position = {-0.8f, 0.8f, 0.0}, .uv = {0.0, 0.0}}, {.position = {0.8f, 0.8f, 0.0}, .uv = {uvScale_, 0.0}}, {.position = {-0.8f, -0.8f, 0.0}, .uv = {0.0, uvScale_}}, {.position = {0.8f, -0.8f, 0.0}, .uv = {uvScale_, uvScale_}}, }; const BufferDesc vbDesc = getVertexBufferDesc(device, &vertexData[0]); vb0_ = device.createBuffer(vbDesc, nullptr); IGL_DEBUG_ASSERT(vb0_ != nullptr); const uint16_t indexData[] = {0, 1, 2, 1, 3, 2}; const BufferDesc ibDesc{.type = BufferDesc::BufferTypeBits::Index, .data = indexData, .length = sizeof(indexData), .storage = getIndexBufferResourceStorage(device)}; ib0_ = device.createBuffer(ibDesc, nullptr); IGL_DEBUG_ASSERT(ib0_ != nullptr); const auto vertexBufferIndex = getVertexBufferIndex(getPlatform().getDevice()); VertexInputStateDesc inputDesc = { .numAttributes = 2, .attributes = { { .bufferIndex = vertexBufferIndex, .format = VertexAttributeFormat::Float3, .offset = offsetof(VertexPosUv, position), .name = "position", .location = 0, }, { .bufferIndex = vertexBufferIndex, .format = VertexAttributeFormat::Float2, .offset = offsetof(VertexPosUv, uv), .name = "uv_in", .location = 1, }, }, .numInputBindings = 1, }; inputDesc.inputBindings[vertexBufferIndex].stride = sizeof(VertexPosUv); vertexInput0_ = device.createVertexInputState(inputDesc, nullptr); IGL_DEBUG_ASSERT(vertexInput0_ != nullptr); // Sampler & Texture samp0_ = device.createSamplerState( SamplerStateDesc{ .minFilter = SamplerMinMagFilter::Linear, .magFilter = SamplerMinMagFilter::Linear, .debugName = "Sampler: linear", }, nullptr); IGL_DEBUG_ASSERT(samp0_ != nullptr); tex0_ = getPlatform().loadTexture("igl.png"); shaderStages_ = getShaderStagesForBackend(device); IGL_DEBUG_ASSERT(shaderStages_ != nullptr); // Command queue commandQueue_ = device.createCommandQueue(CommandQueueDesc{}, nullptr); IGL_DEBUG_ASSERT(commandQueue_ != nullptr); // Generate mipmaps for texture for D3D12 if (device.getBackendType() == igl::BackendType::D3D12) { tex0_->generateMipmap(*commandQueue_); } renderPass_ = { .colorAttachments = {{ .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, .clearColor = getPreferredClearColor(), }}, .depthAttachment = {.loadAction = LoadAction::Clear, .clearDepth = 1.0}, }; // init uniforms fragmentParameters_ = FragmentFormat{{1.0f, 1.0f, 1.0f}}; const BufferDesc fpDesc{ .type = BufferDesc::BufferTypeBits::Uniform, .data = &fragmentParameters_, .length = sizeof(fragmentParameters_), .storage = ResourceStorage::Shared, }; fragmentParamBuffer_ = device.createBuffer(fpDesc, nullptr); IGL_DEBUG_ASSERT(fragmentParamBuffer_ != nullptr); } void TQSession::update(SurfaceTextures surfaceTextures) noexcept { Result ret; if (framebuffer_ == nullptr) { FramebufferDesc framebufferDesc{ .colorAttachments = {{.texture = surfaceTextures.color}}, .depthAttachment = {.texture = surfaceTextures.depth}, }; if (surfaceTextures.depth && surfaceTextures.depth->getProperties().hasStencil()) { framebufferDesc.stencilAttachment.texture = surfaceTextures.depth; } IGL_DEBUG_ASSERT(ret.isOk()); framebuffer_ = getPlatform().getDevice().createFramebuffer(framebufferDesc, &ret); IGL_DEBUG_ASSERT(ret.isOk()); IGL_DEBUG_ASSERT(framebuffer_ != nullptr); } else { framebuffer_->updateDrawable(surfaceTextures); } const size_t textureUnit = 0; // Graphics pipeline if (pipelineState_ == nullptr) { const RenderPipelineDesc graphicsDesc = { .vertexInputState = vertexInput0_, .shaderStages = shaderStages_, .targetDesc = { .colorAttachments = {{.textureFormat = framebuffer_->getColorAttachment(0)->getFormat()}}, .depthAttachmentFormat = framebuffer_->getDepthAttachment()->getFormat(), .stencilAttachmentFormat = framebuffer_->getStencilAttachment() ? framebuffer_->getStencilAttachment()->getFormat() : igl::TextureFormat::Invalid, }, .cullMode = igl::CullMode::Back, .frontFaceWinding = igl::WindingMode::Clockwise, .fragmentUnitSamplerMap = { std::pair(textureUnit, IGL_NAMEHANDLE("inputImage")), }, }; pipelineState_ = getPlatform().getDevice().createRenderPipeline(graphicsDesc, nullptr); IGL_DEBUG_ASSERT(pipelineState_ != nullptr); // Set up uniformdescriptors fragmentUniformDescriptors_.emplace_back(); } // Command Buffers const auto buffer = commandQueue_->createCommandBuffer(CommandBufferDesc{}, nullptr); IGL_DEBUG_ASSERT(buffer != nullptr); const auto drawableSurface = framebuffer_->getColorAttachment(0); // Uniform: "color" if (!fragmentUniformDescriptors_.empty()) { // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only if (getPlatform().getDevice().hasFeature(DeviceFeatures::BindUniform)) { fragmentUniformDescriptors_.back().location = pipelineState_->getIndexByName("color", igl::ShaderStage::Fragment); } fragmentUniformDescriptors_.back().type = UniformType::Float3; fragmentUniformDescriptors_.back().offset = offsetof(FragmentFormat, color); } // Submit commands const std::shared_ptr commands = buffer->createRenderCommandEncoder(renderPass_, framebuffer_); IGL_DEBUG_ASSERT(commands != nullptr); if (commands) { commands->bindVertexBuffer(getVertexBufferIndex(getPlatform().getDevice()), *vb0_); commands->bindRenderPipelineState(pipelineState_); if (getPlatform().getDevice().hasFeature(DeviceFeatures::BindUniform)) { // Bind non block uniforms for (const auto& uniformDesc : fragmentUniformDescriptors_) { commands->bindUniform(uniformDesc, &fragmentParameters_); } } else if (getPlatform().getDevice().hasFeature(DeviceFeatures::UniformBlocks)) { // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only commands->bindBuffer(0, fragmentParamBuffer_.get()); // @fb-only } else { IGL_DEBUG_ASSERT_NOT_REACHED(); } commands->bindTexture(textureUnit, BindTarget::kFragment, tex0_.get()); commands->bindSamplerState(textureUnit, BindTarget::kFragment, samp0_.get()); commands->bindIndexBuffer(*ib0_, IndexFormat::UInt16); commands->drawIndexed(6); commands->endEncoding(); } IGL_DEBUG_ASSERT(buffer != nullptr); if (shellParams().shouldPresent) { buffer->present(drawableSurface); } IGL_DEBUG_ASSERT(commandQueue_ != nullptr); commandQueue_->submit(*buffer, true); RenderSession::update(surfaceTextures); } } // namespace igl::shell ================================================ FILE: shell/renderSessions/TQSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include #include #include namespace igl::shell { struct FragmentFormat { iglu::simdtypes::float3 color; }; class TQSession : public RenderSession { public: explicit TQSession(std::shared_ptr platform) : RenderSession(std::move(platform)) {} void initialize() noexcept override; void update(SurfaceTextures surfaceTextures) noexcept override; void setUVScale(float uvScale) noexcept { uvScale_ = uvScale; } private: std::shared_ptr pipelineState_; std::shared_ptr vertexInput0_; std::shared_ptr samp0_; std::shared_ptr shaderStages_; std::shared_ptr vb0_; std::shared_ptr ib0_; std::shared_ptr fragmentParamBuffer_; std::shared_ptr depthTexture_; std::shared_ptr tex0_; RenderPassDesc renderPass_; FragmentFormat fragmentParameters_{}; std::vector fragmentUniformDescriptors_; std::vector vertexUniformDescriptors_; float uvScale_ = 1.0f; }; } // namespace igl::shell ================================================ FILE: shell/renderSessions/TextureViewSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @MARK:COVERAGE_EXCLUDE_FILE #include #include #include #include #include #include #include #include #include #include #include namespace { struct VertexPosUvw { glm::vec3 position; glm::vec2 uv; }; constexpr float kHalf = 1.2f; // UV-mapped cube with indices: 24 vertices, 36 indices constexpr VertexPosUvw kVertexData[] = { // top {.position = {-kHalf, -kHalf, +kHalf}, .uv = {0, 0}}, // 0 {.position = {+kHalf, -kHalf, +kHalf}, .uv = {1, 0}}, // 1 {.position = {+kHalf, +kHalf, +kHalf}, .uv = {1, 1}}, // 2 {.position = {-kHalf, +kHalf, +kHalf}, .uv = {0, 1}}, // 3 // bottom {.position = {-kHalf, -kHalf, -kHalf}, .uv = {0, 0}}, // 4 {.position = {-kHalf, +kHalf, -kHalf}, .uv = {0, 1}}, // 5 {.position = {+kHalf, +kHalf, -kHalf}, .uv = {1, 1}}, // 6 {.position = {+kHalf, -kHalf, -kHalf}, .uv = {1, 0}}, // 7 // left {.position = {+kHalf, +kHalf, -kHalf}, .uv = {1, 0}}, // 8 {.position = {-kHalf, +kHalf, -kHalf}, .uv = {0, 0}}, // 9 {.position = {-kHalf, +kHalf, +kHalf}, .uv = {0, 1}}, // 10 {.position = {+kHalf, +kHalf, +kHalf}, .uv = {1, 1}}, // 11 // right {.position = {-kHalf, -kHalf, -kHalf}, .uv = {0, 0}}, // 12 {.position = {+kHalf, -kHalf, -kHalf}, .uv = {1, 0}}, // 13 {.position = {+kHalf, -kHalf, +kHalf}, .uv = {1, 1}}, // 14 {.position = {-kHalf, -kHalf, +kHalf}, .uv = {0, 1}}, // 15 // front {.position = {+kHalf, -kHalf, -kHalf}, .uv = {0, 0}}, // 16 {.position = {+kHalf, +kHalf, -kHalf}, .uv = {1, 0}}, // 17 {.position = {+kHalf, +kHalf, +kHalf}, .uv = {1, 1}}, // 18 {.position = {+kHalf, -kHalf, +kHalf}, .uv = {0, 1}}, // 19 // back {.position = {-kHalf, +kHalf, -kHalf}, .uv = {1, 0}}, // 20 {.position = {-kHalf, -kHalf, -kHalf}, .uv = {0, 0}}, // 21 {.position = {-kHalf, -kHalf, +kHalf}, .uv = {0, 1}}, // 22 {.position = {-kHalf, +kHalf, +kHalf}, .uv = {1, 1}}, // 23 }; constexpr uint16_t kIndexData[] = {0, 1, 2, 2, 3, 0, 4, 5, 6, 6, 7, 4, 8, 9, 10, 10, 11, 8, 12, 13, 14, 14, 15, 12, 16, 17, 18, 18, 19, 16, 20, 21, 22, 22, 23, 20}; std::string getMetalShaderSource() { return R"( #include #include using namespace metal; struct VertexIn { float3 position [[attribute(0)]]; float2 uv [[attribute(1)]]; }; struct VertexOut { float4 position [[position]]; float2 uv; }; vertex VertexOut vertexShader(VertexIn in [[stage_in]], constant float4x4 mvpMatrix [[function_constant(0)]]) { VertexOut out; out.position = mvpMatrix * float4(in.position, 1.0); out.uv = in.uv; return out; } fragment float4 fragmentShader( VertexOut in[[stage_in]], texture2d input2D [[texture(0)]], sampler linearSampler [[sampler(0)]]) { return input2D.sample(linearSampler, in.uv); } )"; } const char* getVulkanFragmentShaderSource() { return R"( precision highp float; layout(location = 0) in vec2 uv; layout(location = 0) out vec4 out_FragColor; layout(set = 0, binding = 0) uniform sampler2D input2D; void main() { out_FragColor = texture(input2D, uv); } )"; } const char* getVulkanVertexShaderSource() { return R"( precision highp float; layout (push_constant) uniform PerFrame { mat4 mvpMatrix; } perFrame; layout(location = 0) in vec3 position; layout(location = 1) in vec2 uvw_in; layout(location = 0) out vec2 uvw; void main() { gl_Position = perFrame.mvpMatrix * vec4(position, 1.0); uvw = uvw_in; } )"; } std::unique_ptr getShaderStagesForBackend(igl::IDevice& device) { switch (device.getBackendType()) { case igl::BackendType::Invalid: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; case igl::BackendType::Vulkan: return igl::ShaderStagesCreator::fromModuleStringInput(device, getVulkanVertexShaderSource(), "main", "", getVulkanFragmentShaderSource(), "main", "", nullptr); case igl::BackendType::D3D12: { static const char* kVS = R"( cbuffer PushConstants : register(b2) { float4x4 mvpMatrix; }; struct VSIn { float3 position : POSITION; float2 uv : TEXCOORD0; }; struct VSOut { float4 position : SV_POSITION; float2 uv : TEXCOORD0; }; VSOut main(VSIn v) { VSOut o; o.position = mul(mvpMatrix, float4(v.position, 1.0)); o.uv = v.uv; return o; } )"; static const char* kPS = R"( Texture2D input2D : register(t0); SamplerState linearSampler : register(s0); struct PSIn { float4 position : SV_POSITION; float2 uv : TEXCOORD0; }; float4 main(PSIn i) : SV_TARGET { return input2D.Sample(linearSampler, i.uv); } )"; return igl::ShaderStagesCreator::fromModuleStringInput( device, kVS, "main", "", kPS, "main", "", nullptr); } case igl::BackendType::Custom: IGL_DEBUG_ABORT("IGLSamples not set up for Custom"); return nullptr; // @fb-only // @fb-only // @fb-only case igl::BackendType::Metal: return igl::ShaderStagesCreator::fromLibraryStringInput( device, getMetalShaderSource().c_str(), "vertexShader", "fragmentShader", "", nullptr); case igl::BackendType::OpenGL: IGL_DEBUG_ABORT("OpenGL not supported"); return nullptr; } IGL_UNREACHABLE_RETURN(nullptr) } } // namespace namespace igl::shell { TextureViewSession::TextureViewSession(std::shared_ptr platform) : RenderSession(std::move(platform)) { imguiSession_ = std::make_unique(getPlatform().getDevice(), getPlatform().getInputDispatcher()); } void TextureViewSession::initialize() noexcept { auto& device = getPlatform().getDevice(); if (!device.hasFeature(DeviceFeatures::TextureViews)) { IGL_SOFT_ERROR("Texture views are not supported"); std::terminate(); } vb_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Vertex, .data = kVertexData, .length = sizeof(kVertexData)}, nullptr); ib_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Index, .data = kIndexData, .length = sizeof(kIndexData)}, nullptr); const VertexInputStateDesc inputDesc = { .numAttributes = 2, .attributes = { { .bufferIndex = 0, .format = VertexAttributeFormat::Float3, .offset = offsetof(VertexPosUvw, position), .name = "position", .location = 0, }, { .bufferIndex = 0, .format = VertexAttributeFormat::Float2, .offset = offsetof(VertexPosUvw, uv), .name = "uv_in", .location = 1, }, }, .numInputBindings = 1, .inputBindings = {{.stride = sizeof(VertexPosUvw)}}, }; vertexInput0_ = device.createVertexInputState(inputDesc, nullptr); shaderStages_ = getShaderStagesForBackend(device); commandQueue_ = device.createCommandQueue({}, nullptr); sampler_ = device.createSamplerState(SamplerStateDesc::newLinearMipmapped(), nullptr); const uint32_t texWidth = 256; const uint32_t texHeight = 256; TextureDesc desc = TextureDesc::new2D(igl::TextureFormat::BGRA_UNorm8, texWidth, texHeight, TextureDesc::TextureUsageBits::Attachment | TextureDesc::TextureUsageBits::Sampled, "Colored mipmaps"); desc.numMipLevels = igl::TextureDesc::calcNumMipLevels(texWidth, texHeight); texture_ = device.createTexture(desc, nullptr); textureViews_.reserve(desc.numMipLevels); for (uint32_t mip = 0; mip != desc.numMipLevels; mip++) { textureViews_.push_back(device.createTextureView(texture_, {.mipLevel = mip}, nullptr)); } // render into the texture to generate custom colored mipmap pyramid auto fb = device.createFramebuffer( FramebufferDesc{ .colorAttachments = {{.texture = texture_}}, }, nullptr); auto buffer = commandQueue_->createCommandBuffer({}, nullptr); const std::array kColors = { Color{1, 0, 0}, Color{0, 1, 0}, Color{0, 0, 1}, Color{1, 1, 0}, Color{0, 1, 1}, Color{1, 0, 1}, Color{1, 0, 0}, Color{0, 1, 0}, Color{0, 0, 1}, Color{0, 0, 0}, }; for (uint32_t i = 0; i != desc.numMipLevels; i++) { const igl::RenderPassDesc pass = { .colorAttachments = {{ .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, .mipLevel = static_cast(i), .clearColor = kColors[i % kColors.size()], }}, }; auto commands = buffer->createRenderCommandEncoder(pass, fb); commands->endEncoding(); } commandQueue_->submit(*buffer); } void TextureViewSession::update(SurfaceTextures surfaceTextures) noexcept { auto& device = getPlatform().getDevice(); const float deltaSeconds = getDeltaSeconds(); fps_.updateFPS(deltaSeconds); // cube animation const glm::mat4 projectionMat = glm::perspectiveLH( glm::radians(45.0f), surfaceTextures.color->getAspectRatio(), 0.1f, 100.0f); angle_ += 90.0f * deltaSeconds; while (angle_ > 360.0f) { angle_ -= 360.0f; } const glm::mat4 mvpMatrix = projectionMat * glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.f, 8.0f)) * glm::rotate( glm::mat4(1.0f), glm::radians(angle_), glm::normalize(glm::vec3(1.0f, 1.0f, 1.0f))); if (!framebuffer_) { framebufferDesc_.colorAttachments[0].texture = surfaceTextures.color; framebufferDesc_.depthAttachment.texture = surfaceTextures.depth; Result ret; framebuffer_ = device.createFramebuffer(framebufferDesc_, &ret); IGL_DEBUG_ASSERT(ret.isOk()); IGL_DEBUG_ASSERT(framebuffer_ != nullptr); } else { framebuffer_->updateDrawable(surfaceTextures.color); } if (!pipelineState_) { Result ret; pipelineState_ = device.createRenderPipeline( RenderPipelineDesc{ .vertexInputState = vertexInput0_, .shaderStages = shaderStages_, .targetDesc = { .colorAttachments = { {.textureFormat = framebuffer_->getColorAttachment(0)->getProperties().format}, }, .depthAttachmentFormat = framebuffer_->getDepthAttachment()->getProperties().format, }, .cullMode = igl::CullMode::Back, .frontFaceWinding = igl::WindingMode::Clockwise, }, &ret); IGL_DEBUG_ASSERT(ret.isOk()); } auto buffer = commandQueue_->createCommandBuffer({}, nullptr); const igl::RenderPassDesc renderPass{ .colorAttachments = {{ .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, .clearColor = getPreferredClearColor(), }}, .depthAttachment = { .loadAction = LoadAction::Clear, .storeAction = StoreAction::DontCare, .clearDepth = 1.0, }, }; const std::shared_ptr commands = buffer->createRenderCommandEncoder(renderPass, framebuffer_); commands->bindTexture(0, texture_.get()); commands->bindSamplerState(0, BindTarget::kFragment, sampler_.get()); commands->bindRenderPipelineState(pipelineState_); if (device.getBackendType() == BackendType::Vulkan) { commands->bindPushConstants(&mvpMatrix, sizeof(mvpMatrix)); } else if (device.getBackendType() == BackendType::Metal) { commands->bindBytes(0, BindTarget::kVertex, &mvpMatrix, sizeof(mvpMatrix)); } else if (device.getBackendType() == BackendType::D3D12) { commands->bindPushConstants(&mvpMatrix, sizeof(mvpMatrix)); } else { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } commands->bindVertexBuffer(0, *vb_); commands->bindIndexBuffer(*ib_, IndexFormat::UInt16); commands->drawIndexed(36); imguiSession_->beginFrame(framebufferDesc_, getPlatform().getDisplayContext().pixelsPerPoint); imguiSession_->drawFPS(fps_.getAverageFPS()); const ImGuiViewport* v = ImGui::GetMainViewport(); ImGui::SetNextWindowPos(ImVec2(10, 10)); ImGui::Begin("Mip-pyramid", nullptr, ImGuiWindowFlags_AlwaysAutoResize); const int width = static_cast(v->WorkSize.x / 5.0f); for (uint32_t mip = 0; mip != textureViews_.size(); mip++) { ImGui::Image(ImTextureID(textureViews_[mip].get()), ImVec2(width >> mip, width >> mip)); } ImGui::End(); imguiSession_->endFrame(device, *commands); commands->endEncoding(); if (shellParams().shouldPresent) { buffer->present(framebuffer_->getColorAttachment(0)); } commandQueue_->submit(*buffer); } } // namespace igl::shell ================================================ FILE: shell/renderSessions/TextureViewSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @MARK:COVERAGE_EXCLUDE_FILE #pragma once #include #include #include #include #include namespace igl::shell { class TextureViewSession : public RenderSession { public: explicit TextureViewSession(std::shared_ptr platform); void initialize() noexcept override; void update(SurfaceTextures surfaceTextures) noexcept override; private: FramebufferDesc framebufferDesc_; std::shared_ptr pipelineState_; std::shared_ptr vertexInput0_; std::shared_ptr shaderStages_; std::shared_ptr vb_, ib_; std::shared_ptr framebuffer_; std::shared_ptr sampler_; std::shared_ptr texture_; std::vector> textureViews_; std::unique_ptr imguiSession_; FPSCounter fps_; float angle_ = 0; }; } // namespace igl::shell ================================================ FILE: shell/renderSessions/Textured3DCubeSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include #include #include // IWYU pragma: keep namespace igl::shell { namespace { struct VertexPosUvw { glm::vec3 position; glm::vec3 uvw; }; const float kHalf = 1.0f; const VertexPosUvw kVertexData0[] = { {.position = {-kHalf, kHalf, -kHalf}, .uvw = {0.0, 1.0, 0.0}}, {.position = {kHalf, kHalf, -kHalf}, .uvw = {1.0, 1.0, 0.0}}, {.position = {-kHalf, -kHalf, -kHalf}, .uvw = {0.0, 0.0, 0.0}}, {.position = {kHalf, -kHalf, -kHalf}, .uvw = {1.0, 0.0, 0.0}}, {.position = {kHalf, kHalf, kHalf}, .uvw = {1.0, 1.0, 1.0}}, {.position = {-kHalf, kHalf, kHalf}, .uvw = {0.0, 1.0, 1.0}}, {.position = {kHalf, -kHalf, kHalf}, .uvw = {1.0, 0.0, 1.0}}, {.position = {-kHalf, -kHalf, kHalf}, .uvw = {0.0, 0.0, 1.0}}, }; const uint16_t kIndexData[] = {0, 1, 2, 1, 3, 2, 1, 4, 3, 4, 6, 3, 4, 5, 6, 5, 7, 6, 5, 0, 7, 0, 2, 7, 5, 4, 0, 4, 1, 0, 2, 3, 7, 3, 6, 7}; std::string getProlog(IDevice& device) { #if IGL_BACKEND_OPENGL const auto shaderVersion = device.getShaderVersion(); if (shaderVersion.majorVersion >= 3 || shaderVersion.minorVersion >= 30) { std::string prependVersionString = igl::opengl::getStringFromShaderVersion(shaderVersion); prependVersionString += "\nprecision highp float;\n"; return prependVersionString; } #endif // IGL_BACKEND_OPENGL return ""; } std::string getMetalShaderSource() { return R"( #include #include using namespace metal; struct VertexUniformBlock { float4x4 mvpMatrix; float scaleZ; }; struct VertexIn { float3 position [[attribute(0)]]; float3 uvw [[attribute(1)]]; }; struct VertexOut { float4 position [[position]]; float3 uvw; }; vertex VertexOut vertexShader(VertexIn in [[stage_in]], constant VertexUniformBlock &vUniform[[buffer(1)]]) { VertexOut out; out.position = vUniform.mvpMatrix * float4(in.position, 1.0); out.uvw = in.uvw; out.uvw = float3( out.uvw.x, out.uvw.y, (out.uvw.z - 0.5f)*vUniform.scaleZ + 0.5f); return out; } fragment float4 fragmentShader( VertexOut in[[stage_in]], texture3d diffuseTex [[texture(0)]], sampler linearSampler [[sampler(0)]]) { constexpr sampler s(s_address::clamp_to_edge, t_address::clamp_to_edge, min_filter::linear, mag_filter::linear); float4 tex = diffuseTex.sample(s, in.uvw); return tex; } )"; } std::string getOpenGLFragmentShaderSource(IDevice& device) { return getProlog(device) + std::string(R"( precision highp float; precision highp sampler3D; in vec3 uvw; uniform sampler3D inputVolume; out vec4 fragmentColor; void main() { fragmentColor = texture(inputVolume, uvw); })"); } std::string getOpenGLVertexShaderSource(IDevice& device) { return getProlog(device) + R"( precision highp float; uniform mat4 mvpMatrix; uniform float scaleZ; in vec3 position; in vec3 uvw_in; out vec3 uvw; void main() { gl_Position = mvpMatrix * vec4(position, 1.0); uvw = vec3(uvw_in.x, uvw_in.y, (uvw_in.z-0.5)*scaleZ+0.5); })"; } const char* getVulkanFragmentShaderSource() { return R"( precision highp float; layout(location = 0) in vec3 uvw; layout(location = 0) out vec4 out_FragColor; layout(set = 0, binding = 0) uniform sampler3D in_texture; void main() { out_FragColor = texture(in_texture, uvw); })"; } const char* getVulkanVertexShaderSource() { return R"( precision highp float; layout (set = 1, binding = 1, std140) uniform PerFrame { mat4 mvpMatrix; float scaleZ; } perFrame; layout(location = 0) in vec3 position; layout(location = 1) in vec3 uvw_in; layout(location = 0) out vec3 uvw; void main() { gl_Position = perFrame.mvpMatrix * vec4(position, 1.0); uvw = vec3(uvw_in.x, uvw_in.y, (uvw_in.z-0.5)*perFrame.scaleZ+0.5); })"; } std::unique_ptr getShaderStagesForBackend(IDevice& device) { switch (device.getBackendType()) { case igl::BackendType::Invalid: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; case igl::BackendType::Vulkan: return igl::ShaderStagesCreator::fromModuleStringInput(device, getVulkanVertexShaderSource(), "main", "", getVulkanFragmentShaderSource(), "main", "", nullptr); case igl::BackendType::D3D12: { static const char* kVS = R"( cbuffer VertexUniforms : register(b1) { float4x4 mvpMatrix; float scaleZ; }; struct VSIn { float3 position : POSITION; float3 uvw : TEXCOORD0; }; struct VSOut { float4 position : SV_POSITION; float3 uvw : TEXCOORD0; }; VSOut main(VSIn v) { VSOut o; o.position = mul(mvpMatrix, float4(v.position,1.0)); o.uvw = float3(v.uvw.x, v.uvw.y, (v.uvw.z - 0.5f)*scaleZ + 0.5f); return o; } )"; static const char* kPS = R"( Texture3D inputVolume : register(t0); SamplerState linearSampler : register(s0); struct PSIn { float4 position : SV_POSITION; float3 uvw : TEXCOORD0; }; float4 main(PSIn i) : SV_TARGET { return inputVolume.Sample(linearSampler, i.uvw); } )"; return igl::ShaderStagesCreator::fromModuleStringInput( device, kVS, "main", "", kPS, "main", "", nullptr); } case igl::BackendType::Custom: IGL_DEBUG_ABORT("IGLSamples not set up for Custom"); return nullptr; // @fb-only // @fb-only // @fb-only case igl::BackendType::Metal: return igl::ShaderStagesCreator::fromLibraryStringInput( device, getMetalShaderSource().c_str(), "vertexShader", "fragmentShader", "", nullptr); case igl::BackendType::OpenGL: return igl::ShaderStagesCreator::fromModuleStringInput( device, getOpenGLVertexShaderSource(device).c_str(), "main", "", getOpenGLFragmentShaderSource(device).c_str(), "main", "", nullptr); } IGL_UNREACHABLE_RETURN(nullptr) } bool isDeviceCompatible(IDevice& device) noexcept { return device.hasFeature(DeviceFeatures::Texture3D); } } // namespace void Textured3DCubeSession::createSamplerAndTextures(const igl::IDevice& device) { // Sampler & Texture samp0_ = device.createSamplerState( SamplerStateDesc{ .minFilter = SamplerMinMagFilter::Linear, .magFilter = SamplerMinMagFilter::Linear, .addressModeU = SamplerAddressMode::MirrorRepeat, .addressModeV = SamplerAddressMode::MirrorRepeat, .addressModeW = SamplerAddressMode::MirrorRepeat, .debugName = "Sampler: linear (MirrorRepeat)", }, nullptr); const uint32_t width = 256; const uint32_t height = 256; const uint32_t depth = 256; const uint32_t bytesPerPixel = 4; auto textureData = std::vector((size_t)width * height * depth * bytesPerPixel); for (uint32_t k = 0; k < depth; ++k) { for (uint32_t j = 0; j < height; ++j) { for (uint32_t i = 0; i < width; ++i) { const uint32_t index = (i + width * j + width * height * k) * bytesPerPixel; const float d = sqrtf((i - 128.0f) * (i - 128.0f) + (j - 128.0f) * (j - 128.0f) + (k - 128.0f) * (k - 128.0f)) / 16.0f; if (d > 7.0f) { textureData[index + 0] = 148; textureData[index + 1] = 0; textureData[index + 2] = 211; textureData[index + 3] = 255; } else if (d > 6.0f) { textureData[index + 0] = 75; textureData[index + 1] = 0; textureData[index + 2] = 130; textureData[index + 3] = 255; } else if (d > 5.0f) { textureData[index + 0] = 0; textureData[index + 1] = 0; textureData[index + 2] = 255; textureData[index + 3] = 255; } else if (d > 4.0f) { textureData[index + 0] = 0; textureData[index + 1] = 255; textureData[index + 2] = 0; textureData[index + 3] = 255; } else if (d > 3.0f) { textureData[index + 0] = 255; textureData[index + 1] = 255; textureData[index + 2] = 0; textureData[index + 3] = 255; } else if (d > 2.0f) { textureData[index + 0] = 255; textureData[index + 1] = 127; textureData[index + 2] = 0; textureData[index + 3] = 255; } else { textureData[index + 0] = 255; textureData[index + 1] = 0; textureData[index + 2] = 0; textureData[index + 3] = 255; } } } } TextureDesc texDesc = igl::TextureDesc::new3D(igl::TextureFormat::RGBA_UNorm8, width, height, depth, igl::TextureDesc::TextureUsageBits::Sampled); texDesc.debugName = "shell/renderSessions/Textured3DCubeSession.cpp:tex0_"; tex0_ = getPlatform().getDevice().createTexture(texDesc, nullptr); const auto range = igl::TextureRangeDesc::new3D(0, 0, 0, width, height, depth); tex0_->upload(range, textureData.data()); } void Textured3DCubeSession::initialize() noexcept { auto& device = getPlatform().getDevice(); if (!isDeviceCompatible(device)) { return; } // Vertex buffer, Index buffer and Vertex Input vb0_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Vertex, .data = kVertexData0, .length = sizeof(kVertexData0)}, nullptr); ib0_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Index, .data = kIndexData, .length = sizeof(kIndexData)}, nullptr); const VertexInputStateDesc inputDesc = { .numAttributes = 2, .attributes = {{ .bufferIndex = 0, .format = VertexAttributeFormat::Float3, .offset = offsetof(VertexPosUvw, position), .name = "position", .location = 0, }, { .bufferIndex = 0, .format = VertexAttributeFormat::Float3, .offset = offsetof(VertexPosUvw, uvw), .name = "uvw_in", .location = 1, }}, .numInputBindings = 1, .inputBindings = {{.stride = sizeof(VertexPosUvw)}}, }; vertexInput0_ = device.createVertexInputState(inputDesc, nullptr); createSamplerAndTextures(device); shaderStages_ = getShaderStagesForBackend(device); // Command queue: backed by different types of GPU HW queues commandQueue_ = device.createCommandQueue({}, nullptr); // Set up vertex uniform data vertexParameters_.scaleZ = 1.0f; renderPass_ = { .colorAttachments = {{ .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, .clearColor = getPreferredClearColor(), }}, .depthAttachment = {.loadAction = LoadAction::Clear, .clearDepth = 1.0}, }; } void Textured3DCubeSession::setVertexParams(float aspectRatio) { // perspective projection const float fov = 45.0f * (M_PI / 180.0f); const glm::mat4 projectionMat = glm::perspectiveLH(fov, aspectRatio, 0.1f, 100.0f); // rotating animation static float angle = 0.0f, scaleZ = 1.0f, ss = 0.005f; angle += 0.005f; scaleZ += ss; scaleZ = scaleZ < 0.0f ? 0.0f : scaleZ > 1.0 ? 1.0f : scaleZ; if (scaleZ <= 0.05f || scaleZ >= 1.0f) { ss *= -1.0f; } const glm::mat4 xform = projectionMat * glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.f, 8.0f)) * glm::rotate(glm::mat4(1.0f), -0.2f, glm::vec3(1.0f, 0.0f, 0.0f)) * glm::rotate(glm::mat4(1.0f), angle, glm::vec3(0.0f, 1.0f, 0.0f)) * glm::scale(glm::mat4(1.0f), glm::vec3(1.0f, 1.0f, scaleZ)); vertexParameters_.mvpMatrix = xform; vertexParameters_.scaleZ = scaleZ; } void Textured3DCubeSession::update(SurfaceTextures surfaceTextures) noexcept { auto& device = getPlatform().getDevice(); if (!isDeviceCompatible(device)) { return; } // cube animation setVertexParams(surfaceTextures.color->getAspectRatio()); Result ret; if (framebuffer_ == nullptr) { framebuffer_ = getPlatform().getDevice().createFramebuffer( FramebufferDesc{ .colorAttachments = {{.texture = surfaceTextures.color}}, .depthAttachment = {.texture = surfaceTextures.depth}, }, &ret); IGL_DEBUG_ASSERT(ret.isOk()); IGL_DEBUG_ASSERT(framebuffer_ != nullptr); } else { framebuffer_->updateDrawable(surfaceTextures.color); } const size_t textureUnit = 0; if (pipelineState_ == nullptr) { // Graphics pipeline: state batch that fully configures GPU for rendering const RenderPipelineDesc graphicsDesc = { .vertexInputState = vertexInput0_, .shaderStages = shaderStages_, .targetDesc = {.colorAttachments = {{.textureFormat = framebuffer_->getColorAttachment(0)->getProperties().format}}, .depthAttachmentFormat = framebuffer_->getDepthAttachment()->getProperties().format}, .cullMode = igl::CullMode::Back, .frontFaceWinding = igl::WindingMode::Clockwise, .fragmentUnitSamplerMap = {{textureUnit, IGL_NAMEHANDLE("inputVolume")}}, }; pipelineState_ = getPlatform().getDevice().createRenderPipeline(graphicsDesc, nullptr); } // Command buffers (1-N per thread): create, submit and forget const auto buffer = commandQueue_->createCommandBuffer({}, nullptr); const std::shared_ptr commands = buffer->createRenderCommandEncoder(renderPass_, framebuffer_); commands->bindVertexBuffer(0, *vb0_); // Bind Vertex Uniform Data const iglu::ManagedUniformBufferInfo info = { .index = 1, .length = sizeof(VertexFormat), .uniforms = { { .name = "mvpMatrix", .location = -1, .type = igl::UniformType::Mat4x4, .numElements = 1, .offset = offsetof(VertexFormat, mvpMatrix), .elementStride = 0, }, { .name = "scaleZ", .location = -1, .type = igl::UniformType::Float, .numElements = 1, .offset = offsetof(VertexFormat, scaleZ), .elementStride = 0, }, }, }; const std::shared_ptr vertUniformBuffer = std::make_shared(device, info); IGL_DEBUG_ASSERT(vertUniformBuffer->result.isOk()); *static_cast(vertUniformBuffer->getData()) = vertexParameters_; vertUniformBuffer->bind(device, *pipelineState_, *commands); commands->bindTexture(textureUnit, BindTarget::kFragment, tex0_.get()); commands->bindSamplerState(textureUnit, BindTarget::kFragment, samp0_.get()); commands->bindRenderPipelineState(pipelineState_); commands->bindIndexBuffer(*ib0_, IndexFormat::UInt16); commands->drawIndexed(static_cast(3u * 6u * 2u)); commands->endEncoding(); if (shellParams().shouldPresent) { buffer->present(framebuffer_->getColorAttachment(0)); } commandQueue_->submit(*buffer); // Guarantees ordering between command buffers } } // namespace igl::shell ================================================ FILE: shell/renderSessions/Textured3DCubeSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include #include #include #include namespace igl::shell { struct VertexFormat { glm::mat4 mvpMatrix; float scaleZ{}; }; class Textured3DCubeSession : public RenderSession { public: explicit Textured3DCubeSession(std::shared_ptr platform) : RenderSession(std::move(platform)) {} void initialize() noexcept override; void update(SurfaceTextures surfaceTextures) noexcept override; private: RenderPassDesc renderPass_; std::shared_ptr pipelineState_; std::shared_ptr vertexInput0_; std::shared_ptr shaderStages_; std::shared_ptr vb0_, ib0_; // Buffers for vertices and indices (or constants) std::shared_ptr tex0_; std::shared_ptr samp0_; VertexFormat vertexParameters_; // utility fns void createSamplerAndTextures(const IDevice& /*device*/); void setVertexParams(float aspectRatio); }; } // namespace igl::shell ================================================ FILE: shell/renderSessions/TinyMeshBindGroupSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include #include #include #include #include #if IGL_BACKEND_OPENGL #include #endif // IGL_BACKEND_OPENGL #if IGL_BACKEND_VULKAN #include #endif // IGL_BACKEND_VULKAN #include #if defined(__clang__) #pragma clang diagnostic ignored "-Wimplicit-fallthrough" #pragma clang diagnostic ignored "-Wunused-variable" #pragma clang diagnostic ignored "-Wunused-function" #endif // __clang__ #include #define TINY_TEST_USE_DEPTH_BUFFER 1 // On iOS for Xcode 16.3, std::to_chars is not available. To avoid an error, we should not include // std::format, and switch to using fmt/format instead. This define is used in conjunction with // others below, as this is not the only reason not to include std::format. // // Note: the _LIBCPP_AVAILABILITY_HAS_TO_CHARS_FLOATING_POINT is defined in libc++'s <__config> // header, which is includes by all other headers. We include and above #define IGL_INCLUDE_FORMAT (!IGL_PLATFORM_APPLE || _LIBCPP_AVAILABILITY_HAS_TO_CHARS_FLOATING_POINT) // libc++'s implementation of std::format has a large binary size impact // (https://github.com/llvm/llvm-project/issues/64180), so avoid it on Android. #if !defined(IGL_FORMAT) #if defined(__cpp_lib_format) && !defined(__ANDROID__) && IGL_INCLUDE_FORMAT #include #define IGL_FORMAT std::format #else #include #define IGL_FORMAT fmt::format #endif // __cpp_lib_format #endif // !defined(IGL_FORMAT) namespace igl::shell { using namespace igl; using glm::mat4; using glm::vec2; using glm::vec3; using glm::vec4; namespace { const uint32_t kDynamicBufferMask = 0b10; [[maybe_unused]] std::string stringReplaceAll(const char* input, const char* searchString, const char* replaceString) { std::string s(input); const size_t len = strlen(searchString); size_t pos = 0; while ((pos = s.find(searchString, pos)) != std::string::npos) { s.replace(pos, len, replaceString); } return s; } constexpr uint32_t kNumBufferedFrames = 3; int width = 0; int height = 0; constexpr uint32_t kNumCubes = 256; struct VertexPosUvw { vec3 position; vec3 color; vec2 uv; }; struct UniformsPerFrame { mat4 proj; mat4 view; }; struct UniformsPerObject { mat4 model; }; // from igl/shell/renderSessions/Textured3DCubeSession.cpp const float kHalf = 1.0f; // UV-mapped cube with indices: 24 vertices, 36 indices const VertexPosUvw kVertexData0[] = { // top {.position = {-kHalf, -kHalf, +kHalf}, .color = {0.0, 0.0, 1.0}, .uv = {0, 0}}, // 0 {.position = {+kHalf, -kHalf, +kHalf}, .color = {1.0, 0.0, 1.0}, .uv = {1, 0}}, // 1 {.position = {+kHalf, +kHalf, +kHalf}, .color = {1.0, 1.0, 1.0}, .uv = {1, 1}}, // 2 {.position = {-kHalf, +kHalf, +kHalf}, .color = {0.0, 1.0, 1.0}, .uv = {0, 1}}, // 3 // bottom {.position = {-kHalf, -kHalf, -kHalf}, .color = {1.0, 1.0, 1.0}, .uv = {0, 0}}, // 4 {.position = {-kHalf, +kHalf, -kHalf}, .color = {0.0, 1.0, 0.0}, .uv = {0, 1}}, // 5 {.position = {+kHalf, +kHalf, -kHalf}, .color = {1.0, 1.0, 0.0}, .uv = {1, 1}}, // 6 {.position = {+kHalf, -kHalf, -kHalf}, .color = {1.0, 0.0, 0.0}, .uv = {1, 0}}, // 7 // left {.position = {+kHalf, +kHalf, -kHalf}, .color = {1.0, 1.0, 0.0}, .uv = {1, 0}}, // 8 {.position = {-kHalf, +kHalf, -kHalf}, .color = {0.0, 1.0, 0.0}, .uv = {0, 0}}, // 9 {.position = {-kHalf, +kHalf, +kHalf}, .color = {0.0, 1.0, 1.0}, .uv = {0, 1}}, // 10 {.position = {+kHalf, +kHalf, +kHalf}, .color = {1.0, 1.0, 1.0}, .uv = {1, 1}}, // 11 // right {.position = {-kHalf, -kHalf, -kHalf}, .color = {1.0, 1.0, 1.0}, .uv = {0, 0}}, // 12 {.position = {+kHalf, -kHalf, -kHalf}, .color = {1.0, 0.0, 0.0}, .uv = {1, 0}}, // 13 {.position = {+kHalf, -kHalf, +kHalf}, .color = {1.0, 0.0, 1.0}, .uv = {1, 1}}, // 14 {.position = {-kHalf, -kHalf, +kHalf}, .color = {0.0, 0.0, 1.0}, .uv = {0, 1}}, // 15 // front {.position = {+kHalf, -kHalf, -kHalf}, .color = {1.0, 0.0, 0.0}, .uv = {0, 0}}, // 16 {.position = {+kHalf, +kHalf, -kHalf}, .color = {1.0, 1.0, 0.0}, .uv = {1, 0}}, // 17 {.position = {+kHalf, +kHalf, +kHalf}, .color = {1.0, 1.0, 1.0}, .uv = {1, 1}}, // 18 {.position = {+kHalf, -kHalf, +kHalf}, .color = {1.0, 0.0, 1.0}, .uv = {0, 1}}, // 19 // back {.position = {-kHalf, +kHalf, -kHalf}, .color = {0.0, 1.0, 0.0}, .uv = {1, 0}}, // 20 {.position = {-kHalf, -kHalf, -kHalf}, .color = {1.0, 1.0, 1.0}, .uv = {0, 0}}, // 21 {.position = {-kHalf, -kHalf, +kHalf}, .color = {0.0, 0.0, 1.0}, .uv = {0, 1}}, // 22 {.position = {-kHalf, +kHalf, +kHalf}, .color = {0.0, 1.0, 1.0}, .uv = {1, 1}}, // 23 }; uint16_t indexData[] = {0, 1, 2, 2, 3, 0, 4, 5, 6, 6, 7, 4, 8, 9, 10, 10, 11, 8, 12, 13, 14, 14, 15, 12, 16, 17, 18, 18, 19, 16, 20, 21, 22, 22, 23, 20}; UniformsPerFrame perFrame; UniformsPerObject perObject[kNumCubes]; vec3 axis[kNumCubes]; #if IGL_BACKEND_METAL [[nodiscard]] std::string getMetalShaderSource() { return R"( #include #include using namespace metal; constant float2 pos[3] = { float2(-0.6, -0.4), float2( 0.6, -0.4), float2( 0.0, 0.6) }; constant float3 col[3] = { float3(1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 0.0, 1.0) }; struct VertexOut { float4 position [[position]]; float3 uvw; }; vertex VertexOut vertexShader(uint vid [[vertex_id]]) { VertexOut out; out.position = float4(pos[vid], 0.0, 1.0); out.uvw = col[vid]; return out; } fragment float4 fragmentShader( VertexOut in[[stage_in]]) { float4 tex = float4(in.uvw,1.0); return tex; } )"; } #endif // IGL_BACKEND_METAL [[nodiscard]] const char* getVulkanVertexShaderSource() { return R"( layout (location=0) in vec3 pos; layout (location=1) in vec3 col; layout (location=2) in vec2 st; layout (location=0) out vec3 color; layout (location=1) out vec2 uv; #if VULKAN layout (set = 1, binding = 0, std140) #else layout (binding = 0, std140) #endif uniform UniformsPerFrame { mat4 proj; mat4 view; } perFrame; #if VULKAN layout (set = 1, binding = 1, std140) #else layout (binding = 1, std140) #endif uniform UniformsPerObject { mat4 model; } perObject; void main() { mat4 proj = perFrame.proj; mat4 view = perFrame.view; mat4 model = perObject.model; gl_Position = proj * view * model * vec4(pos, 1.0); color = col; uv = st; } )"; } [[nodiscard]] const char* getVulkanFragmentShaderSource() { return R"( layout (location=0) in vec3 color; layout (location=1) in vec2 uv; layout (location=0) out vec4 out_FragColor; #if VULKAN layout (set = 0, binding = 0) uniform sampler2D uTex0; layout (set = 0, binding = 1) uniform sampler2D uTex1; #else layout (binding = 0) uniform sampler2D uTex0; layout (binding = 1) uniform sampler2D uTex1; #endif void main() { vec4 t0 = texture(uTex0, 2.0 * uv); vec4 t1 = texture(uTex1, uv); out_FragColor = vec4(2.0 * color * (t0.rgb * t1.rgb), 1.0); }; )"; } [[nodiscard]] std::unique_ptr getShaderStagesForBackend(IDevice& device) { switch (device.getBackendType()) { case igl::BackendType::Invalid: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; #if IGL_BACKEND_VULKAN case igl::BackendType::Vulkan: return igl::ShaderStagesCreator::fromModuleStringInput(device, getVulkanVertexShaderSource(), "main", "", getVulkanFragmentShaderSource(), "main", "", nullptr); #endif // IGL_BACKEND_VULKAN // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only #if IGL_BACKEND_METAL case igl::BackendType::Metal: return igl::ShaderStagesCreator::fromLibraryStringInput( device, getMetalShaderSource().c_str(), "vertexShader", "fragmentShader", "", nullptr); #endif // IGL_BACKEND_METAL #if IGL_BACKEND_OPENGL case igl::BackendType::OpenGL: { auto glVersion = static_cast(device).getContext().deviceFeatures().getGLVersion(); if (glVersion > igl::opengl::GLVersion::v2_1) { const std::string codeVS1 = stringReplaceAll(getVulkanVertexShaderSource(), "gl_VertexIndex", "gl_VertexID"); auto codeVS2 = "#version 460\n" + codeVS1; auto codeFS = "#version 460\n" + std::string(getVulkanFragmentShaderSource()); return igl::ShaderStagesCreator::fromModuleStringInput( device, codeVS2.c_str(), "main", "", codeFS.c_str(), "main", "", nullptr); } else { IGL_DEBUG_ABORT("This sample is incompatible with OpenGL 2.1"); return nullptr; } } #endif // IGL_BACKEND_OPENGL case igl::BackendType::D3D12: { static const char* kVS = R"( cbuffer UniformsPerFrame : register(b0) { float4x4 proj; float4x4 view; }; cbuffer UniformsPerObject : register(b1) { float4x4 model; }; struct VSInput { float3 pos:POSITION; float3 col:COLOR; float2 st:TEXCOORD0; }; struct PSInput { float4 position:SV_POSITION; float3 color:COLOR; float2 uv:TEXCOORD0; }; PSInput main(VSInput input){ PSInput o; float4 p = mul(model, float4(input.pos,1)); p=mul(view,p); o.position=mul(proj,p); o.color=input.col; o.uv=input.st; return o; } )"; static const char* kPS = R"( Texture2D uTex0:register(t0); Texture2D uTex1:register(t1); SamplerState s0:register(s0); SamplerState s1:register(s1); struct PSInput { float4 position:SV_POSITION; float3 color:COLOR; float2 uv:TEXCOORD0; }; float4 main(PSInput input):SV_TARGET{ float3 t0=uTex0.Sample(s0,input.uv*2).rgb; float3 t1=uTex1.Sample(s1,input.uv).rgb; return float4(2.0*input.color*(t0*t1),1.0); } )"; return igl::ShaderStagesCreator::fromModuleStringInput( device, kVS, "main", "", kPS, "main", "", nullptr); } default: IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); return nullptr; } } } // namespace TinyMeshBindGroupSession::TinyMeshBindGroupSession(std::shared_ptr platform) : RenderSession(std::move(platform)) { listener_ = std::make_shared(*this); getPlatform().getInputDispatcher().addKeyListener(listener_); imguiSession_ = std::make_unique(getPlatform().getDevice(), getPlatform().getInputDispatcher()); } void TinyMeshBindGroupSession::initialize() noexcept { device_ = &getPlatform().getDevice(); // Vertex buffer, Index buffer and Vertex Input. Buffers are allocated in GPU memory. vb0_ = device_->createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Vertex, .data = kVertexData0, .length = sizeof(kVertexData0), .storage = ResourceStorage::Private, .debugName = "Buffer: vertex"}, nullptr); ib0_ = device_->createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Index, .data = indexData, .length = sizeof(indexData), .storage = ResourceStorage::Private, .debugName = "Buffer: index"}, nullptr); // create an Uniform buffers to store uniforms for 2 objects for (uint32_t i = 0; i != kNumBufferedFrames; i++) { ubPerFrame_.push_back( device_->createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Uniform, .data = &perFrame, .length = sizeof(UniformsPerFrame), .storage = ResourceStorage::Shared, .hint = BufferDesc::BufferAPIHintBits::UniformBlock, .debugName = "Buffer: uniforms (per frame)"}, nullptr)); ubPerObject_.push_back( device_->createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Uniform, .data = perObject, .length = kNumCubes * sizeof(UniformsPerObject), .storage = ResourceStorage::Shared, .hint = BufferDesc::BufferAPIHintBits::UniformBlock, .debugName = "Buffer: uniforms (per object)"}, nullptr)); } { VertexInputStateDesc desc; desc.numAttributes = 3; desc.attributes[0].format = VertexAttributeFormat::Float3; desc.attributes[0].offset = offsetof(VertexPosUvw, position); desc.attributes[0].name = "pos"; desc.attributes[0].bufferIndex = 0; desc.attributes[0].location = 0; desc.attributes[1].format = VertexAttributeFormat::Float3; desc.attributes[1].offset = offsetof(VertexPosUvw, color); desc.attributes[1].name = "col"; desc.attributes[1].bufferIndex = 0; desc.attributes[1].location = 1; desc.attributes[2].format = VertexAttributeFormat::Float2; desc.attributes[2].offset = offsetof(VertexPosUvw, uv); desc.attributes[2].name = "st"; desc.attributes[2].bufferIndex = 0; desc.attributes[2].location = 2; desc.numInputBindings = 1; desc.inputBindings[0].stride = sizeof(VertexPosUvw); vertexInput0_ = device_->createVertexInputState(desc, nullptr); } { DepthStencilStateDesc desc; desc.isDepthWriteEnabled = true; desc.compareFunction = igl::CompareFunction::Less; depthStencilState_ = device_->createDepthStencilState(desc, nullptr); } // Command queue: backed by different types of GPU HW queues commandQueue_ = device_->createCommandQueue({}, nullptr); renderPass_.colorAttachments.emplace_back(); renderPass_.colorAttachments.back().loadAction = LoadAction::Clear; renderPass_.colorAttachments.back().storeAction = StoreAction::Store; renderPass_.colorAttachments.back().clearColor = {1.0f, 0.0f, 0.0f, 1.0f}; #if TINY_TEST_USE_DEPTH_BUFFER renderPass_.depthAttachment.loadAction = LoadAction::Clear; renderPass_.depthAttachment.clearDepth = 1.0; #else renderPass_.depthAttachment.loadAction = LoadAction::DontCare; #endif // TINY_TEST_USE_DEPTH_BUFFER // initialize random rotation axes for all cubes for (auto& axi : axis) { axi = glm::sphericalRand(1.0f); } } void TinyMeshBindGroupSession::createRenderPipeline() { if (renderPipelineStateMesh_) { return; } IGL_DEBUG_ASSERT(framebuffer_); RenderPipelineDesc desc; desc.targetDesc.colorAttachments.resize(1); desc.targetDesc.colorAttachments[0].textureFormat = framebuffer_->getColorAttachment(0)->getProperties().format; if (framebuffer_->getDepthAttachment()) { desc.targetDesc.depthAttachmentFormat = framebuffer_->getDepthAttachment()->getProperties().format; } desc.vertexInputState = vertexInput0_; desc.shaderStages = getShaderStagesForBackend(*device_); #if !TINY_TEST_USE_DEPTH_BUFFER desc.cullMode = igl::CullMode::Back; #endif // TINY_TEST_USE_DEPTH_BUFFER desc.frontFaceWinding = igl::WindingMode::Clockwise; desc.isDynamicBufferMask = kDynamicBufferMask; desc.debugName = igl::genNameHandle("Pipeline: mesh"); desc.fragmentUnitSamplerMap[0] = IGL_NAMEHANDLE("uTex0"); desc.fragmentUnitSamplerMap[1] = IGL_NAMEHANDLE("uTex1"); renderPipelineStateMesh_ = device_->createRenderPipeline(desc, nullptr); { const uint32_t texWidth = 256; const uint32_t texHeight = 256; const TextureDesc desc2D = TextureDesc::new2D(igl::TextureFormat::BGRA_SRGB, texWidth, texHeight, TextureDesc::TextureUsageBits::Sampled, "XOR pattern"); texture0_ = device_->createTexture(desc2D, nullptr); std::vector pixels(texWidth * texHeight); for (uint32_t y = 0; y != texHeight; y++) { for (uint32_t x = 0; x != texWidth; x++) { // create a XOR pattern pixels[y * texWidth + x] = 0xFF000000 + ((x ^ y) << 16) + ((x ^ y) << 8) + (x ^ y); } } texture0_->upload(TextureRangeDesc::new2D(0, 0, texWidth, texHeight), pixels.data()); } { using namespace std::filesystem; path dir = current_path(); // find IGLU somewhere above our current directory // @fb-only const char* contentFolder = "shell/resources/"; // @fb-only while (dir != current_path().root_path() && !exists(dir / path(contentFolder))) { dir = dir.parent_path(); } int32_t texWidth = 0; int32_t texHeight = 0; int32_t channels = 0; uint8_t* pixels = stbi_load((dir / path(contentFolder) / path("images/marble.png")).string().c_str(), &texWidth, &texHeight, &channels, 4); IGL_DEBUG_ASSERT(pixels, "Cannot load texture."); const TextureDesc desc2D = TextureDesc::new2D(igl::TextureFormat::RGBA_SRGB, texWidth, texHeight, TextureDesc::TextureUsageBits::Sampled, "marble.png"); texture1_ = device_->createTexture(desc2D, nullptr); texture1_->upload(TextureRangeDesc::new2D(0, 0, texWidth, texHeight), pixels); stbi_image_free(pixels); } { SamplerStateDesc samplerDesc = igl::SamplerStateDesc::newLinear(); samplerDesc.addressModeU = igl::SamplerAddressMode::Repeat; samplerDesc.addressModeV = igl::SamplerAddressMode::Repeat; samplerDesc.debugName = "Sampler: linear"; sampler_ = device_->createSamplerState(samplerDesc, nullptr); } for (uint32_t i = 0; i != kNumBufferedFrames; i++) { bindGroupBuffers_.push_back(device_->createBindGroup({ .buffers{ubPerFrame_[i], ubPerObject_[i]}, .size{sizeof(UniformsPerFrame), sizeof(UniformsPerObject)}, .isDynamicBufferMask = kDynamicBufferMask, .debugName = IGL_FORMAT("bindGroupBuffers_[{}]", i), })); } bindGroupTextures_ = device_->createBindGroup({ .textures = {texture0_, texture1_}, .samplers = {sampler_, sampler_}, .debugName = "bindGroup_", }); bindGroupNoTexture1_ = device_->createBindGroup( { .textures = {texture0_}, .samplers = {sampler_}, .debugName = "bindGroupNoTexture1_", }, // as we don't provide all necessary textures, let IGL/Vulkan add dummies where necessary renderPipelineStateMesh_.get()); } std::shared_ptr TinyMeshBindGroupSession::getVulkanNativeDepth() { #if IGL_BACKEND_VULKAN if (device_->getBackendType() == BackendType::Vulkan) { const auto& vkPlatformDevice = device_->getPlatformDevice(); IGL_DEBUG_ASSERT(vkPlatformDevice != nullptr); Result ret; std::shared_ptr drawable = vkPlatformDevice->createTextureFromNativeDepth(width, height, &ret); IGL_DEBUG_ASSERT(ret.isOk()); return drawable; } #endif // IGL_BACKEND_VULKAN // TODO: unhardcode Vulkan assumption above return nullptr; } void TinyMeshBindGroupSession::update(SurfaceTextures surfaceTextures) noexcept { width = surfaceTextures.color->getSize().width; height = surfaceTextures.color->getSize().height; const float deltaSeconds = getDeltaSeconds(); fps_.updateFPS(deltaSeconds); currentTime_ += deltaSeconds; if (!framebuffer_) { framebufferDesc_.colorAttachments[0].texture = surfaceTextures.color; #if TINY_TEST_USE_DEPTH_BUFFER framebufferDesc_.depthAttachment.texture = getVulkanNativeDepth(); #endif // TINY_TEST_USE_DEPTH_BUFFER framebuffer_ = device_->createFramebuffer(framebufferDesc_, nullptr); IGL_DEBUG_ASSERT(framebuffer_); createRenderPipeline(); } framebuffer_->updateDrawable(surfaceTextures.color); // from igl/shell/renderSessions/Textured3DCubeSession.cpp const float fov = float(45.0f * (M_PI / 180.0f)); const float aspectRatio = (float)width / (float)height; perFrame.proj = glm::perspectiveLH(fov, aspectRatio, 0.1f, 500.0f); // place a "camera" behind the cubes, the distance depends on the total number of cubes perFrame.view = glm::translate(mat4(1.0f), vec3(0.0f, 0.0f, sqrtf(kNumCubes / 16.0f) * 20.0f * kHalf)); ubPerFrame_[frameIndex_]->upload(&perFrame, BufferRange(sizeof(perFrame))); // rotate cubes around random axes for (uint32_t i = 0; i != kNumCubes; i++) { const float direction = powf(-1, (float)(i + 1)); const uint32_t cubesInLine = (uint32_t)sqrt(kNumCubes); const vec3 offset = vec3(-1.5f * sqrt(kNumCubes) + 4.0f * static_cast(i % cubesInLine), -1.5f * sqrt(kNumCubes) + 4.0f * std::floor(static_cast(i) / cubesInLine), 0); perObject[i].model = glm::rotate(glm::translate(mat4(1.0f), offset), float(direction * currentTime_), axis[i]); } ubPerObject_[frameIndex_]->upload(&perObject, BufferRange(sizeof(perObject))); // Command buffers (1-N per thread): create, submit and forget const std::shared_ptr buffer = commandQueue_->createCommandBuffer({}, nullptr); const igl::Viewport viewport = {.x = 0.0f, .y = 0.0f, .width = (float)width, .height = (float)height, .minDepth = 0.0f, .maxDepth = +1.0f}; const igl::ScissorRect scissor = { .x = 0, .y = 0, .width = (uint32_t)width, .height = (uint32_t)height}; // This will clear the framebuffer auto commands = buffer->createRenderCommandEncoder(renderPass_, framebuffer_); commands->bindRenderPipelineState(renderPipelineStateMesh_); commands->bindViewport(viewport); commands->bindScissorRect(scissor); commands->pushDebugGroupLabel("Render Mesh", Color(1, 0, 0)); commands->bindVertexBuffer(0, *vb0_); commands->bindDepthStencilState(depthStencilState_); commands->bindBindGroup(bindGroupTextures_); // Draw 2 cubes: we use uniform buffer to update matrices commands->bindIndexBuffer(*ib0_, IndexFormat::UInt16); for (uint32_t i = 0; i != kNumCubes; i++) { const uint32_t dynamicOffset = i * sizeof(UniformsPerObject); commands->bindBindGroup(bindGroupBuffers_[frameIndex_], 1, &dynamicOffset); commands->drawIndexed(3u * 6u * 2u); } commands->popDebugGroupLabel(); { imguiSession_->beginFrame(framebufferDesc_, getPlatform().getDisplayContext().pixelsPerPoint); ImGui::Begin("Texture Viewer", nullptr, ImGuiWindowFlags_AlwaysAutoResize); ImGui::Image(ImTextureID(texture1_.get()), ImVec2(512, 512)); ImGui::End(); imguiSession_->drawFPS(fps_.getAverageFPS()); imguiSession_->endFrame(getPlatform().getDevice(), *commands); } commands->endEncoding(); buffer->present(surfaceTextures.color); commandQueue_->submit(*buffer); frameIndex_ = (frameIndex_ + 1) % kNumBufferedFrames; } bool TinyMeshBindGroupSession::Listener::process(const CharEvent& event) { if (event.character == 't') { if (!session.bindGroupNoTexture1_.empty()) { session.bindGroupTextures_ = std::move(session.bindGroupNoTexture1_); // make sure we deallocate texture1 session.bindGroupNoTexture1_ = nullptr; session.texture1_.reset(); } return true; } return false; } } // namespace igl::shell ================================================ FILE: shell/renderSessions/TinyMeshBindGroupSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include #include #include #include namespace igl::shell { class TinyMeshBindGroupSession : public RenderSession { public: explicit TinyMeshBindGroupSession(std::shared_ptr platform); void initialize() noexcept override; void update(SurfaceTextures surfaceTextures) noexcept override; std::shared_ptr getVulkanNativeDepth(); void createRenderPipeline(); private: IDevice* device_{}; RenderPassDesc renderPass_; FramebufferDesc framebufferDesc_; std::shared_ptr framebuffer_; std::shared_ptr renderPipelineStateMesh_; std::shared_ptr vb0_, ib0_; // buffers for vertices and indices std::vector> ubPerFrame_, ubPerObject_; std::shared_ptr vertexInput0_; std::shared_ptr depthStencilState_; std::shared_ptr texture0_, texture1_; std::shared_ptr sampler_; Holder bindGroupTextures_; Holder bindGroupNoTexture1_; std::vector> bindGroupBuffers_; uint32_t frameIndex_{0}; std::unique_ptr imguiSession_; struct Listener : public IKeyListener { explicit Listener(TinyMeshBindGroupSession& session) : session(session) {} bool process(const CharEvent& event) override; TinyMeshBindGroupSession& session; }; std::shared_ptr listener_; FPSCounter fps_; double currentTime_ = 0; }; } // namespace igl::shell ================================================ FILE: shell/renderSessions/TinyMeshSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include #include #include #include #include #include #if IGL_BACKEND_OPENGL #include #endif // IGL_BACKEND_OPENGL #if IGL_BACKEND_VULKAN #include #endif // IGL_BACKEND_VULKAN #if defined(__clang__) #pragma clang diagnostic ignored "-Wimplicit-fallthrough" #pragma clang diagnostic ignored "-Wunused-variable" #pragma clang diagnostic ignored "-Wunused-function" #endif // __clang__ #include #define TINY_TEST_USE_DEPTH_BUFFER 1 namespace igl::shell { namespace { [[maybe_unused, nodiscard]] std::string stringReplaceAll(const char* input, const char* searchString, const char* replaceString) { std::string s(input); const size_t len = strlen(searchString); size_t pos = 0; while ((pos = s.find(searchString, pos)) != std::string::npos) { s.replace(pos, len, replaceString); } return s; } constexpr uint32_t kNumBufferedFrames = 3; int width = 0; int height = 0; constexpr uint32_t kNumCubes = 256; struct VertexPosUvw { glm::vec3 position; glm::vec3 color; glm::vec2 uv; }; struct UniformsPerFrame { glm::mat4 proj; glm::mat4 view; }; struct UniformsPerObject { glm::mat4 model; }; // from igl/shell/renderSessions/Textured3DCubeSession.cpp constexpr float kHalf = 1.0f; // UV-mapped cube with indices: 24 vertices, 36 indices const VertexPosUvw kVertexData0[] = { // top {.position = {-kHalf, -kHalf, +kHalf}, .color = {0.0, 0.0, 1.0}, .uv = {0, 0}}, // 0 {.position = {+kHalf, -kHalf, +kHalf}, .color = {1.0, 0.0, 1.0}, .uv = {1, 0}}, // 1 {.position = {+kHalf, +kHalf, +kHalf}, .color = {1.0, 1.0, 1.0}, .uv = {1, 1}}, // 2 {.position = {-kHalf, +kHalf, +kHalf}, .color = {0.0, 1.0, 1.0}, .uv = {0, 1}}, // 3 // bottom {.position = {-kHalf, -kHalf, -kHalf}, .color = {1.0, 1.0, 1.0}, .uv = {0, 0}}, // 4 {.position = {-kHalf, +kHalf, -kHalf}, .color = {0.0, 1.0, 0.0}, .uv = {0, 1}}, // 5 {.position = {+kHalf, +kHalf, -kHalf}, .color = {1.0, 1.0, 0.0}, .uv = {1, 1}}, // 6 {.position = {+kHalf, -kHalf, -kHalf}, .color = {1.0, 0.0, 0.0}, .uv = {1, 0}}, // 7 // left {.position = {+kHalf, +kHalf, -kHalf}, .color = {1.0, 1.0, 0.0}, .uv = {1, 0}}, // 8 {.position = {-kHalf, +kHalf, -kHalf}, .color = {0.0, 1.0, 0.0}, .uv = {0, 0}}, // 9 {.position = {-kHalf, +kHalf, +kHalf}, .color = {0.0, 1.0, 1.0}, .uv = {0, 1}}, // 10 {.position = {+kHalf, +kHalf, +kHalf}, .color = {1.0, 1.0, 1.0}, .uv = {1, 1}}, // 11 // right {.position = {-kHalf, -kHalf, -kHalf}, .color = {1.0, 1.0, 1.0}, .uv = {0, 0}}, // 12 {.position = {+kHalf, -kHalf, -kHalf}, .color = {1.0, 0.0, 0.0}, .uv = {1, 0}}, // 13 {.position = {+kHalf, -kHalf, +kHalf}, .color = {1.0, 0.0, 1.0}, .uv = {1, 1}}, // 14 {.position = {-kHalf, -kHalf, +kHalf}, .color = {0.0, 0.0, 1.0}, .uv = {0, 1}}, // 15 // front {.position = {+kHalf, -kHalf, -kHalf}, .color = {1.0, 0.0, 0.0}, .uv = {0, 0}}, // 16 {.position = {+kHalf, +kHalf, -kHalf}, .color = {1.0, 1.0, 0.0}, .uv = {1, 0}}, // 17 {.position = {+kHalf, +kHalf, +kHalf}, .color = {1.0, 1.0, 1.0}, .uv = {1, 1}}, // 18 {.position = {+kHalf, -kHalf, +kHalf}, .color = {1.0, 0.0, 1.0}, .uv = {0, 1}}, // 19 // back {.position = {-kHalf, +kHalf, -kHalf}, .color = {0.0, 1.0, 0.0}, .uv = {1, 0}}, // 20 {.position = {-kHalf, -kHalf, -kHalf}, .color = {1.0, 1.0, 1.0}, .uv = {0, 0}}, // 21 {.position = {-kHalf, -kHalf, +kHalf}, .color = {0.0, 0.0, 1.0}, .uv = {0, 1}}, // 22 {.position = {-kHalf, +kHalf, +kHalf}, .color = {0.0, 1.0, 1.0}, .uv = {1, 1}}, // 23 }; constexpr uint16_t kIndexData[] = {0, 1, 2, 2, 3, 0, 4, 5, 6, 6, 7, 4, 8, 9, 10, 10, 11, 8, 12, 13, 14, 14, 15, 12, 16, 17, 18, 18, 19, 16, 20, 21, 22, 22, 23, 20}; UniformsPerFrame perFrame; UniformsPerObject perObject[kNumCubes]; glm::vec3 axis[kNumCubes]; #if IGL_BACKEND_METAL [[nodiscard]] const char* getMetalShaderSource() { return R"( #include #include using namespace metal; constant float2 pos[3] = { float2(-0.6, -0.4), float2( 0.6, -0.4), float2( 0.0, 0.6) }; constant float3 col[3] = { float3(1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 0.0, 1.0) }; struct VertexOut { float4 position [[position]]; float3 uvw; }; vertex VertexOut vertexShader(uint vid [[vertex_id]]) { VertexOut out; out.position = float4(pos[vid], 0.0, 1.0); out.uvw = col[vid]; return out; } fragment float4 fragmentShader( VertexOut in[[stage_in]]) { float4 tex = float4(in.uvw,1.0); return tex; } )"; } #endif // IGL_BACKEND_METAL [[nodiscard]] const char* getVulkanVertexShaderSource() { return R"( layout (location=0) in vec3 pos; layout (location=1) in vec3 col; layout (location=2) in vec2 st; layout (location=0) out vec3 color; layout (location=1) out vec2 uv; #if VULKAN layout (set = 1, binding = 0, std140) #else layout (binding = 0, std140) #endif uniform UniformsPerFrame { mat4 proj; mat4 view; } perFrame; #if VULKAN layout (set = 1, binding = 1, std140) #else layout (binding = 1, std140) #endif uniform UniformsPerObject { mat4 model; } perObject; void main() { mat4 proj = perFrame.proj; mat4 view = perFrame.view; mat4 model = perObject.model; gl_Position = proj * view * model * vec4(pos, 1.0); color = col; uv = st; } )"; } [[nodiscard]] const char* getVulkanFragmentShaderSource() { return R"( layout (location=0) in vec3 color; layout (location=1) in vec2 uv; layout (location=0) out vec4 out_FragColor; #if VULKAN layout (set = 0, binding = 0) uniform sampler2D uTex0; layout (set = 0, binding = 1) uniform sampler2D uTex1; #else layout (binding = 0) uniform sampler2D uTex0; layout (binding = 1) uniform sampler2D uTex1; #endif void main() { vec4 t0 = texture(uTex0, 2.0 * uv); vec4 t1 = texture(uTex1, uv); out_FragColor = vec4(2.0 * color * (t0.rgb * t1.rgb), 1.0); }; )"; } [[nodiscard]] std::unique_ptr getShaderStagesForBackend(IDevice& device) { switch (device.getBackendType()) { case igl::BackendType::Invalid: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; #if IGL_BACKEND_VULKAN case igl::BackendType::Vulkan: return igl::ShaderStagesCreator::fromModuleStringInput(device, getVulkanVertexShaderSource(), "main", "", getVulkanFragmentShaderSource(), "main", "", nullptr); #endif // IGL_BACKEND_VULKAN // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only #if IGL_BACKEND_METAL case igl::BackendType::Metal: return igl::ShaderStagesCreator::fromLibraryStringInput( device, getMetalShaderSource(), "vertexShader", "fragmentShader", "", nullptr); #endif // IGL_BACKEND_METAL #if IGL_BACKEND_OPENGL case igl::BackendType::OpenGL: { const auto glVersion = static_cast(device).getContext().deviceFeatures().getGLVersion(); if (glVersion > igl::opengl::GLVersion::v2_1) { const std::string codeVS1 = stringReplaceAll(getVulkanVertexShaderSource(), "gl_VertexIndex", "gl_VertexID"); const auto codeVS2 = "#version 460\n" + codeVS1; const auto codeFS = "#version 460\n" + std::string(getVulkanFragmentShaderSource()); return igl::ShaderStagesCreator::fromModuleStringInput( device, codeVS2.c_str(), "main", "", codeFS.c_str(), "main", "", nullptr); } else { IGL_DEBUG_ABORT("This sample is incompatible with OpenGL 2.1"); return nullptr; } } #endif // IGL_BACKEND_OPENGL default: IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); return nullptr; } } } // namespace TinyMeshSession::TinyMeshSession(std::shared_ptr platform) : RenderSession(std::move(platform)) { listener_ = std::make_shared(*this); getPlatform().getInputDispatcher().addKeyListener(listener_); imguiSession_ = std::make_unique(getPlatform().getDevice(), getPlatform().getInputDispatcher()); } void TinyMeshSession::initialize() noexcept { device_ = &getPlatform().getDevice(); // Vertex buffer, Index buffer and Vertex Input. Buffers are allocated in GPU memory. vb0_ = device_->createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Vertex, .data = kVertexData0, .length = sizeof(kVertexData0), .storage = ResourceStorage::Private, .debugName = "Buffer: vertex"}, nullptr); ib0_ = device_->createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Index, .data = kIndexData, .length = sizeof(kIndexData), .storage = ResourceStorage::Private, .debugName = "Buffer: index"}, nullptr); // create an Uniform buffers to store uniforms for 2 objects for (uint32_t i = 0; i != kNumBufferedFrames; i++) { ubPerFrame_.push_back( device_->createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Uniform, .data = &perFrame, .length = sizeof(UniformsPerFrame), .storage = ResourceStorage::Shared, .hint = BufferDesc::BufferAPIHintBits::UniformBlock, .debugName = "Buffer: uniforms (per frame)"}, nullptr)); ubPerObject_.push_back( device_->createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Uniform, .data = perObject, .length = kNumCubes * sizeof(UniformsPerObject), .storage = ResourceStorage::Shared, .hint = BufferDesc::BufferAPIHintBits::UniformBlock, .debugName = "Buffer: uniforms (per object)"}, nullptr)); } vertexInput0_ = device_->createVertexInputState( VertexInputStateDesc{ .numAttributes = 3, .attributes = { {.bufferIndex = 0, .format = VertexAttributeFormat::Float3, .offset = offsetof(VertexPosUvw, position), .name = "pos", .location = 0}, {.bufferIndex = 0, .format = VertexAttributeFormat::Float3, .offset = offsetof(VertexPosUvw, color), .name = "col", .location = 1}, {.bufferIndex = 0, .format = VertexAttributeFormat::Float2, .offset = offsetof(VertexPosUvw, uv), .name = "st", .location = 2}, }, .numInputBindings = 1, .inputBindings = {{.stride = sizeof(VertexPosUvw)}}, }, nullptr); depthStencilState_ = device_->createDepthStencilState( DepthStencilStateDesc{ .compareFunction = igl::CompareFunction::Less, .isDepthWriteEnabled = true, }, nullptr); { const uint32_t texWidth = 256; const uint32_t texHeight = 256; const TextureDesc desc = TextureDesc::new2D(igl::TextureFormat::BGRA_SRGB, texWidth, texHeight, TextureDesc::TextureUsageBits::Sampled, "XOR pattern"); texture0_ = device_->createTexture(desc, nullptr); std::vector pixels( static_cast::size_type>(texWidth * texHeight)); for (uint32_t y = 0; y != texHeight; y++) { for (uint32_t x = 0; x != texWidth; x++) { // create a XOR pattern pixels[y * texWidth + x] = 0xFF000000 + ((x ^ y) << 16) + ((x ^ y) << 8) + (x ^ y); } } texture0_->upload(TextureRangeDesc::new2D(0, 0, texWidth, texHeight), pixels.data()); } { auto dir = std::filesystem::current_path(); // find IGLU somewhere above our current directory // @fb-only const char* contentFolder = "shell/resources/"; // @fb-only while (dir != std::filesystem::current_path().root_path() && !std::filesystem::exists(dir / contentFolder)) { dir = dir.parent_path(); } int32_t texWidth = 0; int32_t texHeight = 0; int32_t channels = 0; uint8_t* pixels = stbi_load( (dir / std::filesystem::path(contentFolder) / "images/marble.png").string().c_str(), &texWidth, &texHeight, &channels, 4); IGL_DEBUG_ASSERT(pixels, "Cannot load texture."); const TextureDesc desc = TextureDesc::new2D(igl::TextureFormat::RGBA_SRGB, texWidth, texHeight, TextureDesc::TextureUsageBits::Sampled, "marble.png"); texture1_ = device_->createTexture(desc, nullptr); texture1_->upload(TextureRangeDesc::new2D(0, 0, texWidth, texHeight), pixels); stbi_image_free(pixels); } sampler_ = device_->createSamplerState( SamplerStateDesc{ .minFilter = SamplerMinMagFilter::Linear, .magFilter = SamplerMinMagFilter::Linear, .addressModeU = igl::SamplerAddressMode::Repeat, .addressModeV = igl::SamplerAddressMode::Repeat, .debugName = "Sampler: linear", }, nullptr); // Command queue: backed by different types of GPU HW queues commandQueue_ = device_->createCommandQueue({}, nullptr); renderPass_ = { .colorAttachments = {{ .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, .clearColor = {1.0f, 0.0f, 0.0f, 1.0f}, }}, #if TINY_TEST_USE_DEPTH_BUFFER .depthAttachment = {.loadAction = LoadAction::Clear, .clearDepth = 1.0}, #else .depthAttachment = {.loadAction = LoadAction::DontCare}, #endif // TINY_TEST_USE_DEPTH_BUFFER }; // initialize random rotation axes for all cubes for (glm::vec3& axi : axis) { axi = glm::sphericalRand(1.0f); } } std::shared_ptr TinyMeshSession::getVulkanNativeDepth() { #if IGL_BACKEND_VULKAN if (device_->getBackendType() == BackendType::Vulkan) { const auto& vkPlatformDevice = device_->getPlatformDevice(); IGL_DEBUG_ASSERT(vkPlatformDevice != nullptr); Result ret; std::shared_ptr drawable = vkPlatformDevice->createTextureFromNativeDepth(width, height, &ret); IGL_DEBUG_ASSERT(ret.isOk()); return drawable; } #endif // IGL_BACKEND_VULKAN // TODO: unhardcode Vulkan assumption above return nullptr; } void TinyMeshSession::update(SurfaceTextures surfaceTextures) noexcept { width = surfaceTextures.color->getSize().width; height = surfaceTextures.color->getSize().height; const float deltaSeconds = getDeltaSeconds(); fps_.updateFPS(deltaSeconds); currentTime_ += deltaSeconds; if (!framebuffer_) { framebufferDesc_.colorAttachments[0].texture = surfaceTextures.color; #if TINY_TEST_USE_DEPTH_BUFFER framebufferDesc_.depthAttachment.texture = getVulkanNativeDepth(); #endif // TINY_TEST_USE_DEPTH_BUFFER framebuffer_ = device_->createFramebuffer(framebufferDesc_, nullptr); IGL_DEBUG_ASSERT(framebuffer_); const TextureFormat depthFormat = framebuffer_->getDepthAttachment() ? framebuffer_->getDepthAttachment()->getProperties().format : TextureFormat::Invalid; renderPipelineStateMesh_ = device_->createRenderPipeline( RenderPipelineDesc{ .vertexInputState = vertexInput0_, .shaderStages = getShaderStagesForBackend(*device_), .targetDesc = { .colorAttachments = {{ .textureFormat = framebuffer_->getColorAttachment(0)->getProperties().format, }}, .depthAttachmentFormat = depthFormat, }, #if !TINY_TEST_USE_DEPTH_BUFFER .cullMode = igl::CullMode::Back, #endif // TINY_TEST_USE_DEPTH_BUFFER .frontFaceWinding = igl::WindingMode::Clockwise, .fragmentUnitSamplerMap = {{0, IGL_NAMEHANDLE("uTex0")}, {1, IGL_NAMEHANDLE("uTex1")}}, .debugName = igl::genNameHandle("Pipeline: mesh"), }, nullptr); } framebuffer_->updateDrawable(surfaceTextures.color); // from igl/shell/renderSessions/Textured3DCubeSession.cpp const float fov = float(45.0f * (M_PI / 180.0f)); const float aspectRatio = (float)width / (float)height; perFrame.proj = glm::perspectiveLH(fov, aspectRatio, 0.1f, 500.0f); // place a "camera" behind the cubes, the distance depends on the total number of cubes perFrame.view = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, sqrtf(kNumCubes / 16.0f) * 20.0f * kHalf)); ubPerFrame_[frameIndex_]->upload(&perFrame, BufferRange(sizeof(perFrame))); // rotate cubes around random axes for (uint32_t i = 0; i != kNumCubes; i++) { const float direction = powf(-1, (float)(i + 1)); const uint32_t cubesInLine = (uint32_t)sqrt(kNumCubes); const glm::vec3 offset = glm::vec3(-1.5f * sqrt(kNumCubes) + 4.0f * static_cast(i % cubesInLine), -1.5f * sqrt(kNumCubes) + 4.0f * std::floor(static_cast(i) / cubesInLine), 0); perObject[i].model = glm::rotate( glm::translate(glm::mat4(1.0f), offset), float(direction * currentTime_), axis[i]); } ubPerObject_[frameIndex_]->upload(&perObject, BufferRange(sizeof(perObject))); // Command buffers (1-N per thread): create, submit and forget const std::shared_ptr buffer = commandQueue_->createCommandBuffer({}, nullptr); const igl::Viewport viewport = {.x = 0.0f, .y = 0.0f, .width = (float)width, .height = (float)height, .minDepth = 0.0f, .maxDepth = +1.0f}; const igl::ScissorRect scissor = { .x = 0, .y = 0, .width = (uint32_t)width, .height = (uint32_t)height}; // This will clear the framebuffer auto commands = buffer->createRenderCommandEncoder(renderPass_, framebuffer_); commands->bindRenderPipelineState(renderPipelineStateMesh_); commands->bindViewport(viewport); commands->bindScissorRect(scissor); commands->pushDebugGroupLabel("Render Mesh", Color(1, 0, 0)); commands->bindVertexBuffer(0, *vb0_); commands->bindDepthStencilState(depthStencilState_); commands->bindBuffer(0, ubPerFrame_[frameIndex_].get()); commands->bindTexture(0, igl::BindTarget::kFragment, texture0_.get()); commands->bindTexture(1, igl::BindTarget::kFragment, texture1_.get()); commands->bindSamplerState(0, igl::BindTarget::kFragment, sampler_.get()); commands->bindSamplerState(1, igl::BindTarget::kFragment, sampler_.get()); // Draw 2 cubes: we use uniform buffer to update matrices commands->bindIndexBuffer(*ib0_, IndexFormat::UInt16); for (uint32_t i = 0; i != kNumCubes; i++) { commands->bindBuffer(1, ubPerObject_[frameIndex_].get(), i * sizeof(UniformsPerObject)); commands->drawIndexed(3u * 6u * 2u); } commands->popDebugGroupLabel(); { imguiSession_->beginFrame(framebufferDesc_, getPlatform().getDisplayContext().pixelsPerPoint); ImGui::Begin("Texture Viewer", nullptr, ImGuiWindowFlags_AlwaysAutoResize); ImGui::Image(ImTextureID(texture1_.get()), ImVec2(512, 512)); ImGui::End(); imguiSession_->drawFPS(fps_.getAverageFPS()); imguiSession_->endFrame(getPlatform().getDevice(), *commands); } commands->endEncoding(); buffer->present(surfaceTextures.color); commandQueue_->submit(*buffer); frameIndex_ = (frameIndex_ + 1) % kNumBufferedFrames; } bool TinyMeshSession::Listener::process(const CharEvent& event) { if (event.character == 't') { session.texture1_.reset(); return true; } return false; } } // namespace igl::shell ================================================ FILE: shell/renderSessions/TinyMeshSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include #include #include #include namespace igl::shell { class TinyMeshSession : public RenderSession { public: explicit TinyMeshSession(std::shared_ptr platform); void initialize() noexcept override; void update(SurfaceTextures surfaceTextures) noexcept override; std::shared_ptr getVulkanNativeDepth(); private: IDevice* device_{}; RenderPassDesc renderPass_; FramebufferDesc framebufferDesc_; std::shared_ptr framebuffer_; std::shared_ptr renderPipelineStateMesh_; std::shared_ptr vb0_, ib0_; // buffers for vertices and indices std::vector> ubPerFrame_, ubPerObject_; std::shared_ptr vertexInput0_; std::shared_ptr depthStencilState_; std::shared_ptr texture0_, texture1_; std::shared_ptr sampler_; uint32_t frameIndex_{0}; std::unique_ptr imguiSession_; struct Listener : public IKeyListener { explicit Listener(TinyMeshSession& session) : session(session) {} bool process(const KeyEvent& event) override { return false; } bool process(const CharEvent& event) override; TinyMeshSession& session; }; std::shared_ptr listener_; FPSCounter fps_; double currentTime_ = 0; }; } // namespace igl::shell ================================================ FILE: shell/renderSessions/WireframeSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include namespace igl::shell { namespace { struct VertexPosColor { iglu::simdtypes::float3 position; iglu::simdtypes::float4 color; }; // A hexagon composed of 6 triangles sharing the center vertex. // This provides enough faces to clearly see the wireframe overlay. // clang-format off VertexPosColor vertexData[] = { // Center {.position = {0.0f, 0.0f, 0.0f}, .color = {0.2f, 0.2f, 0.6f, 1.0f}}, // Outer vertices (hexagon) {.position = {0.0f, 0.6f, 0.0f}, .color = {0.4f, 0.1f, 0.5f, 1.0f}}, {.position = {0.52f, 0.3f, 0.0f}, .color = {0.5f, 0.2f, 0.4f, 1.0f}}, {.position = {0.52f, -0.3f, 0.0f}, .color = {0.3f, 0.3f, 0.6f, 1.0f}}, {.position = {0.0f, -0.6f, 0.0f}, .color = {0.4f, 0.1f, 0.5f, 1.0f}}, {.position = {-0.52f, -0.3f, 0.0f}, .color = {0.5f, 0.2f, 0.4f, 1.0f}}, {.position = {-0.52f, 0.3f, 0.0f}, .color = {0.3f, 0.3f, 0.6f, 1.0f}}, }; // clang-format on // 6 triangles, each sharing center vertex 0 uint16_t indexData[] = { 0, 1, 2, // triangle 0 0, 2, 3, // triangle 1 0, 3, 4, // triangle 2 0, 4, 5, // triangle 3 0, 5, 6, // triangle 4 0, 6, 1, // triangle 5 }; const uint32_t kNumIndices = sizeof(indexData) / sizeof(indexData[0]); std::string getVersion() { return {"#version 100"}; } // --------------------------------------------------------------------------- // Solid shaders: output the per-vertex color // --------------------------------------------------------------------------- std::string getMetalShaderSource() { return R"( using namespace metal; typedef struct { float3 position [[attribute(0)]]; float4 color [[attribute(1)]]; } VertexIn; typedef struct { float4 position [[position]]; float4 color; } VertexOut; vertex VertexOut vertexShader( uint vid [[vertex_id]], constant VertexIn * vertices [[buffer(1)]]) { VertexOut out; out.position = float4(vertices[vid].position, 1.0); out.color = vertices[vid].color; return out; } fragment float4 fragmentShader( VertexOut IN [[stage_in]]) { return IN.color; } )"; } std::string getOpenGLVertexShaderSource() { return getVersion() + R"( precision highp float; attribute vec3 position; attribute vec4 color_in; varying vec4 vColor; void main() { gl_Position = vec4(position, 1.0); vColor = color_in; })"; } std::string getOpenGLFragmentShaderSource() { return getVersion() + std::string(R"( precision highp float; varying vec4 vColor; void main() { gl_FragColor = vColor; })"); } std::string getVulkanVertexShaderSource() { return R"( layout(location = 0) in vec3 position; layout(location = 1) in vec4 color_in; layout(location = 0) out vec4 color; void main() { gl_Position = vec4(position, 1.0); color = color_in; } )"; } std::string getVulkanFragmentShaderSource() { return R"( layout(location = 0) in vec4 color; layout(location = 0) out vec4 out_FragColor; void main() { out_FragColor = color; } )"; } // --------------------------------------------------------------------------- // Wireframe shaders: output a bright green color for wireframe edges // --------------------------------------------------------------------------- std::string getWireframeMetalShaderSource() { return R"( using namespace metal; typedef struct { float3 position [[attribute(0)]]; float4 color [[attribute(1)]]; } VertexIn; typedef struct { float4 position [[position]]; } VertexOut; vertex VertexOut vertexShaderWireframe( uint vid [[vertex_id]], constant VertexIn * vertices [[buffer(1)]]) { VertexOut out; out.position = float4(vertices[vid].position, 1.0); return out; } fragment float4 fragmentShaderWireframe( VertexOut IN [[stage_in]]) { return float4(0.0, 1.0, 0.2, 1.0); } )"; } std::string getWireframeOpenGLVertexShaderSource() { return getVersion() + R"( precision highp float; attribute vec3 position; attribute vec4 color_in; void main() { gl_Position = vec4(position, 1.0); })"; } std::string getWireframeOpenGLFragmentShaderSource() { return getVersion() + std::string(R"( precision highp float; void main() { gl_FragColor = vec4(0.0, 1.0, 0.2, 1.0); })"); } std::string getWireframeVulkanVertexShaderSource() { return R"( layout(location = 0) in vec3 position; layout(location = 1) in vec4 color_in; void main() { gl_Position = vec4(position, 1.0); } )"; } std::string getWireframeVulkanFragmentShaderSource() { return R"( layout(location = 0) out vec4 out_FragColor; void main() { out_FragColor = vec4(0.0, 1.0, 0.2, 1.0); } )"; } // --------------------------------------------------------------------------- // Shader stage creation helpers // --------------------------------------------------------------------------- std::unique_ptr getShaderStagesForBackend(IDevice& device) { switch (device.getBackendType()) { case igl::BackendType::Invalid: case igl::BackendType::Custom: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; case igl::BackendType::Vulkan: return igl::ShaderStagesCreator::fromModuleStringInput(device, getVulkanVertexShaderSource().c_str(), "main", "", getVulkanFragmentShaderSource().c_str(), "main", "", nullptr); // @fb-only // @fb-only // @fb-only case igl::BackendType::Metal: return igl::ShaderStagesCreator::fromLibraryStringInput( device, getMetalShaderSource().c_str(), "vertexShader", "fragmentShader", "", nullptr); case igl::BackendType::OpenGL: return igl::ShaderStagesCreator::fromModuleStringInput(device, getOpenGLVertexShaderSource().c_str(), "main", "", getOpenGLFragmentShaderSource().c_str(), "main", "", nullptr); case igl::BackendType::D3D12: { static const char* kVS = R"( struct VSIn { float3 position : POSITION; float4 color : COLOR; }; struct VSOut { float4 position : SV_POSITION; float4 color : COLOR; }; VSOut main(VSIn v) { VSOut o; o.position = float4(v.position, 1.0); o.color = v.color; return o; } )"; static const char* kPS = R"( struct PSIn { float4 position : SV_POSITION; float4 color : COLOR; }; float4 main(PSIn i) : SV_TARGET { return i.color; } )"; return igl::ShaderStagesCreator::fromModuleStringInput( device, kVS, "main", "", kPS, "main", "", nullptr); } } IGL_UNREACHABLE_RETURN(nullptr) } std::unique_ptr getWireframeShaderStagesForBackend(IDevice& device) { switch (device.getBackendType()) { case igl::BackendType::Invalid: case igl::BackendType::Custom: IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; case igl::BackendType::Vulkan: return igl::ShaderStagesCreator::fromModuleStringInput( device, getWireframeVulkanVertexShaderSource().c_str(), "main", "", getWireframeVulkanFragmentShaderSource().c_str(), "main", "", nullptr); // @fb-only // @fb-only // @fb-only case igl::BackendType::Metal: return igl::ShaderStagesCreator::fromLibraryStringInput(device, getWireframeMetalShaderSource().c_str(), "vertexShaderWireframe", "fragmentShaderWireframe", "", nullptr); case igl::BackendType::OpenGL: return igl::ShaderStagesCreator::fromModuleStringInput( device, getWireframeOpenGLVertexShaderSource().c_str(), "main", "", getWireframeOpenGLFragmentShaderSource().c_str(), "main", "", nullptr); case igl::BackendType::D3D12: { static const char* kVS = R"( struct VSIn { float3 position : POSITION; float4 color : COLOR; }; struct VSOut { float4 position : SV_POSITION; }; VSOut main(VSIn v) { VSOut o; o.position = float4(v.position, 1.0); return o; } )"; static const char* kPS = R"( struct PSIn { float4 position : SV_POSITION; }; float4 main(PSIn i) : SV_TARGET { return float4(0.0, 1.0, 0.2, 1.0); } )"; return igl::ShaderStagesCreator::fromModuleStringInput( device, kVS, "main", "", kPS, "main", "", nullptr); } } IGL_UNREACHABLE_RETURN(nullptr) } } // namespace void WireframeSession::initialize() noexcept { auto& device = getPlatform().getDevice(); // Vertex & Index buffer vertexBuffer_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Vertex, .data = vertexData, .length = sizeof(vertexData)}, nullptr); IGL_DEBUG_ASSERT(vertexBuffer_ != nullptr); indexBuffer_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Index, .data = indexData, .length = sizeof(indexData)}, nullptr); IGL_DEBUG_ASSERT(indexBuffer_ != nullptr); vertexInputState_ = device.createVertexInputState( VertexInputStateDesc{ .numAttributes = 2, .attributes = { VertexAttribute{.bufferIndex = 1, .format = VertexAttributeFormat::Float3, .offset = offsetof(VertexPosColor, position), .name = "position", .location = 0}, VertexAttribute{.bufferIndex = 1, .format = VertexAttributeFormat::Float4, .offset = offsetof(VertexPosColor, color), .name = "color_in", .location = 1}, }, .numInputBindings = 1, .inputBindings = {{}, {.stride = sizeof(VertexPosColor)}}, }, nullptr); IGL_DEBUG_ASSERT(vertexInputState_ != nullptr); // Solid shaders (per-vertex color output) shaderStages_ = getShaderStagesForBackend(device); IGL_DEBUG_ASSERT(shaderStages_ != nullptr); // Wireframe shaders (bright green output) wireframeShaderStages_ = getWireframeShaderStagesForBackend(device); IGL_DEBUG_ASSERT(wireframeShaderStages_ != nullptr); // Command queue commandQueue_ = device.createCommandQueue(CommandQueueDesc{}, nullptr); IGL_DEBUG_ASSERT(commandQueue_ != nullptr); // Depth stencil state depthStencilState_ = device.createDepthStencilState( DepthStencilStateDesc{ .compareFunction = igl::CompareFunction::LessEqual, .isDepthWriteEnabled = true, }, nullptr); renderPass_ = { .colorAttachments = { { .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, .clearColor = getPreferredClearColor(), }, }, .depthAttachment = { .loadAction = LoadAction::Clear, .clearDepth = 1.0, }, }; } void WireframeSession::update(SurfaceTextures textures) noexcept { Result ret; if (framebuffer_ == nullptr) { framebuffer_ = getPlatform().getDevice().createFramebuffer( FramebufferDesc{ .colorAttachments = {{.texture = textures.color}}, .depthAttachment = {.texture = textures.depth}, .stencilAttachment = textures.depth && textures.depth->getProperties().hasStencil() ? FramebufferDesc::AttachmentDesc{.texture = textures.depth} : FramebufferDesc::AttachmentDesc{}, }, &ret); IGL_DEBUG_ASSERT(ret.isOk()); IGL_DEBUG_ASSERT(framebuffer_ != nullptr); } else { framebuffer_->updateDrawable(textures); } // Solid pipeline: PolygonFillMode::Fill (default) if (solidPipelineState_ == nullptr) { solidPipelineState_ = getPlatform().getDevice().createRenderPipeline( RenderPipelineDesc{ .vertexInputState = vertexInputState_, .shaderStages = shaderStages_, .targetDesc = { .colorAttachments = {{.textureFormat = framebuffer_->getColorAttachment(0)->getFormat()}}, .depthAttachmentFormat = framebuffer_->getDepthAttachment()->getFormat(), .stencilAttachmentFormat = framebuffer_->getStencilAttachment() ? framebuffer_->getStencilAttachment()->getFormat() : igl::TextureFormat::Invalid, }, .cullMode = igl::CullMode::Disabled, .frontFaceWinding = igl::WindingMode::CounterClockwise, .polygonFillMode = igl::PolygonFillMode::Fill, }, nullptr); IGL_DEBUG_ASSERT(solidPipelineState_ != nullptr); } // Wireframe pipeline: PolygonFillMode::Line if (wireframePipelineState_ == nullptr) { wireframePipelineState_ = getPlatform().getDevice().createRenderPipeline( RenderPipelineDesc{ .vertexInputState = vertexInputState_, .shaderStages = wireframeShaderStages_, .targetDesc = { .colorAttachments = {{.textureFormat = framebuffer_->getColorAttachment(0)->getFormat()}}, .depthAttachmentFormat = framebuffer_->getDepthAttachment()->getFormat(), .stencilAttachmentFormat = framebuffer_->getStencilAttachment() ? framebuffer_->getStencilAttachment()->getFormat() : igl::TextureFormat::Invalid, }, .cullMode = igl::CullMode::Disabled, .frontFaceWinding = igl::WindingMode::CounterClockwise, .polygonFillMode = igl::PolygonFillMode::Line, }, nullptr); IGL_DEBUG_ASSERT(wireframePipelineState_ != nullptr); } // Command Buffers auto buffer = commandQueue_->createCommandBuffer(CommandBufferDesc{}, nullptr); IGL_DEBUG_ASSERT(buffer != nullptr); auto drawableSurface = framebuffer_->getColorAttachment(0); // Submit commands const std::shared_ptr commands = buffer->createRenderCommandEncoder(renderPass_, framebuffer_); IGL_DEBUG_ASSERT(commands != nullptr); if (commands) { commands->bindVertexBuffer(1, *vertexBuffer_); commands->bindIndexBuffer(*indexBuffer_, IndexFormat::UInt16); commands->bindDepthStencilState(depthStencilState_); // Draw 1: Solid fill -- renders the hexagon with per-vertex colors commands->bindRenderPipelineState(solidPipelineState_); commands->drawIndexed(kNumIndices); // Draw 2: Wireframe overlay -- renders bright green edges on top commands->bindRenderPipelineState(wireframePipelineState_); commands->drawIndexed(kNumIndices); commands->endEncoding(); } IGL_DEBUG_ASSERT(buffer != nullptr); if (shellParams().shouldPresent) { buffer->present(drawableSurface); } IGL_DEBUG_ASSERT(commandQueue_ != nullptr); commandQueue_->submit(*buffer); RenderSession::update(textures); } } // namespace igl::shell ================================================ FILE: shell/renderSessions/WireframeSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include #include #include namespace igl::shell { class WireframeSession : public RenderSession { public: explicit WireframeSession(std::shared_ptr platform) : RenderSession(std::move(platform)) {} void initialize() noexcept override; void update(SurfaceTextures surfaceTextures) noexcept override; private: std::shared_ptr framebuffer_; std::shared_ptr solidPipelineState_; std::shared_ptr wireframePipelineState_; std::shared_ptr vertexBuffer_; std::shared_ptr indexBuffer_; std::shared_ptr vertexInputState_; std::shared_ptr shaderStages_; std::shared_ptr wireframeShaderStages_; RenderPassDesc renderPass_; std::shared_ptr depthStencilState_; }; } // namespace igl::shell ================================================ FILE: shell/renderSessions/YUVColorSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include #include #include #include namespace igl::shell { struct VertexPosUv { iglu::simdtypes::float3 position; iglu::simdtypes::float2 uv; }; namespace { constexpr VertexPosUv kVertexData[] = { {.position = {-1.f, 1.f, 0.0}, .uv = {0.0, 0.0}}, {.position = {1.f, 1.f, 0.0}, .uv = {1.0, 0.0}}, {.position = {-1.f, -1.f, 0.0}, .uv = {0.0, 1.0}}, {.position = {1.f, -1.f, 0.0}, .uv = {1.0, 1.0}}, }; constexpr uint16_t kIndexData[] = {0, 1, 2, 1, 3, 2}; std::string getOpenGLVertexShaderSource() { return R"( #version 300 es precision highp float; in vec3 position; in vec2 uv_in; out vec2 uv; void main() { gl_Position = vec4(position, 1.0); uv = uv_in; // position.xy * 0.5 + 0.5; })"; } std::string getOpenGLFragmentShaderSource() { return R"( #version 300 es #extension GL_EXT_YUV_target : require precision highp float; uniform __samplerExternal2DY2YEXT inputImage; in vec2 uv; layout (yuv) out vec4 outColor; void main() { outColor = texture(inputImage, uv); })"; } std::string getVulkanVertexShaderSource() { return R"( layout(location = 0) in vec3 position; layout(location = 1) in vec2 uv_in; layout(location = 0) out vec2 uv; void main() { gl_Position = vec4(position, 1.0); uv = uv_in; } )"; } std::string getVulkanFragmentShaderSource() { return R"( layout(location = 0) in vec2 uv; layout(location = 0) out vec4 out_FragColor; layout(set = 0, binding = 0) uniform sampler2D in_texture; void main() { out_FragColor = texture(in_texture, uv); } )"; } std::unique_ptr getShaderStagesForBackend(IDevice& device) { switch (device.getBackendType()) { // @fb-only case igl::BackendType::Invalid: case igl::BackendType::Metal: case igl::BackendType::Custom: case igl::BackendType::D3D12: // D3D12 YUV shaders not yet implemented IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; case igl::BackendType::Vulkan: return igl::ShaderStagesCreator::fromModuleStringInput(device, getVulkanVertexShaderSource().c_str(), "main", "", getVulkanFragmentShaderSource().c_str(), "main", "", nullptr); case igl::BackendType::OpenGL: return igl::ShaderStagesCreator::fromModuleStringInput(device, getOpenGLVertexShaderSource().c_str(), "main", "", getOpenGLFragmentShaderSource().c_str(), "main", "", nullptr); } IGL_UNREACHABLE_RETURN(nullptr) } } // namespace YUVColorSession::YUVColorSession(std::shared_ptr platform) : RenderSession(std::move(platform)) { listener_ = std::make_shared(*this); getPlatform().getInputDispatcher().addKeyListener(listener_); getPlatform().getInputDispatcher().addMouseListener(listener_); imguiSession_ = std::make_unique(getPlatform().getDevice(), getPlatform().getInputDispatcher()); } // clang-tidy off void YUVColorSession::initialize() noexcept { // clang-tidy on auto& device = getPlatform().getDevice(); // Vertex & Index buffer vb0_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Vertex, .data = kVertexData, .length = sizeof(kVertexData)}, nullptr); IGL_DEBUG_ASSERT(vb0_ != nullptr); ib0_ = device.createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Index, .data = kIndexData, .length = sizeof(kIndexData)}, nullptr); IGL_DEBUG_ASSERT(ib0_ != nullptr); const VertexInputStateDesc inputDesc = { .numAttributes = 2, .attributes = { { .bufferIndex = 1, .format = VertexAttributeFormat::Float3, .offset = offsetof(VertexPosUv, position), .name = "position", .location = 0, }, { .bufferIndex = 1, .format = VertexAttributeFormat::Float2, .offset = offsetof(VertexPosUv, uv), .name = "uv_in", .location = 1, }, }, .numInputBindings = 1, .inputBindings = { {}, { .stride = sizeof(VertexPosUv), }, }, }; vertexInput0_ = device.createVertexInputState(inputDesc, nullptr); IGL_DEBUG_ASSERT(vertexInput0_ != nullptr); // Samplers & Textures auto createYUVDemo = [this](IDevice& device, const char* demoName, TextureFormat yuvFormat, const char* fileName) { constexpr uint32_t width = 1920; constexpr uint32_t height = 1080; auto sampler = device.createSamplerState(SamplerStateDesc::newYUV(yuvFormat, "YUVSampler"), nullptr); IGL_DEBUG_ASSERT(sampler != nullptr); auto& fileLoader = getPlatform().getFileLoader(); const auto fileData = fileLoader.loadBinaryData(fileName); IGL_DEBUG_ASSERT(fileData.data && fileData.length, "Cannot load texture file"); const igl::TextureDesc textureDesc = igl::TextureDesc::new2D( yuvFormat, width, height, TextureDesc::TextureUsageBits::Sampled, "YUV texture"); IGL_DEBUG_ASSERT(width * height + width * height / 2 == fileData.length); auto texture = device.createTexture(textureDesc, nullptr); IGL_DEBUG_ASSERT(texture); texture->upload(TextureRangeDesc{.x = 0, .y = 0, .z = 0, .width = width, .height = height}, fileData.data.get()); this->yuvFormatDemos_.push_back(YUVFormatDemo{ .name = demoName, .sampler = sampler, .texture = texture, .pipelineState = nullptr}); }; createYUVDemo(device, "YUV 420p", igl::TextureFormat::YUV_420p, "output_frame_900.420p.yuv"); createYUVDemo(device, "YUV NV12", igl::TextureFormat::YUV_NV12, "output_frame_900.nv12.yuv"); shaderStages_ = getShaderStagesForBackend(device); IGL_DEBUG_ASSERT(shaderStages_ != nullptr); // Command queue commandQueue_ = device.createCommandQueue(CommandQueueDesc{}, nullptr); IGL_DEBUG_ASSERT(commandQueue_ != nullptr); renderPass_ = { .colorAttachments = {{ .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, .clearColor = getPreferredClearColor(), }}, .depthAttachment = {.loadAction = LoadAction::Clear, .clearDepth = 1.0}, }; } // namespace igl::shell void YUVColorSession::update(SurfaceTextures surfaceTextures) noexcept { Result ret; framebufferDesc_.colorAttachments[0].texture = surfaceTextures.color; if (framebuffer_ == nullptr) { IGL_DEBUG_ASSERT(ret.isOk()); framebufferDesc_.depthAttachment.texture = surfaceTextures.depth; framebuffer_ = getPlatform().getDevice().createFramebuffer(framebufferDesc_, &ret); IGL_DEBUG_ASSERT(ret.isOk()); IGL_DEBUG_ASSERT(framebuffer_ != nullptr); } else { framebuffer_->updateDrawable(surfaceTextures.color); } YUVFormatDemo& demo = yuvFormatDemos_[currentDemo_]; if (!demo.pipelineState) { const RenderPipelineDesc desc = { .vertexInputState = vertexInput0_, .shaderStages = shaderStages_, .targetDesc = { .colorAttachments = { { .textureFormat = framebuffer_->getColorAttachment(0)->getProperties().format, }, }, .depthAttachmentFormat = framebuffer_->getDepthAttachment()->getProperties().format, }, .cullMode = igl::CullMode::Back, .frontFaceWinding = igl::WindingMode::Clockwise, .fragmentUnitSamplerMap = {std::pair(0, IGL_NAMEHANDLE("inputImage"))}, .immutableSamplers = {demo.sampler}, // Ycbcr sampler }; demo.pipelineState = getPlatform().getDevice().createRenderPipeline(desc, nullptr); IGL_DEBUG_ASSERT(demo.pipelineState != nullptr); } // Command Buffers auto buffer = commandQueue_->createCommandBuffer(CommandBufferDesc{}, nullptr); IGL_DEBUG_ASSERT(buffer != nullptr); auto drawableSurface = framebuffer_->getColorAttachment(0); framebuffer_->updateDrawable(drawableSurface); // Submit commands const std::shared_ptr commands = buffer->createRenderCommandEncoder(renderPass_, framebuffer_); IGL_DEBUG_ASSERT(commands != nullptr); if (commands) { commands->bindVertexBuffer(0, *vb0_); commands->bindVertexBuffer(1, *vb0_); commands->bindRenderPipelineState(demo.pipelineState); commands->bindTexture(0, BindTarget::kFragment, demo.texture.get()); commands->bindSamplerState(0, BindTarget::kFragment, demo.sampler.get()); commands->bindIndexBuffer(*ib0_, IndexFormat::UInt16); commands->drawIndexed(6); // draw the YUV format name using ImGui { imguiSession_->beginFrame(framebufferDesc_, getPlatform().getDisplayContext().pixelsPerPoint); constexpr ImGuiWindowFlags flags = ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoMove; ImGui::SetNextWindowPos({15.0f, 15.0f}); ImGui::SetNextWindowBgAlpha(0.30f); ImGui::Begin("##FormatYUV", nullptr, flags); ImGui::Text("%s", demo.name); ImGui::Text("Press any key to change"); ImGui::End(); imguiSession_->endFrame(getPlatform().getDevice(), *commands); } commands->endEncoding(); } IGL_DEBUG_ASSERT(buffer != nullptr); if (shellParams().shouldPresent) { buffer->present(drawableSurface); } IGL_DEBUG_ASSERT(commandQueue_ != nullptr); commandQueue_->submit(*buffer); RenderSession::update(surfaceTextures); } void YUVColorSession::nextFormatDemo() { currentDemo_ = (currentDemo_ + 1) % yuvFormatDemos_.size(); } bool YUVColorSession::Listener::process(const KeyEvent& event) { if (!event.isDown) { session.nextFormatDemo(); } return true; } bool YUVColorSession::Listener::process(const MouseButtonEvent& event) { if (!event.isDown) { session.nextFormatDemo(); } return true; } bool YUVColorSession::Listener::process(const MouseMotionEvent& /*event*/) { return false; } bool YUVColorSession::Listener::process(const MouseWheelEvent& /*event*/) { return false; } } // namespace igl::shell ================================================ FILE: shell/renderSessions/YUVColorSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include #include #include #include namespace igl::shell { class YUVColorSession : public RenderSession { public: explicit YUVColorSession(std::shared_ptr platform); // clang-tidy off void initialize() noexcept override; // clang-tidy on void update(SurfaceTextures surfaceTextures) noexcept override; void nextFormatDemo(); private: std::shared_ptr vertexInput0_; std::shared_ptr shaderStages_; std::shared_ptr vb0_; std::shared_ptr ib0_; std::shared_ptr depthTexture_; RenderPassDesc renderPass_; FramebufferDesc framebufferDesc_; std::unique_ptr imguiSession_; struct YUVFormatDemo { const char* name = ""; std::shared_ptr sampler; std::shared_ptr texture; std::shared_ptr pipelineState; }; std::vector yuvFormatDemos_; size_t currentDemo_ = 0; struct Listener : public IMouseListener, IKeyListener { explicit Listener(YUVColorSession& session) : session(session) {} bool process(const MouseButtonEvent& event) override; bool process(const MouseMotionEvent& event) override; bool process(const MouseWheelEvent& event) override; bool process(const KeyEvent& event) override; bool process(const CharEvent& event) override { return false; } YUVColorSession& session; }; std::shared_ptr listener_; }; } // namespace igl::shell ================================================ FILE: shell/resources/images/output_frame_900.420p.txt ================================================ The frame #900 from the Big Buck Bunny movie. 1920x1080 420p YUV > ffmpeg -i bbb_sunflower_1080p_30fps_normal.mp4 -vf "select=eq(n\,899)" -vframes 1 -c:v rawvideo -pix_fmt yuv420p output_frame_900.420p.yuv https://peach.blender.org/about/ License Information The results of the Peach open movie project has been licensed under the Creative Commons Attribution 3.0 license. This includes all the data we’ve published online and on the DVDs, and all of the contents on this website. If any content on this site is not licensed as such, it will be clearly indicated. In short, this means you can freely reuse and distribute this content, also commercially, for as long you provide a proper attribution. ================================================ FILE: shell/resources/images/output_frame_900.420p.yuv ================================================ YWWVTTSRQPQRRSSSTSRRRRRRQQQRSSSSRTVXYZ[[[\\\\\\\\\\[[\]_abbegjlortvwwwxxyxxyxxxxyz{{{zzyxwtnf^ZXVUUUUVVUSRQONOOOPRTY]]bnsof[RRUWXXWWVSRPPPSUSPOPOOONPRQPSWYXWWVY]_[QHCFLONKLLKJIIHKPRRSTUUSNP_aRKGFNT[``nzm``df^OMTZNLZ\_mi]luljop^Pd~yx{sofYW[]_`iaSVXXVUWYURQX]ZY^_\ZUSUUY[VQNOPRTVVYdkkid`flbX]fa]^]\_febdfd__[]juww|oQIPPMGHIPWYdmdZYUMUeju\TVVXYPCACZqbXPROIKIK]SCXonk|©TUbNLQMOOPQRTTRRRRQQOQRV|[QONNOOOPQUWTRTWVSSSTZcUHOtqAB[m[MFHJJKIHXiadrulX_QFNONGBBKSRSWMGOLKNPOSPJFHHBCCCFDBBBC@@ABCEGJQQPEBJ`sonlhdcc^UKDBBEE@IL[űfjkd]ZZYTSRQRRTVTQROPY]ZSRUTROMIKOPPNJIIKSUSUX_chq]VYYY_ZPNMQ``RDDehY[YWTSSSTYZSPQSSTVWZ`_WQPRTVVVVUVWTQRRZ[l}|{z~yywx~{wTU`VOOYYTNHKZa`XinQMKIQURLMNOPRRPNMLKKKKLOPQRQRSUTRQPNOPRSOHEEFGGFGGFGGFGHJIU|gS^rhY_mkUHFHLIEBH\ovvqf_[QLMNNMMLMNNMNOPOOLIFFFEFHKMPRSTTSRQRSSSRSTRPQRQNPVRKLPTWhvpUYVWUQQQQPPPOONLGQZSYWSPNNNMLIGEDGIKMOQOPQNHECCCCCBBAA@BCCHMOMMMJFDCA?ABBBA?>ABFJLMJDA>97:;;:9:879=BED>::::9;>??@CCC@?@CDBCCBBVviG>=<>8BTE>CDBBA@@AB?<=>><<<<=<=>>>>>>><;:::<>?>>A@@A@@A??BGLGBDNxwio{sT=9?@=;:;=AGGFCDFIGE@988644668>BCC?;9999::::::;:98513BNIGF<577;=NB/6888677774457BC?@<989::87788766788778998886558<>???ACCCB@>>>>>@?ABBBBA?=?@??@?>=?FNX]XF1*+-0.=QWdnX>:==<<;9877699:<==@@?><>?@@@@@??><<;<<<>?AA?<=?:??8;;973/,(),,-28;:8776:=@DFFFGD;7520000110122236;@CC@80/246799999::;<:9:;<><=?><=@DEGPRE987768=AB>98:98889::;;9:;<<==;;;::<>?@CHIGGGD?<:989::9:::;>EPNILRWYXUSQSOE?966579710=D@813:<:89;=EB965798:AFGHJIHHGGFHIEADO[hni`XPICBIIKk_>2QvHD>FZwM1LTC=@@AAAGOSv`jneXYa<9BMPI;24:==:753222F[Y?669>>=;:60/=[pT7/4E<0-06;HXnywcQVhxfF71/-66AE98EI7,+,07:873122027983--2,,SlTUcURQ`dE9@DNfgS<.12440+L}WUB8GJ@;9630.-))5HIC>:>;=CFDHH<2.5@@<947CC;9;===<<;7433DN<488::45?DHHJMPQQLGHHHF>JlylaZTQVY;'/2349??87BHGFB<;>>=:75454/2>QXMDD@9GJ1*-,./8GOME@===;;;:30575310.//1IWV~jmib]YYYXTRRQQSUVTPPNOVYWRQSRPOMJKNQPNKIIKSVSTVY[WRcobZYZ\^ZV[`kfSD@aYWYUTTSUUXZURRSSTVWZbc\UQRSTTTTUUWTQRQVWdv}}{v{}ux{|{u{UjlUMSZZTLEK]aVf~|eJILLTVPJMPOPSUTRPNNMKJJLNQSRRTVTSQOMNNNOOJEDFHHHGFGGCGG;JziSMY`ZedIEILLKGABFJLMJDA>97:;;:9:879=BED>::::9;>??@CCC@?@CDBCCBBVviG>=<>8BTE>CDBBA@@AB?<=>><<<<=<=>>>>>>>=<<<BCCBA><;=CFFGKOQRQLF?935989>IKNMG@===??>><:8513BNIGF<577;@QL35866777876557>@EB:8779877788766677678999896548<>???ACCCB@>>>>>>?ABBBBA?=?@??>=<<:=CIQ]nlI=>?@@@@@??><=;<<<>?AA?=@@9;<7:;974113578998886678;9LfãN9E?=?=KiZFEPq~|iIW{^UV7@HNSK<7:;<;9753369?XvhH??DE@?>94.5GUJ7/349=BDDEB>EB538<854100179=?=9411)0WlXP`\MH_cFAJYbcb^\_hgkh[G=ON8>=7;<::;?@?><8>GJG?8678=?>;78=945:>;87883243DM7/545625=8,,9@?BIMMNNORPKHHHE?>Yxte\TONQXF-/2238<944=EHGD?;8877:>IOF8139BFFGGFSP6,,,./;<<:997677540../135:??XpYJGHKOMLMMIx}wvǧYPYEINMOPRQQRSTRRRRSSRQOOnuXLMLLLMMLTeh\UWYZ]YNML`kgUGEEFIFIQMMQNOQKRT\rmitpgjnmf{rGBKQU]ZYYWRNOMJGFGEEFFDCBBDD@@AACDEFFEGKD=Lp}qlhgea]WLCAEGADc[cmkda][YYWVRONPTTRQSRNNLIMPMKNNNMNSYVPPNMLJJQUOQT[]ZSPXbZX[___^^^_TEERc`bXYZUTTUVVWXTQRTTTUWZdkh`XVVUTQPQSSSPNNMLOXix{~}}tz~u~aho^SRZ][SJCNZg]lu^cZ^gTRVMKNNMNSZ\[ZXVQKIIJLOQTVWUSQPNKJKKKKIFEEFGGFGGHHFOjhUNMYbprPGKORVWJ?@JSZft}r\YYVTSQMIGGHFFDABHMKEEGJNOQSRRRRQQQQQQPQQQPONMNRTRSSSRPObogaNNNPQPOOOONNNIVtcK[XSPOMKKJIGEGKNOOOOOPNCAFGDDDDDDCCBADFHLMMLLHDBBA?AAAA??>>=?CHLNMHB<9:::999989;@GG>9999:=@@?>@AAA@@BDCCC@?Lh^=<><;;79?N><=A?@??@@A@><;;;:;;<;<=???@AA?>>=>>ABCEDBACDEDDDDCDG@@JMXrpgO@ACDDGKNKEB@DJMPTTUSPNLFCEEEBBCFCTWMD@BCDCBCDDDEDCA>79S[KIB96=>@ACG=7876987876677868756557889788765688657899897458<>@@>?ABAB@>=<<;;=>?AB??><===<====>?><9;Hgsx}}xP7>>>>>?????@?@>=;<<<>?@@==IB6997789::9899<==:876665:AEEEFFGF?>?4.0110110111210003>NSLC@:6566789::9::9;<<<<<>?6/5AELRJ9685558=@?:888887899::977879;=<;97>;98626AD9;tvQGEIJC=<9/,48:;4236;::GRD>B?NIBE?6674/-/343@OJ68=81=PUG=?HQ\fi`RIPUU[_ehfZSz~C%18=@A?99@FG?88@C=315:::8632573019?<9776/.12FO3+32111354//4:=GSVPKLOSPHED>@GJYd\ZTMTRDGO:/212570+06?F@<9648;;@NZ\TJ@:4.3>JNLPM?3---/6:9BG<:>?===;=?;73/,-0355106:7,),baa^\ZWUTSRSSRRRSTTUUUVVVWWWXYZZ[[[\]\\\\]]]^_____^]\\\\\\\[Z]aflooqsssssrqqrrrtvwxyyyyyyxwuqnlg^YWVVVWXZ\^_^]\[ZWTSUZblpqplbVTVVVVWYZZ\^^ZTV]dfaXOLNSRNNLMNOTTPOQSW\befgda]ZXSRSQKHHINW\^]ZWWTUbr}|pp|~ncv{gfld^ZPbi`xyhujZ\jzn[\fa]`grl]^_^]\[XVTW]]YXX^f\RTRSPNQSSQRQQRSOTelihghlstojb[[bjlida`a__^]euraTLRV^gjv}p^Z\_bjl[LNVSQ_dXG;BIDN\RHITTNLMOMO|έnHUSLNNOPQRRSRQSSRRSPRdsz|]IKLJJJKKQ`mh\^kyyWSymmjTFHKJEGK]nUMaZWakpaRcqjsvsqutqm~sKCRZYXXVTNLOLKJFDDKSLECABCDAACCDEFFGHEGNE?[yvjgge^ZWLBBF@Ae[Xzhf]Y\ZZZYXUROJNTZWQS[`PTf_bh`VVVOYk|hNRQPNLJMOILW`]ZXUUWUX\]]abb_\WSSWUPPTXVSTTTTTUXVSSTTTTVV\cc]X^aec\WUTSRQPPOQPMXoz|~qsy~}}~v{eUsaR[YWZXPJIK`^`RSr{iMKQMKGKOMRZ^^__\WNHIJJMPUWURQOLKIGHJJJHFEDEFFEFHHEOuiUPLXpy}t\LINPTZTFABFJVl`QXYVUSPLNPPNMJC@DEILMLMOOQRQQQPPONPOOPPPPPOLKLPRUZ[ZYWQV_cgQPOOPMLMMMKJHCXjSPYWRNMLKKJJIJNOOOPONNPQKEBFFFFFEEDCAADGIJLMMIEB@???>?@@?==>>>?@AEKKGC@=;<;:9989:=CHB;889<>=?=9??=??@BDDEDDCCCCCDEDCEEFEGGKl}rcJ@CDCCBCIOPQQOORTUQPNLKJD??=767877899787557764325677888976655566765689998868:<>@@?<=??>=;::9;<<;;=>=;<<;;<>===?@@?@AACHRn~|{yyvF4?>;>=;;976667899:;<<<<<==???AA@@@><;;;<=>><:=<>><:::9855FH;2111011011111110.0=R]WQKC:43567899::9;==<<<==88CFGPSG<;843589<<878987678899977767:;::846>@BEEGIJJHHKPME>;;<>=::;;9?JMIINV[ULHB>;4477876544589::::::899ANJ<=79cQ:@CF_~߷[6HDACD;;HILF7-02F|jIFH670,19>>:7:>>:;LU<026<@>=?@=50@``˪O(/6,,288Bop7OmoWCEaqY;/5=;:KaYHGQM;,0:@crSMH913/)/BA:EPLMI?<=BNPWa>4;===855653234779FA2AC739B@45BYhh^L9/2BLO]dca]XXtxP9688AGMONIFEDCEOPFGUSFKYZI@JI=1:;022255/18:>B?8559?ECAGJHIPQPSC05GPLHFIF:56538CIA57>><;<;<==<92+.11698/%05*'+`a``^\ZWVUTTTTRRRRSSTUUVVWYZZZ[\]\]]]]\\\]]____``__]\ZZYXXXXWY^beffgjllllkjkmoprtvwxxxvuusrquklkhaYVVUVVWXXXXXWVVTSPOR^horrpgXSUTTSTWWXZ[_bba``djf[SRTTRPMLJKPQNNOOQRX]__^]\]ZTV]_]TJEKU[\ZXWXXVY^cpz{ycgmlcff`b`dvp[\vtXYkhaelqi^^`__^\ZXVX\\ZYYWVUPNPQPPQTUTTRRSSMM]hjkntvuqmg][clnkjheba__`^^fcWT[emxztpiha]ZY[`cef`QGJLGNVRMNVTLGHHIKQRQPNOMYڷPRVQMMOQSSSSTSQSSRTSNbķpWNKKLJKMOZgecpx^FX{[UVLGGGGGOkpWX\QOhlgcSZTPduroousm}MBLKJIIGFINKHIGGOOVVHB@?AA@AAACFIIJJGJRN>==<===<<>??><::@FFDCA?><:9989:;AGF=989=>;<<>BB?AFJHD??CB@=9;>>???ACDDDDCAAACCDCCCCIIBBG]uyiK>DFCBCB@CEHMRXXURMIIIJMJ;3>?>=<=;9989FK<889;:789878899;<63542237742213667899776567665467798886754433334444688998789:<>?@?<;<<:97778:<<:99;;9::;<=>>>???=?BGGB907Uw{y~hC<@<<=<::8777877799:::;:BA?=@>AA@@>==;;;;;<<;;>@92??@@??>><>A?<978>BEDCBBA@GLMJ?52110012221233200/8O]\VSLC;5446789999;;<<==;@IIHJNNIHB96557899879;;96568999888647::972/3=CBEIIIJJIJMMKE?<=>=<;;;78CNJDHSVG;8656655677778:BCCDFFEEDGHC@@>AUknhaQC>CLF:>?7Fxf?I_aUeC?KEB?:3\zY94347WtOJG;9BFCD>:>?B@988>GIp??h|kPSqyR4/?TG8PoU;BORI=65FNE==<8/0:>J_O915:<;:975566887:C=5?@?@;4337BOPHC;06GOPS\fb]\]XYsrD1129?DLKGB@<7420/..27;=>@;.,2CY[QU``VJHD>FPJA?<9742217DKHGFHIJT_XJFCVjaL@EMN[bR9.0152151121355?KFACC=56NR[_MKA;IFBELOD77A@=DB:68=<<;8402???BCBBGJIHIIKLJAG_urijf`\YTLEIYfcteRTSPRSPNLLMOQYUKCR{|dfzK䛕c\TWkom]XYWUSPNKJIGIMSPFEKOOOZ`Z[`cdgpvrdWUTTUVTSRSRPPTWVVUVTSRSPS[ZWV[`ced_\]abcc`\ZWRTRitlimoortu{tPOibRe_SQLKATb_kiWLKJLKMMTrtSFLTZ_a_\YTNLLKLNPOMMKJHGECCACEIFBBBCEEECDKUhyz~|vh\UOQ`syvsdPHIIIIIFDEGFDFM_o[EJRTRKGHJLNPQTTSSNMNNPQPPQPPPPPPQPPPOOOQQPRQLQ]ac`]ZYWTQV\XSQRMHIJIIIO@okKLJPPNNKIHKRSTROOPQPOPQSTTURJJKKLMNPPMHFGHGHIFCA??><;:<<<<<>??>?=::ADBABB?<:9999:;?DD?999:;;=?BCEE@;;AKQOD>=<:9<>?<:978779=?>=<=>>>>?ADDDDA@AAAACDDDBFFDEE\}xV@DIFCBBBA@ABDIQ[\UMGHHKOJ;9:9::;<;<:8633<;69<;98655543356666432454345666777986545677666<:8::876654333212222466665479::;=??><::9755579;:99899999;<=>>?@AAABA=:522//Ebr}xR=A@<<=<::999877688889:;:PMM7@?@@@?==<::;;;<;;<>=?>;CJMNFA><;<==ACCC@;999@DEDBAAAFKKOPD732001112112232365/7S\YYYVL<3357888779;<<===BFDFIJHKKC=856899767:==;75689;:887447::8837G^T<=<><:;:8;DIDEMK:37755656888:;>ACFHGEA;876679=<:;<;9889;>ACEEEFGFHGB?@><;X^:765Fs}[UYD5DK?8889=BDAFMRQOMNYgm^OOCL[bf~304348=:Ic>6]iHbxk[73JSJNYmE08DQZO94>JH;11488;CD;:AFJI?::657;48@MVI<@FFDB>84235788;EE=>GIC9115895,,=PX\jrk`Qahd`a[UUQF7//1458GNJEB=87642011148AGC6.Hsy\PTUQIJJIJLHDD?9:82/..4BKLJHNUa{z`X]u\6/8AL^Z@352.17741020-18HUNDEB:57=BBA?93/7CHUP;OM6<@EJIC8.6GA32579:==??81,.;B;101551Wp:)STVX\\[YWVVUTTTRRRRSTVWVWX[]_`aaaa`__`___`aaba```__^\[[[ZYXWUVWXYZZZZZYXXYY\_cefgijiihc^[ZWUYiifefgc[WVUTTTSRRRRRRSTUWZ`hpuujYSSSQPPPPONNNNMMMMNPONPRTTSSRTQNQRQQQRQPQQPMLLLLMMLMQ[ef[PLLLMNPPQUZ]_]YZbhjgggWbqSVXUW^krpof[bzaRRb{yipxsg`]\]\]^__^^][WST^b\WZ\d_RssOOR^aUTU_^OO^dehd_][Z[Z^kqprvvrmhc____ZZbhqvtuqjgb^hqqpnkkecbYdsuymVWeeM>ENKIHJLPPJMTRYv}vHTUQSRRSSSTTTWTNPPSVLmɩuTLMOPTYTVmsNHTTOQ[_VVOIFFKE6Tl___FWvaYRPZNMKHJKMNLLOHHu_EFOPPNOPMLJL[~CEME@?@A?IWWQPMIHHIHFEHHKbqomifedXLSgjdojVMKJHGHRTNIGHMQQUMIjogjHz|o[dZXcka[YXWUTQNLKIHIJNF>CHLLNamaY\_a`dmorm`WRSTRQQQQPOTZXWVVUUTVVVXZXVZ^`ba][]acba_ZXVTWQTryomkmnnpvutrSZaaZ[lPMHOVmlT]a]QGHNMLNMYr`EFIOYac^[YTNLLKLMNNLKJIHGFEDCBDGEBABDHID@IKBWvyu|{wrf[UONTbpuscOGIHHIIFDFFEDEDCXcNEKOQTSNLJIGHKMOPPOOOOPPPQPPPPQOLKKNPPQV[_XPSXZ[ZZZZZYZUNNOOSTOHHIIIHEIj^JJEJMMJFIQWZUUSPPQQQPRTUUSSQONORRQNJFCBDEEFFGFDBAA>;:9;====>>==?>;::;;;<;=@@@<:;<>@A?<@MSKB==CRddTF?><:>@@FPPKH@<;?@AAAA@@@BAACDDCBCCEFE^yeCAIGEEDDCBCDDEFHUcd[IJKMPL=:999:<;;;<>ACFGIJLNMKJFFEDA?><855556666555676777776654556764=D:8<;85666444344222356644326799;====;::96556679898999999:;<=>>?AA@>:633358436>jd==><:;:9975554567:<=>FL`M:??>>=<;:9:;<;;;<=>?><CCCFGB<;;99@CBA?@CEILNPI<764122/033112222563/;LZXV\WA235678989;;;;==>=?DFHKIHD>:767888668<>?;9:99:<::95259:9<<0KyH>GGIIHHIIHGHFA>===<;;:966EOIC>8777667779;=?BGJJJHE?=;988879=:8;;;98999;<@DEEHJJGC>=>=;G^jh^PCADC@<<<966:Qxo[xv]JJLTbigNDNMHAMutfY<889RxiTO;1:B7.2:B;.9MLHOSL^a9^^CGNbK@IG9185468:>@??IWZTS_ky|xhjiirzj`U:,;<8;99;71MpT8UaL\@=QA@\XZ=56=M\YJ>@W^B206?CBEB50:9;<:60,.6Poy~[FWl_SVYXQ9+-..022.:PUL>654320252-.2;EHDNliPJMLGFHMNGBCC>:?F@:024>NVVRTXnc]iJ1=?;FTJ68FB516831035311;HGDD?87:>BFB=;83198416:?;27;=<>]h>QRRSVYYYYXWVTTTSRRRSUVWXXZ\_`abcbbbaa`aa`bbcccb`a`__][[[ZZYXVVWWXXYXXWVUTUVWYZ\\\\\\ZZYVUUTST\jfcced_YVUUTTTSSSSSSSTUUYYW]lukYRSSQPQPNNNMMNMLLLLMMMORVWTTTSTTRSTTUTUVVUTRPOMMMMMLLQ\gf_WMFHLMMNOOT[]\^_][XWVQ\qk]ZZWVY\cnogd`[]ZRTtpmos}q[X^]\]\\]^_^\YWOO]b]Y[`lsbkfkw]^ZU\kcORa`[YUTUTTVW\acafqwphgc`_^^agorrtqsqnqmfdfghjmoh`XUjqr~iW`^OB?]^GIIJKLMJMRTUf}{quWHTVTUTSSSSTUUXWPLRZVXϓy`OLMMRRMdvaZVPSVSW[UUPKH?_xGImYV|lSjmgWHHGDGLNMMMMLKKJGjeHGKMKOSMNKOO\dJLJEA@@A>Ldh[XRHGIGGGGGHGQgrsonoleaikca^OIHIJMICPYNHFFKOMOIRwxnbQ|kldTtqNT^]VWWVTSQOLJHHHJGDCDHKLlsYY]_^^blrsiYPSRQPQPQPPU]VRjdZ[YXYWUTUWZ]]^^]]]^_`cge`ZXZ]TZo|~|oklllmszrpvVOUUXWSjhKJLWkziUNQRRNLPNMPPQ]\GK\XPUab`]WQNMLLLLLLJJHGFGGEEEDGGGDCCAEIGFOL>Llvrv}~yvpcYTOOOSbtuaMFGHHIGEDEFDEGJDF\ZIFIKTa[RPMBAFKKLLMNNNLJIIKKNMGMWU[\[YYdhiVM][QSTVYZ\\]^VLLOUVOJJIIIJATK[NIHFFIKEJT_`[XXURQRPPRW]^YSQPPSTQMIFC@@BCDGHHFFDCCCA<::<==<=>><;<<;;;<@CDDA><<<=>=;=??@@>>?AAA?;=FLKIJJFDTnwhNIHIMPOLHB@@=;?B@=;;;;;;::<<;;;;98:;<<==>>>>==@@BDCBCA?@CCDCERZL?DGEEEEFEDGIJLIDIYjkXLJMPNE@>FID><@FINQQQQQRSVZ\[\\\ZWTSVK;4356656665556777787654454546ED69=;64577654444332354444246789<===;:::97666567777999;;;<<==>==>=;9754557:<=94>jrC5@=<=;:;::8767718==<>=>@?U^<>===;:99:<=====<>???=;>CHMNMLLLLMJCAEB<==<;?>=>@BFHJNSM?8876431.131111221464.+8OXW[YC223468999:;;;===@=;::<;7546;>>8DTvjEBEGGGFGGGFGFB@@?=<;;;;:7=GB978877667777;BEGJMMKMLB<==;=>=>@=:<;:9899997:?CEHJHA<;;<=;?Rdf\MCBB>;;;<:<;25JbqŸR36B[vyaTNMQQEKeM@59@BKkpI742;?6=Wp_@2=O;E_TFHF'ZuB\jo_VOBI^J/1269==@C?>DKE@LTThub]_qj~HUD4S_<33220/?WB18=9C?IL49IAA8988EXf^CPgZI;3AWWC76417BMUC.-4EUM8/7C>9FNOTTJA>@?:77999G@305951028>?72;ABC@;8978>@>>?;14=KVRPRQF4+6@3'0>B:58:98679DLHBCFBB>;GJINQ_}xMRSSSUWYXXXXVUTTSRRRRTVWXY[]_`abbcbbaabaabcdeedcbba`_^][[ZZYXWWWXXXWXWVVUTTUUVVVVVVVVTSTTUUVVVV^fd__`^YWVUUUUUUUUVUUTRSVUQQWbbXRTTTSQQOOOMNPOOPQQONOPSWYXXWXXXWUVWWVXYYWVTRPOONNMNNNSZ]^]YRMHINNMMNPTX\_bccabdda]X[]ZWXWZabZV\ZVXQYy}twpWV_`__ZWY[[UQSX[XZ^__dmqsrg||VS]gkf\Yad[TSVYYWVWY\]]^aehgdeda^^^fqrsysoj^ltnkkkkli^RS]fiu~f_iUEIKkmIHIJKLLLLNUY_yvps{yLSVVVUUUTTSTVVWXRLT[RjĿՉTpVMKLMEMltihg[QSVTUWVVQNG=chKeb]ssThdIFFGECBEILLLLIJKC@\`GBBELRLMHEHHLMVMLFDCA=@Ra[ZVHGIGGGGGHHIVkwxttwxcWURJHMNNMWNBLZSJHHGFIIGZkjgc\icLbzncmZIlvTJWUSWVUTTSQMJHGGGHFDBFHMoyXY]]\\^glrqYMQRPPQPPRQU]WJZj_\[TUVPKLTY\\\\\]]][[fswqgb_b`PKcvojlmlopmmx{ECGGHHGNWPHKNQYXIGGHQWQMPMNQNZcNKgo[MP]hgaWPNLKLLKKJIIHHHHHGGGGGHHGGFDDGKOMGACUjoqw{xrl`UQONONWpxbLDEIHFEDDEEEEFHGDQ^OEDDNUUQQPBADIIHJKJLMLF???@DFOk~{vfZVYgf`VZ\RLPSY\[]]]_^UPQVXPJKKJIJEAJAEGGGDGIK\b`^]YXWTQQNMPYc`XTQQQOMIGFFEEDCADIJHFFDDDDCA@>>>>==?><<<<;:::=DED@>====?><<>@?>>?ABB?=;<<<=?DMSPJRnoXPTVXUGA=;<AFJHC??@AAB@?@?><=><;;;::9779;;;<=<<=<;9>EHFDBA?==ABBACDDDDDDCDFFFEDGIJJGDBEUljUGJOMHC>CFB>=?AAAA@???>@DKTY[\]\\[[^]L7/453345566666778:865444344:C;5:>:44577653455543444444345778:<=<:::::866665555579:=>=>>?@?><<;:766568:<==CC8?9A@<=;::99;;;<=====<=??><;<=BKOMPTSOGFDDDA=>==??9:>IIHIKPJ@:8879646972122122157310/;R[\[D1235779:98:<<;<<>ACFIIKLI@7578788989?CB=799<=:966<;<<=<:876776666555556><;:679997544;CD@=9799:=<8CZbZKDC>978:;;;<<;89gn:A;>QYSRYTMOL;;evJA@13GH8M]@<=7=:BgojW861JfWC>N88;>@CFEA@>949;46EBFCLFENVhSM<O\`_THCEMLFGMLC>=97VY6C>@:49BFIC70--.0440ATD.,-.01343579=GJJc~jikcUQQURNFDJTTKOV[cWMORJFD?@WmukX_gd_TWYKFU_`^J77<<3013981.0698<@>99?CGHEDTaRA@BHPR?/6<416>=8780-3-.?KSPLPM?7E_ZGHR]dp^TUVVVWXXXXWVUTSSSRRRSUVWZ[]^_`acccccbccbceefffdccba_^]\[ZYYXWWWWWWVWWVVVVVVVUVUUUUUUUTTTTUUUVUU\e`[[[ZXWVUTTTTTTSSSQQRSRSQLKPRRTUUUTOHHIKJKNNOPPONOQSVYZZ[\[ZYXY[[Z[\\\YUSQPPPOONOPNJKPX`d]RKIJKLLMOSVYagebchif_a`V[][_`_]WRV\^\WZfsz~}{vszu`[`c`eottpdWPLUhdWVYYallounxyn]Rerg`eih`[\^]Z]a][^eimmd]abcec_^]bpuvs`^[U^xz}{ywogaXQV[[^asughYYTD\qmSEKJIKLKKLUXdqzwdMQYWVUVVVUUUVVVUXWQTXOvĿ׎JvcPJMLM[agsm^VTTVTUTXYSRFD`zsVW`]k\LNGHGFDDDDGJILKIIIIR^cqcE;CMSRMJHGNRRYKVYCADC9@VWXWKFGGGFFFFHGNgxzwxqRDDJJMPOOQQNDJ[[NIGEBNNFgwQ@CA\[M`\RgbTT]iXQURRVVUSSSQMIHFFFFGCBFEOtfRX\\Z\bcbmlULPQPPQPOPPRX]_dg]WTOPRNKKOTXYYZ[Z\]ZVbrzxpkeb`UHJ]rrikmlp|lklypHFBDJEA??DIF@?>=AGHIOSMMNMNMQa[QnmMIL[nmeWMMLKKJIIIIHHHIIIHIKJHHFGGGFGINSKDCACTfowywpi^SPNLMLRjvdLBDIIFDBCCCDEEEECHWRFEEIGJKNNGHBEFFFGGIMNIA=>?=<<<<;;;:=DDAA@>=<;<;:9:;;<=?@A@>=<>>;879?HUULS_[SSQKC<;;<=>@A@==BFFC@?@@@@BBB@?===<<<::::8789::;<<<;:9:=GMKJGB=;??@ABA??@ABAFPY[XWVWWVXR=1454566666666679;863453355:;47:>9235776443555544444433579::9:;:<<;;<:76566666668???@@=;;;:76668::<<<@C:37=<:;<<<;;;;=?BDFJGB?@?>>>??><<<==<=====<<<=<<=>>>=<<;ALQRRLID?@CBA?>>>>B@>>9=GKJLMF:678878977?DBA:7CJE>:<><<<:>=;kmqsEBDDDFGGGFFFEGD??>==<=<:526866655556668?FIILNNPPMF=<<=ADB?===;:97788864203<=7423789:<8:MZWLD@;8789:9:<>A>8Bk?37;707KI8R}n`tfHCDDBCFcnT0,KbhXCQTKQ[Y:,@IZWDQdd_VJ;6699:?>;634997686,1BXB;:CN822231127854413EN9.22/001455FQ@LcQ@DIV\ID?55:>=EJ522/.0.379:767;CA58IL>55469;6;I>01/,-5??98:8>PLLwofhkk`UVUUTQG>:;>;>_R4=64643IvsEG\b_HVo[IHGVPGMISXXX\si^inbSSWSPQTSOKHGEEEFCBEBVznPOX[[XYbd]`]NJOPPPQPMKOX_dec^UQOMNPNMONPSTUVWV[cd]_hrvrnifd^NHO`uykkmkrwlki{jWdZNKFB@AFHD?>?CGIIHLNLKLMLLOPKajKHKXik^MJLLLJHHGHHGHIIHHHJJJHGGDDFHHHPSJDEC@EXmxzule[ROLJLMO`qfOBDHHFECCCCCCDCEDBOWLGEGGGFGNQGBDEEEDEGJMJD?=D??YsqYJHMLLX^^_YRPVSNRWWSQPQQQRTY\TLJKIIHFDFGFFFDFFF[hc`__]\[VQTVTZUVZSPNLHGGGGGFGGECBAEKKEDDCCDEGGGECCA>@><<=<<>@><@BABA><<;;;9999:<>??>>=<;>BCA=979HWWJKVSIC<99<===>>>>;;>BDCCBBBBADCB@?>==<;;;:::9789999:<<;::;=>ENPIA=;=======<@KVXWVUVVXUF745689877667578:<8545543568768<>634459744254565344444358::;;;:;>?>=<:76567866678<@?====>=;999775579:<<<<>?=9:;;<<<<<;;::::;;:9>>>>>>><<===>===<<@KPNHA>?>?@A@@@@@A@?=;:9BGKSOG<31103;E<4;92/0010134113311CV\R;//4EJ>76668;<<<>=52;HKLNG<677888:77@DA@<6>=>>=7WP=CABDFGGFFFFGHGDAA?><<:75777655656789>>@CDA=<<;<<978::9652124521125678:86BTVOG>9889:::<<;6899>_M4878866?LECUXJA=<>?Lw^`{SBEG\hXY~ylU9D_pGENF;GJ6,COGFIUflhYC6348:>??=;9=BDFKF=;:88<:3NY]kn]QSVQMI<387;6:8556;CF@<7?IFWpDFWY\YWYXQLGCGQD/21B?7@57:;:X`76CSUH>JI@Muh;+///.-/38;=;:?DA<:;<:88;<:538=;?IJGGEA=<>;6..>C<887521:J[nkSKA9CL=495/1=fjUC6*?hrVXYXXVUUUVVVTSSSSSRRQRSTVY\]^_acdddefeeeeegggfedcba`^]\ZYYXYYXWWVVUUUUVVVWYYYYYXXXXWVVVVVVVWUUTSTUXVVVVWWWUTSSSSRSSTSRSSRT[_[X[`badntwy{z|kNKPOOOORSTVZ`ccddbbbbbcbbba^]]XSTUWWXXVUSQNIGGJT_hni]TMLOQRRRQQQRTY^^XXb`[^^_cdddefa]YXZ[Zb}}iS^h_VVVZacpvkgeabhoxf^mi]XU_oxtlikriagfjvysmb]^\bjmv~vgabddhjedfnxuppf`ckqomkmkc\UT]c[`_[jknRO[^RJFFIKKLMMLINYqkaUMWSXVWWWWXXXYXVVWVUUYSNyׁJUksVLKXbbgic`^[WUUUTVUY[VPUqwtk`mvk[OKNLHFEDDDEFEGKKIJGWvt\UOkuTLPLNRPNUTFPRMz~`zM\THRQKHGFEEEEGFE`{vutmnl`SONLMMLLLLIGFL[_TICHXPBFEFJFGLIFFQ`QTinlgemvZRTQNPTTPMKIHFEFEDDE_oVHKSZ[WW]a]TJEIMNNONMPWckf`_[TOLJKNNNMOOPPPQSUTVdmg_alrsqkgb^OLO[lmkkiqzlheZM`bZPHEEGHIJHGIJJKKJLMKJKNMHNMC\tnWHJITgcMFIKKKIHGGGGHHIIHHGHHHFGGECDFFHOOFCEGFEOfxysjcXPMJJKMMXifRCCFFDDEEDDCCCCDEBHWRHJHFGHEJRHFGGGEDDEHMNHDBCA?QSMLLNQPNSUQNNNOUVPOPPONMMMMPUZ^TLHIHHGFDEGHHFDFGERfd_^`_`fgdpzj^ZUSNKJIGFFHHHGGGECBBCKJDCCCCDFGGGGEECA@??>>==?@?>>@AB@<<>=;;;::;<>@?=;;:;;<>ACB>;;DLMKADD>989:<=<<<;;<9:=DEEEEFFFFGFDCCBA?>;:;:::9777889:<<;<<;;6;JH@<=;=BDBBBBBEEECCBCCDCBBA@@@??@A?@EUd]IEEDCDFGGGIIIGD?=::;;<945AMORTXYZYR>2379:877667679;<:64554346778:=;54446:74333466644556658:;;;;;;>=<;;>CBAA@??=;;<>======<<=@FHB<>@A??@BBBB@A?>=;987:=>CHNJ=/)2?F:6:85/-/00/0221002422DZZB2.0BPG?9348:::;=;622=87?IIA;=?>>A94ukD;@ACCDFFFFFFFINHBB??><:9967877876678;@DHKLLLKKE?>?>?ACC?<::;::989:::75322110/133467883:PVRK?7789;>>;;95//51,Fe{oXQ:48778?BBHNSWPHCDPfYIIT}knzmWQpjA<7.14-+.GM;AD:AinO:68::<>;8;>@<89JfdD:<;:;;;?GA311/--/0011.,Hi^NL^bI355.3>@9>IF=[xA4;AFID=DWOBHA>@@?>>=<:A\lU:?VdsubI@BFHD>4/33-/11112/169;ISE79:9<:6325779<>?73>EA=9>@E_N07=>@AHORNFAEVfZADP\oXDKE@>=<7WxUYB4B?CQQA8OH-./-+--,.39>B>>EFB?@@<9>DIH=118?LXJ76:;:989:537<<:<:2,/46F\UADC;BG8.211,4Wpn_JBMRG7/W]BUVWVUTSSTTUUUSSSSSRQQQQSUY\]^^`bddeefffffgghhfedcbb`^]]\[ZZY\_^[YXVUVVVVWWYZZZZZYYYXXXXXXXXWVUTTSSSTUUUVWWVUTSSSSSTTTSSSSU[bdcdgiimsxy{~zhJIONNPRRTVY]`bcefeedeeeeedcb`\XWXZ[\]]^]\XSPLHHLVdkkf^XUTVWTQQRRNNQNWaZSTZd`Vankfijg_Y]\d}layz}cQT[^[Y[[ZT[ptleb_YY`biu~|x}}plmd]fswvruzlp}~{k^[^flkkoldbccdgb_kurrwyysproonmkh`XWY]`^]a\dk]KYYJAEGHJJLOMKKIWub\HvcW]WWYYYYZYYYXWWWXUSXQYvKYYfYLJUZ[lpeehcXSUUUXSU\Y\hyyqk\`gWRRNKJHGFEEDGFEMPKJJJJIB>QSUxiQKIGGEFSTDCGGS|O:HGOUKGGEEEDEHFCUntpnnmjaWQNMLLLKJIIHGHOXSNIEKKGKDBHHGGHGFagQJ\tdXdgrnWQPNNOPPONLLKJHIHCNcZKJHOXZWVY\]ZROMLMLMOSajjcZURPMKIGGMPNNNNOONNNORS[ehcahmssmjd_NJTeg}ohiglhdf`PJLWSMMMJJMLIIKMLLMKKLIHILIK\V=Kg`KHJGT`RDIJIJIIHHHHIJIIIHHGGGGFGGEECBMWSNHFGGFFJ^tvoiaVNKIHKRPP^bTEBDDCCFFEDDCCDDEEFOPLHEEGIEGLJJHHHECDEFONIHHC>ANLGMPONONOMKLNNPTXTONNNNNNNPRUW_ULGHGGFEDEGJIFDFGEPbba`a_dr~}hTQSPLIGGGEEGGGFFFFEBCDGGCBBBCDDCCCCBCCBAACB??>;;<==?AC@=<=<;;;:;>@A@?<;:9::;;;=?@@ACFHG>5689:;::;:;<:::98;;;::9988877:;:;==<969A=9<;;?DEBBBBDEEDABBAABB@@???>>?>=ADAG[eTFECDEHJKJKKLJF@<:;<:;85577:ALU[ZYZTB5699766667689;::75454346777:;:96569974333455543556668:;;;;;==??=;;<<=??=;86677899::;;<:8554456669;<==<;<<;;;;<<<<;;;;;:;;<<:::<<;;=>===<;99?BBA@??<9:<<==<<=<<<>==??@BBBBABBBBB@=;;;98788::8;DKG>DIKGC@<88:<;9966>IRJ5/555667638EHC?<78BIGA>=??A:8e~uf^RB94::?CCCDDDEEDDFIFBB@?>97:947767776667>>>>@BB=:::976788:::8543001101223566745HSSK?::99;?@<9AX^\WWJA;>awI89::;==AA;>FGFGO\~iPLhzytxy|I9A;CNKNUYf\QRF;7\oL78>;47??>CEA5,.Aca?8:<9458<;712402=B?:4246752018:44960.,,/-,010/-EGIE<=HSN;.-2579::;:BdoKEV_~`?211479621/00/.-.021223?JDCXd\QQVRC7/256:=@?<@B?=::CZ[;387::=?@BDB@GSRGL^V[[?GQKLHGI8O]DU_J34@UVC)Fd,.2//01110/2457;BFFGKJGDJLLMF=65@V\L<8;=;7:D@7:>>=?EE>4-+*,..08=53<810030*.572%/JPE73MN=TSTUTTSRSSTVVUSSSSSRQQQSUY\__``bbcddefffegghhgfedca`]]]]]\[[\_`^[XWUUWWWWXYZZ[[ZZZZZYYZZZZZYWUTTTSRSTUUUVVUUUTSSSSSTTSSSTUVXZYY^bdglonmqvycGGNRTTTTVY\_aaegffhiiihhihgeb^YVUUVVWXYXY\^ZSKJMOQTX[^ZTUYWSRSTQPPJ\ujVRZqkP[qpikptqgd^eq^c|u^VX[^]]^]^XUgqhbaa^_bXWo}{w{|lfjrx~~|l]aklhdafh_]abcd\Zow`dtyt||mnoni`XWVY]_]]]ZklMicVKAGJLJIILMMMMLGT|f\LYGZ[ZZZZZ[[ZYYXWWWXUUVLvfN[XT[dMJQXWbrsnpeWUUTUXWTVQNe~p_VTRQQMKIIHGEFIHBG^`LHLHE?7JjbO\wx\HFFDCDQTDAAD@uTJI>BOSQLHGFEFEDFDEMeunnqnhaXRNMMLKIHHGFGIIJKKIGHGHHHIGHGGJ?LgZPMIOUT[\^qq^ROMLIJMQSQOMJGGDDUVKNIGOQUYUVYY^dcUJLMR\hni`WTPKJJJIFDHNONNNOPPPMIMTUYbgeciqtnjibKJ[mnsrghdvedk|pOJMLLOLJMKJJKMKIJKJJJHJNMT\QGNXUJIHHOOGFJIHHHHHHGHIIHHHGGFFFFEFFEFABnmaSHFDCCEXpsnibVMJHHOZSHQ^VFBDBBCFGEDDCCDDDEFILJHCCEGEHJIIHHHFFFGFRMGHJE?@HOROONNNNMLMMNNPTYWPOOPPPPPRTUNdUKGGFFEEECEHGEEEFCHZdedZShj[RPMJKHGGGFGGFFFFFFDCEEFECDDDEEDBAAA?ACCCCDCBBA=<==<>AC@;;;;;99:>?@A?=<=;<<;;;979>@?AFIEA9799;<:79;;;<<<;9=DDA??ADGFGFGEFGHFCA=<;::9:::99899:;;<<98:=;;<;=AEEBBBACCCBA@AABBA@??????@A@CHEGOULEFEEGIIKIGHHHEB<7799776777678DQVY]`S>4897666777898325546435766799776669753323344444556779;<;<;=>>>=;;=?@ACF=;96677889;;:9876554467778:;;;;:;;;;;;;;;;;:::::;<<;::;;<<;=>==<;:77=ABB@>?<9:;<<<<====<<<<>BCCCCCBBABBB>;9::9879:;;::>=HKF?:8:AHHB>@@ABCBBBDEEDDDEECBA>;867765667775689?FIHIIHFFE?=>>?@@BA>;=<9768989::8643112102224446644AMRG89<<>;7;@?BPkuwriZFdm]?7;;;<<<;865668?JeͼoOYpxV6:J_y`[bg]JbtT;474019@DEC:0.16>>43588559=B?522124::4-,37867;90-6810/,*0<7.*/326ObK;Lwm7+:;9518@=7BQ@,5_SBMMID=;:BF5),/26789<<@ckG:9_`;3232./695468950/123132369Lp}kkx}oT?559;=BFHHKLF:9JXF1789:;CB;:@A<;;77UzqULBANWN@FSBSLB8JcO@LL?7+;]E+3311222352/40/@MJB?AADHQSLMKC:5:CHG=58;<78<==>?EMI;0,,+(-;<,(36420296)"(..6@=5237?BUUUVWUTTTTTVWYVVUUUSRQRTTW[^_aba`abcdefffhhiigfedca__^^^^^]\[\\[XWUUUVWWXXYZ[[[[ZZZZZZ[[\\\\YWUTSSRRSTTTUUTTTTSSSSTTTSTTTVWVTQRW\_adipux{zuwwaIHQTTSTWY[]^^bdeikjiijkkkkje`[VRPPONNNNQY_a^WTRQSSPOOQSWYWRMRWVTUU_vra]^nu^^klommostpjhsxxx}}j]YY\]\]^^][\ab``aa``b^\lyty||xg^eroc^cidYV\^^[[l}xgcpxwzsfotqdXUUTX[]\\ZXlzYW^fn`NFQ\NHJKNNMNNNITlUSM~d]_\\\[Z[[ZZYXXVVVVWYSR۳`T[WUSmtOJOVZaowqlf[TUVVYWT[SHcuQGJOOMJHHHFFHLG@QpsTFJB@ABCCDDDDDDCBA?<;@C@=:99:99<@A>>>===>>==;;867:;;?DC@?=;:99:AC=78::;;<>BA>;:9:=?@ACDDDEFEDB@?<:::;;;:::98::;<<:9:=<<<<>BDCA@@AAAAA@AAACCA@????@@ADFJKLNKEDDGGGHIIIFDDBBCDA@?=86677776423@@@@@>;9766667:===9666677789889:::::::;;;;;;;;;:::::9:;::::;;<<;;===<;:9:;=>==<;:8:=>>===>???>??ABBCBCCBBBBB@<:9:::999:::;<:=EB63798664/,*'&*-.--.--///32*?M3+466226;@FHEDA=:768:879FI72555666898;EIA:979CJGB@BB@>:534766667;;?ADC?>>?>;878988886431001111112223334>==<<:877778=;>LE/-9kpDIKEB>>;4343799=?=?B>A\Y<16]U.186555525=<8:<:3362234751Ps|ifuzqeM;@AQXL6:U^feAC/-Q\GD=4547B:001110/14788CEBKNF?=;;<@DFHLJC<59ADJF;889;<<519<;;;78EPNB1*++,9<0*/249;9AJG:21110012782/^^^][WVUUUUVY^_]ZYVTRRSUTQSW[^__^^acdeffgijjihgedba`_``__]][[ZYXXWUTUUVWXYZZZ[[[[[[[[[\]^^^^]XVTSSRQSTTTUUTTTTSSSSTTTSSSTV[\\ZWUWZ`cco|ztphetz_LPTTTUUVY[\]`dgjjjhfjlklmlid`]XROLLLKJKPW\^ZURRWYXWRQX_^][W[\YVW\bsua``j|mggdmkfaclqstpluseq}zl`][Z[^_^_``^]\\_``b`_```aivvxz{}~uhdbaeni^]chgeecb`]fwulv|uw{xxqgqysaRSTTWZ[\[YWl_X|wymrpidJJN\WMNNPPKV~j[QLqnZfb`^][Z[ZZZYXXWVVVXYSbصl_`VXXcZJNU`ccb`dkcOR[[[XVTOHquo|nMJOOMLJIGEEFHICHb{nYLA;;?AKLGNLTlmNDDDDDOPC@BBC@:=IKKRUOVpeEDIFFGGEEIJK_kktrjcXQLKIGFGHGGFEHIIHHHGGGGGGFDEGIBUeQQ[VQQRRPMIGOTOKIGGFCIQRQMJHEGPJDIKQYSKORSRQQOKJLO[jrj\SNNKJKJHIGJLKMPRSTTTVZ[YUPKGJMR_iklpxwxgM]~wqnzibjfkzqdfXB@DIIJJJJKKIKLKJIJIIIGFKZZJCHJJJIIHHIGHGEEFEFEEEEEEEEEFFFFEEDDDEEEFCAnsuv|pYZiomicVJIHK[]E>GNRKDBBBBDFFFEDDDEDDDEGJNQKECCDEFHMLKNSWRRLMLKLMHFKNOONNMMMLKKMMNPRVYUQPQSTTVXXWOJUNIDDCCCDDEHIIK@EBCBVb`_dcn|nOBEIKJHFFGGFFGGFFFFFFDCCDCACCBBBB@>>??ABBACDDDDDCCBA@<;?@?=:89::;>@?<<==<=>>=>=<:9758;>>@E@;:77;9;FLKD;5458::758:;?CE?;=ABCDEEEDCB@=<<<;<;;;98::;==<::>>><8678986666555557876553333445555789;===<;<<<==:<@B@>=;;::9996545:=:656679:::;:9:99999::;;<<<;;;;:::::9:;::::::;;;<<<<;;;=<;;<;<;:9:;>AAA@ABEEDCBCBAABBBBBBBBB@;99:::;:::::;?=:77?GHEBDC@=<;:9:99777986?CBBAACCBBDEEDA>:87776677777657;@FHGHHIMOI<7<@@@ACB=:=>:876578787422200011111000/1318AJ>22545528=63>>6HLGfj`]PEB@@?==<98889:;;=>@Wp{{jtgo~o_XutOZ]LF?9Dn|FHeN4889=?845555689;?A<547656766<91/288634759;9=JB28BLC25AJK@C_ysS==?=;3157:?=BFFIIBL^L:DII93<:746<;47DF?=5527:326432S|xf`hlimqcJ@CDCEJNSVXTFAEEFBFGB>=>AKUYXWRB;k5;@9BKL@G`hddN=A96CRE;>>8.33-38/-56582/2899=BFA50hhfa[WUUTTTUX^b`^\YVSRRTTNJQW[]\\]`cdegghijjjhfeecb``___^]\ZZZZYYXWVUUUVWXY[[[[[[[[[[\]]^^__^ZVTSSSRSTTTTTTTSSSSSRSTSSSSSUY^^_[Z[^bcagqtoiimt|uaTPQTURQSVYZ`jmgfjjjllmmmmljfb]UOLLMKJJLOQTRPPOQTWZ\^_accjxq`[YVW[fihohhnhbad][bcgw{idlobP[x|z~vkb^]\ZZ_baabca]^___`ba```b^Q]{}tuvrvxz{{|vuqc]acfha]]^hw{tolhinmadw}wy|yvlhv{q]QQTSVZZZZWVd}{{rPJKQXkeNNOPQL\|hZUVXtkQ[_dc`\ZZZZZZYXXXWVVZYSpăeaXVV[|fGT]d_ZZS\ntf^^YXW[YPUmskb[SLPRQMLKJJHFFFHIIXjtyyo_VMA@BGJILJH_uOCCCEHQPC?BBDJLIDDIMJEKYTHFHGGHGFDCFDO\cu{pe\OJIGFFGGFFFFHHHIIHHGGFGFFDEJFG`UDKOSRQQPOMJKKMKHGGGHEDIPSQLJIMMCDIJMLORQQTSOMLGKT`pyq]OLJJKLLLLNNSVWYYXXYYYZZZZXXTKGP]hpmikrx{eQtvxpbb|iczgur_`UAFBDGIIJIIHHIJKKJMLIJJEFLRNHHFHIJIIIHHGGFEDEEDEFEDDDDEEFEEEEDDDDEEEECCn|snt~yjdillg`VKIIMUSD@DKRNECBBBCDFFEEEDDDCCEFHKMOKE@CFFGNPNNRZSUSOPMNOLLLNNNMMNMMLKLMMNOQV[XSQQSSRRTVWYJQRJCCBCBCDHLLLOGLB?@INUdljplVHHGJIGGEEEEDEEEEEEEEFDCCCCEDBBA@@?=<>@@BCBCDDDDDB@?AC@?@@><:9;;:=?=<;<==<<===??>=:888:;<=OTIE>:>@=?GO[_L72/357;?CGMTRE?ABCBDDDFDDCCA?<;<=;=<98:::<<<:;>==<=?BC@>>?@@???ABBBCCB@@@?@BACHLNNPQI@=@BGJIHFFD@??@BGJNNC;98888785434419HUZJ968977678;<;?CEB9569875555544446787654323455556678:<=;;9::;<;:;@A><:899;;<;64335:4356689;;<;:99988999::;;<<;;;::::99:;;:99:::;::<;<<;;<=;:;::<@BDEFGGHHGFFEDCCCBCCCCCCA>;99:::;:::;:=CA:7534;?<::730.+,.)'.42221/-+/2,75656677898459AA;68@EEEFDB?<;8:998676765=A@AAAAAACEEEFD>966866677777769AGJJHIILPK=8=;=>7235678;:8ALC856886531/61.5=<:99>><;;BG94?HH@967??652>JD8<7@TZ^N27=35454365479ER>35,2MF0/49>;743448:5<:53;?=AGEFH=5-25912>7(>|yi_addeheQADEDFKOTVY]KAFKIFGEA==DLRWURU`KD:(?>88GPIYe\NMIAFF@CH@>@CGMNOVUNC=>><=?>:AG:572=RUSZR?@J@4--4?-)++7JPOUTE7--CRNNUTE73dc`\XVUTTTUWY\`ddc`[VSSSROKOSVXVX\`cefghijjjjhfeddca`_^]]\ZZZ[[ZYYXXVUTUWWXZ[[[[[[[[[\]]^^___]YUSSSSSTSSTTSSSSSSRRRRSSSTUTV[^^accedcb[Xaknoqqtxti^TNOSROQUV\ef__ehjkmnoooonjgaYRNNNMKMNNMMMLMORTSU[__`ccgs|kVWYZZ^]azr_w|rd^`ZXbfenurj`\[STn~{zz{~~yphb][ZZ_ffccdbaba_`aa`_bc`WRfxxy}wy|t{{sumo|so{udacec`^]]gvujggillb^o{vsx{|kUaxxkYQQQRVYYWWVVoZ@OXTaokXONQQMeg\XYYZYTX]acc`]ZZZ[ZZZZZZZXX\ZN~ǔm`ZXVS[tB_wudWWQS_lrob^^\VYRXUV[]\VRRRNLLJGGEEIMNQ[dfedbccXQKDBFGJNNIMtY@BDGNSPC@CDEIJFHOLC@DEFHIGGGGGFKUXVZ`bcswj^OFGEEEEFFFFGIIIIJIHGGFFEGBCMDUaDABBILKKJIIGFFFEEEEEGFACKSSLJJLHEHGHHHKONOTUOKJEJ\ipoZIKMMKIIJOTY^dfghhfeeeed`bjnld\\j{vhjhcfpwj`iomlkf\W{kohljMJDMFCDGGHHIIIHHGFGHECDFGILMMNOHDGJIJJIGGFFFEDEEDEFFEDDDEEFFFFEEEEDDDCDDIaxtdm~xtqnkjjf\SJJKOQLC@BHSRGBBBABCEGFFFEDCCBDDEEEMURIEEDGEEKMKKIJKKKJIJJLLMNMMMNLLMMNMMNPQU[ZVSPPPPOQSSURTRNFDAABBCHMLKKIBB>?CBN`mmm_RMMJLHEDBCCDEDDEDDDDEECBBBCCCC@?>==<;<>@?ACABCCCCA@@BCCA@?>=;:<<;?@?=;=>>==<==>?>>;:;758::@U[UXTIDE=9:BTdeH9;CJLLMNPPD=;;@<>;98999;;;:;===<=>A@>=>>@?>?@AAAACC@@@@?@CCFKMLLOOE?=<>AFGFEEDCBBEEHIIFB;867776665443115>Q`O62:9999:;<;==<975677755554444346877543334555566789::988788889=>?;9766789874335872356789:;<<:99888999::;;;:999989899:999:::::;9;;::;;<;<=@BCEE@<::<>@BCHJIHHGHHFEEEDDDCDDCB@<98::::99:;>CFB;89857;>=;:73/--,**1:832310/,/203:9311134566556558756632216855566777788857?DB:7:?BEGFC@@AA;5765555568686665666668=ELLIHHHIF;4@JIB???>=832002432331.--0///0012233454332.3962234444425ig<;Mw\DDDBA=:75668:;<>CShwmghec|tymi|`DKK:,/009?><@A85228<@HO@//AJA95>I?30++114?>;;=><847=>99?AD?8>4-.-*'<86617B?AGIHJQTVYYKDHGA=;<::GRY[YUU^gU[c,/68=EDCL^_KBKNIJGAA=988@MSOQLKNHLHDBACFLOONLHDA?B@88<92BA3-+3IYOHSRILSM:/14?H@:LK3))*->ZU>1.9C9+&*.3Gdsq]I@BQ]XPYcU:0ZYVUVVVWVVX[[[^bfgc`ZVTRQRQOOPPQW]_adfgikkkkjigeddcb`^^\\\[ZZ\\\\ZYXWUTTVWXYZZZ[[[[[\]]]^___aa\VTSSTTTRRSTSSSSSSSSRSSSTTVVVX\`fgeedcb[RR_jkfgpx}vj^VTQPRTUWZ\afhlnnopqrtsoke]WTRPMMNOPPPNMMOTSSW[^`abcb]ko^V[ilg^V[pynxo]^YN]z|rk``e`XVfz{wxyyyz{wne\Z[X]imebeeefdbccbbafi[Piyy|xwtr~z||sek}|wraaca`_^]`b_[[[^``ao}zpinxy\H]oj_TQPOPUYXUWU^o|GI[\ZY\hcQNSNOlr^WWWXXXXZ\]`_^\YY[[[[[\[Z[\[^ZLڽq][]ZUVhN^}sSMLHNXbi_`efZWXTX]]ZYVSQQMHMPIDBFPXY]ba_`\[hgUSSNKIGNSWPE\~mG?DGMUPDACEEGGFHNPJGGEDFHGGEFH>Lt}jm|}kooYIEFDDDDFFEGIJIIIHHGGGFFEG@HQLcZBNOIIJIJKIHIGGGFEEEEEEEDITTLLLHCDGGIIJKIHJRWOIHEQdii\IEKLHGIJMU\`fjjkmppnnqsru{}hanoZSYWQQUVQLLLNRPNNAb|p|SPyhMLKIFDEGEFFHJKFEIMLHKSSPKMONLLHAAGJIJJIGFEDDDDDDEFGFEEDDDEFFFGFFFFDDDBCFSY]`[g|vkggimqv{iMDHMPNGB?>DQRGAABAAADGHHGFDCBACDEEHRcjbTHBEGFHHHGEECEDEGGHKKMLMMMMNNOOOONNPQTWVTRNNNNMONONJPQNDCABCCDGJJHEBABCBCDAIYab^VORPOHEDBBCEEEEEDDDDDEDCCCCBBBA><=<<;<>?@ACCCCBCCABCCDDB@?=<::<;>=====>>>=;@;:99979:;;;<<<<=>@=<<=>??=?AAAA@BB??@@?ADFLPNKIJC:==8;<>ACCCEFGIJGIHECA<8576666664557<=;;MfP68:<;;<<=<9777545666455444432247666433355566666777778766500;><<8532234422225;<54456789:;<=;99877999::;;:98888787889:;::;<;<=;;98:<=>@BEGGGEDA<;;<<<:88;;:::98;FKC99;:6579;<;951/--1=<1..02223311244212201567775444466555643444445556665578778>E@99;?DHGDB=6f^;54444345;>?@@AAAACEFFHHFA:77766765788:AIKHEDEEB:5;FLH@<:;<840//03556764123310/01223557<=<<94432133344554)EQ2Flv^[F:9?LKDSeX;@b}{wlgnZCJdvkJ<<6200006<:<>?>QshD>JHBABEMMFGQWJ86CG>;OW@0-.0/2;?5./8A>602:6488<86625YylG>>2277::611-./..0234=JE9:>9-),/579=@B>433/.00./38;83123667742:@=<=8/,5=DG?4214BYsqP:5DZYJILE?:;AD?:636<86/ATRF@AIVWWYOA74;@>@IOK@4-5^_?@I;4AD:6Ikz]PSRKMNHN[V?5VUVYZZZ[[\]^^\\^dkjea^ZSOONLKHHLU[[]bfikmmlmkigfddcb`_^\\[[[\]^__^[YWUSSTUVWXYYZZZZ[\\]^___acda[VTTUTTTTSSSTTTTTSTUUTSSSSTUVX]addccbbc_WYafghowxvz~|n[TROPRQQV^dfiosqqrrtvvrmg`\[WRNMOQSSPMLMNOOQVZ[^_abdbbhf^[^db]YQb|yvs~cVVbnhmg_]ct}yxwvuutqj`[[\[\fokdfgghfcdedcelhZcsq}{tq~rfdl{zdab`````^][[ZZ[]]byvmfiodOIYfaZRNOPNNTSSZWeocWG[^Z[VV``QMRR[rzh[WUXZ[\\YXY[\[YXY[[[[\\\Z[]\^YT׽m[^`]XWUlfW^}|LEMJMNQSLNVZedaUZ]]\YUTTTOGN]dc][]__bca`\\cb[W[^]YMGKNSSHC`uU?DFKTPDABBDFGFCEOSPKGEGHHIIRUCFflZT\f^imOCDDDEDDGEDGHHHIIGEFGFFFEC>SRZcLRTQOLLLMMMMNNMLIHFFFGHMTWTMNQKGCFGGHHIIHGFMWPGFGTgmcPGGIIIOY_cefffffinsxz|vlkx~pZMILPNJHHGFIIIGGGFE@RpzzZDndGJJNKFDFGGGFEFEHZjlhjiaVMJHHJJGGMOKJHGHGFEEDDDDDFFFFEEDEEEEDDDDDDDDEGJJKPRPPVanrnhcgjnw~pRMQQICB@=ALMDAABBBBCEHIGGFCBABCDDFQaimm_NEDEFFFFEDDEEEFFGIKLKMNNNNOQQQQQPNPRSPPPMLMMMMLLJJMKI@>?@ACDEFFFEDCCBCACEA@GTSMLOOMDBCBBCDEEEEDDCDDDEDDDDCBB@=;;;;<<>?@BDEDBBCCBCDDDBBB?<<;;<<<===<<<=??====>>>>===G]XF:72CYRTZUOIB<<=7998>AFB@?ACCFHIGA9:@HB<;988998:<<<<<<=>>;:;<=>??@BBAAA@@?@BA?@FKMNMMGA;:<869;<>BBCCGHONGHGDCA>::6566887779=CEA;5>WVA<;<<<<<;75565345554555555331254444444444666565566665562;XO?887532244322227>;544555689::;:99998::;:999988877999999:=<:<=>>>;957=AAGHGHFEEEC@;99;;::<=@CEGGGEEFFFFFEDEC?<;99:<=:89:>CIE98;:88622685111/.04HVG3./002331.-0200236;;987654324455466446544445555544656515=?=99>CEFDB>:]r^;/2233459;<>=?AAABDFFFGGC=7676666558:>FJHDA?>><77<@?=;989:9887433579;;;=<9521000123789<>>??<86334433344530[t:6>O϶~C01;BCEB=86523568=A?84:5.HrgA?NWVX[gbF@IIB3.6DJYi`O;18>@>840/2599;:;d\5=LNMLKHHD=66GWYODIDQcQ645673382+'*3?D=5686655>C>>??;989???;8;==<8?INQ[`G/464//-/006DQ[bYD43<>979BIJHG;2220////1678634333312=>8:967=CIKKJ>30/=Y^B/.14:@MWUXZTPSW@-IfgdaYPLIFIUWHBGJGGOTG79=<5//:L]M8:>><=ACIVSC:;;958DGFD;33BLLS`f]K@?@>?ELOPMIJLLKJHC<:<<:9DGCJNMFE=05IVVYYK;5549CDGK@>[meC6.2BMOSXSPWVWZ\]\\^_^^^\[\]emmgc`[TOMLKKLMRWX\bgknnprpligfddca`_^][[\\\_``aa]YWUSRQQSUUVWYYYY[]\]^___bccdb[WVUTTTTSSTUUVUUVVVUTTUUUVWWUTW^cb``bcb`\]cghfa\XX[]^YSQNNOOPSUSXakqqqstuvwwqia\YVRPNPSTSQOOONKMQTVXZ\\]]^`_^^[SSXXZ]X[wv^knYYŨ~o`^[Vexyvtrqonlg]XX_gcamngfhgccdbcggosbcqlvwyvekw}vebc`_bbaaa`_]^_badz~vpodPIJWbZQLKKPRMMRV`\o[jKU[\]\[[[WRSSSato]XYWXZZ[\ZYYYYYYYY[\\[[\\Z[]]^Y^˳nX^gf][U^yyh[j^INJLLKIGEGEP_d\TY`]ZWVVTRNN_uxfddbcbbbheRNT^gg]MBCHIIH?KkbDCEITNDABBDFGD@DMNLKGFKLEGYgeQ?G]`RLNRi]GBCEEEIIEEDGHHHGGIGDFHHHE?EUZ^RKTQOMMMNNOPPRSSQMJIHEJSX[YLGVTFEFHIGIJHHHIEIVQFEFUijYHEFGGN^nttssrnnrysmrxs`OJNRRPPONMLJKKIJKJKKKM_q}[BZ|aCJIKQK=EYQEEDCTcbunbMABIPTOJLQSQLHEDGHHHGHGGDEGFEEEDDEEEFEC@ACGJKLOSSPMOOPRVY_deabgox}}hWOHCDC@?@HICABCCCCBDIKJIGFDCCCCCBCPY]dojVFBDEEFEEEEEEEFFHIIJOQQPONQSRRSSPNPQOOPONMMMMNMLKJIJGEEEDDEEFEEEDCCCBABEAES_YQONIG>ACBBCDEEEEDDCDDDEEEFEDBA@=;;;;;;=?BFFECBBBCBBCCCCCB><;;;<=<<====;=>><===<>>>=BJVaga[LE?IY[\\\[VH?>>=?[l]IJPRRRE:6678:?A?@DIDEFGFB:<>NF=<:98998:;<:;<=<<<;:;<<=?CFECBBAA@>@B@AEKNLJLLC;=?=<<:;=>AKRAQEGIGGFDCA?;956778899:>DCC@>=;:MPC:==<<<;75455444344555544431033443322234557765554435666>>?>=;<>CFGHHFFDDDCA=:657779::;D@?=<=;:;;8214641/010115KZRH?80*++*+//1789=DF:4664444433444653455544444455445665446=B<8<@CCA@BBNdzaB74445666997:=?ABDDEGGHF?9775555557;AHIC@=<9777778788888:<=><8535679;<<:732211023368878:;>??>:6554344447*1jk=01StP>532?oG47<;:978@D@<8977Mh\C?IQH>=E<-2;9521/.4:984007@AA>5220167;EJMM?2/7FMD>@<88;FX]MCEIKJOIAWg]YWQMMMJPhkI8I[]RQVC.5;7221/5GN@77;BFLTNKOA24=>?MLADJC74EQOV^_\WOJHGGHKKLKLX]NCB?:89;<:22BVc]OE?5,/6>=KTI814@F?==;6IggICKOOOPF1)--13('61"&'%&&6WpvyWWWY[]^_``___]\]Z[ennhca]VQNMOQQRTV\cilnpuvrnlkgedcba_]]\[[\\]````]ZWUTQPOPSSTVXYXXZ\^^^^_`acddec^ZWUTSSSRSTVWVUWXXWWX[\]]\ZXVW\^]^`b`_`][_bcaVLJKKMNPQOMNNMNPLHLUbknprrrruxtnfa_^YSPQTUTUUTTQNORTTTTSSTTUWWUUWYYXY]dbanxsc[gbX˭oVTXZanttsqonkjid^\hqjcgjihjka_ea^bo~sbryjltyns}}}qfehgda```ab`^`addgq{ygXNOSY^YSR[_Zdtom^X[e^U~Yf]R\_^]]ZW\YRZgraOVZXXYYZ\]\ZYXXZ[Z[\\\[\]\\]]_Xg㱇oV]mpfe\Yr~qesiQMLLJKLJIGFCGRYVZ\XVUTSRPONN\sidaecdtsb[WUV`aYRHXh`QOSOZcNDBGUNCCEFFHHABPQGIJEDJRFJb`[\EIqwld]^p|`DEGGGGI?7CGDEGGFEGGMQKJKLNLS]jVFPONOOOONOOOQRQPPMGEDHTZVTOCIXOFEGJJHIJIGGGFKXUKHEZn`LEDEFISalqtx|shnsjWKILPSTTSSRPNLLLKIKLLMMLMVfWBOhz`BHHELNDRde^XPHZqn{|e_TCJYbjcNLMNLMJECDGHIJKMNMHIIIGFEDDEGHIHEBBGNPRRTVUQNOQRROOU[[\dkptvrqrl_PGCEGB?@EGB@ACCDEBDIKLKGDDCBBBBDFINQWdmk^OFFFFEEDEEFFFFGGGJQVTRRPNPPQQRPPOOOPRRRQPNOPOMKNOLPVUSPKFDEDDDCCBCBBCCCTnqd[WTNHFEDBBCDEEDEDCCCDEFEEFFED@><;;;;;;???==??><<=>>GV`_^][]_P>ENRT\`]TPID?=@Sh^NOQOPJC<@C869@GC><<;9888::::;<=<;;:;<<<<=DJJFDDCAA@@?>DJMMKIHEA<>>BNJ?;??CGXE]VBCEGECBA?<977777998:<<>>>>?<:===;8666544323345534444223333211023334777766655665665312376544555535;:43455554577777889979;999987777669;;::::;==?>>>>=>>ACEFGFFECCCDC=6565556889859>CFGFDDEEFGHF?9:::;;=:7><99;;9743553101121,1ETVSND<::?GNZYOHFFD>512444444444455444445654434443354433203999;=ACBAACPWrx\D85556457637:=ABBBCFGGE>8764455559>DGE@<;;97677779:::99;<>?><9465111125434532245566665579:A3DQ5.-,.,-278MhV;BEDMG1,--;SZO<542.-./05?FE9/+*+++*8EA<:5/,*,3BNM@9>DADHCESW\c]ZVOKIHGGQf^HRghZ`rY<@?77;9767;;48CGGED>BSI32B@E[Q;?IE<7;BKX]YVZ]QEDEEDDEFHX`F22056257;93CYfh]B01673.4BRQC?IVM99@ABLQEBKLMMUZJ50WcBEEFEFFB>>?AABBBD@=;9::99999;>?A@?>>??>===?GU`^][X]eX>5;@BHPQRQRNECA=L_XOSQLIKMVQ=8::=?CSYKCDFEC??A?<<=;98889:::;<=<;;:;<<<;;BIJGDDDCBA@?AFIIIIHEA?<=>==<<:87754444333444344423334432122321467777766664444322235533345555787213454444677888877779878889777789;<;=>>=>>>>>@@=::>ABDDDEECABDHG;5777789:;977<@BCDDFFEEFHGC<8:;:;:;>@@<68:;;9899::953232211124523ESSQUWUX[`_TJBBC@9433344444345335654444566544554355443137??BIKA:743455456569;?BBACEFFD>755444545:AECA=99:::76799;;;:89;<::960++-36887767786677666567669:8988;9765345./IdDKuB#/16=`}238646;><86229>CHKZaGJPI?>;8327BME:869::::987:EJA=>:7<>:BC>=865459?<64,*-&:m|`:.,/0+ZkTdJ>]_HU[JC=6323447;;//441/342-3A@3=TS<15758II<><8879734/.xk:2352.4CI?@QI>NZQ?102.2;LZV>222..038:==962/131/+=G<699973.0>MIADJF=/6]hQPVG=BC>?S^\abZPJGEBA5:o~tsljmFC@9:<:;<;9:@GJC9587AUN4/;;=LJ>AFC=947ERWWRPUO?=BCCDFJNWXD76/7GE37PFDFCU\K12ITH:=DEOVTPLC824=EEEJHDCA@ELKB<>DGA2/0++2<@A>22bVVY]_^\XZadc`^\]]YWW\gle]]^YUQNPRTW[\]`a]SThrjhgeedccb_][ZZZZXWWVVUUUUTQPONNPSSSV[WPQVY[\^`cefffhif`[WTSQPQRTTTTTTTSSTSSSSSTUSQQQSY]`_^^\[]_`bd_VPOPPQSRQOOPPOOOOT\b^[iuuusnpslb\XUYXONOOOPRSSRRTTTTTTVWVVWVVWWWWXY\`fhfhfcd``gWm}af{zuuuutx|sghjmqrommlkmmlknmfda`[^t}|}pr|y|quwu|hdimo|}iababccd`_ddgqbJQkxyrbjxhbfjltbUXTRpɺȵhffT[_^^]^akveWb`PKMSYZZ[Z\__^]\YXZ\]]]\\ZY\^][^`UxP^\[brtmi[UWjsOEPVUPNMMLKLKLIGHHGKORWSPPNNNMMLKQrtbbeckeMViefxlVVbdaVMKABTVAKZJGIFEFJI?@HJGIENeNGMTobOQYWSQONMKBHZokPII[̶_6BBCDEFFDLaYGJJNMaxVDPNRUUVUROMLJKKIHEACQegVHHKTZNEOWQMNMKKHGGGHHLQPNMPXREDFDGTisw{~xoej|YFFHKMKKMOPQRRQOOOONLLMMLLLLKJRosMGILgXBIIKLJ]Te{jFO]qt_XTLXhg`[SNJLOPLJJLMKKLORTTTUUUSSRQONNLJJIF?;?BBEIKMOPMLLLNPQPPPQSUZ`inke]YST`eYJ@????@AABBCDBDEEGLNJFDDCBBBCFLHACJVedSGFFDEEFFFFFGGEHHHRXYXSKMOOPONNNOOPQPNOOOPONNMLNPQRQNIE?DDDCDCDEEDEDDCCHJIGFGGEEEEDDDEDDDDDDDCCHKKJJHFB>====<;;;;=@CEFEFFCBA?@>>@ACAA><;;:99989:>>?AMX``b_\^bT=58:<<<@B>EPQDDC;IVSUTQMT[UGDB?<:==IXOBBFEDA=<:9;;988889:::;<<;;;::;;<==@EGEDBBBA?@BGHGFDDED@?>>=958<=@GHLG@>QP6:@ABCC?<;76676677677998888::;;;<<;<<<;9875444444434433333234454322220024455566532333332322332223654895322234445558888988877987788988899889:;@A?A@??>>?<69?BCCDDEC@KOIIGA>=;99;;;;9::9<>=>AFE@@DFFIB9:;99=CE@72689:9999;;:86232///0246776@NMGQZY^d_L59CBB@>=<:524553444335544444666665444579:<8=\uoC/8=ADB<76;8-.24655454542688:?CBBDEED>864433445<<>@>:93/7;8787778:9765544455796546:=;;<<=;964;:3V^MfXWyndWDN\K988DF>;;6232397jsGg\F8/69<@FG>604DOOJCC=>?ELLKN@3686@DGLA98<:79<;4,,-,6Pi^;0/-.,Jy=EIL[U7@UYQF432//15:=9794269:65:@<7FXVD869;;<@>53461+02/./C;58:75@WVA7AKJLXK62650334GWD111.027=942148=BB?9/>G6,3;CGA::?B@?EHB==;>A;6Pj[JMQE;<>=>N\[[XQHCGHG>5ja@DE@>=;;=@DJRSLIDDKGCPP;2688966CQSRTTOHDGLMLIGJX]PB=;65MeRGVGA?:DI>9K_aQEHJIJMQM@46CFCDCACD>;;;=>:9872)&#&+2?@BBCKGAKMI`p[QOLKGFGH@KpqTGJǽr=EGCEFFGHJJUVHIJIFomBKOQTVWWUPNJNNHCAEKQYfeTEDKPTQED\plZNMLKJHHHHJJJGEGGB>?EGDI_z~uihp`KNPMKIIKMOQQQQPNNNNOOONMMMKJIJJNSHHIFZQJLHDDHJDQN_]PKNYYRROQZXPMJGFJNPJJVXQOPNNQTVUUTUUTTTSTWYWUQKGA?ADECEHJLNNMMMNOOOOPPQRRRXejdRLQXhypN:??==?@@AABBCDCCGLMLHECBABCCLRNIGHR`\PHFFFEFFFFFGFFFGDGQ[\RKMNNPONOONNOONNMMNNONNLLNRUWSOHDBFEEEFEDEEDDCCBBA@BDDDDFGEDDDDCDEDDCCA@FLNMLLGA>>=???><<;;=?AEEEEEDFGDB=>@@BBCC?<<::;:977:?=?=>?>?@@HOaea\`deedP;6:;=<9;<<=>DOEGEBIQVXXPVcSAFGC?<;8?KK??DEDC=:79@@:997999:::;;;;:9:;;<>>>@BBB@?@@@CGIGEA?@CC@?@><;85:5?>>AEECCCEEEDHUcZJE?>><==<<<;:96667::>BBCEFFJF>:::=AC@;6567988989;;975321/.-14457738JQJOVY]_R=>=>=:9==8688876532210111246741587687540/0388:-4`[Ojo;Mm~lF:9=JJBA?830/25/HB0/24417EKA56eh67976?S^M:6:GQJ<16;8320004C@30..038:4/.04546@IE<;=;;>BBA<65;=IUXVVSMJJHIHEFFGKUgslZJ?:>B?>=61/.0-,176,5DKNYflhWLQK:123UX\XQOQSSRW__]\YXXXXWSS[a^\ac^WRRRQQUYWUX[YXZ\_cdccdfed`][ZZZYXWVUSRQQQQQPQRRTVWY[^ZVVXXWX[\]^__^]\]^\WSTTTTSSSSTWYYYYXWWWWXWTQPSXY[\]]][YZ\]]]^^^[XXXYXWWY\_`b_UOORSUYYV_ouofigYVTO]pmow|s[QTTUUUUUUUTSSUUTSRSUUUVTTUWTRRT[a]\bZ]}zrnqw|~xsuy|{wogfnjdhlqporpmmlmomie`^l{}~zs{toq|m_ehowvvuadfifite`dfflpjdaT^x}{{zyxuqopskjpx|dUVY^hY\Z\]^_dyymtkYZXQNVac`]\^ga_`^[[]_^]][YXX\_`aa^bg[gb__^^aipuyphppd\USUQNLKJJDCGIHGFKRSSRPNLKKKJLMESrihb\PJB>ABOgvlUYunJ=DIMG@XMH[IHSOHDDB?>??????@B=BL8AprZMHGFFGGADdpNKZŀ>?IHDDFFGGDFTUJJJ?RsXHRQUVVUSPJLA7=>@KQ^aaYOJIKMSOKRT]mteSKKLKIHHKKJJIGEEDCBEGCKf~{mcfr~dORTPLJJJKMOPQQQPNNOOPPOONNLJIIIIHHGIHGLZ[OMLJFGJKTk\:;EFDIRRKMPPOLJIIIJJHNZ_ZRQRPOQSUTSQRRQQRQRU[`a\SOMJHFEFEGIIKLMMLMMMLMOOPPOMOZgcTU_ejr{|gH=@>>>>>????ABBACGKMLGECBBBBN[]YTPMOVTJFFFFEFFFFFFFEFFCHQYRKMMNPONOONNMMLNNNOOQPRNNOORSKIEDEFEEFFEEDEDDDCCBDFEEDDDFGEDDCCCEDDDDEEIPQNMLLE<<=>?@A@>===<=ACDDDDCFHHDC@=@ACEEB?<;::85479=@>====>@>FcypgaY[cieO;79;<<<;:;:>ELTOMJFFMTZVPV\FFFDCB=7:?@<;ACDC>56AHF<99789:::::;:::9:;;<>>>>?@@??AADJKIEA>>ABA@??><:75989GQdjQB;67878=EC;=@85876555555665556889:;;::;<<97545533443333455443234455532221111222233222221222212223323427?;10479:999:;;:;;::9;<<;<<:9:97666653321245:<=>AAAABDDEECCCCDDFG>C\ndOD?>><;:9:864456;:9CHHGFHHFB::@EC>=;;98787788999862000/-/35457855CRRTYZWLCFIHD@?BC@701223245444345455444455667537<<<987-:gzK/:CDC<6578:<;98876434223466:>ABCDEA98=?;85447:;75776777643787764468::99;;;<<<=>><:8777863/..0322223332329O\H,379B=,)0,3;->WRwϐmUO>9BLKFB=940/022+F{n|IFMGORIFG@Kx]U]NCD@BSaWF@::KN?QX;06866:86<:8DHJGBBA;530-/25636:86653/)+6;7::?744333,1840.00365301237@DGLG;?LMG>;@FB95A?8FULAAAAEIIDZŽi94:9:=>@?>AIPQMC=:88764369;;;;=?>;:@?42@OQJEBCT\Y[\PFIPPHC><@CDCCCDEA=?@BCA>?A=>GE8@W[NGIHHIIFBUxv\JW[>>?@@AAACGLNLHEDBABN^dcb`ZRPSMHEFFFFFFFFFEDFFEDHPPMMLLNNMONNMLKLLMNOOOQPPNOOOMEC@CEFEFFFEEEDDDDCCBCEEDDCDFFEDDDEEEDCEINOSTQNMMLA<=>?@BCB@?==;;@EEEFFFEEEEFCA@@AACDA=:;@AB?;::;;<=>>Gln\\kdY`fbJ89:9:;:::::;>;JTNKIIHJPSPOWEBACEG>8;A;:9?CDB?=?A@@@><=;88679724>oqP?4984459?A@;33:75555444554434689999:::886422332222212443344223445553333212222223221332122222222333446=A<779=?AA?=;;;;;:8789:;;<<:999744434444335678::<<;;;=BDECDBBB=CSOCB^|wgZK?>A@@AA?>>ADF@79<>AFGGGD??@C?>?=<;978887887773..//.0565568878=ISXYSG@AGIECCCD@4-.122224444445555555445667877>>=<955665544566667532286:IjoF3/DukZL9,/..@@^ЯnY;CHNHA=96100044.37;=3/ZsYHEBBIc}coXE>=>GUZWM@K]K9HG12>=:89985336>@?7*/3/8OV^]VOHH>?DFJG<5346EWXEDC@;941220-/157776676589512227<;:<>B[g<6556:><88DE66HSRG<9@MTUWTJABKMJG@==;>A@@@DHBAGLPSWhzvprwrhhnhNHOI><:5/.211RlWGMPUZ[TI?89;8655RRTZ`_UPRTSRSUWUTSRSUUTRTWXVY_baYRQQQTVUSSUUUWYZ[]_``acda]ZXWVVTTTTSRRRSTVXY[]]^^^_bb^[[[\\[\]]^___^\YWVVUTUUTRSUVTVXZ\\[\ZWVXZYVUTTX\^]]]^[XWWUTUX[[VSUVUTUWZ[]cbZTQQQQQPNOQQQ_jddotnfdfgrjPTUUVUUUUUTSRTTTUTRSTRPPQX\USZ`dlqmqxuyxtpjcgtxihkefllffqz|~xtnlopot{|stuonmo{pfsvtulbchjovvudhqvy~n`bcgnikpntz{qlsmntustor~~}iR[be`d`___^[d}z}{eWVSRS^nifjlihdba_]_bba`\YZYX[bed^p^e_acedemrpqurniYOLSPJS[biv~u]NLJIMQSTRPNMLJJKLMORP_slrlO>DNEDFB<47@EIO_`TH??CDHCQ\D??=AGD:AQQIFIJJIHHDLlzeMӎJJFDDEFFFGFIHTgbWOUiWHQRUPIFECBA9OѵYULGJLLNWRNVZfqtpiciqcNHJHHIIJJHGECDEFDDEC?Phmwvf^apk\][WTTWWQKJJJJJKKJKMNOPPQQPOMKIJJJJIGHHJJKMNLMNMOTF:X~^DJNLQUVVRLJLNQNGHUYNHMOOONNNNOONNPPOOONMKLORX]\XRIHIIJJIIIIJLLIFGGGKLKLNNKP\dYHKUblnjf^NB@@??????AAAAAAACINOJGFDABKX_`cbdd_WOJGGFFEEEFFEEEDFFDEIMNNNMMMNNMLKKKLMMNNNMMLNNNNMKGEACDDFFFFEEEDCCDDCCCDDDCDEHHFDEFFGDDCGNUSTSQNLJE>=?@@ACDDA><;;:>FFEFFFDDDDEED?>>>??><:::=CFNPPJ;99>A?@EKRV^ddb[_aVB69;::998:98985=@CGHGGD?=>?=?B><::98877988807hiF38:8763;EB9.28655444433333113689989:95333222211222014433332112344433211124785311122111222333333325;@DEDCCEGKNNKIC>>>:76557777799987543210124535677889740049;==@BDF>;IMNKLhxwsrbY\WNPOONJIJHC;456:=?DGFE=7:<8:;<;:<<98776753342462Q}f7/^|`PH<1)3`ŬoK78AJD>;7504:5//3//...!QiJEHIB1/AUueOB<::AKVbjeU=6;;7=F?88977:;::CIHKB7>D8:LTMQSXrY9JWSG941.-A\hM@937:865651303898785578860//--3:HK=/.12//5AKHFF>98:;97<>>C:230+06<@?979;?FC7>=89??99955:;659:96664542AcrdO>8989:2D[OEFD<8@LVƶ¬l;::<<7579;=>?>>@?81022467:>;57@A<::@@?KYYPE;>FIPWPKJD@FLLJA=BGHGGGHJMNDCVc\SONJEEFHKLIRclopmfahy|ZDLK?HND;>FFHTOBFH@@FG@=>:57;;87TSRSW]^VQSSRRSTTTTQRSTSQRTTTTY_b_WSSRQQQRSUVVVUUUWYZZZ\`a_[YWVUTSSTTRRTTVXZ\]]^```acdb_\\\[Y[\\^^^__^[TPRSSTUTRTWVTUVVWXXVSQQSSSUXZ]\YYXVVVTRRSSSSV\^WSTTTSSSUWZadb[WWTSSQPRSSRR\\T^ngSSUNZYOWUVUUUUVTSRQSVXXWTSSSQQX^YQZiifibowt~upnlmv{q__foonqlcbluw{}|yjeopr}|xzuuxspllx}~qabmogdhfdejrxysyyimtqqv{``eekjnrqvyysmicfiqsnmq|tgVXe|}bccbbcca_ahtqsudVWUUXcqjfpxshdc`_```aba^[[ZYZcfffnلbrgecdecfmqj~yZHNV[elsz{iYTQOLNUUTTQNMLIJMKHGHIRgowuR?@LPGDFC<;9:C@AAIMF@?@@@AB@=>@>?FDDZ[FAHKLLJHHDDd|fcVIQBFEFFFFFFGRdxufd`SIGGFDBBBCA?7Vx^hcTNKLLPOOVRUn|yxyurvt]HGHIIIHGFFECCEEDBBDCIXcsyiadzsSLSWWWWVXYVRNLKKJJJJJKLMMORRPPOMKKKKKKIIIJKKKKKKJHJMAABADEEEB?<;;;=FHFDDDDDDDDEE@=<==<<::988:=ABKW]aTGHHMPOO`t[SZ[aVD:99::9:9:986779@A@?==?DHHFEB>=>>>AB=;9999877887784J`F346;:848>A<432434443312233235679989853212222222221222344333101222322111113674211122111222444332107ADFFGFGIKMNLLLJEDE>5221344456565443310..023356778776533332348@FLMLLNOOIPmsr~}f[OGGHIIHGGIIE;98634=CII;4:>??>><:88866652.,+++-38;<::88:<;::@R]M>@DDEGGF?77;<82235344223355443344356666668::987651A~jM=8:?9322333346898832333444578=CEEE?9?CEC?:<<8:88776322141:953216<61148:766/0`IKLLC80',N\PPI=;:6:I\cP>85234:B@=KSKBFRQ^[JO\M21:8Sffu<@UPC;830/,=blP7-.2223663--65746>906986430-7C98AIH?O`jbH9;76;<<91./+.-'$0FMF@;:CQXQB=<;A=542.28=DJG?8;@KD12006=;55888;<45;CHE?<<:>735:>=;SRQQOU__XTSTUVTTTTSRRRQOORSSSUX\_\USSPOQQQTVWUTSRSTUUUUW[][YXWUTSSTTTRSTUWZ\]^_aabdefgeb`_[WVVVVTTUTUUSOPRRSTRSUWWVUUTTTTRPPQSSUWWXZYWVRPPQPPQRSUVX[_`\VTUSSSTTV\ab`]XSSTQQTRQRRPOKKQSNPZ]broSSWUTTUTTTTSSUXXYZXVUTV]`ed\`stjh^l~ruotwwymXZcntvnfiorsu{}|ptxnp|ytwvvztsplq~|tqkeirnjkjgfeir{ztz}szzmtqdffhjjmqtustqa^gijrsplp|wj^\Uazdkea_`cdcdeeb_cgmcWZX]_mvhnvxwlebacdb```_^][[Z\ccm|n{^tvogdffaqǠ}cfjlimszsXTYWUOQTTSTSRPNLKNMJIHGHZjvbAIHOODABIE:AX]M?@ONBBCE?X_BAB?IMFA@@??AA?=?A?=CITVC:CGGJLKGHEFXaHds?KIHGFFFFFGEKdp|kaTHCA@BCDDD@?@B;13SocUQOMKILJAA\w{xwyvqtvbLHHJJIGEEEDBBDDDCBCEJTasoe]wuLDKMORWYWYZZWSMKJIJJJJIJKKMORRQPNLLLLLLKIIJJJJIIIIGILO[XXTJOORUURLGHONLb~iOMLNONMMMNNNOOONONMLLLLKKJIIIHHIJJJJJJJJJIIIIHGIKLLKLLLLLS`WPLEBCFTdcWHAA???@ABBCCA@?>>@EGHJJGA=MRKNUTRV`ii\NJGEEEDEEEDEEDDDFGHKMNNNNNNMLLKKMMLLMLLMLLMMMNMJIFDCDFFGGFEDDDDCDDDDDCDEGIJJHFEEDDCCCFKOQQPOLI@AGGCCGJIHFA=<;;<>EHGFEDDCCCDCB>=<==;9::::==>;887ANdo]PKMPOXg^VY[VE8;>:::;;;;:98:<;=CKONKJJKMLHHJEB@@@C=?EHGEB?=<=>AA@<<;;:::89989882:PWC40598768;74333565311231//0003435667655668764568;BEHKOQSSRMLhv]NA?EJHIIHGHJJKMIC<302:@FJD;;>>?>><;:9866650-+,-,1:??=::8899998@TS@=BDDFFE@:34=CDB>4222321334422333344466666898889633B]\G.('4?>6223333225898853455444678A<657755786458866665556531111,$$-8?@?@@CGIIC@BAEIFC?<879<<:::73343427uwI8HE1JzyX?7<><<@BB90/325DTVNC?GF@CPNB@LGFOLGGE9/5?ITdj96HHBA9-,-'*EkX212304864:A60/205D@25:87672.NtX:M^Q<8?99>???>?@@;DOWK;LWMGIHDEHGJP@>ECPJJHHGGHIJAZ}x{urdRJEDDDCCBA@?=:==>LTSQQPLLKD@JeusrrsqnvlSIIHJJHGDCCCCCEDCBEFIMS_z~meqvCDPNKMPUXZZXXWSMKIIIIIIHIIKMOPPPOMLLLLLLLJHIJJIIIHHGGGOUREPzZ]dOLPRQPQPGHMRWZQKGIMNMLLLMMNNNNMNMLLKKKJJKLLMMMMKKKKJJJJIIHIHFEHKLLLKLLLKV`TMLKID>;Q`ZNCA@??@ABBAAA@>=>@CEEBAEGIOOIEJNMKPZcbWLFDCCCDEDDEDDDDEEFIMPNNNNNMLKJJMNMMMLLMLLMMMNMIHFDBDGFFFEDDDCCCDDDDDDCEHJKJHFDDAAABAEIMOONMKEAHMGCEJMMMHA;;;<=BDGGFFEDCDCBB?<<=<;;;:;>@A?;9:::86>@CHQPMLNNOMIDBBBA@?A8BNF8:BFFFFGFHKLJB;8779999::::::9:;=>?ABA?>=@EHEB@==<=@AA?<<<;::::99899997@FA732578754=@;30244310/023122457887753356677645432223444333432222343213111212445432110/122247;?@@BEFCCEFGHIHIJHGGGHGHKJKJF?86579842221/01232565678766567789:=?BDCDCEFHNQPN@I`ZMC??EHGGIJHHIIILPM>558986AIB=>>?>=<:88755640-+,001:><;;99988888?KF<>BDDFFA;669>CGJC:661/221133223333444556668889;967GK0,3./-2;<4223333336999864455434589;ADEDA<===::;=>=<:64454/:5Fw^3.3<@;FT>)Fu~h0(7=:30244><1.22236:<:875554326>/<nRQE?<61../4AG>9=;;@JI@FJ=455;HKQUJDEBF>3BN?/2>EA<.+,./,*BJ.*4737;;=V}[30..1=B>9:757;57cPN`SC7;=9:><6,2=@?3////>SbW8T_h^RSVQ=46846;DIFB=72011/4:A=;;54<>8:<:=?=::::7/;gmXPNYss[G72EZTKKD8585?ͲW2@EDFHC:445228;721572/2:?AA912349?EJROEAB@FZihr|kPLQMLK=2=LS_jknsmXIJMNE63@JG@<<>?@?AED@FS`daab_afN:Vk_UOFDHKD7671-8ILA757545:=SMACEFHJG>=@?>??>>???ANSIEVjooorkXJHGHM=X[HLMMLLLMMMNNNMMMLLKKJJIKOPQPNNNLLKJJJHIIIIIIGGKLLKJKLKKUYPLLMKE@BDRZTF@A@@@@ABAAA@?=>@ACA>?>DNRLGEEIJGHNU[YLDCCCCDDDDDDDDDEEEGLQPNNNNMMLLLMNONMLLLLKKLLLLJIFDCDGFFFDDCCBCCCCDDDDBDFIIIGECCABAA?BIMNOMKIFJKKGDFJNNNJD;:<=?FFHGGGFEEDBA?:9<<;99;;=ABA><;=<:8764;TaYPMV\ZYYJ7:>>==;;<=<<<<>?@ACEEGLMNMOQNIEDCBA@?=5?J?6:CFGFGIIJLMIA;8678999:::::99:;<=>ACB@??BFE?>>==<=@B@?<<<::9::88899:961/38855689822;=5/342220.///11245554555789::8875554233455433454445555887420.-.///001244578:=@CGMQRQLIHDCEGGGGGHIHGFEFFHJKLNMIC>=<=<96543233446677889666568:<;<:999999:<==>BEDCC?7468:AFA8=@<83321112222224444554556778<:6DX<-4212127842233333369::9864455579;::=@EF<46;;9765567543325:987678863.-1,+9BDCDGIKMNNK?;?AEC;78<>>>956:8434234/4RTLNB<41:87>;Frd0276654434763684224:?>:6566432124.28FKDFI=1...0EXI::61:OPCEF>7558;8=C@8683-*+20--178:<=AJF?4.**,--8FC7---/47/.6646712:BY~]8.-,,3>FC@;37?;Ci~[??DC407<236987;>7-*,222124:=<9835;=758>BJJJ^sK;7;GBISSL>569:::::;=>BFGEFLU]fhb[[dP5:@FH;6@KH90236:<60,*-25519bzxOPQQRRRPQVYXWXXWVWWWWWWWRMMQUUUUTUXVTTVUTRRSSROMNPRRSTVVTTTTUTTTTTUUVXXYX]_behiiiijjjijllkiggc\XXWUVWWTRSTTTTSTUVVVUTTTSTTSSTTTVXXXZYYZ\\_eiiijouwwusi[ah[NORQQQSSPMT_d`\YVTVXUSRQQQQTWYWQNZlrzug^VWVVWWWWXYYZ[^`]YTRTSPVailhhijrxwzuqos|{{uTZ`_^ZX[juokmptwtjc[ax|vy{wvvwxxvutuvomnllmkjjifdddft~{z~{xvwkvvtvxz|zqeaehjiijmmfdifdpw}{trwpr|n[TTdro]\acqxa[_gpmcfnph\atldimrt}dfpkfda^ckjb]]]_dhh[kсfposqljjif|~tn~pYXXVSRRRSTSRQPKJRWTSTSTXKtRTTJGPVG>nsR[ooVA@[[9?@???=>MUOJLal{wRHHKFLj;=>>;?JMJHIFIAOouomkjnptqYIJGFILHFEEEFCA@CTcfXMPQfod}OCOKJKKKKLNV\ZXVVTPLKLLJIIJJKKMNNNMNNOONNMMJGHIIHHHGHHGFGFHKIJOjycSOPOPPNJFFDHPLGFHLLLLLLLMNNMNLLLLKJJIIILOPNNLJLLLLKIIIIIIIKPPJJLLJJJKKKMMMMKLLEBD@DTWLA?@@AAAAAA@@?>>@@AAA>>CNQKGCCGHFFHOTSLFDCCBCDDCDDDDDEEDEHMPONNMMMLLLNOONMLKJKKLJJKLJIFDEEEEFFDDBBBBCBBBDDBACEGGFDDDCBCB@?@HONOMIGHKKKGDFIMNOLF=9AA@?<:8999::719DLV`f^W[K<;<<=>=;4>G>8=DGGHHJIIJJG@:8779999:::9999:;;<=@DC??CFF@99<>>;3141-*---5=JA;;875434456677776665443335544444566666431///.059AHJMOPU\ba\VQMNSTUSRSMHECCCEGGGGGGGGGFFFFHIIJKKJGEC@??=;:8766554667788966677:>BCCBABCBCCCCA=6;FHJFBCBA>?BEGGIIHHIIIGFD?8223714A>::::;:98654353.,069739AA==<:99;:9::9:=>DGEA>:75579=B=38<=<63321222122234344445456558D^X8/5513233562233333336::99764567:=@?<::=CF:.16;9434555555208@>;989:<;9769:535;==960/353466454(Mz^HB;<<87;51\`<26467642147:=?@92/0587645566531.00+3;BJPH900/.6T\B<<=LTM@62224455543665551./-...-01479:;;9;=90..+)/=13BI@81.8GYgG6.*-,-5@FHIE>=A>8?B>70-.2237>@@@83>ND:YlM6:>;40.04=KF1+3:74?>=;:;>;>ST]mWEHGIJ>8<87QbB(105,,ƽɑFAKDBABCA;889:?>75BDEGJMTbh`Z[YJ=58FI>?NVH4./3?ME2**,045401J}QQQQRRRQNOUWWWWWVUWZZZ]]WQPQTUUTTUWWWUVWUSSSSSPNOPQTSSTUUUTTUVUUUTTUUUUVUY^adiiiihgillllkhc_adb\XVTSSSSSSRRRSSSSUVUUTSSSTTTTTTTVXWWYXYZ[\\^^]^dnttstvraZfhWNOQSWWVSOQTX_c`[WSRRQQPOOORTX_[TUYar{{nZUWWWWWWYYYYZ[\][VSRTWUT]eghiedouswyopuqxwmzvyu_ZZcocZfme__\[\ejd`\_fu{zzzyxxuyzupnomkjjihhgfddhq{|vuvwyvot}vuvy{~{tokhgijhgge\Zbjkkl{tp|wfWRTzqb[_o`fqXW_figcm}}zggrmvg{rupgcbZa}jZ_]]acd`u؋cw}ujejllioeUWSPOPPPPQRRSRRSOMV^^\YWSZIgZMPJDTiZBdxur\I<FJLKIF?<<=?@??=;BPJHNUjhXJHPLMC\eFEIHHKKKJIIKKJJG[|{ywvx{rWUVOJFCBBDFDCHJEDHJIHFGGFHHOUTUX]a^QIHFNSMFEFFED>ARn|hUOORQlýegx^GMMKMKIJJJJPWXVUUSRQNKKIJJKLKLMMLLLLMONNNMMJGHHHHHGGGGGHHGCFHJN^imkYOPNNONKHGJLMMNLJKLLLLLMMNMMMLLLKKJIIKLLMMKKKIJJKKJHHGHHHHKRWRLKKKJJLJJLMMMKLKGCFE@FUWB>??@@AA@?ADINNGBBEHHFEILNMJFDECBCCCCDDDCDEEDFIMOMLLMLKLLNOONLKKKLMLKKKKKHECFEDFFEDCBBBCBBBBCCA@BEGGEDCCCCBB@>?FMNNLJGHIJIFDFKOPPNH?:=AELKHGGGGGGGA=KSJE>:9>CC@>??<977888:;;:?9?BEIJEBBCEGGF@89F?@CDGHIJKIHFEB?:9889::::9:::88:;::><=ACA=;;;:;;;::98999;<<878886669957/<4/3-+9JJYfc\:<>975433344455566655454444554444677751-//19IU_jnqv}~~si`ZZZXVUSPPOIC@AABDDEGGGGGFFGGFEFFFGIIFFEDCCA?@?>=<:9887556777775569;9;A@>BCA>>AEGHHHHHHHJJJIE;34469=BB=<=<;;;:9765452./48:73:?>><;::::::99;<=@FGB>;:8658:;=7358<744321221222344455444445545APB.234234334323333233568998754679;>AB=99;@C>77533335543567525>BA@=;:9899:>EHGEDEILLICA=:88:=962.3894/./13668?@=7402Sp_HFA>;8:KX_chpmgS:37667687423771+../00/:IIDHHEED?6-*('+./399;<=8213@F44E>9;=98725=;3?LB0/311:?:510/-/2/---/3669<:7423223312599<=<<;::86AHJh\IHCDTPE@BDK[V7-3162(xżſsJRI<:==<86788:<>B<1.14312455652369:::98=L\bZZuɖ85ABFCGH?BT]\]Q=5;CEDA97;;867889;:;?ADHHIU]]\[[__YVRHDEEHIE@53M_B/51-9@844.(VQQQQQQQQQRTVWWWVVTTWY[][XVSRSTTTTUVWWWWWVTSTSTSRSTTUTUUUTUTTUWWWVUTUUUTTUV[`acdeca_bfhfc_[WUX`c_ZWUTSPPSSQQSTSRQRTTSSRSTTSSUUTTVWWXXX[[[\]]]^`cgjkmquuma^feWLNSXZ]]VOKLT\bgg^SLMMMMMLOQTY\[UR\p{kUUVVXXXYZWW[VQRRONTWYXRPWafebenppoq}r{xkrkorkpnaesjYX\\ZX]dda_ZZx|{zwwwy|wwmvpolgeghhhgfedgq~sjox}{ttuuvwwvtvz}~~{sjglqrsstz{hexqur^QQjjizYWkrOUadceeddqqoȥyzrtmhbajrmc`a__`cdW~ߞjuumhdgimwsmaj}zoTTQOMNOOPPQQRRRQQTWZ]\YUVL\c>FCDQTRJDmxx`IBAFfZ9@GKLKKJF@?ACDDCE@DE;IdoSAFPMLLMIIEAHIJIHIIHHHHIIIHRfy{{zy{}|d\cYLJMNNMMKJKJJHHHIHFGHHEDGHFEGGHIIIEBOTKHFEFDEPkz`RPV\Uhpdq]JMRKIMMKKKIGKQTUTTQRWVPMJIJLMNNMLJGHJLMMNNMNJIHHHHHGGGGGHJLKHIJNTWZ\VQPMMMLJJIJJKKLKLKLLLLLMMNMMLLLKKJIGJPPMLKKKJIIIIJJIGGGHIIMOWXOIIIGHKJJMNLMKKJJIJIEALZP@@AAABBA@?>>?@@@????ABAJQOLJIJKHEGHILLHFEECAABCCDCCDEEEEEHLMKKKJKKLMOOMMKKKLMLLMMMMIFGHDCFFDCCBBBCC@@AAA@A@DGFDBBABA@?>=>CKMNLJGGHIHFCFNTUSPJ?:>EGHFEEEEFGFF?A^sphYRKID?=??>:534679:;<=;:>MQRdXO=@DILKMORUWVUOHEEEFFGHHE?GPMPLB;:::9;;;;:::::99985;ACC?>EHC<:;<<<<<>@?<9:::;;;;998899:;<97676433445965@H8LaypD9<:85555534455666665566555455444222/.3:DT^iry~|{}vjcZWQNPQQOLIFBDGB;=AABDDDEFEEEEEEEEEFFFFGGFDCAABAABBAA@>;::976656767778<@BBCCCEDDDCCCCCB?=<:;=>CEC>=BGIJHGHHFGJLNNH;5568>B@===<::::;:7545422458;839==><<:::;:;:9;=@EHG>789755579842/3743432122112333444443443444446:5243346542/3543322466799764567889:<;969AA>>>=57<;<:73257:849BIHC>:99;=AEGIHGJLLIE>67:97643340.1760,/6;===>@@=86513arVLHA==RvpI9>>=<:<964656994111469854458989;97434338:98956842110/4EOUT?>HNF4/45676310/./022210/.-,05896/,-/6AJVWG4-2DI;5932LfbI?=G\j_MIC;:8-/154331/8GJCAAADBAA;102358=961.7C@10CN@1365760.01//132/--.59516::4022233135559<<==<;98<=HXNZ^OPd`Z[]efWB245/32&h»˰ZMS@45:;711577:;<@=2,-135654466323358987=MX[Z[q`3EGDCA@=:DRSND:7788876567655459;87:>>@ACJQWXW_jg^TD::::=ELL?:R]:.864@DLHLo{{qINhS;CILNNLMLLKKLMMMLHC??^`JDHLMJFDGNIFGGHGGGFDFIGFGHFEH_vvw{z{}~rcg[KLMNNMMLJIJIHHIIHFFIJGFIIEEECDGIHC<=EIGFEFBXlTNO[eZ_ŭipfLLPNLKLMMLLKIJLOTUTSRWXVRLHIKLMNMLJBCIIILMMNNJIIGGHHFGHGGHGHLLJIJLQTRRRONMMLKJIJIJJKLLKKLLLMMLLLKKKJJKJHDM]YQPOLLLLKJIHHHGGGGJOPTZZQIFGGGJJIKLLLJJJJJKKJFHSXJA@AABBA@?>>@@@@?>>>??=CSYZ__QNPLGGIJMKHDCCCBACCDDDDDEEDCEJLKLLLMKLOONNMMMLMMMOOMMMLKKJCBFFCCBBBCCC@@AA@AA@DGEDBBA@@?>=<?>8546:;<;=<<<:935>H]`MEMRVVTSMGKOSRKHGGGGFECBBEKNQH979@GFEDB?>AFIIEEGHFFHFC???=;;;<:;;;;;:::;;97708?@@=@FC=9;::;;<;<>=;99:::;;;:888899::98756535587CH9MbU}V;788655555544555556655544345554222024;Nbo{yx~q]OLKMPTPHA=>;;98;@A@AABCBCDDDDDFEDEFEFFFFEEEDCA@ACEGGGEC@><<;:;:7899<<>>ACDCCCDFEDEBA@ABBBA<88:<@DDA@CGKKGFGGGGIKNPG>;889=>847779::;<:7666547979;848=<=<<<;;;;<<:=@CFD@:668755669<985122332221211222333443333333334:EE=43632549C@754322455678754457789;;;847AA99;=;9:;=??@@<67:9=GJGD?=@BCA@EIMLIIIE=5100556868;955895007=@AB??<8766663H]MKMMduR<6104688656744:<621/./155689::;;<:743233=?>@EC63557;ACC<9:9974-)/2028<@@8668@<505FN?:>>85334420/010/0034102697662/0133147;===>>=<:89?K]]SFNluquy|mD./3/)13&`Ƚ˽˔J>A8469=<2.489<<>>>8203466321/../1247;:8CV^ZVXhƞE>JGD=::7;:;@EIMOQTYUNG:34457;CKKJLL5/47;=;73059.KRSTSSRRRRSSRRTTRQVXWUUTSTUSSSSSSSRRSSUVUUWYYYYZ\[[ZYYZZYWVVUVWVVVUUUUVVVVXWWZZVSQQPPPQRRRPNNOQUZZYYXUSPPQQQSTTTSQQQQQPPQNNKJLOQRUY[[[\^]\][VTVTU_insuvzuhbghdWNOU\ac^VPLOXdlkhhh`UNLLMNNPU]a\Zcouv~~iYVUTWZ]c\QTV]xkXccWWZYTRWZ]`aahr||{sdZZeg]Z``^^^^cgdddn}tot{xy}mquswxrmiggggfedmsw}xqnklrvusrrtxxwwutuvyzz|}simgeilkbZYq{Yp_rgy|jiolbchjgitvps˵|tsfbdb`dfchkbbdf_\irhffeibip^\``_YSRPIBGAGbhbZVSPOOOMNOPRRRRRRQPPQOJG:tDEGCEEEEJK[veiN;FJLONMMMNOSRONMMNMDOwrL?DJNLKKKECHIHGHGHLMOLLSTTUPKGARnvtvxyzc^eUNMNNMNMKLKIHHHHHGFDEGGHIFFFFHKKGAA@CGEEEFDgq\OLOU]ZXrsnPMOOOMNNNNMMMKJKLORRTUVWXVRLIKKKKKJIAAIJFGIJLLKIIGGHGGGHHGHD=>HKJHJOSSQQONMMLLJJKIKLKLKKKLLMMMLKJIHIIIJIGDO]ZUUTRQQPMJHGGGHIIHMSTW[YSJFHHHIIIIJLKJKKJIIJKJIMWPHDBBBAAA@>>@AA@>>?>===AOUWgo\NOOMKJKLPMFBBDCCBCDDDDEEEDDEIKKNNNNMNPPNNNMMLMMMOOONMMLKJDACDCBAABCCBBBA@A@@BDECBBBBA@?>=;=AGJLKIHGGGFEDGRZYVUOC>KOLNKIHFFGFHFBIbm`ND?7568;<>>:89>@@@?@>@A;?8575=KeolbQGEDDGGGMSLJIIJHJOVUMEEOSK9;;=DFDEDB@BDFDCEGGFEGE@?<;<<;;<::;;<;<;:;=:3856>>>@DH=79;:8:;<=<<<;8789::;:99888889:9876668:=A7D[JB?c}{vPG@)83143333234354344444433335553223<=>>?>;:<<>BCCCA=::;>ADDEEFIIHGHHFFFFHFB=>;954444469;;<<;96677799;;<;:67:<<<<<<;;<<==?DDA9566566446568:@>75323212222111133333344333344348EB53//84GfbC67431122445543224567878:769AB=<=@?:659>?HTQC:76;FJECA?BEB?>EMLF?<:73.-00159448;=?@A><;97555654Ifle[޶`FGC74;;53778832;>8432004756::979::;;832238<8+,?J?4310/14IhoW@425658HX^N81459<98;=??;85466:;652/.-,.3GO>/04/--/,-Ty{wphLNH?<72/024324970*1A@8421025:>A?;:62/--/1025:BC@?98=;;=8:KPIGE=:>?;860,,./000/-.11235775447844:>><=>==<<;95:UT@:8>hy[0*122.25(Iķs=-2:68;@D=315:==<71279985057558:99@FB<968@DAIULBA>;514638?BHMJE;/.019;766105,0UUUUSSSRQSUTRRRPPQSTSUVSQSTSSSSSRRRRSSSUUUXYYYZ[[ZY[\]]YVUVUVVVVVUUTUVVVVWWXYYWSQPOOOOOPPPONNOPSUVWVUURPQQQQSTSRQQQQQPNOOMJKJILPUZ]]\^__\ZYTQQOOSYfswvutphgige]POY`df`[Z\_dlmhejaSPNLLMNMMS\b^\dimtufWVWVYY\jjXU\an}xfs|_U_f\OTTTVZ^TNbu|{|ri_]cda__]\[Z[]cimrqwtxz}~rmqurty{xplkjmorkhrywjcfjnssnlqsposutqppqstuw{~{pdapc`hiigch`odUdlm_lldbqvqgk¥|~pricb`bfdV^jbcedfV{ktkjihngnvi\\gbSMNPQNSgvyu{rieQFMQONONMNLNTSQPNKJKKED7oIFGCBBCBDIShxzL;AJKLMMMNKLTWRONMMKUoxjUA>GHIKIKLLJHGFFGIGGQX]_ajnosvtpohoykhkij|eNYYOMOOOMMMKHGHHJKKJJNKGHIHGGGGILKEAEJGEEEEGHc}YHPQSRUTSsvoXSXSRRPOONMNNNLKKLKKLQUVVVWUQNKKJIIHIDCDLHDEGGHJJJHHHFGGGGGGF@@ABA??@?=;==?CDFJIHGGGFFEEMWZTQNFCIIOZVOIEGHHHDFY_PC=??>=@A@@??<9>BCBCCAEGEB?<78677>HWilYB=CFDJPXKKJJJHLNRZWONPRPGEC<=CDEEC?>?=@CFGFFFEF>99:;<;;;:;;;<;<=:;?<4786<>?CDE;78;:99;;==<;9766899999887888898677545655767=@6;GYy}FK[>,60042221222233234433333334442212Kq}gL=:97421368889975567;?@ABCCBABCDGGEDEFEDDEDCCCBCCCEFFFGGFC@>==?@AA?>@ABBCEDEECB@?=:7678:<>?@AA><<;>=<<<;86668:=======848;;;<<<;;;;=>ACA9/1545753344556>EB;4343222212211333333333333443335832;QRNytG3853211112233210024556688:9:?B@>>?B>:88<=BQZVK?95:CEDCBAB@ACGG@7334214569=BFJKOKC@<::9:;====;889::87668/alkQKIB?=;78<:76348<975322333465323469=<3/010.39CSmc8+0.0129GYcaWC776>Zo^;-053353369<=9555558=80-.-.001IX@6;40242*2juCCPH@=93/-2767::2+++-3;==;976762/0/)*5@@964333332232:DC=7>:57>A>:;?>968><5EM:0788SA+.0274346<_ŻW=14:9:=?EE=417:=CD90/.//128956=;3/.08BKD@XnuvmnϹh@DEFB:3159;;;=@<66:=<88;<967??:9>A?;8319A5.--/;=9:;7210/WVVVTSSTSSUUSRRPNNORUUVTQQRSSRRSRSTUUTTUUUVXXYYZYYY[ZYXVSSSTUTTTUUUVVWWWVVVXYZYVTQOOONMMNNOONNOQRRSSTUURPQQRSSQQRQPQPPNNONKLJGINSX[[\_`][YWWUSRQPO\qwrpqoljiimm`ST[^__^\]bhkmnkd\QKNNLLMNMLR\a]]bfkmcURUSUVWdme]emkp{gYgvfUSWUPknJtmiy|c_eggghfffc_`a^e{}uqyzqttuvphkv}{rllrxsdcvvnotwwxskgimkinsspnmoprrssuxuj[TbkdkikklklbwxSR[yw}lֽoc`cmog^X^cgcbic_bdec_hvppnlpezpeljgkbUPRRNWprib_SgmORSNMMKFKUTPLLLJGDBG6bSBDDAAAA>@GNUg~UYDHIGHJLMMLOUSONLL\onWLJBCKKJKKLNNMKKJJIIHHNV[aksx~zZ\[Y]g[ew`LRXQONNMLLKIGHHJMNMNT[OFJJJGDFIJJLGBDGFDCDCEId|iPPYZZXVRRlw]RXXVTSQOMMMMMMMLJJKIGJOSUUTRSPLJIIHIIIC?DD?ACCEIJJIHHHGGGFGGHHCDEFGHKMMMLLKJJJKKJJJJKKKKKKKKLLKIHGFEGKKLKKJJKLLKKLMMLJIIIHIJLOQRTVVYXNIIHHGGGHIIJJKKKIHIIHIKKLTRHC>@BBBA????BBBA@?=<;;>>A?EIJJHGGGFEEJTYQMJGGHGJOUTJFGHECDLWM=;=<;BCBAAAAAA><<;:;=?<:>I_phM@DHHPWOLJJJHIILRUSPPQSHFIE=?CEEEA<:3;DGGEEEC?<8==::;;;:;;<;<<=<<><9579==?D@:=;7::98:<<=<:8777887898788888877666523555453//3.1;YoHLr^63313532112222233233333322222333.3\}tR4.3345678::::644567556;<;>AAAA@@BCDCBCBBCCDCBABBCCDEFFEFGEDB@>=?@AA@?@ABAABCEE>7865311478:;9:<<<;:9:<=>@BDDCCDDDCAAC@=;;;;:99=<>CEC>===;86779=?>>==>:548:;;<<;;::;=@BC>2-44256532333237>@733676201134434433333223334444546A@>>?B@=:8;<=HTVSPMD<=DHFC@AA?;993387766=CCFLMMQRSPD;46;?@>>>=:414899988765Nsl^jfXQMME75:<989988;;987541//22210001248<8554511KhVa|L%./0247;=BHH@986@`gD,.0/.-147765654764239631103663@U@;?:46IK5@CB>;EXmyT?3*0<:00112357:97435:<:8:><88:?=8KB44889:Wb),//57310?ADE>43:;;=3*-0234469::?A=7448;=:;SfozvtȤZ?HJD>833588887<@>:8=@?CEA=>A<2,-/4>A@?@=8432WVUVUSTUSTVUSSSQONNPTVUUTRRSTUUUTUVVVVUUUUUWXXWVVUTSQQRSRRRSSTTTUUUVVXYYYXWWXYYZXTPOONMLKLMMMMOPOOOPSSSSRRSSSSQQRQPPOOPONOOMIFGLQSTTW[][YXVXXTQQRPQ^koqjdloiijkpj\SQUVVVZ__`cjqpqaIKPNNQSSRQT\a``dinmbVONMOVZ_e`aquvjddT\]Muɿwwrwejljloruusrl``vupy|novz{voihjqyxqmsylY[y{vrnkhghjknqqqqsuuttstrtxma`lxaillmnprnfmNWZu|~dɕQDZgoi[UX\gljpfY^_accijxrrpooojdhlppnaWTRP_ustzzkonWVSONMJJPVUOKMPQJEDJ;Sc;@DAAA@?>ADHJOczv`zXDEJIGHIIIKLNKFYl`MCIRJMNJLONNPQQPONMMMKJIIMXhqusTYYYWTc|jQNMRSRNKKJHHHGHJMQOKPQKFEFFFAAGJJNTJBGIFDDCA?Ed{mWM]qof^YUYqhRXYWVSQOOMMMMMMLLMJNPLIKOQRQPQPNJIIIIHPA:>D?>@ADGIJJHIIHGHFGGGECBABCEIKKNOLIIJIIJJKJKKKKKKKKKKKJIHHFDIKKLKMLLLLLMJHJJIIIIIHJLNPQRUUUVSKGFFFFFFGHIIJKKIHHIHHIJJKNUMG=688:;<<;A??=<:7=RbaXQKGGHIJLLOSQICACBBCCBDEGECDEEILLOPOOOQQOMMKIJJKMLLMLKKJJFCBBCDDDDDCCBBBAAAA??ABB??AACA@@@=>>>M_FKMJHGFECDHPSOKHGHHHIHIMKGD?>EMQL?=?@AA@A?@@AAA@?@AA@?>>=;;<<=><>@@?==>COfoZDBDKMSMJIHIJKKKJJJJIKE?CHD<;;:<<<;<<<<<:7:7@@@??FF?FB88:9:9;;<;:87878:889998888887665556376435534566:7.Adh;-244333323322222222132212222235519b~~h@,,4646999::88765466556896568:<<<>===;;=>?ABBAAA@BBCDDEEDDEEDC@>=>@@@@ABBBBBBCCB=2021134578877788996579:<>ABCBCECBB@?@><;:9::99;<>@AA@??=;988:<>@><<==:436:::;;<<<;<>@C?600431674333322445753369;:4014653345544322332443477CsytE+4713477742221026874348878;<:9;?@=<=>><:::<;@MRQSTPGDIJFA@@=99677:;56;=;9:977:;9888778;46PinYRWTYXSG=<:;998=B=;9857B?=940261,9FGABBDJXgou}whd_G10432026::75311124779;===???:8C>7:85=7/j~4)223651*)>E;BZn_+'--7?=>>>@??B@839=;<90/365548?>868:988<@?=>K]hpooïT?IIB<966763114?=88AGC?>;3/6?;,).5:=@CGDAHKGEB=:6;KOA9:;>@7/-/04775643210TUUUTTUUSTVSQPPQQOOPSUUUUTTUUVVWVVVVVWWWVTTUUUTSSPNLKLOQRRRRRSSTTTUVXXYZZZYYYZ[\\ZTQONMLKJKMMNPPOOOOPQQQRQRSSSSRRPOPPPPPOOPQJDFIMOOOQTXYXWWYYURRRRNP[glgcouhejmrsl`XVVZ]^_\^ciorxtXKQQQRSTTRRQXabdgkqneYRKIQVX\[_q}rrzpceh\ԝztmqzrr{xoqnmosusrumbt{zxvwtnmrs|wqttpkktyvuxj\[l|wqmkjihikmoppqrtwyxxxxw{o_p|egommonqvmb\SWYnzt~|nȋRUdmk[RV[`bctkX\\\]^^WrpvvwqsnurekjkoqlaWPP]rruu~|\LOXSNONNNNRVSMLMPQKGDI@Jp=@BB?????B?IPCES]pq[YPQPJDFIGEEGD@QQ?DLOQNQQLOSQNQTSRROMOQOMKHITdpsw{aQSVUWi|QFLMNSSNJHFFFGGHMPRPMF@EF?9>CPWNOVW_aOHKFEDB?9>CB@?=>>;L}vKNQMJHEDAADHMNKGFGFGGGEHKKF;8FPNF><>CLNOG?88=<;:;<=?@@??@>=:;<>=;<<<<<;8;FQLDCBLQQMF<6:::9:;;::87878:89999888898776544.10123354566666863781344445554422000001122332223357868Ww}`:/38843689887433478776659:644456789:86216BCCB@@A?>>=<<;;;<<;<==<<;==><;:9:<>??=<<;;:5/4:;;;;<>>=>>?=83024215643323234434434327>>635553346633322233443588GmxY=242,/46::854331/0477567;8567799;?>;99;<;;;9:79?DDDDBBA@=:;;:88998899516:>EJF=87<8633<649>DIGMQUSHGot>/:>DF=>D@<=B=36677642100///.:HGXmk\B3GNJ__?302687::0+++.5>A;26<8457755:;99::;B:;4386CQE66542MsXMDKUMD?:82--0568;=>;BIOTH53;;;KL9.../333798::6446;@?;8789:5/+'&''*+(,:FG@=DM`qqnh_]k}j<*154.29=;886521123567:?BB@>=;:7:?92==+IwX4<>:63301EbbXpcNi`&"8:;?>86:>>>?=<847<===7267468?A81245668=FHECCVkopjWSE;@>=:865324MTQOOOPPOSVQJIKIGGGDIDC|A<>B@>>>>>?KXVKC@J^o{qevXRXXJFEECB@?==GKKNPRPOQOOQQOQTTRRPNOPPOQKJPZkml{{fUPSR[m`IIHIMOPMIGEEEGGHMUUQKDDCAISTfrbT\W[]HKGECA>ATjfRIK[w~rmkmmmjTZUQQOOQQOQNV[QT]]WZ\YTVQMMNOQQOLKJJIHMccD>EFECBBCBBCEFHJJJIHGGGDCCCDEDDHMJGIIJLNNMLKKJJKJKKKKJJJIIKIDHJJKLMNLIKMMLIGIIIIIJLPTTUUTTTTQGHIHHGGFFEFGHJJJJKJIIIIJJJINTRIB53:7:88EhjepkaKGGB?=J^aTORSQIEEFEEKSTKCBBBBBACDCCBBCFIHINQPOPPPOMJIIKLLMLKLLKJKJFCBABCCDDDCCCBBBCCCBBBCA@GXG:?A?=?B>U}WMRMKIGECBBCLMLIECFHHGFGJMI>4:FIC;9>BFGJC;325=CFB@@@?>=<;:;<=?ABA@@@<:7@DC?F[_QJGGHIFFHIMNLKHECA@AABCJOMJH63436=CGFC?=>;:6>BHPRNIB>?=;<;;;<;;AKOLFCHQRSJEC:9:98:;::997788999998899998877644:7:>D@<9;987665664572335666655332001111112332223579;:3NwyT/-686346676653222478776668::6455546566547;?BBBBAABBBBBBCEEEEEFDCB?>?@???@BDEEDDDB@A@@;;:87689630-/4:BIJF@=737:>@;9>BBAA??????????>>><<<<;;:::9:=?@>=<<<<:9538<<<<>@>=?>:4342221244444431245433341/16?A<75332168303322224678::97GSE7146?H@8:9887668::4.1469840/113688:964579997555532334685568;;98755668<@<<>DIC:64.'(3FNSU@8?;4312;DD=8667789<><>>=<;=AA>ECOku4:JI@98986458;<>=84;71925=:8781+,25:O~k[VODIWPG?5440147:;>?@>=FQTL;57;>EA1*,--/138:86544666726@D;2121/-/99<@L^lgXTaokQ7011.068643320/01100018<=<==:45<@;3;?5=MGDG?842./Owp_hraQXL4?NTVWV@.4?=>CA:4456;<;967646;>8.,28:98:AGHFGCNhuwkyjWZE48<75679:5,/6;=CS`^RE<;>;325;II712/&0TL596/4>9./2.*))()*+,,SSUVTRSSQRSSPNOPONPRTSTTUVUWYYXXXXYZZZ\\YROQQPPPOOONMPRRSSSSRSTTSTUVWXYZ[[\\]]]^^^^ZSPONNNNMMPQQQQRRRRRRRQPQRRQOPQQRPOPOOOQUVRNKJLLMOQPQSVWXXYYWTSTTRPWgqokni^blnlkoqi^YZ]^agjlkjemfQMOSSSTVZ_abdefikllhgj_KES_UZmt{}|}~wpoty}mqyoqw{|yywpvupxxljllkmsyx{rquwvusrtuz|xsk^avvolrtqppsrponljiknoppppnlotutux{s^Wttx~tqonmnrwchT\WU\punx}v{mƉQgbNSSSTYXkiUZZZYZX]_O|d||u{ysnqsprvw|hQL`uxyymSb~d<>EMUROQPQOORQKEFHC@BCEJI@{D<>@@??>@AIROLHGHGGLSnc\TZaXD;AHGEEGKPQPQPSRNPQPQRQQSSSQQPOOOPSOMIMdbaw{bWWYVhyo]MLKIHHMMHHGECFGGIJLPOJJBKTe{~kV^^c՘OOJGECC@G[h`JGMO[efjlln{\WZSPNOQRRQQRXWPTaeaa^]V[VNLMOPPQPNKIIHJ_kR@DHIIHFECA??CFJJJJIHIGEDCCCCC@ELKIJJILNMLKJJJJJJKLKKKKKLM\LDHHIJLOQRNKMMLKIHHHGHJOTTTTTVUWVPHKKIIJKIFGGFHIHHIIIIHHIHHJIGPSIIF=>;8:9;Eps{NNWOKGIVYRORTRKHEDEDGMPMD@@BBBACEDBAABEKLKOQPOOQQPNMLLMOPMJJKKJIIHEBABBCCDEEEDDDCBCCCCCBCB>DcrbKD@=>AEQj~aHTNJHGECBBELKGA<;=DHKKJHHG?88?FD=:>@@@A?9324;@@=<<=<<;;;::;=?ABBA@@>=96>DA=@LZXOMJEGGHHHKKLJHGD>=>BEHOOKF;7:5:@EIB56:;<:878;@FLQPKD>;::<=<:=ELRPECNPOLLONC:9999::::9878899999989999998886Dj`n^QG?@=;876766455333466553444455676631111355689;;;5VW.,5533456665544443356776668:964566654335;?@AABBABBBBCDDCCDDCDEFDCB@??AA@@BBCDEFFFDBBBB@@@@<5786419MUV_ba^YR?6149>??=;::988;?@><;;<=>?<9;<;;=@B?>C@746743312444344333453333310115>C>843328>;544222245:=<98934@=07Om~Z;9666778;@A:118962-,./0026656444665545689>?=>BCCB@<866679;>CFFHG?4052)$,:>@IOH<621258:96555668;=<<==:;<=>8;A:28=5152AU@A@=O@/5FLA63679<8/*04/8BLK448789979?=3,,./1211462135762/.,4DF935;JZYUpyWON;4<=;9845G^bYW[WZY?0.23--11//0/133431/--.04776447:;96leUXZSRXNDMVZ`hdH+/>=@DA6.2504;9566446881-.05:>ADEEGGFDETowkqhP]O922:>;??92/4=A?<=@A?=>=:7304:>>AOY]]VE47>;62045/*,0./7:8996.-//340/120/,)((SSTUTSRRRQQQPOPPPOPRSSSTUUVYZYZZ[[[[\]\]_YOLOPOOOOONOQRRSSRSTUVUUUUVWXXXYZ[\]______]WQPPPOONMOQQPPRTSSRRRROOPPONPRRRQONNOPRTVWUNLNNKKMNOPSVZ]]\[YURRQRTX]_hsuhTQ[]Y`ec^ZYZ]`bccf_WetfNNRSVWXZ\_adfghjllientaJKVROYdmsuxzxtnfjzwefovyx~tklq{rehkjkmoonpss|}}yspqurnorrupccetpirsokiotqnnoplinrqqqponmosutuxs_O_wwwsr{usrqpwtpf]T\WW]kuss}}~kEËXTYVW[YZXijUZZVUVVW\MjuRda^fkjknwxtpyiSbsy}ztqs~yx|hTXd_ZVPNPRSOOPMG@??>@ABGKM=pLCBBCBCBEIKICCEEFGHIDtoQxr\X^fWGEGHHJPQPQRRPUVQTUSSSQQQSRQQRPOOPTRNQ`pnhgzi[Z[YriKONLMMKKMNNMJHGHHHFGKMII@Cl|r~t`\fwLRGGFEFFGZmUFOMNQUW^a[e~dTVWTOOPRRRRRSTQMNYca^acX[ZPMNMNOTUQLJIHIVbVECIKKKJJJGC?@AEJJJJHJHEDCBBBAABEHLLJIJKLJJJJKKKKLLLKLMKWfiHHJJHIIOSNKMLMMJGHHHFGIMSVVWUUX\WOMMLKLNPLFKLGD>ADHHIJGIIIIIJELVQFIHC?=>==?=;;:9::::;<;;=?AABB@?=<<79@CCB?GLRZWEBGHGFGHGFGHGDA??CFGHHDB?>7=DGC8/13489998779@IOUQE=9:===<@IRVO?FTRMLPTOF<9889::::9878899999998999989:;;6]jakMH>>?=<:8665434433334568765788::;;9843336999::;;8@jW58=7258852334455443335676668:85345665434;@AABABBBBCCCCCDDCCCCBDEDCA@@AABBBCCDEFHHIGEDD??BBDB96867GZfheedccbd^WRRZ\[RD?@BCCBAA@????@@??????>><;997:>?:7:;;=?>===<;:=AA@@E>8;=<74312333344443452013311321:EE=43;??BA>84322335779826<:743HWX`J43655668:==<75:7.+,---.01234445444334668:>CFGFFHJIJJGFD<7755678:?BBA@<7671+09=:7>EFD:443688644555679<=<;;;9:<==AC@=56Vk@;FOSOI>12HL:<:99872-1:BA:2KoP47f]15A?846:8787439<8776545657861-*4=6893342269:;;:9?@44?NeeB49D<57/.ATQABOOD;65;>@BBCA70//2<@:4364-),-.398444./553/,/0-1?B==6=qs]MAA7>C@:;;>HU\[UPVT?203;77;:766348==<9421.-.14;C=5799:>B>30362--.)7d|z{kYa_ONTNMPPQX`_VC07=AB;42360.:9124655653220/7DMNKECDDCA@TlnrfJR_D/03@??ADHHC;438:<=;8:Jbi\LDDED?76:6+-6<=;;:9:70,,/42-1:9420,'&TSTTTSRRRRPPPPPPPPPRSSTTTUVWYZ[\\\\]^^^]aaWLLPPPOOONPQRRSSTTTVVVVUUUWXXXYYZ\\]^__`a^[VRRQOOONOPQPPQRRRRRRRQPPQPOOPRRROMOOPQQSUUQNOPMLMMPRRS[a`^^^XQMORPMMRarpkhQGOQRQPQSW[^aa_^^]bkpo_UQORVZZZ\_dgggjklqicrtbPMQMLTaklnsqgb]dvs_aputxvjnv~sgkmiknkb^cm{{|~}zrglskqrowxosvyttxhchsvpkortrmryvrqqpppqtutvvhX]qso|lz~xvvusw}tjrzVV\WY\epuvy{y[KTѓ[`ihngaUet[ZYTTSSSUSOܕ]ellaa_\_^aabpril~yvwg]XNOQHFNLW^E;DJOW\TPOP=cXFFFGGHIKJIIJJIHFFDHIvoCR]t~iXV\b[LDDJQRQRQRSQV\XYXUTQPPQQPQQRTTQQRKMaihnl_ov^ZXXxrTXTONPPOOMMNLJHIIS[\\UFF\xps~egaURRFGGFFGDcrHJUQ\\ZYX[WYb_URRSRPQRSRSSTVXRNIPagcch_Z[TNNLKMRWUOJHIHS\TEBGIKJKLNNLHD?>DIJJGGHECBBBBACCEJMLKJIIJJJKKKLMLKLKKKMKS[VFLLJHHIKTTLMNOMGEHIGHIGIRXYZVVXYVQPPNNNOPOHHNG@7;@EHKNZQNKKJIEGKMAAA?@AAA@?;;AHOJRSSSTRRQQPPPPPOJEEFEFFIKEBEEBBDCCBBA@CNTSQOQRRTTUX[\]]^`c_OGLMGFFDB??>@BCCCCCCCBBDDCBBB@=9=;7531001348CIDA@AAAA@>>>=>>@AAAA@@>;999667<>?>??@AAAA@@>==;99=@BCC@?BOa_OFIDCEFEDDCCEEBA@CCEEEDD@9;DD<766464558::;;;<>ENJ=9>?:;<?==;964433322333336::999::::::;;9889:;;;<<;;6P~Q3774679:853333456544334456667::6346653356;@AAA?ABAACEECA>@AABBABBBAAAAAABBCCDEFGJLKIGFFA?@ABCA;:3:[jedb`__`abdfhd^SD?>>@AAAAA@@????@@????????>=;;:;?@<8:<<=>=;;<<;;?CBBA?>?=;:98533333444443332//11013447>CC96?EEDC@9443344:??>>GF9:426?3.2048976678999:9663/-----...011344323333432369;?BABGGGGGEC;6662158:=>;::89:889AC87;<98==:966786335545689:::9889;?=:877755774111.-,8A0-4115434:==<<;84,0AS^V4,6=?AC<6;NQB@KM<1/1=HB<>DFGC<2//+1>B:1--//,-.024556779;5-(*/4837BHF4>}t]UILmk@>O3;E<69<<=GW^RNSL:356=GPKF?8557@;5332111/*=^aW]XMX]KISIJVXYXZald>08;<65985226610279::732225ANQQPPMJGD@65HZeyiOR`T6256?JJFNXVMGE@76;?ABCHJE;46;;;=9/.NmnovfTTVQMRO9-5;<=@A@AFD70.....1<923550-TTTTTTSRRQQPPPPPOOPRSSSSRRSRSVVWYZ\]^^^]^a`UMORQPQQQRSSRSSTTTTTUTTTTVXWWXYYY[\^``abcb]XTRPPPOPPQQPPQRRRRSRRRSTRQQQQRPONOOOQQQQRQOQRQPNMNQPPX`a`a`]XQQRNLKLTgmnzrTHNPLMPRVZ]``^\\cihhljbZRNPTWYZ\aeegijmrrf]cjcXUSMNX`flpje^V`vnZ`ttmu}ufkv|siojhjich}{yzz{ywrlswqopu|~||zv{ub]huvonqsutrtyzurssrrrsttuukeqzuzmo|ywwus{xrkaWXZWZ]fkox~~mvueON`\]ܗ\deabe[eq_[XRQQQQUWJZXk|}wnfkcWSUWZlry~`rb[\VOLUcTJVogMZkicmzgZRNF]iBFGIKLLKKJJJJIIGFBFGtmBKIQ_oiXVPNSMLSXUMOSQPRNT`WTUTRPPPPQQQRRQQNJJISaVZgfcmaZS\{x`]]]XROOOMLMMKHGMYde\KIIbJtwouaՇMUQGFGFGAIvg@LQ^ga``[[ZTRUURQRSSTTSSSQX_[QMKO]kmjifY]ZROKKNPRVSLIJJPWRGBFHJKKLNNOQNC=@DHGGFFFDBBBCDFIKLMLKJJKKJKKKKKLKLLJJKKLIGGFFGGGFGFT`VNPONKGGGHIIGIPVXYYYWWTRPNNNOPQROIEA<;;=?EKKkqXLMMIEBBAA@@>??@ABBA>@DCDFHJLPPQSSRONNOOLIGFGGFHLIDBCCCDDCBA??DLOMNOOPPQPQPOQUXZ[cg[KIMIEEDB@>=@BBBABBCCAABBAABBAD=;>ECUWpsSOLHGF=;<=96675458867:?C@>???AA>>???@@BEEEDB@=9898644:ACA@AAAAAA@?>=<;98;<@DHIHCAJ_WFGGGGGHIHFDCDEGGECEEDDEA:6==9;;<<<9547::;;;:9DQQOUYSNWYQKLHA<:;:9::877899999::99898899;=CIGB?==<==>=<=:997776443454269::;;;:98::<==;:9;<<<<;<;4XH,17107:97665444445543323334555797433434467:>???==?@BCEFB?=??@A@@@@??>?>==>=??????>>><:778==73333444444332100120134445=@@><@GHB>:5333559UfOKh[46353/2549<;87666789889766662/--,----011223333333335789;;:=ADGIHA746640.16;?=97667:>DC=56=67?<==;85554323445688889879;;<<<<;;;8:9-0>A>40.,*,0239FCBDEEA>9633430-,./6>;5-.4:62,,,-363468:<:8744556655772--.00/.0-2;9668;64=AA;3///16BFB:24569@==@FJC@GE6,./;GC=;CKKB6..1.4=?<5/-.156663211006983//567>;8BFA8GcbA2*(BebBDO27A;58::;>IRRMI>=><6332/*,/,+3875226@J@FZA7HSY_hnpnU3-4424::65741/.17>EA71566@OPMMRVQJD?:4,.7B\lRILNF::DMKECTkneXLE>21:@CBAEGC<<><::9409Wmt|ylfbY^X?0.=I@526>>AID4-40-215520.242TTTTTTTSSRRROOPPPOPQQQQRRQONMMOPRV[]^^_____^VQQQPQRRSSSSTTTUUTTUUTTTUWVVWWWWWY\^``addb]VTRPOOPRRRRRRRSRSSRRTTTTRTTRPPPOONOPPPNPQPQRRRPMLMNPSZ^`baab]VQNNOMN\v|zrZMLSSPRUX[^`^XZ[\adeileYQNONPTW\`cfhikkpseZ[\V\]UTTWamrljdX`t{ifu}x{vfejjiw}rkkhgbhwu{}z{|}yvwtqov|zywzzn`]huuqrrstttsvywtuussttuwwuttx{}iu{wtvutuqqr~QXXXWV[prmy}pp{bQWX\^_Xˎ_Y\]eaaja[VQPOPRTUQW_ce~ul\VVWVX\glvcIJVYV]b[PHPtwOdypl`[nq\aQFIQvDIIJKLLKKKKIIIHGFEGL{mAMLLPV[[UVTNNPPPRPPQQQOTZ`WMSRQQPPPPQQPLLSSRZ\[_``bcca̹jXXjxqg\]ggbWPLIHILJGFIPUZ\RLPvSBo~uvt]mRWNHHFHP?d{EBHLei``a_]SOUWSQRSSUUUUTVVVY\YRLLPY]ghiZ^e\QLMOPRTSOKILNMJFDEIIKLMPPPRQJECA?BFIHGECBCDGJKKJKKLMMNLLKKKKLLJJJJKKKIHGGFDDEEEBFS]XPQNNMJHHIIIIIMSY]]YWVSQMLMOOOQSRKE@>?=<=AFGY{_NMLFDBBAA@@???@AAAA@ABB@??CEGHJOQPNNNOOOOLGFGGHKMKA=@@CEEC@@@BDEGIJKLLKJJJILNPSS[ef[MHKECDB@>=?ACCBBBBBAABBAABDGVSKA?CBAB@DHMG@636<@CLTRHDH@;<>?>>@@?>@AABCEGECA?=;::;;;8759?CAAAAA@???==;9889:;>DIIIB>DHD@ABCDEFHGDCCCEHIFCCCCD@:8:::;=@@@=;:99:;;;<==>A?8GRGB<;@=BSWUVTPUUOMMKD???;9:98788888889988888899:;;;=>=><;;==;;;;;;:;;:86567546689:;;998::;<=>?@?><;;:;93[M).24467776555555555553334556435677543333236:=<<<>?ABBDEEDBAA@BBCDDDDBBBCDCDCDDFGGGHJKJJJIIKIECAAGC2Ccfaba``abcgfVC;::=????AAAABA@>=>;:;<<=>>>>?>>><:=LVTRNE><=;:<<;;<@ADEA@<7;>@;976666677777767896420/-++,./01133344323469;989<;;DKMJ@4466:;5347;>;8559=BGE926;8:@><=9656542112356787787789:;;;;;;:::>@73;@=52354573/MbGFLIB@B<42451,,/2249;43450----/1425?>DCA;;KMB643757;;951/14:=68?>5,++***+/:FIA16@?62:G<7(-/3IVH?FE24>?78==>>?=614:;3++.154576458<6E]B18=CMZhv|c5-30046889:50/.02;FD<:>=;FNLKMSK>?A<;96322LlXFA>??>KXRANkrfZQKE?88?@BA@CECGIB=:;?@>JHOela_ba]QLOQQQSSSTTSSQPUTTZ_ZSNLKMXgk]]idVNOROOTWRLJJMJCABCFHJLMNOOOQURICFNNJHGECCDFJMLKJJKPSQOMLKKKKMMJIKMKIHFDECBABDCGKOVVTRQNMLIFHJIGIIIKQVWUUSQKGGIMMOOPQNKC??>==>@JHbjRHEBBBBAAA@@@?AAAAAABA@BFILJHIHLNNNNOOPQSQIFGGHKORJC?>BADDCCB??@AA@CEFIHIIKKKKJKQZadXHGFDDCA@??BDCBBBBBCCCCBBAGQYYWVIGC?>?=IonCB><5AWaWJBDKOUY]a]Y_WMB;<>>??AAACCEDEFD?=::;<=>?@?><76=CCBBA@==>=;9788989:?CEDCBA??>=<<=>>?ABBCA>@EGCCCBB?;;::;<=?@BA?>;9:;;;<=>==<7AKLME;:;>MXUUVRKJLNMLGEFG<9998898888878988888899999:;;<<;:;<;:99::::;;:977986422478:::::9:;;?>?ABCDBCCCEEEDDCDEEFFDCDEEFGGEHJJJJHIIHHJIJJNOKD>>FH;?Zfba```bca\WG;;?@>?@?@AABBBBAA?>979<<<>>>>?>>==9=KSSTSH@=<;:;::9;A?AE=76;@@@A>633344444544443211100244326<@@>>@@@A@95444560.1314630.1GWH<;87667765667767788999983-,,..-.1234455545679;:758;;AHMOD5364:JPH<4259954:@EG@7579;>><<;:866886445556777777778::::::;:99:<<;>FB62783//24424;>73-/0../0,+17?>75?B<:9412467511///1484/189546==75536;7358865641024=>87@>;=?@A;;CABBCEE?:FOD9=713:<;841.5=9<::<:0,11+)''.?RZS6.99+*0998223489558933:=:8AFC>:53A@16=>DECDB;55CKTP<-5>:9RMA:;?<5@oX*/5014669<;7310/,.;HJGB<=BCDHIOE:;@BAB?553Aj]BBCB@>AJJFY_MJMKGD@>ACAA@@A<>?EJF:'0/9TQ?GOC>:7BR^gY7*/442/,*((UUUUTTTSSRQQRRQRSQRSTVWXZ\\[]`bc_____abba`_``\TRQRTSUTUUVVUVWWXXXWWUUUVUUUVTSRTVY]^`cded^VPONOOQRQRSSRRSSTUTTUTTTUTTSSRRQOPPNMPQPRRRRRRQNLLNOPQSTUWZWPNONNNN[pppx~|aHIRQSYZ]``\VWY]ahntvrkbZVUTUX]^bgiijjkorld\YZTZdbYXhutoffs|mbt~bahecghjlhiu{yojjl}o~~{pp}zz~zyyy}{qhfgchvwsx{yqsv{}vutuwxxwurqstrvxdlsuwwvvvz~sw}]RYWWSQhqn}xuw|~}~cY[[_[YZRVsW`ca]oiWZUSPOSZ[eql^udjlk[m|{xtppvwk]gXKMONNKKLT`]SVXWV\XOJ^x|gY[X]^SL@r~GILKKJJIHGEIO\SDHO?K~cBMKLLJK\XCEKPVRONKJKIFMW^WQTQPRTTTVWXZaelWXfecca^jsedYQ[ooZONPQSZfjaULIHGFFGGFHMPPY]es|zkR݌UXQJJKST?iuHLNGL`jb`bc_TORRQRSSSTSPOLGM_]T\aYQOOPPana\ffXNLOMKOWVNKKKMIDA@CGJLNONNMNTWPIU`[QMJGDDGJMNLKJIKQVSMKJKJKLNLIHEIA<9;?ABCDFEBEUadYPQSOLKJIJNNLORQQRRRTWSMIFDBDHMQPLLIDB?>>==?GJVcLCBBBAA@@AA@@?@@@AAAA@BEJUSSQJNKMMMNNOPQTRLIIHIKNORRLGB?=AEEC@>=>=;>>:Pfjv|D@;:@5:Shd^`_XXWW[\_bdeU><>@@@@AACCDDCC@;879:???AAABC@77ADCCA?;<>=;8666778;<=?@@@@@@A><<<=???AAAA><@CBCCBA@=<;:8=>?>@@?<99;;:><:88>===<>=954344444555533331111/0244127=???>>>:8:74333234432445536>B?<<:86656664666666678789:95/.00000024565555679;<:755:<<9;;:877:;:9;;968766677678::::::::99::9:<@=329Qg_VH8JqULJ@79CA5489522330.16=;81//0022-,16<=8AJJF@82014785231*/2694--*)-2199223227:99;:720/014?C7.26:;=?AA<:=@ABCFHGD@H?10-%2A<873..:C97<:2,)0884204EZ^VOD;<9/))0884342001384116>:9HKD<;4*?^=,46C>9:::66CJD=;<<88?CEA<;666459=>ADAERXZeiR=DC668=FII>17JXXK9;@=4.PyU'.3124447963221.+(/AQM?9<@@??CB>89>@A@966.=_RFJGEB@>AEHKA8=AAA@>?DD@@@@=66:>@AACHG>;:;<_TZ[<:LA,299DI>768@O\gfS?9<;;:7433UUUTTTTSTTSTTTTUUUTUVWXWVW\]\[\^___``acba```_^[XUTTUUUVVWWVXZ[[[ZYXWVVVUUUUTRONORUW[_`bde^ROONNPRSRRSSSTTTUTTUTTUVTUTSRRRQPQOLORQRRRRRRRQOOPOPQQPONNNNNOOOOMY^R[gm|]NRTSVWY\[VUY[^agknqsurg\XXY\^_adghijjjotn_]bX[mrk\S`moidivtoz}mccbddeijlllpy}qjhfo}xisywts|{wnigfjfesxsqssnkyzyxwwxvrpnlkjhlz|jflrxzzywvxqTUYXWQZvwg{ysqqvwt{odxV\]ZZT[b\hc]njY]VPOOT[grqpk^ےejjqcZ_^m{xmhncXUoѨgYxeMOIFECFRRLKKJEKPJJTfogeaXUPLBhWEIIIIHGGGCFWmo\JD3W[CPLLLJLSRNNPSRPPGI^mmv^LZRNQQSUZgmmhh]]nO\c`a\\RjwrdKRP]qlYQPNNNLKPSNJJJJIGHHHKMMMNXoyndZtXVOJGU`S`xZCLLHIT^_`dea[VSSTSSSQSSPPNKMWa`\YURQSRMTc_YfeUQZTVWRQWSLJKMNNIDDGIKNOOMMLMOQRSQPPPLIEFIMNMJIGGIPUPKJJJJJKLKHD@KMOZ_L=CJPOHDLeuvaLNROKKOOLQX\]]]YSST[\UMIHGEBCGLOJFFCC@>>==>=HKF=@BABAAAAAA@@@@@@??@@BHJJKPIGKJJKLLKLMNOQPOMKHIJMKRZ\ZRLCAAA?=;;;<=>ADN>;9;?=>AFU`eg_XVUX\__^_aZ@=>?@AABBBCBBB=868;<@@ABA?@BC>9><966789:<<<<=???@?@>==>>?@@ABBAA?=ABCBBB?>;;:97===<=<:9:;;:<;:89=DKPJDC;9@KXYRH:9FQPOEIND9::88888778878888888888889:::::::::8878878789;;98707765678:;;<;::<===<>CC@;<>>;NyvD+13458555565544555775446554444654456:31@;Od^\^_giZF;9::999:<=====>>>>GRUPMPPI@:;;;;:852159;;==<975443235544443321111/132105=A@A@@>82362012112332243457@@56<>;9865665455666667788::85100012224457655557:>?:756::>;:::887:=;:<==;98888667888888899999999;<=:4309C?<618IRJB935<:7678645762/156:::98776536523=HL@;94/0/.158859B>/07;1+15-00+03..12138=>@>60,/11:E=*%,-2:?AEG?769;>?@::C::4*0?>9@8240,1>=55850).;BA:57MdcO:587890).175112.//09F:0/4<<;<<G;:YR1.21112420./342/-,)3KO?:BJIC=9655787:;8551=VTOTOFA?98@IT^V>489759=@>@B>50118CC@FL>26BH>I}q>FJLcd@%*-(0>8,/;AIT`h_OJJIE@>?=:UUUUTTUTUVVUUUUUUUUUVWVVVWZZYXX]_^`aa`abaaa``_][XWUWVVVWXXXY^a_]\[ZYWVVUUVUSQPNMMNPTVVUVYYTQPPOPRTSSSSUTTUVUUVUUWXUTUTSSSSRRPMNQSRRRRSTSTTSSQQQPQONNNNNOPPOPUSMRVYgrhTNQRQRSSUSSUY^de`\`gnqi]Y[^_`abdfgggijmpqke`Zcz|dWY]hjjz{z{xuqoldbdejmkkjkigny||vidklbc{{wstwb[_elhbmxqgfjkghz|{xuttpjkmjouoopllszzyzzzvxzolsQXYYXUf~nnzpllom||mcW\[VTtüŒTYcYilY_XPNMQYnxpnmcqejgaotkfhigrxspj`Za\goOby^PUMXfbPLNEKTPC>EHNNJS_lp^LJNEZ~aHJFJLLMPPMIPXacTB3bXGPLLKKLNNOQQQPPMO}FM[NHNKQ[jyvfTQQnPR][[\\WYqfU\TTcqaRPOPONMLKMMNUWOKKJJJJJLHIaqg`_`[SLIJYaX{oAGIIIGJRX`fea_XRRSSRPPQQONLKIJXaYSTSQPOMNW[Vck[VwmdfgfeZOKMONOPMJIIKNNNMLKKLPSSPOQROJGHJLMKJHEDFKNJIIIJIIKKIGR|{JFNSUFMtlJHNLJHLPNRZ__]\YTTV[]VOKIKKIIEBEFBBAA@>>??;@CA==CBAAAAAAAA@@A@@?>>?>DLNJCFEHMFEHKJIIIIJKLOONJGHIKMPX_hqiUHCA@AEJMPZab:=CGIKLKLKJHJLMU[RGFFECBBDFEEEDDCCCCCCBCFDTuygYSFDEDC?=;<<::;;:528@KfkcZ[]^_``ad^C9:>@AAAABBBB@:67:=>>ABB@?>@AB<7:=>>>=<<<;9889::<<<<<<>==<<>>?==<<>A@AAACECCCBA@@>=<;><;;7G[[OGL[c\M4B\\N@67BPQROIKG?;;88888778878888888888889:::::98886657877779==;:85;=8899:<==>==;<=>@BBCEFC@BA@c}L1689764455576644555555455555433553446>?BINRNMKGC@@@ABBBAADFBCCCFFIIOOONIFCCDDDDDEJIKKKKJHGGGIKKKNPE843796I`]ZahlcM@????@@??????@@?@AA@@?=<<;979::<<==<==>DNVRMMLMNG?=;:<<::9;@==977899:>FH<224540)1Ob`_]O:5::97435668=A>;:::98<>;<=>>=;::9:879988667878899889:;:985389-+.13:8:;:::9:946:743247837F4'/677:=?HQH73669:9/+7610->_iP:71//.6://6453/0L<..07>>===:986/6bK(6;DD;9AILOQQNIKQMHLXkwlN:>HIFBDH@3>rxedT?;EK@7AB730-/463,*.37741/.,0>DACMOMIE?<<><6225444;Unj[WVOGC>?EIVtuK225411259=>:33439DDBKI7//DR>1bK36/?b\<8B8(0@:/3=DGP\aVPVUJA?>=:7UUTTTUUUVVVVUVVVUUUUUUVWXXWUSW]aaaefddcccccbbb_[YWVWWUUUUWXX[ab`^]\\ZXWWVUVTSTPOMNRSRPNLMRSQPPQPQRSTTSTUUVVWYYXWXYYWWWVUUUVTRQPPRSQRSTVWWXXWUSQPPPPQQONPPOOQQQQSSRSUWTPNPPPPPQQRTV[afbZTSWXVSSW[]^`acefghhjlmool`Y`txmdTYcix~|zwspnlke`ehmojhkmiegfk~vicfddy{yuu~wb\dliagpkdbehgfiszvv}|{pimojktwxpdqot}yzzyvyyiw|YTZXYX]r{en{okknmyuqP]WSx~LY[ioX[XQONUaqvnljkZffiieceghgqztsugW[h^`[Na`HJNHgcPIRWRKEGNRJKMNX^WMKPINxhHOLOQTX[[ZRLMNR]U=jXHNLLKKNOONNOPNPI^yCMINc\QX^ac_WOLZX|aLV^]]_a`br[R[XW[heYRPPRTSRRPPQUYXRNMLKJJKFD[nj`MyS\PJOYXVqwTJMIIIHINT_ggc^WRQQRRQQPQQONNMLKORSTSQMNPPSTQ\ngaxshiox{gRLQVTUZTNOOOPPNLJJJKNRRPOPPOKIIJLLJGECBBDEEFHJJIIIHGDSNCMQR@kpJEJIIGHGHQ[aca^YUQPTYTLIGHHHJLJEDB@@A@@@@?>@INONOLH@HMECFFHHGGFFFGIMOOLHFFEGMTV]sydUPSSWZ[``ZJ<;?CEJKKLKJJJJJJOUWLDCIMFGFEFFDCBCCCCCCDC@\~vXMFGGC?=;<77=?CC<8888609Ufkba_^^^_adaN<>B@AAAABBA@>769=>>?AAA@@ACBA?::=>====;::998::;<;<<<A=<;;<>=???ABGIFCCA@?>=<L[PMFYc?9779877887777888888999::::::998765556665459>=<;;<;:779:;<>>???;;<>BEDCCFFDC@MwzL39:75544356644445544345555666423443445????@@@@A?<<<<<=<;9;<<<==>>?ADGC@DFGIKKIFC@=:74444333222110229CA>@AABAABA6*')+-00234344334332123367998764443446678765431/.//00////123444457;?>:658:;:89CI>2121261)5Sd`WH89<:96434556>D@<:;==>??<;=>>==;;:9:;<;98656789::9778::::96554.,04:8;9:IK:/34542/,.//66KNN[\C/.00/-')03557431368==CF922-0>=58><;;93*Ea@1?>79;76DC55@A9457987>A;:55577650/385,+0589741/0566=HOPJGJPQNQQC2*+07B?Fk|o^^bVKKNQNDRdJ2333552158765667;@CEIC5/*:H=-FmT116+-HQJPT@1;>9?EA@EQ`g_V\_M<=<412UTTTTUUUUVVVWWVVUUUUUVWVWWVTSY`acgihhhhffffdeea]ZWUVWUUTTUVWW[^``^]\\ZXWWWVVTRRPONQRPONMOPRRPQQQQQSSRRRSUWWX[[Z[\\\ZYYYXWWXWUTTRQQQRSSTVXWWVUTRQPPPPPPOPPOOOPPQSTUTRPPRPOOOPPMKPUUW]dhg_VPMMMNQUYZ\]`bcdfhjkllmnngajusoriSRgy{wplknlhgfeioponlllkkmlmtpcghj~|{xv}majkcbeeedfggfehkfbjuwwzqhgjtuv}xr||mw}xzzzvxttkNXWXZ[aq}}|}{kjxxpmnou}npseTYQpտzTTkoWSVRQ[ckpmmkhm\qocijkjihhk{xynYSX]VlmXYYUQRIMv{ePZ_TPSPIQXLILJILRTNNLJznEW]ZWZZ]]YVTROQWYGpTJOLLKLOPOOOONPRG\׌KRYJZ~nTUQINWVTT\YrRR___`aig`RR\WVXW__WRQRTSQPQRQNNV\WOMLIIMLRbl^PE`[XPJ[fS]dF`]UNKIIKTaiid_WSRQRSSQOPSTUTTTPNQRSSQPQPNNPMQcjkqoilrx~s[OTajprfVQRRSRPLJHHKLNNNNOMKJIJJKLJGEBAABCDFHJKIHHFGCCV\seUCDMOHIuPEHIIGFFCJ[ffc`\SMGKPOJGECCBBIQNFCA@A@@@@?>?AAAABAABBAAAAAAAA@@@?BMWRRNLLJJJD?FFGGGGHHIIIKNONLGFDEGLQMWv}f[]]^[diP<:;<>ABHKJJKJLJIJKIIQQCAKUNIGGFEDCBCBBBCCCBAHf|lYNLKDBA>;::@@;858:<=>BGVghgfc][]_beZIADA@AABBCA?=67=@@@ABBBCCCECB@<;??>>@?<::998::;;;<<<<=II@9::=<=;;::;<;<=>DGHFDC@>>==;_RDPq[=;99899::7888788888999::::::998765555653238<<;;;;;8776657<>?>=99;=?@?>:AFIIGHKONKJNG=<97686?Ya^i_F>@BEECDDCBCB@@?>>>@@@?@?<=>>ADA=;:<<<<=>>@BBDECCCCA>>=>BGHFC@=:6543332221233AMFABBCDCDHQI404-1=<754433456544322456788865444556679842.--,,,-//....001333457:>>85579::99?C=53212461-<_iZ@27;985334444=GA<>?CDBB@>=>>=<<::;;=AA<9:977889::9879:9::975444433>HNRE><9777788312100//10-358=:965961010/6>>930/1226889675/464,/@J=,)'*01/-/036883134432;;9789S^==7./6<@HC68GLD=755526:;AGIJOQPJ?9=>EUfjV;=HD?<622/.08GYe^G<>:301344343377/,3777662027;;;DNNHFHHJMLIG=.')0=JKRn{~sbSGHQSVUF=CEA<439>:43311334755;DF?5.-276/3>519=3+ARNON>6:75DRL>Jcoqk`_b\MC>3.0TTTTTTUUUVVWWVVUUUUUVVWVUUVVUY^`dfgghijjihgffgc_\ZWVUUTUUUVVVW[^`_^\\\[YYXVUUSRQOLJKMNMNOOPQQQQQQQRRQSTTTUWXYZZ\^^\\][YYWWWXWTUTPPRQRSRQRQQQRSRPOPPPQQONPPPPQPQRSTUUTPPPOOOQPLIMRSVY[_flj_USQPQRVX[\^adefhijjkorwupsjbgmjmv]jxphglongfefglvxpihkkjkmrppyjbf|{ywus}}~nile_bfffggghigjrtkcdjpmmh_o~zxxom|q|xzzzwvnVQXVXZ]cozzvrppkilnowv_mevv[ZTbǽұaPhoYOTSTfmjkjljhih\_hjjklmlq{~zn[TWZVRrxYSY[SROHnic\VabUPSUPTTKJLIKPSRMMPEz|IV^_\\Z[ZWVXWUURRGwNNOMLLMOPPOOOPRSF`RHVTMUdTFGMRQXYVZ]ZbeU\]^_`ea[LY[VUWOMXZTRSPOOPSRQPPQ_eQLOIJPR`nieYcX[RKWhhYy|EQfcaVOKIIVglie_WSRRRRSRQTVWYYWUUSRRRRQQRQNMMNKTo{thcnxyspdSSct~vaTTUTUQNLIHIKKKMKLLJJIJJKLKJGDCBCCCEHKKHFFFGF>;:=DA>BMQONFz{cJIIFFEDACQegc`[OJFDIKIGDBBA@DMOHDB@A@@@@@@@CAADCCCCBBBBBBAAAAB@ABIPQQKLKJHFCGGHGGGIJJJJIKMMNMIHHHGFIFGio[[][^mW;<><<>ADFJJIIKLJJJKJDCJJCHQUQOJFFEEDCBBBABBCAFMGFWenmh_[]]adVCBCB@@ABCCB@=79?BBBBBBDEEEEBBA=;?@?@CA<::9878999;;;;:;?IMF@;97<:::<:89988<@EGFFA>=<><9:<@EIIIKNMJD?BB<9549::PbebC7=?@@@?@@=>ACEDDA=::;<===@A??@BCCDEBAA>=8//413668887644433222115;CHHEBCEEEDDKK=8736=<86434447777654322334777656656788741/**+**,,......./1111359<><755678899:<;543234561.GdgN4278643223457BA>=?DIJB:>>777547::8789999876555658GRbdG:100134563/36611230-479;7769;:7203688::2-.21257768413551*-2-)-.-,-00-,,6A:31169:56BE723210/3>?946:6.,4;5/.//-----/20*)*++,./6<92./..,).52+,1322357999@A>;OR;9BKLK?9>8-/9AA@<98966=5:[X6.15=DHIE?@A@BDCA>:5315;>BJOLIHEAB?G[c]QLONMKGA8008=?ESUE67;432/11222566658::857867?A<;@FF@?KSJ@>@=<;72236;>K`m}xcI:=HPTRHCBDHF<57=B?764100121/03<>81-/00102339AD;1>LD<;632225CPHQlvtpfWOX]J=80.TSSTTTTTTSSTSTVUUUUWWVVVUVVVVWZ_badfijikliggfgfda^[YWUUTVUUVVWY]^_^^]\ZZYYXVUVUSQOLLOOLKKMOQQRSRRQRRQRTVUSUWVWYZ[]]]^\ZYXXYYWUWWTRSTSSQMLKLOPPPPPQPQQPONOPPPPPQRRQQQQPNOOOPQQOMLNOQPQU[cd]URTVTTVXYZ\_abcfhijkpspruvrrrj`Zpxjrpotxyoccdcafr~yeahjjjmnil}w`k{wvuqqx}ky~jkgbfhhhhijkmljsn_^``jmdk~}||qjuri|zzyxwlubRWWVWXYdsvvqmkgdefilpyhknjieWVhrĹwSal^PTUWcmiluohigi_nbgiklnoqtx|p^Z\[\[WacYWY^VQOiuY]__]WQPRQNPQOMMORQMLNP>mNRUZ^\Z[[YYZZWUSTExKRONMMNOOPQQSTURK\CQOKKHV\JIOTUTTT[`[RotYX[Z[^[S]qGZYXVWUKSYSTWXWSQSSSUVORaaXOKKQaa]\vRWKQuyij~`@TZab\ULGHWjmjf^VRRRSUVVY[YYZXVVUSSTTTSSRPOPQMMZjtulegrthccXRaqvzvdXUVY\VOLKIHHHJJIIJJJJKKLLMMLIGDBBBCGJJGEDCDFECAA???BUXQMTî}w^MJGEEDA@BXca]SGDDDIKIGEDCCCDJNIECBAA@@@@@ABAACCCCCBABAABAAAA@AAAHNNKIMIHHGFLIIIIIIIIIHHKMMMKHIMMLIDC@M|`WZZbgG8A=>>?DFILKKJKLJJJKJD?@IFEFPRQLIFEEDBBAA@@@@?=Lz}~S25Qo>9<937==<??BBA<::98899989::9::6ARWQMKC9689987777:9;AFIJE>=<<<:8=HC;;:999:;<<<<<;:997::9999888987555555775545554434433444434511:CCB@?@@?ACCCCCBCDCCDEFGGGC=;<==?A@@AABBCBBA?==AFHKJGB?A:=HG>44;<8FecD6686AMBEGEDDEEED@=>???@?AA?@CEEEED@;:<=<<=<::;=@B@>=<<>?@A@@ABDDB@><;95790+./0112433332222/0:BHJHFCCDDC@<;=9656656654333567999874300/13688999888884/-/-,*++,--././../1011126<>;9865777888:9643346554.2Nh]9/56533211352264.-/132,..,0340,+--,0451-./-*,;ME104>?=88DB5;@HH>8>B?:3/13..=A6/-//.,,..021-+++-..-262112000,,5972.**-168;?;9:=AMD6;Pl\E8122,+2?B=5785:<673B`D/8?CEIIGEB<58;;@DBB>725;CLOIEHMRNAKbbbomVTcga[UHES^QNSJ@=BC?:1,.,-/-1878;;:976899@HE;:AB=4:Q]QINNIE@?>=9543;HSqa62>MTRNE:;AB<778:>A@=<:5100/,.4763/--/0122356:==<;==4.-...00-0@QZjtqg_N=LcUEA4-UTSSSTTRRRQQRSTUVVWWXXXWWWVVVWXZ`fiilmjhkkijigggfc_]ZWVVVVVWWWY[\]^]\[ZZYYYXVVWUSSRQRQMKJJNPQSTRRQPRQPRRQRSUUUWY[]__^][[[[\_\XYYXVUVVURNJJKNONNOQPPQPQQPPPPQQQQRQPPOOOONNOOQQQPOOOPOPRTUSOLMRVWWVXXXYZYXY]adhjimmotqnuvmltnntr|~~wjabcbcbbq{ggljilkknmynwzxvqommzinzyyvtruxzhjidgikkklkkklgdhprh[Xcry{}~}_N_{}}{xvunwQTWWWVU\jmkopnjfeefgigefnjctym`PmaOȸRYk_LSV[`ffkuehfgf`upjhiklnomlvvecha[]^]XVXXWUUMc~_`b`\TPONKJZ_RNPRRSROLNHtRS][ZZ]^_^]\YURRTC}HTPONMNNPQQUXXXQVjDQVOIKISZLHSWXVVXY]ZOZ}]UXVV\[F_eMa_\TSWQPWUWbfb^ZWUVWUUMRhePKPO]pbVdTNKb}qa~IISJVb_]QGHXjmjf\TSSRTVWY]^\\[ZYXWUUVVTTTRPPQQPQ^lcfstpppe\`^U]nqmje]XZ^`]TNLKHFGIIJHIKKLLLLNPQRPNIFDBCFJIGED@ABENULHIDAZ^VSVs~}iRKGEDB@@>?@BDGKOPPLJJJIJJJJFA;@DDCCEHIIFEDCBA@?@??>>=A`}ztF:]m*7;88;??@EOUSNJHB;;Nmud_]ceR@ADCB@AABDDA=:=ABBCCBBBA@BC?<<@@===>>>?>;;;889999::999989EVW[cb\PB8<=?DFJJ?9=AGIF><;<<;97BIA:9;:99;;;;::::9:FXM:Jdy]\~ntwiKFB<::::89999889::;;9:=:878887655566536888877665569::>AB@@?>====9534438?AHA768999:9999:98666655766567875532233332445535>AA@??@ABCEDCBCDEFFFGHHIJF><>>><<@@??@BDCA@>>@@@ACEA;=BH@>:LiU21441>TMECDCDEFGD>=>>>??ABBABDFFEEED@=<=><<><<<==>>=>??BCCB@@@ADEA<;<;:8;=;3/2244322222222206HJ@AFEDDDB?;866664444444555555677777543212235669:966540)&)/1++-//.12111012100//058;;:85677788887654455442-8V[;-56333221341.3:AEEEDEECA?BDJMKKFDGHIDCKICIaylD38:78999988879=D<>JPXU?6520012205DJ>2/158542100/-.18<::7449?FIHGB3+/5;6/+,0010/-,,.0//14/+*,++177,,7@928B;12G]ZP@=D?411/-*+4>95520/-+)')26461,.14.)*.4?=/*+)(/:?:3.+(*29<@C=1-478439HWC-.-&(*(-6:64<43@?7:64L^;6A@>BA@>;9::4248>DE?;=CGGDFJLPVPCIR[w_U_ddfhdZWTDGQMSUSPTWOID:51136437:7434446<><;;<:932I\XbjVIGA=<=>=97:66^]24AKQSNHB?:23:978<@BC@=<9:97227974341/03653775429BC;51.-,././-/E\hgZPRMBVxt^K70UTSTSTTTVWWWXWVWXXYYYZYXWWWVVVVYckjjkkgehklkjghihfc`]ZYXWWWWYYYYYZ\[ZZZZZZYYXWWUSSSQQQOLJJLMOQRRRRPPOOOMMNOQSSTW[_ab_]]]]]`ec`^YWYYXYXWTQOLLMNNNPPOOQSSUUUVWWSPQQQPPPOPONNOPQOOPPQSTSSRSSOLMQUVVVWVVX[\[[\aehihlppssjchffgpuv{zxm`^`abfe`b{xajlhnqpqmp~~{yxomkqnszuorwwxxtquncjiagjlnlkjlkd`ba`bbep|~ydU\kwz|zxxvvdUUUVVUReuiemoonkhfefhhe]\cm{iefvxT[dPföTWk`MSTY^`_hzlfhfege_hhhiiijheftsgmnd`aa`[WYYUQSJhe_eaYRPNNESndTQRRTWTNIKV{[O\[[]acb_\YUTQSSEFUPOOOOPPRUWXXYOVpLZZRJIKJKRSQVYXPTZWWXTO}dWXXW]aHh]Sa\XQPRRPUVYjmfee`XWYVWPLZc\PNNWlogp_XGXvq]OCO_wmZ_hYJIUgkheZTRSTUWXXZZ\\ZZXXXWWVTTSSRQPPOSRMcvjfstsnf_bd\[hngca]\^cb]XRMLKHGGILKJKLMNMMOQQRSSQOIBEKKJIGDFEA=MYPIJHIRXVWXQUbcgn{bQKGECB@?@AOZN>CDBFLLKJIHFDCDEJMJDCCBCA@A@BA@B@BCCBA@>AABCCBBEA<::>??@@GLKIGGIIIHHGGFGGIJKMMLKKLLIBEHGC@Qxz\TXP@?AABEFHMPSVUNKJJKJJJHE@;9>?>>>?M\^k̾4.B<;=?ACGRYWQMJGD>:8\ype^bgS>AECAAAABEFA:;ACCDDCBBB>==<;;>A<:<=<;:=><::889:9:<<::99::CFA=<;::98=GHA?=99::;;;::::9:<>DXf~rqUMG;999:::998889::<>:?;:877865456665558876667877:;>==BCB@>>=>>?9424568;>FE:689999988887667877666667766753225543344557;AAA@@@ACFIGJDBDFJKLNOQUWOB;:;<>>>>@=>?ADEA=<>@A?<:7?EFKJ<6>FGA?BA?SaWQ?7579K_\OKKJGGHD==?@ABBBDFFEFFEEDB?=?<;><;;<<>?@@@ABCCA@@?@BC?;:;;:;?BC6/344542022223234CCCDFFFB?AEJIEBBCDEDBHLE=?PNJ=79:99999888899=A939DGB;:50./2222CG8/../488865544215;57EJHIIIRYE02;C;=KLG>52//---,***+,/.(,.,+251484.8RI*,MljT;497/,01/)*9B=8751-*+.1*,99=;/-/0/*(.=F<,,312411354,*04;@BC>0+,/223:;3)'*)'*/1,-111419C?:::16VU9>B<998556==3/457:??>=AFA::HRQUQE:Fa{xZSV[_cheWC:Uhb^ZTMZpse[TJ;355//=?5011//2424972/11*2Lf}fC<=;;;<@C=543.GiJ.7;AGQXM:0-17868>BCEC?BDEE?:6347:<<74556546777?=:?A@:4.+,,,./,0HYQ@AMKE[|iD20SSSTUTUWXY[ZZZZZZ[[ZZZZXXXWVWXV[bb^`ba`acgijjijkjhea^\[ZYWXXYYYZYZZZZZZZZZXXYXWXUSRPPPNKIIJKMNPQRRQPOPOMLLLMPSSSY_cd`_a__adhhhibWUXZ[\\\\ZUPONNNOQRSTUWY[[[\][ROQRQPQPQQPPOOOONOPQRRRTVVVTSRRSTUWVVX\`cfghjkkmnoqqrsthWPUn~yuy}{uttkb``bdfhf`decihrrjo{~~|{zyqevox}yurrvsxtnlchgbiijmjjklmga`dg_b|{utyztxusrnnqtwxx}yz_VTSXVTSp~pmopomkheehihe`baY]bgcjmuv]xf\WXVgeUXUV\_`fhcgkgeghjc_cghijnos~ueejjffe`[Y[XSPOPPWyjY_c^URQJPr|cVRQQSSMIGKPbjHLS][\][YXUVXXWWV|CUPPPQRSTWZWUXUD~ETYXPIHIGISVSU\YTSTTSTSO`v_[[]`eXwWS\USSSQOQTTYbeehhb]``YTRRPYdWLO[iiXOFewZpjJ[MjtSO^cUIOdmhdZSUY[ZYYYYY[[ZZXXXWWVUTSSRRRQQQSNH`dVcklgcehf`dgd_\[^djf_XTPLRWOFHJPQMNPPNLMOQQRRRPKGKNIHHGDKKHEINPLKLMRMMOUZ_\[[\toaQIFEECBAADJJE>BA>EMKJJHHFCBCCDJPKFBBB@@AABA;B>BCDABEB@BDDDCBEB;;:<@?BFJGFIHIIIIHIHHGGGHJLMMLLKKJHGCHLKHDWh_YQB?BBCEFINRUVXWTOJJIJJJIFB@<8:8;>ACEEDCA@>===>>>>>>I=;z,BE?@BBEFIRXUPMKGC@>@Bqi\ceR@ADBAABABCCA;=CDDEDBA??=;969@A@78<=<;:<<::9:::<;<=?>>????>=GRdmhZSVXQQWTMB=;:98=EFA>768:98?IKD;9:;:;;:::::9:;<6Dq|iOC>JQM>COHfiuwPFcomc[HB>::::9:9898:=A@<9=@?<998765456775666655779::;::77;BCB@=<;;<:74357889>??>>?ACEA=;<>><:97:BKKE=6579?=>@AAABDEDDFFFEGEB?><;<<:9:==;989;?FK?2224443222223337?GM?3=CEJGD=976666654342344444446666753568876546;<;:;=?CGKLKC?@C@:76799::9665431/.014545557767:<:9875443322.0CF2/4432221221026;=?BBEGFA>@DHHB??CEHICEC<;73246::9999888877789;7.-776662/.13449>1&+/++29<<9655422699:73>UTJCDIYk_=/793AjjK>;841/-+(-3-.789;918;B?72352,/:FL>7:7751/00-,0;@>?FJKE3*,-,/14;<;=BH@/*)*1548<5230-,2=?1,0/.+1AC=68:5-;^O@LF:;7225:AB;67668::8?HB<2:11220/2216:8331.*%5bkG8<<98::33;63`e319?GZ^A,.0-29;=@BDDC@CFDA>=956:@A>?@A;548=BHKG:28?@:5.)*+,.0/+8KE8?IFDPZ]O4,-SRRUWUUWVVXXZ[ZY[]\ZZZZZZYXWYZYYYWWXYZ\\[_fkkllkllje_[[[ZYXZZZZZZZZZ[\\[ZZZYYYXXXUSQQOMKIHIKKLOPQRRRQPPOMNMLNQRRUZ_aaabbcdgjmnqpfXTXXXY\__[XVSPONPSWZ[ZZ[][[^b^TONPQRQQRRQPPQPNNOOONPSUUUVWVSRSUWX\_`_ahkjjknooonpqpvueXR\spaipkciliihca]m{cahqocew}|xywopڸzzopmklfhhhkhhihiic`hkdbcbq|y{tllpsqprx~|xsveSQNQZWSiy}tqtsqpnmjjmqnfadf`d`Mcblmjh^Vv~STbfZ]]\\__Z]bjuojlno_X^ekov}gU[eheed]YXWTRPNROAYpUXeeYQTGfhSMPQQQRRJLLL~qL[ZXTTRRRRTUXSK^puCSRRQSTVXYWVVWKaILUWTIFIJJJMTTU_aWQROORUZYfn_^accZ~RV[UUXYWRPQRV]egbemprogdaUNS_ZNJISgwcTKMS_wK]`S^h]OFTe`LI]ljaWX_aa^\[[ZYYYXXXXWWWVVTRQRRSSRQOMROkfSbjjfglpld`\Z[]agmf^YTRMS^YMIGO[UPONLJKMMNMMLKJLLHEDFFFHLNNNNMMNQSaXjUSQS[\ZZ]\`OCCBEFCBBBBA<6?CAFLJHFFEDCBBBAEMRIBA@@?@AA@A>=ABCCIONDCEEDB@=M[SQA9?DKHFIJJJIIIIIHHGGGGHKLNNMLKJHA7>NWQFDR_dUAACCEIHNVWYXXXZVPJGIJJKJGEB<;:;;>?>?CCB@><<=>??>>AC8D8ECBDEFIJLLLKKKJGC@=<;D}wbZ]NACECAAB@AA@=;?CDDDDB?=<<;97;DC;9:====;;::9::<<>>>?@BCDEECB?APgriYUWY[[VHB>=><<;;CGD@;9:;;77CJB98::999989999::;:8IoaHA?EIF>AJ=PdkW?3ShggcRIA=;::999898;EI:15<>@;9985554577766664457789886627>AA@?<:9886555676788A<444666766655445556665566778645654464556557AFEDCCDBCDFJIFBBDLOQQSQURH71020359<>?@BBB@?>;9998::98::>KJ@835:>=;=?;9Smk^XVTPOZbeghfd]ZXO?=>?@BAAABCBBEFEFGFFC><<<;:;;=@BBBCDBBB@@@???==?>:89PbSAGBKfZ5-5EC2073**4B=753330.H^PTN?=:38<=BTZ9453227=FIFC:8GOVP0IqvyaLOUWYY`aTXd_[XQR]keVnjV_>-457302333101118?><@9/28;HC9>AGI=3147776;7)DlM6INO\S4(/23;DD?<>?ACGDBJG<8538@EFE;67:::72/++-/020+3EA:CKMOK?870++RRSVWVVUUUWX\^][\^^\\\\\\[ZZZ\[XVWYXXZ[ZVZdllkmooookf^YYZYYZ[[[[Z[[Z[]]\\\\ZZ[ZXWVUTQPOMKIHJJJMPRTTSRPPONNNLMPQRSTW\`bceffilnppqup\RQPQSWWWWWWVUVWZaggd_Z\]\^cd`XPORRRPQRPPQRPNNMMMMNPRSSUVVTTSTVZ`a[W\ehghknkjkloqqstusc]lz~zy|dgrggvxnfccebhhahmogbj|~|qӖҥ|xuoffggjkhggdaba^hrrkdj~{xzrjgnvwy||~iqo\m|^Udntyzouzxyz{zxy|}rhjmfRa`rmouhyh_^eMTae]aa`^^_ahuw|yqjge`[alpwnUSZ_a`a`[YVTRPONRUJQtVSah[PNLfpQMRPPWcgYQQBwvOd^VTTRROOQPQKSdftFQRSSUVWZXUVVULQGSQRSKIPRRSRXjlhoha_ZZ^a`[U[{}a]```XtqOVXW[]^^]ZUTUVafenulknmjljgaUSPHMkmc\]bcafOXQNKNSdd^caSLUa^XU_gcb`_^][ZZYXWXXVVVXWTRRSSTTSSRM]p[bjlkmrtnaWY_badhc]WRQKNSWXPHGYWMKJKKJJJIIIIJKKHFDDEGGGJLNLOPLOOS\b|j\VXYUTTV^PA>@EHDAA@=CHKSVYVNIEDDBBBBAABDDKHCB@@@@@??EKHGHIJJIIIIHHHGGGFGJLNOMLKIF;6;::;;:=BCB@=89:;==>@@2_6=FCEGGILLIHHIJJJHCA??B>Gle]UEAEECCBA@@@?;;@@AABBBA?>=<<=AD@:;;>>>>==><9:=?@@@AABBDFGGEEC@Mm~q_X]cffJ?A@??>>?>?CBAA@=;:96;?B>:;;;::989789::;;8/F}OB9::;=<>D76IZG<5:Xbe[TPG?=;9998898:?BJYinU89876544567766544323554664348>@@><:99866456666566584233655556766444455664566566544443465445558?DEDCCDCCDIJFCABDGJKKNHLF:;=8;7777=::>?:Jfla^a``_][^abddb`_T?<>>@AA?@AABDFDDEFEFFA==<;::;>@BBBBA?=>?>>==??=@B?99=?BG@32235323322149@DB@<8:>@?DD@:8888886679=D=8654444334568==>>???BEJOQQMKIGEGRTLFEGGA;:97765789;:89<93//1/.36688889==;9875332134.,7;3155322112222479=@@CB>>?@ACB?;9<=:789777889876699999988899:::?:-/00.,./1479:81//./359>BA71.017628;854>T`b_\_ciqW.,-..-2:732215F^myKPZ\piL>:9:8995>H=7,@_^MRF25AFJNKB@CFPB,/49;=>;956>>2-6C?/0;8++7;324/-./,2L[PHB=@AEGC:GYB661/17>A@A@A<9AK81|VVpwbPNKIJJHCBNYUMIIQZenaKqcaL/110024310000017@C?=96BRSDBHD@HRQB2+/58632**UcCMQLNA1-.0:EHC;68@ECDFDA>;DGT[^\K:785.,RSTUVVUSTVY\^_`bbaa_^^^^^][\\\\ZXYYZYYZXUZcffhlqrqqpmg^XYYYZ[[[[[[[Z[]]\\\\ZZZ[ZXVVVSQONMKKIIJMORUUTSQPPNMNNNPOPQQSW\bccdeffdbacgeYPPNNNNNNNPRSTUV[chjmi`YZ`cdcbb^UOPRPONNNNOPNMLKKKMOPQQRUVTTTSUXZYWX^b^^fopmknppqqonvzpjnrsvxyvg`kyvf`hpib~sdiklkffqyzsszx}xПڰz}|uebddfijiieagsx{|ryvmdhms}s`Ŷsjeglw{}yyv}uqkant_m|{lly~xk]ebacRPTij^dcba`_j{zi][\^^alo{z\W^\[\__\YWURPOPQUWOLwsWS[b\QLXdqX]YNNZdhg^YExMUWUVVUSQOOPRXg]MfFVUVVWXXWVTTVTXgZMSSMMSQQSTTSNUgnmvwqpprme^Y[Vbg]]\\WoiNVWY`eaadda`\SUev|vofgoruyxm^YTWzrtxqt~qrqa\PPDHURhj`^^WOORNR]egdbaa``^[YYYWXXVVWXWUSSSTTSPTURW~rxyb_ehiglqk^\efb___]WPLWQLLXTLGNRNLLMMJKKJJJJJIHGFFFFGFGHHIOYYLFCEMWp}cYWVUXY\XOHFFDCDDDGUdpyyvjUJGGFDCBBBABCABDCB@@@@A=BTf}LGCCSSMGECDFGFB>C?KQUEEIIHIHHHHIHIHHHGGGGHHKMMKKIID>=BELRPLGQXL@@AACGLSXZVQNMPV\ZRLJHOTQNJEA?>><;;=>?>>=?@BBBA?>>?CB=>>=@@???BD@89@C@?@AABBBDFGEEEDGe}d]_`bQ>>@????>@@>@BAAA=;<==:7=A>=>;::99868:;;;;;:8OfH537:;;<>809CE?:1CQRMQUKB>=:8889::8=Tsg7889754456776653221133468879>@><<:8876643466554554333334556678854434676567655553444334456446:@BBDDA@ACCFJHDDEEDEFHFHJTQ>@EBB???=@FHDBA=776668:<==<:8:88CJ@9:>@@<;?@;Jhpc^ccb`_]]_cgiicXMBA>=<<=>?ACDEGEDDDCDGF@==;889<>@@?@>;9;==<<=?A??AA<==;;:73279743222104:BBBB>9:=?OX=57999889887:>=65455543333326;@BEDDCEGILNMJHFHDM^d[SMG=54899:::988:9::;;731/--16777757;<<:975543222102531344222232125;@ACCBA?>>>>@@;668789;;9778899::9:==<;:98789884;D33011344356766651-/58<;977108>@>86AXcje_`it]41026:;<9521/9_kQiu\VZO>3786678>?;E`lWD:887879;:<97=?<80)'5MUC38?JH2,2499.)-/.460*/@KX\REJXVNKKFEB?NA.45:>AB>;9;@>238?9/09:5;@5.,-,,,,.*4VL<=AHNLI@12AE:5227<>=<@>@@;<8,[h]nxXECBA>8>RYOD>?CBEfyJ8oq_\;.0012110.100249B@4.2;LXRGGONECHPQH9/18951/&9i_;AND2.0118>>:66?ECDIG@:<<;<@DHHIB32@B5/571/38944652//7<<855649GNYhjdWE954531SSRSUUSSUWZ^_aceeccbbcba`]\\]^]ZXXXYXXYWW[^[[bgklmnnole]YYZZ[[\]]\\\]]]]\\\ZZ[[[ZWVWVSPONNLKKKMOQTTPOOPQQNNONOOOOPRSV]bbcc_[TOOQMJNQQPPOONKKLMNMMOPT]jlkfYU^a`b_\_^VOQTSPOOOOPNLKKJJLNPPPRTUTSTTUVUVY^`ZVYbjmnopqqqqporsstnjnlnno}ub`jzp`gqi^k|djlkkfgjfdnoirys|Ġؘ}g\_bbcgjjlifr{mp}zpvy~wgmx}zehuhcfgrulluxqbed``eSvVSvo\ccedceo~xgcb^]Z\lz|]Z_]\[^]YVTRPOPRTQO[geuTTX]\QRaex~_V]XRY\Y^kliTxSPVRSUTRQQQUXYWML]H\ZYXWXXVTTTTVQFOWRRTSRSRRSSRWe]S\gjhnu{qefdjaQj_[\X_iMTUab]Z[[]_[VQWgqocbiqvvvutroka[[ftvvxsonjgcWOSUSUUVXYTONNOWeiedcccbb`][ZZXWWUUSQPPRRTTRRMQUSRZ^Z_odU\`][affbcfda^[]XQW}xULSROMEKMOPPOLLMMLLKJHIIHHHGFFFFFFNTTF??EKP\zwg[VUWX\\]^]RD@DDER]jw{ucJHLLIHFEDCCBBB@ABAA@@@@A>MNHGGGHHHHHGHGHHHGHHIHFJMLKJGEBACCGMTRSOHGJIB??>@=>=><<<==@CLOMLHN\[VPKFDCB?==>@BAABDFFGHHHDk2=ADHKLKKIIJJIIIHIGDBAAB<3BakJBBFFBBBA??@?<=>>=;=?@BBB@>>>@?=>@??@??AEE?8==>=>=>>>>@?@?=?CEEC>??>@?=;<=>;68;;:::;>;:WtfK<037::=>>=>9?><769:=LRMEBA<8889::8JwL8889754566776432111137:9:;:9<=<:97655543334445455441223345567875444656666777675445533345765:@CCBDEDBBEGGGGFIKHGGFGDJS\]NBAABAACEHJD<;;7556679==??=<:985:FE?>CBA?=@?9Njof]^dfcda__djkl_SWRMJHDA>>?ACEFHGDDBACFJD><989:;=>==>>:8:<<;;=?@>>>??@>:74321>A887222104AHB?B@8:=GaX878899899888:9753455533333337=CEGGDBEIJKLMJGFFIchhge_QC=<;CILMMLG@859=:99850-,067775579;;;:85543211122111244222232128BFECECB?=<=>??:65788:<;9778::8657=D9-37:;87;F_lR>9412799755544453/-.39>BDEHKOPNHGKMSUOKEDT_`jb^lqV/-/27;;9:;:507]~f[ajcTMOLE=5468CEK@2Oq]:3EHLOKED@83.0?G?9/)%*8;38A<=@835136.(,+*.131/+9PQS\\WPKB@?@?8D;+253:DD=4/0:>;3.6?:2258=FLGC=>ABD8DlWdnUDCB<:::FWOB@=977-:h_4F[WcU5,//1/./332256:?8**7?COP\MU`[OB@BEGGIIHECCCDCCGIKGGGGHHHHGGGGGGGHGFDDIMKJJGDAABCGMNQTSRVQF@?=::==>>=;;<;::@BA@@JNKKLLHg@9?=FJKKKJJJJIHIIHHFCBA@@>:9HcP;CSFCA@>=;;=<===<;<=@ABB@>?@@???AA?AAACFE?>?>;@B@@BAFD;<=<;868:<;2DSXK>7048=A@AJ@;789;649LNIEEC>:::::98Wa<5988775457667654211138=@<99869:76654333333344445541..022333455654344555556667765324533346775?AABBBEGGGGIHIJKNNLOMJJKNQSWVLC?A?@DIKB86885544568<>??=<:9867>BBFFB@?>@=9Plmf\\dfdcb_Z`gkkSBPRQW\ZQGCCCCDDGGFECCDFCA@>:89;;<====<:::<<:;=??>>>???>>;6333686653110-7C@?=>A<;999:;;:9989744344432233358ADDDFHDB=6@bldba`]WUZ^^aba``_WE65::88861.,0467AH:4879998665421112111222222222224=EGEDDC@=<==?@=9659==>><;;<>><4+..6IUSB7:=<98/*&',*1IJ>;:721-+13.,591001106AX]``UGB@:0/626:.-118CE<1+/;=@BC<43-4@A@EGGC>5-,/396AP878=;8678CMC:<<8593+N[C<@JWaJ/+/0/-1541/.19@=7>CAGME@CELTLB=8:?@?<427EH?79>?9,3LK734430,+3?C>728HQKHGD@@DB95:81/,*,RRQQRSTTUWZXY^```bcccdgjic_\]`a^ZXWVUUUVVTUTSSTUWWYZ[[WUVYZXVVXYY\\[\]]]\\\ZZYYZZYYWUUSQONMLLLLMOOMKHHMRQPOONMMMNPSSPXekmoiWORONOLLPPPPONLJJLLMOOOPPPRUY]ilb]WTY^`bfe^ZZZXWUTUURPPONNMLOQPPPRSTVYZYXVVWYYX\gmnpqrrrrsuwwuv{sfogM]oaVd~}}b_gibemknunhjjlkjjjhffdfhflȴ~p}vq{q^^cghfhiinn~yrssqwzƅx}~~˿prx|~dN|uz_hegfw}rmlvwibx}^d^bgedf\ìkJ_h^\c\]svv|w}q\[^^\\YTSROPRPMNTsvrbWaigZR]ege``]TQZ`c_Y[a[SYhGSOQQSUTRRTUSSU]Z]_\\YXXWUTUSSTUSSTUVWUTRSQOKS_gbT]i]QUYYOMU^kbxqkr[XZNz\KUbeYVVQNKPLjqIP\luqkigfcbadfghfczlttx|yvwxz~|sng\UVUXXSRSTVXYX[__````]Z[[YZZYUPYbgljfaZWTSUUSQOLOd}|cbxpa^_daZXWW^dc`ZXRPxziZPLQXQN[cVKKNNLMLJHGIJJJJGDGEHIJJJHFMXbau`{zqxnLEKOSXY]\^b`TJJWov_NLJBBEEECEGGFFDDHGCC??@B@>;>FUQFSUYUO>=ADGKKJFBAACDCBFIGGGGHHHGGEEDEEEECBAAINKJJF?BDEDCGVXVXY\M>====???A@????==>==AKNMMLJJIIHHIIJIDBBA?>??@DVNFRPD?===<::;;>=<<;<=@BBCB@@@@BBBCCCBCDDEECCDCCBBBBBBBBBCDCCCDFCM]c]K>==<;;<<==<<<<;<<=<ABAAAAA=:?EEB86;:==;@V_USJ<028<@CHG806?HJ@;NLCCDFB>=<:;89\S26:765565686675543333:><<;8775665444444443233444564.+,022222344443345555556657=A9112333346666@@AABCEGKIGIKMOPPOOOMKLNNNLNPOGBDADHHC738866656768:<>?=<;:889;>BEB?>><<<;Pmpi^[cfedc`YYff^I8IZZ[XTJDCBCCDDEGGGFFHHDBBA;988:;;=<;;;:::;:;<<::<==>>>B@:6440078555323:=?@:9@==>>=<==<;;;;;:898776543333344349=>ABAA@=<;;9889>?904Mhfb`][XXhtqmjheced]NA:8877641.0224HVCCDDDC@=<:68:9978:<=>>=<@IOKA3/604Owi;2;;7:8.-,.232453/.2520//00+()2@FFKRUYXSLJF?>:35@C@6KlolneK0++-03579:::;<79P[`cQFHPM=;OfV?ZxWXUO@6DDA>:72.*''9OEBOG<4.-,-6;/18/.../5;JhfZRJ<6AOC64000*(-14;A:/2:?=HC><::9981AQKU[JG_`9)11/-01/-+,5BMQQQKHMJ@EJ=;KL;8===<;;;763.1@SYSP?,-.*1435:<;;<97;<93454-*B]K725:5(,9@@=61HRCKMIB=<=ACEHIJGC@?@BFGIHHIHIHHHGGEBBCD@A@A?>EMKJJF=FHFOTJR^W`gh_QDB=:9:<>?@>>>>>?>>??@>;<@HW]XOJFDCBAA@?>DDDFF@p@8GFGOQONLKJIGGHKJKIDBBA??ABCBECOWCB@?>===<=<>=:;;<>BBBCCCA@ACDEDDEDDDDCCCCDCCBBBBBBBBBBBCCBCFDJ^jW?=@?<;;;=<>><<=<;;<;=DKNNLJHEDDDBA@>:87=;<<>>GVVXWO7247@CA>5/8ITTG>NJABDSE@=><;77Q}mE9:545565686665544458=>;99875555423445444322224445542.011122233343344455556545:E>333333454579A@AABCEFGHHJLMNOLNNJHHGFKKJJJIFEEEGIC82587766567779;=><;::989:<>??=;<:9<=Nlrk^[cgffdb[XccSD=Lb`PA=:9;>BDDDFGHGHHILIDD@:9:88:;;:;;;;::;;<=747:<=@@@BA?<8523<>99:;;<=<9:=@>=<==>>===<<;;;868976655444578999;9789;<;;;962336=>70-Hiib`]\XT^ptnigebcgjh^H:8866641//.4IQ9065578898764311122111101221226;ABBCCCB@?:410/4;==<::;;<=DOSND87725=K\X=2767?A2),,/012420/22/..-/0.-0=DGHJHEB?:41/,-217GG>97DKR\K6.,,,045798899<>67FTM67FQLCCWj\ADvoPHI>005:94+5Y\F;159=A?=@DC?5($8IAASUKB5051/95*(.0/**7M_\PC96537MeQ655011+1656502:?<7881151-B^e\PE?<=BB@?@:9MA.27856983.051,.6:1,3:<>AB9LqM4,;mPBA:326;?CCCDELUZ\ZUI?BF=6:;9;:62-)8ED:5397/4>;6875BQPD?=77>CBBA?==@B?;PPPQRRRSTTY`a^XU]fdcfillhda^]^_a`[XVUUTTTSTVVWWVWWXZ[\]YVVXYWUTVY\^]]]]]]]\[ZXXXWUSWZZXUSRPOMLMPQPPONNNPPOOPLJNOLLNPPRV\bhrs]NQOHGIJLMKJJJIGGIJLMMOOQRSTSU\abc^TLGIT^dhlnkggg`UOPQQQPQPNMNOPPNPTVVVVUWWVXYYZ`gmolosuuuvvvxxzymlyzsik_\fic^ckmjn{zz~ofgheddbb\ewudýxdm|qfsrdceeghjjonkvsutmk|ȃqȡrnutz}jqkgxqmcfdfhhjosoihhkmkgigaceeccccb]\g`^i_pw{uqpqsfW_]ZVRRQPUVOY|}~Lcda]hxmaab\VSPNKJILORTP|OlhTQUUX]`]YYYU[]YWUXWYXYXTSTTTTTRRRRSSSQPRSV[]UM[aecb^VUTSSQVFcvQNJkkVVUHTXWVWY^^[_]`]SKSYRXVMLKJJJILKGUe^qr_Vcrwz{trm^^c[UQT[fc]`_]\[[]ajrux{ztlcYRQOOOOOPQRTSQQSUluyq_MRmo_]][VRRPNMLPUTPTM@=Se`RONJFFHIGGILLKIHHIJKGDAGJHFHHJKIIJKMJWcgrsx^@>EHLVSOXZZ[[P[qqbTOKHFDCEEDEFGGFFDDCFFGHNF@=@EFEFEI[QAB@B>?@@CEHFDB??AHIJHHIIHFDCEGE@@AC@?==>>>=>>?>?A:3B\aWPHEECBBB@?BFGII@{7?@IKMOLLKIHHHGHHHID>>?>=?@BDA@N[K?B??>=>===>?=;<<<>?AB@ABA@BBCDCCDDBBCBABBDCBBBABBBBBBBBBCCCECIamP;@@?=;<<==>?=<==;<=>@FLONLJHGEDECBA><<=<:8:<95D~Y=965555557644444556986874564343212344433323443333587224433323466655545555555543::4563345558>A@AAADFFCDDFGGHHFFHHFDCABDFGFEEEEGGC6/4767765556688:<<;:;;989;<<==<:<:9=AMgtl_[bhgfd`_ZZeU??GLH>=><;<>BEEDFHHHHHIKIEC>87:979:::::::9::::96459;==>>?ABB@;;:79:>>=<<;=>===<=====<;99997688877664438;;;<;63216:=<;:987789<>91.Adod_]\ZSWiromkkiihjonZ@88887631/)3PK3265565699765410022122122332238=ABBDDB@@?820..39==;::::<=?B@>><9641.*.1112/1971/.-+-/244574320...06bgQCA920/.1515Lb\K:/-.7@>;ALNG>0).;DFJPPLG>A8.1994440,-:MN=3343662:U[=69@@>94EI/15437<93/565348:83149:5-/]U07-A^MSQDEEB;5321D<)*.6;=;984?dfA32CDCBBFHGHHIIB>=<<;;>ACFKC8:BBCD=516<:H_WQ_q|g@06=BDGGGEEKU^fgjaOFECMO;:C?840/1.2;=407>>91,.15>>>>CHHRQQQQQQSUVY[WRMLS[^afjmlhdb`^_bee`[XVTTTSSTUUUUVVWYYZ\^]ZWVWYZ[\\]__^]]]]]\\ZXWVVTSRUYYWTQONNNNOPPPPOMNQOOPPONPPNNNPQQQRSVck_POMIHGHJLJIJIHHFGIJKKNPTY[\[ZUQONNPOKOW]dknrttutqi]SPPOORSSOJKNNNPUWWWVUUUUVVU\gkiegostvxwvwwww{}{ww]dllb^fklmm~nbehfedddaezrȫll~}cbkiffghhimojptuvxsnwʼnlu·glqqswz}Ʃʹieacdsqhdbccbdghhdcdcddcbbegcabbd]o}uopqmviXb^WRQQRTSOWsZvmjpynbdcYPONLJKOQRRUKwTls_UTTVW^^XVUSSWYXVVWXZZXVTUTTTTTSRRRQQPNQRTYYUUcswsmf`\XUTZXLaOPGVw\PX~IVXURRVXXZWTZZURLM[bYPOMLMLKLKEQgYlZIYqwyj[UWYY\]UOQUWVSQPTZ\_dkuyxwtodVRSTTTWYWTUTUVVUST^ry~yxjVIWndZXVVTPOPPOPQXXUUYL=Q_PKLJGEHJHHJKKIIHIJKHNajHHJFGHIIGHHIIGDK[lqrXGKIEJUSGLPQSQTfbTVWRMIFCEDEFEFGGFFDDBCEEMPNTJGKLKPKIY]SXUOI??@CEFFEEGFDBEHGGHGD@>>BGD@>@A>BEEHJIJJJJJIIHFBIWQ`MA`nkfievs[D67>??><==<<=><=@@98K\ZTKHHEDDCB@ACFG:f?8CKMMLLJJJJIIIIJIIHB==>??@BEFBBPMAACDBAABB@???@>>>=<=?@@>?@@BBBCCCCBABBBBBBCCBBAABBBBBBBBABCCDDFSWF>?>>>=<==>>??>><<<=>@DLPOMLHHHEFEDC?=;;:::|~{W=9876555575434886568:99888643331244545689:;<<:99:;==;;;;:864369;:76545555555444345534467779=>>AABDGGFFDDEECB;9BIHGFEEEFFFFEDC??8137555565555668:<<;:;;9::;==<===<:9BJL`toc[bgggebbdcaM?>?<:?@AAA?=;77:>@@><<<==<>>?=<<<<;:98777677787766435:==:631138====<;:;<;=@@=940:]rh__^[TWiqssonmlihkodD59:987533*0KB024444359977651//01122222331/28=>?@AB@=><72.-/3587789:;;<:89;<<<:73220.+051++-,.044013457875531.+0BMTRGC?;5246553692/*.73,'++*).41,,.0147754551-,+--07;;DOL=:7/*,,*.11370///0121@WPBA/+*+:KG<>JQJ@70-:SWOJKV_VH9456740///4:5.-5?A><;:58PK96:?D>7;>5/3448720/.-/1*;rcE4465579::70?M43006:=:548478::449:::=7/=P9001KSG?><85BXF/33)CbB(--2?DEB:12>DDEGFB>965778:=CNN;2DLB:<<7357.6`c4+,22+)-/.,-5FRN@9;<;87;>BDRRQPPQPRTSRPMMLKNV]aejlkhdbbbceffd]XWUTTTRTTSSUVWXZ[[\]^]ZXWY[]^____^]]]\\\\[XVTSVYVSQSVVTRPPONMNPPPQONPPPPPPQRQPPPQSRPPONQUTSOMMJGFIKJHIGGIGGHIIKLNRUVUSSQNNKJQVXYXZ`ehjklpqqrpg[SOPSTUPIILMNPSVWXWUUUUTTV[aa]aotruxywuvwwwz~znbguqackjhkslcfghggfeghjyvвo~f\gmighhikookt~tuuvwqrĀgoqx|vlnquxz{~itɷmnm\dm|e]adeedeedcdddcddcbbbbcdb``]^}zsryuq~yd\gaVRQRTQLUo}}{ssvkgh\RMMMMLNQQRSWIg~Y\kh\TSTUXZUUWWWWWVSRUX[[XUTUTTTTTTSSQPPOOQSSRSVYbjkkihge`\YbS[SOMJQkdParLWXVURZebVOUTMIKJHTXSQNMMMMKLNFMdcveWM_n}usug_`YMT\TNOU[WQONPPOLP^ffhkqpfa]ZVRPPTVUSZc\WXWWXXXUTYis~zyu`MO`f\WVVXRORTVUQVYRMUULDCGKKJHGIOVPKLJHIJKJIDW|PBFNOLJGGIIHIIH@HbrpXLJFGGMPECOMFKa[GIOQQOMFABDEFFGGFEEEDEEEDGHN[\YONLMNOMLQQNKJAAACEDEEGJHIGIIIJHEDA>=ADC?>??CFHIMNLKJJJKIJIGFFEEHO@jkedinvzr`J=:9=?><<<;<<;9:<>:>?ABABDAETP@?BCCBBCCBA@@@@@@>=<==>?>???@BDDDCBBACCCDCBBABBAABBBBBBBCCAABBA@@?D@@?==?<<>?>?@?=<<<=>@CKPOMLJHHGFGFC?<==>@>CGJKJHFFGA:9;FOJD<>@AAAA@@@@BCCBA@@@?=;:=@@?<9766544334444224324566668:9=BABEIKJJHGGC=8349CLPLKLLIFFFEGE832695343444556668:;;:998:<==?A?==??;=JSLWotj`cfhhghiiidR@>EDA@?=;::;?DFDEGGGFFHJJHDA:68888888877888889888799::8:<<:8:?A@>;89;<=<<=>==>>>>=<<:98999766667877766668<=:61136:?>=<<<<<;>=:86324337;;741/0;8;<8469;=8/2F:6>12EB8-FP4H`]J@I:/6557;?=87>A8554-,GI/)-4==:9879?GIHDA@=:97557:=DLJABKIA;865200)&SuJ6e`.-;>>AFGIHFJI4=1''((&/?HHD<56743/6@:5SRPQQRRRQNMNPPOOPV]aeijigccedb`__\XWVUTTTRSTSTVWXYZ]___^^]ZYY[]]]^^__^^^]]\\][WSRUYZVRMMRVVSQPONNOOQRQQQQQPQPOQRQRQQSTRRRPMLNQPOQOJHHGGGGGHHHGGHJJJKKKLLLKLMNNOPPPPORW\acdhmrrpssk^UTUTSQOLJKLMNQSUUSTUUTTTUVV[kvrpwwtstuwwwyz|{zwmhm~xhekplkupdgjgfnqfdinogǬ~gamrkghhjmopmtyttssup~ƒhmosvy~|tspu{sdcw|`S^lsgbhrrdbbbbcccbbbcdbaabcba``aaba_`Xjwnvrr~{wn_]faWQSRLJWn|zxx~xwuj][PMQIFIJPRSTTWJb`L`iaVTUWUUUUXYYWVUQOPOOVZYVUUTSTTSSSRQQOORTRS\c___^]^cfhjiibFqyLNLKS^lwjRlgQWWWUS[e]RSWUQPOOJMRPOONNLKLLNLINtj]QP^ujXYZRGIEGkqUMPW]ZVSOSUXcoy|z{{|kWTSQOQRPOOOMSbg_ZYZ[ZVTVYagu~nTQYdaYXY]XOOQRQQNQRPNPULEHIHIHIKUYOOPMHIIIJCGfrODGNWSLHFGKLNLKTLCMfq[MIGKEGOQNSOCHUICHIKOPNHDBEFFFFFFEEEDDEEEFFMUXVMKIJIIHGGFECBCCBACDCCC?CIJKLNOLIFDBA?>CB@CCJMLKLKJKJJIKIIIIGHEEB^Ube``l{wuyolmeZM>7:==>>===::;<<<:9:=@FIKJIGDBCDG=t.===;AABAABABDEEFDBCBBAAAAABBBBBEDA?==@BDCCA@?==><<>>?@@?=<<<===@IOOMLLJJJHGGB><=>>??ADFGHJLKJHEA89BCC<<@?GNNKLJDA?>@ABEDYfznOE<78*TZ<=7588977555689:?A9567423345455468:;::=@A@?@?@ABA@@?@ABB@>@BA@@@ABBA@=:9864433443233334555467678;>@BEHHHIHFD@92243:GPNKMLJGEEHNQB34:632334335566688:::89;<>@AAAA?=??>CQYNPiuod_gkiikkjki\ICFEA?>><<;:=CFDEGGGFFHKKJFA<667788899886667:;;::;;::::;<9656;<<<<=<::::;<><===<<;:845789:9886579887767:>>;6567:>?=;;<==>===AIKB<9532-8Sgg_[VT]imonmmljhfkmX=79777763232//12115;BE=75651.-/000022113103689:989;<964000-16667789:;<<=>@@>=:8654543479FUPEBISRJEFHA=<>@=956AMORQLA@?64430/29:86443105;60/11023.-,-,*.7:730--.0028;:8:9;>=731279542/-+(*38?@:4383355,);R[_L?=8=<2FgcI>KcYF93,*++,5<;9:>EOSQNF<620/0.55/-268<7/4>ABC?4-*.57835QfI01432.-./012/3J>41.394.276777:=<4/5:988;8/8=2284/.V],,RumK=I9-22238==<;=<97533++91),069;=BIJGFEB><<<;::;:;<>EGELPA8<=854213:7=j\384*-27;6:FLLJMD.G@#,:JQF2-1249:;<>7/*(-8@@<4,)'(3=;640-,,,4=<=72TSQRRRSSRPQRRRQPRTY_ceggeccca]YSRSRTUSSSRRSSRTVWXY[^bdb`^]\[ZZ[\\]^______^]]]]YVTTUXYXSMMQTTSRRQOORSSSSRQQRQOOQRQQSSTUTSTTQPQPOQUVTRNIHHGFGHGGFHIHIJJKLMNMLLLNONMMNOOPU]cjppssppoklh\WSOQTQMLJJLLMPRRSUUUUTTSVcrphoslinsstvwxyzzy{yui]kxz}|p^oyhhjiiuqcd|w|yĹvmhtwkeikklopnr~}utssssrͅirkmwz|~wrrsxdp~m]Z`hc]daX``tilxzxj`[^baaa_^\^ccbaabdba`^^`ba```Zhzyqiv~vtto`^b[UQOOUbr||yyxxz}s_STQKQ\h_MOUVTSUNUlDUecTTYURTUVWWWUVRYxiUQRUXWWVTSTSSSSRRPOQQUhwqfbaa__achlnjW>dKPNPU[`jmUw]VWUVTTUTOPWYUTRQMLSTOPQONNMMLLPH>f[OYk{dR^\]]QH@WzjQSW\a^ZSPRV\nzx{~kXTVWTRQPNKJJIIWild]\\\YUTU^bo{bTT`f]YY\YOJOOLMPKLUPLKMOLGEHTZNSdXOQMHHGFHA?`ZECOSPKHGNMKSWQN^bUEGc\JHNNJKSUSUPIHECJIIKMNNMKIHGGFEDDEDDDCDDDDDKS[XNIHHIIHJMLGEB@ABAABBBA>BGGJMPQNJGFEBADIIIKLLMLKKKKLLKHIHIHGGGGF@O|f^\\kyyqjgeimmmeN:7;>>>>=:;<>>=<<=;9BOROIEDBDEFJJ8D[NIMMNIHFGHGIFDHLJFCAABBDFEDIdLCCECABBBBBAA@?@@@?>==<:;;;>CEEBA?>??<=>>=?A@@?>>>===?HOOMLLKJJHGFB?=<>==?@@AABEHIIIPIB98>?<:54DRIDHHD=88<=@DGThnq[E<=;9_[D<55667778879:;<;866654110122478;?@@??AC@>???@AA@?>>>??@@?>??@@AABBA@><;9644334433355545665687875:@C@?BDEA:8;941324:CLLKJGGFEJQYSD;73343343444667778::9:8?DEECAA@>>>AKWZPOgupf]enmlkjjjkfWIDD@=>?>>=9=CDDFGGGGFHKMMIC=7466888887777689::::;;;<====;:;988889:;::::;<<;<==<<:973479;<:99766897788:==9537:;=><;<=>=>>=>?@A@>;;8430/=[ibZUWainqpoopnliprX=77677785112211100/0;B<31220,,.///1221121025788768;:7630222598889:9:;<<<>A@><;8554434441HMPSD;@F=64530/3:94233214<>6005615614553/.6?=80//010059:88:<;95037:96563-)))+2==4/0234:@9+0QbhS;9BB95TgVCDFIE;61*+//06:99>JSTOFA;3/.+*+)*-.(*--41->RXRG@745:>;3-6D?55543331/121230<:10-/0/++253579;:85459;740/110355+,IT=0-UoA?L:020148;=>>>?<6434/)+,)()1;?BCDED@=;<<:;<9:;:869AACQO=:A?>AAABGTN0MkD/9;76:>=;=HONQNE`ȶ?)9?HQJ86;:56?EFC<78757:<>>6)$,32/-()48.%2MH67:TSQQRSSTUUTSQPQPQTW[`aegdbaa^ZVQOPRSRRQQRRRRQRUXXY[]aefc_]\\[ZY[]]^`aaaa`_^^\][XWWWYYYXUQOOQRSSSRRTUUUTRPQRONPRRQQSUUUUUTUTTTRQTWY[][VPKIGFGGGHGHIILMMNOPPNMMNMNOPQQOKMVborolggqrmnoh_VNLPRQMJIJJKNPQSTTUUUUTYdia^db\akppoquwwwy{}zkev~z|[`~jdhns|mi{|mcfz—s`prkzthjolkoqqruustuuvoՉlrqprx~wqnnsxpehzwmoswmqo\RyfZegeffgjmnopicefhjlifdbbcddba`^_lzrl|~|zt}zjlsmb_^VSQO[kx}|}|{|||wxdVh`QOQqpPQXXUSQMGxyGL`gXTVSRUUVWWUVWUw{`RSUTSSQRQQSTSSROMN_vljigedbcec\TKTWMRTWX\_^h_UXVSRRRQNMOQWXTRPLSYROPPONNLLLKQABygWKaq_MZ`XWWRHNmpWPUY]_YVTROQXiqorttjRNUVVTRPNMKJJKLQ^loia]^[WTTYYepZSXb\XXVUNELPIJQKI[[MIKGDFGHUfUUwjJJJHGFFGA>==;;<><;COTMGDCABF:ig4=JKJJOIALJIJJIJNMJKIFCBBABCFDEZVDCCBBBBBBBBAA@?????>=<;9?;=ABB@>??=>=@HOOMMLKJIGFDB?=<=<=>>=<:;=?@ADDGLD;;<;624>K<BDFIIHAB>=?NeLA<778777899:;;<:85345531013578;=>????????????@ABA@@?????@?>>>>>??@@A@?=<:645444556556665666689717??;65:<:5217:6113336BLKIFFFEHMSVO<4444333345555688999;:7CFCDA@@?>=?EPVURSi{te]eppnmkijlhZIBC?=>??A@;>>???AA?<:99::9999;<<<==><<;;:999;<==:9976666899::86105<=;;968>>>=====>>;:::<<73327Vlc]XX_jprrqooonnpbE6787777973/134210//.27762131-,.///02211110146666569855334579;;989;;;<<<=?BA?<:86421356546559AKUUSSQLIHG>3E=654422530//1/138;82./5933327:9730259944420.,.59:;::62..46674233-,158:=<52021/5=<2*DjdG7AI>9BabJ?=8:>?;5/,-,,,*+3CRTMC930.,*,0+*,-00+),2-+Mf^K>:;:9:8/,-366740/./0.-143465420.,,-,/6AIB:79:99955:;8431/006<;5-29??4Wf>FM=566:=<;<<<=><5342/-*((&*3?AAABB>9A;9AIE:89>DB5,.2/,.,(4KP?,*BG548TSQQRSSSTUTRPNMNRXZ\_beeeb`_^\XUSRTTQQQRRQRQQRTVWWXZ]aeeb^[[[ZZZ\^_acccca_^^]\[[ZZZ[ZYVTTTQORTSSSSTWXWTRQQQONOQSRQSTVVVXYYWVWWWWTRUXZXRLJIGGHHIIIJJLMMNNOPPONMLLMLMNMIGRdmhba`eqyyh`kpkcVLJLLLKIHIKNRTSRTTTVWZ\XWXWTV^glmnquwvvxyyzwz{{|jX[o|temtxv{oilnswb[`mmg}jhpmlpprttuutvzwqؚhospstw}}~upnpswxz}}~o_`td\vics{{yxvw~{gfmmnqrqnkihhhihedc`^^a^ax~qzuaeni_\\VQJWopoxzy{|zz}usxp[uyUOY[el^SVYYXUQQDsLIRedVPSTVUUVWWVU_zpaVOOQPPRTUTTRLN^t|{zzxsmjfc_SMNBnNOU]_]_^Z]]RZUSPQQPONOPTURQPNRVRNNMLLMMLKMM?Sq[F[smY[eftr\MPkw^OSVRQSTUUSOKTjrqqkd[UTSTSRRQQOMLLNQRSWgqmc^^\ZWWS[~uaTQUYWVQOOGEOMHMLKTWPMMPOILMRUW_ofMFIHFHHE?ABDGQUOO[d`VOMONOJO]ikcSGEMTTPPONQQNLJHGHHIIGHIIKMKIGGFGGGGGGEEECCCFLaj_JHIKS_cZVSRRPIDDEEDDCCCCCDEFGJNQSW^]^ZSPOKKKKIJJIHIIJKIIGGEC@>>@Bt`ScopnibdilptzdK><=>>=<=??@?=><;@GJGEDCACB;|:;FGCLnbMNOOMLJJKMNNLJFCBBBBFC@OaEABCBBBBAABAAA@??@?>>><87:<;;:98<@CDA???>==>>:EG??>=>>>>=AKQPMLLKJIGDCB?=<<<=>>>=;:;;<=@BFGB:8:9426;?;9;?=<=>@>B@88:@>>>?A@>???<;98:;<==<<82265665678A?=>>>=<<;?IRTRUS_wxl`eonmnliiljYFCD@???ACB>>BDDFFEEFDCFJHCDE<557654555789::9:<<<<>>=>>?????@A@=<<;:9999:;==>>=>>?>>>??@=:98777666899:97568<><;;7458;=>==>><<;::::988:87Shdb\XZ`jrsqommkjfQ858677778840144430/022.2<8584/-//../110133113445546876445678:==<;;<=<<<<>@CB?<:986423667785477;JMPOJ=;=:5:GMGFGLB3''9C;55432553/./.03332/.-,.6422127841/./2446540,*,4<=;82/1:?>89=80478:>BFHH@6:;50.2564,8`U?;5,').,-4<9341.--,,4E_jS:;<:93/3:;60.1;62>?@A43BHF?J]OBILFBEIJHC;9:;;;;855210,(')/;CEEDCA==CIEFKG=94/.0009CKLGFLQRLDCCEJKLPLaqTOWPKBHgt]CEMPW_]S``Pryf_onI+*.3<@>@DB;<@:58:=DG=.1A8&(/13?MG;;55;500RQOPQQQQPQRQPOORZ_``aceedb`_^^ZWUUUTRQRRQQRRQRTVVVVVXZ^bd`\ZZ[ZZ\^`abdeec_]^_^]]\\\]]\YRPTTQQRSSSSUWYZVSSSRQONPSSSRTWYXZ]\[ZYXYVTPNMLMLKJIHGGGHIJKLMNNNNNOONMNMKJJHJKJIM[c_\enpnt{o\ZkzxodWJINMKIHIMQRQQRRSVXYWTVWUWY]aefkqstwyxxxz|~ohorq|uyyvz{yz{poqog|sqyZ_^\jafwronopjoxvvuvrxoŦqrsqqqsx}~|yvwz}}qptuf\[a~j}wUkwcjtpmopqqomkjjjjkhgec_[]epy}y~yywcgmh]VURMVmxojopoqw|}~urzvnt~aIXa^\WTUW[[ZWTTDnNGM\aUQTVWVTUXYQTadzgSQPQSWXUUURTZ`ipsvxvpkg]SKLQEeMOU^^]^\YU\tR\URPQQOOOOPQPOQQLNPMNNKKLLMMLPODfg]{{w||wntmYSUXVVWXWUSQLUkroia\YVTRRQRRQRQOOORSTSLRetn\^a`\YUUxwqeVQOUWUSOOKFIMHJNMJIOOObkOJLLNRZ]YNIIIKNJEDHKLNPTX_`]YSPQONNLMN\elkYDHOTUSTURONMJGFFGHGFGGGIKJHGGGGGGHJHFEECECC>VkhJGKQY^][YTQNOPMHGGFFFFEEDCEGJOVXXYYRNKJLMILKJIJJKJLNQOKJIGGECBBA?TbQTiojd_bjpvxxy{t_H<;>?>=>???>====>ADDDCB@C@7wt5FIIHLOPQNLHIIIIJKLKIGFECBBDD;DZOADAAABBAAAAAAA@?>?>>=><67?==?=<;<=<@KQPMKKJIIGDCA>====?>>>???=;<=>>CB>9787418:;>>?<9=@<<==@;BCA??>==<=>>?ABB?=;:<=>???BEGFFFFGDAADGGECBABAAAA@?>?@AA@@?@?@ABA@@AA@@@=9657999888996765666555=D=779755358756865411343;DGIGGGHGHJK=43652234555655:99889;>>===<<<::>==??>?>>>===>@?>><;;:::99:;:;;=>??@@A@BB=6677777666777778>BA><;:95324=AD@=;:;;;;;:9::;=:Hcga]ZY[fprommliijX;596677898523444320/13/1985751.----.0001431023332469:6354688:=BECA?@@>;<>ADD@=::96576666655997:;91+;POD@>8304=ILJDAFK<09A40/012309Rjj[J7362/3>GF;7542//,*/Fb[=:A:3--6<7/(/CA0043=C@CIKE?:6:?FMPSUQJG?87898767753121+(*2>BFFD>;?FJJKJD?@A@?>>6/6EKJOPLLJIB:-0568QPPPOOPPOPRUX[^eiigcbefgebba`_\XUUUTRPPQRQQRRQRTSSSTTVXZ]`^[ZZ[[\_bccdfgea^^____^_____`[SNPQPPRSTTUWZ\YUVUSSQONOQSSTVXYXXWWYWQPSWVROMKKLLKJIGGHGGIJLLKLMNNNMMNNMMMMNLIIILSY_iqojlt{nTSfmkmjZONNMKJKMMMONPQQRSUUVWVWYZ\\[\ainruwxy{|{|zsltu|~xvvvv{qklkigbe|N^|lX_^^_aqm^svwvqfqxxwxqj~kstrropsw{{|~vtvx}}{~ypmmmpe[de|srv|jR~usk]n|oprooonllljjjhhfb]_gjotvv|}{|xswszzmqrjbXPTZq|{{{nbaesuqbg}oc^]b^gfRRY\\]ZVWMh{YPRPTTTXYUTWXZYQzi]|w^QLR\YUVU[debaa`bgkidZPKMPLWRONR\]]]YYP^lS[UTRSSQNMMMPQQTQS[UPRRPNMLNRRSTM^h}o}gixthe`VUWUUVUVVTVT[luk^[XWTSTTSRRRRQPPPRTTRPHMejWU\^^\WQmzrg]USUWVSRPNLJKKORNNNQQP\dQIJKLNNPQRRNNUTRRNNQRTO[mh]WSTUTRQNRPMS]dmcMNVTUWYTPNNMJHFFGGFHHGGGHGGIHGGIIJJIGEDEEDC>H[\JIMSWUTY\[WMFJNMIIHGHGGFECEGMPSTNIGEFILMMOOKIIIJKKKOPMKJIHHHGFEFHCU`GH]jheelsxwwvsojbRD<79==>>>=<====?@CCCCA@DE>[>IJLIKFQ[NKKLJJIIIIGFEDDCBCDDCURC@DA?@@A@ACBAAA@?>>>>?>:8:;>AABBEHHFEEFGJMKGDB@CDAABCCCCA?;8;;:8988:<@EDBB@?==;Gfih^L@=<;:;:BMPMMLKJIIHECA?<===>>>>@??=;<=>==>;876556;;>=>>;;=::;;;=@A?=>==<;;<>>??A@>=;<<=<=>:@B81567:?CEEDEGFEEEDBBDEGGECBCEFB@>;:;<====;98:::::<;;?BA>966799988887775554545>C701478676787456555213446>BGGGHHHIKK>23654235556667:9888:<;<<==<;;9:>GNPPNMCBbyre_juussrokdZJ@AA@DBA@AA@ADEEEEBAACCA@BEIE:3456677767:>?>>>>>>?@??>>>====>>=<;::;;:9888888;<=>?@ABDD;355656766666767:>@?=;::954227=HIA9678999::;9:=;=Zld^ZZ]elonnljhko\<5866799:987643445/-1223566321/,,,-//0014300233/035=>77656889=CGGHGGIE@=?AEC>:9::767766766688767=AB4-48>MPKHEC>56357?@<4211-/4:@AEIA4-,.++-/./573++.///.-,*,2>?<:1-4:8=?:21HVF8:81//1BUVM>1:D1'/3..2//1217BG_{pq]=1,).335@?5+'&''&$'0BOG=730-,*()*('***,,.4856976640//..,,04.*((1Dg}]OGKXZR\e]J?:9:93130-.:F=7>;439=:0+,6E1&+/BPNHABD>97556CNRTOD:85234554113335884.*1:AFF?9>=>>=<===?@BBCCCCF?^PGHHJIJSZ\NKKKJJJIGFEDDDDDCDB=Q^G@ACBA??AAAA@@@@@@?@@>???>=<::=?>?ACCDCEFIJKHDB?@@AABBBBBA@>=<;:8:998:>EGECA??<:Kdadi\G<<<<;:BMNMMLKKJIHECA?=;;;<>?>>>>==<=>=;<9766558:<>?@@?>;768:;<==<<=<<<;;<=>==>====;:;:;:9776455658?CB??AAABBBAABBBB@<@CEEEEB@@AAA@BEGD<4366789878:>?>>=>>??????>>=<==<;9998998877667668::=;99:8532432>LMC;=?>?CD>988;<:GbmaWX]dikmoljkneK8666679:;9:;86444469220+-48001011,,0010242014544546:<9<=757889;=AGKMPNGB@CCA<87:;9877677766677789;;.,28FMJGEA>;7688;=;820//-/39A@IM>3242-,131-06413//2001/-.572:KM6-20/1.-BVRC5,06-'++++-//0.,,27:BaeE2.+*-5/+7FG3,3850/-+0960.,,,,*)),-,+,/121/5<;7778=?4/212464.,-0:FMge=60;@>:8<>;668:A<73.-.-.49Jek_P?:==<:998DKGA;831232345662.19>=;:5,-8AB?87?DDGI@A>:Kpz]Obk}hKS_X[lqnZHGFED=7:AJVZXTWbjmvuoqy|zt9-8786.*&.:AB<4019BC<7<7.6CB>OJ.:F1*@PSSRQQPQQRVZ\_bdddefghijiiigeedb`\XUSSSQPTSPOQRRRRSTUVYZ\\\\]^]]^^`bccccddeda__aababbccdeefe[QMPQONNQTUSSSSTSSRPQOLLOPPQSX[]^__a_\[[[ZWUUUUVVVVUSRQPPONMLKLMMMNPOPONORSMFFIKLIHShtwzy{|lZW[XSTW[WQOMLKIHILNNNNNLKMQSSUVWWVVW^\U\irssy}}w{yfksn||~}vfr}yw|vmklmljkkigkoq{hdbfa^]^bonmzv{tilmhyz|{|vxr{zzz|yuutpp||rmlnqu{}qˑoorrsuvy}uo\Ţqonplq{dVVg}}oqqoonllkhdcbcjpz}lk|uqwqpqx}zu~|plb]ZYXSSYfv|zxZXUSWkv~vsjix~|rpsy}ytnfik[RX]]bempb]qSTZ[VSV[`[WWPG_x\\l~pMFMPSjvsponjb^\WRNOQQPE`LQRWXX_krePgsXWZTTRQPLT][WVVVSTZZ\YQSTSSRTQNLSbtkjooj^UWUTUW`gVMfujjl[RSVUSRRRSSSSTSRSRQQRTTOOGIRVUSSUVYWQ\f]YYW_pp`WVY]][XUTSRTZVPPRSTTSSRQRTSQONMMRSNUXPRTVXW`ءiRPPQSSSRQOQOOU[URSUWWYZROONMLJHGFGHHHHHGIHJLLKKKLKIIHFFEEGKLNNLMMMMMMMLLOWXbg`UKFIIHHFDCCCEFFHKPSSPKJLNPQLJFIKLKJHIIJIIHHHHGGHGGIHCHLB?>>><==>>?@@BCDDIK=BJKJIIKTTTOJHGHIIGEDEDCDDDCCBF_FFFCAEC?ACCBA@>>>?@?@@?=<>??<::<>>=>@BBCDFGIIFDBAB@DEDBAABCC@><;98;:999;BIGCA@@>:Lca`g[TH<=<<:AMNMLLKKJIHECA>=;;:;@>><@???=>>===;98:988:=@?????>;:889::;:<<;:;;:;<>=<<<===;9:::;88756555568:<<;:;<======<<<:98:=GRS?--3100/0111245655688778987788988755545534>>==;;?CMSQOLFA>8>^qe[gvuqrwunkiZHAACCCCAA@>?ABBCBA??AAA@ACED@96666888779=><<<>?@A@???==<<=::9767666557766555678;>@DGC954445654455678:;=<;;:98875443100?LPQSTSROI=7779;;6BaiZUYbklormimgN867667789:9:;876443:A521-/7:2/1256-*0122332136886678:98<@:67667658?FJQUOFACA?:768:9878767777667799<9-29BLKI@59=>5-57863/.34/...5;DI>002.,*,11.,,.6@B5.122782141:G;/.12=E9300(..,;C34FB51EYZJ9785351+*()+-,*+////.1343128;7768?D<48@@?;1/;EHLMDEP?/42-)/XjZP:98/'(8GLXfig\G::<>??CCFC9019;6443346:=5-3?D?;;9/+8C;759>BBED>>CCDLL@6567;;6YnIAWfyWQa^]ptjYJFDDFA:AFGMWajljjstg`ef\[oB7>776.+*9EA:;848HSMIC8217=CGOD+-=DBIPQ[XTSRRSSUWY]ceegggjkkjjjjhfeeeb^ZWTSSRRTTRPQSTUUWX[[\^_aaa`^^___`abbb`bccca`_`acbcdedeedfif]QLMLJHJLMNPPQSRQPPPOMLMNPUXVUX]__cda_]\[XUWVRRWXWYYXWWVTRSTOJJLNORUXXWWYYRJHIJKLKRfpqsty|wbZgibYZ`^VPNNNLIIKLNNOQNKJLOPPQTUTTVXTNT`hhjqtyulz|yvms|h_t}~xl[Vjyzumnsqlqrqv|wwΪgaiaa^]iz~{z{xxjgii`~}z}|pouuvx{|{zz}ysxyqnoqsvynuȕkhrxzw`Qghptzj[[bdis|}toppqqnjgecdehs}}~|{{knzywlggimrihsznZWTTRRYaky|{y~{{jYUWW[envztrnehqyui[`rupnnh^VWYVW\eoglSpcZ\ZUSUXXUVYTQLRvnWVisTHMgqnlljc]XVSRRRSVPSOLPV[ZZdncWUPMSRQRRPQQQX^[UW`^_lupd]XSS[T[rvbkyu~q_RVVUUV]lf^sxqaQV[VSRQPQQQQQQQPPQQQQPQNLIPXWVUUTTTUSNMNOPPQ`smZWZ[]]\XUUTUWUOORRSSUXUTUUVVVTSQKVf\SQTWXYZ^QRPQSSSRRRQQOOSSQSWX[][WPNNMLKIGFFHIHHHHGIKMOONLKKIGHIHGEEHNPQPOPPOMLKKJJKNQXcjgWHFJKJGDBCDCBBBEJNRRLJLMNNFCBDGIGFFFFGHGEFGGGGFFFFEDEGECBCJU^ivwogaVX]jvzP==?==<=>>>?@ABCDEFC@~}>JJJKMLGNMMB9EJIGDDCCCCDEEECEZIGJJGEEAADEEDCA>>??????@?728>==???>??@@ACBBBCCCBBDEDJKHDB@ACC@?>==<;:9:97=GHCBAA??Sa\Z_TUTG=<>=?KNLLKKKIIHEDB>;:;:84:=9=>?@?@?????@@?>=<>?@>=;>ACB@<979899:::::;;;<==<<<;<==;;<>=:876555545769:8789:999:::;:;;<:;=FPM:,0100112222456545643577789;<=;866456778>C>65555445796424323323444333325=BCCBCGHA734443335556556577998:<@@@@?==CJSTQOJD@?:8Ljj_frsoqttqpsdL?ACCCB@@?>>??????><>AA@@ACC@<:8666666889988:<>?A@>==<<;;:887666566667765466568:;>EH=544444555669<;;<=<:::::76656666669CQZ^a]M:5666667973FecTWakorupibN95766777899::97764366::2./5895112482+,.13434678:5/8<8;:59=8566576459=BOZZK@@?=8566788888766778889:;>=7=EJPRA/)5<:3/574.,*-33,-+*.498.+--*')+----,*/?K<)(-16;<:1.3IWF569AD98@JPQM>40-,),939=B@5/22/,/EF:EP>'2VZJ<1,088/,-156750-.10.////..,-.23357989=?@=70079=?518;9>BA>9>MU[]]]ZO?9;76@GHHH>205=>;863237==3-5A@9896/-;D<979=@B@>ACAAFML?43643/=ssE799=CIICIS[gvw_bXGF?ETL:99=PdkcZY\^ULMI@:=Jg\7EC<80.1;?76?<06CMPMJ5)5=BLMI?.$-AIFEE`_\WTTTSQRW`gfegghjkkkkjihfegigc`]ZXWUUUUVUTUUVWXZ\]]^_`abba``abbabbbabdedc`__`bbcdeeeeddehg`XVUUVWWSPQPQQPOPPPOMMNNQUURPRTUU[bddba`][[WPMORRRSRRRPOQRWVMKOPQTY\]\[\\XSNKKKNNPY[XZbfa_Y^f]^dec`[UQPPOMLKKLLNQPNKJMNMMPRQPQQRRRTZ^beflvl]cddut`ad_l}qYTY\`t{{wprvrotus~{ul~ԹvW_aa]`szuxoq~kqxrieu|~zvuwwwyzz||}szwrpsttw|ȝyu{qcak\kq`Ydnpoiltrpqoqsojea``dgjw|zz{~jrrgeedcada^irj\VSSOQbhl|{w{{ndWX[XWY\^Z]s|tk\OQRRW`fmnkf__`^ZVY]aOptJ[aZXUSTUVTTY[TRZZP[n[_peSVdmokgaYVUTQORSWNlKLRXZ\_c^NLURSUQPQPOQQPNLKMSVXbtvla_Xbrequdx|wbTTTQTjeartxgVV`\VSQPQPQQPQQQQQRSQNLLLLKLUXYXWVUVUUTQRRRTRSeobXYYYZZXVUVVWVQOSSSSUUWYYYXWSWvaQg~sWYYZ[YS_|USTWVTRQQQRPPPUVOPRW[^YSQNLKKJHFFFGGGHHHGHJMPPMKIIHFGIHGEDKRTSQOQPMLKKKJJMOOPPW^_QGHIJIGEEGJMPNJHIKMLKLGFFCCDDGGDDCCEFGECDEEEEDDDBBDEGLMMHHKOVippaTYhot~lE;@?<==>>>>?ACDEEEB>_NAIIHKNLKKHB69ELKEBA@AACEFFEDHNHGKIGHE@ADFFECAA??>>>>;?@@>>@AA@ABBAA@?@@ABCCGJIEB@ACCAA@@@?<9::98:CHDAAAAINLLKKJIJHEDB=9555BECABAA@?@CB?==>?>>=<<>>=<9:877778889:;;;;<====>;;<=<;=?>:8766665368898667888888899::;>>>;=CMH7001/1122222343444335667:=?@><778:<>?AFE=656667673EC5455413323455443235:?CBACEF>535443445556666579<;:<>AAAA?=?FMTSQNF@=>=9AaqhepuqprrrrtfK@BCBA@AA?=<<>>=====>@?@@?AA@<:97666668865456899<>>=;::99878787788877776666655689>?>=;9::::865678:=>=<=FS_fZ?12355555784<]gVT^iptxudJ74876666799:::888643524?<10334411//7:1+./13369862/:C8054/3863545765679=HX]O=<<;755667788876777889::9720451-*-/1/00-+++*)***0:;2-+*-//*)3A;,'*-08CC30/4IQC=CGD75N_]`aO?5-+*-9<631/-,+,,,-.39,6F7,=GG?2---+-9FFCOR9+>R9'()&,<=*):IPSJ6(,20/-,,+*++++,.-*144@RJ4/=HNKDD;02;><886/,./*'Ib81?MQE89=<60-+)+4@DEFFFIGCCNXS]jdXOB51394.@EOX^YK_VBGBFQE22>QhiUC@CEFIHKL;29DQjņ8@K?:7403:65=3/;58JOQG49FNVRF?7((34159_``ZUSSSTX`fhggijkkkkkkjihfegjkjgdb_[YYVUWWWVUVWWXZ\]^`abbddbcddedddeddfggfdbaaabbcbcdddeeeghijhgda^WQPPOOOOOOONMMOOOQQPPPPOOT_gijhdb`^]VNKKMNNMMMLMOOSVTPNNOSUWXYXY\]]VOLLMNNLIILPQKJPZYNTdhedb_ZVSRQPMLKJLOPRPMMLKLMOONMNPQQQU[_abehhcZUUdwp]\cdl{{`\illb`vxmqxyvnlqz~zwupnuw^ae`_aktkjgeigkx~xmaap~zxxyyxxz|~}u~|uqstu{wջ~ywoZdrbU[t|vtkmurpqppngdcbdefjbf{|x{y}{mffegjjkihihaYZ[X[^Z]hkq|~l^jucUUUTVVW[\`vxhTILPX\\grtvqjhdeiihgbXmmV[YXVRPNQUSY[\UT`\XYXkl^[jsXZnyod]VRSRRQSQVKlMNS[][YRHIOMKMNNNNNOQQNNONNOLPZbgprkd^^cjvxrppnisgxzzs^QPKaei|hSOW[URSQPQQPQRTUUVVVUTNHEGLJKQWYXWWUVVUUTRRRTTRUbh^VVVVUSRRTWWWTRTUSRRPMQUYXTPbxiufXSXZZXTdM`gZTUXVTRQQPPPPRVQMTPIOSSQOMJJJJIGFEFFFFGGGGGKRRNKIGGGFGFECFPXXUQOQNMOLKMLLMMLLJMOYZSJGLPOLKMT^gf[YPIHJMPNMNOPPMKIHFECDDEDDCCCCDCBCCCBBNbWLOWSNIQ`siWbqxx||trS<><>>==?ADDDDB@Eۧ@DGHJKLLJFA<9@LLGCA??@BCDFGFFGFFGHHGGDBBCDDDB@??>???=::<>;9;=?><<<@BAAABBCB@@@@AABBDFGEA@?@AAA@@@A?><:987;757BclZ8IKJFDDCBA???@=<?=>>?AGKIIH=47999:;;>I_W67>:7554455666555548CFBACEF;435444444776645579;;<>>:>>????@@@?=:975555777764445448==;:8776666789;;8777776667765677;B@85667667678:<==>=<:9999876568:BGJECJR<2\rD40-143/+-238CC4-///-*'*7ANT=)*),282,0562010*/9=7311AKDCGHA2&5O`a\VQ>*++08<;>:41-+,,,/.5N=3N>%3KQ<,*+)+6>CHNPL8.FD.05649A?-*?ZgaI10:8/..,*))-,.//1/*)-.DldORQJ;.4<;7:BB;@HA<;6//6=:255;HRPG<98543289:?HKIMWULGVVD]fQECAA:463/7=:?LI=55;737<<952279/(,450/215CFB?;:=>86?IJIOTURJ=2364@L?=>785AM?:=@AABGIEWUEHLGB==HWfi[E@D@8:GILQ@39BCHd^:>=;<716C9..';I1-BQJJJ=BOYVIEE<3-%".4]\[YUTWY[bhihijkllllmlklkigfghhhhgec_]ZWWWWVVVVVVWX[\_bdeeedeedefgfeefghhiihfdcccbb`_`abbbbbaba^ZVSQPOOONNNOOONNMMNNNOQQONOONP[gjhjhebbb_ZSLILMMMMMNNOQSWUMHKNPTVVY[[]`\TNLLLMKIJKLNMKNPNKMWchjjhd`[USQONKJLMOQRPONKJLMMMLNQOOQUY\acefflk_\aqw_[_Zdyyh_oymll`fuxqhmtxslblwxywwursuichdbfe`_[`wxjc`bcdijmwrg]f}}xxyywvy}}w{urqxedЩ{rlkwzsYtyncZU`uxrrnmljkmpniedfhjigiabvzxyrlonjmnigijiklf`\XYenuolmi|wnkhTAJ[ipiZTSSUXgtkS]ysRHX_ab^Xdeaffc`\[bge`\kpb[WVORZUOQWP\]^\OUPTa`]_r~WKRav}{{|yjdkpiaYRNPOQWWRVN^LRZa^ZRPQRNQTPKIKMLLNNLMMMMNOSQJS`hd^[^fmvwmf^Z\]`ckw~xup_SPuslnWQRUUTRRQPQQPQRUY[[[[ZXUPJIJGLSXXXWWVVVVSSSRRSTSQV`_WTTTRQPORSUUVVTSRQRMD?LOOL\tsoѥ\IOWYZY[[WQQTSTUUUUTRQNNPVXGHUcKEKLMLLJJJIHGEFFFGGGGGHFKRSOMJHHFFFECFPWZZTOMLIJQKJNLKJIJKLMJMYZSNW\YVTRT\jlfdVOIHKW[XVTTROMMONMLJGGFFEDDEFECDEB?NfiQMWXYUNGJ_e``hv|zzyok\B:??>>>====?ACDDEDG?H}FEFIMKLJGBA>AFJGECA>?@BCCGIGFFFGGFGHFBACDDDDBA@@@BAAAA@@>?@><>>=<>BBABAAAB@@@?@@ABABBCCA??>???>>ADC@>:8889@HC?=I]^_[X]WPTQ>=A>:?LMMJIIIFECA?>><;;<=???=;<>=::@A@@@A><;98767998876554577655566789::=AB:323333332232334435656776:>BFKIECEHJH@735999::;GTQF7;>:86678::766666632>DDBBGG:44655445577764545799=AA?=>=;;ALRVTPIA>??><9Psyihx|vrttrqbI>AABCCA?<;;<====<=>>=>??@@@?==;64444677::887645<><:9777788889:<:7667776668977877;>;7689:<><;;:9:;;<;;:9998776569;<><9665@[U62654445778895?[]S]lqvlD8=:777764467779989875546568774/,/00/.484/-.0031477;6**,//-131255566776779?KI:36753345567876557778::<@EKKC=;A9.@S80+'*1/+.7<69LK0#)3::68AJ>?K7()))/DI@?=:6476-),.2567=78GNM>-)$2V[JKXJ.(,276?E?631.-,,/4Bom=Xe2$9R=()-1478>KPF?87C?1*0Kkc92NL810/0/...--.,,..17AQbVIC6-19@?@?69@7>HHIIC==DA00AGEBCNVOFD?:=CD<41257=LRIAD=@WF*).4A@642131/8KID?9:6349=@ACD@?=:63651336;9558;::;AJJDDOX\YD.,8;<@77=4222ANC;?DDB??EFGJHIIIFLTQKIID=>DD@>AELK;489:<:Mxt?,:=:9:FI2,-4@?>>=?ACDEGFFD:cj>DFINILKIDEEEGGGEB@>@ABCCFHGFGGHHHHHE?>CDECDBA@AABBBCCCDDCCA==????BBBBBAAAA@@??@@A@?@@AA?>>>>=@@BDDEFEDB?:=FH;9?IJLHFFFDCB??=:GE:5KPFIMLKJHIGBAA@@@CCDEC?;<;8668:<;><;<<==???>AB@?>ABAABCBA@?<9667:;:;<<;85676555666689:;=:::9::864332222454467666679?;8677777524>ECAEG<7664544553564443578:<=<;;:::>;In|igw}uquvriTA>A????>>><=<===<:<====???@@>>@=766665689:99877;??;97779;<<:::;;96678776679:98878::87899;>?==<;;;::;:988888788779<<<:85616KH346554457788986N\T^osw{Z9<>878876346777889875431468<1/@K=<=BHGDC?:6031(*,)'>YXPNH<37<3*)*/38::16OWOE4+)'ASGBNK<-*384>F=6441.,--Dr|KP`C('=8'(-0542;KG74:XD018=><4,)'')*,7@IYZLD9.(.9DB:46;38@;KLLQJBBCEC@DGKMI>=HSVVNC?=614/*(,-4940.0;H;672*.;73311-,7FED?:877638@JNKE<8@H=27765530,0;><>CKMC;>DN[_E2CJC=8<@3(+.3;?=;?HHC?>BD?@GHIHPOE<9988:=?FKGADIB76769==9AK8-:?:9?M?,,DQD0./?U?',79>?BMYXUTD.'/7WWXZ`dfhkkjjihikllmooprqokjkjiihffcbbba`][[YWUSRRTWY[\_aaa``_]\]bffgfffggghjjigfedcba]ZXWXXWUTRQOMLNOONMMMMNNNNNNNOOOOOPPNNPMMQU[djlnmigffgcXNJJKKJIKMPSSTTSOKKLQXZYZ^__a_XOJJMNLKLMMLNNLLLKS`eiljhhe]UOMQPKMLJLOPSVVTONNLQUQPNNPPRW\aeffjllnnjkk`gzrjlke\]b`ZZ]cfhjnuvguxtstvvutrpoha_`a`guypjhfglqrprtuwwrmkq|{yzy}~ys{yytl{oRZ[T]ȫzwtqrqnlmmixqd\lse^[\[[]fruqleZ_vuhcflonlkkkhmxxrmkmprqpmkjjmmfb`XVUXchge]]d`TQTZas]NUQRX]^Z`pkTRZ]Wa|Y^jkleiooqsiivq\WT]zqbQOUULfeX[NQQSVY\]_`YYypaYZgluiNKVccahsvUadVPSVfnii_mn\^cg^UTRNNPQROPY^[ZZ\fmlgd_\\^_agjjnnf^\[]hdYZ]^`a_[csjW]app`_UOT\ZSRQPOOQPOOTXYYYZYXYY\\TFKUWWWWXZ[[YVTTTSTUUVVUUVVTSRQPONMLMMMNNQRJCDHHIIIFDHSeZMOXUVRNMMQVVUTUVVVUSRQOQPPSW_[ROLIJJHGFGGGHIIHGGGHHIFHOSPLIHGFGEFECP[ZWROMLMKHFEGJLKJJIIJKJJLPOR[`^[YWUVWZWNRSQMNORROOPPMLOPPQQPKGGGGGDDFGGGENkpUBHOQQOQTVSVTOMS]nvvvqlgWFBCCB@@AA?>ACEFIHGF;I_>GIICBFKJIGGHHHHD>BBACDDDFHGGHIJJKKIFA?BEEDCBBBABBABCCBDGGFDB?>@@@@ABBBAAAAA@@@?@@@@AABAA?@??>ADDACCDEDCB<;BGAAQ^^][Y[VMRR@:>=:=HKJHFDDDA@??=<646-.)?BDCBC?9667<<<==<:;;<;:<@CDEDA?<;>@@AABCCA?>>:45:<=AIIIH>:99899887889;=:7:?A?=854432345655777787:::<;=JQQLB?DD=9::889;75434554333434444679998998:;>DOSSQMFBCD?>>@A?=<==>?ACA>==>=9;<<<>??@@>>?>;8:;9778;:99867;><99768:;;;989;;:7788887779;987678899889;<:;;;<;;<<=;9666558;;:8;=;:986435;=645456666678990<899975567778887664341/0>LJ;&+5654232433.-..05871/-,,-*+//1024446667666772253223456677654578886/')/24428@8--2=JTN>63+.@HDC<5EC,LZ<18DJC>41;ADCOR[WJJD7;??ADG?4++/0-5A?ZddXD=?<;>73?OVOF>3,*'&''(),///047Fc_?00354321-.9A974678;8129>>96/)/DJ;5::874115>AAHKJC85:99HXQT_[PE=A@4+*-6?C?</*.0?ABBA@ABDEDD?=BEFCP_]\\YYUMQP=;@C===<:8937BKMLKIIIHFEDBAB@=<<@BEECBBBCA<<=?@@@??<<;;<;<=<=?@DGFC@:6549?@?>?ABCDFIG@::<<>@BHKB>??@@@><97669=@>=>?><9766555677678899979:::;<<>DKIBAA>;=<;=?@?ADA=;9::99:=A@>76778878756=BAAC@55434796534355664589899999;<>ENRSNIEEIHDA@=GmvhluuuvurpeL;=A?=>?@@ADEB>=?AA?=<;;<==>>??>>=;=<:989;:<<83147766437:;:97689976789:::87897655679;:8789989<<<;<<<<;9656458<=<:==;:998555654554466677888943LZ]juoT;489:;:87677767987777654-.?PK6535;;:850+.000//138963,+..-+00//1223466666557767920323323555675137999:?C>BB>=<:884/.3.<`YMMD713442.-+)+3;@ACF>652//.34-?><=BEJNF81483.,1>D=67::40;E<,(/FTMHRVU]e_N8)')5HPZ_]P1)>=?BFGGGGHFEEEDCDDDDDCCCCBBBBBBBBBBBFJLKHDA@@??@@?AA@@@??>>==?=>ABB@@?>=????B>?ACDDDAAFEDEXa_]\ZYSMQK>:@HEADHGFDB????>>=<<:9:::BHLLKIIHHHGFDDEB=;;=ADHFIIJJD>>?@B@>==;::;<=?@@ADFFEB>:5/27:=>=<<<=AHIJKKF?;;99:>B@?@ABBBAA>:6338AEC?<967887777788888999:85545<@<9=CGDBA?>?@ABCCB@AAABBAA@?==??<477666788769=@AC@435249<9534567766688:;;;;:<<=DLPPJDCGLLJCA<=@AABBDC@>>AEIJE?;::<===????=<>96779::;<82-/34441037999766898879:::::754554667:;:9999889:;;;;;;;98666568<=;<=<;:999666655554456677788870;S_hq]<4557;=:77888777889;:8544-1A?1/697568971//23321377764-/2454721/1122344344457642454333222333563047879?@><:72/-,2?7@>96468::961-.:ITWNA85676537=64OdZA3683006886--0-,G[A:ZY9,+0<@:5-+4>CA:52/-/1/1211026@HZkwsP249<850+(.48=@CFH<78748;1@K>:U]>B>Q|wUA6-,6GB98=51&>dkacfqoV6&),*)('*9:]l;*)'%%'(,035/'$&.:BLUM?=BIMOMKIHIH@77504C=-16855446:?FD932334642233322342'.GJ73=?6+**-,+.3567541/A><===<<<834=:HYXXVG;>DA=?ACDFPZZN9(+8EOSG5.37/),4737964520;A6)-5;AGNTRSZ_[RI>5++7>JTL;2@NDTTRQQRRUZ_dhmpnnmigioqqqppoooljhec_]bfdcb`^^][ZZYZZZ[\]]]^_`]VSSTX_cdefhhhjkklmlkjgcaaca^\WRQRRSROMOQRQPNMNPPONMNNNOPPQQPOOMLLNNNNMIIMONOS\bdiqsplkeXPMLMPQQQQPLIIHILNS]fklmnlfZMILKKKJKKLLMPOQZ[[emmkjiicSJV]TcgOKTdaIQ`WQW[XRRRU[YSPQRSUVXXXWX^fggim~x]WZZ[_diigۏ_rtstttvxwsppponoywspp}rggqwursz~rv~yvhemn`]]XUUV[`]SqDzjkt|f[ZZ\cijkswrmaUWfmhny~|lo|{zxvwqnrqquuqmnle`\TXdds}hsu|h\_TKJKLNQQPRPTZWXYWWWPMNOPQRRPOPRRSUOObbXYSmmZUNTOLPVST`RSWJPOPPOMMNNNPW[QPuiWXZXUX`jrsuuYJUONl|yjeu^hW_babbdeca__^[XVWWX[^ceca]^]Z\]___\YYYWWWWY[^cdeda]ZZXSLY{fX]_[YVT\dljVMMLLKKLMNNS[VX\QOPRVYVPUZYYY[\ZWTTUUTVVUUVWYVSRRRRPPOMKJJJHINTNHGGGFFGIIIECCDFbmRIMTXYVQQQQPPQRSRQPOMLLMLKIHFHIIHGHJLMJHGGFFFGHHFHNOJIHHGGGGHLOTOHGHGGFEGHILKHIIKKLKIGFGTYSORY^]ZWUTUW[\[[YVQKLMNNLLKLOMIJKMUdfev|xohbdocMGJLLHFJJJKMLMNNQTNFNV\^gdWLHHHGECAA?@ABEIIGEE>G@CCCA@ADAJMNHHEDA@@?=<<=?CHIGGGEBBBCCDEEEDDDCCBBBBAA@@ABAABDGIJHDBA?????@@@@?=<<<;;<;<=>??@@?>>=>>@@@@BAA@@BEEBEXb`_\[XSOPH=6?IJEDDDCA?>==>===;;:::::>GKKKIGGHHHGEEC@;9;?@@>===;==>==@BABBB@>=<8529>><==<;::=EDBACFA=>9<;<>?@@@?@BCCB@<841:EIEA>:55667789::::999843458;>@ACCBCDDCA@?BEDCB@>??AEFDEEA=@B=:577664677678;@AA=43314;=;544568756666:<:<<9;;cwkioppqtswrV=;>=?@@BBBA><=AGKMLGA<<;;<<<>?>>?>=:545899;;7432444434799888889;<<9788998754666:;9::99999888::9:::9987666568<<;<<<:98998998876565676777666621KbllH02126:;9779:9777779:;;742038.-851103798544567625887667:789974100122223223356522667643223333447:5589;=??>;<=>>=;:72-,+))(15/+-8BDEA@DA==H]\J@;9;<=97:AA6A[P1'+-/37>AC>77:86JT94WW:-.*/84-3?IKIB921../0.-040.,8I@/-8;58HD90.-,)0:=@BC@=9643156,0766;@4,4[dN3*()'+:BQaJ4-(>]f`dkpdJ4/-.-+*),7?dJ.+'&)++-/2561.,0=KOPK7(&(*-2:@EJLNNMJA:42203775534454JWF:61/2443224799777/&1JK74=7,*,045444322201;9-*(&'-882348;<8203896@QZY\^VQPQKG=8<95301:FB8MLLPV[_dlonnljiiiggkpqqqqppppommljf`]ZY^abbca^\\ZXWXYY[\ZYXZ[ZVUVX]bdfgikjjkkjjijjjgc`^`a`]VQPQRRPMMOQRQPNMNPONNNNNOQPQQQQQOMMPPOOOPPQQOLLNSW[bfhnpmjc[SMMOQQQPOMKHHHHLWekklnnlkbSKKMKJKKKLMOOPNLTcopmlknlbYc_Mn{hciePTi^MSYYTRPRY^XSRRSTUVUVVTRRY[]o}w^UWX\_e|lxvrstuvwvrqrrqlq~wvwzwooz~xwvx}{zpx|rktnZZcb^[Z\\]beXpmbnq]XY]ejruprrofX\vxejtw{ztu}yuvvsokknpqrommia\ZV]`[mnorsjXZTOJJKNRVWSTTRVYYZ[[ZXVSRONNLIIJJOTONY\WVVMje[^UbRIPVQVcNJRLQQQRQONMNMLMQRNRs}XQ[YWXVSbvsjkVT_MKOtueZRSy|ah[]baaa`]]bknf\XTVYZXYZWWZ\ZYejcedb`[UVUSUUVYZ]``_^^YVVUTJd{cXXZ\YVS^vtehfVQPLIJKNNHMa`]kUMr`OTWVVXYZZ_a]XUUUUUXXWVUW[XSQQQQQPOMKJKJJJKNPKGFGGGGGFGFECCIPigWOPOR[\VQPPMKKLMMLJIIHHHIKKKJIHIJIHILNMJHFGFGGGHFGHLNIGHHGHGIKIRMCGKJIHGEGHDFFILKKLKKIHEELVXSOT\ba[TORX[]]\XWTIHNMLKKMMKMRNJKKQUYjxviaacSFFFGKKJJJKIKIIJLOPONKLOS_e]PKKKKIGDB?>>?CGIHFEB;uq=ACBBBAC@CNLE><=<<;=?BFIJHGFDBABBBDEEEDDDCCBBBAAAA@@AAA@@CHKJGCA@????@@@@>>=<<;<<<;;<=>>??@>>?@A@@@@??><@DEGHPSRSUWVSRPH?9AHHCCFDB@???>====;:::;;<>=<====??>>=;;@><::<@?:79?@>===<;:9:BG@?>AA>@@=:<8:@?>??BBCDBB@<75:FIHHE<5567889::99866;@FNSKA@@BCCABBA@@??@B@>=;<>?ACDDDE@;@GA96455446665667<=?835536;;8544454566778::9<=:;;=FKGDBBHMOTQE=>:QslgnopuwstlP>>>>@A@@@?<;?AB@<::<<>>?AA=;74578898777644315:;;;;:::;:4224543333223487658768625787699694556300222222222445533556664212699754650037>=;9=HH95HB*')(+048:=<=>??@JN??OI?:61160/FXWNG<2/.**/7@A;M`H37RU;(')0757J\emu|u^D988;610/2:@SW95/,498236;BACE>=CCEKA-'**(''''&,126?FSTROH?8544430231CfoaS?01366667:==:9850+4CA5980./37;>?<3,,..2971.-02(*9;11;>941234:CDQZK>=/,330.-,4I[`W=5>BFGMK:0153,,7977653453028BGD>=<;=ADHIIGFDB@@@ABDEECCCCCBABAA@@BAABAAABBEIIE@@????????>>>=;;<=>>>><<==>?@>>?@CABB@><<=>@DHHC>==@DJLLLJGCCFFCEGFB@@BA?<<<;::::;;<=>DKLHFGGGFGFDA:9<;:BPF??>=>==<<<<<<<<<;;:679<>8468<=;98;?>==<<<;;:;>FE@?DC@DJ=73368;>?ABCBCCCCA@829DHHFDC@<;:;;;877799AUddSFBA@??@?@@<978:9876668:;<>ABDDA<;@D=74234566554546;<53765996643333455689;;88>?<:;?GJE@=@BGKOPPK?8DmogmqtwusteI<>??AB@>>>?AEGJMI?:=BFGF@:8:<==@B@@>::988559:::864347;<<<<;;;<=?>?=974455457778:;:877888877778::888999:98989<:;<:88889:::;;977667777778998894AfpR97:635678;;;<932454469;:62233344675542675368851/1121255295485100/133222223454327845542136:9754/-.-,.2745;:9:<;<;:8530)*;UTGhwKZbUQWTI='4\]J?77975538GD5-54+)+)')+-.0033448===BFEA;9<>=8?V]TKE9.//,,-7Txqg~X79>:2..1203017:76:3)*/143,+(%*41(*0246119A5.5_uH%1nj><9/6Vs{zM7;>@A:3455;@?>=636>>75:?FJMTPD>;6=E:/--.0220-+-/.+))-28EPTUL;/.0018<;<:771*0?FKI@<974242/01.,,.9@9:HK>0.C[VLOD1+---1===HMD>9-.3.-,.6<:4^`dgijkkjklmmoqpqpopqqrsqmmpqposrliic``]WTQQTVWYYXXVUTUTSSRQPQRSUYZXY^abbcb_^\WRRYciifd`^\\]^ZTPNNMKKMMPQRPJJLLLMNOQQPRTSSSSSQNPPOPPQSRRTTQLJJGFDDECDHJINTTTVSQSRQNLJIHGFKNMOMJNZ]SPQNJJJKJKLLMLJKYgcb`Z^dfhgcbaZXXU\diim}SR[[PLX[ZZWTTTTTTTTTUVVW[^WTZZevr]WTZjdpҧxwwusttttssrqzwt~jdovx{}sdl}}y{wnhmrw|vX]kibdgdeif]cӿzyv|p{r\X\ejkilonpkWVn}xz|{|}urxzvsqmmmmljkjgaZVZ^]^___fjuʽ|qoqQSPORUZ`_]\\WQPRUVXXVUUUUVUMFECBA?EI<<@BDDDCBBBAABAAAAABBABBABEAACDB>>>>>>>>====<<;<<=>@A?<<<<=>>>=>@ACDEB>;:;<=>>?>>;::;@FHKOKIGDDFGECA@BDA>;=<9889:<<<=>@FKHGEGHJLHHA:7789>D?==<;:864589::9966569<;8633457657:=?>=<====>>==AGB?EEEGJ:.+38:;;=ADDABCEDDC@818DGFHJE>===<:779:<<=GQI9:A><;=????<711222344445568:>BEFC<6:=95224555545646;:8:;:;<97665432555778;;67?B=:<@IJE?BA::;96239;<=;8789::::;;;;<===<=>:63355567778:;:999888777668;:86799:;::99:::;:888878999997777787888999999;5;_hG557754226?AAFG7,149?DC@<85331244688865877578:3220-+,,/5796463002484233233234300563343226874210/010/-)1<47:<;::;;:646=5,GcXBYttV`e_]ZTR:%2TWE8420,,-,2A@3-...,+++--.-----,-,-07@A9547@A=@LWQGA;6467:82,:hhXl^9)).01551,././3555.(+4?=7244088:B<4777737:DV]c_G<;65:>96634512121/4:;109<9;HM@,(./1<@<862-,,2=?BGOYROSPMMJD@4,1873.,/0-(*./1/&%8EA??;8863@T^c\QMLJGGGHPTFE@2eedcgjjlnmopooooponpqqqqqmnqqnkoqnllib^]\YVSOPQRRUWWUSRSSRRRQPPPRTVUTUXXVVVUUUTSPR[bddec^[ZZ[][TPNNMKMNNPQRSRRPONNNPPQTTTSSUWVRNMOQQQQQRSTTSRRPNMMNKGJIFMVXWXUOOSURMLKJIFFGGFGJLONINVUPJIJJKKJKKKLRVSSQRZ^`eijjf[RSVUSSUaujYTMSURUY[[YXXWTSTUSRTVWX\aaa_UQ[chs~sZZkdxsqstx{yy{ur}{ojjpt|sibcmojjquuqjkfhzsuj{~uqtofccbYWu¦~ywytu~zQZdmrqpqlhh]Vl|}~{y|~ztpjijklljee\Xr|keecchfaeƧ}ns[V^Y\ab_`egc_c_XTQRRSSSTTTTTOLMMJGCHN8_ELPOOGdn^uytpuvTZZNKIOPMJLPNNNPQUWSQPQRMLhtTPUVb~kafpcUUV|MQTY\TTUQN\[QS\[\kyvbUZWRX[bif_~ɰk^jjklifffddgc_VPTVVUVVTRVYbe]\apzxgUTVST[[WVQOQKSZUKMJKKCUVLINSSWZY[]]\YWXWVXYWUUZ`]VSTUTSSSQPPNNNLKLJIJHHGGEEEFHMSXVTSRRQRQQSVWYZUTTTQPNMNLIIIHHHHLIGHIIJKKLMKIIHGFGGIIIIIJKMNLKKKKKLJEGONIIIJJJJJJIHIJIHGGGFEGGEFHQ^[TZbecc_WQTXUNJHLLORSZYWcbM??GKIFDDJGT{ymWEHIDA??BDDGIKLLKIGHJKMORTTQUffOBDHJIIIKIIGDAADHGEG>O=BCCBBBBB@??@@@@??>===?AFJJFDDCAAA@BCEEDCBBABBBBAAAACCAABAAA@A@@?>===>====<;<<<;;;<>@A?=<:;==>@>>>>@ACDE@=;<<==?A?8:<>?CEJNMLIEEFFAAABDFB>;:7555679:<==>AEGFCDFILHH@87899:::;;<<:8544799:;823;B@;3022333323:?@>=<====<EI@ACAAF:2=>@A@><>CFDCDEEDDDB83=;9889;;;=A@:9?>=;::<=>?@A?;642356566654458;AFIE<4699854455667756=:9;@AA?>=<;;:86677678::66<@=;;ALKF@>???==BGNUE@]ljqx}|scNB@DECCDBACCCGLLIEAAEHIIIIHGA98;<>@@>?D=6;:84359<=;9:<;;:::9:::<<<;<=;643355677779:999986676776689865799:;<;::9:::8877767787778777888889999::;;68W_?2677740.0=MJENH@HOQPOIA=;64412369::989;;<87986577740025786462003;6.0667873,*8VS14<5.+-18@>4232232243-*.=H@3-,/28A@61220,,.++FG(0B=560*3).6//5>;8:EMH>527==82?UO>89<6.-;MH4)),1:*?dR=<:98444689::::54T{vZIJPSQOOSVUUOC:9=92/1;PZ\UI?45?HM<'(0029<=??>=BEE?5,(,1;>FLPYVOMKIMLD>4(.<=87531/--.////26:9779991-59;ETUUW\_]XTUbb\R<]\^dhklmnnnoopooonnpqpqrqpprqpqjgjkkgfjf\Z[YVUSRPQSUTSSSRRQRRQPPPQRRRRSSSSTSRRRSSRT[^^`a_\\\Z[[XTONNLKMNNORWXVRPNNMMNPSTTTTVVXYTQOOQQOONOPQSW[\[[[\[TNLJKOQSXVMLSWUQLHGJJGFHHHJKLIFIRWUMJKLLLKLLLMMNOONPTWZ^djkhhhd]XWQQYYSNNVVSSTWZY[][XURRVXWVUVWVVY[\\VTXTTb{qbdcq~zyyz{wy|zuwuf^ire\oxw{mfjqlikhhqropi^pvlxwmcbghbe|Һ}{yqtoy~Vfsmojfnmga\l{xv|xurnfejllkf_\x{dqswyywkdyβjurYZ]bbglgbfiai}}qd[VUUTTUUTUTSTRSRNLRVBrhBFNMMH_tfkposx|w_RRKMPMMMJKQPLNSSUUSRPQRSOMjmPUTg}e^dnfUMg_SYUWWRRQZisTQW[Wk`bfeZPSTXcg^Շܾ`dlqwvrpprl|cORVWVVVUW^badoqrxwnfZRSUQNUXYXXVVKJSXQOQKJJGGIIGGLT\]^`a^ZXVWUWYWVVY]]WUVWWUTTSQQOPPNLLLKIIIGFEEGMPQTVUSRRRPOOQRRSSRPQSRQQPQTMHIJIHJIIIHGHIJKKKKJIIIHHHGHGHIHIJMOPNMMLKJIDIKLHHIJJJKLJGGGHHGEFGFFFFFEBGW`VRUZZSSMDIRRLCGZ[^ggfcrnJAIGFFFFDBFJBMqtSGLKGGFDDDBCDFIKKJIHHKMOOOOQSaiTACIHHHHHIJIFCADGHGJ;L=BDCCBBAAA@????????<<=>AEIGCCDBBCCDDDEECCAABBBAAAA@BCCAAA@??@@?@?>=<=>><<<<::;;;:;<>@AA??===@A@@??A===@CB>;=><:=@?><<=>=?BEKNMGECBFGEFHIA;731257789=?>;::;??><:AKNFC8999;<99:;:9:879<=>=@>:8>A?721432112138=@?<;<====<::<<=@EB<@CH::>GECCDE?=@DCBCCDDDDEE;7=B@>?DH@;79::;<>?AA>?B><<;;:;<>?BDCA=853566666554359<@EB:46:?>95468998:<><66ADAA@AA@BCDA<978878778:<<::DMKE@?@?@??><>CDCbojsy~kM@>ACDDDB@ACDEGHEB@AFJJIIIHHD<78;=>??>>EB588774479;;;<=<;<<:89::;==<=<523333467776888:9976455666688657889;=>=;::;::8656767787888777888998999:99;96GO<26666654-4LTLJQ]hdRA;89<>;962247889988<;<9542238=ED434:98521/.03<;53334432122/1112332226;:410//121110=@+%+1767::971;gj:1/,,+$%5CDW]?23-)2>;5343-+,,0@F:<<=;:=BA:46789:<>;4,/;9=>54<=847;6/052//452////.-0:4'(-.,/9GJ?324/142/00-,2=E4(+,*,1;>94321-++'#)-+)/0,+*),//..-3?V{m1'+,,-./0.+,-2=;2..-/5:<4/Xk<0;=746?FD?LZO900/9LMAALO7.35995-)3HM<,,,...7;8634764589:;;::8@]so_RSWQHEEMS\ksjS=:@=?M[a_XJ<:@C;37;2.256437::>BCELK?2-27=BNQPY[LCCGHFA9/'.;96AJC94572/1@QUME@9952;BCCBAABCEIGFLV]\g}vkQU_fjnomnnnoppooonopppprrrqpoprnia^gldciibZY[\YVSRQRSSSSSTSSSSSSRQSUUUUWWWVVTSRSSSRUXXY\_]\\[ZZZXURNLJKLMMORSROLLLLKLMQTTUVXVW\]XQLNRPMLKKNSX[[ZYXVURONLHGIKSSMOTTUVQHBEKJHHIHIJIIHGIOSPLLLLLLLLLKKNONNPPQPRWahijopkc[WVVVU\r_PTVWWYYYXUPRZa^URTTTTUWW[_^ZXXTYbmoibs~}|vrpoou|ylgnrojicoxdgs{|zumiijjnqiYYyqvwikq|п{yxu{|rlqdhngdglojbco{{ysj|zzvquoehnmjcZlq_iiffgic_bkھfxlRQVZUWhmmmll|vuvxufYWUTSTTRQQPRTUZ^R[aNIJMOPJ\linhiu|rcSNQRY]YVVVX\_ZTUTRQQQQPPQSNOu]US`dPWfieTMgpUVZTQNPUg{jKUVYTcoJI_\PQQRTRMoիpajt{zwvuvunrrZQUYVTUY^_^cssknk_XVTSRSPPWYWPSYQLOQLIPVPNLLIHGFIP\_`ab_[XWWVVWWWXRPZYZ[YWWUTTSPPPPOMLLKJJJHFFGMTUSPRSRQRQQPOOPQRRQOOQPRSSTUNIIJJJKJHHHHFFHIJJIIHHIIIIIHDIKIIJLOPNMMLKJMGIKKIJKKKLLLKGGHHHHGFGHHGFFFEFGQNDBISE@A>AKQRNL\aaihacdJ;DNOIEFFCACKKEPooNJMLKIHFDDDBBCEGIJKJJJLMMLJKOWe\HCIGGHHGHJIGECFGHIJ=rI=ABBAABAAAA?????>?>==<=AGHDBBBBCDDDDEECBBBBCCBA@@@@ABBB@@??>@@?@>==<<<=;:::::<==<<>?@ABAAA@?DDBBBAABA=;;>===>=;:;==;;;<;<<HGH:;9:<<:989989:;>?A@@A@<;<<<===<::;<<;?GD68B:9:;;;:9<<::9::;=@ABCB>9532357887666777;><717;=>>:79;;;;=><87:<@AAABDGILKGC;7899::9:;<::DLIB?=??ABBB@BC?@anmtxyR<@A@ABBA>=>?BEDDB>?AEGHHIHHGA968;===>>=AB9677743689:<===<=><99:;<>>>>;41333125777777898876455544566568899;==<;:;;;:7667877778:988778889::99;;98998:=:777778982.=QRT__UJ=3324;BA>:63.,.3779983695.+,07AHD3+3@?531,.3505@?6222233222101012431..01//011334568;8,(*-125799:7357//121/-,--0AB3..))/3/5:8642108?<;8<>>@AGE94557<723?NPS]K0(,,1HXNELJ=037228<;.'+BFMYbjjchj\HBAEDJYenfI6=ELVVPKC<=I\jhJ584/66679<:8>EB=DJC:9<972-*264?UaZG6452.6L^`]\WNI>5HacV\aVJILLMI=78;BaU[dflpnllmonoonnmmmoppppstrpqqpqsm]Udm_[gle_]ZYYWURRRRSSSTUTTVVVVVWXZYXWWVUTSSRRSSSRTVUTY^]ZYZZ[[[YTPNLIJKKJKLKKJKKKKMOQTVWYXWZ][WPLOONMJIMSTRONMLKJKLNLHHJIKNPQQSUWXRFBGKKIHHIJKJIHGGKNMLLLKLLLKIKMLLLMNMLKKPZcfjnpmfa^WOY`RVWWVUWYVXbeb[RQTSSTUVUW`da_XVTQYgnmyzwypmmhgntqkkiivtf~zslb[^`_^nyqqw~Ĩ|yvvxqsnddhfeikptl^^myxxvsvxlpt|rv}|wqy~mfnpjahs_RWYXSQQOOONKc†k~uTMSUWWPR]_Zaswimw{}yh[XTSPNNOONNPQSVWUTSPPPORQJ\fdjefopfYRZgkkic_^]`fie_YROQRRRRPPRTOYwsZS^qQO\dddXUb`XVXSNVjz~zMTVUWTORdq{fVJQQOPOTMNNj`botstttquzn]ZraOSWUUV`d]djeb_YURQQQQVLKipmVISQPQRPHKVQONNJHHGGM[a`_ab]ZWVVVVWWYRLV[^b_YWWVTURPPPONMMLKKJIHFJQUURPQQPPQQQPPPPPOPONNPRTUTQNNMJLLLKJHHHGEEGHIHGHGGIKKHHQXMIJJJJMNMMMMKQXKGKMKLMMMNMMKFDFGHHIHFIHHHFGFHGFGG@FWL?@BCINSVQVbjlddhRBJJJMKIGEBACHLJGUk\LLLKHEDCACDDBABDEHJKKKKKLNKFIP^bPEGGGGGGHIIGFHHGGGEAFTAAABBBBA@@@@@???>>>===>?CHHDBCDDCDDCEECBBCCCCCCBBAACA???@@@@?@@?=>===<<;;;;;;<>>>>=?@@ABBBBB?DEBGEAAEJFA=;;===?>96:<878878::;>BKMKLJEEEA7//3:@CHIIECBD@:75546668938@B:=;9<<<;99:99:;??@@BAABB926557841/1138>@=;;<=<<<<<::;<:6:EK35899936?EB@><<<>AAA@@@???@>:;?EHFFDA=<98>A==>??>==<978789;>>>@BBBB?;98:;=>>=>>==;9:<<278:=AA=9:<===<;=>?>?BCDEEGJJLKIA;:;;;==98<::DLC=;;=@@@@AA@?<=]lrwypE7@@???>==<=>?AA@A@?@ACFGGGGGB:78:<===>>;BG:8;8448:9:<===;98:;=???>94212202467777777666445544555468:9999:;;::;;:87789::8769<;:;9789:<=>>=@?:53479:;;;;989;:913I[c]G78:8755:@@===7)%1324:653463,*.06=?6-,5=<11017@<46BK5210033332210123442,))+-/023456789:5-*-.0478;;:85.,036731210/0620/.++,*-;A:69854226<;?BCFG@;85238BHA71-'1VU;90(*+/4976850.1200.-,-..//03620.+.=A/''-132/--)(/673/+,,-..3852443/--.,++**,5@9/)*+-,,,/;E3,~:)2222211//1212/-./0335643.L`-&473026FORYM2*12.;TQ??B>:133-+/1.,*%%4EB6-+,/1,/APOOOKA=>>@BGLNJM]egdbZNE?AADJPY]M=@GHGB@>>@CHMYtqT3%04569<;68AB;77:758;??>>>>>><>?>@DFFDBDEDCCCBCCBABCCCCDDDDCABA?=;;<=====???>>==<::;<==?@??>=?@@@BCBBCA@ABCCBAAFIGE@;<==@@;8:;6311379:;:;ELG@@:998679;@EJLIGC@@B=:86678767967:97BG;=<=<;;:8888>=====<<<<<;::96327A7;<==7259<=>><<<=?@BBA@??==CFE@?DCFEB>>@@?=;;99:99::656568:<<=???BDCBAAACCABAA@>><:99=99::89?@=<=@AA>;=>@CEGFFEEGHHHGHEECA>:;<758:>><<<;;:;Yksww}b>7=<<=<<<====<=?>>?>>>@BEFEEEDA<8:;;==??8>KC88758<;:<=;;<;<>>:879:7544433346654455554434444676469:9999997999;:878:<>>:75:=<<<;:::;>??@AAA>:768;:;;<<;99;@B50LfS=857987669;===<;429712@><<862,,/04640-15841016=?78:@A95/,-03332210/02242.+++-/258;:876530-++,/48:9:9945954697685/2?J>3/('+++4A?9897541/5<4+.038;841/,))+,-------/132/..-),99('().341,,-16753258:>B@@;2.3<<34>:.++,+,4993-,./...2510,\e,*222232201485-)()))+3::/*/95)+/0/028A=@E=@A:11:B:..08;998630/-,+*('2>9,+.39827Rif`ZF8;-Bfieh[B4678?MWXhfHTshK@>615NJKLNONQZQKLKIIKJOew{qmgK?DDDFGGHHIFBDFJJJIJMMJHEDB@AAADFFDCBCEDCEHKLJKMLIILZcSHGGHGGGGGGGIIGEDCAB>ADCCBA@?@@?=>>>?>======BDDDDDDFECDCBBBCCCEEEEDDEEB?>?><;;::;:::<=====<<;:<=>>@AA@>=?@@ABCA?@AA@@@ABCB@EGGE=:;<==;:9943138<;:;:9:A?88788;>ACDDFGGGEC@@?;9988987889899=BKL:===<<;:8557:?AAAADA4454567764447<==<=====<<;<=>:753413;>@CA93357:=??>=<=?ACCCCCBCBEHGA?CEDCABBDC><;9764346533333346745569<<<<>@@@@>??<:899878::99856;@BA@AE=::9:?FHFFFGGHIHGFFHHFA:79626;=DC;:::<<;:9997899SjrusiI79<9:<<<===;;<;=<;<<<<>@BEEEEFG@88;;:<;::;:::8555644555544444446766678899887556:;9779;=@?=84:>=<<;;::<<<;;<>?ABCA?;85589:898?><82-+.=FBFK3-.+,.-,.00/12100130-32=@)-0112110138=7/-+**(&,7;20320565009752-15>LF3-13/,*)*2:C@==7//0.000,*47.,8@?=<48Zsm\B2487117;<93/6GOB7KaR<@F?645437:5123210//37;AC<65631..--/397.-Bbk\CKO1?sylK/,04:FNKQ\RRowS?IF745434.5_E\_b`fnqpqjaahlmnpsqibeospnmmljhiifegdUN_hZOP[b`WTUUTRQRQSSRSTUVVUTTRQQPONNNNOQQQQQQQQQQPNLJPSQRRRRRRQRRQMKKJIIJKKLMLJJLLJHGHIMSWXYZ[ZWTPONLMONLJIIIIIIHGIKJIKLKILPUZ`cdfh^H?CFGHHHHHHGGGGFHLPOKKKJKLMNNMMMNNMMLLOTY\ZX\chiigh_T]g^WYYXZ^aa^\`bWJwzNSSRWYT_aW[Yah_WRTUX_dhjmmkszpsofgloomlkjhjlt}wn[mngaZXfxz{{qfefhkmnpxnY[`hmh`]bls|xleğ|sor}p`kghlkmnkilmopsutvwusuvznqxwqmuzzzzxqw{kchhR|bZZitywvopqyuo}iZ[_ahh`WTVVVUVX\``babegggfb_UONLLMOQQOMMNNORXZZYWW[``\Y[]]^_`aa`]]agkmlid]XWVTSQSVWWTQ\_UTQQ\a\WVVUPPQOQ\ft}unlON[[SZVN_}|lXQPZZCiԟi_fggjlllifeiXPXUc{cWSV\a`QS^OGNQOPOOPPPObaQTSOLJKLLJONNRNMLGIU^dc^ZVUUVVVWUSMOVSMNXbc^UQSUSTSQOMLLLLKKKJJLNOOOOOOOPPPPQPNLLKKIFGKKIIIIILONLLMKHFHJJJHHHHHHIKOSUVPGGPGHKJJJIIIJJKKMQSRPPNMLLMLKGCCCBDEEGGEDDCCASKQRQNNPUUNIHIKKJNl|qeSCEEFHHHHHHHHFFGJKIJKLKHIIFDDDCCDEEDDBCEEEFEDFJKKJJIEOc\IDHHHGGGGGGHHEDCBBC@@BABAA@?@@?>>>===<;=>@AACDDDDDEDDDDCCBDEFFFFFEEDCA?>====>>>>==<<<<<<<<;;<=>>?ABBA??@@>@ABB>;@?>>>@AFGDDEEB>;;<<;;;;;7779=?=<<<;<8:;99;=CHGHHFECCDCA?>=;:9999878989<@HOG75=?=><<<:747:>@ABB?9675567776557:=>=<=====<<<<<:842258=@BE?;5347:==>??==>?@ABBCDDEEGFFFCAECBA?<96676432/-/0/././..-./**.03779<;<9;=<:;9536765456555337=BB@BA98:746:>BDGGHHIJHEFHLHA;7:835;@A>;99::99899768;8Mio|rM9;9879::;=<ADDEFGHC:79;9;?=:47FB6679<;<;;;<<;:;<;605>@?<:89<>A@@?><;:866655544444457777679:;:998657::8679;=??=;8=;;;:::::99:<=9524679:98BB==66;<98889::::;<==??>;>ACN[=341.-,,,..0003535::9643.0520//.-,-./01221//023322122124578767850,+.../0147;;4+-.-/8:468/-,-/.//44..39841/,+/4623?PZR@4/-++/4551;A<50*(*'*9@<9;:60.,/52-+,--/.,*')+*+*)'(% 6R<5?BA<;=;2.371.7BB@@81/-..,+4EOSE').+/0-)*,-1531134420330.+.011110/039>8441,+-+*08@?56::::4/790-+-14=:0--.)*+*)(3AHIMI?94../-++0346CJE=><-4`x]8.0-3BFD>@B=9::38\mQ4AXSE@6/0319OY[Z]fprokf_\bilkmolaZYY^ionllke```_agg]PP]bWOQW\\YSQQRQPQRRRRRTTSRQPPPPOONNNOOOPRRQQQQQQQPNMLNPPONMKMMLKKLKKJJKMMNNNLLLMLKJKKKKMPRSVZ_de`YQLNONMMLLKKKJIJLLKKJJJKLPTZbfedhmdPDEHHHGGHHHHHGGGINNLLLKJLMMMMMNOOMKJKLORRONRXZZZX^e`ZXZYZ\]_dihfda]VThgUWXXje]g[[Y[]Y[Z[XWVX[^`cdfkpnjotrklsrnmkjkjlmxuvie~z~|mWVVbzmkiahqv}ngcbca_a_bhytk}potrqx~ooa`bXdlihlpssuttwwsrtwztnmlpv{z|{up[g_Hwntxupqstvyp\]eih\RPRONSVYZXY[^`aaa`aa^[WVTQQOONNLKLPRSUWXWVUTWYYYYY\[\_`bcb^\_dijjgc^[ZYTROQVWWSPUa_USUYYVTONSUTRMVbehiabgucF_fQ\YQRtrprniw|qbZWMERݸ|^cghknoponns[LURMN_ml_RW`fXNYXLIOQOONPPRRBaXYSRNHILLIOSOPOMOQMO^ec^ZWWXZ[WTSQPNPTOGGRafc\WTSUTQONMLLLLKJIJJLMLMMMNMOOPPPPNLLMMJIKLKJHJKKKMNNMLIGHJJJIIHHHHIIJMONQPSaUFHIILLHHGFEGLVXVTRQOOMKKKKIDCCADKFABCDDEFQKSRPOPOPTVOGFKNKIOozhOBDHGHHHIIIIJIIIIHJKJIHHGHHFEEEDDCCDDDCBBCCEC@BFIIIGGEEWcN@GHHHGGGGGGFDCCCCDB?@@AA@@???>>>>==>?BJMMDAEEEEDDDDDDDDDDDFFGGFFGGECC@>=>>>>=>@??>====<;;::<=>=?@ABCA???@?@BBA>?DDA>@@ABFHFE?<;==;;;;;;;;;<<>?A??A@:::;<;;;:999888898:KWKJ>19??=>>>?=<;;<>@ABA9488756776678;=>?><;<<<=<<;;:85215=CCCA=86247:===>?>>>??@AABCFGFFEEFHB<>CA?50/-,.//.-,--,-----..012/*+-158;>@=::;:7652256642311212336;?AB?76:865339<@BFHKLHFHIJG@=;:964:B?<:89889987777:?8IlwuP9::975566667:BID@>>>=<<<;=ACEEFHIH?8797:>>:55?C=889:9989;;;;::::613;?=86668;>??>?BB<77644554444446777789;<<;::9767::867:;=?@@@@???<;;:;;;;:9:;<<;;<@CB?;84479=???AB959::8888:;::;;<>=>??=9014531.-,,.0/.--/023311221222222233566667775238725764348:4///-,>L7-2/.+,,,.131.--0242,*.2562.5JSH73/.+*,--,+,59988<:456-,.,-1485-)+'()((',>JJIGC:2---+**+4>ADD@;84,#8g]0+3//34780/463499675:>888JGIPTUF57==9:5=rzF48AEHLG;83,=UD+/IRLF>56859@HITXdmica^[[^aegeee]USVWWZahkkje]Z[ZX\ddXLNW[XQMPWXTNMOPPPQRRQQRSRQQPOPPOOONNOOOPQRQQQQQQPPPMLLMMLMKIKLJHHJKKKKLMMOOLKLMMMMOOOONLKKLPVWY^^WOMNONLMONLLLJJLMMMLJJIJMRTW^cdcbgpgQHHIHGHIHHIIIHFFHKLMMLKLMLLMMNNPQOKKMNNNMMPTVYZVSX^ca^^^aa`acdbdd^_nk]Y_e\}{s]`d_lcV[a]ZXVWZZ^cbaeiknoqrrrpmkjjkjlovxxww|u}mg~cS\]r{tv|}y~lq{ynfjd^Z\\i~}tp}ldn}|pku|tj^ZSOV`ciltuuuutvvtstv|okxvwwxqp~eaf^brstwvttsqprrmrnjb_gf\SNNNONQZ^\[[[[\^__][XWVUTTWXXVTROMMNQRSSTTTTTSSRTVVVWX[^`aa`]\\^``_[WUTVYZWOPVWVUSSY^^[YVSSQP\a[WSQUXXUOLNPhrTLheS`XSIbwmhlpq~jgsteG|ȔibfgkosuvtvhKSRPRRRj|dP\e[NNjx]KNOOOQQQSIm[kfUXTHGLNILONPOOTYTMZgf_ZWWZ_^SNNNOOMNNMLNXbggaXSTVSPPONMMLLKJJKKLMMMMMMNOPOPOMLLMMLIKJJJJJKLKLNNNLIGHJJIIIIHHIIJJKHGIWk~\DHMGBEEEGHHHLZ`YVTQQQOMLMNLEABCGa`G=ACCAD[IWPILPPOPRQHCHNLJLc|v_HDGGGFHHIIJJJKKKJHJKIHGFGFFEDDDCCCBCCCCCABABCDDCEIIFFFCPbSAEHHHGGGFFEECCCCDDB?@@@@>=<=>>>>???@DGOMHBBEGGGEDDDDDDDGGFFGGFGGFFEEDA=>@A@@?>?????>>>=<:9:;===?@ACB@@@@A@?@BBAADGFEB??>BFD@===>>=;;;;:<<>>>@ABBBDC><<=@EDFFDBBA@>>>>=;::;99999889887GZHF:9??>>>>???>>??@BC@7/378877887788;==>=<=<<<<<;:95213:@EEA=7111258<=<==>==>?@??@BDEFFDBADD>;>AC7//13425987776786332224:>A8/,,.4;AA?;78753212444312/032332358=DB85676544678:>CJJHHIHFCA@><=;5:D@;:99999998777;?6Ft}\78<878754554469ADAAABB>;<;;=ACDFGHJD95668==966;@?::9887679:::999972/7=73333356899:99;;;;;;:;;<<:::>DDCDC:2349?CFJF=88889999:;:9::;<=>><===@C9;70/.,*++,,,,//,098.-14541.-,-.///./012321231/00111123456777765459A<4<@<73256521014CZE,-.-++**)*)+00223576124551+,3?F@2/.++*+,+-.176553-160,6<>70-,+-15741-,0/-,-13.*)+15:65I>5LO<4?IK;,%%,3637AFD8.6E=21000.*)((+0/,2405<;633776533650-/010000-/22122330.//-.?F>65446;>646/-,--0564-*,,((((&*>LJF=30/,+,****0@A:6143**&&DL++:51-+2;70-069;>?<;934:AFFD@=999?>=>DI=/5EU\SNJ=;=B?95478570+-17?@><40:>@IJGG@3:LQJJNOYZE6<<331FL7BEDEDKPD76:FG=5FM@97018::>@=4W^h`URTVWY\[]_\ZXTSUWXXVV\diiea]ZWUTYaaVLKS[XQNPQROLLMNOPPQPPQRRQPPPPOOOOOMNOOPQRQQQQQPPPONMLKKKLJIJJJIIIJJKKJKJKMLJLMMMMOOOQPNKJIKNMKMOMJLMOOMMOPONNMLLMMMLKJJJKOSUX\^`_^dgZLHGGGIJIHHIJIGEDHJLNMMMNMLMNMMOQOMLNONNOOOPSW]bc`\\`bcdccb`]^_]``ajlb[diZt_hp[lfSY_`]\XXWV[a__dhhggjlmmmkjjkkjlsxquw{zvuws~~d\mtn~~yyzxznpw~|ic_XRWZ[enpmu|v|{wsjdc^ZUOSTSTUWY]\h{yuuuvvuuyu~ɮidaceaY_qlccw{~~s{ccc\ROOOPQUX[^^^]\[ZZ\]\ZUSPMOQU[\ZXXWVQMLNNOPPRRQPOPSTRPQV[]]\\YVVTTRRQNNNLNRYXXXWXWUQQSW\]TOQRSVfdSSTTSSTOMQPMTXUVY\TXd\XSN}{wx}lo_Uѩ{hedgkouxxy{XTRPTVPTr~bU\[TKc}VNRQQONNORMnSicPWUIHLMLJJLOORXWNHUikb\XW[[RMJJJJGGMORUTVWZekeYSVXTQPPPONMMMLLLMONMMNMMOPPPOMLLMNLIIIIJKKLLKLMNNMIGGIJJIIIHHIIJLKIFAGftVCIXVHEJLPRRMO[_ZWVSSRQONPQMGCCDHbtbFBEA@MLIJPWVNNMHHQMBBLMJLdwcIEIGGGFHHIIJIIKJIIGHIGFEEEDDDCCCBAABDCDDDCBCEFFEEEHHGFFCGZ]HBGHGGFFFEDCDDCDFEB?@@@@@><;>AA@AAABBCB??AFIHFFDDDDDDEHHGGGGGGGHGFFFDAA@BCBCB@?AA@???>=<:89;=>>?@ABA?@ABA@=>BBBBCEFHHCB@?@?=>=>>=;;:::::<>@AB@?AA??>>?ADEEEEDBAA@><<<;;;;:999998899737LD@4:A><=>>==?>>?CCDE=-*157887887778<=><<>??=<;:886226>CFC=:51012469;<;<<>==>@A><=@DDCDA<7;97;B@632348::>?>>>;8643339DGB;5/)*4=>952353322245467669<;:765544;B>646666577768;?@DHJHDBAA?=>:5=F@:;:999::::98:==:Q|xI8>;::97558988879@ADFGKE95557;<:977:<;::9886578:9988960.6<7222334345668:85554355554446788889:;;;:::986787668:<<=AFGED?;::9:::::::99:;:9::@EDFGB5-.037>FD=878999999::9::::<===>>>>>;950.--+)*,--..,*0420102122/..../../0222221331/..000234456776655444766?C>8235886009AHVQ;+-,++*(('&)/-3<97A6,+/5;;647639;1333.+.47.,+(',?QMB;0+++***+-.1;8.*(/1,*,'+5)*8620,3<<627>>;?ACFA836<<:;:;:989>>>LYSB:CGEDA>32310221.,.14>FIG:1>9666X[ZSPPRSUVWWWXWUTSSTVXYXUW^dedb`\XUTSV]^XPQUWTQONOOMLKJLNOOPPOQQPPOPPPPNPPONONPRRRRQQQPPPPONMLKJJIIIHIIHHIIJIIIHHJKKKMMNOMLMNNLJIIIIIIHKNKKLMQPOQRRRSPMNLIKMLJJIHJLORSRUVVUVTMHGIIHHHGHIJJJHFFHJLMMOQPMMNNMOPPPPOONNPOKJNPU_dc``^`fhfdcba_]Z\\[_a`_bdb_ttTprWbc\__`b_\\^_[\`bdeeeeeeegijjjllfk{ywzuplgjwumx}{{}}mszwszsgie\VYZYX]abhqpuzd[kpiYOQTUTSSUWSSQUkxwutvvvx~vu{w]Z[ZSYqsuoYj˿t{ysq|ti_XWUSTTVXYYXZ^`\WUSRVWVTRQPNRWX\]]\\^ZPJKLMMKMNMOPPQQRQSXZ\^[ZYWVTSPNLLMMMMLPQRY[YZYONRSUWWSPTY][RRTUVZ`be_VVPKMTWSPNMRX[[ZSg}~p}|WaԹnb_`beiosrwpUSTTTUQQkz`RX\RR[aZOPRRNLMPTK^aQNff[VPGDEKOOJJNOSTOHFQhof]XW^TCEEFFC?EPUXXVUROR_jfYSVWTQPPPPONNMLLMNMKLLLLNPSRPMLMPNLJKLKKJLMLKLMNNMIFGIIJIHGHHHHHJLIFD>:::=?@BB@@A@@AABB@==ABBCBCDFHIHECB@<<<<=<<:<;:::=>@AB????>@?>AFECDCCB@?>>=<<<<::::988889::;846C<55=@:8;=<=>>>>@DFEF>78577776776558<==;=>?A?;874435;@CB?:545313568:<;;<;==<>AA>;:>BA@A>50226::50243568<<;<<>@@?A?<:87615?BAAC>5,+/55546566788:;::<=;9::97656777<<866655455665656=7N~gEEA<<::976:=>>>>66ADFJF;77669<:9756:;:::9886577688896/.48422234433310124444344444466899::889::;::::97665579:<;;AFIJE:9<<;;:::898658:99869?CHJKA3..039@A<87899999:::::;;;<<<>>>>=<:62.---,)(,/0672/00032010121000//./23444421330.,,-./2455556655436::869>BA725><;900HVMLQH6-+-+*)*+,/.*.;<9=>;741/,(().31/11/5::621269;??0+?ME?<1*'(((**++.340,/8940/17<=:55;63FB+;E>66637?A8-0@JID?@=-;fW8132/-++)**,2987776431056468861--..-,+)*-//0223432330,-2CD5/33343116;>BI?771**/8@E<0*).@WTE@;1-+*))-/1362)&(-3/**(&)))/36655>FCADD>;=?>@FD8037988;<@CA@@=;;:9BSVF<@DBA?:2165200.,,07BGJJJB;<>F_ssZA:>=;;?FFC>=>==??<`nQ@77=DHGJH>97/.:I[[QPC0+2EPJ?997QQRSTTTTTUVVVWVUUSRSTVXWWY\^_^\ZXVTTUTSX[XSQSSQQOONNLLKKLMOOPPPPPPPPPPPQPQRQQPQQRRRRQPPPPPPOONMMLKKJIJJIHHHHHGGFGFGJKLNPQPONNNLKIHIHIIIJOOKJLPQQRTTUURRTMHJKJKKJIHGJLKKJKMKKKJJJJJGEGGFHIIJJHGGGHJLNPPNLMNMMOPOOPONNPOKJNOPSVY^ghfffhfcbcb^]\Z^ba_`_Z`_jub]qi\kuwumknaVajlk`_dec`bdehghgghgkmhnugw~}xyztky~{yv}yzmt}agolbcnun`YXW[_f|w]ZgqmaVWYVRRSTSSSQSgxyvvvvx|xrwpdllZXVSUU\u{ywh]qu}|sosniidiqk][][YYXX[[[[Y[^^YROOPPOOOOU[YZ`da]\\[VPNMLLJILONNQRRPSYbe````^_aegb\XSPPONLNRRQRTU[QZgXRPPSVX[ZXXRTTRX^fdb^_ZS`aQQSPMMOMMQRQNosfw|zodq[[^^`adeedmmZRTUUVWXYir^U\`ZVTVYYZ[WTTRRQPGMRhmiaZRGBEKOOMMMNOLJMTbni\WVZNAEHJGBFNVWXYWSSPNSahf^VVVTSRQONNMLLLLKJKKJKMPSVVQLLNQMIJLLKJKMMLMMLNNMKHHHHJIHHGHIIIIJLNKHJIIHGN\_]YWURPMPXZYYTRQQQPPOPMGC@ADADUebMOSTAOddT[[XWSKGIJNQQK_tZHLKIHHHGHJJJIGFHIGEEFFEEEDCCCCCBCDFJMICBCFHGJLJHGGGGGGHGDBIRMEEFFEEDCAACCCDFFGFDDFHKLLMMMKHFDBBBAA@??CFDCCBBBCDDGJIFFFFEEEFEDFEEEEEDFFEFFFGHHFDCDCDA=<;<@BDEC@?>@AABB@<;@A>>?BDEFIKIDAB>:99:;;;;;::>>?ACDEEA@ABB@><;;<;<<<:999988899::;:99=;8@>A87>>===>>@BEGEC@?;:98788766658;<===>?A@:6546=;89=A>==84216962111133347;=@AACCDDA???=<88@BBBCFD:0,/8BBB??>????>>>;<8434566569;:889888764446656657=AC@?@@><<::AC<:<;:;;;::::<<;<6PvUBHA?><<=?>:;>@EIC:8;?A>957:::;;<=>@EF@;9655897766899:;;9984454666773123322234332211113223433334588::9::99:99:::;<;843468::99:@FLG;5:=<<;<<7034214899::87>FJKH=3048;AA<:;:998889:::;;<<;<<<=<<=<:4,(*,,,*(+/4?@:5/,,.//01232111/.21/355663110.,,,,,/1466545654336;;9;;/)**)+-/0///-+,1/,,18@B=735=:7E@)8EB8+*,1=:975445531/2BRNKJHGF=5AfoB5437=ENRTSJ>:9?IVSN][D4C^e`XSJ@CEDCCCBBDEDGIGGGGFFEDEEEEFEEFFFFEEFEFGFGGEEGGEBA?=;;?DFGJKH?:AC?:9:9;<;;<<>?@ABA?=>>?AGKG@>>?@@=;::::9;;::9:9::999:::;;:;=??@>>@CFGB?;95666688667757;>?>=>>>=98;@CJL@8886654226799;=<<<<<=====;978<@>=:558:<:42101233335>EHFEFGGFFDDDCDDCDBBB@BEA<:427=>@CDA?><;;;765445667788;:979::998666556666568<>>>><>>>?A>:9::;;;;:::<<<:<5MjKCHBB@>=@GF>:;=CMPH<6:?>94689:9::;;<@DC>973267766788::;;:;:63233455554443233344433444443344333357::::999:<<;;<<<<<;8557:>>;989;BG>56<=;<<>>4,.//02579;;98:>BEE?86;>>@@<9<;9877889:;;<=<;;::;;;<<:81+,+,--./.6;996/)+-../012210/-**(+03456420-,+,/0146633534544458;<=;;=9201;DI?4/,+)+/12211-)++''0A>13><761257@G=,-75@jH/6521/+(((((,/3441146338:865-()*+..,198664460)(()*-1126><1*1;72012.'$&(.DUL@>>==3+-,/4;GQE/./-/20+**++-3-&'*1770))*))/78788;=<;88:999:843;@ABDC>:4102551/26>JKJIHIJA4>jT-6:;DILTSSYWJA?ADFJRUYVLIME?DB/+@MK@==A@ETiaGL`bbc]L9ZZXVWXWVUUTTTSSSTUTSTUUVVVVWVSRRRQRTSUVROPQPPPOONOOOONNOOOOOOPQQQQQQQQQPQRSSTVUTSSSRQQPPPPPONNNNMLJJKJIKLHEEFFFGHHHGIKMNMMMLNNMMMKIIHHHGGHGIKIJLJKRVVTQSWYVQLIHHHJJHHHGHIJJJKLMKLMKHGGGFFFFGIJJHGFHIIIKLMMMMNNNMMMNMKMOPNJLPPPY^ZTkgU^``cfijjhhjkjhgecmzuheauwnuZenlvrgc|lgulX[cma`eXdjp{g\lww{wm|}~}xrrvx}gese[VR\ddfc\fp`ONRQORSSTUUTT`t}}|z|zaVX]iwĢrw|in{rorotnlvxvnc`dfghfedcbb_][\[[[[ZZ[\ZTRRRRPPPNMQWZ_]VTWYWVUQMNPONOSRLR\_ad`]_bd`[[\]abed`\Z\_bgcXSTQQXIwbHTTTSQQU[YVY[ZUUUTTTXWTYR]QdkPLPPOPOPQNLJLMOULFRYcrtvsmklhy[F—pa_\ZZ[Z[YZ_YTRSWZ]_dcaie[Z\ZZZZYYYYYXXVTSQNQZ^`cekppgVE?@AEFFEEGHGEDDAA@??????BEEEECAABDFEFGGHHGGGFFFEFEEEDEEDDDDDDDDDEEDEFFDBDCBAA@@?B@=:>BAA@?::;@?<<<@DHMLC96>DB=::::<=;=?@ADHHC?>>??=;:::::99:;::;:::999:::9::;===9<70+.?@<=>>?BCB>:666766777557758=@A>==<:;=?DJLH>335555579:;;<<>><<<<<====<999964455554446887787899:978:::;9899767655557::;=?BBA@>=<;;;:;;::::;==;;=7SZ>GHCDB@??BGG?::8:?A;8899999:;<@CEB97535677679989;;>?=85224344444554334334455555444444344569;;:999::<<=====>>;868;@B@>;999<>76<>=<<=?>4/../11135778;<;;<<:9>?>>=?=:::9887889:;<=<<;;:;;;<<;?B;41/..3851204683,-/////0101231039502335420-,--/04?EE=347533346:CD>56:2+-0AK940Dm\6*12/,./012223/)*/2008?B@<;;<>>>@?==;9;@?9:?><>GKB8:98721:@9/12+),266532-))+(*6FMH=557::81748<:884,)3:BV<0331110/00+*)*-14212426;;51/)')*,-++6@:3.,362*+--*(*/36;62/2;<5<@70/1346AQH===82,'&+3=EFE:,++,/00.,+++,11'%)19;93+)(+,05<@:302345559AHF>62;A<55882/7<4=Zd_\[RIOUPKKFEED@7.-..053.154=MKEEFE@56QX3-NbmwiSVVNTXNDA>@GNSUVWURMC9;A5/=>@ACFGFDDB@ACDEFFFGHHGGGGFFFFFEDDCCCCCCDDCCDDDDDEDCCDDDCB@==@>;7:?AA@?:;:>>?=;;AHML@78=A?=:;::<<<>>=<;>EB?BEEDA>>>>><;::::::::;99:::9:::99988:;;9:::70--3:::>>?AA=<97788:986665555:?BA=<<;8;CHJJNE5.044445>DEDCBBA>>=<<<==;:989:<=?=;<?;;58<:41354444344557667779::989::::989998863555788:<@DDD@;:::;;:::9::;======;9?HJKI?68BD=:<;989::<>@AB>98766776798667:?CA;63333224545643445445675455554443445689::989:::<<<=<=>>=945<;::<937@?==<=>=720110//01126:<;8964;B@>?>=><88;;98889::;<;:;;;<<<==<72/---/00124=A@BD@=DB:8AF?8:82-*+156356,(*19:82/+)+-/28JQE::F>.,)"1RJA@IKFC625:73593/024.0Oc_[^UEI[bTB>BEFD=751139=;6535><37<;:;97,%En~\VSIMULB>;=DNVVTWYSID98D55`oRBG=KbjplbN;3/+SSTWWVUUUUUTTSSUUUUUUTTUTTUUUUURRRQQPPRRPPPPPPPPPPPPONOOPPPPOQQQQQQQQQRRPOQSTUVVWVUTSRPONNOPOONNMNPOLLMKKKKJIHHHHJKKKLLKJIJJJLMMLKKIHGGGGGGFFGFDFGFDCGHFILNNMMLJKMLKKIIHIKKJIIIJLMMMMMLKJIFDDEFFGHIIIIKKKLLNPONOQPPOOPQRQTYMYxfTQXR]``YQWY^`accdhfehjifhfgicgrzfeylpqhzveZ^SÉhn\_`llfnyk]qxy|vtosy~ztz~jgimtpuubnwgRSqhTcqiYPORRQTVVSUWZiƑfqpXĴ}]fprtvvrns}uǮowwe]aabhhedbba`a__^Z[XRSV^ebabec[ROQOLOT]e`XUVTTY[[ZXTOOPSTSUVRWcf`]]\]bdda]ZY[]`_]]]]^cffc_XSUE~WEUSQQRY]YROMLW^WSQRRVR^UP``Vt{SVWSQQPNMLMMOPNNMMPZab_`a____cejommzȖk_`dgjlknoYQTRW_a_^[YXWX[^[XXVSSRSTTUTTTTTTRORSQQTW[^ac[SQRRPQSSOMU]^XKHJJUdgdc`WT]ffaXPIP`ga_`bcde_YXTTQOONNMMKIKPOKKLLKKKKKKIHHHIKKLMNMKJLOONLJIGHIJIIJIJKKJM[fc^Z[YULHLMMLLKLLHGPWXXVUUVTUTRQMIECABFGDBISQNJGIJIIIJKKKJMPPNLLLNOPOKHHIJKIGJKJFEDDEDDCDEEEEFGGINPPQPOOOKIHEBBCDEEFGHIIIJJIHHGFHIFDEGGEEEEDEEDEFFEDCCDGHHGGGD@>>?>>>@ADGFDA@@ACDDDEEEFGGGGFFFGFEEDCCDDCCCCEEDDDDDDEFDEECCA@@>>@@>;::;?AA>9;99=@<9:89<;<>:>=>><=<=;;<=<>?@@ABABCA>==<;;;:::::::9999:::9999:::98:;;999:;:40.5:;>@?B?::869999888777577;?AB>;;746BKLKH>62475557CFFEDDDA??><=><<975578:;==?ADGF=4/010//1011004AHEEFFFGFFFEFFFHHGGIIGEDCA???B>515544444433434666777799::<<<::::89989865566679;:=BC>9899::9988::;==>>?@@;69HPKIDB@>?DJH@=;CD=5331132000345544675567656765333322346679:9::::::;<<<==?:36<>??=;<978626>>==<<;:;;62-,/0013788:76965=A?>?>==;79=<:::9::9:;::;;;<<<<;;:96211111014585/...,+,3342/01234LaK.020123455;<5/-04BNJS_D0544345:?7*18/0:@<-'.;F9)+,,-*-4621000//10-,09CB72/-+*('%)-.2:>759BB>;7403@PL8++.0446=<4.((.:<5-+)(/7:48ML:>IG;/2.(8J43EI?8889=:4410.,*(*/575.,/222221054-+*)*-....17/()/1-*)*)(()(*37-'+./0224>C6)+5>AA>844EL6,2:@BA>;?E1#(2@9*&4EJIEA7252,++)++)+-.185,+03/,,+)().8DGD>:;>BFILS]c_L637742561,.57543BDHE?7..,+3:99CF9/@f}tbOD@==DC>:8>@FQSPQUSID>;E?1581D{Q44+7UiuvY6,02/TUVWVVVUUUUTUTTVVUUUUTUUUUUUTUUSRRRQPPPPPPOOPPPPPOOONMLNNOPPPOQQQQQQRRRRROORSTTTSSRQQQQPOPPPOOONNOOONMNMKKKKJJJLKKLMNNNLJIJKKKLNNJJKJIHIIIIIHFGGHIGD?AHIGFJONKLNNONLKJIIHJKIHIIJLMMNNNMLLKJGEEFFHHIJIJJJKLMMNOOOOPRRSSSQNQ\XTzzc[Wi]zgc[MY`]ZZ[ZZYW[__^_]bcbdcl|zycnwnat~}mnb\vLTUcvqpw}~~p]m|||xwmxwx}utxefjntrw{hlvfwkPXkk]SRSTX]\RSKZƗphkjYz•ieqxzxwuuuypwxyg\debbecadc_^\Z^cddcaYUUWZZ[[^c_UPSPNS^gf]XXWSRTVXXVTONPWWUZ]YX]a_^][Z\`ca^ZXY\`cb_\\]`b`_]XYQR@OSONRY]XQNMNLP[[USTTRIzuKV\^XxzQWYTPNMLKKKKMNMNOOR]d_ZXUW]dijkihifa[XYrxaY[bkrnoxkRR\aba_^\XVUTVY[\ZWVUUUUWVUSRTTSSUVSQMLT\]ZXXUTRRQPQRPLU]]VJEQchgc_\SNW_`][UPKMZgb_abccefb]XVTRPNOOMKJLNIGKKKKJKKKKJIJJJKLKKLJIJMONNMKIIIIJJJJJJJKKLUXOMORURLHLMLLLKLKIHMVZZXWXVTUTRQNIECBDHFCKTMHJJCELJIJJKKGCHNNNOOOMIJLKIHIJIGGIJJGFDDDCEDDFFHHHIIJKMNOOOPMGDDCACEGHHJJIKKKKIHIHHIIJJGEGGFDEFEDDDFGFEFEFEGIJIGDC@>>>>?@>@CCA@?>>@DDCEFFEDEEFEEFFGGECCCCDDDDFFFDDDDDCDFFFFDB@>=>?AAA?=;;<>?A>:;98>@=99;<;:<99;9;><@BC?>=<;;;?ADA6:RN>ACA?=;;:::::;:;;:999:::::9:9::::98:9976689999468:=@?A?::989999889777578;?AB>97501;FNLA95699657;EFDCCCCA@???@???:543567:>BGF@@AD@869975762/113?IHGGEDGGGGEDEEFDFHFEGGEB@@@CF:24753354443433676677779;::<=<<<<;:9989998766688888=?=879:::9989:;;===?ABD>85AMHHFC??@DGE?>?AGIGFFD@;8?C>;::9999999;=;76886556567424:@C>6211121.,-14443566655567775321111123355788:::::::::;;;><9;<=??>=<:62478;>=<<:::>?:4,.2238977975438?BB@>=>=RTVXM<6776669;4+24,2B@2)+,/./1-'+/,/77202221269:;FZXB410/.02,$4C<9>?6/4AE5)28.*GdV;.05;>:69;1,*).;=0(((*0<6,5E;2<91.0771?N96;:26978773../-*))+.012/-/000021+/20+*)))))+.02--3640--.+('()*14.++---,,0>?3+-4=B>71/5:2*,/57:960+=@16A?5.3@GGC<94.-/,))))))(*+/64/...-+)++,/5@A87=??=>BGIIMOJB<:;<832/*)/:>85309K]ZA8HND;78=CFKOTQ@8BEDHJHE>54?HJGFILGCSus\PLLKLKB86:99?ACFEHIGGEEA9;:373-Qt;!&&*:]rC*/7:7WWVVUTTUUUUVUUUVVUVVUUUUUUUUTTUSRRRQPPPPQPOPPPOOOOONNMKKMNOOOOOQQQQQQRRRRQOQRRRRQQPPQQQPQRROOOONMOOOOOPOMMMLLLMMLKMOPONMKJJJLKKMNLKJIIIIIIIJIGHIJJIFCAEIHFGNRQPRSQPOOKIIGHJHHIIJLMLMNMLMNLMMKJJJJKJJJJJJKKLMNOOOOPQRSTTSQPYgkwm[`Ukgfmp_R_`XUWWZ[Z\]\]]_cdfsysxyrgvwr|tws|xsxdRnOay}~~}~~{z|obu~{xryfp}~vutrkjmrsvqnuw}z{hZXch]TQSX^fknehŝdXWU\Xmyfmv~}zvvxxv}ttkbbdcb_^bjole`\[^cgiheb]XTSWWUTWYUUWVTV]cd_[ZXTRRSVVVVTTW[\XUWZXX[^^]\\^ab_\YWWY\]^[YYYYZXZXW]JncGROMP[]VNLLLNNOYbYSTUPMntSQUUVSxwMUXSOLKKKKKKMNNOSRORXWUVXWX`dfga^cb[URRNM_li]WZ_ehenrXQab`^Y[ZWUTRPMRVSPRQQQRSSSRQRRQSTURPKHNX\YTSSTTSQOMONJQ[]ULPbleYTUULN^_XUSPNKLWfa^aadfkkge_ZVVTRQOMLNJFMSLIKKKKKJKKIJIHHIIJJIIHGHIKKKJJIHGHGHJJJJKJLNNMNRWZXVSSQMLMMIHJOV[[XWXVTUTPOMHEDDFFBJWP@BIHDDLMJJJJJGCEMONOOMIEFJLJJIIGEFGHHGDCDEFIHGHHHHHIIIIJOPNMNIDCEDBEHIJJJIIKLLKIIIHIIIIKKGGHFEECBDDDEBBDDDDDFHJIDAA?>>>>?A@@CB@??>>@DDCEGGEDBCDCCFEFFFDDEDEECDFFEDDDDDEDEEDDA?>==?@@@>===;<>?A=::9:>>=9;<<;;;:::9?GGBDC?>=<;=>@>;8FrvI9CD?>>;:;;;;;;;;;:::::9:::8:::999989973135789:999:=???><<;;;:99889887779<@AA<834528DNN>76678569?DCCCCCCA?@ABA@@>7421345;AEGA71.7CHGHKKGKB41224>>=;:998899:986688887:=;779:::9999;<<<>>@BA=:99>>>=<;8579:;>><;<;;;;:877747=;6787644=FECB@?@>?JPD77<<:::999::::;;;<<<<<;97432121222110/1109HPNPN>20011/-,.0.6B?633458973/+,=NRROTN=52122441./0/2;4$(,,+*22**2401651024556@A9.*),3:852.+*6II;9=846:=>??@FLG95=AACFPSE68EQXXRKJHAP~dRSROSWXZRC;8:?AA81?G?:BE>=>?ABAA@>>????ACCEFFDEDCBACGGFDDEEFFGGFEEECCDDDDEDCBA@=<==<>AA@=>?>>=>?@=99:;??><<<=;99:<;:K^RGEC><===><89Gih7?D@>>>;:;::;;;;;;;::::99998999:::999974113446789;<<>====>>>;:88778::9989<@?=;677957EPH75755512@??=<<;::99999988888779;;8799998889;<;=???=:78<9:AEGDA@@ACEGGFEEJJHEB>@?95;>:9:::;:98655565424444455423239A?80./.033333464222320123321100000000001222467788888778:<<==>>=>>=><<<;;==??<==;:;;<<<:9<=;9776427BFCCCBAACGJF:49;:::;:99:;;;<;<<<<<;:8654432122210000/5GSRPNK:343321//1237>=4/17<=;841./6@NTRW[K2.,/1100/...,+)&*.0022/*1772/11/024679AFAOuoE%(00-1=;/;QPC?>;961D4672.-**.0*%&)*)()++).443467640:8;?CEA6--2201.+,,,-24694-27526:<>EOH8228BORICD>?epabXRPG@CPa]D69AA;0(4B@<@>2*)+*+*(/8-'&')#(]n9&/.+-4RTVVUVXWWWWXWVVWWVVVVVUUUTRSTSTSSTRQRQQRSRPPPNOOPPPPPPPPPPPQRRRRQRQRRSSSSSQOPPPQQQQQRRRRRRQQQQPQPONNPQQPQQQRQQQPPQQPPRSRQPNKJKJJKJJIHJJIIIIJJJJJIHGHLJFBCFIPUWXWVUUUVUOIGHGGHIIIKLLMMMLKLMMLMQQONNNOONMOOONOOOOOOOOOQSUXY\^afcagg]cu`cvvf\ahhbcgdabddgkid_g}zxxyx{vomnonvynmqorvwuprtuutspr}y{}{us}timio}zoopqqt{yrv}{hdlry~wnooookigcbc\SQMOjp̺{NPTUTVSJ`ļhahijlljkmnxngffcaa`]WW_ioqleba`^]]bddb]Y[\ZZWPQZ]\[YWVVWYZYXVSPS[cikifffgmi[X]_el\IKQTW]\\`gkncSNPRRQRRRUX_Lj`LSSV\\VOLMNQTUUTUXYXYYXVUTSRPTJRlGPNLKKJJJKMMOOOSVURPRRQQ\gvrYSPOQRRRTWY]dgedlqj`Y\[Yc`WWUVUSSSSRPQRSRQRQRSSQNLLLLLMMKLKHHLLNNMLNPQQRSW^^ZUWYXZ^`caZZ\WQNMS[ZTPNMMLKMW]\]dghmcUHG]fia\[XSRPOYfcSLKMLLLKKIHGIWjoh_YURZs|fVRSPPXdh`SNKKJILSVUTUV\fffb\VOLLNPNJRbf_XVVTTSRPPMHGIE@FSN@?DDFECHPOJIHGGDELOLMNKFCACHKLIECBBBCCDDDDDCEGJJJJJJJJJIHHJLJHHFFHHIJIIIHIIIIKMLJKJJIJJJJKKJIHFFFDBBCB?@AB@@ABEEGE@>>>=>>>>@BBAABBABAABCBDGGEEEDCDGGGEDCDFFFGGFFFFDCDDDDEECA@><<==>?ABA>?@??=>>?<;;:>>;89=?>>?;>LiǍD;FA>>>=><:;;;;;;;;:::::9::9999:::;:998632111114579<<<;::;<;99755679<=98:;=>;;;69:944BPB38943412@GBCGHGGGFFGHGFD@<:645443332221351/4BMPOJ:002225>FGGHHGFC<633455541125;?A?@ABA?9:;965664544556679::::9::;<=>>>=<<<<:;9999999888879999:::998889::9;>@;9969?<8?FHEAA@?CEGGHIJJHGFBCA:689<::99876444334443444333344224215>>3.0135443334300010000100000000011222334224666778889:;<===>>>@@>?>>@@<:<==<<<;;<<;;:98;;86687328ADCDDCBCGG>4159:99;;;98:;;<<<;;;;<;;:8755421222110100>OQLI@8101000///133465/,/ALC;644340;OUSSZM0+*04212110/..+*-/1553/,.45/)+--/37855:EHY}j;$(0114<1)7B?CG@=:86=:/-=NC=KR1)12:IL;570,////,+*''),,,,./02478867731?A'&)3<4,.0343/+))*++,//,*)))'(*-/,)--,-//+,+.3654310/,'')*)(*)(),004;=4+),252,)&(-28=;511/*&&(*+-/351292',-.5:73232///-,,,,/440.....+*(()*-.263,,7=<:>753227>>9999V{cnmblhH7<5/./.)'))'#"$&')$3UJ/,*&$$&Z[\\ZZZYXXXXXXWWWWWVVVUTUUSRRSSSTTSSSRQRTSPPONOOPPQQQQQQQRRRRRRRRRRRSTSSTTSRQQQQQQQRRRRRSSSSSRRRQPONPQPQQQRSRSTTSSSRSTSTUUSONLJKKIGHIIJIIIIJJJJIHHIIKKIFEFIMRUYZXWWWWYYQJLMHEGIJJKKLLKKKKKKKLOONNNOOOOOQQPPPONOOOOOOQSUWWWZ`dddfmr~h\hiktmjh\]db\^adjkkiflqkdiq|}}zy}{jedddgjltkVUbr}voqsqoqppuwnu~ysrvnhlkqzyrqrttv|}uroh]drvz|xtridnokkkjjfb]VUm}reZ̒MOWSTRRUNMÿ­y_fkgfhhhfmzjfedca`_][\\\dkkiheb`]\^aab_Z]]YVROV^][YYWUTTUVXYTMMYgllkjjoyweZ[cefrkREHNPTVW[_bgi^PORQMNPOOUR[k=WVSWYUPMLMPXXTVWUVWWXWWWWUSQQSLRnXENMJIILLLMOOOOPSUSOPQQQRO]{S[WXUPPQSUX[_adbbcca]WTZa[TSRRRRSTTSSSUUTTTSTVURPPPONNNNOQPLMRPOQPMMPPPOMSbijlt{xifeWFHLNOOLOUQNNLKKJKKMSWT]jmineVLACFZhf]WNJUad^QNSONMMNMFLOLWq`ZXb{q]XXVUavvaUPMLIIU\XVVWY_a^]YTQONOONIL^faYVVUTSQQPMIIGADSNDBCCDECDMTOLJGFEDJOMJHFFCBABGKNHC@@ABCCEEFECBACFGHIIJJJJJIFGHIJMKIJJIIIJIIIIJJKLKJJJIJJJJJKMNNMHFGFDDC@?<<>>>?@CEEDB@@@?@@@@@BBABDDDCCDFFCFIHFFGFIKIGDDEEEEFFGGGGHGECCCCEEEEC@>=<===>=<>@CDBBBA<;=AAC?;DB?A@?>>>=GhŠX@EDA@>=>@>;;;;;::;;:::;;::;;99:;:9:97764322233233459:9866664155468;==;8;?===;<;797532?J@7:84466>IIFFILKKKJJHJKJIHHE?:5565421024665305COJ@0033435@HGEECCDIGE<21469:65466:<>@AABA?@?><;;;87667777899:::::;;<;<<==<=<=;;;99899988887668;<;::===<;;9:7799:::865554565554443443443332242/-6AA4.2554333332000/0000000/00000121244333213556778799:;:<<=>>?AA@>=>@@=;<<;;9:<;<<;<;7567667886568;>AABCCC=40136988:;:9999:;;;:9:;;;;;9754422222110005?GFB=41/00///0112357554-0FRE6/36688@OUTSZN1*,26687212133.''-27445-(.3-((*-/3872*->PjX1-341268,*/05CJB?729A4*5GI7786'&.543A@3-,.35540.,*)),/.-2962598755510AD+(+59744456861,)*,///45-*---)(+-*&*./-00)*-.266642443/,+,*)*+)'(,3@F>1*(-7>8/)%,9618??<6/)%'+.0111-(&,61'(--1BQURJ5+.-,*+..-,,+,-./.-**++,.10*$(1698>GJFELNC77>@@A@@BFC=6445:EA-*+,/1672/010/5@CB>=@B@=;;?BCB>62223<=96Bg|jfmdfvg>3=A@?816>:21006=:654530*))**)+0120->E0*480+($^^]\ZZZZXXXXXWWWWWVVVVUSSSRQQTTSTTTTSQQQTTQOONOPPPQQQQQQQQRRRRRRRRRSSTTTTTTSRRRRQRRRRRQQTUUUTSSRRQPPOPPQQRSTTTVVWWVUVVUVVVVSSPMNMKHHIHHHHIIIIJJIGHJHHJJJFEFHOTWXXWWXXZ[XVUTOIGHIHHJJJJJKKKKKLMMNOOOPQQRRSSQPPONOONOPPQSSSSTX\]abeszfom`\ca\]YXXY[^ceekvuppoorrot{~}||}~n^ZZ\]^bjlbXXf~|vspnossutyrunrzwrsrkijjknyvttwww}|yn[dw~~}}~uuwqlvvuyvsrpd[]`li]^SrqWUUUTQPSOH}ſadpmkkkjgwplmgdddcb`^^_^]]aegheb`_```_bda_[UQOPZ`][XVTQRSSSTSOHJ]pqnprvrZW\accoqVEILLNPPPQU\deUMRSPNNKNPCJLYZVVUOLLMMQWVWZWUUUVVUUWWUSRRRNOOFHKKJIJMMMPQPNNPSSQOOQQQTId\KQVchd][YTSUWVUVVUUUURQWWTSRSSTTTTUTRSTVTQQRSUVUUUUUUSQPRTTRTSONQTTQONOOPQV`mv{}yneWIFFGIKKLOMIJJIIIJKKMQZVVcmmwt]\W]WXSITfeUMPTSQQQPPQ[hdX]wv_ZY]nwj^YVV_r~mbYRNJFO[\Y[YZXZYWVTRQPPPPHFU`_YVUUSSSQOOMICGPODCEDCCCCDQXPLJFFGINLHFDCBCCAAELONNOOMIECEFEEDBAABCDEFGGHHHHEDGMNKIHKJIJJJIIHIJJJJIIHIIIJJJJJLPSQIDCFGFECA??AA@ABBCCEFBBDEEEFECBCBABDCBDHIHEFGGHHIKMMJIHGFFGGGGGGGGGGECCBCEFFDA?>==>@A@AAAAA?=<<<===A@>?BDDBDDDB@@@@A@>?A?@@@@@?;hq??CBA@>>?><;::;;:::::::::9:;;;9:;;96545455322344423347877656647CB===::;:85333@B::;8677=>>??@@?@@A@@@@@?<8889998879::::;;<;<<<<====<;;:98888888886689::9:>ABD@;:;=ABGIB:;>@?=>>>=>><>?>>>?AEB::<;;<<<<:75678999:976579;>=:8533423677899999::::::;;;<<;;97544322100100132364325212111112358:@H>15>D?4/48<==@KVVV[J/*-479=<30420.,((17<745/+.30+)*-0463.(*7KszA+4:;3110-0202@JBF`dNJ<-.=2-0.**3A?1*3@=/+.26674/.,*),1..5>947::9754..@B(*1845797558740+)-41.67/.6;>/*)++(),,.00**,.1455324432/..+,,+))**3DF8-+)+4>=80.18704<=;5-*,-*,..,+**,0?G92552;ZuuX6*,-+((++*)+///16441/-,-.--.,('079?A?@DGB::@DCDDA?>=<;<>@A:@ABFHJKJLSSNGC94312>>:===?AAAAAAA?<<=====@@>@BBCBCCEEDD@??A@?>???@AA?@{X8>@A@>=>?=<<<<<;;<;;;:::::;;;;99:;;743346333345542344689::8886>EM?>>?=ACB?<>=869975437?91799768DOPPRVUSRSTRQQOG@95422333433234467544414>=6112333;EGEDDDC>9=FIIB745<><<=>>>=?@?>???@@@??AA>=::;;:8667779:;;;;<;<<=<=<<<;9887779998865799989@A@?=;;=?BDJI><><8:EHC?>@ADIKMKFBABA<89<:975555457887644433444444433466557669>9455544344322110000000000111212468:87653223467878989999;;988;=<==>?=>BHIB=;;;;::;<96456788:::9876994023333112469::::;;:9::;<;;<<<<:85433221001110+*,.14761.00012333795?PD79889766:>>=;EUVUS=+,.347<;3041-+-4348@96564353-*)-01.,*)359bg92:@A5/.025872:GB6PveWK?-.+-./-3DM7+/..,8@B>:74/.....--*073,---,1563/+++(()(,01.,+,1445311220//-++++**,/5;81..-.39>;41/.02585/*(0761.-+(&*.78@LG<577-5[Y(+,-,+)'&)+/7:1486551.--/04>D9.19<@?BKURKMRNGC??B?95:<>B?:20:631-)*-..,*0:>>:5,)2856;<^__]]]\\ZXXXXYXWXWVVUUUTTSRQQRRTSPPPPQRRUWSOMLMNNOPQQQOOPQRSSTTTTTTUUUVVUUTTTSRRRQQRRSSTWXYZYWWVUTRQONOPPQRTUUWWXZZZZZZYXXVVUTSQPPONLKKKKJIIIHIJKKLKJIIHHFCCHLOTWXXY[YXX[\XWVOJIGFFGGGHHGHHHIJIKKJJJKLMNNNOPPONNNNNNNNPRRRRQRSXlu]Phrb[^```dmi`^\Z]^]]_fw{uuzzvsmnsu~ynmpuusvz|vf^^[[^__chgcdkniffc]]]arxaZp]]t|}xusqpoomjnln|{}xx{uvxx{}}x~]h|ywtouy|pgbWTTSU[hqjmbR[jcWSSSSTMKĿƱlmopsvvutvqrqcccbcc`]]][ZZ[]abcda\Y^^]]_[SOPSY`a^XRPMKNQNLKHHJJNZhjn||j`\]blttUGIJKLLMMMMPMKM]_NMSRMNQEfZM[TSPMOPNOQRRS[b^YXXWUUTUUUUTQOOMLMKIHJLKKMMNRQOOPTUSRQOORSD`^ejVXayw`[^a\LDINNOOQSUX[`eZROKKMRWWSTTX[_abbba[SOOKKLLLJKOPMJILOPQPPPQTSSSRMRhsvsn^LKECHLLKMMMMMMLJIHHHJMUcfc`^Y_qgRQPQ`fXPTVTUUSSSSSQVuy_S\w}e]]jsZSTW]fmmi_XUW\`dius]V\UTTSSQQQPOOKHKPUUVVVUTTRTTMLTM?BFDEDCBBBCOWOJIGGIMJEDDCDCDDAAEJNSTSTPJEBABCDDCBAAA?ABCCCCA@@?BEEDCIMHFIIIJKKJHHHIIIIIJIJKJIIHFINSRHDHHHGECCCDCCDEEGHHIIIJIHFFGGFDCEGHIHGIKJHHHFHKJHGHJJJJJJHIIGFFFDDEDBBBDFFECA@><>><=>?>?AABBAAAABA?@@A@??>??@?@=Dk?8A?@@==>>>>===<;<<=>;9:::;::;;;;:;<9533324457666653433359<<;89AAA@=;>?ACB?;;;74675433683.47985:JQPRU[[XUTTTTRJA:76554322233344467634423553113313=FFDEGGFB8249@GF;88====;=>>@@?>?????@>?A?>>>=<=<97665579;;;<;==<<====>?=:98888998865799;<=@?;9;<>AEGGG>9>@@>?><;@EB@>=BGKMOKECCA?;8:;97644664455444355554433322224667766779965555544444433210/000/001123345427=<<;:84235545777778767656:<>?>@A??@@B@>?<<;;;:89:65534556798788742232103310169:;<;:999;<====<;<<83311210123220../15762.,./0235447822>A;;9556779:;?=AMRRC1--.//.67..2.+)(++15==9678975/--.2/+)')65->E5;@F?/./17:<:34??,'5A>?UB55-13/9LG,+10)*7D>/$,551/-**+)*1:?9646762,)(.E9=MOLD?3--+))))*,+/86-'()+-,,331/+(&(,-.,,++*(+,0/0011..0-)()*)),.1/,..--15740..,(*.11/+&'4:;B@40+'()-13;FD9585%,]Z*./.-6B;-)-/19-1621/.+*+.4BE6-=>565=ZXJE>AIMNPON>65=H@50351,*$'6?;892/-)*/10,)(.662/,**05:;=@BBBCB@AAAA@@AA@A@@@@AA@?@@@@@@B@@@??????????O·^5@@?>>=>?>=><<<;<<=;<>==<>@ABAB?;:864554433665347;849KSRSV[ZWSSSSPH@<:99765321222334356645532111243325AFFEEGGGHC:3257?D?<<<==;:===??>???@?@>>@?>>>=<>>;98665667:;<<==>>=====@@<<:8679<;86679;=?@@?;8:<=@EHEA9;DDHGC@=:;AC?<>BGKLLGBDB;:;;97665658;7433433445544422212224677777888875556654554444321011000221333552023578;;73444355667764455348;?CDFFEDEFGFGGB@??BA:>><;;;611111102343210/03653.,+,-/48898770*3==;943344448>=?EMF3,,+,-+,22,-1.+.8>4-17<83598750/./0.)''*42*/-1;?=/.//18<=:22:4&$%-/@m\99055/:F4'.32*(,3:/**230/-+++()177634563/+'(.C6:<42670',,)'()++++5;2)((+0896551,''*//+)+*+*)**+,.010-.1-(%'))**+*(,43+*/580',10+*-12475/0<01877:<@A=<=@CIIQT@4;F=/08;32MVF>AJKBA@@HKD60365/.1-/999:3.,*+.///-,*('(()))-675:`````_^]]]\[[ZYYYXVVWUTUVUTSTSPMMNNOTVXZ[]`^YVTQQQQQPONOQQQSTTSSTTTTUUVVVVVTTTSRSSRQSTTVX[\^^^\XXVRPOOOOPPPRUWXZ[\\]]]]\\\ZWZ[YWUTRQPQRQQQRQMJJKLMLNOKJJJJGEDFKRUVUWZ[ZYXWZZXVTSMIHGHHGGGGGGHHGHIIIIIJJKKJKLMMMMNMLMOPNMMKIKOQQZwkaa`bdefccghfb____][k~|xwwpnx~||}{vuz}|dX[fdXW`gc`aaaba_ab_a_guz{iku{}uponpoosx}~|xwwvrkd`cjjaj|uwutt}utxgVQTWW_kigeca`aehkgfaXPLQ^dg¼nlmnpwyxww~rdadcba]YZZWWWWXXWY[WRXYTRSTTVX[`_XSPNNNPSTOILLKOMNbuszf_adlxxn^RNMLJGFGGFGHHIJKLORQLLKQMVgCJKRPLLQSPQTTTTVUXWVVVUTSTSUURLJMLLMLKKKKIJLNPPNNORVSQQOMMOJ]VHP_[YkufVSTKJĕyf^ZVVX]^]^]XZfkkjgfhfcabcdefggghjjhjjkkjhd`^\][WTRTVWSPOPRSWROdl]RRUOHHMQQPPONNONLKJJIGHWb\VV^khSYiRPUWUQSUTRQSUSSTRPQSPKi|fUQV``VOPNMMKLLKJIGEFHHHGFHHGKQSW`ylP]]TSQQQPPOOMNPRQKMSVSSURPRWRGCGHGDDEDBAAAJUOHHFFEBBDECBCCEFDBEHMQSRQMGFFDCCCDCCCBBA@>=?@BDCDB@@DEBADFHJIHHJJJIIJIIIIIIHHIHIIHGFHFGIIIKMKHGGGFGHIKKKHGGGGGGHGDDDEEBACEEGLKGEBBBCGGHIIIHFDEFILLKKIHGFGGGEDDCDEEEDA<:=CDA>@AAABCBABAAAAAA@@@?>>???@@@A@???@@???=@?8S̛F;E@?>>=>?>==<<<<<==??=9:;;;;<===<<:779988988867754212344357?AAB@?>;986644332366788:<959ITUUWXTONQPJE=:::86543123333334466645531122222229CFFFFGGGIKE834139?A?=>>=;;;;=>>>>>???=>?>>>===>=<:;:8764679<<==>?=<<;9:;:;<<=<::975467:<>?@?;9;<=DIKKLNLKJIHHEBDIJKFFHC:531025766787421011137<>>?=879;:9999:;<====;:96432112223544421332/-,,,,-.4<@A?961/9=<=;522223469:@903PMA;5=7-57*.553-)*(*-3/.0./-+*)++/0-24643,))().=5-*&'*./.02-()*+,,(0=8,(),,<5/*('&1CHAEPMG>2,-0/.DcU3.-('+.1/-*(*()/5::631.*-7AGLNPRRLOSUXZI6.+-460-7=?ACDLJ5%)7=:567549=FFB??<:?DKMC71;DCA:0%AjT74ChfE<40JS5+-;LG8037:54>>1-9;92-,.-.,+++,-12-)))+.0013````____^]\[[[ZYYXVWWUTUVUSRRRQPPRUWY[\]^`bcc`]XUTRQOMNOQQQSUTSSTTTTUVWWWWWUUVUSSSRQRTUUWZ\][[ZWVVSROOOOOONNQUWXXYZ[\]]^^^][\_aa_\ZVTSTUURSVTPOOMMLMMJJKKKJKMKLNPRUUWZYXYZYYYYYXTNHGIJHFFFGGGGGIIHIIIJIJIIKLMMMMMNNNOOOOMLMQX[\Z[cr|k\_ffdgihgiiigfcbcc`dz{|pr|wpv|rorsngcfpy}snv|q]SW^__```ab_ejfnzxu|uqpv|tntv|{tleaelhal{yyxh]h}~qw}yroXRUY][\]`cddffb_bbfgd_SYkvprĿkikgm}mnloztecfdba^YZYVUTSQORXZYX^b]YX[]\\\[WTRONONPTQKLPOMNMLYlqre``esypmi\LNWUQOKKNNMKJIIKRUPLNJAvzFILLKMLMTTQSWVVUSSUUUUVVTSTRMPNEHLKLMLLLKKJJLMPPPOOSSRQPNKLIHowGMN[c]fdaZ]b`Ryʦt_caWTRRPONNOWcifddfedcccccdefikkkjiihijjiijiihfecb`^ZVTTSSSOWiaOLPSRQOPQQQQPMLV`\SNKHGIQUURNRZYOLgaOU\XRSUUSQPQRQSTRPQRSPLQSONMJJLLKKKKLMLKIHHGHJKKKKJJLNPQRSWn~nYZXSQPPQOMMPSSSQIHRTTURNUYPHEEFFFDDDDCCCAHWQGHHGFCDDDCA@@CDEEFGFFKONIDFECCCDFFEEDDDB@><=@BCDB@BGGCCDEGHHGGHIIIIHIIIIIIHIJIJIHHGGFHHEEILIHJJHFGHHJJIGFFFEFHHGEDDBBAACCDFJGFFFGGHJIGGHGGFDDEFGKNNJIHFFGGEDCCDEEEDA>=>CHG?>ADC@@BBBAAAAAA@@@??>???@@??????@A@?>>><9s̿l9>A@>>=<<<<==<<<<<==>?@ID:::;<====;:88:977666666533457:;<=??@>ABDB@?@ABB@>=<98666544345579;;<=:5:JWXXXSMPSNF=:87:97544333333333456664653111111333;EFFFFFFGGIG9385./9@BA?>=;;;==>>===<>?>=>>>===>>=<<<:8876569<<<>>?>=<<::;88=::;<;98;<;AIJIIE@<987@G@;;=BEA99:8998420023369:888887878;<<==<<<9754233552344575465/**++,,--4>?>=7337>=:<:4100366688:>;50(&.1//.,,--...01,%!%***+02,.97/,+)(&')./+,11,57++//.-8BC8./:<5-2118665-*)''*,4>:,'+,('---*'-42+)(''('+4203>7*(.34.,))***+(,9>3*,+)7C:3331*,/+'&%&'+.//0021,*)/54+'&')*,-/489?>4.39933100/.07<951-)('$(6?>:94-&%*2<;=UY>/,((*-///-+++-/25521.('4DIJIJKHGKOPNMLC2)5N`cI/=IGDBDE1!&2:<5;FMLA9=ANaO06frC023ET@-/52QY:0:KJ=347755>G>*/>91-/354,'',+,9?91/,*)*,/0bbbaaa`__^]]]\\[YXXWWUUUUTRRSSUWXZ\]^`_aaadfb^\ZXWWTPNMMPRRSSSSTTTTTVWWWXXWWWUUUTSSQPRTTSUWVSQQPQQQSPOOOOONNOQRRRRQSWY[\^`bb```bcdc``^]\\ZVWXVUTSPNMLLKIHIKLMNNMMPSSUYZVUYXWYZ[Z[ZPIGHJHFFGGGGGHHIIIJKJJIIKJJKKLNNNNPQPPNMMNRTX_^WTX\`afjilokikkhhifefff`i~xnoxytwzi`cfdbcb``cpzor|wh[XZ``^_`bdfgw~ps}zvtssvqpuy{rkhefpj^gwtlbYWe{v~~^ZatiPOYcc`[\_flmruwtrmjmsskgehplwĿicf`eihggmlfeeddc^XXXVUSSTRV^`^ZY`fb[Y[[[ZURQSQOONOOMLOPNLMMLN[kxfa]^hrrgistl_\a`[[]`bdfbZTTTTUSOQC[[ALJLIJKMSTPSXWVURSTTRQSTWXMEecDHNNMMMLLKLLLKKKMPPKMVSRSTRQSL`XOTW]a^[[ZZ[_c[buVdtj\SOOONOORY^`_____`abbacfgjjloi`^^____aefedccefdbaaaa_]YS^eYQQPPRTRONNMNONM[jj`WPJHGHKPPNOMMMIKiYRXYURRUTRQQPPPQRQPPPRTROOOPTYSNLJJKJJKKJIIIIIJJJJKLLNPRSSQOUbwpTWZTONMMLLSZUNKILSSRQNRXRGDFFFFEDDDDCCCAJWPEGHGGFDDCA@?>@ADFFHECGIHGEEECABDFGHGFEFEEEB@@@BDCBFHHHHIGFFGGGGGHHGFHIIIHHIILKKJIHGFEFGECEFEHJIHFFFDEDDCCCDFHHHFDCBBBA>=?ACBACGJJIHHHGGGFFFFFFDBFLLJJIFFGFEDDCDDDDBAFHFFNVODAGJGCBBBAAB@AA@@>??@AA?@@?????>>>=<::97:͖G7?>==<<<;;<<<<;<;<;<;977677554547679;;;<97BTYXVRMPUN@:9889:97666554331224655664444432123459AFHHEDEFGGFB9563029@CB@?=;<;==>>=>>???>>==>===??>>=<;98877899:<<<<>>=9347:@JPRPHA>:45:<<<::;<:7567:CIHHIF?;:769?A<=CHJIHEA=96564279:;:865310123544444433457753234578:<:97553455544553320//0000000000000//135897664555588448989986579::879:;A<1*3;;4.2578=><<:1/4786131,**))&&0AG9+*)*,0/,****''')-12./13.>]Y6%/KF+')())+--+2@B=CVR5+'''%"#*053*%)3DRYUDFK4.*((*,-//,,--//0110/.**8DC?AGFADHHHIIE=-*R{xgPIOPKLQL=<:9<>BEDFE>3/@PPR^aP<8ADA=965;XaOVgM.+5EEW[M\rN7YU;?BAEC:4577;AA4(4?53:==;61//,,:GH?5,(*-./3bbbbbba`__^^^]]\[ZXVVWWVUVUUWXZ]__`aabbdeeebYTSTTW[ZWRONPSSRQRSSSTTUVWWXXXYYXVUUUSRQPPRQQPOPOMKKLMNQQOOOOOPPPRRQQQPOOQRUY]``\XVV[`cfhhgcbc`][XTSSRPNNONIGILKKNOMMOQSVZ^YQSXXY[[[\^\SJDHKHHHFGHGHIIIIIJLKJIJIHIJLLLLMQTSNLOPLHILNS\]RLWfnqstrnkmokhghhghe`ap~onx|{y{{}~jaba`bddccdkoV[crtf^\^^]_chlgd~rintz~yvulcgu}wyu|qjibdsn]gxtc[\^dtz~zeZVO^qcOP]dcc\_cnvllv~{~ztsrlqrdüyjf`^uucfeaabdddfd[RPRUVWY^_]_`]YVVZ_b^WVYXVUUUTSQOPOOPSSPNMNOOLO^}j^_agomc]aiklopqk]Yagikllib]\[YY\XQ{FLLJMLLLLOROTYVUSSUVTOORV\SKj>SWROMMMLKLLJIIKMPOIPXQRUWVWVV|KWVXWYXVYYYY\]\TzyQVhvlXNNNNNPRU[\[\]]]]_aabcfihilpi\\]]]^``bba^[Z\___abb`aba`_][]_\ZYYWUSNJLMMO\ggec\TNHFGJMNLHKMKKYnzn^]TORSRSTRQRRQPQQPPOPQPRSQONOQMKKJJJJJIIIIIIIIIIIJKLLNQSTSRMKPYumUZ[RNKJMRYVQLHHMVSNLSWPHFFFEEFFFDDDCBCCMTJBFGGGFDDDCDEEEDABGLPNKHFFFEECBDFFFGHFEEEDDDCB@ADEDGHHHIIHHHIIGGGHHGGGIIIIIIJKKKJIHFDCDFEBB@CJHGGEDCBABDEEFJMLHIHDBCDDB@?>>?>?CHIGGGHGIIFFFGFFFDCFIJIIIGEEFEEEEDDCBBCJNKGJTXQGGORKDBBAABAA@>>?@@ACAAAAA??>=;::::85875ne:>?<====;;;<<<:;;;;<=??@A96;<<;<<;864677655655443457==<==>?@CB@?@A?=<:965667765456889:;:9747L\XVTONPH<68:9999999888754324446677643354333224:ADFHGFCDEEGF@74557:=??@@><;<<<>==>??@@@??>======>?==<;:99::9778:=?<;;<<=>=<853468=GPTUWQC<8777679:88989:BGGHHGD>8514:?@?BHLIEA>97646689;;:855321123566666666799::52343357:<:7554345444455520.-/00000000000/.014778876445546842368:<:;:99:::89877659AGNRSRQQPMNNNPOLIIKR[UA21321//0369<===:75335558:96789:<;;<<:753313576344445664/,+*+----.1:7-++'6KI<2./0.,.4872-.3575.3@?;8640-,,+))('),143-*,-,.0.*)))'''(+377:3164.()+3:D=67B@0;XL74/38;988::42671++,,,++***0230+6A/%))*/122,,8>610042.,*-330,+,/048;::755685,&,99.'''*1557:<;9541.00003555551.3<@ALUI;@@=6;@:-(((()+/28HO:(.9K`oe96KF7*((((+130..-/0/.010003672/3>GJJDAJNP@4+6\rrvyp_YXWWZYUQF@>??>BFGD9*2HRRYd[@388430/-,5/@L@359:;=@<)'8=?HH?::751,(8PVJ7-.00255bbbbbbba`__^^]\\\[XXXWVUUVXY[\^``abbbbcefc\UQONPQSY]][WUTTTTSSSQRTTSSVWWWYZYYXUTUSQPPPPOONMMMMKHJKLNPOOOOOOPRSSSSRQPOMKMPRUTPNMLOTZ^_``^[\_^ZUOLLLMMNNNMKJKKKMNMNOQV[]baVOU[ZYZ[\]``VIDFGIJHHIIIIIIIIJKKKJHHHJKKKNOOQWZVLLSUPKLMShrj^Zjx||wtpjlqnkgbdjkgecaflkip|}{~zjafec`_aeffaaip~}gWQX]\^^^]Z^hlljfx||rgny~xvqceyu}l{uodZfvm`n{n[[`__ltbO^a]ggY[kqia\VX[_aZST\ixsifdc`airrpgxý­wlgdfb_bbb`_ceb[USU^a\\bhe`b`YUSOORPUXWUWYZYYXTSQQUX[\ZWSPNPQQPNX~f`dmunb\]acdejqz{m]SS\bcdec_]`adi^s`JPMLPQOMMNPPVZVSRTUWQLQ\dWKKGXVSQPOMLLKJHIKMNQMLTSORTUUVQbYSZUSTVYXWWWXWX[R]}TV`twaOLMLMNQUYZYYZZZ[]_`abdeddefbZ[]]^`ddbaa^\[\]][\\]^ba`_\\]bfggdca_]XSQPNMWccceb\UNMJJLNLJMMKTa\ZcmgPMQRQQQQQRRPOQQPQPPQOOPPOMMOMJJJJKKKKIIIIIJJKLKKJLLNOQQQQRRLJ]xeU\UOMMPV[UOOKJLUOKSWPHGIGFFEEFFEDDCBBCHLEBDFFFEDDFGGIIJLJHHJKJJIGFHGEDDEFGFFFEDDDEEEDDDCEFFGGHHIIHIJJIGGGHHGFFGFGIJIKLLKJIHECAEBBCDCFKMLHECCDIMQQRSVSKJKIGEEDDCDDBAA@AEHGFGHHGIIGFGGFFFFGHHHHHIHFFFFEEEFEDEFGHHHECDMUQHJQRKB?@CBBA>;99:9:84:;0VD=@=<=<====;<<;:;;=>?@@@@><::;;:;;9754688868889::;;<=?@=<<<;=>>>?ABAAAA?<;<97545666666788899876519Q^XVTPND748;:9:::::;:<<;:8666555678643444443215@ECDBDHDCEEGGB95889>====<=>>>>>>>>=<<<<==>?>>==?>>>=<:99:8668;=?>><<==<<;9:=:733;CT^WPF:65466538;;:=;;<<<;;<;:8669AMUURUUQOPPOPONMLKJNP:-40,058;?CEEEC@;9754456888878:<=<<<8421223478355455430,,-,+/0.---1/*+,,E75NF73(*//*+047632.*(()+..*&*5:7/,6;;<=:2.-+*('((-+'2CO[T9+(,594/-,-'(+.6972-).:=51561,-02784-+-.-+.6:730000/,+,44.)''.7954676675-*-02555432117;67BMKEC9667>;9+(7FA2.599?@BCB@?BCCCCC?98<:9:96::2Mk>B?<<<<<<=><<<;;:;>@AAABABBBB?@=<<74248<;<=??>>?>=<<==;<>==@BA@ABA@@AAA?:9;95345776666988886557::9964567764486333223;EEDB:>FFDEFFFE@:::;=???==<=>==>?>>==;;::;<<=@@ABAA@ACCAA@=;:;<<:777:?@=<<===???>;;:8866CVad_SJC:670/8<:::=ADGHIKH?8710;@@@DIE<::86558:;:::97531123346656788777778754323346785445566555544332100100///1233222468987888766530/110134679<==>>?A@?@@>><;:78@ACHJHHHFEDDA;633458:::9:<=<<<832222221/26655431.+*-,,020.,*+-,,15=;484,04333450(()().66..-+))*-.-340*(*,+*,-/.,,,,-,*-2337637968744;ED93:@6-5668531,((*.0/,+*))('+/.)%)41--+()/;KSB/,+*)(((*28.-9_jN/*4851,%(*))+.783,*))4?82640-/59>??821-,)(-2.+)())*,,.0/,)()/:@;40248<7.*-4<<62000-1=@6.:GEEE3/3792-+)''(+,..*'2DJJLFD]jG6CWW4%((()/332/+),220/011/..,()1AEGHGFLPL<2778C8dT-462,+/79/'.58=?5,.,+:G>,'+033-(FcW=6;A@:2/9ccbccbaaa``_`a`^^][Z[YXXWVUUW[^_`_^^\ZZVTSNMOPPPQUWUUZ_a^[ZYYXWWVUTTUVVWYY[\\^]WPNOOOONMLLKIHHHHHIIKMNNNOOOORSUWXXVSSUURPMJHHJJKIFGHHGGIIHGHJMNNNLNPPPONMMNOOOONNNOPRRQQQJHMNMPTXZ`fgd^SKHIIHIJIIIIIIHIJJIHGFEHJJOVXXSNT\VKSehfabtvuyvnikssnicafmplb_baabaansgftzqpnmov{|thfgede`^]Y[\cntqv{tomigiqy|sttrpmvzsrsufn}kfjtzs]YujajeXY][]__itt}cHLitv{aPasv}cZ]\UUYXTTTZ^YWVTROMNTZS|nkqvx|zrfb_^]\jr_\aj_IBBYcWPRVWWXWZZXXYUQTVVUS[bZUSRPRROX|abkh_YYXWWZ^`baciqqlaSKGGKJOTRU[Qp|OIONNONNMMLNPW]XSSRONLEI[gYG|٣CFRSSTRPPNMLJHKPQRYZQY]QNMLMSNdVRUSRSSSSSTSSSSQQTK\_YYSYmlSJNKLSUTSSSSUVX[^_acddca_]\[[[\^_^]\ZWUVVUWXWWXXZYYYZZZ[Z[\[[\\^`cedcdea]_``^[[YUPOWZYTRZ_]OKRXZUSRRSTVXUSPOPOQSSRQQQOOOONLMOOKIKLKKKKIIIIIIJLLKKKKKMNPPPQRQPOLCK`cZPOQSUWSOMKLHJUVPNKIIIHFFEEFEDCCCDCCDCBBBCDEEFGGGGHFGFGGFEEFGGGGGGHHFFGIIHFEEFGHHGGHGFGFGIHGHIKMLHGHHHIIJIHIKJJIHIJLLLKJEAGKKJMMJKMQQUXTRV\`a^\ZTNIGHIHHIIHEFGGGEEEGIJJKJJJJIIGGGGGGGFGHHIJIFEEFFDFFEFEFGFIKIGFEECDGIGCFLNLJGJHA?>>>ACCBABBABDDA<:<9;;;:977cH@B?=<<=;==>><:::;;>@BAABCDCEEDDA?>:778>CB@??=;<<;865789:;;;>BBAAAAA@?@A>9::731357766789:898756;BDHRWUPF>;88::;;<<<;;=@AABDDC?<:655567649@=433225@GEDC95>CDDFGFE@;;<<=??>=<<==>>===<<999:;=>?@BCCCCCCBCA?=;;>?=;@>>;77;?;:;<>?@@@?==:99877@Wgffe_YO5$.689768;@BCEHFEC><>CECBFHC<::9889:;;<;965311135667678888877766544333245554334566555544333234431002223322357899888766631//00022223688;>@AAA@@A@@?<<;96:LZWQPPRTRQRRQRPMJFCDDGJHFDEGFDDCA?BFFB91355788;;;==<;<84222222111243332/,,+,-.133/-++---2891.2/.02454640/0/-.3773-))493..-*))*02/1.*&'++**.352.--.-,+-0.39;:999:99::;=;99;7159;8785/+))+,+**++*)(*--+*++'')'%%$4\aD/,+*)))+#7L0,-92-/5862/...+1:??89DFB>87654-++)((()))(&&'6HKFC>>B>34R\9&)***+-.//-+-11000/////0002220/?TI,*2487;\z}nN-3HI:48;75433463/1:;47BB:<9Mc\"(-02.---,*'+28>8,-95+0;9,(+.04.+LeP>CFA@@50Bfffecbabaabbaaa`_^\[[ZYXVUTSTXZ\\[[ZXVUTTUTSRQPQSUVUSUXZ[\\[[[ZYYXVWWVVWYZ\\]_a]UONOOOOMLLJIIIHHHGIKKKMNNOOPTVWYZZWSSTUTSRQOMMKKKJJIIIIJKJJLOSUSRQPPQSSPNOPPPQPOMLLJHHHGGGFFHGGHJOUZ^`ba[RKIHJJJIIIIHGIKLJIHGGIJJJLT]]QJQ[VNQ`rnh}yo{~uokmtvofbb`drr]Vch`aoyumfbgorozshjnuyyzteb`_da\\]gnz|qmianxf_ij]\i|xrzxsPhladlvyq[Zszhac[X[[[]`acddmo^Z`xypswhYfvvzyjZZYXWTSSSUWXZZYXVSQQQRWLmqklpt{wfbcdoxxxvsmryfZauyZTXYWXXWZ\\]\[[][VazzbWVTOORSRRsw_a]XYWXWUSUY\`eghjkmmgbVIFHJIGLLG]`KLNMNNLLLLKMR[]VQPOKJGDN^bQ;c;PQQRQOOPMLJIHKORV\ZW`[QSPNMMXrMUSRQPQQQQQPQQPPRTINyo^RPLUohNIMMQWUQQQQSTVY]`egfeb_^\[ZZZ\^_[XVUUTUUUUVUTUWWXXWWWXXXXXXXXYZ\]^___ac_]_^^^_]RSY]_a\^dUNJKQPRSRSUZ^dieca\UQSUTQPQPOOOONLMOPMJKMMMLKJJIHGGJKKKKKLLNOPRSUVTQONLFL_fYPORUTRQQMKJ\\KGLKIIJHFFEDFEDCCDDCDCDBBBCDFGHIIHFECBBFJECEFFFFFFFFFEFHIIHFFGHJIGFFHFEEEFIIIGHIIHHHHIKIIJIHIJKKJIGIKLMMKKLMNQNLKGKQROSbfeiic]VOKKHIKMLJKKJLKKJIIIIJKMNOOMKKJIHHGGGGGGGGHIIGFEFGHGEEEEEFFEFHIHGEDDEEDEECBDFHFDGKD><<;:>AB?>@ACDDEA<8:;;<;84D~q5??==<>=<==>><:::;<>@BBBCDDCCDEEDCBA?@@><=:97655566655566467:>>??@A@@?>=;;<;622357766789:998757@DBHRUQH@=>==<<<<<==<<>AABDEEFDA>65677768AGB734449CGECC>99:AEFGGF@:<=<=>>==<<;::986568<;=?AABBBCCCBAA@?><<:8:@CB>@?A?;8;A?::<>??@@?>>=;98865BU``_ddbO5243111358:=BCCEECBBCFHKLD>;=;:;;:::;>=933311146789789889987765334333233333224666555554323455543333222222246899899766531/.010221134448>?@@I^g]TRQPTVVUSSSQNMKGEFEDDDCBA@???=:64990+'')***++*)()*,,+*)(((&'02-FlX5,,+)'''($FH),/'$2E?:730*)))))))..+(')('1??9984321,$&0//0/--/0/-,+,,..,,,*)(,5AF70,**+1883130+---,,,,/25>CDD?86799751.,*((((()))(&+:IF;5/*+*&8J8(),+*++,--.-/0/010/.0234762//./AL@/25.06;UwuT/0EB68>A>7455321226639A;:B@9;@DHOLQ\EL]MGEGV}wD<0,-11/262)')*/79/)-37506=956/./-0NWA>ML@867;Cedc``bcbcbbbaba`_^^\[ZZYWUSSTUWWVWXXXWVWWWXWUUTSUURQRRSUX[\[[[Z[ZYXWXWVVVY[[[\]\XSOONNNNNMKJKJIJIIIKKKMONNOQTWYYYXURQQSUWWVVUSQOLKKJJIHIJJJJLSYVRSRQRRSRRQQNORQPOOOMLJIHFEEDDDDEFHLLNRUYZVOJIIIIIIGHIHIKMKJIIHIJIIINW_^RJPWSGGYcdwse|{hlsmntvjZWXSXrv_Ybeaar|megddfcZ_rqijox~{yx`]_hka_l~lYWuzzxmdfc[Ybw~mxvWdugx|bKMbhX]dkrrgZW\\`c_ZZZ[[^`abbdfggmlmvwusplpvnh_WXZYVUVWVSPQQTWWVUSRPQQWP]xokijkc[comnxun{~z{oTXVUVWTTY\[VRPVcketSPOQTQQUXVdzq_\TQVWWVTSTTSX`cfgiiijpnZIJLIHJIHMNLMLLKLLJJIILSYYUOKKKIGEQ^\JE@ILMNONLKLJIIHGLQTXXVY[TSUWUTG`LOROQPNOOOOONOONNOOKHj|eNNOIYo^HJNPTTPOPOOPPTY_decb^[YYXXXXZ\\XSQQRRSSTUTTTTUUVVUTUUUUUUUUUVVWXXZ[[[[[[[Z[\_[RZdaabe_UVWURQRSTVXY\bcabeid[SSTRQQPOOOOONNNPQMKLMMMLLJJJHGGHIKKLLLLNQPRTUVTSPPOMMS_[SPQSRPPOMQa]IFIKHHJJJHEDDEDCCCDDDDDDBBDDFHJIIIGDBBAAEGDACDDDFFFFEFFGHHGGGFGHIHGGGFECCCCEGIJHFFFHHHIJIHIIGHHJKKIHKKLMOPONONNLIILMNSfwttsuoRHDBCHKMPPMPQNLMNMKKLMMMNPQPPOLJJIHHFFGGGGGGGIGEFGGGHGEEEEEEEEEFFFFDDDEEEDDDB@>;ACDD=569:<962\L=<;;<=?=<====;::<;<=?ABBCDDCCDDDCCDCBCD=5545446667677764446789:=@???==<;<>?;434557765677997776:CECJTVMB=@CC@@>>>>>>>?@AACEGGHHII?979987>>=>>>><;;9899636:=?BCCDDCCDEDC@?>=<<<<:9:;@DF>=GG=9;=>????>>CHB:8995;S`^]\^`E200/.,1359=AABBBBAACCCJRL@:<89;<=>?<=<722676789:<<<<<<;;:876643333323334332246655554442267755653221221112468888::864310//110111156446:>AC@@BBCDDEEGGILSXTNQROOQSSTTSQPNMNJCA?>>>=>=<<==:9<==<77:2).6999;<<<;8201113453322322-+,-../12211/+,.-.2564/+1982245:=7*+.,,..+,----,,/0011234320--/-.675/8;2/7?==;8@IKTM3Hk`F@ADeD"-+12/1793*('(-1/*+--23.1=?<;52/*2C=+/>A9-+159\[Y[^`cddcbbceca`^^\ZZZYWUSSTUVTSTUWYXWWXWWXZ[ZWTROOPQTUWYZ[[[[[[[YYYXXVVXYYXXWUTSQNNNMMNNLJKKJKKKKJKLMOONNOPRSRONNNOOPTWWVUUUTQMKHGHGFFHIHFFJPRQQRRSSTUUSQPPQQQQRQRRPNMKGEEDCCEFFIHFGHIKMLJJHGHJJHGJIIKLLLLHFHJIIKKNX``VLJKKJKNR`cZpzaQXjnqxlWRSSOTil_adbcfdbdhhegh`Y[bilorz}{}{}|wq\dutsolhb^]arsp~lf]OOVenu~~td_`homd_]PM\d_ZYZ\]^accceeenqhbip{hhhb\WWXWVVXVU]_WQQPQRTTTSRQPPQTPu|pkjf^\beqsoqozhTRTXYYX[cipsmlnlllab^\ZeaTVYZ[`ji_[XUVXWWUTSPKKOSY_cfdbhriRHJIJLLLKJIGGGIJLJIHJNUVSPLIHIHHGQYX<{jAPIHMNLIHIHHGIJRYY[XTXUSXYVVRQysIMJKJJLLLMMNNMMNNLNQJZ{gLLSMI\n\HKMPSOMMMLKJKX\__`_\YWVVWWWWWUTQOPOOQPQRPSSRRSSRRSTTTTSTTTSTUVWWWYYXVVVWXVUVTVafa][WSTWWVTTSTUVZ^a`[UTXWSRQRRQQQQPNOONOPPQQLKLLLLLKKJJHGHHIKKLLKLOQRRTTUTSRQQOQPQUTRSQPONLQcbHBIJIGIJJKHFEDEDCCCDDDEECCDFFHIJHFFDB@@BDEA?ABBBDFEEFFFFHHGGGGFGHHFGGGEDDDBABCEKJGEEFGGHHGHHGHGHJKMMMMLMNPPONONMKJMNIQe}{{vWE@CDJNQTVX[YUROMLLLLKJKLOPPQOLJJIHGGEFGGGGGFGFGGGHIGDEFEEEEEEEEDDDDDEEEEDEDB@;6;AGHITdCHxiv~qWJD@>@>;779;967[o4:889<=?><;;:;;::==<=?AACDDDDCCCCCCDCACE?85355776776666643688669?A?;:==:BFGDB@AAAA@AAABCDEHHHJLNJ>88877;CGE?723>?==;98768:<<96;ACA@=>@>>EHB;:==??>=>=FTPB::9:<;F\cc__L7036.+458>?@BBBBA@ABB>@IRQJBDIKMMLH<;5467=@?AA@@AAACCCA><;:976655431245454334555444334327:877775312222212356999:;953100/01100002554578;@D??DGGGGIJGDBA@AB<=HOLHJPRRRRQOLPNA=>=<;<<<<<=><8877778;6--2589;<<<;82/00/1454421120,+,.10/13111/,-0002232//6:6212389763//./7@GI?5685+',265/,+,.,,3850385332/,++*)(+36640.,*(+/0/-,*+,-..-296,))*,-,*)--++)(--*,//.-,*',@W_OGMLB3+.-+/492?P3,-.44+:\]_``T?>:420-)*3497/-)+6?80-*((*((>C1/661+&'*,--.)'(**+..//>J6(),**)+-..,/51-,,,,-,))(&,56.(*+,-/11/..,)(+/+4MQE61257645>GRP?/,0.-//-./0//,,.012221/-+*+-..////1>E;5;>;5/KWKD45LendN;8979@ACBCEEEFFFGGGGGGGFFGGFFGEDDDCBABAADGIGFDFIIIGHJKKHIKMMNNLLMMNMMLMLLJILLGLrvd[TSSU\holc]WQNMMNNONMMLKNPNLKJIGHIGGGGGGGHGFFFFFECDFFFEEEEEDDDDDDCDEEEDEEC@=@FLRW[^nb<<=>BEN:=<====?>=;:;<=:<====?AACDCDDCCCCBEFCACEB<645566445555553468757:==;30<=:>AB@:4466888777766655549HNPWVMEBBCEFFDCCDDEDCCCDFGGHIJJLLJA977779>CFD<33@EDEEDCCCDFE?>CEEECB::=??><=<:<::@AACCBBCCCA@@?=989988:;<=<<:9;>>BBA?@><>BDA;;;>>>=??JVXO>9;;B?5Dakg[ND<550.8:>AAABBAABABBBAACFNSU\^aaZM@=;7:ACBACCBBBBBBDFGFA?@@????=9741245555445544333224327::86775434432101136999:9642011/021////04566679?D>==>>954552145311359:;<=<71/0100234531242-,,.12344222.,.12201110179410./11/,+,,,1:DI@2-671-+)(050,,,..3<;5332/-./-*./.0132/.-++,,+)(+.-,,,.-.,*,//.-+*-/00./1.-*.84*.35443/3ANUWJ;9=;5//-1;=IDJF=67.)-13SNGdrYCFKHHHF=.+6GD1,+(,;>4-/010,()-,0971)')+....+)*,-../0/03/++,*+*****)0=?4.,,,,..-,(&&'(&&$$-HOA=82.**.74+8V_R?7@IIF?FPWgQ++1/-+-2444441111100000012454333349AB<;>?6)#<j6,.*:URHE:36:@FHFCDMQME>73436>B:/+1@E:A\dJ32<=:><81+*..-./-,.020+.34553/+-55.-430.0254+*3602:9.%'TUX\_acegghhghhda_]][YXXWUTTSRRRRSVWVWWXXWWXXXXY[_cec]YVVWYYY[\\\\\[[[ZYYYXXWVTTUSRQNNONMONMNNNNONNONLKMNMMLLKJIIHHGHKLLKLMMKIIJKJJIGFFGGFJMKGFHJKKMOPRUVUTUXWVVUUUQPPPRUVRONOLGFFEFHIIJJKJIIJKJKOPMJIHILMLNOKFFHIJNPV^ZYa_ULILNOLMRYegaajk``ntcTVVUUSU\^]bb^]^__]Y]geij_]ZSh}|uzux|~}x~}|vkca`XZyuy{xwnaada``eqy{~nYcjjhhea_^_\YY[]]_a`ckialo_YZTMQ`\MU^ZYWVUUVVTPQNMNPSRRRRQQPOOPQPPK^vjgifeffkkddmruiu}n}^V^_\\]_elighg`WYZYZ[VSLDBFHKPTZ^dlgSGKLHGEFKNPLGHJIKKKMQQOIHIKKLOPNRXDz̀>>??AFFBABBCCCDDDFFFGGGGGGGEEEEEDECCCCA@@AA>>?A@@>>ACA????==>==<>>???@BCCCCCCCCCBBCDCABCC@<96655654454444455579;;963574>EC?=8766788877776664542:NSQVRJHGGFFGHGEEEEFFFGGGIIKKLLMMKC<766678;@FG?56AEDDEEDCBCEEHD??EGBD>==>>=;<<;>@ADDEFCCBCB@<<<<:98777999:;;;:;;:@CC@??>===?A@?:;<=>?BJPTRE<;9:KH3DckdXOH<454:?ABCCBAABBBCCBBBCFFDKUX[^WB7@CCBDBBBA@@BBB@@ACCCBA@@AAABA>931356655422343333233214898788776753212035699897420010/021///.06877878>C<;AFGFHGC><===;636:@GIHJNOPQTSLGD?=<<<<<<=>>=>?;435752244444579::<:5389994122337:=5-*++,04433551,/2210.///043/.-,,--.----/54/53.,++.*).124673.-,+++-20&),-+-.0.-+(&(,/////24430000149414664333=JPRPF:;<9860BWT<736PZNG2+/11H@0DfT.-636>BD:0=NH6*+,*/==1055.'(()*,..-***+-,+**)*,021///-+*,-,+++++,--2?A6-,,./12/,-+'&)++*5LMA82/,*((+/2-,Jj^@128=93;LXmF)03/+)-7:767643322124589::::8545678:<==@@:2-E?3,7HHDYiUC?:4-*18:5*+30)1;?DHC=704:84:<5157/*-/..025752596-,:C9-*TTW]`abfihijiihda_^]ZXXWVUTUTSRQQRTVVVWWWWXXYYY\_`_][YWVUVYYZ[[[\\]\[[[YYYYXXWUUUTSRQPOMMMMNNNNNOOMNNMLLLKKLLMMLLLJJJKKKKJJKKIGGHHIIFECCFFHHIIHFEGHIJKLPTWWWYYZ\\ZZXUPPQRUUTWZXUTROMLLLMMMKJIIMONQTRQOMMLLNPQRNFFJGTXVSJRW`f\SNLMNKIR[]acjvpgkwu_RSTSSTY[di\VZZ[ZYZ\_bjh^^aakv{}{yy}vs}pkrz|}teT`yu{{snlgddc`bimvv[Ydgfa\YWY\^\XZ\]\]_chifcd^[YXUQQX]hnaZWVX]cc`bclk\TUWROOPPPOOORRNOOH[rhfefjkgg_Y][VQWfkqľösq}zvg`a``bdfidbgli]WXVWXVVSJGIJJJLOTY^c^NGIGC@IV[[SLMMNNLKNTUTRUZWVUTRPVZLaRLMMMLKJIHGHHJNSUQVUQ`]NMONOKd~PUv}jji\[XPOgjijbSMMNIGapTGKMJIKHJ[bSJMLHJL=H^\ca^YXXZ]\WPMLNPSSQQNLNLLMLLMMMMNMNPPOOOPPNNNOPQQPQPPQQQQQOOPNNQT[VNOORTTTTTUValh\SMJJIKOQRRRRRPPPONPPPPPPOMONMMNMMMMKJIHGGHIJJJKLNOPPOPQQQONOONNHGKRTTUSNNRQHMQOMKJJJJKKGFEEDDEDDEFFGFFEEEDAA@@>=>????ACEDDBCCCBBBEGGFGGFGGGEDDCBBBAABB@@AAA@>?CGGFF>DHFEC>EIKMNNLKJLMLKJJIIJIIIJKMMGXqk]u~zppg\agdcaYVSQMPZcea[QIIJJJIHHHIKLKIHFEEFFFGJJLUVKEEEDDEDBCCDDDCCBAACD@=<:<=>>>>@CDCBAABB?>=>@@ABBBCCDDDDDCDBBB@?>?>??>@@=85666655443445568;<9466882DGA<<:987888777666555764@VVRMILKJIJIIIIGGGGGGHHHIJKMLMNPOL@85655579?FG>56CGFDDDCCBCDDGFA@CC@;;==>>=<;;;=BDEEFEDH?>>=<<;:987879<:8:;<<<=;:BDEB@@@?=;99?B>;<==?CIJLPKB<;8DPG1DjjkaVNFB<@DABCCAAAB@BEDCCAAHI@>LU[_W@=DEECECCAAAABBB@@AAABCA@@@@ACC?;722566641/.12333333331368998:;;9731122133587774300000//1/.//.29<::;99>C?<=CGGDB>>@B@<846@C@BGHHJLPRVXOD=9:;<<<<=>>>>??:545786554455667889833@FFF<30234;C@1)(()(*.1136960/000.../...-,,+++-//010/15896.+)**+,-01100132/4<8--22/+('*-+*.35664110/20050)-0/)-011.-+*-,,,.1367874123441/6::7/-1016=DE?=?<8=DEU`UC181UiM;,,.-1A?03AA7/(#!&,466;AC@;:94.3;4,..*&'')****))(()*+)'&'*0443210-+)+,,+++++.113991,+.3753331.//*,7CPP<070)%%''),06.BkZ70350++:897687100027CG>889:8=NL9:;>B@2-3887588446=FTZ[fkaVB5DM@357?MQP]\KLE/)*.20/,'+9<8DSSROE<538:21>B733/+14/-343/-01)&-2.-6:64UVX[\\`fiijjjiigc`^\YXXUTUUUTSSQPPPRSTTTTUUUXXVWVSSRSTUUTUXZZZ[\]]^]]]]\[[ZYXWWUSRSSQQPNMMMNMMNMNOMMNNLJJKKLMNOOONLMLKKKLKJJJJHGFFGGEDDDFHJLLJHFDBDGGHIKQXZY[[Z]```_]ZYTQRSUV[^__^^]\ZWWVSPNIIMRRPQRRRSRNMMNPSSMFHLTR][GMLQafcZPKKKMRTS[aer~utyiSOUUSSVatr^X_a\TU^_WV]`_anwmkwqqzqx|pdaj|kforwtkje_dfdaaddjo]X\bca]XTVX[][Y\___^bjjdhlgba][Za`eyycV[^hkeecbjqy|wnpsiaXQNNMNNORPNOLIqoffcdon\UUSSTRSTTV[ýlqvtywlecccdegifdgji_UTSRRSWVSQOONJHHJLOV[TLKHDBGSUTUUVXSOLLOQRSTTVRPPNMLQORARLLKKKKJHGFEFHOQQOSSU^UNPPOLMS\p{pf_JXzfkZJHKMMJMMGHKLIIJIGLYVLLLGGI@YnI_g_[XWXZ]VNKJILORVWUNLNPPNLMMNNNNNNOOOOOOONNMMNOPNONNNNOOOOMNOX_TRRORPQTTQRVY_b[RLJIJKLLOQQRQRRPPPPNPPPQRQOMMLKMNMLLLIIHHHGHHIIJKLNOPPOPPQQPNNONOKECJOSUSQONPKKOPNMKJJJKKHEEEDDDEDGIHGFEDDCCAAA@?>AAA@??@CDCDCBBBBDFGGGGGGGFFECCCAA@AABBAABCCCCAAEFFGFDFJQXc[NMMMLKKJKKJJIJLNPOMMNMMNJDVri_v}~|x{g^dddd`[YUNOX`cb]VPMKIIIJJJJKJJJHGHLNPTX[]b[LDDFDDDDDBBBBA@AAAAAABA>@BBBCDEFFFGLbCDDADU[ag|hLDH=68;<<>=>?CCDEEDAAAA@BDCDDDCDDDDEEEDBB@>;889899;=?:7788753444444468974345673GG?::;:87888866765545864CYVPB>=<<;;=@CEHFHJ=<<;;:;:98769;>?:8:<<<==<=@CEDBBBA?=:8:?A====?CHIJLJGA:8>DOB.Qeim_Y[^_RDBBBAAAAA??CCDDDDEE?>FPZ\PCHFDCCDCCA@@ACC@ACA@@ACA@@A@BCDA?=72355431.-0443333345458::989;<;9533221224677521//000/-/////03:=<;;:8=>???;515AGFGIHFFJOQVZSG<46:;<<=>>>?>@?<7445555655556668888309FIE@61258<@5,)))+*+-/02574/...//00/.--,++*+,0100/.-./00.,+,/200.-1640.--,094/010/,)')//+,4655545305687.*+--*.///./0/0/-**/34765422231*)0887/*.-&"%+268854?H?80+"$KGQX7,,,,,/=C9AF?@7+'$+/236867:=??>8321-++-42*+02/,)(()****-,./445667420-++,+++*-012110-*+1=>;:=9/+.&%9LTPA85754211110/-*9KD304310,(;x~5;:86459>@;9;960,/59;>@=74569;:42222AML9,28;:@@;;IG>3399;<726876?@AABB@@CEEDDDDEGHGFGGGFGGFFEDDCAAAABDDCCCCCCCCBDGEEdoEIJIIIHHHGGIOSUVVSQQRQMNOIH`sa_~}zjelkfed`XPOWaeda]YRLJKKLLLLKHFFGKS[^ahmssbKEFEEDDDDDA@A@@?@@??@AABA@>@CCCDEEGEP\AGEFA?@BGYqziVYfupVA=>>>==>ACDFGFACEGEFFEEEDDDDDDEEEDB?<=>:8666668;:888875534444468:764344446FD<:9::85777777755567:63BXTG:7>CGKMMLLLLLJJKJJKMLNNNNMOOOQUG43876579@DA@@CCEEEDCEDCCDCEEFEE>536;>==<;;=>@CEEHD;<;:978987765?CDDDDDCA?><:9=??==>@DGHHIKF>8;?=G93Zge_[\_XIBBBBBA@@AED>=@BDDBBA@@COXL>BC@AACDDB@>?AA?AA@@@AAA@@BBBDDDDB<8533220..2543332457889::988:;;<<:64344336861/0/.000/.///00149<<;;:98@E>8?JG?=;:9789958>CFFFGGFGMSWYWL>5699;===>?@>=??:4245566666676788997129<;;83368:9/+,)),,,-.01340-,,-/1220.,,,+*)+-120.,,**.10-,++,,)()((00)$%')+/012///.---+/2158545462.16AE9,+-.11**-/21,-22-))+062.11//1-'%).12/,-,,+*+-/.,*-66*$#$"4QMHB430,+./6GTWO<1*(,.=C725::610/028<8321001/*).40,'(+,,,*,8@B>701349:::6/*++,,+/1120,+*)+3;:ENH8,)%$:RXPB7;;9988/'())01/.(=W==;SeC1532138AC=><960.5:=?B@87525<<59?;:=HLC0)269>FKEBED>3;F?>@;68859HPQ[`ZQN[gZHJXWPPK>436@E@@>1)-46.34417FQYVNNOD6.,./..+*/237CEC@;9879:2(4N]_bgZ;&&/XXWVVX^ejlkmmkkmi`\ZXWWTTTUWVTTUTPMLMNOPPPPPPRSUVVWWXYXXZYYZ[[\^_`___``_^^\[ZYWVUSRRRSRPOOONNNNMMNOONLLLMMMMNONMNMLLMNNMMLLLMMLKJIIIJJKOUVVY[XV]d^OFGIIQW[_^]__WNPW[]___^\\\XQNQQQQQSTQPRRQRSMHIKIHKNPPNOQSQONLOWSAjhsrOJPOJRdnlc]WNJNPPY^XXalqjhjihZQastsvvuwxxu|qXWdospx~{vttportuxqmnhdhqzh\doqheaWYbhhgimxxsx}zf\\^`^^`[ROQV\[XWY^acfki^^owoqwvpfdfmv~|zypdemw{{|~r_YWVYYVTTUPWnedct{f[\XTRPOPOQSOAi“i|zitZcmnmtzsjhhffgfhgil\GGMOSUVXWVUTSQMKJJJKJILNNMKGFHHJKKMLJKMNMJIJKKKJJIIKJLE|DLLLKIIJKJGGF??IPNOTMQ_TLNMROb}hQX^[^fp}dQFDHIJIGGGIKKJJJJJJJMQMMLHD^eAGVb]WVUTQKJFGJNNNKHKOPYY\XSRQPOOONPOOOOONONNMMLLNMMMKKLKKMNPTalj^XXXXWVWVTSX_ZPIGIJJIJKMNPPPPPRQPPNNOMMMKLOMLLLJLLKLLKIHHHHIJHJKLNPRSRSWSPOONMLNPPOQRQMLNNMMONONONMLLLKJJJHGEEEEDDDDBB@@@@@?>?A>==>@BCDGIIIGFDDEFHHHHFFGGFFGFFEEDCCAAABDEDDCCDCCCBCGDFʒHCIGGGHHGIJLPW\_\XSQSRSONQQKHXlgf~zkiiggfbZQPTY[[ZZYTNLLNOOOONJFDFR]cgjouo[GEIHEDDDDB@@@@@>>?@??>?ABA@BDEDEEEEFCP[AFDDGEFGFBBI[ZPQj[@=?>==>?BDFJHCDHIIHGEEDCDDDDDEEEDA@>?A?;85786788888867752444569:752233329@<9:99:8767656655678::65FRC<:9::<@FKMMMNMMMMLLLMNOONNMNOOOTM80795578=<<;=>BFA=>999854447766?CDEGGFDCC?:79=?>===AFIIIIJF>488=A2<]fbbZNE@ABBAA@?@AGQJ?<?ACDDDCEE>?@@@AA@@BBBBBCDDBB>5120/..2531234678999::779::;=?=9888732683..0/.010.///0001368:;;:858@?9AGA;;99878:<===@AADHJGEIRWY[UD88:9;====>?><>?=84333566677778889::99778::645486/--*+--.../023/,,,-/2430.,,-+*)+.3310/-*,24/...,*('((()())(*,-./0210000-/0,/4678634221.*,QrU4,,0;8,)+/0/.3:;72..480+/1//0,&%'(-0.--./20/-+**,,,+++,)'?SKA=?9/+,,-3H\RA9,'(176<7369;74.(&$',/1231/-,*+142//0.-,+*+1@MQ8+,./06=?=80***,-1//20*(*)+0/5IWH6-%*ETRUL86=<::89@EIKC2'&%073-& 7`Xb~vU8,00./05AC>?=:9:88;=?D@653/4<91:C<;@HJ:).44:@EDBBAB?FIA=@A;88859<>EPQHCCO`XIIO]fe`E11127::2.-/40+6I66MUXZSSUJ=3-17::6/++16@FKIC=;999:3)/DZjqmlgJ/,XXWVVV[`eggijijkga]ZYYXVUTUUUTTUURONNMNPPPPRTSSTUUUVWYYZ[ZZ[[[\^_```ccbaaa^\[ZXWVUUSRSSRPPQONNNONOQPQRPPPNNNNMLLMMLLMNNMLLLLMMMMNNMMJGHMQSTUWWY^cd^RJIKNPSVZ_bb]RHFJNSTRQRTUTPKIHHHILMJIKOPQSRNMKIGFHLNPTXWVSQOPT]P;aW\VMLSZemi_YSLHJT[ZTV\_accdd]`kmkjlmnul\_ovxsljivzoruvvqopjbgqru}sia_aeb\\cefeikopmtkvsd_bc_^_YRPQV[YVUUX]ceda]^jpjmqtw`Nb{vry}}yw|}gWXb_[]bgd`^SlcebztVZ_^XRPPONNNPCZ[yPfvPO\chktytlhfbdffgfio`IDJKMQTVWUSSSQNLKIIKKJHIKMKHHKKJKKIJJJKOPNLLLKJKKKLLNLabDPMLJIIJJHFFC?JY\Z__SZ^OMKNGYxdY\TPJShu{zwxwurjaUGHFGIIHIJKIJJJJJJKMNOTIC|PAGQ][UTQLJJJHHIJNTPMNOK[XOOPPONOOPPPOOOOOONNMMLLJJKKJJJKKKLMQTdnj^Z[[[[[YVSW_WHHJGIKJKKMMNPPPPOPOMNMMMLKKJILKJLLLLLKKKKJHHHHJKJKLORSTUVVXTNLNNMLMOOOQRSOKKICDJLPPNNMMLLKJJIHGEEDDDDCBC@?@AA@@>?@??@BDFHHGKMLHEEFHIHFFFEEFFEEEDDEEEDCCCCCDEEDDEECCDBCGCJžMDMJHIIIIIKPV[[YZ[XTSTSSQOPQPMHSgihvz{}yxwigg`^YRLLNPOPQRPNLLLNOQRQOOKEHT^afjjfNA@?@EFDDDA>=>>>?>>>??>=>@AA@BDEEEEEDFDPZAFCCEBDFFFA?EGGL\qrN<>@=;<>>@CFHGFHHHGGEEDDDEECCCCA?>CA@?>:867:9877688877764466568965243324987999887777655555589898:LJ78;:87777?KNOPOPROONMMNNNMLLMONMQO9/4:7467:??>>??;6:BFGHEDDCEEEEEEA7239>==<:<>DE>5477633445537AIJC:78:<<<<;;;;<<;@CCFFFFCC?<8768<<==AGKKHEFE?9:<;?@/DbfaZGC@CC@@@???@FQRNHA@=?ABBCA@CEA?>>>?ADHJLQUQJJJGDDA?@A>?@AA@ABBCCDC;310/-/243114677778998779::;=>=:;;9531462-./..010///000002337897446;==@>99;<=>>@@>==>??@CFHHGGNTV[[L<::9:;=>>>>?@?>?=732245666777889::;>??<::=;620353/...../0/0220...-/24541.---+++,1444330,084.0/-+)*.1.+,,+-1454442000100-.540268740000//--BU@2/-1?E9,*--17==<==>>@<3/12122-****-..-04/(+1/+&,0.,+-..(0PXOD752+&%(+3HN;231--8>.0456893/-,,,*(&)/21.*(*5?>78<94/)*)*(-?L5$''&',2;@@;/*(,?E6/31,'((**$/MO<417KTFDTG3:><9758@FJNL<,&/::5/)#*GRl{W<42.,,+3=?<>=;@ID;7:>C@61-.360-6:757EL:*063141-7?<<>E?49A@9665550/28=4.2:CEI:2WmjhO52433413740.&)8F5:W`[SRSH:72/;EGEBDA3/435FMB8:=<95-%,CZ_``^ZK1.XXXWTUXZ\]\\^cecba^\ZZXYYVTSSTTTUTRQOOOPQQPQTTSSSSUUVXYZ[[[[[[\]^_`befdeeca_][\YTTUUSSRRRPQQOMLMMPRSTUSSQPONNLKLLMNNMMNLLLLLKKMPRQQQOKJLMNPRTVWZ\_a_TLLJHIJMWadbcYHCCHKIHHJKLLLMLMLLNNNMLPSRSVVTRQPKHFGJQVVWWW[ZY[[B\d_SROJDR_biiaTJIMQQQSW\`^^b``iljjihikuo_ipnxub___lwupotvwxtph_gstvz{xyvfc`^`bcb_abdhfa`z|ikwwoggfa^^XSPQV[ZWUUVW[^`bb^cjhfjsrRZ~~|y|~ww{i^prf]ZZXOOTWTSTJkkbc`tiMQSTSOPPNLJINDVžİvXhyaMztWSVX[`grwungb_bgeeillXIKMKKLNRUUTTTQONLKKLMLKJKLKJJJJKKIHHHNTUURMLLJJMOQPPdir>MSMKIIIIIFED>Qqsnk`U\fZLPLGSq_QbXWXRRWWcjijg`chkotzzzvk[LGHHLNKIIJJJJIIJLSWOAwCJHNZXSQLHFHHIHIJKOOOONJMOIJJGIMOOQQPOOOOOONMLMLLMKKLKKKLLLLLLK`miaaa_`]\YVUWSIHJJJLLLKLNNMOONNNNNLKJJKJJKKIJKKLLLMKLKKKKIHIIJKKLORTVVVVWXUPMLMMNMOPQRRPNKKJBCJKPPOMMMLLKKJIGFEEEDDCCA@>?@AA@@@>>@EILMLLKIGEEEEFHKKGDDDDDDDDCCBBCDDDDCCCCCDDDDEFEDDBCFD@eİ_>JLIJIIJGJPV]_][YXVSSTUTSRPJJMOIM__UVZ]`abckojkgYTROLKLKKLNQMIIJLNOQRQPSPGHT[`ff\OCA?>@DFDDB?>=??@>>>>>====?AAABDEDEEDDFDNZCFDCDGHGFFFCDEFHBGS\el]E:>=<;;<<=?CGJHGGEEEFFFDEECCBA?<=?>;997768:9888788777664466556743443234876898887776555455687458?NE68;:988769EMNOPRTSTQONMLLLKLMOOPQG315:85469:<>??@>758?EGEDCCDDDCDDE<348:==:9>BCA8244332467626DMI@9898:;<;;<:;;;;:>@@?BDDC??B:736:<==AGKMFBBB?<6C=7FC;Ide[QE?CBA@@A@@ACHLMPNI??@CEEDEDA?>>>><>>@@?@K^dbb_\ZRGBACBA@AAABBBBCB?:63001345457889987757899::;==<;=>:642353//./1111//00001111246631378:<<;:=>>>>>@@BEGNTSVWMB=;:::<=??=@B@??>92235676568779;:::9336423/,,+,-.381#&;@/&0100/013:D_k^O;-%*1.,.1D@3562./46,+-06;7,*++-482-/22222(*CPC56:73+'*)('(073+*++($(2=C@5,)-OY;-11-++-//(/J?02DYQ4-EN959=<9524;BHOOB23<835;1.),N|a=8642-+,,1:;:89:=C@848>A>5-/233/.11016FF1)143561-253122./9A<7650/440033324513@9);[leJ=;8=EA:=E>2..2<=5AUYPIC85:91,/48>JQF852)1DE:57::51&!0N]UNSN?/&%XXXWUTUUUUVVV[^]^``][[Z[ZWUTTTTTTSSRRRRQRRRRSTSSSSUUVXYZ[[[[\\]_`abehiihgfc`_^^\XUSTSRRRRRQRQMLLKLOQQQQPOOONMLKKLLMNNNNLJJKMMNOQRRSSTUROOPPQTVWZ\[\`_UOMKJHGIS\afi_SIEEEGHHJJIJMPQPOOPRRPRTUVVVWWUUTQMKIJNPRTY^`_Z\UAWmVYUXXMHKKMZbb^[TJGJLJMPRW]``beeffhlnmu~mUSX^ghcbc`dnqkouv{xpkiqxxwxxy|~m\_`acb^]]\\^`cgkfaan}jcffa^\XRPRV[[YXXWUV\ejd[]efbacprgdwxx~y{zkPJYbekbKMMMMHHGGENjaafm`UWTVUSRSPMIFFCRjmͽl^cdmxX]r\T\YYZ\blsvqga`dhcgniYKMRNLKJJPUTTTSQPPNMMMNOOONMKKLLLMKHKMOVXONOKKKJKMPRRcf_uUERNONIHKIGEF?A`sql[QPan]RNHOocEY]QS^_TLTXORX]closzaKFIMLIIJJIHGGHHMRYPTCLFNXUOKHFGHHIJJJIILUTLGFMLJIFFNPPQRQPQQPPPONNNNOPPNNNMKLMLLLMGYhhdddceb\YVTOIKLLLLMMMMMOOMNOMKLLLLJIIHHIKKMMLLMMMMLLLJJJHIJKKLLORSSTUVVVVTSROLMNONPRSRNKKMLHEJKOQPOMNMLKKJJGGFEEDDCBCB@?@@A@@A??@FLONMLLJGFFEEHJKJGEEEEEEEDDBABDDDCCCCCCCDDDCCEFEEBCED>xt@GIJIIHIIGORV[\\YXWUSSTUTRSW[_X\nj]URRWWOFHOORT[cc\YXVVURPQRSQMIILLMNOPOSRGJY^cd[MFFBAEGEDDBBAA?AAB@>>>>=<<;=AAABDDDDEFDEFQZCFDCDFFGFFDAEEEHFEC@>K[T@:<<;<<<<=?AGHIIGFFFGGDDDDCAA?>===;8887678:97778877766456655556544456677698777766644456668:;8;HH;48:9999998;DNPPQSUVTQPNMLKLMNOORO=3359866679::;<>>=;79?CEEDEDDBA@?DF>688;<8:BD?:43333447:86;JRI858;:89:;<<<<;;;;:=>><;:D9=I=>Gi\HICCAABBAAAACHJIHHCCDBFIHFFFC@???=<>><:89@IYhggjigcZTUQME@ABBCBAAAA?=:514556678889974457899::;<;;;<<;843444433567530000001101234679;:8;===>@BBAAAA???>>=<<<;:<@AGPRRRKGC=<;:;=?><==<=??:2035786468779:::9:>AB>:9:5-**-33--..///,-:C6*+-+,010.------./01220,+*)2;6241/.-+++,*'-2-'+6<631-,,+0445651-...,+,-/..2313771*2GF.),**),.-,*-7A?9<@:433110./,))025:6&*GO91834=:1+--,+.49:40:43HXG1&6J?.5998852149EPPE:<<33:?=5$$DtL?437887546<:878764335:<80176341/00//=F8)-03;>:531.,*)')-?@CGJLKLJIGFGFDJMKHGEEEEEEDDCBBCDDDDDDDDDDECBAACDCC@BEEDˉDBEHHHIIJMQSTSTUWVVVUTSSSROKV{~{kabc[LEIEBCFVih_]ZYZXVVWWUOKIHIJJJLPSTPS_dcXLGGIGECCEDCBBDECABBA@?>>=><<>???@@@@BDFDFGVZCFCCEFFEEEDDCDDIFDBC@;@SP?::<<<<<===AFGIGGFFGGFDDDBCCA???=;::77678987667777766455554566534798666699777778764456877APF@<77>EFFEFFDB98BHG><6766>FC:66877788<<;BOTC716::999;<<<<<;<;:<==;;<<>><;A>;::9:;?ILE@@@?>>>B;?H:<><8GfM>FIBCCBAAABDFF?=@>CBIONKGFFDCBBCFLMF@?>=?=?Rdebbfjhcba_SE@BBA@?@@@@?@;4555788777762135788899::;<<<;;:767668::<>>;6221110/0254246;>?=:>@A@>@AAAAA????>>=;;<:99::=HPSQIDD@==<;=><<=<;<>A?61146766777778::99<<:5-*)*./-..///./,2IO/3C:141+%%&'()((2>H?764210/--4<9.)-4;=7)0IODBC>@FIHHYb\fhZW_ft|lH+-,4I;683++*(()***/1,.50-45(#+32///*1JN954-,/0/*'%(00+*'+5:4)'(1;90---,++*****-2662//2IYE313;?736766643102;IPH?:7434=A:,*7\k\WOA>A?=;857:;9854112344/.352250+061-;C3*0.9LI8-,,,+*)*(*>IIK>7>FK@123/135620.-)&(11-?>=>??AEIJJJHGEFEDMOHDDDDDCCDDDBBCCDDDDDDDDDEECA?@ABA@?@BE>fǜFDIFGHHHIQWXWVTSSTTTTTTTSSQRNPm||iTLBBDBFZgb][YYYXXY[YNKHHGHHGHKPUZ]baWKGJJKIEA@DDBABDEDCDDA@?>>=?><>>>=<==>?@CEEEVYBDCCEEEDDDDDBBCCCDBB@78=SN<;><<===<<MTSSWWWVUTQNNOQRQWH0/54677556777766567;;879>DFFGHEC;7:CEA@;757AE>79;=<<====>HRRB226:99;;;;><<=<==<:<>=::;<==><==;;;;<>BJI>;?@?>>?><9D;6A:>1M]?ABCBBBBAABDEDA?>@>@JPLIHFFFDCDIU[YK==98;>>@O_e`\^bcbceaK9997789877:AHE956788787652236899:::9::;<==<:879769<<=??<7211210.26754467;>>=>A@??@BBB@???>>957:99876776>LSQGBDDA@?>=<<?A=2+*++**+....///.*3LSC9>EGFHHGD?;6.-./.,,,++**3=8/-,++++*(*9C=9<;7840/.-++--01.0321.+*+'%-70)*,,,/=J@3=O[M70)*)'(*++2DMC50.,,-,0:CJG7)'/=D5(4JRLJHGGFGI\R1;VQ?:Nk]:00*+B@?:2..-*()**+/316<91+.3.(''+/+(3CA31-%&(,,,+)*02/,*/<:2/,),273/....,+****++,,)')*6=212+,27830.4654331.I;B_gXU]^\[\\]Q721233331,),0-+03,-;<.(7D7(*4I[ZK<2-,,.01))=HKN?0-:Z\7,4751277.()*(*,+7Vnsstvy{}ydQRUUUSRTPB:;4*()((,465?90.?TZ[K/)3.6gYYWVVVUVVUUVVVVXYXYYZZZ[\[YXXWWWXZ^b_[ZYYYXVVXXZ\\\\ZYYXYXXYZ\]_aaba]VTWZ^``^]\\[[[XSQPPQRTTTUVSQPOMMMLMLKKKLKKMMMNNNOPQRRSTSSTUWWXYYXXZZ[[[[XWXYZ[\^_ZPMRTUUTQPOQ[cda`[PHIGEEEEFGFFGILNOPQTUUVWXXYZWUVWWWZZZZ\\\]]]`a`cfda_^^^][WVRHK]^R[lmdduryjY[fuyoinv|`LJ[lptqjdanurwo\]bcnurtywx}{sc`aeijejoi`_`alv{||{zyune`cfed_[XUUTUVVZ[brzysiddpv|~z{i``WO]nxiSPRNHLJIKPWSm~hdcZQRZcfb[XZ^beb`c^WW^x{dcbefa}fPQW[afi`XY[X^vxidbbmzbGINOSVQNORVURPONOQQQQONOMLJJJLMNPRTPKMRRJIVZLG[qfVSK_nSAGMV_\XQNONMLIE@CQU[YRSPRa\JFIehYZPVVIJSSVULSVNNJEBBABELYd^ZXXXVXXXZSIFHHFEEFHIGJebKMLLKMOLHFEFFGGGHHHGGDHdYLJKONJNPQOMJNdvmseMMNLIFDFGJLMLLKKIIIGHJJIJKLNPRSSRPMLLLMMMMMOOPQQQPMLQUV\WKKLLMMNPONNMLMMLLLLLKKKIIKMRQSXYWVVTTSRSTTSTVXYZWSRSRQQRTSQOKHDEGILNNLKLLJJIGEEDBCBA@@>>>>>?@?@??AEHHIIHGGFCGPLDBCBBDDDDDDCBCCDEEEDDDDDDCCAAAAAABA@BC?QFKIIIIGIT[YWWUUTSVUSSSTTSSTSTQNohNFDD=B]j^[ZZZZYZ[WOKIIHGFEFFIT`eaXMIMOMLJD?=@FCBBBCCEEECB@@@>??>>>======>>=<=;RT@DCCCDDCDDDDBCDEEDDEC:72BVI<>=====<;::>BDFHHHGEDDDCCCCBF@>;;:878887778886766665555545555467776655665678:<:899778989:><;:::8789;;<;9;<=?@@@=?KTNC867699:<<;;>=<==>=<9<>>@<:;<<=<<<;;;;=?BDA=>>>=>=====:>;7MO8D?AAABBABCCBA?>@@@??AEFDEDCCEOVWVRI??>?@A=9EYc^X\`a^a_H3//0/3320159DNF:7779888885358::::::99:;<==>=:9;769:<=?=:60.11/./378765448<=;<=<;>@@A@>==>?@8047743224425DSRFAEGEB@?=<=<>HPK?77:::744798777778;;99<=>?@;/+--,**+-.../11/125ENIHOVWUSSRNJ@53210..*)+/5?E;1-+**-152-7DGD<:82*((+,.01.,,,-0110./4-&*/,())*+-154/Aub8365-++,-048=;63/+*+,3@HQL82/(9H3&8P^TH?:8324Y_8'))//*6@>7553)'3BD<4/..+))++,-6><881.>F1+/;<4315410-**-21/.---,,*'))(($ +3-&"&?@.,15750,).454451*0AD52543236856>/400Hnznu}}{_6.1245653.---*+/-/?J;('8G?-0GVSKB8-''*1<;+*=B@@:;37]X40;@91/9;0(-23>>13?L[`altrqwudXXYYWVSQQL@0+*'$%(.5D]m_D5/*),,*0740),3ATU?-',-7eYXWWVVWVVVVVVVWWXXWXXWYZ[[YXWWWWVUUY]]]\[[ZXYZZ]___]YYXWWWWWX[\]]]^\ZXXXXZ[\\[ZZ[ZYXUQPPPRSSTVUSRRONMNMMLKKLLLLNOOPPPQQRRSTUTUWWXYZ[\[Z[[\]__^]\\\Z\__]WNHHMMLLJIMTXZ\[PGFFHGFEEDDDEDFJMMNOPQRTXYY\][XVWVVX[]]^^^`_^```ccfgfea``_ZUSQVgl`[ea\s{~zoknzxttw}jcntvzthddgouuf^myy|}rq|~~~}vf]`q|x`Z^`]fv~}xsrpkdbbeffecd`[Z[ds}~qho}t~{tcfj`]VS^_[^`NMWNKKHIMTVUJW~mldTPTUYZXTSUZad`YUTTQWxdba_d`^WFMVZ_^]YVXZXWkoeacpmRIMQTTSPNMOPNLJJKNOOPLGKMKIJLLMNMNTUNLPNP\TLIC^p\T_nTCOOPPOOPPOONLKID?MZ[bWMRQU]WNK[cNTZY[SNRSMJTVTSLJJGEDDCBCFLMPdkjjjmvt`LLIGEFGJDNfUENLKJLMLJHGHKJHFGIIHJHHKMJGIMMJKLKKLa˭[FOMLJIIKKLLLKJJJIGFMX[ZYYXUSRPOONMMLLNNMMNNNPRQQQOLOPPYZQNNNNMNOPOMMMNMMMLLLKKJHIJMQOQY[YUTTTSQPRSSRTTTX]_]XTQPRTRRPMJHGEEFFFHILMLLKIFEDCCA?@@>>>=>?@AABBCFHHIJHHHFDLQHCBBACDDDDDEDCBCEEEEEDDDDDCBABCCCDEEAFAi`@GIHJKJIVd]TTVUTSSUVTSUTTUUTQRTOMyo\OKF:GlcYZ[\[[[YSNKJIHGFDDCFSaf\PMMMNOMMH=9<=<=<<:;6QO>DBBACCCCCCCCCDEECEEGC:30ESA9>=;;;=<;88>BFHHGECBCCCCDDDED@@<878777777779877766555466555656876655455679:;<:899:99:<=99<;999868999:;;:;<=>?CNUWYZWSPPQTVX]C05667764435665555665358989>BFGFEB;439?CB=;AA:7<@??@AA@?OSG?=988779;<<;===<<===;:<=>E>669;=<;;;<;;<>><=><=?>=?A@@>>>>><;;;9HE@KBBBBBAAAABB@@@?<:9<@ABCDCDMTTUVYWCBCCC@<45@?<<;7799;?@=:71/0.-.0268864348;:9:9879<<==;;;=?@=;94430012221:NUI>AEEEC?<>@>=FQL90028;9667876777778899<<;<93.-/0-*-0....12238<20DMC?IOOOPPNLKG?5111/17?EHKH;2.+)*,7CG:/>D<512+''(*,020...---/22114.**+,,,*)***.1.95/-+)*++)(2=96943NQC@;;DHNXL8,+*))/1-.2,)%(CF30+'-002/+***+,+,..-+(')'$#4RO4181<\b^XC64/,)+-//04327VQ5--2333323771.06.CvxsxjT502455665420.,-/.9PN6(+6==?OaS:.++))+-2;9,0?>;49GB9[cWVG965.2@41:84@H7.+-=FL^b\i~|nijkkkYFFNM@420,/1//1=da1)/+)*)'(*,++*+2ED2+-.-)JwxYXWXWWWVVVVVVVWWXWVWWWXY[[ZXVWVUUTTTX]]\]\[ZZ[[]^]\ZYXWVVVVWWYZZZZ[[Z[ZYYXYYYYYYZYXWWSPPPPRRTUTSSRPNNNNMLLLLKLMNOPPPPQQRSSTUUWYYYZ[[\\[\[\_aaba`^][\``_^THGIJJJHFFIJNZeh^OHEDFFEDBCDCEIKKLNNNORWYZYWVTSSSRRV]^]][[_abbaaabca]WUUSRQQXele_[STo~vqxyplv|xusw~yx|vmomacok`o{uoeht{{{}}zzyrb^_u}qb]a`]hw}wqjgffefffghhigifdio~{xzzx{yoninw^RSXYYWSRWc^S[\ntPFJPW_^TQNY{|nlcXQUYTLPVWST]eaYUTUTT}pcecaebWhSGIRY^[VSTUUXTTqqcafl\OONQTSPOMLMLNMJHILMONHIMKGGKOONNLPWUMMQLWhUHJMbi^a`nqUHNQQRSQLJOPLIGGGE@RaXWPNRPX^PO^fQEMOYYQRTSIBHQVSJGIIGEDDEGFGGHHXiuxuwz{|{oWOIEDFHGJNKLMMKIJKLJIIJOU[_YQLIHHKEFHHJKKJKHPR_y`MJMMNNLMMLLLJHHJJILVbjov}{iVOMMMLMMLLNNONNNNQRRQOMLMMLNPQOOMNLKLNONNNPOOONMLKKJHIKMPNPW\ZUSTTTRPQRRSRSTSW]_]YTRRQPRRPNLJFDCA@DGNNMMKJFFDCA??>>?>>=>@BCDDCDDFHJJHFHGGQNDDDBCCEEEFFFEEDDEEEEEEDDDCDCAACDEEFFCGCxAFFDFHJHPabWRUVUSRRTWUUVUTVURQPSWNSxljpq[@Uj[X]\^`]SNLJJIHGGFDCJZbZPMNMKKLMNMB7:=BCDB@@AACB><=>?@@@@@@?><=<<==>>=[L?FBAABCCCBBBCDDEDCEEFEB>41HH6<=;;==<;979@FHHGEDDCCCCDDCBC>@<88:888888878877765566466678:9:8766566668::;988779:;==<<;;:999987889::;;<<>@?>=<@:557:;;;<=<<:9<<:<=<====@CBA???>>=;<=<7DDDFFCACA@ABCCBBB@=;99=?AADGNSTTVXYWMB>?<:8876;K\^\]beYA9>=85323344567@IG<:;99:99648;;:::::999;;=?@??>;99::;==<<:752-,/02577655579889877778998999;;:<932322246764>PN=;BCGJA9BLF50.+17:;85676667777777:97740013578842/..0./77.*+/5521.+,,-00/,()*-2531H[?5752000.,+*),.10..-,+%#8VO2++,03231B[I-)(()('$4UN@4%@ffgzrgY942,7A?<;831-+*)($%,14::@VWQQH=AIIMI?880'+75*'#(A<*==('('+-+.364.)'(+,.11-*))&/HXQ?;AG7,Zn@56.('&()),245]}O>>6/35851111//2:58ktzd6045655431.-.,,./9LK4(,/-3GgjG.(,2431///0+6?98,)928@6//-9KXcfmttst|m?6>;89;::?D>87;SiQ.*.+)*)(&'+,+)'*..('(,-$.KJZZYYXXXXXWVVVVVWWWWWWWXZZZZWVWVUUTUWXZZ]]\ZZZ[ZZ[YWWWXVVVVVVWXXXZZZZ[[[ZZZYXYYYYYXWWWUSRQRTTSSSSSRPNNNMNOMLLKLLNNOOOPQQRRSSTUWYYZZZ\\\\\\]_aaabbbaaccbaa]TPKGFGHGECCEJViun_OFDDEDCCCBDGIJJKMNNPSWWTQNMMMNMLNV_c`[TSZ]\WTVVUSPOPQVXVUXfwuli^e}tnrsqxxhblty~~ztsx}}{}yxzpmpk_^fdkz}tkotvy|}{vvuk^achͱ|h`_^`ktqmkhffiijiiiiikjjfhjmmfowyvbUQO[\ROU[XOSaotrk]Y[XSRTV[]ZW[XYZ\flsjc_Vamne[]Z[sxrg\XW[_RINXXQNS^b\XXWWWtfdgffkf_ZsLLKPSW[TOPRTWTHTpocdi^MNQNQRQPOOOQSTPNNNMMPNLMKHHHHIIJKMSVRNNONQQFM_[Sevs~rJJeeYTQSPMNPNJHFEFFBN_RJOPON\VG]iVJLMKWXRSQNIA???>>>@BDFFEDDDFGHHHFGFJQIBEECCEEEEFFFFFEEEEEEEDEDDBCCAACDEEFDCDDVDGGEHHIIKSRPRVVVUTSSUWXWVVTTUSQRTSSR[pxqukxe@\iZ\Z\c^KHJHIHGIIHDJWa\KHLMMMMMMMMG<<>@EEDB?ABCB>:;=?@BBBA@>=<<;<==>?@bH?EBABCBCBCDCBDDDCCEEEEDD>6;D>:>====;:998>CKHFDDDCDDCCCCCB?=:66:;9888888887777778865689:9;:7767789:<;;:;8667677:?>96:<;;;989979:<<===???>=<<977644545555566677878;AFGE?:::=ABBAABA?CCA@@ACHNC?@=8789988;;<<==<<<<9=?@>>95455679:;>?@@=7:;;<;<=?@A@???>>==>=?==@?CIHDCA@ABCAABBA><99<=>@FOVUSVXWXWRNJ<03457:8;GW]^afdQB@>674455666667?E>988:::8558:::::999989;=????=<:;;<>>=<<:::72.-.02446665776678778865455444443455444468::77BM@8>@DKF<9=>=>FC4/0--19=73565446878867886542236=BD>41.//.--39:;96;DEDHNTUPJ?>C@>=;;FLOSTNA>>7.+))((.;;50/1//0340,)*,1@OM:.**,1475/+2522321..25443/*.+++,/0000.,++,.//)%')))&,BF0)-..-./*:P?+,+*))),682--"$MkyaVaHHD,1;;9:;9840*((''-521>JQQ^T5)9OLNL;192(/6,%',:J>-3.'(+,-*&%*38741-*+,02/.,*'?XE+2FFE3,>qZ065*,1&&((+/3;uw9>@;975675301332683Q}]2265765431+(*)(*-1>J;+,6-%Cm[4,,01120/--,,<>14/"(0(JjntkL345,-/8DA85400/,1DYao|ph{F152002448;;997:@9,)**))(''(()))+2698*&--++//^]\ZZZZZZYWWVVVVWWWXXXYYZZZXWWWVVVVXYXXZZZYZZZYYYWUUUVVVUUVUWXXXYZZ[[\]\\\[ZZZYZZYWVVVVUSTWWUSTSSRPOPONPROLLLLLMNNOOPRRSSRTTUXYXYZ[]^^^^^^_aabcddefggggffeb\URPMJHFDBABRkwti\OGFGGGECBDHIHJKMOOPRRQNLLKLMMMLNZdd_TJKPPMKMONONOQQYb_ZTVk{{vr}|wxxvxn^X]dmv{~|xxz|zrmz~y{~pinkca`bhuyo}yqru{ve]ccdzykb[\bmnkjkmmkmolhdgijknkghj}vbNEVb\^fxtmqonlkrvh]ZVUUUWZ[\\^dpieosxvfckigegb]fqufYX]e_MFHT_]NLSZ\\YY^brzdeigilkaLedLPNPRTWSNNQSTRX[blfheUQSRRPPOOOPPRTQMR[VONOOPMKNOLKKKMORSTQOMMOKHJQWST_m}KPjmhd[QQNNSPKJKIFFECJWUPQQLU[JSdTLNMHNXQPQNIF@=bF?BABEDCBBCDCEEFEECDEEDDCA;4=B<>===><<;:9;=EIEBCDCDDCCDDDEEBLNH<::87777887777788888747997546689:;<=@>=<;99899759><758<;::99999:<=>@@@@><<;;;>H[eec\TTUWZ\D<>CGFDB>>=:876654434666666777:CDDC<;;=:>>:=>:6675689::>DHKE<9;;;?>:;==>>??>>>>=>>>?@@A@@@FJID@@AAB@@AA@?<::::;@JQPORWZXUTSRQG87679:<<;>Q``cgcO>==867868;85679=;7889:9766889889999999:;=>>>=<<;=?@@>=;::<<83//.-/3766557769::;8444222332212356654468:;<;=GD9:<>DHC<989=CA3.21/.387555453587778988876335:AC@91-,../00//0210036;@BMXYN67FCBB@>@DLT\R96?=5210.,.9>;7326;?<8420/))6LM5()())0:<516;7775457:8/01/-,,,.26422220/.-,/82&&+++*)-021111.**(7C<8940///01+('))%6d{f[eU;0/).9>>;987:91036774.-;KJ?NH$*HNNN@.+1-(+/*&(.:6()*)*.0-++)%')+-493+)(().20,+-+$$2<@D2'-PoD0745K^C*)0333?^P29:;;AB<866679733831jj809<;98879<6)&(()-/4HJ604+#H\<)/81)+/011.,.@=073..+ /VkoXC?951+)8G>101441-/B\ouuwy{G-230,-/34+),/0)%((((**('&&''(*)'2NagileTJIIIGEDDFHHJKLMOPOPPOONLLNOONLQ\`^ZMEHIIIIMPSSQQMNVYYTOXhqokp{zwsbRPUZ`enz{|zpip~ufjqhab^`kpip|pr|rd_aevpcaZYanplnmlnnorlgchjknlfivtrrgVJZ\\|}ŻhW\WWXWVUUWY_ejptw}yo}jgdcefgecelrj_Y`fXJM^mxtXLQSWYV\gjewdfhghifWLPZUPSSTTSSQNNPQSUjyklj`V[[UQSSONOPPPPMR\ZRNNOPONQVVTRQQRSSQTVPLMNKHJLLORPl}VRjf__\[YURONLIIJIFDCBGOQQRQPXVWcSHMOLHUWMNLJGC?BNTPNHCFGEEFIKIIIJJHGJLJGO`a]YWVRNKIHGHJJJJIIIJIIIHHGGFEFHILKKLLLLLKJIIIJJGMXjFKMQKEINPOMLKKIJLMKHIOYekom`UOQTVURNLJILQRSZ_aa]VQPQPOMNNMPOIKPNMNLMNNQSRRRSRPMOMKIIJLMNLKKMPW\WRTSQPQQQQQPQRRRTVZ\fi^RSTTTRRPPNKHECCM``PJHGFDC@>??@?@ABDEGIJJIHFEECCHKGLRKEFFECBDEEFFFFFEEDEEFEEEEEEEEDCDDDCCCEEFFFIJGGFGJPQRSX_ccbb_YTTTSSSRRQQQSVUOUftpd\YTSTPVaj|zlnUJ_ZWYZSKJIGHHHIJGK[^OGJKIKNNMLLKJIIJHDFHHHGHHHGHIIJKJGC@<<=9::;87468:\@<=>?A@@??????BEEEDDEDDCC@?65?A????><==<;;8=IFABDEDDCCDEADFH_rnL6:8888878777888788875345544569:<<=>>?>>==<<;869=;867799:998:;;<>>?@@@@=;998::<==>===;:98888987788=BFD?<;==@FDA@BBBCCCCDB@@CA=;;:99789:<<<<<<=>>==<8;=88:9:;;;<<>EIJA87:99<<9;<=>>>?>>>>>>>??@@@@@@>CLH@AAA@@@@BB@>=;979>FHJOUY[YSOPPOK@767::=>83AZ_abdY@:<86984>====<>?@?>=<;;<;:964/,0564556899:;<<6223432222222244333368:<<<=BD<8::>EF?866;A>2.1200037754443477658997874468>@@?7.,-../0/.,-...-,-.035@QG.:I>@??@@AJRZP4)0642232138DKC947CHFCAAB>856AE6)))'&(5?;535532100363-/0012005;;74443221.*-670/00../,+.01372()0:?>=:5/*3EPC&&)('#)Rt{nzR+&')*2CKG@:57:88UQTI5130,(,/-++)*($(()+-//*))''()(,1/,*()+02/.+" %))(09+%8==8898@Xvh6/9;9679547:99>OG01765542332/4o}0*=>??<;:7;D@.&*,-031@PD4,'3M;"0A@2+-.021../B;0;743.%$.7X\RK:461*7A1(/034314H\h_~}wB%+10/.1;<14>?3$#*,,,-+((((,131-'.CKDB?:46T[;cb`^]]]^^\YVWXXXYZYYZZZ[[Z[[ZXXXWVWYYYXWWWVVUVWXYYZ[ZYXXXXXXYXXYZZ[\]``__^]]\\]\[[[ZXWUTUUUUWXWWXXUSSQPPPPOONMMMMMNOOOOQRRRSUWX[]^_^^^]ZYZ[^`bdefghjkklnnjfda^[UOMNMKIF@BLOR[b[NIJJIFEEDGJLLKJLOQQPQPPNLMOOONLOU[c\GDMMHGILNV__^XQQSSRV`fgb`n}wsscPOUUWY_lxuutrn}oipqd_a_bihk{ty|ub^fttSUXW^ntpnlkptspkiijkmqkn~vwmYTTSn|y}tpgs}}~~|z\RTWWWZZWUUX\cjqtxzunssolllllhfgig^\]XMPgwvytZOSTSSVaigaiocegghg`SNPJOQPSUVURMLMQN[qupmqkZQVPKQRPOOPOMPV^\NGMSTRPOPTWURQPPOONQSOKMNKJJMPPO[sc\ifkfiqlec`_XOIIIHECCCGJLNQPPTU]XKONNHHYTLNLHCBAEONIKHBCFFFHKMHHGGFGFHJGCGT\][WTRNLIFGHIJIHHGGGHHGGGGGFGHHHIIJLLLLLKJKKKKKKIVvRAIIKNLMMMMLLJJKJLMLJTcovo_YXUUVVUTPHGJLS]bipqppk`SPQQOKLMLPQNRQMKKOMOPRUTRRRQLRZUKJKLNMNMLMNQV[WSTTRRQPQQQRRRRRSTWY]ef\RQTUSSRQNLIFFIZdSHIGEFDA??>>??@AFGFGGHIJIHEDDEIGIPPKIHGDCBDEEEDFFFEDEFFFFDDDEDFGECDDEDCCCDEEFFGGFGJMQSTVXZ^][Z[XUTTTRQPQQQRRQR_jpi`UKJHHPRNK?DRce`p~XU]WYOHHGFDDEGFDK[YLGHIIIJLLJIGHHIJIFFIJKKJIHHIIIIHHGC?==?A<<=?<;;<>?W557998:=<:8789;?ACDDECBBB@?=77AB??@><=>?@?;:GF>=BEDDCCCBBCFN^gcI7888887777778877777753345456789989::;9::;;?:37==84677788999;<<=>>>>>?><;;:9;;:>Siqj`XUSVOCBBBBA@?>=<=>?AACFDC@<::;::98887=BDB>:;;?ECAAAABCBB@@??@BB@??><:99:;<<=<;;<:99899::8888:<>?<>?>==>>>=?>???@@A<>INJHCAB@?@BBBBB?;679<>DQY\[[XNNUVLC8779;;8587DTbcb^F9:68978?<8:;989::899::8667777888999:;;<<=>>===>??>=;<<;<<:::982035545579;;;;:84344454432220244344459<<<;;>@<89;;?D@888:>=4.1222245445531366424897885694...//....--.-,-,-.(''(8>7=?<98=A>=FQVF1-..,,378;?<=967877>=3-.1/03.1DA:61<>'$:4551,'#LoqW>;:5/41(*.03424>KRF>htl?))-/-),5;>AC;*#*2432/*(+*(/993/-0>]U;7;50=;&fda`^]^`a_\YYYYZZZYYZZZZZ[[[ZYYXXXY[ZYYWVVVWVVVXYYZ[ZZZYYZ\\\ZXYZZ\]_``ab`^^]]^^]\[[ZXWWVWWWXYYYZZXUSRPPPOOONMNNOOOOOPPQRRRRTVX\_```_]ZXWWY[^`acdefghgfdb]WVSQRSRQPPNLJHGIJJLOPMJJKIGFFEFJNNJIIKOPOQQQPLLNOOPOLLUgmWFLTNFEGFO[bge_\XSSVY[aeit}~|~}rus_SWXWWYcpvyquxwtquoa^adefiwywx~~p_alztbTWdquuqmrwwspnmljjpsqsvca`Sp|xss{yzzzeUVTQVXV[\URSTVYcjltnsx|zvpiec^\b`\[`b^`a]WRRVWWY`ggeXx{defhfgcYQORTSNNRVWVPIILQM]~pptscJMXVQLLOQPNS^d\PGIU[WSPOMLLJJJKKKKLMNLJKKJKKOOHUn_S`UVdimrkihffcVHHIFEDEEFGHJMLT\[UORQNMFKZROPOKEBCHNLHJHB@EGGILMHGFGEFFGIIJJJQWXWTROKHFHIHIHHGHHFGHHHHHHGEGHHHJJJKLLKKKKKLLMNF^fUKEGKQNLMLKKLLLLLLMPZkxvk^NJW[WSUXTNJMV]ceejmjd\UUROPQTUVTRTY_hfVK[]SOPRRRRRQR\feTKLMNNMNNMOQRUWUSTTTRQRRQQRRQQRSRSUVYaf_TSVVSRQPMKIIKTNDFHFECC@>?@@@ABDHHFFGHJLLJGFDGIGPQJIIHFDCBDEFFEEFEEEEFFFFEEEEEFFFEDDEDDCBCDDDEGGBEPTTUUVVVUVVVVUSRRSRRRQRSRNNc}smaUJDDCEN[WTGHMctqisxtxt[`Z\C>CBABBCEDDS]KBHHIIIHIIHHHHKORTSQOMLKKIIIIGFGGDBA@>DIG?:?DFDDBBCO5468989>B>:8779>>>>?B@@?@C=:>BDDCCCCEC??JD>888888888767789877677655568<<;:987778778633872786556778889:;;<<==>>>>==<<;;;;<<7>>>=====>??ACCA?=<<;::98878:@A@?<;9:::879:;=????=<<>>>==>?>=@?@>@AIPQLGDA@@AAACCA>><867=LY\\a^RJX`\PE;7;<:89<:7DVbf`F679::>>>>=><::::::::98754345665798997645765455443221244444469;;;;:;::::;::@?78<<<<6/03313543367400442004789:67:;=?=92//01211000232220.67044-0>A:;;::;=8@PP;38764.:D;:@=,;PG@CFH:*,.4;AFJC>BC@?CB=ADE?:751.16876789:::89>CDEDBA=9730.++-/8BA962--.**-065*(4EMH8*)-/+KD(0***'% !R^1/12-+04@GDA?==BMJ:2574;I:+,(*2?SD(%)-14589641,(+-)%(**)&%(-101/+''('%#);E>71-*((((*))4=7343/.//),=:068::::965449Fdi\I5110/1134763^99B><50./014797320.-0.-9;;8;=*"4A@:2-)+.---10E8.=90293(*(KvyZDB>71.,+..01444>JL;*dnBAF<89=<3+*0569:/$&*2?@6/)(+((264/12,3apH376.'%%hfbb`_`bbb`\ZZZZ[[ZY[\\[[[[[[ZZYYZ\\\\ZWVVWWWVWWXXXYZ[ZZZ]``^\XYZZ\^_`acdca``_^^\\\[[YXXWXYXYZ[[[[[ZVTQOPOONNPQPPQQOOPPPQPQRTX[]_^]]\YWWVWXXY]^_``aba^[XVUTSSPPPTWSQPPNMMMMNMKJLLLKIHFFFFGJNMJHGHLOQQQQOONNPPSSNLXikXFHTSHEGFHNPS[a_ZVRPS]jv|ysry}qpwhTW[YZ\bjqusuv~zotqhdgigfk|xx}zy|whe}zac_npqtqswskkmpomkkptz||sonq{z{ru|u}wq\TVSWZTSQSMGLPRU\hr{xj~Ǥwrzpvv|{tpmnq{}ldfiWMVXYVSRUZZW[ehd[wsbdfhfbZSQQSTSPORTURKHJLNMUm~pftdYqgVm~~kYSSTRZkfQIOZ_ZSRONMJHGGHHIKKLLJGFGIJJLPLVodKPROHM^dhkh`XRPMIHFFGGFFFFFHKKX_WUXUQONJSVKMQOKHEDGJIHHFB@CFIKNMIIHGEFFGIIKKKKNTTTSQMIFIKIGHJHHGGGHHHHGHGFGHHGIIJJKLLJJJKMJKMETqwfOILLMLLLKLLPPPPNR\lvuhSPSPQPKP[_]_gknpngb_ZVTOLNNONS[`d[VUUge`Z`pbSQQQONNMQ^phVNLLNOLJMNNOQTUSSTTTRRQRRRQSSQPQQPPQSUZ^`\TRTUSQPPNLIIHGIHHEBAAA@ADDEDFHHFEFGHJKMKHGEFILOLGFGFEDBBCEFFFEEFEEEFFFFFEFFEFFFFFEDDCCCDEDEGGGBIUVVUVWVVVVWXVTRQSSSRRSTTQUg|zmh\PGDCCENZXYOPN\vuxss`GWU]`eODHGB@BCCCFPMKKIJIHHGHGGFIQW_ca\ULJHIIHHIIFEFGEB@@BKOJB>@DEBBCCKX:348;79>FD@<989:@DDCBBBBCBA>B@789;????=?<:<@CCBBCCC?85445789988887887689888899889::>A??=><:8887894/-48556448999:::;;;;<<====>===<<;;:::<95>>======>?>@AA?>=<=<<;:9998:>??><;878?HGEBAAA>@FIOTPE:<==EF<>>=;==:9:<<>@A>>=<<==<;<<==>>?>??=@IRUND@@A@BCCCABID<:8:FRX^`^[KQ]b[TH;:?><>>?:>><=>=;:99::::976433466657766665578886555333222343332568:99::9::::99>?66?>9;842223333336740/120/-.479967:8:=831001355545679;:;92=;98;>=;:98667853=NPNPNLG@:2/,++.,-9@7-*(,30.-+14/+:[_E'+:8339P910++--+-)1Oln;1;HF=5,1IC851.*)+-/24:<==<641,&$7LJ6*)))')-+**01*,Sg@-86/)*+hfddbaabcdda]YYZZ[Z[\\\\[[\\[ZZ[[\^^_`]ZXWWWXXWXXXXZ[[[Z\aba`][ZZ[]]^bddedbba`_^]\\[[YYYXXYYZ[\]^^_^\XRNMMMNPRRSSRQPPONOPPPQTXYXXWUUTRSTTUUVWZ[[\]]][VSTTTVXZXTQQRSRRQPPNLNONNNMNNLJHGGFFEDINLJIHJMNOPQQSROPPRUSLHPekQ>L[RGHLJGGIMRY_\URVds{vkiosqlgjriYSVZ_]]eqllrrzquzkyzrkjkihmu|}||wouzyvw}yggwyxsZ\{ornmorrng`dilnolkpuqgimmjdaurm{wtwz|`NWZ[WPLSRVcwvZWaesyi^ņ]_mnlouytolnq|w__debTQX[XRUVUTOSaec\vlbbfkcYTPRVVTRRQQQQNGIKMMMQ]lcQX`OMyhd|q^VQYdYKR`cYPOOOMMLMMMLMNONNLHFEEIKLKGXneONRMNJFNZghZMHIIJJHGFGGGFEDFGHQWV[_YUUXWW[TIJFFHHHGFEDDEECEHKNQQPLLJFEFGGHIJKLLMQSUTROKHKMNNMLIHFHHGFFGGGGGHHHGHIJIKLMJIIKMJJMNSln_QKKKKLNNPPOVZXYXbjrl_TQRTTQKGR\cp|~}o[SRPNOOPONMNNONMKLPOZYSXsgRPPNPNJJM\shSNMKKMPNJLNPPRSTSTTTTTSSRRRQSSRQPPPPQRSWXXYYWRSSQRPNMJIHIJHGDA@ACBDHHGFHIHGEEFGGIKJHFFFGKJIHFFFEBAAADEEFFFFFEEFFFFFEFFEFFFFFFFEDDDDEEFGHGERXUVVVWVVWWWWVTRQSSSSSSXRVlynoc[MFFCCCK[YYTPXS`jtqzd::GY^iVSPLFCCDDCHLLNNKKJJJIHHKNRX\YSLEDCCCEDDDDFDCFIGA??CMNHMTQMGEDEDM[9547:8=@IIE@;;;;=ADB@@@EDDC?@D<779<@@?=<>??@===;;=ACCABB@<9:88777888887788778879::;;;;;<;;<:::;:98877851/267568779;;::;<<<<<======>===<<;;:9766808XkdX\U?A@@@???>?>>>>>>>???>==========<:::;?@?=<@BBB@@BBBA@@ABBBAAAAAACCBBBC@>:746GVRRRQRSQQRSTUWO@<=9AA<=>=<=><<==;<>A?><><:;:9;<<==<=?@@A?@JTPD@AA?ADCCCBFC@>;;AIQUV^bWNNV^_XF8>===<==<<;:::::9764334444556667787899986655433223444322457988::::::::8;>75??98;;7323323345531000/...038969;:9:52210/13344466788:996WkWMFEE6174/2>GNEHH2-24:94/,+)*044:FONKLE611108HN>0)/.2541/.133322420112563001/,:NQLOPMG;2,+)(''&#+72(')/62//-/133Imt]3+B:45:8>:0,+..)')'19Q=:O^O;>=-3JKA?JUL8)-/25872-*(*/;5,.2415>>4-,376.*('*)'%)/ATK<811/-*+*-=F?65553113550043DbL(*0-/322///02227;<<9630/243462/./1247956;4-...4:830/,*(.330.012;:,'*'*.452356/7F1/<6-/1042'=e`MD=740.,++,-.0111555.;h{[15:AN]gW?EUWUJ95;6''@PE1'***,+)'),/1+%?X4)411100ddfecaabddfe_XXZ[\\]\]]\\\\\\ZZ[\]__`a^[YYYXXYYYXXYY[\\]_bda__]Z[[^^_deeeecbba_aa_\ZZZYYYYZZ[\]_``bcb`[TPNNOQRRTTSQQPONOOOPOOQQPOOOOONOQRSTUVVWXZYXXXURRRSUW[^\TOQSTTTSRPMLNNOPOOPOLJJGGFEDDINMLKKKKMPQQQSRRSSRTTJDTkkSCOYNGLNKKNNMP\bZRYo|xi_cgfcelpwvkaYZ_[[bp}sgpzqg|yuuoljijmq{{rrwyy~q`gouwux~z`Ut}uvaX[~vtmklqia``aehkmlmqtplklkingxtrbcqyu}~hPSVVRPPV^g˫vYR]to]W]^ĝhcgknlkuxnjfbiosr_[da^ecXWZXQSVSQNNV`c[od_fjcVPQQTXWTRSRQPNKHIJKNRQZdQENNGXiqw^SgxWQ]WNXhdTNNPPMLNPPPQRRRRQMIFIJIKMNKUi_LMPOOMMJIS\WIGJLKKIHIFDFFDBADBASWT[YUTW[`di^RMEABBELIBACCDFIOQRRSRNOMHFFHGHIIKKLLNQTTSQMJKNPQQMLHFHJIGFGGGGGHGGFHIIIJLMJHIKNHGLSTWSLIIIKKJJKJNTY_`bddb`[UTY\VOKHIScmw~}u[JLNMNNPROMLLKKKMMMLLJGRkmYRPOPMPGManhWNOLKKMNOMMMNPQRSSTTUUUTRRRRQSSRRQOPPPQRTUUVZ`^QOQSROMJIIHJHECABCFFGHHHHHIHGEDFFFGIHGGFGGGHGGFGHFABCCDEFFFFFFFFFFFFFFFFFFGGGGFGFFEDEFFGHHGGNTTVVVVUUVVVUSRRSTUTTTUWPVwwnmXXKFFED@IZWTSMVNOimnlRSV]gTb\WUPNKIGDCKNJJJKKKKJLPSX[[YTIEBABAAAABBA@BA@DILHA@BEDJ\b^XRKHHELP775123:@GGE@@?>;;=BA??>BBDFA<>=;99;>@?===>????=;:;=@BCBB>;98:9877788887777776779<<<<;::;:::8889878:8773/076/069::9;;;:;==<<<<======<<<;::987635986Gaf``V:@@@@A???@??>>??>>??>===>=>>>>>>=;98?BB@@ABCACCBBCCBBAABCCDEDBCCBA=;4;OVTVWYZ[XUUVVVWSI>78<<<=>=<<<<====>=@ED<===<::<=<<=??@@ABA@ENOEABA>AECCCCCA?>=;<@JOOYbcOCKX[^S=9==>@?AB?;7779::;:98899:<<=;:888767887887778887:<;;==;;<;;::988865542444345566788889999866666433234444323565678;;:::::8:=54=>97<>9543222344431///..01/-3898:<;8311///.---./035789:;4?cdU\]XQ@245.6MS@91.*/51+*/>;23J\Q2-CG,2OP6/BYE1-,(&*351,+++.1/-*+,).51,*).47887542.(+9MUPQPC73-***&1B8"'333237;7.(,29UR)$,+,,,./.,,-,.159<7111//04682../014:AE?3?jR=@=835:513531443/,+),231/.///87)),)*06637:70AC/1:2,.0152*7GBB>231/.-*+-../0244/295=`mAOjF(33Fhn_C2=JF:5?E:1+(),1/&'*-.0.$2P<(../232]_bba`aabcec^ZZ\\]]]^_^^^^\]\[[\\]_``aa_\[ZXYYYZYYY[]^_abdecab`\\[]^_cfefgfed`^bdb_ZZZYYYZ[\\]]^``bdefda]WTTRSTTSSRQPONNMNNNNNOOPQPOPPPPRRSSTTTUVUUVUTRQPQQQSUVSTZ[XXXVUURONOPPQRSRPOMIGGGHFFJMNMMLLMOPOMORRUUTTWVMK_wsVITVKFJKJMONMVb^S\yk\[`_\]k{xuzyufUU]^`qwtnihyvx{tpnllmnv|upjtohv}wvvuyvS\abqhXWizyskour`\_abccfjmtrss^ekklo{f[ibgos~|yqqrQJOOW`ioqtxƮ\[zv_U_gcljztywhu|qic`epqlceib__in`WYURTUROMOS[c^gy^^miPKOSVWXVSRRSRQNJIKLLOSSY_RLPIKiwjqfUNRi{}mkgQShgSLPRQQONMNNOQRSRQNJGFJLJKNJYoZCINNMNMLKKMPOKJMMMMLLQKDFEBA@D>Ge\UQORVX\_a[URPOKFBDJJCBBBEIJORRRRSRSPMJHHGGHHJJKLMNQTTSQOKNPSSPNLJJJFDFFFGGGHHHGGHHHIOQJIGHMEAJNQOLJHJIIJKKKMS[]ac``[\^\ZY\WOLJIIShsty}zn[KINOPNMOPNLNNLKMMMLLNKG[pbPPQLQGGM_phVQSQLJKMNNONONOQRTTUVVWVTRQQRSSTSRRPPQPPPRTUUX^gcVSSROMJIIIHHGDCGGGIIHHIHHHHHEDEFFGGGFGGGGGGFGHHKIEEGGGGHGGGGGFFFFFFFFFEFEGGGIHHFFEDEFFGGIIIOTTUTTTSSTUTTSRRRSUUPLLIFHWjtjaIZJHHHF?K[XTTPQJZupqkflpqT?CVTXUQMKGEHMKGDIKKKKLPWYZ\YUNGID@A@AAAAA@>=A@>EMPMLG?@We_]_^XUUQPH>:=:9=<<>?=<<;;=B@::;<>@?=>>>?ABA?=<;:;>AA?=;;98898888887777787789:<<<<:9::::88788878:86630474/38:;;99:::;<<;;:;<=<<;;;;9878888647:935Kbij\=CCBA@A@???>=>>>=>>>==<=>>>>>>==<<;;?BCBCBA??@@BCCDDCEECBBAABCCCCCBBBCCA=6AVVVWY\^\XVWWWVVWVJ=:<>;<==;<<<<=>=>>>@BB;;>=::<=;<=>?ABABDD@FNJBBA=AECCDED?>===;@IOSR[`SEAINXZI;;=>??A@AB=777:<;::9998:=>=<9997876677678777788789:;==;9::8888777655433443456678888999997666665433333433324445569;;:9899;=64:<98:;87632212344221////033/18:99:83////0/.-,+,-/48:999:50Usd^b]^ZA78/C2#/B;+9OE,%8YD..-($(-.,*,02.04+$(')-0.-/../..//-.1,)4CKIHHFC?:6.*)')20(*132223333-+.0>J3&)*****+++**),,+-01////001341/./037BFGF@39GHCA8125555652274,)*.9??=95//-,1/341./3358767A:+/3/(+0231./-/75-..-,---/..-/275-.:7.13,07.(*(0>=BI8Jovc@126:84234;:.'/7.&)*+,-42&=B)&)+.35YZ\^^_``abba_]]]^^^__aa``_^^]\\]^^_abbdda^ZYZZYZZZ\]^`cehhhhfdb_]]\^_aeghijjga_ceea\[YYZ[[\\]^___`adeeeggb\XUTUUTSSQPPNLLMONOQQQSTSRRSRRRRQRRQQRSTTTTRQQPONOPMKNSY__^^\ZZXWSNOSSTVUTTRPMHGHHHIMPQQPNMNNNNMNOQVXWW\XNWl{v^RXUIHJJIIJJPY^^ktXT^b^\\j~|pqtiWYmr_b|stmhqliwwv~}wpirtqsqqqpquvuzo}}z{xu_URRpeX_]]ltir~rb`aaabbcgkqon}d\`lkmgY[cdgnw}z{{teosUVahqz}v_zětn\`iZe`wh{tkedltsmddjic]cst_TVTTUVTPNMP\fa_k^eeXMPTWYXXUSTTTQONLLMNNNOTXWQNQEZn]ZVOII]sp]S[hZILQRQPPOOOPOOOOMLIFGHJKIKKJX\PLLNMNONLOTWXWSNLLOPOSXPNRPNLKJJT[[YWVUWWWTSPPRRRRSTOHGFDCCEJLQVUROOQSSSOKIHGGGIIKKJKNTUTV\TNORRRRNMLFCEGHHGGGFGHHGGGGARjbWYYK^haYPNKIIJJILUcf_^bfhc[^dda]Z\XOIHMJJVeouyweTLJMNNPNMNNMLMMMMLLKLLKIUjdQJLPZXAB`maSRSRPMKKKMNONNPOQSTTUUXXVSRQQRTTTSSSQPQQOOPRTTX\dli]QPQMKIIHHIIHGIHHIIIHIIHIIJJHEFFGGFHHHHGGGHHJKLJLJIIIIHHGGGGFFFFFFFFEEEEFFFHJJGFEDEFHGHIKMQTTUTSRQRSTRSSRSTTPOXb^ZXPDRrvJGHFEAFVYSUSOIZvrrvssp]D@6ORWYSKHHGLKGHNNKJJKNRUUTVURPPRNE@?AAAAA>=AFC=@FLQUSIL`g``cb_^`a[VQPQRTVZ`\PFACC@?>=;<<:8864;=<:>>>>?ABBA@><;::<=?>=;;9899888887777878999:<<<<<:9::998888887777752395/4:<<<98889;<;:::9:<=;;:::96667778:9;;843=Ufn_7:;<=>@??>>===========<>??>>>>===<<>AABCDA=;=?ABBCDDDFFB@@@@BCCBBABBBAACA=KZWVWY\^]YWWXXXVZ_[L>:;<<==;:<<;<@=>>><>E@;==;9;=;;<>A@@ACEDACKJDB?;?CDCCEC>==??8MTFUWUZVF;=@HTRC=>?>???:>PSB6789;=<::9998:;;:999898655665766666689878;?@<8777666775655434433467877889::99976666665433233233333553579:::9878<;56::::9996310122332231///03425:<<;70,,,,/1000.-,-0579:97;6$:nu^dmfb^PC9=B=>80/287233335.);SRE@=COK?>=82,**-1796222--464347994./@;;4/20.,((/3+)=G5'%.MB//.((*)''(,14332-((,045566542../.*()**=YWIA:7B?:73-('*--/4863210.295-*+.65**,+)*)))**+-,+((),-/101011/////04=GIIHA33DHEA7..245544499-&%*28:====:4,)1;=<6/,14210.-/,''++'(042/./01/++++++-//-.//9A@:/-10.-+,(.<<0++.,0/)HvfM@.'&'&&'-=C4'2<*%*)'))07+18*&('+..XY[\]^_``aaa``___``abbbaa`^^^]]^^_``abccc`\[[[[ZZ\]]^beikjhijhea]]\[\\]abcded`_abca^\ZY[[\]^^`a``abbcb`^__]YVUUVUTUSQQPMLNOOQQQRSSRRSSRRSRQRRQQQRSSSTSSRRSRPOOMKOYabaa_^\\\XNMQRSUUUWWXVQKGGHIMRTTSPNONOONONLPVYYZ][X\eoqf_[QNMJHGHHJQYewzbUZaa^]]amwvsoc`qwk]mzgdieegmoj}knZbhbXOZtxrvtqoooqwzz~yynn|gUU\qeY[[Ygxsiq|wibaaabbdfhcbdzscdkh^`abckv{{}pmmMv}}YVeϼ`]kaPguoegw|icimlfa]g||dUUSTWVSPNLS`caWadcTNOSWYZYXVUWXTQONNOOPPPOQTRNMKHfiLLTOKHEPVQW_XLMPPPPPOPRSTSQQNIHGGGHJKJJKMMKMMLMPPPPOPUYYXTQMMPPNNOJQ]]]]\XTSSSSSSTVVQNPPPRTUW\a_RIGFFFEGKRXYTOLNRSTSMKJGFGIIIIJJKPTTZc^ROQPRSOLKCHRPHHHGFGGHGGFEFCQqoV^pcrpTJGIOOMNOOadYbfimgeed]WWXXQKJJOIKamtzr^NLMKKKMNOMLLLLLLLLKKJLLHUljVKJJOnrW_k`UQPQQOMKLKLMNPOPPPRSTUUWXWSQQQSTTTTSSQQSRQPPQQTXZ]dkeTNQOJHHGGIIIHIIIIIIHIIHIIKQMFFGGGFHHHHGGHJJLLLKLKJJIIHGGGGGFFFFFFFFEEEEEEEEHIGFEEFHIHHKPMMRTTSSRQRRRRTTTVTMIZȺRBDCDBCRYSUSOKPl|qntpiF>FAIOUZWNGEINJGTZPKJJMPRTTRONNPPQND??AABA@>?DGC>>>?DIMPW_babcb^aglf]]\ZXYZZX]^KABCBA?;9;;;97768;<;=@@>=>????>>@@A@==;;:;<;>>=::8798788887788878::9:<<;;;:999998::999777773156208=>=;9898:<=;:989;==;:::::8789:<>@AA=7457DZj]7567789;;<<==<<=<====>==>?>>>>==<<<=>==>?<9:;=ADDCCDDDDB@@AA@BBBABBBAACD?EV]YXY[`cb^YXZZZZ\adXC:=<==<:::;<><<@E?<>=;<=;;;=ACDDCBDDD@=:<<=>@A7G]HDWXZXF8:::AKIC@=;;;<:;>=97CD49;;<<;:9999887547::9986544456676666898779?@;6555655554667654333555766889998887767666654322223323444545767;<967;<737<<;;<;6676897511342////1225;9696/+,--/2200/.,,06788989927@D>54674244566..APE9>72AHCD@5('+-054341**,-/01348=<4-2=B<54449@7,,@`hYH=8878762-+*+-1-,61%&+/7?=;4,QO0:0*'/2.012Nqi\C5:90**-63-,/-)$'9>/&%1@>310+))))++,04872.,*,4::9::985/,.0++$&)MjaRNGB?=94-+**+++/6:<9633100/,-/.-.../.-,*(()*,,-,+.20269863////011/6CJJIC512:B>70-,0332345;5%$),.,)+.27=504:>@>6-164.**)('(&$'-34684225<:.&&)*)*,-.0114=DD@920,+*'$-@MK<344134-6lVARF1'%&+)(.23*17(%,,)*)*1560)('')('XY[]]^``aabbbaa``aabbbcb`__^^]]]^^_``bccca^]]\[[Z[\]^aehihdeiigda^[YYYYYYYZZ[\]]]^_`^\\\\\^`aabbccbbba^[VSTUTTTUVUUUTRPOMNOPQQQQRRRRRSRSTTSRSSSSTTTTSTUUWZ\ZWSQNOY_abba_]\[ZUPMNQRRUXZZ[ZUPKFFJPTVURPOOPPPQPLHLUYX\ba^ZY`geZTVSJFGGGILP[mm]]c`__^^\]grtuu|qWQ\rnZ_ebbffghovqZRTXUL\z{wzummmpsuv}~~yyyvdZjzfUV\lc[\\]anpjmrpgbaaaaaacebbaksty``llgcbcr}{nQeyy~t_cdppVceZYqd}hdszh^lrl`bb^v|gYVRV[UQQONVa`aTv}a^UOQUWXXZXVWWZYTPOPPPQQRROKOQOPKMloQFHKKMNTcbW\\IHMNPQPPPPRUWVUUQHDGGGHJKJKLLLMMMLMQTTSRPRTSRRQPPONLKKGHQVXYZXWNJJONNPRTOMPRQSUWXZ\]ZQJIKHDBDPVSPOMOQRSSPNKHFGHHIIIJJKRTX^^UPQPOPPLKKRWRFDEFFFGHGFEECGOhhOC|o_NO^\NOQQOIKKU_dhijjg^UUVUTOLLGER[gw|v^JGJLKJKMMNNMLLLLLKJJJKMKOkoXJIHJQ]gucNPSQNNNNLLKLMNPQPQQRSTUVXXURQQRSTTTSSSRSSSQPQONRUUWYah\NPOIHGGGHGGHIIIIIIIIIJIIKNMJJIIIHHHHHHHIKLLKJJJJIIIIGGGGGGGGGFFFFFDFEEDDCCCEEEEGHHIJJPRGDPXWUSQQRRRSV[ZSG8SǦPBBCDBAPXUWUPJIWromwlHCGHHFMSUYSC>IOHGZ[LIILORUUTQHHCOVPJ><=?ABAA@@CD@>=<:;8;M_b`aacdadmxn[[]\ZZ\ZVXf_FACEE@89<:;98889;<;=??=<>?????==<>=;;<;:=<<><;::899977888897899:;:;;;;;;;9899;;:;;;;:99886434336;>>=<::99:==;:98:=>=;99:::8:<>ADDDC@;6477;Nf^7666655568;<;<<;<<<<==<==>>>>>=<<;;<;78:;9899<;;AD=>======<;=?@@AACCA@BA:97;?@E@87;=>>?99US?MW[YF99978?CB@=:89::;::84;@<>@@<99988789874/6;;::98653333345668987768::75554555444468875324445555787779877667666664332235312445545636<=;;::;:66:<;<<;:7=JJA=6013320.///11362-0320/////0010-**067998864@RaokU]tskgfeWLC<96666445677502<:16=7377=F>.$).05:9;;82/-+(')*-17966;A@920./;@3,*.QiS:7<:9<;5.+)&%'++(291()+3>985/Ft>#)-.*3821/2KfL,)*..,/24775321.*).1-&'0;81///-,.26820772.-,+-7?=;;;;9.*+/10/($(Qod`d[I>75.%&./++,/5-;O?660'&)().32/.01221-)(*)()*+,3::;>><83111110.2@KMJD7--//3420/*,34344495'&.1.,++,--.04:6595/2992-(')*+*'%'3?EE=777;C=1*((('&''*-./06??<:83-*287=HKJC::>:7<9.Be?&MaN6,-)''&',,-,'*.1.)0627:1)('&&')XY[]^__aaacdcbbaaaccbcdb__`__^]^_^^_aabcb`^]][[ZZ[[\]`bba_]aebdfc^[ZXYYXXWVWYZ\[[[]___^]\]^`bccdddcbba`^ZTPPRSSTTTUUUSRQOOOOOOOOQRRRSTSSUTSSSSTTUUUTTUVXY[^bcZQOPPU^cca`_][Z\XQNONORUUVX[\ZUNIHINTUVURQRQQRRPKFKSUUZ_``]UU[\[]XLGGGHKMKN^h`^aacdededadkpto]QWcjeadegfhgilg{{~ynYNRTRd~{uwwyuw~}aZ\agnZTUZga]ZYcnpmjigfca```aacffffghfeqxiYanjfcdw|pZIq}~~{zvnd]cx~}qdqm\[\[V^y~qdkoszxriipn^mmQhzi]UQW]VQSQOVb`bYt|bRPXXXYWWYVUTUVTRQPQQRSSQMMORRPQHJfxjRGIJJKPS|u_eSFLLLMRSRQQSWWVVWWTKFGGIIIIKMNMLONLMU]]XTSSRRSRRQPMKKJIKJGHKKLIMPNFKONNNNNNRUSSTUTSRTTOJLMID@BKOIEHKNOOPQPNKJHHHHIIIJILRTSUWUNNNLLLKJLNMJFACDEEFHGGFFDKS``I6jHKjmPMMLMIkjYbcgd`]WZYSPLMJFYlut}vaPIIKJIJLLMNNMMLLLLJKKKNKKgxaKGHIJPXt}TOTSQNNMMLKKKMNOPQQQRRTVVXXVRPPRRSTVUUURQRRPOONMPSRST[gbRMNLJJIIGFGHHIIIIIIIIJIIHIJJJJJJIHHIKKKKLMKJJIIIIIIIGGGGGGGGGGFFFFFFEFFDCABCDDEGHHILNQMEES\[UQORRRSRTYSD9Ap̲KDECCBAMUVWWRLNLQes]LNcVJIMLPSXQA?IKDHSSKJKLPUYURNFKHWYJK@;;=?BCBBAAA>>=>=;6;Uffaaaaddeoq^\^^\[\[YXanO>FFEA<>;999::999::>=<>????>><<<<=><<==<<;:99899977889:9779::;;;;;;;;;9889;;;;;;;::988753337=?>>>=;::99=<9888;=><::8899:@FHJKIEB?:65897?X\77677654469;::;;;:99999:;;=>==<<<;;;:99:::9::==>=<<==;===<<=;;<>B@>?==>>=;:;@B@?@ABAB@8489=7NWEGQYYK<;;:898;=<87768999:?@>?AA@=87766799:;848;;::98755422004887665556655543443344224666433556557777669:987667766654443245332345546538=?AA=;=<:88:;;;<=3;XXD?7111100//0/0220.-,/2100/-+-131.*)/58:9750)2@JdtcShynjmifeZF52344225555448:/-:=882.9C5()22025;A><<93/+*+-0///18AFD:1/-/58+)'$DbH29@=<=7,%(()))*+()094-+/3..02?H-)..006<30-0562,*)+//598689535540*))')451+*+-344:AC6.65+)12+4@CA?===:-*01//.'$-Tf_\SF>:4+&(394-,-04*?L1-384.)++,1444212220+)*+*)((*-48:::96788653/+5JQNH;-*-//01341-2853147991*-.-..-,,,-276.-0-08:50,))+,-+('-8=CF<4457872-,,---.0210/0488301,).8@CDFHIFC><=98;5,60";^bN>=/+=?)%+,++.03/)4CB:5-'&(,((.XY\]___`aaceddddededddcba`a`_^^____``a`aa`^]]\[[[[\\\^_^[YY]^\^`_\ZYYYYZZYXXYZ[[[[]^__^]]^_`bdeeeeeccca`_]WRRSSTTTUUUUVTQOKJKLMNPRSSTTSSUUSSSSTUUUVVVXYZ[[\`d^XUTRRZcda`_^\\][WSNLLNOORTWZ\][VQKJJLQXWTSRRSTTUNHJPPNQSX^`XR[cb\SONNMMMKHTgg^_fjijjhgb_bfhkcW\fdaccbgllotxvps}pcWPLa{u|tpq{bW[YXXXUScha^Zaknidcccca`aaabccegfgmlbmvjd`Z]decf|}xxZQji~hougf^V^`_j{qtreZZ]XUYrt`el^buvsrlqpewNbwj^TT]bYQRRSZ``aYh}\MSXUVWWWY[WLJKLNOPPPQSSQKMRPMLIEEOYLDFGEFHJSuwu`FLNOONQSRRSTUUUVWXZVMIIIIJJKMMMMNNMNXaa[WVTRSTRQQMJHHJKJIFFIJFFK\]FKMQOJJLQX[VRPNMMLMNLJLOOJECEFDDDGKKLLLMLKJIIIIIIKKJMNPTQINLKKKIHGFEFGIIGEBEEFGFHILQUX`f>_mVA_oKDLJP¥fXdih^ZW[YPMLGJ`y{||`NLJJLLIKMLMNMMMLKLKLLMNOGQ{mTMLMPNTrdNORQQONNLKKKJLMNNPQQSRTWXWWUSRRSSSUVVUUUQPQQQPONNRSQQV`gYKMNNKJIGFGGIIHHIHIJIJIIGHHJJKKJJHHLPOMKNMJIIIHHIIHHHGGGGGGFFFFFFEFEDFFEECCDDDEFGFINOKEFOX][UQQRRRSPSQE@??>BZgdaaa_`cekum]\___^][\Z^iX=CD@::>;=<;<<;999;=>?>=<?>>>?@?>>==<:988889999778::97579:<;;:;;;;<:899:::::::::98875346:?@??=<;::::;98888;<<;9::98=FOQPLHECB?;758;97BF976776655679::::9876666799;===<<;;;;<<;:::9:<=?@?ADCBBBAAABBBBCDCCCCBCCCAAN`a\[^adc`^^_]^_]_fcL;<<=>=<===;;;;:;;<==<=B>?==>>><<9?CCAA?@CC;338;=@@><::::99?>;:8888776479<=?CCA@A@?=:8755568=>>>?=<::88669878988985553445776543322332122222333466555576689:;98777777766653234630155556548=BB>78>>;988:;;<<3:TTC@;3210/0000//22/-/..0/...-,-03320-/58:962..105Gf|dZsummlhgicI4353/.011235;<527<:82.9;++7:1,*,3;<::644311593-(*6CGE9111/..*)'#:O:/:GFC?6/,-,/40+,+&'03/../46204.'.57549<4,,+)(*+*)-25=HDA@=754443/+)'*/*)*+(*485=HD4*36,*14/:GGC@=>@:/.23.+)&);ZeYD30460&"3LJ7--/0/6G;')*/5642/-/13541.---..--..,*+,-033469<=<9740-3EPMA2+-0024444219<520589:4*)*---.---1671,*+0:<620,))*--+((2=>>>92/10--,)+379=?BEHH@9039=<5,.2547@HIIIH@7<@:;8,)+&-Ka^RL;8OP1#)1763..018DD<3*(,076./Z[[]__`aabeghiiklkhgfdccdcbb`___`_`aaa``a__^^]\\\[\\\]]]\[[[[ZYYZZYYYYYZZYYYYYZ[\\]^__^^^^`acdefgggfedc`_`_YVTTUTUUUUVVUTQLIIKLNPRSSSTTSTUTSSSSVVVXWWY\^```bcddba`]]`aaba`_^[YZYRLLLLLMOQSUZ\[YVPJFGPYWRRRSTUVWRJJMLKIINTRLQX\\VTSRQNKLIJ]kgcfgge^[\^^]^fkha^c`]_`behkqux|~hSctzyx{n_KPmkd|h]Y\[`[Qjqa^`hjfbaccddbdgfeddcdeebgndbpg]bbabbae}|u{wMrtxmX_d_^\Z]^[Z`hfeniU[][fǷmpva]`[isqvympPRro\WXhvbNSY^`_a_S`tOPVVTUVWWWWQLKKPQPPOOOPQQPNMKIKOPRQMLLMLLMLINZkuTNQQQRQOPRSSRQQRTUWXZWQNLLLKKKKMNNOOPUWYZYYVSPNNMKHFFIKKJIIJIIQVO\bKMKMRLHLU[WXXQMKKKJLNPTYYQJECDDDDEFHHIJKKKLKJIIHHILONLKPQLLNMKJKJIHGGIIKONJGEEFFGJHX[T`jEuUHeɸ`EJQRZk^hokaYW[XQNGHfrn|eMIJIKLJHJMLJNMMMNLLLOPKHMJp`RSONPNa}[MLLLNMMMLKKKKLMMNPRRSRSVXVUTRRSSSSTVVUUTQPPQQQPONSSRORZicOMOOKJIIHGHKKIIIIJJKKKKKLKJKMOMJJKNRPNJLLJIIHHHHHGGGGGFFFFFFFFFFFFFEEFFFEEEFFGHHHHMKGEHS[]XSQQQRSTSNGAHtʕd=HCBBBGQVWYTNJIE:Lv}hNKJIKLISSGEIEDGKLLKLQ[^VMIIB?TZKNSC;9==AEBBA@@@?@AACCEVeb`abc^`gnro]]bbbba^][]]aN9?;68>ABA?>>=;:9;=<;=?@?>@A@??@??>?<;:888899999:99998548:<=;:;::<<<::;;:9:;<<;;:9898547<<=>??==<:9::::;;::;==;9967=EKMLJFB@A@>:645987899766666566679:999987767899:;;;;;;;;===;<;:9:<=?>=?CCCCCCCCDDDDDDDCCBCCCCC@I^b]ZZ`b_^^______^aeX<8===<====<===<======>?@@?>=>@?=;<@DCB?@A?8238<>@@?=;999879<9BVJ24CWXG?@?@A?<?==;8348>ABBA@>>=;768:;=?AA=:7555335577644322112211110/123458;9667889:;;8777778999764322694.04454234588731:C@:889:;9::5>LJC>953211110110/21.,--.-,-----/2676215::950/23110>m~]`|znmkffne@284/*),-06;CF=95362.296,++)+373+*37322373-((7FIA4-0330/010*/<30;NND;877644650./20-/4525BD6..+(++/1156/+*)(**)(),.5GVRFA=730-+,,++++*'%+0016;;=JB/+/410024=GFB@>>@<30232/()0?[jH-0110,%#:WK2-/0//6;830+()075222000.-,*))-131242020/25358::986433108FI@:73-)'-20*(.9BD>840/0.*()),59<<:;COVL6,-3@ID<;@>619DJKJHD;=B=55-&+($3MSH<4232/+)4;=>8237:;;94/16:@@6/[[\]^_`abcdgknoopnkigcbdedcba`_```aaaaa`____^^]\\\\\\\\\\\[[ZYYYXXYYYZZZZZYYYZ[\\]^^^^_^^_`bdefhihhhgfea`^]_`ZUUUUUUUUUTUTQMLMMORSTUUUUTSSSRSSSUVVWWWY[^`_```aa`__^]ZZbgdbb_[ZZZWPKIJKJJKLMNNMPTWVRKGNSQRRSUTRUXRMLNNLJHGHJKJLQQPOOOMJNNHQdkiecdYMQX[ZWW_a`bbffefdeheflpsst[IMVrwp{lPXqmvg_bb_Uts]`hlmnnnjfeeeggcbcdcbagc_nq`]db`cccbbdkxrۗRovoxuw~j_ejic]_\XZVT]nmlpdWU]Y^zǸqhxzfd^M^sv}~n|^Mps`[\qiN[hd^^^[PbfKTWUUUXYWUSQQSVXWSQOPRSQOONLMRTWX[\XXZZ\\YSLLN]s_LRQQOONNRTTSPOOPRTTUWVURPOMKIJKLNQSTSRRSUWWSOJHFFFDFILLJJIIKHJksPWfQSNIPOKJPRKORQPOPPNPSWZ^]ULGFECCCCDFEFIJKLMMKIIIIINSPMKJORPONLKLLLLKJIGJNPPMHGFFDISh\IWd||qCQsWtdObcPPopflqkbWZZRMHNfmbyiMHJIJLKGGLONILNOOQPNNRQPNG[bYZWPNMJenXSPNKJKLLKKKKKLMMNPQTTSSTUURRRQRRRRTVVVUTQPPQQQRPNSSMLMSchUKNOLIIIGGJKKIIJJJJKLLMMPUSNLMLJJJMMLKKMKJIIIJIGGGFFFFFFGGFFFFFFFFFFEFFFFGGGHHHHHHJIGELW[ZTQQQRTUVSJDFkܸZ?GBBACELVWYTNKKD?]yYDJIJHLCCYGDGHHGLMMKNYcZMJMKD?A>>IQEC??>=@@@@?@AAAAACBAOccbcfhc^gw{b]]^[\\\\[\]`mK:866=BCB@@?><:9;>@AA???>>>=<:988989:;:9:::99::<;;=<;;;;;<;99<==<;<===;;::89857===<;:9:::;<;;;=><9876;EKIFDCA???=;:62137999887776566665688999987689:99:879;<<<===<<;:9;<=>=<>BEEDCCDDDDDDDDDDCCCBBDC?EZd_YZ`a__^^```aa__f]<7=;<;=>>>>=========>=>@A@><>AA=;;=ADC@@@=6139=@@@?=:88888888?SK527KXL=9<@CCADILMONKJGEA????>::>CCCC=546;;::;=>>><8656655656664433211221111/.011248<=@BA@?>?>;877567899865433258741255202432247;FJ?789::99;:7=GJC725532221111..242/---,,,---..3886448;;84//110./-CDA?>=??70,-1.&+19Yc2$.000-%%CS;/11////1631.05887<=511+')))()*.1137765349<9<;854321242/07=844555543122,,22223575323/-./01357;<:60$&=G?82,((3:4*/?HF@;2-5;<71,)/34;9315=IK>16819MUQOROG=;CHHGFDHKD7.//)).*'13.*)((*276769HMB:8755669<<==<95[[\]^^_`abcfjlmnnmjhfcbcccba`___``aaaa``_____^^^]\\\\\\\\]\[ZZZYYYYZZZZ[[Z[[ZZZ[]]]^^___^`aceehjkjihhffd^_c`_a^YXXWWVUUTTTRPQRSSTTUVVWVUTTSQRSSSSSTVWYXWWVVVVUSSRSSUUU^ihdd`\[[YYVPKJKKKKJLMKMUZ\`_XLDHNSTUWXXXZ[XTQNNPONMLLHEIPSPLMNIQSHJVdkidaVPV[[YWZ\^]^aktrqommkikovzxeZTRjvuzyu}tf{l[b`_}s^cmstsqoidcccc`]^addbbgfclrg`cc`aabbbb_hoZ_yjgdgjf[cnpmcY[\YWXdtqkhjcevV\YWlʹ{zug[gqm`W_lv~wpQnxe`aqwi^jng_[WXO[hWTXY[XWXYVRRSUWXVSQPPRTRQQTTSUZYWXXZ\]^^`]UNKKJLNLOPNOQQNPTUVSPQRQQRRSSTUUTPOLJJJLNRUSRSTRRSPLIGFFEEFIMMKJJGFIHK]k]W`UQRRWUOIJNGGIKMOTWVUUVWXWSOKGDDCCDDEEFGJLMMMLLLMNNOPPNNLOQPNOONMMLLLLKJJLLLMIGGEDI`aL>LwPINvۗxb@Uo`UT\gprl`XZTIBKglUgtRIKHIKKIFGMNNJNPPPSRMNQTVJP~[[^]ZSONNqbV^ZSPNMMMLLKKKKLLLOQTTUVWWUSSTRQRRSUVVVVUQPPPPPRPNMOKLJJVd\MLPNIGGFHJKJIIJJKKKLLMLNVjmf]TNMQSQNGFJIGGHJMKGFGFFFGGGGGGFFFFFFEFFFFFFFGGGHHJJHHHHFELXZVTSSRSPPQMHAUա|RAGFDBCBHSVWTMKKFE^eOIJKKNK4DQWJKIIILMNKR`bPFILMF?@>?D@CHIHGCA@@A@ABCBABB@@Odfcchfcbixa\\^[[[[[\]]`ko@466;=>?@A?><:;;<>>==<<==@??@AAA?>??=::;:8898:<=<;<<;;;>@====<<;;;;;;;;<==>==>>;;;<:8777:@AAA><<;9:;;::::;;;;>>;869BLOKFDBAA@?<;=;743578998877765665554568899876;;9998647:<;<===<<:99;=??<<>@????===<==AA?=;;>CCB?=95138<>?>=;988888998@HC:79>MN?:@BC@?@CCDJKJGC@@AB===<;?DDEEA;648>BAA@@AA??><=>=<<<:6568877644545555323422221/01122348=FKIHHGDA=:876668888555333369:7452376569:pp]o~xxumdbQ82/-/...+(&&),085*()))**)'')**,.+-6;6/-,.0/075-6FG:+()*+.126=;47949JA-*-0-,/0,,/1//11,/2844<;1//+(-1540/,++++---+*,*$'6;2)(((%$&'*+.<<:5-)()($+32QO)+--.4/$+MJ01530,,-01-)'*7A819:/-/+++*+*+--,-07=:545?8,"*@C82/,(*6<3*9QVJ90+/;GHB6-18748<:99:>KTSI<22559AA<;9689[\]^^^^__`cdeefgghgeecbaaa`a`__````abaa```___`_^^^]\\\\]^^]]\\[[[[[ZZZ[\\[\\[Z[\\]^^____``cegijmonkjhgecca_a]]c_Z\ZYYYYXVTQRUWWWVUVVWWWVUUTRQSSRRQRTWYVRPOOPQPPOOPQRSRVcedhb\\[ZZZYTOLLLMMMR]eggcbed^QIIMSTTXZ[[\]\XRLILNMLOPJGN\[PTTLSUKIKUdkgb^]^^\Z\_```bdgpvwvrorstx|zmmvleox~wkei{rh\^cq^gqrpokfa``^^^^`aceddcgiffhfdcc`bbbba`d_a|[ogldfijdaikjkd[\]XVduuoifjmcufXYUkvq[Xau|h^^bmz{X{kddgfguvigg[UTORWZ^]^b`]ZVSQRTWVTQQQQPNJINUZ[ZYWUTVUX\[YYWSMKLLJHFIMNNQTVUSUWWVVXYTPQQSUWWYZXWVQOMLNUXTRSSROLJIEEGIGFHKMLHGFCGJJGFJMU\PMU[]ZRHEKIIJJKKNRWWURQQPNNLGDEEEFEDEFHJLNMLLNOQRSRPNNMMNQPQQNNNMLLLLMMLLKHHJIHHJLQD=@XˬLBQR˨˜RA?]vgX]huul_WPHFQbhQUnLEMLHIHIECGKLLQXUQQQQLLOUQWyeKR]\URNLOzZW_[WVUSPONLMLJJJKKPTUVVXZYWVUTSQQRSUVUVVUSPPPPPOONMPULHFJZaTKONIGFGHIKHIIJJKMLLLLJHGWamvsgaccee`XXVSTRRRLGEDDDEGGFGGFFFFFFFFGGHGFGHGGGGIJKIHGGFFMVWTTSSTRJFGIC=oŕMCEEDCCBFMSWRKJKHAU{lU]RILLPF@?B@CGJKKMHFGFBA@ABABBA@Pddccca_hqz~d^\^][]_^^__`]sX35699;;=??>=<<==>>===;<=@??@AAA@??=<:9;:989:<====>>==<=>===<<<;;<<<<<;<>=>????=;==9678;?AAAA<::99;;;:::9;<<<>>;87DOTPIECBA@?>:9@<8<9658:9888876666655346789:88:?<588643379:;;<=<;;:9=>@ACA?>><;=???????>==@AA@<:;?BB<886458;<<::999889::;:>@BBDEDA>76;???@AA@??>>?@?>><9768:;:865555677765664444433444679;;;?A?:9999878999989:748?>75664332/,.7==:400/.--,-../0/486456:<96/,,0221141(BibZwvvztkjiQ2-20.,+*()+--.463.+--++)('&')*'*5-3::5-('*..,++*+)'(0877;60110145200.,,++153/-..,+..02)'),274.+,01/./5;:668>EFB;8<>:43322131-.0001353./10/12330..022340,))+2:=;:;8/(.:>710.,(->=-+DYXQA./9?HJD8.GO@<358:9:<8/5IX`P8BTZZWOJG>/$/AC<<5.,**,-28:656:==2*,198788\\]^^^^^^_aa```aabdccca`````____``abbcb``````a``__^]\\\^_^___^^]\[[ZZZ[\\\\\\\\\]]]^^____`cehkmprrqmkhechdZ_`ZY^]ZZZZ\[Z[ZVUVXWWWVWWWWVUUUTRRRSRQQRTWYYUQONPQQQQQRSSTVY[Y]c^XZ\[ZZ\\XSNKLOMPel]Z`dfhfb\PHIJKNPPRSUY^^TGDGKNQSOFGQ\_bZLVXMLIJYgkhdcb_\\_abdeggefpxwrpuzwrynas}tosv}}iXXdfbvdV^k_swolnkf`___^]aeddeecdggeddccedbbbccba_\ݫ]wm^lmphffcjkjnf]^[T_tvromkjkkb|[SYo~vsz}^Xabkviaa[b{ksgfkqs|yqtm[RQW^bca^_`_]YURSTUWVSPOOPNGDLRUWYZXUSQOOTXSPNLKLLLKJJIJMPRTUWXWY\]`cfdZOPPSVWVY\]XVSRQMMTYVRQQPMJIGFFHKIHIKLJGDHUZSLHGD@MWOHVW[[TIFHGGGIKKIGLRRQQPNLLJFEFFFFEDEFFJOPLKMOQTTUUSQOONNOOPPLLLLLLLLMMLJIIIIJJKNOJHEYxŠdžJH]ټÅKE>@itg]e{xg]VJCUhcSHqnMDKKLKIGGGFGIIKNbZRQOLJJJINnnXTYY[QHMJL}xSTYYYYZZYWTQMMLLKJJOSUUVY[ZXXWUTSRSTUUUVVVTRQQQQNLMUYUKHFFQ`ZLLLIGFGHIIGHIIIJLLJJIHGFFDFQ_jkgdaeiouqkmg_WMJECEGGHGEFGGFFFGFGFGHHGGIHIJIGIJKKHHGGFMUUTSRTRRWXNKDIyҵ]IFDCCCCCDIQUOKJKICLljmpPHLKIHXJPNQKIGGLKJP_UCADFECA?>?>@BCDGIILLKKKGC@@AABBC@Kcbba_^]hpz{h`\^^[_eb_``a^aj7577999;=>>==<==>>===<<=>>>>???@A>;:99:99:9:<====>>==<<<<<<<;;;<>><<<;<>>?@@?=====879<@AAAA><9889;;;;:99<====<99@LMLJGECBA?<;89B=6::538;:778886666655446799;:;==957875434689:<><;<:;>@@@AAA?CTc_bceffdccccdddh^A5359>@>=>@BEE?>><<=>??>>?>>==?BBB?;9=@=64699689546788889:::;::;:89:;@GIHKHA;99;:=@@@DKNPVTA7:<;<=?ACCED?:;=>@ABA@@@@?>???=:9:::>?<9778878999889778788776679GIHHC<777668877766313469;;::<=<>?A@:5344256778988898777;==:8764435AOQME8/-......./0/./67446:;74/,+.212202+'HdW[rtpttpmoiD170.--./20.,+272.01011-)'''((&.@<*'()+,.-,-/2457763,**,...-,,+-01757;?=80'#(00+*,++*)))2<;8622331-++..,-.+-7<60-.0//1=QZL9)8F>0=;>=6003433345641011232//2101234431/--/0-*+/6:>=:74-).688661,*&1LI0.HUMLI=DHA?7*)A;GfmRWytb\UPV^[SIkjLIKOLJJHHIKMKIIIIfZQQNKIIFCasPVTUYa`SRJEeIKNQTUX]a`][TQQOKJJLQSTVY[[YXXWUSRSTUUVVVVUTRRQPMIIOSNKJIIMZ^NHJIGHIHHIGGHHHIJKIJIJJKMNMJJMS]jmd]^b`][[YSNLHBBFIHFFFGGGGGGGGHHHGGHKJJPPNLLKKHHGGFLTVSTTTLHT`ZPHX|ŦФQPGDDDDDCDGNTPKKIIGEZwoKIMLNOWHLNMHHHMJIM\W?=@?BFB@@>>?@ABBEHGFHJJLLJIHECCDE@Jfdca^]]biu|rgb]_^]]a`__`abZi:798989:;<<==<=====<<<;;<;<=>>@@A=;988899:;;====>>>>=<=<<<;;;;<>>>=;<=<=@A@@?>=;;;:9:=?A@=>;;989;;;;:::9;<<=>;9=GJHEDEDBA?=:968B=7:961489888886666665445779;:;:76677765444457;>=<<<<;=BDA>:=@@?>>>>>>>>=>>==>>>>>>>?=@Ze`a`afddcbbddegV92013:B><=>@CDA??=<<>>>>>>==>=ABBEB><=;63369::9522467888::99:9789:;=ACDEFA=:<=@@?ADA@ELNNNI;67756:?AAB@?>????==;:<>=:;?=::9899:;;;;:889:8788887667:BGC=899=CING?:756567777764322578899<=<=>>;7467534666789:99989:=>?<:::988?KPRWVJ7,/1231/.///.+0522697520/,+045301/'.H^Y]stqqpnmlY?9777753351+*173474444/)('''))-50*)('''()+,+-02431.-+,3874.***-104:@;542.++,.0/0/.-,,+**3<;86300/+),,----.:>3*./1434;@J\J,*HJ3+7:?=0,++*+-0/,1494.3::0/331/-,+)%',-*(*+.0/,0BF.&***-110250/1/.--,--1N`J.5F?/,1.),485876543333.+-137??3*.55/)),.1455676443223321330012356644563./6;=??=851.15416=:.))$2SR76NP<;AA?????AABDEFFEGIKNNNJGFFD?Jhihd_^__epqfdbdc_][\\___``_j<8989899:;<=>=>>>=<===;;;9:=>>@??=;98768::;;====>>>>=====::;;;<====<==>?BCB@@>;:9::9;;=A@:;;9989;;;;:::::;;<=<=;997:C<8;961479888987666666555788:996676656765433359==<;<<;=@DA?;;>>=<====>>=<===========><6MibbadhedcccddegY;02346<=<<<>ACBBDA=<<>>>====>?ABCDDA?=9755679=72345788899:;;:8557<>@BBA@<899<@CA@AB@??ADFFC=<<857:;<=>@ABBA??@@=:977:@A=988<:878977888876668@EB=9877;DMLLG955678987765420246768979=<8458766655666889:::98=>>==:67::ALWWF4/13321/.//-+-0135765323347:8530.,.*Jlenzytqpnk]D8::;94/3=8,(-49<72210-*('())(-2110,*((')**++-153///./26640,,/1105=@7,)**,11,+03132/-,*(*2:<:95/--01,*0.(+45*'+16J?),>7()4./2,+++*),/0(&4?>65=<3=G<1+*))'##&(&$!").+3RV?,').0///137751---++,0ESC.*)+(&*.401=A0365420/-,,,.--2?B2((**+*((*-157302211158887640./2579;=@B@838?@??@=979;=:3/6>6()*"/VYCGRE23975:9<@42=A<1Jf\WVE3./342/+/?D32IVUQJB:63,*///69?>?CD@??>>==>=>@CHEBDGHIIHJJHDCALajiea`aahlg```dc_]]_^^_aa^ij5989899999;=>=>>><====<;;:;==<<=>><8678:<;;;;=====>======;;;<;;;<<<<<<>@ACB@>:88::9:::<>=:;:999:;:::::::::;<>@CEGEAABBA>=<;9:7=D=9;96246988898756666655578898855766467654432379::;;<=@BCB?==>>==>>>>>>>=<====<<<<<<<=9Badafkkgdbcccccg\;/44557;<<=>?ABEHB<;<<<===<=>?ABCCDC@99;868889843457888999::86215=@?@@@=66<>?@@@@@?@@<?@>:;>??:65447=@<9769:79::;:98999:<=<;:88887888887778:?@>:87679;AJOLB5365787766643123455683/5941477666655667889::988;@@=?@>=;50//148631//:/,_xhq|usrjU=35651..4B<-'+27:511/-,*(())++.352/./0/..-++,-28:863/-01//--0471.2;:4+('(*-.,)+-3894/-*)*)-6:940/000-*,4.(())().5??=4/7=5)*+"/[^LRH:37921757;79CEEIYdZQXS?0,*+07=@ELF>EQSJ@;86540'%1:<73.-0]^__`achjhfddba````aabbbbbbbbccdefhihihgfedcdcccca_]]^_cfffeedcba`\[YXXYZZZZ[\\]^__````````aa`_`adhlorqmgdc^]][[Z[^_abbdeghkmnlf_YXXWVVUUUTTTTUWVXXWYXXWWSPOPONPQSTUWWVUUVVSQVZ[`ionkfacfe_YRKIJMRRORYaehhggc\X\``cefcacfe_RMT|liiSZfj`QNPNMKP[]\cigccfmqrlcclnpy|ytxxrv{~}{{qZKPPNUae_dprrehbhgg`ahhfeffeeeeffbbfgeiqvuv{yw~{~xxy|uzz{xirnq{}xtnkkkmovvmlhda^m`Y\TQYcfbajkҳwqfnwpd]hlg`XQX[]_aed\UVXUVVSOMR\_\[TOSTOIKUXMGHNVSMMOSXVNHGHHKNRUVYdr{~tj^SOORSVZ^dei]NNTQJOVVRKGIKLKJIIJJLKEMWR_mg[XXXWQNOPONNNNNIKRQMQRPQORUTNDADBEIKLLLLJECCCEECCCCGPQPQSPNLJKMLJIHHIKJHHJKLLLLKIHHGHHHHGGGGFEELRs֒MOSJCPXheJACCBBEEEPkoc^[TQJT}rIHKBAEDEIHJJKPQQOJHHTQMOONKKKJKLLJUSQGFPMRiPQOMKLLMMMOPPVVSSOQVWXVUVUUUVVVUTSSTUUVXXWUQRQPPQQNKKLLLMMNLKRa[JHIIIHFEEIIJJJKKKKKNOOOOKJKJLNMJFJfqOHLLKLXgidWHCDGHHGFGIKLMMPLKUUOLJKMQSSPJIEEMURONGA>;=CDE?U¹ fbZNDDDDDEDELSQJJIFFIBOcULNNJMWMA;31I`VE?GL?A@@??@@A@?>=<:989;=>ABAAEDDEFFHGGFHP`ghedbcdkke`\]_a_\_b``_bc`mi2;:9:9;:99:;<;<<====>>=;:::;;:9;<><8779;<===>=<====<<<=<<;;;<=<;;;;;<>@BDB><:99::;;<<<<=<;;::::;;:99;:::::;<>EMKGECCB@=<<;;:;8=F?:<:52469999997566666666777876546665776555445579::=>?ACDDA???>??@@?>>>>=====<<<======:AZedgooidccbcbahZ4/544469:<>??@BEH=779<=<<=<=>?ABEFEC<36<;877679865567888998885017>A?>>>;89=??><@B?>@A=>IPMKIILMIHEC@>==>?:479:<9757889;;9768989:;;998998:<=<<:88887888887779;?@;89668987=FKG<43566666665521233455@I@847965556655556788999977=?=>@>=;:731.*'-7720-.0//./...-.0124467433;;300-0@<,'*068200-,+*((*+-./484.-6;7662+*+/28<<:4-,.0-)).49:1-/552-+)))(+-*(+6?@;2-*))((,111343001+(7A6)&)*(+/7=@GD66;3**%"0@;.,**,,-.-+,.'&*1896798:<3*('),'''/;?B9532BP6,4000,271/01430,,,,,,33//1///2HTF?504;2--.//.-,+**+-/05;72/-+*+*++,.0/,-+(-477;>>;84/.0589740.,.49:;=BE;3/4978?;36=92..$-\YEI@63:9545329?EQJJhyo_QVW@1.+)+-5?BDJD;DME:876686*+:A>9CJ1)04DH6**(+6@JI4(+*+.,,.,/7<=?>;9422^___bdfjmlhedcaaaa``abcccbbbcddeghjjijihggfeeedddb_]^_`dgggfeedcb`\[YWXXXYZ[\\]^_`````````aaabcccdfhihgffd`]\[ZYYYXZ\[]adgilnostnd]YVVWUUUTTTSRRSRTXZYXYYVPOONNOQSTUWVTTSRSSRRRSTZfnpmigfghhg_QHIORPNP[hnolkkhd^TT]dc^`cdccaXLLcbswDG]h_YRLKKNMOPZfjigjkillfeilpxzxwrppmjpxwsw|}zwmVOPQOTae]W`]fyy~z}gdedd`fjhgeeebbdcefedfgdhrsttxyvyjxxurmighlosvupmhfidnܕWOY^WNaidaiTuԲwoj{wyh`qsj_UY_]eh`age\YXUVVRNQX]_^^VQWTLIMVUHCKY[OIMRTUTOHFEFIMRVWWfow|j\WSQQSZenldehcOMWNHPVSLGEILMKIHIJIIICQYPOQRQPPPPPQPOONMMMMHMWTMNQQPPRUUQJECEFKMKKLNLFAABDDCCCCEIRXWSOMLLLMKIGHHIIIHHJKLLLKJHGGFFGFHGGHGGFGHJPoHSQFD<78=CCBAADELKYpj[YTQPNiqMJKDABHFIIIJJKNPPOIHGHIJMQQNMLJIIJIKQPNFNNOPQUPOMMMLKJKKKSUTWMQWZZXVTSTUUUUVVUSTUUVXXUQPPQPPPOOKGGKNPPNMMN^_LGIIIIHFDGIJJJJKKKJMNOQPNJJIHGHILLPcqraMJMLMYdfc_VICFGHHGGLQSSTQLLV`aXOKIJMSVTNEEOXTONJACCDDDE=Oö~ha[KDEFFFGGGLRQMKKJGGDLWSNNMHMWE?7,4R\D@><???@A?>=>?>:99;;;;<>>=??AAABDEFHIP_dfeefghqsja\]`a_^_`a`abdahjA<::::;:99::;;;<===>@@><;:;;::::<=97799;=????=;<==<;;<=<<<<;<=<:::::;;;;;:;8=F?;<96336988889755775666667666554666678876555545;??=>?AABEB?@@@@@@@?>>>>=====<<<<==>==:=VhedorkedbbcbcjP,15323216=>?>@BE@5148<=<<===>?ACFHF>614:<867648:7666788799899757<@@><<<;:;<==;>CC?@AC?=FNLIEDHHEFGGEDCBAA?:77898778987997768888888888888:=?><:888878999988778?A:896679966:AIF71465666665421133342?alU;68764565555566789999768;====>>=8201.)',/00//////....,-0123354008?934423037/,'Kl_fszwusq`C@?303/0<9,'+.47210--,+))*+-00363-+4;9763,+,03568:5-+-.+((.5;80-.2230.,+)(+/-)/?EB;2-+*+***-/3773//0+&8C4(%))((+3;BKI54;613-*=>4010(4B:99/+672+*048:5-/5520.-4-*'%'*/38::?@302120*0?>60/10.-,,,,,11121157>RaTG;.,8;4/,++,,*))*+,.024620/.-+++,+-.+)(&&,2249==952//14420.-,,18;;9:@?5--/12:CB9699873#*NU?EE8486343008BJSKKiqlro]I9482<@8:?;8:977997*/1(-<@4*+.-,++0//49<>>=<843^_``cffhjjhfecbaaaa`accccccbdefhhikkjkjiihgffffgfeb```befgggfeedd`][YXXYXYZ[]]]_``aabbbb``aaaaaaa`^]]\[Z[Z[][[[ZYYZ\`bdghikmmoqsrpj_UUXWUUTTSRQQRQSYYZ\]_\SOONNPPRSTVWVVVVTTUTTTST[fnpokgehopnfYOJMPOQV_gmpnjjkfZU[a``abdbafeYKKP^TBO^efURSLOKNNQ[eihhgcfmjgiov{|yfSYhkb^m}zxyzxq]NOOPU`d_\]]^eag{{}|ygdcaaanlffeda]^babgihdd`grvppgvvrplhefjnoqtuxibyxpo{UZeygKbng`bNsʿϫwnt{}v[i}n^W\_ZemYSY`d`WUWVTRX`aceg_Y[SLFMYNFN\cSGKPUWVTQLHFFHLU[Z`kqz~yhXSRSV`io{dfkoSLf]JPSMHGIKMLKKKJKIB@6IZF?>>=<<<<>@>?@>>>>??=<<<<<<=>><<=>=<@@?=;9;<;;;;=<878:;;<=<<;<;=<<<<<==<;:::;=?A@=;8:<;668::;<<<;;;;:::;;;:9:;::99::;@EFEEDB@><::;;;:;8=F?;=:754578899864677666666666555566669;>D76555349<<<=?AABDB>=@A@@AA@>========<<<;==<;<<9Gafgnrleacccdle=-243441,4=????A@61046;=<<<==>?ACFF?65129;975537:86577778889999<:;<>==AEB?ABE@;BKJFFGFFEGIIGHLLFDD><<;99:97776766666665667:;;;88;=?><:988999999999766:<988645886633?H>33557756654322222430Al{_>/5:85555555566899975689;=<=>=:4//0.,,,./..//.///.....//1331/006<513334454.,(Bea]iuvtqurTJF4198132,*+-27;9/,,-./,)*,../00-++-----*,.....01/,*+,++-/10.,+.046431/,*,11.7ILB72//0//0/-09<71+)+('7<())(''((+9JVR:,2@A68?A5.5=7%1ZYOQD6>>6-+/26666669<:9510)((#%-430.5:>8-()./:@;30./.-,+++,,/0017BIHDRcaTH6/=E=72000,)(),../12430./11...-,,*(''(*+*),5;94120001//../.3;::;8694.-1335>C?9644;D=&(EPCNSC541-02/-:FKKIKams_829IRPDDSO3&088768=;999:;=<944BN<2:?5(@_XAA@,)2662342/,)05326;>>@>:55``acefedddffedcaaaabbccdeeefgghjkklmllkkkjihhhijkifdcbcdeefhgggggea^\[ZZZZ[[\]^```bdddca`aaaaa`__^\[[[ZYXXYZZ\\\\^adhijkllmnmnmmnrtmaXWWVUUUTSSTTUUXZ]`baa\QLNOPPQRTUVVWWVVWXWVVVVVZflkjgacmqppndVMMOQOPWdopjjmmib_^^`abcdddgh\QQQWeaTNK[jYYe[W[WPORYdijicdlpjhr|}tppkhfah}xxzzZGJNOQV_ca_^_`O}ɐnw^u{~xuzfdcbckpjeeecbb`abbbbbcfhjnklx|{tomkigekolmptxrjp~bXmvz}wz{eZgjd^[Isϩtrg]us\U]a\ahaXONX_]ZZWX_fjkmrrbWZPIIUUDOegXKMSUWVUUSQPMJJNW^_es|ufWQRSX^^_wtchij]ZrdLPOKHILLMLKMNHBIPQ\e_SSTPNMNMMMLLLLLKJIHMSYZWQMMOPONQRSROLGFLNFHOMIFCAABAABEBBMUPJJLGINHHHIJIKLLLJIIIJKJIHFDCEFGHIIJJJJJJJNLB775?OLJLHHJORHACDDE@>==<<=@B@@?@@A@@?=<;;=>==?@=<<<=<;=?>BBDIVcbceinuxoebaba^^`ca``___coH89999998888999:;;<=?@>=<;;>?>?>@;678:=>?A@@@>;<=><=>=<<<;;<=<;;<;<=???<87:@?8679:::;<<;;;;;;;;;<;:;;;::::9;ADCBDD@><999:;;;;8>G???@CA==@ABABBB@>===<<<<<;:;<<;;;<>>LaikplebeddicG0333697326>AAA?>9101469;;<=<==?@BEA6241277874436::5466778879::>>?BB>???DCAFIEEFEGHJLLKIIHD@><;<<<;;;:877666655778;==?BCD@98::<<::989999999999877778986666535611?F;3566666666652012365->o^B847854555555677886348847>?>=9520-++,,----.../////////-023568:<:31225752.+*1C[f^equtqqfXSG6299312/.,025B;-++.23/)'*-,+*-,*('&&%&(+.-**--,**)))*-11+'(()-689863/*().02?NI932224335:866510+'(&*<@**,)(''&&(5K[L,/GB239:0.:A/''Tqgf`F>=3,.012047:88::73/2)*-+.,*,++*%$-;A3++.-1.,()++,-0-5EQVWODHVehZG>JXWQKID8-*)(+/014620.-/121110--+,///-+)'*28500111//0000//5<;874471-29;98<:45973=NM7/8PWTURA0++-/.2=EDDJJOguzvU54ALONPYbR0%+4876=A=;;;<:77968ED26BC>+*G]WG9/64.5<;752-')1337=>>A9257abcdffb`aabdddcaaaabbcdeefgijkkllmmmnnmmmllllklmnligffeeffgggfgiiifb_]\\[[[\]^_abcdeffecbaaaaaa_^^\[[ZZZZZYY[]_`acfhhhhknnnooppoprttog]WVWWWVUTUVUUVX\_`_`cZKJNOOOPSUUVWWWXXYXWXWVUTX]^blof`fmnopkaVPPPOQ^mnhkmnnlha^^_bcdgghnlaUOLP]_QMesXRlldjaQPUTWakojgksplyxw}ngeenywm\bPIONPRW`aaaa_\L{mJx{exdnutuupyfdcbfpohjliefgecec`adjmlllnqg{rnlkjikrxuonopwk`fgdfo|wljgb_[_UnӨqsmdow^Vbljeff]YZYZXTTV_hmlljii\PQNGPbPKhlYIS][XWUTTTTUROPRVXZ_qxl]OMOOPSTdkcefec]\eWKMJLIKNNMMMH=Ba|uj`SMMKKKLLKKKKKJIIILQRSVWXTMKMNKJMMMNNMH@CPMCINLHD@@@@@ADA>EKJIKNKTWIIJKLOPPOMKIIIIIJHIJHFBBDFHIJJKKJJJIKLJJJ@@FKLIFGHDAAEEEHKI~cSUPONLKHHJIKMLKKIFEGHGEGHHIKJIJIHIIKQQMMNPRRMMNNOQUNEj_Pk]PONPONNMLJJHJtcITYW]^[WVYZZZZYWUTUVUUTXVJIPRPPOOMMOOPOONNMLJM]ZJIJJKKIHFHHJJJJKJKKLMMNONNMKIHHIJJMLmxaRSX[ZUOJIMPKKRXWRSRPNNMMQRTYY_mtrdM@EOTSQOOQQPQOKGFFDCnƽòX>GDEGHJNRSQOQQOPPQQQOLLMNMMNKJTXQct}ucOA?>>>=;<<@BBB@@ABBB??>==>>>??@>>>>?><<=<@@BAG[eaccfknjfdc`\\^accbbbccclC8998888878889899::;=>=<<;;>>?>@>:768:<>?AAB@=<=>>==?==<;969<;;;==>??>;879>=:99;;::9:;;;;;<=<;<<<;;;;;::;:;<<;:9::::;8=F><>;:95346789844677767777666656777666=HI=62334579::;?@?==A;;>ACCCBBB@>>>===<;:;:999::;>=8J^hpnigggkiD04667;?:88;DDAA@<5123458:;<====??A@:33411358754459:755568889;;:<=;:767989AC?>>>@?===;==><<97877665679=DIJKJJH?9988::::89999999999989:8899887664236404;?;5556677778841113694.DqiQ<038755555567777736;3).:??>9540++,+,-..//0/./0112352.015;AFFB:42015731/*1DAFb^_nuupljT<8544379951.8:181(***+-0.-..,+,-**+)((&&()*,-/0/,*))((*-14/))').:?=92,**()-/8GM@0/334458>KKC910/.+*(*?D/-+)((()&$$(M\7+4...,.*.9<'''9oqrkO963,-/-,*+-255451/02/20:VR@0+,,,,,+*)-6D<61135,*)**,..15L_c]VNG?=ZobQGXtwi[TH5++*')-1696/--...01120.///561-**+,142/12111210/--03662/17=616?>:98415:94;DD>JUclT99DNPQRX_L,'*3>=;CD85555403<=74.+0466-'3NXM@7:6,3>;575)%,0005CMIFO^a~eORNLKKKJJKMMMKMMLKIFDDDEFFFHHHHIKMOSSMLLKKLMKKMMMNONJ{OXncROPPPONMLJJOKkwJM[_^\YXYZ[[[[YWUTUVUVUYVKHMQQQOOMMNOONMLMLLJJU^NHIKLMLHFGIJKKLMLKKJJJLNNNMKIIIIJJKNPnl_\XTRPMJKRYSQ[XQQONMNMNONPUXahlqujSEFMPOPPPPRQQPMIHDHĸÝIEGGEHKMPPPPMNNOOOQUVSOOMMLLPLO^NCUw|gJ=@@>>><;<=@ABBBBCDDCAAA?>>>>?AA??@@A?>>>=>?@>>Reba_^ahifed`^```bdeddeed_=<:;:::99988888889:<<<<<=::=:======>=617;:8:=>>?<869:;;;<=<<=;:9:;;:::;<;::::;;;;;:::;;;BEDA?>><>><:::::;8=H>:=;9:63356677634577777776666678986679@=;9522478:;;=?BB>=?:9=ADEEDDDB@@@?>>=;:;;9733567>>;Jcqqnkihoc52658=C?;75=FA<>@<41466689:;<===>?=84344221467654567:855689:<<;:::9878986:ED?>>??=;;:9;>@DIFBDINQOLIA<;9767779=?===;;:::997576689@HNLGF@989989::99999999999998999::::8876544555208>833477678887421354542Ju~rgI05:7555667777883:HB30259:753/**---..//00//110127;710/14?MI<87327:=<83.>L92L]]kvxoh`@,.10-3=?<4/3?@3/.)(''')/4871-./0-+---,+)*)*.5651.,+*+,.-,.20*(*/;CA:0(',,,,2@KD<=5/.025>MWXOB70+)))**:?0,++*+.30).%,F1$*,/.+*&-:5*)23f}kN@512/.-+('(*/3687412.375LcI1*,-,-*)*+*')1:?AAA:11220-+/3H[c^WQOI8+NmaNB[vaQ<+)-*'(+0684-+-...01220-,,,1342/--.01//1236778850/320,().6;747=;9:9457400;HQSMA>J\\W\[SH:55884263)'/3/,*,7=80*+0`accbba`^^`_`a`aaacdeefghhjjklmnnonoppqqqrsttssssrponmlkjihfecbba``________^^^_abdfhiihfedba```__^\ZZZZ[[[YYXVWYZ[\^bfhkmnprsttssstttuupf]YWVWVVUUTTTSPQYabffXGFKLNPSUVXXXXXYYXXXXWURNMPOScqocVLKRXXVSRRRQQU]kqmpqnoldaaabbceffhpp^NMX\WhxlW`nmyr_icPQSXfmmlje\\eikrz}}nowkirtmfWWYZYUQW^a`^]][ZXTQUYURQXhsz|_ajkjvplqunc_cdefbTMdyutuhdhihgehpqnlopm^Zcfbqzs}xnknpuwrutziUW`strrsv{~sc^``ffd߮nrwpgdto_UYr{vthZVWV[`aaVLLKKKJHFINOGWjMT{eJVmndca]XUUVVSQQQQRQPYo}zgYQLPRO[e\MGJXimiee[GDLONNNNMQE@woh\MBDMPOPTSQPOMKHHHEEFFHPWVSRPNKJMLJIJJJKKJHIF>@NNCFMLJGDBABBCB??CLRPLHFHHHHILOQQONLKKJIHGHGIKNUZYXYTPNMLKJJIIJJIIHFDEEEEDDE@DI@ESabROOONLIKLLKKLLLLRPMNMOIAAEDDFKNORPYejjc\ZXSTTTPJFGHFEDAH]li\USRPONLKKLMM|MPhUMPU[[\^^^[VTSTTUWVXQIGKPRPOOMMOOOONMMMKKJO\SGHMNNMJHIIJLKMMMKKJHHJKLLLKIIIIJKINIGa~wdXROMMLKRb`SRUPOMMNOOONKJNV]dedhpkXFEIJORQOQPOOOMLEGYWQHIILNMNNMMONNMKQ]\VWYXXWUTMT^IBHe^H<@B@====<<>@CDDDEFFFEDDB@>>>??AA??@ABBA@>=>>?>=Nddb_\_ggeeddcec_`cfedde_F:?==;::::999889889:<>>>>?<;;8:@@9778:;=?@A@@=;;<=<<<===>=95:;9:<=>==936:;:99;=<=>==;;::998887779:;;===<;;;;<:889:;8?G<8;9885434343333246777766666779988667857:97534789;;?:9>>=;;;<8212349C?AYnrokikqX4777:<=;625=A:57>>43466668::;===>?;42454421465664346;:55789;<=;8777778:;88@A?>>>>=;99;=>@DHHFHOQKCA><<<::;:9789::;;::<=<;;96756658>FD>=9899:::9999999;:998788878:::::887655544432165434777777786421456;;0FwsO2285456667767624J]YL>665443/*),---...//012/-..3983/.,+6HA4555>HJLI<5@K@5(6W^iv|r^A+--/-+2?@5-,:FE<341*)*.357:73/.153..121.+-/15;<:72-,,/12/+)13+)*/=D?6-'(.1.*0CK;,)))+04?JWQLA=3+&&))--7<4-+,,-079-6@*1,(230171+-1,+09.O|Z2/0//..-,)()*-39<>;50.48E[V<-+*()++**+(%172.9736I?32/-*+-4;BHE<95+#@e`H:]~^3$+-(&(,/12/,,.../12220,+-/.07;70-/1/./.07<;;50+*,-/2335699:<:6682-2;>>KTL98Xlb_`[PBAD=;C?7:A?7?^rdD7>?:IH*,21/4=:,('()&'-29ACDEGE@==7AQSLEQYLA=4-.//-+.8>5(&-1232..]^acbb`__^_^_`_abbdfefghhiklmnnnoppqrrqqrstvuuuuutssqpnmljigfcbaa`___`aaa``````bcdegijifeda`_____]\[\\[[[[YYXVVVXZ[]`dgjmnorttuttsstttuurjaZUTUXXXWVUSQQW`fhkjWJLLLOSUWWXXXYYXXXXYZZZVPOLLR^r}n`SOQSTWXWSONRetnrwnnojhhgda\ZZ^egjl_QYmtw~z_\p{xznVT\\Walmqogbcdehilowzw~wnt{{o^\Z]XPX_^]\\\ZYXWXWVVUSX[Uan]_^Z_flw{~wnfacegdUP^wnhlljhimpqopqlg``dgg_gppuyuwwtno|uswvo[chhacqqglob^aail^ըkotieimov}xdUO\kuxj\b^\nmWRc\LLLMMMMNMLL]bJZlZ\qskhffbYUUUSSQQPPQQQTd~~gVNNRO^p\GIMKJ^okjhSDR\UROOOMI8lfBMKNRY^`]XUUTQMKIGHGEEHIIILSVRNMMLMMJIIJKLJGFIHCAGNHDHJKKMLFBBCC@@DKONJGIKJHIEBIPQPNLKJJJHGHHHFBIZda[XVTSQOLLKJKLLMJHFEDDDDDFCYidSQV[SMMMMMJPRIIILMMQXRJNNdYCAFEDJW[ZZW`lpmigca\`mvreVMJJG5JsFWfolbXTQPOLKLLNR|WqcdMFPY[]^``]WSTVVWXYVLGFIMOPOMMONNOONMMLKKJIVZKGNQPOMKJJKKKMMLKKJHGGIJJLJIHHIIKJJHBI\nzfUNKJJLMT[``OINMLMMNOOMJJJRY_a_^dlj]LFFLSRQONMONNQG?ȼsWYNHHHHIJJJIKKMKIHOXZX\_]_^[WW\PGHFLH<>@@>>>=>>>@BEEFEFGHGHFDB@@?>?@AAAABABED@><>>>=;Offfcbeheccbdefc^^chgeeaS@=A><:;:;:9;;::;:99:<@??@A?>;:7=<97788:<=>??><;<<<<<===?>?=<><;=<=<<;968:99:::<<=>??=;<;98877788:;<=????>=<=@FD?>=<<<;;::999::8?E97;8765423431133456667777666778877778888987644578998=AB?;;9899<=@DEDDBBAA@@@?=<<=9423346=AAPnunigmmI4996988832577525<<4566666768:<>=>?;53445421466654345:;65779;>>:8655789;>;9=@>>>>=;988;<=@GIHIJIC<89;=>?>??=;765558:99;::9:955555668<;78899::::999999:;:886677678::::98866655443440/244589987777753125:BA0(KzyuT008445656665431:See^QFC<52-)*,--.../0/00/+)*+-3740/..2:80119LVSMD7>PF21,2P^fu}uP1,*.44,,;=0'+9A@=776202:=731000./32..///--179:;<;:6//02221/-00+)*0AD8-)'*02.)-?B1&*374-<>AABFD8.*4A=3110137:<;:8:=<=?>97,073/4:6.---,,6>@ISOLOTRI@CAHQJ<9NWJA<3*)-/01/9LE/'*.144/+[\]`a`_^^^^^^__acdefgghhhikmnopopqrsrrsrsttuuuuuvvvtrrqonlkigdcbaa`_`aabbbccca`aaabceggeed``_^___^]]]]\[[[ZZZYYZ[[\]`cfiknqstuuuttutttuuvtof]VRTY\ZXVTTUW^dfhkeWQPNQRTWXZZYZXXZZ[[]^^^XQOPOQ^nw}xkaWRSY__\ZXS_sootjfjkmomjfaXTY__^ehcgu|qhx~~yiXZj[N]adorjfggfeeiyxnw{sz~}j[X[VY]\\]\ZZXXWUVVVZ`b\Y]^]]\XTWbgiou{}gbfgb\^Zdvklmkjoqrssrmfdcbdglpgmtppsssw|xom|sq{cTbaZdrjadedafnszg˞grr_jrmlklste[_abcfjltnc\RIF[lTHQOMMLKLKJPQNUeqrppmkiloh\UTQQRQPQQRQQfoXOOKVykHHLNKEPcfk`FLgm`SMOPJ?erMX___`_][YVTSQMKJIHHGEFJLGCKTTRQOMLLLLJHJKJJFDJLHC@FMHBFLQXYPHEFEAADGIIHGGHIGEABCJPOLKJIIGGFFEEECAJ]g`YVUVTTPOOMLMMMLJIHBBBDFEGilTRQNKLLLLSVQHHLKPPPWXKIM_aOGHJJOY]\[[^addcb^^ber|}wm_MQQ>fUPU`imi\TQPOMMMNOR[aTmjPFKTW[]^^\XUVXYZY^SFEGGKOOONNOOOOOMLLKJJKIM]RHMSSPOMLJKLLLLKJMJMHFHIIIIIHIIJKKHGGEEQcjaTJJLKLQVVTXVONMKKMNNNNLMMOTZ]]^_cimdSCBLQQPNNMLMSPFWĺRMKHIHGGFHHHGGFHHGFHMW\``^\\WUTQEDAC==@@@?@@>=>>?@BCCDEFFGGGFDAABA>?@@AABCCBDD@=<=<=<9Jafefgijgdaacccb]]bhfdi_@>AA>;:;;;;;;;::;:98:>=567787889:;=?><;;<<<;====?>?>===<><==<<;:;::;<<<<<<=?><;<<9778:::<<>@@A@AA?==>BGE>>?>=;:9:8989::7AMECH@<99888679;ACCDDBBCBBA>>=<=942333569:Ggyshfl]94;9578864233322364356655554358>=?>:755554434566655437<;669:964249:;=?@>??>?>><::88::=;:97437:778887765556666676567998889999899999866777677988998866654555431/035689876665555106:@>6.,P|}}|T2374455556656626I]hc]]L5,)(*,-./001321/,++,./38411110000/0AUXPB8>PM8,/33I]et~yN21,298/+35.(+./.0135238<:3-*()/1.,++++**+-15:>=<:86203311223.**((2CA4,)'*13,*3?;/07AF>7FN\I2**04,$%*).-453/)141+2;5'2K6H=*,/25--*+0-,'$+>,**,.//.*(**++++.0140.24=IF=>:2*),-/475D^T5:A>;><@3&)--1>5)++,.8>EHB@IZM6jR--.--33-,//01321/02245442342.3;9201..0/,2<><:8653BCJQOFAJTTZcb\\dmaJLQF=<=<830048=HF409:7B6'%'((*,130251/..-,8FGISQGBISRB49BLL8(0CH<564,+021215BH7%)540//,Z[[\^^^^^^^^___bdefghhhiijknopqqqrsutsssstttvvvwxwvvtsrqpmkigfdcba__`abcdddecba`_^``aceeeca`_^_^^_^^^]][[ZZZZZ[]]]\]`befinstssrponptuuvxzyywrk^WVWXWVUUVWZ\^`ckg^YTSRSVXZ[[ZYZ\]]^^`bd`VOOQQORX[bjg]TRW]_]]][[a`^_[Y_eimnmmke]ZYZ\]`fkijrv{~ww~|ywvuxr\QilSOQR\ehigggfdgnlber}|y~rcWY]\\\]\ZYXWVUVWW[_]YYYZ\ZYWUURQRVc~kcfdbbaWSgszxnlnknvwxxznigecdfim~{{m}upqsqpsxwvuvonxxTWXdsd[ca`_^`fkrg{۷}j|w\]hnjnrohaVXjsw~tmgfYDCLKGbfIKNMKJIJJHFKSThx]akotvrm_UTRQRRRSTTRQomXRMLn}RCOKKJGJUbfUN_llbTEIOEXjRkmifa^ZURRQRQMKJJJIHFFFKLFL]\STUQMKLLKIIJKKKGBHNKE?BNLADLQWXVTROIA?BEFFFGIJJH@BG?CNNLLKIFFGFFEEFHFDN^c[TQRSVVSQMMNNLLKMLGEDDDEAMrbWPKJJLKKKTVNIEIMJQQLWQJSQNMKLMORSUVXZ\`ca^[[]_emj`\\ZOPWTTWZ\_gg^TPQPOOOOOPFJNOY{WEGJQW\__[WTUYYXUWLCEGFINPNNNPPOOOMKLMLLMKHWXJLTSPQOLJJLLKLLLMJTOIHIIHIIHIIJKKIGFHDESbd[LGLMNSXXPOTTPLKKKMMNNNOOMMRZ\\]_bekhT?>JRRPNMMNQSLOaFIFGGFGGFGFFFFEEFEEBGU_aa`^]TRIC@@BBBA@??@@@>=>@@BB@@CEDFFGIHDBCDB??ABCCCCECCC@=<<<<:9F]edeehllgcba_____`d`]h]:>@BA?<;;:;;:9999999:;=@AAA@=?<755688889:;<=<::;;;;;??????>?>===>=>==<;<<<<<===;<<<>>=;::978;>?>?@ABBBBBB@>=>CGE?>@A>;99888889;7E`a^_XWcr~zl[LB:643335655666677688656787898875545654348;988888679>@BCBBA>>=<=:4344344536PtyhhgI/377899876444432212346555432236==?>:765666665466776423:<65:;<>>94336;>>>?A?>>??>>=<<:9::?GLKE=525998::;>@@=;<>>:77:;9878975355556666776687766777788999988666776678889998767665556443225677875566435;837+#52D;&%)+-+,-2:0)'(*+++*-0330*(*042+',340,/589856<:3*(-.-2?DVqJ4279AB:-)*-,*3;7:L7((?WUJLJI[T:73110-08@:-@<<6,**)''(+,-22-+++).DMHMSE75:FJ:+-6?:(%/9;4-01024432201=8&$06641,Z[\]^_^_`_^^__`ceeeggghiijmnoprrrsuvuttsssstuuvwwtqssrqqpnlkhgfcba___`bcddefedccb````acddca`_^^^_^^^]]\\[[ZZZYZ\]]\]`acehkllkjigfehottty|}}}}{ukaXUUUUUWXXXY[_hme\XXVUVXZ\^`a_^_^_aehfd_YURQRPMMNRVVSRSTVVVVWVQPPOORX^`clpooolf`[WVW\cggecekiiv}zwssuvl_iubNOPOS^`_dgfbbgigkfiz||elueZ\]\[[[ZYXXWVUVX\_\ZYX[ZYXVSRRTQRbhdfeeb]UQMWimmponu{txzjhheddhkozoDcyopsuqmmsxvnt}tfp]RXdkXRWUUPSRQPQVQOWu~qc`X^ljkrpeVLMSYevdYMHHJMEIlfEKNLKIIKOLIOQVtbV`euwbZWTSRRQRTTTSRQljTPKVnaFLMKKKIFOaWObhfe\OKLFSmdUX_de_XUUTUTOMOPOMKJIHFHIJKO\faZXTQNKLMJHJLMMKHCDKLHECGLEEKMOPPUYZRF?@ABEELTWRKDEEBACJMJIHFGGGGHHHHIHITa_VQORTVUSPNNNNMKMLMLJHFG=?WRQTOMKKGNIMNOMIHEKISYKQRNNMMLMNMMNNQTVXZ_a^ZXY\^baYRKNRTXX`\WYffhg_WSRQPPPOOOPNPU_okPEFHLT]a`\WUUY\WOKIEFFGIMNMNNPPOOMLLMMMMMLHO[QKSSQQPNKJKLMLLMOKSQKFIHFGGHHIJJJJGFHIEMbniXIHLPTWUPNOSSNMLJLLNNNPNLIHSZYZ\^_ako[@?OSQNMMOPQOLOyþVEBBCDCDEEFGFEFFEEEECBER^ab`\TJFBDCBB@@@@??@@?=?@BDFA>@DGGHHIKIFDDDBA@BCCCCCFEBA?><<<<:7F]ecbbhpnhcb_^]]_a`b\Zf_>?@BEEB=;<<;:9:::::9:;>@AAA@>>:86568887889;;:;;;;:9;?A?@@@?>======>==<<<<<><===<<<<<<<;;;;;@CFC?@@B>;:989:9::;8Hfhaa^`iuvlea]VOOKB92123455566666667789988775545665657:9899988;=@BC@969=>???>>=<=:534445665/;_pji[6/258<<9899755543223234555322235:<>=9875666776666677642698579=?<7456;>@@A?==>==>>?>>><:9:CHGD>7457876899;>?=<<=>=;;<;<:88974445456666776765556666556766887656666678888899887777778766446645776787444A=069:@=4,3bvxyU.-54456666554108JbmR1-.('(*.0123343212476443464//110130.<[hJ5IK3-3644-2LasrF01054432/11-('('&&)366420--/5==6442-,062+*'&4HF90*-33498460-454722720/,*,24368622@HB9//HL@,)+*).73/.)(8;)&Cl]3)**1:1%%.:3''*-../06<0&(),,,+,04640..04676-(-2/+0=@7/.3896*(--.1BOkl<1(1;?62**+(%3HC;hM0-/FL4.24CIAtC(*)+6=>??<987530.-/340/.-*)+-/010/00-.139=832/033/,-20/J\VWSF<7413?MTXSHC?AQWPLKI_obYUQRF9?B=955@MOLF808BDD>631/*()*+,,.5<>:5.*))5GIJTN=:=;6640./1/()*.698620244455,*3:/-:LUI9-[\^__```a`````adeefgggghjlnopqstttvwwvutsrssqqqonliiknooponmkigdca`__`abceghgggfedbaabbcddaba`__`_^_^^]]\[[ZYXYZZ\\]_`adfecbbbbbbbcfjklprssusoqnic[WUUUVXXXXY]^_]XWYZXWXY]djh_\_bdegfeedb^WSSSRPONNPQQQOOOPQQRPOPPQRUYZY_koopssplg_[[^aa^[XWV\p}|yy{~~urugTSWSU\]XZchfdfhhkpgidOHNhzm\\]]]\[YXZ[[ZXY_cc^YXYXXVUSSVURTfgefhfaVUUP]khkrssvtq{qeffdcdjosmiumTLvyRUft|}~zssrsvzzsmoruvssyyqqaW`YUVSQOOQRRQPNPQQMHPjspf`eflsps|hVTRPQPKTqeMKKJJIJJBWvaJMOKJJLNNHGKO_~waYN]eTQSRRRRRRSSSSRNcmSMN\]LKMMLMMKJQXPXfbab^KVWPea]_][_[POSVWVTQPPTUOKJHFGKLIJU\Z[[XTPNMLLLIGILLKHFEGJIFDAHLGIKLNMMPUUOIDABBGQWXSMKGDEBCHIGGFEEFFEFHHHHGGN_b\XUQQRSSQOMPQNLMMMLMJOLEJRTSNMMIMUQKHOOLIHKMOSVQRRNOONLKLJJKKMQTVX[][YXWY[YRORQOPWa]eq`W[ecdijh]TQQPOONOOOPYi~rLDGIIR]a`\VTUZa[MIJIHHIJMMNOOPQOOMLLNMLLLJHGUXMPTSSRPMJKKMLKMPOTNE>DFEEFGHHIIIIHHHHFGVmun^OJPUSPMMMORPNKILLQPMQNNLDGPVWZ[\^anu]FGLQPNNNNOPPFPy=HFSQPPMJHHIFFFFEFFEDEFN\aa\PFCBACBAA@@?>?>?==>?ADFD>;?DGHIIJLKHGDEDBBCCDDDCFF@?>><<<<<7?Zifabjrnhcb_^]]\]_b`_f`<;:;<;;::9:;=@BA??>=<9768:;88779;;;;;;;:99:<<:9;<=<<<<==>>>>>>>>>>>==<;;<<;:;;;<=>@CDEEDEEFHIE@@@ABCCA@ABB@=<;9;;:;::8Jcb\\Z`lqutj``addguyfO@8654566666666778:;:8886655688989:9:9999;?A@@@A:4588;;<=?><><64445556400BaofK,13479877<><9756521344444444443568==987777876677666896216:779>@<657:???@@><=><:;?A??@=978?@??;66875445666899;;==<<====:8543345455446677656765544543434555553344555676788888878999::999887668:<<;96659824617<81'@upwyT114355565425<@?>Vs[*(53,),/2444443446:><96348835643332*.We=9I6+1122224AZs{g=*/29645622/,*)**+++.8<9650.26894231..01/)('(7JB3++033:>??6.+588>>3/1320..18;85325DF7+$*?E3*+'&',51.,)0B4(%.`F.*,+)-.*&/82+++0/..0671)()-.--/3221/034457;8,(+..3>B91269::/--151:P~W3&2@A92-*'&(0?C;3cn:,0)/;0$"!&-;T791((?J<:>967876579>@85640./2221/./10-068:8553.0230,'%$.Rhc]WQ:(*0=LVYZSF@;>R[WURN^lc\SHIH@BF>55>HLIA6/8KPPPA1/.,)))*,-19@?937@:87?DLJFHJKKKJLOONKGFEGORSOMJGFEEILIFFFFEEFFEFHHFFFJWac`XSQPQQPPMMRQMMMLLLKOONNMQPKKLIOlYLONMLKKLNOMNPQPNNNMLKJHHJJGHILNRTVVUTTTRQRPMLQYb]fdZYTNO\hnf]XSQQONQRRTd{~SDJKHP^cc_XUTZ`UKKLJHIJKMMMOOQRPOMKJKKJIIHIFLVNNTUUTSPJIKNMMOPOSTF8@ECDEGGHIIHHHHHHGFJYlvymVOSSNKKLMOOMKIJLPPMONMLGADMTY\]]]anoZIIPRPPPOONMEDsĿVEUgvme`XRLHIFFFEEEFDFGGM\`YPD@@@@BB@@@@A@A@?>?>>ADEA>==CFGIJKNOKIGEECDDDEFFDFGC><<<<<<=::Ngicfmomieb_]]^Y[]ab_bX<;<====;:9::<@BA@>??=<99;=>=::99:;;<;::9877776579;;<;;<=>>>>>>>>>>>==<;;<;;::;;<<>@CDFEFFGGIIC@ABBBCB?@ABA@><<9<<:<;:;K^b\WU^lpngda`bbdjv~pbM<6356997566668779::98565589:::::9:999;>BB@>@A>956778::=>>?>943335665426Wq_=-566555558@BA<78532344444444544546;<988888886777557998505;<:;>?:779;=???>>>=:98;@A?@@=857889==989855554455469;===<>>>=<842345555555677666665543443321333344322454465578888888999;;;<==;:;<<<>?>=<;;53565446:;7+6kv{D)454557755?GG?2DfU-+8<5./1355556566:BFB<747:856766554,-DD+3=--22136928VrsO-,16>9777542.--///1.-69631,(+1353010.--,+(&&'2>4*,1632=B<;0()29>@=4013321138:63119F>/+,3:50,-'&1;7+)$)9=.()*D<862,**)(+4<;5/.-+*+360)((,02//02.+-//23446893*)-037974469;=740380,Bm>*)AB90,)&$)8D>533<;83/02430-)'":s2074.+:UVKIA3-.1455>HKB>>83352123.-.1..36576684///.++,*&-D]da^Z?"$7HOPOKGED?BS^^^__bjfWLJKLOPE637;=>6($.I_^YUL@:1,++*+,)9LF72,-EKE@<43675+&*,+,2521=DGGC@=6,)('*7N`^B68:-%)&'^_a```aabbbaa`acddfjifgijkmprtuwxxzzyxxtrrolkihijiiijjklkkjhggfdcca`accegffgffecbaaabbceffedbbca``___^]]^_abaa`_^^______``acdccbbbab`^\ZYXXWWXX[\\`dc]ZYXXY[]]_\XYYWVWXXY]a\QT_hfa_`bfigcabb[SRRQQQQQQQRQQQPQRRRQQSRQQRSRPS\dejswtuwyupmkkjmnr~}|~|zzyutrf[XX\bdc^_mriejqobft[LQM\x{g]^^]]YUP\icYZ^a_ZXXWVVUTSSTTTSN|cgmne_[ZXT[psjltvywha`^_^fnssd]\QYtnQX[XWVVUUVTVbnnrzzz}|z{y|yxvtqxsVRPORSQQRSSQQQPPPQQKJcqb[nvloZYborVQPNLLOQRQLKKKIIIIGGFCVfYLLLLJJJJKLMKRYYTOUUTXWRQSQQRRSSSSNLkbNV^[QONMMMMORSSO[hb_bXMrdKQNdf]VRMTdffg]TSW[URRMHGDFLHFVWJLQWXXUPNORMHN^c[QMMONMQPFBB@JNFGGIJIIKIJKIGIGDHNOOLJGGIHHLKHFGFFEGHFFHGGHIILVa`ZUSPOOOPNKQUOKLLLLNKOUPMNLKKKKPZTMQPMLLKMPPQPPPNNMMMLLJHLOKEBBBBFGLSSSTOOTTNMPSVX[jsU_\YTNIJNW__[SSRPNHKITi{RHJMGM_deaYUTXWNJJJHHJJKLLMOOPQQOLIJIKJIHHIJLSNNSUWVVTLJLNNNOOLDRS=:CBCEGIHIJHHIHHGHIHKTcqrUMPMJKJLUUNJHHJOPMONKIFCADLU[]\\\^eeWLKSSQPOOKIDFi·<]hkm_USNKHHHFGFEEEFDFHIR_WKFBBA?@BAABB@AB>9@F@>=BGBCGG@CHIIIKPSOKGEECDDEEGFDEHF@==<<;<=<9?Uddfjklic_^\]^\]^`\_`H?ABBCCBBA?<=>>???=<;::;>A@@????=;<=???>>;;:;;<;<;::9988878:99:99:;===>>>>>>>>==<:::;:9:::<=>AEFFFHHIGFCAAAAACEB?AAA@?><<;<<<<=@DM[b^TQ^lqmd^^^_bfkopolliYI@4-.257766778975898767668:;::::998:;=@CB@?ABB=85677889<>>>=74435888:::Tp[<9:87777543<<>=977:;=>>>=<:86679=?>>=<8686559<;99988976652236:>??=>>=>?;96677665555666655445445434433233233433554445578888779989;;;;==<=>?@?>=<>?@A;553039<:98//S|W+1745589835Qqi;$039?8665553115:96641484,,*),0451/00-+,+**('(+-,(*2511>E@9-$'+6EB4/34323348<=9757=?618<:71-+)'2FE5.)$1A.'(,,+00//./1,(+6;?<5440.-89.$&,.132120-*-0211444444.)),./.,.2368=<6355.*7I0'6S;.*%&1-06;53450495.17:78863,9_J1343512Trhc^D,',//16BME=;5342--0/,,./,.///2466441.,(-9:1/25-3G^kkaSIFH>5)'+/03EPQN@46=CD>;8<8,(+**3=>=><=B@832563,'(/=Q[Q:-./0220,*`aaaabbbbbcccccfghiijkihiknqruvyzz{|{zyusroljhhhiiijjjihfedcccdcccbbbceggfec``_^__`abbcfhhhfeeecbbba`__``aceeddb_^_____`aacdddddccbdec_[YXXWWY[_`^`dedb^ZY[]^`cccb^XWYYYZ\\XTYej^WajkkkjjhghfZRRSQQQRRQRRQPPOPQQQRSSQQRRSRPQX[Zdrwsrxwtrromortvwyz|}{{|{{{ulc]ZZ^_`bbgkhhkia`p~nMRUSavqb^^^]YUQLNYZX\_^[XXXWVUUUUVTURMz{cgnkb^[XVUeuuqpqv}|wzod```abgntte_dXhvbglf`]^aa`^\bouwwwwxuv~|urx|rshQRSUTSSSSRRPPPPOPPPOKdkMMKKV_ZRTUf{}iVQOPONOPSSPNMJJJIIHFHIDMUXLGIJKIKLLLRSNMPRTVVXVSQRRRSSSRRQQLXxz[PYYSOONMLMMOQQSQXghaeOfQGMRce[SQRf|eY`][XUTSSRLHGGHMLHORUVV\YRSRMS]ZPQ]lrjYRSW]ikaVGAHJJKJKJIJJHHNPLJH@DJMNLJIINKFGJGFGGFFGGHHGGHIHHHJSZZVSONNOOOLNRTMJMMNOMNQNMLJKLMMPRMNPPNMNMNPNMNONMLKKKJKIJQTNGCDACEDGORRRNQUQOQSTTQNWTTWXXVTQJFIQSQPQPNQVQBBFLzpOGIKHFYeebXUWWNJIJJIKJJKKLNOOPRQOLKJLQRMJHILNQPPRUWVVVPLLMNMNNJ@CQK9;?ING>??IL@FLKEGKLJKLPTSMIGDCCDEFGFDEGHC==<<<<=<;9CUcgeikg_]\\]__^^^\d\>ABBBBAAAA?>=>@AA@?<;:9;=@@????@>;=@A@@?>;;<<===>=<<;;;;;;;<;:999;<=>>=>>>>>??><:99::::9:<>@ACFFGHHIHFB@?AA=?====?>>?AFKQXWQP_mojb\Y[_flookfb`ZSNJGB=93156679:;<88899:;:779;:9:8898:=>ABB@?ACB?;7478779:;<=<:::99;;;?@=NlX9?;:88975558=BB<522335554554478999:<==;:9866565554568:<8446;<>>=978:<<<<<;9657778;==<<;;:;9536;<;;;;==98642115;?@?=>>>AA@?<987644444425524777566445454233234676434445567777677789:;;<<<<=>>??>==>@CBB@;6235794340@d{{pB/4657789;@<1,.3DE,,88422345555664?@50,/51/24627=733/+)).2660,-,.4<<74Hmc4+32<9323353./9@><@B?7169-+1763541//..+,+*,-./*%&')-/-1>GF;3320/1./,?j4)(%*C>40+.3243420-2=><<<:;62>91575771Elwo`?(&,./018D=43132.++,,,,...0/014414<>5-+(/>?60-,);U]G29?;UcG8A@BB@>HRSNIJF3$%+7KVKB@=<82112/-./.175383,3;A@<82.,baaaabbbbbcddeekmidcimlhhknqsux{|{|}|{zvtrnljhhhiijjijhfcba`acccbbccccdegeb_]^^^_`aabcdgijkjhffeccefggdb`acdddeb_^^_````aacddddeedcaced`[YYYXY[^aabcefgfb_^][_bbcb^YYYZZ[[[ZZ]dbYW_gijklnnmmnhYRTTSSSSRRSRQQPQRQQRSSQQRRSTTQQSSU^feacnvvurnpssomosuuvwz|~{qjb_^_a`abdlpso``ix~TPTPVgpe___]XSPOUYYXZ]\ZYXXWVVUUWXVVUS}ubglib_ZUUfywtwwupvofsd__cjlihouvd^hb`sujjrsb_ecb`ZYkvwvxvttwy~|rsx{ʼ`QXZ[[[ZYYYWYXTSRSSQSfveRUWVX]`b_]W[tq^UQOQQOONPQPOMKJKIHHGGIE@JVOGJLJIJKLORUTRSSSVVWUSRSSSSSSRQQRPQcl]ZYTQONMMKKLNNQSQWfhb][yFPPW_\SOQVclZSYZYWTTUURNQUWRNNIDKXZSPOPQQMOY`bZSXfqh[VX[emjbUKHFIR[YQNMLKKWdYKJIFHJLKJIKMGBFHFFFGGGHIIHHHHHHJJKOSVVSPONNNOMKPWSLLLMNMLLLLLKLLMNOOHKNNMNOOOOONMMMMLKKJKLEHQSMFDFEEKRQQRQPQHCJOKHMTQIUTRPTUTSQOMKKKMNNOJVxaI>91AOGEEDSRKei_WTXXLGHIIILLJJKLMNNORROLLKQWYRKGIKOQRRRTWVWXWRKLMMMLKJCEE=HBCFHFEEFFFFGEFCCEEDDEFEEDCDB??EJIGJKEAAHatYCF?BRFAEFFGIKJJLMOSSNJHDCCDDFGFFEHKC=<=<<<=;;::C\gchlf^]^]__`^\[jbF=ABBA@?@?>=>?>@AA@?>;:::;>?>?@@@@=?@A@@??<;=>>==>=<=<<<<<<<=<:9:;=>>?>>>==>???>=<;;<<<;;<@DCDEEEGGGGECA@>?>;9DD>AA?@@???@@CCB@?>;9:;;<;889:9998899;??@AA@?@BBA<85777799:;<;::;<<;=>AD>HdU;@>:8998765317?>7343344666565789999:<=;98644543454468;><5458;>>=977:<;;::977789:;<===89?A@<:9:==<==>>>;864315:?@@=<==?ABB@>;855433357;:48>AA@><9666654334435676555445546786666689:<<<=<;<==>>>>=>BDCEGFHA62441264<[uxv{g@2556756;<8,(1,/8.'-1222345556779<2/76;>6334656>C?2***,1/260+---8<;93>f^2-3151/13450(/=>26CHG=/190/587421/.-,,+*)*+-46.&'()*+,0=HD6..1-(17+).20169>EFA=>8252:AA=640+();B3.22./8>?<:5+*28<60570*+,2-,.,,0277993-/035860.02231.06;=;2*(***+-1.+*,0=CE=321123451D~B'%%7N@0,),.011210.5EFBA=::725206867?A=^lA+''+.018<>;5542000-,-/--0442369505>>81**19:8420+3EL;1759EMU][PME=97MgoqX6/7CPI5-7JQG?KK78NJEZnpbLEOYXVRC200014KS@CCBDYe]URUS<%%+8@=95238:>;9;=?>@@@AA?=<;::<<=@BBA@??@???>?>==>>====<=<<;;;;;<<;;<;>?@@?>>==>???>==<=>==;<>ACDCDEEEEEDCB@@><;::::@??@@@>@ACB>967788999;<;;:<==;;<>CADUPB?=999997653/0:>9554346666777999899:<<:86544434456568><977:<<;:;98768:<===<;8:?@??@A?=<<>>?>>:76534:?@@?<<;;<>??>=<97754356:CFEKKIIIHEA>><965666654555566544445786566788:<<<:;=??>>=?BCEFHKLF=:9426626Plvyux}[6365767<;81-2/-42,,/1234455578:<41CHAB@=9568749JB*&*+/0.170**.3:>><27YT1*)*,/123453./43),6678.,23588520../,***+**)).1.+,,*)+,0=G@.+120-,-,-230158>IE:>>2-48AA953300.0<;,,0-)-7@G@80((3>B6,./+(+051.,''+./35<<6420275.-12122./5>D=1)(,*)+,.2,)*,8FG<410234673QX(%%II1-+(*,-./0/0/8OUNE98882,)08:77@G9JlR()*()*-/:EDAA>6/121../.,-12333794058;;5()277977953672348AHLKP]_T=215AWffE+)17>919C_YVTQIDGKOMGNQMLLLMMMMOPQPSUWWVULJKMSUUUVUUXZYXVRLLMMMKIIJIHJOPOPQG;FHGJIIHJLKKMMNOR^opZMX^VOJQSNNNQOLKFBABBCCCDDEGJOSSRSSW\\TJLQLEDHSTKAGGFHEEEEEEDDDEEDCCCCCBBDABFDEEECDFGE@RhynOD<>AP@>?@??ADDCCFKNQSPJHEBDEEGGGHFC:>>=>=<<;;;;:9B[iloj`_abceghhY=9==>>>>===98;>>=???A@?=<;::::=@CCAA@?>>>?>@?>>?>>======<;;;;;;<;<==>?@@?>>?>>>?>>>>=>?>><=?@CDEDEEEDCCA@@?<889:77976688899:;;::;=;::;AA@>>>=>@?<:87644;AA>;:8:;9:<=<<<<<:5235767BKNMMONMLJGHGB>;8776544546666444555775467768:::=?=<=>?><<>2-NT.&(+01344554100+*+*'%*+*/35963/,,--,***-2/(&((*-//,*++.@I6*-2100,+.1550037?JB9<<7:=>DA9511249:60-,,+-18@FD5,''4AA7+)+((/:?;5/*)()),.04890)*24.+02/01//7@D;/+,-+**)(--*))/8;951/013453]B,&'G:&(*+*+,.//0008\_Q<43671('08876?C7:G8(++()('*1@IFGA4130.,-,)+42,-125622326=8**589::;=<2/./8EHEHH;4H`P1$.68CQ@)%)/67))Tvl\^[D/6EGC>@MRWjlfmdPI[`A07:DP@8<0+269YzwO>>ACJG>???>>?BBA@DJMSVRKGEDDEGGIJHC@;>>>>=<<;;;;:;?Vjoplb^`bcdjsYBBD@@>=>====:8:=<<=>>>==<;:::9<=?BBBA@>===>>@?>>??>====>=<;;<::;;;<<=>???@@@@????>>>>>??>=;>===;97;C75642101467>>?BCCC@<977778879:::9;<;::99@FCCD>998776654310/5;;854556788:::99888899:9786554444578747@@;:<==><968:=@=;==>=;:;;<<<<<<=;::<>@@>>>>=>@><:87755=D@86678:99<=<;;<>;536674229@HQTSSSPNNNNLE<::9768867533334444764458989:869<=>@@?=<==@DCBCCBAEG?8573:]xzwyc=444567>;576;;96540/012345655667504:76653358::752.''+.1.)/7/).38>=><3*JS.-3045445524511,,296-)&(,02540(&*-,+.-,-31)()')/0.-,,*.=C.+5:3.-*+.242100/7=84536BA>EC<94/+-790-//+.357AH@/(&&6C90--3/*5AA:42-)()''''*12-((/40+-1/---09A@5,,//-+***)+*(),-8:2/,-./011YD(.1+9-*10.----.02327b`B.++260*(/8556;:200+*+++))*(%3JJB;440+(**',59/+.013005:9:><859?@==@C9++.8JVPIGB8,0>:-+4;?:0+*.370'",Yq[ahT949::<@?@WpmackaNMZG,-48A>??3/23445AF4(+.//,.1*)9BCA<401371%.BK:$%C]WC6Fgh@>CBGM?>>>>==AFNWYTMFDFGGGILKJ?>?>>>==<<<;<<;;==<<<::<=;<=>>=<<;:::;;=>@@ABBA><<=>>???@@??===>>=<==<;;;;;<<=???A@@A@????>>>>?@??=;<@ABDEFEDCBB@??;9898897799<@BEC?;9<==<;:9;E76642342233578;@ELONIEHR_imonkc\UMD;;::;;<<;;<=<<;;::999:=??@?=<<=@DDCCB@;8777776889:9:;;;:97;EGGE>8676544421011379966756998::::987889999886445651133359>>==>?==<;66:@B>:<>??>>??==<<<<>=:;=>@@>>?@?@A<8556669@A:55458989;;::;<=;9997778756?HKQVWTSRQPOJECA><>=;<:63444344476678;<;:9966:<<>?@?@DFEFFDCCAACC=98752544Rty{lG9523666?<6875322353112235676665794./2551,-28=@=4+(&(,02/)-6.)5:<><;966<:7<51664675015331/6CE>4*(+.02//+'*,**0/-+,,((*),11.-*'',54)*3:3+))+,./.-,+)**+++),64:FD<83-(&)---...-695?K6'''(6?1)).71+;F>520,)*+)*))()(((,22.-143/*(/9B>0(,1,((**++))(),3970-*(((,/08'+1?.-.1433100/035;57dS5/+*/1.,+-/25563-,++**,.132,$,NQ9344,()+(+7;0*/211115=AA@@@@=977:@C?.&4?IWYOJG:2.'$&1=CFE6'+3=D:*#!0^u^a]G966766:88G_ribmq\@;4)'(%$/<:30/0/.**/.(&+1-(-87-0BCDNTKJNNMLQPMJIGGHIIIHFHIHGdi?GED]W\aMEGGGFFHJKJNRPOOONONRTVWXVWXYSJSX[[YYWVTUZ\^\UMHOYZWUSPU\[[VTNPQRJHHHGIMQJJMNMKLLLLMPZTJY}KLMHGMNEACDDCBCCCDECCCA?AINORVZbcXHBBDDGDUU@IHIIHHGDDDBBBBDEDEEEEDBA@A?FRWTPMJFBB><==??DNWZWNGEGIHIPRNJA>B?>>>==<<;<<<<8Mhnqnc``b`cq]<<<:<<;::<<=<:9899:;:;<<=?BBA>:;<>>?@?@@??>=?>>====<;;<;<<=???@A@@A@@@A@@??>@@@?=;=@BBEFEDCA@@>><87888987778@GT^eifge`ZQH?<::;;;<;;<<<<;;;:999999<==<;=>BDDCCCC?:97777666799:9:;:979BIJH?7455322211012247;878669:9:9:::8767788755335663//0136:<>??>=;:<<75??AAAA??=====;;=??@@@?@@@A@9435556>>?>;:;:7444469;;;==;:::99;=?BA@ABEIFCCEDA@??>:51254560Dky_4864466/28887520136642223456676789733444/)+/49:4/))&'-010)+71,::D/,0/'',,-8;3(,10/0049<>?>><;4,((1>B<16HNQY[O?2.21+&'2BHF@1'+8JG/%16Bg~tf]G8779;6//41-Bm{w|gE1))+&%(!)7400/.--+(')*++*(),2994AA225)",7<::<:751*5OT8 #11$!&'dddddeeghebaa`___^^^____```achnrwyzt{t~wkhhgghgfffgggffeddcbccdddddeeedccccddddeghhikhec````adeedc`\]^_abdffghihgfgfedccddddeefghhikkkkjhgfed`]]][[\^abehihjkmqpia\\\[[[\]\\\\]\]\ZalpnpvxxwvutuvsbRRUTVYYWVUVVTSSRRTUTSQPOPSVYZ]c`Z\^]][XYZ[]\YYYUSSUWWWYWX^dktvvtoswifqupa^^_Z[nLQ[\\\]^^_\VWYVgl_]``[achtohnrw{{tjjxwhcfid_dkkknpponkgccdffc]RMUbjgbaaazsxbqpqwxfoa^^alhecZY[anpkmmcdgedddde_XROOQNUrzy}}{p_RNMOPRLbv[YSMTYXUQPLP[b^TNMROLXTKNOPPTUTSRQPUWOMPNOSTSQPPOPONNOPOQQOSWY\][ZWUUTPOIEFECDFGJLMMLKKLMMMNOPOYjgYQPOONNNMOONMMOPQPONNPQQOOONNOMJJJKHGIKJKNPSRORWZ\YTRPOOPRRRRRNJNQMHEFK>?CKKGHJLMONNNQTWYXVUUTVXY\sZNPOONLKJHIIIHHIIJLMNMKMMLMNOOPQPQQQQRRRQQN\djoqsv{y|{l`[USTRMRej^LHLKMLIIJKOKIQQDAWnxnQADLMOMLKJHFGFFGGFFGHHOJDLFERT]_QKLIGEEEHJJLPRQOOPONPTVVWVWXYUJTX\[YYWVUTVWY[YVTRSUWTRPW_`a]ZVOPYPPKIIJOZ\TRNMMMOOOOMJMKS{qRJGGDIOHCEGECBBCCCDCCCA?@DILPTW]cZICEFGLDSMFIHHJJHIFFCBCDDFEEFEEECBA@AABGNOMJGJHDFLoj@B>;ML=@AAAA@@@????>CMV\ZPIGHIHLTRLH?@B??>>==<<;;;;<5Ggopmeb_^`kkTB@BA@@BABB@>=;<<9:8667::999::;9889:=?@@?;<=>>?@>=>>=>???>====<<;<=<<=???@AABABBAA@AA??>@@><;=@BCEFCBA???>=:6688899988=@AA>=>?@C?<;:9<@G76431022334454444465546;BFO[\\]]YSK@=:9:;<<<;;;;<<<;:98889:=<==>@CEDDCCBCA>;86555677899::;:975@@BBBBA?>>==<;87975446667999:;=>??><:8766556568?HNPPRRQQPKD=9=@@CB@B@<853469;;<<<;:<;:<A@2(()+6CA5..0-*+./.-+('%$',13/,.,)()*('(*--/58.+/.--.00-+,*((+7E@4//,)&*46/,046<8,/3+&),-+,..+,.-.;@.(('(),01/**)**++-)&-:>92+,-+.54/0220/...-,,.0101210.--,-./*$,/0326578875346677768<1-2.-22.,,16663-))+,++)).44-+-(/1'(**%),/:@6/,21-+-25645:8432,)*.5?D@BKX_^SKHHHJOOIEB:??>?@>>==<;;:::6@^tuog`\\cjSGGB>>>>@ABAA>;;<=<>>==>=>=<;<<<<=>==>?A?@AABBBB@>?@A?????><;@@=<9:>?@A?==<<@CI775422333444544565643323559CGJLOQSQE;:::;<<<;;;<<=>=<;:::;<==>@ADFECCBABEFD?:8656678889:9988834FVO>44542222211446788::::99:;;;:::876776655557640499659;<>ACCA?95788<>?<9<>@A@???AA?@><<<<<>?@@@@>@BA@@>>;8777::6665444666897899;=>??><:8422466799:BMRSSTSPLJF@@ABDA@AAA?:756679;>?=:769<AADC=;ELFJPLE>:<<973*())'*+*2?B5#.Seaah^@3440-1641/47,/]h>294.9E@/7DC;7:==>CKVabWLHGHMOE=><8;<=@@=>==<;;;;;FJ<<>>>??=>ACCDFEEQcmwqcWLJJJKShrrqlaSJHGGGCEMTRKE?>=;=<;:;;<<<<=>>@@@ABBAABBDC<;<=?@>????=;;:756799:::;>??=<9::=>@@>===>BCG87544333344454445566533344455;B@BKSLC=;<<<<;:;<<<<<<;9:<=====>@CDCBABEGIJJHD?:976778889:9988875@?><;=???>>>??>@AA>99=:89::85444322344587788789;<<<:7311124:>??;7?LPOPSQOOMGBAB@???BEC@>8116:;@@<:54:>=>BEKROC:87652145566534644233-OyoE0875652/1688IWLHFEDA93444456788;8.+1880,/44321110.,+.355.'-87.))**())'')+./0383*-0/56/-441+)*))))')*-..,--,+(')*-02/.1331//6=;4./1,**((),*(+10,)(('))++*))))(&)--,(+4610-(,/-,/.(()*)(***+...47761.033-/3110.-.3554148==854/)'*))/554440*'+22/('065310/00/-+))'),/244579755646650/6=:60+.254/)''',0,(((-1//488306:4-+****.0/8CD<53000,+/2321266668:EJIE@:56>FKMFCDKJC=>;/$$(+*-5;<@FA0&(1132*'(,*'()('''&%(.7;@>:;2((0781++)'eeeddeeecbcdccbbbba`aabbbbbba__abbcdglmgeggedcbdddccddddeeeeddeeddefggghgggggffffghhhikmoookeb``aa```_`cdehjkkkklkjjkihhedeeefffghiijkklmlkkifbbba^]]\YWWXY[\bjmlkjilpk`ZZ[]\\]]^^_`bceehpxyy|xpqssttvyn[RQRRUWWWUTTUTTTTTVVUTTTTTTTUVXYYXWXYZ]bjllllkjigkvso}xgegbenkb`dqxmlwvh`Wr{{|}f]e`[YY_vyspc[ddf_abe`Z^djkklnr~|~}zywwuuxneedca_`bdefhlsphebcip}|}xmgddfiwnq\dnh]_bfklkrnZ^vyuqofZSVuwwzxxvfXY^`a```^YURQPOO\fqubVPNMORrl_ZZfqu{jU^^Y]icTLFGGIIJKIGJMNOPNONNNMNQQOOOOOOOOPRV[][WSPMJPWOGJSXQPUQPQPQPOQQNKFEIIGGHNQPQRWdfQBINKIOX[TRUXZ\]^]URTWYUNKJJLLLLKKJJMORVUSQORUVUQONOOOPQRSTVNMRNLOJPǟVlQIMLONMMQTU]]g|YP^_\V[ZZ`MGJFHIKLKJHHHHIKMMMMNNKJJJLMNPPQRPPOQRQNJFGJLQXirtxnNNPKRdx~gHDFGGJJKNQQOMLLLKSQGb֭]FJJKLLJIIIHGGGGGHHHIKMLKOOFHKLJIIIFDEEGGGGKPP\`XTTTVVVVWXMVUXWWW\dntu~s^LLNS_YTZYWTVVXWVTUUXYXXYXURONTVTRQPOPSV^^VNLRSNLKORJFMQNPQQQQRTPIEBA@BADHJNVZ^VIHLHGIJKJLMNMKIIIHGGGFFFGFDB@BBBCBLVLJNMLNJHLQMHFLpT>=?FKCMMIDBAA@@@>??@@CGP_cYNHFGNM=9:;8::==<<<=>?BCNhri_Z[a_H77CRD:><<==<>O[VOMIKS`glbYRLJIINW_bcb\RMKIIIIKQ[_ZVMBACCEEB>99<=><<>>@ADEFB=>??DKG@<;;>>@@@@?<;<>AABB@@@>;867999:;:;<=<;;;:::=>?@><;<=ABC776233334455533334665344565217>:7>KNPI<=>=<<;=====;:8778:;<==>@B?>CHKPROIGFEC>:98777898:99888843FYN8376312223565778:=<:999:9;;;;;8665565477:<=ACDB@>?>>==?@ACISVPKLUWTUURPMLMLKKHC>:;::@B@A@?=<<<@C@82377889:86654333344666777688:::;86445547@CBDD72>JJIMPPPNJC@A@@?@CECAB;536;=??>=<GI?766545556887546766557-Gz_357643566567=U^MLKHD=73464455788<8+*4:70++3>B@?6.++43-07=828>A<.)()**+02/-+**-45/.2?NM:-461*&&&()*,--,-164.+($$'(+25898530*'-9>;;;8/+++*)*+,,.,,,,,-/00-+*((*,00--27?93../.--,**(&(*****++,../.00257:98640/1210696645?C?:641-))*+-266523/'%&,1/@UP7./,//..--,*)(),.25455555664473*,8<635578631/+')./+)*()1868GOH@II5,-+)*,/,3AE<852-..,.00/0/055444;JKE?83467@LOMKEACHKKH=,&-2/2=@&'((((*.368731890`V$3@83669BE>88@MRLDBA@B8,,+/31/-+))**)''(('%$%'7HJ<15;50122,).56eeeeefedcbbbbcccccbbabcbcbcca```acfgghhhihfedcbcddccccddeeeffeeeddefgghiihhggggggghhhikmoprrnga__```__adegillllmmmkkkiggfdeeffhhiijjkkklmmlmmlida_^]]]][YYYXWZcfffghkpqkfaYWZ\]^^_`acdeehqxwv{xigqssvwxzwhTNSUTWXVVWVUUVVVWWUUUUTTTTTUVUVUUWXXWW^if\Z^_``_pv~xlomhkopttomu{_Yt}xn`ag`]^[dsxvihdacdb`^begaZbknlllkkrz~zrsuwy|uhbeeba_`dedcdfkgfedtsah~rVWnteV]`bdhkwqcjsqrx}~wqfbnssurpuyraXY\^__^\\[VRQPMYb[c}vaTPMJ\gmuyzmssiqz~~bT^^Z[feUMLLKIIIJIGFINLKLMMLMLMPONOOOPRTUVWXWSOJKOKHKMPMLS[TPTSPQQNLNTXYUMIHGHOVYYZY]fbO@FMKHHJPXYUSUZbdb`YTW\]ULKKKJJJKIHILOPRTTSQQRRSRPNLKLLNPSTS[\SQNKMJHoMOEHJNRW\aehqptUJafa]]YVTLFIIGIIIHIHHHIJKMNNNOPJFJOPOOOPOOPPOQROLMXUINGJg~}dLLMYiw}xxOFHGHHIJJKPVRNMKLMJH]ϾyQKONGJJHHHGGFEGGHHIKNONNPMIIKLLLNLGEEDCDFFFJQXUJJRRTUUVWYPRTYWS^n{~z}l\VOMMR\GFIKPXZ[YWUSSSUWWXXWTSX^cd^XTRRSW\^YTPNUVNKLNOJKPSRQQQQRQMJECDBABBFONNNR\[KLMHGIJLLLMNMJIHGGFDEEEFEDB?@DEFEBFNHMPKNHENeXFHGL]B>A?@AJOMGAABAA@@?>>@ADCIZcYNGFHIC:::;8::;?@A>>=<<<=>?A?AYmf][__N:7:9CL9::;?N^aWMJKNV\b\SMIIKNSY[\^b[TOMJGGHNV]]WUPIJMPPRRMA9=A><;=>@CII?99==<@KNJA749>@??@>==;<;:9:::89=??@><;<==@A77602333445553332355533555534;=769AJQTF>==>==???AEEEDB@>===<=@A@AFOSSTQHDCCCDB<:9778899:9877763/;VU;376202235667779>DB;9::99==;;:8886568?@A@@?=<==<<=BGUXQT[]]\XVUVVUTSRK@=87=AA@@@>9537@FA544334569;:86443324444677668999:989:::::;>BABEA54AGEFLPOMJDAA@@?@AB@@?<=;45<@AA@ACCB?:889;865455446866BC54:866659.@uT,64542377667-+,.1/.9>94.**)*//+-AT^R1).//+(*-.///.135740,*)'&'+269851-+)''-49<:60++++*)*,-.012345442-*(((*.7701CQO;,*030.-*('''()***++,/2.++)*046313551/01108=<5.1?C>:7640+'*1799;9542,*'')-SoT3-0*.,,,--,***++,02242./5764462-2;7,,38::7333/,,,/.)'')2;9>YgQARI.,-*)+/)-BFA<;50,-.,/0/.00/34018EMH=73154/6DLSUH>>>AFIMLNHMWbRPMHHIKLMLLMKIHGGGDCDDDEDDDBCDDEEDGFDNSL[ULOLNHGFHFCABAADNOMC?@BAA@?>?@@CFDBP^XNGGKB9999999:88@G>=<<;==>>@@@Qfd[\_WE;9<76IA7<<=?A?<<<>@CFB73<<<:9=FONE<:@?9<=;;;=@@ABCB@=:77889;98=H:;;:999989=?@@?>===:<@56403333344443222357743433228??:98;?GQOC==???ACCFKOQQPNLLKGA@BDFMRVTOIEBACCDEEA<:977789:999876405LT?6;73022356658?BGHC;9:;:;==;;;::876:@HNME?=>=@CBAA@@@>><<;<;?GPXSRWZ_c_^]YVTTRNNM@>?@@?>>>90,3@G?687311258::987653344455675577999989:::9987;=>BA726>ACGPTOG@@A???@@@@@>=>>:45<@@?ABADD?:997666446789=@@SR:=B955657.4iR)7444225665765GXNDB<;<64544667766414984-**-22581.-.37/*5CDFHLK<,.014/08852/+,*%&(),?U]T3).0130......07;8344.,.,**+/3430,***,-,*/31/-+*++*)*,,/57889961.+++**)+160,;QK=><6584/*&$%>I5,03+,***-,+**,+++,./20*(/55455469=4)*-08<84344/)'*,(',29<:BepG9K<*,*(*.+-?KE@C@5.)-0.-././//7<::HQJ=21210-+2=DHJJLPWTLE=1,.121108KQP[W@FS>*-.,,,,-,+,/222234.23,++-/-*/217?HD70.(<<57J7<<=>@>:<>>???>:;<>=;989>EKQQLE@>?A><;;977799985NN9::888888:=8=?5432334334444233238>::=93324:?@=988:>JRLB?@ABCEEGHHJKLNOPOLIGHKRWTOLFCAABCCDFED?<97778889::877534?LF<=7433335667CJJID?:8;;:;<;<==<:9:=CHKIA=<>@BDCAA@?ABA?>==<@LJISTSPOU]cba^ZWVURSQI@=@AAA??<3.2;A;47521113577::9975665444665456779:9:986654457:<<:637>>???@@?>===@=22<>=><<>>:7799766547:;;BTZVI@STF>86786/PN+3555444445547FGC@@CFA73554567554457863.+*))*-111/.,/410>HHMME8/0011.591,,++*+-++/0@Z\D,/7416:9876303=?60463///,+,.0330*'*+-11,-0/-+*))))(*/1125;=733.,/1.*('%)4<94A;1.)-1/-++))*)(()+++,,-0/*()(%%'*&%%&)+-/-*,-**()/47:;<@@2,6>=@DB<21763+*.154.+4<0,,**+,,**-.*),/.01,&(.247768;94/,*/;>855422.*$&)047;>3-,*+,*+BNC@?@;1+*0331010,,2=DCENN<,-7<90,258<;8GV[\VJ6*+/1674/+3DKOWP>??./876765-),--..--,1<4$,3'%**-7<77FSPIFHNTVZb_C7KW;&++((*28>A<4-:WP:56*0PN0)-,/00/,*4:4jkllllkjihfedefeeda```abdddcbba`_______abbbceeffeedddeddghhhgfggghhijjjklkllklljjjiihghijkjiigdb`^]]^_`eilosvvvqkjkkjhffefgggiijjklllmmnnnnooonmmlhdb`^^]^^^^]]^_^__`bejruv|{rg`^\\]]^_`fhghgdgorlemz{xyzz~{fWRSV[\[ZZZZYXWWVVVVUTSVX\]ZTSWYZXVVZcihdekh]VX\YT]hilrwuuwwwxxyvkv}~yqrofbYch[\\]`hjbltlfbb`^^cdeecbid_bknprnkiiiinv{yma]aabeedddcdedaefoszuvw{tsuwtqrjtmeugYa`accfki_Y[ZYZh|Zb_ZTQPT^hidqq[NMf~qzfRUVOKOOOPRQPR_l\GGKIIIIGG[m`RQONLKJLOPQQPOOQRRSWWTOMONPQVi|oGLKNOJJLLMMKHIMGI\qtswuyz^;>SNIHHGHHHHGFLVXSQPRSPMNPRSOMMMMKJJHGGJGEEGMRRRUX[[ZXUQRROMMIHLIJLKKIKJHEAAHHMfx[BDFFBBAB@@@IMNMIEA@@@@@@?ABB@@@;>MRMMI=79::9888;@EJMNOOMKLLKLJMJP^aad\NHJGCDC=FE<;==>?AA@CA=;<><=<:A@@;97348;;@CCCCCCDB@@@?>==<>AEFHOWhhK58AB@>=<>@?>=<;=A=7=HOSULDGKFEA==@BBA>;;;9789886;aB:998777889BKI@868?BB?:99;;COQHAAEHHGGEEDEFGGGGIJKMRVXSKDCBCDBBCBCEEC@<87777667788867767BJA;97543567:CLLKG@;9:=::;:;>?==>?@BDC@??>>??>?@@=ANSKKQOHDHLQWY]_^ZXWTRRLC@CCACA?=7103773432332223678::88887544554335579:;:8544345668;;98645>DJTYL<8:;;=>??>>===<>@848:::997446678756769;;=FYdS:@]cYRH>=>80FH36665444444536>2;HKJJC713455786367993//.-,*)+,2642/,*/2.37/,+*+++*)((*1892*(+-..0001.,*('''(')053+0:7*+.)+;6-,+*((/BQQF5+)%+42.-,,,+*)(*+++,,*+-*'+,(%&+-+$'&%).,*+***)*+,17::98548<;;51.,+)*,,++/10030)),/156446542.*09:665/-56/$&/41038::66753?PX[\WB.++.685/(*:FKOI;877:=>@BB@2()-/0,),++.+.392//+.PL+&0+)'%'+)'(#:XE6693(6??;DIKLMMNONOMMMMLKIN[aedWJHIGGJLNNMB==?>?ACB?<<<=?>AB;;;<==?BGLMLKIHJKFAA@A?>>>=?@BDDFGHLVe^D9?D@>==A?>??@DFB805>?DOYVQOPPNJIEDB><:;=:8898:2M]6:988656788:<>?@ABB<6F@2553343444333233248:;@MSOD@CFFC>:99:;>FNLCAFLMKJHGGGFGGFGHKOUYWOF?=>@BCBBCCCCCA=965666666667879;95;GC;::63268;DJJJGB<<>><;<<:;>@AADKLID@>>>>>@A@A@==>><;;=?===<<==??947988778766786568:<<;:=HVP>CV`^[YPC<57FC684253344333333,FC=923AA63101225ALJ@7355+(++--+(&''().570,,.//../00.,*)))'()',32)/;.'')%.>84661.0/7L_E50*(,210./0.***()*)**+*+-,(-30*$,8;+,+)),--01-**+)&*3861/0116?D@8/((&&2MAbtnkjR59KMJF@9.+)*++,./22231.010..///012.+,./1584+,465/070')*-231.)(,.-,/1,6J<5<:66559=<79>A>6363.22.(-;Qdica^K304557?LSW^_S>+&+3651+(11,1;>9@G[]\bZWSQSUZ^\\VQJCI^WA@EBDJBLVB8AMTNYWHLQOQRPOOONNQOKHGOX]ZTOILMI\rnSUmrd^ba_]][XUQOOQNOQRRSUVasiWVST]fg^XZ^cjlljc[VRT`lrnZSaUDCPPNMMJIGGFEEDDBABBCDDDDECALY^mnu}~cBJPTYPGCDB@@BABRWVNMHBA@@@@@A@<;;==FOQND;:9:99@CDD@>==<=>@A=>BFLNS[hkki_YMTc[K?=B?>?AABCEEFEEDDIPXXQB??>==>>?AADKE<856>B?6JVVRRSUUUSNIA>=;;9877786RF698875456778:=>@BBB=3:;345333323343322433235:EORLGHIC=:98789;>DID@CHNNNLKIJHIKLNMMQTRH@<;=@ABCBCCCCBB?;87567666666788:::68GF=<;64368:AE>:>><;;?GLMLIEA==>>=?@@??@@>=<<;;;:9?KPOHGNLIFGFGNOMIIS[[ZZXUTRKDCCBABB@<54543355553310256::99888644445446669;;:7534686566797556756=ITN?8897668;<==<<>?==96788878:97776568:;<:868BJF?JZ]YY]ZK<79=?7883423433322215COLIID95447789771183-,,./,),12561./64870*)-/.4>=;971.041*&'0AKG@;82.;D820/1336AKF>4/-)%'.9@>0'&'))))*+*-1100/,*-/-,+**+*),)(./.35+./.+.=DKG>0.1.*4F05B<40-02/.-,)(+*'(((((+032+.871,.68,5:40-/253-+*'&'+2420,*)+6CHC9/()(%DfNmxsnphMAKOMMJA9-'+/.001353420010/.-+,.0.+,01/2::30458>=96+&)))+/011/..--0-6LC/5<80179:>>87<><971++33,+9Obfaeh[;&*3568?IMWaaUB6338::72,.2560*.9?=76?HLRI2'-0-+--)()+-.0249;;9994;<;5-(&(035B4!.78:::4/2990)'(/4/5MSSTOLLIEB@AAEOUSNKFA?@A@@AB>:78;??>=DMRPB=>=<;=EJKJHHHGHHIJJJJJIIIIMV^f`JFGGHJLLKKLLKFA@CCDB@?><:9;?AAIQTWXY`monjc^X\ikaL<>>>@BDED;23433=:/9HQSRSTUUSSRNIF?:987752=E:7887764555678;=?BB@91482343323233433146510237=>=<<<==<;=EORNHC?>====>????>???=<;<;::@MROKEHLIFEDBAHOQJDITYZZZZWNFCBBCCEEFFA<97775566542223566899:96655654555579;;96558:75555776446757DSO>9<:7787:<<><>A?;88887888889867778:<:656=HIHA7B[c_\]^YOGA<<:?=5675543332222AQOHB;6556678754343-,.010-+,277410/16;9/**,.-29:<:4./9;0(')2FKA95355@F1+++-248BKD<3.($(*5G?.*),++***(&%+4541.+)*--+))*,--,,+,*-22.1?C=3@U^M6+,.+('+&6RPH=0031.,+*)**)+)''*/4750144555/2)/240/0242-+--,.11121,+*.7BJJ?/)**'8GHyssprtcTPMPKJFD;,(/575456542100010/.//0111367;>9348:?C<;3&%*-,-069750.-,,6JE037<1248:;==869::93*+2645:HX[WY^W<()02579;;@Vb`ZIMQCABA<40000-+0>GA8425>FJC747841*'**,0..26=C@;8:<89CHLQQLQOOZ_[[ZTV`]J5.++()045595058877522255/+')145?Frrsvvvurqpnmmkjihgeedbbbbbbbbccbbaa`aabbbcefeeeefhlswwy{}~~}{wsrpmmmmnprrssrpppnmlkkjjjiihghhikifba`abccddcaelpkdeeeeedfgghklllmmmnnooooppprsrqpmkighjkjlpl]Y\Z\ehikhd_YWXX[ZYZZZZXYYYYYZ[[[\]\]]^^VO]nictziXRTY[YYYYYYYYXVVUUTSU[Z]b^`_]]abacelouodb__cekusikoleup[]]cotpegsyuqrt{xorxtuvtvvvu{}pdbdb``acdffgipmfacvvfdebcdeimu~uswxtz{sorx}uputsvx{zvlutdc``hs}yz}sf^Z]^_ie]t`ilLT\chyjWYiqxuvriha^YVYYXXYXXYY[]^]\\[YXWTTTSROOPPPRRRU\a^\[TMJLNNOPLPi|hNOWYUPOONMMMLKIJJJNQPLLIGEAOswQ?LqjD?CCA@><:9<<=CGKQQQPNNKIHGOWNJMMJKLKJILOMKKJJLOOQRTSSSSUVUUTTUTTTSQNKIIJHJKLOLFFFCCCCDGGFGKMPT\`\WNIJJKLMLJHGHFFFFGFEDEECCDDDGGHHIIIJJKJKKKKKKKKKJJMKIHHKNNmwmpXEGPZpyvwxxxy[RRRTVVWUWHRwsSTPJIECFFFFGGFDFFFOFNt]URV\aUJVX]f`\WSVG;?>=BKTP@>>>>@EIKJHGGGHIIJIJHHHHHHJKS]g[GEGFHIIJIIIIJJFFGEFDB?>>=<<@CIW\_]\\]deecba`aejndL>>BDEDCCEFFC?613:@BNXWIC????BCB@;833654;:6:BEHMQSTUTTTTTRJC=97951DD7777776534456685277113222233333359;9432357;CFB>:53666558<=?@BA@EMPQQRSROKHGFDA@??>>@CGGFFECBCBCC@<87555665778877999;<<<86876578:;===;:;<<<;<==>>AIMMFA@A><<=>@@@@?>?>===<<:=ENPKHFDGGCBA@??BFILEDHQWYZ^UFBCCDDEFFFEDA;7:;777875322233368;;986576555554679::7577865545666546996>@EIIPTWVRNKEH?0*/67544431110002212211243357865007CLC3<4#&*-/.28<763/-)-BE..714?HKFA><;65:85<7/3:;<=AFOTZZSA2/5>;<98707UfdhZ[_JDID7-.0-,-15:<4,+*(1:@>9::=>4%*6.,58:<@GKD;45:;7=RYPLKKIFYh\Z[\djaJ4&'+')24421688:951./0.,/.*')-3>>=@IWH<>?ACGKLKIFDEGHIIJKLKHFJFEHHObbNFDFEFGGHGGIIHIIHGGFFE@???><>CJV\][Z\\^`bcddccdhrzjQCBCCDCCDFFC=5465;?@HZUE>???@@?>87458:;<==>?>>BFFGLQTSTTTTPI?8;9>J?668777553223557:?BA;33851223323333338=>=;73134568988644676559=???@@@FPUVVTNJGB=:;<>=>A@@@EHHFGECBBBBCA;8656666677887899:;>><7664578::;==<::::;;;=?>?BGJIEA@@?>==?@AABB@??><<<<<=CMPLFFFCEE@>>=>@@?@GLFAJVY[`SBADCDDEFFFDCB=9::887887433221127<;855776655554568;;87666665555546777976BK>5:?BDBBB?979864=DA77L_`^````P=;C@8)&,-+)))'&(IZUD30520/-+*(),0/)*284/04420.,***((./,*+39956=A=;:9520-+020,2=D?.)*(),21)&''$'.4@O[QC@>3/1354222/././//121232246541--//+)5MQ4-?C7)&+1235;873//-/60*-1,)1>DEC=:712=?;AD:8?A@@B?=R\SHLJ47KM@;8209Qjlnjc^KDH?/+02.1;AB>9647734=C>4.4==5/?E,,;CFC=ADC<1/5==CAYmS@@CDC@?><;=ACFKLKKLLLLJIIMNNPNKMJJIKKLNNMPUVUTKILLJKJIIIKKKKLMOQRTRQMKJJIJJKLJIIHHIIHIKLQSRVVQOHKNXUKJJJJJJKKJLKJJKIIIGFEEEEDGHEEEFHKLKKJKKKKKJKKKLKLLMLJLLIMmys_BDOcstuwvy~_NPTTUVVUUUVPPRGDKKIGFDBBCEFFFFFHbsnbOXYSxhY^\XRVP:AHOYSEFMOJKNQJFKIEE~eS[ZRQMHFGIIJKLJQZUNNOMKLMKLNLKKLMY^YY[ZZYYVSRQRQQRSTUUTUUTQZbO_jLOSUPHIKKJIIJHHHGFFEEEFFHGFT`TOVUNEDFDDCBCCCEFFEGL\v_Lvpt_S[aHNONIC@@?ABBBBDHLLLFAAA@ABB@@>;<=>=??>>HV>;BEHJKLJIFBBCDEEFFIKJHGGGGGGL`ZIGFHHHGGGGGIIIIIHHGFIGBB?@>>CJMTZ[[[[Z]`aefgfefiq|zn[JECCCBDEDA95668:=ADGRI===;:;;<:9889;<=>?>ADBB@==?EMTVTTUVUK=8A@:5475234332333415@A>><73234544455544775568=@??@@@DOVUQKD@?>;9:=?@CGD@>DIHFFEBBCBBBB=:778777777889::9;=>><97446799;;==<;:::;;;<=>AEFDC@?===?@ABBA@AB@>>==;;<<@FLKGFGECEE@>==?@@>=BHHBEQX]aUEADEDDDFHGEED>865555444331000.05::745666656545568::876666655556678888857EF96=;=>:8877877777668:;;86?HIE>769@CEK:1JYZYZY]WC;@B>=BB?8433430.--/2344235530.10//6A@3+*)()+,+.58864134-+156522/,,.-.//+)(-3,+452044/B9,42-.-,+)+-/01,,-)-2263-*(()*+.-&+=A32=@6,*-/,)*0359<>AA<3*.MS>:0/0--/1.**++'%=ZI3-02/.-,,*)))+--.5@>50.1551-)**+-56+*),4:4,.2037:61/-+./-),684+))(,15CPOG?60*! *><995-.>F;6===BECBA99VaMLYP17PPD:3/2>ENUbslcXMC5+0;64@ILMMIFIONGCIJ>-(293;JVV:1AMQG:78AB0&0>H@@FF@@?DTUFCSZbkR/ &66./10///06:8742/./0,(+0+%&,699;iiihggghiijjiiihhgfeddcbbbbcdddccbbabbbcddeeefeegimpy{ty~}|ywspqtuvvvvuttssrpjehlifghhdb`^_`_^_`abbbccceeffgfgggghhiikllklllkjloppqrsuvuutpkhffghikopsvk^`jmmnqi^etvph`]]]][[ZYYWXZZZ[[]^_^_aaaa\TRTUWY\clooomnzr^VW[^^^^\]][ZXXXX_gdadffgffeda__cfffggihd]VTVYZahfcgkkkjidb^ZY[\]`itxurrrrohbe{zm|pZdhgcca__`gjhct}yr{}|zwvprxvxurqwwyywx~}tyjcaaac_csvvwof`]a_YcqfY\[YRsZ]t{hwrjgefia]a_[XWUTSRW_`]YWVVWVUTQNPTTQOKNWZ_ca^\]`dhffd^XROMLMPRPNNKKNRSOJGIJIKJJLLLLLINLMsADD?UbF=ACCCA>>>?FOPLKIGGIJJJIIJMNLXSINKIGHHHHJLS[]WPIINLJIHHGFGHHHGFGIKMOPOMLJJKJJJJJIHHIIHKPY[YUKJLQTNKTRLJIIJKKLLLLLKJIIJKJHHHFFEGIIDBGJLMLLJKKKKKJLLMNMMLLLKJIJHPn|xYEMe~}ywvz{XNRVUTVVUUTTSJEGFHJIGEDCCCDDEFFECMqgeqRRLzdQXZZRWP@BKNRUPVZ^XPJH??BHH?IrǵmOZ`^YUQNMJIIIHGEGURLMMKKJJKJJJJIHK]a\[[ZXWUTRPQSRRTWZXVVWWUR_bNZo^MTVP@>JKIHIGHIIGFFFFFGHHIFKaUISYWFBDCBAABCDGHIFH^iuK}ockfdjquPNNLGAEHGCB@AADGIKHBAAABCDC@@?>>>>>??@?HN@CJKIHGFECA@@@@@???@CDCDEGKNLHOJIIIIIHGHGGGIIIIIGHGGFECA@@@>IVTSVZ][YWZ_cghihhhkouwvmaSFBDDFC@<53558:=?=DIFDCA@AADKOQUVXYUG;=JC<=978865563334668;>>:756545544333334=D?;>>83324534555554576448=?>=>>>?FLKGB@?>???@BBEHKH>=CHHFFEBBCCBBA?<:9:99997789;=;:;<==;;943688:;;;<==;::;;::>===>=>@BB@?>>?>>>==;;=AKGAIWabZIBEEDDFGHHFGG>51/10111220/////1588656666676554568::876666555456678::8866?@@AABA?;::998666666777:;:79?HIB:89:964245651000/.2AD6,+))(&&+0110-*),21264333641//..0/-*)-226=;50+).?D8<91./,()+++,4;.)).7?;0--*)+,-44++75+5B<.),./1,*155;CEF@5/,*;KD<0,-02353++//-%1S:'+10+,,,-+*))'+.18BF?5-/562/&$((*./+&$&*52//40147732220,)*,/.+**((-22Hjrpnr{v\E9/2FF7861.,,./-+*+-/03420.-+(%'*+*01,)*)5A-"7>HY=$):>4.2320/:>/#&(('))(-;>:<@9./BF2)3@CGHGFB9?`k^OENHLVI@9426<41;YysleQ<-(4@;;EGDJUVMR[XSWVNB;=>6.?T\ZB7:HJE88XfVPK8)%,?>0:A5*,/05874100011,(-0(#*466?Ekkigffffgghihhhhgfffeeedccdddeedccbbbbbcdddeefeffglqtvy}~zxvusqstvwwwwvusrqrrmgfijgdfhfba___^^_abcbbccceefghghhhhhhhijjjkjkkjjjnqqqrsuvwwvrmhfefghkmmlprgaltoptqc]gmklmic`\[[[ZYXXYZZZ[\___`bbbcc^XUWYY\]\[YYYW[giaXVYZ\^^^^^\\\YX^c`YUcojihghhfcddca`__`_aa]XUTVZ\[Z\ckowzxsmjhfba_abgkkhhjie`]grj|u]figcca``agmlkkor|{w{|s|}{~}}zvut{upxxwusquww{wj~icdbaa_dc[ixypf^]__gfcfa\[\Ucirre`hsq``eY[a^\YWTROJNX_`]WTRPNMNMMMPSSRMIUaYNLIEK[gnnhfYMPROHFHIKLOQNJLRTOJIJKKKKMMMLLIOFNPEE@AQZC>DEDDC@AACPYUOKHGGIHGFHIKOLH_`KNLHGFGHIMNMQX[ZUMKLJGGHFFGGHHHGHIIHJKKLLKJJJIHIGHJJKKJLRXSLOHFLSVOJKKMMKJKKLLLMLKKJIIIIJHGHHHFIPZ\UJGIKLKLLKKKKLMLMNOMLLLKKHJKGYtwUIZ~}{uUNRWUTVUUUUUSROKGEFFDFFFEDDDEEGC?B;GJ_OR?jyHZ[[XSVNHWPIQV[[PIHGCLKIIIJDGVĸQJY[][YROOOLIGFGGFNRIHHHGEFIIIHHFCI\a\\]ZVSSSRQRRRX^__ZWWWXXS`aSRhmVROIZeO?BIHFGIJIHFFFFFHHKJK_YEFQWQFBA@??ACFJLLFKd{m_i^gc_ruyfGLJFBCMOD@>@CDEGJD?ACABDFC@???>>>>??@BCCDIKHECA@??=>>?>=====>@>>>>DJIDGCFHHGFGGHGGGIIIHGGFGGFDA@@?@@HXYSRW]][YZ_dhjjhhdcgnnkf^\RABHG@8541249AFA:8998886678:<<=<;;:=ABDIFABCCGLIEFGIKLOUWTMJJ><=978864664334667:==9656577544343348@B>:;=83324434455554566547<>>=<<<;=@CCDDCCCBCDEFILOF77=BGEEFFGFDB@@?==;::::97788;>=;:;<;;=<53679::;;===;::::9>DJI@=?=>=>>==?@>=<<==>>=====>BHJGFHHGECBBAAA@@??@@=DQOBARa`YIADDDEFFGHFGF<3///0101110000/024687566667765556689:9766554555556789977754887:979;>?ABA<::99987655456567767=DFA:989;<>@7(N{c:9NWXY]ZH;?JPPMD;7554320-)+=H>5434679965430/8B?93/-,*+./,***++*.365.043666655651-(%4MQE;51/,)+9GRA)4AFIIIIHE>H]ilA)WfaZC;;:8610?F_{qncC0(&5?;:;<;@QULS[W_ji[MMRM<59BOE4=HLO@+.1.21147DMD>@8=PK902NZB/(14'.FF5:KE2++,-.01/,-..-)(-/./288;CCiiigggggggghhgfgfffffffeddddddddcccbbbcccdefffeefgjoos{~~|xussqqsuwyzz{{xuqooonmhcgkgeggcbba`^^_bdcddccdeefhiiihhhhhhiiiijjjjjjjlopqrsuvvwwvqifefghiikjdlukcovssur`W[]`dca^\[\[ZZYYYYZZ[]^_`abcefghe]WXYYYYWVUTTSSWXVVUTX[\]]][[^[[]ZXWTawpfgikjgeeeeeb`_]Z]b_ZWUSUXZZWX_cjllkkkkheffgglqjaaabbbdjtjz}|{ydhjcaccbachrppnkkz}jei|{{zxspqqrsqsvqgqvm{y]^~ygcbbaa]hfTbx{rg][adqsa\^]bcel{m\fsvqhZ[c`_\YUTNHKQ[cc[UTTSRPPPPOPRRRQJOgbGBEHSbmpnf_RDGNNIFGJJJKOQMIOUQJHIKKMMMMMMLMOHUVGIB@GWM?FJIGFEDD?>HPSSNJJIHGEEFHKOJDfnPLKGEEGIMONHCIS_aUJJIDEFEEGHIJKKLLKJJIHIJJJJIHHHLLJHJLOOONHGKLKMPONLKLMMMLKKLLLLLKJKMNLJIGEFDAGPV[cj`XNJKMNMKKKKLMLMNMLKKLKJIIIIKfvVFnpUPSWUTUTUUVVTQKEBAACFHGGFDDDDCFA<@:B@@GK>FMFS\[W^SLS\TLQTXRIEFBF_XZ^ZUYM^ȪcHNSUSUVTMJMRQMJGGFISJ@IHEBBCDFFFFCHS]Z^_ZRPRRQQQRYdigb^\ZX[ZTa]PSWmiKKeLHDGJKIFEFFFFGHKJLYYH>AIZRF??@?ADFJLLHJYo_t]bg`lyw~}GHFC@BNRGB@BEEFFHB=BC@?CFC@???>>>>???ABCGIGDC@??>=<=<>=<;<===><;;;>BEA><>?ABCDEEEDDFHIFEEFFEFDBAAA@ACJVUPRY_`^_cfhikhfYPU_\URMOWLEDB824=:>GOUL<877679:;;;;<<==<>>;@EIMMHECCBEKIDFGIGBFKNRUSI:7<:997556644334679<;8555697444345579;<:87664333332244454545546;>>=<<;9;?ACFHGGFEDGJKMPRC216?FFEDDCAA???==>;9::::8688:??=;:;;<=<867889:::;;;99:;:??><===>>>>>>=>=<;<@AADGGFFGGEBBBBBAA@@AA?>CPWTIAL]]UGADEEEFFGGGFB9320022111111100013686466666776557888876655545555468::977766787999:9;?BDC<548:97775455545613CKJF<469::;==:*5le;9.(11/21220.,))-2597-((%*4;<>=EVV9%?PIJJHGHGFLOgv8"Zjf`L@>@<2*8RO`zrqX-#$->?516<98FPPX[^kttjWQUTLE3'0,&/=KI5)7BDHJ<+-CMDEHAFMB72/385-&-1'/IE9;>E=2,()*+--+)**('(*+7>;66=:1hhhhgggggggggffggffffffddddddfeedcaaaabbbcfgggfeefiknty}}~|zzwtrqqrtwy{}~~zvrpnkillgghgfeedba``_^_bflojfeeffgijiiiiiijjiiiiijjiijjkjmqstvwwwwxtkddeffgghifl{tcmyustwlXVYXYZ\\\\\\[ZYYYYYZZZ\^`bcdeghkmj`XWXXXXXXWWVUTTTUUUWXYZ[[[ZZ\\ZZ\\[`fic`dhhfddfgghfdca`b`^[YWUY`_ZXWX[__``befffgho}|i_`abbcipynp|yrwyvlji`aaedcfmusmmq}}sdbt}ytsvvsnlortruyr{xWTvebbba`^bf^cv}si^Zissy_][`kkj}u{|shintk`fh`]XSIKQVa`_a]XVXYXXWTSRRRQOPURLetWDFQ]emqpdTOHBHKKKKNOMILQQNOTRKIJKKMMMMNQRUVSTm`@JGEDEOJEONKHHFEE>99@LROJJIHGEDFHJLFD`sWGJHEEGJNNKGDEJS^a[PHHHHFFFGIJJJKJIHEEIJIILLJIFFIIJNPMKHHJKKJIJKMNMLLLLLLLLMLMMLMLJLNNLKEDNWJADJOKOYiphWPPOLLMMMLJIKLMLLKMKIIFHIFScOQmURVUTSSTTUVVRMJDBDEGKJHHGFEDFEB?>?A?@>@@FCA>H_\W_QLTTNMSTSPOKJGESR^gd`]V~HIMORNPOPKGGMSVQIGFHSIKleYSLIGEBCDHMKPY_`YQOPPQQPQ^iifdb`^`d]XdWLXO\hWnSIHGGEDDEFHIJJPVJ@?@QUMC?@ACDEFIKJIMV\i_e^k~||RFB@DJNSMBADHGFFE@?BB>;@C@>>>==>>>??@BGHEDA@A?>>>=<=<<<=<=<<=<;<<<=>?@=;978;??>>??>?>;AECGIIIC@>?BAAAFIIFHIIKMPH:;865555443446689:8776798664445677665444443333222334345555359>>=<<;9;=>@EIKKJIIKMOQTN>656;BGFA<8:<<==<>=;9:;<<:7879@A><;:<==<;978989999999:<=>DKK@9;=<>??><=====>>>=<<<>?@BDDDDEEEEDBABBBBA@@AB@<@NWTSPGJWZQFCFEEEFFFGGGB843234223211110111357646655677555577887655544555568:::88976787788:;;<=AFGE=3379887544444443;IIFFE=789;<<9;41SQ2JYWa]H:@OMC=6442245545<<..668==;8.1788620,00.,%*.'(*&'7=96788779;<<;983.----../\P>KPJ9PA-,7;1-:EPTR_ttpqbRPQOJ6%-1*(:G=15CIQhkC$%>SNQNFH@2011-1;51,'%4J:25+4>4)&')+-.--,*'&(&'7DA6295-hhhhhhhgggggfffggfefefedddddefeedca`aaabbddbacdeeeggjr|~|xuyxvuspmmortw{|||{xspooniegkliffgededb``bbb`ewwlffhhhjkjjkkkkjkjiiiijjiijjjjjmqtvx||zyysidddddeeglptvrswvusuugWX\\[\\\\\\[[[ZYZYYZYZ\^`ceegghikia[XWXWWWWXXXXXVUVVVWWXYYYYXXYYZ]_`^]^^]^`a``bfhgjjhhkkjkjihea_bba_]\]^_]^_`begihlwwg_acccftt}}lmwmpolmlg\lcfffhlosrs}naj{}yxvux}wsnprrw|yzyos{mLQp`_aaba^^`]]o|uh]^lt{oZ`_[ipmnx~z~~~~~~}wmopfaab_ZNEQafnqdWRRTWYYWVVTTRRSRQPVVJWtaBER]dlsp_LIKIHIJJJMSTMJNQRQQRNKKKKKKKMRX[]^_ZitCEGGFFDKRONKIIIHFEC>88@GKKJJIFDEFGGGEHSodFIIHHJLMKIIJJIHLYd\PLLIHHGFHHHGGGHIMKACHIJLKIFMJGLVPMMGEEHIHHHIJKJJJKLLLLMMLLMMMLJIHHHIDGX`a_[TDAA@Mdk_VSPPRSSQONLKKJJJLMLJHEHHEDIGemUTVTSTSTTTVVQIJJJLMMKIJHFDEELI><=>><=>?AAAB=I[[[ULIKIFNSSPLIIIIDBKU]^\TV׭YEKLNPPPPOMJEDGLNIIHFSHZykkfgf_RH>AGEDV_`[SNOPOOOPX_^_```a^\X^dVPYVI[ï[HFEFFEFHIIILYNAA@DJMJCBEEDDFHIIHEPcj]_TrTD?BUSOSOD@DGGEEC@?A@=<>A>=====>>@A?CGGF@>>>>====<<<<<<=<==<<<<<<<====;;:98999:<<>CCB@AB=?FRVUXbhd`^\YVPLIHFFFHIHHHLTURU[]`gfcT<3:<<<==;==?@AA@?@?=;:>A=98;=<=>?DHGFGIIJMLB>;:;:89:<=BKOMLLMOPRSRB:<;88;BA;779;=>>?ACB?=;;;97669?A@=;<<;;<<978989988899:<>AGJB98::;>??=<==>>=>=<;:;?DFFEFFDDDDEDCAABCBBAAAAA<:IVXSQSNHQYOEEGEFFFEFFGID9434444432111000233565455566665556677555543444446899998899667767999::;?EIJG;24778865444444:@>BFHKE969=>;8775BsU-?PVacV?>KF;61/12245546LO7)/7>B@<=@;466/.//.4;5-,.1685/+,/1.++/8://5/,8=93/,,-)&Ow]FC9-023.'6D&$2;>BA51/-).;965666DH/.48<:33675632/*-7=<968621.,.../021*)0412<@:0-15330.2265/*:>-#()$-?D??=9788::8511/00/--..0FgCBA@@=:;3+,--./.--3=A?725950044/..-.-+,,,,,(*3=4/,(())'&*,+++.29;75:>=0((%)361/4@ISG9FRPQOLIIJKIB]sQKN[YC;GdvW-(19LSB+,4.$'/6@A;OpunumXSPC98@C9**<@53?E=AduN,(9RVUSNG5(+-/1;;*26'#6E1'*#+A6.;67>:2020,'&(&(2DI:6DJHhhhihhhghhhggfffgeeeeeeeddeeeedccba`aaba^`dhid^_ceffhqzyrljsyvsrpnljijmmotvsqomjhjlmkhfhjjjigedccbaaceggjysifhiijlklmmmllllkkkkkjijkjjjjikpqt|}}}xledccddeggkswvuvvusxwaV]^^^^^^]]\\[[[ZZYYY[[\_bdeefgc^^edZXYWWWVWXYYZYWVVVWWWWXXWXXYYYY\^``^]_]\[Y[]_bcfhgipuusrrqqniebbfnja]Z^a`_abghhikngabcddfsyypokjimkkd[~hhihieky}|qv}xijkiirxttxusrtsw}xy^ZkaRTg_acbcd`]\^[fwug]cluoUY^eopopv~}vn||z{{{y}vxrb^\]\QM]p~i_WSMNORSRRQPQSSSTUUSSSPOb^HLSXdopfUIGNTLHKHJJOTQLLOQRPONNLLMMLJP[_`beovjDGJIKLOPKFEHHHIGFGE@;8:BHHHHFGGFEEDEHLkmKIKJLMMLJJKKKJHDEP[\UOJIIHGHHGGGGCOqsYGEHHGIIF]|bGF\qXJBFHGIIIIJJJKKKLLKLLLLMMKGDCCCGPPHDLV^db_ZUNHMQUWYYXWVVVVTPMJJLMLJHIIHGIHIngUTUTSTTTTTUVPFHIGHKKIIIFDBCFMH<:=?==?@@BBCDEGMORHCDGHGNNNMJGGGGDDIKRROO?|IIJMNONQRRTQJFBCEGIHGQPMa^arzzxrfZLB9@@Vab[SNMMNNLRWXZZ\\]_`ZS_`TTSShОwz~fRDBDHIIHHHIUUECBCAEJKHHIGFHHHGGHGed[MUw~uU>APTRQQMFCDFGECCBA@?>>=?>=>>>?>@@AACEA?<;<<<;;;<<<<<<<<<====<<=<<====<<=;89889;:9<=>?@C@@AD><IUVUY]XPMLIIFEEFGGGHHIHGHHNQU\\YYQH;6:<=<;:99:<>@A????=;::9?D>;=;8:@?<<<;@HIGFGHJLD:;;;>?=:755665644655566679998665455556543444333443322233355554449==<::9769=>AIRRQQQRSTUJ::==<:>@;799:;>?ACEFEC@<;866659?AA?==<<==;987888877699;;><<===???@=;;=97988e]&/BMZdbC47485104974461=957:752.,-.01485./20276.*(*,.*'+4@=54-(044440++7Kno<-3.++,.,)8D/@PMJG>3/.,(*7ACA=7-+.6=6+*//12.,++,,.022/+*+++,..1?E8/469:DD:4.06::7210-,+.1101;BA=<=:3.0200/122410000/3763222/.,**-01.,8K@($*''2DPTG603420-+)),,+*+**.06[xf@;B<@=9782---..//+-5;:745:;41497/./.,-//..*-,,8@9@@=::74.+*)))-1:<527>A4)(')1433;CLRTRQRRTPMKIIJMGU{fC>G>1347707NB<=AF.'/6>CD@1--&%*-*,..>[lrul___I,=^R4%*7;56<>64F[P@79MRPW\R9'(+-4C9"6=,(38)&)&(;>>=>>>>?@@@AA@>=;;;;;::;;<=><<<<=<=====<=<<<<==;;<;98889987899:<>>CFA=ABABDDDB@?<>=<;86788:=>?=<=<;;::8>JLE@;9CH?<;:9;CHHIJJKI<9:99;=>>:87877644666655589986544444445455555554443333333335554448;==<==;89?A@AMWVTTTVTOB>?>??@CB<89::=?ACEGFFBA=9676659?AB@>=<<=<;:8777887668998=FF<79;<;<=<<<<>>>>@B?;:>EJIGGFDEEDDDDDDDDEFFEEEDA=@NYZVQPQOJNVKFIHHHHGHHILH:2464665543333333224443468:975666555655444555555579;;;;:99765456666799879>DFD:038866664346:<=?AABJRJ:5<@?<:9:3Lu,#6:LceK/&,54018<<7573:MP>/0453/035561,+,-/14433661035-('''(),//7:32/)**,49736KlzW*'/+***++)7JF[_TNH:0.-,((1@D?>701.161)'+-/.*'&()').1/-++,.//0//6<3,-4=FPB,(-16962//-***,.29==?@?=?<3/0454343034641352000001.+)(((((,(*2A:)#+)(:[]8-.245675,,540+'(*,-.04515;=C=1162--,,/20-.45/.3:=858:851-./17820/.2/(<@7FNLLKD?8-*(&'-079668=B;-((+13351/3;;99=905CEB:5JVU[`_I,&*+7M?*@D.,-,(''+-,?NfxG+**)'&(/7;;=6H~~dhijiiihhhhggfggfeeeeeedcccdddedcca^]]aem|wkgffijijkknrstromlhfdccccbbdddffghijjihhihhhgfeeeeeedekv~ogikklmnopoonmmmmmlllkklllmlkjhfeccddfikmleaccddcb^^kttuvvvutuwgZ^^^_^]^^\\]\[\[Z[ZZZ[]`bbcfhigaVSVWXVWUTVWXYZ[[[[YXWXWXWVXXXXYYXXXXXYZ]aca]YWY[\`d`[ag_\__]^`^]fw}pknlgeeijgdeddegjee{{wrmjhdgedmlqw~|~yq{|wkefjlmkfkuphhfguyrsqmpxxsvz|^[Z[[\lobf[SZ__fefg`Xfpe]`annVbffijlmmoonzxsmkpwvu{{gYXPUf{zvm`STWSRRQNNOOPPORUTUVUSRV[VMMU`b^ZTOJIKMNNPMEDFHJJLLLMPSSRRQPPOORPOW^]e}dTKOS[RKHCABEFGIJHHHGGHGE?75BMJGGJKJKHDGCRxcEKIHHGFGGHIIHHHHHFJPXZSMKJIIHGFDDC>>Pa[JIJIHGMhdFR|uPEGHHIJKKKJKKKKKKKMNNLIFFDCCILFC@@B?BABBDEEBFS^\TQSTTSTUTPLLMJIIGGGFDHF`wXUVTTTTTUUUUUOEDDCBABEGGFDDDDCCDDDDCDEFFEFGFFFHIIJKGHIHKKKJHFGFEFFHLKKLMG|~FHIICMMIJJKMPNIFDEGGDAGTKLJFEKUWV[^bjsj[ZdcXQQPPNO^kg`_``a`ZONLbcOUOUbXRs³zusu{}Q@CBBE@@PH?BBBACHLJGGHHGHJLNOPrraIJSnxnFQfRJQTNGFFFFECAABC@??@@??>=>>?@@??>>===;==<;;;;<=><<===<<=<<==><<;<<<;:::99::97876668:9;::>DGEFHHHIHGHHFFFGGFB?<:75AKUVG=88<==<;:98::::<==;:;:9:::9:AJKHC@BB>>=:89?HJJJJJH?=@A@>>?@A?<:87655666655567776555455554555555555554444332323544448<=<=<;;;;87777776565546AG>689:<=;==<<<>>>=?@?;GT[WURQPNJMUKFIKIIIJJJIE=5356555554553333333445578::97665554445444555555568:;;;;:987655466646899755@IF;0-3=>:985258::=::04s9!.,CB70//-,*++,,,*)))(*,0/,,15577875301.--4=GO6(+-26860./.,*-0.1>GD@@@=><2...//7;71-.37;<<:300/..,(()('&%$))#+:A2#')1NW1'-117>E=16BD@7.*,**+*))+-06<8-,21,,+*).32000+)3=;56;=:94('+3:7212750(@84EMKMLDA:.('*.32359:99?@5)'+02336:0/DNHHIGEGNSWSSL>S[IF=/-149505:/:VK.+3.0432=ND/**.253-+/6:DVfhgnmXEYjaSC::>><;?>44;??3*Fd_Z_cT5'**5K@/A=.1.+*(,=LJFLU}m=))'&&&'2A>,+0^`7jjjjihhhhhhgghgfeeeefdcbcbcdcdcb`]\^dlvyqkiijlmlopopokiigccccbcddeeeeffggijiijjihhgfeefgfffgjpxuiikkmnnopppoooonmmmllklmlmmlkigfeb__``acedaacegiiebhrttvvvutuyuf^]]]\]]]^^^]\]\]]\\\\]_abddfimne\YWWWVUUVWXZ[ZZ\\[[ZYYXXXXWWXXZXXXXXXXYY]ef`\_fnqqm`Y^aa``_didcu}{z{icaacefhhhggedccc_^sssifgmio_ipru~~|wv|~kpqnmllnoppqtusolhitxrpqqrwwxz~_\Z[[Zbvygekd``^_\elkcagldjhWX_UVagjlkkmmmlp{}vpotuw{~r`\Zctqg`ZZWUUSRPNOOPQSUTSTTSSSRRYZSPTVWYZQGMQSUTUZ\TJFBADHKLLNPQRRRSQPPPONNOSW`x]COXZ]TFCEFFGHHHIJIHHIHHHGB8BYWHCFJKKJGEIDFomGFIHGFDFHHHIIIJJJHGGLW[XSMJJIHGFFFECBFOIGHHIHOsdRlRCIHGHIIKMLKKLKKKKMONNLJGFEBEMJEBCDDCDCDDCDFCHZf\SRSUVSQOLLMLHHIHGHHHGI^vvUSUTTTTTUUUVTLDEEFHEEEFFFEDDEEEFFFFGGHHGEGGFFFHIIHHFHIHIIIGFEDCDEIIIILPSN\FKHIFOSLGFFGGIGFEHJHB=BM@IIGCACHOX_hnmkdY\]TPQQQMQmvg`_da[SrZJa\MSNKIDDD\ƣnlux{eKEBBA=JLBBBBCEHKJIHHHIJKLOMGSuvWDNJOYgkP^bJNNOMHFFFFDBABBCA??@BA@???>??@?>=>====>><;;;;;<>=<===<<<<<==><;9:;;988778;;;<:8467876?FHJQRPPONLJGCBA@??EGFFFFHIJJJIGFEDDA=;;:8@U^YJ<559<==;98889:::;;;:9988::;<:8CQSKB<>??DHKIJLKCAEEBAAA@A@>:86455444554433567665555554555555555555444433333334459<<:98857;?ADC6?SVTVZTEBA?>>==>><:9:>BCDDCBB@@?;:=<:88:=AAB@><<;;:657876775432/9FA55888879;<<<<<==>==>>ADEFGEDEEECDDEEGKJIIHHGFEBADPVWTSUTOLIKSKFILLLNPQJA:765555444444433333333566788887777766644324655545568;;;;;:8988878876568899606DF;1.*7JJGG?349;:;=AA?CSZK:;=?=<::2+a{;!/,-Fb^;+;;014?FA9;@98<;23;?<9:<::961---,,/3678886322231--4764/&"'/2.+**+->?@@=9632..7=>>0/-,-2540253.*/532?KKGFDAA>1)-/+-5<92*)/6@B@:3233.)(')+,,,5?3&(()8J7!,BOB*(,+(+2:4/>HHF<75/*)'*36,$*/00-,.0/-,)%(02112,*5>=98@95756N\F30/)5EF>?OG/),./3881/;?:Jblqnb\akkh^LD@?>>>=;746:=4$:gj]cbJ..;0*71*1-*21.-*:U_\?9DcD++)&&(&)9D9*&4mu7%kkjjjhhhiihhghhgeeeeedcbaaccccc`^_diqzyoiikllllljigggecbccdegfeffffggghhijjjihhgfffgggghgjnt|}pkllnonnpqrqqqqppnnmllmnmnnmlkiggebaa``abaaabegkkihinstvvvwtrx|rbZYZ\\[\^^^]]]]__^^^]^__^_afiklone_ZVUUWWWZ\\ZY[\\]][ZZXXXWWWXYXXXXXXXXVX\_`envyxz|ug^fhbhpstpw~}xgfgfghgfgiiigcba`_bimvjcefkprbiqstr~{yyvsyliknmlnpswyxx{{wqimutqporuxx}~sY\]\\annbbdba``^aaehffgghmjdb```fiklmtxwvvw|w{x`Udsyph[YWXZXVWTPNMMQVYYXWTSWYWVVUXYRRVSONNHDKUYZWW[c_NFEBBDFJLMNNPRRSSTUTONONPVb~{MZh_QMJGGHIIIIJJIJLJIJIHHJFDXcN>=BGKLJHHJIEbjH>DKKHGGHHGGFGIKKHHIFGR[[RLKJIHHHFCCB@HGDNQKGJuvYfMCIGGHIHJNPNJLLKJIMPOPPMIFCBEKJDBCCCBBBCBCCGFBQhhXRUXXTNKKNNJHFGGEIMJFKjjTSUTTTTTTUTVRKFFFGHIGGGGEFEFFFFGHHGHHHHFEGGGGFGGGFGGHGHHIIILLJNSSMLLJLRTVHEHFGHMPLGGGIIIHIIMMKFABQ?ABDFEBACHR_gc^ZVZZQQPLOLZwtjehtyzikiW_bx`ACBDwxw{{p`TNT\ce]VRNNJIMFBCDFHKKJJHGIKKJKMKEOmtMIHJFFR}w]\ZKOOOLIGFFFDCCBBCCAABCA@BCBB@?>>>>>=<><::::;;<=><=====<<=<;;:99::98766788;A<<44667?HHJMOMKLJJJHGGGEDCCFHGGBBFIJJKIGEC@>::998;VkeQ<6559<=<977788:::::::8778::;<;:?KWRIC@BDCDEFD@AJKKLLBCECA@A@>;8987544345432211234466554346555555555555544444444324457:<<876657;>@A?65L\]_^QC@=;;:89;=<;9:?CCCC@?@AAA;;??;::;>@@BB@=;;:8678869;965412?C72444212468:;;<===<;=BDFFEEFFEFFDDEGGKOMIIIIIGCACMWUURRXVMJHJPJFIMOPSUTF96766554322442233222333455666676677889888756655445679;;;;;99998:;;998878:::7/+7D?1/+/KYSQH649;;;=?A@@ISOC<:<<;988-Rs: 1/+4R]='25135;>98:;>B<99;CGC=;;;:762//.-,-27;9641////013673/./.(&-330.+))JqqYJHLD3+*))))**9N83CC93,/61*((*6>?AF=-,+*)*,/465443210//-+,2<@@AA>72212.-RWD0(&)'$%')2EFDB96:3,)()-:6$'43./-+.0..+(',-/57118?>>?BDGE:&"$',...03645?-/:CGEB?8.+,1*)20/4<>98:BC8)%.13347=?DGFGGEA>=>CD>856;CHE9./7:<>=5=[[D?3"*CMG=;ID1*+../8>86@9,Kg^engr}tlndQJC=<=?:0---/56*0Ylbja9%1,.C\='/iiiiihhhhggffgggfeeedddcbaccdedcbfmqsy}z|~pkkkkihhgeefedcbbceggffghhghiiihiiijkigggghhhiiigiqy~vnlmoonoqrrssrrrqppponnooppoomkihfcba````_``cefjjjjhlpsuuvwskp|{n_YZYZZ[\]]]^]^`__`____]\\\_fjjnrnib[VTUUVY[\[Z\]\\]][[ZXXXXXXXYXXXXXXXXXWXerxxwy{z~{nfelxzzup~}tnmqvvfj|yoeddeijedb_aceedif_bbdggnyflqssqu~}|zwwxmvpyhbhmmnqtw}yyzunrvnmmmrvxxZZ_^]`mna__^_`_]fdge_chfhhiqrojfiigl~{z}|y|s][jxo^XSV[_a\WWYTOOJMVWZ[XTRQW\ZXZ\\VQSSNNLJIHMUXWWWUVadTFCBA@DLONNPQQSVY[ZVPMNPUmU]g^QJFIJJJJIJKKLKLMLKKJJJKLSf]C;<>BGJJJKKMF[lKEOLKJIHGGFFEDCGJLMJECGMTUQMKKIIHGEEEDHFDM_YIBfevMGJIHHIJJIRWMJKKJILMOPPMJGCADIHD@AAAAAABBCDFGBE[k`RSXVPMLLOPHGHFEEINKFPzt\RTTTTTTTUUUWRKFGGFFHHHHGFFFFFHIIIIIGHHHFGGFGGGGGGGGGFFIKMNSXZaimgPQROQZWfjAFFFGGGGHFHIKKLKKMMOMJCBUC@@ACFFDCDHKNPONQYWOQWOJGMdlsܹ}\=@>P{xzp^UQQSYZZZZ[UQMGDFJKJIHIIIIIIHIJJFVnaIMGJJFKr~cXPLMOOKIGFFEDCCBCCCBCDCA@DEFD@>>>>>=<<=?>><;;;<<<=@@@@?@AA?><:988999988877667892=A973@KLIIHHFEFFEFGJJBDHGEFHGE789:;<<97777668::9::9988:;<<<=@?@IPRQJGGHHKLNIBIKLMJBBB@?>?><:8975565467543333564455655358656555555535456554444444458:<;876689:>@@;61C]de`N>;:77767;>=;;=ADCBA@ACFGC=;>=9::<>>=?A?<:887655569;;9866;A801123555788:;=>===<:>EGFFFFFFEFEDEGHKNOLHGHJJGDAFSXVUSTVRNKHJLKFJPSTUXWI:87665445345422333443333576544544567789:<;<;;::99;60*.=B40.-FXUNB338799:;=BDDMUL=9;:987=0=c@#/22/>XH+14146655568=><65300670)*45,*FQK2-49785,1NZOKG9+"((('%-:CA;8436730.-,77''6;31.+,/..-,,-+-5977::9>EHIIH;*))'.10100417>..,7GE>6--1382/--,/6;:9:@D@2((+1115;>;67>B?95212333/2XP@RK4E[R@8:CC5+,0/28=<94'3`b@Xrlz}fapm[KC;8>B9+'*,+07/&>SN]]8:XaJ-)-)4O\[F6-4l~N,+,*G;&*%%%$'395215D@+,2hhghgggffffeeedeeeeedccccbcdefgikljhjqzxqkihgeeededcbbbcegggghiihiiiiijijklkjihfghhhiigis|wommoooprrssssrrqqqppppooqqqpomkigdccaaa`___bdeijjiikortuuwulo{}zrf^Z[ZYZ[\\]^^^_`a`aaa`_^][Z^ekmnnlhc]URSTWZ[[]^]\]^][Z[Z[[ZZZYXXXWWXXXY]itsmr{zvszzuwzyvsqwyrmsuqv{rgios{qbbipokiccedefebbabbccbbnleknqpoo||{xxzxutwmrvmtmceknprrox||xvvxvqljmuxyz_\`_^_jj__`^^__]ailhbekjedeidjnrgZdzwxyyvrrquxd^in~xYW`ecgph[VWWRRMIT[YXWUSQPUZXWX^^VOOONNMLIOWUTUTRNJSgcJ@A@?DOSQPPQRSUX[]YPKMOVwjVjXLKLKKJJJJJLLLNNPPOMMMLLLNYeR>>??@ADGHJKMGWkUSVDDKIEGGGHHFDCGMNIEGHDIRRMLKIJJHIHFFIGFBU_]LK}hKJMKJIIJHFOYQIKLKKJJMNKIGFECFKIEA@AAA@ABBCDEFECL_cVQVTNNNOPLBAGHGFHLMCXpXRTTTSTTUUUVWRJFFFFFFFFFFFFEFGIJJIIHGHHFGGFFGFFGGGGGFGIMQSWZ`gousfOKKKR\VfUCHGFGFECEFGHJJKKLMMOOJCBUDBBCBDFFHGGEBBDGKUSNVecICTzڞ]ԇPqoKEFH^Ȼvxzrc[WVWVWWWYXXTIHLKIGGGIIHHHIIIJJSaOLLHJJGGU|dTFHJOOLJHFEEEDCCCCBCDDC@BFGC???>>>>==<==<<<<<<<==?BACBAACDC@<87778899988975568657=BDHOIJLLLMLLMOOQUTJDNIFFJIHB8CLMMKIG?855766<63QhP8579::;<:77787678::::::;;;<<>?@CC@;9DTYSKIJLNPSTQOLNPJA??<<<==;:;:7556889;987899987886775346666655555533466555445455568:;98778899<>B>83=Xfh_E98766667;>>>?ABDDBAACEHID=;999::<<;;<==;987531012589:98:?;212358>?>=;:;<=>=<<;:>GIFEFFEFEDDDEFHNPNJGFHIHGDBJUWUUWUMKNKJJKJHLRWXX\XE88778666655554555555333355432332234555679=>;98665447;<;;;;;889:=>???<;;989:730-2>91.-AUXP=013367778=??JSM>886567:11JA-12322MS84515655657::67:>>;5/058876565430-,,,+-/--,,+.6974..3597/*.578;80Qv`7)('&'*)),/100-976/*)'(3?=8;>;3-+.1336;<72-)')..)),,19?>6*)-+)*3=<>E1.4..-2:<870,---/17CJJLLJEBA4'*8<7210/-.123/.-./13/.5:535@?@2-:<;;8*1ZZE>:37@9+*)(7>7951247;:641.35)'283/-+.1210/./016;86743<:@JLG:47BJJ7+/545665/(-CO>/RrkwzSBWj\B@<8CJ@78:50381&.7+:QQhnN801,*HholU?.Fa=,+-(%'&''&&'')131436@:453fffgfefeeecbbbbbccccccccccdeffgijf^]gr}|pjfeccccccbbccdfhiijjjjjjiiijkjjlllljifhihijihkr{xqnmoooqqrtssssrrqqppppppqrrqpomkigfdcbb`__^`cehjiijkosutvzxtuz{{|vi_]\YX[\\\]]]_abbcdfeeefdZU[cghkorrndXPPSVZ\\]]\]^_]\]\\[ZZZZXXWWWWWW\juk\]nytpuz{{}~smnln||vphgecjupigffgjllmyxutpfgfefefhgbbcbbbaefflmmmmu}zxvwvususnmlwzt~sfekpqrpgsz||{ztloxxxyk__`__`cd`__^^__^_dlolijhecb_aeopZt~yxwtrrsswvaViwsYonaf^[[XTUTHTd`]XSRRRRUYWTTVVUQNOPOMPPSYTQQORXXQS_VEACBIQRQPOPRTUWYYUPRSWYsÑ\iYOONOMLKLLLLNOOOQSSRQQOOOMM]dK=???ABBEFGGIIMY^LDEGKHGIHGIIFFFFJLIIKLIIOPMLJHJKIJJIHIGHDFXigTMxaJLLKJIJJIHJOLIJLMLMOOLIFGFEFILID@@AAA@AABCDEDFECL[YRRPOTTQOHCDGHIFGONB\rYRTTSSTTUUVWXQIFGGGFFFFFFFFFFHHGGGHFGHGFGFGGFFGFEEEFGHHOTT^_gmnmfVKFGKOTSXTJJJHFGFEDFHIJKJIJKLLOPKDBUGCCCCDGHIHHGEDCDIRWTU[czݼ{TArr\pJGNQdİlUU`gea[RSSSTUUVVPOPKFFHHIIHHHHIIIJLMNNJHIGFCAb~gJB>DNQMJHFFEEDCCBBCDDDB@BDB?>>>=====<;<;<<<<<<<<;:;<<;:;<@DB;777788899899777667;66COZXOORUXZZZ[[[]b[QU[OIGIHIGAGOPMHB>955466794FZQ825789:;<8789988998:::::;=<=??@CGDBA9??=:99;>>>=<;:?FFFFFFFFEEEEEFJNOMIEEFGGEEGNTTRRRMCEIJJJIIJKPVZ^\I7689;:678776577776555333331212212213333336889::876546;<;;;;:8::;=ABAB>=;9898631--472//:O]V?311145555458AMN@875667743895433627KG3046666:>?@@649=70-052-15566763/-,,+)*-,,,,,04744322231,(/95398Bd]4**+,--*+,/2322-:65.*)')5=;9=C<0,.24535<<3-+(''.0-,+(/:><3-,.149C@1-+'+31,*4=<53/+,,)*+1AIIKKHFA6.+/:<61/--,..1/-))+./0139:9=71>8&,4856,+La;/D=2>PD2*,'9G648216>=9652./2-+01/.-,.36552//37886430/:EGHIE2)32'+10-.1'/?7/0+/5/065235630/1540//./489746;:114779=?;840.00..13/3GJ7*&*:FQMILK>48<:573#+Qi|l3 (.+,HfstcH3bl@?2*0-%((&'&&''),/1307C>:87ddefeeddccbaa`a`aabbbcccccdefffgd`]amw~vkdaaaaaaabbbdegjkllllllkkkkklkkllllkiiiiijlllot||womoopqrstttsssrrqqrqqpqqrrrqpomkihfdcb``_^acehijkjkmpuuvzzyxxyyx|wg__[YYYZ[\]^^_abcfijijkljd__`beinrusi]VVTW\^]\\]_dgea^^\[[[ZYXXWWXXW\df\W[chmwzx{~{xriflnmmnljgcaejmhor_ilf_mgcmpkeefefeefdcbccccegjltmkjm{}}|zwtusrtukqymcj|~|iekrrrph{~~zrpz~}~ymjfca``__aaaa_^^^__^^`lvulhfb``__bspt}~zwvwwvuzwm~֦mpwaV[]]VR`eW\ghdZYWVVUUW\\Y[ZSSWUPPQOSUQQRLNVcmiaX]\JEFFLQPRQOQQRRTWWVWZ[\Wcz^IAMTQRPNNNMMMPRQPSUVUVUTSSNNffKGE>>CDBCDDBEII^gIDKLLKJJHHIHFGIIIJIOTRMJMPOLJIKLKKJKJIHHFBNfqv\Kbw|YJMKJJJJKJJIHHJIKLMSTNHGFGGEFIKHD@@AAAAAAAABCCEGDDQZULKSYYPLHHIIHJIKQMB\nXRSSSSTTTVVWYPHGGGGGFFFFFFFFFHHHGGGGFGGFEFFEEHHFEEFGGFDJOSY`hljdZOIILMNOPQOONMJGFFFEHMOPOIGHJFGNPPGDUJCDDDDHKIIJIGFDEISUHGplj[KQRWj׷mYy~x{}pJGUPLm~dW[gsx}dVZURSSUVUUTNDFHHHHHHHHHIJIIHQMIJIFFDAAqmFB:ALRMKIHFEDCCBABCDCB@?@A@>>===<<<<;<;;;;;<;:::9778654459@B;76667887899998788878@NPOT`\XVWUVVWWUVVXXWZXVPGHHIKMMOKB:886656872?\S:134689999779:;989::::<<<=?>?AA@AB@AD>;FW\VOMPPSUVXYXTSK?<=<<;<;:;@AABDFFFGFDCCBA<9877779::999:::?AAADEB??>;98768524557;<;::98669==>?>=<@CEHHFFFEDEEEEGJMMKHFEFFEDIOQQQQOIA?BCFHIHHJKOW^^Q?>CEDA;678788777876455423321112212323333324678897777;=<<=;;;:9::;=@ADC@A=98776331-,11./4DXQA@94334444445:ELC;76887786466556781;L>268779=HHB?00;>2*,39.%,2367641/--,+**++,--,./0111320/-)&192-4?RM0&*,/55.*-225641,>T0,9EDD;75/,)'*6<;:=@:015420/2::3/0-((.12211.4>;110/4>CE9//14682)-8;8402552.*('5FJIHEEB4(+-,---**+*,*,-,,-*,02225;@A7.41'(*,-+#6W7&(OO51123//'(JC/6727?<4343-+/046/-..../1243215:86420..7BFGG;-)//*.30*.7/3=300,+**/7643561.2998872.-356655AB236=ABD@:40...,,+,26Mp||dbf[PRSUVVVOCFIJIIIHHHIJJHJNOIGJKHFEE<\oBCA@DNNLJJGFECCAABCCC@>>??>>>===<;::;<;99:9:99:988898665557:8765567888999:89:999;HRRHIXd^XRKHILLKJKMKJQPVZUMGIKLKKD<877765786>??@ABB?>;:>@<>=QgaWTRRSUUVXZXWN?;<==;;;:::>;788:===<=<:9;;:::9:999877666655444444456777555469:::99;::::::::5.9UXC<<<:99;<>?AAABDFFGGFDDA><9889999999989;<=ABCEGIHIIHGFDD@=98889::;97544568:=??>=<@EHHHFFFEDEEEEHLLKJHGGGFDENRQPPMG@@BABDFGHIIHNX[WNNTQKE?;878899777666545533442221112332212223557777899@EDC@;:99::;<<=CG@AEA=96554540+,///29FONI?87444556658>CB<967777777754678621:F<87588<7:@H@048/+/45/-355773//.----,,,,,,,,--../020//-('/6/,4CL3$)*,165-*-32496/,@W5-5>DG@752-*')5;:;=>70364000378763.)+0445<<..>:100/2>KE5169<983,*164435;<5-*)%,=HIHFEC5**+****''*+(*)+,/.((26566>EA31/+*((''%(=?**)PJ*!#%',,(&EK0053685./32.,.397.+-./.--/0555797672///6@HG@0*+-0225515=36:1..,*()/6853460-2:988840/355554BD48>AEJB;61-.-,*+,+17=A/#%&%#"1?<3-/62,?\ejaH7323-/6657772**5?>8/%#3OXF88=>>CC@?CGOY^YN@A>DOPMIL^sX/4419LH]ynZR`VFDB7*'&('%%''&('),/&%:B84;71dcdeddcccbba`_^]^_`aabbcdddffdehlqvrs{}zpqkedba`_``a`bbceehlmnnnonnooonmmnmmmmmlkjkllkjnu}{vspoprrstttttssrrsrsssrsssrrrqqomkijigfdcddeeghikkijpuvw{~~zwyzzz}ufcb^\Z[ZZ\]^^]][\]]]]]`dge]YXXY[\[Y_b[WUV_hfd^ahnsoaZZZZZZYYZZZ[ZYXYYYZ[XZefgxywqs}rcejkkjklmkjigghsmp}swzogghgfhfdejquz|wqkopu||xuuwwutsqmnrt}}q~timsquaRyv}|]X]_````````aaa_^^^___^\fvwtuob]^`dinolpohs}vvwyyzywxȃnp]\^jeZh|qWQW]afa__]]jyk`UOOSUURONPQSZeiheacfbd\IKVVPQQQQNPRTX\][ZYXV[all}kwQQQPQQRUTSUWTRTVVVVVVVXR[eWPRIBACFFFFDHKLFBJLKLMNKJJIHHIGGIJHFEHNUSMNPOOMJKLMLLKKKIHHGLajacdXYXVf~zPGIHJKLLMMMMKKIHIJJFCDCBDEDCEGKIEA@@@@@@@@ABACCEEDGV[NNWVTNJIGILLKJIFGGDqziYTTTSSSTTUVVRKGGGHHGGGGGGGFFFGHHGGFFFHJJKNPSSKHIHGFEEDFGPUVbijh_TKGHKKJIKNOQQONKIGJMVTMECEEEEGEEKJJFNMDEEEDCHMLIGGHIJLUrMWYVWS\iR˦cWiuxxpqyY:AGD@AJ]|vrrj_hr[ORSUVVPDEJLLLLKKLLMJGMRLFEHIGEHD@VgCACGQZTKJJGFECCA@ABBA?=>===>===<<<::::9:::988899888987775644655567888889::::;99>EPRQJEH\b^\[TKKKJIJMJLOQWZUJFIKKJG<866666687:UW67753579:965579;<;;<<<=>>@@??@AAB?>;8<=<@9Jni^ZXXXYYZ\]^aVB;<=<;;;<;9;:8889:<===<;9:;:9::98:99888887543344455557666544689:99:=<;::;;::;>><79>?<>?=<;:;<>?@BBBDCCCEFDBC@=<:99::999:::9:;>@???@BEHHGGHHIJIHGD?9;998742135659@??>=?BFHHFFFFEDFGFFILLLKHHIGECDHHJLNG=>AAAACDDEFEFIOSUVYVJ>;;99889:9776666655565444533333454423312556577788:>CGC>:9:;;<<<@KH=AEDC?6566441-,/./49:CSO:<;656779::;>=<;9677677777546784135<8647<=<567@IA63//01128<:6561+*,../1110-,,,+,,-./////0.*),-..39;50)),/0-)).0/268.-?\=288:<>;:7/*)*4;::<:0055202689:<81,).79639D1'58/-,.2EQB118;;72/)'-564449<2****,2;BFGA:50-+**)(%%*.10+)/4/()-/149@E<,*,+,)+,.-3A>6-0F;&&**+'(('6L8-1-,,*(*,..237<6,),,./.*(*/267788732434=E?3))-034226:;:079.--+*(+.6963441/154444424443441>D6CJICB9210..,+*,0..5=>0(*)(('+-.1661/(-L^_VC745<<42676891(-53,))'*2513?@>AGMKCADGN[da]UI5?RSSSRPcg@6=<;=DABKNMMKIIIIIIGIMLGHHGFMRSSPPPMKKMNLKKKJJJIIENcc`]YUVZ_lqPDIHKMOOMLLKIGFEEDCBDEEDDDBBEGKJFB@@@@@@?@AAABBCDEIPUORVRNKJJKNNLJHHHJKEZzgYTTSSSSSSUUQLHFGHHGGGGGGFGGFFFFEEFGGHJOTXZ[_THFHHHGHGFFEGKMU`ig^SIFFRNILMNORRQONLLNPVSJCFEAEEGHIIHHFLKEGFFEEEQPHFGHLJAzЌOWZUXYT\jMCСlgr}W>FJFDB>Idzidb\ilTOSVXVHCELOPOOOOQQPKJNOJECCCDFHC>====;<<<<;<;:::;;::988888878788788777:944567879999::;:;:=GNOPMIFHMY_bmo\PNNNNNOSTUXYZSHHLHD>8777676886>L778745679986457:<<;;<<<=>>??@B?=>DFD?:;<>@9Bbmfd``___accadXD:<<;;;<>><;;98888:===<;9:::9::98:999:9999754444455556667644689999:<;;;;<<;:;<;976667>@=>==>????AEGFCAABDCBAA??<:9:::9;<<;::AEFFEEFHIHIIIIC<:>=;87875528@?==?@BDFFEFFFEFHHHHILLLKHHGFDBABCDHI@:=??ACBBBBBBACINU[]S>;:97777888787776555677435555555686666433344455577977=A@@?>=;9:776652/--.08=97EN@:<879:=>=>>><::87887777876567775466642>HD;?=1+6F?3.,-,/7==95352/./0./0-,-,,,,+*++,...-.0/-,,-//./36/)),.,+,-0065252,;aC592/05871.++*3999;5*.74/015?A?<81//4<=;8754-/1.)(/CWK4,+26641.((/5532032,)+,..,,/8@8-4;1*((''''&*47-'.60,-.,+).4.8:2<3.)!,E=-3+%&&&&&(,9CIG7)(+**-.+)'(,5979:758:86:;5,),0112015;:5/:6--,+++,.5;84331000111122/---++.;E329<60/,)*03569<<531/7=HO@665CI?675696..8;.#%(&+201599:?HOMGFHJOU^cd[L6;MQTVSMSA37779:7Cm|~sOObU946.%'+(&&%%'))05/-MjQ6=A3(ccddddddedbb`^\\\]__`acddefgjrvrkhkptsqw~}}||xpljgdbaa`aaabbdefjnppqqqqqqppoopomnmlmnoonmlpuvvwy{}~}xtssrrsttuuutttssrrrrrrsttstvvutroljigfhhjllorqrpjffcbgpz}{{||{|~uhhje_YY[[[[[[[[ZYYXXYZYYZZZ[\]^]\VRTUUUUV^bfccfgoylXUYYYZ[[]^__][YYYZ[[[\\^eioumiy}o`[_`_`aaacluoawkoojhjjkszxqkionl~g\guxxxusv~zw|}vuvwxz||zzyyyxssqWY`gy}|k[\_`aaa`aaaaaaa`^^______adsyyzm`_cmjejmjpttjo|xvvwx{~t˾w}riϧ|l[_]\ckhemvVNLMSWYYZZX\jsqk`YZ]`efdbecUNXcaUTXXY\]\ZY[XTW_`VZdg~FMSKEQQNNNPPHIPPUYXXXWWVVUVRWbZRUSPKEFJKLJHGFBCGFHLMLLJIIIIIIHHLLKJIGFHLSTRRQMKKLLLKKKKJJIIGEUb^USPQXgngrUHNLMLHFECCCBBBCBABDFEGHGFEDFHKKHB?@@AAAAAABACCCDFJNKHOTOMLMNLKKIGHIJJJILhjZUSSSRRRTTRMHFFGHGGGFEEFFEEEEDDDEFGGHLRZ_^YUKFHHHHHIIIHGGEDN\hg^SHFKSKINPQRTTQNMMMMNRSSHDEEDEFHJIKKIQQGIJGGGDLNHFGHGGk˽Υ^VXUWX[UX_M?GǾrbflsuvtQEHHGFCBGKfsc`ZWnjPOT^S=>DJLMMMONNONLMKIIEC@BJRRPOKOPOXixlNHKGECB@?@BA><<<==<9::;;::9:::;;:988888877877779999>E?876776799999:::=BHMQPOKIKKMIO_jpn]TRSRQRTUYXW`^LEIA;67777676878<;6:8765679997469:<<;;;<==>@@@@?;89GOHC?=>>=<??@B@?<;99::64;>>=;9999::::::99:<<;;:864444455446667665588889:::;;:::;::::821346:<>>>??A@A@AGKGA@ABDFEDDCA<;:9:<;=>=;:<>>=9568:>@@BCDEGGGGGILF<<@B@<=>@@BDEEEFFEFHIJJJJKJJIGGFFEB@BCBEC<88:96652/-,-07<<86>K;:89<>B@=<<<;8887898888886521368876442:FD?;-0.06;B5')*09<;95244310/00/--...//-+)*,..///01.+*-0.,+--+)()-245412>9352*;^E7;63/.,*)(+--27886/'*5743108C?=:6426>BA>=;971+)',;TY8&&)/13310/.046661//+)*-//.+).43-162+)))(&)(',.+'-201;1+,('0520/-,)'*2:9B\J0-6854;@=?614D>>L751((+)(((*.B[]M.(++*)*+*)%(3987888<<;98531/02..1.18;851;5,-,./0.+.331000/-0:<5-*))(('%$'3E?BBBAA;5///,*-3=GG;4682/31)/>BEF9575434-'=M=5786AFA629=3,4;4+042')-0564469?GILKHINM\n^HLJ<;KZ^XSR>22558<;AWqcPY\L676*'+-)''''''-44-9dmJ870'$cbcddddeecba`^]\[]^_abbcdehhkolifgjimu{|~{xvusrnkifdcb`abaccdfhloppqqrrqqqonoooopoonnpprttw|}|~{wvtsqqstuutttssssrrrrrrtttuvvvwvsniihggghijihhikhb]]``er}}|}}|~znkkibZYYYYYYYYZZ[[Z[\]\[[[[[]^_a`\YWUVXWVW]ec_`hvyfVWZYZ[\]^``_^][Y[^\[]^\^bfefy}x}zmf`^__aabq|wzzqljjlnorvphhno|qobYckorxzuuwy{vuwwunlw}~xd^fmT^hlcqokvwfWZ^_````aaaaaaaa`^^^___^`ceen{ueadmmhnplqonhs|zyxvuuv{nqgsȻŨpmb`^Z^gcctzhSQSQUXY[ZYZWX`jqqh_^__bb_^`_[ZZ[QR]_^[^_]\[ZSQZXOJUncXCQUVTTQNNMQEAafOR]ZWXYYWVXVS]eYRVRLHEHMMLLKHFHGFILMMJHHHIIIIIHGHJJJHGGGIKNQRQNKKLLKKKKKKJJJLDGVZXWWUU]c^pkQROKE><<<=?@BDDB@@BDFIIHHHGGGIIGA>>=>?ABBCCCCEEDEJMHBIQOOOOOKIIIHIJIJJIITk}jXSTSRRRRTTOIGGFGGGFFEEEEEDCCCCCBDEEEGMTWUPLGGHHIIGHHHIHFFDCK\hiaSGEPPGGORTVXURMKJIKMRTYQECIEDEFGHIJHOSJMLJHFEGIHGFFEn˵Ͱd[_UUYW[PV]CED8uĬ]SX\]\Z_WFEHFCABGL=Ku}d\YP\ykLJ\XB=CGIIJLMMLLKLLKIJE?DP\ckptxyf[cnw~\EIKFDCB@??A@><<===;:9:::99999:;;:988:98889879:<>>?CFD<;:98667999;<;;@EJLLNOMKLLGJ@@RajrlWVTSRRTV[YXeYFB@=868877677788:;@<:87567989768:;<<<<;<==?AB@:88:;CKGCA??>==:B^ppkhdcbbfggeYD:>BBBBABA><<;9;;867;>=<:::::::::::;<===;:8666655544567767876666678899:99::::::86;?D?27=>>@BAABABIME>?BDFGGFDB?;9:8:=<;<;:;====:678:<<=?ADFFGGGGGFA====<::;85549A@=>@ACDDEDEEDFGIKLKIGGGEEFFEECADDAC?74569>A@@ACDC@?ENTTF888677998887777775333469;;899:>><=>=<;;;963455565579:;;:89?FKJ>8>Na[ECQQLNMG>8764.--./49;;88B=99=?=>;89::867879:87799841/-179:7432119EB<1/29/3>@3)*.4786.*/598--1//0110010-+*)+,.0440.,))+-,+*++**)(*3<;5.5<531/):ZE;@:72/+*++,-09873-)''.6928TP;>=;:7319FJHJH=3-(%*2EZJ*$*.46653232456773//0/10//0120.131-,+*+,/*)**()+(*-++10,-//02431-+**,29D_j@,;=434357;4*LkL4TU10-+-.,++(%4Xo_0(-,,))***&&,45326;=<<;7543210,-/.089776:7....021-*)*+-.0/0;IH<0*()((()*&1D<79>>?90,*().27>EC9642-,220;HKI@/,20....+;<==?ABCCCA?ABDHJIHHGGFFIIHEC@?=<>?@ABCCEFDEILKIJMNMLKKKIIIIHHIIIJL[o|{gWRTTSTTTSTNGEFEEFFEDDDDDCCBCCBCCCCBDIRXPFCFHIHGHHGGFEEDBCBFO[hmgSDHONGCLSUW[YSKHIILPUVXWKAFGDEFFFGGEKPJIJGEDEGGGGGFIϹmccZTUWTTETYBIOE3tĮf]`^[\\PDDGHHGGFHJAIrjYTRRezaKPWJ>@EGGILMNNMLKJKJJIHTejmxi^fl~nFAIKGDCB@?=?@==<<<<::::99999888:::999:;:::;=>CDDDEFDA<9866666899:>CDEIKKHHLMLOMB<<<;9988976667898;:;=<;7588888788:;<=<<<<<=?AA>769<=>CDBAAA?=>;7BiomifebchjgjcE9@CA>=<<=;:<;9:;;:79<<<<;;:9::::::<<<;<:88888877667777778887566677778889::::99;AHMTL54:;=?AACCCDJKC<>DEEFDA?=<9998:><:;;;<<===;988:;;=>@CCDDFFECB?;876676665559AB<<@BDEDCDDCDEGILLJIGEEEFFFEEDCFEBC?7445788:<>?AA>:@KSM9477679998888787765333358;<<::;>ABCCA@@>><84466786579:<<<;::@HLI?>N`ZHDQQLMNLC98860,,,.279;<98::5100013321/9=7(&()''/507oY<=<;:637@KMKE4)(()/4AS<-/249963334883---.--0440.//131.--/-+*+**--*))(+11,))0564434764342./655?Zr`76@;42/,*&(2.^eV>Af;%*)*.--,*(0Fmq7(,++**+**)*.11//29:9;;741/-.0/..0036778:7010/0231+&%(*,.2;CDB>8.-./0133-2C9/3742.**,*.689=?62430.-.0A;51,-49:ALLJFAJSPJ;06;/$+VvkQLXH'$,036;:6PrwlJ1470*.220-*'%')%&,-%@mR'')%'(bbcefhkmpsrnic^\\]_``bdfhhiiiijjjkoolnw}{uty}}{yvtssqmljhfedefddddefhmqstqpqponnooquy~|xropqqqqsw{|yvtqpqruvvututrrpprrrrrtuuwxxyzzzxqidegefhiijhhkloh_^jy{~~}}}|~|utqf_\XWZ\ZZ[\ZZ[[[[[[[[[[[[[^_`a^ZXXXVN]kb\fmu|rYRZ[YYYZ]^^_`aba``]]^]\]\_elvwy~}|~whaadjx}}}zy}~~ojklpqmnrmkjfgfehfirw{w{vpuvvspoqtyrdgnwnڎwzz~yxxqyljqlv_db``abbbcdbbca``___aaabeea]_`cffdbgnikmokjo{xvxxxyyz|~zldq¤}z_chhifejugRQS[f`Z]]]\YX\`ZW_hrkYX[YY\YSOWr[_ZYUX]XTVXTTURLJIYpXEQRSUSONMMDM|`QTWWXYZXXWPJJMPSVYXYQMWUOMKKLNJHJLLIFFFFGGHHHGGGGGGFDEFGJLMMPRSPLLJJKKKKKMKIFEGJNNMNNLJP`SHEB==?ACCDEEC@@AAAADGIJJIHIIKMMNNMMLHDA?@ACBCDEEFHLMLKIHGHIJJJIIIHGGHIJMevcVSTVUVVVUTNGEEEEEEECBCCDCBBCCBBCCCACMYYLCEHIIHGFFFFEDBABBBITYhriRCJMJGDHKQW\ZSHCJNORTVXXSHEFDFFFFGGEINGDEDBACGGGGIFEo¾rSjdXTTVSKEZ\DDNO=FƶhhruzmLAGIJLLJIKNEJqeQPWS_p^MOI??CGHILLNNNMKKHDL[ekptv~w_^l|X>@HGFDCA@>?>====;<<;;:99998:::::<<;;;<====>ABFIGEC@<:7666656668:?DIIIKJIEFMMMQF:78=<@Wgw|k[XY\]]^eaXA@@:878889765678999;=:<;9688888788:;====<<<<=><<99<>>;?AAAAA?===6:\qmjigeegiio`B@D?;7678999;<:;<==;<<=<<::9999::9;<<;:::99:;::99888877778887677677788999999999:@HMRM;499:=?BEEEGKI@<@CFFE>999989:9:==;:;;;<===;:989:;99;<=?ACCA?><6345455666669?>:BDECBBA?@<64457897579;;;;==;9L^[KGRPKKLKE<8971,,,-27;<;;;<<1;RZ[VE7,6<:;:5+*3>ASfbH7;910/-*'(&-9P[r?-\O!(-/1/.../96MsO,++***(*+-/11.,-/46569730-+0431022357;=<726500133-(')*+-8DA5364+-279:;:/.>9.36543101-+13474,,....,+1>CPZI1)++-.*)*)*,-/*/=>69@?8462++('&'C^Y?6OW3$(-57==2MtnX:083.*0820.(('()%+31)GkG#)*'*+ccegjnqsuwwusme_\_aabdfhihjkkllllmokkv~~}}zuuy{|{xvttsqnllihhgggggeefghlrutqooonnmnprv|yqnnpstrqrw~}zwtqopruwvvvtssqppqrrrstuvwwyz{|}}yqjgffeffhiklorsuqfes}{{}~~~~wrme[UZ^ZY]\ZZZZ[[ZZZZ[\]\Z[]_ab`[ZZWOQbh\UgwxvkZV[YWX\`_]\[]___^]^^^^^^__aju{zz}rjfds|z{~wmmpplmmkhghhijhehns{zxzkuzsquogkrtqszugdjdcbgm~vu{{|wupbϐcbejxrf™^ob^^`bdihdbbb_``_`abccdcb_]^`cfifaacfilkjhozwty{||}z]s{qϸ~qoccdbcb_el]Waadha^^]^]XY^b^YYZbneVX\RIP`߬`ZaZVSUZ\ZYXSTVRPMMSLLRQSTTSNMKEFutZMOQUYYWYYPD@BFHNTV]VPYTGHLKPTLDGKKIGFFFFFGHHFFFFFFFFFFFLSRPQSPOPMLKKKKKKLLIGFEEGIJJKIJIHIIGFFEFFFGGGECBBCB??ADILLLMOOOOMNNPSVURNLKLKIGFGHIKLMKKIHGHIJJKJIHIIHHIJKfp_VUVVVVWVVULFGGEFEEECCCCCCBBABBBBABADPYSHFIIHHHFFFEEDCBAAAAGTT_phQEJJHFFFEJS[[THDKONOPTYZ[WLDCDFEFHHFLOEHOQOICEGGHHHCPɆIdl^XUSSOGF[YDGHGJCffeot}|_EEIIJKKKJKK?Cjx[OWXQZ_VQIAADGHHJLNPPNMKHDSjrpt|e[bu_EBADEECB@????=====;<;;:8888:;;;;<>>>>>?@@@?>???CC@>>>=<;;<;:;;;FLLKA489:;<@DFGHJG>;>BFHF=6699:;:9:;<;::9;<;;;:88888754344689999:74356555566668==:<6789999:::98677665664344449>=:;>ABCBAAAA@:53445798768:;;<>=:78:;:3---.39<<<;;<=@<6;77788766675787558;<962/../.,,++6=:7((*4<96662/...-/16?HLJIHHGC@<1(*,+,042-,02/-,*((''(+13-+,-+++-AI?EJD<2++*+)7dY--+,,./01362,1;93.-.3.&*01,6FC:566898FB:*&).COjK@>:84-)**))'%(.?i_-!M_68DE;20015>4/PT3*---,)*,/132/,+,/00132-,27973333347:AFC?6:83112/*'*,+(,=C3&*0,+148@FH@/*997:8;=9332,')+++)((()**)*2:9MXE2.00/.,)()+.14,0=:/.459=>?EF<:LSSY^WOE62>835BG@0%%*:<.'Mh?%-,(**gghjmqsuxxxxxuogbabbdefijjjllmmnopprw{{||{yvvxz{zxwutsqnmmkihhhgghffgggjnqrpmlmmmmnorwz~~wplmoqoklqrquy||xuropqtwwvvtsrqppppprsqruy{{|||}}||xpifedeffggfgks|ypr{||}|}~giurgZUZ__]\ZZZ[[[ZZZYY[]_][]]^ab`^^[VORbeSYsumrn\Z[YY]__]\ZYZ\]\^^^_^^^]\[_mvsu|vfn~yz}|wrrqmlgjklkkjmlhhmqz}~xmoyo`grpptnfiprmkiiiijqf]eqŦ}}}uVTR^dfjutu{Wa`abdeghhdbbbaaaaa`acfe````aaaejiaZ[aehgfgnzyu{{||~{tnr|̴|{cmsg_[ZYTemS`tlkjlka^`][[`b`__^Z_cWUZZl`TbYXURSX][VSSTUVSPOLOPORTTSRPNLKh~eKFMQTVVVVSIAABDGHINQLFB?EKINYREFHJIIGGGFFEFFFGHGFFGIJIFIQSSRRKNSQQONKJKKKKKHFECBACGLLJGJMNOOONLJIHHGFFFEEDA@CGLMNOONLLLIHFHKPSUUVWWUQOMMMLNNMLLKJIJKLLKJJIIIIIKJKgxh[VVVVVXYWWSJEFGFFEEEEEECCBBBABBBA@ABENSJCFHHHHHEFEDDCBBBAAADRRSedQMOMIFDEEGP]aWJGKMKKNTY\afYICDEEFHHHJOMRWXXTGEGFHHGFFK˪RGjiZTWRPMGH\WDGGELGF|lZX\ajeNFIIIKLKJHLJ9AjpVOWSDJYZJDCFGGHHKOQQOMKHJYhhisq^_i\DBCBBCDCB@>???==>===;;:99888:;;;;=>>AAA@@@@?><::<<;:6556AILOOMKLLHFJRRPQP@6868=DC1Qpi]bfcfqsHFA:7865677667789<;9==6EC><:87567899;<=>===<;;<:9:<<=>?>@?>??>>=<;;:>cpplkkmnk[NA99;8889999999;<<;<;9:;;;;<;<<<;;:98988889:::;;;;;:7;=;8898877888777778888898888:=::>@@BBA@BC?8544557:<9568:;=?=87875;@CT_XMNLIFDB?<;=<3-./.3:<<<;::;<867677788655558:976777630.-/0/-*&/==:3/30289::74553.-/137=CEHHGEBFI=-(+-.2321100,))('''&(*-0.----,,,,0BM@3-),11*%4[a5),,,../0123.8A<6--.4/'(-0.-07=;9;><64AND1(&)3:82-3>A<0145440,)),+,.,,,**+/-*++)(*+++,+**)(&&&%1OYNF@CBJcn0*(%;J?/)((*@cU8766740-+))*&&&(C[I:#8gRLh[;11027<4)/>5*,-//.-/013552,,*++--*')0>=4/24337<@BMNLDA;5200.**/-'&3?4%*/17LQBCGLMC4058;>988520-)'*0.*(()('%&'*231?C=6331/,)()(+,2656;1*4AEHFCABHFHTSFHTY]TABFFG@@AA@ELE:875793,-/..0700C9*&+>JLC4;H;3365541,658JZV3"(2>9)$RbRDCFGHHHIMQQNMJHVksouhcleB?A?@ACCBB@>>??=>>===<;;:9:::::;;<=>>@@@@@@?A@=;999;9=>BEPOB>=<<<;:::9:;<>?>>?>>??=<<;;<;9RpsnllsubD<;9889988888789:;;;;;;;;:;;<;;<<;::988888889::;;;;:87:;<;:99977777777778888889:989BFJKC=<<>BHGA;9:<<;:87779:::9998998887543222213455557899979:997778;<:=EGEIHGEEFHHHHKJHGFFDA@BBCDDDDCCCCB@?=<>>@BA@B@?=86778889:9::;;98777656643444436;>::=@ABBCBAB?8666569;<:6689;>>=87764799DPVVPKIFB@=;;==6/...3:>;<<;::657577778876556755410///-,,,/0/-))5B>:5::6206>>:653/12.-/049?HNJCACGC7+*.478410/-,))**)'&())+,---,,,*$.?8++-+14..-1Pf@'+*++,-//-02CJ8-,+*+**0//1005=DCA@:/*5@91)(*03-)+3AD:,/23360*)/21.+&&*)')--))*+.--.-..+++(&%-:AWaVLCGSKO^'#+,*3;2(-*'&>`<368::30341.1:D72@:7OB'WbGpj1,,.0990--0/)*+-/-03333564,*(()++)('(29602556=CBBNWVRPE71//0//1.(+64(4KOMZeT?<79>>>==97987621/+('+031//01.*'%(,-2787640.+*(()))(/:;;=1&.EVN85<@HPSMC89;CUXJLNOQO@:@BDNK>88:<>:74.-241*(1/*'-@LI<32115:;==:2$+KenmN'(454.*%'341200;Afhlnpqsvxxyyxvurnlkjjjkklmmmmnoopqtuuvwwwxxxwxxyyxvvtrqonljhhfeeedddcbbceghjjjjkklmnosx}~zsqsuwyyxvx}~}ytqoquxyzyvtsqomkjkpjbbnoemstywtrrqmidcddefgijmkmruxxx}pnw}~kc|}xnZX]^`^[ZYXXXXZ[YYXX[[ZZ[[\^_abc\OTgdVcsgeyh\a_ZXZ\\\\\\[\]_`___^aa]\]_ekjp{{zxuvyzpflxu|vvyxwyzsokjighkmnliijkkjhfgikmheffhmmkjijkhedeghgfx}~{qbksbidop_[`cdedcbaabcbbbba^Y\b`Z_`__]ZY__\[^_dhhfem}}|~wnѻ~pgvk]_deqpctukklb^cki`_^\[Z[[[[[YYK`JWYXZZXWUTVTTSQUXWWZVQRPPRTUTQNPXgxzma\__\]`^UOMQWWMHLOOMMJECIKE@GYWKGHHIIIGGGGGGFEGIIIIIHFIKMLGIJKLPOLOPPNLKKKJKKLIILMOONNNMMMMIGEFGFFFFFGFFHKNMNOQQOMMMKIGGGHIIJLMMMLLLLMNOQQONONMLLLLLLLNMMMJIHIJLMNHU~}rcXUVUVWWVVTMEEHIIHGGFDDDCCBBBCCBAAABCDFFDEEEEEFFEEEEDBBBBBACJMOPPSaXNOLFDFGHGVe[IKW]`\UOY\_aibMEFHHHFEEFGRVVSDONHFFFEEDB͑HCHTc]UVVOJGN]REJIGGGG@XuOJPPPOQRMJHIIJLLKIGGHFAUocSSJ>AXdRDEGHHGJLLMLLJHb~sgmzR>A??>@BA@@?>>?>>>>===<;;:;:::;;;<<<<==>>??>>AAA<:::;<8F:6@KMLJKLMKJJIGHHHNQPOOL>946=H?7666MdkigfhjRE76797576666679899;977508??877867::;;;<<<<<;:88999<>???>>>>>><<=<;;;5@nuqkkvtP7899879876666679::;;<==<;;;<<<<<<<::9:;;:9999:::;::99899;;;:99877777887788888:::999;?A;57::::<<>>>CMKB==>>BHHC=;;<==<:988888989899888864443222345555579::9::::97766;=;AB?CIHFDDGIHGHGFHGFDA@AAACCCCCCDEDB?<;<<>@AABDAAB=9;98:88779;<;987775554443344328=<;=AACDECBA>966656:<<:6689;<=;8766788655=RUOKHD@=;:;>>5.,.3:>=><::85565666788777662.,+)(*+**)),/0/,*19=G?9;65303:<861--10-/3445:@BDGGDBB=4,-4:;7,(-11.,,,)'()))*++**+,.,,53((/0-20,04/BcL**+)()-/-)*6JH1,0*))(-<7,///3E@92/1:B;9IPA21.&7T3CEC@JXWWZM8//.24430/222DaqnhfU;00/0472,.121-.2111.-+%$/41249=7.+))08888885311/.-*''-44697/,A[R87ACHNNC6373.?ROIA70:;7=BINE87:;<>@?8..22,)&.,((+3?A3+047:<>@>4(+Myrg?(890*),-/124754=Egimoprsuvxywwwvsqpnllmmllmnoooqqqqsuuuuvvvwwwxxxywwvtqpomljhffffdbbcb``acehihggikklmnqw|~}yvx{{|~zvrqruxyz{xtrpnlihikie^]^^egfhfdbccbbaacceefffgghlpw|{~vmy~s`X\a_^\ZYYXWY\_^XVYZYZ\[\]]^`cd[NXke\dch{vb]c`[\\\\]]][[[\]Z^dcfg_]]]_cilnpqtqnlnml^uzw|ssxzyzy}tkiigfjnoqpllkjjjkkkjirxohijkigfhikjffgghfi}zcls|mjw^hdynjaf_dfcbaaccccb``^\]_^]`baa`_]]][[]`fkjgdqxrƠozaju}x~pY^hou~hcvxwxp]^fpj``_[YZ[[ZYYWWPYݢRU]Y[\\ZYXUUWWURSXXW\\USRQSUVUPLTdfaeebaed\TUWVWZ[SLMRWYTIFGFEEFFDEFD@JZQFFGHHHIHGFFGHIIHIIIKLLIIJKIHLNLJKKKMNNMLLKLLLLLLNRSTSRPNOOOOKHHGFFFFGGHIKMNOOOPONNMLKKJIIHHIIJKKKKLLKLMNOOOONNMNNNMMLMMNONMMJGGJLMOIHh~rcYVWUUVUTUQIEFHIJIIIGEFECCCBBDDBAAAABDDDEEEDDEFEEEEEDBBA@ADKRRNOQP^ZNJJFEGGHEIZ[OS]`bdb[ZZY\ehXLHKLLP_]LGRW\j\TYWNHGFJI;٩YFLEP\ZWUSIEER^KCHFEFILNOPNLMOMOW`d[RKGJJJJHGEEFHFCSf^TKC>HZTFFGGHJMOMKKLLGZqr|ogq~{CDCDA?@@@?>=>>==>=>===<;;:;:::;;:<=;;<<==>>=<>@@<;::9;6G7766?FKJIJIJIGEEGKPQQKF?<:2@G@34650B[wrlihgZB;88997665555679899954569FF=>769<759::;<=<<<;97788;>@@??>>>>==<;=<;<=>Baspjkve=7;9777766666668::;;;<>><;;;<<<<<<<<:::=<;;:999:::::99899:;::99887789997787779:::999::6228::;;;;==<@JKB=>>>BGIFA;:<===>>=:776788998788787765324445666679::9899:86666;>>B;7CIGECDHIIHC>DJIEBAAAABCDDBBCDDCC?<<<<>@BCCBBCE>7:<;:886779;;876754553444355216<<;952/4:>>><::8656666789856653-)('')*****)+.0/,-;95<9554565566541042+067765545;FKE@@?7..-/57.&+331.,+)''++*+,,*)*/452,*-03/,,+.44,4WZ4)+*)*+,+))3A=2580*+)-;:*-./2;IJ>3*'')*++*)),,+++,395,0368<;7310,'(..+/3-,4:1(2;:=A1)+,-,+-FL:-BXaZK8*+4:4*+//10))+%+4A0YP*7,%%,594,''**((4A>5277431-++++)()**)+1696642:EEEE?M]ZW[U;.-./1013569OirwsgWEA=>A:80'%&*95,*))*,-.185-.122;CB?5.28841379??<:71+()&'()/AF;8KbX>=EFJJJIA6515JRA2-'',.15>IG82556:>AB8.031+')/.*+*(,0,),6?A9')Txvi=:D3)')/8?>:9:859>fhmnnqtttvwwvvusqpnmmmmmmmnopqqqpqsttssuuuuuvwxwwwwvspomlkjhfffedcbbba`accfffghiklmmmqvz~|xwutuw|~}||~~~zvsrsuxyz{zxtpmkheeegfb]]`aa`^]]]]]___`bcdeeefhhhgfioru{qhrxywlb^\^__^\\ZXWYaa_aY[\Z^\\\\]^_ad_VbriZ\l{|l^]_^\[[\^]_]]ed][]bdeea^`_^^diiijmpmrwvrivxxrsrwz}{v|nefgfdioprsrqnlkmnnolis{qhhiigffgikiefiiien~yn؄}s|qt}z|Zge~p^_acdcbccbcccc`_a`^^_`_`_``acba^^^adfhjs{u~Ըqboq|wxyWNclu}wnabv~|vmkhgojcd`[[ZYZZYYWSVJsmN^YZ\]^][[ZUSSSSSY[W[^YTRQRTVTONT`b]ZYZ\`df]V\[SONMLMPQQPJGHEEFEDEDCDDJQKGGGHHHIHHGHIJMOMKJINQSSQNJIJKKJJIHJLLLMLLKKLLMMNPRPNMONOOOOOLHHGFHGGGILRRNNOOMLLKLLKJKJJIGGGHHHJKKKLLLLLLMMMLLMOQPNLLLMNNNMONKIJKLNKHUmxvqbXUVUTVUUUOGEHIIJKKJIHGFDDDCB@@AA@ABCDEDEFEDDCDEEEEDCBAA@@P\YUMOSQUVOKHFEFFGGELUVW]`accdZWXYagVMLNTXguoMGQW[ox[U\VNIGLNAYw=IHFLRWXQFBKGV^ECGFGJNKHHMQPSY]_fnoi`WLHJIGFGFFDDGB>Pb\MDCCGGEFEEGKNONKILLGUjqxggm]:CABA???>?=<====<;==<<::;;9;;:;;:;=;::;;<=>=<=>=<;:998>B5636?HLLKIJJIIHGKNPPOE=:8:@KA554533D_aspljj`E<5899876555557799:;62244>|bBF;HEKLF879;<=;:;:8878:=@A@??>=====;<=;=DILMToqhnnL6:;9767666667679:;;;:;>>=<;<<<<<<<<<<<<=<<<;::::::::::99::9:9999999:;;:876778:;=<:8764224799::::<>==EID>>>@CGIFA;:<<=>?BB<7767789877:9:;;843336657888999987777754665@DGLOLE?9;??96667768:7555555554444554349;;;?BEIKG=66555557:::989;:::::==98::9886/*1?IKKG@;:;:9:71039<<<;:98666898778754430,*()+,+++++*+.//,0:86002267997654328<3-6:751/0/04>DC?@?7/.,),000/...-+,*''-/,..-,+)/8:4/7951+'*0671-/M`>*,))+*)()*.246<;71+)-23,,-/05><788.)(',,*)),-)).04663413=>930//+'*.0/031/7=4&0NF:?4'&)+-.+61+(5IZ=,)*00*+*)+14754424AAFFB?;4//0,1KL>B>+&*)+2.-90Gj>&+)'/980++))+*(9US93797770+*-.,)*,,+-35/,,+-9DEGECWmi_^[@--+.+*-243;S_`gbTJLTOH?33004+)A@:>620++,-7J@00129@FH71;=7.)-68667;82-*++)&%+GTFAO_T>>CACFFD@745EO?*&'$*:A618>;31238<=BC91243,(+--46-&&()+/7?B>?@0!ߧUHNHHJPXUJFJKD\_BMSLOW[\_ZYX\bimlfc`^aaVJFGHHGFGFDDEACR_TFEEBABDDDEGLNMKIJNEWytciqi?>??????>>======<<;;<:;::;=<==<;::::;9899:;=<<<<;:9:876E=357@KONLKJJIIIILOMONF:867BO?=:97753Ed[dnmmlS969999776777777799:500135HqV9=?>;86533347999:::<><;@HD=>@@BFHEA<::;<<=BC=84467777679:;:71/0224568::::99986555445555=DB<5;DHDFGHLLE91@LHECBBAAABDDCCCCDEDA>=<<<;=?AEMSVUNCAA@:653567776556665555556566425:;;9983*)2874-B_I.-**,*((+.0258;<84-*+--,)*..-,)+D<5DE8?960)((),-5A3/GB-)+),22..*9kX*)+,-133210.-,*5RV92::9:93.--,*')...-+)%$-25;:5,*31(8U?/16;?H@2:???5,,./,04788604@;+"+MVC?JVN>BF==GF@=?CHQL7)*)&-HO73;:7745>B=>EG@9653,()(3C;.,/-+06>?;7<<-":er[F?9/('+3:CD=54569:bceimoomklnpqrrqqpppoopoqqqsrqrssrrrrrrtuuuuuuuvwxzxpjihgffffeeedbbbbabcdeeddeehijklmoqrsy~zumedhlihox~}zvttsssrooprrpkfccaabccb``a`a``_]^^_`abbcddfedefeeghkqpov|~wwz~|xsvldifgprlb]^_^]]]\]]WalgumZ]ZZZY[]^__`bbclmb]_er{n]Y[\\\]^a`c}vh`dcdcccdfhjijkptyvikgywysruutxohlkhghkpvvvxwurokfgjklb^gjhhhgghig^VZenid}|wk}gbghini^`abcdfecbbccccabace_^]\]]]]_]Yncbn~q~ïxwwmynuy~uskeqrha[XWVUUUVWW^fe_V_WYZ[]^\YVVUTQQSTV]^Z]\XSPRSRQPRVYZ^fe\VRQRSSZnhOJMNMNOONLQ^i\NLJOYZQJHHHHHGGHHIIHGGHIKLLLMLJLRVXWYXSPNMMLLMMMLLLLLLLLMNRRQOMKMNPONMMJHGGGHHFJTZTLKKLKKKKLLLKKKKJJIIHHIHHIIIJJKKIIHGGGGEEGJKKKJIJJJJKLNNMLLMLLMKKXtucUSUUUURNLLJIIIKKKLLMLKIHGGFGHHJJJIHHHHHGFFEDDDDEEDDCCC>GY`YQLJMSTSNMLHFFFFGGEKVVVZ]\\[VUWW\dZNKRZ^gJIRY__vzYWWTLHFIH=~@VSLKKRWQGQfbT`bRQSPV^fqj`bfihc^[Z]a]UMFEGGGGGEEDEDCR^NADB@BCCDCFMNMKIJNFPtocm|<@????>>?>>=====<<<;;:999:<@@?=<;;:9;;;9:<<:;;;;::988788F:16CMMKNLKJJIHIINPLNI>499BK@:=>:9975A^VYhosmE97:9667777777777877.-/024783059/7>VVC:<<<<;::878::;=>????===<::=>=;;<<;=<===<<;;;::;;;;:;;;;99889:;<=>==<987689=@??=865433479988::<<<<@DA=>?>AGIFA<;:::;=??=;88776776677642233235669;;;:99987643455556>DA=8;CEEGIJKH>8=FIFBBAAAAACDDDCCCEEDA=<<<<;=??=;?K`eVEAA=>>:7656666666645555565665357::/--+***4741//,)&&&(,0,-364.)+.5BLH=32.2CIC<:8-7WJ3531-*(*,/4>A<7860,**))*)*+*+*('.:<6>D8//+)*/0---+-.03.017:663.+,38868963//3A('*')++/)!+58::1,)'/7;77989?JE8*,GQA@BAA=@DAFLIIJMPNFC@721.(090589;><@GFBDGGC>:970*)3JK61421249:70-264)6dsZI;7;6.,.29GD5-26976bbdgknnkhhjmoppqqpqpopprrsstsrsttsstsrruvvuutsttuwyyrjgefeddddcdcbccbbcdddedeeffhiklklkjmquvusrpjffecdiqx}{yvsommlhdcglljeabbbbbccabba`______`accccccddefhhju|{z}~~|~uoprqqsla[Z\\^^^]_[Zbi}fb[YZZ[]a_``afbcjiecdiyzpe\Z]^^^_`eswqaedeeeehiijjjknqv~wrpklf]tx{wrrrrz~kqqmihipwxwxxyy{vqkknkhiihhhhhig^WWgmicfs̀u~oeijgc}ekpa]_acdedbabccccbaab`^^^__]]^]^_eit~xvyx{|xt{vlqggjsuf\ZWVUUVWVVWWah̀RYYSWZ[\[ZXVTTTTSQRUXZZ]]ZWRRRRQPRUY`ff_WUTQPRSN^]PRNPRTTRNLMU_ZQKHKUYSMJHHHHGGGHIJJHGHHIHGIOPMMOQTVXYWTRPPNNPQONMLLLLLLNPTRRPONMNRQOMLJGHGGHGGQWSKJJIIIJKKMMMLLLLKJJHIHJJIIIIJJJIHHGHHGEDDFJKLJJIIIIHJIHJLMMMMLMMKPkvdVTVWWVNIJJJKJKKKKLMMMMNORTTOMLLMLLJIIIIHGEEEDDEEECCBB?@O[[UNIDGRQOPOMHFFFFGIGMTOSZ]]\YSTWW][QELTZbrĐFJTY`fwz\WXVSHBDC@ܸX>>>>>==<=<<<;;::99<@EDA?>==;;<==<<==<::::::9876:;F84????>??>==>==<<<;;;<<;;<<<<=<<;;;;;;;;:::::89989:;=???><98889;>@??=9876434688778;;;===>?>===@FJF><;;:;;;<>>>>><:9;:;=:538;=@<77<:9<<:::99987435554556?D><9;AEGIKKF>>>;77;J]eXGD>AKNC8666766665555555545556459<>CFGD=545556666799789;>?;B^eSKC<;<98960,,)*4=CIC;;;:9983169::;:777788798789830/-,+,-----..--..../012/,-3;<:6675421,+266544440---,+*4>?/())*+(,03464/052+)-0,(2890**'0DC512207FF?434-1JJAG?8/**,-,.=F;/11-***))+..,*****)132:A812-*)14/+()++*++,,8=9<91-.2678::1,,25013:?6-182'(3A71,/1L>*)*')-,3/*/58=<8131+2;80++*)***13+)0,//0.-040,,'?iI++02/-230-,++,/6:1.157<=9310221+'*,,)&%*8BDDGMOGIaplbgoR..22121012-,=NQSOKIGFP\_fkbZVSN?314@MKD<2*(AK5*0:D:8JG9212/-)'.8<;207>@@LQM;;CB@:7<>=DTWC46?BCDDEGIIJJC601GbN346544476/*'(4<3Px[LFAADD>4221:G@2,17<6/bbdgkmmjghkmnooppprqqqqssttutssuutuutrsuwwutssrrssrqrrkedcccbccccbcccccbcdceefffgilmlkjklmmmllkjhgedddjry~~}zvrmihhgb^_bddcaabbbcccdcdcba``_^^`bcccccddddeir{yz~xsutsqpmd[Z[\]^]^`_`dsvjb`]YZ[^hebbaif]aiifdkpswzk[[___^_iu]lweeeggefiiiklmmopqrwuuyzvjZk}u|ywplo|kssqmjkpvxvwyz{z|ngjkhghhhhhijkf]W\mmmidgrtuiposzrovh[^bcceccaacccbaaa`_^^`b___^^]^VZ\crqqpsss}z}x~}|ͽfxpjopvwg[ZYXWWYYXWUUVQ֡cZ\e_TZ\[[[YVUTUVURRSSUY\`a[USRQQNQT]ig]XZVRPRSTY]WWWSTUVVRMKMSYZRJGIQWSOJIHHGGFGHIJJJHGIIIIILOPONORUVWWTSRQQPPQQNLLLLLLMOQPPRPONNOROMLKJHHHGGGLTUPLJJIJKKLLLLLLLLKJKIIJIIJIIIJJKJIJJJKJHGFFHHIIKJIIIIHHGFHLMLLMLMNLMcyfWTVVXTLJJJKKKKKKKLLMORVZ[XSNKKIHIIIIHIIHFEEEEEEEDCCBA@U^TRQJFBCMQNNPNIFFFFGGRPLMSX^`]XSTVW[VLEKSZbqqDKTY`hvQWWUSGBCCC=FHLRNPVSRLKaohp]JOnKPOMOUZ`efeefjli^MDEHIIGGGGEAK`NBDEEEFEDOOJJJKKKGDGU^mcz?@CBA?>>>>>>>=<<<;;;;9;:;;>DFEA@?==>======<=<;::99988969=B9;DOMIJIJJGIHIJKLLJ=;45BO?8:;;;;:;:95KWHQjvi8.7;:2/479877879999:80+,.11005662/36JR=<<<;::9877:<<<<=>??@@A@BGNVSMMJE=:@MmzJ3;:776667778777888:<<==>>====<<<<;;;<<;;<<<<=<<;;;;;;;;::99999989:;=??>><:9999;>???<:887645677658<;;::;=>>>???CGC<;<;:;;:;=??===>@@CHD>36@AB@=:>D@EHJLG<:@ACHGCA@@AAAABDDCBACECCC@=>>=>>=>>>=94@YgSE=:FTOA976886555566554445477457:=BDC=65654555666777658=>:BTTNLGBA=87971-+,--/5>C;;;;;;:318=<<<=766666678767730/-,,,--..-//...////0231-/5<;84357796./798999:94/.--+*1>C@2+*+-.,-57972:F@/(-0,,14640-)0:1%(.016<;2.-/,/CLFE:1.)(--)(4=3(*///-011131/.,+*,21);kj;01-*)13.+)*)(('()/=:8?7+.87507>8.),27229>;44:@:0+2CIA9./@9*+,.37611489;=8222,,3:6.+++*+*+24-)'/1120-040*2:.[d0+21-))*)((()))+/-+,049=;6326?@5,+,-+('.;CEGIMMEHjyihkJ-122/..0223;FIKC87@BALTTVVVWUTTK2*8P^SGC5)*1FE.*065CNA0,+,--,+,.>LD747C1UrhN><>?:;=>>G^^C/-1;@==:/+1:K\E,,6BJOK>52118?<0-16:6.bbdgjlligikkmnoopqrssrqrtttutstuuuuutssuyywsrqqqqnkfjsndaaccbbbcccccccbbbcdeefffgilnnllmonmlkkihgfccddirwy|~~}|zwtqlhffec`^^^_`aabbbbbbbbbb``_^^_`aaaaabcddddjttjgnyz~tfovmlrsi_[Z[]^^``_`dieaafga]`igcqyeW`eeeeffs~i]]__`_hlowmgfimhfgikmpuvqmqtqqswwpf^lsw}}nfjwtkrutsqnpvxwwxz{wkig`eniafihhijknmh]Y]rmsjbݟjfw¶^ext_gzh_ddcbbbbbaa``_`aa_`_]^^_bb^z~rnopnkpotsxx}|{}ɼ}kurz|twte^]YYYZZ[ZXVWTDsTeldU\\ZYZYVUVUUUTRRTZY\e`TPPOOPS]gdZVZ[WUUWWUa`TUWVVWWWRMLNRY]TLIHMUUOJHHHGFFGHIJIKNLGHLLIJNQPOOQTUUUTSSSSQQQPNMNMLLLLPOEJQPOONONMLLKIHHIHGKWXQMMLLMNNMLKKKKJKKJJKJJKKJHHIIJJKKKKKMMNMNNKKJIIJKKIIHHHIHJKLLLLLMNLMayeWTUUVQLKKLLKKKKLMLMMQW[ZVQMKJIHCA@ABDFFEEEEEEEDDDBBB@KdcRLKGCAAFKKMRQKGGGHHUVKLSXY\c_YTTSVVQLKLQYcs_EKRX_ds\XWUREDJFEDAIFIMLPTRQRNJ}xiQQKONMR^ehihfecafmcMBEIIGGGGFEDLWBDDFGECMOJJIJKJIGGIEFmkcc?@A?==<==>==>><<===<;;;;=>=====<><;;:::8789:87=>9=GMLLJIHGEHHIKLLK=776?KA389::999:::4GTB@W~k647<80+.58876899988975-)+,-.147632329KH<;;;:99878:<<<<=>?@ABCDHMRSOKGCBBAAFctK:;8576677678777778:<=>=>>====<<<<;;;<<;;<<<<<;;;;;;::;9:89999999:;;<<==;:99999;>?@@=:98764666667:=<=<<==>==?>>AFA:;<;:;;:;=>>=;GIHB97>@@CGDAA@?AAAACCCCBACDCDCA??>>>>>>??>;;5>Z`J<68GQK<668875665566555555775557;AD?8456556554556645;:8::>GKNOJBA><9773-++,-/03;=<;;?@945;==<=?:7656776776430//-,,--./.-//..//0002365337;:731234651376579:;940/..,.4>CIA7301875666549@;/*,-*-012420/2/'%(-03441)((*)/?PE2,(*(''''',/0,-3767?FE7-/.---.0450?ij?./-,,01-.1.)(((()4=23=2',=@7.2=620/394<<:3.2462-+226@HI>5+)./8JQA,1<2065//263/,**)*,2;;1,,23353/040*6K/CmA,6573,(((''))'%%&'()+1;<7327CJA62....+5AEJLHJG>Gk}sunG/4310//224.,-,051,((**0>OSI:0./15410233361bchllllighijlnoprsssrqqrtttutuuvvuuttsrtvvurqpoppmiffiicabbcb`abccccccbbbcdddefefghjjjklnnnmkkihgecbcegjov|~~~|{zywtpkfeghf`\]^_a``b````````__^_aa_`a_`aaabeccjlebmz}{|~yz~iafhjnsumea`[Z[^^^^^aaaajri]bxpizzcZ^ef`]^s~p`Z^ddew~rwpigitwsponosxytkkqqnprlb_bm}u{}mfkxvklswvutqquyxvxzxti[VYgxvpnihijjlmpo_X`smq~jbsopxsenq]m|ullhdbabbbaa````a__^]_bedbcw{|zkfillkkls|twx~volhz~|wrdbbYY[[[]\YXYMWRSieV[XVXZXUVVVYYTSVZUT^aSMQPOQ]h`VVWWWXWWYWX_YTXXVVVVUQMMOS]^RMNIJSWQJHHHGEFGGIKHJRSLIJJGGLQRPOORTTTTTUUUTRPONMNNLLKJRPBCNPPPONKJKKJIIIJIGQ[UNLMMMNOONLKJJIIKJIJKJKMNJGHIIJLLKKKLMNOPRSRPNLKJKMJIHHIJJKKKKKLLMNLL`wcWTTUUQMLMMLKLLLLKLORUYVQNKJJJIHE?;;=ACBCDFEEDDDDDCBBBTebULHE@>>=@EKRSNGFGGGRLKSXZXZ_]ZUUPVMNNOPPXl`EKQX_bp}[WUSPNLJJqmEGJFIGHQTSRSUL\os~YLONMPZbdb``b_YW\bZKHIIIHFFFD@EOGDEHKEEQOIJIJJHHHHKI@ejd|I:B><<<;<=>==@?>>?@><==;==?@>>>===>><;:9::878897:?;9?GNLKJIIIGGIIIHJE9:7?E=6789::889:;:5FP?9F`V456:6.))-477679989:857710/01258754345DF=;::998879:==<<<>@BBDFIKLOMKGEDFIF@C\iMB;5376688678877778:=??=>>====<<=><=;;;;;;:;<<;;;;;;;;;:::99::::;<<<;:;;9989999;=>@@>;:886566778;==?BEECA@=;;;AGI@:CB98:99::88853444558:647;8AIHA88?A==CEA???>@AAABCCBABDDECB@=<<====>>@>>@96Dc\B75999;;CPNEBA@?A=4/-,,-01/3::>;79;<<<32..0010.,,,.0331/./0-,--,059651)(*/7.6UM(%*('(,**()/:=:;;=CMSJ5&*+,,-266647B?3//.///.,/882,'''*6=102-)+592/1446411415676411.)&*4/(07BHKB::98LfP*3?C>71,/68412340-**)*3:<=7/07759:2151*6G0.bT2EB:4/..-*0AOZb\E@OM3%'(*(,6AF?521.*)*.9?><<>?CC>AFGEEEDEECBACIUaaVLGD@>=:?AABCDCBABBBBBA><>?===<>BCBAA>?@>>>>==>><;::98766677>@:=CGLKJIIN\b[X[[WL:47AJ?689889:7889;;7FH::>=945776.*)(.46877899::9:<;97765687679517A<::8897899;==<<<>@BDFJIKJJIFEFHHHFBDMTG?:5256798677878888:=??======<<<=>>=<;;;;;::;;;;;;;;;;;;:::::::;;<<<;:998:;;;;;<=?>>>=<;9776788:<<=@DHHEDB>=:9;==<99;<;;;;;;<==<9::<>@@=57<:@CGHF<;@=;<;;;;<;;:64443331432469FLF=??>??=96OeS;78@MPA68876666566655556656555;FE<6545557768:<==@KSUL=657/<[[OLGBFLG8/,--.//-06:;<;;>><=ADB=966888652.//....00000000.012322241-3<<:850...--.0,*,0234334652/.10/)(*++,.011469740--/3:;4./;C930-*.03--JX4%,*'*00/,)1?FE>7:ESYN0$%)+-/1200../-,-,,++))**2:92*&&+6<21/*)**++,.-1730..--.3:80..,0322,,-0.4IQTR?6SZ7+5>731.07820112.)'('*7=:<913><69?943-+4:+&Rb8;SSD6.+)''),+)*+,+*(&(/663;DGD?854644HRRUM@>AA82484973>JC633232/*5M\`]NABGB4**)'((.:9004310-*,676766:9ADDCHNG4*+(6hvN4@E?=6/--,/53231;JOLA/.=C7/9D:)-771///7>;5587cccgmmkiffgiklmprsuusrqrrtwwwwric_blqsrokijlmllllkjhgeccbaaaa``abbccccccccdedeeeeefeefgggijkjihgfecaadis~}}||||||xsppnhdbcffedbaba_^_^]]]]^^^^__```aaaabbaabbcceggdcfmuztostsqkeeu|dWZaagptutsmd^YY]_`_^__`bbcikcchgdfkceuvz|rm}wo|we^eiabyminpnr}|uqmhgilnlijloqsx|zwvuu|vx|agkjryyxqmoqstsqpvth`]\^sjeihijlmmf[rlqqrlomilkeaca`Yfjmkvxoifccbaaa````_^ekuyrn~|yux{}|vkb[\[[[^fszyolikstjUmصztf}hZ`abdda\XWPu{T]hm^VZWWVTRTXYZZTQUXXXX_`UPQSRTVWYYZYYYWWV[`ZWWTRQQRTPMLMPRSSSRONNOMJIIIIIIIIKKLKHKTUOLKHKOPPQPRSSTVVUSUSPNLKKKKKLMNKJHILNPPNMKKLKKIIIHHTZPJLLKJJJHIJJJHHIIJJKLLJKLKKJJKKKKKJJJJLNNNNPPOOONNMKKKKKJIJLLLLLLLMNOJNfvcXUVVTONNNNNNMNNMS[_YSMKJJJJHHJJIGFFFFC?AFGDDDDEECBBDJOY]VNHEDC@>>AIQSOKIHGJR[\XVTTVWXWTTYYOSVW`ns{ͼZENOU]djrlVYVOE?EKNMMLHGHIILTXWXSVd]POb``KOMMMMOOOOQQPPQOLLPOLLKGEEEEDEEFFJLHDKIDHKKJHHIJGHOIApisTGGECDDGIKKHEDBCDED@>>@DA><;>BBB@?>>?>?>>=>>><::::9765579@=:CGFGGHFHUpvzsR=CM=4=98889:8889:;;BB9:<83689973.++025877899:<><<<<<<9789878<722;<;:6A86688:====>>@BDGKIIIGEFEFHHGEECA>87846569987667788889>A?=<;<<<;;:9;=<<:;;;;<;:::;;;;;;;;;:::::::;;;<;:999:;<<<<;;=>=====;9778889:;<<=<<:;<<;<<;;=>?><:;<;;99<88<;9>?BC?;<<<<;<==>>?<96665320211129FKD?DE?<=>A@???@@@@AAABCBBBCEC@?;58=<;==>?=>??@=49SZA467DTK97:76776566655556566556=EB95445467779<==BKPMJH?65;7E^WJLMHFJNH8-+---...14;NMB;=;;==<<@EEA;66888641///////001100000/0222358843554430/....//+-6:972.06884.,/?QRG@CHD?ADB>:2-+)*-01/.2;><841/2@JB6/2AF6/,,**)+)&9YE(++(),./-(-<507B?:99731))./*#?bE6UO5/-,*''*00,-/2210*''/77;BC>>?><959KTTSH6210../02352/-/4798;HMC648;<<94BYb]QDB@:64/-,+)'(-.+,01041./4434458;<:612-(.??-#)9FF84@H>.-3814?3266KKIIMRG0&-&.qZ/,=OJ4+,,*',;A3+Cht`@,(261-.0/))351/04>FDA>:7a`\]ekjhecegimoqstsrolmprsvuqmfba`chkmmmlkkkkjjkkjihfedcaaaa```abbbccccccdefeeeeeddeeefgghkkihggffghimw{|~}|||||||ytqpnjeabffedcbbb_]]]]\\]]]^^_```aaaaaaaaaabcffdccegkrx~tnmmg]Wg}bQX^^dnuwywrlc[\faZ\^^^``abfdeeb^`fbtzwuuxudkt{|g\fin|{{}ysngegjighikljlqrqx}}ywrttw~}u|fcjhrwxyuonmnnqrpvvh^___mypehjhjmoqgevdpmlkkmmnnkk}pqple^^nsphgecccbbaaa`_^_fjquqx}zxzze`cbbchoqvutviWXcbarxwpf»|_PvɮnzqY`cdhjf]WUTPRW\fht{XVYWVROOVZVZ\XYZYY\ej\QQRSUWXXYYXXZXUS\`XUVQNTX\[RNNOOPPQRRQRRMJJJKKJJJJJIJPRHFOUQPOMNPPPQPRSSTVVUSTROLKJKKKLLNNKHGGJNPONMMMMLKIIGGPWRKJKJIIIJJJIIHHHHGGILMNJGHMONMMLKKIHHIIKNQQPPPONNNNOQPOLKJIKLLLKLLMMNNLKZxvbWUVVTPNNNNNMNNOU^`[PJJJJJIIIIIJIHIJJFCBBCEDCCDEDBBCFFCQYTQLGKKEBABFNRPLFEFKX^\ZXUVWVWUSU_ZQY_`jryѬTDNOT\dkjsUXTOBBHNRQMJHHGGHJNQRVT\cRMPGV|znNOMNNNNMLOQQRRQSSOPOLJIGEDCDDEFGFGCBIKCEHHHHJIHGGGJKAFxbIFFEEEFIIIGGEDBBBCBCBBDFC@=;=@DAA?>==>?@>=>>><::::9767525=9@:9:967:<80/,+-24444567:<<><<<=>>;9:::9:;:548<;9;VJ6578:<=<A??=;;;;:9;<>=;;;::;;=<;;;<;;::::;::::9899::::98:;;<;<<<;;;===<<==;:8899:;:;=@B@?@BAABA@>><<;:;;==<<<==?@@=;;<;:78<86:308:>@?>??>===>>>??=<8887521221138CGB@BA@@??BA??@@@@@AAABBBBACDBB@708><<>=??==???=97?QG344:KN?7:98776666665444666668<@<764344457<>>=>DKJC>>=:;@AEJC;JTLEENXTC.)-.,,-..3?IG=>:99;=<=CFE@86997531/////00011110011111235:;:72/++.111////0007?=972/27;93.-0>KD719B82328ADFA946553-*/9>>:72/4>@==<<@:-****)),,%-NN.)*(''((('(6AAA=938OK1F>3*-02-+,--,)()))*))+,,,052/-(*24--,/4430/010,)*+-+*-24.397EP78D?EPNJRS>./2>NXVN>17@<4230/8800/-,)'**,7@=3/6=830,&()&&((+&.UU4?@.,,+*('+362/02246/(&*5;<@?8>KG>86AOTQNE@CB9:PbkunH1/,,++./00//.146679>EE?:538;;K_^NEED;774-***)(+33.--,2?JJHD@8555327>92458>?4.24249;@JI:2445897:?;779@DEA?>===>>><=>=<:9:99747?;998557:2,)(*/45422689<=<>><<<=<<;;:::;;;957;;5K\Z:679:;;;=BGFEEEFFFGDCBCEGIIIIHC;223578988976;=;:9868=>>@=98:<;?GGEA=;<:;===<;;;<;:;;;<<<;988888999:;;<<=<<<=<<;;;;;;;===;:::9;;<<>@B@@AA@@@@?>><;;<<<>>=<<<>?ADA<==<;8797:?>@BEFFFFDB@???>;;>>?>;;:753344336=CB?@@@??>?BB@@@@@@ABBBBCBABBBBB<0/:><=>>>>==>@@=<<:CI7157?JF88:8777666654335668878:;:875434448>A@=>ACA>===?BAA@?<CCAA@BC;327==9/)*/-/COD93,*)**+),..(&?T;%')'&&''&&2@=541,,49/.,+(,12-.792-+))*++*+-////0232-+--/DH=?A941.-++))+.-+++1BOG5>H''EQSfiPDTZE31+/;DU^XME@611018822332/+,,*.;>61485131*&&%(('*)'EZ9'*('(*++)*2752111231($)3>?@?>FNO:05BKIDA?=95215:DX`B+***,-02200.19;9999@D>89:9<>@=9;:;;5/1:GQJ85>ACGCDBDID:/,5=;8679;<=FUT@<8.+-(/Y\2$(--'*-(&))(.CN>7nM!(.($%'()())'(.589@INMA6/^]\[[^aa``adgijiihdbbefggfdb``bbbcegghijjjihhhiiiiihgfeccbbbba``ababcddeeeggfffeeeeeeeefghhijhgghkkjjijnv}vsx~}}||yqlgdcbbaaaaabbaaa_^^^]\]^____`a````aaa``````__accdefhr|~vtw|{zva^da[Zahnuz{zvu}cVYajmpljqpsquj_dfbaeknxoklkighgghfgjmmosx{{{xusvvpsxxhflt{{vrmhlomjiifhhcamzwmghjijkkgqrhknmnrttv}vvs˘rcccedbaaaabeefijlkgoz}|}{gfimqzq\[`fwSS_abixxs``]_fxputwxuw~ra`elnf^XW[^\ZZZ\]bw]f`XOJR\^^`^\^[X\^`aZSV]][[YYYXXWUMLY^WSQW`^\WRPORSSTTSRRQPQPNMMLLKKJJIIIHPUPLMOQQPQQRRRRQPNPUWVROMMNNLKKJKMNMKIIKMNONMKJIJJJIHJMOLJIIJIIHIJJJIKLKLLLQUVQJHKOPPPOOONMMLLJIJIKNOQRSSRPQQPOOPPOMMOSTNMMMLKMPONVim`VVVUTQPPPPQPNR[YRMKKKJJIJIIIIKKJFFJIAABBEFEEDCBCDEFGINTVUQNLKLRMDCFHLMKGCX[TVXWWVVVUUUVZaZVZ^]]eqLGLPW_efloWWTRPOONMMLIHHHGGHJJHJ[j]RSOKJGADPYWOPMOQPQPQTZ__\Z\_adbSGEFGHKNMIEDCBKLAABBEHIHFDFHFLWRBHRMOIEFEGHGEGFCDCCBDDFFEA@BCCA?@CC>>===<;:;;;<<:99:99567TqztiWGGQ^^QHFP_fnw|{uy|z|{uP774348<<86789;;98774354-.-/2344326;<====>><;;<<;;;;<:;;;:56:=7NTG;8999;;>BFJE=<>DFEEDCCCEGIIIIHC:/1356898787=GLIEC@<=@A?A>;;?CDHKGBBB>89=>=><;;<<::;;;<<<=:8888899::<>>>==<=?=<;;:;::;=>>=<;<<:;>??ABAAB@@@@@@@?=<=>>>=>><<=>>BFB=<=>=96:;?DFKMMLNNKEB@???>;;>?????=85455535::><;;?CBAA@@@@BBBBCCBBCACA:2.5?>>=<>@A>9<<:B>4589@G=588777665664445677777898898754458=A@?>=====?ACEDDD@>G[f\GBN\`TGA5.+.0/1224:AE9;;;;66>DFC;578630...///001233110122233341.--.--.0012553433670,-)*045861-571,(()+-..0126:<:<<6,++*()*,*-,,/33,-8=6-+((+,,+*),01.,,/231,0D[[F>>942+%(&&*+..++6HND5)+0)$-EZopS8:N]H*&'&-9ALZbZE/),1358;::93-..,+3<<68B?:BH?2)%,20,*&5RF+&(''*./.+.5643422391+.4:=>FEAEI5(1<=85200.+)*(&(6E>60-/02320-.0358:;;;?CFEEEC@:8766962033+),)%'5<=FOW__[XRE6275:CB5+'&',16;@B>86:AA4+8GHMLKVUPWV@/,-2789::;JLH@7/\\Z[\\^___acccbccbbaaa``_____`abcdfggghijihhhhiiiiiigfgeddddcaa``aabbbcceeghgeeefeeeeefghhhfedgnqjccdgiow{yutxzz}}|{xpifdba``____aa`a`__^^]]^^____aba````a`___``___`aaccdju|{|upy|jceaYZ[bmssy~y{}m\W\enrnmu}xvqllr~}b_fc`ddiu}vjijhggfgggjopos~zxuvx{yoxckvwvusnjmomkjfcdhgguvhjlijlkjhekmnnnnsvxzww~qecfecbbbabddefghkkidku~tv{}|geks{zzo\ZdgoVO[`cm}y|ufa[]Tkx|xvzqa`dnrk`XX_`\ZXXZXTa~`icXMPXXYXYZXYY\]\a^UUY\[ZYYXWVXWJKVQSXS]h`SRSQQSTTTTSRRRQQPOONNMLMKKJJLJIQYVONQRQQRRRRRQPNOTVSOMLMNMMMLLLLLLLLNPQOOMKIIIJJJJIIHIHGHIJJJJJIHHJLNORTTTSTMADOQPPPPPPOOONNLJHGIJLNRTUUSRQNMLLLLKMOSSONMMLKMPPMO^g`XUUSQQQRRSONWYXSONNMLLKKKJIIIIJIGFKGBBCDDEEEDCABDGJKPUWVUQNMKJQUMGEFIJKGAimUTWVVVVVUUTUZ_WSRSRR[noLILQY`ekw\XYVSQPPOMLJHGGGFGIIJECYbURTOGIPJHJ?S^JSOMOPPOPSX[[ZZ[]]]d\ICDFIJMOFCDCIRH@GEFNOMNKFFFHUTC>KnLKNIHGEGHFGGEDCCCBCDGFDB@ACB@?@B>;;;;<;989:::::77::54ABYuy\GESXQLIGLZemzyw|~|Y<779<=>;9<88876664011/-.15953345;>>>===<<;;;<<;;:<<::;;:54::::;9;::89=AFHHD?98=FHFEEEEEEGHHHHGC;1257799::99ESSPLJJGFGGDCFIKIIIFB>>AEC<:=??>=<<<<::;;;<<<=:887889:::>=A?====>=<;<<<;;;=>>>=<@BABBAABCBBB@?>?@A@>=<>@@???=<===?CFA<;=>=86@GIIIKKJLOOIC????>=?>@A@@??@=745433422=A>=<:869@DCAAA@AABBBBCCBCCCD;/-7?A=>@@@@@>=>@A?;;<::?95989B?438877656665555676666688::;;85468>>==?BEFGE@ES]\dhZGK][JCEC;1)*03205JQH;==;<;06EFF>67852/.////0002343110122233221-,---04776677654221,,120.-/22-*9<2+')*,-/02457:;7777BTTF>9;?>:6/(%-EH3)+-,-/.+((*+,,(*GT;./..5;6026;1,+***)*+,035563,.<@7/+((,---,().1/,**-0.2DRRQA87656:4/-,-.--19A<1,,34.+(')KwrOE9.@QA0.0395..?PXSJ9/.39?B==<3/..01468BND;HJ;0))2=;2,++EWC-,-,+0320.3655568;655542,*122499:=@DJOROG;0/...-06<>>:645=HI=4484,&.ELIJY[KDPR?0./48879>BBHVR7*25//20054-*((03*&11&&+'%@WYfmZJ9--,*+--*)&'))('+>KIA950Z[ZYZ[\]]^`a`_``aaba`_]\[[]___acddfggghiiihhhiijjijiihhfefecbbb`_aabbabbdeddeeeeffffeefeedeglqw~~rdemomorqoquuuy~}}{xwyytmidba_________`______`_^^``__````````__^^_]^_```acjoqsuz{nmqv~nhhgcZW^eegryyxwrjacglllkib\Ybkrtsnjsogppn{hgiiifghgipwrp}~{zxuwswtvtrrqpmnqrqoicbgrzwgjlijkklnjowspollljgxyndabcbbbbbccccfkorqmrtsjn{~{vgcgt}qke_bgp[UZ_ctwr|~lkbZ[cZh|yxtokc^]cpwqbXY^`[YWVXXQRn˲pgn^NPYYXUVYZUSZYW]_ZVWYZYYXWXVWWOPSJMW]igYQQRPPQSTTUTTRRRQQPNNNNMMMLJKLKGJUZVSRQPQRRRRRRPOPSUQMKKLLMMMMMMMMNNMNOPNLKKJJJKJJJJIHHIJKKJJIJHEGMNNQSTUTRPMHBDOPPPPQQPPPPOOLJHGHIJMNQUWWTSPNMLKKKLMNOMMMLLLNNONOZd_XVTRQQQRSSPU]WNNOOOMMMLLLKJIIIJJGHKHFECCDEEDDCBCFJQUWXVUUQOMKKMPMGEFGIJGES]XXYWWWVUUUUW\^SMMOQT_scLILPZafuYYYUROOOOMLJHGGFFHIIJCJ]SMSSTOIHHIIFDjpJRPNOOPSTRRTWYZZYWSXUJCELOMLKECEEMKHIMOQSRPPONKHGHECDCcuHKNLIGEFGFGFDDCBABAACC@@A@B@@AA@><::;;:879:;;::878:;S`]UXlvz{YEJMNNLJHMYdr{`OIGGFGGGCEFHHA765210.,).3543358<;<=<<;;::::::99:<<::;;954:8604;;::9=CHIHE=;::=@BDGHHC???>=<<<<<<==;<<<:9777889;:>@>==;?IJGCBDEDCBBA@ACDCA?>>@@@A?;;<<<>CEA>;;;;64>?@@BCA><=??:54434108AB<89:75;@CCAAA@AABBBCCCBCCD@3,6BC?>@@@@@@?=>?@?<::;8::7899<>726878666655555676655569;<=>:5356:BEBA?>>???DHFFC@Wnm_fkhSJY`QBEIGD6,.2203KUHEGB;:<00CHHE=9:71/.///00001232110122334322/..-.38:;;:76554452007=:0)+12,*8;40'))+-/12320..5:=;=;1,,/102>ID78;7,()/5=B>1212SW7*/0-0895014468:=BGC1)/111-'#%'(*-/-,+****(')*++-3788755552,.5558;;88>AENK=8<==;69JVK@?;3/06>??Ma[D93;B910136988?JJJL<+,-*(&&))+.+*123-+DYE)%+*#&Gt{[=011-+,-+'%'((%%.>GE8022ZZZYZ[[\]]^`____````_]\ZZ\]^_`acdeeggghhihhhijijjjjjiiihfgebaaa``aabcaacddb`cffffffgfddecekusoutpppoonjhnwzwrpoomnsvtqkeca^^_____`aaaaabbbbb``_____```___^_^^^^__````bdfggku~{onnqzysoohZU\^\^hpstutojijjmmd^Y`}}zplj^brxxfkmkfgjghnttml{|yv|{~ystttssopttqnhcdfzrhlljklmmljsxspnidcb`{|xhcacdccdbcjpppnpuvslp||ueecblsomdajxbZ\^cssu~prshd^Zae[Yrqebb`_]ZYYat}ueYZ]][XWVXYXSZ}difRMVXZ[VXcf]RQW[_]XWXYYYXWWXWVY[\VKRlpYPSSPNNORUXXWVTTTTROMNNNMLMLLLKKIHMTWWTSRRRSSSSQQPNPRPMKIIJIJJJKKLMOOMLLMKJJIIJKJJJKLLLJIJQMJJHHHLVZSQSQQQPNKFCA@DPRPQQQPPPOOONLKJJJJKKLOSWWUSQPMLMLJKKKKKLKKKLLNNMU`^WSQPQQPQSQX]XQNOPONNNLLKLLKKKJIHJKKKIGEDDCBBCCDEGLPVXSWXSQOMLJHGGFFFGGGGICPZYXXXWVUUSV^_^RNNQUXezybNIMPXbhsXYXROMMMNKKJHHHGGGIJHFZYDKORWSIDEILNKLLNOMQOOWXSRRRQROKKNPW`gqseQKJJJFHHIRQSTSQQOMLMMKHEGIGAWx^JLLMLJGFFDDDCBCAA@@?;>B?A?;B@AA@>=;<===<;;;;;:87985Gm]]^emweKEINNLNLOUY`kywegysaRNMMLMMKPUZZVD7:DEEFC===:6548::;;;;;;:::999:99:<;:::;;66:3139;9:;?DHHGF@:;<;;=DGHFFFFDFDCEHF@8415=<99885ACGHHLOPKE>?=;;;<>??>=<<:887777778:D;@@?>>====<<<;<<;;<===><66AILGDEGEEEDCCDFHHFCA@@?>>?=;<<<>ADB@<976447<@?>>?AFMQRMC=>?@BA@A@@=<<=?=9545415>???@@?>=<=855649CDCA?>>??@BEIHDTpymbghcXQO[`KBKLQO>.-412DNEKP@6:<0*>MGID;:71/..//000111222122334455541/.0259:;=<744458:963586/*-33/,6423+)**,../0/,)3>74;=?=:99757>A7+(++((++,-../021-*085+,GI.%*)*+054210.,+*)))*(*5;628743210/+(.445=>1+268;9888:9.----.//-013@KMIRWM;25:97:6/+)))'6LE/)**%*:GGE@5*(&%$&,9JMAGRG77792+*,/16=<2-/.)'(*-.08>22=*:XH*)0039>;54447:<=@A:01640-,)'&%&)-/,**)*++++*,/03:7113435753778888=ACCB@BFB4)+..*'&)0;?=5:GF=7:?966653-***2BJH@=ACDBAEFIOJ=57>BBDJPUO>321,/637P_P<:606><2.0.1446;EHFA4+***,,*)()().54+3N\L6-,+(($*\qB83./.,+,*)'&()))08>:.,02ZZZZZ[\\]]^____```a`^][[[[]^_`aceeefghhhhhijjjjlmkjjjijhggdb`___``aaaabdba`aeilmlhggfdfkosz~xusrpooomgfkmkiffgfgikmligedb`_____abbcceedccddbb_^__`````__^^]]^___`__accddflxysqqyysoh[W^^YY^aacfjnolikohcrrkibZdpinkehjiikknmgi~{yxz}~}psrw|}xqqspjjcadeu}{pkmmlmmnonpwrouoidddbczxtz{}tdageddcdjqrpoopqrqnn{zlcec_Zupfbbdho}j^\\^lyxy||th[_dg^X]hkhd_[YWXYYYYW_ukX[^][XVVVWZZNcx]ofQOSZ^\W\sqVT]^a_ZVVYZXXXX\\\\\aWRgucOPRQOMMORUXYYTTUUUSMJKLLLLLNNNKKJIIPUVUUTSSRSSSSPNMMNNMKIHHHGFFIJKKMNMKKKJJJIHJLMNOOPPNQQOOMMPSV`hfWQRNJJKKLHBBDACRURSRQPPPOOOONMLKJJIIIIKPTUUTTRQQOMLKJKKKJKKKLLMNS\]VPNOOPPQQPRSQPPOPPNNNLJJKLMMMLIILLKJIIIGECAAACDEGIIJW^[WUSQOMJGEEFFGHGGGHHQ[YXXWWVUUTWaa\QRTWZ[isaQLORYbkpXYXQNLLLMKJJHHHHGGIKEI\RFMMPVTKHLOOPREgǚZMPMONOUXTNKIMXbipwx|~dRKJKJJQGIRRRPOONNMKKNNOMJFFEMUNMLKLNLKJGC@=?BB@?@?@ACIJJF=C@A@?>==>>>@@?<;;99989:2Eumedae^IAGMKNPP]dVKKR[^Z_^\NHJWWRPNNMKJIGMSXXQ@:JV\ae_WPH>:6>=<=<<;;;:::999:99:;;;99<<8781/18;:EHGEEEDCDGFFC<423=GC>;86>LRMKJHGHHHILQNIHHFBCCCEIJJNRWYR??A><<;???>>><:66667789::A>=?@?>>=>==<=;<<<;=====<748@HJNMHGFFEEDDGHIHHGEC?>>?><;;<>@BB@<8653249>A@@@@BHMRPE>??>?@@@@A?>>;?EB88=@CBAA@@ABCCCCDDDEEB<2;HECAA?>?@A@>>::==<;;;:877778758:8798755555555534444578;=<:75774IGMJ63:=4.;QGGF>:720./00001112222123344555652//25788;><754468;;82//,*+.120.1-+.+*+,++),0/-2B=/-03776786435684+**(()),.../020-,299-'>K9*.,*,.342/-.,*)))))'%*/000010..02-(/656@D>12;?A><;;;89730221/-+)'-=VYV\R@IXUH=71.---..,7:(%$)(&(5IM<,((''('#$+7Dc|\<242/)()+.10+)-)&%%(())()+',<0(CR9(+/49==;::75:=>=;:9>@8/++)(&%%(,--,+*++-./-.366:80/2335778:987970352//11046119977ADA?GOLB94128HQORQ;()010/5O`K67<926?=621.))2;=;41.)()-.,+*)'()''.636GA'%/1/.-,*2xS,64,+,,+*)(''(+-+,2754510ZZZZZZ[]___``_```aaa_]\[[\]__`bddeffghhhiijjjjknnmmllkjhgfdb`^]^__^_`aaa`__dlquwtpljjlnrtx~~zy||wtrponnnmnnhegfdeefgggecccdffb````bbaafgffeeeeddca`__```_`__^^^^^____`abcdefm{~y{~vzrnu|~}tnfXY^[XWXXXY]cgihgosl{~sjfbd{polehhhijikqjdxywuvz~z~xprpu~zqswoii^\bcinvwnjjlmnnpqruuim}pcbdec_]j|}~rs}{uu}|t`_hfffbhpsomqsrponnkr{|rehfc]Qrj\Zcgejvp^]Z`o~{sr^clf]]aa[X\[XTV\^^\YVWohX]_\[YVVWXZ\T[ybho_SMS]\TRbjcba_ab^YVYZXY[Z\^_YUXUpoMNTQQQPPQRTUX]YTVWYTMIJKKLMMNPPOMMMNSWUVVUTTSSRRRPNMLLLKIHHHHHHGHJJKLMLLKJJJKKLLNPQQQPNKR]QSV^gipwhWKMNLLLNMLGA@DFJOSUTSPPPPOPPPPONNLLKIJJILOTUUUTTSQPNKLLKKKKKKLLMOUZZTONNOPPPPPOOOPPPPPNNNMJJKNNMMMJJMMKJJJIHFCBAABCEGFEFVi[PUURPMKIHFDEFGGGGHFKVWVVVUVVSTY_a]SW_`ceweTPQT\eij|VYWQONNMLJIIIHHHJIILGU^KHLKKMLKQWUQROQH|ıfNQPPPPPSNNVbvnZPLLLLRWGIMMLMMMLORQPQSSRMIKJILNNMLLKJJKLKG??BB>>@?><997799:;;D_zyphYIADGMSUVckYFBGJLILOQMFBCELSTRQPQNMRRRRTI:CT[\`b_XRHCAAB@<;;;:;::9889999::;;99<<67932389:<9518FKE@=85FTMGFD@>@BBCEHGGGHGFFGGIILNPTSWZH@CBB98?>?>>?;887667789;:<@;?@?>>>?>=====<<<<=====;9:=>ERTLGEEEEDEGHHHHHIGB@>?>;99>>?AENOC=>?<;;>ACCA@?>BGD<65544?B@DFEB<;>ABCBABBCCDDDDEDDEB?:6CKEFFD@@??@?><;;<?@AELNDBd~}qdfhaZVSRS]GAPTMFH>224:MPF;655683:NIFF@:631000001112222223333344320/0235:<=?;32554577761..,+--..--,*(***+..-*,.02WomaD1,/-,51./44*)'(+2:67C9,))''&(),('8etTZP@4(%'''(*./-*)),/,***))&#&5:).LJ4,+27899;?<88:>>;;==91-,,)'&&&)-11,+,-,-0002466752222356688756;CCB@@C>/%*8B>868<@CDB>DF<0399625998668AQ\R8/65320127>@GKKIHD8/4HSOTS7&*--,9WX:09>D=17>:564/)&098.(''().63*'(((&&*,2?E93B@-'+06/+.#Gl@.84.*)))))(()*---059:=<71ZZ[[\\]_`a`aaaba`abba_]\\\]^__acddfffghghiijjjknqqpnnmkigedc`__^^____`a``bflquwxxvsrssnkjowxwwz~zwsonnnnrurmkigfeeffedbcddfhieb`__```aeffhiihghhhgfdaaa`_``_^_```````aabccdcirronomltz~wmsxz||tmk]XZZXY\]]\[\cecoxjd{~tic`rxqiiigiijkljivotuw{}}z{qqw~{quvojg^\aaenyvkhiklmnopqnsogrr^`eecfd][i~yszyrrzwtzi``fgfcfkmkmrrplmnpmnr~jaigcW^e]^igcpxbZ]o|tsziefbcb^]a`Z]eimoke]YUNae\ba\YXUUWYY[]]i\gi\TQ^aWQXeig_\cd_YVXZYZZWZ_aYUQeXMRTTTTTTTVWVXdhYV]]WOIIKKLMMNQTUSQUZWSUWWVTSSSSSRQNLJKKIJJJKKLMLKJIKLLLLLLLLNOPPQQQQPOLMPX`kt|}|}dGCGHILPW[^XTOHFHKLNPPOLLMNOQSSRRRQRQONNNNOPTUUTTTSQQQOOOMLLLLJLLMOTYYSMMMMNOPPPRRQQQQQPOOOOMKIKLLMMKKOMIJJJJJFBBBBBBCEECGT^WUTPPPNMKHFEEEFFGGGFFLTVTUUUVVY[_a^UakijvjVQRT]gefwUXXTRPPNLJIIIHHHLIBELdY?JKHJHFKVZYUSQPPNyLSPPNKNY^nrYKLNPRVZ\OGHLJJKLMOSVUTTSRSRPOLJRSNMLMNMIFJORQJBA>8:@@>:77679:9=MUWVWVTPLJHGGEA@><;;::988899999::99;:5788888999;@FFEC?;:9998888;CFFDA?AA<9788:BJG?;;65DQMIIGFCDFHMONKHIJIIHJJKKNPRTQPYRCBGG85@?@???=9975566678:;;>@?>=====<<<;==>>==>==<<==<=;864449=><<<==>BHF=:=><:<=ACCB@??AEGA85559FACFEFD?=@BABAABBCCCDDDEEEC?=9=NMGJKGC@>??>><<=;=??=;<<96569::86555553566422233249<>;78:;;;>A?86>B>?@ACINNACez{tcZdjf\YXSUN@BLNGFB3038DC<7868;;26INIF?94211110101112232333444553-*-4524=EE;-)285234434333//55652-)''&(*-1440.,/8B?2=ND76BFA;7/++/42/,)((******+..*+7EF:/104BE8,*-*+:54;2,())*++0/+)*('/469:3/3,&/25DIGFB=BIC<<<89??7149Yxw_=-*-.142+/40++1568><630+)))*-37<5,9SW?HVZR:'"$'((281)+-285/,',78-'0A9'9OD0'-010.3;=;9:?D?8840.+,,+')*+,263,+----./01123554221246566526AD@<:?D5$(5>JM@99@D?;:;@?6230.5=;:3,//.-/454-,-+++170))*))(.BA<87767;=5Hwzom_baage^LCGMRVRY]`fdXPSSUWXZ]\NGEEEGIQVVYZVXWVUROLE@LTVURPNKJIIIJLQQLF==<:9888988889988:978889889999<@@@?<9988777788<>>==<;<;:9:;@FG@;::85@PQNLKLJHJKPWZWOLNMLKLMMNQSVWVU[RBDHJ@=AAAAAA?;976666678:::;<<<=>@?>@>==><=<:;<=>><=<<;98?HQTKGGHHGGGGIKMKIHFEB=<;;=;=<>>=:854579;;:;===>>:88:<:<>>@BCC@??=?EG>547AFBCCDFEBABB@@AABBCDEDEDDDB=<;9ANKKLLJFB?>>>>=;:99:<>@@>?A>967:9777655555356652111126;>=878:::;?A>:;<@@>@@ELLC7@futt[Mbmh`^\\ZVH=?Vk[A3/220;?969>?>96ISLF>53211111111222232333434664/-177/0:DA/(0543111114562/28>BCA9/+))(*-.1110102<=4ASMF>7@LF;6300210.**++,,+*()+,*1?E9-4DH:;C9,)*)0D<0<@71-,00+373./.&'285><37>;105;BNVNNWVXR^thWBZ{L41-+../.,/.-,4>A:66896-*-*-4@><9@H9'1==JSB79AC>;;A??@A80/4?ACDDB@??@BCBBDEEFLSQMKJHHFFFEGHFFFOYUSTTTUWZ[]__ZjqvxbQORYemlqhUWVSQPONLJHHIIFGoyVL\ZXUVTRSUUTTRSQOEOrcMSaǮeRP]ddc`\YX\^SJLJQKIJMOPRPNNNMJHIJKKILQQPNNMPMIEC?AFFE@>=;CPLPNPLDGGCBAABBA??BA:77756;<7P{oijd[]\`cZKFNVWWSY]bjiZTWYYZZ\XNJHBABFHHVYXXYY[]\ZVSPLNSSRONLKIIIKMPRTQLFE>9:998988888888988999:9999989::<<978888888::99:;;;;=;:;==@@<999996=OSQOONLKMRX^c`RNRQOMNOOPSUZ[[_hT>FHHECBBBCBBA<987777778:::::;;>>=<;;;;===<::::;9;FPQMLMMMMMMMLLJFDCCC@=<<;;===?A?<84556899;;==;9888::;==>?ACCB?<9:AIF<6=97::;DNQPOONID@>>>>><988:;<>@@BC?969:7446555444456641022137>=8668988:=>=;=?>>>?AGMF835PmoeVO[mnfeebbaR@:Ijz]=73/1;@?=>@BH?6IVOE;31000000111233333344434785105::3/8:3.265221/.-/474-/67>GJLF3.1,)+-,*,13542278FSQPG3>RH96542100/,*+,,,-+)(*+/;B9)-@E?:8=8-))&/@5'5D@=9434,+8:3120(,43M|uO6(+-)1@Mt]?E@>A9-9HG=-2;=95200=OSG73=8GNHF=7//=MWM8*$%((+.'/>=5.(*4:7-'-BD/)/+)('%&).353/07<988:5+(*,)-0('-540,,,-,-++,,,**-/.1679:6.,,/04=@A=:BD/*8>>FJ=69CC<9:;=@IL>2149=;78=CHJF=40.+*+*&4TZ>9LKLTUURJ@0*,-+++6PR5(8?70+/587840)-11.,+*-.(&-341,..+*-49<>8AYO6-8fp=)..,*()),496/,*)+-,-.364.*)(&0F[[]^`acdefedccbbbabbbca^^]]]^__aabcdddeefffghihe_]`aaabbcb___^]]^]^__`bdfhjnqtvwwvwvrqsromhhq|}yuqqw|{xsokgdbcdeeffffggffffffghhhijkhd`^]^\Z[\\[ZZ]`dikllmljjgc_^_`aa`bddddbbcccdeb_^^aed_bp}}vtvvvwvvxp\Ypxmsxye`dajvzqq~sv|zokkl{phoy|snlnmnsuw}yq]\^`bdbbbcab_dhjkllmlkdrvbk|~u[bcdcdc`n~xxysihgffoutoooopqsrolheikj~xlea_[\diie`aba`__Z]Z_]S|iX\__`eli^evth`^wvi\VVUSTYclljh_ZXVX\`aa_ae`r΋ScNCK\if^WP^tugbbZXZZ[YYTPOXTUwMU]XXXWVWXYYXWWWYY]]\_ZPJJNMNPKJKLKGFHJLPTUTUTSSTUUUSONLKMMNNOOMNNNMKIHIIIGEEHMRURPPPPONNKR]mheveMLX_kkc`^]^^_`cggffcYWOLIINTUUUVUUUUWWVUUUTSSRRRRRSRRSQPOONNOOPPPRRRRONOONNNNOPOPPPQQQPNNOPNHIGBBJKKKJHECB@?@BCDDDA?@AA@AAABBELTRMLJIIIIEHGFFFGLTSSTTRSUX[]^^Yblqvwvt_QMOWelm{qYWVSRQPNMKIHHIJEJocKSRRXXWVTTTTTTTRRQRQYiƾdMKTmtmgeb_[Z_[KKMITRFJMMNOMKKLLIGGHJJHJPQPNNMOMIFCA>@ED@A?<>C@DIPLFIICCA@ABA??A@<87757::9KtjbikotgYQNKLV^[VV[^bkj^XY[[[Z_VDJIDA@EJGUZWWYYZZZ[]ZVTRQQQQPNLKIJKMPRSRNII@;:998988888888879999:998998877:;87888888:;;:::;99<<::=?>@=66799:6;NVTQPPNMPV[afaTOSQPOPQPQTW\_^cqdHHHHECBBBCBCB=987777788:::::::>>=<<;;<===;999::977?KOONNNOOONLJF@@ABCB?==;<>@?>@BA?8544689;;===<<;;;<>>=>?@BED?866:CJB9=CDEEGHHFEEC@@AAACDBCCD@:5//786GPNRQQRRPJB>???>=;;:999;>@CB;5786444435554445662-/5866:=767787799:;;:::;<=?BHMD;717YmaZPOjrmjgecbYG>=Ilu\A3066<@?@@IS?0EYSC4201111112223432334443368861159;6583*0851000..//340,.249>GPH504/)*,,),/26960/7HSSTNAC<7?>,,9=;=:87;CB9676:>FK@44443335:B@;<:1*)+/0-''3C>APYYWRQP>;7-0*'0@OJ7($*9:31:@C<76655010.+)+/1-.5>90,,-.1670*/10233.#HyB()1-*,*''+550.,,,,+,,.34.)+=<(5Kbbccbaceeeeedcbbbbbbbba___^]^__`aabbbbca````_]]]]^^^___^^^^^]\[[[\^__acehiknrwwwxxxvsqonmiegpvuqorvxzywtrpjecbceeefgghhggghhhgghhjjjjhd`__^\afc__dilmmlmopomnnlhda`a_`bcefdbcddcdedbaaca_^`iw~yqrttusqqlecirxyxoZ[vxklw{wrfiquxtt}ptw{zhgger|uuy}yqljifjtssqkv}~|}}}~o_db[_bb`aab`^ceglo{xzmdlxu_cdgged_r~y}z~{ubefffournoqstsrppmigjhg~tgkf]Y_hkgeeca__\\aWlf`VfiRXZ`f_`if_^bfha^{xgYWWVTUW`qlhha\ZXX\acccbfc^}kY^GHR]b_]T\qm```[ZZXYZYTIMNP}POYZ\\YXWXYZ[[YXWY_gc^^ZQKJLKLJIIJLJILNPSUWVUUUUTTUTSQOONMKKMNNONMMMMJIHHIJIIJJMQTRQQPOOPOMQMm|i}fgkibZ[\]\\\\_`_```a`b^XOMORUUUVVUUUVWVUUUTTRQQQQRRRRSRQQPPOOOPPPQQRRPPOOONNNOOOPPRRRQPPPOPSLFJEJQNKKJHGFEFFFFDDDDC@>>?@CBCCDDISRNLJIJQPS_]JFHGHNSSTTSRTW\^]\YY\\\\du~o^OMNXgqdVWSRQPONMKJIIIIEO{nJOV[ZZ[ZVTUUUUUTVUW]w͢iNJMT[Ycnjfeca_`fUHKLJS]OKKLLLKKKKKIIIJJIIKNPPNNMNMJFDDB@B@@@??<638BQNGKKECA@@@@?=?@<87769::7CdtstiZRRNKLW_^\_gichlb[Z[[[Z`VILKHC?DJJOVXWYWWSRTWXVUSQQPOOLKJJJKMOQRPLKIFA<988988887887879999:999999999::88777788:;;:::879:;<>@A@A?:5579967JZWSRPNNRX]bfcUPTRQPRSSSUX]aaaouXFHHFDBBAA@CB<79;977787999:;;;<@A@@@??>>==<;<<<>?<:998779988><==<>>>=>?ACFD?9677?DFGKLKJFDD@<?CRnpM519><:9;AHK?2AYU@-112222222223433434444468751//598??3/0,(-.+,U{T41.042/-,*++*GjH+'+/(1\}xP'&Ok8+0-/30-()15:CFIJHB6.6634<:EirT5,'(=C;51.+.34,&)6EJ?40-HdK5:;93.+()-/,*)-21/-,+*((+/27@@;<=9888/.,,03.*1?9-,----032-((0:7+)28999:80,27=CBAA8246-,26535;=>CD83659:>G@864222103?D<:8334598004-/?KYee[KHM<7=3'*3EJ?0())*/37=FJKC856:>62..8816A@;8:60+'.9::9/*+/,+33/+.}S #-.*)(')(*.+)-274.)*,-138=>?<9888;<;<=CbspYPSQOKKR]`bftxcioc[\\]\bfZSPLLE=@DJBHTYVQONNNRVTSSTUQNMJIJKKLNOPPNLLKKG?999:989878877799999::::9:9::988976778789:99989<==>ACCCDJ@2257873L_[VTQPQV[_egcVQUTTSUVVVW[_cd`i|bFIIFDAABBAC@;9==<<>>=??<:8987799::87ACBA@@DLH:469;<==>>?:7=@>>>=>>?@CFDB=:888=CDDFHKNNKIDBB<89>@ACCDDA=950/27:5?]\X`^[\XVQE>A@?>;889::9>:6Jljd]NWnyvlfa^[S?:@C[u`?3:@>888579:6>XV>*111222222233444545554568752-(),1;;461))*++-4:;80+.033../1123220,*,-.00,)'(/446EXXKA>>7778:942/,-24/+,+.31*',6<80*&(0.,/,('')7>5--....,,+**(')*+,--.00,)%%.2/+,038B--7Xl\Z^SL>.),/2/,))2641//.+(),16@A>AB:36:84/-/0,-9@0')**+.5972-,/32+.577776414;@CCDA7/0241-.00.3=ABCE@69=:7:CB>;537:;701:?:215AOTH;BLJGKGHQRIEFIG=?;,8HJ9)+.++++6EFEKLF:48>>:4+/FD:L\UF6.2765=ME4>A67BJKH=4=1Xu?)()+,,*)*)((*),6>>2&),,09HK=46=??aaabcccdeeedcccdefffecbb`_^]]]]_a`^^]\[[[[\\]\\\]]]^_^^^]\[ZYXYZ[\]^^]^beghhd`jsrooomkigeddcbbchnnotuuvwwrjda__acdfffhhiihhhhhhhhhjkkllieb`\YY\]^_`__bhnrqqqpqqppqnlkgcbbbcbccdfffhiikllkjhhkmmrx}ynjknuxzz|ujbaelvvnjmqnx~zvwsr||pcbj{qbgnidfhjozvqmjjjijpogiuujo{{w{~iclw~kadkpsu{}z{cexreedjjge`l}tp~}sbcksrmiilnonmlkjiiiddwwijd`egedcee`][YXXXYUUotg~\XQVZTVbe\\]Z[^aZe~n]X\`bbb_bkaZ`_ZXXY]acccbcegdw`_ONRRUZcfa_dd`^\ZacY\^\Ro]IWTTY``\Z[\_`a`]ZYZksld\YTMKJJJJJLPUXXXWVWVWVUTTTVVVROOQRSQNLNMMMMMLKLJIIIJLLKLNPQRQQQRPORQRWUěnnXNEELU\_^^\ZWUZ^^]_ccbbdfhhgf_YWXXWVVVVVVVUUUROOOOQRRSTSSSSQPOOOOOOPQQQQQPPPPPPOPSSSTSRRRQRRLCCKLNNKJKKKLMLLKKKIHHGGIKMOOOOPSUQMNQQMJGIOVPe{^NHEFKQSSUWY[__\ZVTQT\kzqZPNS`h{eW[XILPOONMLJJJIJCqƖWIPNOPPQRSTVWXWYzŴuhSOUMQ^a`aacddfbSLLKMOK[hVGHJJIIJKLLLMNMMORRRQPPNLMMJFEFEB;:=?B@=:99BPIMVJDBAA@?>?@@=;999;<;><8Ss]ILNNMKIMY\biw}gkqb]^ab_ogSMHJLF;:<>9;G[VHGKLMOTTRTWZYRNHHIJKLNOPONLLKKJC99::::987::8889:999:::::9;@=889:9677789;;::;5556882H^^[XVTRX_chgaWOTUUVWXXY\]_cc_g|dFKKGDBBBBCA=;;=C?88777679;>A@?AA?=>?@>>===>>>?A=:999888888:;::>@AEGFFHIKJJLLLLHA<<>CCBA@@AGPJ;359:<>>>=76AGC@>>?>>@CFEC?:8978?FFFIKNKGC?@=878DB@@><::;:9>B>73566553444555444579<;767896458777656;<86676677=GG>:=>:3DghebUTcsyrmgb^YK>;?J]\D87==559644727XW=,12332333333345555555679<<73.*++,2572((,,*+/48>@5+/3TZG96317:;98764/-01.,+*/32-)-8?3&$(*,,,-,*()3<5,**,/.---,,+-//.-,+,-//0/-*0AIBBDD;+%.223-'()/4+&&,-%(,010*9md0+))+,11/00276,2@KOMJJJE902=@=;X\-"4>4&.6++*))042//-$:V=$)'.]zzwncK/*.04575447557::3-//17===>@6,2<<1,)'()*..(&)(*,.3775104:5/2546665249?A>?D?1.322/,,.-,/49BDCC>8;<;=DHA8AEF:>IE7-/420,:W`[[_WPVSD3,06FMKMFAC74;4,+.02665>JH@FKB7342132-4GGN^c\P<9A=EPWcL*9VOFYqoaR?;CEH@95(+1023-))+-+(.:A6&&(*2=HA29DF@:^\[\\]]`bcdcccdddffffedb`_^]]]^^__^]]\Z[[Z\\]\\^^__```abbb`]ZYXWWX\_^]_bcedca[[bddfecbbba`_]]^_ddafpuvy{ytmf^]^```ceeghhgghhhhgghikmmmmligd^ZZZ[[[[[\_cinprttsrrrrrrqpnjd^^_`bcdfegijnoooprsrpooprv~skilqtvz|tsrrwxqmkkklwqn{~{|{mdk}~qljiegliyrkefhiijlnhdszompqw~~~~~~zy|z{|eZ]dq|}~yeuxjfgkkecdijlp{nz}}zo`dklppiijjkmomkjiedeiw{h_^diieffba^\ZYWXX[ZV`{|]VSX_XWUWdf`][\\\ZiwdXX^ceedabd]Y^][YVb`^bbabcdgggk_QPZ[VUVVZ\^``_][`bY^`UieGXWTSV]^WX\^bbcc_][YekdYQVUNJKMQSTVWZZYYWUUVXWTUUUVVVQOOQRRRQQQNONMMLMLJKKKLLMMMNPQQQQPQQOPPRUOnUtl[NFHIHHNZ_b`\Ybijfabbbceghhiijf_ZZXWWVVVVUUUUUSQPPPPRRSSSSSSQPOOPPPOPQQQQQQQPPPPPQSSSTTSRRQQN[[KEGFEGJJKLMNNMMMLIHIIJKNOOOOPOQQNOPRRNIFFHHIBCOXSJFEFGQYXWZ^a_[VRRX^gvrZOPWbgty^TYWKMQQSQOMKJIIJAbeGKMKJJKNRTTVZU`˳pWPSNftgcfgggddYOLMLMPJQlfOIJJIKKKMPPPPQTTSSRQPPNLLMKFFFEB<:=?AA@?<<@MLMYJDBCBBA@@@@?;99:;<<=<7W{aFDJKKIHHM`^cluvgntc^bgicdUGFGHFA:88877;QZAADDGILORSUWXVPIHIJJJKLNMLLLKKKE;:;;::879;<:889:999:::::9Zc__^[Z^elsph_VRUYYYZ[]_``bdaisYFKKGDBBBCC?;<>=:98888778;<@FFA>>====>>>>=>>??AB=88998888889;::::;BIOQPQRSSSQPOKD>=@DCB@?>==AKK=438;;::758BHEB@@@>>@BEEC?::967>FGHIKLJFBA>:778;?AB?;<965775568;;Th_`fgfg`K<>BBB@?>=:::9>C<9:<;7554553443444579:9777676568<>;85:=976555585;94:WW9-1385343333334555665689;==9523531345300.,,--,/460+.149520//.022.*(*-./4:847>BE=6KU?2312354443220,+++++...../3;:-%(',7401344554)%*,1410/36411354/-,--//.002,=`mkl_YS61864.()-13/*''((*./11.5SN))*++*.//0009=32COOLJLMD827DMEHof.#(08?3180-)&)?A2+.+*@VP5(*'!@v|y^@59::;8654344338A>783.598555/)+23)&%%&&&%$'*/32/+.59854=A3+26675358:<=;;DE:6;7-,-,,-..015=?>=@GEM`dW:7Qc_B&&67/8TdkmiT?GQM?227@IJIGAD<)''0325<@BBCGF=AJ@3240/1.0?EM^[UN@GWC,Gdh]<*1I]S]yZA==BHKO\ICCCBBBA@A@>;:;<==>>;@gpL@HHJIGFGKgjjwxkjxl_bhjZLFFKKD<;::89988AR>>=;>AAEKNPOOPNJHHHIIJLMMLLLKKKIA>;;::999;<;9888999:99:;:CFB=<=?>>>>>>==?@?AB>878988889999999:8:?JSSQRTWVSRROG@?@DDB?=:::58AHH:3:<=:99<>@BBBB@>?@BFEA=;:978?EHHJMKGCB@<8668=AA?:68766666559==Ieg`ekjjfU@9?@@??>>;::9?B<=BF@85434433333454567789866><:8<=887566775:A>998662:fndaYLPfqtsojgi\A7:ACFA64:@CFHIHB;9BUS6114;66433333345555666778:97448<:8864430,+./-,+++++,*(,0///01352+(),...-,.48::;74FJ6002420//.----***('+1-*).4:>4+28+,CC75;CD;.,)&'*//-,+/674/,5>3,-/.//-.1413LuufmP1652-+/35652-**(+02111265+*++/0,*-21.9>20?OPJHMNC55?EC=?@9-/11/.+)((-3('(**)))+*-7?:.&(2;=?A>8015775228==<:9>E>13DD1,--./3::;;::8:@?:::64?VfcUD1+8PeV3(4:58J]f^SC17KTUTPC9<>=?A=;/&,5789::9Q\E93,CM3%Ee\8&3/.HS`t:.FH>?;38;2+/20-+('+.157AD3')/10/./42...^`beikmllkjjihhggggggffeb_]\\]]]^^^^^]\\]\\]_accceffffghhggggggec`\ZZ[\^^^_^]``][[]^]]]\\\[\[Y\[Y[cnxzyx{~wia]\]``abcdeddedddddehjklmmmnonkfc`\ZXXWXXWWZbiklnptwvutsqpnnppkfc_^adb^`e`\afghfdeccehknqrrrpljkr|{ywsojly}z|xpkifeiidq|mmvpgewnho|}{ztkedgkmmmnppnihkotusqqomlllmw|uot~f]_][d|n{qhffghklli{z~|{}~~|xupkijkjhhhghjljihfn}|zj[_egeed`^]\\[XYZY\VP{UU^_jaWZWXZZZbicZZZW]t{k_\`fggfeba`^]^]\Z[fhdU[babdfgeerb`ROZ`\PSXTTW[^a`\ZZZWY[WUTTTUVW\YNUbedfknidbVLJHFLWYTPONNOQPOMLKMOQSQONPQSTUTSQRQRRSSRQQQQOMJJJIKLLLMNNNOPOOPRST]_PPMR]\wzM\_VSNNVNIJKJJMNQ`ieenuysopmihhhhfedb`]\XVUVVVVVVVVUTTSQQORTTTTTSRPPPPQPPPQRRRRQRRQPOOPRRSTUUTSSOFRgYDCEFHIIJLNOOONNMLJIIJMMMLKJIHFFEA=CMOKIGFDEGHKMQQHFGGJPY[Z`b_ZSPO^wwzrZQRY`ett\TWTQRUUUSPNPMJIJKKqXKRSUVY[ZYXUWPnʹhls]SJSwpogddcZONQPPSSOjuXIJKKJJLMMMMMMMKKMPPPPMNLKHFGEDB@@@@?@@?=BDEP^H@CCBBB@AB@<;:;>???@;Jw|WDFJIHHHHEFbilzxgaoi_acaJIHJKF=89:989;;:9B<<;9;=;;?DHJKKJJHGFFFGJJIIIHHHJJHC><;:::9;<;9877789999:;;<=<::9877789:::99;;;:;ACDFFEB;8778::9987;Ofe_epv{wlb\\[\]^^`cffhlwlPHHJHFDB@@BB>8;@=87678;:8:;<<>BB?>?AA?>>>=>=?@?AA<979:889999;:9:::987;GRSNNRSTTTSKC?@CDB?;:88954=GM@7EKFGFB=;=AAA@@?@BEE@;::999@DGHKLKDA?=;658;?A>;756756766669=>>UgcemlikfG5@??@@>>;998>A>?BA<85434554434566656888768?A???=<;::;9997777669;<;;87844Sokij\R_ovtpljhYA8::>CE?5;BLPOOMD>9?TH3655:5444444444555566555575003:<778742-*+,01///00.+*('),,,+.0375,)+-/0-()/234218?B9---24331--20-,-.--,+//,*,3:>83<@1-AF>:CPF0())'(,0..,)'/330(,;6*-02.,.1115).5.(+*'&&,230*)/HZYUC6IZN;3.,,193GL474EX\YH/$&)/2)&+,4;@=3.--,+*()+6<-,/0+,464/.491*'&+9BDG?415322138==:99:>?846;EC4..028BDA>9664:>303207KM9.*%%'2GK@53425:AF@980/DTVZ`R=63017852+288740-/49<@LQE>BCBCCAAB?<89=BBBAC>NvpOILJJJJJIHES]ix}oaZbfa]c^OQMJD?<;;9889;<;:;<;<;:;:9:=@BDJKIIHIGB<:BBBCBCCDIJGEB>;;::;;:876678899:::;;;<<<9966789:;857<;;;;AFFDBB?;998::;;;:938Vdaclswz}xria_]^^__`bflox`BJHGEDBA@@BB<8=B=75458?A=9:==?@@?>>?>>>??@@?;9;<;::999:;:;:::::94;LTOLNPSRTTOE=BDDB>;;96:::69OL8CPQQNIDA@BA?AA>@BCC@<;:::;ACEHJJIDA=;9669;<=;:856656777879;<8G`bgqplnaA5@?AB@>>::;;?>;??<:9655787775555666677776:?@@@A?<;;;:9::9777778:;>;77643GjqmpjZUe{}uoi_O?;:4:@@?::CRTPLIFA:=O@28:673554445654555665556564..3::412333/++-.-..032/-+**+++++++.56/,+,/0,+57212/0=IA3(),247>6).40,-.-185,+,--.034547:1-B@?@?4,5/,--..+/;<3441,.9<40.0/&&+'(9DFH>2.0.+-28<=9436;@AAEE;8E>32259??:61/0011--0100/.)+5>FLIA>=:6754112.8D?2;IMPXTA1+(*/76438<=;863379:;<=;C<*'-*&'+,,1."18,00+16*(F?#(/@Sy`PG9000-,***,1599894+***,,+***./.ffghikkllkkjjihgghiigggfda___^^^]]]^]^__^``a`abcfhjlklmmmnnlkmmlmllkkkhghhhghhgd^[[\\[[ZZ\]]\ZZZZ\]]\\\^^\[[ZY[[\]^_```````_`aacgikmnooqtvxvusoh`[YVVWWXXY]enrpqnklmnmlnqrrsvvvxxvttqnmid_\Z[[XWWY`eltx{{x{}te`kpqpqsne^^cdebadikhhiikliiy|h\apv|zz}tqv|}s}skjgfijknoqsutrstrqqsssrqpmjinqsvtl|lgeint|w{vrtv{}}~~x}z~~{wrrnkhhhihfcm~}p[bddfd_[[ZYYXXXWXZPboPbkmoa[keWVTUXUZklYX][jvk\\fkjjhhgdba_^_``XUjc_`ccddhkp[ftW`]\mjPOORUQRZ^ZXYYXYZXWVUTR[ZSQR\mqb_qscTKKJIJLONJFGHHIKMPU\][YTNNPOPQSTUTQNNQQRRRSSRQQONPQQPOMLLMMNPQRSSRSSTROORMNT^omVPNONOMMLMLIIJILPPLHMT^inpturppmgcbaaaaabdda_[YYYYYYXWVUUTPOQSTTUUTSUTSSSSRSRQSSSSSRQQQQQQRSSSTSRYfZGEGHKLLKJHHJMOOOMKKKKKKLLKKJJIIIHDBJQQNLJGFGFGIKKLOLIGENYUSZbb`YTUVYlsyvaWX\et{eYWWQNPTUQORTTRQNHQTlǭlLKNNNNNRWXYYV[yƴy[l}{^RLKZfotla`_amfTRWXWV\lu|p^RLJIHIIIIJIIGHHGIMPPONOMHGHD@>><<=@BDDCA@A?;5;?DBAAC?Rk^NNMLKKKJIJIKTgwyg_[`gd]e]^[YH<<>=;:989<<<;;;;::;<<<<=@@;BLKJLNMLB;@>=<<==?DHIJGC?;;<<;8665456889::::9::<<:98677788438;::;=;::99<<;<<:963>Wc_^cehnxzwofccca``acgouxkCFFEDDCB@@B@<@>?@??>??>>???@@>;:<=<<:9:::;:::::::986@KMLJMRPTVSF=;89:977799;;;;8675577778878;6:TahuwnZH:8>?AA@@;8:;=?>;>>=;9875778986555666677777=AA?AA?><;::9:::977889==;756565Ccnjnk[P^x}uphcXE?:79>>??9DYVSQLGA87E>19:753455545554556665568775314:;7666677555555554311/,)((,00-*.540,)*,,,5>6/1643ALB2++.46:@5)++)'(),6<7-*,-.1431/./0,,35.3II0'16/)0;==72.,,-/00/-,,+,0/(*;6573=SJ862)+/.*('(%%-1*(*>QR:8UVJD?5'&*)'.1:@-162;P^Q2(+)%$'+,)'%'/7?=520.01//35694-+/53*(*.0,,-'&6DHJ?1-/-+.589862139?DIKJE><=<836740-+++,-,,--491-08==/.039852248=AGJGGMNHA=DF=@FF=439;4.+)*,+&-;1&))-:4,5?2#-lv2#+&(Qk?MJ2-2/-(5?.%'056630-,-/1431---..hhhikllmlkjjjiihhijjigggeca`____]]]^^^_`_`aaa`acdgklmmmopqsrqqqoonnpqsrpnkigggge^YZZZ[[XZ]]\]ZY[Z[\[ZYYZYXXYYYY[[\]]]^^^^^____`beffhmooqvxxtpsuof^XVVWWWY\_ehfcceehklkjjklkkorstwy{zvrpolgb_][\[\bkrwxwy}~~}iVV]`_ejjebaba\W]ijfehjlmlejmd[]yzjjcagox{{vks~|yjigflnnopoprtsuvvz{tmmoopnkjlr}r{lpy|yylrz}~xx~wzxutrpmjjiigedkyz{xb_cdefc_\[ZYZYXWY[R[vWdqzxnfced^WZ]YYVcpf^Z\ind\]inllihhebba_``_YYnsfXV]aaabdd{bMaUb_]tsVLJOQMQ[^ZYYYYWVVUTSTW_ZSTSUdqfWevdOJLKJKMMLJGGJKLLMPV[[WTOMPSPNOPSTSQNNOQRSSSQQROKKNOONNLKKKLKLNPRRSUUSRSSROPOUVTURNMLKKKKJJKKKMNNONNLHKYchquqnpqidabccdfilljg^VXYZYYXWVUUSRQQSTTUUUUUTSSSRRSRRSSSSSSRQQQQQRSSSTSQas[FJLKLNMLJIGGJNSQMKKKKKKLKKKJKIJJGGPXWRNLJHFGFGHKLKJKJGBL\[V[bcaYUVXV[dn{bY[\qpTV[UQMIMPPQTWUUVLFXNClNJMMKNKMUWYXReuTeiSigUMRZ_irlc``aqzaPVXUUVXapvfWLJHIJHHHHHIHIHGHMOQPPONJGHD<78999:=ADDC@@??@ABCEDCA@B@97=ABA>@B?O]QPRPNKKKJIIKJPg}}f^_fiefaY`fjI7;>=<;::<>>>=:7799;=>=?=@B:8CIKLMNLJEA?=;;:;=?DGKKGD;=><98755335678:9::9:::;9887765430069:;;<=<<:999;=>=?><7694Hbb[]`fjw}ujgeddcccfjpuqvJACDDCCB@@A>=ADA:6778:AGE>99<>?=?>?@???????>??>?@@>::><;:<=;877999::::8:@HLJNROTWRDAB@@??=:88:?GHHFC@;8777889::;:7776677777756;71K`hy~f?699===>@A<;:9<>?>>>><;:85555566666667788888>@?>@??@>:9999::99877]lijg\SZltrohhcKA=>;<>@B7C`ZVVND>2-9<38875446555566655665579:88678879;:;<<<;;;9999962025541+),352*,344/))*).8:1.18;:@GB500047431-*)'&%)4=90/2467897422-*)),/**7:02;<2*,-05870-++,.012/--++,)(4B49NQJ@B5110//,/56:;/,+,**,01,)'(()*)+/42/0461&)10+/6217;856<CLLHHE=574-*((*,++,.+-BE2.7AIC9I`WF<8106>>5/.3BXWIEBDP[a]UG>7...-,-038BMQLJRURRMJE@DEA:/-.1330-,,*')8<.((/<=8?AAJTRRSQNMKJHGGHFLif`ageeo`__hmK9<>>>==>ADDCB>;9989>B?===><:;BHJLLLLJA=<;;::?CDC=877:?@CEE?99?B>=<>@??>?????>>>?ABA<4;<;;;;:999989@JG<=CCA>?BA>;78@HJHEB?;8877889::;97877878877766:92E[j{^76:;>?BDA>CB99==>==>>>==:8887766667789999998<@?=>>=>=;:::::::::879<;7655565:Yqnhc^WVbnroig`LC@D?:3+/9TWUQ=/-)(;GB=.*63+*(/69;=>=;311482(),-,,**)()*)))+-,('),++**-20*)),07;;0&!)>OC6468764221012458601>PUWUMFA;51000-+**++,>M=-.7;BCABWR73:<9=B@?DD<:EB43;BDFHINPI@4-45-*28=FKOLGKQT]_UFAH>01////17972.+)(3=3)'+=EABCB400),,,*,?HJSN922((.4><31,-7=92++1455760)''*,kklmmnnnnmkjijjhjkjiihhgeeecb`_^_^^^^^^]\[[\\]^_bdhlnoqqpkhhhijkhgiihfedb``]^bcb`[WXXWWYZ\^a`]\\\\[[[ZYYYXXXXYZZZ[[[[[\\\\]^]\]^_\YX\^_abba^\ZZ[]]\YVVVWXYZ[]_ceedgknnmlnolhfb^[XUVXY[ZYYXY^ioieffjnqqporttwvqu~jXYaa^]\ZZ^ddbgrsqqqsstuqttroio|qcc`g|sc`iichfckoqpppononmjmrzvliiklklmmlyzwxussqt}~w|{}ommnnomllljhfd`av~vn]mheecb^[[[Z[[]]TTwx]jvw|woqunjia]hnknmcfmf[[cb_\_konkjkiebba`a`\[Z[`c_ZZ[[^bgg_^_Tf´nXa^eikmeTJJMSY[ZZXVVWVVVVX]`WSUTTRVhiSLSOLMMMLKLJINQQQQQPQS[fjaSLPSSSQNOPQQOQRRSUUUTRPNLKKIIKKLNNNMLLLJKLLMNOOPPQRSSSSSSSOKJIJJJKMMIILOU\\ejrwi]`a[RR`mllllmkhiijjjifc]QNPTWWVUVUUUUTSSTUUVWWUUUUTRQQSTTUUUUUUSQQQQRRRSSSSPHIPRPPPOLJJIHIMSSMKLLNNMLLNQSSTVY]^^YROMLJHFFGHHIJJKKLIJPYZWZcbYVVWVUTOPlhXZQRe_YTMUitPOXXVWY\]LKQFbaMORSUWWVUWUaƌNLZYSL>^y\I`onnnle^^_av|^MTWVXYY_gjg\OHHIIIHGGHIJKKMTUKPQPONLIF@:78:;BB?>>@AEMSOMMLMKIGFFGGDGefbddWcnad_ekM==>???>?CFHHHHGC?<9?GF@<::;<::CGJJKLJB<;;;:;;;;>@DJNK<2254334434566689999::::9:::61+)'(4;<>>=;899:8898;>CGIHD@<885@\gegmwrgedeeegjnqlhuILUJB?@@@????BDC@968>>?@@????@@@@B>28>=>?@FHHHC<:<;;<;;;@INKGKRX[F9ECBB=;9999:99998CSE?ELOQPNOOMJB=?EEB>?BCB?9;BJKHE@=;;97688:;<;:88778888777769<:BRk|tS8;;=DHORKAED<>>=<<=>???>===<>>97677789999999;>=;<<;;;;:<<<<;<<;:758=9::76648Zvtoj_UT`lsqlfXIEDGE<9@D@?OND<746;@@3*14BK@5445555555666556:;97889769954;B@;60///.06;EH?325434541...4:5*'+.48::<>>???AA?=6-09.+++,---/9@9/(+7?B@:1.49:80,.-+**,/8A;0+,+')4<>4*))*+.1650.,*()*,/93.-+),,)((**),21.,,/-+*)+//+('''((&)24432781***(,25611/253/5<8+&*),//./0.+9H486>RaZI@>:0'%Chj]<-:7**(2>>>>>80-++,-*'(*))))*)&&&''(),,*)('''))*++*+,.028:4,('2A;,.48:74122334310-,2@MQUVURNA898762-,*-7HTB)',8756=EOG8>IOHCBALUL=,**&#(/0/((8NQUUD@<.',49<:AFEGIKZa]RD?4,.2457;AFF;-+*)3;2)'+=D96:=6061*,+*++'%,/+*35/--.474,,3751*,584344/(&'((ijkllllmlkljjkjijllkkjjhgffdaa____^^^^^][YZZ[\\\_beiifec`][\\\^`^\\]_`````baabbb_ZYXUVXXZ]]]^^^^]\ZYXWWWWXXWXXYZ[[[[[[\[\\]]]]]\[ZVUUVWWXXXYYXXYZ[[\ZVUVWWUUVXYZWUVZ^`adhjlmjgfd`ZUUZ]][[[_fki`]djmkjlmnuzyvtsux{|q`[_fgc\VYafhmorrpprrtvxwxyyxvu{teehs|lhuug_ixjhrslollkjlquuvwzqmlkijkkkmkuy{}mpx}|}wiijjjjjjjhged_c}zxh}nabc`]\[Z[[]]UVrutj`hhdbkha`ac\TW\]gnup^`_baZ`jpnkjkjfcbbaa`^\^^ZX\][ZY[]bgh`ZWW^a[XgmlniRFNSX[[YWWVVWXWVX_aRRXVTRZe_TSPNMNOOPPQPPTVWUURPOSbrqaQLTVRRPMMNQQQSSQRTTUTQOMMMMKKLLMNNNNNMMLKLLLMMLNPQRSSTTRRSOLJILMLMONO^pj^[YXKFJ[xvtrplkiiiihhfd`WNLRVWWVUUUUUUUUUUUUVVVUVVVUSPQRSUTUUUTSRQQQRRRRRQQJEHPRQQPNLLKKKLNQPMJKLNNONOPQUVWVVSSUUROMLJHFEEFHIHKKMOLKPUVVU``QUYWWUPKMihU\k>><::;;;;;<<>BJNE5045543455555569999::::9:::72-)+18;<==;:789987:9>AAA?@BB?979?DFIHGFFEA>69????>>@@@?@@AAA@?B?8:?B>7?MPPPOIB=;;<;<:;HNJEIO\YAKJDEINQRRSQOMF@AHIC>>ABC@==EKJFA=?><:758:<<<<;97777777777778>@BPmzbG@@;CINQSQICDDDCB@ABBAA@>>=>@@@><:87889999::9:;;:::<<;;:;=>=;;;::966:==;:8629^ywyxgST`lttj[NECDEEB=<>BDA625157=HL>0,0GL744444455556666669:::97558;<75;DD@91.-,+.38FM@/+233454430/286,'+169=ADECBB?<:750+,3/**-.-/226:6/,/5<==95116887652,**,18A9.+/0*),-0-)+,+.52/1///-,,-./3.(&()+/,%'((*-.,+,-/,)**)()*(''&')(&0::8884-(,--.243/.+/9?81.)$$'/57743697:<*/=NP@8554/+*#.ed<353/+'/AFFC?7,*(('&$')))('(()'((*+-*'(*($&,,'+000033301893/0147737=??:412466630+)1:>AFJPVQGB@=:76421*2P_N/!,3:>63=>==>CFEFGGFHIIIC@@FKKD=89;?ADDFHJF?<;<;;<<;<<===AJB5456545655555689899::;;:::75426;:;;;;;88::988<=BGIJIHBAB>984@autotzlecdefikoqkx}T=CHPSQI@>AA@?>@@=:89?CFIIHEIHB<5;BAA@@?@@?@@@AAA@?B@<=?A:2:EJQSTQLF@;<;=:>GCAIJN[S?CICABB?:99:::999:9>JFFFMRRTUSPNJBAILGA>?>@@?>BGGC?=?@>;669;<<<<<97887777788777=;;<<;;:888::978=><;:73=czw{w[S_lwvcJFCCBCDCB@>>DC31:46:-4332345556788779<<>A>6215<=749CE>5/-//0333BF6-.343345795/.020*+/35:CID>;<=92/-,,+-.))24137545217:;;<:973111249:4+(),3rX,3885,'*=KLD91+)'''(''(+*(&')))**+.23-(*+(%17//78::::951470,/489735>DB:20102442/*,9>739>CJC:?C>;9740-)8PJ537AFDIFFIW^RTieXQPNLI9/5/1?C?40.+,23653.*+):G6(%-=EAKo}z|veA(+0.+,9@71135410..0iiikkkkjihhijkmmlmmllkjigfedbaa^[[[[ZYXZ][WWXYZZZZYWVVSSTUVUUVVWWXZ[]````_`dfgfca^\ZXVWYZ[YWVX\\YWXXWVVVVWWWXXXZZYXYZZZZYZZ[\\[ZZYYXXWXYYXXXXZYXWWWY]]YVUVWWWVUZdgeefikmonllnonopnmh^XXZZ\b^UT`klaZ_jqppwyz||}||}}}r`X]dgjnmfekqpfagkmlnsxwwy{{zz{|vsmnrm_`ba`dnoicjrmmbx}lfhjedeeehgtzolljhijjjkvyowsmrz}{{qqroutrgniihijklkjheb^knzw|tf^\[[Z[\ZZlsaYXVT]gqmkqkkhrWNlocpn``be_Xfpppnlkjfdca`^WS]cY\pl_]]\YYZ[]^][[MooRWbeeghnjXLLU\ZXWWWWWXYYZYVY\[XVVVWWTQQQRQRSW\^^]^[VSRPNNNYuyaRQVUPNNLLMNPVWOKMPPOONNOOOMNNONNONNOONNNNMMMNNNORSTSSTTSSUQMMNPRTQO]γpKFLLLMPUKIFFhvkiiknoljhhecc`SOOQSUVYXWVVWWWWVVVUVWWVVWWVUUTSRRSTUVVUSRRRSRSSSRRUSRQPNLJHIIJKNONJIJLNOOTZ[TPRSV[`b_]\[\\[WTRPOPOOPOOOOMOWYTPU[[XXYXWOJMKVdXgfHAGMXWMHDBDHKLORSUZUONMNPK`tTKLMMOSTUXQlԳ`GSVYYTLJZja߹mboshZRURT_mtn_XWYYZ\crusncTLKJIIJLOOMMLLWXWSPONMKCCJOONMLKJHGEDBA@AABBBABFDDB?@FGFDDCBDIHFGFDCCBAAACDDCBIdndZOGGZh_^^__M;=>=>>=>EHEDFGFGGGIJHCBGLLH@>BDCBBDFIFA==<<<<<;<>=;88AHD736545655555688899:;;;;:9744588778:;:66;;:::>BFGGGD@=@A;8863Rv{oppheefhknqmvjCECEHJMROIB@@AA@@?>;<=@DEGGFFC@=7?ECB??????@@@AA@??BA<;<:749<>??=?AA?=;?@@<878;<<:=?948:77778:9775:D@Op\?ADECE?<==:;=?@ADFIIIIJJKJFA@>>?@><<<;::979::986669<>>===<:::876677779<>>>>;6=ezv|gPZlyy`BEECABBBAED;@F:597;=;@HIC87?;202345555567776:>AAAB<7303=@927BC91./12354285),14654534672/143/-.019FH>66::5/.///-.2(&/888:63524<@><;<9530/.,-5:4,(),3=>3),232111//130*(4:/.0121.--242,050,+*//(('').241/.-.2,)*,---//--/.0=50/001321/,19:5-.4:?>:@B?>><8/*.9;-*=W[KP_XVYcfadjeXONNG647;2#;PG>:2).@M\gieR;410580*'),)(->FISVQJB:76558962'(*)(*+*%&(()'&7I;-35?A8//)NP4IML9)SxE',/,'1=943/05521246iiijjhffddfhijlllmmllljhgfedbaa^ZYZZZYZYXXWXYZZZYWVUTTSTTTUTSUVUUVXZ\]^_^]_begfb`_]][XVWYYXXWVVWWWWWUTUVUVVVVVVXXVVVXXXXYYZZZ[ZZ[ZYYYXXYZZXXXYYYXXWY[[\[XWWWXWW\`[Y\`ddcfhlnmnoonmnnlga[YXY[[]cfa[X\cgkqy{|}}~~ve[`gkswunmlcZW]holfikjlqvuvumsqsumd^jidbccbab`dfghg_gz{mcedcbbccdcezxxoljigijiginv}ywpnmq~}|~~{}zzh]pnhhhijllmkjdbcn{lnzl\\\ZY[\Z\ipeZ[]WV^empjhjikeSa^Rcfesndnu^Uksqpolkjfedab]\qmUa`a_ZYYXZZ[ZTWgQUY[^^^`a]QKT\ZXXWXXXXYYZYY[\ZWVWWUUVPQRSSTU[acca]XURRRQPQUgm`VPNOONNNMNOQUUPLNPPOONOOOPOOOOPPPPOOOONNMMMMNNNOPPRRQSSRSSOORRRTSRPSgνyPNSONMNOOQOFEPmmhc]_fjjihecc`VRQPPRUWWXXWXYYXWVVUVXWWWWWVVVWUTRRSUWXXVUSRSRSTTTUVTSQPMKIHHIIKNOLLLKMONMS\a[RSVZ]a_ZWVUVXZYVSRSRPOOMMMMIFJNOKV^XY[YVRMLLIKmb[hWBCJOPPNJFFHIHHKPP[TOOPNMOKN}sTKNNMPTTVXQsһoEMRUZ\SMPY\Xڜ`rvdXQNKNW`nxo]WZ[]]apvtpi[PMLKHIKMLKKJIQRVURQOLJKOQTTQKHGGFFDCBAACBBA@???@CC?AGIHHEDCDFFDEEDCCAABACBBBCI[kgTJJKWma\\^YH=<=;=>>=CHJGDFHHHGGIJMKHILMLIHFDBBCEHHE@?<<<<<;<>>9667=GD74544555455578899:;;;;;:744777447:;848=<;:;@BEFBA=8:?;87983>_rosrjfefimmhpuI@FCCCACGOUMHDCBBB@AABAABC@><;;;:9BEB@?????@A@ABA@??BA=98656998HCGOUX[[QHC@?@EJHFC><=AB@@@?><;=?A<999<>>?><@DDEEEGHGCAEKLNOQQNLLKJHFDB>;;<==:768:87778======;::9997544568:=???>7=izt~rPVkzyZ@><<:7320--,,.//-**-4=>4,/35544426:3-)&-=:0.+)*)))/70&,82*+,*//,(',59951--04..000//230/210;D7/81/-,+,,/.(&)(')/10.-+,378:@:875,()+)&,2'(/41-)(/83*)'(((*,/,+0.*('(),122/*',57101/+-386-*2:=8.,470+)'(*,((+/0000114421/,/475017@DA>=>BCDEB87;7.**4PQ8Md_[\ee`ekdRNOO>3;84:38GB?49?JF:5)DSG\ZN5 &g\5+-/-088464/.45227;9edcbcca^]`cfhjklnljihggfffdbaaa^ZXXXXY\ZUUWXYYWWWWXVTSRRTTSSSSTTTVWXZYZ\[\^`cgfca___\ZXVVVVVVVUUVVVUUTUUUUTTTUUUUUTTVWVWYYYZZZZ[[ZZZYXYZZZYYXYXYXXXYYZ\\ZYYXXXWXURU[^]\Z[bjmnoppoomnqrpke_ZXZ]\[ZXWY_fqzxz~~}~pebdijklkg^VTXcnoha`einorsutiirwqhahy^`cdbadheebec^^agdnobecbcccccchpyytnnljhgijighin}volhl|z{|{{}s}}x~wbf[Ygqlihhjlmnnljgiusjqpu}n[\\[ZZ[\^^[WY[[UXlxokpfchgd[LWsr^drnsui~Zbvsrqomljfedbb`puVVtacc]VTPNQRSUJphPTTWXWWV\]TMSZYYXXYXWXXY\]\[YXVUWXWUVSVc\OSX^ded`ZUSRRRRQSU`d`UNMLLMMNNNPQSTQOQRPOPQQPPPPPPPRSRRRPONNNMMNNOONNNNPPQRRQPPOQSTSSPRRNPϰ{NLPQQOOOONQPHHQ^njdVRZagkidcba_TPOPSTUWXXYZYYYXWUUVWXWWWVVUVWWTRRRUXYYYXTTTSTTTUVUTRQPMJHHHIJLNMMMNMLLMLQ\c^TUZ^_]YUSSRRSSPMLNPPNLJHIKKLKJLMO]ZSX[YUOKLKHEPcaaI?CIMLMKGEHJIHHJMPZONPPNNNKOfuTKNPRVWWWVWǖ]KOOSY]TPTXLlЛauuaXPLJMT^i}zaWZ\]]bourolcUOLKJJJKJJJIIRRVYUTQPNOQRSQKGDDEFFDBAAACB@@ABA>?AA=@EEGGEDCDDEFEEDC@BBBBA@ACEJZmcMJPIHac\ZZTD=;;;<>><>BHKIFEEGHEGHKPQMKKKKJGEDDEFHIJF@>;=>===>=85542;EC8456544433567879;:;<;986435654359;95:;<:;<@?CD?=;8:;;:98954?Uft~skgfhlojnxI:55698:CEB@?>???@A@AAA??@AB=876667766:FMMMNMMLIC<=<:<=<;::;>ACCDGE?99;;99::9:@@>GLKMRVVUUWXWOFGNQQRTUSRTTTTROMHA=:;?CA957779:77;;<=<<<;;;:97567668;=>>@:7]xs]ShwqY>:BCBCDCCCCC>;;7:8<;:78;:7598798898654667766?KLIE;99624>C@78A?3.034346554224459<;9877;>>:876550,3=<56:;84101343249BFB?==73678;>=;9741011-,,,+-.-+-5==5244332220490(('&3;3-)$$'(*/7/'.85/23/-01.+2;:97/'*/41763.,,021156/7A6,33/--,,**.,*++(*-.-,+*-2899>?@:1&.4/.7?@<9874,()**(&''(.1/,)(.,(&&'''(),36340*'')),2341*$$*2466-')-00+(0794,-44.*'$&(%&'')+-../032/.-+,0567:@FE?;;>HHGFG;=D8)(*'=?*FTO]]W__fkVKLTOOJ<.-=GF69?1?aU=<6.*HvkH>79>7.362,4JMA=GSM96423227>=/,-+)(,.2::2+(*32/6814;AA?7*=J[ofH2$Jj.(---.274464.,/4338;:[[YYZYZYY]adgijlmha_\Z_cedb____]ZYWWWVWYYWVVWWUSTWXVTSRQSUTTTSSTUWVVWWXZ[\^^bffeb`_^\ZYWUUUUUUUTTSTUUUTUUTTTTTSRSTTSUVVVWXXXXXYZZYYYXXXYZYXYXXXXXXXXXYZ[\\[ZYYXWWWWYYWVVX]dhlopqoppppqstrmf]WVWWXXWX]jspq{}}{}xlb^]]^^ZWVUV[hqria`fqwur{powxy|h]adaaabekgedb`_^[]wvedddgffffkrplmpmonljhijihijlwrokfo|yy{}||{ugbdfjozkpwykggee^`nnhgimoopqrqqxzsww{c\\[ZZZ[]\[Z[\\YWqzz}ljgdfc[XWSYkokswtqjznsqomkjgecbbb{|t[Js{a[]\WZjne_ZZTtdPX[YXXXX[ZWSTXYXXXXWWWWWZZYWVVTSVYXUUXi[Q]efc_XTSQQQQPSTV\acRKNMLLKLMNPQRSRQQPQPPQQPPPPPOQSSRQQONNNNNNNNOOPONOPOPQQPNOOQSSSSQPQORϥwWLROPPOOOOOPOMQVTgli\TUW\egdcbbdXPQTVWVWXXYYZZYYWUTUVWWWWWVWWWVUTTUUWXXXXUUTSSSSTTSRRRQOLIHIJKLNMLNRRPNOMNU[ZRU`cb^YUVWTOMMHCCEHJIIIIJJKNNLLIZhTRY[YUPNKJJIETohN>BDHKKKHDFIIIKIJKQRMOPPPQRPSV\nzTKOSVWYYXR_ȡlTQMIOWZZVUUPѝazraTOLKKJSduwhYY[][joqnmjcXPNLJJJJJIIIKQRX\]\WUQPPQMD>AEEEFEDCAAABA@BCCCAA@====><9545438@A<76544444566779;::<:9863223234689;<::9:=AFGJF<;;9;;<;:::897A?C@BBB?>??FLLKJJHFFDDBA@>=<86677:BEB@?????@@@@A@?>@AA>9766677639>CKRSQQRROLGFG?BBGQWY]YG=>>?@DJJHIE@>DFEDB><::<<:;:;<>DGGGIID?==;99:99=@BFEDMVB?>?FQ[^\ZXYZ[[[\\WOLORRQSUUSRRTTTRRQKE?<AAABBDEDCBB=<;9;;:98766468665688755668768FRNG?:99865=EE<7>;2/34455667745778=FD=98889<>;96554357778972/--/1333:FNOK@<;735557797620--05630,+)),,.5=;445420-,,-/1.)%%%*4631.)&'+29638=;9999411005;644-+/16574/))-/00027/,31+-1-+/32004311-()((+//+,07653//55)-74.7A@<:762,)***-10/.11.+()00.)'''())*5?>:0)''((,4:8530,*,27:4+((*+,,...+,15+**(%()'(('&')(*,/0/,,,,-047:>@>:8<>AFC>DC/.A<)'+-9<2;=D[_NJYdU?@GKQR@/))08?)*EE@fe@95(',1422338;4.35,***'0DG6.,171&(-+/78:?6-;{YCquU2-+!-L1,))*)*+1663/,)*/585/TTTTSTVXZ\]^ababc_ZWTRW^bca^\[\\\ZWWWTSVYYVTUUSRSUUUUSRUUVWVTSTSUVVVUUVXZ\\]adfea^\[YYXVVWVUUUUTTTTTUVUTTTTTTRRRRSRSUTTUVVVVVWXYYWWXXXVVWVWXWXXXXWXWWXY[]]]\\ZXXXWUUUSTXXZ^chnnllnqpopppqrpme]ZYYWVVZ][^m{|yy|te``_[TQTWVVanrpjbcq~}x|vu|{z{__dace^`nofee`emqmt{jdejkiijmptsjippoqokijkijjjknsnnmkr|{}xvvx}|ou~{{{{~zptoyxqjd`bkyrmkjiliggb^fqpiinqtwurqomq}~|tc[\[[[[]]\[]_][Yjzolecd_[Zdnnljqvwxrlrrrrpnligedd_Wkzwuh]a[aa\YYZZb|xtruly_TY\ZXY[\\[[XTUXXXXXWVVUUUUUTSSQQTVVTQXutN\iic[TOPOPPRSUVXZbXHKNLKJIKMNOOPQPOPQQQRSRQPPOOOQQQQONNNNNNNNMNOOQQPONMNOOOOOPRSRSSQPOQLÄPKRSPQPOPPPOPOPTRNXjhaWVUTZbeccdh^RRXZYWXXYZZ[[ZZWUTTUWWXWWWXXXVWVWWVWXWWWWWUTSSSSRQPRSSQNJIKLMMNMJLSWXVRNKMRQPZefa\YWWVOGJPLFDEFFHJKKKKLMNKJNfbORZ[XTTTNLLMHHp~`FDFEGIHGD@FKGJKJIGSONOPPRTUUVXTUULQUVWYYXTypWTPMGFLS^\YRWӣunbPNLKIDFRexl[Y[clpnmkjhd\SOLJJJJJIIIP_[]^_`]YVSOPKA>=?@@@CBCFGHHFDEFEDCCBBCFIKLVbMLJE=8I_`YYXM?;===>ELMHCFKKKIHPLIIGHIFECCCEEHJC=<>=<<<=<:7567333;A;544445655668:;;;::88530///24668>B<8;?AFKNKC;::9;<<<;<<=>=8;SnzzmijqusE4???@?BBA?BB<@EIJKLKKIGFDCA?@@=;;978@DBA?????@@@@@@?>@@@?:777677558::?FPSSSSSSQL@0;OIJPSN@;;88888999:::98:CGDDGA;9:::;<===@EIIHGHJGC?=;9999=CDDFFEFB@@GQYZZUUTSRTVVUPPPOOPQQRSSSRQQQQPRSRONMHDFMRPIA@AAADEDDCBAA=:89:;;75545664368986667975@RVP?8899:76;EG;399214557758;979;;>BJMD968:><:87489446.'&()*,+,*(-1+&'*)')***)(&%%&)-/-..-.//25689854:=<841/.-%%9E4&,62=@5437:8;=<9879?CCA7,-3104999;=;9:=?BC?CA/'*-/.,)%%,7@DB5/:]??>>?ACGHHHFEFFECCCDDGIKLMNPQL?8::F]b[[WK?;>@E@:;=<;;:;?GKLIHHIJIKKIIHEED?<=<>>AF@=<>=<=<;;975665545:=744434454568:;<;::987521/.0357;AA:7;EFIEF@>;;;;<;>@BBA@DC?=AFHIJKLLLLLKJIHHFCE@75>CBA@???@@??@@@?=?AA@;7776777789998BHDDKI@;;:;<=??@BFJIGECDEB?=;:999>EFEDA@CEBAEHGDECDFFEGJGIHJPRQOQSSTSRRQQQQPPPQQRUVRIFKRTPFBKPKJGD@@>====<<=<;9:;;;:;:7:WvyZ\giaXOMLA?BBCDDDDCBAA=::99:86754357779:777767873>RVL8/4788437><20695/-/5:769;>><<876453-.891.//0.0;<6,))+,,--,,/42-))*))/8<<;82156-')+-./..-,++,+))))++**-7<61-+,-,*))((,05532,'(1;:/'+-((+()/=C4'*0*%(-:A=950/8@=4-*)%&))))+-(*/+&'(*,-+,.,**)''')+*++****,/4323334751+'''&'(.1>E;7;38G^xbFMWO>103445;9-)*.3-EmD3+&,.+38;648@C@>?AGG7053/05:86;@FKKLNTXK6583,,4<:7666622377652027:721.*)+*+.-)(/7;:50.39>=5+(-4.(08@BBC=98:6/5@FDDB?<8421010++25/,++-.1983.+**+,./358?=0*((((/8>=7/-296-+/23210132369;;;8546850430.-+***)('&&(+.001,%(7=2)(.0*(+*)*2:0(+2.%',;F:+'%(05343(%&()(''),)*+((*)).0*),++++*((('(*)''((+.1/0352---///12345:,6SSD8:FYk`HDIO[S@30//,16/'(/@F7PW>3&&:;*/4LRNGDDGIKNVI9779;<9:;;:979<<<:::;?@@A@>:<@CBDFFGIKOQSRQPOPPPNKB88>CCCA??>>??????>>@BB@:7766777777777776;VedabcY?3?JGYU?9875568::9:<=<9;;>>ESYL=;>==>BEKKGHKJF@CFEGLKE?;:;<>@ACFGGCA@AA@@?=<:989CHD?EJFA?>>=;;==>@?<:878;DFDKOQPPRRRRQPPPPPPPOOONONMNKHOSNA9BMMHKRRL=:>=<;99:;;<<;<<73Aez|gigc_^VNQT^WF?CDBCCA?><81/;EE87C@755685005766776533BBACFJKLI=324675467750--,,---*('-0-.17>>9:<;9776229;86312:A>821-))*-.-))2:;82-+2:@@7+'-44/580-.48><63/6?@=;9960.-./00*,11.**).223-/-+*+-..168;0*,130-0102444679;:7540//.03423/-/0.+++**)*))*+-/2/')7;2///1,+-,)&%)((+00)%*;H4&')*+/121+&'*)(''*-**(',.*&+.,**)+,,,,,,**+*)+/3321379:2'&0898:<=A?8/BXQKGMIGF>DPSWZPD??>7247/',,5QB0fyHC8$.C;)-158.1639:0:CA7;L[_fkg`G0274.1?GEITQLIILNMV^ULU]QB?GRTC/*.4//*,?d?#.0,+(()'*.79.Bo}R//11+*0442122SRSTSTUTUVVWWVXXYZYYYXXXWVVWWUUUUUTTTQQUWVVZ[[[[[[[]]\^]XUSTY_``_\XURQQSUXZ\]^ac`YUVTRRRTUUUUUUUTTTTTSRQPPPQQPQRQQRRRTVVUTUUUUTSRRRSUTTUUVVWWWWWXXXXYYZZZ[[[\\[[[ZXWWUUWWVWXWX\_[WYYWZ^]]_ekllmmnqttwyxvspnpuvwy~xlnuwy}wpga_[Ydx|xvtrpxv~yd_fdaaaa`chjghuw}n^wvjgknprrpmlquqkjqtmghiiikkjisxuppswz|~|xpqpmxzprw}{wyyxzxy}yn~}xsqqrxsooroigilu|~}xqn}yd\]\\\[\\VhkYYcimsvwwuqollnvzwopwpljgfdbpzkXh{f^_^\\]\\\^_^_cRaƄT\\[[[[\]]]]]\[ZYZYUUWWVVUWXWWY[Z]daXVX\_h{scXSU\c_YVTTQOQTWVXXUSRQQPPPPQQQPRSQQRQPPPPOQRRRPOPQQQQQPPONMNNPQQTXVQOPQQQQQRTTTTSTQPTPSSRRRQRRQQPPSWVSRRPQSQUm]RVUTURR]jjge_VUUUUUUVVVVVVY[ZXVVY[[ZYWVVUTSRSTU[ZXWVUTSSQPPOTYVWZ\[YWUTTOLJKLMLMMLLLKJMTVWWSOMMMSYZVSNMNNLLLMNOPRSSTVWh\NOSWYYURSSRSTUUO]|hQTUSTSRPNLKJLOSRNKMKOWWVWWXWUUUTQijIQXWXYUV_NMOPQPNMLMLJPZ\k[[MLJIHGHHG;J|V[Q7:V\ZehjaWOJJJHHHGQknf`YXUY__][WTRPOLJGCACBAAAA???>@BGGGEBCCBBAACEEFDCBBBABDDDEGHJJNPMI@<<;:;:?@IZ`ZI>;;;=@C;7:<=:8:<975>KRPIEFIMPWXH;9;;:;>ADDA<<==;::86666566665544444456544458:1;:::9899;=AFGA;:;:9;><<;<;;::8;AGHIHFDCD@?>*O|oqrr~@;?>??>???><;=ACCABFGGHILOPPQQRPPNNI=8>CCBB@?>>?>>>??>>@BB@:76667767987689:87D\fbacbQDJF:ISA9864567779;<<;:<=>;BRTC;>===>AEIGDEKNJCCGHJJJGA?<:<>@ACHIF?>=;;99;CHA>>AC?::=BELSPOSTTQOPPPOPPPPOPPNNNNOONOLHHQTG:84*'5AA;<@<8544664356666785335<=66665555564233489653.04647?DCCGJLKC8434101222311232230/2,'-21-08@A????>:75318=:830.2B:*&+1332/(()*3BH=.175375431/.**/64-+...-*)/611++**+042///4>C:/-/,.05>>70-//.+*-0/8:46414<<3.,**,//+,23/,,++**+,.00-,+)*275--6721243544441+($%+/2,'*7A.252.,,,*))('))(''*.*+&'/0+$&*--,)*,...//-++.369<;86=@@?5))18:8:;OTFFUSD>COXTV^^UNKMO@467.)(*/GJ9QWDK;&6D5,./..-472:7)-:FEEP\]abZK9-,--+.>IJQSE@FHHLKEFD=NaQC;.8JG1&*.**((6J2"'*,-*'((&%5E=;sD%,--..-,,--,,TSTUUTTVXXXYXYZZZZ[ZYZZYXWUUUUUUUUTSSTSUXXX[]^^\YY\]\YWVVTPPSY]``_^\XVTUUTVWWWWWUSRSSRRSTUUUUUUUTTTTTTSQPPPPPPQSSSVVUWWVUTTUTTSQQRSSSTTTUVVVWWXWWXXXXYYZZZ[[[\[[[ZZYXVUUVVWXXYYWUTSSUYZYZ[]bddcbcfhfinnllnlknmhimj]\fomgq}rgb`\Zenrsqmmzxw}uc]aca^[]dffhiimkhwqXvyhdfilihhggfhiiikmlhfiijlkjjly|vsu}{zynpv}zqnqx}|yxxyvu{z{ur~hiqjikp{yonplr}vb[Z[\[[\Z]xZ^djsty}}uihjhjnqwm`imrtmkhgfbiocZ_`\^V`ddd`_^\\]^aa`aRaɆV\```__`bba`^]^\ZZZWVWVXZWVWWYZ[\af`XWY`]krwr]SQX_ZSTTTSUVXZ[\[VQOOPQPPPPQRTUSQRSSRPPONMOSTSQPPQQQQQPPOMMOOPQQSVVSPPQPQQQSTTSSSRROMTTSSSRRRQQPRS]d`VSRRSRUTa]TUVVUVTS]hje_VSWWWVWVVVVVVWWXXWUVWXXTRPRRSTSSTTYWUTSSQONMNNMNPOPVZZZ[[XVSPPPPQQPOONMLLNSVWUQMMNQVZZWROPQPONNOQQRSTSOK_dQIJINWZXUSTSUUTQNWZWQRTUTRRRQPOPOMLKKKKLOWXWWWWWWVWUQXrhNSXXXXXWRTONPPONLLLKLOVZǪ`RPLJJJJJKJIFD`{[YJ67\hQXele\PIJJJJGHYghbWPIL\gb`bdghgh_QKFDB@?@@????>BGJGGDBDCBBABBDDCAB@AAABCDEEHIKKONK??<<<:::>:7;;=;78=:::<>CKNMKKNNPWPB89::;=<==;:87666656544444444444643431243-=<<:999;=BHJJD=988DI><:=<<=88AGIHHHFDCC><>4=mpqotf?@????>><<:::;<=?@@BGGBDHLNPSSSRQPOM@8;BEDAA?>????????>@BA=:766666689876778898K^`a``ZQKB7?KF:865666789;:::9;>=;?NQA=><===?AGIEACJLHFIKJJHHDCA<<<>ADKLE>><<>BDFIQTY^[URPTURQQPOOPOOPPOOONNNNOOOQJKVQA<>?JPMSXI999:789:::==:59cyeZjuogeleMMXL;5;BDEDBCC=641111//3679764455666557897300021243334543/-.///053+(.0.-1?1,//-03;B=6331/0-),27>>41+(,4843332299/)/4/*(((**+,,/0/-+(*1671.010-+17979=>==8+$)//01/455;=50.,'&(),,*))()-1+-+-43-(.52--++,..---+)+4;<;;:99>@@=4/..27889988@MQRH<;=EPV]aWYdb[XPJLA5891''''6;-.:CF8/:>40-,+*,462781108BMTUNJFA;4.**-15@FMSH54AHOUJ@??59^Y<5))6:/)*(')((/21-(&,2-''()2BMM>m|4"*').0-+++,++VVVVWWWX[[YYY[\]]\\\[[ZZYXVUVUUTTUUTUVVWXY[ZZ[[ZYZ[ZXUQQRRRPQSW[^_a`\[[YVTSSSSRQPQRQQSSTTTUUUUUUUUUSSSSQPPPQQPQSVWXYXVVUUTTTTTRQQRSSSSTTUVVWWXYXWXXXXXYZZYZ[[\[[[ZYXWVTUWVVWWYXXYVTUWVUUWYXX[^[YY[^_^`bacfhhfb]ZYXUXcnj]b{}|obYTU[mxoebjrwz|td`_aa_ehkfgjijljde`bwvnljgdgjgeddfghknkgegijlkijnt~}}{wpmtyv{vlq{vtrnqxzzrr{yqntw|vg\cbbdefhkwvog}~uaX]_[[\\Zix{zx~michq{{|}}ldhhfgkoshbglspliggddjd^^\\Z[^`bdgfc_]]_die^TbLjZabcdddefeca_^^^[[]]^]WZ]WUXY[\[\cd]WX[`__y{nzjVRX`b^ZYWVUXZWVWWRPPMNPQQQSSRSY[UOOSVWVSPMJLQTSQOOPQQQQPPONMOQRQQRTTTSRQPPQRSSRRQQRTWWWTSSTTTRQQQRWbd]UTSSSRUUVWVUWVVWWUT[fjdYTWYXXXWWWVVVWWXXXWUTTUUSSTUVUUTTTTSSQQQPQPONNNMKMMPRUXZZZVUUUVXVTTSSRPPKMTUSROMLNQUX[WQPQSRPOQSSSSSQQIJfVGFGDIRTSTTUUVVVVTRPPRUXWUSRRROJHHIIJKMLLNUXWWXWXWVVUUWecYXYXXXXWWVLLONNMLLLJLORTĉ_MONLLLMMLJGJHFhcVE?>cgPdpiaVMIHJKII[fc^XQGLcnc`daflnpmWFFHB@>>>???>@FIGFEDCDCCCCBBDCBBBB@?@BDEEEHIJKQND=>>>=<<<;>:KoaG<<;9:8;@<;;:=:<=<>=>?A@EJIE<=>CHKE=>>>><:88778:;DGACHKNPSTUSQRPJ>8:BEEBA@??????@@??AC?:876666678987667778689EK;787777899::;;9;=>==;:?JVYXWXZYRLDBJOQSTRQPOOOPPOOONNNMOPQTSKKTRA87?GMT[Q>57:<;8668;==:9=98bdY\hpomkmjP@EA@HQLEDCBCC;79::742001456665544556667861.++,-/0224442/,,....0462.11/+-6?@AGIC:2,+28866:<941347;AA74:3))*)5GPPMF?<:9<=>=946:=<730.00,,--44,('(-7<5.-+(-6>A9*%),03355442.19426/18/5885684/-/9<4591+,.44./(&(),2886;>9:6,+.0.129@;44420111383)'')//%&*20,2:7-+****.6814<;72/5DQWNCB@6-.--07=BGJC6/4?FMOIE>=>Dfb7,+)+-.10++,--,*1;;24:2)(&-DQKA;MV1%)'(*-+)(()))VVWWWXXXYZYZ\\^``^]]]\[ZYYXVVVUUUUUVVWXXXZ[ZZZZZYYYWUSPNPQRSQQRUY^`^]\]\ZXVSSTTTTSRRQRRRTTTUUUUUUUTTTSSQPQPQQQQRUWVVUSSTUSSTTSQQPQRRSRTUUUVVWWWXWWXXXXXYYZZZ[[\[\[YXXXWWWVVWWXXZZYWXXXXUTUUTW[YXWWW[ZZ]\]_cfb[WUTTUX_ff__lwz{y~sbVQWktma_clz}odfeca`iopffihhfeeft}xsj{qffnngccdefgimnjhhjjkjijls~zwrnkq{{uzwnrvrnnrsopuvrmq{wmxvu}z`ihffddgjlowf||tbWcg\[\[ar~ymmvvv{ygcpz{z~uihggghgkg]_lqrnifeeeeeb`a_^\]]\^bdd`]]ahsjZW`Ƃbiceddegjie```a_]^^a`\XY[WWXY[]\[^^[XZ[^aceh]U[fje`[XVUTSQPSVRPOOOOQRSSUUUUWXVQNRY^]XRMKKQTROOPOQQQQPPPNNQRRQQQQRSSSQPPQQPOQRQQRSUUTSSSTTSQQQQSW[YUTTRSTSTUVVWWXXVWWWVS\ih`VXZZZXXWWWVVWYYZ]\ZWUSTTTTVWVVUTTSRQPPPPOPOOONNLLLNNORRRRRRSSTURPNLKJJLFISSPOONNOPSVZUPPSTSQRTUUTUTPPK]]GHMLNQVURSTTVXZ`a`bdc^[ZYXTRQVZYUNJGGJMLJNSWXYYXXWWWWWX^a_[XWYYYXTNNNNNNLLLLILKPIj̹eWPPMLLMNMLIGGG@YkXJNEduZZlke\RJIJKJI\ea[UNFPipc\ZQNU\a_K??FBA?>@?A@@CFFEDDCCEEEECBBBBCCCD@?>BEEFGGHIKRNA@????>=<9D:FkaG<<;::87>A=98=>>?<=@B@AABBFJOPOOMD;78:78<=>?A?==:877777766555444444456531,,,+-/>;9:98899888;=CJNVMA<=DJMPSICEHIHEDBA?ACEC?>=Dpqll{`>><;>>=;997888899:>=;@GDCGJMQTUWTOLJ?977ADDBB@@@A??@@@@@AA<986666667788766777765?TbdgT899779;;<<<<;;<=>?;>DC?<=<<>?@BFLKF@>CFGGFFGGEED>=;<@BIMD=;98::;@DIKLMMLKKKMNKC?==<;<=@EJOU[ZWPMLHA=::=@DINQRRRRQOOOOONOONNOQSTQFMXI9=AEKS\\I6779:<>?ADDD@9=9C|dfYYfmrqohaQAA?BEF@78A=942357>C6-3/*)(-AQLA=9789;>??=82016::83/4880+*,.)&(*09;3)()),4==4*')+230168431.,,34/0./0.-,/32,)1:=9362)()23-1'%*.36767=B>6/++-//001553100123435<;1.*(('(.22,&#$(/0+*('(.24567778960-++*)23--./1100/0001//../14*1:920035411,''*/0-)))(*-0+-,**,/149975//42.---,/49:88877753364/./39<;::;<::DJEB@GQVVXXZagbSIKSUA5:7.)&(+/.)+,)).9><3.++-02;=36A=5789?HMC;>?844349>=<>;0/6>A?><;?:9H`pX5*'*-/2652//11.-3?EB?;1**(1L\R@557/(''''')('((((VWWWVVWYXXY[]^acaa_]^\ZYYYXVVVTUVVUUVWXXXXYZZZZYXWWWVTQOPQQRRQQQTX\]^]\\\[YWVWWVUSRRPPPQSTTTUUUUUTTSSSRRQQQQQQQRSTSSQQRTSSSTSQQQRRQRRRTUUVVWWWWWWWXXXXXXXYZ[[\\]^][YZZYXWWWWWVXXY[\\[[]\WUUUWYZ[ZXVWXXYYYY[`_ZWXXWXWY[]`bbepyspy}nZ\s|wh^]lshbgmmhjlljhggggfcabai~yoruimvpcabbdfffjonlkkkkiiiinyzrqomls~~~{|}}}y~rqoginrtoku{slputqxxyjcd`s|s|xsd[ln][Y\ksqrpnq|s~{~wfdrxxvz|nhggeegdcbahlpoieffddcbba^][\^^^]^__^^cmqgZ\Sqfqfdabgkmjd`_aba`_^cd\WXXYYXX[\[\^\ZZZ]dhm|q\\Z\^hrm_VTSRRPOUWSPONNPQRTTTTTUUVWXXVUYab`XOLMQUTPPRRQQQRQPPOOQRRQQQQPQSSQPQRPNORSQQQSSSSSSRSSRPORSUWWUTUTRUVTTVXXXXYYXXXWWVX_hi]XZ[ZYYXWWVUVWXZ]a`]YSQSSSUVWWVVTRQQPPPPPOOOONNLKLMMMLKKMMLKKKKLLKIGGHIJMQQOONOPPPQRRRPQTTSTUUTUUUUQOQbNENRUWY_ba_]]]^`ceeeed`\XWVTRQYfptm^ULLLJKMRXYYYYXXWWWVVX\]YWWYYXVSOMMMNMLLKKIKIMI=uҗFTONKLKLMMJIGHGCPmgWYWcyn\ObqlaVMIJJJJ\e_XRMHSgj_YXVTV[VEA?>CAAA@AACEEGCDDCCDEGIHGECAABCDEDB@@BDEHHIJKNPG??????>=<9@=@`bI<=;:9:9?@A?@@A<;AJPOONI>::<96:;<<>?<<:877777655555444444456541)-.-./999899::99=BGLQPOHA>?>BFGHLFEFFFGDA?>=;>BCA@><9;98676666688877666666667CZgj]E?689=B>:999:<>AA@@=;<==>==ACA?<;:;=???AIMLD<=ACCDEGFFD=<@99=@GMB888759AGJNONNNMLKLLMJGC>?>:7@M[[TSNIHC@><;:;;:;;=AIMOQSTSPONNOOOONNQRRSMHQM>?FFDGMQJ@==AHMLKJJLLK?;7Rb>c\TfpwtmaYRMLHFE>6786@CA=<:B;2..3>B><:)5E?431+('+.120,,++4?@9.+264:>9;C?24AKH@<9888:<;:@JE96765GKCCW^>(),.022341.-,.03359@>5/0/(2ReX>00.*(''''%'.31*,.WXXWWVVXYX[\]`egdca_^][YXXWVVWUTUVVUUVWWXXXYWWWVUUWXVTSRRRPPPPQQQSW[]^]\\Z[ZXWVVTTSPNOPRSTTSTUUUTTSSSRRRQQQQQPQQPQQQQQRSTSSSRQRSTSSRRRSUUVVVVWWWWWWXXXXYXXZZ\\]^`_][[\[YXWWWVVVVX[]^\[\]\ZYVXZ[\[ZXWWUTUTUUX[[XYYYXWWWW]ec_gqqiht|tz}ukmx|l\\fc`beistnkiihggggd`\WYk{yw~}zmpxk^adabddegjlmlkkkjihhkt{jgmnloz}ywy{yy~zipolprtliyxmnpqoý~xvua]fwyub`tq_ZZhxwurnmoortikwxttx~qegfdff`Y`fckqnjfgheedca`^\\^_aa^_^_^_fmia\\Qkcje`Z_knnja_`beg`\mSZXXYYYYZ[[^`_XUXdoolh`]`dh]c{|lYSRRRS[[SQQPPOOQSTTTTTUWYZZYYWZagf^QMPTURPRTTRRSSRRQQQPRRQQQQQOQRSTSQPQUUSPPQTTTUSQQRRQSSTWWWWVUVUTTTTVXXXXXZ[\[ZXWXXXbli^\\ZZZXVVUTUUWVY\]^_[UUUTUVWXYXTRQPPPOOOOOPOONMMNMOONOTY]VKFHIGHKQVXTPRQOONMNOQQOOPOQQRQQSUUTTUUTSQQY[QRSSVZ]bgiiknnke`^[WUSSSSQPPONRYftulc^XRKILRXZYYYXXWWWWWWZ[YWWWWUTTPNMMMLLLLJJJIIF:Hl@KLJJJJKKLHGHHHEIfcHN_Q}mQSZnpeZOIJKJK^e\UPLNXa`]]_cd`XOGHRBBAAABCCFGHGADEDDHIKMLJGCA@ACDFEDB@BCGJIJKLRIA?>>>??><:9;>>Q`J==;:::;:==;<<==?>;>AEFILLC>==;8:;;;?>?@DDFFFEECA><<98=DEB?A?ZqpxT8;29BE@;98999:::9:;;::;DGGCGKQUWXUJCFB=20EEAECA@AAA@@AAA?;8777776667888776666665985JfjbJ<989::;;;=?ACFFCA@=;;<<==>@BA?=;:;=>>>?CHLJ>;>ABBCDDED65C=5;=DMA66669BJKMNMMLLLLLLLKIIGC@;48GT]UGE@<<<;;<<<<<=>><;=@BEGLRRQOPPPPOMNOPQQPMNLC@C@@AABCEDHOXZQMMLOMF::7_?0M]Wlr|vaX[UPLKKNJAEC<>>BHQPNMKHA9445:@B?=868;<5.02;;0000113574207<:;;4../0258:4.+,486433337;;:::9643359633688:50.)()(2BA1/4678@HGJCALI>DJDA9/*/1123445/+,++38857==79=5(6[gH,---(((&''#$0;5/35WWXWVUUWZZ[]addccdca_^][YWWWWXWUUVVVVVWWWXXWUTTSSUXXVVVTTRPOOQPQQQRTX[[\ZXYZWVVVTSSRPOPRSSSTUTUTTUTSSRRQPQQQQQPPPOPQQPPRRQRTRQSTTTSSQQSUUUUVVVWVWWWWXXXYYYZZ\\]^`_^^]]][YXWWVVUUY[]^[[ZZ[]]ZZZZ[[[[YVTSRPPSVXZXXZYY\]YX\ab`dhjjehqpilsrrsrkktuqmjgt}q`^``_`lwskghgedegea`_biox{|{{usth]bd`adddegijkkkkjggjnxvgfklminvtx{yynpusrrqihxunmopnwvr~}uctktvw|rbeupaX_yxspp~~ny}|zxy~|y|qt}|j`aYR^eehkigggeeedcb_]]^^`___^^]_gme^][Um``a_S\qqlhc^_dgd`[cQ][ZYXYZZYZ\`_WT^pyn`][^grwd`z`TVUR]eWMQRQQQRRTUTTTUVWX\[VQSXblk`UMOUSLOTTTRTTSTTSSRPQQQQQQPPPRTUSRQTWUPOQSTTTTRPQTSSUVXYYXVUTVWWWWWXXYYYYZ\\\[YXXZZ[dmg\ZZYZYWVVUUUUVWXXZ_c]WUTUUVW[YUSRRRRPPOOOPPOONOOOOONS[cj]LJKIKQX_cb^[YWTRPPNMOONMMNOPQPQSUUTUUUTRQT][[][ZZ[]`deffdb^ZWTRPONNNNNMMLKKKRZacdegi_SLOXZYYXXXXXWXYYZ[ZXWXXVUTSQNNNMLLLJKJJJEGDSCHIHGHHHIIGGHIHEITJMSPPmgMXYfoi_QIKKJOeiZRPNSXYX[a_^aZKKUSSEAABCDEEFFFGBDEFIKKLLLIGC@@ACFFEDBBCCHJIJKNNE???????><;9:><;:::89;?ABBDFCB><;=??>>@@<=BKOJA?=;:<<<<==;9887887776665444444555554125651,368999:@GJHE<9:868:;<=?=>?BEEFFDDCCA@?>;\lbG=<9899:;>BDFJJHDA@?;;<<<<<>@@?><:;<=>>??AFKC<?@?;99;<\Vju|r\[^SLONMMOIFEF@@EKUTROJEB?:866>=;972--1335787674-((**5>86<;0+/8BE<2276552265212++9:1++*('-6<96562/..-)')2:=><742,,.,(,37620121/,,-+))*.,.<6,,/.,)'*52-*)))('''')*.45.*,,)))++*+,./0131+,++)(.:CC?9532,,54.,,,*)(&%&'*29<91.++++,--,-.1462-*+./00/241+,/6>:/.17840-,,,,+*)(*--.00/-079512430/037?@<868>><:630037?>8@FC=CKS[VILQ`}jHTS3)213322,(-5=:/*-,+*,5>90-+--.3;6458;AC<35777>@-)04510;A@@<3..-.9D@BLD417?E=3234668<<8221..6:;<=B@>DH<*@CEFDEFFD?=;=????@B?;=GRNC>;;<>==>?<998888877666655545555444444999960369888:=A>9644677:<>==>=>?BEEDDCEEEECB>=;96:=@?<<<=???@??><::<=>>>@??DFA=?ABBCBCE=34DA99?IC99>HQQMMLMMLKKKKKKKJJKIDA>?@B@=<<===??<:;<<;;<;<;;=;8:CFHMQRQPOMOQQONOPJC@AAABA@ACEILMLMMMONDB?D^?RL@YRdx{iT`_RLOLKJIJKFCJGDDIJJIF@=><:857>DBADGD;2,,1.-1346666778;<67<=<=:424798776668:96642117>BA>>@>5.**+-06863251+()-775?HE:.),5>=9;<<<;99:6225004553,((*08<85330//,+*).221333331..+(.443201210-*,/,('*,,42-,,++,+,76-+-//,*))(),2541461,*((*'&+.//142/00,)*3@A;8740-*/63.-,,*)(%%%%&'0;7-,++,.01.,-0221.)()***,1531,&&,6>;878830,++-.-+)')+--//,('*-03352./4<@BA@?ACE?;;84/05>C;9FHGHGMRNNNC:;BDIPWYM>=EJQB7D<()04::62+'3961-*)+*)+/470-)+-/37300033551-,.1/+)-/354;=83/-++,03469:93.(&5>:999;>:;BA7553013457?B>?BC>1AXA,/-*)(')))(''%(8@:6WWXWWVX[^^`cc\TQRUXZ_`]\ZWVUUUTUVVVVVWWWXXXYZ[ZWSPPQSSRRPPPQRPRSSTTUUTTUUVUUVVVVVVUUUUSRRTVVTUUTTRQQQRRRRQPONNONNNNOONMNOOQRRPPQRRQRQOQSSTUSRTTUUTVVUWXWXYYZ[\\]^__`a]ZYYYZ[ZYYXYYZZ[[\[Z[[\\\\\__`ZTWZXTSRQSVXYY[Z[__aa]Z\^aadihhfedegmctqjg^baa`\\gupb]isigefgiiebbbdkrssy}|}~{i`bc``bdeecchjjklifmxxmmsleghilr}vqtvvwwx~vpspnjhkmmmmpqoruy|t~y|~~z||lixvpd_kqspr~y{mhlolptؽvOlwkilkigdb``_^^]^]^^^^^^\akd[Y]Qa_^e__pvd`__chd__S[[ZYYYYYYYZ\\[Zhnga][]bisuh_YewXWVV]XPNQRRSUVWWWVVVWWVVXWTQQPRaqgVTWPJLSTTTUVUVVVTUTSQPQQPPPRRQPPRVWRMNQQRRRRSSTTSUWWWWVUUUTTTVXZ]a`\]__]\\\\[XXX[]_]]bfc_\[Z[ZYXWWWVVVWVVW]c_WTUVWVWWVUUUUTSQPPOPPOOPPPPPPOOOSXWVUV[cdedeeec`__b]QKJJKKMNPPQQOPSTTUUTTSTW[^`a`_]YXUTSTOJJNQRRQRQPQQPPOOOOOONONOTWZbdb`__^[YXYYXWWWXYYZZYYZYYWUUVVUQOMLLLLKKKILM@ەAGGIIHFFFGHGGHHGFIUZNILLMHVscQ[hfYPKJKUidTMIJW]RS\bZXWOGINMHB@CHGGFFEEHHHDIQOOPPOMLKHDBACFFGEDEGCJNMMKIA>????????==<=>:?NIC=<:;>BEGGFGGGFFIF?<<=??@@@B@==CORF<;==@?;8999988776666655555554444469:;<=7358788:<;6589:879:<>>><<=@BBDEDCECECA>987445:><:Fy`75989=BDA><;;:989:::98889BGFDGNQTVNB>A@?>?BEFDCBAA@A?><666765555677666666665546768;95=Wa@9::::79ABKEDFIIIHFD@=<<;;=>>>>??>?CC??ACBBADF>8:>=;9:@?==BILMMKLLLLLKLKKKKKLLHAACB?>@B@>=<<@@;;;:::<<=?<<>><=>;57<=?ADJOOONONOOOPPME@@@@A@?ACEHHJLLMRTG9BGCN7FXTTQewz^=R`SECBDDFIMKB?@D@2*++*--//02/.1104;?=;=::<97664765565668854432.0?D;8?C?4,(('(*283-)/00+*,33;CC>9.*-5<<;>@@@==@<85///1225<5((.49=;77740-+*-320,(,,.259:2+,2520020-/1/,-/0+&),*-63-.,,-,+3:7/),0.-.,*(+042/351-.0--+*/022479:5.+(+6E>2/-*(')160--,+**)'(((&!'65,+,./131/-02//0-(&()((,10+)(%''*8<><82/.+))-.-,*')+--/+)'%&*03331-/5>>@@ABDEC<7665329@@:BLHIMJJPQQTPHFEEJQSPHDED>8330-(+136683*&4>1)*,)))*+-/220-..1363/../-.0..02547;52332.)(,/-,*)..-+'(')3:=?>949<><99B?7765322027=>868?@=CJ6.0*(('%&+-)'&%(5@<5WWWWVUX[^`^[WSRSSQQSUZ^]YVUTTUVVUVVWVWWWXXYY[]]][XUQPOOONNPRQQSSTUUUUSSTTUTSTUUTSTUUUTSSTUUUUVVSRQQPPRSRRRQONNMMLKLKKKLOPQRRRQPOOPQQPPQSSSSSRRRSSSTUUVWXXZZ[\\[\]]]]][WWXXZ\ZYYYZYYYZ[]][ZZ\]_^]^`c`YWYZWVUSSUWYYYYZZ[]_^[\\_a`ceigfefhkifmsyvlkjkhebZ]efb`uyokgggkok_^ineix{h`cdb`acddbbfkkikprttmelwnceghl|ymoqtuuvw}znnoliikpnmvytuwx{{w{{~~|pmwvpebowuqs~~}lakqwtخc[n|vnlourgb`__^^^__^^^^_aaaeocXY`W^gfe_cxxahl`_spH]ZYYYYYZZZZZZ\Zaila\\ZX]jv{q_`^Uh[UVWVROPQSSTVXYXWWXWXXWVVVUSSRORehXXVLSXWUTTVVVVWVUUTSQQQRQPQRSQPRVXUSRRSSSRRSSSTTUUVXWYYXXVTSTVYYZ\]_aa_^]_^]\[[\^``^_babd`\[\[YZYXYXVVVVWVXch_TUXYYXWVUUUUSRSRQQPOOOPPPPRQPOOQWXWY_eddffffd`^`b^TMKKKMMMOQPPPPQSRTTVUUTTVXZ\XUSPLKJLOSK@AJPPQQRRRSRRRQPPOPPPQRRSTTVXXW\kri\XXXXWWVWWYZ[[[[[[XTRTUURPMLLMLLKKILMDmuBJGKKJGEFHIIIHIIKQWLHLKJNMNt\@?_i`SKJKSec`\SLNTRU_aZVQLIIJJF@BEGGGGFEEEEH??@@@=>==>;=IHC?<<@FIIJIGIHIHFFD=<<>???@@A@??BJNM@;=?>::899:999877677666655554444569:<>@<55668::;9887:;9:>?ADB@==>@BADFED@<<:986554458988:f\557568BDDGLQRQG?=??>=>BFFFDDBAAC@;7545664444788776666665446888:977I];6989:75BYXGDEILKJHGB?<;>HJDBCA?><;==>???@@?BB??@DDBACC??A@??==?@?>AFJMLKMMLLLKLLLLMMNMF@BDC@@@@@?=;:@@;:::::;<==;;<=<==;:;:<=<;>EIMOQMMPPNPOIBA@AA?>ADILJJKLNOH;7FOAKP=I`[UjytO-C_T8:?BBDJNPF0)4>7BRQQOOK=02768=CIKB3-*))+..--./.,*)*0CEA7;A?::963232100,,/46758=<6-++*.10.-..../1250,.330..22./122..0/)()))/0-20/++*2>;9750+,./--,,//0111-3GMEA9.(+./.-1A>887752//28<<306=CACA5/*(&'(+.2561(%'-762WWWVUVXYZ\YTRRSTSQQQPRX[ZXUTUVWWVWYZYXYWWYYZ[\]_a_ZUROLKLOPRRSTSTUUUUSSTTTTSSSSSSSTUUTRSTUUTUVSQQQQQRRRRRRQONMLLLJIGHJMPQPPRRPONOOPQPPQSSQRRQQRRRSTTUUVXXYZ[\\\\\\[[[ZVUVXZ\[ZZ[[[ZZZ[]]][\\\^^]^`aa^YWXVSTVVTTXXVXZYWX\]ZZ[`a[Y`cfdeffikf_hnz|}rttn`UXgf`i|yqlmigioqe[lxmt{h^`bbbbdeedcdjrojryulhfjoslihcjnrpossuux}zmkmmlkmoomz{w||z{|w~}}~x|vmuwpfapxvtx{~|~ujkqkblg__hjjiqzrfa`^^]]^___^^^`affgpfW[aObaec]dycn_cڮcW[\YZYYYYYZYYYYbhi`YYZYV[n{i]^`NPs}\SWWTPPQRSTVWXYXWWXXYZWUUTTSTTONYe\]VMU\XUTTVWVWXVUUTTSSSRRQPRSRQTWYZa_WTUTSSRRSTVWWWXXZ[ZXVTTTVXXWXZ]aa`_aba_^]^_aa`__b`ac`\Z\\ZYXYXWWVWVWVU_jdYVYZYYWWVUTTTSTSRRQPPPOPPQRQPOOQVZZ[agecfgfdb`_a_PJIJKLMMMOQQPPPQRRSTVUUUTUUWWSOLJIJJKNQI?@INPPQRSTSSRRRQQPQQQRRTSSSSQOMQ\fmh]WXXWWWWWX[[[[[[[YSPPPRSPMKMNMLLKIKNKHeBKHKMKHHHIJJIHJMWZKDIMUWWWNEHF9G\dVKIHJJQTWYLGNQW_^YPNKHIIJGDEFFGGGGGGFBI>==>==DEDC?CHJIHHJJKLKJFAA=<<>??@@@??AACELRC<>@;7:@=8899::99877777766665555444579:=?@@9644579::98799:BHJKHGECDDBA?BFEC=8555777677765659WuzP355347;BFFDA=<;;?>=?@AA@><=BEHMQPJB?=>>>=>@CFFECB@AA>8544565434456766665666655798777618QI3988997:P\OEHFKKJIGC@>;=<==??@@@@?@@?@EDBA@@@AABCDEDDB@>BIMPOONMMLLLKLLKLNPMDADDBABA?AA>;9=?>=;:;;;;;:<<:;:::;;::<=?????GOPOMNONNPLDABAA@@BEJLKIHJIC:79AI>=VUDL[Wiv`9,6HP03>@?AFPVO:'(8?9DKPRRPD418715BMO>.-,**,/.,+,..,)&(/FE949B?<;<:3133200///00025:<5+)+*,--.2120/..++,.021.--.132233/-//+'((((*-1350)*5<;5-)%&*/0+))++))(&')*.21/1335677882,)((1=:1...69435()3=8-*-1/-/260)*1344761118<2+-.+))*,,,./..-+('(((*/353*'*.0-+/220132/'"%,5;9540.23101:>?CBA@?830069;@GGDCGJKNOJKR__PEBBLNDCKORVSHA:449A7543/0-*&6K<(*-,('*,+,1790467;=8972/21-+09=:9>?EC;898784224898206=AAB<3-)(*&(7CA=><1('+-+)WVVUUVWVUVUSTTTRQSRSSRTWZZYWUTTVWWY\]\[YYZ[]^]\Z[YWWUQLKMOQRSTTTUUUUTSSSTTSSSSSTUUVUTTSRSTTSSSRONOPQRRRRRRRONMKLKIFFJMMOONOQQPPOONOPOOQRRQPPPPPQQQRSSTUVWWYZ\\\[[[ZZ[YWWWXY[[Z[\[\]\\]^_^^^]ZZ[\^__`_\ZYVQPSUUSTTUXZZXW\c_YY_`YUXZ^_abeijjgghq~szzf_`dikowtnkljhegoofiyyxjeea`dfedfgebjvwoosojlkhtwq}xqrpruutuw|volmnoonnmlyzz}}}y~{z~yp|wyv{sikrwvwyxr}||~yjkboɐutkbcccbinha^_]]^^^__^^`a_bnbZogYZ_YdY[[Wgxi}{^vtT][[YZYYYYYYYXWdmeYVYZZYU[rt`ZYURWcg]ZYXUSRSTUVWXXXXYYY[\[XVUUUTTSQRU`edVQTUVTSTUVUVVVUVUTUUTTTTRQRSSSTSTbcYUTTRQQSTVWWWXXXXYXWUTTVWXXXXXZ]_`acccb`_```a``_`_``^[\][ZTTWVTWWYXXVVYbjdVXYXXVWVUTTTSTSRQQQPPPPPPPPPNOPTZ[[^cddefdb`acaSFFHIKLMMLMPPPPPPQSSUVVUUVUUUTRPMKKJJKMOJCCGJLOQSSTSSSRRQQQQQRRRRSTTTQONNJJYb^YXXWWWWWX[[[[[]^\UPONNONMKLMLLLKJKKN?VAIGJMLJKJJKJJJLSUOGBIMX_]YLJJD?=GZYMJFB><>BIIFJP[_ij]PJIIJJHIGFGFFFFEEB@JC?KQTSRRSQOIDCCEGGFCEHEEKNMMFBAAA@@???>>>====>?ABDCCGIJJJJLMNQLGC??=<<>>??@?>@BDDAKVF>>?:78=;8799;:99877677776665555456579::<>@<731478:<<:9::=JQQQNMKLNOH?65@IOQMC??>>>>==@CFFEDBA@>;8655655433432455556787767888777721ER37878@ICCQPJKEGGHHFDA>=>?@@@???>?DDBA@@ACDDFHJJIC@==AFPOONNLLJKKKKKLMOKDBCBBABBABA=;9;?@><;;;;;::>>>====;:89:;<@C<8>HIONMNNMOMFCCCABBCEHJJGED@>>??>@=9M`YIW]ijA295:N92=;5<=IVUD2.>F5602<@<99982,,6:6542697743.10,*,-*)+19952210-,-.251-+*)+/23331.,+)'))()*+-2;9-*140132-'(,/,))++*))(*,+-./.+.243/.//1-,09=;:568:@A937,+2<=400/.0233.((*+*-121/044-,.,*))*-0122101/)(((()+.31*%(,-,,-/079970'%-7;:6210153,-08;ACA><<94/.49<>EKMIFJLOTUS[bYHDDHRQFDJKP[WC<854>E79>;5310*7NF-(-,((+,++,4D6478:869:1-11,+/699;>==<<<<>=;@DEEIIJJKLMOSQIC@>>>>>=?@@@??BDFFCDRP@=:846::8889;:99888677787675565457778978:<=:97:==<=?=;<=?KUUROONPUUI<>=<=?BFFEDBB@;7776775553351-1345569<=9899999:;;;7:A77:78BLNMGGKHHGEFFECA?>=FRRKJLLID<:=>>>>??>?>=>=CFDB@@BEGGIKJLKFEC>;9;=>><;;;<>>>?@AABB?<8778<@B>96=CBEHLNNMNNIEDCBACDDEEDB@@?>@BBB@>=AMbcfkmV,3BFA=83<;4:4?;;EE719??:66:>>0(4@<76:BGDB>:2++1/.0+,05742134111/-294+*)'&&)0442/*(''))))**+1<@90,,),375/++--,*,020+*,,*++-/(+11.*+-00..7BC<78;>?@A:39533443100////-+*+)))*+-//...+,.-,)(*16860///-*++**)))))&%%')*--069;>=924995530/022-((,08BD@=::94--3:::=EMIDILLRY^c`P@AIMSTLFCCL[W;2345<73>CCA@A9.5LR9(.0**,*)**-A=5@D;45:9/,12,*.369=<4=MRX[O7-250.,-/:?95227:4+,2:AA>;>>AE:7@A9:=:695,,5:7689==4/12-()0791&'/1*)33-XWVUUUTUUUUUTTUTRRRRV[][Z[]\ZXWUSTTSVXXXXYZXWXUSRQRRRSTSSSTTTTSQRRRQPQRSQPQQQSRSUTTUWVTWXVTTSQOONMMONNNNOPSSOLLLLMNONLLOONNNMMMMMMMMNNNNNNNNNOOOOOPPPOQSSTUX[\]]]^ZSSVWWXXYYZ[\\]]^^___abdda_^ZX\]]]]^_bed`XSROLKNT[]\ZW[a_ZWXYYYVTSV[_fkf^`wzsh_bhnjjwwhckmdbhkkkhglsxx~tgemlggfeddcbddgrsidhkiihhhrrn{tkmqv|}{vrx}umppqmjhis|tv~~egdcivNzݱkfkghl~~{yywxuw{}{yy}zz|z|qhzypmihunn໹kinnnllic[X_c_]]_bcba`_`^]bhgYV]\Zjx|qc\_Rc~pu߄O_\\[[[[[ZYXZW]jaVYZYXXXY\cif]WSTUW]\V`h^XUUWWXXXZ[\]afijh_ZYXWWWWVTVSQYi`QTUUTUUTSSTSTTSTTTUWWUTY[WQPRRRVb]TUVXYZXWWVVXYYZ[[ZWXZZWVVWXYZ]^____accccba``b`YTRQQQPLNUXnWmxYX`_\XVVXZ^[YXWVVVVUUTTTTRRRRRQQPPPPPPPNOQV[]^]^`bb``edYQUYUMKKJJKKKLMMOOPQRSTVXYYXWURMOSPJIKMMMMLMKHHIJLOSUUUTTTSRRRRRSSSSSSSSRPOQSSNOXYYXXXXXYY[[\\]]]VOOPQQQPPNLLLLLMLKIKHRCGGDGMNNLKLMOQUTI?BEFIH@GVTNE@?JCGKQQMGBBECCCCCHLWQK|gONPMKJJIIIIFCA=>=>CI>EINOS[ZWSJDB@CGHEFKMABKKKGBABB@A@?>>=>=<==<<<>><>ELPRPNMPTK=7=CGB967877789;;<<9457/0Q{A:888:99:?@>?CEHGDCGFFDA?;8857?ORG;;??>>=<=?BEGFDA@=86888996653553/0247768BC:9;;;;<<=>=;54::::>BCGFIFIIIHDCEECBA?>DQVOLMNMG>9<=>>?????>><=BGFDB@BGIJJLLJHEEGGFDEBCEGGIKKKLMMOOOKGB@?ABBBB@?><;;;;<<;:<>???@@@ACA<62356@JG=:9BG@<@JONNPOJFDBB@AAA@>===>>>??CLMHA8;Vpvlb?$+2==,-0;:87.1;DL;4A@220//5>GC;9826=<86435>@8**7>>?A;7762395/1440-+)''()1885678788865430,*(+/--6ACCFA9:85:B@84008EH;,2>;37GPNJGDA=63:>74/-00.-,.020020-/41)(('&$$*252/+(&&))(***,0;CB7,+-.0562.---++0871+)*)())+,+*-.---.0/).>B?638?BA@;83115630.-0540-..,++**+*'&+/-,/..//.*&)9>:/-/-)*+,,,+*)('&&&$$*0369<::==:8971053/-/0-*''*-8BGFA<;95236::87:BCBJJHKMacZE7>HKORLB<;ETM2)3;:3-7EFEIIFA1,CTB)-4+'/2,+**2;AONA4260(*33--.,,288--0.474/,.2>D8/15994-(,8CB=:619IH@DG<996463-.322337<<8412-*...02.**)(*-,+YXWUTTTTUUUTTTSRRRRRVZ[[Z[]][ZXVTSRRTTUVVUSSSRQRSRRRRTVVVUTTTTSRSRSRQPQQQQQRRRRSUUSWZYWXXUSTSQPPQONNMLLLKLOQNKLLNQQOMMLMNMMNMMMNNMMMNMLLLLMMMNOOOOOQQQQQRRTVY\\]]\VPOSWWWXYYZZ[\]]]^^_``cfddggc_]YVVY^`dfffeb]VOLKPW]^]ZXZ^]XUX[ZXWURUY]fke^fwvpkc_bpyuvqfkogbglnpmek||tz{l]\cfggeefccdchpnedgggghhfgfbeu}utsu{zvy~roqwqhhhm}pit}rejpffijTrcma`f{~zyywvx}}|{yz}zz|||||~~~motlgjkosyrjescSsrlmmifaZY]^]]blpjdb^[[ciepoXT\^[lvxjgk]dyoQbZ\[[[[\[[[ZUZ^XXXWXXXY[^be`ZTRX]_hledb[XWVXXXXYZ]_bfhedb^ZYZYYWWWUWTPWd[OVYXXXVUUUTSSSSSSSSUXWVXZYTPSRTZ^XSVWXXWWYYWVWWX[__]ZY[\XVVVWY\______acccccb`_]^bedeghhigs]_`MQ^a`]ZYYXXXYYXWWVVVUUTTTSSRRQQPPPOOPPPNQSW\^^]^```_`d_ROW]ZROMIJJJKLMMOOOOQQSWXZ[ZZWQMQTQKKMMMMMLMOLGFJKLRTUUTTTRRRRSRSSSSSSRRQONNNNPPUXWWWXXXYZ[\\\]]XOMQUWVVVTPMKKLMMLKJKIM~>KIGGKNNKJMPRVXTLCADJEB=@JKIAHDGFHJMMLIDBDCDCCCIQSL?_rVQTRMJJJJJKHDBB?=BDFGS^^ZUME@BEEFEFLK@AKJJEAABBBA@A@?>>=<==>?@CHJLLLMJJLMONC>@BBA@@??>>ACDCDEEEA==@PH3524579999;<=>>>>=>?===:87876778:;::;BGHHGGHHH@:87899?<;?CEDLNPUL:369@E=688777899:;<:755454>>=<<=?BDFEC?<:88988987779:862/032028>?;:<===>>>>?=86557>IKFGEIFIIFGDBCCCBA?>BOWSOOOONB:<>????@@A?>>>>>>>=>A:1.0/7IRI=<:>ED>AGKKNQOIEDB@@?>=<<=>???>>?BHLNNNHPadbV5*--172116331+,/9A@31.-+/8<75:;:987>>>?JUSLOSQPNB41000013330267=AA<0+18;??633248?@94210.,++,-+)+047;@@>83/-+./+)).413;BEDE@50-3=?<5/,,1<=6/2;914HZXMJHFCDBGQI7.)*)())*+--,./0/-,('((('&(.420.**)())+--..4BB3+.022342,*,,'(4=4+)')+*)))*+(+,-.-,-.(.B?8216<@B<0.2.+021/+(+021/0/.+*))*)$!&++.000100,'-=?5-03.+,,,-,-,+*++*()+/47;?A=;98887312330.--+)&'+1;BHJC9898878::987:@DJHAD>PYT:1=EFJMG@<<>C:*.@E9.3CGBIRK?;0*;PG.,50&3C>0'+2?NSNF=43/*+02.-+'%)13,'-8>;.)285/.145>B4*2=>:<>7+(2:AGB59FH??C@@>5362--/00017;=:411.-01332574-+-*)+ZYWUTUUTUUTSSTRQSTSSVXYYYZ[ZXVWVUSRTUTTUVTRRRQQQRRRRSTUVVUSTTTSSSSSRQPPPPQQRSRSTUXZ\__][WTTTSQRSRPPOMKKKKKKNNLLLNQQPPPOMNMLMMMMMNNMMMLLLKLMMNNNNOOOQQQQRSRRUY\ZYYVSQOOSTTTVYYXY[[\^^_`bcddcdffffcZRS[bcceccgie`\YRPQTZ`a^[[[ZWYZYXYZVRTU[egb]_nz}~uneeeaao}~vkkohcfjnqwqgnrsynl~qaX[bfgeeiiebfmnicceeffggeeehiip|wsuyxkry}{qnupmkjiwugrxhkjv~edeg{``zdhbrcadqt}zyxwz~|zyyyy{|}~~{y|wigdippqsxyih`zTVoqmnlic]YXZY\Ybuugab\[lmclxrbecfwlefhrrqSa[[[[\\\[\\[XWWYZYYXXYY[`fe[VSS]fjklnjbYWWWVWYZ[\]^aca`_^][[[[ZYYXVYXPRTTS[^]]]ZXVTTUTSSSRRQSXXVUX^ZTSRTWWVUUVTQQTXXVUUUVY\]ZXXY[YVVVWY]______abcccb`^[Ypźכ[MKbla`a`][YWWWXXXYXWWWWVVVUUTSRQPPPPPOOPONQSX\^^]]_`____[WX[[YXUPLJJJLKLMNPOOOORWXYYYYWNLSSPNNNNMMNNMOLIIKKJMQTUTTTRQQRSSTTSSSSSRQPONOOPOPTWXXXXYZZZ\\\\]UQSVYYYWWTQMIKKMNNLJLJLnBNLLKMOOOPRTUTTRMGBBF@]k_\VLHJMKKLMDBDDEDDDJNGEIMmwZRVRMIIJJJLHFHFD@??J@CCABO_a\WNE?BEDDEHLIA@NIHEBCCCCABA@?>><==?@DGKMMNNMMLMQSOC8>?HP434:7799::;<=?@@>=>>>?>98987778:;;=<>>??>856777BKIFFF?BJTUB5667@B:8887788988::975699:8>?;8:9:;::;<;>FJJCAA?;:;:9988:;9=JME?<>>==<<=>@CFEC>878::9888778=@9651-24319;==<>>>>?????=:9425@KIIJKJKJLNG?AAABBAA@BLVWSSQSUF:;>@???@@?>>>?BFHGDACIMPSQJ>868>ABBAAA?@>@@=>BIQTWUO[J++38432121///-/05;A?CA=92148::76436:>EB30...-,.46/((++19==:80)&',-*()277=EILF>62/+04551-**+-.,+1<<66@U`YSQNKF>BXT2))*(()**))***-/110+(())))(*021322.('*-11/-/;<-(./26412.*)+((683../01.)+341.+++*)))*2511/-(''((&%%)-12334100/5=<5242/1.,,,,+++,,-+,26889;?A?:75788642441.,-+)')-29AIIB759::989:::9:AEI@2519JL99CB@KLD;9:94*)12=GA=FOC50,)3GJ9491(1BB/(AZc]ICEC@DJH7.//+('&'+/-)(*,-,)185,*483.'&-=H;.0:CHE@CH@510.,-/015:;=;/).-+.01337?D=2./,)[YWVVWUUWVUUUUTRSUSTWYYYWUUTQPSUSRRSSSSTUTRRQRSRRRRRRTSSTSSTTSSSSRRQPOPPOOPPQSTTUZ_^^]ZXVUVVRQTURPQOMLLLKJJLOMLLMMNPRSQNMMKLMLMMNMMMMMLLLLMMNNNOOPPQQPQRSSSUWWWWWUSQPPPQQQRUWWWXXZ][Z[^aba```_`cc\TXadccba`cecabd`\VQQX^`_][[ZZYXWW]`[XVUW[^__acglifacecahx{wxummridjhbdkj`_ddfek|m^[\`cdedeifcjmiedcefefggijggksyzz{cbhytmqsvwm{yqcjygeilpz{flehnxtX\`bconzkaeditvm{}|zxy}~|{zyz{|~}~tl_[glmssvoffvqvtnjppplb\XWXXZY]dgebbWfge{qz~m^fesrxzdY^[[[[[[\[\\\[YXZ[]\[YYZ[bf_XVVY`fhgipuhXVWWWWZ\\]]]^^^]]]]]]][ZYYYVX[VSPQY```a_]\WTUVUTTSSSQSVVVUX\[XURSVVVWVTSSVWWWUSSTUWWWVVXXZ[ZWUX[^____```_abbb`[ZrًRaĭs\`a_]ZWWXXYYYXXXWWWVVVVTQPPPPPQPOOONOQTX\^^]]__^]]\\\]][YXVRNMLMMKJLNPQOOORWXWWWWTNNSSOOONMNOOOMMMMLLJHINSUUTTSRQRRSTUUTTTTRQQPPPQPOMRZZZZYZZ[[\\]][SRXYXXXWWTPONLKMOPMKMIDYFPOOQRRRSXWWUTRRPOKA?V}us\BFNQQRNNOFCDDCCEGGGGIMIZtbVWQLHIJKJLHHKHHDBAIB?A@@L_b^XMCABDFFGIKGC@RJEEBCCCCBBA???>==>AEJLLMNNNPOQUUPE;7=EDCBABBBB?>@BGFDBA?>>>>P@34;89889::<<=>>===?>?><::99778:;;=<<:87687669==;989=CRXODDF@CKK?8869A?98889887787899757;;;=;::899:8::;:=BHHFBAA@>=<;996438<<<<==<=?ADEDB<669::9888777<>8684,8SX>8;<==>>>???@BA=89:64>KJHJLOMJORG;>?ABBBBBDJTXUTTUTI:<=?=>??>==?CCBDGHE@BINSVRI@?>;669=BDDCEFGGGGHIJKMPMGA?@BCBAA?<;;;;:;<<;==<<;;<=>=:@CBA??AHKA:=@DGGEDCA@@CKQIAABA@@@BCCBA@AA@@@==<=?CLYa_K1*5=631/11-./.34339;=E82..28;87861-,.../3;:7676C>==>;=?=;976779@=5421/-,1792*+,,1698997/))./*(*4;>DGIJD8321.-+*/00000153.2<=;<<<==<:85678753350++-.*('(+.6?GG@658887655788:=@C8(+(+8768@?=EG>2++,*()032/3::51353,+)&+;F?<;/(*../GpgIADDGOYR9/64)&)(&(,-+)((((+054..244;>59JNFEJIJOI1!!)8B5%)>PRFJMQPTVUSUWYVSRRRRRRNBM}xMWXVWYQPQFEEDDDEHDBGJLLQhi^YQKIKLMLKHKKLLGACKK<==@H_c^ZNDCDFGIJKGEDCQJBCCCCCCBB@@??>=>@CINNLMNNORSXWMC;8:?DBBBABAA@>>CGHHDB?=<<:38L:69:99::::;:;<<<==>@>?>:::9878<==<;<964465437:?@=<=>>AID:8FFCBBA856;A?:9:::88777877877:<===<;;;;:748>A@@>=<;:;===>?ADED@9779988887778877994,ApkA7<=>>>??@??ACB>=>=;8:GLHJMQNF??@??@ABBCDEEHSXVVWWXN:=<===>??=8?FGCADGE@AIQUSLGDEHFA<;>@<=====?><;<=>=<;<>>>>=>@BCCCDA<:ACCDBBBAAA@@ITQF;>>>??=D>;BGFGE@??:7415;777730++3994+)+-24545564/.1/)&)4>FHAA@<841+,.)(18:;AA=9@KH7.++/6885)'***,0.+)('&&&&*6<4*()*+*(*-17>;30.)(14./.03,)*(()*)*00(&.784,,022/..)(,10,.24.(-56660,+(*,++,,-4323222101443673236743123210378742003874.))),-,,+*)+,-,+))*-/027==7356889:;9870,./.*('(+.6=CA9346777679;=====;3/2*'++*,19;697.((%03)%)*+-./,('&&'+,/5;B=:80-551Fkq[MGDEOQE4*38-&(*)(()++**))()/30/0123799DTXLDILHPZI0+&!8OB)*@STB8BC0'*(*.049984*,A@.-4?JQSB22698:@D][XWWVTUYYXXXYXUTSRSSUVRNONLMMMNPRRQQQPQQPOPQRTTTRRRPOPPQSSSSRRQQQQQQPQQPONNNNMOPOPPNMJINSTRPRRPPQQOMLLLLKJJKMLMLKLMMMMMMLJJMNNNNNNNLJJJIJJKMMMNOOOQQQRRSSSRRSSTTVYTPQPOMMNOQUTTTTTPMNQSSSSTTTVWXZ]]Z[^`_addddcbehikkg_ZVW^a`^]]\Z]gf^^^\YWTSUVWZ__aelojfdcgjmmomgmsonljikhfiiijdpiwpi`_baabbbbciidcdeebadedeeeeghgjwzzwtzvemttrno}s`cfb`eijjkjjkhgfjxzsmoofagrt|olbcc`^dxugfhbejdfbewzomorlklmsy|||}{{~vs{fdlfahllmonmlmkp{~tg[g{u`VWXXWWYW[s}j\Tw֝fzvZ]fvƮ|f^]WSOWy|dY`[[[[[[ZZZZ[[[\^]\\\[[[Z\ZYZ^_\\^_cgjlqpaYWVWY[\\\]]]\\\\\[[\]][\[[[ZZ[XQU^`aca`^_``^ZVUUTSRUUSSVVWXZZYWTVWXYXX[][ZXTQRSTUTVVVWWXZ\ZWWZ]_`_``__`aa`][Ugšݑa^~daaa`^[ZYYXYYXWXXXXWVXWXmh]VTTSQQQQPOQRV[]^_^`ccba_^\]]\ZXXZcaVNMLKLOPQQPQRTTTUSOMPYZRMMOOLMRUPIJKMLLJIILNPTXXUSSSSTTVWWWWWWUTTSSRQRTWWVXZZZ[Z[]]]^WLJQUVWXXVQRWUOLMNOONMMJPRTSSPW\WSMMLNORSSSOH[qHOWWYYURQQEEEFFGCAEIKLNN\li_QKILNMLIHKLMMIEEMO=;;@C_c^[OHDEFGKNLEEDEPJ@BCCDDCBBA@??>>>AGMNMNOOPQSXWM@:999=BBABA@@@<<<:6.)JC:::9:::::;;;;;::77:;<=;<:888:>??=<<;977556667<@A?>==;<>:5EQLGEA846;@?==<;:89987876679>>>=;<;;:;:878:=@CEDBCEA?>=<;;<<;978<>><;;<;;<==>@@BFGC;7777777767767765:><5Dq^<7;>>>@@@@AA@AB@AA?@C>:CGJLPLA88;;>>>>>?=9=ACDBDEE@AIRUOGFEGGGHFBAA=;?AB=CKNKIHHJLMHB??ABBBA@>>>>>@B><::<==<;==>??ACDAABCCAABBBAAA?DJGLM>5:==>??@?@AAB@?>=<=?@A::K_h]HA@@<76431255:95.+0;>.*1257;<:6640+*+-.02555:IQRRLB;8964?LM@/+/0/4@C?>BEFC?=>CC>9578567641,+4;:5,()*.23310/00021+))2>F@8736<<6/+*-4:?CHLPSPPNE=;>@=79<<9755224:9,&'(,/.,*)*(&''$%0><.')*,*(*+,1772//+(-45750.+))(&%&(').+)/782,-3651/,))+-.--//)&-7752/--,1313444424665431169656407;888744542023222443200,)'&),,+**+,,.,+**))&"&2?>428==<:752340+'&(,169<:5135688:>@@@@@@91/4910882/-8:16610/,>;))())**++)((''+5>DCB=77:?FIOfwsgWMKGDELG2&.7-#%('((()++-01241175//////07FSYQCFRNIUUJ@>-*PeM3;QQF=:91(%(,./24248/+>LOLFM_g^H712:C>=C^\XWWVTVYYYYYZ[XVUSRSSSSPONNONMOPRSRQQQQQQPQSTSTTRSSPPQPQRRRRQQQQPPQRTTTSQONMMMMLJJJKLLKMNNLMPQONPQPNMLLKJJIIKKKKLLLKKLLLKIKNNNNNMNMLJIIHIJKLMMNNOOQPPQRRSSRSSRRSTXYQNONMNNMNRSTTTUROPRRQQRTSQRTVX\__^^^[^cdccdeeeggillhc__ab`^^^]akeXUWY[ZXUUTRTWYX[hsokjklic_bkkippkjkjkkgdfhliqzm\dvng_`aaa`adhgcbedbfidbfffeeeegeh{zyunwohkkjko}kadcddfhiijjkiff`l|khkkheltqq~zagwhcaa_^X[acgihaf{ddd`n}tppqmqkmnqwzz{}~}~~~swvja_dglpqpqsvyz}{s|j`qskbZWTRSYWXxeVUrڒhvuae`bjvo\YVVSQtnضTY[ZZ[[[[[[[[\\\\\]^\ZZ\]\\]_``_\ftlWXdhquh]XWXZ\]\\\]\\\\]][Z[]]^]\\ZYWWYTV_a_aa`]]_`a_YWUTSRUWUVXXWYYYYWUVWWXYXZ[[YUSRSSSUVUVVVVVXZZWWY]a````__`ba]YTSvۿa[Qoj`abb`^][ZZYYYXWXWXXWVXVZghdb[USRQQRPPQRTY\^_^^_]\\[Z[]\\[Y[bf`\SMKKLNQRRRQRSUXVQLMWa]RMMOORZXSNKJJNPMKKMONOSUUSSSSTTVUWWWXWXXXXZZWVUUWVVXZ[[[Z[]]^^VKIMPRSTTSPRUTQOMNOQQPPOPRWTTTUR^`PGCGKMNQSSSQJZ{lHIOTVYWTVaAEGFFFFDHJKMOPQenbPJILONKGHKLMMGEEHK>;@CCZ`_[OHDEEGMQIDCDENGA@BCDDDCAA@@?@>>CKONMNPQRSXWK?:9988<@BAA?@@>::>EEEDDB><;9512?D<:;::::::;;;:99875468:=<:988:>AA><<=<;;877889:>@?>=AA?B>7CWQJJA947=@?>>=;98998887657:>?>=<;:9:;:888<>AFEDBCGB=>=;;;;;;:99;=>=9;<<===>@AACFE>8677677778889:;;9:A;3KkO><<=>@AA@@@BBA@A@@?@JL<:FJMOJ@=ABCDDCABBCEFDHWZSYZa^C9;>??@=<<=<=AB@CDECBJRRKGFEFEEHGFCB@;?OO;=GLLNNIJKLIB@@BBBBA@>>>=?BC@=:;;<;88=HacMA<87644347:9863.*-7A1/3345666695431321258879ESYUI>407:9JYN8)+DEEDBB@8788BHA=<:7543221-,4;:7.(*.3442/,**+,.43102<@:83+/9A?8308BC>?LVVQMD:34:<=<:<=?>>>=;64;;1*++/0,*++*(),.)%+;?3((,,+(())*+++)**((2=@:431/,)&'*,'%+0//5:5-.320/.,+*++,++++('1=:.+((*,13369:9845887651179645668:544421121,((*.37520/..,('(*+)),--,++,-+()(#&7C?89@B@<AA>1*-3/=;,)&&')(*++,-.,+388:>;9?JLFEQgrjTLLJHHD=621/23222.**)*-/1589>?-'**,0552262,-;Zj^TVYRC70-3FH71\[YWWVVY[ZYZZ[]\XUUSSSRSRONONMNNOQQRPPQQQPPQSTTUTRRRPQPPPPPPPQQQPPQRSUVUTSPNNNOMKKJIKKLLMLKKKLNMLMOPNLKKJJJJIIIJJKKJKKLMLLMOONNNMMMKIHGGHHHJKLMMNNOQQPPRRRRRSSRRSTWYUQPOPPQOMOQSTUVUVSQRRSSSRQPQUY]aba_YTX^bbbdeeddefhhjjgdddb`____ab\URY\[YYZZYVSTVV\`djjhjhc^]hnjkqoklmlfbaadihlqdc]Zqznib^`ba\]hmd\`feacopb_egfdccdaix}qpxofhhkmuxxpdffedegiiijjkhfgcrsfgiklnptyy}b[c_`ba`^Z\ehihikbc~gdcb^tzrppnmjpokmrvvwxz|~~tn|rnlimoonoqvzyzzwpgroivzg`vdY\Ls]ykpjqhVSSQ\|d[^\TSp~ٞWWZZZZ[[[[[\\]\][[]][\]\WZckleba^btuh]\jnaZYY[\\]\\\[\\\\]]\\[^][]\ZWVUTTUUWZ[]`a^\^_ba\XTSSSVZYVXYXWXWWVUWWWXYZZZVWXWUTSTUUVVVVVUVYZWWZ`aa``___`a_[WSeں_^fcsuifcba_^^]\[[ZXXXXXXXVWXgfdih^WUTRQQPPPQRUY_`^\ZXWVWXYZ[\^^add^XTNLJKOQRRRRQSW[VPMR_cZRNOPOZaZKGJIKQROJKQPNOQQPRVWWWVVTTUUVUWWWVV[^[WWXXYZ[[[\[\]]]^WNKLMMOPONORUTRQNMOQRQQPOOSRPRZ`WMKFFIKLMOQQSQQepIJNRVYWTYb@DGFFFGHIJKKNOKVkiQJINQNKGGIKMNHEFIO@=BCBN`_[PFDEFHPSHBDDFMDAA@BDDDCAA@@??=AKPOMMNQSUVUI>99:99;=?ABA?>=:98;:778:=<<:;;;;;;:::::88:99668;=<;::79>AA>;<=>>=<:8789:;>?>>@@AB<7CSIGGB;79=>====;:9998887658:?>=<<=<:8997::<@CEBBACHD===;:;;;;:;<<===;<===>??ABAAC@<977876778889=>=>?>;-3W`KFB?COK?DJMNKB>DFFEDDCBBCDDDDLSSWY\`H7==<>A><<=>=@@>AADFFKPLFFEEEEFFEEDC@;GWK7=>?A@=<=<<813;CDB@?=<:;AFFDCCA@??????<62;@30BP<>?=@::Ri_D85653446;@<3.-0408E525422005889;989743577616K\T@5545889<8654;@52;96421012/-4;;;4)+5:741.)'()(-86126>;AD1(+3;>;;@EHB8;GJKG9,.7<87;;;<>@?=;8679:84111/,***+*')02.&%4>5(',,+)((((').-)('%0@B87>>6/,''-/+&*22/3;8/01-,-,++*+,+()./((6>70.-++++,03887835;:765312336;:88:95220.*)('&%%*/1/////-+))((+()+,-,++,-,**)'/<>=?BEGF=;>>9301220018=<52222220023447<=92.++,+,($.?E>8788DIA/#,5571**)*)(()*+,./.,,+,05=8/-8A>:=CE@6*'(**-./006@RUIA<7431,'0EPKHI?8:98:=DH?=NV^bihK68?=4.)(/8:7531./.7UoqeWKC8/.,.B?>DZ_e[NHEFJRSF@HFJIBA@@ADDCBA@???>BMVWQNNPQTTQF:9:9:::<=?ACC@<:8788:@CDDB?<;9::;;9::;;;;;;::9::9::9:97:=>>=;;69=A@==<=>>>><:888::<=>>@@AB<;EJ@BB?<::;>>====<;999876678;?>=<==<:7567<<>BEB>ABDHE>==;:;;;;;;<=====>>??@AABBA?=<;98888877999<>>>>?=76Jh]bO;@>ABA@@AA@@@@@@?@@>FPKFKOOKC?BDDEDDCCDDCCEDEPXZ[[_N8@BA>@?><==<>?AA@CFHMMHEFFFGGFFEEDEEADH68>ADGNVTKGFGCCDDDDCA@A?=<><:;<>=<;625=FGDB?>=;>CFFDCB@??@A>;::868:768;;988:=><=????@A@>PmV:9><<78OiM45656878>A9-+-4;6;F97;:8633:;5676442001320--?TK4-49406MSMC,,FNIIB;7312;@95586--6765444562.39;<8/-7?>5/+()((&/94115=8;<0')2346=IMH<04A?61+'0;;9;==<==>=;95.08635892+,,-,+)'+364.&-:6*'+-+'(+*'*166.)(,6=706@>6/-*',.-))031055112210,+)+-1+%)..'+:5-49972.++-/1100.2;<:6431...28723::74432.*))(().0/-...//-*(''*(()+,,--.///,),5724AKJIHC99:4..013469;>=<;:9960,*+-/27>@;520.-.+'&-218886489A:,6:;1&()24-*'*)*+-.-,)).37AJNQPSWJ<;8>HA628:517CFDBDID5+1>GF?<4,4>IekVQTH23:3'+?I?AK?15322445677CM>7>701596-*0;?;8765301;J_svqdJ1)*(+6:0-XYYWWYZZZ[[[^][_a\VSQQQRRQQQPNOPNOPPPQQQQQQQQTSQQRSRPPPPPPPPPOOPPPPQQRSUTQQTRPPOOMMNMLKKKLNONMLLLLMNNLKKJIIKMKLNNMMNMMOOOONNNONNMMNMKJIIIJKIHHIKLMOPPPRRPQQQRRRSSSTVXWTQRTTRONOPQSUVUQNMMOQQQQOOSTTUVVWWSQUY\]acbacefhhgfehklikmjhhfdcd`\^aa_]\]^\[]\ZZZZ[YUUY[VXlsr|spqjhheekrmjrsfchd__bc`ac_]``_`b][hlb`abdecanxjbjmkea`]nv|}rcmmht|foqoesgbedeeeeeiiiiijkifr|lhhhhoqectk^acbbbccddfosmiggikllhfgfcbdjnpsokknpvwvxxw{ijuwtlijjgggijilmmmmlk`YZ\ʘjij^][ZklTac}r[_ZQSSUVYccblh\XXWQRl߹SY][[[[[\]]^]]][^`]\[UYk{xlfedca_^WZln\\[\bd_\\\\[\\]\\\]]\\^]YXYZVUTUWVVVTSSUYckc\_`_^[XWVTV[[XVWWWXYYXVVXYYZ[\_`ahjb]ZWVVUVVWVXYYYZZ\`cb``aabc`ZV`ǥڑ\Z][Zc{i_b````^]\\[YYYYYWXVX`bflka]]ZXVUSQPOOOPQY`^\ZZXXXVVVWXWWWZkt[T]]UPOOPPPPQSSOORQNX^XRPONNKIGFDEIFORPPRTWYYYWYZZWTSTUUTTTUSIGQUTNPTTVVWXYZ[ZYZ\]]]\XUSPONMMMMNRVXWUUQNOPOOOQSSV^ZKBEIGFGHIJLNOQS\IHOTXZXUU`VEAEFHHJLLJIIJJK\jTLNMMLJEEHIKMHDGLSJ@A;:?VgvpiSCGKTPD@EKNFB@@@@ACBA@>>?@HRZ\[WTVVUTMB;:;::::;;;?DF@><866657=CEDB@=;;;;;;::;;;;;::::9999::;<;:=>??@><8:?@@====>>>>=<;968<;;>?@ABB>@CC>?<99;<>?@??===;::9877779:=>===><:7249=?@BD>;>BCFC>==;<;;:;;<<====?ABBBCCCCA@=;:987888877:;;>?>===;:@F]ssD>B@ACBAABBB@@AAAA@@?BJMKLOPLC@BCCCDDEFEDDDFFFNX\^]aU;@HG>>>=;;;<==>?@ACINJEFFFFGGFFEEEDEFEA9??ADFGQYSHBEDCEDDDCABA=<=><89;<<;988>AFHDBA@?>@CDBBCBAA>>;899:999879:;;:9:<<99<>>??>@A;:HMB:101--,3>=8;@=5302797668:6117;:712<<<<<;:82/2448=:.&+240+('.6:96/+46-),.-')2/&*7=7/**2<7,-3742/--,+--,*043/.1102440++),14+&*-*)16,).5=?:1-/..+))((.8<;6211/--..../37666678873+(.421/+*.463,'&'((((*-./0///-+.43.)+;JHHE@5330.-.03355359BHBBIC<0+'*2589513652/---36-)6@?DKH5285775.*)&9<02)**)+,-0.),217DLNPNSaZ@9ADD>700789<@CB??C83AT\`][ZO95?IW`\X\S5.9:-.=D@?ABC>21360,,,*.1)$#%('(12*.9@?;99::403>AQlqz~e=('%#6;&#XXWVYZZZ[[[[]ZVZ`^VQQPPQQPPQQQQQPQRRQPQQQQQQRRQQRQQQRRQQQQQPONNOPPQQQQRSROPUTRRRQOMMMMKLMLLMNNMLLLMMLKJJJJIKKLNOMNONNOOOONMMONMMLLLKIJIIIJJJIHIKLLMOPOPQRRQQQQQSTTTTTTTSRTWUQPQSSTVYWSROLLOQQPOPRSRRRSSTTUXXVV\a_^bdddddfdcjlihmppnnlhfea`cda__cf\]kleb`^]]\ZXWW\cfsxxsogkolflwvngb^fmf^\^``^aeda`_`a^_ge_dgeebb`euvgiokeca]oqkywzidlspr}cnndiqaekgeffffiiiiijkjeslggfhlkg_fd`abbbbbbccdkslfgffghhhgggdb`cmpnjhjmz}~y~c`hmnmkjiggggefikp|zpj_\^Unɑhe`c_[]fr\dcr|XTXWWSQR\fffojYXXY[[^bW`\[[[\]]^^_fgiqgZ[Y`v{jfecbcca`][]cf`\\\[]^_][\\\\\\][[[ZZZ[[YYYYSRSUUVWVVUVWV[hkea[[^^_^ZVVWXWVVVVXZ\[XVWXXYZ[]`bfigbaa\YVVWWWWXYYYZ[\^`````ab_Y\{غՃY[\ZSH]lb`a_``beb]ZZXZZZZYVal]_je_^_\ZXVTSQPOOPT]c`]\\[ZZYXVWWWXWS_zrVVYVROONNNORTRNLSQLV[URONLKKIHHGFIKU\a\WTTRSQQQTXXXWVUTTTTTSQPQPTXZZYWVWXYYZYYZ\\\\\XVVSPONMOOPRUWVUVVSPNNOOQTV]UJFEGIHGFGHHJMPPQlKHOPTWUST[`QBEHIJMNKIJKIJLSUNJKJKHIGGGGJKGEHMQKAA;ANdox{nPAGKRLB@CEHEB@A@@@AB@?>>?HY__^_]`^ZWQB;:<<9::9<;9?HG86;866654??>?B@=;=?<<<<<==@@>?@?<979;<=>@ACB@@???>938>@@?@@?>=;<;:9887779:<<<;=>:6638;?AAAA<9=;;;;:;=>>??>>@ADEDDDDDC@><;:98887778:<=>><<=====:CbnOJACBDDCCBBB@@BBBAA@ACHJKMPPLEADEDDDEFFEDDEHHHLW]`feX=>HB<=<:99:;;;:?@CFGHQWPEDEEEEDDBACA====<<:;:977=DJDEIHDAA@@CCAABBBAA?>:>FD?:99879;=@?<=>;8:??>?>B[}nA8;::>;GN<853325:?9468::949B;=DB=951-//..-+*+,,,,-02145/+39312483/:JIC?5*(.1.+/37<@EFFB=7687889<@?4/6960/5AE:-)'&*-/,,.14/)%$')'%)./03?LL>-)4BDFID>=>==<<;:;749<;>7((0562.,+0698750/31-,--+-65()=E7+*)0>;000.-/0,+.//.--473.*/0-.00,***,.1+*,+)-20))+.799/.21-(())',795220..//.,,--02334459=>7,+-00/-*-34330*(''(('(-/10/.-*+46.'&'2?DFC91/00/--.00.).:AEA@GMOSIB626992*)2742322154/.24?LVV=/42/,2:5.+8@320//,*+,24,/754>EFFDIV_UE>=<997415>D<4369<1)6BAFPW_`L7487=IPYV8-6947??=81?<;:873..19DQcjtuK22+,@H40WWVWZ[[[]\[[[XTUYZXURQQRQQQQRQQQQRRRRQQRQQQQRQQQRRPQRQQQQQQPPPMMOPPQQRSRQPQSSSSRRQNLNNLLNOLKMMLLLLNNLJJJJIJKKLNNMNNNNOOPONNNOONMLLKIGIIIJKKKJIIKLKLMOOONRRPPPOQRRSSTSTTSSTWVTTSSTUVYZWURMNOQPOOPQQQPPQQPQSVVST[^ZZ`bbba]]`_bijginpooppnmmkllie__cdn{ymf_\\\^_[XX[YZeqfrtpmlqohr~uie`ajk_\__``\aoqe]^`ebegdafgfd__bafpnkkgcdb\prekmzyuofgenssv~pkkebd`gplhhhhiiiiiijkkeowfdegkkfbag}rcbabbbbcbccdeggefedefffeeedb`dnplgfjsy}}y~b`dcfkkkjkkjiffhlotrke^_`YSqwc_``]\_olbdivu]UZZYWUU[_Zarm\VVX_f^tY_][[[Z_akwcY_g{~kcfeccbbdb^cga\]^]]\]]^]\\]^]^Z[ci]WWX[[YY\\UTVWVY[[Z\\[Z[_ilfX[]]__[VVWWVVVUVXZ\\ZWWXXYZ[\[[_bbcjib[XWVWWXXYXWYYYZ^_``aaa\XjӬm[^^_V[fpa_b``gwxqbZYXZ\\[YWgyf]d`]]^]ZYWUSQPOPQU]`_]\\[Z[YXWVVVWXVVYtiSUWSPOMMNPSVSLWbUJUYSQOMLLMKKMSZXSMOSZTPPKLDBGKSYYYXUUUUUTTSUUTVXYYXWWWWXXYXXY\]]\ZWVVSQPOORRSTVVUUVVTRQPPQSW[TKJLKIIHGGGGHJLPOQOHMNOPPQRT^[KGIIJKLJGKMIILOMJHFHIFGGFEGHGECDGIFBCHYcin|zTCBBJQI@@BCDCA@AA@@@@?>>=BS]\^^_ae`WLC<;;<;9:::<;9>HC659765544;DDA?=<::;;<=>>=<;;;;;;;;;::;;<==>????A?>=??<999:;=?@>@ACEC:9:<=>@ACB@>=>?>96;?ABA@???>><;:9877778:<<<<<<8457;=@AA@?;;<=>EA;><;:;<<;=?@AA@@ABBABDDEEDA?><<;8888889;====;;;;<<<=<=KLEBDCCDDDCDCBAABBAAABDIIJMONJECFFFFEEEEEDDFHKIJX^^feT:FK;;:::899::::;>AEHIECDEEEFFFEEEEEFFHJD@@?AEGEFRVIDGGGEDBA@B>:===<<;;986:CJMGEKLEAABEFA?BBBAAAACHPSNA:999768;?AAA@=99=@?>?@@AGM`yU/:<988@ID?;630/27;845335549B9?E?;830/010.,*)*+,,-24310..0583366300>PM=4/**-167;<77?B@@A><9765:@=@@7.3:5/08B@2*'))-./,.000.+*(')*+041/1>KA509BBA92-3:::=;<=<<<<;;;;=:6:>=<4*,3341//-0672120-/1.-0/,,35-+=E4)*).=C>70)*0.,.0110.2874/,--),,())))+,...0.+.1/**+,-.-+.55.'*+)(,11-.232011332.../.--025661,+,/10/2:91021/)&&)+)),.1//.*(.5/'%%'.8@D<.000.,+,,./.0:@?:26DKR__YJ;3760+,1423663/.*+,+'8KRPC763+.2A72.0>5.5861))+2713?B8677768E[^J4///8?;0-:A6*,0473--**8LU]b`UPPJ>7>OK4-255:@<1.4>D;87987331,-477:339109?>=<<<62,+--.=VTSam~wI4=;CIEDHWWX[]]\\\\\[[ZWVWWXWTRRRRRRTSQQQRRRRRSSSQQQQQRRQRRRRRRRQQQQQRSOMOPPQSSSSRRRRSSSRRRQONMMMMNNLKKLLLMOOLJIJIILMMLLMNNNNNNPQQOMOOOOOOMLHGIIIJLNLKJJJKKJJLNMLOOMNOOPPQRRTSTUTTUVVWXUSRRSTVVTQOOPQPOONNOOMLNNOPNMMQTWVQT\bacfaWXZX_giggkomnprrttqqpojflwynd^YZ[[\]]\YYYYWWV\{rv{qptqztfdaagg^\_ab`^bnvn_\`higheceeeb_^ba\ftogbbd`[susnrqrqmhefktux~ysedggbcfjljkjjjiiiiijkkdewdadfiifedbfzyfbcbbabbcccddddeeedcdeedddeec`fnpjfdjvysw|{~~laaa`flnooqsrnjijklkh`\^\WeiYtpb\]]^_\]kx`^dqvh_a_]ZYYZVQ_mfYUW\af^߽e\_][[\XZhX^gntrjgfedcdaaea_kmca_^]]]]]]]]]_`]_d^jx^UWX[[YY^a_`a`_^^_`b`^^[\\bjb^]ZZ\[XVVWWVWVVXZ]]ZXXXXY[[[YZ\^Zcsmf_ZXVWWWWWWWYZYY[^`abaaZYɟܓY\a_b^ji^U]da`bmprma\YUV[\XYm}l`^\\]^^[ZXUSQPOPRW]]]]]\[[\ZYXVUVVVTRTY[YYWUQPMMNOQUQPipSHSXRNPOPPPOPRUWTTQHBUZXVLQXF?FMTZYWWWWWVUUUVYXYYXXXWWWWWWXWWX\^]\XVVVTRQOQTUVVVUUVVVUTSRQRSUWNKLLKJIHGGGGHIJNKPQHMMLLMNNOUZSKKJJJJJJLMJJKJIHHHHHFCFC?IFECBACFIIJYekludAAA@HMG@@AABAA@@A@@?>?>=>HX\[\]`b`YL?;:;;:99::9<;:>B=888765544;BD@><;:;;;<=@@=<<;;;<;<;;;;<<=>??@@A@@?=>@A<87889=>>>@ACEHEA==?@ABEE?<===>;@?>ABB@>>>>@=<:::988989:;;<<;968:;=?@@?>===<=C?;<==<<==<=?ACBBABCA=?CFFFFDA@><998889:;=>?==;::::;<<=<9;@CBCCCDEEDDBAAAABBAABGKMMMLIEDFFGGFEEEDDCFJNLLV\\`_J=TQ;<9899:9:;:;=@CEGGFEEEEFGFEEEDDDFFFFEB@>?BEGDIPLHIJIECBA?@>:<=<<<;979940002772...143:D<@@<;7200221.+)()*+.15421/-./464443224>NJ:20134:DE:96.4=:244447558=?@@7.18725;=5-*(*+----1443036-+432631/07>88=DA?;6347884/*-359;;;;<;>=89?@;20441//-+*1840///---,/32-,2533<>3))),;D;3-*,13135886489763.+*()*(+.,**--/220/020,+,,**(&.85+'*,))*)),0256533685.,,*))),020+++++/214GH;54464-7QXC124,+.0,)085..15544307JZ^aalstvwfA1<;1,.03?>@KWZZ[]`_SG>:::9::99::8;<:=>;987665434;AB@>;;;:;;<>@A>;;::;<<<<<;;<==>????A@?>=>??=97778;>>>@ABDGKGBAA@CDFF?;;;<==@?>?@@?>??>>>><<<<98987::::;:98<<<=???>>>>===?=;<==<>>?>=?ACCBBBC?;=ACEEDBA?=;9::8:<<>>>@@?=;<;;=>>>@CA@BCCCDDEEDCBAAAABBA?@CKNNLKGCEGGGFFDEDDDEHNPNJPY\_Z@L^S=9::::::<<<=ACDEFFEDEEEFGFEDDDDEFFGFFDA>>@EHEDJOKIKKGBA@>=::==<:::9:AC?BG@B@@AAACEHKLMPKD?;9879@FECA><7:><:?A?Eif;86777EEB9453+-990*/-276658DFA8./674695-+))*,-))-5:874691576471/..1.4;CC?<97799872*)+,289:;;;>7489697**=F;06@6)$$('(-6779:74666BV[bek~{yN0330--,5>BCHD?=5112001258>CHLJE:223223126981+,//>_eRF?GMRzu;#,1016=\]`a_^aa```_][[[ZYWUUTRRRRSSSTTSRRSSSSSSSRSSSSUVVVUUUUUTTSRRRRPOPPPQSSRRSRRRSUUSRRQPPPPPONORSTTTTTSSQNLKKKJJJKKKLLLMNNNNNNMMNOPPOOMKIIIIJMMMLLLKKJJJIJJIJLLLMOOOPQRSRSTSTUWWVWXYUPNLMNMMMNNNMNMNOPQPPONNPROHEHKKLMSXYZ]bd`ZSRSPTZWU_d[X`fc`^[[_]\^_ZYZ[XYYYYZYYYZYYWY[XV[[[gywnmlkhdfb^aa`a`bffeinqnddjmka\iqkiif_`iklmjgeca`]brql}|snifegqx|dk{ibbbbcaaejoonkggikjighfca``_```aceddcbb__bebcbbbcddccdedcdddcccddddccdebeppihjmtz{~uolfddfjgbbdlppqsleemjg[[[[}UVW[c]crhXWYZV^r|zulhihgcUU[_`c_^egggad\zxU`^[[YY[l{c\X\__`cghgeeeegdcb`dgfgc^]^^]]]^_]__^fhf\guaW\[[\Z^bddcefb`_`abbba^[Z`fa^[WUTZ\ZYXVUVVUWXXWWXXXXXXYZ^_``[`r{qkf\XWWWWXWX\_``___aa_]Vh׾`TY\ddb_aoe`c`_^X^a`bb^^^^]Y]x}n_\[[\\][ZXVSQOOQSW[\XUY[[[_\[WVTUUSSSTaRR]WTRQPUY[WPPSSPPQTVTSTTSTSRRRTTSQTRTd`XbWFeeLNNQUUVVVVVVTVY[ZZYYXXXXXXWWXWWXZ^_[VUUURPPPRVVWWWVVVVWVVUSRQSTRPNMMLJIIHGGFGGHIHM}SHMLKKKLLKGLSNNLJKLLMOPNLHHIHHGGGGINSY[aflu\RTYZemgN?@B@@BDDA?@@??@??@???>??AAKUXW\][SF;889998:::;9:;;:;<9777654335;@A?=;:99:;=?BA><;:;;<<<<<;;<==>??@?@?>>>=<==:8878><=?>>?@@ADD>>>>>>=989768:::::99>><=>?>>>=>===>>=>==>@A@??@ACCBBBB@=>?@CCB=><<;9;:8:<>@?>ACB@??==@@==??@?ACCBCDDDEDBBAA@AA@?=@FKMLGDCEGGGFEDDDDEGKQSNKMV[_Q@Y`P:9;<<;:::;;=AEEFFFEDEEEFFFEDEEFFFFGGFDB??>BHE?FOKJLKHB@>=>=?>>==<;=@BCDEGIMH>>?>AEBDJ=A@AAAAABAAACGKHC>;:65=GFA@;=5218GJ>0'-20)*6>7(07477745FLC8..47630-(())*,+')1:?93/,-.:;552-,--,(1=EA?<<;====<3.251499:;;;;A;559830-++./-..*+187431/.-+.482-.10143/))+,/77///-///0.,385576671*)+165/-6965:<867:82.+))+++-.04/&)21)*//00-.7<;::97532441.+-/0144/--./174)%*-/,*+)&)-/35541*),+(('()**)),.-./.+*)***-/256662.)!)9FS[L.+62/.00115980)()+.00237630-+)((('+07;@4'(+***++,/45117;512.',22//:<4/&%%&*5;?@91/342;MP^nu|ox_9764228BCAA?<86...0/0/16?GD?BFD=33321.,/13-+,/-3P\QG<2;BAmU&$)&'-4cccb__cffec`_^\[ZWUUUTSRRRRSSSTTSSSSSSSSSTTTTTX[\[YVTUUUSRRRSRPQRPPQRRRRQRRRRSSSRRSRQQQRRRTWYYYXVTSSQPNLMMLLLJIJKKKMOOOOPONOPPQQQQONMKKKJKLMMLLMNMLLJIIIJLLLLNOOPQRRRRSSTVUTUVY\XROMMMLKMNMNNLMNNOOPRRPNPQRPKJLONLORRTVW\daVORQNSRNRYVOOTYXXY\bikg`XWYWWXXWVYXYYZYYXZZYXYWT\osjhghigic[\_`a``dkkjklnmikpqhh{ompohfkqtlfhhedb_b_Zo~xpjgddnw}ahvla`bbddbdhlmnkghikjigdba`aabaabbcdcccbcdefdccccccddccdedcddcccccccdcbcgddqqikpw{xy{v~mljgfeda]bgnmgotqe^Z^X\thcdbZivcXZ]b]h||xys^Yabeli_Z^cgjkjhfhb^`YzVb]Z[WVhulh_Z``_`dhhfgffhcdc\pp_``^]^^_`]b`bkidZ`|cY]]\\[`feceefda`abbdcc`\Z[^^]YVWYZZZYWVVUUUVVVWXXXXXWVWY^cdde_dvwqmd]ZWXYY[]`bbab`^a`][VwҺYUXXZ[\fvpcc`^]]]]]\\^[]`_\_qtb[Z[[[[\[ZXVSQOPRUWZ[UPUZ[[b_XWWTTTSSVOPYxVNOSS]haWQQPPRTUVXZZXWVTRQQRRRSVVVO[_RcjPPZVRNILPTVVVUTSST[]\[ZZYYYXXYXXXWWUX^a[UUUUQOOPSWWXWWWWWVXWXWUTRRQQPONMLJIIIGGGFFFGGIvUHMNMLMNNMKMPPOLJLNNOPPNNIGGGHHHHKOT[bfiq|pSNORZf_J@@AA@@ABA@?@????>>>>>>???ACLVWX\ZOC=;;99899::;;:;<:8;98766553236;>??<:988:<>ADB><:9;;<<<<=<<==>??@@???>>><;;<<;:78?@@ACCDEFEDGGGE>;;<=>>==??>@@@@EMICA===;7776668:::::;@?<;=@<=<=>>===>=>>?@@A@??ABDCCCCB@@BCB@A@8;9:;:::9;=AB?>BDB@A@>?AA?>@?@A@ABCDCDDDCBA??>?>>>;;AIOLECDEGGGGFEDDDFHLQSPLMR[]HH\XH9;;=<::98899=CFFFFFEEEFFEEEFFFFFFFFFEEDBA>>CFAAJKKJJFA??@DGD?@ABA?BCBBBBDDA><;=ABA?868@>@CAA@>:768:?A@@?<84;EEAB>9I\T;-6A8562/03777:;;::85;HI=:;6310121137763.++++,**.0..3799998749;3...9EB4+-/330.-5;31><7891/BKA5.-178/'))*),/0*)/7;:4,(''/<757.**+++.6@EEB@?>=??AC?89=;<=<:;<>:40/2/,()))+,,+-//./59864430..024.+--.01-((()2<:1-,)-.,*(&)-*+++.3/*2:9641,-6:9=B;52310-*)*/221012-$*85+,24451/39<<<;5-189620...037620.-,/1+&&(++'(./((,27:95,'(,-('''''),020--.,)()++,.156665,$)2/+,?TB&+84/.0121671*%'().0/0//.-,(''&&%)58:=B6+)*,,+-,-/3;;303/*+,++/00/5964-+++17=B@3(*-/.6@G^qwjVdy^:8877664349=:6771./1357;DHB<<@C>32330.+*+02472,=WUF=0),.6c_,&,)(*0ljec`afhgfda__]ZWUUUUUTSSSRSSSSTUTSTSTUTTTTTTVY\^]ZWUTUUTSSSSSRRROPRQQRRRRRRRRPQRRSSRQQTVWWVUVWUQPPNOPPNNNNMKJJKKLMNNNNNONORPPQQQQPPONLLLLLMMMMMNMMLKJIKKKLMMNOPOPQSSRTTTTRQQSSRQQQOMLLKMMMONMKMOPOOQSTSRQSUROQRPMNNNQSSX`c`[TTSPNLJNTUQMPUX\adhjje^]\XWXXYYWXXYYYZZ[[[[[[XU\mrnnmjghf[Y^_aa``gpnheimmprqw~vemnkikouqllkihfbdb[fupmkfblx{|blx|ve``ccbbbdegkkhhihigfefghjtj]^[Z`acca``adefecbcbabcdhlf`cedccccccdeecbbefdlnhhuu}laxmkfeegc_]^p~eoq\^[]f}~xvzwwuildnjfw{soh]zplomof]agnrtrokgZZ]\T^^[[W`|dhrkfgc_aegggggfgfhscbr`b`^]_a``_rpeeeaV[tcX]^^^\biighjkidaccbbccb^[[]]ZXWXZZZZYWVVVVVUUUVXXXXWVVWVW^ehiebinssoh`ZXY[^_^bc`^^]\^]Y]̴TUVWXZbknmdcda]^__^_]\]Z\`_]]ed[ZZZZZ[[ZYYVVSQPRUYZZWSUY[[^\T`ZSSSSSUJBqmONVWR_cWQQU[\ZYZZ[]]\ZVSTUTVYXVTUVQSWQXgeULEDFHNPTVVVUSRPNPXZ[ZYYYYXYYXXXURKMX_[TTUTQOOQSWXVWWWWWXYYWUUUTRPPPNNMLLKKKIHGFFFHEDfÿWGMOOOPQQQOPOQOMLNQPPPONNIGIIIHILTY]bfimyzRFKKVkhN?>AAA??@AA@@A??>>====????@ACNVWYTO@;<<::9:::;:;;;;<:8;966655543589;??<9998:;?BEB<:;<;;<<<===<==???@@@@?>>><;:<>?<::>@@@@>?IRLHBAA@8377668::;:<>@>><<@;;<==>??@@@BBCBAAABDDCCCCABC@?>AB9:;9;:99;=@BB?=@DCBA@>?CCBAAAAA@@ACDEDCCCBA??=<====;AKNIDDEFFGGGGFEEDFJMSUPKLQZXERZP@7=;;;:99<:779=BFFFFEEEEFFEFFFFFFFFFFFFEDB>;:;=CB5/3/4A;=E@AA=;5678879?B@:6:@CDC@76;:4255:>75:;93,**+,,,-//.058888765587-(,.494-.0012230-6=6<>8781)7G@50+-590(*-.-057-+5;840,,*)16666.)**+-8BDFGEDA:8=;;;:<@C9+'-.)'(++++,,-,-2411599689652,*//,+,./0-(&)/4;7-(%'.1,*((''''&'+.,+1851-.00/4:=A5++.---/1.1332.02-$*>:)*034662/378<=3*-552/,+-041/010-+)&&&'')+($,9:-(-29<:2)'(*+(&''()*,3972,*,,,.1322376330&.K[J0#+FN3#,2/.//0054-'',*'+.,*)))***)('%)6@:425>A3*(),20015=A;/)))+-./2437==1-.1:956<>:/)(*-026;VknypQ>DXN8:<<:1,.,-5;;9<;3.-.7;;?EC=98655431(%1BKIC;;GMD90-+*).VuY.%**,/1nkc__add``bba_]ZWVUUUUUUTSSSTSSTUTTUTSTTTTTTVYZXXZZYWVVVUUUTSSRQRPPQQQQRRRRRRQPPPQRQQQQSUVTROOPPNNONOPPOONNMKLLLLLMNNNOONOPQQQRRQQQQOPPNMLMNMMMNONMMMMLLLKLMMNNOOPQRRSTTTTTSRTRMILNMLKLLMMNNNNLLSWVRPRUVUSRRQQRSROPQRTTQT\`eh`TQPMJJJNW\VMNTX]^]bmnhffb\YZ[YWWXXYZ\\ZYZYYYXUScysmrnhhhbbhga`_\`jqmiimsspq~zdgihhhjmlqvqigedbb_^{tgilkflvxv}peltxtrj^]ada_^^_^biifhfffho~{yp_\aeeb___`_`bcbb``acclvf]decccccccdedcbcjkacnjan}{la`pugoeeefig^cuuf[Yeyta^ilos`hniigYbȆw}xsfbbgotvx}sdVZbddO^[Wa~raY\iprrc^giiggggff^j}{f`b`___`beexzgcecZRjd\^^`^`ilkkklmjb`bddcccd`[Y[[XWWWXZZYYVVVVVVUUVVWWWWWWVVUUW_hhjg^aluxsi`ZY[^][_d_]]^X[^Yd˳oTWUX\\^b`Z]bc`]^^]]^^^]]]^]\[\[ZZZ[[[[\[YYXWUSPQVZ[ZXWWXZ\[WS[`UPQQRRLMnnMQghUOWVNNXdgca^]]\^^][YXYZ_dgfb^WPQVTOUXg\UOJEGOQTWVVURQNFEOVWWXXYYYYYXXWUSKIQZZUTTSPNORTVWVVWXWYYZWTSUWWSPONMLLLMMKKJHGFFFFEBcZGLOPQRSTTUSSQQPNPRRPPNNMIIJIIHIOVZ]^ahr|y[HIOTi|dB@AAAB@??>??@A?>>>===>???@@BCPXWVIB;;<;::::::;;;;;;::9;9666555456838?>;9;<===<=====<=????ABA???@?=:9<@@=:9@<<==?<;<=?>>?@AABBABDCBBCCCDDCBA@?=<::;@C::<9::::>BDCBB@?BEFDBAABA??BCEDCCCBB@?>>>>>>>DJHDCEGGGHHGGFEEFGKOTUPKJR\QL`WM=6<;:::::=>:68:=CFEEEEEEGHGFFFFFEFFFFFFEDC?<=BDDEGJJE<89:::9:::9;=ADDDEEEEC@<9=AA<21669?>DG@?BA;5588777;?@;79?DFB;76;FVaZLA?:77970110//1.+,-/1466688=IMD;8AYpq\C841/4;@@;:==6-***,../12.-2777654556520020/-*)+,-,+,0762:=<=873/,,=A82,-694.0333588-0;<72021+)+340.,)**).9ADCB@@><;=><B:))351//20*).0./0242/.16767:<6+(*-0////-+(&*3:90)'&(/31000-,.22240.+*+***(,21/377+%+/.-.///1111..0-$*>;&$+.26840/03;=3+/1/..-*(/3/,-..+(%$&&%&*-&#.?A84559;:2(((('&%'&'/316951-+-/035664341/.-2QkfH1+%6WI$)<2-+*,053,'(-*'),*'''(),+**)-9D@81/2DTE1($)2200139DI=.--/11//29AA6142>B2.686/*)+.0233BZgiT=9;@@>==:727748<=;BF?3.3:==;63122(-EVSJFDDGA/,-0.-/+Md@)')*066ie_\\]_^YX^cb`]ZYWUUUUTUTSSTTSTTTTUTTTTUTTUVWYXWVWYZXWWVUUTSTSQQQQPPQQQRRRRRQPPPPPPOPQPPRRQNNOOPOOPPOPOOOONMLNMLMNNNOPPPPPPPRSSTTSSRQQQPNNONMMNOPOMLMOMLLLMMMMMNMOQQPRRSUVVVVWWTOJJJLMMMMNNNNOQTZ``\WTRSTUUSRQPRRQRUWYWPLS]bgkcURQNNMJO[_VKKOTVRTaijfbc`]\WUVWXYXXWWWWY[ZTTZTZttchonkjmotrf_`^]_hrphlrqs|~yyyghjigfjjdp}uiddc```]hx^^krnlprrruwvqpomvtc_```afkmkh`]ekifeiwztxxxvqh]\aca`_abdegbcdcccccccbcddccjrmdejgaeyxx~vs}vaahh]l|oigghkfjnX[dozsQT[WYr}_aghllvzu{}wohbbinryxaU]kbSQZ\vm][ilbv~q\_jhhhgggjmm~nveafgdaa``__`_flgqzmghfeXnf[^]^_fqplllnni`^`cbbccca]YXYYYYYXXYXWVVWWWWVUVWXXWWXXXXVUUW`hlk`Z_kx{qg_Z[\]Z]hf[Z`[Z][jʲ_SVTVY[Z[]^___]___^__```^]^^]\]][[[Z[[[[[ZYXXWUQQUY[ZXWWVX[YVTQ^XLMOOPPRZKMXob[TQPMWinhcb`___^^^\]^\^dijljkcNHU_XTPUVPPNFELQX\XUTPOKHHOQRUXYYZYYYXWWWWUOMTWVUSQOOPSVVWWWXXYYYYVSSUXXURONNNNMLLJJJHGFFEECAkį`KMOPORSUVZ[XSQOPRRRPQPMKGIJIGFEKPQRWcoxzyp^OMOWao|_>>===>???@@BESZWOA==;;:9:;::;;;;;;;:8:;9755566576848?=;:;?BGGBHJE<;>AA@>=<===>????A@DJG>>AA>;:>BA=99<@@AAAABCDFFHKMOEAB=<=>>???AAAAAABCA@BJGILNNI<98787::::;=>;:=@@?>?@@@@@@ABDDCDDDDDEFEDDDCBDB<7979=E::;;::;<>ACDED@=ADBAB@>@CCCBAAHHA?BBCCCCCBB@???@@A@AJG@@BEGHIJJHHFEFGHKOSSOKHT]QZaOK?7;;::<<;<>=::;<@BDDDEEEFHIHGFGFFFGFGGGFEC?;9=CCEGIIB8677889:97778=EHFFEFFE@::@C>578765:EMJ?=AC;55888978:;<87=EHA:9:88=CUaV:04:?801211/.-++-257989:9>KOB6=cqS5.77:B@=>@>3))+,..0234103763445567516:5/,))**+*(&(+4><7>@><731/069631256753566752/7<82-096.*(151())*))*.2544678;?BB?;>DD;64049;=A;-4B@:401/)(/1/253240*'.5326;9/(()-46.)**(&-8:3*'&)/547>=:327?@751101.)(**(+1200,'',010/0/0000.../.')63%"(08885211267.,21-02.**-24452.+'%&&()+--)&,6=@@:799:8)&''&&&&&&*6:73)(12001345543//1++MidM41:21FH:FC637:>CSM7*(&*..,,.2?S_N6.132,*,2877?806:1+044/-.1469=;:GSPD:8@B?=94122416A>22>@60-8GE<><2)*34,4ISMILMFC?.-1-%+,#JS'$,)+376c`\[\\\[WTX^`][[YWUTUTTSSSSUTRTTTTUUUUUUUUWXXWWXWVWYXWVUVUTTUSRRRQQPPPPPPRRRQPPPPPPNNPPOPPONPRRQOOPPOPPOOOOMMMMLLNNNOOPQRQQQRSTUUUSTSQQQQQPNMLMNNNMLMNMLLMNMMMMNNNOPOOPPSVVWXXWYWRNNNNMMNNNNOSX\`aaa_[URRTXWUSRRRRSTVYXRKOY`cjlc[YWWWTRV\^VNKLMOOQUcld\[[ZZ\^``b_ZVZaeiqpbUVVWho_[emkjqtsuoecdb_^honosxy|zilnkiioofp{sjefdbbcb_cmwy`Xitnklmmmnoqtxwkowc^b`]h|taaghdnwi^]aaabcba`ccbcccccddccccdejllkiffdgrw~}yroqwyrhabhoxsnighigh\_c\d|wh]`gaY`w͘Z[fznebbgnsrstmfdfkovxbWaqjtޟVMqc[aXtltr^cigggghfj~nfkifda``__acdgld`rtiefeand]]]__lxuonoppld^^_``accb_ZWWXXXXXXXWWXXXXYXXXWWXXXYXXYYXWWVZfmhc`__n|xmd^Z[[WZko^X`_\\\tܖ[XUUVWXZYZ\]]]^`cccccbdfecaa_^^^]\[[[[[[[[YXYYVQRVY[ZWVVTTYWTSRUVLJLNPPMSQOORT\WSR]ntidcca``a`^^^^^^_`cgjjliTEKddQLLPNGDDEJP[YWVSPNMPSTSTX[Z[[ZYXXXWXXZSLQVUTSPPQRTVXYYYYXYYYXVVVWXXVTQONOOMMLJJJIHGECCCAnijdPMMOOQSUW[b`TPNPRRRRSQMIEHJHGHKQTTXet{}zqdYQQU^`erU:CBACEB@????@@?>>>==>>@@?@ACGTZWG><<;::9:;;;;<;;;;;;89;974556555689?>:89=?BHLIJJE<;??==;;;=>=>??@AA?J\[LADDC?:;=@@ABBCCCFFGHKQNACFB?????>?AAAAAAAAABBCEEEFHLJA:98799::;==;;=ABA@ABCB@@ABDDFDFFFFHHHGFEDDAGJ=2647;F<:<;99:>BA@@A??A?@DBCPTF>@?@ABABBA@?>?AABABE;9CDFIIIJKJIGFGGILNQRNKIRYXaLEKB79;::<=;;<==<<<;@<7677877789:86;EG@::<<::8=aiQ7-9?7012131,**+/59;<<<=<>HL?3I}zQ8@>4;FDCC@5+*,0100344212352234565/.571-+)+1.*(*+-/3;A;9AEB>73345333111376/.2662.2;<4,)0;:1-,132'&))))('''(*/0016AILH>:;867347:AF@9AH?6/,)('(-30/112573+(.111331)''&)//++*)'.95,(('*2415?C<0,5=?6/.2120-,,/-'*/-,)(*,/./////000.-./1-+//*(,5<:3035420,+/76231,+-378>?9?C79@>:6421/,+373-.5852/4=?=?E>6FC3;DE>1,.681/7?BGQRC=@6/*((.*DR*'-(*230_^][\^\[[VTXZXY[YVTTTTRQQRRSSSSTTSTVUUUUVWXXWVVWWWVWWWWVWWUVVUTUTSSRPPPPPQRQQQPPPPPNOOOPQONOPQQQPPPQQPPOOOOOOOOMLMNNNNOPQPQQQRTUUVUTTSQQRRQOMLLLLLNMKLLLLMNMMMMNMMMNNLNNNPTVUSQRUUTRPNMNNNNOQUY^`\Z`ca^ZVTVXXXXVVVUSSUVSRSSX_eiifc`\]_]XUX^]ULKPRPLRdog]X]kqoqnmkjmrx}gXVX_db]_gfdkrontqebab`[izuw~kosnhkrunrukffhggecdffhkpvse\ktigjkklnoqttuqp{j_^[jhfhfv~wc]abe[\_baabccccddccccccdeghgeffejkk{odfffkxukkpto{wwqighfhv_aegg}]Xbeto\ZjzvXc|x_\]\_jh^hnmlkmqrsjjogdjsfمb~`T\^Ynpqukihiihgghcninlea```bdfigkjVWordeedib^^^^[myxsrrrtqha]]__`ccca[WVUUXYXXXWXXXXWWXZZ[ZYXYZYYYYWWXWXdmida_\apxsia\ZZXXhvbY_a^Y\εv\\YXXXXXYZ[^`aceffggecdfgfdc`____^]]\[[Z[^a`^]XQRVXYYYXWSSUURSTTUQNMOQQNQONKJQRTVTfmibbccbbbcb___^]]^`befhhfWHGP]ZONQTROKIJJSNNUTQPRX[YZ[\\\[[[ZYXXXXXYTOQUUSQOPRTTVYYZYXXXXWWXY[YXWWWTRPOOMMKJJJIHGFDCD?oѿƹaOLMMMOQSTVaeUONRTTSSTQMIEFJHHS\abeku|}}{oaWPNUZ`qhD>DBCCECA@>>?@@?>>>>>>@@@AAACJWYRA<=;:::9:;;;;<<<;;;;99:96444554358;?=:9:<=?AGJJD>=A@>=<=?AC@>>?@BC@EWce`VJGGC@ACA?=<=@@ABDCBACEGILPE:CHGB??>>>?@AAAAAAACBB@DFECJQPF=<:99;:;<=?=;>ACAAACDCABCDDFFDFHHJKKJIFEDCAEK907854F@:;9989;===<=@B><>@@?@@?@@ADCBKOD<>>=?AA@@@@@??@AA@A;2;GFHKIHJKKIGFGHJLNPPMJIPYYT>@ME98<<;<<;<=>???=;;?BEEEFGDAAGHHGEFGFFGGFFC?:8;?CGGGC<6588999989998;BFGFFFFFCA@A><<9::820>C638<>>864355679::98:AE>8:;<==??I[gVE>781/010---*,06;;<<<>?>BF=6TjI?@>>CMLHC7-+-12212222112330/-.30),10,,+(-40+-68::;<>95=HF?:64321///..177,)398216;82,*2<;62,/22(&*)('''((-2/+)(+5ANVI62101003:GOLHFB70,)%%%',1.))+048;7,(-1.++*)'&&!'.**+)'*,-,+*).7:55=C8,)06:7./3-(+13/42('(())(*--,***)+021-+/231-/20/27:92+/692*'.8:731-*),8=:;A;/(((&*487/--,''4A<005=D='&('''&&%'&%-55-(3?:2345565354.1R_M?726?:/*.;3:GHIK?36:<<>@NH/B[VH4*+238EKL<0361,*)))*,1494)()++-18<@ISX]V?2>NLFB42:?@<850-+,-0211222/+7HA8<;AepC6DE@=;;:93,,23@TP;6@=4..78/#EY1$)%&/22]]][\\Z[]ZVUVVWYXTTTTSRQPOQQRSSSRRSTTUUUVVWWWWWWWYXVWXYWXVVWWVUUUTTTSQQQQQPQQQQPPPOPOOPOOPNNOQRRRRQRSRPONNOQQQQNLMNNOPPPPPPQQSTVXXVTTUSQQRQQPNMKJKMLIJKKLLNNMMMMLMNNLLLLLLNPQPNMMQSQNNNMNNNQRSUXYWX]aaba]YTSVZ\]\[YURSSQSTMO[bceije]XXZYQLTcd[NGSd]NPaonikpsrrliy~gVZ]_adhlhacmqnswh]^`^Yf}{}}npttmnuytpidegijjfccfjkjjloidnqfdiiikmnopprurqaX_hjfhkub^]s^_aabccccdddcccccdeffghgffljixwspfhhkvwolnoposuutkdccgo}dXeih|Y]bap{m]]xvxzrlfd`[\gnvhZ_cchjnmlmcepkdY`gZ䳃qe\\[Y^iohpspokikihgfe^ao{xigcababfgiijlpiY\lkgegd_\^^XXm{yutstvxob]^___acdb[WXWY\]\YXWWWWXXXYZ[ZZZYZZZYYXWWYYXbnld``_^ertmd\ZZZZbti[\`_X^ǭޟca^[ZYXXXWZ\`higghghhfdbbbbbb`^]^^^_^][]YY]egec[RRVSUX[ZYVTTRPRTTUYVSSSSPONOQQQQUXWYSSVZ^acdeedca`^]]]_abcddd^UQLMX]VSUYSMOSX[SOTVTVX[\[\]^]]\[[[YYXYXWWURRSTRPOQRTVXYYZZYYXXXYYYZYYXXXWUSQQOMKJKIIIHGFED?cĿ]LLKKKLNOONXcWMPUWVUSTQMIFHJJLT\^`fmqv|zm]QLIPYmuR>BCBCCDEB@?>?@@?>>>>>?@@@AAACMYXJ<<=<;:::;<;;<=<<<;;:9:876545542248;<<:::<=>?@GKC=BIFBBCEGHGDB??ABBES^_ad]LDFEADEBBC??A@BCDDBABEGKOH86AIJFA>@ABAACBABBABCDDBEFGEJPNG@><;;;<;<=@=;>BCCBCCDCDDCDFFFEFIKLMMKHFDABEIJ=2=>34FF:9999:;;<<:;==<:<>>>??>ABCDCBCCB?>>==@A@AA@@????@@?:3ALG;7;>=<<<==>@BA>=<=@DEEGGEB?>CHGEFFFGGGGGE?989=BGJH@979;:9:99998889?FGFFFGFEEA?><:::871-6::::=@?911135789:::::@C;6999<;;A<@O_bQ=4/--/-(05-+3;=<99:>A>>@<=e\;?]_?IPG>5-,-./11/..0111130*(+1-+00--.*'.55588:?3()*+22--30--1412/('&&'()),1430.,+-11,+28610134565443-.6;3)+7:73.*,,*(0;==;1()***.541.*))(&0>;.+2;>6)&'''''&%&'$'-.'(8A;578667648707MOE>518B7',=FC8421.))+,,.,))+.-+*+@RRE5=CAITI9764237L^@AmqS5+1A;0;840/,*-3311012/';^R;:94214CTL;>EA>>AD=0*=I3.2./499ZZZZZYXXXZYWWWVVWUTTTSRQOPQQQQQQQQRRRTUTVVWXXWXWXYYXYZYXXVWXWVVUTTUTSRQQQQRRQQRQPPPPOQRONPOMOQRRSRRSTTRPMMPRRRSSPMNNOPPPOOPPRTVXZYXXYWUSQSQPPPNLLKLKJKKLLMOPNMLLLMONLMMMMMJMPPNMKMQPNMMLMNOQRQQPRWZ[^__]^^ZTQSVYZYWWYWURPLKMW_`dhkjbWNPUSKKYhlcPLbfTLQ^mtpfdkjcs}wx`]`cekqtqkijllmobWWXXXaz|vz}tit|xttuqkebeggjkgddegiiijkjinkbchjklllmnprtpg]Tfqfhihikx}kYy[ec`bbbbcdcccbbaaa`boyidejhk~wnz{y{umjopoqtyqe]addcfn~][eamnW^b^g{o^`ef[lorrfe`XZeoxn^XZ\]_^[]aenrrsd_iZExժzY^`[]dhjiippllkjjihhgb_^X^ghpe__`dhiihklnsn[Zhkfgd^[]^UUmzyvuuuw|ra\^^]^`acb\Y[_ba``[XWXXXZ[[Z[ZYYZYZZZYYYXWYYY`npe^]__aippe[XXZ_bho_Z]_Xh¬޾tcc_][ZXWWWY[^ehgghhhgfdb`a```_]\\\\]][Z\ZYW\`a`[USXc^XZZXVTTSQQRSTXWUTSRQQRRRSSTX[]WSPQTUY]`befdb`___^^_abbbcegd]SU`[VWWRQW\fga]XW\]\\\\[\]\\\\[[YXWWVVUTTTSSQQQSTVXXYZZZZYYYXYYYWWWXXXXVTRQOMLLKJIIHHGED>Mտ]JKKJJKMMLJS^WOPWXXVUROLJGHKKLLQRVboy{k[QMOSfuXACBBBADFEA?>=>?@>>>>=>?@AAAABCMTSC<==<;::;<===>=<<<;<:::876554431159<<;:;<<<==>EIDEJMKIIKKJGDCBB?ABBO]^^`_ZL@DEADGFHGDAA@BCDCA?ADHLPA47>IJIA?@BDDCCCCCCCBBDDDFFHHIJKHB@==;;=<<=@?=?ACCACCCCBDEFFHGGHKMMNNLIJE@AEJPJ46HJ:789:;;<<<:9:99;=>>>????ACDEEDCCB?<;=@AAAA?@@???@@?94:ACHJJHHHHHHGHKLLMMLJILSTH>;>FH<8;??=<;=>=@@@@=<<=AEEFGFFD8:EIFEEFFGGGHF?:99=AGLH>98;;;:::9998889>DEFEGGFEFGA<<:;:96/*-6;:<@?>7062356879::9;AA:56668<>@C;6AQYJ3.,+--/;:=;53/2;<61.,**+-..-/6;6/-+-18;71...3;;<9..//,****)*6HPQJ7((*,++9F;--+'&(-1:JWRF2,6;3+('&%&%'()+.134674,)-683,(,8>;44;9.*,./../07==;4/1.*''',.//3555111/,('&'')+-.18<<;80+./-0;<611345763101/06;4.29964.+,-,))19@;)"*/-/12-*)')++*.55-(+01,(&'((('&&%&%',*&.;897656686024589933=5%)>D4/462--../.+*()**+*(5TYNB:97AUYC5873,+,6F8?pvT/(?XJ,*8=;6030)')*+162,6G=,&',.)041:QW[]M:7BLKLF.(4441-+++,1662/00/,&5Zkbds]>=<>CDA?A><79GRKELJA==C@7/.3:=>??>>>>???@AAAABBMNL@===;:::;<=>>>>===<<<:987665542037;<;;<<<<==>@CCDLOLKMONKEAA@@@>?CKW^^_`_^TMHECEGFHHFCA@BBBA>8:DIKLE;5;JKHAA@BEECCCCCBCBBBCGHHHHHIIJFB?=;==>>?@??@ABBABBAACDEGHHHHJMMMMNPOONDAAFDFTS;89IM:78;<=====:8888;??>=?A@>@CEGFDCCA?<;=?@AAA@@@?????=859ADGIJIJKJIHFHJLMMKIIIMSOA==:AI@::=>==<=>?@AA@?<::=CDEGJJD95=FEDDEGGGGGF@<;:<@GKF=79;:::::9::998:=BDDEGHECGIC<=<<<:5-)-5724??81374324668988<@?;7533465;A@;7;HK;1*+-2;GF:7?B<545:?HMMLGA`sFe~J<2+,-.00/-,,+,.133420..,+*++.2487//:EGGC@?:9>;52028;83.+))*./,,-3982.*+1981.-,/6<><4/-...,*,-/7FRSOD1'()*(%.6/*.-)(+,.6CRNB2(3>6*)(%$#%(()*,0223541++2651(4VaT?;ND6111100/19@?80(*.0+()-58747785487,&'')*-11.-09?>7/*...4>=4002456632/-,.27414776641/.-,+-29=2)/3.-0/)&''*.1/,*-,))**'&&'((('''&&%&,/.6>@A@841.04761-*)+0EUB4:0&*67,/551.00110.,***)*(*:RL=7766J\U;3><6-+**($?tv_@0LcY4",9@9.01+))+*.8>0&68+&%+6,*597BLRUF9AHPPNPRD35:51//6DEIOQTK92Z]fmtzvkb\XWWVTTTTTTSTRQRRSSSTTTUUUUUWY[\\\\[\\]\\]^^]]\ZZ[ZXXXWVUUTUVVWWUSRRRRSSRQSSQPPPPOOOPPPRSTTTUVSPOPRSRRSSPMOQPOPPPRTTUX[\\ZXTRTVUSRQOOONNOOLKKKIJLLLMNMMLLLLLMOONOOOKIJQVUMJLLLLLLKLLKKLMLMTZ\[XVZ_ba\XTUW\___aa_[UOIHTbikjjibYSTUSQRU^hdRIMPQQPU^_ZbtYdv|t`_ebbksvy||wcXZYZXVTTTWVRa}t^^c``gkhdabcfjmnlfccehoqefhihdfhggikknttsrh\Y^\erhpjchfddde`X\g{|~~td_aY\aabbbbmwk```_^dwkccafhq|ywz{ouusw{ztlnqqqpmtwsecccfkzb`gs}gZ\_alulbafmlbrbNSUTWYZ]^]\_^]\[XSYefk~ojhghdeUecikmmoqnmklllkjjlnldZ]hlnodkt]etphhkjjkkksti`WXggca___a`br{{|}~~}rb]\[[[\^`c`\_^\[[YYXYZ\]]]]^__][ZZ[\\ZZYXZ[[[\gyo`]^^`_^gmeYV[ad`dn_[^Vl޹iY_]]__[YWWWWXWZadghfeca^^___^\\[[ZYYZYXetb^[YYWVUVX[`^YURVUUTVXWTSUWWVUSSSTUTTUY]afiklh^WVUUWXZ[_bca`_^]\]^^_``_^][[]^`_\Z[]^OKW]]\\[\\]]\\\\\\\\\[YXVUTTTTTSSTSRTWXXYYZZZZZYYYYXWWWWXXXXXWTRPNLKLKKKJIHFEHA[źsXMKKJJIJIJQWUTTW\]ZUSPMJIHJJJI\rrq}o\ROOhX=FDBBBDGIF@=;<=>>>>>???@@AAAAACOLF>===;:::;<=>>>>>>==<<:98766543128<<<<;<=====>?@AGOPMMQQMD>@A@?@>@FV\^]_``aaXH@DGIGHHFCB@BAB@<66=FKJJA2:IGCAABDEEEECCCBABBACLKIHGIJIKIDA?=>==>>@?@@A@@@A@@ACDGFHHIHJMMMMPSSS[IA>;23OK8:>EI:8:=?AA@@?>=;;<>@?<<>@@>@BDEFCDDBA><;=??ABB@@@???@<77:@DFJJJJKKIHFHJLMLIGGEIQK>CC=AHD@<=?@??>?ACCCA?>;:<=?AFJIC934;AEFEFGGGGD?==;9>IHA;79:::::::::9999;AFEFGHEDGGB?==>>=9424650.8>5/2110/2579878<66542.17:<@=:?:1**0;DFC=<@?639?DIOQOJC8Oc:HiubA70+-/04882,--.024564331/-/,)1;9;>516@IF@A<69=:64334:9510.+)*.--.0541/,-176.+1889=>6,-////-+,/7FPONK=+'&'('&+-))+-**+++/;JG=921<7)&(&&)+(&()+/387672*++.26(5eqXB:G=,11212213=CC=4++196*&*2;:49;3/496-''(*,..-++-242,))//-4=;530022344/(&()+13234235673/-,+0546:884,*-,*()),/0/+*-.,++*'&'()('('('&((,5:?>@F@4-)&*3860,**,:csXCB;,+11./11/.-/35560++*(*)-7A<5453<>>>>???@@@AAAAEOIA<<==;::9;=>>>>>>>===;;9865553225;=<<;:;=======>@IQRRQQOF==@@@?@>>>>>>?@AAA@?A?@@CDGFFJKIILMMNQSSRYKD@;71388::=?:;=>ACCBCCDB@@ABA@=;<>>=>?ACDDFGECB>9;??ACB@@@??><877:@DFJJJJJIHHGHJKLJHGECGOG;CFCBEGGA>@B@A@ACDDCA@?><:66=:7;HG;77::::::9:::999::?GHHGFFEGGC?=<>=;<;:9740-064/0/./02369889=?@?;888643117<>=::85/.:BDB?=@A;35@ILNMKGC?5Jh7048630./01358:4--//037975432223/-7B>;>933:D=:?93:>72345456775420.034111--,++.22-+;H;-/2231./0211/1;INJJF6*(&'''')*('$),,)*,-7FD6673990))*,46*&(*-17=<651*)))+2->olC<:98-/2335835?ED>71-4DA+%(*3<69<-&/2+))**+++++*+-.-)%$&)+-4:7650././1/'#$(*,0310/,+0685.,,+07637=<5-*+*))+--,,,+.231/01.&%*,+))*)(&,0,3BB5;GB4+%$*2770()*.Guy_NI>.+/11/-...-25310/,),..+.1233453DOORUUTG:.,+.62An|rf``ac^LABFF>==95-$'(0;=-,+(''$,:0&8D9/1577:BBDGJUF41)'&2=7037876:3+0.2bvW/3`qhe^XTTROFFOOE??=>CAC<0*)/*/TA)???????@@AAAA@FOE>;<==<:99<>????????==<;:87655435:>=;::9;<<<=====?FQUVSJB><==>@@@BL`Y[]^^``abZ<5FMEDHHECBAEEFEA:84=LLMKI@BPJBAEEEEEEEEECABA@HNMIGHHIJKKID@>?@???>>@ACCBACAA>BHHEFJMKHKMMNPSSSVQIA@>=42887>??ABBBCCBCEFECABCBA=;;=<<<=?@ACEGFDC?99=?ACCA????=7388:@DFIJIJJIHHHIJJJHFFECGJGC@BBCDGJFA@BBB@@BCBCBA?CA7538BHJB54657;AEFEFEEE@==<88?>747<;9:::::::9::;;?HJHFFFFFGF?<==<66:;97531113///0100279988:=<:6554455548=<<:;;967DDB@>?B@96<97834;=5.1565579:63235358410.-+)(+-.,+5@9)$+9B5.-1538509HLHE@3-)((''(()*+,240-,+-3?A7//1585-,.189,%(+059>=830.+*(((-FnT15:43322248;25CHA;61/:E<,')(,:;730)-2/-/////..-,+--+*('&%&,464211.---,*'(+/210.+*)'(-44.++++*-2546863.+*)),//+*,014664488,&(,-,,020/.1/2=5(4FB5-)(*0572+)((Evw^TG2*,-...-./0/12-*())(-31...0127?JHIH>842Hm}mXA1Dkyxsl_TUUNJNNHBADB>56762.*-(,TJ08:9/3Bsrvzyxwxwxzvpha[UTTSTUUUUTTTUWYYZ[[[Z[[\^____abccefededcdb^^`_^^\ZZYXWVTUWWVVVTSUTTTTSRQRRQSSQRVXVVWVUUWUROPQRTUUTUTQOOONNOOOLIEDFGJLMMNPONNONMNMNNNMMMMMMMMLMLLKKLMMLNONOQTUUUURU\^][[\\[[ZZ[ZXVSPNNMNPPQSSRW]abccccc^[[^`abb`YVUPOU_inlgeaZWSPQQUSPQPRV^c`^V_yX]x}~~vcWUZcm{pi^V[YWWWVWYXWWUUTSexkfkh_\age`ahonfbbbbbdeeffffginolkmmnrwxz{p[Ygmt|wng_h{}}wabeegjklq{{z|w{g[[YY]^ckh^\\`_]`````_`____^^^^bffdddeeoqppnnqpip}ughjjkmptwtoy{hd^_cfghimowz^`ih`ap}te\]agid`]fxiYdKX]mmZX`flortrf\\ej\rsa\cbPkntponnmkmnkjkiace`cjh\Zdllkihgsvkmllkklmmt~ogcca^`\[y|{tj`]]]]\\ZWadWU[^\ZXY]`_`ab__fje][\`bb]ZXXY\^`_aw{d``_^^accdc][bcdcehkbYXwʸiX_]\[]^^^\ZXXXXXZ_ca_^]\[^`aa]ZZZ[[[ZZZZ[ZY[\YWTSSSTVWXXXWYTQWXYZYWXXWUSUWYY[[\`befhigfffda\WUUTUWY[_a```__^_^^^]\[[`fhjhhnmha^ZWVUWY[[\\]]\]]]]^^]]YTTVXWWVTSTVWXYVVWWVUVVVVXXY[[[[ZZYYXXXXVTRQNLLLKKKJIHFGHCL˥pRMOOU[]_kfWZWWWY]]XSSQNLJHLNJJNQSYfhYQbnZE>DGEEEGIGA<;<=>???????@@AAAB@GNA<:<==<:99=>?>>>>>>>==<;:876544469=<;9:99;<<<===>?BKYYRB<=<<<>@B@G[_W]__^`bb`O<8;F>;FGECCCFHJKE::9?@????>@BCCBCCCC?CJKEGJMKHKMMOQSUVYYND<=?:7862FLCBGHECDDDDDCBAAAA@><=>??==>?>?ADFDC?99=98:9:@CEHIJJIGHHHHIIGFDEEEEDJMA@BCDGHHC@BB@>>@BBBCA@HK;434=;649:77544211111110/2<<67:=<:64343200223437B@;;8;B@=;=ABA==AGIJF>5.--,$UP27536640/00...././24333320/0111.+.8DB66634;:76537=<6257654468775540263/046320,+/20-/1*'.7;3..01.02/>831.+)('%)AW:5576241111:;29GIB92/07=3*')*+284/FL@4776655465.*+--++.2/((,110/--.-,+,.-01561+))*-,).30,*---+*.455431/+)(&+0/+*/677877:>=0)(+.//5;;921/03*%/@?42,)*-49944.#8ow[PH63/--,--//0.-2530+*-/./-..01/>OG>0*ALKI:1/-+-48>ISD;OaRH_]KCGPX^_`^Q?3.,,,+.8;431&'43)2/+'(+2<@78FFHF@7().*$0139@JOTYXI5*+Lvt[D=CP^juvnaTXVMHLKFD=;<:68;==>91)+VT56980.3lovzyyxvvvxyunkf]ZZXWVUTUVUUUWYYYYZZZ[[]aaaaababcddcddddddbaa`__][\[YYVUVWWXWVVWVTTTTSSRQRTTTTTVWVWWUUUUTQPRSSTTTUVVRPQPONPQPONKFDGJLKLNNMNPQONNNNNNNMNNNMNNMNMLKKKLMMMMNOPPPQSUTRUXYXWZ[[VQNNNQTROPPOOPPOPQOQW\^^]]]\YW[ababdc^YUONTY^eknolc[XVSTUUSRQQRZbbda[ihTWel_\db^_]W^mv~hQ`|vUV\ZWVVVVVVVVVXVXfnefhb]\_eeaenpjc`_`bcceeeggdfjnpnnnnpruvz|vc^ejq|~qd^du}}j_adgjmmq||ztz|tkijlkhhjdZ\^^``ab```___``_\^ejigfeeeimumgjmoqhhmpknuyiijklnptzxjksi__cghjkntwgZejc``nyo_Z]chgc_bkia`vxYik{TZgmpqttlc_`^RTZUWYXZ`jromnmllnkjklgekg^`dfgge[Yemllgfmvqlnmmlkmmozytunjda`^b`Zo}vka]^^\]][]aZUZ__^[[[_a`bcfd_cjg_\]dee_ZXWYY]^]\ra^aa_^`cbba^]bceddfnjY^ŵڣ`W]\[[\\\]\ZXXXXWX[^]\[[Z[`acb]YZZ[[[ZZZZZXWZ\WUPOPRSUVWXXX[WUWXWXXVVWVTTWZZZ^_cfdeffgggfeec^WSTTUWYZ^abba````_^]\[[\cgiihhfgkd^\[[YXY[[\]]_^]_^____]YURW[ZWUSSTUVWXXWVVVUUUVVWWY\^\[ZZYYYXXXVTRQOLLLKKKJIGFHICLrTMOOT[\^stXWWWXY^^VRSRNMKILNKIJKMNTsrZSmd^F>DGEEGHIE@<;;<>????@?@@@@AAB?IL=;:<=<<:99=>>>>>>>>===<;;986445569<<;9:99:<<<==>>??L_XH@=;;<<==A?:[^\___^`bb\E<=><55??@CEEHJLPG;86:EKLJCCDOMBEGFEEEDEDDCEDEDKSONLJJJJJIHCA@???@A??@BCCDEEDDBFIKGILOMJLPOQSUWWY^L>88987862LXB?@AAA@>==<:9=AAB@;9;=AGGC@>>>===<:;ACEHHJJHGGGGGFGFDDDEEBFRVK@FCDFKJA@BA>=>@BB@?A>GTD5436CLE54344337AGFGGFB=<:611322:=<:::::;;;:;;;>@B@<98610-'+IY?>9;;;<<=ABACCFHKKE=8/*/6+Go1,0-0585/--,+++++-046310/.-.01.*)*-7E<35524896534;?;699976332358<:3-.0.,/4:<=>3+17973/,++//////.)+26ALJB<61021/02,*+,.-/1/152-,*2:;5.--+)()))()()*,05<>:41-+)('#*6:69869841116?:3:DGC7..1561)',1/+-5>_j[;8><<966994.,--,,.13-+-/,*)**+++*-1212343200168-)../15443/.37621.)&''',1.*)/9<:779>B>2+(+/23;ED7010/-*)-64+0/()+2;?>=5*/^yYBIH=2-,+,-/.---6AB@93221/+,.01-@TL7))6FOH0)--,/68<>937FYQ?XeN@BFNUWXTI>=;652,/=F?324/.6-,,*((.38985;:?Lcn@$KaA9749?HHIYgR/&,JlZA=;>HHPepjc^\WLCLLA826857BHIJKC5),XT54891.4qtzzyyyxxvuxwsqmgb^[YYVUVVVUVXYYYYYZZZ\_accbbcbbbbcccddddddba`^^^]\[ZZYYXWXZXWWXWUTUUSRSSSTTTTUWWWXWWWWXWRRUUUUUUUUVVSRQPPPQSTTUQLIIIJLLLKMONNMMMMMMNMMNMMMMMMMLKLMMNNNMLMMNNPRTSTTUVXXY\\[VQMJJLMMOONMOOOONNNPTTTRRRRRTX^baacca^\ZYXYXY_ipsohaYWUTTTSQRQV_aeh\ZZXUTUTTUUR_{~henw}p]MNbkTW]ZWWWVUUVVUVWWYfjced]\^^acdhpqgca`bdddeefjlecinopppopqrtxz|ghq}~ue^fmu|zr``bcfnoos~}z|}}zx}~~peaccefb^bb`____^_``_]aqwngeeiklry|yrpjkhfgjt}jjjlostvvzeakui__ehknmmrutdchj`_^n{j[Zeliba[[b_`fmgxȽxYZkoqqssld`a^WTUUW[_gnmnnmlmmnpkjti\`jg]_djjec[Xdllkhhpu{}nknmmlllmozqkfbkkcWXakhch|~qb\^][\[[_WVZ^_^^\[[_``bcfe`ahia\]dgg_YXXX]fe`\pc^ba_^^____^^aeeeeenmZdôڔYV\ZZZ[Z[\^ZXXXWWYYZ\\\[ZZ``ac\XYZ[[[ZZYZYYWX[YTQQSSUVWXXXX[XXWWWWVVVVWVWY[[\fjljffffggggffe_XSTTUVXZ^bddbaaa``^]\Z[]chiiigdcca\Z[[YWWYZ[]\ZZ^^^^___^[WY]\ZVRQQRRSRQRUXTSTUTUVWWX]`][Z[ZZYXYXVUSROMMLKKJJIGFHLEQýütTNNNRYWVhnZYXVWX^]UQRRNMJIMPLIKKLLPnyXUvwY_H@DEDEGHGEB<:;<>????@?@@@@AACAKG;::<>=<:::==>>>>>>>===<<;986545678<<:9:879<<<<<>?>?O\N???<<<<;:97;V\]]]]_`bcXA<>@B:5<;=BEFIKMOH<869@KMDCLJKHEFEFEEDDDDCCDFGHMSOMMJJJJIHFBABA??@A@?@BDDDEEDDCGLJHJMQPKNRQSUWXY]^G27688676;WX>:E@>=@ACDDCBBBCBABACB@@@?=;:6236===<>@CEGHIJIGGGGGFFECCDEDAJX^OAHCDIQNA@A@>>?@AA@?A>FXO>863;ID421101565>FEGHB<;71./211:=<::9::;;;:;;;=AFGFGFFGIKLE<::8676134122110111000-1DH;7ANPLIIOQLIGD@840*$:^O8=:5/4;@DA;=DGJNMC=90*49.LvC*/1/1331,,+,--,,.023530.,++.21.)*+-44635423565424:=87;987531/-013641,*+,,29>>=3+.3964542031.//.-(*39AJJA:40264257/-,-,),./374+'(*17851010/+)**(&(),168=:3.+))(&$*4*49:<9;5/115<647>DC7-.2420('.62*'3ZzzsM9CA>;747772+-/20.-,,,-.,*())))**-220035100--495.**.6777631474/-,&%()-02,&&-9B@76DPN=MiUB>639?A>>????@???@@@ACHJ@9:<>>==<::>>>>>>>>>==<;;:997656779;<:99878::;<<=>??FKCB@>==<<;968JVY[]\]_^`bYB;=?A<9<;ABCCBAACDDEDBA@@AAA><:73119DHIE?:?ABDEGGHJIGFFFGFFEDDDDCCN\bH=G[[N>:89CB321.,/6;15@BEHD<;5.,0410:=<::::;;;;;::;=AFGFHHHJMNQL@<:5575012//./01100000,1DMA:HVUOJLVYSNKID?<81*+I[<=<:6239CA65>FJSOC=7/0>?/@{z_@1222211/-)),/2445742110.,,,+/432.-+-01567610011114887;;579741/.-.,,/1/----299841../0-,/2344432210-/0-3FI@8412767::///.-)..1894,'%$*036433353--/*('(*.47:81*)((('%*4.+2/39<5/,*+++*,1:@5001110+*++DK(6Yb`^H5=;975552/,)020/140,,.0.-,,,,+,,.110287,&')((.792)(.687765661+**((,.253,($%0BE:6>C;11-()-/1=E3*..-..+)1;;510*'*166:;88:AZN8BB60-**,-.++048<>A;54241..0546891(*0)&.,+.576547=AEHIFFD5?cXD91*,7B>>>@FDCNTICDD:-)+;H=4,((&2:60&%YFtC9HJC85:JU>14+)-123A]nnigaWUSTSH(/9;:=MLJHIO?<8XV:455-&-vsotz{yyywvvvusomifca\WVXXWXXXZ[ZYY[[\_`_^_abbba__``_`bbaaabbba_][ZYYZ[\\ZXXZZWVWVUTTUUUTTVVVVWYZYZ\]\]^\ZWVUUVXYXXYZZWRPOMNOPPPRSQQOMOOONMMMNNNNOPONOONOQPNLMMLKJIIJKLNQSWXXWVUTSQQRUZ\^_acdcdbYTRMLNNMLKJLLLKJKLKKLKMNMR\```ba^^bdb`^WOQX`iqutpdWPPOPTUTUZ`dfbZXXWWWXXWWTS_~{celoeZZ[WVZ\[]^[XWXXWVWWUTTSWcf^`ihaa`_``]Y]cda``^billommrqkkoqtvwutrqprxnjsr~xwndklmqrrmaadjqqnuz{w|~}x}~~znc\]^_]____afw|nmnfgxoknoqsy}k`^^`iZ]fjjlkigeb^bknjf`bj|nWaq^^_wgmpbWQ]gW`~جOV\cghmspb]\\ZXUW`innnonmnrqkkXWPXbc^^beijf\Ycllknotqilomlkkmjvxme]]]ag`^nqvzrmmp}~g]\\[Z[[Y]da____^^]]]]]]`a_\`eb``dllaZY^erxupedk[aa_^^]]\\\^adeedccfYiϽoMVVVVVWVWWZ\[XWWVWXYY[]]]]_[]^USTVYZ[[ZZYYWUVWWWXYYXYXXWWVWWWWXYYZYXXWX^XU^cgijigffhiijihggfhf]VWWW[bgijebbbaabba`^_djjjiiijgeb_^\[[[ZXXWW^oeXKKPOT]\]^____\YXY]__`]XN[k`UTRQSTSTY]]\\\[[[YXYYXWTQOMLLKKJHHKKNMN»qWNOPQPNNU\ZXWURY^TMORQPNJLQQMJIHHMO^η]gzsd^PDCDDCEDDB>:8:;=>???@?@@@BBCCKF=<<<>>==<9;?>>>>>>>>>=<;;:::8777889;<:9987789;<<==?@@?@A@>??=<<<=ESWVY[]]^]_b^D:=>?>>??@D@=@HHMF;;;NRNLHHFFGGGECDFIKKFKMNOOOMKJKMNJ@;>A@@@@AA@?ACDDDDDBBFNMJKMRROPSUXZ[^_bdR476544:8;OQ?=<<=@BCBACDDDDDEC@>>@CCBAA><<845=GJNNH=8@IIECB??A?@BEEEEFGHIIHFFFGGGFDEDBBCJVXBEKBFOTMB@???>AEIGC@@?H[^ZH;9;??4340+-273/8BEJE=93,+/;<79;<<;:;;;;;;:;<=AEEEGHHIKNQOF>93453000/.-.01100000-1DPD;N^ZQKMZ_ZSOMKHE@7/*;SB9=<<7447=:56?ITRE=5.6JJ25huS@5684100000-*.57789:83/--,+,,,145694,.7:89970,++,-/578=B;17<851.....,,.110/36:71..,++)****+,-02564343.'&4E?5422246940110.-.-3<<;=;2(&,/45431561.30*''*-/0240*()))(&*2/**&&*.00,)'()('+36420--/222/+Ii20:102-+./12442/*(*..,,1750-02100/..--./011265,&$(&%&)38.'&+2689982+(''(-02342052(*:B;5;>931.((,,1=:,).,*//,%(395/-)').128:8535AA992+/.))-..-.699<@>4561544356643.&'/;2%%'05=@6115=BDGGGD@87DE<51/0GP=+,0/,0>P]a``]WTKJQA-.38?@ERKAJTZPQBWU723-*)+mjjtz{yxxwvwvsqomjklha[Z[YXYYY[\ZYYZ[[\\\\[^`_^^]]]]]^`abbabdecb_\YWWYYX[\ZZ[[XWXXVUTUVVVWWWXYYY\]]\^_`_^]ZWVVVXZZ[YY[YTRPNMMMMKJKLMMMOQQQQQQRQPQQQOPQQPRRRPOQQONMNPQRTWY[ZXUUSQPPNLMQUWZ\^``acdbb_YURPOOLJJJJJIJKKKKMNMLQUUW]abbbegeghdYRSU[ejnvypc[SOPSTRU[]`c`\WTVWWVWVWTPWcbfpuwpki`XXWX]_[XXXXVVXWUTTSWcd]biklha`_^]\[^a`_^_`jpmmkfiqurrqtwxxyuonmljhhltw{~pdimlmmnyvb`joprps}y}y~yowve`__^__^^blx|pjgho|snoqpqt|n```bi^`bccdeecb^`iohdaadmxl[xm]^bhuhe_[]YXReฯSXaegdhvs`[[\[ZX\eillkjggjmqcVXTQXd_\^_cijf]W^jnlox}rkkkjklnjkxqf`[X[Y]sqaequrmn}|ka^^\ZZZ[ikb```aa`__^\\Z\\[[^fgcbepqcZ\dntrkiji}k[`_^__]]][\]`beecbaa]`оcNXUUVWXWWVV[[XVVVXZZY[]__``[Z[WTSVZZ[[YYYYXWWWWXZ\[ZYXXVWVVVXYZ[[[[ZZYZ[[W]knkngfghjjjjjighhiiaZXXY^eikkgcbbbcdcbb__hmljjjjgb`a_^][[]]ZXVUUVSTJHJLV]\]\XTUWWTUXY]`cb`XZeg]TRRSSTTY^]\[\[\\ZZZZZYVSOMMLJJJJIIKMNJikTNOOOONQVXWVTSSZZPLQRQONJLRRMJHFEKPQf˳drxusfVEDFFEGGFC>999:<>???@@@@ABBCDFB=>=<>>><;;<>>>>>>>>>>==<;;::9778889;;;9998899::;<=?@?>??>=>>==<>@HT\[WWZ\___dcG=A@@@@AAACC>===@;<<;<@@?@>?EGEDA?==>@BEDCABA??<:@FIHFFFCJXU\WB7;<<8687-.022&.AEJG:3-,.07;86:;;;:;;;<<;::;?CEDEGGGGIKMOI>844420220-,.01110/..-2BOE?Sb[RJKY`\WROQLG?8316?>3;9665549<86;@IRK=1,;SR:9[nU==CC@:4222463/4<;:88741,(*,,++0234<>4-07>><:7,'(,./1488720/.,++,./120-4884-+)&&(**)*)(()++2=<7642/));>1340/.771033100/-7EMRUVQ;&&*+1331252032*&')++/331.,***)(,20,*'%&')000..---.45210./34315DFN4..+)('(()+.660,)),+'((+-,+,/33334442/.00000/.+*)((()(*//.)&)-3653-(&''(+//,.27=?82487678874/*).1672./0+)/.*$&,-++++))/457862/57530+-2,(+-.1129:8:8756658:<:74432,'+3;7,)/6;@B3--3=BB<;AD?940//12129C@?A9BX[GJ71-(*,.172*hW9IK8,()4DMQC*'111589:99:<>???A@@@ABBCDD@=>=<>>>=<;;==>>>>>>>===<;;;:989889:<;;;:99999::;<<=????>>===>?@???CR]]YY\``adeF;ACC@@?@AAB@><:88;><:@PDHUTOLKIJJIHIOSOHDGHESYMNPOMKLNPNG?=><>BDCAA@@ADDEDDDCBDLNMKNSRQRTVY]_aeipZ/6545;9;>:===<;988:=<=?B@?><=@ADDDCCCCBAA?=@FIKMPOE8:HKGECCBBEHEBGFEFHLJEJHGGHIIIGFD@@BDB@Wk[HISSGDEB@@@@DHHFFHFGMMV[O<;;=>98721135129BIH:.+,19?9159;:9::::<<<<<@CII=;99997::;:8544/))+--,-13/0;=3/14=D@93+(*12441017=9/14211/,*)*+-..//-0541/-+(('(*()/.+/0--5;:65464/8=1.32/2:A?:71/42,,:LW\[]`R2%'&)+,.0121/.*''))*16530-+)(',.00..,*+*)+.10/-/33552012/,,*)*75./0..+*)(())0;;/'(.1-'&')*(&'-1000110/-../......13.,-,,,+-00)$&,22.*(''(''+*&(/7;=B<57:8665410-/344310//+())''''(,23-*,49632212781..052)(,-.2555334/3:8788;?>62553/-///5407=??;1..2=A<428=:40/,/58645601JXZkZA6?:'',5>96:369,)/25940^}>AXL665>VNKP?69754442E]`U?/+-661/-9DGILKI:3:K>QW8*-,.0/mqwxyyxxxwurplggmqplha]^^]\\ZZ[[ZYYYYXWWWVXZZYYYYYZZZZ\ac``egefjlkha[XWUWZ[__\ZYXWVVWWWWYZYXYYZ[^^_````aaa_\YXVVX[[\^^^_]XSQPNMMNONLKKOPOOPOMNOPOOORSTTTUVWXZ]\ZXWWYZYWTQPPPPOPPPNNONKMMMOOQUWY\ZVSUVRLOTTSSROMKKJIJKLOPOONLMSY]_^YVZ`dhlmljfdb]Z`gijjigc_][YYYX\__[XWVWWWVUWXVSTVXSYlqbYY^dfeb_`b_YXXWVVURVabZ]kvvna^^___bdca```bksrkhkifmuvttnmwzgZ]bcbabbbgtygemnggmsrgadeditupnruqlnpnow}|nj~y~d\efqm`_^aie^dsuphgupfaadhjklmnz~s}n\\[[aX_bbbcccfgedtca[rw]ag`p}abof[Yr]boveVW\wהdknprop~rwhZ]c`]\^]^__]]cfb[|]gdc^]^_emnh^YYaklilruzypijmlllksym^TLORTlmnmjijgkzja^]]]\\\Z[]]^adedc`^^]\]]]^_bbbcex{gX\{ejxzkda____\[Z\^_cfbZX^_Zd¾ׯ`RZXXXWVUUWZXZ\[YYZZ[\ZZZ[^aa`][Z[\]]][ZZZYZYXYXWWWVUTSSSSTUVWXY[[ZZ[YWX[fpk]bljijjkkiigfffjnjgihb[W]dgikkhfecaaceffghkljkjijhXJOPa`]_iuaJ\_SXTOVe`VY[^ab[MHHGHNQRX\^]^]]\[YY\SQUTU[^\\\^]]]]^[[ZZZ[UPMLKJJIHKLLNQOVsùbQNPPRRNOTWUSRRSWTNNRSQNLNRSRNJFDDFPVH@l~stvi[EFHIIIJJD=:89:<>>@@A@@@ADDCDB?==<;==<<<==>>>>>>>>>===<;:;:999::;<<;;;:9998::;<=<=???>>>?@@ABA@?:7=N[^[Z\_adc@7?@BBAE@?AA@@@:9:>@>9EUNNTQLHJMNKJJKPNHDFKMKU]QNOMKJKPPLC>>>>>@ABACB@ACFFFDDCBELMLKNUWUTTX[]^bhlrY-65:=;::>@@>=<;955:;;:;===>?ADDEECBCCCBCEDBCFIKNPQH9:GJGFCBCDEMF?GEEFHLIEKIHHIIKKIHD>>AD@>L\[CLTL;BEB@@@?BGHEDFFEEHLTUF==>==:855:::=<8AFG;-+-3COD14;<:9::;;<<<<<>DFFFFGHIIIHGGD;444312341.,,..../.++-0:HKKPRSSLHS]ZTQNIC<99;A??@7066789>?AAAAA:.)EcJ:9=BJOMLKJHCDFA;:9:9999889:4-*,.25323.,5;:7406DC72,,.24430*+5:554./322.)(+//--.0.-.011222.+*+((268;5,')18:86522=F>/.24/('+,*-9DKTWX[R6&'$%(*-....-+++,/124652/+)&$)11..//872.,+++,-.243442///+&%%%$$&*/0/,)(+12-,3:8+%+2551)%*/-+*,..,+++*+*+,--..-,---.-,)*++,,,,*()283*&'(((''*(&+0006757<;862-*-0530/00-++)(()((()1;;3,),3730/1356311134.''*-2664202219<88845:;8698532/-*4:5?E@710/16<9632231++.059975421+PDC`ulf\MRZTSL:6AGMG6()-51ST;6.-/,.rsuxxwxyxusplhefmrpnke_^]^_][\]\ZYYYXWWWVWXXXXWWWVWXXY\_``aeffgjllkic\WXYYX\_^[YWVWXWWWXY\\ZZ[[\_```_`aaaa`^[ZXVVWY\_``ab^WRPNMLNONMLKMNNNOMLMNNOOOQRRSSSUXYYZ[ZXVVVUSQPNMNOONMNPOMNNLLMLLMNQSVZXSQTXUMJNSSSTROMLJJJJLNMMNOOOOPQPOONRVX]dilmmlmmid`^^_cgihfecb_Z[afc\WVWWWWVUWWWVVVST`bZWXajijihgeb_][XWWUSU]_[]lxwna[^a``bda_ceabktrjhmompsrrutsq|fZahmjghfadrzmjjiikourd^_^_ekqtqoompvtfg{jenYW^\cdija^\^hnf_kvqdZ\g{rfaacfijkkmx}|b\^]\\]_`aabcegihfs{hb[Ylq^bgY[oa]guusw]Sadb`efqͼZbc]aa\`ffmkea^ZY[\ZYa`__^\]_]Lsfeie]\^`fmoi]YX\gljfjrywojilklkl{w]QMMMObvloqkgiuxy~la]]]\\\[Z[]\]_`bbcaba_]]]]^`abccdwygWgww|zzyrica``_][Z\\^``_ZY^caYh¾{NVVVWYYZ[[]][\\[ZXZ\\^^]]]_aa`_^]\\\]][ZYZ\^^_]ZXUTUTTRRQSSUVWZ[[[ZZZZX^ipopf\hiijlmkgdefegimkhjke\W^fhikjigfebacehlmmlkkkkijlOJURa`Xez|g[phUYWRObe]\\_bdaRHHJJNPNV[[\^]]\\ZYYTTTUU[^^^^^_]]_^][ZXVYXSNLKJIIIKLLNRSLMoǼ^NONNXWMMTUSQOPRTQMNPQPNLOSTRNIGDCDMSNAKyprreZGFHIIIIIC=:98:<>?@@@@@@BDDCDA?>=<;;;;;=>?>>>>>??>??>=<<;;9999:<;;<<;;:::9:::<<=>>??>?>>?AAABA?=:98;IU[[Z\`b]<2<==??B?=@@?@?<9;?DACRVUVQGCCHPMIIJJJHFGIMPMT`TMOJIHKLJGB?>>>>==@BEEABEFFEECCBELNMMOU[YVUZ]^^emovd66:4?BA@>??BFGCBCCCCCFKQNB>?=>>;8<@=9;>=ACF=,+-5EMME>>=;:;;;;;<;<<@DEFGGFGGHGHGFC82224425651.,-...-,+,,084155557=>>=;9982-G]>5;CMOQPMKKHAAHH@;754565678:<5,+1795310/36?>3,.;>3-01034556/,58236436786.),131./11,),023585321122597/(&(.379:6-.>JC3+/9DNUS>+,.'(04305?FNOE5-,++143.,--,,+.5898883.+*)(&,770,--12/,*****+,.--.//./.*())*)(-892/-,/7=;01892+).2246-$).-,+,,,,)(''()*)+**(*+*)&''%#$&(*($&--).99,%&('-0*.2,+)(()/10598861..030-+./--,,,,,,,,2=A8/*'(./-./1340*,033/,)&'/8;72..235;;87842699:;8642/,+2959>=4/1//47112222/**.14873496.$0^{J8UZQB3./24;CEIKJ;*,48;?9,[vNCEQf_QOSdkg\G??@?@@BDDCCA>>=<;;:;<==?@?>>>??>>?>=<<;:999:;<;;<<;;<:::;:<<=>>>?????>?AABCB@=9:<99BQ]`\]a\=3>@=>?>?==??A@<9<@GFLVRTUG>=CHOIHIJJKLMMNQSLO`TJLIHHIHCAA?>>>>==>BFFCDEFFEEDDBDKNOOOT[[WWZ^bcgqt|rB7>???===<=>>?=:8779<<=?AABDFGEEECCDCCFHLNPPLJLNRRMDBHJHIHIIGHA9;FCCAACKOLLKKKLLLJID??DFFEDVbAKI/4<@@?>>?BGHDB@?@BDFHLPF?@A?>=;:8426?B;8AA.),8IJNXOB>;::;;;;;;;=BEFFGGEFEFGFGG@60112346874/+,,*+,,,*,1=HJSXUSQHFV`]SPNLKICADGGKEE8210100/28::8535:=8FU=5>MSRSTRNKIB@DFD?6-.1354427@9,,1443421012::10/370.35//26<<52552146789<:2+-0430-.11-.222357:<;<9100+'(+,/431793.481*,5@JQTPA465*.57/*.7@GHA>=778::5-+1551*(06655/+)()-.*).562-+.000-,,---.-,,**+,./-,,+,,+2><52368;<8//670-/./.-.,''((((,...+)++()+***)*-0-)%&%&()'$&'$"'+()03.('&%.2.363.-,++.00269:7531/0.+*-122110//-+1>@:2*'''(()+--.-)%&*-.-*(&(2<<50/0468:;97769<<96875530.,-123344431/020/0/1473.265468:<7,7^Karlg[G1.4:EMQNGF:2@KF>/*opb_Q]~z\GCHVlxgWXK=>@@DG;5<<4+'(1::6667666466*QJ6=;6.*;mouyytqrsqmjiffhknnoqrldb`__^^]^\YXXWWWWXVTUVVUSTUVVUVWXYVV[^^^a^YVTTUVY\]]_``_]ZYXXXWX[]^^``_`aaabcddddedb`^[[^_]YUXZXVVWWURNMNLKLLKLLKLKKMLNNNMOPPRRRSTSSUUVWVY]\UQPNMMNOPOLJLNMLMMMLMOOMLNOPRRUZ^^_c_WROLMOONMMLKKLLLLMOOOPNKKMNNNNNMMPSW\cdbbegikhdaadfgikkie_^__\VSUVWWUUTSRTUTTVYXURU[[[htmec`cd\WXZYZZWZdp{|oaYYafedceigefjotvnkrvtsvxpklqyo][\]_chhimqrzsdp~pnpprtoptvtsqnmmjcgxc\]ZSalbb``^[Zdjfjwuear~}{hdddfhhhilomfa[[o~eklZ]aaaabdcaaeehe]dpigZWQTT`]TSQ}dl}wkif`fhox~VZXWYZ\_acgjfcaaZ\aacbbsi[]fedb^bkjba`aabflj]XXXbnpou}{qlmkkllmxsZOOORtxiopmfcehov{pa]`a_][[[[ZZ[\]]^_`beggd_^^__^bgW[kc_XP_ɷofggeceeb_a`^[ZZ\\\Z[bfda``]U_º԰XTX[\\\[[Z[]_^]\[YYXYZZ\]^]^_`_aa___^\[YXXY[^``aa]ZXWYYXWWXXUWaea[Z[[`hmonnjilb[lprjccgkijgftypkkkic[`hihhihggecbdefjmmlkkgiikgPRZ^`^HNl_[]UUUSOTYQSZdeeYFHONMKKNVZ\]]]][\]YTWWTSY_a``a___a]VV\ZQEOZPLKKHHHIKNOPRULT¬XLMM]iVLORROLKKMNKMONNNMOQQQPOLJGFFHJMKDTtuklf[ZJFJKLJIHB<:99:;;=??@?@@BEDBBA>===;:::<<>@@?>>>>??>?=<;;<:999;;<<<<<<<;;::;<<<=>>?@@?@@>?ABBCB?;98<;8:?KX]\a^F>CB?>=?@=?FHCFHIJNTTRQQPQLL[YGIHFGHC=<>====<<==@EFDDEFFFDEDCEKOOQOT\]Z[\`fiksyxK7A@@?>==>>>?@>;877:=<>@ACDEFFFFECDDDDEHLMOONKLORRNIJKJIIIJKLH@?IKCA@FUYRKNMKLLMMIDBABFIIGEWaE@:/36>A@?>>BIJGCCC?@CFFJNG?@BB@>;5248>B@6498+),7GLLQOD>=;:;;;;<<;>CGHGGFEEDEFFGF;101223579972,((-5;4*&',8AJX[WTOGGXc`[XTSSMDELMNOF:5310/.--.157654?JMDCOK@>ILFDKJFDB?==;:=9,,25642.4;5-./02354313455422430021/03:B?768:9633452571,-0320--07;975443568=>6230*')-.030*+7;41-')7ELPPMC<840+2:91+5JRJA:9;<>A=72,,6>>5+((+---)()*,./+'%0=8/*05/.-,,----..,('((-011-*)+*-6867998787/.21.23012.,-+((+*+021//4660--/----./-)&&).01-)*,+(&((()++*'&(+,0;84134551/,.5:96321000..-154331/..0;;.,120,'&''*+**)(&%'),+(&&,6951./28;98;9448;=:0,44357510/4:867;<;;:8765202575016748>=92@vjeqnjgcJ123?NRM85>7;?@6/5:0(%&0==79967<<685+QJ6962-3Estvxwtolkmkgffghjoonopmgda]]^]]]][ZZXWXWWXVUUUTTUVVUSTVWURS[]ZZZWVWVVVWY[]^^```_][ZZYWWZ\\]^_^_`abcefffggfeda^]`cc\WVWXXVUUVTPPPNMMNNNLKMKKNMNMMMOQQQRRRSSRSTVWX[_`^ZUSQQQTTRPONONMNOOLLOPNMMNOQQQSSTW\cc`[TOMKLMMLKKLLLKMOOMMPOMNOMLLLMMMOSUX[XU[^XWZ]^\YXY]__`_[YZZYWTSTXZVTTTTSSRTVWVTTTWTM\sskib`b^YVUX[\XZerzyob[\affefhkibesrqwqmx~wqs|ynmordXXZ^bc`ekpy}uw~|{{z{|zwutrpnnmidrx]Z[]blfbb``_]\aggkomozykgihghiiihiigeb^i~zgedcbacfbblnege]jwskd_YUR]]XSd^`tu{xdYali\rܩXMZ`iifidcuzti^^egfabgfxk_ss`]hn`^cdedcccehf^ZZZboqpy|rllkklmnwo[ROMivkojgimoqoca~tb]aba`\[[[[Z[ZZZ[\^\behgb__``]ciXSbb[VVMWmfgjnvpb_^\ZZ[]]]_beeda_`[RtŸԪTX\]]\ZXWWW[_`^\[ZXXYXYZ[\\]_`_``__^^][YXXXZ[[]]]][YVXYZ[[XVU^hc^[[\`fklkmlmkli_jnj_\agjjiiefikmjghf`bhhhhhgfffccfhikmmljkeeijfU\cYU]KMs}TKXd[UUVUVMIN`efXIKONMKJIQW\_\]^]\[^YX[VUY_abbaaec^TSSY\PCCPWQKKGGHJLOOPRTMQȾVMNP`aPLPQPMKKKMLJLMNNNMOQQQPOMKIHGIIKMDGbmgmg\XJDIKLJIFA=;99:===>??@?@BEDA@@>>==;;:;<=?BB@?>??????>=<=;:9:;<<<<<<;;<;;;:;<<==>@?@@AA@?@ABBBA>;:8<;;;:;FXcd_RECAA???@;;@CA@:9>;AJJIUF00;GKE;HIJKPWWRSPMKMNZbEDGEEC>;;=>=<=<;;;>CECCEFFEEEDDELQQQQW^_]]_bioqtz{R7????>=>>>>@@>;987:@@CFEDDEEFFFFDDDDDEIKKLMMKLNNMMMKJJJJJJLLIFLRNDC@H^aXMNMKLMOOJBABEIIHHHSU;2580/>DKKKJKMBADDDGJFA@?@>:33;;;;<<<=?DFFFGFEEEFFFHG;21113547:;:::8>JOQIA?=;?DJY]YUOGGXda^^]XWRHHPU\]N3/3231.-,,.258:59==<:7687026214883/-/0/../13332212344555433530/14=FC;6:B@720-,+-21-.021/..1:B?;876430.693021+()+-.--*&+137738DLQQPD2+0++4;><7.:WXA2-*,9BA>;8208CC70.-**+*++,,-..-*%-?81.07-(())*)('(+.+(()0011.+***-25577339<:4-*(,4526;962-),31/3840/37:70+-1**,-,,.1//0221023/-+()*)*)((+/.)3C<1045784/)+4<:20/123432/176-(*-.3<;.(.5;:1(&&&'),.-)&%''()(&&,5961./27997::2.1130**22357:979<;=?@BDFGGB=;<954442/236998510IuwuohiU73/3CKA3).:?C=9)HnapM2?[lknmgP4?ZW?7873--,)'%%1@=/2@?9BC95/+UJ54,(/@Fyxwyyvofdggfdefgjnollonida^^^^^^^][ZYXXXXXVTUVUTUVUSSSUVTTW\\ZYXXYYY[\[\]^_^_aca^\\[XVVXY[]]]]^bfeefghhhhhhfb`_`ba]YWWYYWVVVVUURPPPPPNLJKMKLKLMNMOPPPRSRSSTSTVVV[`cdb^[ZXXXWUSRRSSSRQQNLMNMLMLMONNMMOPSZbghaYUNKMNLKKKLMLLMLJLRRLKMMLKLMNNNQPQX\XX]YQPW_^WQPTTRTYZ[\[YVUTSWfj^YVTSRSSUVTSTVXVNVpxplga`]ZWUW[\Z_ktwwn`\bdgkljillb_qxrrpr~}ngjrrihgcZ[\[\abW_}y}~~u~z{zwxzzxxusqoooolds\_honiedba`__^`ccc`fvpmkkkjklmlljfbdr{xwokgfeccjpl}yedb^mx{xyyn^TX_ioR\nxupvuj`^d{bM[ennjjacwohw|xqghkisnT^aZY`ZUbgeccdcbb`\YV[nroy|rmmkjmmnxhXSQSrqgfkosqkg]Ys{e^abdfb^[ZYYYYYXZ[\XZXbgc`_``]ckZS_aVUV[WQi{yl`_^\Z[]]^abdfeb^^]TeʷϜV\^\\[YZZZZ\^_][\[YXXWWXYZ\^aa_^^____][ZYXXYYXYXXWVWWWX[\]ZV[dd`^][^dikiiikjlnqhab[Y^bfhiiid]Z`gjihigfhhghgggfeedglnmonmklkbekgX_d_MWQ[qn]R`zyaW\YVNJCSddVMLNLKKJHLQW^\\]^[\_\[]\YZ_abcddg^SPQRTXSE=ESSLKHGIKMOOPQTOP}RNPR[XOMPPPMKKKKKJLMMNMMPQQQNOMKJHGGGJMGASZbmh\VKDIKLJIE?=;9:<>>=?@@@@@BDDA??>>>==;:<=>@BB@?>?@????>=<=;99:<<<<<=<<<<<<;:<<>=?@@?@@BBAAAABBBA>;:9::;<GYdbZJEFIHEDC;9=BCA;;BB?@FE>416@OMCDJKLNPSTSSRQMOQ]jHCGDDA???>??=<<;::=ACCCDFFEEEEDEJOQQRX`_]__ajuuvx~~W8?==<===>>????=;:8:BHHHEFDDDEFFFDCDCCDIJJKKKIKKJJKJIIHJJJJIJJIKMLFC@C\aYPOKJLPURJB?BGJIIHLXM,,272.;DCB?>CLOLHLQIECBCEFDA?=:889BJRTOA/,+-/--09>BEII>;<<<;<<;<><+46442/---,.9IQTTRMIB;7646<@?<9864234/-031120.+++,,-/13334333335777653440/.05=B?7117=<554/.03432100//027;:74333322463.-,,**)))*,+(',7>@?BCDFEC9.*011:A@>91;NC-'%'/=DA@A?:79BD:442///0012210//.+1=511.2.,+,++*(&&).+)**25441/.--011.-003<<63+%&*1438??950)*6864:5103:9:4/291.1322694000-+.341-+++,,)')/563/7C@50/1111,+19>;2./23343104:7/,/247;71/27;7-('%&()-33*$%()**+*),4=901420036:7-*++++,-013449;9@D=>HKIIJLMKFDFA?><;923669;5//39W}wuvh\G62/-3961+#+>JE=6?r|pwowH6?UgipkhqhODSY?5?:41(%(*,8@3$)<@@?=.)$,RD41((6F>zyyzzvnebdedcdegkmmlknojdca_]]_bb_][YXXXXXVUUVUSTUSSTTUTUY\\[[ZZ[[[[]^____aaacdca_^[WTUUUWXYZZ[_abcbdhihhiiheaaaba^[YYYYXXXXYXWTRQRROMNLJMMJHHJLLMOOOPRRSRRRTUUVZ^___^[ZYXXWUSSTVWXWWTRPONLKLLMONMMOPPNR\bffee^SSQNLLKLMMLJJOTZZSLKKLMLLNNMNNMR^b_`a[TXaeda_]WOQX[\[ZXVVVTUkziVTSSRSSTUUTTUWXTUkyrmke]\\ZWY\\\dprsum^^echtrjhjj^T`vzoozo[Y^`]\\[YWZ_]Z[`fmwtvyyv~|{xvwwvutuuuvttsqppoqgd|f^irscm~qmhfhfcZX^^\acb^`t}{z~}|ysmjjnpstofbcej{zuqnmprepp~ca__lvsns~{dZiyXSUTgo^UQceYfUcde^[\`fc`]{ϹttsqreNdtXYb`Uel^]_ba`baaa_\UWlpnurlmlljjvt]VTTYfjhmnmkd\Y[_of]abejkga\YXXYZ[[[[\^U\db_]`_[cl[T^`XUUX[YPX|ê~{|ra[ZZY[\\]bddeda\[_ZYɵ̀Z\_\ZZ[[\\]]^^]\\[YXWVVVXZ]`cbb`_```_^\ZZXXXXVWVUWYZVUW[^a\Z^a__^\\_djkhejieijni\ZW\abghgggefdZUekjjjiggggfefeeefinoooonmlrh]bm]Za`KT[lr]]vr`etj]^ZTQTFH_`UMLLJJKLKLLO[]\Z\[]]\]^]\]_cdbbb[QORRRQQSIFEHLNKGHIJMOPOORQShQNSSUTPNNNNMKJJIJIKKLMMNOPPOMMLKJHHFFJLHCCQYTZjj^VNFIKLJIC=;:9:<>>??@@@@@ABBA@??>>==;9;=>@BBA@@@A@???=<<<;99;<<<========<;<>>>=?@@ABBBBBCBBCBA@=::9::99:?>7?SabNBFJGFFJA8;@BA<;>B>===<:;=?BCACFFFFEEEGJNPQRXaa__]]hvzzyyb>EA<;====>????=<;:;BIIB=BCBCDEFEDCDDDEHKKKKKJJIIIJHIIIIIIHHJKIKLLJE@CY]TPOKHLSWRHA>DGKJIJOQ>+.59714:?AC;77:;:<<<==@DDEEEFFGHJKJMRPCCCC@55CEB@??DQ^cdejmmnnjddfc]UOGGUaa\ZYWX\UJKPFGTM84545421.+*/ATUTPIB?8232//5=B>8532.+/42/.--.--,++***+.1346788413:;96531.--,/7?;50/5=EH:6<64968853355345642212344345440,+--,+)*,,,04<:948=0$$$,9><<>@=<;:?@=844411467:;852/.-16/35./.--,-..,+'$&'&')/410.-+,,.-*'(.28=511-))+.037::443))5>:/57443767527;45667995.,-,)'*141,+,--*&&,7;6348>>9/+020.,/7=<81.044234568:;<<::;;6.020262+(('&((+.-)&')/44010/6?7,052+(-240)*,,,---.12246639?sR53451,+-/0/.,3BJ??GNG^QGihmxlS:J;>??@@AA@AA@@@??>>==;::<>@BBA@@@A@???=<<<;99;<==========<<=?>>=?@BBBBBBCCBBCAA><8:9:9989;;;?BA<97@C@DHA/3C?@HOWSPQRXZXVVVYXZWc{WILHGEEEDC@>?@><<<>>???<:::?ACDDEEEEGGGIIJKNRLJF>98;BBCBAEKOSWY]__chlnkhf_WSOGFQ\^YTRSTWSKKJ:19EC73565354+(7MVOID>;<:9:730/08;5110.,/46.++,..--,***)**,2668:9635<>7531/,-,-18=5+*3HSPLA48:9@==<748>?8689977778:7101221..00/.../13;ACB?<:9:8654248967::767540-)'(.441368758:<><9544436868<><7/.253./1,++**,+++,./(%'+.--.-+*)))***(&)/6:9310-,,,,/3114677.-9B?11878833574685321/463.+)*+.045/++01+(%'.8<5/4:7121.1421259;;810031/02333222587751,021231-*)(&''((()+*+3<82344::.)-/-)(*,-,+,.-,-+)(+048630267;CGJGMNQX`c\TNPRJHF=9;;:545:<15sH*9C?3,*-./2::35EF;;>AIXM988209=1-1+'(*641744FRH4320267-omjryui`^`abcddfillmnlmlhdba__dgc`^\[[YXXYXWVTSTUUVUTSRSW[\\]]]]\[\^`bcbbbbcedfgfc^\[[YXXVTUVVVX[^cfhjkkkkmnkigggdb`\ZYYZZYZZYYYXVROPQPNNPOMMMLLLLMPQPPRQPQPMORSRPPQRPNMNNNOPPPSVUXZZZYXXXXUQOPQOPPPPQRPRZacfhkkcSMOOMMNOQUY\]beeaZTOLMNONNNMNOPX`^YX_dgijjnp`SV]a`ba]WSSTVcbRRSSSSTUUVVUUVUUUU^lwwl\TVZ\[Z\^cjnkjnfX[\Wj|lVT]]YZVR[lzx`W[WWWWWWXXXY^fdc]YW[tupruwzzz{}~|urvxyxz{ywutwxuqomkks}y\T[WSYQJYcciglf[\][_cfbauystw{whehkkkliefkl[b}~|xqriZXrq^__fnpkklpt{umtoll[QǓd_dr\LKsqchl`WUW`[OTh`XWhpdhpustVU\Y\]^XYwva]__```acfceusn|{nill|}cZZWTQaemtlog^\\\\\]^om\`_YU\gpph_\[[[[[[Z[_\WYada^YblVOSRSRRQTVWYZOQy{onmbXTX[ZZYZaeeca^\\]_]VǽbV]]\[[\\]]^^^^\\\YXXWUUUW`gebddcbcbb`]YWWWVUWZZYXTW^dccccaZY^a_]][\aike`bdaadghon^acihfhkhfcgqqjgijiihgffffffeeefjoonoommmlaIOeic\YYXTKHKRYeiaNK[_YWTRRNLKPNLKKJJKJKLGCITY\\\^^^^]^_adaXRONOQPPQPPOOPPPKNTNKJJKMPPPOORNHlqPSTORROMMNNMKKJIGHIIIKLLMLLKKJJIIIGEFIKJFFIGEIZkkbRHJKIEA><;:;<<>>?A@@AAA@@@??>>>>==;::<>@AAAA@AA@@A?>>=<<;;;==========>>>??>>>?ABBBBDBCCCBCA@>;88999::9:9@GADLCBG?79DFEDCDC>954BIBBFC;=F=8@OTSQQVad_][X\\]Zf[GKFDDEEDCAABB><<<>>>?>;::9ECDOM=7=KVPIEDDDCB?=:6/2331480(9PN?53:BGIHGEDC@=:81.//00///-++-//..+)(*,,,+044455688753420/....28;5(,@OQOJE813:CB?>74;DE<68;>@?>>>>933200./361143./7<@A>70,,/4333212795498665540/.,,.,,,.../047;==95458::968>@A?5.2641+(*))*-1.,++*--*(+/1/,)'*--,+,./,+0574000))+,/6>=94567546971.6649621138=:51--/352-,2579:60,+..*&&+15632:;3.15202667899:841/-+*+-+))'$%.52/..03685300,&%'(((*+,,*,7<82.2582('*-+()((*+,+)))('%%&*594/-../6?EKMRX\aefgaTJKMQJ62::966;C@60Qf{yuQSZXF3.+,.-.7=:7>F?6.0g_4),2,-IDEsd812/37AD=GcfgtiKAHE>JYL94424621221*(.-6INKABCFC742/-,da[bqrh][]^abccehkmmmllkhecbaadeba`][ZYXXZXWVTUWWXXXVSRUY\^]\]]]\[\^abcccbbccdfhgd`]\[\]\\\^adfijijjjlmnlloooomlifdb^[Z[[Z[\[ZZYYWUTSRQPPPOMNNNMMMNOQQPQRQPOMMORPMNOPOMLNNORUUVXXSQTVXUTRRVVRPQQQPPPPPOQTVZ^`cfhf`TQPOOOPRTSRW^__bfd\QLNNOPOOOPPOPTSPT[`dikkkg_Z[][dhb\WSUV\ZQRTTTSTVVVWWWWVVWUSZhg]XVVWWXZ^`ejmjijcVUSTjudUUXZWVbmq~m`\ZVVVWVWWXXZ[[[OYY\jrnoqvxux{}|vtvwwx{yxxxwvvtroomipcOTZ[^]pV]abejij^Z\[\_`b`\fu{~~{~~~zmeeihjlkhfkjdhrx{|{zujqtgqr__ahnnllpnp|{n^VXZfh`}{[]ieUZhcfvg[YY[e]QLLS\Y\foomrp|vYW\ZY[]][`W{iaa````bdb_unx~pjjntZ]]UPP[kfsnjvbZ]_`aclplxs__`[TSWennfb_\\[ZZZZ\[XYZ]]`]bhff`Z[^bb\ZYXXVPHjollbXUY[ZYXZ`cba_][\\_^ZaɛY[\\\[\]]^^^^^^\\[YXXVUUTYdhdcddccddca_\ZZZZYYZZYXVRU_edcb^WYaa]]\[\eli]\aa`cgmu~s_acijimmfddfimomkkjhhggffeffffefinnmnnmmlm`AKtue]TYZNJHJLOPPTOJOWUTSRSPLKJKJIIJJJJJKGADKSZ]]]]]^^^_`b^ROPOOOPPOPPOPPPNMOPSMKKKMPQPONQSJQmSXQLOPOMMMMMKJHHGHHHJKLLKKLJJJJIGGGEFGIIFFHJGFShodTJIMJFA><;:;=>?>?A@AAAA@A@??>===<<;::<>?@AAA@AA@@A??>=<<;;<<=========>@@@@>>>?ACCDDEDDDCBCA?>;8889899::6:MRTRQ[hkefc_^^_[eaEIECCEEEDCCED@><<>>@AAEHIGHHGEFKPVVTYfruqmjgmwz|{tNDG@==<==>>>=>>;::;LYTJEEEDB@>;8)0325=;57:989749BC<<BCCDC@DV]UQQV[Z\itxhPSYTOMHGPWZXTQOLIGDD>533533./00/142/:G@.,3;FJMMKKKLLKB8/+-221/,),.//./..+*)*,-/.2553313664/24310//./39=8,1HQPOHB92-7EE6337>D@879=?BBAAA?=9851/+1<;6:=4.28<=;:80%#*/3443335654543312661./,*.,)())2==>=<<:769=>?=:>A@CD=3.12/*),+++-110/....//.,./2-)/670,.57402442,-2/..5@EEA<731/.-+)(('16-,-*&&+4:::6/-049503<=9=@7340-+(&(,13325==67=>5.27867897620-+*&)+--*')1531008;5483011-((('((*++)'-67450042+(*.0+(('(*,+('''()))*-231.---.27>INNWifegjcR?6=TW=3>;89;@A720.-cv;45GioZ:--++++,/9;:51;D2&QqS3,-*+-+.+,63*++,0650+;]deoaIHORQIHTI/.14;500230015;HRTT[Y\U@5/+'.^][\aeb[WY\`bcfhhkmljjkjhgfdcccbaa`][ZZYYYXWUTVXXYYYWSSW\^^]]]]]]]\\[[]_bbddccdeffda_]^__`abdehkkkkjijmnmlmoqrpnkhedb_\\]]]]]\\\YXXWVRPPNLMMOOOOOOOPQQPQQQQONMNOPPQQONOPPQSWYZ]\YSNMNPQQOOQSRQRRQPPONNMNRQQTY`ghgf`[SQQPPRRQOOTV[agge\SNLNPQQQQPNMNPOOPSZbiklmliecX[aa``\YVWUPRUUTSUVWVXYXWXWXURQSUUUWYZVU[`acfkiij`VSSZij`]]ZZVSk}h\VVVVVVWXXVRQPS^[]fnqrsuxxz|{wuvvtwzyzxusppppoqnkw~}XPTWZZX[Wbfcc_hii]ZZ[]__debllr}~{}|yvgchijlljhjjovvsqpmliiryxze`^cilmlmqmmmnpsf\NQUS_fljnT[Ÿ́c[Wl]\_ndX[VTWXSVWUSadwkYlnaZ]\]^^ZtUh}{kgda_`abb_fxysmhvl_`^TMT[vnfne_^dfmtxvvplutc`b\WTR\hmkfb_\[YZZZZZZXUT[b`awwnw{j`]YXXTWTtujlcWTXZYXXZ]``_^]\[\\]\Vp~T[\[\\\^___^^^]\ZZYWWVUUUZehdceecceedca_^^]^][ZYWXVPOWcecb\W[]\[[ZZ_gmdW[bdfilut]_ahmstofcbdeimnmlkihhgffefgfffgjmmmnnmmllgMSwseXIWZJIIKRRPPPQOLPPOORTRMKKKJIIJJJJJJFDGGKV]_]]]]]]^^[VSQQOOOOPOOOOOPQRRQRYOKKKNPQQONQRPEioYYMKONMLMNMKKJHHFHHIJKJKKKJJJJIHFGFEFFGGGFFGGFQhofWKIMJEA<;;;;=@A@AAAABBBAA@?>>===<<;:;=>?@AABAAAA@@??>>=<<;<<<<=======>@@@@@>>?BDDEEFFFEDCCA?=:788887789BHG>=FCA?>@CJ?GJE@>>>CMQJFGGEEC<554DTVQQbrqoqmdbba^chFIFDDFFFDCEFEB?=>>>?ABGIHFHJIGFIOVWU\kwzxvwtw~qGEE?=======<;=?:9;<>DFGHGFB@AABCCDCCBCDDJUWRPOLLLLOSSQPOPPNLLKJNNMQWSHTb^^WSNMVTEKSJLKIIIEC@4+.43457988?DFHA;@@O\TJGEEEA>;979>?I^kthH>:2145478569899@E56A=:7@GGDBCCDFFGGHHGHJHD=16CDCCDEDADU_VQRWWNYktxeOW[WQMHKU]]YVUONMHC?:654320.-./..143;C5(08;BLONMLD=<@A:1*.550-+*,24200//,**+,.346963324553/0542001004:?:/3FPQOH:3868FG1'/9CA638:>@DECDCB@><73.'2C<:F=--476348:4-,1146555433651120./8<3,/0,0/(&&+@@>@A;3475:A>3+(**)*.-)(*/3788888870*+031.48:2-.:?855322.+4?:17GIE?841.+)''()*-,33/-+)(-454430-*/379;=;8<@:7::3+&&*.110139??BGHA89985487630.+*('(.30*-564102:DB4042.12010*&'()))((-10011130-0386-))((*/101.+*,-0441///.,+177@4981631+')('**$'-,,04741+,IahcOEILR[TNINH0,=A4+-2=D@::?ERS]d`Z\@0,0-0\\^\XZ\XVY]acfikjkkjiiiihgfcbbba__^\[ZYYWVWVTSUWYYYYXXZ\]^^]][\]\[YWWXZ_bcddeeddfijfc`__`ba``acfffffgijkjiiknonmmjfefea]^___^\\][ZYXVTSSSQNOOOPONNPOOOQQQQPPOOOOPSTRPPQQPPSWXXY[ZYWPLNPPONPRPQQQQPPPPPPPQPNORXaeegga]WSRQSSQPMLRW]bhjf`YPJMRRTWPMMMNNNNMPW]ahmnopiidbbcec]WUURTWVUTUWWXY[ZXXXYVRRRTUUWZZXY[^_adhhijbVSZdhe``_Z[YRkw_UVVVVUVWVURKOY^[]ckosvvwwww||wtwxv{~~kchjjknqprj`nvfUTUWVWXW[ddcbcgfne[Z[\^_cdjrl}{|{v|mcghjlmlkjjpwywvricdhpqoprf```ejmpoonmjjlpojZWba[_fjq{dZ`WpˢdoϖN^\ZldVTTTTRTTTTU\g}\`txqf\^`]\`VRdhW[ir}zlfa```aa`big|skl{}hfdYOOW^grwhdswensy~~pikiinf_a]WWWX\dghed_\ZZZZZYZZTSXab`|ujtujegjqvngaW}glgXRWYXWVXY]_____]]\\[]SnS\[Z\\]]^__^^]\[[YXWVVVTVZbecdedbdefdb`_^^^^]\ZXVXYRLUbfc_ZYZZXY[[Zajh^W[clqqsy|b\agorythcabcgknnmkihhhgfffgggfhknmmmmmlmdl^Tje_QD[[HGILRVUSQPOMMMLMOTTOLKKIIIIJJKLIGEHHGT]`\\\\\\^]UTSQQPONOPONNNORVYXX[^TKIKNPQQPPOQQI[|pcSJJONMLMNMKJJHHFHHIKKJKKKJJJJIFFGFEFFFGGFEGIEK_lgZMHLKF@=<:;;=BBABAABBBBAA@?>>===<<;:;=>?@ABBCBBA@??@?>=<<<;<<<<<<===>??@A>>=>@BDEFFFGFFDCCA?;968887678>HG>67;CB>>=@BGHFCFIIJGFMYZXas|uzaDGF?===>>>=;<>=;:;=@GJJJHFDBAAABCCBCBCDCFTZVQMKLLKPUURRRRROMMLHONMZp_LQkomeQQOVLBMOKMLLG?BDE@08:6434:9;>BC>;<=ET]TJHHFDA=979?85LYfsj`_=467665689;89;;A<78<60;EDCBBBCEFFGHHGFKD<>=BIGEDDDDBGV\WUXZJ3FbrrYIY]XSNIO]c`[XWSPOLDA9565430------/36;14BJPOF6.GJC:?C4-.+*,493,(''&*00.,)-6;=@@>?@:1+*/2223431--;B9454231,4<52>JJC;520,*(&'(,1316<;:7558843321/)(,5=?;55<>=<=84+&'+.10/1258;?HJIEB=9777740,++***,162.48642224;A3.10/24463)((()*)((,,**+/31/4:=>:0+)((,7@A??6,,.144/-...--177<=4FUXadiiV@<3+6QaF122343-(.1107DB8011('&('*)&'((*)+.34,%,9;0)17830,+-.07?<2+272563-'8WWIDDIGKX^V?<;<=>BBABAABBBBAA@?>>=<<<;;;<>??@BBBCBBA@??@?=<<;<;<==<=<<<<>?@B@=>>?@ACEFGGHGFDDDA>;:7778889;DGCD?==BC>?ABBA@CEDDEBCEHGHMRNBC?637>IUNVxyqlfb]irDGEDDDDDDCDEFD@?>>>=>@GHFADGHIFDMZ\[ct~y~KAHC@?>>???>;=?<;;:=CIMJLLKGECCABCCCCDBCBCKUUQLJJJINRSPPRRRPOMLHIMLTpiQJovqpZQVXHISJKNMI;/8ADCC99:;DU]SJIIIE@:67=@78RPOhuxnG689888989:89::9:9685-5@BDCBBDEFFGIIHHG63@@@GGEDCCBAHW\ZVVS<'+IpfGGX]ZTMJP^dba_[XUQNC;766653/,,,,--.27<=59:69INNNLIC6-+,/39BB;531..3631//.,,--+,/27610./0231/.242344258:;956;?LM@2+>SLLN:,/7:4/3738C3+/32-*,/4446531021224310///.++48976673*1<01MSG@>?;9>?83:A:760,('-10/3/%(3687.*179?EEDD;1+)+.131,*--/;?5042001.11+5HNJC7221-+)(((((),06=C@658998852.+**/7:515:<=>;:2)&(+.122121,/:1-+)+7DHFEE9,-00/20,,.031167=21PO:Jai`LGB898@VL644685,+0/...)'.-*20+'&'.0('&)+)&4GJA5''0-(19:1.01341=UZC.55,183,)+479AILA<;<=>ABBBBCBBBBAB@??>=<<<;;<=?@@@CCCCCCB@@????=<<<======;<;<>?@A@=>@@@ACEFHHIIFEEEB>;:77779:=BGLHGFDCADEB><<;<>??AFEFHHHJOPOEDN=39AEJITwpgd]irCDEDDCCDDFBAED>=>>>=>ADFDADEDEEGJV`aeuG@A???@????><GMMJLONIGEDCCCCCDDDBBBDHLNKJHGGKPQPPRSRPPMKHFLLLcl[Hn{sr_SYXGNQFJMH;(+:8?GV]SKKKKG?957@=4?QJ:Qlj_H:;:99999989;;;<;8663-1=DDCDBDEFFGIGGF>02659FDDDCCBCIT[ZYSE1*%4c\>=>50AQPMNLHC93/./05:58C?5212210//.,-10+*,053+-0212201/./..23149:864963CK8.)1KSQN;./122456;>?@BILNOMLF8578;915;.+02/,*)-0468741///0131------,+1699;753,9J=8II<17@5,+,*.699<=:73*'+-0<=.)4:=;/)1439CIHA80+('*0731///1;=.(-1/./,++-;NRKC:762.+*))(('*+),5>;1../243/*'*-.,/4513:><::90(&),.13763//8?GHE@:9:<<71,)*++,04217;7791.99+%%++*+.268:71,*))+-2.'&'+3;958>?;73.+-/-/=GECCA4-/44340**07856775-=Q>*3FVMBF<4::;@D=727E<+/0.,+,++,+')3<7*$.8.)(*.02>NOQK5'')/6;:3+*,.012=<<:<>>@@AACCCCCCBB@A???<<<===>>><;<=>>>??>?@BBBBCEHJJJIGFGFB?<;8789:<@FHLIHFFDCCEB@::<>=<=CBDDSzslg_huDDFEDDEFDFECEG?=>?>>?ABDDAABACFGFQchiuPDC==ABBAAA?=<<<<;7?MQMLMPNJFDCCCCCDDDDDDDA?CIKKIGGINQUVVSQPPMPX[JMK[ieDf|vs^SUTFRKCJHJMB:AGFGFFC<877789628>=<=DS]TMMLKG>64>E84JRJ>@NTRC><;:;;;;:89:;;:;<;72-.5AFDDBDEFFGGGEA743+-9EDDCCCBCLUYXZR9,,))I\>IU`]TJINW_ceeea\YUOGEDB@?80,,-----5?BB@>2.@OOLLLHA74576565.5DGC?;5210/.,)+9@8/-032-.6;=:864432//22/3782-,0/+7?30/,9JOJ8-/11489987;CDEHNNMMA4787522570.02.+*+.158<<74100000-,---,.133347::520;KH=>;92:>-&())-340389;<80)')4@;019<8.*//-18DJ=.++(&*-7888887:9.+.23,-*)(+:MRIB>>940,))(((+1.$&+--+****+,+*),0.-/560.8<55682(#(/0.09;6/-6>CED=8:=;5/+*-0-*')+/67306=5-6:.('('',1246:;4-+)(*,3/))).68405;90*(%&,//.291.3EB-++/>A@;/0:>=:65408L@03*++***+**'#)8=5+1;92-)2>22FRY^WI<9ZiCZR')YXXYZY[^bfjklkkmmmljijihhgggdbbaa`[ZZXWWXWWY\^_bddcbccccdec__```^\^_addfhhgfeeffffgffeeedbabbbdfghhhjjjkkjjjjjlllmnnmjebbceedcccbbbcfgedgijnqgVNOQPNMNQQPOPQRRQQTTSTUVX[]aecbglj^KMWZ`ggda[UQONMMLLNQTUSQONMMQQSQOMMQ\efdgha\ZZZZWTQOQSU]fhgfb\VPKJKPVVQNNNPQQS[^ZPRUTW\\YY[cecaa_]\\^_[Y_ca_aa[XZYVUUUVXWVZ]Z[bfgd\Wgusg[\_``^][ZXR[pydUXXYY[BpJLicVU[m|rgbinmptw}~efrts|t_ZXYYYWTRQVbf\MX]QONNOT[dd_XXn~~|wokkjzyijhhijkid_^`bbaaaaabcbdgg`_ddkv}zuwgYadjw^NReXMNUZYbZaj]POPSTRSUVXUXyx{afmjohkysXINQMSfytc]^`c_errvsnogXRSW]bbbaba[~{rsnpwcdep}}h`jrrrpwtWWVWZfnia]]\]]\YTTX\he_^ZVUVTRX`pwmceow|tk~lfYY[[[ZXZ[[[[[ZZZZYYZ^Xu߳\Wd`[^^\]]]\\[YXXWXWVVVVVWXZ[\`ijeac`^[[ZXXXXWVVUX^``\ZVTWWWXWWWXX^f_Y\]^dtxw}vebjtq_bcbbbacdknmnmmifffeggefjoppomkmmmfcjlsvXZULKMRSW^YSPLKKLMNOPQOMJIILPTSRPRPQRSQO`c`bc_\\]`TBDLNURORURRRQPOQVYZZY[]XNMPPLMNNNLOON_|ZDHLLJJJLNOLKJIHHJKJJJIIIJIIIIHFFFEEDEDFEGGGFDCEELPMGGIE?=<=>>?BCBCBCCCCCCCA@@@>=<;<>>?@BBCBBCCBBCBAA@@>==>===>>><==>>>>>==?BDEEEDFJLLIIIIIFC?<;899:?<<=FGDKFEGJJKKQCR_OHBBFDR|vqkbiMCGGECEFCDQRFK><@A@@?@ACE@=?ACEEAMclluŬTCIB@CCCCAA?==<;<<<@KONLMNNMIFDBBABDEEDEEDA>@GNPOKIKOQWYURPPPLL^yUGMVfoJSwwt[ERPLUIHIADerjW=?IHGD?>>>???>53:=?=:EYXNMNNF<78CG1-HRFFKJLOGC=;;:<<;;::;:::9;=:3,,3AICECDFFFFFFDD;2/19@FDDDCCBENWYWTI3#&)'.FBBO]]SIHLU\_``abb^RQa][XUQD9212227?DDEDCA7-8JNLKJF@:9:;98511=HKLKF<11220.,-;KI<5565326:AA?;6595100/-155-''(*)/513612>JF2*0767;99935BA8BMPNK>/24/++0588530-*/30/49:732231//,*-21,+09<6,)-18622@><931204==97,)8KPH@?>;620/.-,,-20*)*)*../0011235760-0661054036:8/%'171,/65222208A><==5-++,020,('.78/)+2<;2120.,**+02246;:1+)(()+0.--+/672,,0/+(('(-01/+3@A@>>@C=982,/799=@>8129<0***5?BC<12?IGA8.487@FKB-2.'(('(()*),388989:3.2:CFC=AHE82AOMIJJA1''*.35;>8169?1')&16/0,&),&.HQDCA;;3->?ACBCCCCCCCCCA@@@>=<;<>@ABBBCCCDDCCCAAAB@>???>=?>>>>>?>>??><=@DGHGFFHLNLGHJJJHE><:8:;:=CFHHIIIGFFEEBABEFC@???JJFHGIJKMNJIEMNCGA?QKRxrnehZCIEEEFGEI[ZHMM=?BA@?@@AD?=?ACEC?Jbpnv²WAMKEDDDDCA>===;<<=@CILKHDBDFFDBAACDEEFFEDC??FNSTOLLOQSSRPOONNPMxmLKTghHHhwyX@QPSPIKF:ERSc\8:JFFC=>?>?>AB718:==6:NVOMNNF:9/,>IEEQUMHIF@><<<<;;:;;;;;::;?=3.3?KNLKHDA<965552/9LSPMJB8-+4;98759ELD<9889878=?=;77;832213597/'(*+-/124634=FA.'2=<=B97923<:2;IQOE5+..*''+07=971,,49507<6..1451.-+),10,/5;<0%&(.5534:3,1DJ:0,240//02/*,146;:8;@DE?:74113/*)'$-<9+'))'$&17/3=BA>60/111CH:;1.9JNG@><9435642110122,.46886555547:<80-144553/-26:=;2*/?A3'.8:72,'+9>;:80(*-,,-.,).76-'').7:1+,...//0223553/,,+('*-/02117970++,------0232258;@CGGDA>3-079;<@A?<=><71/17>D;3379858>FG@AF;**,&46(-1-,+)'.DSH8=<74=Taitf<)175'6j{jXXYZ\^afiklkjkmmlkjihhgfgggghihfeda`^\[[[ZZ\]_bccdcegiihgghfc_\ZXWVY_cehiihgeeddfggghhgfghdaabbdddefikklmmlklkklkkjjjjigebcdcbbcbcccbcfiiggddjqk^WVSPONMPSRRSTUVWXZ[[ZY[_a^`fjmpppm\OPUUWXZ]\UQOMLKMQRSRSSRONQQQRRSQOOOMLLKKLOOOPQRRQQPONOPRW^bgnpmeXR]`SMQRRQPR_qkWTWRWgqka[^gookfefeceicZ]``bedaedXSTUUWYXY^dhiga__cljggecba``_][`]]hw|`UYZZSuvRbjlsm`XSXjuspijnrwzwwz}ortuqhgimpqukTY_XQMLPPNfwQMR_iZOTVTOVUMVgemcxhggggfcegeefhjkmf[Z\\\`bdcddehja\ZXfw{z{|oP]dilxܥnUS\benp|cctxl_\\[YWSRRKk`d}qa_^`eme[RMI[z}sdUF?IRVY\]_Spxy{te[[^_bbfdbba`gqwusl{eb`\dzbhvxurs\UYXVX[cdc_[ZX[ZUVYX_fbbaYWYY[^[biifc]U[^^Xh}te\^\ZZY[[[]^^]\ZYXXXY[OZ]a^[ZZ[[Z[\\[Z[ZYWUUVXYZZYZ[[\_fhfd_ZXWWWWXXXXYYYZ[Ycp]PSUWVVVWW^d_XXZ[WWdjls~vedku~yh`bcbaaaa`clpnnljhfgiklmnnonrnmoor`Uqmjus{rid\]`]VHGILMKKPRTVVTTUWWWTNLJKORRSRTUVP\dcjeSU\`e[JDHLSp~qWWUSUQNQVYZZZ[^\TOMLMMLLLLMNMQSHJIMLKIILMNLKKIIHJKJJJJKKKJJHGGFFFFEEFDEGHIGFEDEFIGHFFFD@<;=>>@CDDCCCCCCDDCBAA@><<;=?ABBBCCCCDDCDDBABB@????>>@@>@???>???=<>@DHHGFHJNNJGHJJJID?<;9;;::@FJJJHHHGGEEB@BEKIGGFGJHGEHKKKLLLJJID;<:;WQR~upjlbFIFDDHJEIdcPE\C=A@AAA@@B@?@CEDCAHbsrxWCLKFDDDDEB=<=<<<<@CBDIIC=9;=@ABACDDDFGFEDCBACJRTPKKNONNONNMKOQBSl[ISaWFJXkkODLOVLHH?37>=JK7;FAD>57889C=ANLGJGCB@>=<;<;<;;;;::;?@94267?EEEFFFGGHB5045794=CDDCCCDNWXXYZ]X8+**1?A=KXTLKLSZ\ZXUTTNYyrvwxpaI<725>FGA;9:ALOJGKNMKJFDA:4/./00.9Q\TH?82,*7DD>;:78>?;9;;<<==?B<788999988:8852..2530113456=D?1*5ABCC77;439519HPI;/-//.+*.02;<:50-4<977:4-14862.,+))-037:70+,.03760,4<764..=:9851./4:70-113772-.258;<7+,@B@@EE@<727?<77:?NODSYZV:29=6AU[OE:,../0B\Q,)43,192.2/,01-35,,421DPPUZXXN7&$+=IB;=CDHC78DGGGB8670*65),4=8,)'&.DO;17;27Yijwl=&))174@CDDDCCCDDDDDBAA@><;=?@BBBCCDDDDDDDDDCB@@???@>@@@@A?@@@A??>>?BEHHHHJMPMIIJLLJHD?<;;<;<=CHKLHFFEIEDCAAACGJJJKJKKJHIJKKKKLLKJGB969ILNzuzbJJHFDHLAOom\HaK:AACAA@BBBABEEEDAEauu}EKJIFCEEEFC?===<;=@DCCGIBBGB=?@ACBCDEFHGEEDBBBENQOJKJKLLMOPLJMN@CgbJNMLLKLUSFFCQXJGC;77<;>?@=<==<<<;:30/1041.133:;<9645=?7.00.27981+),)(,48972+-376762,&*56450.3:956774/++-./*+;F=45:?BDEA??;95/*()+/363-+*,8801234@C5*+--05203550/;HF@<93..0..044+((-(+57;=<;<8.*)07620223651+*02230/)',1/0:?9/--,+,,**,02/+'())('''%&'&&&',///0///0/.151*).21000245548:7871..//.//.../--/2562--6@H\oZ..:5/4:9.&&(275;8,&$'6HR[[ZWYR8&&'0@FCFGGLJ;7CHID53A@8470&)1@=,(03--AI3,64?_fgvqH)),0:D:Ib\\\]_cfhijklmlmonjihhgefffffgfffeeec`^^``aacdeedefgiijjiggecba_^[YYVVZ^aa``bccdeeffefhe\SXdjedeaabcdghiihhiijkjjklkjihfedddc`^__`accca_acbcgijlmnnlf`]\ZUQQSRSUTSTRQSSRSUZ\_homig\Zq|kVLKMMMNQQRROMLKKMNOPPPQRQQQRSSRRRPNMNNNOOPPRTSRSUWURRQOORW^eeadgilaWTQPWWNN]qoimfahrpihhijkmnlljlk^SY[]\Y_edaem^QOSUUVZbiknmc[bi^\filjaapycZen~bXVaWY`ejlpkjikllj]Zmupprrqmz|{wwy}xliiiifjoquy{kpm\^ZQOSPI]pTRONsxouhYTUdd_bv}tphhonldmsdhlv~~xqhdbdgjkjpl\Y\]_aeijkloehSu{lfnlmdIPQW^_^}sjc_^ceWct۝_ac[SQYdhaYSQNV~aSZ`hppmvnYIYg\]bbcZPYqy`TRNQSO~xwr|vcX[`bba`abbdebexwuviisk^^_]Y_~ecoqnpqo}uXWYXWW_cca^[ZXYYX[[\bbf\\aa^\\_cccefbdegjhlh{lomf_[Y[]_`aaabaa]YX[WX}qWZZYXYYZZZZ[[[ZYYXWUUVYZ[[ZYYZ[ZZ]aa]XVVVXZZ\^^\XYWTeu_VYXWVVWXVY[[\YZYUUVZnyvdfk|v`]``___^_``ajrqonmkhhikllllounT[osgSSRHGJOW^ea[dq~~^Y^\_a_^^_`ab_]\\_d]PLQTVVTXXUN]g`XMJJGO^[KEHJPT_vyaWTUTQOQ[Z[[YY[WNLMMLLKKLLLLLLIEGKJIIILNNMLKJJIJKJJJIJJJJJHHHGFGGFFFEDFJIGFEEEGIJGGGFD@===>@ACDDDCDDDDDDDBAA@><;=@ABBCCDDDDDDDDDEDB@@?@@@?@@@AAA@BBAA??@ADFHIIJKOQMIKMPNJIF?;<;<<==;:=@DDDEGEFLG?>BDEBCEFHHHIDCBA@>FRNJMKHKKLOPLJLI>IifQKI>FHGIGDFDSXIFB<9:<:AC@<:;:868BA;=CGHFB;:BFGIJD>6/2721134318GMJEB@0,;BB?<==<<<;:;??=<<<42CIFFFGHGA;52210//423-++++/7@EDCBA?4//12453555310358:>;20125:<<=<426972,,6A<10117HH7/011034034579;<;>?@@5,*,,13662/--/1015521322149840,(08640.367899951-.01.+2ENA1158;@C@=@@<3+)+,.0221.-,,4:222259<70..-.00//131/5CHA;62,))..131,,-1**546<><<8/,/37751254113.,,,++)*)*+.02;:/**++,,*((+141*'-1/-*'%'))**,./1./00.,././10-.32-0341/-+.578762///001/./2324655:;>KTN4%1:99<=AACEB>BGG=0.4@JB31BWaU>/@I<>?@@7%'-()(1CMUUF45857738<1$)8><8.()+*2@L^_\[ZXD+&(,E>=]^`bdgikkkkkklmpojiihgededdeeeedddcba^_``a`adeefhhghjkkhghgeeecba^YWXY[^_^^^^`ceedeeefigZSZeedecabbaaabeiiiijkjjlmnmljhfedcdb`abbbbdcca_``adfhjmpsurmhfcYRQSSSTSSRRTUTRSTXYYdmheb_hqprrfZPJLOQSUVVVTPMMLMOPSUTRQQRTUTTTQMLMMOOPPQTWYVRQTWVUTRQQRV\^ZUV]`\Y_]UWVPOVggdopljrrifhjkllkjkhipiVX_]\Z[befektcQRVTT^jqnmlfZQPW[^mwlaeurb\drw]a]Td|ceinqjghgihhfaftuqomkc`|zwvw~tdfjiggkqxv_\o|]XVQPOL݃QQQPd}wbROSZeecbehjmidjopnliqvqighm{~{xylb_dgkkkneZX[[[`gijjjka|Q|kVXSPNT|GRRRMbaa`\_`XLYlwӍQ^ebZPSX^\VSRK[x[QSLGX|zkfbaaqnji[dkfj_SKLMRWmxylwmbW\bbba``chhfldgouuifkf_`aaaSoq`cgijjghk[QXZT\wsfa\ZYWXWX[]d_anbUXadc__aa`^ciknsx~{|jefb][YYZ\^__`aaca][[[[TY\ZZYXYYYYY[[Z[ZXXVVUTVX[_^]\ZYZYZ\_`\XVTVYY[[]^[WYTUsiVWXWVVVVWXZZZ[Y^]TTVTmzudgv|i]^```aa_`aabgpsqnlkjiijklllnpo^_pskXOSMIHGIS__V[jztaa_cca`^]]]^^^__]\]_`_WOQW[YSUQKNbi[YRKICLR_LEHLPQfufXRRSTQQSWY[[ZYXRNMLMLLKKKLKJKKIEHJJIIIKMMMLLJJHJJJJIIIJJIIHHHGGGGFFFECFIHGFDEGIJJIGGGD@>>?@ABCEEEEDDDEEEEDBB@><=?AAACCDEEEEFEEFFECA@?@@@??@AAAAABBAAAA@BEGHIJJJMPQMILOROLIFB@>:;<=CKHJLHGFDKGEDB@>AMQMLJIIIGGHJKKJKKLKKKLM<997Fg}b@EGKZxzpyvp\C??BBBBCCBABFHGE>HeyɁCKOJIF@>AGJJE><=;;>CEEFFFFFFG?;>EFDEEFD>;EEECA?:>NNLMLGIJMPPMJJE?DRM>>F5=ILKHFEJZZFHKG6/7;AD@=>?>=<<<97:ABEHGDGKD<:=>CHEB=52DMJDA9+,>D@?>>>===;:;>?==<;20:FFFFGIF=85332453:BCCCCBENWWODDFCDB;/)7A>FYYSMPVZ]^\ZUSI:Gf|G,-,.4658?EGHKG<35;>DJIECB>631//.0/-;A800//.0695330*+,+.47:BDGFEC80.0133555652369999711247::962+*,.-.-/9A:/,-17DB40120.27434215<=?FIG?;4/)(+/2333/,5:514511541.-7>=891+4652/047999972/476108DH?0/367;======90+-21220//-,,,..../01342.++*+./..122/7B>722+&)1100/,/36-)3348>>=966789:74683-+03/,+++,-,-/24454,(&(+/.+**-120**4<82-)),-/135664/.-,,+*.1.+-/032/2660+'&,138?@7//0013555788985312CSSQ;&(.5<=@B?EPLDFLMD3+/=II=/3FQHDBHQSN?463*)*(('&/8:722579>>30:@1(4867/(0;4*.KW^\RKGHHEHJEB838765311582*-=P_\IBIHBDJC86P|sB373/2@A8cdgjllkjkkkjjlmmmkiihfededcddffedccca__``__adeegjigikkjiijhgggfeec]Z[Z[\^^^^]\`ddcefegkomaZ\adedcbaa^\]`dghhiihilmnnmkhfedddc`abbbbdeedcb``__clqpqruukbZTQQQRRSSSSSUSSRTVXWU\egfacqndlupmiXONMNQTVYXWSPOLMPRUVTRRRSUVTUUQNNMNOOOQSW\[WPORUXZYWVUUVZ[XVUTPS`e[XXUTX\]Y_iqpnpkffillka]ekklrpe_YV[_aaee]go^QTTS`nronlg[ORZYXpnfieba^Y\_\W^gbdz|olnlhffffedejswspoonmlr{wuw}xgjhb`]apylVix|ZQRPMVuELMUwi`POWZan}vqrlbdjpvspkhdbelko|xs``dfmjlhZYZYYZ]bghgff_ޚTu|iMMIomKXVO^Ņ]_]\[WSzwtېOV`cd^XWZWRRVT_iOHJZmu]bojeo\Ɨsjotyq_LIEVepyn^\cddcbbdrtkzpd~qtpheb``abcb][}l\_ggggef^RVZS]uic]ZXXWVV[^g\zcVZad_Z]^_gnqu{}o]]\Z[ZVVX[\^^____^^\]\[ZY[[ZXXXXYYYZZYYWUVVUTVY]`a^\[YYXY[\^[WUTUUVXXZ[XWWQ_p_TVXUUUVWXYZ[\]_c`WTUR\hswefsbba```aa``aaacpxvpnljijkkkorpmtmemrn_TNJJHDGRZXUWY^`[Z_dda__^^]]]\]^]\]`aa\SPU[[ZVOGMfbUXWMGHFH_OGGMPWffWIEJSSPSSTYZ[Z[WOMMLLKKJIKKJJIIHGHKJIIIKMMMLLKIHIHIIIIIJJIIHHHHGGGFFFEDFHHGFEEGIJJJIHGC@>>@AABCEEEEDDDEEEEDBB@>;=?AABCCDEFFGGGFFFECA@?@@AA?AAABABBBAAAACEGIIJIKLQQPLKNRTQMHEDHB<;=?DHHIMIHFDKHGECB@FSQLGIJIIIIJKKKJJJLKKLKL@6@@@\uZ@FOgu_ef[UEA>@AABCBB@AFGFB>QrʐBCPMJIE<6:FMMF=<>=?CFFFGFFGHGHF?8>CEFFE=/,:GFDA>;:AKQLGIHJORRQIC>9775/5D???>>>=;<>>==;;611?FFEGIG<444444324BEGJJH<58?GKGB@@;54432111487432222456553.+-.-19::?GLMLKD>988402332226>?;=>844468884.*&'*./321;A80-.16@>6221/-024530015;DLNI<5462,,0452-,3;92-/453135423<<6<>1/4532..699885018<8238::81/3668;;;;9;:2+053210/.-++*))*+,++***)'&(+/1113664389301.,+/31.-,134.(24//4:?<::::::9642-(%'...---.-*+386430(&#$,30)+33110+,9B<0*),.047999;:62///////.+-005765542/))-.3?LL?421225899889851113HTPVB/404@BDCAS_WONPLCNQPXO>6/**+*))(&(+/=@88AILKHB=B@0-148728A;-+03DP@F[]F(->HQV[ZTMGFIEDB:=@6/12024894/16:EU^YNKPE9<=<8Cde?28557;85hikmmmlkkkjjjkmlkkjjhfeeedcdeeeedccba__````bdddfikkklkkjkkihihggeec_^][Z[[Z]][\^_acegikmqph``bdddb`_][\\_cefghhiklllkihhfefeb`abbbccddedbaa_^bjkgcafh`VRPPPQPQRQRSSRQQRTVWYYY]cffhkfekkjrxuj`WNLMRUWXWUSQNMNQTTTUUUUSSUVUSQONOPPQQRW]]VONPU[\]\[ZXWWY[\\VQV^^]]YXZ\^XV\jrrrokffikkgfheilghvzgTTV_fd_X\`cZY^[bmqsrmdXSY\WUstmneb`^ZVXZWYkxyz~{toljgfecdcccam|wtuvux~tn~vxzylywtsws^TSZlsgn}ztrmu|iXQSSTa@RMPfSy\Ykrtdejrzvsplhdelji{w{t`dfhmeam`VYY[\__`_``b^vҶWms{tXSE\NVSEz^[YWTPVƖwޕTP^\\cd_\VRSRGe_[qİxefjin|bˣyobgpxmURW[ksi_`cdddedqrry~wsojfda``a__akjuc[fjijjieZUZUWtedb]ZYYXWZ]`_vwZRW]][\afmuyna`\Z[XWYYZ[[\]^^^^_^_^]\YXXWWXXXYYXXYYWUTVUTVVY[]][ZYXXWWYY[[XUTSSTUVXXXXUVlgYVWVTUVVWXYZ[]]a_]ZUTSQR[qyednbeca`_```_aab`lz{wqlijjlnhuypqh^^lre\RHIIIOUSNS[\]^dcaaa`_^^_^\\]^_`]^\WUURQRX\^\[TY]RQUULEFGGPTIHMOSWTMIIT[YTUSUXZZZZUNMLLMLKJIKKJJJIIGIKKJIIKLLLKKKIHGHIIIIIIHIIHHHHGGGGFFEDFHHGFFGIIIJJIHGD@>>@AABCEEEEDDDEFEEDBB@?=>?AABCCDFGHIIJIHHFCBAAAAAAAAABBCCBBBAACDHJKKJKMPQNMLOTVTQMIFFIF><=?DFHJJGHEBIJHFEEHRZPKAAEGGHIIKLKKJKKKKKKKD6FH?@AAAA@@@DEC@=MwF;NOKIHD@<;EOOF<>>>@@>>BBB><71=LH;733?MORWQ<5BONGFD@@?>>;9;=>??>>=;<>>===;93+6DEFGHD<87677654--9BEECDMWUGEIA;FJKC94>FN`^QMS\`beb_\P=/+=ry<(0,+.113;@BDFGHFC;9?ED@<;<;666654688886534458<<971,,-//046;CGILLNNLKJG>31430.27?A=?@<9866532/+)').36621>A723014=<972262+,16600.-2BJJC71/1445?GB8-.681*''1<;778853465:?:137685/499861,1>A923430124689:::97684-+1531/.-+,,+**)+-.+))('(&&)-154359;98:9301231142---,+/-)02+&)1;<866668:71,))('+-./...,(-;=3160'&$%*63&*770//*,;B8,''+05::;<74553231-+044369876542.-,7CKNKD>;8535775577753245GQMV@:QE8=DHJN`cZYVPB-',/8GNF<428AFMLIPF:?8+##')))*+(*?J>=??@ACDDEGHIJKKJIHFCBA@AAAAAABBBCBBBBAACFJLKLLMNOOJIMUWWTPMHFHHFB>=>CGGGKSLAAJKHEEGLUXPH@;A@@CEHJLJIIKKKKKLKF?FE=O{NDOXpq[BCI>9;@?@AAAA@@?@DBA?;IwŻt=;HONJFEDCAAGOND<=CGGHGGGFFFFHHJLNLFEGHIIIOQDCBBD>412&8OKFHMTSTTG778:965?FHFIIJIEN]adg|qJE>2@LG>47<<@??AABA==7/8HG:629Pejge\J>BIKHGDAA@<8778>><=>>>>>=;6-0@FFED?<=;988753+(3@EDCCJYWHGF75KOOKC6=BI__NLV_dgeaaS=10*-NV1,2.,-.04;ACDFHGDA>=<<;9989:6656679999:843316>?>:60,+,22.-,1>B@ENPPPOOPMC9740036<@>>=;:9620../.-+*058601=B<64225:;:5--85,.3650/-*,6.,*-.,3@?;<:9::21648@7/47<>747985/(3EE810///./158;=>?<8671-.2420.,****+***+/23++../.**/46556887=C<0./23241*'('''+,*,,)%&,33112347:84-(0544220/-..-5?9,072*))(*97)*53+))(/=<0*((-7?>;AB=1)'(()0/&)?QIC=;9AJMQSTTSTVN;037;?BLWA'2DHNMPWE0)0Q_?,-'090.1//0116@DB>=BO_jdTKDCNMEEKKGLNOMA5-+^`dhiijjijje_`hqtrmjigeedcccccddcccb```_```bdgfccacnrmjklihigfggddfdba\WXYWVXWWVVW[acaab_^ab`^^`aa_]\ZXX]acdfiijmnnmlljifdddbabccbbbbbbbccbaaa`^\YUQNNPPPQQPQSRSRSSSTTTTTVWZ]aaabcdddgptpmopsvtfXQPSTTVXYXURPPSUY]`]\ZSOPOPRRQQQQONNS[cd]WROPRTTUZ\YVVSRSSRRVanh`^cc``^ZW^jorvsqopd^chjogY`wkV_mnoxZ_jnijx{z}rg_]ZUnogda`^[[YYXY]kvy~ykgjpmdaaab`[lyokzsW_l]du}{snlimwtkoaZ\[XVUTTX[YZhlhfyРw[QSOzٝ|w{kivzzwvnejrne_eqodbcfdipsjjrYY^kmszulb^^`Sے]wRLY]WqcqVpxMVraKQeozdhzdalwyjhjfc\X[qñm[NQ[ehhg^bgllcqqpt}odbkp_TYWX[^``bce^Z\Yxʃotutlecba`bbb`asqijllklqpaYWYch]LS\ZYZ]_`^_acrѰ~YXc`^pojfab^\\[\[ZXXXZ[\[[_a_a`[YYXWWWWWWWXXXWWXXWWTWYXWWWWVUUUTUWWYWWXVUTSSTVXYWYjeVVWWWVXYZZZZXVX]b[RWWSUTSU^}deqkghfcaa`aa`aac`g{xnijnl_\Y_utoZPMYkfhto`[ebY_^b___^]_`^^_^_^^_`aacegTIHIHIKKMNSY\[]_aSLPQOIGGDKRMLNOTOIL_tpcilYTTVZ]ZTQNLLMMLKJIJJIJIHGHKJJIHHJKMMLLKJHIJJIHIIIHHIJJHHHGGGGGFDFGGFGGIIKKKJHHFCB??@AACEFFEEEEFGGEEDBA?>=??@ACDDEGIKKMLJHGECBA@AAAAAABBBBBBBBCBDHKMLMNONMLGFOYWWTPMIEGJJIA;@42=9/5EE85;Snund_]YI9AQRJDDCA>;9:>===>>>>>>=<51/:GDEB>==;:88741./5BGEAAJ[XHD>;GVOIMIEGGIY_PO[diib[VG0).--7<322/-./036=CDEGGEC@><:988::;76566788889632219?:63451,.32+,..9EDBKQQPNNNPPD<5/125:>==<==:3.-.0144.,04660/7AA9/026:<:3)*3434543/.-,-7<8542.-0532<.*2:>942585.(8H@4/12/0.+(,48:?DDA;87645421/-,*)**)***.150../57/-/35677648HM?2-,/23/*'&''),,-,*)'&',.,++,.48996.+7><973/.,..1<=/+394.-,++560-/.)%%(073+,./4=>Pba`]KOeT:36?OY\XY\F.(*,/46::6>LQIJLPTUOFFC@GH9+&')22'*ATSJ>:7AMQRV`gaYUSF;9749;61.3>@BE5)4>BDGML7((9[[7,.(+65010//--4>A>79BL\dTJRWWVVSTPD?FLK@,%()_`bdghiihhgb]_gmqnkjhfeedccccbbcbbba``_^___adb][ZWWdqpjjkhhhgfgga_ccaab\XXXVUUVVWVVX[YWXVSRVZZ[\\^^\\YUVZ^``bjljklmomihfdcbbaaacedcdcbbccccbabb`]]\WUSRPOPPOPQQRSSRSTSSTUVVWY]^``acddfkppng^]a]ZURQRRSUVXXXWWVVWY[^``^[_f_QPTSRRSTUTSW^bba]TOONNOOQTSUYXQPSSTYbecb`c`cb_[U]celsvtjZWdgaenlekwtke__e}~agsnmnw|{}zl_[[[cphecb^[\ZZZZ[gwxx{|xpnyocba``_[lnhjt{rcZdv|zzmipqehql^TVXWUVVWYXYenk[QZ{eSdjT߃x{hzrw}zywsoottuldqpc`ceeghnrtoXX[fjm~q^_c][]gRVacXŤnֳ_NZd`_]]pveurhldQ[r~}wvwufW`oűt^QRTRV`egj_RSUZ]_uSwhggo}~zn^Wa[STXZ]^``d`VWPHoipuofcbaaaaa_a}mhkmlkouo_V]gllpx|l\Y_cg\Z_^U]{͹aX]^]iopkbmc[]\[ZZZYYYYZ\ZZ\\\_a]YYXWVVWVWWWXXXXUR]]UWYXWWWWVUVVURTUWWUVTSRTSUVXXSclZV[ZYZ[[\\\[[ZWWY`\UTVTVUUW[peftokkidbaaaaaaaba]yzoiknj]YX[clteLQXZ`hoywsxq`]^`_^^]]^_^_```^`diltskgTHIIHHJKMMNUYZ\]^WNHGGJIJEGNMJKKRLL^zvefkbKHRUW[YSPMKLMMLKJIJJIJIHGHKKJIHHJKMMLLKIGHIIHHHIIHHIJKJIHGFFFFEDEEFFGHIILKJJGGFCA?>?@ACDFFEDEFFGGEDCA@?>>?@@@CCDEGJJKMKJHGECBBAABAAAABBBBBBBBCDEILMLNOONLKJIQWVUSPNLHIJKID<=GJS{tOHCGGD?BGKROOJE?:88AE>98?@?@@@ABCCCCB>=<=o¼ҡ9:HDEHHCAA=>BCGNK@=BFIMMJHHIIIIIJJLLLIGHGKSVWRD?DC96>53JI?NNJNY^_[B5<<=;:=DGIMLIGBKZUGD]yz{M-01:IF@DA;:??867;>@@@======>@75EF8:Pmuqlfb__R9:PTJGHF@;<<>ADD>8;>=>??><5/-5EFC=<<97667520/15:DEABKZSDABOVWKCGKSUURX^MR_flg[SIBC;1,021210/-.000.6?BBECA?<;;9999;<=;;98653577643222:D8.-484/052(/?EGGHHJNNPPLIINKA5+/148==<9<;62/123354./366302;CB;2.27:<:51-38<=864/.-..3530/0,(/86.-;FGGK=4<;1;@,,146772.1559;3+0586/,196.,;E;1,493//+))-258BJG?<<97553331/+)******-1324/,/310013899968C>/+,,054/*-..013340()'(*-+(&&')134<:.-=@;:83/-+*)1?6'-7;851.++-00/,*'&&).1,(*-169:8243./>FC=9;4,.1;ME/+)+274100//-.17<:8>EKUUNXfje]VTXN6/:=82,&%&UUVY_egihgedeeeehjjjgeeddccba_^_`ba__`^\]^^^^[VVXYY[ennjiihhihghc[[b`^bb]YXXUUWWWWVUUTSRQRQRTXYYY[[[[YTTWY[[^ehjmnprokhdbbaaaaacdddcbbcccccdcba____][WTPOOOOOPQQRSSSSTUUTUWYZ\^_aaccdfehoqj_UQPOPRRQQRTUWYZYXYYYXXYZ]\cmrm\OORRQSTWWUTTVZ^a_\XSOOONNRTTXVPRTTUY^aced`]\]fdb]Y\deeb`fqwmZbxyklvpaWRUt{fuyppsw{xwyyxwtj[Zcb[j}sikgc^\\[[\\Y\n{yxijsieda^^][eniaghlykYYcv{{ghne^gqvbNSYXVXXWXXXWssdpcP^xcWk{sz|w||ywwzcqrc^cfffb_djcVWZchdj|t__ffNdZ\_fgafdim\LSOYeoqƟrsq^[^w{z|ξrZRQPT]]VOXijkjfw}i_na䴄yh`mxxutm^cbRNWY\]_acYTVMMs\jvrfcbbaaa__bǾsgfhjjjpseYas{u_[`fkbXep^[W{µiLR]^^urddo`Z\\ZYYZZZYXX[XYWYZ\^\ZYYXWUVVWVVWVXXTSW[XXYYXWWVUUVVSOPRUUVUSSSUUVVYWYi_T[_]]^^^^^]\]\ZXUY_XRUUXVUVX\xjr|uppmhebabaabbdZRv{ojlkd^YY[V[fhQVTMUXXly~n]^]^^^^^_^]\]^YUdknqxrieYPLIGHJLLMMQWZ]\\\ZQKGKLLJHKLIHIIIPliVQ[oYBBQUSZWROMKKMMLKKJKKJJIIHILLJIHHJLNNMMKIGHIIHHHIIIHIKLKJIGFFFFEEDDEFGIIJMLJJGGFCA?>?@BCDFFEDEFGHGEDCA?>>>?@@ACCDEGKKKLKJIGFDCBBBBBCBCBBAAABACEFGJLLKMOPNLKLOTVUTRPONJJJJHIDBIIHkrgTDB@GA<@EJOKJC;89;?CACQQIJJLKKKKLKMZf`VIsnMHRKBGJD@BBCC<99=?@@@ACBDDEDB==>>sû[2CFDEFC?@@?>BCDIIA>BFINMJIIKKKKKJKMNKHGHJQWQLPJCCB7.259><6EONNY_]WB;@>==<>@DADG<@dyrtqlb^[C4DPKJJE:56:=@>:528>>=:=>>>?>;4-*/EF;7785445420.0345=CBCJPD?FKOJBA@:AJLOS[ZJTchkbTRJBA@>684210/.-.00-,07@@<8525:;89;:;>?@?=:4004774222229850..00020.,.-*/:8,19;=AHJBA=357+*.14542/17448=BB:55.,3:933>?51/7:3./.0.,03423<=::51.,)'&/:/%099762/-+-240+('((*-0+&''+.//.-++7D@4034100672-))-23,))()+,+)/7=><:;Njmaca]V_^M?778889?@<?@?@A=638CILF7-(')-286-,/13764000-,./11/5ABFKQ\bhplbYVTL3(01342/02NPW_gjigfedbbceedfhigeeeddca``]\]__]]]][\^][VSUWX\\Y[bhihgghhfefg_Y]a_^ac_ZXVUVVUVWTSSSRQSTRRVWVWYZ[[ZWUUTUVX]bgjmppomgcaaa`a`accccbbbcccdeeeca`_```^[VROOOOOPPPPQSSSTVUTUUWZ\\[\]_abeghklljc[SOQQRQPQSTVXXXY[[[\ZVWY[emjkhXMMORRSUUUUTRUX\acc^VQT\bjiXOUUQSSSUW^chfa\XYfxj[WVY[\_gwp~{aYpupwqb[RSnriuyprsvxwwwwxzztllkcgxphojd`\]\[]\YUXm~y~ldnkffa]]]]\[[^`dgkxyr{}bYWdy}|pyrbhlgikrueUUYWVWWWWWVOmp}xYNavefr~xouyq~|rbqp`^bdef`\Z^^XX[agfdtxia`e`Xjkhlhtpdhz[KQOSYlurvgXexy{|ϡ|iVIMSX\_\ZXYes{qulƝrxvrnjnhbazXX\]`db\VWSUnVgutgccbba``_bŨ|i``ehgjng\douz_a\cgj\XoaY\WoXT_appbdcZXZ[[XXY[ZZYY]YZZZYYXYZZXVVVVUVUUTUUUWXSXZYYZYWWVVUSQMOPSXXYXWWWXXXZXVedTW^_^^^^^^^^^]]]YVW]XRTUUUUVXT^|t|~yusqlgebbccddg]Onyljlj`YZZYXUX^UPMGNMO]ktwyo\_\^___]`eWUSONVnotrliec]TNKIGJLMNNQUXY[[\^^SMKLMLJKMIGGHIOXNGKQeeIBQUNXUQNMKLLLLLKJKKJJIHGILLJJIIJKMNMMKIGHHHHHHJJIIIKLLJIFFFFFEEDDDFGIIJMLJJGGFDA?>?@BCDFFEDEGGHHFDC@>=>????ACCCEHLLLLKJIGEDCCBBBDDDCCBBAAAACEFIKLLKLNNNKKNRTUUTRPPOLJJIIIHGKQRXZ[VM@>G@:?DJMID>8799>HCM^]PIILLLLLLKQbca_HRο^3AULBFGDCDFF?;:;=?@@?ACDDDFDB@>=A¹̋7>DBBDE@=?AA>EEBEHC?AEGLOMKJIKJJKJLNOOMJFJTNB?LURLG<11587448JRLV^YRKCA=<=?ACIQLKHDBTYLF<<??=<=><=>>>DJFB<=Xw~yume\\aM0==>=92,)*AJ:266895431//1465=:=9753211..21/015>>830148:99:<>>AA?>;6/.1674332139;2-0442149>GHB=86014=CEMUYWTQI:,.02578520-023577530/37:500:A@?>=88=;100881./13423546BF?=<968997675/,..,+,-/0110.**+.00/29?=730+)'&,6:757?:/(/6:@=-&*./221.,*)(.)%6?::;:::6/,+)%(/0,,584320.--372-)'&))*./,(&''%)1+&(&)5<71131/1683-(&+43+)')152,''&+9BACA<>DFEDEDA>;;>Pijecb]Zc^OB;:82.26>ISVWZWJ;6789;?ACCLWY_ed[SL5$26'%+)*.4?DD<++/9DCVnksiA11-6@>>?AAEGDCB>:9=@:=OTE2-012221025=???<941121.,+3@AAAUgaeonf_VSB1,05887;EI`bgjkliecbba_`fgeeeggddedddc`_^^^\[\\[[\[[\[VQTYXXZZXW\ceeedbaabgf]Y_d^\bc^[XUUVTSTTSSTSRSSSSTVVWXYZ[ZYXVSQRTUY[^bgjkkfa_`__```abbdebabbdfeeddba`aaba_[XQQONNOPPQRSSSSTTUTSUUTTTTVX^acghffjooib^YTSSSSSUUVVWZ[\]`^ZVWYZ[]`ghZOQRSSTTUWVUVVYafgfaZ^nx{uXKV_ZZ[UUZZ^fghaUct[WUUet}hxkP\vwuwog`cpokrppprtvvwvzqky{ohnlha^]\[][Y\UYs~yfekhea^^^`_]]^]^`_hpmntjire[XVe~sz}pnjfinuwrieebYWWVWWXYYSUsnΧwmTX^[[sΡ|ourq{~wsrs{~nszq`_`cfh_]\]_]]^bgkdp}haccfZ{dsqhii]Xaxxqlj\NQPNP[]acchpjusY]mt|վ}X``YWVWXZ[UVatzhy{Wfokay|svza\ZYY]apre\Z_kbVfrrhcbaaa`aa`Ơvd_aceefcedj~{\Tb[kifusdgvqabʤhP[kpea[YXZ[ZYXYZZ\[\^[\b^ZXUUZ[URTTUTTTTTSSTVZ\^]YYZYYXWUSPNPVY\\\]]\\\\[Z\UUf[T[^^^^]^]^^^^]^]\\YYXUVUUUTVXWOfw|~|{xvtojgdcddeehfXbzmjlgZUYZYWUVZ[NHELTX[]fkba]b\ZZ[\WZgROIK_lonsrmgca^^WPLGIKMQQRUVWWX[[^[WOKJJJMNLJIHIMHILNMWgVGNTKWRPMLKLLLLKKJKKJIIHHIMMKJIIJKMOMMKIHHIIHHHJJIIJLLMJIGEEEEEDDDEFGIIKMMKJGGECA??@ABCEGHFEFHHHHEDB@>=>??@@ABBCEILNLLJJHGFECCBCEFEDBCBBAAABCEGKMNLLLLMMMMPRTVUTRQPOMKJJIHHMRfj^NMOLBDEB@DJONE=::986:HK\cb^QKKLLLLLKRb_[WDCѿd/GQGDGGDDCFGD?<9=AA@@BBCDDEDBA>;MÿͯY;>BBACB?=>CE<@DBEGCABDEJOQMJHJKKKKMOQQNKIKKB==AEEHB=74758@93;IRU^YLB??>>=?BBDDCGHDBVOJHBC58A7469?@CB=;>:13;;86<@>=<>A>>>>>@CB>9:AP[`c]WWWXU;8Yb\V@35632211236669??===>=70-**9J=168<<8320//247:@DDEG@>EC?ACA>;89?AD>>OK`eeaVSR?4;:1/7=><::843224<<9?C@<;:57;957@B@BB?>:;2..4654421142--/22..3:>7320-.,,-32/.140,/0002774ANQXTIGKKJIF@=;<6/,041../258878757>>:7777787520-,--,-.-.11221./)(,0/1340-,.12/)+00149>3((/38DA0'+*09:8542/+,+$+<@?:544/,*)'')-**.0.++-.-+,58+&&&%*,**,)'),-)(.0,)''*151.0//17;72)%,2/)(*+6;0(+*'+9BCEDBDJKIGGE@::97D^nlhe^`f\UIB>8/07<9::.)-.19<6/HebdlljTWT5/764:;??AAAABEGJNNLKJHHHIGECDFHGFCBABAABBDDGIKNNLLKJKLNPSSUVVURSPONLJJIOGQXiobKIHGFHGFGGNQMA88;:87=LSfa]caWKKKLMLLQ\\UUKBZ:HEFGIIGECCGID@9>BBAACBACCCCA@>8Xo;<;@BBA?><=AC<8;B>=;9869B9/.=OV_T?6<>??=><;87BGGCKW=EPONB79>>==9@???>>@>;<>><:;BOQSZWMWP>P`[QA3121237<<98>=6:>=<<<;623,,7A61;>;993/-.02469=ACFG=?>==9437CI@APJGD?65;9-2AECDDB;:950/45456310-,,,.03.,383**11-,,,,07>?>DLNG;73.,,+*,2897544222.**.47876583)4>0-27<=94357655420,*+-/45,(*/551179;;;:74,/=?3,,061.---/-.7CLRWWLFMSPKKIB><:3,()00.,,04:::::86:><76851333/*(),-.12/.11344694/1/01.,***1761,)))+166.$)356@@.)0+/9<;;<;4,+,(*7@=60//+)'(()+,+*)*'((*+)*.64($'%$+.+*)&'/21-(&),*'%&*/-,,-.19>;;3*-0+'*,.13*&-0.1>GEDCCHKKJJIE>:901?LZklh`dY[ZPE>715?GMNNPRQOB>FHC><=@=21Mimoqra>3,';A,4<1(4;236201JU7/A^Y9&-35:BNUSMHCGPPLJG?4/-(&';Y\RNLIFEB:;CBEQQI@;<>/&+/.10+%5VaehkrJ8ZM7DA10:@ELMdca`a`bdddccddegfeeeecddddcdeca`_`_]]^_`_^\]^\WUVXXXZ__[[^_]\[ZYYaf_X^f`SPW``YUVUQPPRTTTVVWXXXXXYZYZZYYYXVUQPQPPORTVVXZ[\]]^___`adhgecbbbceeffdccccccb``b_WQNNOPPQRSQPQRSROOMOTXYZ\\\]_adeehmolkib]\YX[\\ZY[[[\^_ac`YTTTUX]de]XUSTTSUVSRRX`egeenuqovzrtsctzkZSZ]XWYZ`egqyf]`VksncNRe}m^pxnb`Ycnjkijklkjjikoz~th\_emwsjozo__^]\]`]WWZ[g~}b`mg``_^`aaa_^^^^_^[Z\]_^]b`\kxdgpgeh^\acfe\VWWWWY[WZ`aVcgJYraMNPPUqv}zzz{wjbpnpvsquxidr}}qkigbbgofaaaaaaaekgXW|c_lsplZROMNOPNU]]XWORMbcO`teSSY`grgURJ^˭wKPXae\WXVVVW\gqwĂaz̆]XX^_[K{Ų®qio`VqɲvY詃k_oqjefb_`aab`gֺokkkihgfdn~`OYfdbbi{pmvhU[myWTlWbw}h^\]^^\ZYXXY[^___`^^^^\ZXY[YUTSRUVUTRSTUUY^_][\\XUTZ\\^ad`^^^^]]\\\]^ZT\h\Z____^^]]]^^]]^__``b`]YXYXXXXXVSSk~|yvpkfdcdeheaXQb}ylhe_ZYZZYWUQT_]VPWix~yd]a^]W[m}oOHEJNNIJZp_Pevligfda^[ULFHLQRRRRPJMY`\[]ZPJKMOOPNNMLJKNNRTSPOOMFMRONMKKKLLLKKJKKJIHIILMMLKKJIKMONNMKIIJIHHJJJIJLMNNLIGFEEEEDDDFIJKLOPONLJHECA@BDDDEHKLIIJKKJHED@>==>@@ABCBCFILNNLJHHJLJHFEEHIFCBBAABCDDFGIKKLMNLKJKMORSSUVVVSSRQPNKITaR^mfj_JDGGHIJIHGLLJA<79978?LR[a^]c\IKLLNLLJHQ\bS:@}SLLFJLLIGDBA?==@CB@A@BBAAABCBA@7\»t;<=:BBBB@>=;;:GaVC@AABDDDEHKONKJKMOQRTWXURXTIJD@:47@===;;8:>2403FW^K68>>?><:6213CJDBUS?QYXUJ=7=A@>@@A@@@???<=??<::?IS[^UMX]NLUTG;578:=CGJJHEC?<=>===<:9;8.+1413=<87:4.,-/01126:=;3/7AA>AHMVgh_QOK=4<:36;:9:=@?@>:621>LEBNMLHD;652-3>FECFC94976;=9465..10/.-/050-44.+152.-,,+-6?@:;BD:140,**+-17971.12235/)*0579;8564/58++28??72//013550**-/0242---/0-+2999>3+*(+,-,+)*(.>JMOTO;7JRNIHIF?;<71.+13/+*-5=?>==<;;??<994-.021,(),//164033340)+.//0/.)(+..054/..++(&-33)&4:89=.*6338:;__OD<7;?CKOaaababdddeeeefgggfffedeededdffdb`aa^]_`aba`_^^]YVWYZ\ac`^^^_^][XUXaaYV\_YQNV^\URRQPQRSTUVVXZ[[YY[ZZ[[ZYYYYYTSTRPPRTUVWZ[[\]``_abaadffdabcbdeffddbbb_]`bcccb\TQQQRQQRRPRTTQNOT[[[[\]\]_aadecdjosuvqjea\[]][YYYYYY[^bc_ZWVUTX^_[YXWTRRW`^YW[^^`adkicgswnmzxv{pc_\\^]XSRW_`]ikfpeXwx|\\bci\Thwvh`Zenfdfiovxvtsrtu{yja]^oyrrngtugb__hpvyphkg\eyze_nka\]acaa`````_^[Y]__aacga^dr|m_cac`]abdfe^WWWWWYZXYSpeVjUOQOMQSRSdos~}{ytqqkbmjqutjfsqnx~~}rjknlhhnrgcdbaadfjwnWRuxae~[ZQMMNOPTWV[cSgVWRVQ^fXUYX\kqbRLKX}ŻzSNTY_YXXWUUUcs{¿yd{ܣygwo_Q^f^OFayfpvuwvhZSxʽgZÌt~udgkihpc^bb``aqϴ|oosvxtj]qcU\dlj^]a^U^nqg_QLX~oSNYbXeh[]]]][ZZZZZZ\]]]`_^]]]]]\\ZWVUTVVUTSRSUVZ^]\]YWY^]]]^^^`]Z[^ZWVVXZZ\YT_bYZ_^^]^^]^]___^^_^__``_]^____^]ZVUbgm|xpkgeefgjh_UQXt{phb]\\\[YXY[UTUYY[dw{dS`\Xa~k_NHIKLMPKLXTPixommkg^[ZZVLHLQNNQPMIINW\Z\][VLMNNMMNLLJIKMQTQMMOOKOPPNMLKKKLLKKJJJIIHIJLMMLKKIJJLOOONKIIHHHHIJJJJLMONLJHFEDEECBEIJKKNQQOOMLHECAABDEFGJNLIJKMMKGEC@>==>@@ABCCEHJLONLJIKNNJHFGHJFB@AABABCDGHJKLLKMNLKLMNPRRSUVVVUSRRPNMK_clwjXUPHEGHJKKKFFFIJE@<<;60?PGBUb_]SAJLMNLH@BOffP?IrqHMGINNLIE@=99=::?>==;9931/-@?><;92/36AKDBYW]`SMMIA<9;<;?GE@CJD3/9DF>:;:;7688>>>;:=>@FPWXXY[\XQOH?>@BCIOOLPWUMGD@>>>>>==>>:1...14:537:3++-//12347;78>?B@AA?@@607?>56AL^h]QJC::8:92178::<>??=897/2DE@INMHB;73/08AHGDGB42=:6::6550*.7620.--30053/.23/,,,+**4@C@;<=3-0/-.../2320//3776630146;?=7468:<9.,27>;0+*-156542++36431.,,/1-(-322:@F=3+*7D@3-,))*+-/1..>EHB?@=644240--3;?BE@@@>=@BA>93/00121..00..10,*++.0(%)**+,*((071')..--/0*%-860,15465*)499:99:<7,-693,+130/0,+02/.-.//./334+%(*,273.00,(/41.+('*,(#&*,+''+,)()++,-./4:6.+),01/--.0-)+-,.666@IJLK@566588/*7FDB\peeha[YVNF=7F\ug6!,NhYBEKD;?MRbbbdeeeefggffhgghghhgeeecdfgdceecaa`^^`bbbb`__^[YXWZ_aegc_^`^^^\XSW]YRRY]WNMUYUQQQPOPQSTUUVXYZ[YXVXZZZZZZZYXWURPPQSTVXZ[YXZ\\]_`^]^`db__bcceegfeeb`^Z\bgcahib\WSRSTRPPSUTVZ]^`]WWZ^^^^_`bcbcgmtvuwtjhhb[VUUUWXXWXZ\`b`YTRQSVZZ[\\VQPVchdaaYRU[cgc`djmrwy|~}yoffe``^WTWX^g^dqifojht|{nr{rhcXXfx|n][egdfggo{vpng^p|vgkoqkaexs\fvc_eddije]^dda``cddcba]\``cegeeba_bbfpz|qcca```bbceebYWXXWYXXXY^XVYc^WSOMRXYXY]fsv}{yxqommo|yuvfmxstyy{|zrprrqrtuigd^cehilzkPpfbthSPXLKKLNQSnl]PuZ_\QSWQQMOUVWllVOSSUiVNRTVUWXWUTSev~Ǫqf{ȁS]{dP]]\WRAmqjpqslc_eLvlh`ᡃun_Zegyzc]ca```pֹxmptz{vkyn\dmqutf\[accdecWQMgu_T]sZanWhiZ]\\[[ZZ[[\]]]]]^^]]\\\\^^\ZYXVUUUUSSSTVZ\]^ZX_fc`[YZZ]]\ZZ\WSPRUWYZ\b`ZYZ[YYZ[]]^^`bdd`^^___``aacbaa_]ZWWWUZn~xqkgefhhig\UVWj{sg_[Z[ZZZZ[\VSWZ^[\tp^X^\Yk|HHJHGJJNPNOMKMfwsokhf`\Z[ZSJNQNMOOLJILOVX\[^^LJIJJJKJJIGIKOROJLOOORSPOMLLLLLLKKKKJJIHIIMOMLKKJJJLOOONLJJGGHGIIJJKMOONLIGEEDEECDHLJJMOQQONMMHECACCDEFHKNLIJMNNJGEA>===>@@BCCDFJKMNNLKKNOLJHHJJFAABBBBBBCDGJLMLLMNNJJMMNPRRSSUVUUSRSPOMLfgyrTJIIGGGHKMPOGDJKHGDEGB?5?K>5ASYVH9EIMOLD=HYWM@=An¿QFIIKLKJEB@??@@?@BAAABAABDEDCDFy~;>@@FHIFECCC?<=?APdeTFABBBBCEFHOUQMOQSWWXYZZVPLWLD<>?@?@>>=<8530/-5Q\L?ED?=<<;6266DGFG]bl_LBBFIHDA@::DGB>B;/6DHC@?><71,,138>A@>=>>==<>>?BGGJ[gb\[WOGDFFIMPPLMX\UW\XOC=>>>=>:4565./02620591*+/0024457;:/6EGBFJKKF736892.:Td^MKJ>568871.48<<=>?><:<=5-9A?DGE?;994/3;/-..//-,3:532123523420001-+--.,)0>HD;782./.-03211124689<<::><:88;?>768:=;:2-178/)(+0588653--5;;6-+--03.(-400=FJFFEB=75:956Fjm]PLJEM\TD72MxqXdw_2&*-,*,1534>ED:30..001.++-+(,2=T^WX\\O@=CPUQZ^N@6)%'?etx~ocd_T@57;?35^tbC67.),),:82::31?@@BCDFHJKMMMMMMNMLKKKKFAABBBBBBCDFILNMMMMMMJJLMOQRSRQSUTSSSTRQPNblfRKKKIEFEHJLNNGDNLDADHLLLHEC?89>BF?:@EIMMB:?NE=<;5mYIOONNLJHGC?=<778DEHKGEDFCACD@??;AP[`UIBBDCBCCDLXVQQSVWWXXZ[WSQSB?>>==?AA===:732543K[K@EB::<=>>::;FFFR_fcXOHFMQGFUVF::DB<;74:BDB@AA>82/--,/6;?<=>==??>=>@C@=Lae]YUPKGFIOQOHGT^UTdnjdS@=>??=5/276//10000242/.01124458::7;FEFR]\RC877451+:Z]JFKF;635BE:-2>@?>>7.1:===<:7665237:BEDB=65;:.,///02474..12344331--.01.-00///.7@>7553121.121014;>;:9;<<@B>:86;><677;;352.16610002344322./8==81/47751,2<<;CFI=67-.@@35:999:85;JLKLLJGE>2,4;97@GHDBC?::=83201583/@JFHB;@B>8568:9643210.,*))*,---./.+,,)'&+6?:55/)17.-085)2?;72-(''&-0.*)-369;<>=5..29;76887752/--42,3<6M;(.//11,-25444.**)'&(),28:7/%&274/7<-#%-2+##)-0/..,(')*.,&$&,/+'1AKH<21,')*++09CHGHHZqoh^QSN<0,/@X\___GAcnl`NJIKLC@A=ErsMJY@%'18=8.-1/3?FE=2--,*))*+-///048DTWU\YB37FSSQXZSSO6$".[vviUbbS;/27<1#8VM>773..,(-7=<5-.00,(6GHFY^IGM8'.4ddegffgggiiiiikkiiiihgghfcbbffcbb`aa`^adccccca__[UV]cc_^cfc_]YWWXYURTUROQTSOMOSTPNNNOPRTSSTUTUVUTTSVXXZZYZ\[[XUTRRSTUWWUSTSSTUXZ[ZZ[_baaacdffghjjf`[YVSUallnssoi\TSRPOMOY`ZTQR\a`\WX[_bbdc``aaaa_cea_cjmiaYVTUUVXZZZZZ\[YXYUQRTVXZ][WW_q{o^XUNT`igbcgjfevyouwqdfhaab\[beZ]t~zzy{~y[Xgmooprqlnvzqbowfeffhiny~}|{zy~q\]y{|ztombVTc}t|{idonbbeaabekkjkmmkiijhnvutg^eqsolmlongdcbcehjrzp^ZYYXXXVWYXYZZbkttf`baahnnlifruqrnbdknw}~|sofous{~}{|}z|yusmlnjqrlln|~odgxvsHJXziOLNMORTW[MK]UNONKNWPLQWbf]JKQSVVTUĵl\TOOONQVUPZs}mm}ϴdT\yrWTPP}Villljd_^`Wpzqlio|xqe|^dc`a``o͟rpnnnoeahlvyi^[YWcqsg]Xm`S_df]egbrľef\Z][ZYZZYXXY[\]\\\\\[\[[Z[[[ZZYYYWWVTTTVWZ____ecZUUVUSUSV[\]_YUUUXZ\^dcXRUWZXXXXYYYWWRUZ^_aa`^_``_\YUSU[RPQNPVTk~rlfdelnaXXYZSZnseZWYZZZZ[\XV[]MU\QXd_`YW\bX[P\NKIJIGJOPOLJRbidcdedb`^\[VOOQRQROKHHLPLLVZ\\PIHFFGHHGGGGJLMNKLPTSRQPONNNMLLLKKKKJIIHHJOPMKKKJKJLOOPNLIIIHGGHHIKMOOQOKIHFECCCGMMLLMNOPNLNOLHDBACDFHIJKNLIKMNNJHDA???>?@@CCEGHKLLLMMNNMMNMLLGAABBBABBBCDFIMNMMMMKKIJLNOSTTRQRSTSSSTSTRQRUQJJJHFGJEFGFEGIEIHF@9:CIILNG@:9::;>?@DGJMA::ANYUD8YnSUSRRPNLJE=97568;?BAABABDEEBVi̾_?IKJC=??BFC>@EDABBA@GW\UKDCCCDDDIUXTRSVWWXXZ\YZRC<9<;:=854345FXH:?;68:=ABBDDFKF[^dYRQNQTUJPee_S>=?>;;93578559<>;=A?<:=>7>PXURPOLHJOPONJGV]RUgmkkaJ<=>><83./55220//021110/334665547>FIEL\e_QA9;;53/)<74356342/00012320.-./0//39:98657:985/5CFCEEB788.-9;89:::88407KQOMH>:?=54:=<9?HGCBC@:99751..15/-@MFG?9AB5-165788652/-,*('),..//-****))(&,;A71;<1/51./68+)==<9985.&)/1,*)(,29AA>82346;<88>=;82.+294,2:6CY_ot^KF@2-*1G[V_bedWYkobPKG?72A?6.0,*7FHE?6.,+****+0;EA6596BUYXD.+2GTPQX[[]_I1/+Ir{yN6RaW?0/7CC-$0:87:9652)(6A;1./0/04AKJGHQXM?0&'(ffhiihggiiiihjlmjjjjiijjjfa`cedb`_ab``cffgfda`aa^Z[^a`YTYac`[WUSUWWUSSUSQQRPNMOPOLKMNNORRRRTTSUWXXVVXWY[[\]]][XWUTSQQRSSRRRRSTWYWWY\^abacefgijkklkcZVTPMVgpponousgXQRQORXYRQW\_][YZ^bdccdccdcebadcdhgbcijhfb]XXVVXWWXWWY\__^[VWWXZ\_]VU`hhge\VPS\bbbeecbjyyrnjtrjgbfi`]^X\szuv{tWXajmooppnnqtogeaceefgkmrx{tlz}mW_~yswxvuo__ltsx~y{qWhxfmlbacb`hmlnppooopprpkjosibkutpkjglolhbadglrvyzfZYXXXWWWYWUV[flmljhb`bmrleai{xrlmk`gmpxviitpopt~~{{~zxvtrnmqtvxsmoqxkl^]v`uNLB_nSKMMPUSTPMOQPPPRVphTUU]id[POSVXY[W]on]ZZWPKLTUNU}quɩiq{̘cRHuVegiihd`_\^[{yu{pd^`aa_`bhtۻwspnlogedgly~n`ZZ]oyuba^yq[Z`b`_smgbdmW]YWY[ZZYYYXXWVX\\]^^^^]\[\\ZZZZZZYYVTUUVY[^ahh\YZYXUTSSRUZ[YZXSOOTX\dcWRPRTZ][XXXWWVUQTW[aeca^_ba^WSONPRNOPMNTRYuldbeskYXXVWTYkpbVVYZZZYX[XXXVJNZKP]Z]YTSZSTWVNKIJLKMQPOJKWefaabcddec^\YUQOOPMJJIJKLIJTZ\\QJHHHIHHGGGHHJKLNPSUURQONNNNMMMLLKKKJIIHHJPPNMMMJKLLOOPNMJIIHGFGIJKMNPPOKIGFEDEFKMKKLMOPOONNOLHDBCCDFHIJMNLHKNOMJFC@??>?@ABCDFHJKLLLMMNNNOONMJB@CBBAABBCCDHJMNMLLMKKJKNNPSUVTRSSSSSTUSSQMIFFJIGGHPPEEE>=?CE>FH@:45@JJKJIC?;>ABEEEEGNB@FNevbC>?qSVWWTRQNIA;9779:>ABBABACDEGJTn͈@JHEB>8;>CCB?@BBADFF@=EPSNECCCDDDGSYUSSUXXXXYYXUP888537>>>>>:77679AE;477779;BIKHEHEEY_aTJKKNPKK[ebjhJ9=AGJPUTJ93A=86:<=?>?B@;<=;:?DGIJKHGNTMINNGLXQXijfgdQ>;=<>BA<:63541113332354357:840,1?HHHSbc\P?66722/)>V>8@?5,1=CDMTI;AC7-7<73200330-+*)))+..-+*+++/4667777778<=88?CA@?<68633557:9898866@NQMA3-/579>?<;<@FEA@@=;9742111242/?NFA:6?>/)05589:8752/,*))+,-..01/,+)*++'+9>3+4>;5651-12*&7;;8>EC7**267564*,2:964100.1535;;961,+03.,.14/F=//.+(),/1./244-(&&'&%#$*2751030)**+.1:>9/+-.12-)((('&&(4917C60/,+)'(&%%%&(+-0O`D555:CGE:1282,5AHHB:3/-,+*+*3ENG:5;;:FUJ-*:@HPNNQ[a^`UJM:>gx`5%5JN=..;IL>+(29;>>94.))2;81///048BHFIA9WY4*,)'eefijkihiiiijlmmlllkklkiihea`acba``bdfhjjigea_b`\[]^\YVSTXZ[YWUTTTUUTSTVTQOOOONOONNOONNOQRRTSSUVWXWVWXZZ[\]]]^[YXWUSONPQQPRSTTVWUSV[^`a`bddgllmmnnlaZXRMNXef`_`jxs[QSSTUUTSSYa_WU[_ccbddcdijilkihdbde`]`dhkkjfda]ZXVVTTVY[\\\[[\\\]ac]UTVX_`hhVPR[`_cfeebdlpf_wtlfdfa]Z\r||ywvy{xk_`gmoponlllpplhdeedegie`ejaZwi[axzvvvy}rgolca]gh^dnfe|rjib`ccdjkorvtpnporxrdbjrsjkuwtmkjmrsmbadjptuvyt^UVVVXXWWWVXgnliiifdbblqkegs|sslhljkptuxukcdnqlmu{x~xmprjimqvyywmlnli^paTjZKNQPLLMNTTSRPNOOQX[ls[c]_gfbROSW[\\ZaؠiSXST\\ZYSRSPKhpzʥtyI~yXjhfhgc`_]^^jç~}a`_X^`^a_YYatܦwtrrrse]W^cro`Z[gtyn\Zc{^QX^c`^xulkZPk~W[ZSY[\ZYYYXWUSSX\\\^_`^\[\]\ZZZZ[[[XVUTVY[]ikaWZ[XVUTRPUYZZ^`a\Z^c`^caX^_WTX\[YZYXWTSRUW[chd_]\aa^VRPQRMLOOMNQURxjb_kvaUYWVWUWhn\QSWYYYYXWWZZULIUGP^Y\\SMQPPPMLJIINPRRPNJKVbb]^`acehgc_]\VQPNJHIJIIHGIPX\]SJHJJKJJIIJJJJJMPSUVVSQONMMMMLLLLKJJJIIHGJQRNMNNLKLMPOPPMJIIHFFGHIMNOPPOJHGEEFHKNKIJLOQQPOPPOLHCBDEEFIKLNNJILOOMIDB?>?@@ABBBDFHJJKLLMMNMNOPPLDACCBAADDDEEFJLMMLJJLMMLKNOPRTVUTUUTSTUUSRPMJIGHFHCNYPBED=:;:@@HF@;67@KGFJKNIA?CDGEECENBFT_hjO?@>B¾V_a_[VQKB;8899:@A@BDFGEBBFGFDDDDDDEGOXYUSUWXXZZXX[L696115<@@A@AA@<;<==97755678995026>??@AA?@?>=AHKMMIGOWWTRSMCDPP\ljd`^UD?C=BTWXP82764224332477469<5./28AFGIUec\P;20/121,:E1798516?@?IRMA=;96:27@5,03346310//./5>C?AD>32@@??AEC@=<;:86103663344>MC94263-.48:;<;::8651+*//-+,./670--,-.,.682*/<>:==6+*,*)0441;E@2-583036;7.,.-+,,,,,()*-110-)&))*++,,*'9H.+)'$'**()+/.-*(&&'''%%)09;72340.011126?329:9@JG:6<>;627EKFA942/--,,7IJA:9=>>CD4,=ONIKLHFV`_`TLRD>UZ=*)(/72).=HHB<436<@?:3-*)+250.../37;@DF>):XB!$*)bbdhkkjhhiiiklmmmmklmmljhiiaZ\_aa``cillid^`efdcaZX[_]YWVUUVWWVVUTTTSTSRSTRPOOOOQQNNOOPPOPQQSSSSUWWVXYZ[ZZ\^^^^\\YXZYSPPPPPQRRRTVTQTX\]^^acdgjklmmnong\QNMNTUPQUZ`aXSSTUUTTUTSXXWUVVY_cegghmnmoomie`XTWYZ^adimooomigc]ZYWUVYXWZZZ[]`aba^[YUTTV]XTSTUW`ebde]\]\j}|sssh^][Xg||}}tgadlqqpnmllopkkjdaadih_WW^`\jwq`Xasw}}xtroqmoq^SYXZ^XXchuvjeb`aimkptqonnoqmsycZ``iolnvxusssopssf_cpz{|{zyia^XVXYW[W[u|xutqjgecbdipx}woqlqsxypgggdfpomz}xxsdu{igkmnpxxkhjinwy^igUdMWjGKLLMNOPRSRPOOONTYhs_a\\`heUSVZ^^_cܩ{_UTPOQQY__ZVXOZrzkzλri`kОchaijegeb_]irwkwʢ{n]_jhXV[^a_YLMQYYussuusr^WW]_g}reZYilp]TOjhQMRX_^VjrkgeVK^`Y]ZZYZZZZYWVTSRTWWVR_`[Z\^\\[YYZ[[[YWUUVZ]ch_XZ\XRRRQTW_eehty{{wsumb^_cokc[YZ[[Z[YUSRRVW[dhc[XZ[^_[SRRROLKLNNOVT~yhbatoXUXWVWUUceWRSUYYYYZWY][VLFPPRXXXXQKJJJIJJHHHJLNONKJJMSVWZ^acfihfa^`]WUSPMLLKIFFKQUY_VJIJLNNNNNNKKLNQRUVWURPONLKMMLKKKKJJJIIHGKRRNMNNLLLNPQRPMJHHGFFFGIMOPPPNJHFFGILONKIKNPRQPOPPOLHCBDEEFIKLMNJILPOMIEA???@@ABBBCFHIIKLLMMNMNPSPGACECAADEFFGGHKMLKJIKLMOMLOQQQTUUUUUTUUUUTQOMKKIEBB@RVH?DC>;::?FID?99CLJC?BCIJIHGDEEDCDJBJae\N:<?@?;98656777?MTKGDJJHKMNDBGHJA75,-24::;757778:><4/15=?>>?@BB@??CJPVRNUcc^`b`TE@KJN_f`YXWTRREBSWSF9675542210122236;:524;;<;,.40/12233332358=DMMEA<3--/3<@ADECCA717846:<=92-+/787:<8899=;4-),//113553555666548AA7/-,+--.2446?A;61./143.*+.010035660)2?<2/-*0=C?:;>91.17:86477336;A?9537988:IL@6-*7FHFCBADEDCCB@>>>=;8546985148=JA630//36889=??=;<;60--//,.01149<734433442201;?<@B7+)././///=E9+-98/(*042-))()*,,--,)**))*)'&'(+./011//I3.,($%(*+./,''))''''((().56424411138:==866674221.+**)('2?FF:235:B>4/021../.,.47674.)%&+),29<97533QY]hg[NF0?MB54337>7,,./35/6ID44<>9537>EGH?5001447@LC8;B<:DJ:)8PUOJHICCQ]`aM=DB@GA.(-/)),,/5=B@;523579;:3,)*.-+.//023369:3&">;;;;@JD>=7=MQH>68;<>FNOHGGFABHBQijXC759:;BN_ɿjmlmbM=87899::<>@CCGCEFFFKP\ugdTKEB>9:;?EBDZOCCBDDBABBBBCBBCEFEGD:M`XSW[]a_\VR?665444=NYXPJEB?<=@DEGD<532336>JMFEDGGGHMNAAHHC7/7KG>TVC9:9:;>FI<246::86997888;:6556<:;>?>?@?>=?AL[ZV`nh_chf^K>D:3@TYVUW[VLE>GN@5687556400/02/-27;:89>??CIIITffZG4/11254112342556656=GJHA?==<9.*+.121112258:@HPSPD4..,,-/4>@>:7:?=20:948?>=<70147777867645/--/003799975575442/06:970**+-,,1436;<71///474.*+/4533469=95AI98:6-*/79::8741/03>A:0-06557DE?934:<<>@AAEHFDBAACDCCB?<99995/2:?::74465+).0..,3IE/)/244566,3CGDEGGGKT]caH8?BAD<+&,51*,10+0<:10230-09;3*,-,))/11110,+,..,&$?L0)1hjjhfdbdghiklnnnliijjhedd__ecWSX^`_^^ZURPPRSX`_]`a]YY[\[WTWYYXWVVUUURRRPOQQPOOPRQOPRSQRSRQRSTVWXY[\[\\\\\\^`aba`^[WVVUSPOPPOPQRRPQSUXZVU]dfcejlnnmmknogYQQPNLKKKLORRQRTSTTRQSVUTTU_iigilnnllnonnnnpncYVXWTUXWVZ`bcfhihfeb[V\_XTTTVXZ[^_ba`a``^]^_^][^abbdffec`a_^jwwsrl]Ud~xvohipqnonlmmmmjd`YZahg`ZZ_hh^Z\ZXcv~wrqnkhaXY]]Z^e^Vmpkd_^bmspnklmnmmrty}p[Z___gu}~}}kdrrecpsw}slic`YVWS`e\filmiccumhkorqppnechghlttpji|zc^`_^dchx|wcYhwnMHKJAnzQKNPOOONOPOQV[cda_ZRwgWZiomushla]^\Ta`^_Mb}zkWY_[WVVWZYZ_^d~~kgp`zeZegzucZSMT^aaqiftvof[Ra⼤uzM^pbTUVRQV^YPSSnh\rmaRSV[esnyi\YVWWUThdRT]]\Z]_^_bb`_b_XrkYXWWWWXZ[YTQSTTUUQXg\_lrjVPX]\ZZ[[ZXWUTU]e_[\]YXY^ksuwyxwwqfaZUTTWkxk_XZgllmd]ZYZXVRRVZ[cji`XVWUUXZZ\YVSTUSPOQSP[thcjjXQSTUUUUUVVWWTTVXXXZZZ\[XQEJUOQWXVNKKJKLLLKKKIGGILMLKJJHMZ]_`de^\[[]VKLTXSOLIHFFIMOR[]LKLMOPOOMKMPTXXY\WVUQONMLLMMLLKLLKKJIHHJPRPONOOOPPPRSSSNJJIHEEFGHLOQQQNHGJLMNNMJIILNPQQPPPPOLHCBEEGIKKLNMJHLRPLHD@>@@AAABDEFIJJJJKLLMOPQSOIEDCBACEGHHHIKLMMMKJKLNPNKNRTTSSTSTTTUWVUVSPNKGEA;8;@BA96;<;;;9=B>9=7?LME>76877;BKMKJFGJH?Rhm`LF?78?LG8EZ½̦rniibN?:88:::;<>@BDECEFFHTn}Δbg_TQTJ@99;AFCFTD>BBCCBBBBAABBBCDEFGB09R^SW]afe_UOA767657CRZZULFB?=>DGGHGA73111358;>CDGFDIOMDBGD:127CAERD=KYWVH;>E@59;>?:8<>??><;95224699;KQB>@@>@?I]\[gng__fiaG7606?OWSRWROPG:87676640.-02/-4>B;5:?<8=EJIPceYD2134333457876667536=FJGB?=<;9/*-243/-.016><4,.1799;98<@=;;732;=;853431//.153129?>?<5345320/.37::5,*./.,+03331/02421233/.33356646>A=AJF6,6?53>>843552.28<@CB=8:;959<7-)+23/1>@=;64/&)9CCDFGFDBAABDCCBA@;987414=:8762*-7:9621;BEED?1(*78*&/5689<@@>?AA@>6-),./14;?:0-.0233324@F917:1)()-2.(&()*)(((*,,)''()*+-+(%'((,132;G1063-+,,*'')))()+,..-.2774214545?B<24740+)09>@>62///301BBE:'&/891.42)-9821331./33-+-*((',.//-+')0787:69LJ95mieda^_cfghlmmnonjhihec^ZXX_fcZTX][YVRRSTVTPPX\XYaaWTY[YXWWXZ[ZXWWXVRRPNRUSQPPQQRQPRSQRTRQSUUVXXXZ[[[[\]]]^`abab`]ZWSQRPOPPPQQQQPQRUVWVVY\]]_dhmnlkikonfXPPPONMLMNPPQQSRRSRQRVTSSX^^Y_lpommnprpprqprqg[WXWTSSRSXYUVXXWX[[ZX]c^YWVWWWXZ\\^aca_`abbacccccdfggfgfa\X]how~ui`]ds}zvnkprqsplfcgnlhbZ_lpf\WWbgga\^ackrrlaafbcefca]dh`Z[][bneVmtkb_`eornonehjkntpw}h[^a``cn|xtxqcgskbkztkrolifaYVRUauRY[Z^glhq|w{yvtgekpronpojfhhhjq|omiW^cdye\_`dfikr|vrx}uPKKNFHRLLLMNLLNONOQUYYW[ca_jj`h~xdatiXbe[KJYeWMU\oaTae_]ioc]]^^]bwpZWbf\V]T\nWQV[abgz{dc_ZYUU̝}Z`ou^SSQRUVVVUPǎun}XPUY^dnmktq]XQORUZk^WZ\^X^cb`\__^]\[T[|qXWWWWWY\]ZTQSSTUUQV]ZblfZRQVYZYZZZZXVUTTZa\[[ZYWZgztg]YWXVUUSRSW\kylYaiihaZZZZXVUTX\]ejdZUYZZYXY[]]\[YYVQQPPNOrrfek_RRSTTTTTUUVVVVUVXXYZ[]^[WOJKNLEOWRKJKJKMOONMKIIKLONKHHJJKV^bcbaZWX[[VJIQUQMJHGEFJLJJS]NKMOPRPMKJMUXXXY^WVSQONMLLLLLLLLLKKJIIHKPSPONOPPRRRTUUTQMJIHGEEFGKNQQRPKKQSQPMJGGIMNOPPPPPPOKGCDEEGJKMNNLIIMQPJGC@>@@AABCEGGJJJIJLLLNPQRSNIFECCBDEGIJKKKKLLLIJMOPPNOQRTTSTTSTTTVWWVVSPMKGA=99;>;:69<>>>;9=@=;><>CIF@8888999@KJKGEFA6MimmeaaL;Kv]HG@T¾„dfgcR@:889:;<==>@CBBCCDJMfqfcTLKZO@:9?<>DEHJHC=974674102>BGGDIKHIIGA5017NUL:6Qjvx|pV71738ED?<<@CFB>>=73/.00256H]L??@C@;E]Xcoi`\[cjaB35AKLQSPQQJIUSEADA@=77767630-/0/-3HM91<@:69ELFGZbXD565540269<=;:767712?JKFB@>>;90,1782-+-01577985:@B;522/--/147416>?==;634545334<@CB5*-560,,/223324654456403<=9:=<42:=;?D?2-8?61640112442489:@7262+(+/101;;4582%#5LRKGGGGDBA?=<>AA?@<956785=<3250*19:8998=@CED:)%3?9,+14689:73+(**(''))++,.011248<;74248=CMRE31650($(19==;98750,19:1*+.168:CH@84/+*)1=AARULQUQ@/05772121/+,5?F_lR0AS\]P>8989;<<80.00=M?,,.-22.,+3FONS][LACFFFILG>@ILML99D14DINXdYOL@959@EE;**7;:4/42)-77322234220--,)(((()*+)('.ec_^][`egginmmopojhmkcde^VTSXa`WRRSTUVWVVVTSSTVTTZ[WVXWVZ]ZXZ]^[[ZZYVSPOSVTRRRPOQRQPRRRSRRRUWWYXY[\\]]]^^_`aabbcba`^YTRPQPPQQPQQPPRTTUVVUVUUVY\^_befhgde]TNNOPNMNNOOQPQQQRRQQTTUTWVWYepnkkmopqppqpqqqpdVUZVVVVUVXWVUUUSSWZ[^`]ZZXXXXWVWX[]]\\^^_``a``aaabbbabca`ZZ\gywm_]ovxy~~{yqrz}~}pc]]cnmid__indZZ[giea^_dhc_^b_^^baa_`^\]a`\Z`dfnnbtsoieefotrneecbbhl^b{z_[`aabbcnx}zurtqldhfglr{mlpoqke\USUWenTU\X\alps~z}{tkjdlqusnjmopmoqqprx|[ST_g\]ss__abfiikr{}}~{dJGIIHBYHGHIKMKNPMLKLNPMXtwhiyqi[Qkqnh^hdUJ`_SVUkkRZdhjw{gaibb`UR~t}QWSJMLBѾjZW]acfiorֹ|S\[WYZҋʞ|jg\luYNTTSSSTTQܳϦwopUT]hllfli[jrgWGOX[^f]_^\XT]fec__`^][]WPl}\WVVWWZ]]ZVTUUTVVXX[Y[ZZUWXUSUXZZZYXWUUSVX[[[ZWYboui\WTRTUVWXXVTUXWYm[YZZ[Z[]^ZWVX\^^ce^VVYYVTUWX[]_\YXZXWRNKJ_rfjfWRRTTTTTTUUTVVVVUVWXY[\\ZXVWa_JENVPLKLKLMOPOMKIJMMOOKGFIJIQ\egc]YXXZZWOMSVSOLJIHILLKJLYQJKOOPNLJKOUWVVY^VURPNNMLMLLLLLLLKKJIHHKPSQOPOPRRRTUUVVTPJIHGEEEGKMQTTQPQWWQPMJHGKOOPPOOOQPNJFEDDGIJKMNNLHILPNJGC@>AABBCEFGHIIIHIKKLORRRPLIFECCDEEHIKMLKKLLJJLNOPQPSTTTUUTUSTTTTUUUUQNKJH@=:77<;:7;>BBCB?AEC@DC?@INB79989:7<6Igow{zkE[wPEOJgѮgejhWB=;:;;<==<<>ABBCECN[hznlm`LEKNJ@<;=BDG_lYKKGDDCBAA@AA@BCCDEF@417OYT]ekleI;9789>DGA9@PUNE?>:;ADHIE>AEB?BFB;1-<=AEFLIBKPJ@4..EcZ9-BSSYiyzhHD=16LH>?CDGF?>=;51/.01014>YXG??@?=E\]ls^QUX^`R@FLUWMGS]UOMP`VKMGA<;87787643202/+2FF30?ID:7DLEAJPVL@9762259?A@;9768<86>GGDB@?>950059841,00/3>PVNE@:.+,,.0113234568@IKIGB<=C>16:;99?D<32.++/0133426<<:98865468999;?EF5)0541.-./0149;60279940499;DG?63:=;:840023100,/443234677300/,-163121+),/1/1882*53(0HONJHHHGC>99::<@@?@=966>?35<6240/5;<===<=;:?D9((7?:/1457878<>BBEHF>3+)+*.3345532210..-024775871))-04332.*)'&'*+,)'()(((+,+(&(*--,/45=FB>3,((())(()*-.025689;=>;736@JMOMA2/24/(+0477ACCA?AD@BL@24654300.2==:DBEN80:ERZeS:72320;DFC54>;:4.22+-22111011110000...00--,)((3@DABJUXQUTL[\\ZY]cfhjmpoqrrqoklof`gfYRRORZYROORVVVUUTRTUSRSSSTWWUSSY\YXYZ\][[[[YWSPPRSRRQPPPQQOQRRRRRRTVWXZ[]]^^__^_abbabcdcccc`ZTQOPOPRQPQPPRSSTUTTTSRRTSQPY]aa^[\]WOLNPNNNNOPQQPQRRRRRSTUVVTVbmlghilopqqppprsrqqdVTVZZYUSWYWWXYYWX[[\[\\\[[Z[ZYZZ[\]_^^_____^^`a^\]]^__ad]]bdr}}}|{~zprpq{|{}x{iYXYbmnkgc^^a\W\cigdb`_``^ba_^]_b`^]]]]Z[]^Zaolntrzxpjikigowqdeh_[\\^\]lm_cb`bfha_gprrrqqrme]ckqpqrmmfiqoj^TTUWVTUWWVcrwst{|zyrojglrusnjkosvz|{uuzy\\dofZ\ee_acdgolbmz{z~~qf]ZROGGWqNDCK|gTPPNNOTRH\rdxnu\JZfzzMUgiV^`XXWehPQ^fn{|ccmf\[WEh˚wyiFKLKNΚ_U^ba`ceb_aۜwn\TU{ݩݚfuvc^_q`OQSSSTPMȿƹcexseRXiwljijh^]poXROZ_b`]eg^SP[ihfa`_^^aa]XceUUVWW[^^[XWWVUVXZZZYYYZ]ZYYVVXZZYXWVUUSTUZ][Y\dnn^QOSWWWXWWWWVVYWXVh~lZWWZZ]`bd]U[_^^][XUX[ZQLQTUVX[`ZWZ[[WPLMTyzpl\RSRTTTTSRSSTUVWVUVWXZZZXWcdWepSS]VNLLLLLNOQPNKILNOPPLFEHHIMTZ\ZZYYYYYXTRVVTPMKKJLMLLLLWTJINPPNKIKPVVUUY^UURONNMMMMMLLLLLKKJIGJKQRQOQQPRTTUVVWWWQJHHGEEDGKMQVUUTW[UPNLJJJMPQRRPQQRQNIFEDEGIJKMNNLHJMONJGC??ABCCDFFHHIIHHIKLMQTRPNMJFEDDFGGHJKMLKLKKKMPQPQQRSTUUUUUUSSRSTUUUTOKJJI?<<87=:98=ADEDCCDFHEFFCEMSD69:89:9:CKMJ?::9BUzgBdqWOPSYz̓Z`\OC>=<<<>==<;<@BBCGFXnsliqiaL>GFD@=>>BBE`fTTUOKICAAA@A@@ABCCEFB535H]S[dkldF9<=9?DFE=:@HLTM@=;8;CEEB6:HLJKMKA31C?:AEJH=;40//18>>=>MYQE>>??E^ek_GCKLPPF@LUURL@RaYY]`iXGVQA88889866555651,194.7ELJ;3@KGA>>FHB<94048;?@=6457:AB<>ADDBAA?9107:;965572/2@QQE<;9/+++.22/01///+3HQMJH@@??>>73:C=-/>B>::::87644:?DII>30.+))0566:<:64210///25997852/045:964-*)'&'+--*)))('(,-+(''%(+.146::;81,)(((((((*,07;:9878855667CMIC;0//-0.'*-26;?BHMME<993/126>GKGB<>LMC:9<=@EGKNOHEB>/)-3772372-/6>?DFFFHGGEEH@79965424864>LXbkmh\XTHGMNJ>530?FKTA/,7MZ`K./10//6AGKE@@<:4-13.-////0///0002344557:5/,)')1:<?ABCCEGGHHHHHGHJMPRUSPMMJFEDDGHHIMNONMLIJNPSSSSQSUVVUVUUTSSRSTUUUSNJJJI<;<;9?:89?DEFFFFHIIIGGFHNTF68:9:::9@INNE;8;:@N^nyVEYqxsfNJO[pyȜUPQLEA?===>>>;:=@ABBFIetphil_^QCDCB?>>?BACFGHSYPNKFDA@@@AAABBCEDA73C^hZXfllV=9?=9>DD?:;AGGLLB<;98@???64BNNLLJA88CB;>CHI:BN?;92///2>QXTNS[SI==>AEQicH7=DCABDHNMRKEAQZdha_d]MQTC;==<<;:987:;;7100.0A>=>ABBDD?7029;:887>=834@OK=6:80,,,/440/1330,6IOKJF=>FD:::9:<;;>@=8899:AA<8645986547:723558?CBDEA869951147985/,-/07;;<:9:553;?DMLA:=A@@:64564336640179559?957620./110,--*+/550044=MQMKKJIIGEA:>938A?35CF@@>;:986316:ELE6,/35401677;A@:5211000357878543579<950+))((+,+,+***('(+,+)'&$&).368894/0.*''''&'')-3=@;99>MSOE<7:DHF=+*.-*//),.15:ADJMLF>855204=FPVOE<7?IE:8;>@BEEKSF2-,)(*0523<;5/,.?]nvxujjseOKG><;?FIIIGHHHHE>8;976315;71:NYdmpi_ZWKHNMMD50,6AMVD-(1DRL9/1/.217AGMNH@994-01..--//////1224556668;80-*(*.0/1CURMRRZiXYYVV]__dhmmeZ\mqlmg^`]TUXSONOQRRRRPPQRQPQQRSUSRTSQRUVUVUSVZZYYYY[ZTRTVUSPNOONNPPOPPQQQQRRRSUUWYZ\^^__``abbbcddceddcb`a^YUTRRQPRRRRRRRSSSSSRQPSUSPTQSY^bbb^`a\TQPQQOPPPQQRRRRSTTUUUV]]\ckrsrqrrqqqrrrsswsdZWXX\[ZZZ[ZYZXYXXYZZZ[[[]\[]\[\\\]]]]]]]][[\^__][\\[]``ahegmomljehhhv}^TZ[dutkgfb][`cbc`^`aaa`[]a_`]\]^\[\\\][Z[\dllkpwmgkhhqjhqscamkb_^`b`becfjfeegf`[drxuw|zuw|{uvvn`_Z[dfhhjh^WUUWTUWVUc{zwwxut{ursnmnqojjlpvwz~|}xt}r_VW[_bbcdgjkeagtzz~~wzwiCsfBK\NMORUXTIYjfUybLKa^POGl\CNKTce^]\`ZTTVXY`{vhg[TVaebdi[[W\_abx^LTbj]RWbmoaXnWPOP䶄aOXhhesxpr`RMYŹePUXM{{cPYh]PS\\_]ZWTRPPT\a_]el]PP\jjg_^\YWV[XWYczy_[UVX[a^XUVVUTWXYZYYXXWVUUVXXXYXVTUXVTSSTY\Y_ml_SRUVVUUTUTTTSRSUVUVVVayte\Y[^aaa`__aYVY[Zam]UWUTSSRRYgfZWYZYTQKgybTRRSSRRRSROMLORVVVUTUWXZUPOZ`vrQLRROOPPQQONONNLLLNMMLJHFGR\`_^]\ZXVVWWWY^^\WTRQRRQPOQQNPWKEEGIKJJLQUUSU\[TSQONMMLNNNMMMLLLJJIHKRUSRRRSTUVUTUWZ[YVNIGFEEDGKMRXZZYYVPLJJIMMNPQQPPPRTRMIFFEFIKKKLLKJGJMNMLG@=>ABBCEGGGGGGGGILOQRSSPOMJGFFFHJJMNOPOMLKMQRSUTTTUWVVUVVUTSRQRSTUUQMJJJI98=A?@;9;CEFGHHIJJIIJHFHNSH:9:;;;<;;@GLLA:<:99>TtYWtcKKNZjaqϾnIRXND@@@@@@@>>ACCCCEERiffh`RQODBCA?>>@CBB=8?INOOMMLB@AAAAABBCDEA71Kpj`XbliYE9GI97<=879AIJJG<667;>;7843?LLJJHB96>@?ADGK:=G9U\C7?BAV\bt{4.?C9:JX__[L=981./02EWZVSb`UO?=?@BEYO<<@A>>;BW]TQIGKUd|x`ZccNHKFBB@>==;;97:==:3..038::?F@;>=9556:==<@CED@835999888???;:@DA4298/-..15512587319IMIIE;>GC86667;????==??>@F@<73552/../-379668@EGGDCC@=<><429AA@=67<<99;=<87843.7>>??=9;BFIEB@AA?<4202//12348=87;=86200.-//.)*04437;?INKORTMJHGFFFB=?CDBBGKKKKHEC?720137<=?????>:78<;8=HHED@;9:999846GI73305;=:456687AMJHGC>=<94225?HMLG=6;>;768::9:?INKKHGHJJB9697664135414EXckpj`\_VKJLNH<8667AJ=.15:@8/22-/658AGJJE=73100/----//0/..3456753468840-,,,+)'+?H>?QSWoXWWXYZYXZ^baTFJ_bWch[UUPNPONMOQPPPPPNPQPOPQQSTSSSPOQUVUTTSVWXXWXZ]]WPOUYYSNPQONOOONOPQQQRRRSSSUWY[___`abbbccdedcefeed__a_[VTTRQRRRQRRRQRSSSRQQSWYWTQQV\_ceffggaXQRRRQRRQQQQRSSTUUUWWWX[bnwvrqttnnrrprtuuyvndYVZ^]]^^^]ZWVVVWZZYYYZ[[[[ZZZZYXZ[[\[[[ZXY\adlnc[YXWX_d`_dkosrmhcdmrwtw~xfeddefhlkhdabffda\[]bcbba\[]cd\[[\]\\[]\XYZ^mpmszoagghrkirka^bdcbbcdcdeggkmkhcca^i{~{~wu}yuh]Zdgefc_jaUUTRRUWVU[pzxzwow}{sqqppopokgkuzxz~yx~~|prthZYXZ_bdeeilf`_aoyz}mVtAuԒk]PHNUWWQKSg’OJhgRKMMQPImZFLIKQ_hc`\VWWWXWUg{kcUORTW[Slv\YX]\]djmjPNYc]Z_flrpfWQqGRUP\pQMYjtp_TXRaͯ|\RUYXNb]WV_XLNQSVWWOKNPQSY__]dmZNQVc`a\\ZUV`bWU`eu{f`OUY[d^URTUTTWXYZYYYYYYXWUVWXXXURQTVTRQSY\\djaUPTVVTSTSSSRSRRSTUUUVUT^twdXX[ZXWXYZXTYbbfec[RQTTRPOOSaicXUYYXRGYy\SSSSSSSSRRQMJLNSVUUSUUW]SKQPkeFMQPQSTVVQMNNONNMMKKIIIHPbnmifc_ZWTTVVWZ\\[YWVVWXUSQUUPLPMGFGHIJLMQTUQV_YSRPONMMLMNNMMMLLLJJIHLUVTTTTTUWYWTSX\^[ZRIFEEEEGJMT]]]ZWTOLJIIMMNOQQQPPQPNKHFFGHIKMMNMKIILMMMKF?;=@ACCEHIHHIGHIKMOOPQQRQMJHHHHJKLOOPPNMMOPSTTUUVVVWVUUUVUTSROPRSUTOMKKHE=<<=>=?BJOF<<>??;Eq|un\ENNTbkZ>f͕KN^UHBCDDCCBAAEGGGDEC@^`dh[LFGABA@?>>AEC@?=?DGNPP]XC@CBAAAAABCE;=9CknVV_kdZG8EL>556557?GNNC4/28=>61234?HHHIH@32?@>>@IM89G;AB@@8=_O>Qf\eM:Ks*+FU?Fhvsno`>8C8.023BPSKOf^GH@=?@?ARO=@A?@B?G]h\UX]dmundb`LCGHFA@BA<87878;<:3--///0028976554568<>@FKE6/--..-.2669967<@EFFB:9::9889:::;96:B8),87//10486249=<946DJDDC<<=70++4;?@BD@:CKDAHD6-*074-,+,.,.7>=78=;<<?????><;;98;GPMKJGDBA@>=;45E>+4;4377:8776@@4,,/226:;6-*-./148:;;8/&&(&)11,(),--*'()*(&(+)&$&,:A@805LT<.,*('&%%').>B?W~pl{wqdF2-..1359<>;9CKC;=@@A>7011-4CIFDFMQD2/4656@LQQK<1.,*''*-,,7EIINE.->85954466558;<@JQOOOMMNI>4123664112200>FF`saV`g_LFGHGBBCC=;4+1857:3153,,326RTUlYXXXXYWUUVVQJEGOQKS]YRNMLKLNNOOOOOOOOOOOOOPQQRRSQPPQTTSUUUVWWVWYZ\][VSTW[YTRQONOOONOPPPPQRRRRSUVXZ^_^`abbccbdeeefiihhd_]^\YVSQRRRQQRRRQQRSSRQQRUZ[[YVRQT[cefkpncYRLMOQSRPPRSTTUVWXYZZ\]bnwrjnvpbaimpsruvux{wj]WV[cdceea[XVTUWXWWXXYYYXVVZ[VTX[ZZZYYXWY\]^lug]^ZVW\a_\\^_`ciidbp{v~`[ekpwym`[]hssmhcceeda\Y\egge^\`_ce^\\]^^]\[[YZ`\h}{uzlX`ciuy~ywwj]acbcdceghkomkjjebk{~~|z|vmZ^ljcdc]baXUSRRSUVUS_t~||zrny}{}trrqqquwrlmuy{{xh]cmoj`dfaZ]\\^`dfgjnfaa^l~zvtzz|{[A˖nXOPY_ULIWb~ENTTMPLLONG`tOGMNNJQ]imbXRNOSXDpq[NLNOPQSYeTGNU[[^aavs]W_]Y^jqhjvncOzBZ_WKLXOSg~[OoeP̞cSZ^WTVPSn^WOVSPQPPSSPPPQRRSTVY[agVNQU[[c\]\X_ikegkqv|}fR\\ZfaVSUUUTWXY[ZYZZYZYXWWXXXXSQOQSUSRSY]ac[VUUTTTSSSRSSRSSSSTUTSSSSSXnr^WVVUUWXY[^eog_deYQRTTQPNPRV]ebYXXYWLQwwWSSSSSSSSSRSTLGKOSSTSSUWZTN]SZsvTOPRSSTVWRLKKLLLLIFGHIIL[qukgeb_[YVQNNPTVWWXWWWWWSNOW[WMGEGHJLLMNPPSSOX^UQQQONMMMNNNMMMLKKJJJJPXWTVVVUVX[WSSZ_a]ZSKGFFFGHJOZ]][YWSOLKIIMNOPQQQPPPNLIGFFIJKMOOOMKIKNMMLID?=>ABDDFHIHHIGHJMNNLMOQQQNJJIIILMMOONNMNOQTVVVVUUXXUTUUUVUTTRNOQRTRMLLLJC?AEHHD<9@FGGHHHIIIIIJIHHHJKE=>><<;>BKJFHD;:=<[hHNbh^SC<5:E:74457;BII>4149>:2/159@DGIJI9+2@A<7;KL82H=DB9737or`mgeF)/lv?9BM:Bk{qtlQHVSD63;KVVSTh]?BA?AAAFd_=;DCBDHMWd`WZ^k}ztc\[KEHGFEGF<5335459=:2-...----.155444558;<@FLKC:64111-.1223438@GHFE;9><:876776657<>9+)02122259648>A?>:8?A==@>:2+)(/EDCCB@@EGA:=A?=?>;@@8.)*-0/.06=<==>>==><68CED=:98:845421222100//59654433540-+*,14;FPK>?PXVLJJIGA5),>IIJGBCA;8;??>>>=>=<94:ITRPOMLJIF@<724<8+3;61202:;:9>:/./2568;91*,,(&)/45661)%'''-51'&*,+)*')+*('(*)&&(6II<;5+4QZC.*)'(*/202@?1;`tvoilcD*'.02679;=CKNF<=DFC;4-+/15=EKJEJUM4-4623?@AD;:DFGGHHGGHIIIHHHFGMKB;;;<<=@DSP?>><;:?JNR[pvhOQIT\J;ALJpߞPQWLJJMONLHEEFO]f]L>HlwsyqZFA@@@@A?=CJJECA=P`VX`mhRAAAAAAAABBAG?=;AOCLfk]UF=1396422358;=<9855:;50036<@DHIID2*6B=93=EJ:2<9<=73,9{~faI5-G{aFCD;;NivwxqcUTWN76Q_]YPLe]=@GAGPICeb<=HHBEMROW]XWXf{xyxnc`\LIJEIRN>.,/23218?:0-../01554567633369747<=<:8767982./001302;977776536:<>8.,25546754699;:4-)*3>B=8@NMCEH=>G8*,.6BF>/)3843579>?<8:DIIIGD?52-*-5:83/6;=>??<89:9:8864249999;=;74421111.-04567530/230+,0.1?JE51CSSLKKIG=-%9PTRPH;6;?ACFFFB96>?>>=745>GGGGHHHHIJIJIHGFHMIA:9:;>AGJVS>;::;=EOLOWZgdnlPUQMLHA@MO@nsOPJJLNNOLEACCGSb`KBGhwzzePC@??@@A@=CKLGEC=NcW\gjXK@@?>?@AABDAGU[YUVTS`g\XC524110001357789:77:742247_X=@GCGRNEVT>AFGA?GQPPUW[_^epxsggkaOLJHNRC0*.35413:?8/.../05=>:89;:3147830243/./005;=90-/1/0.-8FKHIB@EB>;9789976668>@:9987666213;FOPLHFC=632/-,*-:FD;5/'+0<:@A<;AHLMKGD>8=C=8;=/6E?6683/7C?5-09<===;8::;;50-.-2986:@C@943222343.)+29:86129:5.,-)*7B>0)7JPMLJE?7./D]_ULC3,8DFHHHE?65=AB@@@???>??@?81/0ARVSLB>DGA:99865.,2420131/1322213:957855:903AC82465.'%(+-23//4877511000-*))()8JG63<;;>>;7D[WE>>>;52293)-5=IdvyzusR,).042204GUSJGHEBDDEEA:97447=HI:39=8446??81*%'(-5730.,+06747964-&),))+*(''')*-4=?@R|\[YYYWTSRRSRPMLMMMOONOQRRQQPPPPPPPPOOOPRQOQRRTSPPQQQPTVVXYZ[ZYY[\]]\[^a_ZVSRRRSQOOOOOOOOOONPQQRRSW[^_bdcbccbdeddfiiiiihe^WVURSSRRQPQQQQQRSSSTTRQSUVY\]]^__^YVY]a_Z^jk_VOLLNPPQQPQSUUVVX[[\]][\_`djdY]nusswvvxyzz{viacgggfghg`VTVVVWXWXae_Z`eb]WS[aTVZY[_`__cfeeffed``cdelvvx~saduxjhnZ_efhkvqeeddgikokbZXXZ_linsjgihhgfghijt~~z|~~|ztiuwrpmjhiikjhhiggjlhltWinY\gkikmomid^YZ]ZTSTQUdoqrvywuuupn~wxxx|{yzqWSYYYZZ]]_`bdedeeehnkgdcheVbiuiegZHDMOPHHUZVOLKKLKJJLNNJ[aSPRRQOOMLMLJmJJLMOQSWWYdieb]OJNXaPMQSRSQPNMMIJ^z|ia\[ag^iuJ]ovwo^NMVokeZEUVaggg`OY[YRRQXୀď\kvZV\ZYLnoZXQRPOPOOOOONPQOMLMNNNORTST\_haWXUVW`bTkÄRifQS_`gl_ZYXWUVXY[[[ZYYXXXWXXXUSQPNMPTUTUX[[WVVUUUUUTSSRSSSTTSTUSSQPPPPNPSVbmvug]YYZZYTLQ^USVTRRSTTTTRPTWUX^`^]ZYP`v_QTTSQQQQQRSRTUSLFINRSSTSVTIIMVjsj]WWTTUUVWUNJJKKKLLKJKLMNLKVeifc_\XV[]ZTMGHPSSTTQOLJLORUY[WNLPRRQPQOOKOYWQQQPONMNNONNMMLLLKJKLW]Y\a_^^_^\ZYUU]fge^VQLIHHJP[cd_\YWSONLKLMNPRSPPPPOMMJHHIKMNNOPNNMKOROMKGC?==?ACEEFHGGEFJLNMJKMNOQSTPMKLMPQRQONQRSTWYZYXWVUTTSVWVUUUSSSQNNNOOONNNI@?F;89:;;@FIPVR<;<=BLTZIEJKNQZ~nLJIGFEFGMN=3Χ\ILSTOKMJC@ABIS]]PF@Zqm]F@BBA@@AA@=BLMIGE?GZXWdaI@=>>???@@BE?CfzzxtxldaYN926=>=<:401368:<=;::976766GJE;9Qmomnpk[PG;@AB>:?JOPRY`_MBWqsdfnaNJKMOD4.1687427>?81/...1:@@>><>>8.3:855421/.--.2:=;4-01//,+6EKHLHDFCA@=:99:::866:?EID9444310.5GTTI?<:8651-/203=DEC>>C@6654:=1(*-7IQUS;(+5?B==GJ>7>JQNJFC:37=;79:>>=<;;;:5.+*(17639DH@8433323442.)-762238<;5/-,*,5>;.)/?LJJF=63//?Y_PDB50@CEGJG@:8=ACB@@@@@@?@@@?;2-/;MTNA65?FA=:4366314420.+)()**/2/274/01473-+5C>313794*'),0234588657554451,*('0AF;35:<<:;FH8?XS:8;4--03-(1<4#*FVWhqinpkfL/..,..)'7LPJGGECGKMLE>=:3.11.00+,5<:8979==<:873-//.2430-//2454,/??0'--0;???@@DEACD926BKPTD640/-.@F4+205Ri]B1+--,0:GJC9*&)''),049<>=:7+0>==:@A=?;/)%)3;83/,+.24572,,))--(-3-)+,+),36:=@Y_]ZZZXUUTRRPNMLLLMNPPQRRRQQQPPPPPPOOPOOQQPPPQSRQQQQPQSUXZZ[\[YY[\]^^^^_^_]UPPQRRPOPPPPPPPOOQSRSTUX\[X[_`aabbdeegijjjlld][WTTRTUSRPPPQQQRSSSSRRQPQSUWXXZ^bcaZRMKLNOUbmneWLKLMOPPPOPRSQQTVWUTROQQPRVUTX_inqtvxz{y{}~zoghhghiiijhcZVVWYY[djha^adgcWUXVUUUWZ\^adddgjjihhffgillk~pu{nejjb`m{oZZfjd]gi`bcaabgmh[WVY\fjifddfddbdgfeo~yswyu~{uflnkprtsspjijklplkkklnifvkU\mm^Z]cdeijghe]YX[_ZSOO\mtrqtyz{wrrqt|w{{wuwtspdWSVWYZ[\]_`dfeefba^gjcdmyuTWdkveooLFLTQQTWRNLLLLOUQLLLLOSRQTUQOOMLLKK[OIKLOSSX]cglb[ltg[VYY[USSRRQPNMNHbrdgXXho^^tTet|ygRPPT~t[Du[SZ`beph]Y\XO^“Ѹis}^PXO_uXUQNOOOPPOOMLNPNMMMMNNOPPOSXeqc__\[Y[[`o]kmXI[dem\XXWVUVVX[\\[YYXVXWXXVSRPONMOSUUVXZYVUVUTTTTSSSRRSSTUUTSTSRRQQPNORY]cjqqg^ZWVUSHIWTJQTSSSSRRRRSTY[Z\^^^ZXMNX[SQTQQQQQQRSRSURPJLNQRTTTUSGIKUq{hPIOSSTUVWWSKLMNNOONOQRRRRNJNX_`^\ZX^b_[ULHLQRSRQOLLMKIOUVQONPQRPOOMMJO[TRRPPOOONNOONMMLLLLJKT^\[dhc`ac`\[YUV]fgg`XQLJIJOZegfb\XVRNMLMMMNPSSPOOOONMKHJIKMNNNONNNNOPNLHDB?>>?@BEEFHGEFILNLKJMNOQSTUPMKNQRSURPOQSSTWYYXXWWUTSSUVVWUUSRRPNNNNNMMKIFB<=;::@DDFJJHGGGHIJJJJJJIJJJH;7FEBBACCB@No|}cQ:34;KUVXN901468<==<<<;;;:88<@?=?A>=FJFJ?637DG41102:48Nabdghic_]SILVP>F^`LCE@FTK:==>=>@B?;<@DFHORJ;1:L\ahhXEFMQM>679::821;@=61/./028=>EIB@CA22;>:63111/-/038;=820101.,7FJJKLHCABCB=9::;<;:::=GNI;0010/0.0ETPD<95434568::=@BDGGGD906:69?9,,-3ARYVF99;?ABFOSD65COOIB<736=>735?GB97<<847;9@B4159=JIFDFD>73;DFECAAAA@?@@?>=7//9KNA4,.9EC=7-,7<;77630.,+)''&(,/12.()*,-'',460-013::0('*0347786446768864/*%%1=848;;=A<8@KI7:PM3*(&'*)%(2=8()41+-8MVVJDA?6/20010--?PLFHF?BLQMF><@@8278/)++-4730026:?BD@1'&'(.683524:56@DIOD<:/=E72/.24776;AET]RLNPPF@GONA1-3:;=FF@BD?66FRB1*+0./6EK?/%,61,,36449??>?807;:8=>>DC8/'"*9=82,+-./6<71/))/)'390/55.(1?@ABCDEEFEFHJLKJJLMMORUVUPLMORTTVSPORTUVWYYXXXWWVSUUVXWVTRPPNNNNOOMMKJIH@8889<>AFJJIGGGHIIJJIJIJKLKF==FHFGFHMQI@DNZabbad]NLH?<=PQB=CHMNNND;9;>dTEZlmdYLDBA?HYapytcUF48AEFBA@@@?<=JTOKJHIIHIOXVD@=@RPE@ABAAFcgnfI.459K[ceT7.2467<=>>>==<;:989<@?;::=HNIIE<561137=CCA><:7766522AV]UH?AKRND?=;:94.0<@:51//122468DOIEEC:59<8101/.-/0037;>:50./2117DIKJHA?CC@@>;:;<<<<<;:?DB;3.,-,,,,8B@:7986227:<>?ACEGHIMLB75931;90016CTVJAHRE6>NSVL<858ENI:0124881+,8FA57=<8577?H94/1.+)**,4::48BGHFDBABA@@@@>?<409FB1)*+4BD@>96;>=:963-)+130-*()-0/,*++,,,0343.,/34794,)+256789644689=<874+'(/454426=B<8<77756EL@=B>7.*0;803?A@A:.28;44:=?BCDEFFEDFGHIIIJLMMOORSTSPMNPSUVXUQPSUUVWYYXZXVXXTUUWXYVTRPONMNOONNOLJIKE<8998:>FJJIGGGGIIIJJIIJKLKHFMTQH@@DGHEFP[``_^^a\NOQKF8;DA?CIORSTE=B>I`kpXGQ^dg\MBBC?DOaw|zt]=8?BBCBA@@??;?NVPLLLLLF;FXSAB?@ZeY@;CDCHYQUoyW>0855?Ra_I1.2467:=@@@???=95447==98:>>=::=841000./0002379742/14666=EIE:27>96<98898778889555572,++**(*-5:89AGD@@=:@DCEINPMPRJ=550/43225:IQIA@ITM:>TWK5,488478>D9>><:830.,+-/.4=@@B=32689>@?>9.+,*+23./4423224311101;<8=910471++1:@8,1>BCCB@>?@A=;AFHHFDBCCA@@@?@?837>7++-+3@CCHKF>;=;973/--5=<5/,,.0.-0256678688/)0841571-.57999;8338;<@>;96/+,/394+&.:?;9=??<4.1GN2#'02-*-0.+040,))27AQ4&(.:F@520/6A@43>?>DB>DOVPCBEHPRLFBB<1/1224689;?EEA>:666:==:;;631148633DB.,(,-180'2CFMX`gcNEMD++:82/14?IGEC97>7.'*53+,7??=8025;418?D@79>5&':B:.*-*%-@JH<055(*478:?90Fs~wbOfWZ\YXWUSRRQOMNNMLLNQQQQQQQQPPQPQQQPPPOPPOOORTVWWWWVTRRTUSSSTWZ\^`aeedca``^[[ZVTTTSQQPONNNNNPRRSTUVWWY[WUVWWY^_]_dedfihghfYOPPOOOPQPOOPQRSUXWTQOOPQSTTUVY\^^]^`ege]TPNKJKMMMKJKLMNOONNOQPOQRRRSRPPNOPQPOW[RRdojgqz|||sollmmljimmg`YUSSX`jqnklnof[UPVih[WSTXWVYac]_jtojjouwyysu{kkni_[]``^`adb`bfimjiqrlid__]cw{nikkjieaaaa`^`eeiuul|vdbqvzzprrpm`fnj_Vgrttsqrngp{ZVYW^a[X[^\_b`bcb_\ZWe~{vxvs{{x{}xwwtxvknonppga_\[]^^^^^_fggdihne__Z_ijg~{[crrmsvjecZ^_ZewvuwgRJJKKKLKILLKJIHGEEHJLMNMJHIKLIHLl̡wk|yV][QnraQKMMKKKILH\yVi_MYk~nPKTeh[RTZdu}lUTlY[ppf`dhe^X]ipnbdŚnr~wpfߢmiqs[OORRTUUUVWWY[]_VPNNORSTUPPid[XZ^cilhpfQNkwiq|_QQRQdbSTTUUSQSY\\[YWTVWXVTSSSRQOMNRTUWXWVUUSSSSSSRRRRRSSSSSSRSUVXWUSPMKVnjgmjih^YVWVTSSRPSXXWXYXXVVVUXhqpqgZVgsYMfiQMQRRQRRRPRRQQPSbdWSTTSQLFMNUcULLPOONLKJKLKJLNORUVSNLOSURMKQ^``\XXcrpdfcTNOONMLKJIJKKIDGU\YSMJIJKLLKMYXSVURQPPOOONMMNMLLLJL_idfnkfjtsja]\YWY]adec^WSRXcmpoojd]YROMLNNNOOOQPNNNMMMLJJLMMMMNPONMMNOOMHDA?>?CEDEFFEEGHGGGHLMMNPPPPQQNNNPRUYZVRRUVVVWXYYZYWWWUTUUXXVTQPONMMOOMPOJGGJF?<<;88?A??AGQY[YXZ\`[JEMROAAB??BKPVb_E=?CJ[]d]JEGKPNFCBBA?F_x{{rR89?BBBBA@???=@PZUPPPQQF6ASMHMC?]ywR<9H`snI=<:526I]X@/04567:=BFGCBDA91123686689;DID>9778>6//8BHHC959=??<733467;FNQSRHCFK`zyqg^YWWXXUTSSROUbTAEE?@A>;89<;:<=;79853359=CFFC@5+,7;309@>?BEEDDD@:55431111//112345767:::67=C@85770.67752000025746535742455856>CCCIPPNKC>DE@@DNSUTTK6-,-.,-/02;FG@@CGLOGGTM5)*3?KQSG21::>?;97-)14/4<=979889?EC:468655589:500025724;>=:865679C8-.354/))5B?<<@CFJIEABFIJGEDDDBA@@?@?;89:5330,2??<@GD:9=;6421114763/,*,-+*,/48;:77>A5-4:4-2643358;;<;8237<>?>9432.+,261+'+5<:;<<7331*-CK5$2;0*,,,-/0.-*&-85LE()+8IJA?>720.,2>A@C>9?IPMA1.2599@A3C\]dhR<=@1/;93..9HOOLF><<6/('**(*1;<976467449?CC?AHI9'0>>5,+*&)7ACA=8/&'19;<>8Cjuj\ST`OSXXWWTPOOPNMNNMMMNQQPQQQPRRPQQQQQPPPNOPONPTVXYZZXUSRQRSRQQRSUX^bdeeeea]__\ZZYWUUUSRPNNNNMNQSTUUWWYWWYXWUXZZ[ZZ[\\YVTVVUUTOLNOOOOOPRQQQRTWXWUROPRRUWTONRX\[\`_]`ii_UPOMLMMMJJLMLMNNNNOOOOOOOONOOMNNNNONONLNTXWU]fnvwsqvzxurnllnlkmnopnkgeghknmljkklifXUruec\WYUPPU^\Yahhfecips}nion`Z^bb`]\\\^`bdgghosobWZ_ftnmmmlf`_^_aadlrwyvkzznd``qr{w`[\`]`hnpssqlinwa]_ZSX_YTX]ekkfa\\]\Ygxvwut{}x{~yxphmnnnnjfdc\[__^^`dgfedfh~|kc^[cqcivknqqqqig^V]eYOVfsvwwiPFIIIIIIGHKKJJHGHHHJIKMNKIJNPMID]ᶒy{jNOQHV^NMNMKKKJMUWQ{sMY[OTWusQHS]\TV\[\m{alYcztkiovreZZ_imu๗yԧeficrveUTSUYZZZ\\^baWRSSTUUWVPY`Xcd_bhppihZPUY~q^cRSUR[fSRTTURQQW]^\YWUVVVUUTSSQPOMOTVUVXWUUTTSRRRSSSRQQRSSSRRTWYYYYVTRNKZnjmskeicVUWVTRQQRTX[[Z[Z[YXVTW[YW[][WW^PRkaLLNPSSRRRQQQRTQZnaOPWWQOPLOMMMLMNPPPNLKJJLKJLMNOQRRMLNQTQLKPWZ[ZYW_mqgflVGJNLLJIHHHIHEFKUYXRKHHIKKLKNYYUXWSPPPOOONMMNMLLKIUifdkqnnx|sha^\[YZ^`cfe`ZVXaotspomf_YROMMNNNOOOPNMMMMMMMLLNMMKMOQONLMNONKGB@??ACEFFFFEEGHFHIILMNPPPOOOONNNORUZ\WTTVXWWWWWYZXWWWWVSUVVUSQPNNNNNNNQNDBBCA<>@<99:CJKIGGGGGHHJKKJIJJIMW]ZRIFE@;;AFMRSSUZXVNE>@FLMJC?>HOQXedJ>=BEIKHD@C?D^vzwhH79?BBBB@?>??=@P]YURQSSB4M\QTWC@]i=C?DA646?VvmHFIF:415J\T=/298878=GNKFGHB945533444642;D@;87<=@31/5@FII>67@B<8335578>FGILGDC>@]w|tjc[VWWWUUSQOKN`dM?>=>??=:::9:::;:=>;52478@HIG?:EIC;;>=<>CDBDKJ=79BNWXVO9+.0/+,/237;;;@CDGIMQK9.44/3:;66866778;?A>7337::8:6331135599776572-+-.2:<5440.++)*6C@:@ILLNOMHDFJKIGEEDBB@@@@@=975554203:5,+1448<;756530-,++*((+,-+''*07;9:CGB95:820233026:<<;8536:>?<51240+,/0.,*,4;=<951010/++DM;560++++,/100.)*4*@??;9;28C=71,.5;BD"/O[_bK93.,29783*7MNNQI=8961/-*&%+259:87776536:=?@?BKH5/675-+,-+*0??>Toqni]RPUUPPRTUUSPOOONMLLLMNNOPPOPQQQQQQPQQQQOONMOOORUUVXZ[ZUQQRQQRPPQRQSX\^^_`]YWZ[[\[XWXVTSRPNNNNNOQTTUUVWXWUTVWWXXYYYZ[YYXRLKKKKJLKMONNOOPRRQQRTWXXWQOPRSVXUOKNQPQSTTSUZ\YUROMMMMLKKKKLLLMNMMNONMNNNLMMMMNNNOOOMMNPQSSTTVZ[^`^htlipkefijjmnopstsqooomkjjgddlfZhokqm`[WUSS]_YZ\Z^ge]i}}minm`Zadb`^]]]^`adggipqh_[[imchhgfecb_]_`_jtxxusvrsznheco~}vykVZ_a_aeiqyxuuxui\X^^ZXX[XVZY]gqpbUW[[i|xwwuuy{z~vxxdcikkihgffgb___\]agifdbfi}}vpmbidcnqpiiptcf]IOdhQW|rvxaLNQHFGGHJJKLKKIHIJLLLLLKHGLTVKGDoѡmOJKIFj[INNMLKJHOliJnfQWWOSJ\iPEQZ[Za^RLR_sjR]y{xx|iZZTUvknߡz`kcXdr~ud\]bccdlh`^ZWUVWVUVWWSZZZ_caerwpj`UPSrShSRSSSdURUUQQSRW]^\ZXUTUUUTSSSQMLNQUVUUVVVUTTSSSSRSSSQQQRSRSUW\^]\[XURNJXgisvf^hhVTWWTRRRSVX[]\\[[[[[\[[XVV[^\XWSXbTJLMPRTTRQQRPSQVfjPQNTXTRSPNJJIKNRQRRPNMMLLLKLLMNPPPOOPPPOKJMNKQZZZ_ekkejcLHLKLJIHHHKLKOQUYYSJHIKMNNMOZYVXWSRQPPOOONNMLKJIMckkoqtpv|ukfd_\\[Z\\_deb][`lvytpomf^YTONOOOOPPPOOONMNMMNNNNMLMNPQONNMNOMIEB@?@CDFGFFFFGFGHJKKLNOPPOOOOOOMMORUXYUTVXXWWWWVWXYWWYXVSUVWUSQOMMNONNOOHA?>?>;AC>:9:AIKIGGGFGHIKMMKJKKJOZ]RILPJ=8?GGINONPQJD@@?;;BLLG?>LRRYckV>;=<<<=BA>CJNUVOEBDBBVy~vaC6:@BCBBA@???=@O^[URQSQFHciWVVA@`vL?@BB6424879:?C@??==A<=Ywqglqojb[WXXWWVTROLHQc\?49;<==<:998778:;:853368?ILLGEDDD@=<<=;3.4@DDDDB?FK:0;EILNKHFA22?BBA@;:DKD==<=?=87?><>><;94++0215;<;4-3;@;4+,8@?<<<;9538>>=<;<=@C@=;7668:;;=?>:875,)./0232/=;,+))*2>DDDDHICGJMLFGJKKIGFDBBAA@?@=7/-//.0242.(%)07EIG=49<500221379::864248;=:42341../.,*)+29;71,-142/+'*?KE5+***+++*-13/,,&,I9:]j`]_ZUZju_>48<<9875:BNXZM@KRUXWTRPPM@68><2035567:>ACC@G[aZRONKB>7298.(,.49<=6220,+.0/,-99.09A?4428LD'#7MYXIA>6017:AA05LMLSN<5971240+),016:8757::3157996:DD5.13/-,-2/(-ADZqle_UIGKCQPPRSTTRQQPNMMLMOONNOOOOPQPPQPPRRQQPPOMNOPQRRQRUWXURQRQQQPPQRQQSTUWYWRRUVWY[XUVXWSSRPNNOPOORTTSSRRRTSSTVVWWWXY[[ZYYXQLJKLJHKLMNNOONOPQQRTVWYXRNORTVXVTROLJKJFGJMNNPRROMMMKLMKKKLLLMMMMMMMMMNMMMMMLMNOOOPQPOQQSVTRTRLNSNWjcZdcZZ``dlpnlqtsstsssqookhdgkgcchonf`][ZZ\a`^\W`ovsp}rilnj^`ieagib][]^]ajmkpm_\^`sxmdacdda``^_`iyrqukfotstxnkoqpvvqzx~k`_`__^_fs}mU[b\YYZY[ZZ[[Y]ffg[Y`^zxxwuwvx}|}{|n_cheddffeehgeg`X]bhkjfbejwjdadqnnkknrsoaNJXiWW~y|x]RZRHHHHGJKLLJJIHIKMOPQQOLKPWVONIiɫtugIJKLEQ]GMNMMKKIIfeMhoVPQPPSLLgeRLP[_bVKIJIP`nlX`|gXWYaxrqsxzɼy^fcP`SQ`gd\X]aglph\XWVVVWWUVVVUVWW``rxrgYTHir`x|dTSSSRdZSSTdeWUX]]\[XUTUTTUTPOMHKQSUUUUUTVVUSSSSSRSSSQQQRSRSX[\\\\\ZXRKGXa`qr]Zeh]YXVTRTTTVZZ[[[ZZY[\]Z[]]]^``]^_\]WOLMPRSSRRQRPSP^haSVMLW^gaOMLJHJRVSTURPOOMMLMLLLNPPOPQQPNMJIKJGLX\_c_^gigkYHKKKKIGGJORUSRRVXTJJLNQPQMOZXWZVRRQQQPOONNMLLKJXlmswvtrywlhjd`__]\[Y\adb_ajs}}wsojd_[VQPQRQQRRRQQQPONOOOOPNLMOQTQONONNNLIDB@?ACFHGFEFGHFGIKLMMNOOOONNNOOMNPRVVTSTXXXWWWWWWXYWXZXUSSXYWSOONNNOOPMHDA?>?>@GG@:98AJJHGGGFGIJMPPMLLLMSXOBDMRK<9GPGFMKFEB>=>??;9JSTUWTNGFEC?DayxdB7:@CCBAAA????BN]\UQQSSYekiZMN?@eyS=EABCP^fg`UKHFCA9637IWH2/:EKHDEHKNQRPIAAA@<865554122358;=<=A<107DKIJC:8D=2335:;;>BB>:778;;8Jg^FDQ\ZVYZVVYWSROIFCDQ]K34;;::97754444574322368@JKNONICA=:8;?>834;AC>3.4:83125:6556644456;BDB:9915DD??==<;77@GEA><707IHAA?<>?706616<=;95,*2889=>@;/13046426=ACDHE=;;;99;;<=CEB=94+)-157834B=*'+-1=HIHHHF?56=GLGHHJKKIHFDCAA@>?>9/,,+,6;4/.025:=><>=<:982.-+*)((*01-+,-..028@GF=58:2-/257:<<96433347987532212111.))+/360**/7<80*((+6GC-&'(*+.159;7/*)0<157975439HRMJPXfSGRRSTIKK:/17622118EF?@CBAB@LUVZYYVPI>8>D2#/54446/,+)*)))),5CJIJNPOIHKO[]C28>IMJKLMHBHKGK=4GSRSP>4<90133210-.487769?B;678:835=:,*+,,,./36649=3,2/(5AA<8:Wqj]UJ=:83OPPPRTTTRRRPOOOOOOOPPPPPPPQQQQQRRQQRQPOOOPOONNMNQSSQPPQPOOPRRRQQQRTTSQRTVVWWUTVXWUUTSPNNPPOPPPPPRPNQTSRSUXYXWY[\\[ZWURNLMKIIKMOOPQPOOPQQSUWZYSNMQTVWWYYVRNLKKJIIJKLOPONMLKLMLLKKLLLLLLMMMLLMMMMMLNONNOOPQPPQQRUSTXXQMPNP\_WTUUYZWXahigmststtttqpomkjhinkfeffeb_^\Z\`da[\kyyrwxokji_Ymyc^pwaY\^]\cmrqoia^^_j|zxw``acda``acdtsheihjnopmjvwmnspjpxzufq{uneVX^]]^hw}|eYguoge\TVUUUWY[abmobYf~zyyuuwuqv|yv}tgfighhklmgdiljb`fgkllkhc_f{`khiwqt_Zeitr[NLHVVYu}s[WULHIIIIJJIIIJHGJJJNTWXVUWWQNPPQP߰W̽i\XGJKLIOb[JLMLLKKJPb\M^lTPPNRVTPf_KWd]PMMMNPPanikjXTX_YQg}÷`quj_\VQHumROQUZRLOVZc_UWWVVUVVVUSUYWVOg`Ujyxk\OJ˽kXifYTTUTWeaRPQepZWY[[ZZXUSSQWZSLKKKOSUVWVVWUUUUTTSRRRSSRRRRSTSRW]^^[XYXZVLI^\WjgYY``_]YTSRSTUWZZYYYYYXWVUWX\^\[^][[\^`\VRONPQRQRRRQQVicUQRLI[isoVLLKIJQUTTUSRQPONMMLLLMNOOPQQONMJJKKJMW]cf\T[dbd\KKKKJIHIMPRRQQOQSQLLOPRSSPR[ZY[XTSRRQPOONMLKKJQhqruvvuwxtopmcbcc`_]\]_a^`gqxzupied`VRUUTSSSSSRSSRQPQQQPQOLNRUUPNNOONMKIDB@?ACGHHGFFFFHJLNNNMMOOPPPPNOLMOPRVVSSUYXWVWWWWWVUVZZUTSUYYWSPPNNPQROEAC?<<>?EJE>;:8AKIHHGGGHIKNPPNOORNJE=?JPQMB@LVJCFG@=>ABBB>9989=>=<>COTbxkHF[S?>?>Pa\UUQJFFJGDCCCkzg@9;@DDBAAA@?>?DO[\VQSUR^iji\LK>Fk~aH?CA@AMZ^hk_LDB<<8635DN@/0:CHHFHHJMSWRKGFDB<:87885243354568=?811:HLIJLA5?:2347;;DHJKHDA?=:78:;=@>>B@:5259984/08DA?=;:?>6331//133235642112330/48AGHIA;536;87:71.---/242247898/*.=GD>?CBCE@7:C:,+/:FA9;@A>=<;98742124567;;<<;7..286457:;98@HGCDEDC:5=@>?<8:<72/),2:=435/+0578=>>>66=F>31.5HPLKKI?2-..++6@CDEHB;;;::9:::<@EGB:31/.178613DC-',7CMSQKFCB@<89BLIGIJKJJIHECAA@@@=50-/17AA;778BEC@>88>=59@=83/,*),/44//9>@>955652,+-378;@@=952597795452/,+/453/,,-./..279:<4/+*+,(7H@.((-6FMMKIC826879GQX^`[WYZ[ZG6787994.0EFR[F<>2,/55230/5AC>?A@>?=@EM\\Z\]ZPCAE:,.---164420-))*)+5AHLMMOOMJOSW_TB?=?BBAEOQNXW?<9885/.32*()++.313860121-%)/6>@:/,;;<>DE?<<<:AKJHIIHGHJLNPPPPPPLB;:EPQNOIDLUKAEGB?ACDEFB=;9888:::;@EQol\ceYID;HbbWOOH@=EOONPUQ_yY:::AEDCAAA@?>?EQ\]YRUXNNW^_XSQ?LovXV[DA:12;CFDDEGJNUUPNLJHE@=<:997763331105>=521=LNJKMA3342459<<=BB9455338<77676BU\ZWPOi|qdgf[Ya[B377569::73.5B>6423:94342002232234300/1357578:?B@88844976640.-,-.0/---.2773458>;59ACEH@6<:9:;;:97547889998:;<8-,048=FLNE;:CIGEKPRRL@;:59943343/+,/45,.20..037=?>>;?C?8678789::9:AGG;1265355403GM9(,>QWUTOC<@ACB@GKGDEIMJJIIEDEDCAA<0+*28?EA@CA>@DCB?87?>16JI<72.*),132-/;EIJE=9;BD>71.+++-178:=<:88:<;::8665.+.45420.---**.4;8420-++-01,4C@-'/8L[[YRL@;=?77I@1*5PQ?844@RG331+.44220-/59@A<99::>@;<<;;=GKJIIHHHJLMNPPOPPL?8;BIHKQLFMPKHMLECDDDEIKKLOK@88:;<=9=cq{ud[C?Zg^QHC?97DY^XX][]kD9:?@GS]]]UW\PBDGECJMBGfwi`udD@@[cY[^[RB;<8433468997;=CA@BDHKORPMNNLKIGD@=::;;63321105><422=LMJIE>312347:;<=BA7234338<77779G[a_YMZ{tjs{mabS94>D?63323456544323341/05=;;?@>:62/29?FHG?<966:999714<83/0//057543344433453100039>>878;=647733765520.----..---.2524>EC;4378=HI<6;5*.1//5>>8:==>>=<;:;<<:=??>=>;;<8.+/9CFGIGD;:EIGGNU\_YE57:73012110--0235631--,07>>:;<=JXS=8>7CCA?>@?=:424578878?HJ<-066423203FRD./CV[VSF64>CBADJF<<@BILMNOMJIHFDA>6,*6>DFFGMI@?CBC>99A>09UTC;81,*+--+*.6?IKKC<>B@:3/-,+*(+4666788;<<<;::;::500453--00-**,/3540...,,.02/)5;0*006JU]XPD=?>969:<>BJWXLF=33567:>?85;=4.113676650;?0//-034320/14:=?@=9769>97LYZ]_[VTQ@32.,4<6/+///41),:CJQPE=>AFFDHLQTTURMGDEHONQaR0(+**(&4LH-'+(*,,,.//.,()3CIJIHB9530+()*()**+0BE1$#%&)+0CNA67@@5/-/13550)*.NNNPONONMMLNQSRPNMOPQQQQRRRRRRRSSSSUTQQRRQRPOPRPOOPOOOSTSSTSRRRRTSRUWWWUSTUUUUTTVVUWXVRLMNMNMLKJKMOQQRTTTVVVXZ]]]^`a]UQSQIEEECBDFGJKLMOQQQUXWSNKLMMNOOQTSPMIGGIKLKKKLKLNPRSSSRQPONLJJJKLLKKKKKKLLLLMLMNNOOOPQRSSTW[YXWSQSSRRRPPPQSSQPQSVVSZ`\W\]ajnponoonnsrlprlfa[]_drwq|ljhegd`qyd^fg`^[\_bbfpjabba`b]ci_bpp``feaaegf^`ba_`bdopmnowtjhluvnen{exv^cuqjf``jj_]`ZYgn]UYZYYYYURf~{zvtsrw{vs{}{{vpqvy}~skntwzvpvyqiefeilpprssuxjUSQc}~n}lsqe\YXPLMNNJFPj|q_VPKIIJIJKKJIIIIIJKLLNMLMMMKIIH|oZTJLLS`{dLKKJKKLLMLKJKJKLKMWSHnqeWZ]WYYTdndZSOMLMPLmՕqwfORMP[g՘TEydQQenIVOMMOOONPOOQQRUVTVVVVUUTTTTUYYWURGPtaIMI[~a\a|Ϫ]PWWTR\babaKINLLSZZYXXXXWSZemRIPTUVXXXWWWXXUSTUUTSRRRRRRTPMSZY]^akZGHNTVUUPCP_]XWXVWWZ^XRRSVXZ][WUUVXXXVVWTUeeZY\\VRZ[[\ZZXPOORQSSQPNLNXOLLEPsNQSUTVVUVUUUTTSRQPOOMLNPQQQPONLKLMOOSgxkbbVKGGKOMLKJJJKPPONMMKKKJJJQPRUTSY]]\^ZWWUSRQOONNKKMm{puyuuuuussro`bmheb`__]YX]mzzvrqsre[^b]XVVXXXWXXWVUVWTRPPPRVWTSRQQPMIGECCCEILJGHIIJKLOQSQONNOPPPONMLJMNOPTVVTTXXXWWWWWXVVUSRSRTWXYYVTSSOOTP?>???<:999;><;;:::CLJHGIIHJLLLMMLLMG<9:;>@KSOJMMMOQJCFIFDEKSVW_dP8;HKFB=9V{okgZcoo_J>::87GbgYUVZhb?=;<@DDCBAA@>>BJT]\^WYbUGF?719AAC`sareIAEhlZ`[QJEB>:7448<>???BA?9:@EIIIJJKNMLKKKHD?;;?>82221105>=511=JKHB8:5744468:;=@?:65547:;6779;ENRY]Zh{}vjivq[SM@IVPB:52134454312123430/4;A?<:::8:=><853126820345BSM88?97;<9/+29679:9;<=<<===::<;;999<;7-,17000.-3/)0;<75:9@?:43568:88=EI?24761/2236ANJ98FY^TJ<-/;BC?AD?67931232/,-147CLLC>BC<2.---*),/445679<>==<;;;;;;9645530134/---,/-/0021/---+/..0/0/*6LY[ZUF;=>;7999::>MTB=9/-024;>A>896/-052456;:003-,.13333447:=B?A@5255=ADC?;856;>=<750ONNOMLNNLKMOQSRPNLNPQQQQQRRSRSSSTUTVWTRRSSQPONPQPNOONORSSUVUSRSSSRSTWYYXWVUUUUVWVUSUVXXTOLLNNLIGIJJLKLNPRTTSTX]^^^`cb\SQTOHEDCCCCCEGHKNQRSSUSNKJKKLLLKKKKJIHHHGHJKLLLMNPRTUTSSSSRSRNJJKKKKKKKKKKKLKKKKMNNMLNPQRQQRV[^^YSTTTRQQQPPRRQRQQTUUY[YVW`hmlopnppooqrsuuvtne]_dbs{leagcfedkk`bc^[]_^`cb_ac_`a`_a[`c^difa`dehlkhfcccb^`a`nqotsx}thjutssusa_riZcirrikb^eg`\_^Z]ppYU\XXXWW^~wsrnfp~~|wsp|~|y{xsrrry~sosy{~{vx}}oddcegjjjlkkvhVUSZmx|pwskc\UOMJFGJAOqhZSJGJKJIIJKKKKJJJJKMLJIILMKKIGGRUOGILHI[XOIIKKKKKKKKJJJJLKOgWUxsVNWVOMNMGQwg]UQMJKPQRŀ]^`pbMPR]qnPWZaYRUReGTOLMMMMLNNPSTTTUVVWVUTTTTUQRYVPUXMLQKLMLK`ohiKDYvNUmnigmye[n^FJOKOZ[YWWWXZ^gqiOOXYYXYYXWVUXWTRSUUTSSRRRRRUPVrybY^]hfJEFLSQJGDNZZZXWVVRVb\SRSXYY`]WTTUWVVVXSX]XV[^^]\P[^[[]]]VZZSQSSQMIHJNMKLDDk\VXXXXXVVVVWWWWVTSRQOMOQRRRQPONLLNPMUq|g`ZPHGJLLLLKKKLPOMLKKJIHGGGIMPSTSZ^^^`[YYVTSRPONOKKcyxtvsttuqlmtqc_opgc`__`b_]f{vtutuod_fhaZWX\\[Z[[YXWWVTRPQSTTTTTTQPNKIGEDEFJMKJIJJIJLNQSSQONPRSQPNLJKLMMOTWVTVVVWVWVWWWVVWUSRQQSWXYYVTVUOOQB;>??<;:9:;===<<;;;?HJIHIIIJLMLKJHHH>:9:9:?LSQMMMMKJD?FNNJLQWWTYhX;@V]RJHFLdodTcso~oQ=:8886IggVPMWo\C@<;?CDBAAA@>?CLU\]]Z]cYONE618A?ADEEDDC=79@FIDBDGJMKJJKKKIA<<@?<62111/3>@411=HIF>547765579999999997:>@:3447A>?=8?C:579864689626AA859;;;AC<55317==9652014545666758DLA00887;GPG;AJKLMNLB<467765237::<>><9:854447>8.--3@HB=9897./@F4(/D`b>(+3BNNKC95208AINSWZ^\H49A92588;@HG;:@<5;JRVK7<>ADEDA=;;;<;99>B@77:70-26766DPI?DTXPC81/5:?A@>:35>NVVUUUTQOMMKEA=48NYYYZYTG>?DC806==65IUNB:406@A;545456;EF??C@:1,+/0,-3565689;>B>78<9657777898981.,,***,.2553/--/0110/014BU^[^YD9;>;755893/?P>37869;===?=52431146324540/-,/22332358<=?@=862026>@43.''*/1,*06,".BD<1,3967;@CFFGHMI<68>DGGED=ONNMNNNNLKMOQRQPNMNPPQQQQQRSSSSSSTVXXVTSTTTQNOOOONOPPPQSUWYWUSSSTSSTVYYZZWTSTTVYYVSQQRWZUNJMOMKIHGHJJJIJNQTPPX]^````ac[PNSQKFEEDBABDEGJPTUUVWQJIKKJJJJIHHGFIJIHHHILMLMOQRTTTTSTUUVWSNKHIKKKKKKKLKLMKKKLLLLLNPQQSRQV`gfaZSQQQQQPOPPPRTRRTUUWWWUP]hdflmlnppqpprssttuvojidczv|kWoj`^_a_`d`]]^aa``_]\^cfa`^YVirpmb^[_iloojfmpd_^`aa`luvwpznl{~|vqspgcbfe\fy}qjhea`\\_[gxkYYXXYXWuwqqpei~zvtouvrsqqqqxzvuvz}z~oec__`bflmstrcVZ[YWbsg{lll`ZVS`j`JCVsr^[[PJHIIHHIKKLLLMLLLKIGFGJKKKJIJd]aQIKJIJIHDFMMKLNMKKKKJIIIIJKGSoS_rVHJRPIILMJHf|i\URPMMPVZ^zd\_XZgubPJt͛daeZRSSYLb`FRMKLMLLLLNPSTTUUVVUUTSRRQPLNSSTZWPKHKMNOPR^mfPelSNo|upyvsvPDHMV[WURQX^mww^QW[[YWVWVVTW[WSSRTUSQQQQQRSVP[iYX]cMGHHNRIDEQYYXXXWUSQ`[TTUZQKY^XVVUVVVUURT^`Sam__\JQf]Y\__X]`TORQPLGEHJKKLKCNydU[\ZXXVVWXXXYYXVUTSPMPRQQRRPNLLMOQLRqlURPHGILLMNMLKLMKKKJJJKJIKLLOUZYV^_]aa[ZZXVUSPOONHXwyuzwtxytklx{k_lxkdb^]aceeftxsuwusmijmja[Z^b`^]\[ZYXWVURPQUVSSTVVRNNLIGFFHJMMLKJJKLLNPRTSQONRUTQNLJIKKKLRXXUVXWVVVWVWWUTVWURPQQSWXYYWVYUOMB6;?>><;:9:<>>>>><<;::;::@GNOMLLJGD@BDDBAA@?AEMV\^][^cXLMG35?A>:311223=D809CFC@;644323679975447>>>=:51110357=BILB315756::7641.29?A@=8;=8677543445426==89<>@BHF<89648;:757621233135655>KH6/7==;9;86?JPSVVVVXXH:;<94./357;>>=;<=:68??96811457:8458720-)'''+/124543212440.0;>>MY^\NB>=<:71.5:4(2ID328@GJD;:<8/)*,0331..01/,*(+45112236:<::;9425547<9:KW?885ALP]Z@+),+*-49@@3+*(),179;?CFDCSc_\hlc`\USP?234/.--03-&)*+31',-'%*++,/3640#+GQPPN>12/)),140.10+'(''-14<@;65=DHHIMRND?>@FKLLKANNNMMNMMLKLNPRQPONPQQQQRRSSSSSTTTTVYZXVSTUUSPPPNNOPPPPQUXZ\ZVSTUUSRTWXYYZYVSRRTWYVTQONPXXQKJLMMLJIJJJJIHJPRNLU\]]_b`_cbWMNTQJFFFDCCBDDGOTVWX[[UPLLKJIJJJJIHIJJJKHGIKLLMOPPRTUUWXWXZZXTMJKKKLLLLLKKMMLLMLMMLMOOQSTTW`hhhf[QPRQPPQQQQRTRRTSTUUVTUZ[Ycnjglnpqnoqnopqsz{urng`|svWgh_][Z_ghgedc`\\^_]WZhkfddc_qrca`htsnjhiqna\\`dc`fs{vkzvobnoqnkqsgslimkc]_]_r{dVXXWXYnzvllypopmhu||}xuqpypnnqrty~}zrlp|~rcd`[]bfptutf[Z]`_\Wjgnunuk`c]PLOM[|rut_Z_XLJMJJKKKKKLMMNMLJFGGGFGHIJJIJIIFFFFILJHHGGJLOQOLKLJIIJIIIIJHaoNY_KHJJHHLOQMFWl_WTSQMMY\NO^cc^WV^^QJ]~լzvWISVKqlGQNLMMMMMLNPSSTUVVUTSTRPOPQRVYYYUQNLKMNNORUV\_sr]Qztd^`wȈFAKSYUSOGWepqbUXYYYWVUUVVUWWUSSSSSRQPPPQQRTRSbgT]`MIKILPNKFPYX[WWVTRSSTUVVRQIJUYWVUVVUVUTYcgcg{p\[QI`ZSX[]W[eYPPOQNLKLLKKJJIAVxWUWVUUWUVWXYZ[[YWUSROLORSSSRQLKKMPPJLfhJHLHHJLNOONNMLKHHIIIJMPSTVUTX][[b`]dc][[YWVSPPQLLr}vvwu{}ro|xghurffb^addbfrzpswwspnopnh`]cigd`][ZYXWWVURPRUVTTUVVRONLIGFHIKLLLKJJLMNOQTSSQNNSURPMKIIIJJNWYVWZYXVVVVVVUSTUWURPPRTWXXYXWWSNI<9=><=<:9:;<>?>==<;DILKLJGB>;CNRPPRTURR\ZWagecaa`_Q>?E;Tre;:9:=CKWcbOALU`^L9;<>@DDCAA@ABFMWZ\\[]aQGMI68A>=?E]lnbRTXLOmw\KFCNjdIAA>>BFHGEEDGHFEEECACCCGHIJJLNLHA>>@A<5202645@=<@CC@>;85421335775426?EDBACD?6126>DEK\agpK^~rmhd\RNMQ_]B443100000/1216AFA856799<;@BCFLG?A@=<;520/1663223337723?I?05AA<60.+0@LMMUYUUZ\XB7=?6-/3469<>@>==;:>DF;,+003953DRRRRQMLE@BDHKNOMKGD@@;2/5:743772166544;JLB@>AG>7765555:BB>BLVUQPOOMLIECB=4,(%1EV[YQF<;A9(.?A?<:876469833=415658:7@WO=>80249VcK1)+,09CED=.)+*.10039=::57Sf]\hcf}rUSZN764*+032-'$)/0///..+&''(*,/361'+ESSOL?.+.,+-2650,*)('%$(+2?B<69DIJKMQPPSPKIHJKJC=NNNOONNMKKKMQSRQPOQSRRSTSTTTSSUWVVXZZXVUVUUSQPPONONNNOSW[][YVTUWWTSVXXYZZ\[VRPRSTVWROMOSVSNKKMONLJJJJJJHIMPLIOVXY]abbbdcZMNTRLJIEDDBBBEKRUVXY\^[UPMJJIIJJIIIHIKKKIHHJKKNPQSTVXZZY[[^_]ZWRMLMMMLLLKMNMMMMLNNLLNPRSTWZ^_cih[RRSQOPQSSSTSSTTSTUWYVSSTblhejnnqkkomoqppswtpprlcz|UZaa_[\fqqpja]^bnxyyrpvux}~wot}p]bn{yuvofenla^_bfdbdlutmw{luzlx|xokwvyvzwsokg`]]`ltfXWWWWXY]]Wavtutqcduq~xvtru}xqnpqty~{yurt}~cac]`cflnjea`abccbY\homifmoqmgTIGEPiQLTWLGINMKMNLKKKKLNNLKIGGHGFEGJKKNLKMKHHIKJIJIJKLNONLKLJJKKJJIJIJjiPNMIJMOQSVXZRJOroaZWUQLO`Y\iqlc^YUTYKgrGZŰkWE@GlnDPNMNNMMMMOQSSTUVWVVVVTSSX\]^^[WRNJMNONMNOPKb~qX]|xfc\UTR[ܻZBGNWROKGUek_STXVVWVUUVWUVY\VRRSRQRQOPPQQQRSSLYxdb^PKIIJJKMLOXXZWUVTSQQSSTLGNJDQ[WVVVWVWVYbmpljl[VHR]WUY\Y`hWPPOQTYZXRMJIHLFBi^CGLNORSSVWXYZ[[ZVRPNMKORSSTSNKJKNOOJGb|XFIKJJLNNNOONNMJHHHHHMTX[\]YUUTS[f``ge_]]ZXUTQQQLe|wvsu|y}rjoqjhebhic`eo}xprtstutrojd`fllgeb[YYXXWVTTRPSTUVVWVURPNLJGFHIKLKKLLLMNOQSTTSPMPSQOMKJIIJLMTXWW[]ZXWVVVVTSRTVWUQOQRTVXZZXWWTJC==>>;;;:::;<>?@@@>=<>BJIIIIHJLPPPOMJGEA;:999;?GJLLJHB<>HNLPTQMJIP\acghfeedca\OA>=OfvqJ79:@BFNXZYXXXYIDMO:7<;=CDNTSHBBP\ak|[D@A?XkX@9<>@DHJIFBFHGFFEDCDCBEHJJJLOLD?=<=@=720242.9@A?=A@>;987430,03532/5@CCB?AFE8025>DIOVYlxYQs}~ymgnhULJV_K::720010/-056;EKKIFDCCDGJE@DH@447546:;=GMKC7220//2687764228>??=8531223357730//04:::@EEIKEEKFBB91////37778<=;:505DE51?IJC:3367=DHMQXZYWZ^S;6<7002468:=??@A@@FF:/0CGJLNQU\^VF???BDEDDA<878997557:85DPQRRRNG=:@B>CMRQLHGD?7-+,150,285698<>69FE=CFDD?<:5332029>BHQUTOGBGIGABEB9.**&(6JWTE<>A?6.8BCDFB>=;7223258<;5+).32012469<<::612;A6.1579;AJROA8;98:91+()/33.***+276883486232.('/78862249A@;@C;31355692620341*&%)0540,+..)&%'*-.033.*=PVOI@5,,.-.3994.+*----//04538?EHKNTVSSWYUQLHDBACNNNOONOOMLMPQRRRPOQSSSTUTTTTTTVYXXZ\[XVWXVURPPPONNMNPRVZ\\ZXWVUVVTUWYXYZZ\]ZTPPPQUWRMOPPRRPNMMNMLJJKJJIIKLMKILNQTY^acbagfWKPTSOKHFDCCCDHMPPRTSX^\SKJJIHIHHHHHHHIKKKIIKMOSVWXYZ[[[\^]]^_^]XPKIJLLKJLMNMMMLNNLMMNPQSVVWY[ckbROSQOPQSUVWXZ[WTUWXXVTTT_dcflnnoiinkmppmjmpkhyynv|oW\_bc`[cpqndYbtifmh]k|tqvxnbjkcaadfdeffnsoqrpzktzrkhvqyyb^gknspfdgc]\`ffbZVVVVVVX[Xa|}~}geyp{wytlv}~yvrnsz}xttx}`Yaaabddcd`]gecba_abaff`\cn{~|kOQlreXMHMNMJLMKLMMMLKLIGIKLMOPMKJHFFGKNQQOMNKJIJKLKKKLLLKKMMLJJLLLKJIJHNtiHFGIOT`b^[XZSMH_sf]YVPJTtwrf`\VUQOsMU[sӷ{xceھmK:C҅DNNNNNNMOOQQRRRSVUVWYXWVVY\^^\WSRNMQSPNNLIDioVV^dZPPROPPNOVYowAHITSNKKScfWVWUUUUVUUUS]joiVPRQQQQQOOPPQRQSVSSRa~mfOIHGGGEHMSXVUVTTSRRQQSMDEHHFPYXVVVYWYV\fmzwpzcVLQ`\U[`]ddPOROQTei_UMHKLNMHSdMFGLNORRSVXYZ[]\\UMLLLLPRTURPKKJKLOOIHflKGLLLMNOOOPPOOMJHHGIKQTWYZZUPNKJZjceigda`\YVUSROY}zvsuwz||uqnkklhjlc[_p~}upqu{~yqlifgnmdadb[YYXXWVTTRORSUVXWTSQPNKJGGHIKLKKNONOPQRTTTQMNRQOMKIIIJLNRWXXZ]^\ZWUUVVTSRTVUSPQUTUVX[[ZYWSI><:<=;;;::::;:>FJHB=;8@IJIIIIJLPPPNMLLKG>9;;<>BFGGGFE@>AJQNWZTMLJR_bbfmnlihda`[K@EWacZE;;;BFHHGFFEFDCDGHHIMOK@89878;83/2322=HHEED@=;8766328=CD93116967<@GH9/06?CGJFDUVKg{{imxgNFQWG<<;40121-2AE?ALQRRPNOQSQGAGMIA;;98984247766730/011369AFGKF;@IDBD8./14668;=AEC<613BM@5AMQROJGFFE?:@IMT[\]\\\E4443222469>BCFGCCD<06HPRPE827<:66647752011//034430/58++9?=>?>=67BEEC>@CELQSVTKA77888657;51BOOONLD8--;C53;GNOKIHC>5*-0/+*398;:8BIHC@A>4-0//013:DLSTPHA??<7;CA5*)*(&/DPK;48:86247983/6@B<761B[J312342145548:3,.2..133578862147986874694-*/2457:;><5/,+0;@8.0799<=?AC@;;922=JOTTMD=DLJG@71,./0/.0+'273652:LRH=62.,288:8435A<50./10-,02.-059305@WdX^kXSydKJOB-,100/-..+'/87-'&*,01///101223.7DQMGA91,,.//4770('6>;873.))2=BDFFP[_\SMV\UJ?56>HNNNNNNNONLNPPPQROORSSSUVTTTTTVWYZZ]__[VXYWSQPPOMMNPQTWZ\\]]\ZWUTTSTWWWXYY[]^ZRONPSWUONONNPOOMMLJKKJLLKIJLLKKLLKMMQTW\^^`eaTLOSRMKGEEDDCEHIIKMMOTWRJIJIIHIJIIIIHHIJLLNMNRTVXYZZYZ\^_^^^^]__]VNHIKKLJKNNMMMMNNNMMNOORUUVUX][TPQQRSSUVWYZ\^\ZYZYYXYWVWXW`mpnqhdhfkookhedcbmqpnwzrozrcbaaba[Zjui^kujxxoqjklqqflmbbdhgefgelvutvvmolzpgnojffinsvxwu_abbdebcfd_[]^``\XXXXXX[^YYyxwqhp|y}{u{}}||zvojknt_S\b`cd__qg`efcbachjaZ[][[_kz}xqkRCCGIJKKKQPMMNMJJKJIHHHHKORPNJHGHHJPTPMRTOJIJKKJLLLLKKKLJFIMNLLJIIJFX|^EKLFFRbaTPRPOMGMryl`ZWPJVuic\UTN`sIT^^QӊctlRPe>o{WPPONOMMPRRQRQPQTSUX[\[[YXWVVYUQOOSZZUPMJIwfEHSNHKPQPOQOLM_gf]GHNRRRONSd_VWWUVVTTUUYiwo\MMQQRRQOOPPQRRSSUWUMSbjpSHJGGFDEMVXUUUUSRQQQRQJJIILJKVYXXYZXXUVbj|rppTOP\WPYd_aYCKTRQQ_pn[LHLMOPQOPJNNOOPQPSWXYY\]]]WNJJKMPSTUQKIKKKKKLLLpbGLOMMPQPPQRQPONJIIFJQQRSTRPOMJHL`mgjmkjgb]YWVURQzxvqs}xv~{~mglmnsm_Y[j}wnuvnmnmnoj`^`]\[YXWWUTTRQSSUWXVSRPPNKIHIJKMMMNPQPQRRSTTSONOQPOMKIJJLNPTXYY\^^\ZXVUTTSSRTVUQQVYVUXZ[\ZYVNIDB@@>:99;;;;;;BMRKD>;6>HKJKJJJLNPQPPOQRLCABAA@BEFDB@AA@AJRVZ\RN[cacecfntuogbbe]JAIRU^aN;9<:CRUX]^YKDMVYQ@:9?AAAA;3452178412524FROKIB?>:89998BPY^WA7><430/:CHC7249A=8;86@>CfspttaE@JOKHEC9/154/@^[D@LRSROMOW[V@6FRKEDB?<:9::;BJKHD912234577866557:<879<<735886554//012469?EGGC<AA@BGH@6209LK7?UVQQQPPOOND86@B>7988CNSTL?6569<6256::76532221005998862/7?<57::7)(06=>67;:@JV`bXD557887897//ANNJFC<3*+9D6..352.*,/7;:<=>A=8;B?=952/0578;@GJHCGH@;:9>EC7,()(*3CKC82,*-0/-./+%%4EF@858IO75A?8423311368963211235:<9631259;98;;66=IMIA>?@<9:986322127<<6.(&&+8A:2279889;<=@?=<80/:FJMQLB78HQUVM=.-01002.%(0232-.;FJIB50499873148>A;957>6.';MMG=3,+-6>BDCAK]ecM;M^WF:78=BNNMNNMMMLLNOOOPOOQTUSSUVUTTTUVX[^`abc_[YXUSRQPPNMNQSVZ]^__^^^YTUVTQSUTSTUVY]^WROOQSVUPOMLOONLKKKMLIIKKIJKKIHIIJKJJJLPSVWZ\WPLOQOMLIFEEEDFGGIJKKKLMJHHHIIIJJJIIIJJKLNOONPQQRTTTUX[^^]]\\\^`df`WNJLNMLNOMLLMOPONLLLMORVVUTUSRTRQSTUWVWXXXZ\\\\[XZ\[WSROXjnknf\_filmmmicacccfhlu~{vtuvmfb^]]foaY|qsylehiib^hpheglihihem|ywwt{tyynjoqe_gnlflpevmdfda`bcddddiia\^_^]\YVY]ZXj|b[xtjt}{~~}||slgfccgtxdZ`fddeakmadgjifb_`a^[]]^^bn{dNCFIIIJJMSRONMLLKJHGGGGGGIKMLKIGGHGITZYY_]PIJJJIIJKKIIJLNMMRSMKJIIIIBf}YLOIUm_TZVLLKJJHIb|qd\WQGWxlcZUQQWVGIY\]\WٗhMXceKXdCjjjjNHUXSQQQSWRQPOPOOPV[\\]][YUQQROLNV_`XSQKΣoOHNNOQQPOONNONM^iYnحQPXTQPNNQ\WUWVVVVUTTR`z}zcMLQRRQQPPPPQRRRRRTUUODOflMEGGFGINWWUVUSSRPQS\RIKKLRNOX[ZZ[[YXUPWdyoYsrSPQVSKT__^SDGRRRQSoiKILMPQQMKKKMNONNOSUUUV[]\[UMLKLMORTSOKIKKJJIJJInaJPSMMQTRRRSRQONKJHGJNPPPNNLKMIIVnoinpoojb^ZYXVShxtqry|}{s\hpklne]_fyqn}ukksvpjgb^][XYZWVUTTSRQQSTVWVTRRPPNKIHJLLMOOOQQQQRRSTTQNPQPPOMKIKLNORUYY[^^^]\YVUTTSTSSVUPRX[WUYZ\\[ZTNJGFEC?<89;;=ADFJPPGA>;7CCA966931=WB08?BCEIJC9>98@C;=N`daZI@GJ;5418DC9215AK9-38;DECJIY}fJ=CHNVY[U?/2442?^jYIJV^[UPNQTXH3:MNIHC<;;:;;>CKLGB;54445677777799:;::;<;755666661++/1137:@FGEHJHE?712302:LbiT<112588::921@LID@>9622;C:53312:?@B>565/2645868;:=BDDEEDB?EC88:98107ADGHIHC<8?JJD@BFGD=5.(*29AFE@91****(+00-2DPMF<36A<5CKD;5451,,.15888885459=:42479:;;998533?LMHEDB;79:866765447;7-'&&(/8;63665558=@BDA=;854:BEFHE<42@MT[\N5,020/11+*02/-*').6@I>0;B943.,17<;30388.+-/./@M8'-685353.5GK;3666752,+/.37/+,+*+)&(/06HX[L@MSQXQ>BE3,022-)+.254760-*(%,8=;86543/,,/38?BABB6,*;Z?.=C5(9V\RC4+079CU^Z:-J\VHCKLIENNNNONOPNNNMMNMMPSTUTSTTTSSTUWY]ab`[Z]_ZVUSQOMOOMMQVY]``a`]]`]TSXXQORQLMOOORY[VQPQQTWUPMMOOMKKLMNNKGGHJKLKHFEFIJIHGHJLNOQOOONNOOPOLGEGFEFHGIIIJHGHIHHHIIIIJIIIIJKKJLMMMLMNOOPPQSWVTRPTX]`dgijicXOMNONMLLLMNOOOMMLMMOSUUTUTSSSRPRSTTVXYVUX\^]ZVY^_[UTQVeg__\TZfdejmnnmlkgdbdejtyxvvvsqg\[]__ZUdwjdkslqpehje\Z`ikmlkihijknyztww}k`aeioqmorc]jtlaflhepsfadgccddgov{~o^[]]]\ZWY[\Z]gha[Zezsj}~z|~}{~|nhggc_\_bi{fghig__cn{k^abfihc]X_fbaabejt~pe]IFHJKJJIS^TKLIHIKKIGEEFFGGHIHIHIIHGL[ebae_NIKJHHIIJJIGHKOU[\VNKJIIHHGvUJKB^}]JY^SJKKJIFQt|m^ZXYU`}ylbYTRQNIKOUXTVP|>qЍNW^YPP}fOWSXe|gNOW[USUPQPONNMMNTXYZZ[[\[UNLMKJTbdaYPیuVJNONNNNOMJKP[XWbc`\acUMKLNQUVVWWWVUTTSQNU]`jpdPMPSRQQQPPOQRRRRQRSSROIOaNCGHFFHNUVVVSQRQQQQZWPNJNTTUYZ[[^]\[RKJRjxhKZjPSUXSKQXXWSNGMPSWReoJLQQRRLIIIGHJJIIIKNOQW[[ZVNLKLLMOPPNKIJKIHIHEEJev\IOVWYXWUSSSRQPNLKJJJJPUQNJJJKJLbwroptsslc_\ZYWexvtw}s}~sW^rkeihefhrvrvzhelvyl`]]]]ZWWXUTSRRQQSSTVXUSSRRPONKGHJLMMOQQQQQQRRRRRPORSRPOMKKMOPQTWYZ[]]][ZXUTUUUTSRUSPSYYVWYZ\\[ZTLJJHFDB?99:=<9AHMU\P99Ymkgfgdgr}}lPCEB>IVYZ[MDHQUXYNEHRWL@BMWQ@<:=@EDCBA?@BFQ^a]XVM@:78==999:;<==:767;=?><:866436G749>ACDFIF?=EIIIHHHHFC=9<@>DNF7244224555518ILGDEDEC?;:DF?7AY`_^[SJD>;;9;@<2116EN>03:?FIB2*PgR:7@KQTZg^E500357CWbWR]e]PLIFHSP<7HOKE@<<==>?@DHID=97566667887889:99:=?>;78:<>AFKC4,,,.16>IOONQOKHA=CD7.4>CGGDCFH@=@>?IB@V_YVSRRPOQN?4//25?CGILMHB=4020/27640+)**2FTRQQB4-.6<72023555:CHHFB;52348AB>969>?9123541.7B=2242156?]dF/--06:;=;<;8>EDCAA?>;7@@@=:9889=BFKB::<::EJIUaP72110034442,)*,./-1EI59A6.1..36::6;ABC7-.15:A@1/2566631/-5841/1440.,*)1?>30/--./379::@EE@;?IUUA:C@2/21-*(&(4;88730.-,*,4:831211/*,0;CA@AD;1-9V9!,BC28ZaL=3,/555<=GLA--@STD>;>DEDNMLLOPOMRVVWWRJJJJAAGJOUSHATfc_fjjmrzkG?FHGLROOPMLLLKLMKJLOPIDADSTA;9=@CBAB@??BEO]a][YM?:668::;<=<;;9755689;;86644468@8:;DHJIHGECA?;7;>:;A<544422124401=LS[^[WSNE==AB?60>\lklgR>8:=>>>8653;AF@64:?=::50XYD>20:ITW\[OEA6045537K\ceaVIFEDHLOFAIOJA;<=?@BCDCBA=977556656:;998:;:8:=??;5;FOSY^cbM3-038>HOPQRMD??<8BMC57@DA?>>CHC?A@>BEM[^[]\WSQPPH;53205>?@A@@;=?96::34751.,-,,@??@A@?ACFGHGGD<>CCBBB:3<=;961/20/23//47989::99:9@=9>HKJIIHDC>5/3:;=@ACJJA<9/&),1?NYWTL<08?73=D?:8641,+,-17=DB;65542-+.5::8864349??BNQOME835678;>@>;99877:95110..033322699988888988756:<<;;715545565552345412352-,//=B53553458<=?DGFEDEE@CVO7?F6169<=:8==<><974310/-.0:@6-,.0/-18AFFE??5*0>H/#(:E<9IK7.-./0..6<<<<<93201BH5(,5:CNNNNNMNPOOOMMLLNPONMLMNOOPRSRRTTSQQONORTTSQNMONMOQTX\\YSMSab[bg\RRTOHHIIJJJHJOSVUSQORUURNLMNLKKKLOSTOJGHILMKIGGHHHGHHKNNLMMMNOPRSRQONIEEFEGHHIIJHFEFFFHIJLMLMKIIIIJKLLKLLKKJIJJGGOV]chjigeeda__chbVLKMNLKJKLLMMNMMMMNNOQRTSTVWVUSRPNNPPQSVWWVW]``_^``_]\YTQNNVYZ]dhhhnutrtssrojguiilfea^`_^_^`n|||vgeddegiiigfedb``\X]`ccdfcbehhix{zn\^YU[^ajqnmidflmljklpmiovyzxmfhfektz|yaTUVVUUWXYYYYYYZZYWZfz~vuytoxcafhf`]bffkxya_pjhiicbcPHNRU[^]WY]YY]`bcflneWWRHJHIONJJGN[WJFGGHIJMKFEEFFFFGIJJJIIHMT]gqr^LKLJIIHHHIIHIIJOSSNPQNLLMMPUGMVLGJSIIIJOKJLMMKHVm|{nXOMSgsu}{maXSQOMLILPTPGWeXUXXgaOJKLR_mrjUNHG@Jf”\[]dXPPWVSQPQQRRSSSSOJKKLJI[rncphELKLLMQRROLKMQUW]iqXMUXZgiNIJRUVUUVVWWUTTPS\`[VUJIQQPRSRSRPONPRSSSRRQNUTQPBCEDFHGEFNSUUSRRSWY[LV[JEPQLKS\^^`_SRQHMY]^]TIKHBPYWSNKKN\eWNV\VUVUc^NNQRUSJFFHHIJLMPOT\de_[]XNKLMNMLMMMJKRYYYYXaxv`MWsymd`ZVTRQONNPPQQPPTWVTOMLLIozv{|~}zpdcbba{|uwzztx~ype]]tzgggnfk{ssxzxtoptztqh^]aa``^YUUWWYWTQTXXXXWRSVTQNNLJHHLOOQSUURQQPPPQRQPSTTRPMKLNOQSTWYY[ZZZ[YXUSUWWUUTSQPSYYWXYZZ[[[\TONKHGGC?=;=>?@;GHB8ALKHFEDDDEIKJQ\WJOW\grqqtrunOOXYTPPMLMMNMMMJHFHJMROH@DUTA78:>@BBCB@@AEN\`[YWJ=999=>???><;;98655689965445568?9<==BGFFIJE?BHJIFDA?>>859@=8535433113333218?CKPTNJID<=???=;>\sicc]L=567;;8>=7=@C?8589636;8[m\D9403?NSVZNDFE;2421/4M_b]WRRPJKNQOFDLNH?::>ACCCDB>:;;98777867>A?:9=>;9;>??:5@OXXXXY\M57@ABGKIA;>:65322=IIA@BB>;<@FHGCB@:;IW__]_`[VUQF:6663.18:;<;:6:A<7::54651////3FOMJ?45668:875321124:BC>9400356>GE;55534455655:?6/231004==@DGHECB?;?FGD?<42>?>;7332/,,.0/5<:785223511:@96:7/)+,?ZbXKD@=>=9;CILKJIFCA936<=<;;8BKF87;:88862-*')/38B?1,..+*(',4:964431.1=@?JPNIA9;:88:?DD>;99999;9764100/0/.06988866678:=;:9:=CF?:A@:<68MYTKFB;40257774..3;?ADD;13201117>7118P[]ZXYSA;9865444445479754699766448?E=3676668::79BFFMQNQPGFD>B>4:BCMSJDKNIB:56887-).85:D:-**)-,9?CDHJ@?3#';A-).15::95+(+.//-,4:<<;;7463076)'.16EONNNMMMNNNONLJLOOMKKMNNOOOQSRPPNONNNNMMOPPPNLMNNOPPRSRPLFIW\UV__UMNNIGHJJJKMLLORSRQOPSUSOLKKJIJKKNQTUQLFGJKKJHFFFFFFDGJNMKMPOOORTTRTSMHDEFFHHHIHGFDDEEFHIJKKKKJIIIJLLLLLLMLLKLNNT]a`cifdbcgdaaabehf^TNLMNLKKKLLLLLMLLLMONNOQSSUWZ\[YTQPPRTRRSRX[[]_befddda\UPOTXZ^gd^blporttuttrxqqzpfecbekrw|~yxvwtvqe^aacilmmljhebb^XX^^[\agikkhjomu|}{gVe}znd]afkkkiddkjgfinqqpqs{rihhfgn{i[YXVUSTSSUX\][XXYYSXgx~uuyuwtihgge^]aefhitlbmnlme__\URSRSX\^]\]]^abdfgggg`c\GDHINMJJHGTXLFGGHIIJIHGGFGFFGHJJJJIJLXflx{fNKKIIIIHIIIIIIIJKKJMNPSPRQONVkgKEHHIIIIILPMMOMKPermhg_TOVdfn}sjaWSPMLJIMOUXNKOR[\[nRNLKMMP\nt]IQNIISxwvUSSUSPNLMNMNNHHJLCCsiTblQFKMOOMNQVXURRTVX\ty`TWWZevcKJQVWUUUVUTUUTQZmsiXMFHKPPQSRTSQONPRSSRQRRS\VQPKHECFGIECKSWVSQRQQTXNIIAENNJIR\_^ZZNJJIRXWVURJCCAJTZZZWRJWm`Z`_WSRSSQKJNQSOJHHIJLMNOPRY]]^]\[UMLMONLJKKIGINSWYU]wjajzzrkea\WUSSRQQPQRRQPSUUUSQONT{{pfgg`wwwvwrruhdg^\rvhggbj|wy}|xurusxynd]\ada``^XWWVVWUSPVY[ZURRTUTQNLKIGJNOPRUWUSRQPPPPPOSUTTROMMOPRSTVYZZ[[[[ZXWUTUWWVWTQPQUYYWVWY[\]^_TJGGHGEC@=;<<<=@ABBBBAAA=;<<=?B;5799997767569>:<<;@HHHIHA=BHIIFB?=?>75:A@9323342/3=?:7977:507B@@A@<;>CEBFQ`fTFN`aPA54969DA?BCCC<79:86897Qs`A?;4..8FRSFHIFD@602204H`fd^RPTRNOQRN?>LOGA:9=ADB@?><:=?=;:9:;;=CHB9:=>;:;<==74@LHDB?>>51BTVUVVO@821/02325?HF@?AAABEHHGCAA<;IZ_\[[ZYVQG;44444//25998759C>421/122100-/>JJHE=;<8787555520/,-5>=97521266;HIA;9643577765>7-03/2724==@G>/,/.-/1137::89?CA?:8876;HD=GF;4:8673/23.,-034;@;6641234436::8972,++8QbZG@>;8889:=><;953>DOegK+->IQY\WJ?DIMOHC=9;;950+,-.025:7)&**'&'(067632790+,372;FB><:<:76:?BA<<<<=>@=88853221/-+,3:<:897557<@?@?EOKDDEII=614?LSOLHC>525:=<814:@BDDA=9974459><0.1.5DP[__UC==;989;94379?FIF9269::7569=B?;86557:;:98=CCDEELN>369736FI==CA<;<<:1.7984/),769C:/*(%'1@A;IM2!0;70414@=7620/./.,.5:=<<;;85466-(/55;GPPNOOONOPOOONMNONLMMLMNPQOOQQQPPPONNNNNNNPPMLMLMONMLKLKKJIMROJMXXOJKKHHJJIKNMLNOPPQPQSUTQNLJKKJKMMPRTVRMJKJJJJIGFGGEEEFJJHIORQORVVVWVTRKFFGHHIIIGEDDEEEGHHHGHIHGGGJLMLLKKLMMLLS\_YY\`a`bdegfgijjggkmh^TMLMMKKLLLKKLLLLLMLLMNPQSVY]_^]\YWWVSSSRSSUW[`egggggdb[OMY]]jh[Yaedgopppqrqp~{sy|voq|~ujedddgigca^]irnmrtqmhcba]\_`[Z]fknqkefbajja\hyr]UXig\beghjiechlgadqtqqnpy~xurjcdnw|`[XWUVVTSQRTWXWWXYZWW`nx{qw}tsxyq|zrojgfd`bbcdddhgclqnn_VVX[ZWTSTX\b`^ehhgimmifghg`SJHIKKKKJFNUMGGHHHHIIGDFGHGGFFIJJIKHMtn]m|kPMKHIIHGGHIIIIIIIHIIKJLNRRRV`cYNKJHHIIHHPXPKNOMMUVYfndWQS[acp}|qg_VROMLKJLNOSQNNY_\\R~HPMJLNNvpT`YSVZV\ZnÂPKTTROMMMMLLLNRJZɒ^U_\LMTSRQNMQTX_faYXXX]st]TVXZaxnPHQUUUUVXX\]]XPZlvwlYWa_ULPSQTRNKKMSSTSRPR\cXQONLHFEDGFBFSYURRQLIGHHEEDHKLGEP^_[USNKILOORQLGFDA@MTVZadcRHZkmkeXPPPLIFHKMNLKJIIJMPPPPQW[ZZ[[XTPOOONLJJKIIIJLOUV]vsomwyqkhc^[XUUVWURPPPQRSTVUVUTPMcyqljgryzz{to{vd`gq`]pplidoy}{wvw~vvnd]\_ab__`\WWXVTSRQRWXZXRQSTTROMKJKJOQPPTUVTSRQQRPPOQUVUSPNMMPQSUWY[][[]\[XWWUTVWXYXROQUWXXUSUVY[]^aUDBEHFBB@=;:99:==@DDCBBA=>A@C@IKNQQRVZZWUXSKOTTSRQPPKIIKLLHEB=FOE;?EEGi{k`XQQTTTRQICGORUYUJ@?DEJVZRSPB:;<<;9;<@FH@:::<>>;;:75HKIGD:;CFGEB@=>?=75:A@95555443??=>:57AGHEAACFMQGCQZOC;I^^PD76;8>GFHIJIH>69<99:::AD632336;FOQPHBEGHJA229>AHZbd]JGMPUWTNH>ANLDB@?ADFEEDCA??@?>=;BFHIHHFB@BDDHRXVVWVXSD:7543341/2466785:E=4,+,02222215FNHDCAAB@:963666431-*/7:865432545?B<:9645799:;=@8452.5:3377BF8,-31/0124<<:::A=E]h]=2ELJUZRDAJLHOVSD9==52-(.842640.)())')++/0/.-.78.+02423624::98658<>;:<>?@AB@?:656553220/2:=;897636<@>;58U[VZYTOF8/27?PPIEBCA=>>??;:<>@?@@CFGE>767;83325?<2Eag_RGEJJC??CD958=BJQNC832981/.03>EA>AC@?AEHJGA@BCA:781%%-1/2?=-#%6HB52/*+6:40/-.569?914><(0H>DD33@;:9:=;555651/.,/48:9::=92164+*0458@RQPSTSSRRQPOPPPOMLMMLLOPQPOOPSRRQOONNNNNNOOMMMLMOPNLKLLKKKKMLGIPTNKKJHHIIIJLMLNOOOPRRTWWVRPNMKJJMMNORUWUQNMLLLLJIJHFFDEFECFLQPORXYYXWX\XMHGGHHIHGGFEEEFGHHHGFFFEFGHJKKJJJKMMJNY]UQW][Y^cefhhjllljjllmleYLJNNKKLLKKKKKLLLLLMMNOQSUZ[Z[\[ZZWSSSRSSTTUY]][[\\]`[SLXeaku`X\ZZ\gqpdadhle]hngn}zyuh``]ajnkdaa__mvpqz|yrjdced`^^\]`lppnja^`ZTU_^a^^]\ZZajf]]bbbehgecempedqysrrswvffowmUY[VUVWVUSTUWVVVVZZUW]go|}mp~|qpymj~zrrjfca`bcbceecbcirqoaUUXYYVTSUW\`ZZehfflrtqjehhcTKIJJJJJJHLQLIHGGHGHJHJKKKKIKIHFJJICYgT\mpYPLHHHHFFHIIIIIIHIHHGILPLOWVSNMPSLHMMLHJTXRSSTSOKGGXhaXVUZ_ckuvnf]UQPMLKJKMLPTRQX`Z^\abHOLIJJIjuvYl{j[XURRFlǻsNTUSSRONLLMOQNZԍ][Y[YQUbc`WMJPU[cmj]ZZZb{sXSVYY[pmPHSVUUUVY`egm]MWeivzpksjUJQSQSOLIILTTTTSPP_i^QNNOMKLLNNJBRXTRROKGFGGHJKLJIFET`^ZXVRPSVUX_[KBED@G[c__flk^IIgzwjTLNKIGEGJKKKJJIIKORQPPPV[ZZ[ZXURPPONNLLMLJKLMMQVZezzsmkxwpja[ZXWWX[XRPOOPTXXVUUTUROqztroq{y|~swqhdhjjcimmjep|{xwv|tld^_`a`____[WWXWUSTUXWVVUSSSSRPNLJJLNSSRTVTSRRPOPQQPPTUVURONNOPRUWXY[]\\\YYYXVUUVWXYURQRTVVWUSSTX[]^aUA@FIHEDB?=:9:;>?@BCDDDB=>?@E=BLNQQSXYVTSTNFNWSXVMNRNKKMNJDA@;ERHACBIXnlfsk[OMSTSTSQLABEILQNC>@FMYd]C>D><<::9:BHEC@AKX\SNOA>??===<<<:8:;>ACB><:=B@<=;8;FJE<989>EJGE?8=DFFA??>>?=64:A@;865579>HROJBBCAAA@ACIKICFLNQRJGML??EW]VF87:=?ADFGHIGD=7368:;=@A86=>>?GIJLIDDEFQ[c\H=@D=9JPPTKFNVVVTNIEMSI@CDCEHIJLLHDAAA@@?>>@CIJ@55:<=<;:9842;E>768:9:67Nd_LKXR=@LG@>CC@>@DGC;?;863/.572323B>4-06756534>A83:C><:GH><>;84>QD*(7@?GOJA8132114975555322365:DI=8=<4269AMTYXTNHDBB?=><:;AEA:8L[VC6DLDJUOCAGJHJWVDABB@@:65653224522786456879;>;2*3Qcf_PMQN@3//0@OHB?DA=@?=<:==;<<<=@GLG9444521678CM;7Ui_[VNQPLDILF936;?EIGJLJC3+,+)*4GSRSXWLCDJMO[XA8APRJE>3+-/+,,,-48BVM4*.//26420./236:97>SX<+KRRRFEQah_C7ABFC;7613011/1/-,.0243333/*+-,)*-1417TTUXYXWVUUSQRSQOLLKKKMOPPPPOOQSQOOONNMNNNMNNNNMMNPOMKJKJIJKLKJJKLMMKJIHHIIIKMMMOOOOQSTUXXURPNKJJLNNOQUWYXSQPNNNNMMKGDDCCCDGIIJMORSTTQSXXQIFGFGHHGHHFDDEFHIJJHGGGFFGGHIJJJKMLJR[QKU]YRT\bfhjkllmlmmmlllnk`SMLLKLLKKLLKLLLMMMMLMORSTVVVWVWWUSSSSSSRRQRUWWWYYXWWVUX_cdqtcZYYYakuma`bb]\^a^l{qgfjnuxnbabbbbmvsy{xuoeafga]\]akyypeimjf_Z]aidbcc_\WWVX[\__aceeedcn|smquns{wu|ypjpwxqi^``[XWUVVUUWXVTTSUUUWZ^eotlbo~zuz|cg{wqjca__abbcffedbftsn[TYXWXVTRUWY^TXfgdemuwvre^\\PJJKJIJKLILLLLJGFGGGKQ[ZRLMUWKFHPSOLYfXQLXl]QKHFFGFFFGHIIJLNMLNQTSPLflVLKLMWNGNOLHLVVSUWVXQJPLK^^YXWX^bhlnle[TQPNLKJJLJNVVPR^adoeWPMMKIIKHSsY{eUWksf]YMLIQfXXWUUTPMKKORKGU]\UROKNWiq`MHIPasl_Z[]]iYQWYYXgmRKTVUUVPTX[abWTZUTevunn`KJPPQPNLJIKTVTVSPOP`cRMPRRRSY^`]QQVTSRNJHHIKVRKJHFDEW^ZeqaYPU_]ch`PFGCBNdnninrmi]Vgyn`]WNHMGFHIIIIIIHHJNRRPONU[Z[[YXVSRQPOONOONKMNNKNTY_hpxxpgdvaVXYWX[]YSONNPV[YWUSRXQU{vpr{}|yq}ydkrjehlqlfar|zvwwx{{jda_aa__]]]][WWXVUTUX[YUSSTUTRPOMKJKNRSUVXVSRRRQOOPPQRTUUTQPPPOQTWYYZ\]^]\XWYXVUUVXYYTRTTTVUUVRQRW\^`cW@?HKLLKE??@?A@@@ABEHGFB<<>@E==MMOPSZ[XUSSLJUWQ\ha[VPLLNOE>??9DSMGGANnrkQPjqkg`VUTTSRRMFB@BDA8=JOU^g\>58::99777CLGC@AJW\RF@<>A?=<<;:;88:<<>@EE?99:<>ACDC=>=;64:A>>;4358>EKRRMFEFDCEFEEFFD==A??@DE@95;>?@@@BBBA@>>8007<>ACC@ABCBABGPPKGEIQbmnnkZA717LOL\`[\[WRRRQQXYI>ACDILKKKJGCBCBA@@@?>@B<1.29::;<<<823:<4468:9:68NaP9DSG7:CDBAFIB=CKLKFBFHHIHCABBFFA?>BILLKLB:76566688676656779=87669<<;;:878BJFCB@><;62587878887532455555436=;3012554468:<;73220/476413:75469:987=><;514:9APSSSQRODFC>>???AD>647HO;.7B?@HNI;067./38853333458865:;5:B8/087@R\__`\TGAB@=><;;>@@;2:MOA67CBGPLEACJIGKKC@A?:80(/5506920221.-/20.../3541/00-..-06>=;754444464/6:86310.001123430/27;>=:>90,-D`dQADFB@7-*(-?I?6>?349<;;<<::9:<=?D=2003774367:LVAH`chg[POKFHOD6238>BBFWcd]J93101?Udghh`QGFIMS[VD:?E>;KNPPSX\]VTTPRVWSYnxui]TOOKFC>;7CLGIKCAZTCdPObmsoeXTRTVRSQJECDDB>@LUX^^Q=689:88678DMIB@AIW]RB9;?@=<::::;:>==<=>DE>?CA>>@ACJI?67:>><=?@A<;=CDCCA?<:<:539?A@9337==<>=;;<92269=ACCCCDDCB@G[d_XUSWgspr}lA23=XWUfnfc]XRQSWZ^ZH=?CFLONKIGFDDEDBBBB?;:<8/.3788;<=;822321368:9942FXF3@J>3357:?FKD=ENMGFIKHE@:5>GC??98;?GJHH?>:87677898766667788:679<>=<<<;877>HFC@><963/38:887775433555555545?D9//146446798875553129<4,.35789;<:9:DG973//-8M__YXUTTNFA98989;=<:87;10EK?64=BCMKD@>GGCCEFEEA;8/*.36248435530.//0003335431/011223;@>;865543342-259;507;;9:888889;;93.007?@81/10I]EEZeieWNMJEFKA4026<@@E[filiaF<::;@60///.034200/01476=K\[JCFEDR`aQTY:1ITD200/02.38632210.,,--)&%&&'()))/30,UUVVVVVWWVUTSQOMLLKLMPQQQQQQQPQQOMNNNONMNNNNONMMMOOOMLLLNLLMKJKKKKLKJIHHHHIIKLMNPPPRUTTUVUSQOMKKLLLOQRTUUVUSPRRRRSSQNJGFEDECBCDDDEGGFGEEHIFEEFGKLLLKHFDDHIIHHGFGGFFEEGHIIIJJJKJLPQNLMPW_fijmmmmmnnmllllmprsngZROKLIIJLLLMMMLKLMNOOQQQRUTSQRSUUUUUSRQRTUUVYZZXXVZWX]`\_\\]]fuyqd]^`_T[ik_Y]\XZgsoibkyuc]^^_aaa_enpqrlp{{qf_\]\[\_gpux~|}ulhfdcdabzw_[[[arwkeegeeeiz|vjvzwzzc_jou{zvokmtunf`XWUUVVZ\[]ba`^^```bcbeqz{yne``]\l~ud_aa___^^_`ahoqmdqr_\ZXb]RRSSTX[^YVdichqxxvx}eMHKJHHHHJIHJJJJJIHHKKIMLLTYZYZRMPYYUSPQLHIEFSTIFFFFEFFFFGLVZYXVQPOQNWfaRPRKEN]PDEFEGPVSOOQPOLGTa_^_YUSSSW]`b`]WROMLJJIIJIOY]SIUu~wp[MONLKJJIHHHuiKNPSfcILKKFKITѿ[][XWVTQOMNNnYS]]]X\\YWTLMd}ycQNhfNWZ\]huXSWY[\cgMMWTWTMNRSMLNQTRNPYddTWOFKSRPLQ[^^STUSUUROEFNRMKJJLNMQ]dg_TRRQLKKJJHES^XPNIIW^ZbelxbMSQLLNPQJCFQS`ruofbgnbVVSQMVibJFIIIHJJIIJLPQRSRRSVYYZZYXVUSRRQQQSSPLLMMNPRUY`a]Z_flmicaZNTXXTSUZWNLMMOSXWUTQPNJr|z}}zuxlku}tefmmf`i{}x{ywyutnida`^[Y\a]UXWWWUVVWXWWVTTTVUTSPONMLKMPSUVVVUTRRQPPPQQRSTTSQPQRSTUWXXXY[]\YVVWYXVUVVUTTRRTTTVVWVRPRW\\^ccTILRRPQLDEILLKHFFGHKHGB<<=@EA88BLNUZO<<9>MlgY_]\__[VSPR[QNRNHGJMPJDJV[VKE<678989879BLJCABHX_RA:=>>;:989:>BFB;9<@MPE:9:9:AHJIA956;B@<<>??<9>?AA@DKQPHDDFFGC?>>=821358:>BB@B;4?DDGOEA@?><;86<>>:99;8539>@ACCCCBBBEUde_\XWamljl_?,.Gc`Zloed_\VOQX]_VB8=EINPNKHGGGFEEDDDDCA>><746667:<:742201468:;;;60:G?6<;3/.--0:FJFCHLJEFLMJA6/7ITNC9129@GJHFA>=<;9:;;;97776678::7558><98999776;GID=9<70/.059984564245543444444?1()/78;<:<;:AKG963,)4J[]\\ZXRJ@;=?;;=<>CFGHHEDECBJLA67<921000234218500/-/356447,+/4865>M[egee`OBAC@=>>>>>;3.:D>9658>GGA=;??>=;::98742/+,4:>;422110//000/015731025<;84200.);B?A=999307<<>CA:867::9867568::;=>:/*,3>CE@5.',K[LIOSV]UKMJDC:72.38;@ADPT_vQEYMMY[Z^^[UGFGA;AC;8==8;CP\O408CI<.*.5526748:0.2233.'+/269CVcV=269;AHC546-7QH0(*../3;AA;6222344341)&%&&'&'().10*UUUTTUVVWXWUTRQPMLKKMPQQPQPPOQRQONNNNONMNNNNONMMNNOOOONNONMMKJJJKKLKKJIIHHIHJLLMPPQTTTVWWWTROMLKKLLMOQSSSSTSRRTUUUUUTQNLHDBBBBBACEEEEEEEGGGGGHJLMMNNOMLJHGKLKJIGFFFFEGHGHIIJJIJLNMKKKOTV[dgggjmonnmllllnnoqstpmh\NHHILLLMMMLKKLLLLNNNOQRPNOSVWWWWUSRQRSTUX[\^]]]WUY^\[]_`_dkmmjb`bb_\WRW][\\XWcg_c~sc]^^_ccb_`cb_fnmpvvne_\[[Z[]^dlswy{~wqrlhhhr}wf][[]bb_bhiefgkyyxw~b]gjormggjlmpttupdZVTV_fhinrlihffdbchifju||yp`]\X`ohY\_`^_^^^^]]cutli^S_`VidQQTX[YZ^\U`kdjwzxvw|nOFKJFFFILKKKIHIHHIJNT[ZUIJPTZVNORRSWWOHGGGFHMSKDDEEEDEFDGWa[Y\WSRTRLis[PJEFR]TFHNOPUVROOQOJGFN\b`\WRPOOQWZ\[YUPNLKJIHHIIP\^XLJ^t|yeQOOLJJJIJLGWXLKKHIm|FLMLKLJAf^^\ZXVQQONJeS`_^]\`bb_VOeia]\UTUX\]gyiWUWY^_e\HSXVWQIIMOLKOPMJJLN\\GFIHJRRLFPX[cVTTSUWTPKKORNGFEFGFGMRVVSQRPKLMLJHAH[gfd^ZWWX]eq|tXGDEJPTUQFFY_^iocYVZ_WLRZaaYZ\IGIIIHJJIIMQTTTTTUUWXYZZYXWVTTTSSSSQNMLLMPRTSTVUQMPbnhWQMGKTXTOORVQKJLMOUWUSSPMLM~|}~}}|fgy{omuxwkcoy{z{yqhhqsleb`][Y]]WTWWWWUWWWWXVRRTUXVTRONMMMMOQTUUUUTTRRPOQQRRRRSSSSRQSUWWWWWXY[][VTVXYXVUVVSQQRSTTUVXYVQPRW\]`efWHJPPQRNHGHIJMMKJJHGFEB>=?AEB?BQOOJJNRWXYXSIM\aL?G[lk`WXWJ<9:HZace]I<<>==97789:AFEBBO^kx~^:4748CJIF?:66;CC@=>@@><>BBBBB<9::8::7;DGJNNJDACKQLDBEGHJC86873159=BCACFKN<,ATKAEHGDA@>:78>A?86:=;515;=>ACCBCCB@AGOSTQPT[[[VOA02YpfcsscXYb[LJU`]O=7>GMRRMJIGGGGDCDDDDFHGA><;:8889<;502444678:<<=<9;=;992....--4AFDHPMIJLMLJB20L`^]U?--6CKGECBAABA?>@A>:7888789<;643465357777747ELFA?>=:83,/3:910574244444333557:960.2:>@?;657<=>>:37A<0+-495./499;DI?893*/J\^Y[\XQH=319A@BLNOTVTTTSLDAENPC42784.0222110022.-,+,142244..285313@R]b^]\PEBCB?AA?>><515;<<:316@@=<<;;9852/4416636668:50--.-0364/+-/0111/004=>>????==:5/,((-00/-////0//--../015741..3861..//.9<776773/7=>DCDCB:25;<952368:;>DGIMLC>>CEFE:-&9VWSPFBFUOL^OC@./0,499?BBHALwZAc[JVYV_]WXD/497==42:?938<<<;988:;;>==@BBEIJC?<99<>:;CLPUQHBBDHJECHLMJG<23667;CB@@@?ABM[F,B^VFDGLONKF@?EKJF95775312689:=ABABCC@?CJNNSZZTOMLH:Glqh\_hZCBV_XORVPE@DIKNQQMIGDCCDDCDEFEFGE>;;=<::;<<<4//4:;85568:=?A>;?=3./-.110/7AHPTKDINNJFB51MbdeaN5.5@IA8?FFDCEEBCEEB>;:988787633323457777766@LMOONNOND:88:=958==96634432235654686:IRPD>:87;=<<848?9106;=7/,-/03894470*=[^YXXSNID?<==@DHOSRQPNMJIKHAAMOB42563121232010-+,././23.,483/363,+-7FLQUVVPICBBAA?>==:415:>?>9359;:;;;:66FM>.1:60693553578::6,*++,.8;4/-.01111/015=?BGFC><<7-*,)))()*,//1011.**+,-,+,011/-.03410/13530,+1401889>@DDC?:8568529?=98=KSOS_YPFDFFD8-+ASTNB;?>HPVgT?;40.+4?==BHNA8djAYUCZ\PZ^V^\?15721,+,-(,?L?1155:;<7478625675,(''+4=:0-,(,59656:94,&####$&(**(),,SSTTTTTTUVWVTTUPMMMOPPPPPPPONPQQQPOOQPQQPNNOOOMLMOPNLNOONPNLLLKKKJJJIIHGGHHGHHJLLNQSUXZZ[\[SONMLKIJKMNORRSTUVVUTVVXXYVSRSQLGBBCDDEFFGHFFFFGHHHIKLLNOQSRSWXTRQPONJIGFEEEFEFGGHJJLLMLKMNMOW]\\cllmlj][a_`immnqssuuuwwxvl]SMKKJIIKLLMNNNNOTZYTTXZ[\\ZYZYVTUUUV\cecfea^[WWXY\__``aceddca^^^^]]_^Zboml|rggdcdddcacaeqskhjkhinj^XYYZ_jsvupt}ye``mzq_WZXYejervmopploz}}~pabda^``^ahnommoqiYSdwskmnmmkecb_nrigghiklmqtgdfmtj^Y[^]^_^^^`_Xd~lQVZUVac`gdea\drbScd[jVU[qzqnwtTMNJHHGJIFSf]JGIHFHMY_VJHJSWVWZQECLRKEFFEGJHFNVIBDDCCEEF?VomjhegfZiiLEHGFGIV^]_]WSRVY]`\WPHGFO]]VSPMLKLOQSSSQNLKKJHHHGIKMMLKJIKXgngWLMMKJJIHIIJLKJJJHEIKLLLLMLFLmlPPPUYQ_@OU]cgheachacϥh\\\[\\`oqaWWX\]\cfmeV\LIMKJJJIHHIFBJQU`NBHQJOPHCIJLQTTNSSVUNGHMONLKJLMGEEDBBJSRKJNTTPHNRT\fnxw_PWZeviY]WPRVQ\mjTJ\lla[ZRHUwvXIHW|YGGHGGHGGGHKPRRRSUXXWUVWVVVTRQPPPQRQMNOONLNUTNMMMNPTWWY[]XOKOQNKKMPPNKKKKNQOQRPNFbxppx}mk~whgz{~|qfgs|nfcbca]ZYWWVWWUUVUVWYVUWXXVSQQQPNMNOQQRSUUUUTSRQQORSUUSQSSSTTUTUUUUWXYYZWWWVUTRTTUVVQNPRTUWWWWWSQJPX\^`bf_NLSTQQOKHDBDHNPPNLGDBAAAB@ACEDGH?=DOXUVUMJPSSU[b`M=P_U?:::9A\gca_`XD:BPVYYZZZZYXTSQPONEDVXOKNRVPKC;:<=><9888;?>97@?BINPQMD>@DGCBHNNKD=7458>ABFF@;8897>VSCI[WJFHKQRNJFEHMON@6553112579:=?@@ACEGJMNLR`jg^SLGE<`mYUD=IF60@T^XPG??BA?<50.18;721228?@?<:=;1//-.010.6ERWPB;>LPGA?;:@L\c]O=469;968CEDEGGCCEGHG@<99765676338;9779;:975=KPSTSRTVQMGB?BFDAACC>94232024579526@O^]J>??<69<;866:;834:@?==6,)+/34334,&@Z\WSMFBA?>AGEBEFC@><97899>DB>DJA413543222233451,.133343/.783142*+-/36@FLSUQIDBBA?=>>=9438>@?A>:988889::65@?0(.3-+8<453149;<<;1*,-/2651-/0010245557<@FJHB::<4()0/+))*-/123565-(',,,-/./0/.,,+0632563.*.0/3566769=??@BFG=129717>>5.6IUPP^YK?AB=91-.:FD?9278@WefL<9742.6C@;AJI91KulTK9.H[QU_W[e`SD>Ne`>17:81,*-BVB4EFCMH766/,)7^}rL766:6.',FL;,-67:=<:998646785/*))+.20/12048987::51+$$%%%%%(+*(),-SSSTSSTTTTUUTTUQNPQQPPPPPPPPOPQQPOOOOOPPONNOONMLMOQOLLMMMNMLLKKKJIHHFGHGGGGFGIJJKMOQTXZZ[^]XRPOMJKJKNPQRRSUVUVUSSTV[_^XTSSRNKGEDEEFFFGGFGFFFFHJKKLMNOPQUXTOOPPPNLLJHFFFFEFGFGIJKKMMLKMPQTUTWdmi`[UPT[WT_ffglprrtvyzxvvvo`RMLKJJLLLMNNOQSTWXWWWWWYZ]^\XVTTTTU]ddehhfd\X[[dj^Z`bbccbba`bdeedegegjidpxmkmecbaabcaabjoollnlmrm_YY[_dfcmukgp{~~cY]ii`ZZZ[jwn_o|qpoehnjoy{}sha\cssgabbbbdfgmwupv}yl[Viskfikkkjgbcmujfgggiijkllgdegihfc``_`b`^^adcnjMS_`\^c]`\bd`Y]ZS`jbvfc[^~lsuTJMJHJHHJGKX\LHJHGIJNLGGHNZjli[LDITQGDEDEEEDFIXNDFECEFF@L{wjnllie]?EKKKIJZc_dbUQPQU[[VNIGGGELXZWROMKIKMNPQRPMKJKJHHHGHJKLMNMKIMU\`VLLMKKKJHHJKLLLKKLJIKKLLMMOIMtglWY^On߻BMOR[dmpla[YRSädZda`_^h||eYYZ\][bkr[kjBELKKJJIFFJGGOTXaMDLSNKNLEINMOXTNUTUVQIGKNOMLKIGDDFGDELQQIDLTVRPRUUU]pwiRMZ]cn`RVWZ]]QRadWOZoubSRRFLs}ZHFJufLIHHFFGGGHKOQRRSUXZXTQPRRQNMLMMNOPNMOPONHKSSLLMMNORVWY\`XNKKONMLNONOXbd`ZSNOQSOLsju~ofvtgg~~q{{pkirqeabbc`]Y[[WVVVUVVUVYYVVXXWVSQQPOMMOOPPQSTUTTSRRRQQTUVUUTTSUVVVVUUUWY[[XVVXWTSRSSUUVTOOPQVYXYYWWTOGQ[\[^^a_SMONMNMIFDDCEHLOOLFBCABBCA=@EDGG>@NYWIFMOKMOMLOXYL7COSUWZZZ[[YXVTRSVK=FPQQRSSOKGBBB@?>:8779@A;7=DBAEEFOORMA=99::75=LWfuwy{~mC2767:>EGA96652;HI?78?B?<87:=BA98;98>AAHOONNKB9;=>:40474?RSPTQIHHGLPMJJJIHKK>6893002468;=>?@AEHKNSSP\lolqoWB:Ctd;>937:526@JPJDA;7DWYSNLIEA@@?@ABDGFDDDC@=9:>BFFEC@=:887840.016<<9886421/-.01/2BOURE<7:JQC;=AE>CEDCDFHKF?;9876798219?:56:<;713;?BEHJKLMMNHECEIKGB<=>:621222358:506L^aR=;?@>:9<;97886779;<>BB8.++178633/*=QWQIB;999:=>A=4/-...368:;98BA7334678763455642344455544852260*2690.=FEEIIGDBAA@>=?=958;@@@AB><:99998;96:7-*,*)0<=65206=>=@B8,/2443//322100136667;?FJG=59=5.393-+*+.0456896.((/,,.1136521112218=<60*1?>8:87547?@@BFIKE;8:714;:.&/AOLO\O;29:3/,.0147::2264IgY8566654:BB?AG=2>IOQSUVWWXX[]ZWUYZOEFKOPMKMLILPNEA@>:8778?C=9>EEDJKJMLTPE?;::3:SpzlqvwrdPE?9579;EF;34635?JJB;?JKC;8:<::858;78?BAJOMLOI>7:@>AHKG@BILD75IKLKHIIEJPLHJLHDA?89@?720135558<>?CILJIQWXdplft{[;0MX08958<;:767>AFKA39LUUPLJD>=?@@@AEJGCDDCBBBDFIHGGEDDEFHD@;84214666676200/..01.9OVOE=:8?LJ<8:=>96771-155546898856:>AB@CEHGA=::8867523577557:9/+14/.6?BBBBCBBABCEFD@;434421344469734@U`WD5:?@?>===<;9538;?>9AG>3./135633<>9CNNHC?98;=>>>;738>8.+//+-454422;00=C=7??839?@@ABC>999:;::=>===830/2:=9443169>>913=?>;7/2@<384215:A@ABCDFJHC=769;3))/8GOSVF.)250-,,--/8:0-1608OA,-0247;<<<::;16N>7P^^B.*0@JNLO_YM_f_q}f=.63-.,--*7PO;26;BB82/,;\k]PHEGF>3&(CI96756;?@=;BCFFJW_`YVRHCILR]]SFACDFJMORY`d]afZA9979FNPRUTTTSSUYZVSVZWQPLMSSE;978ADDFFEKMB77=<8;CC@<@MRA67@DKMIITZbkibaooK32WwG5;89AAA?=<>@@DGEBBEJOPMLH?:>@@@AFMHCCCCCCCEHKJHHEDDFHLNKHFA712689;>>920/./11/7KUL>899=C=53322221-+/6754247778768;>><=;;:96312534:;9886.07/(+7?=;<<<=>>@BDC??>6//23344468:958GUVG85:>>>><979==@=7=@83/2@A5/0:FHDHLKEA?9789:<>A>56AB:793((253224:;:887758<<=<>?<989999764312/,,.,+5=;79>A=39GKGEDC@>>??:27AA>@DDB=:89:;<>?@@A>:89864213322/2;;>C7/1247>>81251.1.-3=@@@?>=E]S?Te\iv\5.9:41,*.1>SRDJ3)03446?C@>>;/)*,-///--,--..1,$%,.-/443011,'$$%%%)./-.16RRQQRQQQQQRUVVTRRSSRQPNNMLKGGJLMNMMMPPNMNMMOOLJIJMMMLMNNNMLNMMLLKKKJIIHHHHGHGHIHHHILNQQRTTRPMJKKJKMMNNOQSSSTTUVYXXXWY[\]]]\ZUNHJKHGFFGFFGFFEEFGIJJKKMNOOPRNGBCFIKKLPPONLJIHGGEFHGIKMOQRSVWXYYZZ[[\]XRLHHIKLKIJMOPONPQQRRQOMKKKKJKMNNPQSTTTRQQPPPOPPT[]^caZRQSUUSUVWXXXY[\\hnha]ZZ[cb``[WWY]`aafrzqe^^j|pca```^_bhnlqpkutmtvms{wvvvg\\ZXYXXTZuqZWZZVXwqegdemg^\ailkfn|sccknntx|wphcacefhgcn{ulcdkmkfd`eqyumppmklkifca`aa]]_a\abglklgb_[Y]um]QTa]TZVQ_e[]hnyx`UY[T˧ћURTMGEGIHFEHJLMONKKJIFNSRNIJz±bHNOZe]RIFGGFFFGF]hUMHEFFFFF>T|oqjDNFMRRHXxj`nhUJLOOQRQPJFEFGGJRTRPLKIGGHIJKLLKIHHHGGHGHHHJVveKHGIOQMKKLMLMKKJJIJJKKKKJIIJKKKLLKF~BNQ]\ROQG{POVVX[]__YSMGMh`ttbbdhmg^\_`aj\GPȖLCGHJKMMJGGHGHJFGHKHORPGS^SLPJVc[YUUXYXOJKHJKLJHCDHKJHFFFGNMLNT[TIHJNVVMEAReeefWMKLPYVFFXTPQ\eUGILPQRNEDFCG\WFBDHIHGGILKJKPONLIX^SPW]\Z^_[ONPOMKKNPOMKIIKJIJJKKLMMNPSTRNLPRSQNMLKKIGQl|ryn|vtz~oip~|ojx|se[Y\eg`]ZZ[\\ZXUSRRTVYWUWXWVUTQQPPPNLNPQRSSSSSRQRRQSTUVWXXXXVVWUTSVX\^^\[YWTUSRRRSTWYXVTSTY[ZWWYWTNJKR[\]ZZ[[Z`kihhkl\LPad``_YOJHOGCEGHFCFECGS[``^XVUTQPNOOKC?<<>DLMJOPNWQ?=:<78::ADEMSPIDHF<877?EB>?BFKKKLKIEHHC;35RpnOR[KQK>7:86?IC65679;=>??AEFA:6;CEFGHE>:::?DC?;?EA;5<@947===;:IJ9;;=ADFL?35863458:;=?AHLLKKIDBC?976:;<766312114541//5:962.6:<=?><;==:98:;;;<;;::9630139?=;==:9AA.*6=?==>><=>@ADDB?=?=437765446;<:7=KSL9026:=?>?>==<::;9;==9754330.,--.4;=;;==AC6;JKHFECA>>??=9=B=>CEDDC>:89<;;;;<<:9::6311244331223>F:/0159?@A>50/2233335;@EKD3,6E?3.2311//04357530-+-.//.-----6EIFC;9878?7/0..../2>FB=<====AGLLE;7854434567<=84211212353**),2322348;8:EE;43--5502DL@BF>78;;;;<<9EVK=Na\brV0,6984+-?@:433.**8E8,298621?J<./69:52478420*(+.////---./133+$)/122444211,'&-/*%)220035RRRRRRSSQQRUVVUSSSUURPOLJHHHHILMNMMNNONNNMMNNMJIJLLMMMNNNMMMLLKKKKKJJJIHIHHHHIIIHIJJLOQRUXWTMJKMLJLMMNPRSSSTWWWXYYYYYZZ\]\\^^XPKIGEFFFFFFFFFGFGIJKKJJKKMPONKHDCEFGJMNNNNMMLIGFFHIIKNQRRUWXZ\]^]\\]^`_ZTOLJJKKLNPRRRRQQQQQRQONLKLLNPPPSUUUUSRQPPQQPOMQZ`cbaXQRRRTWXWUVWVW\^_glf]^_chhhcYTV_jjc\`ruid_Wo~fbbbabbaajywvus~~jbaXh}{wxwfZ[YYYXYZV^nbWXZXTkzgegfgld[]`dddgkmihjqurtyoacf_[`hlhdk}{}}ukhlolhhmuz{xtttpmnmieedeee``cedggghwvfdca_i~rQSW[XRRSRVX^ceksvd[W\T|U{glofTJGHHHHKNOMKGJMLJDJWZZVWc_DPPSZXQMJIIHFHJLZ^LEDFKMLIFCCxu\sOEJWlzfL}chwmWDHNMOOMLIGFGGGINSRNLKIGFGIIIJKIHHHGGGGGHIJKQakwpOEIKPSMIJJJHHGGGHIJJJJKJIIIJJKLMLIIRHLOPPQQRM_xSQWYX[]^]SLKLFZc[hcdlti^^bbcjQFIh˜KFFFHJPOIFEEJMKDBCDGMPQENaWNVPUWSVSOSZZOEDEFFHIJDCGJKKJKKKNKIIQYTKLOQPRNGAMZ]_^[ZTOVYLFTe^\[[ZYXVQRUURJDDEFKKGDDGHECDHNMIHPVURLSWPPZ_[Y^a^SRROKHKNPONMKJKKKKLLLLMNOPQRPPNPRPPNNMMNNPeztmdo~sqw{ij{}wis~wdWX\cic[ZXYZ\[WUTRQPSUUUWYYYWTRQSRQOMNPRRSRSSTSSQRRRTTVWWXXWVVWUTSTUXZ[[YXWVTSRQRSVWYZXUSUVXXXWXWUQMKMU[\[YXXY[ZY\gprqaRYgeehif_YRLPX^^YSPPICIYZXVWWVW^\TSSG<=B?>AILF@F@=ViJ9;B=?@@?GPSX^`VLMOOOQUWZXTZ^`_]ZO==CCCJOOFFF=::=DIFEEEFGIKLLMMKID55UyjQR}mSA58DEEHF?7558:98878;==9549>AABB@<<>==??<;AD:25BF:2489>?>IF>@@<@D@@:58:722689FI?5433357899:;@FKKIPafT=:CLK=33666667;@AA@@ADFFBBEIKKMQNMMMMMNPLB;DRPC<<::?BDEGIIHGEBBBDFFGIGC806AILIII@2-/2433/3EJ?@@610/026<@@:12679;953>?BEGFECA?=<===<<;;;;:524BDFD><@DGFDBA>==98;;86556:;939JQH7-039<>=>?>=><98883//.-2887AA23EOIB?BFFDBB@87;:;:6=;>BB>964892++--.:??=;;:;89;:9:9::975545666666:88<=@C;1027=?>>A<68;7641./46?G9-/5;5.+/1110002359852.+-022/,++,('7FHD<:9.1:9/-,-258;DGC<:?@@ABGJIG@::<<;:;<==>@=<:84221266((04544321.03343/+/05CC>@CA>??;:;<=<8ERI@BQ]eiL,*2761,5HLGNQE3.453577+$;G-$,0541@A=2+''(((())+/0/..0///1330*+034553333110.5CC2%(598422RRRRSSSSQQQTVVUSSSSTRQQOMIEGJKMNNMNNNNNNNNMNNMKJKKJKMMMMMMMMLLLLKKJJKKJIIIHHIIIIIIJJLMMORUUPLIKNNMMNMNPRSSSSUWWWXYYYXWY[\\\^^]ZTLFFEFFFFFFFGGGFHHFGHILPX_]TLKGEEEFILLMNMMNMKJIHHJJJMQPQVYYZ\[Z\]^`bfgd^VSRNLLLLNPQQQPPQQSSSQONLLNPRRRTVWWWUSRRQQQPOIFQ`a]a`XVTSTWWUTSTUVZ`a`aa``dkhgh`XWcmmg^[^cfee`Wtkfddba`_aiy|xzpxxXXVay{{yh\\ZYYXYYXWWWWYYUbwifihhifa^_a`_aelpqprtuy~q`_b_[_gjegz~yvutqljknllvytuwvronmieffghijkfdfejih}xgcbehw^RYURRSSSRV_lqsog][[`f]`f>UY\eqlTHJMONOZ\NEO[XJBAJ]osfd\aoRANOMMLLMKIIIIJMPQPGDHOSTSMEEAf|XJf_HCMdn|aYdy|peMHLKMNKJHHGGGGHLQPMLKIGFGIIIIJHHHGGGGGHIJKLMP\yrOEHKPQJGHJJHGGGHHIIJIJJJIIIJJKLOONPfiNMMONOQQRSSZTTXZZ]^_`RJHJDMsUv~idhuzj`accdhNCCAOEEFGIQQFDFDS`H@AA@BGMOFKVTSUMLPMQOLRY]QCBGFEFKKDDFHJJJJJMRRHFORNLNNPQQIBBGKTY_fkaTY\S\dimklncYhi[RPPROGCEFGGGFEDDFDCEKLMNU`c\RRVZ_`\XWZ\XNMMLIGINPOONLJKLLLMLLLMOPQRSSSPPONNMNNOQT^u~spkmbtw{op~uovyrdZ]giec[TVWY[^[VUTQNPTUTVWWXYVRPTTRQONPRUTSSSSTTSQPPRTVWWWXXVTVVTSSTUVVVVVVUVVSSRSVXYZZXUSUXWVWXXWTPNMPW[ZZYWVX[XYbp{wqh^^^Z]eikjd]bjqpd\RRWNCCEFGDHRY]WIJ^[E>DEDHNNH?@=84344557;ABA?@CDEFFEFGJJFDHONOPPPQQK?=HKB=<88@FGFEFHIHFFDBBC@ACDC?52:DHGHHB89:644521:?@D@40//01:CII?57=::@B=:>>?GKJHFDCEGGGHEA>==<<<===:7CHJGFEB>::;:8765579981.=II<0027<==>@>>??:5443440.023120/:HJCAACFEDCDDAAEED>5=V_[]```daP<6532245656786469==64=A>BFC<96575.+,-+/;?@?=::;CIKJJIGECA@@@@?<42;BFECA=87:<;:989;<<;7456777778>73AGCB8/-.39:9:>:37:6310002599/+.*/+)*-////02658:8631.-/11/-+)*)(/BKD98;2.350.,.4;<:;;96100385048643212//02551.222:??AA<9:8875899;BA:CND<74GaT/(1520./;HHEIOI0%.7;:=<..A<+9OO?9?D>6?JFA=;5.*)(*,++*+./..-./0001.*,23224434454459ALJ6$'6>>832RRRRSTTTTSSTUUSRSSQQQQSSPLGGJLMNMLLNNNMNNONMNMKKKKKJLMMMMLMMMMLLLKKJJKJHHHHHHHIIIIHIKJJLMMNLJIJLMLLMMMNPRSSSTVWWYYYYXWY[\\]][\][SMKHGFFFFFGHHHHGFHMU\cjoppgTIGGFFGIJJKLKKLKKKJIIIJJLMNQSTTSUVW\`abdgihdb_[UOLLLLMNNNOQQQRSRRRRPOPRRRRTVXXWWVTSRQQNKHCIY`\]ba]ZXVVVVUQPQTX^cdbaa`cfghfZ[_kmd_[^_Z]fk_Zuwlegda^]^dknvno_WY[r||k\\]\\\\UYbYTXXYVrypolkkkf__ab`^`iuxupns|p]X__]`gkryz~~zvrnkiefhijw{snqy{snmngbehjienwmfc_cgjzqa_bjq|eQXURSUVWXZ`koje``b\[^]@D|tHD?DI[m^KMRSPNZc\X`bXGDKMXpb\XTFEKKKJIKIGIIKLMMNYYFJW^\USKFGFXzdEO`fiZU]W_OauxhiYIGJNNLIHHHGGFGLPPOMLJGFGHHHIIIHGGGFGGHLKLLMOZtmMEGLQNHFIJJIHGGHHIIIIJIHIIIJJKLOPOOPSQMNPQRSSRTTSTUZ\]^__aUJHIKH}hT]_bjn{~kbbdeefM?E?ivRCFFGITTFCHDNgM>DEDFIJLKNNLMNLKMMMMRSRVMCEHKLOQPFDIJJJLLHIQUJBHNMMOMMMLF?DFBLY`cmjVQWZ^]iwpt|dRch^TMOPPLECFIHGEDCBIKGFFKRY]adaXTVcj`SQVVVRMLKKHGIOPPPOLKKKKKLLLMNNNOPPQRQONNONOPQSV^lwuqsqxyìz~zoq|~tltwjd]\ismb[VRVY[\_ZWVTPPRTUUVVUXWSORUTRQNNPUVUTTSSSTRQOPRTWWWWWWVVUUSSSTUUSRSSTTUWWVRSWZZZ[YUSUZYXWXXVTPNNRX][[YXVWYX^jwzrkgd_VNQZaeeeltqqnjgacfXE<69??CQZRB4=XOJNICGPTI?IIEFJH@<9:==<;9548:=@DIMMNRUVPC8:AEHNQRSSNA6899;;::9:@GJIEDFECB@@A@>;7334558>GHC@BDEEFEEGGJK>5CWYUQPQQQRKCDF@<><:?FGFEDFIIGFE@;<:8?CHC:5;DHHHGB?CC:776633;BGA3.///07@GI@9;??@DGDBA??GIHDAABHQTROKD>=>>?????;85/07;<=>??>?A>:658=9/.///-/4:BEAAFHGFEEDDEFFGGH@4?Zb]^becce^G3021013566687567;?849CFDE@57884,+,--,05;;=BKOLJIGFDCA@>??=:49CFA==8217=<:669<=?@<767877747:4.<4101:B83442233742:ACCA@:787;==?;67991,0219FD=FLD=3+?aP.2>:,,5:AHIHEHH7/5:BC?:7>5)9Ub_H?E?3:LVPG=63,,///00,*+--,,-,.0131*'+//1433589999:=@B@7-/9@@<76QRRRRSUVVTSUUSSRRSRQPQRTSOKLLMMMMLLMNMMMMMMMLLLKKKKMMLNONLMMMMLLLKKKKJIHHHHHHHIIIHGHGFGJJIIJIIIJJJKMMMNPRSRSUUUVWWYXWYZ[]^_^^]\YXVQNJHGGGFGIJJLQUV\bjnpoossgVIDEFFGHHIIIJJJJKJJJJIJKIKLHJLLRY^`bbceefgjkhb_ZSNMMMMMMNPPPRRRTTUVUSQQPPUXVVXZZXUUUTRKHFFO^^X]cb`_\]]XVTPQRV^beigedcdegc[_gjhfchmc\]ip__z{mijgdb`_a^^pwpjVYYg~{}l\\][[^`]YfiXWYYYh~smmmng_]_ceeeirwwvsqxo[[```epv{{zwx{xuspmkhddhhq{xqklw|rpnogcglmk^fwvogda`gutc]bm{aTVWVVUVY\^]]\\_hkfXONPJ?L\QGDGDFYYNPQMNLMWaddZMHLNJCyxPTYLEHIIJJNH@FOONNNNVaDQ\^YPQMIIKM]RH]vQRKSPUu]UQHDFIKJHFFEFEFHKQSPONJGFFGGHHIHHGGGFFGHMLLMLLO^jNCFKPLFGIKKJHGGHHHIHIIIIJJJKLMNPPPOPTQRQRSSTTTUVVVX[^__aaaVKIJKIKcIOJ^pr|~kbbcdnaIADDLUGEFGGKUSFDHFFYO@CILMPOKORKJLOSSOPNOYRHLHAFHILPUWJFNPMMOQPFCQMDEPQOSQPNPPMRWQNOSXkoVGS`^Vjzs{vWJSUVTQPPOKECEHHECBFKTVPIGLS]c_]ZWRPW^VIFLRRPOOONJGINPPNNMLJIIJKKLNNONMLLOQQONOPOONRTW^dekqwx{ø|xwt{}rmvpfb_gokfaYSTWYZZ[XWVRSTTRUWVWWWRNOTVSPONPSVUUUTTTRQPQQRTVWWVVVVWYWUSRSSSSRQRSUUWY[WSTYZYZ[XUVXZZZXVVUSPNNRX]\[ZZVVYXYjvpkc^b`XRPPSXZ\lyunjnpmkjZD<8:<>EQSD767BYkkWGGPMB=AJPLDJirNB>BBCEE@@IUTSRQPMPRPWerm_\\XczkH5Ghut|tR@HRXTMEA;7@@;44>B>;87;84:=@EKH?:?BBGSVRRTM?=CCBDC?==>:79;=>@BIMMNQWWI?><9888;@GJHEDCCDDBDFC?=:534558@JJEBEFFEEEEGILLA9EX`WONPQPOOMLLHB@>9:CHFDCCFHEA@>8898>CHA88?FJKHDA@@?<<<9975=FHB6../.06;??<7:CFDCGGECADHIGA===?HSVRLD=;?BBBBAB@<984-,3@KJ?87?ONADE96::=IRI9567;;97456888:85523>@:9547:;<=>@?@BA=:7:>5-/0///5@EEDDJNNLA:ABDJKIJIH@3=[gbbfhfdfdM/*00013454477566:@=76:DGF?9;;6.)+,/00028<@=;::?HNNLIIHFECB@?>==96@H;3531/126778=?>??;5479;:53454/8D=1**+-.0232100.,,+(&%)7960,-/+-,,./000--/113554330++*+*)(()))+2@F>45678985641.7FGGDED93;GIHHGGJG=DPONMKIKLE?=<60/55-*-..9HE=IMIR<7\qoR<@8+2BEFLLF=?HB>>57E=2=H<=LZZQIA90-8>DNOE5*'*01.,++**++**+*-1353,(('*48757;=<<<==<:8669=??><;RRRRSUVWXVVWWTSRQSSQPQQQQQOOPPOONNNMMMMMMLLMLKKKKKKLLMNOONMMMNMLLKKKJJIHHHHHGHIIIIHGGGGHJHHJKJJJJJKLMMNPQRQRTSSTVWXXYZZ[\]`aa`]ZXWUROMJJIHIILOU[ZZ^cdbdimqssoZFCFFFFHHHIJJJJJJJJIIIJIFEGKQV\`bbbcdfeeimnljhd^VPMLKLMMNNNPRRTVVXZXUSMLRUSTVZ]^YVVWVRLHEHT\ZYZ_cedfeZSSUTSS[a`cgfffffgd^[dptqpqoe]\isdcyjjkhhgghkkjwdVZX`wz}j[[[XX[`aX_m`X[YWYenrpooprolmf^]\`hoqnpuxyyuzkZacbelvqpwvxuqonmlkhggp{|}unlruqtrqiekllm``uwyvyrlfbld`bk}~ZPTVWXWVY[ZTPU]bgniVNMMJJORMHGJHDJOMNKITNHMXcfZQSOIE<]eDPTKGHHGGIF@GTXSORRDzWBQVYWS[TKJKGJKRUdȱhOFLJFf|t]KHGGEFHHHFFECDFHLRTRPNJHFFGGGHHHHGGGGFGHOLMMLKLTcMAEIONHGHIKJHFFGGGHHHHHIIJJKLNOPQPPQRRRSTTUTTVVWWXY[^_`aacVKILKLGJj~NKFSeqz~nbcblnSGDHPIBDEGGIKQMGEGIJPMDCIQSYXPQQHNVXXPMUSVZMCDEAEHD@COXRJMQOPQUXPAHVPS]]YY\\\[Z[be]PMKZiaMH[hhgswtyiPHMNQQOMLKHEEFGHEBENX]\UPNPQZfeYNQPMLMOPPHFJLLNOONIKNPNMMLKJIIJJKLNOPOMKJMPPPNPPOONQTV`hnqrusw~~zss}qklyrhagojdc_VRVWXXXYWSRRTWUTVXXZZUMMTYUQONPUXWUUVVUTRPRSSUVXWYWWWWY\VUSQRRQQPQSTVVXZ\VSW]\ZY[WUWYZZZZUTUSRPOPW\[[ZZXVWXYgofd^]fd\XUQNQRLRnxvomnkf`P@<;<;cv|iIAEB@BGNPMECWrzveEAFGIHD@DJLPZ^UMPVSW`kxXTfhoxtiV?:Tpvxue`gmuybFBHEBDB@ITRQNKFEDC@?9;ivrzvLFHIIJKHA:79::;;;;;998679::9:><53;A=977954?HIIIA9;@==IW[USVVMFEDCGKE>?@>:88;9435768@IJGGHEA@ACEILLJC?AJQOMLOPJHIKOSQKHC;9BHFC@=>@?:8<;9<>?AD<37?CGLIB@@<;>A@>;9:>HJB8.-./6999;==@JNFBJNF<<>CHFA@@>;;BMOIB??ADDDCAFJ@3-,-8OZTF889<6589>=;;<;;;>?@AAA>;875.,10-169CGFIMQPLE94:;DLJJOKD=26ShfcdedbefM.*//0222333684455;><626BFBA@;0(+,.3643369=;7568@JONLKJHGECB>=<=:6<<>:3269.,.01356640.-,--.,-./2221-.2/.+*,.//0/.-./243432/+***+,.-02/..3<@=<<;;;<>;647AC@ECBB:31:CFEAAC@>FCBMQQOQVQI@==>CE>EN;=7//0136882374'.AMQRRD0%&****+/5=FC=HQR_ZKbvsQ6620>HDIMD=:>B?:8-+303BFHLKU^UG9.4BC;;EMK>,',./,)(((*,,,,++-3663.+'&-68779<=;=>>>=;957<=<>@A=SSSSTWYZ\\\ZYVRQRQQQOOOONOPQQRRPONMMMMMMMMLMMLLKKKKKLLMOOONNNNMLKLMLKJIHHIHHGHHHIIHGHHFDFIKLKJJJIKKKLMNPRSRRSSSTTVWXZ[\]^^abbbb_ZTRRRQOMKJJMORXYUTVWZ_chotsotq]JEHHGGFHIHIJJJJJIIIIIJJKQVZ`babcdefhhijmmlkjhfaZQMOLNLKMORRSUVVWXYYZVNJLQQRV[]]XTQTWUNJFFQ^ZSU]bdgge`WS\_RQ[[]acedegggd^bipomkid^[erigypelokjllmq|uhdYZZZanz||f[\dnobYVV]b_Z[YXYVVXVT`w}qjjg_`_bkttssttwg_kgdjuyp{tuvspnmlllihi|}w|{omnnqzvrkgjjknnny{yvkjcZbecdiu|TJRW[ZYYXXTNNXcgemmXUTIJUTTNGFHGEHKMKIJSPNOWbb[`ZJDGHIWLHNPKHHGGEBEjzaQNQVRUPDMTXbeh[NKLIJLPNLUwlLEEDBCVl`b[LGEEDEEGGFEGLLHHMRVTQOLJHGFFFGHHHHGGFFGHOKKLLMOQUJBEHOPJFGHKJGEEFGGGHGGHHIJKKLNPQRRPPRSTTTTTTUVVXXYZ\^`abbaQIILNPMMDELiMMJUfkypb^ipVHHFOSHCEFGIIJLJHFHJLPPHEJSY\\TQQLU^]XKKTVZOBBBCBGLI@A@NQLMQOQSTVZSQ\agplYRakc[X\hj\RTWdcKARehimtsssdPJNPQOIEHIHGHGGGDCMXYYXSRNOQU\[RMKLNKGJXgbOEGIJKLLKMOPONMLKKJKLLMNOPPOMKJNOPOOOONNMOQTalnwt{zy{vubc|wlcholghaYTTVWXYWWURRSTVVVWXWXWRLQXYSPONT[YWVVWVUSQRTUUWXYXYYXWVWXTSQOPQQRRSUUVWX[ZVTW\[ZYYUSUXZYYYUSTSRPOPVXXZZYXWXYZegaYclkhf[WRMNKEDM\floolfXJ>;:<>AITWPC::BRexhD>HW^XOKNXZWafqPWoooqbUND:DbsshdmuyrLSjh_K96DRRRQLHGFFFGDHlsXhSNNNLJGGD=9:<=???>>=;878;;:89<<85;@=9:;=<@KQNH@528;:;EQTRSUUUOHGEGKF>@CA;86@IG?>?@@@?@A@?;48K_gffbTPURIC>:779;>@BEGFECBBABB=97669956=FIHJHA98>AEKPH=;99ANPNNPQHDEGIQOKKJA>CFDC?:9<=85;<9<@CB@<87:BD?8/./39;>@CJMNRTMBHTPC:77;?@@A?=<8?GECDEDDCDDCFI=/-07F`bNB:659DIA=;54568CJD>8346579889;;:=ACCBAACCA==>@?<:=>ABAA@=863--/0.5?ADHJMRSLD;6478AG@DLD=;23I``YZ]_\^aM-).-/./12347967758<<=;58=AC?5,),.04776558;833649ENMNMLIGEDB><<<:78840...-04<=9=@;38=;4369<:2-.32-1:71/14333441--135555345/+,.-/321/-,,/0100/002310365-+--,-0.252025<><>AB?<;<;5/8D>=C@@>912669636:7;?BIPPOMMV[UMA723/)&&)5>895RRRRSUX[]]\ZYWTRRROPPPPPOOPRQRSQNMMMMMMMMLLMMMMLLKKKLLMOPPOOOONMLLLKKKJIIIIHHHHHIHGFHHEBCHJJJKJIHJKJKMNQRSTTTRQSSUWY[]^^__bccdghaWSSRRPNPNMNOQRRQQQSW]akqspjhon_JFIGEEHIHIIIJIIJJIJMNRWY[]__acdfgijlmlmmmlmllkf\WRMMLIKPTSUVVVVWXZ\_YNCLNPUZ]__YQPTXUQJBFU^XPT\^bgki_\fdSPUW[^`abeiihjjecbcggfc_]`llgkjaesupoqrop{k\TV[\Y]cdpzcZ]fwxp`T]`_][ZYZZXWVTb~thgfedcelvxuwtq|qjpz{tvrttrolllllggzws{vtqms}xpmppigrxxyo[X]_\afgehr}SHPV^[VXXWRNUckllniYWXPPXVUOHEFGFGIKJHKPPOOTVXdq\GDJGFCFLMMLKIGGDAxIHIS[QoӭMO[TTejf]RLMMLMOJJJJWUJEEDDB@KGNTPGDDDDDEFGDHYbUNMTXUQONKIHGFFGHHHHGGFGGHMKKKMNPWKDGEHPUPIGGJJGEEFGGGHGGHHIKLLMOPQRRRRTTUUUTTUVVWXXZ[]^`bcd`MHJNRSRONFEG`dKOSSU_wt__sZAGHILLEDEGIJJIJIHHHJNQQLHKS[YVOPTUY^XWSQORVH=BB@BLROGEGJMMMPPRTRS\`_bktwhLFYeWNPTbmdWW_g\ABZgfgjnlli\OKORQMHDEGHHJIHFCDPXXVURPOOQQOLIHHNRKGGMaunTFEFGHKMNOPOONLKKKLMMNNOPQPNMNOOPOPOONMLMNSZcjxy}|wadrym`ivoehf[VSTVXZZWUSQSTSVXYXXXUQPPWZVPQPRZZVVVVWVUSSUUUWWXYXYXWWVVURRPNOPQRSUVVWWX[YWVW\ZZZXTQTWZXYXVSSSSQOQUVWYZYYYXZ\dlaax{nkrf_YSLHEDCEM_jie`UI=;:@CCCABA=879><978:<:6;?<9<@AIRXUKA910587:CKOPRUVSOLNMJKH>AFB:6;AKE<;=<;<>@A?>>50=\le^b^TOPJD@;;=;:::97;;53:=:<@ABCE>45;?BA??@?@BCB?<748=?>8246:??FNOSVVVWSGCMTPHF:7:>@A@>FA:<>DJJHFEGFCE?2.09BDS]LA<526CHA=;53434;B@;4367349;<;;:;;;?CCDDEFC<<=@><:<=@BBBA>=;73//15SSIMUZXVWE-*,---1588:::=??>>=<@B<548=6-++-/268:9645;834646ALPONMKGDCC?<<><8510/+,.19@834:A:/19;95123433231..34455665331/+-68788840/-**,,/3231.,-/122222122/-4;9/-/0.-2/04326:==;90.678@A>@8./462,-2466:?COPMHGFM\]ZNAABA;..=EE>EF5AD>DOVC40/.,1>A?A@4.:@;H[[TMID>ACCBABB>:8:>;9899=;8;?=9=ABLUUSH=9;84569AHLMQVTOKKOPLJE?AFE?9=GG?;<=<:;>BB???77LdnhbegXFAFNSVYYL@>@;9EIBBCC@=;::9;CF;217@FIKH=349>EJE90338JUSQPRRKBADDEIKJLKGDDCC@:9;<75<=8<@BBCIL>8@BEFC?:647<@>::AGFGHIKLOMLNQNF@@CHRUKA?@?B@>HNB9=EOSPMNOKEB4*.1:D;=IH?=526@C>;8421038=>81167349;;:::986:BDCA??=;:98788:DFEDDA=960-0+)5?C?5*06>;/.8=9311367775/,+.49:;863122/+,7878872,)+**,+-01/-+-.0122212111.-4:5..10.,2/.3435:=<::=AEB365,2;=>;2/.3520025559=DRPD@FHLZa_XLCB@50<\VF7EC61>EC6046:;::>EHJGJ[X@6<9<7(@B/09LE7;=:3+-35426;;.1<>AA<;:96:AC@=;;;70,-,,,./132221100-)#$*++/0-1777720/.+.8ABEFFDDHJ?STSSSSTTTTUVVWWVSQONMMNONNONMMNMMMMMMMMNNNMNNNMMLKKKLMNQSRQPONMMLKKLKJJJIJIHGIIHHHHGFEGD@BHJGFFGIKJIKOSPNONMOQPPPSVWYY\_``behhggge]UQOPQRRTXWUSTSUVXXY^ba``ejmqspeVKGFFGIIIIJIIIJJMRRQQRQOR\bfiigijklllllllmnoljg_\XOJPVVQTWWVWYXYYWYZ]YPKJSX\]_aZQPVXVSLDIZ_TJLQT[cgghjf]WXZZZZ]]`befgedlmjihfd`aeeabgdZlvjqtqolaioh_`dfdbb``___]^]^`^\_qg[YY[[ZXWX]YXYW`{tjkprnimyzyxurpou~x}fikpqnatyho|ztpmlljoheypmps{~yrv~wrz}zx|z{qYPRZaacdelxzSILKLMQUVWWY^ipeeo]RSUVWVQMLIFFGGHJNPR]gMLMPO^aO\TICDEHHFDEFGG=no9IGIUXn[VLPTQOQNKJIIGGGJLMLKHAABBCDDEDDEGHECDDDEFFFGJS\_UKQZYTRONLIGEEFFFFGFGFGGGIIHHKNMJGEFIMR[_TGFIMIDDFFFGGGGHHIJKMOPQRSSTUVVVVUTTUVVWY[]^aabcebRGGHIMUYWJFGCGLLNOKHO{n_fYFGEGKOHBDFHJLLKKKJHJKNIPLHOTUXY`a][[WPU]]WVOC>ADCDLROLJNQNKRTRRTTUZ_bdkpkf_UPQQTSPMGJNP^`F?VfffhmoaQONOLMPOKECDGIJKKJIGGOUTTUSQPQRRUTTRPS]_\XKAHUZVTRQMKKQRRQQPOONLMMNQTUVTSRRPPONNONNNMMMNQST\ptsʺ~ksoz|qrpjmwqd`_ZVTSSUX[ZWURRTUUUVWUVUQNNT\YRQSTTTWXWVTSRSSUUVVVWWUTWVUTTTRQPOMOPRSUVXYZ[[ZWWXXYYZXSNQVXYXXXVTTSSQOPSSUWXXXYYZ[_dg}wokjiga]L?AD<:Kc_^[WOF?<9@MXX]^PJVSIDCA>?@@BJGDIF<@CDAZzd;>@>@>;:93Celfje\YW]XJAG_ibcmoghh`YfrutqmnphnyPAEGHIJLMNNKJEJP^uBF_cejiWDCDEA=<>@AA?>@@?=>==;;:::==>?BA=>?@GKMMA8;EA646:>EFGLSOECFIPNF?@ADLM@<><=?A@=<=BEA>@?9C]jotsfaZNBATiklreMCLK=BLSTSRMC@BBBEHIJIHGGCAA><==:9=<8;@AABEGA=>?=;:9:<@EHGB<768<>>>AJRKEKC9<><::<<963/5IZWMIEAAA?DNKAAHSYWWXTMG@1)037>758<;<><8342-+,/1358;><9@DA=9:;:=EOROMKGEDB@?>>>;83031.1.>?CF@5121+%=G/369?DEHJ?-'*./1;JNJHMRRH77GJOO7+2105?HF?316;971,0453.,++**)***,..-,+(%',.,*)*16872((((*,4>CFHFCFID9UUUUTSSSSSTTSUWVSQPPPOOONNNMLLMMMMMMLNNNNNNMMNMLLKKKLNPSVUSQPMMNOLMLKKJJJJIHHIHHHHHHGFEEIPUVSNIDDGJKJMNMLLKKMONNNQUURQV\^]_cc^[YWTQOPONOOOQSTRRRSUVVWYZXVU]gkklorroj^QLIGGHIIIIIKMQSSSQMLNSZ`dfghiijkllllllnpppple`]VQTUQOSYXWXYYXXXY[^`_UIJSYZ]cbYOPWZXWOEM]`SIJOQV^fhkkebcc`[ZZZ\_bccefjlkkkiiijgb^`fh_iufiqqvlW\jidgjjhgea]\]^Z[`djjju}l`ZYYZYWUWZZY[YXputxvqmkr|~{ztqplejx{oedihgry|thmvqmllikjd}vkloklnlkkq}v||zwmdfd^SMV_`_cjuySLNMQSRUWXY`hojZZg^QRSUYUNJJIHFGHIKQVWdhLKKFGdUFZ^KADEFEB=?DGEAGIVRTVVDJWJJSOFGFDEFHGGFGJLKIFDBBBBCCDEFFFEDCDDDFGFFEFLPOJEM[\WTRPNJGEFFFEFFFGGGHGHHIIMROFCEFKRV]cWFCKTLCDFFFGGGGHHIJKMOQRTVVVWXXXWVVUVVVXZ]`addcdg_JDGFEFLZ[IFJHIMNMNJN`jl`aNDFEHKKGBEIKLNNMMKJIJKLJKMMSUMQYbc_XTQMV^ba]WG?BDEGJKLLNRURV^^URPMPY]^dkpnke]YXY\_[NIOMMVWEH_micjtudMMPOMLNMGBBDGJKLMLLJJNSUXXTRRSSSSTXZYZ`eeYLFFJNRTTVRLJRTSSRRQRPMMMNQUYZXTONNNNMNOOOONNNNPQQQVW^ʾx|~sxwi}qpvqowug^][YWVRSTVXYWURSUVVUUUTTSQMPZ`XPQTRQVZZXVUTSTTVVVVVUUSSTTSRRRPPONMOQTTVXZ[^_^YVXZYXYZVPOSXYYXXXWVUTTRPPQQTUWXXYZZZ^_p{gcfhgc[XL@@D<9IVLLNOJDB>9DRSU`\PMG=ADFIMPSRJ>@U^XdD;Ukonkh`QDADA?=?@@?<<>?@AB@===<<;=@DELQL?8>A@CE;17ACAA@;;?<=?EG@=A?9BW]pxbXURJ>JjutvwcQYaQB<<@ED><;95247777523<@C@?;89?>4/000144:JVXUOGA?@>=AFHGHJLKD@BB@?>=<=<7;AAAABA=>BBBA?<9:=AEGHE>::<=:>BDLTWWXWQKGD7-19>?93158AB>;71./00246678;7455554686779899986433//220.-/026?>?@@@=850+*/KSSP<././5AMG@><=:86894:A<654107;21?A56<>:889:;759>ABCC=5.04653.+064430,+**)*-./.-./130/--,--,,++05.(()*+,-+,.77.+38:=;.(((*+7<:7553;<84225998655570.+1=DZ4*DRGIMPMHIJJFBEIKLF79B=6783//21..12.%;Q;5;;BNHBHD3)/3;=APSKEEJLG@AJIJN>.*%*;>ABCILJJG=8ESW[[SH?=EJJOUSLGCCMD;;2=^noldcdYE?CA><=>AEA;?=;:>GPWYL:3AGG@>C?68=Fpw`TNMG:?Yoz~{mdd_WJ>>DB?=<:635557:8215:?@BBAAE?41001212=OWWPD<::;::@FJIJKMKC>?ACB>9556:=?@BA@@?BEGGFGDA??ACDINF85BE6@UYOCCADPJ:9:6334530.036>FHC>;=<42>=>@@A@=50.,-06:71/10,.34223698886557=BFE<27INFGC83005@D=::8998748=BDBBBCBA@<71124468:::=AA<>=;;::88986664/4614@C=<<;616:::76;@CCAA>82367685-,6543110.**..*)/69600.,)*)))**)*.2-()**,03/3<>3*+24693((-/01:@@A=7?@=;:998<;89;87;ELD;@HVWXe]W^]YVQ@.,,1H`WFBFSOHEABGGFFB7:A7*'(1CE<7:?;4/,&%3@8+,-./00//.,*****)*.2456650,/1/+)*.2532227?@<:;8-%VVUUUTTSTSRSSSUVRRSQPPPONNNMLLMLMMLLNONOPONOPNNNNNNNPRTVZ[YTOMKLNONLKKKJKJJJIIIHGHKKLNRUXWY^___[PHGIJKJHJJJJIIJKMMNNMJIHFGHHGDEGGGGJLLLLLJIJIHHJKMNPSTX[YYXXWZ_hqvvtqqtoaRLLKKKNNNNQRRRQPPNPTU[ehiid__cgiiknqsuwvrnh^TPNJINQNMSY\_`____^_de_XRPPU]a^XPQVY\]XPOSTQOQRSV\`acefea`ghYORX^^ckf^_dhjklllkmlknjbfgmyzyq\TUX\_ckqohb`__elopmnoo{kh`ZUWWXXWWWX[\YS\zvf^`hnvz}xnhjptzwgaglmswumfkljhcctzkgigeghff`_a^^grtpnnlicfxo[U]\SPU[ZSTZ^bkvnPNRPPZyZXZYVUTT_dPRURKGHFEFFGHOVSS~nGMNKKU@BDDCEFHFCQQDADKNNWX[bgi]UMJHCAFEDCBBBCDFEDBABCDDDDDCDEDBCDEDDCBBBEFGGGFEFFFGHEIY`]YWVROMKIHGFEEFFGGGFHNSSRUSIDFJQWZ[UKOTQLIGEEFFFFFFHIJKLNPRTVXYYYZYXWWWVWWWY[]aeeeffcSFHHGFEHKW\IDILPQMKNNMJ[jfSHFGHHFEDCGLNPQQPNNMLLKJHLKR[]ZXUQLLQTSSUXSKN[cXILSOFDIMPR[cdea]XSRT[^]fnvvj]abURan^FEILLIGDNX[[Zi}gJFGGILQQMHFFGIJLMMNNP[fiaVRSTTTNFCEIZwv[KHIIFGR]XNKIJJKNNKLOSUSNNOOPV[\VONMLMMMOPOOOOPPPQRSSTOdijvuvqqj{}{ztf\[ZYWTRSVVWVUUUVVUTTTRTROONZebURWZVUX\[ZXVUTTUWWWWWWWWWVVUTSRPPPONNQSVWZZYZ\[XVZ][X[\WQSY[ZYXXXXXXVRPPPQQRTWYY[[[[[\api]SW]YURTQEAA???==@CJNNOH;8>LZ^PEGNSPNHKRQMKECHA76:AEB>:8_hB;;:98;:7O~rqsld]T[t{v|rvsnb^tr[M[]``\gvutywcG??@?@@FLQRRQ]egdvwZJ9?dnlgSEB?:547?DGID?AAAA@=:;<<95:JZZN>558>==;;:;AIKJGLPH94=?@>=;964557875566;BGFCBIC51001202ASULC<787679>FKLLKLJC>=?CF?40/2:>>?@?=<@DFHHHIJHFDEFEIMI?BPH7LbXMLLJOUM@;:7458;7139;?74?DFKLOSM?9>;2/17=;988:ACC@6,-045765543/00/24237<<977:><83.17851120./7>?AHJD??@AB@;642246899764-+043037998766666=GJB8/3FH:=D>9656;;<;:9866504BIGFFEDDCCA>7224566899?FE>?EA7;EEDGJKJIFCA@@@?>>><<=<989853560/326@F?5640,7A:488887776883,2323123.)*-*&'/7850/,*(((((())),0-('*+.5769=:0**,1230,.15956>DC=8:<987678;==@CA>@DC;25BUYYdaY][WWR@.110Jlh[Z`<:>EHHIJQTJCBAADMNC;77EFDME.*0.(.AH@ITJ<B5-4<61;MH1').35542.,(')**(+/45677::9::2)(*,/453244662-*(&$UUUVUTTTTSSSSTUUTUTSSQPPONNNMKKLMMMLNOOQRPOPQPPPPOOOQRTWY\\XQLJJKLLKKLKKLLLKKKKJHIKMORTUVVZ^__`a]WQKJJIGHJHHHHIJKKLLKIIHFFGHGGGGGGHJKKKLLKJJJHHHHJLNRUVX[\ZVWYZ`hjghd^\[YRMLKKKLLKKLMOQSTOLMKO^b][YXXX[^bcdiiikoeXXXSQPMKJJHIKPX[^a``aaaaacfe^XTQQXaaUNQVZ[\\UQTSRRSSTVXXX\bc_Zh}mSRZ\W[ff[[ahmmijppnpqqokiho{{pgZUXSV[\fkfdc`__cinplklqwkld`VWXYXY\][]b_VT`pkaa_Zd{{}yrqsvwtusf\cnptwzyhjqogeo}urphdddcehfdc_fx~umosphcft}rlbWW\ZURU[YVY`beo{jNNQOMMpxXS[WIJSTVdΚUPRPLIFEFFGGIPS]LSPOKMlcCCCBCDEGFK[QBACCDKSUT]km[GEGFDCCBBBBBBCDFFDCBBCCCBAA@ABAAABDDECBBCCFGGHFEEEGIGDHTa_[YWTQOMLJIGEEEFFGFEGMSTUWRGBGMSWWQNPTOKJIGFEEFFEEFHJKKLNQSUVXZYYZYYYXXXXXY[]_bdefgg_IELMHFFJMUiWEHINNMNOOQLWm[EDILKGEDDEJNQRSSQONMLLJIHQVVYYVUUROKKKJOTWRJIN[aYTYZOHKMNNW`bb]ZYZ[[\_`eoytbV]cVLVfZEDKRUTLHU^\`\aq~mOIJKLPRSROKGGJKKLOQTY`dc\XWTSUTQOQRRZpp[UPIFFCHWYNGFILNOTUQJJNPMNPPPSWWTROMLNNNQQPPPPPPPQRSS\Hõôstrlwexrppi\Z[YXURRUXZYXVVUVWVTROPSRONVcdYRV\[WWYZYYWUTTTUWWWWWWXXXXWVUTTRPPNPRTVXZ[[XXXWVW\][Y\\VRUZZXYXWXXXXVRNNPQRTVWY[\\\\]^bdKPXZ]ZVSND?@BEEDBA@CJOPPG<67GUXQTfpkVJEGMMNVWNB;769?CC?95TcC<;::::;;BKVo}~|qs~yroiq~}x{`GFM\bc`]]a^dqyueO@=><;;;<@CHUcbcdcYXW^U:BjzcXMHHFB?>AHJIMQKE?=AA=:87768BQYWG:?B:=KJIE@BIPLC@EE@:6@>?AA=;?CBAADEFHJIC;5.;;AG>30/38;=>?><;?CDGHGGHHGHHHHJMLNZ`LEZXHMVSORSLC>=9556684/08??@@@@ACB?6--0210////0/1344324:;75443268549<;9413235?JPRWZMA@ACEB:788879@A=961,,03336;;9856:==:>HH?;64?A8:@><;88;>AA?>;99:9>GJJHFFFFEDDC;2/1488799>EC?==715CIBBHJIHGECCAA?>>><;=>:8:831350.247?@5133.*7F=37943::5@?;@DDBIVSE;85..6>CBMK><@EF<50,(*-.4=;2+*,26*#3EPURJKM?0(*-0/01//024544468668;CJJHF>0(+-/220-.011.,-121UVVVUSSTTUUUUVVTUXWWURQRQONNLKKMMMNMNOPRRQPQQQPPPOONPRTUVWZYQJJJJKKJJKLLLLMMLJKLLJIJNQQQTYZYZ^cb`a^XRKHGGGGGHIIIIJKKIIIIIIJKKIHGGGGJKKKKLLKJJJHHHJKKOQQTZ\[\^]\]`^]_\VOHIMMKJJJIJJLLLNQTUPMMJNWXSQPRTUUX\\[__ZWVRIFGHIKKKLKHHINRVY_`abbbdcccefe`WRQX^ZRNQTTX]^YXYUSSSTVUTUW\__W^|jfe\UUZ_^Y\cgddfknlmnoomlkkkfa^WT\XUXW^`\bd`^]\eoupgdgijmeh`RTYYW[__djh]UP[\V]da^t~zz}xsh[Zfppuwr|vektppoy~xrjdca_cjmje_g}|pnookheciprspjeb\WY\ZVUXZYZ_bdkziOTXSNNWbXVXTIFOLITW`NOMNJFGGIHHIOgXWTMSLLTJDBBEFEHKMPICCCBCDLOPV]bYMFFFGEBBB@AACCDEDDCAABCCDDDCBCBBBBCEECBCCDEGHIGEEHJLQNGQbb][YWSQONLJIFEFFGGGFGKQTUXODDJQYXPNQQJHGHIIHEFEEEEFHIKLMOQSUWYZYZZZZYXXWXXZ]^acdefhhZCCNOLNLKPOQQFEHIMPPQRSNWkQ@BOYRHECDFKPSTTRRRPOMKIIHS[WRRPONNPOOPNPSVPIIFET`]X[UKLNMKMV\[TORWYXW]belup\QV_ZOMY[MEJRUTLKU[Xa[We}nMIIJJLOPQQPKFHJJKMRUY]]ZX[YUTTSSUY]^\ad^^WKGIGEIMLKKLMNNSYZTIGLMMOPPPOOQTSQPPOOPPPPQQQQQRRSSTLɶƶoipspxj{tigjcZZ[ZVSRSX]^ZWUVVVWVROLORQNS^_]WW[[YWXYYYWUTTTTUWWWWWWXXXXWVUTTSQPNPRUXXZ[[XVVTVY\[YY\\TRWZZXYXXWXXVTPNNOQSUWY[[\\\]]^a]@CSY_]YRGCEGHIHECA?CINNSRE?@ACB=HS@>;::::;>><:Hev~~suz~qH471?Wu]Y]dgehxnJ7;@@=;;;;<<>FU`__VLXYZW>N}yQGKJLVYYYYYWSQOKE>96468FSSPSKCMSFEOTSOJORLD?>><>><>HSUW^elwy_;6<>@@=:89>DIIGCFGIJID>:3=lxpjeZQKPX[o~{{tjeUE@DOOB<<<==<;==85>C@??<;>AB@?=;93.04623DMB76:95788>FLOPQMHDB>;:>E>102358;>@?==@ABFHFEEGHKKJIHNUX]YKIL?>NVTQUYUG=<;78>?8>OVSWZPIQVZe^[^G7=?BDGOLB;4875=EJGC@??BB@=5.//.-,.4643/17:733596/2640.5=>=@@B@91.247?@ACC@<:877;AA:40-.0016:865777=CEDDED>=CB8=?9;>;;=<<@BEECA?=>?BFHKLIFGHHGFEDA9336;;878;;9876653>J>6CMMKJHFEAA???>=;>@<:;932241125:<4/254.(2CB:882.11.2798643247512210/00.*()+,,-,,,+'()*)(()**,.0.)((+.14310-**.230,,.2433016529A?;=>96447>FJF<;CA;757:;AITS;1=>=G>444-,0UdWcifJCHXY\oe^`]YQE><<>CIJIMTRPOH@98AHCBMNF70;;53.+&%0AB>LJ879//9951+*.6:<<51//+'(#*APW_d]MGG?0+**,.//26:;88998757@IPVPFGH=35862-.,,/10-,6><7SSSRSSSSTUUUVVVVVYYWTSRQPPNNLKLLMMNNNORRRQQPQRQPOOOONPPPQQSTPIIJKKKKJJJKLLLKJIJLNKFGKORSVXVSW_dc`_ab]TLHGHIIHIIIIIIIHHIIIIJKKJIHGGGIKJJJKLKKLKJIHIHGJMMOU[^aaaccdea]]]VNJJLMNPRSTTSPMMNSUPNONNOPQPPRSSSUXXWYYXWXVPIEFEEHKLKJJIJJNW^`_bddegfeefffc_ZUUWUQOOQSUXY\_[TSSUTQUWUY^cZTj|{kYWVWY[ZZ]^^_`chjhgikmkgd[[]]VRZ[VVZ\\\acb_]_itwncbfgikiki\SUYWX]iokicdXWXV[`gcdv}xvygY_hptxvkf{~iqzpppvpigfgfeehjhc_f}xoqpkkjdbgijg`]_[XY\\[XWYZ[`cflxyeRZd_TPPVZ[UNIHIDEQXO[\RMLNMMMMLKJHW[R^TSVROIECDEHGHIIFDDDDDCDIMRQNSSNGEGHEBBB@@@ABCCDCA@CEBCDEFECEDDCBCFECBCDCDFHHHFHJKP^[JMbd]\[YURPONKJGFEFFGGHFHPSV[OCIMTZTKMQJEGIIIIHGJLIGFFHIJLMOQSUWYY[\\\\[ZYXXXZ]]acdffhgXECLPONPPOLIIGDDEGLRTTRQQYLDET_UKDCDGMRUVUTTTRPMKKIJOUQMKKJJOTUW]`]ZWNIJE?DS\YTPJIIIFDNWVOHLSUUVX_fjngVRRY]XOQ][MMOPPQMRUTZWPVpeKIHIIIJKMPROHFHJHJMPSWXVWXWVTRRSUWY^_[\a^UMKLLHEHNQRPONONQY^TIJNMOPPNIJKPTTRQPONOOPPPQQRSSTSJl÷¾}qsrqo~{psgbfhc_^[YTSSWZ^]YVTUVXXTQNNQPMNX_[XZ\[YXYZZZXVUUUUVVWWWXXXXXWXWVUTSRQNNPQUYZ[[ZXVTTVZZZWY^ZRSYZZYYXXWWYVQNNOPRSUWZ[[\\\_^_ba@;HTXWVTRTVTQLIFCA?BGKNPXSOXYN=5Di|{e`QRbeQB@@?>@A=?BGOH>C@?;:::9;<;<6?h~p{{V979:6CjPV`fmfdo_?6@CA??=<:;;;;<>B@868833=EB@><97:;8@?=>@?@EHEDEFHLMLF@MXQLHEFEBFPWRNWej]E864:CA;EVRFHONPZ``ijdbQ<:>?@BFGA<89;@LOMIB>:>85017:406<=98@>728>BA<=CJLD2/6667DGIPNA;<965>@ABAAA@@@@BEGKOJGHIHGFEDEHD=;==:78;633447846D8.A><<834433349;8.0453/+5@A;774220,*,05430/47533210//10.-./0.....+)*,,+*)*,05895/++/1443474.-2652./0//4767:518A@;@@=;;<@FGFC><>>@=41688:C@.&05464230--2Pa\fhkMABTVcv[Yhc]XJA>>HLJHJNNKNYWH<7=FDDJNPF1+38732/-18;>EC>:0-8?AD?6-)02.48;<3'$'-8?MZ^bdSA><81--....//1311223328GRXXH;@EB<;<81.0120+*(*3764PPPQQRRSSSSTUUVWXYYWUTTRPOOMLKKKLMMNOQRRQQQPQRQPOOONNMNMMMMNLIHHIJKJJJJLLLKJJKMNOPMHINTXWUVWY\`cdbaac_UNIJKJIIIIHHHGGGHGGIJJJJJJIIHIJIHJLLLLLMLLKKIFGKLJNX^___`cge^_da]]WNKOSY[\[[[UOLJNRPOOONNNOPQQRRRTVVWYXZ\_^[WQNKIHHHHHIHIHKR\[Z`efggggfeeghgea\YWTQPPSUTSTWecTUWUSVXUU\_WTcvzp_[[[[ZZ[\_`_`aaegikhhlf\YWZ^\TRVWVV]`_\[ceb_airpiggfjlmqpjbWSXXY]be]`_`\TSVY[djb_kzzpjro]`hnromjcgru}thmlnlhffhkkkjjkfab{xywusrkgfia\[[_[VY]^[XVYZ[`egmulZV^gg\NMVYYLEILC>FQUVUWRKJKNQRSRONHiXL_][[[RFBCEHHJGDDCCCDEGGHLNQQLKKIFDGHFCBBA??ABCCDCCCDDBDDDDEEEDDCCCEDBBCDDCFHHHIIJJSejXM[c^\ZZVTRQPNKHFFEFGHHFGMQUZMCIMRRNKLKGHIIIIGEGQVTPLJJJKKLNQUWWYZ\]]\\][ZYZZZ\^_befhieXKEILIDPVPNKJGDFHGHLX\\YSPLLMUYUOEADKSVXWWVVUSPNLKIJLKJHEFIKQVW_deffYMIID@@DNQKGEDDCCCJUTLINSNNUUT`kk\SSQT^^SP^dVQNONLIOTRRUTTfhWMHHGGHILOQOLIKIGFFJQUURTUUTPNQVTSW_a]]a\QMPNLLLOTYYVTTTPOTYYOKMMNNNMJJILQQQRQPONPQRRRSSSSTRHŪ³vorsppzrg`^a`_`_ZUSRTY]\ZWUUUWYWTRPQQLJR^][Z[\ZXZ]^\ZWWUUVWXXYYYXXXXWYYXWVUURPOMNQVYZ[Z[XVTUX[[XU[_XRV[[ZXYXXXWWRMLOOPRTVXZZ[\\]_^`beK9?FJKJVfdbZUOKGB@?@AFMGKS[\N@847SrqVQf`aypK;?=AGD?=@HNSK>?B?999899:::9:c|~~{@59:::CHJOZgmda_QC<:<;<<<@EIKGBNYUQR^a\bzpMBIKLRZ[[YW[`de[L@8D>:868=MWWW[\SFFMNONOMKQT@4@JIHHGFB:F\]ZbgehqtV75<>DLM::CBDSXOHCCHJE=<>@Pflfcf_D<<>;8=DGEB>89;?CDCFHHD<8559?@ABAA><>=66AMQPQPME<9;:8632227::<>@@??>>?CFDDEEFLNH;7MO=>?@BDA>BDDJPOKFB?=<>A@9/././.07::63213313=HHDFJD@>FHFB<:BJMD5269:;=:=?:9>AB@@DGGGC<86430/0/058;>?=:9:;;94////.-8DB>@A@==;9997443469>A@?AEHNQLMKIGFEEEDKRKA>@>99;8655597224009B?806GHCC@?@@?>>??>=:87521039;4.474207DC=7455530-,-/341//2544321/.14444651/.//////.-,*)+-03357420235569961013443/.0/9@EEA?:?CGHFDA><819C;0132131++12112452223I^^llUEAAHWpw\\aSNOHD?>HJHFIIAGJ@JE0,/8?FMIELL?0.122100248=>>;/3BEADE;,'*&*8=AA4%$(2:6C[[Y_[I75752221/..-.243323336@LSNA:;<;;;:60--21*&&&)1425OOOPQQRRRRTUUWWWYYXXXWUTQNOMKJJJLMMNOQRQPPPOPPOOOOOONMMMLKLMLKIFEHJJJJKMLLKJKNRRSVVPJJPUTTWZ[]_dhigb`^[SLJKKJIIIHIIHGGGHIIJJJKJJJIHIIIIJJJKLMNPQROMMLLKIKQUWXXWZ]YQWbb`a`XONSYYXZ\^\WQMJKMNOOOONNOPQQRQRVWWXXZ\]^^__\YWTPPPOMKJIHKMNT_eeigbbeedghhjjie`]YURSVVROUY^[UXWWXYWUXZTW`feY[bb`^][ZZ\]^abbablsqmg`VUZ\YUPRTUXTXb_\]cffdafkighecinqvsc[ZYXW\^URQSWRUUTUWZah`UYhpljmpmm|sdbefiikommtztihhhhkmljghkllmmnkdau|{}xxvuok[VXY\\WZaa[UUXZ[^cgosaU\dfidSMQOLHHOPHCHMOTVTRMKKLJLW^\UI\LZ^d`YPECBDGIHEBABCCDGKKKONNOKEDCDDFIHECB@>@AABBEKPPHACEDDEEEEEEDDCDB@DDCEDHGEHIHIHPamhVT`_\ZYXWVTRPMIGFGGGGHGGPUWPEDHMPQPMKIGGHHGFFCHSWYXUSOKJJKNSVXYYZ\]]^^]\[ZZZ[]_`bfgijbXPHHHFGNQPMKIHGGGHHEO`e_[NKMOSSUQEAGPVZ[ZYXXWTOLKIIHHCBA@BIPSST^c[X][MDGEDD?@FJHGC@@CGINNGGNOGBMRHQbcTQTQQZ`YP\k_POONCDMTRMTYX]e^ICFGGGIJKMLPQOKHFFHPTSPQTTRQU\_YV[a]TZ`YMLONPY[]`cc`]\ZURQRSPMNNMMLKMMMMNNOQRSRRRRSSSTTTRSQ_|ppopnvqh^]][[\[XURSSW[\YWVUVUWWUTRQPNMR[_^__^\XVZ__]ZYYWVWWXY[[YWWWXY[[XWWVURONLMRX[Z[\ZXUVW[][WX__WTX[[ZXXXXXVQMIMOOPRTVY[Z[\\]]]``gV8:;?AB]og_UQPLEA>??@EJF@FPJ:5676>JD:>VjiyN>;9;HF<@BBCOab[[VOQMD==?AA@?>=<<>AA?B?CTXRY`cknsODJFBGUa^^^`^ftyv]=69;:::=@@DYfbdsjC7L\ckkfb\V\c]URNIIHCA@?>=<=>BECAA>8ADGD@?>85:ENQPNLD;8;=:2,3=<:<<ACCDFEDJMB05JG;=AA@DA6>UO;8>Nd\=15@KNQLBEIGC@GTWSPV^]Q?9<<<;;>==FKJKJHECBB@?>??:4..0.-3952/240,-6@HLGGNMJIMPKIJD=8>>>?@@>>=:40-1581+35105DH><>71341//011011/-03478731179:;==90-/0/./1-****))++**.55202357:;930///474,,6:AEHHGIFC@A?FHD<;?EE?>A=83-9KB1/1/---.031/14687654@Wfl[B;@@DYnaS[SCABCE@@HEA@EA8;>6?F91/0@NMF:?EIB?HB7432100420229?@@><4+)*&+>ACF9(&).05Ja_X]eW>5543441/02335875234522;CDB@<989<<<4-36-%$'&)1778OOOPQRRSSSUWWYYYYYWXZZWSPNNMKKKKKKMNNOOOPONMMNNONOPPNMMLKLNOMLJHGGIIJKKKLLKJKNPRUWYXQHGKMOQU\`dggfeb\ZYSNKKKJHHHIIIHGHGHIIIJKKKLKJHJIIIHHHJKKLOQRRRSQMIHJLNPRRSSSQLN[ea\`bZOLQUX\_``_\ULGGKOQQPONNPQQQQSUUVVWY[]]^`baadedcb`\ZVTRPMLR]bcebYZ_`beghiknnliec^VPQURTSQ[\YYXYYWWY\WV_c\clbca]]\XXWWY[_c]Zcnqj`][_c^SNNPRSWR\g]_bbcggadijkfbbgknulXSY\ZW\aYQTRXXXXUTVW^d^RXecalvue[jsqqkhotux{zzvl_ehgffhlmilmkmnklohdn{|qy{~~mZWWUTUW]b_XUUXYZ]`clo\T`fdggZKFJOU\ce[PIGHKKGIRWUSQT`kmbOeRUZmzbLFEBCEFEEEEDCCDGKKLMKIJIDAABCEIIECA@?@@@CFINRPIEEEDDDDDEEFEDCB@AFDCDFHIDFHHIGL\gl]S^`\ZYYYXVTROKIGGGGHGGEPa]OEGMRRQNKIHGFGFFEGGKPRUVWYYRQONPTVXY[[^_^^^]\\[[Z[]_abehmjWY^MFEHJMNLLLJIIIJLMII]feaNHLNPPPLDDLSWZ[[YYYYTNKJIIJIGEABINRPLKPRIBQ[OHKLIFA=AILLGAACFDGFHHIHC@GMJMTXPOSSVZ]]RYofPNNKGGMTSOPSROQQDCDFHHHGGGGKQPLHFGHKNQQNLPY_flib\_d\KMYULLKIRbhghiihgeaXQOOOPOOQRQNLPRQONMNPSTSSSTTTUTTSSTL»ȼwrpqq{z{r_Z\^__\XSQPQV]^ZWUVUTUUUUSRPNLQ\^YZceb\VW^`]\[[[YXWWWY\\YXXXXYYYWTSRRPNNNOT[]\\\YWWXY\]ZZ\a^UTX[ZXXXXXWSMLKMOOPRTVY[[[\\\\]__f`687<;Dgpb\PLNJFB@??AGIF@>><96678754:>DYevg@;88:JH==ADECBEF?987777799::;DOav_dyO58:;=?BBAFRQKMQSZ^\OCA@@??>=<;?CDCEEBShdlvxzwwdMIJD;@ZqgelgTZwlB;A=857:FJHE>8684;JNX__N6>Z`YY^^]fgTI\geb^gqpcI@@@AABO[`r|_ACMPVUKIV[ZbkYGHKHGGDA@?>==?ADDA<<=9=AA@@ABFHB84:IOE=?BHLHC@@<99?IRQKD@;8=@;2/6?@>=<=ADDB@=<=?@?BFFACH?16DA@A<;<@?8>GA4005FL>47CLNND9BKKLHEKI@?KVVH<9;;98996;HKJIB:83.19ACKYYNCABDC?73225<;;812996:=>@CBA@?FKDB@95423338>?@>ANVVUNHGFFFFFC@GXZJGRK<::9;<<@B:20./132.*-?HFCBAA@@@?=?=5.-120///,))+,)*))()175114689<;73/..069601>FEBDDJKMH@DIFA>;<>>?DH?@GC=@A=<>CHA:9;;<@@DNXWB4=RQAC803JZTG<88866884.-.-14575/,**+)+9@DI<,.+',7H^`[ckZD;64352/.386579754556.'.:@@?=;99@DE64=4&,1)$)1588NOOOQRRSSSUWYZ\\YXXWXYVRNNOMMOOMKMONNNMOPONLLMMMNOPONMNMMOQPOMLKIIIIJKKKKLKJKLMOSUUXXRJGIIJR\`a_]YTUWXUPLJJJIIIIIIIIHHGHHIIIKLLLKJHIHGGGFHHHIIKLLNPQQNHFHJKMMPSTUWWTXbb_adcZPLQZ_^[\bd\SMIGINOQQPOONOQSTTSTVVXZ]]^_aabdfgghgggggfda^_dfb^ZTU[]\_ghfiorqonopf\UXkbUPPX\[[ZYXY]`[Yenn|vZ\^[[[YWTSVW[`\VW^a]\bhli_TNNOPTVYij^abaab``inhhgfgfcfogXUW[\[]ba[\_ab_\USVUX^\UYrwfghfmtzz}zv||{~~}vlbgihgdeilhksokonnomllkj|wey|m[XYVRQV]_\XVWYY[\]`ieSU`a^alrhZLZgjlgYRJCCCCACO\_`bb`didJeZWRczfJEGDBBBBDEFDBB@CHJIFFEEECBABBCHHDBA@???ADGHHEABDEDDDCCDEEFEDCB@BGFDEFIKFFHGHGJ\kiZS\_\ZYYYYXXUROKIHGHHGHGK[[ODCIKJIHGGFEFGGHHKNPQNLJNV`_`\WTTWXZ[[^_^_^_^]\\[\]^adgiphEUx_HIHKQPMNNOONNNMPPOTdg`MHLNPOKGDGPXZ[]\[[ZYTNJHHIJNOKGGOSPMKIGEAGY[OPWVOFCDABILGDBCCCCDILMKEDFIJJMSPNSY`]UYX_pbLLKJILOSSNHFFFGGGGIIJJFDCBCEHKKHHIJIINSOLWfkmpolgehfVEIOMNMFHS^eghjnpmh^SMNOPPORYZVUVURPPPPQRTTTUVWVUUTSUK]êxsopqqtzyqaY[aeed^ZTRQTZ`^YVUUUTTTTSQRPLLT\VVcgga[W\c_YY[[[ZXWWWY\\ZYXXWWVUURPOONOPPRV[^^\[ZXXYZ\[[[]^YSTXYXWWWWVSOMNONOQQRTWZ[[[\\\[]]_e]787:7Khma\OHMKHDC@ADHIJG@<>=9779988=BB@KYJ89;;@BBAADC>>ISW^gaK>>>>?<;;=?BGLPPKVoppztbcdYQOMLJRkzkfknXPjaAEC:85389:867:>:I^\]fV85ShcbgjbW[d]OVhjUKbme\RRRSQP]lp`RB>MXRHE>7:?@AAABHHRsqK@IHHUVNQfpXIWK:=B@ABCEDA>=>??AB>65879ACA@>AHJA64>HE:;@EHLHCBBB@:9AMPIA<;9<@=659:;=?>;>CBAA@>=>@>?FH=;A@79A>>@?@@B@:<=747878==89DKHF>:FSSSPG@823?MOB<=:<=:<:5@NLLM@108@B@?@GMD47F?10665443-*3CNNLJKNTTSOHB?EMLJH>8844TYA4:EHFC@K_W<46=EA::?B;=:>ABBCB@:26CIKJFA>=<<<<;<=:?NYXPCDGHHHGGGCAL]ZNUVE<;:;=BHH<2/-./054,*7GHDCBBBAA@><<@A@???=844653730.,*574;@82343310/011.-..,.252059:=>:4/-/00..010./2.'*))).8:65469;:::951014668:?GF>ADGHBLJIHIE@?>@IK@EI=610IqxqbMFB>CG?5/.4789:998753129<;;DC98AE;03<=9777>PikZD;74452//5976899::995,)2<>>@?=;;CKC238)#3=1))-268OPQQQQQRSSUWXY\]YVWWURSROOPNNPPOMMOMLLMMMNNMLMMMNNNNNNPPQRRQOMLLKKKKIJLKKKJJJKKMPRSSX[UNJFHPXVSQPKEFKPQNKJJHHIIIIIIIIHHGHIIIKLLMLJGHHGFEFGFGGGHHHIIIJJGEFGIKKLLNPRQPTY]`aacd_RLSYXVYbgb[[VKFFGKQUUSPNORTTUUUUWYZ[]_``abcdefgiklnnmljhghcZVSSYZVYbedfmqpprtwtnghu|xj_a_]^ZYYY\`^aptwsUX[ZZ[[XVUWXY\\YWWWZbmrpf^UQPPPV\ab]_ddceb\dpi^_cec^W`dgj^WXZ\]bdaadb_^ZVTVWWXXXWexuoms{ww||xpghiiinmje]\pwiotrqqolihjj^bjVW\^\]][[\ZXXXWZ]]`i^S^ddbbmyxVY_`aQDJHCBFKJEEN\`_]WSTS>\XWWTSPHEHJJIGFDBBAAACGKIEBABCACEEDDDHGDCB@?>@ABCCDCBBBCEDDDDCDEGFECBACFGGFEILHFFGILN]h^QOY_[XYYYYY[XTQMJHGFGHHIJJHEBBEDBBBCDEFHJKKLOPQPKDBFPX`fg_VUWYZ[[^___``^]\\[\]_aeijjXBEnkPMGIMRXVSX[YWQJJLJO`bXIHKORRKDCJU\]^_^^][YTNHEFHJKMKJJJKGJLLJILU]WQ\d\NFEJGACGDBBCEGGGJNRQKGHHFDFMQS[b`[RNSbo]HJKIHMRQOLEDFHKLLIHIIIGFEEDDDDEEFILLLPSRWahgejv{rebd]ICIKMNGCFN\ehksyvkb[QMOPPNPYcb`]WRSTUUVWWXXXYYXWVSVQTŮǿ|xtonswxpwn`]_bgigb\YWTVXZ]ZWVUSTTTTSRPPNJKVWTcmie\Y]ba[VWZZYXWWXXY[[ZYXXVVTSSQQPPPQRRRV[^^\ZZXXYZ[[\YZ[WSUVVUXXVUROMMOOPQTSTVXZ[YY\[ZY[]^fY;58==Nfmc\OGNLHDCBCGJKOMHFE;889:;:;@FGBAFC@@BBBJRTWTF>;?C@;7666879:998:Lrc@COQOOR`}vH3>?;;:;=?CHG@<==?AA?832547CIGBAFMLA54;>947@CEHFBCFIE<8?;78989@D;9@B@AA?=;>@@DC96:;9:ACA@ABBGKHIH>9<>>;<=:;FKB?==M\\XVN@7648CGA=>8577<;:EOLNQF88?A@?>?GSO?<=4-04453222:HRSOKLNJFEDB>::>C@?CB<=>;>BA>:;KQGFPTOF@89LJ4/-4B?;?JQF?EGC92049;:>=56=@>@BBAA?92,-;KOICA@@@AB@=98:>IUUI@CHIIJJHHGCDQ^XUZPB;;:;AHF9..00./8C6*:JIFCBBBA@@?=:=AB>;99876765620-*)8:14A@73431000012/-.//.,0/*/56;95.-,..-+,/12235-')()+1889;638;:99954455208BIG=6?EI>6LOQSPLIGB?>F8H[I:76C`tyvbOL>BEIS\UB9?FE4*-/48;@GRYSHDQY=4IC:CLE:9DK=22018@ACMRL?E]O62322/*-11+,-..-*%%/9;9,'B`m\<674452/1678998887641-2@DB?<:9;=?>@BEEHHHHHHIJIJLPVVI><@A<98878889:99988>C@>Mnf[^_mzr~aI<879<>ADEF?778CFIJHQ]`myh[WWUQP\jZ?LbWE@>;?IX_YbowvcJ>CJE86>CEECBB@=Wx`L_ojUINhT479:<<;:?>>?@:21235>AEC>;;989CHA=AAAA@?;67=@?=844469AFDABFMW_ba\QD>=<>??==HM@9=?L^c_]TDADC>=@?<96115<<=IQLMQJ??@BA@?<>FF=952;EA:5345:HRPNNKJJG@;9:;==??96@B7:D?<::;<>EKNIB?=8404=:2536;<;?LWOC@EE<4-.798BC96>ECAA@?=81.,.;GE=:;>@ABCB=79>=;;?@;7673./6DD4?LIHEBBAA@@@<::@DB?=:65677641/-,+6<76>A=653100/012003566530/566532.-+,+)**++/353-****+/226;86:<966654663/.6CG=319D?/8OQOPMLGC<3*4;JZSC=>@Ec~rWS;.564334568;:9;?=62468GL8''-4;EGKUVSLFGQF8<==BBEGBGY^XTI<>D?;J^d]\qvV755240/36321/-*''1=??@5/4LgQ./8532.-1458::84.**(*-28::<=98=INA457,",4*.;<6331MNPQQPQRQPSRRTTSPNQRRRQNNOOOOPPOMKIIIIJIHJLLLMNPNNONLLMNNMMMMLLLLNMNONKJKKJKLLLLMOPRQTWYYVNHHKKJJIGGGHJJIIIIHIIIIIIIIIIHIJJKLMMONKIGHGFEDDEDEGGHHIHGFFFECDEFGILQUY\bdfiigfecde^PHKOPU\cijda][ZPHLW_]YYWTRSSPPSTUTTTVXZ\]_`ba\\]^][XVUUTSSRQQSRPOOV][W^gd`chnnhfjhdgng_^^^^\\bjeZZV\qgX\gui[c`\a`][[[[\]\\aknh_]XURRUVSOOYadeflole^Z]^XTRSTVY\hqaWUWae`YXWYWWYWWYXUUWXZVS~}zz}xnjnttqignofVRPQNMStvs{~yyxsjfmhcYXd|uPUWWY\fqth]ZWROOVbgkf]_cdfhgm~eIQdkh^K@EXlstng]OHFIKIILHR߾hHPMMNKGGGLRUWXULFECCEGGEEFEDCCDFEDCDGGDCBA@@@@AABDDCBCCDCCCBBCEFFFFCHQNJKJFHLLIIHFEZcPIJGR]]ZYYY[^a]YUQMIGFGHJIGKRLCCKWYOKRZYROJIKMMOSSJCCDFKVb[SUWXYZ[\_``___^^]]]^_acdfiaKDCFSSFCGFGLY[]aca[UQLMRXQLHHIOTPDAHR[`abcbb`]YUPLLKLMOOLRSQRRTSOT]\WSV\`cZNFGGGECEFGGFFAAEGGFIKNLIJJJLNU]WMPSKBBKJFHHHHJMIHHCCFIKKJHFFGFEFEFGGEDDEHJLQVWTRTX]agvv]KICCHFDEGIHCCKUZbjt{{k[USNMNONNP[lpjc^YYZXVUVXYZ[\ZYWUDxôº{xwmovz|tmejmkgfd`^VTTUVVXYWWWUUUUSQONONKHLUTWmwi][]ab`\XX[^a``][YXYYYYXVVVSQQQRSSRSTURSVZ\][[ZXZ\\\[\YYXUTUUW[ZYUTSPLJNTUUVXYWVUWXZYXYXXZ\e]QMJGD=;CM_^YXRJBBCDECA@CHHGDA?>ABCA@?===CGIJLHGBFLQM?<<>?=<;:99989:99999=A@@?a|}qjiZ`squm`VROOLHEBAAB=9:;=BMQH?ABBCA<469GWXN=;;@J[UL_qr|nH7>HH?=EHIGDABA6;:9=>><:==;621236=DFFEDEFD>767657:=>?ACCDJMIFFDBC@<;=?>86>EA><869=;:84128>BDDBER`fihfd\K@=<>?@??GK>4;AIXbdaVC;DIE>;9756777;9:KQKMMC=>BBA@=:=HE36@?;9789;@HH?79;845:=:59:77::K@69?C@@A@>82.-.3::6667:?BBCB:49?85ALD:>DGGJMMMMLKKIMORQHDBA?:68=DF?5./4;GFFLKHECCAAA@?=<;=CEEDE>;9975421.-,4<>;89<=93011001203776:;63378443310./-++)),-551,++***,++0:>>>>:423334420/4?@4-25@6)3;:915A;50,*2LXXSI@AEB=0599AEJQQX^_]\LBII4')+1APIJUOB;?ILNI=9434ALJCDNY_`RJMLGRdge_bS2654225899640($)5??>@92&/D9++032/--15679:82(%%&)/10110248G[W=/-.)$1:209>=751MNPPPQQQQRQRTUTTRPRRRQQOOOPPPPPOMKHHHHHGFHJJKNPQQPONMMMLMMMMNMLLLMNOPPNMLKKLMLLMNPRQQSTTUTPJHJKIJJJJIHJIIIIHHIIHIIIIIIIJJJKKLNOPQNLHGFDDDDDEFGHIIIIJJJIEACBBKRTWZ\adedfdddeedef_QIGHP[djmmlhgmk^QLRROUWTQRRQQSTTSQONORSTUWWVSRRSSRSRRQPPOPPPQOOMNPTURT\_[Z^a`XV\`\Z_`b``ba^[gs^MQSQY]ZXawk[dddge_\][[\__]^`ca``XUUUUSRQRVWW^elnf_[_f_XSRSZVW\\efZUWad^XWWVVYYWXXWVWYX[[Vn|vnkfeeormlotti\MINOLi|vwtllojd][W`ou^VXZZ\]blswk`VPNOVbjmf\accehhl}_AO_cns]CJ`lncYZXPHCCGHHIG<{՜^GNLJLIEEEEFGHKIGGFDCCDEDEGGGFDEFEDBDGGECBBABAAAABEDAABBCCCBBACEFGGHEKVVNKJGHKLKIHGFTYMKKGMY\ZYYY[^a]ZVQNJGGGHKJHIKFBA>DKSYa_RKRXXUWZZ\XIBCCDKVXPSVXXXZ[]```___^^^^^^`bddfh[EFRY\\VLJOOGNY^bgd_\ZURSQJJIGIOSK@ALU]abcdccb]XUROPOOPSSPVWSRUWUT]b]VQLHLSRPMIECDDEHJKJHCACEEEIORNIHHLQSTZYOMQNID@ACEEFHHHFFFBBEFHIIHGFFEEFFHHIHEDGIKMRUUWURNOWi}uaQHDCEEDDFHHJRZ^RQ\jvyjXQOONMNONMVhtqga[WVTSRUXY[\][ZZLk¸IJzxvnjrxrmjhllheeb^[UTTUVVYVVVUUUUTQPNNLKIGPVVf|ra\[`db^ZWX[_a_][ZYXWVVVTTSTRQQQRSSRSTTQQUY\[Y[ZWY\[\[ZYWVWVTVY[YWSRTPKJPTUVXYZWUVWY[ZZZXXZ^dZWZ^c]TKJWdaWPIC>:9;;669AFGIKKGGFDA?=<;98?GKJFABDIOOH>:<=>??>;:::89;:::::=?@BCQVSe{}yyoMKfgebdcdinolaN?<<;:<>>?@=;?DDBB?;5=JY_N>8AZdW_tue\\]Y`jhZLNZkziXP_xehZ6068>?<:;<=BEKC639:6456>NOTbitzmBCJFGO_hP?T\JB=8:AJRHB^xy|iKAEGGFFHJKKHBC@9aaNXVOJFD>988=BB>88>BB=:<=<=<8510249?ACFDC@?<:86447:<<>@CADLNKHGECA>;:=@A=78CICAFJKIFDEFB<;>=99;:974218BEDEEL]ijieab]K?<=>?@@AEF;2:BGQ[`^UE6:FG@:4115;=<=::LSMLE84885A\ZNPOV]TB@BFGD@=;CNG61954;AON=6;@?=?AA?5--.05842466:>ADI=58<=3,:F=7BGFEKPPONNOLHILPOJFDCA>747?HC7..05CPNKKIGEDB@AA@?><;>?ABFHGC<755220/.3;@<53:A>40110011110/38;750/33345321231+((-3861,,*(***(&+9BBA@;53233334535973144>7+'%%%$1@:630,:KXYSJA@D:@`tuZ1.124565373=:75>G@/4<@=3*%-5301132/.3:<;:9841/..0352.--0>M[`VB4./47BGA959><96MNPQQQSSSSRTVUUUTQQRRPPPPOPPPPOONLIHGHHGFHIILORSRPNNMMMLMMNNOMMMMNOOPQRONLKLLMMNOQRRRRSRQQSQNJJIIIJIHIIIIIHIHIIIIIJIJJJJJKLLMNOQRRQLHDBCDDEFFGHJJJKLMLKIHIFHTYXVWY\abaabccdedcfh_OGGNW]^]ae`^cfggj[FHPRQPOPQQRRSRQNMMNOOPNNPPOOOOQRSRQPOOONONNNNOOONOQRWZZZZYWTVZ]^_abaabbb_iwcX[\XTWXUW`ecbfllf`]]\[]__^`c_]_`YQTVRQRTSTTRW_jl]Z_dha[URTWX\a_Y_YWX]][XXXXWYYXWWVWYZX[\Ya{~uplggedbmrqrqrw{[MNO[x|qxupqr{j_``YUZ[YZ\^_`chlqscVPQSYclma\`bcgiij~}eJ?LZWXdbUV][XOJPVRJBBHHFGGOKt]ILKIFDDCDCCBBCHHGHFDBCCDGHGFFEEEECCCFGECBB@BBAA@BDDBABBCCBBBBBDGIIJLOTVOJIHJKKJIHHIMLLLJGJU\[XXY[^`^[WSOKHGGHLKHJIEA@??JRZcZLFQac\]`abYHBCBDJSRRRTWXYZ[^a``_____^___acddfdQHUbab`\OIPSPMX^bgf`]]WSQLHJIHJPQG>CPZ^bcdedeb]WTRQQQPRUW[ZXRSWZ[_cd\TOFCGKQSUSPKEDFIMPNIGDCEEEJPSMGGJNTVSX\WUROKE<>ABDFHGEDEEBAEGHIHIHFEDEFFHJKJHGHIJJNU\_^YMFOhzywhTJFFFEDEFGH[vzplebcqtgXQPNMLMNNMScssib\URRRQSWY[]^\]RcľǶzx|rlxswukjikmheeeb_ZUSUVUUUTTUUUUTRQPONKIFLUU^wvd_^`ab`\WVXZ\[[ZXWVVUTTRQRQRSSRRQQQRRRRQRW[[\[[ZWY[[[]YWVWWWUWYYWSTTSNLLQTVXZZXWVVX[]\\\YXY[cXEPjsrqng`VLE>9769?@=:;>BEHJMLJIFDB@?><;;?DIFB@AFKONE>;;:>?@><;::98::::;;=>@CDC>=Vx|ztbGCS\\_chkprw{vU>9;;<=>>?97=@ECBA?=;5457=DT[Td~{xlA?GDHMRTH>KLEB=8;AFD=<[~|{ePPMNIEDBFNLFDDA7\y[R[VH@AF=788>FFB<7=BB?<;99;;DNH93;@=;:73/-,-5DIA<89BB8679;8567;@DGA58<::>@HSN>>@BCA6,)+/35432446=@CH;8?@;/+5==BKIEDHNPQPOPMIGGLKIFFDC@>:45;=92//0;MPLKJIGEB@@AA??=:::;=>@AA;6543310/4;?;57=A@942200//0/+)07:982,-1245543465-((.663.++))*))(&+:CBCA;53243246876744667=;1))0-*4?AC<0/MUKTTKB@@2%0O|;+//14544160<;:7<==/7>:EKUZUW`bU5*6;7-())*,681794467:=?=0)/-&.;@>@;0)+356754562,1:=;889886556695/..1C[fbYQKGMTQSMA;:99;CNZYSW\ZURPOJQXWRKEFMIEGGSI;>Um?BJJGFEDEDCBBEIJHIFDBBBDLKEDDDDEDDDEFEDCBBAABAAAACCCCBABCBACCCDFHGIONLLKIHFGGIJIGHJJIIKIFGS[\YYZ\^__]ZUQLHHHILKJKLHCBDIOMP[UIDFYgc^`cdVEAABCIPQRTUWXYZ[^`_______^_``acccd^SWcfeb]QFGMTZYY^cge`ZXVPNIHJKIMQOEAJT]aceffeeb\TQQPPPQRW]daXQX^dikhd\QKEIMNT\^__TEDEHORNIHHGFGGKPRKEELQVXUVZ`aVLHGB@ABEGHFDEHFCCGHHJHJJGAADFFHILLKJIGFEGWcdb]PGNgxxxhVQMMJFCDFJIRm|z{pfjjdXSROKLLMNOQYmti^ZTPPQRSUW[]Zd\ZDzƿ{yqtoqmlhjnldccdc^YUTXYWVUVVUTTSQPPONLKHGSZZkyjaaaaab^ZUWZZZ[\[ZVTRRRRRQRRTUWWVSRRPPPPRV[\Z\\[YWZ[\\]YVVWWWUWYWSSTTPLLOTUXZZYVWVUX]_^^\YXYYeX@IeuokhcR@8679;>KXXTNKIEFJMMKJGEGGGEDACCCBABBCEGJHHC@>=:>@@><===;99:<<=>?@ACCAEBIk{maYPORX\]^_^WSXjpT@;>>>??@@=>A@CBAA@@FLPJ@<;9>P__jldU?GZdm}jWZb_ICVQToqcW75669=>>=AHKKC76CF:5568;4BG=Tsvouk>>:>AB?>>XzyybSWXSF=;8COMHFD@7T|}l]WZSGBCB;799>@DD?<:;><4012345:>BAA@>?><;=8888777=?BJJFB@@A>99:;;<<=;=FJDBFEBBC>DIJF@;514A?==92//049BD<=>;=<59BHGC?<<=?EIE738723431//2AMNLLJHFDBBA@@A=<603854434545453237;:779<<:85442///////278983,+/3567776872)(.51,*(+,//,**-8?AAB?7211443488:87558;=@?42J_XB7?HC5(,SoXPPJB=7.(%9tc('--.010//1.:97;;272.GU9.572/.24767:BD<8;<0,5?==8,'+577;><665-*179869888766662010.6K]_[YXU]iaTIAGL?//7?QRTUTTTTUUTVUUVVWWSRUUSPOPQPPRQPOMKIHIIGGIJKMPPPPOOONMMMMNNNNNNOOPRRRSTUVWUTSRPPPPQRRTTVWVXZZXSOKHGHGHIIIJIIIIIIJJJLLLKLLLNOOQQQQRTVTLEDDDDFFFGHGGGFFHJKLOSTTRQRSPMPYbghiiiiiiiklj_RLKMLLJHGFEEEFGHHHJKKMOOQQPPPQQRRPMMMMMNNNNNOOQTWVVURPPPONNNNNNNMMMLLNU\]]adddcaababbbdeecabdefc]VUVZib[airhgd^Z\accb`ij]VRUcgUKOQRRRV[]`gkiYSX]fh_XVY]X\fhgb_bb\ZYXWXXXWVWVWWWYYXZ\_`[[oxqqpmkhihgjpspnqsutubMPQUZY]qqclkinoicbcimkfgkmfVRQRX^fmi[Y^_`dfneNAABLU`b`_^QIFMTSY]SJJKJMICFGGEHD=@ciFBLNMPU[__[VQMNSTNNLFEJNLHFDFGHA>>AFFB>>@ABB@>>AA?@@@@=98;=>@BDDBDCBD@;Ogf`[YUSVVMKKD:6A]bLABBBBBABABBAAAAAABCGGA;:;<::I[greUJA@Jg}yd]ek_JEUSN^wsZ62745<><>EMRJ=59DC8578877=621133469=?A@?AA@@A>9653339>@CFC@<@EDBCA;9?E>79:868:855;@DDBJ[defea][UE:9;<@GJD<7315=CGKLJIFJI>;<;;98;CIOQQPONNF839@FUU;+-2<@D\kd]TFDHMZXKNM>.+28A?79;>A=7579=EFA@ACC@=8459=@;9:9EHB?62JSTRRTRG9;EIJHGEDEEA9310/0--/9IONLMKFDDCA?>>>=4,/45431144657779;944542211255211243576434320-.377:<<99<6+)-,*(*,07:5.+00'7OKD?0,-.28?CCABC<-/7;:5+&+499;>?743,&(,38788887753/,,/0--2;DGJKHMXa^UO\dM,&.4RRTUUUVVUVVWXWWXXWUTUTSQOOQQPPPQPOMKJKIGGILMMMLMOOOONMMMNNNOPONNOPRRSUUWYXURQQOONOPQTTTUVVVXZ][VQKGGHIJJKKIIIIIIJJKKLMMMMMOQQQQSRRSVVSMHEDEFFEFFEEEEEEFEGKLLMLLLMMIKT`ehijjkklllkllaSMNPQQQLIHFEEEEGHHJLMOPSTTTSTTUTRPNMLLLJJLNPONMP\ZRRQTURPNMMLLLLMLLNMRXYZ`ddec`____abbcddbbaaceb_^_ake[plW_`[SUZacbfml`WPVkbMLPRSQQUZZ[hpjYSUYfkd_^\ZTZfihghmj]YXYWWXXVVVVWWXXYY[\^bcdt|vvtrngfglpstspnosx{}veWUVUTSVaqqjzj]jkhihlkjgdhqohkteTQQQX`iojaY]daafpv^BHRZ]]XQWcSDEKPU]]ODHQNIFBCEFECCCEBJHBLSJ@EJMKFCA@DKNKGFEA@GOLDBBCDDEEFFFEEEFEDJLGCAAAABCAACDEGJHFEGHIIGFEFMNE>=?CEFFFEGHHGGBF]lc[[\]^____[UNIIHJKLLNNMKILRNGFHHCBG[gXPam_H@@@BCFKORTUXYZ[\^___^_`__^`bbbbbbba_^^ZNDAAACJRRLP[de[OIJKKJFGMOKPSI@FR\dgghiiggcZPLOOOQRSSTZXHG\hlqma^XIQSPRXegXTSMHJJIOTPKNROMLKLLKJFCEIO]bVPSQOJEIOQMJHGFBAGKGFGGHXqyof\agbYNGGMOQPKEGNY^\[[VIDGMSOZtrg_XLECDEKOKI`lPA]vl[XVUUPLLLMOPQRXefWMNNMORSTX[]cSùĿóxmnzypwq`bmja_a`^[YVTWYWVWXXVUSQQPOMLKGEMWVZq{ngcbbabb`^^`_`]]ZYWWXXVTRTVXXYYXWWWURQPONPW[\\\[XWWX[ZYXWUVWWWVXZVSSPPONORUWXVTTUTUV[__^^\XWY[bXKHYkf]URPNL[j\NNHFLUTTVY[\XTUTPNNNJIKLOSSMKF@BA<::;?DDCCDFBADFFEB=:;<>AEMHDDCA@<:;745EWOCFMNJFB?@BBABBBAA@@@?=979;988?PdhVJKJCBYjaabcikmYL\XJGeyS446548;<7589;DRcqoUKerjoN38=D_od\MUlO14=AAAADEHPmweEFMC8347>=;;:7421333579;>??@@@ACB<84334;@AABA?=<=:5576558;;8:BC;8?GHFFB;M]WND>IQPZ\MC<0,/-0577743564369<>;:@GIF@<;:<@D?52:GRUQH=79GPOIBA@;73469CCABCBJUUSOLKHC?AA81047>HLMG<4/.-./1/11./7=CLKHLSWZO;7FSUSSTI7;KMMKIFFF@8467641.,.6DNOLLLHDFEC@??><91/57547854456669940//---0256656467645300/00.--389<<867:5,*.134569==8439FKB>CC??AA;7:;97885455BUNACGKPXYOEEKMHDBAADCAABEDCCDS[P@?FKIC@?=FSTMHHE?>FMHBACDDDDEFEILLLJEFT^UFAAB@ACCBCFHNLGFFGHHKLJHILKD?@BCCDEFFGFFGE?Gapi^^]____``\WRLJJKMMMOPNMLJIGFED@@CP]\OK\l^E?AABCFKOSTVXYYZ\\___^_`_^^`bbbbcca`\XSKBAABCBIW\RNRW_]OFHLKFBFOPLPQE@KV^fhhiiihfb\VRPOOOPPMNPNHK[fli_Y[VSRTRV\eaRKIGJPQSVYWPORQPPNIFDGJKKKMX^UNLIIIFHNPNIEBCCACFEGDAV|qptqjYHEKMNNKHLRZ\Y\[PDBDA@=Jmzrp`JDEEFIJIL\\HF^}pYSUUTTTQMMOQRTV_e\QNONORVXWV]Mkúķ}qy{fzszzeYcmfacc`\YWVWWWWWVVTTSTROONNLIEHRVVfztjebceeb`_^^``\Y]_^]\][YVTTVWWYYXXYYUSRRRPPVY\\\[XVWYZ[WVVUTUVXZ]YTQQPOOQSUUVTSTUUUUV[__^^\XXYZ]UOPZZ[[ZSQPO_aQFCB?CKMR^d`ZX[^^]YRMMOUZ\\YX\Q?<<<:8BFEDCB@=>NbooXJDB?><9899:BPI@CGPRNGA=<>@BDCCBB@?=::98998776=OQFOUPIGJH>Lglk}aO\QFAG[E;855558?CCFE>534555589E`q{vfZ\[RPO>8ABGapK32>KD;<>>;=@GPUVer^B=?:8877??ACCA<75632?HILORUWJ74?GF>:89=;68=AAA@?<869:5123334779<==>>@CGHC>:7769?BCB?><:9623666568965:?<8;AGKGB@??><;:8879?@?>?CDBGRZXWWUTTI=9:::9;=;99846?FFFGJHA>>;9<;9=:4=Va[YZXSD9HY^ZXUUN4.>FB:BRQG?CRXUWTC6/+13..1562.-1531488788AII<440--/1/0-,6CJOOLPY\^]N8.6ITSSTL@:5331/04431/02437;:898765210/144311.,,/2784/0462,,/48:88=?=;86:?A@BDDEFFD<88876686345:==10]|e@>3++.)5IhfQG=0-.,.78.*)))+,/10.3.1L^kgO946:>DIKJJKG<2=NB3204:90,7UoiM@BB9389,6RQHPZTDINLVO8Tx]XG;=4-(+6R\WUNNMDCJC<:;;6,()*.2.*-/.-*()*-.*(***+068:98720/..+,01.+-7DLJKG`nd`ZXK.#&&TTUWYYZZYZZ[[]][YXXWWWUSPOOPPPQSSPNMNONKKLLKKMNLLMMMMLKMNNMMMMNMLOQQQPPNMKKLLMMMMNOQSRRTTUVVWYYYYXWRMKJJJLKIHHIJJJKLMMMMMMOOOOQRSSRRTUUSPKGDCDEEEFGFGGHGFGHHGGGHHGKQUU[fkjjklmmnonlmj^QLLNOMKIGFEFFFFHJKMNQUWWXYYYZYXUSPMMLLMLKKJMPQQSUSTWWVWVSQPNKLNMMMPPPPQTY[[[YXZZ\_``bcbbceeeeddedcdgeelbUUUUVUTdu[^`\XY]`WMT[XVVUUUTTWZcgYUXXZ`bg]YWTQ]T^gime\\\Z[ZWVW[[XWXXYXWXZYYV\{}zxiadflvzxxxwupmuwxjWZa^\aheb_^YTKGLR`kovzqq}|taVX`inhZRROOXeowxhSXbfefblEEMJHDC?=DEADEGJNOKEDFHGCBBABBAAACCDBEU]RC?DGEA?<?BCCDDELRSRMGFLXRD@@AABDFCBDHNLIGDCBDJNLIHGFDDDDAABCEGHECEB>Lcoqha_``_^_a_ZVPLKKMNOOOOOOIDCCEC?DIMMLJLS]XE>AAACEJOSTVXYZ[[]^^^^_`__^`abbcdb`\VNIECBBBBAHYc^VJFS[OCCGIIHIPQMQNBAP\bgihiijifa^[UPONNOLHIJGJT`dfZORYVTSTQR\bVIECDJQWZ[\ZRMNOPTSLB?EMPSSUW\ZSOLIHHJLLJGEDBDB@ADHGFWt~yncWLJKKLLIHOU[[Z[UIAACCD@BXpxu[FEGGFGHEFONHPsvdXVUUVVUUX]`_]\bjg^WVSRRUTRSIPƸƳĶ÷t`t{|}p^\giceif^[YWVXYYXYWUSSRSQNMLLJGELVV_ttjhfgghgb]\]`_\_gkhb^\[YXVUSUWWWXXXZZWUTTTSRSUZ]\[ZXWY[[WUVVTTVX^`WPPPQPPTWWTQRTUWWWWVZ__^^\XXZ\[YSSTOX^]QLNSUMHFCAFOTW\ee_\^dedc_XV\]^^\[WW[R?8:::8ACEDCDMag^TJFEGB;9:;;<====<:9:98756=>AOWSOLIB=E]uMBI@CG8>@FA73555>DDA>825;;8779EXgsrf]eeI6=G@;DH?IiUAFFJSW[aeaRG?=AA=:<8785122246879<>???ACHKIDA?;725:=A@<9620235;>=;98745>>BHE:7;<;<>DE<59@@>@DDBBFNSTUUTSPF;999989::88;?DJJGGKMLD98;:=@?B@7C_jedaZQAEae[[XOTR88LIEFELNFAGQSSQI;30-16438:6/-288103425;76@EC?<;::@D=2,:\lWA:=EB8336558;88BCABB@?@GPUNDB@=;87:977;==>@C@>82681/000/,3HWUMNX_a_`X>4008ENRTNFMTUSRPMKJGEC@@B@=;7413?KOLKIGGGECBBBDFGBCE@=@A<411112479756677676872//016<=94420/0011.*,/0/.0235445=;993.2;ACCCEB<889:8698558853+1ev~aKJ7*/71?S`\KE600/.3>A6))++-./0003/CdhaZP@778;@ILPXVPI=BPG3/05?D>53CSK;:>GMIDAABFJIFD?>?@ABCCCEHJKLLGEBAA@??@ACEGEABGLPPKDBACGJIGDEFFEECBB@@@@ABBD@AWjkppiccdcb`b`\YTNKLMNOQQOOPLDBA?CNURJECFIHLMDAAAACEJNRSUXYZ[\]^^^^_`__^`abcdfaWULDFGEB@AA?GX\WVK@FPJA?@IRRQTPMNG?ET_dhiijjjjf]VROJFEEKKFEHEFRcd^PMSXTSTRNO[]LABBDIPWZWWTLIGHNUXPB=AHLQX][[][XRKGHKLJIHHHFCBBBCGKNPSbzy|uYOQOMKLLIGPU[YXTLFBBDDFEBH\kgQDGGGGHJGEIJGNkt_^[VVYWWdsvttqg\eomhb_ZVSRRRSFͳ«ȸű{nnpdbfhfehje^[YWVXZZZYXVTTSRPOMLJGEHSY^mtkijklheb`^`ed`cmtod_[YWVVVUUWWWVXWXZZXWVVVUTSSX]^\ZYYX[ZWVVUUVVY^ZSPRRRQRUXTRQSTUWXXWVY__^]ZVX[]_\UOOS`aXOLT[XSPKFDOTXdjgccfiigffe^afgc^ZXVOKG>88899=GLLD@;QuUPPKEB??>>@DIIHJU^SIIJIJKG=9=>>@MQIRfaVLKE?>B@;?EEEGDA@AACB>>>><976888:BLONJIHFBHhY4899AD4;DJJ@6687;=;;87@QZVHA>77>C>8765;B@?MZ]b`XNHFHLMB;7358:<>ACFE=9AG?3121247868<@A@ACCDGHFDC@<3359?>84201557>EGC;5535=?>=>AD?109<=CFLPF87;97@ABA=Hbnkg\SICRZOIICDTUDGRJJOGINHBEIGGF?82038;;:>=6008=7112007;208<<<;:98AGC7,5LVH;89>B@?CEC@><;=CB==>??BIMLE@?;:;89?=9:ADCCCB<23127420.003DX^P?DT]cgeP3/1107BKRQNSSTTTTRPMJHGECB@@?<9647DMOMKHGGECEFHIKJGGFA>=<831222379730.-2=@:7999:7005889>=:765544420.,)*,/13543246:=>@BE?-!'6?A@BFA;<@AB=:;:6682/,'.XnryLMM<0/62SWOD9;ACB?;=KPR]Z[e`SPD..59;>BA::A@<::@A:860=>??@@BDEEBBHMQRQMIEEFGHFBDHHHIJSVSRQME?@CACRYLWvxkhhhfbb`^^VNKKMNNPQOOPNFBADR^]SGBACEDEGECA@AAEINRSUWYY[\]^^^^___^_`abcee^ROEAKSLB@AA@FRRMMG>@GE@?AGPVYWMJJCBLZbehjijjjidYQQOICB@HKDCDEAH\g`[\]YVVTOGLXWJBADFFGMROIDDGDAJVWNGCBBEJX_ZX_cd\PIHKMLLMMMLHFDCDGJNOHUz~^JOPNLLKHGMPSQLIFDBBDDEEEHLOOIFIIIJLMLKJIHTmiPZXVWX[l~ytjahpmifb^ZUSRTO{ǹƴɷõ¶|noyidfilljhec^ZWVUWXXYYWUSRPPNNLLJHFP[\htokkmrnia^`aeiddmnid_^^[YXVTUWYWWVXXYYYXWXXYXWVRVY]\YY[YYXWWUUWVVY[RPRTTSTUWTPQSSTUXYWVXZ]\\[XWZ\^aVPLSVZYRNQY^`^WONLKKYgggknomheeihehgeb_[XVJ??=<:88;CLQQJ7EKT``TKV\P=:BD@DFEGLKJIKLMHCDFFA967:<:9FHB<74458=ABCO\[M@=BOUVTQJCACD@<;98996;R_]`]NEMRX]]N8155478:=BFB=>CD;2122466667;AA@BCCBCCCDCB@A?;<<852346669>DKH;1026;;87=DD9/1:@@DKOPG<9767;>>@ABJSSPRSPH?;::::75756CWbc\TRTURPQA.4ADEC@?AFTeiaSG@FM?4537EQRPPOJJKFHMICDEADD:558>?<>>=;60189300/07ED64:<:9;:9:?DE??B@A=658=BEFHHHD@??=;<>@@ABDHGB??;49CFILJ@9JONMJGGFEFIKLKHHFDDB=416971/163.,+*+3<>;;===:636<<999999:998:<:40/-+--031111248=DHLOE0%-7=@ACF>:AGJG@<=7573,),+.=Ij`>BLC8/./796/0B>21.,-382,)&(/100247FLEL@9:?DDA;=QTS]]bmo_M=++8=;=FKGFFFDA>@?61337DMWT8&5GD6;KWUV[M9/+%*9EE71ChqoutWELE876652,+//.-,*/2110/0//11-+.39;;:983+&'(()*--*)+--++1@JWTGEB71/0-+YYZ[[^^^^^^_```a_\ZZXVUTTUTRPONMLMMMMMMMMLLJKKLNMMPQQQSSRONLLLKKKKLLLLLLKLLMMLLKKKMOPPOMLLLLMMLLJJQY_efispZIGKLMLMMMLMNNONNNNOPPQRTVUUWVVWWWWWXYXYYWUTROMMKJJHEDEFEFIMLNWadfhiklklnrqpoj]QNQQPPRPJGHIIIJLNPSUUWYYZ[\\]]WRNMMNOOOOMLKJMNNX_[U]b`YXZ[ZZYUQOPPOPPPRSUWVWWXZ]``^[Z]____``_a`bebko\U[hspbTU]\a_WT]dZV[]`ZRSUTUUSRUYX[Xafa`ca^gzwpUYYX]]a\Yagd][ZZ\\\[[[[ZYXWWYSWtb_afmtqkpy}znowsbZdoswob`bba_^]]^`cYQPQPNNNMRVTTXZZZYYZZXSNN\p}|z^JLQh_CBGDEDCDCDDCBCCCCCBCCHUUPD?AAAFKPRLCBDC@EUa_QEB@D@?IZ`ZTOJHHEOZXUPNRX_b\NBAAA@@A@AABCA??@@@BDBABEIMQSUURMLIGIICCHILRYbdeeedYIAA@B@@;Muonmidd`_`WNKKMOOOOPPPPKFKX`\TID@@CFJJGDB?>?ACHMRSUWX[\]]^]]]^```_``bccdeWGBDSXMBACCAEOVQF>:@KLFACGHLX[PLKCGT]cfijjjjlkaSPUTSOHAFJDABCBDUgiif`YTTPFAJSTPICCFC>AJIA<<>CGKJF6MwtlTMOKHGF>DS`VA@FBAGKIFJ\dWHFLLD?EQ]ZE<;@AC<7=EEB@AFHGFGLRUPIGJKF<78CFB@R]^[VZK;76577>FOX_ZRNLJJGC@?@BCDAAN\ZTZZG@RZ\XLC>GMA79;<<>@@?AB@:3124677645:@A@BCCCCBCDDBAEFA95322365446:AIH9//38:977>D=5108FFBJPH?=>;;<=???@BEIIJNQOG?<:::<;95.5M_^YUUWURQNIB:;FMNLB;?CGUaYJ?>F>3116FPPQSSNLLLNMKIHEBDHE=:@GJC=AA??80/42/12/4BQNB@@>:999;=;?HLMD754.09BGFHJJGCA@@<68@DDCBDE?8768DPVZZYULB?BA?>941.0/1563037APWM>756>Qhb?,02./09FLNQQRTTTTUUSPMMKIGEEECC@<:<;>@>61120,-45-/22/-4BNONNF86<;=ACCE?>AFJGA@@6396/+.3547`O@ENRG7CVTU\]hnpcE?<5<1*(9H@AA81/.-+Z[\]]]^__^^`a``_^\[[YWWVSSSQQQPONMKLMMMMMNLKLLNOPRSSSTTTRPNONMMMMLLLLLLLMMMMMNMMMLLMMNOMLLKIHGHJNVblpuvuyx^LJKMMMMMLLMNOONLMNOPPQTWUWXWXYYZZ[]___`_^^^\[[ZYXTQMKKIHKMPWadeca`_]]_enporsj^TRSSUVWTPLIIIJLNOQSSTVVXZ[[]_\TOMMOOPPQPPNKHILRVZ^elhYVY[_caZURQQQRQQQRSSTXXVX]_`a`bedb`aa`aaacddcca_bhqmaV[d]]YW]`_TUhgYRUUTUVUST[^XSU^dgkhaT_yzrXXY]bVY[V\eib^^_`^\[\]]]]\ZYZXU{m_[`]\fttmoz}zsstlb]]abnwncbecba`acfbYRQRSQOPSTWZ\\[\\[[YY^_VP^u}{wWIMP^\F>CFEECDCEECBBCBBCCCCCGLMJB@@@DJKIEBBEE@EUgl_LBDB??Pa`RIDFGFDMVXXTQPNQ`h`NC@ABCDBBAABB@?BCDFFA?BFIKMPQPRRNHGIHEFGGNZ_`abaa`\RGA??>?AGttqrmhg``bYOKKMOOPQRRQRPOY_[RJCBA@AFQPGB@?=>@CIMQSTWY[\]]]]]\^```aabccdeicKBLTLDBBDGEGU]RE?>DSZSJFIHELWYVK@JY^cgjkjjknhZKJMNVWKBGJB=@CCESekgb]WNJFCAIORQKCBDC?@GKE@EMMGGHGEFMSODFR_^`mtpcUOLKNPPQQRUQJB?@BCCFHHJSPBIECCDDEEDDEEFGCABCCBCEEEEFFGHIJLORTUSONLHK_cQUUVWXV\~{spoooqlhb]\WRSPTоŽͿȸ½~sìyng|ywylam|xkd`^^[YXYZ\ZVTSQPNNMLJJIJISbfpzuqutlllkjikospmsulc^ZYXWXYZYYZZYVUUXYYYXXXYVTRSTRVZ[ZYWXYWWYZZVSNMQTTUTTSOKOQSY[]ZWVXYYYXXWWXZ_a]IGK^TCGWb`\\]][[XH?G_u{{ukfgZ`tlakxaYWSPNIC@?@@@???@>Vij[G=<;:9;?@??>922346788759>@@BCCDEDEFFCABF@633234422328?EC5-0579::>CB711/9JLGJLA=@@><;<>@?@AAABFLQMD><;;:=CB81=SUF>AKPHDNL=?FCGNPSOD?CHRXPA:>>5225FSTTTSRROPUVQLIFCACDC@CHKHA?<HLB8300-/8DLJILLIC@><;9;?CCBBB>70,0D[a^__[WOKRXRLF@?;2111122226BPO@::9825KM7+/1.-3BIKMPOQSSTUTUUTRQPLHGGFEEC@=@@BHGDBADEBB@649:4106668UIL|}Q96;=<=5/,).53/.-.,+*-1202330,,'5WG49HT]`T>BRNPRRfrtjKEE??=FOMHLJ<358?KPQL?>>0)..-,(.;ER[UTRE>@CEE<+'5HJ;@]lxoM/8F:9AA97542/..11*'+2542211334455785210.-++,./279::40-,-/12357861.,++Z\]][Y\^^_``_`a^\\\[YY[XSRSQOOOOOMLMMMMMMMLKKLOPQSSSSRRSSRQPOONLLKLLLLLLMMMMNNMNNMMLKLNLLLKJIMS\acglrttttzxfUOMMMMLLLLMOOOMMNOPPQSUVVTTUUVXZ\^```___`aaba`_^^^\\[Z[]acfeca^[USTUX^elpsspme[TTVXXWWQMKLLLNNPRRSTTUWXXY[\WQMMOOPPQQRRPMKKLMQZ`im`YXY]bb\XVTSTTSSRRRQRVXVX\\]^aefb\[_da_cfdddccbcdddeb_ad]Y_eie]WQ[fiaZWUUUURT]_[VY^`fkg^POdzpVWhojWXYWW\ge``deb^\\]]_a`_][[XZpnUP\^WRR_ntomv{|rqlc`_ahaXajfcgebbbccc_XTSSSRRPRX[\\\]^__^ZY^ebW_vxuTFMRXWHAACDEDDDEFCCCBBCCCDCBBBCEB@?ACED@@@ADEABN_iaLCCAJU^`WE<>ACCDKNMRPIFCBO]c\OGBACHHEBAAA@@BGNOIB@BDEFHIGEKOKFEGGFILLQXXUSQOMKKKHDAAABD@Muusnlb`d[OJKMONOQTUTTTVYVTNJHECBBCSVG@@?>?ADINQTUWY[[]]]]]\^_`aabdcdgefgODQPFDDEEGIOYVHCFEJW^]VKHLJHO[WC>O\`dgkkjilpfREGIGKPMIJH@;?CEGMYcbXSSKEDDDHLLLJEBEGFFINNJHKNJECCEDCKPLNV^VO\lpeQGIKNPPPOQRRI?>??BABFID;_wE>DDDDDCCDDDDEGIECCDCCDEEFGHIIJLKKLOSSOLKKKLMNPRSUSWYX^p}vsolnsojga`WSUK°Ģü|t˾xmotszucfuvkca_]]][YYZZWUTRPONNLJJKIIM^go}{tu{nlkjjnrx~y{xpd[WUUUVXZZZ[ZXUTSSUXYYYYZXVSRTTPQY]\YWYYWWZZXRRNNQTUTTSPLNQRU[]XUVVXZYYVVXYZ[_b\GFKgbJYprf^YZ\\`SBHN`qsbTQZeVduedx_MJLNQPF@@DDCB@?>AF_bTWYXWOBBGHIHHjvanrRAEMV\[UNNQLJLIE_TB9?BEHQMABJKLLMPMIHGHM\fdb[PIFC?@GEDDCBABGIB52?MNGFEEDDCCEGHHIHGKT[gke^[SG=?CA?EOYYPXbm}sdjY<7?BDA=99=L]`[ZQ;24547=??@JG@KYTNX^XQWPHE@<86=EMTTUV]cbef_PC844;CUennX@:::88<=:99622345579887:=?@CDEGGHIIFCDD>85556874665;>><4-0679;=BFB7101988:=?AAAB@@BIMH@>=<<;>DD??HMB4.2?F<6BD78B@@BELRNEBGQRG;876764AQSRRLFENSOOOLIGDBBBBB?BHIB:625BE>863/18<:68>@?87985786@HGHIJKHA=<;=@@AA@@=72-,=[ga`b]VTLGQ[XQJCA@7221001238GPF;8689/(15/,/0/-4AGIMNOPQRSTTUVUUTSOLJHHFEEC@?AGKLLJJGDB@???DHGLKKLKC86894003554336876:@B@95137:87::8997558;:73276/+-./0026;?GJJLKHIKKE@=:>LJIHCC>7754554/.03355CL{~hQCBA>;40.*),,.000/..0242010,)**R]5+9CS^`_J;732/.0450,.599886530////25322110,++++1;@?<40.////1366430-***WWWVUX\___aa`bdd^[\[ZZZYVSRQOMMNNMLLLMMMMLKJKLOPPRSSSRSUUTSQPPNLKKKLLLLMMLLMNNNOONOMKMNNNMNPT[\ZYcimjflrtvyzwlZNKMMMMLLMNOONNNOPQQQRTSQQQRSTUWZ]][[^`cccc_[YXZ^`abbcddc]XVTRPPRTUX`eiorrrrpk_VVWWVVUSQOONNPPPQQQRSTVVWZZYTQOOQQQPRSTUVSNJJLQU\geb`_^^]\ZWTSTTUWXVUWWY\ZY[\YYY\]\Vcpdafedeedcccdcccdb^[cnkba^WTLXkdYWUUUUSV\\YYY][`kf\RKY{oR]yzra]YWWXdiggjg`^^^]_bdffca^`c^[]ZXWTOQYcpsmnz|pkhba]\ov`U]efiiddeda^\YXWWVUTQRWZ\\^aedb_]]_bd`cxzUGIQXTFBBACDDDCCCCBBBBCCCDCBBAAABA>>@A@@@@ADCBBFS^XHA@E]okbYD<@ABDEGFEIGBA@>CLT[ZNB@EKKFCAAAAACKSQICABBBCCBBCHKHDEGFFINOMOOKEBCCB@BDCDDEEEI@y||ytpfad^OIKNPPPRVWUTUUSRRQNJEDDBAQXF>????ADIMRTUXY[[]__^\\]^_aabccdfe]RHGMIFEEEEFLSUJ>DIFLW[_\PMQNLRVI>??AAACFFAHYUKIFDDEEDDDFFFFFGFDDEEFGFDEFGGHIKKKKLNMKIJLKKKLORTXWSTSKJ\mrrokgn{ysxudTTJzĹƩť~ym{{ntxxi_hmf```_]\^^ZWVTRSTSQOLLJHJKHIVdm{zztnlkklpy{{~{ia^[XUVVWXZZ\[XSRTTTSVWYYY[YXUTTTROW^\YYZYVWZXRNPPPTTUUTURPRRTVUSQTXXZZXWVWY[\]_cYFDNnjUnwjd]UT[cI;CUf`VC99M_VepgtcLKOPTQHCGHEDHIIIKTmbWVSNMGDFJKKMPx~|yjbYHBCEP[[PQZVIFLWdjV;8DHIGECACKOMIEDHKOQTXeihml`UMFCDFDCCBAADHF<4;GOPLJJHGEDEDBDFGHGKNUdgcb[G9:BDFIFCILJLU]otwqN7:@EHFHJGVZTSMIH;24446;AB@?:E[`QNX]WPZZNG>:99;AKOLNU`lojaUB77=??<>;9>>865228<<=?CFA70/29>BDDA@HK@7503=AAHNJFB=;:7896:B@???AB;51+3Pjhbdd\VRLA=BGD<9;<8531000118HOD9458830//01101128@HNNPQRRSUTTUUUTTRPNLJIGECCCCFKMMLJFD@=97358?ILIDA;67653004544468866;?@;3--38977:;8664335788746982.,-,*+/8BKPNLKIHJMHA949KKJOLE8+(,01/,()/12376U~ofOC><;41-)*,,.12310/01570,+(+(3R9"6:.;OZ`M8@A==6*'/9>83468<<44Lcfkl[I[pP118BJSCEMLSORSNQC0/655322245335547::99875000/../012230.,+('/>C>:400111259986541++-NNNMPW]__^_deegga\ZZYWWYYUQPONMLLKKKKMMMLLIILLMOQPPQSSTVUUTRQPOLLLLMLKLLMLLMMNNOOOQONPQQQQPRTTQORY[]cilrwwwuvxn[PLMMLKLLLMMNNMMOOOOPQQOOOPQPQTVWUUZ`a`_^^[VSSTUUWWWWWVRMLLLKKNRTUU\fhkqssrrsoeZTTWWUTTTRRPPOPPPPPQSTTUWYXWUUUWUSRSSTVWWTQONOPRW[]`de`\ZYVTSTTUSZ\TY_a_]Z[\\]YWTVT]wijhdcddcefgica``]fto]UWWOOORVYZXVVVVTUZ\ZXZ]Z\hjYRT]tqQ_zxth_YXYV_hkmmf]\]`acfijjgc_gha`d`URUSRUYgrolz{ieccc_Yi~wd\`gjjhfeb_[ZZ[[ZZYYUSY_aadhlfcdddcdgeg{~d[LKSPDCEDCDCCCCCBBBBCCCCDCBBBBBC@<>BFFC@DKKECCFMSLA>?ATnsjdTB?ACFFEECCD@>@?@DKSXQGCEGGFBABAAAELNIECCDDDCBCBCFHFDEEFFGIECJMLKKLHDCBACFFFHJOFTČ}{zwqfebTIKOPPPRUVUVVTTRPLGCCDDCCLNB>???>ADIMRTUXY[[]__^\]]^_`aaaccd]MBCGECCDDFIKKQRG?HLDHOPVYTTUPNUR?26DXZkjieSPVTQHCHNJECJNRRSUbZSXQKGFHHJLNOQ^x|_OLIFB>GTXSW_SABLd{zP6<@CCDFQNEEB>>HEPesrsw[66@AEIKPX^gV=>=9==65786;FMJA=>954-0DMJC>:986425888985465433678;<57=>?CC=;@A72788?B@@ABC@9102456?>AC>:9779=@@?96;<989:5013336676789<==AA:5326>DB>@@:=EIJLPMDAFLKKNOI@=:65;GD;>CDB>94017>?:8;<76;;67=A@?<<:67:=@A@?@>;=AEHINQMJE@BB@>?ADB:2,8Xiebca[WTK=13:713:95641/....1=KH:9DE<8855663356328Ck]YLA=<:3/,*-13687632//.45-+-)),<8 7Y= )7FQLCAKUPH@4+0>DEF<>FCCB<7>FIC?>60-+)$7VVA9<=;80)8SYesdWf~j>/74=^^bOCLMOQSR<'+01035569810699889965886441.-++,,.02222/,1?C<43322357;?=41585.-1IIIKNRZ`_]_ca^^_`^[WTSSSVVQNNNLKKKLLLNMLMLJIKLLMOPNNQSSTUUTSQPNLKJKKJJJJJKLMMMOPPQRRSUTSTTQPNLKGIT\ailnsuvwwvwxl^PKMLKKKLLLMLLLMLMNNONNMNNMOPPQQPRVXUTUVUTSQQONMMMLLMLIIJJKKLLMPPNQ[bciqssrsupaWYWWWVVVUSQQQQQPONPQRRQTWXXWZ]]YUTTSUUVWYZZWPNOQRTZ_b_[YXWUSSTVVXZTV^`^[XZZZ]_\VRSYgmht|sohaaafln`[YZeqn`WXOIHIJJQ]\ZXXWVTRTXYY[][Z\`VQallcQ^z{wf[WZ\WZ`abggb^]_fijmnja^_a^[[[ZXWVRQV[aknpywe^`bcb[avxi_djjjfc_ZY[\\\\\\]\UWellknoebmkhlmngh~rVOQNFDFEDDCCDDCBCBBBCCCBBBBABBA?GRVTPF?DLKCAACEFB??>?E\ke\SD@BDGHGECBBA>>>AEJORPLGA@CB@@ABBCDEC@BCCCEFCDDBBEGEEECDDEC@AIMPTYWK@DGEDFFGIHED;泇}recYMKOOOPRTUUVWVUTPK@<@CDEGFEB>>>=?ADIMPRTXZ[\^__^]]^____`bbdbQ?;BIIHFDEGLIIPPHFKLDEIIMRTWYTRWP>@Q^cehijjjjlgVHEHLNPQRSVSB;FOJGHHJNKKLKKKHE?=DKGBBBBBA@CGHFEDEEDDCCBEIGGEDFJOOMMQOJHHJJKKJGBCFEA?@ABDDDEEEEFGECDCCBCEFFGGGGGEEFGHIGFFFGGHJLKKJIIJJJKLLMNOQTY\RKLLLQ[hnlljhuzxvqgYQUïǶƾ¯ǭlh{uh}fb_[Y]_\[\][ZXXWTRRRPONNLIGHGEFVfn||plrrrtzymid^[\[[\\[[ZZXUSUWZZYXXWWWXXZYVSSSSUWWV\aWTWRNNOOPSSTUUUSQPQSWVUWXZZYYXUVVZ]`\^bb\GBKcULqgWhpqtoO;I[]QPH8=?MZiZU||xdRXYNEACGJGEDGNPPMJOZZYOGIHGGFJMONLas|ZPRRPHBIRUTT[K=@Gd{A6HJB>=Pa[H:;@?AORNS\`abeede_TNJFEDCCBDFIILNOPRRRTVVWVRLE@?BFGGIHIQYcpvgI26AA>87FF=OXZcsxtcB8CDAEILOYb`G2588>C@>??=BJNMKC@Pafd_^YBOPUUE;?==CJJJMWjjYQE65<:7;68<=<=AA<>C>657?HGCEFDB@@=4/48:>DEBDD=64536?EGFGHD>;;:>A>:9:;:=BA<57CG=447522212478788659>@=84238<=738?CMXYUONNEBQSOMJQJ54@>44BKFBDGHGD?:69??<;<=99?BBEIHGE=;:557;@C>:=?@FLJFHOROKJLMKHEEDDE?2/=Xca_^ZTSPE813751/54258531100/6FF=HRMB:66775557930;JSVUPKHDHRTTUUUUUTSQOLKJGGFDDGKMNKFA?>;96:GOL@5/156668628?=::950/386311/289876665676665557:=;4037;<;:98649=8?KMPOMKI>-*272,)()*+.....,/?A6]hHGC?=;81-**/579>A?:621/1/-/1-*9JHI_uG#&+0:KUJKZYROB8=LD@I=?BC?>6*(/GbhYB7765449CHVlptz}~_8/36Tge@9XXOLPQ=,27749;::;60058:;:87647;=<;61/.-,+,,39<:854=D<.0743478<@=0(/66335GGHJLQZ___\ZYUQQX[ZUTSPMNRQPOMKJJKLMLMLLNLJIJJKLNONNPRSRTVURQOMKJJJJJIIIIJKMONOQRSTTVWVVVVVROPMIKS[`ekpqoqwxvvwul\ONKKKKKKKLKKKLLLNNMLLLLMMNNNONOQQNOSURPOOOONMLKJIJJJIJKKKKKKIIJJJQXW\jrrqrtlcgk[VXWXXWVUTTRQPQPPOPQQTVXXWZ^_YWVVUVVWXY[\ZUQSRRRUXXZYXXXVTTUW]ZVYWX]^WUXXVU\d_XZ]XPRlzliijhcXYeflh\ZXXOIJKLKR[[ZYYWVTRRUWY[][ZUTTR\ejYR[}c^]`^XUWWVZaeca`fnopqh[[^^\[[[YWWVSQV]dhilqnbZ^bdd_^l{|nehhhfda[Z[\]]^]\\]Z[emprqpgaosmuwj`irbUTSOKHFDDCCCCCCDBABCCCCDCCCCCA@CUddYOHCB??=<>AABFLNJGFIOTNEABDEIKGECCCA?>>@DJQPMLIB?>=?AAABBC@>>ABACDDDEEDBDFEDDBCBCBADJJMQONNIJMLKIHHHFBF9^ۥ}id`RLMNNQRTTUVWWVUTNB=?ABCEGHE>;<<>@DHLORUYZ[\^___]^^__^^_abd`Q?>EJMNKGEFGCEOQIFKNHHMLLOTUXRVYL>DU`dfhiijjjjaRJKLNNPQSTUOD@PVLHGGHGIJJHHIFC>>DGFBBAABAABCDFFFGHHFCBADHHHHEDHNTRLOROJEEHLMNJEFJHAACDDFFFGGGGFFECDCBBCEEFGGGHFCEGIJJJIIHHHHJLKKKJJKKKMNNNMPRTUYYTOLLPXejigjqzvke`VVIðȲ}xpgnxsa`a]\^][[\\[YXWUTRQQNMLLKHFFECL^ep{qsuuw~zofb\XWYXZ[[\[YWVTSTVXYZYXXXXXWWVTRRRRRTWX]`XTTPNOPOQTTUVUSRPNOSWWVYZZYXWVUVW\`a]^bb[HAEQFHvtMFayzePMEMQITZTFK@>LRB8Xy~nu~`Y\J?R[H>DJKQY]Q=69:<>B?>>=AFFFJYfZMZD26?CL]ms`B69CIE;5334688789779;843347;<;?EJGGEFFGHEA?98988<=86?C87EG816CIIEFHHDBEF8/4<@AACCDC>9775687;<9:CC:9@>507CLF9565321016999:7007==<9424:<758AMVZXSNMNMDAIKLIBIB17II98GUTOMOPKEB>;@C??@?>>AGFADJMOMB<<9778>E@9:=BINLGIPSPJMWZVTSQJDA>54CW^[[YRNNG<30043102224:;89993.6@=:BKKB83675345793.5BKRVPFC99BMUTTTTTTSRQOOMJIGEEFIKMJD@?>==?HPQD4.059988.+-06A<2152/--**,+,+--,=<:400,(+0103=DE>94223661,,EEWdtxB+/./8KYMIXWLF@@JVD7DED=1/8;@@=;4/158<>;666457<>=:854333339?A><959A;)+9844789:;3()/58;:IIIIIR]^^a\SOMJHKQTUUSMKKORROLJHHJKKJKLMMLIIIHJLMNNOQSSRSUWUQNLLJJKKKJIHIKKMOQPQSSUUUVWXXY[YSNMLLOR_lojhfjuxvvvusjZNKKKKKJJKJJKLLLMMLLLLLMMNNOPPQQOQSTRPPNMMMMLMMKJJIIIIIIIIIJIHHHIMRQU^gilstnhoqn`ZYYZZXXWVRQQTTSSRQQSVXXXZ^b_ZWXVVWWXZ\]]ZWURQRSUUWYYXWWUUVUXXV_[V^^TRURNMUejaZ[VXdiz}{|lXQ^u~kh]\[UQLIKMOQSW[[ZYWVTRQSUY\]\[WRRRSTZURYmzpbab_YTSTUV\cec_bjqtrha`bd`][\YVSTTSTX_feehg`^]addb`cp}wihjmjcZZ]adc_\\\\afjnststrbjxy{lTQkvKFPONLMMIECBCDCCCE?ACCDDDDEDDDDBAK\caWIDDDBBGJHE@@GPURLGEEORLEBEEGGFDDDBA?>=?HOPLJJJE><=AB@@@AC?<>ABACCBDECCBDEEDBB@ABAAFLNQPMMNPRQOMJIIGGIKC=̪gecVNMMNQSTTUWXWWVUQGBA@@BDHKH>9;<=@DHLOQTYY[[]__]]^^^^^^_`bd_VQNIKONOJFEC>BORJFKPMMQQOORSOO\ZF=L]beghiijjji]OLOOONOQTUTMFM[VNJGFFEHIHFEFDB>?CFECBCBBAABBDEGGHJJGCAAEHILLGCGNVUMQVRHCAGNQNHHHIGAAFFFGGGHHHHFEEDDBBBCEEGHHHHDBCGLNNNMNNLIJKMLKLKLLKLNPPONPTTRVaaSKMOVafc\`jzoa_YXLk»¼Ĺdz{tpjh|yf^`dc`^[Y[\\\ZXWUTRPNLKKJIIFDBGWajzvuuyxjc`[VUUTTVWZZZXUTSSTVWY[ZYZZYYVUUSRRRRQRVZ^_ZTSPNPPOQUUUVURRPNMTWWWZ][YWVUVVX]cb]^bcZGAAE@?]iQ>?SdZH;CEEA:FUYRVA5:;82Ccylpuc]K8<@A@CCDEGKUblcViz`MB?GHFBBGLJEFILHHZicca]\TMQL>;?CJITnlQ`v{o`[RG<;<=65ANJIYXLJ[`I@NPNIECDDFHHJOMHHLQRSTVYZ[ZZYPI=9AGHHPZSPovU86;BE=Jj|eIUwy``sv^S`eRAAHKV^TB9;><:89==<=;65=GHECFO\O=>K]iH?OVSA:AG]mqtxqQ75@KF<52347:97887898633348;<:>CDDEA:988669=CEDCDFE?:;??BHC86<;44:@GJC:66410247:;:71-3::899625;=76CRX[VLGNSPHCA:8?B=<:5BQG8AU_^XVUPG><<>DGGFHGFJMK@44=FIIE??=<;:=CE?;?DIKKJMRSPJJT[]]][UMFA99DSXXXUOLJ@5/.-.0//00149:;;::1.58642>G?77884245894--2:LWRB;743>OUTTTTTTRRRPOMKIGFEFIKJC>??AGKNRM=//59989;>AEE=4453126526=A?964378657;>=<;;;:976679853336542212326CLUSMHE?5457<>;8::4471(')))*.25=>;JKB713976204C37Biq70;7=BALIHUXGGGKJGRSKHC637:4;AB@>940159?@<6675455%)89557965871+.4<>>AFGIIGDDIQRKEDECBCDDBAA?@>BMRLGFFGE@=?A@??ACB?<>AAABCBBA?@@BDDDB?=>ADHLNQRQPOPQTOTQGJIEAKJEBa¯sfdXOMNNPRSTTUWWWWWTLGDAABDHLH?9;<=?DHKOQTXYZ[]^^]]\^^^^^__bc]X`_MJPQNJGD@;BPSIDJRRRVXVTUQIL[XB>P`deghhiiiifZOMQPPPRSUTOKHV[SLHFFEEFHECDEEB@@BDCBBDDBA@@@ACEFGIJF@?@DFIMKGDGJPPIFUWJA>ELMHDHHDB@BFFFFGHIIIIGFEDDCBBBDEFHIIHDCCJQRPOPRSPMLLLKLLLLLLMOPPONQTURWa_SLMOS]c^XX`fa_]_SW¼ÿ~Ƴ~xrpdiyof_]bfeb]ZYY\\\YWUTRPPMJIIIIIGDDN[fxxurvxlda_]ZYXTTVXYYZWUTRRTUWYZZZZZYYUUSRRRRROQW\_^ZTPNOPQPSUVVWTSQOLNTWUV[][YVTUUVZ^da^_acVFA@?=<CDGRZOJ`nM46AFFGh}qbi~~sltxpfYUdN=DHRTG=:>?<989<;:;:348<;;BNfbD55LTL;9?BA=DY`\g]QXYWdplegiT>7FHFD?734678<><967?@;8888867;@CCDCDIKGBDGIF>88;;;>@@DIE;88412575589755:;888:846:;87IYSLHBI\]OHJKA:<@=67@OSG?I\ge_]YSKA<;=BHNQRPQTRG9//46:=:9>BBAACFHEBCEHKMNQVTRMECISWZ[YXSJ@=?K\[USMKG>5//./22201248:;;951474455:>;:::73134793-+)2GUJ=663329GPSSSSTSSSRQOLJGFDDGKJC=?FKNNOMC73576669><:@?72220/251.2:1193''&(*.05<<;9964879;<;8:91)'*+*+1:AJKB30779;>D<24-FnG4<>G>44?BOTE9?KX]\R;224@=9====9AOVXTL?23?DEJTSIBA@CNfpbvS9868>KKDMKC=4247:13AD=9:9788<>>;456433:@?>;8789;@EDCCA@=68<4'(155788558::526;<;HHHHILOPRURKHIIIJKOQRQNKKNPPPPMIHIIIJIKMLKJJJIJKLLNORTRTUTSVWPIJJIJJJJJJJJLMOPPPRSTTUWWWXY\\[XSPMNQ\abaZYiuvwvsrpfZNKJKKJJJJJJKKLLLLMLLMMMNOOPQQQSRQPOLJKLLJIIIJJJHHIIHHGGHHIHGGGFGFFFGLQTUZ]RPYYWXXYZ[[[[ZYXUOMOSXXUUSRTTUX\_^^\[YYXYYZ[\]^aaca^[XXYZZYYYZYXXXZ[V_ie[T`lqtxvpmj_TQ]syots\RYagfal}|o\]llijd`\WOOPTSTVX[\[ZWTSUY\^^\aeYQPQONRSSKQ`kjd^]\XUSTW\`dhebba`^\WTVY_cb^]YSPQQRSTWY\cgedddcdfhkf`kvkbgmmhd^_cfigc]^`cgjnrzvdgZO^^QFBOmsQPQGA@@ABBCCBBBDENMDBBCCCDDCCCB@@JTOGCB??GR_lqbG?BDB?=@BA@@BC@>==>?BEHGCDJMQSQLMRSRPNLIF[bMIHD=EJKQJgd\RNNOOQRSTUWWWWXXSMJGEEDGJG@;<<=@DGKNPRVY[[\^^]]\^^^^__`baYXadTJRYMCEB?@ACDEFFE@>@CDDDFHQKFEEA=N^WC@CGFDAFFB@BDFFEEFGIHIJHGFEEDBAACDFIKMKGEFMSRNLNQRQPONLKLLLLLNNNPPONPSTUY[WPLMPTUZXWWZ]^_a\P˵Žrroct{idba`bca_\ZYYZ[ZWUTRPNNMJGGHHGGDHSbuzswwmgedca^[ZZZ[\[ZZYWUTTTUUWXXXXXXXVUSRSRQQOUZ[]]WQOOPQQQSVVVWSPONLPUVUWZ[[XUSTVWZ^ba^_bcSEBA==;767;>>>>@BA<:899:IXWUY[RG97<@@?BABCEI[qvnZI]zaLGWa_SLIJKJPTI=@KWqjb`RR]^L@>?DJP[jeXT`ed_\UG@ISWVW[XM@DMVSJEDIQSQJC@?BGHHJOKFHNSRRSTVXZ[ZVPH=7;>?EQUMAH`K49HHJVozv{ty||y\LedI?AA?>@A??=9=A<99=;96766568>DJMNUl]B?BKN[ZOC?><>EHV`efda`^__ad_OC>=;986446:<;9556779;<;87;<<<=?@@CBAAFFEEGEA:678;AB@?EQL58=:67:99:::<>??=>EMNFCFG@87::59GH>@HE=9512446512;BB><;8889988::88GNC=:AV_WOOQOJGFC>67JWSPLFPckf`[UNF>:;>BKY\VRPHB?<=97<;42;GGBGMKHHGFEGIPW[[VSMA8;CHORTXZSHA@GWXRQMID@<63576:62235::98754665469659<9651023562--+0@H<23323./7DPRSSSSRRRPOLJGEDDDIJC>@IJHJJA647::988<>:65200/000340+/:@>964367036;<<>@EG=0'(+.-1337?CB:34<@EML<:@51RW<9CA1*&,2@<<=8ARSUXE8<>HLKKVUE627>CHPBZ\>3,2;BDIC4133448?ECBIE;;AC@==?<71141017=>=:65679;>@BA@@=7794+'+17==636:668;;HHHGGGHIJMNKHHIIJLNPOONLLNNNQSPKIJIHIJKLLKJJJJJKLKKNPQOPSQJLRRNLJIJJJJJIJJJMOOPPQRSTUVXXXX[]][VRPOMU]\X]istuvvtqmaSMKJKKJJJJKJJKKLMMMMKLLLNOOPPQQPNMMMNMKJJIIIHIIHHGGGGHGGGIIHHHHGGDBBEISXTV\]XVRORWZZ\\]]\\\]YPJHJLMMMNPQRVZ]^_`^\[ZZYZZ[]^`ceffda^ZYZY[[[[ZZZZZU[ecWRcljpuwz|r]RRYqu_RQ]hophnukhV]xzqmgdcb[QNPSSSV\^^^ZWVXZ\]^^fkXOPPOOPQQPPPUafb`a]WUUUW[``\\^`a\UQRRUY_c`^YSQQQRUWXX]eifffhfdgnqh`k~rbcihd``bgih]X]`agmpuxwz]]ZPOMDDEQojGIMHC?>@CDEECABEGQOFDEDCCCCBBA@??DHE?<;;=HPPXcZD?GNRUVRIFIIFFIIEDCBAABCDDEIIFFGGGEB>>A?>??>?@@??ADC?>@AB@==@CEIOQSSTVWWTLABPWVNEAEHct\DCD>DSWRIQpc^TOONOPQSTUWXXXYYVROLKHEGHFB===>ADGKMNRVX[\]^]]]\^^__``ab^UYhsiYSI@@A@<=?ABCCDDCB@DHIEB@JXRFFIIGKY[JBCDDCBDEBBCDFGFEFGHHJLJIGFFFC@@BCEKQSOKIKNPMHHJMOOPOLIJLLLLMPPOPPPNPRSVYVPMMNRTQSTUVZ^^_fOo®Ĭ¾~~niqh_la`accb`\ZYZYYXXVUTURPNMKIGFFFGFFO]o~{u}tjfffc^YWX[[[[[[[[YWVUTTTVVVVVWWWVUSRTRQPOX]\\[UOLORRQRUWVVWTNLMMSVUUXZZ[XTRSVY[_a`^`b`OFCCDB?>;9<>?AEEAAE?;;<;;;97FWYVTOD=9=A?>BHGCDGLU`\TLCVv^RUgnkaVPJBKZ[F8:DTne[PRW_ZI?;;H^lpqiM?>T`]YUQUY]^\YZP;7NXG728HUVSKB?=>DFGJPJEJRSRRRRTVY[YSOI>67:=BJPI:@YL3>=;9:?CEEB>?>=><<>>ADFC??CHNQH94:>>ADEFHJC8=HHDBEKMKGHIIC99=@CCA<559856<=;987789:;;88<<13GI85DKC7//3556733>HD>=;887899;=>=:BE<:8DWQKRK@BHLIA<9R^WNIECB@>><;GZ]UPLB@GHGFEEA;9?HD@KSMGFCDGGGM[d^WQIC@?@BCEIOUVLCCEJNNMLGCA@>;:::;954458887:=:96543343793.-./12340-.04982000011126@KSSSSSRSQOLJGEDDCFHB<<==@GC<999?FB>@A?94/--.157788634:=<954367/46:;;?BGPLA><892??@@0)+('*-215>EFFPYRECEA96855:>?:9;:BNNSWB=QQMJJKUO=1/2;616=?>>==MWOOQE99AIIB=83-*,--.4:==94234531:FEA?;9862.))2=FD817??;612599JJIIHHIIGKMJHHHHIKMNNONKKLLMPQOKIJJHJMMLKKKJJJKKJKKLMLKNSQLIJLNLKIJJJJJJJJJLOOOPPQSUUVWXXXY[\[XVTPLMOWenonquvxxsk`SLKLMMLLLLKKJJJKLKIJLKJMNNOPQPQQONOONMKIIIIIHHHGGGGGGGGGGHIHHHHHGFFFEHLPSWZ_`ZVVUUUX\]_^\^^_^\WMFCDDFHJMOQVX[^^^^][ZY[[[]^_]]__ab_\YWX\\[[\ZZZXYY_c[Zcd``htvoeYROZtwdYZfqrsxojigokdevwnhc`ac_QKQSRW^__][YYZ[\\]^ccUMPPOOQTSQQRQS\^^de[UWVUXZZXXZ^b^VQSSSVY[]]ZUQQQQUZ[Z_ffegghhgknle_i}~j^`]abcehecTQ_cdlrs{}~_WXPLLHEFUn`BEGEC?=CHGFDBBAEIONKKIEBDDCCA@???ACA><<>?DJNW_VHEJLORUQJKRQIDIMFBCB@@@ACCBDFFFGGHHFCBA>>=>>>>>ACFGDABEEDB@CJMOQRSQPMKJKLF>@CIKLORWXY\]]]]\]^^_`aaaa]PXnyziM>?@A@??KUQMMNUahdbjpfQLG@;AQ^effhiijjjfZTVUNINTW\\NCCB?>>>BB@<>AA@DHIJNOKIMNHDDDCCCBAABDECCCC?BLQNHBBHQNPXZXXQLMGBCDDDDCCCCDEFHGEFGGIIJHIHHHGFC??DJPUVRONNNLJGFHJKKLLJHIMPPQRSRPPPPPPONNOONNNLPURORTVY]Z`]W´ɱľuxqfgm^^}qf`_`cdea][Z[[YWVUUTUSRPNLIHFFEEDHWj{wpxynfdda\WTUXXWXYYZ[[[YYWTTTTUTUVWWXVURTSPPNR^^[[XROPSQQSSUVVVWQMLNQUUVWZ[ZYVSQTX[\__]\`aZNIBAIGB@>;;:=<<;:;>@DILGENTQQQPMGJUZXQLH?779=@FIECNZG6>ECDCBLo~||vz}yutbZF857;>??@CMPKD<;EKKH@=;:977833CHD@??=<979?DDDEFC@@BEEEFFA>>==?>>AC@:67?KRQ?07ACA?BB>;7358<73:@CFHIGFD@9:>@@?=;;85568;>=:867758>@>DIIC;7>?;987667>EF@8559?BCBAEOYWTVSEACABIGAB?@CDCDMQKE<9AHGHGMbdWSOJD=;>@ACEJNJECCBEILJFBAA@?:677677768:==?@>=;853223575.-/03321/./25533431/011114?NRSQRSSQPMLJGFEEFHD>;66=BDIJA=GOIBB@<9521-/8=<;<;<:99:95112650326:<<>@@=;83,-57679:;;:645:?@@GJ@=GG>>@BD>94.-//08>5.033342345651/146?LPNRL:)%+30064003306?CCBFHFB@=8>2,582'%.1..14359<<;7616<73210/012/*6KNB<><8431,.9AFG@89>>8.)-142KKKJJKJIJJJIIIIIIIJKNPOKKLLMNNNMIHHHJLMLKKJJKLKJIJJJJIJOUURMJHHJKJIIIIIIJJKMNNOOQRSTTWXXXYYYZZXWVTMJOYdggkqtuwyuk_VOMNONNNNMMMLLLLLLLPSSPNNNOPQPORRRRQOKKKJJIHHGGGFGGGGGGGFGHGGGHGGGHGFGHINUXX[[\\ZUTX\_a^]]^]]^^[SLHDCEGKMNPSVY[\_^[YZZ[]^__^[VUWXZZXVX\ZWXXXXWVVV[_^__ekghni[VZXS`pj`iy|vsrtn`Vblgmjiy|vnc[Z`g]MOSQU]]ZTTY\ZUXZ\XSWSNPONNS\VPQSTTURO_neYXYYZ\]YXZZ^cZPRSTRTXZ[[VPPPQWZ\]`aaefeeehiihg`h~wcd][[`fihfZXcccnrzYKQNLLHEHYpX@CBAA==@EGDAAELMKILOOJA@DFECBA???AA>===>?AFOUSNHEINKIIIGLOG@BJPG>@A@???>?@CDEFGHIJJJG@>==>>==AEGIIFFJLHC@AEJJIGEEFFECBCDC@<=HKIE@@Ys|jIEGHFGFAB9D⽜zaTPOONPQSTUWXWXYYXVTRQNJBFG@;<==?EILMPSWXY[\]]]]]^^__``aa]YYYZd[E@CBCA@@JRSSROP\je_gnhREC>=IW`efgikkkji`WVXRKIIGLXWE;=?>>>?AEKU\XLDJX[[`]TMPSNHFFFFEDCBBDEDDED>?LQIFCDGJIVe_Z`WB>BBCDDEFCBACEEEFFDDDCDIJGIJIHHHGBAGOTTUTRQPMHHHFGIIIIIIILQUWUSSSPOPQRNKJKLNOONLPTTQSTUVX[\RǾ˾ƿvutojgf_hqifb``fjf`^]]]\YWVUTTSSRPOMJHFEEDEM`v{rr{qiegd\VUTWXXXXXXYZZZYYXUTTUVWXXYXXVTSTPNPOW_[XWUQPSSQQUUWXXWUQMMPSVVXYZZZXVSOT[]\]]\\baZNGB=CDB?=;88;=BHE>=CB@>>>>?GMQNEBBDFC@BEFEFGGFIKHGMOMD:@PNdype\cikj`URQOJ@9898E^bgsplg]TPOHEAB[pu{`OLMR[ZZ`fgdaba[\N;IS[XJIPLHMMDBB<8:<98=?87[iTB?@?@AJX^[YZ[YNC<9741>NKCAB@>;889@FEBABBABDDEFGC?@@@BAACA:767:DOH30>C?<=<:9669;;<>??<<<88@DBBGJE<8?LRLGKKHIHCDGC;9<=;5349>=:=@><;86523>JIA?CDCB@AGIE@9-,9EC?BFLOJIMJD@<976437?A@DPZ\ZXXYRB<97:A?<@?>DGGGJHB=55@GHIA@YdZWTL@55=@ABCFHHFCCCDGJIEBAA@@<779:87;>BC@>>>??<85456227544335443212465357876632347=FNPPQSSRQOMLKHFGHHGD>98;DKPQKIMMG?:87668747?@<::;:6568752025401//49<>@?;41-*/576767:6126>JQMCDH>0299@IGFDC=328878510243321247:8555528MQOVO<+(8?0*/.,+05944AEDGG>@CCEB9,-,)30261-136=?A@=::9799983./79/).1/.08;BIA<9Fh_NLRF1.533C=6NX[fS@EB;57635=EIGLSTPMZjkhcQ==JOU^R@[[@;69@;1**--../206KN@:AA:64115>5'$+///KKKKJKIHJKIIIIIIIIIKNPPLKKNONNPNKHFHJKLLLKKKLLKJJJJIJLNQTVVUPKHIKJIKKKJIJJKMMMNPQSSSSVXXXYYYYYXWVSPKMNOXgqrswvtrj\ROMJKMNNNNNNPQRQQSVZ^_[SPPQRRQPSUUTTSPMMLKKJHEDEFGFFEFGFFFGGGGGGGGGGFGHHHKQTXZ\\\\]]]^_][]]]^^__`\XOHHHJLLLMPSV[_^][ZZZ]_^^_^\ZXVYXSTW[XUUVUTUUTUVVYYZ_ihb^ZW[a^]hqpr|xqrohd_W`ddjfbjqph^YZajbROQOQUVTQQVYYSP]iSFQRNNOOMW_VPSSTUVPGUrnc\[\\\^ZX^_[a^RPUVVWZ\[[UPQQSY[\^`_`fgfdadgiifag{jdmZX]_emsllqihqipTFOMKLHEJ_y[BAA@@?=<@DDABLSULJJLNICDIJGBAAA?@AC?====?AEHHEB@?L^ZNHGFFD=9?=<>ACDEFGHLMLLHB?>?A?=>BEGJKIKLHA=;<==<<;?INMMLHBAB@>?ADECA=XuwRGGFEFEB@:/uԯlXRPOPPQRSUWWXYZZXWUURLGCFF>:<==AEIKMOSWXY[]]]]]]^^^____^]`[LEGHHHFDCBA?HOQQQPJMajbdfXLIB;@OYaehjjkkljfZRW\ULGECFKIB?=>>=<::DZkncPHN_dfkaVQNMPOGEIIFB?>>ACCCCB??DJDBAACEO_g__dWC>@CEFGFFCDDDEEFDDFFC@@GNMJJIHIKJGFJPRRTSRPPNIFFFFGGGGFIKRWZ\WPQSQPPQROLKKMOOONNPTUUUUTUV]Pg˽Ȼ÷ÿytpnlidciwzoifecaild__^]]ZXWVTRRSQPNMJHHFCEEHVm}x{~{vnijhb\YWVWYYYXXXXXXXXYWUSSUWZ[\[YVTUUQNPQS[ZVVUTQPRQQSWWXYZXTQNORUXYYYXXXWURRX\\\]]\^b_YJGD>:==<;99:;>BHLG><@?>>>>AJNJGC@DLKB?CGHDFHGDFHHGHQM?;Mkmztdfnmgb\RNK?97899@OUU\iph]XQLHJIEIWir_?>JSX[WPMWfjecgb\UX`WdpcVTPLMMJC>9769>GJGIQSLLLC:9?LYWD7=B@<:;;;;?@AEVgX=;?>>><;<:98>CC>>@@@>=:9AG[q{oVHJJDENTUVWW[_\J72532=NOHD@?=:766:DHD@AEBDFFEEEFDCDCCABC?<;;948=828?=::;CG:48:3.3>FIKOQSRK>:=>@AHPOJF=78=<;<=?@A@>=<;>CC>?BA?=@JSOHKNLMKGE@;;=>?>6369<;;@BA@>96410:GIDDEDBBBDJIC@=4/5=DIMNMIGMN?6=A>9888:>?AL[a_^]VMD:767;<=<@A>FOE>C>5447@GHF=>JSVVQJB:=>>?ADFGHFDBDFGHFDBAA@??>;>>77<=>CA<<=??=8459;208888766777435776468999654458;>DINPRSRQPNMKGEEEEEFC@@DKHFLQOMIC;42332669;<;::9<;5135655324400/,.4:=@?:/**.367752593*-9GPVUGCD=-)-6AHC?BED@ACB?:65532000//58574-4KOUYI8//>?/(+.-*/3767:BJFA=BINNF9-.,,:=52.-.49ACDFJI<4118>;30178/'(+,+,////2;8>irTE@;=3,.2<95GVVTF9:;989877766>MRTTOUiuzygPFDCENOLjsJ1-3;>70/-.205CE@HI=;AB:6400/5?DBA@=;91*)-./0KKKKKJJIIJIIIIIHIIIJMOOMLKLMMMNNKHGHJLMMLMMMKJKKKKKJJMQQRUWWTQOLKIHKNLJJJJKMMMOOPRSSSTVVWWWYYYYYXVSOJEGUhrqt{zpjdWLJIJLLKJLPRQSUVWYZ\^_b`ZTSTUUTSSUUUUURNLKLLMJHFFGGEEEEFFFGGFGGGFGGGGGHGFEHKOUWZ]]`cdca`XQY[Z]```acd_ZVQJIIKLNOSW\^_]ZY[^`_`aacc_\\ZRUZZXTSUSTTTVVUTVVVVWXXUTZdgaap|{}}tkkomfdb_acacb`a`]ZZ\_jn_QPQPRSRSQRTUUWUhlPRVRNNPMXbVOQUTUURNNizka_^]^^[W`ha\]WRU[_a_]]]UQQSV\ZV\cbcfgfdaafjieaanx_phb]\hrsns|ws|od}zRGOMJJKHKecMCAAAA???CFGJQSQLJJJLKJLPNHCBABBCDECA??@BBAAAAA>=PgdUKHEA@?==>?@AA@@A@>>?@@ACEFGKPNHFEAAAA?==ACCHRTPF<;;:;<=@AJY^ZQJGFBAAABDEEECA>LdxuRGFDDCA?>:6=ູ_TRQQQQRRUVWYZZZYWWVSKEFFC>;<==AEILMPSWX[[]]]]\]^^^_^^^]]YXWRNPTTOIC@?@GJJJJLHBPaef\KGK@9CR[agijjkjjhcSOW\UKFEECBCCCB@>;:>AIZb^WOJHQZ`_QKMKFJNHABIID=:<>@A@AA@@@CCA??ACUjpqobSFA?ACFFEC>ADEEFGFFHIGFEFPSOJGHIKLKIJMQTTSRQPOLGEFFFEEFFHLW]\\XRRSRPPPPONMLMNPPPOPTVUTTSUWQOÿʼɼ}wvromlkees|uqkggfdhg`^^\[[ZYYVTRQQONLKHFFDDEDLbzx|~xpnja[[[YWWZYYYYXXXWVWWUSTTVWZ[][XSSTSOOSTXZVVVSQPPOQSUXXXYZWTRPQTWYYYYXWVUSRXZ\\\]\\^a^WHHF>77:;:9;;<@CHRTC;>====>CIIED@AMRMD@CEEA@ELKIHIGAKH:8Celzpjomec]OLH>97679>GMMKWdZMIGJLOOE:BZ[B5=EP^_VJEXnrkmvtmmplchzu^SYWRPPK?777:?ILIKPOIKF:8?>?@AFHEABRvpmy}jM;?C?>===@CEGYZGCC>=>?DID><735:BJNMLKEFFGEDDGGEDDDBBB?>?>832./8>=<===?<6368:87==>>>==<;<<<>?:67;??ADE@;<957:<@A?<;;;99;AGD@:55536AHECEDDDCEGFFGC=88=305=@>DOY^^`^RE>;7899:;?<<@@JTA493/356?FGD=<;:;?CEFFEDCCEFEECBAA@?@@??;769835767;@CFB;89:649888767876314786457753012237899AJNRSRQPOMKJGEC=:9=?BDF<8CNPMIA;8321-./01115:>@?933444444552//2039:=;7/+.25667535;8-0>IHJONHE<-+,:D?8:?<;=>===<;:74210//4=CD?6142+5HPUL:44871024742357:=6:HG@IQV[Q>5/.**093/234:?ABBDN[VKB=<;>:32681+*((2<7//..8::SaL926A6+-4778@ILF8202;CGMQLA988LWYaUJWj|oSJLLILQSUvtF/<>72/30.:BFPOGJI=7752011,'.;A;9;5..12.-./1KKKKKJJKJIIIHHHIIIJIMOONMLKKLKKLJIHFHMPOMNNMKKLLKKKJKNPQSTUUUUSQMHHJKJIIIIKMMMNOOPRSTTTVVVXYYYYZYWUOLIJVfsww{}m`]SIFGJLKIIMUXVUUUX[Z\^_``_YTUWWXYWTUUSOMLLLLLMNNMJHFEEEFFFFGFFFFFFGGHGHHHGGIIKOTY]_`]Z\YUMIVWRV^a_^adffda[SLIJMPRTW_`_]Z[`aa`abdffa_ZUZ_\YURTTUUVVWVUVVUSSSTUSV_bajy{uvrjefllfddcdc^^_^][YY\_akp`QQQRTSQQRRRRUVY{oUY\SNPMXcVLPUTSRRROYxebea^]ZW]ik`X[\UW^a`]\]YTQT[\WOUdgggfeddbfljfb]e{^pxl[`otqno|rwkNHNLJKLGKf_JEAABBAA?CJLNNNOQOKJJKLNNKGBBBDEFFGHDB@CFE?==>>>@A@?BDDC?=;;<=>BHMJCDFDDBA@<=@ABM]^O@:;<<>BIPUdpkdWKFBCD@@CFFGFDC?BJWVCFECA@=<:<96`廤rUSRRQQQRUWXXXZZYWWVTOHEEB=;<<=@EILNPTXZ[[[[]]\\\]]]^_`^YRSVWWXYYWSJ?;JW[`gijkkigj_JJUWPGDEDBCEDDCA?GP\_ZZYVWXOCELOG@@FKJJMOF>EPK@;=>?@BBAAA@@A@??BDPds}u[LGDA@AABA@;<>@AACFGEGGHGIJOQMGFHJJJIHKRURPQRQLIGGGGHGGGFIMX^][YWUTRPONNNNOMLNPQPOPSWWTRQSUHtǺö³ϼƾ{wusqqppjgn}xwsnhgfed`]]\\ZYZZYWTRQPNMKIGFFEDDEUoxw|sqqeXVY\\ZYYZ\[ZZYXWVVUSSTVXXXXZXVSSRQOQTUXXWWSONORRRVVXXXXYWSRQSTWYXYYXWVTSV[[\\\][\^a]VHHH=57:;:99;=@CHNO>;=>@???FNLGD@ENMGB@CCDD@@HOLJKH>>>976AHgjgrldbWKJIGE849<@DIHCGNG>?ADA>EF;678:<<<>;99>CDIJHDALvs^fyE?@@?>>=@ELMJFHMJEBBBEEGHJIJC=><89=>HPPMPYfnlfllSHUM?DMQTV\ddVD<=BLTROPLC?@=8438@FMSUOGECBCCDEECBDFDAA??A>73422:??@BB@;53247@CBBEJSWWURRRQMB>CA@Sbb^YNB>????=<;==<<<<<85458:7;EB525786456669=@BED?<<979AHD>956863:DA;>EFEEDCDGHGC=8@PTJAAEGB<<9466/,2?<=;76:@<:BGMUK:328<74@CDDEEDCBCDCCBAA@@@@@A>;856730//19@FLJ@:97898888767544425886456752001269954>IORSRRQQQONHA<6202799;53;HOMC;<;510-,+,..04:?@=;865456568631487488753014676664357:87=HJKPRNK@/-.=IB>IE85;989;=BD?BFC;3/5?BC<200/6:AKH;7769427721126899677@OMLNQPF632-*)+0./7:=@A:0,271+,16::500.-139JPJR_YE:>=>>=BQUNJGCBEFB=68==@ETc`K>@>=@ACINQ]efd]ZUF>A@?CEFFFCBAFAA=>HCFKLA<<<;86߾YQRRQPQRTWXWXYYYYXWVSNGC@><<==@FHLNPTXZZY[\\\\\\\]^_`a^TOPQTVVVWXVMGEEHIMPKA@A88L^OHLH<@Q[]cggikkjjgWEEMMIDCCCCEEEGEALjsuqe^[[_bXMIEB=;>DOQNOSNFJRPGBAB@BEDCDDB@@@@ACCHRbvrUHNQSLDBABCDDB@=>@CDCEEEEDCDJLHCDHIHHGIMNKIJLNJEFGGGIJJKKMPX^\YWVUTRPOOOONOOMMMOOOOOTWUTRRRVɽƹľо~zxusrqqqkgbh}unhgfd`_^^]^][\ZXVSQPPNLJGGFFECCLczwx~zomrl^UVX[][YYZ]\[ZYWVVUSSTTVXXVVVVVVUQOORUVVUVSMLLOTUUWXZYYXXWSSRTUXZXYYYWVUTWYYZZ[\[[`a[UIHH=68::9889<>AGFD79=DIHD@FPQKFDGHFCA??@CHG@BJGFJI>589888CIQWXVidZknlXSWKBHNPRTUWXTNIHKPUTRRLCA@=9524>CFMRLEBA?@AABBABDFGEDC@?=848;;<=>BGEB>521369<@EJPVWSMILPOMJIQPDHZ`\_]K=?A@@?=<===>>=:77401236;;4355466679;=@ABCC?<==;=?A@;746<<56>=57?DFGFEDBABA;8FURFBDB838?>9840035>OZ\ZTL>0*2AB?C?78>?@ABCDCCCBBBBBBAA@AAAA@=8555544459?CHH;66468789987658=???<766667667745:<;44=GNRTRRRRUSI@720223456777:AEB76994.,-./2544689999875667799668:::85554246777651,,017>96;FPXURQC-,2?FFGIC>;::::502119;=?:689306=<.'').7898427EUM:6985233-,,-/003;><<@BCFMFBS^I/*3<=974,(*,*'9PF;A@AC@=:;2'())*+,087+%%%,7;BNQJLYTB44BW_^jfC;EMMKFC@.GackZWI.*(*02EZTC@@@ABDFGHIIIF@@BEDBAA@BCBEHGGID@BDB>98;>?@DLMGB@>=<=>@CEC@@CDDEGGC?=DCAA?>?FOSSXXE9=@@CDEFFB@><=<=2Q•eQQPPPRSTVWWXWXZYYYXWVMA>><;<=@FIKMPSXZZZ[\\\\\[\^_```ZNDGPWYXWUSQPNKHIMQVSGAA><EQROLJIOTTSMIFDDDEEEFHFA@@@ACFEHVptYO[giaYNHHJOUSE=?DGGIIGFEDC@BGGCAEIHGGGHHGEFHJJGFGGGIKMPPRTY_\WVTPNPRQQRRPOONMMLLMMMQVXZZ]J·þƮ{yxutuusqkg]fsmihfa^^`aa``_\ZXVSQPNNJHGGEDDCEWpzwnihjbVUVVVYYYYYZZ[YWUUVVSRTUVXXVVVUUUTQNORVWVVRLIJLQUTVVY[[[YXVRSTUWZZYYYXVWUTVXYZZZZ[\`_YRIHH?888:8777:=AHEA66;DMJDADIMLHGEBCD?<;;<@EBDIB=BC<679:>@CIKOX]ir_HDIIPfx\53=BFKKHC@CEFJTTMPUL@:7;B<:MYSLXksomvwuvsottjf[LNTSSTVVPD97H]hb\aeYIFMTWSMIKLMMMKGA947;<<=GNT]n_Yig\[aVJIKPUVTROORTTTUVTQOKB@BA?:522:DGJLIFDCBA@??@ABDHLIED@=;98:<>=99BJEAB>50/5=>;BQZTMKHGJLJJNQQRQPXba`^N>@BBCA>=<=?@?<8664113469<><9:99:99<>?>@B@>=<>A?==;99955>B;7;>:55S\YQA:;7239>BHB9?CA@ABFMME?CKMLG?@CA>;;<<==>=;855468;1/444578:98675249>?<989:>@?;8559:82,*.1566666569973345678;:8;:8238952355554/*+.29=:73;LZVTUI2.8BDFE>AD>9:;=?MXTMLOOD6,+/560-.-179<;:9;92+6@<0-.29@=75922.../111../257207:969<>@C>67;=<3/25561+('''$*@GC>7?B=?AA=0(&'*++/55-*,.5>ABDFIOSH96619NblZ63=;B<7HMLLB442Tsq|jVT<+,+,5EQOHDFB602221/-+-012664321/143/--JJKJJIIIIHHGGIIJJMUYXVURQOMLKKJHILPSQNQURNMMMNNMKLLKIIKIHIGEFGFFFFHIIIHIJKKKKKLPRRRRRRRRSUWYYYZ[[\^\TJHTZ\ehrurnUEIJGIJJIHGEHLOQRSTX\\_`a`^]]]_`__bb^YVUQLIGFFFEDDEEDDEEEEEFGHHIIIJKKKLNOOQRSTTTVVTRVXRJFEEFHIIHKRYWW^ddbdhhiheb]WTUZ^``abd]VWY_gijklmle^]`_ZXVVVVUUUUUSRRTUTYcfky~{~wmfgjfbceaZTTY^]X[dc`djljs~saUOOPQUZYTQOWgrnVQ`jgULXgXMOQQPOONOQQSQN[qp`^\X]mxwri[POQTSQPOOOVRGJOPTWXYZ^begfkz|h`gcddeZV[foqoomlkndWcXQHDEFHIHDOkzMDGC@DEDDHMOPQSSTUVPHHIF@???>@ACDFGFEECBAAEGEDCDHKIB@BDHFBEEB?<;=?@BDIKEBDB=>@BCEFA?@DDCEGGC?==>M[ZYQGB>?EEC@=;:;>>ADEGHFB?;7=HEDPYNLOKA@?>>;6uzlWNQRQQSTUUUVVXYYYYYYYRC=<;;<=?GJLMPSXZ[[[\\\\[\\]^__`XF7;JW__^[URONMLJLNUYTGCGE=>GNG9;O[^cggiijjkj^LGHGECCCCBBCCD?I`n__adhic^_a`XTRKGAIUVSNJGECCCCCDEDA?>@D[iWRfqpb^golih\ONRTYVF?DKQQQPMKIGEDBBDECCEGFFHHHHIJKKIJHHGGHKNPQSVY\\YXVOLPSSSRRQPOMJJLLLNOSY^_dWWͺÿǺɹ¼}zxvpq}{rlkecis~upnkg`]adfeb`_]ZWTRPNNLJHGFBABAKd~{xsligeYTUUSRV[]\\[ZYXVTUUVSRTUWXXWUUSRQQPOQTWWVVPKIKKNPOQSUXXXXXSOSWXYZZYXXVVWTUZXYYZZZ[]`_YMGHIA988887579=AHD<648ACDFHJJ\iL7AKK\ou_>6CJJKLHC@BGJNQMLUS@8:?B?=GVTQTdd^eu|zomv{spwjSH?GHGIIGDC?:BMMG?65Hh~r\[kzljHAFDEGN]cb\Y]ceWEEU_VKGIKLMNMH@?@>;:::>?K`hcjf_TX]OJLLPZYXWUVUQMMQRMJG@;<;;;::<<97?E@;>=5227@A:>>>;886655678=?>=;:<=<9:=>=:<@@=<?=:;;:9=A>;>A@:28DHC<9779;97?JIGKC1.:?3.8>=8206EQURI:9BEBB?;?KJAEPNEBBAA@>=;<>=;;::;>9013:>>@BBDDDDDDDCCBBAABAABB@>=;512:93:A@9.*2545889988:?BDGF@:;>>==;9631247951.,/71023457;==@B?;<92/58:1/3545543336:;998>?CHJE;65:JH<7730/...--02697106<;83343101*&C^L002.0/,-039>?BMYTGGHA;9<@=0))*,04674-,5?@ABCCBABA@@DIHFEDIOSSMEABDEGHC@?>?ABBBAACEHID=?A>>BFB?@DEEEFFC@>>@P[WUQHC>=CFDB@ABDFGC???ABBDFGECB@><:>EDGLHE>@@AA@@??:Kuqro^RRQQRRSTUVWWWXYYYYYXVK@;::;=?FILNQTXY[[[\\\[\]]]]^_`VC9:?O^`bfh_OGINJGFMPUMEIJHCCIB:AT]`dfgijjiie[MLLHEEEDCCCBA<=Ung[cjnnrg`bc`]\VLA;=FOUQIA@>9657:=>ADEB99@CCDEGIFCCC><>@B;6776568;>@BEJIC?NU<4>CG]lc]TJZ[PLNHA@@FMMLKVWK?9>HMJVjhSO^bQIWjk\QWed_ksX902ACEEEDFKNJHKNNJB67EPOGA@@>?DKTSE:>IJKLLKIHEOgqjacpzk]_XGAEKLQ_e^[ZXWYdbM?JXTHFKNOOOMFAFJB::;=<>KZjpsh[TXTKINORUYYYYYWRLEA@?AA<::;@C;3339FOPQQLHEDB?=<=>?BEEB>::;;::;;<=;::866:=843<@?=<@GLOSTRNKKNOMOQT\`ZQICCCBDEEEA=<<;;<:888755668::7677<@<8:<<;9:@B?==>>=>=>ABA<8=DF>47:8:=;;DJDAD9,2AB738;<<9:CLNNMICGPQOH==GD96@DB>:;CQTPRVP?6<;<<=;:::9652/38>A??@ACDEFFEEDDCCBBBBABAAB@>:6368/07><<@@A?<6222344773/18AEIMNHA::@KQOJCCCB>===:423359;6/-25533349>AAA=63234668?AAA?;<:5100;7346777:;:98669<;DJIA707LJHRMDKJNQ>-/0,-225<7+*08;87532014:@EHJKJH@<5FK7245431.....01484//4;><51/-,*,,*?hf<'/0,,7L]kwwwteaiib`]UK=@B2)*),47796-,9B@;79@D=68=<546997,,023769FKLJ=,($M}{zJ*2559:DHF@<3.39<=98:9883////0122138:99::KJJJJIHHFFGIKMOQRTWWVUTSQONMLMNQSTUUTSSSSSQPPPPPNMMLIFFECBDGJLKHEDFFFHHHIJJJJKKLMLLLLMNPMMSWXXY[[\^`b^TIBCGMSMCLYRFGHGGGGGHIPY[\]]]^^^^____^^__^^]_ceca^ZVSROONMJFEEEDEEFGGHJMNNNNNMIGGHKMNOQSUWYZ\YXPGDGIHFFGGGGHIJKKMMNPTTSQRRSSSQRVY\_aded`YQPZdgknnnnmkeZUTTTTRSTTSSSSUUTRVeqsnimpmidfkf^^ghb]ZZ[ZXZ_bc`_m~}h^WOPPXbddff_ZaTVZ[Z_fe[QWk[PQQQQPQRRSTTUVVcmvtkd`^dv|yxvkVOV[WTU[_IHLS\WZa]\Z]achmuzumlbUUiyvtsswy{yfOGdrFCJIDABCEFEGTpuOIIDBCCDBEKSWXWSMKIEEECAAAA@>>???@A@@CGC>BJIEC@FOTWVNGEGIMI>=ACCDEDA=<@GLK@=AA>@EGHFDCCB?>?JTROLID@>BFCA>;=EIIGGHIJIIIIGA::DHLNQTX[[[\\\\\]^^^^]_`VE@<8AOUZcliXHFMKHHIJJIGHJHFEB;;FX`bdffgiiig_XONLGEGGDCCCA@?FLSWmtppqpc^`bfgfdM@=<=?A@>=;K|wkb\VZb]RQPRS\^PCACGMPQPNMJHDEJNJGFFGFGIJKLLLJKNOMIIKJIKKKKKKKPUUSUXYXVUSSSQQPOPQPPTUTY`b`YjʹɾβƲòz}pozxnhfdbfryqkhcdikfa^]\\XURPNLKKHFECAAAKf||yphgbWSTTQRXbhhb\ZYYXXWUTRUWVUVVWVTSQPOOQTUXYWVQNNPOPONORRRTSTWTQRVZZZZZXVVYYY\^\ZZZ[[\___\XOHIHA:998775699987889987:>DE?8;?BDDFOPLFFKIA:==88986669;>ADDE@ACFC8@GMLINVKBC??HLMYh`NU_WJEGLNH@BHDGZ`I::=?BCADHJIFDFIJKMOKDDKKMLJKOQL@AIPRQPLICDKOLD><=<;;<=><;;867756;==>=96458@D<67@A?><9>ENRSQLMOPKGLPS[aT?:BFCBDEDEEB?=;;:63577743246631139=98=>;:;=AB?=>@A>;=B@<;<<<<==??=;:@FF<39<9;?=?JJ><=2,8EC=;;:;=AHMMLMNNNNKKNRNGG@76>FB83;DGNUQLK<2;@=>=<<<;;::<;4/-2:>>>967:=ACEGFFEEDDCBBAAA@@BAB@506;4.1:FE<43ADD>;DGEC?;;<9645:?@;66;?DGD:7;8?IFQRU\YIBB?BBE>3,8KFJRG:>ACB3)-24311;IL<,,6:711450,,.3623564477557851/0/,-03232.---*++0SmK%+84+Hy|_dqkcde^TIC.(+(-8955524=A?;>AA@@>===>???@DKH@AEFD@<=EKQTQMIFEHNIFC>ABEDC@@CGJIA?CA@?==?=BKMJEA?ABB@?CIIJKKHEDFGDA<8RrqmlbURRRRSUUUWXYXXXXXXXXX[VC9:;;>DGKNORV[[[\\]]]]^^^^^]]RD><:;CILQW]SHGILJFDINLJGAAC?=><<<@PmsWNKMPJHJLMP[aTFBAAENSQNLJIGIJMMKIGGHIIJKKMMKJLNMIILOOONMNNNMOSUX[\\ZVTSSTUVXZ[YURSTRX]bb]ýԺʵĿy~uoyzunhfcbi{~umggdflja\]^^ZWUQOMLKIGDCA@@EZw|{wic`\VSVVVX^cca]ZXWWWWWTRRWYXUTUUSRRQQPPRTTVVUSOMNPPPPPQUTTVVVVRRUWYZZZZYWX[[\]^ZY[]]\\_`][YRJIE=789:9877;966558=;89=BDC=@GDBDGLSSLFDHIC>@>9:;86679;>@BBA>AED?:@ELOTYbb\ctqVHID@>?FLMOQMBAD?@DDFMTVWXZSLHA<@F?;>=?IJHFEB?;7ALPRPLJLNNOQWWSOIFFDDFINLFAGQSSTSOIGHFACHHDAP\ZUQPQJA>315===;:::99877854423:>=?>968;=ELC79@BA@=:;<>FNPJMRI?ACBK\hZ>8DFBBBCCCCCBAAB>4/37:<94137840039;97:;:<=<@FB=>:24@ECBA=:9?<96359;99:;:769@GJKHGOOJGEBB>:866BE=79<@JF=5>EA@?<8459;:;;:<=<7679<=>=:6,),,++)'/50.-,))))fj^d_\_cgf^D+'(%,991046:@@>=@HKGISXPEB>:95.-..42(+7A?<;8-4BC^zh:6>;=?95212>>????@DHDAABCB@=:;BHKMLJFGQbfc\OHBCCDEIEEHGMIECABBA@>BMRHCA??BCACDA?FJMPQNIFDCDEFEFEFECB@>@GJJFEGGGD@96>GGBCDMIHHGC@=<@GctmigaVSRSTSTUUVXXXXXXXXXXXYXR@89;>CGLNPSWZ[[\\]]]]^^^_^]RD>=?@?CGEGHGDDCGMIFGLOIB>>C??DGD?=>==>>8NhEJSPKFFHHLR\bWHCABELNNLJKPTRKEIKMIFFGHJJKLMKJLMKHHLNONNMOQSVVUY`b_ZVTSTTWZ\[]]ZTPPQPUZ]hyǿѻŮĽvzus||ywxslgedhr~}vpjgfgjlh`\]^]XUSOMLKJHGDA@@AOl~}}{oc^YWVUVZ_abc]XXXWWWVUTRSSVWWUSSSQQQPPQQRRSUTSPMNOPPPPPQSUVXYWTPRUWYYYZYYYZ\[\^]YY[^^]]__\[YRGHC9689:;:6;>:768:>A@BEGEB=:;;76789:<>@@@?ADD@9AINQNFRde^hpYBACC?<@GKOOKFGH?BFCDDLV]^ZTOKHGFIFDGHECAACC8742DQTSRNJHIHGMTX]aUFBABCBDB@=DPQPPQOMNLHDGKLIBAKUZUQQNKC847JPNKUb\UYTT^[J>@HIKQUUTN?6623578;?DIKHB933;ADEC=?AA??=;<<<:7667779877?>;9;?=BHB=:?BBB@<;<:=IPNQNB>CD>Gcua=5>A>?@BBBB@>>AED>5369>@;42773138=?>@DC><<=>=;8798447;:5468:;;:;95477;A?;;;:<==CB:@B:6;@ACFC;88;AA:>KQRRRPOPONLJFDDGIE>8;>BDDA:6679<<8769;<>??>=:6348;;:86667;=;88::;:88:AIJMQRTQNIFBC><97895:>@?<9:=>?>=942222112233347<>=<=3-2636;=<=>;642:A922/7FQUXK66869;5/,*1>CSJ9679;82--01(*5,./..14:;0,.0O>+069:82128AD?@A?4++-+.+)-40,,-,,-04;><967Yv_jlpsrqqqG-*.*+8>73467>=;>>FKIQdjbRFBA;4100/151-3?=765-2?@IXmb:5;9>>2(/06@IJJOOIHG?88:5-+)*,,)*178756;;HHFFGFGGGGFFFFGIIJJJKLKIHJKKLLJHILMLMQTSOPQQSWWSQONKJJHECBDFIKORRNJGGIJJIHIIIIJJJKKJJJJJKMPRSTUUVZ^\VPQVTLGFEFFHGECDEEEDEEGMUVNMV_`\[]``aaaabbbbbbbbdfgeeeca]YRQUTJCEGGHHGHIIKMNPQTWZWRQPOQRRSTUTW]^\[]]`^ULIEEEEFGGIKMNNPPQQPPRQQRRQONNOW^`bbeedfbYLWbc`_fgeki^TSTRUWSRTUWYZZXUSTYeprlhhhijklqnifif^`cb^^cdcchc_dp{wk^PLUZRh{_QVXYXXTVjg\V\rWXZYUVVUTUVYXWVUUX_ZWVTVT\lwzuy{fVY[\]_`]]YSMNY`aa]T_zkl|vqmlifpxvusss~`NUYPJKFGGEEFFEBBCFECTyeDEHGB@@A@CEA@FJJIGC?@?>=@BDCA?????@@ADEB?<=BBFD?;CIJKJHGM[nomlf\ODACGMLKGDSYNC?BHH@>@EGECC@@CDCFID@CJOTYWMEDDFGGEDB@>:98CGLNPTX[\[\\]]\^^^^`^YI>>BEFGGGGHHHIJHEIEFJQLB9@@BC<6@OX_aabcdedee^TSTUW[WNHGIHCAAADLOZ}a_PBLWj}aEHB?>ENTUOEEEBBHLLHGF@@DFC>====?@?DTLK@CRWXURHAES^c[KDBCGJKIIILU_\KADLOKFEFGJJKMNLJLLJHGKMNNNNORVZZVW[\XTQPRRU\a`^]\[TONOORXZfǽͽĭŹwrsyuwvrkeceq||sokiiiknke`^]\XUSQMMKJHHDB@@@CY|~ne`YUTUVX]_cca[WWWWWWVTQPTUVVVUSRRQPPOPQQQRSSRQNMPPPRQPPQSUXXXVRPQVWYYYZXYZ\\[\_\XY\^^^_`^[[YQFFB658::<:8@B:68=ADDGJMJE=:8>?AADCA7AMNPHB>SjhfodDHQRS`^H@@BA@>;;:JNRRRRG<=;989>ERTHFKWgjffefefN:;?>GJNME><=>ADKPOKJH@513;JQRP\fc^ZUYd_H<@FEIQSUSJ;4454579=CGKLIF@869=DGD>=EKJD==>>=:667879=<::?A@@>;=BA;:><;;>BDEC?<<99CPWYNCACGEFYeS:35:=A@AABB>;::=CA8458=A<4135447<::;BLOLD@ED:89:=CD<7788986@MRTSRPONEAEJLHDGIF;5:>AGF:4777:==96449=ACCB?:757898877755::9>GHEEFFEDCBB@@A@@@A@A@>:30/17<>:=@=:6457999;B?>3-15874466:?@<64444431010//039?=<:80-/258<;==86319A70126>IWWA,/468730-).4?;2-13-1>=54540,,-5>ACDB@@?@@@@ACDA@??CCLNDELNKGGDDRVkq^UW][E?FJPXSFAL[UCCFKG???=?AAA@ACDCFIEACIMQTSKDCCCCEEEC>;<<>?FJKLNONLIIKaw\FC>BHLMOPRQQRHA@:Jomb`_YVUTTTTUVVWWWXXXXXXXXXY[WI<;>CGMOQTX[\\\\]]]^^^^_]VGADFGHJJIKJJMSQLFFDFLOLA@ACDB:7ERY`babcddcdcYRPSV\a]UPNNKD@?>GNNUz{TFB@JJWv|[<>@?@FMROGDDDAAFILNME@?BCA==?>@BDDE?ac9A?BN[`]TKFHS[_ZKCBDHJHEEHNV\XLBCKMIECEFHIJKLKILLJGHLOONNNNSXXUPOOLIJNPRVY^ca][ZZRNMNORWVuѿƱõ~orxxvvsmbai{uliiijlkkgb`_^YTSQOMKIIGFB@@@?In{xteb`VUTWY[[Z^`_[XWWXVUVSQQTUTUUUSQPOPPPPQQQRSSRPNMPPPRQQPQSUXXVTRPRVWYYYYYZ\\][\^[X[]_____]ZZYSNG@6579;:9>GD:89;=?DLRNIA;::8:>?DHILKA@AABCDB><><768;::;<=>?A@CDDADLMNFB@IcmgomS;BI@9?MaowVMQSPID@?@EKLLKLE??@@?<:99;?FEHOONVYRMMOSQD:529FNRRSJDD@:86259=A@EWklfffffeK7;@FFHKNG=89:;@JPROMG@658?KRRT\eb[VT_iTC=ACEGNRSQH;565569>AEHJKIGB<9:;BMKBAFJKC<;=??;545769====?@???>AFD=7249?@?;755788632696469;;<<<<;:;:8778:<;::;DRYSKIID:995;A:58953439GQSSQPPRL<8@FLI>BEF?:9=<8=;96537ADFCA>?@944=C<557:CC?<71-)+/2234437??825897520111..269<==;74/,.026;;5142/61222231./1-,,,-8=?4/2320/.0.*)',;:/07<96/6?@DILI<1,11-+0/++*(*8HHD@@@;8?HWq{@Pekf\UN:-0;7.*7?71452-058;CHEWgeckZBBDA;630.270+.3.)+-.-,+=`W97:8>=20:D;4?IHHKLKING62?G6'+-,,.25/*+4<9DDB@ACDDEGFDCFHJJJJJKLKGFGGGHGGGGHJORRSTUVVW[_a]UPOPMIGFDCFILNNNMKIGEFFHFFGGGGGHHIJJJKKKKMNOQSSTSOJGFHGCBA@BCDDDDDFGECBBBCEFHKNRRRRRSZ`deedccdeeddddefefghfca`a_WTYXNC@CEEEDEEEFIJLMMLLNQVXWVVVVWZ^^^_YPNWahlh`YOEFIIKMOOPQSSSSTTTUUUUVWYXWY[`acccddghidbhj^SRVR^g\RWXTSU[\[ZYWVTUWcqqolihd`ehiossnlieff`_bdehmvshit|vwp[TSQXi_UTYYYXWTSU^__pYYXZ[caZXYWTUW[Wp^^__WRRQXixwx{voonmkhfd`^acWLMRTPLJCOsz}yusmr}}w}uc_eZOIQSKHFEEFEDDDEDG]|\EHJGA>?@BBBCBBBBA@A??@?>=?BDCBA@@@@@@CEBEJKJGIFCNND>?C;GPB`cD;;O[KGMQft]C@BLQHKNF@AA=:9<=>==@@?AB@?BFHIHGDBAAAABBCC=;>AADKOMMLOSLIMUkr[KG>EUYWUSRQMHC?=<:Xtg^]\ZXUTTTUUVWWWWWWWXXXYXYZYSF=>BELOQSX[[\\\]]]]^_^^\TGBFHHGEEGILIINPMHHCCJIA@EBCFA:>OV[ababbccbb]ROORV\_[UPNLHDA@=CKJQonL>A@BGJKA=AA?@?BHMKGA??AB@>>BBDGJIIHMWK=>?EN\d[QQRSSTVTI@BDHJHABMTUPOLHFHDDCBCEFGHIJIILKHHJPRPMLLLPUTNKLLHDHPTTX[^a_ZWWWPNLMMRWPǾȪɾüy{syzookeessiikjlmiedcb`]WRRPOMKIHEDA@@>>[}}skfac\Vd\U\]YX\\[ZXVVVUUUTRSTSSSSRPPOOOPPPRQQQRSQPNMPPQQQQPOQUWVRRRQSTVWXXZZ[]^]\\[YZ\]____^\YZWY\L@768::::BHA;;;:9=GORLIA>@DB>=??ADGA87:;=<=?@CB=78<>>===>>@@@CDINLMMLGRbjnnhoq`A@KA8:>=<;;;=?EFHLKOUVRNMOSUI>><;BKPRRPNKB;759=<:;:DHFECLM>89<;866:BIHGILLJHD?=?>=956=@?635768=>?>@?=?ACDGHF:..9A@@ABA><;89@JRF=BIJLIB;8984?KQJFCCBA>>=<9798359<;;;84445:<:78=@@<::97446776654359==;:=???><:98;==;=>9:DMPLJLIA>=8:=67=;53339DKPQNIHJE;:;9>C829923=8;:976669@DGHC;657788777879:8.2BFDBBCDA<:;<=?DKLNMLC98=>?>757;>>@DLQLFDB??@<60,+-.03337765587448<<8520011/18=<<>>:6331//.162+*//-7?77><2*0=7.5DFGC;7620/./+-149>??;63111464.+**++,.7;:64220--./,+++6F;0569954CHGE>9:@DFHF9.0.+//,,+*(+8GF?COOD71**/CSZcmg;DU[N?8422241,/;=0-35-+..+/@C4@^ebg]EEIKH:20/241/,+*(*,--..AYJ58:9=>;:@EEDCDDEFGGIIHHKOQRTVYZ\]^__`a^WNLWgmkkje]TKIKMOPPRUUUUUUUUUWXXY[\]]^``aaabdcdfejuvjZVUPzy]SSVUU^ea]ZXWWWZ^gpz|lhj`Y^fc[dqttrib`a`beglrusmkpvsqpeWTUV\\WTXY[\[URQZ__rYVUWY[_^\ZWTUV[X`^^__XRVRQZipvwpmkkhgc`_^]^\VPMNNLLJHEPixxwy|{u}jlj`p~_RSMJGEEFFEEEDCGbTGKLG@>>>AABCCCCBBAA??A@=<=@DEDBA@AA@@BEEHRWSKC>AIF:9?@7TSCZN897>GLUVcV<>?BINPK?:GE<=@B?<:;?>;<<9=@DFLOLMNJKMJLNMURNQKL[gkeYOHG?==<;<BEKOQTX[[\]]]^]]_`^^\SFCFIJE?>CJKHHIIIJHA?DB@E@:ETY^bbbbbbaa_UKMNPSWWSMIGFFCAA>=CEJYVG>;BJG>AGC?@@BEIG@;=>=;>=;EOI<:>????>@FGGILMNOPNIC=>HU_`XUUWXYZ[UKDCDGJGA@L\UHILKIEA?AAACDEEFGFILJFIQXWRMKKKMNMKJKLIFIPUY[]_a^VQQPNMKKLSRpǻɸɮqtztnhehmqz{mhkllmmgdfgb^YVRRPMLKIFDC@@@=H{|{~okmke_TYtj[^]XZ\ZXYWUUUUUUTTUURQQQPNNNNOPQRSRRQPQQPOOPQQQQPOPTVWRPQQSSRTVWXZ[]_`]^]XW\^_`___\ZWZUV_[G:779::>FC<=>?@AFMOMLKKKLLJGFCB?AD@;899:888:@CBA????A@?;;AGLOOKWlzvmhiomdRE@:679=BBBPb\^spN=BHFCIUVHBFJOZ^RN[aedHHlhTOMHFDB@@AAAA@>=<;:;;:;<<=?CFFECGPVWSMLLNQJ==EJLNPRRPJA;63/7>=<;<:AYd\]fkl\@9BECCB@@@?<;=AJRUTRQM>CHFEEGJHDBA@<78>GKJJKMLKJHECCB<8BEFGIJB9>@@>=?BBACD<8ALQQI?::976;DHFEFECA?BCBBB?9348;;<;87514<=7019??;;?B>64:AFC<766779::;=@DFC=::;>@?>@A:4:ELIJPQH@?<:>=>?>=;85778ERNB;;<<;9459537966;>ACFHA8788888888559@DBA<766778778:<=;842586777>>406?B@@BB=79<=<<>DKKLJF<9=A@?>968<@>9=KOC;=?>974/.255544359875544469<;:860//138;<>>:32354440)(+,,,.11463103535>FIJJ?77650,-2323:A@=:5/.117AC90+)+.-/8988741.**-.,,./?S=100786AKGAA?62269@HB0%9YS1(41)',7ED8:P]O7++**)(*04=@@MLA8117:=ACA?DG>24<<51011+/<5*;S]c^HFIKL>2001122100/-*+044=JA7<<;??=;=<8(+;DA@FJFHD>@:@JA960.26763275,EEECA@??>ADC@@CEIJIGIKKIFCACFGEDDFMQOOSY[]^^\_dfbZTQOMKIIGGFEEFGFFEGLQYaZE>ABDEEFGIIJLLKJMOPOPRSTTRJDDFHHFB??@@BCCCEDCCBABDDDCDEEGJNQTY`ccdefedddddddeeghghihe^]_`_]_`YJBDDCCCDDEFEFGFGHJKKMPUZ]^\ZZYXYVOJJU\\\_bf_PJKLNNNPRSSTUUUUWYZ[\^`aa``abbbbbbcefinkf_^YTy\XSTV\hjb]YXWWW\hkjxronc[^gbYU\jruokhggggijlorsuwvwtonaWWWWYXVWXZ_]WTSVXauWVVWW^cc`]\YWURXY^]]\ZX[YXZ\_clqnmkhd`][\\VUVVTRPNNKEJKKSZ_bcu}c_VKԉQRPMJFEEEEDEDBIhOIRLH>>?>?ABCDBCBBBB@@BB>;;>ADCBBBDBA@@CDITVNFB@>?>9;@;8YRBHA<;;OhxrZbD8@BEILKF<9EDACBDEFDA?@BABHLRMBFNKCB@C?:98@KLQZ]_]VNA=9:<<;=?LY[`cccccbbc^OBFGJRSMGFHHIHCAAAACDBDGC;9?BBC?;>ACEHJH@=?@<9;>;9CMH;9<;;<=>BGIKKJKOSXVPKA=FT\[WWWWW`he^VMGGFJMHGNSPGHJIGFDBBCCCDEEGIIJLJGJRVUQMLLLKJLLKJKIHLORZ\^`c_QKMLKGNVT_Oƿİvt{sgebcjtu{xjehjlmlkhkpk`YXUSQOMLJHFDCBB@@BEJNOMLJHGJQQMKJIHGGFA<;;<><:=AFE@:>?AAA@:77?KSQPhvvjb_fmja`U=368:@IIDGWd^d|oJ;CDESaT?CHCIUUPWdhquM?upTVSLHFCA@ACCAA?=<;;:988:;<<CA><=:9FSJDWjiT;:BA?>@C?9=?<>EPSQOPTP>;LNKMLB?CDFJLG>9;@EIHHHFEBBEFD?73:DFFJORQQOLJHCACCB?:52441/7@CC?;?@86=@@@AA?=<BGGDCA?@BACC?;889;;;9755569951/49<=>??=;9;:769<>?AEFE@:;?@>>?AC>89@GLNLHA:<;8;===?@?;882/>NL?66:;999656779733542468;;963/-3:6-3<>AEE?615?CA@A>=@CC@=>@?;:;;:;>@;9EUUJEA?=6/-08?@=;99:=;7567656899:;<9/-/39>?=>;8;=;5159;<<3.-01///./0/122468;>@DFH>448:3*.6412=IE=840/235ALJ@4-,1007:::640-++,03352>R://,/4?KLF:9A90/06=DG5/ci)'LO.'17:D:3J]O8,,./1.,,029@A;/2>B@=CQYZZ[VLGFED@<:<=916B81BJPQCDFIJA321003568971**35669>@@>ACB>77650.7>>>DGEA<>MRPWTLHB:877865541EEECA???>?AA?>?ACDCAACGIHD@CEDDCDEMPMNU[^`ccbdfije\TPOKHHHFEEDFHJPW`ioryu^G<>?AAACCCCCCBBBB@AABDGKNQW\\^befeddddddddefghhikjd^[\_][^d_NCCDCCCCDEEEEEFFFGGGHMRTTRPQPPQPOMKJLKKLOTTOLKKKLLMMMNPRTTVY\]^^_``aaabbccdddeeegihffhaXzaYSQRV__YWVVWSR]lkfruruk^`ge`\[Xdqmgkkjjmomijmquw{y|zqcXXYY[YWXWY][WUTSRcvUWWWXehdbb`]WVTY`\YXWWXXX]bYPYmz{ywpga__\YSSWWWUSPRNBGOLHILMFNkqO@B>mGNSPLFDEEEDDDAJiIATJE=>A@@CDBBBBABCB>?CGGC@?@A@@DIHEDBACGLOMDBBA?=>?=A9>]L>>:=A<;;>>EWWMGHDACHA89?EGHGB@BCCDFHGGGEDBBHLNGGJJLOPQL=::<<<<>A@GNJDFMQQPLECCCCEEBAC@;@C@;:=<9:<>BDB@?@?<;CKMPMJLTZ_`XNF@@LWYVUURPXaXPLHLPKGKOMLKIFHIHFFGFCBDDEFFHKLKIIIJLOOONNONMKLLKKJJKMNOWZ\_d^NIKMLDXlle}̾ʼwmf__fossyylccfinomllorh\XXUSPNLJHFDCBAD9G}udblrmjg[SHNebZ[YXZZXXVUUTSSSSSSRRQPQPNMKKNQTUUUUSQQONOQQRRSTTVYYYXVUTTVTSSUVXY[]___^]ZY]\\]____\ZW[KJ\kwD8784>U[SG=;=?ELMMMGC?>FNNHEDDDB>;989;>A@AACC@==?@><<<=AAA@><MZK;CE?HPKQchei{lJBqo\\SKJFCBBCGE@=>=<;;;9789;;;<<<;88:CIF@==@DFA;;BLQSWWU[_UG??GMLE><S_Q;;????@EEA??=?EPSNNRVQ@;KOLLHBADFHJMJB>;?FIHGFDB?CFFEB818CDDKPSVVQLIH@67@H?1343335FJDBABA>>@AABCB?===@FLQMD@?>>>>=:9=@?>=<;9755776884359;>@>87:=<88:;=@BDED@;;?@===>@?=<=DMJ=652586345579765886@@A?;722442332322;CGHHGGEEECCDCCBAAABDDA;744=EECA=76789;;83103313:==@=966;DHFA?9;2-.7ABBBB@?AB<658:97689:;;;7..05;>>==<:8877678:==6003311220-042258;=<;K3/0/.2BNIE97=7016;>AB7Ko&,jq;$>?+AIE?>DC?DB8357668;<@AAB?BOX]acdcXJ8000//.//BCDCB?>??>>>====>>=<=?AEGEBBC@ABCEKLKNVY[`fghggilkcZTOJHGFDDFGLOT[bjprsuwsdO?>BDEGIIIJLMNPQQSUWZYZZ[XOHDEGHGB>=??@ABCCBACCCCCBBBBCEHILPRV]cffdddcabcdeegiiiklkicYTUWWUXZPDBCBBBCCCCCCDDDEEEEFIJKKKKOPRRRSPMMKJIHGHIIJKLLLLKLKLORTTV\^[[^^^^]]_bdeefffggghhiikkhdvned_\^acca`a`abbenjdrpijaY]fZR[^]exocddeehoojmnruwz{{~vdVVX[\\ZXYX[\XUTSQQerTVVTXhlgffec_[UZ_ZVSTTSSRYgZbt}}viabd_][ZZYWVUUTPDEKMLKIIEBHN[mtg`pkWECC?CBBFIHHHEBCFC>?DJONKIJFABHMLLLGCJQJECB@@=@GMQUWMRbF;>>?BBJZR<9;=<=@DKKMNIDCCHE==CKOPOLGA@@CEGINROGCDEHIC9>NH??AC=8?CF@CddYXXVUTTUUUUVVXWWWWWXXYXYYXYWSIDJORTX[\]\\^^^___``ZOJLLLLE?:55:@FJHB9567;<<:7;<4=R^``bedccbbc_N<==@CGIQZ\XUUOHFEDEFECDC????ABDHKJFEGFA?ACCA?>?><;9;AIPROMHAAGNOOMKMT`dc[NKE>DLONPUUSU[UMLNTXSDBMPIEDCEGGGEDEC@BCDFFFGIJGHIJJJLMNRRRPMLLKKKJLMNNRVZ\a\MIKINTboq]Ķȸwhb`abelpqtpgfghnttrpmki`ZYVSQOMKHFDBA@B>6j}zpa`hlj^_\UPR_\WXWYZYYWUSRRSRQQQQPPOQQPLKKMQTVVUUSRQQPOPQQPRTUVY\YXWVVUUTSRSWXZZ[]__^][XX[\\]^___ZYXYC>m~=7773?X`\PB967;ELMIECD>;AEA>==9788;<<>?BCBABB@?@A@><<==>>?=>AEHF>?Kcijfehgdb_b_G569:GQ@778BVROfsS328:BC?CCBIGBJY`dcaSC=JbnjcXOLKFDCBCHKD==><:964459=?@BDDDA;9>@==???AD@9897;M_^ZcicYPHJQNC;@ABEE@;866:?@?<<:868<>>:7>HB;=@@>>>?@ABA@A@>;BKQRNE>=>>>=97:?BAAA@?<97644:A>63699:>=76:=?BFG?9;>=:::77@C@81-//0221/./1232379:<<<:33898654468755668;;=@@=;;879;;;;98778:9778=@A?85211003235349@FHGFFFEEEDDCABAAABCCC@;76;AEKQF97988:;;:643124799759=?BEGFD@AINSSO@<=748=@A<415;?CDB@@?:89;::88::;;984102479;:::9879;=:769:4../01113.+/35657>B<79:=?;6;<1;F9-/;KK@9325852//8BJLJGA:2-013553/./26:>CADL302125@KHB8783..5;:74,>zGEz{C"PS)?WIA?91/-,--..188-'1LWIEFAACB?<@JQRSPOLDOebA7>BB?=;9AG7,/224//24566611<:.,37658>A=?CBAIOC856789:==;=E?;EJNarxv^P>.00--,*+@ACDCA?===>=<=>>>>==?@AACCAABABBCEHGHKPRQV^_[[^`\WTVTNIFEEDEGKOQTY_acjpporsl[IEGIHHIJJKMOPQQSVY\\[[\_[NFFHHHE?>???@@BBBBACCCBBBBACDEGHHLV`egfddc^\^`beghiijkkjkmeRKPROKHGDBCCCCCCCCCCCBCDDEEEFFFGJMRUWZ\_]VPMLKKJIJIHKMLMMMOPPRSTUV[ZWX\]]\\[]`bdeghhhghhhhijgijiijlmmnmmmoklnljhijhgwug^XZ_`TPX[\_stjjhfedfjmmnruy{{wsdUPUY\]\[YYXYYTRRRQQenTTTSTanopojea[TYXTUSSSRRSXgnxg^did`cc^W[^[ZQLEFJLMLJJHGHF@pǶđSHOID9^ePPRQMFDEFECDCBNl~SFICABBFFDIPRSSKDBECA@BEHKOQNMKIHFAHTOHQVLEGHC@@DOW[bc_kdB@=>zD?>hf@>ACY`I8=AAABCDFJHEFFEHG?=CJPUWTPKIEFGILSXUKDDCBC>9;FC>:CZ\OOUNHMNQO=;ABFJA5Pk\WXWVUTUUVUVUXXXXWXXXWWXYXYXVNHMOQTWY]]\\^^____``WMJKJJJIG>6699=CE<48::<=;88999IZ`bbdeedcbbbZH;>AACHYhj^UUXRIEEDEEEDEDEE@=CIKLKGEEED@@BAAEGFFEC?;:>FPQLHEHMLKJIIHJQXaf[IEGBAEEDGQUYX[_^_db[TICGJHFDBBEHGEDGFAAADFGFFGGEEHIKKKLNRSRPNLJJJJKLLLNOTXZ[XMJJGPdfmh{ºìøxhacfihhhrspjgikouwvsojga\ZYVROOMJHDA??@A5Hztpnlknoomdd_XXZ]\ZXWZ[ZZZVTRRRQPPQRPPPQQOKKLOSUVVUURRQQQPPPOPRTWWY[YYXWVTTSQRSWZZZ\^_^\ZXVWZ\]^_^^]ZX[XBQh63753AWaa\M?76?>=7799?AAABBBCDBA?>>?>:8BFB>CIDAFHT[ijfif___dcM8589=B?979=:888868AFGFEFFFFBA>;89;=?AA@85548Nc_]ghd_REHOI=7:DHJM=2426DE<=BGQUQI@=@A?@BJQRRTWA5AMNKJHFGB;8777888:<==>@=624559:89:98:>?=<::=?A>=?@@??AFJHA>>@@?>>=;;EICACD?96668AIC714657;<;9779=AA=<=;:98865:?@=;<=:45=>:9978>DA6120.242275002246:869<;;812<=9::4157546665568>>967:<>??95;>>;6247524777679CKOF:9::89897666302579:>ACCBBDGIGGJEC?;51028==?CA;99;;49[hP=44@GG>7:?B@<;;;;;;:;<<=<<;:88:74678::9999:;=?>946740/020253,*-5=719DE;57:BKJEE@-7QN6.@MD7743672,,--3BORTN>2-+-.232112358AKDIR3/2235:CC=8883..11.*))(@js~zD0_Y3AWOC=620/.,*)1AB41BMQQD?DEDCACFGLQNLT`cZ\py`OC?91/136?A5+&&),135568976=?600998<>?>?CFGKNJD;889;=?>:;D:2637Tox{UEE63111.,+BCEEEDA?>>>><???>?AAAA@BCBBBAAABCDDFFHT`dcdeed]WWZ_cfgijjklklonbRKKJHFDCCDDCDDCCCCCCEDDCCCAAA@BIPQPSX]bbZQNMKKKKLJIJKLKLOPOQRSSUWYXXX[]\\[[\\]_dgceghhhhffgefhllilmllmmmnkjjgddjvoiuq_YZ]ed\]`cc]gvwrmjihhimnkpuy|}zeVTVVZ]]^\ZYYUXUPPQPSfkTTSSQ^ntlgb\WUTWVSUSSSUVVWj~yh]emja_ag`X\c^UIAEKLLKJKHHJLCMRLOIFBCIKNQQNGEDEFEDDCQpyPLOBADFHGDGLNQSOHBCECBBBDGKMKJHHFBAITSMIPOJMNHDMLHILPU[s_?>?>>>3kbDIIQUTPWaVJHILRVULGDA=;::==>?@=GVJKSVTXWPPJ=?KREEEAGHE=CeaZYWWVUVVVVVUXWXXWWWWVWXXXXXVRNOPPSVXZZ[]]^`_]^__VMKKIHHJHB=;:57AC:6:<;9:?><98@P\`ccdfedcab^RFBBCBEJV[Z[WTROJFDBBCCDEGHGB?DLMHDABFKMKG?;ANPMKIHB<888=@DLPSROGB@AGIIIS`WC>BBACCFHGQ_XS^eiplTGFGFEDDB@DFFHKOPI@@BDFFHJGEDDDHLKJKNRUSOMLKKLLMMKKMORTVTOKLKHOcemfĽȹĽ~pptwztidhsrlegkqvwusmjhf`ZYWUROMJHFC@==B;5rw|wspoqqpnkhaZ[ZZXXWVWZ\[[YVTRPOOOPRRRRSQONMNPRSUUTTRRQQQPQPPQSVWWXXYXXWVTTSQSUWZZZ\]]\\YVUWZ\____]\YYaXL{IIC;5DPX]^[T?68@GJD;;@DHLICAFG>9899;==;:>BAABBCDDB@@C@@@;7BUVOKJEEGCDYok_aa^`aceR;579:=A?>><>BS`]_kg\PBBHE<658?AAEA96448=?>=<<=@?=>BDEEDA@@@A@@AB?>>>?A@=>BB@?????ADB:@AEF>78989::;;966<>814=@;7887>:78<>BD@;=@<9525;<::;;;;:;=>>?ACDDFFEEEEDDCBBBBAAA@@@?=:=CE?<;:86455676520137;AEEDA@EJLGC>742210/036:AFCAA@<:8=><::<<==>=<<=?BC>::;<===<<;<;;=<734553156.5@:,)-7>21@HB64:<841888;=??>CHJJKJF<865568527>6/,&(:XqxL4:5/-/1.,*DEFEEGEA@@@@>=>@@@@@AAAAAAABDECBBBBBBEGGFEEDCCCEDDFIKKKHFEEFILPRUX\enlbbmrqopn]ICCFHHILNMNOOPPQSSRRRQRRMGFFFDCA@?>??@@@@@ACCBBAA@BCDCEFFLZcbbddedZONW]_aegjlnnnnoqfTKIGGEDDEDDDDCCBCDA>=@GPXVW^_OBKKGLOU]\RNNMMKKMMLOMKKJIKJJOQSSUWXXXXZ\[Z[[\\[\]_[`ghiifb```adjhfgghjlgbac_[[bak}uorfSajc`cahieg`]n|wqonlkjmplntvz{dSUWUY___^\ZYVa^PPRRQfjUUSRUlusXR\[TSTUTTTSSUVWUVn}~{xoikmkg]YdfPFV\SKCGKLKKJJIHJMNGDeoMQKIGFECGKNMKGFFFFFEEETszQKMAAFHHFECCCCIUSFBFHIKOUVNL}Y>CEDTRRMADKLLJEBHGA@@@A?\Y>>@>=<:3L7B?=@>=@ABIKKGFFCABGOMNSRPLKJB?DHHNRUQYc`MGHINQRNIFA;89:;<=@EDDEIKDACFYlreWUI=G_aOUH?CFHB@Sh\VWWVUVVVUVUVVVVWVVVVWWWXXXWVRQPQSVWXY[\]^^]]^__VMJJIHHIHFD?959CC<69<;9;GHA:;GU]aceefecbbaXICFFEEFGDFVd^NIPPIECCCBBEHHIGBDLKD@?AGQXUK>?@ACIH@KaXHQ]_c`K:=FIGFDBBGGEISYVJ?>BFIJIIHEDCCGKLKKMRUTRNLKLNPOMKKMPPRPNHJLKHK]edyʾɹt|sg`_`ejkdagpy{wsnhhhc]XWUSPMKIFDA?<;?3L{~{rnkgfggfe`Z[WTTVUSTXXTSSRPMKLMOOQSUUSTSROOQRSUUSRRQQQQQQQRSUXYXXVWVVVUTUUSSWXZZ[[[[ZZXVVXZ]a_]\\\ZZdWNl@mlO6Yga``YQ<8=CGJE>;>ACLQKCDG>:878;<;9:CF@??ABDC@>@DDBDC;:H[`a\QJFA?WpjYV]a`abbW@6799;>CKJ>:EG=:@A<;>BFGHJOT_ji_L??Qbkd\\dcXRQLIHDEHHLHFDAAIU]bcbdbYTVW]ggcc_N?:<><9:=AGGEDGT]\cmcK73DLC?A=;B=:;=><;@GFA??@@>;BRYRMNIGLPRLB?81;LOOUSDJKJKIFCCCFKNLOMFB<56:<@EC@?=;<;::;<=>?><;::972./1589::87779::<@DB=:=AA@BCA@?ABBBBA?>@A@?ADDA@???@?>@ABBA?=>@CFAAFJG=8:<<<==<:767;>:34:>=75887626;:;<;:::8879;;::;<<=>@=537;@CEC>>=:6247<=;;;<<;<<<<;?FFDEEDFFDCCBBBBBBAAA@AA;10:=?><<=<;=>@A@?>==:765113543366/6A;,),14/2=C;04;9@QUI6*).29=>A:333663/++/.+,9OWUQB;@>852--0114F80EN<8EQUNVnjTKMMJM[ccqwh]YhjSJJ@34931=E>3)*79574-/7>B:/110012448=>AFIJID?64210/0,,360)),,2JilC+01.*)+,,)FGHFEGGFCCBB@>==?@@@@AAAAAAABDCBBAA@BDFGGFGEBAADDFGDEIKHGHHJLNNNNOQX`cbempmkkliXKDDGHJNPPPPPPQQQQPOMMPRPMLLKIFEC@@?>??@@@ACCBBBBABCDDDDDGS]^`abdjePFNUTV[adglopnmnj]VPHDCDDDDEEDDCBBABFMS]glppqslS@DJMMSXZUQPONLLNMMOOLLPW^edRMRUUVWWXXZ[ZZZ[][[YVST^hhffb__^`\Zab^]__``\XVVbure`onmwycOavm^dddi]fe]bnrolmpnintrru~gSTWTY_\\]ZYXXb[RPRTKjoTUURWqypRYjbUSTTTUTSSUUUVVg}|wtwwrqpi^VYP@GPLHFHKKKKJJIGILNOK?odKOKJIIJJIKLLKJIIIFEDFHWuxPMKCDGGFCB@>?=E^dM@FPVZ^`aZZj7ST>>==>?ABBBBFHJJD>DOPNU\XLFFC@CFFKR\SQSUNGJIJLNOLHB=;;;;:=EFFEHGD>IJ>_}}h\[I;Upd]cMA=@DA@LcbWUWVUVVVUVVVVVVVVVVVWVWWXXWWTSQRTWVXZZ[^^^]]^__TKIIIHIIGGD=64;CB:59<=AEILA8AOZ_bdfggfdcc_TEAGLHFFGKYfeWKNYVKHJKLKGFGGGHEFJGBA??FQWSG?DOSNFDCB@>>BGMNMLK?>FC;:>ACBB?CCCB??>?BE@9E\R@ENKGGB;=GMJHGGFKLIJQTPHB@ENQQMIGECCCFJLLLLPTURPMKKNRQNKJKSSPNLIJKLMQ[`aþȮ}|yv}lWQW_cced^_ht{{uqkghg_YXWSONKJGDB?=<;56}|vkhjf]WW]a`^XTTUX\YVWWMILLJJLKKKLNQSVVSTTRPRSTUWVTRRQQQQQQQRVYYZYXVUTTTTSUWUSWXYZ[[[[XWVUWY]_a]YX[`][cSD][~}_8VsqqqeM=ADEHJHCBADHKKHCBB>::99=BAACJJC=<>@EE@>>BIOOKIJNT[ahgU?24DQQSSGCH<4=G?2469>@<IJGEEEEEEFKNJIHDFF@:89;547755579<@B@<:>CDDDDCEIHA=>><;>>>>>>>=>AHJA:;<=>><<>=<;:;<<88:<>946:9:BED?639BOP@676564238:997316>AACFHE;1388;?ADB====?@@?<:<>?<9:7337>BEF?:<;61244459=====>;::>GHDBBCEECCCBBBBBBAABBAA=21;CB@?>;5568;:996655118@BBCFGGECA@;4112773/3?JOME??=<;<;9>?<92+0>A;@A?=<;:::;==;87=>>??@?80/0014323336764/++,.0026940352:JK;-'*/0,/683114882,+/55038EWYSF9>>???@BBABBBABBCDDCDGNSRVZ^chcTHGKLMORUZ_befhgcXVZWKEFFFEEEDDB@EPX^a`]ajsvsqomRDKPSUUY^YSRPNMMNKKPW]hqvuxjPPQSUVVXYZZZZZ\^^`]VQPWca[\]`bab]X`aYTVWUTYZR]xdZhne\akjepfWf`emhggec`cornpssst~oZUUVTYbXYZYXVTUPSRPQKvoRUUSR]lpXdsbRSSSTUUUUVUTWYZj~|qu}kakkQEIHFDFHJKKKKKJGHMNNOKFNSJIIKLLNOMONMMMMMLEDEHJYvuOKKGGGEC@?@??=HbgVKMSY_[TW]evb_b_e[LBA@AA?FKFCBAAA=>?>VS=<=<;::9;=<=>==>=<>@BCBACEGKSlr]LQW^XJB@@?B??GRVLJIGGJMLJHMPQJD?=?=;8>IHGIPQIFW^H]vugbYD@ajUSZQD;:AHLNTd^WVVUUVWVUUUUUUUUUUUVVVUWWWWWUSRSUVXZZ[^^^^^^`]SJHHHGGFED@:67=AA=:=?AIJFI?:JX\aceeghgedb[OEAHPMH?EXb]TPR[^UMLMPUVQLGDBDGIGEFD@?ELLF>?KRMEBC@=>>@CISRJB?>AEA<AFGHIKJJINQMMOMIHGEJUUSOJGECBBEILMMKOTUSQPMLNQPNLJJSVPNMLJLPT[`[s|vu`W_dedda^_juxusmhhhaZWWUPMKIHDB@?;=93bw|tibeg`SLQ^`^[TNQY]a_]]XKKQLFHPUPLMPSTUUSTQPRSTUWWVTRQQQQQQQQTX[ZZYXVUTTUTSVWUTWXZZZZZXWXXTVY^ab\UUZdc]cR8clxpFPrx{}sPCHIIJJIHGFHJNJDEED@::>CLMEEMIBGRWRNOPPQOIFMYcoywn^RNQUdmbYcsxtbQHCADJMOIJW^]]_b`][WSU^dYOXcln]>07@FMQRNHCITVRYcaQC?=8ASZWSKIG81=F>37:=:8;@B?>=;66==>>=;;;;:99;=?CFC?;52138977;:744345458=BD@;=ADCDEDCGOL@:9;=;;>@BABGIHHHHGGDA@ABBBDDDEEEHE;2003=EECDCAADC=8:CHFC???@@???AGJB;;===>==?AB?9:=;<=<<>=99=><><7312:DHE;69:972/158>?>@ABC@79BF:459945>BDFA7985122/.5=@@@BB?:68@EFC?@CCDCCCBBBBBAABBCCA@<:<=>>>=;679999:::<<92,1;BDFJKIHIKH>889:983/5BKNNF>>>=?ABAAGPQ>,0@FCCGJHC@@??>>=<987765421/06;:9;=<<<;5..3676311113;6+',.0234642022203:;2--.///0112347;92/027<=<:>JOPI85;94/.243544;FE=GT4034880,.-,,+.79:44@D6377654NqR%-899;>;7323359@@6-049:750/66.-BPSSJFZdctiC3?RsoFAKHE<100.35310013882-5AA=<<><0-0*&'(-7;::?=1+4:92.3536@FFJOS[bdaSABFEC=2+**+EGJIGHHHJIFDAABAABA@AAAACEEEEDCCCBBCDDEFFHHFEDEEEEGIIIJJJKLMNMLLLLMMNS^fjlppmfYNG@>@AAA@?AEILOQRSSTUVUVUTUUUSMHFDB@>>>>=>@BBBAABABBBBBCDGIHFJPU\ZQLHEEFFGFGKLMPW[\]VOV]SJIIJGEDCCCDIQSOJKOXhiacjnrqYDLVUUY[ZWVVROONKTadciswstzfMNUVTVYYXXXXZ\]_aa^[WUVSTWZac```ba^ZWWWVTUWYɸYSTZckmebgl\Sc\[gijhc]\^gqrrtutrjbk^UWVUUZhWWYYXVRPPPRSRO|jPUVSQQap\^k^UTSTTTUUUVVUW[X]yrr|{sYrwQFIHDDFIJKLLLKJGHMONOKNHHKHHJLNPQQSQOOPRPLFEFIKYwsOKHHGFEB??@AA?EX_a^WPRVTNQXYckZ^UKWOC>>?><=HSTKB@@@?@@=TS=:<::999;<>?><<<<=>@CFKD>@DQnGagZOF@?@B@<9=A?<=DPGHNRNGJQXRG@=?@@96HMDHY[LP`dOSWPU]KDJLKKMICDEC>:9ANQG?AC@=@CB?DNWWQIIQOH@;9EKHCFHDDNPD9;?CEGIONLF<=B@?HOJDIMMMMOQQQROHGGEKUSOKIHECBBEILMNMNTVUUTQMNONLKKLSVTQQOOQQQZaVȽ}e^aa_]_^aksttqjggc\WWUQNLIHFCB?=;<5Vy}yqfaa_YPP[b\USRQPRUYZ_bXSXXMGFO_]QUXYVSSTSPQSTSUVWVTRQOPQQQSTXYYXXWWUUUVWWUVWWVXXZ[[ZWTW]^XVY\ac\SRWeb`eS>>`p|aZlux}v\IKMMLJJJKJGFKLFEEDB;;?>@KLJIGFB=8>BKSSQTWL=:A@:CSUPSRI?46AE>9=@B95;@?<;;:517BJOLECEGNSRME=87AEGIHA=CE@?A?;<==?@@@?<;<=<:9;=?BDDA<6356898559;:6127;?@@DFB>ADBBDFFDFKI?64;C?=?@A@CGHHIHHHIJGEDDCCDEEFFHKC50008DJHEDCADE?74?NTOG@==?@AABACKMD<=???@??DE@8:>;9;<:71.1215>BAABED=516ACABEDCCBBCBBBBAAABBBCCC@@@><<;;:867899;=>===92,.5<@HNQQPKHDA>=:6792.7DJLKD?BA=@FGBER[ZOB>BDDFHIGA@A?<:;;:7755320.-,.1356;>96675336;<984011154/-13578;<621222222321110.0321248:<:52/07=?;79>AHH3,122003435404?F?HQ9>E>86765995103<>4?QH.+48:<7-51(-1368<<1))+*-:>701861135429<7CcbPOMDO`ipT1+17SZ@DGBB?740.14677767961/4;=@FHIF:/-,))'(08<96778:<;6168/+5EPUVSWabZRKHFEFE>6321HHGGFHJLKIHFDBBBBBA@BBABEFFFEEDDDDDDDFEEFEDFGFFGHJJKKJJJKLMMMLLMMMMMLMWfmpqlfbXIB?@A?BEGLTYZ\^___^]\[YXXYXWZZSNIFDA@?>>>>@AABCCCBBBBABCDEEBBFGKNKDCFECCCDDDDDEFIMNNLHJNMKKLNLFCCBCDCBB@?@HPQSWcmnrwrXISWWZZZZXYUSRNOTVUV[fjfjvxfSJPVTVWTTUUW[\^accdfc^ZXWX[]^^_a`_^\\ZYVSS~wMSOM[krplfc_][XRV[aid__`bglst{ybQYZYWX\\`cOS[YYXSPPPNW\Z~gMSWSVSXqjQT][WXXWWWVWWWZ\Z]hvx~y}v}]WYRIFEDCGKLMMMLJJGINMMNLMOMKIIIIJMW^WZ`\UROKIIIJKZzqONHHKGD@>?@AAB?HXdaVMMRSRVS@>CAAAACB@?@??>>HUYNA>AFEC@=UR=;;::989=A@??>>====?@ENK??ErۡWEcoVD???AB?;9888:1FlLBJSPEFP[XK@<>>DFBITH?NUPbk\OI=6?GBD^fE47>E?89BIIHERc^TUWWVVWUVWUUTTTSTUUUUVVWWWWVUUUUUXYY[]^^^^^`]TJGFFFECB@=<<===>ADA@@AB@8;LZ^addfghifcaZOEA@CLQOHKMCMddYV\cXHOXVWYSF==DLQUVSJFGF=:8:BLNE=@CBACFEFKRZcaW[_^YF::JXWIGJFFONB:<@BEGJLMNLC@CBDNVUMLKKMOQSWWVQLLKGHQOKEECA@?AFJLLNOPRTUVVROMMLKJKPVVVUSQTUPMY_n͵Ǽvkhnkc]``^XY[`jprslfdb]YWXSPNKHFDB@?;;3Dv|}{tlfc]ZWNM[\OHJSUNOQQIP[[Y\[NDBJ]_[[]^XSSTSQRTUTSUVUSRQONPPQVYZYWVUTTTUWXYYXWWYY[\[[[[VSU]`\Z^^aaYUU[b_afTMBJHFGFB?;6:EIGINRSUWX]``^VV_aK988:<>AGFB=437=DHIHHNNIK_od\kts[MOQQQby}y{TDE=FKMJKOH>;????DLNRXRB63;89;:99:>A>=@FKJFCAELPOH?:87:EICGUXI5266:FPROD;6>GMG96<=;=?@=:9;=?@AA@<6589634447:96315@LLDADDCDC@@BHIGGFC=40:DA>AA??CFHGGFFFFFHGGFFFEDDCEGE<3367>IMJGDABED;35AQWNC>=<<>ACDEGMQJ?<@CED@@EE<6:><78<=60//2987BDDB=8/+05;AEB>>>?<5/16>?:?LJCCCBABAAAAABBBCCCCB@@@><;9865569;=?A?;951.133:GPTWTH@>>?=51670/9EJKIB?BCA?FF@FTWUSSPKFDFGGDBAA?;8:;96544320/,,,.267::767888658<=;61//023554348;><741/00113532210/3522568:<;73-19:6339<:AG3)//00265245468<9L[MafXE868;DG>761360;J9'%+364123,02/6>@<;60-,+,154333/++.566;<>Oc]PPRGDT`Q2*//2AB6@BAA@;764//6:?BCA:3./016@GGHF?2--+*)(+2;=;9:;;:753351+-5=GS]adZJLY\K9>JF=99:JHFFHJNOLJIGEDBBBAAABCCCFFFEEFFFEEEDFFFEEEFFGHIJLLKJKJHIKKLNNNNNNMMMKNV_decZTSOGDEFJPTVXY[]]^aab`^\\\\[ZZXW\_ZSNIFDBA@@?@@@ACDCCCBBABCCCCCCCDDDDCAACDBBCCDDDEEEEFFGFEEEGKLNPOKGECCCBBDEFEECGZjklnopqr\JSYZ[[ZY[VSTPPNLKMLRcmmosymLHUPNOQRPQTY\_abcdffd_XVWWY\]^]]a`_^[YZWX}ŚXIQOJQ^jwsYWfcXUPQV`pd`acfd`ksmtwhX[Z[[Z^[aVEO]ZY[TNNZlhb[~cNSTSWXScpb\gd[]_]\[[ZY[a`^fuzrvy{zyxv}rtzbUNKFDDEEIMOONLKLJFJPNMNMLLMMJKKIGJXbS^siYPKJKKLMM[ylOMEEHFB>?@ACCDAFXaZNIOVURVRA<<=<=????@@?@ABIOQKDACHHGFHZQ?=;::::;=???>>?>==FPYN?<=?@A=;99:;>2cJ;EOPGDKTSLF@=69;:?NTWG=======>=>>>>98EU[abddfgghfc]RHBBAAJQRNKDBRdbTVfeOJX\WVYQD==@FOWVOIGHGA=?ADGHGABFFFGGHOUW^hha_`\SF;>JR\WPMHFJH?;?FEB@BIJIJHEB@FPVYUJGHKNS[][WSSVUNIHIFCDFEEECFKNOOOPQSUVVROMKJLKKT[XWUSQTUPQ[ZĪǼoaZVRPTZ_bf^XY^glnlfa`][ZWVSOKIHEDA?<;6:ys|wotunihg^][PLXYMGKTWVUURHCISYZYQD?I[]]]]]USSSRQRTUUTTTSRPNMMMOSWYXWUUSSSTUWYYYZYY[]^^ZYXVVVW\]\`dcb^YWZ^_ZbgTPMI?@DGEEFD?>;7:EIGGJOU[`gkhd_Z]cZCEI?L^jVDQLIOUWTQMB964569=?=?=9559?DFHLQPMP_mdWkwt_OKJDHf}|||aBAB??EKNRW\]UIGPUNNNOD@GF=<@>=CD<768;>BDFHFEFC>@A@?@ACKTSH>78>CDDFDA>:888888;?DE@=ADDC@>AGKIA;88:;>>:;=@@:46;<989>>;:9<>@BA>>;658:60/224543456>IMD>?CGE?;>>AAAACDEEFEEEDCEFCBCCCDDCB@=856:=@CJKHCABFD?85=99>>@DB@><==>=5.29;43@F?:<>>@@=;:89:988:;5/5AC:7::<=<=<::951159=@BB?<:<>=>?@=>AA=;7426=BEC:7888645:<;957=ADCACDBAAAAAABBBCCBBAA@?>;866446;=?>?>:62..2438DLNPNECHFA<83562/7DIKE>858>>FD>?FNQQPQOKIGGCA@BC@<78<9764321//-,,08<<8569;<:96569962.-..13442//167631,*---.0343200376238748=<6567631/08@;89:8653215861//0135567AG@:?JKEACH;,14665529>EKH?:;<968=FFD;1--.//6=V`a]I??==:;IHGGIKNPPNLHGFCBBAAABCCDFFFEEFFGGGHHGFFEFGHHHJMMKJJJJJJJJKMNNPONMMMLJLPPRQKHJLMJNTVTSQRSUW]^\[[\\\\\\]\ZYZZ\``\TNLIEBCB??@@ABBBCCBAABBAAABBBBBCBBAAABBBBBCCCDDDDBDHIJIHIKMPQPOLHDDCDEFFEEDDNWW\iurmihqfLNWVYYYZVSTQQPNNONQXaistsnhXMGCGLNNOPUWY[\\]^][YVTVWX[[[\[^^^][]cZ_b{ֿzJNSRMPMSc_LRd`VTUUVfug`dgieZ^qXPcm^[b_]YUR\ZFN[YY\TRZqp_`RTSPOWTOexpdfbbec`^]\]`cadhqvxvwwvsrquz^[_]\XS?DEDGIKOQPNMKMKEKSPLMNMLMMLLLKIJNMI]qjVQNLPOOPP`|gMJCCDDCAABCCCBDQ^]QGENUVQPSVPD@@@BBBA@A@ADHOUXOHFFKLLNP\RC=989:<<=>>?>>???>=>>?ABFG?ZAHEDC<;=>?A?<:889:1^9BHMIEGHHPSHDD:9N]\T@?LTag[RMF:9>DHGMWV`cS=8;O_XE:8CYYSTVUUTSTSTTTSSSTTTTUUVVVWXWWVUUUUWYZ\]^^^^`]RHFFDBA@??>>>>=======>=<8?NX]cdddfffgfc[NEBBAAHOPJB>@HRSMXdYGKTQOSTMB><;=GNLIJIIHCADIHIIFDCFGLNHIORLSbeedeXHKLJEEZf^SJEED?=CLLA=AGHHGEFEBGILNOFEEGLUaa_XUVZWPHEFEIMTVX[THKPQPOPPPSVUPMLKKLKJQYVTSQOPTQRTkϽƿȹļ|}xqswiYVYY]eokb\^cffca__][YWSQMJHGDB@=984m{u}tonnnooh`_]VT[ZSPPSVVVUSUNEKSUUURJNY[\\ZWQQQQQQRTUUTRRQPNKKMMPTWYVTTTSSSTVXXYYZ[[]_^ZVSRSW\_^ZY`fc_ZXX\b_X`eSLNE<]q`@BJJKPQPPIIJHGKIC>CHA>A@ABBAEGB==;9>?BFFJQRQUX\geYlvqdb_SH\~ywuw^FCC@@DIJJKSZQFKRTQQPMAAB>EVXG::<<74BIMOSRH?@@AA@@FKHB@>;;CIFB>;;;:<<99>HLMH>9:>=>AHG<7=>859<>==;:@IJFA;53223655888=BFC<:96489632343344558<=A>;@AAABBBCDDEFFEEGHD@>ADDCA=::;<>@ACGJIFCADD>957;HMI>BNQLIGOVVROLIFDCDDA@=;99;<;:;>>?CDB@?><=>701=A52@I?8:>@CEC=>AA>=;:::616;:88<;<<<==:66653679=??>=<>>=>@@:9=;54568>?BAAA@@@@@AAAAAAAA@@@>;87679>ACBB?;860/2555@JMOSROOI=853477//:EHA;9.-7=EE=58EQRLMNPQKC>;=BDD?77;<:75443221125<@>:67:;9876876541.0146566410--.20-**+++-/134820284//5536:96677645339=99;400//010/0034660+IooeH4/008LOKI=510-)*/7BA6,*/:KM=22<88<>AJOQJC@@ECACHD=5+&*.06Xppncadbj_ELRXZYZVTURSSQQPPRNO`rtjhlgP?BFHKNNMLQRSSTUUSTTTTUVWXYZ[[\]]]]]`]WYft֏[UY[XVUMRYUU^b`\WWUTf|ibfigaXX_TJQl_V`\WWVQ\gLVXWZYQUmk^TTTPQ_ia[vw\Xcfefca_^`deca_ZanxwuspmknkWUQQUZWLQFCIKMQRONMKKKFMXSMLMMMMMMMLLLMJ@CoeS[USSRRSc^MH@ABBCCDDEEFGFP^ZLEDFJMPPOOLD@AAEFDB@@BDHMQURJIMNONNNP[UJLND::=>=>>=>>>@AB@>==>@EL>kޠGIJCD>9;==>BB<:76794֍?@ADGEEDENUEEUK69P\YP[b^ZWOILH>=====>=;=KV[adddefffffe[LCBCABGNMB::BFA>DGC?>62DVUEDNW_fj_J@@BDDCCDDCCB@>?A@CEGC>:88867:;8448;9:;<;85>IJE@?>;9:997;AIMIA:8;<==?><:6368;=?=9:;=FLNPLD:41//124788;CB735547999::63235835:><;9::=BD;7<>>>?ABBCCA@ACCB@@BB@AABDGHHFIQNC>BEEC@@>?BEEILKD?CC=756=GJMIJOTSJJSWVSOPROFBA><>>?BA=::;=???BEEDA><<<81047=@DHG>>BAABA>===;==:9<>=<<<=>>=987::9999:=@?===<==98:74343366892.6989<@FLE50134.1CJ>9@ABA@?@@AAAAAAAA@@@@=9779<@EHIHA<9:941322=JOS[]WSM:1254554128<;?=<::99665578762007;=??=<:872,+//-.-+,,-.036960263,+3435:877776788:@:886420./11/020/220,,L\OC',1(,>PPGA7-299521079A@:>GNC748?IOSJ4*19:<;920244.*,./022301015>C>=?=?DDDCA><>DJORVSI@CGEFFGD>:3/.-/9A>76:<721017:86135555544238>@BEA4=T[[TKKX_bba[SXaL/),IJIJLMNPSTMHJHECBBBACCCEGGGFFGGHIHHHHGFFEFILMMKHHJKIHIJKKLNMMOOOMMMLJKMNNNNMKIKOKB?DOWTKGLT[^_`aabccbccbbaaaaa`_\WQMIFCA?>@A@ABCBBBBBAAAAA@@AAABBBB@@ABAACBBCCCDDDEHJIIIKMNQRRRRQJBAAAABCCCBADO_`bgcROmwaJQVWYYVTTRSSQRQQSPOXgicaYokF===>=???@BDD@===>DL<\΃;JICE<8;>>@BB>;75684E;BDFFEEFINH@JWO<>?>>>>>>======><9FUZ\bccddeffffcVHCCCBBGLI?<<FOW_YFFJJGKLMLLJEA>BIPNMLNOFAFYhkmolfbdVIWkiYHB?=@ADIIFDCDFFFHLQQIA:===?AB@@<;:;757;;:6488989:9758BHFCA@=<<;87:@FJID<8:<<<:9:;4.4:=>>;:>?:940366::88=?7467669;=>;52246::7:=;9999:?A@==>?@ADECBA>=@BAABCBAA@@@BEIIGGNNFBCEFD>>A>==;;ACDEHIEACD;656=DEDMNQPJHHLTTSPRUSJC@=;>ABDD>;:;>>>>BFFFB@?;:921;C?9>D=47=?FJD:8:@CEEB?@@B@?==@>=<;;=?A@=::==;;;989?A>>><<=;8986541-,054.4?@=>>?CIB1/3664B[`O>;?A@?>@@@AAAAA@AAABA><98;>AEGIGA::9:7410-9IKJPQORUC255667:83027;=:87548668;@LUVNE?;867:BFHC869=<975555668::9::;;86665335897314:?DEHFB>==;512110,*-0--/14640043,+24346666767899;D9765430/134336311.,*,JJ7@AK;$1Q\P>3/+267;84-&1GWND83994@CIPOG749>@ADC;6543.)*-/010,))0=9085;>>AEHECA@<=GNQTWUIDFGGFGED??BEB6./31,'&*34204;CF<756666431.0;CBBEGCHKOVTLJQXiyuk^R[h[C3GGHIINSVZ`[LIIGEDCBBDEEFGGHGGGFGHHHHHHFEEEHJLIHHIJJIIJJJJLNNMONNMMMLLMOQRSVVQLJFDDDHNMF@AHOSX^addefffffffeedbbbca]XSOIDB@?@A??@BBBBBBA@AA@@@AABBAAB@ABBA@BBAABCEEEEGGGIJKMPQQSTTTOHCAA@@AAAACEFKUXYUVhnprbTSRVWUSQQPORUQPSTUTX`]YcqteM?@EJLJKNPQPPOOQQQRSSTTSSTVXXXXYZ[\\c\eUJetqlhc]bqoiiikic]YUNSyi`kovXNVU\kkf[VSSUVUUixYa]^\ZTKFUoo_cWOUh|qpqljc\[fgd_\Q\lknrniec`\UaYUUSWYRHFGKLMWXPKLLKJHQ]\XUWURPMLLMLLMMMH\ٗaVUTRTjWCEBBCBBBCFIIGLXmZFGEEDEEJZ^PDEFECBABBBCEGGEB>>EOPPPOMQMMT\innR<=>=<===???ADHC>>==?H>>?AA=75582}֮J7@CEGDEHGLVJ;IVJ:>FBGWXOD;AGEQa\RXVNLMOE7;ILHSP>448;K^^TPRRRQPQRRQQRSRRRSSUUUVWWWWUTTSUXZZ\]]^^]XPFDD@>??>>>>>>======>>9>PZ\_ccccdeeedd\MEBCCBADGE@?AAAHTVRMFBA@?@@@=;<:@BCEEFFEFEDJQW]`I=9BLGAA@?@Tc^NCBFNQKIHHIOarzo[TYVSVXPIKOUPLKLMNMLLNNMLLMRSVQEſĿ|wpWO\gd]\adcglibaba^][WUSRQMIFEC@@?<8<}r~~xsqnmjhd\SDAPZOFOOLRVSOBAA>HPCRpm78HMPU_WJJJIG;7:==CFDA?>==>>?@CHMMB;>=DHIKG;76;JYfcO?AKY^lkVGGj{AFVTLFFIMOKCBCDDIV[[YXUTSOFKUaicP=8:9653CDEEDDEFFFEA>;9=??<96>FA759<:<=898789:99957ACA@@@DCB85?><986359>A<:?A@>:=DGHJHEC@837;:;=<;:9998558;=9567667=GC><:::::;=>??@AEIJJJFC?:8887>IME@BBA@BEIJGEFFDBCEEEA>@?<<;;>@AB?@FGFF>644;@;:ITRF=?CCKSTQQTSOGDA?ABCCB?>>>>>?@ADFFDCA><945<@>==@>:;=?EE:226ABBB@=><<>><:8>@>?@>>=<:;:86642.2622=DB?@C?AI?-,32.5J]ebT>:<>=>??@@@@@AAAABCA@><;=>=?BB@=9768<>51.6@>>>?<>IF?84688763138<<975431///-/:FKC6365449BCFA;79=;76566778864579::98885445:;8547:>CCEC@===>;54441-+/3.-.//,./.12/0442//1344556778987653311488;;<8841/02?;8Sa\A4MkkO3---569<:8/'+;HA7,'7@8AEJIB;48?BLXYWLFB73,)+.21-3PabR@@<556=>ACHFA=A<9FLOSWXZYOGFFFFGEFJKKG>2,-/1246:604AFECA:::952/0,.;CAAA@@7;XZRPJMS`uxqhQ;JclcDCEJQ]cfjqrbNFFFFDBCEGHHHHIHHGFGHGGGGGGGGGGHHHHIJJJJJJKKLMONMPPONNMMOPRUVXZ[ZZSJGHGEDCBABEMW_bdggffefffffgfdcdddda\XVOGDB??@@?@ABBBBBBAAAA@@BBAAAABABCBA@AA@@@BCDDEEGKMLNOQRQRTTTSRKE@>?@@?ABCEFFGJUgpkddno^NMSTSPQNJSWRPSUVTTUU]jkeko^H@HKHFLVWVSOPOOOQRTWVVVVVWUTTWYZY[fhnrijnmd]^[SYjme_emlc]XQGFqk`ow{VQYY`cXWXXVVWXRQm[`^`^_WQGGYj`dTKZ}}xvsprjXOYjjbbXLXp~wh]^_]\bs^TUTUWPGFJLKNTVOJJKLLJOY[Z^`]YTOMLLLKLLLLF?`ΈTUVRUnV@CHFDBBBELMKIHHPJCCDFHKIGR_YIBEELTUOEBBBBB@@>;DSVQOMJJDCPXfik`F===;<<<=>>@CFD?>><<=;Vd;:?ADD<7;>@>>;<<87696Ff5=BCFEDFJR]O99EGCBDED@>=HW[OLZecX_eMIWUB4>W_XPF;55:@IXbWOPPPPPQQPOOQRRRRSSTTTUVVWWUTSSTWZY\]]]]]WPECB>=??>>>>>=======>88JY[]`bbccddedccXICBCCBAAAA@?BFIRadXH@@AA@@@?>>;8CSQHRdg^RJMTVQNLJKLKKHJS]`UQZ[SMMQdu||ZC>D[dRBCD@?@AABDFHGCBIS\aYG>@JRQNGA==EMIB@ABJPNLKJITgv|wcVYWRRTPKKLNKJJLOOMLNNMLKLNQUQ?wȾƱþyv~kXT\fcVT_d]X_da``_^^ZVRPONKGDCC@<:;8elzutqolid^PJORYZVUNBGRRLB:AQURSSI?FSVXX[^SNNNOQQRQRPMKIIJNQSUTSRQQQQRSRTVVVUSONPONNOQWZZ\]`df`Z[ZX[`_^^\Y[gcaI:7:=><;=BGKNLD@C@:Ia_OXz}^B74:LS\twmlllklbH;=EKKGC@;8569@DEFFGHHHHC>89BSUE759@IQ_R64>\g?<@AEIJGPSOEB?AFJRYZXXWUM>6F_fYH>>@AAAAEQZ[aeb]Q?5458:<@BEEEEDFGHJG@;9:<=??CJKB75;<9?A<:856799<=<:>A@ABDGMNEBIKGDEDB?==@BB<7569:;@B=?CFHF;3799::867876569;;768;;98:EJB;9:;;;;=?ACEDFKPOLJIE>8677>MRHCDDCBAFKKGFGEA@DFCDJJECA>=>>==>>=GRPH@:418>:8CPK=7ERURQTTQKGDBDEDCB@ABB>=@BACGGFFD@>:56:<;<@ED@<;;A?4./8=BFIKJEA@<9BB@>;:=?ABBA?=<==<<<;;6863:DB?=?C:7A<.,31,09EQ\`P=;<=>???@@@@AABBBCBBB@?A?:89867899@@;73331-+,.3650-010016>?>?BA>:66679:977766889;???==?A@=;:8658<=;:98777::611242./1.,,,*+//,-12550-*)*01233566647755333499;>=<9;8;AB?<8;HMJIT]`bL.-06;;:966/*))+,**.:D>?BLD435478BZicIDK?2+)+/531VVDekcP>9;AKK>:8/3FKHQXYbhZMDCBDFJONJJONFA<8?=5013007><:9350Dh`RRMU[aly}b@17MfIJO]jnqsux|ydMGFFEDDDGJJJJJIHGGHHHHIIIIHIHHHIIIJJJJIJKLNOPONOPQOOOOPQTVXYZYYVPIDCDEDBBCDFJOVY\`deddefffghhfdehgdcb`]ZWQIDBBB@@@AAABBAAA@AA@@ABAA@BCCEEBBBB@@@@AABBCGLQQQRQRRMLMPSTVTME?>???@@ACDDDHOTUW[elmhb]SQTRQMHOSPPRRTTTVWYZXYfolg\LGIFL_ijbVQQPPRTVX[_^[ZXWUVZ\\ZY^ed`hpppk_WXZV[big[_jb[WTPKK{mbr}}c_[[`VISYXVWXZTPi^b`bbcUOHDH]dg[Wbqnx~~qwm`OIJWirr]FMjv^]_^_paRTSRQMFFJLKLMMKJIIJJKLQUPX]^`WQNMMMMLLLLLHGHYwSVVUZqYABJGDDCACMOIIGDBEFFGHKLJHHPZQA<@IW_TD@A?>==>>:DW[RLHB@>DRO[d^ZJ==<:<<====>?@B@@A?<9>HC929?@A<8:<>BB:778989>/;koF@ABDDDCEIID@99=AEKA;=======>>==<8CU[]_accccccdcc`THDDB@><<=???DHIP`fT>:@CA@@?>>=76G[YOM\dWLNSVXWQIFHFBFNW]bb^UOLMNHETq{^D;??>@DFEA=?M^bRFCCCAESH>@A?>>@BCEHNQNKKR]iv~fXWRLKLMLKIIJJLPPMLNOMLKKLMQHUȼ˹î}~pt}cY_ggb`c[NMS\`a``a`\WRPMMIECBA=987Qjy{rieeehjkhcdYX`]Y]_\N?@MQMD>DPRKHQYOHPSTTTUQKLOOQQQPNLKKJKLNQSSRSRRRSUVWXYZ[YXUQMMNNOPTXZZ[Z\`c_ZXXX]``a`]Y]gabP@8?@@8?_lJ;ItL4GTY]]VRI@:886689;?A?76=?97;ELLKIIIIDBSaWNgO864;Zrw{zjdaadhlUABJKFKQRONOMJ=9AGGDBBADJD==>HF5378:=?F=36>LrYH@@CIKLEFHHEC>>BDJNNPRSSL:7I[TE@BDDHKLPPOPW`gb]WB14<;;;>>>@BB?9656:<=?>::;87;>;78;86>DFKL>32477543334579:;;<;;;9748AB><<;98:?EGEEDCDILKKLIB<;=BIOOKIIFDB@DKLHHKJFABCBDMURJEB@AA@@??>GURE?>6.3>@??@;559>>ELOQUVRNJGCAEHECEEEDCBBCC?BIIFDCB=6148989CJGA<76;<4+0;@EILMPJ?9648;8964=EC@<<<1/7:85760.028H^dR?;<=????@@@@AABBCBCCCBAA>:63247<@CFF?;9;<844442/,,-/10./.148:<=@CA=89;><4--,.00.,,+*)*18?FGB>=:77789636::989;>BBA?ACFC<<=956985554312578500152../-,*)(-01,-1461*'+-++,--1444565676457:;<=<:9:>COXVQHAB?80+-152C|Vf~o\E9=NK940+6GIFN\^_fcUD?=?@FLNLLPPKHC<=DHHC7242..269;=<84565556621/4>@@@@@@?BFFDEFKTajffpuk[TSQJAHNMOPNPRSUVWVVYchmwxlZKDHRettfVRSRTUVX[cgb\YXUbqi\ZYVTUZedjrnb[^``c_`kiii[TQPMNNmep~|jZQdRHUYXXWX[XTky_ebbfeRHEDBHUk]abZpygou^RPMHFO`fTHJPbz`\[_c{`PUSOKJHHJLKKJIIIIGFFGGKLHMRW_ZTPNONNNNMLNPPKFJORTUW^u[ACHGGFFFFOMGGHKLIGJMLKFDIDFWTC;<=BKE@@?>=<<<=;FTTIA@?@@ESIDKHEA=;::>?@?>>>=?@ABCB?;=<985=?>>:89:>=>;5@SNFAABCDB;79AD>;:?PZ@:ES][PHR[ZbmmYGGT]VNJHP_VA8656;ALZgdVQRPQPOPPOOOOOPRQQTTTUUUVVVVUTSSSVZ[[[\_ZMC?>=>??><<<<;<>>>=;9?OZ\_aaddcccccccYLFEFB=;9:>@?>@CEISYP>=ANXZUVTOOR[\ZVLDDB:8CPTY\__]TJIJGEC]u|tWD<>LYQFHHC@???=?BCB?:459=?AGORPKFN\YQ^w|t@1758RouoYLUVajinOIPHMCK\ddefghZG:>@;::<@GGA?9?B8;@><<@B>78=CR|tTF@@BEJMD><>AE@>AEIJJNRTRG:8EKIEBABEIFHTVLMTVXX]ZD6>HE;9=ADEEEDEGHHC=<:89;<>=;87987:=><9776556:AGIHCAIJFHJLLLMNNMGDCAA?=>=;<:7778::9766767<956973:DGJUT?/3788654334678<=<;::98659<=><::9?LLID@@@?@EHGFD?=@EHJKNOKJJFB>@GJIHKKID>>BCENQJDDCAAAABB>ERM@<@<219@A@>;9::=BHGENZVLIHEBBGJHEGIGBCEGGD;>IJE@@@;668;:86?GF@<74583+1=ADHIJMI>8:??=AD?929FIILLKIE=8;AEIA49@@BCB?AB?<=>=<:9645????@@@@AAAABBBDCA?@><86437;>><978:<9655441//01100,-2302;BBABBA>;EPD1+..//.-,,+,.06>?==CE<31147757::87:?BA><;<==<=@>85784258753576434453/-/./.+((.1/,,0362+(-2.))-/4433579::::=<;=?<88;@GQ\``^\UOKA@QR;12;<16;43?F@;80+/+-/**.D@1?R=-9C>AF@JQEBFIMK@71/22:`rv{~|gMFPF6468@HJILXcenrZA=;<=>?AABJRH957>IMH=559<<70.16;??=;99:51/,)--4Wb]TRI>:QpzO;:2(W\dbbgnvttvuwxmYMGFGKMNMNNLJHHHHHIIIIJKKJJJJJJIJJJJJLKKJIIKMLLMMMMNOOPOMLLMOQQPONLHCA??>=>BMW[ZYZ\beegikiecfigdecdhid_[VQMGBADCB@@@@A@@@@???@AAA@ABBBCDCCCCBABDFFGIMOQSTSTVUVVMCEIINSVRG>?A@@@?>@BBAACFHRdnosvvoe]WJ?CHJLLKOQSTUUWZZYaqxy{thVIHSitrcSPSTUVXZaih^XVSbcZWTRNSdow|whbjlini`o~ziZSLIHFJmgn{{xoVfPHUXYYXY[ZVn|_iddiePCDDEAJr{SYZVjqtdOmiZPQQONJGIKIILEFkxbY[\gaMOQPOKIIJKJKKJIHIIFECDHHEHIL]`ZTRRPOONOMMLMMNKLOPSS\wYAFJIHGIHLVMEGGHIHGKQQIABECBMJ@<<;;>>>>>==<<;=>CKF>:=>>@@MN>>D=<<;;;>@AA@@>??@BBCA?==:87:>@>>;9;==@DCBDCAA@>>>:?DC@?BCDC;47DHB@>GcdECV_[NHLTZZaooZNQWZURSRU_YI>858>DO]db[URPPPOOOMNOONPPPPRTTUVVVVVVUTTSQTZ[[[[^\LA==>>?>><<<<<<<=?>8;IV\_`abdcccccce`PCBEFD@=;>HXmuT?<@GNJFHIEBA@>?@BBA@:?MZ]ZQLKLJFCBA@@??ABBBAEKKJHJQU\jrw{jVRQLKKKLORRNJJJIJMMMMKIHIIEr·ǿʷrgbalslzVNbkgab_]`aaa]^_^\VPONLIGDC@=<99]xdxw}vnomf\WROLHDK^g_JDJ[`XWZWLEEEEC@>DHEFLVZUQX\SHHMLIJMOOMJHHIIJKMPRQPSRPUVWY[ZZZZZ[ZYTNNLMOOSVZ[\^```\YWVVZ_`bdd_U\f]dXJ=99<=>@@@?:3:;EHGB:;=:97655766663;XjQ835555=KUTNHGR]^bmlnk=387=LWOF=58889>EF?:75678863477688767756?FHR^T;5899999732568=?;:999:::989;9>>:?B;349>@ABBA@@AEFDKXRB@BAACHJKJHHFBCGIJE;=GID>;<@><<=<95:BEB>95452.6ACABDGH?78AIHDCEGA89CFFHIDAGG=>:62/..148?B@:85456CVQ>99:;<>????AA@@AA@ABCDDDB>>>>:4/13556777887544242201120/,-01.3CKA?@BD?7@OO=.-//----,+++-6;456789988?FA737888:<=<<:865576764330034-).41..12441.030)+/3544446<@==AC?;;;879>DR]\\]afj^TPE;5.147;=:53@LLA:81,.-15.+*@C1AR:-8B:=GA<7:GLMPPJ=1,/344?c~ePK=::=@EHKLLQZaov\C?=:741379DPK;12ARPGA=869;3,.16>BB@>;:95/,.-0+(DhgWX>/)4Tm|L9=:8QU\`gossrtutuxxsdTIHLMLNPOMJHHHHIIIIJLLKKLLLKKKKKLLLJFEFFGKKKKKKLLLKJIHGIJJKOQQPPOIDB@@@??ENPOSW[dgffjmia`efefgghhijkf`[YXRFACBBBA@@???@?????@@@AAAABBCCCCCBBAEIIGFFHLPRTVXWX[WKBCHMRVXTF>AA@@@?@A@@?BDBGUjrqrttrni[JBCGIIGIOQRRTUXXVXeliikrm[T[irtp`RPRSVYZ[bd_ZXTYrzcXTUQQe~l^npjx}ow~aUPLHFFNkcqgxaMN[XYYXY[ZVs_kkmmgOADEEBMvyPQX`ktwtqootlTJMNNPRRQQNLKIKKLIJmweZX\g_NQQQOLJJJJJJKIIGHLLGDEGGEHGFVb`\WSRPNNONMLKLMPNLJMLXyR@HJJHHHGJVMEHGDCCDIOMF?@AA?DA==>A@>=>>>=;<;;<>@B@;:==;??FQCAF@::<;;>@AA@AAA@?@@@?=<<;88;???=::;<===AFJFBB@>===>?AAABCDC?98GLFFFOdmPF\`TQTXZ`][c[OGJT\[XWXZ^]XJ859@IU^\^_WRONNNNMMMNONNOOOQRRTVVVUVVUUTTRTXZZ[Z]]L=<=>>=>><<<<;;;CE<;DJD@DD@CKPMHIORR^nh[UF@HNRUNKLLMGCBA@BDDA@@BCEGGGFHILVeknnZPTSMLLLLMMNKIJKKMOLLLKJJIWĽzj^`dfY\fgj]Mbf`fkjeYU`b^]]_]SMMLJHFDB?<;5Fseovrw|}ohhc]YVTNJIFLW`UD=GVTKOWYPFEDDBA?FOSU[]YTTYXQLKLLIJJMMIGFGIKMNORRRRTTRUVWXYYYYYZ[ZVRNNLNQSWXY[^^```]YTTX[_`bec^X]d[`ZH99===;8;@9<<=>GEB<99=:976577439=AP_P8/2456;HTTPKC@HZkui[hvF46;LQMOg}wI:LDQa]UTS_rg@27989AF?:Qq|S;Ni_H<78;BC=PXXRNHCB<47EE758AD???@CHKNROF<88:BJH<35?LPRXaiqtreQJLD87@D@==ADFEECCGID>=<:<>=<=@CEDCB;4356534458;:9;<:;?@BFGFFEDCCBCIMNNGA@BA@?=;7657::512686367645535=??=>>>>?EF@BECA??DHIIKLJF@?@B@==AJOKB>?>?@?=>?<:?EC;788:==>???@CGFINH?=>?ADGHJMKFD@@CEEB==BFC?;;BD====968>CD?976644;BB@?@CC84:AGIG@?FHD@BDCA@>BHHB?BGF?=FF@=;>A<8789:9861-/7=<4/22/.037=BB?><978<@;4578;;<>>?AAA@@@@@ABCDDDCA@>:510114:423456644424331100/.../015?B77>CA<;=>B>0+.-...-,*)),7=;<><:87656788877777;=:5668863>JF71:@?>>=?@A:65569:9:;:7369=4.39722212454551..122234357:F90?GEIVYRJ;-,/6=06]|oj^KG;400365AMMJGCLZSEA@6135.+/16?A>=<::76329=4)-6POLP9/.,4Oo{K8;<@RWckomkkqvvttsuzufTLIHGLPNLJHGHIIIJKMMLLMMNNNMLLMMLIFDDEIKKJJKKJJJIIIGGHIHGHIIGHJIEDB@@@?@CDDJU`gifeikf]Y_c_`gighjkkllhe_YVRKCCCBA@>>>>>==>=>??@@@A@@@AAAAA@A@BDDCBA@DPSSXZVWXWVNHKPRRV[SFA@A@@@??@@?BBABGVc`\bghkolYEABDFEDHIJKLNQRSSVWXWX]a]]forstq`ONSWZ\\^acdb`YUrw[TTSQ`zqejZO``\v}|mTQPNLJOTi`xb]PQ_YY[YYYYU|`kqtsiNACEDAU}wPT_eheefe`_[ZXSRTTSSSRQONNNMMNJIq{eXW\e|^NSVTJHJJIHGHJIHGFGJGDDEFEIHHKV^a^ZVSNMMMMMMLLLMKIJJXzJ>JKJIHGEFIFDGHIJGFFECAA@@AEE@@?=@@<<=>>=<===>>@AA;:==?CADRE?B@99::;=@AA@@?>>===>=<;;;98;?A?=;9::;::>===<<<;;:>EC;CQWZ^acccccccccc_RB?DFFFFEA>=?@@@???<;9;<=8;<\\3bu^F3;ACEHJQQMHDA;66=>98:;=<:77?FHKJC<:779=DD:39H[c`^\apxqk_OFDB><<=>=@CDCC@BJJA<=<<<>@@@ELNLJG=3255334569<;:;989@DDEDBAA@?<;AGHJJFDHJD@@?;7445:;61157413786444237=GMA25767<>><647;>A?<9899:;<;;:;>?@@<428@C?8>;:>ACBA>:>C>9::988;?BA:67557;????>==LH@?@@GLMLNG@:7;>8778897531124::46><2./2:@ABED@;776424799;<;;=>?A@@@@@@?ABCDDCDCA;40000163/2459:974232100/...-.///.01.0>;9:.'+,-/011.*/8>BFD<88643369972245579;:7557742?KE50;DC?=<<;;87525;=:=>;65:<=758;:531014577543210122234:?>???>;7513425IRRUY_lwwraH71/3513:>?BDGD6032+-8A515+8C1FH.0=<:76:>??D9-/.00;@701/+8N]]B8;==R\ihebeowwvussuxwsfXMGFILLKKIHGHIJKMMMNNNOOOONNMNOKGFFDFJMKJHIJJJJHHIHGGHHGFFFDDFECCBAA@?@?>BN]cc`]ab\RQY]ZY^gjggikkkklmg^SQSNFCCBB>====<<==???@@@@?@@@@@@@@@@@@@@@@?AJMS[]XTRQZ\QKOQPTXXTLA>?>>>@@@AAAAAAEMIFMQTX]_YKA@BDCBDDEFFGIIJKKMOONMMOXhqppqtq^NPVZ\`bcfhhhbWU|eYTSQV`\YYRNOIKgseZTTTTRQRTibz~]c]c^[[\\ZXS}_pswyjM@CDEAYqO\a_feXQ[bccaa^XUUUUUTSPNNNMMNJEohYW\dr_JNUUQLLLJIFEGJIGFEDEDEEEEGHHEFQ^a_[XVRPONMLLLKJJJKKZ~uE@KLJIGEEDBBCEHNURKFCAACA>CMH@GJAA@;<>>>=====>>@B@<:<>@FABUI=??;99;<=>?>><;::;;;<<<<==:89=A@?<:9889;;DPK@DEDBACDEB>;<=>??>?HQQPSUYa^UV]XZ_ba^]^^\PB:3?U^^``[^[E36=COYa_NISRNMMLLLMMLLNNOOOPPPRTTTUUVVUUUTTWYYZZ[_RA=>AAAA?=<<<8:KNCCMUY^acccccccccccZLEDEGFEB><::<>@A?=;;:>B@BLKGHIK[pvmb`^WQRY\SNPRcqcWWH;8:;BO[\Z`ddVCFMGDGLJEAGNRNF@??>>ABBCCCDFHFGGHJILWfd[\]PGHIMZdXD?BBBBCCDEFP`ji[LLTVOIKMNKGEGIKLMOSJCCGgn^onjb^`^Z\gkgacpwn__cZapjZUSU^_UNKIGDC@=<7Mkgpstyurnlie`\VSQQQNKIFHKPKIIDBCFHJNLEDCCCCACFLPUXSOQTX]\UGEHHGGFDDFIMOQRSTTTUTTUWWYZZYYYYYXXWSONKMPRUXYYZ\]^[YUQTX\\^`db\ZabZ\]KJIA>::=><:8:84:>CFGECCKRRMHGHGD@?:=_S9=JZ`_`jg]QMOUPTiiQ@EHCGQRMMXbS86;;9:?B>[nOuN;@J@HNXULFB=86566799:<>>=?FGGHE>889999>@85BV`hnme\`msodQ?;BHB=?@=AEFEEEGLJ?;<=@@@?@?CKLIJF;346533568:>?=::99=EJJHECBCD@>FLJEBFJJIEBEE=75558<956532138:866520246887679<=>?A?99=@@?=;8878;=;::;;69DF;467689;=>?@BA7.1?@=:?IKD><<;<;9888;?CDA=:87778406AMLFDEDCA@>==AGLLGJH905CC;9?BAA@<79A?5777889;@C?;;968;=>>>><;BJHGHGDA?==@KJ>;74FPB8:=?FKQOLGA@:898888899889=@@<76=C@70.5BDACGF?;8887437:;==;:;>?@@@@@@@?ABCDCCDCA?:5111100359:6530......--//.,+,,,19<99((+*),.@C9>CFHF>88742/17;;5,/46558;97545643=D>207<><9753136526<;9;=:43575588654111125767742336322228?@?@AA>>@>;64:F@>FUev~mI73333//;@>ACD@2,27407C?@@??D3JI/0C^Z=,+-4GKRef^S?-+49CMSpUFRUNEBBEIHGHKMKCOYQQD:@@?=83368;CGFQ[XVM4&*,-3336633>??CLRSRQQTPHIV[TQWaefffhkkkllllkcSOSOECGFA=<===<===>?@@@@?@@@@@@@@@??@@@@ABBCISWWYSKQ]`XQLJOTTRTWK>=?@@@@@@AAACBDFEEFFHJKMOLEAABCCCCCDDEFEEEFJMMLMMNR_mttsrtoXNUVY_``adfhii[\fXSRRU_hkjf\NM]rycQU]\YWUSRTheyݳcbysha\[]]YXRx`yx{}mOADFFB^iO]XV^^NIZgmmhefg_\\\[WSQPNNOOMKErl[W\bq_FEOVUQNMKJHFEJLHHGDDCFGGFEGHHEM_\\a_\ZTRPNMNNMKJLML\rFBKLKIGEDDBBBBEKPQLFCAABCCFJHHLQQLHHE>===<====>?@?>=>>>B@@QM?>?;9;=>=>><==;98::::;;>@BCIPSSUWXYXTKLZXPU\\\_b_]XPIA>HSUVTRYS>48=GTVSJ=BSSLKKKJIJJLLMMMONOPPRTTTUUVUVUUUTVYZ\[[^WD<=@CEC><;;;6;JCCLTZ^_bccccccccccbSGGGGFDA;78:::=@@BB>:59DD@HLKGBGV]WVXX^\SMJJKJKL]kXLTJ9379AKX_YVbeRHKKFEIIFDBDEEDE@;=??CFHJGDCDEDIRTPMRaidXUSPLOKDJY[NB@ABBBABGMR[__XROSVRLPUSNJPPONKNKGFLcǹ~nmupmke`YWW_bUTevzjUNTYUcmYKIGMW_^WLHED@@:8=^ijlkousrrqqg\WSMJIGFHHEDGMLLLGEFGHGFGEDCBBBAA=:=GSROPSW]_`PFFHFEDDEGKNPQRSSUUUTTUWYYYZYXXXXXYXSOPOOQQQUWY[]^]XUSRUZ\\_`ca]Zaa[Z^MIG@<;<>?<:69?DHGHDAA?;8877:BIHC:969DHKKKIHHMPPOOMJHC?=GJQMJF?:76744577:>BBCHKIGFDB;;@AABC?5:LTXbjmiYOYkuhL61>HC?AA>BJMMOOONJA;:>DGD?=<>AA@B@9555433456;@>;::989AJJFEDC@?BGJJNH@HOIFFEGE<89869@A>;621148::86531594.5DEB=>?@?@A><=>>@A;877:<<;;::;859<;:8678;<>??@B<44:>???@FKE@ABEHJKNSTQMGEEC@?>62=HGA?><::89<<<>@?<:97678877=BHID@AA@?==;:;?B@>IWOADPQH??BAA@;57@?46667789>CCBED=;=>???@??GNMNNJBA@;;?KH;67:9;?@@@@@@@@@ABCCCCBAA@;45886137;?BB><:830--.00.-.00-+--,,187338>>9IP6,0/-,0CKB;>IE8367668:;;;72/266569<:8755545972/011441/...023437::<;820//2597223330//368:83369;334206=>>@A=7:FMMLILME@DI[ltqF3353-+3??<@B@9++8EB6/;HLMIDC6JJ0.:LWH+0306?@@@@@@@@@@@@???@@@@ABBBFMQQRPQX[\_\LEMTTQQWWI=?BA@@@@@BBDEEFHHHIIHIJLKHFDBACDDCCCCDDCEFHJKLPSRQRYdkrpnsjWTVVWVW_cejjkfZoVQUTV\itspfWV\dfZS\b_ZVUSRVfg~\eurod^ZYVPWV~iiOGIJJHhdQVMTTPS]ekpka]cotohb^YQOOONOOMLDzl\Y[bs^ECGPUTQPMKIGGJMKKJGFFFGGGGGIJJP\RQeha_YVTSSQPPNLLML]lDELKKJHFFDDBCDFFEHJFCBBBBCDDCC?>LLHPK?=>>=>>????@@@@A@????MN@;@=7;AA??@@@?=<<<<;::;<=?BCB@@??<:988765@F>6469:ENUSQSZ`_\[\RFJRKFNQF77:ABFHB=9:BDBEHGDDKTTU`if[X]_YMIHJFNWMGNF98:7CRUWVKUXLJKJHFGGFEDC?=>B@;=BACKTYTHAABBEQWSPXbd^VRONSXSE>CMPHB@@@@@BHQTUUSTRQSVUTTVTPRRVVQG?@@@BILMKGFFFFEDCDCCBBB@?=:8:HRQONQTVXSGDDCDCCEHLNPRRRSUVUTTVWYYYYXXXXXXXVRPRTRSUSTWYZ]_[VQQTX\]^aab_[Y_`]XWMGG@=<=>?;889BFEEFB>>=;98879=>=;865?MKC??BJNPPQRRMC<>CDCDEUJXaYMHLTOZhlc__f^T\ikV@>II<7@IMIGFCAEGHECeqMA>C@IBFF?769868777:=>>@CEFFEDCADIKLOMB9BQSSUVY\[SHTidG00BH=:ABAIPRSUTROLD<;?DECA=;9998998754344425:<:999878>C?:=B@87=JLHOL@BFA?BDGA::::9=FHE@8311457975532:B=15JLG>=;:;=?><<<=@A8259=:67;>=;;<<;:87759BFFNWXUPHEGDA>?;5;HHB@><9988<=;<=:88865558:<=>??=;;;<;;99989:34@V\OORTRG?@BBB?;:@A88765667>BIC968<:66537:48HPKECEDC@>9648=><;:=GG<54334425AHGC@>;::879;;:99;>BB=88;8::9217;@DB?=950.--/100/120-,..++197/03477;B=6=D>45=E6+;G7.6868:>AB>:757776779;;97655441-,.///---..020154-/8<=82////29<9766631//13465348:<5563037:;<:528DKPWTUW[]YBOWNywE0692*,8=>>?@>1)6MWK8-0BMMKEB:GC0-,,AR7/78,&Gkkc_TJFEFKA85?LFDQUUG8:<;;::954687.%)>RWL7*.1461.,(+49>>@;=B?:8842693--26568>???@@@@@@@@@???????@@ABDGJKIOZ\ZZ_`VOORSUUTZXG=@BAABABCCCCCEGHJKKKJKJIIHHGCBBCCCCCCCCEFFHJKOSSUUTUXbkoqrg[\UNQUY]`fghjfe[NQTUV\ijdUILV]^ZXad\VUUUSVdhzaddc_qna[VPJXYoiQLMOQRl`NOOWTPXfoqph_[_iuzpYUTMIMONNNLJA~l][Zbu\HFGJQXSPNKHIHGKONLJJIIGFDJJIKOQROLZgea_^[ZWTPOOMMNN`iCELKKJHFEECEGJJHFGHFDDCCABCB?@;:CBAGF@>>????@@@AAAACCA>>??IQEDF>8=AAABCCBB@???=<;:=@BBDEA=<>?=;:98874;B<:<:889:AGGCGND=BCHQXVTTVXXUQFDNICGRXRE:BU\\`d]QT[XUTK<59<=H[cmr^GAHKJHGGGHIIJKKMMMNNOQTTUUUVVWXWXVUTW^^]\\[RJ@99:;<<==DC>JUY\^_`bccccddcbaaRBCIJJHB<@B=99=ACDHIFFE<9@CCDEGIIUafgkqeWY^]UOLJAFOMGGA8=?>@??@CBBJYa[LBAA@@GMMQ[aYLQYTRVZWNB=7:8b^W^fmtaQSTTUQRXM<8:=??=<;<>AEFC@@@@BA>>>??@B?=<<:9CQPLHGGIHIECAABBDFJLNPRRSTUTTTSWXXXYZXWVWXXXURRQSSTXZXWXXY\ZURQTY]a`cb`\ZZ_^[XUOIJC><=>=;8:;A@ABC=<>;9876546999:::DNND>=@GOPQSVZXMGFGHLJKYPcfTA=NXR[d`\]dok^XTPJ@BI?41:RWMEDEDFEEB:Fnw}O?>=9D@DGB<;<::;9888889;::ADEECDFIJMPPLGIMOPOOPT^]QKNRD12IM:5@BDLQRRRRPNKB;;=<;=AA<77555676534767:<<778668:>=8535=?=99@FHHB=>?==@CFA;;=>@FJJGB8421335665533:B@76@CB@>648;=>=<;;AB7148;@F?78:;;:=A?:54:@DC?==;66;<<>@@@?=98887678;DOUUQJGD?==@@>?DD@>;778769<<;;:9887668;<==<;9899:::;;;<=?A?CMY\WTQPNF==@CCA@=?A=;975547<@CIOOJFGIJFCA?>AC>=CIC9;=@CGA:8975788:?=56BLIEFHHHE@956@@@@@A@@?@BBBBBBCCA@<743117=CECA=61..011101252.----++/56100..0//03EVQ?:;<+-EG8587898;=>=<:899;;;;:9:::85551./000110123233/282**166/)+1234<=;;;9754222000234679656301468767:=BDC;L\\bdaXVO2ZxA18<4,2979><<9-1H_`I83,/4GJA?<>A;:;85JLU_ipwywussuvtpmkgb^ZWUVTQNLLKJJIIIJIIJLNORW[_`acaZQLHFEEDACHLKFEFFECDDEEFFGIGFGGFFEEEDB@@?@CFHJKJEBDGGFFEGQWTOS_cbdgiic_^`\TPNLJHGFC?==<;<==>???@@@@@@A@@@AA@@???@@AABFEDFKPQTZ\]ccXPRUVVX\WH>>ABBABCCBBCEGHHIKLKJJIIIJLKIFBBABCDDDEEEFGIMPQT[ab``gooqrg\TOPQQRU^gjjjfmreXLNUUV_aWHCHRX[YWaf^YXWVRXbf|_Ydfb[Vxuc^YRIZ\o~rXLLOQSlWFKSVVTVesuumefiddomTPPNJKMMMMKI@m]ZYbv[JKIKORRQOMIIIJNSOLMNKKOTNGKJIRUTWTNYhgbb`_\TPPPNMMOchDFLKJJHFEDEFHJKIHHHHFEECBBBA??<??@?????@AABBBCDD@>=@?CUY[YH<<>?BDDDEEDB@@@>><9;>=<99:999:<@AFJB;>DGGHEBFLEDEACJPQQOQSTQOIDN_XVbg^J99@FQZ\[\^_[SI=68<>ABJTX\^^_acccccddba_\OGFGIIIGDCB@?>BFEFIJJMI=9@BBCDGD=NccWYu|bMLJGDC@ENOH?76>>BTL:BWJ9CLKGEDDHIGGIGE???ABBEHEEMVTIB@@==@DFMYYI><;:;<=@?<;:;==:9998;=??=;:>JQLHEDCCBAABAABDFHKMOQRSSSTSSTUWXXYYZXVUUVXZWTRQRSTVZYWWWXXZURQTY]a`cd_[X\_^ZYZXNIC=;=?>98<;<:;=;;A>9765666=><;:988;<99=CEFEEDDEGKRUTJ>>ISWZ[`dcXJA<55DF86@CCFLNMMNMH@869:779;<744543454334:><:;==?A<989;=>?>=GM@568:?B>976898;><946AGC>>><::;<:8?INNMLKIGDB=6457??>??<9347879<=;::99899:<==>=8668:;;:::;=>AJPKKW^YUWSNHB>>ADDBA>>@=<:85547;>AHNOLHINNKDA>:::435<>:9=?BF?99:7579:<><99>BCFLLKKD>;;BLTQHJNJ@41555433:CHIHFA;769;;>??;87779<=879<>?@@@AA@@@@BBBCCCCBB?:64347=EHGD=4/.0232203672./0/-,-/12100///.//1>U_P@?8*0IPE926;:64689;:889=?><;9;<<977532454369;;9520--23.++*-.+)+0149=<;;=;8866520155445656652/1457559@A@@8)O]]^clmiM1Df^819>8169425533/6I\^D884.27=>?=EA3.010333/.09EOPTbislLAIC8>P<4..2555786/-07;830-IMXeouwwwtoosvrmifd_UUVXZ\XPLKKJJHFFGFFHJKLNSY]^][ZXTNIFEECDDFFFDCDECBCDDEDDEHHGGGGGGFFECAA@@DFIIFC?>AEHHFDEHJKJKPRSUX[\QFIMIEHJKJIIHE@=<<:;<<=>???@@@@AAA@AAA@@@@@A@@@ABCDDA@AKWZ^hmd[XVVXX[_YI@?DB@BCCBDEEGGGGJLKJKJHIKKMMLGC@ACEDCDDDFFHKLNQT\dhiijlosrfUQQNLLOYafghjigicTMRVTVXSMQVSQTUT^feb_XVOWbe|z\\de^[Xvd`^SI\bkmyvZJMMLSpfUXRQSTUdv}zrlmogffa^XNKNMMMMMKIAo_YZcu\OPMMNOOPNNKIKTYTNLNQLJZilQLOMPWY^^OL_g_XZ]]ZWURONLQgeGGMJJIHFFEGHIKMLIGGIHGGEDBBA?=<>DEA???@@@???@ABCCCEEDA?ABBEFFFB@@@?>=;;EQTL@;<=;867999:>??BJME?AGIECBADHFED@>@CGIJNRTQMHFO`ZWdqjVLG@=FR[\]]YOEB=8::;DRVY]^_`acdddccdba]TLNKFDDHPQG@BGGFGGGILOMD@BCAABDD>9DXWCDa`?=<;:;@@ACDEGILNMLKKLOV[Yaxurw~{zvosszͼgc{tnifacouqpsqh_YUOIIHHGGHGHIGECEEA=::>;:>JPJFDCCCA@?@BCDEHKKOPQSSRRTUTTWWXZ[ZZYXUTSUWWURRRSSSVWWWXYXXUPRVY]__ba^[Z\^^[VPJ?:<;;=?>=<==<:::8CF<766667=ADD9:MNDHML[XQNONOPMJLJLJALLA::LWH>??QVUXM=?JZa`beaZMENL74=97668?EDD@86760?`\FA=>@CBBFIIKKE?@@>=<;:9;<>@@BFHGFFFFHKSXUE47JVZ_cccegZ@358878>CFDDGILIHF>5138;98940.058512321249@EHB757;=?BC?855445457:8;KQGGOMGFFEDB@??BEGGKLB73457:;62114:===>>=;<@EF?989;>ACEOP>5:?><=BDA<989<>???@GIC?;;==;<<97>><:::;<==>><9548;;;<<<;999::;;<<>>71037:::999:<>BLRKDLVRNQWNDBDDCDED?=??=<975458<><>IOHBELMMD??>>A@:45;::=?@A:6:=<;::;;==>==@AFKMOG?><@FR_aYVRD637655334:CIKIFA9459<=>BB;6555546779;==>??@?@@AAABBBCCCCCCB@=979>EJID<2053223445762/2443//111011256647<=GUOD;7.3HND63:=976668::998:<;7567776862134357<>;830.-+..--.-+,.241.-4<<<;;>;::99721276435667863/2445437==<7.;SEUadlqtU9:3783010///0;IP>9;<96555647:7.+...3>B>37A?7;[pxnQDBD?9UE9L<1>82>>88:<<81;HFFPONRP@70)'*,16624<@?=?<3-0577668978==7221/.022232/4<=70.02547=>700249;976LQajkifkuulinpmkhe`ZTTXXVUXWROMKJHFFFFFFGHHILOPPONNPRNJFCCCDDDDDCCDEDDDDDDCCCFHGGHHGGFFEDCDDDGGHGDB@BDFEDDCCCEGGHIKMOPRTOB;>AEGIJJJKKHC?<;;;;;<=>>>?@@@@AAABBBAA@@@?>?AA@ADC?;:CQ]eiigfc\XXXZ]_YJ=AC@BBBBCDDEFIGGHJKLKIIJIIKMOLECECCBCCDFFGIJLOPRV\afhkllnobROMMKOUV[]biljhig\TSVUUVY^aUNSUU\dg_\XWPUdezv^WV^\ZWwfb\NJ^d{ehtzuXJMRUctvdiSTVXXbvytokkksjT]VNJMNLLLLJIBp`XZctaTSNKKLMNNMKJL[aSMLNQJIhswl\WWQUY]]SJOWUJGMQZZYTSRPUjbHHLKJIHFFFHIKNPQTSNLMKIGEDDB?=<>BFCAA@@@?>?@@ABCDEGGFDA=ADDSblnjZE=>??ADEFGDAB@?>=<:=HSRJC=98888889:=?>@CBA??@BEIMHEG@<==??@CGHKTWTKIIKXSNYjj[UTTQLNY\YXQLJI=6?HFBEO_W?>DDLVODCECDFGHHIKMMLMOQSTUUVWWWY[ZXVTRW]\^^J@BDC>EPX]NBA?=>>=DHIF?DFFINRUXWVVWSKHIGBEMV\ZYYK=;ABCFJPTOHC??A@=;>A@@?>??>?HROCBEIHDBCDCDBBDEGHGFKKKKKLRYXTezouwxzyvpffY^`cfecmvtpj]UTTPMIHGEEFGFHHGEB@@@?;7UaWbflry{qhjg_TPWTONIGGDAB@;9=?>><:<<;;<;:9:97425868=HNIDBBAB@>>@BCDFILMPPQSTSRSUVVXYZ[\\\[ZVTRSTUUTRQRRTUUVVXYYVSOSY[]^_a^]ZZ\]]ZS@0*-445668;>>?>>>@CLC:886678@ACD7EtX>ENKVUUSRIKMLJLGIC?IE16359<@>?PVQLE@DM_ede\N=:HVK96=:7667;BCD=637<79Ou@:<<><;:;=>ACCGIJIJIIHGQUK<7FVWW[debbigH7:;78;;?CBBEIKHC=63115;:983.6>B8422222349??>;657;>?@@<96525:837<9=HLC@?=;;===?DB>AGHHIH?52458:<733017<==><979ADHID:68;?EIMH42ALB;?FKMH?<>@BFGHJHHD@:9>@<<=;:98AHGDFDDHKMMLKGDDDD=868989::=@@><;;979=>===;99::;=><<=<61/16:::8889;E@?DFBBDDB>=?@>==;5369=>=:AHMKA;:;=AHE:9=<;=>>>97=AA>999:;<==>@?@EJLC<;99?M]ge_WF58DA95346;BHJIF@847;;;=@B>;874422479:<<<>?@?@@@@ABBBCCCCCBBB@=:>==<<=<<;63343245310000/3873//,+-/.,///.0234851/5;<<==>>==;;;612444136:::8504632237754--LG-BONPewaA99204:=8057410//11/4;NJ&$,1554549@@A?70AICOUUVMIDE@3,-056426?E@;><403653346989<:720/.-.0320.-2772/-/2549BD:0.59;=?@>KOY\ZWT[ovjbehffd_YUUWXUNKRVUROMKIHHGGGFFFEFFEEGHIJMONMIFEEEDDDCBBDDDFFEDCBADFGGGEFGFHHFFEGIIIHHGECABDECBBAABCFFFJOPOPQQUOA;=?CGHIJKNLD><;;;;:;<=>>?@@@@ABBBCBABAAAA@??AABBBA>:=K\a^`cfkcWUY[YX[YI<>?BBBBCCDEEFGOQOJIJJJIGGHIMNOMHAABCCDFGGHIKNMMRX^dhkjjlok[QOMLORPQTX_dfhmpmaY\UPX^^^XOTWWZ_^ZWXWVUfetXVUZZZX{h_QHN`dgpv{qWHMR`rthVca^Z\Z`t{wtnoqwuaFJJGTXMKLLKIHExaWY]qdXUHCEILMMMMJN]bSKMONFJsvhondaZUX]ZTNKKJE>>CMUZWUTTXlaIILKJIHGFGHIJPVX]`[USOIFEEFD@>=>AHCAAA@@@?@@@ABCEGJHHG@>DEFLVcfYLA>>>>ABDEGGEC@?=>CKIJSVPG=:=><:8789;;<<:78;CGR[\NCBDDDFHHIJLMMLMOQSTUVWXXXY[ZYXTRV\\^_RB=ABBCCDDEOUVXY\^^``bccccbbb_\TB9=HSMA@HNIELNGHKKJLNLGDDEDB@BC?>FFBBCJKKKNLE>>>?@>>BA>;=@A?=?ABAACFGECCHKIEBDFIIFEJKJKLLNSbsyi{~w{wry{~ea\YVVWXbgdnytaMGIKKKKIHGGEDEFFFFDBCBA@;@aX]fkr{{olpi^YUWTLPJIIC=>@<:=@@@?==<;;<<;:;;973-/38FNLIDBAA@><>ABCFHKMNPQRSTTSSUWXXZ\]^^^\[YVTUVVUUUSRSUUVWWXXYTRPTZ[^__a^\Z[\]][SG:1--*-/,0:A@@@AAENJ@<=97689ABDC6KsW@BIFIHHIIFEJMNKHFA=B=44506A?AAA<9;@@@CEGID;53458;:977>OPA7443114449@?86779;<===;8755;CD@?<9?GFA>=;;=<<<>A@=AIKIIE=51369996643:;46;<8338BDFNP@36<@DCGG79JSB:AIKMKC?BCFJKJIHGFA::@B?<==;63:?BGGAAINOONLJHIFFE=3256988>BA><=>;769>>>><:::;<>?=;=:74225:::8877:;==8758854124;CC=?A=;;:537;>>=<>:79>FMJ@879=BIIA??=<<=<=?ADA><9889;<<=>@?<?@@@@@BBBBCDCCCBBBBA=>GKG?<;34:6436899831345?B5*+24014105858HN?./00022.-03?K=678>>AGD=6556775210/--.--/./.-,,04/.00.0375355558;;<=>>AA@<==822344126;<;9525620025621.5VB/3675KokH78656:;6.46532015502789=>738BLG;;>?AA:6:98=ABEGIGF?:F_aJB=8<@AG@0)036534=FCA><:JMN\PCL?8AEE?824972379;89>=42674235766:940/00-+-033/--.00//./2335=ED<339868=;IIKMMNPR_kc[Z_ca_\XVVUTRONNOQQOMJHHHGGGFDDDDDDDGIIJKLOMLJHFEFECBBCDEEFFEDCBCABEGHMPKGFFFFEGJJJIHHHDBBBCBBA@@ABDDDIOPNNNORTRI>9=AEHMNPQIB=;;;;::;==>>@@?@ABCCCCBAABCDDAABBBBBA@<6>LLGOW[`\ROTZZYXXXH<@BBBABBBCDDDEHMQQPMLKIIIIILQRLHCBBCCEFFGGIJKKOSX_fjjjjmmhZPNMLJMW[TRVZ^fjjge`YOW_]ZVPSWWY\VXXVVRTggw[\ZWZ\Zi^OJPcewerxmXHLKWhukSTobY\\`pwwxulmyzUBHShsJJKIJJIGzbZXWlgYTGACGLNNLMNRZ\SJKOKCJspWYcekjVWZVTUOHEDDHJLQRVYXWZn_IIKLJIHGFEGHFIXXVVZ[VQLKFFEC@>=?AAABBBBAA????ABCDFIIKMBFMIFLUUH>;>@@?@BBCDGJIE@?@DPXYTRNKJHLLF?;889:::97756;AIRTNI@EE75AIKHGJGFQSQKLKJMPPRTRRRRQOLJGFKPOQTRA?W[IEFJ@?HKIFP^]NDCDDDEGIIJLLMMMOQSTUVWXXXZZZYXURV[\_]XOICA>>BB@>>>?@BBDFECDHLJDCEGJJFDHHIIKQaxfv{z||oy|us}{u}zyghfhfaWPZghp{rTEKNKJJJIGGGEDEFFFECBCBA@9W^Vckpu{ttph_][XSNRLJJD>>><:<>@??A@>=;<<<<<;::4-+159FLHB@???=IQK@A@??>>=?DEINONKI>;AAI>705>;;?OVMHQWXX\]XI;446@GHE@><96657869646;>A@><=@?>>@BFIMOMLJFC<;=EUb`XUTRU]`fi\G@BHF?99==DFE@:56=A>9645332124559BGA6668;;;;<<:859AFHHC@=@EC?><;<==<<<<<FGJQI75?EC=AJKHKF?;AHJMKFACEGJJIIHFFA:;@CA>>;:75:ADJH?=CMOONOMHHHHID@9469::>AA@?==<977:>@BA<999:?@=;;:99769;:987789:;;:88:=<52259>><:854546AFAA?538;=?>>=869=DLG<658<@AAAAA>==<=;98::8655443124779:<==>???@@@ABBBCDCBBBAABA?@HID:7:23:55668=?=86755@@1,3:62251.387?BFD@=:545674115:;;;8443/,-./6:87ES>72.4(>maF67554565-255542369318=<==869GSUF?CCEE@@=;8>CEKQLNOH@>BILLM@=866662133039730../+*,14310/./..//0233128AGA745438;HGGGHLSTVYWUV]aa^][[WUTSRRPMJKKKIHGGFFFEDDEEEFGGHHKKNPOPRPIEDCDEDCCDDCBCACDHOXbfiotfNECBBCEGGGFFHGFDAABBAAB@@ADCDGJLLLKMQSVTI><>AJSTSRQME>;;::9:<=<=?@@@@BCCCCBABAAABDCBCBABA>:69?=9=CIQTQOTY[YWXZXKB@A?ABBABCDEEHLOPOOOMJIIIIIJNNQLDEDCDEEFFEGJILLNU_gijklmogYPLKEQhiZPPTX[^abda^YYZWPMNQRTYYWXYXWMRikx\XUY\]YidXKQdeo^lylYJPOTcxqaVeXSZ^`dknml`\el`bnbѣSEIHIJMKcYVUhk[WKHGILMMLPZ]WUPLLNKEE^[KFP_prYUWNIVVHCEKU[VODRb_V]p]HJLKJHHGFEEEA@HKNOUYVTSUOGC@===@BFIJHEDCA@@@@ABCCDFHKOIOQIAAQS>8;?AABBCDDCFMNKDEEFHKNMLJKNRUUQJB=:<<<<9678:?DKNH<;8AG=?MQSNKKDIZ]LCGIHFCGJNNNPUSHEHGHPUTUWJAAJb`YTSOKJGCCCDCBBCEDCGRUFBCEFFHMQMJGHHP]_O?@d[^hpsvzwpibfe[SRVPMJECFB?<==>=4.,.,/3;@@BCCCC;=AC@:9:=AFDCEJKD@AA@@@@@@@DFLLNUWP=8ESXQ@56306CPRS[\NEFQSSNC98;?=BD;?D9455774656?EA6;DECIJkMB52689;@?@@CC?>?@BDGMSTUTPIA>BO\b_XYUFCRagh\IAAHGB><=87;97====<78;?ADFIG@7146788469@PWH59CDBA>:BHFLPD9>FC=:CRRF=>=BIKLLJEEEFGHGGGGFC=;?DBA?;77=CIJKH?59FMMMSPFDHIKLJD?:;=@ABCB?==>=9549?CC<7669=?=<;;=?>>?;97665788;=@=;=AB=:899<=;7578754>EAB>77:;=?@?@?>;=@F@8768<@76=BBB@?>?CJF=7446666679;;<<66;?>=<:99::>AA@>DNB0/26?=978:;;88:<;51124432468:====>?>?@@@ABBBBCBBBBBBBA?@BB>53423855888?DA<;:77:3/:@?:641-+/6;FG>761-.10//..//-)1320,3CIB@BA8856546731021.,-/-./12236655420.-/120-38647::89;>BCA<8689;;9646:;;<;820.-,,*0:>;WG68626*?_B:640,..04/13320/03<;8;A@>=:95;K\XLILK@=D>97@MQRPKLMHHKKQZ_`SCDNMMcri`O:8>@?BEFHJKQ_P1+0/-247<<57:::9;?AA==;:9976100//25420.-+*,/2312330./14554563.+07963478;>FFGFGLTUTRRUX]`b`_^]\YVSSQOMIGHHHGFEFFFFEEFFFGGGFGHIJKMOPMHCACDDDCCCCA?DNW`dgpxzz{~zeL?>?@BDDDDDDDDDABBBABCA@ABBCDEGIKLOQRSSUQIBAHMOOQRSNE><<;;:;<;@A?AMXL98=;6?OUQRTRSVYZZZ[UKA=@BB@@AFNQRSQQRSQOKJJHIIJLOPOLIEBBCCEEEEEFGHLQV`hkkklnni`QJIXlk[XUYbaZ_b^\\\[VRMILIHRYYYWWWVV[ilqTOPUXXTihUGOddqco{m^T_`br{jf`\TSX_`cgdXVTZYUktqf|^EHGHJMKeXUXln^[SQRSQMMLRekXNOMLLLGAFLRSS]op[TVMFRXKCERbZsFInkU[s[GKLJIGHHGECDB>?ACJSQKKNU[WI=:=>>Q`cXMHGEBAA@@ACDDCDGIKMKFGC;GSD:=?ABCCCDCBFOROIECA>;;?CFGHIKLMKGB@?>==:8:=?ABFF@8:;CHDFKRWSJC?Pc]LC@AEBADCCBCFLHEEMQU[\YUPFBVN>=>>@PZVSZTKGCABBCCBCDGHFGRUJBBCCCJUUKLMLKNXN98EMOJA?BHQ\kyp^Zcc[bha`[JBFIMPPLKT`[TPR[_VMSY[`]PDDECBBBDFEBBDEEFGFFFEGNGCFEWp}{zwsfew}|wyvx}wp{~vmen{wcXPVgrsxmSNTOLKJJJHFFDABDEDC@>@BF<<;868=??==?@A@?>><7000/6=<::9:;=@ADDFILOOPQRSRRQQSUWXXYYZZZZ[[XUVXWUUVWSQTUTY^^XQRW\[YZ_a`[YXXYZ\ZXE0,45/.17;<=?ADFEECABB=88;?GHDBBHLKEBACEDCCCDEDA=@N[aV<5G^b_UH8375GZ^cgV:9NZUQQF97<><;;5?K914569==:=DF@89@B@HIEtr=>=<748>GJJOPLFA@?=<@@>>ADC=;>@@AACKUUUUULDFNYa`YX[I21EV_gbQC@BDEB?>=>CFEDCCCC@<88=>>>>;88:=>@FJIC91369888?HKNTQ>7BKMMG==GHHPL=;BA=887@JNLJIA;>CEEGMJ=;DGECCEGB=?DECBA@?@AA<4137:;:8779;=>=:9=BBA?<97554765:?A?<:8999788;<:;<<<<;;@EEC=9;=;5:DEFCA@CFGA97976532127::::::<==>?><9:<=AEDA@A<:ADA>ACB?><97778889;=?:7555542457<@?===<=>@@@@BBBBBBBBBBBBAAA?=<8411365598:@CA?;9;;4.6BBBB9/*+,/6?IE=83/,-37873.-./-1120.3>EAANO?4475210/00140,-..-046767666632223320-4;7234322455:;87;=<;;<=;:99999932110-*,26>X@4988;/GX468674323210120.++/588:>?><;;0-5Mc`TRRH>D?01?NXUB8BNPQW[_c^XYWF3>BPjI1,7AILNNNMH8,042136:<73:@B@=?FHE@<:::;9865444431/.-+,.1342231/.169<<;:984.,-/1468;;<;?@A@BDDDEDB@@?=<;<=:;AHR]cieN<;==BJJGGEELPSVYYY][QG@ACBBDGJKNRXZYXWRNMLJJJKLLLNQPMGFEDFGJKKKKLLQYagjllmnnqpeZY`gc[[YW_eX^vi_\WVURRPNIFMXZYXWVU]i`inNOQQRRQkcMFNderdr}lffnefyzofga[VV]jutlZQU_bdl`Q\`]aUIGGGIJO}hZV[oob[SPT[]TLOO^lXLMNLJJGAMQR\edjl^TQKHLPMEEVgcZRc^FSuZFKOLIIJJIGEEC@BCCEGJLLMQ\d_M@@CCZllZLIHDAAA@?ACDCCCEGIMR^hj`XZN<;=?BBBAAA?ETYQG?>=<;:<=>>>=<=@ABCDB@>=:9;=>=?CB=8>=?FFGGPTMB9>R^TMNE?PG>FNRXOQYPPcvoaYQEBCCFGGHJLMMNNOQSTUVWXXYZ[ZYXWVUUX[\ZYURTSSUWZZZZ[\\]^__`bcccb`\TRessc^K:;><==>=?GUWTYVI@>?@BCCCCCGHDFLOLEBBBCKUPGGJRSMMC>FMLJGBCHLLSn|z}{jZQTZbg[NPNEBCJONKJVcd^WRUYWNNYdhfUGEFFECDEGGDABCDEEEGGHI?D_q{yxtnsqearvnqooy{ysxvpx{pgovobYVXdrzwgVSSPNLJJJHFGB@BDCDD?<:8668878<>AA@@@?=::::;;:9989:<>@CDFIMNNOOPQRQQQRSVWWXXXXXXYYWVWXWUWTSQRTTSW\[TPRY_ZY[_a^ZWXXY[\XXE3AC5,,2:<>>?AEIGEFII@658>DJFC?=ACCBBBDGFEEFGLOKGRXbeaC3BdfgmdF9SUVakeS<7LacVMGA;8667897AJ91456=HIECFEBBBBABB@>Cq\JRQI99ABKMHKLI@979;?A@?@AA:8<@@>=;:BQTKMSE:ERY[YYXR60?HGM`h[JB?ACDABCFGGGFDDCDF@:9;AD<358435423347:87?@>;:;::;<@GJHC93379769EMLLNPD8>EJONKGKLHGC::>>?<<@CA==?A>88?C@>>>?@A?<96664479;<;;<>:426>B?9:::9755336998840135568:9:??;::;==@CA;9<;87:>EGD?<<9559::99DJ?CEFFA>@HNIB;:====;87777678;>?@A@><733455:??>>=<;=>?AAABBBBBBBCCBBABBB@@>;852346::888999::999863222//23467553.,2;BB>::;;:64435778:;;;:GHIJJLLMPSVWXZ]aa`__^[URQOMKJJHGFGGGGHJKJJIIJIGFFFEEECCIW`gmprodVIEJT_jkfgjllmmkouvwyudL>=?@????@@@@@@@BBCBAAAABAACCDEEEHPX[\`abb_VJAADBA@>=<<<<<<=>>>@BABCDDEDB@@@??;7:@FMWbgaaieR>9>A><>>:?KLHO[[Z\]^YMEDFFFFFHILKMRXXTRPNLKKKKJKMPQRPLGEFFGKMPUZ^`ceijkmnnnoppligda__\VU[WRr}maVTUVUTRJFMVZZYXXY\f_ipNPQSRQQkZJENdem`p{pkfndfv}ypfj`RR[jtrvp]aosytseXUPHIKJHGIHZm[RQkpc\ROOZbYNQQXp]LNMMLIGDUWPcojgj`SMFEHJKIGNYΎjcUN>SyXGLNNKJLMLJHE??EDDDEFJQVWYahcTLIIPW[PIKJD?=?>=ADDDCCFHHPo{tqokdRB<:=AEEB@AAI\^PDA@BGMNKHEB@?=<;=@CEB@@>::<<;;>CA65<<;GMTNPWPGCIRQOPSPC>AFHGHKVXNIVahh_QEA;449KHFNTVYZ[WMO[tn\XRFCCDFGGHJLLMMMOQRSUUVXXXZ[[XWWVVVY\]\[ZXYYXYZ[Z[[\\]]^__`abcbbbWC:DTms`A8=><>?>@@BBBCCCCCABDGHDCBBCFHFA@IW][\YSOJHIEADGKIHUhqqnfQ?BP[f\GIROECFJLMPYegfoqdVWYVZgc^QJGHGFFFFGIGBCCCFEGGFIDMz||xupq}ue^pm^gpv~~~}}wox|{skgeb_a^Zi~xaWUSPNLJJJHFGC?BECBC?>><:658<>?@@@>>>>>>>=:97889:;=?ABFIKMNOOPQPQRTSUWWXXXXXUUUUUVWXVTWVSQQSTUVWXURTY][[^__^ZXXYZ\]WZSJJ@0+*)-1346:BFEDFHA7677@IGIPKCCBBBDEHILNPPRTZ^hylefiO4>b^coqZ=_tiedR80E_h`VKDB@94578:7>I92677?IMKGFDABA@@???DJKNPPUTL<>IJKFCDGHC<9:=AB@@@?93;BBB@:42:IMKIJ<3DJIB;318BEHLLKKHJNJECCB>9:=ACCA>;;8658:;AJMOPMJEA<:?DDDECA>>>;748<<<==><;;;<<:97579::;==<9668;85566;?>;:;:967>FD<7:>?76:>BB@CIHDCDEB??>=9<@:333.,4<943347;>>=<=@B?<;:=BDGKIFEED@=;:99:;:87776668;<=CEFC@:3343359:;<<;9::<@ABCBBBBBBBBBBBDEECCA@@<4128<<<>AB@?<:89:9@HG:028<<66:4.022468;:989;<<;5/,*)+3:;@NRJ=68=>>:61.,,,,+)(*.5765779630-,,/0/05<>;867654216;70-+*.5::9863243/0443343336.2XA56998;5ZT59;9872//00010/6;;:873-19==>70.//Mjd]ULF=8977BJH91>RVVVXesmYCEWe\POK\Q3?CCCDIF7.,,8C;3341-*1>??????@?@BBBA@AAAA@BBCCCCDGPXZYY[]_][RE>>?>==>=<<<<<>@@@@BBBCDDEDBBB@AA>=CKNPY\XZ`cfhYA9==<;<;=FGBHUZ\\\^`\SIDCEFGFHIIJLORRRQOLKKKKLKLOPQSRNHDABEGINSY\_djmmoqpmnnomljhjkjfaZSTLT{iVTUVUTTPNSXXYXXZ[X]dkyoPOORSQQgPKFQegfasw}ynYcp|w~|ncnbOO[a]dqfx}o|xVPTOLLMMLKMomYKIhob]RNOY]UNPSYxeGMOLKIGGUWSfslij_QLIFHKJRNFDvm^QMD\~VINONLLPQNLJE>?FFGFFFGHPUTV]dd[OKGHIKLQPF=;==@BDCCB>;<>:7:>BA65:FKS`hWNPMKPTTVVY][NGEGGGJQ]\U\gjg_OA=:7458EFIRZ`bilaRMTmfYXSHCCCEFFHJLLMMMNPSTUVWXXXZZZXWWVVUX\]]]][YYXYZZ[[[\\]]^^^_abaab]M>75>Ti_@9<=<>@?E`uxdJ@BCABCCBAAA@@@ABCCCCBCCAB@BMZ]_feWKHIHAAM\[NLPRMGFILOQTaieutZ`g^XZUNFHJIHHIHHGJIGFFGGCCHNWqwhip{}b_jrghv|~vyxv|~wwoujfc`bhaYevn\WURPNLJJJHFFDABECBB@?KJKV\ciny~ppvxpe_hh\c_UQPPOKHEEEEDBBA@<:;>?ABCBB?>><:::98756889;=>?ADGJMOOPPQPQRTUVWWXXXWUSRQRSTSUTTWVTSQSUVXXYWSVYY[\_^\ZYYYYY[\WXP@3--./*,-/..03592677:>@EHGA?AAA@@?AHPLIMOPPLBEGIKGB>DJIECBAA@?AA<46=CGHF?626>HPPE92469EQXVCG_aLEL\igXIIRSKFFC?@DHHHHJJHGFGLI8146434465248?GFABEEDDCCC@:3/048@@=:868:<<==?>>?=??86:AEHKPTL80:A@;?PVH9106CKHILMKIHINLFCA@@?>=?DGE@9677865;DKMLLJFC@>>@CBCDB>;=@@>969:;=??858;;;;::856535:::=@?==>:6766666687200038968=@?=;977=>75435:>>>;<>:7:?@;32:DG?=?DIJGBDJKGEEBA?<86?A608<66;><852037:<<;98;><::>ADJNKFC?<=>@A?<8789876677888;?CC>9842223347::987668;>BBABBBBAABBBBCDDCAA@BA;447<===ACB?<:8889:;725:;=<626756742259;:<>><<;6-*-1.,6>DKMC867;@?9561..-))))*-46678:;8565.*,1//7=;:747985315850.-+.26962/.1210/001//.4=?/@`@26;;:95`R69;:=80.0/0/87.4AIKKF?3258;:;>CF=NhcbQ5?D1199:=B=2/4=A<5/,++)-8AEGGJKD7103789::96666>>>==<<<>@@@@AAABBCDEDEEEEEEHHD@@FOVZaedhiXC<>><;==??=??AGJHGFEHIFPE9:;;=?@CA6;a^^mjSD>;AIOPU\aggZRNGEGJNQT\ceb]L>;987679@DGQ[]fnrkXOThaWYTHBBBDFFHJLLMMLNQSTUVWXXYYYZXWWWVUWZ]]^][[ZYYYZ[[Z[]]]^^]_aa`caP?<;;:=?@AKovH@DCBBCCBAA@AABBCCCCCCBDBBFLPVQLJGGIGED>:BDEJMCFTWSU_\G<>@ACEEDCA@>;:987653578:<>?@ADGJMOPPPQPQRTUVWXYXWVUUTSRRROORXXUUURSWVY]ZUTZ]ZY[`_ZWWWVWXZYYS=+,11259.*(((('(,1@@97<=8=P]`__c[SLFHMTW]ih^XWRVn{[\l\@=Refa_^QJGDBA@?=9?L@1333542:EHC@BBCCA@BDDGJLNONLE@=?EFD@EJKKKHA=;>EC979<@EIKJC;76>HK@7425;@GXYMR]VNLKQ`gYHJUWOJLJCCDFGHIMNJFBAIK>9?>646665347?FE@?CHA:;?DEB;2.6CHFEFFEEEEEDFHKJHGCCA61489:<=<;:;:=@ACEEC@@?>=>>>DEFEFFKC54>FD>AOSA0/6@JMKLNOJFGJJHGC?:>CC?@CEDA9579975:EMMKIFB??AB@?BCCB>;;><85555689850/36522;B?8467599456679>A@:;=;;<=83/18AEEFHJIIJIIKLKFDCDA<8;@>78CD>=:9==8558:;;:9659><9;?@DMNG@==?@@ACC=5367764468876:<><844335688569987654459<>?AAAA?ABBBABBBBB@>@CA<:;=?@@@BB?<:87783.0359;<:5137774/.,,47,*493,1:=CNOD638@<53:7301,())*-26788776699401223:<999789865666224300224211120100//0..,.6=5SV:37;;<9;_N6;;=>80251//9=10BNPQNH:34688BPSODJ]acR8EH.(3965<>>NXUSWinP3(<}wMQY_u{`[\31DEBEPRLB====<=>??@AAAAAABCDGIIIHGHJF>:9;EQ[cfa[^e\J?<<=<8;DFDLYYW[`aZSNDCCDFHILOPPPPPOMKKLLLLNPNMORSQLGHIJMPTUVY\]_`adhjlmmnnquumikhXNYfesrVROSTWXYYYWTUY^ZV_[k|kKMKRSLOcb]S[gnddntv~snOV[`kmrlemp_SYdjmqhWQXuRAFMQRONLIGFMVp{bSNZqk[\QJR`^NLQURSRHIPNKJHEGNTmyoom[NJLMLLMR\X|tiTRVQiRHNONLPOOUSNKLJGFEFGHGHHHHFDGLKJJJJJKRXXIB@BAIMMMKHHIJHF=;>FMOOWUDEONLLHDA@ADFGHHIHIIKRRNLEJI@ALVQNLIDID>??@AA@FH8<=>>?CEB_sEADCCA>>?@ABBBBBCBCCBBACCBELNND=77AHFABBAACMROGJSYYZa^KACGLSTPCDGFGILMMJIPaifnumc]ULILQNKKKKKLNKJJF<>Qoy}yhdq}wqhbafmrqgaow{~|uqv~yoiiimmggmkda_YUROOOOLJHGFDFGGGDBA?KO[dgimv|stvupg\V]a^]XVVWTRONLLLLKGEDA>>@@@BDEDCA?><;875434679:<>ABCEGKOQQQQQPQQSTUWYYXWXYVUTSSROMOWVUVUQSXWWXWST]b]\_a_[XUWXYYYXXUB3465476311/--.048=BD?<<=@VhbTNZ_YRKCCXa\geYQPQ]unBZgD8?CLP?@FTcsz_NPO@Ihmjfg^NIIFDDA??<=E@51122225=FFDCCCBA@?<>FKKMNMKG==>?@FGHJJJJD<89BEB98:;>CEHOK@6369:99;979:BX[QTXVVSKJW_SGJSVPKLOKGFFGHHKKIGB>AFDEKD85888768=@CB<8?E=3369?C?77BKLIHHGGHGEEFFHIJIHDDC716::9:::=ACBCDDFHFD@?@@>>CEEDCBA@B<7<@CCA=:777:<=;;=>=;9755667798679<>AA@<:8888999633443239;83025321169:75;@A:7;=<<:400026=67@;4>@=8665433347966:997653237<><9568776651269;=?@?@@ABBBABBBBBA@@AA@???@@@ADB><:8986236413698410672../-,3?IID@=?>6./793-0:>CJMD537;843:;623.)*+,/36754344456655239=<9::;=;:;<><;74773001233442020333520.*)->?CFGB:;;88899999529?@??A?93.,+.1244446;>81026;???A@;436999:GFEFFEEDBFNSX^`bccc\TRSSPMLJJJIIJJKMPQPPPOPPQRPPSZ[RKOVWVZbghgghgb]\[YZ]^_`dfjppnoprvxvuun]JA@@@@????@@@ABA@@@@ABBCCDEEEEEGHIIKNNMLNNKIGEC@?>==<;=?>?@AAAAAAADEHKKKJIHGFEB?>@BQdbZTTdjYE>>?><;:9:>A@BFFIS[_^_bVE@CFFHIKNPPPPOMLKKLLLMNMLLLNPQOKHGIJRXY[`abbcfiklmmmmnoonb^_RMYkcTj^UQRSVWXXUTUX\XTaZj}fGLJPRLOgb`^`grdfolbjknPR[[cub]hpnc]cimpgRJOVbBHIIJMNNOLJIKMTt_VV`r~hYZSMSZYTQSTSOHHLMLKJIEKNRgtnje[TQNMOLXlvyy}nUQVPnPHONKHHHGKMLMOOMJGFFEEIOQOLIJJHHIKJGDDJNKHDCAU`URKJJIJHA??DKOPOTYJFG@FJFA?@DFGGGGGGFFEHE>DHGJMMKJY\ZKALPGABDEEFKMC@mhZ]PC:7@KPPPPOPQXVMDGU_aZQPWZdhQ:635889;99?KUQE7>W]OLPPMLQUNB>CEEEGIKLMMMNORSTUVWWYYYYXXWXWUWXZ\]]\\\[[Z\\]]\[Z[[[]_``a`Q@;;:9:;=>=;=>>?EG;:9<=?BBBBBBBBCCBCCDCELKGC>6=IIFEGLJCESXPLPVZ\\\ZOEGMKIILC?CEGKLLMKDEQUWkwvh\ZQLMMLKJJJKOPMJC?Rvytt}wmmwyijsf`cijihbgu}tw}o}x||qjjr~whikeba]XVRQONNLIGFFCFJCIFAB=EQ`egju}xryzuncXTV]b\VUUUSRPNNMMMLIFDB??CB@CEFDB@=<97432425789;=?ABDFHKNOQQQQPQRTTSTUWYYYYVTRQQPPNOPTVTSQSWWTTSRU[a^]`a_\XUWZZYYZWXSFBB@=>+3FIEADGEEDAFIB<R`\fdXL;:KZRCMO@=:9849EHECA@@??98BKLLNMMLF>@@??FIJKJIF@97;BA>98::=ACEGD<4235568;87:BOYZV[]\]YRNTWOHLRQKGINPLHGGGFFGHFD@ACBGJ@557767;AEEDC=9=A=86548=?AFHB>AFHHIKIDBEGHJIIGDC@627::9998:BJLGCBDEDB>=>=<=@A@@A@@@AA@DFFFINNDACDFHIIDA@??>?BGFA<:=CFEB??BC>;AJQTRRQOMHBACC@=<>ACGQUQOQQI?=@BA<9756<@>=>?==?=64567678;==>@??????><9997459965::877422115657:;:859=>:7;=;;;50///27BHGGHIJLLKJHC?BFE@>=75@@?<98<>=:895321369:889887776447:<<:878766676:?=:;>??@@@ABBABBBBBAA@??@@@>><:?D?:9877755::423566533871179611:EGEB?>:4/0552.2=:<=?A?=?A@=?<6695/0455310/0/126861-+--&>C2447?G=78f:668862.06-219AAHJJILOI>987525:JKJB:N_WNNC76643126751=Kawo_h`ce[]_nP,>giMGUIELE<@LUN;/0101587;@BBB@><;<;9887788537>A@@CB:42//5:;>><:<<83..158;<88?>6467643HGFFEEDCCHQX\^_`abd_SNOQOLKJKJIKMMMNQQPPPPOPPQPPQQNLNNNU]acfgdefeb_\YYYYZ]_bcfhilptuuvwtsqgYNHB>==>????>?@@@??@@@@ABCCCEGHJLLMNNPPRQQPOOLGDBA?====>@?@AAAAAAACEGIJJKLJGHJIDA>=IXTPU^cfbTF??A=:::;<==<<::EUciiml[H?EHGHJLLNNNOMLLLLLLLMLMNNOQRQNKHD@ACEKQW[^bgjlmnmmmooqrdVOLRW[]T^}h^OOQUWYVRSVVWTP^\j~dFJJOPMOiU\a_gsbhtikngnWZdkl]Rajieemofa]TLLMe{SFKKQXa`WSRNIFDFqd\\`mxgYVUSVZ^a^UQQRGHKKKKIIFKOLYklfYT]^UTWYqwxaSLMKv~NHNLGHFDDGIJJIMTQJEC?DLSSQPNMKJJIJHEA>@GKKFCCSplKIKKGCCCFHJJJR\PJDAMRJ@=@DGHGGGFGGGHJHDIOCDU]TBK[`L>GOICDFHKMPSMHj^UYK?;>?@BEHGA@CEEEGIKLLMMNPRTUVVWXYYYYXXXXWVXYZ\^]]\\\\\]]]^\[ZZZZ[^`_a\I:9:::;<===<=?@@DI=BfuK:JeV87===ACB@BAABBBBBCDCDCFFFFN@5BPNJKOPLJKNQWUKJRUSW_UEFLG?>@BBCDJPRNOUWNILO]y~dQOMKFEHHGGFJQNFJX{wngjolgdmthfjtf_cihcafr|~}r|u|nwy|z{wlp|sooib`_[XURQONMKIGFFDDIBGFDA=CVafjs{~ot{{ri`VSV_d]VUUUSSRQPONLLKGEB@ADEDEFEB?=<952100235688:=?ABDFJKMOQQQRRSUVVUSSSX[ZXWUTSQNNNOORSQQQSWWVUSRUWY[]_^][XUWZZZ[ZVTRJE>=BN5(158:>;:84=GPJ?ACFFGHLSbgd`\ULLX_i_UP@.2:>=CFDGHB42;DHNNT`VUPE>ELCKUNFJMHFHPROPMEIQ]UHDEE=9BJHEDB@@?>>DLOMMNMNME=CDA>BGKKJJE<57>@?<;:<=?AEEB?;6456666668DPW[Y\c`[^^VQRTNJOQIDGFGQSMGFFFGHHGC@A>>?=>=:9:>DKJB844:BFC?BBADHHJIIIE>;538::98:84:ELH@>ADFC=;<;::78>@AAAAAEJIGEEIQPHGFGHJLMLJIFA:8=A?;89DIEDB@?BCAGUY]]\\]TC;?DED@==?A?=EMKFIQMA:9;===<<;?@@AB?;=?;41333457:=>>?>==??@@=:98316;958??;8541113:=<==<<;:;<<<<<=<<=730025:@CEGIIJJKKKID=>BC?<;66:<=;AIKFDGH@73678;>AA>:78<=;9:<<:8;?ED;544348::::767:;;867779;<>=;98788@JKC99==>@@@@BBABBBBBA@?@????==:78841223454578766664444557:?A;105>EFEB;61./220.07>;2.4;;63121123430+-011452/,-147988777?@@??A@;8;<7487026863/../-1.560+)),/3B4+,-01=2-1`953433556:5633;EJIKMOGCJHC93168=?C5%6WUILB799633333/+.0Ghaip[LOcebn|{9F{}fRPJC?82297?ED>;<=:97?A>8623;ACDDB@?93/-/245783/7=:76420.MLJGFDCBBFOWYXY[[[]_ZSPQQPONMLKMONNPPPQQPOONORQPOMMMLMOT[addc`^^``^[ZXUWZ\^bccdfjorrqrtttrl`VPKF?=????>>?@@????@@@ABCBDGILNNMNNNNOPNMOQRQMKHDA@???>?>@AAABBBCBCEFFGKMKJKLKJE?BFFHHGGGHHHKLLLKODBK[fXNT[PBCGFDEGIKMOQOJ_NNVC7=DHKJNWWVTQNNB>LUJEGFJVSRY\G?977649?CIR[[PBEIB9788;=?@@AAACDEGIKLLMNOPRSUUVXXXYYYXWWXWUWY[\^^]]\\]]]]]]\[[ZZZ[]^^_VC89;;<<;;<===?@@CGB?Nc}`CAESM;<@=AIJCADBABBBAABB@@?BA>MTC?NVRKIKLNONJKTP@>JLGRaVDBDA?>??BDDMVVOR^d^RRRVgnXFHPKGJLJEEIJGJ[~ttrmkmkir~|lbgiisg]]bebclx|mn|w}x}nk|zyz|vzplssia^]YXURPQONLKHFFDDICEFIB=EYcjuz}truztgaZTTZabYTVWWUSSSSQPKJIECCACEGFEDC@<=<730//0135678:=?ACEGIJMOQQRSTUVUWYWVUX[ZURRSQNKKNRQOPPPQSWWWVUTUUUW\\ZZ[ZUVWYY[WUSOKIIHHK?++,,-,)*)),3ENEFEEEEFSfqh\YX\[QRY_RN`eI769;GPPRTJ718AEKOSTSUOI>0602?EGIGFJU^`cc]RMT^XPOOJEFLLHFGDB@@ALRNKKLMLNM?:FG?=AFIHGHB826>?=<<<=>ACEGFA;7444556659FQW]^_dc``_YRQRNKPQIDFCBLPLGDEGIIHGB=968@CFIMI:-4EGDFD?===>>??>=?DLMD=;823;?<58BCDGIKJJJF>=748:<;7889:;BDBBCEHFA><99;87=@A@?>?DJIEDEGKLGGGGIKMNOOMG>53;=;99;>@ADEB@@CO[_]]YUTXQA;@FFDA??@?<99>BBFKH@869:=@BBCB@?=<<;<=93122244455569=<<>?@@>=<:856987:==:8530/27<;9;<<===<<<=>>><=?;74468:89?CCDDB@><;<>CJIFGJF;547=>>?@>969<==<:89;:9;DE<65655899;;6368;956:@CA==?><<><99FPKB;879<=>@AAA@ABB@@A@@@@@??>=;951,+-.26876678865432004:?@BA<9=>ABCC>82..023233451-,06830//..037:82476245311455:=:8987;<85:=??>?AC@7117835735888433320/,920**))+9C/*)*+,4/+8h9313329>>@>:403?HIJPNDDQNG82A><:;@A?;30/5@B7/39<=@@<3-1799:>>>?ABCDDCBBDEFGJLLKJJJKJE?<=@CGIOZ`ejgYC:>=<<<76889=AAAAAABDFGIJKLNOPQQRTTUVXXXWWWWWXXVVWZ\^^]^]\]]]]]]\\[[ZZ[\]_\QE?;<<<<;:<==>>>??AB<=<;;::@NPIOVURKA?JRONPQI@>@DEFEHKMPRSTUUUUX[YUPNOJBBCHH?;HMQYSKFGKC4;32@IB>?HYcgfjkic[TKIWbXLLMLHEEFB?>?DNNGDHLLIGB6?CEEEED?625<>=;=?>>ADGHFA;7333445559BJNU]`dkjb^^[WTOMPSRNE@ACCDDCBBBDFD>8548@FJSWQ@13CHC<9899:<===?@DJLHA??;669:;;>CHE@IOIHJFB@858=>=;9GGHHHGHGB;78<>==>@?>=?CGHFDEFFHGHHIJKLLGD?:5029<=>>>>=?BDCA@DWf_\]UIGLMIDBCEEEA?A>:965:BFDA=99;;?BEDEB?<86:<;;8323433322226:==<>>????@BB;57<<:9988877779;968<<>::<:66777:>ADGIIJKKKKJE<;@B=:8?HLHFCBCB><;67DJDCIG<;=?@?>??=::=>==<;:99989?@;767558<=;:64333337AKNF>;==;=?>:8CKD><8459:;?A@@@@AA@>?@@?@@???>>==940/14688998885321/09CFB@@@@FIEA>>>;70-/02356862010-/0.-.////16<>98:74453/27858:;?979<<;64:<<=>>@?7.,4:5268987854552/-6=62.,++*15,++,+.01+Df:2/356?B@=A801-4EJHHJEHSMJ37532221.+,1/-Lt~pbSNbok_YqRB2'-3321/..0357>E@<:9==;8401:@;20383,4==:96555489751,4LWVROKFECCCDFJMMNMLKQXYUQTUTSQQOMMOPPPPOPQQQSUTTTTTQPNMKLU_b]TR\_`_^]XSSUZ`b_[^aabeilpstttsle^XUSQMFB@@@@@@@@@@>?AACEGHHIJLLLLMNONOOONPRSTTURNJHFDA@?>>>@CBCEDBCFHIIKLMKJJIIKKF?>@?=8=PahkmkbN?>==<GaZNOJA;;>GPQLHFFGGIKKLGQ[[LKHCKVZYUPMGDFFFGILG<>GE@CDEIIJLLLLOW]_ZPLHBGFBMRZaZH9Lcc]d`THFHKLLLMMUUK?>><8899?DFGC@ABDFGIJLMNNOQQSTUVWWWXWXWWWYYXWVY\_^_`^\^]]^]]\\\[ZZZ[__THDA<;::::;<==>>>>?@@?>HSB=BCB@>????CHIECCBDDA@@?;:;;:<>BEFNYRIJK@=KQJLRSD<>AAEJMOMMOPOOMJGDBCIKIFJXa```_[MJSOKNPRQNRE=Y~wfb^]]\]eumdgpohec_eqj^Y\ffiwo^k~tymcx~~ukkopkfa^]YVTTRQOMMLJFHDENCBGRH7Hequv|usvupjb[WSWcif_^_ZVVVTSSSRRMIIFCCDEGGGDCA>:61/././0235668:=>@CEDCFJKPTTTSTUWWUTK@9:8779;:63//6HWXSOPRVWUSUYZXZ[Z[ZXZZVUUUTSQSSPLIIID.(,.----,-.21**:E@ABBBB>Celsqk_]aYOOQXcdN73;>LTV`eYE96@OWY^X@9=<;<>@CA?AGNI<@84CGFA@BFGEEE@:66;@>=?@>>?DKJEAAA864568878;<A=<>CC=76:??72797>KM?6:=;9;;;;=?CHJGDBA>98988;DEDJJ975:?@?@?AFC??@CFHGDEFGJLJIIHHIF?:533258;>BA@?>>=>@A@BPbe_\VLFFGHGDCFIF@?B>98756;9:<@EDB@>=<9:<=<9622554433347==;:>A@????BEE?:998667899:<=;:;:8:<=?AA><<<<<96786346436=<>A@>=<;?@;878:;9677659BD=87521/-3:CGC=<;=?=;9987?@@@@@@>>????????@@@@@>:8620258:::88436;@KRJA@@@BFGE@==>;5/--/..11321110-,--./00121016951244311466579@B5<:;>>6379:;;::995//7615>;7674210--2B940-+*++++++,,-.01*J[5-27:<@CA<<5/1-,:A=;FEJSNG1OE6=CDA?OWUL:;EG;41.-,--,281+3JUURVWQ]qqVS{rx]E:,*13200//0256;DE@CC:8:767533111355446779=@AA=4,+/37;?@A?3,7??>>:435534787/0KWWUSPKHEDDDDGJJIJKMNPQRRRSRRQPONMNPPPPPRRRRRTVVUVURQPONNPUXUU]`][]^]XSQRVYWQNV]]]ckptuuuuqjec`YVUSOICA@@AA@AA@?@ABCEFHHHILMMNNOPOQRRRRTUTVWVTQNKGECA?>>?ABBCDBCEHIIKKLJIIJKKLJD??>;85BX`\[`i]FB@>=;>??><@EGMVdjjjkmhbMEHHGDABNVOGtNIMFHTSLEAABBCDEEDEIMOQTSOKGA?>>?AAAADIHHgz[HYaci]NIMOMKIHHECA@==ZfJEGC>:=FOTYSGHHJKNORYhnnXOH<7BXXPOOHEGGGHILMD=ACACCCIMOW\TMU]]]WNG@@CENXXlgOI>ARWMTWPFA?CFHEBBFJMLD?@<78=EGHND=CDDDEHHKMMMMORSTTUVWWXWXWVXYYWVY[]_`aa_^^^^^^]\][[ZZZ[^WE;;<;<;;:;<<<==>>>?@@??@>?@ABCB?==>J[WD>??@AA????><==;<=>?@KVM@AIHHOQLLOMFA@@AEGHHJQWXRKIJKIEDGIJIJXfgge^XSQX_[PNOQNIVokjhda]f{|ula`jlc`b`^ctraZZ`el{|dWst~yxymd~x{}|qlkomid`^\YWUTRQOMLMKFFCBPFCLZK9Utyy|yvtttnd]ZXT\fic^`aZVTUTSRRQPLJHFCCDDEEDCBA=82/..//012445679<>@BCDEGJMQRRSSTUTSQQG;469::8666743.4BSTNNQVXVUVYZXZ[ZZYVVUTTUUSQQRRPNLJIPJ7/-,,,,*)(.2/4?DABDDCB8>ey{omgfe\ZZ\^`fN=@GQdkga]^__^afdez~m`]XOGBA<88:<>>@A@=?E?75C9=KGDDBDHJGEEEA:9>?@@??>=?DLLKMOPH:77;?@;6763;MYdlhgeda]UJCFMROB=@=<=AB:65688438;6:OZTRTRPQOC:=FFB?<==<=>BIICCEC>:99878@EDILB?DGIKC5257=?@ABDFFDDEGLOLKGC@@?<95579<==@AA?><:8978;;::99:<:79;>BB@>;;<=>?>;8634676543348<<77=A?>===@BCDA920377655679;;:99:<>ACA?>><;867675443027<>CGIKJJJJKJE<:?BCGF=CKIE@?CB=987755:>?=>MSHABDDBACEEBAA?=?@=75787777766:AC<787420.2:<955;>>@@@>>???????@@@@@@@>=:40035798887@MTUTQICB@AA@BEDA>>92/,,-,+,++,.///0//12320252.+/52-.221/5;96568@7:C50456767787644781,43,4?<5675553239?6-,*'(-.,,++,,/011*PX,.8::>>;C=4211/+1757EEKTQ==P21.8BSVSQQ@8ILD;421/+*09@>3,+&',,:VY_zvQHuJSR@90,12213200233521686400/0136439<72267:<>?=:513:@A@>7.2@B@?@<412215;><2-BWWVSPJGECDDEFGGGHKNNNOQRRRQPPOONNNOOOPPQRSSSTUUVVUTSQOOMNOQU]_]]\^`^ZTQQPORRQUZ[]binqrtwvqgccb_[YWTPJEDCBAAAAA@AABCCEGGGHKMNOOPQQRSTTTTUUWWXWVUROKFDB@>>?BABCBBDFFGGGGIIIJKKJIHE@>=;8:CECEJMJECA?><>>><9GbTCFJH@?GNQ\aSFJJJJHO]dhg[YWWICWRGFFA?ABCFHMQSHACDCEFJLP]fWMXb[RKGEABDKX\Xih^ZJIIHGPPKJE>=>=;=>?AOWJ>==9>JQKJNB?CCCDFHJKMMMNQSTTUUVVWWVWWVXXXWWXZ]__`a`_^^^^^^\\[[[[[YVG;:;<==<<<<<<<=>>?>?AA>?@@@@BCCB=<=>LZQC??>>?>>>??DEBB@?@?>=DKNKKMQPQXZTOJFCCBADEFHKQZYTNLMMKIHHIIKLTcki_WTST[g_MKICO{Ÿxjeb]^cr{pkkllld]^`a_dste\WVdv}sY\su{wvwohx{~ÿ}yrommjfc_]\ZXVTQOOLLLJDDD=PJCQ^HFp|z~|zrstj^YYZ[`fd__b`YVTSSRRQOMJIGDBCDCCCAABA>7300////01234469<74688:89:9886523?ONMPUWWVWXYXYZZZXUSSRRRSRQRRQONNK?8<=2/.../1/288:FIDBFIIEB;Cix~tmhhlh[Y_aVKA=@::IUSD799?DCDFDDCC9:C>J[c`^^XYYPLMYZ[{s`TM>6798:?AA@@@>DJMR\ba]UG:9?CFC?>87DR[fkhjjc`]VI?>BB?=>>?A=:>:9:889998748MZYYZWURA6>KIDCB???====CEBCGHD=;:877AAABCBA?=??DFHJJE@845<@CCA?=>?@AACEEDCEHNQKHD?<;<<:78;=>=<@A>=<;989:<@A>>HT]]WPIEFHMNLKGGJG@;>BCA>=<6346658ADFEA==<;<;987579976643348878:<<<;:9;?CEB91257752147:=;::98;>ABA?>>;9789::8994139>@BFIKKKJJJJF=:?AAEA9>HD<=?CD?:78:7319BBDGHHMOKGFFFC?<9777766776678;:9;<85222589656:<>A@=;:987875422587679::<=?@>>=>??????@@@@AA@@><:854421247>R_b[QNLIC@B@@BEFC<:40.,,,+++****+/1223444431211022102221.2:::531/5F<1.//665754210242-.3.(5?:66889:=>;85412.++12.-++-.0113.[T28705><4C9.////.4638AEMVH6U=1;10Gb^VK@6=NM@950251,5DE:/-/+'('+GD6114896112469<<:;=5-066339>?B@627;@B8+,=IFA@@;42226;??:4->WXXTPIFECDDEFEEEGILNPPPRRQPOOOOONOOOONOQRSTUVVVVWWVUTPNMMNRWUQW\\_b`\UQPOMOSTUWY]`ccdfjnmg`acec_\ZXTPMJEAABBBBAABBBDEFGHILMMPQQRRSTUUUUVVVWWWXXXVPJGEBAA@?@@@@ACDDEFEDEFGIIIGFGGDA?=<;877:<;?CGIT`hibaYVfbNFDDDDDBBDHJIJJKMLIILNPRRTWWYWUUXWTSPMNPPRUWVVXZdnprttsqmfbac_`a`\QNOTUTY^`Zccm~jVPJPRGTqb^ZcpkvXat||vxsVS`o]KUGFIKLMOQQQRSRPOVgt{zricb^WSUYZSLkkXPIEWd~yqonph^\YYWW[UHDHLKKKFCKNPRURNLLKKIFMSUQGEEFFIGU{lpLGIHFGFA>FJKIEB@@?BIQWVIFJC>ADDBAA@BDEFFHOJH?BEQQJJLQUTQQSSRNE@?;A[_KGOMEAFMPR]YIJJKTTRSITW\g`klWZI:=B><<<>@EMTWOBCEEGJJKP[ZNLUXQHEDCCDFGRYX[gldRRTPGOTMKJIB97<@@=>AID>:=CL\aTSO@@DCBDGIJKMMMNQSTUUUVVWVVWVVXXXXXWY]__`aa`__^^^^]\\[[\]ZM=;><<@?=======>>>?>?AEFEDBAACEFB=;<=>BCCA?><===>??DILLIGDA>;=EPY\XQOU^cZOIFFFDBCDEHMSXYWXXULJKJGGHLNQ]bc^XY]Y]dOEJ:Nɿppue[_jrx}zqjlu{mgea_^a^dmriaYUhy{kXilsvuusooux~||xqmmlhfc_][YXUTQNMKKLHAAF@BA?731100//00133357;9FLKMSUWXXXXXWXYZXURQQQPPQRTURNNOL=-,1110113?GOXSQRMDDLPNHC>CcxybR[jj_YYbcH>=BNI;6:;6688874:BCAAG@EHJT`aZ[XQRPJMLSYZezxzrb[ZQ<287:<>?AA?8?ScaUTKPLGFEDEGHHGHHE@??@ABCDBFQY\dnqkc_VG:>EIMQSMIPUYgmiie``]SE>=>=89=<@C=57:9:97:?>9437BPVWYWQB3:LSIABC@??===<<>ACFFC?=:8879AIIGML>5679:;;>ABBBCDB@BB>>;DGGEC?==>??@BEECCEHOM><=>=>?@CB?A@:47?A>99:;<:9;>?>>ES_`ZRKGHHIHIIINQLC@EGDAA@=712544;FLGGC@>;88987659<:7565434788:;:9997648@E?7455575336:??<:988;?ABA?>=;:888<>=>@:337@@A=69@=9;@DFC;79=:426:EPJ9=DCEGHJNPNJFDDEB=78;9765665556756=@;5346777557:>>?@?><;:8753210463456679;>>>>>=>>>>???@@@AA??=>>>;851./09LXYYUONOLDAB@@BDGE<50/.,,****++))*/123651.253369731586684.-17:313/7D/1355643540,.012/*/4-)7@757899:AD@93/5:41485/-+--/03032`I582,2662<5-./..073/12=KM2CX:BC3*O_Z]O@CONFB=5/163-6FE7,+.0---*)/75620388305:89>?<84:A7*/CLFA@?93533:?=;7705WWWTNIFDCCDEDCCEFILOPPQRRQQOOPPOOOOONMMPRSTVWXXXXYYWTPOMKMRPGJV[^acb_VQPNMORSUVY\__]]\^^^Z\^bedb_]ZWTQMIDBBBBBBBBBBCDEFGJMNNQRRRRSUUUUVVWVVWVXYZYVRNIFDA@??>??@@ABDDDBABEGHFEFEFGE@>><:989:;=>>??>>>>=====?A@FMUZ_gcSSipbPC>?AB@BEJMLJIJLJHGIKKLNNPPPPIKQSNLLKJJIKMNMR[dnsrsutsrpi^^ZUTir]UPOSTUV[b[\gm{sgUQRET~hYXdldpW]jyxsqZTaqUCSHEHJKMOQQQQQQPOTbr}xskga\YYZ\][Qu~^LEFWf|ppqmf__`][SLKA@HLJKKEAJMPUVQLHGGFEEE?ABFEFCGMQZuonIIHHFDDEIMNJEB?=>>?@HMG>EJ?DLJLMNOQVWUUVWVTKB@?BU`RKQOGCFLOMSSJGGHdmVODL_^a]coh]E6:B?==>>BJQVXOB@CEHKFDNSLJOROIFCBBBDDDJWYYYeiV\r^FMUNGKH?:?GACFB<=B>;@FVfc\ZQAACCBDGIIKMMNPRSTUVVVVVVVWWWXXXXXWY]__`aa_______]\\\\]]UE<<@==@??>>>===>??@>>CORGAAAAEIJA;;=?ACGDA@>==;<=?@BLQQOJFA=9;BR\b\NKS^YRKFEFGDBBCDGKPUXZ\\ZNGHIFFHLPPXcWYaSRV^ZH@5_ý}hhqi_awvnmkedy|l_[^c_[_cigkkfd^_t{xg[tzkrvurqvyoŸǵ|tmkmjfeb_][YXUTQNLJILG?BIADMFOPWxyrof\XWW[]a`[YYYWUSRRQPQPMJHGEBACDCAA=?BA@743210////0333469:=>97;<958@INPRUOC:543578:;97641124>FGGKKKPSWWWWXXXYZYVRPPPOOMMPTURMMNOMF>;92//126>GRVXVNEDMQMFB=;NfqYG==X_VVYceL@KLe`J31655689628DE>@KMRKRba\]_[YULMORSZ[Yi~vupb`in`D667;>??@?8DZK=HTVOKHGECCEFHHHGDBA???@ABES`ekqspkhg`RE??DNUTRW\WYfng`X]_VHA?=?B?9=@EFA979:;;9;@>7326ACAGQQLA?NXUKCEEA>=<<=>=?BDC@=?=;:;<=AGHFHE:3269;<>?ABBBBCA==C<8AHJGHC@CIJHJGDB@=969<>@CEDDFKKA48=?@@AAEJBDD:16AC<79<=>:657?>=;9998:AGFFEB?=;8666899;=<5244334569=>=;986412=D<56645643358<=<98769>@@???>;:757;>?A@:4215;AFIKLLKIIKH?9<@>=;68=<:;?CFF<69<95449DOF:=>@B@;9:8755655556525=@=73688766588;;>>>>>>?@@>???>=<;9:863234>PUUXTQPNHDBA@ACEGD:1....-++++++,-..-0454/,-238=?:32:;7931114;@:34<<7>989419=:66:30WWWRMIFEDCCDDCCDFILNPPPQRRRQOPPPOONONKKNQQTWXY[ZZZWTRONLIKKIEIU_dbcdb\UPLKNPQSUX\_a`^\ZYXX\_beeda`^^XTOMLFEDCBBBABBBBDEGKNOOQSSRSTUUUVVWXWWXXXZ[ZZZXSLFCBBBA@?@@@ABBBCCDEEEEEDEFGFDA?=:::;<==>>=>??>>===>=>@AEILNSYVT`fcccZOIB?ADLQJDFJJKJGFFHGGIHEHIIGHLONLKKKKKKKOZgpttstusrrspok\QTKWt]YUSTTUWZXVjmuwlWLBS~lXXee_qWZeoreqqbc{YM]PIFGIKMOQQQQQOOS]jyrnjike^\\^b`Y^CBJZmsegha__`aaa]UPE@HLJKJEBFIKRQNIFCCABCD>9IVMDGJLVbkb_mMJHFECFPSRMC>>=>>??ADFA@FE>>AABBA@@ADFEHMKDDCFHDJOPOPUXXWYZZZUNKJEL\XPSPHFGJLJIIGEFE`lZSJFXab]VWZ`H>ACFDDEGMSTVVKB?BEGD;7?KQRRQMIFBA?@AABFU]fbch\jsWCHTSJMNSVKA@EQMEEGBACFVc`]^XA@BBBDHIJLNOPRSTUUVVVVWWWXXXXXXXWWY]__```_______]]\]^^YI>=>@@>>@BBB?<==>>??=?ILB98;?CFME=<=?BGIGC@???=:;=@CKOOJLMIC;<>AHS_[IDOQIEC@BDEDBABBDEGJTW[[YMAABDGDJTPYYJc]FINPI@>8HONA955323455:?<96410226=GKLMNPSVXXWXWWYZYTPOPQPNNOPQQROMHRVNGDE5**-.-.28>AGKGBIOG@;528BIBHC2=LQW[fgQHUR^bY@565344555FC44HIVLJGDC@;@EDGIECABA@@?<8Jfomosqlmrsl_TKA@HG?BMSX^^caUMX]K>=A=>BHEDFILKD>;<==<>?:5226B;3>KMNSVWTNIFFFDBCB?@BCCA@?>==>>>@DED@DC?975679:>@B??@C@>=83777:>ABEGGKQTNIGEC@?;317==?DGDCHC:=CAAABBABDABJD69FHB>?<98733?@@@???>>=;>=87769>A?>=8311111239>=<:975335<@:5776554234657865546DILMLKKKJF>9>@=;>99<=<<=?EG=78986658GLC:<@@ACBCCD?:=?>;<><987766755897326:;<:27>;87546779;<<8216852.,/3330.02332346:==>>=>=>>>????@>821024554224;DN[a]XUF:BGECDGHD?40../0.,,,---156/,011025315;==;54678;<3-0776469019*/.2678;:0+2<82283--/1:9,,58:==ADHJG<678856321-./.,(3::gM.1981/26>:6633334441.,0*FX839@=?LABEO^ggWE@:44564.8FIB:0,+,,,,+,,-03470QjASHBDDD=887662.-02554444555444332346666:71..+*-6@?3+,0/057536=EKJ?68>B>;;9469747:5/XWVQLIGFECBDCBBDFHKMOPPPQSSRPPPPOONNLIJMNMPSTTVWVSOMKKJIHFFGGJXffedfgbZQJJMNOQTX[^bcb_]]\]^_beggedcc`YROOOJFDCBAA@@ABDDFHJMOOOQRSSSTUVUWYYXXYYZ[\]^^]WRPLFA??>?@AABBCDDDCCCCBBDEFGFDB?=<;<=><<<;<@@?>>>>>==?@BEFGGJOV_a[\hia^XLBEOMEDHJJHGGEEEEEEDDEGHIIJLMMKKJJJLO\mutppuuolmoqpqvlTNK>cta\SSSSRRWZhe~swraPDXvkYYegbzWXprpleps_fVR`UMDDFJLNQQPPPOPQV_mpnkhtsf_`ab``[CBLZk|fR[djlkdc`_\ZSFCILJKIFCFIIHGGEDCB@@AA@;BNMJMOJK\kYUnRMHECADMMIB=====>>@AC@>@A?AAAAAAAA@AEGDGQOHHIIIILOPOOTXXWXZ[[YXXWST[WOOOHGHHIIGGGHIOYglldQUaaVMKFQIGIFMRQOOPRMKNIAAACE=56=LXVONKGC@?>=>>>GRZdkc\T_^GGSZcikjofO@>GPOKKKHECEXa`b^SB?@ABEHIJLNPQSUUUVVVVWXXXYYYXYYYWWZ]__``________^^]_``TD?B@BC?=BGGGA<=>>>?>=@FC>>??BEHB9;>?AAAA@?>?@B=9:?FMSNECJOKE<>@??DJGA@CCB?<<=AD@FKJUP[sOAHGBE:rκ~d]fx|wog_\^```\XVVWWYf|lanlkj\[Y^s}xhnpf^}w{y}szqlqѻö}vpllkjgeca^\ZZXVTQMKHHLC:LSRHFEGe~vmf^[XXX[_\WWVTSRPPPQPPONJGEDCDDCCAA?:=@AA87;82/...0221112235779<>>:6510008ITQB9EQX]ijOGPLUbdH44511012:EORLHEGCGem]RZch^SV]fc^Z[beeegisujddegimeM98;>>=@?:63>I@RHLHEB=5699>BBBEFB>??44Qruponosvyxqd^^Q?>>=DEAHPKU]QFNTC?BB==@AAB>72226:59FNORXVMFCAABDHMOJBABCBA?=>><>AACGKIA=?;8633436@IH>8>D>5451/23557:CJNNQSOJGFD@=<857<<;AF@8;<8=CCCDEDA>>@BJJ=A@?@EE@<=>=<>@>;?B>98766:ACBA@>:42112348<>=<:8646999866665532234334444447:99;==>:59<<;<;:<=<99:=@<:<=;:;:>>:776679;ESPE><<>@ACEHGC@@?=:79<;;;966657::844459=:2:FA:85345:<985/-1442333677852333321236:;<=====>>?AAA?7,),..1430-+*/7BOVZ]R80@GGFFEC>81/..10.-----.4993-,-/18=:7;<;;:6437:74/.4764368//4279?D;/3:75=>75772-.15:3*+158;=BEDHMF::<:6454432113/79?hU>17<32:=?==;654346794.(5XF084@LQUOH8NbhiM<50;JI?5,)*-.-,+***/3488IG1=ACEEFA9996655444554435678764112443345:9641////13.*+.--/25407FI>46=AC>9;=845557778WUSNJHGEDDCCCBBDFIKMOQOOQTSRRRQQPONNKGIKJIJLLKKMMKHGFFFGFEFHFJX`Z[_d_VTPIJMMOQUY\_bcdca___`bceggffeddc]TNMMJHECAA@@@BCDCEHKLLMPSSSSUVUUVWYZZZYYZ]_^_abb_YQF@?>>?@A@AAA@??@BCCCDEFFFGEA?<:;=>=<<:;>?>>>>??>>>?@BCDEIORW^ZTYcggieXSYI>JNJGFHGEEDDCDDDEFGIKJKNPPNKHIOamkghkqpigklmmklqseJCBI}d[XQNORUZbhc{rehYNh~bZ]dhe}XXsk]m|iOGcSU[TNFDFHKNOOOPOMTMFOhsuttwskecdc_efSNP[bpbS]mtuqjf`[UTNCDIKIJHFEKLGFGCAFECBA@?>?BDGMSRMHP_\]lVULDB??EC@@@@@?>??@CD@>?@ABCCCBBBBBACGDDKQPLJLOOOOOPQTVUUWXXWUWZ\[\`\KJOJHIIJKJKMNRZ[amyulbYPHEADDJJHQ]\ODDGFCGEDCEFH@EQVYZTMKGC@@BB>;:=DOQTa^M@?EScnry|qXTbR><<:<=>>==:;BKOOKA<@HMOKCA>==>:;=>=>@>===>?@?>??>>@@BKUWNC><;<@@>9<@:2/.//13322110024653452162--3?EB?8668:=?=ALLG?<99765;?@=ITWXXXVUUWWTPMMNPLFCABFKPQNIMOPJ??LG3)**(*.131--.035553456?KNMPQPPYbjkVLPQZf`@33318?DEKRUQIFCDHSoo]EBZ]FQkvuh[Z`dffgghnlda^[\]bjcJ89=>==:7=;B>;Kellhiovwupi`_f_NEDKTRE56AZ]K@EG=@E@?A<6DMH;:?A;8:==AEB9333229DKMMNNJE@>>>@EMTTMC?@?<=BC@==>?ADEHMJA>>;7313569CIB9;A@7333234752:JQNNPPMIHJF8279::;?@<:835975=FHIKKHC@@CCF?8:@>;:;=;;H^jhc_[Y\[RKJIJJHEEGIE<967:>>>>>CC=:<<<>DE=>KL=7:99<<=>>>>===;977889;>>=<;97666566666665444545689;=<;;=>===><89:;<;<;::<>=;8:?GLKKMMJE?;BA?;643467876523:=5,7KF978:9====?ABCC=403:8/14.)*,+*28:@GH:,4?<::<:8863200/-.-----.1484+*158;97<@98:8655553./5612105921437>948:2./03661,-0225;BD9@QJ98=AA:888::;?HEFCF^ME;5953;>==@:52144675/,'IS:99@UcgheZIZjjkQ-6KZ[RJ7.6>>81+(*.0-+))+-/247;AozH-/568;<=<6566667788877655664/-.011223546<;620374.+++,02/../22.09;43:>?<769:9899:;;>DRRQLJHFEEEDDDCDFGIKMPPOORTTSRRRQOOOMIGHGGGGGHHHHHIIHHHGGFEGFDIONJNSULDIMKJKMNQVZ]_`adec`^^`bcdeeffffdec^WOIIJHECA@??@BCCFJKJJNQSTUWWTRSSTTX]\XX]_^_`acecca_XLC@>??>==<=?@ADEEEEFFFFHHEA?<<===<<;<=>>>>????>>>?ACDEHHJOXWNKSbloqlfgZGKPKDFHGFFEDDCCCEGHHIIJNW[SJFL_nbW^iola`lpmmmnnnrvcG?HaoY[VPNRVZ`fk~yi_a[Wma_[beeYdfVVs~fFMl|oVXWSQIEEGKLLLMMLMOKEXtwyukhffdealtcZT\_nj`koqtsng^UQPHCFIIIKGBISQINSGABDDCBA?=>BCEJNPNJLPRdiW\XJA=>A@@CB@@ABBABDGEBBDCCCDDDCCCBBAACBAHPMJMOONMNOQTVTUXWROORWY[\ab[adZMFDFHJLORSUWY`qlVZUF?=?JIJT^T>3>>?>=<:?FLOMF<9?>?=<=<<=>>>>?@A????@@?>@ABHMLE??><>@?>>HORopC=DG6gľlmswxpic]Z]a_\ZXVX[YcmljfddbmlSayk]XO\yyryqjprr|sxP̯xrokjihedb`^[ZXWURONKFEDB@YTROB@s}xqo_X\[YYYXUSSSSSSOORRPONMJGEEFDDD@?D:7;??<:?@:1/.//13433223358777640+//1//3?DEB@AFIMRSRRROICA?;;;<>B0/,*/31476:;;89754679=ADCFVZNJUcfb\_daeW7426;EZgaZXMB;ADILSotY70BHEcvupaV[bciooomgbfmfUOTX_cXB69>==?@C@E;CA=>FRC;;946:@@=???@BB@>3@XP=:DCDC<=B=2123359::=B?614668=CGHFDDFDCCDDEJNQPLC>AB;5=HG@=<<=AB?GNF>@>99?A><;>FIE?;;;73369:;;;ANPMOONKIGB;4/26:=@FC6047771.>NQPRUQJEBFJLF?=@>;9<@>8889>@@>?AA=IYN<=C=9<<<@@<9:9<@AA?=9788899:9865655799889876545679@?>=968:;<;879<@@;447;BGKNLIE?;;<;<>?><::;>?=;;<8687?FEAACB949<>?BEGHHB;;>?>BGC=;8533455431/1781)7LE59BFEB>732027<=91/3689:976777776677315;=;<<=?@AA@@?=@C<331*)1::1269<606?=7777641/./2:<4-//079.3716<>?EE78>?9219:/+012002./1337<@>2;OL849FE:<<<=AGLRQVVVSCBB;:957:::;51./6557/,,2[H7;5YiiijeYW_gik`=9?Zea[I9234650++12.,++,./138;>C>3124323321455643469:;975555410049;9538<88@C91/25520/./485/-./0022106=>;86777:??@@ABCGONLJHGFFFFEEEDDFGIKOPPQQRUUSSRQQQOMKIHFEEFEFGIIIIJIIIHIGFFFDCFGCBCFEBAEHJKKLNQVZ]^^aegf`][^bcccdefffedbba[PHGFDBAA@@?@ADGHFHLQQPRUWQKLOONOU[ZXZ^aabbacefb`cbXNF@>>==>?@CEFEFFFEFFFFGIHDCA>=<<<<<=>>>????@@>>>?ABDDEFGJTWOKKUdihjebjgZRNDCKIGGFEEEDDEGHHHGIMX[SNIVi_KShoi\]lsomnoqrqqwq`RKKcxp]XTRSUV]_fnZ_`^]\j_YU`ceYolYkve`T]nwiOSQOSPECGKMLNOOJKSTWr~y|~korkeajiexeZPZfyypwyxxvnc^UPNECHJIHKGEQXVQ]XB@HGEFGDA?ADEEFLRQNLKEagW]\P?<=?@@@@?@DGECCEGHFDDCDCBBBCDDEDDCDC>CKKJJKKKJKNQTUSSTPIHKOUW[Y]cmzveRC<:;BLNQQRSUWathYlvbG8=KKNWVE66COMLNG@SaTHWggcbYMFBCGKLKD?SaOPqsWFEA79LSPXVcvsZLW^``^ZWRMNNHTdnYFCA@@ACEHJKMOPRSUUVWXYZZZ[[[ZZYZ[[[Y\]]_aaaa__``_^_`a\J;8<=?DC@>@BBCCEHLNNHCCFDBDMY[TJDHOQJEEEECA@>=<<>@@@ABDBAABB@??AABBDBA???@BB@FJQRSomH>I;Xporxypgda][\ZYXWXZZXWX^ij`^[X[jfWdh]SO^xujp}|jlsn|yռշxyxutplkligc`]ZXWUQONLMKFCDC>ZXJPBS{oh\Z`]YYYVUUSSQSSPPTTNMONLIGGEEGB?AD858;<<FGHHJNQTWUUSQOKHD@<><:ACK[USVYTSSQPONLJF>547;=@ELNOMMRY]UNI@558?GNJ?E=8IMJ>233576778:<:>NO@C@BEJ?H>A=?DF>:7447;<628<=>><:657=Nirhbgmnid^_dbYRPNLI;7@=78AB?AABDFFC;3/011236:<:998314;??<=CGD>@GGGGJKJLOMKHFAAD@41?LLC=87:>9>FB>?<9=HMJGGFFHIE>:;;634:=AABDHMNPNGEIF:431138?FE<216972,/@NSUYZUOKDHW[URRMHD><<98CDCCDE@63:AA===<===FPJ@@A=;;;=A?;9635=BEE@:8664567789;:768;:87888788888:;=?AGKF>=>><;956::879?CB@?<538;>FKLKIE?::<968;=?@@@AA>;>@@??><<;989;8479<;<>B>?HJB?DHGGC<99764344321114420:G>6>GIF>7671/479>?756777666789:;;:;;:845558;:<=>?@?AB@?>=;7/-4:?>538<=AECB?;::::=81.1455882+,-...-,--3AGA70089544331/,,,.7C?1,./0;:(/67<=>=<<=BB@91-45.-01/-/..116:;;952>EG7,5A959<@AFKLLS^]kZI@BB?>=:975200114537340JY=57/Sca_^UMQVY]jiQXX\]^cYE:9::92+-54---,--/247:<9677456554436;;97414:;;84244325<@BDB@<:>?=:=@;7754541/.024410211342./9@A><=;9:?A?BGJJJGLJIIGGFFFFEEEDFGHIMQQQQQRTTTSRSRQOLJJHEEEEEEFHHHIIIIIHHGEEEDCDDBBAAABDDDEFHKNQVXXY\`acca[Y^accbceegggfcbca\SIBAAA@@@?@ACBABHPROMMPMFFJKGELTVVVW[`b`acfd]TQTWSLEB@??BDDEEFGFFFFFFFFFGIIIFCAAB?<;:<==>??>?@?>>=>@@ABDFHIOWXWRPY\OIV`b`]SNLLLIHHHGFFEDFJJIIHJMUVSRPVaMG_mbXWhrnnppqqrrqrqpnYDCa|fZXUSSP_\]~nU^_a`\oaRKP_beXm}w|\\^bduiJIIFMWPDBHNTY\^SO^_f}{z}hm~{vknpZXc`XMXdqzvruqwzmeldXODBJLJHJGFW]]ZbbPYlQDIKGDABFFFEGOSVYQD_dW[XN@<=?>>>?ABEGFEEEFGGEDDCDFFEEEEFHJLKHFGIJJHHGIJLMPRSOKKHCDIMRV[Z[`a`aTND<;;;JTRRSTSOTbsoWTqtT=?NMOSOLLMQRNKJED\dMH_gabaYLB@JQLGJMC>bp_^SC>A?9IWO_mZT\cgkb[WJ[vsf^UORVUPT`WPIDAABCEHJKMNPRSUVVVWXZZY[[[[YYZ[[ZY[___``````aa_^^a`P=:?@CEIF@?AA@@ADGOTQKHDDCA>AINMFCCEIHFECBA>=<;=>>ADEFGHE=99987MVAGVRE@=@@ACC@<=@CDDCCCCAABABAA@@@@@BCD@GMWSSomLC@Gż~zyz~|mb][ZYVUVXYWURRU\fjcYZ[Z\]a]Zh\TQ_vm}czwzfftnpğ}rsrsromnlhd_\YUTTQMKJIIIFDCC8T]IMIs|nf\[_]ZYYSSWQRQWSSVYWLMRNMLJHEFF?ADC237:<<>?<85322253/00147:=;987666456764018?FKKKKLNQSUUSQQNJFCD?757@ADINPOMPW^\TL<,-6;GOG?B?=INJ>344699986:C>8AMI:Jchfkreg[748@<2239EI92123;C@`mIA;8A?]qtqldSINJHWmgew{zyjTPSQPH=<=<<==DMMBH@?99;EIDINNPC97116;?@ABBCBJ^nokkqruunccjld[XTPNE<9;<=ABAAADGF@:61/2567879:7569<85=C?;=DJE>BJKHGKNJJMLGEGC>?>7/2AMLB957:9899:<98:AEGIIIIGFGIG@<:635:7657:7327BJOSXXTRPJM[babddbZJ>=;:7/6Wonmqleb]UNLKF;46<;9AGHFFFFD?<>A=54:=<;<;:==:8:=<:97666666<::988789;><:;:7323479;>AAACCA><=?CA<;;;;;7569:66;DHD>>>;6>GGFHHFEC=8:=:677:@DFFC>;ADE@::=:32537@@:<>:665468:::;;<@A=846522789;>@@@>==:;>?8236741466319EA567788771-/4554794-.00//,+-2;BB:0/551131/-+,++,,1<<1...1<<&+.2>?>=;6=HG?74--..0//.57,+0169533/3>>:4.3:5227?@CIHGRVPdSVCBB;>DA>71./2554415958\I03/+7Xed][WWYVSgxOP`]XY\TD>>>><3.480**++,-/1469865553587669;<=<<;:77<:85425659AFJIEB@<:>?<>>?>>=<=>?@@BDGGHQ^a\[\XRGAOTKNLENSLGHGGFFFEDFIIHJLMNSYUPQSUIJ^fUOZcchttqqrrrppqsuqYCGfqf^XPMN[bkx`^^^\\xEIEM`bc~Xi{phecjeFKHBFUWG@GQ]cgjgXZ^bojnul]fk_ck}JSwIXZQY]\fc_]QawoqweSCCJLJIJGC\h``dnp~YDJKHEABFIIHEIQXb\NhcVZTMC>=?@CEDDGFFFFFFFFFECDCGMMIGFEGIJMLKKKJJJJIIKMNOQPPJDDFEEFJOSZ^_`ZJJJIKLJICJSQPRVYTQTVUMP_c`WKDQPJJKV_^YRPJMLJ[\FOdfdgf[LBFZ[E=@F?:Pt`@8>=@@ACEDEEGE>::69`|]akc[VTTTTROPQRQQF?BDCDEEB@BA@@ABBABDDBDIVQRmmMC:ʷ}ywz~}h_[YYWUTVXZVRSX_\ZZXXZ[YY\\[U]_RQ_tg}my{ubdv~irǵƮrnpssnmmmc`]ZXVSSSQNLIGJJHECB9P^KHcunh]\]ZXUTOQYPSV_SU[]WINTNONMIGFC=CI?,38=>>?68?:89<>;5.../2677666545523578831326?DKOQPPRSTSRQQOMKKKC93.1FXZWRQQMJHIF<317;-,-2:99>DLLJG<9536;@?=@KSPNLNULHT_gvlVIC547@CCBCHPB84344>D7@DA?ACFFACKJAAJNIDEFEFHE?:88516FQLB<8:::63468:=>?@BBDGFDCEHF@==98;>>>>;=B@;>DEDB?@A?:6556<:59=<;=@CFILQSONONTYZ^cdgki]QKKMNH?Rloonnf^YSNLLF;8>?85<@ABDDDDEEB>;98=><<=<:97778:;=A?6/037=ADEGHIJJHD@=>>??=<;:9856799979<===@?9?KLIGFC?;98:::8889=;;;::;?@AA@;557841:@@@A<8>A=:;98=A=:>?:665569;;;<;<@B>76=B=:966:<==><<;:755540.,,.6:4**2:838656753-1<<7555760-.0//--/6:851.0541452-+**+*,+*1740./1<;110*08;><7;CG?860,,11-,0C>,)+/561/2337:566287/-1295//2677740550F^:13../>Qa`db]][XcsXShi_VMIC=<;>;22:8,))**,./1357895456898659>>;;=>=;;=974427<>FLMLIEB<9=<::9;;>=87877:>=84348830///027=ADEHF@?A=8?JNKE<7HHGGGGGFFFFEEFFHKNQQPQSUVWXWUTSRPNLJHGEEEEDEEEFFGHHHHHGEEEDDDCCCCBBABABBDHMPNNPUYZ\^^^][\]]^`bdeffgjkkjgb]\^]WKDBA@>?@@ACCFKKGEDDCBDEEDA?AFJIEDJKGDEFEA==>>ACCBDGHEBABEGFEEEEFFFFEEFFFIJHC?ACA==;;====>==>>=<=>>??ACEEDHVdh^UWZZQJEAFLQWUIGJHHGGFFEEFEEILMNQWZUUUPDIXZONTT^rvqrrrrrrqqsusmdKDgufXTPLT[Te~ya]]\ZXIECK\da|Yiw}|va`r[EOKKMPQNKQU[`efgWQUYaba]YWXRFFKghES{\L[TOWWY^JHKBQqtzsdTDCJKIJIGC]n_fqtrlmUGIIGD@@DMMMKKSZ^]GmbSYZRF>>ABJOIHJGEEEDEEFEDDCCGLKFDHIHHIKKJMLLKJJJJMQQPPOMHEEGIHGHNSVZ^^_SGGIR`]XWRNMNQV^a]XWURMRJKJIFLPKKHFNNEIOKQJH\UFYfeeff[JCPbU>:==;;TiT=?EGJFDP\_WKMUSKOXcijdR^aX^RJKIKTZUOQRG@CDEGHILMNPQRTVVVWWXYZZZZYZY[\\YWY\_``aa`acdb_^``MBDLPNJIC>>>>=?BCBCKOGEIKHDA@BDGGFFGCADB>?CEEEFHCDDEEEEEGHA?FGSnzmcab[[[ZZZ[YWOBKcoY=>GHHGDBA@?>@BBABDEDEETPRjmJ4pȨ{upt~tf`^\YWUUTSQSX[^ZUV[^daZ^``]YVOgSUeug|lyj_ewr|Ĺѿwmkrwqijke]ZZYWVURQONLIGHJKFCA;K_LL}~tlf^]]ZVOOMO[MWZgUTafVGPUQTNLKGFB>IF9.49@BA<2@F=>?AB:54576787677665410/24543.,++.2;856>CBBHOSV]ZSWSF9KprM74445:HVVRJB=965459@A===@CCBBBC@:2/2338:;8996457=C@;?ABA@???>?@;8@IJFCABDGHF@967866BOQKE=9:;95126?FFFDCB@@BB?99AC@ABB@?>@A:4548@GGDAAEGID>;;<;54;=;>CCCDFGHJIFEHNMJOTZ^bee`XQV^^]_iqpkni[SQQPLEBED:38===>@@@?@CCABEFB==@CC>:99;:6227<855566?DFCA@><<;86666569>DC;77=>>==?>:9986568888548;=>?<99::99:<>>>;97778:<;6245459:78;::99>?@74>>BFC<9;<:865589;=>>=;9<>=?FE@B>54899;;==<940031.,+/479610/-/3866;><81:C>6785451.-./12135420-.0465895331**+,,+.450//0:678B6)0:=:=ACD?951//1/,+3I8'(),131025455563142.1/).7@LGL_ZOMRK@DC;9775425987654632[N6::731+>TXZYUUZccY_kj]PB:97669>=:988996568:>=@GMPOKEDGA87EKFB@=AHGGGFGFFFEFGGFGILOLGJRUUWZZWUTSQNKIJHFEEEDDCCDDEFFFGFGFEEDCDDDCBBBBABBACDGGGFLX\\Z]aa[VW[]]_abcdfghkkkjhgb[Z\]WLDC@@@@?@BCCDCCBBABCDCCDB>>@AA??@@>>=<=>>>??@ABDGIGB@BFGEEFFFFGGHHGFEEEHJKHB<=?>;;;<<===<<==<;<>>>@ABBBCEJTbtgOU_^TFBCHXdXLOOGHHIHGEFFDDGGIMQS\_^VIDKSNIKLSeqooqrrrrrqqrroqtcEP{ycYZJN[ANasx^V^__S{XCCHYe^zXgw|{sX^tYGQOMMOPRTYWTUWXWTNPW[YURQNQNDB>DOARy]OZRITTXcKAEBXywpdTOIBDIJHHIGCUbhx~mXDGKIGEDBA@FMQSTTTUUS@kbQW\XH?@BBGKHHHFEDBCCDDBBAAACCB@@DGGHGGGGKLKKKKIILOPONMMJGHJJJIILTXWTU_^NIKP]dfhbRLOSTX]ciolbTQJHDA@CLQRH;>C@HLOSIG]]Q[eb_\VRHJ\\MCBBB?>HOIFHKLMJGT[MGP]ioqk^ZSKZaULP^HCORMMLIBBIECCDFHHJMMNPRSTUVWXYYZZZZZZZY[\\ZXZ]```aa`acdb_^`\HCKRQNMJ@<>><<>?@@DID9>?ACDFHIGIMHFHEGIQVQOP]qsvkqtudVSPOPRTZZTB:TrF@KJGFC?>>>@BBBDEFGHFUOSfnACλ}xsv}qgb`]YXXVTNJP[]ZSSY^_[alha_[Y`S`jeko¦qky[djt{pyȼǩ{ppntukefd_\[[YWVURNKHFEEEGMDBA=D]P^znf`_^]WNOLL^I^^kXRgpXKSUU_MIMGG?BO@236=CC?6:PF;A=9667;?ACCBAACCBB>:71/256673-++++-2@NRQOPRUWX]ZTQPPPNNK<40GRSMIIE<20357;<>ACFHILQTQOU[XMLUS9)-422HVMIA966547>CCDFEN]c^[[ZVGThI044455===@DDCCBA?<62214<>:8:964467>FC??@ABCA=:;604AFDFHCBEGHHA85788;9;GONNJHDA?AAA<9>CBBDEEFFFF=415727=:69?AABFHGEB?=>?@BGO[acefiaSQVK>AOfkipof]OKOJB@FH>7=B@>>><;:;?@BDHGC??ACC@<99:;9668<986545>FFCB@??=<96567778<<>????=98:9547766:;98:<==;88>FLLJFD?977523566458988:::888:;738<<=?>;98888:;:88;=:77765665328<<>>859;8658>?>>B=67;?A>:?EHIA76999649;9;=??>;88<>?B93786665689;===;88866413876:>;1++.643:=?;762341-,-.:F-'),-)(-/12441.-28535844;GSYT]aSUXXNCFJGC<67:6::87779:7Ic::<<:630RPHHLMOUcg[ZYI91/0479:;;97774.,++*,./1236;><;9:<<;87787544455554320.19ADECBDD=9A@77>BBDDDB=7445548:768:<>DHKLKKMSUPICCD>7;GC?KROUGGGGFFFFFEGHHGHILMEAHTVWZ\ZVSQQOMJIIGFEEDDDDCBCDDDEEEEEEDCDEDDBBCBBBBBBBBCCCIV^YST[\UOQUUUY^a`ceghjlllkkjhb\\[WQMHE@?@?@AAAABBBBBBCCCBCB????>>>=>>==>>>?@@@@?ACEB>?GLKE@BFGFGHHJKJHFFGGIKNI?;<=<<;:;=<;<<<=<;<>>@ABBAACEFGH^vcVSONJHCAJY[XYUJHHHHGFFFEDEEGLQPWmzdKMNOMKLOV^_elopqqrrqrpnrpjnhUhu`]NLwO]`]cXP[\XSy^CEIW`ZwTepy~|]_t}VHQPNLNPRTUUUTRRRVQMX_THRSJHHDDEDF9WaGKLHSY`fLADG]maRE?BBAFJJIHIG@JbWD?@DDCCB@@CGKNRUVXTOK9iaQVX[OA=?@ELKFCEG@AEIECDA?@@@?>><=ADGFEEEJNKLNMIGJMMMMLOPMIKKKKJJNRQLL]eUMPKP`ekn[GIQSTP\rz}{iZPIEDAESRNLNWZ[WJORKHZeb_^^YLFKOY^VLLLKIE=8@FIIGJOLPLFJMV_ceghgby|]GDAAACFORUWR@Ix|QFHEFHC@>=?ABCEFHJJJTOScm=ũ}y|oea`^\[ZWRLKQUVTSSUXWUTPKLY^Umm\~~t{ĸo}mTnmwvwyƴǪ}~uosrpsnhd`^]]][YXVSQLHDBACBELA@A@@SZspfbba_XQSPKbHchnYQhu]TXU[fMKPMK?HP;177CEA76IRB=>9347:=>>=?@@DGGHHFC>645779;<6/.----4DMKJIIHLKRXWUQOQPPPKIIKWSKIE;2.0357;<=?BGHHJNSSNQ[ZQORYD*+0-)07555431237=ACDAFYhgadggf_YA:=85455>MMIHE@<98888:@CQgrgI4C[YNMPSSNQSOM`hL5ALUWGB?;E\\NNR^lku|86CHJM]pvvkG/203Ml{e\knX::CBBB@??@BDEEB@?;53318B?989753115>GE?>AEHIJGA9328BEDJMDAGIIIC95668=GNNQOC:<;724:BKKC>?BEHGCBBBBEJOQIA?>=>@?EQ\`jkif\SQQA:68OkttttnR@EE@:@;9:;>????AAA@@@A@<:99<>=:99999646>BA>>@CC?>:76669:9B=>@AABA?==>?==:889CNNJJHA:7743676654787887767:<:65:=??>>;:99768=>=:AB;9;:?C:5;=>B>5379755>@9;?>>>==<98641.1667745569;<>?>>??>9325447567:51357889:7872//0/./-./0.)+.///0322239BFC=52/+*,,./0356862/69674*5BFBA;10563++05CI9:75,'&,00132/,-;GCB@?CC:;FA=?DFDBB?:767753378768;>=>>>>>??>?@@????@@??DKID@ACEGGIJKMMMKKIJJIKOOH?:;<<::;<<:;;:;;;==>@@BDCCCDDFCCTZ\SFEJHDA@AKQXVMJIHHGGFFFDDDFJOQQf\]\VUUSRSQTcmnlnrssrspnsqkmri^qu[[YXdlVQQOYXPQu\CILU\XyPenxpetzNFOLLOOONOOR[\XUV\XR[bUELMHFDCCCBC<[dMFAFW`oqK?DFRKDAA@CDCFIJJGJI?I{fD?BA?>?AA?@CHIHHJMSRNI=88EGEEEEJNKLNPLCCGJJLMNRSMIIKKKKJJJIHUf[MOKJSS`slVNTYVTcyyk^YZQHEHQZOWeptlkYMXSLIR]a[X^ZJILOSOQRRSUQF>:JKGC=:;;=?AACFHIKMOPPRTVXYYY[[Z[[[\]][[[[[[Z]`aaaa``bbb`^WLLJKROLMNMLJIFDA>?BFGD@>><:;=@AAAACEJLSaokR=;AINHDFKKHJT]lngaTJD=AO}M<9>?ABDEGIJMRYJA^~]OX^grgF=?@ABEGIJKKUORfeX˼{ma]_ab`ZUPMOOOPQRONPPQQRODTcTvk{ŷszyh`ysmyţҺ~|qlqsqpojfb_\]^^\YXUQMKGC@?@BDJC<@B?@V~pfdfca[VWYLdMipoYRkxb]^V_iSRRSQCOM@79=FC?9EQH@>757;<>;98530035679>>:6455667995100013@@=;;97:66>GRWVUUSSSRPMQOIE;1./1558;<=?AFJHIMQSPNY^XUUYN1,10..4988654436<@A=P_ZECGEMi{bQII`ZLoG13:<]jT>GOKIID?=?@CFGD@<72102=:@GHGGJORRI=>BB@AA@@BCCBBBDGNL@:;<@B@98513:<:@IJFKQTX\][VNHGR[SD=?ACEFBDEMIX^UNGCCD?:;6Agylkvy[AABA95:@CB>:;DEA><<>@@>=?@@@AA@A@:8;=@@;778987679<><;CHC>=;8689;;;:48BEC?<<=AED@==<:9=HMHDA=:88657<:43455567777877779:=BC?=:::975:DG?77;>>;:97:=92136;@;8@D@;99=A@@B@==:9@=23632233357767?A;>>>?=7531213878:88557889:=ABB?622105;=<:;>?<62//379999972121012115?@70....11//05>AA@>=>=7-*.0/1458=A<./74312CLIA?71661-*.48AC??II:8534434558=CHJIGEPdkkjjjea][ZTXNLJGHHA75440.//4<=Hc<7899AB?:8::0)+,-.//01225973147:;88876>>????@@@@???>>?@DGC??CEFILMNOOOPOOMMMKLNOPJ?::;;;;;;::::;;<<<>??ADDDDDEFGGCFPOGEFCCCA??CILKJIIIGFFEEFEEGIMQPYrgf[]][UPNWhngfmtsrrrqpqronopmq}zebiWWiZWQMV^ZSy\CHNSYXRfs|xntpHDGJQSROLJLNW_]YW\\WXWTJGGFEECCB@A?TmlcUEJZgyxL@EEDB@ABABCBDHJJHGC>D}WA?@B?=<=?@@@BFHFCBBGHKH=sYOUWPX\MBCEDGIBDGLGDFKKHA@BCDC@?=>?AEEEEEIMKIHHJFDCCEHIJOSSMIKLMMLKNQOQa`OHDBCB]|}ui`YU^myrbicjkZLLX^Qn}sqVXbPKMPQKHNZUONMQTQRVUYc\E>=;:;?DA>>@CFIPYUIB>;>FJIEB?@Tjne_WOF;78:95RpH7=?CEFFIJJKJGCN[Q=RzxbRP^ofF>@ABCEGHIISPQh^ɵxi^^afgcZSPPPNLKLLLLMV`fj^JVify}txd~x~}|ƿwptwvrnjeb_^]]^^[WVSOKHFC??>AGKIB?AB6Q}ndjkedc]Z[N`QnymWTpyc`bYahZXRWSJVOKA?CIJHJPUTMS_\YXYW9+1832;>?=9;:747AFE=@UinotqoliN4JdmWL83HVI@@@?>><;:767=CLRTQJ>:KVNN]jh]JCczuaOA:CR_^TJHORSQOMMLGDGFJV`VC>DED]nQLGQV9BeT<378>Ha{xiWZ\E;KmpJ9:DICBILLLKGCAABEGIIB834643=D<137:9;DC94589:>BFHIKKE;8=DKLKIC?CIGGKICBD?89AKLKHEEC?>>>=BB@@<<@DDBAA>=@JLIA==?A?;843=EFDHSVPLPW^accebPCQ]N><@DGHHGHHH:999647::89KWPUkxbLIG@88;>A@??BFJIC=?@;668::8666:>;8BE?:998:;><;;8:AA?AA;=AB@?>;;=@@@AADGB;:;<=958BFE@=>?ABB@>>=976;DD?;99;=:77:820245555664444457:>AC@;::9:;;?HG?;;;;;<;99;?;229::=AFJF>855:?ABA@?>98:733222123333467ACC>669437869::>>713467988:;977763245667DJG9000,+---09<76;ADFGC5+02/1443:G>,)3310;JQOD=8;?90+-00/10,0LYVWG<776:9=FIB>DGKRbc^bmkmrvofgSRNLJBBEH:470-/..4?:bO553334=1JT:<71036768:==CB4-0469;;933;B8)*+,-//12/04662..279877779BGA<<;8410004556?EHLI<;JPLIHHIGB?@@><95579;=????>==;=DGFFFDHNONLHDDIOVcgbGGGFGGGGGGFGGGGHIHGJPSV[__ad\PJIGEDDEEEDDEDCCCBBBBCDDDCDDDDDDDCCDCCCBCBABCBDCBDEDCCDFGDABKRTNKS]bcgjihged`]_^YXSLNPEBBBBABCCCCCCCCCDCBBBBBBB@>===>>>??@@@@@@???>>>@B@??AELPNNQSRRRSQQQQPOOPSSI@<;;;;;::::::;;;<>>>?BDDDDDDGJFFIJJHECDCBCBA@CIJJJJIHHGFFFFGHKNSTdqcdbO[faXTSV`b^bmspqsolnoqppqqqqpsujeZR^Z_SLQbgY\DFNRVYWfp~uqsmT?BNUUURMJLMKTXXXWZYSMKJIGEECCB@@?=Vu|pbVU]hzuLBFDDEEB@>@A?FKKJID<>=TXA;?@@><;<>@@@@CFFEBADELF;uTHNQIHRUL@?@@EBCENHCCNQI@?AAA@>?>?@BEDCDEINKFA>GOI@@CECEKQXWOLNNNPQW^]U[aUG?@A=\}j`VQTXWZagpwegxoWOU_WouxlSc`KLHF?7?HNLLMNee_VSWbk[@;BDBACFHKV[NRm~ofmpkligpaJNPLG>=>??AGJGEDEEGKS]]QID>=ADEFEKc`RKEBDGGC?>=B:;=@EKNN@?C9Zmhqogkl]W]R[[n}lWXsxhbd]be][TXURZVUHDKLBFHJID<0.4;>A@@>>;622/,--.0332445556766788874239==<<=;72.-/5AEHHJMRTNNXYYXX\H-'346;:<:@>;;<=<8579<=EOTRH>=@Lj^Fb~pdSQe|}hRNSSNHDA@CDFJNW]VI?>@DViVCFECTM;:6Lxsc[PG@MipW?:@<66;@ADKMJIHGGHHHJIE818?;457523687=LRF8379=BEEFE@>??==?CFFEB>?FFDJPOMJD<=GMMHFHGGIF<5357?DBA?@BEEFD@<=ADCA@>?ACDB@CC;8===><:9:<<97579:67<=;:9;<=>=:963=GC>??=?A@?><:;=@AAAABB=78<=;977>DE@=;7569@B?:78<@>;9764223345555423557:?BA?<;<<<=ABABB@@A=77;=;999847:99;BHID<63258;;:87664158643342037:<;866788721356741348<==<;:879<@BDE@>AA<7434687<=5.2:<:635;;8799853576668::82231//0/0588:>BFG@=4,14204302EE8)/31.2;A@>88>@=:860,*-++/DT`eOAD9>???9650//0009E`8559997=2UI276227:;=718>BB>;?<95/-/14433?EIIJKLRXWSNHFKRV\dktFGFFFGFFGGFGGGGGGGHILLOVZWW^]RJGECCDDDDDDDDEEDDDDBBDDEEEEFEGIIJLNKGGEDCBCDCDBBCCDCCDDDA@AFKKHHMPPRW[YSRSRPMOX]WQLHKJCCCBBABCBCCDCDDDDDDDDDDCB@>==>>>>>>>?@?@??>>?>>@???BFLNLPTUTTUUTSTUTRPOTVQJC=9:<:899:9:;<<<<==>ACCDDDDFIHFHIJIHGHFFEDFFFHJKKJJIIIGGGGGIKMQUYUEMTDQjcYZWUSUUalrmpvmfjjoroppppoqwsdYMTXbUONYhaaHDOQVYpSml|vorsjBCTVSQPLLOPHHQXXNLPJLNJFFCDBAA@A?=bri[VYczxN@DEEEHIHEEHBEKKIJFAEE@@@>=<<=?@@ACFGGFEJPRG>wTGJIEBCGIHPKP[E>EGDCBLQLDA?AB>=?@ABBDCDEEINHDBHNSLAADHFEMT[_YQOONNW^ih]^aXL@>D?PpgG@DIOI@A@FPUOOXd^VV[MYpt_ZjVNK9338CGDGHHN^T]ZRWdeN8;BCBABDC@ENYl~~oXHVpywobbU::>FJGABBDNbqoe[MFGHIKMNPPPRSTUXYZ[\^^]^^_^\[[[[Z[[]adcba`_`bb[G>?@@?>BGGLUXYPPQNMJFCBA?==>@AENUQNMNNJHMQRSNH@>ABDFOYWGFFGHGGGEA>:;?@>ACCDGHFEGGFEEEHGGGOWKEjq[IP^cK?CDDDDDEFQNTXê{ugblqkgd_YRPRTOJGEEAIR\NEp{[at~˷ttmɺɸ|pmqtqkiea_]^\[[\YUQPMJGDC@?@??@HPND>?:_}pjromljZUcYXeq|hYYrynbaaec^YT[X[]XTJLONIHFDD=/,7>>@BBC><;9841/456799799::::;<=;<<<;99:;<<<<;<;<:871+-2EW[ZYTRQH7.0144689:;;=@BDFIJMNMMPUVUUXV:(2;<9444@FDDGNSTSQUp{vt]@BZk`FST]PDBC@A@HG:799<=<8678:89>BGKMCJs~[LTgpiesqVMQQMJFEFFDEGKZ\MHD?FOTWF>;=@=::=@BCGIHGFEEEFEFFC6/6=;8533454426FTOB@BBFIIEB?:;>@@A@;?IPNILQNE=<>?>><;BEEFHMRONSUU[dgg^H7798;GQOGGFFRdxoH?IHDEEC=<;;9759BFHT]WF85;>@@>?ACA<>@@@CEE?>@@ABCBA?=<<===>=<<=>><::;856::9:;<;;:::9516@B;:===<;==<:89<@BA@?BB=78<=<976;AB?<@A@AA@>=;879=@B@<98;@?<:7642224433788899=@CA@CEBA??@A@?==A?==;56;=;8547;;968<<<=;732477546<>;:88644357532343018;98535665643467974645:=>=;;:9;>@ADHHIHB?;2048988:810565425;;9899977887774214548@C>9668>FIFEGG:.//231/122.@@CC=9;83537265>FRYPJR5002454442..131,,,-./013479:<<963/26;;::;<;99=>;7412232119BDDEFMYZRLJJKKHJTTKD?:FJKQUVVZ[XPJLOQ\nqvFFFFFFFFFFGGGGGGGGGGFEHMNHDPZTIECBBDDDDDDCDDCCCCCBBDDFFGINORSSUVWRNKGEDDDDDCBBCBCCCBBAAACEHLRVSICEFGGFFGIIIKQVUROMJKE@BBABBBCCCDDDDDEEEEFFEEDA?>==>>>>>?????????@?>??@?ADDFMSSRTUVWVVVVVUSPQUVSK@;:9889877:<<<<<==>@BCDDDEGIIHIJJKKKKJIEEOTPKKKLLKKJJHGHHHIKMPT[\G9B@Nec[a_TPPQamlgnqebgdjpoooppqqstjq^NIQcUROSYgeMCLQWXnQusx{tmspkJETWQOONPRQKO[\VNIHJ^mfSEBDB@@AA???AGLJIIIOQQIA{VFGEEDDBGJVqi=BBBABCHPJC@@@>>?@ABBCCEEDFJFBDJLONCEIOOLRZahdVOQQQ[bnkfeaYOLB@?BKJB>@CDBB@>?<;>EHU\OMRF?`xj[jlOVL>LOIFIFFFKQLCU]\\]XC8>CCBAABB=:CcyugRB=C^v}n]\\UVROLGDA@BCKatthOFGGIKLOQPQQTVVXYZ[]^^^_^_^\\[[[\\[]adcb`^`aa_UF==>CGINOLKTSOHKLKKGDA@?<<=?AABNZWURPMKROJNONLEAAACKXXPJKPTPJFEFCA>>ABAACEDEGGDEDCCBAABEEKKPNFd{XIVcZFBDCDDEEFQPLhϵvofkzykca^YRPTVQJE@CFIV_aXpv}°ĴpstĻǸvmoutjefc]]]\[ZYYVROMJGECA@?@?>@@?>??@@BB@A?>???=?IG@<<;==<=??><=903NZXXUUVSL?50245799::=@?@EHHJLLMORSRRU[M;HHA8/16EJHKPTTRRSTsw]4/OfgPW[[YHCI;BPO<1589;=;87646;;9;ANUPhrcTII^qk_vlWMPQOMMKIHHDFCI\YFFI?JUPWbUCDUWOSF?>;<75Oulc`SD=BHFD@@?>>@CCDFHFEDEDDDCDB7/5;:?>?>;74304EQMIPQLJLLF:69CFABEA729AB@@EHGFKOPMJJLLLKKIFGFD>3/35:GOKIGDBDFECDC?@B?=BKOPOQRLC>@>;=BCCCCA==FLPW]YZdmcM>87755DTSK@>EUmsN=GKGKKA>=;;:8::<@FMQJ>5/35:>>>?@@?BDCCEGHFDBABBCCB@???====<;<=>>>>@?96:<;;<;9653578559;75;>>=;:;<:866=;;==><:;;:;??=:86421246129<<<==AFE;>FKLHB@BC?=9::877:><833:?=:89:97655569<=9547:9877522322442245448988645652464568::;:438=?>;;<;=?AAEMPNGAA@835:::68;3/0/0214;;:89::9::98997554317DNKEBACGKLMOPK;02421.--/3/2CM?322-.611GSLLSE1036@D?4337<=?N`]?OX]]hfI7UWNG<699;:<;<9=;.024443311.-032.-,---/1346;<:::;:106>?=<;:647<@?;75532101454:IRSSRMKNNMJHJSTLEA::<<;<=;:>FHD<=DCFT`[SY]XPKJGIc~FFFEFFFFFGFGIGFFGGGGEBDFDAAHPOIEDCDDEEEEDEGGGHGHECBDEGMNOQWWVUUUWUQNJFEDDEEDBBBBCCCCCBBEKPSW[^]UKGB@ACFHHHILNPRSQRSRMECCBCCCDDDEDEEEFFFFGGGGFDA@>==>>>>>????????@???@@@@?CLSTRPUYXWWYYWVXVSRWZXPGB>7799887:<<<<===>>?BCDEEGHHIJKKKKLLMKHFJW[YVMKLKJJJHHGHHHIKORW^J=DGO`_[baWQUXajf`\ZY`d``gmnnoppqssnml^NPZLKRPGWyiYONSYYpVsvkduhmug_KFQUROMNPPM[lp`TMEAPl|w^EBCB@@AB@=jtnTGPg~WJLC>BTYVVS`hXGILJGD??BBAABBBA?????@@BLPNLKKQPNGCTFFEEEKKLHDSoU?@AAA=CQQLGCA@>@BBBBBCEFFGGECDJMSQOOIU_OOYckp`RQWYU^hflia[Q[ZGBA?ABCBA@DBAAAA@AHKJSQGUYJKht]XiUGXRj}nPDEDFFHMD<@BBAABEF@8GiveNA>ABF`tm`ejgcf_LEECDEEDNbiaMFGIKMMPPQRSTVWYZ\\]__``_`_^\\\\\\[\`cca`__``^[XNGHPZjpnmonlUD?BBCCA@>>=;<>@@AMXWVSHCMTLFKMNLKEB?COYUPKNW\WOIHIECAAABABEECDEGFEDCBB@>?BESSGPPG^mFO[cQEDEEFFFDQPHǨznou~yja`]XQQWYRKGDIUT`szfrlr{nsxȿzqoswpged]Z[[YYXVUSOLJGECCB@ABA@===>?6348;>DEDCBCCCEGECB@AAAA?AMPJEBAA=<=?>=;?DCCQZYXUUVUUQD:64688:99@EHGHKLLOQRQRRZ]QMQB6/?FJMOOQRPOPRN[zm7(LliT]gkl_IH=CQUIGJB;>?<97637BDEJLOQO]kG>IHeztukZbhZZYRS_YKBFHCG?J]WAFI@KOBUkWJL_`ONNAM`U;6Da{vsrdNGONPIDC@@?@CAADEEEDCBCBBCB;=C=;?EFE?83426GTOKTXPLOPF93;=CECBB>::@MRW_a\\YM@:::;8;MXTPIIPXh{qTCEHGHIC>><;:8::@IKD@:300=?::=?@AABEFDEFGHIHDABBCCDFHGC=;;:99:;<==>>;879:;<=:5545688788879=??=;:;;:767:987997666559;?AADA?>=<;<=978<@AC@?<;87632257329;====AB96;DHKJBA@A?=:=A>:89::<>:634;>=>>;;<<86:=:;==;7337:9654222135863679:648:87553257567889;:648;<==>@?>BJPMB>?@;57<<845:41..0247;:999::;=<;=?<7561--5=BCGOPLHEHPVSI;76875333130.7EG:31..23;OXSX\H439:COE603595,Cie?8>??A=3.-.026BH?>We}oWZRPN919;:;<;;<665bL8OXU\ivmN:?U[TLD=;;:?=<;9536=@=8633210010--7JUUQPOORQMGIMNOJEA;8:;::;;;;>AA;<;4:L^\XYZWOHCCMhztppFFFFFFFFGGGGIHGGFGGGEB@BBBEGGIIGFDEFGGHIJKORTVUTPFEEEFIIKOUUUVVUTTRPMIGFFEECAAAABCEFFGGLSXY[\]^^[TNGBABDGGHKMNPSSRSVUPIEBDEEFFFGFGGGGIIIIIIIIFEB@?>=>>>>>????????????@@@@HPQOPSW[ZXZ\[YZYWVYYZ[VMHB:9::987:<<<<=<<==fujWNO_xmc\HAJVTPORY_[QKJKICBCDGGEDDDDEEDCBBBCMRRRQOPMKEF|ODEDEHQPMMG?8G\PAABA@?ITZ_UHDBDFCBAACEEEMLGDDDGQ]YXWMXfWKNYgql\SZdYV[Zmrb[S[eWOMHECABA@AA@?>??BMKAJdhossb\iYXXEDVYjFBCEIFDJCDQUMME>@BBA@@BEIH?9MigOCHNE85KiqorjPH]^JBCGKNOMNYYPJGHJLNOPPRRTUVXZ[\\]_`aba`_]\\\\]][[_bba`_``]YRNNMIMOW[`honsmD3:<>AA@?>===?@@BINOURCDRWTKGGHIKIC>BJOJKQTVWXURPOJEBAABBDFFCACGKHDCCBBAAAEDfcHMNCZWERa^MFHHHGGFRLSԷrkv{njd`\VQUZYQKHNRb^ey~d{quyuzpprvried_YY[YWVVTSQMIGFECDEBBGGIF8>OF?TKj|uxylwgaV]jRYrysef^hzvc`efbaWSb[caYVMJ[\XRJNEBNPG@BLPJ<=>>B>757;>DLNJHFGGHKNKFFDDDCCABHPSRPMD?;>?CFGHLLJNQQRTPPXWISB36PVORRPOONOPPNEScnpJ@^vUC`jme^VUFANdmfWHACA?=;:8=DILLLKMKI]vr^hlwp}zhXO]}o`ZbhZE?BHNRLM_XJGF?FG?RXMSPTSLBWMJiM4/7`|macZHKVTSRKD@>AAA@AB@BDDBABBCCCFLLB;<;=?=9766FOUPDC@ADDCBDEGFGGHKGBAFJIKPPIEGIIB<:>GKKPSQMLNMF>CGEEHC<53=IPOSWWN>=A>?CFEDDCBAFPUTU\a\H<=??=:=EPZZT]e^MFV[QIFDEBBEA?=;:9=GXa\N?601>PI:=EFCBCEDBCEFGIKLE??@@CGKLKD<9<<9888998877766:;::967799:99999::;==<::9:::;BDCA??A>;9<=AEEDEJE>;:99;:545798:;<;;9:6/1;?>FGB>;;<@CGHA<:<>CA@;658>?>@?>>?@>;?@98;876325887642344578538:>>617<9733236856677788769?>?><;:AEA879=;8;?A5058741036=<;999998:=??B@:422/,0;>73;JSNFFJMJD<6259<<=AA73322;DB920..8FPU\bQ75=E?FRL;427>;07SZ?8<@DA>?;8766:;:75>Jae[VBBD4/596566;=91F_38HKUev|pQ?FBKTUTF<=8@668871./0/./1/-,,,,.02358<;745:;857:<;=><;78:;73422100///..3?NVVTVUJA@DLPMKJEBBBA@@>;=@=335583,1@U[WX[XOIJQ]ccXTcGFFFFFGGGGGHHHHHGGGFECB@ADFEEGGGFEGGHJLNOQVZ\]]\YOHFFDBBFOUVVVVVUUUSPMJIHFECAAAACDGIJJKNQTW\\[\^][YSHA?ADEEFHJKLLKJNRNIECDEDFGGHHHHHIJKKKKKKLKIEB@?>>>>>????????????@??ACGGEHPX\[[]`\X[]YX\]ZZ][SKE<:;;:879::;;;<<<=>=@CDEFGGHHIIHGIKMPPOKINZ`PDKLGFHHHHHHIJIJLPZXSa_KKZ_X\cbbba`Z`s{r^QKJT[_cefiooqmpruuoh`NDJITbRRPT[\jYp}s\}q`}kDF@DNYZMIIOaq{t^TTYetv_LECABBCCA@?dt_KKIG_~vo_HERVQRVY[[ZVPMLNKFEGJIFEEFHJJHFDCDCHORUVTQIFCJxJECB>M\QDFIGC=:>ABDCBAEFNZSEBDRRDA?ADHEER[QCDDCJRTTVWemfUJMXcqn^Ugg```orf\UOX\[[PFBAAAA??><:==;HJAG_wqbg^OW\\K@XnhUB@BLPGDFAUibNFECCBA><=AGLIBFXbVFMgylSCJboj^J:AJOJBCIPRUTSZ^VOGHJLNOPPQRSTUWY[]]^`aceca_]\\\]^_\\_cca]]_`[NMC=FA><989?GFE^T89=>>?@?=>>>??@BBDHJFBMQQVSJDBBEFEDCDDDGNTQPW][VSOGBBBBDDCC@?ELPICCDCCCDFE@McLHLLZHKWcWIHIHGGHSJsƯ|rvyqlf_ZTQY_ZQKKOTirh¹zykwurkqvzmegf]WXYXVRRPPMIEDDDCEMMEJSPLECPK=ONg{|yymd_hjM]womipbe{wd_decbWRf\cbXXLH`_bVMWPMTKHGHOH>@DFGIJHKNPRVRLNXQO:0YechnI8QVL9;PdRFUijSCCGE@>=<<;:>JNMKIC?CB>[}uwh~~bUQLV}m]]_VLGFFIY\TO\ZUIA=ELJVTJ[ZTJFAOUEM<2/O}zza@CDA?AACCDGIE?<966:<>=<<>FMNQY[UI>::@DGGGC>>DE?9::;:9866557998::77768:?@?>95445789989;=@ABCA<8449;;<@D?86531159>BCDCBAAC@>=9767=>==<:963114;>=AEB9327>ENOH?=@CFEB=:9=@A@?>??@ADC?<78><8644447:964577774038;=?;69:52000489666655668:;=?BCDA@A=9757962248;<@CE?8;<;7426:??;89:987:=@A@<3.--.17=>;77:>@BKME:64359;==?AA;448989?@82/.39DP]YA6?GKBJSO=338?;628@=8:>@8CTSOC;=C?<=:55=et\iN;:91..020/04423^C-349ZojrrPA_G9FPQG?@6.NX2:BA=:<<<7/.00///-,,--,-02358<<;:7568:8668>BA?;975423320/.//00.,1>NULED7.4DQQJHIHGKLIGHF<7<@83100/..7ITW^^TMOW_f`QFFXGGGFFGGGGHHGHHHHHGFFFECBBEEEEEFFEEEGHJLNOQVY\\\][VOGDDDDGOVYWWVUUUURPONKIHFCA@ACCEGIJJJLQTWZ]^^^\[\ZRJEBBCCCDFDCCDFGGEDDDEGGGHHIIIJJJLMMMNNOOMKIECA>>>>>>??>???????@@@@@BC?=DT_[W[c`TR\\X[_^[[^^ZPF>;=;988899::;;<==>>>@BDEEFGGHHGFFGKLNPOKHLRJBD@=@DEHIGILKHHJLNV_g^A?\gZ[df]U[^Z[fqfM@?EKLWdcVZlqolwqtspnphYHBc[JILTY\eUp|g[lcBDCIUb[PMJLgwwj]WWh~ugZMFDBCCBCCB@@jlUHIDE`tcRHMTUW_efb^[WSNJLLHEEFFFFJMNLIGHIGEDBHTSTVOGEAL}JDIIGNXL@AFEEDAAA@?>>AOPIEDEFN^^SE@@ENLCQkdEA>;BE>;>>9@MD<=>>=<=?@@@@?@@>AGJHPY]fql]OFEGFFFECABFMTOHP\^YWTKCDDDDDB@=?GOOIDEFFEE@B@B?kZLMNXNIP]^LFGHGIJUGӷuyyyxmd^[TR[`ZRLI[caqjqplzlit{uffjdZUVVUSONLLIGDFFFFBFTQ@FWQMNVTE?J[wy|gbjlVXhhkpvhh|yjacghe\Te^aaYVKMZ[d\R[UUPHTIHF?ENEGG<;==@A9,&)/1/6?HJKJHGGHGEHLKNPQQQPGB@DA?H^lg]VUXXXVTSUWYXTSRRMD>;;AA<9;?CEFHIJJLOTTMJSYP=;O]SPZ]YSNOOMQSTMH1>Ycir[=340-/Eh\T[XE55AFB=;::;9;ERTNG@8>E9B}karXs|aZaZX|lnc[\RHJMPMP]\SPTOQJEEWg^]ZJ]keNDFDXJ?C@?y}|zuv_7/<>=:<>ABCCB@BILP[_S@6765?NPONE8:IQJEDDDEBAFKPM:1356778>CDFFA>EKMJEKTPKGGIE94>FEA><<@@?@NVY[YPMTQEEMLJKOUY`]PJHH\thG=CDDHJC@Wmgt{aE=@DJMLC:;?@BBC@;7CWer`C5464DPLHFEFECBCEFFHIE;58:<=?@CFECDFGE?AEA7344546;<99:=@A@><974358:;;;:76434437=@@AB>>@ABCBACFD@<;9:::;;<>=;867::<>=:9756:;=@?@B=21124=HMMIGFFGFBA@@><>A?=>@A?DE=65BCBBFCGCBA=986665415>>:758>>=?@=8668=2,5@B9458=<<:8896420/.///00/026AG<10--7GPOHEFMQQOMJHIB22@E=740-./18FV\VNMPV`e`SMS[GGFFFFGGHHHHHHHHHGGFFFECCEDEDDEEDCDFGHHIKNSX\]\[ZXUNGDCCELV[YVUUUUTRPOPMJIFB@ABBCDEFHHHMRUVY\ab_][ZZXUOHCBBCCBAA@CEFDCEGIKMMLLLLLLLMMNOOPPPQPONLIDB@>>==>>>>??>????@@AA@BB>>?CGEEGGHHGGDDGJKMPOLJKHC>758>DGLKIMKIIIIHQ^bP=Mdf\PKW]WZ\YZ`ZKGLJGGO[a`YV[\jfxonsqjlpnYStyS@@JRX\aSm|zw{eVVACJP[_TNIGGRildmmflogXNJGEDBDDDDCC?@vrYHHMZspb[Xd`W]jlga_]WPJFEEGFDCCEGLSPHFEHLKHF@^w^Z[NFE@NNCHRcbNACCBBBBDB@@>AILU`TDEKXeji^JAAFPNCRtw_ECJNPU\o{ojcYX`_RKFHTQP[it|kHIKLNQRRRTUUUVX\_``adffddcb`___`_^\^dcc{vQJūD=>>ABB?;=<7;@=<;::9=ACCB@@A@?BHPZZ`tveTLMLHGGGECAGOSMEL[^[YTLFEEEEGFC@AIPPLGGHGEGFBHCBJh[PJTRPNU^SHEGGHMQOϱ|vztsnke^YTU^_ZTQJ`}b{ǰˬ`~h{eȹ|swyvnpwtf^ac]VUUSQONLIGEDBCEFEDANcRCGKKJIIGEBAAA@><=@A@ABCBCEEDCGOTV^_Q?842.2BLLJD;:GPIEDDB@>COYXSQF80/113;DDEJHCGID?@KSSMD===86;<86:@CEBA@NY`b^TNTTHDMVXUPNXjfOJOO[pkMCMMJJLGBPir~tL:=;:AEC=8:=?@?<:7778DcP4585:HEFLLHEFGC??CGIGB@BA:6:=?>?>BIGCBBBDB;>DC=>DA::=>>:9;<:99:<<:7689999999768:;:;=;669;>AA;9>AABDDA=:9::;:99<<;;::887558==:87:=>;9<@A>943579:@FIHEDBCDCBB?<8:??;;6789997;BDEDCGDCBAAC?::;;=<56@JICBDD???A=98;>>9FK>7DB3-15249?EJIC><;9402::61046544566;=32TplQEERN9,29==8225;AA=1.9?DNI78@??>856;68XkhK679753/-19;1++3ZF0/4-3^iz~y{X]Y@&,0440*-RXDIIHF:AED?4/12452-,--,,/148:;<<<;:;=@BB<8789;=<<<9642134542358<<<=;720/5?JNLIHKUZTOOJFJG61?HDA?6-+,/49BGGKOHN]^]\Y]`GFEFGGGIIHHHHHHHGGGGFFECCDDDDCDEDCDFFFFFIOU\^]\[ZXUSMGA>DOWWTUUTUUTROPPNLLHB@@AABBCDFFGMRUVY^cc`^]ZZZXSKDBBABBA@@ABDEEGILNPPOOOPOOOPQQQRRSSRRQROJFDB@?>>??>?@?>???>>@AABBA@?IVREGOJADPRLNY_]\`cbcc_R?9;;::::;:999:<=>?>>>AEEEGGHHJLLFEIIKNQRPOOLIE@>>AFJKJKKJJJIHKSTKN_ec`M=LMIKMKOUTPMW\[bdb]TgeOFIW^[UQQKMOH@?@@A@@A?ASfow||snO9GRgjVp_AAGB@?CIJC<:;?@B>>?>=?EJKJIMizulgfcSC?CLZ``oyLIKMOQSTTTUVVWZ]_`abdffeeedcaabab_]^cdaqڱdx?@BAAA?<=>:79;<<>BILEADDDB@?>@GQTMRdg`\UPLJMNJGGEBBGLOMHNZYPLHFGGFFGIIGCCJOMJHHHHGFIJQOI@i~[_KL[RJPX]OGHHHQGnȲ}zlfje\YWY^_[XYNYpŮòuYxjjʹƱmkpoptvpdYXZYVTUSPNLKHFDCB@?CHEDDJ_fSN`[JW_WQYowxmklklc`\WpwqpvcXpsih\eg_bZTSWMW]cRNU[R[[KLVWSOLJHC>831220--10/-+,/200-))*.17@CBEJA:ESQ=;EQLSPFLZ[TSUXXY\\^\ZXUUVVSKA====;>CCEHHHHIKQUQHISVEBUcc_PFDJNIGTbifW<4IXcjsrJ21:C`~_915<;<<>@@>81177cfN>FS^`WRw{v_]bVBESXOW]YOSI<@K[dvlF?\kbp{YDHCF\KACH{|{ZHCABA>=>?@82=HG?67AKPQPNJFB>>>AB?@CCCFECCCCDDDGNTY^YNB942/-4CLGA=;?HHFDCBA>ESXJ>>G@6356778@?=;99;?>;876981:YK94=JRZJEJILPMJ@:?>?ADCBAACGD?AA?CD>>@?<98<=98=><;<=?ACCD?<>?<=?BB?=:9777777557;=>>;9679<=<<<>>>=<<;?DC=;>@@ABB<447:=@>969999;<;:989;ACA<9;==858;989999;>?>AFEC@<=AD@<8769=?<:=<<=:7789;>><:;;4,-79536;@EA888:998=>><<;KF>??BD@?@ABDC:49DA>@A@?@CD@<9:9997762/19?;45970-,-?F9?QQ:(6NL;337=@EGGJE@<;=>65;3-.570/37777::45QniVGGUH1-6;99:;531;<4/77+0:6124447767883>XP537;><;8?LQRC1-HW4-1:3:egt{ye\[M)*/..23-B]FFHHE9CF<94113563-,+,+-/147:=>>>???>?ACA;::;<=>>;7668;<<<;:9:;<=?>976204>ILIMTTY]WOJIIKH:19ACIG7,+.6C@87EPPROJJXHGFFGGGIIIIIIIIJIHHHFEDDDEEDDDEEEEEFEEFFHMW[YYZ\[XTRNIB=BNVSPTWWWUURPONMNOJDA@@AAABDEEGMRTWZ^ceb`^[ZXTOICBBAABAA@@@AAABDFHKNOPPPQPPQQSTSTTTSSSTSNIGDCA?????@@@????>>?ABABAABFGEAAC@?EOMCI[`]]beeccebTB9;<<;;;;:98:<=>>=>>?AEGGGHHGLUNEFHHLPQQRRSSQOMIINPJIJKKJKKJIKJRdkbaf[KL\eZHLUQKU_[OO]fc^YTZNZd^~p[s}sighijMCJJJMQPGAFGHKQTcsyylK:BPUUSNKLMNHMX]cc`acucCBFJ\\JCMQRm~a?=;<>@EFDCGJOW__OBGNMGB?=?GSL@CPWVSUZSLQTNKGEBCFGJIHMQLDB?AGHGFHJMKGGIIGFHIJJHDCDEYVJHj]cM[WMPU^VMJJJLAѽumib\_b]Z[^b]]XP}è~sTpxɱ϶qiikkksqb[WWVTUVTRQMJHECBBCBBEIMC>GPV^V\s^EU\[\jy~gqyv^koeWXowuxaWusklaek_bVXRYNS\aOOZWX`USYXNRSOMH@833110-,*(*.012585430/-*''0;;DLEC?QcB42?@QM:J[\VRSUWY[\[]__[VSTW[UF>??>=@BAEFGHHINSRMJLTND?VaXA;@CFFM_mrmX>;M[`eutF,/7?XnN439=:;;;=?;2029?HTYUSOEFLQKB>`ulWEEFK[aYVu^EDKICJUSL\ZTGWB59@QW]G4=Ocpw{SDCA5YbZJ=ajOIHGGHGEB>54AR[O>?HKMRSMGEB957@E?=?BHMJFDC@ACDEFIOSQLA744433<85AKHBABCBBEA4-3>?968<>>@@ELKDA?DD>BLQND745668>>66@CBHKLO[`\\`[NMQIMivcLNhvdMR^]SPTTPPPMKJNP?9S]J?;95<@==<<;<=<;;:9;><>KE>3Pk\XFEKJOURI=890/;@<;>>=@@<;BKJEA<987678;==<9424688878<8668<@>;:;;:BA?>?>?A?:759ABAAA?=;89;>A?<;<>AEGGC?>@?9651/5:86679>DIKIHC>>@@;41249JKHD?<:9975557;>@BCC>979;<<<::<7/,-/2456=FJH?<:;999;:9788KF=>@A?DHFCBDC=3/578<>==9CJJIDEKEA>>?D?=>714:82038<81/3.,387526;6,-./9>4-269<<<8115764721;7059?EFEELW^aR87UC32286J[D^{|U^XG603104858TLBJHC:EC433336653/-,,,-/136:>@@AA@@@@@A@>=??>=?>99;;<>?><<=<:979:::851//8@?AR[UW_[K>>DDA7-.5?GD4-39<@>845986;>EG826KHGFFGGHIIIIIIIIJIIIHFEEEEEEDDEEEEEDEEEEGGKSVTVX[[WTRNID@AHORTX[ZXXVSQOMLLMKFA?@@AABDEDFLQTX\afeca`ZURNIFDBAAAAAAAAAA@A@@ABEILOSXXWWWWVUUUUTSSTTTSNJGDBA?????@@??????@AAABBABA?@@@?@BEJH?FX^\]bffdcdggZH=;==<<<;:99;<=>=>=>@CGGHIHDCSXJDGIKNORTTTTRQTWYUMFGJKKKLMKKKIN^faagg\T\_RKQQMKUecKDT`ffTBPO[d_xmWrpsiwSFEHQO[\^Xmvick|ia^[WQQQMF?>ADCCMVJ==CFFDCCCCCDEEFEDCF^mZRS_utxX@>AH\aRKJHGEDDDFJKIHGEBBDKNJIGC@Az~eOFFI@ePBKhy}Q;AB@@EMRRIE?>SUCAGIDAEKLJKJGOdb_jsvpXFEQ^a^VPMPUVW[Y^gXPalZHIJF[ZIDMTN[{hI>@@@?A==;<=?HPRV\]VYgwmVPanjXJShqjdfo}{rVILNPRTVVVWWWXZ\^`acdfgffffecccdeb^]befc_Yc̬B@FABEILORTOJNW[\_`THKRQMIB>@FNE@GdiYX_d`ZVROKHGEEDEFGGHGDDDEFGHFGHLOMIHHEDFHIJKIHFEDHYTIZUo][[QOQY\UNMKEQϱynkh]]jmd[X]^JblNyѽ{{xNfϯϼzlggjkjkg][YVSWYVSQNLJHD@@DKIGFFXYGDMRSURcs\AMWgWgteq}ZiqgVLcwxu][zolmdek^_RZTZQM\`MO]WY[VVWUSVTQMI>8520--,++./-/22351246771.)1;;CHJN@GgW=E\WSQFQLV[TLNRUWWWY\_`[WVVX\WLB;<@@>?ACEEEFMQRROJPRVDKUB;BECFHPcortjF;L[`iyf9.08>CH=;>==<=>><<611224BRSGA<9=CKQTR_J>XSMGLV`b]eu~vZAFIIJPROM[ZEE\B8:=@>B63?DFO_bA=B?6StveHJhryZJJJLQMIC82>JNUQGJMLNPPLFEB6/4@F@GF@?DGA<=>DKD;=>DHIC@<4`sSGFEKLNLF?76?@A<7;?BACFE??<=AJMMOE95334579:<;5358:;=>=>?<::65:=??<889989=>:;>=<::;<==:8ABCCBBFID;:959@@:87537=EGDCBB@@?96566:@?:997>HE><9544213568:?EGHF@<=@?;:98:81/212357:DHHGB=:86457:99:AB<>A@AJQKCABA<5..2588752379=;72.,-0455=?:<<8;?<;AJI3.@PA4+'/EHAAKONLCCJEBBB?;>=<;99960025:;4/3EKHYk_C?B50./7<4(+781*+4<:6;==??BCA92023355:<52122357752/-,,-./1468<@@?=:=@B@=::;<>>=?>;=AC<66898898998756631125516MZRS_[E237852-+0:?937@>60,.3533579A@427FGFFGGGHJJIJJJJIHHHIIGFEEEEEDDEFFEEEEEEEGGJOTWYZ[[WTRNJEAAFNSWZ[[YXVSRPNLKLMH@=?@AABCDDEIOUY^dgfdb`ZQKJGDBAAAA@ABBCDDDDCDCCBCEFJMNOQSUUUUUUUUUUUUTQNKGDCB?>??@@@@????@@ABCBBCBAAA@?ABCCCABMY[UWcgeeeehkbP?;?>==;;;::<=>=>??@ACGHIHE>GWSFGKKLORSUUUTLQYOC=ACGLMLMNMLKKKNSYaikgdaUIU`URUZ^UD?HScfUKSOVd[onWlv{tztaHAHNNX]Z_rh]g~~nhb]NMTXXJ@@AFLJFKE=<@CECCCCCCDEEFEFEDXpXQT[tuvmPC@B@JedSOMLJKIMQMJJIIGFFDIOQOGDB@8SxlUIDEHAlPAHkZ:@EB@HYenYE?@MTE@CCCDHSPRTSQ]rkTM[h_NQVU[bgc[VXZZ[^SQ`QGZUKPRKFQM@FJOSOGRkT?@?98:9>Th~~s\mzmg\xniiVIKKIEDDDGMRO\vxgjoK9<@FEDA>=<>DILPUX[aosqofRCCGN`cUJPdpohfqYWRMKMPRUWVWWWWXY[]_`bdfggggeedbcdec_^adceiiXepaX>ECDINSWWTKGNZ\XX[ZTQSSQNJC?ABDP\mbTU\bifXQNKIHGFDEEEDDDEFGGHGGFFHLPOKJIIHFGHJJIIGFECHWNFrVv[]XNQ[^[WRMAg¨{x~qib`imllh`Z]ZC^\jӥ{~}yyJcyӿɭtjdejkjfb`]WSTXXTRNKIGEDA@FOUOFDPd]ECRTSWVgr\FKffdlnqachcbQYpqz}t[ajmkhdl]XPXWZRK\aKK[XWXXTRUWVVOH>57:1*+--/11.,-..02.,/434698=@:;>IF@?]_Tgi_VVUREO_UGLSUUTVWWZ`_][XUY][RA7=B?=?ACCCDIMQSRMOPSSJ?<>BGGHJQ_nuyzO8JZbjve<18>>=>@BA?=<=?=84211114895015<@@>DPifJD??@=73456666:AB<518FQUQHDA<;74236776974>LIA?BC@>@CBEC<>DD;65434446=FJGGHHILX\^b^MA>>>?@@;:?FJPVRK?TXCHMGINMD:76:>@?@@@?A@=?DCAAECABDFHIGC@AA@?=;=CGFB<:<===?@BJWR=6988;;;;=<999:<=>@=;;;;:8:;=<=;98758;:88=><987:;:67=FPUUQE<@FIHD@=?A?>?=<>A@??CLK@<@B@CFDCA@7027:948?BA@A?<=?@>@?98977B@:;84343234557=??><;;>:426753357579=<;?>:9:;<;;::;<=AGINRND>@@:52356674.0017=?=50./3895774:C;5;@BBHG2,4D0.+,,459ENONMDCF?;>@;;>206:;:6-,06>FFDCE?:BOG01017307?6,+.44.059;>?><:9:94;@HSUTVRNJOVD:><;BGO_T;:F\t\,Ub6/20///152=:647@DC>9778:;;=?@BEFA>;8996669;96553115730..?TSR^U=001111101686:DIA50/3:==>==>><=?DLGEEGGHHKLJKNOOPQNKGGFFFFEEFEEFGFEEFEEEEGHHKRY\\\[XTPMJEA@DJQVYZZZXURRPNLMNOJB>@ABBBCCDEGJPX^fjfba_YQIFFC@AAA@?@ABCDFFFGHJJKKKIJJKKLNQTUUWWWVVVVUUTRNJFEC@>=>?@@@@?>>?@AACCCDEDBA@?@AAABB?AQYJIajbbffgjlfUB8=@===<<;;<===??>>@CGJKIA@OUKGJJKMQSTUVUPRN==EHCEMNNOPPONONLKNXfpqrnXGRZNMXZRJECCIW\WTPMYdXkpXkklyoLFOOPRY^ea\ey}xnd`\PRV[[RJFB@IQMFE@AHVZYYVVhwiOHOUM>M`_\almhdd`^_^UGHBAMLGSZPGFC?IIJWZH8AC>BIIHHIIQ\got_Ykruy|gfbWXVLGIIIGFLTOOk`SqYLJDEHEA@?0-0465552..-./0.-.0-,069@>?@BBBCEINQRQQQPTOFEEDDFLORZgsvyQ8IZeltp\GIE>@A?>?>====:732221110,-159>BC94>]l`RbMECAI[b^YR__>KTTY_`]WE78O`A>AFDDD?<>@99B@72299EeTOZXKBMmoOHHKLJMD66JTQOF725ALJEEKJ=49;<@ADOTMKONJFHI@9@GDFK?0368777;?<613>MSPKGC?<<72257752245>HFA@ACFEEHB<=?@EE<33544532:HNMKJHIIQZbiiWE;4=LKKIFB4)>_rvbMZbalmR;>A=86AUUI@AED@:8=DAMggjTDBDUODFIE:58AB@?@@@@>@CIOKGCBBDGLNKKMME:6:@B@;9BGEB><<>??>>>BHE>:==<=?=<=<9;====>?:68<<:;;;;;<<::65:=<:;?@>===><748?GLMOPE;>DHJIE?===>>==?ACCBCEA;CNI?@CDFFA82353029BC@ADA=>GIC?;74566975765444436867;>BGKH?<;;?BACE<4599765543355;DHGA@@?>><;::;;?LMLQOC;>@943356873/42*0:A<213359;97229B=:@B>?DC703>41.,--./=LOORKD=2-896HG/,38;;8303?JJHIC4,,-11+--281*4>841/00-.2;CB<9879:42>KKFC?74?C=538TsokjVEFOI=;:<=AJZW@BI>@cn<.EcC*2<;622500NP;@@=;84.,,.22220--...0248;;743456@DGD<6358988?CBDDCPRB;;6346667972/16852218KSV]L6231243233458AJLG<8=BDDDDEECBBEGJOGFEEGGILOORWY[\_ZTMJHHHGFEFFFGGGFFFEEEEGHHILS\]_]YSLIHFBABELUYZ\[XTSRQOLMOQMF@AABBBBBCDEEO[ckqi[VWRKEAABAABAAAAABBCDDDDEEGJLMOTXXXXYZZYYZZYWVVUUUUTSNJFDA????@AAA@?>>??ACDDDEEDA?>?AAABBAAHODAWaVT`hjiiig]H<>>=>>>>><;;<=>>??AEHIHC>HTOHHIIKNQSUUXUUOBCIMJHKKMQTURRRRPOMNWdryoVFMMGINNMMLID@DIIIII]eVirXmrjrTPOSRPYeXTg|~}ma_]ZX\^ZUQNE=DUQFF=7@A@@CEFFFEEGHGHHD_n[TU]r~hF@A?AABBISRRXQJMMT[Z]VMIIGFEC>=FNMNISkt]EDDBCH=xQBAAATzfFGA?@DRaVA??@@@@@?;:@Wd_SKL]hWMOLF?9Fcibhqnfdd`de`^N@=ACHHO]YJQhhXOJT\VD8;ENZdd_[YSGEJUQNbkkq}s^RS^\XRMSXWSYaSALiTHpwlhLCJJCBBBGLOQO]w]R_o^EAJV_abdhlrusognĽkEV[OLOSWXXXWWWWXY[\^_bdfhhhhhgebcghfa_aacdeffgfehe^_[GCCCDFJRURPOPPQSUY^\VTSUTND@A>@Zhoyt`Y\ac[NMRPMIFCDGIIGEECBDEEECEIQWWTROLIIJKLKKJJJKKLNXOJyYwpmc\ivnb]XIͻ{urpmkhryrszplka\ecK͸selxjĥIhxy’~}ujb]^fjjc`\ZVONROJJKGCA>@DGQZYQZaXTX[^`WLTf^MZgfUMlowymngm^ka^j^`wjvYn{enfldfXRTVWWROXcRFRVXZWPMQQPLC@CKI<304/)'*-,),/0//04620.-,./6;99:4/=QUW\HSULSMLLROKR[[YY[[ZWY^_^[XWVX^d\F<=??@@ABDGILNQQRQPOQNKIFBAJSTQUjv}T9K^inqxtXJ@=>=@A?<93//0//27889>@949Jdof^G?=@HSZ?@ABA@ACB?<659:756;;Dd\CJOSMBNrtSHIIHHOE87@IRTE6216?EILNM@9>??BBFMNKKLLIGGHF>;BECHF==>=:66764678@LOKFA>=9423:>?>?CDFJHGHC;8<@CE@847735978DPTPLHHFKU^jp\>36HfopVIPTXMFJI?46ANG?BCA@><=AIJEB@@?ACGLLIJLI@<==>=<>ABBA?=<>BCCBCC>6:=<=<<<;;<98;>==>??<9:;<=>>>>==>>=;;==>?>?@??@BB?87<@BCEJKC99@HJIHD<8:>>=?@ADGGE@=AMWOCAEE@>:726846@GFB?BEA<>=<;;;:=JIJRM@9<>942124662098*,364//3568:<<;7;A?AID<;>>65;B?B0).7:0/?MSWP@3,+9:5KL:87865689>EF<530*)-0+,15651/-6;75651+*17ALC:5588740:MTRVVH:62/2/Bl}yuSAMXJCJLKC=CUSKVXF6AA+19WT/@RSD5750,AVB;987420./01210.-,.//0148:83249:;?DIG;1035667>C@BCAJPE:76555457:9502:@=9:>>BKVS>1330365334202;HOLA9;>><;=@BGLNLLPLFEEFHIMSVW[_abaca\VQMJIHGGFFFFGFFFEEDDFGGHGHR_bdc`\RFBCB@?BMW\^_\VTUTROMNOQQJ@@@AABBBBCCGTchion[KIID@??ABABBBBBBABBCDCCCBBBCCGJMNOQSUUTVWVUTUVVVVUTTRLHEB@@@@ABBAA?@@=>?ACBDDDDA>=?@AAABBBCCB?EKDBO[bc`_ch`K==>>>??@=;::<==?ACDDEDB=AMQIHKIKMPSTUXWWWRKCHKIIHGKUZUSTTTSQQOQbrfLFJFDGJILSTKA:;>??@F_gUeuWn{jmpXMKOPY`|WQd{xvm^^]\Y][XURRQKQWMJN@9>>=>P]RDCN[c_ZRKHEGTea\iodYWX[hngfUB>A@DAF_eZhwcTJDLZXL>M[`djpj]SMIDDCJMXUOYmkOMSWZliWamljqpV=9KFA[vldK=GQMEDGGFFEKrqPGKUdfYSWahjihmsyzy}sP_śRK\RNLKOTUWWWWWXXY[\^_aceghiihgcadgifb_aacdeffa_de`_ZNECCCDCGPUTSTQOKGIU\YVTSPMIGCFDAdrmwyf\Z]`YMMRTTQOIEGLOMJGCDEDEECCGGJKLMKIJMMKIIIJIHIJJKTWJfWr{yreo}da_JɸvolihjxulmrvunhbacOqˮŻ``dJkyx˴{zymaYYahkf\YUSPMMMJHHHCB@=>CECOd_[feXRQKM]ZGM[NTbgYJh|Z}zi|qypwisimqTSdcx]qw`jckdaXRYXVURLUbWDKTWXUPIKMLGECELE>74:.+,02236:9865798662.,*)287653JNQHMHOUXQJIIKNNSY\^^aa`ZV[^^[YWVVV[a[K=:=?ACDGIIKLQRRSRQOPOI@?BFJF=Eg|X7I`jloxuS:39BNRKDA@??@EFDDB5/120026657866;BKWZXQKE<4@X]VVOUz\LR^^I;IZ\VS=@@=<<<<>=86:?GI@65999;AFKLFDJG<87589?<;;;::>=:;=<;AJMJC=:<>AAAAA>::?DDB@AE@68==;::99;:75788?A>=???????@??AA><>??@???@BB@<<@B@BFD?:65;EHGHE;69=>=?BDDFHEBEMQRQNJFB=9753:<9;CDA@?CC@==@CD<31120039?B>877535:=>;99;ADC?==86;>=;9:;:98866511239?BABF>=====>><85BFING<8:=9436688732;;-**,.1566689:;?<<@@BHD932327@EEH0#-CL<)0CORF8275865IMH=83/143:FF;3.,++.6A:9;>?:5>GG=659<5)2@@ELE6-.5/-024=HMT\WNB3).5XrRP\_XSV[ZSKSdhgbaY<+/204RcIY^YF7851.6PJ55554345554430.-,-.//0489::;<>?@@BEE4+-11245AC=75569><55974:EC;?LPGCIKF=?G?00520366542038;EONB830///05BSXXVTVGGGFIMPUY[^_`bbaaa_\XRNKJJHFFFGGFFFEEEEFGGFFLZdgjllmhXGABA?DS^_aa]WTWXUROPPQSOD?@AABBBCCCHR\]VZjdI>AA?@@@ABBBBCCDCDEFGEEEDCBAABBCBDEFHHHIJKMRUVWVVVTUSMHEB@@@ABBBA@?AA@?=?>?BB@?>>==?@@ABBCCBB?====AHKNNMRWSKB<=>????>=<<<>?=>AFIIEB?=FOKILLKLOQSUXWXZZTKIHJIE@ASWMMTYUUXTQMT\PDCCCBEIJLQQF:;BCA?@D\iUczXk{rUzrVFIGJa[VOiyunTUZYWYY\]^]ZX_[NORMRK>?ACEEEFEFGGHGHBMj\UU^o}sK<=>v{IIHGFDBEI>yfKGFFFFB@TeXSVRGB>Dd]MFBFE@@@@=>DGEHS_abd\NGKLLVSHN_b[XWSXgmhjXB@AAC??^l`ecUNIBCSYPO`nmlrynRELRLFEPQQSRbeSPQTPNac]qysrvnP;9BDCKZ_RCADNNGGJIIGA`sE6=DHPY^`aahvtjkmpru}~bG]FKSLKJHLQTVVWWXXXYZ[\^``cfgihgeaacfhfb_`bcceedeigc__aTEBBBAAENRQQRQPMKLVYVTRKEBEGDBELqlU]gaXW\^WMNPRTWWOGGKPTRJDFHGGECEHKGMPJILNNMMNMMLFEGIMKM\QNo`turi_Pϼsjkjms~|lfhjpqpmjfdgkÿɧj\aWvu}Ɵ~xvoaWWblmj`TPNMLLKIHEB@@AABBCDCKZ^TZloaUZcaaiig\QOgrQTjWsaehxttlpjvjTOY`ycsk\fbicZWR\[TUSIS__JDPVVUPCHJIFECDJC@;7>52148:<@CDCB;774034680+)-1555>=HD36O\_H?HMNSSUY^cdgfe`YWZ\[\[ZWTRV]\O>8><82CfmuS7F]imrxtR939AJNKIFCBADFB?EF>754/.1445666>CGHE?CGLE805@CIXTSq{_F@MUT9?\d^YZG9=;88>JKA;;;<;9875:=DeRKIPNFGGaz[737;GWM;55;AA@;21FB87765=?HJDADGD?;::97:DGACKPPUZQDFKNQfeX^e`SE<:JVUNNNHDC?<:<==:977=>>@AAA@=99@EDB@BEB:8<=<:8899973235;CB;9?B=:=?=<<=?@@BCA=;;>@@AAAAA@@@ACC@BE?87658AGHE>9;>==<>CECCEDCHNLJJQXM=:8765;:78;;:<@C???>?@A;5456568:=>=;998646=@=98<@A@:8972255689:89887762/.--.47<;<:99;>@@=709@GK<::::9769;=;:84:9.-+,/6>;767:;:9;=?>AC>3/,*1>CAGF5%2LVJ4-6@B843>;2(2JPJ;?:422/7DF>5100/-5FJHGFB;AU[PA:9>A6)9GABGG=0,0/-/2/.:EJS^aWE82>ho\]aab`ZWbkkrz||m^`L/1?DEVodeYD:542/.-EL01222146765421.-,,.//149?BBB@AEF><=>0*.15426=>>@>93--4@H?44842=IIHMROKPSPH;472+2855675234=KQJDILF=82/--.2E[dcZOL@HHJORSUX[^\\^acbba`]XTPMJHFFFFGGFFFDEEDDCCHUbiloqqsulXIB?AKX_acb]VSUWVTSRSQSSH=?@ABBCDDDDEKNGDSYK==@??@?@BBBBCDEFFGHIHFEDDCCDDDDDDDEEDDEJOTXYYXVVVSTSOJEA@??ABCCCA@@DDB@=<>BB=:<===?@@BDCCDDEC?>>=>@@@AADGA?A><>????>>===?@=;>GMLHCA@AHJJJHIJMOQTWWWZZWTPNOH@;>NPLRXaZRWUUSRRNGB@?@DIKMPLC?FIEDCCD]jUbYjw{jXnYHGHQ\SWkt{zkFCMOR[\`c}gYVVWUONPG<>BCEEEFEGGFFGGBGpaVT]m}wMVe_[SSVUQBJYUT_jiorIJ[WMQQMHOYcq[IRSTQGJNfwr{wX@BHDBKKUMCHKLNMNMPTIKpF7>DEEGR_a\X`u~qa]]_blupS>b}ONNILLJLPTVVWXXXXYZZ\]^_beffgfdaacghfc_`abcdddcdb`^_`\K@CDBBFKMNNMMNMMLMMLJFAACGIF@>JeRBEJNRVZ\ULLLLMSXSIDGOWUKFJNMIEDHHIPe`STWblnjeca^XRLMNOL[VI{as]`ķ|pkortuwphhjhegkmsun;ϮXycf}ҼxxsdWU_qskaWOMLLKIGEDB>=@?BKPLJIFPac`ahpn[WoylnriYHHmsWTuwb^hx~ywzxgmcYSTcjgp`YcbeaRTR^]UXTIRYbTCOTRUR?FIIGECEI@C@9C;956:60,03755.'*142,2EI68GMTA;GRUXWY\aghhgfd^YY[]_^\YUQPT[^R=6=ABDFHHIILNSWWVTRQPI;?<;?QYGJF9E[hpwxo\E<;>BEGHFBABFFB@CFE?:5/.14544=CGIFB97<>A;21012>TXT\^PNE:BEBC?4<>618@GKHBB?==BFGGHHF@:<<77756>DDIOH@>;335558=EGDA=7566@OPFEDDEFFGPZRC<;@N[WMJMJPTQMEECEE=ANM?:<<:BT^ZTF>BEB?=<;;:9@DACHNNPRMEDIJUi`Y^ZPG<7BSUHFQRGBAA>;;?@=:87BIHDAB@:9@EDA????????@=;=<<<::;;;;85457=CB<;>>87=@><;=?ACDDA>;9>@ABCBBBBCC@?AA?A@=;:9A@>>>BDBBCB@ACB>BWfTA:99::<=?@=68AEE@=;<<<;7348:999:9:;<<=>933=B>;:=@@=71351//245667988776541/--04><=:7579>A>826@79=:88;;;;:59:1./048@>976?@D?4./,,7CBBHF;5BV[WB25755757:/(3FLCESRG7037=EJ=2/./.-:GIKH=6HZRHD?=CA3+2?@;BFHE0/0/01/.17?IZc`TM>:vsY|pbVQ]^a^ZmrqzwSNJ99HTX_olfV2.220/.+8N91233347754630---.00026=BDC??DFA?;52..029::?@<;=:54203>E<331-4=;>JJABPVRPK;/12.5;97<90-4GYbbWIGJIFC=60003=Qir]=3;HHKNOOQTY]\]`cddccb`^ZVQLHGGFEGFEEFEDEGLQT[bhkmoppqrmi\MB@FOW^``]WRPRSSTTSRSUNA@@ABCBBCCEKSYZVOHB=;>=>??@AABABCCDDDEFFEEEEEDDDCCDDEEEGIOX]]\[ZWWVUSSQOLGB@?@BDDEEB?>DJF@==>AC>9;<<=>?ADECCEEFDB@?=>AB@@CCC@>AA=<=>>====>>>??<>CJJIDB@AEGJKIJJLMOQTUVXXVVYXTMEABGS\a]^[TUWUVXVVSIDAADEIMQOJNPIABCDGclW`~Yiw{q]nmc`SHQ^YZsojtxyvx}lQGDEKXXchdNDKYVMD=A>?ABDEEFEFEEFFGDBtcVS\k{|U=?B@??>?FRFBHGGFECIEGs`sn_J@ACDEEGIJKNOSX\VGDLPXWMEBBCCB?BDFHKL[b^WPJHKd|j^cknhjosup[H@IJBBA@BAGW\UQMMOVWB?X\TOQP[tP^cZVYSHFOXhu[TXTUVQGEux`KLLFFPKNLOUYXUSNJRVCSzL>@DCEC>KacVSWauxbYYZWYfn`JIWOKGHNPMLPSVVWXXXXXYY[\]^`deefecbaeghgd``abcddddea\\]^ZMCEHGFHHIKMKJIHGFFDGFBC@CEJJTjWMEJHDKPTWWPKKKKJKQOIFFLSTNLNPNKGGIHNjsddtumighikicZSSSP^aPfy{fsǾqmtvxtqkgffgddcclzŶȘ^{ovrˮtqvlZY]jrm^SNONKJHFDCC@@ACBCKRSWULIboplealraWjxkei`\MPlhoazrex{}zzlie]YQ`Tfj]]afb^MSQ^[X[ULRV\VHQSQTS>CIIIGEDG@EB=9:=@CHNRNIGEED?:41/8:6//-30-9HLOJ82HC>FTY]\]`dhjiggda^\]]^^]\WSPQT\_R<8:DDFGFGHIJMSUUTSQQVK>:<@C@;AE;F[hqwvk`J?>>?EGCB@@ADEJJGFD?<80,15615HMJHGE>;734622332bYLKMNEIRRH:5400:935BKOEAB@<856879DGA@DFHIGGE@427415?IKLJDBBBDFHJKIFJHB<6777:AB=BHGE<23:;77DGPOIKMROSSOK=??<;=>;==;<;9E]bXMB@AB@><>??==>?=<=??BDDEBA==@><;;<>>=;97989<@AADC>=?C@@CBABCFGEB@><>=>??@@ABC@9=CCABAA>=<=>ADA86<@@BB?@BA@A@>==<8CgtfZI@F?8;HNI@46@CD@<:9::9522688779:;;<>AA:33;?>>?@A@;63462./234666789999;8321128IF><:875:A@8769;=>C?7<>=889:;<;89=;50029A?<::@CA<:<=><4,--+2;:D?:8/6?<99HOXS;1887BK>21.+/-09=B<33FLC@C@<@<1+.>AFI1/--0/..+.7=K\^UM>-dSNe`SGKQNQYgfUJPzwC9=:?IOZdmmjb7020//200HF9<=<<;=>66761---../048<>=:<@BDBB@3*,1578;=<977;854335<=6010.6<5;NNDITTMQQ=.1546;84<:.+9Rcb^^WNJIJJB7//244>cm8*6HHJLKLNQW]`bdedddcb`^\YUNJJIFEFEEDEGINW]_`cfggjmooooljf]SJCAISQS]\RLNQRSSRQRVSFA@BCDEINPWaegiibTF>;;<=>?@@ABABBBBBBBDDDEGFFEDDCCBBCCHRX\__]\[YWWVUTRONMJFDBBEEEFFD>=DKJB===AC?;;=<>ACCCEEBA@ACA=;<<;<==>????@@CFHLHBABBEJNMKIKMOPRUVVWVXZZXVUPIHawr`S]]VWUY\RPSLHCBDBFMRSVSNTSKG@JblW]zUfzxieirws^_cXOYcblyvhX_hoprpomj^JDCXgxncRGDDEHHDA@@@@@ACEEEEEDEFFHFAwcUR\jyZ?AB@??>=<=>>ACD@DEKMKJLUd_T\iswnc^geH;Q`dc_XZRXoanXept|}zxkfbeZVRbkT\`iaZJSQ\V[_UMTTZTLRQQSU>@ILLMDDF@FE?EAA?>>AEJRSQJGGJNOLE<8;<886/200>DHRQ70>BCMV]a\Z]acfgghdb`^]]]^^\\XTTUW\`TA9>CGFEFHGFIPTTTTRQPTH;:AA==@E?@BDJMLFAGG8+0:763:LPJJDA@?9:752247:=IY`WD746:79DUdbXUQZJ?<988@<8=>9X]MJLOKIPQF:7405@>;HSTQE:?@;Mkj\USPRYYXUMGFB====;;<:7755?HHGHEHKGE@9202229EKKLKGFFEFFGLMIFKRM?55:?@BA88BFD<34:>:9=?7.26568748BHGJLQSPGGID;9>FORNKMPVVTRMD:;;;<<<;<<<<;9@QYPB>BA??<<@CBA?>AAA@?9>CDFFKQUX__^ZLB=>BBCACFHHKNH?;8>EB@>==CHJJFCA>:;BCDCA@=<>?<;>BA>;<>@A?<::<;;=>>=@?=ADCABDGGDEIJFDC@??;9:=>?AC@77@FECCACA@>>>@>955:;;>A?>??>??==>>;A_wxo\QQG9@RN@526=AA><;99;:631011379:;::;>=82138=@CEC=967982./234556689:;==944424?KE@>=9749>A7258<=AC::999;<=;9=CA<96;C?98:;;:88994-*,.,,57-5C?67?LLB=3.39ALOMD6.8B7..67CLB9:54:=83:>2(/31020.2988>@=9>70/4>FC;7761/,+131/.262;O\V?0.Rnrrwuh<77334873CNCDHGGHILA:9:3--..,-059;::;=@AACD>3/15==88855677787458;<86:>87;9?QXVTSPMLI/,04640Nub966IHHJJJJOV]bdeedddcb`^\ZXSNLIFFEFEEEHNSUTSTV\bdejnnnnljgd_WLDBDFJPWSMMOQRQQQRTSJB?ACKQW\^begggiibVMB<<=>?@@@AAAABBAABCCDEFFGECCBBBCGOZaa`^\\][YVVUTRPNMMKIFCCEFFGHGC?@GKGC@>@B@==>>=BKIEJIDFGBAA@@?>?ADEEEDA@ABEC?><;<==>???ACCDDEJJDABBDINOLJKKMNPSTUUVXZYXY[ZQO[hdWP[^[ZVY_\LJKGDDDBGOTUYNE[lgP>LalWY~Rhzqbaiouogfd\Y^flql^TU[ajsqlflnjbQQk{zup^DGEBB?@@@@@@@BCEEFFEDEFFHH>{ycVS\ixZ>AC?>?>=>@:;BDGB@tyb\PDEEEEEDBBB@FEEHHG?LMKbXK?=AGIGDJNRSJGFKXX\d_MFQa[PHGIEF_\JLPRUVXZYYYWXXYZ\[]bdeedcbbdfhgda`abccca]^icV\[ZZWPHFGGFHIHECBDGJLMLNNMJKCHNWwNWRONPRTNIJJJJJJHGJKIKPSRRSRPOMLLKSZghehbY]WV[eeVWXXWkto¾ugp{ojfa]_dd``_akξϿ͟rvɉrq~Ѽ}yljdYW]ce^SMKMOOJGEC@AB>CEGUQMGCMXhwjdiqwrc]ffXGQXZd\EETheYqbOsl|xx}~rjemcRS`ZKTfh^TEQPYP\hSNUS\RNSQQRS>>KMMNBDEBHDAEBA@>>AFKRURKHHJOTQLFB?=89710/159@LXB:>CLV[b`USW[\]^bba_^]]]\]]^^YVUUUV\`VFBGB=?D=H[jryxteXOC>AFGCA?ACFFEJMIO_W6,EP>9>9==:=:4114:=@HSUG923533@Tbc`WPI\LLC:9:<>MD34>BA?A>:=>7P^IGOTQNQPG@<8HMKKKGFFGEEFKMJEJQO?35CHDA?99AC=8339>=;=CA961187434>HKJPUYQHFJC:9?HQRPMORWXUSM@:;;;<=<<;<<<;9AS]P>>CC@?=;@ED@>=@B@?:9>CDDFIRYbbcaWLDDCCCBBBDHJOQG>:6@ID@>==BEIJGB?<8:BCEECA>=????@AABCBA@=:A@>;98;;;;<;=:9>ABB@BDGGEEJKFBAA@?;9:;=?AB=57CHGEDBBB@>;>B:336:<99=?=;;=>?>?ABC@BM\jk_XRKT\N8114:??<;96688631.+,1678:9:9651/015EDCCA?<8778:==<:=CJID>=@>9855540154/),/..271*6C=:9>MP>60.QH+*50+*,.0/03:=08<6247?GD81////-+09?<;;744?RR8*100HTPSSUZ^VRYN:6953VpW0,3678Vb=9=CBBB@@=;@B=;;;<<969:::767;?BDB:6:88FQPQVUOB:61/589:@HI@78=<=L]`][YVRI<33556738GC:>=IIHHHHHMU_ddcbcdddb`^\[ZVQLIHFEFGFFIIGFEEHMW_chmmlnnljhda^VLD@@@BKOOONNPPPPPQQNEBGNRY^bdddffhiiihdYJ?>@>?@@AAAABBBBCDDDFGFFEDDCEENZ``]\\\\[[YUTTTSROLKLIHFEDEFFHJKIB@FLNMIA>@A?=>>;@SVMQNCEIF@>???>?ADFFFEB@?DHGFDA=;;<=>?@BCFHFDCIICBBDGJLMLJJKLMPQSSSVXWVXXZ[XTUUNMZZZa^X_g^NHECCDCLTVRT]_bls\DMbl\[Wlvp`_kqtvthdifbdhga\WZ]counienqqp_\quoptmWSJKGBAA@@@??BDEEGGFEEEEGH9p{cXV`jwY=AB>>>>>A?<@ACHU^btd^MDDDCDDCBBBDCDGFE:@HIG~bdpeHGIDCBEHJLOOPQQLEDDBAC@BACAA@@BGIJLOUbhdYTV\_`^TSKI[r}a??BA@AA??IQSWXVQHJRJ@<:ISN^dWD?@@JWWRU`ebTLIFPYQHHQWUZTIFGHGK`aLKOQUWYZZYYWXYYXYY[`ccccccceghhfb`abdefeYUY[``ZXZWKCBCEFGEEDBL]b]ZWPOOPLQWTKFƧoaWSRRTUQLKJJKKLLMKLQQOQOPQRSUUSROLT{lcjlg`e[Z`gxdYYXXfyvnn{zne```_aed]``bjɯ̶uxs͸ww~|nif]XZ^a]UKKMKJGEDCA>@B@GDJ[VSJCKLM\nnea``b]\]]VSOIXmq\@Od^pdtTutt|lq|qmnfVW`MFNna[LEOMSI\sWPXT\QMTSOOP@>NOMH?GEGJBAEB@?<>@EKSUSMJIKNRQMHBA>7530-.225BBCFGGGGHMQRSRRRMU^PIQM@@ACD?50695.4Kada^XKHYHKD6666EDCBECC??8H_MJV\ZVRPJECEOY[\ZVTUPA>IIBKWa[WSQSVUSUVL@9;;;==:7656769@DFEDDMPD663127>HKLLKHEDDFGHFGGIGGTWH:?MMC==AIK@5.196212:IPQWWVOHHKG<;GKNRUQNRVY]XO@:;;;;=<<<<=?;;H[ZE?ACBA@?@ABBGR`kdfk]ODMMJHFCBDNQSN>:65ALCBAAABBHKHA=89=CEGGFD@>=@BCCCBABC@?<:9:;;;9778999:9AEDA?=>>@ADFEDGHDA?@AAAB==>?@A>7:GJHEDCB@?<8>A9469==;89;98:;=>?@ACGG>7C_qladedbL82348=>><943564231--366689<:51./357<>;5101334424210375459@D>98567859BG@=<978644277555:BFED@><7766:<<<<@@?BBA=88;<86650.00.,--,.33,+7=987<88:?DB6151..-,-4CIE?9821;>2+--3KXOPTU[a`jSDCA;<86B;/04545_vX9;ELNMLMIGNFAACDFHNTC730./01128<>>=<:878=B@746754=CBIWWH98945;>B=?M[^]]]\VI@?;8666525AD?@IHHGFFGMXbd`\]bfedba]\\YUPLJHFGHHGFGD@AAAGPV[gnlijmnmkhd`^YQJHEBABGOPNMMONMNONNNPRSSY``]_dhknpqrttqaOFB>?@@AAAABBBCEEEEGGFEEEDDJT`aXRSW[]\XUTTSSTRQOKIJIGGFDFGGHJJJIGJOPRQH??A@@?>;;P`[ZOCFJIC==>>??@CFGGGEDDFHGHHFC?=<<>>?ABDHIFACEDBBCEGKOOJHIIJLNQQQUVUUUWXYYXXXUQYVIHNSZckeOCBDHLU^YFUzwnkcTM^kglXlqqkiiknttnipmhd_^_a^X`mrojghoxsg\_ehhgfdhja`LC?B@@@>?BDFFHHGFFEEFI:k}dZValy]BEE@=<<>C?AIIS_}zwgcSDBDBDDDBBBBBDGEC?EOEeh[dgPJRTJA?FKLNRVWSKDCDDEFECAAABB@>?DJLNR[iplaYUTTT^bROh|hN<@B@@AB@=GTYc\POMLXV=F^ZSUWZd^s]]ornecb^_[XUUpzZW_REX\x^USf[PcTSXUD@FB?>>@>>IUXRoZFCDD@Jbj^etrkca[TX]WOYpsbWSPKJHJW_ZOLPQTWZZZZXVXXWWWXY^bbbccccdfghhfabdfgkmbTVTyYTWQHDCDEGFEDCDMZc`acWRTTPTo{jZvǑ_WVUUUVXTMJKLMNPPMNRQKILOPSW[]_XOOu}_hpf`a`ceb^gztjd^[`mwkmvvgdb_^^jiecY`tevĭov˶so}vliaYY^`_XNHLOJEDBA@AAAABFDN]_^\U_Q>=IXXSRUZ]XVTQMLHGMcqFKq[l^{|bm}tlk^[`NGTv_ZBHMKKF]vbL[V[PMVULLL@?OLK@>JDMM@CEB@?;?@DKTVUOKJKMRQMHDCA:30.-.258;?Wg[QPTZ`ZLOVY[Z\^ZWTRRSRSUVW^fg_ZXVSRW_aZLB?BFFGIHEHOQRRTVROTZPTRC8@;Iar|ymeYIHNLC=@DFDDBFIJ[qnVQ`cYQGUaOA<;BDB>@@;66;@AA>963157524?VfcieYIHT=DA2364;BJKPVSGEIMIHC:CaOS^^\VPNIEHRXXTTUSRQOEAGFCKX]YWWVUSSTUTLC;<@>===<;98:=>AFHF@?GH<24532;FKKKMJE@ACEJMID=AJW`ZLGNRLA;<==CD<9>>9:?ABFLE81475333:ISTXXRNIIMH=BNOMRVSJGLU^aR>:<;;;=====?BFMUVI;=ABBGFA<>?=9<>>AFHFB>>???AK_idcaXTDILLLIDEPWUPE:623BIECEJHA=<=>?:7:?EFHHIJB746789?BDFG@>??@@=;89=><:;:;;:;<:7:<:;>@>?ADEA<>I[rrphYTK<7767:=?>;63465457525768;:98863346:<=70./11.,,0451.04556:FKA6327:<;>EC=:95366468=@<977<56:9:<<>2/3EXYWRJEFJJF<31654;EH?2-/101423DF1*0/.-./238<>HE?>64;>A@:<>0--,+++7KK;682.00..-,5M\QKRV]Yn~]SXT@3><30/44353bxGb6CHJMPRTRNKH?==?BGIG730./1358;?AA?===ADDEKPSTQNHCCB=>CB@@<78<;52578:==;>FD95:=::>CCFG?638>BEGJOWcf\QH@@?<:65435:DOMCKJIHGGIP[_[WY_efedb`][ZWSNMJHHIHHHHHFCBAAGOQYgkghkmnmkieb]WOGFGIIGEIKKKLLLMMMMNPPPQTY__]ainqsuwxyz|sbTKD?>@AAAABABBBBBBBBCGGGIN[`ZOJOY]]]XTTWZYWTSQPMJIHGGFEFGGHHHKMLORTUUPF@AAAAA>=Lad`RFGKMF=<>>?@@BEFFGGGGGGFGGGHEA@BBA?@BBEJICBBBBABEGHKPMIHHILNPPPRSTTSTTTXZ[\[Z[VH;>KSZacQCALYX\e^O_sz~vhhXNVighpXchhv{kb_`dmplklkge`bkkkkidfklopdYY^acdfefqvsp\YH>?@>>@BDDDEFFGGGGGICFB?A;B@CKPSTOKIKMOPLJFEC>61.,-26<=:C[[TNT_]MIQWY]``^ZYXWTRRSSTUZdie`]YURTX\]\RE>AEEFIHEHNRRSWVPMSZ]K<=I=HbsrdZNELPIBBEGHGFCFHObneWSTOce_dY91@NOOMJGA;87:?@@<6468854BC8=B9:KZ_ad`PGRQA=?9GgKS`[VMHHGITUYWQRUQNMJD<;?HQZ]\^^ZVTTSQOMICDEEC?<<;:89=@BFGFA>A?5244329CECCGE?>@CEIMID89NjfK>FPQLEA@AAEMMFABAAA?=?EG>6454554:ISTTRNKKJFBBHMOQUVRLIIJO\ZB4;::;;<<==?FR_]L>AHGCDHGBA@><;<=>@EGECA><<;Icsl`b\QdX\_`\QEKZ]SF=9516AFDCEHE=;99:;::=CCBEINN@669;=>@><;<;9<@<9==::==;;;;;<==9;\~z\?@FD=;;:::=?>83479878<98:<><;:9839@=:<===CIIEA<856434445762/.,-/1/,*/00+0IM6../64DPSNIORJIMKA61/3.,9A:/--../.-*182*.//-.//058;AA?B828=ABCKL<272,,(-AF5044564/-/4:HWQOWUZ`rd^\\J/6@920365:/Tr-wCLNNPSTTSPOLIDA@@DC;4451-/6:;@B?::<>?@A@DLRRNNPJAAB=:<<::>BEEEFFD=89<957;ABB@<972022-09<>AC;1257:@GFB@MacO<57::9:7427;<@OOCMLKJHGIOUTTYbffeecb`\ZYUQMKIHIJJJJJJIHCBBEHMWaceikmnnmkgd^VKB@DHJIJHFHIJJJKLKKJJJMSX[]`djmmqtwxyyz|zraUQH?@BAAAA@@@AA@@?>@CDCM\\TFDMZb_YUTW[^^]YUTSQMKIHHIGEFFGGHJLMMPSUVXWMA@ABEGGIR^dcYJFKOKA>=?@@@BDDEGGGGFEEGFGHGFFHIHEBBBDHHFEDDBBBCEFHLMJIIILMMMOPPPRSRRSUWXZZYYWRNLNMPSOHDK[a]Ydqkgot~zpmWGXedbYY]^Yl}u`RRZ[fjjhnsujmyr^Y^emokdZY[[a^\bbjuyxypsXB@@>>>@BCCDEGHHIJHI>cm`U[bugLNTUXRI@CHEQd}e[VSQMKIFBAABCDEEEEGHGJIKF\UMMVRMPNXclv[NNMLT`[JBEDBCEECBDEEEFGKOQU\`__mzk[VPQUfkTLJGIR^<@BA@@BAA>CMWL?b{[=?CIQXVGFYyx}ob^ce`Q@I|jNE?=>CD_maRW\KTqfKGX`LFFDCGHADYddb_x`?GGDII:Eiz|eVWRNOYadfa_bfaKIOMIMSRQRX[[YXVTM_zYWWW\`abccbbbbdhjhdcdgo}}hXVZZXVVTUTRNKHGGHGFDFVrzngbeZWfpz{fg|\TTTTQNJGGJMOQTSQMIGJNTXWV_kc^bq^]YZofTRahsrislto˹}oyrr~nep]iqmwlmw|ϼ}{equ~Ȧph{qniYTchXNYRECAAAABLOGJOEEADIIMQOKIKMMMNLHGC@:3,*,25<><?ADB>=9535798:<;:=ACCDCBBDIFB:=L[VA7=GLNMKJLMPV[UF?FIED?:AM_cQBKYWLHIFB?>>====>@CDDCCA<8=do[efVamrm`YQEIZ\OB=957?CEEGEB;8;>=<;;;GRTL?=A@@BCFGIH?;>?=EONIFEB@ACECCBCIMMNJC?=<=?=:;975688877887:<9CelP8;BFD=;==:9::6348::64:EF=9:976764369;:>DFD>:76777878:6237:::;::549@BDDBBB=;72448:<;<;<;;@@?75455?9324796685-++039>>:;4/CH4+/>`T@9;53+/8=?CFFGGGHC;;><;;>CEDED?;9634;3+48;:524659?DC??A@>ONLJHGHJNRZbggedccb_[YWSOMKIHJKKLLLLKIFCBDEKVZ]cghknmmjgb^XOGEFGHJLLKIHHHIIKJJIHHKPVY\`fhfflsuwxyyz{zseXNFBAA@@A@AABB@>>@?@AFWZJBALZ`YQORY]``^\ZWVTQNLJHIJHFEEFHJLMMNORUWYZRC>@BGMPV[]`d`ODIPNI@>@AAA@AACFGGGGGGFFFFGIJKNMJFDDEGGGGFDDDCACEGIJJJKKJKLKMNNOPRQPPQSTV[ZVXYYYVNIJFDEJX_^]f{wy}zzlY[X]gnd_[TP]nqbW[]TV`dhlqrmosneVS]cjlic^_\XYTT_bmuwsvwsf[L?@>=?ABCDEGHHHIGGDeo`VYatiMFHLSVQHDBBKFS~gRLHGGHIJGDACDEEEEEEFFEGFHANLPRKJIHjqfHOPFJ[YKEGDCDEDDDEGGHILORY^^_bagsgPPVU[cWFILF=?^xRA>?>?AA=?AEE=MoH;>BIPVGACNq}{wmjryyt_F?kjVWRC<<=UrkRNTQOLQY_lvjTNTMJJLOUTPPQPRXXWVTXUPWWX^^_cbaabbbfihcbhvwiil\TTSQQMJIIIHHJIGIIQnw_Y_b\U^ifejdsxSQQRQNKHHJKLNQTVTNJHJMRWVVgtm`qiLlp`os^\jssqwmsx˰ƴ{|}w~}ndh~peqsv³վjyWugrƢrlvwnfa[_yrbVnTILDGHMNJGHXRFARd^WpoaWWXY[]__^^_``XQ[kmaXRTW}zTQp\MT~yNczynunpoWXeO99NI@OD\]oJXPT^PMKGEDCGBAF7EPJM>=CDDBD@EBEGDJNKIIKKLLNLJHED=4**,02=DDANWPS[^^YMGLW\WRUY\\XWWVSPMPUX[]]__[YXWUTSX[SB?FHFHKIFGKQVTSRPPSVSPV>EexqZPUZTLHJOJD=EOOJQ[^RC=:Lljux]NILRTSOKIA:<4289;;8310.6DG@[rondShrcmtok^Y[UUYbifd`[YWXXWPLTf:8LOV[[TLNUUVY]^^[SB109GQY^_]VPF6G_^Y\^`aS?;?DD@:EH?AB>>ADIOQSSTVY`d[IEKKIC:8??;633555@MSTPFAFKB32>HLPVZZVRV^e`OHHA8<;;;:;<===BTa[QW`\OFFG?878;<>??ABBBCC@:9<;>B>9=EJIHLKDA@>EJID?>><:9533578889<>>?B@GLE>=>AC?9;??=:996589:877;@A?>==<;:7568857>@@<:98879<>><747>@?<;::78>DGIGFE?:;537999;;:9;:9><964456ALNOOMG=;?EHHGD@B8+281/5@VM942/D4,06;><5/39;=>?925AKMOQKFGE=:=AA?<;=AFHDCDA@?>>==<===BGECED=@^dF35=>:76339=@BFCCEB???>:55;?BGOUZ]^`deVFHMPOC=@CCBBA@ADFFHJKIFEFGHJKKNPNKGFEGFFGFDDDCBADFGJKLNMIFFHKMMQSRSRQPRPKT][[ZYZ\YRJEEFIKK^srkrmeXX]k\\bec`[RS]dedgkg^WW]lmigdkn^\WW^cfjhdff_VSSXainovkjvnggXG@==?ACBCEEHHHGGEA[o`WZatiLGCDFHGFECEIACPNGGGEEFGHIGFEGGFFFGGGGHHGG@WoYWSQF@:9nxnjZFQTDBQVSMIGFFGGHJHIIHJORT[^]_gkjf]OOV[vmD=@CEDB?VovZ?>@?=<=?@B?G{M9@OSQO[RV׏IOgZSVPR\WScgbc`O?=DGHNVNCBCMzb\IMaWLLIPWWbxkTKLNHEJTZTOMQskOOUVRTSYXU`]]ca_abccltohm||vyvmomYPRQOLHEGILKHIJIHHQdph]]ZW[W|idjfdlRPPQQNMLLLJHJOSXTOLLLLOQRZeepppWf{nmjt~}yqu˻־ɶvx|usvndfvg]źΪy}p}LdzweyϿsnsvlmfggmpbRU\P]ZbMBBO`HHJYea^ktpjfa][WSQRUZ_aXMFRcnlbTW_Fmn\DljH_vm|xoybWYJ78O?@K?\[nSRPQ_SMGCFEDI@CD6KKGG>=ACDEB?C@EECHLIGIJKLLNMKJFE>8/.-02>LMGMI@W_]]`VJKSVQRY[\\XVWWSNKLSXWZ\]``^ZWUTQPTXPGPTIELNJFGOTRPRRRQV]ZK9Mo~}aU[_TMNUZM6-3AHHIRSGBDHTjl}_>CQWTPLJI@5557=>??;989?C@6ItxskZVoylnwy{m\XYYZ`egfeb]ZYYZZ[V`C>MKNVTMGONS]cigdbU?49DLPX_bXB84.?^gbacdbS@;GSXVPF?=<=<989<@>8459?GMLLJGD?=@DFD?>::@A:LQ=;AABA?CNSTSQRX`jmXEJPH>;=>98745767@NRSQD=CFA63:CHNW][VOKNZbRBGJ;::;;<<====ALPQX_`YQMIF?DMIEB@?=>AAAA@=:87C]pm`fvtfeql[XRDBHMOEA@<525:@A?95:DNPIDHLKD=@DDCEHIC>??=9<@@?@??@A@><EGB?@@@AA?=968<;8>HJFDIGCAA@>@FIHDA?=?CB@CEFDBCEFFDBBAA@?:86677787@??@???>>>;;?>>==>;89;=>@=9=A@:99547854566668;===:65:??==?>;;?ADFEDD>;<:8::9646:<:51643466669=BEJNH>:?GLKJFA<<@A835319<5,,6DMPND<>?4),24575253852;JB2-4DOPTXJ?A9228I@53332123234862-+1=B<71147<:502BJIPPA5467833767742/-,.22228AB<``lgaZQB8877;;8035824C:@;gT>Q_jlkhb[XXVYVLMNMFCC3.02331.06::;?=607AEGMNJHB;79=@?<:89AHHA??>??>=;;9889=FFEGJDCK`jcJ;?B=746;;?EA<74492-=DDFHHIJMB4OOMKHGFILNPZcffged`^[XTPMKJKLLMNOPPNLKIFCEMRQRUYajponkheb`YPLMNPPNLJIIHGHHHIIHHHHJLRX[_c`Z[fptvwyxyyzzuj_QEAA@AABBBCBBCCCEFFHHFFHS[VHCN\^ZY\]]\\[YWTQNLKIHHGGGGHIKMNNPRUWXYUJ@>@DKS[_aabeZIGLOSLA=CECCA??BDCFKMLJJIHHJKKNQRPKFDEEGKIDCDCBADGHJLMOPH??CILMPVWUUVTTOEKV]`^VSV\^UGEHKB=`|x[[Y\JLZ\eb\VXa^UU_edgjkgd]XXfoichtzncZZ^bdjhdipcNRYZdflnsjjxp^^dZ?>>ACEDDEEGGHGFE:IoaX[ctrGEBCGCBCDDBCGILNMMKFEFFFEFGFGGGJKKJKLMOPPI\d_QH@;57g}dGB@NSGBISYSJHGHHKQTOKKFGUVVUV\chki\X]ZWgO=A=AGLJ<<[aC?AAGMHB?D=mösF=@ABHTOB?XWjTMMJ^XLD@IFGK=I@:MECA<<@CFD=>B?FCDGIHGIKKKLNMKLGF@;72/36=GIFH;0W`NLPQKILNRZ\[^^YWUTQMKJOY[[\\_ce^ZXWUSOPRRZ]OCHPOKKOSRPQQRSV]YWIWw~O?LL?@P\XD314<@EKTWTTUUYfv`@,7JOMKKJI?.-5@DB??GMOOTK47i|zcK6N[S_g{sg_[Z]_bgid_`__``_Y[UJKKFC@CJOEJhpqmf[GEOTVPKF@96689;>>958?FJKLNMIB:9>CDFHE95?A:LWB8<=?ABINOOLJJS^djZHMSG78>=548646998:<>GVYTLGCBGOL@DLB::;;<<===>AA:=SeigfjUBD^tlb\UKA;=??>=:97658Mhppuslfgg]ODEMFGMGKJHV\RRYRF<===<>CFA?>@ADHGA:AOYRBAIGCDHLD;@FB=@CCB@A@@@@BB@AB>969?BB@@?>==?B<66:;:8=EIHHFABCDGHEDFF@=<;;::<::HTH:=ABB@ACA<>ABA>99==95268:>A@=;;<>@?;;<><94891:A@933214775300269@A=7;DGIJHC=:<@:35306:69ENPMGA76==2,/36679:=874/5IQ?1;Za[XH=;;KWGPU;5552/.(&)/6?:1.28<=720,/69;>8169=GG;69::<<:77776430-.34148886urdbMSRL@;;999878:;7<;48@:<~3@Xnmkkjc[VOb`PTNIHFB3./..,-/48:8;?:48CFCDIKIA6489878:<>@DGE?<=====;::99:;?EEEGEA>69Npt[C=A99==:;5*,2=NUJ::<75DD?CLLIJJ;.NMMJHGFHGFM\fhhjhb^\YUSOLJJMMMOPQQPNKIIGDEJIEDKYgooorrkdde]PIGJLMMNMKHHHHHHHHGGGHJMRW\_a`\]fotuvwxyzzywl]RGAABBBCCCCCDDEDDFGGHHGIQRJDFMRQT\^]]]]][XURPMJIHIIIHGGHJMNNPRTWXXWNB@?AFMYcb``c\LJNNTWM@AEDEFA>ACACIMLMNMKIIKLLOQROHFEDDLQHBBCCACHIIKLLOI?;@HJMNQUUUUVXUNHIOY\TKGNWVMHGIFGVhya`^]snX]_^]\^cf\TXaghiia\`_WTXab_kuurl]Z^djnnnovlTZ[]`aimjjpri[hs_???ACEDDEEFEEFEE=BrcY]gu|H:?FKCAAAA@BIMQRROKFCDEEFFGGGHIKPTTQMNSVLgbYg[J@<<9JdjWE<>LPGDJPVRKIHHGIQTTOMML[TQTRX`fhjep~rd:A>BZpnW@BOC?@@GOYbM<<~Ŀa?@@A@FRQD?BY`PA:UvjP=EeQIbjU^WMQIS`a[PPQRXNYkmpzjJEORYTYrpc`^^]Z`UCGHDLOIHIGIXniUNIancbiaTOGSXHGKJYlcR`ROOZP[au^U`|_Y_ZW_abccdeekjgjr~~qlm^LMNMMLKJKJMgu[NNOW^lg]itebhieu{wkcYWSTTSSSRQPPNMQTW\_^XZWcsnt~]u~jlp|ut~Ѹɭxlfl}spʪlo{zy{dnvdw}˴vefpkaedzwvrm_hazrhPQHUbYHHUZTaa[WTSVY^dlmkif`[]affe[fhsM\q\_{{JDCgdCYqy|qbRK;GH7E9>VRhNIGD[^K@:MHJK?O=DD?@<8:ADF@:=B?FCCEFFGHJJHJLLLLIFB>:4289;<67ABBJTZ`caZRR]od?60?RVURNJJ@0/8DD=>M_`\[UF.8TX`K>:YO:B]zvy{ha_][Ydjgb__aglfXYaLHRTJEP_MCFlvmfcQ>BNLKJDLftiE6ET\\ZYWRH?>DC=?DIKLORL=226:<=<:;@EIJHJKI@849AFJQOG<:@A:CJ<7;>>BIMLFB?=AGOVYTNNMD84<;6686578<:99:87AQRHB?@BDFE@AHF=9;><?@>85C]t|}`>Ikztqomf[H==>=;9889:7GijxtohdhfYT`l`?@?MXZYYRILYYO>8>FIHILGFIKNPRL>;?CJMC?CC?@EJFDGKE@BDCB@@@?AGHEC@:557;BDB@AAAAAAB?<<>=>?>HUTKGGFDCCBCFD@;=ABBCDEEA?ACCBCFFA<99=@<668988761.26527AB=;976789:;<<<>@?:753/27=BCBA=<;:7448956@A:8@A67;::9533342/+-26878;:55>>>BFD@;8=;4585;CGJPLD<7646:;414668;?=7542./@L?4GljfiS?>>Lra.$$"&(+-00/.7<1/5@@>;510-/16=C>7537<:78<@@AE@8757@EEA717516=>HHGIJKG;456777:>AEFEBA@?@@@@?=;;<<<>ACCEGB<altv[C49C=8K_WILMF=MMLJHGFGGGRbjklli`YVTUROLJJLNNPQRRQOLIGGEDDD@?GT\acdglkfee`UKIHGHIJIJIHHHHGGFFGGHJLQV[^`a``fmrstuwyzyxviRECBBBBCCCCCDEEDDFGHHGFGGIHFFFFIR\_]]]]^]\YVSPNKIIKLKIGHHJLNOPRTXXWXQFA@@BEQ]ca`c^OKOQTYWIADFGJF>=A@?DKLMPOMLLMNNMMQQLIIECLTPHCCCBCGIIKMGJTNCBKOU[VPTUMNUXTIDEKNMIBBHJKHFFFDEJVlrkpthlwqbXYZ[hl`Z]emmfcfd[X^YTSTWV^eeeh^Z\alqorzwqe`ZmenmnhdgbdfvwaE=?ACEDDEEDCCDDE?=teZ_ltN?=@SSLF=AIOMIIIIHFFJLJIGILRQRWTQJOXVTXcn{z=8AFWUPRSKF@?>>@AHYU@<ü£wS>B?@@COTH?FKD@?>SfWFKX]SNPhaZTT_U`fa\IMULT\bweTY_]T]ww^\mqnpjRBCABGGHOPJT]XYZTOgrs~wjOFLKILKOalp|cPPks_Jڞbba|XW[VV_aabbbbddcam}jjgnhLIJLLLLNNLczTJT]lp~x_unelvjym]gld\]`c_Z]\`aZXZ[\``_]`pvghq|{s~Ⱦ˰}jbhrк}}˸oahuuyrtxh`zlʱrdktnb`c{hК~vaqavojQeNWlgQKSUMcjlosrmkneZ^ghjjlqw}oP?RvjhjiK>EQlDX}l}ziTKAG@8E5>VQfKEBB^aK:>QIKJBQ9>848CFE:9;B?CBACFFGGHLGFHLNLKGDB<68<8=;LQH@5?IFKPUYahfVHKV\TLI?Xmg`YSMNI;29A;7HdmbVQPN947:ELVQbQ=>Upztjfcc_gnqkcbgjj`JT`GEXcYPRXI@Ju|mhfVMQNGLQKQls^HN`ovod^YPKGGGGF@<>ACIRWQA33=@<97:DJKIGHH@515=EINQKE@A@=;73<@@BABHID@:637:;@LSTQHA?:78;::::<88DGABEC@;9999:97=GG?=ACDEEB?=@C=98:=@CCBB=>McumLQgihhhiki^I;=>;:;===Q^_\RHBEPUL=6:@CDFHGGGIOXTG?ML@?B@;;;:9;FSRJHKKHDA>AFD@?>;;<:8;@FIIIJMNFCFFBFJGBACGKLKMLIEDA?@@ACDDDDDDBABFHGA:79=<401369<=7003557;><876789:<<;::;=BB9344115:41024436993*+16;??><978@@?;433349=DJG@=9534663466:?@>@@=6/-..--1531Lljmn\IGGWt\=9L>GdesyolY8583100247>BABFA;878CLMJD<=968A@>f~_PA>>ADG;68<=@DFLQSH<778:3D4Q|urr~xjsFFIILNJ4-.,///13568>>>@CDCCC@@DE731>XaUKGJG<;lTRgszcfncPWZY^\Y_jtxsbZ]]XTWWX[[VRT^ca`^[VWaiebmihkig|vthlla^]gilpiG;?ABDDEDDDBBBBF@:raZ[irUDJG>24=DJMKIHGFHHGJLIIIIHHHHGEDDHOVYSG==FMMFBA>=<;?E@EƺsSDBA??@KUM@@CBAA@OWG?KY]OF:Yhade`YlodSJ^n]]mbp~{km|xqs_anl`R[nkWPOJFFNUMIR[XPPRNKS\Yhnp|z[FGJMMNKTlydf`X]uuTaʴnf~lUWVV\aaaa`adffb[`pj]ablfNPRMLOOPNMW`_[XXexetvׇu|kd|zyijmutonlnrkdca`bgilyymuttz~tsnhru֩xηhmqmxgd]isvȭphqwphffwsŨwrwboilXqTezrbZaOG\kmoqstnowyuoe\T[myynSC6Kl]Y]N@COqL]t~d{qmpVLED=;E563Hang\SJMO:9;:>SaN]K:GWowqmnkqvyqd_dcWM6MbLJWZTLDDE@Mxvvqc\XPKRXSSZVQZhszpicZPLKKMLB;=>>@IR^ZB5CJC?96>IJFDGC:68;@HIHC?AEG?:<64LRHEFDBB??;754549JUYYRIJD88?@>=?@:;DG@@EDFHD<;==97;ABACGHEA?><:9;967:BHIIHEBSjw}|~~{~}kchggeddabe\E<@>?AB@?<>@@`yrkoial~{iNAHJHHGEBDGGCCD@?DILMLMQOH@=@CA>?>=>=9:;>@CCCCFFB<=DEC>:79<812569<>>82256:?@=8322478:;<;;9;=CA9322235:>DEFB;448::;:87;AD82973-...39?A?:31259=<;9:=AABB?<:;71/0148>B@80.1359<7234:DKJHHFA=5.,..--//.>VkjaWJIMnrtmvhG??@?=:879:76:>;2.//112358=?BC>=CG>=DBFKGFA<>@@Gi[U<<>?GTM95:=?DJIHOPC4/667;8~D>m{oXWz|{mAINMMPJ4-/-.//03578:><;@FJKJJJC<512??@@BB@=AFFGI@609MY\ZRTa{xal\_qreRD>@IRTJIIIIIIIJR^gknookcWPPPNLKJJLNPPQSSRPLIGEDDCBDCCDDDDEEFMRROOKIHIKJJJIHFFEFFGGGGGFGJMSWZ]^acefimpsuvy{{vo^H@BBBBBCCCCCFFEINLJIFFFGGFGGHJPZ\VV\^]]]][YWSQOLJJLMJIJJIJJJJKKNRVXWSJBBGJLOW`dbccXOPTVUY[UJGINOE<77IPBBEDELUY[XRJGIOKBHSJ:HezelI=>>>>>BFMND=>?>>>JTZG>8Lhuwve\|bHZ|xgdasppiad^w~qk_[\bZOLKKO_aPGQ__RIIFBTkfkpnt~{uw_HHDFJKENthNKM\|UЪzey}feQZb]ZZZ[_eedbYX\\[\]aWLa_MLPOMKHEM^a^[loÍonvtz~vll`equūyu½ǹ}plfãԲxkqdZ^oȨplvwlfjpqyw{}nchilayZnwmey[QU_`cfhkmms}~wfPHOWw}kOKTckfPQWWGEGfYfqx^l_\t~tXLIC==A68RTYTD?Dm_P:NTKJAHOIO?::69BHHF22:A<>>@BCFHGLMDAEKOMKEEFD>@A?97AFB5=D>=<<89BIKMQW[\YUVXWVVVOGDJMRSSUYZ[]]ZTUVTSTSSW\WJACLROMMOOPRSTUXUXx{M?FLLLNPTC@QJIH?8Nbsv{tf^bf[@.>FCKYQLMOF8>BNiywpi`TMB9DF?>TbQ`P9Vck{umssuvsj`SQJ??7LcNLRPOMIGFANntv{pbYUVVZ^YRHLcqquwyqjgc[MA=ENL@;<:9=DJXe[HIONNF54AIFEFA>GLGFGC>::AIKEAEGIWZLFGD>=><=?=:?GJMNRXZVLA;=BFEA>==@GKE?@FRXVI?>?:8<>=::;>ABEQQJJJFLessu{}~~xyyxwvtojlkR=ACDEDB@<:>AQp~~j`_[cp_KXSUXYXULECBCA=978?MLRXXQICAA@@>;9:=AFIJJEA>==>=>>@B?BGIHGGGGGFEEGGDBBDHLOQSQI@?@@?<=?DHD<;;<>AA@BILFEJHCDHIJGAACHNNLKGBBA@><=BEDDFFA;>CA=::7785348:<@A>822457;<732224789;;<==?@A=952..3436;;<;7567;GLJC>BAB74863..-.5=CB@;53229=;9<@BDCA?:359637843788643/16;=;77;AFLNKIHHHD7-./.-394/1C`bZVMIroĠsm_J=AIEDE?;7779;CE@9:=3-442544356;?>;EY`I>IFCIKNKCE>6t4AQ756:===@IKGKMD5156771Iu6FZT94^v[CLNMOPJ4-//.-/2679::<>@BFIIKKJD94469<@HNPOLKMMMNLKLKF@?@???ABB@@?@DFHPB1H^Y]uo\qxgadwyy]IBA;08LZIIIIIIIIKPV\elmkjdXPNOMLLKKNOPPQSSQOIGEDDDCBCCCBBCBCBBDGIGFEEFFFFFGGGFEEEEGHIIIHIMQVY[\^aceggimsuvxz{wiWHABAABBBCCCEFFIPOHFHHHGGGGGHIKMONNW^^\[[[ZXVTROMKJJKIJLLKKKLLJJLPTWWSKDBEMTX\`cbbd\QQTUVW\\UMJNRK?<>@@@CDDFILLMPRQQNMNOOMLLLOTVSPNMSTLFIJHHNWZ^lY@EFBEGEDFEEGGFEEEDDEDCDDDCDEHIHJTdu{okmmi_XSRQS_dca__ZYWRQOPUXUPQXXY_^[WSZltdYZZT]ixqzrmpngeimd_jZ@??ACCDFFFFEDDC@?3~uic_fvdLA8=CUqzlVJKMLKJECHT\UJFEFDDFFEEDBAAC6o]VeiUXTGM]nw`D;><969DH@>@FLLMS[]\SJM[_KCNKDbz|c:AABC@>AFJJB@CCA??8jȬ~weI>??@IUPB?BBADGIBALMQUD>?NmmitagbOag]S\h^[esmk{rb[bidVLNRWRIBFYdUFEAF`phl|{xw}kNEZZHFFQjeXTSMXhu[hyjPXaWPQN\aceeca^^^][UNKWhWKMJGFJJNctd]c}z|yfsyƺrhtkͮjxnp~_\dzĢpoxvibbvÿfszceehhk~chrpkab`]\[[[\^^YT]qePDBsnKFNmmQFDb\OA[foqp^`SNhx|`NKC?=<65NSSXE@EmaR;KWPE?NJRMC;5EKMLMNNPQTTVVRVypYPKLJKNTUHT\LB<9;ZhqTQ[\VA;LPRTZROSUPCBF^vzwl_SEIIKLP]i_cb?_na}{plu}uphb[OH<7AGK^JIPPSVTQG?OjXeic\TT[^`fbTMj~uheipia`[QKD74BH?7645;@FQdo_HEMSQ>/9GJJHCKVTMKD>???BDFFFSeaVYOEFC9786@KECP^]UNNU[]P;7?CIKEAFMOMOPIAGTXYTE;=@BDGIJHFEEB@CE@;:=DMVWNHHFAMiutx}~{xwvtfL>@DGFDCA=;ABD`|ic\G`vjceWZ]_a\PEBCFD=8778;>CJPOF@GWaYSTMFA>>>AA=<@BBBDEB?=<;=>?==?ADEGIGA=?ABA@@BEGIHIGFEGJJHEBBDCGMJD@@AA?@A?@FIJJIHGA:;@>=AABDDCCCDCDA=>GRQKHFFEA?=:;DHGDCB=:??<88;9899;;<>CED>72245663.-0136898889:;>?>:981**22.045644542;S[UNKME?:6641.0144:@>:752139?BCGIFA@A=5.2889=<6013325754>936CC@BDGIIKLI?65:92/UgcIIIIIIIIKLLQ\b]X`d\SONNMMLKNNNOQRSQLHEDCCCBABBBABBCCBCDDFEEEEDEFFFGGEFFEEEFHJLNOPSWXY[]_acfhgfiostwxywfPCBBBBBBBBBCEEFLMGDGJKIIIHHHIJJIHJS[]ZXXYZYXVUROMKKKKLNOONMOONMMMNRUWSKFACMW^bbcbbd_TPTVWXZ][VOOTSE>???@ABABFHFFKPSSQPOOONKJJMTVTPQTUYWKFGGHKQVYd[FDEDEEDEGFDDEFDEECBCCCCDCCEFFHKPZiocRV[^][Z]XTU`b\`qu]T[XRRWQMNQU[UVZ\aadhhkbURTZ_arkmttmg]\ksibiXA?>@ACDFFGGFDDCAA5ztdahzgMHLRPXkl]PKMNNNMFAFNY^TJEEHKHFGGGFD?7KqWQ]NAQJDGR\_R>89=??@CD=;?IXWIFLNPVQL^mdOKNIUyU;A@@@?>?@FKIGHGECE=Nǯ[K]`akvvxyrsxn`U]LRW[`ee`ebt}pjt}yyf]OU\TMclV\adcba``^[YSIL[`JLMJHIUWWtqp{dzϺŨ}lnyʺ¦k{l{}{``}Ӻnqwsh^g|ƶ}X}v`a_fivq_~yqfhc][Y\fnvw{rga_f|sWomK9D_t_B)VbK`[osriwb`LK`sjTKAB=:45LTSZIBFihT=H]SC@SIZJHA9KTKCFK.1??:=<>>?CDJPJBAILIFIHHFEED<@;B@E92>:::;977:>BIMOQTRQSUVURMMKLIGMSRUYZYXVTPMLLNQSSRSY^]TIFFJIIKMNPRRSTVVWx_LNKKJJOXXXXXOE@ACXbzUGPVY[IBORVTYXWZYRGE[pnvxpg_SPPR^einebjARi`}xmt{ncZ\[UJB?BNL]EDMPUTQRG>OiNLQYZWY\]ckfWOmudY^kpgadaQKRH13B>556668>HWdZB;@DJF85?CDEJUWOLOE?CA==;79C[xsWQPIGB568>IPLJU_\ZRNPQRP@7=BDFKSZ\[RNSRIFOQQVNBAJPK@>>?BEDBDJLD=;6:LYOFGFC8?Xnz{wsrrrplaL>=@BCDDBAAABB?Ln}tzcJlqcihYTIIONIDGLMI=65;?CFEKSLCIRY^UMMIA>>;8;<99>>=?B@==<<<=?@@??ADEFIF?>DIKF@=>BEGGIGDEHJLKGDA==?B=9<@BA?@DEDCCIQRQQJ>@GC:;AFCCC@<===?<<78:==<@ADC@CHID<625779620023479:8754225:;=;941466334554525;K[YSTUO?788620.4897GJMOKA?@=;779:=?:423530/248BGA>BDJRUQONKKG?:??1,/08@A<73DTQJ?AHJڶzuoVELL<89ACDIMA,69LB6:=AIMOMA>>20>IIJA65549@Ts~eTO@/LspznC=PNLNPD2-/15:<:79::=@BCEHJIJLI;6?D9//?S^gid\VSNIGGIKLMNKIHDBDFC@CEACC?\TagNGӿoYGIG@AN[_YIJJJJJJJJJJMRPJHS]ZRONNNMKKMNNOPRSQLFEDCCCBBAAAABBABBCCDEDDDDDEFFGHHGFEEEDFHIKMOPVYXY[]_adfhgffglqvwuqeOBABBBBBBBBBCCFHFCFGJLJJJIIJJJJJLPY[WVWWYYXWVTQONMMMMNOOPPOPPPOOOPRTVSLEBBJWadddcbcdZQSVWYZ\]]YTVWNB@AAA@@ACDEDBDJMMKIJLNNLIINSTTSMLPW\PDCFJJJW]ODFGGFEECEGFDABDDDEDCDDDDDDDEFEJSOSgfSMOPORV]e[XVZa^ertcX_dZWVSOOUZZT]inty{fafWEO`rtuswzmgcZbgnidk]GA>@ABDFFGGFEEDBA;wp`ahvaKWggWSSQMNNNNONMJEGHOYUOHEPZSKHGHIH?7t^PNV@6?:>B=:;:868>@>EKD=:U{N;>????>>>?BFFJMMPJEKIn˯i@@ABNXTE@ABCDB@bw[KWgKCHJLRIwFHUMFFMNdcUhky}}~|{yrzzl]\^M@AFLNG>BZgglmkhijaadffdkUVU^oyo_jqf^lrn{縅pic\tQROQYRIwtO\bbbb``_\ZVKOURITQSRP]jcşĵ̭ɞǰýxdr˻ɨxhwidϳnqvvi_ŧqYp[\Uhpz^xvqlkg]SUVWW`szmdXPikF>7DZz|jVg28XhOxlqt_g^iON]mnZNAC=;1:JWVYJGHgnV?F]UGEVP]GKKBUbQDML/6F98?<>>?A44438669<@EGHMPQPQRSSRONK_iVMRPQTTPNOOICDJQUTTRRUYZ]^YPLHGGJLMOORSVUSTxQ;DJJHFMW_`[TTNKGENH\wkVY[]^eNANRTQX[XYUNIImk{{yuqnaTTVZakqgXiAJ[]vxllobQJRUOHJE>DCaODHMHENRI?G[NHLW[]\[[agcXBIKMWmtkgcfj]NTYD4:=:;=8226;@A@=:98>75?OWUPRTIA@>=:5/6GXjn]PONIB69FQSOQTXZWXPFBBAB@=??;;I^^TPPPQPKINPOPRPNOPE88<>?A@@DIKE@?CIPOIGGHE>9@TnytpsujUG<<=>>>>?@BDECCBDUm{{\omWOIFA7:DIIJNQPI;8<<;>BB@BBABEC@@A?=>@@@>?ADEFFEDBEFJKGC;@C?==?ABAAAELNIGHHFDIKCBHECFNRQOKD@A@BC>=ENOGB@ADD?;9;@C<79879<;8:;<==?A><;?DE@963699;9;9855579:;:73/04<@A?:7=A<998667964GV][USWTD41:48;94/,,+6EGCB@BFKRRPOOOL@3AM@008@AB=:@KI=9;FmGYǽggqhACA:=BBDDB@AE@6:DWU8-/14:?>4356=Ocnl^Wd^H8?FND`I5?>ML@=AHR]ZM>:<639>FF>229:=Hg{E;?1Nr3-hN1ADINM?2./038;6358;=IJ<46=E]rrgTLOKFGIKNOPPLIKJHFFD@>@AB::ł`WIk׮~aTUWXYVVSUHIJJJJJIIJKJJHFGLRSRONOOMKLMNNOPQSRKDCEBBBBBAAAAAAAABABDDDDDDDEFFGHIIGDCDDFGHLMNPRVWY[^_aeghgfegjtxzreYJBBAABBBBABBBCEEDFGHJKJKKKJKLLLLPUWUSUWXXXXWVTQPPPOOONMOPQQQRRQQQRRTUSLEBCHR]bdedcde`TRUWYYZ\_]YXYTGABCCA@BDDDDCACFFDADILONJIMRRT[VFJ\^ODEFGHHQ^O=AFFEEEDDFEDDDDCDDDDEEDDEEEHJLU]VPY[V\cSOPIPTRXTS^_gc`e_gkrgVUTQXZWS^lrpmnjadlaTR]egcmxynujih`jj`fhS>>@ABDFGHGGGEECCFrs`]`fqeQWadWKMMMNPNPPNNRNHDJRQNHEO^`SHGIHH<]fSGXO?<;8>@<866658@B=AIE=<@GHD96A]y|pigb\YZVH6=pM@>>>>?ABCEEFKMKSMG[~i=@>DO[UE?ABABCIoyi~eJVWZswWONQ_MFKLKb_?H~wxccXFDDDEA>Y{uojdfcUU^[Y¼YPUXcjphi~{hYY[ZN{㹠zg\ZVNOOQSSIlgW[[`aada]]YTOUUQaXbg_nxȨѳԷ׷ƾƺnxwf˸ǵq{meuήmrhoƌmlhSe[ir{bqu^d_kpmf_VMGBIU\emhbYgzkK@WL?ITzZAwi:cyd\lcjuW]OgcQ^itþo]TEC?=2BKWSXGNHbmX>B^YOPXXWCNUJVdTFSL2CDFINQPPQQQRQOK_zqXNNOKKGCEIC??IX[XURQRTXZ]b\PLJFFHKMNQSUUUT\fN>CFGFDCKU_a]ZPKFGINWjgcc_`adOANRQNX\SSNJJN[qepjh}wob\ZY]lzrRlUJOTfqa[dji[FAFD>@J?88:[XB?@:DRPNFCMOTX]a_][Z`cbY938KYklghfefcULTTD70;OXTQXYLB=<=;43DRST^cYQMID==GNMMTZZYWWPD<=?@AB@<84>VXGGRUSROOSURMNSSMF?=>=<>><=CHKFBAXl_JJHGHJIC==<<;98A<@?DIQTQLECD@;>FQYZWWWVTPNJEC@?>AA@>?AEGGDEKLFDIRTJ:6:?EG<6@IIJG@;;=@@=>ABABABBFRWTLHJKC@ADD??DQSSUSTRNDCHF?=FKD:9:>@==<9:<;746669;:9;;<=<:5029=BA;75469;=<<:888788;==9515;CFDB<7:<9789877613GUUSUVWM=26GC;98:99?DC934794.-/6FPIHVYH32;A?<<<=;9<>;4011,3JOEE>9=DOTRPRRLA22AG90=CG<26BVw_heΫțS1LO8;AEJIEEDEDDDB8>K][A0002344334709YooieihU7ABDGGIKMKHHKG@;;:5Rw}hE?LKDJQTSPMONIINLGDDB>>@@;:_yswg|޵urԾxka`_]cni\JKKKKKKKKKKKJIJJJLOPOMNNLJLMMNOPPQRLDBCBBBA@@AABCCDDDDBCCCDDDDFFGGIKJGEDCDDFJMOQPRUWY\^_beghggegpx|~t^NECCCBBAABABBBCCDEFGJKKKKLLKLMLLMRUTQSUWWXXWWURPOOOONOONPRRSRRSRRRRSTTRMEDDFIQZafdceecZUUWYYZ\\\\Z[YLBADCBBCDDFFDBBBCDABGKOOLHJPRT\aTFYiQBGDBGHJXZLEEFEFEDEEDDDCCEEDDDDEEEEEEJMQY^[XYY`jpVQSIEGIMQU`dkdX\apv~wlZNMY[UQVah^VTZfqn_ZX_USV`ijguebjkopidib@;>@BDGGHHGGFECAIlwd]afn~qWLDFHDM\YPSTTPMMZ^IDLMOMIEEQ_YIFHJFKsPBP`=8@;;@BB@=:978@B<>FE?=@EA;?Tk|wkfd^\\W@>>>>?@AA@@@?FKMNJA\QTY@UFDPXSEBABABCKpxӋXTZgf`X\zz`U\PHCBIKE:Tlb\HDEECLZuwwxwlfgfZQOQSVKT[_Zk][]YPPͽfUTPPT]fPi]RXa`^qca]\]WdWklcmr}ļ̢ɱѼΜˤ¾¾Ų~~sȺwǣy~qudxyf|̩my|gjkihgJlrnouzhtr_SOZjvx{{{|{{}~n^`r~|jT@JkbEA?adD__BYln^eyUTA[tP_gjĻqa[Q@<>4FNRKVGSIZhUAD`ZXVXZQ?RZOQZSJTL4@H4GNC=?:HPLKFBCGJIILKIIHGEDGIGEDAC>331165799=AAEHLNNOPPPQQPL]uxfQMJGDBABHID?IY_]VSSRQSUZXXQNNNHFIKKNQSTTWY\TECDDDA>8B68FJKPG;7?IONTPCd]YY]_Y^^[^ccVA?IJJPcmiefd_QB;CEAAC9.+06888438859ABBA=7/8HUTTZXMD==??=@MPLOY]ZQKFEFC@:9CS\ZYXUMFB>ADBA@>:5;TUBDNRSTTUWYVRMIKKCAEF=8:;<@FHHGD>KdiXOHIOQKMNGGRo~xW79@@><:9879?BACDB@HSXQKHB><;56=CJJGFIKLROD9;GMMG?;>NY^afgb\YWXTKEB>?AA>=>@CEDBCKLEAIU[L948<9458<<:;:99:8555459;;;<<;=;6217;>C@976578:<=;9877789;>=9768=CFE@720025788763.1589GSVUPHBCHA;;;<;:::72236966>E?8>:8FN?,1=><@@?@@B?96323445LOBE=58?LRRRSTNC4*1<91=DAC??@@?>;G\bmsj}G`ͤS(044=C?GJCDEEDDDC;@RZV=10/01//2124.9XpqpolndKC>,nISXWY`XJMXmvoJ3=F@:>CB;42=-]\W{a^OBS0LxQ5;ED;93//0//.0348:<>ACDFHIKKKMMJC@??94Dhw\:;NM@ETYUOLPQJINKEAAB?>>?@B;?BJLٹĻfn~|saV_uuk_JKKKKKKLLLLLLJJKKKMMLLMLJIJLMMOPQQRNIDCBBB@@BBEGILNOPKEGFDDCCDFFHHJLKHHIJJIJMPQRRVXXZ]_`beggfhghoru~bGBCCBBB@@AAAAAABCCDFJLKKKKLLMNMMOPQPPRUWWXWVUSPNNOONNPQQSUVUTSUTTTTTUUTPHEDFHKPW`deeed]WTWYZZ[]]^]]\RC?BBBDDDEFFGGFDCGFCEKQOLJJLQY\^_TTaOAEC@FKIQ]ZKEFFFEEEEDEEEEEEDDDDEFGGHQSOW]`bc_[krpYVVOIMMHO`lnpoaU[hljvnWFQ\`XPVej`_`fklf_TRZYY[^bekvhPbhfjjh`gQ>>@ADHHIHGFEDB@9\j]bipxP>57;=OlgTX_[PKLZ^KHRROKHC@BKNFDCLDm]GLgZ77<<=ADBA?<;99?A==CFEFCEECJlvnmjf`QC=?BoeNHG<>?>>>=>>>>@@???>@CEINMQWqmUDMT^BQRPKJCBA@LzOchǿɿvld]C8>8MRH@SHTJScLJP[ScX]WL?BDHIGJLLMOPQNZeloaKCEFGGKOTMFLRTTUVVSNJOQONPOSWRJFJJJMOPQSX^]OFCDB@?:62M\VMRULSSKKSTS[ccaUDLTPQ[]UVOLPRGTg`NP}zunxmBapVTT\gj\D>F]g`MDFFB<>C;IH@?>8/4=IU\[SJI>:DKE@@?BNSPMLJGJLGB60NfnaKKZWLPWMBFb{x|lJ6;BCA=;;;:;<=>BGD<=LXRIIIHFDB@?AFOWQFBGLHC>>?@A;8;>C@CEGMPQW]UB;;>ELSboqaMGOVXVPF?@A?=<>=@?@>?ADA?IXXI:89:<>;9;=>?<=ABA>;89<><9:;89;9776569<==>=<<:77>DAAE>9:<::;;;==:876589;>=<;;;;?DFD822/1478887540/(0KXVVXXSKD@==<<<91-/13458?@BGIIA402640/7LE8D<667>IRSRTQF8.+-22;@@BA?>==ACIVdooqdetM=̼I7456881>HCBDCCEEA=A@?;/.11112231116IcoqtyojeL>6<[K]]cgrobnTDIF=@ADC>>?:Cɠyr~ocQGS.=qh;;;4/11000/002358:<=@@??CJUWܾزjx{z{ib]JKKKLLLMMLMMLLKKKJJIJKKIGHHKMMOPQQQOLGDBBBBABCIQTUXYYVPLHEDCCDFGIJLNMJILMLORVZ]\[ZZZ\^`bceggfijhddjw~hH@DDBBB@@AAAAAAABCDGKLLMMMLMNONOPONOPSVXWVVUTPOOORSTTUTTVXXXVUWWWWVVVUUSLEDHLOPQW_cddeaYUWYZ[[]^_^^_ZH=?@ACFFFFFILMGDHHECKROLKJIQ[^[\__UEDFBDHMLNX^TGDFFEEEEDEEEEEEEDDDDFGJR^^RTbjjf_Tabheig]UVWUVckilkeWN`\Zf\VOaegaZ[`ife`XXUUXQNUWWW[bcilkcjfba_`\m_A:>ADIJJIGEECBA9Ug]dluuI:649A>;?GOSNEACDWzqmmqdC9=<6>bhL;;=>>?>?>>>>>>>=>>>=>>?????>>AFKQHA?finBRPONIDB@ABNgmbJފNqeZRrt^ef[__}STOJIIHJJGZ}twQDEN\lmejo{~ofeif[RrUClkIWR֢hdc\Xalot]Jcɴebd]QJwX_Zyzh_x]to~qŻȢϻŮ͸ǿǾĶ~~~zľ{˾æcos~xnjjdquy͑jgnCcphryXbuul]PQQSSSUetwviX_hbUJIMOS]]VZLSl~Yrk{Yyl[]S?JzURžzwkcP>>=VO=9NIQFM`EPWOQj[_RA;VYBMKSWOQ=NE:OUQ>ILPNJJI?IOLJHLJNQHEFKHGB>BDCC?:7>19L=;::<>@BCBDFHJMPRPV``fkZHKORQQPSRPOLFCOZ[UMIMPPPOOSXXURNJHIKLNPV[\XPACA@BD?17BHJU`ae[NMPMP[ffa\MQY^^`a_QNORRHXlfOAgt|~nJYq_XU\b^XW[_a_XF?FECCIGCRa^ZLBNQQL=DV]\BijTH96Fajb]\R?=GLKH^pYKKRWH3.01245238?=51..05BJJKMH>?D8.48=Q^[KHNF@PVE7428HLIIJMQWRIEC>AXkYDF@8>EDGJF>>EMVZ[UIEHHGHIIKNSRB9CPVUKHSTGEQVLFEJQPE>JQ\SNQRQXZPDBDX`h~pSU]P?:=BED?;<=?>>??AA@?;?IOSVUQNMLHD@AMZVMFFNUUQG>9623:==AGHFEJPX[RA8?NhuqcL<@IR[^XKA>==?=:<<<;<===<;:<@@E[ibLDMMMKGGGFFFFEDCCFFD@?ADC@?@A@;89;987668:>@?>>=<87@KLE><;9>?@@?>;=A?965469<>=::;<;=>6-.568:<127<;/)2;66D;5854?PTRSNE=::4.19DMRYfnutze=Pb9:386635?GC>?ACGF?7763//23310256613=Rhoqxp[WI:2]|7JMXjvOAJKFBCDEFEHI7ʆMvzvsZI\-2\|A95//001000002357:=@BCDGJLLKKKLJC@B?<=87>>9@FA<@FINQRPLJKKFBBBA@>>@B=>GNJDЫ㭉v[eZa`JKKKLLLNMLMMLLLLLKKJJJJJIGFHJJJKKKLLJFDCBA@DIMQWXXY[ZYXUPMJFDEGGILNPOKGHJJKLMPTW[_ba````bcddbejf\]da^dS=AECA@@AABBBBAABEGHHHJLMNNNNOOOOONOPSUUSQPPPNPRTVXY[\[ZZYYYWVWXWWXWWVVWULIHLUXUU[`bcfd_XWYZ\]]_``_aaTC>>>BFGGHHHKPKFFHFDHMNMKKLQW\]Z]cXFCGDGIKLMRZ[RHDCDEEDCDEEEEEEEDDCDKOYbdZOYgjea\b`gnpmfe[U[\\Z\e_Y\ZfdbYT]behidaVWgheTHMPONTY]]\Zhun_fottqlbb\fwlRF=FJIIIHFFHILNJ\kcfmxsD8979;<>BEFFHNXUEJVMHNPMC?;77:DDF?q^P]eR>9:;;>EA:<=><;:<==;;ET[TE@C@:BTjrC5====<<><=?@??=>??>=>>>?>>>=>>>???>>>=>GRSH>TvxfETVPGBA@ABMVXVVFWe]hgbZX^_VZkYkgTLMPSSMK_s]FGZ^YNOi|vgUZ`izmUSDN~^OWEuTX\fpvnkbcJpub]aYHCCVͼslmzd}oz}θȼ~{ʿĺʿ®~~}|{՞ùϪqxwwv~wqnijzeafswÅtpoE]yzx}|gPWmyxk```cgcZOHINWbipz~iTEITSPSNBWsQXv`vs|_bWWX?JsWpźõ}{wheZNCETE8:GHNBJ`FOUHXg[UO9:ZMALL]WILEW?DNWVAQRRSKLFAOSLJIMJPRGGHKLEBAJ@@@B8C56?P?>788:<>??ADDEGHMMQ^`]de\\[WSPMMQVQMI@DSYUPOSTTTTSTVVXZYVPMIJLOTTU[\EEC@BB>12QhcI:Fu|`Rhw]TmeZUXchfhgfda\IBEGHJJI[k_IGULALPCASZWY9ZkMBA=DWgi`R?1@SVORa^B@EFB6//23445206BFEA;:@HNRSQJ<:AI<3989GPOHHNPSWN93636BHHKOQVaaRKMNIQ^TC=;79;=DGC>BMVVNHGDDEC?@ACGJJE=9DQYXNFN\^_b[LHKPVVK524@DCDGIO[]M?=?BBDC?<=@@@ABB@??AA?CQ\^YPJKKMMD=EV_ZJCRdcYMC;55>@BFYormi]OFEMTYZPB;:9;948<<<>@@@@=;?CC?<;<==;:;<>CFC>?BEECADGGDB><;;;=?GS\O@DLNPLDDEDDDCDEGGDA@<>HNKEA@CC:568873368;?A@?>;869AIJD<755;@AABDBAA?9422368:999;<;9>EGA96655579;6/-.06I\YRUZWNB:@CA<=;1,5=>??AFQ^X>31.22457878<=CFF?77>IQRWhtv~X<=Ks`?3426899=AFA=:;?CF>34875555441/3;@<=DShosz^JIF@@XRNPJYoZ@34o{}jPf-1HM2100011000003357:;ADBCGKLKIKMNI@>@>735<@=:=@=?B@CMOIKMLMKDBDDCABAAC?GHCBMZP=;98:DF>TlSVfX;6::;>??<89:7:=><<;:8BTZOA=?EB84>odA9====<<>>=>?>==>AA>==>?@>=====>>>>>>>?ACLaVSOfJm^[SP?=?ABFJJJGLKBjʮdXjjbWOZ_LtƛkhwaYSW__IGq}hssSN_YKEN\]WJDR^gpymUERSSPVVh̢bXgzwnaVf^Lsx`[`_[]crȷφtszíʶvŪȽƳʽ{~yt®ͱԴnvĮphswnundŸsddfgvjsysFTpyu{qbQVaenqpmhcPFHKF<5Bi}plwjVZkZKzMXoZP{\VU@@^mϵyttvxwso^XNJLC9@EEL=F_FNTDW\RMI3@UCM>W^KNFPS>HK[VJUQUWLQCCUSLKKOJMLEIHIIDHIG@=BA@=->HSLKBF\{u`Tene]Wckhjlkmc_LEGKNMHKicG7=OL9ALIJTZZVBUmFCLLHL\ibP@1NjbWT]P@CG?3-//022244227AGJKKLMLLMMD7EJIKQQPWc]RNOLJKIFCA><9:==AC@<:;>ELKE@A@>FUWMEDJVb`VKGIMTO@7302;BDD>?ADFECA?>>?@@A@@@@ADEBFT_aWKHGFOUI>EPWRE?L[]VLD<9:3345:@BDFFFDB?;=@A?====;::<>@BA=<;<<=>?AAAAA@>?@@?ACEG<9DJMOJ@=>?BBABDGG@>CEGOROJFCB@:115645677:>BBCB=659;?EEA85;CMJHGHIFA<622246998:9::98;9314885114776558:3327A<545868KQKHJLNRRF=>ADEGLIDCGORUdtxx~y`IHGA???;889;;;<>A><;;:9<>6/034443233138=ADEO`ouzdJHFEEKMPYUUZh{Ț<9AEC0S+5=DxtTq13;538@?::65:f[Cױ͖qjbeŒb\hgWKKKLMMNNPPPPONMLLKKLLNNJGHIFEEFGFEDDDDEEHOOLOUUUVY\\[YWVVVWVSOLKKLLLNNLIIIHHJMORPRX[]bca__`_^_a`]YZ[PACFAABAABBBBBBBAABBCCDGLPQNOQQQPNNONNONMLLMMMMKKKKIGILNRTVZ^]\ZXWUUWWVVWWYZULFFMU[_`aabegbYX\\]_```aacd[H>@@BDGIJMOPOKEDHJIGGKMLPUVUTVVX`\MFEFFHJLNPPV_[LCCFFDEEEDEEEEEDEIWeiloi]VQMLNTPPd`XZbfa__]]Y^cUQ\]\Qba^fkkhb\WXTZXXTUNQcggglopg^WS\od`a`ccdZoqllP>;JY__^^]XUSUOVwhgmwP@@<==<=DGIKBAEC>BJE;;<<;:<<:;JLEUYgdI>=;::;;=BGIF;GSVSNG>8?QSE;;=<>>====?@@>=>???=======<=>??ABQsb]~z^T_YONRTPLGN[^b]_|WGURPMm×lq}udaR\wOTlrgXZ^{ըѧʶ˼úww{zĸ”ûƼͽô}zzҿүã}p¾j`dqmYrlf´ǽrfgejxjp{oKTjsjylhfa`]Y`kpo{yngZMcvZfx}|\Ue|tsIo{]@jhXTG/sͶĹn`^gv}~|h]XRLC>>?CCDMVXWYYXRHCHMOQRNMMMHHSWQPTWVVX[]]]\[WVZZYVPKHINV_[OJ??ON34CNJGGCILMMMOPONP\kfd^chkjeXRL@Ino`G8=@=3=YJ9DT`z{h\P\old`aeegfb[T^PFJNPNHIQC59=@C@>KRKQYXWHH\JKMOOHN\XF=4K]ZYRYUJEE?50..035689<:425;AEDA?>?C@@EGI@7118@BDHG=8859BC@BIKNVVRPNNWWSKLOMIFFEB@=:;;43>@@FH?7=HSMCCNRC?Q]TPPIJUSMJHDFMJ649528@CDC@DQRDAHK?:Ne\GADC@ABFJGDEGCA?@@@@>AABFGEIS]\PIHA9DMG?=?DLKGGNTQI?68AEFGHGIHB@A?<:::;>ADFSfihgbb`RFA?<::;=AGJNQNLPROMIC=;=@?>>>=:8889=>>===>@@?>@@@?AAAB@=<<<;AIKLH?87;?@@ACED==HNNRSPQOHD@9246427<<=@ABBDA;79:79@C@9;JSY\UKLOMLC98:78:<=::99989;<97899533345689>@@?@69Sa_WB/6?>8;;0&2CC?98J]lY:266679753252.AQD=HK@45@@9997679?=864620;DFHHDBGLKEB@CEFMPLHHKKNduna\Q?=FIGDDIHHFD><;::===>><:6:@:.+/1356557769=AAFO^jiN>DA@AABFEKV_mt͛;9DEGILROC99A<<76BUYy~Wxx794ev50211011101134689;>BGGC=;=@CEC=>BA=<=<:78>BCBABDGT]RIJLJJHEEEGIFEHEPIGD>?>8=@CUϺuuo_\ehoycV\jePKKKMNNNPPPPQPONMMLLLNNMKIHHFEEFHGFDCDDEILLJKNOSUX[^][XVVWWWXVSQMJIJJILNJFFGGGHIJLMORTTUWZ_a``b_^][XV[QCCCBB@@AABBBBAAAAABCFKNOMMNPQPNLMMNNMMMMMNNOPMIILMNNPPPMMOPQTUXZZZZYWVWWWYWRKEGOUY\`aabde_[[\]_`aaaaabaVD?A@BDEHQTQONJGIJJHFHKLXe_SOQSTWWNHFFEFHKOPONU`^PECBDFDCDDEEEDEFIKT_gokbb_SOS_\X[UXVUY\_dhlb[XTRPONKYjbcfjmke`dZXVSRSQO\_^]_iibYPMTagae\dfVPkvoeQ7BXfjhfc`[XUWRTwgelwUCGE?<>@A>8>DNWTN^ffb[YTE>FF>:;;DD8:EL==mpB9<=<<<<<<<<<=>===<;899;>?>========<=>??@A>Fyu[LM@.5M?JHGaI@NSOAECVaHTHJYXWJBUVKNJPQIHAJDENCNFFG@EDH>2:TKG<8=:56999:;<<<<=?CIOTUTSTUPD@@CRQOMKKLMLPTSRTVXX[^`abb^XTY]_]XSOOMMT[WPK_mW22BMHGG@FKKIHIJIFFQecYJQajuvpbQEXkcXH@CB?7A\O@DQ\ttf]RSnhekded[PLEE\ULMNPND?86;@>9GTHAKNVYRM=2LNGENPJFLH:5115FXRX[QB=?;1)-7;?ACDA;3,*.27;:657;>@BCD>754;DIID>92/9BJE?CKJL]e[RV\YROPSWPFGFDA?>;;955=DFGGA;=??KZSGMX^M>G\aSIR[Z^e_TMJEIIECIJ<15<::;DUaehf\RRVUQQLA9;@@?=>>=;889;>ABCDFEDCBAA@AA@@BCCAB?;<@C>?CHJF?::;415;?CFDA?><;:;;:;;==9BS[\aaWSRSVN@?A<=AAB?<;==;9<>@>;;;;:765535<@CBBA:;Pb`VGCJG;6;=4)4EC>;:K]`G66:;;=:213662-=J8.:A<29D?211468:??:;=85439DHD=8;CGD?98:=GNIEC@>@N^XB9>EE@CEFHKNLJG@>=<9==5/06;=;<<<=@A>AEENb_HCC:=<624@Vdɼ{.4KegRUXTH@A@AKhJ>2MG2322111111133579::;@B=99<@FJJJKGB???9458>DFEFHHKbqY@DPRTUSRRQQTSQQSPOE@BFGCG@/^ƊhhWBCXeZRbkbYY\W^]QKLLMNNPPPPRRQONNNNNMNNLJJIGFDCEGGECCDDEFHHGIMQTWYZ]^_]ZWVWXXWSPQOIGHFHIHHGIIHFFFFEDEJLRY]`aa`aa_^\YWZYJACCAAAAABBAAAAA@@ACGJJHHHKKKJJKJLOONNNNOOPPQPKGEFGGKNNPSVYYZY[[ZZ[ZWWXXYZZWSLJNSVY]`a_`dc\Z\^__aaabaad_OB@@ABAFQVQQTQKIIGFFHIHWjdRNOOPRQJGHEEFHJMQSRNS_`QGBDGEEEDEEEDHOSMGPY_^^feVXfmoplilfbeeaalmd[SRQLJKSP]a^\acglnh]ZXRONLQUWajlla^_\aX_njghgfVTeqodRBSadggeb_]\[\XVxgdluXALOB<<@EGFKLJDAEIHB:99;::6>OVYSW[jaF?<:?BJQOIACSVRZaa]YXUK@<<;<<<@@@N`_I:LiiO<;<<;;;<;;<<<====<@DC;6<=?========<<>>???>@GSkdA8gi\QGFHIJMOIBM_aEBGKMHHLJEDGKEV{}yndgf^RGEEDHPOY~wjgZUnzb[[bWJGPTRQT[]\[[ZrXLYZXTVvzuhshke[VWXZYts͸ɶþǻΰʽx~wy{|~~ζϿö̻zƳƹӻ̫u̟z~kb_`]iiůz~qnv|~gzcZ^ccopdckcYbmpid^XIG]~_k|vqkawpx]_az[zmUOtfGcīwg[[TJIcmgiYAEF6CB0@PALEEF;>8*:H=NERW>COREBFFgKONFQY]M=HTUGNHSOKMEQ@JKCPEBKFGFK=FJIA7554=FGCAFIECP[WQYeaUQXae[ORKAA?>;9;ADFGGGGD?EIHM^gebcbKHL@888;>@CFF?4Cd`=/C^_J>=<>FQ[cfec`WRWVUWWM?;??><=@C@>@A@?BCDFHHIGDABDCABBBCCAA?<;?C@<=DHC?===>?@ACEBAEHGEIMNPSND@@B@96646>CC?<;;:9867:<::?=:=AA>:9868;?ABCCED:E\]QLPUQB66IA798HOB486;;??723;=;97<>4+/3329<84344547?@88B@?C;@GDCA>?FHDED>;=EONG=79>BEEGGEDC@@?>;===BEEFC6-5DC:7:=>???ACFB=AGIVcWJK@<><3.5Mfr߫S2;TriLFEBBNHEHIGAFHDSɇj\llGlA@9FZ0222111111223579:868;;9;;:=??AB?<;;:867:BHLJIKIPelSDT_^YU]ge_^`bVNJLRHBIMLPUK:.AskrQ7`eY[PJNawdSUZUKKLNOOPQQQSSRPONNNNLLLLJKJHGECDFFDCDDDEEDFHLRXZ[\`dhjkga[XXYXWWSLHFGFFGGHHHIHFEFINTXZ]cefdbbbccb`^YUX[UIAABBBBAAAAABBAA@@CECBBBCCDEGJKJLOOOOPQQQRRSSPHB@@ADGKKLOQTWXYYXXYYWXXYYYZZYTOMRW[]^_^^ac]XZ^^``abbbbcb[NA>??BEKNNRXUOLGEEEGGEUjdPLNIHOOHFHFEFHHILRVPLT_`VJCEGFEEFEBBIZe\POVVTWXUOYie_eplkkllfa\`be]TRUSPSXV[^[]`cjg_WVabZW]QYa]boodX]a\\boplhriaa]^rpd[Q\hefgeb`^\Z\[Xxgckt[AINFB@EHKLMPRKDCGIF>:8:;>?M^`RnfVcfSD@;:AKU]YOD@PWKMVRW`T@>?:9:;<=9=<========>?AEHGFTSTJQլ|jMFHJKIEBHNzQDEHLORPLF@@DMa~jWTRNLMRURS[{yng\Tg~nr}YYZbUHSSIKU]\WWWXZWZLWXuȴ{vzyqixya]a_ZVQVhYï̼ļƻʳŽyvzvzȧƽ|ձŽλʮvvhZYaabo˻{tnzpfoaZda_fozh^WaicXYcjhcb^^tywrpthSsrfr`Qx{sxa|^XZj_iԵ{ncXURJAAVs~kgbMFF:>7-?=:KFOI><6.:>AOGRPJRTDLIRMMQLUDPBGOHFKLFIHCGIIJ;D@E<;=33;7899:CHTR@OgSCGQD\kPQRNJIGA>4.3;BOW`ebWJEA<18KNBBKSL75HL>56667:<;<<<;;;89=@DDFD;1.6@DDCDIIHHIJLUTVXVW^ceehfVE??><;@IONJFGKKPUUQWbgc_[[QITbaQUTMJPWYWOD?===;;<=?AEJH?:<=>KZcdfghi^TWZ][XQC;=====@CBBFIE@??@CGHIIHA?>@BBBBA@@@><=>?><:BFA><=>>ACDEFC??BEEDHNROGBACE>67<<;>>;:89;;82248:;;;<<>O`egfaWPC95689;?BDEDB@<::>A@=8<@>9778;>ABEFBBGD;:KWPMSRSK>5;FCCIB>@BDD24E89>@<7:=@@>?A=541/014:<73345644<@:4:?A@BEEDDCFHIHFKMGDFIOOE<<=>>:57?EFEACEFFGEGLJBA?<:;=ADECBA:229AD@:8::<>AGF>:?DI[WCKL9<<:98=Zne~۠_QMdsY>4626RHACGGELNK[v͏ZHI=;97655699988;::@HLNLHKLJR`[[c]WW_qywwqcaVMGLZXJKQRW`\E0)2;MlkXm[MPVSaÍcTSWUKKMNOPQRRRTTRPONONNKIHHIKKIGECDDEEEDEFFFDEGKPX\`bhoqssrnic]YXWVTQJFFFFGHFHLJJMRXYX]bcdededbaaa```_\VSTVQHEDBBBBBBAABBAA@@BB@?AA@@ACFHJJKNONOPRSTTTUVWODAAAACDCBDDHLOPPPRVWXZZYYYYZ\YQMNTY]]^__bc_ZY]_```bcccddaZMDB@@A@BITZUTQJDBDGGCNbcPFKGDJMHEFEDFGFFHKQSQPU^^VNECEEEFFEDHR^^ZYa_^ZOLNV[RJP]\[dge]\ZV_e]TQVWY^UWb`\Uapq_NMUaaajzpw|g^hhaafdbbntslfa`aaabqlch\Xmokjhca]XW\_]whdku|\BEKFCCFJNTXUPGBBEHGC=:8:?JRWVW|S[h\GB>??FMORLH@=J\QIOPPRG78=<;:;<=8Bmqhc\ZVOLF=<=;;<<;;;;;;<<<@9Oe<;========>==@JPicLXdZrǍfgxbLCGJJCACBBfA=IORRQRRJA<@SuYZ]ZSOPXaWYSX~g_[Y[c]f|XPT[aUQWMFQ^a^\XUTWTw[I[˵douulc]VV]]ZWSVvh}Ϻžʻ¸¼qw|uuû¢û¸ҵģnaX^gpjtȸ~ul{y~{cwic|a[cagcwow{tjeifa_]\X^klf`VVk~o|jam~}t}YceUdmjxo^Wvo{wѺ~th[ZVKD?43M\srbf[K?6836<.8JEQIA:507H@@BBOgNLQNQLJI:CLUTGMKMOQRRRLPANNIIHMIJEFELCL8MFE=<>3/;7889:;EPTPNKKLI>68;;<>BFKB99=CLRUVZ^_bdedc`^]^[YXZ]_`^[_a_XPPVWXZ@1?MPIGGACDEHR[]]XJA@@BM\__\URQV`aM@FMKGA96513APYiymSRqs^K>ZH<@XWVECNOG>76777788:>QhX:\XB?A5359?DDCEGA1*9IFDFGIIKNJFZkXO^a^]\TXfmiZG??>AIHIGFEEINVVQUbeZXVTVZ\\VNM_]UTXWTVRF>:?HMLHHJF@DID=>BCHLKLPWbkle^UOKC>>@>===<:736;>=<@DB979:<>??>;:=FTn|uZD><:6118>DTpvbJCJLMPRPFAFGLQMC>>>ADHHHE;:CJHFGGGDBER_flrtpXLW^^WNIB<==?ABCDDDGIFC@?@CGGGGFEA?@BDDDBABDA>=>>?==ABAABBABCCDFIKG@=BDDEKPJ?@ADC=7:BEC?<::9:;;98;?=987779?Shkic^ZO=137899:>DFFA;77;@AD=6:;:7789;<>?BCCFH><;>LVUTRSRPF=???EACLHOH;BO>:=CD@?>>@;4211367;BB:4357639A>439?ABCBDCDIIEACIHCCELUUSNG?=;74:9<;;BGIFEA>>:5:BA:568::989:=FAAL?566:>BBWgIjΑkvcRbhS=DD::A=6=BDDJQP_fuF;7^?<7,[D63011122223469:::<>@@BA?><:989<<:9888>FJJKJFIMT_c`a^TRbz{jf^ZWM\fVT[YPKJE>>62:HOI|ՐoreVNMKKLMNPRRTTTUUSPPPPMKJFCCEGHJIFBCCDDEEFGGFDDCHS^bdgorprtutroi`WTSPOLFEEFFGHHHMTYWTTX`ca_^^_a``_^^```_]YOILOKFCBBBBBBBBBBAAAAA@@AA@@@CFHHGHMONNPRTVWWWW[YMC@?BA@@BCDEFKQRVZZZ[\\ZZZZ[\[WQNRW[]^`aacc_YZ]_``beeeeedb[RJD><;CBHEq\PcgSG??CAAAACB@96@[SATZTI88<<:::;<=9?j|rlbXUUTJ<;=;;;;;;;;;;<<<@;>lZ;>>=====>A::?MKclUVkf͚{dXXgndXQGGJGGDCDKQ]8BJMMLPSQKC>DXq|raTW]VLJRcrmdWE`w^ZTUVUR^[JQU^aRLIGO\`^^\XTVVRX{WQialqnfcca^][YUW²ƿĹºȮľįsw|z{z{Ҿȹƺɻ¥ȳk`_Tpvltsmwydpi\vo^\Yhpu|cdq{sf``_aknmlpuobSMMMXw|lzkTaybPWYY[Uve\[xǺwsjUTYO@84.1CQgle`U@348C;0>IILKA8835>JIMH@>CGRURLQKJSURUKOOJQNHGHKLGHKHMDG@QKG@AEB;2028DEDFD715JQKHEAA@:9DOXYPA?DFGPTJB?EPY^^Q72=IKC96557;DQ_nwlRSejPC97655666556GqdQRVN=:A97CNMKUba^ZUKHQI6ETQPOJD?<:66<@>?>AB<8>;758>A?=@B=78::;??=<;<=PfxgKCABC?64;?CK_cUMU][]b\UJCDDP`_RHFHEA?CMH9APSI@BFFJNHCGQY_a^KBNRNIDBA@?>AHJIJHDCFFDCBBCDDEEDC??ABDEAG\YFDB?<<=?;9:<>=<<=<:;;=BFIHB<;@A;:=J\ejcWOK=7::9997988;?BE@99:9;=>>>;756:CIE<<<7BACIHQKJROB>89?CDEA>@>=94013588:?DB=:98879>@936:<<;:?FLPNDAFKMHCCHPQQPF<9845CPK?@DEFHNRXabVG:6:=<=EKKHFCEHA9:<==9678999;:97675@9F=Íu~tH?EBDhlXL2/4;==?DNOUW`޲yG1S:,4-FZ;;531121223358<=;;AEDCCCB?>=<=>>=<;87AFACJGHIPvaJMU_btsvr^[YZn|d`UDFJE@<;:8A@=;;;<==<>JG=KIOP<6;::99:;;;8EV[cpqh_bi]D;=;;:;;;;;;;<<<>?7SwE<>===>>=MLRpxj`]L82CMECFETHKA8;45BHFMF:=<:BALa\SJLPGCN>DMWQRKNJKUSRQEOONOOHCFJIFKKLNN>NPKMD>G>3>?;757;?=<><5>CBE85;@DABD<1589AIMPV]bffdgjjjjgc_\]ZRQUX]^cc^^\VVYUO49HSNHDAB@317:>A@?DIMTTH<=GOPTWK=236MLCKUI72322003;FFDFDCFMPE538;>?@>BJMKHGHG9;FMLJIDCA=;;;AOX\VIDEO`ml`UMMNJCACA?>>=<>@AAABFD=9:;88<<8:<;:WpupUDFCACB>ADFFGHFBMcog^VKEB>=>Qf`PJORG@CJQN@;?AACGGDDBBBBACCAAFLMLKJECEECBCEEDDDDEFE@>AED:PVCEC>ACBBB@@FKHA=>>?CGKQTL@>?AABA><;=?=<;7448<>?<9;AJMKFA><=GHC=;9;:99758@@?<9889<7699:;?A@93028@FC?:5222:EBJDIK@32;A@DGIHIOTJA6.9HHDDCBB@>:53666568;>CFFC@B@<=C@66898679BMSQHGJIKKE@><:::;64307GOI@=::BIPORXUOH>;==>>FIE=78AKJC@@>>?=:8999;<=<<:9HT>78:998:=:+em寈r`~L78=UrpbK1/59:::CLPLF9fk2PF1QM@}xBED9322111335:@?<<@DECCCB@@@?=>@@?>>>DA8:@BFDGacJ>G^yrvu}zIJZWksdkjWHEA88989=>:<0bʠ}`ZZgnUBOOPRTVVWWXVVTQPPNIGHEA@AABGJHEEEEFHHHHHGEDGSWRU_inoqsuutttsrl\KCCFEDDEFGGHKNLKQWUOS\_`bcdcbbbaa`_``___XJAACDCCCCBCCBBBBBBBBB@@@AAACDDCBEJIJKMQSUVXZ[[]]SE@=;<;?JWZ[]^ZNCCHIFEFGFEDEEDDDDDCDDCEGFDFKQRSSWaZLIGEGJJMUXXVPHN\LQ]^TORTY][SKMLW`^[XTU[b`]_Ybe_OAFRff[SRX^\[\XVYPU_a[XTQXdkXZ_bec_^]cefbeqk`TWesund[^`\dnujbdsypg]GCLT]ccdaVIECCCBBCGGFDEG<9>CgzRR]TB??;;CA>9:=:;ELD<9AmR:=>=<@C>`Z>O^\RSRWd[vrJEECJNPPV`_[NHcPCMX\YRp}WADGIKJGGJJHEDGNUX[]ULHJP_rh[PB=BTZU^d][[\gq^`ia[d`PHLUVTSSPOQPbjQVbTQ\_e_l֠uqlghg`]^``]ZW^ò®Ʃ}m|qr|rýȶͬųŶrdedYϜĮtehn~{zt~lVtyh^PKZwsmoYfujmm^elhbdkqu|{x|~zmj^Se||jgsvu_PataFs}On_ʻnYLNLE942;WM;:6EQwy}ygc[F8NOONA@ZIJA7:06GDDH>898DFB954:=:GLRVW[adgkonljie`ZWVSPLQY[_c]XYZWTU[F:LUPIFBB=1/33/0:?ABKSMAAIRNA>=954441.3>HLMSTNM^yzHJMgYHMN`Y\c[^G546676798679:89:49SM@NjlcF^sYKJZee_V;,9JRbtvrh_UOLJJF=BMN@4587440/6>@BFJLMMOLA98:9GJIKLGB@>;;:?JOPMCCDFNbdOCHMRLCAAA@??@AEEB@ACEFB>=;87:86;<6BcdUMA??><@EGIIGECC><=?@CDGGB<;>?>>?>===><<=:878;=??64777439?@AHKJKNLC>B@879:97766>EFFJF?>@?<;9976522225<=:7621?MPLLIAHOJEFE=49<;3008CJKHGC>?DA<;:8:;<<><@TI8:::9987:8:j,M7[bB@;CflZI9026:::;AIKHC2G=RawI@oGGI=322211139@B@>?ADDDEFFDDDA==@CCBCCBABBACE@<99>F_uqyn;ETPckR\zoT<636998;>?=CӚnkktyoukOMNOQTTTVVVVVUQOMLIEFEBABBDFHHGFEEFHIIIHGFFILNOV`emprstuutttsog[JDFEEEFFGEGKJHLOKGHMW_baceecccbbaaa``^_^WJBCCCCBBBBBBCCBBBBBBAAAAAABBAABDFFFHKOQRTW[[\[\[NA@BGNYab^ZY\_^__]\[ZZZYZZ[[[ZZZZ[\_``acdef^X[`adedffggggaVRRND=;;BQZ[Z\\YNCEIHGEEFEDDDEDDDDCCDDDEEECEIOPOV]\WSKEJW\ZXSQT]bethb]XNKRUYdd_YLGMY`a_\_``_^[`qpdYKIBWa]USX_]^a``cfkd[\YUOYeh\_\Zacbbdb]\jorhfbhrutmgefecb]pqsxjacnoKBPZ\\\\YMFGFCA@AADFFFFG=;584@H?B?1765>IP^cWCNFD?@EGD=BPM;27WcUXRcbKNMTA355556788778878892GaO4C_jHPsX:Nszq`JEOSUenngidYTRI;;ML<:BD:4235316>CHMOMOQPJ<8<:8=CDFLNNOK>439>CHE?H\mtthQDJNUbUD]loxlJCKGDA??:988767CSWU]bU@CUZ]UU]iiRBP]M::AHLLHFLSMB=<;;9;CJKIEAABFPL=7BJNG@@AB@?@BCFEB@@?>BCA@?=;;:<>==FSH;7<@==BA>BN\figkiSGB>FPIBEIH?8Kry_cxoaYG=@B=>JOFCGHGD@;@FIGEFIKMONKGDCCEFCDFFFG]wfWFHCDHMNI@9>JPPH@@ACFFD>99:=@><==>>=<==::;:9:::;>BFHIHFEA@FMNLC;>EF==A878899:9989836898889:=>><::9:<=;=<:<@AA@94540BLSSXP7)/AFC?CMNKIII>63DICAEEEDDDEA8787877?IJFIMOORPG?=<9:778776457?LTOHB>>=<;;;840363.,,,.0.0FKJIIE@><:987679:9;IQ:776658:=<*t30Cm8071395?diN75877=?>>?BBAA81B\mQ@^xF7QYBG>32221103=BA?@@BDDDDEEDDCA==@FD?AB?CHKLKEBDEFDNb|[>JQJRdRS{}?&.58;=<=<8wxrwytqrdMMNPPONQTUTSUSMKKHEBBAABCDEHGGFFFGHIIIHHHGHIKRX_empqrsuuututlhdPDEEEEFFFFHHIIIIGFJR\aacdeeeedbbbaa``_^^_WKCBCCBBBBBBCCBBBBBBAAAAAAAAAABCCDDDGIJKNVZX[[[^\J=J]a\RKNX_ac]^]\]\[[ZYYXXZZZZ[[[\_`_`ccddbca``bddefgghkgYMNRLA<<=HUWWZ[[YQKHHGDDFEDFFFEDDDEEEFFDCDDDGLNOWZ[YYTHL\bXRUTW]__ja\WTOU[ZWbpqh_VHMY\VWa_YPMWbgj_SSQPYab\Y[]^cfdchrtiTMTWS]ebbc\Zfgijmb]\bgrm`r|ylkfjpmVAQWl{lbaZhxiMAKY]VSLFDCGDCBBBBCEFFFG=;Br]_ncG?ABDDEC@>><>AFRXB5LH?:9;78988899:;;;;:<:CpU:>;::::;;;;;;;;;;<<=;=Uqzf?:=<<@LRSLFC@FXd]TT[^Qh{N]hYIDPRQV[[TLVNT]VOMMMdgIEKJHJJEA@FGGIPSLX_RLSOHDXbQ@AGIOW_cif^bvoo|slhd]WY]b]SP[ZN|~TcW]efXaҠrpttrrdTQRSQaqhhüʺŮx~yî~}x|wвÜ˯ǻIJ·{vm]VYӸѢǩvgouv|hWxv}iu]T_z^ihedw}|nd\QYsvofY`~hNgu]XVE\{aRkTELK;387A?;7<>>DFBAJHE=BKE<77C@83AID@IVOGNWYZakniddfff`X[]^WPORVZ\[WTVVTRRPTXYRG><62265/3?FC?<=?85;@;5344447;Qjspj[NLROOcxZ25Ac\TMajMEESA4323567767656756862AXL6FOOAK^U6,134623@JMNNLLRPI:9@B:=@CDILPPID=9GOCKZWgmUNXM<:>9689::=75HWSXSGBFTc^CARh_B9BKD46AQYPIIMVPC;;;;:;ALNLMJLOPMMGABGHDBGIE@@A@@BBBA?=<=@@@CFGFDDDEFC<AA@@>@EHFEB><=@BCHYmwsofTGFEGFCBCBCC@EViromtkM5:ACACHGCBHPOE??BCCDC?>BEHHGHLPVXRMJIFEEDACECBACOhYBIDEKMLH=6???@CB;9:9:;:89=@DIIHHGCDMWSKB==A?<998889<=::>;6333789:89@HJJGED>9;>@DNUSRRRSSSF?:;;<602676748EOQSWRKGB>=<<:4/28401/-.//19>CFHGFJUYSOHC?LQI>69AEFIJIJKF9//37776777AUF0544446DO7FU.60]}`:73629547PWF=CE;7>8;77,caHWQEwƝPL?8~r:C?322211149<>>@ACDDDC><<=AC?=@A<8:=>><=CC>DJKFEOlYgC@LMJLNMOtj74;=>?>>:>̝mmz|~qw~JJKKKJGIQTPORSLIGFB>>BCDDDCDFFFGGHIJJJIIIHHIMSY_cmpnqttuuttslaVKFFFFFFFGGHGIIIHGGKQU[bddeeeedbbaaaa```^^_YKCCBBBBBBCCCBBBBBBAAAAAAAAAAABBBBBBBCCDJPNOTTRRMLWZM@CQZ`[ZZ[^_^]]][[ZZYXYZ[[Z[]^``aaacccced`_acdegggiklfXNNOJEA?=AZcWOKIGHKUZNBKYYck\J=ALSRUYUPKMSZVJJPQOO_RDHHECB??AFHGKWVMXXRUUJDDR^QIPUZbdhkjc_p~~}rqkd`\\^`YQOXVOV|bZced]tzܬ}srp`SabSPPQOcq˷öȰŠ}n}||xyָDzƵΦЪɿŸÿna}pbXScpͿв}osylz~}h[z~n}ngRPtbUgaVXoz{vj^Yaouuvz|tidk}|KX~mS^ƻqTHIK<46=:?>/2EENHN>4CKK:;?;D2,9IOalb=IH;LQ.=Q>@ITKNVXUES:DKFHGJOFECEINIKMOJHOPKQGIJJMKLD@<7?>GIDEABFG=AID@=HJGC==?:.023445544:Pmpc^XKABFEMfxf//4TP=;QhYGBWI61/2567666555545995@buJ+022?JDFMOPOMLQM@9;ADA??@ACKSRICA??@><;9;63Tyqn`MHB;>GL^a_b\RRIBD@8989:9833K\QEBCDKbkS;:DVK8:??<5>JSZTMIHRRD<<==;;?JNLPX\fecbUECDBAGOPH@?B?<>@CCB@>AC@?CGJMLGDEFB>@@??ABA@@DHGGE?::<=BJZinnoosx^A8;DJLFBCDHNLB?@BA<@HILOGBEHJNU]^VPNMJGDA?BEHIHB@JfmCJDEGHID;7>JQUP@79@JQNE?=<>??====>?AB@>;;;;<:9;=>BJIGJKIHHIBAA;=BB>889:;?HF;;B=101358;;74:;:898889=ADB>9::58>?869C939SWKHJQRWSGK\f]I?>3;==;64667758AHMQUWVSLC==<;4/3867:964421357:;DPZb^MC?HU\_ZN<5>GJKJHJMI;126::87646NY:2122224FFB;8;=??>=:<970DpZZbi>II6422213579;>ACDDDEC?>ABEGB?=9898;?@?=>==GKGFFFjjVk|ooeJDNQLJKJLKrƳS>@@@?>:HscpwHIIIIGFEJLGFJMKJIJKLQVYXYWRMHFGGHHIJJJIJJIHIMSW^cjmlosuuutrmh[KFGFEFFFFFGGGHHIHGEHQY^^_acccdcbbaaaaaab_\]^TGDAABBBBCCBBBBBBAAAAAAAAAAA@@@AA@@@@@?ABCDGHDCFJLF>?Q]^VTVY[^_^^^]\[ZZ[[YY[\ZZ[[[\_`bbbbbdea^_acdffhijjjh]RNOOKEDFGEHRVXWRONMNJCACDDDDDDCCEEDEFEGJXf]T\YXYWWVTPQUVVWW[eoj`cfeddda\UQV^gjbORYjtzxrcPSVULEEDVPIM^baeeZOHMSUenkjle^^cfdcaa`cehlqpnj`[ai`txpgip^RBOjgTOYr}XABCaWG=:9::6898889::::;::::<7;IC::;:::::::::::::;;;;<:>_iL====;c|K^eOJXf{zpwz|}~re`hruohbg|pb~pOSzrZȺkWHGG?0>?>C><>H]@;GFMQ@<<[rrlc]_UF57GFKAGA6>FC9<=YV,0FJRetZ7ME8PB.KR9>KQISWYJEL>OEGIGIO@BDDKLCFKLGGOOKPJLKMOKJD@=8@@HIEFA@FH=BGECA@CCD@?@MTQF=A?6,,0466645?UWJEJFA;?9:Ddx{>:HSVCFSlSJFYI61.02566655554469=GPV[ZL5,8`}eZ]uwokdeTJKMOQPNipndVNE?JSXejf?+038J\[MMPQOKJKH=9;?BB@=>?BJSVJ?=AB@;788;5;\q~yni\VMSdk]KHNHITO<9DA7:953@GS]YC79@IB:@FKNIB@B>:<@FHFC@CD?>@BBHLEBBB?>@?>>@@?@>?GKIC<:=>>ACFXvwWAHTXRNNNQPG<>Ml~xwvt}}t\GEMLGGFFHE><=>AC@?BMY\TJIJKOV]\UNMMJGEB@EINSMGPlnʴTKHA@CFC=9DHD=;:=@?>><::=>>9789=ADJOLIJIKID<=A@;<@B=8:;;8;BA;413468;;76565246657=AC@;7763:>;768>5.8DRHPVTRWWOS__H<818AH914515BOTTUSKFFDHKKOX]^UIDJLG@@?:>?<@B776663=QW\QSVYVM?=<;404865:<::970/2334Cazu^J:9GX^^^[M@?EKKKJHHE=547:98651=UJ8552223573TE045363;<7453223454=A?;98::<>===<853/=J_f@DC>MS5=7322113459;=@CDFFDCCHLKIHEC@==@><>@>>>?AHMFEEET^TDO{up[NMS[TMJLKEKsԳc@DCBA>BUWADfHHGGGGEEGGDCFHKNPSW\`cddfea\RJIHHHHIJIIIIHHIKPV_dgklptuutsqj`VLFFEEEFFFFGGFGHHGGFEMWVW\`bbddbbba`aaabb`[XXYQEDCBBBBBBBBBBBBAAAAAAAAAAAAAAA@@@@?????AAAB@@AA?>CNZZOHJRYZ^_^^^]\\[[[[[Z[\ZZYWWVV[_`accddc`[^bcefhijiijg^RQVQJFCECBFLQRPONNONHBBEEEDCCDEEDHMKGGKWfeedd]XSPTQQWZ\YVUW\cic_W]^`aWMT```][YORXivmkoaW`XURNWdm_JQYalldZSSSQReslcb^V\^ZZ]]_____``dhf^XahnzqfvifaTQERejkZRZi~x\IGFnaDBDCBDCBFED?=?BEGF4ToV^faRNQJ<<=?A@BA??>;:>>Hfs\E?=88888899:99::::9;<98;<:;::999::::::::;;;;<;?QM?==<9CNen`SKBISUPVH=CN[^hrHTVSQSQUjwcHJW_YijhiYGHdpZF@@><7=8D=7@GMNI=/Birspc^[YOGM@GJ>@DCKF@EIEEILKJNLONPPHJEB?:BBFGJDCFMF=EUQHB?BDGNTZac_]`cbbcccb_XSTURQQTTTTRQV]_WN^\J98887987>@HF7/179><67FJAAFE?>>?93:_ufcm_ggcXkTQSY?0312356555554467;AB;9?KZL5:nsWfd\GELMTTI>VsveWXJ=KVViva?,09GT^aUNNOMHAAB>:;>@AB?<=BISYW@7=BDB:77604Y||nwzTGNWRD?LW_^G48M`V@>EEFSZNEEKOI@=<;;;>;8=BHS`g^Zi[A87BPWC6876545DQTPJUpoP:<>=?@BCGHB?@>;=DKJFCA?>=<<99=@>>?@?>=<=>>==>;9GWN>=ADJPPD7E]^TVbmkVHLV]b_QCGauwho}YEGFHJGDD?9;?@ACB=:COVZXSPMORWSNJJJIGFECFHJMLFFNioȻTMJBBBCC?;;>GRRA6=CGPRB:>DFC@>=:88:=??A?;8:@CELRVY\VKFBBEA==;::;;:86552224637?@;654559<446533418GJXWSTZYQTWJ7310BI:,6:73;OZVVRPIHPNFFIOX^XM?69<8;>>8@F=>J77777=LX[`WONTVQD::77::7305<>>?=414430H{_H@;EW`a`]YTNKJLOLE?97887997634JR;5;94445672z-0357=?A?75401458:>?=::98:::;:9;964303Kde{Z@CCAOn3:8221113458;>@BDFGDAAGLHDDHKJDACB?=<>?CIIJQPHEIHB@=AhzuiWV\ZYRNMORSNuϋDBIGHIINVRCEt~|}}HGFFFFEEFDCDEFIKMPU\ab`bfdcb_VOLIIGGIIHGGHIHIPZbfgjmprtutssk\PIFEEEDEFFFGGEFFGFEEEHLS]aabbaabbbbaaaabba]URSTLDCBAAABBBBBBBBAABBAAAAAAAAAAA@@@?@@AAABBABBBBAA@EJLIFEGLSX^_^^^]]]\\\\[\\\\\\[[[YZ[^`ccccfd``abdegijjjihd\UWSLJEDDBACHKNNNNMOMGDEFDCDCDFEDKUUMJKP^ggptdWPLQPS[_^ZVTROHKRQNY_ej^RXdffdbfgj_`ca`]]][PJSRasi[MXSUjj^Z]YRNLSei]RP\nbKFQVSRV\^_afii`Xahkxk`}zkhaTOG_mea^bn}}]OUdjRSOLHECAB@<99;>EIB9Y[cgYRNNF9789;?CCCEE<9<:?_sUF@;8888899:99999:99:;:::::::889:::::::::;;;<E351?J74CIE:>FSURYvsu_V_\JJDE;>B=CI;:6?X65=V@WikDBKIAD,BDG?=BC=DKJGIKPTQTPFJFDA=DFDLNBGKQE@FGHHEA@:C?@GLIB@>=>AFKQY^\\_ba^`bcb_YTSRTTRNPRRQRSZ^ZNPUMC==;:;;;=??><>?@ELF61;EGC=BMQU_\I?>>@@3>^quvufflbK\ijdgN;<7445664444568:=<5./-3LSANVakaTPPNNH;/9R_TMZ[QU\ZX[H3+/=QYXYUPLLJE=<@@<;@BADD>:BHKY`D25=EHE=9984OeXcwrN?ADFFGLZ^M77?E^|uUXfXQXNBHWR<59956A^^JF^zf@9GKHFC@>?>==?>;=EJHA@A:69:98:;;:;=??>:9<=<;;=:;J\TEEFHQVNA;=?FYnxvdG8BW]^igN>EYk{n\bu{QBGGIIE@?A@@AB@=<<>>?EOTSQPOOOKIEFGIGGHFGFIQVJB\wy|vrCKIFDCAA?=<<>CEGVdkjh_QPWWRKB=;:::<>ACFC=EW^\ZX\aa]RE=99;>@@@@>;::;<<;733111106@HKFA>;699997=TUFSc\ROQUXO@?DEB:3103>EDB@955645aj`XNFKW]aca^]\VPONH@84479:88765@RD47=;55543,\:3347:=><97555777;CGA:9989997776653245DYFNQFAELR};:8221113358;>?BEHGC@@DLGDHMOMFCB@BCA@ADLSX]YKDHJDCGAMp~jPIRZWSQPQR^q\id8FIKORUQHGFAf~{GFEFFFFDDCCDCDEEFHKW_^]bdbabb`[TOKGHHHHHHHHHLWaeghklnooqssrhZLBDFFEDEEFFGGEEFFFFEFFM[`^^^\Z[^__aaabccba]WTNOPECBBBCCBBBBBBBAABBAAAAAAAAAAAA@@?@@AABCDDDEEDDEDDCCBEGILT\_`_^_^]]\\\\[\]\\\\\\\]]]]`ccccdecbaccdfhiijiihd\URPMIFFDCBADIKKLLMNKFFFCCEEEEEELVZVQNNQ\mxn_^ZRRTZ^^ZSPSWWNJKPVY^be`YYUPZecdcdb^V]c`e_NIOZW\aZUOWVPei]agXNLIOZ]\\alviPKS[XVS^fjqnnng]^gmlb_uzlih^RFdqfa_iyaOduebNDIHD>989;<<>GM=VdQbg^SPMLB866788>FLQN?:;;6Cks_J@;988889999998998799::99:::998999::::::::::;;;<<9PvnbTFBGSWNFGIJKNMRUBVWKIILMONUdlWRSaXO\UNPNMRL@EPNEAEHIMTTRUTSRPNLIFECCC[zxdvot~{vreUPPPOMMQRQPMKMQQMQZ_^]embcsgwjghg_z˭ּɩźzIJϫȿıΗt߿Ӫ̰Ͳ׷Ⱦt{{`\_{oɻĺznqls}xhz^|qj{hsBOSN[m|}vsuw{~}ysqkc\XVZm|]oizeVͭymsxoMGL=2BRCNHFD3-0;D40DIA=>\qe:6\q~gVW^SMBC;<@EPM;8AIJ.?EbBUi`?EEVEC2Wh9HGREMecLAAC><=KC:C@=:EJHFFJPRMRJGQKJHDFGHRKHILQJIEIJIHB8ANIGIEC@>87:>AFIPUXY[\[Z\^]]\[ZWUVWRLKPPQSSTTWWONPLG@9:>@@>=>???;::EH;19FD@FKOT]bO<;<>AGIdumctofWcfMQpl^h^VTE555564357;<==:5443'3KHLntT|wfqnphZTP>1126BGGVfc`d[?4421/@RUQNONJGGF@=AGHHHGFKJ?;?@?GN@88;<@HJIED?Kpp]UTVXTC@DBBGLLQN@CNLCAY}|myWVUCBMF:<<;BNVelZFINPU`[C59:;:7Dl{snlbfpdP]]C=RcYKLLMNLH@<:759@C?>AC@==?<9669;;=====>><<;:;;;;BDB?<;;;>CDAAFNQRPMHGIIGEHJHIIIIINYXVax{|{pvJGF@===AC?=>>>Gfystxyr]SQC9<<=<>?ACFDIburj_MNVNC;899559>@?<<>>>=<:524651//259BIGB:7?BABTWNC=?@@@>5OQE@LQROMLPWZURPMPRKFC@=8478<=67GG527976O]F1KZXX_^[_[OMQLA71201?GEA?=::62Cjg]aa\SPX\SR_edcb^VPI@97435899775;MJ4348=;8545Ab)36789;;:989=AC@<@EC<9999998887764566:JM7[ݏKMGCD?CEGGDBBEKIMPMHFEEEEFFHHHIUaejgOBGNNMQKDO\PA?FLT\b^TR]o[Xpz]?FCV`^]O?DJFUEEGHHGFDCCBCCCCCCDGV_`_cdba```_\TKGGGHHIIIHJR^aeegikmnotrkhcUF@CFEDCEGGHIHGGEEEFEDFMTRPSRQUWXZ^```bddcb_]SPLIKFCBCCCCBBBBBBAABBAAAAAAAAAAA@@@@@@@@ABEFDEFFFFFEFFGIKOSXYZ^a_^]]]\[\[[[[\]]]]]]]_`aabcbcddcbbbbdfghhhiiiicYUURNLJHGECBEEEGLMMLIGEBBDFGGGHNTYYVQNKTqs]_f_[VT]_VMHNQP^iVNYWVWSOORUOHZhifVV`ZVaknnb\XX[^ccaci`Z_ri\dbYOIEOVRXhy{woc]_epqa^cmyolkkd]eibZ]}phifXGcrdc_i{dIwnkF:KLE?88=ABBBIK;~MOfaSQOKJ@6567966AGUN:8==:cyqiNGCCEEB:>JMKLSOMDHNE?AIPSOPUXQUJYQSsaRWVHEIECIHEBDEJPSQQROOQVWQHB@CDCdy^Qd~~mqeck[NPQPPNORSSSQRSONOPW^^djr_ajǹľˬĿͯԼϛt۷άȹֹ̬˺xs`nXrvhòɻzxz^n{}q}Zswgzt\OlcZc_lw|~ym`^adoxy{|{wfPCG`uQTNXšojnraPAGM>FL:TQLF9/28@81:AKHNT_b7.?\umdWcVRMA49CJQL=3NI?3COhAUiP>HPTGCDpG?LMKK\Z`IAA@:7DK?;=;=9BGJEDIMNINGHRONLJHENOLOJQPNJFLKGC=9ISMCDGFB:557;?CEJNSVWWXYZ[YWVWYYXXXQLLMMORRRQSVWUQVRD98@BB=<=BD=7006??66<72>JJPXO93;;AANhubxoaQdjOMdHHeafkT51655547;==<;76;:5.HNDl~V/@\ksua[O6176:>BA?=?IRRVXWKCOOHFIHFE@?CA@DHMPROMH@=74U|qXPHB?=<==<;>CFEB?=<=>>?>858;;;<>@AB@=<<:;;<<=CNWbe]XOGA;9:?A<;BGGHPVUQG?BIIFCBCEEHLMNMMMZgdn~gboe}CD:78;CD>=?@>CV_empt~}aQMLB==>=>>????I[iig[E??71/3<=834:@><<>=;:8523664/015568;;941:DC?:77655556776210000/0/./16>?=?99NVF9;@A@?>>=;::=A:3DI96673CYN85BLJRci\VTSPKHF;0/01;CA==@?:50NwexlY\_]ZLBMW[_a^VNH>76557999967EM9/657??;95/w05689879<86<@CIGBEFA::<<<<<<<=??=;:<@BBBA=EոosvtkT;Nf15433233237;=@CEHGEDCCCIOOHCCHFFUUD?KYiz~zwZBEMNKNRL@?BCA?BKTZ[WSSTPNE=RCIQgib`WQSMGM_oxyrhdXSUi|FGHHHFEDCCCBCCCCBCFR_cacdb```^\ZSIFFGHGIIJJMT\`dffhjorsxpa\ZNB?CEDEEDCCCDDFHGFFECCEEEEHIHLRRQV]`accdeed_\TOMGHFEDDCCCBBBBBAABBBBAABBBBBBBBAAA@@@@??@ABDEFFFFHGHHIJLNOOOW^`][Z\][[[[[[\\]^^_``_`aaabccdeddeddbceghhiiiiifa[YUSQMKJHFFEBBDHJLNMHDEEDFGHHJPVXYXWSQP\jikcY]XSY\TGGZe^\ic[^_^_WQRTYYXajihXW_[]hopgb]RJILQYchnnhcdac```UEANYTRZironmcanqZZiqfbdhe^]\[]_vnge_Mctdb\bnprdD|o=?RND?::AFGFBH?UaIYbYRQNKE=8678:8799SR72:;?GFakH69988889998888888888999999999999999::::::::;;>=89FOK\vUGR\N>:;>aVNJDJHB>:;<=DNTUOKMOIg^J_Xak[aXC>DHHIFCAAAHRTPPRMLOUUNFCDFFGMNIGTs{rphhbQR[SOQRPOONPPORY[WQMLNRYboriVbŰƵ̳ʰ­ȸȿīȼҹȯ~ܰ˱Ǡֻ~Org_g~ƽzdx~~Zkjuti{\[ysrcT\uj]`[]ku}}hTV`lxuCEa®jhniQTO4EJAD4RSRU:7/;;;7A9M?QAKP@@ABT_ke]`XVN99GOQM;>QUcEAZTGGHZi6GJLSPXG^G>>;>8DE;9<9<=A=4978<;@GKBBHLKGHDMMQOMKHIPNUOOWQPEGOMC=8AMOD:@HLB54446;?CHLORTTVYZZXSPQV[ZVTQOOMKKOQTUST[\TV[UE??>;<<>@?62//16:9761.5:DNPC8;BFQNPn|s`vi\V[aEEcEGeXV]Y@14665459::::<>A<:DLDgkO<3SrMdtp]WF12?D@EI?I^gj_F955:DOVWMFA@??ADGHGJRSH?GTL;8@GE<68AAAEHGIKNOOOJ=@LK?=;<==>@A>>?CJNOONWirj^f{wS@C>;?<;@Odp|rJ7IWRRVTK@889:8@_yxYObum\aV@FKEReYKLHA?@ACEDAAC@=<>???>;:8889:;=@FGGC=:<<==<:;@?>K_SECGLSQHECCKV[ixo[jgbdN:;=A>=Ne[D@=:98CMJDA>BEB><=<63;EIHOYVI=<@EFJLIFJRYUJLPXaehjpubRcm^sBIB>>?DB===?>;;DZaRNUYUTJCBFKQC>=<;><99>=;:753224;>8112599;96564/7><;:87643468;<;98865544545:;=;;;77@E;6=@???AC@:;:6@SPMRQNLLLMP_mld`eh\Z[I<@B?=<>>?;5=H<8756IL:89=DCG[fRDMWRBAKE4-05=?959?<78CTzhdbTE@;<>@FMPPMEA?><88977:59KF2399;@A>93FJ.667778:=94:>@DA=CD:7?BA>>>>?ACB@?=?DJJCGWaoxfkwKx62310111346:=@CEHHFDCACMMKKGFI>A[VH@GpePQNDEKMKMOE>CFCAAA=;BOOGFHHD>MTIHPhp\NT\^SHHIM\f_XRDBNUPHDCCDEEDDEFFFHGFKOLMU[[_bccdee\RVLIKDEDDCCCCBBBBBABBBBBBBBBBBBBBBBAAA@@?@@@@?ADEFFGIIIIJJKKKLRZ]\YXY[[[[[[Z[\\\\^^```ababbcdeeeefecccefghiiiiihe`\WTROMKIIFDEFEFEHOQKFFFEFGGILRWWVXZXTMJ_txaNTUQScbMO`geVRZ\YZ[\[XTR\gffhbc`ZWTVchb^\SLFAGQXaZcad_S[hlghaOEO^_TPYdhgdccqxvq^[ejY]aeb\ZY\bhyyrfhgSbqa^TPRNX_:_RHx[6HXN?:9=EKIC:>:{}MVf^WUSOIB:866789887[jYL=;@Sb_G4698888888888878888887999999999999999999::;;;;;<@>?=h{nPBPlr\B3LxPN@FFE=<:=CLOPTQKMGBDa\c[_x~fY_UACFJJGC@@@@BKONPROMNSSLIJJJHFAAFBQy}tkOU~bUKORRQQRQNMMNMMO[]TPOMMNUenlbXoijǹĺǯҶкµĬþ˵Ϲ߯ɼѽɸ^|dqr{qz\}h_sna{b_pkwwgjrw\[botqlpod\TPOXyoƤqG7otdhn\BD\C.J@?9Vfjc64-<;AE`FC>JC_BCLQC6E]q_[VYXRBFRQO9QH7GIEdN?PUHS^DGLQdS7FEJbVQD^E:6BGGC;/3;:8=>;2695;??GM?EHIFFBBNJSOLLJNNRVOXVSLCJROA7:GMJ>>BHI<354247;?DGJNRVWYZ[XTQQX][TQPPPMLHKSXVSV[`[ST^ZLEA::3/1575346750+-5AHD:=>ADEDEJNNI>:CKA7>EGGD=>A;7AIID@ABB;:88<;;LfvT/=[`M?NS?7=?=;95D^jfL>OchjiSDRWJPdgYOGA?ABCCB><;99;?AA?<99976779;@HJJG>;;;;;;9:>>H]UEDDCDDBBBCJNMVn|yvsaYf^B7:@A?FOMF@96:@FHD@>??<998:AIOMNVTJCDC?@MZ`[Wbm_KHKazppqeyysAICBCDD@=>>===C\ocSIFJGGF?=BP|k@;=;<;:::77AJKHECCEC@>=>>=;;::86433315@B91346:@@AA869;8:CJJGHKMOPSU[afnlhjh`ZK>AC?=>?>=<;>H=976699788:73317<>GI@?CE=89<9767BK>46758EC?:5{/02598656893568;<89:8:AC@???@@???????@FFDXa^d^hxyx^:YF.221222357:=@DFEBCDCCDKMNQPJHGPUHJPNgxzwVOd_OSZZVMHC@DFBEH>24BPOGD=@EDFJIH]weB:EOSKGIIGIMKOSJAECJQIHGFFFEDFFECCCCCCEGT^]_cdba`^ZRGABDFHHIJJJKLLQVUVYdlnnpuukXKD@ACBBEFM^knkdXKEFFDCDFGGHHFFIJJLSURW_deegibRKMFCFDCBCCCBBBBBBBBBBBBBBBBBBBBBBBAAA@@@@ABA@ACEFFGIJJKKKLMPTXXWVWXZ[ZYYZ[ZZZ[[Z[\^^^_`aabbddefffeeedefggghjjjjgd^XVTQONKIC@DGHGGHKPNIEFEEGGHLSWVUX\XSNNPdwiQNOLRyrglYZad]ZXUTROUSJWfcfkrghfWIENW__^_ZVUXhsqgaeY_]\VY`[\fcTRX_[X]cii]`pokgd^_ii]_`eaYZ[\_mvyzfgrnXbh]^SIMQRj4=;/=O;5GSI96:COOJ?61N\Pbh]VUSMH@7666679;7=mkA9BOYD26:88878888887777888888899999999999999999:;;::>=JgT@H\uylXGG`{t`=rߞTMDGECFFBADEEHOPLPSB9GOvmlpl`X`YTu`KD?=<>?@@BCJORONNSPGJQNLJFDFGCXqqrlRD\nZMMRSQRRSWOJLJKOORRMNPOMNTesxrd|wƸ±ǹķٻҴʻɿƦdzи±}Ǚ~ðvp~zuu|`|cUjwgl{|zrfavwd]h~z^Zckni]UXfvwlZJLRY_JEup]FKƲk_hnU;8KR=KD8@BFLSWYXXYVRQRTVTRRRPMMNIGQYXRV]a`ZQUXWQI?;;?9.1@IC9455540..2;A>38EIHKFEHHXnRenMB:8U^CfUG[B?@LK5/443545579?HG@=<=^v\VK66142V}sVH8215==;9@KIDHIB?A937BJJJKKHCEEB?@?<::8:=EJKJJMIECOza?<;=>DYp}TJ[gg[B>B:8AGE=:;@JTVI:;DSijTNWUQT[_YOIC@CDA??@=98;=??@?:556668:::=CEEA=::;::;::>CLJG^fQ==@@>=@KQNVo|jcYPPD<>?BPWOJKH@>??DKICBCGHEB?AB@AGIHJQ]^YTSQJJIAALZjeUYkk^WPMr|nohM@C>FGEC@>>=;=I[``e]QONRK@>@T[5>::;<<==@KRN?<;:98876764204>@;:88:;AA=85966777568;@DEC>;;:@>?@9;;DONHD?@EC739>;51?MF966557@@:0QK2/04;>;58623556896578:==???@@@?==????@A?Mf`\r\UGDFWpO57;;:98557:>ADEDABCCBABJNQ\WSk|idje[FO\ZdYP]ZPXdlmV@<<=@CKWairvttvrga]VOJFGHIIGGGHIILPPOPW^ejiil]GGHCDCBBBBCBBBBBCBBBCCBBBBBBBBBBBBBAAAA@AACDDDEDEGHIKKKKKLNQTTQPRWZ[[ZXXXYYXYYYZZZ[\^^^^adddeefgggggeeefghjjjjjjfa\XVUTSOMIC@BHJIJNOOLHGGEEEGLRVUUWYXVVTMQcg``mpo|UOYa^^VSUUPR]ek`OX]`^[[UIIPPV\_ac_Zjuz|z~rjlbZKIKRS]ed]X[]VRYei^]qrrseVYhihb^cc^^\ZZ\c}e[q{p`dkdaYMVkVvl:5?93258@HC76;@IEHF74lnT\fbYUUSLH@6666678:5>ttN9:;997897666777888777778888888889999989999999999;<85M`^bQHSRMPNGDDOkunW߷U?@>ADKICA@@GNONFLcWEG\whehkcg\z}PH?::;@DGC?FMPPLKPNEHPOOLIFEDBKObocPFShYKOSSQRRU^YIHKMOQQPQPPPOPUf~k|ǾĪϹƟƹƹǿҷͫմʭиɩȣr~}ymju~}aYPizXpvxqiMNl~sb`slcagqtjYQ[o}|r^PUaZRUXeTdrr~Ͱwf]hgR;KTSlXRB1;\JJH]?G16;:E<8F3:59FD;LHGGB@>8EJCEGFFFHKPP[SRULJWR=:BIGHECB?E=56665679:<>CILRVURRQOMOKIMQSROMOOJEOYXQT]___\WTVVUOFA97=FUVG74887521/14:C8/:FE=<;;9JnU]hRGF=H^Dc\NZMVXI;64566334469@FD>:9Ug^[D5211nR5Oox\E837=GKORUWVVYK8@QTTTXVNPK?=IPLGEDDBAAED@:8ATYLFIJIEB:78=FOUWURMEECB@><<GIA:?@>@CB@?>?;558:<>?=9:<CC=?[l\?6?CDDBAADJN`z~tlxoJ>CGE>Fbm\H?AEGC>AGEBBDFFEDCBCIT[YUQRYaeVLGFHJKJIR_XEKjyytZESxxyNOs<<;?BEGHDBGHLSQIDBQD?;::;<>EQ[\UD<>><>GIEB>979:88:;:6555<@BDB@@?=<>@8258:;60/53148<@DFE;37<<;978;<==9537455774469;@GJEAAA?@HRPGFLPTY`aaf`UqUGVYLC;:>A=<===<;?H>7=LL?7;=BFIIKMPSZUJGLQLC>96=@C?:;HKA<<=>=42@5:uf76113;87;>@AACEEDB@@??>;FYR`jSTLLR__ZMDJIGFB<77:>ADDFHEC@=9:EGHWXMb|piae\R[dhslG8GOPVe]OlkNEJGITH66=?CEFFEGJORSRPLIGBGUgaUJGFEFFEDCCCCDDDDLY`adb___[SKKJJIHIIIIJJJJKMLKKJJNW[\]bhea]WNHQ_imnprrrtuttrjbZNHGIJHGFGHHJKKLMNQY`a`daOAEGBBBBBBCCBBBBCBBCCCBBCCCCBBBBBBBBAAAAAACEGHHHHGGHIJKLLLMNNMMMRZ^ZY[YTRSVVXYZZZZZ[\[YWV[deefghhghhfedefhijjjjjhc_ZYYWVTQQNHDDEFEIMOQNJHECDKPSUUUWYYXYWRLPX`n{ytVOSX^\PLRXP[ukQT[]YWTQNONHMVZa`Z[[eoxwqoqdK>ATe[LTaWUZa]KJYd^Yk{xd\chjc`cjjcchdSO]~`d{{nehxmdYNQg_c[>7<:9988<><8787<;FM3JrRRbf[TTTSOI>5566677888QV>1487767776566777777777778888888888998888999999:::9?OEJbefNDUYMEDA?AF]pc[bXUDFJHFDCDHS^]ULJ^\QKwuekqo^|MKA;;;>GNQMLLMQJFKMMKLPRPJC@AACDW_QJHM\WOQSRPQQR`jUHOQNMW]XRPRWXZh}|ʼ´Žַ颹˧Ӱΰ͸Ծ۳ʺĨϽȻʻrxs{|v~lcnwr}`TMj~X}ghscSScqyvkdhpqnaSPSY^]\[[^d_ciYOidcF@E_̱m\`hULC9HC?A?=QJC}f?MR;JQF6GEFJ4B@@YQK2$LVPKRXTUaVMQLV6CKQ41BPUT?COPOEa?KG;JLEE@A>6FFBCDDCCEILPTPRTMPWLA@MLGEFD?;A<896756:;8907ADFH?74357:>>73Lmhg]D801-616>N\H0-47?NWZZ\^\Z\ZI;ERY[]][RMEAFQRH>9HLB;DUZTKNLFJJ?:=??BJQSSPJEFFEDCA?@CCCCFHIJNOIH@9Jq|w`B=A>>>B;A{k\ZalwoKC<9;:;<==<:;;>?7@`o_ICKROHEGD@@AAB>:?@?@?=;::9::;@HMOQPI@?DA:FRK??NQCDEIKHEEFNZegp[CGLI>?S`R=6>FHGCACCB@@EGFDCABNZ[]_XNLT\WQW[KFOPHO]P@Tw~~}|zW\ZTHURMF><;<<=>?CKSC:>>DP^ghVJne^D87=AN[ZXWMA===AIKJHB;78:99<<<=><9@=@FNOA15<=>>;88789653433455345747CLJEFEB?BQZRPROR^gfdgaToPBOVOF?=@B@>><:96:G@9;DL?7AHJMKGELRW]WRQQHBAC=767742446940/+YɈyftYEGPG>ABACDEGHFEHKB>DGFFE>:>9bu=<<;AB==848>BBCGJLIDABBAAABLCMa\`ZMFMciTQ]XJGJB87:=BBDHIED@959ABBIKCUƩyonnkgfhihor\MfwhhagWIGA<:?BACEEGGGHNRROJFINdong`ZQJGFEDBDEDDDDDJW_cdb`_^ZQKJKJIIIIJJJJJJKLKKKLMORTUWY[__]\\^^dkhioqqrrrsttspi`VKIKIGFFGHHIKLLJJKMORRQND@DBA@AAABBBDDDCBCCCCCBCCCCCCBBBBBBBAAA@@AEHIJKKJKLLLMMLLLLKKKPY_[TVYSNMPTTUXYZZZZZ[[\YVTVZ_bccdffggeddefhijjjjkg`[ZZYXVSRUUPD=BFBAIRTNHECFPXXUTVXZYYYYVSONYg_Vowju}cVV]irbKO\WS`]RUYYXXUXWWYNPW^g^OTXbltqjchpm^M>D`lXMNKJS[inTBK[_Z`pvvupb]bhbdfmqihxzfXa~}xvqghzj_UPN^tz^:699998799:9776:8FM8a[?RgdVSSSTQG;6656667787755578778777566667777777789:8888888888888788899999::8<]la^fp?DVTMORTUT_meQƙ[WND@BDGKRaie_VqeNKxw\akiok6<=::;=CMWZUNMPIDHOQNOXVOGBAAACFJIEFHIMPRSRQQPROZqeQPRMM_hbQKTasunȶɿ½̼խ©Ó̧կǯŨҹϜľǡέ «ļĤѨzʸmmg•~zt~rvlenocxbVLo~yWvajyssqmlaWPLJLKE@86>EIQUY_]^eWAHjz]MKG˰jSekKBG?SB598Ha>FxrWD[J4NVPD;BR@-617VOF*)HHTOPTQWQQP[DJ0DVF/DWaOI>RRVIJLCJI`mPVzh=4S_]PjD_L3G/>PJW<3FHNE@BBBBIHJVRUSPOWYNLMRNMIHF=8<::98856=;79;>BFIKLLMMJE?DOQLMPORSLFHNRRRSRRSTWZYURRX][ZRPRHA5,/441..//012@FB>@BA@BGLTuWOimltnS7Mb^^UTBHJ?38MXZ\YI;555699-@}mbfbV;;5/&&?QI?7-(0@JQU\_^]`^X\YHFPV_a`^[TLEHNOG=6/2>DABFGILPMHEEGIIGC@?AA?BLPFBFFMUPB=UwswI:<@??@@GlbE@>DbvB8;:::;;:;<===<;:9;>;?QZRMPRQOMKGA?==@A;8<=CGE?<;9:99::::;<>?DJMJB<88889:;<831358=BACGI=13:=AA;76445443211234345623>IIHIF@>;ERRQRKLend[]]TiSBM[MB@@ACDA?>;728GA;:999::;>B?@O^__aRQQRRRTTLHD;86229=<54:9]溈zxU?CGFCA@@>@JLGEFJHGOKCEFEC8EqW0),BTK>;8:>CHF@<<;::976=B@@ADEFIKLLC?BBBBEFLICk`\b_VJTl\LTXSNJH?879<@CEGIEC@83;DFFK_{͘w|{rttifgigbjnrzvcVY^cn{sRHG=6?LMJIIKJKVYMJMEDXoaNsrplibUNIFDCDEEEDEFKWaecb__]VLKIJIIHJJJJJJJJKKJJIKMNLNQSTVZ]]^_adhgejprssssssssrplh`SKIHGFFGGGIKLLJFDDHGBDC@@AAA@ABBBDDDEDCCCCCCCCCCCCCCBBBBBBA@@@@@BEFILMOQQONNMLKLMKIKS[ZQLPOKJLOQQSVXXYZ[[]^``^]_aabceefffhfddddfijjjkkib[[[[YYVTWZXOFLTK?AKQPJFDGKW^YTRRVZYXWZ\YRU]RQul\fh`ab\W]b\PVVQX[VTQRSVY^jlhcZUPVdg^QMYge\\blh`\VIUc\S]_OPaiswgUS]ca\^^`df]Y]dccaclnfktsiftwuihzp^RXarp;4:987779::9788:7CFNfE>]m[SSSSROC85556677777678666666666656666677778:99897888888888888888898989997JpnbW]qM-:LMN_qyrkheN`ȄWPE><>@?@CQ`gg_QQfx[V_xp[YAC:;98<]]FQSǫhRlnLDJM]H=:HQ`=DXfmCBO7BJJRU@G^F3,(4LJB6EEEOGOOMICNS`LK3CY7=T]lIIDYe^pI:HQEMWGL~~D;Nctb_sFZXBQ17T]SB7HKPB=GRJF@DD9KD=AADIESLHe[^SMR]bXUURPQQKI><<L\_aabbbaZRUSMVaggd`]XQPTRHA96755>BA>AMVN>AS_C?C>>=::OwpA9;:9999:=EHDEIF?<==<97;EQSKEEKOKC@@?A?:74:AA94567:::99:;=?BGKJJJGC@=<:>MephQ;9?DJQSLJTYVRFFKFIQSPMJGBHZhnfPEEC=?KVSPOGDFEFGR_cieZS[j]XnZFFOQKB=>D]qlmζP[vRIQKA>?=>>>=<=GRV_ebdebbv}xxrgE?@AB???==;9:;:=DIE>;97655778:;97722?FFFCCDCCEE>9:<<<;:97677:BAA9348;?<777532234763244344544;CGIIE?=;DIFIHGO_g[QW[U[hTHEIFEFGGHFA???;27FA;;;:741EN46J]hjnaJFNYef^]YULBBDA?EKC54?=MԒE]spmSCB;87997@QQNNORX`faZ]XUNT{uubGCCD?9537BAACCEGH9Ng]Yce]WVVJi}LHXRNQF:878;=ACFJJFEA97fcDPpiRRSRRPI?7555667777767655555566665666666667899888667778888888888888888999;7N^TK:Q]>9ILHM]otg[WMHvkaWVUJ=9:@HPZ\Re[bmoqm`icXxe;?CADKKIJRRLKFBEKPRSPNOJECCFFGIIIHEGJLNQRQPPPRVbkaQMXgd[SQQd}o¿ԼųͬÅ˺ƺĥȻƹվκǪϭӰӱҺ˫ˤwc“|{ux|qopplqqOp~j_X{Zgchhlbutihkoommlmptuwyy|tO;GW_VGIVæcRmlOLPTX[>J]GP87;kSALGJ86APXRLdBOR1JNciBDCNi\S0IM8FK:=QBFFFGHHFCFHFDGKNPNKIFHKOOOQPORSTTTSTVYVPVXUXXSF3-4AJPNF;30/68>7;=DKHDFJYYOVpduyra_okfPBFJGCBCGQ[^c^C1493/[sIPdwm>745CXaR?34AMIFVgiiiighfXMPRT[ruhb``SFIUO<35:=@ACDCCDVfW:1@IB@>4/>SHAFLNRVWLEEJRUTRKGGGHIIIJORU^_XROEKi{wxxqtzH5AT==;=@A?;HLIMRKB?>=;=@>?GF;6;EQRMHCA@=:?DDBBA@<33;=934789<;:99:;?@DA?ABNRNOPPYaWD@C@=>AJPOONH:DcnmaRKHEDENXRPQGCB@@C[nfngTPuELEGJOQNJKUW\]Q[hE??CB?IJFAABA?====>@BTn}ysptmguDIC?<9::<=<99<<<<==;;975334426;;<=64AFBBEC@=:986678:>@=57F@;;<<851Xq>JPm|nOIR[gpsniaYSONLJIJMG53;49t{Y\ؽySYN>DGCDGFJUZhzijloymJ=:778<=@BDEGFA><95@AAABDGG@:74]hWNLRSssFV\SMMF7579<>ADFIJHHFC:75556666666666555555655555566666668;DO>36767777888888888888899978U:BDJH>@BDDAABBDGJGEDHLHEKNLJIJLPRSSRRTWZVORTW[]\[R?8@BC@9103624>58AILJA;@klMSwz}mRcjcTJHECA@DIPZb`T=155,JTIMQe[;8;ATXG21APYXRWbb`dnpicd\QNOXYjqnifipJ?BB<89::::9:::;::;<BB@>?979@OZZNDBC?;7:;::<<;;859=>>>=?BDGNTWRJB@?@BFHD@ADHJJGFHR`^F9AHGA<8=GLLIF?F`icRHMRQRRTURTYL>8E_^gfiihu~HNEFHMORVbf]VMFd}P;A@D>:BEBAA?>>>>=>==AN_ksvs~{ިPUN?CEEB>=>=;;>@;89<==:753443369:>B>8BB=?GF>74688878;=ABA=8669;>@?=:66216642459@EC;7766445630/EMKIGC@CIJDB?@Qg_MQac][[YNT`c]VSRPH><><518G@;:99993IeVah|cCRgpuv{~mZUXULECCBFC711.7Uj`Wf˭]>=A[rphefytmpdmN888::?ABDFGFGD?aLKGN^`^XU]VURLG=868;=@CEIJJJLM;ZvQ=NQJg{bwɿͺtmrljqwllqooj|tkOR`ji]IDGGKW[W_`rrKHub>GLIGGGppqpnefePDAAABCDFEIXceffddd[LGGGIIJJJJJJKKKJKKKKKJJJHHKPWVUVVXYZZ_fjjkmopqpqrqqrstvtng_WQNLKPURMLMPLC??AAAACCBCDCDDDBBBBBCCCCDDCCCCCCCCCCCCCCBAA@@@?@ABDFHIGGGHJHIJJJJJJJJIJIIIHIJIHHKPTSTWY[\^_`be]J?BIMQYaghhhggea`cghhjkjf]VWY\]\[ZZ[]\]_a_LEJRLKh^?ERVU\b[]^]Z[Z[V`kKSOkv}t]VU]\\a[Z_`ijYOMKJPJHQV__XYST`bbb^mjULIQQYfk\_eiihe\[\^][bgnvsf]_lrkgaW[iple`djffwxowxlkSDJ\glqH4:987777788789940bjMTjgROOPONJC<6555666666655555555555555555666668JSXXYVPM[ptpXbe]UPO^{NFGIKOQSUUSOKIDBFLSUZ_bXNKIGGIHIIGFFHIJKMNMLMPOU_^ajib``chr϶¾ſѺʧǸȽɬ¸|v~ѻϹ¸۽ʲեѸ̾۵źǩѝȪinvzzxq}z~~eůtzgvZnkx{zYUiu^iqVLPXZYfof`h{rfcr~od}XC=j]EGiERšycYcfLT`VqT@58:==FPMBGP6QXANW[ooMGD=nU0,YPLaB]ffU~@.l}Q=CTFUclXXjTa_MfZLZORYD9NOORTAJG?`]WATckUi_[qucO`]quhRIT[ZTTQOQQPG@B:8:;:536679:;;=@DB<;>BEFFB?BJLEBHIGCADINPPPRTTVWVTRSVY[ZXa_SG:110/17;6CLNVZP>335/????9GQSRMMQTTRIEKV[ZZYODFKQWXZ^a^[[Z[ZSNRh~Չ{ݓYH@>??A=<>??@G98:889:75:;:@GE?>?CE><<:AU^LANPA@B><=????=88;>@=;<<639=?@=<>ACFMRUULB@>CVql[N@AEE?>?@EHB;=<679==<:89;??;98:=???@A@<9811651389<@EB?;88863231-.CILNNICGLGAEGCOgbR\e^ZWXW\[]qhQHLNHA;<7..9GA=<<::;=6;;Jm}sa_ehjnwzm^WTQKFHLLHA=:;H[ejQN㺧yWKRWY\aa[alk[G8?AACGJPNQH`EBFMZ\WbfTSTVPHF<57:<@CEJLLMNEVjg^XzйƿZ^pwtsngpxpcYTjłmk[nfSOIDGXecb[pmCixC>HJIGFFoprql`VRKC@@AABDDEFNVY^cbdk_JEGIIIJJKJKKKKKJKKKKKJJJHGJMOMPUUVYY\bhjggkmoopppqqrsrrrplf_\^``afcUMORLC?@ABBCDDCDFFDCCBBBBBCCCCDDDDCDDCCDDDDCCCBAAAA@??ACEEFHHIIJKONMKKJIKLLLKKKKIHIHFFIOQNNSY\\^aabdh^PLT]agkjjihiiia[`gggijjlfXUW]_]_^\[YZXUWb]IWiSG`mWDYmdgbYXXWV]ZWW\eenu}{z~yXKEKX`edcbbike]ZVTTTVQR^a]\\]_YWV_qeVJFCJ``UW[cf_`egia_XOUhxysc`fuifiaZassh^Z]ccckrw|shF=I[jl`qyH4:98777778879997FrZL`lYNPONNMIA:6555666666665555555555555555666669MmhD8689999788888888878899;D\kkcWH<5>>?Qirpnjfe\WQLGWnut}xaK;38>LVZYYXRMOcrzlZ_c]Zaeej}qfb`ZTNJHEBFMTWXWUOLLLJGGGHHGEDFHJKKKKJLPRT[mqdcesԳʼɬɝĞ˽ŭ˴׼ùĶļҿĿӷóӻû֪ͭ͸ħvzxwrvxzulezx~fķwzpgmy}ytYXisth_u{dVPV\bnu}spqdbjxl^ceTX8N`IZjCQzh[amNK`ZkPQhO+==BDZXA6?GH/.G^OJNKYqT>:33DNbPJ@CTE?PB>HF[sWNJSMjI0/_ZN`sQXgpt{R\oUGOtgNhq[TkfrdRfYUtK\YG7IYMLQIIIPjeX[kxtRk`ctud_eayr\OMV^[UVUVUVQKGC?>=<;635679::;:<>;8BCBACEILLMORUUSUVUSSUXYYV]ibXRD60/6?@AIOYTMKLPWT@duKJ`t{fCWkaRFED;8=ABEMF944518iF5MOFC?9BG914;EU\\\adfaPFTiqvu`WYXKOWUJPYejv`JIJHGD>8=GJNPE958::;=@=@A?EJLGWbQIHFDDFJOPPQV_[OGLX`cgikkbYZUZYXYivbp˭˟oWB4=BL_Y@=9OrE5:DA;;;;=?DKH@==<;;<>?><;:65GVE@WU@BGA:54699888;@B>:;<:89=@A>;=ESeWIB:88?FGEDFILMORXXZSFB@JQLCGORRQLJLLIPWKxqқmXdUGMJLMTWIHUsΪeQ==>?DIMTZZRJFCB@=CIPQW`rtps]ezZNSKB@;;@??:16ELF@:669<408?CC@??A@>;:79==<<<;;;;99769:8201058CJXXOFEGMD;BIIOZX\iaZWSSUhjUS]QJLNMJE=7249B@=??;0CfcWlohljc[^aQZieffTLRV\abdqwjPS}S^ʢimha^TVX\bgqnU@9X̻ɫugghX7+03448<759<:62/07<@CDDEA28GGF>15><>?>>>?DJMPDT|K@EEJRUfw[LSW]KD@9;:<>CGLNMMMQzUJpt]vѻryfhtr`V_hy|d\WrҘqidyvb_fQDDRca[Yi`HPICCJIHGGoonoi]H@FA?@@AABCCCFIJNV\ckcLCFJJJKKKKKKKKKJKKKLLKJJHGIJJLOTVUWY[che`bjnnnpppppqssrpnkjhddffdef_SSSMC?ABBCCEEDCA??>>BBBBBBCCCEDDDDDDDDDDDCCCCBBBAAA@@@BDCCEFGHGFGILKKJJKLLKKKKKJHHGEEHMNKJOVXX[_baabfebeghhhijhhikldZ]efehjjmmg\UW^^_^][ZYUOUagT]z^ANpe9NsonmehlZS[YXZ\YZgx{|uz|||{{zgLIOUcljeb_XWTTSSZb`ZPSff_]ab^YVT_naRIEO]f^OWZaVP[auvmaY\X^`_^`cg`Xch`]gsrs`]eeca`gt{w}}wnABCA>;63468897872599=BDA?@AA?BGD<;?DIKLLKIILRTTTVTSRSUXXXVZaf]\]OB;?HGAJRTSPEKOUPAZoELUx~xwsP?\kNKGFD<6<>:8=LV[_babcgg^PMZjroe[VYSP\dWMHELntl]PENTRLKHCFOXL>877878;?FPJ?HUTHObR?=;::;DTUKMWda]VQYP[gpswhW[\ZV^cibA;ssL\[IOP`e~I1Xc9?s]9<<=>@CD@<<<;<<<<==;:999?JDAORHFGD?:7777779>?<:=AB?:9?CC@=>=;>BBDB@=9MioiϭnGNJIO_\FVb_дVFQSTTSSUSMIGEIEAXbTU_erpl{ڐtpdUNGFG@=:3/7GNIA:58?DD?7.4@<6678:==703337@@>=>?ADFE?:::968679:;81/019@FW`]QFDBGF;?HJLMK_d[WVSLTmxrWPTVVUUTI=99:9;==?>;3EƤsslIMRFJTb`U^aZe[=<:96226:?A8315?EIapNOVnhDA;68:@GIIJNPP|˞`BFYxe``_ldiejc[cssb`\aţ{i\g^Uij_lUBEIRWRSWIQhXLOBDIHHHHpoece\J>AA??@@AABAACDEEHQ[\[QDGIJJKKKKKKKKKJKKLMLKJIFEGFGHPVXVWY]ac^[`jnmmnnnppqqrqkd_[Z`fecadgcZVWRD?DFDDDB@BEGMWVKCBCBBCCCCEEEDDDDDDDDCCCCCBBBAAA@@@AB@ABDEEDDEHLLLLKKLKKKKKJIIHHFFFJKHGIMMNQ\adfefhihfeehlkiiiikmc[_cdfijklplWLY]\]^[\]QR[_c^\qlXPebDUnscqzjUUWX]_`ZX_ddWY`bows{vu_MOUZ`db`XONMOOLS]\YOHVd^^`_]`aY\e`IGPipl]Y^XcYNQVa\bb]kgZPT\dgcY]ceY`gbin][bgihfb_dlwwslBCOZoyko~O3<:988777767773>s^Mdh[QUTRPMKFB:5555555555555555555555555555555557DK?79=<9567878977777778878866?P^_J::Epy]HQ^UigQLXZVOMIIP`^POTQF@8FLM4;@32DiU3<<\<8?<@8A=FBULU^Vyg>6aPPalV=PTV\XBETh}[iOFajgV^]bfZlVRFKSDB;:AFJLNNLIILPPORUSPSUWXXXVX[_[Y^\WSOLIJSXRNTHEADDZrrD?CA9564/L{gCCIKLJD@<87ET]`__bfhghhid\_ef]RQSP\je[[VNBKstheXBLYZX\^ZNIQG96999867?=:9<<<=?<9:>=8799;AEDHONGDCAA?=;999=?@AGIFCB>;=BCA;:;;;A@?>ABGKRbmdO=6APME=?79>DD@>BBBCJU_x|yFOKHMU_\`hlzqq~Й]STSOHEFD@CD;XhPXk^TV`sÉj\VWXE788:@GJH?869>DE=5/11/4;;87:<821138=CC@>=><:;<<;>?=;AA>>??;858::GNQVTKA:=KNJCGDBATXSVXWVWplVXYWWNA:9998::>A>:/^ڱlGCVbUKJT\^cfgcQEcvqw}eTek[Uvrr||nb]YMShb[kwCMn°ohv\==>>?EGFDDEFHJQYgwq`_~jqjfhobXuxUPVr]LXSH<;CGJPWW[bHI\jsk`\XODGui]esufY^fc]c`R|qvģĪowzyfHDHJ]mcYJDEFMTRONLSUOQJ?DHDDHJrqf[ZZPC@@>??@@@@@BEFGEBFKJKMFHIJKLKKLKLLLLKLLMNMLJHEDEFHKQYZWUY[ZYXZailllmmmopppnnkd_[XWWWZ_egd_[ZXNEEDB@CFLXahpxxoZIECBDCCDEEFEEEEEDDDCCCCCCBBBBBA@@??==?CHLMMNNNOOMKLLLLKKKJJIIIHGGIHFDEFEFMWdd^Y[b^V]fefhhghiihklb\`bdhjjjlqhTP[\\_[^`[XZ\]^^_qx\KZowa]x}hgobQPV`\]^WWZa]]bdujyf]TJNTWZ`cb\TSSVWNLSRTQKLU__[ZakdT[kfGN[cg^[[eddcmdXW^b^`lqj[Yk|xifllgfheikmlkmolje\Zk}yseEMT[p}~~R4>;88777777776,X^_kdPPUTRPLIGB:5445555555555555555555555555555554333336=;597?L]ac]TPYhrsvsmcWYZZZYV\^ap}uT>CRZXVUSSRMIKPUYZXVTPNNNOMHFFEDDFHHKGLXV^fov{{zŸŲǫɻЧμѹɿŻ̿µͳοֻӿθнñХοȱkt}dru`imeWj\kl~t_ymmÿ|m}}q|teuufm^jc}pmg~gk~pcan~jDOdo{rbaDKg[W_TL|uxŷ~_c_HZbbtbSI7VSFO>bkg:>;VM=DC888AL7/'*-8NI7DOj:8L;C@><<4VK\TVugLp[@[\gv>Bwyc^Talb]o^RuC_xiNTX]_Xx[]gY:@UeqrK[jp~}[hsqupx`hnYOgd`[c[YSSSTNVBJLLJG;37449:74758<979;;89;=<==?>=?CDGJMMKJKLLKJNRSUWZZYWWVVWWYY[_\[YTONTXSLRM643>tkIFzgULOitJDPUKB9<=@B?7431Cnj?=EDHH@:6:EOTSYcfdcgigiopd[YWQMJC9:;::767HTDDFHJKLMF<:<;945H`nlgb`__XADNmkEFNYTB=AX~z{՛YVgai`oV:<===:9;<>=<<=<:;>=96558=EIHGGDCCBA?<99:;=@?=@DGFB=:=AA?<;==>>??>;<@>98;=?AB@>=>><87@EDA?BISUXdgU=49JXPFEAG^BBBDDEDDHO[g|ʻ܌cWUPJFV^jƷ}|~|wshmzqYIHFDC@=:9?B:PwjXe`S\ltۻԍqvki_[Y[T=6?DGJHD?97876;@;610/17;9557:<8655:@BA@A@@;8;====<=:79;=;;ADGJEA;12323348@DGOJ>88O`^SIB?>KVXYZZ[UexoTQTRJB@>=;99:@7?ߩ~onnYZ\UWTS[`WNUfnhasnynWf¨zqmzkb__aeacbe^VYalLfZ??=?DFB=43663002Fbkcc\[aVMSVFHUWWVY]djpyd^aWWUebt}r_PNVdnkcaXL[pq{eZclb^lyzx~qk`Z_][abZQLDS~No|f>9A@CTYJDEEIQVSOPQOSTKFB?GB9CJonlbVOKEB@???@????ADFFECCCCEGIJJKKLKLLLLLLKLLMMMLJGHKSZ]^affd_ZXVUSX^bfiklllnooppnmmmnoiXQX^bggec`\]YH;@BFLRSRRQQQOPMKKKLMLKKJJJIIHHHHGEDDDDHT`]QIJT\WOT^a_`cegiieaik`]`adikjjmniYPRV\]]_`]Y[]_]WducGN_rlYniXahbUE>QYX`^^^Y_`R`rirbQQ\]Y\fkeZUW\[YVRQUUWUQ[d_cnhXS\fdPQ]`f_X_jjfgxnXTh]Qhh]]YRalpoicpytleie[jlhjkc\_`[arzsjSWX_iwU1;;978878878728z|cjk\GPTSSRLJGB94445555555555555555555555555555555568887;=AWfgS:6877777777788I`ebZOQOHLBTXoSRUVWY]VF=BS\N717AKYd^ieY_\ZgnstpfWZ]XSOPZdddifK6DUWXWWTRRSPLMQSUVTSPMJKKLKJIFDDEGIHMGLc`gqsvƹøʱĿ;ʥu|Ю̽¼ýǶͶŻĻһ͵Ͻй˼ӲŷŸøĘkhm|e]dgZdz[ggvuYrpjfynth{sygtohq\nclf{g{pquuh]Me{hLSZt}_qoM\^`kYlQnwp^`ZN`anUERP]IYPMkc66:LDEG:/3;FMBAH:38?EEUPF;FQ7KI673=QSU>Q}ZocjlEPLWlnn?ntg\nMkj_dYV^c{F?RTWYlhTzdbam|qA[ns}~WjulujucemSWgc_YdXXJQSSQRERQQOL:7@>9;:5779@=776578<=85;><D5429eewi\ZYiwbYQH@ABBA=;;85-7ckB0=B=;619AGU[YW[bgjjghiop_PTOJCEC78ObdY_db`_dtvjc[R^TKWjmrlSLI@<<<;999=DB@BCCCCFMQH=::87=CHVaa[T`b[?BuU@LXVG9GL;@n}rttyʥ_K\fS_n@;@;999:>??=<<<==;9:67?A@CIHA>ACA?=;855679==;:=AA?=;?CBA@BBBBBA><9:=<;:<>BC@;:;<==88BHHB>AP]YTTPD@JRTYQ@A>qV?HSOBCEDFYª¬}^NKKUsx{wnnpfex{xwpjbd]DDABBAA><>@FPPbi`c_`lob༢יnnUJZbc^UAEKKLJHE?;::62599856899989:::;;986;=:668:==<88:>?>9=?97ATeZE??>?A@=9=?@3lYzlOOZXWUU\_YX[]jiiywrϡzru{h]X^aWJT]qDHOFOf[EnVNF@??@CCA?=;;9985Dssk`XdLFB?<>A>9752346778::5;td-9==Uoj[UTPLL`|ypoldktugrxZMPWk}yotpnwtb^`abaidVaYaӦ\?Sox^DEC:82((LlVWac=86;79>=:;<>@CEFE@>BFGFGJMNRWZZVRSVUWYWTSRQRSUW[]_[LA1=C664SooifZdmhkR82?BFKX^^`aekllg\ZZ^hkj[OXlsncRMF><;;;8;>ABCC@ABCEGHIMD:::;;;=CRYVTgbrNz@8@Z`B4IOMcosonury¹oqnpflr?8:8>HB:<;<<;989;=?;78;:76658<==?@@BBBBDFFFGGFEEC@><=??><=AFHJE@?==<>?@HIHC>ANRD?@>?Ob_W_lSF?;S]OADDESexwy۱koTNILZQix}th\POXgqomja_dj]@E?BEFDAACDDX`ZX]^_`_`fqäyRRZ[fpb]QINOROH?=;:878::;<;;:;>AB@<::8866;>82007==77;?@<449;;BO[Q@?CC@===>?@?Plkc]HB76>d]OLKD>>>=>??@@??ABCDDDCCBCFGHIJJKLLKLLLLMMLJIMTX`dhmponnkijiie^[Z[]_aeilllllnnmmmmmlmpqrohegdceedaXOP[debelrtsrruxxyyvsgWJDFHHHHGFFFFFEECCCCCCCBBBBAAHTZ[[VPRTUUSRQQPONMKKKKIIIIIHHHHGGGFFEFPVMACNX^^[WTRXadegggfec`flg`__aejlmmnpkQ=ALW^]Z[^][XUS[`XOWs}v\o}vm[VffFKk^S_filvk[ixvofZbol]XZWVVW`lstn_QPY\SQZ[XTKO]]XV[_\]c_^c\Zbb\aa\LBFDHVf\NGO_c`fnpuk`icRP]jgcggeccaa\asq]VYckuxqY2<<;9::9987974rcBZn\?HTTSROKHD@823455555555555555555555555555555566654446:AI;;CFFDEHKMOPQRQPSUUWZXTQNPQRSSSU\a[T=7C>@GZ^yukk\gj_kV80:?BA<9;>8>YZ866,,6><;<;:999@JIB@A>::999868=>;855:>??@BEIIHGFEDEEDEGFB><>BB?=;@BFGEB@BFA77;;>Q[QSbtWH[dIB?@Qelpead|zqFKPMLYUP[y{rcO@EVep|ydZQsSMOAQSME?IXSR`a[baWOO]}bDCKUozcVKSgjI<=>;<<:89;==;;=ACDDBA=:8866@KKE9.0597:>><723<<8:<=CEEGC?AISXQNLRVJ@?84443347YtkrrkvcRWWljfY[`j{wigikk_ciJ>>Di]\diqrniirqJ\pqU8<===?@@?>>?AAYWa]G><9;ACBA=:;;=?ABA@?=H`y`{U56:?GNbdg~th_seqlV^UGJTKcܹ}owi~nYYi\P^VKMPanfbb\WRQPOPQLHEFHMOQWYRR]]RYee\URIDC_[L?>@>==<==>>??@AACEFEDECBDEFHIJJKLKLLLMLIJMWbggfeglnljighhghfea^YX]cgklkkkklnnlllklmmonlkjgb`dfdb^\]a]VWdrvpopsvxxwvvwtj^NEGHIIHHGGFFFEDDCCDCCBBBBBGU^YPKMUXVUTTSRSQPPONMLMKIIIIHHHHHGGGFFGHEBCGVa_TIHQ\abdfgghhhihfjlfaaadikllmllkV?>HPRRW]ZYVVW\]\V^~pf{`a_covgu|cY[dnv{{ihz|ym[opZV\^ZXU[ellh``miYRVRLOQXa[XV]mtoke``a]YVPY_\UNI@H[WMGL^hd[[accYS`ZOV`_]cljbdki`X_duysaUZaiqrl\3<<;;:::978;1KzLHgmJ>LSTSQMJFC?6123555555555555555555555555555555555567877AD<8468776666678788889C:Qw58B>6+x֒C;87>S^T;7>C>635kJDLTphiV@\adPtSSkZto|mvbj~[l^dhwzkqpNLnYT\dbSDKIFCQPIOFJOVafaTOQK<7@@:7747@E?13CI>=FF>@HI@;:;=?A@:1600?MRXdhda_`^YYdfdgc]\\OIYbXA9TfOCZihjpldho_QbiSNowleYJFHJLMHHHHHHIIGHC<:;=:9999?C=:AEFB=<@A=899;CLOIBAB@><<>???>?@?>;:=?@BKH@M_`\`CDDMf|̭vjfVGGR_pJQROGO`Za}pplbL@COayhZVJavWK[TE:Fb`NVdildONifM>:MYsd^^pz@3<=;<988:;:::<@AA@ACDA;7668CMSRD4/034:@<627>B=7668EQICEAATdk`LITQ?35653210353=7[R>DB>@@@:E|ۻٚ?6DMwkxpxzxoXnssw``[EAPLm֤fyin{Y^ZG@GHIbcWWY[[XVXWRRRPPOPQRW_a]]a^UW^ageRFPVXVK@=>>=<<<===>??@ACEFFGFDDCDEGIIIJKKLLMMJOYbgb[Z_cjmlihfgggggfgc\VX^dhklljijjkmjiikkkmmlkllga_bfdb_WNJHN_nnc\fsvvwxvvwxwrgaXJIIIHHHGGGFDDDDDDDDCCCBCJUUKBES]YSTUUUUUTSRQQPONLKJIHHIIHHHHHGFGEEEFJUXRGDO]b`acfhhijkkkiilkebbcfiklomgnoTCFFBEU[YYZYX\][XZvz{cELOV{{iuiZXX``Zd~}rckqZai_\RMSVTYcnng^XWUUTPU`^XWY`oqofehicWP]fc`SLFGOFGOPZmnaZZ[[WW]`[T\hjjrqgaiusaZ_XngX]glnnq]4;=<:::::8:94kjO^qd@BOSUURNHFC=4023555555565555555555555555555555545567853:@705877666666677778:=;7BG:7<;952ZX6B=7>QYL:27?A;518LH@<:6?kvWJIDHMFEGHKV\YUVQ?JkmRDFGC@=EQRQTQKGIILRNJHGDDEDDCDEFGIKMLX|}ĺȷƚùʖƿŨе£|zvwͼļƵ˻ƵƶǶůɮ̷֍̶Žſͧͣzxd\esyvrloXYWW[bx~qluĸ|Y`DIJxnmz{yl~tW_lYgxmitTivE^^Ri}ajhGz{K[dS]XnWtba]XuxaSokhQP\Xg[GXI`\OH8P`aN:8776;=LgQ9@LM0:8;5C6.>ZR@NP0"056>PwpTNkPskx]DF{?LUNDd{]I>FUdttbdWL`vZbrgpjsyiqWn^aixpuugA__QO^bcLBJEAATAIDDKO\fdYPUZM:?G>9:99@ED47>JC>@BBC;8P`@0/4:HUWW]fidaec][bhaYWTNVUD=DHMPMORJFFD>CFHJNQH}yPWdF0?Zu~p||xuxp^RUfu~lgoi^bmlkgWD87<@@=:88:=>=><99;;9:;<=<=??=;;;9;>DHIF=:>?=<;?BDEB?@A<6679?INOJDAA@?>>????>=<=?>>?BDDA=:>VZ[RQKTͯmdnaKP`tē{le_xvgcf[IB?Ec{mTPPPOONW[F?HTUPV`__[PYsiRKDSZ{jgso<99:<=8479;:68<;;<==@?<84227=CIJA865229==83IE;>=4H_h^LJOG=525548AGID77DJC63444:DB@?AMPO[c\ajROQMJLNORTQB5Dzʏ_Zkf^gbǗul`RP˪f:KUTLFHLDPWXhbro\TLBB=;IUW~{|psJ16=BPkpK:?>??@@@@??>;QR:><7@NKADHG@>=;;<=>?@;]?LYδ]˝pVKJ\fivx|iWTN>;EGc߯]PW]o~fheFCJ[bjgb]QSTTVSNMRSSSTUUT[bbabb_[ZSMYeZP[dRPIC?>=<==>>===>>?ACEFFHGEEECCEHHIJJKKKLLQZ\VOKKTakiccdefggggfddb\VX`fjkmnkfeggiifgjjjlllmljhb_adcaXH@AFT`]UWalruuvvvvwxxvohbZOKJJJHHHHGEEEDDDDDCCBBCFGDAFS[SKOUXWXXWWVTSTSQNNNLJIIHHHHHHHGGFGGGHJMHBAHSUSXbffgijkllllklkid^ce^dkkifgmlZLLB:M]_\YXXZ[ZXY_aU^aKNaS[[R`a[[^`bifw|yj_]mh``WYUU\^UPT^^Z^abcd^SMRXXXOL[kh^hy{ti[bdaXNLLMNIRcUKS__TSOSX\eYVSQ_sxzreahqrj^][mj[^pocl}\6<=<::::<;<1IvVXktTCLQUWURMHDA=41445555556765555555555555555555555444553456@C5377665666666777779767675877548=9>?;7?OH=;;;=?:75HZD99998FSLIIEHMFBAELV]ZNLO@?Vi_LGFC>9DQPPVOIIJIEFGGECCCCDDCDFGGGOo©ȹļκ~żˠɯs{qİ˽ÿͺʫ´˵ŵҽϱɡϷٛɸͧȨppn\_gr~w}mn_IHgvrmVWp¶{uvxmhilt~tjdR]yt_ihhpt|[amYESO^u}xX`Z_Tu\H^ynPy[]cQ`kXUkr[MUYZ]LSXKbk\^KC?NS>9:?118DA@FH:FUXK^:/>M87NTNOY:#&=S<;>Sjigo{_lal~k?Eu_iMI{dWXPc`YvSTMlhRvnOnz}ckaYla\kpt}i[DmOKL^``FBI>?HLAJ?FJS\_ZROY\ODNPC>@@AEH;7ALJ<@H?7CNC46DLMKG@:?DHHCDFFEEFGIJIKQTPIJPUWSPPRTRRRWYWSD]V]FUzjk|~j[PH>38ABDE:AnuA-8DPWRQW`fib_nfa^`\X`^YI864:=79L]L9?E[dYJP^feaXV_XF?L`f`TF@BGHIIIIHIHIGB=Ri]UQA?>;JZTGGEIKB?KSUWXToئ^:S^>07Uy|jcV}yn_VVUZfovdYW^a[\o|rgd`Q>69@JQI626>AAD;99=;779::<>AA@=88:=>>??=99;;:;?CB??>@DA759<=@FNOKJJFC>=@ACFHF>;8:Mo[^`iGKz|uȘemgfea]Z]OCABS`TGHJLNPC`}VfGPPOQTWQONMQM[н—_TOTaneyX@B86@A:68::968;779;:975443479:;;8776335:>><=BFHHF:39C?8997=MY\UNID=7338>HY_SE=75333445856653CPQILUkҬgQZTOQ[guzz\red}cpͬ|g^VyœUCHIIIJMJM\]`{pLPVOOOJ>>?AAAAA@?>>FJ=8?>=;BKG@=??<<;;;;<<><@DPKxӇٺÛgOSWafqtlb\SOB55;>DNTN֒UQXalzԬmmooqqrrnh`_XboePDLRSSUVUX\_^_ef_`gYMPW^^]^JJE@>?>=>?@?>>>??AACEFGGGFEECBDGGHJKKIJJKOMHDEGKS\\VW^adefggecbb`[VZbhklmomf`bdeeefhhijjlmlkicaabbaXG@EKKIP^inprttuvvvvwxxwmb_XKHJIIIIHFFEDCBBBBAAABBA>>DMUQFDNWZZZZYYYXWVTQPPPNLJJJHGGGGGGFFGGHGGGDCDHIFN^hiijjjjllnnmmllibcb^eeQRZXae[QKJC@aw_IJUWTTX][SLMakk][fjj_cJ5Tg_u|bgplpqb`kmklf_[mxslbVOR[dib\ZZZZ_eghicXQU]]XMN^nm\Xbb^ZNNRNHJUVLKZdngYR_f_]XUTSXQTVR_s~|ticdijb\`irqd\[aVTl^9<<;;::;=>74gnN\mfEEPSXYUQKGA=;5345655555665555555555555555555555444558>HKHNK81885556666788677888;A:?WG6663/0:D746BL@797>Ya@9@?>;:AGHHGIOGA?IQTUOBDKG@EYeXFCFHFKTVVWRHFGDABBCCDCDDEDCFHIILPqпī±|p͞¢ho{vǶ˷պƸġװдòȬҮͨȺȹwnthZ_\k~vv{zikIVRn}ziNH\tĽǿ÷ɵqpmzvUU_{kgk]kwxwz`j|uRBRRotjmRsUktChwhQwǺ]V]IWeRUkbMVVTWRT`OXSWvhFBNM_Y>G>09CFERo7,9Lx}[TJRQVv]viizH^ztqD\~dopBYhGY]ndQpeHuyP{Vdh]Tmgsz]SUgEENZa\BFH7>P@EF>HMQVVSPQX[VUYTIIIHHIGEA5;MK83CTWSLC;?DDEE?ADDCCFHILLIKONHHMTVSQTVTSRSUUZ^YebY{fQ;Hyzcqomd^WMC89^_5=NVXURXcjntf]tnjoeQDMQTD648ISGFOKAABE[l`DBZmplU9JTLIJKMKE@@CFHJJJJHHHJD83@clXG@>72A[_UMCDPSU[]__^f͏_D4JQ:12Mfbr}xnkM`q^[ckhftePY^c_W\ovnhb^VCAEEOYYI94<@VcD:;8746999;<>=<989<=<:9:;9999::89>DC=>ECB@?IKGJOJ@<;>ADHHFA>BCBBDDCCDD=APtZ^a~Ucr|wԠ]a_KILNMC=9GUUSYSFBTcRU輙̍DPPORRNNMEBB=Q辍uWM|qd{wljP<IH>8998754679;77873AQPG>>^ʁV^hmkqӻ}\ǭtmddƥmzo_W`ԍyYDLJDHJLOOMPSoWKAEMRQH5087>Sgģ|Y;:=?@@ACDCDBA@BA96>B?;;GLE>;:9:::;;<<;<9>N3;0W߻hbjrb_^ƩsXKHGF>25:<6@YPPү];PqxYVYXRKIWjoqqd_alSCQUUTUSRWac]`fd`dgbXQQai]XFD@?@@ABBBBA@@@?@AACEFFFGFEDCDEGGHIIJIIHHHFGIIJKLMNXbbbcdeedcca`]ZV[ciknonnj`^``bddfghiikkjigda_``aWHDFEDPgohfouuuttvvvvwxvrrgUJHKJJJIIHGFDCAA@@?@@AA@>>DHGDDIPY[[\\\[\[ZYVSRRRPNLKJHGGGFGFFFGGGGFFFGGEHTbhggijjjlmmoonnnmmkcaffcJ;KXYLINKLMCYt^LUZWPMR[^^\WTUYW|ym[gj\lroZX[`fcXUOP]isigrxy|u[OIHR][Y[]\Z^b\VX]e_Tcl_Y\fuoUFMQNMGMG:545565555555555555555444444444444445656;JQPMLKC63777777667997898779IQHad:582BU<<:8@CBA?@CA>=:9?U[@?GGD@>CIIFINPC@AJPPME=AFIJHHTVHBFQXYZ][WSJDGD@BDECIWNEFEEGKLMRa}ǺɼijǾouɻ~icqjǝŸ̡»ɩǯۿȷǩɰĿʿڿ˩ƷĢssx]bcTkut[`cvWSdqnrnTMIMW_üϾzm|zNZpyrmf[tv{^zvwvBLFg}y\}j^gRzOjuh[n¾^OXHU\LU`KOWTVPSe]T\JdX>GSkoNF2@CB:?82$/4:3FOADH<>F;?M\w97OLdpYSDF;X\\zeyqZ`x͘vdzcXs|}iIwOR]`eb]\bbTh]bpaTOfekuSQfU?AQRaT>NB/BRALPRSSSSPU[\\\TRUQNLNHKHLFDGF:8FOC9FV]\UJBCHFBB?:<>@ACFHKMNJJLKFHPRRTWVTTRSX\YZ`bc[OcWK@Hqxdt^TUZZMIHGGJB7LztA8S^]Z\cimnnyi`qzoaP;,8HLFDBJebLD@>HLCFZpeGDZswH+ASPMSWQI?8W][\eljkno{igoXSYs}phha^ZM\fJDJU_F9;?cb:58H@9=><<<===>@@=;<;;=>==<<<=>=9788;ADCGOSI??DC@ADCA@?<=??@@?>>???BCDFJMJKxvq`{]Zgbcxy̰qKmk?BDGJA;=DHGMXLA?S=@FMRQJLPD;@A?KK?i߬{bt}kdvxwG9::;;8;>:6AOK@;99999;<<<==>@5cӣN6761A̯U`u~hXNx͚`VQOLHB858;9AOTQWp[:`99D@<=ALctuwo[`v}xYJRXXVVQLUchgdefijlngYSbhYTGD>?CBDEEEFDCBBA?@BCCDDEEEEDDDEFGGHGHGGGGGIJIHIIJO\db`abdddccc`_][X[bgggiosk_[\^`bbdffhjjjhhhc`^^__VLIGCK\`Y\grtsprvvuvuvvttnkfPJKLJJJJIHGDCB@?>=>?@@@??@A@AGMQY\\]^^]]][YYWVUSPNLKJHGGGFFFFFFGGHGGEFECLZb_]bhiijklnnoonnmnnecgdgcGKiZBJOGFEOR]jdff[W_]\_]\]\X[]`iw|nxgXQXZZYLMUPX^t~vlqcYPNTUWVTVWY\XSRPUgs{ymja_hbJ>MYRS]fUDGReVEHOXPHHT]Z[\TJNVZ_]]bm{r_`ddgihiehqtpg]V_jlqd:9:;;;;;<77cnV\ejGBLSY]]ZUOHCA<545555555555555545554444444444444445557:=<989>HA32777777678789;:974Hg_RlQ462WT7>GQG;;@HLF><;:QPaL?O:/LL:E:LOSSSTUTOUZW\\VY^VOPORMFHDII@:CMHAM^`ZXQFIPH?@B=:99:=ADHLMMPONHEKSPS\\VUVVU[b]Y_da``RJK@Fgtcj]MPUVNIHGHJ:=jY=Ncgaaipqsutzm`blZ=<=2FYQIV\WRKC76ARH=I]pcEG]urD7@SUS[daS>28HNLKNPPKINUP68Rli`RGH?6AS[[ZW[^]\[\___ñ緜i*1;<46;;Jh{âߠ8GJSdmZIYmVSku}nUfd^cbefdljE>TghD:9KmH/XuO;CCABAAACGHE=9;<<>@@?>;;<=<9999:?EHLQPKGHIF@=?ABDF@:;=@?><9:;=ABDEEGH_קyfF\ez{yxy}q{ǘlkg@LEFF??ADCFSXN?@;cȬs=?DLPOKLNH>=<;GDN~~̆΄qѝwcZjq^KE957887>JOB:=><9999635679988:;:977555333579=??@A@96:<;;=<>@@AGKNMG=KuvxүTED:;>FQP@9><:?aʸmA=207;=>?75AB8AEDCCDEEC?:8847HND<98878::<<<>??C;[өj8=A=8771g͠vUhqi[YQWlLTYRKJG=78=ABELLKBC@=CAHHJZnwy|jOknhRJV[XVTNGNbtuiehkjl_PTTWZTRIF@@CEEEFGGGFFDCAAAABBBBCDDDDDEFGGHHEEFGGIIHHHIHKQUTV]_aefdcca__][Y[^b_UUfrhYUX\^`bbbdfhjjiihc^\][[VMHFHLIGSfqpljknsuvvvuuusmccZMLLKKKKKIGDBA@><<=??@>>?>?@BEHOX\[^___]][Z[ZYYWTPNLJHGGFFFFFFGGHHHIHFBAFKLOX`fiikkmmnnnnnmmnjegificjqYSa]`dNONK[tsc__nohaY[__Z]bccvk[clYV\VTPKQc|uinlbnhYW[`^[YX\^^[ZQOgzvqql^ZZXK=?NKRihVRQXo^MakrhTJ^ne`\QIJSVY^a`]gq`\jjddfdb`bhmqph_bmqtl:7::::;;;4Ere_`gYFJMX[^][UQJDB<5455555555555454444444444444444444444566433445BJB72477776678971BZVFJ[^Qji@57_;BSRD=:=GNJ?:;:BSel\FDRRJGJIBMfcVPEFLMLGBBA?Na^PISUOMORY`XLKXcVDGOLEDFHHHKJHFKLRt̷˻ƛǠvzfklgh©ɿº³ȻαôŨڼ½˵¶ɻؽɥȸͭztjdRM_\rrhhx}_UVytjrXZYMf_uȸ}~pRGiuotiZkpr~{abpNUR|qixv]d]do{ev[RXHJKLRSKM^`JLT[ZZIKOLLQJSPMgLFOO]ECK5:PA9C@YKPQRTVNKUTS[[\`\RQRVUJIJKJD?@IJFPbbXSRKITT?;BFE=7689<@EIJNSSMGHMOPS\]\][YY\dc`a^]\ZURRJA>?BA=>EKIC>>=<===?@>;89:::999;?FKMJIPSPNJA?CGFGLH?<>AA=:88:EDCFLLLWgtrlκdBCFJMMLKMLA:9AMDcr;fߩvƌtrR`my}|wiWC879:@HDHMG?;;;:546789999:;<;:;975346779;<=:65578:;;989;<=<:89@GIIIF?aãi|ü~rcW[46AFJD?Pij]^zZMECCB@>;987579;;;=???@@BIfqKBFDC<899;KZHMmBmd\dssnWPU\_TUVXSEBD=79=@EJNOIUʩF@BBDFM[mxvrcQrse_EKYYTUSLCDbqmjfcdUDGOOMQTFFA@CDEEFGGGGIHEDBAABBAACDEEEEEFFFGFDDFGGHHHHJIIIHHLY__agfdbab`^[ZWYYYTKGSefYSVZ]^``_`dhkihhgd^ZZYYTMGEHE>Kesodelhbivwvvuuwsf_WQNNLKLMMLJHDB@@>===>?>==>>??@BHQVX[_`_^_][[[[[ZZXTOMJHFEFFFGGGGGGHIKLKFCCBDM]efhhjklmnnmmnmilnliiggimb`nlgvrSZgbnxihw|xh_Z_^]^cjs`m}q~}o`ks~kctdXTQWdoVP]jkb[YUSYc\LThnkn]LZkkde`TU^]J9>LLQXRKM]ism]amuvl\[]XVUSQU\TQUX[^b`[ew{sklog]`npmmohWO]tl97:989:;78_ubecfJJKPY\]\YTRMFA;43445555555544444444444444444444444444454455547@GE:33576655647?Tqt_HIH=YpS80_̢BGSKDB@@AEGC<:;JZhrYAKSSOJJJ?EbilWGINLKGCB@=EW_WNUZUQPR[f[IN]cTDIMKIGECNYYVKLL\a̵˻~~|~fhlnȳľźŽż¼¢ӭƽش˯ƶȯ޺ӹɩɺ̱v}miTNY`c|}clmVOOpzlpdTaKggvƺŶzw}HIymhmfcvcxwyzw_SkTQnws{yngZUzg~ewYQTEGEM[PFQdUCPtjkT>GOQTRHSFYg[?:=57>9<=5.-A1?MbYBQ\Z_ura^][TZV^e^av{qb\[t~vYakkAI[R[SOhX}rflYsHGPIu}VygMWP_ciPPVPD2@GNW@EG5>L6:?N]HMPQROFHOOWY[`YQPUX]QJQOOJHIJKKR__UQPKJV[J;@DJJ:45666:?BDHKOLIKMLNRX\_a^]^^fkif`\[ZYWXZTPphof]HDMZSMMD4-Akz]O_njfpvuuvyzzr_RND861-0>RUI6,0.77>>;@@>=;899988:>EJJD;D]cOFA@FLKJNLB<<=;;::9:=@C?:=No}|yzyzܫR`i|~zy|~~v|Ӎف6Qn_@@BB?ACJmĿʞDBIIJKJMLB9;EHA[yT0>ȵefvvN\foxmK?ABCJORQG<::9646:;97899;=>>@A<85356779:::<>@A==>>>>?BCFKF?@@@<::BMH:8:::;;;EKMJGEABECLK:<=ICA?=?>>ADEG>EjK,17@?9::=>FIHGFDBEFGB96:865589;<<=>>>@CEGGEBFOTQJE;8:AKMLH1-5.>b^OWUYWYZY\\ZZZRA9<;8:=DLU_^Xp\>CEB?GRVizmge[Yio_QMRVVUWVPNWj|wY=?DFIIKCC@?BDEFFGGGGIHFCB@AAAAABCEEEEEFFEEDCCEGGHHHIKJJIHGO\_]bifa_ac`^[YVVSOMKHJT\YTUY\]]]]_cikiggfc_ZXYZVNGEFDEThmdahhYYmxwvuuttqfYLLMLLLLMMMKIEA@@?>===>>==>>???AJOQUY_a^]]\\\]]^]]ZUPMIHFEGGGGGGGGGGIKMNKIIFIWcgb_ahlklmmmlmmjknmjihhhjUTd]W]mxccz}zwZU{]^\Y[]^c|us}j\_wxs^WQ[eonijgyqhdcTBHRKAC]plib_llfcaYN\l`NGC@CJHGJDJaihecdglig_SVZYZapyiZOXagmihn|zmlpg\bqtvqukDHr|[97:989:93Kul`ck[AJMRY[\[YTSPIA:434455555554444444444444444444444444444444444465:GQJ:7:86523;Ss~qlbOLE/=hd@0nּPFRLJJHD?=AA=;=GQ]j_Z\VOONLIBD]ijODFGIIKF@@>>HSTMNTSSX[`iePP\^OEFIJGFGOX]]XNVen˾̴ŷvm\hq~ž®ƿɸ¿ÿĻõͿͱű¤ԯɬ̮ijʝ}ܸӵλȰɾɴnopqZYffYddXQQi{onjWeXli˾xwyuLXROYJS:O^WE9A;6864=E.;ME>MFWgmb[OROWTU^[XSUaWF^t]GZfk}~qXNjth|]54HM[JIsX_~s\aeFCBH~{mir_QMF`ceKPMX7/BDQR;KH8>B4:BbUJMOSRD@MNMQT\THOWW^XNQWTLOUTSPQYZSPNMJQaX??DFOH3244445:<>ACEGILLLNRUX\]\_`_fkkgd``^][X[]Xholwh^G6207@IF723034Ot}ub>07G_lfG>NPNouRHtR@DC:61:QRNPRWSHMMHLlzj\b\TJNXWMGHKKFCSkgMqpcs}ac{qbaqV=92*:RWf_GIIJIJPV_XWw`ESris^fph|vRW`V\dm{lSzzW>8149?SRD<416:>EE@=@AAA>;9999877=JJFIGA=<=::::99;>B@>Pl|{xwvuy紖XKTozusrru{~|}~|xrhvѝʣeoGLEBCAA?>?@ADGLRQOK@78=ES\M8;ACB?;>ECHU[VOLIE@CILHFD=K̴k@=:869=:::55@D>67;:97679:<=<<>>>>?CB?;>FNLHEA==AINPQE63243-@RPZ]mdM[Z[_[[ZXO?9::8=HU_ippk_E[sELIIGMQRethdaUMKUYXY[UU]YXhtŠiBHURPAA??BCDFGFGFGGFECB@AAAAAACEEEFFFFDCCBBDGGHIHJKKKIHGPZ]^eje_]adb_[YUUPJHLKIJNRSUXYZ[[^adijgggea\XVY\UKFEEDFP]cbecWWhvxvvuvtnhf`RKJKLMMNNMMJEA?@??====>=>>????@AFNZ_`__]\\\]__``_\WRNLIEFHJIHHGFFGGHIHHJOPJP]^[[]aimlklmnmmmnmjkmkihjgdZE?AS_fcU[lhXGQ~of`VVV[\dwpltrpea~kfe{h^rww~obhv`Q]P=ACIVUUZaglnd^XZs|hdhXEHTJEE?ALSW\ebeiik_MRUPP_qysd[bdbacjotwsppme`enxxuxqU_X98:989:48gwaaemH=LPTZZ[[XTTTMA94355554444444444444444444444444444444444444444567G^dUF=4264?ci^][XP81LiRAbHVTNLLKE@>A>;?FLVda``_[TOMKEDSehisqdWSOIDJMJNSRLHMSVY_dflgYTTJEFHJGEKT\[WYO^~˸ȳƨvĕ}_a{t÷Ⱥ»üȥ­º˦ͬҾIJɭDZ˭üvү۵ӱ̻;ǼĴezlrSZN^y^^c^VSfrmyn^`gt}ɸ{g\Va{qzvppzg=bomWrklqWojp{zjav_]nrx}t^toHN_Vo`zaNMEMVTKJSaWJH:=759RjJLNPPN@DVRMLXVEJYWWYMPWXUO[]XZVSTRQLKMO[]G;CAFSG10000014578:;>EMNOQSTVVVZbb`flkifefec\YYWZ^zesyi_VUP]O:323?cul`iwbN]mmmnlljhcWD6--@QblN003545Bdvwq]=05FblbF=HQScuvum[9=74342;l}lcRJTMZkj[ktdeZW\`dgdN@GFA?RmgKۮ|wn^P[b\VKPpf9362?OOQvdJPONMMNW]aY_auFJb^Zbgccw{`NQbrsgXje~WUU?25AgtP80/2549@@@DCA@><9:99865:?BFGA5/KO86=6=DC?>====<;:8887:ABF^wyskirmezۻXPlyokjnoqoq{~phpzȐ{±aPRGLHD@`kVyp(6=GMJKHDDCEAJj{[][\ouqj`I=FJJKJD@BB??=99;8:A?96676:<=?@@=60/2344556555DOG@;8CTgmilwl]YYXYYXVXTGCDEDC?GLFEEFGGGFFFHFVoI7:@A@>;76789::68?@934;:?=<>><;;=ADHKKOQD76459<:;Pppe^XRMS[_[]\XH>::;9DVhqvwypeVؐOOURRONLTlo__fTIU_]^bYPY^^uܝRK^^A@>>ABDFGFFFFFEECA@AAAAAACEFFFFFEDBBBCEGHHIIKLKKJHHLTZ]]`eb`bdcdaYVTPLIKKIIJMPRVWWY[_ceggggggc[YXZ^VIDFFDDKV\[VU]lutswxwwupb\_ZPKLLNNNOOOLGB@?>>=====>=???>>>=?P^a__\ZZ\]]_aaa_^[VQNJFHIJJIHGHGGGGGECEJLKMSQOW]cjljkmnmlmnomijklijkgjdO;G\cbb`b^`ju{`wsrkTES\S_`TYfsxpt`\s~|wzoz~iZfwyuyiUNLRZYXWRZiphZVbs|rTEGGCKGHOSRU_ddcaei\Y]RO^aaigd_\SQU]chhhnomifjuzwtpmkk_og;8:88:93SzeWcpa6=IQWYYZZYUSSMB9344454444444444444444444444444444444444444444458FWbimhT>115Mvnf]]\UI;/1W^KhLa^UQPNKGB@><<@JSXZXX^aWPNIEBMbo_PKGQXXTUSMEIPV\_cdalcLFGGHHGFFIUVXT[Tbþɸġļһs{è~}xhнɦıȿżȯɯǣϵʱΩ̽ͳ|fxڶӰʷŰ˿Ľĵii[[UOepq_ga`WZid|fUf{ƱqKLtofertplm]McngTulffS{|dr{riodyrfdYow{qsTqqCKWO`]{cNKFPUNLO_cE8IWQQ>OXTRJIRKMP[]MV`O27NO02+-0LRO:<@;M:TH=V]lsdPCBWlttqoy^bzʞm{m|hx}{WIJL7@U_tqEOQItGnrzbxp{rzQIHyyK?EX?(44BQ>AGK<:77EbTKKNOTJ=P[NLRXHGUZSRNKWYUR[a[]^VRTXSNKOX\L=CC?HSF310.-,-/23467:BJLOQSSTSQXbb`fkkhghjkh`[YTWZ^onlkb]_W]J3:D:Plqjju}nL[goi`dga`^D1/0>csspQ556516VpqrlZ<05Ecm^B;GRUYfwi95B954430^z]VPc||v]]mt{rK9ACB;EhaJ½wlbVLR\IFMk^97JIDN`|hNUTRNMT^a`\PRoTo\[^YTkyu{nzjCFVa^Z[cx|}vmF<9=WaQ=612323;??BDB>=;:9987669@FGHDB9;99;?>>?<988:@BAIaz{jamr˻Ye}~tknkmmmor|vwļ{afQVVNQSQOevnnsҘY46DJIKJIA>JZQEGEBY^CZSgVPiuvPPOS\bd\K@>>=@AAB>?AAB>9:;8:>:776336678:<;500123334543359:9?DDDDDMXURJDMPLE?@KONFGUZTRWWSZeb`]UQPPNI@=HSSQOU_Y¼ӽaGDHRZYMGMKIILSPIIINKBF\feb_\UJCDRhxtuylabcabcbabYIFEDDCCILGGHHJJJHIJHMm]8::?@?@>:6667898:?=614<:6;@BBBCCCD@<@IGA@<:<=><:;>><<>>;8;@HMQPPNKGECEHJIHHHA866676>[~web_xOMZ^Z[ZPC><<@EKamtww{toúzBCMPQQOMKUfdZhuse_`e]RYZkĺGBV@?<=@BDFFFFFFFEDBA?AAAAAACEFFFFFEDCCCCFHHIJKLMLLKIGHOUSQ]gecacdfd]WSPNLJJJKKKLOSVWY^bbcfgggihc\XY[_ZNHFFEDIRPJPaotohnzyvvvtgXVUSPPNNNPQQQPKF@=;<<===>>>????>>:GWZSSVUXYZ]_`abca`]YSPLIIIJLJIIIHGGFECAACDFIIIIQ]gmiflqqgfnomlkklmkkligjfPJR^aaedOB~luxxsmgdj^@CPNQW`l|mSftnxt{}}|{qn}ymiaforlbSHOgsh[ZUSZgoyzcMIEGXVQYWTUWXY[Y[gicb^`kijmeb`]YY]_cc_[Z[almmz~rpeTUXRfxmg=6:99:2AruWZgrH2>FTXYYZZYWSQLD:335444444444444444444444444444444444444344444559M^mv~iP=/Tyfeda[PA973+9GhoUeb_YQKJIFB>::;BHNVTRSVWRLF@=J]rsSONJOU[ZXTKFGNTZ]^`T[hMAGLJFDEFFIOVT_biȿѽÿŢy}ƣƈvmğĹļ͵}xrʼ¼ǵµųϫ¼гѸ٨ʷּȿõ̰ȴƨtauںҬîʼȶ¸|\jvi^g`bmzirhh_Uae|pSV÷yjƴs_YTQc{xmkb[gk]Rl\Y[~|p_}~juagwps^lNtv]~ssKbr?GQFU_hdNIENKOV^gL9EPLAARWWKKGHPKYTbVKJJ;>NE49:/3Bdv]K9L:CD]>GcXYrm~rofkamrW[Y[xppoO]oKFHL2@]cPZeXSY:pN\pf_||“rQEZd@=HU/.47FI;AJP=::=V]DPIOJ\@C\YOMRHDQWSOKHTZXQS_[[fYUX]]VVRVULAAG?CKOD9610.,+-013579?DFJMNOPNMT]_`gkiggjnnjb][WWVUV_w}odYNK[LK]PD]pjluzygUfuo[UfdK;6,3FSYe]IA;7553,8YhejdV@15Cdm\>;FNTUWZUF;=B>42461GcWlz~ijxx_QL?<=<<4;^[K˲wwza`FFOVG9EKQMLhp^YUTQMMW]][Sb}td^\ZZdtpyTcoL;>BOX\_nw[PG:::;?EF:3469;;9;AA=<<;:655568;<=?@ADHUanoifTDNRLHDCAAB@;::=>?:5?]ssieռ\rwd`jloooqw~ĿgSHfµ߄LXWZTPT]svlVђ\IJKIOTMGNc]FDB=Oy{fTYupdVHACVdSacSCBEA>;9;;?AC@9543578:;>?728@A=?@@@ACDCB>=EEA?>94=BA>?><;;<=><9n|`]igq˓HYaZZTE@??BIRT^dnuy{sv>@FLMJHLOMOLIV`WR\ceho{gcpiK`?=;;?BDFFFFFFFDCA@?ABBBAACEGGGGGEDDDDDHJIJLMNONMLJHHKLMWdgc^^fihd^ZTPNLJIIIKMMNQUWZ_`_`ehgghhe^VUZ_]TKFEEDFFCObkoibhswvutvqoaRQPOOOPOQRRRRPLE><=<==>>>>????>>CGJJHFJRWXY^aabdfcb`\WSNIIJKLLJJJHGGFEDDCBBCGMNJObomdfqvn^ammkmmmmmnmmkghjaTWkjb_POQlvUOWkqjh]A@ICP`kQRk^Z^vwn|nj|tltdTX_mtnqqdTSfpcXXUWbefqzjQOFRgdah_YZXVZ`_ZTWWZittrzwhd^ZY`fhkaQMPTYbjmrndb[QTXW`smd=5;9:46^zcS^ja67ANYYYYYYYYSNLG;235444444444444444444444444444444444444344445668?Sq~}ucKARZZ`c_SA54664/4zRQTSK@<@EDB?<@IKHMQONSURNLJFABJa{aY\SNNOSVRLIEHT__\Y^\Xd_NCMOEBDEHGIUWj}}һŶqȦŐxc·˸˷wvn½ùνʺ³ĿĻŽ̹ɵʿ׾þdzֺѷuaöپиϻʲ¨uSqt~]kl\htqv|fe]_px~yMròpʹ]SSLKM[}rljgjjTTdVVe^f~i^sVo{zv{gdypRhuVqmqQTuLDPAN`xZfOFEBATmkLCOX__^gXQTG3GI9%5RM441=OAA=[M2>?F]MHMJPOTBS_SQMDAMWVKIKRZXVQX[VabT[_^_]VSRMD@HC@DFIJLKLPVY^egeehimkgcb_][XWTVgzqUPPKY\glKIgohmx~zrld`YTavf:(.NOFCF8EPLQ]`bmrdYRUYVJESbc[YrvoxjUTZay|kA8;3012469;;;=@Wyzup`[qn_YVH;=B@99;;;99=DJWe^Qk|^vzxmjligkpsyw|ӥdPEH{`SXR\_QEToqpЂFCDMPOONQLD?<<>?BGGGFC>755776445568:?B?:7664333344344441258@A;40359@CA>=@A?AEFGC?>=AEEB?=<9><;>BDFFFFFFDBAA@?ABBAAACEFGGGFEDDDDFHIHKMNNONNLJHHFIR[_][Zakkjhd_WPNMKHHHIKLLOSVY[]_`bfiiige^TQV\_YMFEEDCCGR\`]\gsrpsrutpkgZJIILPQQQRRRRQQMD>><=>>>>>?????@B@???@JVYVX_aacefeda^YTOKKLMMMMKIHHHGGFFDBBCGOQLUltg_jrpbY`efjoommnnmmligehbdifmgLIvi_Tj~}vfI>ORTVovdWL`aWdb\Ymt\Wdoml~zaW[dcXWbe\[cdaabeaiozzs`GCLenmkgc`aaa]Y_aUSOO`kidmnjh_SU]dmukRLZc`]`ec]]aWU\WFRup>5;:83KsoVU_hH0>IVXYXYYXWWVPLI;1244444444444444444444444444444444444443333456765AOTMGNX]cbUEGVbe`VK=5888.DsTVMG?;;?DECGNNQWTPOMLPRPNPONJFBKoqjz}m\WSRTSNHEDRcfd_Y[dc`fcWSRLGHJLLJS`tѾĻ;zuçpȶյƼutt¤½ľƩƲDzͺ̻̾ǼŲƽҸͺּbĘ·ɮ̷ʺɧ˻ŹpTotterccrrmjda^y|lfÿnҔS67W`UTZhĽrjkidlSaXR]ntWto[XRvz|z{nZlQ]jk~ci^faZlfGUBKS_VdMF@>LiuR:LF8;CQYbgbR=EOZmbZX`^Q<>USP;;L_cslYB9Lp}c]J^_UT_^aag^vwTZZ[^w~hIB6PFGU_DQjVqshcI;FocqcmO_b˒s@YmPRMUK=7BDGKLNPSSV[^`ceeedb_bdb^[\\VU]unHQh`^eseCOjnlnu}hZJNPUav[66CH@4./002233322?MQPOMFEID?BbkY<8DFDHHE?;<=CB625/>u|hajik|opZ95887605;:DOZ`VLMTlyw}htokjf]SYlqvgH]vϸ]PHHmï]UOCKa`HFk}wéL;HJFCITKDG=:L\s{ksrZTHd?KKKGEGKKGBAAACGKIDC@;8667776558;=AC@<8876511233444665431248<;LO?4158>bp]WLFIPRXK:>MTTNIJSSROfnQfpDAD@AFLPQOOMKJJJJHHDDGBZi@@R[Y_rnTv{nmligd\WVWWPFELUPMVTMJJJHEEC=\g63;9::;;;5017BJNOMF;=EFB?@BCCCCCFIE?CKE<;;:8=GMJGEB>;;??<=>899;=@BBA?=?EILNQRQH<8/9ozC:FLIUojvZO[TFIJIMLHFJZfs}|x{i9LKIJKQTTRRWZSKGGKBPķƎhjnl==<;=@DEFFFFDB@????@A@AABCCDEFFFDCDDEGGGIMOOOOOOMKIECIPTWWZaggikljb[VPMKIHHHHIKMQUWX[___dghihb\TPPXa_QFEFCADHJMNP]oohosrqqmb]ZJDDMPQRRSRRQQRRJ?;<<=>>>>>>>>?@=>>?@DQWTQXa_]befffd`[UQNMNNOOONKJJJIIHFECBCFNROYljYZdc\TV`_ajnommmmmmlljihjjUUf]GPltxib^bZGSuaA^aLbpnql_W_bdbgg_Zn~pcg{o`YW]du~yk_`a[XY[bgotkedgpicl|jXOFC[fgh[TX[[\WKF]mbTJOWZc`^bgebadedqxnZU_eiib]]ahe[[\KTWlwp@4<84DIIFCRaVDQcRFIKNSSOPLIFKTPO\dovvg]ZTOTSJDDEP__[YVSU\`ZevpYOMOONMMN_ȿ˾—y}˔ƸԻڱ~m½ɾĺ¼ƾ°´ѼϿϳվɹijճ˾µmɒϪ¬ʺȠĻŸr[`r~~lmZvmfwcW]v{rw̡M:=?giVS]csĪmhji_jOnRTiy~a\zniEQqwzxv[nJL^gklq^WeganRYEDGQRqcNE?B[oX4NR66@JS_gxrbEET_\IGUcW;:ZaMMOdbZY`GFUF_thNVFU^XBMXY]cYRf^K:Lgzho{hLIoXhOIVDVaff[{B>k}YvX[xoů_Bq\fieSMBARA=D;TZ,:KJTKFPCKYOKYQSNMBBTc_F?LTQKUTPRSW\Y^\\]SIN[[ONOHHOKFJONNMB4,00+++-01259=?BGJKMOQRRUZ_ccbbb`_aed_Z\a^TUceYZtq`nub8Vjmqqx|fJAJYXB@TOGF@5..1212223331=<>EGaiY<6?AAHJF@;9:=:43648Y~ynijelŔwhVb{N6;989507>:773BXmjicebXTZi`PWPAAEFHJLLKJWymq~gXQQRWY\\\jwaqmU`v{E8JXXbuqdUNJHHHIE:6;==97=EB943468;<;;;:<>CFF>77=A<;=:Vzqj޽wdOHurH?ABA=DZcef_VP]wifwva`XOzr|~WAOW_\jůpYVOUXJFABNZQIsճxr~ow~bH=CILHAGD=;>?<747<=;658:;<>>;:9::710100234444356544324=GJJJI?=>8>CB=981/Hkp_Z\VPOQVYL>>?@>75CSRSUYq}lK?CBHo\@EHILOOOQQRPIIMMKKJDCE?QvbSi}up|roslgigaZRGEFHMQNOSTK>;@@>>8GlJ.79999876206DMPRRRL@<>=8557@HIGDFJFDJMB98765>KNJGDBB>;>@<<=:;===>>?CEAAIMNNMLGA>5>>>?????>>>>?DMRPKKV]XXaffghgd]WSNOPPRSTQKKKLKKHFFECEFJSUW`XKLQOLKR\_`fmnmmmmnonnlmihi[PPPJ_oXTTKXWILLQgt|vv}mrrpmcneWZl|rgdun\dumhrmcgqtxexyjc^Y\ilhjt{tl]Y]^\eeXLIMITX^^QORSNGHJO_oeRL_rsthcghikjgdcll^Y\\^bdb^dpria\Yb{uuzs@3;55Nmj[V]fM26Laffa\YZVRSTQLE9344444444444444444444444444444444433433333333455666677753235A^kfgdVK@:?:304KꚄ}ZC=>?CFFCBQ`SCZvcMGFOYTKIGE@F\bY^gp`WY^^SNTPDBGGIPPQPRIDScULeudQPTTRUV\eź̞|vϊǹà̿}ƷDzа˫ȻķǸǼճѸwȐſ̧ƸЮ«Ƹ{c`wwjdtmgxzgRfnuugEDDEieRP^deμjgjnb\OzsQ_tf]bzyo~rCOlpk|flXDP]fkufS`j_h_]<6?RDmeODAEWY7@]C2?GJR_[m`WFL\^A3G_T95EUN::6554433@Vdkieae{ݢsO_=49768615<848>9634777:<<<>@BCDB@87=AB=CRgx`l{wmOY}DBCA@@FY_ZZZYYYZ]`wkYOsǘpa}vxH?LR[`ý̺{skdjvtXOIHEFPSNq]e{ycvf?=977::89:768:;7423321245331586445666;@@@?<=?535679=;57?FKPRUVXWYSB7899519KSZZVVYUJDML=?RWKJKGLQMLNQPSTMKNPONLIEBBCXtwy~rVTrnjonfZP@9BLPPUZ_[G21::956^c567899875422=MPQPPPNE;8679:61247@IJIIHC>=<@B@@ABBCB@@@@EGCCJNQOKF@>75dxRCJOPVWKZ~߆FPSQPMLMMMXkxnUPPS?j@GECEHOUTTYYVTSLPs~ɬtw}x޾Φ{w{99:99=BEGGFDA?>===>@@@@?AAACEFFFEEDDDEFIKNPOPQRSQRSSQRQRTZcgfglpla[SLKHEGJKGEDFJNQSW[^`dgihb^]ZUONLJHCAA>@BBABCFTdgimswug]^`TEEEDEEGKPTTSSRRSRND=><<>>>?????????@HOKEBEPOMW_bfghhdaZTPQRSTWYWNKLMMMKIHGGGGGOWWVTNDCEGIOZc^[hommnmopponpmgjnYHYdig`^^\a]MLPXhlg[Peyy~nhigbcg^Xiujql^i~~sig}jW\glj_Z^`Z]YRTchcW^eUPLGQWURQRUI?PdkiqmcYWiolfdcbfeb^Y_ki][Z^miaa`dmneZY]bf]c}?484?bn_Y[d^A4=Thjigb\YVQNMLJD8344444444444444444444444444433333333333333344444567799998777:@DNa_K>65:813-)qVYCDID>;=ADBENJO{gQH>KWSJJIGAH[gb[Z^UNV\XTTTNFGKJHKOSSPNIT^TGLSTQMMS\drӭ~oĚײɦʭ˿̸ƽ͹˹ĺɸšŹvŨͭϡ˱ʽkiwrdeoyogjrmbhs»mČOFC?AcaRO]ebe˴ofjncJ[jRjy_dd{oupMOs`lrvXoQKQYioaU]`add[3-=RBJwUOWC[dyxdc]DM`^aWR`s}thfWRO571tPFWOdLxti`mR}xix=LRJhFCMHZk27S_OKDPDCVIU]K^TKHIN`c?AOOMP]VJKNNSXXW[XLHOPJGGEGQP?CTUTUIDC:373))**-//26;?BCEFHMSWXWX[]cjnnkhjid`[VSTUTRUftfliQ?]gryfI8117DD6:HI>2135633201101224Od^SLA945847C`iW8046=EIID@=5126531Pidbjlc_vxrG23;=@;545569CDBA<:<<;?BBCCSzVntdhpLUIHE@BNSOQWWWVX^Z͊uf[M_vZiկsrLS^\Yo}v{kfXPNOPNL^xgm{ȩjrz}{nJEHKKJBEVSFJOVhv|ujmq}sjq~svzvprD;B@ABDJLA743;EBLdeB=78?@=<::<==;964256565676644454212544225:898558;;;532147777412;<@OVaaa`LDJKE;:ERX\XV[\PMPQQMKJJLQSLEDEGLJHOWWTTTSQOLF?A@98N~jehr69gvvsmcZTA5BGCM]cpmP;9=;62HeG8>9;=:575766>KOQQRQKB>;:@FIHGGIJIFEFE=9:4018@CFGKPL>AGLQNKE>;5VvUBNNOQSRFVyBPNMLPROJUlqYDDGKFAr\DIEHRQJJT[YUTRQTe}ƻwgcRdui:::::>BFHIFA?=====>?@@@@@@ACDFFFEEDDDDGIKMOQSUTUTRQQPOPQRXaeinprobUOKGBACEFDABEILPSW\`bfhijf^[ZWSRNF=9=><;>>>?@@?@@?@@ADGC@@CEBFOXcjiihfd^VSTUVWY\[SNNNNNONLIHHHGJSUQV]QA@FIMXd\UeponmnoqqpoppmjnfNXpmbdpgae\LOZemmh[MOY_ZS[]cgPNj}ujbiy~ZYsrgYWba^\Y[][_UOU`ldUVUONTQcaSSPOTTUbptrolmbTZaehc\_b\ZYWamkfdZ\qvmba_fqiUY][WTS=168PmhZ[ciN86C\jjhgc]YVRNIGF@74444444444444444444444444333333333333333334444444555556666876736EQRF;76655->\\PMZabFɯ}kcfhGPueYqp`ic|g{~~lOPz\ntkyhw~gXTK^hZV[U^d_X:5LT>eqaMFCCCBL[?.DLENUNUA>PJXY?=HORC;GLJcsaPHY[dkiV]R:Rhg{w>AmmDJfq_aYACgjmeYtSRj^OIEC_[9;7_@*)0]`yxty_^qfB9LV\j:;3*()(+-./17<>@CDFLSXZYZZ[bkmnmorjcc`YSRQRQT`obbaKB\baV;/366424DKC6.0344322110000121FchTB3126=@>E`iV72978AFJHD?6/04549btnqneXTXOJlssɌ|kbiiUHA>:54:<:BchedxtYKLXVVTTYjyqPFBE@ACCBBJXYfx|~|Wba``cjno~vbbdVma;^bCBq[_ml~xvvbH?DB84239<;ANNF?;==97@GED@=?GE@DGEDPju}~rvո|qsbNBCKSPSZYZ[YlvPWYMJO]SPj~ңikomc]^i\FkvtgqcWPONLMVav}{{ygxdWZ^O=8ETSB@SYR\u~zqrqyjenuuqos}}ye<@KKIE@>;83049B=Afb199@DD??IV\]WNOPOME>AC;9dxXpv>16[stui`TK?>@<@^lrzsTD>=>6;^]>B@C?:<==<::79@GKPTOD<<=?DHKKIIHGGHHHD;67433:BCBEJND;DE8:ABDDFEECBA@BE<9AGGGEDD=5@`_GKNQRRNQ\gjW`hDTQLOPMLKTd_MJNKEFC<@JPV_httgVSVRPSRMWyylspZ_Z^x}f[TZ}mnoW::::;=BFHIGA=<<==>??@@?@@@ACDFFEEEDDDEGHKNRXXUUTSRQPONOPQWahmppqoiZNJD@?@AAA@ADIMPSW\adefilh_ZYWYUOKC;7:<@DB@ACCSjrsuvvxzfRQPJFFEC@?=>==>?CHDDIJG=9=@>??@@@@@???@??>>@A?>@EO_jhgggf^WUVWXXZ]^YROOOPSRPLIJJIJMOOT`[G?BGKS[VR^kmmlmnpqnoqpnlji[[cYGEHRof@8?\vphrp][jmabjfa`TN]lm[Piiciqnw|{vh^o{kVVUU_]T\`WSRSNX[NHGJN_u~ug]SDGR`a\`hic_ffclskb[Z]``[YZkd_b_[_lnefoxwkZUY`inevE+7L`hZY^ia;36D`ligfc`[VROJEC;544444444444444444444444333333333333333334444444444444444456688764;JLA86566*PϜ>@efF<:9BOL@89;PnhTOKBJVVSNKHGLZlp`TPNLKJMICKSSRNJIUebUNJQSW[WUWUVzzT_ɽÿȼ«ĕ¢ŢĦ̹ŹŴȿûɹǩֲҵ˼}xfdtѺƵǺ˦Ɵλ˰yv~qoQd{k^`[ulvvWǀPDHH>=RTMJY\[Gh¶ufdo\MOPY:WNUc\C=MdV78BV^gVLIXTT`shc{APjeV[dA7Lde9<_z}wrtkffheqtxII[PDBAapTP_ff^F3IicyuWǎx`jy'AQ^yXVWZ^e;,HsXFHH:DMKWSJ`c?NGLY\>BMMI[aKGJGILRVUUOIIG=@QR=4:=86Scdu\LQUUYYOHIKFDGGFECCBBFXhaaijeoa`epz~qv{rMPuU5Os^In|`VhvlllgheYJ?;=>?II=7989>@A;8=?99?EECBDJNKBCJB?Vvwʆy|_WKNWWVWZaaYS~klYX_OGmsbVPQRjʿzlmh^URTYZUsVuwI^]TIEIIJVZ_wj|o{p>5AOC2@adTNarjlwtqpqtxre^gceksyzxx}xovr_]q`@6666756989`h9@@BC=78;?A??>AA=85576788886555433344689;?:CQA27<7568865442332337<@?Tmie_SIFHIJIBF[faa`SJNPFAEMRTSE:;>@>;@JY_[OCHOQNB;@@:O̾ML[qD-2:KSSll_F;FNDD_|t]LDA>BBL`QMPZODGEEA@;:975;IRPMD:;?BEGKKJKHDDGHFB:74123:FGEBBB:?OI<;BECDGGGFECAA>7???????ABCEEDDDDCEFGIMRVXWUTSTRPONMNOOWdknpooopeRFEDBAABB@@DHLORW]beefimlaYXXZXQOLG?79GKB<>A@SkrsuwwvxrZJGFFFFB?=<:86558=86>>@@?=>@ENRW`cca\WUWXY[\_a_XQOQSUUQMKJKKJJJLS]^SA7ANLKLMS`jkllnqqnprppnjihicPITQdd>2Hmxo}wnacqq`W`\Qb{{nWRQentxpvik{obmuv|ypenmYSRZ_RV\OJFC=?JJFDDAKbdeb[WNTHIMQT]fc\`faltcXXW[kmf[SVfdb_WWakgfwl\YXYafickvB,Lec]YadjM145Ifkgfca`^XTQKF@8444444444444444444444433333333333333333333444444444444444555568::549??:5459.]у7?WvgJ:8:AHF=469Cb^BDMFHTZUMIHGJS`mgZRNKKIJGAK^]RNJJW_WRONSTZcYTX`aw}WūʷǪ•ŭŵ̥ӷȻ°ɼ˳®öǵȸľ͹ΦٴѾĤi{x~{ή¸ʯέƮlpaYmtl\L`wkZvĪ`EEII@BA'PaMJBD@MK<;IJ;@OSWHKRG^_R@JkoH6G[a\H;C`i_irhotISXTIVkj=C9aa;BLiiOqsRDj^[klQc?EfhY_TXif83[Kjsacȱ~ijG*JXqZkI]SV17geQMK::ILGWOQiVCOGLXM9HKMM\QCIGFHJVWSOPPKBAMWH7DH:/.((/.*(+.039@CGLQQT[___`acdfhgjmle`a^TQPTXYVTZzq=Gb]:*4600FA77;;;;<>?CHMOOMC?<2<@EB9>HFBatT_I<@?====<>>?CGH<667998843566555555658=>68BFC;753211/-/3209Tef^I>DJMK?6B\hcaYGAKOF@DHHFA<;>=<=AELUVMD=@KQJ<:@=99;>:@FIGNLDCFGHHIIGDB@>>??=9741/1?SSE>65=OWRSRWWMGJIIHGEB?97?HKIC968;=>DPQLNKLdubQcgOFRR[fgls_KKPQPQQRRSPOU[bic[bpy_INQOOPRNIc~|`sUWXYZfmndRM^WI9::9:=ADEEFB=;<<==>??????>ABDDCEEEDCEGHJMOPPQRQSTOLMONPQRYejjlmnpqo[LIHFDEECAADHLNQW[^bdeionbYWXYYUTSOJCENTK<9?@QjppsvwvwxeJCBBCCA@><;:75554456;CD=57>?@AA@@@@???>>>??@@>=AB?>FSZXWWVUWZ\]_`bc]URSSVXTNJJLLJJHIR]fcM<:COSPONVdhhggpooqrqpomkileY^g`Z=DRXUOOLLV\b]VYWdNELKPZd_[]cfjdUMKOZdeeecciejfa__cb_hqbYZ[[`iv|z@=fj]Zafk`:158Qkjdfa_``]YTNH@8334444444444444444444333333333333333333333344444444455554555556777758;;64663id3??QYO<6:::;836;:MV?7>??JUULHJHGQ\dhXSROKIJHI_shVNJJQRKNXUSVW[XSQmzs{΢зŔ˪~ļéĺưëŷ͹ýͰ·¼ƺǷ˾ôšyŰ۴ū|ʩƣŨppxrlggf{hIF}ob̃NGEFGA;=BFFVRMLAx¸tinoc^XORRPWTbcnlqldVhol~{ffacfgd]nn_?\[TPTXMGKLJ976#BaQKBECDA9@`cchgbYuqYM@Q\cx?HBU^WP77ciIDglhgCL{gOKKVLJDej=CkH8ud?.XCVHuʈ~ryn›=4Qd|i]L^ORBOm[TNB3BDHKQQahMJLGNLA>DLKPNDFE@DAKYULLWRGITWM;40126303312222222212222/IKVywtb_c@9bgG:AGE;6:@C@86;:CND88;<>:76AKNNOSTRE0=DHD:;Vn]k`FyL3<<;<>>::<@DEA958975851367888888679;;<>@:@Z_LB>C@?HKJ>8533210..03438GUU=2@IIFACKWbe`QB@GJGDEHGB=:<<<=AGKKHA>><=BD>79=7Un\sL+-8=?WX53.DgORpxrrF44479@?12=:43687775546FZO=<=AKRPMPNUVOJKKKJIGFB>;>BB<88;<<<ABCEB=:;<<<=>????>>@BDDCEEEDDEGHIIIJLNMKMNKJNRTVXZ]cfehklorvgTLHGFFGEDEEGHJTXY]]_gjkohXWZY\WWYJCPYQV]F7>ASa[`imtwwxlPB???@@@><;;:8863367;@A<668<@AA@@@@???>>>??A@>>@A==@HMOQPSXZZ\^`bdfcZVSRVYXSIFOOKLJGM_mpaNUelmdVNQ]eecakppnoppooomlfk]\yGBi}{SFMA^|vg`nwyzrtrpmj^YVWS[p~pm}smnb[djiePB@;<9AU__^^TNW_[MVdYWMT\NGO[^_bgkjZYdSHQTV_ilYYyoec^VSUXYSSQQW^cnv~~PPmdZ\cfmN333=Wkkfea____]WRJB94344444444444444444433333333333333333333333344444445555555555555578777>B727;UtH6C>>GJ@99745755<:JQLJJHHS^YZPLRRJIJFV~tSQPJJKJGO\XORW^`[arƫѥѽƞǛ̫wůȽ¹ͻ²ïͼ̸»ôʾϿxõӺ͹nǼǪyɝ[ym|hmr\s|UQxvoFHEDB@99=DFRSJDH_gjob\\Rb_TVKXUZizh_Ytnotzafg[bg]ZYefMA_`PNSRIBKJ>65*=5CRB4DSM@@F4J\LUR_rlZa]TL6CJYjNU`NKVXzsNJLWkk^B`X``0/QyjfvpkiUT^fdRG[KZ\mYGfG7T{~qK5]Qt\@vsקz~7=etqx@]ZZfN^c\TG58BDAOMXebMLLGID?;BLHMFGI>>>AUZVLSULHTZR<8BJB512445:>BEGJSOC?6&*64*',--.47;@IORSVYY\`bdedccehhfba`[TQPPOMLT\T?HZ^D-+7IH82233395154555655545443340;:KH\c=06;GLMKOZc~xbd[acffaUTUJEMKECAEGA@FCBHPTTT`oqkcWJj`PXjjWXokGEPTYcdXD@F@<::87;@=;::;<5/0,-6;<===;:::;>=75;?99JSF:7=?@BB>4244420399665216AD50?HHFBIMKX`TFDFGGECFIKHA==>>?CHMG>9;<<<:867962b9+4452254@`RMPI?>=:ABNVRZc]bmupnwXfcygjy{dmuB664>LQQSRMHIMH=897400245546;<@>87@HG=64;FIGJNOMMTcqnSWVNZnldZOUWKLQLJKTWW\k{h;>LOD;;;<<=>?????@AABCCDEEDEGGHHHIJLLGDGLMORX\\\]^^`acgjlmpk\MFEFFFDDDEEDISRPVY^dc`jl^[]Y[djdSJQWJHTI>?DONHV_druiotZB?>=>?@>=;<;9973255:@B=999<>AAAA@A@????>>@AA?>>?A@@DHNMILV[\]`acegd_ZUSVYZYOIOQMMKFK`osr[YnzumhSM]jjiejrokoqqqoopngqx{hQQouc]]bew|fOPQ:Eznbncd|}v~g_deeywbq|uspnt{{fLJT^_SQE;>>ES[^`^URYZXTUbdahmo_SYcnocadhaemYJORWagcUViqf\[YRSZ`YOQKBJXagedeSWd\X]]gb;143A[lnje`^___]YVNC944444444444444444443333333333333333333333333344444555555555555555677859QP49OJE?=FA>>>@@96899969<>@<89;98BNMJJJILXVOJKPQNKKEa{XALQKIJNQSTWUQUlxv׮˳ĬΗ~ˤuxȝɲͿƱ̯ɹ³˾ҵɛɯyxʙŖ`n~ynfrfh|k¿ϦgHJECB@::=@CKMD@NQ{ƽl`kh^URia]Q\cKGcqt^Wd~pusy\^la\feb_[\]OQ\YSQSM>HKA63,:r{aRJ@A:7:MI8;FG?AA@FZTUUWa^[O_QKDCRK^eZOILGGH<6LIEMKLCB=?QYbUKVSLSUOB5?NPC4'*//269<@CFKMQSLD<61,*+,,-158>DLPRUWUW[^abbccdeecba`_\YUPNMOSRKHOUXNBFPK6079647?63;?B;;@=<>@@?95585;>=:@C@IOVML^gY9AA;6.5>B@:885101;]_XVVUSTaiUz}|o^c^VJ?@LR=2i|rSFFGGEBA@CIHFHKHF`ŲmfuXVY^]YRZxm|}Qx[Pkv|u^_dK?XP;EPLIO[ZE799PjG-515>:8==:9::741599:;=?94312237;<<<=<;?BB>628>@???=879:9:81,.0/.16=FID@<867<>87BGJJFHPOPOD@HJIGCACDDDB=>>?ACHOKD@>=<95456941i_1=;97007=CJQUSNGA<;GRZYTY\`fhorZZſ´ynh_WMFGKLJG;565543334435646>FKQUXQLOUa\PZ\LMkuZTZRU[WKGFJSZan}{RCKEB>>HKMSSOJ^kffr^MTXQQjnYVWXZ`\RQSSRRNLNSTS::99:<=>>?@?=;;:;<=>???@@AAAAABDFFEEGGHIIIIIFACKPRUW[\\\]\[[]_bdeb`daRFEEDEDDEFFCGOKGKQYZVTYff^]Z[hqvjX\U:8?;=>?A@GQY_geVWlfNB@??@A><;<<<;843339BGB89<<=?AAA@A@@@????@AA??@ACB>DILGDNZ\[_acdfhfd`XUVWX[XRPPPNMHI\mptjT\naen_O`|yj`eg_boqrrpnomlow}{yocVUR`^SakhLTYD4BcoujMZdQO[j_ewuypcdzu{nfegbhsrjm~|tZTdi_TWUFDJNT[]]Z]hjd\UZ__^hgd^U_ge^_a`bhePCGRXZZ[^ZVYabZURRbnmaPKC:@P]hieZLTZXW\]jP2652E_oohb_^__^]YWPD944434444444444444443333333333333333333333344444444455555566665555677973JnN.\dB=BLLFA=>D=8BC==;:>AA:89<:8=IKJJJKLJPOMNPPNMII[WILNPLJKQ[[URW^Wvѳĭ̓{|ҳ¿þŵ̯ƿιƹϾʽƱδdzЬȿζʴs}Öv_ffnhl}÷mVgFPB@E@8<><@EB>7;EN=9=><;NMjkPDHY|iZ?LZkNhoRBamƭf~HBaΛv|yE6jZvTSZQYJgaQE65=>BJNMbdVJHMGMO5>TFGOLFAJBNT]^JMZZUSNE9@LVRF;/*--1559=@@AFRYRPMD;;;5/+*.279;;=?7>87MZVC:;8Qw=30G]DEDBB=:9:63Jt|rnfjuric^^eiq|~|wuwz{vå|qw|hVMKLVXM]fNQPSY[^cffghmzu_Z^^TGNO?7?D>;=;79DTd[QP88>@@BJQU[J8Ocd`QONTZa\HOY[VQJFCA?EPTPNMSSQTVV[\YbTG[y_:LMFKQWaj}{Q@JQVZ^YJCJKBC?H_sWShP@_@/5<>@@?:8889977==74;FPYJ?8:<;=@>95:>CEB@>;9999986344.0>JKMMJHGB<;>@::@EJPZVXZUI>AKKHHD><::=>===>@BFQUPFA?@=8778:89T`>9DA>8469<>AGSTRQKHOWTX\WW_elmnpaSIDFX׵ΧŠunsƫlLTOB967777679;=:9=BCBCABOdhb[NL[ZH<=ADGJG@88:;=FHEDDJLHA=;:;CLNMMIHKNONKVf_Q_mZP\THSRGCDIR\hpqtpifjj]ZZVXUUUUVRJCGUYXXX]VSlzwgWQKGHNPRTVXUNJ::9::;<===>=<::9;<=>????@@@BBBBDFFEEFGHJJIIGFHNRQSVWXZ\]^]\Z[[\]\YUV\TGDFFEGFECBCFGGHIKPRPOSZa`]^^cbmpZ]Z<3>;6>A==@DIPVUNJT`WFDBABB@=;<<>>:64329DJD88=<=>@B@@@@@@?@@@@AA@@@@CECBFH?BP][X]adeghggd[YWXXZYXTTSPOKKVgkor`[f_drsOKxo]]ZN\pooqtolijmlf`bknfkgYWT[d`w}poV]WCCOVY__kv[SRPYT\ddukijxntrxwidmuxtnlfcZLNSHHVRQ]^\_glje\TVSPOPONLR`aYYgiaX[X>;FQVVUWbe_\eli^UVowm^F?BCDMTW]bWMRWWZ]ie>2843Gamlf_\\\]\YWVOD:444444444444444444333333333333333344444334444444444455555666656667888844dv9CjO;GT^_YOGBAEJD?CDAAAA=<>>;9;@GJJKQTDFMLMPRPMHU]IJMNKLJKO^baZMbqlƷőǣþżŻìĺzºϻɸƣÝɴm~ָio{nfhfbþy~bHHl@JA>CA9AKHQd`PHIIGVI9MQJMNGANJMPUaLK[_ZSLKA62121/=[SQQMIV[qvzwvlmplhr{utvs]IBGLc|r|{wzvneN;96?EGIHEDCHJHGFCHendqjI:ALOd{}lOQVfux}yaKA;42CQitUBGIB=AJDNvD=lcSFJD8755>;968GOMJMG;;>BCFGCJW:6Q^U^bfmnif]PT]bZPHD@>=>@MUOHLROHMVaeSO@HSXQHNLLTZiV=GNV[^ZHA[]BBEdzc^Y;UuB.7?CCHKKLIA::88<=9=?FO\k[<5<:>FHBBDB>=??AFGGEC>>?>>=@B@98GZ`ZTNLMI@?=>???AHP[jeZWYM=AKLJHE?966<=<:<:9=GTZVNFDFC=;;;<;;A<;===>>:8::;:=BFJLJMVVLP[SUfomrtdQQSL;N׵Ԣɾ}H68=HKQg^AKH=569:;:9:@EFB@BEFFGC=OhgYSOS]XGABCCDEB?;>P^LCIJHGLPQJNis`VbcTXUHCEFAAIT[`^\wɡqxzpjfi`TTcypCEYad`YVUNJ[z|mjfZMJLOQVWWXMF:::;;;;=<;<;;::9:<>>>??>?@@ACBCDEEDDFGHKLLJKQTPOPSWWVX\]^^]ZYYXXWVTPUQGEGDABBBA=?@;;<<>?>95338BJD;79<<>@CB@@@@@@AA@@AA@@@@CIH<:@?>DJJO\deghhhjhc[XXYY[[XWUSPNMQY`gmm^[j^im\crxsc[XOSghhfihkeelnpobZNPUPSQIFU[\u}sfNTn]EJI[ik`VZb[Uasvjb\txszxu|{qmdTFKQWXJEKWbh```ULQZTPUUTUZeomeckjXMOOE=L\ZW[`fc[]oxymZk|gM57FKGEIQUYUOQVWZ^kP35745JbjkeZWVXZXUUTNE:444554444444444333333333333333333444444444444444455455566666656667789:;4;kHOPKNU`oof`SDLGABIIFDB@?CGFB<:;DJHIYT@=FGKPSRNOijOJMLJLNPQ]n|zcʱļǫծɼƼ¡ɻǼ̕šoʹƱ~wŧhvζpupqssc\mú~vbQUK\{wx^L?;<66:-/2066FgbSAM]HQH:czaSWb[G7DZ]XXmca_rlixvrv|o]rudd\WdkzrTBD@ayp^boO"Bb[7Obl``NMfzdwDTKis>MHyY?V`WJ41<<;CJJUbVHHIEI]DBNQOMJCKQLGLYZPY`ZRJNMA@FNNFFNHA7.-./---,,ATJ827@DDIK?,)*/37;CJRVUQRTWXYYY\abb`^^__^\[XTQOPOPQQc``__b_\aUQTV_PLYa_VPUWWYZ[[RECMCNK:E=>JYa`^WN\_^PYb\_YPD:;=71/0..IhSMNHF_bWq|xm`lg]YV^l|oluFMKOc|zv{yrspe_P?Grf_{wmME:9Yj[v[~zbNL?57?DMar«{pv}|sedjonx}pllnspquoy~|yp[^rvgVSZmWINTUQQ[e[IMWYWX\ahgZIEDDD@BFFFGJKJIKC:;CGHHB=JJAEMWWVWakmrlUU[_bVLI@8<<85Ib[H?GMDERdhUA>JRNKMPLKUf~d@@JOJBHE>di?BLjzXWG5Te;/9AGLUXXVJ>:9::===GC702KYWMFDDC?;ADDHIJA@DBAA>@E=>Xijd_ZUSJ==>>>;;EQZchg^SJC=AHKJHEC@<;><68<949JWXVRIFHHC@>><==@??><;===:9755447>ABEGMNRXTUcb`aXJFDMREjμe¦U:GC<72138=DD;36;=>=<>CE@?CFGGKPKHZlcQQQSVPEDHEABCDDDFFDBBBA?ADFEDEB@SlTHTWXY`ζ|~wgPgbUfeYTW[lr]jkd\UPRX[XUWZX::::;;;<<;;;:999:<>>>>>>?@@ABBCDDDEDEGIKLLMNRNLLORVVVY\^_^\ZXWWWWWVSSRKDDIPV\`fg[IBQSMNLLNSSVZ^]ckleI;LPWilPIWYVN<=>@>;6326=EC>849;;@EBAA@@@@@AA@@AAA@@BIKB8>@?HPTRMRrdRMPU[a_Z`iqż–n̹{‘xĤî̸ǽƤϸļ˯kĵzoƠirϾopo}{mRôsncXWPJ49BZB9B<=>?@?97E>LV=vhkcddga]PPPFGIIHGIHSo|dfaWUTYXXX^_XNB?JSLGMNE>22;I\S=GMNRDE?S{mSulPBLhxpZLWjqkdkYZ|i]scekQEGWjOOUhvbT|saF8Jcr\^^D4KLK92^wq[eOWɖo}UdDTZm\AHfxAEYhXC.285:ENVZ[IAHJ?T^DGO[LNDGQOHBLUSUVSQMIRN?;EPJ=AD7<6.4=?69867DRF1(4>AAFKHA:2.2=CGJNUUQQSUXXWWY]^^^^_aa`^\YUQOOORTMM[``ac]\a^\\\^WW_a_YUVY[[\_^UIISOSLDNIIMV_[YUPY^_U]f]]WXH;8:72.-,-QqYWPJVe]Sgl]QFpz[\j|wè~FKFeUe|uy|zztUAAEA<<>ADJLEHkvrqukVV]O>6:?SZaw{zzU?:7@[szpMD]RD]gb^f^GAGSO9T~z}|zK4;;Qkinywtutswtnnqf\o}iehoxq|}sxvnif]anvtdUYp}`OZfXKJWgVGNLTWWWSLIHFDDDGAAPagXLLIGIA7?JKFD@=DHJLJQWPIV[YomPUY[^QGG?9<;74DZUKCBMOPX`aS@>JPLGMPJITfynCADIA7>FE^nN@B`^NR84:951;CHOSQME>97777:===??=;9:=<:;863113?JSYYVJMPOQQOWT[[I@=?NWM^u_tQڥxJDD@?<7557<@A=;>>>>???ABBCDEEEDEGIKLLNNIDGMNQSVXZ\^_]\ZXWWWXXYVRUWUXenpsvwv}va`ULRRMMRRTY\^ahmgSHVXHXr`JVaYVC4:>>97@CBBADDDEDCCDC@?>@@>83259=@A>99;=@FEA@@@???@@@AAAA@AAELMC==<;77:BNQJD@@AB>@KT[NEIH@IUMGJCBNRRPMOiaWSX^dkjekxҼŴ¸ĵnvt~nŸϥ˹ȭ˻ƽոŸͨʡ~ʪzʿs~zn}{™pxqapxeteWVWLD8:7[M6A>>?>><8;DBcH=rlicb_XMPWQY`[VLVOD=CVkd`^VSPQVWS[aZURC8EUQHLMA9A?;>glbYI?>=54:EB.3AVX52GROKDCOpqewdObzlUPHCLckVb[De|poh_o^frsBMm`MEhh`kmXOEJVok7GZ]qMLW]2Xb~xrf?wqXoVBS{yhJAIs\;EirS>:9309JUXUP?=JJ8B>7>40@JHDGCBJGI?,-9<<>CHKLIFDC<99=FPTPQRTVXXXYYY[]_``ab`\WTRRQOOVXHIab^_```_^[Z]]^^][[XSUZZ\_[WOUWW[NMXRPPRSPQTRVYYVae^_ZXCB9674.))*Psa^QKV^QJ^`Q?:Zoտן@>Hsjeformr}sjhgffc\PCBB;3/8AFGNK:Pp|aAOe_JT[`YG=;?HLNMNVSGTVP^UGSWZUC?EA<<<879@EIH714:>ADEEDB=86644337<>=>:87=>>@Lbjhhb_`^SFME78DECDDDB<666448?DIRXWNGCDIKG?;;:863118BA:621301:Tlv{xnaYVTafLPUYRB@ZwmYbquknsef~Y>EKLKLKC:69AEC@@B?;97678@EEEIS\\ZSKOPQQUXWQGGDDDCCCAACCCCDDCGC6=QaZfjEKONPPNMQNFMZZJDCDCAADB=Ujbgyik܈<9@CP̴^Mu|s{{idc[êsX]^`^ahb[ZXWWURQ889989:;;;;;;;:::;=>>>>>>>>@BBCDEEDDEFIKMLLJDBGKMOSWZ[]__]\ZXWWWWY[]]_dfhlopprttuwrk_TSRRQONRY\[[\^ac`a_QQYjnZT`uaB:;=77?CAA@?>ABBCCEFCAAABA;32469>DE@779:BGC?????>?@@AAAAAB@AIPJ?;<;98:47555BLRY[[ZZYXWVTROJC;5455444444443333334333333333333334444445555555555665555666666667888869X^^UH?A>46?GP46HXR4:HKSFCMWbafuehp]A?BAGScRV`EIyscbaīxvGSszmbjiWJCM[fvv}g=6BhuXH^Sf{vYQþ{ja~NAZl]B=YcA;O}bXEE7..=RXPGD<@PGFlUFSaYMEFOF>CIMOKBCKORWQ@?IPA:BI=G@3:EJ@AABFKB<0/>A979=>BDDHLMD>;:CMPOPQSUWWXXVUX\^`__`_[VSSTSOLNWTFMYZ]^__`][[]`_YVW[ULOTWWXVVU][]]PS[TSTXSRQVVSWZX_a^_[YNM=777/'%*Pp_]OHNQHARaR<;XMz޽fboʇwlYZ]_[Y]`WOPOONKIKID9/,3DJGIJ>7?IUaiqvoqfZagc]k{ziNF>;ELOUlxX@T`\GDHCA<99:8J{|y|zvsMN\`bxx{}tia][[bicZYalmfijkgqvvsi\V\^`bfp|tjs~umsucOJLKQSUV@;@M^`N738DJSdN6=EKRfeKEDB@A@@>>>>?DGKHFSTCJLILMRU\]XLCEC@=:8878=@B73:FTVJ=@HJEDIWslQkx`QHKLKIEFd{Z92i`ZPHJJKQTSNKJ>96555447;??>:34>MIHHFEKSPA;:<=?ABDEGKMNECOTNB>743.7Ujx{iNGDA@=ALWX[^\^_`d`ZB=9317?EFIPRKEBCDGKE;41333339CC<61/05:DR_eii`cdacUGPK77MƳ|rweoyܔrss}}E6CMLPUUL>5;?BEHJD<:G`»slzqcakkdbj˚{z~nekxn]XVWYVPO888899:;;;;;;;:::;=>>>>>>>>@BCCDEDDDCFIKMLJGEEIMPRUZ\\]_^^\ZXWWY[]addccehmqpppqsuutnll]MKOOQUY[XUQXchdWRPLGLSJGYe]J<9FF<=@ABAAAAAABBDFCBDEDE@7568:>DFB=:63;CB@???@@AA@AAABCC?=DJE=9:998969EMRY_`____[WWZ[[XSRVUOLLJHJKIHHEGPW]^XTUUTRLCESYUZ_\ejgiwhNBI[gYLUlvQ^[OQeYWwy_lp[wzabmwyjhttzns~}rwxqa[[\^ff_^VRWZ]iri_`alwype`WPYXYhe\bba]`YLMXYRX`b\U]afp[LEC?CJG;9BLOOQTPUdQ36667:EKPWWWWXWWWWTRMHB;535544444444333334543333333333334444444455555555666555566666667788987:7?@@jZH`NgŻfjjdZdkob]YrgWQRIP[YZSNNJAESMLa_FGN?5COJNV?4<>;OWXPE?C=458;fL=IRNED@MNFIFEKYbobWJD9AOOGM^\SX=;Q}noskiZW}z_QHDFLVVequtxZ8iwfvtZR9^k_Zap̪ZrsxA@u]W?>^O8FQUTSI?GOC@GEC>F85@DG>BA@@>70.:DC<645458:?FHHGJIIJIKOPQRTTUUSUVY\\\ZY\[VTUVUQMILSRIEMZ]Y[^]ZWW[XPOTWPHJMNNNPMNU[[XUY]WWY[VSRYWRX^X_^^`]]WSF?992(%/Xj\bXNLIHCJYP=Kwd2/1;IMHD<4;DCEXohjueVcodMQl}vxwW=;:;QN;5;=C=75=CDQu|xv~qh࿂[T`yzxsw~vdXZXPQ]ebZdih~gjne^ijeZZZVX_bcciv~{uwzyvxvo`JBKSSLHJC@?ES^U:07=DZwb?=GPevhNFG=24;>>??@@AB@==IR?AGFL\lgfkhVFHF=9984==7:C?406DQM@=@?<<@FHDBOh{v]M\ia]YVLIKF?^xP-6]tt}r|yoVAERTTQPMC8765799;<>?>:5;HK?::=>=BIE=:=??@BD>=JOK@6;BEA=83425BNm}iFGJIB<@Vb^`afnl]INOJDADDCBFJD;56:>?BEFHEAAB@>BB:1048::;=?@>;3-/?PTX\VT[Q]\RSpSAGF?>>jyqnbpwvv]B?DHLOG:;=DPXXRLHGHIIFDC@=BFBBEPQRTRNI>>>>>>>@AACCDDEDEGHJLKIHGEINPRUZ\\[]^^][ZXWY\_`_\[ajolhhnstttttsqrq]ILQUXXZVUVcdWQJFHFB>=CLL?AK?>IUP<@CDDBBBBCEIFCBCDDDEC=989<>ADECA=63;CBBA?@CCA@BBACCDC>=??;8887788CGB_ijyiqdQU]Zdpgizqnfg~slfithstixxt|~m][YVWgi\WQT[VS]_ZWZ`dfa^]SGFW[clfdgga[SWWX]XLOWYZ_mtqjNfЛL=99>HD9>GKOOQWZde?15668?HJNUUTUWWWWVTQLHA9445544444444333334433333333333334444444455567766666655556666666678897@jbPMMIOWXSV_`ZTv]Z^ZLGHEFTYVQNLMNNNVa^aaYRPNLPLNR^d[R^Źʧ{rkcqݰͥ¾ĺɱ̳¡пʧƊã{źȻũtdcd_qy~xhUoÿrc\XTMIDLE=UOB?=@CC@==?@G[]KGXa`[7(JXnmjhvp~cnjmiXO^tyxtxu|g^~gOr^YfjUW[ekb^Siė~fgikn|,OkXM7GV>1Q{QOG;',*2KUKC@??NQF`_HS^bUNCKA2=LLIGBBLYYRLEFJH?IBB=D;584<=>?BC>77741//1579;ADHFFFJMMNNOPOPSVYZXWVTWYVTTVVSNIHLSPFGSWTTVVTOORKFKPTQJJLLLLPHDKUVTTZ_ZYZ[VQXZWXZ^Z]\^^]_ZUPF@A?1+2a]YbbUJFAACKH@R`TQPJWw~xōfigm~`KPQQRQMQSI9425?GIE<52>EFII^}gkseW`cP=58?S}{ohVA57:9A[g`YK8=VP73<]X6:KN^{}wnuoxܩfQzujnvl`YRNQWYbprowji_gnc\cdcQRZSXa`Z[bmruwyywwvm`^R>?MPKEGOPIDFJTVG6032M|rK@DRfm[DBDB98=??@??>@A:=DEN><>@O_iijqiUJIEBED83998>IKA>>BA@@ABAI]njZWYPOTZ^XFDIHChQ*2@DK`{M19;;86779::9:;;>DIMI7557636<;88:==@DB5/@MF903;>=;8545459ShZHMQQOG?:5Legdfjjge\RSQG?@A?>AGJI?9;;79CIGDBAACA;67656:??728M`gii]i|\bUMPQUD?NTG>>>>>>>@AABCDDDCEGHJKKIHGFHHKQXYXWX[^]\[YWVXYYXVWZ^b`Y\irssuutsrrqqoeXRUWYXUTVXOFEGLLGEEBFKG==AGEGG?9BGEDA?ACCA@BBBCCCEB<:::977889:7RI823>FC>CILLOWbhkW62666:@GKMRRSUWVVUTSRKGA944445444444433333333333333333333344434444556767776665666666666767886OԧgD>>DR[]^^`bb\Ums]E:AJPU\^]]YQNOQPN[u^PORQQN[eefk¼·jualûǾįûȿͺѻɾʥͫ׵˙̨ér_fgZyvqřrPrht\ZWSJD?HG>+Y>7CEEC@=>;@\QFYO>WDzxeke^{gz{XagRtnPWaNMLKXTPPPROBDKJ\hM?QRB=GUUNKB>4FSWODBI@0(7`yM:8:?4>UFIdiA7@\oK6>ST[ZH@NUXZ@28^jui~}r`Vkzdrihb`WMLasv`MKT`Z]oqVIuyONaUyYsPh_JΞxw``acfY&fRO=4JH27mbNRA)(+*8OOA@<:BQLKaTN[^`UJBL<1CSJBIFITUQOLFGHFGH@B@A7<@=ECD?=8/4DJE=BD>9=>72,)(.10026=ABACGIIJKLNPQTVVUTTUWWTSSUVSMJKLNPNJMQLHIIHFII@AJKQRKJMNMOPLGMXWSNQYWX\[WS^[X^[^[\\[^a]\YXLLJB8-1e]SYWNKKE??DA@QUOK__Hh||e_fouxY\[ZQIEHH=4231468he66C@Sv}yqimriyΘxw{ywmipxgTKPMCJctnpyhnajndf`PYTCIPZdYRbmpqoruusqcNIMFDMQJEFHNSSNIGGJI;4?7?xT;>O^`WMMMKFA=@ABA==GF=NdXS<26K^`ZXctncRG@?TY<3;;78=<=?=96@DBCCA=>N`cXRSYH2>SZM;?DAGz\/.07YsF:;;<<:68@A;8789887767;>CE@5-4@@>??@?<976422127?=>FPU[MDIPcjfjoohde]SOG=<>>77FKNTMC?949CHGFCAABB;339<;:=ADECA@AA==EOWafpnlmhjsqYILPf\Z^IHNY`mlflpdx73>BJGBACSiGACBO\[YYYXSKGIJIHFC?=9535>IMOB9:>EݲpĦ|~vvٛtuwikkr|^[jy{vs8888889999;<<::;;;<==>>>>>?AAABCDCCDFFGHJJIGFEGGJTYXVTW\]\\ZXVUVUUSSSONU[^hqqrtuuttuusqmkjaWVZZVQNGCGGGUUEHLDBGE??CJKE=;BHGEDEFA85;>;=BGIH@LWA6<@@AABABCCCDDDEE?87::8789<;999IUSVWPMQUVYYX\_XMEHROB?BEILMHGHIORSTSRSUX\YOE@IRRZgloooaK:?M]S;]q^|a@LEBIx[Vr}iWmu~ytlhhnvyyqg`[XW[YYXRPT`bXSYded]\`YPMY[^Xb^[WXZUSUUUTTTZ\][NWP67=F705@FFDEHKJM]kncB25678;>DJNOPRSTTSSSRPJFA9556555444444333333334553344333443334433235666678876677666665677676?pѯQGNS\ggffeccbba]lnaRGOej`]ZWOMOSRNSqz]SQTTTNYhyijnw|bpľƶ|Żyw~ïλƴξѾ̯ŭӻŮw{^jiT~w~xvQgefZXUQG@?BAB:.T9NVDERK24RjNZT>'))+@N@=A;9HNGOZMY]\^TFEM:4OYBBOILNFJQLEFGHHCDBA89<<;BED;5217DJC=CC>;?<83+.(5202436;><>BEFHIKNPPNPQRRSUXUSRRTURNKLLLMOMKJGDCA>@EA;AFCJPKKMPQQNSQS^bVLJNUZ[ZYXbX[a^^Z\[[__^_[YNXRI?13g]NOJGPVQFBC>DGDFJLKLJINPKJLIGCC@?VcKgj@7CR_kgB::;?EE@:=ORF]vxn61RaigN?TmmjRFK@JaLBB@=:FW\YWWYJ0@_^F9?C@Ee20:SxOKKKONH>9BGB;:;;;999788985AM=8:978;:946=BGEGGHHFBBEEDDEFFDTxssnsaER\aujTcdqvalfaƬU<=??GKLKIGC>>>>>?@ABBCDCCDFFEFHIGFGGIIMRVVVVY\\\\ZXVVUTTRRMJUfjeksrrusrrrsssuqegj`]_^[SKDERPIOQJJH?=C@;HYVScgZQG>@DEB?>ADA?>>@DFEEFHH?66;=AV_aaRA5>AFGTfpgjqbPERb``[brV?OG4>KFIasaYoxpyzu~wkY\hj_clpkpnrz{}wqwvdTNOX_d`]_RDIX^WW^adedff\KGLWMNZfTNW\WSQSTUVW\]RC88:>67H96m׬ɓQHS_ifccdeeed_]ccu|YHVfdd_UQMKNQRSMatZTSPSSUNQbǻǾ»ùy}rhpӽ˿zöz}lmɴɽΨƻӽĪƼϞɳ̽{wjr`VwuvVb{g{|}^WSQLD<;;:=:A/N{58<=HNMKCMooVjoagl{c_gVIJ>_e[^dWCBCFHW\VSRH9;BHRffJAKE9=H=?OG/8ALOGEI@49PaOOB:?DE?:@Li^hB7OEHb^C9C@MSRY]CIMATKr}i{z9g]v}m_0>LKXlwfRm}l^aa]FIPNJTk~igLDyc\O4V_dRBlQl{~}n^[XW[|yPXhoNC1'=?5MfRRbK2(%-7EB5>C?=KKEPPN\]]_OBKQ4<[Q;KNGE@EMJBCGECBF@=64989@;6504(5.5>:35:<:9<@DFGHKNNLMNPRTUVURQRSRQOLKKKJKLKHCDA?<>B>;A@;DLJKNPPQTYTVccSMJQ_^YX]_`W^a_]\\Z[[`^_ZVT_YUI87feXPNNQRRND;8?KT9?eS06A?EWZMUeqwbY\`dgkj^TRKNyoztPhwV;>6@DB<:9889:876:CEGJKD;541,06:<=<974469<;::;95;GRSWSYZ\dqvpnn]chN8677;;=MVXYM:5;=?FHB;;>?@@=98=ITTPLJIFDEFF?;DF@@dojebVHTYmobmmcmt]sGDA=BEINQPQONKHHGHGCDMW^ba^]\UMLMMKJKHDDDFHEEKF:>@CLPKJIIHHHGFCDUZGDGHѭ=@EGFHKOPRQPPPQTXRDDJGJMMOOE=QxTA=@Ecpzkht~iUdh_rjoek|}7788889999:;:9::;;=>>=>>=??@AABBCCCDFEEEGFGGGFHKMPTTTVY]^\[ZXWUTTRQLN[b`aipqpqsttsqqsuuupg^^_[\_SJHFSTJDITOHA;DTWFHMWhiVNF;>CCBAA><7>FEABFGFFJLF926@IJGFDFD9;899::97;HPMNTSJDKRVWWY]\YYYYVWUOS`dZUUQMJIJCMFBIV_ih`bia\ejcm{fP>=;96?PTV[^gqorojx|fUpzmv|{mjvroolnr{tvww||q^QOMPZagcYRPV]^[]gnhdggc]PGJW\[VYOI^aUKQX\]]]]XL<646::6wH<@@BDGHJJHJXhf]E537668;?FKLPRTTTTTUTPIEC>623444444355345555555555665455444566544556778998::889;>=9776568877?OD|ܡdPNORTPOSW]ege]Upohuym`OP_UUebWQLJMPQUQUe_SOQQQOOZgdkž°ǟyprzgʼֽɵ¼ŻîðӼӽɺļ{çͽϸ̺˼||{wvsYfn|xYjyf~kskVPMID@7798=HI,Zr:5C^LABJUODOdq_LNȮfgld^oUJ[]:RmgV^nWB78?IGA=?9128ACFcfFBC;559AA43<>IVGCG>1+6Q]aTEDFF<2ETNXZ6:ZTV_M:DRIOSZP@;ONA@]jpdvRJtqzenl{]Q\SA9Gq~zj\[LJGJV]ZVfuc[Ezxab;SeXENsDM}n[c\UJb|eVUi]D8*)9;2XVG[\='(&/??38HCACMHENMQY[^\JDQN3H\C?SGA@@HG?;@DCCHG9107:68GG>:9;75@JEDBB?ABC;3650(3:>=4258<<:9;>ACEHKLMMNPRUVUSQQRRQPONMKJIHJKHB<=?@A?=>?<9@IKKJLKU\ZRYaUONQ_d][Z^c^\aa^]]^Z[[^]ZWSTa^^V=D^qweSOLHORE:864:ce?5FSckTNVC<74;B?8P]GW\@BV__^Q?576?FB?=;77.HuY3=PTMEBJV_b_VM<89669=9GuD:kaWxwobOCHDD:;>A==:7>:986761/,,9A<87799<=:9?FLPPMC9:;50,-4;=;:88;??;:=@FEDFMSVTKHX`lyrqe9IZE25=DFBGSZZVG0/=@CJME?=>@DGFB>ANUQPNKLKIHIB1/BF=Ilvjeb^TOM]L?V]tbwrf\UkhLMH>@EJNSVWWWULFJNVZUMB:G^a]]]\ZQKLJJMG36IHNKFJMHB@>?AFGHIJKKGA>G\VEJFJ@J?:BEFHIJMOOOQRRRTVRKFTrkRScloesmry~K:=HZjce`j{utm\jdTVUXphjfj|9888899999;;:9999;=>>====>@AAAAABBBCEEEEFFGGEFHJKNRTVY[^_]ZYWUTTTRNJMPLWkqonlnruvusrtttropk[VZ\`YOIDDFF>DWXE@EJdwbKLXb[F??:;;8@JHBBGIHHJLI@:?O[QDEGIIJMHAAA?==@CDCCDDEEFGF>8=<:99::::9=IUTQVM?@LWXXY\[[\]jwvdLHW]YWWWSKKKCUnoutw|ffVAFHNWa_Ybrm^]lnfmkRECA?>v\OpbBSeqUDKfU?/*)30>O>SbM0$(*1;4/BLBGMPGDIMSY[]XFIQH9NQ=7@?;:EKEGC?AFHD;4:://?C;64447>?;79:=ADEGIKKMOQSTTQOOOQPONNMKJJHIJJC::ACA?@>;:9>IKGGJLVVTPYXRRU`g`\[^bb]bd`^adb_\Z]\VUR\d^c_KMPRfsiSHKXUHNYTRRShvzcatoeeopeyuǖkdmgVXYG;e^9B]zx[g]Gqr_afR=Umtvqie_\]^c]PJIHIQXPCIJ^wA4OhfNEEIRSE9FSVZTD>DGIE9.-58@?847;;?EDCDITZWWN>8/2<:6?Zst}ofgbXNDFyX99I[slfchn^HIXSNICDHLRX[YVSTRHGLTZZ_^WZadddcb`WOMKKLB09HGMOJGHRKEB>=@BFGIKQL@>JRILYJBMT2BABCEFFHJLOOOQSSTSTUKpٮ^Iiirxxt\ABF>=MggoDzdR^XEFWhjflxo9888899999:;99999:<>>====?@AAAAAAAACEFEEFEEEEEGHJMRWZZ\^^\ZXVVTTTRNKGESlvlfklmpsvtrrsssqjcjk_]]^b]NE?=@>=SoiWRPc|iXZ[I887889<==>?A=>FHDDIKJJLLKGGPYTGBDFFFIMF>=837=@BDDBCEFGGHIB9;==;:99;>;8DQSKLGAGLUYXYZ[\YYguqbPLRPRVW_bWMLQ]ZUriOK>DSUU[qtj^T^sl`ZMEDBAAAFK[jZIf{qt{|kh]OXdtvpnins|{{nha[Z^ZSOORX^^YZ[WV[YQMLMNIEYVMQIOXPSTZ\^]`dZYcZB8998;;3BrN@GECDGKLJJJD>E@7475139?BHMPRTUUUUVWWUPJE=64454444434555554444469988888988888;=:879::>IPJGHC;CNOUVM@<;:98889<7{ߢ`QUQ\^RILMIJUeg^PkPLMNIDDDKZ_\XUPNNNRW_s}k[XYWiͳŶͯy{y{{̿|et̳Ʒɝʺӹηɢ¾èƻsŽԔ¦|z|oggʫcxv|esss{exSo~vYOPSRULH@=?AB@8/rT}IN\OPVb]QHR[SЧsfjjaTPSkeEKcGE`qbcX918DN>6??:11;?7Da_MG?:53<>7A[ONBBF>.&)0;ENOHAME@MC@>77?=4=JHD@2/9AEC98EE=<=@@@BFLKHA>ENMH<5<>9>D;366117<<;88:;=@ACDGGGIKNQQNMMNOONMLLKJJIIIHGE@><=?=989>DEACHKLLMNSVRUR\je[]\debefbaeifcb^]][YUSa]]fbTTRMKYncPM[SD[xtc^`afdQWae`jmmeatkoasϐYRMSWC>\rlOGValc`}on~~ljhQG\ks}ywn[WSMHFMVZPLPTOJCXsZABDU[OJHHKMLECEEIR][PQ]ejcPMRH:6?P__[]]\PIXzx_[MB\zkODLueSHFN]e^Qbtlm~o^nxvqjovga[QN_oaTbv~|~ps||b[pk_SDEh~c8555;IU[ZA=GJEEH?401In{wrR3;JSZYcxg[iz[SXUto[bfuzXWV^[qj4Gp_1G^iQ83:CY[^bM^GOuwbNNKEM[cdXAGE9532/8T^z{W{szx_Q3=GNMPUTKAAEKVZJ>=4oZ9C?@CEFFGILNNPRTUUUOQշtZLnwXjFFCC=>XszTQRF@@@AAAAABBCEFFEEEFFFFGGHMTZZY[^^\[XVVTTRPNJFIYihaed`irssrrssqrpqfZ[ZXUU]dbWL@>@6?Xgssceuxmc`^TF>:79@<;9;BC<=GHCGMJJLLLNKKQI:8?BEE>ANK>7324<@@@BCDFGHIIKF>>>@?<::=>B@:;DNVXYWWX[]\Y\eg`fok_[^bkqfXX[WRez}w{zy`K=BNQUdlkpoZVlxuo^MFCBA?DTfm[CNuy|ZGMWfx~d^efhqzyvvxo\ONRRRKBAEPWTQQMOU\^SMMLO]ehb[JCGNMNSWUQ\add^OC<9878::3@YG@EEBDFIJJFDJJJ;246323;DFHNSUVVVVVVVUSNIC:434555567788886677766>IHCDBBCBAAABEKLE?ACABIQRNONEAOXUYZTLGFIFAACCB=rΧN@OPNVZPJKKHM[ca[Okw^[[]VRRTX]][[XTRQPXeggwyb`cqõʽüãii~}ǣȨζл̺ͪƸҾͿŖǻɬҴ˝ڵ­qٖß|~{y~sh{ǶɆ_}ryqqa~ctRp}qZONgc_GHD@><878?HQFNFPXWMHNVYUjë~hhm_QY\{~SLbU?Miie^XG75=RR;7BC8/7?;2I]TMC;558@EBWBGCAE>/%+1)+6CE@BGTV??DBCObTnP98DM]m_CCJK30SxhrU\Z@DhelJ38m]VbnhlkYQND^^dyuttkxsmzXmHpP2PwDb}fN\skvs=grEJ54McA',-+)BI2N[L3.3,0743HO=HZUKEBDKVZXUPHOKEDKBGGAH81>B37KF92/2DMH@85CA@=3384*/68:>87989;=?@BDEFHKMMKLMMNMMLLLKKJIIIKNMH85>;339=GJ?:BJJFCKPWQSTUce[ZZfohgjcagjgdbab`^\[UU]T]d`][WU]UZdXHNKHWrweXVRHMINUr{c^YUin\RKNy5GOWCHocnVGliQ]ep|zvvnl`RUOFVfdfk^\\PMRX[`^TJOWTGAHNFKQMNMIEDGGFJRWTSUNFFNSROU]ZSNA/1=Jad]ZZWTQblw{zyunijkusPg]ZXMOTWWU_igkilolot|fWbci{wjjqrot{yq|jgxqdQGSn`/215BMYdR8EMOG?><9745Dbn^r_dbֻ`X[D@Ud_sxNOJ>623@Zp{k{eousR3HdmlZLny:6Khu_=?D=:65:8:CHMQRTW]YRTA)/87EZegUHFHF>:CG>8@E>9DPYN:49AFFJHA316774454@T[[VNLQMM\f`ODCIPVUQKKIHCACHKNG93,/:B:49====H_gsqTMO[`T@:88C\VIJB9J~yhnjilWGHOFBMMIKVcmkifcfh`ZVZ\[YQL]svx{zurzVTSD8DPTSUUWUI;???BEEFHIKMNPSTVXRY};6JZ=Yv6BDA@@UyjGKLEJYa[[b_VV`hoo¼888899999999999::;<<====>@@@@@AABCBCEGFEEEFFEEFFGLRUVY[]^][XWWURPNLIFJV^`]WVaourqqsssqqrb_jXMMIGI[reJ=>?448?LJ>::AD??GGBGQROLLMNMKH>79:A@=EH?JTF31?D.0Shh\ROb~}ntys~zbKKft|i_gcbf`gq}~xhVPKLRRJGMRTZ[RINSU^VLKHPag`dcRLJJOQPMKO[gjj\?38:998;<5?PEBEECDFGE?>??>@BDDDDCCDCDEFOXVSROMPPPPPRTWVRNQQMOTSPRSQJJUYVWYUVTPVVPPVYQJiWCLGMPPTOLPQOV`b`^`hnhaafigeeecbba`^\VUT\ryc[bd_dbĸŵſúllp|шwɹŶǩʳ̷׼DZȸͫÿí˳Р˓Ȝ‰ϧçyw}}~lƊezt}qR}gvTp}qbQImrCJHAF;59@KZEZCHNOMIGJQ[ae[еoil`_VeqEWmMD_i^sWQUC86G]P55FK@:9@<Y`QFB??KUURSPLNIEFIDGBJD0;F72DE0*18KTNB;=<<;:===;KKBITUHKEDIMF>8?A?><88:5)1837=:787359;=?ACEFIJJIJLMMMMMMMLLLKKMOSQJB@>87=@DKF;>EEB@FLTPPTO^dVV[Zrmdib]fjfcdccd^\]]WWWS]^^_bfVwuMNOIIILTbkg]XXW_bWUuoab_Yim\`G=JO2BTSVr`h`QsPMb[iz|vrmkcUNDObflm_NTNBK]c[VNJGIKHC?>@AIPUSKGCBJKIPX]YSOG;;DNSTSRNLRQ>33C_d_\YRONKLa~kljjmxl\a`OIVc_[eopsЈlphmv\auzhmwvkipt~}u~~ohvun`enkqT545CV_i\>ZsrmU64?LY[Yc_Q,0CailucNW{ec^\wt|lafZpUSowY@Bbs`pqoլwcltdgkV;98;:6Vjk{uknyvvxq`LJpM0PglYOQHCF@<=>CDCA>:75:?BDFKUSIMN<-4GHFLVghSFID83@I@7;FJ=3>SJ57FQONL<3455465210:QYY_TEA?EOX^]TRYWWTRQMJKC?DIKL?0.05?IB9;@EFC@O]nwt`XXNMTT@8AEFPZZVL8:_~snnkhMCCB7;KMJIQ\quusrrqjdb`_]_]VU[cnwVWXIBELPRWURV[SHHOPKEGLNPSWUVP?:?J]M;>=:>B89==?ABDEEGIKMOQRRUUOqV0>?@A8k7BBCC@KlvfrGBGFEQdbRVca]fnsZz888899999999999:::<<<===>?@@@@AAAABCEFFEEEEEEDEEGHJMTY[^_^[YWWURPMIFEHPWXRSdrutrrrrssqqnhiuo\OGEDPjgNFF?89>27^xmUXdZ_jS>=DJLJC=CGHLE@CDBDP[WLKONLJFHJ?7:@HFFTaYHCMJ=BBFHCBDECEGIKJD@@DFRR=I]N45MV:0;KOKQRRTUTY_^]agebicUR]ghdehh`SSoxmWMSPW[VJF[ppkgbZ`dMAKHFC?LbfbaXJdx[[jlush]]ho|}vvyoiknorkeo}{e\ZUNOOMS]b_Z_bTOZYORUNJKRZ\[`ZWVY]]YTPPZ]fePD;688999:<69KECEDDCEH>2=W^RF=745458=DGIPVXXWTRQSUVVUTRQQRONQQONNNPRSSSQPRVVWZ[YZZWTVXXWWZYWWZ\^YVXWSSTTRPPSTTUTSTQQY[XY_da_dVQUTRTUQQQQUZ[]accbcdbabdfgffgggghfdcaZZ\aotYTSNUÿɰ¸·|}vhsycvp|ñū{~{̷ȿȫɶʺ˳ԭȮԤȦ}DZȡyozrq}tR~uqzTp}ylSFovMTOHLF98DJF?DfGHL@BBFJUgmcUsʤxlie^Zu|YDejGIiU^zTRYRG6=S]B/=MOD?CILGGWU>?LelL30?Skq_XRWbd~j[QdF==Ws[H7QC>cVk^JAA9L_V]QKOOIIYe[J?HcLg{sfsvh{casfZUZ{{NcfaRck\?gZ70A6IO2--/*9;8ENG:6//6:7:GKALg[IBB=?=8A@>;6-71.87;8851378:<=@BCDFGGIKLMMMMLLLKKKLOQSQMLI@=BFDIJ?=O\`gWWVFBHQ]aWKB@C@<@A=>CCDGLROHABNPMNNMJCAEIKLUY[YPHIS^`UBJ`ce`QILMFGUdqtfiq|vxejumTUOKO^ondbgrn|um{b_}zkKQxqdho{ys{ytkpnlku{xiE>FM]bbgSA?JKA?><:9756MiqlS11>GSY\bU\u148Rosqm^^pm_arynuufYPguvntYCOwzqsvvЯ~K*7@DGCJvc]~gO_yR2YiifkY???8:A33;<>:75434336@IA=HOK=7MTLEDXoaHF@2,:B;57;C>-.::4>PLFKC32544555545:CFL`fQ:2246@INTPILOUZSNPHFGJMI7,-3?GQD<>>==;==<>>?ACEFFHJMOQQRTTT[h|ԹMDIE>D@JܭQ;CADCAAFESxuobREECGGK`l^Ycdkx}uyw\888898999999999::::<<===>>???@@@AAACEGFEDDDDDDDDFFGLUY\_`_\YWWTQNJEBCHIFMaqsooprsrqrqpnkjlt|q]TRQR]hb]UF?>=3:bpR@SO@MYDJZ]]YWVUPLNM>7=CHHBCMYSKY\D>EGD8AL[aDDeW?ENMCN`Y]d]\\bo~ikx{}hfi~qmjksy}}pghooy~ux{y{]HKQUUNIR^^^fihe`ckeYXTWY\]__`SQV^bc`_a_d[ZT85998998;<96;LECEDDCEG<2F^YLD=:8716=AAGKRWWVXXY[^bdb_acab`YZ_[YVQQSTTTSRSYYWWYYVWWTRRTRQRRQRVZ^\VVYYVUTUSRTUTSSRPMKPXYWX^dbfc_`_^\[^]WVWY\]]ad_[_a\[]ae_badddfggeeb_bafi}z_MLLZ¿ϱomv~gtmq•ǭ¿{üȿֻͽԺζϷȠ~ÕôΥxrzspWrku{Sn{rlTIpvPUURTZ<:E?BH-lrI=A;>?GRcj]Wjoϫucg_gyrRRr^BPjLrxP[NZUB>CVL87EDDH=>K<;:BX40><03,6JMCKE3+,..05<<:CPMA=MT96I[W:5:5/Es^U]u|bT|UGSH;:=DVlz~|teXRSLKZc^Yesqpkcgf_ebc\dLeqfOY`ZSjrVG:}fZ10N6@@.,,,28.ASVG@:/3?FEHJAH^bG>AB;LIELQOOWRLOND;8<<=AHFB>67<.296>:21147779;<=>@BDDEFIKNNMLKJIIHJLNPQQPMHEDEFMHAAB?FNITWKOXUjhY^Z\je^eheba__^^c`\X]][_aa^\otWIMLLmzxud[[kdVbx_ZUO`\I@UˮÝ~|qpynjv{||Z@IYZfgjmZ>48AGMG:jYTbged`UD=EB:<==ND9@??CIF??GMIFGC;8=FQQJEJKIHJLKS`pg[accPDIVVMR_b~ybsydgx]HNOPWimukmvswogujKFbror{{u|yukoollr|qQ]krjTYhaUNZU=>?=;:984?^vnS/1CPRRZ]Rhb;DJXcfmkpokϧuj```^abXRV_x~oteUj|wxtozvmÎ7(>F@BSLFr`Pu}qXatL:[cmzkG?=53;C6236<:647;89:>5/34237755/,..3BK?5:7244345544443124Ig[82443349><=JQY\VPQIFFINB0+3CIGQI:>JVcc_^aa_^bYWDC>I=====<<===?ACFFGIKNOQRRSUUVGb}JLPLLHB@B>Uf@CAAA@C?>KRTcvyx_KLRKIEFEKgkaq}vpxi}888888999999999999:<<<==>>>??@@@ABABEHFDCCDDDCDEEDDLUY]`a`]YWWTPMIC?@@CNdqmghmstssrrpolhc_mm`ee`^^`f`UPJFC@GTYO@@ELG@>FVVPMD3+39C`eUNKJKOMNYjjb`]UH@?:8AIJFDIJFDMbeOHJKD=OWIABBBA?<>>=@NfR?TWNAB?5AOSKBBGHADU]ST^[XYQLRblqtg_ntigkppomx{zn\HU_`\zoVq~{uj`XNA@LLCIMIV^__a[[yzz{qmhTu}r``omjebo~|viYWmy{~}zp^PPTWZY[ZSNQ\_XTV[bab[WZ^a_VUXHISWTSX_kg[KB@86999::7<;74@IA@DCCFKG:=QXPKJEB?<7O9C@=ckMVTHB>Neg]YhxrxeekftoXceKC_cc~oYZ>QUSH:OP?3B6CMA9FM>=DO543?01,4:KK@CH?7B?6:76=A?BHDEFOQPOH?89;:?JIEMNMRYXUTMA=6><=DLIFA7B?/887A;./2576568:;;=@BBCCGKOONLJHGGFHKMOQUVSNIEEIJD>?A=:AGHE@FGEVODVPVj^V[W_i_^hhcacb]W]baYY\\]_`bccafWKZbZwz`U\]WU_{rYSNPMZR@8O|qjtlcsXWkkh_K;8=ABACYiq}riohL?M_YD3=c\:59::<>=;@=;;=@ALan\B,0FUTPQQPcpSAJQXLOglnustggZXUTSSVYV_ort|szsbpx|zyyw\_iaŬo_G84@^YBHk[Im`heHO[ct~wF2E[rsmjprsoXGB?<:;:637GHJSTTTJDINW`hi[KF7*AW<7AA=6--37511/-./6@>51222213433455424516EC3465555545=IRWVWWQEGLNH=54ASTOUOFJLN^jhkf[_ddPI>C=@3?aegkQ48PgcHJsM@EGFGE?@BDDUTDA>W~yux|rf`TDDIIPV^ksulc\_]YU]Y\[WL]f_RKLMOPR]cUD@BGQTB:<<=<<;;==>@BDGGHJLNQRRSSSVTSnFMIEECAAA@?=<@CAA@?BBBKRE=KFCW]]a]OHCDHRdtg~u{~x88778889999999889::<<=====>????ABBABEGFDCCDDDCCDDCDMV[^bc`^ZWWSPNIDC?=FVfgcfkostrutpmqpa[V^bTWfkeeg]MCBFGFNXSE>EOXebO?EW[YS8+3>N[``ZWUZeaRHSTIR]ODGIH?=HNIIT]XFCUca``^dSK_[FCNOC>@=;=>:9PZC>KOC:0,;KSSJ>CLMJTe\QSXVUUbxpbktkhllmjnp{t^breaW@@ZSAX~~NI{{bP^SAA@BC@9BNbgc`ajt}tum]Z_wzdboreeikgpzxvse]gx}vtwxsmi_ZVU[]^[QKLUWPLUXV[_\XZY]]KHNGKSVQLNUb`L?8788887998;:89KFADGFILQQFJXXQPUTOMKRSKPWPOVZVUY\adba_^^^[[[]][Z[[[UTTWUSSSUWVTXYVQNMPPLHGFBACMTRQQSV[[ZXTVUTYWUTSTTTRSVWWU]bXY`aaa]\_dge`^^]]^a_VTVUVXY]a_b``__cefgiiihhfegifgqmqstsfqvȶԱ˿~ǺƾӸ˺ѵ̴ļάľƯȌozvxtuԧaaY^dwz_myahU^zvCRZiko=>Q4IYgWJ^^QGFW`Zaioryb­kclfrmadDAVedqroiF9DPbW8INA2BBFQDBAK@=??445961*/8AGLB65671044=XX41FLW82EPRNVWHJ@<;SKLP@88PG3Klm?GIScbAPX^PaWUQ,DRNQgjeX=AU]etrtyomjkicfswsqxr|bVWa}iMFHVXUa^>2M}\P6HM^L5<<2A0*Re^M>DG=HJ?FD;CZWECE=:A:7:68D@9DIHFIQQRMH8889:?JHEMLLSZYWUSBJ9C?@FNIHC6KB2<45B<)10786338:9:<>??@ADIOPNKJIHGEHIKMPUVTPLHFGC<>@CCB@D?LSEIYLadSTYW_aZ_heaac_UX^\^VVWY^^^`ehfiaNY^QIb}q]X]\WUYp|aHEJJQ@3ZsroxrSTnlriZC6<@@KJNcssnbnlQDKimFAhrO2:D@98;=<<>CNVPEAKNA>=;;:9632:NTXOIKFCFIR_edXKG9+-463@KPND9685222/1656312223003677666334433334366556699=IRXX\^UKJU\F9GMTYTS[gi_MDSgnodY]__O?<@;A;<<;<;;;===?BDGGHJLNQSSRRRUUVVKYOF?@A@@@BBBBBA@A@ABBJLB=<;HY[Y\\WOHHPTVbebr~Ǟ87777788899::9888:;<<<;;<==>???ABA@BDFEDDCCDCCCCCDGPZ^abba^\YYTOKHFHDHSTSYfmlnpppqqkiflZCNZc\S_lb[aWKJHFEFOSKJIIJMPNKILQLKH33HIJLOZ__^\L=FPO]aIHMUglWHKOPO[hbSQYa]U_kk`H>EHDHSYLAAA<HH8:DA:29EOQQOJEJUPVfeSFSWU^hqu}vmqwwtqnmc]V[aYZ\FHXV>ApqR`wvx~[LYKC;8DMA=LXdiYcywxellpr}teZZZZ_dekv{xswtd\gnljox}}p_[YWYXUSQPPSVYYWZY[^\WWSTWRMMPRS[YTLNUQ?;8888877899997CMDKTSTTSX\\[]^[XZ][YU_`Y\`[W[\YYZ[]^\\YXWZ[XZ\[[[[[ZXVVUVVUTUXXWYYWOEIOOHEED??DPTQOQUXXWXWSUUVXWVVWXXYYZXXXW_d[[^^`aa`_cdda__```ba]YY\^]\\__aaa__cefhikllnieijkkoƷhxr~`muΰѺ϶Խ¹ҾʽڴŸ­ãƫml|xiup~nqefY[WcuzenpcjZ\pzr;N_pbeB9Q^qz~pGFIHIHPTQZgfmxtfcqechqjdI:Nhgjdry_58ASta;>C@3BYISEL?EA847<9401-+/:>GMB27KKG.0>E;,5FGG<8*AQR]SLTL;>LldAH>Tg]O\dUKTQ^{QAh]f}XYat}va^quttf_bgjllcq~SJWteM@LUPU^R:5e~ME7>MRC6A;9<):TUI2,CFCJABB@;GTI>>@@B8DIEHOPJK>5KND>C@=;;8<::=@=BPNLGLONKIHBB96:AIGGNHKSYXRR\MYBMDEHNIIG4WG:A=0?:31/?;7/,<;59;;;<<>AFKMMLLLJIGGIKMNPSSRRKGF=6;>=<>@@A?>>DSG?QRTeYMSSU[YYae`Y]aTS]XWZTRTZ\Y[`ehkmbWW[O=>P]cnd\^^_^UUtL=CHH6,>^sozib|{e_cjmxn]NF729@BQmsczpMQWNFBWwYf~b6EUE53:DIHE@CPVOGKOF=605BKL@7FixsuVIDp͖jqz{{Ȫoepm_I?DK[eekrzgy{fhqliu}ei|q]_fkkjfix{zxQ;\wnihcffdk^B=?=;::;<40/0224>MZ[N@:75665593+-23368::9899976444435555455455678>JSX[]``WKNZL@S^ZVOO^on]LHN]ee`ZYW\O89;=UY]dde`K:BT\qpp~UDHJIPUMGNimI@Kmnig\URSdsfYcmixdGIVVLO`aVOWbdfUHKOQPONK]o[EQ_YF<;;;;;:::<==?ACGGHJLNQSSSSRTSVIR[XMA@A@@@ACCBBAAA@A@CGE?>=I`d]ZZ\ac^\ZWXa``vzU_7777788899:::98888:;;;;:;;<=>?@ABA@BDEDDDCCCCCBBBDKX_bddcb_^\[XOIFDEDOZTMYnnimpopnlfaadZEIW][\`^VKPWYXUPIEHEGLHEBBJQMLOLEBA=CME;?JQ^fL75AD>8=98@D?5?LRQJNWKEJSUNNMOQXcgedeinjlw||upl_S]hdXc`BG`XLnw_mi\fu}ss]EA?ACHIHIdl_\Z_]_y]w|sxxeY[`dkwlap{tfempnt|paVWYVSQOMNPPRY`YY[ZZZZVUYVVXRMRVUXWTLRQF>;98877789::48=TMLX[Y\ZY\__^^^ZWYYXVWa]TZb\[_\[^\ZYYXWUSQVYUWZZ[\[[[\YWTVXXVVYZZZZYPCFNOJHFFEELTTTTUX[VSVWQUVVWWVWYYYYYYZYY\aa^^^^`aed__ba`_acdcbda[\ega^^__abb`acffghjlklkjmpruĿķrxw|yzfyɼɱðŮط˸ôijģöǎŰ˹̼Ǝxzmdqweovoy{دħvth_tyU^R`oy^hz|fdhYS_qn8IckR^H6kof]\UBJF?@KYSVa`erucZT~o^hflN:MaktehznE..@ewaF89@;CTJSHNHAC20@SL4')++.>JHA>?CHQQPUa\DAL?CGGE:G7FM=E1<;3+/<::5/:ICCF=?B;==>9HEBHLJKE1=RF>=?;;953A:=A99@DGFIODJTYURO\X_FRNNLPILJ9]M=FF)<:;5-F@9+,A=07;637:;=?EILMNOMKIGHKLKJNRUVOIHE@<879;=>>:8>NI=AQQX^NNQQTWT[bbYSXUS]\VVXSNW]XVY[]bjiefY`PCCFMYagh_W\_UUkP?DGKC/&Kgjqg^xzv{rO;<>=<:;?FkvpHHCDC?Eg{nzmKUW<127DSXQFDLSTPNPG5/5@@:?B83,/2237;8555847E?1145;EKKJOTJ8211147734F]d[J=:8:;87724@B<;?BHML?32797544333355544555666>KTY[]_^TJJUQMVZXUQQV[XSONPRVY\^\X[O35Gck_b_J=;;;;::9::;==?ACGGHJLMORSSSRTUSiOW_cRB@@@@@AAAAAAA@@@@BCB?=>O`_\[XYdkghd]cnkguqp\EH?@@@@BDDDDCCCCCCBBBEMX^aceffc^YYWOIDB@>H[[R\jkmqupiiecZPOKJHIIJUc`RFGV[ZZWNJIC@A9=MMMUVYQDHIGHDB?=DMIXfHEZbkmlournpuoRDJR_hhicVQYce^\a`VE97CB>>BFE@=@=ANJ@CJLE>EPEENRMHNMR]\Z\^XTW[_afmoplea]billpm[^b_divaZYKM_v{nmSQdSB@>OJH^jb[SMF?QSVhshwtl\U^gio}{_Xo}{}xtogc[ZYUQOMOPQRTV[UU[WSRTWYZUUTRDJZ[RHGDLJ?=9756767878;6:@DCSJFN>D-3J^T;+*..0;EHIPMC>CQejXE>CIEEEDD>DJ83=K]hYHR_X_T_T45EGekH1BPYFUSDBONBKYQZNPVou{q^dNT\djnfflginqre_]blzsZKNQLNPXa[Z[[GJP>JMI6,CjvRH<=8?::9:8/6C;=BA@BBBA?<:@JHGGIJ@KUUSQMXZZHVSSSSMOLC]R?LI-;7@.4FC:*9G66<BEGJJKKIHGIKKKKLMQSOLJHDA>989:;;56BI:>GNQUTIMPRUPT\`[TUVU^]YUVXKN[[UVXWX`fdgf^aKQRQ[jrsfWT[]TPS\YKCCEKJ?3NvvtzuP^{|xun`bO=>>?=7;=7C}nabICB<4Hmzvr^_K/0735EWYSOOSUQNK?0.7;75COLLQ^jllunXO>PrXVLQ^W>7BUj}xuzhjofWzsIOfs}}}|f]INONGJdgGbwUU^`e_SE758878973.0004618[nmnonaNDB<=HIFTfj_Sc|ylVQ[\ZdprֱshmjnjVJ]ou|zmd_pϳup{olNV^QIBZ~~kcp_;7[mpx~qC+1Khhd^R:122322687641323:711225==:BML=2//0/09?:3?T_^PC>:998754FUPGDBBDINE62566544344444444555765>KTY\_]RIFMWUVVWWVRSQPUWRSUTUZ_a`\]U?@P^caaabbcca^]foljjtdRHACCDQ]ei`cottiICTNOmym_hjS\neehc`g`MKZreR>:TTVlM489Na\NELPYZVOBBOZ[[P>:<;;;::999:<=?@BFHIKKMOPRTTSSUO`tdTRVmmI@B????AAAAAAA@@@??@A?>AFHMYZW]efdehtzutttup^]^LA>?7777778778::::9779:;;;;::;<<=>==?@AADDDDCCCCCBBBBDIOSX`gggf^TRTRMCA>;D\]TblnqstqhcdnhLHUURRHBO`bWMJLPVXVPKJJJA;HSGAI[k^GGMJF?@FGDLU_RJfc]q{rmstvvtiQJMR_ikigd^[eieei`PSON[_Z]YD<:9<@?BEGJJGGBCOOLLF?98?BMSRLKT[cgjbSU```_afbeijmnnsvrxrmj`]mhellgtrNLXNCIalcc^phJ=9IKEQ^]_aSHAIQWpl]uzxjOYehhotn\_c]eyz{zsg^ZYYWUSRRQQPPPQRUPLPY_^RONKHLWVHAA@@A@>;:88789:9;BHN[X[YTRRSSSUXTRWXUSSSSRPSSRV]\XRTXYXWRPOLORJHJHIORTY]_`ib_UXZ[[[XWWVVVURSRRUWXWU[^[Z]_``^WWZYYYXVW\WTSQOMGISTSWWUWXXWX[YST[]]\YZ\]aa_\Z^b^]^``bedccdffeddffdfptfqɽòyx}gzµĺãžŴǻͺټȽŸƴηբw¾͢ˮʪvrervn~j{p^o|ì{٪Éi|qVh~sqvwfXiQV_mVP]}agjdSMle9U\eR_IxaE@CKEBSUGITYQRYbjd`caayyjc^STSZjkemt_7..=bzJER:<90>>CSG;L6D,5LVH?7020/1Y]e_PGCEGP\glnj`TLPUNGCEEJJCMVVSRNUR=BB@?=?BEH@3CNA<9988<92AAC?5=JA.599=B?>@@=<@HMHBFID=KTOONNQXTNTPTXUNROO_UBPL7=9C*ADA:-HG6BC;*.267:=@BDGGGHHGGIKLLMLLMNPRNHHIF><:98649E=;AJMLRMKOPPPOT_[RUVV^b[WUYRHV_ZVYWTT]^`hc`YX\R\khkWFN]aYMLKGDF>;@BFG8=|~pp|XUdihmmbKV[L<89727=00]nr^HFQVIKct{lec]B,3=8/8JTVTPTUQJB=/-0-0@`roic`ab_q5Ou{pdqva]VVaaBDh~{rzwg]WOS\OB<\|~qfw\E@OPCSwPQlqgQA1.6;;;>=962.024788;ZxZVm{pZNNNKB?CHE8=MPCDkrTP\]Z[bel٪e\`eleSK[sol{yxwhkvqhjZSQZewtDPeM[QNPHN~l:/0,,24Dmsa@0.5QS<;532256678878775039:31/02401@MH<;>?@?;;C=32>PUMD?9668924BFDDC?=>@BBB?<83022443444444455556>KTX^aYJDFNVWWWVXUPQRV\ZVY[[\^aa`]]^UYbbb`^_`bdda_]ftpgmkcYG99:9=D[sZ48`pN55=3@p~`>V~aZ}rfd\QJKhgO:2BF@H;7<::>=BHLQUVVWVUOA?C@=;;;;;::999:<=?@BEIJJKMOQRTTSSWNmgKLSZUSopF=CAAAAAAAAAAAA@@@>???>?@9A[`[aedfejyzxywsqlaVfZHMC@?777766666898897688:::::::;===>>>?AABCDDDCBCCCCBBBDEGJR[^ZX^aXMKJGDA@>AR\_ksussrukU`qq_Xdf\a_PUYZWSOIHOQPONIJUOR_UEI_dho]GGJA@ADGKNONOLGIHLQF958=>JLKORXXaaYS\jlmnhkojpsntpdpypc^_]]]fjhghijMAQTGHg~i[NLH@KTW]cYCJ^^esjlxuweQlrljprqqosxn]Zailnotxz}}vldWOPUTPPSROMLLKKKPPNU\ZRIIOSRSTODBB??@@@??>?@CDFIKNVXTUWUSRRWWUYYUUZ]YVVTTRQVURUXXWTSTTUSKJMKKOJHFDIRWY\^_dj``Y\[[[\XVWQNQRRTRQUYZYV\]VUX[]]ZRUWWXVTRT]SRQQNLDHQLP[[WWXYYWWWQNUYZYXY[Y[_][]feZZ_aabdbbbabba``acdgnzy̾ɳ{mo~ôƺĻɷʧĨױѹѣλнȼιʹzṴ̃ßѬ|}pkvdekjWr|kw{vˑctuacuwtz{l|vopkwQSVg]MO{Zhop[Tp]D]VkTZTXE?S\OSYXMRVQJVgn`XpmZgwtkn^`^VI^`_gli?.2>EpoGGK=A73?:AP>2F1=3;NV=@@382/)2ADBBDL`nhXRYTH>>JB9ATgU-7JPOZlnKT\U]LILIadB06LfH3beAGIHE?;?DLTYb_G?]ega^YUQPR]^bgtog_\ae^PRSOHDCDA=AILMPYVI<::=DEJW]T:6+9C0%6823./5320.)(.A;>5BL;DD3;A8>:;=EJA8?ND=84556><GF6)14469=?@BDEFGGFGILMMMNMLMQUSNLMKGB=9978CEBBDLGIQKMPNKMNU^RQURZc_^WY[PV_a[XWSQPTVa_b`ZbXV]TPE569>@EDGjwy|nnzvcZdgql_jlJELI;57513;EQhp]NDATqyoijtwe_aQ<5;@?;=DHIIKRUPG@;/-/,/?awuplc\\T^v@pxxrhxm[VNLZicduoxzyupbajJ:GN\ztj\yqAMZI:Ok{qM@MViZ8+-5=BCDIF;6310025731T|nw|saOGCHRSI<B92ZwaM[e^\_c_k][]WV[VPLQZ`rqln_KMJBA@Hn}w`UWYI`~WLJIS}C+/-/.,@mwngV>;:(;M?:999::9678699885331341/1335;HKDAHNPSPHEHD7--:@<:85356751//5=>@GLLGEIIC<5121344444444555546@NSV]_THDGNVYYXYWQLOSW[[[\^^__`a``_a^`ba`_^`_`ab_][fqpmoplaG35756679978>H<26<5BosL0>osZdq[][\XJ_aN>598878;;8666:AGOLD@G^hQ;79<<<;;;;::9::;=>?@BFHIJKMORTTUWWYTXQWXWXXQkzQB666666666888777899:::::::;==>>>>@ACDCBCCBBBBDCBBBBCDGNQMGFNZYLCBA@?ACDCTkpstsrrtnVZorn`_eQSifWUZPOTXTNOMPVZZ[^ebRM]pieuu`NECGHB@P_cijfc^dhdlnbSJRUODJ]d\SWbd`cmidlo^HAL[\VKC>=HIFCCCCBHTSIHNPLD@DIJ?45;DFIPWUZ^YURMQclieemux}ysvugdwtddki\]Y`ihijlwmOKTMH[s|yqwmROOHZ\^d]^QRa`^`s}u}i[TXegkkbZ^hpx}ywvuw{sd[QMLJHEGLNMLOMMPQPNMUYOGGJQPSVQKDBC@??@DEEFILLLNQQPQOMOQQPPRVRSXVWW[\ZXXWVUX[XTVSRVVSOOQOKMOKJOPNLIRZZZ\`aceYb_`XX[\[VSQQRPPUTSV[[YV[XSRTVYYRMQSTSQQPRWMORRQNHNUPUb`YYYYXWXZVPU]]\VZ][[_^\dmi__acdb\Y[Z[]^_^]]aeknǽλŶε}yvhx˟ǭϾĴľɺʨӸҽʺƟǔʷϹѺ~xjsdqqji]kxsig~tuʳa{c_t}|repdx{i~SINmdGGx^poe\]fZO^Zp[ZgZQM_RUlcTYXOHPit^TmrYYozpOhs]^ZDH_T`hiP-8=DF{bOOF;<9AA7=L9-?349=IP7EA8J>1+*4@@=BDONSPHOK;0(11=JR^G8AB74DZJJOGni8,,1.(0C6.,*4432:6>522;<>F@?L8/>=:?88=IH<:FG<:42628<=B>A4+47O;EJF/+7656:@@>>?ACEFFGHKMNNNMMNQTWWTOMNJCAA@DLGGCEGEOOLOJEFLMUPMUOQ_b^][\XXdb^YUSPNKP_]YaX[\\_[PRF?K[]L@GQKD>44?BEFFP]YWUOfnotjRV`k{jVilKAGHC><:52@w\dHIB<9;859BFDEC?BLSMC@>2-1112BUt|rghcTuPJMLE::FYM=ICAI@/2:?CFEHMI<62000/2541Fywpnle[WZZ\\UK@989833@<656898888:;4/00027;>DFDBBEHJLNMJJKD9--/.011333562.07?AFU[XSNKJD9;=72444444444455446CNRTXXPFDGNUXXYZTKLPVYY[\^]^_`bcba``]^_``_``___`_[YeopnnnkbI6686666898624678:6:ON:65F[H2ZpXa```Q\]WE8:99::99:;:;;<:=>>==<;::999;<>>@BEFHKMMOQSTTVXVURfz^PRWWWYPetN????@?????====;;::;998DUbjhbdnonvuosyum`XRBEWW>>D?@AB6666666668888889:9:::9:::;<=??@@@BEEDCBBBBBCCBBBAABCEHGCA@CIKIECA@>EJG=Uonorsrrrm`\pzdTURBBQZRRULN\hdYVSNS`g[V_]W\fkmmnsxo^adOFLVfm`Xdk\QTZZOFA=DOPILZ[K@@GNPWeljkdSOKJOH85@CAJIGDA@AAHQL;8?EIE<H@=BCB>=7MNME;GH=4>UFPl}zoe]G-4T25ARAD`Q7BC4,1=>Vv_HF@AIPVZa\nqec_XMIBA@HNPPKJLMJJKKIKGJHSxgF<87==5/RwH?CTPaC('210:9-*-7><515Go?)0?;=>7@B7??/-99AJA9>@<:9;DFDF?@CDDINIJKJJLNSELQVTPW]]_^R_cSHTSQPN?8FL8HQC*2>;::;D@=;<=ABDEGHHKMMLKLMOQTXVRPNKIHIIKKDDADCNSLLKA>FKKLFQQIWcb^[`[Y`dZZ[RRLGFVaU\URY]fiY[[[YXZQA?MO?;807ADGHKJ4*J[UurtmfjcUYc~qPUicGGJICCA;:99R{~bzUAA>B9-?FJJMLE<520,/.011/8`~{xspnjiheYIBFF<66643:NPHKD?:568589:<>@<2/1138F;2444344444454446CNPRTTOGDGOVVWY[RJMQVYY\\]\^_``aba`_^^_``_``a`___[ZeoppomlcK89966564286556667643468627;22`kX`\jrgl{QKOA9::::::::<==<<>><;;;<<;:<>;9:99:;;::::99;=?BDGHKMMOQSSUWXXX[_Z[]]]^`a]bdZZVSSTRRRPONNNMLIHEDCCCCBELS^fb_biorutkflkfa_XMIEDFHGD@?@566566656888888888::9:;::;<=?ABBBCEFEDDBABBBBBBBAABBBCCBAAAABCBBBCLVWI>PaequqqrpmkkldPFIHFDEILSVPR\[XYUMDDLTUTVZ^_XWjysijruk\WWWZ`^RJMPVZY]WD?EEEOUTQPONG@@ENZc]ZnmUMKKH:7AB?DMNJJE:8@A=8317;=@<;@:4818OSMIPckfa^_bjro^[_]ajha[UT]mw{vg[ch_Q]zrslxnN?Mjsmtym_`nqyvoic[dd^_]_nyug`vpYephhemz|~||y~{T@CDEDFHIKJJJIKLMMLIHMOLGHIGGBEDDCDGHILNOPONQTSQQPSWTORWVZTSRKSYUQU\^]YVZ\[\\[\\MUTUY`a][\_`^YX[\VVX[QVZZ]\YX_a]RPOM[SN\ZQNOUTMU\ZMNONSQENUQEGFKMOJFLNGIJLKLLPSSS\aXUWZ\^]^`a_`gjhZ[ccbabckkhghigfdabb_[WWY\[_lp۽ũ¸mvmkw}dl}ɲϽǫĿ¼˪ȶȨ̧ļ~»Ͳļɿëtz{sup{|fcranp|ohtevra}zw{ZjrVmez^G_a?LuwhUnZdYfX\hmvZ^gZXpibgP\kgi]qq^ntx_N]fhYVLXJDb^EA`AUb|rSOQC>85SC41I>8I;55?[Q0<>KO4-828:><>6M;77>803:AL@C>75:CG=8;?@@4*-.6?;=:9A;5=>15::EI><<:969=DD>>>@BCELMGIIHGIOLDKQQJIR[[^_YbaSO^V_QP=DA>?CGB9::;?@==DIK^_eueXMAA<5=Taeh_H1*,*3ELIB<@HW[QHLJA?=57;60..BV`_`a\UUUPZquy}zutqnH=CIXt~y~{mlsb{z|pnjGNSTSOXenuoosuchlOPTP:358358@FD946=CCBDGMMF@:763,--/00-/Nputtqge`UG914;<869:52432;KHCUc\QLPso47DJ7+49>HLLIqlaRSpB_oX>8DLJJRoZUqsrtsruyoQ>67:AL[]tu\:2333344443444436DPRRQQOGBIRVUUZ[SMQUXXZZ[[\]^^^_``__^^_``]^aba`__]]enoprombK89:76666566777777667866767798:>76?GMVblllmmlifdcgloooqonnnnnoprtttuvvvsrtsrsrrssqqqqqqqppoonnmkkigeeecbfea``bbbdeb`begjijiddcegfbcd^[[555566556778999888999:;;:<>?ACCDDDGGEDCAAAABBBAAAAAA@AAA@ABBBA@@@BILKEBLT_nrsturg^UKEALOHKMIFHUZNJLC?IJCDEFN[aVRTPEL`efgdb[LHY\PNPLLMF>@N^aXNHHGHKNPNLR\]PFFNY^]f|qUOLHB:AOC@8478989;<8.9LGGKCA?BVaabbaabepi_imi``]XZ]`ekv~vxyohZaxofu|ux}x`T[jrqwsb`ky~|cRV[Z^`a^o}wrp_^pkloepmbt~{iuz~|zyrZ@@B@BEGILLJHHIHIKKKIHFEEEGGHADDDEFIKOUTPTURSZZXWWX\[VW_`b_\]Y^bVRWab_\Z^_]\\[\`Y^adfig`Z[^`_XSUSLNUYPQQRVVTW[\VPQNP`QM^UMLOSOISYRGHKLOJEKNLGFFHHIGGQPHHGGGGGJIHO\cZX^`abbabcaafig[^ddbbbbkkfeghgggilmldZZ]abf|ï©h{~xkgmr|razqĿúàæùƮܴµIJѬĴ÷«Сª­°ěætzuqu{jao`axr~gjzljxw|}_tytTvuSplpzkXb~a=29<4(/DA3;?65B@GB4GZYMD;8:AGLSdJJLTdgc\RUPLHGFDEDCC<85AKJ>>??=O^VI=0/C30AAO2'9;/04,.=MJ71<>6>XT?8A61:=KT>/9??;616>DB<7:BE>,(*29?=;8:>40B>1;9?ACGLLGGFFEHLKEIRM?ALNONOU]^TW`aaTS=CMFAVO23KOICDIID?9999=?BEEDEFHHHIIIJJMUYYVRNKIFACKLCQ^NIPE9?CHLHDOMDS^^XV`^[YUP_cQLG=BYZPPMIQ]e]SX]]]S[]JG=MXH3.157:99BTnfA;IH846:MRSRONIB=:::<3+1?]gfed_WSSR[xwvovc[ZWPCDhm^TKPHHMizvpoW6/3ER[bZ]d[F37QWXaS8;CFB?7122346987549>:879;==92/148999=AB;69?BCGLTZWMJD821136982//0120-5JYQ@9=ACAEJ>542333334434444337ERUUSSPGELSVUTXYSPUWWXXYZ[\]^^^````^]]^^_]^abaa__^_gnoprrngN88:9888777667788878<;76679878866549\vtyhA8778899998::9:;;;:::<<;;;;=?;7?Wkrx}{z{~~~|zyyyxxz|}~}|yyxwvusqnllkihhghihiklkkopqrqoljiggedfghhhgij5555555567889:9888999:<<;<>@CEEEEGIIFDBAA??ABBAAA@@@?AA@@@AAA????=;;=ACFMXacgdfslRA<<=FHBFICAKQKB>=;;BDFRSOW]ZRLIHFFOPB;@CEHJJKMIFKLLNGBIRW[WMKJJJKOOO]leXY\\YYfzy\KPK@@@BEAFIMLIEEEFGHJJFDCCCCGGICEEFGHJLQUUQWZ\[^_]^_`b`\]gfaabcbdfXU]c_\ZY^_]ZY][^bgljedaWQUWXVSPOKGKSZOJJNRRPTWRMNUQQ^NN^TLLNQIFSUEBGJMNFHJLKFFDDCFKU[UNKMMMLLNNNU^gb^cddbaaab]^aif[^dbcbabiifefggghiknomgbabm|øϲiv{xrzecdvqn~~~ans~øƻ̴˛ǹʹÿȾ˿ĵ–ĺÏʵĵצ¢īĿȲ|}n~u||mvnflŧe[Z}{it|yqaovlohs{xuk\ay{jUsTvqem~]`Z;gyrw|oQfZOJq^_sIY|``]{{n^btqYcwgob]mwobVVf^]x]TT[Ja^A^{IVujRDToXCJ==C>99H.7B*2>DC'13:C;6=J\bkmQ87539:8;GJB.(->37JQMB?==>BCVUG[W_ceTA9>:8EG>4:=B6KZ[H;4B51OFE3.77-(++3DF8138SI28=:98407?CA;5<@C7&'-89:=:79837J=8;<>F61335956@;06?=>?BFJIFEEDCCMJFKUG>IQEDEIOWWS[]g_\Q;NHFN[H3=SYNAMMJO>9997:6))9KENOLKS_N;MWQYI8?CKb[66GH;<959:8F`мxlaLOcxoO7/,/*-Gp`1*?OOKLQQJFC;:=:32:HXkf_XRRSUQSer}œ~unkcVGRE?GI]{{rrvxz~uTSr~}p[QRFBEDDGRk}{|vpqqcYmw^UZTIK;-;EBNO88<;>DLMI;:DHJHFF?,+-..,/JcggfdZ?.,-.01138=BB8.-.4=CIQ^W=16E_tOYI.1,:MA7MngF7241>Y_M6Bf[1C\=7YrRLQMGRhrskcX6&9beV`kjVB>95EQZ\B7:::DG700.-/2668;<>?857:<==<83247::9:??<99<;;Mc_WXPIE8./126;952.,/21.0BRG4/28>;:?<323232334444444448GTWUWXPFELSUVTWWTSWWWXXZ[\]]^^^_``_]\]]]]]^aaaa_`^aiooprrnjR88;;;;:97776778898876667777689:9997CcvpR<98:9888799999899:::;;;<<<=>:9Ps}|}~}zzzzxwwy}}{zxuurpnkjjjjiiiikmmmnnloqppollkiighhggghijll334555545688898899999:<=<<>BDFGGHJLKIDBA@?@@AAAAA@@@@@@@???@@????>>>?ADDFKPOKGLfqUMQHD=?C@@DKRL>=>>@CGJHNSPSPLOLGFFE??GGDEGHIIOULEIJIJHMSOR_^TQMNZ^XZX]`R]sseVViri]RNMDBJRM8?@,;,06365EXFIV\SLE=4@?44@D<4,.28@D@AFF@?;4/=<,+/.,0:;7522/(%/?<,)/3449CHIICBC?;;9>DEGHJICAA556946CPD?D?;=WE=3101.*-0-55/01439RGG[-6:96GH4<5:;8/2945:7;7./<@:VEJZXD;FY\KCRIJQ@9:;747>DEBABBBDEEEDFLQQQSRRPLHHFFJZODML@;>BEGDDLHIVYTQW`ZSNJXcYSRF<.0ANRNEFNID64GF9YL004AORsגcYQB:DcU4,4HH.0Quc3;UQEHNTQKHC78FA-2>@GSNGEEMWPGMJb}rvz}~xtsof|pMLCDDLo}}wqrqorywgXj~sgXPORPKGDAJe|zsrjirmZV`_SQTVVS?.9IGBIA8=:88=CD;9@CA=212-/0-.+/J_chaXRJ8/131006@GFB:-(/537AN[L21>CNxtHcH09/1EC?JWYH4//6YucE7FjV1@P55XzoZPFKbjv|rXH36]mY^svmb8.>JH;9946QeM>>;6222346;>>=;6;==<964355677776554326NfaRQOEB<0.0136751+*-11009?921.266445223233224444444447FUXUWZQDEMTUTUWWUUWVWXXXZ\\\]]]]]\\[Y[[\]]]`a``_`^`kqporrnjU98<;;;:98887788888777666777778888789GaR<759;9889999999899;;;;:<<<=:5<]~}~~}}||||zzz|}{xtrpnmkiiklkkkkmppoppprrrpnmmnmkkmljjlmnopp444455555678998989999:<=>>@DFHIIJLNNIDBA@@@AAAAA@@@???@@??????>>>?@B>=IEAOXPFB@A@@FMTNFHKOJLRMMKIFDDEEGIJFDKSXXRGGQTKFFFLY[TPMVhfZb_LDQlnjl]RY]bcSJPIMWbdG>HOJBCHPQXtkLD>:87:=7>^sgY\R@Rl\RYTNS_eapkQO\hegd\[[[[he_oqieamobdSc}tlo^Sbjxzdhzfhnb^nq_gkxu~~z}}~}oepzzurhsp]]cegkinxW@DFCC@CGFB@@ACCCEEDBBFFCFGKJLNOOPTUYXW]^^`c]`d`]][YXX\_XXaYU[YOKPTOQTV[ZYX\`]Z\]WU[WIGOSQQTQPRLDIRWNIGNSNOXVNLSXTQYMMUNNOQRFEQL?MSKTXPTNIGFF@DQX]^]\Z\^\Z[[\^^^_dhb]]]`W[[aXX\bbZ[aafebaeb_dgfdb`_`jt|һ}td|}vsnz{`cadt|}ltuu{giy}|óԱѵ׬иŴĸ׭{z{ĮǨ§׷ðŒƷn~zuouhmgumh{bWǖcT^o[n}kxtxm|c[o`Zcbrpgjo_rlrzOptuWmpp}P^uiijOjiOs|LNyzmz{|kj\Q)*+,=>GF>/(1>:650124;,%&$&%# ,5<2:E;1'""-@:'%+12-;SH;?DB@>:8BJdlUKGF?9=KSNE><88604LB0A?7896138=B=66<;>2224:5<=49997OL;51940.9@489<3/05@<9@C@;?EDDCA?=QHDMF@NTMEEOVQJIQZ`efhIKVJT\RFFN^UELQBYPD:;=7148DGA@AA?@BCBDEFIKMOQSSPMLFDJLFHJC;;?DFA>GIGQXTRTXSLHGQ`[T[TDBYUBAGIMMKKJLQST\fcVOO?EDI8-'6967:=;8>>13CQI;5?PE2/5:6@ABEKVXABGE}rlkkqx||xuoaatQMH:7Q{x~unqohrwcUT^a[TNOOOOMHDESdheedagrpYTZR:EKR[QFJVQE96:989952685468=:1*)/96..+0I^^egI9=94652213=GGD;379:9@GMWI412>DZsd@.@7/:DGHBEF6-/;SdO<6?aQ4TufD;6E`videj~}r='*369984:T_TORVP931247:>?>76999:7413664666655228;BT_VIFG=87302321331./001.,+,/3342.1112212233333444444437GTWTVYQEDMTTSSVWUTTUWZYWY\\[[\]][ZZZYYZ\\[]aba`_`^_lsrqttnkY;8><:98888877877779986677777777776798>:7879988899999998:;;:;;<<<>=8Ci|~|{{}}xtqonnlkmnnlmnnprsstsstttsssssspprpmlnooqrr444444555677899988999:<>@@AEHJKKKMOOJFBA@@?@AA@@@?????????????>==>?CD?FPLEC?@?EMRUOQTRPMPSPSWOIE@CBBHQ]cVBJ\RIMORPLIGFEHOOLJJKPZ`YKIRWJ>AJRX]UOORWVVa\G?QcbhvjUJJPLEHPLU\^iVCCG@@LNT\^nh]KEI=:HIC;=CJB?AC@5+%##&+.*$%((#!3<9)>T@%#!#/:4*,9A93FG87AFA@@=>Mc_H5870LRH%*+((*2;6B@5/25373139AH>*2@JB:>;<852/5=C@8369=:943967A81<;:@W?8,87011CC9649/;7;A7CBAA@>?QCDJAAOJA=BKOGEJQZbdcaLVVQ\[PLLS^NEOHOXPA;??9658EG@BC=<>>?@AAABFJMNPPOOOLJGEHJG@<JbgT:?B9hv\rnCaޏE;BVUPmzlirtK+:VC4=?86:<>=63?9.?KEAAFLTVJ9??Pwljdnx}umf^WXTTM77^~vnxsmomltoYMJPUTOKNONLGGLPNMU^\PXnpj[L]S@JFLZRNVbU>:;8213420//0..35AJKKNJ8300.2JD9>?NHavR;6326LYea^cWPfQ@;0-27:758@IMQW_V<667603=DB7684587554688888:=<74;GOX[OAAD=543133223333541/-,8RcL@95Fp}~|{}{xtrqpppoqrrpqrsstvyzzywwwyyyxvvwxtqpnopprrr344444444568999:98888:=@BABGJLNOOOQQMGBA@@?@@@@@????>>?>???>>>=<<<=ANWWSKFCBJIAHKQULKU]]_d_VRQKB@CGHGPYfgFPhN>BKRPOLIIFFLSUOJKJNTQMILNA@ITYVWVSPQVVV[RBALSUbsnbSJJGOVUTXY[eVEGGCHVZX_dmd^\VYMCAJW^`eqsidach^TZcisg^db^c^UYef^Y^jd^hxw][rqeZT[j}gFJ`vxchpa_neZpxzxep{{qo_Z\`dp~p[|zkUVkqrwr{qigmswfFBB@@@@BDCA?AAABBCCCDDFHEGJOORUTLQWXY]WWYUU[RNWWWWRQTVXZURZVKLOKGFLKPRTVUTVX[[Y\ZUTSJELTQMJIHJUPCJSWX\VZ`b`^`dd_ZWV[TLINS[ZRKLQXXSNLYXVWXY[YTY^YU\[Z[[[YWWUTQTZZ^\a_YUU^YZZ[UV]ZWXY]bh_Z^c`\bhea]Z^lw̴³¼ʳx{qhqqnkzx[bdX~wr||qy|ij|o}u{vǸͬǹķ׾þƠˠ|v̵֥гē~}izԭ|t}s|dh|cghZ~zvgeQcrqzoc|ohktciq`tTjto^Sc_`~}fctlsfYqskzOcW[md\egvlMQraU[qoqv~ynzfG@Hl~bl[vffp|wi[\XX[kFRnaUppdh[ZokGRPxlUMRVSgTb}fikJKNBVROKM056LA:GLHE2?552/5KXKH:EWUKK@?DQNIJF;88=9>@A:,+0*#$%+-7?BKA3578#(FB$-+4?2009GJ=BOXL=78@JXZTJ=:897;6CTR8,NJ90/@504>I@52>>>>:C<9D=27;AD@?;B:HOBCH;DJE=EA=;;AHGBCC:;<=>>??@ABFKLLONNNNKHGHGHGABGGC@JKIHKNOPNIFBCLTUQ]YPS\L;@DEHD:GM@FHINRSW[YT]VNP9/01355546:>;2:A;5V:6KNKNTROSJ7./4@AQuc17HE=ITSQ[W<0400GJ8Yc>=@>GW[SvxH;B>4L}dPE3)-86Fd^S_UJJHZ_D/-9F905>KMSYSH;:77:88<9:323579779;:<><88<@B=8802122233333344455666>LSRV\YNGINRRRSUVTQRUXXXZ\^]\[[ZZZZZYYZ[^_^`abbaaa^alvurttnn]<7::9:9999888887777777667777787777877888888888888888998999:;;:=:6Gq}~}|{}~{zzywuuttttuvvvvwwwxz||~~}~}}{yzzxusqppqqqq344444434569:9:::87889>CDBCILNQRRRSSOHBA@@@@@@@@????>>?>???>===:;;;8Jai`QHM[dYJKLNVV[^W]ea[VSSH>FKNMFKOV^NU^F=AJURPPLIECLUXVRMGENSKGKOQMDJVRMOOOQW[ZVLAALMIVikjhjhXY_ZZ]TVk_KOLJM]e`cdd]dpXORKJRaljisqgc]`ga]bglmg_[TQU[]``QLWclkglvsgWPXb\M`tsvvdGAMRttYVnt^\WVXs{wumaR]e`Ym]]p~~}rejvjfy}{unliihlq{oG8@A?ABCCDDB@BAABBCCBDDFHFIKONRTSLPVWWZTR[PSYOKTSVWQNRWYYVRVVJJLJICCKQSTTSRTVRSVZZVTNMIPXSPJJJIUSLW\]_YUZ`a]\^fec\\Z\YULPZaYRQRU^XOKMRXTUZ[]a]]^OR\\Y[\ZXWWTQOSVWZYZZXRR\Z[]ZVTYVUYX[cd[UZa^\bg`[Z[`rĞô˼x|qhiosllxt[`gUsu}}rzfe~p|m~¼ƾƾǼĺноϳҺͫЯſsÞĨԤʾվ~eơ~o}bobg`_xo`OZyqooil}|pfmyuotumrRp{kkVTX^iw~Zdp|qZO~kJ`^^xq_VlxvtJRoaa]~vivss|wpJ=Fpp|spX{e^nw{\TZQP_c;IDHC<;.701=?CGC?DOQ<:=;DIH?5/.2346887888:77=32M^OB<>6/,::F7G83VI,.8EG@=??NYYM2//ACGSS>/5:877<34>2-;@:ES98)6<24:HG;0?MAA6?C7CE05>>DB@:>D8PKACD;FG@:>FNG?GNS^]`aUGMZf_STTUXXOPFNYVI5HHB@>DGKGCE=7:;===>>?@?DJJJKLNMMKIFEFJJGHJFEKNIFDGORMIHA>DMOOT[UT\TB?DEEHB?M@>DDHJLRY[\deZ\U>3-/.244115?>7>AA;tkAOS<=JfW>FOSciROrtzyuAAOV\`mŐY>:I]e{rhZLMS\hZ@>KJA;72395-,:<0-1?LMGHKHEA;=<;Lr`apfmsjr|pgmxsickcEBIGOkjEIm{pZ=Ie_A:DKQOLE<@QgR@cjIDOKCAIYg`J@VW[ezbSmoR:;:34;7549OWH50022334347DNC47MPKKKLRH-'+09>@SK/76AE=1/048:78;=<==:88<@B@<96@MWYUJEHPM5*55212237;;992?V41122233333344455446@MQQV\WLHLOPRTUVVROOTVVWYZ[\]\[YXY[ZYY[]_aaaabbaaa^`lvusutopdE6999989998888877777777777777877888778888888888888889999999;<;;6L{}{~||y{~|z{}~|}~~}wvyyxwwxvuwwwxz|}}}~~}{{yxvsqqqqqq33333333446:;99;:7688:?CDCDIMORTSRTTPHA@@?@@@@@???>>>>>>>>>>==<;:==8BWfj]P^ok[QOHS_YebHEQOJOY]SGJSZXJBP^TIWdWGFPYOMQJGCFOW]^]XQSW\UQSZ`YJCORLNNNMLW]SICCFIP`jlqutgRQW\dg]UgobULMOW][_ZQXc^RWXMP[fqpigec`YZ``]Z\dif_^^WZ_ekdWNTaggegh^VSJAINBSnqnmmYSVPL]`UW|khbTUgzwjz~hNbojek{dMRk|nnv~rgknpvzmkkpoorvmUC@ABEEDDEDB@BB@BCCCBDCFGGGJNKNPQNQUVUQPS[PSWMIROTWMMTXXXVQRUKINHHA;HNTSQPRTRLMTXYVSQPSSYVWQRTSXUVab^_PNRZ_ZWY^^_]]^^\^TPZ^VSQV][TMHMLWQO[Y\`^^^QR\\XZ\YXXUQMMQRSWWVWURQ][[ZZUTUUUWTYc_YVW\ZY^b\WY[asпҮ¯̾t|wjciivhnxq\djXn{|{~tze[~yx`~õϼŨջļٰ֥óˠӼ̴ΩϿƲչymbݱ{h}xk}zah[im|u|WPZojpfftzmwohovttsvsk[slddQQOgk{gSbgOMj{Djgcwy~]ZeyGQokr[pkYywq~tP=Eqt~il\eaozVR\OJcW@cXgw_hedm_UGYCu|gUJLZTWm^YxzOFBE[F9KZK=9?H=FC:.=KGB=712+6BB=3697BF<8<@A><@NN<5/)'.1//3=@/#%')%$9@>IC631-%#)16@VC2:BSL;476==39ADFA?@I702A60*11,)*.25443684224444**A@@><6.0:=+.4#$MO*'7EA=<<4;C>BA@A??R>/.5<6'/40202--/2=E9/..3;8>:?:,59.5=>;II9/-@567>EB64RF<48B@=GB<:@FKB=INU]]``QBL\h^NUVZZWUUEQXUD7QGCBAIJKFFD789;<====??=BJIGJNONKJJGCCDFGGGGHKJEBBHPOJJJ>?FLLMUWTWWKABFCGICF>5ACCFGKTWV]feccPM845222269=DECGIKEv^[wgICdoNSigkl_]qjqB=_aLSwĹxBBIJSK_vb\]TPRRG?@C?@AJRNN[YQTlpnf[]lqqnh[cpV9:=FgnfowoY82WbA4BFDIVRHAXsbWqeKXbN>DX]ZfT6H``n~dQlfUHNQC@F6-/.0000.)2=ARC04>:29>27G?731:KG4-/01425245BOZWTYZRNMJPI3/.16?IE41@IC47LWTUgaC25@GeqH18470?LRVhyJ8MI;=RZJ:DH2-8D<59Ne\KINXWS6+3;R`D@I@;XcdkhTGMI97DJB9227:;99:963127;?ABB>;DSTUX[SKFMXE.45102458;;:;4/JvlY9222222222223333225@LPRW[THGKNPRUXXVQMNSUTVXZZ\\\[YXZ[ZY[]]`aa``bcb`_^aluustqpmjK578878888887777777777777777777777777888888888877878889999::998U~}}~~||||z}zz{||{|}}zwuwxxwxxvuvxx{}~{zwurrrrrr234322323348988997899;?CCCFKNPSSTSTUQH@@@????@???>>>==>>>>>>===<=AIIM]kj`_ebWNOPFRii`OA@C@@MY\YNHJP]T=Vu_QcmgXV\UJLJFDGRYXSYcaZ^edba`\VYPBLQNPQQRUZTKIHCDNZecZYWRLIJO]hga\`hi^NLQUXVTON]_[_g`QTajjb[XXZYTRRTTPXeeda^^eektrmg[QY^dltmaliPEMOFThijkqifc\QQ_kj{uQYjxvyt}s{~si`^f{{iaiqqsvswyuoprsqjUKFCCEFECCFGC@BC@AEGGEGEGHFFILFLLOQTWVSOOW]TVYMFQNTWGQWWUUSPPPKKSGBB9EJROLMPRJGNRRVVUUU\UWXYYZ]^]WY]YZXILNT\XRQXYWVV\ZW]XNMWTQJP^UOJCNIOMOQRUXZ[[RT\]YZ\[XVTMGHOMNWVSTSVT`__][XUZZWWUWa^YYYYWV[]Z\_cdr˶»Ľ˿}qwrh`hdxyenxnbmncfz{q{vv~cV|r[{Ǽʱǯ̻̾ϣѺصҰŬּʽ˴¹ʵѴqt_wΧs^}wj~llkZx}g{ylaf^_`qeernfmfmqhrpv~wthftc__NGWvg|UPekaOWexX~yssxw`fXsBOsqzXeZNxwqyvY=Fp}r_fhmsrOT[OHiRRVhtm]fng\NTET\oobTHHORgeq^ABBRK5?JQJC9@D>;88*-5=E?5522CF?9/.1:B:56<=<71*-2232/..,-.373,)&%/.,:@CB;50-,(*-/1>F>?HIC8,,577755@LI?<94597;%,686.*.3353205411/02*5C2+012.,)9>W4%"%$.B6/,643<;9AI=7/8?8<;@>=:CP;96?DFQ>'4CABB868J?COB>B8AB:8;?ED8@KPZZ]`\F>N\eUL[Va\V]WHUYS0<:<==;:;>><@GHGGMNLJJIHECBBCDEIIHEC?DPQIGNC<@FIKMRSUUPLGFGIOJG<2@IGFEGQQLXeecc_[XIF<2302?GJJKKICLMn]l}mYinFGproohY[ym|q`hA@SE@cP=OTC3:TZA8<:6133+).3106AECAGRQPTQJGLY`dYRapkcebTXgyO=>WurqpcHQW\I7=?=BYrogfurnrfdre@6CY^\sp>.[op~b?QVafpiYcX5*-,./010*4?C]_H9440176?LE<<>>BF5-.02434373?L\__[XWQKEHMHEC@:=E>4@OPI96GOZknjW;54?YRGQH179?C=CGUL2345768:78;2-+.0/,AZN<=EDBD2IriM`iSB3:clotm]IFI?9DKIB:7:<=<:9641/39=@A@??<@R^WORUROOSTB26204778876782;pkaqpK332222333333344336@KSUWZTGCHORV[\\VOKNSRRTVZ\[\[ZYXZ[ZZ[]]`````abba`_bluusurpnkM77876778888777777777777777777777777777777777777888888899:9;56d~{xxy{|||{{~}|{||zyyyvttvwwwwwuuwyx{~zxuuutts2243112222378778879;;=@DCDHMPRTTUTUWSH>?@????@???>>====>>>>>=====BPVU_i`^k_HEHNWZZekUBLQA=HQPKQNIMHKNCUxthkimpmd[XNCEEDOWXSWbc]\a^[`[KFKLX\KHPVTRQOKGJJCKYRVWGCGJNKIP]d]WZYWWVNIP\^TOMSaccgdYY]ek]PRSQQPOMLJKLV\[evtbhyxvwsi`efenotzo\TTVrxwymc_`_[`w~s~{gMTtwaq`XlXlypibptvpghkpw~vqttpjjm`G??FFFFFEBBHKFEKLKORRPMJGIIFFHJCKNUX[^ZVUW`^^b_NFPNSMCW[VRQPOMIFLXF?D:AFPJHHNNDEQPLRW]\UZWOQUY\Y\[VVVQTRHPLNUSMKSUPNPXSKVYJCTQMFKZPLE>NGLKLLMORUXXTV]^ZZ\\XURLHHQMJWXUVUZXifdb``\`aX[_\ab_`_]YY[__bfmmh}϶ƨ˽tlof]g_mtdqvhhnlt_|xykxvn|`]s^w˼ϼƹȸǺٸձѤطɟ̼âʮŰdh˿zigig~bk`\{qwtd}^QZrkbieaa[mtdnh|xxemt\]^MAo~fu~xoPQsVlX`}uexvklhiqdeAUzq{ZZKRwptslzy^9Jmzj^bowpIYRPPl[f~[}oa^`lTBTLBcgOkaTGAE[m~vaE?BHL??BGNI@48C:5=50/%2G<19<:<963+&-:95945:94,+068973*'11+18+"58-277+0783*+2.*7GB=BD8,&&0:5865;KPH>735983926>;3+-11/-,/26531521*4]N>3.-.*0D;YI!((3-*=IF>34:>NQPPT-,7?GJO9,+.5;73-+,3;=G=72(2826869CB769@9>=??9;CKB8<>AKXM+/AB=C<98@J@DM@>><@=56T^^LK^Wf]TdWKZYQ9IR@DHIKMF?M53C:===:79==:>DFEGKLIHHIKIHFDBCEHGFEDDMSLHNI;;GQWsumTlpRAFFC@WqcWRLKFACC?NmiB1RnV329FRRTRH>=?>DJL@57>APmwrgN5,>PPZ[A4AFLB+48:82)(-+)075;B1*)*+/8L_YGBH9ETRl{J\za8*;^fb[URJ?>=7@AA@=<<8@T]TR]^[XPPD674/19:863159>EPs{RR]_VG622233333333444446AKSXXZTDAEMTX^`^WMIMRQRSUZ\Z[[ZZY[[[[]^^```__abbba`dltvtuqomnR967656688887777777777777777777777777777777777778888878::;80>l~~{zxvwyzzyz{|~~~}{z{xwwusqtvxxwwwuvy{||ywxyxvt344333222357777998:<=?BFFGKQRRTUUUVWSH?>@????@???===========<<<:9>HEGMMLJIMOQRTUW\_XSROJLMHEHICNY`db`_^]`g^cicPNTPSEEUXYPLLQTMAGVI>Dj^SG6/,//+*),38:81/6310.JTO;36=/8A2FR..'51'4839?K\UM;97.+7DS]K.0=GLMA.5,/9<-9C821+(,5;=A3/+3;<4636:=939B@:<=A;89EF58A@@X]5-<9:;FK@BJ?D=>=747<=B56NOW[W_\E5E\^XHM^Xf]SjVQ]YN?SL?AILII?EL/?IA=<;85:<<:<@ACFHHGFGHKMMKGDCCCCDFDGOLGMN@;@?EDMKLNLNWRMS[\TMEEHABB;FOHM^^WV]^ejdf[E?5029DOXUF;4Cr`mysvwSEamrpnncekH8<@G@Psp}]=:DIGFDACQoyytj_SNJD:Eq`ZncC;==979:3,+,06<=<=AHPUZ^]SO|dSWWXTKIMQPH>jyqos~{qqthg_O:3BJJLSa{uuumjwnI34E\fbf|fIde=N^ea][VL;3;:3//11/.>E3Ibd`H+-=HNNC8:AEGGA3,-025646<18@?=>?C;,'*+9MQQRQMGJKCAC8.05:>Uw|s_;1GUZYOCDJV[Q=8:6*--,-,-11.BP0'(-.7FMX_`eX:P_WZmtO\`)*@ROPMNXTJG@57@FF?86?CGECILD>75D`uuxsaZK>963466667852469FR]f[KW^I42421333333444455446ALRUWWQD>CMUY]`^VMJKMPQRW[\Z\[YY[\[\]]]]^``_^`aa`abelsuttqomoX<55566677777777777777777777777777777777777777778888779;>;3Fu|zxxwwxxxxz{|~}}}~zz{xwvussuwyzxxwxz|}{zyzzyw3333322224678899998;=?BHIILQSTVVVVXYTH?>>???????>=============>=:JNKRWMEIGPenhYMGNOE@HaqcTcm\OMOVRGFDBBBIJJX\V`h]Z^ZYUNU`_ZUSTUTQSURQMFKX]bszwurokjmlli]VZ[`knsvmhml_TTMJlxqg`[\VZeo{d\gqnNdted|~USR]peQ^]LPaty{wjw|ldluiehk{~dzh_imfi||skl_KEJGLRSSRRSTWYZ[]_\VSUTMOTJCIIDYadhb[\^]cdabf_QQVWUJOUTZTEEJVSEALR?BWmbp_cissNoNPV^}vszhzvpc]\OHY:0_W:KkXMGGuqcVScVE84>ALRH@5-4;=A7,99/5:64246,)12124553103;>==>@DHC=>:4368/.2020-8<2&!$''&.8798FP8-*%%')+/32/4559<;==>>A;,-3;@<13552,&(*-386.++,0*,-46?94<>//655G@.),(,3652<@BF?6>;8/.;<=4/ISMJ?.6;)+344=?4/-)&*5:<6-('8C=46088433@D<<7?<86:A:-:@C4A1439<=A3?QK[XY^R76M`ZVIP]\c\QpXXbUNHSA>DMNHE=MB/LHC97<66?<;:;;>?ADDEFGGHKLKHFB@>ADEBDFEHOFFP^mnepid{T>LWVUYZK<::>:1,0542.8I?DZcf[9+ASND=89::=>7/,,,-3454=42<9516:0+..+5IPMKOQNMOI@F=*1O_Z^u~qE4GFCIGDBKmiLA?5+-1232.++AO-++.04:F;246656529KNBI]_P=1.232333334445555556@LRRSRJBAGQVY\^\UNMIHNQSZ_][[ZXZ\\]]_`_\]^\]___aaacfnuusqpono^?566566777777777777777777667777777777777777777788888:==75U~}}zxwwyzz|}~}}}}}~}{zyvssvzxw{~~}}~}{zxyyxw112322213458:899998;=@DIKKNRTTVVWWXYUI>>?>?>??>>===<<<<=====>@AAACFJNNJHFDGEACECBB>=MeX7LeWMTbXM[_[UBDQJMem]SPNSIFKNGCFR\TJMQRRMKFC@>BIOOPOJFDGWcjlc]`UGMP[ge^djeZKMTNFDFNG>FLMY]VU\cb[WTEAJWYVTTWVQNRTPNSSLW`\aknkjhs}wtsne^bdgmpqrkfkfVY_RXtja^WZ]aqym_hpkaejR<`n\jjjy~udSPU^ny}ynqzyt{wdbe{ekwvortmqsyueRMQRROTTSUVVWXVVXY[\WOPTTNRVIDOJJ^_`c^TWZWaba^^XQOY^[VXVMQYF=>OPEBCS>A<@BD:DCISJGMZXKLWH?EHSQOYWW[_]NMW_WFFINJGIHFGGEKMCLRJIRRTYTVTZ\c\[ZY[]_^`^\efbdcdefhjggih\]fgdeabfjlhffbdb^debeefnmgaciihedifgfж¼¶Ȧ|{mZZYmu^aYXr|afsyoswon~\iclqsìŶ˹ʿ´ӸпɽüѽҸջ͑tř̚տǻƛztuh|mp|jsoob[hisbYhW}u?Qk|]R]OPV_gUgjdlfQVmXV|qorsqdop{u]x^XspzsfxqNZtoq{n@mlgfcSHNebuhlupqXQF\eYscdhorPpK\dc{qtilW[YT_F-@YA?914;5/1201013.)&(*+*+-/8A?997201693.,+*05/-,(*/0/%,73'??%')*+)(.2-)-214/235>=@<.1>;?9-35772)$&(*,0+'+(')(*(+)1/051+/:@515.((+-8<>5<=4BHHKD@3+3/,+)GSOH:3C6.(.(7A70.+(%+5;7/.)-:>842.66539E>7<6A654:>1/?:>UaF==7886KO;74=+439:>@3IML^WY[D0:TbXTLP]_a]Tt]\`RNIL8=GRKHB?O1;SF@48927F:9:;:==>?ADFGFEFGGGED@@ABCBACFJH@D@@>@GCGFEMOHMW[[VUPLOMIABQPIRQA@IS\_]efid[NC?510:V_>*E[jibyn]j~zwxqk}zmxDIF:.DzgD7QtJGkE237=75::0+-,*).47381,35,7G?/,/-,/>JNOJBBDGHDHA,7j~{}~P7B4'0;72Cj}dD9@:.-265.((,?K-//13568>D_gB206:B\xtO+/69D>0=WZB643;B>7655;=87667887?AQ_U@755332334434455556658ALPNQPGAENTWY\\ZSNMIINUY[_][[YZ\\\^_ab_]\\Z\_aabdccgpvtrspnnnfE366566776666667777777776677766777777777777777788888;=69]y{}|yvxz|~~~}~||zvqt}z{}||zzyxxw011122222259:88999:<>BGLMNQTUUUWWWWYWK>=?>>>>>>>=<<<<<<<<<<<==>ACDFGKOMRWJ@IMEDGDDC=AUaQTjj[V_\QXabVAAHIKTYSQSLD@BGKMPMR^U@7IQFFKEBCAFLNUc^JCBCO]equp`MIOY[X[ZYai_PTNIPRYXHCCEO[]VNMXZPMF=BGGJSYYXTQNOQNKSbe[XXVWUSWboqw{rhccfhlpqqmloka[flawk}zoa[TRaovobh}~{thL7KLKdtmkm^OPSOM\hbejcgthYnmchzsvwvzskpzqlxs[SWXVWTTSRTTTTUPMVXYXPHINPMSVIDRNMYXZ_\STWV]c`\YUPQZ^^[YUIIZO=:ELAF@H=A;?8;:CGF>JCIWOIJVVKJNHAE@KVT\WUZW`YSVcf[PJONGOJCEKLHHETWQOXY[a\]]b[a]\[Z\]a`a]Zef_bgbcdfjbehg\\_aab^]ahifdebaa_edaeccjhbachihfedgleiɺͧǻçwzUVUcd\WYp~j`vrknsblu[s\q{vƮķȷůæüȿñžĬžɷʼպ˳rմȝΖòtxr}spuiwrnc\hww|ZYYXgS>`sYelLTYX^KnyjllbLjmCh|ohhupduuysoetWXkm~k`vmEk{}p|qgCnn^UXKD_jjqav~{lWOL_YSrj~ydcvlu[rQx`totsNQZ^Wg/7NC8Zob\W@Z~rhla>49DIDELL<5GEC:06>5/10./1550.-15641//07:7530025:;3)#$(*'+1-.980!!.2)?9*,(+,,,2/(,//12-,)/9:?10:66937;72.-,*+,-,+'38/,**,,234/.//*4<;=3)/'-2157:>97-5KSD44409;2($-/7676>45-819=2133+#-69-,7:99875/03:<7>A549<87>7>QE8CA>>/80.1498B;7LHP\UVW=0>\aWQLR[ca\Yrc^\PJIH6@ADFDDEEEEFEBA@@@@BEGFCDFD??BACA?HPGDNUUSUTSTQMGDOQGGI@?FNX^ZWYehf`YQJ;2.+BSOfx\s}vjSV[ZjojhfYikcn=VW?-?]XEFGM_KC@\qD,*6;;FGESgspd]a``m}svyV:9754469;96424E-//25:=?<?618:6875884;>:9Leigi[H=;<>FJRXJC@DIKQ\Q6.36:BJKD97EWT@354433334444446666776;GLLJNPGAIQVVX[]ZRPNJLTZ[[^][YWZ[[[]`cb`][Z\_bdddeeeirxwuvtqqqnK4675777666666677777777767777667666666677777777789:;84Dl~vy~{ww{}|~||{yvx|~~||{ywv011112222359:88999:<@DHMPQRUUUWWWWXZYL>=>>>>>>>>=<<<<;;<<<<<;;FMNQ[^TMHCCFGOYUU^[OKKFCMLKNE?EMLP[SC?BM[_bnys\NKYdUOUVWUVSShbTadbUHIPGLUTRNJNRKF@=DIHKV^\YZ^ZPNNNP`wm\\\\ZZ]b_grwulikmnnnmnkktwk`ikYVkxllpj_VGKUXbmuzuREJHRbrrjg\QRSMPglbkwot|b[ojr|{v}uupf]`fp}{kXUUTTSQPPPPPMPOGSUSUMGFHKHPVJGROOUSU\XSSUTX_]ZUMOWYY[XTRNJVUE;>8>6=FNPIGKIJWRMDVTLNLJBE=H\WTRTXNS^SNZifXNOQNTLDMRTJIMY_ZW[ZZd[W`eX][ZYXYY[^a\Xcf[`f_[\`d`_ddYWW[a^\^`bcdbea_`_ecacabddcffeghgedghqsv̱¾z]OYduk_QWt}kdwmekp`gyz]VkĶű©ĺŽ·ֶƹʻ²΢˱þһĊ~ٺѸݻŹϔǸvrb{w|}tcbncka[YTRVszMWrѝW|zZfYYXLplmql[JqZByihZbxkex{Wcfb[impiaxlQt||e|inQrnQNLDRnzn^d~|wbYVM`UProslwbamkxczcTp~|tF[\c`a/DL;Edjs_ZL6Twhk}`I<8@FB@KUG6@E>816:=74CI:<>23:510226:;:878<@>;83/+-479;7/.7@A;* $"#+4505:2"!%%,*)+.,')*,05)*../1.)!(77=7-454747653/.23/1*%.0*2115811.6;67:<@7-+$7QK8<8:=F?55.')1:9725ED983588*$390#*=F>9995,23>><>7026F8/04>3*=8BUPJF=8<<8>=8HL==D<;;1>+/1887C6>KFRYSTP93D]YXLMVZfaY^nicYNHJE6>;:<=>BCCDFGFHGEDBA@>?CFFCBEHD>ABB?N^[aliI20Fioofcbx}yd6MXJ;75;KRLJMJGE@A:56:::<=75@_xr\LB8-**+3>@>EGE?=GNGB<>JJIF?7334428@?87752*+,,.5<7<4-1-./..1:FJD>CYZF4,3PqoWNE3.CG;H\SAA5CF0(,.14-*?G1/.137::89FUXWU\Q9<[xe]S23-/<;35557;9;>:23=@96447?E;1_ng`WQD9ACFOXWLGBCQ^feN6/257>LLH@9ANG3212333334444555666777?IKIGJLECJRVUV[`ZQQNHOX[[\\ZXXWXZZ[]`cb^\]_befhjhjkikt|}{||xtspO457677666666667777766666777777766666667777767789;967Sx|~}{z|~}~~||}{yy{{{~{yvt0111112233479989988;@DHNRQRTUUWWWWXZYL>=>=>=>>===<<<<;;<<<<<;:AB??CKNLLMNQPQTPMJE>@GJGDUe\]ie`\TKB<<=ACDGMPSVMIHDD?CKRUMLHVodLGMIZ^FCIMLEGOF>IW[^`lzxgVNVUMSXYWPOMMkoeh`YRIJWKGNKNQKJNIDBCJLOSY\[]`ilVLOVVXmsidba`ccbbgpuoecefdfoussh`t{kljPQfotnbjshQP`WHSlumnsqroZFDL`strrutbWSQm|ptztz{h]X[^pzyqrvkgolb^afn{{lZRQQPONOOONLIMOFNOJNJEJIKEPVIKPPRURQVSSSRPTZUXRGOZYWWVRPRMQUS@:?BD45B@=CDPY]ZSTTVOSVSDZTSTPKAA;E\XIMPUQGXVHHdeZQPQRUPJVXUMPSVi\SVYT`QOadXXYXWWVUVZ^XW_dV^d[TUY^a[_eXTUU`^X]`]^cbea``_dbaccddfhjjigghfdeaa˼ȶ||tO_umkfQSxknylano_by|bokȼ˴ƪϽɼԽ׽ŬеʽĻäʲƿ̾¥zۿɻӗsqb|}~uwcYxqp`Ydjasz]^YIsgYẁgwsr\bPXtykuqePPoYVg_[Uo{sszqsMbgzatt_hezrqsup^xou[qpHIEG`p^Wn}ol_`^OjXJqqkco`cikr`tYuu|rVZYhrX6NABPVo}p`TE:`fvZLH=::>JNNK86ED5/16BC77C?-1A=3210047898799:==;87641+,16>D>12?>3)%%"$17104+$ "#%)'%)/,()++24+1*+./'$$265<2:6344698982.287-('+1(%)-2865-''* !11*/+./12+15=74;>;:3-(.E[SLA>;IKBGA*-2:C;727FD774797(%33*&+:DA>==4+24B;;7...=D3/.5=,/:ANJIFB63=<8D5>LB?>A8>467(24;9]@I1:46BG8?=:5HA8867=@A@CFGGIIGFDCA?@EIGBAEHC?AC>:?KLA?GLKJQTUXTQRSQJHKJIIKOZUJGQ^c_[[bf\HOglaR@Mv]_\fgM/4a|pcUlpTgQ0ATPE9-3FNLJHHIF:26<=:6416Pkka_`dc_^\Zenw~zvofV866641,)+.269@<7543=B0.KO;446Jd[TOJB@AA>M`\MD=>I`j_A3.4>DCGEEC;:@<2333333333554677767767?JMKIJHBCJRVUV]aXNOLIRZ[[[ZXWXWWYZZ\_```]`ehjjlmmnpmku~zrqU64766666666666667666666667777677666666677777677993;b~{~||~~}~}}~~~|{z{{{~zxvu013322113357789999:<>CINRSRTUWWWWWXZZM==>=======<;;;;;;;<<;;:;EJEDKTNGNRMMTVRLMTJAHKJOQS_d]Z]]TIFKLEBHKC;FPHC??BEECFJLH>>=HiyhZPLitM=HHE@LbTCLT\_dntuiPH\YNTZSLTYSLZ`ccRJIEGMGFJGHKLJJKOIGMKORRRT^`kv`UXUT\ksocdecd^_dddgijjgfadoutrhZfvqqjNQbbccbn|{WOngMTd]`qx`CDHL[gpumfebadsxihppytNGWWZlw{kmzuqsqmihhkwzn[OOMKKKLMNNLJFHNGNPFGG@FJJHUUHLMPQSQORPQNQOPTPYWIS\[^\Z[XVVVV^LE@AA<739A63545><(%.-+007<>AA=1,1=?351,,5F9,*/87+3?KG?BB>43>8@<9JE@=::7>1:..17<:@<A@<=70,.8FE@DUfjb^^_XV^kxwpjeI238961+(*+*',5>914=Qgoi`^WMMPKMRIJYbhswsos~~zrjd]ZpoFT^de^RSSOZjikk[TVYZYSU]^^aelrtvsvm>.4766?VjdOFB<5015;AFJJECEFF==;5201=AC5,470-,*+-;PD5=0011,6LRIJI=8=B7*-3:6;gxmZ9,;NKjdMKHMG52<]gJ-.9CKTQD<;;97554323333333557788777679ALNMNNH@AJQUUW^aWLLKMVZZ[ZXVXXWVWWY[^^``acgiikmmoooonxuu`:465666665556666666666666666666666666667777678999Iqwx{}~|||}|}~~~~~}|}~|zxtr134444333556889999;>@DINRSRSUWWWWWWZ[N><>=====<=<;;;;;:;;;;;:=N^YSUTGDPWSPQQKDHLEEKKGIV[X\XLQUKABMXUJLMC6BSH<9<@HRRLFCFGHHPgwombPex\EHGFBLbgYYahjlood[JN^WUTPQY[PLJLNRXNJLEDEDJMJGGIKKKQPFKJLTXWXgpu}gSYYPR[fc[`cb^XZdjiosnlgfegggqobbfoywsjlj]YY_bjrXUdZV]_d]HJFCL_rudXbhjporrdajxzyiWTS\ekunpxzwkhjfinlkleQFIJGIKKKKJHHEEIFLTKCD=CHHLZSEFLONSOLSQMIQMNOM]\N[bbligmjbb`Ze^XTIFQW`]bdY_[WZYXZcYYja`bbfd]\TPGIQVRSSRNRKRMBF_XSVMKQLMYZYSUOKiUBH[SYOQb_SXZYXXURRTQOQQ`WTa`WTU]_WW_ZPXXTXTU\XW[_bef^]c`aeghhhhgimjged^aeki|ʻΪunm{rTx}kqdnrЬåʶ̬¾ǖ˟Ƴͷºӫvפ׵֬vuǬdoms\cquss\LMd_yuWw\]suoyjmDap~suVZW\pifZOSevqwezYaneg{}teU|v`blbar\nlB:=JTF?@A;3/*-=A7;<*!&))&%'(,,*'&)+*/24+'+-/10-')/.(+02++-,.,-2/-0+'%#&+/,'&&%$(!#&*/<46:.0/0/949D,'0<2+.,06-(1;?71.-,.00.GTB5/HJC5.:>03744C7"$*+152438@A<0./B4,22,.AC/'*29429HC9>?A90=873:838)33;;>A9CDCFOION5EKSXXMJbZ^jea`^\TKRHN98LlR+1Hig>1BNI>AD>ANQH=72++399741/23=FUiMIRH?ND429BNK4-9=OS@;C8@NX^D3;IT[NFvq-.659@FE?;<:799569<<75>F=::846IWVI720;^_?-7T_YYRD:668884333333333557778877775:CKNMOQI>?HPUUX_`UKKKOVYYZYWUWXWXWXZZ[]``acghfgkllnnos~z{lA36777665555666666666666666666666666666777777771M|vuwxz}~|{{{||||}~{yxuqo555555543557889999;>ADINRRRTUVXXWWWYZN>;=<=<=<<<<;;;;::;;;;:::=JXVTOJIMQRMGCBC>9@KJGFIRSOKHFGIEA?AM[VPJC>Tg^otpfevsYcbglrcPvaPPetraYRf~qz{qt~bHbqyeKUM@AJPRSNC;:91*)**+033+&')++*'''+038;;<<=AC?3*((//2;8+&&**$"+33-'*+,-/11().--.,*'-2-,11+'*+)+,-,,-(#%%$&)+(%&((%/,$(%///)1'+/49>446&(6:1-301C2*,-8<7961-19<@QL8:ED;5:LGD6/<9/34445*%&)*63.1,4=@<-./@*+/1-1?7++-7;89AD88<>B44G?97BH=<9542;543,63;<@@=G@?ELDQ?8OQTXVNQfZbjgb^YYONWKH8DK]\QLRLFR[YHDA9ELDDE?DQWL7BJPRQNNQQONRZadYV_^PKTZVNKKMQ`jfgjg`_ZRFLc|w\zma`K:8A>4?:85247:=;/),/5=@DUiojf_OBGVXIBfthlkVVup][]~eJPgwhbVLGMaricvwuwk__`PTkV?KICTcgikv|fB462.2;ELOPRSF<839KNMH?A2GPH@@FNH<=AE>1.*()*..7??FM9(.+*+,.//0231/,/56336F^~84T;/?Rv{}]C@IJLK?46DPVP=4>JKOJ?XPGN^_8,LC0,/:;44;A@B@:46COJ;3307OKJ[Zoib`VNF=9<@>5212222455578888887776:BHMLNOF=?IQUUY_^QHJLOUXXXWUWXXXYZZYYY[]`acffdejkkmpqs{~wJ2677766655666666666666666666666666666677789964N~yvvvwy|}~}{|||{||{~{y~}|zxwuqnl67777654445889;;::;=AEIMQRRTUUXXWWXZ[O=;=<<<<<<<;;;:::::::;;:8?@?=AMTTRRH@JME@JRK@IcodSMOPTY``^dmdYaebc]UVXU\_]glicYTNGEJMNRQQZdiXOUKQ[UOHCPZVOFDEHIEGU^WNSTU]^emjii^\TQX^ZQQJGNPSV[\^djnrkccdd__pzxxysixwqebtm_uz~mnqiefoquvd}ERXQOUTXnzxxvulgnrmqv{ytt|xlhpjglqskf`Zerh[NHGFEEDDDDEC@AIE@DEJTODBDDEJXTBALVCZOHUVSKTLNTVejimniqrpqrphc_`bde\[T`Y_cZPPMV`ZOUl]l_ecekiggqqi]OSQIKWSXGPQGMDGSIHFEKFKXXWLNNWfTUR]WXT\dZN\_\YXVSTYUSZR\b]fjjdbccZWTYPT^RQZZXWW`\ac^^^_`^bedcdfhjkhd[bhjq̽ĴƪϿ}qßϮ½×Ъv˝ѫε۹ռٻ¸ƿtn~y}jbQf[vNSLUr|zr`ZfZUdozċYsqbwiOOUyxpbRvQ^xx|fljI^`wsPtŒZv{llpyi^aW{ix\mrhRl_b6BdnZiw|ceqjYf]klvgZwWJIcw|\OLg|rwzykuqSMuuD>PEXIRsvLQfi`ywreVZkcEGLHF3=IPPFDC<<:DRPKIKH;-/--45+0+)(''''()+.0467;>=<=BB:2**.,+4;2()*'!!'--*(++,-.-)',/++**++12-/1,('&)+-.-,,+#"%%%(()(''((),.&(%+#*"$%$/05;1*%*+1.50:/+H9--*4BBI>146-41=),-/-16+-23<<>;C98;89?;?I969I@6<6333;44/136:?@AFD;?DDAP/CTTYWRSYi\flfa]VWLQZMA=ORaYTTUKH[aODN>>HNHLF>LSTLADDEEEDCA??@@@@BAABBAA><9>98CGNQPMNSRLJLT`fe`a^VQW]YRNMMM[d[XbcfiklfWPVd^iSDmmZ]aO778roC.++,7:87426=CA4)(+4AKGNahcaeaTORU`^Qa}d`ebY^orfYRfu\Zkoe^VTUTLOXe{sRM]fga]_mrcj_>MKEXdkytmbS;.21.*)2=AA@A?=;;;BIJLH75IGBBBD@?CACD<372,)*/1224HO<&),*+./-**/1.,-.00/.03@yx/8VI0F^}kJEG934:GPJ901BSWQHIUVQTTTVVNK]a5-:?GG87A?BEC>;9:<<>?5)-1:9>OO:-4490'/4:857:=>?>6403?<012113<]|{uUOXLIF@;;CC6212235665568998887777:AHKKLKC:=<<<<<;<;:::::::::::9:?HNLLID>EBAGLJEHV[TJJQ]_X^cUHOMLQZc^RSWS\ii`XTTR^dOGKJJHIMQUTUW[]SSUMKHBLWYZLIPOMKHMQKNTSOLHPX^\OL`h[X[SLHHPSRW_`]]_`clkdhlh^Xajko{tjvwv|mbsql{lNPcjw~{zbisWRUVWTUd}vtruriqwyxv|wu\`kaiknpkfddpyqZEDGFB??@FJECFDHMEBELRWQGDCEJYTCBNYOUOLYVURXTRZ\foopmfhlogelhabYY`[V^KWW^_YZ][[b`Wbjhk^dcgjbaboqhf\VRQLUYTUGRGGGAHC@@DIGKYXULNUafW][^[^_bc_W^][YYXXY\ZY\Y]c_dlkigfd]YUWTT^SM[_YTU_Z^d[[\^`^`cceegijhfdd`i̾˱ȭ­z͡y}οȤ¨ſ֛ոɤ׻Ұ͹ºƨǮնϹ³yx|fhUifs_Z~svYOQVmvOFP]VV\ijwwZp\ajUZST|ox}Oi{Mkrt{{`aF^cv]Vrqykhw`V[_}dumhosQmvfV5Fsl[fcgfg]^XhoqnmkPKDbuSGGilmvlvewdNZ|}l6QKSU?ccKN`\eccd\^g^S[ZC=6FVPTVRND=?<>FUYPO[\XSD49-/952/.4??M?183;>FKMQB95CRJXF62('+.21.+07>?-,1---,,5D@.:6<.-,.-0/(1888<@=A6<998DDAC76BC8681204932,126?@AFK=:BBAGG,NTU[QOY]iZgqd]_XVEV[N@JVY[ZVZPIOfZAMRABBCEDB@?=>>>>>@CDBCCB:9:4DIJONIJRTKEFP\b`]__^\^\TNGCFLTXQUa[^lkkigeaWRDYB:RVLJ]aE67<=8;865440-:F=8>C=6/,++.+(-6::76788:><:CFTeiffhiihb[egYXu}tvcab^]^chli]\hi^URWXW\PKWSIOQOJGDDOYU\jxqalmECPYRX]nufK7,(,./,*.:CD@978;@A?AEIG99D;;?8/6FJ?<464:80+,-0206OVF2,*)+165.--0/,*++-..00Et14JQ;Mk~N+/0-*1ITI3,.6EPQSUYYYYYVRPNJY^/,67>BEPZLE`}u:3:AEIC:5/-/14:;3(*7>77>=634460-589667:><;920-,121221229Y|gB7?A??B<4>E8111356677689998877768=<=>CE>>?>@BBBBDFFP_aZJ<@HOD9>EJNPPJDA<;@BACAEFEJLGGOMKIGJICGHHIIQ]YQUYUVai`UOM[ncMINLILPMQ[\X[^`THFLLIEMUUYPLPMLMJGDHPQHDGIOO\[QT_ldVUPLJMTUVU\_^^__`ekmg`aYSV_dcirfY{ufTdrLb\EZiXTpvj]Qb`QRVccf}rnqurm|~yxwyzrttkikbcgfchookprZHGFKJE<<@ISNDNMIMSIDLRTYSKHEIXXFAMYYOQO\VYX\\UX]kpnmlcahlb]jgadVX\SQ`TZ[^bcmlc\ciaehni`echg_[]hicngYXYSW]UVKLLAGDEJ@8DKEJYXWNP^dcZ`_`\]_ab`_^][YXXZ\]\[\[[_[`hhfccb_[WWVU\SMY_XTUYY[aZWZ]``_adfegjkghcblxɺγɸӽ¸~ŭŴ|j~ƵԱǿէȓұºռɽǯͱӲʤӶå{zbYaJxke_|XN[UTUas`BEYgQOWje~`]^O\[TdZ]rmunM{`u`bsumVHZfo|[h}r|{lw\QVibmv]tzMlinO?Ptb^illjcfVQftdv}eQJAatG?Ij_erydhaw`Hg|Z=\KaGRyxZU\]VRQUYjiOJbX6:DPdXT\a_SG@=>7;WZQMIScU=76=9--+,2444550-,-/.0434>HA>E;-3;5*,54+)--&%%&%'%%')'%()/+'),**23,,2.*&(,0-*))**&%&''''())('+.* !+/&$$%',((+%&./22-*.-9:A1:62007AE8SF6A>CNJ6>EBCK68QUU\IO[_cXks`Y^^S?Z\ODVZZW[YZJG\gGDX?D[UI96=;=BA=ADCA?>=>===ARI68>>7<;>;9675:>9:AC:527;61.07ADA@=:9;BJOMJG?//=JMLB855=PaG40..//06;5++/-,*)'*0369FUbdlsmrwe\db]]^apyvrp}{lfccc_]^agh][daZOJaiXh[IW]LNTOSVG8Ga]hurd^j}xU>Xf=DVK`fX>/30,.221:FHD;738;<:=?===FG>?=34QN>52,948:5421230;[O:82&&+-/0/.-/.)),-+,-2-Bm56;HD@[{A/8:.6LS?).634EQVWWXXXVUSSPM[`0'05?JRb{`6Dtm949<@EC=730--.385039=<>4059?==>==:87678<:961-.0/02222452AbkPAB;<<>EJ?8>6123466787898888768878=CHIHJJ?;ENQSV[^UGGORQTVSTVVUUWXZZYZ[YWY_fiijjikkjkkjn|yuC3786554556666666666666666666666666666779<3B||xvvvuuxxyz{z{}~|zxwvwwxz{|{zz{}~|{yxy{{zz|}{xyxvxyvsqnjh;<<;<;99:;=??@BA@@ACFHILPQQQRTWXWXXZZRC<<<;;<;;;;::::99999:9997>HJA>@>=CC?BBBCBAA=@@8Iej]M=FRSH??DMMPK>5:IEAFDDC>VhU\|sq``av]FxzuRH[SdEo|{u\__RKHHLejL>_c:9\ZaYcgioiWNG>??S]]e_C4C@-,.1=6-)-5612462/,+++,-.-+189=;+#094-.1.*)(&&%&%%##''%')*0+')**+2/+13.**,3.)(&())''((('&'))(&()%"" #$%(+&*,//-/3-,100:AC4D<3013@LDX@1;?E<30BC5:3DP@LD35;698./30:7JJ+,,)-,,.5A6':>6,+./-.,;C:08?8@:;>19JC7=A6:=::2217233.--148<>HSE4@GCID-HLTV[CS\a^XnoZS\gMB[]QFacXU[YPEPgT;BePCDCDcSCNUIB?=8=>=<<;<>?@BCDD>>HCDHGFHOG;;HUWOLX\Z]afhcYMLW\XPOVPJWjhcjliquib]mlMRjx`KC79:58@@8>=?><89;:76B?A@A>;;=AJMMIFC@=BJIKE=<=?CE=5.258/-6=<655.)**))/49;8AKQqmot][ga_]Wi{zwnoxjihcekb]]ad_UYdcWKKcmPboscYTLTV[hcGLkjpod\_p|v^Nip;6TJOci]JL?--;;149;::7::755:@>25EHDFHM_a>0.-6?46;AA4121.>R;099=;<;6.+),..+-..,+.2/FpY5<<>?>AWuT.=B14KM1$1<8/9MSTVWSOPW^XPQag:(/5>CGVfZ?RvQ==;98;:876/298:?:9;;3.38=8337964467665540,.35201322102@E7;?999>IWU<24224466887998888668879=CGFFIF<?==<=>@ABBBDCAADFIKLPQQQPRVXWWVWYUF:;<99::;;::9:99999999989>=:>AC?=C>:AJMBCHEA@ALC-(02EA>0/;>;9/04AD7JJ+-.(.,-.2>/$8?4)+..-(4@A8.:;8=9@:3JH6:H?5:981*0;821.-1.27:=ALV<1HHFK<2MGRV[?V\bZYsmWOdlEH[[THlgXTZWHHab=@PhO?C>NjOHWSC==OVLX[PILH<<@J>=>@A@>==>=<;:::=?ACDC>BGBCGDFMH97EQULEOZYW]bilcWT\ZSKMQSQYhi_`hfgnmijnomZNM\rZCGA8669A?9A>?>?::=:57;CD<=EKLA5:GD=>??=;<>=DB>@BELMHJKIFAAH=36>7-399326:=@D>/'+3/(-8CB:=>Cs|hokWbj]YXZdighhinrtmd_hncZ\be[SW]VLFGNGKZekMUNJNQmpdlqkb^W`z{hOUqsT;N_U_mqldM/,??2/0388:@=6347?H>48=@GUfjJ/.20ADDEHC89DLNQUZ[OCCKPOMMORUTTVVXZ[[]^\XY]_bgklnnkkmoonw]75756656665666665555555566566666776668967e~}ywxxwuwyyxxxy{||zxussttwxyzzz|}zutrsv{|{}}z|}yz}~{yxwusssrpnlii?>?A@>>@@@AABDDEEBAEHIKMORRPOQVVWWUTYWH;9<:::9::::999999998789;<;9>BGHBA?EILQKKNGAH`dTY`E8?KLGFDEJQG?BACCDD@HXWLBCFHJFM_\MIIGCGNNORTUSPSOO\a\]hh`VLOOYbfldXOME@BLTNLKIGHOROHEGLHIIKNPTPJBDKOU\YX\YNHAHQOLLRXVOM\^\_aefjjda``_[Zgupg`^cg`dwtrqn_gkghd\l~lUNUTHQdaU`z}x}oylehifc`gkemmtvmpuunpwtjiiiopkbVNNRRRRSSKLZVVWSYYVY`]b`^b[TVWZb_WIUaS[YY[X^cfdhknje[]_T`\ZVVY`aU]caekhhhdbqole^b_]_gjbZQYYQLRQ_Sc\P^\\QQYU_OIUUJDEE6@MKJRX]e]Z`\Z[`]c[X[`^Z_U[Z\\^UQWVX[[QPUV^_``_a_^^XXXWUTX^WUVXWRSZ]UTZ_``bdgimlhiϩȽſù̻ùϿǵĹuαkjf}Ҿ³ΞتӽȭӹΡçzwz}Zhvq{]KS^\q~l]tW>hvkbZT`|taN_|ea__]_pvQrq`hbUQTs{hpd`vjqWINGgcMh`fx\\|uVOtZkux\hWQZYereXqQL^lpyz}pSI^wZtT?A[uiLTfYCDoTcik}_JrcA^SWI]`otw]@:9BFOaI0DZPLYYKXqulnxlTPPHBEEX^NQ^P>KJ?8*&282,122.%"##$&&&')*+))*'%*8?1%'.32/,*()'&%%&%&'''((,1+'(((,,.363.++1.*((()**())**('++++***'$$!"$%&%&$%*.21,++&*227=:24NI:39?EI+%1/5:<02//<-"29+674'&44.22016A7@I1/2*.-2/,;.&9>3,,,,,0>=<6079;7QUUTVLQWK=AERHB?@B@<<==;:9987=?@AAB@CBADDCHE98DPNIAHUXQU\afaWV]YNGKPPPZggaaa]]cd`dklmi\TOQZPEIHC?=>A?=CC?@A;9::9:8?DEDFFE?>CID>===;:;=>@A@?@EMKGIIEFDHK909B:/3::;;:89@ID2&,>:-0=FHEE?Etmae_[nlUPQQRSZdd_irsnSUnp_W[ad[RVXSNKICBNSLW_PWQHIG]y~ztsi^_W^oo`9Hnxa@:YZU]aekV1-@A3/29<:?GB7574=QR9/2.4JdP.#1>=EB;>8;>8@J9)+.31,+:G7*.>==FLG=99:;99858<8<<;:99972()/1,,1793,-..0348=;5/.670.5@ED:2577;EH=30113568998888877775667<@CCEGHC89CIMRUVULDDHLLLNQSTSSVWWY[\^a`^\ZZ^flmllkkmopou|n=486556666666666555555566666666677667;61Q}{}}|xwxwxyz{{zzzz{{{{xwwywtxzzz{}~~{z{~~|ysrw||z{|zwv}~~{ywsssrqomjjji@@ACB@>?@BCCCFGGGDCEHIJKNTUQNQVVVWUUXVH;9<;::99:::9899999988777858BB@D@==HSRTRPK@8?AA@=BA@@=CLNTYJCDEEDGLMQTTUXYXQMRYTR]^fnjkZ\haYSQMKHJMONLIGGFIPSPJIKKGHTYOQVRMFGS^[TW]ZTSMGKNLMJHQRMIPVX]copkjjh]XVVU^qsfcimf^`egijjdR^pkdpqv}`NQQIISWKciWYlfb[W]b`_cdlyuvvfmrojisumknpv}|lVQPQRQOOPMMK^[OVQW[ZX[\cb]^TRX[[^^]KRdSZWY^X\`ddghifd[Y]S[VZVRZdbWbgcegcfkcbmnlbY`b^[aa\WLUQMIPQWQePO`ZYOMRQ_OGNZKB@@9HMILTXae\WZXVX`YdZTY`[W_TXX\afZPTTU[YQTWW]_ca_a__b[YZUWXY]VVWYZWX\aXSYaehhiihnkfh˽Żÿξҫ°ѫ±wdkqČŝθٸºʸŬϹӮũlrk|\vlrySPOahk\`oM[sVMonUur_czUVegf\dvoeWsh`omTC\xhlp`mo_wVLGPhRPrsRl{hZmXiQwQhxtV^WKSTZogYnJPWrp~kf`VczRpPZN5=[PGVYUR]fjr{hSQRME=34519NP:6IKD3(+7:,'-1,'$#!""%%%(((,-++&#$2;4)%+0/--.,'%$&')()()(&.3*'('(**.551.,-/,*)))*++)**,,)).-,-.-,(%$""&((&%%&,,-+*()&)248=./3KG;5DCHY;278732//..-%&5E:'GK^RCAD>@9;C?988889<>>>?@CCACCBDC:9DOL@;?NTPOW[][VY]]RMKIHISafa`b_[\YTY`cjpk^UPMPQNMKIGFFFFDJMHBE=99:<95:CEGHB>?BEHDCFC@<7:?ECIPMFGKKLLFCEKNB53>A:1386;=;759@@2(3BA?ADGGFJBFh[QQU^kcTRRQPT]bZZeZ[o\TkhWTZ^bZQ\jfVMPUPUYOEPYVPOMNZkpx|wh[`^_`h\,:YkRC9GPNMHKcY1.HI5/6?ABCEB86:9>QUE<3)AL=,+4BNKFBHUKDGG=9FRPe`,(20B_bRA5DI:20(+=E9AQQM93;68CD6+(/)-19@1(,9?6*0>CQVUUMGBNWT[gH,)2CD;7423.@fH4::=BFLH;555648837;7=@A@@B@9734=C;/07;4/...0249>>93010($0CMK=7766563-.1013679::8888777775667=ADCCDGKKJGDEHIJLOVXSOPTVWWUUWWJ:9::::99::9998899999777648CPMDILC<@FNZULEFFFU^]][YL>DD=MYXNE@=?PUQOE>9?DB?>GW[C:FIJMI>@JCAIHJNQPNNRX][[^XPQTZhmngTU_UIGIJMROJMIKNMMOORTRMMNJFKacOPYOFGHN[^VVXMMaj\OLOXWLHKHACKU_fgll^[b\QV^\]hkiikrk`bimqrpnxxg^gtqcSPUSV`Y]mn}mSdccca]XX]ZVaqpdepiaqvjksxwjinusloVSRVYUEFIEJP\[VWQTWYYWW^]XYQSXZZZYZQN`SSUWYRYY]`bbb``^Z[VZTc`Vaid^ji^de`foddpsg[T]ec\YWWSHQONMNPQT\NP\WUTRQPUPDIXJDHG?EJFLTX_c\WXWVYb[eYT]b\Z]VTTZ`ebX[ZW^\V[]X\]_^_a][f^bbY]^\aYZ\```cdd\X[chlmnkjpompƨyŻ¿Ыÿ|ği}y͔ʶĿƶӢźʫʮӺ·ĭhrb~cyrd{wZOX]^qznTglfqBJrb[tqbej|RMbmpp`\kofg_`]qvM?mmfgfze\|qWKETYHTfxpZl{UZxQ]uZywQkymSa]FMMRvjZbFQV~r}vtih_cxQvM9B^nYd`jLN@ouMjln_Sh`IKBGROFYs_P9P<@>GZEEU^a\WY^[`goyu`TQOLIFA60//>D6->SKA0)2<5+**))'%" ##$&'&&./.*%!#/85+',//.0.(&%'),,*)*)(15,**(**+/4530./,*-,,+,++))*,,,,--220/-)&%$#)*)&&)(,-*(((+),1448-57>>433..31352)&,9JM-47("&#$+#629<-K>/9.5/:3*2/+:=01-+0;M=8A1.42.393*39BF0,"0?-/56;DKKB5[QKF:9GHEGYHJNXaUcbgKYF9WS^[^n]KPC<\iX9R[cUASD\i_c[TP<5HVZPFHR[R>=HRaOCI@7D7AJC<<::;:BEFFEBDB<>GLH>69DMMLSUTTW_cbXNGDDGPWYYZ\^a\TSY^ahusi_YTMOMOOMLKLNQMKMSMHEC??<;:;=@=CKFADEHJFJWQFA<>JOGLYWLKMTb[HFMSJ737?:711614666434755DGCHJIIIGI?@SE?DNR[\\[WSNQZYTXP1<;50123668998888877776568:>AAEJIA:CGABGHS`NCIDFPJ>=HIDGDFMPOLNRUXY\[OPPFGGN\XOLNLKLIJZbNKUNKSWVTTUSOKLMMJOaaOTWFAFFEJRURI@KhsgSINXZSHED?@FPbgc`]\^aZXY]`afje_eom_`svywrpxtythhgeheVXgji^RU`eguMamfc`^XWYXXhul]\]X]lmhu~tf`d^gwdcg]RTVaZGJGKN[YV\VSTUVVXXWVUWMSZWXWWUTKWRNOUSLUTW[`_^^^^ZWWVSkk\ghbdni]de^eqfhrscYQZde\SSUNFOQNSJOPXQSOWRTaYYXPUDOVIJOIB@CHSUUZ\ZX\ZS]e]h^[dda^^ZWY`ccd`a^[`a^_^VYZ[[]`XVhbhldhhehdcehgdimi`]`dhjknnkqu˶ÁľƷðһù˶²õʭsxo{u֟ѬƿҷڵʾЪ̸¸˘pwfcqexpcO_^`klmZ{olsJ;`pRUZWKNZor`WkqloVNchlo[OU{oZKh\}Taw~U^x`UPLQJDSfs}wba{qDXxPQ}btxUtwbQedECEXf\VIPnlwrksj\`vY}F8AbeWj_mGbKtztLgePRYYCB:QOFBekTIAV@DW\ZUT[wiVV]^bnxx~ubWSPNLKKGB?:679;AJJE::01;620'''&%#!"""$&'&#'/-+*(%&.340-/211/,))*+.0-,.+(2800.,-+-1253210*+110//,)*---.00.24,-2/*)'&(+)'%'((,-*'(*,-..101.:415/FS:?>A;0,(.41880+.35AV80E7#--#*'"7:0?1HG44.>576002,:=.3/+5EE7;5-38BB@?-1C71:2+-462268G=0/&?;,326?HGF:A[SKD<>ETEE[FMGYaU_^bFay@>YQb_eiZFJHJINQNOT\`fcM@EYjeF-369;>ADGINIF`b=2N?-1526>A@>8110,@Y\N;?L>;PYOGHE=./INLKHA:D_af}4'08KMd}vaJ:>93>?5=9.3B?B\`A.4A@<9-0./+(@P:1/0+.99('FbW:'*BX]TGPgaE:58754430143/:86B?;@D@<=>=;<=DKD7;A4,/230.,,,.498751/.2:?ACD@>>>>@HQR@00235788899888777665578:=@FJG?=DNRPNPSNC@FJIIIKPRQRSUWYY[]_aa_`eeacimoqsqnqssvp<475566666666665545555555577677888846b~|{{{{{yxx|~||zxzyvtvyyurrpqx}~zuy}}~{{}}~{{z{yxwutwwuvxxwvttt@@>AFC>@FGDDFHLLLKGEFIKLNRUURNPUXXUTW[Q>678:;;>ACDCBCD@@ABBCCCGZ^HISIAA@@;8AEB=;L\ZWLBIRRMOWYHE\_UVZUICBCFC@>DEB@A>j]`QGYvkt\lyjP]vdkB9@e^Uk[oLpPsitMgm?SUW>9AQCAMf`HBFb@\ibZZ_ssVT_ejt{sdYUTQONNMKIGB>:8FQ\V=37429/-8+)''&%%$#$$%&&''*++,+)'(-2411562/.,,-/120040)182330.+-1212353,-34210-*-12013238/(/4/,+)*.-)'&&&(--+)*,--/1110/8//5-EN1?J<680.11:B926:55:TN>@=+49()*++<(@5@I=2,@>;:4/718>,73,7D85:)2<@A=>5/BD520,,14557:E<)559F023/:EEAA9L^PEEA>KY>O^FLC\\UW^^Det=GXPhcgh[KA<]lUL[XUXMbSVe_RWZZ>8AN^RGGJRRA:FV]OFNG=JHIGGROFEGB=AJG@?BCC@AEFEFG@626;AGEGMJIOSX_aRA?AFONGKX_bhia\abZZafifjng[SLHBCE@=@JH>AAKLEBEHMIJKLLMQQQSRPQSQOPPPQTNGJLTH7>LMLZkja^]T<-7<=0*01..///04;DC808FOKA@IOI86;9(/>DBEIB=DNXcbWXT75DOinf\QU[_YR\bXT^jlc_d_[gzwZOLJP[dqr\E55:?QbL605@AB>?EJMUUVcfH=P7'/0+09>@=:663%2gcLKDHRY\XJAKULBBCA>;87:YfgZ%+<<3MqrP:3+1CA7A=-3C?@UcM7:;89<3)./13BJ@721+.61%)GaL0)+;U[PIAUjMJ6046885214;?I>5674349@F@BC@A?;?FGCBDGGB>=KQB772+,/30.,,,.5::934554235:@@>?AA>BNSA00225788899888777664578:>BEEC??GRTOOTXPAAIJIJKJJNRRSUWWXZ]_bcacgga`glnrvvsswvyN56556667766666555455555665776788985V}{{||||{wwy|}}}}~~}yzzzzwuvvuuutv{|zwvx{~yy{}|yux{{zyyxxwwyyyz{zxxwut>>?CFC>?EGDDFJLLLJHGGHKLNRUVSNPVXWUTUZUE<<=@BCEHKNNJKKGGHIHIKJFSWJEJHDA=>=@B=;;CJQULB?GSPMUTKM\_LIRRHHIEBCCAABB?><=;7>DCDA@CEAAKKPWRQTKMVU[hW@GT^^\WWUKLUTKIHCCKNGAT^PKEBECCDEJNORSVRPWPU]SXSKKJLJFGFBM]Z\aZjyY7G^OELKLSVX[^d]U_c[\becbfkcXX\VS_lonkbxq`j\WZY\[X^\PNe~zniegpriceggituniklnoia`bdku{rnf`bd]WY_TX\^^_^ch`_UZVW^PQRRSQQWQNNVSLTY[[PQOIHBOINGELJGM[_`\[VMMSQ`i^Y\WYcie^fkbisjknpgfRXb_ZYYUSMJLGTDUTURTNRXlgcejndScZ_^SFRLO[`WSUUWX_\Pacbid`fbf`gihhpsijoidfklji_W][ZZ]aVXhfjqpllmkkkjjiddkjecdbcdgknu~Ƹóá͵´εϛźɻv|zq|q͑iؚ[̞{ÝĹϸϲɪҹɨĺǻ~vjmU~l`b^tejuZlNNPGSamt^RLhrtzc_u_KOdgepiNSdpxrIQdW\obKXNozTGIBCR`mPhtoaPcaI`u[vbhLVb_G:UjX=-/22'%21*(&&%'%#$%%%%'+*++,--+*-0123551.,*+-020//551252120,),10..0483,3420//./24423664-2841-+,.10+)(&'*-,,*,/--1756653048.;@0[T9=C;<;=JMBBF9/:;GUQ;;43@6'((7,8:8@@1+RX:XdGPF[]SS]ZEdn>PUPme[j[S:BscQTfOU[ZeVdZQL[ZT=>DW\GHJONE@IGA??==<@FDFFB9246C;79@?:9;IH;=?EGDJJJINWWRRQONQRRQOMMMMJEERK83?GM]iie]WM5)3>A1)9<1872-17>GME4+0?MMGHLJ<;C:-3AFAGM=5DUae\TYVHK_innkf[Y_`TMTUNQ]dliaa``jiNLOR`lo{xK26;7?N?.159=DMPKKPUZaigQKO9-10-29@@/4fy]\XWWXZVD;M]ad^[^TH?:8d8*B=8X[;3-(5F@:AC53ANPWbQ:HI96J[;*4@HF?L<3/+,/))1>A2-,.0KXOF>BO@;6836;;70?]PA@9420379=?<9>?=>=:=BHIILPOI@5>PN;1/-,040,,-/16:;72311.**/5<@A?AHDCIG6/1125689999888777663478;?BDC>;@IOQPQTVPCCHJIIJJILPQSUWWXZ]_bedeec^_ejotxyyyyww}a96767667766655554445556667777889:4Gzwy{{yxywtwwyyyz|}}|}}|yyzywwyxvuuvxxwwwvwxwtuyyx|~{xz|~~~~||~~}}}}|{}}~{wy|zyyyyz{|}}{zzyxxvts@?@BCB>=BCDFHJLKKKKJHIJJMRUVSOOTXXVSTYWLEDEHJJKKNRSMKLKKJHFGILLNMD<@HLA?E@<9=GC?ET`P@AIPPVVMDT\HKNA=;>DCA??@ABA=<;AB?HJDC@?DD@EH@K`\SRNW_\dcNIMGQY[_WJHGNVMHIJIFEBFY^TLA?BCDBEJMRXXSPSTON[d^VPKJOMFGHFL^eghjtpV?@Z_RQQRRPSXZ[SPYWQZ`]\bgh_YXX_a_bklhhi_SV[[\_dib^f`S`{~dQ]mliifdcfv{rdkpvxrnkdbgnwuqmg``a][YYWWY[_[Xbkde[XVW]WUROXTNTPLLQUQPUYZQMMJC;EIMDAHE@GX^XSVPKOSZadVTXUW_e`]fkgltjlpqlnXWb^Y[]WWPFHIPC\VSXRPU`pa`aioa\^[_`^XXV[^\WUVVVV_^Sbaehi`a_e_hhgkqplklhghhgif_[^]\\]aa`gffknggieefffgddghfee^_dihpͿƿѿ̸ūһˮĭƲº{oyx̔޿cչɵ̦ӮҪӽȸwqskXq_bflfs_]gXHQ@SdiriQSi{o~[rkoelXDj]^p]Ghk~iIWhaWiaOMVwDTO;DOU{tNtcfE`WJju[rjdLQ]YE9BkdbLGltgule~gCXq`q|dK5@^JPif[rj\^glQkpCg]S6?Q9<`VdQW`tL\hZZ_pc_npq}xspplaZ\]\[YVTSQQQOLKA:IF@LYW?-.,(%'02-*('&&&""$&&'(+,-,-/1/-///0343.*)'(+144/,17;961//0*&(.0+'*/86,220.-0211452483.1;:42-+0132++***,----/1,24A7.=925=<15=:J5:>/+8AAA521757,<6-/.46456<@10/4LG19;0)3><:9F?#)=8AE2@9.6;;6=2BcZ==HL=XV:_jJRIX`RP]XEbfA[RQpdUk\]7Q{UOc^KY]ac[^QBS_UID@J_LBJLMHA?MSPLKGWHEKOGDXVIQOMFA@IIC?@=<=BFBFDDA=85=@:2Ifmpnd^ae`iyfROVYclYV]@8;<8;AD70235E\bSKOPUdnbRLI@>8/049;?;>CFE38c{n_[OIGA727>ITcaULERWKC[\0CGOlrJ0.++18=EGF@:AU]^aS;L^J=[f1@IFPGVL5,,,,-:G:(&),,+BTTH6.10/:NB3>@ABFHJLLKKLKIHHHLPTVTOOTXXWUTXXPJKKJJJKKJNPHDILJFACJLJJKHMPA;CHWM668=DFFJ[eR?FVUOTQIJ[YHYR?DE<;?AA=<;>FIGC@AA?@CB@AC@ESUOT`g^ZcYHHHFNMHHC@?CNQKHKOD>HLS]]VI@BFIJHGGINX]ZVUSRQT\YRPNKKKIHHGOZckoqrk]NFGT`]WWXUTUVWUUVVWXXV_ijnmk_Ufoiqvga^[Zbmnkmjc^WU]hfWZknr|uaZ`ullgxzohhfcehlmsnkga][[YXTTTW[WSZl`faXWUYZZYUY[XTPLNLKRQUURQOLLC=;IMF?E?@BVVPOSLKST`YhVSYNV]_Z]dkiksihmlpo]V][Y\^Y]P?FLIH^TR\QRXeg[^]ifV`TYX^aaYV][XVWWRUX_^Vaafef^\[^\d`_dnjeeecfhbaeca__^^]^aedeffbkcae^`bcdecdeegec\]badwϷζпƻ̹¬÷μͤ{ɷ·xv|twyԫՅâЧԽͤ׸ε˱ʯ̽Ű;uwjmd{_`_djkTgZKILHa`RVQG^^Yg`MldouyoXDRWbaGN{zueFZn\PmkJDdaDkS6EL]g^|Z[y^YcNUgizhjelKFZ[F7Kyd`\CKnxkew{is|dEWiZit^S1@V>Uj]T[c`neQp}|dPjbR8MJ/Uahf^frYImiZbf`U_qvuoec_\ZXZ\\[ZYYWUTRQPMJC:F[cL=GJD;,#%+21/-,+*)*)'&((()+,-.//01/011/132-)))),2893-.49;91,,-)$$*-+&&,31-/1/,+.54113355/-16620-+2332,+-.-,-./001+7;F/&A>5>GB42@6+@E@GE<0&0D=.)&*4*@559.'3=BA343732.60./-22456<7,.2@H>>C>/+?I=?D?(*CB7D6:D4-876582MeJ<EF?EFGHF=8997=DC>@KKLSW``\YODGLRVWZ]^^_[Yboi_]bcbmqd]YJ9332477987C:6=@AABDIOJIOMHJOLKMOOLJLOQPQROJIR\ZTRQQKC?AFJC>LMDIJD@>>?AGKPOF@EOPMMLJHHNQUUOKIIMRUWNEIY[LQc]Zipmjd_^VKLE++\|zsnfcccaWSUUW]chkZH?<;=BF?=9:CKQV>3Y\NFIw|EDKLZaXF2(&(*'0@IJKKKOV\_UBI_YHWPIXE@JbU3)***3EH<7=<83.<;<>>AGOUUQJ>750,-.,*+/-,+.;FA;9500008?>88;>HQLNYM=2.1013677998877677554568;>@@CE96BJLLLPTRKJMJFFDCGKMMOSTV[]]\^aef`][Y^dejqsty}|xv{}m<3757788766777665455655667778;94Hlrputtspmjjnossrqpprssqooonmnnmnrrpnppoooqqsuvusqrqrwywwwwwvvxxzzzyy{{}|}~|{|~}}{yzyvyzz}}|zyy{}~}|{{}{ywwAAABB?<=@@AEHJMMLLLKIHFHLORVTPORUWVTTXXOHIIFEHIFDKLDDJLJHCEMPKIJAO[E?FM]R539;;<=K_]F=JTQKGJJLYXUWKBEE>>><>ABA@>@EJPQNUc_NNYSJCAIMC=?<;BKLLIIMMDEQTX]ZPC=?DGGGGIKNS[^YTRUVNJPQNNMIHIGGIMPXemool`UWWTX[XVVTTUUVYTRSUX[^f_Yinke`gpvijodZ^gnice`RIKUYYaghp~~uaYegVfns{vb]bjjfabikoikh`]]YWXSQQSWSNSd_e_ZYTRTZc]Y]a\VMKPFGONHMKIFIF@?IKM>?@CEWTURXOLZT][g_]XHP]^Z_dgegrgcfgoraUVUV[_Z`O;HLEOYQU`QR[`_Y\[haSVLRWZ[^WQYWTWZ[TV[]\\]^b`_\XWZX`^[_jhbacbbg`\bacca```acdcdghagd]aa_^]_`add_edb_]bljnɼǽɮѶ{ԺϴͣĶɧùưľũ{}~uyrjyǴɟyzڛȭ׽³ŸκǸ͵̷upx~}]ZZXabca`XN^fqi\UR_mJIrpK[_er|}bA@xlf_DEpq_m[?\{paTsk?Aq}UPxT5FVoigiP`l^qhZ`WT~m`[vtPAV_MF<444:;B<5?=EPA8>:;@3+?F62/'1-=6100*-8A@65441011)&))-023862//3BAERK8*9LD@DB.'>9@9-.56443;WX8@:LYEaH4qjPYLWdMGYMJi^JeS[hMZl\_RvTAn[GUZ[mXOD6NlPPVFG]NZRTA=RWTJLYXS]BGSRLMUWPURVSHGAIHGAC?ELNNQ]haUF;CRY\WPQUX]__bfbYUW[amtlad\IC92//46;:8>64<>E?DBCCBAELEELHAELJGKPPLGLSTQOQUVSRSQOOOOMJLKIIHFNLDEFEDAFGHNLLPROMPPOONLKOSRSTROMKOUQMF?GTUHAP\cospmh`XMGLC2N|xjeeecb[POV]ckpnh[KE=69<@CFHC=:66EOARhffedtxMCIKW_\SH<4,&'.;=DSFIIFDCBA>62577989;=?>89AKVYWNA:751-++-/0.+,/;DB:75..359:82228GTOMWH42/0013666888777766543568>AACIF:?@CFJMMLLKKIHFFKORTTROOSXURTXXNCBEDCFHEDKLGHNOMLLKIDGHC>CJGLMCJJ:5:CB@7=]aB8@CIHBQUOV[^YOGEC=;>A?>EHGA=EUREC@CEAAA@@?=?GRXVU\[QMVeeRDJOONIB=>HLECFINRTXYZXQKIF>@FFEEHNOLNTUQOOPPKHLNNOQQNJHIJJJLNRZacc^Z^]TPRSSRPQTX[YYYYY^^b^Z`^]`dgjoxybkqf`hpsnmyoOCHPX[_dgm~x][Y[_^TZimrsbbftrfccccecca\ZXUSTRPNPQSMK^\`[\^XRSSY[YY^`\REHOCCBHMNG==DDAGDKA?HKQ^Ya]b[U`RW^ead\LM]``bccafoedebhqfYTSOU]W^Q>PPGWUT[aQT\Z[\[Yg\TPFT[VVZSOUXXY^bc][]]\\[^\\ZVUZY_a]]hia_eb]c_Zabfebbbacefcdijeeb[\`\[ZZ]`ef_efggig}оúĿШẕѺĸӬ̺οɴžzhknhn{~~~xwtrɬɰ`tիӱβƧʖϽ˾νïwzwdh|TO_OUgcQwjVwlrnZXiqaDPnVKeimlbtnY&+*+,+*****))*++)(***-.///..0002332.++,,+-31+(&&'),+'&$"" !#&%"%('*&&(+)%-31+(,/-*((-1//-)/123-*.200.1223346@9',CJCDGEDCA999IGB>::6:BBIJG;>IOMF:5B@.7A76;'-284.*1-)2;>:212795($)+)+113;:94/4=BNQD..FI>C<6,6C<9@:><,(-14655EZC2B6P\NaB6uiT\LUfKEXGOmYNhXaaJ\m]choFJmRJ\S_gHE8GX^ZK@DLUXY]a`ZRNQ]hmlklmo[JKB:2267=;6<54;BFDIIJIGDFHCEJEBFKHGHJIHGMQPNKKORQNMMNNNMMNMMOMHHNKBAEEDCLLLPMMOOMNSRNMNNPSSSQSTSQQTTMJKINSRMBBTdlolie`YNBFDBY_\nwlfghe]YXX[`jtjUOSNKE@?A;A\ll[GNL=:BGJLMWkX534433.+.0.+9C?BViigjkT55:>AGIHD?72B]cXX^zMDIPZeknquti[A.8GSbhe`WOTSEOml__l^9++6MS?D0,*'6MZaehibJ@UZLC5-.*4lU20E}RdeFJLJHGA74<<98638?A>:79CPYWJ;8544/+08<;2-,/28:752*-69520222:CAFOQ>.0/000255777766655664359=?CDHKC:BLLJMPTVPFCHFCEDAEKMNQUVX[^^__acd]\\]_ccdhjqy{{{y|ykB6::=@CBA@BB>;;;:85466667668;4;drlmoprqmf```behhjmnnmmjiihhghiklkkkjijjjjjkmmllnomnqqppqqssuuuvvuuutuuuwyzzyyyywwyxwyz{{|}{{{{{{{{{zxusuvx|}}|{{|~~{A@AB?;8:=?ACFJLLLKLKIHFEIORSTSNNSWUSRVXOB@DFEGJJINNKNQPQONPKC=<>@;9?AA9@F@?>DDCA:MbZH>>IPP`[MSVQNUKJJ=9?C@>MXSGDQYMDFAHWWH=@A@DLSTNJMONJGLZZLHOQRQLEBFLLC>CHLNSVUVTIBMTMLIEFFGKIFIJHIKNOLMMLNPQSTQMKLMLNNJIMOPPRRSUOHKRSQNLQ\a\]\YVZWYZTUUX\^cdaf~upzlnpjjrvv~xwmPEKWac``duqVOY]_ZUZijrvc`ish`fjmjjd\ZZVQOPSPNLMNPMH[Z^X]b`UURPPPQTVURMBKH@=IHOL=9>>@LDFJOUV_eakilgdfVU[]ZeaZU^`cggccimdfhcdlja\XNQ[W\VGWXP[U\_\PV^YZ[[WeXWTM\\V]]XW[_`^^goeZ^][Z]^^^\XW]\`fb^hja^ebZ_]Zaciiedccfihgikjlfa\\^\\]]]cjkbfkpmp}ʪ̹ηƿĪӰƨü̚ưǾƽǽt¹oS`~r[Zchefovzzz}{uvus–^^ҽxӺȲαſʣͼ̷{|{y~[]|SI_V\]Ykait[eVFgrbLBQXS[hq`ZdeSRL\^`tCJusjiPNXELWaYo~H6VpR[p6B]t}l_Nle_NSsgbMCop_[vmWHPjdJi[LUBAju\W{zx_h{hPR\TISfv3=NXk=IohmYjdLEg|Te[e_u_`PTMoVbcOinl\DG_cfmRPRRQQPPSUVWVUVY\^XSSOKJHTlycWU9LSQD%$+-..+))))(%%%'))*+++,///.012234540*+++(')(%$##$$##""" !!!"""#%&$#'*(#'0/)%&))(&&*,++)&**-/+'*.+2+0332129@7-.BKKACEGLG7GH@BD=L]TD7:<-6H;0:-(1=1)(4/*09=80,0>;60=KA:3-,6AD<2/44>I@=>/2:BB88@=<1$%&*5VYNEJLOOROSVQIICIIIDGBDFMEAHBBFCDGEA?@<=FMNGESZQKFHRXRMGHQWTQTZ]XSPP\ih^^cdomUKRMG@??;A91A95>FJHRiZCB>511,')+*(3<=FXbabc_I368.$;\O2.+((0Yn3(Ws<;=EORA458@D9138;=8/-16::8654@GVTC>AGF@CC@EILSRMI@BLMKHDDIJEFKKKKKS`d\QJGDGOMFFGEBCFMSRNMNPPQSQNNMNQONRTROKHHGGGIJIMOPPKIS`f`VXY^`ZYTIPTR\_aa`aehpywrompttur``]UV_hc[acejaUXacZ]kpnpiabilgeghgcgh[WXSLJNTOKKKKLLEUWZUZ_iYVVPLLJMKNKQNEHFIHKHOCBA?FVNIW^_]ihfmopjmnd^[[\ecc^`_bjmedmicijgilkiicXV]][ZW[\W^W]_VNX^YXWXWaV[]Zd]]jgcdcbaa`fpg\`_\\`acd`ZX_^bhfehga^daY^^\cdgihgfgjmkikkirmgdcdehhfejqogll{»īзŷŸ̲ɯѽſ{ie^RdO>P^MJRW`kgqx|wqrmmzxšiZiͺyʯͽʹǻҺ}z~tzo\\z]Q[\_Z]prcjT`daspcQO_W[bd^djhUG_cuyViaG[dYc^PLDAOWSYosf:XOFL,-1,5*#)()**)&&''(*+++.//.124544550*&&&$# !"!!"#! ! ! !#"#$#!#&&$#+,'#"$'&&$&&&&$"&#''%#$%#*'*,--./>A;23BIRDEDFNI4HeP:@PUPD=44249DPE8GSKA<:.9TH435'*<8()=6'.:;2.+)37IF=;3-9B>;9:>=6$ %1:>?CAI5>:2T[S_4F_IF]I7IXZKSK@WqUDWe\daGQ^PJMJKIQRQUXNGHDJJJEGCGMOEBF@@ECBCDEC?=BIKGAGRNKKIKKJIIHHMKJLPVVW[^aebZX\]ckaRZ_ZQONKHI?8F@7=HKHACHJJIFCBEGIJHFFGDBBCDFGDBCDEFEFIHGF?CJNGGLHFEEDBBCCCBDILKJNQMHIMNMNNOQOMKKRTQPRRMKMSTSQRTTTTUWWTVX]g[>+cT?``XIJE;2488452,0:???>;<@G<7?EGA658::<94158;;86>NWU?6:?==JOLGOa[8.0-//135555555445567546;?BBFJD8;CGHMRVWTJA>@@@AABDHKMOTZ[[\_aceghb_]W[\[cjnu||zwvvzwxmefkeZXXVVWWWOINQKGLMF@:55567899977Uodbfhjnlc][^abbbbbcfffedeeca^\\[YYYY[[[[Z[[]behheghiklkkopmnnllmlllkkmopprrqqstqooprutsssttvwxxwwx{||||{zxwussuvvxz||{{{|~CCDDA;8:>@@ADFHHIJLKJHDBELNOSTOMPTUSRRTSMHIKLKKKJIIIOWSKJHFCBCGGCA>999899?SfXFGJNJBKdj_YV[_ODOZ[`]_d`HAECAIY`^``ULNUXQQ[ab\QMOMICBFE@@FDGNEBPNHLOPPHEJIGGHGHKGCEGGHSce\PFDFIT^WNIEA@ADKVYOKOPPRSPNNLLPNKLSUPIGFDCCFIJMNLKIIPU[[\[ZeheaYNOSRY^aa]dov|zwtpnqrqu}}smle`bcccaiiZ`g]]]]\^djnaPTbfijhhfa_fh^TVQGEMTNFFGIIKCOSVVVVl]Y\MEJJMKLDLRJAHVQQOMJOSQ\`WSaed_idhklidmrnjedciedba_^fpfdlealjilllkomebb`Y]c_YY^WX]UNV[WVUTV_X\cahafqkjle]^abdlf\cb_`ddehb\[__cjgfeda^daZ_^^eddfiijjmqolkkksrpnnpmtvsmptokjhuʠԵwŤξ˵bVNPPDq}]MF8G}VE>@K^ljlwvut~{{qgfyoĭxX{yкuү̽ϵۼƑ̾Ͽ{s~|mxk\mvc^b_iZ\gk[N_~dp||{jW_l^V_dDmykZXspzhbeGU\GW`YQ@;?PP[dcxrB0DTL@;24LPB8>(*4?0*FE%);:*'.,&3@F9*@=684.4:75=A>=>/ #0:<=>9CB:A51XWS]?Ixe^dQ^cGOXO]iaUqYf[P_YY_aNJVfQGd[\F8?YM>QL.>Z\ORUBNiZFTe\ihXM^QOQXIEGRSQVXKFFFKILGICHURIDCA?CBAABDGD@EHD=?HJEFJIJLMMHBBCBDHLOS]fhe`XTX[]aa]_gdWSRQPNPMEGB:;DGF<=AFFECABBEKKHGGGEDCBACFEEDDEC??AAAA>AFF=>EA@??A@@ABA?CGKKIMPNKLKILMKJJJJJGNOMLMNKILPPNJJKJKMMNPRSUZ^TBBPXZapvz~feknqvwvyo>3F^cI844CUWZ]^TMLIA=Jlh@/6@;276+)'&4Vruqnjebb\L96;@FJJJIHGFAAWji@05[n]TXcuwzpN/#&*'3DFEFNX_bepxponejvw:'-4523Xc<,.1FTV`mkN;>5)4I?*)(&;pN/A@6Smo}xYHE73:73/+,.17<;99868<;@MQG409DKMIC?;958988>ILB4189:EPQQVZbmK+1..0024455443444467548<@ABFI@8=BGIMRVWRG@@@?>@AAEIKMOTXYYY\\_dfd][ZUVYZbjot|xqlihk{zqnmkjldaaa\YZZXWWVTQPOMKLRURME>;;=>>==<;?Wi`]^^_`_\XVY[[YYYZ]`aa`aa`_[YXVUUUTTSTUUWWWY\^acbdeefhiijkjjihiihhhhhiijmomklnnlkloqqppponopqqrrruyxvxzyyyyywvwwvvxz{{|||}}BCDDC<8:>>>?BDEGHJKJJHEBCIMNRTPKMSTSRRTTOKKLKGHIHIKKMbrV@DCCDDCCBA?:7779?CEVbUC=HLC=CKMKLQPLJR\efba^ODDGIEFT]WVVLLPPSQNQV[WMGJGABKNGBBEGNQEGSMDEEKRPNJJLHFIJJIHHIKOW^YOHBAEN\\WYOCFHIJNWXOJMOOPPOMKGEHIEFLNIFDBBBDGIJLNNJFKQHU\YWV`bb_[PMRRTT_bbq~~{vtnhiouupnhglidmohgdjmglpiijhfbail\Uahhotomgc]cb_SOQIDKTOGDEJKH?JOTSQOiY[[KDNPUTNFKPSCLZZZ[XS[bdli]\ffd_gcghfb^grnnolhmhffc\W`rfdg\_miikkljlljhc`]]b^[X[UW\WNQTTUWP[`\_gbhckqggkcY]_aejc[a`^`dedda^]_`cfbaa`^]c`^``afeehkjjijnolklmrsrpqrqturoprnhgqyٵԻkǷ̠ĽzSMQMKB`bMBHS_iY`THQ_m~yommmurtv}}yr}|ochssOx׎zĮɶuͻÓ̝ſľϿovuip`ienrocm[XjaGV}Yb]s|`]`]VSo^:qunh{gfrqMBfPH_RVK9=AW_Z]hyT2@P\t}M`~pehaWQ[TLeS?_mcT{jb\i~STpk||WC>?6(3+'%! "$%%&)+-/00./243/+**%#"    !! !! !"! !#" !!!! ! !  !! !"$,,677@CIFIDCINGS@8890CE?;58G30743EGBDA;8216119AC@>9+"$+68;==:>>@A63WUS[@Mte_fTa^JRXR_geWsYdVQYRV]\VRY_JKjS_A?QKEHHLLKJDB@;>BFLOT\fd`]XSUY[]]_cgdYRLKMMKKIDB;:7;?>>>?9;FGHMLMPPOQMHJJKJGDEGBLLIHHHIJLLKGEGGBEJIHHMPQU\PLNONOLPriTbt|o>F[]O;106KWLKJ:6978=VmYD93:6+.2-+(-Khpkc_bbdeN?CA@AFLOPONPOFMnwU:BF@-]eEgecvzZ;($%(8C@@GS]eq|}zlhp{8',2421VtD/5+1EVe|zI0.'%AV4*-8RsT1,(-bsJH;77411-+.03652124468AID=@GDCKTZTIFB7117:@I>4:8ALLNPHFQWUVC,0....02244333444432248??ACFF<9>BGJMRUVQE???==??AEHKMORUXYYYZ]aba\YXTVXX]bflsohcbaalpfca`_cc`^\]YUQOORUWXZ]]^_dgfd_YWUSSSRONNNQWYVUVUUUVUTUUUVVVTTUVXXXXVXWTSSQRRQPQPNNPPOQSTW\]\^_^\_`^_aa_^```ceeeffeegikjikjhfhknponmkiikmmnnmqqonpsstutx{wwxyutxxxyy{}~BBCEC=8:==;:>ACDFIJJIGDBCEJNQSPLMPSSRSTRNLJIGDFHHGFFJbz_ACDEFCBBBABEA98:::=CNK@CGFA><=GMKD@CBBLRPUVJ=AHHKKCELIGKJRTONGDILHFFABCBBDJJBBDIOMGEGGEBCGKOOJP^UEIKEGJJLNPPOQQMJIJOSPOXWOORTQPVVPJJNNLKKKHC@?CB@CDDBBA?ADHJIKNNNLMSKPXPRSWYW[]RKQROT_dlmnvzvogkt|uc[Z_ijhjllkhijkuzqklnokkga^`gijlmjhef[Z^aSISJBHTPIACJLG:BKSQNM_U[ZIGRX][SLR]]NT\`egeahejnl]afdb]c^`b`^XbmlnnnjokgidZQ^thecS^nhjjjkjgage^cb][]`WVV\\YMQPTUZXgdbehahekjbei]X]Z_eh_[_]]aeheb````acd_^_^\]b```bdfhjkmkkihjnllmorttqqrqrqppqokhl՟Ƙmĵӭw}ęfLOSROEWneX@A_hwdg}wbZdt}zg`bi|{xwsy{q}|nx~OtםdzhȻУͳ̷¼ŹovpqqiarRwfj`Z_S_oZIF\{h[b[RXdwIEruuqpWbj@]iHWWCQC6:MmiO_kgF2Fdtlxm[gpnYo^^IRU_rf@O]l]b`]txRXlwvVC\|mnujcTvlsUIKAIba><_ZA;dXRiLKN1Pj=KXaog]ldd?DdQRNPiTVm{hSQNMNNNMPSW[]`]UTTUSPTWTQTWVQKHDCDB@>?5:8'5**(%""#"""$%&''(+-/01/-.01.(#$#"!       ! ! #"*,19>AAEFJOQTN<=<9DKF?=?FC>?C95OL;;HG=768@AJ>>0.AA&5:CG2861=G=EE965354/:A;;<@7-()0589>>;;?@B:=VTSYAQpeahVaYTTZXadlXqY_TOYLTR[\[YZDWf\VBSG8=P?3P\PX_LD`l^WUSUigYTZPO\^R@DMPTRVSGFAFOHLGFCN_PMIIGFD@>?DIGBDB>:;@A<@FFHLMKFFF?8;AELPT\a_\[XSSW[]_bdee_XNBCMHHHBB=<<=D:59B>>?@@>@BCADIEFEFIKJJMOLHD>FA99::9AA@;<@<637=><<;6:FEGMJKRPORMFFIJJHCBC@KJDECDGJKKGBCIF?DIHGGJNORXOUTNLFHKfreWSbuw{]HVVG?42:LYP<1*)).:D]aEFOH>71/11/-.9CC?L`c_eZ:5GJDCGMNPQPMICJhQ6331+H~2Qvks_<'+>B=>FNXhnmsrsxxust8',0211Gc>$,++9Rd^RM;++**<]H,-QR*-/WEAGD>85642.,-/45212334567/0FXXOHJVZOII>307==?:ASDLTQKHB@GN@/+..//--/1133233344422039=>@CFD9:@BGKMRUVQD>>>><=?@CIMOPPRW]_\[]^^^\YWSVWVX]_aeec__^\cg^]][UZYWXXZ]\]bcgjlkklnrtvxzzxsqqqqnkjjhdbaa_\]_adddddcdddda\[[[ZZXWWWYYXXWUVVTTRQTQRQNOSUUTUUTUVURRSTSTTTVXYYYYZ\]__bddcaacdfkmlkjihggjkjjjjjkklmllnnnppppromoooprx}AABED=9999878;?@CFFGGEBABCGKOQPNLNRRQRTSPLGECCDFG?7BUbfXFEGHE><@BCFON?88:<>@=@EJLE??DGJH@>@?@HHECBA>@DCCEIMLC?BECBCDFIKMVigPFGEEHIJKKGHQSPPOMLLKMUXSRUVSRSSPJGKMJGEEFC??A@>>@A@?AACFJJJLNQQOQTNOTSQQVWUY]SKPRPVadhddousompvzsbUU]fhghehkgee`fyyg`ilmmc\__\aijghhceZV\`]KPMAGSQKDDKME8>IPNJLTPZ\JEX[a`_OUb^SY`ejkniebjjeZ_d`_[]RZZ]UV`biqgjhnk_fd^Q[ulehQVmgjhhlfcZa^Yed\X]aXS^`[\OYS[[_fkfihd`feigabfZ\^UZef][][\`efc__a__`bb]]^\Z]a_cacfgkmmmkihfhmlklostsqqqpppoopqmuۯ̝yuxƿƑqrv˵bNPYVOEFpVSDCZpm{}bsvgn{^[^pxzzuz|{z|è\fήttƿʹЊǸ·qyjyjhfoXie`XNhfpT?:m^ae_ZaodENdax{k\NmZOkTJSDCM>5AdoUXc_T>9Olp\pdO\fm]wmeT>V`i{qBH]{|pxce_qnV\gup\Kc{kmzqgTslwUJCSNhxiA>_TBUkHmfIJU;`[=S^jhoklbT_VQIAMmpRbxcSPOOMMNOQTX[]_[URSSROTWUSUWVSLJFFGIE@@.,7(9+%()&&&%&')*+****+++-//---*&" !       !! !"(-5=@@CKQSSF;;99?B:9:<<=;BI<0@RG@DJ@6799=J?C6/>A,7T.)30607/(,1)7?=B98<5@F0099AF@@J27G?;236AC;8=AC5*.36:@?=:=@;@9CURSXBRhfXjT^W[]`b`\qVpYWLMWLOGW\[TXGbb\EQX99JF0@SMZ_I>VoiUMORajWBIb[R_^NBHNPSPWRFF?FPHLG@CP_OOKJLOD?<>ELGCDDA==><=AABFIKIGHH>8;AELOSZZVVXYSRVY\addcddWN=AKFFFA?<=::B93:A<>@?>==>?>BGBEGHJKIINPKJEBJC99:99A====>;628=<:99;??@HGFFKNIIHCCGEHIBBC@JIAEEDGKLKIDDIFBDHFFFILOPLJPTNLPQVQ?9ES^lpy{||cDRV^k]HOOC>6@DRdytonnorv}}8'/4688<@4*)*)1Wtc@,&+),.8TO/5kuQ1,3^|fPEFCA?;63/--/2564565430-*-DaaM;6:@DINQRTVRF@@BEBCCCEJORRRSZac^\__]^\YWUUVVU_b]]^]]YWVUZZYXVRTQMV[afosow~}xvwutuw|}{|~{utwwsorutomqtwxyzxvvvvvtppqonqqnmnppomkmppjikjecd`WVYWW[_abdea_]][[\[[ZWUSRSRRRSUYZZZ\]_```bbcdddcceffffghhhiijjkjihjjifihgkkkorw|~~~@@AB@<;96544458CGD;8AIC?BB@@>:8::8AOPJMNNQPUXOHHGEGEBDILLIELIADEECEHGDDFFECDDDFGMV]_VIEFDBEHGGHIMPNOQNJJLMPSQMNRRPONNICGIGDA@CDAAC@<;==<=CHKLLJKMNSTQTURPSRPPVVVY[SNQSU\dacimfjmbfqskgkibYZ^bccb[^ke]]\\dn`Yeghfa^a_Y_gfabdc\\V[`fVLSJHRQLGEJLD8=GMJGHKK[`NNc_ihm\`g]]fjjlhka\]gf^T\]]^^YNVVXPRZ\cp_^]hhY`daV^xpdfUQidigggc\V\ZS_a]V[_YXd^\_Wa]dcglhcjfe[becea^b\^]OUdd[ZZZ\_cca^b_\]\aa\Z]^V_daecgikmkmmlkkihllklnqsrppqqqqqrrvȦwxxw̹יkykt~ʲXJVjaLC>s|TMEA`uluzu`{{wfffdju{|xzyvƋvNzʱeǷŗɾᢲy{zfo{khei{[j^\TYZnc>AMC:PfVI_bWC=HOcabgNGaoldi`Z:>h_mrJUi|ftmflani[^dpwm[kxfl~lVqts~WLInUmql?=aQOqRRO,!'+)(('()**,,*+++**+,00+'%$!    !&289;ALRI>;8793+*19=<:64T:*/953I@:74;AB;9=GD4)0;=:CN?;=?7383>QOSZDR^_PmS]ZZ]edbZnXlXQHPPSIDQ]VNUOf[GLRS?IH>AJEVdM?OidTEGT`cT@@RvbU\WPFNRPPPYRGD;@FLGCFGD@@<::9>ADJMRWOKPZ[URTVX[]]^ab^U@AHDDD@>@<;=>>==@>AEHHIHHHLLJIGOOE=<;?=<;59>;988:B=@C=CICEFAJIAGJGGKMOMJJMIHGGFFGHLPOCDKOMPSQVVQQRUX[]eff]ovEGOPTVLGIE;4BKMSVPA9::BLPUTJBELJFEFE??=:BHBBUY^eV7+?PGMHGIJF=506>:H^PD6588;nw*'O~}u`]fikaD85?F?@;@BBDFGC<:EeqC-+*++-F@8421//28><::852.*&'A_V;/:DEACOVYWJ?@@?EUcWLKE>CE;8//..020-./000/0355355469:9:9><94123225:>ACCDDCCCBCHKPQNKKORSSTTRT`pbE?=9;?OWTSJFHC?@A??BC@>>><978::9<=>B@98A?;9::;AHLNNMJLNOSUSVUQQQQONWUUYZTSZ]XX\]`kn^UUPZmtbU[aa```___^YW`b\]^^XXZ_hfbdgegd_dhdXVacV]ZY`gaNUWKQRNIFGLC8:EIEDCGI[eX]qfqn{ollggmkhfghYX_hdXP_Z[ZaWLTSPKQUX_k]TQ]aV_fjabwoedXL`_ihgbaVOXWOY[]VU[U^dY^_`dcdeke\`e^eY^e]daY_\ZYNUbc[Z[\[]a`^]d]XZY__^_`_^afdgeknpmimnnnnkhkmklnorpppppqqrtsȽƾŲxpvyϖ~ȱ|xkehsŲVE_wfTL8TXKHCa|{uy|jxxywiWrpqyuxfcbˢIсʷr·ɞиٿſ¾|q|ihs|idbny`hQNOlzdp\;G[]Slh^RjpXK8@\j\VLUdNTI7BA;8;[JCRRFK^^E7NHMbdcTMXpbk_P]E.Mv\nw\gwzc{qfakivxgbaflw|ei`ksbsi}_N[bml==;29E@6433>CC=--747?;>917<6M<+,:31=/-,.;FC:4./>CA7/.4CEFLHFME823:DC<8=D@30:<;?EB@?@@<.4518MHS\LPTTQrQ]ZWZeb`WmXjWKAULVFGMZJOSSbLCQLUNQIGLDLaTCLZUICJX]`U;9TmedR]UNHRUPMOYNJB8GOBNO?@U^ONLNHQG==::=;?DIIGEFGJIHHITNIJFCDIG>AAE;=A8;?999:;A<=CA?=AGA@@9=:06EAKSQEBC3AH2InZ,*9>84>7AJBA-.-///020--/10-,.4776668:::<==BLJAGPNMOQUSMQ\_WSPW\YXY[\\\]^___`^\^_^\YZ]^]]\]cg`[ZZUPQQPXSIMO\inx~xuvwz~~ywtuy{~}|~|yyyxz~~|zy|}~~}}{xvvvwyzz||z}~|~~|zz~}voqy}}}}||{xwuustvwwwx{|}~}vrmgdb`_]YWUVWVVUSRRTVXYYZ]`cffdcb`^^`bdefhiijlllllmnnoqtspo;;:<>=9620220157:<>ABDDDCAAEILMLJKNOQUTRQVaw}]B>=@LQOOLDAB@<=BADF=888;@?::@?<>>:9:?GKKHB?><=EE:9>@DEEILLKIGECBA@AA<`o\c{zoo}aprhZlv{uklggelfb^h{twflOg~nk>;_iqhOhP3`co;MtV]mj~oSmGolOghyhcxpW[SONOPQSVVXVRNJKNQONQUTSUVVSQOQUUUQKIC40B5##''*-----++*+../0222.'%&# !-9==@;2-.146:=967?@2'0<=5..:??B8,///0069139;:1-02<24+0.8JIA<507<4A4*4CD>CGCCC8818>D>:=@>6=KC:>A?AED?6/19578HGV\MGJNTsQ[YZWc^`UiZeOI@VN[AHPS?SP[\CRLQ[TOYEHH[YGELKHHLTVXS<8TYmeXV\TOIVUOJOXJJA8ELAMR>>U]OMMMEOH=>KMJHFJFABDEB;;;:>ACDGLPLHFDDHFCDHMOMMUZXTSSTUX_jia]PJFFFI@?E:;C>:=><>;6;ACA==@AGILJHGIGGFEEFNGQUNMLLJHMJOABB6?A:>FA=;>C>>>58<:=A=AC@HECJKE?BEJJLQRNPNMMMKLNPOLIIJNOONPQSTQOMLMNLLKS\YYWUTSQNMPQMMNJGCDECDFFEFJONJFIJFFJJFCEGHINPC?W_H,&*3JTHRUG;<>?5-)9I@ITI?B5Q2%5HeG6HFHKJCCB@DAIQA7NxttrziA5?@@CS\NN\fibPRH7=94.,/1.,330Dl}q?16346Dr[96=;7631/-.6@@<868844653>FEA@>53:FOV]TF>ACDEIMRVVTTTROPSXUOU_c[VQXZTWWWZ\[ZYYYYZ\_`^^^^cc`beeceje][^VPVVQSQP_pvvvzywvtw{||zvvtux|~~wx{}~~}{yzzzyzzxyyx|{{~}zz}~yvvxvomtzxxz||||xrqrropuvvvvvxz{||}}yvqllmmlkhgecbb`_\YWYZZYVTTUXZZZXWWX[^bccbcefhiihhghjjkmonki;;;;;96310000123579=>@DDCA?@FHHJJJJLPSTSPRYjvNDDHGFRLC@?BCEHD=JQF?EMA@@=:58==9A>BGA<;?@@CHFDFD@CEA?AB@;>OP9:SVKHILIFEEFEBA??@@@ACGKHEEEFILMJGFGGFFHIIIIIGGIKKKKHJNJLOOQOHIHEE?;8;FD>?=55>CGJIIGFGHILKPVRRRPORRONVQNVWPNTSIKWYUVVRPTZ\\[TNT`dddc\WUVVTUZ]bc\ZXZ]_][kteagbX\`[WbgbU`ig`^UPggRXRNICID@BKIDGR^altnugrkwtutnfjkilllilvn`SO`WTIUKAT_PKa_celbSS_elssroelppq^TRT`hk`\UPRPOVV`\U^Vbh\c[mfa_ghWP[jX^YY_[_aVXWR]^\[_``___ad\]bgdddbdefghhhikklmnookgjklnnlkihgfjmmkjlooonj˷ĴrjtrwƒjppbǵƬyVG[obZ_|nVMUgXjtttottfoquqyĬjh|dͿѿڝƪÜzuoyazp`hi`gs{td}jF;Msx{otkA9[yp^NUXcpG8AAIprlDBWGMUliPXOZ`K=CDDI?3KYFNnnexa\NorDIHBY\b]XpysmyVeriav{|rrvohZdbabdt~ds[rwm<=`ujXTS>9|qpfAa~\vahwXHWoVnr`m|}s[XPNOPRSTTTUSOKIJNPNLOSRSWVTRORWWYYVPIG;-9%!$&$&))+-//0/-...012/*# !!  %-1141/.-0662010-5BG6*4B@53:DD>;8/**,./21.2=1*363C4/,41?L@7:31:@=A21AC<9=<89?625>GB<:;<>BJC:?@;=BB=401=;997DRZYJGFJbqNWY`Wa]^Ue^`HGDRS^BKWH;ZN^SLPLU^LSQJJSZK?>???AEIQK4?U]OMLMDOH<>LOKIFKFDDGHGCB>;>BCDFPTPMH?@D?=DEEFKS[\XUTUWZ]behid\WLLNMBBG;:@>?B?=<;?FIIHGJHHQSOKHHJIEHG@EDBSUOLKKMNQNQGHC9;@CGFHHIKLMMMOOOPONLKJOSONMLMPONLIHEFFGRVSTUUTTSNILNJKJHGFD@?@@ABDKMIEFLLHIKHC@ADGJJNLLQD2+)129LEM[QB@?;('%(<>9<@@:2Sk,.5=Pqb586:GI>;55<>DJMPVvyrmkmm`XA6?FILRT<:YlWMAAJD=..75664BE@88ln>4NeYMWi[D?@=>AFJH>;64210..6?=:<@EIFHK@4:CFB:;>@CFKPVSTMELMNOICA?<:42412/049;58AIKFAACCCFHJKOWZWW\_]]`^XUSRTVWUW[]VKHTXPSRQTWTRRPQTY]ab`^^affabhhecijaY^YSWURZjw~wtwwvxxww{{xvwyyz}~yy}~~}xx{{{zzzxwxz}}|yy|~zwwvrorwwuuwyzz{zwwxwvwz~ymimqtvx{{{yuttuwwxxwwtrqppnjilllmjfc__]\[XVVUUWYZZ[]^`bcddgijlklnpmkj<;;;9764100/000014679=ADFC?@DEFIIIGGKQUTKFM_wtRGEDJQ_L;?AEGJOPLQWTHK]R98A@849<;;=EF9:UU;9BGLKB;?E@:=?=;>?=CGB?CC@DIFDGB8?NKEDEHHFDFHEEEDDC?>>>>==>AFIHDBABFIIIHFFFFHHHHHIIIIJKJJJIJKJMNMMIGJJHGD?>AED@A=49DIIIHGEDFFHMNOUPNQRQSSRQOJMTSNJMLDIYYNPQPRUZUTWWVV[ef`]^^WSUUW]`c_YZXVX]XVmqZYokRP[_]]ef]^mmcZVNfd[ZUTNEHGKLOHPY^jnqtrwajfkgmsk`hopqpnpt}pcYQYQOGQKBSgZRfhinwi[[imsvsrmednqsf\TT^hmca[ZXXSZ\faZddhmbcWgcc_bi\I[k\ZVY]^a^U[WTab\]]__^]^agbaehkkfddegffeedhhiiikljillmonkhghijlnnnnoqsroyȺzptlq̰scv{a̴[Lc}uvc}^ID]jTyomt{rp|›yvŬ{ijʽφӭʲtxvmqZyq^c}jlkqppfdENNhun_@MURefm^iUXVHMRGC@9N`JGZymrr``dzXAKI\dRb`[svpjrH]nks}|zmtwtgTe`ap`hgwpzpACh|YK[O8L{_qfTjz_TaZqo8r~jkjffyuo|{_TOOQRUVVURQONMKJJKKLNTUTWZWUTUUVYYXTLI@+-"(''&%&&(+./110...../)#!! "$')-20-020*)..+-3ELFBBA@;;CHB7796,+1/0/(+:2-A;@<32055>@73?52=LI96E@46:::98199FDC@:66D<=D<.5;@EJ;>55F`[SPQBLphOR[kU\]cVaf\A?ITYSILR:@]KYGYDP_NISCNNUM<887;AFNWWIGX^U^^ZaUQQQNSSXEGVPACDCJCJP?AU[PMKMDOF;@OQLJGKFEINMHGHCA@CDA?BMRVWURQTWXXZ\_dfcXHOSLFFG>=@=?FC>=@GLOMJOSLMX[RGHJKICGG=C;67757@:885=?88:8579LZ?/2/,2YIca4%(,??56546@KQWYS]ijiihiaS[H>BKXYUSJ=IeW=15HMA04EEB>DZYPB4[}d<1PnQMFCD>;=CJPKA?<;;;978JOGIV_b[UUWURTWZ\]`cebbdd_^aa[WZWOQVTQTTGCRWNPQRRPPRPMLO[`aba\Z]_^[]egaZag^T]]TSUf||sty{~|{|}wsuz}}~~}y{}|{|}|yzzxy{zxz|}~{yz|~~}zzzyvy}}{yxxvvwwz~~|||zzrkr{}zxxvtuyz{|}zurpnlkhfb_]\[XXXZZ[[[\_aeghikmligg<;;:9974100/..-.02468;?CFFDCCCEGGGEEFIPUI?@I]cQD?GOXhT;?DDB@BOYSRSJKZV96?AD95=?::?@=HaY?;?@CC??FKB45:;<<>><<>BEFFCAABFHHIIHGGHIJJKJJLMMMMLJIIIHILLMJBEIGFDDDEDCDEGDBHMNKHFDBDEDFNPOTOLRPPSSRPLEHMNOIHKFIZ[NOORTW^TR]a^]]`_[[^bZRSQV\]^YW[TRUZSSkiM[yt[QZa`[ce`_kuhYVLf^f``]YTQIRUTNdobkxuqqs]c]bahqj\fspomhnr|mfe\[SUPVVT^oh_jikq{nbammnmmmd`\fnljaSUbjofhbbcb_egid_hnllhf[hff[^icO_h_\X[`ge_\]_^aa]^]`aa`aeinhfinnfcfghga^]\^__bdgnpoonuurnkmnprtsqrttrsy̼úxpmʴ{]auwþkfuwz}urFGnxfyzy~~lkr~vtzstxƾĪs|~jǺ֠ϴʵsxvkg\}u]`{rtjmikg]J=MzuxhlF<~d_WIG_TQEUfdX^D:LS`cggl]LQITaPWWfd\qbfy{tlpBXjj}zthnoxjT_}aa}\as||wQMjwQGhX=_m^ii[o|cIRTP9Mkf_ichrio^PPQSTXZYUPLKNPMIFINQPTZ]ei`YYXTUWVTQLIB0*%**++**((),.//0211-)(&  #&-2-,0.+'(,..**4BJLC89=7:EE@03A7(0744-(398FBI.8:-6653067@<4,5NMMD67226@?9??;<<98815?:8918>6364248=><:?@BFFDLNKJJJJKLJKLLKKJGGFEDCA??ABEFKLIHHQUTSOKMOGJLGIGGHEFFHJIGJPPMNLLKDB@?>==DIKFBFFDJJHHJGJMGEGA;A@;@>CJQSQJNLCE=41+Aqq3(DE/-;FG?DEEJQTZ]\XW[abcdb[YaVNSZ\]][[USbcK;>ANG8;A<9>BDMZRA??>@?@GONA668:<=BGCPSBELF>>DGGDDLRJBBFIECEIHEGFBBCA>=>@>=@FFEEDABEGIJKKJJIIJLLNOONNPPOKJKKJHIJJLJACGDCBDDEC@DKKKPOMNJECBABBBCILNSLNSNORTSQNHFIQUKFOHH^]MOOVXY_WX`b][a_ZYYVSVUPNTXW[ZVXRPWZPSl^E`xsi`_`bX[e^^izn[ULf^knmhec[M]fe`sflzunmo}[_T[_iigZcnkkhcikvlirkd`jfdijlrrgjjhoyjcbfefdbd]XS_oijcLYflolljjkigklidckonkkibkkg]`jf`gkeaa`hoifd`gfcaababeeeefgpihhmlebilnlcZYZY[]chjuysts}zxusutvzzxvwyytsѶv}į``gz±pqzwnYfpx}tuwxq}phvwo{n{wxrzwȷԭw}wke^|[]yyxmjcef}yZL;S~puxdtKDbfYNS_LXIKsZJQ<:LSOYjhdgGGEOk[<.Ma]YHIYbtcVOddlpeEUi[fqqxYoxzn|i?Vhc{}wqedfzsQVzdiwWbz~cV`r[Ht\Acbeh[cvm>@YL]l7hh[W_fZZiht}x|WOPRSUY[XSOLKNPOKJOUWUXbink`ZWWSTUSONMKE8)&,*+-,-+*+-/112231,$"""'))+,+*''---,,.039;5.016@CC;2;H2)?87>..C@8<7.-:_WO:-4.,07>BEFGDB9.+@TTRKA98G6@doMQ\a<[weOChvQU^iZ[kT<9WRVPUN:CVWICJSXW?FTOIMM?1028LYSOLGLWYSTSSXSJPJUFGLK^JKUU@FK=GHGMAETXGCII@M?7CWPKMNHAHQVPEDDFHD@BFFFHGFD?:?>;:=B7BAH@KKB>JIMOPRPOROFJIGINMNQRPIFGE?>?>?=56=?;9.3<4.11026:::<<@DCHHGDBKOQROJKNGIKGIGEEFEDCDEDGJGILIHIEDFE@@9>BJIEEGIKNKQWPNPMLMNOSPOPKPTWWXWV\]XSNG?=;:952000/-++-/13689;>@BDFDA@ACBDHF@?FNG424ARJ+7LHjkB9CFECAABBBCCEHFEB>?EPO@@GHIMIDDBCGGHMPK@:99;=;@JAEK@GKC>?ABDGJHFFECEFDDFHIIJKHGGCBBA@>>BGGDGHEBCFGILMKJJIKNMPTUQNOROKMQMNMJKILLCEGCEDDCCA@EHFHMHEGDA@???@A@EHMSLNVPIQRRQPIDN[VIIN?Ne[NOT\ZZ_]`aa_\agYVYMFN[ZRVZY`[SURRXWJ[mNIhmgjg\[`XWea_i{s_VNhcnytmlnbZjvtsvlhrrikjwY[MTWe]dT]jiifbgktnnxsiitvorsrpvgjifnxhaa[]\\^]^XSbrlkfQejlnpnnnpkfjjifgloiijedijgdgjhinligchpriifbggfghifegghgefpgihklefmqqogcbbadgosrz}wxuyxyzxwwxzyy{}˿ʹ|̾ɶo}zu}|{`|y|zrw{~ypmssoxxpxko}smw}zes~r|swɽ֘ձ{wje_Z_|zvk\^e|zoYL:[isuitIQ_jZRd[RWQ_wTISGIL?@[`WiWBC6HC8HH6.371=G3+0=1:G;KL9A5.2@Z`M5(-/,-16<@@BA@2*3DPQQNA42:J?KliJPai<`qdL?kvNQ_jZ[hJJUE?6:?99149302214689=?>>BEBDKE@EGD>AGHHJKICH<;>?A@><<;<@?ABFFEIMPPNJHIFGIHG@=AC?=;=?BDAAHIFFEFEHKHG=BECCFHEBCCCFMOMLKHKONQVVSONQOJPTMSQIMKNNIMIELHCCAAGDAABA??@@=====>?BGJPSIJPOHKNLUUIJV]WHNJ:Ug]PP\a[^eadbceeik_]]WOScjdcdhk^ZXOTYTKda@Kh^amjZT[]]llkp}g\aomwyuponhflqrxssaimgjhsUXINR`W_NYjffcbimxuuxrlhnuoononqhhhdjwiaa\XYZhbfe_krnmi`pojjpmjmqkdhiiihllfhhggjiegjkhjmlljciqoffebdfjlmkhgfgjhdgommlopmlrtusroonoqsy{x|zvur~yvvuuuvsvy}Ϲxʿjhr|}qhzyrldkhgwro{itsms}xr^t}tw{{svž¦۶ǩtkae[czz{iUVdxuk]O?czdqnokJbanWUmZ[Yqz_HWYFQF;E]U\hRFSgk`nWMNWgxe_hcPwrrqnbJQgXmtpla]Vn|PVlxtaio|qzqntmVizNyeEec^Kh_vw/5ai`nUHxjNMY]TUltgfioxzhRPTVUTRQQPOONOORTUX^]^a_TJGHFCACFIJJHHGJC,&,*&'()*,.12453.*%#!&/6;;;9223348==3,581,)->C;HG?I8-96:B;BC7H?QPD33A89E5*.??BEIJNOMMNLHGFGKOQSST[]YWY\RPTQIDJLBAGFDBBABJHC>=MTC=@;7=C77?BC?<BACCEEBEIB@CEC=@EFGKMJDJ?:>===;:86:959;BDDILNLLJFDEGHGE?:@?89:EEEDBEDGLMKGEFLJA?DFGOSTYXUMJJIHJMKJIKNQSTTURPQSPPVXV[[QTTSSSQXZWXW[\XZ\[[XST\ZQX]VUWQKRZYLFNRSMHOQRTOORUWZ^^[Y^ZTTUW\\YWZZ[\[ZTX_\\ZUYa[WXWZ]]_XU[[WXRPZ][^`WWWYXVTQXVQSUVY\\X[[]^]ZVX`e_URTSRQRUTPNNMLS^dceaYYZ[_b_[\___]]ZY`d^Y^ec^`ba`_]aec^`^UTXZY[[WVTUZWZOLXKJFMWc]RTZVEOjxzy{xuvy}~|zw~zzz|}}}~{zwqov}ytw|zz~~~|z|}z{}~|zyvqkf^ZY>=<820.-++---.12367888:<<=@A@<9;=>@B?=ADIM\TFD).GMUTKGFHJIGFFGHGGKNLIHEEIJHGIJJJHHIIJIHHHHJKKLLIFB<9:<<63?=6:<@A?>?>=@BBBBBDFGIGFJMMMPRPNNMKJKHB=@EDBABBBBAAFNQPQNGJOOQUVSOOQOEIRINSJJKMNMQMJQPICBFKE=?@BC;79/2DQ92>PR>=BJPQSV;+&(/-++-/2;@CJWWYWLDFF?64@RG@OUfWDRi`CdcgD=hjOTbiY`dD?[RMN`M-8ORI9Mr^;MPKM]W<2/8LXOETfmkaXQGEQaj[itj`JGFE[U[UMTHHCJFDFFEHTS>6@QI@47MRFNVL=JX_MEECHP]]HGKRIAFGEA=A<=<>??BEEHLNNPQMEBBDGHJKOTXWUV]`UVYTLINKCCDCA@@>@EC>9:NPC?=86=:47A>9AB9<@?@ABBCEECBHIACEEA;AECCIOJELA<@=::9866;3/89==AHKJIIIEBDEEAAA=>=68:?A?<;;=AE>=CBEJIHHHIJJDEJOOPOQUWUKLIHMMNNJKMOPRSQOMLLLKMSVQRZTKJILNIMONSSRUVY[[[[SNSUMNRQQPHFPVSIELLKF?IPMLKKLMMOW^_XWWWWWY\]XW\YXZYWTX[TUSOV]VQQQTX[^TQWYUWTPY\W\_UTSSRTRPSMKMONNPTUWUX]\XRPYa]RQTROMKMOLGJRTW^a_`^Z[YVZ\XVXXZ[[XRT^`VS_c[Y^^[[[\`a_]_\UY_b_^]\\[^c__USeSNLPZf^STTQ[x|}ywxyxwwy|}}||z~ztwx{|~~~}}~tquxxtwzwy}}~~~zyz}~{|}~~~xqida`==:50/--++--,/12478998:<==>AD?99:<@?;;@EONkrA8?@==CEFIJJIGGJMMOPPPNONLLLJHFGJKGECDFGCCINOQVSIJOMORTQNNPNEFOHFRMCEHKMONLNUPDEKJC=ACE@6;@BIJJJKV]ZSSaaSPVMJIJMDHTYYTTYJLhi`_fhacmkjlhiimvshiiloqpmrztpjrxXMVRO[WDQilw~qlt~}|zxmlggmhtv^\ehlcqTWILU_TVNakgjiipqy{{sjjfemmmebhbbgfffqwmpwtuvvurssqmllkoligdihfgffdihilhkkhfigcefddghffehkiggffedccfjlkjikpssstuv{xxyyxvwy|{zyzz|~|sjmnuroompvuwwzŽŨƲ~tlzf~~epnak}wzyomjc_]Pwt~{mswob~egitbiXWjjuvuqjyxŰөط|zdml_kxvzbMNbsnh`VTecbghz\XyxTRb`l]hmjR^aA=SZc_XZh`aOGUkb{|S:K^sdQ^ZZfML]Ztv|zxf\ixoqwgdm[\maglni`bQ]|[Zxzx_{c^lw}fmf_tnQ|m\]OJgxeK;t|l}hBZneqgV]ajgfkedltskWSUVVQNNOPONNNOQTW[^ZOFDGIHFCABCB>=AEEDED8+)(''((*,.124.)%"!  ! '482,/9PPO]U@78:89A7-EJINNH>>CHHB?>CPRmeHL[JJ]^D4YO?1;TPEPTI?L]YGHEFL[i[MMRUKCBBBBAC>@=>???@@EHGHKLIC@ABDDEFKPPQUXZXV[[YVTTLDDB@?<>==?<:69KKD@8248=9:@C====NIFCMMKJECCHMQROLJJKLNONSQD;FB=AAAA?AA@BEBDLLCDFD@8?DB@DKEDG>;;::69>0/979:?ADD?:9:><9:=AKP_S=D=8>ACMOFADFEEDDCCEDBDEEEGIJIGFGGGHJKJIHIIIJLLKIJLKHFECECAJIHKKLLJGEDDB?@BGJLLJJHHIJKQSONNPOMLLORRQQPOOMLNLIJMOPRXULNRNMQRPNMMNJFMLCMN??BFLKMNMRQHJLGA=AD@::@LYZWX_aeidY^mg^]a]XXZPK[Z[][^ZR]nfafkg_enfmqgeekvrmjjkqpmowumln}Y[aYW`_ex}|{prlbqmpr]UbhjcoYYNK\b[^Vjonupmsqyyyrjligknpfbjbejkjhnvnoxwwvutssoiihhekfcebadedcdcgfhlhjkhffdacedcefeccfgfeefefffhnqqpopvyzxvuvwwwxz{xw}}||zzz{hdklnonnmpvxwwwòıŸ¾ĵzogszicbdU]qzv}zjehd\VLiuujn~mVy_aaq\cZS]f|vokgfwvrpʯϭկζ|yfovjozutZKH`plfa_]__^]gxZ]y~nLZb]mgnivS_[GCgn`\T^lh\GGodsk_:0*)463.=C::=;7404=/6I3([jK8O?VF,4>@H/,H_737;<:AFE2.3;5,:GCB@A<<=?=9/8FGEDDHLPB@ADU]GFSiZKb``2=`kS`bhQenSOaSUI`:-EO84[oETcQ<^dO9@`g[QWhrjZJKUcjnng_bhftmS>THMUMdGLSMHHQ>>FDBESJ<4A_M=/CTMFTTFCU\OFKFJRhmXRQRSOECFBCCCAB@@?><:;6=:8@D@@DCA??B??DDBDOMDCGHC7:@C?AD?C@:>B@AA><6:>,/729:9>?=?IKIKIFEAAHF=<=86==:886:?;9=>???>=;ADDCGGIJE=?BGJJGPJLNNNLFJMNMMLH==;:743569HYvS>E=5:EFVnV>CGHFCAAABBABBABEHFFEDFFFGIIHHHIIIJJIIIKKMMLLKMKJSQOOMPPNMMLHEHHCHMLMKHGHJHJTRLLMPQMKMPUYXVTSTTRRPNPPPRSUSMRSNNQSSOLKOOGINBGN>:;BKINPLMMMKHC===?IMJPahd`eqpmqh`jnbehmoddfa_h_\`fd_]bmadgdg_fj[gpha`iskklclrjjsxkkv}{iuxrkp~|y||~wvxastmm_S]ghco_[UQejggartw~vqwrwuupnmgmnmsmgmghjojhmrlnuspmllnmiecccahedc`^_cb_acc_flgfgecb`abcaadfcabcddefdeklnswyxxvx~|yutwy{wwwyzw~~}||yw||{|zuddijlnnnnquwvszºªųźznfb|\hW\UWct|sxxf^ca^PIbwmfnsYoZ]`hY_^TMl`vmgaeqvztqxw͵Ժ־|zio|ym}smTHF_lifdfd\]\Wfx[_u~_T`[]kpfkyM]YKPumSZ_gh\K@VjUyWRU?TMIZkL5`sO45VSGV~ljfkreZfcdeeefhbYpTTnXTni}axh_nk{y|vLZgOofZ~]YU`t|mbvnPjlSPe\X{ZOvgRZUX_`epwzwdRQVZVQRQPMKJLSYZWSJDFJLMNIB@ADEDBBCBBBCD<-)--,+)*,.01.)$"!&%&/@ZL;19PVMB8-,60:11=:49832,/>63F9._UFFWRZ94CEB81IaG03327?NI9*>=24FUOB81-.48237>HLKJJIHHG81BBWXFLUlSP^_N/BZfK`jfQinMX^TSIZ<5IF.LiNQnV6TgP>DgfRDPej_RNWcortpaUWZVelUP>YKRSO`ERMPLIN:A<9=AA>@BB@>@EHHHOXTMR[^]]_\WVUTRMD>==<:<>5-9BEF@9?>29@FDCGDB>HFEICA@DOPQSI@DHJLOKTRD::EMH@@E<9:<<>@?AA?=>D?9@IDBDPNEAHML:6?B>B?=B=8=A@BDA=59<,330<87==:>ILNRLJNLMPOGDFD@=@7342;>66?>@?>8=@CFFAIDHIHGEBBIJJJJG;8BA::@DKIFMLJJKMMKNOMONNPPRWWVUVRMSWXTQSOJLNMLKQPEHJHLJKOOJPZQNSXLPOILSWXXOENOJVRRROIJLC@HPTOIADEDPVA?QWQVZTOMMYZQLROMORNMQSTX]ZUTRPIJOPF@IWTJJWYPLPSRQRRSQPSQNU[US\YNTXPIKNKJMKBDMONSVSSTXYTUXWUWWQUWW[YVTTUTRPX`ZZabbc\XQ\VSPh~~}{{yvtuux||zyzzz{}~}{}}xusqqtvwxz|~}}xwz}~{xwz~}{{zwsrqoos}~}|~|{}~|wspnkhecc651-)((**)*,.0246:=>><:999/**,-0EX^^I=C>59CCGfjI@HGDA@@??@AB??ABEECABDDCEFEEFGHGGIFEGIJKMNLLOQNNQOONLOOQQQPLMOJFJMKKJFFIKGIROJKMPQKJMOSWXVTTVUSUUSSQQQQRRPRTQPQUTRNNPPGHL=?H<58AIHMNIIIIC@@=CEO^_^gnjddmvtoqldnm_hlrsffhjhee_akaed^dZdfcf^fhTdog]Yblgji`khakzyltslp{rz}zr}{kx~ppcY_ggfpjad_qusolvsy~uq|psqrorkgqpltqnohhjnhhlnikokgeggffgdbba`ggeaa_\aa]\_]U]id^]]_`\\`aZ\ec_`a_dgjfciqtx}}|zzyz}}|zqnuxvzwwuw|y}{{|{usxww|z~odfjlknoorpryŹ~͵ô²nzzxnc]lfhqTURSZbu~ooreY_`cKF]|yexfosnjTWdhTW]UMrqYtxmn[rdiiqjpr|vмѼȧȿǣ{|lx|nwpiRFG^hffdlcWYVTdsZau~sVY^Q[kj_spPaVL_sYHbmgUF>BbYemVibK-'418AGD<=<8=DMSNC::A>BHGCBDECBCGLKGKUULMZ^\[\[ZYZ[\ZVLCB=<:GCDGA@?BKORUH>BGHJMJTQF>>GJFAAB:97>?>>>@><?@A@=6:<4;34<46=>=@HKNPKIMNPRPLMLPOEF>866?C;7??ABDA?;@=CBMDAB>9=AAAC=C@DD@AA>?FGEGHF;8@A98>CJHELIHGHJJIKLIKMJIMORSRPTOLQTUTONOQOMKLMPQLKHHMKIPPIS^VY_VLROKORTWXIANGHSHJRJELKBCLLKQF=@@APS<=MTOUYUMKMVYSIOPLPUPQWWZZZWSUY\UVZZJCPXTNRY[OEOWOKRQLIMUPLW[TSYYPRWRIJLHGHGBBIKNRRPPOUTQSXWTVQLVWUZZVTTUTTRXa^\ceeb\ZQVOMc~}}{|{xutuuz~}{|{{}~~}}}~{wtrpptwwwwy||{x}~||~|zwx{}}}}|}~~~~|{vsqoklw|||}zz~}}||}|ywwuspmjigfdc21/+(()****+-/137;>?=<:889;=?DHGEE=.'%)15BKHKE>A=7337Bl|Q>FCAA@@@@@@>>?@ACC?>BCBBDECDFGIHGHECHKJKMKJKMNMMNMLIJOPQQPQSRNLKMMKIHHJKLLNMNKKPTMGKMORVVSQTXTSVXWUTTRRPPQSSRPRVUSQRQOJKF=BA98?EHFIJFEEEBAEJOVbecmrljikouspojnukdlmqnbbccdahb_ndd`Y]\dfee]egYeogZY]dbgb[gcbsw|}zm_eqkp|tpsgt~s{vvnflnilvvnsqzwstrsru|ur|plnqopjiuqlvuqqjhknhillfjlccddeeefcba``dhgaa_[_a[XZYPVdbWQW]^XV\\TYeaZ`a`fknhhpuy~{zzzxwuwzzkisurxywsv~|}zz|zqptqs{{vlbfnronqrz{~vпǵy|uqwwn_``r\}XLKQVXmkajdV\^aODWw{^hfosvgRTciRL^ZS[^a}ynu^af_adanmvxxʠТϸ̠wkrxpmdPFJ]cafeo]QPSR`lZcu}dRUUJ_hcdye[aXRhiAFcc[MDIQ]ZmXKas^WXXqTSmcQWssQ-@9.*2001(+--0,'$" !)519GZouhqi,(.760,8B30-&&2.=BGE?CblZC?@K82On{dG08?08AD@?>>=8BJF0,JO=QNHdydB`Y`Hs~]\faaXEXMIM?@@?QULXcFJ]WKPYfF:IVRLR]cfgikie`[SXJ\]eeeZ`QRSXXFYKNI?J@6IFA@M=9-BdJ?KVGJIYHHbWLSZPEMfjYVV^bX]m]LEHNOHJHEDCA?@CHLKGGHGBDJILPMLQRLNV]\YVVVYZ^_``ZNJE>@AB=037?DEEGIKLMLLOOJHE?9==>GBCG@@?AHNSSH<@GFIJHSPGFBFIDC??<9;=>><=>=?B>6;@BDDBCMME@EKL@7>@=B>;=82;;=>??=:@@>A7?<9?>CDCIJHJJDDJKOQJIIOSNLFB@=@EE<=@?CJG<=E;=?JFC@=;<><=@:9;BB?=@;=BC?IDG?9@B;>EFHGDJHGD@BIIIGFIMHBJJIKILSJLPLOSLJNSSNIIKMNKJGGLLHMOJS\Z]^XTTPQQNMTZG@I@KO;DNDGOMFGLJHLA;>=ARP8;IOMTYVLFKSXYHMRLRVQSUU[]XQQWXZYaecUNZYWXY\[NCQ[LGRPFEPWOMX[SSVZRPWSJJJGFEDBBBGMSQKFKSQORXWTULKXXTZ[WTTUUUSXcb]bcdc]]QLW]~||{}|wuutu{~}}~{|~}xsqqsuxwvtwzzwwz~|xy||usv{~}zx}}{}~}~~}}}{x{{|zzwxz}}z{}}~~}}~|||~~zwusponjgfedcb//-*())*,--,-/137:=?=<;987:=@DEFHHD6)%)38=@AFA=>87508Af|U?@@>>??ACA><;=>?A?:=BCCCEDBDGIJGFGCCGJKJIGHHHKMMMLIFINNOONRTQNMNOMMMOOMRVUQNPOOUWLFLNOQRRQNQSTUUVWWYWWTOOQTSRSTVWVVVVUTRIDIIBBJNJILPMHKRROT\^acbhrpkiiossrpnhtxmlpomjeaafmkmletrh`faefjid`fjfhng]\cegg\Yfow}zsxtttu`S]kenwkhi`iusuryyyxvzwtrz~|yz{wrrroppxtoumhjnmmiktpkutqnhgjjeiliehhbbeeeddfeb``_]hg^[^YXaVTRWOR[`TJX[ZQSWSSZ`aW^`hjlnjmux{~{vvvtspptwyifqrptwwsv~}ww}znpsps}}umeisxwpsư~xx}÷̨l|oorn^^[pz[yhIGNTR_}kYacUZ__TDRrzZahnryeOPWiYGZ\YTcUkz|yptqZvgV`_WlklvyզժպѝqkjmmaOGK]`]ffiZMJRQ^iYevtVQQOM]^`kpbc\X[q_;Tc`[LJXVSYaRTgrT^`cfVaaOwg?5EXƔOKbRQ|iXcUNW_[T[l][W[cachUEqXq}mjnculfimukytOTh_n\NXXM|zVvXk>rzzBSmg]RQYSSSTWX_eadkh`\VX[WRRQOKHKXWKIIFFJKJLNLGFCFHGFCA@?@A@>9,,::91*-,**+%! '<=<;:8?HG=Jcr~J660662fQ85+%"%,79=6@LeP>@:VM4=Pit\CN[92@>61@LGEOUUOIHLPKC?CCEE=9447FPI/7BNH6QLPuiVH`ZkI>JSLSbQC[VKKM^ZEGNNKJS[]_eiic[PJTYb^]hlhc[PJS\TFZKNH>JB6HFB@F:9,C_IBXQHILYCPcRNT[GHPgbXOTb]\pv[QQWSPMOJHGEB?@DIIGGKHC@IPPRTPOPKJT[[ZSOQTVY^ba^ZPQL>EOK::78?CFGIJORNNPQQNJE=6:;?F@BE>@?AGNRPH=?FFIIIQNGHEFGDC@@;:=<>=;BABDBCLJF@BIKA9????>@IEGAGECFDIRFKMHLPIGMRQLFCHHGEFEHNKHMMMUZZYXYTTTUSIGYYC@HEKFEHKKH@;<@<@RP6:IPOTYVOKJUVWJMQLSVRSPQX]UMPWTWZ`ec[YdZZ`\\XMJT[ONTPGNVVPSZZRSUYRPURJJIEBCCB@?FNQLHCISOOQVUSULMXSUYWXUTSUVTWca[a_`a[\RM^t}||}zvtuvw~~{}~ytrsuvwwutuyxwwx||yx{ztrw}~|{|}~|}~}}}}zwwz{|~~}|}}~~~}||}}~~zvz}}~~|zxsqmhdccddbc--+'(**),--,-01469==;>=978:<@CDFGEG?-*268=?@<5;9573-=N`fTB7<=<=?CDC@;:<<=>;97'%*&1>3/?TZ31?9fI:R`rnVW_D:KI20;?=>DHGFILMIFCBCEEA;8:9;EMJ:<@LE7=SJew[HM[foG;YLBSh\ac[OCIWFFMC=ILKMZ`QUUNKOYcXLJJIHMOMT_`XOJEGPV\^]cjrl[SLBQ]OFZIMF=KB8HFD?><:.CYKF`LHIOWBTaNO^RBTTaXVK__\k{ma_`dWS]XOOJHC?BDA>DPN@ANPQY^WOMHHQZXWSHJSVV[bb`]\ZUJGTVDACBG?EGIKMOOKLOPPQOE<8::@E@FNLIG?@GHJHLOLEHCBDCEFB:=:9>BE?32>C=?DDACJHFBBGJB=A>8@;7:44;:;;<@BCHGNCDIHLFGFHCABBAC@87:EMGDDEEDFHHIHD@HFFL=;FG>>D?@==DJF??<45:84/6=9@;?8>9AHMC;DB@BAGOCIIEKNFEMQOKGEIJFDBBJOJIMLQVVUVWURVXYMAGUUABCFN>8IE9C?;CIIGA:;AB7=QG8=KWUUY\[WS\YRMKMKTWSTHMX[RLQYOPY]ZXZ]c[]bYYPMXZ[YZXSUW`VR\[TQTVURPSIGKIC?>:999;ACEFDCGB99<:9<=;99;8771-?U]ZWI9;<::>ABCC>;;:8889;=ABACCBCFHB?C@?BFIJGBEFDIPOLLHCEHJKKKLLIEFIGEHOQLHRYUPORSSVXUPPQNLLGMOKHJQLKOQWWSTST[\XYXX[^]W[_^a_[Z\_^XW[ab^aggd`digijhihfinokfgmpnnk`Vbno{xopouxwtxtsx~}~}}}{x~{umooz~povvz}yx}y}}~|nqsh]k{wlerlSKW^Xjqcbg`fe^cacnqvz{zyxxvuvqouskimmmkpogjifb`_inomhkrldadea\^gidbceffffdc_\fc]_YMUcVJWTRURJLKIJ[UJEPULCMML`\[hd`dffjolkrorokojlgeafpoqecjjjikstx~yqnyxmotuq}~trv}|ĭxlqxx˿ñХy|rzz]mxhZ`iWP]wfe}wV@HNPQl|kRK[VW]]aLG]mVNfmwo{]@GDSdRGTZ[[}ZNYlnne}kcPUXglah[ss~{xԱݿƙ˼ʞ~y|qj{oraPKTab\he[]NDQW`gWnqXMQEKT]Yij`i`eihoUPhhTMSYP8HN\JMXacjZQMRZP>EZYBiuFF\R>JhmZSITaZMOd]XQI]d]d[?llgna`pVqqdhkmcfZT]}dT4UadF\mygdJsPCp`gaSQdTTVWX]djooklhda[UTTUTTWUOGEEFEGIIIIHEFIIHJJGDDDFDBAA?7*)3@E,+..+"*&+GH:614:8?dprpRA-G6),1/F:*9SS/,8;sOE]qv`OSID]M+-?H?447;AECB?;:>CHFGHDECCDC;1BGB?6:LVOwmf?Q]vp@CaLHl_^ceVDCLQAHL>DQDDQZ`[XJNLYeYHDEFHJKJS_[OILWce\PMV^hnnlZPI>P]LO[FLE;LD;GFE=;@:0BTIHcHFISRBVYMOa@NZUVSSUc_gxvdidgb\ii`\SMIFDFC>>HTJASWOYf_MHJKMTURQICMUTW^c`]^aaRJU[VKNHIF?FHLNLHHILMLOPJFA<99AD8;=;A=?DOIEFAAFKLGNMIFH??@BGJD:>C@=77@FE<2;B<:AFD@DHFFD@DHAJGBBCCCCEEEHJGHGFMIGGFGFCABBDFMKDFB78;5/-696A<@=B?AIIIIJFFOJIORPH@EHEE:?HFB<>JM@7?==>>DH>FB@IJBFNONPKKRRMHCBKNJKLLSWONWZSNTYWIBFONEC?>:899;@CDDCDECCD@<<;:;;<;::7/0?HEZjQ>;;;;<>>@A=;98888:;9:=?AAAACCAACA@DGHHDBEDELNMIHFEFHJHGIHD@@DD@@EIFBIRRNNOOPTVVTQONLKIGNKCDKNHJLPUQRSORY[UTTY]]YRX]]___ac`\XY]caXYeleX]dcilikjgegjgabehjlgZTY]euohppwztjmjlox{vxzvwt}toqmxwvz|~{tu}z}yvyyvv{{mttdYhwui_okTLVYUhqb_edfb^cgfpvyyyxusrpppmnqpmjolmnnolkkic\aqrljimoh_^gi^[gmjhfhifdb`__]T`j`[[QJ\XISUURREIGEH[RDAITOIJHUi\aecdebgoojlpgnngkdfcf_aplobbjeihiuuuz~|unjssjkqvns~quvugsw~պ̻ķ±ǽΪz}yv|rzzlwcYur\Q^aPSl}g]q{vaKLMOP^sjQESST]YaSHXdWMblviw_@F@C\_KNTVYot^JOcbfd|slNRbYzYeXp|}qĦѸϜϱʻw{{oxu_QR[fg[ieW_TKRZ\e]keQPQDMU\Ykg\d`kkhhOXi[JQWaMDKXdVTY[dfEIPR^Fs@AWMHgCM^OBR[\SIP`[LL]]VQBWh^a[Fktfm[VwuWns`nnpZb`QfWX0UguSC^u{_lyPw5++.>67BJP;20IUZatlq9[izr:PcSSa^jgODVSMAOJBRM;CO^cXPNLM\S>BMFFFB@DKKCLKIFI==?DHFE?AGB<;>AEC=<@;6@JJHHFFHFDBEG?;A<5==9>:><74=A@AKPSBEMFDKIIEBBDB=:9;<:49FB:>AAEBCCCDIKJHIJIOIGLMEEDBIJMLINJ@@A802<<6B?FEGHJUKJSQMKROGJQRK@BJID8>HEA>>JL>4:8::;AB;@;?KHBJOOSTMRYWUPGEKKFJJGLMHKVYQLOSRPJFLLGG?LE2KSCBKR[]VY_ekbb_OTTHIRVYVLHNNLJU[EGV\OPPU\\[NQX]ZT[`]YRX^ba]bb\QQRVSUNPH?KJF;@@BACBBCB?=<<=<<=805B>;JVP?7:==;;<:9985:<98;?@@ABBACBCCCEGHFDCAAHMMKHFGHGGHEDEB=<@B@?@CC;?MSOMOPMPTUXUNNOKJJLOE>GRLCIJOOJRQJKPROMOX\UQQ[_\^afe_ZZZXbaXTOZj`QW__dgcghb]^`_^__adifYSUV^jd^aattndbceapqlmnolkwrmormtztwvyxqq{{~}|{~xqvvrtvtqt{{~~yruth^hqpj_okTNVRNfm]]cdcbcjoms{{yyxurnmonkjkljhlhjllmlkljc\gwoiijlia]_ikbblqoigggdb_[]]]VcodWVVEMXLORSQRHEG@IYKACHZYTOP`i_c`_lkfntnhjmajlbeab`keanjnafmdkmkuvtuxxqlhqpgjnsqm}|ioľ̽ry֤żǭ¸¼°v~vyzo|szqlz{lbvkO_pdVS^YM^uhXhoogOQMINUghVEJNP]W\YGS_YM[grcrb?C?=5++.:S0*()*&!",=B>@EIC9LWatsvqaZO?;=E89VGCR@9=6O?QsGJUUN@;EM7.7DMOKGGJF<;<>AEJJILNMC;:87??8856>=?AJDFFA>BKJAHIGBG:8?IBBB=DKC>@@BC??@:5;EIHIKGCGEDEDFB>@;6=>;=:@B50EF:DQSI=FLB@HCCC?CGA<;:;?<69C=6;=>DAAAABFHIIJICHHFGIFJE?:88BMEBHKORPLSWX[VLKLEAGGDGHGJORNKHIOSNKKPGLLSG9@B8?F>FI;:DHLNC=GPOHHLPRVVX[_`__`QORKHMQTRNGFIILUW?IVYQJJRaZRENZ[RNW\XRQ[W][__YWNINSSQHOO@NNOB9?I@KZONWYURSPFFJCHQNSJRTSUQWKLMORQONLIFMKLWzzyvv|~{z}||zy}~~{uw|{xy{|}}}{z{{|||}zyx|~}}zzzxxy}~~|{|}}zxwtplhffeeiqx||-,*(((()**+*).11342489:<<;::;<>?@@ACB@@?=@A;?=:5NL96;><:9=????<:956<>:9=@BA@?@C>:EPPNMOPMORVXRMPRLKNQNA?MVK@FMLFFMJEEJNKKOWWOLS^\V[bd_WQX[Wb_WYOTcZLS\\_]Z_a_WUXVYYZZ]ce[RMPY\]YX]kmfY\b^Wkicfjgcdjhclrostpups{vqouyvy{{yzxnntsrrtqotvzsy~}utxtggrnpujroWNVKI`i^^ceghjrsoswyyyxtoifmojhgggehfffjjghjhcZdpfbefh`]`chjhhjppigfcbb`^__^]jogWQXJGVPOPPQRSAGDLUG@KOec]Z]ecgdfattmrrkfejbcicfeddomhpkncjqisrjosttutoienmgikqmg{}lnн|۴źʿºIJr||tv{lvylpwhp{ss_boXNbg^QP\QPkkT^jecRRODHP^e^JCGIZYT\KOZ\OVajapa<@?=DafQJNMUZVOMSZZlZ|suaOk\v\g]ix|ܻѼƮt|y~xkrm_lqWnhQaWJWZQfe^U]UNKYYZeoaYbipcYIPePR`[hTHIMk]TcY_V8CZZUO[_:LVTUBL[]NBNXZeQMNb]JMTUMQBMof]]InzopvbiyOqv[mwylz\XofeNejG\_yhHPbsk]`Y_zJ=PLtzgPSUXXY[WY_ceoyzrhb_bicVOGDDFGHGIKGGMMIHFDDBBA@?@CED?=>?8++4:P7,&%'% #0@A=@EC@=@p{fPVi]h{ibK:<=LJE:0@@CKRL<226;?AJTUUNC>AGMPNNTYG4-:AJXhjourR7fohhFe[UxyatUI\rXEPWKa^;FFZkSLXFHKBGIHLZ]UONLZhaVUWZ`f`Z`ny|vd[Y^L4DRMZRBBC;POAOSE=CT=;MMCQWJ?OKJJMD]cHNRCSUX[V^mq__d[Zevpkg^]VGKWXZa]OT^`cTPdpga[VQMLHJF;FNEHZ^SPY[XUUW\cgd^[[XYECOL:DEDEDGGA;759??;945;;@?GDEDB=AKH@EJI>F94?H?C;8FMD=>?A?EG>2348::9:<55DLBACGJMONPPT[WOQODCFFFIIIJKHJKFBIQMJHPNMRVKKOK@BFDLG;BMNLG>AGJLKGHMJQTUUTVZ[_UMJLFKLMNLHDDGOQQ?LWURAGPeTJ?OZRIMTTUPQ[WXY[ZVUGBOQNLJNPFTOPC3=J=;99=CB>BEDED@?B=9@@@?;::=;87C\N59<<87<85:@@<N^]OEMWPiRRPh`GIORLNGHno^jFr}qspdxMkzXhws`wpWizbUYkOh\biNkfebQIo}p<:H[uuYIQTUVXUS[aektxxokiee_REBEFGGHHIKKJGFGIIEDFFEDBACEEB@>>?:/-;;@9-'##""-:=>?AB?=;hvaLC[^btlc];/415;NLAE:;A?DDDCGJD<866;=@=:757;A?GCDD@;?JE=@OP>D;3?I?A5=>;GN?FDEA?HH;<:99A?;7:;=A=6:?=>>?@ABB@@@BFJMOIEEC==AKE:?CCB?===CJHGIKSSHKHJFE@CEEGJKFGHFEMLC?BISN@DDDBA>CF>662;<<99=43DL>=BBFNRMKNTXURTQGIJHIKKLLMBEKH@CNKFHJPKQWOTZXLGORQKHLTQF??ABHOKCFNGNPRPMOUU[XOIKDGJBGID?>DSONANWNPBDOaLB>QWMHJPPQPQVWRU^XVTCFXRKOTQOPTML?>FAAPSRSZ]RPOMMICCAHLM?MXNIHQHFGOQLNNJC=@G]~|}|xz|~|yx{}{w~~~}~~{{zyzwuy}||}yyxx{{|~{{~|yxxuqmjhfghhihgff,)'(((((&*0347<<<;<<;;>AED?=:;DF??FIHHEBB?::99956L`K7;=<:9=@??@@><88=BA??BECA@@@CCAEDCCEEDBBEDEILNHDHJIGGHGCDGHKHBDJIFKMMNMNPOLKMMOMJPSONRROJJPSPE?HMGLOEDGJKKKNVVKN[SHKTYSLMRXWUYVZ\RY]WVVXURTNKTXXVRTTTSTUWa\KAIWRRLL[hiZQVXUYgcbf_]_d``cgnonkjkiimjigmvspststunflsrrsplmrvutvqrxgutttwtu|tzyojjc^bntqjhlsrnmkehrqkorj\[chede_Xch`e^ce`_`ad_cia[_cdhhfdjgaggbecfe```afcadhjlilccc]bb`^]YSWQOTWXa]]^dcfb`iiourirunlfhlhkplqyzoqypuqtmlkmnpoljllsrnotl`mphklotiwm~½»otynpv~}kcw|lajymYcxsgc_`h`YYZTKQTGPi\Pgf\^KQT>HY[ZU?BINXOc\QS__NVYVZE4:;P]]QHHQGkPWQjfKELQHHJGl{doHlixhsUcY^z~qXky\[gxTPkNmXoanXcpFH{vU07BftooOKPRSTVRU\ajqssxsusncOECEFFFGHGHIIID?BIIFDEECBBBDFFDA@?><75<;37-(# '4CJJFDA>?dui^V[WIne[U8.82(+9FLOD9D:;DVM>5CXUQRTYUC638;=BJTWUQKB>==;94:FI@8L^km]i\W>DhimXNqglm_m\QXoI`_L`fMRLQkUHUGBDZ[L\WQHMZchjaW[[RNUgyvlea\X]`_]ZRHBIOSQQP@8W\OIYRIGYEMMFP^HC@UHR]GTiNAV@Paa\X^ah^_^O]mrdcigcXSY^dhga`lvrlhdgqlhhd`_ca[QLSJ>KYMGOUQMLKPX`jb^cdcaTPPMGECABCDBCJE<9:<>>>D>::68=B>DBBD@;A=:=F?@6ELA<=@GD>==9;C98HHE=@BCBJCANBA@BIC99876==66><9?;4:?@BCA=<>@DHIJKHEB?=DID;BDDD=88=AGCEGFOQBFEKI@?BE@<;3=?>::=65BL;7BAHORKIOTSRPQLINLIJRPNMNCBKKA@KJDECFHJUMQYYOPWUNTVQSMFGDCKOOMLPNKNNLHILRPVZRNKGEH9=F:8:CWMFANTHLHBQUH=@UUKHFJNKJNPQNUZ[YVGU_PQZWPOTRMG@OLCUSNVM\bQTQKIGCB?DJK>KXMHFIGDFLOLQNE<:GNo~|zy{}~}|{usvyywwy{~~}~}|{}~~~~{yyyxwz~}}|||{{{yz}zy|{xvrlifedcc`\Z[^^+(())*)&(18:9BLB;DJHEFFED@DJFDD?=??;63;KPE=>>>@?=<<<;;;99:>?@@?@CCAA@AEBACDCBDFC?CCA@CJJA?DEDDCGFEFFKKCAGKIHJNONNNONJHGHKJGKNOORSTTQSSRMIKJJRREGIJIILOUPIV[LLORWTLNWYTTWU[YW_\YWUVUSRMDPSRXSUQRRSRR[WIJQXQOJN_ha\XRWTY^[\^XX_dacfgjmkfdeddiecdkrlhijknnkfirsuvnkkt|trxso{gsvn~qnwvmsvu{uunhiqyocdkleeedajh`gpiYW]dcdh_Sch\c\^ebgb_ediog\`bekiebf`X^_]^]cb[^`cifbjljlhupkmhknlgbl]X]Za_\jojfbelibknpvpdgpljdemlksrx~vpp{owqrtlnpopmhimlqjhntj_nrekpqͻ~wżȽ|po{wkmtuwlaqylchpq_Uenea][_`YUVTLKQJG\bRYd[YMKYIHXZ]fJ@ABEGGEDCA@?=:4;1/-(##0?GIFA>>>^wpidQD=NUXXD;GLBB@3BYS;>8=>A:>=CD@;8B?;:NU@@?==A??;J>??=CLI>?>IJCENNKLKIGGD>?F@8F=?99C5:EFF99;>@BCCGJHEC@@HHB?C@DFBGP>@BDFEKLBACEMOMOEC@:>CBA?>8??=7;>78@J=8BBMPTJIPTRPKLEFOKFDXONNPD?JOC>DH<;:@CBSLNTTNTVKLY\KPMKSBKXLNWWTNLLJIBDLUPQWTPKJGF>9D94;?TL:FJGCHKJLTVWXWMZ[MU[OLQTPMDKSJSWMRSNY]TWTGIFAB=?AK=HWMH@DCBCIMKQKA;?CW|zzyxy{}}{z{vrsuwxxxz}~~|}|{~~}}}}{y{~|y{}~~|}||}~xtpjgdb`^[[]_abc*()+--*)0;>>CIIEFGA?CC?=A@>:8779;=???@ABEC@AB?@CDDCDD@>@>>?CIC:=CAAA@DEEDEKF?AFGGEHNPMMMPJFHFIJGHKKLONQVTTYXSRVUJJQPHIPMHFFNQOLTXPQQSXYQPYZVWWV[XXa[[ZTVURSOFNLIQPXPLVMMRRMOQUZOSRTbd[ZYMWPRTTTWWY^ccfgghlldb`]cdaa_hlfbabdgfedbjkkniiit}nmvkhzjqrqldoochooyv{zpgfomcadfbba`\cdX[hg\VXbcelfTaj^d``fhpjdhjlqk^\__ba__b\OTY]]Z`\Y`efikglqlnfquoojlrqhffeZaa`e_dstlilsrfklmml`^jkjbcihkquzzlllrnsqpxnqrsunempmpjemogcpqdksu̸ñÿ¿ú̼y}|qmtshmsoqqbjtkbhipjWT`db_]ZZVSQQLINMFM][T`XUQFWTGVURfN8ERegy~|zyxwvvtrpnppqolkkdme[e]ur}}{ϲǴߵûuǗטʵ}YgqavugZn\e`iRJV^ueVa\^reaYUa`[TZZRMbo]IHVYHZXVvcWSHMXRIHf\FV\LPJl>ITTZUIJKG[Abe`fZEMSOFTXayxssyh\etkf_~hHhmgkRoVKgvkUIeLddtvXp|O`RZhOB.4FVi[WRONOSTVX]]bknhfkkxqjYJFHFA@AEHIIKLLIGIHFDC=<=?ACFFDEDCCCC@;3:5/.("!%-5:;;;;;9Snc]Q<276?RWOS[_aaR=;TbYYPCGJKBRlF.250,-279@JPQL@65:CCCFJLLIFEC?948EORRRZMAUYUUXMMBP_`eP]Prjmgn[]vsUgoMX`VWbRZ^CNZRelRUJSHRdkbWNEACJ[hf]Yd\IDObrtrukVVTKGLPM\a98_cRF`bVG[IJHVdYIKUSXiacXLEVCIdieLfbecV`]fxr]^mhYVlkchkffntskhmqrqnlmlgdknhdplOFURADQNIIDDOW\aZ[^\aif]YZWNFE=9B;;DCEPOQRNJPPKFG@D@?;8;DB?86A?>7GTA>@?>?@>?E:?@?GNH>DILIEKMIFHIHKIB==C=2@9D9AC5??HA4>=:5369@50336=>6889<>9=>:>=>>@DHGFFCBIHA=FDHG><;=>?=AFBAM769=B927@=9=<>AACELMCBGFJNPPGDA7:AABA?=A;;::@<KTG@DD775;EPLC>EE=9CFE>;KD4@IA=?ABBB@GOIECAFIEABFGGFDEHFFIFCEKKFA=968<>@BBAACEC@@>?AACGGCA??><@>BI=5>B??A?CECADGB@BEFEBENOKHMPFEHGKKIMQKHJIMNNTZYQPXVMLMMKLQLGDDLLRSTTSVSTWVSTWXXYVU[WW\X]_YXTPTRKPKFOPYSMVLLSNMVVWXRXWX\TTWSOSGLVVRZ]^_ccfgffnmca`^a_b_[jmcZZ]`a_aaZff_geebkughibewthlroy|a\iibdfhnruwrc]egccbceb]WR[aPP`ibZXdffpo\amhgjfginmihdage\ZXWXYZ^^^MPY]]X\XZglkjmjkqmofgrkkhgmnhc_e^`a\ic^oxrlouvjihjgh`[fjjdddfhnuzrdijmnqrt|ussvysgoplphelhgipqdlwrvƾƽɼsyxqooodjrlk|wedol_chjl`SQY`b^[URROLKIIHEDP[TY]WSCLTDI[d~{wwwvxyxxxyzyxwvutrstttsqomnige^lly{z~ʍáǖŗիŧɹ~amnezrc`qcig`PJY`{^[g^eof`TQda[T\TKTihTGP_]NYQ^x^ZREMPNOKfKG^[LNSV@KQOYVJKKGU=`g\_[KNSNO]c^rvkjkd\wjgbzo@Wj_rUiWMb|m_[[OcrizrjW{z{M`iYUAW03GQbSQTPNPSVX[][]bggihctnaRFBBCBCCFIIHJJJJIGFFDA?>@@ACDB@CDCCDDA;5691-&  '1>GHFCCCFSXRUVN:<3*.82FHJUZYYWQLWTPMPJID>=;;==>96?=<8BPC9.82H9L:;?@G75ENSVORVLA>;7/159B4137DD=:<=BB>;9:>ACIC2:@<<<<>CFEEFFEJGB?FCFE>???=>=?FC?K2199:806B=5<=9=>>EOQEBGGKMPLED?58>BBB=@<<>GNILJKNOQNGFAEH?<9NHFLPH@IWMFEF>;8;?EOLHNLPUKKTZSCNTMTUMEKXUMGDDEEBABDKQLJKMLHKHWM@GFDCBMB>FD@EGKOOSVZKI?6>B=87::>AIHKE9FK]zwxyyz{{}}}wtvwttx|{y{~}yz|~~|{~}|~~|z|}{~}}v{~||~ytoljijjjigfgfhkkebdgh,-/6==8;H=3CC99<>??<;DKEA@AGGEDBDFFC@ENIEHEDJOPKHGB>ACAAEDCDEDCBA@@B@CKKD<=@=:@?BH91>@CDA@ADFC>CLNHFPLCGIHIMOSQKJGKKINRROKNVQMOLLNLNGEDELLW[TNQYTQSSTWURTUPQYURUR[\[\SRVVRWQJRTYUTUTOSOOTUUSXXT[WNUWVVRMW`_]`a``a`dedclk_abca]d[ZombYZ]`_\a`Tckbabe\doa_``dglednhrkYXb`^_\_ijnur^Zfc^cbaebWOKSYKN_ihcchjkomchlhdmjedhjgd\VZ\[YVQRRZ^[aOPZ][UXX_jnkihigillf`lhdddggb^^c_^d^oncktsoprvnieigda_fgjgfddgluznbfhotrty|xuuyywprolphemeilpqemxtz»ʶȿ·|oxxsplgjbkqjgtyh`jn`af_ddZMHS^`\VPOLHHHGEEAGXUVZMJFQr}{zwvwwxwwxxxxyxwursqomlkjjjjjg`dm{yxzӧ|ӚԟÏsϯɻlmkmxjhjogroUOMZc{W\pfjki]OQid[YVOO`i[LOZg[QZTfj``LDQNKRN]CH_YNHpJGLLKXUJLIJR=]h\\_VSYOTeqkn{ujgxne[}|ifgvFIgZlYeYMb~piuS`fegnTYiuJ_mOJ?g+2EP[ONROORUWY\[XW[`hla_nfUJCABEFGGGIHFGGGGFCCCCAAAA@?@?<<@BCCDDA;64:1*""1DPZYPOPQMTfefc[WWVTSQRTRIGRZNDD?>?3AaVGX|8-03112770)*,/0,-5=DKUZYXUWa_chf\XZ]]S@:MEA@VP?RJJWH[Ys`pVelsidhr[useZbTUp]dgGGrqioJTPQZd_QRWXVXWNIKakcPRV^p|ttxuxsdc[USQQQTZODWO^WclaDYLW]TWb_ep_kglUK[Z\Nbrl^ekbmYgkjog\algOUvvqsnfdgjg\\wyonnjlqsmjfgkwt_\dVOXWECEBMVPYeXUS[ni[fuog^POB7>5:OJRYYWVTOIVQONROKI?@<;88?=6;:89BHC<@@=49<@59ID@EQCEEFFEDDDFDAADJNOKE?6*1/IAL6A@GD7?ONONKQZPG?<91239B87:?OLCDC?FH><9;C?BI=4B?8999:EB?M2-985714B=2<;8<:;AMQEAGIKLPHAC=88CF@<?EJNVLT\VGIC<=;62357DQQMMIEFPTRKQTPIMPLIKHGJLNTRHHNHCA@C?;CC?@GF??BCCBA?8@B<;F:5C?79<<>>::CHD?;@HEDA>@AC@;CPHACADJMLJJKIHJHEFIIIIIHFEFEB@?BIJC>=?>6<@?E5,=;;C?@@A==CA>=?AB?>ELLEHQJBHKHGNQRNKMKLLNROHHKOTOLOKMPLLGHKIJLWWRKOXSPPPQXTKOPMNSROMNVZYWPQUXX\TNVX[YWVVTTRQRWUU^WU_ZU\`__Z_cgjic_^^ZWbb\bid]acc^]dW^rha]\^__]_^Vbfc_`cWbk\\^`ZYfdabefZXY\ZUUW_iclwu\Wfc[ac^_]SOORVOZgkkiiilojeflhe^gi`^`cbbZQUYXWVQOQX]X_TT[\WTX]ejigdefddihd]ggdbbdaZZaccdmisvomnpqoptokeiifaflegggdefgrzld`fpwurww}}oxwxusnjmeaigmnqsclyzͬij{ʮ»óĴ{nwwrrkch`lthiorhbeja`cU]b[OEFS\[WQMJGEFHLJDBGHP\_y{wxwz~||||{{yy{xwtqnljjjigbp}vusʲִoغñʻwhmqpkmxoozpOSUZisTcykggkXLZld[YOQZhdPNXalSO\^a`j`GIWKITOQCK]YMF]JMJIKWTJMJHT@Tf`\`]S[RXk|wmkxromdaiv~daf|T@_]d[]YS\mlVrm~kYlG^\pFbcNMGh%5EPTMLPOOQTUXXZVUW^igVZh^LFECEFFGHGHGFEFHHDAAAABBBBB?>=9;ADBACEC;64:1(  .?DLSSQZgpxwi`Y[d]UPJHLJD=CQaaZTNKK=0457=BFLQZaefebabaa\SS[_XP6;G>EHaE49:9;BEC?AEE79??47EA>HL?A?HIFEGHGA:9?JOMNMF8&-2FLD9ACHC>JOHFGHOWPHCEC878>CAA@GPNGHGBHI=<9=B<C<;=>@GLHGLKGHONB@>?A;92EE;DOK@BKMGGMMKOLLSLIIFJQQOPRSG?GLPZJUWJGLHA;523557<@?9ANKKQK@ERRIKVRNKMHFOMFJMLPVOCHRIC?>E@:?BBHMF8@@9:EIJIAFOwv{zyz{}~||{z{{|~~~~~~|vy}|}~}|}~}}|}|{z|ywxz}~~}}}~{||||}{yxxwuttuwvtoigghjkjjnqsuvFECBDFAAFDACCBBABA:=EA<><>B;;C98C=6:==<::;BDB=8AIBB@:;>B>6ARF;><@HJHHIIIIJIIKKKLMMMLLKHA@?@GGDC=<>2:D<@6/=:=B>A@@=>A=<;<<;:>FKIFINKCFKGHORPNKMPMLQVNDLQMQPNNKPQNMJKNMKLPPPJNUPMNNKPPILNLLNNLKMQRSOFKUWUUQQVW[ZXWWY]YSZ_XYa\Yadcbbbb_ffjql`[\XTU`_Ybf^[`b`\`bXbldb^^^aca^]__[_^`[P`dW_aXMV`d_X_[XVWZZTS[hkgnrs\Vgf[ac^\]YY\^^[dkljedhjjebaefb\eg_[\\[]ZPPXZWURORY[V_YW\]X]diljeb`beabdhe[aeca`a_[^kgimwvuusnloqonqnkgiihekodfhiadb`puje^dovummr~yqsstsqniia^bdoqsulr{{ȺȟĮ~nyurvk_c_nsdfmkbcba]`cOU]WTJDGQVTPLHGHIJIGBEXo}xsuty}|{{zyz}}}yvsonnomkdnt}p~uk˚sƙơrâŬɽ{frqjnphz|iS\][pjWn|q`hmQLeka[QJUdf^KWcjaGR]`ZfmWDOYEIUOHDN[\GNJTPIGJWQJRJNxZKNcaY\bV\\fsxpqtwpqp^Yvp}c^\~cESfd\VYZRymdhnvnVr@_^vBg[aXKd%@FLNJKLMMMNQUUWWTRZd`RZcYJFGGHHFEFGIHFEFIID@@ABDDFGDA?==CFD@?AED:5473&&1>@?HQT^kqja\UGI\^OFBCGF:37DUagp{~gNMVQckD0499AFOVQP\^SOOPU^gjhaYNHKIFCKU]^\_`X>,CHNPcb8FVMHVGkgu]x_{djZepbfnj_d]hr}l{NEvjciPZQs_=Qmpfe]GKUiuxdcsxxuqroiys|zb`[V\SUZYZWRYI^lqpcEK_n^KUdqpvum\ckoQKnpomdXh\fsljf\\hcK]vz~r]de]]]Zduj`gijlrskkbXamm_[gdhqeNGCKPJK\\NOTghSUkocbeiaRY^LCKKJNMKJHFDBPKMHGKMJRPA8;>A>67:;;BGECCHJ89B<57;>=GB>==GIFFGGF?89CKFCLOG<+'6ANA=?A@?@MIBADGIQKCCKLBAEGEEFCHKJDEGEHE@?;@?;?B7A>54954<:?BDLD@IDCLH?BC@?=CHD?6DC?G9)2><2,/54198>B48:CKB?AHGBLD?B<=@>BCIGA=@C?CB@@FMHENLFGPRE?;=@:;/EA8ALJ@AHKDEKNMOKLNJHGFIOQNNRPA@OI<@HIH<<>FCMSI@GNMIQYRONMADSMEINOPPHBJMHDA>F?:@A?ELG8?=7=JIHGEGl}v|xww|}}|z|}~yxy{~~~~}~z}~~}yvttx|{}}}}~}~~||~~~~|{{|}}~}{{yyxsomquz}~LKGCCFCBEBCFDDA?CC>@E?=B;=C<?<::;?B@:7AG@A<37DHHGIIHIIJMMKJLNPPRSOJA@DDFFEE@=<2DDBFIGKDEKGJQSNNLKSNIQWQBHQMNSSNLOPPQKJOLKNKKOILQOIHMEKNGJKHHKKJJJMJOI:58=>BFEFDBG;8>;87:;>@>:@DKI@@EFA<6'9@J?:;:89?HB?>BDBIG@BKMGJJIEFD=BDGA@GDEDB@=B?;B@9?7/7;27:;@?HK>?IFENG=CD>@ADHGB5DFBD:+2@?2*-00167=A259@D@==FFAJB>B>?B@DAFLI@>CE@@@?9:@C@FLHGOIDHQTIA==?:>2A?4>HF>?EH?AFKKMFEDDCEFENPKLQKCHME?AGGA6;?>==;60->>?@CEDFHEGNJKGHEKLHWS?DGJ@NGQTJJCAENKA:F<=D=;;6A9/037<@@>EDDHCGLIKQSMNNITOFISS>BOKKUTMMMORSJIQLHOKHNJKNMFFLCIKDHJGGKKIIHIKNB;MTLDDFKPPPQRSTWZYZ]]\]`Y[_aaY^]TX_^bf`][XUWWYZY\]SVa\T``U`_`cX\^\ddZ^f\T][^[JR]SW[K9DP]_RZXT\[Z`ceeerrjklkc`cgdbbfkhbcchdbb]c`_ab_a^VOZkb\ba][ZYUV^]X\id`gfegfedfjhghjonmd]b\]a[^^caQSaiggms{|xustu{olfcgmljhhjechfeglecjeWd]^mlhnjnoxtgni~uqlhgkpkcedbcksuy{{{}|sϷұͿϾɯlpuva`_amd[cga[_]YW^hR@KSQNGGFINOJ@;CSl~~{{||{zzzxtqqoquz||zwvwz~}wuttrqqpnnonlijdbehqlͯdzpŸ˩thzltgs{feiclaemhfvtp[mbRakc]PTY`c^PRlpX>[\\fbiaHIXUELLI=KUYUB\D\PLFKUHIWL_lV[HRafjnqqpsrprswvkqpnOtc|{XHwtc9l^YZbLcwhhvhqjpBUz=bkKxnUU5J6KEFFGDEFHLOQTVUTY``c`[RIHMNKIGEEGJHFEEHHDCCEEFGGGEB@AEGGCBA@A?:5331&%0:?DFGHKRUWSPVdcRKHEFIHGDHUkzy\C9:DJJA;>4?MIOQXWRSPT]eegmoniaRIEGMNSOEHZgjja^X\MTQBgMHnZa[cSfkhg~ulbV[`_^lfZXge}{ufwVqoiy]^\qHkhXP{UdkR_pkoyragonojb^jgjYL`cXUNHWPUiohYGJymLGVb~{rwxibqp\Ocguijc`jghmd]U[[iWakqaQgh[UU^aae^[]jmlookhadlh[WfsdgokcYOMUUUTMQ\`OP`c\^cfjigmh_QAADDEEFFGGC@GJKC@IBFLOTMJIGB>88>ABFFHEACA8::;8:HKIMD@CCHOMHA@<=<;;/9@@785727=E?==AA;CIGDFHEHFCCCC:?CE??GCCDCA>B?=E?;;-,::6:6<9>MA8?JHGME>.3:A?=:;BABIC>C@BGGGAEKNH

?C<8;CEAGLHHQGBIRXRD=>>:A4?>16CD=>C@;>BFILEBBCBEBALPJJKGNOHDACEF=16:::87834C@>@AFDGJDCMEFHHEKLJXWA?>:>BBFOHEFKHEORSUUMHBQN>DTTKKCIH@AEHIJIDCFHEBFA?G=>D=:<;=@;7;CE;:><=>=:=A@@A928:82/BG8=GCBJJMPKGDJILOLKIKMPSTSMIHQUJGHGHDKOKMHKHBE@GLFRGDLIE>NJIOPLMLLSQGKRKKPJINKJKLHFIEKJEHJHGKIIJIHOL?DQRKEHKORONSVTTUWWZYZZ\^WZ]]\V^ZQW\Z_a^][YVXWXYVXXNT_XR`^Ua__[RY^\c_W`eYV]X_[LU^SXTEHKV_c[\ZV_`^cdhfeoqiijgcbaa``^bhd__`_`c^[_aaba^`^[S[kb]bb_\[Z]Z]ceemnoojolkihjqlgkkmkmc[_^]_Y\\_aQTbkqsyy~}tutqwzojd]dkifdfhdag_^djg\fdSha`ojltpuoprgsdztrniglqnihimnotvx{|xyr}̿Ÿɸž˼˭~}pvr\b_ajc]bd][[\WUZeXEELOMJGCCMCEf~|yzz{zzzyvspolmorvvtstwzytsrqppqpnmlljigdddfzugȴ͵lzͿѾέ̾pi{mx`twq`delhjklhsvr^j`XhlaVOZWdc]S[i^HU`U`fbfUHLXSHNNI@PUXQ\GH[PLKRVBNVMYV]Vervyyvsqrpis{woaZEnhqUCfxs5ZlVZcU\m{j{gg_oMRq6Wa81./-#!+8@CEILMJJLJHYgcTHGDFHHFDJ\s}|}yiZJ92CG;95GjexTQNDT_Xdgkptusxmolkf`WPOQX``abb]KIQNQ`N]p\mmdWnydi|]cJ]]W_prXa_Xkhu\|k|pXa\mbeRevQkXMhrlsxwmiws~t^fcjrmoSJfeVXKK\PSjlfYGTxoHIVd~ol{{ubhp^]b`lodk_ll_ik_VU_\lRjituS]l\YW[^ZceUYgoihjkjfcime^bnm_eomeYRX]XSKLU`RJ\bWU_egjjnnibTIGGEEEFGGHDBDHIC@G>CGMXQOQOGC>:?CCDEIG?BC879<8:=E@:8EBIKKMBADELSMHHC81;<<39>:3844/6>C==>B<:@IQGA@?FB=BBB<>CD@>FCBDCA>B@>D?=9(,;98;7=;,28@<;89?=DGA=DDFOMLHIHLM@CN=?C=8:CFAGKIKPFAIQVSI@>>;B8=>04>B;=A;8>@FCGKB@KB@FFCKLMXY9BG8JWSJI?AIIA<<=A<>ADC?@A>;AAAABDJKr|~}~|}z|zyz|~~~~}yvqrx~~}}}|}~~}}}FGKC=ILCBFJKNNFDGFHEE@CI?@C<>@<8>HD>>=>CA=AC73:9623GG=GLFGSRQTODAJHKOLJFHKMOSRHFMVTJJIGKFOSMLILIDD@GJIPGINKE>KG34=:88<;9BCGMNMNNOQKIQJDRK;9KT=:IKGHLNRNJSREIRNMQNLOMIFKJEHHMJGKLHHLJJLJLVSHMRPPPQQTYVRX]WTUTVWTVWWYSSVXUU]UPXZV\^][ZZXXXYYSUSJU\SS[[Wa^\QLY^^`ZZacY_[Yb[TYaY[VT\[_dne`c_dfdgdegdinggfba_\[[ZY\`]\\]Zae^\effcegcbf^_eb`bee^^`hlghooqvtronnqllnokfdgijmd[^^][W\\]d]^fm{{{~|{qqunitrib]`eecaeecad[[clhXdfXlf`pmrtoypimgqfqstvnjozyrqqvwqsvtv|wz|lkýɿɸĵȫ~}sul\c``fb]`aZZZ[TSVdZLFEJMKF::Nm~{{~}{{|}|yvusnlorrqqoooppoommnnlljigecbdignzzpz¥ppʙϳҳ̼}{{mi}ux^vq{`[cnplnldqvtag^\mk^LTYUg^^^e[MTgUTgcabPPPXSGNTGDTXXJdCJ\PLPVYBSWK[cnqwzz{zvqqh]UrnYM>\siXEVx;I]]_gUark^SdZVt;OR6|~P:RQ2>K?;A??ACFJNSTVX]\_c^QKFIKIEEEEHLKGFFFFFEDFHGGFEDB@@A@>>>?@@@>9/()&  $+27BKPVZ\WJNafUEDD@ACDBC@AWx}nd\WK;Eal]AKb\VUhtmPHURSROOQV^cdefeaZWTRWWWVUSLA7GNN`T]`p`vwa]Wl{n\_HaYT^sxZeQWfqpetu|b\cf}xaWpiRdJWmbftumvlu~u`]kjwwogPTha[\HR`OVjhdXK]eBPUdwhksqm]kdPkb^mggabrebn]UMb]p_WiftcYh^Y\[a\\i]VephfefhifckjbhliXZfmnbSWnbTPNRXRL[`RR`eedjloopfWUVNIIFGGGGECEGGCCE@BCKKJPWTNJD>>EDCDHIBBA:9:;:;?HB8A>AEKPC<<:FC9@BB>>FDA>FCBEC?=FDA@?@7(3=8;<9?AK>2=GKKF?=@GD@HONIFGJJKJMTQI@9743.-.//=8176?=:67:BE@78BGAGKJNPEEKNOQQF?A>?>>>15<>:<>75;ABFHB@AAAB7ECLNPRW>KORNMKRSFEGAGN@5:A45CFRBDIPPKKEEIKKHINMOPDGFMRGETVOLF=JJ==>=>=<?>:=BAAADII`|~{xwx|y{}}xuvxy{{}~~~FIKE@INHEFIMQNFCGC@BC?HMAB?8DE=;AA:3:LJEJLOQVUSSQC=KHLPJICEJJLQRFALRMGKHDJKKIHEDKIBBCECGJHLKJEDLC8?E@?@@==CEMQPOMKKJBCOF>MI85GP==FKLHJMUQJTUIJQQOSSONNJBILDGJNJHNPIHMJKLKNXYSSRNRYZYW[]XZ`[TTPUUPQTSPMMPSQSYOMWVTXZ[ZZ[YYY[YQRPLVYTTWWZa]WPQ[^`^Z\cb`f[]e\]_da_adiijjokbededcjecechkede^_`ZWWVUY^^^_`\cgadghhdglfcfgcbcbcih`biswpmqqptpnpmpuommhle^dhrne]]_]ZV][\hkinq{wy|vsonuobkui`]\]bcadcbbb]_dph[hj[mf`popqiqpfhjomqtwytmv~wtsvtmsvos|{~|pnĽȻɻ̼ƨsyxwg_gdadf^]^WXZYPNQ_ZLLEGJCEdſ~||}}}~}|xx{ysopqppoligillljjlkkjhfeca_agimttwww¸̳ziӥˬԶο}tuli{x_xmx_V^rvipeaptu``X_pgWLYWWi]chfPUhaQ_f`a\QRSXRHPVIHTZULNCK]PLQ]YBSXVq^mquwyuroh`YKE=sqVM>Ivj`KUsZ;ifWtQayrsdMYb^oHFLO{v\Q_VFFOF>D;<>BEGKOPV[[Y_YLGGFEDA@ACDEGGGGFHIHECEGFFFEDCCBA?><:;====<2%"!   '29=AINPX_^^bXJDJJBABBA@;8=EJ]kpdVMPRBAQ`_DSCDebXPJKUP>2117=8;?CHOTXYYYTJ@BGF91BRG_[^a^sfts^jJhX^]PiSQ\vz^_Tmnten}rs\abuzc[ne^YGdjQ`meepp{{u}tackpyf\OYg__XBZdM[jdbZRj~OAWS]vkgjpbbdYWsX_ljiZlobadUOVgdzP_cfj\bbW^^^a]acXdnibedfihedmhkpi`QXgldTQlq]XVUWTQY^TT^c_[ajnottd_c`VKFGHHGGFEEEEDDCCCEIFEKTRPOJD>BGDBCHDAA<::;<<>DE9AKIMMLEAIGJMKGMSHAFIIC?;836?;//9ED:<@HKGJOG<=;8FH;=BDDAIEC>GCCFD>?JD=;@B5,7=<>87576?>9348>HF>@LHIOIJLPJKJHIM?EHC66BHAFJKRPCINKKPUJADB=A@?159:8::349>@CE@>@@??8?FB<9BMRQF=@D@D?9=<9=@?;:>BI?4E;;BG<9G830CILZEVYRRKOINLJJIMNILG@GETOJTWTLMAAK?===>??=?FLD==;=?BBABFKU{{||~~}~~}~}~}}|zwx~~}zwvwy}GJLEDJNKFFHLLGCBC@;<@>GNA?:39?@@>;=HF=BFCAEJHJLEBHIGJNMD>DNKILKPUXTONO@8JGKPJH?AIKIPTE:FNIEIA;IJECCAAHGAAEE?EFHLEFHHFBBEJHGJHEDEIQPONHEGH?@L@9IF56GJ>BGMQKGKSQJRUKJNNOVVLINH>ILBFNPIGLMGGKJJLLLU[XUQPTZ\ZWX[XQ[]RRPTPLKQSLGGLMMPQMJMQTTVVVXVVXUY\TRRUZYVVWWZ^ZWYZ]`b_]]adcg]`g\]`bb`cegggflk`_bc\Y`_]_`dgbbf_^ZVUTSUX]^^``\acbbbbaZ]db``ceba^^dffjmtvplqpkomjnmlsngcaj`Zchtpk]ZcZV[b]_qvqqswrv{ztnrrpqfftm_]YWbgbbbbbbbchqfbnf[kcanlkmceohitsruwyyslw|zxsprpjrwrp{~{xôõϽüȿĥ~qt|{bajjcgk]Y[XXXWOMOWYNNF;N~y}yxyz{zxttvwwvtsqpomkfdefhhhihggedca^^^Zgyo~~hwrɸпfֲɯոƒ|xopmguarmr_V`yzgn_bnwo\ZRgnYUV\TZkbgm\MfjSZ`bea[URSZQFT]QLQ]SdyEGN^PLPYTD\ilf]msmksk^ZTK>222ptRPEEsl~hV`vu9|psPxV`jl|oU[be{tcg^rwnpnhf[UUSWNL=?A>=ADJNUZ`_[OBFDCCB@?@ABDFKKGFKNJDCEFEEEDDCDDCBB>;;;;;::8( !!! !"!  $1?CCAAGNU[^`cc_ZRHIHE>=ELTXUOE=B=1>TEGi\ianseslZwfIbP]X`jMRe{zZWl~qq_ou|e[hb|~z|m[mhhQFhhK^]Zbos}wtwrlfpxsZVQ^f`\MCefPeg]_^\rk=GSIa}f_nn``WYfiS`mp`aoiZ_\TUc_wnQabdb`b[]`^`b]_\bmg^d`ffhe^ekjunh]W]gfTG\ud^^\\[[]]XW[[WSWcloqtlhmlgZKIJGGFFEEEECCCCBCHHHHJMOQUTMA>GGC>BDBD>9<<==>>H@DJGNMLDFJDKLKJNRKMRPPIFB>>>>7/4BEB7DKSSDGQB9>97EL>:AFFEKIE?IHKKD=AF?6:A@10:?C=5@AG79EFGEED@>BD@?EKIIGAFGDKJOSOIB@HF7.578;8636;:4127DKGCFKEGJCDHKEHHGIN??HG84?L@BJKPNEMRKJQSKHHE=DCA14::7::::9;=@@>=<<=??AA<78BGMNE?FLIMOKLLMMKFD?ALI>:I6:@B=>E79ALILMLIVRMJJNICMSNPMFIJCDA>CPMTYL[WMMIWTUHFLLOLEJCBFKUNWZSRSMEICDJHCDJHBEKGA==DECEFDEJQt}z|}~||~{||{{z|~}{~}{xz}|~FJJCGMOIDJMHEC?>>>;8>@EG:7408===;8=E?>CEBBKMKMLHGHKMPROKIIJIKMHKRUPMIJ=8LDHOJG=?ILJQVE5@LHEG:7HFBDCB?HF?@FC?DDIGCHIGCGJHLJLOOKHGKNLLIECEH?AI=8GD27GC;ELPSJFILKFOPGIKLOTPGEJD;HLCGMMEDEHFFJGHJKKSXSOOQQWXXVQTUMTZROOTQKGOUMDCGHJKKNJELSRQSTSRTUQUXSSTWYXWWXXZXX_^Z\^a][_cb_aY[d\\bab``bca\`ij^V\aYSUSV]]^`\[a^YTVUSRWZ^^__]Z^bcb`__VS]]^^]cb`_Z]flnlrrnknpijlknmirm^[`eYZbbrni^Zd]T]h`cy}wptwrwvwrluymoodnnb]YYdgdeedcdegnogmr__jdemffhefqnt|rtvuuunjvxvwrloqptwss}{ʸüɳӼʿôû|zwrz^fltjdgWZYSXVUMKJSXMKh~zz~zxxxwyxvussvwvtqoooojecbceefgfedcb`]]^V^ppr\~wyzҷȻŞl׵׿ŶӺ̖{nrlmapbwrm_V_|hfZgkyfWVRpfS\[YQ^kdjlOTlbW_Yjh^]YSX\PFXcULM`TZDMUaLHL_fg{}`ioid`^TMH@7/0@R~rqNPGMshym]rolGtw~NrdZasxsgfcj|tk}vjstia\YXU\XSIKG=88>GLOU]^VKEGCBA@@@ABDFKNIDHONFACDCCCBBBBCCBCC@?<::<8/7- !!"""!!"!"!""#"!! ,@LJGECADKKABZaLDOQNKMKPWVTK?49FLE97>>;?@AEKR_\<:AGZbgjibXNKQNHCBMVX[[[WPE7;>AG?7;:?B:>LGGGGNLLDKIBKMMJNRPTUQQPNLHGC?:6?DA@>MSUODDMD7::9ELB9@HGGLHDBIKOPE;@B@;=@8.6BDB:;EID7JMGFCGJC<>@<;BIHGFBDE=KMMMMI<=IE<4CDCGL:9IE;6=K?AEHLJFKMFHMMBJHC@D?B46:<:89??78=><:9877@C@=97:?AIJCBKPSVTQSVXPMUPELSJEMQHCFHGIIEHKOMQOLDS]JHIRK>FHIOPDFOMLACSONWRNQRIFKWXTEJPOOCCMFCFSTW]RMUSKLGITTJJQUOIHMH@>BIEDMKHIMi~~}}~}}~~~~~}|zz}}}}~~~~|{}~~|{~}|}FIGCHMPJFNMDA@<99;;5=FD<11009:7866<@9?FGFGMMLIHJJIJMMLMLKLIHLLGGNPMKFF<;MAGOHG;=HKHMWJ6>KIGG:;ICCECA=GF>@FEBCEMD@JKEEMLKLKNQRPKIKMJIFECFH@BH=9D@3;G?@BFKIIKGFMQPPPOOQPMRUQQSTVVVVWYYXVZb\VY^aYYbdb\[VU`aacceb_ad`Y]ijZPW[UNOKT[X[\YWXVYTXWTZ^[]]\\[Z]bfe^^j]Q][Z^]`a`a\[hohhpnjhkmhhjmoomqk[Z^_XZ\cj`h`VhcS]lbh{xqvwsusskiv{ikrahnc]\befikkfgjgptposrcgjdilgghlmqtynsqnlmiltqrwoiqxxxy|}ҿҹնξ÷~z}rsZjrwjedSXTPXVTKJDAU{̾}{}~~wsstttsrstttqpnnnlihfccccdddba`_][^bXdzp~Svn}`ٹǨ}ٳԾѿƸ͜zgvj~rdmcsk\T_xf]UiivXRS\qX_eWTQ`jfqcL`k`__Xme[^\U\[QE\lXIKaZKLO[ZEQ^w}Ui_NRVOI>23@ACEFHHDBKQJA?ABBBCBBCB@?>?>>><;=@8(+) !! !"""!!"!""""#""" +=KNID@?A;20IXV]_WRNKIPZ_hjdQ9/;JI<8;=<;9?MG=GQWK=CE@@ES`gpy|raRRVSMLKF?GFIBCC83
=DJODHSHEDCJMB;>>88?FFAAEAB=KMJGLG7;IC?>CFCDF@<:::656@HGEGMC@HICCHC;@AAAF78I@<6=I@A@AHEFFB?EGB74=@728;763444@C<:899<@GGCELPSWTQV[TGMYNGQRQSY^ZRRRRSRNPQONWOKBP`LEFQLMTEFQOKAHNLJSMHMOFBQRSOFSZPF?LPGHQVV`TGNWNLMGY^UNVYYUNPSLEDHIGLPJMPd~~}~~zy||{|~}|yyzyz~}~~~|z|}}|~~~}~~~}~~xw~EFCCIKNIFNJ@<:656688@JC6.455<:8:;=BB>GKJNMNMI@DLJIKLLLMLKOGFKLKJMLJKCC@=JMIF>AJHFDA@=EF=>HGBBGLCAJKHLNLMKLMPURNLNMKFEKIHLFEH=:B?5?H>?KSSLJHECA@HG<=BHNKDBBD>8EIDGKF?@>DDBLB:INHNMFLMGKPNQOIKLGPWKFKQSMJJPD7=?GJEGEELNKMMIIMNHHSSPQQRTXSSYWVTPX_YXZadZX`dcZWUR]d`_ffb`acd`aji[NRWQLKHSVSZ[ZYWV\\]\]cb\]Z]WTZ_ahf[^oeSZ\Y^___`cbckl_anlhddjicglmompk]ZYX]XTe^WhZQllX_kdk{|tsttqmnmfeuwchp_fnb\blgenqmlnllytwwwwlslfjmmmjppovojqohffflpimvlhw~{}ȿڼԴµô~~}tsrjXmtuhf`OXTU]VOFAQ{|xwz~yxy}yupopooprrrpooomkiijifedba``__^\ZY[n`X_{r~klxtr࿺¹Ĵִҹĭô͞tsuizzonctj[Qcn_RWijoKRUkdRocRTWbgouSPfd]a]bl^YbaS[\QG_s]GG]eI\RYWav}~zwvwyHPJFKE<43AVaY\jo^RNAhzi_sXi}gd[`}f[~rkkfrctNzklrvqjg^[\\\_XXWUSMJEBCHMPQMEB@@??=;>AAC@=<=AJKC>=@BCCDDDDA>=<::9;<;>B:)! """!!!"""""""####""" "/=GMPNIFCDHPJEONMNNBAQYT`wrXA4476776:=AGFNYKQT[uwmbapy|stmPDEFHF<65EZU;N^YBMXP\jnCg{SI{bTis~YgvvyOLxgdzzZ\Zaltxt{iSYw`qI^~{~yk{|YXs|oaQJhiQZXNRXcm\JKCS{tJVdVTQIXYRT_b`^n_]ah_X[]apbYd^Y`ha^bf\hjWW]kpabZ_li^UYcmjfohfgeghfYSSTX`ehok]e^CJYNReie`^]goonkileRIIFEFEEDDCBBBDCBCEEFGJR\_]XSF@LJ979BI@<:AG>CNOIDIJFIGJ>BLLJERVRSNMPQPOMOSTOHOGMJMPQNIMMBC>7;7AIHABCDLH?CHIIQWG@MKLJML?:A@C@CGKNINKCECELIA;>>43;CD;>F@?AHJIBKG7:HD@@CFHLMGFFKJ>@AHCBBFKA@FHCCHD;??>?@8:J;:8@::9769@FCCEHHMQPOQPIEMNGJMPWXX`\VWWWUQMQQNPXJLBQ[TECNJCMD:GVNJQSIEICLGPCGLHFBVPOLK^`H>FROJR\W\YDFUSNROS^[TS\_]WTZWOLKLNOPPRW_~}}}}|xx{zy{||zyz{wx{{}~{|~}|yyyy{||}}~}}~~|DDCDHKLGGLG>8434628DIMI;6?AAAAACGFIGHQMLOOLMJELICITOCBPQHE@DOLEE@@>CG=;EHBFKG@AFJMRPLMLMMRWSPOPQMFKSPOTQKIB@EB>EG@BKRMFFFC=<=FC8:>CLIAC?A=6FGBFF@;>=<;98;>><8447<@=68;=>>?@@AB?=<98879:<<=9,!  """!!!!!"""""#####$#"!!"-:GMMMNMPTYVB4@NMJF@>IA>Wp~lH63?IK@>DGEHUUD>LMILTK?BC?BAGEIKLOFADCHKGB<>?409BD997<>DECB?=;=NCEPJ==><73782:@<07;9907=@9557>??BCA@FMNIEEEGLHGIFNSTTUTVWWWQIJSNKTTJMDRVYLCIINLG??UUMRWJMJ?JML;LCCGAZQNHOeXBDOQMPZ_Y[KBMXR[XUZ[XU[__[X[]URSSSSVSOU\v~{}}|{zxy{z{|}}||~{vwz{}~}{||~}zxz||}}}}~~~|z{~~~~~~DDEFEKMGGJF@?;:;96AMVUNF@IKJECIMOMKJQYQMNOLMI>JNGGIKFCKLKSEAHLOJIJJKAFC=ROKPLHEMVNIPSRJP\TJE>CPPED=>;AEA<:5;=@KH>B<>:1FGAEB:8=8BA8C:3HJBLC?GAAMJEJJE==DMKSSKQPMKHE<6>HJGEGHHLMKKD?BDAALMISOLNNXVIKOLHCOVU[\`d_SXd_RPNMV\_]`b]YY]^[`kfYQLFHH=AMMNT[]`gb]^`_ab\]bXQILU\_afUYn^S[^ZbbXY\^ejjm][lhf_Zgi]^^^`amj`UOVZTSPVbcZZryjkhchuuorsjddccT]qj[dj`ih`\glgalloquu}yzxuplfajoumilelro\cnl`^dfigaciq~zý̶׾Ʊ}zqsluctz\\ekncfYTSSYQgõ}ux{xxxyyzxuutqjghgilllllljfeeggb]\\[[[[\]XYzXSrvkwx²ɟǛϺ˨ˮovksv`|~k[Qmz`NLmjfVZRcmZhhSW\UWjuUI]WScc_rkXak`P__URir]FO\VQks{zwmebZKWd:4707E\osmhgTPhqnXVLD\yxYalyvuchxqZo\}yn]Kccs]k|tkouy}uic``\XZYYYWUTQMIA=:<=<==;86547::6432230--244545778::9865678:=;72+"   !!!!!!"""""####$%$$#!!*9HMKJKMPPONGIQLB=BT>7Jde^q}~pUI@Pwy^edcSlmmaR;@A>MPO\ge_NDVWMUceTQLBL]OS`NK@AFE<:8<>BB>@JA<;527@D:9BB@G>AH>EB6;GB<=D@@E=:DJMQDFIF>@?CB48@>=CCC<898;@=@H01:4:;<457;CC@G=;:?KBGIE?>>;867:2;A?=>ADE7GNK=AE@9789;:?BA>?HKEABEDGNJCBHNNMNOTWVVUPIMQHLVQOODPUUQCGHONID=QSSQTJTLAKSF@M=ECH[NKDUbKDGQQNX`_[SFNUW[c\ZZX[Z\_^\Y\VPTUUTTYUNMl~}}|{zzy{}}zx{|}~}|zxz~}{}}{|||}}{{}}|}~}EFIHDLOIGIJJIJJHBBMRXTOLFMOKIEKRPPOQZYPJHMMKHEOJFIHIA;ILJQG@BIOEBMOG@J?>WQPZWOO[`WUUTUW\d^PG>AOSDC>AJLOMLGFJGJPRQQQRNQTPRUYYWZTNRUQMIGMOND7>E?::GLKEGGB8;IMGT^VTPMKKJ?@LMNNKIGIKIKLC?CAAENJEMJHKISQCFHIGCQUV]\]caRS_\NLHJRU^]YZXSPSTT[dbXRQJHIDT[XSSPGQ@?XvfwaYSg^YkaEMa]`;77HLJKTWSPPOMKIKBGLHMOCMWGGK>>EHDF@=D8::99ADCEF7=JICJOOJGNSKCLMC>@=>?EDCEIGB?>AHGBEG?96898=D?7:<@I=9C;A?524::>B@=?777:>@AB/1:24680349E=;C:;5AECH?=B?=96?>5.?CGPFINOIRZQGLNC<<E@TTKEDZZIKEPQRac_ZLUYZZia`_\]ad`^^]\WNNRRUSSTVF]}|zzzz}~~~}|xvz}}|zxxyz~~~}~}|zJKMJJNPOJGQRLOQKEJSPMIIJDKNKJIJNMOPU[SJFDKKIHKM@DKDE?6BIGKF?:ANA=JL?>MCGVQT^ZSZc`]\XVTZaccWLFBLWIEH@DF?@=?DERHFK=AIJMLJDBEBFMNNNLNPOKJPTUTTVQOTUPQMIUUOC6>F?9<>?61;:;FE=<9A5*CFAA;03>28?8:79A;<@9@=5>GHBAF<1AROIT][ZSOMQULLTPQTSNEGMJHNGA@95GhRJ`xmhefn~wlm^Ufx|gVOERdkzsUWjco]yrw_Ozpkfsb]@D?>G@3HORUWZJNA4:6@``6[p^EgjcDcQUpxreTfshjygegiv~htuztwîvjrh^_bdcQITNYfqdH\o_PbKV[eWGRaf]gc`]ZdVTZcjbob_daZkmbcXUbZcngccrvf_YVenYZjdXafilmcoecXhbTR\ikit}lZ]_MAJYYPMMQZgjhlmjlkYGCB@A@@AA@??@BDDEGHIMPSRRV[^ZUWXRKHHOSNK;=FEF@E?>;3;HHIIOQPOPPNKHL@AICGIDKSEDF;>DE>A@AD8;948CEFFB9DKFGNKJNRTSKGIHIDA>;9D@??CA?>>BCBBED=638<67B@844;3358=@<:@859;>CA>43:2.22.14:F;9@9;0@DCA78AA?>?HA86GIRXHNRRPSWMNSPDFLA?;@JCGJMKHMJJPQQUOGEEJJJIIIAC?GLMLJHMSKBHOOPPNPMLTUKPQNYXRH:>G?:>=;23@<9CE;39F4*@EC<4,39-8=:97:=8<=9>64=AE>AK;0IVMKQVYWRRQSZZTRSPRWRIAFNHJFB<14GPB?IEDF@HOEE@FPHQ_e\QLRZNGSUF@CLPPWXPIJLJFFNTTX]^][XSKU^ROVX^^WX]d[\gia]`_TNW\bddmgefbTTacbea]akhZZffcdZTUO^j[SW[QY`QR^aekjjmpnpnilkhe]XVei_jqf]UTVNVfZXhd`d]W[^q[[eilp}{wtsmpqohifolqciccce^efg\Z[ad\VWnþ½лoy|txputkYgwb^pkf`WRb}{|zxtuvuspnnllkjjjjigfedb`_``_^^^^]]]\\\ZXWWU^j`hzat}v{wl~ɾӺӰɮȫŤoo{pks]yi``ii_giOebobZXWXX[giSQEF]g_UhnWXidLV]WQ`qfTM_aRbqd^aVNPQN77b}Ugqkkqotlf]bwydXOIYpryzbKa]qkzy}lpdEtaTg_[BQo\ʨ}wrryxhikjkozeZYYWUUROMKLKI@60..///.....-,++,,,,,**,--../1111224655=G@+ !  !!!!!!!""""""#####$$$#"" "(8JWahjhd`]V_n]>AODKguriSǸXNh|]IYbISS]eed_vs]`\9B;8<]xpNEij\GmuGZkvj]Udsa`oik`wr~{xxpĵùze}jpegb[KI\UVav^HgkV]_?`d^IE^df_eei__dPX^aj_nedd\\nfeeY[ZXjjc_lsldYXVgcU]l^XcbgojljngcqVKPaloryp`b`PEJXTFJJMV_aafiit{q]PHCAA?@@@@@@ABCCEGHJLMOPQT\c`VX\YVKCJQRH8?IHG>C==53=EFFGILMMNPNJHMC>FEGFEKPCBA;CF?>>>8557NP=<:8;>>89:3469<=;A;7::;CA?;5:2*/,*/4>F88>78/;EA:49AABBEICEEMNXPEMOMMMLMOQKDKJBAANOCCGJIJQWRKJHD>;>;>GHHLNLMNOV[TLTWROJABHUHDHQK>6MLTH;GSJcXKEWQ=BQMOUBIYTSKKPHRa`TMne]dhWW[_hnfYYYZ[\XWVXVNFQO=ey~~zxyyzzz|}||}|}~~~}||}~zwwz}~~~|{}~~~}}~UTNPXWYXNNYUMJGABIJBAEG=:EKOGKPHJOOKQOJIIOOMJB@@KE4?H<;CFID:4;JD>CADRRO]WQUVVY]^UU^\UQ[`^^^^YSU\[VZZT\ULMPMKPHNH>DBEILB9BCAJMJLHJOTH:GPMMOKLKHQRGJOQWSNJC@C>==>:.8C<7?E7->J5.@C>95-65,8;=:7:;7<<9937<@EAKTG?JSNKNNPNKMMMT]TMTKKZQME=LMDEA<11FOA8CCEF@KQKG;GVMS_dUGHMTMGSWIBJUXUTQMJILIFLSYX]efb``^VYc\TYY\^ZYZb][fic`bb``bekljqlkkdX[iieegjlkaY]_^^bXPSMXdYSV[U[\LP]XYijhnolnf[dj_[ZWS^b^jmd^RQWRWaVWga]\ZWY\mX^fnvxxw{stlfpgkinlqpqekdd_aaiib\^ZigX^sƷƾκ|s}y~rr}trrjaWhm_amk[Xcý~~vw~~|{zyxvtsqomkjkjihhggefgfda^^^^\\]\ZYYZ[ZZYXX`al_rkpu{wiνͰٳ~xqptZxlfone[l]Tbao_VVYZY_gZPM@Qbg]Q_oWZg[CU^UVika[QboUcqd^\KKVRS>afv}mt{oxkvjaxykYQRc}}pRehrwtvuwjgiHyvXNZdUPCh̸xsrrr{~sinrmjtue[XXWWUTSPNKJKJE9.+.-+++*+,,,-***+,,,++--../0111124676>JE. !!!!!!!  !!!!!!!""""""#####$$###""!!"#):KT[``^TVVLFB7BJ8ByŬĖhŻjfcWNTUD<>ALWnwg\VdhHB989;FMIKFLTIGD:?9:ILVJepgDMegSJxcD]`jaUVezp[]nkrY{}}xv}lƨɻ~u`thoaPO]cRTjsTUja\gSNhb\EHgaf`cdod`aO[`_h^liieYcmbh`WZOYjb^amld_VW[eVUakZ]b`ipjhiydsgMN\hnmkfWZi`SU]RBGKKT\\Z]agt}n]RICBA?>??@@@AABBEHIJKKNPQS\gg]VXZ_WNNMNF9AMJJ=@==26>EEFEEHJLMMMJGHD>CDFGCKPD>9;JE>AGDDJE<05EC@CDBFJDEMJGO[VILKHEIJHD@6:L?>@?<7<=79EI@6203/15-1:;3*/=?1776657;::9;<@=87.2MM<9767<=07A5438;?=A@<<;<>=C>782+,*)-1?D46;63/8F=43;@BCDEFJPJMNSEFIJHHIIJKJGDI?@DLNIFFFHJNSUVWRJHA859BBCEFEFGEHUYPPVQLIB=BFSD:F?@CNK@9HLPF;ELFfYDEWK;CPJUZEIWSMFQJFPaZH_rZbh\QSYch``XZUR_^^Y_aLAGQ=By~}zxyyyz|{}~}}~~~~~~}||z}~}|}}~}}}}~~}}~}}~~~||~}WTKO[[YULPWURNLHEKJ?AGC67DKMBLNELONJOOOMLVUONAAILA7BI>;DGG?55:D?BMNPWRO]XRVWWX]]QR`^QR[]\\^`\WYZWUXYZZURQRNNOIPJBFCHOH8:FC?JKFIHMSTA6JNKJKKJHDKKADINQPMJH@==<:?7/?D<6=@31FK78DAA?:495079>;7;:7;<8636?DHMVYTQPQMIKHGICBFEKYULTKDSMIM>DKFIA>63FN@;A@HKMPPXK;IUSVY\MCKQROMVXMNV[^YSONQOPRRZ`cdeihcbeda^be__^\\\YV]ZZ]``ccdjhfkonkrnlid\bmkcelpld^^`]_Y]YQWUW[WTW\ZYVNT\PSfedlmhkaS^fVVXVQY^^ih`]OMUSV\TWc\X[STY^gYdjuztsvrqfdmbhilnpqnfkdd]]ckj^\d\ioqƿǺκzzuvvlqyqq{zl_WXeb]`daa~z}}zttuwwxvrponkiiihhhgfedcbba`]\\][[\\ZYXXYXYYZZacrqmrzdpzya|Žȴٸu}s~tUvohqfahS[]_iXMUZ[Z\[MTHJ[_dUOcl`feI?T_T\mgaX]uwY^od]cMShenavmuwzqeyyvYVYt|hr{s|pwrnk]lSnwWMQgRYChƥruurv}yqmrqkkzukd\WWYWUVXSPMLJLNI8+*++*))***,-**+++--,++--..0110124677>IE3" !!!!!!!   !!!"""""###$$$$$$$###""!!"$#+9HOPNI@989;?DLOEEWkǽʵwr`TLJT`H@6LLdbXi]RKKSJBA::ITMNPDFFEDC?E7LDCRNjkX?Ra^FOVEX[aaOXk{neUY{fktVyxsrsi×ĺm_wksfQYrfT]ogR^d^`fYbe`dLNh\labbri_`Sacbg`klk`Xmhaf[UQFZe[YbheaXVX``Q[ibZ`\almdftnj~]Xbmlkb_XSbmgcg^LKKEQ[YWWWcw}zo\MGFDB?===>??@@@ADHKJJKMNOQ\joj]WT[ehdSG>;EMLH=A?<28=EFEDEFHKLKKIFCA>BAFGAFNE<4ABAAKA@GIEGSWMDIKECMKFE@9EO?>BA>;<93=<;:C>761/+**,+<@15751*8B810>ABDDDEMRIKKK@EEGBDEHLGGGBA;GJJCA?@FHKOOPY]VRRG719C??FBBDA>FTUPTSKIE@>?EQA9DA>BLOI?ANJGHUB:CJJU\EIUQDIQ@DWaPKlbVbdPOR]a_]]TSHVeaYYeW>ANA4dy}}{wwxxz|~}~}|{}~}~~~}}|{||~~|~}{}}~~|zz|~}}}UQHO[ZUMJNQTTRQLIPNCGF:39BJH?LLJNQNMNOSRPZXTQHNQKEFKME@GKI:05==>?>>@BCEHJIIJLNOQ[gnpj[Q[clsmW>>A?FF?>HD<8?FBEEC?AD<1>I>;@@@HD:?GHBGQPF?EHCDMMFDBALM=?EB@@<59BFE=98368140*++2)%193*243104:;5+:A96/$/E>9855574,:<91/688@@HDCA?=8<=743-.**.*87-537/(?53..?CDFFCEHMGJJEL9;@B5AFEPZBHUH@RE9HZTJ[_SO^[LJUb][`WOJMZa^W__H?LO5J|}~{zwwxz|~~}}}z{|}~~}}~~}{{~|yyz}~~}~MIFQVSNIIKNSTUVOLSPMMI>7=AIHELJNOSNOMOVVT][\YUYXTNVYXQPTQRA:?CMFG[[RVUO\^UVUVZ]XNN_]NSZZZ[[ZWUWSKNSSXVVWRUXUMMVQHHNM<4@MN@FQHDDCLYF6EFGF@LGEG??FLBMJLZ\UVUXSLCFOD=B>:>DPWSOE:?JAIPAFTNKKMSSOIKDEUWOKWZJGOOWZU_ZJPUSSTXZRX^Y\SMPOT]adhkmnlkhdceeddabd^VPOTVTTVWWXX_`\`bY[gjehfba`^^ae`]ehga\cklikecidfhhgdbZXbeXTW_jnlnplb]h`OX_SSUVRSSUgeXURJMRYQQYXSWVW_[hfmxvsnprrmc`bYjikigj^^kg`dbhmpiv|ǿ±Ʒßěto|tkqskotrollg\UT[ZRZs}}}|wxxvuuusqmkkkiihfecbb``_^\\\\]\ZZZYYYZZXWVVX`_ZY^l}{{{mmvjwʲɭнl|ǷvzyorptugdScchTEMY[SQLVlPIWb[QI`on^SCeobIbp^UtqezucpiWjkhy^j]pht`fjn}mOLXLEWɾwosz{vrsxtsogiklnaUVZXWY[ZTSPPNIIMG2$'('&$ "  "$%((*-..011103569=BG@." !! !!!!!!!   !!!"""""#####$$$$$$$##"""!!"##&*4@IIGO^gbVM@G^irȾҰf`adbPDNggXT^kbe^hSr{ENK?999@JJGJKFCCCA=<>>>=@DFGHHHHJLNOSZdinsi[Y_jqxs^GECCAAFC:B=BEEEDCBEDDFGGC?<>@=GF=:DD=?ACDFB@>@?7:KA697;CF8>GGHEGJKA;FHCEMMFDDCME;AEC@?<;AFFEEFDA@E?;62-,4,(166'(54.-3;=- 3?7-(%-?79627641-79:23309<>EEHG@=:89744+0))/)50)027..@,.*-=CCIHADEGEIJB:>=DGDFD>AH@@HC;=BDEIOOQVWV\e_I<=@>=>?C63LRE3=CAMVAHUDCV95MVJN]UFJaPIK[b\]YPJFU_^TZcWBBRG6p~~}{zxyyz|~~~~~~~zz|}}}~~~}}}|}~~~~~}~{xwx|}}}~AAGPOIHGHJNRSWVONTSVQRI??EJMQNIPPSMPMOWZV\Zb_R[ZYV`[\]^ZU]GOJRWKKWYUVSO[_USTUY\XONYYOSYYZZXVTRPMHLQQSUTSST]XJPYQJNRD5@QVKBMOGCBDOXBAJAC=EOFCE??GJ>:GF=BKJ>65:7/2?AC@56/1BJAFQHFMMLF@BFFGIDDEDLDAICB=>FPTTOGB?FCGTGKZPRVYaYKJI?JYRGHQSJFMRYYUd`LQURRPT[QU[UUPLMMS]cdhnqokifbceeddbba[RKLQSQQSUYVT``X__SW`fcdb\\][Z_d_^eggc^dkomohgnhhmqlmk`aehhe`hxwsrrl_Zd`QW]RQUWQMJOe`QQVJPU[SY\\b__fhilk{yz}rqrtsnhb_ellljgfbdmkhllpzyŮΣɦti~}p~dosmqsnmkf_YUXUM_~ywxwuttutplijjhggfda``^^^]\\\\][YZZXWXXXWWVWX`d^WU\k~s~|̨̱ͽonɻu~nxyeXkhhLKU[VLMKYZLSZraLHZie[QDqqYgq_lychuphwrxrh}k}~}ilr}_ZqintqPMRL?|¬pkotzzpq{zkagnsufVUXYZYZZWUPNMIHKO?)$%'$!-1-,-)$"!"$"$%&*,--/001355:>BGA, !!"!!!!!!!!" ! ! !!!!! !!!!"""########$$$$$$$##"""!!"""%'*7HX[gmh`V@7UhnvüΧw~~ZQP[aQJXvjT[j_]tuQZbJJG;68;@ACDFHFDCB=MnjgP5RX^bNg``SMCSuachdzЮq[[sú§lmepb{~^[{yu_Q_m^k`kgWKjqbsrbVvi^`pgf`ofgjekja_il^]dREFNY_SQY[YSPSXOU__YWSS^hfdehjsecrokfdee___\aiiaWY\\WL9:MhiZbtslifeWLE@>?>>??==@CGIIHHHJKNPT]ejovvpT\rqlweLDAACDA@G?BDCEDBBFEBDFFC>;>@=EE=9DDD:>FLFHGDDG:9JHAFLKEDDCL?9BD@???AEFFGLPLNMQRGC?9961,243&'43,,29;/(94*&('<1690690**554/202;5<@BKE?;;71141/++)/)3/#*/1.86'+*09>ELIEEBEEHI@7<:B@;=FFBEC?DH?EKB;?BBDJOMPUUU]e`MAFH?9=?@18;?JNFHHIIQ`UNIL6;LF;ELTVWPIPS\[RBB>FFVN89?:NPDA=9=?ACHIHFGHJOPS`jppjjyoYfmcky|hKCCBBAIIBCCCFECDKKEEFGB<9>A?DF?;FC;>@A?;8;?DANP<<3,8E?AHIG@GD@BFGFGHJLLKLNPTKKIGG=7362-',0,*//031$)5,%(,(5-48373.-,/0.+,2?=565AFGD943/,0//+.)/)1-!(*,0=8$)368>EJKOKCDDEG@6;9C>8@LF?AABIBBRMA?NKSO=99FJKMIISIT:=LMQSFBECGPMNRQNQWX[Z_[VVX[`bWOXTQQKIKT_[YYQdTTZ\]\P[gg\\cYX___aa\X\TTPP[VJLNOQPLINOORRUROQNMLKIEHMKNOIKKOXLFTVRTXSPVZZPLQQPRQPTVW]S>XJ>=8?HE=;@HJGHOXVPQSSUSRONKGMLNJHRVVMLRSSOOTVWVRSYWT\ZTYSLMPGESPISRHOVXRCEC>JOKLVYXYX[TY`_c\W\XWQMWVMJHCINJDBIKINWYVWV[YKPPKHCFLFEMMJIHJRZckjkmnmgfd`cffc`cda^ZWSOQPKGPaVUaYTYUMKU`^YVVPQLL\aegdglqvjfqmopovmiqsrqprrjs{toqtw}rq`SXd`ZUONRUOHCM_TJQ\\ekgknksytxxqstwy|||}}~{yxuunhvwqvvty~xϿ¿ëħl_xyhlh`nvttmahj\TJJmzyyxtqpoliffhgebbcccca_]ZWUVXYYYZZZXXYYXXUTTST_cdb^\b[\uovm˶Ҵư~z}{zi{zŒ}soyxgeVRNBES]OEX]VFXQQ]ZVVDMUgt^XbpYZkzgmbO^jvwjpx˼}}fWmpUwucUaOPʫ}{ummt|wmkklklmmknqfWRUWVVWWYTLKLJILKE( AfdRR[cb^[[^LC;6.'(,./12356>@AA?/ !!!!!!!!!!!!!!!""""#####""###!  !!!!!!!!!!!!"""""##""############$$$$###""""!!""##$$%(6FHQV[YSSk~̹{^KKMdtiymYitp\VTQH;528MYTE:;BGEDG]i\XI8:CH^rl]kVguRaUUebfCLYcbGX`Wvt`|ohkռmRdȾtvqah||i`mrnkawus{gqkbVluZjri`ie^hzwpsppadk\eZUYim_\bGCUVY]CNWRKMNTIJZTOMNVcd`aa`bXTcyc]ksobTNTY^db`j^R`hN;O_VKU`defimmieZLCAAABBA?=>?@EIGEFFIOQRZenk`\k~p[UY_fpj`TFCECHHFDBCHFCGQRGDIHA96>BADFB=HC:<==;9@P[MQC;EKHUHB8WVNJKP[UNL@JEPPPTZZ[SLRIf~{yxwwz{{{z{zz|~}}||~}yxxy{|}}}}~~~~56;BA>@DDIPLKJKONXVXY`[Z\aacf[T]YQQKJLT`\TXNZTSUS[ZKXgdUZ\WX[X[_a`^_WYWMXXGEJLKHGGIGNSNOJHKJKLKFAHMIPRJKJLPIGQTSTTUXWXUMPQRX\ZYZ[\[JDTELZ@>EFOSKDLVVWVV[_^]_bilaZXYTP[^VKPZVXRQX[\ZVPV^WSV_]Y``[[VQMNDDRJFSODKSXXINPKWTQRY\Z\YXYZ\`c^WWUQKCNVMHJDDMOEBKLLS[XRRPRQHNMFE@@FD@INLIHOZ`fkihhiife_`ceda]cebbcb[TVWSOVaWVZSQTOKIO\]WTSNKIM[`deadhnuibohkmlskdijlmjmreitpigms{{oobVV`e[SLMRTRF?N\QJUdinnlosvwvvxumnpuwyy||xusvpjsxvuvwyŹƲԻ̺|iaxtec`anutsi]mm]WYý~~~vwvtqnnmkgeedcca``_^^]\[XUUWY[[ZZXWVUVVWWUTTRSZkl]V\d\X`ms|pǚ˵zxu|ys|zuunwrpXNGKY]P;Jb[PLWZecX]iTLY`VYX\hZh}doVQmmy^HNm|eutɰ~saqzUuwkZ_Moˤ}uolpqgbgmpnnlkqunaYVUUTUTUTPOLKKKJI5%LbgYS[`dcfipa]RG=6/+-034456@FA<7/$ !!!!!!!!!!"!"!!"""""#####$#%##""! !!!!!!!!!!""""#############$$$$$$##$#####""""""""##$#$&*/7EQSON_zȸÛ}dLI[soqnoj`VQME8:IRZehXIGECDHQRPPK>9FPSsqqgl\cmMg~[dml^:TWo`Ol[Rvwm|mzl^wtMfǾqys^ox{l_kqnnj}xwzfn|jPgq_jqi_afhjwvtysj_agY_SOWgl`^\EC[WbTCPRNFNKREQROKLT^fa`^__[NUriVeql_UOT`d`^^aYPi|fLZf_RQUUX^dlonli`TLHA>@CB?<>?>@EGGFDBDMURZnsg[[tmV\]^`ad]NIIIIEEHEHKGEISTIGPRE;9>@@EDEAF=6<<<;:?HFDGBG=4?EKPODED9EB>@:3E?CIJ@1/<=3601/*++30'-/02474-3<;:>HQRMEEEBC>8<6C<8DLA8>HLHLLJJINMGJIFIXUILPOSTI?ITF9<84886?YMIJNTWNLAAKKXNJV[VXRTQ[||{xx{|||{zyy{~{{~~}}xux|}{}}}~}}~}~~12:@?;=ACJNLHDMSMVURW^YZ\bcbd\Q_\TPKPRT`^PRSTSSRMYVDTc^KUUT\VQUXZ]]aXW_[]]QJLJCACFIHQTMMGDIJJLLE>GNJQRIHIJKHJRROPSWUSSNPQPW__[Y^c]RKU^T[VBNY]c`VUbd[\_]]\\]aiqmaZWVSR]`UHRZUXTV^`bb[S]dZTWbc`a__ZZUOOFITLKTNDJTXVO]\S_UOSZ\]^ZWVTVY^]ROOLD@CGIHBAHVeabsky}c^aa`\ddVSIFLFCMMPOIFJRQFIUSHA?A??ECD??64??><:>BAFHG>;GKKUSGBE=5AE7<63AB97?AAAA;=I?ERNKOL@:?JH;;CAFKBEECJIFKNNIAEJOKDC?2'/9664,6(%-2:?2,-3%,.,#-67::/+346:?FE?67BGA6;752-39337997598-2D>5;HQNKIGECA98>5A>;DE98ENNKHGOOLPOKJIHV\LGQOJOOC;EPHDC;/569?<>IQPIFG^fdnkVUP@JQSGTRJb\\he\QNNC^TQTUL[TCSI>NTPLTQ]YFRRM]PKQUUUQYVS^b`b_UOHBDHHLNPPLNICHJHLNI>DOKPSKFINKGNVTOPVXUVSQTPR[_[Z\__VRX_^^_VR]cfhb[^f^S\aYX[[Zbjjga[SMLPXYXNLQR[ZX^bcbaZ^c]US^da_ZZVZ[TWRUXUVVRKPYXW]h`Y\RMRY\]^ZWTOQW[ZMJPLA=GQHGNHPXVVQMQQSUOJGDCCAMJA?8@CA:ATZRT`dcgfbba_[bcZ^da^]Z\aabed``a]\aa_[SSXJCFEHLY\OMHNEER]bhne^gjmremd[d_fd\XZcc_`i\WliZXfgiuljb]\Wc`UNIRZSAATYS_lrhjklnnyyruujglhltsmv~~~ztvwupo|~}ͻʴŝƶy{them{kfdfkmqtt`Yr|{{zyxxxxxxwtnllnmlkjjhda`___][[]\ZXVURRTTVXY[ZVUVVVVVUTV]bX`l_Xc\S_Yy|poryp|zzortrt}ʴØZpieFuxZ?Ib^WZFMdmbiW`fM[]qouwtyxy}oSW:P~~invYx]eYsƻ~xtqppuyvnlu~{qikkc[[\XVTRPNNONLLNNGL7$6BOZYPRW][YY[amqcPIME:3236=CEF@1 !!!!!! !""""""""####$$$%%%%%%%$#"!! !!"!!!!!""#####$###$$$$$$$$$$$$###"!!"!!!!"!""""###%')+1=DY̿oqxccwptjYy~{utuje]RXaL?ABBBCCCDFJQ`nzzc\`ng`h`XIERH>NSSMGGKOIDLPOLJEE@>BCC;;46ADE<<@DFII@;BACFKGBOQKLQI<EA=7=DHL;@ACA8BA;FFGFDCGB1;MC63@?MTJMSOLIMW[SGKRJFMK@9AOMMMD107@@?@JPLAGTbWZmx[WMJISRLRQKfU[]aa^[SAW^SN^SYU=QC9UYOVT9U8HATKBGHPTHLR?CPM`JBQY]SHKq}~}|}~zy}}}{}}|||~~~~yx|~~}||{|}}}}}{wvwy}77?C9:GIHKLKFGSTNPOHUZMOX\^\[WS]ZSNKRNQa[NORNTRVSTL;SXSHOSH]OGRUUQHPPOX\\`^WSJENUPLOMHKJECHLJLONGHPMPUOJPTOJPXVSTWXXVUWURTYYWY][UQZ_Z[\ZYY]b^[ZVX\RTd]QY`YXdhchgWNJJNVUYXIISce\[ab^`]YZWNMZ^[[UUTW\[d``[^`Y\UY]U[hd^[UOLOVX[_ZWUHIUUXQJTOEEKOHMQMX^^\QPQPQMHEDA=>@JE==9@B@>H\ecbecdf`_a^ZX`d[ad_\[Y]``beedeea]ei`]Y_`OFFBHNXSIECLBES]fgif\flqxjgaV[X`aYUVZ[`_e]SdgXTa_dskgb^ZUb_VMFU]RCFY_[hkjihilnmttmstefnhkpnmy~zy}|tuz{}|wzy÷вùհͿò}xtzdbszfgfhljjpn]d~{||{{z{{z{{{yurolllkjihfdca^\[[[[\ZZYTSSSRSTTSUVUUWVUTSRRRWcb\hgW`cdc\fuqsqsøƻŎpwpx}o~yÐkcrn|VXoVXp_T[FOjqio~~jso~uplzq|_GISZTPSZYYY\crsgZQLKF=21=IHB?@9$  !!!!!""""""#"#####$$$%%&%&%%%$$"!!! !!"!!!!#$$#$$$$$$$$$$%$$$$$$$$#$#!! !!""""""$%$#%')*5Q_sžrflo`nwȸ{xqpmlib```Z^QHajihhqrPdkEfmK`ukaYCinIlUZ{aej_[tiVsjkkGvq}cx{u}mci}wi{mn_bv[UjX^iZb_frqovztje^\VQGPPYcfZIIMcY\GEHPBIEDPSKEEZVSh_X][`QUit]pi\Zfgee\btslkouriikleY\c]UX\]ctumijif_UJ@>?@BBCEFFEH\z}zedq}kdfaRJVK=JPOHCFJHCGLKILPKGB?@A@<>8:9AC@<3::81<9:DCJQQDGQMINQG?@AC<7<>CGB@CEMOFGLNLIUZX[[X]RG<8630+,8157?9:@;8<>7?FCLQPM@EP@>65BAF;7>BFK@CHLMFJIGPOTTNLUO>GSL;?HIGEEFDC>59>4?>>@61ANK?7DSMGMRQOMPURLIKKEDKH?9=KPRTO=49GAEAILG=P^QJ[mx`ZLQGSZQQPNcMVVYab_TITdYH[ZVT:HAV}{{~}~~|{~}z{~~}~~~}|~yy|~~~~}{{}}|||zxvwyz|}<=CC=FOHILIGDIVQJNNESSGLV[ZXVPN[SPLMKHPYXNNORUTXRUMBXWQKOQD[MERTVKIPJMUU[]SPVRIMWTLLLIKGFEFOPOOPPOQOQUPOWVQPSXWVWWYXTVVRTTVXTX^XQV_[UZXVWTXZQTUQSPScbNN^^SZgfbiaOJJKPWVX]TMWij_Z_a^]WVTOIITWTVSTTRU_ha]Z`a^b\]_V\f[\[SQKMQSY^ZXTFFOMRSRVQNOQTVZVS[``[UUUSULHLHC<:>FA::?IGGOWdlnkedeb\^b\VU`d\ba^\\\_abccfhifbckla_hnfXTNCMRUJHEGNGKR^ic`g\bkqzn^`YXW\_XSTTVa^`\T^eXQ\[frkgbaWSccWKM\_[NOcfbiegggikomoomrsbfogghlt~|xz{wy|ļӻƳǽ}xk`]uxefgfghhmmp~}|yyyyyyy|}{zzyuqmjkjhfedb`\YXZ[[XWXXUSSSSSSRQQTTSSTTSRRRRT`f_a]VZannSZxwvwОkzy|uk͛ˬ_mt|Zu{_ggZ_IYs|zjpbx`xhgxz^Tfwl{vwpj~|zqZ|V^[̻|psz{vnnnkzpippigebfh`]_``[SPQOKKJJII93:CPYTNQWXZ[X[eWPNLHIKG=;EEC?BKJA% !!!!!"!"""####"####$$%%%&&&&&&&%%$"!!  !!!!!!"#$$$$$$$%%$$%%$$%%%%$$$#$$!! ! !!"""""$%$#$&+4Fsϼ]a˴~vhx|źzwsikidb_^^]XVR^qcbofa`Ok`LtaFgmbZOKTNbXXzeipg^glWo|nnY}~olwmy|oxlapshx`q|Xo{jV^dU[_\c`mwqoy{vlgZ^UMHPMV`dUGLRbYXFEIJCEAITMGGP\P^hU[``_O`sidq__^e\a[f{ylmrtohegmmhioqkca\apsebgkige`VIB>=?@CGIJIJS^uztsrommp}zx}qpl]SRL?GJHEACDA=GIGEGROKEA><<@E@ELOOMMRSQOKFIMMFB>;=@<:7@EMKFJJMJO[YW\[Z`USLJ@90*085;;A;>HFAELHNQSVPOMGSQFG<>IB?FIMNIIRQINZYMKXSIN[TBDDHGFIDDC>4797?>?803EPE5?OPIHKQROPPONPKFEBCHE@<9FRSYPEB=GEEAIIACWU\]RYALO??EMACJKRNENMFFMEYGBPZd^E{zwxy~~~~}}~zy|}}}|||}~~}}}||~~}}}|zzxxxxy{||ADGAETOEJKFD?EXNIHNCTPCHTZYUTILTKLLKHHNRULJNSTXZQUQQWYTKMODSKCRTQLOIFMSR]^QMRTNKSVPKNPPLLKISUONQQPPNQTPSVRSTVYXXYXYUPTTRUSRSSY^XQZ_SRYVVXRTLLZSQSP^gSIY_POckd`b[PLMMUZWZacUXega[]]^XQVVMFFSUNOQTPKO\bXSXYZc_W[]W[^U^ZTSJLNPU[YVULJPRSRWXQRQW[^c\Y\_a[Y]\W[TRYRIC?BG@;@JOQYacipqkbcfc\]c^UU`dZb`_^_`bcfeagkibafonb_qvjcd`MPYVMOOU\]ZX]f^_f_^ejxlX^VUW[^VQRPYf]\ZX]bTMZVeqjfcbYWccZRZ]cgZXjhfhfjiginonokkrs`epgghowww˹¼¹DZ¦~|xc|~[]xwcdmfbc`pû{wvvvxxxz{zzzxwtomlkifdb`^[YYY[ZVUUUTSSSSSRQQRSSPORTRRRSRS\b]`XXdhhpPTضysvy~—ufȹӣֵezaz{v]uscKQo{vuxnZlqeyTN[gp|trypmh}r~znXwWYbposrjfloqsxkktsihjhgc]_ba_\WTSOKKJJIKC33?BFIHGEE;<RNmÿfU~zҿtvkaeecb_]ZVTTRg`^]cXc]`gbVsUHo|aaZJ\GQd`V}epuubVk\l}ot~tlpaq{tu~ivpilokp\sqZrmd[]`WX]dddsrnq~|zqnfXbSKDNIQ[cRENU`WTDFGDF?CPUIHQTQOf]WcecVXpoapdf^]WY]g{ynprqolediqpnryyoc[aomgfghgffgfaVI????@BEGIKGB@;;FEDCDQPQLDA<<37?::6:DA857689::GCILKE<A?@L>CJJLIEIXPALYQGLXPHO`SAD>JFFICDA=656>2-7FI;;MOJDBIPKJMOOQPGCDBDFCB>;DQWXHFNCEK@@IG@MP@5S]elc[KTZQZLSMQ]QIFMJS\YS[Y]TXXGS@>@@^ZSJEPLB@GIBDLKRRKMJEHABVGAL[^Zp|uuw{}}~|}}|||}~}}}}~|~|{||~~{|}zyyyzzxx{||}IJGCOVHCJHCC;AVLFBNCPM=CSXUPQEINLHJIHKMPRKGNQR\XTWVWV[UNIOFOGCP\PDNJCGQZY\ZOKQSRV[ZUUTWSRTOSVMITTKLMRUOSVSRRUXXXXVVUNOQSTQMMRW\WQY\QQXQPURMFQXOSX[b[MV`VIVjh]Y[\[TSX_b__ai_V^dcYYZ\WMTYQEDQVKELQLFIYaRKRQTcaUU]YZ[T_\URIKLOTYYWVVSUYRJPWSPQYYZa]ZYZ]\YZ[Y^YZcZOFDHLEBJRT^ehijppg^cfd]\b^XV`eYbb_^beefggcege_]flkb^qtliopZU^]X]_ehol`]f]XgbZ]_nmXYPRW\]SRPPdj]XYacaTQXTdmjedgc]ceZZa^fg_`igjlilhejtqqqgdos`dogflvz~Ȳ־ǵƼyzvau~dezxego_Xct}zyyyxxwxxwwwvvwurnljec`^\[YYXXXVTSRRRSSSSSQPQRQQQRSUUTTRPWe^c\]~yscə˜Ѱöq}e||cĴצټ•tnf~zobt|Xgwhokej|p^`[`zzxjnnldltpxsuy{m_y]WjyκƷstvqjgilnpqtsurgegda__^^^\XWURNLKJJJJG9/4@KLECGHC?>=;;<;>>AEIJFAMxvU=76B_syulam\CMHEC?CA9;FCAACONSQLLEBDKLILOQPPNHJNPOMQTEC@5FCGFA?7:=7AMBDOHA@AB?BFA6:@HFAGFHNQYSOPPPOWRVYWUTQJFEFLGHJKOMNRLIMSKFOKBHWP@IKGGMAHJDIKDLJLKDCKVD?JOHESRHGPZI?:?LEC@CC?<66:>>?:2-9C?:HNHB=@JIBDJNRLA?HJBFEDD??DNUTCGSGIKL]QPZRHOV[^``^\TRVUVUQRMENUNIKRSOTZVNPTSTVUQTWPLNNMLHIOSZVLPUPOTMKMNKEQULT^`ZOR]\RQaf_ZTT[^\beghea`ibWZae]XZ`\PR\YKHJTP>DLJHKZ`NHPNR`dZT\\YYT^\VPHKNRTVXXXXW[_YMLPPOPYSXaXUUTWZRQPT^VV_[RKHJMLMSW]gedghlla[ddc_]][]X_fZce[befhjfgbcba\Vbgic[nnginueZbgcijklmqjefaR]bTSVbk]PNUWZZUUQZmh^Z]mk`Z\ZVbehdcli^be\eb]geikkjnmingejtqoma^ipadminr{в³ö˻|vvesrmxzkfh]f~~~}}|ywwussttttuuuvurqolfc`]\[YYXVVUSRSSQRSSSSQOPRSSRRSUWWWVTYf`fieչŬڽûvz~`ðpb̰ӧut~|tn[q}psmkvSgcwy_n|{~jesregalmxz}tu{qwzpkvykZksųŪ{yrmhhmqwvomjgfc`afe_[[ZWUTQNLKKKKJI>/.8EIEAAA?=;;;<;::AFEEDA17>CIORC-: !!!!!""""#####"#####$%%%&&&&&''''&%%$" """""#$$$$%%%%%%%%%$$%%%%%%##$$$#"!!!!"""##$$$&%$$(/9PgȲ՜{~m]ŷxxib`a`^][YVTQPQSWRjZNhj_j_dgoMLm^VucB|x>Oucbxaoj]^lQdtj}v{Ϫygq\dojljznubq`xkvllvdffgvedd`QP\PMZge^lpfjtzutech^dhLOGQOOSYPEKSXOE@F?=C;OQJEQRQP`]YcoaQf{g]sbmTRP_fllimmkmokhippjnwyqkihgfjokhfecbdfiicWLC@@@@?@CFGGTr|wrjK4?EC?;?<<6@BF?AFEHOTRNKNPNJVNPZXVVWLEKRTKHKMQNNSIEJPHFOI=HXG8HKIHHKPMIOJOPNQIDFLK;FGEEJSIEHJQE;7DGB?;?C60-5<9>ID>9CMTL:8@LKDFHGDCDHKNPDLSJKE@ICERF53OHSe]]XPJZKKBHDFPLF>@DGQMOUUUQJaIWLT]QdY[JHQGLJOLCEGJS^_TPFBAIGGDFVX}wvx{~|zz|~~~}}|||z|{{~}|{yxxz|}}~}~~}~}}UUWZXKAFKFBDAGUMKAQKHA5CLLHMOPTKSNNOOURPQKKRV]TUSTTY[a^_VQORFIRTNIMM>9IUMFNOMSZ]adb^\RJTSOVPPNEIUQEJQLLVZTLPSRSSRRWYSNKFDFFHLOSRHELIFMJCDKLFNSKS\XOKRXVST_^Z\VRY_ajjhhda_eaYX\fcY^idVT^_URJPXC@HILR]XLOQQX]a`XZ][XS\^YVJKSTSTVXVSX]]^\TOMPTXPX`QOTMQXLHKPYQNXVTPKILNPWXci_`bbgi]Zc^``]YY_Y^eZcf[`fdfjegc_^]ZR^ee_Wlibffjg]_kjhjehgmkkf^PQ\PLQZg`LS^[Z[^^Zemfb_gskded\Z^^_^cmh]ccegablmvxsrtplpggiomlh\\gkckooȷçtyls|ztvzk]j|}~~}}|ywvrppqrrrrrssqpppmhc`^[ZYXXWVTRRRRQRSSSRQPPQRRPPRSRX[]f`uhf{Ѿ¹̹Ψ͹n{e»ipʭɧؼǶ|xearvwgvo^igwdyzmacuvb`ccgs~zyv}q||yp{vqkhv`goĶ{vspklpzwmecefd`cge^[YZXURROLKKKKJKB1+4ADB@A@@?=<<<;;;?DDDCA24@>XIFJROPWaZ[jm][uw^mif^NNWb_felmjkmligjnjefknlhebaismdcbdehiggfc_WJ@>?ABCDEBGnvcTDLlzpNIZ^bfiktyvnfe`zqNTLNMNRMOROLMPSNPVYZVVVTTSNKLSUMUTRLUTTSQPOOPRMC7=F7,89?=>AB?;89:4+125C>6BA6=EB=;:=<;>?A;AFFEKOJIGIMNGSMKYWUUVKCJSRIGMLNKJPGCJQFHOD:KVB8IIHGIPNGJMIMLSTKIIJB=IDACIGCFFIPLABGA>7;G867=:A9>C5/,387:<879?D@=?GRL85CIJHCGPOFHKJIJKJLPNHCHLFOQ6/CMKN`T[TM@RGC=@<>KJG:;ACHGIQUMIGaNWL\]\c\e\WZQVROF;@EKS[`YVF?GRFFEGOpzwy{~~}~~}~}}{|~}|zyzz|~~~Z[]\WNGHJFIOGJUOOFVKD>9DIJGRRVUMSQUQOXSONKNYXaZZHOY\_b_cbWPUJNUQIGPN<;FJOHFLRX\^_b`\XRKPNHPPQMEFQREHPFGYXMMRSRSSOSYYWSNE?EJGEKNLHBCC@HJA@GLIGNJQWMKJLOPNOYYW[[[`gdfgef^\__^]WVcb]inb[Y^a][QNYNEFHMT]WORSV\[]`YTZYUO[^VYPMROT[UUWTX_^_c_UMTZXNW_MNTGMWJEJMSMLROPOLJKJNXYfdV]^[cg[[`Y\^[WX\Z_cWaj`cgbageid[YXYQ\b^[Ucea\`b`]Xjk`c_ffeffdZQOOLKMTcaV`e``hmfemhfdbklcimg^\Y\[Zdmiadfgffmsw~{xwwtopkjjkkmk^_kmp|zqĹ¾ʴ;Ȳöưszzqov~trjiɿ~}}|}||}|yxwusrrsqqpppommoonid`^[XWWVVUTSRPPQQRSRQPOOOOORQPSQTZ`sps׷ԽѹȰtg}mě|ézϯǦײtbzx}]gz{i{hoqr`ZasnZ_c`kx{wzw~gv}ctyp~q_b{dbmïvuuroosxocadfda_`^[[YYXVSRPNLLLKKLG7-2=A@AA@@?>>=;;;<>BDFDA85?EEGRXB !!!!!""""""####"####$$%%&&&&''''''&&%$##! !"###"#$$$$%%%%%%%%%%%%%%%%$$#$$$$$###"!!""#$##%%%$+NzθʥĢ||ֳvzv[~kike`_]ZYXVTRPORm]bZjvfn}ZVurNP_S]~QU{XEVuiaiigesQ[tÝs{|skluaNfe`Wkzkwlx}cgud]fjiYced{a\XTQPWOFK]c[cg^hegkod^cbdmcX_P[aSIOVHAJVK?DDA;6<>0*,-6>55<31;@?>96E@::;>EIHBBFHLEMIESRQPRKCENLEGMHIGHNEAKQDEK@8LR@;GFEFKMH@EEDDJSQPMNL>DBDB@B>EBBSQNJNG?7.:@17:?:A;893/+5;410248<;4BNMIEAFUTJIKJIJLMJNNFEIHLXG.6MDPI[MWOH9LD><92:IKI89?A@BCQTEDH]TUH]Wa]_ilfc`^[PA5=HNST\]YE@JVGHI:O~zz{~}~}|~~|~~~~~{{zyz|}~~~XY[ZWPLNNMUVLMSRQQYJIDCJLGIWVZVPUQWQJUSMMLO\[_`Z@Q_\_`_ae[RZPR]RJNSOCBEGOLIOTZ^]]a`[URMJMHLQPLGELPGGNDG[SHNRSTUQMQX[\WQJBDHEDEGLF;:>?BKD?CKI=GHMRIKJGGIILWZUWbgjkaabccWV]ZY^UQ[ZcqcXYYZ_a\VPSVRIHLN\_SPUWZZ[_VLSVQKUYQVUPLGSbWR[VWabaa`VOX]YMU]JNSDMWGBHKMHGKIKKKJKKPX]fZO[YWbfZXZUY]ZVW[Z_cVZjfefa]ddgeYVUYTW\XWV]e^V\b\ZTbfZ[Ybda_]\XTQJJIMZeiggecjtogjlefbafaamnb[\V]\^imnhfiijmuvx|ywtvwrrmlllmqohlssyĻĽøĻıij~rpzsntqjw~~}|{z{}{z{{xvvtrqstqppnnlkjjkjgb_]ZXXWUUTSSQOOPQRRQPPNOPNQTTRTSUammªĿɬsvmƫ˞խzغٿѣir~u[twhulsw}aYYduj\b_[oqontz}rco~td~qyyuoY`{c^kʼ~}yqlksmcbdfea^\ZYZZZXVTSRPOMLLLMMC309>=?@@?>>>=<===>@CEDB>==<;FLJ?3"!!!!!!"""""####"####$$%%%&&&'''((('&&$###!!####"#$$$$%%%%%%%%%%%%%%%%$$#$$$$%$##""!""#"$$%%%'%GȺԼɬţuȻl{~mƷnmqc__]YYVUSQRX`yasf{yo|UavvZSVYmvQ_iMQWr]^xv`s]eȜ{u}sge}zVSmg\Tqgzts[kpWYbi]Xf]lsXTTNHXUHGH[_]g[]e[afcY`c`ni\`fVgdSMOXH@HRF:??=A>SO?PSRQS[`blpeevt^idn[JX[[V]eceihddffededceffc]VYae_WZceefjifefefd^WOF@>?CB?W{lluuhXNE@FXiwvojcdk|\QNPNVYTSOMKJKJLTTOPRPOMMLJKMONS\QMRTVTTWRSVWWUJFOE758>@?CGGB@HJ72//>>365*08<=>99C:89;?:@I@8AFG>>HFLFGE@NMMMPMDBKI@EMHGEFLDAJMADI>:LPC@FDCELMDABBA@HNOOQTM?I?D@>=@E91/2,+9<2/024568=A<<=<=IJIGB?FSSKFIIHIMMJMNFEGEOU?7IH@EIXERKF8B@@B7-8EKM58?@DE;6;9?MK@AID4?CJPHLID@BGNY_YYeljh_`ba`WYZXZZSTUVjkRSUPU[^YVRSY\QNOO^`SOUXXYY]TIJTQLMNOVXSOKWcWS[[Zbb^_^UPY\ULTZJNN@OUD>EIIECFACGFFLQOUafRJWTScgYVVQW\YXVYZ_cVThihhb[aacd[TR]ZRWUZ[_c]TU^[WKY`WV[]]d\SZWWWLOQVfhmnbbemqigijgdab_\dmgYYa[`cgopskhmooqvvuwuuqswvrmpportrrvy|¾ÿ̾·vukvyqqtv}{{{zzyyxvvtqootvqnnmlkihhhd`^\ZXWWVTTTRRPNNPPQQQPONOPQRTU\_bfx|ĸþӷ̳ǧil•ӯ׭Զ}yuuxpvyllqywrfX[_lwi\]R]kjgfpzx[s|wf{eq}rttz{|nW\yaZi~Żtjimidceffcb_\[[[[YWWVSQQPOONONH805;8:>>?@??>==?@=?BDCC<224??DftjzmI:Zv|xx~{qxzmpi`fyjONPLQRPPLIHGGFINNMLNMLKJMJKLNNRYNMMQTPPSQQTUSTQKNMG:8AA@EINKJUWDC>>NH<:6-0978@:;;766CE>@LOFDHFDEHJCHEEA@@JOKPSJCHDBA==HA:KSMIJMJB41888:=1983-.4,/:94422432;@609<<=A@ED=>FNPOGIGEIKOIJHEDFENN=CYD=7MQ@OID99;AG9-7=KL3:?@:GHV?>FJMUDIZfaY[jqeafcce[JJTVXLW\YKBNTXI=R}~}|}~~}|}}{{{|{{}|{z|~~~}z{{{|}}|}xzVZ[YXT[[\\\XPRRUYZWSbKLTNDKUUVTQSOMFKNIHDEPUUVTTSab__]W]_ZV[UU\YYYWSMJD@KMQ_edb[W\_VPWQIHIJPPMIEBGEDHBKVKHPSVWUNMRWXUSUWN=BGA;8G?1=@GNHLI@=AJP[dabfhe`^_c`]\_WU\TPVS_kWIQNKTYWWWTT\`XTUV_aTOUYXXXVOGISQMKHLTZVUV\^XT\^Y_aZ]]UQZ\RKTYKNMAOVD:@EDA@@;CDAFNPFPdbMFQNQdfYVUKS[X[UV\bbVSdojjb\\]`a^QO_`WWV]bda\ZSWZXIT]TW]SXg[PYYZ\UX`fkkkjaagmidhijhc`cY[jncX^jgcksvstvssstvyxsqrtoqx{rnstsv̾Ž|yȿƼ{wyiryl÷~|zzzxxxvvtronossnjikjjjjhfa]\YXWVVVTTTRQQNOOOOPQQONOQSQW_r~ҽڿʹĭ¤jv}ΫյկŽѬ|}l{nVe{}̴|~vnz}z{s[[dhsv`UROehdeeszfXt{zi^vc|{tpvzoxlSYx_Xgzvpkhfdceggeec_]\][ZYZXTRSSRQOPNL?24937=>??@?>==?A=>ADCF;(4?CGKTRB& !!!!!!!""""#######$$$$%&&&&''''''&'$$#! "##"###$$$%%&&&&&&&&&%%%%%%%%%$%%&%$$#"""""$$#%&'('+C׵ǮͲ̥DZw]ÿxc``_^]XYTUSPVuirs~|Up`PgphQZZI`YYQl{yq{tulquuqicldJ]xYes]SPSY[[T`o]JIGPUYH=>AU^\OSgWU]YU]d_ko`^ij]i][]\_UBJN;69>?@MR;=5;C;<9544;?7@B@2=B>8>FEJIA<9ACDEEEGBPI:GMIGBCGD6IH=CB?DNOIIJLEDDGOJFGB=8NLHMSHHGFCCOMLHFLLF@=88<<=1>5//77.3999813412;6).=>=;;AC:8>GKLTGIEBIKOIGDE@FEKH>IXE;4OHAKID=97AG;175HG5A@?>GJO=@MKB6;OQB?GA4<>GKHMIA?HVS[cbbca^]]`g`]_aWW\SRXXdaJKOLKSUUUUUX]_YVY[a^SOVXVWWSLFHSPMHEMW\XYb[VUUYYV\\X\[TPZ\QKSWMNMCMWD7=BBA?>>FFACINCF]aNEMNQcgYXYJOYW\YV\feWR]klia\YY]^\QO_fb_^`fg`]bXV\[NT\Uc_OXi\Q[[\^^^fljhgedbfjffhihfbba[alohahtqgmz|vwyssuuvupoprnnvztnrtsw·vuƹ;ʽĹ||nt{ko}n³©|{yxxwvvutsqopppnkhgfefhige`^[XWVUUUSTSQQONMPOPPQPONPQWX`oǡǽ̛x{qظԼбŶϚu|~}p{zeX`geqoSRQ_f\fjp|s]dwtvtXirpzm{lrwon}lM`w^Wgvulheeefggegfb^^]]\Z\ZVSSTTRPQOND.+8049?>>=<=>@BBD:48@DFKMH>0  !!!!!!!!"""""####$$$$%&&&&&''(((''&&%"!""""""#$$$%%%&&&&&&&&&%%%%%%%%$%%&%$$###"!"$$$$&'()(U|չѿűìŸƼyjc`_^[\WXSTSPWncrwwVpUaekhTj^`haSWyo{~dsszltaMSvrZOHP\VQPaeNEIGSbUC:;@S\XHXcHSYVT^cbm_ba{h_`]fgceVENK66;A6>FDIHA:6>?A@ABGAOK@IKJHABEB5IF;BB?DLOGHLQDECIW@FHB9:PGHKQFLJFGF;DFBISRKIGKHHHJ@8;?;5>329A9159=?84764:6)(4?>;::??89>FHITHIE?EKNHEGE:FCGDBHMD?:OD?FIFFA4@F>97/EB6GA@GKJI=DORVCESf^[XTeaa^^[^ge[][\^TXYXYMKW`NYxx}~}}~}{~|||}}~||zxxvwyz}|{w|~}~|zzyxvvwwz{xwwvzY\\\\\]]__ZYZOR^_[X_VKRODIKCGOHGJFFFIA@E@GPKKN^_`^aa_[X_^SR[VS^a`]YVTTZXTXX_fjk^VMVWMO]VCGHNNMKB@GBBHFNRHIUZZVSOPSWVRVXWWSNPRNKKLPQO?;MQKHMJ=:=EHIOLHFSbXX]\]_^\^_dl`Z\^[\ZVU\^\XQMGNOORTRS[`^ZVW[aaWTXYUVWTQIDIPOKDFS^^YZ_UMPRUTQVUPYYPOWZQKRWNLKBLU>5>?BC>>BMLEGLSOO]`OIQQSbg[Z_ROXW\^W_in\PYgmf`]ZW[WUSQ^lmgddki_`lb[bd[\`]obR_m_Z`\\`dbfgedecccdgdehieddc_]gosrnr|{oq~xv{rpsonomlnqlhpujisnpxŽyλؼ̿ƹyvy{kl~}ml}{Ĭ~{{ywussqnmnnnooonlkjfddccccb^ZXWVTTTRRQPONMNSTSSSQRPVT`sv¿úǿͽϻ˿͡zhgǣŴ˿ưƖĝ{zulfs|y}}{xbk{w{~nfbmf\`ZHR_eSQps|zfafnpxgTutzje|{lrp{~kq\Rnt[Ubq~}kkdfhigfeeeb_```_[]^YUSSSSPQPLE>9<0367868>A??@B@@>>@<668>AGGGCA>6' ! !!!!!""#######$%%&&&'''((('(&''$!""""""###$$$%&&&&&&&&&&%%%%%%%%%%'&%%$##""#$$$%&'()&8мңtȶҵŽqf`][ZYXXUWRRSU\`\rzs[nayrjpm{idMcuo~ö½±vɫkyl{ljnqn[EIcZJIS^UIOKQ\]@>:=@P[UKdSFQTVW]bdgWhj`aWapkkePLSD6:<@9DRCKSPY\^bgflsrqxp]g^ZfdM[ZY^`]UFSd_\`afkokhd]XaffihhcZTSUVUZ^bdeghehnjZPLGCP[RD?CIGCs{`SY^ZYT]||xox{\MIHB>KCBA@?@DA=JEDIE:FQJ=GJPOIBB@JNJILHFKQNNURJJIIJHADJIEFKSVKJDESSQSVQLHIUGAB@?B@HKB;CMEJHPHLNHNG=HHENWPKKCLDEFPG87:89:58?C;7:;CC<<;;AB3,1589988:::<>JDIUQJFCLSWLERa[U[XW]``[XTZe^UWX_b\[V[bXRZ`Tyzy|||~~~{{}||~}~~{yyyxxyy{~|~wy|}}|~~}|zwvwwuuuuwwtvrq[]]_``]_bbY[_LVe_XY]VSVLFSM7FKBIEDDKF=>CAHRQOT``cZ_d_[\_\PS\VWcaa`ZX[Y[[YZY]_ejb^LGXOEY`HFGMLNL@DH@FILQOFLY`]TPQSTWWY][VYWTZ^[VY\WUWNDLQSMRQA8:/4;>>>CFFKQE# ! !!!!!!"#####$$$%%&&&'''((((('''&"!"""""###$$$%&&&&&&&&&'&&&&&&&&&&(''&%$#"#$$%%&&'(*)7ʽܵؿǽwh_XUUUUVWUTPOT]daZuzq}`qq{[Ll˹¦éɦjɹh{éªĞor]EahOLLVVLVUMcZK<15=@LYPU^ALPTXZaZjZ_pwoa[ToqnkVOUSCD@9B;HOFTRRcZ`ddbkupszf`b`\mVPbZ__\VJRYXO_lmmlmnndaglkjifa\Z\^b[X\[^deggimpka^WMGFA=<:=C;:JACG@8FRI:FFNLG??;HKGJJECFOLMQOIGGFFD@DFC?BGMQHA>BKLKPPMJKNPKLLJIHJLOE?EC>5EJ9;CCCBA82;;88;?G?GJOPDLMB@BCCBB6<=;>@=CNF97>;6568>@<A=GUOID@HB?EOCNMKT\ROKLSYRGS__RYa\_\^\URQY^ZTUVb]\XP^d[Xa``|zwv{~}}|x{~zz}}~}~~}{yyzzxxxz|~~}|y|~||~|{yy~}ywuttssuuvvuvvurrnx^a]^hc\cafY_\K[k]WZ[Y[ZNQ^K2LLEPFEDOD7=EEJV[Z^__^T\d^WZ_WNUZV\c^^`]WYYXYYYYWWZ_`aPAUUBM^PKGLKONCNLDOORUNMW`c^UTUVVVVZ^][XTXbb_]`b_][VQQRQOQQC:?DJSSRUPRZPBKRTXZ\]`caZUX[ZUVZ[]ZTPMBGVQHLOS\_^XSWZ\]XSceLMYWLLJFMNPOIM\c_UMRMCBNTKJSHLVSROQSNHMVLDMOLJDFNP]aXZdgecbdnpkif\]edbchia\[[YYYa`^]apUE]c_[SXZTLHT[\lokegol]clmiikfdfdgcenl^]`[XZ_\adZcbT^b]^acfc^chhgjuz|}{{ysyvmjehgfh_ipfhiptt¾úԹμuy~}xomqiemllipƿþú²ȱʵ{}}|zxusrqmihklkifddhijjjjifffeeb`[XTRORRPONNNLJVeb_\YOdgjxʾ¹ӼʍŜxukzްŤʼǼiwkitijkk|{uxwejl|xaQWbp~x~x}|y|ziaeTRnXGKp{iixst^puqhmn_pbXjrdjlk|je|{}v]kulULU`ht{nclywz|rgghgecadhga[ZZZYVSSRRQPPQJ]Q>2.-36EQROG?BDBBGC:8?A65:@GQ\R3! !  !!"""#####$$$%%&'''''((((('''%#""""""###$$$%&&&&&&&'''&&&&&&&'''(''&%$##"$$$%&&(((,8-Eþ̚ѽwyȭųȺ|odZVTTTTTTVTOPVcmh]t~vqau~XXv¿˿mĹgyă~icmVRLETOX`T[e[N;1;@CQXUZHAXXTZ^_]`UssuddL`wmp^MVWNORCAJBC<7FJGADAIHF=<7GGGLIABDNLLNKHFDDD@<@?<:=AGMD;9@FFFMJGILLLNQQPMKSXSLDHGD4?I<9@BBB?98;::9;@MEBEKLIRUFGLIFEC6;=79D;8OWOIINWYXZXTSSUYXVa\NXZTMKNOSNRUUX]_XOMMHCFQNAKNETZOOOOOKFOUJP\WRSW\]bkjdjqmkkkjnrmigbcgffbdhaZTVSOR[`c]QkdBR`]XOW\SHDW^\ilkcgrl\dkkgghgfgebcini_]]\Z[__ecajZSc^XZ\_egfiqsns}||xzvqvqkgfch_fgdllqq}ṷ̂ĺÿ}{xnw|~xtnhnidjfadw±ɳñµìy|{vusqoljikkllkhcdefeddccccb`_]YWUQMOPPNNNPLEXtnee_Pgz|ŬӾ·ʽte|}ڱʻüĬzdwq}}obbgb|}xkbNSkx{e_yyqXm_DHSnr_\q|yu{rZgjJRY~unnzqWul{xhubdlW\kh_g^uneexmzqxyhsiQGOWaqy{w{}k^`hkimssqlheec_^^]]\]\XYYWUTSQOOOF[N>1(('5DA4.3EXSCUUG?BC>@ECELPK@63+$     !!!""######$$%%%'''''((((('''&$#!!""""#$$$$%&&&&&&&''''''''&&'''('&&$#####$$$$&'(()Bh^Ʒͽ΢εsdzxlaWUUTSSTUTU\XTZgsd`rsqtes{]kͻ̼ΫxzįcwȯϬu`XT?MT[g\b`ceU5GNHNTU]TFZ_YR\`XdKf|sefSItoplVRVSP]XJSJ4;>=>?FECFBCOJKLGEFDBD<8<:769=DI?56?AADKBEJLKKKMMNNPTYOPIJLL;=GB:<=BGB;>A@?>=FUJBFNKPVYPQUNLKJ;CE9@AOKHCKKBNEFKFGLHMLPSLEPMIGPTNRSUBHOD78=GGA<;BA?EFFIMNNJMVTPNHD>:71,0654=FB=;AQ@G@CBMJIH?NEHRNPMKHGCJJB@EWI7K?>NFC^WBOGLVTO\XZ\YV[`\Zbglnc^WQNNPQSUVIKULKGJZ]OXaY|wu{{y}~}{z|~|~}}~~}~|{|||{{zwvvwz}~~}}~}}|{{zwy||||}}~~~}~}~zy}}|}~~~~{wwy{||usqmlnnnnpqqppqoler^[TWd[Wa`b[^XL]jWWXZ]_^Z^]MXZXVWQIDOJ;GTPT[`^XZTQRZb^VVYPISPR_`[[^\TT]YT[a[SVVVVWVTQUPGKWQMLPOON]TU]^ZS[baa`]]\[ZXUV[`bZQZ`\[]]\\^a_\^ZXXTPMFHLINOLKCABGMJLTXZ^bd`\_WRZ\ZYY^_ULNOFGSTNGGPUTVXVSMPUSPQWUVa[WQLSUQOVX[\ZYNKLBEHHKEEJGFUSNOKJNMNWVUeha__fhjnnmkosoljjkmpmigcdfcebch^VSSQKLT[cZH_hIL[[VNW^RGCW^\hijcdpl[ejeeefhfec`ehlicdadb_gjfcjj\^g\V\^^bmuqt{vy}{xvw~~tsulfcbZgieigm¾»~Ƣ©zvwhkwunmfhgbbefmͽԼôȻô{zzvtvwqmmmjiihijjda```aa`a`^]\\ZWVTROOQQOLNQLG]z|unf_eϽĪɿlhwп¤jjhb{ilrrom}~zs\bgFq{ubXfsjLYZKP_q}xkf[c`}}|{vhwmli^rtebkx_frqitd[qaQYg]_ek}i^illqh}zcsdOEJR_jnppyw|{}teghd[^_Zckrphdiic\YZ\_cb\XYXWVTQOMMKLPTE24BNK;9LgqcOYXMCDFFJPQLIHDABIJ8! ! !!      !!"#"""#$$%%%%&'''(((((((('&#""""""##$$$%%&&&&&&'''''''''''('('&&%$$$#$$$%%&''))._ηԱâ~tk`ZSQRRQRTXTWcgZbt{_bsyjowtnuzaĽһ²̺}ƨf{ȨƏyƧc^XJR_difca`p_:GaVSQPT]V\aYQT[_UUSxslc_>eziqcYVTSZi]VZ@BOJSO\^V\a`\qr]tq\jriWcTonYh`\YLRJO^fPH_nl^_jtocbccihgovsj^RN`d`\_aachmnmjgZOJHDBFE55KHLNG[p]qsoi_gp]TlxjWJEA@9@CEFDLRLG?=96;D@BA=9C=?662?BDTL>ACOKJJEDGD?@9465413:BD913:<>DH??CJG@EJHFEBNZKEOTMUVTSSQOPVP@MPFEOA:6D>>?KEEAIDEL@CGEHDGMJPOKDLIIHNRPU\UGMWE3;@FD>9>B?CEFFLONNORUVTPLFDGI>2377=ED957CR=EEHFRLMEKMHHOP[UUPGEJMB>PZ@7F9EG@9FQE=KevnXLYZI??GPUUUQONHHJLTI/ !!!!!!!!!!"!  !!"""#"$$$%%%%&'''((((((((&&####"#####$$%%&&%&&&'''''''''''((('''&%%%$%%%%&''().2,jûͻšényumigb]ZUY\RVaWYinXgij{qiq|ntzuõüãpϔ}˯v˨ƼzbjQ_liphfdbpjJNoc`UMJXac\WULUYYX?msiegDO}lli_[RSUepebQ@NQQUJcV\U]\f{a]|wfcusaV[\ehkaZWNVKTdTCYj`STdstf`bab`exraY[___]YX\[\`fkljjj^XYNBCF=.?CPKHHEDGD=>81420-.8@>51378=HB:HKJIGNRTVVVQPQLHPRRPNLKGGKJIKHNQPPPNUZIJXSOZTQONONOYPDPURMPI:6E@;;@EFD:88ETCJFLLRPJKQKEFMU`Y[PEHNO@=SU@;A8?CHJP9;9@GHIQaVWTWacWWa`eg]][\SJLHJLMIBHJC?@DHDEMLi}~}zxwuvy{yxy|}{z{{|||||||~~|{|~~}{{|||{xxxvwz{|~}||{zz{}~}|}}{|}||}}}}}{{{wromiggijjjjiihhhc{LGKKRPS\]WQYVFT^PPSWY\\ZYU[cY_e]YLTYXNOXXXVbTKTRSVX`bPLVKISQZ[[[\]UWX\ZX^`WSV\VQS\\UNOPOYQPQTPP\YTW]c_^aa]^_\YW[\QNWc]LGQ[WVVUWYZZ\`]]d^`c\VSLIIGIFJVWRLQ^\[`dehhececbeilkgkeXXXXZa]UQLSTO]f\WVNVhcMGHBQURP@CUWLNQPONNGAA77HND=CFFJEHORJIW^dffgghlnliiinkafiqrhjeejfa]bgcehcd``gWGLKQXOPX[\BDcYJR_YOXd]RFTXWX`bZZkiYhgaceijdcccljknmtljphqqhsrtusrwvouww{zy~w~wxz~tttrutrsocaber}ƾļõķƿҾ{r{}tf^dtyiagdce]Ydwɹɹ¶ʾ˻zxwuplmpqolkieionjgfeb``]^^\\]_^^_``_]ZXUSONORX]QSUcyjӻдϴϰ½rʍzy~arh_uymuq{~biq`lytzyzpkextki}~ojjs\lm[d|xn}soqtug_kZVofXG]]RWRdh[^d`b`hwvbhgWKILOS[\cnu}~zwundmwoXQSZQWWepmje`WRVXZ[YWSQRRRRQONLLIDKA;=ID=GY^TMLV[K89HUXXVTPPTVSLQT>   !!!!!!!!!!!!!!!  !!!"""##$#$%%%&&'''((((((((&&%#########$$%$%&%&&''''''((('''(((((('&&&%%&&&''')*(/@8k̾Ϻ׼ѻ{|kfic^[ZgoQWm][lrYqu|{je{puwyǴıçƤwzNj{;Ȟb|oe{ttigmhmnaXojh_SMNeaUT\RMSXXNPthh_R>iuapeaYPTYlpgfLKVOVPRcXWNZ_tjVhwqgutrWWVk~bmd_XXXNP\S@Ve]JM^nuf[b`^_gtth^`ca]XZ_\Y[XZ^dhhjqebl`HAFD6*@EHP]bhfr~vu|vsjbl|t_Zhz}~~{ys]RQKNPSSUTNZWVQKCDIE:;D6<>37344;B>LL?=BOJDGDDEE>?7031.+-7<943356AI9H@@=I@IFIWLOFLPJTEQOG=FNZZXYJENTP@APSF>=>CDMIJ772BCGCSZUPNS^\SWa^e`W`_bUHNDHMKD>IH@=>CA>EIO{}~|zzzzz{zzzzz|}}~}}~~}|}}|{{{{{|{{}}}~~~{xwvx|~|zxz|~}~}|~}}{{||}~{{}}||{xspnlifffhihebdcc_jGDHDRNNY\WMWTCNSNMNQSXYVSRY^W^b[YOZ\\POXWWVbNLSQSXX^bTOWKKUT\]\Z\bTVZ^YX_^VRU]UQS]XRNPPPXNRRVMR\WRS]baaa^\]_[XUZVJNX[PFNURQUROSWVW[[Q[dV[`\Z[RPQFHIHW_XMRd`\chddefeeffjlonjmk``ba`_dZRUYUP[b_ZYUV[cUJJEPNNN;=PVOFHNJKEDF>7@LKBDEFFGHRTQMZgfeefdafmjikhikcYafpmbhabe^[[ad_chcd_`cXHGHNYUQW[]GA[]JN^\TZd^ZLOPRUX][ZheZheahijmecfgmimrpvrpros}sltuwwv{vz{}zz~v|ut{xnsuqt}s˻żŴ¾̴~~uprytj]^oxg_eafeXZj|˺Ͽ±ͳƸɼy|vroqqqnjjiggjiggecaa_]]]\ZZ[[[[]]\[WUSQOMNUddSX`mxuyȺʸĶ˾μƼƻ}uw~}qfw|j^bxpb~rlqcacno~n|pW`m^nvnqqfTkujnz~px{zzuxgkk[kmeNRjWY_SNNS[_`acdtwjfj_QTTNOOV[ahmw~~z}vpedpp_^ZSVSXakc\VLHHJLPTTROMMLLKKKKJIIHFD?CJG??DBDBGJPH:?KSQLOPPNQX[USQF3()%  !!!!!!!! !! !   !!!!"""#"$$$%%%&'''((())((('''%$######$$$$$%%&&&&''''(((((((())((('&&%$&&&&'(((*'*=MJŰп̮Ǣʱz[_]`Z`{xSZrdZpu[{|vhl¬|symͫʹİznxvħzȬģrwnxhwsqpkfnfde_RUfnPP]ZYUWVOJmgfeQ;Tl_csddUOUdnif`VTSMWN`bYPP[jlTXnnotmlOWYrvcg[\Wa^JYVBNaTFLYipaU^ga`doka]]]ZTTbiZMPUX[]`dbirbdiYOJGB0.EGHMWbpnkxz}|ssmaawpY^ow|{}y[QJRVUTRTLSTXVSRQRLBCP?DE55459;A:IG<;@MI@CCDAE>B816/,*,46543338FC4=HMMHGRVZZSVSTTKHMOPPPPLFMNMKOOTMLNNNTKERQLSTRRQQPPNNMFLPRJPMAJSD6GK>:H8I8AQIPKHF;7;C9?IHINNNPXMLKLNMLOLJLQVTQTSOMIJSVRPNKNVPHMKJOGKHJIDJYOPHGLETFOJ<8JUYQUQFJTYPDJSRI?;BFHO=@BABBBf}|{|zyx|}|{{}|y{~{x}~}||{|}~~~~zz{|~||}~{~}{{z{}~}{zzxuvxuqnljhedfffec`_db`JFHBUKJW\ZKSTCJNMMJJNTUQLMVWQY[XWQT^_NMXVWX_KITNQXUZd]U\OMTU]f_U]bYY\^ZY_]SOQ\VQRVQRPPPPRPQTUMQYUOO[`fa\WY\ZWVSROJPSKEHTSLPNLJQUUUXYRX^RSY[XWVXYSQTNXb[MQa]\fg^]_bdcedhklljmkbcfe`^g`XXXVSV[ZYZYVQ[]SQQRSTNB>LYRGKSSTKKOKJLRQLSKHJKUZVRYghecba]^glfhohheYSX`jf_c[^`ZWY^b]_ebd__`[TMKNY[WY\_QEU^MK[`XZc\\RMKLTT[_bc`[jeeqnkmifikliouvyzxvvw}{twy||y||z~||y{|qyst{ulruvƿ¼ĴÿǼʭԯɬuy~trov{xp]Ylwh]d`eiXYnó̾Ҹĭyuqomljhfggeccddccbb`]ZXZYYYYYYYYXVSRONLKN]mcU^psn{¿õѾѷǦ˛ĽŽȺssnz|}seffnlnnwxhio]mk}vz}kMgq`_BCjzsrseV\khdju~rz~mqxy~xwzu}zpkydVXmeWhkhUOUY_db_dsnkjm]Xb[OSNU[]_cjsv{xfgW`ji_dYQSVY`_SMKHHPNLLLJJIHGFFFFFFFFFFB>AIH@9:;9<>BA?@GSUL@@HKLMRUTRPI<693'!  ! !!!"!!!!!!  !!!"""""$$$$&%&&&&'(())))(''&&$#######$$$%%%&&&&''''(((((((()))))('%%$%&&&'('))'((4ZҼıѺĨƺǥ̓VWUdWg[_uqVs{^~miuƤyx|v԰͹Ǥɑù|zzvssǼsy}|wrmme]okd\fu`\lbcja^WL]f^fZFBdaVpsa]MN[mjdi[^UQYVYjeUKWdjYV\hluwj`PU^srb`VYUh]QXKM_R>BVec\NZjaccpn^\`^XUW_aTOY`Y^\ZY]bjhcbWYcXPF/9QMOLN[nuop|}srtj]l`Uait}{}iOGHSPOOSKMUTRVUVWUOQYNPP?987@IJA?CDECELLMMVMKMLNORRNLMRWOOOUMKGHOQNQRKNULJMGIOMRHIMDJZKQGBCEQDLA5:RSOMSMGQXYOJRSOH@>FFG@0E36:9A?@VLEAFOTOZ_\\WSYdi`OHMBJHEB>JC:ABDKKD837;>CNLD?>ADD@GOLLLCC@B9'! $" !!""" !!!!!  ! """##$$%%&&&'&&((()))))((&&%$$#####$$$$%%%&&'''''((((((())))))('%%%$&&''(()++-2)6xåĶܶӾȩΫTY^mTgnezXv|^jf{Ɵw~ŭӬ̼ͱͥĢyzcjx¾y~~yogrraZgrj^zjquofac]eXaaOIW`W\znXLJOekfpd__XXdWlnhKS_c^T\YanwmkZST]qra[WWVg\QKPVN@BIW^ZNRc^dcml`_cd_[[]`de]YZ\]YUT\cccc_[hfVVP:M^Y\VV]fqolw~|xsxwlmnSV_dy|moqUAAGIIJPHJSLMQPRVXYZ\XZ[LE@=F?>CD0.3781/7403?>4=FLKHEHPQROIUPNPMLLKLQSPPEGHDHIEGFGFCNR>AEAGNPMKJKOSTRPDHKOFGJMOQIJSOIEFJKOEOFCK7IKPFLA;598<8>A?CIHLMSKMNJKMPNKIIQZNKJTKIGJMJIQRJNRINPDEOOQFGLAGTIMC>?BMFJ91CVEHNRMMWZUOLONIBEJJE?1/A3A98A5FMB?EENMP`[XVNP\hg[OJKBJGCA>JD::>GE?:i~{x|~}}~~~~~{{{{zwuy}}~~}|}~yvz~zx{~~~~~~||~~ywz~}~{ywwwuutsqnjgijgccdca__^\\[\`a\pNKKK^FKY_]GQSLMLNLHEFMMF@ENHJSNUGFIVPFGXV]cUHJJKQPPYghVSSQOLQaiOO[cbe[PV_dYOQ]dZMORZKONGLSYUEEMYFMOTb_VSPRSMRURMILPD?AHPPPPNLKMOQRTUPTc]U\b__c\Z`b_``fdSV]QN\\URRa\aebfggifgc]aggffljc[VXWZdd`abd]YbRO_Yag_^chgfhgdckf\dghfgkkd__djcWZbc`fgaZW`klebiwhc^NQSYa[VYQSYVMR\_^acchabhgggfdeijlibb]bh[OQba`c`ae_XW^bqrmlijpmlpnkmmmnmmorx}zx{{{||zvzz{ywu}vxurnqwhtqs|tr̼Ǽúϰׯünivru~rjcV^rnSWgbkq{ɲúžŴǩvnllllmmmkhededdeca_`^ZWXZXVVUUUUUTTSSQQPS[egb]`tz{ryƱɿɭŨʵ~ǩȮ{xsip{peysltzg}qtzuefmXMUUSXhl~~gVrzdpvssnsfy{wma_g~zi[TXbZ\bbgm`OU^_lxmb`b[Zee_SOPT\ejqywpqrad``UOZZOOUVKGJPVWPRSL??AAABCCDDDDCCCCB>58FMJFE:9>>?@A@?<;;?@=BJHIIDEEF:&(1*! !!"!!  !!!!!! !!!!  ! """#%##%$%%&'''((()))))(('&%$$#####$$$$%%%&&&''''(((((((()))))((&&$%&&'''(()*),+3rػŨĠջϱ[c|Wl}f^~~`kaÛv˾ү̴ƞ˿|qyn]a¼wrbZcuqltrjwpcntfg^d[QR_TUbz`NFOUhdmt]d`\`bjwubL`]XVVU[\lwvmm]TU[koa\YVXf]LJSI=CEGVZUMY^Zjoi^[``^\[[_hgUMW``ZTSWbecaaahl\QZZQ^fejc_`fqomv}{vx|zv~{_SYX]ujam`>77;698=??BGFKMOGMNHIKKJHGGQZPGFPLHGLLDCPRHMPKRRHKOLKBII?CKIDD;;@IGG37LP>D?BLI[[TXRJQ`h`YQIIEGCAA@MJ;=DGFHTRNPMPQNMNPQSNTf_[_bab`YZ_\_dah`UWTGK]WOLL_W^e`egffceb[bghgflgc_[\]ahjeabec_fYVbaejcdmmiinlhagl_eihihjifddgkbU\fa^ebZUXcifabjwg_ZPURW]WUXNOXSJO[abfhhkeclokhjjgjnokehddf_YSehdeehkhfchnxuronqonlmmlmmnnoqsuvyxuwxwwxunu{otvrvrspnilukxmu}z~˻˻ŻŦеɣepvotrggY]omXSg_f|Ѻ»ʹòƿĿxnnmlqvtrpmgdhiggd_]^]YWXZWSSTSSSSRSSSSVZ\]deeaaqz}oʿѿŵŭĬ|ȳ~~jqwkutzyƼwkx}zs_RUO\UNKQcl}rX`y`Hbkw~clkf}y{spmko}f][T^f]ZYZWf_YYTFara]]^\hmncRMNRX_dfdcaeb[^Y]VV^SMHWTIGINZYOOHC@@???@ABCCCCCBBA>95=INB50;EIJI??DB:46:=CLDDDAGLJC0&(%-A<&!! !"!  !!!!!!!!!!!!  !""""#$$$$%%&'''((***)*)(('&%$$######$$%%%&&&&'''((((((((())))((''&%%&&'''(())*+.0[šÚǢDzкnǼȧdhb}flenbϯ›vʿҶʵ͑nqo|֚UYkƙ|z{p`lwzqyq}`hxlue^YZ]XNYhqOKMR^eer^\cc`^izyy[\j]UUYT^YjrfnmcTWWfia^YXXfaLPK=GD8HUXUS[\bje`ZZ\Z[VU^gfOGTda^VQV]``a`acig\Z`_SJPQNQUY^jrru||yy{{z|||pZY\W[nzrefbF<>AECGEGJEGILMRPUZTSZ_SUXXJAB@A>679@HJGG;KPFHHJEDHIOUUOKJJJMEILJPNMLLPNKLNPKNTPKOSB8ACEDBLA3?@71A99A9I>4ACPbQU[NIUeg[[RGJIGCA@@MQ>EMGE;o~}{|{{}|||}~~{uuz}~}}|{}~{z{~}{~~~}~|yvuuuvy{{{yy{}~}~~~~{zz|}yvttrmmpnkifdddcaaaba^\\[\]`\YMPQOaMQ^e`T\\WVUUTRQRTPFDHOKRQLPDNMPKKPZ^]ZMFIJLSWZY][OFR\WJMW`RPSY^dZMW]dc`[bjdcfii]aXQW^dXDKSQQNS[[SLVOJJL`\ZXWSOG@>JXROQNTVNKMNOQNTf_^c`^^YUX[Y_ecg^VQKAQ]OKJHZTWb_bfec^``[aefdbica`__^bjia^bfcag]Ycdefccijgilkk_ak_ehbddbda]\bk]RaeY[d\PQ^ca_^bkue\[VXRWZVTUMRXNJQ]eehkmohekqkdgjejqokijhgdcaZjmefholmpikopqponrqnikllmmppnu{sswvtttsrroirvilqp}~oonjkchun||lyz~{ƵʸǼļŻιɷȵ}wgwurufibanp^Te`f}ηǻ«}ywuuy|zwupgeihgfa\]][YWXXURRRRRRSRQQQSU^^[fmj`dq}wĨ٧ع˾{yêƬ°®{wuzxt~}x|w}wipyxnc[TTWPUQN]jrdTkf[\Vd{t_ebj{q}ddjp{wibdXdo^agSLN]bo\HIdeaZb]hqnmcUOLMW\YUSSTWXYTY[XYXHHHWMFGDLWRJF?=?@>=?@AAABBBA@A?=:CHLP[mvqt}|zyyx{}rqylejia[emjhcO@ACCADCFHDGKKNQMSWQOSYNT]\JBGCCA:9<=ENKKCNNGNOKGIMLGACIEDJJMRWVQNLLMOQHPSMROOOOPNLLOPKMUWOMUG6>DEFFH?1=;?HHAEJCCIKKJJ>?AD>CGFLC@PHOQD>FPROWUOOMHOBC@7=99762>B>:?GIJF@JKGHKEEB@EKPNCDLJHHLK@ANMLQMJORRWULIFN@4B@E9F?=8@A=7IJFALONS\TOMQROLMQK?A>=ENHB6;?7<;AF18>>\YR^VJL[hcZ_QHLIKD?>AOUCLWJ:P~}}|~~~~}z{{{||}~~{utz|}~}}||}}|||~~}~~|yutvvvwz|{z{{ywy|zy|}}{yxy|{vromljgdeghfeeca_^^_^\ZYYYYXUpHSVQ^WXbf`\_\XWWWUUXYYRKIKTRWWTRJRQTTVXZa[XPHKNQTVUVXVPIT\XLOZaWTPXadZT]]ccc`gmgelokaeedd^f`MSXPWR\XZOLSJLORb^^__\ZPEHPTQPRPVWMKMNOPNU`[`e`YVVSTZZ]cbd_UIHBSXIFGFUVSa`_cbaY[^[aca^[d`_`[c__dd\]`d`ag\V_a^^``egackig\Zi_cc[\_^_^TT_fSQb\TY_XIO`b_`_clsb\`]YQXZTSSMSULPY`ifhmmoecfie]bf`fojgjegfbhnajj`biojimdfjkllmortlfjjkmmqply~rnutrsqpnmkhquefljx|lijiichsp}xm}|í˾̺úIJۿwnwzozyglh`lsbZfdizúĨ~ǿδ{z}ywseddaba\Y\[YXWXWTQRRRQQQQPOOPXa`\hyvbjr«ͮӯ}ɽûʹ›wwͯwzwuyryym|tqqgWUU]XPQ[igWTi[Uacgqoc]]osq|gVOdru\_fnpg_J]pTSS[in^VameXbbcrnljdYPEI^bRGMOPPSVP\RQLJCFGQKMJHKLIGA==>?>=>???@@@@???>>BA:;BHOUVLNNKIHIB=IWYNE7116EKIJIE=?MH* $!  !!!!!"""!"" !!!! !!!"#"#$$%$&'(()****++)))(&%%$$#"#""#$$$%%%%&&&''((((((((()))(('''%%&&'''()*++,*/O֦Ƹ̡ŕȝ}ž{ulou}mӺȨϳ—}wdZaYr`Is…rsvovztuyyzyepueY]dlaMTcoSGOQbgdhVXT`jWkvv}kekg`__`bS]hfbel^QZN`bcd[_`]kQTGBC2ATSWYY]X`]_V[QW_`cghZ^_`ddaXW[[Y]\]^`bddgh`OZ`UNHHIIPZepqrxyzyxwz}qdtxuvzxf[_bhmXGFFDACACFDEKLOPJOUMLNQKPYVMGKEEC<=@BGNLKJNLITPIHLNMJIMMGJPMNSSOOMJJPTSQ[[PQNNPQQOLMRRLORXRLTM;5>96971CB95?FHKG@JLGGJFG?@DDNLEDKJHFKM@?GINRLJMPPQSRSNN>5F=A9I`N\^MIRbf`[aSLNGLH=:HRWHPbM7z~~~}~~~~}}{yzz{{}~~~|wtx{|~~}}|}~~~}|||~{wuwvuvwvwxyzxvwy{yy{{zyywvx{vmgfoupfa_]YWVVTTRRRRSTRSVXTT\\]`_`cgjjllpvz}~FV\T][]eg_e_\YYYYUW]\[WQKPY[^aZUSZ\]\_`_d^XSORTWVSMWVUSOT\ZPR^bXUPXccWX`^ccbdkliimrmajood_idTVVPRVaW[LMQELS[a`baaa`UMPRRPPRQXVMOOOOONU[Xad_RMVROZ[\\`bYMBGDSRABCFM[N]`Z_^_XV\Z^_\YUa^ZYXf^U[^Y\`^\dfYTXZTYb[bb\`fggYTf`__VTY][XRQ\\MU^RQ[\PDR__bd_fro__gd[SYYSTSMSQNX_ahghlhjb_cc]U[_Ydna_ga^aamoceaY_kjghbacdddhmppoheikjlnpnny|slrtkppkkjhgqsebifs{jbghhbisr~rpíţ̿ÿǺѯ{{ow~mnlnkakteimemzȽ̽}zt~oeb]]]ZWY\[YXWXWSQRSSQPPQONPPYbe[f~mpv̽ӾѦڵ{~̰ƽª~Ģ|~Ƞr|twuwzrwiru{n`SZeXUk^h_EXWKRT[hfo`Y_qlrs`PKhrgU``es\[Tdj\cKTope[co\]abqsjkjcYKEVmgRHNMNSRSNQFECCAEELQWNLLHIFB>=>?>==>>?@@@??>>>AL>4-6EMKIKKCAJG,$*# !  !!!!"""""""!!!!! !"#"#$$$$%''())***++*))(&%%$$$"#""#$$$%%%%&&&''((())))))))))(((('%&&(('')*,,,,1FjزЪɟгƶytipӻǨĜʤȘvbU_OiǶRQ}ǣrqpµyxx{o|y}kxks|uxw^deprYNXceKJOTjec]UQLl^[rtuzhkkacecb`S_f``gk[T^O]`ddabb^jXUEAE2KQSYZZTT`Y[VTW\^hggijaba_`a]`ZSV_\\^_abekg`^jhWJL]a]WY^cgptv|zxwz~vjnvw|~yd]ahziNIIGEC@BDCFKMQOHKRJIJIHNUROLNHFE?@CEIONLNOKLVOGJNONMNQOIJOMOPMILNIITVSX_[TQOORSSPLNSRMQNPUMUSA:DMHHIKKGABJDBGFCHFGHGB<>>=87;;KKECKIEDKM@>DHPPLJLNLLQUYURDCK<@BAFAA>@58DGEDLONOINNMJSNMPRNPGAGGOTKB?;7:=>4<=@ZPR^MIKYb_\_aSQSHNPC:FQYMJeRU~~~||zyzxz|~~~}xtw{|}}}}{}~~~~||}}}~}xvwwuutrtwxyxvvwxxyyxxwusrrsohk|yuqmigd`_\YWTRPKMQPQPPRQQRSSRSUTSSTUUUVVXXWXXZ[[]]\\[_ba`eijlprtvy}GX[W\^bfgcc\^XYYYSX^\\XQLW[_cdYXWcb^`cdhh`XYY\[ZXSOZWVVUV\]UU`bZXOXdZT[^\ddadlmjggqk_jsoc^heWTTPO[`UYKLLDOX]^`a__acZVVTTQPRS[XNQPNOONSXXaa^OFSQLYZXW_\PE=HCRKIAVjfk`[epnqnVQYtl^^c_[mefoqamgSUxrlY_YP_bnxmlme^XPTjseWVQLMPOPKCCDBCAFEJTTMIGEFFB?=>?=<=><=>>>==<;<><0@7:?CDDIONLDNLKHSOMNQSVHEGHOLHB@<;?=<@AGG;9@LYg_bcc__d`SRRSUSQMZ]IIWhU?Q[UVXVW^\TQQPOYb]da^`]ac]^g]WYOPUYWMJKMJK]PEPWTFIaeahkfoticchheb]ZSV[PPPSX]_][``V]]XXXWMSTK\dSWWRVVaodZWPT^g[X[VYY[\_flnf[[^fjjospq||zvntr_aeljdbatua]bYhwfW]fkinnu}ms{óʽȵ´Ρ˼qnuzukep~zx{shnddtlģ~q|~nccaZ^dc]YWWWWVUSQPQQQPPONNQUUP^fVz~wrơɶƺÓʴ̄лɹIJµyôà}zmsknj~xm{ot`\ddcb^u`KcKZeBPaihmlttnmgTVixgklijfynnusgosZizrooaNMXmrtjqk\Z\`itmfidVNJFGLECEFEDCGFGLIFCA?BDA?===<<<<;<<<<;:99:95>C@GYeQTVKY\\MW]N>EheEDRUI@CGIJLI>:?<-" !!!!!!""##""""!!!!!!!!   !!!!##$%&&'()++,+,,,++)'&&$$#"#####$$$%%%&&&&''()))))))))))))(*)))(('(()*++,-27Oӿs}ԘΞ|Ƹmyfoׯ©IJ~lw^I^WrqHT~pxxӪzsv̵|s{ti~vv|vowrpljytyfT_X\WJMZf[\`RJD_]`jfkoofblifdcbb_aWYjmaVYdUVXcaa`gdbc]CLE1LMV`XSNWQR_\ddWchhjf^flhdeff[SZ^TW]ac_abidenqlbUNQ^gimlkiqsruyvvxz~xprsz{{vrlhzjPPOKDAHLHGLSTPCCLGGIHFKMPPLMKKHBCFGIJKJIIHGIGBFIJIIHHHGHGKPQNLMHDKQMOSSQMHCGNLLMKOURQRQOQUWUJCCJIGHLSTHMNLOQNKKKJHFIOAA?>CEF@AIFDCDEFJQPHEMRMEHJJF?:A@BGKJH@KJJDQOMMMRPLJJID8?@;?AEABHEDQPJWGCQJURNR^aWZZPOPMGFNVQPMb~}}z|~|zy|~{xxz|~|||}|~~~~~~{~{zzxvusqpsuvustuttuuusqrqph[dxqjjkdcb[XVTTTTTSSTSSUUVXWVUVWYZ[ZYYYYYYXXXXWXXXXZ]^][[\]^^^Wd_]Z[_`fjZNTTTTXPa]\]VPOV[fld`\[]V[cfmmm`dbaddc]cf]^[]^YY[ZT__YYKU^MQZTZghabkjia[db^elj`Z\\QIJGS^QNVNECKYZWWUVUW^^\YTTVPPX\]]RTRHMNJLR[bZPGFUSMQMONPKBCACBFGFDBBDGFEHQSPPTMIMNLMMLLIDADJFEJINSOPSTRRX[\RLJJHGGLURJNMNPSQNMQMHELNCCA@EIFEJHEBBDFJJKKGFMLB@GHFGEEGJEGSIHDFPT@AHJKKEMPMRVTLNHFOGEHID??<7?FEINHBFD?AHOSWZ[WUMRKFGHNB@??@?;CFDDDAIII?NOMJKKJMKSI=36<;@DFDB?>EJFDGPPMR\TNQRSRMHJGBCDDDCCBILGMQTSOWY]VQQQOMJNVQJIIJKNMLLQIGHIJFEACMQKKMJLJHFDKICDIKH@;@FGEHJLQSOMOCEFHNVC>@@GF?DIHQTPPTMLSNGFHC;::EUgX[bXONLD@MTVL^~|{xwxz~~}~|ywx|}{|}~~zy{{yyxyxvtssrpnnnnnnmkloh^o|vpkgjjfc`\[ZYYVWWWWWWWTTTTTTTTUWXXXZZ\\ghe^\_][ceXOSXRRT\b`[`[UUSXchdcZW[]]bchch]b`^``^\df^d__a^T[[NPXLULPY^ZRW`fkmffhklfaehglmaX[_YNKWgWJRZTPTMNPLGJLS[\RSddWU]\Y[[[WXZVVVOQZje\RLTYUROMQNPIDUSKN]kXQbgmeinlj^_ccea[QQMJKRW<;O^N2?TMMXTX^`dilmjfmslpthfkieljb`aZKNYUGKNOLXcZPPWbmcdfjigggjchffkelqiadc`fe^]\Xb[SaTLVSILMEJMEPSHNIJFQbXQTTUek`dg`aimheflqolllklsy{vpxtu{sxv]X_him]ey]V]Xgs\MSbqspnld}ξķŲ߶ɺ~}xh{r_qzgh|~mdeh}s纡xvsnmpnfcgjigghfedcbb```^\ZZYXXWURQNOONOQSQNNRUQKR^TX|lǸ~»i´øƊ˷ǶǺļq˝лĊзƽʻƭ\mkpyvwlZhvV}|o|sg`{yn{nxuvzioyzkfurnpgUW^dmrsrrmpsn[W`TKMVPB?B@=@KHDADDEGGF<89:9;;<;8576237:<:6IIFCEOLKS]SMRUVUQMMJEDDECGCAEFBKMOPKRTXTPPRUSMOTRKIHKHIHLMLIHIJIFFEHRUMLJKQQMIIKD>BHG?7:BGFFHKNUWVMICDFLJPG>79DA>?BDKHJSQMVVQGFFA:9:@FEBDB?AA9GBHNSSQQVTYMGWMNVGGJDCB;HHFCBBFFJ;HNDBILGBJN\QSHGG@LF?GNICAGNC???EIC=JUYOXWYURRG=JXVP}zz}{{}|{{{y~~|wtuy|{z}}{~~~~||~~~}{z|||}|ywtrpnlljiigjle`uzxwtonnkiea^__]\ZYXVUUUUTSSUUjfd_^a`\_aXWWXVTPccebb`]XSW_ddcZVP`a__^^c]`[^\]\[d_ce[[d^T_aTRYIWOP\f`ZccbkrkgijmhbmrilslcfjgZXhpeW]d]_`YYTKLMX\V^RVjcRW`YW\[[][ZY_XHOYkfZUSY[ZXVV[VWROa^X`jn__adeagjiaXZY]cehVYOGLQP9>LZN9?NRU^_cejmorqkjqplsrdgnignifhe_RX\XVY^[Vgf\Z[_gkabaiidjlmfijmtnoslehllpofbf`ihYiaQYVMQNCLRKNRIMHPQ]b[XZ[asofqnjnvxpmksxvuttpntxxuptrs{osf^glop_bs]X]ZjnYQXepsstshz˼ƬȾϭ˩z~|r}{qfi}u_xztgdbu{rľȶrqpmljggeeffeecb``__^__^\\YVVUTTSQOONMOQRQNOUVMLNQSepħ}}zkâǺŒžƼǫ÷zxǟ¢Ѱ̱]trwuyirfXrvPuzw|}td~vo|x~z`w{jtxslo`\abhyzppkhswndcgWXWfRDB@>>@NQOHJAAAGE;689:8=>=7483/8?<;=?LTNNQZjeVJOYokpdH>IPICMWPPOKFDHSTTUE.1>+!  !!""""#####! !"!!!!!!!!!!!!  """$%%')**+---++++)'&&&%%$$$$#$$%$%%%&&&&''())))))))))***+,,,---,++,---./1Exպɹ~|xʿȺf~npwyv|pԹϬͽƼǪnh`ju}wTqh`pzzyncvtwumxvcoyzyk\lmipkfujk}t`_ajpsr[`mhaSb^S\^WaTMPRP]cRTWg`Shg\f\VcohLI[ltid_`qbih]e^`i^_gaT_aLJWmQRYKF<]dZUVWSX^hgstyoeswiiccikikWJJO_]kqhirvuocUQJIKQ`dLEvuiddb]bfjqu|teUVZbuyhl\RQPQTURRUXVVVTSRQQSRNRQQPRMNNMMCCDACE>??9736>@DB;4@KHEADKFJQWJIQTVUUSQOJFFIBIEFEE@GIKKDKMRNLJLSRNNQPKGEKHDHOMKJJNNKKLKKSTMIGJOPMJNH@BGE<77?FEEFFINWSRJFGDEMGGG908E==;>BC@KTLOXPLGFCAA::AFGE@<=B?DKJODAOTNIRNZ[\ZWSTOC`~}{}~|||||||z|}~{xwx{}zx}y~{xwxz|}}~~}{z||~~~~|xwtqnlkhghhe_c~|xuttssqonljgedb`_[Yiff`]ad_^^Z_^][[Rchegab`YTV]aecYWL\g[[ZX^^^UaU[X\cYiaSVc_S`f_VWJ\RRahgenj`fsnjjgkl_oxcfqqmptqddprrgjlgkhhg]T__kgZj^`k`V^`TXd`_eZU^fVHSWj_Ua^^a`_`ae^]][kecigda_^^_`gecVUWPV^ci^[NJOTPEKJQNC?K_dgjijmoorqkknmnrkainijlgmlc`Y_`[\gnafve`cfiec_a[gldqvnjlnq|yrrnlknrwtoelmiqfmo\]]ZXVLRWSSTNTR]cjgedefmyqrwlqsxzwslw{wxyvnkswsrpqwysswmh{o_otsubbm[X`]gfW]ioty{~þɿɯͺѶȳֻƸĸy}}s}nhdsz~frzxxk`ap{vѮ׼zxwqsxrnmiffeeecba`_]^`_\\ZXUTTSSRSSQNNOQUTNPZVKKNP^r}ktn¿óƥ~zmʯɫøʮ{novv`qf\q]~yzzpz|extlz}~zz[xny{uolk]alxsgjcjyxmmho]gcvTJH>CBBU_cNOEEEMD88:986CB=5D91;EDADGNPGJOW\RA?GX^giYMFEQZVY_Z][MJLNOPUWQINM=#&)"   !!"""####"!"! !""!!!!!!!!!! !! """$%&')**----+*++)'&&&%%%$$$$$%%%%%%&&&''(()))))))())***+,,----.-+,,,-./5PåջǮv¥lzwxqtx}Ͳֻүξƹƻyk_mvwkWXinljh^u}stt shk|{upZjxm|{i_jnni^cueq}aX^eu}qhia[igfc_i[Ug`XXOMPNW`YOYYeZ^r`[hYWkoXC>9408=@A=47CGED@DF@IRRCEPTVWWUSOMIHIAGHKDF?CGIJ>EGMIHFEQQNLMIE@DJFDIOMLMOSPNSRKJQQLECGHJIJMEDMLC67;AC@DECEMVGIHFIDDJEEI1.=?8>9?@;=QMHROGGFBAHG:9CEHD;9FNQOMLXSTAD\R\YMSWMIPOMNNHGBCAC;EJB?IHDBHIWRRX[XW]MO\SDDKWNEBLTLUIKPQLGTVTXc][d`SM}}}|}}~~~~~~|{{zy{~~~~|z{}}}}{|~z|}~|zxy{|~~}}||||{{}}||}}zvusokifeheZe~yxz{~|{zywtlgggf_[ae``_Z^d^aaUbkbga`_ZUVZ^ccWVSSj\VXTW_ZV^SYV\^Zk[KRb_WbjgUVVYZ^jlmnpob]mpjmgfk\jw`]iokqyoglswulmppojosj`hkwncsjhjihgcYcpehlUTilZWb]g^`oe`cbdhkjaaaapgbd_Z\]ZYZ_ba]KRYMRZ^b_XPSTUYWVNOPNESljklkjnhlqnfeghnl`_jjijdgme^^^`]Ydpognvfbckma`cf\gqjwqoqov|}xqpqnqvywujjshmutui_efdaZ^][\ZX_bilpnmmmmqxswtgnpsutsirwpwypijtrnqopqsuxxlfpo_kxsvjdjb]cceick{˽ȼͺ}ȝɩθwlndapy{~nnxvyn_dq}{ƿ֮Ư{wzutvnieceecba`^]__^[YWWUSSQOPRTPNNQXTOPR[VJKMVixzzlypo~ĦufƸȫì÷Ȯyqt~u_}ug^mptz|on{isl~iwzzz[zp|{|qvpZhxzbeger{qkokwbuj}SSW=MDOllqNWSONPA;::945JB;GH17HFEPVEABAHIIG=?FRWX\XHG@EQYaccdgYMTZZWZ[UO\^O42<- !  !!!"""########! ##"!!""!!!!!!! "!"$%&))*,---,,***)'&&&%%%%%#$$%%$%%%&&&''((())))))))*****+,----.-**++,--/[ʯѶżȧpms}~svwyy«¾·һͿԺôżǡydkvp|f`uYlf_^Z`olyzi^o~u`Xiog{cajql_[gscrrU[]kxqebX[fkggdjfW`k_XSPQRO^[OWX[a_oqXa`[erkEBabjsg`afnemhgt^_iZ^m\XggV[reIXPJ:B\_RPVPQVYb\mnfalmopnmuzmaRPX\djrmcbekqywlgf_NABOWc/SvaSYWPLP\dgqgVPRYYZu|feUMQTUSQOPPPOQTVWVQWRRSTOOPQNXSPMG:;C>=C>944:<==:8@D>BB=EB?IQKDHOTUUVVYPOKHHAEKODI?AEKLDFBCGKLLQTOKOWPDFONH@@FFGFGHCGSNB;;@SHLPHCDE?DNF657?>;86@SDFCO\PTXOGG;GNZagnkm`Wab`]eXNV^NLFG=0,$ ! !!"""####$$$%#! ##!""""!!"!!!! !!#%'(**+----,++**)'&&&%%%%%$$$$%$%%%&&&&'(((()))()))***++,,----./,++--//-9ɊuɷWov}zp|uqľԼýǥkgu|}zgseXpWUWUxxwdnl]]y{qUXhli{Y_iqgZ^msepkV`XptfbUOalkigfma[le]\TWWSU`TTZU_ajsjSlXiov^AVi]jp^^_decmbvwXagV`kVZggajwZI\QK;E\`UQWMOVS]Rjc_^ahgikj{mb`dddgnnd`bgkquvsohe\K.;WY+Nu_PRSQONUZ^dcUORZYXm}kdXGPVQPOLOLJKMPTUTQUQNOOONPSLRZPSM=;B?=C<68:;;;:;?CA7?>FJDFMQVSQQS[QPMIE?BOQDF@CGNMBLHJKLHFORRSMCBCEA<ELIC;=DDDDACAFQIBGEBB>@CDAABBCIOIPKL@DEDKJ=5HDFG956DB@ILIA@FVOM[VZRO@KabKQ[NMJX\VSXOQNRRRSQKP\X`f\T~yvtw{~{uz}}{yuswyz|}}}}{{zxx|~||{xxwvvz~{xwuuusstsomljhd]]q{z|}~~~}|vpjhdaXW[^a`][^jc_X`d^c_WSXYRIX\\WLOX\f\U]WTX^WU\X`bgi_U[eaeotojkookrtlsulhf[Yd`fi`bZTkiTbqgdphdjinlagw~tosqedliqobijcfxysruqqxkfjmrqmqspqqsqjinnmjllggjnjVGS]NRWUTTaZRSFNYVORVUUUW\VU\\WWaaabjmbgcYa_YcbWW\ZYc]Sbe\[Z]if_]]gf]\imouyrlntukeozrkuvr|zoopwy{yqqmkputxxpcnl]nutsdcmlhikhejkdjvthnssqliinnleZ]fkhmjjnafqhcfkjglnport}xmjoonxzwwokqzrrßųíȧˢtoʥϻëzyvwyk^l{w{uioptueasuyijΪˢѻսz~jprhgdca_][[ZYWTTTRPONMMNPPPQMGUZLQ`VHHUhqqvyx}{z¤{yeϿǹɳ·Ĵï{ko}puryu~dbolqitpxwZq{ksuu{wf|qx{ugp~yhgnkrshdqnmpoxkybb[WRM}uTp^KRH\]X`TCCDMBDMPUGFXSO\ZJIFAMT[mx{oxl\ggdafVT]QNORH=?8( "!" !#!!#####$$$$#! !"""""""""""!!! "##%')*+,,----++**)'&&&&&&&%$$$%%%&&&&&&''((()))()((())*+,,-,,,.02/,,--.03Hʶ~{nx{}u}nl~~iмп½ýmeyxnl__eORP^nsk~v_S]{roLYdjsmTcipcYbuselhXa[sj]^LQhmlgcih]dm`a^X_^\^[RbVZbgpm^\k`sspSSgcXnfT\__`ab`mSef_bbP\glirqWPeNREL`fWP[KPTOWVf^YZ_c_aef|emqonkmmg`^gjkortvtmgdbE=YD.\hXLLNNNNPVZ]_VNQYYWfthbZFLQLMLIOGDDFORSRQPKKNKPROSMNUUSSG@FF?D?7??:99;?DA99>@NOD?DHKMLJOMLKQJJRRRSOJKLKB9:?EILMH?ETJ=>DHD>8>@EGBAMJFEC?AB:BHBEHICBDHKPPKLMOQKGHKKKKJOMNIEEGMK@6=LEMG<56@GD78:LE;ML9HQR=EVKWNLRQPNU[]YSUTHEHE9:BA@JMI=@FRJJUQUPK;L][NY[NMLb[TZVRMRVTKRWRXWYdgSdzvuvy}~yy{~{xxzwtv|~~~}{{{zxxz{||{~~ywwwvwy{}xssutsqnmmljijf__w}|}zuolhed\XXZ^^_b\ji_U`^^]_VLPXQFU]\\MJ[]fd[]c[Zd]Zc_dnmrlbfjjotvqtputmsqemtj`b`TVZbfaaROhj]epgcmeZfhffahvwqupcdmknk`klbfwxurmqytbcqvqoqqrsrrqpnptutjluqlmoj[FKaTSSQQSVUMRKKTUQSUQSUY^WV[YU]jgejkea^[Z]VV_WQX[Y]f`Zje]YWajgfdjul`crsqz|vstz{ngu|moxwwzympqtwwsqqhhnpqssofghafloqh[ch^ahgefhdlwtilrqqheeiljaS[feemkkg\hoghhggknqvwuuskp{}}y|xqvy͠˱ĺǭȲgpĵƪ˹ļ}||}x}n^e|~uuliiozn]jqv̯ڸĢδ;xlupkvsldcba^ZYXWWWVTSROOMLLKKMONLKWYJMXOFL[oogwq{|pv{ſİwzvzβɺͻþmxr}mrkpq~vatq~qolnsysy]y{kt|os~~~}uo{~pr|xrzwonrsjlagunnnswivmcWhPV~r\qVKZB:KL2=ZaWT]J@Vmdb]XUQLYMmfbVKfKIc]Q@GD:N_ftn]jhe^g_g`MVQRFHJ6*))'" !#"!""####$##" !"##""""""""!!!!! !$%#%')*+,,---+++**)'&&&%&&&%$$$%%%&&&&''''((())))))()*+++,----../21,+,,-/7Dnţqytvxeghзͻid{p_pwbg]WRUiwx|xkYN_{r`I]]m^XgbkgZczsejg]gfn]X]R[kkhcai_]gdag__aa^iU[fTcbjnjXkfmnydYgjXXsWS\^^`^`qbTkjh`YO`msloi][kNZR\ffQW^PWVWV^d[SZb_X^_mmezztquqfb^akjmnqtrpljoppg_CIXUPIHLLLLPV]]\VNQXZX^cb_YIIKHIGFJC?>CMOOOOKDHHHOPOSQPQSSQPKNMDIH@EB=;;ADCAHI><@BD@<7=B@@>=AKIMPJABBBGHCOLIDKJLQRMJORTSMKNROJHGRHNEJHJOE:9KIMSI>5=IH@9B;@?>GKG9CEJGHKMPNG:OZUPabOKNbXV^VROYUPGbZZUX^gfN}xuz~}~~}~|zy{{ww}~{yyzyvuwwy|}~~~~~}}ywvxyz{|{|~}~~}|{yroqqpnkjihhfij__}}}}|}}}ztomgega[YY^[aeaileT^a^[`XMMUVLT]^]OK]chfb]mn]jc^igdsmxvjnqtxxtouqttoql^fokb_^XWZcd``PPimgkkfemfYekgfgltzurtnffkkllbmpehx}ynbpqb^m{spusrtqoooptxzxll{|utpmhLFd]VTPPRQTOQNGKQWXUTWYZZ[Y_`]hkbgoi____\YTU[WSZ^^gqjfohf^_lkhmuyymdl|xxz|zusyyngsuajwssuxsioqnsulnq_ajikljjifacggijj[Z^ZYbddgebowqlkmqmc`_dii[N^hahpmid_jmlleglppw~}w~uqu}~}}ŷЦķȶ{lpyΥŽ˺zyub_yqvoefhuwdaiwһĎǚ͸ſȱvln{gvtjjb`_]ZWVUUUVUSSQPONMLJIMQU_g]RNKJC>Jasfft|~uyrmyĔƴǽxt{|ؼ˿÷þžs~iqzlzhnqzplxxuxool||ssn{x{uhuwiq||tosw{wml|~yystlwpchbpuonlsoftsbZqMa{ndmPT];@VF+Vab[aYMDoncb`gkT\T|^WRmdK`XU@CJ=Kcu|vk^gcg^jjudWVRZMNH1663,$"%"#"!!"#""""""! ##"!##"""""!!!!  !#%%%'))++,,-,,+***()'&&&%$$&##$$%%%&&&&''''((())))))()*++,,--../..10---...:W_yȩ}dz~vvyxvflø̾õе˹e]otjZtj`kij[^jz{}}cXK_xowXL[UtZ`cYiiVb{skmghsojZYa`eied`cfYbc\fe]f^dgfUf\[fbggf\phmpzaeofTapRU^\]\Sfzu_\rlf\WScqqilgcefT_^ijbPi^]ce^Zd^YR`e[U^^tzak}xtuznd^^hkknpqpmmjnxwj`[MEHGFKNMNRYb_ZVRRWZXY[]]\QIGHFCEE@=@FLPNMLHBEGFKLOTTQPPPPQRRQIOQKOHCFGGIIKKNNMNLLJFKIEMOHFHEE@FRSSSIBGLCAHIIKMMRPLSKHOPOPLHIOTSMHIHIJH@:?E>:@A@@?>=BDBA>:;AI9?AGEQTJEGFGKLGQMHGMLNQNKFKKKJLLLOLEFJQIKCKJHHA8BULRRG9?JIBBDKCA5>MD9:BA9=B@?CEDEHIGFD9?DG8A@BCOMCHHHIKLCJLFEJLIKIHAHGDEJJGHGADKNNGEKEDAB:MXQNMDJB76GNB?GOLLNGGGH\cUUZTT[ZTVPKGFJILPBFDCBBEMFI@AUTWQ``QQJPU^WTUZSHG_bPOY^_`Nn|~~}}}}~~{zy{{zwututsuvvwz~~}~~~}}}}~}zz|}ywwwxxyzyxyzzzz||zxwvusqoommmljhebce`\q~||{zy|~ywxz}~~}|}}{{|zvvxxvvusqjeghf`[`hdRehokc_Tfa_e]VVPUPbZUWO[djhbbayxbjm`ekgolqvxyxx{}yomquxxsiceowsf_bkkjdbc]_hhjrqjknnnmlnpqqqroqrnhffcajhcgdiv{xtg_iumXZrtpttooonlilvwrnnhlqq|rern[gga[RFPZSaWTNKRc]Zeb]U_jXbvwoedsnjef|sfcaank_afmtzujmot{|qhep|ejowxtqsttljjfcej^WeecfhhdanjdopbhlY[__`ddcfvk`qqmjgibeneaojjietvnnjjs\aZYab`OTeickjgdblmph^ktrt|}zusru~ɼǽԡƶŴÜ}oȳɳ{pd}zjy{h\ftsnhafedquboѳ۞}͹urzpl~nfb`]ZYWTSRQSSRSSRPNPX\]XSMQ_\U]`O@?;=Zb`cbw|}v|x|ŹʴvsçįЪȸq{lww|tw~{x{wvhxvssm~|wg|xqhrnaly|{ffrvvslcszmsuwnnkjhs|opkgpffimdgjTmuekjnPe>M_L0S_Vouq\>hunXbx_y}pPezzIJ@fzu~{{u}b^_ks[hgtb\ZckWMHHH52=5:7##"!! !!  !!"####"""""!!!!!! "##%&&')*++,+-++*)**()'&%&%%%$$$%%%%&&&&''''('(()**))))*+,,--../////.00.-,--5f¡~Ũ°zr{dɼѽ̴ƽҮѿ´öfRW\juv{y_tt^hwz~diUYOcmdgdSFNUvz_`ZYtbOdwqtpoyoxqdinlbak`dfheSa`Zcd\li^i^[i_e_\Vjmngybhju_`odWY[YRITjkf\ihcacTXbphdjhejdbehojbndpw~vgiea]bmdZcgV|h\lumqymjnqqnhciplkrsooqqnrvfabXPJDGOPNQTY]WTTUUZYT\_be`RQQNKQLJPXURWXRPTOIKMKMRRPTPNQVVUUWTSVWTNQXTPOQRTTNMMONHHNJHGC>DDFFFJPRPPRLOOMQJJOLMLLMPKGMLLMMJIJJJJJKLIJMLD@CB>BDBDKJIKKJJLJ@EJE:B?<@IE;IBCEHEE@23EHBBCIFLMILELY^WUXSU[ZXWQQOPVSOSJMG?@BGLDIAGUU[SZZNSBKV\SVSTKHP_TFOZ`^YN{{}~~{{yvuvwvwvuuvyzzz{{{}}}~zz|~}ywwwxxwwwwxyyxxxxwusrroljjkkkifdcdbXVv~~|zzz{{|}}{{zywwxz|}{{zyyxxyyvvwvtsqqqhfhhgb_djib`qjkgb_eddh`[]OROb\UTO[gmg`^cyn_jo`bhgllowzzxxwx|rlnq{pikiq{uidfonkhebcigfitrkmonmlmoqromooppnibb`\ffZ[\fsvssiZbnkY[ornqsmmmljeluskflfcgctm`jm_dhe^ZWQ\\f]W\Y^kecib_^gl[dxumkpohpfqqjieiwobgmlsxtmonxwlhbnp[hotqonmkohb^`]cgWXa__``_^ah]coi^diZY[\afhcfzocqzztnswwsmiwommmywqqmondc^`Z]]P[hjbhhcagmoladsuvx~~tpoonw{w||̽ÐظͲüҼſätȮɿȾ~{yv^kw}ans`\`prhh`addoqgsұ̕ɮž}s^vwhje^][YXXXWQQRPPSTTQIWicYT\^OQXQWYLA=?>JZa_`x{y}tlyxùyɸαƶ϶į}|ȥũ԰ijvtk}{||}njv~qstuqq|vzf}sqiqm^jv|tbfnxus||j`oohm~rgieoovzsqiiobihkineXjv[ghkX]?X^7I=@AC>:=D;FBDADBB;C@>;AC?<>>>BLPLNLKKMOHXQCGJJIHJIHIMQPGA>C=04DECC?GFJKLMFNW[ZSVSU[[XVRQSWWWRQKTODCJKLEPHKTSXSVWLSFKSSRSNFAISXFMKZWURV~{zyy{||zvwy{{yyxvvyzzxxzz|}{{|}~|zwwvvwvtuvvxywvwwusqonmjgghhhgdbeaW[|~|||zxxyzzyywwwuvwwwz}}{ywwxxvwwuuutrpprqghhhgffgkllbqglnglhikmd_dVUUdbYPU`nof^agrdajn`affiinx|{zwtuyskmos{phqklztniiqnmke_gndejtpinrpihlpqrojnonnmj^^_S_fSRSdqqjraP\hjZ\mokolhlgedbjrkgele\]]kgZag_bjhahbY_fogajflomjiabeio_f|smpnddohtxpnlkr{sjnnmswssqn|pkh`nxfT_nrhfpfgm_XW\Z`aRY_\ZYYVZd]Rbk`ZcgYZ\^bjmck}rfp}v|wtrxsqsv|xssqsnihffX\XTdjjcddc`honiiqwwz{z{}ullolnztrwuʽɼDZƔǯõʻſtɲzǼDzvywd]z}cgzq^Z^kndgb]bemmisũ߽¼ʮty|`m}f]gaZ[YWX[_ZQQTPNUVRXdpngb_Y^XMOMIDE@;EKB^cZ^o|{pytűɐ̮έ´|yå¨Ƴжvh~||z|eltkl~~mvnxxr}h}qpjqkYi}r|l^dm{tsy{a_m|gge}jfg]vsuxxqhknanijmrc[gupYcfb^RGZU;\dQg{S@btwgluynojKUf~}yimrpro^_fvvXbhr^\Zduc^`ZLACCGJ8,,&))#!!""""""""""""!!!!  $%&&'(()*+++,+*++*)''%&$%%%$$$$$%%&&&&'''(((((()))******+----.///00//////--,0Eqœsѧƞƽox}gtsзʎڴŮ˵Ǭ~ih\gqqbhpuxbt|mTO_mz\^cXM>GWvwyTada}[Psvqwk|zv{wrvukkjjpf\ff`\[iklqZWfbe[YVWlhalfalxbXeke\\UH>FS^[NWj]^kaP[ciZdl_ehea`ipkupk{zxxrkacurciuYsuZboiallgks|{n[`tojkrlkplchhcbhkkhaWPNLMLMNORX\[\^YRSY\gh\WSSTVUUVUUWYYZZZY[XXWVURLMNLKMPTXWVSSXVQQUSRQRRSTNJLLNJKOMCFC=DNQOJJNNMJKNOMNQLINGDKJFIDDGFGHKHKKIHAELLIIKLNLJHMOJJNNLOMMJLOOLMPCC@88=@>E@>?@??>CF@=C@=<==8NU\OFZbYckYR\bdXgi[dhd]^honvppv{xzujahwkjxlbxn\hqc]kicju~}k]ozkfjnfnoloifb_dgmtqgZTNLKJIMT\a^]^YQSW[ciaWTSSWWVTRPQRTUXXX[[ZYUTTNMPMIHLPRTURQUVQQTRQQQRSTQNPOOLNQPEIGIJQTQLJMMMKLOONMOLHLD?IIACAACDEFFGKLIHAEJKIGGIKKHHOOJJPNLPLNILNUMOQC?HA6?E<=E<=CA67?=?@>;>>=?ELMDEG?=<;::ALQPNOQRVNNVRDLTOJILJGHLOLHA?A6,;CADEEFFGMULGOTXWQSSV[\XTSQVYUUUOLW[VMVTLLTTQRQTRQTRSQKBHQLDB@JPLLJGCILC}{yttvy{}}~~~}}||}}}}~}{{z{||{{}~~{zzz{{xvutsqllpqpqssrrqomkjihccdeeee_We}{zzxxxy{|~|yvuwxwxzvux||zxxxvuutrrrrrqonongfoldpshrzcsttpiquwspkcqqhiprh`kputjgjjljkponnnpvztvxuuwsojqla`\fpcdm]ipqpdggqgZ[ad_b_kc^v{qikmrutmcnvsqpoeaYL`dXSUcon`jSEWab^begebafoYN\dig]_ba_ZVS]\LN_^^krrrqlhr~uqvtwsonh``cag]atj`_fdY`adhlkjku{tmqpjqvssnly|rstbgleXUhpbZll^^UQRUXVRNTXWWSNT_YLQac\XhcSeijnssnz~vpuvxxutvwtzwr}}yuywxn`akwqihc`adqypz{vysyqjsuqrmijfdhtqy{ɹͽҽ|ռƸµzvv̹żtivuytnt~~}xmrvj_ZXXbc]a`\cfdbrɼȽ˨{znsznptvxob[_ZXZ^nwoYIW\MWY`wwg]VYVT[g^KA@@DKH:Ib_V][yZdyʼµê~zʸӼũwwxp~ovtfnrzSlnrqhrdsrnskphncMmwkr_g]tnzniN\rze]aw}jei`pojw|pkkowwqtuo_^hobZ^e^XFS_G`cP[]aietqrw~cbs|hst{~omjp_gokaaktuV^klTTXbwiihd[SNKIIE=68FF?@@=DC>:BC@A;9=@B?DOVRLQLE@<845ANQONLGMSIIPKESVMKNONMMMMJGDCD:5@CADKMIFGQQJHNSVTOQRX^^WSSRVXUVVNLUWTSVUVVTRQQRQNNQRTXODNSLGFEHKKLJGDIAP}zwvuvxz{{|~}~}}||||}|{zyx||{}~ywwxxwussqnjilnllllnnmkigfdd``^bcb\Ti}|{||{yy{{}~}|z||zxxxutx{zzyxxwusrprsrpnmnmlgerqdruht{euvupjuuvsonmprrlqumjpruvlmkhqlqwwwxxzytuqrusldhm^XVYfa[f[ajll\\_k^OV]]][Xhblzuspnosyulfp~|trtnh[PjgeaecmlahPFZ^\_ceg`Z]hoSJYfi_V[`^YYNKTWHH[`bmyxwtmknyskvsuvpqh__ZY^T]pbRQacTX[`gihhku|ujqrhoussljovsuujjhk`TcofXet`XXRUWYXRLQTTVNGS[OIS_b]XhbVmqnquuu{yuru||}rutsqpsp{uq~{z|ukqv{vrojfciwwq~ztsrwifrsnlihjb_mu{uuϼִȍΚͱʶ»}ǾѶzwp~}xzu{z~vv~pc\^W]f[Zc]`ebduǴ˸rszzljxiz|r|q_`e\W^atxdOXcLV^gl`ZWSURPX]UG<;@ELKCXjUO]TFYnZ]~xxųʹ˸~Ŵɟ~ǹ͓Ͻ¯wËxuu|~mx~yhp{hOnoksem[qm|rkksei\Loogm]iY{o}zk\I]tnY[a{df``mel}zqnmp||xyvmaajkaY^g[QLfZPlTRhp]j\akw|bwoZmyyqnztgois_cmidbrrnU[nhLLV`rmkdggZWURNJCCMVB46"! !""""""#"""!!!!!  !%%%&'())**+****)))&%&$$$$$$%####$%%%&&&'''((()))+++++,,*,-.../00122211000/./6KbjЪ{o~˫|ò~j|zɻ̚Ӭϯοпpzzspxjtyu]csoh}]Qd{r^hsUUOfkhj~Qqsqpg}{s|s{s{vrrcdku{~wjee]dJL]j`YT^^[jmah]Q\fhYH9Q_YT>N[Q\aRSYY`T_c[``hYQXejpvmpr~t|sgijesrmwp[cswedhm_hztfbn{oeggekpnqplkihgikmmkked[RS\__djed`[TSUVXah\VWPQZUIRHICDOQPPPNOQOORRRVXRGGC@GLHHMPMJPMKKPTWWTRVWTRSXYPUOUVSSTNJLNMRTMLPNLJGH:9CA:8:;9FKCAGHEIE9@IKJINTWUTWOMH@705EPMILF>GMCDICDPOGINOPQQNKHHGJNFAEBALMMJIGJHHJMQTPMORZb`VRSSUVTWWNKQTSSTX[YTQRQROJKNSUWVQXVLIJIGINMIGJN>`~yvwvuvxyxy{}}~{z{}~}}{z{||{zxw{}|ysstvvtrqolhfjljhfgiiihfdba`]\\_cZRl}|}~~|{}}~}zxwussuyz{|yvtuvtssssqomnopofgrrdongtzvhusroktsqpopsopwlpvpjqtwremnhnjp{xvxy|uoporrnmb\h^SOOZ`U^[[hieXSVeZITXVZQYmm{wrsqqvyxupnt~~ususncZrkqpoiolhoYO`]X\ade[QZimRKXiiWOYa[QPDJTWQRdmns{{yunigrqgqjnqmpkd_WTUOVh]MJZ]PUYblqohfqxl`jj_inlribfonnroqhmhYbln`]qg\_WW[^^WMMOSYI>PZKGX__^]jgezxrttstyploow{tt~wloljhhhjx|ou{}~}~xtz|z|wqmjt}utxsppvgdrrhdefjf[htv|xĹ¥֬fͼ̶ǿw~¿įʼqzq}}}}~j^hZYmgU_`_dchsְ~{|}sjpyhbht}`gpcY`hqn[ZfS_a`^[XVWSPNOOKE?66@GGXpdMDBTXQWtt[m{Ы|ȣåžu̶|»ɫnģśz~{~yx}lq}}~m|ufoXRust}lwcg]~iivr}fmuafUMpeeg[jXt}pdOG`oaTZe|uwac]_fbuyspls}yulfgoka\fhXSanWchJZz}ae`Wiibnvlbdvuktq|irgvgfmgg`rlhTVjdGEVdllkahq_^\YXSNPUTAA1&(&! !!!"""###""!!!!! !#%%%&'()*+++***)))'%%%$$$#""####"$%%%'''(((((())*+++-,,,+,-../000122211101/..1;jʫwþjsxùwtƺϩ˽Ŵй°œ}yzmvooq~sadrmid^l{zns\afwn~xPnslgxr{wxyxur|pgrsu{~urleacFYeu^OU`XZmediUTZhaWAFecYP>YWM\WLSQZ`Vb\\bccUS_gfpznnu{utymgkcj~|lprhZp{viejo`kwjafqunlkgfjnpqoolgiklhjkknigdYXafedeca``ZVWX[_jaWXRQ[VJOCFBBJNLKMKILPQSSUY]YPJECEGGGIKJEIIIJORVVROPUTRRUWMQIORONPJHMNMOQIIQONLLJ;;A>=57:4LNJE>CMICELHILEDOTQPPQPRSTVSUMC85=LQG@FAbx^TNEcRNZQKMP`\V]Xaai^V[cfbs|mmxuqvugdiev{mjlj\l}rmenoclodbgnqrokfgkopprndeoolkmlimmki`^ckibcbaba\\]^`cmbTWUT\XLNCDBBGKJGKLHLTWYYYZ\[XROMMIIKHHIEGJLNNPSSPMLQRQQOSKKELNKIJHFIJJJLHGLMLNNLBBD?>3574:<:97EDIGCJRMCBFEDDD@;>;BJBC>BHGGGHNOMUWHHRPNFBLMDGHIFHHKSWUSQQMKMLMPSWQFBCIPPE?C?@FIDCB@AEDB@FQONLHBGKIIKHEC@BFFIE>?DEHJMPOPRSTXZ]ZMNUNIMNNNICFNPLMUVJFNQVPKFCIIRSQXYZYPUZWYQMPXWJ~|xwunoxxuz}{{{zxuvyzz}}~|{z}}}{yyz}~}~}|{yxyyyvqnmnnmlkiecgigecceedcca`_[XY\SJj~~{wxywusvz~}zzyvutuuutrolkjknpppcgni_igfgbfmrqokmpkgiqxwjdlditkalrog`ehbesokmnnmorg\\blunhjhXU[NHFGTMGTMdn]QIMWOGMGRV^r{tormksy{z{ywwyyrsqmqoouo~xuustwwkh^\^_`aTMWcbVLXn`U\\^^_`^nwr{s}|zw|occhlgo`^igjjpl_YTGFYYLLW^WW_dklkc_kr^N[^Q^d[d^Ydmb_fjolusosmmlabfemj][[^`ZKF[ZFISSHLYbflyxt||mlpkcck`Zdeinlmri^`]\_[Wblgjsrpqvz~|rsnswvvy{wv{xwwmbosmkpjlyaXnúĴϬܰސϺz}{uhy÷¦ĽkvyxiroorqVclhbfm¤|}yx~|{w{wwxnkmsp]qoj|wyqeW`ea}{mbacurrjf[W[WPGDFFB<1?aeSLF?>@JJDOotcv~hoy{xtp˵һŲįtwnstv{iyyiixp~wpi_w}ca|Rnqmi`~kywqkdZhqee~ooq^mo_eO\j`b`aka}su]PCO^\SUZjhqjiZ[^^g~{uwmg}}ywwlkotkgoui`mrfidUalq[_Y\lhwf{h^Zgersqvgdrgs^gfiTI]aD9Re_fl_f|_`aekf_ZUOPC2FE3,#!# !!!$#"###$#"!!!    !"#%%%&&'())*++*))('&%%$$$#"! "!!"#%%&''&'((()))))**+,--......./0001223444310/.-4PЕlp~mys}Ťpa|кıdzоʯʾɹɷēluxh~wgsz|ur~j~w{x}ofrkm_b{h~usz}x~~ft{kr}uu~giqXSnyvRSXZS\mahee\Xf[OLywXTQObNOVMKKW_VRYZ_`nX\cgfcuwkmzpoxqecjp}o`he_ez|stohvnejhbcglrrnihjpooormcjtpmoqnkkmomhgjlfcddcb__`abbbg`STRTYVOQJHFFHJJGKNMQW[]]\[ZXYXVVVSPPMKLKMQTUUURQPNJOOOOEQLHFLIDBABCEFGEJLHGGHMMMJKNF=68669864???GBBJLB=DGFJKA:<:7CF=A>AAIFEFHHIUYSRRRQJJQKHNNKJJMUXVUURPLJLFHKPUUSRSSPLEABAEFFFFEEDIJFFNWURPDCIHGHEAA@=>ACEB;AGFGJLNOOSVUVX[YONUQILNHKK@@JLFHQOB@IMQOLD=CGNOLQVYWOX_YXSW_`MS~{zyvqqutqx}}|ywutvxy{|}|zxzzyxxwuvy}~}~~}}}||}}||yroqssqmjllkjigdccccb_^```_^^\YUUWRJd~}{yzzxvux|~yuuvwwusrrpmkiikmnonabig`ceeaYcopokcmme\cpuqe\e`hpf\hnjcdac]cwj^iiihim_VX]ltjdfcZXZNGFISQCSMZn]IENPGHDB[cjuz~nqujkx{|||zxxyyprphpttsnzxuwnuz}rj````_[TIP_^YQXiZYbaehorv{z~}ywylkksoqfZdffiopib\NHUWNQ\g`]cfijha[hnZMZ[M[`Wb_Wdk^Y^jokuvsrsrjhc_cijbZST`dLE[TPWRUTXdjkpywstpdfkcZZb^U_b`jlikbX[UV\SM^d`inmjlot~vlpjq{rsxz|ut{{wkt~ywsom_rħ̫Ӊů³|zunuıϱzuzɼ{nvsuqW^micemڴȵqrtwv{xvuzks{nbos^h~ip{}mhX]ea|}sc]_jzu\QXTH=:?C=13Pf^H=BKMMLORJUp}lgmxqw|f~ʮɿžΛ»~ox}mkwpoxoigbxzgglnyu_fwxtb^uctjwg\[|xmtqph`Z`qe`~gko_fqoaWgg`_]jikqtrSKCPXZUX[hgrieXY]_jsuugj~uwzxjmqrjpxvgeqojg]`ej^U]Tihng|m[U`t|g}y]brgqdajpLFX_A;W`[hlag|_^bgnoj\SQOA:9988:>@>IGCEFEGTYUQOSTOPRMPUUQPQTVWVXYUPNOMDKKNTZ\ZZTJGDA@BEFFGHILNMLINY^[YUGIMFFHB:;@@>?BCBAEFFFHLNPPRVSRWWWRPUUKKPGEJA>FIBDOM@:CJPOMB7@FJKJMPXSIV]WUR^j`Mk~|zxvsqqoov}{{|xuttvvwyz{{ywwwwwusstx||z||z{{yz{{zzxpklmnnlijjhigdaaa__]ZXYZYYXXVTSURH^}z~~|||||{zyzzxxvwyz{xwvvtuvuqqqnjhhikooo`\cf`_bg[SaljneXliaV`pof\Y`]cob^bgmff^a_fvf_fca^jjYQW_lmd^b_[`[ODHLRR@OTTg\?CNG@CEVprrsvursrgr~~|zxtpqpdpsvrksusrem||tj`bdc_VSHK[XTRS]TX`dmq{}|z~~|}xtn}}vn]cfbempof^XUZZW\bjk`aeikbYTafTNXUN\]Tab[gi\W_kmmurim|vhnib`io`VW[fgRQ^]``]ilkrrnpprqhe]ah_TQY]TY]Yfibd[QXQPZLJ\^_ikhhffq~tkmjtvqqz{{vm|~}{ytpez̼çܴɰəij}|hsoy|;ı¿˻}þǥqx{{s[Zkidbm֨ڽϵ~stzvtruvxtf||bq|_\qx~kmh_hcw~|d_\YgzcHBJHB:CKEEFQYPID=ANMNQIKQOqsxvppph̽ǺǞ̯ųdvjotwxngurcpg^tmZiwnumYgtwrmn`crrign_S[xnraove_ZYq^__hqahsWeiba[^xiw{jukIDCNR\V^aejtgbWS`_lzktnctupwphpwomyzsgkpnlfdeb]T\UWolmmyXRYkyr}|^drcnnavwJER_AE`]Wkkgl{_[egrws]RRKGSTHL423# " # !%" $#"#"! !"$%%%%&'&'(())((('&&&&%%$##"!!!!""##$%%&'''(()))))*)*,-----......./0112334554223228gydtƿǿŮ´˸¼˝ʷżmpjp}|wvsygg_crlont}~h~qaumryvzyevxduyys]`_STdjhfnghePM[pr]^ajknZSOFLORRT]rb]imShmdhmqiptyiowikcmyvaig\hvm`nmfxnnmcdbefisokienuommsxq{rkwuqrnljnncjrfdikf_\ekbY[][VSRQRTTVWXYZ[[\\\\[[ZYXWY[[[ZWRW[VPQRTSRRSRUXXXYQPSRTUSNLPROKKOMFB>;;BJYHKJHIHHOTSEFKCC?;:<=?JD@CA9:DEBDGD?:88<@;<@?@=HDDDEEFSTPPNSTOPSOTWWUSSTTXTW[VPPTPJMMRS[]Z\TFDA>=DDFIFLMOUNKHQ]`b_VMRRHKOC67>A@?ACCCDDHGHKLQQQSPPRPTWRUXNKRH?FE=@IECIND6@IOOO>2?EEDFHKVQHRYWSO[eWQ~~~zwusqolntxzyz~}zwutuvuwxxywuvwwvssqquz~ztuvvyy{~}wxwxvutuvwuplkkmmjfgheeb]^`_\ZYZVUWSSVWSQURGV}}}{yy~}{{}~~}{{{z}~|{{zwwxyzzzywwwvvwxxxxwtstvurpqnjiijlpqqaWadc[aeZT]fgliPjf`[^oh_TW^[]i_]]amnmbbfothmf`Z_mcNPR_lja\a^Y`[ODJOOQ>JWP`Y=EXHMNGIFCKPNGHLMQC:ED@GIBAB=8:==AHIG@=<=A=;<=>>>FBHHGGGPRNQPPSLLSMTVWQQNTPSOU[PQQZUMNQXVY\Z]UCC?<=BC?ABCFBINLLJIOPNOJNMHSVRVYMLQI=BE?=GEAHOL;;FOQNE;=GDCCBCUPHQYVRKO\PT}zvutrnjlswxwx{|yzywwvuvutttuvvuuutrppvxtomkiprrt{tptqsqoorutqmjllnhcgfc_^\\]\[XYZVUXRQVVPOVMLw~~~|zzywwz~}~|{xwxz||~}{zyxxwwwwxzxuuvussvxyxxwuuuttuvvvuspprrrpnoomlkklqrrf]`cf_ab\ZW^dhkY]b_^]laUPXXOUcZUSci{sienyqnxjc^ciYLPUehb^Za^Zb[OHMPLNDQYT\SCMSONZvzzxtvrrypryzznjlt]bhkqheeeg\dzvthf`bjgfgV@AQQQPQ[[`eku}wu{qpuz~vnz|~{tvuriglmqmgfb``aakpb\fpi^VP^aKMPNWb]P^gia[]Q_klvkbjxuutfbtq`apvrsxrptsuxvuvogdedde^\XXg_NIO[NPVR`dYYSFUOGSFF[]^ea`ddj}yummyztqvpx{v}rmu~nl|ǼœxuԷϾėyy~|vmi{p̰ϟûδ~κ»ȕðpyrZfcbhrÿƯв|hhy{{vilxw|kTt_{xpc^tyonpbJNj_SeeY\UURRXVQF=DQSA6:?AUkfaq~q¶öµȤsǞwkm}{{zxtzgX~weyuiayakdgqmZb^nwvfepiS_b^_cbV~gqZa^QFfhsdZ~myt\dXYhXpxXhvgLdwbgd_~urbmoT>;HKOa_one}qmgY_cXp~jedcptnjro`munqwuplmnqtuokk_VgTPtnemcKScjpy~vu||yxarsoxpcNW`P[gT`y{mwm\tu|xz_^gYaiZZ_GGB66+(***#!!"$! !!  "#$$%%$%%%%&'&&''(((('&&&%%%$"#"! ! !""""$%&&&''(()))***+,-,-.......///0122454368985322Ulw~ƻǽһ¿ϻüθ˽սƶij|lyeZ[p|am~py~sjj{t\pjjyhqlovzuly}ng\[`ijocuejXNT`vfWhowvrd`KP^PU\cxs\fhaXjkclf]\wtrdlqfrdiskdkcclfdidmlflkdb`djmmhjd]drqklk|xqylzxpsprlz`imaagqmchnkcbjllefhbYVVVX[]acdfhkkjjlmmkjhgfc_ZVVXYYYXXXWXYXXXWVTQUSJKPOKIPRJKQSUWWXQGCKG@BJULKQLKHEKPLFFGKSEBLB>ED@AA<:::CQVPNGHJJIE?BSPGPUTOHGTE\~{ywwvuurjmuxzxyzvwzxvwutrommoqqqqstrrmipnffjhhlikqsuonsplmmnpsronknnqlfggd^\]^[[XTWYUSUTRUUNNQSpz{}~|yxz}~~|{{z|~~|y{|xvvvutvy{{z|}zzyxwvvutrqruwwvuuutssssrrttrqrrrppuwvvvuvusrsttrrpnmmnoqommmoonoqssrncbdkfccbaW]dfmbP`^]\iXMOYVISbXQKnktnhrtrrkhihb`[bogb[`hbegZSRUWSPS`[`aZW^]\arzw|zyu|yz|rux|lfhxg]gfoj^b`d\fvrnb``deehr]ANX\eY]ngnyy}{uwzolsxyqmz|y|}zzystqjmuulhgfdceorljntrfa\ehJOZU[fd\_dnga]Xhhnuffvwuwvggsofmutsxypotsrplotka[]_^_WVVSc_LENZJNQN`cTUO@SQGNAF[]^cgnmmt}vvwoyqo~{xqfkvmxŴwtnsΧ°ǵ~}}v{Ͻȶ¸ȾȼǢƯɿšxz{gmjgnvĸçϿętc{vnl{zu~lUnuZpi_mqwpaRYtj^loX[ahaVNMMJ>?JJF@>CGAjpewrҵοĻvհDzij{~{z}{luyl^XgokeWt[gd]on\Wdcjc`lgSZZUYd`\sapU\]JEjjn_lepkXjS^c^wvTjxwmRxseohm|xmbmhO;=GGW[hwlonpigi\]rlga^frkbd}``lpptxnlmkmw{yttmbgfJhwedkTT^ferr|ju|vx\yrngabl_fhZrxwcy]ns_lqvtdLUO@?05;40'' *&"! !!$%$$$%%%%%%%&'&&'&''((&&&%%%$#"""! !!"""#$%&&'''((()****+,---.......///001344436998663,C~~Ⱦ˷μӿĿзżƽӻ²}Ļ~gscTar{^qxm{vu}fmv|d_pawmen}rvpmy}qnZeb`lrkmdm^Wdjr^XlqvtsibWXgS[djum]d^[afdel`UT{vmbhnepbcnieldcljecjrdflhde`djqmdf^Zgqmhje|qppjvmpknpwngrk`fjxmfmjcbfnpmknmc\\[XY[]^_`bejjlmoppomlmmmkifa^\ZXXWWVX[YVTUVXXYTMKMJDCKIBIPPUWY[XMKUJJPZXSMSUUQMRTPGGEEJFHK=;?>AA><=>>?EOPPNPQKHLLKMBAEGQZUSQQRSUXVUVSSSHRSSHHVTDKLMOEQX]XSRZ[YWZY]XFEDBA?FQONRSUHGFFROS_UQNWPW[OMVVBLTC>CGJORY[ZXZURQHBKEANPMQTLJRQDJJMMKUSNSVNGKTYYUPPPQQOHJSSLTSRMGHRFi}zxz{yvsv}|yslouy|{{xpswpkkmmkihgikijlopkjkjmh_agcdjeenpmlnvrklmnqusoompqsnlnhed`ba]_[WZXUUSRTUSRQUnzyyxywtsuxzyyyyy{~zuwyyzxwuuuxyrnrutqstuwwy|}}}~||}wrstqnnnonlmpqsqqqqqqqponnpqqoopqolntutvxwvussttpmllkkkllllmmnopqrstsrqmhirkgeiideffjiPc][^iTLPXWMSdXMLtr~vrkp~zu{wqrvwusnuzmlcotmwxlb]gngabmiklmnrkgoq}{}xnrruqgduqbh_jnY]^c_hslh\X\_`^ly]Hanlnhlsny~|}sqwwuqq|xsrsuz~uywq{uisx}vmpsonnuxwxx{wsknpW`lcbkonggyvlaeqequgo|stuukmpjmwxsuzunoqlhfdhnk`WY^^^ROTSc^KEPYHJLLggPTJ?URLNBK]_grx{y}~v|q{sjm~~ĺ{ɮ{k{tkͬǻ˽}uzwοŽ˜Ԡùüîx˻yozzpqxŲʬy~~x|oqrlt`j{colkf~y~l_\cpc[jiTXjvYJPTTOB?KIKUONNQRqpy³ǹ˾{ϼī\fo~uiw}att|_U|muY|iSk^fgSjtcQvrceje\ccRSRORb^agakO^YAFnmaazy_i_TmVb^_ylTsy\hqnqox{znclcH<;BJ^Vtvounmtg[ee[n\`ll]YguZ`fpsruhikeo{}xyogsU[vmeib\`bam}n~dt{t~p_~z{lfvnzildf~s]vhyvyb^dVDA@EG70"7."<2""# ""#$%$$$%%%%%%%&'&&&'&&&'&&%%$$$#""" !"#""#$$&&''''())***+*+--........///0013444457:95100Bx|x¡ʼ³ŵʸɾʿй·vbq_Pkq~|esnpttumemlr\fka}seglzy{fpy}rp]jYXmqqpkp`_rrmZZmqwwqkge^l^cjmpoedZ\eeaek`VQyvh`ejanc_jgckdaoq`gvnddljfeaekxpdd\]imnfeaxklgilckhnn|unmrgcjrxnjlgdhjmlklpmebdc_\[\]]^`dhklnppppoooqrrrqmiea^ZXTQTXUROQW\\YVUVTOGEJKHIILUTPXTLSVKUYbVVRVZ\XSXYVNMJHIFII@=<@C>;>AAABDHKMNPRNNSSQTLLQPWZTROOPQTTUVYZWTNVRRKS]RGNLLJ?QVWUSRZWVX[W[^RPMLE:FRMMPQSHHILPHT^UMO_U]^KPZXHQVEAKMKSSZ^_bcZZ[GDD=ALNJKMIHRXLIP]VO`\YXZ\UUUY_[WUVWXXSUYVRVRUQLOWVmnqolrz~}|yvrsuvyuqvzqnrvx{yvqhjqjabfgdccbdecceffebchid^]_]agbalnklowujlmnquroqnqssoqtihjffedbadd[VVVVZ]XU[lzzyywuvvttvwwxzzuyzsuxz{vsqsuxvlinssrssuxywxyyz{xtuutnkkjijjjjklnoppppponnnmlmopnmmnokinsstvywussttqnkiiiiiijjiiknoooqqpqplmmlrqkhmqpnhefrgkc`lnZUW[`YYi]O[uxzwttprwz{{z}|ptvzxxrpzxuqx{x|||zszxzowrv|{lfkvhiWcnTV\bdkqkcXRZ[[]ls[Thzupuutw|ztru}tollnq}zrusn{wjwy|qtuxzz|~~vyzix~olrwzpqxiorgvwqvxrqwwptrntzwswzsorphb_``cke]Zbjg]OV[jeOMY[MJKJmpRXMI[Z[TNZck{wsrw~ǿyfizlϿնģũ̩z}nu}hv¼ɬɭ̻î}Ƶ˶wo{uy}~nyswzhdqyszkuhv{ra\hucY^]VW^XHHRTRLFGXjgXYbf\Yq}¾¶ĹoǫŵsUnts{|zl{y~fewqta_o`jX`caqP[gMkhZm}ogYZaSKIGN_\dbc_NePDKOHJKHKTXRMUi^Whegbaf`^Y\dca^YY[[WZ]ZWVSXZXZYaffdb`_bhjmruvuuttsqssr|xsyunotvwyzvnaboieaagcbaabc`^a__c`^edbb][]eicfnnpsryykjklorpmmnrrsrrvohkklihffqp^XY[`fia[k~}yywy{vswxvuvvvxzzvw}{vvxzzxpovxythhmqqprtvxxvvvvxzxrprrkgffgggghjkkmooonlkllmlllnnmmmmmkkoqsstvusrrrpnljhghhhghhhhimnkkmmmmmehjpwvomquxrnmoquxjp{zpkdiqlowmcpw{ywxzrmt}~}~uy|~|}|||}z~~~}{pvwxukjsliP[lTQ\adgmhaUMWVW`igYZhzyz~}~tty}~ztjggeqx{ummxvhttxuknuz{~s}wwvuytvpot{yxuz{uro{|wxwvvxuuy|upstka__`blmfdkw~qW\gspX^ld[TRQx}]jbZirqagtsxzyqǻ}wikoѻ̷أÞ|ypȲǷĻëu˲wk~{z}|yxow}z|zzm||fqy~xhvtzmv`\ovaPU[X\^O@FMJGQWOVwfbrw{m{Ĭµ}lƝjeqmpqovs}Ɏ\u}lidx}p^cSri^w`S}nKebWl|vkXQ\TE@CL[Ydwa`ZTcJFYpRLchUTXWo]J[{mPdzyikwwirrtveqoQD<6DV\otsxyrrbe_G`nUmk[K^wZU[iofgeae_crxyvr|dmrnqqovgfm{zr|x_tlwnu{kcyi`ikoz{ypdV]LLHB=@5KX0.=1 "##$#$$%$$%%%%%%%%%&'&&&'&&%%$$%$$$#!"!! !!###$%&%&&&'))))***+++---.-..-../////02334456884QiZfz¨ƒ÷˿ëǸĻ|}tqyYiV]~hxosd_uvovvejj_gZoell[V^hqwhdv|uokaRNkclkwkphvytpZRnrptloldhkkihnhpudT`jaeehebUjwf`^c]mhadbcfg_ppaovpgbkliiklttkejlokoaXasec`g`[`chmhliqg`ilvlqnpqopopnmlicdhjifilifddegijjkmpqponppqrrrssssrpjfc_WPOMOTVWVWZ_`[XWY]b^XXYUUWNTYVTXXXTRUXY[ZWZ[YVVTSTQRSSRIMDHPHHPJHIPYRPOORPIIQQNUUOUPILGEFLNKJJISZW]f[^\cd_Z^][QLNJQVQU]XTTTPTXTTUUTOQOQTUTSQSQUTVXXZ\`^ReiQQWTPRVPQUVWX]dhhooniobTKHJNQHIJKQSTV\kphiiltmiledbbggfhY[_[Z]^\^YV^bba_ceddddb`bfgiklnpppprtvvz{y~rkmvxusurjdemmmfckgebcega_a^^ecbgeefb`djkfkqtwywy{nhhjmmmljlstpqpusginnkiilwwg`abhstgfv|xwwy{ywwwuuvvvvyzwv|zutvwwtpotwxqgjooonoqstsstttu{{rprpokhgggfffhiikmlkjiikmmllklnnmmkjnpoqrstutttrommjhfggfffgghhikkiijjkkidgnvwvrrtvxtrtrt|vr{}}{ry|{yyy{z}{xz{vpv~}|y}z}{|~}~}~~zw~|{}}w|{}|rqrsgNTgNKZ[^afc^WJVUYbeaV^s~tuy{}}xjfdemv~smoqsgntqlelt~~u}y{zyyr~pk{~wunvtrpn{xuxyuttrw{{wtuvpebfolsuqtvber~zdt|mod^dosp}|n˿ο~{}mrѹƨȕçʾqx|οɳƦɺéyˮvk}z|}x{|zy{ky|yxtzrskxvhstjwbe~r`dtsmnhO8;AEWgqnd}|¢q~p©|fukxxvkwspktztno}qw}hhwmPblcvu`|nKi~\^fu~n\JTRBSfoiyx}ʴѿ¹ǻ·øų{zxvl~tSeWldu~npXazqpvrdji\jZmdk]VN`pur{[rvptedEaacqhwing{urrYKnponehp`ikmmglgivlU`l_gffedYgsfbZb]jjc`bcdh]ppbntpjajiglnm{tpkopqpubZgoa`dg_[Zgekhdis^_ijpinorsoqrqqnlidfhjhhlpokgffgiijjknomnmoooppqsssssrrplic\VRPRSVVVVX[ZY[\^a_^]Z\_\V]`^]\[YXXWWYZ[[\\[YXVVWVVWWWPTSUXTVZTUW\]\WSSTSGINNLQQIQPOMMNPSSQVWX[a[]bZ^agabbfeb\[PNTXSV^[WYRMPNMRTST[TOPSWXUTTSUV[XZfdjfZgp^TVWVS[[NWf^`hiliouqlyqeZQRSTKQNOVQUagzyqwloxwuokhilkggod[de`aa_a][gkkdbkjjjjkjhijjjmmnqpppqrtux{{olnw{upqqjmompqminjjhghihecacjiinjhkihilmgkq{{xxzrhhhkkijjgormqknrikoookinyxkhjlpvvpsx}zxwvx{{ywutuvuuuxwuw{xrrtuuspnqvyogmnonmnnnpqqrsssy{tkumtqjhfhgfffhiijihggilmnnmlopnmmljmqrqqttusuvtponlighhggdffgfggggghhijgnquyxwtvwxxuvwuw~vt}~{{{}}{||~{{}z|}|yy~{x}}{z{uu|yxw}z|zy~jS[cNJYUZ^_aa]S\^cijdXqx~~|vxz{}zjdhlnuyropooemrmmkmu}x~z~um{~pgt|okgppikoxvuy{trqpzyvyxvwymdvxz~}vnp|xsxpm}w«ýŸvx̾ǾӫǾ}ͽ̵ȳʹuȨ{pvz{{~xs~ytnms}z{zm}kvzlpohy}nh{jRl}gjeRB436Iw{ǻ~hu~tsymssugl}ǥq}muemt^|{wsir|t[]kjvunRqy\^\lwaLRN@=ASKFbtf`d`fq_[TJ\waNnllgGKriQ_kulmvnZpeuibo`lQU<9WT`|uwsjsoffJMtPZmZDQxr`YY^aZ\_[_[Ydr{urns|ztqnqvtpj}~fsz{iixrqwi~o}o}s_uwU[yp\eh_YUC>PZJ3>G9-'*'*$%#.("%%&%%%%&&&&%%&&%%%%$$##""! !! !!"#$%&&&&''(())*+++,,,----,,,,--...///134566751aaMwtkpµ˸þľ¸ƪí~~v{w{m}oRc]x^s{mkQg|mpwo}{ejf[m]ihgSPIk{hzyqWxvvjqcXGfQgqlrlkhxqqr]Lkomj`coccknnfjh\spY_l`dngedVemgcXb\dkg[_cdi\poblrplahffnol~{trrrstx|gdmm__ji^ZYkchi^opX^higjkmssossutpkiegijgjpquoihghhhjijmnkmmnnnppqstsrsstvuqlhd]XTQUTVSUWYY[]]_`]\[]^^]a`ca__]\]\Z[Z[[]\[[[XZZYYZZ[XYZ\\Z[_]Z[acb^YWVUQQQPKPNGLRRRSVYWYWZ[X[`_]^Y_cc_efgffcbUQTWW_]]Z]VSQLLPROSWTQOPVVUVUUVW[Z_jiimccyrWZfbZdeS\jgkokmjjvqi{voj^[\ZW`\Y\\^enwytvqrwzqroorphinkiihfhkildcmpnfdnpmnomoqsqllnnoqpppqrtuv{}}nnpy~tnmpjpvmsusrqloqnkgmnlhcinlqrlnutmmpilqy}zxzvighjidjndfmkpklrllpprmhmwyokrttwxwzwswxwwx{}zwttuwvtuwusx{wqqsssrpopsyljpkoomljjmopqstrvxwhqrvtlfdhgeedfhggfddeimmoppqstssomllqurquttruwutqnmlihhgffeefefeeeeffiiewxyywvtvwxxvwvwz~ss|~}|{y{}zz|zz}z||}zy~~x}}{y}~zrt{zw|s|~~ximm`Xc```dbpkmjouv{rn~qw|{ytvyz}}kejrotvyrqnpgpnrxrnz~||v~~|smw}~qgnyniamqeflstswzrrqnypoy{wxsr|}~w}y~xw}zľϲĶ{y¾Ϫɰ˽|ν̿ãȺ{ykxvszx~xjyz}tuycy}x{ymunnooogu}{vxdX_UJDIFDNUNJrx~~ygn}zseu{r|jqjgď~ktafj~_l|suvl|m_rw~u_t~}\[Xdy|dVOG?@HWHLlchb`|}d\W^gS]smzeAVkdgZpnhypxfga]sadzZabWc>=`Tawrxr~konhfGYkM^fNAbyg_XYZYUXZ[[S[dtprfkrzyuqmrvt}mtspm}f|x{gjvlxsj{skj}diiQe|r_ppfb`NTRTI3=EB3*.//%%&=)!)+&&%%&&&&&%&&&%%%%$$##""!! !!""#$%%&&&&'(')))**+,,,,,,,,,,,--....//123456641_tonj}ǮƾƦ}|xx|~w}rslkR^zm||^rylgRmwkqum{tjka]segncNLUrudvg[vtimegIOYNnpmlmmjsmpp]Smomi`blg^knpggjWmp^_jb_siffSbigdW_Y^km^Vcbj^mpahrol`edennk~vtrurstkpql`anl_Z]lbfc_plV^ghgeiksrmstwtoligiiihlooupjhghihkjhllilmmmmnnqtsssuttwxvsrnhaXSPRVTZ[WZ\\_`^\[\^^]`c`_^^`^Y[`a_]\]]]^]]][[^a]\]]\]_]\\`b\\cdd`\[XWYWVUOPOQUUVVX[[Z\Z[]ZZ_b_\[_c]]eedddeeYRSUVUb`\^[YWRRRTRSVSONNTTSWTTVX]\^kliplfuwi_pucnnddltvskljfsogvwmrpfa`cfihanmjquwutrsv|yqtppspiinnomkikompphnqoifpomnqmpprsnlooosssrqprruz|ylnoxunloksvlsutwrnrvslhuuolciomouqo{ypopilpt|zxzxljjjjfisi`gmpopqopqrsnjlvzonwwvxwz|vorwwux{~{vsstwttuvusy{vonpssqpojsxjnnkpmmlnllmopssrvwvjgxrvrkjjhggdhihheeefkooowwvx}{xppnnsyuuxuvrvzyxurpqmjjjjhgffefccddgegiezz{xutrtwwutuqr|zpqzzxxxwxzyxz~zw~|zzzyvv|z{}|~yw{~{~~}xot|yxt|~|{|up|}wptt~{nxxflwxs|qqrv{}~nluwoqvxpquppt~xsy|}z||~~{r}||vu|~uliuroakr`^gmqsquqstnofgu{x{z}~~x|~y}жȸ½Ͼȳɴ{wϿǩñžt~|~rv}wo}ytxyzap~vt{i}le{z{vsnqpqgtqxertyYOxugfl}{o{wwo~ebsr|t`smyxvhgltjluYlyb]uquzlw|{}n{a`Zl{sh`L=HI4.591''.I'!87'(&%%&%&&%&&&%%$$###"""! !"###$&&&&&''(()))++++,,,,,,+,,,,-...///012223529l}|u^gnvʿĖÿĵœ~|u{ěmru{{ypnsqiW_rzwbqwid^vnjqrlymum[gkgr`GQit_itZerlbn_dEUHVskfhhkhjipmZatmoh^bhk`imsgcl[drc`he[nnhiY^defVZSXil_Ocbh`ko_fsoj_`acohg|pqsuqpqpupnejppd[fk`h]`qfQ_efb^eftmlrrqnlilnijklnpsljhfkkhmkgiifijknmllpsssuwvtuvxzztojb\TTYY[]^]\^__^]]^]^]ae___\bcZY`dc^^aa_`aaa__bea`a`]]_^^]`e]\fdca^\Z[``]ZZYX`hhea`__[\Z^`\[^ba`^_bV_ga^^`dfZUWWVU_d^`cca^]Z[[WVTOOOTSTYSVWZcgilkkrmgtwnj{xhruqouywijienpeouipynejmjliguttqsqpooqtqrrqlosokinqspnilrqrspmopmklnllojnsrqnmnnotrsvmorpquy|}wmlnu|tnkoqtshrtsuoswvtpqxrnkflojkvxu{uppjjkm~|wuzxokjlnilxracpttvtqqqwwqloyyor|xuxxyzullxwsvy~zuqqtxrrwvvtyxsngkttpoqkwzkplkolmlolklnlqsqwuxmamruvutrmlkhookmgjjkrwsv|yy|rsust}zx|yyuz~zwytrrqrrkhhffddegkgefd}}xrrqrwvrstnowmnwuttvvvw~wvy}yt~{{yxvqs~zw~}{|xuvz}x{~{vt}~z|w{{y|z|kqt_g{ztwtnvnifpzz|rqzypnyuotvt}|txxvzx{|zm|z|~zzupzlmnbhlprltstxpmiiq|~|z}~y}{z~Ѹ½ǺҮŹļĶǾʯ̼ƾyrķĥ}v}vx~zpvr}{xpyp}`hxpzi{}yb}{nwjrqpkmyty}cno{}VU~sw}}vsuqfcZ{mmzw^klzxwo^ro{v{la_il\lswq~lkqwwz~ndE?X_a\]zz|lyq_jeoy^Zfncaonn]vqYOfche[[qpdilDFc\c`gxm|j|udplbVlTRbTB[nje_RZWNPWYSLQ]g`baaclmjmprvuppmvxfjz|tlhazitbgrt|^lnimxpyi]zRPx}pysx~|xjzo{jsb\lJ5CML43<=.*+8M$)K@))&%$%%&&%%$$$#$$###!""! ! !!"#$$$$&&&&&''(()))++++,,,,,++++-,-..///00011-/-0=raj^v}dXouȣĿżðȼŚvs{aixxxlkzrtkeipuftsceswdlkpovk|nTziiuYC_kxn^|}lQjmadeeSJNGbnecfhfbhpvlcuvjqe\ihqhhktgak_^sebdcXinhjZ]bcg\VOQgh\M_backn[hsng^^_aod`{lopuqln~|svlpnsprk`mk`hYdn^Racd_]beufqloznllipriknmmrndkifnniolefecechnljiosssvywutuwyzz{ypfZVZZ[]^]]]_a_^_`_`_cia`a\`d]Z`dc]_hf`aabcbceeecdd`^``b_`g`]hfdcb_]`cdb_\\hrzxngdb`]]\ad`[]ddec`aXcj]Z[\dh^XZYYZZ`abfggdcbaca_ZWSSYUW^_YYdnnlmmmtoirxqo}tjqxxrvvyggihjqihtkk{thnrlmijtvsqpkighkqonsohotnmjnswvsjnwtruplnqpllllknhmsrponnnowsuwjmrlmpuxxumjlrytojoxvkdqsqnmyzorwusomgfklggx|rw|sqjihft{pqzxpkjnrqpxwjetyz}xssq~{upr{ypwzvxxyzsggxxptxztontzpqyv{uzvomceuuonsn{{mqrqnlnnolkpsjlrqzvunfotvx{{vuvvrxvtusrtu||wy~z|twxxw}y}}x}{yzz{|qkjhgddfkohccc{}~tqrprsrqrtoq}vjluttsvusuzvvwzyrzywwurlo{|wv~}|{{zwuvz|}z|{wy~|z~ur|}}y}|qmo\cttwtuqkvnedqwsttv{tknz}rsxw~}wuuqoxwy{}ymyrvtwwvyyyyt}yz{wwrm}usqzx~ӴŵǶ±±ƶð{jʾɮðŨxutmomk{xxusnqk`wzvrrnt}mne~^mn}|lmxwls|eexw\Xjm}pn}qkmv[kPpfc{w[bgztxq\qoxq~{wrfsozgpwytunwxfD^m\f`qz|yyrxhsjp{wsoiXjpgIYcXj^WcmdaefCM`dcRcqiyb|oaphbdeOS^QRccdgWS\VKQ[UILW^_Z^\^[kfgmprssokioi^itunr{bbvkl_kstziYgmhi}ofv~z{xXejNTv{qi{nqvz{~ywnvtmz]rmZCQVV;=I8.35@L"2UE-+&%&&%&&%%$$$####""!"!!! !!""###$%&&&&''(()))+++++,,,,++,*,,,.--..../130[xufhiw{xgbmȇľȯʾȳô}śymvektz}wzj{rvntrl}xiwb`wl_scsuvh~mVervQJldw^tnQXck[a^bCKGSgeigfdbcr{{ltwnx_`smzqlmtjdfc[seb_`Tbjfj^Zc`cbTMLddWQ]bZekmWirkc\\^bkfZzfkfsphj{wsuitvunuobphbhWflXVb_^Z[^jr_vdmqpkfhrqlklmosgckfhrmjsogfeed_elmhhmrtsstsqqrrsuz~}re\ZZ\^][[Z[^___bbb`ejaab__a`]_cc[ajb_bbbccdedeeefcadefa`hc`gfccca^acda^_dryyytogc`^^_efa\_efng\_^hdXYZ\be\YZYZ\_]`ggffgghihihba`ac\_jk`boroqqontqmquqrwhhluxotqytcekkiqkcsoguvjktohegqwsplfdabgnsrrmfnsnnijqsuxmlvsmqnilpnefhfelafspnmjkkpxqttbismmhpvrsoiglssldmyqdfpkhimytksvtqonb]chhesri}tmaafalvkisqlhgkrqrvvpmw|~zrrr{yvpszvqzyuyvzxqki{zmrx~{qlouvprzyz|qinifoysmspz{ntuqpmnonkmtwklru}ytorvvyy~|}}~x~~~|{{~wzzy}ux{xw}z||x}~yuqolijotumgfh{zwpnpqrrsrqqqs{vkkpsttwtquwuvvyxrxwstrpmry}xuu||yy{zwuuwy|yz|z~xqsx~||wrq__qpxxn}pixqjnrspmox|nbnyw~|{yzvor{y~~{qwov~~~~}vj~zykhizÿſѳſǹ¸¶ŷſ|uдëzmnjp|ykrvprvqk|q]}_i~u|rqxmr~{xggzZah{~ikxurvazeXyspd\|z|n_|vvfosjiV}JeybUxtW`wrjsxmqvjiqu{z{|u{{|q~~|wy|~cQ{d_iprjo~zwh[]opXIc`\j[\me]\b`HQ^mbM^eexYwncmdbk]LQZVe]ZbbPX[TJT_NDPYZYYXZU^cdgjlnotmhknc[bjoiztabsnyh\portyZYbl^gud^ssmufLqcLaruflt}epuuw{zxqt{{o\moW`aaGOQ-5A:MC"6SG:/(*+(%%%$$$$$###""!!  !!"""##$%%&&&''(())))))*+*+*+**+,-+++,,----0/+jZhX_bY:PM^jjqdf_fszn{x{\n{q}tsuusmbf`qc_\_PYedfaWc_adPJJ^bUWZbZeijVerg`]X[dkkXyai`nneewrrqfu}slvsftddgWjiWZc]XQX\rjasainmf^fsrkinoopfelhkumksoihfge`fkjffmrttspnnmkkouwux~|qd][[\^[VSV\ZZ^aa`_ef_``_aa^\^b_Waf]^cddcddddefggedfggbdngcgdcccc_`fd^[bikpqsspfd`ehafha]`fhshX_`f^UWXW[^ZYYZ]^b[^ighhgiihhiiiijlojjsogltonrromrtpososm[dgoqjohnlbcklfljdpqgntjdnpedfjtqmjdb_`diqqrmchomohfnprsolpojllgilk`Yfabh^aonlmghinunpqbgqmpkntnookgiorh^mxmbgmigfltpnttspqpaV]gnjn~weo|shZ[b^fpfakniefmqrtxwsqv}{pprtwsnsuvrzzwxs|yonl|mnt|{ohoutpr}|z}}sflvmgvxlqpuyovysrnoonlouyqqt|}xvvyyzz}y|}z~}y}wx{xw~{|{yy}}zvupmqv{{uqnq}unmlnoooqqooptyvljlttrxrotstuuxwrtsnpnnorvxsru|ytw|wruyxz}}tx{}~v{xz}~~}|mdrv}{o}tl|zvyvtupmx~kevy|~~wz~||u~}rbt|sticf}ɻ¼˴ȼȴúüƲĶ~~|ǽɽеpymjkzsƱ~muetpoemogh}XinUur}ud~nwrw}uiumj|cX^v~cis}}{py`yzjVpwnip{wyxvyuXesz}i_ymbvXQ_ujQvsWfs`oa|{qcnzpxwvpst{{[isapw|xv}~rh|{i\dyuomSPibel`lp_\\`\TQ\r_NY]`sVqreibbjXHSWbkSWeYQYXTKZbFCUSUYWQXT^\`adhlpwnlqnbWZehgm^aqmog[roqj{xV[`jVgja^miakXR{\Oimqcqul`rros~i~|ns~ruucrvgigeQ\P.?JDQ9#;RKB2+01&$&%$$$#####""!!  !!""###$%%%%&''''())+++,+*((((')6,$(+-.033580>npN_tU]Xcxgkp†ɛǿʻŽָȴ{§~vbliozuz_uyqa_palu\y~vorhrcxulpkbNUk^cWbhP=TQhrvl`gfzzuuc}v|z{{x~s`kise_^]NTcdacWacciNHIVbT[X^\cgcUata]\VYfojXt_gZkmc_qnpmdprltulucfeXleW_a`ULYfxXekdemg^X`pnhikjlmggljnxnnqmjighgbhigdflpssplkkmlilquqnt|{of\W]^[TORXTT\_^]^dd\_a_ab[VY]XU``[^bccca`dffffeeddeeadqjbeedfgiedge_[dhcjmlnlcb`jg[ehb[ZadnbWbbc[UZXUXYY^^]]`aY_iefffeedcefhhjpokqskhnoinrrnlqrnmnmqdV`ejgfkeegeahidhieovigpm`dmfeebmpkga``_bdjlpmaahkndbinooklljeghdehh\U`^be[^kihlfhikqllpehposoouopsokkmtj^pvlgjlmmknrrrtursvqdX]krpluyhgvrcRT][epfagohagpqpv}wtsszymnoqtqkouuqv~|wvrxzmqt|mjoxzphouqlnwwtx|tei{tfptmoprxrwzwxrloooqw|vw{~zyz|||{z|z~z}}{yy{xy~{{{yy{|}zwvssx~yw}yoikonmllmonkpvyulikqqrvomtrrtsvyqqpkmllnrusppt{~xpuzurxzy|{quyz{yr~zy~z}zmw{u|v}}~yuzzsq~z{y}mZjyyv{qlo˼µ½ɯ¶͹¸Ϻŭ̫¹wmoĺū«|n~hvdmjȬɤyzs|fgwoubbifeiaWvsMao~|aljzo~uoiu`xhXYhwb`w||wltfz`ms}ypxvwyppsZYx~tfzveqjz`it`zy`lzZx_q|{uz`vw}oxm}wexlqutzxjnsv|y~Vc{yvjXWtinqgtl_Z^`Z[P[k_OR\^lWnxdcabgUGX[nbMWdPVWVSLb\;FTKZ\PN[WWZ[]bfltstwpnbSYfeklZ^pjefYmopc}j[Y`kZfehbib\_R\lWWimy`uy{^_vnmr{~{c{~dxztftt|oiabQaG?LRLP.*@PL?2,53$''&$"""#"!!!  "!"#$$##$$%%&&&&&')*+++*)('())'HV56;>ACGJLIGXbWNot\QSOfzkxqǦſͿɿ׿}}rbjz{y|~]py}y_c|{ess\y|yvxotpyj}e^Nqbn^YfcNLSTuyv_\nv{}ut}wbrqwlda]PVdhae\aifm\NMKbV^Z]_ag^T[t`Y^WTcsb[l_eWhib^jjkide}ofmyqr`ic[ke]`^eSL]rqNmgbgkb]S[lidgheiigjljpzooqkjjhiifkigchknsqnjhlonlklprpnrvund^][YVOMRQQX^\Z]cc]_a_bdZRUYRQ\YX[_cca[\dgeffeedbba]coh_befhjmkjigfegiaklglj]_`g_S_dbYRY[e^Xdbc[[aZW\[[`]\]^a^dheeccbc_]bdffjnfhtrifkkfmqnllklkkigm_V^ddcffeccfdhf`ehgipmafpb]efef[dqjf`^]\^_dhkla^beib\bfiniigfabc_ccb_Z[]`bZ]ffehdijknmnlkjqovuosprwwqlnzpersroopossrsuuuwqwricdlpqpnnmepp`NPZZeohfgpjeiqpjwxtvqv{|xlllorkgjoomszwstpr~mv}|pkosxtnpwvkguxrtvsecosmmnnlnltxyzzxknprvx}|{|~z{}|||xx~{{yxu|w}yzzywz{z~~|~~~}|{wwvv|{phglqokjkkkkjr{zulhlportnosqsuqvxppojkkmpssqnntz}{rmswqrz{z~~totx{~}yxt~{~~~x~zy|||u}x~|~vdp}ϻ¹϶­óľŴsk¸źǬxzjoegj~q|˽̶unw}qevmeWcebViwVelkReyhzpho}wrdx]um[]UhrZuzy~kw}dvyq~|{uoz}zoymkkd[szvuq{qrayv|yn|r}~ku~tyxpw|uqv~|mx{h\m~t{ykQzzulddnuriukbXcbX]T\caNM_aeWkyd^_abUI[hpUIV]N]TUOOgL6NLKcWGU_VZX[\bfnnixwmoaQah`i~pVZpi^f[emjazcaQemaahqdaZ[TMf]Y_jy\xrZ`vilqu{|sj|uazufrwif_VQZHQTQMJ-4EOH=3-:3%/+&$#!"" !!   !!!""##$$##$%%%&&&''&#"%+1*,07BJPW^Q_]PEDGLORYuput\\^~Z\itŠǼ¼ƻwtzx~rcixyz|w{x]mwzfcyiztb{{xuuvn|nrg^kub|d`j]XWTi|o^c}{~zfy{{vkf[[Xfugbhcnlqo_YF^Zc]^e_g\RZsaQ]YLav[\d]dUeeb_cegf_^wn^iyul`kc]kea`^aNR_rcTme\ibZYQZgdbbaafdflljownorklnhhlinhfdjklspligklklmkkmsrilqolh_YWTNGLPPVZYY]bc]^a_be^YWTRUYWW[_abaY[eebfedfba`\]elc[cgghilknpkkkmlakmeji^_[a_PVbcWQWWa]Zdcb\_d]\ba_c`[[_ecegfebccc^\aeedkmbettifihempmlmkjhhifg_\b_\bdadeaehgf]^deckna\gd[\`ce\]hhf_][XY\]afg`^abed\]Zhqic^ea__W\b`_YYYca[[_dfdbhilnmlmmmrpv{qrrsw|yqs|umtv}yspqvuvvxxuxrwzklllnqrllklllaOQ\Xeojlhqnllprhr~uuwopuywjiilofaaehintonroonv|russwyusx|vnvwwupoh^cmomjlijhpxz{{tqrtyz||{{zxv~~z{vqw|}xvwxu}v~tsttrw{~rz~yy~}~~urx{v||jikpqmkiikljitzxsjhkporqlpqotvosxmmnjjloqrqollrxzvmkrtns{y|znmsy{z{ywxu~~|~}|~||zz}zut}{|~z}y}¸ĺ÷ʧĻȴĮ³̲«ǿ¼ɮ|sgi|y|o{z}İ˳|z|{tjqmslR\e_TYxbTgp]Vo{tnsuvzvh{^ur~r[ZM\yfmvtxyersuû~{lry{iuyqfdqgpzpyrl~mx{y~z{rx~|v~lgvnXUht{}xdVq|pnls|szmmvueWkeX_\ZY^MMah]\ixb]\_]WMYueMGXRU\MPJX`<>UCXfMJa\XXUX[agnbbxnlpc`hi[bstUUlj[ecake^w^eRgl__kud\OZLHpW`fkdrm\ftblrw|ze~tygnflnda_LTOSRQJE>7.! ! !!! !!!!!"$%&,1;<=DILPONMKHIHHIMOSUURNKOUcrtm^S_cgii]|w||Ƹ˽Ĺįѿj}uyv~iuv|°~zmagxygsmoex|~t|wq{q}xvuzjx}~~}{jrsutmrfkiM]kpKHWDKw_XSR^YScY`X[[VW^ja^mqkkdg`afjfL^P[Yhk^fdZ[fWf[YYTUW_YX^W^sn^\]eqmjkmelppwklpoehssmdcijghqpeeppjllknrofabYIKRV\ZTSZcdaejdhppqkefjc]bga`effddc^a`_hccd]]gka]bhhg]hqielc\ehbbfafjfffeidgpmhgghhjmooonnnkghiilmfb``cgc]fb^dhi\Zjk^_ecbgkd_eb]hnjfmlejimqgcgigXXjeW]^V\_UZPJ_WWb^UQYUJETifXOUc]TRRT]X[eZ\a[ab]ZY[WS_gYPbb^RScdda^ZUfqbixqiqurvlillgesslvwsxrqyz|znr~wuqqwrsxvskotqwzvrsrsuvutuqiqnhgfizsfrhllmmifbqvsz|vxy}xoxthj^][]_]fmhfmqoqy~{vx~~|z{utz{}z}|}}}|}~wvuyy{xyvupqxwopyuhnvlumqqkhe`cdp}jbrqmqvposxpcx}r|~{twjvxohhihghfcirqnidbijjliktjj~yisuffhhjmnoooljhlqod_irswxpvwqqih{qlx}x}|qov{z~|~{}}wow~wtqy{qt{yxz~wvy|tt{zvx|{t~zwx|~~tp|~~~xx~x{~ty||tv|uvy}|pm}}}~þòûyԽƧx}|nŷ~}ϸȢ{xxy}ijn{_kufWHYcSEicUVphdpjywvhuvjipaRjldedtuk^UWKTbjx{gWm~eq{l~|q{}|}y}~y}{wzzq}|s}uy}ovlX[]Zhkk~qzvqZfmgojknnorxpqtqpbXh[ajaQCV]YddRgei\PTIY`S_qG=NHWd@CDMOBEDDDFJEEMY\ZY\aj|rWJIIHHIIJJLQUROUc~~mgkuw`]`ele[RI[olgmToҽƸШƳ{|rw|~zhfqphiox^`{}}vwv{~{wzv`dp}\I[VDnk^HFTYRbW\PRYOS\b\]_nf]aa^jcr^U_KV^kkbcWWhffd_ZT^YX]W][QcvhTQTdrfaedcilprkptojptsofhmjfktnbhsnkolkijuyqlib^^aededbdddfjggrutspnmkihfbgjlqnghgeklhhghknoneflje^]cjd]d[SX^^a]Wakgchjnnjoopngiklmqxtqpqmghkmtvolknpqniuokurropyqbec^a_\WZ`X[baigacbeelpfimlf]OO]ZPQMIPGIUGLYNUXTMLVK>BXc_PKYZVTRT_]blb`ecimrmclqlmpkflwsbajihijjkmwyxoq}yssqsjgtxtx}zsktxnr|vkkwxuxslelqotqidjoeoyssnuxnt{xlnvqjltquon][dgjphfsvtx{|xz}txrpniimopltyxy}tkty~wvx|uw{|{|{xy}|zzyxw{~{npzq|r{vusiisi^n||qeeqjlkjgc_[XY\mn^brldnthjl~uf|w}zwxyvv{umgefggd``kqnhedbbbggfpqdpmdumadhikllnpnjghmng_dopuwjkunjlb\jzoadx|ktsh{tspjvxxto}~mfnpruqnoqtty{|zx}yym{t{|rrn~vqwyz{mdfjuyyxw{g\mxpiok]l|omtyusstqpwvvrqxxofowogeju}|xttz~}{yźqʶn|oûȤxngky^tovf|eQMepYH]rmfQUv[tf~~~~xq}g_kla`^M[\Z]QmxfttQLW_pdgxeipyo{|}v|xzytuppuw|tjrt|ovx{{uqkkg_wi\tsunQ]twm^fopobXh|hdmndd\XXS`dYWFWceY`gg]qUBTQXbTkiAB@@eJC>DNBCXVOIW\RegNJ`]WTSRYgigedeid`ffhhimfkomjtcpjfqrid^dg|pjb[vvyzzhwtinmoc~itnq}nvk\_ae`KQdNONLJIGFDBDHLMKJGFDACP\`]\_`_b\SQQJIHFEFGJOWZ]evsry}cSXY[]XP[pdqpNƻżӹ˽ɺ̛ʶytwy}s{khpkadmvbe}~x|p|~}}~|xnlzcNddGhkdHBPWQ[VVKPWOQX^Y[YjbW]_\ier_bXIYfmcZ\Y^kgd_\WX`Z[\V^YPjwaONTfrh`d`^cglnjnrompsqoklnmimsk`hsnorklkcisvsnjdabefecbccedhfdnrrqommljjkgikluqilkiqpijjilpoldkshb[\_d_Z`XQTYZ]ZT`pl`emmkglnomjjkklqwspoomjkkmtvrqqyzutpwvtyvvww{uhnk`daXS[\Q[b]fd]aacckmairng`PHRVOOJDLJDTPGVQUWUOMXSGCTbbTN[```U^legrkilgmrwvlpv|}zxur|liolkllntrx~ztpx~xstvuskpsuxxuplsujpxoijqqlu{tdhqmtrjcfqcdxuojt|mpv|}xpmspjhpmrsn_[clquqouwtx}|uw{quwvyxwxxwr|||ukquzxv}q}wxx||yxy{yurw}|vtwu~}repwztnywtpfbni^i{ynb`ljiihd_ZWRTZjyg[hphaoxoijrul{~|}zwvqjgffeca_bjmjecc`_^dfjpoathdpf_bfilllnpnjgimle_gppqohlqnleYYnyiaftuk~htuj||ot{tx}qozsbfpnnlkjhmqruvwvuz~|~~~urxqvz||utr}xuy~y||jbgjrxxqnsxdThxqflfVitgoomlnopoospnkqvshantia`gku|xrsy}}{~{zzƸǚmw~{ƽǸsp}~sqph]kzyw[t|uqzssmdNPquTEVhsaJcemrio{ivjVajc^SM_YXZMhxuubCY]nwlvzz}}vnv|{ns~ppzn{gp~upykhopxzl|~r{y{uoonr|`dzZVquws]LcqpgZksqgYQspZbicbcU`a[]]i]JXj\R^gdWrM@VTU`TkfB>:NdDL7IN>OXNHMVQ^mMHaaUNLLRbkefcbdcc_dgedililplnvpstn}rc^`jjzqllgvp|yuymwxzp[nk\rXUgQQOMMMLLLKDA@>>??A?9?HIOZdj`RLIKMIDKRX[ewqtyk\aeZf__\Pyzl½ɿȾƱĖĨtr}|}zssmgsm[diwir{|zyyw|wvm|y{|z|w~{}}~~~xyqmVhrNejkM>KSSTWTILSOPVWUYUe]XU_[fhnngKQ[gl\XW[fji`]XV^`\^YUaUPnrXKJRepg_a[\`cgiikmlmoqpooopplnri`iqkoqlomeehpuuphb`dbcdaccd`bc_gpromjknkkmhmpnwsjmlksqknljlomjditjd\Y]c\W\WQRWX\\T^mrefkklehjllfgjghpwromnmkjjltwrrs~xzux|zzwx}z|yktuglhYVa\O[c\ccX_b`^ef`grnlhUOVTOONKLROZ_RXX\bZTX]\\NQaeZSbkjiadwqjutqsmouywvux{~zy}vv}sowrmopowtt~{~{urv{wqsuszmkosstqnprplpuolknnhn{}kgmlsrkg]pi]pvohnxoqqtyyrlrolinknupjebnyvvy|}yy~vtxrt|{}w~|~wmqu|t}z{pxzxxszy|srostsop{~sptwst}_di|uinytpgZdi_d{uka\fmhdhc\URNOUhveZkmhaoqomns|s}|ytoighhda_^dijgdbc`\Z]eope^x}dem_\aekmklnooliknkfdjppmjimlmh]R^vxdalljttj}jptwwq|yssrg`krkjjggfjoqrstsssvyxx{pzuntwx|xxu{}zy{~x~lgmlpwxmorvgVmxqgj]Sjngpiedikmmnmhjhqunc_nmd]\^ap|xqy}v{|vu~|{y¹¿Dzxn|ŵ¼¹oιw{vjpobYpjzdanzdbtolpcLVsH5;^UMH5QGAUVIINOXiWA[b`NFFK_njcfcaa]b_bhc`kiklkkpusuxwtgdjoq|xsztr~z}{{zy`brS~icoSPLDDDEIKJGB=;98776468=HU\XNDFGQWSS[clqjdl|}n^YX[^fofrcUnZT}òȼů˳º¦ȷyquz~||}utqnftmfggztppozp~nxxowok|suzx{zvxut|~s}|w}|{}~}xztxajzYghpY@KQSRWTGJONPUQRXS_XXO\ZdjludKW]hi\]T]egf]\VUb`]bTUiSOqjPJFPeog^`X[^`ddjikknopqorrqsnorf`jolppmpokffkouvogbc`bdaccd]^a[alrmjghmklljqtowuknmmsrnqnjkpliddomf]VZbZTXUPOTV[]V[fqifjkmhhfijdfihiltsnknniijipwurr{}{w~|x|}}}stzvvrd[hiRYd]__W]c]\_\^htonn]]aYUWZWYcbhmeedhmfchhcnh[`j`Yhssvpew}srvwwsqw{vwxz{{yy}ytxytuztqoqutqwz}xvsuzvortp|wimrnpokqqlmprpnjgknjqwikkrtmiW_o_gwofjtrqnqvuqlrnnjllnpqsqmswwz~{vrvssyz}z}ymru}qy~t}}uosxvwsxy|zuyqmhjrqnlqztinxxn|{w{gYapwmcrtphX\f_^xsi_V]kh`ebXQOLMQcqe^lidfsmprsu|}~vplgfgfb_]]dihe`_a^ZX\frm_f{pbcec[`cmjekllmmnonigijonhdklkk_WTdyp^cridzykunkzm{}ur{yvvrjamwkkiddgjnopooprqquv|}~{ttplwxtwzv||~|{z|~yvmrqswyonotrXmuudo^Sgpksfchjkmlmjejcpukb`mja[[ZZn}wq|xsxytu~|žÿȬvÛ̾Ŀzsβ}r~wpprgVbv~pizqZuncpeenjjm]TfufI;QiUEbxougvbeqmonSRhg]LPs`UUTfkdg{qx~îxono}¢}|lzo~naktaodr|vm~sbgklsmgxvmpshtodhiopcTokFUoq}rn`IW`edO[urhSPjfXXXYY^Q`oOSc{iIMSkQTllccw?BV][N_gY71G`FV>=R>HVQFHMR^_IR\fVBCM]pneada__\a_bbacikjjikrtuxsv}{sqvux~v~|{PrjS}rvfVPJ=768789522225897569;;:=<;>GRRY]]_fku|qx`mikvhfec[_\YVVU[eY`cfYzO^~ýòɮ§¤ļյ̻ʷwvz|x{kunqmjxrnjgyq{|winshziuli~vkjzxymplyytsqkpy~t}n|wt{zz|z}~yxywyep~ekkofHQQRSUSGHNMPSLOVS\PXIVZbjjuaMX]gfdd[_bcd\ZSVca_`Q\kNQrbKFEQdnf_]UY]_`agfgilnmootrruoorgajsssonrpmhghksxsnmg^`c^abcY[aVYdolfegmhlknyuoxvkllmqrqrnklmkhdajkh_W[bZUXVTQVY]^[]cnjhiiljjehkadhhfjstpikoggidmwrpo|~x|x{~{u|ypdk{`Wd`^]X]c^\[Xahnonobgklf`mjlssxuvrmntvsqpnuyofkohoyw~ykt~wuxyvry}xxzz{{yz}{tvyvt|vulqvuqtx{vvtu{vprtny}kjqmpplqpmnprpomfkqikz~lijqrmm^Sqaevqhgqqrnpttolqnnlllmnuw|w~y}zxussxwx}~psvvu~vtor~~zvu}vu|qrsieiwvnnnvpcip}lk|twn\TevoedqqhXQ[][mqi^UVfkW^`UPLJMThimorlblwkrx|~{rmgefgc^\[]cfd`Z\\\XW^krd^o|faa_]\^cnhcjllknpooifjklicekijjYRXivg\hndn|nj~xew}tszssyz{{zunhfqunlgabjklnokjmrrnstyzuvuur{plvvrt|yw}|{}}}~~{w{{{xvsqosyfvtym~jbssuvofuspompjiopqtkdfjg^Y]\\p}xurqqssy~½¼ơ|~ȾķƿĿz~¹vvzzr{m\Sas|merl_Z\sb^ibcc]Xho^D?Z[DJhvtdgrfewprpOLlk`SV}iWRc~kt}~ópklr{æ|vpwulvaZenZze`t|wn|q^giiledmiitigma^ddkgWVp]AYmo}vfgXMX_eTHkxl^IZfOPQORXXTt^QYx}TIFakRpq_kqk7HZcQS[eA1A\TLR5GK?Pbqo^\`a``^^``bjcdnjeflmntypw}|zz{h\~v_fpu]S\^I6+-/./32258999;<=;;96139>BIGFKU^cejsvouc]eajg]_g[TfkbXZZ\li`XojzkDZɫǴװ·Űzuz|bvitquypum{u{|wl`tmbonq^c{tnjssohieutqoedkszvotuwly|mnyvvxw}wvr}xuyzluusqkpV`TQTXSJFPLNQKJUXXHTEPW`cjqZRW_gfonda[Zc]SN\c`c\NhfGZoYF@FUfoc_ZRV\\V\cbdfiijjnursvqopjemryunosonjihinqqqqlbba[`bbVS[US^oibaeielko~vtvijlnortqllmkiecafigb\^b^\]\\[_aabddeighmghkqjhk``dfdentrfdlecd^futonz~wy}y~|ryref`baW^f^\XUehiokmhjqsnjwwx~~yysry|~{vx~yqoswy~}{{}yx|yvy|wzz}{z||{wtvxv}x|uszxrstywvuuywqqqqt}tjpqrrpprqrrvrrtkqvieqtkiopnrhWneftsjgpptoqrqonprnnoqqr{z||}uuyuwwx{z{}tu{}}u|wx|{vujioysrwz}racjwwfpxuoeQ[rnd^mti\NUZZhlg_US^i_YWPQMJO^sou|~ukp|x|lhccff_ZYY\cd`\WWYYVU_praatt``_[Y\_elebfilklnnlhgjjjfcgjgkjWR\ko_\jebtugqyil{otqnpw{yz}wpjdhstold^bmmjlnffjrsoprvxrnloxrq{rltsqpy~}~zx~~}w~|~~}~~zy{yxy|v{~y{uxy{qy{qsssuyyvtjklfgb_hefx}yztlnkpq}Ǵ¼ƻ¬Ƶęv{wvty|Ɯ~oxw|n|~~|dVRjs|sjr`d{T^nilg]^[U_kdOAO]KH>EXAABVLITLLbZK^hmo]VZ[^cfc_UXnnWaidX]ngirtqv|{yʪ|~yy~kt{zsxpskw^Oh\ZSLIHD=00004333576239:AGEFKNST[b_QIHNOGL`gZQWRjokhtspjUU^fnktsgIJžǨûϾƿ–ī{~|}s~|vhury|y~z}tq|lfkxj\V{lRaqvyhQcusnghgbga]kqh_S^jmxwvterblsqciqmlnnmotajw|sip}{stsv{nnpixj\]fbcTYTOPLQUgQCSIOPTSi]GLVlupiadY\k_OGWe__aYejJEfaL=8K\ia^^JLTZWKT\\^`baafospsusnqsfmy}tmqsrttmjosnekutttiY[ec`ZTWVWkk^ae`ftmyt{xlnqply{pnpqnlbdgpjggfdedegfe`ckggdcga[^lmbcopiga\Y^b_ftsd]eb[[SXlrqttunx|~x{z~tuplgbgkc]\Zkqejhn|vuvvt{xx~xvpw{zzwuwtx~}}yy~~zz~yuv}||~}|{uwwv~}uvruz}x{trvtrqrrsvsuwrt|}}zz}|kjfo{}snortywppoqu|pnoruqvrqtuuqwvwww~~|{~z{~uuzt~~}xnvz{wy{}yprwu|szpsi`inneempd[ZSSaffbUS]kt^UTT[\`z}}xlddmi`YUVZ]b`[XSSSSPWjymanvaU]ZTT]chg^``djfgifdffggfeefdeni[]bhh[ab`klepslx{`^rmgotrs{xnhh_dyykijiinoknnebhqvsopppnliflwqmwvqpnlox|z~{sz~wt{}}yts~|{~~|vz{wtp~zrz|x|}|yç̽o|pyrkqp~ǿŧtslgh{gppXPiq}~wtvt[bxk[ZRXaVHGaWHIe~s{ldxy|w}{{g}psr|gu~l~~~p|z{osw~{yyyutflfzjSNZfSh`gwwznci_j\\[T\YY]YWTDFRXmiIFaP?Qb_`^TWZURVK@Qh\bfSE?@?OXQTqyZaZhoNFPgnSWp_Vxt^FLlbXGIP8JaVQm`8IK:DW??LU@JMIY_[ecbjdZTR]bgg`WUlnV\eiYRfidrrlt~{~{y}rzsylzx|xws|Ym|w\\\IONUG>:776695298777;>=TL5LYA@UJ?IJT^`l`T\iaXPZbchbXXfiNPlj^Q`h`oofryxxz|~{u}{npw{y~t{~prmoWHW`YOJD@=<===>A?>>==@>>CFGHSbqufYX`[nwY\n|xwr[`ckxnh¶—Ǹ®yx{|{|vxqx}t~~wrt~~qx|rx}{vzwhgut^btbW]v`YTx{zLZkkicSdjum^_eZ_UUglTPS]agzvbvg\ilg[fndcccfigYjnoegu|vmkoipvinqdknacipicmeV[]cUl\RSQQHUX[VRX\bc_ZaaaiaTWen`^c^eiSGYiXC6>TdbVYTAP`\MLWXX[\YX]ehhqtoopuxgm{{klttvxtmt|wjbq{wvwoejpkokZ^f`lncd_cpqw{vv{~wszwnvvqwux~wkuzxhqujkqliikbX^ca\^_XTOWe\gpnndede`^dlwoddib[e^`ooqvqy}pbnnyxrvxqqjptnllgipiprr|ulozsopw}xsxzysxzropv~z|~upzyoovwv~w|~~}~py|vttsvvzxqxqk|yu{uu~q{o~xzvry}yuu{x~woqrzpvz{}|z{w~z{zw|~|{{~|}t~{{m{vu~{u|{|}}tzoqu{~{y||~{y}nizmoifbcb`f\Xdu{sabXcuq{~y}w}kkqla[VVYYXXSPNONMILg|q\fviTYYTTU_jh[Ybachhf_bbdggebaeiikpibbbcda\^hgbiknseQXfddlqsvpffja]pxjagklomkigfadmvqgmvnimkhffmvpktpoohdjuulxypv}jm{~xvywrstv|~ywvyvtjo}w{{}||wz|~x¿djrwej}sļƵDz|v}Ŏwx}~mg`zxju~hjXet{|yjazgaa\X_Xgpsi}y}z`xyw}zzxmmqlzzu~wyns{~rvu~qumkpp|vxzufqppkepeMFThQ_bhwy|gVcjl[Y\TMSOIQVLA;ERo[?JR@BZQKQVXWXSOKAEUOPjV:EC@IG=Qvs`\_ch]\llZVigakoemcspbdUHFCR]\WncRNXF7]UDA\EBKUWYj_NOde]PUfbgaVYciQLigcQZf_gmahrszwprsz|xq}zy}}~{zfs||zou|xepd\TMIGFEDBB=?IOJJKOOMJGFEB@CPbhda]fiZS{}xr|pcdirznkʿ~µŰtz}xtqzyy{nx{{u~}vvuzvw~z~{rqysstsmtwfankY`{p^S\u[]Yxn|OVgj^_U`fxiU[dW\PUfdHNVZZjxt`wd`gg^Wfla`[bafbXlgjbhrtohikfqljsqchk`]krgbnoaaagajf\SWXH]]\ZXZ_cia^jjb^bcenibdddncSVgiXA;L[d^VWKFYaVISZUUXZXX\ddfuvjlsvvekxxijqrtssoyugdv{wwyqkssqvn^gi_lnhf^hoo{xsuy~uvyupvuuvz}yr~~uluxqrupmlokZW`_[_YTXRXhat|osmgfpmchs{nhpnfcnhjxopzlzuvtn[glq~pt|z{zrvprtqrnigmmuwoqphqsjowzv|}zw|zslt~~|wz~~|z}tkr|yokqvv~{xzzruzxptupvyzsutow}{~y}qzxup{y||jkq~uy|}tyyzyv}|vt|}{o||x|y}{|~~u}|x}to}ts~~}~w{zxy{lzxtsopl`kc^jyymqi`~}~zywyyxkqtj[WUX[XTTQKKONLFQq|k\hqaSZVTTV`jaTX_]che_]abedde_`fkknoifdbcca^bebdfhjaRO]fcekssldacbakuj^agillcehba`fsrej{vhholgghmsolsnonebisrdwxvuwjo~~xvwvstwxyzyvsvwp~kk~{~~xz~z{zyz|~~y{v»|}{`hnnhkǩûľv}v|wzѽyysoyhhi{smmu]c{z|{}pr|vfXfy~zzz`puqzwzvniqmy|~tqzs}x{oruxy|mus|ksmijr~uytyw}dpprkaleJARhR]~cfwy}`Pajh\Z_THQLDPUL@9?RlWBFI>DWJBPWUVXRSKBIQFZjDAEECCBCGMOPTRPQUZUNGIPSTP^cUNtupslfhtyns–|}ɵv|w}wvon{umnvyyu~~{wv~{vxvxomx|~uvsrniptqomimud^heU`wkaQ]vTc]smxQSdf[\VZdvdOUeXXMUf^BNVXRmvp^ubbdcYUfh\\Y_[g\Vkeg_jkmkchiepxgjzqdjiaYkqfakrgdegjiieT[`PfcbaZaloogfql[Zmqmgchifjrg\`on\CIZbf]YZJN[`SJVYTSVYWY[dccswihtvtfkvwggklqqpkzqghz{wwzsqysv~sekdZjpoi^fms{sruy}wzzsuuvtvyzx~yspqyurwvtopvdT^c[a_X\Y^oi{v{yjgyzjlv}vq}wikuqusozlmmx}xkiZ`jj~mrx|utsw|zrtuqlfkpz}lmqkvxms}x~{z}pn~x|xw{puwooxvpmmvx~vxu}trwynuxlzuywqvu{|x~xvpzvxkgl{~vvzs||~|~{w~ut~{t~{y|{j{zpx~wiw|v~qszx}xy~x~{vwjtqinzx}h|~}~yv~vu}vlstiWUTW^UPQQIIPLJJX}wc]klWRXVSTYdh[TZZZch`X]aada_`^`hjknnihfccdbbbeeedeaRJQaf`dmqka\_^^ksf_dfdgh`^fe^]`iqg^ungmnlghilqmkqnmmc_dorpty{v{|mn{ywvutswyxxxtpuxpsnrs{y~{{{{xzz{}}}z~z~vx~{u~`ihikr˲÷t}vzryȶzx{quul`nzkxqo~yaeux}s}o`mu{}^k~vnwu}zurnurmvv{nsvo}z~~{~xvoz~qouszktpzgrkicszt}yorzyenpsk_cdFAUjT_vdeusy^N`fa\]`TFNI@MSK?7SWORVZYA@KCDhY7AB;:BKamk`VYjrjqocevn[begrxu]bpmVMJTY`dhhWTUR=c\MAOaCITNRWRX]ZXWW[a]aWPZ]YS^dWSV\[UaaWeljmqglnvxqxrizƥwupwyrgz~t}rxu}z~}}qnVbVMC;@EGHIB>AMKORRPMKQ\dfigafjgcSSp~txyrlmyzq}wyxеt~~{wnzvdty{zzrtltw{zs}}t}zyzp||xsr~kqp|yjimv}|nkzyohecfrnljecpd\_bRbucaQYvNc_lnqQSb^]ZTR`pbROc`TNWbTEOVXLrug^qbbcaTVe`WZXXTdXXfe`]hdjbafcdmpam{kdjieZjneberhbgehjddV\`^qhfh[dpwsnnpk[dttmcglmnnuoddux]LZeig\_^QT_`RS]YUTXYX\[db`qwmetzokmsuecffinjl|lejxxwxypv~qvufkbXimni\hqu{qruu~{xtxrtstvzz~yspoxtrvvurr{u^_kbbiddeaot||jf{ppw}xmsuu~yqzpdrtwuie]]hinot|ws|v~x{pvzukjhszwulnqzvy~vq{x}{vyru~zxsyytpo}x~yxvxu~wvv}wyor{v|xwsw~~zxwswut{js}uzr}{~x~}y~wz}tu~|{}~}nizrw~znrs}rmx{|y{{~yvz}u|z|||z{}yu~vsv{krseSTTW\OKOMHKPIELfnY_m^NSVPOU_hbXWZWZcdXT_a_`^\[\aikjmolkheeeddaddba]UKJUfd^fpl^WWZ^hqj^]egfhc]bc]^^cki_c}}kllgkiikmoljomijd_foqotz~y}{ks|zwvtssuvuwxrlt{rozqsnytzyyv}uy||{z{z}z{x{vwwxux{vuxpz~zljbeoyĿ|yq~yzu{t{pxvUpp|lxvrgzhcvv~}pyou}qq{|whg~xjr}u~xvurqtotx|j~r}w}xyrnxnzvz}{{zwv~yutnz|oknpyhsm|jqiidutnxujoxyaipuj_^]AE[lXclfenot]L^b][]bTAIE:HSKA59SbQFF:APT@EZQHKShR6@I9PTbd[Rayule\^jb[bbenvuwf\nzjSGF^VfgedLTYSQdRQC]WDPNKSIPXXPTVY]\YUUSe^SSaSKO^XJWdXXifdfmemqyujynf}ĵ|rz|~k_~u~{iskuvwwy{i_d`I:=DNTVU[_eeab[ZZQEFINX`iwymdZ\szmw{|ss}|lq}|Ƕ{ƚźѬq~uoj}keyuvyww~|nouxyuqyzm|}~v}zvkx}y}}rqjl~whihlziefjtyiajqpd^\\iijeZace\W`Vet]]VTxPY_ehkNX`VX[PLYf^TKZfVLY^GGJVUNvzq`]ka`cZQXbXQXZOS`VY``X[aaf]_a]aihYtv`hhkl^ijge`mg`gbilc_Y[_ayijhcjnqompqj`msqhbmrsxurnin{qZ[kpog`fe[`i_Wcf^\Y^Y\_Yeafwuol{{jmnqtd^_`chbfzte_gttvyvq{wlu}tii[Wiqld]jvvyqtut}yu}pssswyw~}z|ocorottsssx{tmstimtoonkwz}qjz~wuu}v~xuuvqeqqqpkh]Zjmplpuryzv|~ux|kmpy{vynnv}y|z{~{z{{z}~~z~tryx~wrv{z{x~~us{z|xyzzu~yu{stxyz}{tx}z}|s{}uyx~{~yx|wy~~|wdzw||zzxyvpv|{w|{}~{}xwtx{{xytzzlqrbQRVXXLJMKIKMFBQsxaPahSMRQMOXbi\WXYVZd_RW`\]_\ZXZahijmnlljgeeeeabca]TMHN^f^`mk]SQRZenla\_dhgf`cdYY_]gjb_kyplkcdjlmmmmkimlfjgaionlt}{ykvy{xvsrrttruxon{~xwsxjozpzxyty}~xz~u}~zwtt~zu~sqorx}ws{}nzorwwoõð}}vu~otlryyxtm[irµ{}ue||ytr}vxq{}xu}|enrwzt||nvm~uem~cm|y{~}yvpgyxxwtvi{lp{|wvxyumxtt~}wk|ssxw{ozwru|xpo|wzgtox~~z|xxwuoy|qqui{{qmgq~{xgqiyo|ofjetpjsnfjqx_hpwj_]V=Lal]jfhbkmo]I[^XX\bWAEA5CSMB15U`KGG>IWS[Y98@B=H\U]YUl~jSOZYXZilcplksk[e|y^N8P]\jecXEUa\^\RTPbQKRGMJFOQVNPYY[VOVTYhVMVUFI[YMM_`Y`cb\jejlwquv^m\z}}|rztns]}tx|s~rnyuftvmrzv{{{f~lNIHFKZ`^ZYXZTXRPNMLGGGFC>Zj8-CA@]G49AAEX\WVXkzrviPH[WSTSbo`msO7KcNb}vtkzfajU]prYQ9LkcfcRZHE]nV\KK]\WRaSUODNPZRBDK_VIQK]`ZaiTQ_cjrn]`f{cbdOUrZYXHChq\]K[O@Qt\T_?YYKSZo^^F4__^MERNM_X\XqS>TGN`TZWWXWVZVZY[_i_kqnf]h~{}zs{pi{s~skn`~z|{pey}yvlgvtuspflt{wnsqqty{ohrg^ft_fRV[][YX]bmw{vphlqld[KKT]l~lg\DXr|VWy}{uv~muПrǴ{˫ȿet~~vptvx~ootwqjrsvzv}sz_yZiTQrnyf_^LOWmgfe^^_YX^[[]ZPPTX[`]Y][[SdgdZQ`b__VRQNNUMFRI:ABB@;IMJXMOPcNFFTefROVLN\bTMJi]IIQYYSVWKNbLUSR`ZWOQZ\`c]Y[``[\`aqeWXY_ea^[X[U]eb]qj^^jjgjgnqf]`pscejfrxsvnrqgemojkilkowvsosyxwwsmkrqouyzomsqmkmorrondejhsoSQiqmilmjo|~xvunmvxxxxusqv~z}y~ut~twyttw~~}zxyyvvrtqqvjyquz}tyzsztvsq{{~vsuzyz{{|xmdwzvlqtsnozz|trzlnuxojrwvwx{vy{~}{{{|zz}||}~}~{~~z}}xt{{lq}wfjxw~|t~{{}||}~~~|zs~jli[b^XSJ@BKRMBASfnbLXgQMMJHHT^VPQTQJM`]PWYMLUULFKS\[Y]bhomhdcegfbhxqaedVW_]_e^WXYZcnk]X^`^]\fdRUc^^piSSSXrq]_`^beca_^adc[^mb^geecdcmpgeb`pyuldxq\alaW`ic_cluyzlx~oxyvwv}ozw|||{|{svu}{w~vx}rtxvxqrodbiw{~|}{}~}p|xz}wzy{~~~{zwwvwl}{|uwokvsyzbfwjjc|hyǰ{}Xoin~_Zu}wvl~_hr|~t~yvƱw{qxr~|~|~|pnztsxqzhclemeepnc}y{}|ynos~~l}gvm~wxqb~qe]|nw^__dc\liRq_cp}tmw_xzmlaWWfpesghyd~~RXwc]fizus[\wtwmtrzrouwupwxmrW^uqyrYobWptehZfjdeoTO_`[vdrid\g]owX__OWjeYZrb\iaq`hhWU^klNHFAIQNSE:D@PLZX=FZ_NMOWW\_^b^c_`r_WP[swXdYNcwQ_WJNsbYPN[EB^oOd]H_PMYbtYZC9gcWTQPKTcUZchDAWG\Z]\ZWWVSYT_X[]hdjojeon|}usu~b}y}y{kifv}Sewzzilvtsc`j{}skoopi|~p~zstxr||u{GDOW^[PFFNWdY[PHKPQNNJGO\f[VH>yz^;@^zx{p||nuɸ|k}yyx||lozvo~w{s~_|r\iSUmmv|j[cSJRhahe[\i_P`]ZfaRQGJV[hZW_TTah^fW\_X^VQONQJMMRH8BF8Omsqwxo~s{wż{w}{zgv{~}x||k}v[bU^jkzti__[IUf\fdZWghLb_WedTSM>NSccQ`TRWk]g^\^Z\WQMMRFIRRK8AO=>H?VLRPONbZHCXgXUSPPKQ^[INnYQMNY[]WWGadQYRR[_ULQX]\[YY_[a\I`dphRVX\h_`XYVRZac_jcYYZ]kf\gc]RRejba[_rlntinmccjjg`bkhmysplo{zwytllonp{|oinlijknllrtrowwjegnzvgjlio{zw|vlpzywyzttts}zwxt{wkpxfixw|woxqp{|}~}{z~{z}yvwy|vx|zp}uloq{wsvu|xsyzvtrpmc_w{qqbbmqjes}xstoztsxv}qwtw}mhrrrkl~ruryzr{{~}~}yxzwy}yzqp{|wq||{{~{}~{~wyv|~~vw}{zzwyysy{}wy|v{~wxz~}svwzyx|qls~y}~}yx}~}zxvmkf_]ZVSJBS_REAMYdeLVj[KJIFFT\QHOMMKNa_OSVKKSRJEFOUUQTZchgdabdcbacnvplp_SZd_bia]eghlhYWZ[]_ci]N\e^aj^OMN]qiXY\\^^\]_abbcaZ[fcVbaaabaafd\]dnqj]]wrYVb[KXbYRZfnlnjfwvtzsmmyykosrtyxxu~ysyzwx{ttxx||~}~~vihqslktz}}||pqtvtqmnifuz~qx{|s}{osxvs~zmzuu}q}óypijYsy}xxx|}|uyz~fipptdsj[jggnx}}s{v~r~xix}}yjzqo}l]w~kVXymmlOZk_kd]dUnforwosjdpgt{]KUdu|unil[Qmue~]eqlvq`Pn{hz~~wmsmo{z|zykf~a\twwbmcWautlO^qdgnZT`h`}etkjbbim|gaxqk|frsbsnWSzt]YI8B\Q9@QZSRNVTRRZ``JJZdTYWLSKL\\JIrZTONY][VUI_lW\RT]^ULQW][WUZeZ`\I`doiOVY^ma_[\RR]`c\`[UUU[iaWbcWKQch_ZR^lgkwkbki`dhedbejhpysmir{txyqlkkkp}srtnkmmmjkqsutuqiiknxukiiinxtr~wkv~{yy|urvsy}wtswsnmocesptpfo}nhtxxx{}~||y~}|}}}ox}|~}|tzxtzxvtrroabuts{iY^nqigxvytp{mjypmtqsy}vrxw{ylnvqsqrvwt|{pyzy}~~}xy|tywu{~}z{qr{rvst|y~}~xxy}{xx|{{{wrz}ztu{|zvssvvsvv{qvyz|z{~wuxuyy}~{u{kel{{wx|~{s~}}}tswwoh]Y]XTTNI`hRAMOXhXIbeQKKIDKYUDEOJEI]dQLWNCOZPC@GSVNMPXeh`\[`ec``fotnpm\Vagbcicbjfgj_Y[\[]fldSVdd^ddQJMWkpbYZ\]]][[]dfedaZZc_S^__`b`]b`V[hnldVbyfOY`LH^_OO^jkilflsqv|wkgls|thmnoqsvzmpwkttsstsstv~z}wwuyoc]goidluxyqr{smlnpmcb_^l}}{xoy|x}zqusxvp|pŷ|pwnyZm{wzlhxmwxvopbnpnxrrr~|w~}tkvxw{hvmfv{hYoviSTw{fmbL[oVl_bl\fjkprrsehmk|oVSTfwxurlTe~ti|e\zltrdMh{euzzmmgoyt{m_wdZvwzfneY]txtKWtejp]Yhgatfvuk]Wu~gqns}v}uotZRwtd`T<@[O3CchKVW\;D^SGfmX\]b^\bhOOkcJdqX]OMU`gpscocQr[HUVTKKWegvbZ`OR`gjbSOF^e]GN\\X\ZXeZPZYT^bb[VT[`PWQ^cUehq|hiay|uw{ulrp}fewsmvh||tcrbz|~p{cJc|pr~yr}i`xrlotr^bmhhj~xlofinquytojp|pkifkkc^[^bacdgnoqg\X_dehlia[XbzlZW\gzbjqtzzu||kzokt{½ŷy}r|xpdzwtrs|tjYbpY`pkf\hbIXeVY^TLYafhkUVieZZKDIZhRTa[NfbSaeYVcYWTLPJ:HPYD=WkKKl[X_\TjcbLYY_WZXOOLJX^RCq\XQK\`WRRR]p^aSS`_WLRV^WQQ\iY_VL`bj_PZ[frd__]O\d_cYXURNS^fZWa_NLU^d]TO`gcdhcYgg]dfbdfgiktwrjju|pyznlkgfpurwplpomilqrtrlmjjlntqmgfgktll}vkz}zy~wrxwyzuwsrrnl`boklkaiykeosstwy}y{uz|~~tvy~~xsuzsflxnwsa^fqolp}srootgivojppqxtpvy|tmt{x{vv}xy|}txpw{z}y{zz{{wn{nxxrz}|}{}pt}os{uyy{z{|{ws|{{ytsyz~w}vl{|~~trtv{ypnoqrrr~z{}~nxvxz}~~}{zw~y~|wxtyuz{y}{w}|uxhdhw{uwy}r|}}znnuyn^U\`X[_TQjhGENP]fNOfZMJIJJSTIAILDEUdWHSTEFVTEABJRPKOT\daYVX^ca_bknnmsi_^bedekgdjfdf__c_^_hn]U[ee^c\LKUenhc^[^_^`aabgigea[[b]QY[^_bbZ]_T[ljg_SjyZIXXELcYHRcjhijfnnmuzr`cjlmknnnoov|igyufllmnopppu{|vy|{}~zxpq}{qkgc\ahidhqttmev|fcejg]YWXdxvpy~~}~z~z|upwxcwykuw{~rr|qrsntrsmswu~mx~|xp}{|swgtnepteWfnfOUtsahXF[gPlYtnbsenmoquk_hnouide^vsx~]\wvlzgT{pmvgNazbkzxnkbnyntsb}riZ~wwzine^YkyzMOtfls`fph`l|k|}dUXo}o~|t|zZRtnbd_@@VO6SnjX_dYE\\GKqnaZW_ZZa[ETl]U~_HVLQ\ieknd|URpOEXYNJNZgqrgaPO[V]\YSOIg^VJNahY]\]aPR[VWX`eWQVa^NTV_aXgbo{iidw~gnuuzrupetugvyWcm_gmpxsuvxZ_plzx|{xrqXmwqgnraZsmkf|{krbcooxkcjq~nhqe]jgdh`]_]\\\[[a`WS\bc`YWZZZukYQLbiVZpwv}orz~|ljuplx}mvñ}zu~st{{{z~gm|~|{}o~rrin{pkXfsU^hie[chHYh]R\NK`Vair`Mci^ZLKG\dYSZdWagRYg^SjaVUTJPBHLXSEPxiGso[fkZnpbNbSWZVZVHMKS[VAm`^RG`cSOR]\naj[L_`YPWTbVKP\iZ]PK^^dUX`\kqc_`[TehdbZZUMIX`^U[`WKORYaXLK`b[[bZUf`Zda^abflooqrlnqvwq|xklidbnpuzpnsrplnrrspgimmklmmndcdkqfhzvn{}zx}zty||~x|tuxomcdmijidjuidjotvtszysw|l|t|~z~}~v}zz{qx{n~jdoptrr|}|~spmmm`hpjhkpqwso}}}uv|~z}}rwwohxzx|zwttywuyy}vjxny|tyuy~svqqz{y|||yx}wqt|}wywouy~u||wi{||rvx~v~~~yznlmsrrpy}tv|zkuw{|~~}xw|wy~{~ww{yw{|yuw|ww~}zxu|w{vvebes~{rv~y|xytqsx|hZXdd`eaOXn[>JRT`[H]fNLMINPSG@FJDER`\JKWJDPSD?CEIMMNSY^^XURW^a__dllirwhcacddfmkekigebcdabbik][\dbafVMS^khgd[]___adeifihd`[[d]RUX^acbXV^V[phb`YllOISPDOdSDZhecihfnnlqui[bhkqflmkmrrsvkfprg`behjklmrxwur{{uy|}wwnfxt_h`VacgdclnmmZg}hU`hbXXZZcwyw|zz{y|z}ry{ast{~xu{wjzod{h||{t}{}|qskqwnip}ze[aidP]pwlabMA[`PkZfhginttqreYhssvzzuwvveXnwkunOuvj{pT\yh_jol\jy~mlwfvnp^wsvyklbbXftyUGjensatkf^atpz]O_txpry^aui[baEATXGdtc\hlX]gTGUtqfTX]UX^NAUgYexG?YSSmj_eifwKXeJN[UCHM^krnfPEPRKXQVQHShQVMQeq^_Z]ZMRYX`PYeVLdh^OS^^dahbsxqolmvt{pm}m{jgoyn^pfyvnQiwx}yiho|ylt~po~qztsR[ntkmmgRpxonx{jpc[gyvyebkvybrm_`i`dl\UY\a`_][U^d_ZWRQTZafozywr`ROdq^TY{wh}wvz|tjjmnyu{{grrqxx||np{~p{y}{f~{y}w|wy}rp~tqo{gmwni[juX^^ja][eI]jpKURRgX]iuoQXi`\GQFda_WThe[iWQ`_OljUSZL]KLPN][MnUswgftll|eSgRQZSXZKMMSRXDiceYE_fUOTh_japiI]cVO]Q_YLK[hZVNIW[^OZc]klc^_][koh``aWIO`_UU\WPKGHW^RFI\ZTVXTS_VY_]]`adkljlpmkkowqr}wjkgcanz}iymotsurqrstofgtpglhlk`acmpejzsn{~}yv}ysy~~x}wy|psnionnkipsgfhluwqjqtlr{x}g|syyyx}~{zv~y}{}~~{}thk~tw{x~|ww|~xvnnkakkdfepqqvxz||x~||sos}uhd|tt~{wxvnrt~}xuzwy~yqkuqyxvuwtvwnw{y}}ywzxvtt}yyuuytsz|yk||~s{~zx{z|z}nipzvsnw}~{rs~|qtw~z}~|~u~x~yxx{tv}vp~}||{zwvww|}vtyywuuxu|yyucbap}lr}}{titw|~~_]akhgfXMbqO>SPSdTLb]GNMHSVI=AGEAP_]NHONGLRIACBCGILQUY]XQQQX`_]bfggkzwfdcbbbckidjjhfdfeaddkl`]`e_`aVVbijcji^`_acddfkkkfcaZ]b`VUZ_bcaWU^V[rh]_]i_GGMLIPcRF_ha`fdejifmp]Wegq}igkkkjtunqpdmrf^^^behhjqurrpryytxz|{{vzvgrz`a^X``ceeimrqX]wgMYeaVS\^dz|uxt}{y}~xxt|zzy}rgcs`}ryy{~|z|vsqzupsxukcb`]YcgmkbYFD]aSji~ceimmw{rn`[ksw}}x~r\dqjmrKl|kw|]ZwmZnqnWev{sj}xjqmrcrsurii`fW`lxZEbbqrb~fe\[nswWLaqmz}ruxotwp\[^JLZc\lt[ZnqcqcRK[wyaXZWOVWE>O`\ja8AbURzeYagi|gGZUP\TF;GMiqocI9FMELTKSMH_aNZKVhvc\XZXRQV^fNRbQPhqbQQeZiqjcpu|ruwq|x}]}zbizgaczsg}~pySydfnq|zlcjtw}tppwyrw]]bjzmjgTcp{pxchkRXswopnfsmcicb[]ael\VY[beosoXZ[ZTTOOSUTUaqlZX\YVORZ`d`XWlvcvxqonlefwsov}srthehmtuwtgqot~v}}~vp~wwzyxs{~pu~~zhymtpnmcinje_nwXY[j__[dR`ntHKZYh^Xkuq^Wha^GYEihe[Shk\l[KXaSigSTXNgTNXN^iQZftvndt|j~k[kZTXQUUTMMSKZNeeb^F[g[UZjdeaxyP[bZN_R[YMHVeZSKFSXZPW\age]X\\_qse_dbYOZdWOXZTOE@FWZMBHZTNSRJLUTY\[[[\fogdimjfgmuoq}tekf^_mvz|l|{lptuwtqtvspgjwtijgmh[`gqpfo{njy}zuu}xr|}|x}xxyxtotuupmqslihkvzochnhlrr}vg~yov~rsy}usxzryvu{|~~}zy}{{u}~~~|wnsxzx{|yu|}|{qoonrgdlfmrnxzvv|~z~~xlnsx}qgkos}|urstw|muuzwzzxvsos|twz~{wutv~ns~~vw}wtwy}{s||zyzwrx{zv{yw{y{~||oms~{upv{}zttwtt}zy{|}s|y~yyuvpnxwl~~~~~~|yvutxxtrtvsssrr|xxki_rmy}w}{v~tcqz||Ycilhf_UWjmLEYTW^OTaPIOLMUM>?FE@IZ_QFLNGIOMFGD@CGKORVXWSRST[`\Ycfbfq}odeg`^`ahgeigcdgfc`bflj`_ed]`bZamniclm_]^bgfcjqnleca\]bbYV[adcbYU_Y]sh[_afWEDGLNTbTMbb\_a_dgabmhRZii{qgkgfkfrwnppilohd[Y_cgjlqvqrrpv|}zyz~~xyw{|mr{ddccbbcegmnqx[\udKTeeZPbhg{{zptr|qzz}}ıx}}}|s^da\~uh||r~}zzx}||yvwtpcU[gh^ikaXIH_bXiv{enilryzjdmno{{{baenavS_{oph[wpYwttSat~zzkwyojmrgmuslbealUVfw^E\^sqc`cXXisuQKbudqr}uz~z{wzb^XVd]cjkrSUwwovaVL^|\]RSRWQB;JX[jQ5KePZybXaflqaMXM[XH:>HTxqkN1:HJCMK@KSTbYYUL\lv_VYYXXTVafRT\NVcycOVfYl{helqtr|}t~}ddravqe[u~pi{os\le]oilvjnjmrttxmdrur[he\lifVZuiu^ZsNOwpgsxemg]][`RW`ahZV^\_YfpkUhKHJKJHQTRTdmfTXWLGHJTZc_]r|]w|xtnrdjpgaivhmwvtyvyhe^npjxlnkgp~w{kw~zx{voxx}qtzyvzxzwsips}tkwjynvddcbbb`qyUT]e]``j[`ooFQXVleMkskjifd^VaGstsSWmjjrTGYd^a_SVQSmXO\V_iWLzjptngphxq`oa^]SSNUQLOJZY]iV]KQg_^`ejae}\]a_MbY]SKIO^ZRIDOTTOSX`a_TT[X_tp^]fc^]`^OU]UQMB=CXXI>GYPKRKCJS\YX]]]^cmc`gmiggjwpm{rbkf]]ksxwnxqkptwytoxyroglxumkili\eovtjx{fi{{wss{tr{yzxt|utyzysrturpmnxzob`hfimnule}|ukvxlt|~}sss{yuxvwz|~y{y}vwtloy{}}{{}}yyyvwyw}ux|yuvz|~z{wrrx|pfrmjzpynr~{|ztuty~}wolorv{|tjtpo~xyxokrtxxszy|wxzwrqx{w|z{~v~qo{mqy||soytpwxw}}z{}}|{|ux{zv}xz~}}pux~wwyz}~zzvwytzyzzyq}z{}~xyt~tpjw|hz~~yzzxxwyywtuxuvvut{v|tp_xuzrxwwx{}sav~~Zlmjgd__grhJM\XYVMXZIKKLTTA7CC?DRYRGFLLGIMKIF@@EJOPQXWOPTUX]_YYcb`kxxebgf^]_`eggga_aif\Zagkgace`_dheinjfbmn^Z^dhedpvqjeda^_bb[W\dfcb[W``drgZ^ecPDCDLTWaTQf_Z`^\ee]aj`Q_ooyzhdjdclepuooopmljp_Xadiknrvstxuv~|{yz|vx~x~ww||jmmkihachqqmy_bzfQZimfYmrm}{||qsu}y~}z~psu~|{{~yz|zeZh[hymeuv~{~}|ry}p\WfvjZmp][RH_b\kvskviiv{ppry|z~lj]q]ocWxrlq`vs\yuyPZsxzkyyshnrkjwqla`cnWKbs_ES[npd\bTV`wqMGojdrn~qws{x|zw|kdWhwXbojmOW}xtsg[N`wZVL[_VKASdSgsc[`difeQYRZH>:DHfyoi>8HKJFK;;UaZXW_EObqpWS]YWYY[bfY[YNW`ybMaf_tygljh}tbqiuwxcm~_nxo^tztourhec]Ysphnismmt~qkjY{dnrXofSuohkVVz{fr^QnRNrkej{mhbV]UTP[X[f[V`__[o}nQjGPRRPNPPPRWWRJRSPW\dsplkvY[ov}X[bdhxt\bnn{fixvxzrrzxnpZmtjepvjcqkm{~}pmz~|tzxyxrlwx}xrtkr|wx}zsrnho{o}puqqvn|`gVY\batyTTa[]_imabpcN]RSrgHkrjnuhi]hnZw}|Rcvw~tQNbcd\YVWL\m\R_c_g[IsjkllinfpwcwgdfcVMRWGKNZ`ViQUSOgccacpbi~d`aeMb`]QEJKW[SGCMONMMTb\TOS[WaxhX\hfedc^X_]WSNF;BZTF>GYLFQF>GVfYV^^abhoecilkmlmvtpwsaikb[f~strppgjosvztpwvrpioyupnjlmdlvyulzzhq|vupqzssz|}yzwr~wx}~|wwwxxutqw}ugacefiorhcw|{ritxohrz{~tvqs~|wxxw{|x|zy~w}trthnvwywxzz{z}~vyxzr{qxvv{yuuz{~|~xz|xv|krxjzv{mpwwxmklr~unkgmvux}{}vjvqlwuwsidrx{{{~~vx~~su|~{x|{z}}ojumoruv~qls{towwvz}|}~|xx|xu}x{~~{rw{{z{~~|~}zw~x{q{t|y~~|zwpyyw|yzs{uohvkv~~{zyv~{yzz{|zvvyvy{ww{u{th~|snstwz{fcdljgeedgpucHQ\WUPOWPHLHMZN;9@>>OYMDDHLKFHLNJ>;@FJNPQXVLOVXZ\]Y[_bfszqedea]]^`dfgdZX`ibUWahhcbbb__gnklnhbcmm]Zafhdgsupkeda__``]Y^ggcb]YabfqfX]f^NGBBKSYbTRd\Y_\[eaZ`bWXelqqjdbabejjopnnpmelmhjkgilmorwuvywv{wxy{zvx|z~}xw|poqxog`^httkukk}n[jnppesyt}}ts{xrzxr}}~}t³t}}x}y{sz~z}uf_jwau}xfjz}z{{q}bchtyk^rrY_UKa_`ormrqjjxy}~z~r{]p`cmYoxhz|`rtcg{zPSpry}k~xupzpqnjwsja\ej[E`n_GRXkne`_TT\vtmINr_fno|qmvuztzwuzsf]wyTbnnfNavvqq^Qet]RUjfQF@GQXn^IFTc]hraZ^e\dcNaUL?8?BOylp`9KKPHGHKaLKTPWOckRWVhggefjoc][QQS@BYVG8EUJDNICMci[Z_fiklmommqqqvvov{spadppggyzwpri_flqt{totkksnqyrsurnmqqptsq{wr}wotknxswvswvrquojv~xu{{|~}{z~ur}zpkflmiprnmqx|rptqqquxwuwwpt~{xxzvz|wzyv~xvyyxorvtwx~cx~trlsvxwuxsuyqzwrywvztmsxuw|~|ywwstz|z}|zzv~wk}|rvllpox{ujdcts}zwqsuquvxrgqxzxw{~}{{}|x|zy~~ztx}zymdlwj\itnvhkwxqwzxw~|~|uzx{{~ww}wtvytxyort{rru|~~yzz|xz|~}~yw|{yzwxvz|xu~ywxuxu~~xy}~sp~}v||ov~~~wz|y|{y~~zz~x}u}mp{{{tt~z{gedfb`fnpbPRSTRPOQSPOGJUUC<<=CLOECCBHQHAJOH96AIIGGJR[ZTT[[VSPU\_grnhgea\Y\^^`beb^ZZbf\QV_a\\`_[Y]fmlmj`]eni]_cdedowqypcbdebbbacfifbb^^fdejb[_^ZWM@AJS\icVZXXXWZYTZbZR\ilg_ZVSW]ctldpwoqtqqrrwytwwqryxstsssu}r||{yvuvuwz{~|zvvs|zwurw|xz~|z~urj{znx~wy{xu~szw}u|}w{vz|v{pzx~y}tw{x|}xs{~}ww{}~}|}{x}vwx{|qlnetfT^^font}|xls}}yxv}{|{yz}tvvqemieulmhhve\XRkcwgqvtr{yyuutqxkrwaf_nWfJZaXINWhgnxR[\N[are:pv\_j^p`nxouqmswprzgkjcoyuTevp|snufs}u^fyfMKF_`gwkV=P_jXceV_]UVZUgQG@7>A`pcs\7XSGGYJRq]HFNgdV\V^khnhZWagbgaY[]]_jqpk^yr|tsgdw|q{vfntandfth~Tg|tly|kSaggiim\iyy{s\wjqg_PkjlmhVXaZSOH>DpVKYaabdi~shV]YOYYXUUYZWPICBDEFHMU]ffXYqs`irr~~^Y`cZjxglft{n\cYildh{{mhilkh}wu|}zpp}uy|z}~otyzyvu|{cz~xxmrynzskhh[fweXWm{wsvzxvpw{y|vpzxoen~wTc\NjeU`opQgYM`i~}nrcTp\Uzhjotvxzegywn~v~fl`TPXZ\Td`ci^dVGVjciXefs~jzW}wokpkT]RFFJ[WPZD[g[khlqkqkw{ZfeQbleYUV^GWTA8CHIF?O[ELPPTKa\KXThhfdbln_`\MS^ML^XG;JTJDMPMZimfadnpssrqqsvtsz|puvmfgqurpx|ysriehknq|tmskirsrvqtrronupossu{vrrjrjqvu|rnxtnoskhu}vt{}z|~~|{~tt{xqlipsmtrlsuxyuxztqsvwv}xxznn}}vu|wuxvyyw|pu|{ymn~vvy~vgvttpmwsysxwrw|usxst{wwypjrvpry|~~zxxtrsvzwxzv{}x}m}~qxsrwquztjhmxywtys}yvwxyru||~xxwz~~}{{}~y{yyy{~xsvyvngfrhZgukz{lju{sw{y{{z~|t{yvy{}{vvz~trstqvqipox|mktt{{vywx~vxz|}}yxz{{z{|z|~~v|yz}zwt~z|vww}lx~y|~{}}|zz~pu~p}||dddd]akme]VYSQROOQSXMDRYM@==>HNGAABBPSEGRI:4=HLF@DP^aVPTZUPQU^behkhfb][Y[^__`bdb]W\gdYSW^^\[][YZ]eljji_\fmhaabfcdqsr{oaaegbacdgkgecb^_hfehc``^Z[UFENT\lhYXYWSUYURZ^UR`if_[YROU[etdg{xmswtstruxtvtoqwupronqt~ywy{zxpquuwyy~zxuttzuz~|xy~~wq{p{}vxwzy}vo|}~q|~~|sp{ts~{s|~}s|{~x~vt}vvxy~~~~}w||}|}~{ywu~uqujyva\anoowzrs{|ywv|sr~wx}}x{yyut|s}xhkiaqrk|ldqc[{bVf[tz[jsus|{zswvmynow`ignUfQZ[XHMWdlutN_[EXdvTBlUdbdpqawrmtjipslq}qcreuq}tYlnnqokuzxfartRHUYjirnfHIch]N\ZX[UKP]fYIL=8HVidleARbGg`BBPgja]VVfsnf\Wai]]aZP\eim|s|yyu{ur~|~v|uj|lnq\nwrogxd_jmu\iptuirwnXUpdiv^OW_YQOF:MzMBO]_aabp|tW]\Yhm^RU]\TJDDFHHHHILQUVZdpiWYirtDSSY^]gqm}dd~ti_cdoyhquezndnu|enn~|}~tn|{x|}{y{v~uuyru{n}y`z{}zynu~yttmee_Xhn\SVp{~v~}v|~rnxpoln{t\f[XpiZ_vk`sXSkmwzR^w`aguvs~qhl~yz}xsk{`TKXYSSi_ff^iQH\mdaXgp}|s}^vyqyoiebRGRT_R^FWpehihqjxhrv|WabSpkgfWXcMQP>;CEHGDLOAIPUPM]OHWSgidbbll]_ZN[jXYdZQIRSJHV^[fnpvnjqwzytpqy|yv|wuzljmrx{~{vojllkkoxkrpiqyspqtopoptnoruy{ur{mjplwtx~mozoknqjht}vsz{vz~y}zqwxupmnsrpwrk|yuyy|tpsvtr~~yz~rnx}~tqyvqtvwwz}qqvv{nk|x{zzthustopyr{y{rtxvtvwsz{txwmjrsmouwz{xwwspnpzwsxrr~{}v{t{xx|rtzwopuz{|~xv|x~~ywx{yv{x}|uwvy||{|z{yvtvuv{|wssy}wpmhlj^gwmv|pnv}wx{zyx|}uvxvw||ywww{~vqopqvkflmuym|jt}rvsqwuv|ysw{|{{}{x|{|~y}|~}}~{y}wyu}p||~~}~~y~u~~}baa``hkg`\\YTSQNOTWXGI]WB??ACJIDCBAHUOGNN>4:CFD=AR`hZNR]YMKTabbfhggc\VW[]``__adaYXgp`WV[\[[\\WVZ[clgbc][gkba`bf^doopwi_chf``bfklddca_ahhffea^_\[WIJSW\ln\VWTPSXSQZ\UUae]YYVQRV^klaqsmtvsrttpqqrplpwsnpllwvtwxxywslpuuwyx{vtrosv||~}uxu}xxoz|qxz~rprwrq~zv|uyy|y~x~xvst}~uz{xuwys{|y}yz|{s~{rvzrm~e]itsu|}xor}~{spsvphwrx}xvutxly|rx{hki]mqmlvhg^_xl[dVsrQeoywtz{q~zjysoscjomYf^ZRZFLS^qxsM`OACDGJJJJJIJHIOSSKLVZdswuj{TVyn[^aglotpddvfca^cjiyokr\Zv|obhzsxx}~stw~zzvxxzxsqvxmyxtk|t_{uqynx|otfbfXUgeXSUq{~upmrispmywedXdridjzcxt^cvr~xGpyjmp~{n}nhl{uvuhzaSOYZQYhdg^itONfqc[]q~~}uv~x{yqnvlWi^k_gOVrrmcdpfvjop|YaeUwlioWSb\TJGXa^ZWZa]NIOZ\]\]ehb[VVUY_ceeb[[bdcfnl[UZ[X]c`RP[]Xdk^WXU^jdWTW`bYfshmo_^eibZY`ime_ba^`ceeeef`_`[[ZV]\X_gle]ZURVYXYZZY\]YXWXUTX\`cdkvoflssuvtqhhklklqqlopjnuprwvutplintqtuttsrnmw~}ynxz}t{|wx}~{}w~~z{w|wusv|tz|}~}wzwz|nzvyuyy~wtqs|{||pswmo|{xovrqpo}ux~tvnsztvwwsqmlkv~rmswq|rw|u~z~wwuixxs|xskdq|y~xlglxt`bz|v|vvtkxnk}so|kkk`gmsctzdV^x|}m]ZSqdRgjp{om||qxshptkaZilhdfd]^HCRfffqQbH=VbXElZJZkt{s`{sjppjy~iagZjtgpyq~ou~zbdcgoigXUrt[CUVX]Z\aamh`[C9CYTD>C]ZBLMCDDIVomdXLIUdafWWj`TZdZZZX]_`cfisjue_zjhoo~xuzmadvtz}^k~qou^ognb^\]UU`\QOdz];@DBNa_d^bnnl_afkr\GC>>?AAAA?>=>CFIOQSSSSW^fnt}kTWqfRmta^qmVhp|ufriTbidtgbi`dikne[tozpt}nw}ry|q{syqnzqppqkqn|wvyjgyxjkp|o|iishtyz|}g^^hZWa\d^]murmeppryyl\kwvlgquopyz{pzcw|lwu~pbmuxphpoepx|rkjr`fX\^_rYYeikwq]anne\x|xy~}}jjz}}ghbfgfts{foi`tpmtkXZjfTPMNOCJIHS^KU]RFRKJVYadoSarf_cibnwinrqwljjjuwwuzyy~wy~~x}yqsw~~sov|omrplpot~plumpwmlikoxzwxwohmiqyoxxnuvljutnsv{ylnpmlrtquwxtnmlllmppottgk{ww{yppomnns{yttvmkpsopvqpsxzwt|pkqljnx|{|ptwqkqyvx{rmuuqlmwnfmlhejngihhloqrtj`dklinpkmwxqs|}}}}z{~{~|~tls{s}{vywrxzuyx|ztx{yvxzuzntrrvvrrvvut{{tnnm{wtpmvz{zzw|yzvxwwvtyyz|}ok||smq{vvr|xtvzzqnusvxwuzywtwz{{|~yxzw~~z}}zrty{{|y}{{{yx}{txx}{vvz|z~_afkkb^]^TT[^][WZ``PVfWJJJLQNLMKHJPTLGHA;EJIEKX`_\[]`VKHNY]\Z\_b_\XTTV]begdXS\ggcflgXW[Y\kiZOP_^Wfj[VRTel]RTY`]Zmsfkf\_fi`WW^eg`\b`]adddeegb_^[\ZYa^ZafleYWWVW\]\ZZ\]YY\WTW[\\aenjidchimxzojggiklmrpjpojprmqvutrnkhovorsrrrrlm~~yrowyzzv|~}z|uzvs~{~{~|xz~|ssq~p{~zs{z}ux}w}i{}y{trpqspy}pkjpyxxsmqtmpzzyzjtplmp|twytyhpyquwvsmeggvwivmvkouq~}uwxxwvwoxxr~tpkblx}v~xidi}vi^sr}sw{nstkv~umz~zlhlfigvckwkS\uuzm]SQm`[gjnydkv}orbj}mZTalmghia]IBQha^nUaHAUbTKz}PKeuw_f~{yqgwsn~g`e`zqgtyjwq|yacjgddZTjziIJY]VWVY`tobVA>BOWIA?Pcea_grokeminkQIA>??BBBA@ABEHRVSUWX[]]ceaeUGN[}|^XzsXTsnUmoztoyoVireta\]^_bindas{psnmuxhouzw{|s}qtnhsonoshop}{|rvteervin}nxysxaipdoxv[^Zjc[[Zte^m}yvmempsyyvYk{zneotxvw{yzt{q}vnvk}oxkbiqvr_qxfuwpcjasekq_X^[_tUWhfyrffsqrns~~~}uvvmehjeur}jwkbvtptrd[mi_]]SSIRLMceQV^SERLM[[advYbsjgjrkrxsuswyqmpuzzxx|z}|o{zps{}yxotzymosplppsqkunrxmjfiqyzvzwoiljnspwunssmjyzruvywkmpmnqqquwtqljhhjknmjlqegvwyx~skpolln{y|woxrfhmskmwpnrzzv{mlnilrzy}tuxpnvy}zt{~pmxunkmqhcjjhdilegdcfjorrdZbjidekklpvplv~}{~}~|jqvz||vyxpuwszy|rw|utvzx|nvrv{xqsywv}~tw}xopn}wspnt~xx||zyxwpvxzxok{}tnqzxtzzwxz}vrxtz||swz|vx{}{}}yz{qxxuz}yz|}poswz{x||{yxy{zzswvy{zrsy~yz~~dgihc]\\WS]jgY[^_]\W\TQPPOTTKLONNNORLHG;DLHHP[]]\\\cYNGHQX][Y\`a^XTTX^bdecZV[iiddgicVZ]ZkvaTMUaYZjgYWR\niXOSZ_Z^rogn_Zafi`UY`aa\Z`a]_dcdddec^_][Z\c`[bgkbUVXT\k\RY[_^Z]WSWX^]^gnjdc^_eejtvocbfhjlormjqnjpolpttsrkhhptlrrppqqln{uvrq{x}}{y~vwwwvznp|zzwpu{~n}xpz{y~|}wup}ztv|w~{{i~quriowgprlrupefqutppqoorvux}|vmumgnt|swwtygpzrsuuulcfiurakp~fbt{ttzxtxxsnvwyupuvr~qol_hx|u~xhcg}wiboz}rvyqmujw~vku~ynameq_udasiSYsm{xk\LRf`gdkpu\iuql^hpWU^hmumha\LBRh^Wq]^HBU_VQjHOr~vcg{ywpg{sofbfknjtvjurxecqeaaXarmXEN^ZTTTXitfWEBKSUL@=EPMJDQZ@C[r~hSHHduomsheZkayqgoyxfYimrtjxy|}n}v~yfjwu|]sqcipYaeyiA;9@DAE\fh_crooeojlqYNIB>@@A<<@CELY_[TWZ`eebVPYVKIQhyY`rXPrldrwzutz|[owit_\W^_]jpdcnpgsfmt~ocjlmy{|{s~pplennmosgmj}wspusdeix~gsmrquvVk|nfmtmV]Vkh_WXl]m|~xumejntyy|[j~{nemrvzzxxwnvp|}ojk}yufddloq^tpw~hY^_ayshuyfUY`YfrVVgs~sjhkyrw{}w~vstipkvs{k{k`xupssi_nj]`meWPUPShhVV^TGTJP`_cg{dcvpknxquxwytyzuqsz~{x{~|~{i{{nt~|v~xmyunpspioor|olvptxnifipx~vyynnpiorpwtprqniztuwyxnjpqlpqpswurghleklmmlmmbgtvxr~mlmljipw{soxoadrmfsqnmty{xqfrmhkx}vwx|roxz|zt|}omxumkmpgciihdhkdhdafflql`W`jgbcfjlnsoiu~}|}lpwz~zwz}{quvp{x|qv|ttvzy{nvtt{yrr{xuy~tt|vnpmxqonry~xu~~zyw}mvw{s~pky~vor}zyvzzvsz~utzwy{}tw{~xw}}zy|z{nyqn|vw{stvy}|pnpvx{y|}|zyz{{zyxstuvxxxqqx}z{~gfec`\ZZUZhe[U[daab^WTYXVYZOLQSUTRQRNHFHMOMR]`\Y[[_XNMMQW[`][]`a[RQW^dgf^TR\eld`eig`[ZWavpZRR]`U_mcUSSeocUMSZ^Zbplfg`[_efYQW\\]^]bb[^deecdfc]]]\]_da\fnk_VWX[djWU_^`c`\ZZ]\^`fjfb``^bggorkf_agiclqojigmjjllqqopnfeinnlqppnnplp~xqzsq}zz~xurqopstzsqv~upuv}m~snsvwz}|z~zn{~v{w|ur}yx}yz}{~ylymoget}ohoidoog]btvtmmwqnu{vw}wlwlcq}ttuvzit}sru{sj`imonfesy_^swtuutswyjfxsmosllxt|omm\ewzt{vfdd{wkll}lu|tgtkv|thlzwn[rfxgjbXohSTpnspgZKT`egbism\eovafcsVQZbb|sa\]POTe\RkgZGJYTXXeGVuysxefyywkm~rrigoy{nosplvrxilsaf[dggaJE`[MRRThp_OJKX^YH6:JJGMM^Z>B`p{jHTbnspjkc]\_uspzzp[_wxvxw}zxu{zqxhi{ur}qy~aa`khQ9@=BQ8=Nerc`hfrc`jnsk]VPJC>?CCFJKMRTUZ\YWaknfXQMHGWtkXjqg^apbio{{z|ir~vt[]_^^`qrehjkjpyvejormc``adpxr}||wnmjciknrqihf|ojmtscegw~fqvjmtnVlolrip}lU\XincVUs`lz~~utoddlswy~_i~unkmnqyyrsp`mpxl[h{o]fadfphwt{cOT[ZgrjqpkZK_aYmnOUp~pggggy{y}}twv}swmxldtrpsoncjndgvra[aZ[ee_X_WJZLSighp~no{quu|yz~v{~{uu|x}|~wj|yju{u~yxrogs|pfoopwrpttsvqhfiqz~x|yqxrissnwuqrqohzyxvyzqksvosrqu{xuhjpihhoqmmk^hsuvm~efhjhjq{sumpvm^bqffpjjkrtx}hmsliq|v~|vqz||{v|}qpzvnkoqgciigchjdhcaebhrq_T_kic`^honpmkv||}pq{{yw|}suvp{x{pw}ttvyyznuvt}|tqwxsv|wruqkpmy|tonqx~yz~~xrssyu|okw}zrpz{zyzzwsw}zyzxv|w|{}y~}{v{wynvojwxstrmkxpw|yxzyrnoswyy{~~|{yzz{zywtuwxyywqqw}|{~fdb`^ZYYX_f`[Z^heeg\VZ^]`c]NQVVYVRRQPIFRTTV\]XXZ\ZZTQSSX^cd^\_a`WNR^dfe]SSZfifcdjlcYZUQgtbXXW`_WemaPR^mm`SKT[^\emdbf^\`edURUWY^`^aaZ^eeebcfb]]]\\bgdclmi`Y[\^ehWXdefga\^^__adigca__aeijje`]Y`jf`ltleffkjghkqnhlj``jmfjqnokkolrwwsqvqr{}||z}{~zuz|{~ujllkjjt~l{|}~}|ou{o}m~plktsw~~{{vs{t|{ms}ymy~|qn~|~x|sz|{|umyniehsynhmfboj_Zd|{vojzuow}|vwm}t`uvqrx{qxzoypj_orkonxfvw[bswvvxtswudf{wigmqfjyuz}nkmVbwwrwtdd`rwnqmz}lrxeoot{sheyupYqmvxe_RlhTNgjkhcVJS\fgafwe^bn]xr`{r\TVaUtwXT\P]Uc[OimYCQaJ_fcF\urstdfxuyvdsqvokwtqqokottxlut`jefaYSCT_TTSQ]eVNTS[bWD9=HMIRcpmSPgmslLXsgb^ae_[rwx~pdn}~{q}wvv~stxyor_~qwtm`YXWOC;FFI_>@ARrh\Z]npYhopwh^]XQMIECCGHHIIEGRYZXUXXSLLQTg}}d]sxfajp`^jizzpr\lg_bixohijiinymdfdcb`^\X\jtslyuuxz~mlg`bhnuokccwjblrs`ego{fmhjrhViciyikz{kSZWivgZSzfl|}qsqc_iruz|fg~toplekwzjnlXeprmSbylYe^\^rts~u`JMVW^klnk^\PQha]iaQ^{zq`ahcyw|~~~tunylllmpslnferqmx{kbeeddci`aZOaUXpnkvxuvxwz}y|x~y~~}zsq~rdzyv{uz|ki}~|mfoopsslmyrssigjsz|~~vu|mlypkvvqtsnm~}~wx}ultwsyusw~}yknxqmmswrsmcsustm}`cggijrtrrkrqj\bqcijcijnt}rpiuumj{wzv~|z~}tu|ynkqqfbhfbcgggkacd^gqp]P]mjd]Xernljkw{}|ww~}zx~~vvvs|xzrzttvyzxnsxw{vpuyqq{{molgpmv}xomv{~{{qtz}vokuzztoxzz}z{yqu}zzzv{~{}{~}}{ryy~prrowrpqjgjoot{vrszwsnlpuxy{}~}|yzz|{zvuwxzzywqpu~}{edb^\\[Z]bda[]bkige\[b`age]QX[]^WSSTUNJY\[\\ZUXZ[[[YWSYcehg`]__^YU]jg`[UW_dhifcdlg\UXSXpn[[[[da[hj\PVdnh]RLZ^a`gj`ac]\ad_PRVWZ_a``_[^defadg`^_][^ehejqid_Z]]^gh[`ljge_`da_cggeecaaacfgje^`XVhk^corh_`gkebfknfcid\_ihbimnphimmtuuqqrqp}yyx{}{}}{x~tzz~{{}ysw}utwphnnmkkozq|xmuxlp}snhrlt|{|xz~{loovssvynl|ygs}xywp|x{x~ukunilrsvqgklinf_]g}tizzpyt}ypydv{np~~v~w|~sncvwityyiwu\ktr{zwqsvo`lyncguk_jur{~v{mmhOfwqkqmbgcn|wtrzxnp|iiruwumc{wr^hwrgZRfjTJ`bbb\THQVhm`gyab`lybe~iqpg\Q_WevUP\RfU`VMhqYGVaJix`Fcumrmajppxsaxyqy|ko~}lrsnipnwvo{vfso_USINaXWTPTTQUWSS`^QHHM[`^gqhV]cdc_N[xmmcYmukou~|rz~{~~}|u~vky}~ukjynqu~wyx{vpx}{{kRPKAEIEOUScQJGOqraW[hybdecjbOLNPTSLHDEDBFIHFILNFENRNKJKTjtkaixlZaonN[dhzx}fjxj_iuxflhfdcu{bdf^\X_`ZSXbjjgpmi|zwnhe]\howhkdbrg\it|\`gguflskrykZcZerjh{|n|nV]Vr~i_Zngy}|nqqf]dqrz|mn~qlqnbduvdikX]kl{mY^pjSb^V]wti|fKNNSV`rpp^OQVbla]aabjih\djq}~}zx~|z}vqzoqjhqsehherwx{|tjjljf\jhgeZg_dxxrxzyzu}yy~~{~x{y|x~~rv|hj{~wxkw|zzmcotrongkzstoeggpxy|r{}kwlhxyuwvosxu|wnvvt~{vz}ou{vtw}yvtnz~xutbfhjpqu~nnllrmj]dqhkdadgovuwwfnywnqz||~~z{~zoltsgbie]eiemnafb\msn^O]nmjXSjtnkjoy~{}|~~~z}zwx}zy|~w}~{yxvt{wulx{jmnssjtvwv}sz|}s~omvswxpsxw~{zwps~yx{tv~~}{|}v}~tqwy{uutihmmntyuqrvrppoosyz}|}~|yy{~}vvxddb_\]\YZcjcX^gpkhfeda`cfc\W_`e_XX\WPIW_]a_ZYY\``__\YZegehg_Z\_`aell\V\`djigjg_`cZRTZZgvhY^\_gcaifYQ^klcZQS^_`agi`ac^^ab\NPVX\bb_]]]`feebdf^\_ZX`jmemrhe]Y][_kgeptib``efbchkhda``bbbege_^_V_qe^jplb\ajg\^fjf^bf^Y`gc`glomhiilstsqqrqt}yvx~x~{|x|r{x}zzqqv|{suyoimtyyvt{k|umzwkzwskseu~~~ywuskpyomr|spwkpzsk||xzsn~zvws}zluuqvypvsisytpcahlxix{qy~t}xs}iypqy~}wtn{yhyk{x_txpvqssfbsuh^nx`Ygquxjurq`Tprhhjdgkdm}t{ztpq}xhuusxrh|zs`gyqnVX_g[HX`Y\YSFRPgpcisddblsxeYvtnomgQZd[sUT\VoVWMKgv[Ma]Yoy]Litjoyb`qhkuqbypozsisxppojjljzpprquj_VNMZ\SVSPOMLQIGVdZMMZkofhm]NWbaXSSb}sde|rwxzvyy~~z|xy~~z~}~xtz~x}zo{bq~we`tmqq}zxvxy|}}|w|~lD[GIBJJP[Y`\USSkvk``mywq[bf`TD:989;=AACB?CHJJHGDEKMJJMPT_fcbmpi\eqbKQ^i~}yglkdquvclgcbf~v`cf\XW_e\TY]_aeinlxxui}ba\elwelgdlcVjqb^gcolkofrnvse]Wipii{ugy[gUvdfdtkvy}~|jqnh\^psv{oszmkmodbtyl_diZZdkvi_a`uiQ^^Vczk_ySAPJWW`~puXQRbjjhaflll~rcidox~y|qw~tu}|uwughqsc]kgivy|}pprql]ipmoinmsz|xy~}}u{|y~}}|w~||vuw{|{uyyiwyv~zv{{zqix}snndjystmehjovw{{szsfp{vwwyq}yry{suwv~}z|}tw|w}|w{y~}}rllim||t|ujkjqqilcfmqm`^\hrv{wznbrzou~}~}sqzvjelialjbqm`ha]oum]P_pmjSWrsqlku}|}|z~~~}~||}zz~~}y{ytzyyxhv}yv}z}|zzy{potqv{nnvp}|}xop{tq}tn}z|~}}w}rs|oqw|wroprqrsrw|}~}}|^_^][\YVZio_Ubonljjjha_ef_]^acg]ZZ\ZSR_c`^\[ZU[fgec^`glhejdYX`gfhlm]R^jghnliid][ZTSW^dpp`]b`cjgdfbWScok`[VY_^abgidba_^__YTUW[bea`^\`cigfbbd][]ZYdpnehigi]WZXanmrztfbghgdciljgb``bddfffa_e]Xhjchnlg``gi_X^ee][`bXWbf_\dmngfhgkrtsqppow}srvz~{}{|yuwx|ttw~}}zw~z~|zym{xmyuj~{vo{fv|~{wlmpxznf{|mtwrw}my{~zxpnzxwws~|py|ryzq}|qehtt{lw{q{}w}|stlyvry~xw~yjwo}jxnuotqckwk_asjUWbqyn_w|n^ftjgjcerm`l|xyvuuzjuwqyto}{_prssY[]ddNSaWWXQCVLbrgomheknjs}fZmvqklln^VfbpZT\[wWSLJbz]Pk\go|v`Xnpbmn\`zyegpqevlpxwjcrtrkedmei|}fsl}fjgUKUSPPQLHGIG>DYg`U^lrhY\eZMPY[WSVfywtwzzx{rn~v|t|{yv~vvx{{{v~xv}tuyns~wq{y]g||}u]Yookm|~t{qwv~syx~}zywxwphOfYYOJKQ]\_]YVL[khgdi|ljojdYOFD;79@CCDEA?FMV^`\WVVSV]cca`gpmifrr[NU\nvxveknontelfebppccf\XYci^WWVYaegnnvyq|eh`kowhlkei]Rkim\iajpl~e`ujlqk^Vkxmsuupl}bv]pfmi}tst}yjokka\mqsymqvjijke`sydZbm^W]iufafYghS^Y[job^uGARPZRgn\\Zgmggouqmmvfgnm}su|tkwyr{pzoeputb[qkdrvyxv{ztdity|vzzzy{~}xy{~x~}{xsyxzwszzw{|wxtr~w}y{}{zxuoodkwsvpjlmpw{}zv{u~zjyxww|y~wu{}tsz||{z{zvx}y|y~}~zzsjuvzplmmrljmhgjxi^\Yirw}~{mdw|nw}vt}xojmlfojbngbg\axwj[RcpofSfvrvonz~z{u~}}}}|}~||wy{{y~u~uv~}{}}zssuttysuwjwz~{mmzsj|xl~{}}~sx}ytuvvx{z[]YUVYUUdqhVXjnhfffgf`_fd\_cchd\[Z[[W_b_\ZZZZX`ihffeflmglj^Z`hlghkdW_pmejolif_XXY[]`bjqh_ceeiojb`_\^flkc^]^`^abdgcaa__^\WXVV^hf`b^]egmkid`b^VV\agmidcaifXXYYdor|wihhjicajnhfeccdfffgfdacd]_igfloke`djeZY_`]VW``V[gf[[enjbegglptsrpnpzwlpttxvz{~{y~||{||uvzyp{~}yvsytm~wwtuyyzxjpu{iktl~{x|wl~x}xqnmxyvw~tsx~spq~swvmvzv|wpmnuz~}t{||{{nuwvsoqqqlgmtg[co^PTbt|zbh~wkoqplhhirtlcj|y{yx{uns{qvnu|atrv|v`^``eVYdSTYO=\Nctfqlmetp_ovdZlqlbhfkq\dop\OZeVOMI]zbUtamnmrbgpm^qd]b~yjggoiqnnsmcdr~ssh]dlbn~n^}{lyZpcMMWLKOL@:=<9=><<>>BHFBCJPPRUYZWVRMJKSTVbndTWbdw|zhnonlmqglhfdu{mdbf_W\hl_YZRVdfcjlp{zyfphruzlmtigaSlc|Xhcink|wbfxjinoafmy|igs~ksjrstysl}wus|}kjekf`pqu}hluihhhh`qybT`vcUUctfalYZiW[Wbob_cm@GZYSMvmeh\imbiwyxooohtvw~v|zy{~{ln|wrdyz~s{n|fiquubbwkds~tv{z}zrnw{{}w}{uwy|w~}z~usvu}wuox|vu{~~{xxqw|}w{}wpripzw|notw{}}vqv~qr~}vy{z}|vw}wyyzzrx}xxx~}wo}vtnsmlrjprnfizfb^]kn~{jmyu}~uy|wrrtooicmfbg]dvtiVTfmq^[uprypt{||xv|~sv|{|zxxyz|qv~|yz||{~w{{wwxwuyx|hpw}|lqw|ti{zp~~{||~[\WSTTS[niUQ`mlcabcdc^_da^abfi^[[ZZ]\baVV[^[T^mkihfikkdfqj[dmljgnofetxljnlkh`[X\^cecbknhgkjjnpg^abbnljlhddd`^bcbdb_`c_[[]`YWdkdba^chktnkd_`_WV_gihdb^_i^TXW\hszzkchheb`hqleeedfghhghhdhl__jihoonjbbii_X[^[WQUa]VajcX[fmf_efhlotsrqpt}{qhpuppmw}~~vx{}ry}prsoz|çyyprz~vywxxotu~wnxrp}~{nryw}~|ummp{yx}~{~y}{~}rsqkpzvruungvtr~v{~u|}z}y~y}rs|qtwswnlkmrbYeiVMWiswlar|ssumqfbrz~tokmz{z~mrqvsg{|itvxvyhakadWcjVSZQ>[Ripbqmpf|p[gnaZmrn`ba`tkbsr]IVjUKKJ]{k^zejtbncork_vw_bewqhanprnlpg[et{ssf]cfdu~x^]qklci[MQTGIIC87AFPZVJN`ndSPRMFCFJWeiknnmmsopv}y|||~}rdc|zpqlvservvxqvv~yutqsy}x|{ohzhvo{p]UrzzxdSjygizxyo|vrvvz~{qxpgi^pZf}ibUCP_ZWX[VVdR_jb[bt}zX^VLRbF<:=>??@A?;BGDDDDFC<>NKCENQICEIS^YJHWcn~vuv{}cmvpeeplkkjhfuukfbecZ]jpfZ\STehaej~i}whrouzlotkmZoi|`fjpmj{zqounmsnewuyc[tth|~}vup~rju|mmuwlg`jfewqwjjvhfjdicqyaS[|hVN\peau\QiZVYioZ^gf:KcYGS|ofg\lh_kuzvrs}{|pv~y~xrsxzxw|jgzyr`~zu~y|o~fqvy|ag|pjt|z~zpytz~uy{ysuw|v}{{|{~srro}zrup}s}tpyyw{{quz~y~xtyqx}sx}}pn}uouyxuzwu~y~}{~}vwyz{rz}}z{~xu~sorwhnphtwtek{ffjilryitv|~u~yvxupifjfgd^ivqgWXhkoZgyivzpvy~u{mrwy}or|z||xwsrzzmt}{zyw|xxw}}~|yxyyvzyiou{~kuvz}nz}v|}YUQRSQVfkUIXhkfa`aaa_]`a^_bdge^YXYZ]^_^XY]_UOhmjgggppggnrjanlklhrvgl|vmrqmja`^^`dgdcjlilpmkmoh^bhmqgfjkagha`_c`adbaca[[^gb[ajjbebcieoxnmf_`a_ekfefc_]ag\SVWamv{mfjgccbepqgeedegihghifij_`mimwtohfbincY[]ZWUTZaZXdg[T\hj`^efilosrspqu{xnfouommu~zy~tv|}{tsuvrkou~y~ynsxsywwzlotuxw|ot{~|~zl{ouxz}nmnty|}}|}sonkqurprvpgo~mywxxxww{r|~xwqsuxkvjrpachaLN`punchx{tukmd\{}vrmq~{|z{isqypg~|osyyxvhjmn`XbjaTYVE[Rlgbqmpf}o]bg`\mrnd\^Tkybgs^DUi[IJK_togvfgvdmdprjd|hYeguuj[ksslto\Qbwzytqgbdchw|mQhhgii`TOYQ@FG=:FW_YQOU_ih]USQJFHMZnyvpljiuurv}~x|z~tymdo{yrphss^q|~vuzquz}wxuqoszvzqu|rsmkgrux~iJp{iRidi|r{upwx{}pvr~r{sucam`tskgZGP`SYW[U[fWYbaYOXifRPYEJ]Z@8<@AABEECDJJFOUXWK=??DB?GMQKKPW_ebXU[ZPKNXajnromknuxv{~z}~o{id|wysoiqw]px|tt|svv|}vxouvvwz~wzvh_x{|{HinRrmkytny}s||}jqkpl}pxyy_mer{jlh^S\`NRS\R[^WZY[ZUMWQKQTE>R`K:BDDFIOXWNPQPNOOKEA?><;?IUgw|sopvqgcso_Yltnnfshhopjbbc`bcepp^]RPgpa`h|gk|{x}rs}x|qjtv|nmt~rvw}uwnu~yzrl{|jn|v}{p~tut||`ih{p\am|oZkbech|rrrfmhanaigpu_SQpkWFRg^WtpFkzmYJZdkdgc\EYiLCdo|Xblid\mv{|}{ym|}~rrqyonzttt}|xf}~~{{}yrnzxssbk~{s|~swmx}nrrr{okq}uwqt{x{usqiyxflsxok{{nmsvyrt{zsqz~~zzz{ykwvnuy{{pjmzxns}~}}zsz|tqvzz}}rn{sjthktrsjptduml}}izr~wzx}w|xvrusfnjefk{tfghjojgyxu{uquyxrpsfurt{rpxixzz{{wzrllurortvusrunq{ms}v}{|}{~{yz}zzvruw|tlw}~xz|~txyJEHNOUb^KFS`b\WVX__YS\`WY\\abZTRSX]WUXXYZ[ZYghgffilpebovmfoliqpopko{yrnhegjoohcehkjkpru|vmnrrjnyrhfagqmmocabfg]`gfedb]`mnghpmfcnlmqkuylomffkmmh_cd`^^bb][Yantuoinoc_flqk^bjebfgedhjkkifhnmw|pljfhkmg_]]_]X]c_Y]cc]TS`ha\^agmnnpprtvttrjgkoooovwszyoxz|}zzyzz~}y~~~}lu{{xu|skl~|x}wyvrgnsxtq~y}}~~~y}~wtojhkpgmskxnez|xxo{tnw|noyzrx{~}ww|ugrvg\Scuqcgntvnhmosqot|qkopr}}n^vqtfi{ksrsw|swxwsa_\oaZ^L[edZ_llmhxuh`ZY\nrld\W=Nsj]]pUOWpfFM^jhimjibcrdfplwaRxvnvv|lkqqmkq`VR\|umrlreniqrmR[gcgk]SVWUDCEFFDDDDSXUUOHJ[cVQZcifi`eorttwx~~z|~z}k}hevyumilydp}}{vw~uusx~zzmtru|mjPgvRz|xq}|j{ws~{mkjhowvtrzlgxfzdrjgec_XPO`S[WW\UXX_QKIJXRH?J[T@@CCC?AFJKKIJLPXXRSUMEBADEHPZ][[^bklg^a[gcXWuwkdesehnpiabbahe_mq`^SPgtb^c{ma}yxzxyjjuzwservwoeuwxvx|}y}xu{rszyzypymztwsq\lwgxnY]isg}}Vggc]dwtlsefgcmggconYQQfmXDQcZQivMeoeXL]bafp[\S[bKNjxm~Sgxj_Zs~~vtz|yy|hmz}t~q~t|yrs~xq{|cv|zuxi{xlr{yljko~xkfn|vtrors|vtphtvdgttjhwxljmpxzot|~uow|{t{{zxts~|sr}}ukoxsfjv}}twzurtxuqy}xsqwrvoirpoupmpe|kq|{ynwm~qvx~zz|xy{vnqmmlr|ynqmkqmt{xyxrpyzqkngtnov~ptqgryz{wvpfjsllopusqpollv|itvzyzy}z}z{||yvx~ylv|txx}yBCGMS^`O@HX[WUTSU[YQP]\QUXX]\UQPSYYQQXWTTZ]cfeebajok`gtrjemhmsnlpnv{tpmhioqtogdinonnsu|ulpuphrsgfffjsmonbbbff^ahkjfcahsmjqtlhgmosuoxzlqqllqroi_ile`ahf^afhoqsqjnphegloaWelcdjeagljhfdgkntyrkiikjnlca`_a]\eg^Z_cb]SSaf]Y]ainllnpqtvsrphgkonkpy|rszwwzt}||~z{yuy||||||gq|z|}yx|vml}|z|yytqnhmu}tw|}}x|~zyqmljjkviftix{dr|msrswpfw~u}}x{y||y|mh~zdgfl{m`nrqohhpy{ckuvskjmlv{f\uso`kzw~ewnkuzxtxigWmfZ^M\m_T]hlgesujcZZ\ppe_W]:Cimj^snQTffPPekbejmsZb|zgdimxoR|msxzqwtlinuaPV^vtpqflhuponbKp{`ghgZXZ]RGFFMJ>CKTVMGDBHT\ZRXfgeajcm}~xuuy~uxuiyliw~}{ywmlixnq}|usp~~}wvxnv~oyv{_gZsw}wk{uxxu|}wfojmw}tnpv{|ktynngrlto_hmSSo^TRZ\TQVj_HKNVVSNKY`O@EHD@DD@@@EQSQQLEJJEBACIQX`e`WNHEGJJJHFBAEGECDNK^a]d}hamtfiurg_bbchaVem`]TRcse^`xq]{tssxoxxhemuwqamrqp]j|uz{vwvwv|yuv}vq~|}rxloxrwq}j`srhto\Yen`wzWglfZ_qxlwrdfhjjkd_jfWQVekYCR\WN_uYabYYV_eXcsQXZY^S^omhwmXtwrP[}zx{}iq~||{}q|yswvrwg{wws|sduyiksukafn{sc_m{vuphgizzwtpfqwabvrggttjfgnwvkstou{v|{lw}vz{u~|zwsqytdfwwt{wqvsosxto{xyurtuzlpxpmxtilghqxyyrojzjsy}|y}|~}yz}pp{wk~ypsmlss|{w}wlq|rkliv}igq~pq}kfpuy|yvoj`hpgiklqnmmljltxgtp{|~yt|yz~~|{|z{{wv|ywv{zŽ<@GQZ^TB?NXUQSSSTTRPTWPOSXZZSNMNQVRNQWUQQZbfedc^blrc^ktleelhqtlmppuysqomnsvslikqtonrtxtnstknvmeikkpvmmgcdegc`iimkhdhvwkitsmkllqyvr}{loqonnssj_hmhbdkh`eoporvqlrupjhmk\Zjkcijacklebbaimowqgjhmqnplfdccdeglf]_ddeaSTefYW\bikjkopmprnqoihmroho{ulqtx{{pt}}|vquzz{w|~w~coy|}z{}|~zy~~xooz~}{~uosmhq|w~zty|}|u}qfiqmfxn_tqrnnmsutu|yht}{zox{zz~z}mrxeuqvjnqnoheitxalmhkjjpqs|{`^{qsrZjqquvgfcp~xv{jk^gi[[O\o]P\esa_imhe[\\rm]XU`C@fpujnzdZ^ab\hgZ_hrwaar{ldbmr{awwqvvxynelzeJ]ipnwradp{vjfYUt\mec__]]THFHIIHIKPH<=>@HEEXhdtoaev}uxkhlnfab`^^`_W\eU^i\[kh[enb[fn_q^ddl`VXheuz^]iorvqljnigbdent|swzsst}|qv}rgg~kxpxdg{_uwtmcsq`ejcfrw_dhgwviWgvzlmhifg`Ydil`HZYW_hljUSWP]f_Ugu`a```]s[c]`pszxwz~}~z|ys}{yw{x{z~leqrlbf`fscYequhXWdohr~hcysZ^s~yxj\mrYWrshbge`^ahmvrkqpcqtrkpw{g^|tqrpr{{nnszy|~x~z}zwzmgemxrlknqjhzuz~zy|~z|yxpsy{{ox{xzpxywv~z}uyvr~tu}z|{rnrtswwq}zoku}zrsx}id{~kebdnmrvsyqha^cdcfkimjjlnlspjgkv{{yx{~~z}sv|}{~~zz~}~}ǿ¾ÿ¿»GNUVM?7=KRMHIKMNPPPLFBDKOOMIFFFJKHHLOMLU]abab`]`mqX[jk_]fd_luhelmnsxxvuy~zuoqqlsrrvz}}wvt{y{woxynpyigijkpjkqyslmnot|ugoulhnonrsowxkqqvwuzzpoqnlpsonoooppu}{~xgeibejkpoikoia^_cinrsmegnpusljkptnlknxrilkffjld[bng]_dihfiiigeinlnohhmruxpeilrvzuoqxzvw~u}|}~tz|uyikespjvrkkxumwxonp|vxzxvmxer}uqq}{vy~woxrmjkt|yx|xy{vy}utu}y|z{q\fyyqz|lz{vwtyk|x}}n{uutiuxw}|zst{}wmvl|vnrx`^ds{wvz|~u\ib\ryaS^d_iiWvbep~iuuurpf]V[cgeSjluc]\hfXP[]ed_O_g_RbrzwkjqqopOYnq`NU^ctlizr`dggkrm~wjjv~semhCVlfgzs^mqkmfgdpjcdpkti[ZOMRKFB@PMGJHLTPQYdlpuwzqu{}|}{{}~{~tz{|~{mhekukmwkscv~lyr{{nmrwu~t[sr~unzzq{ftdflqlg|_a_ielmfn`f\fiyiWqcwlqj\qZ[WaglYO[Yh\mSC\cX\a_XXYZSOSGSUGLzpYXP_XEDEEFDDGGHIDBDEIKHIKEGGHJB??JIKgjeqg]fxuvnhhmf^cfc_]]]RZj^_j]\gaZ\fcU]l[eg`bd[QP]csya[fkntoddie`_[amk{xvzvrpusuqki~mzryui~czyxynywhdfggrycficwxjZgxknkkcfi]gmpbKWX[jhmkXPZXde\Zku_cc`bllYeX^pw~zz|z}{{{rxvyy~{~~mltnibhZ\ufX_krdUSamcoyddvpYZq{vg^jo[Sowjad`\Z`iiqpfl|k_stm}}hrt{{`d{{sijloywgftrux{|{|~{~tgjnxueelrrr~s{x|xrz~}~z~}||w{y}|}||uvqstuzxxluvuvstun}s{zuwr`yrgdiomprsvngb_aabfjjljikortnkgkw{|{vy{r~}}~||||sx~yy||ݾýĿĻJSUTH;8?KQLHHILOOMMHB@EKMMKGDEFHHGGKNKLX_`_``\Y_ml\^li[^gc^mthgkmnpyzuv{wrnrqosqqv{||vwtz~}wowvlxvhgjippku{xpnnpqw|lessgjommrqnxtkqqvwu|zpsyonrroppoppos|{~tdegfjjlqminme_]ahlrusidlpuyskjinurnnprpljjmkigcdmle`cijfdjihgegkkolejpsvobckkmwwonowxuw|}}u}{}{p|~{w|w|yhgdometqknuqrsuwiq|ryyyqq_tx{om}ysu{uk}~xqiiktzw|o}yryysu{utu~}{yz|bcuzwnwsv}tyszj{vxzkstywqmsuv}|{tsx}xm}{{uyvxr_lz~~z|{v{|kZi]YrvWT\_YheVmbfqxevquvng]WagefUdpqd^[ccVU\\aabPZl`[bqxwjikmoogUesjTSWZh~piw{dbdchqkwiil|zwmleLWjdfvobhoggfhfjbcfonxk^TK^\QIB@LKIRU_aUWcgxxxwvvw{|{x}}~vv{|y{|lhdktidpzlkbw|~irrvnmstr{sT|zp}t|x~pr{nwmrfhepjeY_]e_prdgb]XVam}XchkmoyvhvoeTRhlkY][``loOF]^W[eXTXYWSOQKRUF]l]]Ub_^eNMTPOMJIIECDB8;FE@B@AD=?=>GKJkgcg^\gwqvtfdin]^dfc`\^WX\aaci^]c]X[acPYiY\v\b_YPMTaqwaZfiirn^``bd]]`sko}|wupp|yvtzptrrx|t~rw}}uv}pnfigtyeglduwl^jvloklfd{cimpeNUU^ngmo]W]\ec\^ltdmyae}kboU^fzyyy~w}}}st}z{zyp{{}}~npumgchWUsjVZereRL\n_mu`fumYZq}te`hm\Qiwl`b\\Y`ihon`h{i]stjukqt|x]gzvrcchlxub`yxvnr{v|zwwyxqyvjmtytdcmpwwsu}}~{lw~|~}}}||}||tuq{tv}yxtmtwuspv~{r}uyyvxyax~jjoqnprtumhd`a`bfhjljikqwsmjejx~~x|~wp~|{zz}z}|~zty}vy}~|øþĿļƿMOPN?9=CIKJHGGLPLFB@CDIMLKIDABDGGFFILLNV[^^^]ZYbje]eja[bf`assehklnqxwuy~|yvmnurosrsxzzzuvw~{sowwr~kekkktvqx{uppprswvhiungnnkopnpz}omopuvv{yrxulrvqnppopons|zy|m`fhjlimnjlrj```foqvtlehrswxnhjoxxonnppkkorrlgfhlphdafjieekihgdkmglkfnssrh_fpnlqrooprrrsv|{}|~t|||~|u}|y{u}xrs}|xxyfcdii^lrkn|so|lq}kxznz{{g}_uyt|oit{{wroyuix{ypdfjsv{uxiypjwwmp}ywuv{xyx~mhqx|mqtw}t{uyxixtm|ykl}sv~unnqtw}zwq|t{{p~}}}ywz}igwxx{z|~zxys|ZWgXZopTVZVWk_Ygbfrofuhvyhlz\[mleg[cpkf`\]`\b_Ya_i\Yhfaajvwifonkjocbmg\UUZWutnp{mbaabll{vmjfsvuvqcQ^c`drpfipfhdje`Zfikq||naWXg_XTG?NKOaink]clm|ww{|}|~|}w|}u{z}zvuy}txz}jhd~kpg^kuecbw}~y{~fmorplssrvmTmrul~xwrj{ps}|qfgejjfY[_[_pci`\[PV_quVj_sqlpxnlkpLQicb^kZYcqgLQ^\WebJOQX]RPOMWQKpaVY]njkhPWWSYUHIIFECB=?CFJE><<:=9@BR]l`[VS^hrruujdikhY_fic`eWSYZ`hlg_c`YV\baPPdZUvcb^TNHNYou_Ygkeqp^[Y^dc[b}tg|}uru~yx}ktz{zw}ys}zlkjwxfpshuwmdsuqojjmc~pmloiUTPeqfmkdlf`dc]glss|bjtmjvk`hw{yzz}|}tuwv}xpn~}z}yyo{z~~|||pvvldfkUQsqWP_m`OJ\m`pr^kvk\]rpcaemZNeyp_^X[W^ielkXcze]uqe}oknv}t`ivsvaaekut_^}orkott{}||mn}|{t}vs{~zsrvyxohjqyt|r}~~}{pv|{||}{|}}~}}|uvvxvywyrs}{yooy{|zxuvdumqttstuwuojf``_cjkmnljmx|smiek{~|~~yv}|yyyy{|~||{v|~}x}~~}¶¿üĿü¼JJKI:6AJHFGIFELRI;;>BHMLJIF@=?BEEEEGJNPRX\\[ZWZehabhf[\fd\cwraglijqxux~|ywsjnxsotssyywxtvy}xonxyt~}ifmlowyvx{tpqrsuwohnohjqklsmmq||noootuvyyvypjtwpnpqppporz}vxzi_fijkilliquiacelssvnhfmvrtshfmtzuonnpnkotvskhlnpqhdbiliegkjieepkakkfqwtqfaktportrnoplmruwvx{||zu}~zz}}{wyx~~vz|rt{n}wok}|nx}zuyd_cdaYhokhqohrvxl|}~`|bu}yxtwodhutwuohvteqxzo_bjsr~{}xttduidsodjz|ww~uw}yvwt}vkptyrlt}zxx|t{~wt~whtqbxz{ifzqr}tlnprxyznwpz~v}~yu{zoosqsvv}qztszwQXcV[kjQXXQVm\^ecft|vehpcxwejv[\urfc_hshfb\[`did``gkgcjleefqqgbqp`flkbhg`Y\aPetrntrb]_VblpvqnlknnyxhR^[YhrpnipicbmeYXmies{xpe`hgehbJETOZptxoblrq~x}{|x}{}ysy|z|rwp}yvrw|ptwzgfexn|ieWcq`^cszywxz}d|hmnrktsq}zpcXg}x~kp}k}uvj}yqrtx}g^mcigx|\W\[bi\kZZZJRfryg]f_vaosqjnnt?TfXastXWmpYMY`ZWhSHNKYdRPKS^NYtXTVbukndWecWSMFA@AABDEC?DMJFKLHDCBA_fdXQPUbinrtlihnf][dijcafTRS^hnpe_kbYWXb^SO^\Ukp`^QJFISkq]Xilcpq_XUWfi_g}n~wo{~y|dt{}xy|{swnmywi{ymtvphxt|xxiixdzztlnnbRKjwgnam}mfcbejlr~cn~mpl~csxyyzzlytvmt}|xn}poj}x}~~{{yn}{~zwryxk\joRQsvYL[g]LG]lbssepum__vmbbcmXKdxq^\U[V]ibjiU_uc`vod}{lnkx{pfhsszu]`fjrs[bukkhmquwxzsduxzsq|ynwzx{uqv{yrpoptw~wy~{}zvwyz{y}~yz~y~}|xv|wttz~~m}nm}~{wut|kqwwxxxxy{tqsja_^enprpnko|~rlihp~|}}||xvvvx{~}}z}|xz}|z˿½¾¾ǿÿ½Ż¼GKMB57FMFACEFHPOB9;?DIHEHIC<:=@CCBBEJPPOU[[ZWUZfgegg\W`e^Zgxm_hlghqxu{{yuqioztorttzxuwtv{~ytloyyt}{hiolpw{zz{topsuywijphhnpgltkkq{zoollqsuwxxyjjzzllqsrpppqvvquvh_fijjinmjvzicgiovurjnlpwnppffpxxposqnlkrwtqljooqriglunfgjklkhiri_ijgrxtngfqwqsyxtomnjirvqx}{|{sxxs{|z|x}}|~zwvv}|{xzuqtsszuzjxyoktexyhp~|ryd[eb[Winmhs}nz|~|nv]{zmzx|t{ztqfkqmvrgdvwfgr|o[Zdrnw~}y|tqm`t|gang_hxytv|xuyy|wstrx|kksuvklxtstvrz~}qvvhrs\s|whbuppzskmoqyy|mtky~{zz}yw}xupnklvy{u}zxwwsqpohMY_TZf`LXTLUi]ccadtuibgg]|rcbv^`yvabdgsjeh`_hjkifdphjkljed]beb]hr[`dkdck_\dcRZntuonfY_UTdhwtrohdfu|sUVXPlsnqlpqa\kcTWqg_nxqldcmekuiOS`Te|z{rhtwr~|}ux|zy}}vqx}x|uv}sti{|~{zlrykouxdffsqx`cT^jZ]cqxrqsvwexcqnsfqqrsl`agz{twvexzu~zju}trmy|rqm{mViahfo{dXSada[iVYZDOjlj]a]gq]rrflnvo_7V\OntRbqcQX^g[R[GQNS_dTRN^gQdgX_^gsimc^omZTLC=:<>AABDDGLJHKMLJIEMf[WHGT\ajpqkcggeYY^fjhfg_URQjl|hecnic_Va\TP[_Vh{y_ZLHDDKeo[Sgmbmo`YXVfpjkwwzz~~o~{~{vtdw~|wy~tuszi~quwrgxuz~jhnwz{qvrlYTrwkkbymgjeninxwbuwqonym~{u}u~qdtpkktvyvll|hln~|{|ywy~{}{y{nyz}~y~rqyzn]llQZwpWOW^ZLFaoevwmssrb^zmddemVLcws\[W]Y]h_dcT]macshb{vjmkz{qlinuhW`kmrsWi}gihflpsstsfjy{xnsupotopvppvxussosw|}~}y~~~}{}}ytvxxx|{v|||vvvz}z|}zttw~}|}nvv|zwuqu|rq~{{}~~}yzzmea`mvuusqnxytpnkx}|}~{wwvw}}~||}~~~ʾÿľ»¹ƼHKF849EIC>DHIOQE55;CJHCDIH>8;>@BBAADJOLKU[YWTU]cfggaWY^`\]mvfdgffiswv|}ywsoiq|umqtv{wtvrv{}zwpinxxt{xhjomqw{}{{torswzsimogjplentjkr{zqnjjopqsw|zhl~zklstrpmllmnovtd^fkkhhnnoxwhdilszxpkolpqinpeet{thlvrljkrwsqnjqstqhk{}mdjlkmmchvg_kmjswsmggu{qt|xwtmljirvl}yzxsrz{~{s}wtxu~{~vy}||}}xx{|yy~tym}~wjvrvjfjbvwfg}{pydWfdYXkpvi{|zxrn}^t{~zx}xwptuerresqc`w|jco|o\Ybn{luzyztwrof_txe^h^[hyunruqwwutrompowz|hgtswqfpnjkszn|{snogp~uZl~wi^qnlxqiknqxy}nqgy|vwv{{z{yrolajzztpwtkonnjd\LXXRYa[NUQLVg^bbbcmi_`_][{k_\r]b{u^abcsghrbcqpophoggmnlfbYWVZ\]p`X^if\j_^hiXYhqwukfVWZOZ`x|tsqh`_n|v^NWJbqononweWkbOTqi^kvkib\kelraNcl\oy{voxyuzytx|zw}{}~yrs|xw}rxqqxupczpzyz|gqxdgst^dgluoX_TZeZ`aowjmop{ojp\rnqfjot{lldozmuuoqlfzwxhly}fkw}wrpqnusQcdnbh{r\QYiY\gQXYEOroaY`Xio`mhelmnqN;ZXU~pOneQUccl\TSM[U]fb_aShlTk`\ehjqjk`gyoOHJDABGG=@DDAGMICGJD>DRZ]ON@MZ^bnpi`]if[S[dghdhaTTV_lndi_opocWb\XMY^UbuudUIG@?JcmVQakchhdYb`gpplq|x}{vs}}y|zxp~kkzyt}uz||i~ruwrjyuxonysxyuuaf|vnyhxmntlzho~{un{{oot{vo{{v~lniot|cksz}tgbqzikx}xywzvvs|~x{wzmxz~y~{yooxwn_jo[avnWNSVWILemnw{owzukbz}kcfik\S`upZ]`g\_g[\[Q[g\dpfaxsklm{{qnmjucRcsnwqZpr_jfcjooojg_xq|wlrspvpiprlnqruwrosxzy~z{zty|xszzvyztouxwy{xw}xxttru{~{|}}~u}}vtvwy~xyxzu|w|zyxvorzxu}tkhiuyy{yvq{tqss~~|xvy~ƻÿļûȾȾEB:7:?LMJPK919AKLCCIJC75=@AABBBGKKFIVZWOPYbefgcZW\]\]bppdgjedmtuyzuuqnis}tlqvx{vrrouyxwvngmvwsyvhjnnrv{|yrotuzxqkpnimrietshjr|xqnijmllou|vgp~wkotvsnjhhijkwq]]gklhgkmqwqedjow{tpsnfkkgnpfguynbnvmiilrwtpljuxumhsykiommrmbmwe`lmjsupmiiw{oszxzyolnltts|r{yqos{z{~uv{~yyp~tt{y|y{x{{z{{}}{~lxyxhpntcecbtti\|oweUhfV^ozk|}}~wvjy\q|}|}xnlrufumdvthc{ohqzm\\`h{vinwwrwtvpi^bvreZ`WZjztjnonwqmnmjilgnvwdbtqtvchidap|fsx}vjhgm{v[g|tfWmlgtncalqv|x{nog{tqrqvzx|{upohct~ulnxv{ebejle[TMTOPY_ZPQSMWd[bbieb_]]YX[xfZ^iWeykWXZdk[mzbhysurj~kkiloih^TLQ][gaSXci]agcar`Vbkq|rf]M[TVYhqpomdUbzvePQI[lnhlmxlXffTUljajrfd]VefnmYQnv`ixx{yqttrrus{}yv}x}{vntxw{syltmqstg\|gqswgqwa^opWbgjuiT[UX\\b_qugjklw{jteXuoqj}forreonxwuppepdpvsve_nXgq|x|~qrll|uO]hy^fx}gXNkYafUXYHXshZWWXclcf^mhholRLdUh~xgTmYLaiikbVP[]\eihtv^qp[sadmtnwxqchwsWQYQIW`QAGNI@FRHCXUD?IabSKHDV]_jqj]V_m_X[cndacbQSUcihpygexzsaZk_cT[YW\rplUHHAGQL<13:>?>?@ABHMPMDCO[`ccc[USTX^`doj`dda`ablvywotspilywnmrz{tpnjgmrrnjcfqvpjljedbipsvvtrkkrsrnnlilqug^~clqtwtnfbdccirsicpymelpllmjheeehnkgighjkga\bjdbbbmxyvttvk`hjgpndjoicop`b_bplcisrsqfagzsvxvyupuuw|{ompryujjnmifgkrxysrttx|vx|knskjlrvz{yyyxwxymow{uosztyststwmu}zv{macoZv~pUjvm{vnUcuwvkq|quyypjox}zvr{m\jcqz~|zwzqrqmsqrxf}{morlqr^^Z]fofV^ve]rojdPYomg~]ONQbsiYXYhk\X[[]]UQUV[QP`am_M^hgYjwktyytm`hkrgTgqfkx~uS[schnURntnmqsvegmp]fh`qtrornnnfkemzqpxyyrji]RZZ\UGTSRgZMLFWXchxhyhirixsR^eddURTSZe^lWHCJPf^\_br{tnq{gcnnnlcw{eZhk]ZZ[\]bdfptlf^ZZiklhfR\a^PSmxk]^kdNSabWNLRRW\SP]qt[SVYZ_eT\oiQ@BTTQGUrgo{phtxkYYbejvyz|}{xyy}xyzqvzz}wvxv{qhpbt{ohbfj[e{jy\NudZgum[lm{xoQPXg[WbphHDEWqVcfWhaRV`cc^qeKavqwx}hwswc__inz{yptocYt{nx}p[ozn{mOhZjjKo{xkocnfrsfk`UIbr]eZgifahjssdi\tx_ivsrttpeS^|q|wyyzxvtnvtu}{q}|{wr{zlropujjqv}ummyytqnjrxmrywvfnfjZdZipYZRZjcdfafbjW]uofookouol|ticl}ukpqwp\hz|~rwu}yqamjVw}}vsmx~{}}stvlozzu{~xw~v~~|uw|oyvs|tlxjjmomnm{yanddfOYwxpunk\u}v{~is~u^gzpnwr|unx{ztzwwvy{~oklr}wo||nnso\NUanssvx{~spl`e{n]fsnfgfjulj|~~orrkfapz`c|vvxhq{|htwqwzoq~}quugkrik~lhxpqmgmploqqwzxyyy~vmmfdfsx`Xehkm_\ddpxldfcd}pVk}jWgqljatwdppYZ]bs|k[dtrhiz}{yywtwrvy}zuv|rksbzrzux|wkotq}žźĻýýſº¾ŻVUW[UPOMJGC@DHGFC:6CVJ3+07@A>><;;;<>CLNLE?GX\_`cbVPPSZecepg`fb^^_cmyyuptpsglxuooryyspmhfmrplgdhsvmgjgbcdimprrrpiinqnnmhiorsafqeprqurlgdecckspgfsshgkkglokfbbcikgopehljd]Yah```bnyvsussiaiigplfjicdlg[_]dnfdmtppj]]i~zrytvztqux|zolt~|ojkkmh_bnrqolpvx{{u}|joumjkptvwuuwwvuumq{|w}}|wxj{}vt~lnxsrl}~{~xxusafoap{wvUiqkxqk_U{w|l|~zx~~sl`gyyurlzodgao~vxwrw{pvvjssocxjilkpsZ_Z\enbObw^[qli`L^ogdYLIR`ueWQUfhXVXVYXQMNPVOP_ahZJ`kjcp|gl{zomcelqfVgtjmz{yYTtiepUTjmkhmpu`ipjZee^rtuisxgpgcnenzrnx|xmlqbX_^`YLYcZh[SIPe`ltqr{rnu|kUl[bfMPPU_Z^kMFEJ[dTYaiuwnio~xkkkmq|~ihwzkemwi`dd^]hlddmqgb`_hcehkYWi`WJ`rj^XedVY_b`MEWQT[OHRhp\USU`bhSWjmO=>IMKEOj`}~japykUR^dg{t|w}|}}zxwu{yuytou{}zwqpmr{uek`ixoe``iW`{hu[LseWgtmYikwvhKMZf_W\ohEDD`wTbhZ]_TV^a^Xr]LaunpsziysvcY[ttprrxtqYe}uspsf~l^jVds[pzwslcnxuukpa_Wdqcvblmefmstpi`m|e{xszptqp`M`{tx}~{zmy~z{{zzsyzvro}{~~yx~}|{}voix~uv~ywvkhogg\ow`e`_k`fm\]_cSXsskojouxqjwqgeo}pvrswcj~~~x}yyvxho}m\{x{{ioz|x{zwqpu|xwts~|w~x~zxtwm|w}jgj{rcpfo~m`j^jaM`~snuynev~u{xkq}u`_xnd{oxvjvwvs}{ywzxx~unps~y|qwqtg`ipwvuww}}soojbfyo[gqniilpuot~~rszyxs|ge|yzkrzlzt}||wsuy{xruwqx~lu{mnlfjplotw{z~zskrmmlv{`Ydagp`Xacosf]b`dxfXpwaReplfatl[niVXWdwyfXcsnfnz||yy}wvzqvyx~rr{qivcqtuz|quzu|}ǾݼĻÿǿ]]^[PR[XLC@BFJHDCDEQQ:++3<=;<<:899:?HLJD?@Q]]^`b_SNRV`jcgrgbh_\^ahr|zsrqmthlxsppryyrqmgekppjdektvkehebcgjjlnprpihlkkniekqro]mihpootrkefhcentniitlcgjffklgdb^amjgvqbhni`XXbe]_`dowqovtpgcjfgrmijcbdkcZ^]dicfptmkf]bnsqunrwsrw}uko}xonhgphZ`lmjhiqwxzwvxipxokjptvuttuwussrv||~{nwwx|ztwpj~{zqr~jkzxonz{~}}x~~zzmxbkomvwnw\_nnnveoUs}xswxjkZ^wvnkhzoygc\owv~y~{swoszxpx|mrypanibgxnntY^[[bi]MguUWohbVKdmdg~UJCSbx|^UMTdcWTVQRTMFGNSKL\`cTJclnqvda|oe`elpi^hvoo~|x_Rqpht[Xegienro]ordVecZwnnfxperbdqak~ywmgw{wkqygalhf_Vgnfka`Oaqix{lt}i~|bfhXi_IMNW_UddIFEMdYMVckpnihnwzqpioouwhmz{rnl~xljlgdmrkdglhecfnb]dl`Ofd_KVil^Q[dXYd\hYAUYVYOAG\gb_URfjiWRbnQ:=DGG?O`Z{cbovnVK\dg{uqzs{}~{{|souvp~oouyx{}slkfoxtdfa`spd_[fZ[|moz]KtdVhqo[cjtt`EJ`ka\VkkDAFdxUbh_W_RX^]VQqVNfqijkvmxwt_QZ{ryljtwlPrz||{tkztqgUgznsvxx}mhmx{worcjgjjjlnuhoq{xwkgm}hukqktor|aM_tux~ww~~yv|{}z{w{{u|vhr}wuy|uwfglgpakwhlifk[cuVRZ`U[tuoqhs{wntqilup~txmf|}{vuzpqw~rg{~u|{gqz{{v{}unt|~vy~nqsq}y{{jz~~tohx{^hlgrvdab\m[Mipjuvpx{~u~~}wkp|ta]sl^~pquessrp~{xuwv|~{tuv|tv~ouowzzyzyx}zrrpmigvtdouriht{wt|yzokz{pzwr~o~vxz~~}}|s|vorqlkroqy{toxurp~|_^f]eq`U^cmmaX]]eu^XpnWNbmfaeraVneUVSh{r\Ucoiequwy{{y}ssxv}ro{pkvdiuw}vy|~Ƚɿĺź¾ľɾccc]W]aUHDDFKNMJKQRS?*+39<99<96787KZ[[`a_\QOSXgj_grfdh^[^clr|zsrpmuhlwrppryyrqmecipqg`elssieeaacihhlinsphhigjnfcnqolYjkjrmorqiciidjrqljjqf_cebekheea\cljpzkblme[V[`[[b_boslksuneejejsmmi]_eh`[^\cdaiqrkhc_gv|orphqvrqx}olytroajtcW`kgggiqvwwuztkqxnkjrwvrqrvwsrsw{|ywqqstqutqtkn|{z{|xplr{ljxxlnty{}w}}}z~z{|xs~{kwcqorw|htfTgwhvbvhpuwuv|{p`bZVorfacxjok^Xlyn~{yz~vzlntupxrn|vu~cfi\cprirY[Z[^bZNjoLTnb\NLjici}tPICTd}wUNHTb`WUSLMPIBEMOGI[c_NKfqtx{hVxz]Ximokbkvmr}veXoqkud`bcdeqsjburaTf__xtehiwgfs`ho]lxusedutrlvvdpxjigiotipjj\qx{~xkx|gwdydhoYNKRSXTfULIMY^RKUelkhhkp~|lnnmlswnryuqsn|sosrmrqmgfdfeehum\XdgRYfcPP[caPPdYOf[ddHR\\XQ>BS__hWRfgdaUZjQ7GEAF>QXX~bgnplUK^bjymsytz}ww{{mmqqjympu}vs|woigcmqre_c[lucZTcaWytis`KsdTfjvr]`glm]CFbkb^WerC>Ff~^bf`SaQV[[QLpxYObmefhopru~nYI`zjqk`{|w^X{~w}nw{}luk[djyw|sqivxsypvljhlf~xq}nyv{w~lplstemhqmxufN[myv}}}ww~ww{z|}~~pk{|rx{wyvtcejhsijskpfgmYYw\HRZX\v~rwi}~tsrnt{twvvh{~uuxzxomyzw{{x~~ndrx{ztz}vrxx}y}wktsrt|yz~}|{sxvu~tn|c\jcith]`X_kZTp}zojw~wut}wz{~zik|vc]omY|sorarpll{|vz~ovpz{}y}wlvt|zxy~}wvsroiu|sz}shqu{~|o{~{y|~o|zw}xwx|upvqt|~uv{wq}chi_ftaV_fmg]V[Zbo[\shOK_h_\lszxWTm`TUPm}fSWeideqou~}xz}z|upwuxtn}pnrji}~y}}}½Ⱦøƿ÷½ǽfed`aaVHFIMRTTRQQQRG1*3:;;:<=85249AGHFAGcdPAVwyyw\hmcmrokdu}lvj`yvgz|gfgjkmvxmvn|w^Vfell\XdsgXeoegfbqmlfYajhnqsmjzdipwvskmvoqxoqs}tho{}}tknm[]\SWUX[k]V`n_Jbdfnpnmv{yxnptltzrvswrouvzuvvsqtoihfefckpd]RW]W`bYMPXZ\QV[LVi^gaSS`_\E:KceTgmhd`f_UYM?>:716;IWOQ[QMDBHG<8>@AUs^KOmw{sxwi|wqtkfo~m{rgqwztnmontvstjwt^bmj_XTUdeYWake_`hke_YV]]ck`ijmwi]onnlmmgjpmdfoujehnt~dgtn``dc_ah_|j^uXTtojrrmmx{zsovuwzzv{pqqrs{yxotxlqxykllliklh^_eWDX^_^LHPV\ZTTQUoe[gTN]^o]AF\j[]hv\_hrVQPRUPTRSJK_rk\[XgcQS^rwlc{wungQk{qlYjpqfrqv|~z|vnyug^W_klf^P^idne\SGY]_n`UWOly[LWQRf^Uc]RZ[ET]`qbcnJTglWGO\aeZ`^\o`LFUeaohPqulougqlcocxygqrrjotvuzyz}izzx~pqrsx|xspywtzp~x~~tzzx|zt{}~|{z|y|{{pks}kdn\mhYQce^`c\ZcbN^pr~z||yz~{zpv|thjutejvt[Vdipoijoic[Zcyrhdqzkuty~rwjm|fe}y]leetahvnnyrkorqlknkv}|~qoebjg\nsctn~qtsifmvulntyv}cenovieqmwvavr[eslcdcdazgtlW^{ocdq~eqllvg~umiz~{y|~vx}t~~~{~~~v{}~z~|{u~{wyne}b]pcXZ^_^hwj\LLYWOjybjpQQ\IFYnvZQ_^\YdiZe}tz|rsqyulpokkodwyolossqwyûÿ¾¾üƿ̿ÿĿbbbb_adehkgghe]ZYZTJIHOHBABACBA@?@?EIGIQSTUZXXYZbb]_rm^fproh`]aahmoowpfhe^mrnorwyoega_aeni_[cif^\^]axo_[UZemic`]XYmi[`dgi\Wi{pcachog\_mopndigkpaZ^`caWY`]]_biosqkegldX]gXVkeUXeofZ`osjbeafvmlucU^aWW`\Sckekh_dpjchfci`cpnrpnwxsktx|tmzuggouxtmghmmhhntskhomkjmollnnnrxusttsssqqqqovtmlmmsxqpkrphrqlmnmkpmo}{wnnkjjq}tqow}uzy~{}}z}~ul|}zsrl}|ma{zrostqit{z{v|l^tuvt}prw~{~}xi}`g|xiqy|pQ8OZVZM[ehej]MWbyv}g`lrgZdwteifb\Qd`GM_ol]bZQZaVKMZlYB]eKL\ic`eowWBKZ^pz`D9Q]MU^QRJBFF<>?Dcv{hYQVKhRNQAV^aMENR^_X]U]lRUS\fevjTvmjnlizcbhgwldoqvpbx{nkwz~{uwurmuo{|~r~tnulxv{}szyy~}x{}{|~xxz~}}z|visjvbijXZhh]aicaZh[duu}{|~{~zyrtwytfgrschts[WcajmdimgaYTcvl`^logqnu|qsimw`d}m[h\fl]ipkvyeq~xmnofefdwxx~}|}{znjol`txg{u{srqdckrqjgmxvxacpovgeohst^orZanjbcbbc}zeqjV\ulagjhlgjwc{vfd{y{x~{xwyq{}}v{~~}x|~}~}|{xz}~~{z~qkeTiiZSZc^d{jXSPWQQos_hnYRUHDWqnNT`[YYffXn{sxzlfk{uiomfjmhvzolmrvz|t{¹¾Ź½¿ż¿Ž̾aaaccbeknjilmg`_ccXOTYSHEOMGGDA>>DGLLKQVUTUXWW[_ge`bui`mqrph`_cbimnnvobdb`lpmoswxmcfa^afpi][aec\\^]e{n\YTYekfa^XTYpgX]bgbZXk{n_^cjlaY_nnqjbhgon]X`ce\PW`^aaaissjigghd_bdUYkaU^hiaYansi^bbhtjmu`Wa`UZbZVglhjc_gne`gcadcgkoqilutokx}vro|sfhurmhmslefkushgokggnqkjnonsyutrrrsrppqsowtlmlnuupnnoohtrkuznqpporvz}hhjrsxynlszuyy}~w|{z~{{ttyz~{wjvu~|{{skhyqd}vosolw}wtynbuvu}~yw}}vwlfZswlds}zzpO=\\ORNgfcam[JXg}{xf\fqiZ\kqebbbWPd^HO^lkZ]\X]c\KQ\l]Ne_FQ`fdddtwPEP_`pz]<:\\I]bT]QCEE=C?=V`r\Yrw}vztux~trxa]{tp{~yovz~uusrrws{pjxphql[RQPSYVOUehYWdb_]UTWRRiaY_lnfc^]b`bj`\di{d`gphRTeoyncdexm`flfaiofsqipwd]shgqignt~}wyvjrxpz{{lrffijk||trnljxxiokrpovqh[]`XTqk`[FEQWfhWNXyrW]iQJT_z_SC[b`xpjfk_ZWSTV|j`LRfj[RSRc[OP^zuglusyjSDfyzh[yhigoky|wz~u{xg_QXbjf]Talabad_X[WYebRLQjnTOKGC`hO[ZQTeaQ^bsb[gYCFamokdPPHgULIIZVVIBLJZXTYQ^gOYkjjmzm\whdf[tzYedr{wzaaoryufdzdiv{|{|{gij~r|}uiqhstx|r{yy~~}y}vy}tuu{~y~{r}sxrimceywbfsin^ilq|{}y~|~}~xsrrrqeeprbirr[Yb]gk`gib^XRapg`Ygd_ignvmigon]i}}b`bWhb`hmiwqhy}enii`bYcxnr~{t~ztrrozp}|uxpmfcdqngfiuuu`bvqwdckcor]mtY_jhbcaacsvckgUXqg_jcmebjv`{u]c}|ux}{w~}|xwvnt|{yt}~}}y{{~qsz||~yup`klZO[fdb}sXYUTOYtlYit^RQFG\oeIXeZVXhc]wzpvrg`g}vemjbhkkv|nkkry}{z}¹Ŀýĵ»ɾû̽abba_bmsnknqlhffieZ[ebUT\VIEFCCFKRTNLSZXVVX\XY]dlgahshhnostj`_eeinokto`ba`kmmnswwlad`^`gph\[`ba[[`_h|lZWUXchc`\RQ[reUZej_UYm{o\Zbii[Vcropfafgql[ZadcUMW__cdaksngjhggfcaaX[i_Uajf]Zbnqh]adkrhpt^Zb^T]cZXdkih_^kl]\d`]bfegpmdlrpmkw~xx}lsrgo~}somstiadlvrgjqj`dprjhnomszsrrvronprsqrzumnnruqqnmnnmtsmu|pumqsolz|i`pvtysmqvw{~{ys}wv}~uw~w~~xontyswzz{wxzi{rq{yvyz{mdz}o}kxkz}~~ywzpntxv}y}x|}up}wlniten_ezvn~zlTNb^QMXn_dluWJavy{|zhYanjVXchd^acRRc[MR^kjWX___gcMWamc]m[HXfhhhevpMLV`_ryX>JkaOgjYd]LJJ?E>Cflmgesxzuxvv|ysrsa_mnz|}pr~uuxrov~t{~llxqsvgUPRQPPOKXg_TZ_[^ZUUXPPhbY]qp`^]]``cf[^^ns[_glVIYhlp_aYisj_hn_Ygqdqtikmc`la`peeotx|uvxgkwoy{ympf`chdv{oplklzr}hrirrlysniY\_Ztil[]HUS\jdQJqy`Yq^GQ`wh^NIvelqvibe_^TNjj`WXeeWPMRcUPRdytlmoqw`GAexzgc}djfmk|u{zz{whaUV\ff^W`lea_ea\_ZV\c\OPinUOLHG\jPVUQS^kU[ereWc]JK]dckmMFGjWHBQXKRLAEGSTPNUed]]zosvmbsad^J{{Rfbxzvy]`tywsbhxbkryty[lk|mw{vhmeq}}~st{r{zz}}~w|rq{ssxov|x{|pzuornylunhx|q}z|}yrqomnedpqcioq[\aYek_eea]UP`mgbX_Z]c`hombfng]m}s^e[Yj\`fhjqmry{w_mhd_\Rjthp|ur|~vvz~w{~u}jnga^rkdghurs^f~zuafkepoZlrT[ie_b`_bipaidVXqb]j_qa_kx_}tXhwnwy|~|{~{wy{yytjnvv|ur~z|zt~wwy|~xlnvy~~~z~|rro_Zfjphx~\Y\TQewhWixg[PEOciYF]fVSVhkmzunrlc^f}taghafloz}nomtw||yw~ſýôú¿»ſ˻`ab]Zgtojnqnkihiijhmlb_ecUIGJLPUY\_ST``XW^daYY_hlebnqgjkmu{j``eqjopip}o]`_[glmkowwk`b^\`gpgZW]`_Y[bbfzkYXRWadb_WKP_qdRZil[TZn}pZXae_UWfpmncbcgrk[^bd^ONX`bbadooigihhjjda`Y]iaZcke\\fnne]aekqiss^]b\S]bZZbjid]bogUXb\Zeg`eogblnkmltxrtvlgxqmxxrpqskaalwxnjro]Yfsrhgmnouxprvxpnnprqnt|smoqvtoqpoonoqtntywvttxmsyz{|pbevwtsoppwy{w}ty}rsz{|rs}~t||}ynxmlxtttsrrt{l|sqwqmy~~vl~vllw}yoq|wr{s}z}st|wkq|phyvs_pxbZmmtyig^ZmRQbj_uvOMs}|x|{sy{f[`fkUSabaW\gPOg_R\_kiUVafalgScfpmhs[K`psiglxgMQ[eartYM^xjWovcmo[KKJODQuqgqpq|}nsyz|~unoqb_||klx{{lo{xmpvqjwuwwbowr|v]STUPLKJKZ_XVZZ[^W[_\RQljZawi_`\heca`^]_][^f`HJaghbWYTlifbgj[T`kaswehcagdY^ncgopqzpuwffqv}yxljd_^g`p|jjielwiwhrejnhytsv^]ecvpo_^_\XTbk\KdxdTmhKOctg[YIv|okixt]gbcXRxgc^Zdh[TQ[_KWYgx{lgilpV?Dftufm}eibnm~}qzrxjge_\_e_\_klg_bfb^_\]dc[Wfo[VPLNWcRWRXUYk]]aqeU]\QOU`TckNBEkZD@YTFUPADFMUKQjpsdnytsliq[cTPwySiey|uyVa}uo`nreno{rs{{z}euvx{in~zjieqyw|~ypqyr|z{~|x|qkzoro~isz|}x{{|xysys||~l}x~z}}yrtnjkbgooefop]_b\gj`cccaQOchbkYWW]][aolWfp`]m|j^jW[i^bcenluywxy}lekk`]Y[qijp{qv{~{|y}xzdphcaqidffspqZrrdokkvnZjpQVha\a[]abi\fdX\s_^lan[ao}`}uVnuzjwv||v|yzzsxwuoohl~}povqs{uw}m|vos~vontxzwz}u}y}}~zqnmprut|m^e]\mvo]hrgZIVggVKdfRRWjyytoosh\Zezs``fdemt|twpvv{|wr~~x}~øŷú¸ʾüʸ_`_^dlnijppoidfloruqjhibWPQTWY]eggd\bg^Y^ji`Z^eiibhuoiijmv}j^agvlpphkxnY\][cmnhktvmbb[Z_fogXUZ^^WWfef{l\YNV^baZNHUco`P`ogVUZnoXYbaXT\immkabahtjZ`fdZJL[ca_^gsmfhhfjmifgaV\if^cje[_illc[afkoisp`a`ZU^_Z\`kl`[gk_RW`XZii^akcckhglmrsnqlch{}stz~}wonnlhhoz|pmuueYcktmceklptqpx|vooqrunls~qkosvqlpqpqnposnptxyxwvnutsstxmgvzs{wqpqyw~|q~{quwoswuw}pq{z}{sw|{z|||rwjfxzpmkkjhn|jxwzpnsmgyywpw{{z~unlfx~p|~z}rry|phvwlpzq{SrlX]x{bx}~t~c^lL]gjppJSvxz{zztwsxmb_a`i[Ra^_U\lRJij[bdogSZfjerk\plywpwXQk{zjksveX\bgaovgaps^uosuaQVZ]O`wo{vp}{kw}z}z{}qmopa`|xegwv}wilxqfjqjdvtyj^swt|kWY[WRKFHQWWZWW[^XUcc`VYtn]otejd^pk^X_`XuhW[^cPDSdd`UTMXg^cigaZRRc`sq^f`[e\R_l`glliumwviim|vukfa^Zb`nzfedbapdphpbajgvttydahjn{jgXig\[[lgU`tdOelXLdpiYdRozqxioy]cgd]`zsji[Xfma\Y^RFb^i}~ef{_ikM8Kkoogt}if`on|p~zk}{kjpng`ba]_jnmeafh`[adgeechoc`_VUY`UYTd^\de`YkbRUXPMX]JWgRBBg]D@\VHZ[JEBPe[p~utx|xskolScYUzvTnlvztwPdwibppiqlw}zs}{|~n~u}z~{z|q~qrx}pifwz}}mdeourz}molvpyyxwy|{}z}pbukoi}cpvz{}|r~}~~{{zzk~z}{}~ztukgj`hpkghwtb^cdmicgihdQTnebx^YXUTU[scQlmZ^jxdhqV]edecehqzutqzjljma_anocns|q~~{v{wverjggmfedgskm]}}nnwot{q\foPQc`Z`[]`bi\df[cx[^rdiXgwf{x\swxjvtz|~}t{wsxuqxutiiei|zliqovys~{u~hywlt~{tuwyyx{~syw||{}|xwvx{z|thnpnsv{gjwspZ\lhXWkeSSXn|ompsh]\g~|f`mpfkz|r}z|yzyss}{uy}v~¼¼ȾŸº»ùɼºǷa`_ekjhjmnnmgagsvrmjlnfZWY]]^ahrskfjlc^djni_afhijirxmiijltzi\bkyprqfgrlYZZY_oqdfpundbXW_fneWSX^^SWjfi~m]YLT]b_SIKYfl[Qfp^UX\p}iTZa]UWdlhlf\`cotdZdg`VIL^b`^ansighfcjngjl_TZikaahe\aikmd[chlnksnbd`YW_][^`ln`]geYPV]UZhf^`ecehdeknpoplcelx{stz}|tjlmouy|}wmt}q_^mysebgijmpnu~znmruuwpkrzrlqvwpmnprsnomronrtvxwnwyorpmzvsx{uy{pmqxsyps{ylov}}krumpznr{uy~wpuyyyy{|}y}ihtzqhdccbi}xero}}rkilkl{|~pwu{yrul{czju|yumsy~rkhuwqutofOsw_P_~wZ||pYaeIigpfKa~svzz{uxqqqqvd[^cadbV\^_U[qXGevfgiqcUcnljyrjyvzvwUXt~krzxmf_ejcq~vswjxuvwe[dkk_q|r||r{zh|yw|wxwliom_bzv`cumushktkefkfbs|ruv_`tssr_U]^ZVJBLZVX]VX^bRZn[f_h|pfvijw_bsh^VgYanY^Wd[DD^a[WLLH^\Vdqd\[OO_]lhYe[W\UN_f\kiearjyvnqm}zrrkcc[TZ_nyeed_U_climc]ggmrvvhhgjiyje`ijhm]ekcbmfT\ccP`ek`h`ntq~ocs^YgjejukpkRUfqhbZWISietx^noZjeC_jQjo\xz|~}{~{esryfwpv]cY}lz~pd}fsfq{k}xp|jsrb}vvjksujob~v{wahurvwnsrsrlx{wmocu|qsv|zxnz{w^bq}zw|rv]Zibojryvudy{`bqmeirq}tor~}rmmnkc\c^fjhq^_ej{zp~{{|uyw}}~y~uw{q|vxvquxkcpit~wsyqwst~{pmqrw{~phdd]cw`\np_`]mlkv]lt`fi~zo||kilvx}|{uy|y|~|xwulpuqifbgniimnxw~ujsg\`afguuk`sov}|um~|~~~uxw||sozynslh{zdktjuxvx~st}kv|y~~s}~~y}~wny}wuy{{||wrvxz~|ymnsxpdd~|}z}sz~z{z}~~}|}Ŀû¸Ľźȿcccddekqmd`cfhgdccdgd\^degiotxussttjdluywrqollnsyywohilkmuvgeplxyhda]hkZWUQWtw\agkldYNR]hi]QQVUKObqgmf^WHQ]aQ?BR]hhYgpXPYZdqeQOVVUU[`]ac[\dgh^[hh[XPMYec\cpqkkjf]eggrk^X^msf^fgehjhknc\bfipvskih^Z]]Z^_bmhX]`[PHOPQY`b^[cngX\cabda\UYbkvvqt{ufhjluomrupq|t`ey~tfafkkdewxtsmmwyywtqppooosrnmlnpqmkjpsqqgkqssqrzrpmltwxwzzusukipppywpvpry{|jkvwnp}j`nd_honrxo{sgowwww}zrhq{xmrxusiWTT_kkX^meZjhhe`iu~|vz{zxfkzzwnkvx~fpyuls{thvm__pxxqtsfhv}zqxr`Rgpummgr\ARpYFNjqKOuoozwej_^_lyqZtzuqpxz}zxjgoulbniilehrd^pa]iamrhYe~tzuls~yw}{~kdnx}{wrhuux|y~|}zhkzwqrrszvk_gqhpoeqo`\da`aokV]gYmtgf`d`]g`acdkk`XWbb^a^WY_drkO[pecqpfa|haptj{wsrrq{o[|uijp_ubajZ_R<;_]OE?>;OOXcbWZTZULLRfaNZ^JNJN`Z[vj^anl{t|vmnlmSMNQ[fvUYVUHLP_mdbSSWOXoe`_`c_cc[ris|u[_lbdob`a[X\efhh_lzqqtl_XVWkd[\`mfMSapY]WUlzhlii~kRgcPHbb]dtsyg[c\mh|mbrums}qhtywy}}|{t{{pzw~sit|yxx{svl]Qn{iml{hNM\NNik\Opyovu|s~w~ooswps~]cZyfspuuwjjzlxqsovulb{uu~hgpthy`nowmdajokzgnikngtyucjdn|yrp~xzzqyu|b_hw|vzqq_Vi_fgoxqrjwsZapm`hos{{}hlwxjhjibb]aZagcn_Xecte{zo{v|xxyxwj}trsmtyocsoxzst{{{~torsxmqqkjx{bnypcgfuwysexoinwuv|kcqszxr|x~~{v~x~z}|wiqytjechlemtvy||}zmwthjkqpyirzwx{}~}x}zur|~vyuoz}io|pwuvt|tt~nv|xx|~w~~|tz}{yy{||{xtvzz|~yuu}}vnk~~ÿſþĿ¿üźǽ»aaaceglnc[_hfc`_^_cfdbcfgimqsstvtokhltzztssljpsvxupiejkjnvsiqqfw}iaa^hl\UOKWzyX_dhjfVJP_jh[PQTQJQfrgn~b]UGP^_L@HU^gfamhTT\\gk[LNTXYVZ\\_]U]fgaZ]gaWQLQ`jd\fqpknmc]efpsd]\boobaeegjhekn]Yddgrvnhhf]]^[[``akeS[]VQHPQOWbcYWeodV[`_^^\WQXdovvpsynhmgksmjnqryxb_t}wmfhlnkgsxnqojtwxzxrnmnoqtttnjknqpkiloqrrfkqrqpppuqmjovvqysqrnmmkmznnpokt|tmm~veqxfanedfjqqxu{pfu~tvvzzpgowrrwxwlYQTbmjW^h_Zeagifkyz~swkutr__u{oairq{|blwsos{yjfxzc`koqpfpldgwqtsuptXQ`rtdfekP?WhJFLmhHRsletueeYX\pxzvd`nu|krv|ts|necmnv^mhcuncli]obWigpqgYgy~r~{zziek}u~vyrovwy~wx|ywwkkvtqvpp}qtdXm{meo|hcok]\`^^_ngX]^Wnqbfb_X]g\^__gh[WX\]ZZ[YY]`pmXfseezzgrfukvg{pqsnvidvktpi~x_h`]^I9TiSH=A<=IRfcYS_OP_PKOc_IR`JRMQe\d~keelt{}sz}roprmOKOY[buTTPOBHM\g\YQOQLSfaZW[aXd]Zvkopo\bg_ij\^eVY_cgpeem~wmpk^VNVha[S]jZL[u|]X[V_rnkydgm~_WiYSVmk^eprsa\a[mnzzkctuko{{cyz}x|r}wpz{tx|w{wral|nlruy]\q]Uqoaxis~}rvssepa`_vanqy|xmauvirkswni_yrv|kanv|kw`elrfj[`kfvdjbehcq}wnXdckxtzm~u|}|ylz{~vg^btwwxpkaRi]bbkrmpmtiW`og_iiv{xggotddhc_c]`V^d`l_U_csa~ymxw{vxzx|sepnqitzrctu|{uwvrt~vz|lwzvy}g{ymqr{vrrryt~}j_xqyvoyz}{yy|xx}}~~~zygszymceiifn~m}z{n}~wp{yvrw}}wz|}zx~|y|ouyyy|vr{utrx|vx|~}|}~}~||{vv~|~~{x|zvwþ¸»þ»ĺǹ¼aa`bfjjd]^bf`][\\^cfccfhimpssqsvnddit|zuuvnglrtvunkjiihhqvtuyndzocb^gn`TKGUyyU\cfffTGM_kgYOPRMGRgqhovZZSHQ`\FBLU]eegm_T\_^gdRJMV[ZTY\XYVR_gc[T]eYSMKUenc^jnppml__ejwna_\gsk_aegggd`jlYYeacswlfic]`_Y]d__ibR\_VOIQOMWc_RYhn`T]^[YZWSS\jsttsstjkqimsnhjrxwiZlwmhghondo{lltnosvz}tkhknptxqomijnonjjnnptykmnronosxojjnrsu|{sprqmhgmwhmlkkv}qrrzodtvikumokkts|{yjezpyyyxmfmu{vw{zsaQYgjh^ebYZb_goqq|xz||zwphmoo]Ymzjakrm|yblqtns~pcirm^hujfgan{gckqiqvxesoSOdywoacddG?[`@BIu\DVr__sp`]RRVtysk]jvgryjswyniy~e_d_d{_ihbut]`k`lgWgloqgZi}rvvf`i~|szs|rnoqu|w}uswtqvmirrrqunmvkr_Ss~rhdpv^`ofZZ\][^ldX[XTmm^de`UZfVWWZd`VYVW]USYYZ\^mpcnrek~zhlisnuhpqjx{emtpzjr~nbi]eXENk^SA;E9AB`k`RVUGSeQMM^\GNbSWXXgalnkei||sy~lptwkKKT`_awVPKL@FM\`TROLOOQ^YSOX]TcUatnjclabedee^cdX]bditbdp~|kmi`RIP_fcQa`NSm}lXYSUeqgm|banzZ]cQY[qqaglojY_^Yrrqwjfytilwa|}||y~{sp~|~zvh{vomssg~z]ukyw^}ky{zjizq}`ci\as_mqs~{tucqy}dtmptoi_vpt|o^puynob]jidnXYfdsy`c^`bamvrhS`ahps~kxn~{p}hv{{v~|o^etuvumfcNg^__gkjkmqeS`m``eeuzpgceqcbf_]d[^Q\__hZPWhyh~urz~~w{wxmboknds|tbtzwux|xtt}}zyp~{jwyzyy~wj`~~tyvow|}z{{|ztx}yz{}{y|mt|}qfmkjijq{}luzz{uy~~u|}|~|yu|{{tz}x}|~~yw{~z¿üÿļľ¶½Ŀ¹ĺ÷»dcbdhie`_bb`XUUY]`cc_`ekmprsrsskebfqzxrsvmfipqqqniijjgfkstxxee{nb_]eodUHFRs{WYadddTEI_keWKMQKDRgninlSWOGSaT?AOX^efjjZU``[a\LGNX]XQTVWVQT`a_WU^`SSPRYfk^^hmqnmj]_guveba`msh``ckhca`kkY[e^`rvkhhaad[Wcg[_k`S]bWNMQMLU`YN[mo]S\[WWWUQSbrqprpoiamtkorhdnwxn^buzqjeeou^gslgvsnnluznjfimnqwympniijkjkknlouzmoqtjiouqghilnptxwqmonjefmsgljlpw|qwwtkixvnuytxrpvy~xik||nxvtxkakt|wzz|{mY^nkgfueU\]^i|w}yy{uxv{|x|ykfikn^[iwialyslxsbosthrhbnhiasze^b`nracrigttjeyeTYn}npdba_CF]Z?@N}PEemUahh\QKKSssm`[sqfjrjpys~tbtza[eTZwfc_\s{[Uh_ilUkseofYknqsd\h~}nqt~mfjiour{sozogspelpnkkzngmfr\OyumibroV^jaZZY\X\gcVRSTliXajcV[eRQRV^XSYPR`VNUWY]]jpgppgo{wi~yroormfllk|}teu}qw{lzxgefbaURgdZX9?D8ALqdYTPFMb[WJEVYJQeaaa^nkvrkah~t}{iryzbNR]cdbuWJIG@FO[ZNMLHOPMWQMJSRSbXetrcZigea_bidf_d]fdls]]phigcKHJYnjU_WN^zwb\SLXelhs\\wwRZYTa[sreiilaWdY[xti{ik{qfgsf~{y|~ts~qz{xhq~r}kix~la\t}|wcbrz|okq[x^apck{rl}wol~zppwxluqrvujgi{q}w`qsumjh[{lbfo\Oadk|s]][\[`lprcU[`cit|{qti}ul~lu~y}uywt_f|vtupkf|kId^]\bfhgjraNbi[aaftyxj^__ob`fZZgZ]LW[[cSM]xxzn|~|}zy~~|zvh_~ogmdo{vbs}~vvr}}tzts{||~w}rw{w}re{{wtpv{~|y~~}otyuxz~{y}~xy|}uovqoqgzo}~|sz{|yv{~|~{{}Ŀÿż¼¹Ļþeedefeccbb`[SQSX^cc^[]fmoqturtre^fpyumoumcfooklmjhhijfgqutock|k__`eofUHGQl}[X`abdSCH^keVIJOJCTgjjlfRWLEVaL9CRY_gkkfYYc]XWSFDO\]URSSTSPT][YUV^[SUSU[gcV]fqrhoe\_mpadahsmeb_fpibeelhY]bZaqrjhdagcUWgfXbm`U]bTPQMHKS\TL\np]RYVSSSPMUgpilqmib^msmokagvzqe^kvokg^dxi^ipensmlhjwvfadjkmszwpkffggeeijmkovwoqtogkqpidgikimsrqnlkgecgmphhjpru{tuttpo{urwywzspw|sju}wjqqrxi\hqvzz~sdfunfso^bd^o}zssp{{u~z|~|jefhl^bgvkgipwktnbsrqdo{ebjbif|y]\^`ol[dsfjypisza[gw{nvkc``KQ^Y@?[sMPkgW][bWIDEVshiX\xzmeblhn}mo~}_~othVbRQmtbUUm~iS^\ckWpw]ldXs}h~jmdXf~|hjpy{cYdbi{}povol{maqqbekidcqkhhapWS{qljesiP_e\[XVZZ\^`RNSVkcU`liY\fPMPT[TNWPN`[MRWX[]iphmnjnurjwfopjffgfm{wpf}xmww{pbdbbZ[djZeQ2F@9EerZULCH\_YU?BVZV^kkmlftu|uhdo{{wvis|x^V`jaiioWFGFAHO[SKKICNMIROLINKW`bjokhffjjX\ihpf`m]a_rlW\k}deedBHL[mfX[TUi{gZWGM[_giywV]{mMZY[f\xqfkhh^]gTa~qe}fpzibdrxyy}{t~w~~~gm}~~wz^s{fvjcnz}tx}wc]lkqt`w}[~ibqjjwtf{q{mg{zj|usxwvw~}qrmwertoimt_xoeju^MadevpZX[UX`lnp^PT_bbvvqwri{or{xu}vywtumdh{}xrrnldyuI`\]X_fhahqYLhdXb]fvxpgU_\i`_gWYhV[MV[W\TRly|vn{zwzx{|v~udZyoakfhwygq|}vw}kz{oyoqz}{p{{y~wzzv|tvizzxoyz~s~~rt~svxz}||{z||xxsuzl~t}~~}}}ty}~~}~}~»ÿŽüúż¼»eeddeeddb`[UUUX\_`_]^agmoprunmfdbnvwkipqhgimhfijhffgghnttu~zjip{k`bcfkcUKKSg|aZb_bdQCI]jeSGILHEXgfijbQVJGX\F:FT[ahkicW[d]TSMCDT^XRPPPROPTZWSQV[TNVVT\h\S_gongk]]ev~jdfdnofdabnskhjfhdW^`Wapohccik[P[hbZdmaW^`XWRFEMT\RI\pnZRUPOOOKM[hecnpgc^bppjja`jurfdglmjfbcjqbeiflqhgfhovn]cjijnswrncadda\ciilimvsoophgrrjeghijflqlkjiifddjnhmempotwrmnssvzuuyvvvppx~}yqiuxtpmopuh[fm~tyv}skkysi~yigpbs~z}{~rphvx}~pighjdgfxoidjvirl`snmfqtgaifmlx|a_`csn_ipin|os|ebu|xvzpgbk\_[SFEg~mSZlcZ[ZbSFAB]v\^V^wpdc`hfm~gdv}fv~iklUZZS\wdVQd}x\UW`hWls_k^V~y~g{~affWf~ygjjwsYU_\k{zxmlrmizm^nm_bdeb_miff_kTU{rokhtfR[^Y^XRTTX]]NNTXn`TbkpdaePLNT[VKTRL^^QUXW__gqhiljkrjk~xx`lg`abbblsqnmqoqzxk_a_`\cldag=>THE[wfZM@FW[UY@UQP]UFA>NM7HMXGDPieifiltxzvoktytxuvhgroeW[dscZZrbSWV^UUgLCYo_JOMEEMYgisTMXZrcM^S_lauxddf^geLQwpamsfqbhqhy}xvtuvtq}ulnsv}p}wwzx|rz~snuz{psotegnu|sbrwybUTeanR^klqh{dkivx~xvf|s|stbZvvZsTOkPabgmiRBNkr^ocez~alks|vxu}xz|{jJw~rtbfqeq_eXORX_cW_vZ`k^VWUonWbg_Sa^Wvuapiigboppzuu{u~i~z~v~t}wmvswxuyyzxnwvfPf{yqwsfgskqsmmnwmp~q`m~xmrqdetzvb[ltsp{~tu}}o|dykrpzyz{|vn|w|zvzw|wwy{tv~~t~wquu}yvvyptp{{~z{uww{{{}~yz}}~~»ſ½Ŀhhhgggec^TS^]ac^]\\_emmloh_XX\fjiecefggghf_[^cfebbiqqopx|vnnuvvrilsmeih_\YOUivoeeabcNCN]c[HDHHBMceahgWNMHPXF9AMYbhkidWUpiNHCET^XTSOIILJNRQQNINRLIQTSW`[RWagigd`^ejnljhgif`][ct{rkifiia]XWYbonffic^bdcfeeggca]WX\YTUVZ\OI]o[RWKKJFAH\eZTag]X^bgfeda`eeigaa_YXTS^hd^^aegga^cmnlf`immjjnonkg_ZWVZ]mkhjggiffhedgieckjhlglnjgfggdbbcddeikffljgdcq|xstusqogfolpqponlnqsnfjkokddcpvy{mdi}hesn{rr~xqmpuomvrqszxyy|wtmuqyttnxykcuvqowwlgq}~zk~zvxmlzv~qy{tqqivqYhexv|_edS\gMALRcrFC[gq_K\fSV[fWmkpepox_g^QV[]bp[QS`cdVN\dT_mej\f}ww~{s}v]Yf^c{vfljsqcTO[eurogcj`eg^rmVeeQX_``Zac`VXXSrxrmoudUWfh]XbiTQ^OHPezhMUjpw|reXWde`aZYjgabX]WScacf__^Z^blqruWWYYWYUVfe]ctw_hyuqsl_]cZ]prkbfJ_eewmVadd\XQHKQYauqw~{|y}|rqlwnpqsurwxeftn{xnozfz{adZEEG^TTeX>;GWD:DUTBE^pgachqvw|up|v|z{ywkrsh]\fo_X]ucZYW[YYgPAdkT>RT@@QZikbMMV]qaSaObiZjo\de_h\H]xncpkindrtc}{zxvortljwshlto|jv|tp}{sv~~vms|u}ssf}cdfszooquvmP[g`}wZPim|sgeqj{|j~x{}nfmingXuVehljkRBMt~eo]fx}gojzw{v}}vtz}N`tre^milfjXJOY\aQ_v^igbVTXqhUehT[cQizosqrnz~{w|zuplxy{{~yyrv}jruxxpx|wpvtvgRcuzmqoiishqqljhs|lm{k^gwvkole_pwr`Uhvmqv|vtwzzyznqdrgt~p|zwg{w|xxx~xvzvxy~vt}s{~|~yystrxurur~mwpzy{uzspwx|||}{zzvz~~üþĿýkkkjjieaZSW`aed\[[\bjppjd^UT\hokccddddddb^Z[_bdb^dpsnot{wmitzvqmnrumgkga_YS\jrphfbbbNHU]`[HCGFARcb`geTLJHSR=8DP\dhki`R]ucHBCP\\SQPHDLMHNRMMKHNPJNUSQX`XRYadeea__biomhfhfa^YZgwxmhhhki`[Z]`irnd_bbee_`feagf`a[TW^aXUX\^NOel\ZZLLIDBNbdXV_]VZccdcca`bdaff_YVVTPVdd\YZ_dfc\_mmdgeipnkkjlnnid\VSRYepgglfeeccde`bgdephhnfjniffigcba`cghhddjkdcbl~}tlmqqnlghkjoqonlmnrspeklmokcbqvu|xj_gzielnxivzxs~kl}~qogoqv|}vu|w{yyww|{s}lkxsr{{toxy}wwmv~~y{qql~pewr}xx\lgPbjKPVZ]nFM\_oYANjRLU`YupkesnxiaaUUVfZm]QG_\\ZLZfP^lhj\pxovxtz{`Sef`yvfnpqi^TNakjor]]l^ccSmnVcaNV_Z]]_a_YM\l|zrntveVdqjZVunIV`LGYw|_IWrwytf`^omdeaeqqfb[`UOahkbXZZUYenhsfSUWVSUQTk`T_xkUowrqohZceXfpnhc]WkdryZZnqjUULOP[bguv|x|x}woihqjnrssh{tz_hpj{ynrqd~t]e]GET`U_lU8DTY?@HgKEGjscXfjxxwuvv}{xuyrjbjh\]`rg^VX[\`iPDgZH;W];DX[chXONXgp\YcIedWba^a`aeRPdwpipgkmj|pcv{mytloqhapoejuxykyfqxpkz}|~{~{t~yorsx{rgng]dp~_kmyjxFZobtydPhx|zflzqp}~znyq~h}mqurfpWAMxumYkwnsm~yyx{zzxuv{gOqpi[dkhiqXHHYY_MbtikjfVQ\wcThgYf[cx||s{~qwxlpz}umyx~v{zzumnfnwzxp}{z}tfzpvhR`p}hljjktgqolhcmxjjveZaqsgkf_\kvo~\Rbxjrpxrrwwwopplijfyxryuezxsut}w}yn}tvv}xs{rq~{z{zvur~mt|pm|sitm||nvup||tvxpl}{s~}}}{xty~|~}~¿ļiiiiihfb\[`cegd[Y[_gqtj^ZVSXelkfdedbabcaZUV[^``]_jrpmrxxpjktysllqtunimgfd\\djprkfddcROVY_^HAFDBUd`_fbPIGHSL:;GS`ghhh[RgrXEBGX\TOMHDIQHFNMLKFGPPMPROQ[`XRX_bba_\Z_jpiehhb^]W[jwvnkjikga\^efmnf`[]elfZ]fc]bd_`[UZbcTQ\a`RSff\b]ORNFGTebSTYVT^baba`aabcff_WRRPMR^aYTSW^bc]Zdla]jprnjifdhnmfaZVSS^ijgikd```acc\`gbhreklbjlgfhkib_^^ejhd^ahgdfp|ynkjlnnnkjkghmpqpnnmvxsfkqqqneestowwg]jwhcdiscyzsrpzihvpocg~px{uq|}w}syx}}tqyxz~|ww{}txyz~psxsvxxz~u`kcXkhVa^dYeG^[YpW9@c^ILVYjueijpus`bZXPf]icP?UTYZO\iNXlfhhtwlprq|wfRcl_pvcjzo^XYOcualvVXo\`cQjmS]_OV`W\b]__^Qo|zwowyf`trgW`jG`ePLeyWI_{{{skfbsochdm{umc[bYOYir_QRSRVfibrw^QRVUORO[iXSdu^Tsylkm`YifbljjebZfio~n[iwy[YVUUR^bkt{|wzwyqkdikelsslcytrZlmfzxmwhd}k^f]JKc`WmkL=T_[FHYhGONrm[cgo{tuz{{~~}~}wmla`geog`TZ\YenLIcJDG[[=P]Z[cZSMfvmVa^HaXPZ^`_`b\RZdysnkfnptgjx{wu|}ezpehnh[ji_j|rpsfsfosoeu|xzz~|{t|up{rzqie}oX]j]abxi}ILklqukUdmy|r}{~~~t{~yxkqiESy~m\syu|v~o}wruv{t}zwU`xj\_edgwYDER[YOirvqmiSMe}VSkllecyykunosu||eg|xxt}uwyrmlem{}zr}{rw}|yr_y}p|ufT^l}ejghnufnnjg]frhhr`X_nndib[[hsl{YR]zgmkrkowrusjwnu|hoelsy|ncwwmomwz|w|wkoutuv~{rsvjuz|zryq{otwljzqel}~tokovir|x~|rrwpgvn~~~yvz{~y|~}~Ŀÿľ¾ûÿÿǿ»¿hhhgfffeccffig\U^bfnupb[YXZ`higccdc```aZRRWY\[X[fnnmnrtpkilttifnrtunjkghjihjkqtmhgeaVRU[caJ=DCEXc^\b]NGFKO@6?HTcigedYWqpPCFQ_XLIIDGQMBHPMJGBIPPOOMMS^aWSY^`bb^ZZ_knc`ge]ZYW^mvtoljiiea_chjmf^^[_jneY[edZ\_]^ZX_d_PR_gcW]e^]bWTYMLUYg]NPSOQ`b]___`abgkbXROOMNY`ZRPRUY]][`gaVcxwmmlgaajoi`^\WSVdkhfhid_\\^caZ`ealpdjebkjddimi_[_`ghd`__achs{xkfkmmmnoikmfglpqqpqow{uilqqqokmutltsf_kulc]fn`{phfiwgduml_^y}m~zto|w}~w~yz}z{w|~z}y}w|}qw{yw|{{qbfbhphmsjp\_Mj\Un]=;TcUKPYZtkiesv{bb[XNafgiN>OPTWT_lIWobmywztjiik~yswpYbk`itdd}rTNYVhx\hvVXrdc_PjlOV`SVaW^m^]jbf|r{xhn~thYrbPfhTTsvUNpxx~sqigwocqjqumg^a\VXeq_KKLRXfddqk[SPQQNOQ^_QRhnTYxwhlk`ffmshdjb_cpg}ygepzWa^eSQemsyzswusgg`mfeitvd`tvlTkke{unydkwb]e`RYlZ\wfMRcecUSgWMR^uddljvupv|x||wkbipsrgj^dcQisPQaEBV^RDW_\YZaOSwt^RcVP]PPZ]`^]`V^Zlyvpikspwdwr|rsyz~rb{xl`blqjWdaYgxlinamglmp_pwsvx|}|u}wr}qsoffqv]Xexea[fi{ZDZlpurdh{xryx|~|rsyWYrs^u~|{{ixkzvvl|wx}zutfUukY]aggw\>DM`STlp~tmlRNqzM]mupdtmrktwvxi_g|}rv{nsyp~ohck}~{vwmpy}uzo^u}qytdX]hwhedfovdkvkgYbnffo\U]jh`gbWZfqiv[PTzedfm`jwopzgg~nks{rkzy}cpw{~letxjlkot}yxsngt~tqts~{vmyi}~sy|yp|{t}svtkn{odjz}|fogtpmxxwxspzwclnw|xw{zv{~|~}~ƿþûÿ¿ºž»gghdcggffeefff^Wfnqtqh]]__aeggdbaaaaa`ZTUXXXXUUbmmilmmligiorngjrtstmjihlnoomlsullle`YRSblaJ;ECI\a[Z^XJEELH63AIVfkea`Y_ymJBJYaRFFHGKQHCKPPF>GQRONMLMTacUQY\]__ZY^bki\[c`XUTZdnuqljihgfbbhkig`_^]dmi`YYa_UX\^`\]ce]QYdb`\bd[ceV[bVUY\gXKPOINddZ[\\]_elg\VQNLLV^YPLLQSTUY_d`TYungqkb_dmod\ae]V\kobdkjd^YY^b[Wabalhcgbgmf_cjme\Y`cjea`__bdkzvffimmklmlhmmdflpqqqoqyxummmmpsstywlpnggnsqd[hnd{{h^\aqh`o}kh\]xwmzrm}s{uzv}~{z{}{|wws{yrv~sz~mbaesuq~vx_dSicXh_MAGWbWQRQkuejuzkc[WO]mejK=KQLV_clJaqavxtpgbaexxklvdeh`iqhczxOHSalq[^lXZtpdWNjmQSbZZ_Vfw\Vysxtsl{vea\\liWcvTYuv|z{or}phxko{oh`a[[\`m\GJGQZdaflc\TPNMLJT^TMWoePgzqhlkigjzn^hk]aqllygekvj^hnfL\rx}|{rmtrl_b]obeftxb]nwhTjhi}pnwbqsYWad[hmVe~cZfmkm`\eGWYmmilmsvmqz{w}~{z|njpx~qnyjtoRgtYW`HD]_PM]b`WVaQb|bQahR\YRX[`ZXZ\\b]x|{tnuuqnlgxnryuqgfzyuk]]oi{lW^_Wesigh_gigko]n|rqszy|uzvx{rqlcagp^Wbnzla\SevkFNflw|ruvv{qu{uq}~~z~yyxnczqf{}y}}pi{fox|mzyu~}yzyxvso[avZ]_ojr\9@LZS[ksonmQXpRlpwmqwsokyxxx^eewuuwjpwm~sech|z~}uhlx}qqj]s}rvqaY]espdddquekzol[aifgq]S\ac]dbSXbldqXOSw`\`k]dtljq]a~vfenyqfos}br~vsitxjmmksqrzppipttmvrvxzmxkz}qvy~yov{wvtqpv|~ikoq{xwcvwelumuwptqp|}`eqtzvw|zwz}~}zy~|¾½ýĽž¾¿gghebfhded`bgigchqutme^`defhfdedba`a`[RSZYUUTT^lmhfjjiigfjnnjjottsniihjprrpomsvmpof`[SVmq]I=HFM]aYXYRFCGJC46DKYknc_^[j{dEAM`]JBDIJMLGKPSOBBPVPLIIJKYf`PQYYZ\YTZ_bkfVYa[URU`hnqnjigfggcflid^\_abjndZUV[ZSW[^a`bd_XU\ca`]bdcldYbd_XVceSLMJJRedYXY\\enm^VURTNLZ_QEFJOQPQYbaTQgr^hsf]`fmkb_ele_dnj[fpld^XV^_TW``ad`debkh\[bhiaYY_gjb`_^bhioui_gjjiijjjiplbdkqppolo{vtmllmquxy{xnpmjortrb`lmkwreYX^meZlsjd[azsowoo}ys|tww}|y|wz|~}w|xy|zyzns~{vyp{uzzkc`kvwxsgn^]k_faXULN`gWJT_{kkv|wiY\RZsfiH:FOEYlfocjlq~tojd]]crxdcvwokdcikmju|TCOfmj_]bZ`szgOKfnVQccb_^tyV]n}pusbnbfop^vx_ntwtzvkullrjbe[]b^jXDKBP^c`fh]^UONNKIVWMN`t\Wssngfskd}s^epa]ntesi`no|v^jsv\Rky}|xjiqqfZ]Xs_fetwa\lxcTljj{kntduiVX`gemgZp}ggprrq`d]Ieepjwlqzqcw{zvs~yxty}{w|qproykywUis\UcNNaZQP`d_SW]]pqTSxhQcT\Z\bSSb]f^iyv}ttsuz_}motuqfcprsshZWqeooa\[TcqhfdXbl`km\jyqrpz}wyvtrmc\_iaV`hpp`aN]pxRIcez}{||rnxunovqk|ww|wtv~zpxwngxvuylkzlbsq{p{}srrrwkhW|wad]mxoZ7;MWT_it}knjUje^uvrs~woo}{yt]iaqyvrgntj|~vfae|y~xhjv{mhh]t}ttn_YYepxlheqqgn~upcghgipbU]\\[_aTU[iap~VNUv[Y]e]crqglY`|s_`j}vo]js}gx~|wzprzmhtgpmpxlsjjmqjvtrw}{o|wly{puxy{uq}zzpoy}{dsvjxwogm}fetorvpsqr~|}}[cnpyvwz}yx{}|{~z~{}~¿þ¾ſ¾¼eeeefiheb\[foljikprnjdcdefgmpga\cfd^YWUVWTSQS\jogbdffeefhjjjkmrurnhfghnutrqpopsqxsf``WYtxWHAJIQ_aVVUK>BHI=2;GM\nn_[]]r|Z?CUbXD@CGLNIGMQQHERUMJGEEEL_fUJSWVXXSV\Xdm]R]_TQS[ekomikjfeghdjpg_]]`gmnh]VST[YRV[\accbYUW\\^a_`eoo]]hb_ZYhcLFHLS[gcXVY^anujWUTW]SQ^ZKDEGNQOR]aYPXsyb\imb]afigbbhmjilje]frrldZT^[T[a^_`]cadi]RXbgf[Y]dhfba_]cijpn_elhgdfihiksnaejnnonjnzurklnpsw{}zwoqoosrstahpmosncWZ\icYn~lg[T]xrvqpr{uw}qt|{~xzr{}su~vy{||qy~vzxrz{wriuwy{kx}ztjfeou|~mqyiWldmgek\Y\pcNVbxskw~q\iUUsieH;DMEgkh}fptwxqjec]_dgu|g\iuwuafigmsp~`APfllc]]`gkzsPG_p_TdjgbmxYsmtnj}xhnywj|py|w~yosnjun`h[]g^jTBJ=Obb_cc_bXONNONWNMWhlXhunj_gscv|edul\nvhgp`ptrzdbw|xV\v}}zv~xegmmaUYVv`geuv_[my{]UnllsgoohveWYagikbevynorrxm\kW_pqsu|pzvm^{vromu}{stozx|yutt{rpsp}ksvXot\WeVSc]RQ]dWUb_fwgL\bPgXZUe]Tciag_v}~pw|tp]ykr|urm_h{fs~|mgSPrcevjVYN_mfd^Q_pZhi]fvusj~|}zwrrh[`haU_finaeWVhxePf`r}zrwkfqnjiqyyynlwuoovtokpz}tmjkdzqprtmny}ff|vgu}srxkmhvbb`ikhk`_~y`95J^T_hqylmhc{`k{{p}|yuu|ickar~xqcksg}|zyg^_}x}{hkvvibgZsxvq`YWhn~vporplstpsohgkh[bWYZ]aYTUg\m|SKZv|]SW[V]x{feUazq[ZfyrnZes}q}}~y|yur}rb}dilpsjvpheqkwtpwz|qzumvxoutr{{p~qr}{awwhz~ye{jezh`ruswqtsu}w}zWdjm|{|}quzzw~}y~}yv|{|~}|ÿÿþ¿ľ¿üľbbaekjfc`Zevvnjkmnnkgedfhinxqd^`efe_YZZUQPPR_lne^_ccccdhiiikmptrlgcfgirwusponorsxtg^a[aytRIDKNV_aTUTA9AIG92>HN^okZY_bxzP>JcbN??EHMMGHMNJEOVMFCACCESe[KKSTUXUS]XTnkUVaXMNXdijnihjheeggdmqf__aeqth\STTU^ZSTY\adc[VUWZ[^_`cmpgchja[Z`dYKHUXX_fcYV[afqtaTXSZeVR]SEEEHNOKP\\PWiznY\fh`_bfhhccimnopib_hrumh\S]_]^]Z\cad^eeRKXce`XY_dgfba`dlfjvfmmjijjkggilrhaeiklnnjnxtpkloqtx~~yvrspprprufrxjqplcYY]d_]qtifUQfuw|nku}wzwnrwx}x}whwtmqyuw|s}{xpw|xuz|~~xp}vsrhct}s|v~ouvsrgkmots{}n^jsmmqnthc}rWPh~smxsarbSskcFFGMVtiszey~|q}qhfbc_^bjm{kVd{wsujhebp}kygCYjnng[Siqbs}UB_qeailhh{pj}w~zprjk}|up}}~|y{roqr~{ys]g[Zh_hUBJ:Kd`][]daYNNXUMTHUbk^[qqp`aohrpgsz^fxn]jcbupvp^q}sQf||vs~{xbgmjZNVVvakfxv^[oysVVollmeofks`\[dglgbpzttotvwfad]px~vz}~zrjgzrmnfk{omyqlnwrhgn~tlmsulrpYsud\ddYfaSR[bSbn`q}]Kj~YWi_Sbm]frgbgf|wmw}nf`tqrzuok]s~_x}{jwjNNr|b^ryWWH[iebZM]oWbe[ft|rf}{{syn`ni_X^cfedibX_rpehkn||qrl_lmj`ipxulsslpiny~kieh~t{~ztp}\erptqyrstvzvr}]myrb{puwqkcdl`XagtjjvdfTr}mD0BbV^gp{topnhv|o}z}{u}ggnhu}ylciqe|{w{i]_|x~~ipvvgchdx|zwi_]or~vxuttyxytnkggefXYY[a\TNd\hsRMdzv^OURP\rd[ShupZZfoqm`d}t~vu}}{q|{}z~sgbfmxqrhvvheonwvovy{rxtmusrqom~ru{se}vn~|{bnl^zj^q}xxssrwvowUfgkzy}|u}ouyyx{{{|}~vu|{z~|zÿſ½ÿƾſÿccbflib^\_qymhjnnmjfdcflqyzb\ene`^\\^XOKLR\kod[]_a``acghikkjnpjebbdfnvvtsqomntwytkba`mjPKJPVW^`TWT>6BHD74?HO`qiTXdh|tGBWi]C:AGKKIFKOLFJVMBEC>?EL[aOINOOUWUVZQ^q`T__MGP\hgiifjkecdffgnmc`choul^XUVW[bYQWZ^ac^WUVWY\^^cklhcgjd`^_^\RLP``V^gcWVaehsnYTYYbi\PSOCCDGNMNX_WS`vy\P[ee__cfhfcdklnsvjachryhlcU]ddaXU\igd\d^LLZcbZW\_`fe`bcmsdjwhnjgktqiegjliacdgjkkkhmwqllnoqux|}xwurpopnqwmtzqsomb\a_^Z_spicRXjv||mlv|~{roouwy|yysez}zsnjuvuurz|souysu|~z{~uqwmnn_bsnv{qyrppvw~~{lgoomtw|}udiuuvypxpk}hRmsny}vjyoWrkbTOPR`tu|huwqxp_^[_a^_dnzpZfvurqpnc`ycpqTbkqogcWlvhvdIgtllmtjnozy~sy_s}nr~{{|pktx{vwt]`\ZfahUCK=Jc]XS^ga\JMdRNPD[gdVcqmgahgnwpu}iYtn[]g^nqqshj~~cVp~{sq|vdfjfRMUVvdog|u]]ryrNYoklhco_kqaW^einabrussmx}rce`hrv{}ssmnooomegpyfaqojgp}n^_i~tgdvlxmsl[urnaitiicSR__\jlcvPVtqVceZYrmauq`fho}nlvyj`c{wlytli_~|c|||fjymUOrubYl\SFWfdbXIWmU\f^fswb}}}uywlh]\fjjemc[dqwvjty{{{}wpmts[cml\_lsrgxpiihgtwed_d|zp~wuv~~ukr]cvwz}trunr~fnslabWnrlxvitp]bbcQXcrhbdmRbunM6?`Z_er|ztwumxq{yv|glunx|qidijby|w|kj`xynm}{ljkquigu|}xx|z{ufhol]ZWYb^WOZX`iTZmsu_UTOOZciXRhvo\Xbimqhdxv|q|{tp}}}~|rlbbnurtcq|kfoqzwqwy{ryupwqoqoov|y|ooqnv~{cd}w_vk`n~zuqsyrkrTheixtz|uzltwtvx}{x~|wt{{}}|}|~Ŀſ¾ÿ¾ſĿggfike^]ajx{pjhkokigdcdlv|{j\eok`]\]a_UNMT`ehc\[\\__`adfghiffkjdbba`grustsqolmu|{uni`fygUSTU\[\\TYS=4BHB99BIQcreR\jl{nEM`dQ<:CKKFFILMHDPUF@DC;FcZPP`eb\IUbOOGLcd\Ximebcbi||nyvYltbTefivrpnku}sXdr}vrn~rhffeNMV\vkqo}u^`vxrG\nqmcbp_kmcY`bkm_drnqllzyg`dhor~ulqqhekukfmavcXjjigkzkXXeztb\zwhpnpi^topdvod]ST`egkiiaKgpc\hZWeumlvgbnjy}}{ekttiakwiwriekun}~|d`rm_Qq}qaVhaNEQbadWDPjTWlkjs]zy}~wybYjwjeudclvywxwuz~tsnkra\elYZgrsdt}ig_gcp{m^\]bxvtptypm~qx~telicrrtunkdmzbnultk_v]drklrlgxw^a[cPL\oidxnjXYmoVGB`\dctyyzsntq|yuv|uju|v|xhhfmgayz|kyittpxrr{vs}~~~hmutdcYWcb[USSY`TgvkvZXYMS^[wvZSc|o][^aftrft}zmwtyzts||w|y}rrhboqsvalqgntzsx~{qxvuzpmpnt{uwwq}ior~zcasfvkco}|rw~mfoRmehqmxyvw||wissouv}}s{xyv}|}|zz}ǿ¾¾ÿ¿òĿ½ſffffd^[`jruogghkkhffddkv~ucbjkdbacge]WTWahd_\\[[Z\]`abffcacfie`ab^_lspptuqlkox|qjj`l{c[]XVa]YWV\S<5AEB>>CJSfsbPbmoxgKS^VB7=HPJCIONICHUPCCD=8@KUgs`SfkptaPUSG77GQRGEMQMGDPWG@HC78AKRSOHGIMSUTRQXeaX^_UKDGU\[_cfjcYY]]_gkffnpnlkhb_df\ctqgddcgg[POU^aaabehgbcd`\]_aZZRObcNIcib^afacjm`X\dlkc\[]UCHU[\``XV[`\WTTRXZUZ_cc[]chjfjuvedgggx{kpognkgaerlZXd`SOX[VS[XUW\[W^gjkkjoigpfdrwjcinsgbjfbdeecadpo`jnglsrx~wsvurmkjlprtz|w|pui^jqx{kZcp~miiir}x{ortboyzxuxtw~wkuzfjrsotkg~vvy|nolowjvgowpwsd\ko_XbkiqsbncX_kysrz[fumiisvvtlglrux{uo~{{tlworw{{xywytv|y^kvvrebmajmurrmghRMRaeWevztovppbnzahwbm|ort}uqlf~rhsiq|}~~xl~iy{wyvupwx|zorvxuw~~t}x|xzuuzpn{xvspvfdgbgadYNUBP_PQ\`ckVNhYFEM__^\bhcd`dpvmj{e]xuX]usuvphgjpuwrdiuz~wsnezpsiacTO\ctwwzxrcfwzsM^nqpa_uijkkfe^nohggbnltxeVdp|ms|urunhl`\qpkdsWhjUW`ildlbUPYmm_Tqqdkiggdmpum|y\TZW]hmiprxlFddfhhYSblqtumkyqr{|~uuZkn}mlmwymvwq[kpsxxicZi``[lvoZOlpTDKYYgX@Mg`Wmzvyltkrx{}}qhhm{qu~|~{sxp~qootu|kbdlaSiU^^kuduq|bniTf\]qcYYXeunfxrpwtemlng}{}io}jgavj~lnyeufogY`acmOkfszKhwosobfb_iwk^Y]^FL\alpd`YdhU]Xeahvz|~olrop}urty|qy{m{talsmjqzwytuz}ztwvlat|c_[T[cZgkgPO\_\ieg{h^fl^ccWZr}}}~{pejj|jow|svlru|}~yquvruj{\d~rp{{}yw{qqrvxyupolxfon~rbdf|qujfrtxwd`ePrgbibqtwo~||~~{lvtmtruw}|qwz{~|~}~{y|ÿĽÿüĿ»¼¾ɸľ¿ĿYYYXW[blqpnjffhhgeddfp~|slillgcfmqmaZcjihdb^Z`ZVVZ[_ca]XXbkh_\[Y[dsskjrumijo|oecfgylaed^[daXS[bYC:?BHC<@MVfq`Wgirs^USE;5?PTMINRPKGJWQ?DLB59FNQOLFGKNSSONT_a[[b[MB?JW[]afli\TW[\agfckpnljigbbhd_nujeillh`SMS]dgf_djidbba`_^^_ZWSZdSHWc^^cedbefb]\`higa\_`XQYb[\e]W]\\\YTNMSVV[^_[W\diidhttdefgkw|isulmmhehqm__b`TRZ\WT^YSUXRR]fkjfijcgndivuibmtqdfjececcc`eogclhdlqrxxrruurkhhkoqvyy}~uy}onvx}ram{zlikptxuumug`w}~ss|svwvurwmbsqxuzbh}utuz|wgjinxgq|cquiwu]Zmo_XaobypegVUblvyipkYorjgkrrrqjaitpyss}{zvmrmnw}yuxzyv~q~sinia`idirgnk`j\NR`iR\yqsvqmas{blsbjzqx}|znfotj}tksz{vsyzuiqfyqvxvzmozvqxznnmrpv}vowpvzxrmx~pm{zywssmnpg^ciVW_N\ZV[]\cjUWkQCCPb^^_bdca^mthez}mgs{aWvxspoledhruvnil{{yxtobuptmaaXRagtxzwsqbdt{sV_rlrd^ukjmqhcZpwmcbcmpwt^Yl{}n||ppmvjihdcrilduY^jQR^kr`c]RNUgkZOjmbeda^eipzmusVNYY`mkhqqp[Th\rk]QYaht{zpuxqv~w{soaji}klswrovnXyhxzz`]_e`^^lvnXSl{t]QFN[g]DUelan}sufupx{~|ysgx{~w{zxwzfsrpkktj^ZfiSaTXdcrfyswyckyeQiZXj`[b]cmdd{pl}rt]cdvcy|}ff~}dg_mzjzherageqiVY_bhVMrlOen~wi`cf[^oqaX^iEJXYjpi\bgbQZaeen|}}{|pis~on{}pnrvw{}nt}u}wfozss}utywy~od}qig\^jbd|pg[VXa`kqi}pZmkacl\`t{}uumgej}bly}jqjoozzvtwx{ym}}Zn}{~|}|~pprzv|ns|kk}|do|mxnadfxsujiu|qr^]bSulegbopu|k{{n|vlzwtz}ztz|~{~Ŀû¿Ǿǹľ½ľ¾ſɻ¾ü¾UUVW[_djokffddeeeccdlz~vpnpnlffqqmgbfkhecbbaa]YXZ[]``[W\djg^\a_Yamtlfnuohikuwfeddl}yhched`abZT]b`J<=CIB:BOUdobZgivsZTJ?::BRZagiic[YXXY\`bcdedcdcddglkhsxjdnsni]RV_gonmndgieokX[heaacd[\]QKT]]``]bbYY[ageaacceijhkjc_cpd^_`eaUPVVUTU[a[SUZ^bdb^fmkgggfeu{mozokpibfklica`[XW[`aiZSWQKQ\ek_ah`^ke^rwmgjwxkgog\cg^]hdbhabbcgprovxqmpokfegkmmuvy}ux{xu}~~xsv|~vysqsvywwxwkWtx|ztuoowqjqwhprd~{Wo~{trnns|r^dhgsmfs~hqv\mw^Zfl^RhwppyddUNeemx|pk`bnnknoip|ngcqoo~|r~myvqclgeszurwsvxhruvrqvzfhpamr[Zuk`ii\Zvovxupgsjj~f]c|xv}|esov}llqtljmnuzc`}|ahpoomvtgemupnpuyh`bcmtwqghlgoyzohrwyrq~|ytr|r^\ijalmqcc{dbcggYeiWGEVbbgb\a_cnj_h}rpspp^evwofijddcpyvwvqyx{vteptruu\a]ahux}sil`bp{ujmxhqfdqfoureZP|dZfikutk^n{~|xunwvqwtiu|jkposgX_cPOUflUYWLIMZ`NH\saYYWVMQTZgbbdPS^\lyt{j_^[jglt\WXcg~rstssr~|uqylreYs|drqypg|psy\zo|}ZKWjbbYjnjWZnrrefeT]hk\up|~o|||tv]xnpypw}xu~ut~xnpn[frr_c~xc\QeeU]Ge`ngqpqdck`ThbZ_dps]cgcq|tf|kdt^Vgr_q}kWg}gcmmrjngXV]^ssjvtQN\f_Av`ld]cv{j]Va_Rdvrh\kq[\]oyxUm|ofhear|stuusl}ls{nixzkionqwxjlxz|{}ywxvyxmszzw}l{uswzzvrqkv`^ikzb_|fsmt~z|x|ooihepxy^j}{enkijqyxsvz}{z}w|tqu}ytwynv{ysn{y}{q}nemd_ehs}|npxosm||X^}\[|yjfgnjttk}~~~z|yʿ¿¾¿½Ľº¾ļþQRTZ_aegf`\^abbbca`fx|mlooonkmtulhjlkheeiokda\^a`^\WW[ejgbbfa\^hkhbhpqlilluvfc`akyyidlkgjk_kcY`bbS?;EK?9BP]gigb^\[WTX^_`bcbbcc_]bimnnpmeekoojd]]gqronmidhmqn`bpmgffe[TRLKQUX\bb`]WW]dgc^]^dgklhddbmnlehidc_[\W]hl]\[]_ca__cda`kplljfc`wxmkvnjmdchihigc_\ZY^nql\[WNNXagh`cg]bg]jxmkoqpoljibbic`gmbch__aflsmjvxmhiggfefhijqtz~zvwwwx{|z}|{yuw~|u|z{}vlpzzyxsqouhan{submtvrpsxrrmefsqYXhccughsttxXpvea`bakkvqfq[aUcfhtpyoY_lmmnzov{tfz~vy{~{yk|uqpmbfe^jsvylqq~{|t}rsyrqogsmahvqfmpe[smxz{mjx|jisfZgz~~vrvzwbr{qshddeedeq|meqd\qz_Xhoigold`afjmpqviX[`elvscdiefnxwjnuvvrzxlv~z^Ymjg{uct]y}g`gqabbNUaikh`jkkmepvsqqqmfpzstgdhhjmruz~qovuy}hpxlw~XYm_ouz~scbY]ktsry}hfhimgw|mcVLY[e_musjnuvs|wy|tx|kmwxvanc]XQL]lYUWJDFV]GE]hMVRNOGGHQ[b\d_gnszxzwf``hmjkia\lps}qoppqqzzu}spsumaulfz|}bpssjtqlt}eNT_idghrlY\nqi]udlr~urztv}v{xpzjZkk~zfz~}}y}ouvhft`PXpe[itvbLNom_S_`drRrsrfbdh^ix`agz_mUzhztf[giLjpkkxsnXVtorsfikkn`^Y\crsh{tWXZfSakd~oY]iu~mibMb\g}jyqlqsufnw{~mdtlempdiywupwojv{{}j`pknttgitvzzu~mnvugrurs~wv{~nn}]oumzy{w_u{ypz}{|}ywsnt|kquyio}|lrrnm~wxynuz|{||{yx}~zysz|yruvhda`kkpxzxr{n}tnWdfb{zsqkkiwlq|}{¿ƾ¹¼ĿźþQSUUV]ca^ZX\^bbba`ez~jinmkhjuzqlprpmgbhsxrfdddec\[\`fgghhiaSUde^`djmjefihsqh`]\bsugbiosmbkbgk`^_]UC=HMABNQTcia_fslOFLHFHMQSRTTTPNTTQRWXRFAEHLJEKQPQSSQU\[Z[[RG>9>KWenkc]ZWSTW\__`dc`bc_Z]flmmqofafmnjfcaepqknsiadktuibktqkif]TRRPNNV^^`d]RRX`ec]\Z\gplffadnqkegnlea]d`Rc|o_befffb^_ddefnrsqmf`byukhrmjk`ejhikje_][[aprme_XPR]ajg`fd^be`suhrvlmligfcgibdpmfge]dfjpretvqliieeffffhkpt}{zxuuwy{yy|zyxv{~}}v}uqxz|}wsosxkj{vwjx}tuysovprvdapsVRh`^yienwy|Youhe`Zeqjxr`p_`]lfnoo|bUftlmt~rx|sq}~~{sgxyrnkjZ`d\douxgjm{~}x{zuzysnnwocrxqgjul\l{kw}wyjmyyoile[jtx|sqrx}scpwjrwg\\cbderyhejXczjU]noegpka\^glorrtcW\]gorm`chegr~seksuur{ujyx[fqfkqnib~hhktbjoVSannlgsqoknwsqrrpjnzwsqbdggnuvs}mmyyv~js{il^Sq^iu{vta]UYhpqpibjljkzxkcOR|[`e\muqhy}rwt}w}vwls{}ti{ea]KMbjVRVI@ET\CE_\IULIJC=FLUcZifiv{}w~vibdqmitnaewvvyvwnlmrxwv|unvxnv|io{i~xtnwxkmq|}oZU^iiklsnedhzlWquortmvx{z|mstltd[}ihwiv|w~yzlntc^pjNRfhYaiyjKKqtcU]]amXhxrieamahfhm{fqR~kzkk^eoEmqnhxrxsd_Uplq{ndlkg[a\[moxrp~kYXbba|h|voZ[ls|wmbLfeiwzzkq~vwu}qjp}hahlbhvtzotplux~zzyj\nikrrhhuvzxw|~|jdswdrsqyxutzx~|~tn~msm~vw}m|p}}sw~x}~ymptytv~}vzxmusx}qu|}|~}u|{mt}xl`cosq}~||{rukZhwk{q}tmnynw~wûſ»¿ÿ¿RSSRT]c^YWWY]a_\\`ntikljifnztjlssokffqzwkdeffgc]`fffgjljaTSakb\aejigedddy~uqd\\_grofdgmtqdjceke]]USF@MQCDPQR_fcbfs`@ESIEMTQQVVSQPPWVQV_ZRMIKLKEGUVNPWVSW[[[ZTRB5=KS^gnf[ZXVUXXY]bge`aebZ[bhkmnnjdchmlheeflpgepnbbflvugerwqnnfXTXVQOR]b\adZQR\a`]ZWX`qtfhgaorkgfjqmd`ag[Z|}ihhihfda_bggijox|oeba`stjfqljk`gphilmhb^]]eopnjbZWZ_bghdca_cdfxpjttkmkcdcemhdjvojg`_gpsrlg|mjlhkhgfegejlnu}{|}xruww{ywywvww{}z~||yw{|xrpwxjn|zu{{v~u|vjtrr}janp\Qea]tmeotw{_mtjiaYgqmwk`pb`gtimntwYYkujowmu{s|z{u{ulatwqnhjV^e[_msvdfjw~xzw{}u{~skq{ocz}peexn[gtfpvuxhnyvtjdc[jnuxkmpvwjbnuldvr]V]]acgrrbddVnvWVelibfgc`Z\iotrnr]U][grmia`iehyj]jqstwwll}sdmpjtuy~kksihwnut]Wjrsonxtsptwsvrrqmq{sskafdgszxrjm}s~nw|yldeMq`duznuc[SSflnmi]npfo}pgbJevbbaZovpkuqxw~z}|tt{~vtli_NUfgTPRICEUZ?IXRMTGHI@=HGU`^qbkwxywxodpwjrzngszyvvyqjikqv|~voxwztqtz|vowzjqqw{tjbcjoogrwul_qYozquflss}q{cgqgq^bzegtvq~uz{kiqaYksRL]i[]avtRKquhWZ[`j]d~sig_tcleoy{ouYkvingjvBgqinlqs`]ZmlkzxfklhXaa]uuvzn{y_[]kowq{st^Upv}}vaQjop}}pf}u|oml{~c^fg_iuv~uq|rls|uz~wwvk\kkiqqiftyywz||xkbmzzz~mrpqw~ujtvry|~zup~wqxqtztuz|y}ptlv~}~q~|sysv~~|~~|vwzknw{w~z|m^mzzvys{}pzÿľ¸ÿ¾ÿÿ¿NPPRY`_YVTUX\`]VXgz|kghggfjx{oiomikhis|yqiegghe`dihedhmh^VW_iiaaccdedddfmxrno_Y[ainlgfijrufieegb]WPQNDPXIIRSRYadegjP:HTJFMUQQZYQNPSWWX_^VUUPNQJGQRKJT\XVY^^W\ZR:;LUZagiaUT_[Y]VZbilc]cg`\dhgilkiffgjliecfjnh_irf`dgmwshkvvrrmc\[\YQRZa`\`_WTW^`^ZUV`inhhngkunggilmib_e``{~kmojgfdbcdegjkin{yhabccoohhmiijflsfinokd`^`jrrmhb_\_adghde_`eclvppunjkgdfcgngfovqjc^cisuoetsemkhjihfffelnhwyw}}rovvvywttsuwwy}~{z}}vsu{zr{w||yxw|{v{vitwnt^joaS_`Zoqgqnuxgqujme\ixqolgmd[swmim}nSYkrkrxmz}q|t{qkxwof`pslmdfS^eY_zgos`dhr}ptpyz~vyvhmxod~|ncaxo]eo_jruudoxtwf\c]giqqgjnpnbakiccu|lWR\\bcipi^c\`zgRahc`ea^bZU^kq{slnYWZ\kqggeclhnxZZloqvx{fq}~ukprp}z{ltyhltt|vabvrurqzz{usstuosrmpxrtmceflu|seo~oxxxwrkb}oKkd^xxdrd[QOcgmkjXoucqzlf^Nyre`^[otkonrxx~~{v|{z~ureZbhgVMQQGBWV@OTMQQFJLCLLF[[kn^ltvx}wkkvriytdo||zxzqnkiim}ztw|ztx~~}}ypspwuvzstvmp}xcgy|]uu]nr{w^bim}ky_bnapWmw_g}vtzxvvjgo`UawZHTi\[]qz`LpzoYY]dgcbrhk\tox}cu}ywl|kt{nnlt|OZngcjum[_mmkwyodmy\gggyusuzmccn{tzyz~jYr|h]zvxz{b}{u}ynkl{qa_gabltzxpvsnrwqv|vyvl_fmhomjgq{zv{||vlckxyxyzzwmmv|~zy~~te|}sumtvu}wp~yznwusox{~yl}z~m|~zx~w|~ws~z~}}zzykr|~wƽýſ¶ûľ¾¾¿LLLT`bZTSTTW]^UR]rtdabacgu~vljojedgt|oigggilifilgegji_XY_fihda`_ab`bgovqjljZY^ehghhfhhrxhkgec`]VMOTJQ]SQVURU]cggaD8JRKHKUVWZWNLOTX[`^UY_UMSUKLRJET^ZVX]_WX`]H=NYZ^ehc[SUc`ZXWbkmh_`ec_ekjfhjihhiiiiga`hnh_bppaahjqvoiowtrtk`aa]XUZ__^\``WUX]_[UTajhbbqlkvridfimlcaa^c|jjsniffeehhffkkiq|rbccdhpkbjlhfgkrqdhmnjfdbfotrkfb__acdfgec^dheptnrtkigeffdjnhisqkgc^dmrokjijjqkhiihggddmomxtuwkpvrtytrrmnzus~{ux~{~~xv|}||{zxxywuwzujovm]cleT[\Viseonsuswvjoe`z}pjijkfV{upet}cP\mkmpsx{|ymtl~wrfcsthcbmohl`dQ]dSctalk]bgl}lnjs~xx}ytwsfgtme}{ja`wq`ehZgospapvpt_Xd^efoj`klidZ`i`_fquhTQU^dekmbY]\rvVag^]^fY^aQP_gunpgW]ZcpjfnkhmjweP^qoou{qsgw{wsrtu~{xozykvtxzukpzputu{~wqqsplpomnsqtpeekpyresipzmgdawzPbh\zu_nf^MM_dlijVpteosli[bvja\_^nngv{}ktxx|zx}w}{wpijkhXLX[FEXZQYVRWSKPUV]IL^_rj\csu~}whmtjqxkdx{|yrxojep{xo{}z}smwuzqtz{h`ogdz\fsvq[[ae|hvbff_~eVtq]mvzt~szqtlkmcRWvbHPg^Z[myiRqp\Y]lddhqjkWg}vev}xy|~tmrwull}z^\vi`gv~e^nikt|ygkvmrtvrux}{yot~qky|}g}}zt{rohm}i``l`lpxwptspr~}vlr|uzz}~unc`kimkiilzysz{yvlegpx}w{u{~ynfpz{x}}t~yw}}zvcvqwitt|pz}zoyulwqn}{~yqx}|s~~y}}~~v~z~zy¹ƽƾ½µľƾþ½ľHHLXb^SQTTTX[XQSg{wf\\]\`n~ynmnmfdgt}pgehhillihnmiiigd_^`fllf`^\]^`adkrrjhlbZ]chgceecfhqwhlke^\]XOOVTT]YXYVSU[cfcZB:HPMIIV\X[VLLPT\b^VYgeUUYRNPOKO]`XY^^ZVabTFQ_a^`gd\TS^c]XVammh_]abbhlkifghiiihhgec^akk`^ipibdhlrsllrsrrphaed^Y\efc`^a_VSZb]TS]ikednkfrslgchkke^_aavlhssiffgghhhgikkksvjdfdeloh_kmfcdmrlejmmkjgfmrspidc`decdfidc`gimwpnutkgcdcdglniktheeddhqmjhggiormfhhhhgeilnrwrxqkssntxroojovq|~{~tq{~|}yxv~||~zux|vqwztijtozi]aj`WYTbqfjpsqx}wite_~rmhjjgY|rxgv|ZM]likjyszsyojmkyxsj``oncbellgk^bP]dNfp]heZbgg{hggk|wnr|ljmecpme||cY`vscbbYimqj^ntppYYc^bbofbfgdaYab\difnfPOQ^filj]UVczb[pbZY`bZbYIN]fipbZa\hpfjsqnmo{WOdsokvtxkkz~w{vuvy{~usxw|twuuoyvnpv{{{xsrolhnpplprvphjqt}riwhnvh]]em|][jZzqamhbHK[djdhSnugkimi`{g`YZ]`keh}q|}ivxuxzxxx~}}xrvka[VfbLT`mga\Z^XSZgm`FVdjwmUcwzu}}lhfhvupnxt|ski{muy}n}zopughwy]oc\w~{som[WY]tdreh^bv[[u}hbwxywxss~vw}}qrkdRQumJNd^WUmylZpn^][uecmqnhV\xkv~{q|{reprznmsbjq|{eerxgxnrsvmzx~|zvy~~{o|{xvtvxlobr}dcerdvq}tnrsop{~yrdrzswyu{}uog\fimkgijwxrr~ssmggmp{ytpz{rfks~~rwsu{u|~lzzz|z|as|o{frrtpttvmt~r~qtzvt|~}t{z~z|{z}ǿ¾Ľǿķÿ½½¼FIQ]`UNQRRTWYRN\qwgWV[]bjx{mhkmebiv|ofdgillkkjklljihffedgloj`\ZYYY\ekonibgj\]]`ccca`ahipvinndYX\]VQYZX_`][XUUZab^SB@HOQJHX[X\VKLQW`c[Vbk`WZVOQTOOYc]X[_WR_f]RVca^`fbXXUXgdYX`lmiaZ\`flmljhddklfefgfd`^hm`Wcojeefikoqopqppqngdgfa]_fhhfbdbYXafZS\ddjkpvcgunifjmhf`Z`eq{kerxmadhhgffhkkjklqofiihhlkecokgjkijjhikklmhhqqnlgabfljb`ijcddiiuslrwsia_abchominoegedklphffdgmrrkcfhhgegmllsur|mnsnluulkkkppvz~~xxwxps}}xyun{xv~|xsw{usz{uihojuzaWcq][VZlgbjspvzl|i\tpiifdb}jtowSI[ceemqrsnvhjzfhntoa]^lk``emjfiY`P^eNjjXccYdgevd``evvhj{yfah`_mle{{[Tbtrea^Zhjoe\lqqmU[baa_rb`bba]Xd][kh]ldHJUcinmeZTYppTnrVWY\\c^PJPYn{kl_bf^iiguxtno}jSVhkjmxp|nmzxu}wxz{~~uy{|ytwvm|ypkw}}uyurnhdsznepwvqlouvxuly|luscWYjbsj[gXuoeheeFFVfh`hSn{iefpjls_YU[ZdgZi~xn{ukvuruzx{syu~~}|}g]chtl^gs{kcbbe^[est^LbmngQv}~zkfglv}xux|{utx|~uq{vxt}wmpb[sr`pstskkYRSYl_lhbYmjT_{slgvx|q{~~}{wwueeVTqtNLaZTQnuj_spc`^}j_p}tocUZ}{qs}{xkyq_nlzwrncovmo}~xy|{yv|~svtwuzsqovufp\x}fmswf~qomnslny}xl^rtptsr~z}vtl_aikjejgqusj{qmmjgkl|xzkuzvmmtwlpqowrzzj}~~~~x~^uxnz{}cjmr{~~tkmu{olrvtwzs{r|}v}|z~uzzw|þ¼ǺĿû¿½ž¾üHMW_ZPMOQRUWTMPeywi^TV\^fqwrebfc]fvzkbbdfimljjjllihhjjijlnpmf\VVVWYajnlf^_ih_^Z[`bb[X`jinshni^XW]^[XZ[\_da\[XU]^^[QB?KQTKHVZY]TJKRZ_^YZfh_XWTWVOKRae[X]^TWef\Ycd^bhdYUWY`gb[]fmkc_]`jtqlkid`djhdehhgc^epfW\jlechkhjmooqpnoqmgegfabe`glieee]aj]Ubhahqkxqcpohfknhbba\cqyocpwndaiihgefilkjlnmjifilmkiehmimqgckjkjiknjipqllhaahmlcbdjebdhkjxjiuwpb\]e`bipjhrhdhfempigcacfosle`djib`glllrtw~vkpoinvrjkjoqv~vrwqz{utwvu{zuxzxpoxst}}wurpsvw{{qgigbzmWYujbZTdh`gror}{n}r^}|sgdd`e|czloKGX[`alnqrjqkevqcebre_\\ih`^fncfhX\O^fPkhV_aWcgdsrb[Y_ntdc{{utb]c[ZhjaszWPdrrha[\fhk`_hlvkR`a_^`pbbcb^X[][dkdVkdGIZeqqjdYNa|a]zhRU[Z\g]OJO[}smidgddfcp||visy`T\igmp|~uxpixsw}wy}}xzw}y~zmwwlx{qlvvnxwrpef~hbtxurouxp|~rxnuaOYb]ht_aYooifcgFBPjg`f]p~jaeulx]_WT[VccVmmnypotrps~}vyuqrs~sg^ozxpnp}ygedgh^aluoZXpm~Yh|{wkllvr}|nzvozgUcrdmjrrliVMOYh[jiYayaQczpsltzxx|wvoYbZTnvXHaVTTio\crf^`k]rztkaUXu~rn|yvf|yq\mhzlfvy}||nx}ppw~pwyunluvmqc}rxyxop{jkltknz|zqe^w}mosin|y|~wwp`ahjicighsskmuhomhjervzqpwxqrtzlnrqts{tjzu|~}{\xsoxz{achpos{viikulmpo||uzv~t}|{~r}|t{¶ȼ¹ý½Żſ¾¾úIRYYSNLNOOSVNLXn|o]UUY[^issh^_a\bt{th__bcdgkkjkkkkihjmnllmqngaZURSYclnje^Ycjgc\VY`c^UTaiinpindYVW__^]^_^``_^^]U\]\YQEFNSTLISXX[OIMTY[YV\gg^WWWZSMPZedZX]\Ydmf][]`eokVT][\ac`_ceihbbfluwokhb[\egbeiiif`cqlZ\hkicckleimnononopmihifbhgclnjiiidfg\_jb`uvlwhdrjbhmga``acrynclwob`fhhgggikkkkllmqjehljgjjienvh_gmkkiinohmqkjic^djkfccfhb`ekkothiuxjZZ^`\alrfenedihgmidfb\afqsh`_eli]]hnlknsrmpljovsiihozurozqnxtnvyxqotqvzmfrzlrxvstunkw|}ysgff[qyu_Sosi^P`f^dnpkwzn|zdpqib`\l{bxkgGIVV]^giommmm_ikaZ]qb^[[ae_[gp^h{eUWQ]eWlgU\a_jgcmraWRXhpa]wzmna[_WXci]gxZRhqqh`[]dhg[_eivjXfb_[apaabb^V[bcik_Vk_FM\jujgcVSl{]l{_RVY_j`WULLfkkrqk\gbb~wl{}xbVcjmtw|zhivoy~z|~vywzw{zwkwvjv}tounmuvtrak|ffyw|uouz{i}r~trv_J_WWgtf_]ljr`bgF=Wkgicez{k^b~ltTaZQZ\h^[u~gnwrrsonu|{t}npps~|pje}|xwzszsjfclg`fkqhYfossbs|l|rm{|pt|rt}T]xffkrrmgSKQYgSegVovWPlrwwx}y|}xw}}jV`cTor\JaR[Y]nUbuhbckZryrkbWWrtjtzvhv{r^ok~wo|}~{}{ks|rm}w~xrw{yomuw{ys~xvzxzwekithny|ve`\{gnrekww{~xyrbdihl^fdbprkhshstkjemstwpswuutvjhrsrszpq~zs{z~y]{pswwz}`bdrijy|ichoipokvwrws|}ns|~ÿ÷˾ɾ¹ƿſſ¾¾þݾüLUWTOMLLLNQPLRfuwaPPWZ[bjnh\WYZ^pxob\\^`bdfghiikkighmqpnmkmjc]VTSS`lpkd\X_hihdVRZ``\TYeggnnhm^ZYYb__bb^`c_[\aaWZ[[YSJLVWVNKQVWXOIMTWWVT[gg\TWWTOU^dfaXY^]\hnf\XYbpq^S]a\^_`cbccffdhqxvliibYV]dddjmjibaor_\iiggadkffjjiikonnolffiddljjqpljjmmie_hi]h}oor_mraakj`^a`gqwrcatub`cdefgggiihjljjrslkliginiflwp`bikljhlnkjoljib^afifbehiebafklonfjuuaU[^^[bmmdcdbckhhiecc\Zbentg_]eleZ]hllklu{qqklopxqehlv|wtouqqwpoutqjirvuobbp}siprooswmhw|zyyk^dWhyygSjxlcP[a_`kneqzmv}khtka_[quczndGLTP[\afkfmjk[dg[S\pf[\X]i\Wks`jwbRUS]dZlgWXafpgakp_VLTcgZ[s{ifbZZSY_f]cudXirlhbZ`efdZbcftg]kc`Ydq_cfebZ`hhll\arWGQ\trahcY^xvcsvaSXXimT\]OVvht~uh\j_nvw|yyd^hpuy}v^puo||wrywv|twlwtjuzysuiqsuvsbsvkj~w{qpqwm|rulws`OdOVhnlcdhgy\dhI@`ehvbtvl]q{mfWf`KWen[kytemwrsrlox}yu~emrv~z|{}~}wnxwz|ylrumbckb`efha`mmltql~}tqu{s|}|}qXcviarqqnbQORYdKafcwpOPy~r{}oueSaiVqs_U_Oe_VhU`xqcfkWswpni\[t|uipzvr~v|sbtv||yzy~|wvksxxm{y|x}yw}rnv~ssz|u^kgseou|ua[\{|hmidspuz}y{vfhmdk_c`]kqjiogq~olnlynuusuwyusjbttmv|r}yq{wx|yb~n~wwtxs^iatj`vhZfmfusks{sz}u|r}||z¾ɿüķ˾º¾ǿ¹¾¾þĿ¼ŻþĽLTUOKKKKLLLKM]qseOHOYYZbif[SSV[hrmaZ[\]_bdeegijkkjjottqmkkihaXTX\^gnmd\W[hljh\MR]][[Y_hdcijhk\^^]b_bicZcg^WZddXVXZZVLM^]VPMPUVVOJMSVURR[gbURWUUW[^bb[UY_^ahkg^X[jwfT`g\X^__b`^aeegr|zofhdYTY`cbflmjd`kvfZilbffaii_dkhdeknlnrjaeiciohkrpljmrnjgeid]uhqobtm]gog^^denwpe_gsk_ab`bfgffefhkkhjprpmjggkmeiywd_ghiihjoplkoiif]_fgecafjieaaflmmjdlunYT]__]enica]\diebbba_U\eeorg_\dk`V^hjjijxspqgnpozqafq}{ssqustuorsnkkgoypa^iszz~jgnmkntymgz~wx|k]c\jt|yhSgvlVVej]mj_mzlo~rgx|tm^_arnk}sbNQRKY_`ehbmek\dfXQ\qgW\W`o[SnvhlqcSTU_c\hi_Pbipf`jp^QKSa^SYo{gaa\WQ[\dcdrl]jvfeg\dged`daergcpd_\jtablicbhjjmmZesTGR\xp^bgdf~qowvgSY_rdQhfWj}o~vefm`|x|s{udijsv|o\usu}zqqvt|stlvqlrv|pvxhtrtttewqonuxooptxvvog{md[bMbgknmhen|kffRHfep|k|xmenzdajdGVom]zsngnsqrpkrz}xxw`ntw|xz{y|}~}{ryp~mdtue_bb\`dcbaeqz}kwhtyuy|{sfkvkavqqoaTSV^bTfxt{nO\~z}zurxzeWciWpyf\]PheW`V_w}gm}kZsvstl^`vvven|xy~y|tlz~~uwt{x~vqjtvzoz~|z||vsp~nq}wywYnqmdlvrwhX]xtq\`}lrx{z{|lmtcghiebimklqgpvqumqu|wr{wq{~}jayvn|~}xxw~tpvzj~p~{wsumWlavpVolVanfy{mpxy}~zx~~~yľȿþķʿķ¹Ǿſž¾¾ýƾ¼Ļ¼ýÿžMRRMHHIIJJIJTgqgUIKTYXYcf^VRW^ejjbZY[\^`aacefhlnnpruuroljijcYTX^fgkme\Z^ekjleQHT^^\[[ahcaefheZaeb_akjbXdl]SXdeYRWZ[XK\ccXRPOSTSNJLRUTPP[c\TTVWYYSSY]XTY]^ckncZTZtpYYgcXW]^^^\[_dcjy|ofifYTV\bbchllhahwm\eofcjeeld]djgcflmjop_Yegenoilppkhsxokhfg_]{{colhreaqpd]^gkqqf]^jpe^ba]_fhffeeiljiknoolighlkeo}n_eidjiijsolljfge_cgc``bhlkc_aglmmedoqeWZ````hle`]X[dd`]]]]\\^aenne]]fi\T]egiegy~nomgpmo|m[gu|{ssrttttosqmkmfhun[^ptswmgjjggnsvsox{wz{k\[jok{ufRfw_Tdp`nkVexnlxxlrvmn]_jsgy}ucQYRK]fadhdofm^egTQbtbTZYgs[VoxrpleVVU_e_fjgL`jsb]hk]JHT_ZOWo~dZa]UO[Y_jfmsdqzdchcgkggfd[drihpe]^nsdaklikhflodSjsSHQki]gmin~txxteV^mu_\nd_x{u{tdpmlztqhmsvqzh`vtz}{vrro{p~vpsqqpwymztionpsrizytsqvtnpzuqpe}nid_Umelsxkiv}lc^Wjpzv|ztymjnohAXyjhhtioqrsllv|}xykfrsxzzxwy}{~}zruqkzt`dyl[^ZZY^ccfgev}du}kzt|~}}zyqzvixwyudSSaljizyx]wzzpx|{nlWdeVne_\Ugj]Z]axos|mau{z|m^`wqw`nz~|xwz}}wtrvv}ujhtxxk~}z}zxqq~}iptnvxYlyhckwmpy^`vV_|nuy||{~tw~ihlxnimmpnykt|w|v~xy~yp{voy{{gb{xsz~~~}rpsznq~|yovmPihzwUixsZ_ni}sox{~y}u}|~zſſǾ÷ǿǼ¹Ż¸Ľþ¼Ž¼ýNQPICFIHHFHR`mjXKKRUWY^daWQW_dgf`ZXZ[\_`aabdehmqsssqonljjjf[TX]ckjjfa_ekigkl[HJTZac`X`ia`effaZdea\eqjbVci\RWcfZPV[]\ObihXRROSSQMIJPSQMOZ`XSUTTVOHMX[VVYY[dpq`SP[qaWcbURW\]\[Z[`ccozqddh^QSZ`ddfikkfgvvdbolcjkdimc`gicbilkkqjVZdagpkhornggwynlhgi_a}vcmjknchtk_[_hprlc^akl`[a_[_fhffegjkhimllmigfgklmrufckf`kjmtupliedgebfd^]^djie\Z`fjlibfpl`Z_bccbhh`[YZ[a][\\ZWY__]dlg][^fhZR[cefbgvuiokhojqwcZjx|xtwussstsrrplihhqo_dttouyoafjcahoqootuwwxxo][yil}qePe|i_dpjnpU[ssow|prthq\`pqj|ufV^SQbkefjjogpbhiUVluZUZ]mv`\oxxtnhZ\U^i`dgiM_gs`YfgXFGR\VLUm}dS_bVO[V\tjgyku~f`gjjpldge[dojkof\]otfglnllcdnq[NqvRO\uj]jsmtzwuucYgsq`mudm|y{x}rktlsuypnp{vq~~bgvz{~~vrrpnwpxsqtsq{tp~uhijkqooy{vk|~urmr}x|ote~xrnib`sjqyjqzrfjjr}}}vu{vf>]zmv}_}hnstshpy|zw{}kptu{||yvx~|upjqlqh\kvaW[QVTX_dmigxsYuytwzox}~|~{u|uv|jR]|twyqys}zxjrWfcWiica_prf^dc}}zy|un{oac~r~z_q|||~rzs|zwqosqxr{khrzqd|x~uy~oo~~zzgpmfm~`muodjwkanhzxyffiz{}~|~unnxqxs{rx~|~||}s}xn{x}fbz}|~r{|{vow{vy}}mrqUfj~~bgmycfmk~wqxxp}sx~{þ¿ƿž»ʿǾþ¿úľ¿Ŀûƽ½þNPMFADHGDEO_kk]NHNSSV]feZQS_c_]`\XWYZ[\^acccdhnrtpmlmkjjll`UY`befeddinngbdnhPFNY^fh[Rbla^bbc_\eb_]hsgaW`eYRVaf[MTZ^^SbjlYMRORQNMIIOQNJNZ\SOOONNIFNZ[VUTT]hrmTHMbjZ[`WLOWZYXWW[`disticd`WRU^efegjhfhrykcmogjoiekjcdfd^cmjcls^S_b_ipfgpqkdj{zkklieammclnpifmnd]^biooj`]emfY[_^^cefffegihghkkmleddfjmtsidhifckluxpmkgcehdega[[]ekd\Y[bfjhdemoh`^adeede_ZWWY[_YX][WVX]^]ch`[Z_ffWPZabcagsmfoihojpo__muzvsusqrsssprrnjmlnpkoqsoqohdhh`enpngltsrvxurdhcq{pg[g~pklosor\\mrtx{rsvlobfppq~ythTcY`glmjlopkqgllZ]vrX\[aoxdaox|xqn_dU_h`c`eQ]hs^UefT@DPYNJWeziS]cYMSV_|kd|qs{ibhmmqsecfaemkknh]_stkkmmtnfgooYVwuX[fwk]jymvzswt_blrpfsunzxzzzyrrmnzv}rrtxnuz}z|_l}ystsjvlyyurttuzot{seecgnnry}khytqlx{~|t|m{qe~~wspjbhwrs}iy}wsvvvt}yaEixtlagkvtniuy{wxxzwwy}~}z|zsogplmb`qn]XXOTNO]mmaoscZsxsufruy{~wx}zy}|||v~~y~~q~t`yw||ut~xpozXgfZolfje~|oikfu}{uimv}^t|uw~u~zpvxvxqnqornykjrznZzsqv|ymk}wuuckfdi|jthukltpVwxk{zw`~x|tx~z{z}~{~o{sjew~z|q{|}~{}oxw}z{vksbdjniiylqmquvxpysq|{z½ǿýķ¾¿üƽ½ĿKMJDACGEBHZjl`QLKNPQXbfaVQW^ZVX\ZWWXXZ\^`bccbfnpomknnmkjicWU`cdeeejrvreY]flaMLT_fh`OTln[Y_`^]]e`]`lre`Z]_WSU^c]KOY\_Wakp]IMPUOHLIIOQLHNXWMGHJJIIKTYWRPPV`hmbHBPliXYWNJNWYTPQSYcglokfdc[RR[eifbhmgfqwqeimkjnoihlhcdcaagkdbpnWT_`dlibhspgem|{ebpm`atwbbnrmfinh]_cejnk`XZho_V\^]djfdefehhgfgijomcaceiqzm^bigfhku|wmjmg`fidhi_XY]ei_YY\bggdemnkea^ciida_[VSUXZ[VY_YSUY\]^cd^[Z`ieUOZ^_aagnhfnehplkh_eorxrqqomnvzpknqpnolkotxorppljhffdjqpjgnsorvtqml{wezrmlhl~yurqtvopa`ms{zzstusnjmpow|ywsiToblklpnqtprsjooffzp[bYeryefpt}{vudgW_f_d[bT]is]QdeNBDBBMalgXLLLNPU_c_YTUYWSW\\VVVVVZ_aa`abcglnmkkmnnkg`YW_dcegkotythZT_iibIKZdhaUM^riVYb_\Z]c^[blpd`[\[URU\a\JKWZ`\_lr_FIXYOGNKNOOKGMVTIDGGEGJOUTSPKP]bcdZEE^saUUOIKSYUMKPU]fghkjb_aYQOalib`gmnqvvgfimjjomjmlgdcaadjfaindUV_agicbhpnfen~vYauoaeul^grqdclmd_cfikmeZU]igZV[\_iidegfeggeefhiok``bfjsuf[biffknz}tklngaiichg\XY\de[VY\bgccjklgbabgkic_\[VQRVYZW[`TMZZ[\^a`ZZ^alcRZ[^__`giafk_gpje`cknoyulpoiiqysmmlmoplhlsy{moomhhjhcgnrkbkslirtpkhuro~rmqruzztstuvnljmqx{ztstpmlooowxvvrhmpionosquvrusnqpmq{o`dTgs{djpt}{yuelZ`ebbYaU\kr[QceK:AOQBOWXvv[V^ZHOVd}ibtpslllppszhdqikomnha^pxusmo|oilpm`it`blzyl^j|mxwpzo[jnoporpsz}}}xrrwfr}|uvzwtmzquteoqzfoqo}{xvrrvzrnv|oaaZejmqxkcxofli|}swqknzhwznei}ulwvhli}{{vkxyx[a}v}^zsfkqno|xut}xnx|wwpdmle\`mh^ZUMPKKdijulrqdhpnbkturmvziwrp}pmnvz}xuyyumlmlr~zzpztlquxvp]gwh|tqyqmvxyu{{hq}suyky{}{ry}|nvtrqp|yqnnkitpuhhvwo[}zq{wkhhfco}zlie[`]_iv}uk_tqzrrjsy|}~}~pipvhr{}xwvw{ozquyrlpjizseout{|pyru||}~{}jxy|z¾ÿ¹þ¿ü½¿ľžſ¾ĽFDB??@?@GUcc[PMJJNRX`_YVVUUSUZ[YVTTRU]dc`^^_bgihijkmmkicZW_jgdfmrvxqcWSYbhdZNT`hcZW[ms^PW^[VW]`[\cllc`\[\VRUX[YIISW^]]lr_FM\_PIRLVSQLIMUPFFGBAFKSRPSPIT`__aZGQlnVSSJFLVWOHJR]figiig^[_VOZgic]dkorsonhhhmmoonkmkfde[[ii^_kl_TW^de`agknlghuiOi~hcqq^^rvj`dkgcddfhhi]UVdh^WWZ]dmgbhhdfhgddfjlkd_`dhmsj\\ehghmx}zplqk^fmfdga[YZ^a]UTZ_daaiojke`dhkkc][Z[UQSUWX[bZIQf_ZY[^^VYcdgaYbY^acdfeclkZeoeafknjp{xmmkjiisyolkjlpoiisyzxmnnifmnidkmne`rqcismgcf|mxykpwvrw}zrrwwslouss{xtrtpmlmppstttssvroquuutwxsvuqrsnv|pihTjw|bkot|{{sit]^jj_X^XgnmYRbdJ9@OO?QWWtz]S_XOUTh{kf}snqnoorrqo^sqkopoecaoyusopzojklncg~wbcnxxoamyntyts}j]lknnlps|py}|ywnovjsz~~}uy{wrwvowqszjypdn{y{{{kn{vjw|n{lb`Yejoquaq{yibgc|utzqkgosenkbkxkhy{ajsw~|m}yv_p}unblhkloq}vru~n~~paoib\[kj`[PLQORhfrxi|gnkidfsh|unh~zy{o{t|fptnwljlsyzrswsoifhfo}{zvq|kepv|sxs~anzr~wt~vox~x|wwqn~|qzxhyq~vuiuy~ntxpokt{}{romognoricytnbzzpxwibb^_huzticWT]\Xhuxyx_w~txyxxp{zyxkl}zgrzxwuvvnxoy{{qzwxipsltycmz|{~xq}rv{vz~utylmu~y|~üþý¿żĻ¿ſľĿ¾¿þCA@?@?=DP[]XQJHGIRX_a\URPOOTYYTQRRPR[de]WX\_cfecejlokea[Y^ikffnuyysgSMT_ccd[YX_bZV_ntjRJV\VQV]]Z]eliba]XYVUUUYWIGQT\]]fr_HN]dQLTNYWPKIMQJ@DE>>GNQONUPJY`Z^cYLYmgOOMDEQXRHFKVgjehkgbXW]UWcfc^_ghqsinuiilqqtrnkljedb]`ha\foeWUU^b\\gnlkjgj~[PrcfpdYk~r`\bfdfiffffbVU_igYTXY^ln]`ojchhfcbfknh_^cfkpk^Yahhhkq{xmoqcapobeg]Y[\_^SPUZce^eokhkd`gjih^[[\]WTTSUWadRL_i_XVV\\U[ihgd^^W`ihdegikcUdkcdookirvpnnjfhjtqjkijmqnkr|ztyllngirponojiimsleptg^]km}riryvou{xrtxxomrwqx}|wprupmmlqqprpqtwvqkrzvwy{|vx{suvox}qlmToypalnp|{zpt}cjzq`]Z]tmeWY`cK8AOJDA=;8;ER[ZPJGCISXZ\a^PGFJSWRKMPONPU_gcWPTY\]^`dfeed`[WV]bfgcjwynkgZOLT^`^^`d\Y]^^mrm_OLT[YTRVXUX_ddbabWQ]]TTTPRKLNNY]]_a^JS^bVUWR^XMOONJ@>D?<@HOMFQYNO[ZY^`ZXddUIEABKRMEDIScg_agdc]TV]_ba\Y[cffrffzxgjsrtskgjia_cccec`dlfXXY]dXXisogdbf~mS`}vdcYVnr\X[`afmlb\a`ZY_ebURW\`hjacmicghegjklqh[[cfioiVPajeeknquwoild`pwhagd]\[``VQUZZ[[fngce^^eghe_\W[`\YSOTZ]bcfjh]ZTOYdWN`qnd]X`injcfpk_]Zbmjhjniknnppkmiclsrbejclpporywtuvokin{ohjpqppqrspnnld_eztjrugo{rhkv{uitxngmsqo{zyonrqqpnpsllpiq}wsjhuwmrv{xn||mvzs|txtc}pcgppn{~vp{}|zrhWnrgfac_nmRFR[XchfvqXccky[Zobsquliqvp{}p}jgjjnsn_bcjuuqlkqlig_cchupblunyskpnfjoyvSbqfhijpv|lbvvfnteeuvs}zvxu||zyvzkls~z}ws~~yy}}|w{{fqxf`wv]nkaZLWjjeS]zm`laX^qgkof`^^a[e|iY\anddeh|_^ny{|{ysyvqppuso\jkeanzfsvnhgqnxnrxyz`c_Vix`M]TWg^h~ywhczZWeoujfn_c|thtt]vj|}sb[owmo~}u~|jpsrwyy~qwxcpepobr|y~}{{{dVowp~~t{x{{|}|ysz~xkusyzssiouv}|{i{Zwsysux{l~||~~~zyxrnbeqzsvlai`^wyd\yfgqwrhptaQQOOPif`a[LMW[Qc||vjvw}qqttuzzwsouwz{wqi{|hssklxtnjszU]{eksx~whyskqssjq}tqx}rwytqv~us|zw{uvrpÞqzrktxslszy{llitu^p{ttz}|wÿǾĻľľþƿĿø¿žĿ¾¿><:66>KX\TKGBGTUVY\YRFCHOTQIHNPLNU[df[RQUZ[\^`efb^[ZXW[cefehptpig^QOSW``YX^e_W]homicXKLW[WTRUTRX]bbaaaURb`PUSMQMLKJW\^_`^LU_aVWXTaYLPQPG@=B?=AGKHHRTORYYZ^_]]a_QD?=DNNHEFLXdb`ee`^ZSW`a`]YW\fgioal}rgpqotqgfje^^ddfe_agiaXZ]cbV_rsg]`cpcVkqa^Sa|}gYY[afink`\`_\]baZSUY\ckhemlhffcimkkppcY^gjkk_PWggafkmoushhg`etqccf_]__c_TRWXZW`oi]bb[`gfhc[\XZ`^XNNY`_eljcb^VQXdcQSgpkb_bnnigikpg[]\dmjihjhjminphglkqul\hjemnopuysqppokmvujppnmpsrquummohdmvkmvmirxlenvwoewvmhlqrr{zvnpqpssqrqilnhszrrkkppmpqtsk}|luxp|rtqj~mbgqps}~qs|xuxq^oqpofgiz`HZmgcikpgalfsz_bjfvrggrnkq}xrgadksl[^^cqphegkfc`Z]bjpkbmtl}ieplcilxqOdpbgknquyg_up\krbbrwtxzturwvsy{jqs~zu{uz}}vx|y~zvuiqt`\xsZki]TESki^PbvcXh]R]f^gfb_YZ[UfvbX[elch`gy^^pz|v}xsp{pmfp|sk^ja_]oyirshcfphuem|}}~cb]^pyXWgZdj_p~xehzZTbmqkjibnz~vcqsVppyzvpcXjwhlzm|{pyyrwz}uthulqpmx|~z{zv{}mcpxt}~{{}w|xtv~tmni{|tpramqv{|}ev\rysuvs|||{{{tmf_esprxbegYklZqjhut|xilvaIMSLGj^V^[LN_bSeu~~|grtnjwusyvvw~snorrz}zy{}}uiz{hv}vigxthjvsP_xbjtyduszlrqtjrzst|v~z|qqsrlr}umzzu~yuwytsjŚmyqjssqqqswxpumk}hmztw~}tƻľŽÿ¾ſĻǽþ¾ÿ¾<:87;ESZULGCCMTRV`_RGACJSQHFKPMLQY`ieVQRTWZ\^`ba]XVUUY^giffloookbUNV[Z__XT]hcZdnnd^\VOT[ZTNORRQU[_`_a`UXc]RVULMMOMIUY_^a^OW`_UXXUc[LQRMCA=@??CDHIKNORVZYY]_]\]\Q>;>FNLGGKS\aaaba]ZVWZ^^]ZXY^dhmj^q{hirmpskefga\_ddfd_aghaZ\bg_[kvn_Y`iyu^`x~k`USk{q_WYZahipm^\]^\[_]XXZWZflhhkhfc`crrhmum`^dlnldUTahc_djkqtidfaamukage\_cee[SVXXW[jm_ZdaZaffh`Y\WZd\OLS_]]mn`^fZRWbcWO_nhfbgkoifkrmlg^[_kniffijkklmieirvqth^lkflmmpvtnlkgnptwrqrqnnpxtltvnopjjpnimseksrfhrvrhcyrkgjotszxsopnprttuogkmhrtosmkjmnplnpj||htxo|nrrn|i_gvoxz|mywuw|pfmp~uklq`Lfuidkmjfnrm|zihjqwrejrgi|trviY_hrkZ[X[ijb_ef`_[VV\dif`mqi{c^oeeplunOdnafmpsrxh`qfWhm_]nwvv|{wppsyvoz~uqv}yjqwp~}}yrvzy|~yw~mnrm[\vqZgiYOFUgbYOcp[Th]N\^\`]_\WYTVkp^W\gjcgamp^aruu|v|xsskf\mtjaj]Z[ovkppaahnet[mymjglssZmocqjhzgmuZT_msqnik}zyzxtbonVnxwssmaZiuerqhy~ytv~wu|umu}{|~x{|tzy|wqpwuz~x{{txs{xtvwlrjc{mrqot^kpu{}hngyruvxyzz{|wxmlc\gmn|jdg]_x[hpf}xxymiufDGXKCkdQ[cMNmkTev|rnqrvrcvxvuwrusxunhmmmz{yysvzy}z~mw{m{}yibwykoynZi}l`nzzgqp|rkvrvnx{szyvy}vyomkpjq|vizyu{tpvsutiĖvo{tkqrwsssuttrhxxrvy~sûĿ¸ʾƽ¿ƿ¿ļ¿¾ÿ¿ĿĿ:87:AOYULFBBJRQQV^YH?BHMMHEGILMLS^eg^SQQRTX\^^\YWVUTVZakjdekmoqi\ST^a^\[WR[klgomc^^\UU\]WMJMPPPTX[\]`_Y^dZPWVLKMUSKRU\^b^SX``XYXWe^MQTO@C>?A>HQRLGCDGNQRTWRFBGLIDAAFIIINW``XSPOOOOOSY[YRNNNPRX]`_XXhqmoqf[\_`de`ZYWR]s}ob`^]XQU`]JDJWYSOMLOQRTX[]a^URYVJFSd\JDMRV`dWW`d_ZRV^aSOVV:ELGG<6BMVJ=L[]\WWYVTO[iK=>DILKFL\d^MCNQPJEGLSVRICEFGIKQW[^^^]]ckfcnofefhhhebabccmdWRRV^[UU\a^VIHKHIKLMPTUTSW[\TBQ]]\XWUKJWodBPYTKU``bac`\_TTZY`\[XF@O[XatfQ[f_]died_U[`\XVQNTWVYbfbcdmwqfiqmebdnpqsrpePBBISgl]KCJSQL]nggj[USQRUY^a\\ceadd_^XS]he_a_RLVcih_\bhieZZaekvp`dga`ea]cbVWddeu{eXc]Rakie]WZWTZ_[]`YNRa`RLOZe`SWgi`ZXWV[WW[ZXZcjikh_Z]`^^___bfhc[Z[^bdddjmffmojrvrliigffhkoqnknprnopoimnopvrqqmknquskilnnnwrakqpulbdhnomkwvgotlbjrxmgnsaonopffnijkkloqonokh{|^hbprjrgfhjjm`gfge_eeispx|ooqlmkhzxkxnq|rkks~~|{vnq|qpxrortwjipvs{tqtx\Un`D86BPJ@CPZVG9:>AOMNU\\^eM?eccy~~||rgnwbi|gTpVGYYWcdnyms|kjpxvgt~jqu|}zkgdowzp^qyptzkqtpx~ttsss}nspmrkhgd[TPY[VUX`]MIEDTfdXLR]gq_JOUWYXnelt`mvheymfq\hlgx]cxtqhq~kcs~r_TBEgkskVb`RKWVSfdQO`piV]kbiighbtyfp}}~~}|}|{xqto}zlxdZ_ilmon`vs\]rw{~{}noxsyxxpwjh|}phrvqhei_nxttwnszszfxnvwronoiu}x~u|~v~zo}uopotrmypjiZxey~x}x}}xzrroy}}qhxvww~Xxilzny~rpy\mzxz}|irmbkvtpbe_chcONZtfrpm]{dlj_Ziwiv~trwt~{|{}{wwuz||ngmqutquwu}l}~{mus`ixy~}ÿǻżǾ¿ÿľþLMPNE?HUVOLPVULCCA;=GLKHFIZf^K@FRPJCCIRTNEAADFGJOSY^^]YWY`ifbmqkhhgggfdfffdl}cOOVY\]^`]ZXTONJGIKLNRTTSTZ^\O?BKTTF67@BMNMX_ZbbH@mj`t|||{qijqknzjSdbIX^a`br{qq{pjmu|ko}nnly~wkebk~{tycnrqsznssmw|puxuvmxulqmhdleZSZ^^`cb`SOQOUge\VU[im]HKTWTXjeh|tdongg|}keoecgdq\_xtldrnisysgYC@orqlX^^PKZSVj_ISmr_T_laikkact~vamzy~y|~{|~~sx}{s}}vrbZ`fjoscdupY^}s|vzzvwhv|puwwlsggxvkgrspc_d\j~wtrqiowpz}jpmqusro~wey{~~z~|||sqor{zmv}tnk[wq|umpzxxyx{mcwvwzftwsxu{wv|m{~y{}z}|mlidkpsti`^__hXOQhukkxwWnrcij^^xzt}|n}uwxy}}{v|uy|~}~il~yfpyus}wv}ubuy}{º¾Ľ¼ɾƼȾþ¾ÿ¿OOLF@CQZULNWYQC@@BBHOMGDIW`XHCFNRHABIPRMC>@@BHLPUVX[[ZXUYcjigmohhhhgeefgihffv{cPQY`bcdd\Z`_VMIGJLLPUSSSU\]XL<;JY_TGCEDCL^^YYZY[YWXYYTQKDEOITS;F\N6CT[\^]YREG`tXCUWUP\b\`cb[[]SVY[c[]U>EVV]ppX_i\W]gb]YTY^[YVPIKVUP^c]``jytifmphdinqmjmcg_@>Q]d`ZPEHKKKXhgce\RVSKYcdd[V`f`_a`]SPY`bYX[QKTZ\_^X\ce`WT_gixyikuqebcbbZPR_d_jxkYaeY^gfgbSUYRQ[[Y^^WS^d`VQX_\RQbk`USRUSQU\WR[bfijdYVY[[Z[YX]cd^XUTU\eeceihdhlmppqmcltb^eqtmnmjopkjnnklnnlpsppnjintqnikpvskvzjqwtsojikmllmrkhllglnokafnmfutqkndeeidddoqjnppozv`kcktgnkcgnfgdagm_[benos{}lfkvvmemhlrdumj}pack}yzrinxulqqnqqslacov}{oglp}t_frZ>6>GLBESS_ro\cgYV]ca[SS[][WPKFLWWP^d^^coxpfhonfflnoklnbgS:NchcZTFEIKGNbkeb`TOUQL\gf`WVce^_`_YPP]b[XYTOOSX[`[V[cdYQU_glzzkp|qacdb^QOXaa]juaVec]gcbi]PWXNO]ZX^\UW_daXTY]VP[jfZURQUSQWZRR]behg^USWYWZZWYab`YVRTWbebcdifcgmmooohdts^bmzsjljjrohimnjkmmlponomihntomilqwsj{zjqtssnllpnllnojillhqold`iojjxuoina`fh`\^omhlopnvvakfcwfdncjnghfbim]\bfnqu{{hgrtoffohjgclbn{d_blyymfpyrkrnlrqne]diz~zxhfjn}odinZ=7=GL;8ADNSE4/@PWONidWj_H^zl\mzz|yplcgsuvo]^{pTZioacx|unvumnmswopyhdm~tma\izyks{ifrtryrvrhuxkwv|wq}cjpegjcfifhntmfefg_afhgifZYln^MHSWPXefenqrolkz{ofdim^\`dX]kpjaittvwursmaLfzypmdbNK[O]fPGik]VZixhkioknuztuij}{uzoy}wv|~}{}{yttvz~qn||zte`nuyupiqsljk}{tr}trsq|wds~qryv{nrihuwcjwsn^X|~a[izyvqi^jmgu~qc}smty~uzlotxw}|xrpty~xuw{vqk{xw{x}oclyzv}zzxuvw_Zrv|wy}{|{~wxv|qwxsgdkiglzjZ[XWYYQ]iuouiq`^sq\Sdicy|vuowqpnu||qxt}~~|~tvy~rv{s{wyvwÿ¿ÿǼÿ÷ȻǿÿĿºúſQLEBKW\VMLUYMCBCGOSRIBKX\RA;BGLPIBHMROC99;=?DLRTUVVUUSRST^oxsnjccimmjhfgjkgeqxgXX`fhfb]bjhYMLHHLQTUVZXVVSPSRC?KRWTNBFGDL[[YXVW[\YWXZVNFNTQMW[EHVFFKQXZ_aYMEH]nQFSSW_^^RXf`]YSTYY^aY\S?GPQdvnce^TW`c^TPV[[ZTLGEMXTQ`b^_fpujekpiciomjijghmG?foeYVJCGLKLXhhba[MMUOL^fcXOZeaX\_\SPV`_WWUNLNQVZZYW\c_TQW`hqyuozibia`[LS`a[]lmZZgc`e_biYRYVMO^ZY\YY\_dcWT[YRUci`XSOOSQRXVOU^add`VPRUVUWXVXa_XXTPT[cc_`cgdbgmmmmjejyo\fpzskljlsmfjnmjkmmkomknlffptomhnttqqukrrrrnmnpnllnnjkpomwnfaflrfmxumil]aifZW_nhdmqrjppcmhcvf_lhrqkkhioi\\bgmtx{ycgtrgcntkc[bdetrZYel~xvfiszrksnmspkc\hj}zxobdfk{wkfllX>8@FK:7BEOSC3.?XaQVseYl`Uhzk\kyxvxuol^_qxyo`]wv[[lsfew|tnsumnmq|skmddt}tm`[fu}yhkxjduzoppxpfuukx~sxur_imbfg`oulir~uqnjrkechist^Vmx_OLSY[Zchglorqkl}vnfdil[X]cX_fkfberuxwxoopo[et}trjfNP]UcaLNlf`[cl~nkep|rrtursmjs}uyoz}vq~}|}zrxy}{|zrkityz}{smwx}xskqtqvssotw}|zvvvpoq{zdq~vstx}otoiv{bp|to]^{~`^jz}wpgZjkmx~vez{os}~}rwzyx}zsrx}svx{vs{zz~yyvl]lszw}wyxm|{u]Xpuyxz~vzx{s|vuxkajiedtuYZXUWXPYfxqtkleX^x|gRVhdjvtjwznjjpxz|psv~zxurzyk}|~vwü˿ƹɼſ½ŽŻĿPJCFR]^UMOWUG>CIMTVLDIWZN>9?DGLMJJLONE;78:68<@FMNJHIIE=535:?BGOSRPOMKLPX`fea`gpuy{wmddddffhlbVbzvcafglvvnf]YbaTKOUXYZ[a`QJE@ETYTQTYOIKWF>IRTSSVRY\YXWYRHHWWNSVWQIMGIHMUVg\M@B`yaIKTakXTNR_gb`]\]YZ_\YWRIHQcx{l]UQN[cYKIUZSRQF@AHROI]f^[dok`ahidcjkgfggivvTbnWTOGFOX[U[ee`]QCBPVV`dcQDVd\RUXRKNZ]VQNGCEHIKRSKLVYTRX[Yat|rk~qkoig_U`lbQWc`YYcjliXSe^QQPNIUZUY[^a\`jcWXbb`a`_[TNIJTX]YQV^\^f^PQXWROSTSTY\TWQLQZ_^XW[ZW^lohffdbvn_acmtqiifhslcgmojfflmgggfriahqookhprkyvhlsprnpwyrinoqmns}qzrqjlotsptvsnpqjeicaagbYbqoslbnnjiklffpsvmpmiuq^`mps~jaspbfw~tfded`kpfObpvutmbt~}livousdmkmtsqpx[Z^acbcbfqoYDQbO?9EQRPXO2/NhdcsvjnqpjlpaWavypljieidXhlsub`ke\fknrjakqqghieskqqivz~rV]sri[S^ongdpucZpj`hmZpormpvhkq|vtY\YTb_Yz|qqt}zull~wWox\\]dqrrqmio}pat~{jiboubUOZb]dhd]_bopdnwzklw{nmtpnuoQnpbfe_i`\hexjd^strxekvolahzx{wj~yz{~{xswrvx~wxyufcdovqnotyr{yw~~z~zqyz~|}nlrwquw~ztnouzw}vy}~gikjZ`swx~~z|z~{x~w{yy{|ssz|}~p}|~xliOomzwhmwznmnmtqZhtfRUgs{~sz~~~{rw|uysqrsxumbkeb^tmRUROUVDVY{shd\bZPdraRYfccxtb`issaYit{yzx|}twĪƻƺµžļɿTOU[]`]VRSPJIMRUMC=BRTB67<=@JROIECB=6247=BEIOPNMJDFPZac`\[apyywuofcdddeffgd]k{sa`cfmuoeefhlaWSUY]\\_d_MB@?EXd\S[\NLOTE>JSSSTVRWYXXWVOFJYWMTXTRKLGIFKTXjXC;JiuXHP\ihQPMVcgeb__ZV_b[VWVJJWixweUQNL\aSDKWSNRMB=AIQLNadYZfng`cfcbfhffgggk}s[w}\RQLGKT]]X_fb\UG>DQY^bb^KG[`VQTTKHU`ZQNICCDFGKPMJOUUPVZXXexxjo~lnmdg^Zfj^SY_XV]gpqeSRaXRPLKHUVRY``a_di_W\cca`ab\RLGM^^]WRX\Y_eYMV[TPORRQSYYWUOMT\_ZRUZVWfniedc\kybZchpsmefdfpjbgmokeclmefeetgahmnqkinpp|oiprnnkqzzoilqqmpryqyntopqsqttrrptxmdjgcdkg]fqksvdkpigljdiqstonijxo`alpxugfqmfnyzqfjjdfipoJpt|lxmfv~iivotqhpnwtntot]X[^^^^_gso[Q`bREDQZ[T_T.6\gboxqlomihgg^Vattnh`a_ah_ehitg_nfRdmipn_blpibdbqmgxinqypZZprh[OZpkcbpubWmh\d|mZokkhru`dp~w~m[[MMb]Xzyrrrvlo}~jthdei}zqnqy}ofzrikcrv\VX]eaef`]acntikw|vq{xkktqrqq_svk`blradptdbatnmxcn|oi^m~{z{kz{}{xwtwt|}{wxlccqvroowxvwvy{|qw}zqpqtuww}x~qkt|x{|~jnoi[ftz{}}w||}z|}|}x}{}un|xz}vvvwkdPpivmegqxmhhkplVf~n`PQdq|}}|{vt{w|yz|~y{vw|uzurq}ozymcjhb]hqUYSKLVGKUg~adZ[_URlhVXdd_i}v]_glrgWbp{yv{z{s}{Ⱦ½ýɼøĿŶþĿľǾYT[`^_[UQQPOPPRPH>BOVG637<>DNRMGB>:5357:AGHIKKKIDAJYbb]Y[`hsyunkigeffddcdffjrwrc`cekpmhnrrl_YXW\a^^_f\F>?EN^iaYfcOLRTA:FRTTSSOVWXXWTKCKZVNV]PSJHFFEKSYhON^deaZOER\TONNKBQeYKHC>>@DIJJHDKQNPYXNPcqpjo|vhkmeec`dhf^XUSV[eoqhVNY_TSNHGOSSX`cdb\^c^`bbdegkj`RJM]id\UV]X[i[MV[TOOONNPSUTSPMOX]YPRURXcnebg_[iufS[fmonfcgacngbhjjfa_gf`d`lo]^cfpveinxzscp|rkhdq{umhkqsnnqqopjnrsrpovtrpkszodhgelsgamshknlpnefkjfnvoxuwqihrwiefmqqupikmlmssqppokkigqy_usoqppxefpolstrs|sp{sog\\]]\[_oskejreaRDXadde^BRse\jlcfmg`bUR]bgfeg`TTTUbg`gcehXiqJTnlkie_blode^bwhoymfapnTSqu`WPVlf^`qubTc~fX^pkbrjefsoMTr~|sod]TCP^Q]unsto}y{rkuxyroy|tk{wv|jx{\^hdwjcjSYcfgpw~osm~ljtp{znkrhq^jvjn}waknmfkumavga^}l}}xgxxhu|zyxxx|}yy{}}{yuzxirx|yw{ttxlp|~xyz~pfou|zuz}|yxzz|~~~~wqq~x~yuz|~kypxzwu~y}{|yqx}mx~]^s_qa[fpulgkolk]hvk[QViq~zwzxzuzuf~rwxzz{vvwsv~|||r}tqxvutk|nifkf^\k]dcKDMPCPWtw[\WS[QZd\UZgobouid_eiqcc~|pxyxŮľÿȿǻ´½ƺƹž`_ee`\VUUX[\YNJIKOTO<27<<>JTPGCA:3136:>AEHIHGHHEKV^]WSV`jkhhnqkgikkjhfdaacgfftyjabdipmmtuj^ZZ[Zahc]]gfG:5/0368=DDEFGGHKLOWWTPS]fjgdaekkgefggfda]\`ef]bs{n`\\ajlmnfYMNW]acb`^Zeq`HPUTT]feoy]X`P6:FNFEQPNPTZZYJACLQQQZSOSJFIKNLJPNGVcjZP^hpcSRTUX[ds{oTXlkfTWegXYbkrpbWUUX^VE@FMLJH>68HFBA>@GGGRUKKWcgffni^jueZc_W^dcb[RQXdhloheb`_]]TJJT^^Y[fmbW[ba_agmokhkj_W\hje^YZ^abdYJZbRJMOLLOPORRKDLVUMHRMIZ`fcbdZ`kpVLZgigh^TZ_^hqjb`de^Y\``]W^lbX[eghgpjuwsj^g{rn]dnqxtjdjstmjojdgehsofhlloqnjklleefijiome`gp{rnidjmqpnrkmppknlvseemojjtslnqppskmqrninkhlquytq|wljpnedgmhotkuzmlzzl{tfe___frjgide`fYVaTSceahba\YaYaaYjod^]Y`kgb`QFIFFWd`V[^VUYo`GZhobYfc_jf]bSl|bja[[W`MPoqRFQ`cVRnv^Nb|cV_etzxk[YibUi{qjknvZ=MaZYefbp}}zxzqhgqvqkix|zusw{jsuuulh\lt[g|urkkyvcnxvd|znov}z^e}ilnotw\bofngtx}qpm{|{tw|zx|x}z}pkyw|uwvpysrnolmmfgr||jz|yvx~y|y{~}zwnptqip{xrrqkjp}vloigrqv{vw~|lq{yiow~~}t}dpdw}zov~v}~}tuopstrx~xu}xsqp{~z|}}|pzzztt}b~x|z}vyr|f_}z|sq}}}pzno{{uoelixrhqcsngwcMDPNT^ctmnqaZXatwnso{twf`ys~}uv}|wx~½þĿû¿ž¼ƻÿſ½Žcbgfb\W^cc`]TN[eYIA<56>EHMTQF@;0*/8=:>EDDEFILQTTRMKNYfkf__`begdabfgdb`\ZdkeZ_r{q`YZ^fkli_RHLW_a```a[ctgNRXVX`ggrx^[`R78EMDAQSONR\]XHACKNRS]QKNFEKNPJKNMRdfcTQaml[QTXXZ]jzybP^lmbUagc[_fmql`YWVZ^N=AILJIE947@PXPKPXbhbYZ\T]tra_koe^cu}vtiYKIW``fke`cjcL=AMY_ac[MOVSOKFDC>AQXOFGE<47CF>;;<@FEIRNJOZcbbhh_arp[]dVS__]^]VS[hjlldfg`_`]PJMX_ZW]kjZW^b`_cjmlhhmj_]afif_Z[`cdbRN^^MHOPJLPPPSQHFPWMEISEP__d`b^XcngJPahhefXS\]^lpe^__`[WZ^]ZSak\UXbhdelnwtk_^k~rf_fotwrjbmvrkhlhcccisldfkloomkjijfefhhkpja`gs}qliejnsponglpnknlvqfgmnhkrqnosqpsknsqmkoliortsut{sjlpkdbjogjpftxkjurm|pgfeb`ipgdliafq]\bWXadgh^fha`U`d\injjbY]ghc\MEHDASa^YUURPQefOQagbYej\efY\Tfcb]T[WXMNn}qRAN[_ULmw]I_w_X_bzwkWVgbcospmo|vODSg`Zcdfx{~yvtme_munii}}sr{|~z}qss{nvzwtnskux[qqqzzjiw{}rrtpq}|~v{]iipvltp]knqzgvxz~qto~{|vyzyy||xtwx|na}xxsrqp{qngjkkkcfsz~ov~}zvuyyx}uuy|wrnhn~wnihtyknpffisvnwqdfkppwtr}}mk|zygnx{|~}v}}j||ey|tz~{{}}|z|~~{z~yw}uxnzve~zsxl{ti}bbyvwxjo|r{x|on}shmilzslq~mv|l[L\YYkqzpo|nbcr}w~woeq}u|~~zuxyƿſľüľþ/ľºŽddgea[Zchga[XZekR@A>6;GLKLRSD871-5?@FMJJHA848GWVLKS]ee]U][Qi|j]cmi^^iy~xrcVKO^a`jkb`giX@;KX[]aaVLPVRKJDA>;ETUIEIE72=D>99:<>AFNOHHQ[`^_c`[grbUb`NPZXX^_YW`jkkhflg\bd\NJR__WVaibXY`a^_gmljgkojcddfgfa\]cfd^PSaXIGOPILRQPSNHIRRHFISDW`_b\`[]cjZKZdhfdcTRZZ`om^[\ZZZWVZYVSdhYQVaf_fhrxpd[_nqacgpuvngbpvohfmj``cjqhcehkollkjiigffhknmd`cis|pkhhlpsooielrmlnowphikkhlpqnowsrvkntollplkqtrrzvvwokqrwiaboqeimdrtijojnxefhf``oqhgmjf{x`b`^_cgokcqtphYcigknqmd[Zahf]ICJHBPb`]SLNMM[dTO^__[alcbcXXU]fTZNXUQIMl|qS@KV_NEkuXD]q]Y[_}rgTUeimmnwsupOPbn_Zdgp~u}ssrg^Zijglgwxjj{zsvx{ynuq|q}vuww~zi|ns|jgw|zxp}zttt|w~}tscqix}isiavy~|~gv|t~y{pv}pz}~z|vwywyzztqtv}m^|zupoor}njbfmhkagtz|}vvtx~zsvzvv|tuws}vnne`uvlmantlilc_fgqtnqfailllunw{lixuvehzvwx~xyo|so}{x|{|x}{tunrk}z{stfnscvzecovk~ia{szw{usthtkuzy}lqg]mij||zy}vlm}v}w~~~xvtyyĿ¿½º»ļý½ĽŽĽdcfea[\eggeccchiO>DA18B?789:<<=FPKEMY\Y\_]X]ihUV`UJPSTZ`^WZdhhgfmqc]dc^SMXb^U\kf[Z]a`[_jkhfimnkfeeggfd_ahhbYPWbUGHQPGNSRORMIJRNGIKMPX`__]`YaccSV^adda[OPYYcog[ZZZZYVTXWSVedULVab]efwth\Y]sibgfqtsjcdorjdfqk\^ekmfcefkojkjjjjhhhjnohbbdis{nhdinqsnlgemsllrsumjiihiknpmryru{iktokmqjisuqwvvutmmvurfafqngijdqnegidnp]hig\atpkkkhj~igedeimuopzw~wdjpqqpplg`Y^ehcMBFNKNacbWKMKKO\WO[a_ZZfjb[TRSWzmRSHQULFIk}oRAGV^GGkoQA\k[VT]laVV_mrij~|~mX_ro]Xir~ro{oqn^WXebfoerrdauy}xnxwrvvkvqvqt~~u~{|}m|qfo~yx{upzsqsxyr|yu{qiw|i|dpee}|}{dr|xq}~lw{rz||{yyvxvsywwqnrx}zi]}v{tklnt}kg^eofi_htw{zzztyvs~xru{vvzuwvkt|wljg]gpnpcgiochdZbaeqmpj]ebkaumn}mjrxrsic|vuuy~t{gzz|{tyx{wso}uz~rpjlqakuhadthp]|}swy}xv~xnus~|srzt~|{~o}k~{z}~}txz|þþ»ľ¿ſþ¾ǿ¿ƿdbdeb]^giiikjfgfLAIGCMUOHFNQA5678?DB>GQPOPTYYOFDIT^cb^\\^`YVYYW]eiga]``^]chc`kvp^SWYZ]b_SMXb`^^\Z]_]bwx[OTZ_fjkme[^_W<;LJ8AY_UPU[YTIJHKXVWVRPMFJYMFLMXgnf[QQamla\`_][\gztfb[gteUafc`bgjnme_^_aaTLXWJJJC<36EWUGFS`b]X[aYOgr[`gh_[cpyxmZSVPV\\ci`[bfZD:J__Z\]YQMOZSED@:9AQOBDNF31=?7688:<934789:N__VQUYYXYPFLYZ[XX\SJSZQOPYhulXNTiohddda_\\`jrle[dwqYWecbainoofcbcc`[_fZPLMG?98F\WCBT^^ZZ^aYMcw\Zae]V]kqpeSKNWYYWX^]UW`[KDO`e`][[\PIUbOD@87BJG@CMD339:313679;DozdTCD^]KUbcSJ_eUJKf~t^ZYOfye_m|~tmm~u_avzmaln[daMJS^_jiTnyi\Yw~pp~qevsqux~xrutyx~xzusoxqqriruufrhrqkkhwpmqlom{uvjttzpn{|{s~lnfwzrnryz~}zpmkz}ytrsw|{vtt}}}}ytw|wqounfknrutnhr~|wqgfwhltpj``ppYUjr\adtohtzhm}ry|zx~txwtvibotjgkha\bVTcfzfiouigj]eVZkle^VQXZ[pd`{sflvsr}yrqsrrpvqwoe{l|x~xux{zvms|^a}cl^dckf\ajfuzhvx|~}zpvx|~qo~nv½ýýĿùľƿûþc`abacmqpomlhedYIMWWU\[LBHSYUMIDCJPSRTVPMRY]VPVYXZ[]ZSS[[UQPRVY`eddcacdeecYRYfmjcbZOLR[`ec`\WUXYVZ^_arvb[]\ahjg`^___[GANGDUa^WSVZ\\[JER]_]]b_QR]_WSUbsyjTO`plehida^]^enmhcamwiV^hb_cornkfedddbcjgXSRMF>:@U_NBM]_ZY]b[OVvm^__\WYdnoj\MJPVUVVX[XSX^XGEU`ee`Z]^MH[dL?75;GK?ELOSTQKKSRPZa\PJNE>EPUYXUTTZ_a`aed`_bdb_^[bbRSfj[]f_YZ^dd]_eiiinibcdekk``jle\Z]fiPCZ`SVZTNNQMEIKEDJ\d]XXZYYWY[Y^[RY]b]LCEKYklZTXRLSYTLLQMS``LDJT[\a`fn]TS\{zd\\afgi`\agebhjpgX\bmnedccbinljkklppkjlolgjihnwwmfmjfihhhaiqnuifkkgcoohgkmpswr}vgppnomfcmtptyrovrlu|wnrqckqomkhefl`]_aUVblhcggkng`^lhhxiclhqzs|otzzvu|xokihghhdhmfcbYilV]cdfcjXG]\NOJRefMNanqaE:K_l_G<@KH=HpwdWFF]aTT_eTLffQEOl|o\XQLtu[el}uqlv~l`n}z|pfcmjZd^KJS^`jeVpsh\b|mozlszuuz|vxuzz{}xyytoz{z~xtieswvl~oiyoihjwnrqnorsyltt{inz{zsrkjg}xkqovw{ux|mkhw}}zspnsyyvst{x{|sqr{smqtidjkqwuldj~{rqknpcjsmma`npVWjs[afyoiqzmi{w~z{x|~|zyz|pkfftjbddbW][O_`vteowndmia\Xhod\XTVYYeh^v|mlxxy}yrorrplsqrrg}m}~}xtyx~|~smrh`opg]c\io`^ffmvq|y|~y}~|}x{y}~xnpnqȾ¾ý½c^aefkrtsomigedYIN[\Za_MFNVZXSPIJPTRQRSQPU_`URXXWZ\]WNQ^`QILQVZaedccbeeed\RPZeihdf\KENZ_aa]WQRWYWY\]artia^^ciib]_``_]JEONLYa]XVX\_`YFFXddcfk`VZ`_XVYgyxcU]kohfkie`^]^gmkf^hvtbYcf^\fpolieggffgfmfYYTLFBCM^ZII\b]Y\a^QMcf`^\WU`imk_RHJQSRRTXWRSXZTGN\cff`[a\FI`dG;44@NH9?J<-04200223689AKPPQMIHNUPWdaSLLF>@KVXWTRRU[`_]`e`Y[bda^]^b[NZjdYbeZWZ_aa^aehghkd]bedki_dljf^]`cbMJ_dYUVTONPKDJGDJScaZXXZYWVX[[^XTZ^cZE?EQcocSTXLJTYRIJQOV_YGBISY\a_fjZRSgt_WYcige\^bcaamlld[`golcedcbimkjjhltrkgmqkglkjqxvkgofbigggaskqsddjjbctlgekprtxr|vkqllpichoppvtmswokzsqyp_oyqonlgkl^[``]_ejhcfdgmg]^rg[pn_dmgzyix|ywu{ukhhfdehgjnhc``pmZ`^^fdrdAWlYXWUgoUK^rxtX;Kbm`G:CRI?Qsrb[JHZaXU\gWPjgJAXtygYUGSyfWij|zmlkyyhbtwuwhbgog[cZHIT_bkaXsuog[iyhhx~|wz{~rswy~~|~}xx~uo{xyt`gw~wzhtzjnfpvqvqupvw{ntszwfq|vxilzgm}qlqio}xxp{ztwpicsz|ys~ojnvvsrryv~{yknr{}qmql`aiip~uicc|{qpmpl]fshngbjlSVjqYag|ojq{nf~z}yw}~wknfcuj\Yaf[T]U]]fcm}tljlvecYcofXZWRWVcnZkul}~~~yrkpqoinqmsh}sy~wqzv{~|rlnwbh|k]eWfyd_bfhq{zu|}w~vzxz~yzxy{}|z}{rlqtt¾þ¿ĸĿĹſÿa\bilqxxtnjgedcXJP^`]caOLTX]][YPNRTOKPTVV[cbWTXTRU[[QLVc_PIMSX\adcccdddebUKPZbgihhZFCNX^b`[TNQVVWY[\artlf]\fji_\cc``]LISUR\^[XVWZa^REI[fffgkb`hk_TZ_m~w_Yflidjngea^]`hkifenwo__g`Y`jmiijeeghjkloe`\QKKIK[`PGTa_[Z_]SKSmx`[ZXV[fhigXIELRSOOSVTPSXWOKV^djgbaeT?Kf_G837EPC:FF1,32-.022358=FOMLLGEIQRSbdSLLH>?IRWVTRPPU[][X_dZSYbc^]]__VQbh[[iaVW[`^[]cgheeg_Zbccid^gkhf`bd`\JPbh_UQSPNQGGIDEQ\h_UVZ\ZWUXZ^[ST\abR?>G[hgYPXTEJVWMGLPRY^R@?HQX]`\bhYOUqkZSYehf]Zaa`^auiib]dkrjdeebbikiggbkxtieotjgnmkqyuhjqd`hihec{yirqbdif]eqldblquwxr|wklilnfcjqnowslqqlo~}nszncxvhnqmkmna^djjffgfggcdke_frk^knY^w|bgnz}xwtysgffedbehlpjc^aroadZSdfnrMKsg\fckoaVavxuDOimlPAIQZ`^W`hVN\zz`RP]ee`Z]a`]]gxeea_glskded^_ijebabpxmegstigrokryufmtc`hihfk|okrjahhbZbkg\_msuwus|shhfkibdkonquqllllq}wltxln{qhppjpsnddjsqjhefghbcfceiqtgdjZa{suq`u}w{sstypddecaadchpmd\arogk^Q]dgtbNpo]kpoklhiy|UZrz~WOegbdhtvle\T[sfTag[\icTRapwfQQ_srelnsvjpyyvmk|qkoelxogce_NVcmnh^^tprskt~jhy}ys{}r}{~}zzz~vu{z}sgv|v|nu}c}{wxzvrxouwrtll|j|}imlevqltdao|}roxtusladqqrvptocis}qhlsvv{xndis}qm~u_W_igr{fdazsnrneVludo~kctkTVhm``m|psuvoe~v{w}|wruoc^ZcclbWdrlYwgydsxrympmkudUZPRT[pqgm}vmjt{d]m|ylnpvzyr{xtrxjwsmyyokixd}}zck^ewpdreru~sqq|{ir|~jkok}{}vomtwxŰnzzps~{||ɿ˾Ŀ¾þľ¹º^_fkms}{sjd```]ZY]aadhe\ZY[bfh_OMQQLMW`a_``WOV^VNZ^QIPai\MKQY]_abbda\aca[OJPZaegjkTADNV]_]UNLMLOV[[Yevvn`X^imgadda_``WTZWP[[[\WV]`SLT[aginnjjljbZ_ae~ub`deehureca_^djielrvrf_eaW_lkhlkjifehjsvrraKOTTV`fWJWc_[\^TLMUg}aTTSRXdha^VHELVYTONONLMRTPMT[_ijfiiUPbc]UUZYVVVWVSWWSXceQ>=DNPQ^dO?BEBEPSMKIHIMTWVSRTWSNMPWXST[[ZYX^__rnWQUZ\\Y_hfa_^`_WQTX\^Y]gegigkg_\URhubRVVNLLLJ@E\h^UQSXXUVVUTRUST^e\F=EVaZX\TTL;FRNGFJMOSWL<=CHR\bXP^_NQiubRMTZ\\\]_^\Ydwj`abdhkqiefaZ]fg^Z^coob_lwqcj{rhovriprddkglqumgkhgpq`^]^`^\fnnpzsqneb]cf]bmnklpnijiegovpktpisslllkrxspolx|pkhiliddhgkmsrke_hxw{w\m}vrmkostlaa`]U\d]^eeb_\eqomqkRMart`erfjmtyrv{}}uqy|svuvsngp}llggos{vgl~yoz~}wwzuv}}ujr{z{sovvwmcqy}wpopzxuxx|zvx}{x{v||y{ts}}~zym}ys{|||~~ysvwsqjmnv{ozleogmvpj]enu|towtrvsgdkfhplqoxl[exuoeltuvyvmbiq}lok][aidl]jp{}jor]_uoksg_ogZemfeesswxnlqxuqrq~{wx}~|lbjgpqqtqdu|fevrxq}~z|{pio`T_bfnunzz{|sil~lan|{zyxz~voyuhjbuquqhormlev||yrwt|uvwu{fxzpymjcv|c`p}wa^bcuswzhiƿʸäs~|||}ÿĿǶſÿȿý½]gkks}zoke^^___`_`aaejha^^`dghbURSSU[bfc_]]VQXXMN`^OQbkeTMPUY[]^^^^]ahbWRMHMYceeggQ@CNW[[WMDGKNU\[W_lsqcTUcnbZ^eb^_`c_^ZWWYX\[WVZ[OTaefikomkjje]aiiosddgghprlhd_]^begknqqka^[W]mhfhongedgllv|u^Q[`Zdnm\Q^j`WXXQKPZh}ePOOKL`g\XUGCOYYTMJIGHNQQPMPW]ckgigXDD[iZNMKQWJ@>;;@@56<81-,3@JOURE<9>KTOQ`[D=BFFIOKGEFFJQVVSRPPSNHJORRRUXX\YU]_jvaOOUZ[Z]chb\\]_\TOQW\ZW_dchhgkha\TTpl_ZZVMMLRJAQffZRPTYYUUWUQRRNXa_PBFT^a[]^TPF:8;HG;7<=0(+1;DILLFBCCCFMRTRRSONMGEINOQUVX]_WT]aqnXPPSZZX\ef_XX\]YUNOV[VU`dcihgnlcZT_tg`b\UMNNTIF[i`WSRV[YVWXURSQOacYHDR^c[^f]QKGHIIJFGIFMUM:8@CHU_XPOXSKWkdQPRTTUX][YZXZno___aehkoiea]Z_b]VX`efa`djmhetvcehnompqeilgnpnihfbo|ndb`bbfikfk|s_kiYRY_VXkoa\hj\_ib]dhkknqa_pnjcdqvpnplmulijjiiejgbltqiggissyxcfunaktpnsjgf`][WX\YY]]]^^_eknkljjnipkcnmlt{q}{{|}zp{urrt}us~|my}uv|{vv{t|}yxy|~~{vy{{y|oizzzz||{ow}~yzzns|wp|ootimoxx}wqnwknosn_ezw{bw|ioojkqrkihfihrhUdqeoiqqtvvuoVct|v{tmgghfqk`lw{xis}kn}ppvmccdlvj\etxhzzkeqtnlwvrry}us|rwqv}}|~|w{u|r|r|vy}e`kupjmtwpp}vnnxux|tstw}wwz}tlk]mz|trmglwjy~}yt~{zy}w|}jafsmijf^`hs`Ui}hPV[cqsvrsü¤{|½Ŀ»þýŶſÿ¿ž¿¿¿ÿÿ`hio{xnkga[\^_`bb`^^flgbbccefge]YZYX\ceb^\ZYWPJQ^aSPcoj_RQUVXZ\\[YYafcYWRJIWdd_bf_MBEOUZXNIFFIPWZ\`ioqfUUfmdX[ceb_`cca[VVXXXYVWWWTU_ccfhhjhihie^fop}{qeeggkppjgc\Y^bchnoki`WUXdlfbiilod^beirzwh]bccjvxokpj]XWUPLQYb{lPKNJJU`\[U@>Q]YQKEBDJOQSPIHQX`jjdf\ORae^XTWNHJ=69FI=57;9+(0;GQWYQ>4;BFNNIQYI:=HMMHA?AACKQQOORQLIFDEHKMRY[\\TR[`drdSPNSZXW[edYUWZYXTMNVXRU`ddiffnndXVioecb\TMQVPHQffYSSTX\ZVWZSXSQXfaSHS_eb[baXMLIHHHHGJJEOUG9;>@IW]TNOSPO^h[MOPRQRY]TV[W^og]]]`cgjkgc_]]_^[WZ`ba]_ceegevpadbjonmoeghfmolhfddsyngcbeehikenwa^ncSQZZUaohWWgdT]g_[cgfgnk]`nhd_ftrknpknnfhjkjjikalptohfgnut|oelqd^kqnkuheg^`^WV[YY]YZ^^]djmihoxscnpdmklyvx~uwx|~urspruwqtwq{|r}~~~{}yw{zvz{~suy}{x||ruqy~}||wpv~}rm|}qw~uky~nilt~xrwrpnnqtjcszxpbxgpjlpuslihjderhScr]mqspsvwvrXav|t}vjmmldq~sfjx}suw}uqsoy|th^ewwk^hxw|myjdst|lorouxsp|qi}zyqqmv||~y|~|}v|~qTm}lft~qpku|rpzw|~}urz~uur}z}yroesy|yuht}o|~|u}yy~~|}wy~kug^nlig}oW^dnaRi}_MSbotwyizĽ½ĺžĽɾſ¿ÿþûÿ¾bhjpzujhe]Y\\]`cc_\]eidcffebdfd\YYYX[beb]ZXZUKIVa^SXjqeXSTUUWZ\[XW\egaXWPIO\da\^aWICGOV[VJEDDJRX[]ekmocX^ge][_cdb_afd_XTVXWSWWXXVX[dcbfgggfggigdfmt~|zqeghilmmjhbZX]beinkgd\SRUgmbdkijg[]ackwzqf`bbfr}|sppg\YSSUNR[g~{[JNNHKW]_aLKWXQMNONR^`SJMOOOQXWQWXU^kdZY]_^gggda__^^]\\\^_^\]__bigulaf_goninffffkmlgeeisupkbdgfillejl^cm^ORZX\jm^PUedS\f\W_lfckaZdic^[gskhoniojdijijknkcyptlhhgptuulejka`klkiskbea^]ZVWW[^WW]][bgighoyvdnrgmkmxzu{{ns~u||nsrpsr}rnquy~}~z|xt}|z{|zv|zv~x{wrs|x}www}}s{x~~~~}~upu|vyxs}nq}xkhm{}wsyv{qqqsufl{wy}ggufllnsvrnhgod`pgYbpXfytortx{x_`v|s|}jrtpco|yyrjwvx{{{tzo|}wk]f}wocnwt{uulfqr}~temkmorxjzkcxyvpqhwuxou|wrWumcuz{|golqur|~z~z~}ysts}uso|~vtoxy~zyp}t~xv|wyz|xx}}qlrXjkif{uUZai`Ql}^JQizkt~tźþüľƺ¹ÿ¿ľ¿»þûžÿcghovqgf`YW[[]`ec]X\egdehfc`adc][YXWZadb\YXXRKR`cYWero`TQSSTVX[YUX_ed^ZXPMU_d`ZZ\TGCIS\^TFCDDKU[]^ejnmd]_``^_`_bbcced\WVWXWTZ\YUU^aebbdffgghijigelvzxxoghilniilhbZW[dgjkg_^ZQPVim`cjggaUZabkyzncbddkz}rmlf`XPYWKUbokNGMKFMX_i^AARYSLHB>=BLRXWJBIQXmo\_^TTY\[[PLOJWK9;IQB=<:90,9ELSYZP;5?B?ELKKNJ@CORJ?=><:BNPKIPUQKGEEGGEIUZ[]TKSa`ZhiOGFITXTS^h`TSWWVXUMNXWRXabdgcdppaZgljigc\NQ__VVcl`Y]_]^`]Y[]XQVYcl]U[fidbcf[RMPICGJQNLJFMK@;>;>MVTONNNNS[YNHJLNOQSQUXRR^haWX[[]eedb`_````__^^]\\[[[`igqh`e[enlgnfeeeillgcehptskafhfjolgjidgkZLSY[eofTNXd_U_cXVaja`gZXec\YZgnehmjhqwhjjffilniowlpjiihnruslhge`cjgjhmmahec`]SRU\^US[\Z`cdfjnvwgnrkmjnvutxulrzws~sqzhtnnrqz}zlmuuvw}y{xvyy||zz}vu~z}xxu~rqvyp{sw{}wxq~yvx}~~~~}~~wrr{~}zs{yvwy|tejtx~u|mztrtsdszuzzcnqhjlpytotieugXmkedm__}zpspxf[v}r~oqyyin|xw{mu~~{u~vr|xn_iywlvtn{ywomjoqy|qbdchknif_sztnsewotip{rm~og~{z{ikqu~{u~~vy~{{rmu|q~{wqm|}~}{yz{z~pvwu{w|yy|yqxxW_dfcq|ZXbf_Ro{hTWj|yjw}z}~rŹſĺžýöĻĿſ¾ûǿ»bdfmplgcZTUYY]aeb[W\eecded`^aca^]YXUXad_ZYYVQPZdaT[nqj]TRRRSVXZVV]bc`^^YRQZee]XYZQEENV\\RGCCENX^^_cjnkc`]YZ_aaabdefe_XW\^YUZ]]WUWafdaaceegiijomgfmvwusjgghljfjlgd\YZfijf`]\WON[mj]ekeb[SY^bn}zj`cehs{qmkgaUY^IG^kyxTHHJDFPXehN=ERXRHB>;=EQZYNCAIP`rhYZWQRUWZZQTRVZF8AKL@=;;;55DLOSWP?5AKC?FNKFEFJPUOC>@<8;DKIGLUULIHEDB@CPZVXZNN[aY[j]JFDJVUOS_e]UUVUUUSOS[WT\`bceceqo`]hihiid\TWc`W`mla_aba_a_]^^XQYYirYYciiedfdYWUQF@IQWSNIFII@;?;@NTSOONOOSWRIFGJNNOORXVNS^aZVXWY]bcbbbbccbcb`a^\\[YZY`ifkc`bYdnkflgfdbiklgcegnqpfehgemqkgijhjkXPY\_kk[QVbd[\c]U[ge[bcY\c_VTXdebikihqxpkoldcjmonspkniiihnoppljhdcdfdjiglbkhgeaSOV__TOY\Y_aacjnuzkoslmhkrqrsnlrtspxulfwbthloqo|xfpzypxzzzy~u~vx}}z||{|v}wtv~q|wxmqyln|qsxovu}~vlq{rux{}}}|||{z}rszzquyyww~mkuz~x~sr}tqwrfrzuzycynjikpzqk{makUepmhifc{rvprnWqr|voywqxvtsq||st|zzvgoz}pyujvvmlmlnpry{pe\_dge|nc[m{qlvexmsll}|tsq|~~ulqv~}v}sw{{ymjyxwqxzy~q||l~x~||}~lutzz|{}y|xt{[Z^cdha[ff`Soxtdeln|yt}ozqƽ´ǾÿƼþžĿùƼĿƽŽºľacgkljf_SOUXX\`b`[W]cdccca]^bb^]\YUSWac^YYZUOU``XT`mmeYRSSRRUYXTV_aa^^^YSVafd\XZZOFJSY[XPIDDHR[_^aelnjecXRX`bccdfgfc[VY_`ZY][ZSW_egbbcbdddikpumghovusohgkljggkkhg^W[ijje]]YSMQaof\djd`XQW\dvtc^aelz~tlmmh\YcV@SimtdIFID@IR[i[B?FUZPD>=;?JY_SC?CGSkp\UWQOQUX^\VZ[`XB>KPN?<>>:8;HPRTOA6APLABINIFHIPXTDJWTOVVMVb\T`eRIECKVPNVbaZXYVTTRPQZ\XZ`aacdagrnefdegjjd^Y`ga\emjdcccb__a_^]WUZYqxW\hiigfhaX^`RBDRY^WNHEIM@:B>DPRRVSMNPRRJDDGILKKOVWPKT_WTWVSW\_``aefeeedcbd\[][[YYbidcaba\fnjbihhd`iilidcentndjlcershehiilk[Yaadj_UZ`ca_cb]Y_h]YhaU^cYQQ\b^chijiqsnoohbblmqrlnkkiiihlmlmnmlfbaabjhdmkshbhfUMUcbQJX\Y_`^`hjt|npqnnhipqqpnlpsqnrtpmewy`rweilpxk|tdy~|~}vn{w|vw|vr{yrvwxx|wzz~xq|{qtu|wmvtncqphp~vkwqjss~whh~|popuwuvvsvxwuzyoyvq{zuswwp|{{y~n||rrtqiswytholhjn{ng}p_vZ^rtohglywusnvZeytzqu}uvu~yov{vw|{|{rv|}rzwiqsijlknnmryp~gZ^bdboy`Wj|phyk{junl~xmztvv|u{qxy}wkfwoswy|}t|xzm~~y~{~}s}ots|szzy}y~~x{bYZ`jkv~feojgWnvyrwxqu|pwzypwupǾƾƽ¼»¼ĽĿ¾ž»¼achjiie[OMTWW[`_[XY_bbaa`]Z]aa]ZXWSRX_a\XWXTR[c[VWakk`VSRRRTXXVTY`ca^a_WT\ceaZWZXNIQ[ZXRLGEELW^`_dgjllh[OR^dddddefdaZY_b`_^\ZWU[ejeabccdcdmsuqhflttsrmijoohchmkhi]S]mkjb][WQNWfj`^bfa\UQY[k}}hY]`en}~vlinlf\acNHahfhSEGFADMS_gO=AO]ZK?>>>DR][J::CN`qcRRQLNTX]ed]\aeP?FTWQCBF@98HUNCFMMMKKLJSVG;;><9?HJHHNTOGING;6:GUTINXSO[aVWf_MJBCLRNNWb_XZXRUWRNXa_]acb`ccbirlhhfejmke\\dfaainidcbdb^^a`_^SX[^zvYbigiigh`\ddSHP^bbXNHFOPA>DAIRQV[SMPQMJHDCFJJIHQYSJKS[QTZRRY[\^_bfdcegdeecZ]_]][\bfbb`ddbhmibiiib`gfkkdcdownepl`erpgghhimma_eeeaY\d__bdgc^\bh\\g]Q`_TQV_c`eeijlromqnedflnwsemghgihhlmlmnnmg_`]ejhfrwwhchi[RYffSKZ^\_^\^efqyjmonngfmnnonknto}oqpjkjvo^ppdfkpxul|ri~y}|{ppy{v|}ruopx{uorqux||}}}qxw}zro{ussswpu~~sqf`x{khs{mjrikkr~{q_mslloonquojuxozu|y|zpozy{|vqouy~zz||m{rpptlytwrpxtnjio{phzt_ccp|thflx~sqpy~f]{s|}vrzwuu}uq~~z||{~~xw~z~wuyrqrijqkmjgmvoziY^defd_Tmqgxozmusrv|py{|}x|n~z}shdvkvyw}{svtxl}{|w}zn{ruwtr}{umx|w|~z{~oYY[irryikuulZmtzx~{|wr~wjo|rxn|q|ʽľǹžǾŶĻſ¼¼ý÷ľû^dhhgfdXJLTWW[`\WV[aba``_ZX\a`\XUSQRX_`\XVVTXdcXUZcjh\TWVONUZWTV^bda`b^WX`db\UVXUNMX]YUMJGFGOZaa`cgjklaNJWceffecbcb`^_dfdc^[[Y^djgdabccaciuysjcgptqrqlkmomd`jokhhYSaqkh_\\VOP]he[_ad_YSSZ\o~t]V]`gr|{oehoka`g\OZhbc_JEHFEKOTb`D=JW[UD:>A@JZ_TB4:G\olUNQMKSWZckh`\caI@P][PEFH?8:>LRPE@N\VDAJPOOPJEN[P>::;;=AEGHKOOJIOL=6:DSVIETYSU]YS_j[KHAEMONMZa[V\XSWWPSagfdddbbbacotkggfckqne[^ggeehnof^_fd]^a`_]Q\]f~o[gjfhkhhdbjdUO\efd[NGHTREFFBMUUZ\QPUQKIFDCFJIGHSYOGKSTQWZPS[XW^^bebbfkcfga[__]^]_bd```gihhlgdjiha`fdkkbacovmgqkbjpliihhjnnhhhhe_^ff]aehje^\hh]ef[Zc[WWYbecccijntmktlbeimnzrcnefgihglmmmmnke_c_iejkt{vhdimbV\jjTK\`__][]cbpvgimmngdfgknnjovnv~roigmjne^okcdjpusm|ppw}|{skryuu}wpt}jnu}xomomrxz|v{zjxyt~xujmzyuupruj{yrnh]fogitugjnhlir}ype`x{jhlkfgnpgkrpr~iuywsrs{yppnszwzxlzrnmxszyqur|qwokho{vpxydppr{vlicwrqrpocqwp{ntsvxlx|y|~xz}x{o}~uqhlxlmfekvqzh\cndkd~fSoqjvstnu~~{wzuy~||o}{naftwgzu~sqpuv|k|}}|zr~y~|p}|}uw|umz{y}rgu{zu|~r~}}c^V_urslio|vain{w{zpytxriikuz|~xlwyryŶµ½»ü¿˿ºļ¿ûýû^ehfee`QHNVWW^^WUU\ba`_^\WV\`_ZVTRPQW]^\WTTT\e_UU[dhaVU\VLPYYTSX]bb``b`Y[de_YUUURORWZWPJHGFIQZ``aegikhVJQ]cfgfdb``a`adqia__\]_dmnec`bccdmsyvjefjpsrsnjmnkg`cloihgXYiqlf_]\TNRbfa[_`b^WSU[^o{iW[_^gr{xh_hpj^aj_Wbd`aTGIJGHLNWcV?EQVXO<7?ADT^ZN=3BMQLDK__I>EIIMQQHIZ_L<:89;97AJMOQOG@HQNBDPTOE?P[WWY_[W\ZV_[JDHPQP_g^agbXV\Z\drzjckhih`i{heeeozxsnhjnpmggpsk^^hia\]_`a`[\fpqfajjchjmnggngbbcccc`USY]ZMIWh_\ghYZ\ZRIGFCHQNGNXVMILQOO[XNTYRR[`ea`^cc`fgdaacccbaabaa`epplnlniigdadfdhgffeiloqrjimgotjeelrqrunkklmmkflkplgouphfknh_ajd_ff]_kmknlflynfilmosvrhc`a_fjoqmjjjjf`akljem{smlljihhkjjk^Wcejgeb^adhe^_mpfa^Zennlkmk`m}hfuqd`cqqneeoktuexv||uzxkdhtibvsenuujkisvjgfaepwxtvtnrmkmn~qjbelpqrkjghuqoce]Uj{o__clsgclldcnrl`ZkvlaefUSdh]W_k~rjreoidgys~zqxjqp}|sismmvxpnkqvptnxiqnhbo~wy{sslxrkosq|xoy{z~z~vxv}~~y~lrz~wosk}}jztz|yr|s~}zsmy}||v}~n}}peVtzo~ad{zs|gpr|{izz||qkrpr}}|uoxyv{wdg{vxlnpdhqqr|xlpln{{wraWjzkfdj}wc^wqrrrfjmkjkf{|}}~npz{wu{wvɸûǽƿƿżþ½ſû½úƽľ¿addba\RJJRYZ\`YQT]b^YZYURQUZ[\XOJJLOTXYUONU]^WQQZeeWMT_ZNT\VPRXflbWT\bfd`_\XTQRSVYXURPMHEGJRZ^^]\`hh[RU_abba_^`cegjnpmnfceckqrlf`___`fsyrnifgilmnopljijhefkpm`bh`^gknojeaXOR_c_[\aca[TW\^etlSR\`botm_`llbcjnh]\`cZV^TIHEETchaZRKNTQC=KJN_^PIA:Jag[ROLLYb[W`mm_]bZQT^^__SQ]WKDCFIMMLS_V@AKHJRLL`f_WA.7A;5EUXTX]^\[ZVZe\KFHQQVeebdd`VW]_bl|xghiinhctrccfny{vsolqtplhhrti]bmi^Y\\^geX\iokedlhcghoqfhoieeccff`WX[_ZKTkl_digada[PNLKGQSOLT[VRNMOMR_VOTTPU]bec_^addfdbdcchgbabdbaakurllllikgccjgdkjgffgloqrllieqthfglqrsumlppnmmhkjpoosvojimlh`fmedgbblsjgomfpujiijjnrrqjc`_^gjrulgfihgcfnllem~sjlnmjfkqnkng_fhpoifa`dje^anod`^Zdqrpigf`ozgkvqe_ftqodhphuucvy|{umkgbgndeukfouokmjqthba^dpuvvwupmjjhsvgeaflonoqc_mxlf_`U[ord[]dlnacqh[erm`V_oibei^N]j]SWatumcfr]duvyy{z{wzfor||{~ngtlhsxoqsotxrlqgjrfao{xw~~mkxtllqoy{oz|{ww~{~nssrtw|~t~{xupk{wy{~xt~j{}~hc\xztnu_g}y~zszgrwxmz}~~ohlpv}vulm~quyp_mxrrfjielvw}nxxfhlxktzprgZg~oeagxxe]pvppm{djjhign{}pnuxvt~{}}x˿ǽ¼ļŽû½ļ»¹ž¿aa`a`VMKLSZ\__WRV_a\XYXSPOTYYZWLIKLOTXTNLOW^\UQS^haPMZ^ROYYPLRbpgWRX^cca`^ZUSQRUZYVSQPMFEGLU\^[WXag_QQX^`a`][\bgimpsqliecehmpoj`\``]cotnhgfgjkjiknljiijjilqpe^eg_agilrngaXNSac[[^acd[TZ`ahpfST\`bqqg^aje_flnhb`gcY[XKECCQaff`WLJMTOEFNPZbYKE??Tb]RPPOU_]WYelbW_`TSY]\a^RXbVKEFHJLLOVZPCFJGIKGTfdZL62CD9J\cce]MLKMQOLNSXcaTJB@HZ^SQRSTY[XW\fh]V`^TXYY[`ZS\_QJGJMPPOQWYLEFFFHHN]eaT?/=LECOWTNH??JPMHHQ[\P>:KVTUY\`aXVVWfgTMQWUScjhgb`^W\fdnmehjnmmv~yiccl{{ssvqmwysnjjtuhbimaY^b^alf[bffkjhlhffdssehpifeaaji`_[V_[Youeailstm\ZY\ZPRZRSX`__]RQSQZ^TRSNQY^bc^\[`dcc`dgjmh``ehebafqsplhfhlmfbfkfhuoaefgnsrrnidfvtgfgjopposmmplklikinoquzmlnmjhknjigcgvxjgtuhmsohhfeejnmmgdcaaejuxlbfkeglhflmdbysggppigktqjw|mhgrsqsf^fmijlljc^_^dtwqb]c`k}wku{mb_mxtmgtohxvcquyzkcheahlgjoonkwxoqspql_\^_gnprttus]gvky}hihaoomqth]ej|qXZXNWmiYXZagj\axhUcpfYR]g^[jgUUb_MGQ[j|xrrp^XhgYu~x|qwn|x~wv}xt}xsqs`o~yvy{|wjoj`jwfcnwsuvvzs}|wg{lu|qmvx|{wm|zy~v|{ttoqoepxvty{|x{iz|xcfmtqlr{dXr}~u|tv~v|}}}magxupijowlijle\qpohb`adltw}jmoq]`qikegvtrj]_qzqcY]oi[mrmdhrnzpqnp||zwspxyq~zyϿÿ˿þ¸ɸľý¿þ¿üûɿº¿ž\\Z]XMMNOU`db^UX\d\UYZSLJMQUWYSHGLJLRTMHKR[_YRS[b\NL[g[S\ZKGK[onWOW]ba_[YXVRPSUVWUUPNMIDELSY[YTTZ^YQR\aa\ZZXX]dimnolidbhnpqsofabdeegmofbcegjjgdefhggfilnmlib\`gfdjiiotmaYTTad\Y]aehgYVagfil_SX^akqi`\ademklhkqpd`]VNOEEXccbaUKQMQQPOTY`e\RKBBL[[SSSSVXYXW\bdZXa\V[WU[]SQ^[LKMRUUWTQTUMFECCDJW_b]L83HTOUYVPHB@JUPHGP\^WF:ASZTV[_c`YXW^mdQSXVSYgfmh\]^\eidtwigfjrmo~tfbht|vrw{soyyuojmvtkinl^Ybgacoj^a`emkjlfdddsqdiogffablh`_YU__htnecjotun`___[RSWVZZade\TSUU]ZTROLT[]bb[^_b`_cbhloof`bhjgcahsqnlgdjmmdbgiglvj_cefmsoqnhcgwsfddfnojmxkjnhimkmhooqw}ommkjnnggkgeo{qfpyrkrpmhfedejnkjffcbeikrwmbflfgohdjie`tsjfnsjghopjs|rkfprnphbholmpjif_^`hutn`\d`h|wkx{hbeputplwsnxugps|vjgibbgknoqwrlx{sostqoh][^_elprrsst\d|pz|ghhdqrmvr\]fkeQ[SK^k^RV[chdWkv]^mk\TUaaR`o_R]eUEKV_pz^e|]XUjdd}|yyqt~z}wz~|suzui|}||wret}i\lvkhjnovsusnzwou}ftxqy~|wtz~}y~zuo}smpmel{wrzxxzy}kw|~pehponyjvtZZx|~s|px{lblztjinxxjgeeiicmupd][]dirnjfdil[_o|cicfomqn^[jvqbWWf~qYksnbajuw|||z}vw{q|{øſýÿŷþƿſþƿźþºYXYYRKNQRZghc]X[_eWT]ZNJIKPTWWPFHKJLQQIFLSY\WQX`_SFMchXSXPFEL_qiQPX_ba^YTWWRQRTSRUVRMHCCHOXZXSQVYVOQX^b`[WUVW_gjnomicaemqrrrjaaegeehmlcbcegigeceegfddiokfgc^_cgghjelsod\YY^ed\Y]cilfWWchhii]UZ_iolc\\agkmihlqtl`a]USMFVcdb_WQTST[ZUTW]c_VWPDHS[ZTRRQSWZYZ]aaXX`]YZTTZYQW_SKRWYY\[RQTRKHC@ADOZ_`WH<@RZY\XQKEGNWYNGNZ^[RB>JX[VY\^ea[YWfo`RX^WR^fembX_]`lgev{kfhinqmr~oaalx{tqz}soz{wojnvslmqhZ[giddqn^[^enllkdddesnbjohgfadnh`]VU_gtqiecknsupb`_^^XTX\Y\dhf\VVW\_XRRMLX\\caY\cc]]cdnpljd`fnkebclsomlgejmkcbgjjnse]cdemqlpnhagwrfaaekkcmyghlfgmomhnoqx~pmjhkoldhkgkwzleqtooplkiffegjnjhefddilkqwnbdkfgohchgd]mrkjopkfgkojpyrjgnpmokehnoqqkjg`^dmuqj^\ebhzwkz{eelqtsppxwtwumpr~tkigbcgjqpt}qoyzvrpuxrnd\]_aejnrqrstbcvt}zifihpvoyrY_jp}YS[NQdeUPYaehZ[tiZlqbVSXaURnjTWa\KCLXez{[UxfQVVkho|z~vys~u}}xpys~tmbzvfXpyqelnuvkqlkuvntd{}w{~|}}|z~~tnzslz~nkdfzznwvvzxyov{zjjjtknuhzkTd|z~s{n{zkbowownjpzkbh``fnhfyp_\UYdgpjz^b^hhX_owagcehglp`XbsqbVR^yuYg|rukdi}wxz~u{Źʺ¿ĿĹþ¿½¾ýøŽ·¾ýVVXUMIPTWakg_\\_`bSWaVJHIJMSZXLFFIJNQNGGOTWZUR[_ZKDTf`TWSECEOdo_OPY_aa]URXYRPSSSQVXPIC@DKU\]VRWZUOPV[ac^XTSUXaikmmjeacjpqrrofbfiieglkfcbceggbbceedbadnribcc]^dhiidboshba]]chd\Z^dikbVYcghhe]WXdqoe_[\bilhhkourfdd[TSMR`cb^UQYYW^^YVV[`^WZ_PIQ[[XURPPTXYX[_a^YY_]YTQTYWW_\ORY\Z]`TOQTRKHB>BHQZ`_RHEK[`_[UMHKUZXPJQVY][RABT\ZXZ[_d_[WZkk[U[_XU^bej]W^^flbhwpbdgnsjjvze^eoyypr}xmq{|vnlpwrlmofZ_ijeetr_Z^fnmmjdcbeslbjjegg`dng_ZUU`pvhfedllruq^_^^_[VZ[Y^gieZXXW]`VSSLLX\\c`X[eb\aaftrigb`hpkcbgppmolggjmjddgjlqqa]acdlmjong`euqd`_cgecluggkdfmomgloqxpliglmfgkiioxzgisonokjlhegikkmjhghggiklpqjccifgld_eed[jnjjlnkfeimlnuqkhlnllkghnqrplkha_fouri\]fchxvmzydfmprpppxytttqrt|tjle`eenvpw}pqwtrqpvytmb\^``ejnpqosukcmv~xmhihrqyw_epsqNZWHX``TQbigcSgw`app^SRYWLdrZN[_QDALZn}eMlqPJZVqr}|z|ztp~z}}}|m|tybrdWv|tfkmyqdmhkpwrpl||||}|yz|ytuyqjyspv{ofedr|nvxuyyzqv~{sklothnqg~fRn}ysywzmdopluuhosa`j_[arkczlX^XYdfmhmY`ZifT^qv`c]ddckpaWZoncXPZvz`iv}xzpr}z}zѿĹź¾Ŀʽ¾þþŻ̿¾TTUQJJRX\fmd\[^`a]V`aPGHIJNVZUHEFIJLMIDGOTVVRRZ\RFFZe\VULCCESjlYMR[``]UMPZ[RPRQQW[THDA@GPY^ZTUYULNV[^baXSRSUY`hkliebchmpsvqiaelniehnicbbcefc^^becb``hpneaa_]agjiebhqk_cebdehc\\_fjk_V\bghgd]W[lrh_ZV\fkfchmqsibfbXVSR]dc_SMZf`b`VRQXa_W[i]JOZ_ZVUQOOTWYY[]^]Z[]\TMNT\\]`WQY\YZaZNRRTSMG@>EPR\`ZRDFU]abYRQQU\^THOZZ[]YNFJU]\XVYad`ZU_neXY]]YZaadg[X`bmj]ntc_cfrufk~~m]_ksyujstku}|tmmsvqknmaZbjjfgus_Z]gmllha``cqh_gfcffaene^ZUVbsocfbdjiptpa]__\YY]YYbihdZY[]a^VUUMRZ[\b^X`g`]a`l{qfebbjpjcdkqlkmjggjlhfffhlqm_`acejiinle_brp`^^aeablracicdkolejnr{okggljdkmhlswtilnknlgjnjfilmlkiiijjkllmnmfcchghib_ded`gjjihihgeejkmonkiimljhijlqqpnlhcaipsrh\_gdixur|ufelrpnopvwsruvtt{yolkd_bftwnz{oqsqpppxyrlddfb_gnnqrkrvofjuz{qkmhyqwxhjsv{bN]OM[Z^RWkmg\Xsubgnj[QPRJWwfR[a[G?IS`vtRW}xYGLY]wtwy}xmv}~yn||}jsd[{wljlym^ieiq{x{nwz{}uyw~z{v}|twxs~tri~xswvvvfcbozzv|sx~}}{{rw~|zmnksqcqme{bQ||wsuy|qkpnjzudng[]jaT]sje|eN`\[aejh_X]Xk_P`rua^Tbd[pob\ZffecVc~im{|±}|ŻƸƻǼ¾Ŀüɿ¾·ʾÿTTSNHLW\bkk^Y[]__^]e\LHIIJQZZODGHIJLIECGMSVRMPVVLEM_c[VMB?BGWliVLT]a_XLJT][RONOPZZODABCKU\[VTVRJKTY_ec[RNPRTZafjidbbglnqutjbclsohhimhcbcddc]Y]bdca_clnfb`_^`egjgcdmoe`hieijjc\\ajli]X`bfgfd^Zdsoc[VU^hf_ahoqi_acZZ[YZcg^SQ^lokdWPRW_aXZliLET]\UUUQOPRVYZYY[\\\]ZNHR_c_^_WVZZW^cUMYVTVQGCEKU]e_PIBO_]_bUQ_]T]bUMU\Z^_XOKPX_^VSYbd`WVfm_YZ\]X[a`ab[Yahmb]oi\__fupdru`Z`ktvmhwqku~yrnou{rjnk][ekkghuq]Y]fkkke_]]cne^ecaff`goc[XVXesibfbeigoto`\_`[Z\^WYfjhcYZ\^a]VWWRV\[\b\Ybf`_abv|hbfbcmoicekmggjjhglkgljfhmqi\_bbehdhmje_^nm^\]cd_akm[ah`ajnkdhnr{ojfhlgfnlglswpihhkmihnplgkpplhkmlmoqmmnkhfcdhgggc_bec_chiiiihhechllkkljgklgefhlrspplfehlnqqh_aifkyvx{qkgmtolmmrtrqvxssvrmljc^`jyqo}wrqoppmr{vlhflmd`nunqsjsvmjmputnrkqszrnvxsRT_LU[ZYS_oneZfwqikleZQOJKmvXYdaWECMXg|jMi~iHBS_nutvu~y~wqq{}~{zpzw{ufc}zqhn|j[hdhty|r{|vw{tv}yuwwou~z|yqvzzusg~xty}w}na]}mr}x{t|zz{xyrx}yxjokxjczvkhyYTyxspyx|xulvs{xdk_XYfgO[sff{cP__`bdgmzVUXXlVQ`ruc\Vbd]ondaZdfnxkt|mz̺þɿɿľ¿ýĿļ¿þ¾¿úɽTSPKGMZ_fpi[Y[\^^_ceVIIIILU[THFHIIJLJECFLSVPJOTOEFWfbWQG=I_g^TH?;;CRdkZLOZa_SGGR^^ULIKP[^QC??BN[_ZWWUNKPVZ]b]RLLNOQW[^cd_\_egjpssjbdmrnjgnplecbbab^X[_a_^^bkmf`_aa_chhc^aimfdlokmnnke`ahkhc_`bghebbckurc\ZZ`d`\\_hnh][abeggeeaUPdwyl`[YZ\\\[[elY@CU[VSWYQMKJR_]QNQUXWWXKGZmgVU_a^ZVX\b_W`b^^XSRQUVjt]MBDO[bbcefg`SZlg\bh_ZbbYRNWfcXOT^a_YYbd`]ZV\_TW`a\Z[[`e[Vcf[ZZ]oodvrYT\dltk`qvhnvsqqpowznkpg\]injhiuq_\_dhghaYZ^dha]a^_ecaji_\XW[gh_bgbgeemrn^\`_[[\\\bjjf_Z_cca\ZZSYa]Z_c]^fgfa`r|l`ffaitmdchmgckmjgknelwidgnlfbddeie_cijg_Yehda`_^]bij[`g[]ggfdhloxslghlhlmgfkvxnggjkklnqsnjpqpkovnmzxjjomeeijjkfdeb`beb`ddfhjihgg`]ejhdchb^ca\abdnpjkkhfhoqnmkebiefuxwvplntqjhijmpnpuunmpkgkhaZ_ywawxffdllhittcajifpnbvmnsmoulhpmo~znuouyjx{rsv_RbVN[ZVUhortefwrghife`RHQmu\`iafXKO`poodkwcNPcsp{rtgxx|ryv}|u{yqxzw~}to|zv~~st~vqwi`qhr{{rx~twynloyyoq}|knzqwciutnfjxwxvy{~|ti~}}z}{du{gu~}}z~wx}v~pyzwyxxlzZ_xmpswSgy}tx|wyq|yxnqxcTUURblkk_eleilc]_i`vkbQM_eLShxk\]cicjgpieh~}»˺ǺĽǿ¾ĿſĿǿýüƿƹRPKIIP[agmfZY_\WX_f^OHKMQZZOEDHKLKKIFDDIPSPLLPOD>OghWLB;;@HU]^YXTLJNVXY]^UIGKOPRV\``_Z[afhkrqjcahsujegmnhda_`cc]X[`a^^`dkjd`_acdgfd_\djidfnmknnmleadkmjd`_akmga_gqrha_^^ce]WZ`gic]]bhmkigdZQ`wudYXXY[\\\`im^GANYYTVYRJHJKYbWKMQSTUXRENfk^RWac^WUX]ca`fdb_TU\[[]usRJHKTai`_nuj[Saqi`hnaYadZRP]lcUPV^][YYac[WUR]`RXc^VW[Z]^UUb`YXWbpjm~aRT\enpdayqhqrnimomvxkmqf`dmnighusa\]afff]TV]dd_\]\_dabjf`^WU[ee]`eadbemol]Z^_[ZZ]^ejiea^bcca[[\V[b][_`_`figagxwebkhdmsibchiceonhfmnerxdbinjffdffic]bkki_Wcieb`_]\eii^di^^fgdeilmtwkghijljdejuwkfhjlmmnrwpjnppqtrnw~pgmqidmmnlhcbcacdd`aeceijjheb_[_fc_^da[\]Z^^`mohkjeaeoqnnjc`hfcszrrpkpqlhggglnlouslnmddlh`Zc{mdumf`aifeirj\bkjgtwfuqiprmrpfkllzopvi~guzutre`eTS`[WbrqwtclujgmjceaRNaxr^jnglYXcpvpmjrp`Yhulrxxkiyw}tmvqz}yvxyuuzyy~yw~l|wsz}yxx|jgymv~uoxxlqthjnw|yoks{yxfqwt~capvpdbouy}~t}}~}v{|wp}}yzvxms~|||xxu}oyxxy~zurVcoqrvu\oz|xxm{}ws|~xp{pYRTOZppg]ef`gnidZoez~akaSc]GWptgd`Vipgmnes~Ľҿ¾ǻ·Ľÿ¿½ŽɿŹTNIJLS]bimdYY_\TWaf]NHLOTYSGEGKPPLIEBACKRTNINQI@EYjdNC?;:?NbjcQLV[WJEKRVTLEGMW^_RD=?FPZ\[WSKGMTWWY[WLFILOPSY]_]WW]cfjprkcacowobdgjhdb`^chcZX^a__`bfjhdbabedfb_\_fhfcinmptmllgdioold`]cnlebbmrmedc_`feWS[bee`]`hlmjigaZarudXZ[XVY^abgndNBFPXVUYSHBDISa\NIKORVZVID[kbWUZbc\WVY_cdiibf_U^hd`bxnLPUUXdm^\s{jZWdtmcjlbX^f[OQbnbSU[\\ZYYaaWTST^\R\dZQWYYXVSWa]XTZijh{nTOU\foh\j}hjrlhhmmlttkpnedinmhhgxxaY\`febZRT\cb\[[X^c`aifa`VTZda\_a\``ellk]Y^^ZXY\_fihd`_abdaZ[\Za`\_a_`dghd_jzraemhhppgbdfcaiplfemmjxsaakohfgghhjb]dkjiaXaifda^Z]jkj_cl`\giffikjq|gefhjkgbdluvjehjmomntwnknprssnu|wlioofksmmiaccdcbb`^_cehhlki_[[Z^caWX`_XYZTZ[[imegfb]`loljic\gian{pmmkplhgecciklnqpmke_goj`^jtejkdh^diceild_djljs|ll}ujoupprkfhirujuitnoywponieUXf[busp{seophjolegcZ_l|uhvtuq\nuy~rlmukfo{ueus~ejyz|olmmwxvwuyxqx||}x~}~}n{wly}uyy~npwz~yvowvjkphfnwwmhgv|yyvoxzy}k]irsj^iss|~x|zwzxw{~s|zw~{wt~}}~}vuu}oyxuv{fVjyrtu|zhuzzj||upyz~xzxgVXX]osk`gf]cnuj^nnyzWcudeUH_tqardOa|purgyɽķƿ¿¼ƾ¸ȿŸ¼YLHKNW`fllaY[^YVYcf\NIMQXYLBDJOTRIC@@AGQUSLJPNA?RfiZE>=::DVfj_OPZVLEHRURMFEKS[^XJ?=AJV^[VQKGJQUUWXWMEFJMOQTY[[UPV_cgnsod_cjtth_dggeba`bhh_W[cc^_bdfigefffedb_\]bgfeeknmoqjkkhiorura^alledhipqlhgb]dg]QT]baa^]aikjjhechqrg`baWTV[cgghfTEAHRXVWSG@AHOa`NFGHMS[[NDSheWWZ]_][YXY`ceofaf`ZfoibcwmSZ\Z\bf\`v{j\ZgsniljbY`i[MSfraT\\ZZYYY]ZPORV^YUbdVOVXVSNO\`YTRcndkz]NOU]hj]^xmbmncdhmllsrmmefloplijgz}aU[`fc]VPS[b`XWXW^c`_ifb`UTYd`Y[[X^`ejjhYT]\XVX[agihd__abfaZ[\`d_]`a_cjkh``nxkajkglqlebdeacmojegomnznbclohhkkhjjb]ekjhb\ejfd`]Xbnkj^fr`Xknfgikho}edegije`dmwtfchknpmoyxljosvxnryyunmrljyrkle_ddefc_]^]`ilgmofYVYZ\`aTR\_WTUQSWXelcbc_[]inkhfaYei^hvpjjkoheed^aiijlnojd`^jqkfdlodkdbiaiiaeigddcfnqs{scqzqpssstrfdgm}gpomvkywlltndXYjhlzqtmgqmnmnlglifkt}yv}~lh}tmmwvuvwmrwszfny}ygjklvtuxuyyqx~~{xz{}rzyfqy|~sy{rx}yw|ou~vjfmicnwqfgi}|ytqz||nbiutmbYrws{z}wy}pu|wp~{~w~}~utu}oyxtt\Tqrt|xt}}h}|tmv~~y|su`\cfouriifabnwncmwyx[]wteUQiuncoTa}uqyŹùĹ½þÿǾɿĸ¿ĽYHGMQZdjli^Y^_[Y[ce[NILQXWIAEMTUNE><@HQRJGILOH=FajaQ?89:PgdSE;69HYedYQSUOGHQUNFFJQW[ZRG?;>FT\ZTPLIKNOQTVRGADKOMKLOOOONPU^ccgha[]emoh`]aeb`_`ehg\U[dgdb``bhhlnoi__^]_`befffiknqnilnmkjpz{jbemmgghjlqumike_hgVUcje_[X\\Z[jtpqpg[Z_\USRTZ^``_[PC;AMWXTK?@PbcQB:54;EO\c_VRUSKGLSPGEJRZ^]VJ?;=EOXYUPLJIKMNQVTI>@IOMKJLLLLLNT\`ccc`[Z`kpj`]__`_]^bhg_VU_iib___cjntsmd]\_`baceffginrplmomlklu~sbgjkieillltukgib`hdU[knf_Z[_\Y_ptnlf]Y\ZTRRTX]_]ZXSH>>GSVSLA=H`g[UTECIPRUZXY]d`UNPXcdWYd^Sakbbb`^_eppqqbX\ehaaebaca]mziaa_itqmigfboqUKTlocg_]ZZXOGDFHQ`^SXaWJMSMABQ]VKPaga]iujRKQXac\cyv^WaaYWZafjlhd`^fpllrnlncayrRLW`aZSLNW[[WSROP\^[^eb\VMRVcaQPLQTRZbaOIPSQPORYded^WWZ][WUV^`_][[\_dif\\gpfcjf^eqrja`e\]oqfadkomnpidckkbekkllljfemmdfjkkkdaagsoilkysakumcfhkn|~a_a[erpgfgfotqgfhlropz{umnrxxt}~vmyzvtfbkjhkf_ZWXZfkglm`]`]YY``YXSJHQSOKKMSMMZZUUVVUTZcaXSPUYRScicako`bec^dh[_imi\WW\o{rmhdiloibr~oelkhlqtqn~ruynnwxyeuxtjnpmlzwj|~snkookligvkumpwtyosx|}}wy|w~~{u~}sy}zxz|ytsxyzx|{tz~zvwwfrhj|tz}zo~wzyyuw}}h{dZkthkgnwbv{]t}pfqvitpskkxz~pk}|t|zyzzqxxnqu}|_izvtvqoxvz~|w|qr~yv}|{v|qwqy~z{wno}~ueox{Ŀǿ¿¿¿ÿ½ɼ¿?CQ_d_\\__YY^abddefZNKOVWMBFTZOB=>CMROJFHJHB=FZg]G:538BMV^^XUUUQIJPPIEJRX]]WM@89ALTWTMKJHHJJNTUK?ENVSNF@FYh`RPPCFUZVVY[`_\WRPS\hdW^h[Thoc\[_\]hsrrp^X\ce``ffdbaampded_gqqkghidotXLTmrgnbZ\]UJECEJWc]RX^RHOSG=GY[OKXfc\^ko`NMU\a]]nyeUZ^VRUZ`eiie_[]kqmioopkaezqPKX`]TOKOWYWUSQMNZ\Zag`[VLQVcaPLJORPWa^LGNROLLQZcc`ZTTWYXUVYa`[ZZZ[`dgb^`gocci`^gmng^`cZdumcbfkmnpjeccgebdiklmmjffnjbhlkllbcensiklp|lertgadjmr}v`d]Zjvpkjggvxibknmoos~rlpuyzwxwo}y|ufiollmfbYVY_hiikc[]_]YY`aWSPFDMPLIIORLHQURRTXURZc`UNNTWORagcbhkbcec_bg]_ini\XV_v{rngchqsicumhpljsuvvtrtypqxwzftwvnnpixoy~irsmjpmgmjazw|lsl|yr|pt|~}}xzvvr~}x}q~{{xvyz{y}zov{t}upaofjxrxxvpxxxvzwt}|hngfqrlsntyq~qwvsg|gikxxyll~{v}~pmzsxwoty~ln~zx|svwx}wxuq{|vywwvsx|}xwom}}qw|y~ÿ»¾ſ¿»ÿȼ¾¼?IXdd\YZ]_YZadeffd`WOMOVWMEJWWK@=@GPQJEIMIC?@PabM:326AMSY][VVWTMIMOHFMSVYZWOC:6;FQURLHIIHFGJQTMBM[SKQ_e]X_lkXJOZ_^]gvnWS[VNPVY`deda]X_pqkgnopgal~nMKZ`ZPNOQUVTTTQMOWXWbf]XRJQVeaOIIMQNUa[GFNPMJIP[b`]XRRUXURW]a_YXWX]_ba]^cgg_ef\`ilja\a]YlsgcdgjmophbbccbcdijlnmjgfnibjkjmkbeippflkpxihplcbfimsxpddX_qurohboqdhpmlooy{mlptx{~}y}ry~zsmpnmnlg`VZ[cghjeYW^`]WWbbUOMA?HLJHJMQKEJPPNS[VPYbaTILTUOR^ddcgidddbbaha_gng[Z[fxyrnhdhqsjdr}okplnwxxyw|osvrrwtwgqxuonrlryoxln|sliqkcnh\ywyljtwu|rsz~{|xtsqp|z|}wy~v~||vjt{s{rk^meitrvvu~x{svux}wryjbrwuooyx{|{}~{rkp~bijzytgp~xx}{{jyu|z{syvv|vzx}xtwsy~x{s~{wtwy|zz}rl{}|}{{z~|żž¾Ŀǿƻ¾ĿDQ^daZWX[]YZbfeedb]VPMPRRMHNXTF@?CKNJEFNQH@>H[bW@458@LTVYZXUXXRJKMIDLVXVWSNE:8:COTRLIHIIGEFKRPC<@MWYMCCDEEGIPY]^_ZSOR[dif^VVZYVVY_cc^WT]ec`^_`bhtzvlc^\]_`b``hllmnmhggjifdfmvxoijljjjkllqzxkkg]`jkhlpmgaagpbY_fhjjgb\XUUSSVWSJFIJGFCDPVOHEENah]SSVUT`c[XZ[]\UMRXVWaic\daUYnn`VR^^_nspsfWX\^`_aime`bdme]ikdfjpmfkqiqv\NSmpm{i_a[QKFBFQadUOZ[NIOMCCSXLMZb_YX`khPES^_^bnp]PUVOKOVY_cb_\XXdpmgflolbfp|jMM\aXMOSUSRTUUTLNTSWbbYVPJRWddNHGLMLS]TDELNJFIQ\b]ZVOQUUQQY``\WWVX]^][Z^cf`]ebZckke[^aW`rmeeeglnmlf`^^^`cdgikonhchnfciijnhbgkqlfjhotjjlgbbfjnrsmhbUiuuundhywjgqtljnvqinqtz}|{uwxv|{{uqrnmrkh[Vc`dhij`TU_aYSXdbSIIA=EKKEGQPICELNJN[WQX`_TMPUSLPZaccfgehc`aagc^hog]]`kyvnlieiqrkepzplpnnxzx{x}zlntsotormowonnqklsnvpmwsljphbpg^~t{tfg|rw|vtw}xtyw{~lpyjqztwy~~x~qguzpzph_jfiprvzu|xx}qwwr|xr}ym^{wqs|{zzrxtopvkjyzzsfut~roxxz}|}|{z~{utw{}|{twwyxv{|x}ury|~zy}}ľ¾ľ¼ýʾþÿ½¿ƿƿź½þLYca\YWYYYX[bdccb`]VPMNNNLKQXOAADGLMIHLQNICCTa]J89>CIPWYWVVUWUNKMIDKVXVWSKB;56?KTRKIIHHFDFHMOG>?JUYRFACCDFHNUY]^ZTOOT_ge]WTVXTTY^ce_WW]egb_`_`grzwpg_`^]_``_bjllmljfdfhgfgjrxrkiiiijlkilv{qije`fnokopnf`fnk`\cfggfda_YRNPTTOGCFJGDDDHRQIBDN^icXUUY^`caZZ\ZXVSQY^ZZbhd_c\TZlm_PQ^^aorpsdUY\\^]akkbacfka_njdfgllglqiqv^NRokml`bYOLHDHUdbSNZ[LIPJFKTRIS^`[WXblaIEWb^_gncQOTQLJNUX_b_ZXU\mrjceloifinxgNQ^`ULQXWPOUVWUKLPPWb_VUNIRWh`LEFKIKQXOCEKJFDIV]`\WQMPSQNQ[a_ZUWUZ^\\ZY]ba\\c_^dhga[c_Rjvgdddinoigd\WY^bcceklnldakmddiiloc`hnqihjforkkkdbbflppqok]\syyuhft|pglwvlhq|hipqt{{ywpw{~zywwtsnpumfYdjbfjjj_X\c`TQ]c`QFF@;DJKCHTMFDEJKDK]YRZa^SPWXRKMYaccgggnd\cage^ipe_aeozsjlieiopkhmupmojkvvqwuxviisqjoioqmrjmoohhqnqvjpomlkbbpedlyp_gly|wssyzpnttyxgntetsnrt{|~zok{vlzrjb~ifintxwtv|{to~xs~}vywra{uzz~vwwm|hsnp{|x}|tgy~v|wz|x}y~~~uo|{{xvu{||~w}x~u{}u~¿¿¿ǿ»¾ȿƽĻľX_b_ZVVWWWW\abaa`^[VQMLKJKNUUH@EIKLLJMQQMJMRZ`S=:CGGJQXXUTUURLKNKDJWZTRQLB<75:FQQKGHHGECCGLNH@@IQXTIAABCEGMSUZ^\RNNRYbe^VSTVSQW_aa_WT\eha[]_^anyxrja]bb__`__ellkjigdcefhhjmtulihggikljhmxwnihdekqoooold`iqeaaeeecccb]UMJPUPGEJMF@EJHKPJCAL_jh^WVW^edcb^^]YUUUXaa]\agfbaXSYkm]QV]]bopop`TZ[Z[[ajg`bcdhadskcffihgnohqt^OTo{emnbbYNNLFKYdaQNZ[LJNIIOQLNXZ\[TWbgWFK\`\cjdVNOOMKJOUX^_ZUTT_qpfeeingfjmudNU`^QJWZTONTUWVLJMPXaYTULJSWlUGCEJGIPTJAEIGCBJ[\^]UNIORONU^c^YWXUZ^Z][Y\^[Y\bacdcb]^eXTrtab`bmrngc^UTZadcdgknmfahnjbfjjnl^ajrngkgiqqllibbafmonopk`iw{zqgn|yjiq{wkhyqfmqpt|ypz{oy|ywxwvrortmefqhhkihjdadc]SXab`PDC>9AIKCHTKEDFJE?K][X_`]VW^YQMQZacchgiqc[dbhg^ioe_ekqyrkliejnolhlrpmmfgsplurqrhgqqighnmk{ohnqnggnklzjmnmnf]bmhmfxmXc}hx{vknxtgjqqwqdnobu|nlknuyx~}nmsiytlk|gijlu{tvu|tzv}xx{~wwujz|x~}qu~j}ys|woyvz|sj}}}sxuxzvo{v|wv{~z|~y||~pýļúȿݼ¼½ƾ»ýĿa`]]ZVUVVVWZ]^^^^]\VQMKHHJQXQCBILMMKKTVQMNTY_[I<98ANQIDCEFC@ACIOJAAJRTUMEAAACIMQSUZ]WMMOU^caXTUTRPQY__ZVTYcgc]Z^^akuwtkd]`cb_^]]ailjggfecccehkmosqihgfgimkiirxrjhgdimpppnlh`bkjigggdb`bbbZNJPVTNIIMH;?MPIHIGEKZijc]YX]dgfdcb`^YTTXbfb`]_ehd^VRZlm]QV\_foonm\TZ[ZY[bie^abadbfrkacfgefnoioq`QXrt`mpdbXPSQKP]d^PO[[MMOFIQPLS[UY[SVa^NGR]]_ifWMLMMLJJPVY\YURRWgrhbbcmneggkr_NWa\OJ\`QLMTTYVJJKPY^USUJJV[hLFAEIFHOPD?EGC?@N\\ZXPJENQQRU`e]WZYS\[W][Y\\XW\adfdb`\b`O\si^_`fnrkf_VRW]cddfhkmhacmnfbgjkkd\cqqkhieltolkf`aahmmlkrmopz~pilszqglu~wfkzjmqmmtwtotn{~utuuvvsrttkiqtnomeflkhfc\W^`aaN>@=6?JKBGQLECHF@?J]`]_`[ZbcXPPV\bdcghlm_]eagf^jnc`gmrvpjkhekoolilqokkegrokolnqgeooihfikkx}ldnsoegleg||hhnmmc]^glvzcrjUaxfsupfksi_gnquiblecyvhifipru||nnsh{tqy|jomlvv|vy~r||~xy{xwuu}zy}zlq~rpzwqys}}v~snt~xzì|w{v{{{{}zs~Ǿ¾ɾÿĿǾ¼a]Z[YVTTUUWZ[[[[\]^XQLIGGLSVLCGLLNOKNXYSQTY]`WC=GJGFR][VSTVRIHIGHQZYTSNE>==;>JQMDBBCA??CGKKCBKRPNPKC@BEGLOPRUWVOINTY_a^WUWRNPUY[YTSW_fe____`jvxsmf`adb^]\[\djkfeeddbacfjmnprlggffhjljhnxwmhhggjmopomjf`dkkjkmkc^`bbbVHP\[RNMKG?;GOMFBCLOVagda_ZX]bggedb``ZUUZdeca^^dhb[TR[ml[RV[_homlhYT[\YX\fic^``__bhpi]_ceddmoimnaU]sp\lrgbWRWVQT_d[PQ\[QRPEJQPQUWUZYTZ^UJKV\_fj]LGIJLMIHOUVWRPPQ[kocbbcliekcgq^PZaYLKdbMILSUUUKJKQYXQPRGO[_\FGAEIFGMKA?DC?=<=FOMDBDD@>=@EIIEBIQNILRIAAEILNOPRUUMGHOW]`]XWUPLPUVVWUSU\cec```agqvsmhfdfd^\[ZZ^fjidcccbabehlmnpoigedehjjhjsztjgiiklmmnmliecimolpolb\_bb`UNZd[OMMH@=EPPI>@HUYZ`dbaa[Y\chigc^ab^\ZY`cdd`^cgaXTQ[ki\UUX_kpkibVV]\WW`hhb^aa\^fjngZ]addakmghiaYcrl[j|sgbWSYZUVadXRUZZWXRGIORUTRU[WT[[PINY_cgcTHEEFLMHHPSRROMNUblj`^[ekcjn_eo]R\_UHNicKHLRTSRKIJR[SMQNJT\^UDFAFIDGLH?>B@<DLJC?ACA>=?BFGDAEKMGIPMA?GKJKNOQSUQFDIRY]^ZVTPIJTXUTUSQV_decaa`forplihiiha[ZZY[afiebdeb_^agklmnomifcbegijjnwxohgikkllmmljifglprssmjb[^ba^YYafYNNMG@ERWPG=FR\\[`bbbb][]bimh`[`aa`\X_dffa^af_VRQZig]UTXalojg`WY^ZVZcihb`cb\`kkkeX\acb_ingfga^ipdYiwnfaXVZ[VWceXTZ[Z[\THIOVVPPV[XUXUMLS[bebZOGECDNOFIQQONKIMYgkd[XZehdlfZgjZT^ZNHXncIFKRROOKGHTYOLOKMY\\PDC@GICFKF==?=:;GTWYRFEFIV_[W[`jaTYW`aXcaTTPMSYabamlaf^OMch^[^`glfb`ULU]_cfgiijkikkg`adghhd^`hlljhgiornllic^]fmjcmko|d`jnsusvz~ogt{prwj^_inhj||g`mwrhhpusrprzznep{}xlhqwupnpsdW]dh^HC@;>BHIB?AB>;<>BFFE@BILIHMNF?CLMJJNPRTVOFEMVY[ZYVOHJQUTRRRQSYaddca`bkqmjjjlmjd]YXWX^cefcdgf^[_ejiilmokfdccdehhktxrjghjlllljkjijhkotxusmkb]`e_]^`deWOQOLLRVTPJGOW\Y\bcbbb^\Z]jqi`Y^bab\X]ehfc`af]SNPZgf]UTYcmpje_Z]_ZV]eig`bfc[`mlicY\ab`_imfeea`lm^Wgrie`WVZZWYcdVT^][_aXJIPUSLQ[\WWVOLQXbf`[SHDFADRPFIPOLKIHO^hg^US[fdhjWYjeXX]TII^qdIDKQQJLKHKTRLLNISZVZKE>@HIBEGB<;=:8@KUUWLCEHK]`[Xabm`SYYge^i^PSNNW]cdjwl__WPUdc\]aagifaYLR^acefiknoqnkgbbdgfdeccgijjgfforommmia[^emhcsuhzjbemlqssxzvil{{ssxqb\`hjcj{s`^krjcgprqpns}yjdq~vlntusrpqpe`higb[MBLUSRQOPWSSVNDLV[emhbdghjf^acajtkaipgacdbad__jd]ftxqomhghkrxumpxvqlefijjljemolnnomeekghrxqd]dlfcghbfm^Vbj_ZaZ\ozvc]_ZVltbfg[]c^UV]jjZY\]joc\ZXZeqzy|yyqtx{{~yzxxq|{xz|y|uzz{{}~yw~|vt{{|}xy~~{xuvzx~uii|lqvisudgvtyxn|Ⱥµÿ¿ʿ¿]\[ZSKHJNTYYYYXWZ]^UMJLNPPMKKPTSPNNP[`dhfeeaXRT\ab_XRNMRUQKGEJYedXOOPJA:BEEDDHLLKKIFEGHFCBFKOQSUOEDNXYWVVPHKSWSMPQMNS]bdb__cjnmgejlnid]YWVVW\cebafgaXW]ec`afnpg`egecbegmuuohfehnomlllkkllmoqssrqpkedhibacb_[UWZ\_\TLTa`UTWXY_ec]^`^\\cpteWQ[addZW_dprleeh^RKN[eb[WW\fqrjdabfd[Ydlihfbcc_boofb\[bd^^egccc`bnjWWfhbe`TU[WW^e`SW_XVdg\VVVOJM\g^WZSJMT\f[OTLBFCPOGILNMLKQ[WUXL<8CLICC=988769ENQQPDAJL[lca`e_raU_gqlpkWSVLSdihlu{aXTX\_bd``cace_VW^beghhjpvxslhecdijd_gjkfcdfedemplkmoj]Z_gmkhs{tism^fkplknpsoigpqmtwl]XX^fc`kr_V_fcZ\birrnlqsi`fv{omqppomowzmioorqgX^b^^]`b`WV_[WZbigjmgegjnnhee`dppgaiqg`ccba_^bf`]juqlljdajqv}unx}tomhilmmojertnsvofejkhksxshehjlnqqa]gdacgiijknrtpe`fgltfdeff`Yakjfdgorwtd[[Y]hz~xtznrh|}vuy~~yuuvtzywy|~{~yyrv|{{tstztpwkm|vxzyv{|~zxv}}wsvufvxqxew|fllpw{|rvȳʹ»ÿǿ¼ɿ¾ZWXVQKKNSXZXWUUY[^[QJLNPQNIJOSTUPJNYadfffhg_X\`dc\SQQLLSWPHHKYhh_Y[[P?6BEEEGKNNLKHEFFHEABFKPTVRE>FSXXVUTMHNXUPORQLNZ_ee_[akpnjffkole_YWUUWY_fd`bgdYTY`c^^ckplcckhcaceiqvrjfeflqomlllmknnooqrprpojfflibbda]ZW_`^c_WUdoeUQVXYbgd[]_\[]dlufUMXbchYSbaqrlhii^RMO\e_ZYZ^iqrjfddig]]ilhlmcaefdmpia][`d`^bdabb_bqjUWfgcd_QTZVW_e_QY`TTdg^][TLIPdl^XYQLQV\_SOQEDG>BRSHBMTJDBCN\bYKFNW^agaRQ\a]YVURM\fkbHEPN>ASMEHMMKJKW\UUXD9:GMGCB;87775;HNOPPG>IL`qgbbfbpaW`krrrjWYTJXlmopsybNTabcgha_cbcc_\^bdeghhlvyvmhfcbgkibdlkjcaccccfopkknndW[cknkq~tmr|u`eensjipsnlggpnkttfZWY_f``ihYU\a_WW]dmpokknf`hywmmoonmlnwzljpprqljfc`ceiibW[ecbdjljnlfghjnnidc^conhbhpe^aaba^\bf_]lumjlgabkty|to{}romijlnonietujz|igjljintwsjhjjlrskaahgegnpmrwuqrrmjpvthjkijeanwpouwvoca`_kx}~sszoneu|uty{|{|yrrtryzwv}~z|zw~st}zzxsoqy}}sntim~~xwwwx{|}uzxmzoh~rznmylolqwpƳĽſǿþVUVROMNPUZZWVSTZ^\XQMOQQPLIKPTTTOMV_adfffgf`[`cb_UPQMKOVXLDJTbhf`__TC88AKLHJOI;579;@EEHKLMMMMKIHHFFECEHMS]ZL@COVVUTTQMNSTLPUSNKSacba]]fmlihfhmnf]YUSRSW]bcabfg\TV]`^]biomebijeaadgmsqmhdchprommmllmpqpnoppppoifjljaff^XX^jdbe]ZdqqbONUX[hkbY[]\[_hksdWQYbek[Sggosmkli_TOP[d^[\^clrrihjjmibckjhpsfafjhmnga][bfb^_b```\briSZgecc\QUYSWae\Q[_PRdgdf_QHIVhk`YWSRWY^]RPKBEDCNSKEDMRIEBFT\YLEGPX_deWNT[^\WTVUS_fi^IHQG6@SIBGLLGEKWZSVW?8=KLFB?768866?MONPNA:LVnrdcefdraZdpttrj]XOLcqntorx^L[feeiha_ddffcbbeddhhjqyulhgebckjdcoqkc^`gfefinnlllg\Z_fmpp}rqvwocikqrjjrskjfiomkqmb[Z\_c]`e_VVY^[VV[bmplhijdal{}rknnlkklmvwllpoopuqhgilnlkaY^gklmomorlfgjlmmga_[bmmgahmc]a```[Zbd]_mqkkja`emw{yqszyromjkmoonigxvo|ekqmkkntwsljjimusjhfgkkmrqrz|wpswsv{}voqsopljy|~zrtpmielx~{~rr{qhimuswxyzzzwqpsryyw}s|~~~sx}xvzzu{yvywqjn{{{~roqhp~~~}zvuvxzy{~|uyyonnus~rwrn{yx~~öʿƿÿļÿÿUWVQJKRTWYXVSPU^a[TPOSUSOIHMRUTTNR^bbdfggffa^cc_ZTROHKW^UEDP]eedb_WI<:?HQPJLL?568;=CGJNNMMNNMJHIHDEEFHJS]`TDCPWUTTTRNOTRKMTSKIQ\cb^[]djkhgghlnh\VUONORY^abaeg`UUZ]\\`hpldbiohbabfkpsmjebdkrrommonnosspnmoopolfhmnkfjf[VXdlebc\`nsl]MKQV]jnaXY[Z[`ikobXUZbfn]RkoosnmmjaXQQ\c^]`bgnrqjlpnppffllirui`fomoleb^\che_^`]]^[_ohT[fbccYQVWRXceZPY[NRcgfjaPDH[llbZUUVXX][POGBECLWNDDGPRHCAKZ[OCBJRX^eaQOVZ[ZTUYSR]ffWIJM>5FPC@HKJEDMXWQXU77AMHB@;528<46CPMLRL<=Tg{jagfhjtb_ktutrlaUKUorptkvx[Ufhhkleaeggljgfdfdcjjluukdeedaknhcmtka\\djihimnmlmi^\_ckor}zqxumjlkptljlrnggdknkknf`Z\_`a[`c\VSUYVRT[bllfdfgbfqxwomomjiilouulnqolovpjlosqkliddmrmpqoqrkdgmnmme^\Z_jlf`eh`]____WWbc[apnike\aip{qmx{vrpnllnpqnlkywrygpqmmlpvwtnkiltwqlmjkooquwy}{wrwzu{}~|xuvwxvwzsuwpsqmq{z~~|qq}re}hirpwwxwwwunmqrxyx{o{}~}ptxtu~uz~xqrtnei|~|wy}pomgt}|}{wrpswxv|x}{vrxqs||y}sq{|y}{ŶĻƾþ¿·ÿWXVNJNUYYYUSRU\_]XTUVVVTNJKNSUSSRX`bcfhhhgb_adcZUSSNHO\]MCKZbcddcXIA=AHSVNKOG735;BGLQPMJJMPONLKGEDDFHJR_cTEBMXWRRSSPNPRPNUUKGMZ`_][Ybhkihghjnj_UQRLLQV]__`cgaWRW[ZZ^fnqe_gqnc`adjnpoigc`gotqnlmpqrrrtojkpqpmhfjpqomkdZW]iid^]]dooh]MIOU]ioaXWXXZ\hnj`ZX\cgp_Qisqsonnje[RT_ca_acgnrpnprossgfmolrvl_dtuslda^^dhhc^^\[[Y^niY_d`caWRTUTZcaUMVWKRbcclfOAI_njb[UWZZW[ZRMCDGDRUE@ELTPC?ESYQE@DLSXae\NMTYZXSTXRR`ldRJKE79JKACIKICDOWRQXO27ELEB>831;>38JSKJSG8D[q~a_jhjqtbemuurrn`POewrrrk}v^dlilpocbmkjwrifegeejlntnegfbbiplilrn`Y\dkieilmnnlea_adfmpwvt{rjmolqvkllngceelmlliea^_`_`[aa[TPQVSORZbifabb_`jstollkhgfglputrpnllqtnlorxshoqgfssmtqmopibgpnkkc\[Y]ii`]de\[_]^[RUcbZcokgj_\fkq||lmy{vrqollnppqrrzxxuktomonrwxvokjrzuoqokppqxz~}xww~~x|~|~vt}~|~}wv}zovxrq{x}|qp}te{ijupsuwvtrqn{gkrxwxym{}~x{~qr{uw{y}y|}vjnrk`g{~uy~lolnz|yz{xpkntqtuu{xyzr|tu{~uy~~||zw~{y}ǹÿȾ÷½»WURLOUXYXWQQ[a^\ZZYZ[ZTPMKMPTUSTZ^_`bgkkie``cd]USSRMMW_WGJY^ab`caTIECFRXTMORC415?INTUNHJORSRPNJECDFGIR_dZG@HW\RLNPQQQQQOSVMGLW^^^YW[fkkjigjnj_VPMMLOV]^__acbYSUYZY[bkpjbgqoe```flppkddcajttplnpruvvtpkhkptohbelrromke\Zcke_Y[`enmfZKJPV[ek`WUTXXYhpd`[[`fkraSivtrnnnlh]TYbebabdhnrqqrsrtqfgnsqswoaarzukcb_]dkmh`^][ZY^ml]_c_a_VRUTT\a[PLVSHTb`_niOBObljb\V\`[X[ZSJ@EIIVN>DHMVM=>KUSG>?GMQWcfYMLPY\VRWXSXfn`OMLA4@FLMOTPB@EMGA?715:B>4CSTLMQDCYhyy\eplospdglttptlZXbnvpvtr}khilrupelzsxzkbbjlkkkqppjjjfhkmmoqle_]eoph`clrrle`^fgcelo|rqxqoopvqtuqljefebfllomdfkcee\^^b]UNKMTRMOX`ca^^\\gnmkihfb`^`goqssqljnrronsoqzvnzwgnujswjlqpd`kogdd^[ZW\gbXZ]XRY][VPKTa_[de]eiZ^lpwxolpvwvvsnhmwtlpyxx|uklposxzvmmtztllprqqowzzwv{}|{||tw{{}|y{yz}yuwrgzrnruvutrpllp}ubdqut}ut{qy{vzzwp{{wx}zpzv|~}}ufittoqz}xkx|rtmyvjgkrkpytqruuzlqyu~syz~}~}z|wurvrz~xwz~¶UQPTY[Z[VNR^d_VWZ`cbb[SMKNQUVTSZ_`__djnia]ae`WVUUUURW][WVZ]]^^]`_WQNQY\URWWH728GSXTNIKSXWSTSPHBACGGLZe]IBJT`\MHNPOPSTVWWQKMU]`^ZTV^fjkighjmbTKIGDHQ[``[X\_[QPUXVV[cggcgvxg\^`^bimnleb``l{wpnmqy}|vlhginwvjbairwuniffbaegYPQ_cdieYKGOWX^fk_ZUQTXXhqe_\]hqwwg[jwvnikprogafhfbcghinqquvvwvofirvrsvpfbp|ymgd`bioqqib^[[Y^ml__aaa^WQTVY__XOLPKJX^Z\lfOKS\hif]S\`[[\]SA>NUY]GBWTMPHAKVQA58CKORXc^KGKMX\SOUZ[_fcQGKK<3EPDAFE?>@FJJNTK@JNNDA?3/8@@<:ITUMOOHM^iwu_golpvpcglssopi[[enssyrrfcioutnhv~pxyh_fokkkmtpplkjhkmmormd`]`krla`kqrrg]\cigcels}mpupoovxrvynjhdghhinnnkdllbhj_]beWNPKMUTMQW\a_]ZV^imggheb_]\`hoopplijprnlqumo{xq{vjrpjwthlql__mmccc]\\WY`^ZXVROW]XSMJTa_]d_[ifYcoqvrlpquvtvungpvqnrxu~~qikqprw{unry|rlnnstrszyz}tx}{xz|y{|z|{{z{y~yysiy~wurw{wtsrnmtwbaqvs|}zy{o|}txx~wo|}{|}~{mpw{}uegvwrsy||j}ztozvgblrhlpkkorsy|sesxsv|||}zxx~wtpqss~z}t~xw|Ÿÿ½SQRV[[YXTT^gf[X\_cfec[RNNRRTUVZ_```aflkf_]abYSUWXVUW]_ZXZ^_]\]]^^[XXZ^\VYYO@57CRYVPJLSWTRQSSMA<@FKP[gcOAGV]]QFIQSSUVWWWUMIPZ^_[VVYafjjgchkdULIEDIT[^\ZUV__UOSVUVZbeeadqxj[X]__eklmjgb`guzqllnt}woiffmtvre`dlsywmhdfdaffVLUbeei`TKKUYW_hk^[UQTXVfrgZW_kuzyi_nwwlgjqtqidjkgbeihjpqpuvvxvmfirvrsupgcp}znhdbfknpsnf`[[Y`lld__cc]WRSW\a^WOLNHLY]Y\kbNOSZfhe]S\`\]^^R@CY^YWIN]TLOHFQWM=7;ELORY`VEFJLY\QOVZ\^aYHCKI99JMBBEB<=@EFIMRMGPQKCB:,1=D>;?NYVMPQQVcjtsbhokpvn`dlrplkg^\ejqx{nvx_`lrurlk|}o{ygblrklnruormkjjlmnpng^]`fqob]hppnj`Z`giebep|tknqnnqyvrxxjifdggijnrnfhqhdoj]akcOMPLMWUMRV[]_`US`khagg`\YZ\`hmmnmjgjqojmsrin|wtsjqmlvnemoi]`liacc]\^XTZ][TQON[^YSKJTbb_aY\jaYgpstjirpsurvvngrwrrvy}zxpmiosrw{untzzsqqlturw}}{sy~{y~||z}z||{z{{|tkz{zvx~|tssstx|y{c^tyvx~}xn~tyx~yq}~~}|ql|{}vikzy}zlup{wc]ttejmfhnorx{vhezvtw}yz~|{~w{xut~}{soo{pu}}|qw{s}|y¾¿ÿ¾}}RQTX[[WTV^gg_WYaefhfbZSPPQTTRV]ab`_cilgb]_d]RPTWXVU[a^ZZ]^^\\^]]^\Z]aa]ZYPD:8APYYRLKTZXRQQSM@8ENB?DGA:;AFGHMOQSNLHB@6+2BD=FLLNU\ZJDFFP^\NMUVUWTJBCIGCKM=?FC<8>DEFHMTXVMIE@;2-8FB>>GWZWPR^]`hmrqghklssgcelpjfheabgmrzqkmckoswqko{yusghoomsyslrtkkkklmhd`\_hllibclojgc_Z\biic`i}zyvgkegckqwrsuoigcghhljnrnkpporn`gpj\TYPKPYTMRRV\_WPU`f\[caVRV\]bhghjf`elidjopkep{x|~jgjkqneelng]aeb`b`cmeOJWaYOLJR`]YPIMVgg`\R_hY`mmnmfjvptupuumgqvuuzx|zu|sblz{{ztqsvxy{tku}yw{|vsy}}{zyyz{y}{|}||~up{}~~yvry||z{}hdvwsnt{|w}~ws{zy|r{tenvckldhklsyuof{|onvywyy{~pw{vu{~umr}wmmwlt{w|}{xnvtyxƾþ~{zz|QSX\]\WYbpobQM[fllhd^ZVTQUZ[^`cdddgjmke`^\XRMQYYY\__XV_ba^Z[]__^_^^cf`YVNFB>?IV\PIMZb[UTVSG;;EQYafg[ICLW][PIMVZ^`ZVVWSMMT\caXRSX\ceb][af\QD?AHU^[UWVQQY\VRQSQQW\^\\cmqdUVYXY]dkqqgedisupjijrvolnihpyzna`bfr~|ndehgeffaZZ^hebd_UW]`\[`gb^ZWSVWWixmXYht{|{okuyqjfhqyvjlolighkpsqmkmprusmhjvyrrrokhqyxqlefmqmlsqkgfa]dorlfgigc^RP]kkb[QJKMRQPW^fXMVSVcecYSYZ[_`ZMFVi]KK\sdEERWT[VC>GJLMNV[UHEFIT^XMMRSTTMBBHHEIME8@D>88BGFDGMUXQGEC?8-3BHA?AKX[XST_acjotqfgimrlcdelledecbehltwmo~mikntumio{vvsihnoow{qmvtkmmjoj__a_emifghkmmjc__]^dkd_cp{qzofiddblqsponjgeafhhnknrllprqrhcnpcWY\LMRYUMPQV^]QOT^c[[`ZQPX]^begic]\fgdchomedsxx}zdcglrkefkme]_b`_aanv`GFWbXPOLW`]ZQLQWij`XPafXaljkldivqttoutjfpuuv{vxr{qbp|wtvurv{vmwyvvutz~}~yxyzzyz||||~}~vs{~y~xqy~|zz}nkx{uow~}|~xx{~v}mushoicikkv~wpurrumvyty{~{{nvz~~syyykp~|}rmu}so{vw~~~vwtvzſþ¼ÿ½~~|zyyzPTZ^_[X`lpeWPXflmkgb^ZXWVZ]\^bdedgmolgb__ZSOQV[]\^`\V[cd`\\^___`aaade]SMHDA>CQ]XKLVbaVQSTK<9DSY]ehaPCGTZXTMNY_`a\UTWYUQS[``YPOUZ]ab\W^gbPD=>FT^]VQUTMP[[TRQQPSX[ZY_inhXRWXTT_kssjabgmqqmikr|pnoniiu|ugccdft~yjbefgefdaZZ_jd`b`\\_aZZbgd^WWWYWVhxnYZgt{z{qmwypjikryvmnpolhfjsvpiimoqtsnjlvysrrmkksywrjcdmsnkqrmigb_dnrlgilid^TQ]kmc[RLLOQNLU^dXOXTWabaYQTX[__[LJ]l]HNaraCFU[X^ZGBKMMOSXXRGCFQ][PLORSSSK>@JHDKK=5?A:6;GG@>FPTRJB?>:53@LHBCGR[Z\VVccbjpuqefinqhadejgcdaafhfjuskq{yolkpurhfnxtw}phjopqw{royrmpqokbX_ddkkafqnkkkfb__^_gk_]lwrm|hgea`cmqonlifdaadegnlmonlpuqkejtm[R`[MQUXTMSUZaVJOS]a[[[UNP\_]`cgk`V]fc^ajojbhrr{~t`afmqifhkkc]]___aewxXCFXc\XSNZa^\ROSWlobUObdYbjiijchvrtsnvrggovvs|utn|pbszstyupt}xnyxuysvtz}}~xxz{xvx~{~|}z~~~|zv}}x|{ry~xx|ur{vr~~yz{t~p}npvg_jlj|wn}lyonvxu|~~y{zymux}sy|lmw|ztywmywr}x}wwuÿÿÿƿ¿~}{ywwy}OU]a_\^jpk]SWdilliea_\ZZ[_`]afgegnqogb``^YSQUZ]`_^\W[eda_\\^```aaabdcZNGEDA@K\aRJUac[RQPJ?:CNUY^dcVIGNSRPMOYcc_[TRSVXXVZ^]WQMOW]]\[YZbcTD<=EQ\^VRTUNIS_ZQOMNQTWYY]flgZRUVRQYhstkb`eikklkjr|vpppnjpzzmccbdgvwfbeeeed_[ZVaje_a``aabYXblg\SV]\VThxpZYeu|z{soyynkjlrwvoprqnhekuumghnnpsrnlmw{utqllmsxwsjbdmqnmrrokhebenrlilnke_VS[loc[TONOSMIT]cYQZZY^_^VMOVZ\_ZLNemSEUdp_CHU]_b[KIPNMSY\XPGCIU\UKINQSTOC=DLIGKD79C>45?GD;>HPRPG>;957?LQGEKQY\^b[Zheakrvoefjmneadeheca]adefmupjpxxslkquqfdnusw{jelqrrwxtuzqoutmbYXdgfkcatxlilkdcb`^agh_brthkwhebZ]emnjkke`_^cdagnlknnjnunegtvfWVeURWVVQOZZ^bNEPS]_[YXSMO_a\^cjhWR^c`\`ilfblqq|{n_`gnlggjljb\\__`glxuYIKXhh^SO\a_\QRTWpucQPdc[bfhhh`hwqrpmwobfosrp|uon}neyytvzuoszpxyvuqtry{}|wxz{ytu|{||~z~}}x}~yz}uyxxwz}}yx}|}~{tyjw~f^jlmqrvo}zmowx{zwyy|wlrwyty~nls~~{vvvyszy{rĽ¾½ÿÿǿ½ƾ¿¿~}zwwwx{QY_b__grof[Zckjihfcba^]]`cdcfkljlppkc_``\WVX]__a_ZVXajd^^\\^`bbbaacc\PGFFDAFVaZKO`d\TROIB=CMTW[_aZJCKRPMNLRag_WRPQSUXYUUZYQLOV\^]WUX`^TC<=DOY[UPSWQJQ\]TMKJMQUWY\dkh[PRVQNWittj`^agighhjq{xqqqpliu|se`bbbgvtdbcdee`WTXV`geaabbbabYYdle[QW`]TUjunYWdu|xytr|xlkkmqusprsrpgdluslgjnpqsroonw}xtpkmnruurjbdjmmorrokhebfnrlimplfa\V[lqg_WSSQTOIT]aYS^^Y\]\THIU[Y_YMQhkJF`hn]EKV\aeZOQUOMTXZUNGFNXXOHINQTWK9=NNFFG>6DJJMU`_TS`b]WRMEDIJNQSVY]YPMNLIILNQ]e_TMLMOOPSRNPRQQTY[ZYV[_`SF;EMSRIEIKIHHHLNLIGIKJJPT^fg^SLHGGPanj\UV[^___\\_fnsrpljijkhdelqyse^adedehlkg]VWWWX]\Z^gllkfZV\ch_\`_`_\ZY]bfgihb[_ciottriikhgggfmjcbehkg`^kqpkggpxqkqtnlynhjnooopsqklpvyuqpjiknrrmhhjnplimnmllkkmigklhfgdee`aifUNUYOFLUUSSUXZZY\d[O]g[V]b^Z^fibUMW_`bb`fbLJ]a[[\Y[a`^[PX^`mbZ[XWWUYTJO]b[UVUQLVbc`Y_jtplxvgchnlhnslefjjjd_ry^LOSR]opdckleatzpxynbV]hlnnomkmomqvwz~~okklqpgd`ejnx{wrmqvqqoamzvnmpkcgmbYULHPU\SQV[WZ[ZTIO\_cg]TRX\bjnjjd`injjc\\iyzne_`\VZZadZ[^Y`khhmfY^fjcPcvwoiedkv~yof[^dqrfhkghoidafjkmrsnwqdhrnjibegdadilqmbW`rjYSVahYSbfecXW^[TY]YZcjnrslkf_gwzhajx{oq}xplvxsuokvztonoorvwpnrrmoplr}txxissnmlstx|dwy}vo{tl}z|y|zt{qrwjntstsplkqngi}|v~zs~w~tsqkmmo{xpwyoxzsy~~{}{{}{{yji{z{~nruz|}~|~{vzy{z~~v~~~~{s{|uz}omvwwttnrxý½¼þÿ½þþ¿¿ù}{zyz}~zxvtssrqrrrpnortxhnuungkywkb]adgijmmmlnoonnooida`a`acb\XZ^\XZche[XZ[[\]afikkgfgaUIBFNOR[^]]]]^[YULGIMMLOSUYYUI>@JV^]UPQY^REEHJEEHMONLJKPSUWY[`\M<:ACCEFMOMLJKNQSSSQPKC=9>HNTTOMMMLJJJKKHEKPJEGNYdebWOLIIKP\ge\RQSTUVVVUVZbjjfdcbaaa__fllmoohddddcdfjhaa]RRYc[V[]_aa`_\VT^gaZYZ\ZYTSZ``aegf_WY]ft~sabhlkflttla[[bhd^Xapslhikrsmikqvx{xokkhffffju~~yuqqprtolmrvwskhjnommtzwrpsrpsrqqqqpmooigjofTW][[\\ZXUY]\]_`b\S\fcbeffcaifZ[_]Z^b`ce[Xcfb_[]egiljdfrroommllb^jmb^`fimnllkjighilp{slvxofhmniilfa`chjhhx|]IQYTWhobYdkfiv{v}sd_^hpnljhikmortxw}rnquyq`aegx~qntrtxwkkt~xxztsyyri[OLVZ`PJZbhbNPQUTZ\^[[XPMSW`ikhcchhheZV^s{poifefhg__cfeabcehihkllmggq}|nnypmmmsl`eipqdejgkoihghfglpqiohabgegeadfghijkkd]^t~k^ZX`cZcg\`^PSZSPUOHO^jfgqib]X`gv{hnuhqsnkjrunmprsooru|zuzupstxxnoygylpqknlpoqy~tkyy{vnghlghr~~ntzvunvsn{{pmmnkyleeacfovvxtuyvttvprvmjnoiedefjrlekjcgrnhovu~ux|vyrw|u}u}}|w}{y|~vvz~x~~}vmn||sey{xkwvitüýƼĿ˿¿Ŀ¿ÿƿ~|yz~|wsrssv{~}||{|vrpomkmmopmjjloszxslfkzzoiea_bhlmkiijlmmkjkhb__abccc`ZZclg`ekmie`[[Y\chikmmlf\VUUSRSWZYWWUYchcVJFFFHMRWXTI=:AP^e`UPRUZWL??DFFJNRQKFEJPRSSQMIC=;;=FUYUMFEJPRLFGNNGITWNJQ[a`\SNJKLLMT`f_SNOQRRRRQQV]dga`a_][[[\agmkekpmigfffegojcec[TW^`VSY[[Z[\][TUeg_YXYYYUST\b`cike[TRZi|n`bhmkmw{tg^[Zbic[Ybprkhklrrigjpvzzvnjjhcacfjs~rmmkoupkptxzulhjmmqu|~xqkq~qotuttrnovtniop[Vaccb^]YX^baaacioe_hhgjknh_dd]^ab_aaclhabghb\_hllnnotvxunorponhdnsjghimqsrtqlmmmoquxopwrljkomhjf^\`chiel{pOP_[Q^mfYYdggmy}w|kbbjwtljigknpqqv}zursx{oa`iiwnhttw}jkw}xxxsz~xtgWWdmfTPfoo^OURad]^ca]UPNQWdig]^gfde\RViumhle^_cb`]_egc__bgjijjjiihovunjsqjkeovpddhnrebffgdcgghhegklhkbZ_e_cdcbdggegie_[cy}j``^ab[ehY]]NW`QMUKDN`jdgmfaYW`o}tdzpeptmgjsqfeqwrpv}w~nowxz{qnwen~rrqhrwqnio{xls{}zrnhefdhjqml}~vpkptlxsmspjjed]djnpryssurqqpmpokkhgfccddhlddia`kj^cnmp{ztwzttrmv}sx|z~}y|u}|vx|{z~}}or~z|lzjvov½´ʽ¾ʼĽ¿û~}|zz|~xsqpprvz~{zyxwx|}wqnmlkjkmnkgjjmow|ricj|{qjb[[afhkkhedhmmkifdb_^_bcdcb`bikf_cptmcca]\\bimljmi_\[[\WSTTVWXXZaghaULKJKLQX[WNE@AKYbe`TPSSSPIGIMRTUSRME>@HQTRPMKGC=;ESZRJDBGPUSKDIPKIV\TOSZ__[SKIKMORU_d`VPNPQQQQPQU\df`[^_^[YY[^dkmgdkoligfeefjmfdieZW[`^TT[[YY\\^[U[iiaZVWZZTRT\dcflleZRQYi~l^aimlp{}tg`Z[dibXYdpslkllsrigipwyxtmihhc_bfjt|pmkiovqmotx{vjekqstx||vomw|opuuttqkq{wmlstaZ`cfc__]Z`eeeehknhdkiimpphbecacbdd`bjniceiib_dknpptz{|}unqrrqqmimrmjjlpttuvsnnnoqrssqxujklikjff_WY`ehgeo{iNUaXTek_V\dehqxxz~xgaft|tlihiknspmw|~vrsyzqcdnjuohtvzjkw|}vttu~}xm][jrk^Xhsr^WZWlmcbhg`USPRWghcZ_igeaWP[orggj`Y]a`\[_cd`\]cijjjiefhksuofkrgl~gflurfcgotf`eddaad`cgccgjii`Y`c]bdccegfccfb]Ycw{kab`bc\eiZ]^O[bONUHCPbgagkd`XTat{oj|}mequibowmcenvtp|~ylr}}y{tpxgk|tuthnyvpfk|zmp{}vnnjeccggkohx~wmhotlyrnxrhxoad_clrps}rruqpponoljifggabddhhace`agc\cllnvysrtqt|zomw|}|yqz~|{|w}~w~{uz~~{r|wqlwvy·ƻ¿½ǼſûžĿ}zzxz||vpnnoqvz}zxwvvwz~vpmmlkjkmojgijkov{nfcovng`[[afhjhgeehkkhedba_^_bdcbabfje\\ispg`aa_]]flmmlke]^_^[WUUUUTX[^cig]QOLMPTY\[RFBEJT_d`YSRSSSOKKPX\YUNIE??GPTTQMKIFA;?P\TGDCEMUVOGGQRIS_[TSUXZYUNHHKRVX^a\TOOOQPRPPQU^ceaZZ^^[XXY[^fmmfekmmiecbafnjbgkdYX_b]TV[YUZ^^^\ZdljbYVX]\TSV]fegnleZRQZkk^bkmnt~|sga[[eh_VZfrsnlmlrqhfjqvxvsnjjha_bfir{omkhouqopsx|xhcnwzxxxytmo|ynpuvutqnu}wnorsmc`dhe``_\bkigilmmmlliirvrggkddgeggcgpofdilgbcfkppqyrntrporplnoonmotvttwuqopqrrrstzthjlghfc`YUY`egeerxeQ[`VYhgYU\ceirvv}rdbk{}tjfhhkormmy}|xtsyyrfeoltogtx{ljvz{uqrwzqfcqwne_kvtc_a^oqifnkdWUST]jf`Xbjge\TQ`qmdif[WZ^^YY`ba\Y[biljfabfhnuqicnpbwoggksrf`enxh]ed`\_aZ_gb_djhd]X\][adaacgfa_eaXXbrxlabacb\fkZ]^P^cOPUGCSbdbhjd`WSfzwmszulfpugcvxgdelxwtrnuy|xrwjiyvvuhjz{rghy|noz|rjnle``ghgscr}xjfmtl{qq}sfos_ebcmrnupqtpponnmllhdjhabdeie^cd`dd\\djkltvqpposytkny{zxsozv~~~u}z}~zt{z}uvxsy~ľ¸ǿľĻžž~{xxwy|~ztnlmnpuz|yvtsttx}wolkkjllnnkgiiknuz}jddq~zqle_]]aegihfcdfhhfdba`^]_acbaabee^Z_mqjb``aa^_hmmllkc^ab_ZWUVWWW[_beeaXQQPQX]_\UMGGKPXa`YUQSUTSOLPY`]TLDABDIOTSQOONJE??JY\I@BFMVZTLGMUTU^`WVVVXWSOLKMSWYZ^\TPOQRQRRQSUYad`[VZ][XVXY[_fongeilmica`agje`il`W[cf^XZZWS\a^^^aikgaYV[_]VVX_fgjnjdYQPZlk_fmmryypic[Zfg\TZhssnmmmsofgmpuvsqpnmib`degqznkjintqoptw|yicoxyvvvvsorwnosuusppy~vqrrwufafkhbcc`domhlonopomgjw|rfhnfgiejkimqjehjkhdegmqqt|rptrqqrpmoopppptwtsxvsrpqrrnu}zpjkkffd`]WUX^fheequaS`_U]gbVV]bejquymcdqzmedfhjolhnz|}{xtsyytjfljtphux|plv{{uory{tnkv{ojktzvifffqpljsndZXXZhlc^YdjhdZQSdogbg`WUXZZWY``]ZXZbilg^[agjprjehqifvhieiqqe]bmyiYae^X]aX\gb\bihbZV[YW`ea^aee`_c\SUanumbabcb\hm[]^R`cPUVFGVaddhhd`XWkyrtzsmjhqsfe}xadinyz|{mpy~w{xrujhwvvtjiwzqjiw{omw|ofooe^]ghb|wan|yjdosj|qvsfm~vdjfdospznssppponlmogemhaddhk`\dc_caZ\elkjrsmmmnstmiqzxvsrpyy~w~}r}~{y}{r~}z{zz{õŻ»ĺÿƿ޾ý|zwwuwz~~yrmllmotz|xtrqrru{wnljjjllnnjfiijlrx|~hbcqytnjb^^_ceefedbcefeca`^\Z[\_``__ab]ZY`kngaaaaaabjnmjjieceb\XWVXYYZ^aaa_XSRTVX[\]VMJHKOUZ]ZVTRTUSQJNV^^UKECAGMRRQQPSURJB@JVVNCCEJS]ZRMPVWZ_`]XSTXYVNNNQVZXYZY[VOORSQRTSVZ\\ZWWXZ[YVVWX[_hrngdillfba`cgdaakk^Yagh`^^YUT\b```elje_Z[``[VVZafinlhdWPQ\n}jahmmt}woleZZffZR\lsrmnmnsnbiqprqqqromjecddgszmijhlrqopru|{qkrxvsuutppxunortsrprz{usss||jbglidegdfoojlpopurkho{{qgjojkkgkmosngjmihjihkprqwvsurqssolnprssrtwtruwwroqsqlu~{mhjiec_[XTTX^fgdeqp[Ua]X`eZRX_cekou~wicdwvhb_bgkmhfq{{{}zxtsxxumgjjvqjwzsnx{ytoqzwrnx~qmv}~xmlkltrqpwqha\\anq`[\gihfYOWdleedZUUWWXV[_]YWWZafgaYY`fknjbakmbrmpmbfpre\`kyiT[c^VY`XXdb\`ghaVU[WV_da\^aba``XPS^jqlc`aca]hm]\[UfaPZ[KMX_dggfdb\_pus~xdghinocjsagjq{{}tnt}|vzwnp|nhsuxvmktxrnluzpjs{mbmsi^\fea}yam}}kcqqipwqfm}ykpjgrvv~lwrnqtpjkpogipfbdgnj\`fcbd`Y\ipkjqoijkosohht{xrqssy{~w}~t}xv~}u~}~}}ƻǽȽ½Ŀÿżÿĺ~~~~~~~{xuustz~{vpmkkmpty~zwsqppqty~wnkihjlmookggghjpvz}eacouqkga^`bddddccbbeeca_^\YXYZ]^^^_``[WXajleabbaacdkpnihhgjjb[WVX[\\]`a`\ZVUVY[]]\TLHGIMSZ\ZUTSTUUSNJW_]TLEDJLOQSQMRWYTMFDITYPFCGKR\_WSTW[]_``\VTVZXTQTVY[WX[[[ZTNNRVSSWUW[[WSRUYZYWVVUX]bitmffilke`abdec`alj\[hjicb^XTU^ccbcimid^Z`da[WV]dflplgdWNQ^p}|jbhmmu~}uonfY[heWSaptqmnmnsiakspooqssonmgeddhtzmijhkrqpqqt{~wsvwtrsurns||rooqqqqqv|xtutt~jcgljefghiorpqrpqwtklv}ypimonpmkmoy{lfnpkjmoortrszyutqpstnklmsuutvxtptzzqlqrolyvifigc`\WTSUX^dgcdnkWXb[Yc`SQY`beimuulad{qf_\agklghuzw|}zxssxxtoiikwrkwzvox{wtoqz|sp~ro|}zttsqvtvvztohbahsv^ZbkggjYS[chhicUTVUUWU^^WTUW[adaZWY`eike_`ihd~yowl`irqaZ`kwjSVb_UV^YZa`[\dh_RUZUV]ab][^``a^VNQ\gonc`acc`il_[WXj`P]`RSZ^flgcec^etsvs\bikmjbunckks~}npx|wzvnoyrhntyxqlrwsqnsupiryl`jvl]\fc`zal~jasrjpxogn{}uvnisyzo~qjryuhiuqgotebditgXcgced_X\ovjirmegjorkdjw|vqpsvx}~w}~~u}vq~}|Źɿþ½ÿ»¾ø~}|||||}}}}}}~~{vtsrty}ztnkjkmoty}yvsponosx}wnkggjkmpplheefinty}c`dnspjea`cdedcbba`bdea_^][WVXZ\^^]]_]ZWXbiic`aaaadglpmghhhljaYXY[]^^_`a_ZXY\\\]^^ZNHGHKQW[\XUTTTTTSPU\`ZPJGJOQRRPOSZ_^SKINSVULFFMT^_ZW\]_`ba_\XXXWXVRYb`\SQZ\_\RPRTZ[Y[][XWWUXUUYZXXWWWYahkvmdhjkkeabeffb`bij^\opkkh`XUV^ffbdkmg`\]cd`[WX`fgnpkgdWNR^r}|kbjllu~{topfY]hcVUfptpmmnppfaispoopvtqpogfdcdp~|ogigipqpoppw}tsvvrqsror}{tponopqqtzwuvuu}phfklhefgkntwwtpsxslr|}wokoppronmr|jgoplkpsuvtrt{}wurqrtpjhkowzwtturot{xolprmmywffhfa^YUQPTY_eebeleVX`[Ya[PPY^`eiow}{sk^f||maZZ`hkifkwvu|}yxtsvvuohhlyrnwyxqvxurnowvsup{{zyuxxx{{wrmjjr{w]_kmfip[Z\adnkaQSXUTVWa\RSVW[bc[UVZ^dghe]afepotue`jup^\bgolYT`_TU\Z[_^YZbh_RUXQQZab^]\]^`\UOP\ellc_`cedhi`ZT[oaP\`WUY]hngaefaivq|kXaikkhjkhnmu~}~~wls{~{wyuknw~thktzyqmqutsprupjqwj^iwn_]ebc}cli`vtloynhpxzplw~~toit~ueivqjurceelvcWfidgf`W^tvmmrjfhhoqfepz{uqptxz}~x}}x}tn~}~}Ƚ·ÿ¾ɾ¿½}{zzyzz{{||||}}~~zuroprx}}wqmjikmosx|ytqommmpu{xmigfilnppmhddehotx|a_dmqnhdaadeedcba_^`dda^\\ZUTWZ]^]][[ZXVZdiga_`a`adilljgjiijf^[[\^``aaab_YZ]`a___\SKHHLSZY[ZYWWVUUUVWaa[RPOQTSRQPQRYa_[WRRTTROKKNU\a__acdcabb^[YZ[\[YZbf]QNU]`_THLUZ[]]\[ZXXUV[XWZYWXYYX[eel{mdhllkebdghfcbdjh`fupmrk_XVX`iibdlmf^[age`\WYafglpigdUOV`q{ykcjllu}zsoqfZ_gbWYjrrommnqoeamroojqyvrspjhfbdr~zngighnqpooovzsttrqqpqw}xtrnkmpsrwxttvutogejnhdegkovzxrqvwppx{ytmkprrrqnmt|vhgoqlnsvwwtrtz~yvtqqqqnigjr}~wtspnqy}skprnlsofgfca]WSONRY^aabfi^TZ]Z\]UMQZ]_ejr{}voi]i|wg[Y[ajkfepwor|~xvtsuutpihnyrmtx{ruutrmmwwvuq~}}|{xyy}}zxspt{x_gsnhot]]]`ewk^PTYTTWZbWPSUU[`\RQUZ]deb_[`hjywkvqbalvp^_ecgm_R\_URWY]^]YX`h_QUVPMU``]\[[\][UNPYahjb^^ageefa[R\pbR\b\WX]ime_fhdmvr^Uckmjgskpppw~}ypnu|z{zvxtjkw~sgirzxplorttpoonhoui[fyr_]dagenjaywopz~miqu|pn|}ynhxpalvoqwkhjhpvaZijgjiaYc}wnpoiihispgmv||xuux}}y|~|sj~~~ĻĽ¿¿½ƾ{zyxxxxzzz{{{{||}xrolmrx|}|~vpkiijlptx}ytpnllkmqwxmhedhlnqqoicbcglsw{^]cmpmgcaacdecaa_]\_dc`\YZXRRVY]^]\YVUVU]gic_^_``belligglkjfb[[\^_aabdca`]acca^`a[NHLQY\]][YYYZYVVVYbg^QNPSTUUSQRY`da][[ZVTSPMPTY`eccdeddbaa`^\[]__\]bc\PHNY`cYJHR^`\]]ZZZZXTYa]ZYXY[[YX\cal}nbhlkjebehigddfifeqwmoxm^XXZblibekjea`chf`\XYceeklheaXRYaoxwkekllu|wrpqfZagbY\krqomloqncbnronisyvruumjgbgu~xlfgghnqqonmu~urrqponq{{vssnikpsvutrvvttmcejpidefkq{~vnqvtrvzxtpllqvurqonx|qghoqmotvxxtrv{|{xtppqrpjhgjtvrqoms}zlirojlwzlggd``\VQMMQY\]^bheXS[]Z\[QLSZ]`eks~{rng\l{pb[XY`kmdertlr}}zxutrrstqjgpvsjpvsrrqpklvxwus}}~{xx|~|{uu~udpwmhru^^_^k}l]PU[QUY]bTOSTT[\TMQVX\ba_\[ahslkvmaamvn]aga_lcQV[UPSW[^]XW^ibSSWTMMY]Z\_\WXZTOPV]efa^\^ilebb\Q\peU\fc\Y^ilc_gifpuswUUcloif~xjssu{~~{|~opx|wyyuxshjw}tgfqzxpklotvrlkjhntj[cyua]dbihnjb{xrryznkqu~op~}}mg{lbrunwxhmnlww^^nlkomc[kzpqnhlilwqiu~~~|z{~~{{{|rj~~~øľ¼ƿĻ¿¾¼ĺ~~}ywvuuuvxxxyyyzz{~{vokjlqx|}|z}{tmighiloty~ysplkkjkot|ymhddhkorrqhbabeiqwzZZbkolecabbdeba^[YX^ec^YWXTOQVY]][ZWSSUWaif_]]]``bdhgehkomhd_\]^_`abceebbbhjfc_aaZRPT[aa`_]\\]][YZ]becXOORRSTTSTW`ijb\^a]UTVSQV[_dmlgdiecbaba_^^addbab\RMLV_`^RIM\ea\]][ZZ[YW]ecZUV]`]XYZ`apznbhighecehhgffhgcjxvjs|n]YY\emicgjedb`egb^ZX]eeejgfe`XSZ`kuvjfkklvzsppod[bfa\alqomlloogahormkkt{vrw{olgdjv~xjcgggnqpokjtwprrnmns|ytssnikosupnrwvst}}pfdjoidfgjt}|qkqutwzwurnllrwwspooz|nfinpnptvxxrqvyz|{xuolnrpkffflw{spoljt}sfjrlhnyvkgfc_][WRMNRYZY\dicUT\\[ZTLLVZ[`flr{xpne^nwi_YXYbmkdhrplt{xyvssrqrvtliqv|shmv~tpoopklv~zwut}~}wx||{w{whu|pirua_`\mq]UW]PY]_bRNQSSXYPLSVV[^\[[\ak|tfosg`bovl]ch`[heSRXSNOQX\[[X]geWPW[SIPZY\f]STWTPPTYae[W[\ipe_b^P[qhVZii]Y_fib^ehirsunQVepqgjtmwyy|t{znpyztwwtxrhlx|seeq{xoiijrytjeeflrm\`xydZeglmlld{xt~qwwnlqv~oq~~{igggvsq}wfpsr}u^grnnspc]q{qunkojnzsmz~}|~|~~xuqp}zľſǿ¾¾·~}}~{wutsrstvuvvwxxxz}}}ztnhhkqw|}zy|~zrkhffhkoty|xtoljihjmqx{ohddhkosrria_aehovyVYbkmicabbabb`_[WUXbgbYUUVQMPX[^]ZWSRSUXdid][\]^`ccfdcgoqmhd_]_aaabceggdbfjigb`ca\Y[_cdcb`__`b_\^acebZSQRTSSTVZ]_bffa^d`X[\[\]]`eikljemdabbcdccceggd`ZTTVW^d`XOMXdd_]`_]\\][\efdZWY_^^V]baaquk`fededdfhghhijdbozrju{m]YY\fojdfgee`_fe_[XX_feefeed`WTZ`isthejkluvololb]beb^dmpnkkmomcajqoijkv{vtzxokfdku|~wgahhgmrqlgirxorslkovz{wrqrnhkoqojlswsruzzrgdjlheegnxzrklruuxztpqnjlsywspmq}xifjkmoquwwuqrvvvxutqjhoqkeccfnx{vqonihvzkemqihr{{rkhe`^]ZWRNPSXXW]di_SU\\[[SKMV[\`gmqutpmdapte[XX\emhclrmmvzvxuqtrpquvniqvz|rjmu{toooommu~|}{wtt|~uw|}}|zp}tntwdb_\lu_XY_U]bbdQLOQQVUNNTURW[VW[\bu{kisn_^isuj^dh_ZgeTQSQONNSWZ^]\dg[NT_YKKZZYegYPRSQSVX\bXTZ[goe^a_QZogW\ig]\adeb^bfkrqxhOViuqgqtq{}}o|vmszwruutwqinxvndcp{vkgggoyvjb`chmk]^xgXfmlxqknf{xv~rutolnzoo~|}xgjcjwptreryv}pdnsqrvrddz{wwoosnr{vs}|||}{{}yvt}rw~}|x{ſ¾ÿµ¿¿Ⱦ~|{{}~yusrqqrststuuvwwx|~||xrmffjpvz|zzy{}xpjfeegjnsy|wsnkihgikov~{pgbchlptsqia^`dhmtxUZdmmha`aa^^^\[XTS\de^VSSTOMRY\_\VSQQSVYcgb\Z[]`accdccltqmhf`]_`bbcegihfdehhecceea]`higedcabcb`^`ccc^VTVVWWWWX]dgeda_dha[bcafiedlprqieke`cdhgggfgfd]WUTY\_bd`XQUdh`\`eb_```]bkicY[^a_^Zcgc`kog^dc`bbdffgjjlh_aqynjvxj]YZ]gqmeeggd`_fd]YXZ`heccccb^WVZbjsshdhkmstmilia_debbelpngimmidckpkgjkv{vvzwnkgfktz|ufahhfkqomijq~{osrkiovwxslmroikmmlioxvqrvxyrgdijgdbhv}vlgmrtwzvqoolgiszwrnlu}sffjjmpruxurprvtsvsolhionfabcfpxxtoljfjxuggnphiu|xoihc^_b^XSNQUWWX^fg\SX\\YXTLNY]]bioqpppk`ctp_YWY^jmfeorkovwtvqptqnovzpjquwxqlnuzuooppmlrz|zz{v}}ut~|{|swz}}~{zruxgc`]mwc[ZcY`fhfOKNOSVSMNTSPUYTSZ\i~~njnqgW`qvqd_hi_[gfTOOPOLLPSVZ`^_gaRO[_OGU\Y^k`ONRSUWXX^[UX[ckd[^]P[ngY[gf^`cceb]_dkrs}~dOXnyqlywu}yqtmsyuttoruokrxrjccpzsigdblxvka^`dgf^]xnXeqkrrkph|ww~rqrojlrm|{wgl{bkvot|mduz{}omtsrsvren|~ypturu|{yz}|w~}}~vwy{~|uts|x|}~u{}}||yy½¿¿¾ĸ¿½¿Ż{zxy||wsrqppqrrrssstuuv{}{yvpjediovz}{ywwz{~vnhddefhlrw}}xrmigffgint|}rfbehlpssqhb^_bflsw~U^gmlhb`_\ZZZZYUSS]ed\TQQRPOSZ]\YTQPQRX\`ca]YY]bcacdbgsvokgd_]^``acegjhffghhfefiib^fmmjhfeccca^`bbb`]ZZ]\\[[Z\`ilic_ahhcbeggjlgfouvphfgedhilkjjhifaYTWXY]acb_XU_hg_\cheaefebhoke[]cb_`agh`ajke`da]_cebagjkleZ_qxjjtuf\YY_iqoeehhd^^fc[YX\cjdabbba^YV\ckrpfdfilsrjgjg`aeeddekpnehnhgdekoiegkw{xx|wnmihkqxzsdagfdjonnkkoy~nrrkiptuuqkkqrkhjkiisyursuvxrgdggcadqzoihmrv{{tonlhgltxtpklwzmcehknrsuvqoqrrrstoifdioia_`dirwtpjgedmxndinlimuxunhg`\bhaWSQSWWWY`id[W[\ZVVSMP[a`dinppnng]fsj\YYZammegqqkpvvsuspuqmow~ulrstvrmmsxwooppljpxzxx~yuyzttzwy~xqwxz|~tuvjfb_owe`\i_diojPGJPTSPLLSROUYRQY^rtgjpm_Vetsi]`onbZceUONLKIIOQOS^b]beYOT`WGL[\YafVMPTTVYXWWTVYahc]]ZP[keY\hd_bddb_\^cksx|dR\t}suww~sttmuystqlqtmktyribcpyrheb^iwvka]]bec]\usXevjnsntmzvx~olnnhjsnyytfpxdmtotxjfx|~oqwtrstqlw~{txurz}|zyysy~zyuxsw}yx{x|qz}sq}yr{|}}zzw{z{~zyþǻ¼¾ùzxvw{|yvsoooooppqqqrrstvy}}{yuoiddiov{|zxvvyz}|rkfbbcehlrw|~ysnifddehmrysgdeilpssqha\]adkrv|V`ilkgb^YWWWXXWTQT_gdZRQPPPOT[]YTQQQQSZ]`ba]YZ_ddbaacmvsmgd`_]^``bdfijhffiihfghkgackomjjgeedca^adbba```_]][\_`dmoi__hlgddfhhjihjsutnhffffmklllkjie]TSZ^_`ab`_YWcic_bghdfkifhppkd`bf``cfjg`aiiddc^^_cd^_gllj_YcnqgiqqdYWZ`hsqedhgd^^fa[XX\ejbaa``^]ZX\djnmffeglsnfege`beedddjplchngeefknhdciw{xz|tmmkjmotyqcagfdinnnmlovoqrjjqqrqpljpsmefjjksxssuvwxrhedca`l~|njigkrx|wpnlhfgmtspngkywgaehkprttqnnqqooqpidbbimd[]adjsuokhc_bqthclkfkqsssmhe^ZflbWSSUWWVYcjd[Z][WVWUOR]eefjnoomlf`lqdYZZ\frneirpjpuurrtpuqlnx~xnrsstromqv~zooqojhnvyuv}xuvvsswsw|smwwy|vuukjf`pvgdamfelxpPDIRTPOLKRQMUYQOXcz~jdjmjXWknhb]ito`YbdVPMKHFFNPJLXa]\b_SOZ_QIT[UYb_ROSUVZZUUTQW_ed^[WQ\hbY\fc`dda^]Z\clu|yfVa{x~v|}}r|vovyppplptnmtwqibcpxrhd^[gvujb][`db[[rtYfziksq}zswuy~jglmhksruz{ohsueosntuhj|zoswsrtrmo|~z|vu~}}{ywwou{wv}tyytuw|xuvsy|nszspztnxz{}|z|zqzyx}z{廾ʾ}xvvwy}yvtqonmmmnnnooopqrtx}~}{ywsngcbhntz~|zxvuxz}yqjdabcdglqv{~ysnhfdcdgkpw~uideilpstpha\[_dkqt{Xcikkg`YSSTVWUSRQWahcXQPPQQQU[[VRPQQRX]^ab`\Y\cedba_eqvoic\\]]^__bejjjiggjigfgjjgfhlpmiiheccdcacecccbcb`^]\]bfillf`cmnhfeefgiijnuuslhhfffhklnlkjjgXOV^cfecbbaYYeidchkhejojhpuplecfe`bfhkgcchhbfb\^aeb\akmlfYZfkieipmaWW[`htsfdhhc^`d`YWY_gi``_]]\\[[_dhklgfeflqjddee`befebcioi`hlfcghjjfbafrwxzzpmlkkmmrwqeafdcgmppomot|uqqkjmmnonkkpsnedhmqruqrwxwxsiedbahwpfhhhmuzyrnkhecfnsqmhckxreadhkorsqnmnqpnmnkda`bij`X]bckttnie^]espcdmhckqrqrnhc]]kl_WUUWWWVZfmf^\_ZRR[YPTahhgjnomkicdqqbY[[^isnfktokqutqquovrlnw~xprsssqrnls||poqnignvwsu{~wttrqsuqvzojwyvxyz|}wttmjgbo|thfdnjeooOFOWRPUMJRQO\[PNZl}t`ckjbV^me^afprh[XbcWQLIFDFLOMIP\[WZ_ULV`ZMLWVTWa\PQUUY\VPOMPXcd_ZVR[f`Y\c__dc^\[Y\dmy|wk]gv~yxwowxnoplnpnmoqoiccoztjbYVdtskc\Y]baYXouXf{kksu|v}wttz|heikfmvzyrzukivtgprotrgm~~wqqusrrplq|~|ux{y}|uvmryvt{uv|utuzxtuswyloxtp{pktwy~|ysy{ntww}{}z}ľſ˿ÿľ{vuttt{{wsqpmlllllnmnnmnoprw||{~{xuqlfbafnuz~~{xvttvy}xogcaaadfjotz~~zsnhecccfjou|vjdfglpstoh`ZZ]bhqu|[ejkjf]SOPRTTSPNQYdjbUOPQQRSV[ZTONPPRY]\]``]Y]ceb`_]etumf]WYZ[]^_bejkjigghhgfhjlkjkoqnjigdcdefggfeeedec_]\^`ejhhfcbiolggeeegkjkqusojgiffhkmnpljjkgYS^eghhebgdY[fhgilmkkoplmvvmjhgfd`cgjkgcehhdf`Y\bf`[cmnkfXYehedhlh]UW\ahuugdjia]`d`XV[djh`^^\\]]]acfgijgffflngcddcabegebbinf^gjcahiifcbadnuxzvnmljkkkpupgcdaafmprrmkq{{rokhhgjmnmkpuoebfossspsxxvwsjeb_duufehhioz{snlhd`afmrpib`muka`djkoqqnkknpnkjhea_`dhcYW^admuqiea\^jtkbgjdcnsqopog_[`oj[VXXXYXW^hpldabZOQ]^SVdkkhimnljieisk_\]\`ltlgntojrvupquovsmnv{rrsstqtqhq{~sqpmheluwqsz|urronstmtyjgx|stvut~z{yttoljfoyrjjgnkfugONX[OS\OJTSRc]OM^qyf[ekfZYfk_ZdormbVV_aYSMHFEGIPRILVYUU[VLQZ]UKPRROZ`WRTSUZULJJLS]da[UQ[d_XZ[Y^cb^\ZX]ep~wyo`nx~~}z|xp|zlnplllnkgkmjedozyl`USbqqjbZWZbbWWntWgnk|tvxq~{stzzebfhemyurzqgixqhrrnsqgo{vrprtsqnnu}{t{x{yzuuknutsy}tvwstxwwsqtxulmvtq}nhpuw}|x~~ox{nouw}|}tzù¿zttsqryzurpnmlllkklmmlllmnpuz{{{wsojda`dmuy}~ywusrtx}wngb```cfinsx}~zsngdaabeimszxkeggjortqh_XX]bhqv~^fjjhcWOMPQSSROMR]gk_PLOQRRSV[YRNMOPT[^ZZ_`]X]dc`^]^fusje[VYYY\^_beikigggffffhlnmkmppnihfcbehghgggffed`^]]_ehkheccfjkigfcceimmlqvqnhgfegkonoojjkje]\fmmjhecfcZ]hihknmkourlrxulijlic_cgjjeeehjie\VYbf^^innjdXZbeddgjeZTX`agsuidlk`]ab_YW`ilh_\\\\]`aeeijihggffjkfcedbabffc_`gjd]gibahigd`__blsxxpllkjiihlsohdb_aflpssmjpxsnkgecglooknupdafnssposxzxwske`_k}~jchghjpzxoljdaabgnqmd^alnd__dkkmpplikmligfda_]`edZSV^aepsmeb\X^lshbgfcfqrmnpqg[ZdrgYVZ[\ZXYakqpfccYMQ_aVZgoojjmonljflpe\_a_doskhqtlkswuoquputnnu|usrstpurgpzusqlecjsuoqxztqmkmvsjs~xedw~tpturpz~wy~ztsqmlkqvqllhomfydOQ[WKYeRJUSThaNMdrm]YflcX]lhZWewue\TV\]ZUOIGDCGPSMIQVUUYWLLS\[NNONNR\^YURQUUMIILQXae^TR[b]TUUU]ca^\YX^gv|t}scx{}|}xt{joplikneaknjffq}|n]QRanokbYUZa`WXl|rXkpjuvsso|{stzwc_aego|}{qrz{mfj{ogssnsqjqyvrlnttomou~yr{wyyyyukmqqpw}uuzrtxzxplrvrklvtq}lfmsv{|y}wlu{uqtw|~qzǼļxrqpopwxtpnllkjkkkjklkkkkmpsy}zz}{wsnhc`^bluy}}yvtrpsx|vlea`_`bdhlqv|~ztngc``adglrxznggginrtqh_XW\bhqv~bfijg^PKMQRSSQMMT]ggXKIMRSSSW[YOLMNPV^^WYab\X\da^\]^hunecZW\[Z[]]`cgkjhfffeegjoqnlopolifecdikhgfgfffec`^_abeiihfegljdcfdabejmmmqtplgedeikmnonjjkjb_emsqkffge`\ajkjnoljpwsmv|umklkgcadhjifegjmkcYVZaedhnpokbX\bcccehbXTW^afrvidmma_a_]YZemng][\\\^acfgkljgfgffhgcceda`afea]_efa]gibcihfc_]]ajrwujhjkjhfdhonic_]_fjottmjov}umjgc`elpojnsmecenrplnsx{yvskc]`stcdhghltxqmlg`]_ekpng_]bhe__aeijlonkjklecddb`\Z^c^TPW^bipnie_VT^nodbebbmtnknpqgYXetfVX__^ZX[dmrskebXMRabZ]jrrnkmpomjjmlb]cebgpskjruljtyunq~wsusnmt~}xrptupvuhnx|{xqicahqslpvwsohglvqhq|xdctxnmqqoluzsvzw}ztsqnnosrpmljrmf{dRV^UOckWOUUVgeVQhqcWYfl`WaldXWg|t^ZVXZYZWQLICAFLQSJLUUSWXNFNWYTPMLNOX_]VSQRSQJGJNR[fcVS[`ZSRSV\``_]YY`iyywti{x{zlrslgjj_cqoiggs}n[OQammjcXSY`_XXiypYqpho{xoloyxsu{~sb\\ahr~zslsz}wjdj}lguuospmvvwqhkssmnqt~wp{y{yy{ulmrnlv~vt{~svwyzqkqwqkmusrxkcjqwxz|~vlsxztvy~~pzɾÿ¼ſ~wronnns}~vqnmkjihhhiiijihhilnsw{|vx~}zvqmhb^]akty}~{xusrpsx}~ukd`_^_acflpv{~~zumgb__abfkpvzohgginssqj`YY]cjrx}cfghbTIINSUURMKNU]edVIHMSSSTXZWMIKMPX^[SXdd\W\b_\Z\^jsjb`XW^[ZZ[[^bgkjgeeeefinrrmlopojgfeejnlhddhgfdaaaaccdfhijjkkkd_bdbacfjllmospifdbeiijllkjikicdlruphfhhd_`flmnpnkksvrq{~tmlkiecbehihfehjmjaWW[`hmmloqk`Y^bbbcegaVRW]afrthfoma``_][_hnpf]\\\\^cffglmjgffgfgdacec`^aee_[_dd_^hhbcihea]\]`hpwshdhjihd`ellic[Z_egowwmiotywlkhb^elpnjqtjdcfnrnimrx|yvtl`]e{k`fhfjpwtmkke^]`emnha`_afb]`defhmmihjkgacdca]XX]`YPRY]ajniebYSUboj`_a`frpjimpqgWWguhV[d`^\Z^gntvogcWLTcc^alssrmmqqmjkmja^dfchrskkutjiv|umqyuttoms~ysoruqvvkoux|rhcbforjntusmebitogoyxddpqjjlmkhqwppts|wsrroorvsomloumh|`S[bVTgk]WUVZigaYlnZQYhj]Yce]XZizq\ZYYYVWXSPMD@CGMRMIRTPSXNCJRUWPLJKNU[[VTRQRRNGHLOWdeWS[]WROSW[_aed[[bl}|}sq|z|outjfif^ivoight~lYNQalmjbVS[`_Z[gvo^xnejxwkhoyxru|zo`XX_it{{nlux{qebj~}igwxnppoy~svodhpplptu~{tr|~{}|}yuolrmjw~wtwxxxyzslourmnuoqvlbgmvxu}xkot}{wz}u|{º¸Ŀ¼¿|upmlkkpz|toljjhggfggghhffgijmqvz}ytv~|yuqlga]\`isy}}{wsqoorw|}sic`^^^`bfkouz~~{umf`^^_aeiou}{pihginsrqjaZY]cjsyegheZLGIPVWUPKJOV^dcUIHMRSTVYYULEINQY^YQXed[W[`^\Z[_kqha^VW_]ZZYZ^bfjhdbbddhlosrnmmqpjfecflnkfbeigd__acdeeefhjloomg`]bbaaeiklijmnjecbdfiijkkjjjjijmqupighigc_bjoopqmimvupurmkifecbehigedfkoi\XY[bnohgmqi_Z_a`bcff^TQV]agqsjiomc_``_^dlppf_^^]]_ghghnnjhhfghgb`cec`^aed]Z_dd_`jjcehgc_]^_biouqgbfhgeb]clmhbZX^cfowwnhnrvxmlia]ekmnlrtjccflpmiilt}{vsl`_ovfchhgmtwqkkkb]^`fkha_``be`\fiddhmjchmhaaccc`YUW[YQMSY[`ilgb\TRZhoe]]^ajqkegkoreSVguh[`gc`_\_gnuyqieXNXffaequtupnstolkkiaahifjttloxtijx}rms}|vssqlqzsmpusuwlotv~ukcagoqilsurmc^fsoemxxdenliijkifovnlpq||urrsoouvsnlmtylj~^U]eUUhmg]UW_lkh_plTMZll\Zc^SW[kxm\ZYZYTTXTQNF?@EJNNINSMPVNAGPSXTMIGJRXXWURPPSSKGINW`bYT[[SNOUTXbemj]]ep~ty}|tvsiehfeqvlhiiu}jVNR_ikiaUS]ba^`hqof~jcgtugeoxwpv}vl_UW`jw~y{{lnvw{~ndal|gg{|mnps}{qvoadookrvt}zst}~{y~~rrvmpljxvsxzzxyunnssqqunq}rzmaelvxpzmiq}y|~~~ļÿý¾¿zuokjiinwzqlkjhgffeedeeeefffhjouy|~}}}wsu||zvqmga\[_gqx|~{vspnmpw{|qha^]]]^`ejoty~{tlf`\\]_cfls{}qihginstsjb\Z^dluzhhhcUIEJRXXUOIHOW]a^QHIMQSTVYXRIFLQTY[VR[ebZWZ^]ZWZ`kldb`VY_][ZWX\adhgb__ceimprqnnopoidbdjligdbffb_]_ceeefefhlprqhb_^`bcdimljghkkea`aeiiijkkjkkkkottrieijifa`dlooppljqwtrz|mjigeddbdhgfddfmogZX[^fqnffopf^]aa^`bfd\RPV\ahprllnlgaacecipqoga``__dkkijrnjhhgggea`ceb_]`cb]\_ccaeljeggea^]^aciosne`dfeb^Zajmhb[W[afmsumhlouyolha_cikmmrujccejnmifgr~|wsmcdtzmdhjghrxtmkmj`]_afga____cbZ`kgbdgkgbhkd_aa`_\UTWVOKNUY[clme_XPS^klaZZ\cmmdbhloqbRVfsi_gjdbb_agnvzskgYPZghgjtwvvqpsupmmlhacllhlvvosyshky{rmq|~wrurlq~zqkrutuwnnrsxlaagnnhkrtqla[csoekvzeeojeefhfdmtjhmr|~wsppronxwqnmox{km~cY`gUWotnaTZcnpncrjQK^qk\[aVOU]lwkYVXZXPQVRNNJB>BGJLHLRKMSPACOUXVRLEGMQVVTQOPTUOHGMU\a\UZ[QMRYWXblxo^aktv~|}~}zyulghhoxshgjkuyiXQT_iiibTS_edbfkppngaeqoceowtnv|tj\SXalx~y{znqvv||lddo~hjnmsv|{rxp_bpomuvs~z|ytx}z~~|x|}pqqsomzwszxsvrquwwuwpzvpz}pdfnuvrxuip|u~~Žü¾Žÿÿ~ytniigglu~{rljhfedddcbccddcddfintx{|{{z|~tqsz|zvrlga\[^fovz|yurnllpw{~zoe`]][\]`dioty}|ule_\[[]acjpy~tiffhnsutld_^agnw|ijg_RHFKUYWSMGHOX]_ZOGIMQSTWZXPGFNTVYZTR]eaZWY\\YUZbkh`caVZ`^\ZVW[adgfa^^agjmpqqnopokgddhmjbabdfd]ZZ_dggfgeehmsunb]]^`aejnolhgijga]^aeihikkkkllllqtqlhhijhdbdhlnnnnlnttpt}ujhhgfedbdhgeddgnodXY\`ipmgjqnb]aca]^cfcYPPV\cjoqomonhacfijorpmgabb``glljnunjhiihea_`ceb^]`b`]^_bbdimkghgd`^]^bcjpqld_cee_YYbikic[WY_glqsmijntyqmgaacfklntwkcccflkhdco|{wrninwtgejkhjwzrklpi`_bccb_^^^`c^Yglcadgfccgfa_``_\WSTUOIJQWW[fnkc[SNUcjf^XVZhqi_`hlpp_QWfricgjeddcdgmv{skgZR]hjjmvyxwrqsuqomlgbfnokmvwtuxqgmyxqnq{uqtsnr{|zokswuuwonqr~zlbahmmhkrspk`W^pndho{zgdlgbbdecblpedjr{zsommomnzyqmmq}|kp~i_biV[tyr_T_gotrjr_ONgre\]ZNMU]mwiWSW[ULQTOLMNF>AFFGHMQKKPOD@LWXZYLCDGLRTRQNRVWRIELUY`^VZ\PLU\YWbto`irxw~~z}~|vmjilvxoffklu|th]VU_hhibRQaifglknpue`cmh^fpwqkw|riYQYblxyzzruwv}{jdgqomnlty{{r{r]aqonwxsyzxx|{t|~}|w{|npwvso|xrzxpvwuv{{ywypnzzrhfouusvmp{u}ǾǾÿƾ¾ysmhffeks|{tmigedcbbaaabbbabcfinswz{zyxy||qoqw{xvrmha[Y\enswxxsonjjnvy|xnd_\\[[\`chntz}|umd^\ZZ\_binxuieegotvtnfbbdipy}gif\MGHMXZVQJFIRX]^XMGJMQSTWZWMEHOUWYWRS^e_ZVX[[XSZbje_cbX[`][XUUZ`bef_[[bgkoqonnopkeegilkc^`baba[Y[affgffefiowwl_[[]_afnqokggike]Z^befginokkjjknqpkikkiheadhjmmllmntwnkv|rifgikhcabgedcdhnocXZ^dknkflrk_^ee_[_dgbXPQV]elprpopojbehjnstqmhdccabfkllpspkijkifb^`cda]\`c`]`abbekmkghfc_^^`bbjppkc`cee^X[dkkic[WY_flqrlhilsxqle`abdkmqwujdecdfgecbjxzuqomtwnefkkjlwzrmorlcaaba`^\\^``Z`qm``cdb_dfa^^``^ZTRTRKGKSWX_hjc\VPNXdhbZVS]lof^_gkon]PWeokdfhdbdeeditytlg`V[gkkluzwvsoqtspnlgbhqrloxytuwpgn{vompzqpsppty|ynksvuuvonoq~zldbhnmhlrsoj`S\lidho|xefidbbcdaajne]hqwtmiikkknzyolmu|lv{lccjX_wxv]TdkowvsqYNPmsa[]WKNU]mugVPV\SJPRKINQJEEDEEIOPMKNOH@IUXZYMBBEJPQPOOUYYTIFKSW`_WY\PNW]]Ydyneowy}y}~zw~~||}~vmpmqyqkeejktyqkaWVahfhbRScihlplnq}|c`cie_grumjy|qhXR\elwxyzvyxvyhdjsrnpkt{{{t{r\crpoyvrwxzy}zq|}|}yz~osyxvs}ws}xpwzyz{}zz~mpzwsmhquuuwqt}~ǿǿ¿xqlgefeir{|tmieccba``__`a``abdglquxzyxwx{vnnqw{xuqlg`[Y[clrvwvrmljjouy{vlc^\[ZZ[_chntz}}vlc^[ZY[^`fmvwkeegouutohddfjry~egcWKFJQZ[UOHDIRZ]]VKHJLORUXZUKFIQUVXWSU`f_XWXZZVRYbha`ec]^a[ZVSTZ`bdd^Y[chmpqonnpofaelnle^]bc_\[YZ^dfffefefkt|vgZYZ\`flqolhfikia[Z_befimpqnkjjkppkfgjkjga_djnnmkjmswrimzyneeghkfbacedcbcjomaXZahlnjhmqf]`fd_[`hjbWQRV^glrsrqqpkchlnruurmhfeedegkmqttokkllid`_adfc_]`c_]`cddfkokijfa_^becdjppkc`bcd^X[dkkhb[WX_fkqrkfgks~vpjdba`cimrwvi`dccddbaaguzusqrurhdilmlpxzrmquneb```^\Z\_`]Zlyh\_aa^]cd^]^^^]VPPPKFFLRUZchd]XQJM[dd^VPVemg_\`fhlj[QWdlifffcacggcfsxrke`]ahkjkvysrpmouspnlhfltqlpzzsruqgp|umlozqoqpruw|zmltvsuvpnor~zjdbhonhlrsoh_SZhfdhnzyhegb^_ab`aimbZepqnhdegfio{xoloy|pzyqceo_dwvv[SckowxvnWNUxu\[]QIPU]lqcVOUZQHLNJHNQLLHBFEGNPMILPLBFRYYWNDBDIOPPQQVZ\VJHLRV`aYWZRTY_c\kqhszy~{y|}~|vw}{|}{|uqvqsxnhffijktysbVXcgefaTXfihlqlksxa`acccirohn{{rfXUahlxwz|}yyxgfov}rsmu}|}v|r^etpqzsqww|z|{rz{|~zv{{|zzxtxv~~}|~~umxywuqnrtw|zy|~ſĻüſþxqkfcddhpzzslgdbba`__^____^_`cfkpsvxwvuvzvlmou~{wuqmg`ZXZajquuspljiiouxz~}tja\ZZZZ[_chnsy}}wnd^[YXZ]_ekt~ymfegqwwwskffhmt{cd`UKHOW\ZTMFDIS\^[SJIJLNQVZ[SHFLSVUWUSWcg^WWXYXTQYcf_`geaa`YYURRY_acb\W[djpsqnllokdbhqqh\Y^bc_\YY[bhhfedeegnyuaXY[^djproieehhc]Y[adglqsrpolhhlqogcfikje\\dmrojhimrsifq{|tgbegjjeb`cccbadkoj^X\cjmmkknlc`ced`]`ilaVRTX`insttsspkeiortvvsmihgfffilntwsmlmnmha^_cffc_]`c__bdedgmplkkga_`ficdkqojdabde\X\ekkgb]XW^ejrskeejr|}toidcbbbhlrwvfY`b`acb_`gtzussrqlefknmosz{rnqvpgc^^^\[X[__\fxsa[_`_]]a`Z\]\\XROPLECHNQW[cf^ZWMGP^c_WPQ\ika[\_bejfYQVchgggfc_cihbdrwqjda`djkikvsknmjnuroomjkqupms}{rptqhp{tljlz~onppsvw{ymmuvsturonryiedhppjmrsoi_TZdddhlxyide_[[``^`hl^Xdllidbccdho{woko{|tzyxsbhs`iwvtYTcjqwutnYP]u[][LJQU^loaTPUVMHIJHIOPNOHBHEENRLJLPNDBNYWUQIDDIMORSRV\_YLKMPU`f[UYZ[\agatrlw|wzzzz|ztu|y||zz~vtzvutjfggiheuxbW_gfceaW[fiilrljuua_^`cfmsjes{qcY\ehm|vy~|}vgisxwxpv}z}r_hwqt}poxw}{|{uyz|y~~yu~}uozyuwtsusz~}{ſſ¿ùyqjeaccfnx~yrkfca`_^]^^^_^^]]_cfimruvusstytjknt|yuspkf`ZXX_iossqojhfhntxy}}si`\ZYYY[_bhnsx|~yoe^[YWY\^bir|{ohffpwyywphglqw}ba]VMMV\^ZSLFCJU^^XRLLMLLPV\]RGHOSSSUUV\ecZUVXYWSRZcd_elhc`]YWSPR[_`a`\Z]djopnmkljeaelqkaYY_b`^]\]_dhhfdccdjtp\W\^fknppmjgcbc`\Z\afmsvupnnmgelqldaeijhbZ[fprmgfjnoldgu}|pb`fhhgdb`accbcfknh]Z_dilmlmoibbded`]cmm`XWVZbkpvwuutokhlsvtvwtnjihhghkorvxqknoome^_bdhfe_]`c_`efedgmolkkhaaciidfmqohdacde^Z^ekkhd_ZX]cirskeehr|{uqicddbdjprutiZ^a__a`]_gtyusssphbgmnmptz{trvxpib[Z[[ZW\_[]vk]Z]^]]^]YX]_]ZTNNOG@CJNRW]bb[VSKHUbc[RNSblh]Z[^`cidWQV`cdfffb^cigbeqtoidbbejjgktmfjjhmuqnnmjnsuqot}zrospjqzsjimzxklnptuv{xmmssstsqpouwigfhppkossokaTZccdfjvxkdc^XX^_\_jhYWejie`^__bhnwslip{|wwtxvdjvhmxvoWVaiqunmr\Sir[^WKMRU^km_RRUTKFGGGIOPNQIFJEEOTMLMPOF@IYXXUOEFJLRXXUV\aZNMORWemZS\_cbeih~~sq{}xzzxx|yqs{x{zxz|vy~xuofdimkfdyze^fhdbheY]fiilrlivq`_]`eiooghvra]ehhs}vy~uhmxy}ux~raj|uv}onzy~|}}vy{|{x{w}yxy{ztv~|xſ÷û|rjd`abdlu}~}wqidb_^^\\\\]]]\\[]aehlpsttrqrxrjimszyurokf`[VX^gnrrpmihegntwy|~{qh_[ZYXXZ^ciosx|~}zqd][XWY[]bhq{{qjgfpxz{yrjgmrw~b`]XOPX^_YRJDCJW^^WQNNOMKPW^^PHJQSQQTV\ce]VTUXVUST[ba_klhd`\YVSOR[_`_]\\_cjpnlkkkib_gpme[WY^`^]\[_bejhedbadmxjWV^clopqoljga_a`][]cjptronomiefmof``cgjf_\`murjfgkonhely~xi^bhiebaa`_aacehlle\[bgjlmmmle`bcdd`^grk_ZZ[_emsyxuvtokkpvxwxxuokkkkjjmrtvwqmopqnd]aefige__bd^]eifdilolklh_agkiejoqmecaaef_\^fkjieb\Y]ciptmecgr|{wthaefbdpvrrtj[\`_^_^[^dqxvsppmd_gonmqw{|wx|yrjcXWYZYW]^Xci][\\\]]YVZ^_\VQMMKC?DJNRW_b^VRNHJYa^WONXfjbXWZ]^agbUPV^abcdea^cihbeorngbbcgkidirkehhilpollllpssoru{woospmqwrhem|vjkmptsv|xnnrrrrrrqpzvjhgjqpmqsrpocTXcddgjtxlc`[UTZ[ZakeWXeheb][Z\`hksoggp{~}xurzvfl{pnxudWYahqujfvdWum\^TJQTT^kj\TVUPIBCFGHMQQRONKEEPWOPOPPI?FWXYXTKGIMX`^ZVZb]QQTY[js]R[fojgjo|ss|~u{yyvxyworyv{~ww{|{u}yphdenrmeh{igmkc`jh\_fijlqkhyoa_\`flpmfkzs`cnjj~zwy}vjq|{zy~~scmyw}om~|{~xw~{{}~sw|v|Ĺ¾Žÿļukd_``bjrz|~|vohc`^\\[\[[\\[[ZZ[_cgkorrspopv~phgkrzytqokg`[WX^ekoonlihefmtwx{}~zph`[YYYY[_djosx{~~zrg_ZXVWY\`foz}skhgnwz}{vnlotydca[TU[_^YPHCDKX^]UQPPPNKOYa]PJMSQOPSZ`ecZTRTVTRRTZ^_cpmgd`YWURPT]_^\[[\`cjomjjjjg`aimg_XWZ\^^]\\_bgjhdb`bhp{~dWZbgmmopnjieacb_[]ahoqonnpqlecioka]^bgie_]htvqifhknjdfo{~ra[bjhb_`a`_`acfhlkc\]chklmnnicbbcdd`_jod][\^biptzyvvsnklptwyywsnkmmlkloruwupmopoja]bfgigd__bd^^gigdimmmknf^bjligkqqkcdb`gha]_hklhfd_[]biptngcerz|yug`fhbesxposj[[bb^]][^dovvsolf_ajonnsy|}y{yrmeXUXZYX][Zrzc]\ZZ[]\UU\^\XROLIE@@EJORY__ZSOJEM[`ZQLP^ie[RTY\]`d^TOT]_^_bd_\ahf_dnqld_`bgjhcfplcegilmmkjklpsqmpx|tnnrpopumacq}|qjkkotsu|xoopqssrsrs}skigkrqnqssrpdSVbeeghqwla^YSQWYZckdVXdea^[XWZ`hgnmfenz~}wrrzxiosmxtaW[`fmqifwn`zna^TMTXW_khYWXTOHABEGHMQRTTXOFJT[UUTRQOCCSW[\[PGHQ`jf_VYecXZ\`amv`Saptlimt{us|~rwwx}vvvsnrwu|zrv{{wwjeehsvlgs~omtlabig`bgikmqhhymb^\bhpqhcn}ubgslmyx{{ulr~}|{|thp{y~ok~|xw{~yy|wy÷źþɾ¿¼ý¿~}~~~}~~~~ymd^^^ahpw{~|vohc_\[[ZZZZZ[[ZZZ[^bfjnqrqoopv{oggipx~yspnjfa[WW\chlnmlhgdfltwwy|~}wof_\YYYZ[_ejoswz~}ysg_[WUUWZ]dny~tmiipy|yrptx}eec_Z[^_^XPGBEMY_\USSRRNKQ[a]RLQTOMOU]ceaYTSTUSPRSX\akwohf`VUSPRV[][Z[\\_ejkjghjhc_dihaZVWZ\^_^]^aegjhb^_djryb\bfjklopnjebdfb]Z_imoolnrspieglle^^`dggfbdotplhghkkgbhs{zm^Zcie`_^`_`aacgjkib]]dijkmonfbbcbdd`bljb__`afkptzzxurmmprsty{uomknmljlptvwsnmoolg_\cfhigfaabc_bghgfilnmmnd`eklkjnqoiefdaghc_ajmljgfd_\`gnsnhbcqz}ztgbgjhisvnmsk]Zce`\[Zaemtwtpkb_elonns{~}}zrphYUY[[[\Ya~o^[YYY\^XRV]]ZTMKHC@@BFKQUZ^[VOKFFQ]]TMMWdhaUNSZ]\]a[QNSZ\[]`a^[_ed^cnpg_]_cfhebhpi_afgikkjikmpqolpwxqlnpomosi`hv{wnhjlorqv|wopqquursuz}qljjnsqpqrrtqbVYbeeffoum`[VQPTXYcjbVZca]\YTUYbgejifgmx|spqyxnutmxr`[_aejkdfwyj{~mcaWOUZY`jfZVUPPJACHLMLRUV[dQHQ\aZZYUX]NFQY`ccWHJVhsneYZjibcddeq|gYhstmjnx|wvt}|nu|vu~|ussqnrtt|tnw{{{whfinwwon{spwmbdigeegikmohiyma\]dktncduwelxoqyz|y~unq~~~||zvls|{~ol}{zy~~|}}wuż¹õ~|{|}~|}}~~}}}}ne]]\_fnu{~{vohc^[[ZXXXXYZYYXXZ]`djnpqpnmowzogfgnv~{spmifa\XX[bfjllkhgdelswwyz}~|vme_[YYZ[\`fkoswz}}ysh`[WUUWX[dmy~uokms{~ztsv{hgda\[`a^VNFCHPZ_[VUTSRNKR\`]RMSSNLNU^ce_XTSTVSOPRW[gt{ohf_VTQOSVZ[YZ[\\_ejjfdfhgc`fie^WUX[]]__^_bfgif^[_ektvb^ehiikoqnjc_efa\^airnmlnqqnheimi_[^aeffffkrrlgghiiihglu{ue[_efc^]]^^`acfjjhea^_fjjkmojdbbcbed`dlhdbbbejkouyzyupmnqsrryztmllnnljlrvwtqnooole]\cghjhfaabb_ciihgilnmpncagkllkoqnhfhgfijdadknlkggg`\^fmrnibaqz}zugbgkmmtvmkqk_Ychb^ZZafmtwtpib`glnmnt{~~yrqjZVZ[\^ZXo|f[VUWZ][SRX[[WPIFC?>?BFKQW[\YTMFBJW]VNMR]ebZOLU]]Z[]WMMSXZZ[]`]Z]bb]cnnd[[^befcbjof]`dggghiikopolkqusmkmnmlmmebnwwrkgikmppw}unppouwssw{plkkosqrrrruqbVZcffddmum`YSPPPTZcf`X]c_[YURSZegafgfilwznnqxxrzpltm`accehe^dvqx|mdf\QX\[`gb[VNMPJAGQSPLRZZajUNZdfa`_^ch[MT`fik_NM]pzuk__mkiiiiisrdnvtolo|{tvw~xktyss|{ropomoqs}~ply{{~whhmtzzxyrrxpdejiihhilnngjym``dhowlaizyjp{stz{~x~}vnq}}}|{xqv}|qm}z{{||w|~xvŸù»¿~||{{}|z{|}~}}~~{|rf]]\^emu{}zvoha\[ZYWWWXXXXWVWY[^dilopommowynfefnv}{uqmhe`ZWXZ`fikljfedeksvvxy|~}ztle_\ZZ[[^bgkqsvz|~}yrh`\XUUTWZblxwronu}{vuy}jjfb\\`a]ULDFLS\`[XWWTQMJS]b^RNTSNLOW^cb]WTSTURNORX_mxymge]VTPNSX[ZYZ[[\_eghedehfabihaYUWY[\]^^^_bfhhb[[agmyr`^dghilpplhb`dd^\afjnllopnmkhgmod[\^afhffjorngefgggggjpuyq`[afe`\]]]_`behigba__bfijknmhdbbcbca_flhedccgkkouyzyuolnqqqsxyqlklmnjhkruwsnnmmmgb\\cgijheaaba_diihghknorlbcgjllmqrmgfhijijdaeknmkiih`[`flpnibaoy|ytidimnpttnlmjaZdkf`\Yaiostqpkcbfhklmrz~~~wssl]W\^^^W\}wbXUTW\\UPTYXWTMFB><<>BFKQX\[WQJEDMYZRLOW`c_TJOY_[XZZRKLRWXXZ]`\Y]a_]dmlbZZ\addaajne]_bceffghjnpmikpspjjlmkiljcdpwumggjkmnoy~sjnqouwrszzplkkourrqqsuqbY^efgcdmum`XQNMMRZcd_[^a]YUQNQ\fc_dffjkv~slmqwxt{{kjoldhefff`\dr}wvxjcjbU`_]afb]SFLRLAM]YRNP[`fkZYhliigihkoeV]jlmogSSfw~zpfgllmmnmmsymsutqmn|yuxy|thrxqqzyokmnlnos~{lk|{z}{~xjlty}{|{ou~sffkjkjjjlonhly{mchmkqxmcm}{ls|uu|}w|{xpr~~}}}|{sw~tm~y}}{y}q~}|~|{ķǼȾŻ}zxyz{}~|z{{}~||}||xxwj^]Z]dmuz|zuof`\ZXWVVWWWWVUVVWY\agkmmmkkovwleeelv|{uplhf`ZVUX_eijjhdcbdjrvvyyz|~~}}xtle^\[Z\^_dhmqsvx{~~|xskb]YVUTVYblwysrrx~{y}lkha]^`a]TKEHNV_a]ZYZVPLKT_c^TPTSNNQY^b`[WTRSSQPORYdsxsifd]WTPKT[`Z[Z]\\afeddefgfbcie]XVWY[[]`_^`chig^X\chpl^]cfghmqojfacfb[\fjkkklppmkjijmj^W\`cghgioqnieddeedeglrvvl`]aec\Z]]]^`dfhhe`]\^aeijkljfdcbcca]_hmheeefikkovxywtplorpotyvnjikmmhfjswvqllkhhd^[]dgiigd```aafijhhijmprkdegiknosrmgegikklfcgmpomklj`[`fjonibcnv|xqjfkpuwuspnkic[dnjb]Zckorrqrndbddilkox|~wrrl_X^cb]XgscVSTX\[RQXXUSPJD@<;<@CFKQY[WQKFDFOXVOKQ[a_WNIQ[^YUXXQKMQTUUW[]ZW\`^[dmj^VWZ_ba_akmd\]__addefinohglpqkfhllhfhc_grtpjffhlmkm{rhjprvwrvwokjkpwttqqtvpcbcfghccnsk_VQLLKOYab^\]]ZVSOKR`f^]defkju{mhlpvvv{vhjkkjlejhf^Ybp{ztreblh[dbacff^LANUPFUj_VQM[gkldflpqonorsto`alqstk[]o}{rklmopqqqrwyqttsson|xuxyzpeq~}tnow}wmhjkklnt}xil~zxvv~~|}ymqx}~|}vnzvgfklmmlkmqnjo{~ynfnrnsznfr~|qvzux}x{x|}ps~}}|~~}ux~wpz~~~zx}k|||}ƾ̾øǼywvwxxy|||~zxxy{~|{|||zyvv|~pa]Z[bkvz{yuof_\ZXWUUUUWVUSTUWY[`ejkkkijnvwleeelu{|uplhe`YTRX`dghjhdbadjruvxy{|}}{zwskd_]\]^_aeimpsvwz}}~}xrne^ZWUUTX`kv~|utw}ljhb^`ed\QIFKT[cd`Z]]UOKLVbc\TRTRMNSZ`a_YVTRRQOPQSYfvwpgdb\WSPOV[\\[\]\\beecbdeedddfc[XWXXYY\a`^`fihc[X]dirzd[\bfghmomhc`cf`Z_ikghkqrojijklkaYW\aeghkpsoiheabdcbdhmsvpf_^bb]WX[[\^bfhgfc^[[]bhkkjjifcbbcc`]ajmhedfhjlkpxxwwsmkprnovyrkihikkgejsxwokmkfdd]Z_dgihfc``_`agjjihiilpokdfhhknptslgefikllfejopponolb]bginojbenv|vojhls{|vqspkhc]dnke_Zbkprqpqlebacikimuz~~vrpj_Zaif[_v~o_TRUY\XQSXVRPLFB><:<@DFJPXYRKEDEIQVSNNT]`ZOIJS]\VSTUPMMNQSSVX[UT[_\[engXQSV\__]bkj_Z\\\^acddiokehmpogdfkjecd^]jspmjedhlmhm~rfflrvurv~tljjlrxuuqntvjbhgcfhceprh]XOJLGMX`^]^]ZVSQLJTbc[[ddfkjsvifkottwwpeggilmejje]W`pzzqmdbjh]cdbdef^ICQWXRatdYQN`mlnmmmsxuqrvwyvidmtusndhw{tpoosuutuux{xtusswpo|~wtvwwldo{ypjlv|siegijkmu|tfmxsst}{{|~zqu||{}sqyhelmooomospmt}}wolsuruyniu~vxywy~xz~wyqt~~|~w{zt|z~|~~xw|}gz}|{{~~ƺɿ½~xvuwxwwzzz}xvvxz~}zyz{|{yvtw~uf]ZZakvz|zunf_[XVUSTTUUTTSTVWY[`dhijihilt}vledejsz}voigd^XTPV^cghhgdbaciqtuxy{{||{yvrkda^^^`acfjmortvy|}~}ytof_ZWUUUYaku~xwyljhdaegbXMFHPY`iid]_]UMKNXbb[SRSPLMS\``^XUTRQPPPQT[huvnfc`\XTORWZ\[Y[[Z\bca`_bcdbccda\YWWWVV[a`^`bfc]X\aejun[W\aehjmnjd`acd_\bhhfgkqrmgfjmkcZWY^begintulfhc]_aabdhmttjb__b_WTWY[\_dhieb^ZXY\cjmmkiieccdda_`fklifegiknmryywuoiinnkpwxpiffehidcjtxuokljeb`[Z_efggeb__^^agjjihhhlpmifhhgimotungefhkklfekooppqrne_dijoqlcfnx|tmlhlw~tquphgb]fnkgc[_irspmmlfa^`ghgjpw{uroj__hmc^lykZQSVYZURVXSOMGC@><;=@CGLRXUNHCCFLQROKNYa^TICHW^XQQRQOMLLNPSTWXRRZ^[\flcTOQUZ][ZdlfZWZ[Z\`abbjniehnnkebejg`__[_mpljhddilkfmocbkrtrqx{qjihmuxutnmutc`ljaeieipmb]XNLJELX]Y[^\VSRNGJXdaZ\ccejlrqfejnprsokbcbhmmejle\Xaqwvkhfdge]cddegf\OPUYd`fykVN[jnmprpmt}wsuz{|zqlrwyuqmt~~zusrtyyvtvwuvwxwstysp|wsuutibmxulgjuyoeadhhhku{pfqtpqt}}xx{{~}w{{x~~vpt{hcnqooqoosrpw|tqry{wvwolv~zzyyzzy}}{vwtu~|~v|}vx{~||uuzydy~|}|zzxxzzŹʿ¹¿¾½}wttuvvvy~yy|vttvz~{yyz{|ywrqrxzla\[akuy|zuof_[WVTSSSSSSRRSUWY\^dhiiihhls{ukddekrz|wqhec]XTPT\bfhhfdc`agosuxy{||{{xvqjea__`adegiknpsuwz{~|yupg`[VUWX\dmv~|y{ljheegf\RKGKV^elld[`]TOMQ[db[SRQOKMS\`^[TSQRRQPPRU^jwvmeb`\ZSMPY_[VX\[Y^dc_\]bcdbbba_[XUUTSU[`_^^`b`ZX^bgmzy`TV\adfilmha_ced]_fgdehmqqjeeijeZVXY_cehlpsphfh`Z]`aacgovqe__`b\SSWY\_bgjib]YWWX]cioojhheccdd`^dkmljhgikmnpuzywtkfillkpwwphfeceebajvwsmjjhc`^ZZaffedb`^^]^bgkjihgglpkihjhfimotvnfefhkklgeknppprsnhbdjjormdhpz|sklinz~ttyofgdagnmie^^gruokkkfa]^ehfgmuyspmicdklegw~|viVNTX[XTTWUPLIEBB?<<>BCGMTWRKFCCGLQPMLPZ_YOFBK[^RMOPPOLLKKNRSUURRX\Z\gj_RNNSY[YZdjbYUWVWZ^aaekmfcinojc_cgd^\\\clljiebdkmicp}kaajqqrryyoheelvxtqlmuo`boj`ehekof[ZVOLHEMX[VY[YTSQLEJ\f`Y\dbejlplbbhlnqnig^]_hmjekld[Xdtvpghiffc_cdfghgb^]W\medyrXTfsnmpsplt|xvy{||{wruz{xuv{}yvuvw|zvtvwtvy{xsv{tp|usttrgalvsjdhsvla_cgeelxxift}qops{~}zuv{y{~|~wvysor}}fcrtppsqpssryzqrv~xtuqow{zyz{~~xzzywxwx~~~uz~wt}}~~zrryuaxyx{zxwvvxwǽĺſÿ{uttuvvux~}ww~{ussuz}|~{xwxyyytpoos|re^]ajuz}{uof_YVTSQQQQQQPQQSVZ\^bfhiihhlr{~ukccdjr{~wqicb]XTPT\aeggfba``dmqsxy{|}|{xtpkebabbdfgghjloqtwyz{zxuphb]WWZ[_gpx}~~~jigghgdZPLJQ\cjomdY_^VPNS_ebZSRQMLOU\`\YTTTUTSPQSX`mxvkeba^ZSLT^_XTX^[Y^da]Z]abcba`_][WUSQQT[_^]]^`]ZX_chqoXRX\acegijg__deb^afdbdhnqmd`eje_XWXY^cgmqroidfg^X[_`adhnsnb^ab`XRSUY]`dijf_ZVUW\`ejoojgfeccdc__dkmlihghlooquyxwrjfhkllrxwphgdbcdaakwvqkiigc`^[\bedc``]\\[]bgkjggfglpkhhjhfimosvnfdfhjklgcioppqrsojefhjprmcisy{qkljp~{rw}odedfgmnmib_eqwrjhif`]`ffcelsxqnjhffjllu|}{ugQNX\[WTVVSOJFDDD@;:?BCFNVWQIECCGNPOMNU[[RGADQ\ZOKNPPNLIHINQRRSPQWZZ^fg[OLMRWXW\ff_XUTSSW\_bfmlfehnkfb`bc`^][^gkjhgc`dkmgduva\ainooqx~}xmdbemvxrlhltm`eojaegemm`WXVPMFDNXYUUWWTSQJDK^f_Y^faejkoi\ahknnjdb[Y]glgdklcZYfvsjfkkfca`adfihnrkc\cnfewsa_ntnlptokszxxz|||{wux||zxy}|yxwxy}zttwwtw{|wuxztp}~tttsqe_ktqidhqrh^^cfbbnxpchu}zoomq{zxxtuzvv~qv|supp{{igstrrsrortt{vnt|xstssz~zzxyzzzxxxy~z|~}~uz~wr|~~|xoow~~t`uvvz}xusstvv~~}~}»Ƚ¾¾ÿ¾xssstuuuyztv}ztrqtz~zz}~zvtuuwwtollouvia_aiuz}|vog`YURQOPPPPPPOQTWZ\^adghhfgjpx}tjcbdjq{xphba\XTQSY_ceed`__^aimqwxz|||zxtojecbbdegghijkmptvyz{{xvrke`ZZ\^birz~~iiiiifaZSQOWaglokc\][TOOXdfbYSRPNOSW[^[ZXYWWUTQQTZcowsjfdb^XQP[`^WUX\ZY_b_\Z]`ab``_]\YTRPNQV[]\[[\][YY`eku~fTSY]`abehgc_`dda_adbbdhmnh]\eh_YXXYY]dksvogcdgcZX[]^`cimph__bc]URRTZ^afihb[YVUY_dhlpnifeccddb``elnkhhfhmpqsvvutpifhjlmrwungfdbaaaakwwpihheba^\\bfdb^][ZZ[^afigdfggkmjhjkgehlosuoedfgijkfbhopqrstqjgfgiqtkekuyxojklsyrymbddehlnome`drysjhif^\`efbejpxolihffjmox|~scOQ_`[YXURPLHDDGE>9;@BDHRWSKECCCGNPLLRY[WNBHWXQIHLMMLHFEINPOPROPVYZ_fcRHJLRVUXah`TQQPMNSVZdfgecehkfa_^^]\ZXZbjihid]]emiaj|~jWV_hkkmpyxzuf^`hqwrlfckqhaikgcefjoiXRURSPHJSXTPQRQRSPDEYh_XYbfbfjjg]WZ`flh`^\WX^ghbcjia[\goliiplc^dheagsvyursnlljntsrssomossrrqtxxyz{zyxux}}xtw{sv|yxz{ttwwtw{xw{zxtx|stsqna_lqkdbipj_Y]`^Zbppbamt{shhgoxplusnsqrx}vv~{lryppyxupottsrsqnqux|zno~{vsuwy~~{{zwz{vz}}~||}{|v|yuz~~~{wlip}{y}u_ptu~|wqpolnux~vy|s{{v|Ľſ|toopssttyvqtzztpnqw~~xwz||wrqqruurnjjjlsreabjtz~}xogaYSQPOMMMMMNNOSX\__acceeeehov}{ribabir}zphb_[WUSSX]`acb_^][^chosvz{}}|ytokfddddfghhijkmortwyz{zytojd_^`aemu}iikkhd^ZXX[ahmmlic_\XRLRajhaYTSPPSWX[\[[\\ZYVTTRU]gqvpihfbZQNV^`]VVXYYZ``]Z[]__`^[Z[XTPMLMQVYYWYYYYXX[bhpyxdROTZ__^^bgd__bdb``aa`behki_[`c^SUXYY[_fnsri`_dd]XXZ[[_fkke^_bb^XROPSX^dfea[USTVZahjlmhdcdefedcacilkihhgimrrssssrlgghghmsuqiefea\\\]essjefea`_]\^bdc`ZXXXYZ\`ee^_deehjhhjjfdgkmuwodcefghieagpppqrsrlgedgpriekrtqkhjmtxu{k`dddhlprpjges|vnjkhfbdfcbhkl}wpmhfffknnt|{}tfNXea\_`VMLGDEGHB:;?ACHPXVMC>=CIKLLJMTWPG?9>BCIQXZTI?;?HLKJJMRVPD==GPROMH??HMIDACGIHGKPNLPTW[a_VOMLLRVW_fbVMJIHJMSZadcabdhhc][[YWVWUY`egggd\W_kkacqvfWPS[eiilq{~ytzyfZ[cimmidbdfcaadhigfejpgTKPV`YRRRRQPQMKPPMDMkoYO\jjbhhf_URV^bb]ZZZVadbccfgfc\]dkotvmehmmifep}usqkikosqq|yrooptttstxytuyyytqrv|{tq{zpqy|xwywustssrqqtz}zruwqsrqlfmslbbhlh^VVWTU_ki\Ycko}ofc`fpobaihikippkzrdlskiqqhhorqnggpqimzzkl}}{{usrv}~}}{wwx{|yy~y~}~w|}ryu{zz~xu{xmimswywsv|zgo{tzysligglsvqqrw{s}{z¼ľ¿wolnoqrrrw~voos||sonpuy}~zxz||truwz}~{zuonnoqqnjfdedjtrjhow|}}yrjc[UPMLKJIJJKLOTY^abcbbbbcbcipw|ypg``dkt~zpjd`ZTRPQUZ[]^^^\\\`cflquy{}~~{vplhgfghiihhiijmnpswxwwxwusnlihjnt{psnecbdc_aforqmkif`\YXZelmf_\\]\YXY[`da[VWYZYY]`aeimooolcYQLNVX[ZZYYZ\_a_\[\_aa_[YY[UOLLMRUUSQQSTTTUV[ftylUJKMSZ\YWZ]]Z[__`bb`^_aaa_\YYZ[WNMRWXZ_jrrld^_cc[UUVWX]dhi_XZ`b]VUOJNW_cb^WSSSU^ddgjheccbbbcccccegfggfdehkmoonmlkjgbbbaflpokfefaYUVZ`hmid``_\YZ\]]__^\WUSSTY]a`][]``afhfeikd_`cksqfabeca`cb_foqpnnqsogbaejhcglnmkhgims|yvu|wg`bbejnqwskoquzxuqokidimjkmjo~sqnhihhkjmz~tpohmpgbda\WNLNQQJ<9AEGMTYXOD;:?IMKHIOUSJ?:@KPPPLB:?HKGA@CHHEEKPMMPTX\^XRQOLLSVXag`SJGFGIMT[cc__befe`\[\WSWXRVehegf_YZ`gfafsr`TORZbgijr||utws`V[ejlkf``dca`adggedblrfPGNXc`URRSRQOIIMNLGRhlYP_njbijf_SRV^a^[[Z[Yec`ddfhfa\`fmqvvkdkqnehjtyuuqjimqtsvxrropvtssuzxqsyzwpmpv|woqtmtz{wuuuppqrpooptz{wpysprrqnksvkacjleZUTSSYcjbWYdio}{jcbagng]agffggv{fh}jdnngiokdiprpjcgpldl{uis{xzqqv}|~||xw{{{yyz}}vy|s~yv{xx~wt{xollqtwwttz|npxt||wqjedelssnqty||vz|üÿ¾wnlnpqsrqv|wonry|tnlosw{}}|yy{}|truwy{}~}y|ztnmmnppnjdcbbgq{xolry}}}yrkc[UOLLJIIHIJLOTZ^acdccaaaachou{ypf``fmt~|qjf`ZURPPTX[]^]]]\\_aekpuy{}~}xrmiihijkigggjlnoqtwxwwvvttrpmlnqxrsjbcdffcejprqnmkg`\\\`hllea_`a^[Z[_cb]YWY\\[\`dcbjnnoqlcZRLPVWYYZ[[\]_b`\\^_aa`\ZZYTNLMPTUSPPQQRSSTW`lxr`OJKNUZYUUX\ZX[]\_bb`^_ab_][YWXYRLNSVX\cnsqi^Z_a]XUTTVYafge[W\``\VUMHPZ_ba[TQQT]dggghfccbbbbccbcdfgghfeddhlmnnlkkifcaaaaelnlgdff^USVZahjgc_]\[ZZ[]]]\\[WSQQUY^`^[Z\_`aefdcgjc^_ajrodadb_]]ab`doplmnqohc_`dgedhlligfhilqzxtu|teabdeknqwrlrtuwyurqqjdinlkmkq{qrngihhkho{qooforhcda^\QNPSSH>=BIMSXZWK@9:BHIIHJPUPD<:@INLLH=68@GGB>>CGFBDLOMNPTZ][TQQNJNTUZbdZMGDACHQY]^ZU[efb\XYYWTSTPP]gdaeeZRUceaajqeRLNSZ`egjrxwrrthVU`gfda^[\^^\[]`ffcbfpm[NLQZecYUUVXUOGEOMHQ\di\ThoihnkdYSRY_a`]]^]bdabhdjmdY[chow{ofkrridjqzwwykimqts~|tststvtssvxtotxwpgiqxxmhr|wmlsusqpqpmnomkjlosutop}toqqqrtuvrheinj`WRQRZdgbWW_dhpxna__`eeZW`c_]br|e^q|lbnpedhd^botmd`egc\dxwgpsxyopz|y{{zx|{~~wvwr~}yuzuw{utzxopollqxwtw||tstu~zupibagquqlq}}y~~÷ƺļ¿Ŀ}}~umlnqrsrprwzpknu|}tnjjotxzzzxy{}|rqrtwyzzytv|ztnllllmjgc`^]`hpxzvx{}~|xskd\UNKJGFFFGHJNU[`bdeedca_]_dkqx}}xnhcbfnv}|voic[TQNOSWY\^]]]]]`bdjouy{~~zsojjjjkmlhfgilqtuwz|{zyxxyxyyxz~|{}rnfdghjjjmqqommnkebadgjnomigffeb``bcc^YVX_ccb`a`_itqpmlhaXSMRZ[\[]^^^_bb`^^___^]_ab]UPPSWVPMMOOOPPPU_jsqaPJKNPSTTSTVVVUW[^___^`a^YVWWTQRPLMPTVYbgoqmbTU^[TUWSRVZbd`]Y\a`\XTRMLS[^\WQOSV_gklhd_^adddca^]_`babeffdbceikkiihhfb_]^__dkmjcaffYOOSX_efc_[ZZZZZ\]ZXYZYUNMOW]``YTTY^]\bi`^cfaZZamqh_ad`YXZ`backlhhkome_^`bcbchjgdbdjljlruquypb`acejnppkjqposvrrwukejoqonkxxprnihghhixrjqpfoskfefidYUUWREEKLPVZ\ZPC<;?CFFEHLNKC>AFLNLH@759?DD?<>DGB@EMOMNQV\\YTRQKJNSUZa`VKD??CKU\]YUT]eaZVVYYTQRQNR_daacaWQVac`aik_OLNTZ_cfjrwspppbQUchda][Z[\\ZYY_edbclpiWSSU[g]WZ[]]TPHENNNV]cjcZjrmlqlcXTT[acba_baddafkeln`\`eiouwkeltqhfls}wvvnlqtv{wuuvuvwtrsuusptwvmehqurjhrwrklpooonmkkmnkigiorrnlr|yopqppswywoihlni^SNPU`ji_Y[aehpth^^__b_TV`a[Ybwr]_uxddtpddd_]eopf`aed]\kwjewrxtlt}~|{z~}{x{}~~~xxts}{wsysv~zuuzxopomikvzuuxyurrwytqjb`jsuqnpz}{}øɾĽ|z{~}tmlnrttsqqu|rlmrx~vpkjnswzzyyy{|}{roqtvwxxwrtxztnkkklmjfa_][\blu{~}||~~|xsld]UNLIGEEFGGJNU[`bcdedca_\]djqv{~{wnhcbgpv|~xqke\TPMOSVX[^]]]^^aceinty|~~{vqlkkklmliggilquwy|}||{zzz{{|~}yx|pkeegjlmnqsqmlmolebdhlmqqmkjhhgdddddb\XX[affe`abfntrpmjf_XTPU[\]]]^^_`bb`_^`_]\\_dd]TRXZ[VNJLNOOPNPWbpsjXMJKOQRRQSTUUTSW\__]]_aa\VTTTROONKMQTVYclolg^TUZVQUXRQX_daZXZ_daZWSPNPV\]WSPOT\ejlje^[]beedc^\\\]^_adfecabehhhgffhe`][]^^bhihccfbVMMQV^dea]ZXZ[[\]^ZVWZYTMLOW^`\URTY][Xaj^[be_YX`npe\`d^VVY_aabjjhgjomd_^_abbcgiea`dikjkptpuwnb_aceinpnijqonrurs{viejorqnk|woqnighihkohsqforlgehjg]XWXQFKTUX[_`XJ>:=ACFFDHMNH@>BJNMJD;46;@DB>=@DD@?FNNLORW^]XTRQKJOSV[`]TJA<=DPZ^ZTQU^b[USRYVPOQOLS_`_ac^UQW_`^agfZLJNTZ_bfjquqnnk\NUdfb_ZVXY[[ZXV^ec`coqcU[\X`gUT\]b`TQHEMNR\`flfaltposlcZVX^bdcbbceddbimhmj]_hhiqtqigntohhnvwvupnsxyztywvwvxtrssssprwtkdhrtnghrtnjlmmmklkfhnnjfcgormikszsmqqoruy|vnklmoi\PMRZgnhcabddjqpbZ]^_`ZQV_\UYh{~eVdwpamwkbb_\ailha^__^[crn_onrunqz~~{}~|~z||wz~{~}}xzqs}|upwru|yuv{wnpomijuyuuvvuqpxytrlbblvvrosy~~|||ĺ¿ſý¿~{z|~}|slknqstsppt~|rklpu}{tmjmqvyyyyzz{}|soprtvwwupqt|{rljiijjhd`^\YZ`hry}~~~|xsld]UNKIGEEEFHIMTZ_bcdeeda^[\binuz}~yunhccipwz{slf]SOLMQUX[]]^]^_bcfkpuz|~~|wqlkjjklkjhfhlrvx{~~}}|{z|}~|wvzkhggikmopstpllmokebekoprqmljjihfeeee`[XY]dhhe`ahlnsqnljf]XTTW]]^]]]^_`bb``_`_^]_egbZRU]^\TKJNPQPONSYdonaRJJKOQQQQRTTTRRX]`^\\_`_YUSRSQONLKOQSVZenmicYTUUQOUWQQZ`a]VW\`d`XURQOQW[ZTQONVahkigaZY_efddb\YZZ[Z\`cdcaabefeefgfgc^\[[]^bggdbcf_QJLPT\bc_\ZYZ[[[]\YVXZWRLLOW^^WRRSX[XW_i]Z`e^WX`nob[ad\TTX^``bggfeiojb^]]_`adgfb_^bikiinpputlb_abdhmplghpmnqsqu}vhfjpvqlk}wnomhhikjo~nhtqhnplgfijg_YYYVPUZWVZ`^OC=;?BCFFFIMMG@@FKNKE>627>CEA=>ACA>@GMLLOSZ`\WRPPLKNSV[_[QF?:=GS]\VRQW_^UQPTXTONONMU^\^a`[SPW^_^afdUIINT[_afmrsnjjeWOXeea^XTXZYYXVV^dc_dqqbYaf]gfOS__dbSQJGNPT_emoggoumpskc^Y^bddcbbeefddjmmmc]bjhjqqlhiornkkrx}wxvppx~}xv|xvxxwsqrsstnnuribjstichrrlklkkjihgdhmlhdbgmmhgjsunmqpoqv|}vompqohZPNS`nnhiigcekok\W[]^]VOV]XS\orZUlwhfvtc^_\^ekid`\\ZX\jrfa~{ksrnu~}|}~~{{|wx}{}|{x|}or}}{~~{uourtyxwx|vommmjksywsqvvppx~~xtrnddnwyurty|}|||żøſ{yz|}{~{skikptuurpr{|rllns|}wnjlotxyyyzz{|~{soprrstusnnpw|rkhhhhhfc_][XX]dmv{~{wsld^VNKIGEDEEFHMT[_bddfffc_[[aglsx{}}yuniefkrxz}wqi`UNLLPTWZ]^__`acegkpuz}~~}ysmkjjklljifgksx|~}||z||wuyjfhkmmoqtvsnlllljedgmprtqnlljjigffed_[Z[`fjhd`_ipqqqlkid\XVVZ``_^^]^`bddbbaa`_]bkh`YTZ`^XOIKQSSPNNV_hmeWMIILOQQOOQTTRQRY_`][]`a]VRQQQNMLKLPRSV\hplf_VTVQKPVUPV_`][WW\bb]VSRRQRVYWOLNOZdijfb]VXahfddaZVXYYWZ_cca``acdcdfhif_ZZZY\_cfd``df]NFJORY`c_\YY\][Z[ZVUXXUNKLPX^[SOQSWXUV^f^[_b^WXamm^YacZSSW]__`eecdhmh`]][]^`cec_\\bjjggknnspib_`acgmokefnknqppuvihlrxqlk}xnnkhhjnntxkjrolnnlihijia\]]^^]\YW\`XG>=>ABDEHIKNMFADKMLH>4029>BD@=>AA=KW]YSPRX]YQNPUUOMMMMPYZV\`]UOPW]]]_b^ODGMU[]_emsrmif`RP\gfa^WSY]XVUTU^bb\dtsf_dkjidNQ`cgeVUMLSUWbkutkkruprulc`_dfgfebdfgffgjmql`_fijnnjhhjmopoot{~wxurs~{x{wxxxwqqrttukltsf`kslabionmmkigfgfcajkhcbcfjiddhopmlpnnrx~|snpssndWQRYgrninphcelneXUZ]^XOPX[UTcv{fT[rsfmxl[]]\`hjgb_[ZXW`lkbmrqvqsz{~~}~}z~ww~||~zxy{mr|zvz}ztmsssvwyz~uomnomin{~plwvoow}}xtspfhoy|xtuy{|{||ƽ¿ƽĿ{yxy~{z{{skgioswxtppy}slkmqz~ypiimsvxyyz{{|~yrnnooqttrmlmr}{slhggffda]\YVUY`gqy~{wsme^WNJHGEDDEEGMTZ_acdfggd`[[_dkqwz{{xsmjghmtxz~|umcXQMMPSVZ]_abbcfhimqw{~|yvoljjkmlljgglt{}|||~{vvzhhkmooqsuurmlmlkheeiorstqnlkkjigffeb]ZZ_fjjhdabkpqpokigd\XXZ^cc`___`bdefdbbaa`bhkf`[Z_`]TMLOTVTPMQYfll`RJHILPPOMNPTTPOSZ__][\``ZQOPPMLLKILQQSXakmib[UUUMJPVSQY`^[ZXW]a`ZSRRRRSUVSLILQ\dhid^XSWchecc_YUWWUVZ`cb````bcbbegie\XXWV[`dfb]^efYLEHMQX^a_[XX^`\YYWTSXXRKJLQX]WOMORWWQS]d^]^]ZVXcnj[WabZSTW\__`ddaafkf^][Z\]_cc_[Y[bjjeeklmqlgb_``bgmmicelkmoonxviimsxrkj{xnlihhlnpsijronnnnkjkkkc`aabc`\ZX_aPB<>@ACFGILMNLDAFLLH@4,.6=?AA>=?B>;@@?EHGJNONJEDGIHC9104;?@@>=>@@>=>?A@??AHMPOOTY\\ZWMGMSUVY[]XI<=DFKV\XSRRUVSMJNURKHIIJNTUSTUTNGHQWYZ\^ZNECJPUWZ^goqnf`]SLXijcd_TR\_YTRRUYWWYeqoe_eotocVY^`isj_Z\^[\fxqmsvuvwnimmkginjhhgifimlppgadglmgbegklkoutswz{wstwts}{wxuww}uptxuruujhssmmmf^`hgfiotpcaabcdefa][_efe`[]aehhihdjtyvqprutld^]`eovuv~|odagje\WWYWOJNXXUYgu|r`]lwrltt_V^cegiigb\WSS[hmlpy{vty{zyz~}}|~~{z~{uy{~~z{|xtzykmwslmuxqhktxz~}{ytposy||zrnklqqox~tho{ztquyzxwy~umsz}~|{{}ľ¿¿¿}xwy|~||~~|xw|~ztlffkqwyvrrvwrpnou{}vmijmqtvwwxxxxz}|vpmjjklnnmjggks{}tnkheddb_\ZXUTVY_env~{vrlg`XOJGFDCCCCDIQV[^acfhhgc_\]_elptuuspnloqu|{l_USSUVY]bggijkmopruw}|zwspmmoqqnnmou~{tsuzmmoprstvvrnnnmjhgjlqvxwvsqqomlifdcabceeipnieegknonmllkjda_bhgfca`abcehihda_`eillhdba``ZVRX^]YWVWY_ipl_TOMMMMNNNNQSTRNNUY[\Z\][ULILONJGFGIKKMT_fee[TQPPMJKNPQVXVWXYZ[^]VQQSSRONMJHHINX]a`YUMLW_bba^^YRPQRSY^`_]\\\]_`_chfb]YWWTV`ee`XSXb^OEBFKOTX\\WTZcb[VTQMPUQLJLORTSNHFKPQOLQY`^\\[XTWel_W[^ZWVXZZY[]`a_^ad_YXWWY[]`^XSPTahc`djjikd``]Z\^fjjd^bhjnljp}ulkosupifs{mifhmrqx~lglponoqrpnnmkfjorqiing]VNHD?>?CMTRRTRMKJHEDB?;55=C@>==>@CBABDINNLNUYZ[YSKJPVVTSX[RB:@GGMY[URRRRPLIJQVOGHHHJNQRSTRNJGHPVXY^^TJCEKRVVY`hnokb\ZSO^khcg^SS_cZVTRTTUVYcklc_dmqlb]\`blukdaaa]^i}rosusuwplokkgkoliihhijkmspgacglidaceiiimsttwxwsprsqs|{ttxvwy~totyuqstnmsutrka^ejfeimttf`acdghd_[[^ehe]Y[`dffggdjrvqmpsupgb`abgpuuzvhaaghd_ZXVRLJQ[XS]myxk_fuvmowkWXbegkljf`ZUU[fppotzvry~xvxy}~z}~{}~{z}ztwy{{xzzwuz~xmnuqikrvphipuw{}zyvqnnrx{zvqnllrwv|znjr{{wruwxww{ypty}~þ¾¾¿¿{wwwx}~{{}~ywy|yumggjpwzyutv~wqonpu{~xnjikortuvwwwxz|{upljijlmmlhffhoy{uolhecc`^[YXVVXY]clt{~zvrlgaYOIGFDCBBCEIPVY]`cfhhgc`^^_ekostsrpnnqtx~oaWVUWY[`dkjlmopqrtwy}}{ytqonprronmpwyrrtynmnqrtvwuqpnmljhhjotwxvurrqomjhfcb`behhknkgefiklmmmmlkjecbehgedcbdeefhhfbabejpmifdba`\VWZ``][YXX\fpsk\SONOPOPQRSTUTQOPVYZZYYYVOIGKOMJGFHJKLNU_cc_XRPOOLJKMOQTUUXYYZ\\XSQQRRQNMKFEGJS[\_^VRLLX`a`_[YUQPRTVZ^^]\[[[\^^^bhd_[XVSRYbec[SQX_ZLCAFKOSX[[WV_gcXRROKNSOJIMPRRQMGFKOOMLQY`_\[YWSXch_YZ\YXYZZXWWZ^````b^XWVVX[]`^WQMSae_^chhiia^_[XZ^ehgc_bhiligtulmpsuphfq|mgfimusx{jflqpoqsrpnnmkhlrstpnkbWSOLH?<@FSZUTTSPKHHEDEA=;==BGECCFLOMJNUYY[XPIIPSQORZYK>:BIKQXXRQRQMKIGMSPECGGHJNOQRRPJEDHOSW[]ZNGDJNRUVZbjmlg_WVRTbhbei]RVcf^YWUSSUWZaijc_diokc_^admtjhgdcaclspruptvpopjjgmomkkhiijimuofbdgkhb`adffgkqtvxwpklppnryuorxvu{|z}~tpt{tqqrtquwyuj^^ejjhlmtxkabehjje_[]^gidZUZ`cdefdbipsnkpvskdaccbfotv{|pe`bhgb_ZWSPNPX_XTbtxrhdltqlrteZ]cgjlkheb]Z]gpsqquwrr{|uuwy|~}z}~{}~|~{{}ysvwxxwywvwz|{|vmotnhjqsohhorty|ywtollpvywspnmlr|~}tknw{~|xvuuwy~{tvxý¿¿¿ÿ¿~yxwx|}zyz}zwx|{yunhgiovz{wvw}wqnnpu{~xokjkmoqsuvvwwy{~ztoljiikkkjfddgnu|~}{uolhecb`^\ZYWXYZ]bksy}yuqlgaZQJHFDCCBBDIPUX\_beghgda__`djnrsrrpnpsy~re\YXZ[]aelmpprtuvxz|~~|yurpoqssqppt{xrrv{nmnqtsvwsqqonljiilswwwvutsrpmjgecbbdgiklmjfcfijllmmnmlkfedhigddddfghghgeaachormhfdbb^XSWbe`][YZ[anvtiZROOQQQRTVWWVTROQWZZZYWTOJGHKNKHGFHJKLOW_`_\VQOONKJKMOQRSTX[[[[[UQQQQPNNMHEGIMTY[[YROKMY__`^ZVRQQRUX\^]\[[[[\]^^bfb\YXUON[de`XNOX^XJBAFLPSX[ZWWckdVOPMILQNHINPPRPJFFJMNLMRZ`_\ZXUSXcc]YYZYXYZYWVUX]^```a]XVVVX[]`]UOKWca\]dhhgg_]^YV[^ehfc_bhilgfwtmmpssnhfq|mggkptszuhflqporsqonnmkhnutvuqh\UTSOIBAGU\\XWUSQLIIHGIHFEDFFB=;=BGIFBCJOMKKPUXZ[WNIJQSONT[WH<9AMQSWTPPPMKJHIPSMECEFHJNOPRRLDACHMSW[ZULEELQTTV\djlic[TSTXac_eh\RYeg`[YUSSUWZ_ghd`dgmib_`centkihfdcfntqrrotupppiiinommmhggkjnumdbdghf``abbdeiosvupifhlllrvqmrwuswzy|{squyuooputuw{wj]]ekmnnmuznbbgkmle_\^`hkdYTZ`bceecbiprlgovrg`becbfmqvzwlb`cgfc^YVSPPW_`XZmxwoggmolmqlc_adinnjeccdcgpuvrrtrpuzwtvwx{|{z}~{|||~{{}~xsuwwwvy~}vvz{zzzsmprlfioqmhinqsx{yvsnkkotwvplmnlq|lkv{{wstw{|wwx½þ¿¿{xwx{|yxyz}~{vx}~{yupjginv{}zww|xqnnpv{yqlkkmnprtuvwwyz}~ysoljiijjjiecbeksy||zupkgecba^\[ZXYY[]bjrx|xurmhc[QKHFDDCBBCHNUX[^adgigeb``_dimqqqpporv}uga\[\]_bgnqssuvxy{}~|zvsqprstrrsv~wqrw|mmmrwwvvrqpnmlkjkqwyxwuuwusolhfdccdehjllliedgiklllnmljjhgeghfeeffgihhhfc`afkpplgedca[TT^if`]\Z\`isvobWRPQSSTUXXYWVSPPSXZYXXVQLJHHJKJGFFHJKKQZa^\YTPONMKIJMOQRRUY\\\[YTQQRPMLPMFFJLNTYZXSONJMY___]XSQQQTWZ\^][ZZ[[[\\^`ca\XVTOS^ec]TLNX\UIBAFLORWZYVXemdTNOLHLPLIILPPQNHDFJKLLNSZ__\ZXTQW``\ZXXWXXXWUSSX^_a``_\XVVVY[^`[SMK\d_[^ehghe^_]WV[]efdc`chijdgw}tmlnqqngeozlggntuqyqfgkoonrsommmljgmuuwupk^UYYQHEKVca]YXWWVTQNNMNQPMLKD:69ENMGCBGLMJILSY\\\TKJKQRNOW[SC:47CPSMEEKMKHIJOY`daWNJJMQQOS[[O=7DSUSVWQLJJIHHFMTMHEC?CIKMQRPIB@AGLPSWYXSHCGOTUUZbilke^TMRY__]cmfUSckfa__XRRUY\_cffedeihda`dhlolkighjkqtppmmurnnkiiltwpkjc_enoqsmgffe`ZY[^_^^ciotpicbddeilmmihosqpqvzxsnqtsqlkmu{zyzxl`aimpsqnv}sffknnmkjgefmsjZV]`_dkjecgptjdmrmc`cedcdhmorqf_`dec^WSUXW[cd^_mxsnliihhkljfbacglkgfgikjntxxvsqporvvttuux{}{|~~{yyz~||}|}|xtvuttvx}}vu~~zyxrnppkffmslglqoqvxuqnmmmsvttogioqv|or|}}zqqx}{xw¿ÿÿ}{{{}zwvwz~~~}{yy{~}zvvy~|xupkhhksy|{yy|yqmnpuz~yqlkjjjkmpstuuwxz{|}|xrnkiiiiifeba_`ejpuwvsplhecba_^\]]]]^_ciqw~}zwurmid\TMJHFEDCBCGNTWZ]_cfggfeca`bfjmoopoqu{yngc`_^_adkptvy{}}zwvtsuvxxxywruzjjow}}yuqonlkjkjmuyzyursvvtoifcabfhklmmkhecfiijlmmmkgejmpledehhghikkhd``dhlnnjhfeca^XWbmjda^]_fourkcYUVWXYY[]^]]YPKKQWYYXVVPJGIJLNLHFFGHIMPU\^ZURPMLKJIILMPPQSY__\ZXTQQRQNLKMHACJQTVWWSMLOPSX\\[XURSUVX\]\\ZYXWWWXZZ[[]_[QKKSbhdXRNIMVXQE??DJNQUXWS[jl_QNKEFLLLLLMNNLGDCEHIKMRWZ``^[WRPY^^][XWX[[YVSOP[bcbb`^[XSTY[[[[XPKPZ_ZW[aeghe_^XQUYZabacbcjmf_gyztokikoofagwvlehyujvlhhkmkmqpmjjkighqwxwsqlc`b]VRS\fea_]]cea^]]]^ab^WO@58COTOHEJPOIHNRX_fdXJHJLNPRRV][M:8KXVTVSMKJIGGHGNRKFEC@DJLNRTNG@>CJORTVXVPFAIPTTV[cjkicZQLR[`]\fncSTdieaad]VVXZ]addfgggiheaadhkomkgefhkutpnklqpnmjhinxxpig`_hnprsmhgfb]YXZ^]]\ahqskd_`bbchkljhhnsqnovxtqoqqpomkltzyyyxmaejosurowviinpoopmjjlpsk^[_`bkomgcfptkfkokb`decbcgknrnc]`dd^XSNS[]agc]gvulijihffikhebbejmgbfmpnlpz}yvtpoqtuttsuvw}{z|~}zxwy}}|{|{xvvvsswy}~vu|ywqnpolgfltlensopvwsmklnpvxsrnggpv{}tw~|ooy~~~xw¿þÿÿ}|~~{wttv{|}{{xwy}zvvy|}wuqlhgipw||{{}zqmnquz~zrmkihhgimqrstuwxxz|{wrnkiiiiheca`_^chnsvtqplhecba`_^`aaa`adipv}|zwurnje_VPLJHFECCCGMSVY\]aeghgfec`adgkmnnnqx|tlhea___bhouy|}{xwvvwy{}~xsw}ijpz~yurqoljijjnw|{xsqswwsmhdb`dhjlmnmjgdcfhiikmmkgegmrrjbbehhhhikifd`afjmnlhffda^\[\fniba^_birupe[WW[]^]\]_aa]VMJKU[[ZXVTNIHKMOOMJHHHHIOTY^]YTQPMKKJIKMMOOPU\ca]YVTRRSQNLKKE?DOUWXWTPKKPUVXZYWUSSUXZ\]]\\ZXWWWVWXYYZ\^YOILXfi`UPLKNTXPD>?DJMPUWVS]ll]PMLDDKLLLMMMLJEBCEGIKPTWZ``][VPP[__][XY[]^[WRNS]bcaaa`[VPT][[WZWOMPW[XW\acfgc`\UQUYZ^aabbelme^exzsmiikoof`et}vjem}pht~khikkjmpokiiiggksvwvurnged^XW\fjdbbbbgjhedeegih^RE:;EPVUOKJLONKOUY_feYIEKPQRRTVZ]XL<>NVUVUOJJJIIGHINNGFECBFKLPUTLD>=DLPQSUVULCCIPSSV]diie_VNLR[_Y\ko_PUeie`dmf[Z\\_cddfgiijjeccdfjmmidceehz|rpliknomjhhhozxnge`bjoprsojifb[WX[^][\bksne`\]^_`fiiiihnqnlotvqooollnnlksyyvutpiilpssrsw}wlkorpqrqonnqunb^`chpqnicgpumgjniaaddbabeimoh_]`b_XSRQU[_ceaanwogghgeefhjhdbdhkibckpqons{|xvsqqsuvtssuvyz{~|ywwz~}}|{{zwwvrtwz~}vv~|ywqnpolifktodlurqwxrkhlqu|{sqnhgoyzy~rpz}}~{yÿ¿½¾~}|xtsuy~~{zzyxuv|~{wwy|~xurmhfgmtz|}}~{plnptz~zsmigggfgjmpssuvwxz{zvrnkjiiihdb`_^^aejptsqolheccba``abdedcchov}~|zwurnjf`WQMKHFFDCCFMSVY[]aehiiigdabcfiklmnqz~wplgc_^]`elty}}zxwvwy|~xuxilq{}wtrqoljikloy}|wspsvwrlgca`ehkmnnmkgedegghiljfddlswoa^adefghikifbadhjkljhfec`\\]bkmg`^^aemuumcYW[`a````bc`YTMHLX\[[XURLHHLPQONJJIHHKQX\_\XSQPNLKJIKMMNNNV^eb\WUSRSSPMLKJC?ERYYYXSMJLRYYYYWUTSTX[]]]]\\ZXWVVVVVXXZ[[VMKR_ifZQNMMOVYRE@@EJNQUWVT_lj\RNJDCJKLMMLLKIFDEGHINSVXX``^]VOR]__]YY[]__[VNOV_bbaacbZQNYa]XUYVOMOSWVV\`beec`[SRVYZ\_acafmmc]hy~xqkhgkoog`cr{vjgu{ifs|ljjlkhkpligggefmvxwvvtpjkg`Z^fjjgeegijkkjjjkkkcUH@AIRWVSPNNMLMRX\`eh]JCKSWVTTVZ_]VKBEOTUXTMLKKKKGEIOKEHKEEILNRWUI@;@JOPPRSSRH@DMPPSX`gie_YRKJR[]W^nnZNXhkc`gqk_]^_adffghikmkeccdghkmidcddj~wrqliinnlhdfip~|oebaelppsupjhe`[VW[][Y]gppf_\[[[\_fgegijmojhnssonmlijmmmkrwvurpomlmprrruy|vmlprqsttqqqtxpc`chmqrojfhqvnhklgddedb``chnmc]]__\UQRTY^`ccbepsjeghfdefhigeehiheeioppqsuxywutsrtwvtttuxz}y|~|yyy{~~}}{{yxxvrsw{}|xuz}{wqnpomjhjsuhjvwtwyskflty~sonjiq|}z~wsz}|}|ƿ¾¾ÿ¾ý~~|xuttv{~{xxwwttyzyz|~xuqmhefkry}~{nklnrx~{tmigeefgjmnprsuvwyzzvrnkjiiihd`^]\]_chnrqpokhfddcbabbcegffeipu{~|zwurnjgbYROLJGFEDCFLSWYZ]adgiiigecbdfhiklorzytpjf_][]cjr|}{xwwwz}yvykmrz|xtrqokiilmqy}{vrpruupkfb`afjlmnmmjgedeeegikhdbeovuh[\`bbdfghigebbeijjjihfeb`\]ailkd^\^bhqvsi_ZZadcbbbbcc^TPNJP[^\ZWSQMIJOTVROLLKJKNT[_^\WTRPNLKJKMMMLLNX`fbZUSQRRQOLLLHB@GTZYXUQLLNTYXXXVTTUW\]^^]\\\ZWUVVWVVWWY[[UMOYdiaVNKLLOWZRF@AFLPRUXWV`li]TOKECHKLMMLKKIGGGHJKPUVWW_`_[SQV]`^[W[]bb_XRMQZ`bcccecWNR`b]WUXVOMPSUTU[`bege_YSRVYX[\`cbfmkb_iy~xpifekqof_arztln{ygdrzkjjliehkheceecfozywuvvronjb^gnmjihiklmlkkkllniWHCFLTXXTRRONMMSZ\bki^ODESZZYUUY^`]WOILRUXYRMOONNLIJKMJEIMHGJLNRXSG=8:BR_^]\`cegimorstuvvvvvwwvsqpponnoopppnmmnoooppppooopqrrrphktwvvutrpmkihhhjloqrtttutssrqqpopqrrpooqstsspqtwxyxxwwwwwwvvuvxyyxwwvsrpoqqplklpuvurmlklntsssrpnlkllklljgsupjkowvptzzwsqqsuvsqqqtuuvwxxyyyyyz{|{ywxxwsolmoqtuuspplkjihijloqrsstssssssttwz{yupnnoopqqrrrrssqqtvusqpprsuvwvwwutttttusttquxzz|}{|zzzzxwvy|{xmQQpy||vqqqsrtz~}zz{||||}~~~~}}|zyvuuvwrptxyxwwwyy{{{yxxwwvwxwwwwyyyyvutuy{}~xvx{|}~~}|{zzzzzz{{|~~|zyyyyyyyyxwsppnnopompwzwusrstwxyy{||||}~~~{zz{{{{{{{{{{zzzzzzzzyyyxwwxxuttuuuuuuwx~~zussvyyxwvvvwvvuuvxz{|}}}|{z|}}||{z{}}||}}}~~~~~~~~~~~~~~~}~~~~~}}~~~~~~~~xyyyyyxxxxxxxwwwwwwvvwwxyyxxwwxxxyyyyyyyxxxxyyyyxxxxxxyyyyyyyyyyxxxxxxwwxxxxxz{|}}||{zyxxxwwwwwwwwwwwwwxxxxxwwusqooonopqqppnmlkigeehilllllmnllmmlkjjkllmmnpppppppponljiihggffimpqpooonmkijjklmmkj^RbknmgYB:9?L]`_]^acgkpsuvuuwwwvvvvurpooooopqponkkmoonorssrqpqrssrrkhnrsuxvqnkihgghilnprstttutsrrqponnopqppprsssuuxyyyyxwvusrrrssstvwxwxxumjikqtromoswxvsnjgcagjmnkjjllkkihi`Uble\\fmi`fox{zustrstusooqtuuvwxxxxxyzz|~}{z{{wtplkmpsssqpomkjkllmpprsssssssssrrrtx{|ysqpqppppppooponnoqrsromnnqtvvxxusqqqsttvxvuvsruxwyxyyyywy||zfG9]w}~|wtsssv|~|{{{{||}~~~~~}|}|{wvvtwvvwyyyyyz{{||{yxxwwwwxwwwwyyyyvssuy|~}|{{{|}}}~~}}|{zzzyyyzz{|~|zxxxxyyyxwvsqonmnnmptxwutvvvwxyzz{{|{{{|}|{z{{|||{{{{{{{zzzzzzzzzyxwvwwusrssttuuuvx~|}yxwvvwwvvuvwy||}}~|||}}}}|{{}}||}}}~~~~~~~~~~~~~~~~~~}~~~~~~~~~yyzzzzyyyyyyxwvuuuuuvvwwxxwwwwwxxxyyzyyxxyxxxxxxxxwwwwxyyyyyyzzzxxxxxxxwxxxxxyzz|}}}}|{zyxxwwwwwwwwwwwwxxyxwwwvsqoponooppoomlkjihfegilmnnoopnnnnmmllmmlllnppqrqqpppoomigfggghlqssrqponmlkhegkmnmme`ilkkidJ=;>HX^^]]]_goswwxvvwxxwwwvtpoooppqrsrolhipqonprtusqqqsssqokkortwwrligffghjmnpqsttttttssrqonmmopqpoprssrrtuwxxyxvutrrrrtuuwvussuwtmikpttsqqsuxxvtqno`NR]giiiijkkkhfecVZhe[Ydnnhfltvqkmvvvvwsopqtuvvwxxyyxyzz{}~~~{wspniinrssssrpnopstuurqrrsssrssrrqpprw{ysonnnnnnmmmmmmlllnpssolkklnrtwxvrpopstvwxxwwusqstvvxzzzz{}|yY5Dy}~{wvvuu|~|z{||||}~~~}~~}~|wwwuy{zyyyyzzz{{|||yxwwwxxxwwwwyyyyurqsy{}{{}}||{{|||}}}}|{{{zyyyyyz{|}~}yxxxxxxxxvusqonmmmotxxwvuvwwxyz{{{zzzyyxyyz{||||||{{{{{{{zzzzzzzzzywvvwvuuvy|~}}|zxy}}zyxwvwwvvuuwy||}|{{||}}}|||||}}}~~~~~~~~~}~~~~~~~~~~~~~~~~~yzzzzzzzyyyxxwvvuuuuvvvwwwvvvvwwwxxyzzyyxxxwxxxxxxxwwwxyyyyyzzzzyyyyyyyxxwwwwxyz{}}~~}|{yxwwvvvvwwwwwwwxxxxwwwwtspponoooonnmkjiihgfhjlnpoppoonnoooonnmlkkmopqqqqppppqojgghhiptvvtssqonmmmifgkmnomjikllmllYB<M\abahmd^XN@AECACGRQIB@FMRTYY_cfhjhffgijlopponnprssomnoomlklmnppockttsstsrmkiiijnmjcdkswqnhknonnmmnopqsssrrsssrqqqsuwwwwwwxwwwwwxxxxwyzwuoiefhijklmnnoopopoppqrtw|yqpnmnooqsvtpoopstvxyzzywtrqrrrrsttuuutsrqqpopooopqqrrrqppommmortuvvvvuutrohdcbehklnprtssssuxyywvwuuvwz{{{{{{||}|||}}}}{{zvkcX`\\aquvwuvutsutswvrmljjkkloqtuuvvwwwwxyz|}{}{wzz{{yyz{|}}|{zzyyyyyxxwvwvrnmosz|||wtrrrtuwy|}|xttvy{zzxxwwwxz{{{zzzzzyyy{||{zzz{{|{zyyyyyyyyyxxxy{{|}~~}{zxvvuuuwz{z{{{{{zzzzzxutttrqpqqrsuy{}{zz{{{{zyzzzzyxxy{~~~~~}|{{zyyy{|}~~~~~~~~~~~~~~~~~~~~~~~|}~~uvwxyzz{zyxxwwvuvvuuttttuuuuvwvwxwxxxxxxxxwwwwwwwwwwwwwwwvvvvwwwwwxyz{{{zzyyzz{{{zyxxyzzzyzyyyyxyxxxyyyyvsqrsuwwwvuuutssssssrrrqpppppqqqqponnnnoopponnmnprsrqpoommnopppqqtxyywwxwxyzyxurrqqopppppnmkiiijkkjneN?K]a_bfihef[ECA><>DPI?>ENRRV]__`cefdcglmliijlnppqqstonmnnmllmnmmmjilstsssqokjjiijljZMOSV[acgknnmnmnooooqqqqqrrrpoonnpsuvvvvvvvvvwwwwxxzyunifffghjllmnnnnnooprstuvx|ysqonnooprttrpnnpsvxyzzywtsrrssttuuvvusqpppoppooppqrsssrqomijloqrrttuutuuuuqlhbadiknprtttsov|zvsststuuwwvvvwyzzzyz|}}}~}}||~zrsd[`jegtwusponmmonkhkijllmsvxvssuwwwwwxyyyx{~{xz{{{yyz{|}~~{||{zzxxyyxxyxyxupoqw}|yurrtttuwy{}}|xtrsvz{{yxwuuvxz{{{zzyzz{{||||{zz{{{{zzzzzzzzzzyxxyz{|}~}{zxwvvuuqswzyz{zzzzzzzzxvuuusrrrsstvwtty|||{zzzzzzz{{zyxy{}}~}}|||{{{zyyy{||}~~~~~~}|~~~~~}~~~~~}}~~tuvwxxyyyyxwwvvvuuuuttttttttuvvvwxxxxxxxwxxwwwwwwwwwwwvwvvvvvvwwwxyzz{{|{zyyyz{{{zyxxxyzyzyzzzzzzyyyyyzzxtnoruvvvvvvvuttttssstrqppopqqrrrqponnnnopppnmmnortsqrqonnnoppppqtvwwvvvvvwxwutqqqpqqrsrqpnljjjklkjmj\CJ]a^djjjikdQA><;N[hnsngb`acccgpusslfgjnnlloprqqqqqqqrrokhghjnrsttrmlmmmmmllmpqnje`]ZVUX_fjlmnonnnnnnoqqoonnoquwwvtssrrrsttuuuuvwwrjdcccfilppppnmmostvwxyyxy{}~}|ywtsqpoooooqrttsronpqtwyyxwutssttuuvvuusonoprrqpppppqrsttsrnggmppqqqrrstuuvvrlhiknnlmnqtuvwvtsttsstuyzxtoqooprttuuvvxz{|}}}|{|~~}{unmsvxxuqnkjhghlklqw|}xvvxxxwwwxwwxy{zzyxxxxwxy{{|}~~zx{|}{yxwwxxxxxxxwutuyzxvuuusrsvz|||||{zxxxy{{{zxvuttvy{zzyzz{z{{||||{zyzzzzzz{||||||{yyxxxz{|}~}{ywvwxxwvtrruvyyxvuvwzzyxwvvvxvsqrrsvxvtsw~wxzzyzyz{{{|||{zzyz{{{zzzz{{zyyyxz{||}~~~~~~~|~}}}~~~~~~~~~~~tttuuvwwwvvvvuutttttssttttttuvvvwxxyyyyxxxxxwwvvwwxxwwwwvvuuvwwwxxyyzzz{{||{zyyyzzzyyyyyyxxxyyzzzzzzyyzyyyxwvwwvuuuttttttutttssrqppqqpqrrrqponnnoonnmlkkloqsuutrqppqrrrrqrstuuuusqqrrrqommnpqrrttqnlkkkkjklmmiXT]bdfgghiiih_B99AR^ZM>Ofvyxqjd_acdfmttpojgijjjiijkorsqpssssqmiffikpstttsmnrrpoooooqrssrnfa\XW\begilnoooonnnoonnmmnrvxxusrrqqrrtssssstuurlgfffiloquwvsnoqrtwxyzzyyz|~~|ywtrrrqpoooopqstutsppqruxxxvutttstuuvuutrpprtvvusqqqqqrstttsnjmuutrrrrsttvuutmd]]diihjmpsuxyvtrrrsstwyxsokppnnoqqsvwwwyyz{{{zz|~~~~~zrsuwyywvrmhhikjkpr||{zyyxxxwxwwxyzyyywwwwxyz||}}}}~}zy|}}|{zyyxxxxxxyxxwxzxussrqpqtvvwwxzzzzz{{{||||zxywuwxzzzzz{{zzz{||||zyyyyyyz{||}~~}|zzzzz{zz{|{ywuvwyyxvtrqrsvwvtstvyyxwvvvvutpoqrsuwxxxx|~uuxyyz{{{{{|||{zzyyzz{zzzzzzyyyyxyz{|}~~~~~~~~~~~}}}}~~~~~ttttuvvvvuuuuutsttttttttstttuvvvwwxxxxxxxxxwwwvvwwxwwwwwvvvvwxxxyyyyyyzzz{|{{zyyyyyxyzyxxxwxxxyzzzzzzzyyyyzzyxwwvuutssssssssssrrqpppppqqrqqponononnmlkjijlostoloqqprrsrrrrsttsromjjlnnnmmllooqqstronnmmkjillkia[^begfffgffkhG98EU^\UGQn{|xrkfbbefjqsspllnpmjlllkkmrroostspligffilqttutrppqqqqqrrqrrsturomjgdbaaaeikmopponmmnmmllmpsttqpqqqmlpvvsrrrsstsolkkmqsuvwxvtprtrswxzzzzyxz~|zxurqrsrqponnoprsuvwvtrpruyyvtsstttuuutssrrsuxzzyvtrrrrsttttsonpwwvtsrsstuuuutqg]Y]^_aejkotwxwurqqrrtvxsljinqoooqprwxxxyyyyyxxxzz{}~}~}}vutuy{}}zrkikjijmlw}{zyyxxwwwxyxxxvuvxyz{}}~}|{{{{|~|{||}}||{{{xwwxxyzzyyxwtqooonorvwuttuwxxxxy{{||{}|{}zvwxzz{{{||{zzz||||zyyyxxxyz|}~~}|||}~}{zzzywvuuwxyxwusqpqstsrqrtwxxwwwxyzxsqsttwy{}~}|~}tsuxyz{}}}{{|||{zzyz{{yyyyyyyyyyxxyz{|}~~~~~~~~}~}}}}}~~~~~~~~~~~uuuuuuuuutttttsstuuttttsssttuvvvvwwxxxxxyyxwwvvwwwxwwwwwvvwwwwwxxyyyyyzzzz{{zzyxxxxxyyyxxwwwwwxxyyyyyyzzz{{zyyxwvuttsrrrrrrsrrrrpoqpooopqqpoooponnmlkjihhimstjempqpsssrrrrrssrndcfhkklmmnnnooprsssrqpqib\gligfa_`beffefgfhqlE8:IZ_\_Z]s{{wsnmicchmpqrrmorspnnnommmrokosrpjfegffilqtttsqpopopqrssssrstutrqpnlhb_^aeimpqqponmlllkkkmopnmmpqqpnouvsrqqrrstrpppstuvwwwutsvxwwxyyyyxwtw~~{ywtrrrssrqponnoqrtvx{{urpsxxvtssttuuutsrqruvwy||{yvtrrrrssttsqopuwvutstttuuuuvvnfa`_^^addhqxwurnoqqrsttoiijlrqqrrruz|zy{zxyywuuuuwy{|~}~ywtuy{}~zojlljjkiq}|{zyxxwwwwwwvuvwz{|}}}}|{ywwwy|ywxxyyzz|{{wwwwy{|{xwtpnnmmnoqsuvutstvxxwxyyxxxx{|}~|{{yz{||}}}|zyz{{|{zyyxxvwxy|~~}~~|yxyxvuuuwxxxxvurppqrqppqsuwwxyz|}~~{zyyzz|~zz~|trsvxz|||||{yyzz{{ywwwxxyyyyyxxxyz{|}}}~~~~~~~}}~~~}}}}}}~~~~~~~~~~}}~vvvvuvuutsttttttuuutssttsstuuvvvwwwxxxxyxxxwwvvwxxwxwwvvwwvvvvwxxxxyzyyzzz{{zyzyxwwwyyxxwwwvvvwwxxyyyyyz{{zzyxxwvutsrrqqrrrrrrqqppspnnnopqpooooonmlkkjjhhhkqumekrsrsssssrsssqonjjkkllnppmhdhoruutttspmYOYedca`__`beecbeghmxuO;=N]_]gmlwzywtpnibahnoorrnoppnnlllllnqonqomkgeghffhkpsssqommnnnoprsrrrrtutqpopqomiedehlpssqponmmllkkklmlllnorsqqsrqqpppqrsponmopqrssttttwxwwxxwvvuuqs~}zxvtrrrsrrrqpooooprttxxrompwwusrsvuutttsssuxxxz}~}zvtrqqqrrsutrpruvvuttttuuvutuupmmllhedd_bjwzrqoopqsrpolllmostuvvvwz||{~~||}{xxwwxy{{|{|~{yuuyz}unnolkkkr|zzzyxxwvvuvwwvxz|}}||{{zwvsstvz~}}{rpqqsstuvvvvvvvz|~|uqqmmllmnprtuuuutuwzzyyzywutuwz||||}{{||~~~~|{zy{{{{zyyyxvvwx|~~~{xwwvvvvvwxxyyxwtqppppoppqsvwy{}~~}vwzxtrrtvy{~}}|{yyz{{yvvvwwxxxxxxyyzzz{||}}~~~~~~}}|}~~~~}}}}~~~~~~~wwwvvvuttssssssstuutssttsttuuvvvvvwwwxxyxxxwwwwxxxxxwvvvvvvuuvvwxxxyzyyyyyyzzyyyyyxwxxxwwvvvvuvvwxxxxxxyzzzyxwwwvutsrrqqrrrrqrrqqruommmnpqqpooonnmmllkjiiikotqjkmqtsssssttsqnoomlllklnqsrolorsvvuvtsrfIM^a\ZYZ[]^_ecbadgkpzbB@U^_aovtxxxwtqlgdcglmkpqmljjjkjjklloqrtrlhgfikkggiloqrrpmlkkkklnpqqqqrssrpppppppoligilptutronnnmmmllklmmlllpqrqpoooooopqqnlihiknpqqsttsrrpswuuuutrqq|{xvtsrrrrrrsrqqponopqsrnlklovvtrqrvutttttuuwyxwy|}|ytrqppppqruurprtuutttttuuvusrqoquuvqmmh\Zfsytrvvrssqmlmoqrsuvwxxxxxyzyyz}yzyyz}{y}vuz{zvvy{|~{uusollmt{|}|{{}{zxzyxxwvuvvwwxwz|||{zyywusrpqrsvyyztllnnooonnoosssuz}}qmooommnoqrttuuuuwxzzyyz{xvtuuxzxxyz||||}~~}{zy{zz{zzzzxwvwx|~~{yxwxwxyyzz{{{{{ywsqqpoooopruwy|ztvxwutssuwy}~}|zxxyzzwttvwvwwwxxyz{||{{||}}~~~~~}}}}~~~~~vvvuuuttstttttsttuuutttttttuuvvwvwwwwxxxxxwwvwwwxxxxxvuvwvvutuvwwwwwxxxxyyyyyxxyyyyyyxxwwvvvuvvuvwwwxxxyyzzxwvvvuttsssrrrrqqqqrrqrvnmmnopqrqpoonmmmmnmkjjjlnsspmknrrssstttsqoqqpnlkjkmpstwyvspkmqwrsvfGYebYTSVY\]]`a`cfhjmvkDFY^cosoruyyytokghfeeeagkhhffhilnpqqqrssojgfglonkjknpqqqpmlkihhikmnoppqqqpppppopqqqpkinrrwwtpoonnmnmmmnnnnnmoqrrqonlmlmopppmihhknstuvwwvutstuqvxxuqpq{~ywusrrrrrrsssrrponnoqsqllkopssqpoprsstuvuvvvvvvxzzxtpoonnoprsvtrpqsttttttuuuutrokmsxwwsstnXUikryr|}vwwqnnpsuutuxyzzzxvuvvux}wxvxz}|xx{upt{|zzz{{}}}ytpmpuyzyyyyyyzyzyxwwvvwwxxyy{|{zxwvsqqpppprtvwwx~tlmonnnnmmnmopqsy}~|qmmoommnoqssstttuvvwxwxxyxwvvuwxttuvz{{z{|}~}|zyzzzzz{{{zywxx|~}|}|zyyy{{|}}~~~|zwrqpppppqrtvy|}yutuvutsttuuy~|ywuvxxvtuwxxxwwwxy{}~~~~~~~~~~~}}}}~uutttttttttttttuuvvuutssttuvvvwwvvwwwwwwwwwvuvvwwxxxwvvvvwvvuuvvvvvwwwwxxyyxxxwyyzzz{zxwvvvvuuuuuvvwwwwxyyyywvuuutttttsrrqqppqqrqrronmnoprrrrponmmmnonlkjkmoruvuomrrsrstsssqprsqpmkjjlpstwywtk\]htqttdUimgZQSY]^]]_``dghhjsoGK]dotolopxzuponkljcaecdeefgijloqsssrqrpmigfhmppoooqqqqqpomlkiiijjklnoopooppqqppqrtsoknssyzxtqonnmlmloppppopqrqrqpmkjjjiimqnjjkoswyxxyzzyy{uqqw}yroptz|yvtrrrrrrrsssrrqponmiqrnomnoponnnnorsstvvutrtuwwsqommmmmnopsuvtrqrttstttuutrqpnkhkrxwwtuwoWS`[qzutuy{|rnqtwwtrrw||||zwuuvvy{zwy{~|ywsuzwuw|~~~|{{{}zuqsvxxwwwwwyyz{yxwwwwxxyyzzz{zxvtrrqpqqqqtuwvux|vpppoooonnnnnoortwxxwsponmmoprssstttuuuuuuuuvvwwvvvvuutuwyyxxy{|}}{zzzzz{{|}|zyxy{~~~~~~}|{{{{}~~}{urqqqrrrrsuy}}zvttuttuuuttv{{wvtuwwwvwz{yyxwwyy{~~~~}}~~~sssrrsstuuuuuuuuuvvuutttttuvvvwvvvvvvwwwvvvuuvwwxxxxwwwwvwwvvvvvuuuvwvvwxxyxxwwxyz{||zyxvvvvvvvvuuuuvwwxxyzyxvutuuutuutrrqppppqrrsqqpoopqsssrqonmklnqpmkkmoqsvyytqqrssttttsrqrttspmjilosttuvvsj`[lsvnacie`SNT]ab_^_`^bfggir}qKRaqtokmnnvuomorrokddlnpjghilmpqrrqqqqrpliihimpqrrrsrqpoppqppnmljhiiklmnnopprrrqqsvxwomqv{~|vqonnmlkkquusttsqrrrqoljijjjkosomnquy{|zz{{||{|rpvzztopsx{{ywtsrrrrrrsssrrrqpomgmqpnllmmmlllmnprrssssttsrqqomlllmmmmnosvwuttsttstttutrnifeddenxxxuvytYQTe~wsstz~{rosvwvrnox~~}|zxxxwy}}z|~}{rorz}}}|zz|zuvwwwvvvxxyz{{zxxxxxyyzzzzzyyxwvvuvuvxzzxxwuuw{{vuttrrqqqqponnopsw{}vqnmmpqsttssstttttsssstuvwwwvvwvuuuwyyxxyz}}|{{{{{{|~~}{yy{}~}}}|~~||}}zz{wtttstttsttx{~|xttuuuuvvtsuw{|||zuvtuvvxyz}|{zyxxyz{}~~}~~~~~~~~~rrrqrrstuuuuuuuuuvvuuttttttuvvvvuuuuvvvvuuuuuvwwxxxwwwwwvwwvwwvuuuuuvvvwxxyxxwvwy{{||{zxwuuvvvvvvvuuvwwwxxxxwvvvvvuuvvusrqqpppqrrssrqppqqstsrqoljjknrpmklnqrtwyyvrqrssttttsrqstttrlihkorsssuvuqj_kqrnfieYSHLXbgf_]\_\bffgipzrV\lqoklnknrqlnqttpkhlrrqdbjmnpstspmmoqtqnkkkloqrrsttrqommostvutqmihgijllmnpqssrqqsvvusnmpuxwrnnnnnlklsxzyzxupoqrroljhhjnrsrmmrwz{}}{{||||zvpu|yolqwx{||{xvsrrrrrrrssrssrqpnkkmonlkklkkkkkmnnnnnnrvvqmllonnmmllllmnrwwvtssssttuuutoh`]^``^hwxxvuyzj\]koursuy}vqqsuvupmox~|{xwzzy{{~~vqq{~|zz{}}ywvvwwxxyyz{{{yxxxxyyzzzzzyxxxyz{{zxz}wtrruvy{||{|{{ywvvuusqponoqw~{tomnqsuuuttssssssrrsssstwxxwwxwvvuvxxxxwy||{{{{{{|}~}{zz|~~}{zzzzyxwy~||zxustwwwvvvvuuuvwxxz|yuuwxwvuuuttuvurwyvvuuwwwyy{{zyyyxyz{}~~~~~~qqqqrrstuutuuuuutuuuutttttttuuuuutttuuuuttuuuvwwwxxwwwvvvvvvvvvuvvuuvvvwxyzxwvvwxzz{||zywvuuuvvwvvvvvvwxxwwwvuvvvuuuvvvtsrqqpppqrrrrrqppqstsrqoljjknqpmlloqsuxywtqpqsssttssrrstttrkghmqrsssuvuroopggonmfYPKR^fmn`\V\]adefgowvadkkjlnnnoooopqrrommoqrqa]jmnqssqnjjlpsspooooqrssttsrpolmmpqoqtrokhhiijklmoqrrrqpqrqpoljlnopnmmnnnllmswy{{wrmnqrspkhffjqwtplouzzyzz{{{|zxurtx|uagv|}}}}|zwtrrrrrrrrrssssrqookkmmlkkkkkkkkkjjjjjmsvsnnoonnmllkllmmnsvvusqqstttuutsia[Z]_^[fwwxvuxyvn^Xpqptvxztqrrttsqory~~|{xxzzz|~{~{uuy~~~~}{{||~~~~~}ywvwxz{|{{||{zxxxxyyyyzzzywvvx{}|{}ysnnpsxyyzyz{~~~}|{{zzywtqpporz|vqnosuvuutttssssrrrsssrswzyyxxwvvvvvwwxxx{{{{||||~~|{{}~{xwuuutssuwxvvuusrtxxyxxwwvvvuutrsvz~zxwwz{ytssuvuutqmtxwvuvxwwxxyyyyxxxyz|}~~~~~~~qqpqrrsstttttutttuuuuutttttttuuuttttttttttuuuvwvwxwwwvvuuuuvvvvvvvuuuvvwxyyxwvuwwyy{{{zyxwwvvvwxwwwwwvwxxxwvuvuuuuuvvvwvtsrqpppqqrsssqppprssrqomkkkmqommmortuxxuqopqssstttsrrsttsrkfgpssssstutrrqqj_ipoj\TU]dioq`XNX^`bceckwzjiigjnomlnnnoonnnmijlnopifjkmruollkkjmprsrrqrrrsssrqonnnnknmklqqoljjjjijkmnoqrqpnnnmlkjiijjkklmmnnnnosuuopwqmnprtqlcbgossqoorrtsuyxvvwwtqmqyvwj]fv{{||}}zxtsrrrrrrrrrssssrookjmllkkkkkkkjihhhhikpqmorsromllkklmnnosuutqpprttuuutpd^XZ^`^\gwwwvvwyzqU_omosuvvsqssutsstwz}}{zyyz{{}}{~yvwzz|}~~}}}}|||||{zxwwy{}~~}}||{yxxxxyyyyyyywvtvz}|}yrmlnsx||{yxyz}~~}}|||||yusqnnt}|wuqpuvvuuutttsssrqrrrrqsy{zzyywvwwwvvvxyyzz{||}}~~~}|}{wusrrrrrssssrrrrrtvwxwwvvuuvwxvsstvx{xrtuuxxtpqqtuuutrqtvvvvuttvxwxwxxyxxzz|}~~~~~~ppqqrrrrsssttttttuuuuuuuuttstuuutsstttttstuuuvvvwwwvvvutuuuvvvvvuuuuuuvwwxyxxvvvwxyzzzyyyxxxwwwwwxxxwwwxyxxwwwusstuvvvvvusrqpoopqrssrqpqqrstrqolkjiknnmnnoqstwwtqoprrssssssrqssssqkgjprrrrrsttrrqqpdfookb\`filorbUOX]^__`]exvhfhglnmkkmppnlkkllhgilorrpljkmnhgklliilotttsssrssqpnlmmrronnmjmpomlkkkkjklnnpponlkkkjiihhhhijkklmnoqssocZeyupmptvsmb`hrusqqsuooruzupppqokjqyqra`irvwxz||{xusrrrrssrrrssstsonlklkkkklllkkjihggfffggglqtsnmllklmmnopstsrppoqttuvusl`\W[``__jwxwwwvyzt\`jlnrtstrrtvxwwuxz{||{{{zz{|}}{~|wuvuw{}~~}}}}}|||zywwxz|~~}|{zyxxxxyyyyyyxvuuw{~~~|qlkosz}~{yxxz}~~}}|||}}|yvtqoox|{xwsqtuuuttttsssrrqrrrrqtz{yzzyvvwvvvuvxyzzz{|}~~~|yvtsrrssssssrrrqqsuuuuuuutttw{ysvxwvuvz{srsrqqqqqqsttuusrsttturmntwwxwwxxxy{{}~~~~ppqqrrrsrrsssstuuuvvvuuuuutstuuutsssttttstuuuvvvvvvvuutttuvvvwwvvuutuuuvwxxxwwvuvwxyyxxxxyyyyxxwwwxwwxxyzzzywvsqqrtuvvuutsrqpooppqrrrqqrrstutspmljhhjllmmnoprvxwsqqqrrrrrrrqpqpqpnjknonopppqrrqqqrrmhmpmhdgkmnoqeVTXY[][YXcsldfhgkmlkknrqnkjjkmkkmpuvurmjgdb_ajmlggilsttssrqrqpnkjjkrtqnlkjlonlklmmlkjlnnoonmkjijjiiiiiijjklmnoprtsm^Vcyvsopwywqdairutstvtnqusvsollmlklpwol\clprstw{||zvsrrssssssrsstuspmkkkkkklmlkkkjihggfecabejnoomllmlmnoprsttrqpppqstuvtph_\X]a``bmvwxxwuxzwf^fopsuttrsuy{zzwzz{{|||{{{{|}~}|~~wssrtw{|}||}}}|||ywvwy|~}|{zyxxxxxyyyyxxwvuvy{}ulknuy{yxyz|~~~}|||||~~{yxxvpuxxwvtrstttsttssssrrqrrsrrtyzyzzyvuvvvvuvxz{zz{|}~~}}~}zwtssttuuutsssqqqrrsssssrrru{|q{|xusqt{}~wrppprrqqrsttusqpopqsqlmtvwxwxxyyy{|~~oppqqrrsrrrsssttttuuuuttttsstttttsssssssttuuuvwwvwwvuutstuvvvwwwwvuuuuuvvwwxwvvuvwwwxwwwwxyyyyxxxwwwxxyzz{{{zwsrqrtttutttssrqqpppqrrrrrsstuvvusqniffijlllmnopvyyvrqqqqqqpqpponmljhgkolhjlmmnooopprspmnpolikmnoopjZVVTWZWSWckdejggijjklprrnkklmnoqstwwusnje\W\bikjddgjpssqoopronkjhhjoolkjjjjjjiijmnmmklnnoonlkjjkkkkkkkklllmnoprrtrokbhxxvsry{yuifksvttvxtnusmrupnmmlknosogYdloppqtz}}{wtsrssssssststutpmkjkkklmnmkkkjihhhhhfbcgkmkhjklmmoqrtvvutrqpqqqssuusme_\Z^aabfouwwwwuwyyncjtquwvuuuwxzzzyzz{{|||{{{{{|}~}}wrqrtvxyz{|}}}|{{xvwyz|~~~|{zyyyyyyzzyyxxwwvwyz|}}|zupoqw|~{yxxy{}~~||}}}~{z{zvwvvvusqqrrrrsssssrrrqqrssstwxxyyxutvwwwvvwz{zyz|}~~}}~|xwwwxxxyxwusrpppqqqrqqqqpsyq|wtrrsru}uqoorrrqqrsttsqpooqssrstvwwwyz{yz|}~~~~~~~~~~~ooppqqrsrrrsstutttuuttttttttsttssssrrssttuvvvuvwwvvvuttstuvwwxxxxxwvvuuuuwwwwvutuvwwvvvvvvwxyyyyxxwxyyzzzz{{zxusrssssssssttsrqqqpqqqqqqrstvwxwtsplihijlkkmonov{zwrppppppppoonlkigefimifhijkklmnoppqpooppnlmnoopom]TRPUUMOWba^fifgkkjkmqsrnlllnopsuvwwvtokcZX\djjhdceioqrponnoonljhhijjjjkjiiiihhjloppoooooonlkklmmlmmmmnmnnoppqqrrqoolnwxxwwxyxukmruvstwxspxomsurppmkkmmppe]fnppoorz}~xxvsrrrsstttttstsoljjkkklmnnljkjiiiijkkhhbjoleiklnoruvwxwutsrqppqrstsqjc_]\`abdiptvwwvvvwvqlnsqtvwvxwxyz{{{{{{{{||{{{z{|}~~~}vrqqstuvwx{|}}|zywwx{yz}|}{zyyzzzzz{{zyyxxxxxyyz{zzvqnrv|~|yxxxy{~}}}}~~~||{{{zvutsrqpppqqrrrrrrssrqrrstuvwwyyxttvwxxvuwyzyxyz{|}~~~}}~~|||}}||{zwtrpooppqrqpppqrvyv}vtttrpqv||unmoqqrrqqrstvspooruwxwwwwxy{{zz|~~}~~~~~~~~~~~~~~pppqqqqqrrrsstuuuuuttttttttttstssssrrrrstuvvvvuvvvuuutsssuvwxxxyyywvwuuuuuvwwwuutuvwvuuuuvwxxxyxxxwxyyz{zzz{zzxvutsqqpqrrstttssrqqrrqqqqrtvxyywvupnmllnnnnpopw~{yspoppooooonmkjhgeeghfdfgghijlnopppoppooooooppqqp`TOMTOELYaYZgdbeoolmorsspnnmnnoruuvvvurkbXYckligdcehloqrpnljfcddfghijkmmjhiiijijloqsrqqoonnmlmnnmmnnooonooppppppppooqrvwyxxxxwuqtwvwtswwttytsttrpoljjkmoqd_empqpopw~yqusrrrsttuuutttpkjiijkklmnnljkjjjjjjkjlob_eigklmnptwxxxwutsrqppqrssrokd`^^b`dgmqsuvvuuuutqqrrrrsxyzyyy{||||||||}}|||{{{|~~|urqprrstuvy{||{yxwx{}|}z~zzzz{{{{{||{zzyyzzyxxxxxwsopy~}zxxwxz~~~~~~}||{{{{{zxvusrqpooppqrrrrssssrqrstuwwxyxwtswxyxvuvxxwwwxy{||~~~~~~~~|zvsqpppqqrqppqqrstvz~~ysuttsrqru|{qljlorsrqqrtvtpmnqvxzyxwxy{}}{{}~~~~~~~~~~~~~~~~~~ppopppppqrrsstuuuuttttttsttttssssrrrrrrstuuuuuutuuuttsrrstuvwxxxxxxwvvvuuuuwwxwvuuuvvvvvvvvwwwwwwwwwxyz{zzyyz{zxvuromoqqrrsttttssrrrqqqqrtvwy{zxwtrqqqqtsqnnry|yspooooonoonnlkjhfecccdfghhiklnoponmoolllpqqpopqrcTMLTNCQbhZYc__cmpnoprtsqpommmopsttuuutncX\fnlllkgehjnpusmgb_beffghijlopkhijkkjjlmpstrqpnmnnnooooopqqqoooppoooooooopqqsuwwwwxwwvvvwxtrvvuvxwurnhgggffgknpfdgmpqpqrvtusrqrrstuvvttsnhhhjkkkklmnljkklmmkkihmvk^\bjmnmnpsvwxwwvtsrqqqrrssrplea_`caflqrrsuuuttsrqqstusu}}|zyy{}}}}}}}}~~}}|{z{{~~~ztqppqqrrstwyzzyyxxz}~|~x{y{{{||||}}}}{{{z{|{zyxxyxtrvz~}yvwvvx~~~~~~}||||||{zxwutsrqppppqqrrssttsrqqrtuwxyyyxutxy{yvuuwvuuuvxyzz{{|~}~~}|}~|yvsrqqqqqpppppqqrsttvwwvstttsrrxvnigioqqqrrrspkilqvxzxwwwz|}}||}}~~~~~~~~~~~~~~~}~~ooooppppqqrsssuuuuuuttttsttttsssrrqqrrrrsttttttssstssrrqrsuvwwwxwwwwvvvvuuuvwxwvuuuuvwwwwwwvvvvvvvvvwxyzzyyxyzzywvtonpqrqqrsssttttssrrqqrsuwz|{ywvuttttvusooqx~{xsponnnnoooonmlkjgdbbcdfhijklmoppomllkiijnqqonoprgWONXRL_modadb`bhnopqrstsrqnkknorrsssuvqcT[hmjqsrlgfhjospg__abdefgijkmrsmhhijjjkllnqtsqommmnopppqrtttrppppooooooooopppqsttuvxxwyvswwrptstturoieaaba`]]flkcgilnppqruwrqqqrsuwxwvtslghiijkljijnnkklnponkjjovrndajoommnruwwwwvtsrrrrsssssqmfb``bbhmqqrrsttssrqrrvxz{|}{yxy{~~~~~}~~~~~|zzz{}~xsqpppqqrrsvxyxxxwxz}|{x}wxy|||}}}~~~}{{|}~}||||{zvvz{z|}tttnimoru{~~~}}~}}}}||{ywvututrqqqpqqrrssstsrqrrsuwxyzzzywz{zxvuvvvuttuwxxyyy{|}~~~{|~~}}}}~~~~~}zxutrqqqqqqqqqqqqqqs{~wstuvvvvz~{unheinqrsrrrpiejpvxywuuwz}~~~}}}~~~~~~~~~~}ooooooppqqqrrsuuuuvvutttsttssssrrqqqqqqqrsststsrrrrrrrqqrstuvvvwwwwvuvvuuuuvvxwvuuuuuvwxxxxwwuuuuuuuuwwxxxwxyzzyxwusrrssqqqrrstttttsrrqrrtuwz|{zxwvvvvuuuusqqx}ywrqpnmmnnopponoomkhedefhjklmnnopomkjhhggimoonmmpoj`YSXSWiqpkihgcaeloprrstttsplkmnqqrrrtwtgS[ikisyupjghjnnkfaabcddfghikmqpjdgikjjkllmorsqolklnopppqtwwuspooonnnnnopppoopqqrsuwxwvzsqvytooopponmjfecddfhjkib`inqoopqqsy~xuqsqrtwxyywuskgkjjlntriglnkjkorrqmllnprxoeelnnnortvvwwvtsrrrsttttsqnhcaacdjlnpqqrsssrrsuwx{~~}|{yxxyz}~~~~~~~~~{yzyz}~~wrqqqqqqqrsuwxxxyxxy|~~}}zxxvxy|}}}}~~~|{||}||}}}|{vy|{}zw~xdde^Z_bghnu|~~~~~~}|}||{{yvutuvutsrrqqrrrrsstssrsstuwwxyz|}|}|zxvuvuutsstvwwxxy{{{{~}~~~zuvy|~~}|||}~~|zyvtrrrrrrrrrrrqrty|xuuwz{{{z|~}yskdbgnrrrssuunjqwxwtstvz~~~~~~~~~~~~~~~oooonoopqqqrrsuuvvwwvutssssssrrrrqqppqqqqrrrsssssssrrqrrrstuuvvvvvvuuuuutuvwvvvuuttuvvwxxyyyxwvutttttuvwwvvvwxyyxxwvvvvtrqppqrstssssrrrrstvxz|{zxwvvwwvvvvtrry}xvrqponmnopqqppqrqpnmkkklmmnoooponljigffgimnnmlklljgc__]epoponmnjfinpqqqssuuvsnkmmoqqrsuvwlU]ikjrwsplgfgijhdcddddefghikmqqjdfjmnnopppqstrpnlmnnnopqsvvusqonooooooopqqppppqstvxwvuvppvuqlilllloppmljknsxytg]]fimlkopqsv{|ywupqqsuxyzzxurjgiijlpzylfhlljkptuuqmmmmousjdbhmmoqsuvwvutsrrrstuuttqojebbehjklnqrsssrrsvz|}}|{zxxwwwxy|~~~zyyyz|}~}urqqqqqqpqrtvwwxxwxyz||}}|{zyzz{||||}~~~}{z||}|}}}|{zx{}}z|~s__^XVY\]ZX_luy|~~|{{}|{zzxuttuvvvutsrsssrrrsssssttuvvwwxy{||}{ywvuvuttstuvwwwxyyzxy}{{{}}}}ysstw{}~~}{{|~~~}|yvtsssssssssrrtuwz{||~~~}{{{~~|wphaahprrstz}wquyxurrrt{~~~~~~~~oooonoooppprrtuvwwxxwutssrrrrrrrqqppppqqqqrrssrrrrrsrrsssstuuuuuuututttuuvwxxxwvvuttuvvwwyzzzywvtsssttuuuuuvvvwwwwwwxxwvsrqpppqrrrrrrsrrrtvxz|{zxvvwwwvvvutstz~xurppoooppqrsrsttsssrqoopqqpoopppnljhc]\dinmmlljjjjihggfnvtqppponmnopppqrsuuwtpllmoqqruwuwn^bilmqsrpkhecdggdfigeddfghhjmtunggjptwxyxxxxywussrpnnnnopstsrqppppqqqppppqpppprtvxxvutsoosomkjkklnqtutssuyzyvpledfgilnprrsuzxtsxtoqsvxxyyxuqighnpmkuzpgejmkkovxxupommmptrmacjmnoqtvwvusrqrrstuuutrpkgddhkklmoqqrsrrquy}~~|wvvuvvwwwwz}~zyxyz{|}~ztqqrrrrrqqrtuwwxxxxxy{{||}}~~||z{{{{|}}~~}{{{|}|}}||{{z|}}~wwwpeca[ZZ\YUQXbjmqw}{yy{|zyxvtttuvwwvvuttttsssssssstuvwwxxwxyzzzywvvuuuuutuvwwwvwxxxwy~}{ywwxyyywtstuwxy|}{z{}~{xvtsttssssssssuz}~{zz|~|xskb]bkqrtw}{xyzxuqpqt{~~~~~~~~onnooopppppqqstvwxyywvtsrrrrrrqqqqppopqqqqrrrrrqqqqrssssssttuuuvvvuuuuuuuvwxyyxxwvutuuuuvyz{{{yxvutstttuuutuvvvvvvvvwwxxvutrpoppqqpqrttrqrtwz|{zxvvwxwvvvtttu{~yurppooopqqrsstttsttsrppqssqoooqqookeUAAVkoonnmihhhhiifcdkklmmooopqqqpooqrtttqomlmnopswwtqmgfknopqqmkieachigimjgedfhiijnqsokjjlrw}~}}}~~}{{||{yxwqoopqqrrrssttttsrqpppoopstvwvusssollmnnonnoqtuxxyyz{utsrrpnkjlpustutwvr~|rrtxyxvvvtpkjnwyqisztkggklknuz{ytromnotvuoffmlmptvwvtsppqqrtuvutrpmiffjnnnoqqrrrrsvz|||zxsqqssvwwwwz}~~zyyyz{|}~yurqqrrrrrrrsstvwxxxxxxzz{{}}~~|{yyyzz{|}~~}}|||{|||||{z{{}}zxtntwrljgcba^YVV]dc`_jwzxxzzxwwuttuuvwxvvuuttttsssssrrsuwxxyyxxxxxxwvuuuuuvvuvxxxwuvwwwwy}zzzxvutttttsrrssttuy~}zz{~~zwutssssttvwvvwy|}zxyz|{xtne\^eprty}|{{xuqpqt|~~~~~~~~~onnnopppppppqstvwxyyxvtsrqqqqqqqpppooopppqqqqqqqpqqrssttttuuuuuvvwvvvvuuuvwxxxyxwwvuttttuxz{|{{yxvutsttttuuuuuuuuuuvvvvwwwvtrqqqqqqqsutqppruy{{ywuvwxxwvutssv|~ztqpoppppqqrrrstsrsssqppruuronopopokbC:O`koppsngeeegiic[YZbhklnnoopqqpnoprssrpnlllmmnrwuqokhhkmmloliljdcfijilmlhefiorttuutsqpmjnrtsstuwyz{zz|tqonoqqsttuvvwwusqpppppqsuvvusrqpnlmpqrsstutuvx{{y|yuyyxvvtnmlmoruvuxw|{utw{{wtpptqmqsyzupw|yqidgkjlruxwvuplpqtwxvnijknquwwuspnnopqstuuuspnkghlpppqqqqrrsu{|{yxwuqmmpruvwxx{}~~}|yxxyz{||}}sqpqqrrrssssrrssuwwwwwxyyz{|}}}{zxxxxyz{|}~}}||||}||||{{{||zxtpuwzytrronlid^_dfbXU`nvwxyxwvvuuuvvwxwvvuuttttsssssrqrvxyyyxwwwwvvvvuuttvvvvwyzzwuuvvwx{}{xvvvuttsrqqpppqqrrrsvxz{~|zz{~}yussstttw{zyxx{~}{ywxyzzyvrk]^hqrtz~}|wtropt}~}~~~~~~~~~~~~~~~~~onnoopqppppppqruuvwwvusrqqpppppppppooopppqqqqqqpppqqrstuuuvvvuuuvwwwvvvutuuvwxxyxwvuutttuwz{{||{zxwuttssttuuttttstttttuuuvuvuuttttsstuupnmoswzzyvuuwxxwvusrsx|~zurppppppqqrrqqrqpqrrqpoqvxuronooook^GOeknonmmjcbbcfhhaWSU]fikkklmnqsqnopprrqpnlllmlnsurnljhhkjhehghmmhgjklklnmifjrxz||||{{}~}{vronmlnrtvvvuv{|vqnnpruvxyzz{zxwsqppqrtvvutrqponnprsssrpooopswyxsyvw|~|zyxsokklosvvwyvuszux}zwqlpopvvxxuuy|}yofdhijlllnrspkopuwxwrmjosuwwwvspmlmnoqsuuuspnljjnqrrrqqqrsvz~|wvutrplkoruwxyz|}}~{zzxxxyzz{{}{vsqprqqqssrsqqqpruxzzyyxxxz{||{zywvvvwxz{|~}}||}|}}||||||{xutsu|~~{vvvuuttqmlljd^Z^gpvwxxwvvuuvwwxxwttttttttsssssrpqwyzzzxwxwwvuuuuuuuvwwxxyzzxvuuvxz|{xvuutstutsqppopqqrrsstvwvw}}zwy}~yuttuuuvzzzyz|~|zyxxyz{{y{wb`puuvz|wtrpqu}~}}~~~~~~~~~~~~~~~~~onnnopppppooppqsttuutsrqpppppooppppooopppqqqqqqppqqqrstuuvvvuutuvwxxwvvuuttuvvwxxwvvvvuuvwyz{|{|{zyvutsssttttttsstttssssssttssstuuutrqrmkklptwxwvtuvwwvutsrtx|}zurqppqqqrrrrqppppqrrrqoqwywuqnonnlkc^hnnnlkifgdbabehhcXUWbijjjhjqphbjoopprrrpnmmlmlosqolkiihgffhjmooonllklkmmnlmovtstwyz{||~{yvtrtvxyxxwwyy{~~zsnmpsuwxyyz{|{xtrqqrtvwurqppooprtvwvsnhc`bjqwuokxzx{{zy{zurnmkmpsuutrt~wvvtw}||zrjjpxwwxvwz{{{qb^cijhfcdghhfikpsuuqmlpsuuuuuspmllmnprtuutqnmlloqqrqpppru{ystsrqommpsvxzz||||}}yxwxyxxyyz{}~{|yvsspnnokimoolijnsvwvttuwxz{zwyxwvuuuvyz}}~}|}}|}}}}}|{|xsrux{~{wvvvvwwwvvspljgfhlsvwwvutttuvvwwvsrrstttssssssuspwyzzyxwwwvutttuvvvwxxxyyyyxwvvwy{|{xvvvutuuutrqppqrrrsstuuvtswzzuwy~}xuuvvvvxxyy{}}{yy{||}}~lg{{wy}{vsqpqu}~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~onnnooppppoopppqrrsrrqpooooooppppppppppppqqrrrrqqpqrrsttuuvvuvuuvwxxxwwvutttuuvwwvvwvvvuuwxzz||||{zxwuttstsssttsstutsssstuuusrqrrrrpmlokjiknruuuutuvwvuusqrtxzzxurqqqqqrrqrqqpooopqrrqoptuuuronnnookjihlkiheehifdcehig`ZXciijkhinnc\hoppqrssqonmlmlorolkjjihhiknqtqppomlllklmmpomkjkiknpqsuy{z|{{yxxxz{{zzyy{ywz}{uonqsuvuuvx{|zxtrpqsuvvsqopppqrtvwwvtpia[]mvwncf|zzyxy{{tkopljlptvvuvy{xvtsx{{~}sjmuwvwwy{zsk_VUbknmieccbbccehkmmljkklmnoqpoliijlmoqtvutronnnppqqpoooqw}~xrrqpponpsuxy{{||zzz~{xwwwxwwxzz{~~|z{{|{unkkkc`gkkgcbflnnljkostuvvvzxwvvuttxy||~}||}|}}}}|zyxsswz|~zvuuvvvvvvvussstspmntuvutsrrsstutsppqrtttssssrsxwpvyyyxwwvvutstuvwwxxyyyyyyyyxxxyz{||zxwwwvvvvtsrqqrsssrstuuutstv{|ywxz|zuwyxvtuuvx{~~~|{{{|~tq~~{urppru}~~~~~~~~~~~~~~~~~~~~~~~~~~~~ooonnoooooooooooppqppoonnnnopppqppppppqqqqrrrqqqpppqrsttuuuuuvuuvvwxxxwvvuuuttuuuuvvvvvuuvwyz{{{{{{zxwvttsssssssstutsrrrstttsrpqrrqnkklkjjkmprrrsstvvuttrpqsvwvvtrqqqqqqqqqqpppoopppppnnopppppnmnok_[[Y^dffeehhgfeegijj`[dkmmlihjlfdkqppqrstusommmmoqmjjkkkkljgbjpoooomkkifghjeghiiihikmnppmlmowzzzzzzzzzzyyzyxz{{vrqsutrqqrtwxwusqooqrssqppqqrstvvwwwvsnf]`vtocht{{zyyz|uepvxsmnsuvvuw{xsmlnoqsy|}wtvzwuvwyo]SMXehnttsngdcddddfffgghijklkjjjjfcdgikmqtutsrqopppopponnory|wssrpoopruvz{||{zwwx}}ywwvvuuuuwwy}zxxxz}}yqigkecimkfbbgmnmkgiloonmpvyywwvvuuwxwy}{{|}|||||{xwsvz|}}~~}yutuuvuuvwvuuvvyzwpmqstsqonnooooonnoqstuuttssrswxtuxxxwvvtssstuvvwxyyzyyyyyyyyyzz{zzzzzzzyxwwvutsrrsttsrsttttssstuwyzz{|~|wxzyusrrtvwyzz{{z{|}~}{uqpqtz~~~~~~~~~~~~~~~~}~~~~~~~~~~~~ooonnnoonooooooooooonooonoopqrrqqppqqqrrrrrrrqqppppqqrsttttttuuuvvwxxxxxwwvvvuuttuvvvuvuuuuwyzzzzzz{{zywvtssssssrsttssssssssrrqrsttrpsronmmmnoooprssrrrrppqrssssssrqpooopppppppooooonmllmmmnoponlk`RQRQWaeedgihklkggilog^fnrrpnjikjjmppoqrsssqmjjklmkhijkkklmke`eklmnnliea]]]dfjllljihjmptvwwxwxxzzzxxxxxxxwwwxyzzywvvtsqoopqstssqpoooopqqqrssstuuuuvwwwtnffshgbq||ywwwwxz{zls|rotuvvuv}yniijhggmt|}|}yxriTEFZqtopwz{{uoljfeeghheeghkkkjfeffb`bdeehmqqpqqrppponnnnnops{~|yvutsqpprtvw{|||zywxy~~{xwwtsqpooqqsx~|urstwzz{wplonopppmlmrvvutrtttrniltyxxwwvvvvuqtzxy{|{{{{{yvtswy{|}~~}{wtuuvuuuuvuuvxy{{xupoqpomkkkklkklloqstuvvuutssstyyuvvwvutrqrsuvvwxyzzzzyyyyyyyz{{zxwwyz{{zzyywvuutttuuttuvuutsssssv{|{z{|~zyzwttuwxyyyyxyyz{}~{tqprw|~~~~~~~~~~~~~~~~~~~}~~~~~~~~}}~ooonnnonnoooooopoonnnooooppqrrrrqqqqrrrsrrrrqqqppoppqqrrsssstttuuvwwxxxxwwwwvvvutuuvuuuutttuvxxyyyy{|||zxvtttssssstssttuuuusqrrrsuvvuwvtsrqponnnnpqomnoooprqqqqqrrqponnnoooooooonnnmmmlmmmmnoooolcUMORU]deefhijossigiklheirvvsolklkkmnooprssoonhhijkhijhikklmljhjkkklljcZSPUY_jnooomlijmpsuwxyyyyzyywvwwwvvuuuvxxzyyxwtsrrrrssstssrqpppqqrrsrrrstttttuwxwusqk]chtztqqqqtvxx{wuvvwxyzwgggfeceq{}~~{u`I=Hbt{vtsw{|~}zxrlhcadeefgiklkigfffdbddcbdilkimoqpoonmmmlnpqu{|yuuuutrqqsvwx{||{yyy{|~{yvupmmlkjllnu{xolnnqsuxxvssstqpokkkprswz|}}zxunmpuwwvvvwxywtprvwxyyyyzzyttstvwy|}}|yvstuuuutvuvvvy|~|xxvppomjhiijkjklmqsuvvwwwvtsstuyzxuuwvusrrstvwxxxyzzzyyyyyyyzz{zxussvy{zzzzzyxvvvvvvwvwxywusrrrsux|}zyyz{}~|{zwvwz||||||zzz{}~z|ztrru{~~~~~~~~~~~~~~~~~~~~~}}~~~}}~oppoooonnnnnnnooonnnooppopqrrssssrrrrrrrrrrqqqqqppqppppqrrrrsstuuvwwxxyyxxxwwwwvvvwwvuuuttsstuvvwwwxyz{zxxvvutsrrsssrtuvvwvutsssstuvvwxwwutsrqpoopoljkmnnqrrqppppqponmmnoooooonnmlllmmmmmmmmnoool_PKOT[bgfdegiknsqeeiibgjkqutqmllkkkmmmnppqroqqkhhhiimlefiklmlllkkkikhbWLEFUedinpqppomnnopruxxyyzzyywwvvwvuuuvvxxyyzywwuuuuvvssuwvtsssssrrrrqqrssssrrrtuvuvvg\dmwvqnllosvxyx|xvwvwzudfha`fm{~~}{|xtb@-?f~{zywxz{}}{{xvogdccfgijjkkkjjjjiggihgijjhhkopnmmmnmmlmoruxyvrsttttrsuyxz{|{yxz|}~~}zuqnllkkjkkmtztlikklmppruvutrnkigdcdefnu{}~|{zwtrrsuuvvvwxxwttuuuvvvwxxztvuvstvy{{zwtrsttuuvzvvvwy}~}|{xtqolighjkkklmpsuvwwxyyxvtttvzzyvuwvutsstvwxyyzzzzyyyyyyyyzzzxvrppswyyzz{zzyxxwwvwwxxxywusrrstvx{|zxwxyz|}}|zyxyyyyyz{{{{{|}~}y{ustx}~~~~~~~~~}}~~~~~~~~}}~oooonnnnmnnnnnnonnnnooopopprssstttssssssssrrqpqqpqppooopqqqrrstuuuvwwxyyxxxwxxwwvwxwvuuttssssstuvwvwwxxxxwvuutsrrrssstuuvvvutttsssstuvwwwvuuvutsqrpmjklmortrqppppppnmllmnnnnnonmlllllmmmmmmmmnnol_OKS\cghfddgiklojbchh]gikosqnllllkjlmmmnnnoqqkfffegikliijllllkjijkjkbPD==H`mgiooqqqpoopopruwwxyyxxyxxxwvwvvvvvwwyyyyxwwvvvwvsssstuwvvutsrrrqpqrsssqqrstsrswrfgqvrnkigmuwyzx{{xvvvvwzsmqqdeox}|{zy|}N2-Ux~~}{y{{{z{{xohddegiijjjjkkkjkjkjjkjkkjihjnomlmmmmlmmprxtutrsssuvttt{zz{{yxy{~~~|yvsrrrrponmmmtwplikkkjmlnruvsqmjgfcba`_ciry|{||{ztsrtuvvvwwxxvvussttuvwyywzywtssvxyxusrtttuvz{wwwz|~}|yusrmjijklllmosuvvwxxyzyvutuy{{ywvwvuuuuuvwxxyyyyyyyyyyyyyyyxvspnoruxzz{{{zzzyywvvwwxxwvutsrstvxy{ywvvvy||}~|{yyywvwxyz{|||}~{|{wvx|~~~~~~~~~~~~~}~nnnnmmmmmnnnnnoonnnnooopooprssstutsssssrrrrrqqqppppppppqqqqqrsttuuuvvwxxxxxwwxwwwyzyxwutttstsstuvvvvvvvvvvvuttsrrrssstuutuuuuuuussrsstuuuuuvwvutsrpnmlmmptvsqpppoonmllmmnnnnnoonmllmmmmmmmmmmmmnndRNXbhiigddhjlkhbabcecimopuqljkmmkjllllllllmljkidadikmmlllkklkjijkmn^E:;EXmrmnpopqqpppqqrtuvvwxxxxyyyxwwwwwwwwwxxyxxxxyxxxvurpprrrstuvuuttsrqqrsstrrrqqqqswypjqpkigfdkuwyyxxvuvvuuvvvx|xz~xhju~}{zz{{~G)Cr~~~~}{zyyy|{xphdfijkkiihijkljkja`hllmmmlkknpnjnmmmmmmqtupusssttvwwvu}|{{zwxz~~~|vrruxz{{ywvtrqstqomnnmkkmmquvtqnkhfdccdccemtxyzzyyuuuuvvvvvvwwvvusrtuvuvyy}xusrtwwvuuuuuuvw||ywx{}}|zvuupmkkllllnrvwwwwwwxyyxvuvy|}|zwvuuvvvwwxxwwxxxyyyxxxxxxxxvtrpooqruwyzzzz{{zxwuuvvwwwvuuusrtuvwywvttux|||~~}{zyywvwxyz{|||}~~}}~}|{yy|~~~nnnmmmmlmnnnnooonnnnoppqpopqrrsttssrrsrrqqqqqpppoopqqrrrqqqqrssttuuvvvwwwwwwvwwxxz{{yxvtststtstuuvwwvuttttttssrrrrrrrsttttuutvuutsstsrrsssstutssqponnnooqvvsqqqqpoonmlmmnnnoopoonmmmmnnnnmmmllnqpjUQ]fikjiefhkmlifhhhjkoqsqvokklnnmlllkjjjjjjhipkc`djlmnnlkkkklkjkmoobGBs}z~~}{y{~tmifekrpmghjmslgedfgikh[@DF8+1D\hllmkptromlllkkmmlstqqrtvx{|||~~}{xy{|||zywwxyz{}}~}~}|zyywvwxwsppuxyvutrpljkllnoopqqpooopsuvwwwvuttuvvwwwx|~|ywvuuvwvutrrrstux{{zyxyyz{{{||}~~~~~|yxy{vmmihjlpuyzyxwvuuvwxxyy{}~~|yvuuvxzzz{{zywwyyyxwvuuutttssrqpomlkmqwzzz{{ywvuuuuuuuuuxz{wuttuvttsstu{}}||}}|{{zzyyyyz{|yyz}}|ywuv~}~}}nnnnnnmmnnnopoonnnopqrssrqpqpqqqqqqqqqqqpoooopppoprtuuussrrsstuuuuuuuuuuuuuuuuvxxz{{zxvttssstuuuvvvwxxwusrrrrrqqqrrrrssrrsstuvxxwutsrqpoonnopqqqponnnnopuxsrtvvtrrqpnmmmlmnnnnnnnmnnnmmmmmmmmnptsoZ\ejkklmjjkmnooonooprrrrqomlkkkjjjjjijiijihhikighjkklmnmlkihjjkmlj_Q@@Semoooqqpppppqrssssuurtvvvvvwwvvvvwxxwwwvwvusnkklmortutrpttrpppqqrrrrqppqrtxzzxvuttuvwwqhedbaenvwwvvwwvvuuuvvxyz{|||zyyxxyyzzzyzxyyI[x{||zxy|xwtoiiihhfgkqrigfefijkmiQIGCHKKLKSbnopsqollllllmmmqpqtqwwz|~~|zyyxxzzxwvwwxxyyzzzz|}|{ywwwvvwxvsruuuttttspnpqsttuttrqnnprtvwwwvuutuuuvvwwz}yxvvuuvvutsstrru{}}}|{{{{{|}~~}zz{}vookgilqvyyxxwvuuvvwxyy{}}}|zxvvwyz{|}~~zxxzyyxwutttsssstsrqonljjnuyyzzywvuuuuuuuuuux||yvuutssttstw|~~}}}}}}|{{{|}|zyywux{{zywuvz~~}}~nooonnnnooopoonnnopqrstttsrrqpppppppqqqppoonoooppqsuvwwutsstttuvuuuuuuttttttttvwxzz{zyxvutsssuuuvvvwxyywutsrrqqqqrrsssrrrsttuwyzywspooonnmlmopppppooooootwrtyzxusrqpoonnmmmmmmmmmmnnmmmmmllmnoprqndehlmmnonnmnopppppqrsrqqpnnljhgghjjkjjjjjihgijjijjjhiloomkiiiijkmgYNBMajmoppqrrrqqpprrrrswvrsuuttttttuuuvwwwwvvvusrkc_`hmosuusqoopnoqqrrssrqpppqswzzxvvvvvvwvqhfebbgpuwwvwxwwwwwwwwxxyz{{{zzzzyyxyxxxywxtViwy{{|}{tpsxy{||yrkhggiovn`_]\\alhchq^BEX]WUV[clqqqpnllmmmmmnnopotpuvz}~|xvwyuuxxwvvvvvwwvwxzzzxyxvttttttuutsrqsqqstsqptuyzyyxwtroptuvxxwvvuutuuuuvvwy}|{yxyxwxxxwvutwutw~~~}}}}|~~~|}}|vpqnghksvxxxwvvvvvvwxyyz{|||{zyxxy{{|}}}{{{{yxwvtsssrrrsttsqnkjhhkswyyxxvvuuuuuuuuuvy|{ywvvuttutrsz}~}}}}~~}}||{wwuuvxyyzxwxy|~}~~~~~~onnnnnooppooonnmnopqrttuttsrqqpppoopppqqqpppppqqpqsvwxxvutttuuuuvvvvvvutsststtuvwyzzzzzwvusstttttuuvwyyyxvutsrrrrstttsrsstuuvxz|{zuqpoonnmmmnoppppooopoorspu||yusssrqqpoomllmmmllmmmmmmmmmmmnoooonkkkmnnooononoppppppppqqqqnkjhfefiklkjjjiihfhikkkkjhfgjnpnljigfhimeTLF`kknrqqqqqqppooqrrsuwvstuutsrrrrsstuvvvvvuttttneZZdilrvxwtqqqlnqqrsstsqppppruxywvuwxvvvundcc`cirvwwvwxxxxxxxxxxxyyzzzzzzzzyxwvvvwxvpgpvxywwyxrmpvxyz{uqnlkmrfUNEEKRX\XQ[onXA;=C=8Kjsrlkmpsttuvwwwxz{|||ztljjkkklnpquvwxxwvuuutrmjmlotvwwvvuutuusqqqrrponmllkkklmmkkmquvvvvlcussrrrsssrmfdfisttttvwxxxwwwwvuuuvwyzzxunhmrr~zzz{{zz{|zywvtstuwyxusrrrpnmnqrttuuttsrqrrrrtvvuuututtuvwwypu{uuwwwwtrtssssuvvutuustuvwyzzyxxz{||||}|wrpqrrstwz|}||{zyxwwwxyyxwusvx{|{xtv|{}txy{yvutttuuvwvwxxxwvwy}yvvuuuuvvvuvuux|~~}}|||}}}~~~|{|~~~~~~~~}vvvvwwwwwvutttttuuuuuttttttttttuuuuuuuuuuuuuuvwwwwvvuuvvvuuuvvvvvvvvvvvwxxxxxxxxwwxxxxxxyyyxxwwxxyyyyzzz{zzyyzyxvuuutsrqrsstrppponmlkklnnopqqppppppponnoppppoonnmkjkllkigeegjlljjklmptwxwtqppqrrqqppqqppoonnnlllmnnnnmmmlkkkkjkkjjjjjkllmmnnooorrqpnqsnhhlmUFZosrrrtvvph\KTefilpqponmlllmnoopqpnmlnpqsssrsssrqonoqqrqpomkkloqnkihhiikkkiiiihhgffggfghkcO?88;E<7Mkqkiilpstttwvwtoqv{|}|wpkjkkklmnpsuvwwwvuuvtlhknptwyxwyxvtsrpmlllmlkjiijkkklmnnmmnmouvvxsksrrsssssroh`^^aqtrrsuwwxyxwwwwvuuwxyyyywpglqs~yzzz{{z{{ywutstvwx{xutuwwtolmqrttttssrrrsvuuuvvuvxvutttuy}|xzyp|xuutssssttstuuvttustuwxz{zyxxyzzzzz{{vsqrrrrtw{}||{{zxxwwvwxxxwttux{}}|xw}xzxyz|zwvtttttuuuvxz{wvyz}~xvuutuvvvuutssw|~}}{{{{|||}~~~~}~}}}~~~~~~~vvvvwwwwvvutssstttttttssssttttttuuuvvvuuuuuuuuvwwwvvuuvvvuuvvvvvvvvvvvvwwxxxxxxxxxxxyxxxyyyxxwwxxxxxxyyy{{{zz{zzxxvutrqqqrrrrrqpnljiiklnnpqqppoooppponnnopqpoonnmkjkkljhebbeilmkkmomptxzzvrppqrrqqqqqrqqppooonmmmnoonmmmmlkkkjjkjjjjkllmmmmnnnnpqqiTL\dfioseR`tvsrstvurl]KVggilooonmllllmopnlmmnmmoprrrrssrrrqppppppqpomlkmpqpnljihhihhhhhhghgfffgghjeUA:89>G<7Okkdgjlnqsssuuuohjqw{}}zunlkklmmnprtuvwvvuvwthhlquxyxzyvrpmlmqttrpomkjiiklllmmooponiiptvwuqrrrstttroja[ZZ]rurqquwwxxxwwwvwwwxyyzzyxtjmrw|xyyz{{{{zwusrtvxzz{ywvxzzwomnqrsssrqqrstvyzzzxwuuxwwvusrvy|{{ys}yutsssssssttttusttstuwxzzzyxxyyyyxyzyutrsssrsvxz{|{zyxxwvvvwwwvttux|~}~wxz~|xwuttttssttw{~yuz~ywuuttuutttsux|~~{zyyyzzz{{|}~}~wx}~}~~~~~~~~~~~~~vvvvwwwvvuttttttttttttsssssstttttuuuvvvvuuutuuvvvvwwvvvvuuvvvvvvvvvvvvvwwwwwxxxxxyyyyxxxyyyxxwvwwwwwwxxxzzzzzz{{zyxvtsrrqqpppqqqqnjfhkkmmoqppoooopppponnooppooonmkjjjkjgdaadgjmmnpqnotyzzvsqqqrrrqqrrrrrqqppppoonoooonmmmlkkjjjjiiijkkllmmmmmmmoprs_KWglnqtqijsvsrsuuutp_KWhhhjkkjjklllmoqrpnooonoppqqorrsssssrrrrpoooonnmnoponlkjigfeddfgihggfffghihWD:99<@E:8Pjnmpollnpsstwrjiknsw{}|wokjjllmnnqstuvvvvvvskjlnqtutrnjjjjknqtutroonmlmmmmmmnpqqrnhfiouuussstuvvurmbXWXW\qvtrqtvwxxxwwwwwyyzzz{{wzwposz{yyz{{{{zxusrsuxz||{yxy{}}yqnoqrrqqppqstwy{|||{zvuwxxywvssu{|{yw|vutssssssstttststtsstvwyyyxwxyxxwwxyyvtsttssstvxyzyyywwvvvwwvvutuvy}yx}{xvssssssssstwz}u{~}xvutssssssrrv{{yuttuvwxyyzz{|}~}os}~~~~~~~~~~~~~~~~vvvvwwvvvutttttttttttssssssssssttttuuvvvuuuuuuuvvwwwvvvvuuvvvvvwvvvvvvvwwwwwxxxxxxxxxxxxyyyxxwwxwvvvvvwwxyyyyyz{zyyxwutsqpppoopqrqlijlkllnpqpppppqppponnnnopooonljiiijigdbbdeilnoqrootxzzvsqqqrsrqrrrrrrrqpqppppppppponmmlkkjjiiijjjkklllmmmmmnpqrupacnpqrssrnpusrstttutbJVfhhhedchkmnnnprronopqqqqrrqonqrsstutuvusplkmmoonooonllkjgffebbfiihhffffhg`I;89:<=@B@9?YqtsrqonlkjklnollmmllmqyzupnmoqqqppqqrsssssrrppppponnnossrswwyzyvtrpnkifeeirvsrrrrqponopqrstuvvwwxxwvZGFINXrvttsrstuuvvwwxwusomkntzuv}}|{|{{{{{{zwuwz}~}|||||||}}|zwwy|zukqsv{}}}~~|||~~~{xxxzz{}~}|{xtrpnmmnnooopqtuvvussssstssssttuvwxxxwvyywuvxyyyyzyyxxwwvvvvvvvvvvvw{|yxwwwtpnnoqrssrrrstvy}{yxxxvutsrsuyz}}{yvsuvwtswxz{||}~}}||}~~~~}~~~~~~}~~~~vvvvvvutttssstttuuuuuuttssstttttttuuuvvvvvvuuuuvwwwwwwwvvvvvuuvwwwwwwwwvvvvvvvwwvwwwxxxxxxxxxxyz{{zzyyxxxxxxwvwwwxvvvvuuttrqonmlkjjkmnopqrsssssrqponmmnoponooppppoonmmmnrpoqpoopppopruvrpkjjlnnonnopqrqoprqqqqqqqqqppqpnmlllllllmnnnnnnmmllllllmlf_befjmnprssrrtuvvvvuuulPEVciggfeefgiiga\[^flpplihjjoqonprsttvxyzzyrljjjjjihhjmopnmkidksna_cefefgi]H;8<>@A@;DasssrqqoljjkmnnnnnnnmmovyusqqrstssrqrsssrqqppppppqonmnqurmmqtyyywtpkhfeddbdirrqqqqonnmnoprrtuvvwwxwwvZEEGLWqvttssrrstuvvwwvsplkmrxwrx~|||{{{{{{{wvy|~~~}||||||||}{zyyz||wlswy{|~}}}{{{~~~{zxxyz{|}}~yvrpnlklllmmmnpstuuttsssssrrrssssuvzzzyyyxvuvxxxxyyzzyyxwwwwvvvvvvvwx|}{yxwusqqpoonoqssrrrstuw{~ywwwwvuutssvyz||}}{yzyyuruvwz||}~~~}}~~~}}}~~~~~~~~~~wwwwvvuttsssssttuuuuuuuutttuuuuuuuuuvvvvvvuuuuvwxxxxwwwwwvvvuuvwwwwwwwwvvvvvvvvvvvwwwwxxxyyyyxyzzzzzzzyyyyyyxwxxxywwwvvvuusrpomkjjjklnoqqsssstsrqqponnoqponopppqppoponooqrrqpppqponorvwuromlmnonmmnpqqpoorqqpqqqqqqqqqpnmllmmmmmnoooonnnmlllllllg_W]b`djnqsuutuutuuvvttswhNK^gfffdcbbceed`[V^imkhffiimonnprrrsuwxzzysmjiiihgffimooommlehruiabegghifVA99<=>?>??>HdrssrsrqnlllnopqqqppooooruutsuusrrrrsrrqqpponopqqqpnnmlmmmllllnonigedcbcdefggffikmopplmmmnpprtuvwxvuwwkQIFJSnutyxusrrrsuvwwvsmifksutu~~}||{{{{{|{xx||||||||||||||{{{{|}~}ytxz|||}}}}{{{}~~||yyzz{{z|wqpnllmlllkkklnprssttsssrrqqqqpoopu|~}yvusrqrstvxxxxxxxxxxwvvvvwxyyy|~{yxvsqonoptxpoorvttsstuvx|~|xwwvuttttsrtvwy|~}|{zwtpt|{|}}~~~~~~~}{{}~~~~~~~~xyz{|zxwvussssstttuuuuuuuuuuuvvvvvvvvvvvvvvvvvwxyyyyyxxxxxwwvvuvvwwwwwvvvvvuuvvvvvvvvwxxxyyzzzzyyyxxxyyyyyyyyyzzzzyyxvvvuutsrqomllmmnnnopqrstuutttsrrrstsqpqrrrrrrrqqpppnnoooqrrrrqqsvxxvsqpppqqpooqrrrqqqqqpppqppppqqpnnmnnnooppqpppoonnnnnnnmi_Y`cb`empqppponpruwwvtstvxoXV^^__``abcdhigdefc`abccbbejlnpqqpprvwyxwrliiijjihhjklmmmnogejrqjefjlljgYE<;>@@>AVostrrrrqnmmmoqrrrqpppoooqtttrttsrqrrrrrqqppppppqqpponmlkkkmlkijkkhedcbbcdfhijhfhijlnrtsnllmoqstvwxvvwxs]IFGOlssuttssrstvwxxwtng^gsvrw~}|{{{{{{|{xy||||||||||||||{{{{}}}}{x{{|||}}||{z{}}~}}{z{{zyyy|rmnllmlllllkkkmoqrssssssrqpqqpoonnt{|yvssqnlmortvwxxxxxxxxwvvvwxzzzx|}|zxvrpnnnosyuqorwvvvuuuvxz|zxwwvuttttsqruwy{~~}|{yvru}}~~~~~~}|{|~~~~~~~~~~~~yz|~~}{yxvtssssttttuuuuuuuvvvwwwwvvvvvvvvvvvvwxxyyyyyxxxxxwwwvuuvvvvvvvuuuuuvvwwwwwvvwwxxxyzzzzzzyxxxyxxxxxxyxyyyyyyywwwvvutsrqonnnooonnoprstttutttsrtuvuspqrsrrrrrqqpppopqqpqqrturqtwxvtsqqppqqpooppqqqppooooppppoonnnmmmnnoppqrqqpppoooooooomi_]ddbbjrsqnmjgejpuwwvutqrup`\^^^_afgfffhhgec`^^`bba^_djlmnppooquvyxvpkjklllkjjkllkloonihjpqoliknmjgXE>AB@?>E^nopqqqrqonnnpqrqrqpppponpsssrtssrrrrrrqqpppoopqqppoonmmlkklmmiijjiggedccdgjopjgjlkiijlnlijkmoqsuvwvuvyxdIEGPjutnoorrstuvwxxwvpfYaryqv~||{{{{{{|{y{|||||}}}}}}}}|{{{||}}||{|||||||{{{{|}}~~~|{{{ywvuwmjmllllllkkjjkmoprrsssssrrpqqponmmov{ywwutspmmoqrrstvyyyyyxwuuvwx{|{x|~~}{yvronnnopyytpswx{zwvtvxyzyxwvvvuuttrqqtvy|~}{{{{yvv~~}}|}}~~~~~~~~~z{}~~}{ywutsssttttuuuuuuvwwxxxxwwwvvvvvvvvvvwxxyyyyyyxxxxxwwwvuuuuuuuuuuuuvwwwwwwwwwwwwwxxyyzzzzzyxxxxwxxxyyyyyxxyyyxwwwwvutsrqppppooooopqstttttssrstvxwtqpqrqqqrrqpoooppppppqrtxtrswyvtsrqqppqonlnnoooppoonnooooonmlkkklmmopqrrrqppppooooooomh``bbchouuspmjdbhmtvvutsrqsnb]]]_afiiigggggec^\^`aba^agkllnponnoswyxuplklllmmlkklkilokfgfkprutnmnnjfW@?CCA??G\mnnmnqqqpnnooqqqqqqppponpqqrsssrrqrrrrqppponooppooononmlllmmllkdhmmkgfgfdfjljffkpsrnigghggiknprtvwvvwxvfIFLRjvuqppqrtuvwwwxwwrhW]oxqv~~||{{{{{{{{z||||||}}}}}}}}|||||||||||}||||{{{{{{|~~~}|{zyutspmklllllkkjjijkmopqrssssssrqpponmlllrvxwxvvusqqpooppu{}{zyyxwuuuvxz}|vz}~|yuqpnnoorwxustxy}{ywuwzzzywvvvvvuusrqqsvy|}~~}|{{{|}{{~~~}~~~~~~~~~~~~~~~~~~z|}~|zxvuttttuttuuuuuuvwxxxxxxwwvvvvvvvvwwwwxyyyyyyxxxxxxxwwvuuuuuuuuuuvwwwwxwwwwwwvvwwxxyyyzzzzyxwwwwwwxxxxxwxxxxxxxxwwvuussrrrqppppppprsttssrrrstxz{xspprqqrrrqpoopppoooopru{vsrvvtsrrrqoopnljjklmnnoooooooonmlkjiiiijloqrsrrqppppoooooonlidc_]fnrvwvusmfdhlrtussrtspidbaaeinomkhhghgeb]]^`aaaciopkimnmmlnruxwtqlkmmnonmlkkkhkkc^_ajprttqoomjdS==CCA?@J_kllklpqqpoonooppppqqqppoooqqssrqqqqqrqqpppoonopqpooooonmmmlkklliccjqmnqqppnnmjhhhknmjgeffggilnqrtuvvwxvkRKMWlwvsrrssuwwwvwwxxtl[\ktqu}~||{{{{{{|{{||||||}}}}}}}}||||||||||||}}}||{zzz{|}~~{yxxwsnlkjkkkkkjiiiijkmopqqsssrsttronmlkjihmtywvvutttsqoqu{}}zyyyxwuttuvwz~{ux|}zurpnnpqsvxwutxz~}{yvx{{{ywvvvwwvutrqqsuy|}~}}||||}~~~~~~~~~z|~~~~}{zywvuuuutttuttuuuvwwwwwwwwvvvvvvvvwwwwwxyzzzyyyxxxxxxxwvvvvvuuuuuuvwwwxxxwwwwwvvvvwwxxyyyyyyxwwvwvvwwwwxwwwwxyyyyxwvwwuutssrpqqqqqqrsssrqqpqrtx|~|vqprqqrrrqqpppppnmmnosuzvsruxusqqppooonkjijklnooppoooonmlkihhhhhiknqsssrqppppoooooomljiib`hqtvvvwtqmjlmpqqqqrttqmlmmnqrsrolhghigeb^^_aaadiosj[enomklmqtwvtolklmnoomlkkjiib[[XXainqqqqqokh\K?>AA@CQdlllkloqqpoonoooopqqqqqqqpoqqrrqppppqqqppooonnopqqpppooonnnljjmpjdfnsqqtvyzywvtplfdhhhggfggfhjnpqstuvwwvteTIYmvutssttvwwwwwxxyxshafoqv}~||{{{{{{{|||||||||}}}}}}}||||||||||||}}}|{zyyyz{|}~~~~}{xtxyqmljjjjiiihfggikmoppqqrsrrrvwsomlkihgelv{wtssssuvwxz||yvuwwvvussstuwy}ytw{~{vrponpqtvxwutvx|~|zxz|||zywvvwvvutrqqruy|}~}}||||}~~~~~~~~~z|}}}|{zyyxvvvuuuuuutttuuvvvvvvvvvvvvvvvvvwwwwxyz{{{zzzyyyyxxxxwvvvvvvvvvvvwwwxxwwwwwwwvvvvvwwxxxyyyyxxwxwvvvvwxwwvvwxxyyxwwxywvttsrqqrssrrrssrqpppqrty~yrprqqqqrqqqqpponllmnqsxtqsvywspnnooonmkjjjklnopqqpoonnmljihhgghiknqsssrqppppooooonlllmmjjmruvtrssrponopppppprqpppqrstssrqnjiijhfc^^addafosnZF_qrkijmpsvusokkllmnnnmljjih]NNUZ_dlpoorrokklgP@?@AK]immlkkoqqpoonooooppqqrtttsssrsqqpqpppppoonnmmmopqrrqppooonnmnnqtgksvwtrssv{|ywvsogceffffffffgimqrrstuwwvyt_J[mustttuuvwwwvwxxyywqkjnrw|~||{{{{{{{||||{||||}}}}}}}||||||||||||}}}|zxxxxyz|}~~~}||yryymmqplkigggfddfjlmopqqqrsrqqrspnlkihgeakyyuqpqqsux}}xqooprrrrrrrrrsuyz{wx{|xsqonpqtvxxvuuv{}{y|~~}{zxwvvvvutsrrtuy|}~~}|zzz{}~~~~~~~}~~~~~z||||{zxxxxxwvvuuuuuutsttuuuuuuvvvvuvvvvwwwxxxxyz{||{{{zzzyyyxxwwwvvvvvvvvvwwwwwwwwxxxxwwwvvvvwwwxxyzyyxywvuuvwxwvvuvwwxxxxwxxwuttsqqrsttsssssrqpppqruzysqrqpppqqqqqqqommmmnqqrqonnoonmmnnoonlkkkklmnoqqqponnnmljiiihiijlnprrrrrqpppooooonlkmnoopqrrssssusponoppqppoooonmllklnqqppomllje`\\`fechqr^I?Ujlihlnpsvtplkkkllmnmmllkjii_NPX__]jrnqsplmt|hFBADThpqpnmlnqppoonoooooppqrtuutsrrrpppppnlmqrjikklmnpqrsrqqpoonoooponkszzxvtrqrxyyxvsskeddeddeeegilpssttuuvww{vgL]ovtuuuvvwvvvuvwxyyyurmprx|}||{{{{{{{||||{{{{|||||||||||||||}}}|}~~~{zwvwxyz|}}}}}|}zszyrrwvljifeeff`gjlnopqqqrsrrqppnlkjihec^izxsonoprux{xtnkjlnooopqpppprtww}xq|}ztqonpruyzxwvvv{~|z|~|zywvvuutsrrrtvz|}}|zxutstx{~~~~~~~~~~||}}}~~}~~y{{{zyxxxxxyxwwvvvuuttsssttuuuuuvvvvvwwwxxxyyyyyz|}}|||{{{zzyyxxwwwwwwwwwwwwwwwwwwwxxxxxxwwvvvvvvwxyzzzyyxwvvvwxwvvvvvvwwwwvvttuttsrrstuutttttsqqqrrsv{ysrrqpoopqqqqqqponnnnooonmlkkjkklnnoonmlllmmmnoqqqponnmlkjjiijjjklnpqqrrrqpppoooonmklnqtuuusppqqrrqonnoqqrqpolknnqplhlopooqqqppmgb\Z_ddfmupXEBRbfhkppprurmjkkkllmnmmmlkjjkjdYPQWXamkptpnpx~pMABGZovvuqpnoqoonmnooooopooprttqonpmkoppojgfjjedfgilnqrstssrqpooooonnlsyyxwyvtrptwxyxuwrjefdcdddeimpsuuvuttvwwzwmS_ovvvvvvwwwwvvvwxyyzxusttx|~||{{{{{{{{|||||||||||||||||||||||}}}}~~~{yvvwxyz|||}|||~{x||yy{wkjhdaced\eknoopppprssssrqoljihheb^izvqnnoqrtvvvrpnmmnoonoppppppruu|yt}~|xsomorvz{xwvwx~}|~}{zwuutttsrrrtwz{{zxtqomkklr~~~~~|{{{|~~~xyyyyxxxxyyyyxxwwwvuutttttttuuuvvvvwwwwxxyyyyyzz{}~~~}}||{{{zyyyxxwwwwwwwwwwwwwwwwwxxxyyyxxwvvvvvvwxyz{{zyxwwwwwvvwwvvuvvvvutstttsssstuuuvuuvutrrrsstx}ytrqpoonooooppqqqpponnmlkkkkjijkmnooonmmmmnooopqrqpponmlkjiiijkkllnpqrrrrqqponnnnmlklosvxyyusqponomonnnqrrrrpnnonlilqrqpoooqrssqmi^Z^cdjsumRBL\cimnooprurmkijklllllmmmkihhikh]POYbhkqrooqsojVGDI_txwusrpoonnmmnnooopponpqrrniknhgnppmic_`ba``bejnqsttssrqponnopqrruwwxyywvtrruwyxwwvrkhfddefinrsuvwwvttvwxxvs`dovvvvwwwwwwwwwwxyyyxxwwvx{~|z{{z{{{{{{|||||||||}}}}|||||||||||}}}~~{yvvwwyy{{{||||}zy{}}|}vhgd___a`Wckmoopppprsttssqnlhfffc`_evsooopqrsuuutsqpppppooppooopqssxzz}}zupnqtx{{xwvx|~~}}~~|zwvutttsrqrtvyzxurpnlkigem~~~~~~~~~~~}|||}~wwwwwwwxxyyzyyxxwwwvvutttttuuuuvvvvwwwxxyyyyyyz{|}}}}~~}}|||{zzzzyyxxwwwwwwwwwwwwwwxxyyzzzyxwwvvvvvwy{{{{zyxxxxxwvwwvvuuuuuvutuuuutsstuvuvuvwuuussttuy|}xsqqponmmmmnopqrrrrqonlkjjjjjiikmoooonnnnoopqrssrrqqqomljihhijkklmoqqrrrrqqponmmmlkklorvyywuutqnnmlmqonqrrrrrqplijjpvvtspooprtutrnaW^dfnvumWFRbdjnkhilsspnkhgjjkkkllljgcbdeffecRV_ejpllmljghbQCHduxusrqnlmmmnnnnoopqrrqqqpojhlmhhmnnje]XV\b^[_bglprsstssrpnmnprvyy}zsuwyxwusruvxxwwwtpkgecdiostuvwwvroruwxvtxijpuvvwwwwwwwwwwxxyyyyyyzxw{~~zyzzz{{{{{{||||||||}}}}}|||{{{{{{{{|}}~~{yvvwwxxzzz{{|~|zz}~~|vhf`VVZ]^Ubkmnnooopqrssttqnkgcba^[\domoppqqqrsssssrrrrrqqpponnnoprquw|~{wqptx{{zxww{}~}|{{{{|{zywvutssrqrtvywsrponmllifq~~~~~~~~~~~~~~~}}~vvvvvwwxxyyyyyyxwwwvvuttuuuvvvvvvvwwwxxyyyyyyyz{|~~}~~~}|||{{{zzyyyxxwwvvvwvwwwwwxxyyz{zzyxwwwvvuvxyzz{zyxxxxxxwwxwwvuutttuuvwvuutttuuvvvvvvvutuuuux|~}wrpponmllllmoqqrsssrpomlkiiiiiikmooonnnnopqsstsstttttqnkjiiiikklmnoqrrrrrqqponmmmlkjknquxwusutroppsjmnorrrqrrrpgekptutttronoqstusqeW\ejrvupgRZa[gheecipplmmkiiijkkkklifdbcbccce\X\cgjjjihfefkdGIguwutsrnklmmnqonnoqrrsssqomihllijlljfa\TR\a^Z^`dioprssssrpnmnpstwwyzwwvywvussuvwxxxwuslfdcckuvuuvwvqifmtwwwvwplpvvvwwwwwwwwwwxxyyyyyzzywz}}zxyyz{|||||||||||||}}}}||||{{{{{{{||}~~~{xvuwwwwwxyy{|}~{z{|}}|xpf\IMTY\V_mlmnnnnopqrsvvsojd_\YTQWpuopppqpppqrsrsttttssrqponmmnoqqtv|~~|zvtx}}zvzyy}~}{xwwwwxxxxxwusrqqrvxyupooonlnsrgw~~~~~~~~~~~~~~~~~~~}uuuuvwwxxyyyyzzywwwvvutuuuvvvvvvvvwwwxxyyyyyyyz{}}}}}~~~~}|||{{{{{zzyyxwwwvvvwwwwwxxyz{|{zyyxxxwvuuvxxxyyyyyxxxxwwwwvvvvuttuuwyxwuuttuuvvvvvvvvuuuuux|~|uponnmmllkkmnprsttsrqpnmljjjjjjlnoonmmnnoqrtuvtuuvvvvspljjijjllmmnoqrrrrrqqppnnnmlkjknruwurptutssrmdsssrrrrqssogfmsurkiiiloppqrutrmYYgpuuspq_]UYgabha]ijccdhlljjjjkjjihgefecabdc[ZchiiggggghqtROowwvvwvoklmnrupnnoqrsstvrkikmmkijkkhd^ZQPZ_\\__bfknprsssqonmoqsuuvx{xwwxwvvtssuvxxxwwvkedeblwvvvvuvngdkrvwwwwsnrwwvwwwwwwwwwwxxyyyyyzzzxz}}{yyyz{|||||||||||}}}}}}||||{{{{{{||}~~~~{xvvvvvvvwwx{|||zywvwy{{ujX?GOUYV^omnopppoopqruxurlc\XUNIPtzqooopopqrststvutssrrqponmmnorsww{~~~}~zy|~|w{z{~}zutssssuvwxwvtrqqsxzytooooonqxyo{~~~~~~~~~~~~~~~uuuvvwwwwxxyyzzzxwwvvuuuvvwwvvvvvwwwwwxxxxxyyyz{|}}}}~~~}}||||||{{zzyxxxwwvwwwwwxyz{|||{zyxxxxwvvvvwwwwxyyxwwwwvvvvvwvuttutvwwwvttttuuuuuuvvvuttttx||tonmmmlmlkkloqrsssrrqppnmkkkklmnpponllmmoprtvuttvwwxwuqmkjjkkmmmnopqrrrsrqqpponnmlkkloruvtolqttttqhhyxvrrqqqrrojinrusoke`afkmoqqrqmb\kuvrqpshWJak_enfV`b^ZX_lomljkllkjihhihc`acfd`bfghffggihjlVVv}yxxwwqlkmqvxronnopqqsurjhllkjijjihf_YONY]Z]a`bdglorstsqpnmnrwurszzwvwxwuusrrsuwwwvwwhdhkdmxxwwvuupheiouwwwwuptxxwwwxwwwwwwwxxyyyyyzzzxz||{zzz{|||}}}}||||}}~~~~~}}}}{{{{{||}~~{xvuuuuuvuuwyyyxuurpqtx{xqX;DLRXU[mklpttsqnnoptwxulbYTPJDJnyqnnnoopqrtuuuuutssrsrqonmmnorq|z~~~~~~}|~~z{{|~{wttrqqstvwwwtrqqtx}ytopoooot|}z}~~~~~~~~~~~~uuvvvwwwwwxyyzzzyxwvvvuvwwwxwwwwwwwwvwwwxxxxxyyz||||}~~~}}|||||||{{zyyxwwvvvwwwxz{{||||{zyxxxxwvvvwvvvwwwvvvvvvvvvvvvvututuuuwvutstttttttuuuutsssw|}tnmlllmmmlklnqssrqqqqqponlllnopqrqpomklmnqrtvtrptwxyxwtpmlllmnnooppqrrsssrqppponljkmnpsvwuoimsuutqns~xuqqqqqqqpmnpruusrnhec`bekoppfjcpvsooqrnVJekeiomVU]\ZX_lqomjjlmllkffhhdabcghcaceggggeiiji_^v}yxxvvqmlnrwwsqpoopppqqnjjkkkjiiiiji`XLM[\Z^bccbdjnqrsssqpnnsxvsu{zttttttsqqpqrtvvuvvffnqhnxxxxvtspichmtvvvwwuuwwwwwwwwwwwwwxxyyyyyzyyxz|{zyyz{||}}}}}||||}}~~~}}}|||{{{{||}~|yvuuuttwwx{{yvtqqomnosxyt]=@FLPOZpkmtxzwrnmmnqvywmaVNIC@Lntommnoqrstvxxwvttttsssqonlmnort~|}~~~}||}~{wvtrqqsuwxyurqswz~zvqppppqw}}~~~~~~~~~~~~~uuvvvwwwwwxxyyyyyyxwvvvwwwxxxwwwwwwwwwwwwwwxxxyy{{{|}~~~}}|||||}|||{zyxwvvuvwwxyyz{{{||{{zyxxxwwvwwwvvvvvuuuuuvvwwvvuuvusrrssvuttttsssssstuttsrrrw}|tnmlklmmmlllmprrqpppqqppnmmnpqrrrqqonlmmoqstusqnrwwwwvwsnmmnmoopppqrrssssrqppqqoaYgnprqsutob`rutrqot|vtqqqqrrrrrssledmttumrpg_ilmnlngsvpnprts_TdkjhloaSY_\]`hopliijllkkc`efffeeed^^`dfhkjgggjkfenttvvusrqnotvutssqqprqomjjkllkjjkkknlcUKMZ\\_accbcilprtusrqrpsxxvy{xsqrqpoommmoprssstrmlrqnowwxyxvurjcintwwvwwwvvwwwwwwwwwxxxxxxxyyyzyxxz{{zyyz{{|}}}}}|||||}}}}}|||||{{{||}~~}zvvvuuuxz|}}|yurqonnnpvyve@<@CGHZwllv}}ztommmotx}p^QJD>@^psrpnnoruvwxyyxwsqtutstrpnmmnptv||~~}}|~~zyvtrqrsuwyvtswz}~{xsrommsy~}~~~~~~~~~~~~~~uuvvvwwwwwxxxyyyyyywvvvwwwxxxxwwwwwwwwwwwwwwwxxxyz{|}}~~~~~~}}|||||}||{{zyxwvuuvwwxxyzz{{{||{zyxxxwwwwxxwwwwvuttuuvwwwvuuuuusrrrrtutuvutsrqqrstssrrrqu{|wqnmlllmmmmlkmopqpooppqppoooopqqqqqqqpnooprsttttrsvuroqrqmmmmnooppqrrsstssrqqpqqqeVfpstqsyxj][qutlgkossrqqqrssqi^TKHHQbqttgmvxslgdfimlrspoqqrofbhnkefno\R[b``dlpjgikmkihUFLZcghea[WZ_dinstnhggihiklnppprvvqruvtqstssqponkijlmmllnnonomibOIY\]`bbbabgkorsttttvsuxyxxxupnonmmllmmnprsrqrpopusrqvwxzzyyvldkpuwwvwxwwwwvwwwwwwwxxxxxxxyyyyyxyzz{zyyz{|}}}}}|{{{|}~~~~}|||||{{{}}}~}yuvwwxx{|~}yvsqpnmorwxkC59;@DZ|qoy~{vqnmmnqu|lUGE@DUlsssronosvwyzzzxysrvzvsuttqnmnpuy~}}~~~~~}~}|zwtrqqstwxuuy}~~}{wuqmnv{~}~~~~~~~~~~~~~uuvvvwwwxxyyyyyyyyxwwvvwwwxxxxwwwwwwwwwwvvwwwwxxyyz{|}}}}}}}}||||||}}|{{zywwvuuvvwwxxyzz{{|||{zyxxxwwxxxxxxxwuuttuvwwvvvvuuusrrrrtssuuvtsqopqssrrrrrqqpppooonmmmmnnnlklnnpppppppoooooppqpppppqqpqqqrsttuvurtsmgilljllmmmnopqrsttttsrqqpppqlWetwwusspgcbqtrldinoqqqqqpmeR>8;FR]hptxwhkmrvtpmllnnpqpqppqnjjknjbbincQR^`_ahlgeghkjhi[G;@L\fhbWRV_hpvzyuqmjilkjjjllmpvxttvvsposwwupmljijkllllmoqpnmmm[ET[^``ababhknprtssuxvwxzxutqnnnnnnmmoppstttrqonpuuusuvwzzy~xngnsvxxwxxwwwwvwxxxxxxwwwwwwwxxxyxyzz{{zyyz{|}}}}}|{{{|}~~~~}|||||{{{|~~|ytuwy{{~~|xvsqonmpu{pI368BO[gmpqonkrhe`fstuvtqonnnruspxynllnicbb^PHNZ^__cgd^^ciihii^J??JZfh[OS_lvz|{y{xrqtqqpmklnmqttvxvsnlqxzwrmkjjkjjiiijlnmmllmlRRXZ\^aa`chlnpssssuwwvxyxtpmmnoppqqrtttuvvvsqpoosuwvuvwyyy{wqkruwxwwwwwwwwwwwwxxxxwwwwwxxyyxxyy{|||zyz{|}~}}}}|{{{|}~~~~}|||||||||}~~xsuy{~~~~~~~}{zxvsqomot{tO4469BW}yx|}zwtpnmmnqzeH>=Snsrsusrnmpsvxzz{{yyv|ywy{{xsqnry{~~}}}~~~~~~|~~}{xtrqrswzww{~~}||urtz}~~~~~~~~~~~~~~~~~~vvvvwwxyzz{{{{zyyyxxwwwwvwxxxxwwwwwwwvvvvvvwwwwxxxxyyz{{{{{{{{{{{||}~}||{zywuuuuuuuuvwxyzz{||{{{zyxwwxxyzzzzzxwutttvwwwwxxxvtsrrssrpppssqllmorrssssssrpomlmpqpnnnnooonnnnoooooooppppqppomllnnpqrrrrqqrstuvtusollmmmmlllmnopqrstuutsssrqooqsh_x}vtrtqpnpqrromlmrrrqniE6GZelprph^\]RflaeprttutsonlmqurqyypmmmgdcaZTMGPY^_cda\[bihhikh_QD=>N`aRQbox}|zyvtqsrpppmmoonnrwyyxtnklppokijjkjihgghiiklmnmmqbURTX]ababhmnsrqomswwwwyxsommpqsstuyxwuvwwwusqporuvvvvwyyyywrnsvwxwwwwwwwwwwwwxxxxvvvvwxxyyyxyz||}|zyz{|}~~}}||{{{|}~~~~}}|||||}}}}~}{xz{|~|{z{~~}{|zysnonowzx[5226@U|{z|~}zyvronmmpzaE?Kaqsruwurnnqqtvx{||{yy|~~{x{}}zwsos|}}}~~~~|vsttvx|~~~{}wqquyzwx|~~~}||vux|}~~~~~~~~~~~~~~~~~~~~~vvvvwwxyz{{{{{{zyyyxxwwwwwxxxxxxxwwwwvvvvvvvwwwxxxyyxyyyyyyyzzz{{||}~~}}|{{ywwvvvvvvwxxyyz{{|||{zyxwwxxyyzzzzyxvuutuuvwxyzzyvtsrssrpnnpomihlpsssstttuutqpnoqqponnopppoonnnooppooppqqqppnlkkmnppqrrrqpqsuuvvutrponnnnnmmnnoopqrstttsssrqoooqn\sywvwsqorrnqsvusttrpk]9Jjrsutpi\MQYKTnjlutrpqrqpolkjlpsvsqqomfccdddYFFPY]_`_^agiiijllg^XJ:>Qb^Xcmsutttpnnnnnlmnoqqpotz{ysnkiijlljhjkkjhggffffgjpstssk^UQT[aa``jpnsuusrtwxwwxupnopsuwxxxzzyxxxxxwvtroosuwwvwxxxyxuqtvwxwwwwwwwwwwwwwxxxvvvvvxxyyywyz}}}|zyzz|}~~}|||{{{|}~~~~}}|||}}~}~~}}}|wtttwxyyy}~}zspnoxz{i@203@BAFKFLQSPJJPXZZZ]afmqrtuuuuuvvutsrqoljjkcWRSVVZ_dgjnpokc\_[[_bdefgijklmooopqrsuvvvvwwwwwxyywvvyzyxvxy{||||}~~}}~~~~~~~~~~~~~~~~~}}}}}}}}~~~~~~~}}}}}~~}}}||}}}~~~}}}~~}}}}}}}|||}~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~}~}~~~}}~}}}}}}}}}}}}}}}}~~|yxzyyyzzz{{{{{{{{{{{{|~~||}~}{zzz{|}~}}~~~~~~~~~~~~~~}{{|||}}}|{zzyz{|}}~~~~|xy}}{z|}zuz}~}}}|}}|{~}|~}~~}}~~~}}||}~~{{{{{{{{|||}}}{xxxxxzz{|}}~~~~{|}}{{{{{zzzzzz{||}}}|zyyyyyzyyywvvuvvwwvutslegjiijoruqbRQT[bfhijlortvutqm`WKHC:6@DDECJOGMQROJMS\`^\afjpsstuvvvvvutsqomljiih`VQRUVZ_dehkmmlg^\YZ_acddegijjlmmmnoqruuvvvwxwwxyyyxutxywvrruxz{{{|~~~}}~~~~~~~~~~~~}}}}}}}}~~~~~~}}}}}~~}}}}|}}}~~}}}~~~~~}}}}}||}~~~}~~~~~~~~}}~~~~~~~~~~}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~}}}}}~~}}}}}}}~~~~}{zyyyzz{|||{{zzz{{{|}}|}~}|zz{{|}~}|}}~~~~~~~~~~~|{|||}}}}|{{zz{||}~~~{xy}~{z|}zuz~~{~~~||}}{~}{}~}~~}}~~~}||}~}~|z{{{{{{||||}}|zwwxyyzz{{|}}}~~zzz||{zzzzyyyyyyz{|}}}|{{zyyyzzyxvtttuuvvuutsogchgghlptn_PRW]bdfhklorsutsnh[O@=;;4399696:MNKICFRAGHIJS_bkopqrttuvvvutsrnkhgedb``_`accca^YZdjgVY]gUO`^`bhnqpmk_fkhihhhjjllnopopqsvxwvvvy|z}|wsmoroooqqrtw{}~|z|}~~~~~~~~~~~~~~~~~~~}}}~~~~~~}}}~~~~~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}|}~~~~~~~~~~~~~~~~}~~~~~~~~|zz}~}}}~~|pgqy|}~~~}}~~~~~~~~~~~~~}|}~~~}~~~}||||{{|~}||||{||~~~~~~~~~~~~~~~~}zzzzyyyzzz{{||}~}vu}~}|}~~~~}}}~|~}}}}~~}}}~~}}}}}}}||zzzzzzz{{{|}}}}}}}}}|yzwuvxy{||{{|{zwwwwwvuuutssssstsb^jstojf`]^ZQKHD>8:FRZ^ehklllnnnjhaR=25:?@DGC=AKPQOMMR[OKHTXTOMPSaekmqjYMCITTX]ZY[VY_bcca^[[]_ba\crvcPLik_dR\[^ddZTTV[YYdzvrroijlfllmllopooqsuttttuvvwx{zxsrrsuvwxwvttsttvwvrssssuwxy{}~~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~zpqtkjow}~~~|{~~~~}}}yuuz{yxy}~}}}}~}{{{|}~~~}|||||}~}{wqjegrzqkkisz}}}}zzz{|}~~~}}}~~~|{zz{|}}~}}}}~~~~~~}~~~}||~~zz{~|s|~}|||}~~}{|zxy~|{z{|||{zzzzzzyyxxz{|}}}~}xwx{|||zz~rrpmj`XVQJEGIIINRQYPONNNNONLHC>;;=CFFDBD>AAAAF@9@HNNMNU^efgfc]I614;BJHABKQTOLNPZQOMWXUOMOT`fllnfSHEOUP[_ZY]XZ_bcba_\]^__`hmqpeUSiiV\Z[]bdb[UTVVTWaxytrngikgkkkiklmlloqurrrsttuvvxyztrrqtvwxwwuuuuuusmlqtstuwxxy|}~~~~||}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}wxwpouy}~~~|}~~~}zvux{pip}}{{~~~}}}}}~}{zz{}~~~~~}}}}~~}ztj_]drvmdbhtz}|{{zzz{{|}}~~~}}}~~~}}|{zz{|}~~}}}}}}}~}|~~~}~}{{||}}{}~t|}{z{{~{|z|{zx}{yz{{|{yywxy{zyxxxz|}}|zouz||}ut{|{{wuyxpe_^[QHGIFCEGHHKMNPPONONMKHEA@=:;=CEH><=<=@?>D@@JPNLMNU_egfd_RG6/17;EMKFKPUPLJMUTTW\\XNMOT_flll`RHHWSM\`XX\WY`ccba_]__acgnolki]Yi`YW][_dd`YUUUTSXau{vrlijjhiiigkjkjjmospppqrssttvwzutrpsuvwwwvvvvutqkiosstvwxxyz}~~~~~}}}~~~~~~~~~~~~~~~}}}~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~|{zvvy{}~~~~|}}~|xuqnkmx~wffv}{}~}}}|{}~{zzz{}}~~~~~~~~}}zodcgklmjioruwxz{zzz{|}}}}}}}}}}}}}|{{z{|}~~}}~~~~}|~~~}~~zy{{}||v|~{yyz~}}ztw~{yxz{{|zxwuvxy{zyyxz~|uty}{xustxrkfejmh[RNLFBCFFEEGHILNPQQRSRQNKEA@>?@AACCE?68>CCB>CFLOPLILOW`ghfaXCD;1366@MSLKLRPIFJQY^ba_XJJNU^flojYOJLXRL_^UUWUYadcbbacedghhihdcfb]]ZWU]Z`hf^VVWUTXafoxzskmljihhhgmjkiiknqommnpqqqqtuyuvroqtuvvwvwxvvurlhjmqswxxxxy{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}||}~~~~~~~~~~~~~~~~~~~~~~}}}~}|xrmheem{zplv~|}}}}|||}~|zyzz{{|}~~~}||}}~|vpliiinrtsmklry{zz{|}~~~~}}}}||}|||{{{|~~~~~~~||~~~~|xyz}~|}w||{{~{vsyv}|zyxyzz|{yxvvwy|}{zwy|}}}vvz|ztypae`XTTY\YOGCBAADHKIHIJLNPRSSSTSQMIC@>@BEEFFD?C96@HHGFGAFOOJDJQYbhhcZP=;74474:FTPIELNKILWaihb\QBGNU]flngTMLQWQRcbYQQSX`bbaa_]^cfea\[\ZUYZVUUW`\_if[WXWWZemlhnyunqnlkjijlpkljikmomkklnoponrsutxspprstuvuwxwvvtrokkqswxxwwwx{||}{}}~~~~~~~~~~~~~~~~~~~~~~~~~~}|}~~~~~~~~~~~~~~~~~~~~~}}}}~~~|zumfa`gv}zx{~~||||||||}~}{zzzzyxz||{zyyz{||~}vljlqvzyqoou{{z{|}~~~~}}}|||||{{{|}~}~~|{}}~~zyz}}}x}~||~xr||w|{|zyyzz{{zyxwwy}}{yw{}}ywyxrinaJJJHGGILHE@??@BGMPMKKLNPSSTSRQNKGEB??BFHJJIEAD?==JLIFA7@EFB?JTZ_edYND:7656655>?@ADJPROMMNOQSSRPOMIDA@BACFILMMKHDEBD@HHD@:3:756?NZ]\\YNA;865677656CNI@ANW\bhf^UIE@AHMS\dkke_ZOSVRS^bZNMV[_`b`_^\YVVVSRRVWTRZ^]YV`YVZ\\]agkryytf^cuxtstsljmrrmnmlmkhgiiklklkjlnorqtqrqpopssuvwwvsssssuvvwwvusrqqqsuy{}}~~~~~~~~~~~~~}}}}~~~~}~~~~~~~~~~~~~~~~~~}}}}}}~~~}{ulgb`kx~}~}||{{{}~~~||||{|}~~}|||{zwuuvunlmptvxxyxy{yxvvuuwww{|~{{|}~~~~}||{{z{{{{}}|~~~}}~~~~|{}{|}~}~z~~~wy~|y{~~|zyyz{{zzz{{zxw|~~~}yvq_LB@@>=>?BCA==>@CDEGKOPOMNOPQRRPKIGDA??BDGILNOOMOIFKLJH=87644108GUZZXVMB87655678665?FGCET`ff_OEGEA>?EKRZbimhc_RUYUS[cZOPY^]]``_ZY]^]YSQSWXWU\ab]ZbVQVX]ckrtwvtqkbcltwtrpmknssnonnmhffjjlljjiijlmposprpnnnqqsuvwvtttttvvvvvutrqmmmorvy{|}~~~~~~~~~~~~~~~}}}~~~~~~}}zy~~~~~~~~~~~~~~~~}}|}~~~~}~~~~~~~}}}}~~~~~~|yrifiqy~~~{wwy|zz{{||||{{|~~~~}}}~}}}}~~}zwuplgfinsvwvtsv|}|{wqjlw}{{|}~~~~~~}|{{zz{{{|}}|~~}~~~~~~|}~|z}}}~}~~~~{yyz{{{{|}~}zx|{~}{~uvyzvkS@;;<>@BACEC>>?BFGHJLNNNMNOOMMLMHCCBA@ADGILNPPPNNMKSRFB62124612>NXYRTLB95555567:98;DAFMYcge[L>5?EB>?BHPY`gmhb^TW[VSXb[RV\`[ZY\\][ZZ\YTRRW[ZX[_^Z[hWTY[`luwwvpmlnhhfmwwonnlntrnooplcdgjkmmihgjklmoorprpnnmoopruuvtttttuuuuttsrplkkkptwyz{|}}}~~~~~~~~~~~~~~~~}}~~~~~~}|xurv~~~~~~~~}}}}}}}|}}}}||}}}~~~}|{|}}~~~~}}}~~~~~~~~}|xnjqx{~~~~{yxxzqwy|||||{{}~~~}}||}}}}~~zskhddhntxyxsmoy}|{xtrt{{|}~~~~~~~}|{{{{{|~~||}}~~~~~~~z~|{~~}~~~|~|{}{zyz{{{{|~y|~{ywx}}{yy|{yvutndM;9>@ABDDEEC???CGIKKLLLMMMPNJFFGFBBAABCEHILLOQPKOTVTE:862013646@LTXJJA=66666779==BCFNV]dkf`]UW[XRT`ZVZ`a^[ZYX^`]ZZWTQOV\a\UW]ZMXY]]^iv{vtrojlnjkhiryuspmnspnmpoj^eikkkmiffkmmnnopopoonnnmnorssrrrrsssssssrrrolkknqtvxz{}~}|}}}}~~~~~~~~~}|||~~~~~~~~~}vptz~~~~~~}|||{z{{{}~~~~~~~}}|}~~~~{wwz|~~~~~~~~~}~~}}}|{urx{}~~}|zwukx||{|||||}~|{{||}}~{uongelrxz|{uhfq{{yxvw}{z{|~~}}|{{{|}~|||}~~~~~}~~~~~~||~~~{|{y}}{{}~{zyz{{|{z~zzzxvvw|{wtm|vpomm`TF::DHCCFFEDB??@DGIJKKKJLKJNNHECCCBABDBEGHIJJMPQMPVZP:24432248;9566767;;;CJIQW_ki`WLA@?::CD@FEFKQZ_fhd_WU[XQR`^W[cc`\YXXZ^_][XRPMMWcaRU\[SSYfdjt|ysporhmnjjjiowwvronpnnlplh]gllkjlhfelmnopoooooooonlmmoqqqpppqqqrrrrrstrnmmnoruwyz|}~|{{}}}}}}}~~~~~~~~~}|{|}~~~{x~~~~~~}{{zzyxxz{}~~}}~~~|{|}~{utw|}~~~~~~~}}~~}}}}|{yy{}}~~~~~~~}~}{trt}|{|||||~~}{{{|}~}}|||zwvqompvy|}}ve`nyyxwwz{{{|~~~}|{{|}}||}}}~~~~~~~~~}~~}|}~}||}}||~~zxsw}}~~~|{{{{|||{z~zxwwwvw{}wsm^fadfd^PB=>?FLHGHGFDB@@ACFHIJJIIJHFJLFCBCBBDFIFGIIHFEGNRTPLPG432356348478:7:ADIRVOP]geVMOJDD@:=?LJGGGDA@?@BBCCDEFFGFFGFDFHFFEEABCDFA=CFIJKKOJGPA:<3:86789;EQQH@@J<9874::FKMRPOEOMR_XJHGJIHF?>DGFCGFJOPTVZbda\WVXZ]TSSUW\_`^YVV\_\XUWY_ca_YGUn^MYmwusoilkerwrjfq|ugmrzyqllmmkgihjifgmgcdmjkloponopppqpqpppoonmkkklnnpqrssxzyxvusssuwxy|}~~~~|}}}}~~~~~~~~~~~~~~~p~~}{zxvvvwx{|}|}}~~~~~|tjirwz{{{~~~}}|}}}}}~}}|}|||}}~~~}}{{{{{{|}}|ywwyxyy{{{|}~~{zzxtrssrqsvwx{{|||{vsv{|}~xvwy{|}~}{{y~||}~}}}}~~~~}|||}{yxyxuw{{{}{v~z}}~zy}~|}~{xvuvwxwspj`\R<=CA?;9:IGEDC@????ACDEDDDDEEEEFEFGGGFFAA@@BA;@DHKNOJF>B@684<<6579?GHMKI>B<7765=EOHAGGIDDHS`NGOFFGGG>AGIHDDALSQSUV]bdeZTWX`RRSVVZ[^]\\Z\aaa```^en`[aiaVQ]syurolkjt|xuiq|sjouyyrnmlkkkjjigegmf^`ogffkonmlooopoqpqqqplnmilinmopqrswyyyxwuuuvxyzz{}~~{{|~~~~~~~~~}}}rx~~~}}~|{wvuvwy{}~~}{xx{}~~~}{wqgkqtxsx|~~}|{y||z|{}}}{||}}}}|}}~}}}}{||}~}{wwx|}{z{{{|}~}|{zvlejmuz{ywvz|}{{xphfhrz|{yz{{{{||zyy}}}~~}}}}~~~~~~~}{zz{zxwyy{~{t{zx{{{|}~ywx{xy~}|ywutvxxupg[PLF;==9:89;?@??ADFFDDCBCDDEFFEFGEEGD@><>?CFG=?;7998>IN>5<:;84::===>DCA=<=>?ACA@BDGFCCBABDEFGFDEFBBEE@:8:<;6165347986369>8=<;79:;>AD948@A@;@@<::=>ADDBACEHFBBBACEGGFFDDDA?@B?96677899:;:<94344433466567848@;::989:;<=?85;===@IQYPIMLQNLQMPSQLNOHOSXWRQWahibWOPVPVY[ZYUPX]_d`[[XVX^a^\knib][Tduxob`gkompqmp~~ux{vqslojijhcqg`Weba`[lg^^`cca``fkniiihgcbce\becihijlmortuwxyzyyyzz{{{{|}~~~{{uz~yz~~~~~}{zzyz{ysty{|}|vtpqsvxz{}}|{yxwwzyxh]clwz}}z{}{piklnquxz{{|}}|||}||{|}}}}|}|{{{{}}}}|}}}|~~sox}zurnrz~~~~zm`eu{zwzxstxzzzzzzyz{|}~}}~~}~~~~}}{~|}~~{xvuuuuvvuuurplVD966887678:=?@BA;=>;9;>BDEDBCFGGEBABBDGGGFDCCA?=<<;85445566787753455531256555635>;8899999;:975:>::@HQXSLJQROOUTRWVJOUPQRWVPQW`di`WQOTPXY[[ZURWZ^c_\\ZXYZ_ehhif[ZZTcuwn_^fkntinrvz{xjmliifapfaXbd]L_ie]\^a^b_`dikfce_][[c_[_aaiggikmnprtvxxyyyzzzz{{{{||||~~~~~{}}yz~}x~~}{z{{{|}zqry{|}~|shlquwyz{||zxwusqquviajvyy|yyvnmmnpu{|||}}|{{xvuwy|}||||{{z{{{{}}}}}|{}}qry~xomr}}~~vkhir{{{zyxyzz{zzz{||}~}}}~~}~z}}ywutssuvvvurkVI;656689888<=?@@CB;:<::=BFGFDBEJLJEBBCDEIIGDA@@=<;97654223345455444577640013565424:;7899986756778;79>DQZSMHUUMOTSV[ZKPYXYWWURSX_di_XWUWSX[\[ZUTVUV^[^cca]XZciedbWVUS`swl\]eikj^lwz|~zvilpjgd`caddX[bQ_fb[YZ]Tgbeed`[Z`WTVWa\YZ^afefhklmnoqstuvwxyyyyzzz{{{{{|}~~}}~~{z|~ytyz}~|zz}}~{qry{{|}~~~}{qlpuxxz{||zxurpnkirufhx|z~zy}~rpuwwwy|}||||||}|ysorux{||{{zzyzzzzz|||{{ywuuxyxy{}yyzxpegu}~{tkny~|zyxy{|}||{||}}}}}}~~{{|~}|{zwutsstyzwtn_L<4477789;:;<@BB>?A@;;=<=@EHHECAENQMHCCFFFIIJD@=;98875335443446457544799761.-03775337:79:::9552367788:9=OXNLJWXMORRVZ^WU][\\[XSRW^`cg_[VYUZ\][ZWVUQPUV[[cfb\X`ffdbZXRS^rxjY[cfd^\r{{vzvs~ommjgifebcdTO\\_dc_UZ_M^Ydj[WTVZNMTU_ZXW\dccfiklmmmmnnpstuvvwwxxxyyyyyz{}}~}}~~~~~yz}zz||vt}~}}|}~|tw}}||}}~~|pjkqxyxvuwwwurnjjkjtzkr}wx}zxzzvwywvxz{zy{}}}}|qjt{~~}||{zzzzzyyz|zwuurmjsxyy|ztx{}vbZfvyz~}xyvv{}|{{zz{|}}|{{{{}}}}|}~~~~}~|~~~{wwtsrrsty|rhbXD742269:9;>?AACFF>>>>;>>=@DHJHECAEORNJEDHGEFHJE@;7556643356655554577668=<8720.04896444669<<;;651357788<67KTIJKXZRRUUVXcdce``^\VRQV]baki^Y[V[]^[Z\ZSNMNQ\V]e_WUafdcb^[TQ[qxl^_beb\d|uszoz{oljjsmjc_[UTXd[cgiTivZNM]hXXWVUFJTU_]XV]fadfhlmnmmlkkloqrssttuvvvvvvwxy{|~~~~~~~~~~~~}w{ww|yw{|{|~|~|yonqwz|||||{nms{zxxndlorurgekps|x{wrpxvutw{{wonty{zxz|}}~~rl{}}||{z{||{zz|vmmomgjw~{z}xtvx{xgZ^pwutnin|}|{||{{{|}}}{{zy~}~~~}}}}~~~~}|~zy~{wtttrqrsx~wUFB;744568:;<>><@@=BHKKHFECFPSOMFDHGEEEDD@;64456544666777778:;;89AA977.914;:6666776@>:<723454777<78ELHHLX\ZXXYZ]bc`_bbZSQPPTZ_`aaac]XZ\^[[^\SOMOQ\VWdhWRY`_aa_\UQXpzocacedejrzrry~{{vpyljgjwibgb`S[X\]YUfa}yZjnnfWZ[XJBNUVa_YW_chefhlmonmlkjklmoppqrrsttssstvwy{~~~~~~}}|}}}}~}~|v}}}~~{}z~{~~~{qc[Yav|uncfrnpquwvytdlos~oZgty|}xqhjsy{{{}|tihry{zyz||~||~}}}|{{{||}{{|tgbdc`kx~|ujqwxwxz|wjervpmkn~wy}}||}~~~|{zy~}~~~}}|}~~~~~~}|}|~~|{zttuxsrsrmi^B620259::<=??@ACHMJHF@@A@>CC@EMOMKHHFHRWRNIEFFFEC?@=:6445776567789:;;;<<=;9BE95;<9=1=?9658997??=?956743665:79?DDELU[^^]\]\]^\[`c\RPONQSSRRU^kj]U_`[\`\TPTLKXZT^j\OPXZ^__^XRWo}thefhlmomtvtz{wx||inle[hqaYca`T[VP^TCURhfVvve[^\U?FVPO^b][bfkggimnpomlkllkkklmnoopqqpppqsux{}~~}}}}|{{zzzyz}~~||}{~{zo}zo`\fpspd^hvpvqmpnjrtyy{}odu}}~~xrjfs}|{|~|vlmu{||{{||~~}|||||{{||||{sid`bnz{{zns||yyyxzvtqfdfiv~{urw~}|zxw{|}|{zy~}}~~}||}~~~~~~zy~~zx}{~{tuvwwtrkWG@510247;=>>@BBBDFGKLHD@BDD?EEBFMNLKJJIJSZTMKEBDECA;:99655688877789:<=>=<;;:9@A63;D<>28A=579:;:BFDNA95852664:88;>@BJRW[aa^\\]`\[`b^UPNPRPONNRVevlYb`\]_[TSVJFT]XVa[QNSW]cc]WUZn}wjegjptsjmirxsxtrffc\Zfhc\_WY`XSQ\YOUUg|w^_accbTL@QVDK^e^_finiijnnonmmlmllkkkkllmmnmmmmoqtvz}~}}}||{zyxxwwwy}{|~|}}y~}}}}wpqurvc]``eh^blvuuvpqjfy~~}|xs|||}~|zvt{}}|}}}zvw{~}}{{||}~}|||}}}|}}}|rmnv{{}|~}zyxywvsgemkgsyz|~zwvz}|zvrotutwxxx~}~}|||||}}~~~|xxzx}~}|xtuwy~}q[F8333478:=ACABFEBEIJHIG@?CJG@FFBCGIJKJJLLRXSLID@??=;76787557:;9868889;<=<:8778<;43:>A:64<>99;:;?NPFPB=8;62675<779:==GSRX\a__^`b^Z^`ZRMOW\[^beaZ[txfb_]`a[VY[KEV_\SV]SQUW^hibYVYl{wjfgktwriijrrlqw|xoyxqf_bfbddk`]Z[`TMUdbuosz}Y\mleaIHJWP>Nbf[dhlqlkkpnnlllmnmllkkkkkllmlkkkmqrtx|}}~}}|zyxwvutrtxy|z{~}ywvz~zrzxi^UTTUYhx|wzyxsu|}||{}xxxy|}}~~~}}}}}}}||}~~}||||}~~}|||}~~{{|~~}~~|zywtquvpyyolw{{|~~}yywwwuokikihptuv~~~}||||||}~~~{wx|xxz|}~~zvtuwx{t_F;532479;;=CEBBGFCFKLGGF?>CMJBCA??BCHMLKMMNOMGB?=;97555777657;;996778889887455554549988:::ETQVY___^_a`Y[^VPOTcdciqun_Xkytd_^aaYW[^MMX^\TO]USVX`hme[YYj{xkghlrumigkqhjlurvtjafngfgfcab^Y[XZTKWim~~ma_clca`DETWKBJZhZiimnmlkpmllllmnmlkkkkkkkklkkkknqrsvz|}}~}{zyxvutrqrtvy|{|{wunp~yv~~~~zm^][Z`n|~|{{{{{{|xvy{yuuwz}~}~~}~~}}}}}}}}~}}}}}~~~}}}}~|}|y{~}}{zvtqqpszvux{{|}||wvnmrsqlhedglpstt~}~}|{{|||}~{yz~}}xxy{|utuuvvugO;43447:<>=>FJFDHHCFKNECGA?DMJA<:<=@BELOMLLIE@;889876556798766;<88767655655533458798<::9:97444?JOS\T9A?;6<859:;A:9:;84BZUSSZ[\\]`aYWYSQU^egknlj_UScw{ja_c^WZZbUW_[ZZP_\WZ^cgllb^Yjzxlgilmlpwmnqtkilpvkb`ifbbdca]]]\b\RTPVhprqh\tvr`]^MUXPBDE_][gjnnmlkolkkkllmllllmllkkkklmmnoppqswy{}~}|{zywutrppqrtx}}}}{zu~qoy}}|~~xmnkhkv~}}}}|ytpr|ysru}~||}~~~}}}~~~}~~~~~~~~}}}}~~~}{z{|}~}|wtqppv}yy{|}}|{yvn`_jlmjdaahorrqq~~~}|{{|||}~~{zz~}y}~{{|}~wvwxxtqkT>63357:;=@@?EKIFIHDFKNDAFBACFA=:9:68>N\\VRM:CF>:99:<>?C=:;<85?Z]OQVUWZ\^_ZUUQT^egnqkhe]SM[r}ticf\Y\XbY_a[Y]PYb`]bfbfohd[jzyoijkkfsm`plo{mwcedffaa_\gh`]aclfRRVagaQgmrta~viU`[XdWE:CHaPYdgkkjimlkkmmllllmmnnmmllllmoqrrqoopsvy|~}}|{ywvtrpooprtx~~~~|yq}z}~v}{|{xy|~~~~~~~}{yslqrqrt{~{yz|~~}|}}~~~~~}}~~~~~~~~xwxy|}~|wutttw{xxyz|}|{xm]Yfpnnmfbahmnnop~}~}|{||||~~|{{~}z{|~~~}~~{{|zwsfWC556589=<=BC?CKJHIHGHKKB?CA@?=::;;>ADECBBA?><975468:;<;:88878789:77743223347>EQWZ\WRHB;;:;@@AIS\aXKEGAAF;869=@BDG?;<=89>W]NMTRUZ[^]XSSU\dhjrrlifbYNTizztgdZ\^Y`^a_ZZ]TUadaddbfnli\iyzpjjkigouebmexjedeed]be_Vkg`ZSXdd]Z`zw^eioz|i~nVIWJLUW;6DQUNSfcegggmiklpnmllmnooonnmllmnqtvvvrqprswz|}}|{zxvsqpnmnpru{{~y{~|t|{~u~xzy{x~}||}}~~~~vf^hqsv{~|yuty}~~}|{{}}}~~~}}~~~~~}}}ypuvwyz{{ywwxwwwutsuy}}{vlcktrpppnlkmnonmo}}~~}|||||}~~}|||}~~~}{|~{{~}~{yyoiiXE;::98:;@=<::;=>?@A>;999888776679;<=<987888:;=<976322547CD@?ILKIIKHHE><=<;::;=?@@?<8545667888889:;;<;7679:;>?BA;77535:=DKJHLRPNTNFD>9<>8GPPID>>=9:ACDI?<<;@FIJKE@EE>9HKJTNQUW[Z[\TT\fkefqonnmkkhZNVl{xlgjklgajaZX]`^^aegghhkmrrajxzqlllkkkgcb`afeeecbcZXc`TKTd^bdaVZ]\hjgbu||qrXZGZQ^W9ANIKKbkVZdcgifnqpmllnooppppponmmnpsvy|}zywusv}||||{xvsqponnnoqtw|~~z|~}yux~~~}{zz{||}~~~wimuy|{|}{vrosx{wsqpptxwuy~~~}||}}~~~~~~~zwwvvuuvwxyzyvrnmkjmtz|{{{tnkcfrwyxxxvutrtu}}~~~}}}}||~}{yxxxy{{||~}}{y~~{y|}{~}zn]QDCB@?AABA>>DA@DEAAJMLJJLGFB::<;;:;<>@A@=85434579:::::;;;:97558;??BCED>:<<==;ADLOAB@:9::<@DGKAEA@CIKILGEKG=;JLJRTNRV[[YXW^fhjgiooooomnleTQaxtfdfmojqfYX_baadfhiijkotuelwxqonnljhgdd`adeihgij_^_ZRKBNPQT\MOfgvj_nliq{thr^PCRIgQ=HLDNGjdR\abgfjqrolklopppqqqponmmnopstx|~~{yux}}}}|ywtrqpoonnpruy~|~}||{{~~~~~zz~~}{z{|||}}}~zr{~}~~~~~~{vspswxmdfgg_]hlt|}~~~~~~}}}}}}~~~~}~~|{yyxvwwxyzyxtmhgikr{|usvx{{|zvuvvvvwy{}}~~~~~}}}}}|~~|yxxxxzyzz|~~}{~~~|}}{zzz}~}{~~~{oh\KA9:>DIABDCAAECBFGDELPOKJICA<67:;;<=>@A@>:6444568:;;;;;<;:8657:=AEHIJJJGDDDDEHIMMLHGGJHJF?=ADBCKMB=AA=:==>AFHLCLIGGKKCLHIOF;?FJRNVMNQY\XS\hlqtojnlpppppnl[QXn}}truwxuzsdX`eccdfhjkkmostgowxrqqrjhhhfe_^degffge`ZUVVQGFQU``UOT`{ycvn`fuht|qWGIHiGAMJKKMh\Ucc^keosrnlkmooppqqqponnnooopqty||{yw{~}|}|{xvtsrqqoooqtv{~{tpptuuuuttsrrrvz{}~}|{y~z{}}|~||}~~}}}}~~{~}}~~|||{zywwxyypggfh`\]clv{}}}~~~~~~~~~}|||}~}|}}~~{{zywz|zyyxyyyyzyxtmgfgggpuutsmkoux||zsnquvvwy{|}}~~~~~~~}}}}}|}~~~~~|zyxwxyyzz{}~}|}~~~}w}|{|z}}}~}xx}~mVLI@97;=DDBBCCBCDBCHIGHNRQLHF?:757:;=?@ABC@<87654578:;;;;:;;697AFILORUUTTSROJEDEHHJKKFFFECDE@>CJGAIL@?@@>:>>?BGJMIPPNJKJBMHJOF=AFHTOUMLOSXVUant|zpimkqpooonnbST_u~zwsrtr{sabefffgilnkkmsriqwwtqpogpkhgf^Zdefed^ac[NRWTGCPWb_\[ZXmpokxwfhqfszxXOGTc>FNMRL]fR[gefdeqtqmmlmnoopqqqpoonnoonopsuuuwwx|}|||}|zxvusrqppprsux{{mhkllmnnopnmnrrrtvvvvvutssx}xy|~~}}}}}}}}~~}yy{zzyyzytrqlijhbbiikty|||}~~~~}}}~~}}|{|}~~}||}~xxumipwzzzzz{zzzyxvuqkhgmrqhabdimmswzxrdgquutvyz{}}~~~~~~~}}}}}}~~~{z}}|zyxxxyyyyz{|}~~}{z{~~~~uyy|}vy}nXB88769=@DEDCBDFECBELMJJPTSKFB;7568;>@BDDEEA;8997678:;;:9879DBAEKG@DHBBAAA=@?BEHJNMVVQLJIBMIINDEFGCUUPKLMOQSWdqwyvlfliqpoponmgXQXl~~la]`jhvxkfgijjjjmnkijqqnuxxvpmkgnmjjg[Vehhfc`heUOPUXF=MYYLSNLJ`gmb`dbcg\oipRTI[\?KOSUUgbUclgg`gstqonmnmmnnopqppoooooopqrrrqsuz}xwxz|}}{yvtsrqqrstvxy~xolllmnorsrqrsqnnmnnpponmnrw~}qw~~~~~}~~}}~~|xvxxyyz{uhjsrookfipqotwz{|}}}~~}}~~~}}|{|}~~~}}|{{|{rfabcfnx{{|}}}|{zzxogfomjqzvh_]bhkknstob\eouuqsvxy}}~~~~~~~}}}}}}}~{y||}|zyxxyzzyz{|}}~}{zy|}}}~~}}~~~|w|yxy~zvx~~x_IA85679;>@CDCCBEGECCGNOJHMTSIB=9658@AFJHFDB;;ABBFID@DFGC?AD???CGHJPQ]\RJIKGMJHNAHJI@RWHHNPNNQWerwvrmljippopnmlk\PTbw~eYZ\gdoutmlmopnkkmljjprquxxvmimkmkggk_ahhjhghmbPROT]NEJUVHUTRPboj^_f_\e]db_RXQ_VEPSX[\i_]kolfbkvurpnmmllmmnpqqpppooppqqqqqquwwutstwz}~}yvtsrrrstvwx||ttttuvvvtsstrponmllkkjjkmrxphr~~~~~~~}}~}yy{zzxvx||wuurmiiouxxzz{|}}}}~~}}~~~}}|||}~~~}||{||{qfmg\`t}~~}|~skmqqvxyqgcgkiflqsk_diirtnortt}~~~~~~~~~}}}}}}~}zz{~|zyyzzzyz{}~~~~|zz{}~}}}}}}~~~}~}}}{suyzx~ywz{|{~wdI4478::;<=?ABCCDGIGDDHNOKHKRQI@:877:>BDEIMLHD?8?S]SA<<974249@EQVJLUZ[YUVVRPKGB>;::9:<>ADGCBA;;>@AEG@@CDH>=BF@?>DIIKRUc\NGKMJLJIM>JMJ@OYGJQTRPRYgsvwtrpnkoonoplkf\TTZm}n_`emfjkxywvuusnknnllpstuxyujhmmplcbkcgkjlgikn_LRSZ\QPP^eZ_\WOVeypmrfcql\^dWZ[`QQTW^``hahtunbapxuqonlmlkklnqqqqqpppppqqqqqrtzroqqrtx{|~{xvutttttvwy{~~~zz|zwsrrrponmmkihhhhikmsyyjo}}|~~~}}}~wqu{}|xnlv{yxxxqlpuy}~~}}}}~~~~~~~~}~~~}~~~~}|{{{}~{t|wijz|xmmpqrszzpjnsqhhosplrmiprmklll~~~~~~~~~~~}}}}~~~{z{}~|zyzz{zy{}~~}{{|}~~~}}}}~}}||}~~~xsu|{zy{~saWQF<9:=<;;====?ACDEHLKGFHMPMIJMMIA;:::<@CEGMPJB?=:CORK><;73027AD?FIGDINUSKOROJD@<989:::9:;;=?@CHA?EBG>;CH@<=EKHJRY^W@DONKJIJG@NLJCMWHMSWUSU\hssrnopololkmpkib`ZTSby{ie_gpmcjtwvtsspnnnmnpssux{yrmmmljfhkdfmnjfhjm\MY_[[_TSVba`XFBLYgb^`bn{w[Zc\^``Q\Y]bdcgdqxuoaeuxuqnmlnnkklnrqqqqqqqqpqqqstuvuroopqrvyz|}}zxwvuuuuvvxz|~|~|wsqonllllkjhffgghjmpu{qs||{{~}}~~}}~~~yvy~{sqvzyy{||yz}}~~~~~~~~~~~~~~~~~~~~~}|{{|}~{yxzy{}}}zxzwklngj{yvw{ylfltuvwtqqqmjcbe~~~~~~~~~~|||~~|zz{||{{}~}}}|}~~~~~~}{{|~{~}~~~|{{zxxxzz{|{wt{xrsstx{}||{{z{}w_E::97:>A?==??>==AEFHJNPLJJLPOJHHFD@=<<<>BEFIOOF;;AIKC;647841059@A<=?>?CGOMCDHGD=9668:;<;::9=>@?BIFAFAD@=DI@>@FMJKSWVL8EPJJIDHFDPJIHLSKTWXXVX^irolimooonjfjpkhdc^XQZrtdXeuqbclsqnosrrppqqqrsux{|wsqojjjlnagpkcjlpgY[af[_kW]Y[`d\VTZ\TPHEHXca]Xb_c__V`Y`ddnojvzvpgnywsollkoojkknsqqqqqqrrqqqqtttsqonnnpswxyz{}~~{yxxwwvvvvwxz||y|~yusqomkiiihhfffgghilnpu{{y~~|n~~~~|{}~zxy{{{}~~~}}|{|}~~|{}}ypjkrwxo^d{}xvutmejty{{ywtqola^`~~~~~~~}||}~}}~}}|~}|}~~~|{|}|{{{{{{zzyyxxxyyyxwvvwvuuusrrtttttrsvy{~}|~tljkkklmorsssuxvaH50156:?BA@@A@?>>AFIKLMPONLKOOJEC?>?>==>?CGLLSXI=AA?84358;=>>>=;=BCDDBABDCCGKDHBCCADGA@AFLMNQRM?7GJFFIAFHJRJIKMNNYXZZXZajqnZbjimpolbjqmkgb^[SUh}za[ism^`ionlmsvrqqrrsstvx{|{wtpjjlnmcjsl_kgbY[akgXcjSib`iog^^ca]bb[XY]\a[ade\_\^Zbbgtrpzzwsosvtqmklmnnlkknsqqqqrrssrqqrstsqpnmnmpvxxvvwy}~{yyyyyxwwvwwyz}zvvuttrpnljiggggffghhillnqv}~|{{||r~~~~~}|}}~~~~~~}}|||}~~}~~ztqpuwfh~|wqoqoqx{||zxusssd[]~~~~~}|||}}~~}}}~~~yvtutssssssrrttssssttuutsrrrrrrqqppqqppooppllqqnmmmkkkjjjijklmmongJ:322679>BCCDDDBAACGJNNLLMOPNONGA?<<>>?>>>AIQKNVKER`]G641/11112333685777>=622596323679=BDEGFFEFFFHLOOMLKKOQNKD=<<<>@?=<;>FLBAMMHKME:554211011222465666:CG@::<=:8657;?BBDGFEDDFHIGFLPMLMOOIICEEFFCCCEKUJIE?@?AACGIIHNXWOKMMLR`]]]ZY_msn]beainlmlornkhd`^ZSZk}tfuk[WarljkossqqqrsvwxxyvsqommlmnonnlnnniecjialfahdbfblfZ[_c]YUZZ_]\^ekdchaeic_hhelnowwvsqqrqqommnoppnlnqrqqrsssssrrprrrrpnnmmmnqqpnoqtxzyxxyyyzzyxwvvwy{}|xutssrqomlkkjiiijkkkllklmnsx|{}~{}}~~~~~}}~~}~~~}}|}~{yxxyz{|~|yutwyspn~~~~~|z{}~}~~~~~}yutssrrrqqrrqqpooppppooppppppppqqqqrrrqqqpppppooooooonnmmmlkkkkkkjjjjihhggggggc]SE62335899>DGHJJJIJJJJLNPPLJGKPLF?:;<<=A@=98:=>=EMG?;:864333210012345657748BHA87::::989ADGGIMV]XRNPQPU```_[W[mtqcfdaiilrsolkifc`^]VWeyzom_VYivgimttrqqqppsvwwuqmjhhjlnnllqnhhigfglefihfkfiibiaY\cd_\[[V^^_ajoojeeilfdnhglprwyxxutrqppooppqponpsrrrrssttssrqqqqqoonmmllllkkkmqtuuvvwwxz{{zxxxxxz{|}zvtssrpnllllkkjjkkllllllmnrv|{~}~}}~~~}~~}{zyyzz|}yxy|{zz~~~~~~|{|~~~~~~}}}~|{|~~}xusqqppoooooppppoopqqqqqpppppppppqqrrrrqqqqpoooooooooonnmmllkkjjjjjjijihhhhgggfd[RF:21357:;;?FJKMNNMNNMMMNPRPLHGLJB==<=<<>>:77668>>:9:::842123310012357988847AGA96899:;::;@BCFGGFFGIJMNMOTUUPXZQQKBGGHGFHGRONLEKH?@GDDDHU\\USRSUUW\c`a]VYkpnfd`beeoojhggfdb`_\ZZ`q|vfZXcsrbjoutsrrpooquwvuqmgehlnonlionga`behkgkljjnjpvogiidbaaced[_`cfnqtpifgllimgdouvxxyywurrqqppqqqpooqssrrrsstttsrrqqqqponmmlllljjjknpqrrssuvxz{zyyyyyyz{|}~zvsrqomlllllllllllllmnnmmnpwz|}~~~~~}{zyy{~~~~~~~~}}}}}}~~~~}~|xuuuuutsrqppppooppoooppppoppqqqqqqppppppppqqqqqqqqqqpooooooonnnnmmlllkjjjjjjiiihhhhhhged^PD;412579=??AHMNPQQQQQQPPPQSTPJHJHA>=<<<98767755>G>47:<=:51/2443101237:=<:868AD>96667;==<:=ACEEEEEGJLQRSSTTXPQYVUN@GHKJIJKXRPPKTKAELFCEK\^XSQSTXWWWc^c`Y\imjdb_aadnc`_ddca`_][a\[kzzkabnti^jrutsrrqppqrtuvuqmjlopqponqpjd`_dlokoonorrspejnoh]Z_e`fbcdginorpjggmrnmggqxyvvvvtrosrqppqqqpopqsssrrsstttssrrrrrqponnmmlljjjkmmmnoopqsuwxxwyyzzzzz{|}~yuponlkllmmmmmllllmnooonnnpzyxz~~~~~}||}}~~~~}}~|||||{zzxwvutsssrrrqqqqpoooopppoooopooppppqqqqppppppppqqqqqqqqqqqpppoooonnnnmlkkkkjjjjjjihhhhggggfb[QD8212369;>BDEINPRRSTTTSRRQRTURMOMFDA=:;;73026755?E<57;>>940/2444200259=AA<878AB<97546=@@?:<@CEEEEEGKMSWWXTTZRCTZWP>DKMMLKQXVUQRUOFINIGMY\\TSRSTYWYU^\b^]djlje``\ceha\[`aa_^]\bd_Ydv|mefkidcknsssrrrqprrstppupoppqrrrqqqnifgkpppqrsttspmghkmi``dfcfghhjkmopolkknpnmhlsyyvuuuspmsrqpoqrqppprttsrrstuuttsrsrrsrqppoonnnnnnmkjijknnoprsssvwyzzzzzyz{||ztqmklmnnnnnmmmmlmnopqqpnmouw{|y{}}|}~~}~~||}}{zyyyyxwvutsrrrqqppppoooopoonopppoooooooppppqqqqpppppppppqqrrrrrqqqqpooooooonmlkkjjjjjiijjihhggfeb`^XMB:301148;=@EIHKPSUVVWWVVUTRSUVUQQPMKD;87753//255358548CF>659A?899636@A@@<=@DGFEEDEJMUYZXRU[WEV]YTEJPPRQNT[ZXRTXULKOMMV__YQTTUSXX\X[ZbZahjlmi^\^bdf]Y\___^]\]dc`]_q{leddadhjmqssrrrssvvsqlosooopqssttstrqqsuusrruvuuspollklliebfgjlmllmnonmooooonliqvxwvuvxtqlrrqpoqrqppqsutsrrstuutsssssssrqqqqqpoooonnkiggillmnnoopruwyzyyyzyz{|~~~{vpnnooonnnnnnnnnopqrsrpopqsn}~~~~~~~~~~~~~~~~}}}zwwwvvvuttssrrrqqppoooooooooonoppppppooooppppqqqqppppppppppqqrrrqqqqponnmmmnnnmlkkjjjjjiijjihgffeaXQLG@84311369;=@EJJLRUWWXXXXWVUSTUWVTRPMH@9644332014554368:<>:4//0246642125:>AEB858@>7:;837A@=@>?BEGHGECCGMUYYVRW]]KVZ[YORTQUUQV]]ZTW\[NJNNV_c`WQWXVSXZ^\^ZaXahiknl[Y]^ceYY`b`__^]_dafc]m}neb_]hllmqsrpoortwwufmttpnnoprstttvwvvwwvtsstvttrmnonlljgbkolkmopnooopmoqsqonmjrvuusstwurnrrqppqrrqqrtutssstuttttsttttsrrrrrrqpppoonkigfgkkklllmmoruxwvwyyzzz{}~~{vsrqpponnooonnnopqsssrqqqs|kt~~}}}~~~~~~~~~~~~~~~~~}}~}wttutttsssssrrqpppopopooonopooqqrrrqppooopppppqqqppppppppppppqqqppponnmlllmmmmmlkkkjjjjjjiihhgfec[L@:763233459:;>AB;56<;7:;936@><@@BFGGJKFBBFMTXXURW]_SWVZ^XYZWYWUV[][X]a^OIMP\dd^UQXXTSZ[^\bZ_Ybffglk[YYZ`cXZcecba___bbif_n}pe`_aknmnprqpprrrttrntrhmopqqsststvwwtqssuttstrqoloopmlmikpoonprtqqstumoqtrnpsoptrrppnproqssrrrssrrsstutttsuttttttssssssrrrstrpprqpolifghkkjjiiklmprtttuwyyzz{|}~~|{zwusqpppppqqonopqrsstsrqrw|ppw~~}}}}~~~~~~~~~~~}}}}~~}~~ytrrssrrrrrrrrqppooooooponnopppqrsssrqppppppooppqppppppppppoonooppponnnmlkklmlllkkjjiiiiiiiihfeedcW<30/0013557:;:964212321259<>>>=;96300124688643249>?>=:669858:957=<<@BFKIFMNGBBGMTXWTRW_^YWUY_[\\Z\ZXTY[W]dcZNLQ\b``\UOWURS[[[Zb[]`cdb_ikZ^UX^aY[dgeda```cdig`n}na^`flonoqrqqrsrrtuttwtpppqqqstsstuwwsqrsuutsrrrqppppmmnnoqopqsuusruvumpqtqnqvsqqqnoqomnmsqqqstttsrttutttttttssttssssssssrrrtrpqrrqpmjghjljihhhikmoqqqrtvxyzz{{|}}}~}{xurqpppqrqpnnpqrrsstsrqprv{~~vz~~}}}~~~~~~~~~~~~~}||}~~}zvrpqrrqqqqqrqqppoonnoooppoooppqrstttsrqpppoooooppppppppppppoonnnnnnnnnmlkjjkkllkkjjiiiiiiihhgeeedcZA4/--.148<<<<::>BHLRVZ[\[ZYXWUUUVUUSROF>:75421233357:=>?>=:74101345777654437?@;876797469857<<=ACJNHFMNHDCHOTVUTT[`^UTXYa_\^``^[PTYYae`VOPVa`Z[ZUMRRPV[]X]`[]cdegdhk\_UX[`[Zeeba``abehjgbo{k\Z`inoonrtqruuutuvvwxvsqpprsstttstuuvuuuvussrsttssrpooppqrrrsuwvtsuwtnpssqnqxytqomopqnkiqlmqtuuttuvuuuuuuttvqstssssssssssrrspoqrsrpmjhjlljhgffhjlnoooprtvxzzz{{|}~~~}{yyvroqssqponoopqqrsssqpoosx|}z~~~}}}~~~~~~~~~~~}}}}}}|{||}~~~{wtqqqqqqpppqqqqpponnnoooopoopqqrstttsrrqpoooooooooopppqqqqppoonnnnmmmmmlkkjjjkkkkjjiihhhhggggfeedeecM90---/49=>:9:9655566688788998865432123469:855655439@=634698434447<>@CFJIILONJHJPWWUTUZa\TYc]VaYR]ace\LQZ^d_QPX[YYTRV]XRPS[\\\Z``bda_dddljc\Z[[`^Va[R[^`abfmmecqvcXYblqnmnuursvwwwwxxxxwwvutuutttssuxxxxxxwvuuvwwwuuvutsssssstuvwwuuttttsssqrsvvrqoqpkmpopuppqqrsttvvvuuuuuuttsuqrtttssssssrrqprttsrpommnmkigfeegiknnmmnonrvvuxyyz{|}}}||{{|{wqqtrqponmnopqqrqpomklrz~{~~}}}}}}~~~~~~~~~~~~~~}|||{zzz{{{zzz{|}~~~zvsqqrrrrrrrrqqqqqqpoooonmlllmnpqrrrrrqpoonnnnnooooooppqqqqqpponmmmmmmmlllkjjjjkjjiiiiihhgffeeeeeeeeedW>0.--.26:9348=BGKNPTWXXZYUTSSUWUNHHHB=865469;<;:987886544444334469;966666548??733699655458;86546=:8775578877777679=<87677767=@8336:;976568<:::;9779:886666669;74359;:87678001111258974348:;<===<;:@GB=ADEEB?=;:::::;96?KKGDB?<;9769>CB>;>@<7544477655566654358::87778<;<<;;:76;?BFB=ADA93311666544663334579987777BB?=;;<>?>>@CB;@>DE?:5478884212465447EFELPMJFA?>97:;843322232/1345678755756<@FKMLMSYZW[`^\\`chgfhe[XT]aadb\b`W^fY[[[\_fieXR]Z`bbca\\bbke`be\VTZbiaZbmdaaig`cXL\jkkkhiqojiilrx}~~~{yyyyyyxwvvuuuttuvvwwwvvvvvwwwwvvvuuuuttuwwwwwwxwuwwxvsrrqomllpqpoqrpnnruwwvttuuvvvvvwxyyxutrpppqrttvvuuttttrqpponlkkhfdifkheehjjiijjjjknnlllklmnqsssssstvyz|}}yusttronnnopqppomllkkjjnrvyyxwwwxyz{{}}~~~}||||||||||||}~~~~}{{{{zzzz{{{|}|||{zzzz{||}}~~}~~}zxvvvuuz~xtpmmmkkkklllmmmnopqppppponmlllmnmllkjihgghjklmnooooonmllllmmmllkkkjjjjjiiihggfgghhffeeeedddeeedddcaYF::216::859=<=:4102587658<@?778556789:=AFKPQQSSOJGFCDMRPNKD?A?AE=9??>437605776?CAB<411489:999<>?50234437=BGMRX]abccb_ZPFFMRPNPNE>?@><;>GLDBB;;;52013552/0345666533458>CIIKONQWXY[]^^aeb_geb`]_`Y`dZ]gcUYdf\_bd]\cmeWU^`_fddda]efnf`ic[YZV_jeaclhbabccb[Y_fklkjlcf_gnux}{yyyyyyyxxvvutttuvwwwwwwxxzz{{zyyxwwvvvvvvwwwwxxxwvtsrqomllmmmnnljlllijnqrssuuvuuuuvvvwvwvvutsqqpqrsssttuvwvuspnljiiihhghhifdehiiiijlmllmlkkkjjklmmmmllmoqtvvxy{~}yvsqppooppqponmmmlkjlnrvxxxxwwvwwwwwwwwwwwvvwx{~|yyyzyz|~~|||~~}~~}|}}}|||||||||}~~~~~~~~||||{{zz{{{{||{{zzzzz{|}}}}}}}~~~~~~~xtsrqqpoq}|z|}|||~~zsommoonlkkklnnopppqrrqqqqpomkjjkllllkjihhgggijjklnooonnmlllkkjjjjjjiijjiiihhggggfffeededdccccdddcb_VNB6/28:1468:CGEE>5347:<=====;<4023345@NWXY\afijigggfd^VSVSLPRMFCCA>>@GUPAA<;>86413773/045666643237;@FJGJOLOVXZ\]]][^]]abgd`_^]ce\^g`V_hg`YZh^Yam]VZbcc^befd_gfhdch`\Y\U]jheclhedcced`_`dgijjg[`lrtu~}{zyyyyyyxwvuttuvwyyyyyyzz|||||{{zyyxxxxxxyyyyzzzyxvsqqolklmnnnmlllkkhilopqqtuvuuuuvvuutuuvvutrqppqqrrtuwxwwuspolihhhhhhghgfefhiiijknnmllllkjjjjkllkkjklnprsstvz~{xusqqppppqqqpnmmmlkklpuwwxxwwwwvvvvvvvvuutsttuvvutuvvwwxwwwwvuuuvvwxyz{}}z|~~}~}}}~~~~~~~~~~~~~~~~~~~~~}}}~}}|{|{{{{{{{zzzzz{||}}}}}}}}}}}||||}zusqqrxwrx}}~~}|zyxxyzyz|~~}{z{}~|ymnnmnooonmlllmmnnnoopoonnmmlkjiijkjjjjjihhggghijjklmmnnmllkkjiiiijjiiiiiihhhghgghffeedddccbbbccddb^VH>60.16;567<@HIEB;558;=>@BBB@>>500017FVbgdbdhhjkhfcbdfghgbZSQSUPHDCA?ADPL>C?:?=>=33784/157666643459=CHKGJPMOVYZZ[__\__`\afdaa``aa_`fa]hkfaZcodVec[Y`dei\]cde`ec_^fc]\V^V[ikfbkghfbeggec_`cekleVe{uss|zzyxyyyxwvuuuvxy{||||||||}}}||||{{zzzz{{{{{{{{{{zxvtsqnkklmmmkklllkiiknpoortttuuvuuutttttuuurqopqqqqsuwwvvttroljhghhhhghgffghiiijknommlkkjiiijjkkkkkklmopqqqsw}}zxusrqqppqrrrpnnnmlklnqtvvwwwwwvvvvvvvuuuttuutuuuuvvvvvvvuuttsrssstuuuuvvsuvuw|~{yxxwy{~~~~}}|||{{{{zzzzzz{{{{{{|||||{{zyyyz{trrxxv{}~~}}~~}||{zzyyxxwvuuuvvvvwwwvutuwy{~}zxtpkjnmnopppponmlllklllllkjjjkkkkjiiijiihiiihhhhhiijjjkllmmllkkjiihhijjiiiiihhhhgggggfedcccbba```abbc_RE:31/-/39:9:@FLID=747?DE748:5027865665467:?DJLIKQQPVZYXY^`_a`d_a`abca`]]adgfemjec]lf_[`_^]dcbhcV[`d^b_XXc`[YT_YZgkfajehhcfgihd\\_aioeYrwonu}{zyyyyyxwwuvwxz{}~~~}}}}}}}}}}}}}||||||||||||||||{zxwuqnlllnonnmnnmlklnponprrstuvvvvtssstuuurqppsrqqstuuutttroljjhgigfghhgghhiijklnnmmlkjigghijjjjkkklmnooooptz}||}zwusrqpqrssqppoonnlmortuuvwxwwwwwwvuuutuuuuvvvwwwwwwvwvvvuutsstuvvvvuvuvwvuvvyzxvx~~~~{vutv{}}~~}||{{{zz{zzyzz{|{{zyxwwwx}svvrw~~}|{yxz~|zxwuuutttsssstttstuuutttssrrrsux{~}|||||~{uspnkjjmmnopqqppomlkjjiiijihhhjkllkkjiiiiihhihhiiiijjjjjjkkkkkjjjihhhhijjiiihhhhgggffffedcccbba`````__YN@521///029;<=CINLE<648>ABCGLMNJFB;219Nfmlkhhjf]`_VRQPOLOV[afgfcad\UKIIA98COKDA:>@CI@68:6237975565689<@EJLLNRRPVZYVV_b^^`gabbbbge`cbcejljlieeik``ab^`bebZcbXZ_a[^_WT`]ZVS^ZYgja`hhfbedehh`WX\^hmd`pvnmv{zyxyxxxxwwxyz|}~~~~~}}}}||}}}}}}}}}}}}}}}}}}}}}}|||{wuspnmnooooonnnllmooooqrrttuvwvsrrrtuutrroprrpqrrstssssrpljjjgifefhiiiijiijklnnmmmljihhhhiiijkkklmnnnnmorwzx{~|ywusrqpqrrqpppponmlnqrsuvwwxxwwwvvuutttuuuvvvwwvvvvvvwwvvvvuuuuwwwvvvvvvvuuvwvuuvyz{}}}wuvx{|{zz{{{xvvwy{~~}zz{zzz{zzzz{{zyyywwwww{uw}~~~~|zxwutvxz}|zxusrrrrrqqqpqqsssrstttssrppooooqrwzyyxxxwy~{xusqnmlkjihjkmnnopqqpnmkihgfffggfffhjlmllkjiiijhhgghiiiijjjjjjjjiiiihhhhiiiiijiihhhhgggffeedcbbbbbaa`____[SH=4012233469=@AEIQRJ?86;ADEGKQSRLGA739PdhggegidYW_YMLMNNLKORUZ[\^\aVUIIKC83=NNGBAGHJG>987547:856677:?BBCIOQRWVQY[YUTbeZV`i`bebfmhcjiddgjhhijili[\_cdddb_\ZX_^aYUX\]QZYWRRUVSXTQ\g]bfi_`aWNW_Y]bXagvxrqx}zyxxxwwwxyz|}}~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}{wutssssrqpponnmopqqqrsrrttttsstttttsssvqlqqqppppqrrsqnjijighfefikjkkkkjjklmnooonllkkjihhijlmmmnnnnnmnqttrvzzz{{zusqqqssrqqqpqpnmmnprstuvwvvvuvuutttuuuuuuuuuuuuvvvvvwwxyxxxxxxxwvvuuuuttssrrstsrsstuuuuuvutstuwxwwvvxwwwxy~}~~}}}}}}|||{{{{{{{{|}}}}~}}}}|{zyyyzzyxwvutrrrssttttssrsssrqqrrrrrrrsuwy{~~~~~~~~~~}|zzzzyzzvvy~}{zxvusrqrrstsrstsrrqpooooopqpppopprssssssrrrqpoonmmnnprrqqponklpprv{|yxvtrpnlkjhghiigfghhhhhhjjiihhhiihhhhgfedefhhiihggghhhggggghhhhijiiihhgggggghghiiihgffedeeeddcbbba`_____^^]\]]TG9200479:;>BBA?CFHGIPLA::<@CFIMTUPHA99HXUPUX[_`YNNUXRMPSTUUSSSSSQMONIHJOMKG?8:HNIC@DGIGD?:666458745789<@CBCJPTSTYQW\ZVWddYV_e\_fcfkeflib`chfhjhgie]_`adda\][WXab_YX[[^PYXWTSQSOPQOXaZ_cd^a^RSeg[dVXinz{ttx}zxxwwvwxy{|}}~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}{yxwusrrrqqqppnnoppqrqppqqrrtssssrrrptppstrqppppqqqqokihjhfhgffgkkkkkkkjklmnopomiggghfghikmnnnnnnnnnoqtqnqvwx{~}ywtrqrsrqqppqqponnnpqrsttuuuuvuutttuuuuuuttsssttttttuvwxwwwxxyxxwvvuvvuttssssttttuuuutttuuuuvvwwwvuuvuuuvwywyzy}}|z{{y}}~~|}{xuw~wxy{{|}~z~}{{|zxxxxxxxxwwvvvvtssrsttttuuvvvvuutrqqqqoonoppopqqrsttttsttssrrrrrrrsvwz|~~~}}}}}~~~}}}}~~}}}}{|||{|~~~~~~uuwwvvxzz|~~}~~}}zwwy{|{{{{ywvtrqpppqrrrrrrqqppoonnnoooopponoprrsssssrrqpoonnmmmnopooonmlkkjihjnopomkijmoqpliijigdccddddefffgghiijjjihgfedddddfggfeefghggfffgffghhgggggfffffgggffeedcbbbccccbaaaa`__^]]]\\\\[\VG:1/0169?@@?DBGCEFGGFGD?<:<@CDFHMMHB<?:55633663479;=ABBDJOUSRYQV]\YZbbZX_aY]ebbeffkkcbgidieaiacail`YffW\\WYbb_Z[][_RWWWTTPRNIPVY\W]bc`]ZQ`lbZfSbqtxywvx}zxwwvvwy{|}~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|{{zwtrqrrrrqqonnooqqqopnoprssrsqpqqpootutrqppppppppnhhhigfggjgeljkkllkkjklmosmiijjjhjfglnnnnnnnonnnpqrolotuvz|||{yuqsttsrpoprrrppnnnoqrrsuuuvvvtttuvvvuutsssrrrrrsstuvwwwwxxwwvwvvvvuuuttttutttuvvwwwvttvuvvvvwwwwwwvvuvwvuuuvvwwwwwvuttssstuvvvuuvwvtrqqttutuuvvvvvvtttsstvwxyyz{}{xusrsssttttttsrrrrrrqqpqrrrrrrqqrrsrrqpqqqqqqqqqpppqrrsssttssssssssrrsvx{}~~~~}}}}}|||}}~~~}|{{|}}}~~~~~}}}~~~}|||||}}}}}}}~yvvusqstttuuutsssrsuxxwvvvwwvwwwvtsrpooooppppqqqppoonnnmmnooppppoppqqrrrrqpponlllllllmmmmlllkjihgfedfhihgfefjmomjfffeb`__```abdddefhjjkkkjihfedcbbcdeeeeddeeefffffefffffffeffeeeeeeeeedcba```````_^^__^^]]]\\\\[[XPF92/147:>EGDBCHEEFFGGDB@=;<=?@ABBCA>;;?IKFGJPVYYWUX\YTRSVY\\ZXXXYZYXYWSPMQTOLKHHJKIFFHHG?;=:5453244337;=?ACBEJOTRQUPT_`]]__]\__Y^d_^bffigddghb`]gf_cdoneYaie_WXZ`a_\]_\`UTVZUTRPNFTZZYTZ^a[VRQec\[eYiwwvxyxy~zxwvvwy{}}~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~}}}}}}}}}}}}}}}|||{xvsrrqqpppponmnpppnpklnqqtptlppopruwvurqpppooppojhhghggfefecjijlmmlkjjklmlhghhgggebdjmnnnnnnnoooppqljnrstxwvyz}}|zyywusqqssrqqpnlmmnpqstuvvvtttuvvuuuttssrqqppqqrstuuuvwwwwwwwvvuuuuuuuuuuuuvwxxxwwwwvvvvuuvwwxxxwvvwvvutttuuutsttttsstttsrrqrsttsrqqrsstuvvvuvwwvutsssssrpqqqsttsssrrrrrrrrrrrqqqrrssrqqqqrrsssrrssrqpppqrrrrrrqqpppqqqrrsttttssrstuuvy|~~~~~}}}}||{{{{|}~~~~|{{{|}}}}}}}}|||||}~~~~~}|{{{{||||||}}~~~}}}}~~~~~~~~zwusrrqqqqpooopoporrssrrrrssssrqponnnnnoopoooonmmmlmllmnoppqppppppqqponmlkjhiiijjjijiijjiihhhggfefgfecaabdddc`^^__^\\]_``abcccdegiijihhgfeddcbbcdeeeeddddeeeeeffffffgggfggffededdccba``_____^^]\\]]]]]]]]]]][ZQB30016:=@CIKHDEIDFGGFHD>=<<=>?@ABA@?>>@EIJILOSXYWYY^c]XWWZ\^_\[[[[[\^][WTQRVWTRNNNLJHJJHG?:=954420233249>@CEDFJMSQPSQU`b_]^^__^^Z_c_]aegcbbcgf_\bddadckkm]cick^\]^``^^`\aZQW[UVSOPHX^[XVW]_NQUY__V^bboxz||{yyywvvwy{|}~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~}}}}}}}}}}}}}}}}{yxutqponnnopnnnoqpnpkjmopqpioppoqstqppppppoooppojigcfhjgbbcbghjlmmljjijjkjihfeddedbdilmmnooooppppookknqpqtrprsu{}wtrrrrqrponlmmnoqrtuvwvusstuuutttttsrqqqqqqrsttttuuvwvvvvuuuuuuuvuvuuuvwwxwwwwvvuttuuuvvwxxwvvwvvuttuwwwvuttuvvvvvvutttstttsrrrrtsuuvwwvwwwvtttstttsrstssssssssttsrrqqqqqqrrsssssrrssssstssssssrrqrrsstssssrqqqqqrrrssttssrrstuvy|~~}}}}}}||||{{{{|}~~}|{{|}}~~~~}|{{{{{{|}}~~~~}|{{{|||||}}~~}|||||||}~~~~~}ywvutssqoopttqpqppqpoooppqqppoonmmmmnnonnnnmllllmmlmmmnopppopppppomkihgfeefghhggfffggfffghggffgfec`^]^^^\[\\]^_^]_abddddcccdefgfffffeeedddddddefeedddeffffggghhhhiiihhhhhfedccbba``__^^^^^]\[[\\]^^^]]]\ZVJ?73249>CEHGLMJEDEEEFGHFA=;<=>@ABDEEFGGGHKMOPRTWZZY[\`eb^\[]_`a_]^]Z^aaa_YWWWXZYXUSSPLJLMKI?9<954310122226=@DHFFJLPNORRVac`^]_a`__^ac`]_bd]cbcfe`b^_cbdckmnZhjcchba_`___a^b^RWZWWVMRL\`[W[U^[QWZ[SbU]bjtz}|zy}xvvwy{}}}~~~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~}}}}}}}}}}}}}~}}|zzxurpnmkklnnnmnqqpoliorotfaonorrqohlkoooonnoopqmicafgjhb_abfijlmmkiiiiijlkifdddehefknmmnpppqqpprpmjknonopnmkkjqx}}xsqqppqpoonmllmnorstvvussrsssrsuuuutssrrrrrsttttuuuvuvvuuttttuuvvvvvvvvvwvvvvvvuuuuuuuuvvwwwvvvwvvuvwxxwwvuuvvvwwwvutttuuuutsstuuutuvvuvvvuttttttttvvwvuuuutttttttssrrrrrrsttssrrsstttssrrrsrrrrrrssuuuuutsrrrssssssssssrrrsuwx{~~~~}||}}||||||||{||}~~}{{|}~~~}|{zzzzz{{{|}~~}}|||||}}}}}~}}|{{|||}~}}}~zwussrrrrqqpqppoppppqqqqpooonmmmmmnopppoonnnmllllmmmmmlmnmlkkkjihgfedddfffffeeddddddeffgffeedc`^]\]]\]\[\^^___`deggfedccabcdeedeeeeededeeeeefeddeeefgggghhiiijjjjjiiihgedcbbba`___^__^]]\[[[\]^^^][WUOG;22368?FJOMHLLHCBABDEFFC?;:<@ADFGHJLNNNOPPQRUUXZ\\[\^`ec`^^`a`b`_`]Z_cdda[Z[YYYYZYWVUQJKLLJ@:;964210001104;?FKHGJKNKOPRX_ba^__b_^__bba^_aa_`acedaa`acccdjlfVskd^egf``aaab`c[YYZXWWMSU\`\\aVXUYXaZW`W`ekuz~}zy{xvwz{}}~~~~~~~~~~~~~~~~~~~~~}}}}~~~~~~~~}}}}}}}}}}}}}}}}}||{{zwspmljihkmlkmqrpoljrrloa_gloqqomnmnooonnnmnopnh]bdfigbZ`dgijlmlihhiiijjiheeeefhefklmloooppppprqljlmnmmmmkijjlprux}ysoooonoononnmllmoprsttrrrqqqrsvvvutstsssssttttsttuuuuuuutttttuuuuvvvvvvuuttuuuvvuvuuutuvwwvuuvvvuuuvxxxwvvvvvvvvvuuuuuvvvvuuuvuuvuuuuuuuuuuuttttttuvwvvvuuuuuuuuttsrsssrrsssrrrrrsstssrqqrrrrqqrsstuuvvutsrssstttttssssrrrsuxy|~~}}}}}}||||||||{{|}~}||}~~~~}|{{{zzzzzzz{}~~~}}|||||}}}}}~~~||}}~~}|||~~~}zusrrrqqqqppooooppppppooonmlmmmnnoooonmmmlllkkkllkkjjjiihggggfffedeeeeedddcbbbbbccdddccbaa`_^^]]^^^^^_acccbdgijjigedc`abbcccdeeeeffeffffeeeeeffghhhhiijjkkllllkjjkjgecbbbba`____``_^\\[[[\^__^ZTLHA:4137=@GJMOQJDB@;::<:742210034249>GMIHJHIGLOQW]aa_``b^^abcb`_^^^^`cdfecbbbddbejh^Ztgf^`iia`acdcad[\Z[ZXXNTY\_^`cVUS][a]\_Xapkrw~}{yz}xuwz|}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}||{yurmkhgehjjhkpqomljsrih`cimonlmprqpoonmmmlmnnkdZdbbge`Z^eghjkkjhghhiijihgfggggfddhlmmooooooonsqjjmnmllljihhfghiknu{}xrnmlmnopqponnkjjklnpqrrrrqpprsuvwvuuuttttttttttuuuuuuuuutssstuuuuuvwvutttssstuvwwvvuutuuuvuuuuuuutuvwwwvvvvvvvvvuuuuuuvvvvwwwwwwwvutttuuuuuuttsttuuvvvwwwvvvvuuuuutssrrqrssssrsrrsssrrqqqrrrrqqsttuvvwwwutsstuuutttttttssstvyz}~}}}}||||||||||||{{{{|}~~||}~~~~~~}}|{zzyyyyyyzz{|}}~~}||||}}}}~}}}}{|}~~~}|{zz{|~{vvxyy|~yz|}}}~}{wusrrrqqqppooopppppppoonnmlmmmnnoooonnnnmlllkjjjiihhhhhhhggghhhhgghggfffeddccbbbccbbbba``````_``````abdddcdgikjihfedabbddddeffffggfggggfffeffghhhhhhijkkklmlkjjjihgecbbbba`````aa`_]\[\\]__][VJ?<72149FKIHIDCDILNSZ`_^``a^_bbba`_^^^_abdfdcccdeecgkf[eqcga]jiaabdec`d[]\\[XYQWZ\]^bbUTUZ]````Zkuely}{zz}xux{}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}|{zvsmkihffghgjnomkkkppkjgknooifjmpponnmmnnnoojc]\i``ec_[_bcfhiiiffhhhiihhhggffedcchkmmnnommmnmrojkonllkkhhifeedefinrqomkjklmnoppponkjjjjkmopqrrrrrrstuvvuuutuuuuuuuttuuuuutuutssstuuuttuvvutsssttttuvwwwvvuttuuuttttuuttuuuuvvvvvvvuuuuuuuuuvwwwxxxxxxwwvutttttuuuutttuuuuuvwwwvvvvvvvvutsrqqqrssssrssssssrrqqqrrrrqqsttuvwwwvutssttuutttttttttuvwz{~~}}}|||||||}}}}|{zzzz{|}~~~~~}{|}~~~~~~}}|{zzyyxxxyyyzz{{|}~~}}||||{{{{{{zyyz|}~~}|{zxwwxy{|~}{xutuvuv{xuuvwwxwuututsrrrrqqpppppppqqqqqponnnmlmmnnoooooooonmmlkkjjiiiiiiijjjijkkkjjjjjjihhhggeedcccccdccbaabbbdcbcbbbbbcddeddfghihgfffeeefffefggggggghhhhggggggggggggghhhhiijjhhhgfedcbbbbaaaa```a``_^^^^^^^^WNF<442016>BEGMNPM?865434566778:=;4111237999:?CFDDD?=@GIINV\_^``_]`bba`____`abcdedccddeegikf\lnbfe_ki`bceea^a[_\[[W\UZ[^\^baVTTXZ\_bbasq_o}{z{}wvx|}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}|{{wtmjihgghijknnljjjlmonklmiloqkkmnnmllmoopmmf`^ahcada^\^``deghgeefggghgghggdddcbbfiklmmnkjiklomjlnlkkjjfgjfedddegiihgggghhijklooonlkjjjjjknpsstutsrsstuuuuuvvvvuuuuuuuuuttutsssstuvvuuuvuttrstuuuvvvwwvvuutttutttttttttuuuuvvvvvvvvuuuttttuvvwwxxxxxxxwvutttttuuuuuttuuuuuuuuuuttuuuvvuttssqqrsssstttttttssrrrrrrrqrsstttuuuutsrrstuuuuuttttuuvxy{{}~~~}}||||}}}}}}}|{{zzzzz{||}~}}|{|}}~~~~~~}||{zzyyyxyyyyyyy{|}}}|{{{{zzzzyyxxxz|~||{yxwvutttuvxyzyxusrrsssux{zusrsssttsssssrrrrrqqqqqppqqqqrrqponnnmmmmnnmmmmmmmmnnnmlkkkjjjjjjjjkkkklmllkjkjjiiihihgffeeeeefeedddfgfeddddddddddeedefefgfeefgfgggggfghhhhhghhhhhhhhhhggggfffffgggghggffeddcbbbbbaaa```___```___^^]]YI<3.024436@GGGFFGC913432445677;>ADIMPRSUXYY[[[\^_`abddffghgfgghijjkllljjlnonquvutsssqpljjigfb\RKHGJKF=>?8311369==<<9:=FGEHOZ^^`_\[ba_a`__```abcdedccddddihif]rgcfgakh_bcdc`\^]b\Y[U]Y\^^[^aaYTTYVX`aclupht}{{|~wuy}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}|}}}}}|||xunjihggiklmmmkiggillpdqqrspommnnmkjkklljkhfbcehdcc`]\^^_bcefedcceeffgggfecccb_^cejkkmniffhklkhijgjiihegiedddcdeeedccdeeeffghlppmnmmlkkjjlpstutsqpopqrttuuvwwwvvvvvvuutttttsssstuvvvuutssrrstuuvwwvvuutttttttttsstttuuuuuuvvvwwwwvvuuttttuuvwwwxxxxxwwvutttttuuuuuuuuuuuuuutttssttttttuutssqrssstuuuuuutttsssssssrrrssttttttsrqrstuvvvvuuttuvvy{|}}}~~~}}||}}}}}}}|||{zyyyyz{{|}|}|{|||}~~~~~}|||{{zzzyyyyxxxxz{|||{{zzzzzzzxxxxxw{xxwvutssrrrssuwwwvtsqqqqqrsutsrpqqqrqqppqqrrrrrrrqqqppqqqqrrqponnnmmmnnnmmmmmnnnoonmllllkkkkkkklllllnnnmlklkjjjiijihggggfghhhgffghhggfffffffffffgggeeddeefhiiiiihgfghhiihhhiiiiiiiiihhgffffeeedddedddccbaaaabbbaa```_^]^__``_`_]\[SA3,*/289869?FFA?>93.13334578::>BCGKORSTVY\\]]]`abcdeffhhiiiiiijkmnooqqrstvwwxyzzzyyzyywwvurplf[QJHIKH=>C<62026:@A?>=:6787670+*/4;?>;78@B;8520/1445679;=?CECGLPSTTX[^__^_acdffghhijjkkkklmnoqqsuvwxyzzz{|}}}||{{zz{{zxwvqg\QJKMH?>C@:42139AD?;:6335547=BCAGLV\\[YX]a_a_]^`abbbbbccbbbcefflecbomhfedblg`abefhikkm^X\PXa^baZ[\\YVY_RUc`gpuvu{~}||}vuz~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}||}}}}}}|zwplhfffjmpqonjd_]`ed`]rvnkjkjjgddefffcbegkljghgeb^[[\^]]_____`_`bcdccdeca`^\[[\^aeghijhb`dghh`]``ccfcchfeeeeeddefhfeddcdeghhhghknooonmkjlpuy{yvrqooopqrstuvvwvvvvvvuussssssssssuuwvvutsrrrrstuuuuuuttttttttttttssstttuuuuuvwwxxxxxwwvvuuuuuuvwwvvvwvvuuttttuuwwwwwvvvvvuuuuttsssssrsuvvvuusssssttuvvuuuuttttuuuttsrrssssrsrrqqstuvwwwwvvvvwxx{|}}||}}~~~~}}}}}}}}}}}}}}}|{zzyyyyyz{{}|{{zz{|}}}}}}||||{{{{zzzzyxxyyzz{zzzz{{zz{||}~rrrrqppoqqqqqrttttsrsrrrqqqrrrqpopopppooonopqqrrrrrrqqppqqrrrqpponnnnnnnmmmmmlmmonnmmmmmlllllmmmmllkmmlklkkkjiiiiiiiihhhijjjihghiiihhgghiiiiiiiiiihggfgghijjjjihhggggggggghggggggfffffgfffeedcbaa``aabaaaaaabccbbaa`__^^^___^^\[[ZU@/+,04:@A?9798521012455789;=@EGEEGMPRSUY\^````bdegghiijkkllmnnoqstuvxxyzz{{||}}}}}|{zyz{{{zzyvodWNNNIC@CC=73116@F>874335559@EEDKPV[[ZZZ]_^`^]^`accbbbbbbabceggke`csifddbdgfdfhlolkllo_X]OTb\__\YWXXX\cPRechpuxz}~~~~}||}ww|~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}|||}}}}}|{xsnieefiloqpqk]TS\chelnleeeeb][\^abdfeefhkhgfefb_]VW\`]\]^]\^]]`a`_`abcb_^\ZZ[\_adfghhhdbeghi`[^_aadccgfgggfffffghgfedcdfghihghkmnnonmlklnqtz~}zwwvurqrrsuvuuuuuuvuutssrrrrrrsuuvwwvutsrrrstttttutttttttuuuuuutssstttttttuvvwwxxxwwwvvuuuttuuuuuvvvuuuttsstuwwwwwwwwvvuuuuuuttuuuvuvwwwvvttsstsstuuttttttuuuuuttssrrssssssrrssuuvvwwvvvvwwyz{|}||}}}}}}}}}}}}}~~~~~}}}}|{zzzzyyyzzz{{z{zzz{|}}}}||||{{{{{{{zzyyxyyyyyyzz{{{{z{|}~~}}}}~~~qqqppppqpqrrrrsttsrrrssrrqqrrqqpoooppppooonopqqqqqqqqppopqrrrqqpooooooooooonnmmnnnnnnnnmmmllmnnmmlkkkkkkkllkkkkjjjjiiiiijkjjjihhhiiiihhiijjjjiiiiiiggghiiijjjihhgghhgggfffgffeeeeeeeefggfeedca``___`aaaa`aaabbccbba`_^^^]^^^^][[ZZXF1,-/37=<975442044456778:;<>DGHDEHMPRSUZ^_aabbcefhhijjkklmmnoprsuvwxyzz{{{{{|}}~~~}|{zz{{zzzywsj\RPQMFCED>95002=F<56545556:BHGGLQVZ[[[[]^]^^__`bcbabbbaa`abdfgjd]ooiecbadjjjmouulglss_WbSNbYY]\XPTVY_aKWfglpuw|~~~}}|~{{{}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}|||||||||{ytokgefhjmpprl[MMUahhimecbddddb`^\ceeffghkgffde`]]OW_`][_^W[\[\__\X[_aeb_^\YY[\^_bfggggdceghha]``abdcdffgghgggfghhgfeedeeghhgghjlmnnnllkklnqv~~{yvsrssttttttuuuttsrqrrrrrstuvvvvutsssssttuuttsssssttuuuuuttrrrsttttsstuvvwxwwwwwwvvuttssssstuuuuuuttsstuwwwwwwwwvvuuuuuuutuvvvvvvvvvvuttttssstttttsttttttttsssrrssstttsssttuvvwwvvvvwxzz||}}}}}}}}}||||||}}}~~~}}|||{{{{{zzyzyyyyzzzzzz{|}}}|{{{{zzzzzzzzyyxxxxxyyyzz{{{{z{{zzzxy||||zxxxxxoppppooppqrssrrssrrrrssrrqqrrqpoonnppqqpppopppqqppqppoopppqqqqppooooopppppponnmnooonooonnnmmmnnnmlkkjjjkkmmnnnnmmlkkkkkkkkkjjiiihiiiiiiijjjjjiiiijihhhjklkkjiihhghiihhhgfedcbbbbbcdeeeghgfdba_^^^^_`aabbaaaaabbbba`__^]]]]]]\[YZ[Z[J5/./1376543211/4556899:<=@BGHIDHIMPRTV\```bcdefgiijkkklmnoprsvwwxz{|{{zz{{||}}~~~~}}|{{{zzzyxun`VTTPIFFFB=82118C:355687673/../123321122/2578;HLHIOUVVY\_`^]_`abaaddbbdea`_^abba[e^jl`eikmmw{xtmg`[VZixv^[\UUYVKSZXRUZ___clw|~y}|}~~~~~~~~~~~~~~~~~~~}}}}|||||||{{{zyvrlheeegijllneRNZlonlhedb]da][Z[^bhkljfikpkecZ^_Yba^]^[RZ]\ZW\ZOKPSW`[[[VOPPPSYZX\bddeeghhgfgiggffgggghggggghhgfffffffffffggijjjjklmnmmkjggks|~zwuttttstssssrrqppopqrrssssttttuuuusssrqqqrsstttttsrrrrttttttsstuuuutttttuttsssssstuvvvuuuuutttuvwwwwwwvvvvvvvvvuuttsrrqqqrrrrrqqqqqrsssssssstssssrrrrrrsssrrrrrrrrsssssstvxz{|||}}}~}}}||||{{{{{{{{|||||{{{{||{{zzzyyyyyyyyyyyyyyzzzzyyyyxxxxxxyyyxwwwwwwwxy{|zz{|}||}}|yyyzzyyyzznnnnnnppqqqqqqqpponnnooooopqqqqppppoonnmnmlmlnoopppppopppppponnnmnnoooopponoppqqqqqrqqqpqrrsrrrrrqponnmmllmnooonpooopoonnmlllllllkllllllkkjjjjklmlkjjijiihjjjihhhhggfeeefeeeefeffgggffedcbbbaacccbbbccba`__^^]^^^__^^^\\[\\][XVOHA:410/0013443211112477;=ACFHIJNMILQRQQTX^```bdfghijklmnnnoqrsuvvyyzzz{{{{{{||}~}}~~~~}}||{zyxwwurkfaZTPNMLKGB=9632531557<<78?HKGGMTVUWZ^_^]_abbbbeeccedaa_^aba_`b^mjijouvrvqke]\][W[ixt]W[NVZVNTYVVX\b``iu{}~}w|}}~~~~~~~~~~~~~~~~}}}}|||||||{{{zzyuoieddchplnlRLKPW`a_]]dbgfaXYX]ddgflfbdlpoefU^]acb]]bVVZYZZUXWJGOMMZRVSOLKJIIKORZ^^dgeffffeghggggggggggfffggggggffffgfffffghjjjjkllmnonligglt|xvtsstttsssrqpoopqrrssssttttuuutsssrqqqqqrssssssssstvvvvuttttuuuutstttttttttttttuwwwvvvvvvuuuuvwwwvuttttttuuuuutssssuttttrqpppppqrstttttsssssssssrrrrrrqqqqqqpppqrrrrsuwy{}}}}}}}}}|{zz{{{{{{{{{{|||||{{{{||{{{zzzzzzzzzzyyyyyyyz{{{{{zzyxxxxxyyyyxxxxxyxxz|zzzzzzz{}zxxyyzzz{{|nnnnnnoppqqqpooonmmmnnooopqqrrqqpponmlkkkjjjklmnoppooooppppoonnnmnnnnnnnnnnopqrssssssrrqrsstsssssrqpoonnmmlmnnonooppqppoonnnoonnmlmmmmmmmllkkjklmllkjjihhghihhhgffffeeeffgggggfgffeeddccbcdddefffedcccba`^^^^]^^^^___^^``a`^WSNIB;4/00/1135554322334699=?DFJLNNORJOTUTTX\aa`bdfghijklmnnopqstuvwxyz{{zz{{{{{|}}~~~~~}}}|{zyxwwvuqkd_XRNMOOLFC>9532320587;=:;AHKEDIPTTTW[\\\^acccceeddec`cdbcda__a_okpttsqif^ZWSTYYX]lwnZV^SVZUSW\WY]`d`cny}}~yw|}~~~~~~~~~~~~~~~~~}}}}|||||||{{{zzywrmgb_bdfknfHEDHLIBL^\dch]^VVW\epokpjegnppgcU`]cbc[_cVX[TUZSPOFCKHFRMQPOLGDA>CGMVZX]addddefgggffgfffgggffffghhhhgggghgfffffgijjijjkmoonmjhfho{zvttttuttsrqqppqqrrssttttttuuutssrqqqqqqrrrrsstssstvwwwvvvvuuuuuutttttttuuuuutuuxxxwwwwwwvvvuuvuutsrrrrrrstuuutsrrrsttssrqponoprstttttttsssssssrrrrrqppooooonnooqqqrsvz{~~~~~}}||{{zzz{{z{{{{{{{||||||||||{{{{zzzz{|{{zzzyyyyyyzzzzzzzzyxxxxxxyyyxxxwwwwwz{yyyyyxyz{ywwxyzz{{||nnnnnnnooooppoonmmllmnnoopqqrrqpoonmlkjjjjiiijklmnnnnnnoopooonnnooooooooonnpprsssssssrrrrttuttsssrqpnnnnnmmmmmmnooppqqqpooooppoonmnnnmnnnmljihijkjjjiiihhggggffeefeddddeefggggggffecbbbccdeeefgggedccba`^^^^^^^___``_^^_]YUSNIEC?6/-./022344333335568;=>CIICCIMQQPQVYXX[_bccdeeefjhbbefggc^^`_plgmkf_WTRQPOPTVY^jsfNMYQQVVVZ^X\ace`fq|~~uw{}~~~~~~~~~~~~~~~~~}}}}|||||||{{{zzyxupjfegggii\<:79>G@BR\fcinnb`dibnqnrnmlnmlh`\b`dad]ebX\[ROZQHGH@FECFILNRRGB?:>BHSXTY]abbcdeefffffffefggffffgijiiiihhhhggffffhhiiiijknoonliggkx}zxttuutsrrqqqrrrrssttttttuuttsrqqqqqqqrrrrsttssstvwxxwwwvvvvvuuuuuuuuuvvvvutuuxxxxxxxxxwwwvvutssrrrqqqrrstttsrpooqstttsrqppppqrtttttttssssssrrrrrrqpooooonnnooqrsttwz|~~~}}}|{{{zzz{{zz{{{{{{|||||||||||{{{zzzzz{{{zzzzzyyyyyzzzzzzzyxxxxxxyyyxxxxwvutwzwvvwwwxyywuuvwxyz{zzooonnmmnnnnoonnmmmlllmmnooooppoonnmllkkjkkjjijkkmmmmlllmnnooonnooopppppqppoopqrsssssrqqqqrrrrrqrqppommmmnnnnmlllnnoooppponoooonnmmmmmllmmljigffghhiiijiihggggfgfffecccbcbcddeeefedcbbacdeffffghgfecbba`^^]]]^_```__^^\ZXUMHFECAA=5.+-/133321013457779DLLWUGB@<>ADPZVY]_``bccddeeeeeedefgffffgjlkjiiiiihhhgfffghiiijjjlnoonkigiswttsssrrqqrsssssstttttttsttsrqqqrrrrrrrrsssrrrsuvvwwwwwxxxxxwwwwwvvvvwvvutttwxxyyyyyyyyxwutsssrrssssssttssrqonnpqstttttsrqpprstttttssssssrrrrrrrrrqqppooooppqrstuwz|~}}}||{{{{{{{{{{{{{{{{|||||||||||{{{zzzzzzzzzzzzzyxxxyyzzzzzzyxxxxxxyzyyyywvuttuwuttvwwwwwusstuwxyyxxppoonnnnmmnnnmnmmmlkkkllmmnnoonnmllllllmlkkklllllmmmlllmmmnnnmmnnoooopprrrqppqqqqrrqqpooopppoopppponmmlmnoonmllmnnnnnooonnnnoonmnnmmmllmlkihfeeffghiiijihhhhhgggffedcbbaaabccdddccbbbbdeffgggggfecbaa`_]\\\\]^__^^][ZVQLIECBCDCB=4-+,.13320/.02469:989AKK[WHCA>@@AOUUZ]]^_aabbceededdbdegggffgjmlkjjjjjiihhgffgghjjjiijlnnmmjginw|ussrrrrqqqrsttttttssssssrrrrqqrrrrrrrrrrrrrrqrsttuuvwwxxyyxxxxxxwwwwwvvuuttuvwxxyyyyxwvusssssssstttttttsrqqpoooqrstuuutrppppqrsrrrrrrrrrrrsssssrrqqqqpppppqrstuvxz}~~}}||||||{|||||{{{{zz{||||{{{{{{{{{{zzzzzzzzzzzzzyxxxxxxyyyyyyxxxxxxxxxxxwwvussstusrsuvwwwvutttuvwxwwwrrqppoommlllkklmllkkiiijkkkklllllkklmmmnmmlmmmlllllkkkkllmmmmllllmmooponmmlkjjjloooonmmmmmmmlllmmmmmllklnnnmlllllmmmmnnoonnnmmmnnonnnmmlkigfdddeffghiijihhijjjjjihgecba```aabbbaa``aacdgghhhhhfca__^]]\[ZZZ\]]\[YXVRMHECBDCDEFEA;3-+,.1442/..0257:=;9=GHHIJQSVXYZ\\\^`bdghhhiijklmnooppqqrtvwxxxxyz{|}}}}~~}||{{|{zyyxwtqjdb_VPONLHDC@;;86?BD?=GD=@HLMMJDGJGGFCELKFMPKWX[agjhhrrgl~|qmghu~lhb_qkVJJNMNMJJNQRQQOF=@A?EFKMUY]\adabis{~~|v{|}}}}}}}~~~~~~~~~}}}}||||{{{{zzyxxvwvtmia^VI;/',05:@FEEXi``egiosutrmrrpqhbhjg`cgb`Z]_abbc^WSR[PCK>=C>8>HI[WIDECDCANTUZ]]^_____bdeedccabdghhgghlnmlkklllkjihggggghijjihijlmnmkhggo||trrrrrqpqqsttttttsrrrrrrrrrrsssssssssrrrrrrqppqqrstuvwxyyyyyyxxwwwwwvuuttttuvwwxyxxwvutsssssttuuuuuuutsrqpoonnprttvvutrponnoqrrrrqqqqrrrrsssssssssrqqqqqqqrstuwy{|}}}|||||||||||||||||{z{||||{{{{zzzzz{zzzzzyyyzzzzzyyyxxxxxyyyyyxxxxxwwwwwwwvutrrsssqprstuvvuttttuvvwwvvsrqqpponmlkkjjllmmlkjjkjkkkkllmmlllmmmmmnnmnnnmmmmllkkkkllmllkkkjklmmnmkjiiihghjllmmlkkkkjkkkkkkkklllkjklllkkkjjjkkklnnonnmmlllnopooonljhgfedddeeffgghhhhhjkllkkjigdba`aacdccbaaaa`aacdfghhhfeca_]]]\\[YYYYYZYVTQMKHDBACEGGGGFB;50.--/2441//02368;@=:>FJMOMRUXZ[]^_^`ceghijjjklmnooppqqqrstvwxxxyz{|}~~~~||{{|{zywwvsphcb`ZSQQOJGC@=;>FKMKFEFECCCBEGEFQPJUUXcosjt{cj}|i_bkno^[[_pOKPQPPNNQRONMKEBCDCDFIKRW[Y_c`agpy~~xu{|}}}}}}}~~~~~~~~~}}}|||||{{{{zzywwvwwurqgVD6.+,/6;<;<DC>BD@AEPa^bcdbhpvx|}}}{ncbdcgfdbZ\_aa``_]Z[TWJHGCJE>BCCVXQKNIPNJOQTY\]^^]]^_dihfdb`_`cgijjjklmmlmmmmlkjihhhhhgggggggggghiiihffekxxrqqqqqqppqqqrrrqpppppqqrrstuuutsrrrrqqrrrrrrqppppopqrtuuvvuttttttssrsstssstttttttssrrrrrsttuuvvvvvvtsrqqppppqrsssttssqonnnopqrrqpoooppqrrrrrsstsssrqqrrrstuwyz{|||||||||{{|}}}}}}}}|||{{||{{{{||{{{{{{zzzzzzzzzzzzyyzzzzzzzzzzzzzzzzzyyxxwwusqpprsssrpprstutuuuvvvvwwwwoooooooonnmlllmmnnmlkklkkkklnnnnnnnnnmlkklmmnnmmllllllkkllmmlllkkklmmlkkkjiiiihiijiiiiihghhiklmlllkkjiihijjjjjiiijjjklklkjjjkllnooonjhfeeefffeeddddddefffgfghihhhgecccbcdfgffecdcddcbaacddcb`__^]]]\\\[XVRRKCAACCCCDDEFFFECBA=81.-/00001212446778:@BACELOQRUW[^^^`cegjjjjklnnopqqqqqqqqrstuvwyzz{|}~~|{{zzyxwvutqnfa_XTRKGD@<9::=DHIKI@=ELD;@CGF?CDEFGGHHGEA?=<;60--/21/./135678999;@DDEGNQRSWY\]]^dijihikkmnopqrsrrrrrqqstuvwxz{{|}~}||{zzyxwutqnh_YTIB><<;86568=DIKMI?AHHEEJMKELXZ[\^grxy{{{{yridb``aei^]^`^]ZY[][LHCBEKPLKKF@OWW]RP\RHRSX\_````adgkljgdbaabcfhijjkmnnnnnnmkihgggghhhhggfeefgfggfffffeehpyyio{rqqqqpponnnnnonnnnnnopqrstuutsrssssssssttttssrrqpppppqrrrqqqqppppqqrrrrrrrrrrrrrrrrrqrrstuuuvvvvvvutssrrqqrrssrrqrrrrrqpopqrssssrqppooooppppqqqrrrqqrsttvwy{||{{{{zyyyyyz{{z{{zz{{|||||{{{{{{{{{{{{{{zzzzzzzzzzyyyyyz{{{|||{{{{||||||{zxwurponopqrrrqqpqrstuuvvvvwwwwwjkllmnnnnooonnnonnnnmlllkkkklmnnooonmljjjklmmnmmmmmmmmllllmnnnmmnoooooonmmlkkjiihgggghhhhiijklmmlkjiiihiiijjjjiihhhiijiiijjklmlllkjhgedffffffeeddcccdefffeeeeddddeefffeccccbbbbcdcba`_^^__^\[\]]]\\[YUME?;;:>DDGHKKKKJJGB?<:984.-./11.-/14689::;<>AGGIJPSTUYY[]^ckkjhghjmnopqrstsrrrqqrttuwxyz{|}~~}||{yyyxvroie^SKF=5213543457;CIKLI@==BB=?>BA68969;?BCBB@JMOREDDRYVQIBHD@@FSSOLIGKSZ\aa][W[][\\][XXXWVWXUOQTQRTUX^dqkca]ajsx|vqpvx|~~~~~~~~~~~~~~}|||{{{{{{{zyxwwwwwwukG/-2.49537:CHIKLPOMKJIEAA>9763/-.///..0258:<=>@@CFJKLNSVWTYY]adgjihhhijlnoppruutrqppqrttvwxz{|}}~|{{xwyywtmcZTMD=:620123334679@JKKHC@<=><==@>5676>KRNJGE>TnhjVEERTQMEGOIFEJUSNMMIKT\XPWYYZ]_^``_][[[ZZ[\XRVVTVTSX^esngd_^dlqv{~}}~uqqtw{}~~~~~~~~~~~~}|||{{{{{{{zyxwwwvvvumO+,,+)7E35788:@EHLTWSTV\aiqvwyyvtogYMOUYZ[b[[\]^[VRLID638AHGHFMTOCLRUYNQ]D?RPX`ceeefhjknmkgeefffeeefggilnoooomkjhfddefhhiiihhgfgghhihhhggggfgjp{~{|xoooppppooooonnnnnnnnooppqrqqrrsssrrrrssssssstsssssrrrrrqqrrsssssrrrrrrrrrrqqqqrqqppqrstutttuuuttuuuuuttsrrrrrrqqrrsssrqrstttuuttsrrpoonmmmnoopqrrrrrstwy{|||{{{{{zzzzzzzzzzzzz{{|}}}}}}}||{{{{{{{{{{{{zzzzzzyyyxxyyyzzzzzzzz{|}}|||}}zvtrppqrsssrqpqopprsttttttuvwxxkkjjkkllllmnnooooppponllkjjjkkkklllkkkkllmmmnmnnnnnnmllkkkkkllmmnoppppppoonmlkihhhihijklmmmkjjjjijiiijjkkkkjiiijiiijjkjjklmnprqqmjhggffegihgfffffffedccdeeeddeeedeefdcbcbba```aa`_^]\[[]]]^]]\\[ZRGB>:7779=AEHJMOQMKJJJFCBC<752/.-.////1369;>?ACEIKMNOQUWXUZ[^ceghgfghhjlnppqrttsrqppprtuvxy{||~~}|{zuuwvtn`OD?<964432123346886=MMJHDC=;;;;;;95679CPOMW`NE]lXNLJFJPMOYYQKIRQRQNMPNJSZULRXXZ`dfed_[\[]\]^][XXXWVUSX]etrkhddehknx|}||trrtvy{|}}~~~~~~~~~~}|||{{{{{{zyxxwwwvvvunZ8,+,149;348;54>?ADFHJLMNLIHIKIGEHC9210/.-./01358;>ACEHIMPQQSTWZ\[]^cffeddefghhhiiklorsrpoooprtuwyy{}}~|{zwpnqoi^O?643222223323458::7;JKHIHE>:99899657:>CBCMUZQTu{l^LJGO_TaQDNSghVNROOQXdj_TSUWZZevtns_^^^]]__`_]\[[ZXVX\fvvoljjjjlnuz~}u~~}||}}wsrrsux{|}}~~~~~~~~~~}|||{{{zzzzyxxwvvvvutrjH2.--/22;1/=C?9;96>LTX]flqttutqoheOFNPTSNPROLNXPF>84248:6@H=:@MSBDKNNCHD:F@GPX_eghhhglnnifeghihgfeddefiilnonlkhfedddfhhhiiiiiihggghhiihhhhhggilt{sqqrrqqqqqqqpqqqqqppoopppqrqqpppponnnopqqqrsttsstttsrqqqqrrstttsrrrqqqqqpppppoooopqrsstssssrrrrtuuvvutttssrrrrrrrrrrrrrrssssttsssrqonlllmnnnnppqqqpqsvy{||{{{{{{{{{{{{{{zzzzzz{{||}}}}|||{{{{{|||||{{{{zzzzyyxxxxxyyyyyyz|}~|vsrqqqstuuttsrqqpqrstttstuvwyzzjihiijjjjjllmmmnnooonlkkjkkkkkkkjkkjjklmmmnnnnmmmmllkkjjjjjjjjjjkkllmnooonmllkjjijiiijkmnonmlkjjiiijjlmmlkjjkllmlllllkkjgfffdccbffffffefhiihghijkjihgfdcbbbbbcdcbbba```abcca_^]\[ZZZY[\^^^\WUQLB<976567:APak{_U_[PRiymXXeyaSX`bis_db_\^_`bba`_^][XX\hxysqommnorwz}~nxvtqpqsvtqqqqstwz|}~~~~~~~~~~~}|||{{{zzzzyxxwvvvvutrmK30.-+.01883@HDAA@@GT^finpqqqplicbONRLMQKIKHEFOF:55645985;F=:>>?>EJFFHA<>=<<;98;BGGFNVZfgQRVVQUcbLGcz\ABMU_i^Ydi_jmcna\\Zlz_TVWZZ[b`]Z]`bfdfjeb`^Z[^hw{wvspppsvxz}}~osqnkijkmllnooqsvy{}~~~~~~~~~~~}|||{{{zzzzzyxwvvvvutrmQ5...+-,02754:AEGGCDR^gjnmmmmkhbZ[MTQEIQHBHHB=C<448;778479CA@@GMDHMMKD@=K;CEIRZ\]\^`afgfdddegiihggedfgffgiklkkjhgddefhhhhijjjjihhggggghhiiihhhhjr}zsqppppppqqrrstttsrrqqrstuuuuttssqponnnnnoopppqqrrqpoooopppppqqqqqqqqqrqqppppppppqqqqqqrrqppooppqqrsssssssrqqqqqqpppqqrssrrssssqonmlllmnoqqqqssrrrssuwz{||||{{{{{{{{{{{{{zzzzzzzzz{||||{{{{{{{|||}}}||{zyyyyyyxxxxyz{{||}~slkmpsttstsrqpqqqrrstttsrstuvwwwlklkklllllmmlllklmmlllllkklmmmmllkkjjkkklmmnnmmlkkjjjkkllllllkkkjjjjjjjkkkkjihhhhhgeefhhijjjjiiijllmmonlkklnnmlkkjjhfefefffffffgfeeeeeeffgggghihhggffedccbbbbbaa`^^^]]]]^^^]\\[ZZZZXUPLIE@:546675245779<=@ABCDCCBBCCCBDDFB=830/.../12468;>ADHLNPRUWXY[]^`bcddegiifdeeffghhhhiikmnoqstuuuuvxz}}|yupldZNLKC<865543589;<;:9;@A@ACCEIGB@<>??>AHNNNU[]mr^WSc^p~qMIQQMBEEFCMOLSZiznZd`\^^^_]YZXUUY][YX\bdgefqmba`]\_gpvyyurqruwy{|}}~{qroomjiklmmmnoqtx{|}~~~~~~~~~~~~~~~~~~~}|||{{{zzzzzyxwvvvutsrpeC./000013776:@=23??EMQonjcjeefWPPIYN@GTD=IC:99746<@;=956:?CHFEIENPNICAGF?CGJQVTSTVZ_abbbcddfhihhhfeggeeehiijkkjgeeefhhhhijkkkjiihhgggghiiiihhiimryuqppooooooprsstttssrqrstuvvuutsrqonnmnnnnooppppqqppooooonopppqqqqqqqqrrrqqpqqqqqqqpppqqqpppooppqqqqqqrrsrrqqqqqqpppppqrsrrssssrponmlmnopqrssrrsssstuwz{||||||||||||{{{{{zzzzzyyyzz{{{{{{zz{{{{{||}}|{{zyyyyyyyyyyz{|}~~yniilnrtvurpnnnopqqrssrqpprtuvussnmmlmnnnmnnnmllkllllmmmmmllmmmllkkkjjjkkklmmmmlkkkjjkllmmmmmmmlllkjjihiiiihhhhhihhgddefggghhhgghhjjiijigffghihhhhggfdcddeffghhhhhhgffedeeeeeeffffecddedcbbabaa`_^\\\[[[[[[[[[\\[[ZXRG?9643555666534579;=>ACCCCCCB@??>?@BBA<61//../02468:>BEHJLOQSUWYZ\^_aceecdjmkecdefggfeffggikmqtwxxwvuuw{~}{vpjd]VJA?<9788:946<=???=:7?BDEDDDCB@>>@BCBA>931//./01358;>BFILKMOQSUWY[]_`bcecaelomgccdfghggggiiiknsvyyyxvvuwz~|yqic^XSH=8768:;==89>?ABB@@BDD@?@@@A@<98=BCBCEFFIKNOPNO\ptPHLRVSK==GIGGEIKFIMOIKKHT\thY^afjja_cknda`[^_cebbjhjtlfzsdcbbhszywwxz|}~~~~~}pokkklmooonooopruxz|~~~~~~~~~~~~~~~~~~~~~~}|||{{{{zzzzyxwvvuttstuqQ54679::9;;=;511115@BDFFFEDC@@ABDED?:631///01247:=@FIMPMNNPRTWXZ\_`abda_fnqojfeefgikllklmlmquxxyzywwxz|~~~}zumc\YULD<659=@?;>BDFEBBDDB>98757989;?BCCDEFFHKLLKLHLUKG@@?XO=:@DEGIHKPP]\SKLNMY[e\VZ^ablqkggffda^ckhanjabe{ycopga_`emrstwy|~~~~xnjggfghjkkopooopsvx{}~~~~~~~~~~~~~~~~~~~~~~~}|||{{{{zzzyyxwvuuutsssrY=667::??;=DB8::ELDC;ESLHANKOSKFCBNB7@>5110./12137@BCEGGEDC@@AABC@=8420/./13469<679=BB@?@??DEFFCCDB@<6334568:=@CDDEEFFGJKHEDD@=HMC=>GIA>ACDGIHJO\fZTJMPPWYYXUW[]arqhfhgeb^_bhcbljd_bllcgsn`_`cfhiouy|~~~~ulheccddgjlnonnnnqux{|}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~}|||{{{{zzzyywvuuttsrsqtfK7258<@B@?DC:=@CC?D=LOLJEGILMLHCAOA544200/./001248<==<;FMNZb[IZ\RPHILHLVUJBJOLJNQSXZ[[Z[\^__`beghiihhhgfdcdeggggggggggggilopmjjjjjihhhhiihijjihggiq~y|rpppppppoooppppppooppppppponnmmmmnnnoooonnnnnooooopppppppppqrqqpppppoooooppqrsrrqqqqqqqqqqqqqqqqppoooppqrrsssrrrqqqppppqrssssrqppppppppqrrrqppqrtvwyyyyxxxxyzzzyz{{{{{{{{zyyyyyyzzzzzzyyzzzzyyyzz{||}~~~~~}spqppnnprtuvwxy{}ihiiijjiihiihhggghhhgggghijkjjjklkjigfddfghhhhiijklllkkjihhhijjklkkkkklmnmmmlkjhhhggghjlmmmllkjihhggfeeddffghjkkkkjjihfdcbccceegggffeggiijjjjihffeeeeddca`__^]\Z\]_abcccbbcba^\ZQC513212359;:54345678:<:6334578;@CEGGFDFGGJKE@?@>>HH<9:>@?ACBBEGGJO^[USJLSSTX]^XSTVYa][]_a`^XZ]_[[`^Z[\_`^_jj^`bcbbbgnvy|~}}}~|wpjd`__`begjkllmmmoswz{|}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}|||{{{{{zyyxxwvuuttsrrprbG<=:5>CAGB?B@@CC@:EAOPMJGGHJMMLC@L?1//000011101246789:AAABDFHHFEBCB>:8655431//1359=?ADDDCKWTRRSTVWWXXZ\]`b^aklecfjjjihjjkjkmppqrtvwxwvy|~~}~}{ywyufULGFF=9HB>>GMJIFGFJJHFEC?98975678:>;<878;ABAACDEGKWSRRKMVUV]^]VOOPUW\VWVYZZRUVVUV[WVZZ\]\X\`^`cbaa`bglpsx|{xxy{}|vrmieba`abdfgghijkmnqvy{|}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}|||{{{{{zyyxxwvuuttsrrqpY;6=A>8AEAEC@=>CCA;EBOOMLJIIJLLKA:C:2000001222223455679:@KRZ]XV]QYWUTQRSUNCITTSTYZ[]___^_aa__`acfhiiijjigeddeefffffeedddefhjlkkllkkjihgffffghiihhhfejuwmmmmnnnooonnnnooopqqqqqqqppooooooopqqqpppppoonnmmnooooooppppopppppppppponnooopqqqqqqpopqqqqrrrqqqqpooooopqrrrrrrrqpppppqrsrrsrrsrrqonmnnooonopstwyzzzzyyyyyzzzzz{{{{{{zyxxwwwwxxxxyyyyxxxxxxxxxxyz{|~~xniiloponmkihhijklmlljgfefjlqtuvwwxz|~defghhiihhhiihhhgggggffghhiiiiihggfeeedddddccbbcdefgghhgffffgggggggghhhhgghgggghhhihhhjijkkjjihgfeedcbbcddeefgfeeddddccbaaaaaabcbabbcedfghihgecaaa`^^_^^]\\[ZZYY[\^_^_aba`_]ZXVJ<3224545545543345679;=BDEDDDGIIHFDBA=96545421/1359<@BDEDCBJTSRTTUWWXYXYZ]bc_biidbehiiihjkjfemnnooqsuuuwy|~~~~~~}zvuypbSLGCDA?AME?GOOOLJKMMJFEC=7799889;=@EHJLNMGADIIJKB<;;;;=:79878:?AABCCBEJRVSPMQWVX]XVRNNPXV_[XUVWYPPQTTTXVWYZ]]ZXY]``ba`abacdfhovuonquy~~{zwronlihggcbdffbbbefhjlosvzz||}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}|||{{{{{zyyxxwvuuttsrrqoT4<:8;=@CIEED>=@DD>GEOKKNMJKJIGD;48432222223234434556789=DNY\YYUS\[[WSTPPKFSZWTY]\\__````ba_`bbbdghhhiihgedddeeefffeedcddefghijkkkjjjihgfffffghhhhgddjtznnnmlllmmmmmmmnooppqrrrqqqqpoooooooppppppppooooonoopppooooopopppppppppponoppppqrrrqqpoopqqqrrrrrrqppooooooppppqrrrqqqppppqqqqrrrrqpponnnmmmnoquvxyzzzzzzzzz{{{{{{{{{{zyxxwwwwvwwwwxxyyyxxxxxxxxxyzz{|}~}vjgjilopnmmkjiijjkklmlkjihhikoqrpqrtvwy{|}~ddefffghhhiiiiihhgggfffffggffeefeddcdeeeeedccbbbbbbcddddcdccccccddeeeeedceeffghhiiijiiiiihhhggfedddddccdeeeeedcbaaabbba``````aa``_`aabcdefedb`_]]aa`_^]^]]\[ZYYXYY[[[[]]][YUPQJ:1025666654433345579;=ADGHFDEGIJIHEDA<865443200136;?BDFGIIIKPTUTUUWXXZYYZ_ff`adeccegghhhjkkjipnhhknqstuwy|~~}|}~}|wssum_TMGCEGGEKLIFKNOMKJIJJGDA;679:9:<ABCCCBFJRVROOSWWXYSQNLORWWa\XTVY]PLNTVUWWWXZ]]ZXY]^`aaabbbbaabhpnediou{|ztppmiklljjlgaeehe^[]`degjmptvyz||||}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}|||{{{{{zyyxwwvuttssrsrpW;9?;5HGMGJSNJHE@<9523344343433245444556789;?IV\YZQV]`\UVSMMOO^ZUW^_\]__ab``a`_bb`bcefffgggeddddddefffeedddddeefgijkjjjihhgggfeeffghhhgefgmyrnooonnmmmmmmmnnoppqrrrrqqpooonoooopppppppoooonnnooopppoooppppppppppppppoppppppqrqqppoopppqqrsrrrqqpppponnmmmnopqrrqqqqppppoopqqqpppponnmllmprvwz{{{zz{{{{{{{{{{{{{{{zyxxwwwwvvvwwxxyyyyyxxxxxyyz{{|}}~xqmkjjlpqonmlkjijjklmllljihhjlosuuuuvwxyzz{|}}}}~ddeeeeefhiijjjiihggffeeedccbbaabaaacceffeedccbbba``aabbaaa``````aabaaabbabcdfhijjkkkjjhhgfeddcdcdefeeedeeefedb`_^^_`a`______``aa```````abbba`_^]_dcbba_^]]]\ZXWWWXXWWWXYYWUQONF5/269:986653333568:<>AEHKKJFEFHJJHFEC>97764210135:?CFHIIKMNMOOQSTUWZY[[Z[`gh``bbcceffgghjkljhmkghjmpstvx{|~~}|{ytpnmpqf]VOJGGKLJHMMKKKKLLJCAHIB>:779;;=??AFJLMMMKGBDHHIHA=:76777789:<=@CEFFDCHKSVROPUWWWTPMKKPSVXc[USVXXMLPWZWXYYZZ]][Y[]]^``abccba``dkha`ekrxwqihgcbfhebdbeedhh_WV[_abdgjlpruwz{{|}~~~~~~~~~~~~~~~~~~}}}~~~~~~~~}||||{{{{zyyxwwvuttsrqrqoX=284211256555655545654456789:<>DR\ZZTZ^`[TSOKQUV`ZX\ca]^``ba___`aca]acdddddddcccbbbcdfggffeeedddcceghhhhhhhhhhggfeddeghhgebcfmuvoqqpoonnnnmmmmnnnnopqqqqpooonnooooopppppoooonnnnnoooppppqqqqqqpppppppppppppppoppppppppppppqqrrrqqqqqqqqonmllmnopqqqqqqpponmlmnonnopponmlkkmprvwz||{zz{{{{{{|||||{{{{zyxxxwwwwwwwxxyzzzzyyxxxyz{|}}~|vrnljkloqsrqonnlklnmnmmmmljijloswywxxz{{{{{{|}}||}~cdddddddfgiijjiihgffeedcba``__`````bcdeeedcbbbba`__`aaabbbaaaaaa``````aaabcefhiihhiiihgffdcbbbccbccccbbcccdcb`^]]]^`bbbbbbaabbcbbaaa``_`aa``__``bgdcba__^]\[XVUUUVVUUTUVVUSPKB:/07;=<;86543234689<>ADGJLLKFEFGHIHGFEB=:863100246;AFIKLLNOPPONOQSUY\[\]\\ahia_`abdfgggghjlmkihjjhlpsuuwz|}~~~~~~}{yurmhfhjmke`XQLKKNOMHKMJGEDDFJC;BG?:989:;;=BBCGJKLKJHGFHKJHEA?=:87679:<=?@CFHIIGDILSTROPRSTSNMLKLQVVY`WQQVUPNPSY\XY[\]]^^]\^_]___abcbbba`cgeaadiossi`bb]^^][\][ca\XUQQV[_`abdgilorswxzz||}~~~~~~~~~~~~~~~~}}}~~~~~~}}}||||{{{{zyyxxwvuttsrqrpjU<04@H>A>ABBD=:>GIIGKOC>QD::720//3697657877667765679:;<<=@BP\[YX\X[XROLQYZZ`Z]`fc^^a_aa^]]^__^]abbccbbbcccbbbbcdeggghgfeeddccdefffffffggggfeedddfghgebcffhoyzpoonnnnnnmllllllllmnoooonnnnnnoooooonnnnnnnnnnnnnnnnoppqrrqqqppppppppppppppppppoppppppooppppqqqqqqrrrrqqpnmlklmnopppqppoonmlmnoonopponmlklmpruvz{|{zyyxyyyyz{||{{{{{zyxxxxxxxxxxxxyz{{zzzyyz{|}}~~yqmlllkllmlmpqpoomllponnnonliijnpuy{zzz{|}}}}}~~~~cccdccccddegfffffeedddcb`_^]^^`a``aabcdddedba``_____`acdddcccddcbbbbabbcceghhfeecbbbbcdddcbbbbbbaaa````a``bba`___abddeefeedcdddcba_^]\Z\]^^^^^^^`db``_^_^\[YWUVWXWVUVUSSRQLHB8002;@>;;:75334578:;>@DGIKLKHDDEFGGFDEGGB>:73111368;BGLNPPQRRQPNPRUW[^]^^]^bhfa^^`bceffghgilmljhjmmortvwy|~~~~}~~|zz|}{woiffgikllkgb[SOMNOOMJHGECBBADHC?@ACFIKLJIHHKRSQQONOOPMMNNNTYTZ[TOOTTOTTVZ\[Z\_``___^aa_`__abbabbaabcdbceilolc]`_ZZXY[VP]_UOMMT[[]_``ccffhjmosuvxz{|}~~~~~~~~~~~~~~}}}~~~~~~}}}||||{{{{zyyxxwvuttssrqojN;917FFF>>A?C=:=FKKFKQD9I:3320//04@A=84413@BFHJKJJFCCEFGGFDEGHC?;72012468??>;<==<::@GFDFEEECACGJKJID@??AB@::=BCBABEJLMMJKNKLSSQROIKMOMNOOOWYT[XSQOTTRYYXZ\[Z]abb``aaccab``aba_`aa`abdccehkjha]`^ZYYXXRQ[WJIKQW]]_```cceedgjlprsuwy{{}}}}}}}}}}}}}}}}}~~~~~~}}}}}}||||{{{{zyxxxwvutstsrrohD8=20DJKB;H>B<8=EJKGIND87401011027?CA;89A:877:986;?BDFH>AC?IUYUSUVVXVSPY_]]`\bdea]\^[`^]\ZYYYYZ\^_``__`abcccccddefhjjjihgfeeddddcbbbbbcdeeeddddefffffeeeeeegkpxulklklkjkkkklmmnnmmmlllllllmmmmmmmnnmmnnoppppppoonnnnnoooonooonnnopqrqppoopppppopqqqpooooonnnopqqqqqqqqppnmlkllmnooonnmnnnnnnnnnopppommllmoprtvxz|||{zyxwxyyz{{{{{zzyxwxxxxxwxwwxyyz{||}}||}}~}vrnjiiijkmmnnoppqqomllllmopqqqpopstxz{{{||}~~~~~cbaaaa`_^^^^^_`bbbbaa_]]\]]^_acddeeeeeffggfca^\\\\]]^_aaccbbdeeeeeefffgikllid`]]^__^^^`cdefgggfeca_^____^^`aaaabbdfhiijjjjifca`_^\[\[YXY[]\[ZYXWXZ[[[[[[[ZYYY[]]]\[YVQHC?;54336639EC:9>97669<>>??ADHJLKIGECDFHHHHGEDEE?941135779=>@@?=::@GFCB@AA>AGHEDEHMPPPLJONPTSSTOKJLPONTSQZZT^XWVTXUU^\\\]\[^dedbacdfeeecbbba_``__``bceeghgd_^__\[[[QLTVMEHKQZ\_aa`bfdgd``dhknoqtvyz|}}}}}}}}}}}}}}}}~~~~~~}}}}}||||{{{{{zyxxxwvutttssrpe;1:=200/0233249@EC>97@<777<:97=EGIKK>DC@@@@BEIKMLJHFEGJMNMLJGDCC<51136789;<99?EDA><=>=<>CFGHHGDCDHHIE?BJLIGGJORRTQLNQTWUXWNRNOTTTWUTZZU_\\ZXZVYa____\[_eedbbdgifffdddca```_^``bbccdddcaaa`^]\WNOWRIEJOPXV]```bgfib]]`cgikmpsvx{|}}}}}}}}}}}}}}~~~~~~~}}}}}||||{{{{{zyxxxwvuttttsrpe;1>LQONJC=VEB:;=@EIG>;70--/1345458>BA<86=?788:::7>HIJKJ@FA:AJOSVTRPPSTRWZVXVWVVXUSTVU\]]YXYXWWWYZ\\]\\]^`accdddddefggghhhhhgfedcbba``abbcccbbcdefffeeeeeeedddeghlprtxz|yspqrttrpomlkllnoonmmlllllkklmmmmmmmmmmnnnopqqqqppooopqqppooooonmmnopponmmmmmmllmoppppqqqponmmnoppoooooooonmmlmmnnooonmnnooononnnnnnmllklmnpqstvx{|}|{{zzzzz{{zzzzyyyxwxwwvvvvwxyyyz|}~~~~~xrpoonnmlmnpqrsttsssqolklnqrtvwwvuuwwyyzz{{|}~~~~~aa``````__`````bbaabbaccccbabdfhijjkkkjiifb_\ZZZZZ[\\^__`_]\\`bdehihgfda]XVVUSVWY[]^`babbdfeedddccdeddccba`_^]\]^`bdefefeeca_]_aabdcc`_abdedb^]\ZYYYXXXWXWWXXWTSTUUSKB9329???ACFJLMLKIHIJKMPPNKGDA?93136899:;=@FJKHFEECB@?BEGIOWZZZ\_ae_[[`ccejgecbcde``irxwtttruwvpjkmnkihijhabebacfikjlkjklkjhaWRQQPLJJIFEIKLJGCQH89<=<;999=AA?<;=??>?ACEILKGEFLOLHBDKPNKKLQUUUVRSVWYY\ZOVRRUYZZYY\ZW_``^[\Z\baa`_[[^ddbacfijgfeddddba``__``abbabbcddccba`YUOQRNMKMNQRO]_]]bhghbZ[\^bdhjloruy{|||}}}}}}|}}}~~~~~~~}}}}}||||{{{{{zyxxxwvuttsssqpc>6=BHNMFA=VHC;?>?BD@742/./01356546:>=976:>8;9:::8?HIIHIAB<7>EIPWTNLKNPMPQOQOTOORQQQTUZ^^YXZYXXXZ[\\\\[[\^_acdeedddeeeefghhhgedccbba`abccccbbbbbcdeeeddddcccccdddddegknrxyz|}~~|ywrpnmllllkjkkllllklmnnooooonmmmnnnopqqppppppqqqqqqpoonmlmmnnnmlkkkkllmmmnpqqrqqpponnmmnopoqrrqponnnmlmnnnopppooopppppooonnmmllklmnpqrsuvx{{zyyxyyz{{{{zzzzyxvvutssrrstuvvwxyz{|}}}~~|xurrqqpooooopqsuvvvvutrpooqsuuwxxwvwxxyyz{{|}}~~~~~a`````aa``abbbcbbaaba`bccbbaabdfgiijihgda][YYYYYYZ[[]^``__]\]`bbekjiigc[XUVVYZZWWWYZ]``aabbaa``bbdefedcbba`_^\[[\^^^^___`_^^^^`cdfefeabdfgigb_][YXXXXXXXWWWVSNFGKPSL@77:>?ACFILNMLKIJJJIKNNKFC?:52248:99::<@FIIFDCA=<:9=@DHNUVVW\^`c_Z[_bbfmjdcbbdfaZW^mtrqpkltug_aflebbcba`_agfehihhghjjkjie^RKLLMJJKJGGIKKJGFF?:8:;;:99:=@@@>=@DECAABDIQOHGILOPMHFKSTNLNSWWTUWXYZZ[][STXXWZ^`a`ZYYadca^^^_bbba_[Z]cb_`cgjlhdcccdddbabaaaaaaaaabcdeedba`YTONNNSSNMRMK^^VT_fdf_UWXZ\^bdgimpuwxxz{{|||||||}~~~~~~}}|||||||{{{{{zzyxxxwvuutssrqo]A7=EGJHC?=JHC=A?>@<720//./013443346::8768;8<::;::AHGFGG?<47754222224<@DDA><<>@CFILNNNNMLKIEEGHGE@;53258;;989:;878=@CFLSSRS]\]`^\\adaiqmfdccglh_WWcmmmkgbbndYY]fb]\^^]^]_dgecbdfghiihge^UJDEGGGGJJFFHHGEDB?;999889:<>@CDDCBEJJGECACKRTKFLPQQQMIJSXSOPTWYWWY[\\\\^aWV[\Z^adec\Z]dffdbaabddca^[ZZa_\^dillgbaabeefedccccbbbaaabcceedcb^WTQOPSXUOOUNN[WNP[]^bXORTUVX[]`aginqstvwyz{{||||}~~~~~~~}}||||||{{{{{zzzyxxxwvvuttsrpp]E>ACCFE@<;DHD?A?;;71/..//0012333346::877898>;<=<>DGEDED=927<<>@CEHKMLJIHHIHHEDCCA;62148;>=;::;;>?DHJGC@<:9;?ADFKPPOQYYX[YWX^edhnngedchmjbYU[cghgd^Ub^VVXb^XWYYZ[[X^`abdfijiea^\[VJBAACDEFIHFFFFCA@=;::9999;>ABDGIIHGJNMJIGAAIPSMFLSQORSOLOVVSTVXXXWZ\\[\[]a\Z]][_dghf_]`effedccdddca^ZXX_\[^dimkd`_`befhgfedeeddccbabccddca_[WUSSTW[TLRWPRYOIRZRY]QIOQRRRTUWZ^agkmortvwy{||||}~~~~~~~~~}}||||||{{{{{zzzyxxxwwvuttsroraKEEB@DC?<9CGC>>?;62.-//001123444479;<<;:9:9>=?A@CFFEEFE>94:>?BDEHLLKLLKJJLOOSMLKRZX[\W_`\\\Z[\]^__`_][ZZ[]_bcbba```abbaabbbbbcddddccddddddccbaaaaaabcbbbcddccccbaaabcccceglsvxz~{rmjjjjjjjjkjjjjjihhhiijjjkllllllkkkkllllkllmmmmmlkkjjklnnlkjklmnoomllkjjiihhijjkkjhgfffgilmmmmljhfedefffghhiiihhhgffffeeeddca`accb`beghijkkjjjiigfdbaa`_______^\^`_`acdeeddcdeghhgedbcbbcdeglptwxyxwutsuwyz{||}}}}||{{{{zyyyzz{|}~~~~^^]]]^^]\\]\]\\\\[[ZYXXXXXXYXYXXXXYYYXXVUTTTUTTTTSSTTV[`cda`_cdaa\WTSSRRSTTUVVWXY[]]]\[[ZYXVVUUUUVWXXXXXXYZ[\\[[[[ZYYYYYZYWWWVVXXYZYZWVVUUTPNLMNOPPPPQQROJE?;989<=;87=BGJMJI=4257558:;<==>?><<<>@CDFHJGC?=9421359=@?<<;<==?CGKKHGC@?@CDFGJMNMOUSRWRMPV_dbeihfedegfdYTWZ^cc`^SYZTWX\ZXVVVWXYXZ[^]_dghd\VQMMKC==?ADDGIGEDDDA?><<=>>><=AEGGFJNNLLPQPNLKEAENQMEISQNQVSOLPVXZZZZZY[ZZZYVW_]\^^\^djjg`]`bbcdcbb`ddcb_YV[a]]adhkib`_`behiggfeggffedcbccbbaa_]ZXWXWV[[SQRXTVYMKYULY[QJOPQQPNNPTUZ`egimpstuy{{{{}~~~~~~~~~}}||||||{{{{{zzzyxxxwwvvutrpmm^RNMC;=?>=;@B?;8;930..002334456677:=<<=BCCB?95436777:;==<;<====<=?ACEEFDA?=>BEIJGA:621247:=@?=>==>?ADGKMMJGCCBEEFGJLLLMTQOTQJOVZa^`ffeedadddZUWVY]`_^UTVSVYXXWUUVVVXYWY]^][[ZUPLGADB?==?BDCGIGDBCB@@??ACEFECCGJNMHMXXQRUTSQONKDEMQIBENQKOWWSRNOUYZZZZYWUTSSMPUX\^]Z\diie]T^\X]__][Zdccb]WX^aaabdghgb``abdhjhggefghhgfeddcbaa__\[ZYZYX\\UUWZX[YOQZMK`ZSOQTTSNLJJQNT[`acgnppquwxyy|}~~~~~}}}||{{{|||{{{{{zzyyxxwwwwvutpmkb[U[QD9;>><;<;:75320///12455667889:=?AB>>>?@BCEFGFHJFHHLLC=>EFEECELQROOQQPQSVSRLMNQZ[_^XX]]][Y[]]]]^aa[[^__acefdcba```aaaaaaaabbcddddddeeeedcbbabbba````abcdeeeeeeedbaaaacbbbdefgkpuxy|}|}~|sigfdddcdcddddeeeeeeeddeeeeeeeeeedfhjlprtuvutrpookikouxwmhghhiiiiiihgfcba```__`aaa`_`bccdddbba``__`__``aa```aaa````__^^]]\\]]]\]]_^^^_^^^__^]]]]]^_^^]^_____^^^^^^]]\\\]]]^^_^_^]]^_`abcehknqttrmhhkifhjlnpqqonmihkplhggffffhkopsvz|}^^__^^^^^___^^^]\\[[\[ZYZYYYYYYYXXWXXXWWUSRQQPNNNOQPPOPRTUUTSRQQRRRSUWXYZZYYZZZYXYZ[[ZYXWUSRSUVWWWWWVUTTUVWWWWXXYZZZZZYVTTTUTSRRRQPOOONNNMLKKLMNOPPPONMHD<768:<;:8559==:976544568:;<<<<;:;=>>=<<=?ABAA@@?@BDEEGH=6201589:<9854210//01234678889::;=ABEG>@@CDEFHIJIKNKLLPPHBEJJIGDFMSUPPRQOPSVSNILPPVX^]WVZ]ZYZ\\[Z[]a_]`aabdfhifdcb]\___``aaaaabcdddeeffffeddccbbbba``__``abcddfgggfedcbba`aabcccdhloqtwxy{}sgdabbccbcddddcccccbbaaaaabbaaa``acfjnprrtrrpnnrmkkmt|}uidccdeeeeeddba_]]\\\]]^__^^^_`____]^^^____^]^^^^^^^^^^^^^]]]]]]]]^_^^^___]]\\\]]^^^]\[\^`a`_^^__^^]^^^^^^]]\\\]]^___^^]\]^`aabbcefgikkieaaca_^`abdeecba_^abb^]]]\\]^`cegjnoort_````__`a````__^^^]]^]\[\[[ZZZZ[ZZYYYYXXVTSRQPOPQRTSRQQQQRRQQPOPPQRSSUWYYZYYYYYYXYZ[ZWVUTRQQRSTUUUUTTSRRSSTSSSTTUVWWWYXVTVVVSONNNMMLKKKKKJIIIJKKLLLLKJHC>64369:964558:866555678::<<<<<<<<=>???>==<>AA@@ABDFEDBCD:42147::::?B@ABDEGIKLPSVLGLJFCABCFGHGJLJJMQNQZVUWY]bcde]\d_\YWVTY]`]WNROV]][YWUVVUXXWWSH@<:;>@BDBFHHGFEEECEECBCFGKLKKMOSTUSPMOUYRNUYVUWVXYVUUROOSXQKSVNKRUTURKKPRSSSSPKIHJGJLPSSRQV]^ZTQPQMRWXTNNUWY[^ZY^cccdeddeedccddegjhjiiijkjjjjihgecbaaa`_\^`__^\]^`_a_]^VHTe^ZVX[[XPJINSLQXZZ[^`beinpqrtuwy{}~~~}}|||{{{{{{{{{zzzyyxwvvuvuutri[[d^ZONVRE??>;7320//010123446899:;;<<>ACFGBABEFFFHIMJJOONNTSMGJNLLJGHMRTPNMLKKNRQLHLQOQUXZWWY[VVZ[YVVXY[\^bbccdfhhec`[WWYZ[[\\]^_`abdeeeeeffeeeeedddddcbba````abcdfhhhgggfedbaaaabaabcfiknpqsux{~vgdeddcccddddccccbaaaaaaaaa``___aceghgjjmmmljjnlmmknsupfbaabbabaaa``_^\[\^_`a`__`````aa`_^_^_`aa``_^___^________^]]^^^^^^^^_`___^^]]]\]^^^]\\]_bccba`_^^]\]^____^^]]\]^_____^]]]^`aabaaaaabbca_\[[[ZZ[[[\\\\ZYY[\]\[ZZZYYXYZ\\^`bbaceaaaaaaabbbbaa```_______^^]\[[[[\\[ZZZZZYWVVVUUTTUVUTTSRSSTUTSRPOONNOQSTUUVUUUUUUTTUVUSRRQQQQQQRRQQRRRQPPQQQPPPQRSSSSTVVUTTSQNKJJJJJIIIHHHGFEFGGHHHHHGEC=9423578765567898777789:<<===<==>>===>????>=>==>@BDGGC>>@83247:<;;9=@BCEGILNOOQRTJDKLE?>@BEGFGJKKKMNPTZ]TWX]beffdY^`^[WVVX[^\ZRVRW_`_ZVUWXWUTRNH?;:<>ACEGGHJJJGFDC@BBACFJMPQPPRTWWXUQMMPUQLMPPPQPTWVTUTRRSVTNRUOKNPONLHGIJKKKKKIGHKIKLPQQQQUYXTPQQQNVZ\VQUWSV[\YZ\``aaccdefeedeeegjhjiijjkkkkjiihfdcbbbba^`b```_aaa`aacaULY`\YUX[\XPLOTUPTZWXZ][cfhjmmnqqsvx{|}}}||||{{{|||||{yyyxxwusrrtsqpkc_c``WF@PSKB?;7420/1122112345789::;;<<=@BEGCBCEFEEFIMJINRQPVUPLMOOOLJILOPMIGFDEHMNKHJPOPRVYXXY[STZZTQTWWVX\^aaabccc`_YPORTUVVWXZ[\]_bccccccddddeeffffffeddccbbbabcdfhiihhhgfedcccccbbbbdfghjjlnqtw{wlgggffdcccdddeddcbbbbbbbbaaa`aaabccaefjhjjhghhhhgghigdcbbbbaa````_`__^_abbccabbccccddca`aabbbbaaa`aabaaaaaaa``_^^^^^^]]]]]^]]]\\[[\]]]^^^^_`abccbaa`_^]]^_``a```__^^^^^^]]]\\]^_`a``_^]]^^]\[ZYYXYZZZZZZZYXXX[\[[[[[ZZZZZZYZ[[[[Z[\abbbbbcdcccbaaaa```````___][[\]]^]\\[ZZYXWWWWWWWVWVUTSSTUVVUSRPNNNOPPRTTTSRRSSRRRQTSPQRPOQQQQQQQPQRRRRQPPPPPPPQRRRRRSTSSSSQMKIIIIIIHGGGGFEDCCDEFGHGEB>;8532356787778999:98889:;<=>===>???>===>@BA@@???@ABDGFB<:863359<==;9>ABCGJLNRQPPPOHCKMD:=@ADGFFIKKLOLPUX_XXX\adggi^Y__YUVVVX[[[ZZYZbda[WWXYXPKF@<<=?CFFDDGGHJIHFDCA?@@@EHMORRSSTUVWWTQLJKJIHGFDFFFMPPPPQPOOONLLNNKJJHGGGFFFFFFGIIHIMMMNQQRSSUVUTSRRSU[b_\YZWSU\\Y[\^__`bccdffeefefgijkihlkkkkkjjihfedcccba^aca```bcb_abf`VPVZXVQZ][WPLU\UVXZTX[Z]dffgjjlnooquxz{{{||||{{{{{{|{zxwwwvusrpqqpnlihd`ZPVK8DIE>:74211133321113568::;<==<<=@BDFCBDFGFEFJLIHLTQQVTPMOPQQNKIKMNJEDDCAFILJGIOPQRVY[ZYZTUXWPMRUVWWWX[[[ZYYWUQMKLMNOPRTVXYY[]^_^^___`abbcdefghhhgffeddcbabcdfghhhhhhgfeeeeedccbbcddeffghjmosvy~|ojhfedcccccddedccbbbbbbbbbaaabbbbbccefedeffeedccccdedbabbba`a`````a```bcddcddeffffggfcabcddcbbbbbbbbbbbbbbba__^^]]]]]]\\\\[\\[[[[\]]]]]^^_`aabbaa``_^]\]^__`aa`___^^]]\[ZZYZZ\^_``_][ZYZ[[ZYYYYYXY[[[Z[[ZZYXZ]\\\\\\\\\[ZZ[[\\[ZYYbcccddeedddccbbbbbaabbbaa`_]^^_``_^^]\[ZYYZZZZYYYYXWVUUVVWVUTQOONOPQRSTTSRQSSUTTSQSSQTVTTTTTTTTTTUVVUTSRQPPQQQQQQQPPPPPOOPOMLKKKJJIHGGFEDCBAABCDEFEA?;97545678:::::;<<<<;::::;<>>??>>?AAA@>=<>@CEFFFEEDDDDEE@:75346:<>??=;?CCEJLNOQPNLJIGDLOC:>BCCIGFJLLNSOPV]^[VW\behhjdZ]_[STVWYZ]^^^^]^cd]YXUYYNF@<;=?EILJHHKHFFEDBAA@AA@@HJNOQQRRSTUTTPMIGFEDDCA@CCCILLLLMLKKKJHHJKJHFDEFGGGFGGGILMKLPQQQTUVWWWWWVUUUVY]aa`^^WW]_Y\\]]^_`acdeghggggghijljhmllkkkkjihgfeddcba_acaa`aadb_bde_WSSTRRMX\YUNNW^VV[WQZ[UYcb]_edegijlptvx{|{{{{{{{{zxwvtttuvutqonnljhhhijd\XWOCAA=74322233555321159;=>>?@A@@??ABCCCCDGHHGGJMIEISQPRPONOPQQNKIJKLGCDEEDHHKJFGNRSTW[]]YYRRTSMKQSSSSSTTSOLJIJJIIJLNOPQSTVWWXYZZ[ZZ[[[\]^^`acehiijihhgfeedccdefgghhhhhgfffghggffdcbbabbccdehjlorx|ogeedccbbbbcdccbcccbbbbbbbbcdcccbaabbb`abb``````abccbaaaaaabbbbabccbccdfgggghiiiijjhedeeeedcbccccccbbbbbbba_]\\\\\\\\\\\[[Z[[Z[\]]^]]\\]^_`___````_^]\\]^^_`aaa_^^]\[YXWVUVVY[\]]\[YXWXXXXWWXXXYZ\\\\\\]]\ZZ_^________^]\\\\[ZYYYcccdeeeeeeeedccccccbbbbbba`_``abaa`_^]\[[[[[[[ZZZZZYXWWXXYXWUTRRQRSTTUVVUTTUWYYZYXYYWZ[YXXWWWWWXXYZZZYVTRRRSSSSSRQPPPQPPONMKIIIIIIHGFEEDBA@?@AABCBA>;975555679;<<<=>>?>>=<<<<=>?@@@@ACDCCA@?>?AEGIIIIHGFDCBA>9667::=?A@?>=BDBDJKLKMLKHGGHEMOA9>IECJLHJLNPVVST[\[TW\_beige`[]]VSUX[]_abca\X`e^ZXVTSKD><=ADJOQMHHMHDCCCBDEEFEDCIKMNNMMMMNONNKIGEDCBBBB@CDDHJJIJJIIIIIHHJKIGEDFGHHIIIIJLPQOOSSTUXYYZZZZZYYYYYZ\^_cb^W\b`\___`aabcdeehihhhhiijkmlinmmmlkkjihgeedddcb`ac`^^^_``]]`]WRPPONOLVZUQKKRYUXVQR[SNR[UQTZY[]_agkmotxyyyyyyyyxvtrqpqstsrpmjhgdcdfffgiea]RC<952334456888753239?ABBBCDEDCBABCCDEFFHJJJJMOIFIMMLLLKKMOPNKIHIKLHEHIKILKMLHGOSTWZ]^^[YPOQQKJNPOOOOOOKGECBDFHLOQRSTUVWXXXYYYYXXWXXXYZZZ\]_bdghiiiihggggfeeffgghhhhgffghiiihhggecbaa`_`acdfhijqzyhdccccbbaaabbaaaaa````abccdeeedcba__`^^__^^^_____`_^]]^_`abddddddcccbadijhijiiihhgfdccccbbb`````__^^^^__^]\ZZ[[[[[\\\\\[[\\\]]]^___^^]\\]^^^^^__^^]\\\\\\\]]]]]\[[ZYWVUUTTTVXYZZZYXWWYZZZYYYYZ[[]]]]^^__^]]a`aabbbaa`_^]\[ZYXWWWdddeeeffffeeeeeedddcbbcccbaabbbccba`_^]\\\\[[\\\\\\[ZZYYYZYXWVUUUUUVUVVVVVVWXZ[\\[^^\^_][ZZZZYZ[[]^__[XTSSUVUUTRQPQPPPOMJKHDDGHIIIHGFDCCBA@@ABAA?=;:9888865679<==>???@@@>==<=>>@@AAABDDDDCBBCDFGHJLLJHFB>;:::98:?B?>BCB?=>DDBEIIIHJHICFIJGLMB:?JLGIONKKNQX[YXZ\]YZ\]_aagec`^^YVXZ]_`bcebZT[^\ZUQOLE?==?CHMSSMHFHFBADFGGHIIHGFJMMMJIHHHHHIJIGFEDDDDDDDFGGIJJIIIHHIIJJKLLJHGGIJKKLLMMNPTTRRUVXZ\\[[[[\]]]]]]]]^bec_[`dca_`acddefeefhiihhhjkllmkjonnmlkjihggeeddddcaaa_]\\\\[YWVRLKLNMMNLSVQMIHLQOSPKNVMHMSMNPRSVXZ]cggjpvxz{zzzzzxwtsrqrspnkigfedfeegfdegaVVL:742456:87:=<:87878>DDFDEFGHIFDACEFGHGHIJKLMOOLHIJKJJHHIKLLKHHIKKKJILMNLNMNNKJPTUX[\]\YVNMNNKKMLKKJKKLJHFFGHKOSUWXXXYYZ[\\[[[ZZYYYYYZZYYYZ[^`cfhiiiihhhiihhhhgghgggfffghijjiiihffedcbaaaabcdefipzsifdddedcbaa```aaaa`aabcdefgffedcb``a__``^_`````^\[ZYYZ[\]_abcdeddcccachiddedddccbba``^^]^^]]]]]\[[[[[[\\[[ZZZ[[\\\]]]\\]]]]]]]^_``__^]]]]^^]]\\[ZYYYZ[[ZZYYYYYYYYXWWVVVUUUVXXYYXXXXY[\]]\[\\\\\^_____`a`_`cbbcddca`_^]\[ZYXWWWWdddeeffgggfeeeefeeedccbbbbabccccccba`__^]\\\\\^^^^^]\[[[ZZZYZXXXWWWWVVVVWWVWWYZ[\\\\[\\[ZZZZZZZ[\]_`^ZXTSTVVVTSQPPPPONMKHIGCDGJJJJIGFDCCBAAAABA?=;:999:996678:<<>?@@@@@?><<<>>>??@ABBCEEDDCDEFHJKMNMID>997668:<>BEA?BDA>;>ECAEHHFEGFI@FKLIJLD?AKRNIOULLNPW\\ZZ[]\\]]]`affec`^[XXZ^a_`a`_UPQSSRQLGD@>=>@DIOSSMGEEECBEGIJKKKJHIKNOMIGFGGFEEGGGFEEFGHHGGHIIJJJIIIHIIJKLMMLJIIKLMNNNORSRSUUTUVXZ\^^\\[\^^___`a```deb`_beed^ceggffgffghhihghjllmljoomnmljihgffffeeddcbba^\[ZXXVSRQPNLLLLLMMPOLHFEFHHIHJLKJJOOKPOPSVVX\bcdgnuxz{{{{{{ywutsrrqnkdgifejfffheeb^ZWH=944356;?;7=E@;9;9:;<<<==99:::;<>@AA@??>=<<===>>>?ABBCEFGHHHJKMNPRQNG@:632359?CCFHD>BC@=:@HDBGHEBBEDJ;ENOLJJGDDKPTOQUMNMNSY^^]\]]^]]]_adghgb^\ZVUW[[YZYVOLLKLLJFCA?>?ABEJPSPJFDDEGFHKMMOONMKLNRSPIFFHHGFGGGGGGIJKLLKKKLLKKJJJIJKKLNPPPNLLMNOPQQQSUVUVYXWXY[^_``]\[]_accddedddghdcceihgbgijigghgdegghhfgikmlkippnnmlkigffffffffedcb`^\YWVUSQPONMLLKJIJLLLJFCBCDEFGIKLMNPPNSQRTWWZ\__bejrwzz{{|||zywvtrqonmijigefghhgd`YQLKA:746679=?<8CI@9:@C>?CDAIGJLMNOOKCDFJLMLLKKKLNNNMMMLMMMMLLMMLJKLOOLKKKMNOPPOPQOPSUVWVTQOMKKLNONNNLKKLNPPQRSUWY[__^a``___```aaa`_^^^_````_^]\[[\^`bdefghijjjkkkkjihgfeefhhhijjkljjiiiihfedcbbbbaa_afnuz{zulhfghhgeca_^]^___```abccdeeddddddcbbbbbaabcddb_][YXXXXWXXXY[]`bcdcba`_^][ZXWWXYYYZZYWWVWWXYYYYYYYYYYYYZ[[[ZZZ[[\]\\[ZZZZ[[[\]]^^^_^]]]]]\[[YWVUTSSSTVVVUUTTTTVWXXWWXXXWWVVWXWXWWWXYZ[\\[ZZYYZZ[]_____`abbccdeeeb\XWWVVVUUVVWXYeefgiijjjjiihhhhhhgfeddcccddeeeffeeeedca``_^_`bbbaa`a``__^^]]]]]\[[ZYYXXWWWVVWXYYYYYXXXWVVVVVVVWVUTRRRSSTUTRQQQQPQQPNLIFDLJHLPQQOONLIGEDDDDDDCB@>==>>>=<><;;::;;=?BBBA@?>>?@@@@??@ACEGIJLLKKMNPRRSQLC<744558?>959;<=ADAAII<9BIFEKKGGIJKN=EONNIHLSMEJWWRQLNNOQTVX[ZWVWWVVVX[^]YTQQMHGFKLKKJIHFFEFFEEEEEFGHIKKLLKIHIHMRRPPRTVUTSRSUWXVNLLMNLKMNNNNPQRSSSSRQQPOPQQPPQRRSUVVUTSSTTTUWWVXZZZ[]\\]_acca`^]_adfhikkljjklljiggmnimnmligbdecbcddcdefijhhilkllkkkjihggfffffeeeeca_\ZXWUTPLJJJIFC>@GKHIHGHKLMNNNPRSUUONQQUVWVUUUUYZZ\aelrtvyywutrrrqooolib]ZSSZ^^ZMFGD>CD=9>A@ADIGEID:;AEB>?EHELJKMOOQRRKKKNOPONNNMMNOOOOOPQSTSSRRRRQSSUTQOMMNOOPPONNOPQRRQPPNMLMORUVWXYYYY[\\\]^___`bccehhgeedeeffggfedccdddeeedcbba`abcccccccdeeeffgfeedcbbcdeeffghiiihhhhhgfedbbaaaaaabbabcdcdcbdeeeca_]\[\\\\\\\^_`aabbccddccba`````_____^]]\\]^^]\ZYXXWYZ[\\]^]\[[YXVTSUVVWWWWVVVVVWWXYYYYYXXYYYYZ[ZZZZZYYXXWVUTSTUUVVWXXYYYYYZZYXWVVVWWWVUUUUUUVVVVUUUUTUVVVVVWVUUUUVVWWWWWWXYYYYXWVVVVVWWXXXXXYYZZ[\\]][XVUVVVUUTTTUVVWgfhjjkkkkkjjjjjjihhggfffedccddeeeeefffeddccbcbcccccbcba``_^^^^^^]\[ZYYYYZZ[[\[[[ZZYXXXXWWWVVVVVUSSTUUTSSTUUUUUTRQONMMLKKMNOOOQPPNLJHGFEEDCDDEEDCBBBBB@===@@>==>>ADFGGGFEDDDDEEDCCDGIKMOQRRQPPPSUXL<66:<<=DBA>ADE?>=<>?A@@CJJGPOGKOLPNEEONOIIMRSPBQWSRPPPPRSUVYYXVUUTRPPQSRNKIIIJJKLLLLLKKIGGIIIIIJKLLLKKKKKJIKKLQWWUSTVWVVTSTUXXVPNNOPOORTRQRTTUVVVUUTSRQQRSRSTTTTVXXVUUUUUVWXXXY[[Z\^]]^`cdda___acehkmmllllmmoljhglmnqonkhfgc_abbbbbcdfijfghikkkkkkkjihhgfffffggfec`][YXWUQLHHHHFD8?GLGJLLMNQQPPPQSTWWRPQSUVYYXVUUWWVSVYagkpvvtsrrrqqooonje]^MMX[YTLJVSQKEA9EH@DCIFBCB:?EE?=?GLKILOMOOPQRLKKMNONNNMMMMNONNOQSTUUTTTTTSUVVVTROMOOOPPPPRQPQRRQOQRRSTVY[[\]]^__```_`aaaabcdeghhhggfgggghhgfeeeeefgggeddccbbbccccbbbcccddeeddcbaaaabbbbbccdeffgggffeddbba``abccabbaa`__`bcdcba_][[ZZZ[[[[\]^_`____```__^^^^]]\ZYYZ[\]\]^__]\ZZYYWWWXYZ[[\[ZYXVTSRSUVWWWWVVVVVVVWXXXXXXWXXYYXXXXYYYXWWVUUTSSSTTTUUVVVWXXXXXWUTSTUVWWWWWXXXWWWVVVUUTTTUVVVVVUUTUUUVVVWWWWWXXXXWVVVVVUUVVVVVUUUVVWXYYYXWVUVVVVVUTTUUVWihiklkkkkkkkkkkkjihhhhhggedcccddeeefgggfeeeddddddddddda`````````_]\\[[[\]^____^][ZZZYYYYYXXXXXWWWXZ\[ZYYZ[\[ZYWSPNMMMMNOPPOOOONNLKJIHHHHGEEEFFEDCBCDEDB@@CCA@@ABDGIIJJIHGGGGGGFGGGJLNPSTVVUTSQSRSF724@CCCFLNLTRINRNQPIGMPPJKORUSIMUVVTTSSTTSSVYXVRPOLJIJLLJHHJLMNOPPOOOPPNLKMNOOQRSRQOOOOOONMOOPTZZVTUWWWVUSTVXXTRQQSRPRWYWVVWXYYYYXXWVUUTUUUVWWVWYZZYXXWWWXYZYYZ\\\^`__`bdec`__adfgjlnnmllllmnmkjgmpqsokifca`bedcbabcdfjgdfjfikjklllljiihhhhiiiihfdb`][YXVQKHGGHHI=AHMGNPPQRSSSRSSTTVXVTTVVY\\ZYXYVVWTUVX\bjqqqqrrqpoooopnjdcQPZYTNILXUUOKI@IJBE@NB:?>9<@B=?BKOLINRKNOPRRKJIKMNNNMMLLLLMNNOQRSTUUUUUTTUVWWWVROQPOOQQRVVTTTSRRUWWYYY\___``bbcccccbbccccdfgjkkkjihhhhhhihhggggghiiihggggfeddcccbbbbccccccbaa`____`_____``abbcddddcbba`_^_acdeddcba_^]_abbba`_][ZYYYZ[ZZ[\]]]\[[[\\\[[[Z[[ZYXVUUWY[\\]^^][ZZ[[ZXWVVVWWXXXWWVUSQQRTUVVVVUUUUUUUVVWWWWWVWVVVUUUUVVVVUTTTSTTTTTTTTTTTTUVWVVUTRQPQSTVWXYZ[[[ZYYXWVUUTTTUUUUUUUTTUUUVVVVVVVVWWVVUTTUUUTTUUUUUTTTTUUUVUUVVVVWWWVVUUUVVWWhhikklllllklllllkjijjiiihgedcccddeefghhggfgfeeeefeeeeddbbaaabbbba_^^^^^_``abbba_]\[[[ZYXXWXYYYYXYZ\^]\]^_``_]YUQOOOOOOPQQRQPOOPPONLJIJJJHGGFGGGFEEGGIHEEEGDBACDDEGJKMLKJJJJIHHIJJKMNQSVWYYXVTQNMKA657@IGFHGD@==<;><<>@CEEGOQOVTLQUORRLJNPPMORTVUPJQUWVTSTUVUTTURNIHGGFEGIIIIKMOPQRSSRRSSSRQPPRSUVWVUTRQQQQQPOPPRV[\WQTVVVUTRSUVUTSRTWSOT[][ZYZ[[Z[[[[ZYXWWXYYYYYWX[\[ZYXWWWXYZZYY[]]_a``abbcb_^_`degikmmkiijjjklkkinppqkfhidacfdca`bcdehheehjfhjjklmlkkjjiijjjjiihfeb_\ZYWTQMJIIHINDDJOJQSSSTVUSTVUTTTWWWVXYY\\[[[]YXZ[ZYVZ^`efjmprpommllmnnnkY\eYSUSPXTRPPOFGEA@DL<:@@:9?ABEEEFNQQTSOSWSSQMKMNNMQSRSROLNQRQONOPQPONNJFDEEFFGHIIJKLNQRQQTUUUVVVUTSSUWY[ZYWSOOOOPPPPQRTWZZTPRUVUUTTUVVUTTUV[WRX_a_]]]]\\]^^^^[XXYZ[[[\[XY]^[ZZZXWWWXZZYY[\]_aa`aabcb]\_ababdffffdcegfhkklknmmnhbghedeebcbbdcddhhghjigjiikklllkjiiijjihgggfdb_\YXUQNOMMKKKNIJNQPSTSSSSUUUXXUTSUVVU][[[\[[\b\Z]`]\Y]\\^]bdioqrrqooopqpndgkXVfbXWQRQRTKJFBBMJ@@B@98=FJLKPQLGMSHIOOKHEFHKLMMMMMLKJIIJJJJJJKLMMMMNOOPSUTROLMMMLMKIKNMOPRTWYWX[\[]abbbccdeefgfeddccddfhjllllkjjjihhhhiiiihhhiihhhgghhggffeeeddeffgffedeeedcbbba`_^_``__`__^_```____^``bccccbba_^^^^^__^^^\\\\[[Z[[ZXWWWVVUTTUVWXXYYYXXXWVUVWXYZZ[[[[Z[\\\[[[[ZYWUTTUVWXXXWVVWXYYYXXXXXWVVVUTTTTTSTTTTTTTUUVVVVVUVWWWVVVVVVVVVVUUUUUUUTTTSTTVWXXXXXXXWWVVVVVUTUUUUVVVVVUVVVVVVVUUVVVUUUTTTUUUVVWWWWWVUUUUUUUTUUUUUVVVVVTSSSTUUeegilmmmllklmmmlkkkkkkkkjihfdcccddeffffffeeffffffffffeeddccdddcdccbbbbcdeefffedca`_^]]\[ZZZ[[[[[[ZYYXWWXXXXWUTUWWXWWVVWXYYYWVUUSNKKLLLKKKKJJKKIIIJLMONMMQPIEFHHIJJNPQOLJKKIHIJLNONPPQRQPPOMLKG@??=<>>?ABEFFFEFNQRSQPQVSQOLJKJKKMNONMMJLNOMLKHHHHGFDCBDDEFFGIIJKKLNPQQORUVUVVUUTTUVWY[[ZVQNNOOOOPQQRUVYWSPQUUUUTUVWWVUTWY]XU]ab`^^^]]^^^^`_[XXYZ[[[\[YZ__\Z[[YWVWXYZYZ[\]_aaaaaacb\\`aaZ]_]]__^]_begjklkkiikfdefefgeeebfddcchhhikfgkjijkkkkjjiiijiiggffeca_\YVSNKOMNMMLNNOQSSTURSRRVVVXYUURTUUT^][Z[YZ]f]Z^b_]\^]\[[__djnqutqoopponljbW\nj_ZOURSVROLMNRKJFB?<=CIMOOQQOLMLJJMKJGEFHLMLMNNNLKJIIIIIIHHHIJJKKLLLNRTRPMLLMMLKJIIKLNORTVXZ[]]\^`abcccddefggecccccdfhjllllkjihhgghhhhihhhghhhggggghhggffeeeeeffffffffffeeedccbbaaaaa`__^^^____^___``aabbbbaa`_^^^]]]^^]]]^^]]\\][YXXWVUUTTUUVWXXXXXXWWVVUVWXXYZZZZZ[[\\[[[\[YWUTSUVXZ[[ZXXXYYYYYXXXXWVWWVUTTTTTTTTUUUUVVVVWWVVVWXWVVVVWWWWVVVVVVVVVVVUUTUVWXXWVVVWVVVVVVVUUVVVVVVWWVVVVVVUUUUUVVVUUUUUUVVWWXXYYYYXWVVUUUUUUVVUUVVWWVTSRSTTSefghkmmmllklmmmlllllllmlkjigeeddeeeeeeeeeeffffffffggfffeeeddeeeeeeeeeffghhhhhgedcba`__^]]]]\\\\[[ZYWVUTSSRRSTVY[\]\\[\]^__^\ZXVSNLMNPOMMLLLLNNKKKLOOPOOPTSKHJLKLNOPPPNJIHGFEEGKLONNNMMLJIGEDDA?>@??@BDEEB@>==?ABBCEFIJJJIIMPRPNMMPOLJIGEEFGHIJJIHFGHIIHHGFEEEEDDDFGIIIIIIJJIJLMONKNRSSRRRSSTUVVXZYWTOKLNOPPQRSTUUUTPOPSUUUUVWYYXWWZ]`[Zbdd`^^^^^_^^]][XVVWXYZ[]]ZZab\Z]^[WVVWYZZZ[\]_``aaa`bb][`c^VZZYWXXXWX^cfhjkjgegjfcbdfgjggggjddcahjkkjeimmlkkjjjjihhhhhggfeedb_]ZWTRMHROOLNNOPRUUUUVRSSRWUUWXXVTSTUQ]aYYZVZ\ba\`ea^_```\^]\`dgimnllmnmmlkg]U`kkhfWRUUVUUUUVVQSLD??CINQSSSSRPNLLMLIIIHJJLMMMNNNMKJIIIIIIHHHIIIJKLLLLQSQOMOPPOOONMNOPRSTUWY[\]__`aabcddddefhhdbbbbcdegikkkigeddddeghhhhhhhggggggggghhggfggggfeddddegijjjiihhggffedddcb```__^____^^__`a```abaaa``_]\[[[\\]^_``__^_^\[[ZZYXWWVVWXXXWVWWWWVVUUVVUVWWWWXYYZYYZ[[ZYWUTTUXZ]^_^]\ZXWWXXXXXWVVWXXVUUUUUVVVWWWXXWWWWWVVWXYXXXXWWXXXWWWWWWWWWWWWWVWXYYXVUUTUVVWXXXXXWWWWWXXWWVVVVVVVVVVUVWWVVVWWWWXXYZ[\\\ZYYXXWVVUUUVVWWXXYYWUSRRSSSeefgjklmllklmmmmmmmmmmmmljihffeeeeeeeeeeefffffffffgggffffeeeeddefffffghhijjjiigfedcba``____^^^^]\\ZXWVUTTTUVWZ\^`a`_^_`abb`]YVUSPOPRSRPNNNNOQQONNNOPPPQRTQLLNOOOPOMKKJIHGFFEEFHJLLLKIHHFDBBBBA@ADBBBBCCB@??@ACEFFGIJKMNMLKMNOLIGGIGFDDCAABCDFFFEDDFHJKKKJIIJJIHGGHJKLLKKJJJIIJKMMLNPRQQPPQRSTUVWVVVTQOPPQRQRSTUUTSRPONQSSTTUVVWXWW\_^[_hgc_^^]]]]\[YXVVVVVVWZ]`b]Z_b]Z]`]YWWXYZ[[[\]_aabbba`ba[^h\WYXWUUTUTU\acfghfcbcggd_dhjmiiiiicddaiklkidjoonmlkjiiihgggggffedb`^\YUTRMITPNIMOOPRUTSTVTVWWXTTWZ[ZXUWYSYZYXZVYZ`d^_c`^_bcc____acceikjkmopoolgdbgjjgn_XZYYZZZYXWWYPJHKOQTVWWWWUSRQPPMKKMLMLMNNNNONMLKJJJIJJJJIIKIJMPOOORRQQQSRRRRSSTTTUUVVWX\^^^_aaaaabcccccdffc`a``bcefhiihfdba``abdfgghhhhgfffffeefgffgghiihgedcbbdfhiijkkkjjiiihgfdcb```__```__^^]^_``aaa`aba``^]\ZYYZ[\\]^^^___^]]^^^][YYXXXXXXWVWXXXXWVVWWWVVUTTUVVWWXXYYXWWUTSUWY[\]^]\[YXWVVWXXWWWXYYYXXWWWWXXXXXWXXWWWVUVWYZYXXXXXXXXXXXXWWWWWWWWWVWXYYYWUTTUVVWXXXXWWWWWWXXWVVUUUUVVVVVUUVVVWWWWWWXYYZ[\\\ZXWWVVUUUTTTUVWWWWWVTRPQSSRedefhjlllllmnnoonnnnnnnmljiggggffeeeeeeeffffffffffffeeeedddddddddefffghijjjjjjihfedccccbbba`__^]\\ZYXWWVVWXZZ[\]]\\[ZZZ[\\[XUSRSRSTTTSRQQQQQSSQQQPQPPOOPPNLMQQONLJIGFGHJJIIIIJKLMNNMJHHHEDEEFDEEGEEEEDCBABBDEGIJJKKLOMLLKJIHIFECBCBBCDECCFEFFFEDDEHKMNONMMMMMLKJIJKMMMLLKLLKKKLNONNPQRRQQRRSTUVWXWVUSRRSTUUUTTTSSRRQPQRRRQSTTTTTSUY[[[`heb^\]\[[ZXWVUUVVVVVW[_ac_Z]a_Z[_`\YXXYZ[\]^_`bcbcb``cc]_f]\[YXXXWVWWZ]`ccdba`^cdc]chlplkmffededjlnkhekpoomkjijjiiggfffeedb`^[YWTSRNLUPQHMMNPQTRRRVTVXYWTTW[_`\XY]XWVTX\V]Z\ba]_``_cefc_abefgikjhilorsrpnmnqomii_b`^a]^_[YZ[ZVSUXZZYXZZZYWTSSSRONNQQOMNPRRRRRQONMMMLNNNMMMNKMQTTSSTUUUTVSRSTVWXWWWXXXXZ_ba_`bca_`bbba`_`bb^\]\]_bdegggedccb`_^_`cdfhiihgfecccbbdeffghiklkjhgedccefghiklmmllkkigfdb```````aa`__^]]^____```a`_^]\\[[ZZZ[Z[[[[\]]]^^^^]]\[ZYYYYYXXXXXYYYYXXYZYYXWWWWXXXXXYYYXXXWUTVWXYZ[[[ZZYXWWWXYYYXXYZYYYXXWWVVVVWWWXXWWVUVWX[[[[[ZYXXXXXXXXWWWXWXYYYXXYZZZXWVVVWWWXXXXWWXXWWXXWWVUUUUVVVVVUUVVUUUUUUVWWWWXXXXXWVVUUUTTSSSTUUUVVVUTRQQQQQdcdehilllmmnnooooooooonmljhgggggfeeeeeeefgggggggfeeeeeedddcddddddeeefghijjjjjjihgffeeeddcba_^^]]\[ZYYYYYXYZ[\\\\[[ZXWXXWWVVTQOPPQSUUUSRRUVTRSSRRQQPONMMNNLKLPONLKHEDCDHLMMMMMNNNOOOMJIIHGGGHHGIIJHHHGFEEEFFGILNMJLJKOLHIGFEEDDCDEFGGGGHEINOKHFDEEGILOPQPOOONNNMKKKLMNNMLLLLLLKMOOOOQRSSRQRRSSUVWWWVUSSSTSSTTTUTSSSSRRRSRQQSSSSRSSTXYYZ_bca]\[ZZYXWWVVUVWWWWXZ]`a^[\`_[[`a]ZYYYZ[\]^_`bdccca`cebbe^^]YXYYXXZZ[[^aaba`_\`da^dgnpkjjgeeeefjkoleekopomkihijihgffedba_\[[ZXVTQOONRPQTNMMOQRQOPRRPQTTRRSY`fcWQ^^[_UWY\[WX_a^^`_^bfif`cdejkkkjhhjmnprrqqtrpokhda]ce[^aba\[ZYZ\`g]\Z[ZZZVTSRQROSTUTPNOQSTTSSSSRQPPPQQQPOOOOPRVWVVVXYZ[[XTTUVVVVWXYYYZ\`ba_`bb_]^ab`^]]^_^ZXYWX[`deffedccca`^]\]_behihggfdbbaaabcdeghjkmlkihgfdcdefhijlmnmlkjhfdba__````````__^]]^_^^^__``_^^]]]\[[[[ZZZZYZZ[\\]^^^]]\[[ZZYYYYYXYYZZYYYZ[[[ZZYYXYXXXYYYYYYYYYWVVWWYZZYYZYYXXXXXYYYYYYYYYXXXWWVUUVWWWWWWWWVVWY[\\[[[ZYXWWXXXXWWWWXYYYYYYZZZZYXWWWWXXXXWXWWXXWWWWWVVUUUTUVVVVUTUUUUTTSTUVVVVVVWWWVUUTTTTSSRRSSSSTUUTSRQQPPPdcdegiklmmmnoopooooooonmkiggghhgfeeeeeeefgggggggfeeeeeddccccccccccccdefghhhiijjihhhgggffdb`^]]\\[[ZZ[[[[[[\]]]]\\ZYWVVUTRQPONMNOPPQQPPPRTUTRRSRQPOMLKKLNNMLLLKJJIHHHGGKNPPPPPQQQQQOMKJJJJKLLMLLMMKKKJIHHHIIIKMNNJLIHOJEECBAACEGIJKLKKKLILSTPKHFFHJMPRRRQQQQQQPONMLLMNNMLKLMMMMNOPQQRSSRQQQPQSTUUVVUUTTTUTTUUUUTTUVVVVVUSQSUWVUSRRTVWXY[_a`][YXXWVVWXXXXXXXYZZ[^_^\\^`\Z_ca^][ZZ[\^_`bdecefbbegdcca`^[[[ZY[]]]]_`a`__^\^aaabfjjhhihihhhilnqh`gloooljhgiiggfffeb_[YXWWWVTQNLMPQOPTNLKLMNNLKMNLMPPNMOTWWVOKXZW[PSUXVPU\b`]cZ\_cifbfggkmkomhggijlpsuuvtrrokiggf`X_fid`]]]]_cj`_\^ZZ[VTSRQQQRSUVQPORUWWWVVVVUTTTTTTTSRRRSUWXWWW[]^^^[WUUUUUUVWYZ[\]`a```a`]Z]_^\ZYYZZXWWUSUX]aceecbabba_][ZYZ]bfhgffecaaa`aabcdfilnonmkjihfeeddfghiijiihfdb`_^]]]]^_````___^]^^^]]^___^]]^^^]]\\\\\[[ZZZ[\\]]^^^]\[[[ZZYZZZZZZZZZYZ[\]][[[[[ZYYXYYYYYZZZZYXXXYZZZYYYZZYXXXXWWXXXXXXWWVVVUUUVWWWVWXXXXWWXY[\\\[[ZYXWWXXXWWWWXYYZZ[[[[[ZYYXXXWXXXXXWWVWWWWWWWVVUUUUUUVVVVUTUUTTSSRSTUUUUUUUUUUTTSRRRQQQQQQQQQQQQQPPONNNdcdegijklllmmnooooonnnmljhgghhgffeeffeefgggggggffeffffeddddddeeddddddeffggghhhhhiiiiiigfeca_^^]]]]]\]]]]]\\]^^^^]\ZXWVUTRPONNNNNOOONMLMNOOOOOPPONLKKLNPRRQPMLLLMMLMMKIKMONNOOPPPPONLIIJKKKLNPNNOOMMLKJIIJKLLLLNQMPLIOIEDCCDEGHKMMOPONOPKMSVSMIGHJLORSSRRQPRSSSRQPOOOOOONMNNOOPQRSRRSSRQPOQQRSTTTUUUUVVVVUVWWWWWXXYYYYXWUTVYZYXVUUVWWXXY[\]\ZYYYXXYZ[[[[ZZZZ[[\]^^][]a`\_cdc`][[[\^_acdedfgccfhfeda_]]][Z[^_```aaa`__^]_`adgggefefikkkkjnqldcfjlmljhhghfddccc`\WTRQRSTUSQNKLPWPLNNLKJJKKIHJKGJKKJIJLKJKKMMOLTMQQQOLTZ`^[`WY]`daafgghlltskgfggglquwvuuurooong]^ckceca__^`ci``^`\Z[VTSSRQQQRTURPQTWXYXYYYYXXWWWWWWVVVVWXZZXWY^_aa`\WUSRSSTUWYZ\\]__^]\\[YYZ\[YXYYYYVVWUUVX[^abba`aaa_]ZXWVWXZ]_`aaaaaa```aaabehjlmmlkjihhfdcbbccddddcba_^]\\[ZZ[\]^^^^]^_^]^]]]]^__^]\^___^^]]]]\\\\\\\]]]]]]]]\[[[[[ZZZZ[[[[[[ZZ[\]]\[[[[ZYYYXYYYZZ[[\[[ZZ[\\[ZYYYYXXXWVVVVVVVWWWVVUUUVVVWXWWWXXXWWWWXZ[[ZZYXWVVVWWWWWWVWWXXYYYYYYXXWWVVUVVVUUVVVVVVVVVVUUTTTUUVVVVUTTTTSSRQPQRSSSSSSSSSRQQPONNNNMMNNNMMMNNMLLKJJJddefhhijkjjkkllmmmmmmllkihghhgfffefffffgggggggffffgghggffefffffffeeeeffffggghgghhhhhhgfeecb`___________________^^\ZYWVUTRQPOOONNOONNMLMNNNOOPPPPPOPPRTUUUTSPONNNNLLKJHIIJIKKMNNONMLJIJKKLLLLNLKLLJJJIIIIJJJJJJMMLOLHKGEFFFGHJKMNNNOOONOKKOQPKIKKMOQSTTTRPPSVWUUSRRRRRSRRQRQRRRSTTSSRQQPQQSTUUVVVWXYYZYYYXXXXYYYZZ[[[ZYXWXZ\\[ZZYYYYYZYZYZ[[ZZ[[[Z[\\\\ZZ[[[\]]^__^]_bb_`cddb`^]\]_accdddfgeeehgedc_[^_\Z[^^]_``aa_^]]^`bcfiigebegklmmjjklebgfgijhfeeddb^\[[ZWSQQOOPQQRQQONMPWPLNNMLKKLLLLMKHHIKLLNLKJIMMMLIPLRSRMKUY]ZX\TVZ[_[^bdcekovunjgfhffksxxwwwtrtwqjfdoedccca_\]_e^_^a]\]XUUVWWWVUVUTSSVXYYXZ[[[[[ZY[ZYXXXXY[[\[ZZ\__``_\WTRQRSTUWY\]\\]]]\YYXYZY\\YY\]\YXXY[\[[]_ab`_____]YVTSSTTTTVXYZ\]^_____``abdfhiiiihhgfdba_^^^^^__^]]\[ZYXWWXY[\]]\[\]]]^^^^^____^]\\]^__]\\\\\]]]]]]^^^^^]]]\\[\\\\\\\]]]]\\[[[[[[YXXYZYXWXXXYZ[[\]]^]]]]^^][[YYXWWWVUUUUTTUUUUUUUTTVWWXXXWWWWWWWXXXXYXXXWVUTTTUUVVVWWWWXXYYYXXXXXWWVVUVVUVVUVVVVVVVVVVWWWVVUTUUUUUUUTTTSRRRRQQQPOOPPPPONLLKKKKKJKKJIIIIIHHGFEEEeeefhhhiiiiijkkkkkkkkkjihggggfefffffffggggggfffffghhhhggfffffgffffffeefeffggggggggfffeeddcb`````````aa`````````_^\[YXVUTSRQPPOOONNNMLMNOOOOPRRRQQQRSTVWWVUSQONNNMLKKIHIIIIIJKLMMLLKJIJJKKLLKLIIIIIIHIIIIIHHHHHIHIIIGIGHHIIJJKLMMMMNNMMMKJMNMKJLMNOQTUUTQNOSXXVVUSSTTTUUUTTTSSSTUTTSQQPPRRTUVWWWXXZZZ[[[ZZYYZZZZ[[[Z[ZYXXXZ\]\[[]\[[ZZ[[[Z[ZZ[\\\[[\\\[ZZZZ[\]^_``__addabdedca`^]^`bddddeghfeefgedc_\^_[Z[_][]`^`_^\\\^`cegiihfbehlllkiiigddeddedb___^][XVSRSRQPQNNOPOPPOONNOPPMNOONMLLMMNNKIHJLNOPNLNPPQPVMNRVWVTPSYZXTUTTXYVPZ[Z\dgostslhfhecgryxxxxtssspnmpldcdcdc_ZXZ\^^^^^^\ZWWYYZZYWWWUTUWXYYXZ\\\]]\Z\\ZYYZYZ]\]\\\^`_a`]\WTRQPRTVVZ]^]\]]\[XXY[[Y\\ZY]_]ZY\_^][\^`aa`^]^^\ZWTSRRSTTSTUVWXZ[\]^^__``abcdefgfffedb`^]\\\[[\[\[[ZZYXXVVVWZ[\[ZZZ[\\]]^^^_____]\\]_`_]\[[[\\]]]]]^^^^]]]\\\\]]]\]]]]]]]\\[[ZZYYXWWXXWWVWWXYZ[\\]^__^___^]\[YWWVUUUTTUTTSTTTUUUTTTUVXXXWWWWVVVVWWWXXWWVVTSRRRSTTUUVVVWWXXXXXWXWWWVUUUUUVVVVVUVVVVVVVWXXXWVUTSTTTTTTUTSSRRQPPONMLMNONMLKJJIIIIIIIHHHGFEEEDCBBBBeffghgggggffghhiiiiiiihhggfeeefffffffffgffffffedefhiiiiihgggggggggfeeeeeffgghggffeeeeddcddddcbbbbccccbbbbcbbbaa`^\[YXWVTTTSRQQPPOONMLMPSTSSTUUUUUVWWXYXWUSRPNMMLLLKJJJKLKKJJKKLLKJIIJJJJJJIHGFFFFGGHHGGGGFFEFEEDEEEFHIKKLLLLKKJJJJJJJIIIHIJKKLOPPPSUWVTPMOTYXVXWUTVVWWXXXXWVTTTTTSRQPPQRTVWXXXWXY[\\]]]\[YXYYZZZZZYZZYXXYZ\\[[\]\\\\\]]^^]\[[\\]\\\\[ZYZZZZ[]^___`bdefeeggfca`_^_acdeefghhhgddeccb^^]][[\_\Y\]\^^]\\\^aefiiiihhikmmjgdeffebaa`_\[XXZYXVSQPQRQRQQOPQPPOONNNOPPQQRRRQPOOPQRQLJKMORSTQPRUUVT[UTW[[ZWSVWWUTRQUXVRMUTWbjorononhifeceqyyxxvuuuutsrrleeecef`WTVXZ[\]^_^]YY\^``_][ZXVVWXXZY[^]^_`^[]][Z[][]a__^^^^`^^^\[XTRQRTVVW[__^]]]]\[\]``Z^^ZX^b_^^ada^]_aa``_]\\YWUSSTTUUTSTTTVXXWXXY[]^_``aa``abcccbb`][YXXXXWWWWXXXYYYXXVVUVXZ[ZYYXYY[\]^^^_____^\Z\^`^\\[ZZ[\]]]\\\]]]]]\\\\]]^^^^______^]\[ZYXWVTTUTTUVWXYY[\]^_`a``aaa`^\[YVUTSSTSSSSSSTTSTTTSSRTUWWVVVVVVUUUVVWWWVUTSQPOOQRRSSTUUVWWXYYYXXXXXWVUUUUUVVVVVVVWWXXXXXYZZXVSSRSSRRSTVVSQPOONMKJIIJKLLJIHGGHHFFGGGFGHFCAAA@@????ggghhhggfeeeffghhhhhggggffedddeeeeefffffeeedddddeeggghhhhgggggfffeeddefffffffffedddccbcddeeeddcccdeeddcccdddccba_]\[ZYXVVVUTSSRRPPONNOQSTSSSSRSSTUUUUUTSRPOMLMMMMLLLMNPQQPPOONNMKJHHHIHHGGGFDDCCDEFEEEEEEDCDEDDCCDEFHJLLLLLKKJIIHHHHHHHHIIJKMNQRRRTVXVSOLNSXYWYYWUVWWXXYYYXWUUTTTSRQPQSUWXWWWWWWXZ[[[[ZZYWXYZZZZZZYZZYXYYZZZYZ[[[[\\]^_``_^\[[\\[[[[ZYXZZZZ[\^^^^`bdfgfgjkhc````abcdeeefghjgbbbbaa^_`_\\]`][\Z\___^]\^aegjjjjkjgdcbcehgedb^]][YWWUVVUTRQQRTUUTSRQRSSSSSRRRRSSTTUTTSRQQSTTTNLMOPTUWUTWZZZU][ZZ^_]YVYXXWVTQVYVTQRN[hjnnkhkpkhffgiovxxxwuuuuuutsolkjghhaWTVXZ[\]^_^][\^bcdca_]ZXVWXX[[]]\^`a_[\]\]^`^^a``^]]]^[][YZYVTTUWYWX\``^]]^^]]__`c__`ZX_b``acda]^aba`_^^\ZWTSTUWWXXVUUVWY[ZXXWXY[]^__`_^^^^_`_^]]ZWVUVWXXWVWXYYYZZYYWWVVWZZXXWVWXYZ[[\\\]]]]\ZYZ\^][[ZYYZ[[[[[ZZZZZ[[[[[\\]]]]]^^^___^]\[ZXWVUTTTRRTUVWXXZ\]^_``__``a`_][XVTSSSSTTSSSSTTSSSTTTSSTUUTTUUUTTSSTTTTSRRRPONMMOPPQQQRTUVWXYYXWWXWWVUUTTTTTTTSSTTSTUWWVVWVVTQONNONNMNPRRONMLJIIGFEEFGHGFEEDEDDDCCDDCCDCA?>>>==<<=<<<<<<;;jjjjkjigfeefggggfggggfeddcbcccccccccccccccbbbcccdddeeffffedddccbbcbbcdeeeeeeeedcbaaaabbcdeeedcccdeeeeeddefffdcbb```_^^][ZYWVUUTSRQPPOOPPOMLLMMMMMMMMMMLKKLKKKLLLLLKLMOQTUVVTQONLJHGEDCDCDCCDDDCCCCCCCBCDEFFFGHHGHHIIKLMMLKJIIIIHHGIIKMOOOONNPQRRQQRSUTRQOQSUUTVUUUVXXXXWVVVVUUUTTSRRSUXYXWVUUTRSTUUVVVVVWYZ\\\\[ZYYYYYYYZZYXWWXYYYY[\^_`_^]\[[ZYXWYZYWYXX[\\\\\\]^_acefgiigdaacddccedccefghea````_]ab`[^`__bb^]``````acfilnmligfffghgda_^\YWUTTTUVVVVTSRRUXYXVTRQQSUVXZ[ZYXXWWVVUSRQPQSVVWSRQSRQRWVTZ_\XV]]WZ\^[YUXYXWXYRW^][YRX^a`cghhklmjginnqstvuwwwwvvvvuuttssqmgddddcca_^__^]^_ceedcb`^[YXYY[[]\]^^_^\\\\\[[Z\\ZZ[\[YZ[XUWY[[[\^_`^]^``]\^____acafdcc`_`bcddeea_`aa_[YXXXWVUVWXYYZZYXXXXXXWWWWXXXYYZZZ[ZYXXYZZ[\[[ZZZZ[\[YXXYZ\\]]\[[ZYXXYXVVUVVVVWWWWWVWWWUUWXYXYYZZ[ZYYYYYYXWVVVUUUVVXYZ[\\[[\]]]^^^]\[ZYXWVUUTSRSRQQRTUVXYZ[\\\]^^]\ZXVVUUVWXXXXXXXXXWWWWWWVVUTSQPQQQPONNNNNNNOPPQPOOOPPQQPOOQSTUVVVVVVVVUUTTTSTSSQPOOOONNMMLLMMMLJIHGFFEDCDFFFFEDCCBA@?>?@@@@@@@????>>>??????=<;;;<<;;;kjklkkiggfhiiihhhhhhgfedcbaabcbbaaabbbbbbbbbbbbcccdddeeeedcbbbbbbbabcdeeeeeeeecbaa`aabbcdeedcbabcdeedddefffedcbbaaaaaa`]\ZXWVUTSRQPONMLMLKIIJJJJKKKJJJKKKLLLKLLLLKLMNOQSSSROKHGHIIHGGFGFEDDDFGFEDDCCCBDFGFHIIIJJKKJIKLLLKJIIIIHHIJLMOQSSSSRQRRSRQQQQTRRRRRSTTTTTTUUWYXVUTTTUUTTTTTTVWWXWVTSSURQRSTUVVVWWY[\]^]]\ZYXXYYYYZZYXWXYZZYY[[]]^^]\\\\[[Z[][WUYYY]]]^^^]]]]]_cdehhgecbcddddeeddeffeddca`_`\`b`[^__`dc_^```abbbdfimnnljiiihhea^\[ZYWVUTSTUVVUUTSRTVYYXVTRRQRTVYZ[ZZYYYYWTRPPOPQSUWXVUUVSPPTVTWZXUV\\TXZ[ZXUXYZYZ[V[`][[V[\^_abehjklnklnnppprsvvvvuvvvuuvwwwvtqrrqpnjea_`^^]^`deedcba`^\[[[\\]]]]]]]\\[[[YXWYXXXZZYYZ[WUVX[]^^^`````a`^\___^`adagfedccccdddddcbaa_\YUTUVVUUUUUVWXXWWVUUUUUTUVXXXXWWWXXXXWWWZ\]^^]]]]^^^][YYZ[]]^^]\\\[ZZYXVWXYYXWVVVVVVUTTSTUUVWWXY[]\ZYYYYXWVVUTSSSTUVXYZZZZZ[\\]]\\[[ZZZYXWVVUUTTSRPPQRSTUVWXYYYZ[ZYXWUUVVXYZ[[ZZZZZZZZYYYYYXWTSQQPQPNMLLKKKLMOPQRRQQRSRRRQPPQRSTUUUTTTUTSSSTUTSRRPNMNNMMMLIHGIIJHFDCCA??>=>@ABA@@???>=<;<>>?>==<<<;;;;<====>=<;;:;<<<<<:99;>?@>>==<<;;:9;==>=<;::9999:;<<;;<<;:::;<<<<:8767;>?@><<;;;;989:<=>=<;:98779::;;::;:::::;<<<=>=85678:=>>=<;;:;:888:<===<:9987789:::::99999:;<<===pqrrqpnmnoponnnnnnnlifgea^digeddcb^^bbbbcccbaa``bbbaaaaaaaabccdddccdcccccbbbbbbbcdcccddccbbaaaaaaaaa````aaaaaabccccbbcba`_^__^^]ZXWVUTSRRRQQQPPOPQQQQQPPPPPQQRRQPPQRRRRQPPPPPPPPPONNNNNMLMNPQPNMNOONMKIHGHIJMQSSTTSSRRSRQQSTUXSX`WVWYWV^_`\^URUVSQPQRSUUWWVURQOOPRTUVUTSSUWZ\^]\[[\]]\ZXXYZ\]YY\]]\\[[[Z[]^^]]]\[YV[]]\^\[]b__^]\[ZZZYZYYWXZZ[[[ZYYXY\_cdghhhgffedcbaacddcccccbbbbbcdefgggffffdb`^bfgd`__abdfeb`^bdda]\`acdeda__^[XVUXXWWWWVUTTTSRRTUVWWXYZZZZY\\Y[VV\^__```_^\[ZYZZZUUXZ]]\[ZWWWZ[YWTSSTU\VYZ\[[_\XZa_fZdd`ahfbaa^`f`]kgc`bbdcgjiggggghhggjmqtvvvvvvvvtroljgc__^`bddeecbabccdfda]ajkbaeabddb`][YXYYYXXYXXWVUUUWXYWWWWWXXY[\\]\[Z[[YYZ]__^^^]\\[ZZZZXWVVWWXYZYWY[YWYZYXXWVVVVUVWXWVWXYYZYYXWXYZYYZ[]_`bddeeea_^]_ZY^bcccbcb`aaa`__^]^^[]^^^]^__^]]]\[ZZ[ZZYYXXWVWXXWVUTSSUVWXYXWWVVUUTTUUVVUTTUVWWWWWWVWXWVWVUVWVUTSSSTTTUUUTTTTUVWWVUUUUTTVWWXWUTUVVVUTTSSSSSSTSSRQQPOOONOPPQQQQQQQPPQQQRQRQQQQPQQQPONLKIHHIGEDGB<;=?ABB@>==;52457:=>>=;::<<;:988:<==<;:98778:;;;:989999:;<<===qqrqqpnnopponoooonomjhfd``gjffdddb^^bbbbcccbbaaabbaa```aaabbccddddddddccccbbcccccddddddccbbbbaaaaaa``_``aaaa`abbbbbaabbbba`aaa`_][ZXWVVUUUTTSSRQRSTTSSRRRRQRRSSSRRRSSRRQQQRQQQQQQPOOOOONMNOPPOLMOQOLKKJHIJKMPSUUTTRQRRSSRQUX[[TWcZTYZWV^``[^SPQQRRRQRSUWXXWURQOOPRTUUUTTUVX[\^^][[]^^^][[\]_`\]_``__^^^^_______^^\XZ^^]`^\]b`a`_]\[[ZZ[\[[Z[\]]]\[[Z]bcegiiihhgffedccdeeddddcbba`aabcdfhiihgfedba^bgheba`abeiifb^beeb_^bbbdca^]]]ZYXXXVVWWWVUUUUTTTVXZZZ\\[[[\[^_\^XX_baabbba`_]]\[\]WVXZ]^^]ZXYY[]ZYVVTOUa\VWYYZ^[WXe\d[adaagedbaacfcahda`cdb`gjhecccdcb`adgknppqrqqqponllkfb`a`abcddc`_]^``accb^bjlcbgdccba_][YYZZZ[[[[[ZYXWVWXWXWVVVWWXYZ[\[ZYYYWVVWXXXXYYXXWWXXXWUSTXZZZYYZ^]WV[\ZYXWVVWXWXXXXWXYYZYYXWWWXYXXYZ\^`bdeeed]ZY[^ZX^bcbaa`adddb``__^^^\__^]^^___^^^]\\\[[YYXXXWXYZ[[ZYWVUVXYYZYXWWVVVVUUVVVUTUWXXXXVUVWXWWXYXVUVVVUTSSRRRRRRRSSSTUUTTRRRRQQRSSTSQPQRSSQPPPPPPOPQRRRRQONNNMMMNNNNNNNNNNNOOOOOPPPOOOOOOONKJHGGHGDEF>79;=?@A?>=<:534469<>=;999:::9999:;<<<;:987789;<;:988999:;<=>>=nnnnoooopqpppqqpppomjhecbdkkffeedb]_bbbbccccbbbbccbbaaaaaabbccdeedddddddccccccccdddeefedcbbbbbbbbbbaa```aaaa``aaa``aabbccbbbbaa`_][ZYXXXXXWVVUTTTUUUUUTTUUTTSSSSSRSTTSSSRRSRQQQQQQQPPPPOOOOPONLNOPNLLLLKKKLMOQRRRROOOPPQQRU[_^WXe\X\\XW[]\XWSNOPRRRRUVWXZZZXUSQQQSTUUUTUVXZ\\]^]\\^__`_^^^_``_`bcbbaaabbccbcbabaa_[\_`_a`^_cccb``_^]\\^__^]]^^^^^]]^adfhhiihgfedddcdeggfeegfdba`_``aabdfhhhgedcbb`cgifcbcddfjjheacffdaaeffeca^]^_]ZYXWUVWWWVVWWWWWXY[]]]__^\^_]a`^`ZZbddccedcaa``^\^_YXY[^`^]YYZ[^\XXXWSOZdWPRTUW[ZXZf_bZ^d`_eddca`badbba_`aa_^cfc`^]^^\[ZZ]^beggggffffefhgca_^``___```][YZ\]^_``_bgibbgecbaa_][ZZ[\^\]\\\[ZYXWXXXYXVVVVWXYYZZYYXXWVUTSSSSSTUUUTTUWWWUTV[]]\\[]`]WWZ[YXWWVWXYYZZZZYYZYYYYYXWWWWVWYZ[]^`abcba[XY\\[Z^`aa_]]_dfc`^\]\Z[\Z\^[YZ[\]]\]]\[[[[ZXWWVWXYZ[\\\\[ZYZ[\]\[YXXYYYZYXXXXVTUWXXYXVWXXXWXYYXVUVVVUTSRRQQQQPPOOOPQQQPPOPONMMMMMLKKLMMMLKKJKLKKKLMMNNMMLLKJIIIHHHHGIIJKKJJJLLMMMMMMMLLLKIGEDDEDBCC;47;=>>?>=<;955557:<=<98889999::99;<<<;;:97789;;;;988999:;<>>=>=<;854557:<=;87789999:;:::;<<<<;98789:;;;989999:;=>>===>>=>>947;=<=>=<<;85578:<>><9888::99:;<<;;;<<<<:9789:;;9889::::;======<;=???>==<<=>>>>?@@AAAA@@>?@@?=<;<=>>>=<;=?@BBBBABBBBBB@><;;<<<>>956:<<<=>><:86789<>@@=:99:;;::;<==<<;<<<;:8789:::9889::::;====>>=<;;<==<<:879;<>>?>>?@@@AA?=<;;<<<==:669;<=>??=;879:<>@BA?<;;;<<;<=>>==<;<<<;:8889:::988:::;<<=====>=>>????<;::<====:658;<>?@@><97:<>@BCB@=<;<==<<=>>>=<;;;;:98999:::9889:;<<=>>==;;<<9;??;;::98888789::9999998889:::::::;;;<==<;;;;;<===:8789:98899:;<<==>>=<;;<=>>><857:<>ABB@<99<>@ACCB?>==>??>>?@@@?>=<<<;:9::::::9889;<=>>?>==?><967:=@CDCA=::>@BDDDC@?>?@@@@@AAAA@?>==<<;:;;;;::999:<=>???>=<;ddddddddddeefggffdcdeddcabdedceeffhjjigecdfgghjkigfgijlkihfgjklljihhhhhhhiihhggffeeffffffffffffeefggghhijjigfedddcca__`bccdcbbdccdccbbbaaaaaa``aaa`_^^]^^_^^]]]\[[ZYYXYYZZZZYYYYYYXXXYZ[\]^^]\[\\\[YUSRQPOOPSROQSTVXYYYYYYYZ[[ZYXWWVUSV[\VX]^``cY`][\`a\V]aSPSZVUVXXZ\^`acddcdcb``bb`^]\\`_[\^`a`]]\[X[`ccbZ\]\[ZZ[]_`a``_^^^__^^__^]`ffeeeeeeeedcb``abccccdfhjjigfeeffedfhigca`][\]^addddddccbbbbcccdeeeeeeeeebacc``cdbaadccdca`Z\_bfga_^`b_]]]\[]^^^]\\]^``^]`aba_^^^bdfefhgjbiecfb^ZXVUWWZ]_`_^Z\\\YYXWYYYZ\YXVX[VSWYXUXYYRVX[[[[[WWZZWXXWTTSRRRSRQQX\YUVW]\__^\[\]^]\ZYYZ[]^___^]XUVTRQQPOPQRSTUVVUTTUUSSTUUVVWVUUWXXY[]]\[[\]]]]]^__________^^^][ZYYZ[\\[[YXWVVUTTTTTTUUWY[\]]]]^]XUUX\_aba`_`][ZYXWXVVVWVVVWUUUTTTUUTTSSSRRSSTTTUVWXYYZ[\\\[YWVVVUUVWWVVUTTSSSSSSRSSTTUUTUTTTTUVWWVWXYYZYXXWXXYZ[[ZYXVUUVWWVUTSSSSRQPQRRRQPPQRQQPNLFB@=:83897777367777666679:::988888888899::;;;;::;;;::;<;;<==<:9:::99899:;<<;;<<=<<<=>?@?=;97:>ADEDA=;;?ADFFEDBA@AABBABBCCBA@?>===<<<<<;;;;;;;<=>>>>=<;:eeddddddddddddccbcbcccba`abbbbdefgiklkigechhggkkhgfhjkmlihfgjklljjiiiiiiiiiihggffefffffffggfggffefhgghhijkjhggfffedb``aacddcbbcddddccbbbbaaaaaaaaa``______^___^]]\\\[[[Z[[[ZYYZZYYYYYXYZ[]__`a`_^\[XUSSRQPQSUSSVXY[[[ZZZZZZ[\]]\\[ZZYXY_]VZ`fde`Zd^\\`a\W]SUUXXXWWZ[]^_`abccccb_][]][YXY[^^\[\^_]YXXWUX\]\[ZZ\\]]^__abccccbaaabbccccddffdccbbbba`__^^_`bbccdfijlkhfefghgggiigca_][[\]adeeeeeeddddddddcddddddeedbabc`aedbabdcbba^]Z]_bfd`_]ab_]\]\Z[[ZXWWWWYZZZXZ[]\[[Z[_aa]`aefed_^WXXVUTTWWY[]_^^[[[ZWXXWXYZ\]]][[\ZWY^ZY^a`U^b_^^^]YY[ZYYYWUUTSRRQQPRX\YVWX]]```^]^_`_^\[\\]_aaaa``[UUSQOONNOPQRSTUXWTSUTRRTUUVWXWWUWXYZ[\\[YYXYZ[[ZXXY]^^^]\[[[[[[ZXWXYZZZZZYXXWVUUVWWVTTUWXY[[[\\][WTSUY\^]\Z[[YXWVUUUTTTTUUTUTTTTTTUUTTSSSSRSTSSTTUUVWWXZ\]\ZXWVVVUUVWWWVUUTSSSSSRRRSSSSTSTSSSSTTUUUUUVVVVVVUUVWXXXXWVTRPQQRSRRQRRQQONOPQQPPPPPPOOMJD@>;8656976544567776665789:::988888888889::;;;:::;;::;<<<=<<;:::::99899:;;;;;;<==<=>>???>;97:>ADEDA=;;?AEGGFDCBABBCCBCDDCCBA@?>>>=<===<<<;;;;<<=====<;:eeeeeeeeeeeddbbcbbbbaaa`abbaa`bdfhjlmlkifbjhgglkiggiklnlihfhjkmlkjjjjjjjjjjjihggffffffffggggghgffghghiiijkkjiihhhhecbbbbdeddccceeedcccbbbbbbbbccbbaa`````__``a```____]\\[\[[ZZ[\[[ZYYXWXZ\^`bcba`]YWUUUTSSTUXWW[\^^^^]\\\\\]^_`__^]]\[[a\W^ehhd_^c_]^b`]Z]SYZ\[ZZ\^`aba`abcccba]YXYXWVVYZ^^\[Z\\[YXXYVX[\]^]]_`aabcceeeffedccdeefgffffecba``__^^]]\\\\^`bccdehknmiffgijjkkjhfca_[ZZ[\_ceefggggghhhgffedcccccddc`^^__cgfcbcdcba_][[^abc`^^^ab_]]]\ZXVUTSSSSUVVUTVWYXVVUVYZ\YZ[\]]ZUWRWXVSST[YZY[^_`[ZZXVWWWXYZ\^__\[]\[X`\[^eaY`dbaaa`\\[[ZYYXVWVTRQPPRUZ[YVWY]`abb`_`aba`^]^_`bdddedc\TTPOOONMNOPRSSSWXVUVTQQSTVWXZ[XUWZ[[[[ZXWWVVYZYXVVWYZZZYXWWXXXXXWVWXXXWWVWXXXWVWXYYYYXXWWWXYZ\^]YTSRSVXZYVTUWSQQSSSRRRRRRQRSTUTTTUTTTSSSSSSTSSSSSSTTUUUTUWWXWVUUUUVVWXWVVTTSRRRRRQRSSRRQQRRRRRSSTTSSSTTTTSSSRRSTSSSRRPOMMMNOOOOOOONMMNNNNONNNNMLLKHB?<97656887543456776665689::::98899988889::::::::::::;<<<=<<;:::;;:999::;;;::;=>>==>>>>>=<:7:>ACDCA=;<@BFHGFECCCCDDDDDEFEDBA@@?>>>=====<<;:::;;<<<<<;:9fffffffffffedcbbcccbaa`bddbaaabdfhjklkjigbkifimljhgilmomigfhjkmmlkllkkjjkkkkjihgggffffffffgghhggfghghiiijklkjjjjjjgeccccdeeedddfffeddcccccbbbcccdccbabbaaa`aabbaaa``_^]]\\\\[\]]^^^_^[XYZ[\^`aa`]ZWVWXWVUUUVXZ[^```_^^]]]^^^__`a`_^^]ZZ^X[effggZ`a`_aee]`[Z\_]\[]_acddbaabcccba\VUVVUTVX[__]\\^]\ZZZ\XZ]^_``abccceeeffghgfeddeefghhhgfdba`_^^^]]^^^]\\^`abbcdgkllhghikkjjhfdb_^][[\\\^`bcehiiiijkkjhfdcbbaabbba```_`dhgdddddcca^[]`cca^]^`aa`]]]\YURRQQQPQRTUSSTUWWUTSRSUWZYWUUVURXYY[WVTRZ]]\\_`_ZZYZZYXVWXY[\]\[Y\]]U\\][ea]bfdaccb^^\\[YXWWXWVTQQQTWZ\ZWXZ^acccbaabcba``baabddeedaYQSPQQQONNOQSSSRUXXWWURPRTWXZ\]YUX\]\[ZYXWWVVXYXXYYYXXXWUTSTUVWWWWVVWWVUUUVVVVVWWXXYYZZZXWWWXY[[ZXTSQRTUVUSQQRNMOPRSSTSSSRRRSTTTUUUUTSSRSSRRRRSSRRRRRSSQPPSTTTTTSTTTUVVUUTSRRQQQQPPQQRQQPPQQQQQQQQQPPPQQQQQPPOOOPPPOONNMMLLMMMLLLLKJJIJKKKKKKKKJJIHEA=:86546887543456777665579:;;;::9::9998889:::::;:::::;<<<<<<;:::;;;;:::;<<;;:;=>>><;;;<==<:8:=@BCB@=<<@CGHHGEDDCCDDCCDEFEDCBA@????>>====;:999::;;;::998ffffffffffffeeeedddcbbbdedbabbcdegiijiihgcjiikomkiikmoomigfhjkmmmmmllkkkkkkkkjihgggffffeeffgggfgfggghiiijkllkkkkkjigfeeeefefffghgggfeedddcccdddeeedcbccccbbbbccbbaaaa`__^^^^]^______^\ZZ[\]]\]]\\ZXYZ[ZYWVUVWXZ\__^]\\\]]]]\\]]]]\[ZYWXYW[ecbddV]^`acfe`e^_`ca__`bdffeedcddddb^YUUVVVVW[\_`__`aa`^^^`\]`abcddccbacdeffghgffecbcefggggfdcbccbaaaaaaa`_^_``a`acfigfeghhihec`_^^^^]\\\\\]^`adgiiiijjjjhfda_^]]^^^^_cbaaeggddefgggda_`bdca^^_aba_]\\[WROQSSQQQSUWTSUXYXXVUUUUWZZXUUVVV]]^^ZYYTZa`_^^`\WWWXYXVUWWWWWXYWUY\ZRXZZXbb^cgc`ced]_^\ZXWWWXXXVTSSTVZ]\XYZ_acdfdb`_cecbbba``aaaa_[SMSSTUTRPQRTUUSQRVYXXVSQTWYZ[]`\VY^_^]\[ZZZXY[[YY\[ZZYXWVUTTUVWXXWWWVUSRRSSSSSTVWYYYXYYYYXXXYXYYZYWVTTTUUUTRQRQPPQTTUVUUTTTUUUUTUUTSRRRSSTSSSRSSSSSSSRSQQQRSSSSSSSSSSTTTSSQQQPPPOOOPPQPOOOPONNNNNNNMMMNNNNNNNNNNNNONNNMMMLMMMLKJJIIHGHHGGGGGGGGFFECB>:874446888653334567765568:;<<<;:::::998889::::;;::::;<<<<<;;9::;;<;::;;;;;;:;=>><:999:;<<:9:===ACGHHGECBBABBBBCDEEDCBA@@???>>=<<<:98888899998777eeeeeeffffeeeeeeddddcccddcabbccdefghihhgfeijjmonkjiknooligghjklmnmmmllkkklllkjjihgggggfeedefffffgfgfgghhijkkjjjjkjihggfeeeefghhihhgffeedccbcddefeeeddddcdcbccddcbbaaa```````___````_^][\\]]\[ZZ[\YZ[\\[ZXVUVVWX[\\[ZYZZ[[[[[ZZZ[[ZXWVVVWX[]^__\XZ]_adfebb`cddc```bfggeffeeeeeb[VUVWXXWXZ]``aaacbaabbb_`bcddedca`_aceefggfdeda_bcdddeeedccdeddcdeddcba```__``cffcbceggge`^[ZZ\^^^]]\\\\^_`cfgghjjjjigec`][ZZZ[\\\^aceeffedfghhgebaacdca^_`aaa_]\[YUQPQTTSRRTWXUTXY[ZYXXXVVWXXWVUVWY\__`][\Y[ca_^\[XUUUWXVUUWVVUTUTTRTTUPUTUU]]]```^cec[__\YWWWXYYYXVSSSUY\]WXZ_bccgdb^^cccbab_^\\[ZZXUMOTTVYWSQVVUVVSPPVXYXWTTVY[][]`^WY`_^]\\\\\\\\\[[\[[ZYYWVUVVWXXXWXXWUTRQQQRRRRTUWYYXWXYYXXXYXXYYYZYWVVUTUVUSQSTQQRUVWWWUVVWVVUUUTTTSRQRSTTTSSRSSSSSRSSRRRQRSSRRRRRRRRRSSSRQPPOOOOOOPPOOONNNMMMMMLLLLLLLLMMLLLMMMMMMMMMLLMLLLLKJIHGGGFFFEEEEEDDDCCB@>;97645678887542235666654479;<<<;;::::9998789::::;;:9:;<<<<<;;:9::;;;;;<<;;<<<;;<<;98889:;<:9:;=@?>=<<=@CFHHGEB@@@@@@ABCCDDCBA@??>>>>=<;:988887888777655eeeeeeeeeeeeffffedddeeedcbbcccbbcefggffffghjlnpnllkmopolhgghjklmmnnnmlllllllkjiihhggggfddcdeeffggfffghgghijjjjijjjjjihgfedegijkjiihgffeecbbcdeefeeffffeedccddddcbbcccbaaaaaaa``aaa`_^]]]^^^]\[[\]Z[]]\\[YWVUUTUWXXWVVWXYXXXWWVWVVUTSTUVWWXZZ[YWVX[^abccbbceffeca`bfghfhggffed`YUTX[[ZZ[]_abbccedceeeeabdeeedc_[[]_abcdeeebcc_]_````bcdddefgggfffggfedca__^_aabb`_abddd`[ZYZ[]_```_^]]]^^`ceeffffghgec`]ZXWVVWXXXZ^abdffedfhiigecbbcccbaaaaa_]\[ZWTSTUWWVTTWZ[XV\]^]]]][ZYWWVUVWWY[\_ab`_^_abb_\XVSRRSUUTTVWUUTQQPPNPQRMQPQQWVVWYY[acbX`]ZWVVWXYZZZXUSTUYZ_\XY_bbcjec][adba_^ZWVVUUTRRMPTVY[XSSYYYZZVOMTXYXWXYZ\]^\]`_YZa__^^____^__^]^`][[\[ZYXYZ[[ZXWXXWURQPOPQQQPRTVYYYYZZZYYYYXXXYZZ[ZXWVUVWWVUWXUSTXYYYXWXXYXXWVUTTSRQQRSTTTTRRSTTTTTUTSRRRRRSSRRQQQRRRRRRQPOOOOONNONNNNNNNMLKKKKJJJIIIIIJJIIJKLLKKKLLLMMMLLLKJIIHGGGEEEDCCBBBA@@?>=:864446789998742124566654369;===<;;:99::9988999:::;;::;<==<<;;:::;;:;;;<;:;<<;::999987689:;:999;===<<<=?ADFFECA??>>>=>@ABBBBBA@?>>===<<:8777777777766544eeeeeeeeeeefgffedddeffecbbcddccbbcdeeedffghkmnpnmllnpqolhggiklmmnnnnnllmmmmlkjiiiiihhgeccbcdeffggffghgggghiiiihhijkjjihfedfhjlmlkjihggffdccdeeefedfgggggdbceeeddccddddccccbbbaabbbba`___^___^__^_\]a`]ZYYXXWVUUUUUTSTUVWWWVVVVVUUTSSTUWWXYXXXWUUW[^]\]_`acefgfcb``ceihjihgedc^WTU[^^^]]^aabccdeddeddeabdddc`]XVWZ\^``bbbb^`_\\]]\]^`acefghiiihghiihgfca`]]_`a`_^_``aa`][Z[\^``aa``_^]]^_`abbb`_`ceec`][YXWVUUVVVX\^^\_ccdehhhfdcbbcccbaaa``^\ZYXWVVWYZZYWVX[]\[_`a_^``^][XWVUUVWXZ]_ccba`abcb^ZTRPPPQSUVXZYVVUSSSTRSSSNQQMMSQQRSUW[[\X\WVVWWXYZ[[[ZWVUWYZ]_[[`bbblha[\__`_[ZVSRRQQPOPNQSW[\XRW]YY\\WOMTYYYXZZ\^^_\^b`YZa__^]^__`aaa`_ac^]]_^]]\]]]][ZYXWUSRQPPQRRQQRTVXXYYZ[[[ZZZXXWXZ[\\ZYWUVXXWVZZWUVYZ[ZZYYZ[ZZYWVUTSRPQRSTTTTSSTTUUUUVUTTSRRSSSRPPPPQQQQQQPONNNNNNMNMMMMMMLKJIIHHGGFFFFEFGGFFGHIJIIIIIJJKKJJJJIIHGFFEEDCBA@@@?>=<;;:865345779:;:9853123567664358;=>>=<;;::::::99:999:;<;::;<===<;:::;;;;:;<<;::<=<:87888776789:99889;;;<<<<>?BDDCA?>==<<;<>?AAAAA@??>==<;;;:8666676666654433ffeeeedeeeefffeeddefggfddefffdccbcccddcdeehjkmnmllmoqrokhfgiklmmnnnnnmmnnoomkjihiijjigdbbbcdeffffffggghgggghhhhhhijjihgedegiklllkkjiiihhfeedeeeeddefghhhdbdfffeddeeeeeedddcccccddccba`````aabccba_`c`\ZZYYZYXWVVWWVUVWXXWWVVWWXVVWWWXXYZ[ZZYWVVVY\\[YY\^``ccdcb`_]^afhjihfcb`[VWZ_ba`^]_``abbccccdbac`aaa`_[XTSWYZ[\]^^^]Z][YYZZ[[\^aceggikjjigiijihfdb_]]^_____^^__^][[\^_abba```__^^_`aa`__][\_bb_^][YYYXWWXXXY\]ZUY^``bdefdbb`bdcaa```_^\ZYXXWXZ[\][ZYY[^a`_abdb`cca^[YWTTUVVWY[]bba`_`ab`\VRPQQRTVXZ\^\YZYWVVXVWWWRUSNOSSRQTUVWSWXYRWXZZ[[[]\Y][ZZ[]^_a__abb`lha\[]\\[XVSQQPOPPPQQSSXZZVSX^YZ]^ZROUYZYYZZ\^^^\]a`WW^\\[[]_`abbbbbce`_`ba`__`aa`]ZXWUTTTSRRTUTSRSUVWXXYZ[[[[[ZYWVWYZ[[[YWVVWXWXZ[YWX[[[[ZYY[\[ZYYXVUSRQQRSTTTTSTUUVWWUVVUTSRSRRRRPPQQQPPPPPQQPPPOONMMMLLLLLKJHGFDCBBAAAABCDDDCCDEEEDDDEEFFFEEEFEFEEDDDBBA@>===<::9887654445789:;;:975223577886448;>???=<<;::;;:::;:99:;<<;:;<=>>=;::9:;;;:;<<:9:<=<:87788765789998788::;;;;==>?AA@?><;::9:;<=>>???>>==<<;::::8655566666654322ffeeeeddddeeeeddddefggfeffffeddccddccccdeegiklmkllnprqokhfgiklmmnnnnnmnnooonlkjijjkkigdbbcddeeeffeffffghggghhhhhhiiihhfdddfhjkkkkkjjjijihgfeeeeeddeffgggdceggfddeefffeeddddcccdddddca``````abccba`be`[ZYYYZZYXWWWXYZZZZYXWWWXXXYXXYZ[[[\\\[ZXWWXZ\\ZXX[]^^]\\]^^]\[_ceggeca`^ZUZ]cdca^^^^_`aabaaab`_a^^_^]ZWUSTWZYYZ[\\[ZXXWXXYZZ[\^`beggikjihgiijihfda_\\]^]ab^]^^^][[\]`bccba`__^_____`a`_^\Z[^`_^]\[[[[\\]]]__]][U^`___`cdca``adba`__^]\[ZYYYYZ[\]]\ZZ[]_ababbee`eec_]YYPTUUTUXZZ[ab___`^\XTQQSTUVXZ\^`]\[[YZZ]\\\\YZUNSWUWQTUXYWQaaUXZ\]]\[^^X\\\^^^^`bb`bbc`jia\[[ZYZWTSPOOOOPQQSUWYYXUTXYYY]^ZSQUXYYXXYZ[[YVX\[WVWXWVWYZ\]_`abcdd``acca`_`aa`]ZWUTTVWUSTVWVUTTUVWXXXY[[ZZZZXWVVWYZ[ZXVUUVWVUZ\XXYZ[[[ZZY[\\ZYZYXUVSQQRSTTUUTTUVWWWUUUUTSRQQPPPQQPPPOOOOPQRRRQPOONNMLLKJJIHFEDB@???????@ABA@@AAABBBBBBBCCCCCCBBBBBAA@??><;;::98766554434589:;<;;:85323578897547;>@@?>=<;;;;;;;;;;:::;<<<;:<=>?><::9:;;:::;;:99;<<:876776657889887789::;;<<<=>??>><:99999:;<<====<<<;;;::::97654556666665433ggfeedddddeeddcdddeffefghhgfeddddedcccccdegijjjjkknqrqnjgffhklmmmmmmmnnoppoomlkjjklljgeddeeeeeeeeeeeffghhggghggghhiihgedddfghijjjjijkkkkihfeeeeddcdffeffefghhfddeeefffedddddddeeeddca`aa``_`abcb`_aa^\\[ZZ[[[ZYYZ[\]]]\[YXXYZZZZ[\]^___`___^[ZZ[]]\[[[\\\[YXWYZ[\[[[_`aa`_`_^[V\`eeda^\\]^____^^_`^]]\[[[ZXVUUWY[ZYZZ[[ZZYYYYYYZZ[[]`cfffhihhgghiihgedb_\\]_``_^]^]]][[\^`bdca`_^^^_____```__\[]^_^]\\]]^_`aabbcca`]V`a^^^_`a`]\_ec_`_]\\\[ZZ[[ZYZ\\]^\Z[]_`abbbcgfaffc_\XYPUUUSTVWVSZ\[\]\ZXTRRSVXYZZ\_`b`_^^]^_aa``a^^WQVZZ[TVX[\\T`bZ\]_`_^[]bUYa`a``abdcbbcc`gf_[YXXXXWTSPOOPPQQRSUWXXVUUUVW[^^[VTVWXXWVVVWVURRUUSRSSRRRSUWY[]_`bddbaaccb`__aa_[WTSSUY[XVWYYXWVVWXXWWXY[[ZZZZXUTUVWYYYXVUUUVWXY[YZ[\[ZZZZYZ[[[Z[[VTTSRRRSTUUUUUVVWWVVUTTSSRPOONOPPPPONNNNOQRSSSRQONLLKJIHHGFECA?=<;;;;;<=??>=====>??@@?>>????>=<<====<<<<:998876554455445689;<<<;;97434578998657;>@AA?>=<;;;;;;;<;;::;<=<;;;=>??=;:9:;;::::;:99:<;:877776656789887789::;;<;;:;<=<<:8888999:::;;;;::::::99:::8765556667775433hhgfeedddcddddcceedeeefghhhgedddefdcccbbddfhijiiiknqrpmheefillmmlmmmnnoopppomkjijlmljhedefeeeeedddddefgggffffgffgghhgfedddefgghiihhijkkljigfeeedcadfedddfhhiihggfefgffedeeedeeffeddca`aaa`___``_]\]]\\]]\[\\[ZZ[\]^^^^][ZZZ[\\\\]^`abbabaa`_^\]]^^]\\]]\[YWVUVYZ\[ZZ\]\\]]^^`_Y^`ddda^[\]]]^^][[[]\\[[ZZYYXXXZ[]]\[[\]]\[[[[[[[[[[\^`bddefggffegghgfeca^\[]^a_]_^]]\\\\^^`bcb`__^^^____`````_^^__^]\\]]^_`bdeeehgec`Ybd``abba^\\ae`^b^ZZZZYYZ\\[ZZ\\]]\[[_abbbcccgfbfeb]YVZSVWVSTWWTQVXXXZYVTRQSUZ\]]]^_adba``_`bddbbda^YTY]`_UX[^__Y`c___abba^`_[Wa_cdbbbccbaba_ecZYXWWXYXUSPOOPQQRSUWYZYXUSRSWY\\ZXUVWWUTSRRSSQPNPPOOPOOOPQRTUWY[\^``__`bba_^^__\XUSRSW[]ZXY[[ZXWWWXXWVWXZZYYXWURRSTVWWWWUUTUVYWXYZ[\\[YYYYXYZ[ZZ[ZVTTTSSSSSSTUTTUUVVUUTSSRRQONMMNNOOONNMMMNPQRRQQPNLJIHHGFEECB@><;9989989;<<;:::::;<===<:9:;::9988899999::9877765444445545689;<<<<;97545679999766:=@BB@?>=<;;;:;;<<;::;<<<<;;=>??=;:9:;:999:::989;;9877776657889987789::;;::::;;<;:9767899:9999999888998899998876656778887644iihgffeeedddcdcceeeeeffgggffeeffffedcccceefhhhhhhjnpqplgeegjlmmlklllmnnnooonlkjjklmligfefffefeeddddddeeeeddeeeefgghhgffeeeeeffggggghijjjjhfeededcaceedcdfhihhggggeefffedeeedeeeeedcbabaaa`__^^^^]\\[[\]\[[[[Z[[\]]]^]]\[Z[]^_`^__`aabbbcccb`_]`_^]\\\]][ZYWXVWY[^^]\\[ZZZ[]^__[^_a`ba^\\]]^_^][Z[]]]\]]\\\\]]_`___^]^```_]]^]^]\\\\^_abbbcddcccdefedca`^\\]]]^__^\\[[[\^^`bb`__``_^_```_`a````_^^]\[[[\\]_bdefgijhfc^egedddb_\\_`a\^`[XYYZYYZ[[ZZZ[[\\\[\_bbbbba`aa_a_]ZYW[WYXWSTXXVTVXWVVUSRQSWY^``````abcaaa_abca``c_\YX\`c_VY]a^\\aebbabccda_Zb^_^ceb``__^^^^^b_ZYZYYXYYWRPPPPRRRSVY[\\ZWRRSVWZZXXWWWVTRRRQQPPNMNONOPOONPSSSSSVUVWXZ[\]__^]]\\\ZWUSRSVYZYWY[[ZYXWWXWVUVWXWVVUTQONOQSTUUUTTSTUXVVXZ[\[ZXXXXXYZZYXYYWVWTSRRRSRRRRQRSTSRRQQPPOOMMKKLLMMMMLLLLLMNNNNMLKIGEDDCBAA@><;:9877666788998877789:;:9766777776567777888887776655556666669:;<<<<;:87667799::9767:=@BAA@?>=<<;;;<<;:8:;<==<;<>???>;99::9:9:98778:::98777777788998778999:::9::::;::865788:;;;:::99998888889998877767788999866jihgggffeddddcdddddeefffffefffgggfeddddddefghhhhgimopnjgeehkmmlkkjjjklmnnmnmkjjjlnmkigfffefffeeeeddddddddddccdefhhgghggffeeeeeffeefghhhihgedddecbbcddcbdfghggggffeeeeedddddddddddcccbbbba`__^^^^^]\\[[\[[[ZZZ[\]]]]]]\[[[\]`aa````aa`aabccb`^\b_]\\[\\\[[[ZXXX\\__^]][ZYZ[[\^^]^^^^``^]]]^^__^\[[]]]]^_^^]^`baa```___aaca````__^]\\^_``a`___`aaccdcba`_^]\\[\^_^\ZZ[\\]^^`aa`^_``_^^_``_`a_```_^]]\[ZZ[[\^`cefgjjhfebgigfeca^[\__^\]]ZWYYYXYZ[ZZYYZZ[[\[\^`a`ab`_^^]]][YWY[X\YXSUYXVUVTTTUSRQQSX[^aaa`````bbaa_`a``^^a^ZZY^ac_X[`b]Y]adbbaaccec^]_^^_cea^\\\\\\\\^]ZZZ[YXXZWRORPPRRSTVY[\][XTSTVXXXXXXXWVTQQQRQPOOOPOOOPPOMPTUSRRTTSSUWXZ[\\\\[[[ZYVTSSSUXYXWXYYYXWWWWWVUUVVVUTSQOMLLNPRSSTSSSTTUTVXYYZXXWWWXWXYXWWWXWUTTSRRQRRQQPPQQQQPOOOONNNLKKKKLMMMLLLLLLKLLKKKJHFDBAA@@??><;98765555556777666666789985456666665565556888776676555666776689:<<=<<:9767889:;;97779=@ABA@?>>=<;;;<;:989;<==<<;<>??=;:99::99997678:::98888778888888888889:::9999:998765678;;<;;::9999988878889887777778999:986kjihihggffedddddeddedeeeeeefghiihgeeddeeffgfgghgfhlnnlhgggikmmlkjiiijkllmllljjjklmljhggffefffeeeedddddddcccbbceghhhhhhhgfefeeeeddddeffffedcbccddccddddcdefffffeeeeedddcdddddcccccbbccccbba``__^__^]\[ZYXYZZZ[\\\\[[[[[[[\]^`bba```__^_`bbcb_^\e^\[ZZZZZZ[\[ZZ[_`cba`_]\\[ZZZ\]^^]\]_______`a`_^^^__``aba``bdcbbabcba`bcecbbaa``_]\[]^__^^]\\]^_`aba`_^^^]]\Z[^^\[XYZ[\]^^`aa_^_aba^^_``_`a_```_^]\[ZYYYYY[]_cegikigffhjjheb`\Z[]]]\ZYXXZYXWWXYYXXXXYZZZ[[]]^^^_^]\ZYZ[[YX[\Y`[ZRWZXVUTTTTTSRQRUY]`ccca```]bbaa_``\][[^\YZ[^`a_Z]_c_X]aca`^^_acc_\]^]]ab][XXXXXXXYZZ[\]]ZXXZYPPTPPUTTTWZ\]]\ZXWWXXXXYYYXWUSQRRTSRQSSRQQQRRPMQXXURRTTRQRTVXYZZZZZYXXXVUTSSTUVVUVWWWWVVVUUUUTUTTRPOONLKJKMOPQQRRRRRSSUVWWVVUUUVVWVWVVUUTTSSRQQQRQQOONNNNNNNMMMLLLLKJJJKLLLLKKLKKJIHGGGGFDA?>==<;;;;:976544444345665554445678986434556665454456788877776666778899889:;===<;:988889:;<:9889:>=<;;<;9878<>??><;;<>@><;::;:999865689::9888888888888888888899999988776653689==<<<;::99::99988789888778888999:;:8lkjjjjihhgffeedeeddddddddcdfghiihgffeefffgggfgigfgjllkhhiijmmmlkjhhhiikkklkjijkkklkjhggggfeffeeeeddddddddccabceghhhhhhhggffeeeeddcddccccbbaabcddccdddddddddddddddddddddddddddccccccccccbbaa``````_]\[ZYXYZ[[\\\\[[[[[[[\\]_accba``_^]^_bcda^_]e_\[ZYYZ[[]^]]]^abcdcba_^^]\[Z\^_^]\]__``aaabcbba``abbcddcbcdfeccbdeedbcdecbbaaa`^][[]]^]][YYZZ[\^^_^]]\^^]][[[^\ZZVWYZ[\^_`a`^^`bdb_^`aa``_`ca`_^]\[ZYXWWWWY\_bcfhfdehgfggdb_[YZ[\[ZXWWXYYVTUVWWVVVWXYYYYXYZ[[[[[Z[ZY[]^[Z]^[a\[VXZWUTSTTTTSSRSUY]acdcba__Za```^_^XZXX[[Y\[[]]]]^]a`Z[__\[XXZZ[][YZYXX[\YXWWVVVVXXYZ[\]]ZXXZZPQVRRWVUUW[]^_^\[ZZYYYYZZZYWVSPSTVUTUVUTSSSTSRPUXZWRQTVUTTTVXXXXXXXWVVUUTSSRRSSSSSSSSSTTTTTSSTSRRPNMMLLKJJKLNNOPPQQQQQRSTTSSRRRSSTTTSSRRQQQQPPOPQPOMMLLLLLKLKKKJJJIIIHJKKLLKJJJIIHGEDCDCA@>=<;::::::9865433333456654444334668986544455666545677888888887666789::;::9:;====<;:98889:;<;99889;?ABA@?>>><;;<;9878;>@?=<::;=?><;::;:987644689::9888888888888888888899999998886654689<<===;::99:::::9988999988777899:;<;9llkkkkkjjihhgfeffeeddcccccdegghhhggggffghhhhgfhfffhjjihiijkllllkjhghhijjjkjiijkkklkihgfggffffeeeedddddddddcbbcefgggggffffggfeeeddccbbbbbaa``acddddddddcccccccccccdddddeeeeeeedddddddddcccbbaaaaaa_^]\\\[[[\]]]]\\\\\\[[\]^_accbbba_^]]^acda^_`fa^]\\\]]^`a`__`dddeddb``aa_]]^``__^^_abcdcccddddcbbcddfedbceecccceffdbbbca`___``^\[\\]\\[YXWXXYZ[\]\[[[]^]\[ZZ]ZXWUWXYZ[^_aa`_^acec`_aba`^_cdb`_^]\[ZYXXXWWWX[^`cdb`bedbcdb`]ZWXZZYWUTTUWVSQSSVUTSTUVWWWVUVVWWWWWY\\[]`a^^^_\a[ZYYWUTSSSTSSSUUTUZ^bcccca`\X^___]__YYXWXZZ[ZXYZ[[[W[\YWXWUSQPSSSUVVVUUUWXWWWWWVVVXWWXYYZYWWZ[ZSTZUUYXVWWZ^__`^]\[[ZYYYYZYWVSRUWYXWVVUUTTTTTSRUXZXTTVZYXVWYYXXWWWWVUTSSSRRQQRRRRQQQPQRSSRRRSSSRQONMMNNLKKLLLLMMMNNNOOOPPPOOOOOPPQQQPOOOOOONNNMNOOONLKKKKKKKJJJIIIHGGFGIIIHHGFFEEDCA@???>=<;:9899998876543344455775444333456898654444567655678899999999987789:;<<<;:;;<===<;:98889::::99878:=?A@@???>=<;<;9878:=>><:89:<>=<;:;<:98764358:9:9888988999988889988889::::9888766479:=====;::999:;;::99899999888899:;<=<;mllllllkkjiihhgggfedccbbccdeefhhhggggffghiiihghfefghhhhhijjkkkkjihhhhiiiijihijkkkihhhgfeefffffeedddddddddccbcceffefefeeefgffeeddccccccbaa```bccdeeedddcccccccccccdddeeeeeeeeeeeeeeeeeedddccbbbbbba`__^^^^^^_^^]]]]]]]\[\]^_acccbba`^]]^acc`_`bgb_^^^^_aacba`_aefeeedaacccb`^`bbb`^^`acdeddddccdcccdddeecaabcbcdddddca`a`__^]^``]\[[]\[ZYYXXWVWXY[[[[Z[]]\[ZYY[YWVTWXYZ[^`bba_^adec`_`a`_^^ceba`^]\[ZYXYXXWWXZ\]^]]\_cb`____]XTUYYWVSSRSSSQPQRTTSSRSTUVUSSRSSTTTWX]]]]bc`^^ab\YYXXUSRRQQSSSTUUTUZ_bccccb_\X]^]]]_`YYXWTXZYWTUVUVSRQQPNMLMLKKMNOQSTTTUVWWWXXWWWVVWWWVVWXXVV\\[TW[QVYXWWVX]_`_^^]\[ZYXXXYYWUSSVWZXXXVTWUSTTTRRUWZYVVY^][XY[ZYXWWVUTSSRQQQQPPQQQQQQPPPQQQQQQRRSRQONNNNOMLKKKJJKLLLLLKKLMNNMMLLLLLMNNMNNMMMMMMLLMNNNLLKKKJJJJJJIIHHGFEEEFFFFFEDCCCBA?=<<<;;:9877788888765445444568865344334568986544445777667899:::::::::9889:;<<<<;::;<<=<<;:99878899999878:<>?@???>>=<;<;98789;==;:889;==<;:;<:9765324799:988899999999999999889::;;::998776589;>>==<;::999::;;;:998999999899:;<=>==<:9889998765567888876445555668875455433568:875454348876789::;;;;;;;;;:99:;;<=<<;;:;;<<<;;::998877889987789;>?@@?>><;;<;98768:;<:97779:;::::;:9765433799:9889999::::999999999:;;;;;:99977658:==<;:9999:;<;;9989999999::;<=>>=>>=<<;;;:98766777765445679:877555555668986555444579:976565337:87889:;<<<;;<<<<;::9:;;<<<;;::;;<;;;:::98877889:98889;=>???>=<;;<<:87679;;:988789:::99:9875433479::9889:::::::9999::::::;<<<;;::988758:=@@?>><<:::9:;<<<;::89:9999::;<=>?>>=oooooononmnnnmlkjigfedddddeffffgghhhggghhhhhihhhgfegghiihhgfiijllkkkklllkkjjjjjjjiiihggggggggffeddddddddddcdefggfdcbbbceffffeddddceffedcbbbbbcdefffeedccddddddeeeeeeeedeefghhhhgggfffgggfeeddeedddcbbcddccccbaaabbba`_^^___^^__^_``_^]]^__^\^acb`___`aabbb`^\^acbcdc_dfjjjgcdffeda_`aaaaaaa``___^_``_`_^\\[\]__^\[[Z[\\[ZXWXXZYYYZZ[[YXYYXWWVVWY[^^^^___]\\]]\YZ[\]^^^^^^]\[YYZ[[YXWWYZXX[`_\^__]\\ZZZZZYYXYZ]^acdefea\[^aa_ZWXVUTUUTTTTUUVUQSYXWVVWXYXVTSSSSPOQRTTSTXYVQQSSRQQQQQOMMMOQSWYXXVXZ[\]^^^\[[XWVVXXYZVVZWQUUVWSRRRSTUPNONLMPPOKJMQTWWXYYZ[[\[ZZZZ[[ZZYXYZZZVUYYYYYWXWWWWWVUVUVWVVUUTSRRRSSTUUTTVWWSSQOQWUTUVUTUTSSUVW[_]\ZYXURQQRRPOPPOOPQRRSRQRRRRRRRSSSTUVVWVUTRQQQQOMLLKKJJJKJJJKKKLMMLLLKKJKKLJKJKKLKKKKKJIIKMNMMKJIHGGHHIIIHHGFDA>=<;;;98877777655455555555568;;:87566666678999776666679;986565438<98889:<<=<<<==<=<;:::::;;;;:99:;;::::::9877789999889::;=>>>>=<;;;<:98778::;:988889::9998765433479::98999::::::999::;;;;;;<<<;;:::88758;>B@@?=<<;;:9:;<<<<<:::;;::::;;==>???>pppppooonnonnmlkjjhggffeeeeefffffhhhgghhhhgiiiihgfeghhiiiigdiijllllmmnnmlkkkkkkkkkkjiihggggggffedddccccddddefgggfedbbcdeggfffeedddeeeedccbbbbcddeeeedddddedeeeeefeeeeddeefghhhgghggggghhgffeeeddddcbccdddcbbaaabbbbba`___^_^^]]]]]^]]\]^^^]\]```^]]]^__`a`_]\]`_`accadfkmnjbbdfdc`___^^^_```___^]^____^\\\[[]__][ZZZ[\]\[YXXXYYXXYZZZYYYXXWVVWXZ\^^_```_^]]__^\\]_`aa`_^^\ZYXXXXWVUUVWYXX[]\[^__^\\[ZZYYXWVWX[_aceffd`]^_bc_[ZZWUUWWWVVWWWYYTTZZYXXXZ[ZWUTTSRPOPQPONPSUUTSSRQQQQQQONMMOQSWZYXVXYY[[\\\ZY[XVUUVWWZSTZXRUTVYTTSTTUWRPQONPSXQLJOSVXYZZ[[[\\\[Z[Z[]^]][\]_^YWXXXXYWWVVUUUVVTSSUUUTSRQQPQQRRSTTTUVWSRSSRYWVXWVVWTRSUVW[^][YWURPOPQROOQPPPQRSSTRPQQQRRRTTTTUVWWXXVTRQQPONLLKKKKJJKKJJKLLLMMMLMKKJKKKKJJJKKJJJJJJIIKLMMMKJIHGGGHHHGFFECA><;:99887555565544434455555457;<:976556666689::977666779;:97666448<:8889:;<>===<<=<=<;;:99:;;::98899::999998778789989999:;;<==>>=<;;;;987679::9877889:99887665444568::998899999999:::;;<;;::;<<<;;;:97659<@@?>==<<;;::;;<<==<;;;<;;;;::;<=>??>>pppppooooooonmlkjjihhhgffffffeeefhhhhhhhhhhiiijigfeghhijjjgcjijkklmmnnonmllllkllmllkkjihhggggffeddcccccdddefghhhgfddddeghhgfffeeeffeeddccbbccddddeeeddeeeedeeeefffffeddfghiihhgfghhggghgffeeeedccccccddddcbaaaabbbbba`___^^]]]]]]]]\\\]^^^^]^^^]\\\\\]]^__^]\[]]]_bccddjlkfa`cdba^^^^[Z[]_`aa`_^]_```_]\[\\\^_^][Y[]^__^\ZYZZYYYYYYYYYZZYXWVWXY[]_``aaa``__````_`bcdcba_][YWVVVVUTTUUVXXX\\Z[^__^]]\[ZYWVUUUVZ^adeffc^[]`dda_]\XVVYYYXYZ[Z\\XU[[[ZYZ\]\YWTTSRPNOONMLMPSTTTSRRRRSRRQONMORTX[[ZWXXXXXYZYWXYYTUUTTV[QS[YSWVX[VVVVWXYSRSRRTUXTNNOSUXZ[\]]]^]]\[[[]`bba``ab`\XVWXXXXWVUTTTUVUTRSTTSRRQPOOOPQRRSSSUYTSUVR[YXZYYXYUPRVXXZ\[YWUSQONPRSOORSSSTTUVVROPPQRSTUVVVWXYYZZXVTRQOMLKJKLLLKKKKKLMMNNNNNMMLLLLLKKKJIIJKJJKJJIIKLMMMKKIHGFFGGFEDDCA><:9876665433345554432445565446;>;876557777679:;:98877779:::8665448<;98889;<=>>=<<=<<<;:98889::997767888899877788888899999::;<=>>=<;:;;;9876789987788988876654444445899898888899999:::;<<;;:;;==<;;;;:865:====<<;;;;<<=====<====<;::;<=>>>>qqqppoooooonmlkjjjjiiiihgggffeeefghhhhhhhhhiijkjhgeghhikkkhcihijjkmnnoonmmllmlllmmmlkkjihhggggfedcbcccddeefghhhhgfdcdfghiihgffefgfffeedccccddddddeeeeedeeedddeffgffffeefgijjhgffghhhggffeedddddccccccdddccbaaaabbbbba``__^^^^^^^]]]\\]^____^^^^]]\\\\\\]]^^^\[[\\]`aab_dfeb`_^__^]]^^ZWYZ_bcbba`_aabb`]\[]^]^_^\\[]_aba_][Z[[ZZZYYZZZ[ZZYXWWXYZ[]`abbbdbbabbccbbcdffeca_][YWVVVVUUVVVWYZ\^ZX[^___^_^]\ZXVUUUVX\`cccc`\X\^dda`]\YWX\][YZ]]\\][VY[ZYYZ\\[YWTRQPPPPONMMNPRTUUUUTTTTTTSQPOPSTX[[[XXXXVVWXXUWY[RXVTTWZPU]ZTVUW[WVVYXWWRTTTSUUTQOPQRTXZ\^____^]]\\\_cedcbbba_[XVWXXYYYXWUUTUWWVTTUUTSRQPONOPPQQQQRTXSRWWRZZZ\[[YYUPRWXXYYYXVSRQPOQTVQPUUTUUVWWWROPPQRSSUVVVWXYYZYWUSPNKIIIJKLMLKKKJKLMMMMMMMLLLLKLKKJJIIIIJJJJIIHGIKKLKKJIGFEFEDCCBA?=<:987655543323345554334455553349>=:87667887779;;::9988889:::9755448<<:8879;;=>==<<<<;;::877789998654667889876667887779::::::;;<===<;;<<;:987878888789988876543444445899887788899::9::;;==<<;<<==<;;;;:8769<@B@?==>>=<<<;<<<==>>>=>===<;;:;<=>>>>qqqqppppooonmlkkjjkjjjjihhggfeeefghhhgghhhhijklkjheghhiklkidhhiijklnooonmmmmmllmmmmlkkjiihggggfdcbbcdddefffgghhgfdccegijjjihgfffghggfedddddeeedddeeefffffeeddefgggggfffghijigfefghhgfeddddddcccddcccddddccbaaaabbbba``___^______^]]]]^_```____^^^^____^^____^\][Z[\]^^[_`__^\Z[\\\]^]YTX[`cefedcbcdedb_^_`^\]__\\\_bcdb`^]\\\[[[ZZ[[[[\\[YXXXZ[]^`bccegeddefgfeefghgeba_^\ZXXXXXWWXYYZ\^a`[Y\`a```a`_^[YWUUVVVY]_``_\XVZ\aa_\ZYXY[^_\Z\^^\[]]VVXXWWXZZXVTTTRQQRRQQPOPQTVWXXWWWVVVVUTRQQSUX[[[YYZYXXZZXXXX[UXUTUY\RU]YTUTVZVUUXWUUQSSSSUTSPQQQQSWXZ^a____^][\\_ceec_``^[XWVWXYZ[\[[YXWWYZZXWWVUTRQPONOPPQQRRSSWSTUWQWXXZZZXXTPSXXVUVUUTSRSRPQVYTRWWWWWXYYYTQQPPPQRUUVUVVXXXVTRPMJHFHIJKLMMLLLKLMMMMMMLLKKKKJJJJIIHHIIIIIHHGGFFGHHHIHGEDCDBA@?=<;;:9876655544332234765434455553337=>;8767788878:;<;;::98889;;;:865559:<;88779:<<<<;;;;::::876678987533457889776556788779::;;::;;<<==<<<<=<<;9887878899:99998754444566678877778889::::::<<>>>=<<=>>=<<<<;9879<@BA?>>>>>=<<<<====>>?>>>===<<;;<=>>>>qqqqqpppponnmlkkkklkkkkjihgffeeffgghggghhhhijjllkhdghijklmjegghhijlnnoonmmmlllllllllkjiiihhhgeefdccddeffffffgggfedcdfhjkkjihgffghhhgfeeeeeefffeeeffffffggeeddffggggggggghijigfefghhgfedcccccccddddccddddcbaaabbbaaa``___`aaabba`_^^^^_`a```_______````____```^]\\[[\\\]^^]]]ZXZ[\\\]^XRW[_beghgedeggfc````][\_^\[]`beec`^]\\\\[[Z[\\\\]\[ZYXXYZ\^`bccegggfhjjfggghigeb`_]\[ZZZZZXXZ[[\^acb_^adcaabbba_\YWVUVVTUWWXYYWVTVW[[ZXWXYY[^^\[]^^\[\[URTTUUWYXVTTUUTSQTUUUSRRSVXYZZYXXWWWWWUTSRTVYZZZZZZZYY[\WYXXZWWUSUY[TU\VTTRQRSSUXUTSRRSRRUUSQQQPPQTUX[`]]^^^\ZZ[^aa`][YYXXWVWXYZ\]]]\[ZYY[\][ZYWVURQONNPQQRSSRRRTTQPTQTWUUWWTTTRSUTRSRRRRRRTTPQWYUVXXWWXYZZ[XSRQPOPPRSSRSSSSQOMLJHFEEGIKLMNMLLLLMMNNMMLKKJJIIHHHHHHGHHHHHGGFGGFDEEFGFEDCA@@?>=<;:9988876655554443223665434444543337<>;9777899989:;<<;;::9889;;;:8655589<;976689;;;;:9:::::9866678876532246788765455778779:;<<;::;<<==<;<<===;::988789::;::998765445666677766778999:;;::;<=>?><<=>>>=====;:978=@BA@>>>?>===<<===>??@??>===<<;<==>>>>qqqqqpppponnmmllllmmllkjjihgfeeefgggggggghhhjjlmkhdghijklnlgffhhijlmnoonmmlllkkkkkkjjiiihghifdfgeccefgghgfffffeedccehjklkkkkifgghiihgfeefffggffffeffffgggfeddefgggghggghiijigfefgggfedccddddccdeeddcddddcbaabbbbaaa``__`abbbbbba`____`aaa```````aabbbaaa`aabba_]]\[[[\]]]]\YVWZZ[\]]_XQX\`bgjkjhghkjhebbba]YZ]^]]_acffda^]\\\\[[\\\]]^^]\[ZYXYZ\]_`bcegghhhkkfgghijgda^^^]]\\\\\ZZ[\\^adfd``cedccccba_\ZYWUVVSTUUUUUTTSTUWXVTTUXY\^]\]_]]]\]YSQRSSUWXWVTUWYYWSWXYXWUUVXZ[[[ZYYXXXXWVTSRTUYZZYZ[\[[[\^X\XXWXVUSUZZVTZRSSNKLQRTWTTSSSRQRUVTQQPPPPRQUW_Z[[_[\YXY\^]\XVUUTTUVXY[\]^__^]\[[\^^][ZXWVSQOOOPQRRSSSRQRURMQQRSOORRPQROORPOOOOOPQRVUOQXYVVXXVUUVXY[XTTQOMMMOOONNONLJHHGFDDCEHJLNONNLLLLMMNNMLKJIIHGGFFFFGGFGHGGGFFEFEEDCCDEDCB@>=<;;:9878776776565555444223886444444433346:>;:77889:::::;<<<::::989:;;:8654579;;98656799998889:::9766677776533236678764344777889:;<<<;::;;<<;;;<==>=<;:9889:;;;::998876555788766656789:::;<<;;;==???==>>??>>>>><;989=ACB@>>???>======>>?@@@@?>==<<;<=>>>>>qqqqpppooooonnmmmmnnnmlkjihgffeeefggfffgggghjjlmkhdhijjlnnmhfhhhijlmmnnmmmllkkjjjjjiiiiihhijfdhhecdegghihgffeeddccdfhklmllmlheghiiihgfffgghhhgggffffffgghgfeeefggghhhggghijhgffghhgfedddeeeeddefedddddddcbaabbbbaaaaa``abcccccba`````aaaaaa`````abbbbbbbaabcdba_^]\\\]^__^\UU[\[\]^_^WQZ\^chkmlkjkmlifccbb]XX\^^^_adggd`^]\\\\[\]]]^^_^^][[ZYYZ[[]^`bdfgffhjieggghigda^^^^]]]^^^\\]\]^befe`aeffdddcca_][YXVXXUTUUTTTUTSSTUUTSSTWX[\\]__]]^_]WSTSRTVXYXWVWZ\\ZVY[\[YWWXZ[\]\[ZYXWWWWUSSRSUXYYYYZ\\\\]`Y\WVUVTRPRVYUTWPRRLIIOSUVTUUUSRRSWWURPPPPPPPRS[YWV\YYXWXZZYXTSSSSTUWY[]]_```_^\\\^__^\ZYWVSRPPQQQQQPPQRROUSMOPPPKLOOOPPLLOONNNNNOPRTRMRXWTTVVSRRSVWXUTTROKJKLLKJKKJIGEEDDCCEGJLNOPONLLLKLMNMLLJIHGFEDDCCCDEEEFFFEDDCDDDCBABCB@>=;:98877666666666666665555433776545544434446:=<;8889:;;:::;<=<::::999:;;:86445789:98655688887778999876666776654444456787544577788:;<<<<;;::;<<<;;<==>>>=;9889:;<<;;:9876555578876666789:;;;<==<<<>>@@@>>>?@@?????=<:9:>ADB@?>?@@?>>>>>>?@@@AA@??>=<<;<=>>>>>pooooooooooppponnnoonmlkjihgffeeeeffffgggghhjjllihfijkklmnmihhiiijlmmlmmmmllkkjjjiiiihiihgjjfeiidcegghijihgfeeddcdefiklmmmnjfehiiiiihgghiiijiihgggfffefghhhfeffgghhihhgghiihgffghhgfeedefffffefgfeddddddcbaabbbbbbaaa``abccdccbbaaaaabaabbaaaaaabcbbbbbbabcccb``__^^^_`ba`\VY]]]]^_`]WU^__cgjmmlklnmjfcbb`]YX[]__abdfec`^]]]]][]^^^____^\\\[ZZ[[\\^`bdddccdeecddegigeb_^^^^^_```^^^\\^acec`beggeffda`^\[ZYYZYWVVVUUUVVVUUUVVVVVWXYZZ[_][]__[UUWUTVYY[[YYY[]]ZVZ\]^[YZ[[[\\[ZXWVVVVVTSRQRRSVWXWYZ[[\\]XXTRRSSQOPSWUTRQQQMIKRTVYVWWWVVUV[[VRPPPQRPPQPWURPXWWVVVVWUUSSSTUVWXZ]_`abbba_]\^`a`_]ZYYWUTRSSRPMNLLLPPLSROOPOOLLNNMPPLKPRPPPONOPRQLJPUTRQRRPNNPRSSQPRQNKIHIIHGHHHHIGGGFFFFFHKMOPOMLLLLLLMLLKJIGFECCBABAABCCCDDCBAAABA@?>?A@?=;97666655666666667888877766445666555554455569<=<::99:;<;;:;<=<:88:::99::986444678998655677877677899876556666654444345678754556788:;<=>>=<;;;;;<;;<==>?@@>;:9:;<<<<;:987665556887666679:;<<<=>>==>?@AAA????AAA@@@@?><;;>ADC@?>@AA@@@@AA@ABBBCBA@?>>==<==>@@@@oonnnnnnoopqpqpooooponlkjihggfeedefffffffggijklkhghjkkklmmmihiiiijlmkkknnnllkkjjhhhjigijhgjjffihddeghjkjjihgfedddeegiklmmlliefhhiiiihghijjjjjihhhgfeedegihhfghefhhiiihgfghhhgfghihgffggggggfggggfedcdddccbbcccccbbbba``abcddcbbbbbbbbbbbaa`aabbbbbbaaaaabccccb```___`abbb`]WZ]^^^^__[X[^__bejmmllmomjebbb_\[Z\^_`abdeca_^]^^^]\^^\_ba___\\]\[[[[\\]_bcca`_abbaabcfgfdb`^]^^_`aaa`_^\[]`bca_`ceeeffc`_][ZZZZ[ZXXWWWWVWVVWVWWXXXXXWXXYZZZ[\]]YUUWUTVZX[[ZYY[]\YWZ\\_[Z[[ZZ[[ZXWVUUTTSSRRQQQQTUVWXYY[[Z\VWSRQRRQNPSUUTQQPQOPKRVZZXYXXWXXW\]WSPPQQRQQQQRSOPTVVTTUUUTSSSTUUVXY[]_`abccb_]\^`aa`][YYYWWRUVSOFHIIIMNKRPNNONNMMMMLPPMKPRQPPPOOPPNKJNPOOOONKIJKMOPONPOLJHHGGGGGHHIIHHHGGGFFGJLOPOMKKKLLLLKJIHFEDDBBA@??@@@@ABB@???@@?=<=>??><976555455556666667899887777653456555555555568;=<::::;<=<;;;<=<9868999899987544557898766567877667788876556666554433223567754456678:;=>>>>=<;::;;<<<==>?@@?=;::;===<<;:98776656776676799:<<<=>>>>>>@AAAAAAAAAAA@@@A@@?>=>ACBA??@BCBBAAAABBCDDCCBA@??>=??@A@AAAnmmmmmnnopqqqqpooopqpomkjihhggfdddeeefffffgijkkihgikkkklmllkjjijjklljiinnnllllkjifijigjjgfiiffhfdeghjllkjihgfedddefgijkllkjghhggijjiiijjklllkjjihgfeedeghihgggdfhijjihgffggfffghihgfhiihihhhhhhgffedccccbbbcddcccbbba``abcddcbabbbbbbbbba``aabbccbbbaaaabbbba```__``abcbb`][\]^____]YY^bbaceilnlllomhdba_^]]]_``abcccb`^^]]^_^\_`^_bb`^`[^_]\\\]]]^adcb`\ZZ[\_[]abdddb_^]]^`abbba`^\[]_``__`bcbceea^]\[ZZZ[\[YXXXYYXXWWXXYYZZZZXWWWWWWWXZZYVTVUSTW\X[ZYXXZ[YWVYZZ_ZZ\\YXXYXVTSSSSRSSRRRQPORUUVVXXZYXXUTRQRRSRPQSTUTRQOQPTMSS`\[ZZZZ[[Y_`XSOPQRSSSSQQQMMRVTRRSSSSTTUVVWWXY[]_abcdcb`]\^abba^\[[[ZYTXXTMDFFGFJLHPNMMMMMMMNMLPPNLOQQQQPPOONLJIKLKKKKJGGGHIKKLLMLKJIHGGGGHIJKKKKKJIHGEDHJMNMLLLLKKKJIGFEDCBBAA@?>>>>>>?@@><<===<;::;<<;:8653333455666677789:::98888864455666666566668;==<;;:;<>=<<<<<<98568988888876444467788765567666667788776666655544332124667654445679;=>?@?>=<;::;<<===>?ABA?<;:;<====<;:98876557766789:;;<==>?@@@?@ABBBBAAAABBBAABBBAA@>?ABAA??ABCCCBBBBCDEEEDDCBA@??>@@@AABBBllklllmnoqrsrqpoppqqpnljiiiihhgeedeefeeeeefhijihhhjkkjkkklllkkjjjkllihhnnnllmmkjihjihhjidehhefgeefhilnnljihggeddeefgjkkkjihgjkfgjkkjkkklmnnmlkjjihgeedfgggghgedhkjkkihgffeeefghiihggijjijiiiiiihgfeedddcbccdddcddccbaa`acdddcbaaaaabbbbba``aabcccccbbaaaaaaa````___`abccb_\\\^^___^\Z\`bcbbdgijhilomgdb`___``abcccddcb`_^^^_``]aa``aba^b[_`_^^^__^_bedb^ZXVXY\XZ]^___^\\\\^_abbbbb`\Z[]]^^]^___`aa^\[\\[[[\\[YXWXYYYXWWXXYZZ[\ZYXWVUUUTUXXWUUWTSTW\WYYWVWXYWUTWXX]XY[[WUUUUTSRRRRSSSTTTSQPRTUVUVVXWVUSRQRSTUTSSTUUTRQOPRUPVV_^^\\\]]^[b`XTPPQRTTTTRQRMLRUSRTTSSSTUVWWWXYY[]_abcddca^]_bbba_][[[[[VWVSLDFGHGIJHOLLLLLMMNNMMQQNMNNNPPPONNLJHGHHIIHHHGGFFFGHIJKKJJJIHHHIJKLLLKKKKIGECBEHKKKJJKJJJIGFDCBA@?????>======>??=;;;;:::989::987542222345555778889:;;:9899986555566666677778;<==<;::<>>=<<;<<:8547787788876543345677765456555566788776666665554442212467655445679;=>?@@?=<;::;<====>?BCCA><:;<======;:99865579878:;<<<=>??@ABAAABCCCBBBBBCCCCCCCDCCB@@BCB@?@BCDEECCBBCEFFFEDDCA@@??AAAAABBBjjjjjjknorrsrpopqqrqomljjjjjihgfedeefeddeefhiihhhikkkjjjklllllkjjlmmihinnnmmnmkjihiiejhfcdffdefeghjkmomkjihggfedeefhjkkjhffikighjllklmmmnoonmlkjiihfeefgfggigdejlkkkihgfeeddefgghhggijjjjjiiiiiihfeeeeedbdeeeddeeeecbbabcdddccbaaabbbbbbbaaabbcccccccbaaaaaa````___`abba`^\[\^_``_^]]_accbcddffdfkokfdcbaaabcefeeeffeca``_`abbaccaabcb^b\`b_^``a`_adfda]YWUWZ\VWYZ[[ZZXYZ[\_``aaaba]ZZZZ[\\\\\\]^^[Z[\\]\\\[ZXWVVWWWVUUVWXXYZ[ZXVUTTSSRTWWVVWWSSTWZXXYWWWXXUSSTVVYVWYZVSTTTTSSRSTTUUUUUUUSTVVXWVUVVVUTSSTTVWWUVUUUTRQOPSXTZZ]]`]\\\]^[a`XTPQRSUVVUPSRNNSURSWVUTUUVWWWWWXYZ]^`abdedc_^`aaa`^\[YZ[[UUTQLFIIJHKKJOLLLLLMNOONNQPNMLJKNNMLLKJHFFFFGGHHHHHGFFFGHIKKKLLLKJKKLLMMLKJJJHFC@@CFHHGGGGHHGGEDB@@?>=<;;<<<;;:9:<==<;::98876789998764211134456677889::<<;:989987654456777777789:;<==<;:<>?=<;:;;<:734466778877654334677765445445556677777666666655442212468766655679;=>?@A?=<;:::<===>?@BDDB?=;;;<===>><;;:86568:98:;<=>>>?@@ABCCCCDDEDCCCCCDDDDDEEEDDCBBBCBB@ACDFFFEDDCDEFGGGFFDCAA@@BBBBBBBBhhhiijkopsrqpppqqrrpomkjjjjjihgfedeefeeeeeghiihghijkkjjjjklmlljjkkmlhhjmmmmnnmkihhiihifccdffdeffholloqkghihhggfeeefhjkjhfefkmggjmlmmmnnoopponmlkjihgffggggghfdfklkjjihfeddccdeffggfhijjjjijjjjjihgfedefcbeffedefffedcbabcdeedcbbabbbbcccbaaabbbccccccbabaaa````__^_``aa`_^\[\^`aa`___`bdddbcccccdhigedcbbabdefggggggfeca`abbbcdedaacec^b\ad_^aab`_aeeda]YWXZZ\WVVXXWVVWXYZ[]^___``_]ZYYYZZ[ZYXYZYWXZ[\]^]\[ZXWVUVWWVUTTUVVWWXYXWUTTRQRRTWWWVWWTTTXYXYYXXXYYVUSTUUVTVXYVRSTTTTTTTUVXWWVWWWVVXXZYWVUVWVUUUUUWYYWWVUUTRPOPRSRWX[\_\YYXYZZ[ZWSPQRTTVVVPTSPPTUUUXXXWVUWWWWVWXXZ[]^_`bcdb_^_`_^\[ZXWZXRQUSPLIJKLIKLLNLKKLKKNPPOOPPOMKJIKJJIIIHGFFFGGGGHHIIHGFGGHJKLLMMMLLLLLMMLKKJIHFDA?>BEGFFEFFFFEEDB@>=<<;:9999::9878:<<;;:976655567888765200133456678899:;<=<;:888887644568887888999:;=>=;:<>>><:9:;<=932346778877654334668875444334455567777666666655443212357776766789;=>?@A@><;:9:;<=>>?@BDEB@><;;;<==>>=<<;97679;:9;<=>???@@ABCDDDEFFGEDDDDDDEEEEFEFEEDCCDDDBAACFGGHFEEDEFGHIIHGFDCBBACCCCCCCCgfghhijnqsqoooqqrrqomlkkkkkjihgfeeeeffffffghiihhhijkkjiijjlmlljjjknlhjlmlmnnmkihhhhhhhcbdeeeeeffinmnpojhjjihgffeeegijjigfehljghjmmnoonnopqqponmlkjhgghiiihhgfehjiijjigfeddcbccdeeeehjjjjjijjjjjjhgfefgfccfggfffggggedcbcdefeddcbbbbbccccbbbbccccccccccbbbaa```a`_^_`aa`_^]\[]_`abaaaabbcdcbbaabbcddccbbaabceghihghjihfdbbcdddefgfbbege`c]af^^bad_]`ddc`\ZY[]]]YWVXXWUVWXXYYZ[[\]^^]\ZYXXYYZYXXYYXVXZ[]^_^\ZYWVUUUVVUSRRTTUUUVWVUTSSRQRRTWWXXYYUVVYYZZZZ[[\[YWVUTSSSTUXVRSTUUVVVVWYZZYXWYZ[Y[\]\ZXVWXXWWWWWX[[YXUTTSQOOPQPPTVVWYWUVUUUUVVVSRRSSTVVUPVTQRUWXYZYZZWVXXWWVVWWXYZ\\]^^_^]\[ZXWVUSRSXTNPNPMLLMMMJLMMMLLKLJJNPPPOPPNKIHGGFFFFFFEEFGGHHHHIIJJIGHIKLMNNOOONMMMLLLKKIHGGECA?>BDEEDEGEDBBA@?=;:::9976778875358::;:98654433457898763112356677789::;;<=<;:877898754568888999999:;<==<:;>>><9889;=:31134677876654334678876543223445566777666666665543322335778877788:<=?@@@?=;989:<=>>?@BCDCA?<;;;<======<;:878:<;;<=?@AAAAABCDEEEFGHHGEEEEEEFFFFGGGFFEEEEEEDDDEHHIIGFEEFGIJJJIIGFDCCBDDDDDDDDfeeffhjnoqonnpqrqqonmllklkkjihgfeeefgghhhghhiiihhhijjiiijjlmlljjjknlijlmllmmkjhgghhhgeacgeddeefehlloqlhjljihgfeefghijihfeglkfhjjknoppoopqrrqponmljhhijkkjihgffhhgiiihgfedcbbbbccddegiijjjijjjjjjhgfgghfbdhhgfgghhhhgedcdefgfedccbbbcccccbbbbccccddddccbbbaaa`aa`_^_`a``__]\\^`abbbcccccbbaa`````aa``_`__`bdfghhhghijigeddeeeehjigbchhfbe_cf\^bac\[^bba_\[[]`a`]YXZYXWXXYYYXXXXYZ[\\[ZYXXYYZYXXYZYXYZ\\]^][XVUUUVVWWUTSRTTUUVVVVUTSSSSSTVXYYZ[[XXY[[\\\]]^^][ZWUSRRRSTWVRSTUWXXYY[\]][ZXZ[^]^__^\ZXYYYYYYYYZ[[ZXTSSQPNOOPNMPQQOQQQRQQQQQRSRRRSSTUTRRYTSTWXZZ[\\]ZYYXWVUUUUUVWWXXYXXXVUSQNNNOOLPUQKLJLJLNNMKIJMKJJJJJHIMOPPOPPMIGFEEDEEEEEEEFGGHHIIIJKKJHIJLMNOONOPPOMMLKJJJHGFEDB@>>ACDDCCEDA@>=<;:9888887555665323789998764322234689987532246888889:;;;<<=<;:8668:9865568899:;;;:99:;==<;;==>;8558:;941123677776554333578987643222344556676666666665543322234689:99888:<=>?@@?=;988:<==>>?ACDCB@=;;;;<======<:878:<;;=?@ABCCCCBCEFFFGHIJHFFFFFFGGGFGGHGGFGGGGFEFFGIIJIGGGGHIJLLLKJHFDCCCEEEEEDDDeddeegikmomlmopqpnnmmlmlllkjihgfeefghhhgggiiiiiihhiiihhhjjkllkjijkmkiiklkkkjhhgffgggfcadgfeddddehikmoihjljihgfffghjjiigffhljchjjkpqqqpqqrssqponmlkiikllkkigffggffhiihggedcbbbbbcddeghhiiiijjjjjihhhhhhgdfihghhijjjjhfeeffggffeddccccccddcbbbccccdddddcbbbbbaaaba_^`aa````^]^_abbbcdedcccbaa```_`__^]\]^^_acdeffefghiigedcdefgjllicchhfcfbff_`ca_\[]``_^^^_addc`]\][ZZZYYXXXWVWXYYZZZZYYXYZZYXXYZZYYZ[[[[[YWWWWWXXYXWVTTUVXWWVWVVVUUUVVVXZZ[[\]Z[[^]]]^____^][YVSRRRSSUTRRSUWXZ[\^___^\ZZ\_`_```^]ZZZZ[ZZZZ[[ZYWSQPNNMNONLKNNMLLNMONNNMMOPQPRSTTUURUYVUVXYZ[\]]_\[YVUTTSSSSSSSSTTTSSRPNKIIKLLLNONKILIGJMKJJHHJIGHGGGFFJLNMLMLJGEDDEEFGFFFEFGGHIIIIIJLLJHKKLNNPOOOPPOMLKJIIIHGEDDC@>>@ABAA@@@=<99877766568754454432468999986543322468::986433579:::;:;;;;;;<<;:8668:986567899:;<=<;:99:;<;;:;;<964359::6201356777655543346789865422223455666666666666555445444468:;;:9888:<=>?@?><988:<<==>?ABCCA@=<;;;<<====>><:89;=<<=?ABCDDDCCDEFFGHJKKJGGGGGGGGGGHHHHHGHHHGGFFHHJJJIHHIJJKKLMMLKIGEDDCEFEEEDDDdddddfhjkkjkmnnmmmmllllmmlkihhgfffggiiggghjjjjiiiiiihhghiiklkjjiijkjhiijjiihgffffgffdcadfffddcddghkljijjjkheefghjjkkjiggghhhggjjlprrqqssstrqpoonlljkmnlkkigggggggghhhhgfedcccccccdeggghhhhijjjjjihiiihggiighiijkkkkigfefggggffeddcccdddddcccccccdeeddcbbbbbbbbb`__`aaaaa`_^^`baabcdddccba`a```____^]\]^^_`acdeddefghgfdcccefgjmliccggecdcee`bba^\Z\__^^^_acdeca^]][Z[[ZYXXWWVVXXXXYYYYXXXYYYXXZZZYZZZZZYYWWWXXYZZZZXWVVWWYXXYYYYXXXYYYYZ[\[[\^\\\^^^^^_```^\[ZVRPQRSSTSQQRTVXZ\^`aaa_][Z[`a``a`_^[[YYZ[[[[\[ZYVROMKLLNNLKLMMLJKNNOONMLMNNPOQRSUUUSUXWWWXYZ[\]^^]ZWUSRRQQQQQQPQRSSRRSROMMLJLLMLLKKJKHGIIHGHGHGFEFFFEDEHJKJJKKHECDEEEFGGGGGGGHHHIJJIJKKJHKLMNOOPOPOOOMKJIHHGGFDCCC@?>?@@@?=<:86555555444566433334434578999876433222469:98754468:<<<;;;<<<;:;<;:866798777678::;<=>>=;99889::999:7422478:741024677666555444578876543222334566666566666655455555568:<<;;98789:<==>>=<989:<<==>?@BBBA?=<<<;;<<<=>?><:89;<;;=>@CDDDDDCCDEFGIKKLKHGGGGGGGGGHHHHGHHHHHGGHHHJJJIIHIJJKKMMNMKIHFEDEFGFEEEDCdcccdfgijiijklkkkklllklmmlihhhhgffgijjgeeilkkkjjiiihgggghhijjjiijiihgggghhhfeeffghgebccdfgfddccdfgjjhijkkkgdeghjklmlkjiiihhgghijmprrrstutsqpooonmmlmnnmlkihhhhhhhhhhiihfedddddddddeffghhhhhijjjiiiiiigehjhgijjjkklljhgfghhhggfeedddeeddddcccccccddddcbbbbbbcccb`__acbaaaa```aaaaabccccbaaaaaa```__^]\]_``aaabbbcceffedcbaabdfhjjhbbdedbabccacb`][[\]^]^^`bdddca_]]\\[[ZXWXWVUVXWWXYYYXXXWXXXWXZZZYYYYXXWWVWXYYZ[\\\[ZXXXZ]ZYZ[[[[[Z[\[[[\]\[\^]]]_`_^_```_^\[ZWQMPSSSSQPPQSVWY\^`baa`^[Z[___``a`^\ZXXY[[[\[ZYXVQNKJKKOOMLMOMLHKOOOONMLMNNOOQRSUVVVUWXYXXXYZ[\]]\XUSQQPPQRRQQQRSTTSTVUSQROKLMNMLLKKJGEFEDDGGEDDDDDCBBCEGGGGIIGDCDEFGHHHHIIIHHHHJJJJIJJIHLMMMOOQPPONNLJIHFGFFEECCBA@??@@?><;974223355432456532223333567898876544333469::9754468:<==<;<=>=<::;:9876788888789:;<==>>><:98789998775200267:853114577666655544467887643222334556666566676665445788778:;<<;:9888:;;<<===;:99;<<=>?ABBA@?=<<<<;;;<=>?>=;::;;:;<>@CDEEEDCCDEFGIKLMKIHGHHGGHHHHHHGGGHHGGGHHIIJKKJIIIIJKKLMNMLJHFEEFGHGFEEECdccdefghihhhiihijjjjjklmlkgfhhhgfghjkkhdgjmkkkkjjiihgggggghiiihhihhgfeefggfedeffghgdacdeggfeddccfgjhfijkkjfdhijkmnmlkjkjiihgghijmoqqssuutrpooooonnnmnnmlkjjjjjiiiiiiiihfeeeeeeedddeefghhhhhhijiiijjjigfiighjllkllmmkihghiiihhgffeddeeeeddccccccccddccbbbbbcdccb```cccbbbbbaaaaaaabbbbbaa``````a```^^]^`aabbbbbaabddccb`_^]^_`abbb`_`a`_^^____^\[Z[[[[\\]^`abaa`^\[Z[[[ZXVWWVUWXXWWXXXWWWVVVVVWYYYXXXXWWVVVXYYZ[[\\\[[ZZZ[_[Z[\]^]\\\]\\\\^]\\][]]__^^^_``_][ZYVPLPTTTSRPPQSUVX[]_``__][ZZ[\^^``_][XVVXZ[[[ZYXVTPMKKLMQPNMNPNMILPQQQPONNOOOOQRTVXXWVXXYXVVVWYY[ZYVTRPPPPSSTTTUVWXXWWYYVTTQLLMONMLLKHDBAADEFEDCCCCCCCCCDEEDEGGGEEFGHIJJJJKLKJIIIKLKJIJJHHLMMMNOPONNMLKIGFDEDEEDCCAA@????><;:863111355432347742223333457788876544333468:::865579;=>>=<=>??=9:;:987677899889:;;<==>>>=;:87767776541/.04799763235777666666544567876543222445665555666777764237888889:;<<;98789::::<=<;:99:;;<>?AAA@??==<<;;;;<=>??>=<;;;:;<=?BDEEEDDDDEFGIKLMKIIHIHHHHHHIHHGGGGGGHHIIJJKKKJIIIJJKKLLMLKJHFEFGHIHGFEEDdccefgghhgggggfghiiijjllkjfeghhhhhikmkfdhlnkkkkjjjihgggggghiiihhiihfdddeffeddeeefhfcaceghggfddcceehedhikkhdejllmnnmklmllkjihhhikmnoprrtusqpooppooonnnnmlkkkklkkkkjjjjiigfeeefffedddeefgggggghiiiijjjigggfgjklmmlmnnljiiijjjjihggffeeeeeedddccccccccccbbbccdddcbbbceeedddddcccbbbaaaaaa````aaaaabba`___abcddcccbbaaaa``^]\[ZZYZ[\\]]]]]\\[[ZYYYXXXYZ[ZZZ[[]]]]\\[ZYXYYYXVUVWVUWXXWWXXWVUUTUUUUVWWWWWWWWWWWXXYYYZZZ[\[[[[[\_\[\]^_^]\\]][[\]]\\\Z[[]]]\]^_^]\ZZYUOLPVWVUTSSTUVVWYZ\\[[[ZXWWWY[[]]\ZXVTUWYZZZYWVTQNLMMNOTRNNPQQNJNQSSSRQPPPPPPQSUVXXXVWXXWTSRTVWWVVTRQPOQRTVWXXYYZ[[ZY\\XUTRMMNPONMLJFA??AEGGEDCDEEDDEEEEFDDFIHHFGHIJKLKKKLMMLKJJLMLKIJIHHKLLLMMMLKKJHGFDBABABCBBB@?>===<;988752001356532336974323333356778887655433468:::98778:;>??>==>?><::;:98777789999:;<<==>>>>=<;:9765566541.+-157897434567877777765555678765433244457666567787777643578889:;;<=;:98899988:<;;98778:;<>@@@??>=<<;;;;;<=>???>===<;:;=?BDEEEDDDDEFHJKLLLJJIJIIHHHHHIHHGGGGHHIIJJJKKJIIJJJKKJJKLKJIIGFFHIKJHFFFEdddfghhhhgffggffghhhijkkjideghiiiijklifdinnlkkkjjjihgggggghhhhiiiigedccdefeddeeefgecdeghhhgfedcbbcbcdhjjigeilmnnnmlllmmllkihhiijllnpppstrponoppooonnnnmkjklmmlllllkkkjigffffggfeeddeefffffffghiijkkjihgffhjklmmmnoomkjjjkkkjjihhgffeeeeeeddddddddcccbbbbbccddcccddfffeeddeeddcccbbaaa````aaaaabbbba`_`acceffeedbaa````^\[ZYXWWXZZ[[ZZ[ZYXWVUTTUVWYYYYYYYYZYYXXXXXWXXXWWVUVWVVXXXWXXWWVUTSTTTTUUVVVVVVWWWXXXXXXXXY[\[[[[[\]\\]Z``_\]VZ[[Z[\\\\[YYYZZ[[\]]\\[ZYYVQNRWYYXVVVVVVVVWXWVUVUVVUUUVXXZZYXUTSTVXYYXWUSQOLLNNPQXSNORRSPLPSUTTSRQQQQQQRSTUXXXVVWWWSRRSUUUTSRQPOPQRVWYZ[\\]]][[]\XVTSONOPPONLID@@ABFHGECAEGFEFFGGGFFDGIIHHHKKLLLLLLMNNMKKKMMMKHIIHGJKKJKKJIHIHFECB@?@@@@A@@?><<;;:88765320/0356643235875433443346777888766554579:;:::989:;=???>=>?=<:9::9887789:::::;<==>??>><;;:9875565541.++.2689864456898777777665567886543334445677766778888775445789:;<<<<;98788987789::987679:;=??>>>==<<;;;;;<==>?@?>>==<;;<>ACDEEEDDDDEGIKKLKKJIJJIHHHHGHHGFFFGHHIIJJJJKJIIJIJJJJJIJJIIHGFFHJLKIGFFFeefghihhgfffggffggghijkkifcdhiiijjkjkhehlnmllkkjjjihggggghhiiijjiigedccddeeddeeefhedfgiiihhgfecbbaaacfhjhgglnnoonmlmonmmlkjiiiijkkmnnnqsqonmoooooonnonmkklnonmmmmmllljihgffgggfeedddeffffeeefghhjjjjhgfghijklmnnooomllkkklllkjiihggfeeeeeeeeeeeeddccbbbbbbccccdeffgggffefffeeedddcbaa```aaaaabbbbbba``acceffffeca```__^\[ZYYYYYZ[[[ZZZZYXWVVUUVWWYZZYXWWWWVVWWWWWWWWWWXWWWWWWXXXXYYXWVUTTTTTUUUUUTTUVWWXYYXWVVVWXZ[ZY[\\[[[\^\_^\Y[VYZYXZZZ[ZZYXXWWXY[[[ZZZZZYXUQTX[[ZYYYYYXWVTTSQQQRSSRRRTUVWWVUTSSTVXXWVURPNMLMQQSTZTOOSSUSORUVUUTSRRRRRRSSSTVWVUUVVUSRRSTTTSSRQQPQRTUWY[\^^^__\[\ZWUTSQPQQQPNLIEBCDEHHHFDDHIHGHHIIIHHEIKIIJJMMNNNNMLMNNMLKKMMMKGIIHHHIIIHGEDCCDCB@>=<====>>>><;987655444220/0356653234666543444456777888877666679:;;:;::9::=?@?>>>=<;989:988889:::;:::;<=>???>;:989985444541/,+,0479875556899888887766567887654443456677777777899897534679;<<<<;:9767887657888765579:<<<<<<===<<;;;;;<<=>?@??>>>=<;<>@BDDDDEEDDDFIKKLKJJIJJJIHGGGGGFFEFFGGHIIIIIJJIIIIIIJJIHIHHHHGFFHIKJHGFFFeefhhiihgfefggffgghijkljgbbfijjjjkkigdeknnmllkkkjjihhggfgghhhiiiihgedccdddddeddefgfegijjiihhgfdcaa`abeghhhjmnnoonmmnonmmmlkjjiiijjklmnqrpnmmnooooonoonlkklmonmnnmmlllkjhggghggfeedcdeffeddddefghijjigfefghjkklmmmnnmllkklmmllkjjiihfeedeeefffffeedccbbbbbbbbbcdefgggffffffffffffedcba``aaaaabbbbbbbbaaabcefgffecba```_^]\\[[[[[\]]\\\[ZYYYXWWWXXYZ[[ZYXWWWVWWXXWXYYYYYZZYYYYZZZZZZZZYXWUUTTUVVUTTSSTUWXYYYWVUUUUWZYXYZ[[[ZZ[_[][ZVZXYYWWXXXYYYYWVUUVWYYYYYYZZZZXUUZ\][[[\\[ZXVSQPMNOPRRRQQSTTUUTSSSSTVWVVTRONLKLOSSUV\UPPTTVUQSVWVVUTSSSSSSSSRRTTUSSTUTTTSSTTUUUSRQQRSTUVX[^__^`_]ZYXVUUUTRQQQPOMKGFFGHIJIGGHJIHHJJJJJJIJKJGKKKNNOPONNMMNNMKJKMMMJEGHGGHGFFECA?>>??><;:9:::::;<<:986554333222001356653234666544444567888889988876789:<<;<<;:::<>???>=<;:9789989999::::::::;<==>?>;86689864434541.,,/2689976668998888877765678987654434566778888778899::865579;=<<;:986567764467776545789;;;;;<===<;;;;;<<<=>??>???>==<==?BCDDEDDDCDEGIIJJJIIJJJIHGGFFFEDDDDEFHHHHHHIIHHHHHHHHHHHGGGGFEEGIKJHGFFFffgiiiihgffgggghiiijjjjhebcgjjkjkkkhdbgnnnllllkkkjiihhgffgghghhhhggedddeedddedddeeffijjkiihhhgeebbbbcefghilnonooonnommmnnmlkjjihhiiiknqqomllmnoooonnnmlklmmmnnnnmlmllkjihhghgfedcccdeeedccbbcefgiiihgfefghhiiijkkkkkkkkkllllkkkkjihfeddeeefffffeddccccbbbbbbbcdeeffeeeeeeeeeeefgfedbaaaaaabbbbbbbcbbbaabbdefedcdcbaaa`_^^]]]]]^___^^_]YZZ[[ZZZZZ[\\^^\ZZZZZ[[[Z[[[[[\]]]\[[\\]\]\\\[[ZXWVWWXWVUTTSSTUWXYYYWVVUUUWYYXYZZ[ZYYY^X[YYVYXXXWVWVVWWWVTSSTUUVVVWWXXYZ[YWVZ\\ZZZZYYYXVTQPNNPQSSSSSSSSTSRQQQQRTTTTRPNMLLMQUUWX^UPQUUXWSTWWWWVUUTSSRSSSRRRRSSTUUUVUVVVVWWWUTSSSTUVVX[^_^^^]\YWVVVWWWSQPPOONMJIIIIJJJHHILJJIKKJJKKJKLJIKLLNOQQPOONNONNKJKNMLIEFEEEEDCBA@=;::;;:9876777778898875443222222001356764334566655554568999889:::::889:;<<<==<;;:<=>>===<:986578889:::::::9999:;<==><964689965457641--/1489987668999999988766689:97765445667789998888899;;97668:<<<:99886555544456665445689::;;;<===<;;<<;<<<==>?>>???>>===?ABCCCCDDCCDFHIIHIIIJJJIGGFEEDCCCCCDDFFFGGGGHGGGFFFGGGGFFFFFFDEGHIIHFEFEfghijjihgfgggghijjjkkjigdbdhjkkjkjhfcejonmllllkkkjiihhgfffgggffggggfedeffeeeeddddefgjjkjihiihhfecbbbcdfghjlonqqnnoonmlmnmmlkkjhffghgjnqpnlklmnooooonnmlkmokjlomlklllkjihhhhgfdccccccdedcbaabcdefhhhgfedefffffghiijjjiiijkkkkkkkjiihfedeeeeeffeeedddddcccbbabbcdedddcccccdddddefgfecbaaabaabbbaaabbbba``abceddccccbaaa``__^^^^^_`__^_`^XZ[\\[[\\\]^^__^[[\\]]]\[]]]\]___^^]]]^^^^^^]]]\ZYXYZYXWVUSRSTVWXYYYWVVVVVVYYXYZZZZXWXVVZZXVXXXXWUUUTUTTTSRRRSTUUUUUVWXYZXVUYZYXXWWWWWVVSQPPPRRTUTTSSSSSRQONNOPRRRRQOMLLLMQVUW[_TQRVVYXUTVVXYVVVTRRQQSSSQRQQSUVVVWWWWWWXXWWUTTTUVVWW[]^^\\\[YWVWWYY\RPPONMMLKJJJIIIIIIJKKKJJJJJJJJJLJIKKMNPRRPPONOOONLKKMMKHDEDDCBA@@?=<9889987654555655667765433222222101355664323566556655678:::899:;;::989::;;<==<<;;<<==<<<;9987545668:;<<<<;:9889::<=>;8534789755676641.--159;:9667899999988766789::996454677888899998889:;;98768:;<<:987765554333455554456789::;<==<<;<<;;;<<===>>>>?>>>=>==?AACCCCCCCBBEGHHHGHHIJJJHGFEDCCBBBBCCDEEFFFFFFEEEEEEFEEEEEEEEEEFFHIGEDDChhijjihgfghhhhhjkkkkkjhfdegjkkjjjifddimonmllklkkjjiihhgfeeeeeeefgggfeeefffffeeccddfgjjkjjiiiihgfcccccddfgjmonmlkmoonllmmmllkjigdefggimpomkilmnoooonmllkkmnjjnomjjklkjihggghgecbbbcccdccba`aabcdfghgfedefffedcdefggggggghijjjjjjiihgfeeeeeeeeeddddddddccccbbbbcddccbbbbbbaaabcdeddcbbaabbabbbbaaabbba`_``abccbbbcccbbba``______```__a`_W[]__^^]]]^_```_]^^^_^__^^`^\_ccaa`____`aaa`___^\[[\]\YWVUSRSTVWXYYYXXXWWWWYYYYZ[ZXVVVVUWXWVVWWWVUTSRQQQQQQQQRSSSSSSSTUVVUTTUTTTTTSSSSTTSRRSTUUVWWVUTTTSQOMKKLNPPPPONNMNNOSWVV]_TQTXXZZVUVVWXUUWUOOOORRSRQPPSVVWWXYYYYYZZYYXVVVXYXXXZ\]\Z][ZYVWYY[\YJONMLKJJJIIIHHHHHHIJJJJIIIIIIIIIJJJKLOPRQPPPNOOPPNLKMLJGDCCBB@>>=<;:8777776554444433345554322212222222355665323466545566789;;:999:;<;;:99::;;<<===<;;;<;:::999864235689;<<<<;;988788:<=;853256:975577763/,,.27;;966789999998876679:::;:644558899889:::9889:;;:98789:;:98777776643334555555678899:;<==<<;<<;;:;<===>===>>>>=>==>@@BBBABBBBABEGHGFFGHIJIHGFEDBBAAAABCDDDEDDDDDDDDCDDDDDDDDDCCDEEEFGGECBBjjkjjhgffghiiijkkkkkkigeegikkkjjigccfknnmlllllkjjiiihgfedddddddefggfffffggfeedcccdegiijjiiiihgggcdddddddgjlljijmonnlklmmllkkijgddfggilmmljimnonnonmlkkjjkjhkomkiijkjihgggghgebbbbcccccbaa``abcdfgggfeeeefdcbbbcdeedddefghhhhhhhihggfeeeeeeedddddddcccccccbbbbcddcbbccbbaa``abccbbbbaaabbbbbbbaaabbba`_``abbbaabcbbbbba`_______``___`a`Y]_``__^^^^_`aa`^_``__```_b^^aedcbba``abccaabbb`_^^_^][XVUSSSTVWWXXXXYXXXXXXXYZ[[ZXVUVVTVWVUUUUUUTSRPONOPPPPPPQQRRRQPPQQQQQQPNNOPPOOOPQSSTUVWWXYYYXWVUUSPMLIIJLNNOOOOOOPPQTXWW^_URUYZ[[WVUUTQNRVSLMMMPRSSQQQSVWYYZ[\\\\\\[[ZXYZ[[ZZYZ\\[Y\\XZUXZZX[NDRNKJIHHHHGGGGFFGGHIIIHHHHHGGGGHIJJKLNNPPPOPNMNONLKJKJIFBA@@?><<;::97656666554433322223443322211223332355665433467544566789:;::99:;;;::999:;;<<==<<<<<<:987777654123579;<<==<;9877789:<:75324589865677641.,-06;<;8899::99998766679:<<<;7546589:8789:;;:9889::987779::9777787766543455555667899::;<=>>==<=<;;:;<===============>??@AA@AAAAAACEFFEEFGIIHGFEEDB@@?@@ABCCCDDCBCBBBBBCDDDDCCBBBABCDDEFEDBAAlllkihgfghiiijklllllkjgfgilmmllkifbehkmmllllllkkjjiihhgeddccccdefffffffffffeddcccdefhihihhhihghgcefeddccgkjhghjopmlkkllllkkjijgdeghhiklkkjjmnonmnlkjjjjjighlmkjhiiiihhgghgggebbbbcdcbbaa`_`abcdeffffeeeeedcbbcdeedcccdeffffffgghggfffeeeeddccccddcbbbbccccbbcddddccdddca`_``abbaaaaaaabbbbbbbbaabccba````aaaa`aabbbbba`````________``a[_```____^^_aaa`_`a`^^`__^a^`efedbbbaabddcbbddca_`aba^ZWVUTSTUVWWWWWXXXWXXWWWXZ\\ZXWWYXUVWVUUUTSSSSRPONPRRRQQPPPQQPONNNMMNNNLJJKMMLLLNPSTVVXYYZZZZYXXWUSPMJGGIKMMMNOPPQRRTUYWX\^WTVZ[\\XVTSPKHNROJKJMPRTTRRRSVXZ\]]]^_^^_]]\Z\]^^\[\\]]\[\\WYSVXVSRGEPLHFEEFFFFFEFFEEEFGGGGFFFEEEEEFGGHHIJLMNMMNMKKKKIGFHHFC@>==<;:9999976555655433222222112333221112234444556775445774335666789:;::999::::9999:;;;<<;;<<;;9876665554212468:;<===<98766788:9653334588766777641.-/5:<<:999::99986566789:<==<8656579:9889:<<:8778999878889887667877776656777766789:::;<=>>>===>=<;::;<=======<<<=====>??@@???@@@@BCDEEEEFGHGFEDDDA@>>??@ABBBCCBBAA@AAABCCDCBBAAA@ABCCDEDCBA@mmmkigffghijjklmmmmlkjhijlnmnnmkgdafjkllllmmllkkkjjjiihfedccccddeffffffffffeddccdeefggghhhhhhhiedfffedccfigefghijkjjkkkkkkjjjkgdghhhhjjjjijlnnmmljihiiiiheillkihgghggggghgggecbbcdedcba``_`abcdeffffeeeefdbabcdedcbbcddeffffeffgfffffeeedccbbccccbbbabcddcbcdeeeeddeeedb````aaaa`aaaaaabaaaaaaabbcccbaaa``aaaaaabbbbba__`a``_____^^^``_`a`````_^__aaa`_`a_]]`_]^`_affdcbbbbbcdddccdeda`bbc`]ZWVVUTTUVWWWWWWWWWWWWVWXYZZYXWYZXVWWVUUUTSSSSSQQRSUTTSRQPPPPPNMMMKLMNNLIIKMMLLLNPSUWXYZZZ[[ZZXWVTROLIFGHJLLLMOQRSTTTUYWXZ^YTWZ\\[XTSRNGGLOMHJJMQSTTSSSTVX[\]^___``___]\]^_`\[^]]\][\[RURQQNKGDEJIFDCDEFGFFFFFEDDEFGGFFEDDDDDDDEEEEFHJLKKJJJHFEEDCDBBB@>=<;:9888888765455554210/02321001223211123455556678864457742346656789:::9889999988889::;;::::;:87655555654234679;;==<;98666667876433234687678887420..27:<:::;::999865567898:==<866656799889;<<:8667888889998776566788787778888766789:::;<>???>>?>=<;:9:;<=======<<==<==>????>>??@@?@ACDDDEEFGGEDCCC@?==>>@@AAABCBBA@@@@ABCCDCBBA@@@@ABBCDCCBA@mmlkigffgijkklmmnnmlkjijlnoonnmkfbchkkkllmmmllkkkkjjjihgfedcccddeeffffffffeeeddcdeeeeefghhgghggdeghhfedddfaagfghhihijkjjkkkkjjgfiihhhihhhhjlmmmljhgghhhhffjkjjhggfffgghiihhgedcdeefedcba`_`abcceffffeefffecbbdeedcbccddefffeeeeeffffeeeddcbbbbbccbaaabcddccddefffefggfecaaabbbbaaa`aaa````````abcccccbbbaaaabbbcbbbbba_``aa`____^^^_``aaaaaa```__`a``___`_]Z^^\]^_bffdbaaaabcddcbbccb``bbb`]ZXWWVTTUVWWVUVVVVVVVUUUVWXXXWX[[ZXYYWWVUTTTTUUTTVWXWVUTRQQQPONMMMLMPPPMJKNPOOMMNPSVWXYYZZ[ZZYXVUSQNKIGHIJLMMNORTTUUUUYWWZ_ZVWZ\ZYXSRQLFHILKIJJNRTUUTTTUVXZ[]_````````_^``a`]Xa^^Z]XZWNOLJHFCCEFFFDCCEFGHHHGGFEDCDDEFFEDCCCCCCCCCBCDEGIHGFFFDBA@???>>>=<;:998777777655444443210/023220001232212345666567888754566312455556789::98777888877788999988899766544556654446789:;;::87655566654433333577678888641/.159;::::::9998645679668;<<:7666679999:<=<:8656788899:9765556778988878999888789:;;;;<>?@@@@@?>=<:99:;=========<====>?>??>=>???>??@BCCDEFGFECAAA@>==>>@@A@@ABBAA????@ABCDDCAAAAAAAAABCBBA@?mlkjigffgijkklmmnnnmljkmoooopokhedgklkkllnnmlkklkkkkjiigfeddddeeeeeeeffffeeeeeddedddddefggfggfedfhihgfdea^`egfggghhiijjjkkkkkigilihhhhgffghjllljhgffgggffgiigihggggghhiijiigfddeffgfedcba`aabccdeefffffggfdccdeedccdeeeeeeeedddeeffeeeddcbaaabbccba`abcddccddeggfffgffecaabccccbbaaaaa``_____`abccccccbbbbbbcccdcccbba``abaa`__^^^^_`aabbbaaaaa`````____`_]X\^]]^`bdeca```aabbba```__^^_``^[ZYYXWVVVWWWVUUUUUUVUUTTUUVVVVXZZYX\[ZYXWUUUVWWWWYZZYXVTSRRRPOMMNNMPSSRNLNQSRRPNOQTUVWXXXXXXXWVUSROLKIHIKLMNNOPSTUUUUUYWVZaYVWX[XWVRQOKEFGJKJJLOSTVUUUUVXXYZ\^_````_`___`aba[Z`\ZZZSSQLIHFDBBBEGFFDDDGHJJJIIHFECBBCDEEDCCBBBBBAAAAABDDFECBBA@>=<;;;;;;;::9876666676555433333210//234321001222223457776678887544553123554455789;:9766777766667778867777776654567877646778999987654445555443222357788899976421147999::9:99886445797569;<:8666778899:<=<:865678889:::743456788988889:;;::989::;;;;<>?@@AAA@?><;99:;=>>>?>>=======>?>>>===????==>@BBDDFFFEB@?@>>==>>@@AA@AAAAA??>>@@BCEDDBAAAAAAAAABAAA@?llkjigfggijkklmmnnnmlklnpqppoligeglmlkkmmonlkkllllllkjihgfeeeeefffffffeeeeeeeedddddccdeeffffeecdgiihffed`Zdjefggghhiiijkklllliikljhhhhgeefghjkjhfeefgfeeffhhghhhhhhhhijijjjhgeefgghhfedcbbbbbbccdefgggghhgdccefedddeffffffeedccdeeeeeddccbaaabcccbaaabccdccddefffeefeedcbbcdddcbbbaaaa``_____`aacccbccbbccdeeffffeeddcbbbccb`^^^___`abbbbbbbbbba`__^^^^___]X[]_^^_acb`_____``_^]]\]\\\\]]][ZZZZYXWWWXXWVVVVVVVWVTSTTUVVUUVXYXZ^^]\[YWVVVWVWZZ]]ZXVSRQPSPMNPPOOSWVSONPTVUTQOPRUTTTUUUUUUTTSRQOMKJIIKMLOPPPQSUUUUUVYVSZcXTUUYTTRQNMJDEFIKLLMPRSUUUTVWXXXYZ\]]^^^^^]^^^__]XX]YVXVOMMHGGFECADGHHGGHHJKLMKJIHFECBAABCDCCBBBBBBBBAAA@ABCCA@??><<;::99999988765555665554333333210//2344210/1232334568887678888754443123554444579;;:8655665555555666655566666556679887566777778766554445554432223567898999987533467789:9:99876445677657:;:8767777889:;<<;976567899:::74345678998789:;<<;;:99:;<====>?@@ABBA@?><;:;<=>>>?>>=======>?>>=<<<>???><<=?ACDEFGEB@?>>===>?@@@@@ABBBA??>>?ABCEEDCBBBBBBBAAAABA@@lkjjigfghikkllmmmnnmlmnpqrrpmjgeejnmlkkmnonlklllllllkjihgfffffffggggfeeeeeeeedddddcccddeeeeeddcdghhgfeeeabeggghhhiiiijklmmmmlllljiiiihfddefhiiihfdeffeddeeghghgghiiiiiijjijhhgfghihhgfeddcccbbbdefghhhhhhgeccdfedefhiiihhgfedcddeeeddddccbaabccccbbabccccccddddeeeedddcbbbcdddcbbbaaa```_^^_`a`accbcddbbdfffghhhgggfeedccddb`^___``abcbbbbbbbba``_^^^^^_^^\XZ]^]^_`aa_]^_^_^]]\[Z[\[ZZ[[[ZYYYYYYXWWXXYXWVVVXWWXVTSSTUVVUUVXXY[^^]\[ZWVUUUTW[Z\\YWTRPPPSOMORQNQVYWTONRUWWUROQRUSRSTTTTRRQQQONNLKIHILNKORQPRTVVUUVVXVRZcXSRSURQPOMKIEEFIJKLMOQQSUTTUWXWWXYZ\\]]]]\\\\\\]ZVUWWUSOMLKFEHGEC@FHJIIHIKLNNNMKJHFECAAABCCCBBBBBBBBBBAA@@@@A@>==<;:988999988887654455555443333332220/024542100122345678997667888765432112344443468:;:86445544444445565555566666544679:986556555666654334455443212346878999::987544577899:9888654445766679987777777899:;<<;9866667789:975445678998778:<==<<;::;<<==>>>?@ABCCBA@?=<;;;<=>?@?>=<<<<<<=>?><<<<=?@@><:;>ABDEEFEB@>====>>??@@@?@BCCB@??>?@CDEEECBBBBCCBBBBBBBA@kkjjigfghjkkllmmnnnnoopqstrokifehmonmlmnnnmlllllllllkjiihgggggfgggggfedddeeeeeeeddcccccddeeedccegggggfgfdeghhhiiijjjjkllmnmmmlmmkiiiihfeeefghhihfefffedddefghgggiijiiiijkjjiihhhiihhggffeeddcbbceghiiiiihgeccegeegiijjiihggfeeeeeedddddccbabcccccbbbcccccccccccddddccbbbbcdddcbbbbaa``___^_``aabbbbdedbcegghikkkjiihggeeeffc`_```aaccccbbbbbba`__^^]]^^^^]\Z[^]\^_``_]\^^\]][ZYYYZZZZYZYYXXXXYYYXWWXXYXXXWWZYXZWUSSUVWVUUVWXZ[]]]\[YVUSRSQTYWZZVTROMMPULKPTPNRY[WSOOSWYWUQOQQSRQQQQRQPONNMLKKJIIHIMPJPSQQSUVVVUVWXUQYbVQOOQNMKMKIGFFGIJKKLNOOQTQRTVVVVVXXYYZZZZZYZZYYXWTRRSROKJKIEEIJHD>GJLLLLLMNOONLKIGEDCA@@ABCBBAAAABBBBBA@???>>>=<;;:98778888777766555445544433333333320/023432101222345788876667877654310012333334569;:86444333333444555544566666655579:98755655556665433344445542123588899:;;:98766666689:988765445566677888777778899::;;<;;:987767789987655568987667:<>>==<;:;<=>???>>?@ACCCBA@?><;;<=>>??>><<<;<==??>=<<;=?AA?<:9<<==>>?@@@@@ACDDCA@@??@CDDEEECCCCCDCCCCCCCCCljjjjhghijkklmmmnnnnopqrssqokhegkmonmnoonmmlmmmmmmmmkjjiihhhhhggggggfedddeffffeeddccccdddddddcdeeffffggfffhjjijjjjjkkklllmmmmmmljjiiihgfefghhhhhfeggffeddefgggfgjkkjjijllkkkjiiiiihhhggggfeedcbcegijkjjiihfddghffijkkkjiihgfffffeedeeeedcbabcddccbbcdddccccccccccbbbbbcccccdcbbbabaa`___^^_``a`aaabedbbefghijlmlkjjjihgggggda`aabcccccbbaaaaa`__^]]]^^^^]]\\]^]]____^]\^^[\\ZYZZZ[\\[YXWWWWVWXYXXWWWWXYXXXX[YZ[XUTTVXXWVUVWXYZ[[[ZYWTSQOROOSRVVSQOLLMSVIMSUPOTZ[VROPUXYWSPNOPQQQPQQPONMLLKJJJIHHHJNPKQTRRTUVVVTUUVSPW\TOLLNLJIKIHHHHHIJJKKMLMORMOQSTTTUVWWWXXXXXWWWVUTSQPOPOMIHJHDEJKJE?ILMNMMMNNOOMKIHFDCBA@?@ABA@@??@@AAAA@?>==<<<<;::987666776666665555555444433333333320//134421101123446788776667776543100123332234568:97533332233344555555555566655568998776655556665433344455553112478899:;;;:988776667999887654566666777778777899::;;;<<<<;;99877777777655568987667:=??>>>=<<=>?@@@@@?@ABCCCBA@?>=<<<=>??>>=<;<===???==<;=?AB@=:9;?BEEEEEEB?=<<=>?@AA@@@ACEFECA@@@ABDEEEEDCDDDEEDDCCCCCDkjjkkihiikklmmmmmmmmopqrrqonmhdilnnmnoqpnnmmnnnnmmmmlkjjjjiiihhhhggfffeddegggffedddccddddddddccddeeffggffgikkkkkkkkllllkkkkllmlkjiiiihhfgghiihhhffgffedddefggfefikjjjijlkklmkjkjjjiiiiihhgffedcdfhjkkjjiihfeehiffjllllkjjihggggffeeeeeedcbbcdddccbcdddcbbccccccbbbaabbcdccccbbaaaaaa```__^_````aa`adcaadfghjkmmllkkkjihghhgebabbccccccba``````__^^^^_____^^^__^^```__^^`_\\\[[\\]]^^]ZXWVUUUVWWXXWWWWXYXYWWZZ[\ZWUVWYYXWVUVWXYZYYWVUSRPOROMQPUVSPNKLNSSJNUVRRVYYUQPSVXXVQNLMNPPPOOPONLKJJIIIHHHIJLNPMQTSRTUUVUSRQRNORVPLJJLJHHJIHHIIIJJJJKLLLMNJLNOPQRSUUUUVVVVVUUUTSQPNNMMMKGGHHDEKLKF@JMNONNNONNMLJHFDCBBA@??@A@?>==>?@@??>><<;;:::9888766655555555555665544444333344333220/123432101223445677765555665543100123333344457998644322223344556666665566766668889898665455544433444445664312467899:;;;;9999:866688877765457777777777788899:;;<<<<<<<===<;:9876667776678988778:=??@AA@?>>?@@@@@@@@ABCCCCBA@??>=<==?@??>>===>>??@?>=<=?BCA>:8:>BEEEEFFDA><<=>@AAAAA@ACEFFDB@@ABCDEFFEDDDEFFFEDDDDDDDjjklljijjkklmmmmmmmmnoqqpponlfeknmmmoqqponnnnnnnmmmmllkkkkjjiiihhggfffeddfgggffedddcdeedddddcccdddeefffffgijkkkkklmmlkjjjjjkkjihhiiiihgghhiiihhhfffeeedddefggfdehjiiiiikjlnnlllkkjijjjjjihggfeddfhjkkjjiihfeeghfgklmmmmlkjihhhggfffeeeedcccdddddcddeecbbbbcccccbbbaabbcccbbbaa``aaaaaaa``__````a`abbbabbdfhjlnnmllkkjihggffdcbbccccccba``````________```aaaaaaaaaaaa```a`\\]^`aa````_\YWUTUUVWWXWWWWVXYYYVVYZ[\ZXVWXYYXWVUVWXXXXWUSSTSSQOOQSVXWVTPMMNSQMQXXUVWZYUQQTVXWTPLKLMNNNMMNNMKJJIIIIHHIJJLOPORSRSTUUTSQOOLLMMPNKIJKJIHIIIIIJJKJJJJKKLLIHIKLMNOQRSSSSTTTTSSSRPONLLKKKIFEFFDEIJLEAJMNNOONNMMLKIGECBAA@@?>???>=<<<=>>>==<;;:99988777655544444444456776554444333344433332012232111233344456765444455554321012333445444589865443223333445666776666778888766889766544444433344555678632235789889::::::::97656777776656899888877788999:;<<=====<<==>>=<:876667776778998789;=?@ABBBA@?@@AAAAAA@AABCCCBBA@??>==<=>??>>>>>>??@@??><=?BCA?<::>BDDEFFGEB?<<>>@ABBAA@@BEGGFCA@ACDEEFFFEEEGGHHGFDDDDDDijkmljjkkklmmmmlllllmnooooomjfimmlmnpqrqqpooooonmmnnmmlklkkjjjiiigffggfddfgggffeeeddeeeeddccccccccddeeeefghijkkklmmmlkiiihiijihhhiiiihgghiijiiihfffcefeddfghhfddhjihhhijklnmlmllkjjkkkkkkjihgfeefgijjjjjiigfghhgilmmoonmlkjihhggfffffffedcdeeeeedeeedcbbbccccccbbaa`abcccbbaa`_``aaabbbaa`aaa```aba```aacegjkmmlkkjihgffeedcbabcccbbbaa```_____``````aaabbbbbbbcbbbbbbba`^^`acccbbbba^YWUUVVWXWWWWWWWXXZZUTWXZ[ZYXXXYYXWVUVWWWWWVTTTUUUSQQSUXYXWVTQOQUPPU[ZYYZ[YURSUVWURMJJKLMMMLMMLKJIIIIIIHIIJLNOPQRSSSTSSRQOMKHHIKMLJJKLKJIJJKKKKKKKKJJJLLKFHHIJKLMNOPPPPPQQQQQONMLLKIHHGECCDDCDFGHECJLMNNNMLLKJIGECBA@@@?>>>>>=<;;;;<<<<;:99988887766544333333333456777655444333334443342111232211233334445654322344544332112344444433468875544333433345667777667778888766788765444333333445556688754345788778899:::;;<87456666666579::9999888999::;<========<=>??>=;9866789999899:989:;=?@ABDDCBAAABBBCCBAAAABCBBBBAAA@?>=>>?????>>??@@A@?>=>@BBA?<::=@CDDFGHGD@=<=?ABCCBA@@CEHIGDA@BDEFFFGGFFGHIJJIHFDDDDEjjklkkllllmnnmllkkkkklmnnnmjhimnlkmpqqqrqpppponmmnnnmmllkkkkkjjjigffggeddfhhgffeeeeefffeedcccccccccddddeffghiijjllmlkjhhhhiiihhgghiiihgghiiihiihffecfffeeghiifddhihggfgjllmllmmlkjkllllllkjhggffghijjjjkjigghihhkmnnpponmlkihggffffffffedeffffeeeffecbbccccccccbaa``abcccbbaa`_``abbccccbcccbbaaaaa`__`abdfhjkkkjihgfedccccbbabcccbbbaa```______`````aaabbbbbbccbcbbbbbaa__abddcbcdca]ZWWWXYYYYXXXXXXYY[ZUSUWYZZYXXYYYXWWVVWXWWVUUUVVWWVTTUWYYYXXWVSTVRSW\\[[\\YVTTUUUROLJJKKLLLLMMLKJIIIIIIIIJKLNOPQQRRRRRQPOMJHEIJKLLKKLMLLKKLMMLMLLLMLLLLLKFGGHIJKLMMLLLLLLMMMLKJIHHGGEECBABBBABBBDEDHJLLLLKJIHHGECA@????>>>==<<;::::9:;::9888777766654332222222223567776654443333344333332223321112333333345443212334443321233444554434699865543334433456778877678878887666665654444433444455567887654568877556789:;;<=:855555666568:;;;;;:9999::;;<<=>>>>?>=<=>@@?><:877899:::9:::::;<=>?@ABDDCCCCCBCCCCCBAAAABBBBBAAAA@?>>>???>?>>?@@AA@@?=>@ABA?=;<>@CCDEGIHD@==>?BCCDBBA@BFJJHFBABDFFFGHHHHIJKLLKIGEEEEEjjkkjkmmmllmmlkkjjjiijklmlkihjllkknprrrrqpppoonmmnnmllllkkkkkjjjhgghgfddfghhhgffffffffffedcbbcddccccccddeeffghijklljiihghhiiihgfgghihhgghhggggigfedcefeefggihfddhhgffegiklkjkmlkklmmmnnnmlkihgghhhijjjkkkjihijijlnooqqponljigfefeeeeffedddeffeeeeedbaabcddddcccbaa`aabccccbba```abccdddddeeedcccbbaa___`abcdfggfgfedcbbbbbbbbbccccccbba```_________```aaabbbbbbcbba`````_^_`abbaabcb_\YXXZ[\\[[ZZZZZZ[[[ZVUVWXZYYYYYYYYXYXXYZYWWVVWYYYXVVWWYYYYZYYXVWXTTW\[[[\\YVTSSRQOMLKKLLLLLMNOMLKJJJJJKKJJKLLNNNOOPPPOONNLIHGJKKMMMLMONONMOQONPNMNONMMMMLHHIJIJKLLKJIGGHHHHHHFEEDDCCBBAA@AAAAA@=ADDFGIIIHHGFEEDBA?>==>>===<<;::999989999888776665454433222222222356788765444444444433333334432101233333334444321123344333233344455443359:8665433344434567889876789888887655434445654454445556778776656788754455689:;==<:76555666668:<=<<<<;;;;;<<<<=>>>>??>=<=>@AA?=;98789:;;;;;;;<<=>?@@@ABDDEEDDDCCCDDCCBAAAAAAABBAAAA@???>??>?>?@ABBBAA@?>@ABA@=<=?ADDEFGJIEA>>?@BCDDCB@@BGKMJFCBCDFFFGHIIJJLLMNMJHGFFFFjjkjjknmlllllkjjiiihhhijkkjihjllkkmopqqqqppoonmmmmmmllllkkkkkkjiggghgedfgiiihhggggggffffedccbcdccbccccdddeefgghjklkjihghhihiihggggghgggggffeefggedcbeeddffghgfdehhgfffgikkjikkjilmnoonnnmlmmkhhhhiijjkkkkkjijjjknoopqqqpnljgedddddddeedddddeedddedca`abcdddccccba``aaabbbbba```abccddddeeffgfedcccbaa`````acddddgfa``aaaaabcccccddcccbba``____^^^___````______````_____^]]]^^^^^^_``]ZXXY[\]]\\\[ZZZ[\\\[VVWXXYZYZZZZZZYYZZ[ZYXWWWXYYZXWWYYYYXYXXYYXYWSUWYYYZ[[XUSSQPLLLLLLMMMLMNPPNMLKKJJJKKKKKKLMMMNNONNMMMLKIGHJLLNNNOPPQPPOQSPNRPNNPONNNNLHJJJJKLMLKIGEDDDDDDCBAAAABBBBA@@@AABA@ABDDDDEFFEDCCBBA@?====>====<<:9988888999887777666544443332222212235678876554444333433333234554210123333333444442101233444334443445554214897665433344544445789877788877888765433445665555555667787666657788653234578::<==<:87666667679<==<====<<===>>>>>??@@>=<<>?@A@><:989:;<<<<;<<<=>?@@A@ABDEFFEEEDCCDDDCCBAAAAAAABAAAAA@???>>>>??@ABCCBAA??@@AA@?=>ABDDEGIKJHC@?@ACDEDCA??CGLMKGDCDDFFGHIIJJKLMNNMKIGGFFFjjjijlnmlkkkkkjjiihhghiiiihijkkjjkmnnoqqponnmmmmmmmllllklkkkkkjihgggfefghiiiihhhhhgggfffedccccccccccddddddeegghijkjihhhiiiiihgfffffgffffedccddeedcbbcdcceefggfeehihgggghjjihjihikmnnoooonmonkhijjjijjkklllkjkkklmnpppppomkifcbbbcbbcddcccccccccccba``abbccccbbbbaaabbbbbbba````acccddeeefghhhfedddccbba`__`aaaaacb__`aaabbcddeeeddddccba``__^^^^^^^^____^^^^^^^^^^]\\\\[ZZ[[[[[[\]]][YXYY\^^^^^]\[[[\]]\[YXYYYZ[Z[[[[[[Z[[\\[ZYXXYYZYYXXYZ[ZYYYWWYZYYVTUUVUWWYXVTRQPNJILMNOONMLNPRSQPNMLLLLMLLKKKKKKJKKKLLLKKKJHHKJLMOOOPQQSSSQSUSPUSPPRSQQPNMJLLLKLMMMKIFCBBBBAAA@@@@@ABCCBBBBBBCBBBCDDCCCDDBA@@@??>=<<<<==<==<<:998888788887776655543333333322212233467898655544333333334433345421001233333344444210012345444444444445310389876543224465433468987789876677887654445566666666666677766566678865312467799:<==;:8777778879;===>??>==>????????@@@>==<=?@A@><;:9:;<<<<<<<=>>?@ABBBBCDEFGGFFFEDDDDDCCBBAA@@@AAAAAA@@@@?>>?@AABCCCCCBAA@ABA@??ACEEFFGIKKHC@@ABCDEDCA@@CHNOLHEDEEGGFHJJKLLMNOPOMKHGGGGjjkjjlonljijjjiiihhhghhihghjklkjjjklmopqonmmlllmmmmlllkkkkkkkjjihgfffghiiihiiiiiiihggggfedcccccbcddddddddddegghijjihghiiiihgffeeeeeefeedcbbbbcddccaaccbbdeffffefhhhhhhghiihhihhikmmmnnnnnoomjiklkjjkklmmmmllllklnopqqqomljgebaaaaabcddcbaaaaaaabba``abbbcccbbbaaaabbbabbba`__``abcccccefhiiihgffeeddccb`_`aaaa`_`_]_`aabccdeffffeeeedcba``__^^^^^^^^^^^^]]]]]]]\\[[ZZZZYYYYYXXXXY[ZZYXXYZ\^_^^^^]]\]]^^]\ZYYZ[[[[[[[\\\[\\\\[ZYXXXYXWXYYZ[\[[ZZYYZYXXUUUUTSTTVUTRRRPNJJNOQQPPONOQSTSRPOMMLLMNMLLKJJJIJJJKKJJJJIIGLKLNPPPQRRTTURTUVSUUSRTTSSQPNLNNMMMNNMLIEBAAAA@@@???@ABCDEDCCCCCDCCCDDDCBBBB@>>>>>>=<;;<<<;:;<<;:98877788777766555543333333333222223335788765454433333333444434543110123333333444431001234555553455443420048987554221457653246898779:975567788765555566666677766677766566678865301487778:<=>=;:988888889;<=>?AA@>>@AAAAA@@@@@@?>=<=>@@@?=<:9:;<<=====>>??@ABBBBCDEFHHGGGFEEEEEDCBBBA@?>@AABBA@@@A@???@ABBCCCDDDCBBBAA@@@BDEFFFGIKKIDAABCDDDDCA@ADIOPNHEEFGHHGGIKMMNOPQQPNLJHGGGijkjilnkjghiiiihhghhghhhghijkjiijjjlmoppnmmllllmmmmllkkkkkjjjjihhggfgijkjihijjjjjjihhhfeddcbbbbbcdddcdcccccegghiiihhhhiiihgfeddccddddddcbaaaabbccbaabbaacdfeefffghhiiiihhhhhhghijkkkllmmnoolijklkjjkllmmmnnnmmllnopqqomljhfcbaaaaabcddcba``````aa```abbbbbbbaaaaabbcbaabaa`__`abbbbbbceghijjihgffffedcba`abbbaa``^]`abcddeffgggfffffedcba`__^]]]]]]]]]]]]^^]]]]\[ZZYYYXXXYYXWVVWXYXXXXWXY[\]]\\\\]]\]^^]\ZYZ[[ZZZZZZ[[[[[[[[ZYWWUVXVTVXYY[]]\[[Z[\ZXVUWVVSRRSSRQQRSROLMPRSSRQQPOPRSSRRPOMLMNONMLKKJIIJJJJJIIIIIHFMLLNPPQQRRTUVSTUVTUVTSUUSRRQOOPOMMMNNMLIEA@@@@A@@@@ABBCDEFEDCCCDDDCCDDCCBAA@?=<<<==<;;;;;:989:;:99887767777776655444333333333333333333467874455532234443343443455421112333333333443210023445665444443342//38976543222568753246898779:975556788887655566777777766677777666667976411276778:<=?>=<;::9999::;=>>@BBB@?BCBBBBBAAAAA@>=<<=>?@?><;:;;<=>>>>>>??@ABBBBCDDEFHHHHGGFEEEEEDCBBA@>=>?@BBAA@AAAA@@@ABCCCDEEDCBBBB@@@@CDFFFGGIJKIEAABCDEDDCAABEJOPOJFFGHIHGHIKMNOPQRRRPNKJHHHijkjjmmihfhhiihhggghhghhhijjjiihiiklnoomllllkklmmmmllkkkjjjjiiihhhghiklkjiijjkkkkkjiihfedcbbbbabcceedcccccdeggiiiihhhhhhhgfedccbccdddccba``aaabcbbaabaaabdeddeffghijjjiiihgggghiijkkkkllmnmkkllkkkjklmnnnnnonmllnoooomkjhgeba`abbbcdddca`__````````aabbccccbbbaabcccbbbbba`_`aabaaa``adfhiiihhggggffecbaabccbbba`]]``bddeefggggggggfedcba``_^^^^]]]]]]]\\]]\\\\[ZZZYYXXXYZZZXWWXXWWWXXWXYZ[\[[[[[[[[\]]\YWWXYYYYYYYYZZZYYYZYXWVVTVVURTWWY\]^^\[[[\ZYVVVUUSSRRQQQRSSSQNOSUUUTRQONNPQRRRQNLKLNOONLKJJJKKKKJJIHHHHGGMMMNNOQQRQTUWSUTVUTUUUTTSRRQQPPPNMMMNMLIEA@@@@A@@@ABCDDEFFEEDCCDDDCCCDCBAA@?=<;;;<<<;;;;:98889::99887667777766554433332233333333333233345553234532245543343344556532112333333333443210012345665445554332..38976553223578753246898779;:75556789998766667777777766677886654456887410256789:<>@??><;::::;:<<>??ACCCAACDCCCCCBAABBA?>=<<=??@>=<;;<=>???????@@ABCCBCDDEFGHHHHGFEDDDDDCCBB@><=?@BBBBABBBAAABCDDDDEDDDCCCCB@?@BEEFGGGHIJJIFBABDEEEDDBBDHKPPOLHGHHIHGGIKNPQRSSSSQOLJIIIijkjjnmgffghhhggffgghhhhiijjiihggiklnonlllllkkkllllmlkjjjjkjjihhhhijkllkjjijkkllkkkjihfedcbbaaabcceeeddddeefghhiihhhhhhhggedcbbbbbccccbaa``aaabcbaaaaa``bcdddeefghijkkjjiihhgghiiijjjjjkmmmkjkkkkkkllmnooooonmlmooonmkjhgfdba`abccddddca`__```````aaabcccccbbaabbccdcbcccba``aaa`_^^^`ceghiihhhhhhhgfdbbcccccccb`^^``bdeefggggggggffedcbaa`____^^\\\\\\\]]]]]\\\[ZZZZYYXYZZZXWVWWWVWXWWWXYYYYYYYYYYY[[[ZXWWXXYXVWWWXXXXWVVVUUSSSRUURPRUUW\]_^][[\\ZYXWVUTTTSSRRSSUUUSPRVVVUTRPONMNNOPQPNLKLOOPNLKJJKMNNLKJIIIIIHILOMMMNQRRPRTVSTSSRRSUVUTRPPPQRQPMLKLMMKHDA@?@@@AAABBBCDEFFEEDCCCDCBBBBAA@?>=<::::;;;;:::9888789988877665677765554322222223322222343333334553235653234433343333467654323443333333444321012345554444555442-.2897655433477886434679988:;97655678:::987777788877776667788775556788864013578:;=?AA@@>=<;;<<<=>?@ABDDCAACEDDDCCBBBCDCA?=<;<=??>=<<<=>?@AA@@@AAAABCCCCDDEFGHIIHGFFEDDDDDCCB@?<=?ACCBBBCCCCBCDEEEEEEDDDCCCCBBABBEGGHHHIJJJIFDBCEFFFEDCCEJMQQOMJJJJJIGGJKOQRRSSTTRPMLJJJijjiiliecefggffffffghhhiijjihhgggikmnomlklllkkkkklmmlkjjjkkjjjiiijklmllkkjjkklllllkkihgedcbbaaabccdeeeeeeffghhhihhhhhhgggfdcbabbbbcccccbbaaaaabbbaaaa```acdcccdefgijjjjjiiiihhhiiiiiiiiiklljjkkkkklmmmmnoooonmlmoonlkjhgfecbaabbddeeeeca```aaaaa`aaaabccdddcbaabcddedcdddcbbbbaa`_^^^`cdfghhhhiiihhgeccddddddddca_a`adddeefffffggffeedccbaaaa``__][[\\\\\]]]]\]\\[[[[ZZZZZZZXWVWWWWVWWWWWXXXXXXXWXYYZZYXWVVWXWVUUUUVWVVUTTTSRRRRSVTQPRRQRY]^_^\[[[ZYWWVVUUUTTTTTUVWWVSTWVVTRQONMLLMNOPOMMLMPPQOMLJJLNOONMLKKKKKJKMQNMLNRRROPRTRRRPNOPSUTSPMMMPQPNKJIJKKKHD@???@@AAABBBBCDEDEEDCCBCBA@@@??>=<<:999:::::9998766667788776556677655543222222222222222344333334543335664224433344333456655433444333333444432101234444334456542.-1786655433479997545779:99:;98656689:;;:98888899887667777788876666789986202479;<>@BAAA?>>=<=>>?@ABBCEECAACEEEEDCBBCDEDB@=<;:<>>>=<<=>?@ABBAAAAAABCBBCCCCDEFGHHHGFFEEDDDDDCC@?=??@@@AAAAAABBCBBCCAA@A@>>==<<;;;:999999:999877555445677765555556655543222222222222222343333334444434665313433454433456665444554333223344442111123344444456663/-057565644458:;:8655689:::;;98777789::;;:9889999887667788888877777899;:951247:;=?ABBBBBA?=<=>?ABCCCDEEDBBDFFFEDCBBCDEEB@><;:;=>>=<<=>?@ACBAABBBBCCBBBCDDDEFFFFFGFFEEDDDDDDC?>==@BDEEEDDEEEEFGHHHHGGFFEEEEEDDCDFIJJJJKLMLKIGFEFGHHGFEFFHMPSRQOMMNNMKIHJKPRTTUUVVTRONLLLhhfefeaccbbceedeefgghiiijjihggfgiklmmmllkkkkkjjklmmlllllllllllllmnnnmmmllllllllllllkihfeedcbbbccccbcdefggghhhhhgggffffffgfeccbcbccccddddcba`aabbbbaa```aabbbaabbcdefggghhiiiiiiiiijiihhhhhhiiiijjjjjkkklllmmllkklljihfeedba``abcefggfdcaa`abcccba``__abbcdba```accdeeefggffeeeda``aa`accddefgghihhgeccdeefedddddbababccccbbbcccdeeeddcccccdcccbba`^]\]]\\\\]]]]]^]]]]\\\\[[[ZXXYYYYYYYXYXXXXYYZYZZZ[[ZYXWVWXXXXXWWWWWVVVUUTSRRSTUWVUUSQQRX\]_^ZYZZYZYXYWWVVUUUVWWXXWVTTUTSRQPOOPOOOOPPOONNNOPPNMMKLNMOPPPPPOOPOONRTPMKQUTRMNNQPONLHFHLOQONJIJMNLKGFGHHHIKE?=>??@@AAAAAAAAA@ABA@???><;;;;;::::988888988876654323455665555545555554332222222222222233333333444444456531233344433446766554555543222223333211112333454445665310134556655558;;:965469:;;<<;:9988889::<<;:99:998988766778888888889:;;;;:612379=?ABCCDCBA@><=>@ACDDDEEEDCCEFFFEDCBBBDEEC@>;9:;<>>>=<=?@@ACCBBBBBCCCBABCCDDDDEEEEEDDDDDDDDDDC@?<=@DGGGEEEEFFFHHIJIIIHHHGFFEEEEDEGJKKJKLMMMKIGFFGGIIHHGGHJOPTSQPNNOPOLJHJKPSUUVWWWVSPOMMMggfdecbbbabcddddeeghiijiiiihgggikmnmmllkkkkkjjkllmmlllmmmllkklmnooonmmllllllmmmmmmlkigfedddcbccddcbcdegghhhhhhggggffffffggecccccccdeedddcbaaabbbbbaaa``aaaabaaabbcdeffffhhhiiiiiiiiihhhggggghhhiihiihhhhijkkkkjjjjhfedddba``abcdfgggfdba`abcddcba`___`abcca`__`abccdefghhhggggecbbddccccccddeefgffedccdeeeedcdddcbbbccccbaaabbbcddddcccddeeeeddccb`^]]]]]]]^^^^__^^^]]]]\\\\[ZYZZZZZZ[ZYYYYYZ[[[\]^^]\[ZYXXYZZZZZYXXXXXXWWVUTTUVVWWWWURRSX[[_]YXYZZ[YXYXWWWWVVVWWWWVUTTSSRQPPPOPQRQQQQPPONNOOONMMLLMMOOPRTSRQQQQOSUROLRVURNMNPNNLIGFGJMPNMIGHJLKIEEFGGFGIF@<>????@@@@@@@??>>??==<<<:888899999878888887765443222344555544334544443333222222333222223322233345554335653323444333456766554556654332222233211123444344345665420124566766669<=<975579:;<==<;;;:9888::<<;;::;:9998877767888888889:;;<===862368==>@BDEEEEEEDCCEFGFEDCBBBCDDCA>;9::<>>>==>@BBBBCCBBBBCBBBABCCCDCBBAABCBBCCDEEDDDC@?=>AEHHHGFFFGGGIIJKKKKKJJIHGGGFEEFHKMMLLMOONLJHGGHIIIIHHIJLPRTTRQOOPQPNKHJKPTVVWWXXWTQPNNNffedcbbaaabcdddeefghiijiihgffghjlmnmllkjjjjjjkllmllllmnnnmmllmnooponlllmmmmmnnnmmmmkjhfedddddddddccdefhhhhhhhhghggggggffgffcccddddefeedcbaaabbbbbaaa````aaaaaaaabbccdddeffhhiiiiiiihhggfeefffghhhgggfeddefhhhhhgggedcbccbaaabcdefgggecba`acdedcba`__^`acdca_^_`abbbccegiiihhhhfccdeeddcbccccddefeddcbbcdddccccddccccbccbbaaaaaabcddcccdeeffffeeedca`_^^^^^________^]]^]]]]]]\[[\[[[[\]\[ZZZZ[[[\]_``_]\[ZZZZ[[\\\[ZZZZZZYYXWWWWWXXXYXVTTTXYZ^[WVXYZZXWYXWWWWWVVVVVVUTTSRQQPPPPPPPQQQQQQPOOOOOONNNMMMLNOQRUUSRRRRPSVSPMRUVSNMNOMKIGGFEHLNMLIGGHKJIEBBDEDEDD@>==>????>>>>>====>=<<;;:987787777777777777665433211223455544433344443323221122333333333332223334565433466432345433246776554455665433332112332113444444443456553112466788878:=>=:75468:;<>>===<;:998:;<<<;;::::999988777788888889:;<=>??:84468<@ABCDEDDB@>==?@BDEEEEEECCCDEFFEECBBABCCBA>;99:<=>>>>?ABBBBCCBBBBBBBBABCCCCBAA@@AAAACCDEEDCCCA@>>BFHIHHGGGHHIJJKLLLLLLKJIIHHGFFGILNNMMNPQPNKIHHIIJJIIHJKNQSTTRQPPQSQOLIJKPUVWXXYXXVRQOOOeddcbbaaaabcddeefgghhijihgfeffhjllmlkkjjjkkjklnnnlllmnoonnnmmnoppponllllmmmmnnnnnnmljhgfeeeeffeeddcefghiihhihhhgggghhhgfgggddddddefffeccbaabcbbbbaaa````aaaaaaaaabbbbccceefghhhhhhhhggfeddeeefgggfeecbaaabcddeededdccbbcbaabccdefggfecbaabcdecbba`_^^_abcb`^]^_`````bdgiihhhhgeddeffeedccccccdeedcbbbbbcbbbbbbcdcccccccccbcbbaabccccccdeefgggggffecba`____`````_^^]]]^]]^^^]]\\]]]\]^^^]\\[\\\\]^`aa`^]\[[[[\]]^^^^]]]]]\[[ZZYYYYYYYXWUUUWXY[YUSVWXWUUZXVVWWWVVVUVUTTSSRQPPPOOOOPPPPQQPPOOONNNMNNOONLMNQRUUTSRRQQSWTRNRVWTNMMMLIFEFFEGJLLLHFGGIHHD?=@AAAAA@==<======<<<<;;<<<<;;::98766777666677666555443221112223455544333454432222221233343333333222233445664334665434455432467765444556654333321122332234444555444566643234689:9989;>?>;85468:;=>>>>>=<;::9:;<<<;;;:::99:99988888888888::<=??@?;97567:789;=>>>>?ABCBBBCCBBBBBBBAABCCCBA@??@@@@BCDEEDCCCBA??BGIJIIIIIJJKKLLMMMMMMLKJJIIHGGHKNOONNOQRQOLJIIJJKKJJIKMPSTTSRQPQSUSPMJJKQUWXYYYYXWSRPPPdccbbbbaabcdeefffgghhhihgfedffhjklmlkjiijklklnnmmkklmnoononnnoppoonmllkkllmmnonnnnmljihgffffffeddddefghiihhiihhgggggggfehhhddcddeeeffdbaaaabcbbbbaa````aaaaaaaaaaaaaabbbcdefgggghggfeedcccddefffgfecbba``_abcccbcbbbbbbbbcccccdefggfecbaabcddcba``_^]_abca_^]^______`beghhhhgfedefggfeeddddccdddccbaaabbaaaaabbccccddddddccccbbbcccccccdeffhiiihgecba``a```aa`_^^]]\\]]]^^^^]]]^^^^____^]]]]]\\]_abb`_^]\\\\]^^__`_____^^]\\\[[[ZYYXWVUUUVWWUTSSUUUUTUXWVUVWVVVVUUTSSSRQQPOOOOOOOOOOOPOONNNMMMMNNONMMLNPQTTSRPRQPRWUTNQVWTNMLLKJGDDEDFHJJJGDDDEEEB>;=>?==>><=<:;;;;;;:::99:;;;::::9876666655556655544333322111222345555333345543222222233334444333322223444566544456544445433245666544445665544432112233234565456555567766433478:;::::????>=<;:::;<<<;;;;9:99:::988998778888:;;=>??@=;8668<>@BCDDDDCB@>=>?ABDDEEEDBBBBBBBDEEDBA@A@@?=:778:<>>>>?@ABAAAAABBBBBBBAABBBBA@@??@@@@BCDDDDCCCCB@@CHJKKIIIJJJKLMNNOOOOONMLKJJIHHILNPPOOPSSSQNLKJKKLLKKKLORTVUSQPPRTUUQNKKLQUWYYYYYYWTSQQQcccccccbacdeffffffghhhhgfeddefhijkkjjjijjkllmnnmlkklmnnoonnnnooonnmmlkllmmnonnnnnmlkjihhgghhgfedccdefghhhhhihhhggfgggffehhidccdddeeeeeb```accccbbaaaaaa``aaaaaaa````aaabbcdeefggfeedccbbbccddeededca``_^^^_`aaaaaaaaabccdccddddegggfecbaabcddcba``_^]^`aba_^]]^^^^^_`acdeeeeeddddfgffeeeeeedddddddcbaaaaaaaaabbccddeeeeeedddddccddddccddeffhiihhgecaaabba`aa`_^]\\[\\]^^^^^^^]^____````__^^^^][]`bbb`_^]\\\]^_``aaaaaaa`_^^]]\\\[ZXWUTTUUUVUTSRRSSTSTVVUTUVVVVUUTTSSSRRQPOOONNNNNMMMMNNNMMLLLKLMMNMLKJLNORRPNNPONPUQQOQUVTLKKJIHGDCDDDFGGGFCA@AAC@<:9<=;<<<;<<::9::::988789:::::998876665555555544444433332111223445665333345544333333333334444333222223444566544345654444432235666543345665544432001333345665346666678777544589;<;;;<=@A?=84457:<=?????>>=<;:;;<<<;;;;:9999::988999889988:;;=>??@?=;889;>@ACDDDDCB@?>>?@ABCDEDDBBBA@@@BDDCA@@??>=<9667:<=>>>>??@@AABBBCCCBBBAABBBB@@?@@AA@ABCCDDDCDDDCBAEJLMMLKKKLLMNNOPPPPPPONLKJJJIIJMOPPPPQSTTROMLLMMMMLLLNQTVXVTQPPSVWVSOLLMQUWYYYZZYXUTRRRccccccbccdefgfffffghhhgfeedeffhiijjiihijjjklmmmlkkklmmnoonnnnnnnnmmlllkkllmnnnnnmlkjjihhiiiiihfdcbcefgghhgghhhhgfffggfdcghidccddddeeefb_`]`cddcbaabbbaa``aaaaaa```````aaabcccdeedccbaaaaabccdddcbba`__^^^^_````````abcddddeeedefgggfedbbbcdeddcba`_^]]_aaa_^]\]]]]]^^_`abccbbbbccddeeddefffeeeeeeddccbbbbbbaabbcdeefffffeeeeeeefeeeedddeeffghhhgfdbaabbbaaa`_^]\[ZZ[[]^^]^]]]\^````aaaa``__^`]Z[]aba`^]]\\]^_``aabbbbcba_^^^]]\\[YWVTTTUUUUTSSSRRRSSTVUTTUVVVVUUTSSSRRRQPONOMKKMMKKKLLLLKKKKJJJJKKJJGHHKLOOMKKMMLLRMMOQRRPIGGHFEEDCCCCDEDDC@><=>@>:87:;::;::<;99899998776789999:99887655555555554433444333322122345677643334544433333344343333332221233454456654434555543322123566543334566665544200134444567544667777888876679;<==<<=>@A@=954579<>?????>>=<;:;;<<<;;;;:999:::9889:9889989::;<=>???>=:::<=?ABCDDDCA@??>??@ABCCDCBAA@?>?@CCBA???>=<;96679;<>>>>??@@AABBBCCBBBBAABCCBAA@@ABAABBCDDDDDDEEDDCEJMNNMLLLLMNOOPQQQQQQQOMLKKJJJLNPPPPQRTUTSPNNNNNNNMMMORUXYWTPOPSWYXUROMNRUWYYYZZZYVUSSSdddccbbdeghhihgfffghhhhgedddefghhhihhhhiijklllkkkjkllmmnnnnnnnnmmlkkjjjjkkmmnnmmllkjiihhiiiihgfdcbdfefhhfffghhhgfffggebbfhheddcccdeeeea__\_deedbaabcbbbaa``aaaa```````aaaabbccdccba`__``a`aabcba`_`___^^]^_```____`abcddefggfeefhhhgfdccccdeedcba`_^]]^_`a_^]]]\]]^^]]^__```````aaabccdefggfffffeeeeeddddcccbbbcdefghhhgffffffffggffeeeeeffgggffeca`abcba``_^][[ZZZ[[]^^]]]]\]^`aaaabbba``__`][[]`a`^\[[\]^__`````abbbba_^^^^]\\ZXVUTTUUUUUUTTSSSSSTTVUTTUVVVVUUUSSSSSRQPONOMJKKKJIIJLLKJJIIHHIGGGFEDFFGHLKJHFJJIGNJJMNMMLECCDCCCCBBBBBCBA@=;::;><8669:9::::;;998999998766789999::98765555554444332334443332222234678875433343333333334444333333322223345455665443456665321123566654323456666555421013455567865577778899998779;<=>>>>??AA@>:65679;>>?@@?>>><;:;;<<<;;;;::99:::9989::999:::::;<<=>>>>==<;<=>?ABCCCBA@???>>>?@ABBBAA@>=<==<;:97778:<=>>>??@@AABBBBBBBBBBBCCCCBBAABBABCDDEEDDEEFFFFFGJMOPONNMMNOQRSSSSSRSRPNMLKKJLMOQQQQRSUVUSQOOOOOOONNNQTXYYWTPOQTXZZWSQOPRUWYZZ[[ZZYWUTTddddcccefghhihhggghhhihgedddeefgghghgghiijjjjjjjjijkllllmmmlllllkkjiiihhiklmmmmlkjiihhghiiihgfeddbfgeeggdeefghggfefgfcabfghededdcceedea^^Z_eeecbbbbcbbba`_`aaa````````aaa`aabcccbb`_^^_````abba`_^_^_`_^^^_```_____acddeffghgfghihhgfedccdeffecbaa`^]]^_``__^]\\]]]]]]]]^__^^^^^_`_`acdefggffffffffffeeeedddccbcdefghihhgffggggggggffeeefffffeedcca_`bbb``_^]\[ZYYZ[\]^^^^]]\]^`ababbccba`_^`][[]__^][YZ[\]^____``a``a`_^^_^]]\[YWUTSTUVVVVUUTTSSSTTUVTTSTUUUUTTVSRTTSRPONNNMJJKKIHIJKKKJJIHHFHFFEEDDFFFGJJIFDIOECIIILJFIHB@@CABCCCBBBBAA?>;:889:98667889999::999888887666788889998887655555444332123334433222223467888644333333333333334433333332222335655655544445555420013456665322234566666653101345656675457778899:::988:<=>???@AABBA>955679;=>?????>==;:;;;<;;:::::::::::9:;<;:::;:::::;<==>>>>==<<=>??@@AAA@@@@?>==>>?@@@@@?=<;;=@A@?>==<<;:87778;=>>?>??AABCCCCCBBBCCDCCDDDCCBBBCBCDFFFFEDEFHIHHGIKNPPPPNNMNPQSTUUTTTSRQOMLKKLLNPQRRRRSVWVTQPPPQPOONNPSVY[ZWTQOPUY[[XUSQPRVXZZZ[[[ZYWVUSeedddddfghijjihgghiiiihfeddddeefggfffffgghhhhhhiihijjkkkkkkkjkkjiihgggfgijkklkkjjihhhgghihhggfeddchhdcfgbcefggfffefgecaaeghfeedccdddcc_]]\`dedcbbbccccc``_``a````````aaaa``accccbb`_^_____`aab`^]]^_````^_``___``_`abddefghhgfghiiihfedeeefffecbba`^]\]^____^^]]]^]]]]]]]^]]\\\\]]]^_`acefffeeffggggggfffeeddccdefghiiiihghhhhhhhhhggffffffffeddcca__aba`_^]\ZZZYZ[\]^^____^^_^_abbbbcbbb`_^^\[\\^^][YXYZ[\\]^^____^^^]]\]^^]\ZYWUSSTUVVWWVVVUUTTUUVVVUTTUUUUUUTWSRUUTQOONNNLJIKJJIJJLLKJIHHHFIGFEDCDFFGGHHGFFHLDBIIHJIBGFA>?BABCEDCCCBA?=<;:87999888789999::::9999998777767788899888765555544433211233443332222346788875433322233333333444333333332233566555554444455531/0136776542112445566667641012578765655577889:;;;;;::;=>?@@@@AABBA>:66789;==>???>>=<;;;;<;;;:::::::::::::;<<;;;;;;;;;;<===>>>=<<<==>>>??@@@@@?>><<<==>???>=<;:;<>@@?>==<<;:97789<>>?????ABCCDDDDCCCDDEDDEEEDDCCCCDDEGHHGEDEHJKKJIJLNQRRQONNOQSUVVVVVVUUSQOMKKLNPRSSSSTUXXWURQQQRRPONNPTX[\[XUQOPUZ\[ZVTRRSVXZ[[\\\[ZXVTQeeeeeeegghijjihghiiiihgfeddddeefffffeeefffffgggghhhhiiijiiiiiihhhgfffffehjkjiiihggfggffghhggfedefdhhcbefbcdefffeeeffdbabefgededcddddca^]\^abddcccbccddda_^`abaaaaa`aaaaaa``accccbb`_______abbb_^]]_`aa`````````aa``abcdefghhggghiiihfedddefffdcbbaa_]\\]^_____^]^__^^^^^^]]]\[[\\\\\]^`bddeeeeefhiihhhgggfeedcdefghijjjjihhhhhiiiiihhggffffffedddca__aa`^]\[ZYYZZ[\]]^___```````bbbbbbbbba__^\[\]^^\ZYXXZ[[[\]^^^^]]\\[ZZ[\\ZYXVTSRSTVVWXXXWWVVUVVWWWXVVVUVVVVVUWSRUUTQOOONMMKKLLKKKLMMKJIHHGFJHGFDDEGGFGHHHHIJIDCKKJIHAGD@=>BABCFFEDDCA@<:::77999999889::::999999:;:9987666777898887655555544433211233444332222346888865433322233333333444433333321134676554444444444420/025676543101244555667765200269987666678899:;<<===<<==>@@@@AAABCA=;77789:<<>>>=>=<;;;;;;;;;;;:::::9:::::;<<<<<;;;;;;;<===>>=<;<====>>>>?????>>=<<<<====>==<;;<=>??>>==<<;:8778:<>>@@@?@ACCDEEEEDDDEFFFFFFFEEDDDDEEGIIIHFEFILMMKJKMOQSSRPONORTVWXXXXWWVTSPMKKMNQSTSSSUWYZXVSRSSTSQOMNQUZ\]\YUQPPTY\\[XURRSUXZ[[\]]\ZYVTReeeffgghhhijjihhhijjhgffeeeeeffffeeeeeedddddeffffeffgggggggffffffeeeeeeehjihgggfedeeeeefgffeeddefeifbaefbcdefffeedeecbbceffededcddddb`]]]^aceedccccddeeb^^`bbbbaaaaaabbba`aaccccbb```````acdcb_]\^aabbbbbbcbbbbbbaaabcddeghhgfgghhihfedddefffdbaaa`^]]\]^_____^^^______`__^^\\\\\\\\]]^abcdddddfghiiihhggfeedddefghjkkkjjiiiihiiiiiiiihgghgggfeddda_^__^\ZYXXXXYZ\\]^_```aaaaaaaccccccccba`_^\\]^^^\ZYYZ[\\\\]^^^^]]\ZYYXYZYXWVTSRRTUWYZZZYYXYXXXXYYYYXXXWWVVVVVYSQVUTRPPPOONMMMMMLLMNMMKIHHGEKIHGEEFGGHHHHIILMJ@ENLLJIBHE?=>BBCDFGFEDDCA<9997699::::99::::999999::;;::9876656778877655444554443311123344433333334688886433332223333333455543333332123467654444444443331//036776532//0244555567875200269:98667789:::;<=>???>=>>?@AA@AAABBA>;888999;;<=<<<<;;;:;;;;:;<;;;:::;;;::;<<==<<<<<<<<<<=>>>>==<=>>>>===>>?>>>>==<<;<<=<<=<<;;;<==>?>>==<<;:8678:=>?@AA@AADDEFFFFFFFFGGGGGGFFFFEEEEEHJKJIGFGKNNNLKMMORTTSQPOPSUWYZZZYYXWUTROLLMORTUTTTVXZ[YVSSSTUTQONORW[]^]YVRPQUZ\]\YVSSTUXZ[[\]]\ZXUSQeefghhiiihikjhhhijjihgffffffffffeddddddcbbcddeeeeeeffeeeeeeedddddddccddffifefeeddccddddefeeedddegfhfabfgcddeegffeeeebbbdeeeededddfffeb_\]^adeedcccdedefc__abcccbbbbbaabbb`abccccbb```a``bcdeca_]^`cccdccccdccdddcbbbbcccefggfefghhhgfdddddeeeca`a``^]]]]^_____^]^^_`````a``_]]^^]]]\]]^`bbbbbbcegghhhhgggfeeeeeeefhikkkkkjjiiiiiijjjjjjiihhhgfeddda_^^^\ZYWVWXXYZ[\]^_`aaa`abccacddddddccba`_]^___][YYZ[\]]]]]^]]]^]\ZXWWXXWVVUSRRSTVXYZ[[ZZYYZZZZ[ZZZZZZYXXXXXWZTRWTSRQQQPPOONNNMMMNNNMKIHGGELIHHFFFHHJIHGHIMOL@GPNLKJDIF@>?CCCDFGFEDCCB>877779:;;;:9:;;::998899::::;:987655667776654444544444331112334443333344568887543333322333333345554333333222346765444444443322100146776531..0244555567876300269::975789::;;<=>?A@@@?>>?@@@@@@AABA>;888889::;;;;<;;;::;;;;;;<<<<;;:;;;;;<==>===<<======>????>==>>??>===>>>>>>====<<<<===<<<;;<<===>>>===<<:8778;>@@BBBABCEFFGGGGGGGHHHHHHHGGGGFFFFFIKLLKHHHLPPONLNNPSUUURQPQTWXZ[[[[ZZYWURPMLNPRTUUTTVY[\ZVSTUVVTRONPSX\^^^ZVRPQUZ]^][XUSSUXZ[[\]]\ZXURQffghijjjjijkighiikkigfggggggggfeeccccccbabccdeeeeeefeeeeddddccdddccbbcceegccddcccbbbbbbdedddddeffgheabfgddeffggfeedcbbcdefffeeddefffeb_]^_bdfeddcdefeegd`aabcccccbbbbabbb`abccdcbbaaababcefeca_^`addeeeeeeeeeeefedcbbccbdeffeeefgggfecbabcddca````_^^]]^^____^]]]^_`aaabbba`__``__^^]^_``aa``acefggggggggfffeeeeefgijllllkkjjiijkkkkkkkkjiiihgeddca_]\[ZYWVVVVWXYZ[]_```````cecbdeeeedddccba_^_``_][ZY[\]]]]]^^]]^^]\ZXWWXXWVUUSSSSTUWY[[[[ZZZ[\\\\[[[[\\[ZYYYYXZUSWUTSSSRRQQPPOONNNNNNMKIHHGDKIHHGFGIHJKHFGIMQMAIQPMJIFJGA?@CDDDEFEDCBBB?95678::;;;:9:::::988788::::::986544566665554444444444331122334444333455667786543333333333333345664433333322346754433443433221101257776520--024445555677630/169::975799;<<<<<=?BAAA@??>?@@@@@AABA><99988889:::;;:::::;;<<;<<=<<<<<<==<<<=>>>====>>>>>>?@@@@?>>>????>>=>??>>====>=====>>>>=<<=>>>=========;9778?BCDCCDDCAABA?95568:;<;;:999::998777888999987543246665444433334444432122334444444456677777654333333344444445666443333433344675433233443221111235776541/-.1344444445687410169;;97679;<===;;=?BBBBA@?>?@???>?@AA>=:::98899::::::::::;;<<<<====<<<<==<<=>????>>>>>???@@AAAA@?>??@@@?>>????>==>>?>>>>?????>>=>????>>===>>><:878<@CDFFFEEHIJJJJJIIIIJJKKLKKJIIIIIHHHKMNMMKKLORRRQOOOQUXXWUSRSVY[\]]]]]\[YWURPNORUWXWUUWZ\][XUUWXWVSQPRUZ^``_\WROQU[_`_\ZVTSTWYZZZ[\[YVSQPgghijjkkkllkihhjkkjihgghghhhhhfedddccb``abbcdeffffeeddccddddcceeedcbbbcdddccbbbba`_^_`acccccedfffggcbcfgffggggeddcaaabcccdeeeddeefffdb`^^`cefeeeeeffffhe``accdeedcccddddcaabccddccbbccdeffeca``bdegfghhhihiiihhhgfeedeecbdedccbccddcba```aba`___````__^]^____][Z[]_```bdedcbbcdddddba``aa`___`acdddeeddefgggggggghijkmmmmmllkjijkllljjkkkjhihgeba_][ZYYXYZZYXWWWXYZ\]___`bbabeecdefedccdddcb`_aba_][YZ\^_][Z[\\\]]]\[ZYXWWWWVVVTTSSTUVXZZZYXXXXYZZZZZ[[]\[ZYVVWWVUUUTTTTSSRRRQPONLKKJLJJJGFDCDIGGGFFFHIKKHDFGLOKDKNJKHFDED?=>ABBBBBCB@??><85568:;<;;:99999987666666666676542248764343332223444432233444444444566777766554333333344444456666543334434455675433343444221222235676530.-/1344333345688620169;;:867:<=>>=<:<>BCCBA@?>>>>>>=>?@@>=:::9999::;;;:::::;;;;<<=>>>>=======<>>?@A@@?>>??@@@ABBBBA@?@@AAAA@@@@@??>>??@????@AAAA@??@@@@@??>?????>;878>CEEGGFFGJKLLLKJJJJJJKKLMMLKKJJJIHHILNONMLMNQSSSRPOPRUY[ZXUTTWZ\]^^^^^^]ZYWTQPQTWXXWUUWZ]^\YVVXXXWTRQSV[_``_\VROPS[`a`^[WTSTVXZYZZZZWURPOggiijkkkllmkighjkljhggghhhhhhgfddeddbb``abbcdefffeeddcccccccddefeedbbbcddcbbaccbb`^^_`acdddddeefgggaceefggggffdcbba`aabbccdddcdeeeeedb_]_`deeedeefffefge__acdedddcccdeeeccbccccccbbccdefgfdbaabdeghghiiijjjkjiiihgfedffdbcdcbbbbcbbaaaaaaaaa`_^__```___^^^__^\ZYY]___acdedcccegggfecbaaaaa`__`abccccdddefggghhhhhijkllmmnmllkjiijllkjhjkjihhgec`_]\[ZZYY[\[ZYXXXWYZ[]^^_`bb`bccddeedcccddcca_^aa`_]ZYY[]^\ZYY[[[\\\\[ZXWWWWWUXXWUSRSTUWXXXWVVVWXXXXXXYZ[[ZYWUUVVUVVTSTTSRSRRQQPMMKJJIIIIHEEDBDHFFFEEFHHJIGECFJKHELLGHGECCB><=@AA@?@A@>=<<;75568::<<;;:988776555555444456553114886433333223333333334444334444456777666655444333323433356766654334333456666543333444321112234566542/--/1343333345689731159;<;978:<=??><:;=ACBA@?>=<<<<==>???>=;::::::;;<<<;;;;;;;;<===>????????>>>??@ABBA@>>?@AAABCDDCBAAABBBBBAAAAAA@@@@AAA@@@ABCCCBAAAABBAA@@@AA@@><98:?EGGHHGHIKMMNMLKKKKKKKLMNNMMLKKKJHIIMOONNMNORTTTSQPQSVZ][YUTUWZ]_______^]ZXTRPRTXZZXVVWZ^_]ZWWXYXWUSSUW\^a`_\VQNPSZ`ba_[WTSSVWXYYXYXVURPNghijkllklmmkighkmljhggghiiiihgfedeeeca`aabbcdefffeddccccdcccdeffeedbbbcddccbaccba`__`abddeeedeefffe`deffggggedcba``_``aabbbccdddeeedb`^]_acddddeeeeeefge`_`deddddccceefeccbbcbbbbbabdefggecbbbdefghijjkkllllkjjjihhgfffedcccccccbba`_`abbaa`_^^_`aaa`__^^^_^]]ZWX]`^_adffedddfghgffeddccbaa````abbbbdddefffghiiiiijklllllmllkjhhhkkjhghjihhfec`^\\\[ZZZ[\]]\ZXXXXYZ[\]]^_``_`abcdddcbbcddcba_]``_]\ZXYZ]^\YWXYZ[[\\[ZYXWWWWWTWXWUSRSTUVWVVUTTSTTUVUUUVWXXWVUSRSTTVUTSRRQQPPPPONLJHGGGFFFGCFDAEFDEFEDEGHIIFCDEFFDEHGDDCA@BA<9:=?>>>=>><99997655688:;;:9887665444433333345554214996323333223333333334444333444456777666666554333333433357775554333443456676543333444332111234566542/-.01344444445689842258;<;:88:;<>?>=;;<@BB@?=<<:;;;<<=>>>>=<<;;;;<<===<<<<<<<<<=>>?@@@@@@@@@???@ABCDCCA@?@@ABBCDEEEDCBBCCCCCCBBCBBAAABBCBBBBBCDDDCBBCCCCCBBAABBAA?=:8;@FHHIHHIKMNOONNLKKLLKKLMOOONMLLLKHHIMOPOOOOPRTUTTSRRSWZ]\[WVVY\_aa`````_^\YVSRSVZ[[YVUWZ^`^[XXYYXWUSSWY\_``_\VRONRZ`ba_\XUSSUWXXXWWVUTRPOfghikllllmlkhghjlkihgghjjjjihffeefffda`bbbbcdeffeedccccddddddeefedccbccdddcbbddcba``abceeeeeddeeegd_cefffggecba``__^_``aaabbccdddddca`^^`acccddeededdefd`_adedcccccceeffedbbbbbaaaabceghfdcbbcefggijklmnnnnmlkjjjiihggffeddcccddcca``abbba`____`abbba`__^^_^]\ZVW^a^^adfgfedeghihggffffedcba````aaabddeffffghhjjjjkkkjjijkkkjhfffijhffgggfdba_^\\\\[[[[\^_^\ZYYYYYZZ[\]^__^^^`bcdccbbbcdccb`^\_`^][YXXZ]^\XVVXYZ[\\[YYXWWVUUSWXWUSRRSTUUTTSSSRRRRSRRSTUVUTSSRRPQQTTSQPONNMMLLMLJHEDEEEEEFBEC@CDCEEDCDFHIGDCCCCCBCDCAA@>>@?:99<=<<;:;=;6668765447788888876654333323322334554214::73333333333344333234333334444567776666666553333334333578875543334434566655433333443222222345654320./1234444445568:963357:<;;:9::;<>>=<;;>@@?=;;:9:::;<===>>=>>=<<<<=>>==========>??@AAAAAAAAA@@@ABCDEEECBA@ABCDEFFFFEDDDDEDDDDCCDCCBBBCDDCCCCCDEDDDCCDDEEEDCBBBCCA?=:9;AFHIIIIJLNOPPONLKLMMLKLNPQPONMMNKHHINPQPPPPQSUVUUUTSTWZ]]\YXXZ]abbbaaaa`_]ZXURSVZ\\ZWVWZ^`_\YYYZYWVTTWZ]_``_\WSPORY`ba`]YUSSUVWXWWVUTRPONeefhjkllkkkjhfgjkjigghikkkjigfeeffffdbbccbbceffeeeddcccdddddddeeedccccdeedcccdddcbabcdeffeeeddeeffb_defffffcbaa``____``aabbbcdddddcba_^^_`bbccddedccbddb__bdddccbbcceeffedbbbbba````ceghfdbccdefghjkmnnoooonmlkjjjjihhhgfedccddddca`bcccba``__`abcccba`____]\[YUX^`^^`dffeedegiiihgfgggfedcbaa```acdeeefffefghijjjjiihggggggfdccdfgecccdcba_^]\\]]\\\\]^_`_][ZYYZZZ[[\]^^^]]]_abbbbaa`aaaa`^\[^^]\ZXWXZ\][XVVXYZZ[ZYXYYXWVTUSVWWUSQRTUUUTTTTSRQQQRQQRSTSRPPQQPNOPRQPNLKJJIIIIJJGFDDDEEEFF@CB@CDCDEDCCFGGFDCBB@@?@AA@?>=<>=9879<:9979:94447755446665666655543333212222235654215;:74333333333444333233332334444468865555665554333334333578875543343345566665543333332222333456765310//13455555555689:754579:<;:9:::;<==;::;>>=;99999:;<=>===>>????>===>>>>==>>>>>>?@AABCBBBBBBBAAABDEFFFFECBAACDFGHHHGFEEEFFFEEDDDDDDCCCCDDDDDEEEFEEEEDEEFGGFECCCDDC@=;:=>???=<;<<<9878:98768874346755445444455544443233111122235564216<:64433333334554432233332344543457765555565554433344333567875543333344555666554334332223444567875310012456676655568998655679;;;:99::;<<;:9:;<:978999:;<=>>>>?@@@@@?>==>>>>>>>>>>>?@BCCDDCCCCCCCBBBCEGGGGGFECBBCEGHIIIHGFFFGGGFFEEDDEEDDDDDEEEEFGGGGGGFEFFGHHHGEEEEFDA><;>DIJJJKKMORSSSQNLKMOONKKOSTTRPOOPMHHLPRRRQRRSUWXYYYXWWY]^_^[YY[`cdddcbbbb`_\ZVTUX]_^\XWX[^_^][[[[ZXWUUWZ]__`_]XTQQRX^aa`]ZVSRRTVVTTSRQPOMKccdfhjjihggfffgijjhgghijkjihfeeeeffeeeeecabdgghggffeedddedddddeeeeddeeefeedddeeeddcdefggffffggfffbacedeeddca``aba``aabbccccdddedddcb``__````abcccb``aaaaaaddccbaabcddefeddcbdddcaa`abdfedbaefeefhiknopppqqqomlkkkkjjjjjiihfedefffcaadggfcba``abcddddcbbaaa`^\[YW[_`^^`cdddcdfhjkkjiiiiihhfedccbbbdeeffffedddefgggggfedccbbba`_]]]__^]]^^^]]\\\\]^_`````bcba_^][[]]]]\\\\\[YZ[\^_````__^^]^][YY[[ZZYXWXZ[ZZXWVVVWXXXXWXXXWVTUVUVXWVUUWXXWWVVVUUTSSRRSSSROLKOQNLLMNNNLJHFGFFFFFFFFEEDEEEEEG?BC@CDBCDCBBCDCCBCBA?=<=>>><;::;;8766887767874236755444322333334433222101222224453127;964333333345554432233333345654457654555555554433333224567865543334444556666655444443234445678875310134577888766678998765579;<;:99:::;<:988998767889:;<>????@ABBAA@?>>???>>>>>>>?@ACDEFEDDDDDDDDCCDFGHHHHGFECCDFGIJJJIIHHHHHHGGFEEEFFFFEEEEEFGHIIIIHHGGGHIJJJIGGFGHFC?==@FKKKKKLNPSTUTROLJMOPOLLPTUVTRPOOLIJMQRSSRSTUVXZZ[ZZYYZ^_`_[ZY\acefedcbbba`][WUWZ^_^\YWY[___^\\\\[YWUVXZ\____]YURPRW]aa`]ZVSRQSTTSQPPOOMLJccdfhiigfeeefggijigggghijihgedddeefffggfe`behhhggggfeeeeeeeddeeeeeeffffffeeddeeeeddefghgfffghgfeebacfdddccba`abbbaabbcccccdddeeeeddba```````abccbb``aaabbbddcbaaabcddeeeddcbddedbbaaccddca`gfffhikmnoppqrrpnmkkklkkkkkkjiihfefghfdbbeiigdbaaabdeeedccbbbbba_\\ZX]a`^_bdddccegikllkjijjjihgfeddccdeeeeffedcbcdddeddcccbaa```_^\[[\\\\\\\\[\]]\]]^_```aabcddca`^[\_`_^]]]\\[YZ[\]^____^]\[[\\ZYYZYYYXWWXYZZYXWVVVVWWVVWXXWVUSUVVWZYXXXXYYXXWWWWVUTTTTUUTQOILNNMKKKLMMJHGFFGGFFFFFFEEDEEEEEF?BC@DDBBCBBAAAAAACB@?=<<>>?<;:9::7655776656674236655444322233444433221012322234553137;954333334455665432234434456654456645555555544432233334568766554444544566777765555543334556788986421246788888777789998765678:;;;:99:::;:99988766789:;<>?@@@@ABCCBBA@??@@@???????@ACDFGGGFEEEEEEEDDEGHIIHHHGFDDDFHJKLKKJIIIJJIIHGFFFGGGGGFFFFGHIJKKJJIHHIIJKLLKJHHHIHEA?>AFLLLLLMOQTTUUSOMKNQQPMKOTVVUSQPOKJLOSTTTSTUVWY[\\\\[[\__`_\ZY]adfgfedcbbba^\XWY\_`_]YXY\_``_^]]]\ZXVVWZ\^_`_]ZVSQQV[_`_\YUSQPQRRQONNNMLJIccdegggfeedeefghihgffghiihgecccdefgggggfc`cgiihhhhhgfffgffffeffffffgggggfffeddeeeeeffhhhffgghgfecabefdcbbaaa`bcccbbbcdeeddddeeffeedcbaaaaaaabbcccbaaaabbccdcbba`abcdddddcca`bdedba``abccbaaffffijlnoopqqrrpnlllmlllllllkkjigffhigdbcgjjhdcbbcceffedccbacddb_\][Y_b`^acdddccegikmlkkjjjjihhgfeeeefffeeeddcbabbbbbbaaaa``_^^^]\ZYZ[[\\\\[[[\]]]\]^^``abcdefedbb_]^aaa`_^^]\[Z[[\]^^^^^^][ZZ[[YWWXXXXWWWXXYYXWWVVVVVVUUVWWVVUSTVUWYYYZZZZZYYXYYXWVUUUUUUTPNKLNMLJJJKKKIGFGGHHHHHHGFEEEFEEDDE@BCADDBBAAA@????@BA@?====>><<:9:97654665544574236654333332223455443210023422345543248:964333334556666543223434566764356544556555544433333344567776555555555566777776656544445566789986432357899998777789:99876668::;;;:9999::::98766689:;<=?@AAAABCDDCCBA@@@AA@@?@@@@ABDEFGHHGFEEFFFFEEFHIJIIIIHGFEEFIKMMMLKJIIIJJJIHFFGHIIIHGGFFGHIKLLKJIIIIJKLMMMKJJJJIGC@?AGLMMMMNPRTUVVSPMLNRRRNJOUXXVTRPOLLNPTUVUUVWXYZ[\]^^]]]^_`_\ZY\adghhfdccbcb_]ZXZ]`a_\YXY\_aa`_^^_^\ZWVWY[]___^ZWTRRTY]_^\YURPOOPQPMMLKKJHGccdeefeeddddeefgggfffghhhgfdcccdeffgfffebadhiiihhhhhggggggffffffggghhgggggfeeddefeefghihhggghgfdcbdeedbbaa``aabbcbbccfggfddeefffffeeddcbbaabbccdccbaaabbccdcbbaaabddddccca`^abdca`__`abbba`dfffhklnoopqqqqnljjoqommmmmmlkjjhgghigdcehjjhedcbcdfggfecbbbdffc^\^\[`b`_aceedccegikllkjkjjiihhgffffffffedddcbaaaaa```````____^^]][ZZZ[\\\\\\\\]]]\]^^``abceffeecc`^`bccba__^\[[\]^^^^^^^^][ZZZYXWVWWWVVVWWWXXXWWWWVVVVVUUVVVUTSSUUWXYZZZZ[ZZYYZZYXWVVVVVUSPNKMNMKJIIJJJHGFGGHIIIIHGFFEEFEDDDC?ABBCCBA@@??>>>?@A@@?=<<====<;:987765555544464225654333333223355543210124433456542258:86433333346677654322233456777424554455555544444444444567787766666666666777777666654445566779::9754346899988876678999987656789;<;::8889:::9976679:<==>@BBBBCCDEEDCBA@@AAAAA@AABBBCDEFGHHGFEEFGGGFFGIJJJJJJIHGFDFILNOONMKJIIJKKJHGGHIJJJJIIGGGHJLMMLKJIIIJKLMNNLKKKKJGC@@BGMNMMNOQTVWXXUQNLNRSSNJMU[ZWUSRPNNPQTVWVVWXYZ[\]^^______`_\ZY\bdghhgedcbbba^\Z[]``_\XXY\`bca````_]ZWVWX[^^_^]ZWTRTUZ^[ZYUTROMNNONMKKJIHGGcdddddddddddddeeeeeefgghgfdcccdefffffeedbbfijjiiiiiihhiiihhgggggghhiihhhggfffeeffffghhiihhgggfecccdfedbba`aabccdcccddghhfeeeefgggfffeedccbbcccdddcbbaabbccdccbbbbcddddcba`^^`bdb`_^^_`aaa`_beefhklmnopqrqpnlklqqnnnnnnmmlkihghiifdcgjkjhedcdeefggfedccdeghc_^`^]abaaceeedcdegijkkjjjjiihhgffffffffeddccbaa```____________^^]]\[[\]]^^]]]]]^^]]]]^``abdefffedcaacdeedb`__\Y\]`a`_^____][ZZZYWVVWWWVUUVVWWXXXWWWWWWWWVVWVVUTSTUVWYZ\[[[[[[[[\[ZYXWWWVWVSNNMNMLKIIJIIIHGGHIJJKKJIHGGFFFEDCCA?@BBCBA@?>>>===>@@@??=<<=====;:987765554444454224544333333222345543200134433455542248986433333345777764322223456788423444345565554444444555667788877777666667777887776665556677789:;:7644578::988887678999987655679;<;;:98789:9::8778:;=>?@BDDDDEEEEEEDCBAAABBAAABBCCBCDEFGIHGFEFGHHHHHIJKKKKKKKJHFDEHKNPPPOMKJJKLLKIGHIJKKKKKJIHHIKMNNMLKJJIJKLNOONMLLLKHDBBCHMNNNOPSUWXYYWSNLOSTUOJMT[ZXVTSQOOPRUWXXXYZZ[\]^_`aaaa```^\ZY]adgiihfdcbbbb_^\\]``^\XWX\`cdbaaaa`^[XVVX[]^^^\ZWUSSTX[XXWUTROLLLMLLJIHHGGFcccccccccccccccdddeefffgfdcbccdeffffedcbdehijjjjjjiiijjjjihhggghhijiiihhggggfggggfgghhiiihhhgfecccefedcbbaabcdeedcdefhihgeeffgggggfffeedddddddeeddccbbbbcddddcccccddddcba`_^`ab`_^___```_^]`dddgijkmooqrponlmoqolnonnnmmljihhijifcciljihfedeffghhfeeeeefhid__a`_abbceeeedccegijjjjjiihhggfeeeffffedcccbaa```_^]]^^__^^^^^^^]]]]]^^_________^^]]]]__`bdfffffecbcefggedba`^]_`bb`__``__^\[ZYWVVVVVVVUTUVVWXXWWWWWXXXXWWXWVUTUUVVXYZ[[ZZ[[[[\[[ZZYXWVVVVQMLNNMKKJIIHHHHHHIJJKLLKJIGGFFEDCBA@>?AAB@??>=<<;;;<>????=<;=====;:97776555444555422454443333322234554310013443345653125798543333334567777643222235679952244334556655555444555667787887777777677888789888776666678889:;;:8654679::988888789:99876555579:<<;:98789::;;9879;<>?@BCEEFFFFFEEEDCBAAABBAABBCCCCCDEFHHIHGFGHIIIIIJKKKKKLLLKIFDCFJNQQRQOLKKLMMLJHHIKLLLLLLJIIKMNOONMLKJJKKLNPPONLLMLIFCCDINNNNPQTVWXYZXTOLNSUVQKMTZ[YWUSRPPQSUXYZZ[[\\]^_`bbbbba``^[YY\adgjiigecbbcb`_]]^`_^\XWX\addcbaaa_^[XVVXZ]^^][YWUSTTVWUVUUUROLKKKKJJIHGGGFbbbbbbbbbbbbaaabcdeeffffdbbbcdeeeeeedcbceghhjjjjjjjjjkkkkjhhhhhijkkkjihhhhhhhhhhhggggghijiiigfecddfgedcccbbcdefgfeefgjjigefgghhhhgggffeedddeeeefeeddccccdeeeedddddddddcbba`_`aa^^^__````]\\_ccceghikmnpqpommnpqonopooonmkjihhhjiecckmjhhgfefghiiihgfffghjjeaacbaccdeggfedccdeghiiiiihhgffedddeeedddccbba````_^]]]^^^]]^^^^^^]]^__`aa````aaba``_^^^_`bdffffedcbdfghhfedb`^_aceb__`aa``^][ZXWVVVVVVVUTTUVVWWWWVWXXYYZYYYXWVVVVWWXZZ\\[[ZZ[[\[[ZYYXWVUUUPKKMMLKJIIIHHHHIIIJJKLMLKIHGFEDCA@??>??@@?>=<;::999:<==>><<;<<<<<:98777655544455532244444443332223456542001344334665312688865444333456778775432223467897423333445565556655556666678887777777777889989::9987766678889:;<;:8655689;:988888899:99876555568:;<;;:9889;<=<:88:<>@ABCDFFGGGGGFFFEDCAAABBBCCCDEDCDDEFHIJIHGGHIJJJIJKLLLLLLLKIFDCDHMQRSSPNLLMNONLIHIKLMNNNMKJJKMOPPPNMLKJKKLNPQPONNNMKGDDFJNNNOPRUWWXY[YUPMNSUVRMMRXZZWVTSQQRTVY[[[\\^^^_`abccccba_^ZYY\`dhjjigecbbcca_]]]__^[XWX\acdcbaaa_^ZYWVWZ]]^][XVTSTSTUSSTSUSOLKJKJJIHGFGHGbbaaaaaabbba```acdeeffeddbabdddeeeddccbcefghijjjjjjkkkkkkjihhhijklllkjihhhhijjjiihgfgghijjjihfedeeggfeddcccdeghhgffghkkjhffghihihhhhggffeeefffffffeeddddeffffeeeeeedddccbaa__``^^_```___]\\_bbacefgikmoponmmoppoopqqponlkjihhhiiebdlljghgfggijjjiihhgghikkc`cdabeddfgggfeccdeefghiihggfedcccddddddccbbaa````_]\\\]]]]]]]]^^^^^_``aaaaa`abbcbbaa`_^_abdeeeeddcceghihgedb`]`bdd`_`bbba`_][ZXWVUUVVVVUUTUVWXWWVWXYYZZ[[[ZYXWWWWWWYZ[\\\[ZZZ[[[ZYYXWVUTSROKJLLKJIHIIHHHHHHHHIJLLLJHGFEDBA@>>=<=>>>=<;:9988778;;;<=<;:;;;;;987677666644455432244444443332223456642011344334675312699865444444456788876533333457887543222345555556666666777778887888887777889999;:::97777788899:;;;:9656789;;:9999999::998776655679;<<<;:99:<=>=;98:=?BCDDEFGGGGGGGGGFDCAAACCCDDEFFFEDDDEHIKJIHHHIJKKJKLLLLLMMMLJGDCDGLPRSTRPNMNOQQNKIIKMNNOOOMKKKMOPQQONLKKKKLNPQRQPONMKHEEGKONMOQSUWXXYZZVRNNSUVSNNPUYZXWUTSSSTWZ\\\^^____`abcdddcb`^ZXY\adhjkihfdcbccb`^]]__][WVX[_bcbaa``^]ZXWVWY[]^]ZXVTSTSSTPPRSUSOLKJKJJIHGFGHHaa````aaaaa``_`acdeeeeeccbbcdddddcbbbcdddeffhiijjjkkklkkkjihhijkmnnmlkjihiikklkjjihffgijkjjihfedefhggeddcccdegihgfghikkjhfghhiiiiihhhhggffffffgfffffeeeefgffffeeeeeeeddcbba____]_`aa````]\[_aa`bdefhjlnpnmlmoooopppqpomlkihhhijjeaflljhhiiiijkkkjjjjihiiihbbfebcedefghhhgecbcdefghgffedcbaaabcccccbbaaaaa````^\[\\\]]\]]]^^^^_`aaaaaa`abcddcdcba`__aaccccccccdfhiihfeca^^`cd`^_abbb`_^][YXWVUUUVVVUUUUVXXWWXYYZZ[[[\\[ZZYYYYXXY[[\[[ZZZZ[[[ZYXXWVUTRPOKJKKJIHHHHGGGHHHGGGIJKKIGEDCB@?>=<;;<<==<:987766667::::;;:9:::99876666666644455433344444443332223456642112344334565313799865444444445778887643334457887643222345665567766677877788888889998888889999;:::9887788899:::;:9865679:;;:::999999::98887665779;<===<;;<>>@?<:9;>ACDEEFGHHHHHHGGGGECAAACDCDEFGGHGFEDEHIKKKJIIIKKLKLMMMMMNNMLJGEDDFJORTUTQPOOPRSPMKJLMNOPQQOMLLMOQRRQONLKKKLMORSSQPONKHEFHLOONOQTVXYXYZ[WTOOSTWSOMOTZ[ZXWVTSTUXZ\\]``a````abcddedc`^ZXY\aehjkjhfdcabcca_^]^^]ZWVWZ^aba``__][YWVVWX[\]\ZWUSRSSRRNNPRTSOLKJKJJIHGFGHI``___``aaa``__`bcdeeeddcbbbccccccbbabcdddeefghhiiiijkkkkkjjihijlnnnmlkjiiijllmllkjhgfgikkkjihgfefgihfedcccdefhihhggijlkjifghhijjiiiiiihggggggggggggffffgggggggfeeeeeeeeccba__^_[`aba`___\\\_```acddgijlnmlklmmnopooonnmlkiihiijjcbgkkjiiiiijkkkkkkkkjijjhebfifcefeefgghhgecbbcdefffeddcbaa`abccbbbaaaaaaaaaaa_^\\]]]]]^^^____``aaaaa``abcdddedcca```abbbbcccceghhhgedb`^^`bb_^_`bba_^][ZYXWVUVVVVVUUVVVWWWYYZ[[Z[[\]]\[[ZZZZYYY[[\[[ZZYZ[ZZYXWWVUTSPONKJJJJHHGGGFFGGGFEFFGHIHGFDBA@>=<<;::;;;;:87666555669988999899988765566665544455433334444443332333567642123344444564313789865544444444677888754444557888643212345666667887777888889888899:999888899::;;::988888899:;;:::9865679:;;;::999889::9998877778:<=>>>====?@B@=;:<@CDEEFGHIIIIIIHGGGECAAACDDEFGHIIHGEDEGIKKKKJIJKLLLMNNNNNOONMKHFEEEINQSUTSRPPQRSRPNLMNOPQRRQOMLMOQRRRQPNMLLMNORTTSQPNLIGGHLPPPPRTVXYYYZZXUQPSTWTPMMSZ][ZYWUTTUXZ\]^`abaa`aabcddeeca^ZXY\aehjkjigdcabbbb`^]]\[YVUVY]`aa`_^^[ZXWUUVX[[\[ZWTPPRQQOLNPRTSPLKKLKKJIHFFHH`__^_```aa`__`abcdddddcbbbccccccbaaabcddddeefghhgghiiijkjjjjjkmoponmlkjiijkmmmmlkjigfhjklkjjihffghhhfeeddddefhiiihhiklkjigghijjjjjjjjjihghhhhgggghhgggghhhhhggfeeeeffffdcba^___[abcba``a\[\_`aa`abcehiklkjjjkkmnnnnnmmllkjjiijjgaciljiijjjjkllllklmlkklkhdbgjgdefeefgghhgfeccbcdeeddcba``a`abbbbaa````accbbbba`^_____^_____^^__`aa````abccdedddca``aabbbbbccdfhhgfedba_^^`a_^_````_]\[ZYYXVVVWWWWWVVVVVWWXYZ[[[[[[\^^^]\[[[ZZZZZ[[ZZYXWXXXXWWVUTSRQNNMKJKLKIHGGFEEFFEDCCDEFFFECA@?>=;:;::::::987765555556887777788887544566555554444433333344444333333466775322334444455431368887655444444445689986544556788875421234677777899888898889999899:;:9999999::;;;;:9888899::;;;:::9976678::;;;;:99999::::998888::;<=???>>>>@ACB><;=ADEFFFGHIJJJJJIHHHECA@ABDDEFGIJJJHFDDFHJKKLLJKKLMNNOPPPPPPOMLJHGGGJMPRTTTSRRSSTTQOMMNOQRTUTRNLLNPRSTSQPONNMNPRTUTRQPMKIHILPPPPRTWYZYYYZYVRQTUXUQNMQY^]\ZXWVVVY\^_`abccbbbbbcddeddb_[YY\`dgjkkkhfcaabaa`_]]ZXVTSUX\_aa`_][YWVVTUWXZZYXWUQNMPPOMLORTUTQMLMMLLKIIHHII`_^^_`````_^_`bdddddddcbbbbcccccbaabcccdddeefffffffgghiiiijjlmopponlkjjijklmmmmkjjihgikllkkkjhgffhhgffffeeeegijjiihhlmljihhiijjjkkklkkihhhhhhhhhhhhhhgghhhhhggfeefffggfedca^^_`\cccbaabb][[`aa````bdghjjihghijklmnnmmmmmkjjijjieadjkjjjjjjjklllllmmmlklljgfffgffeeefgghgffedcbbcdcccbba``aaabbbba```_`acdddccba_`bab`^____^^]]]`````````aacdedccaaaabbbccccdeghgfdcba`_^^``_]_`_^^]\[ZYYXWVUVWXWWWVWVVWXXYZ[\\\[[\]^__^^]\\[[[[[[[ZYXWWVWWVVUTTSRPONMMJJKLKJHFFEEDEEDCBBABCDCB@>>=<;9999999999876555555567776556667654344665545433332323333333343233445667753222344444554323677777665555434456899866545567788864212246877799:9889999899:9999:;;;::::999::;;;;;:98899::;;<<;:999877789:;;;;:::99999:::99989;<==>?@?@@@@BCCC?=<>BDGGFEFGIIKKJJIIHFEC@@ABDEEFHJKKKHFEEGHIJLLLLLLMMOOPPPPPQPPNLKIHGHJMPRTUUTTSSSTTSQONNPQSUWVTNKKLPRTTTSRQPONOPSUUTSRPOMJJJNOPQQRTVX[ZYYYYWTSUVXVRNLQX__][YWWWWY\^_abdeedccbbccdddcb`\ZZ\`cfiklkifdaaaaa`_^\ZWURRTWZ]``_^\ZWVTTSUWXXYWVUSOMLOONMLPSUVSPNMMNMLKKIIIIJ`_^^_````_^]^`bdddccdcccbbbbccccbbabcccccddeefeedddeffgghhjjmnpqqomkjiiijkmnnmmkjjihgikllkkkjhggfgggfgffffffhjkjjjiilmlkihhiklmmmllmlkihhhhhiiiihhhiihhiihijhhgffgggggfeeca^_``]dddcaabb]\\`aa____acefggfeeefghjklllllllkiiijigbbejjjjjkkjjklllllmmlkklmjgfgggggfeffffffeedcbbbccbbbbba`aaaabbbbba``_abddeeeddcabcbca_```_^]\\]__`````_^__acddcbaaaabccdcddefhgfdbaa`____``_^^^]]\\[ZZYYXXWUVXXWWWVVVVXXYYZ[\]]\\]^``____^^]\\\[YYXWVUVVUUVUTSRRPONMLLKJKKKIGFEDDDDDCA@?>?@A@?=;<;::88888888887766665556667654334454422356654554322212333333234432344445667532233444444443234566777765554444567999877556677888753233468889;;;;::9:9999::9999:;<<<;;::::::;<<<;::989:;;;<<<;;::9987789::;;;;;:999::;;:::::;=>??>?@AABBBCDDD@?=?CEHIGFFGIIKLKJJIGFDB@@ACDEEFHJLLLJHFFGGIJLMNNMMMNOPQQQRQRQPONLJIIJLNPRUVUUUUUUVVUSQPOPQSVWWUPMLMPSTUUTSSRPOOPSUUUTTRQOMLLNPQQRSTVX\ZYXYYYVUVWYWSNLPX_`^\ZXXWXZ]_`bdeffedcbbccccccb`][Z\`cfikkkifdaaaaaa`^\YURQQSVY\_``^[YUTSSTTWXXWTSRPNKKNMMLMPSVUSPNNOOMMLLKKKLL`_^^_````_^^_acdddcccccccccccccccccccccccddeeedddddddeefggijmnqqpnlkjiiijkmnnmmkjjigghkllkkkjhgggghggggggffgjkkkjjjjmnmkihhikmmmmllmlkihhhghhgghhhhhghiijiijjihgghggggfedca^^`a^dedb`adc^\^aba`_^_`addddccccdefhjjkkkkjjjiihiheacfijjjjjjjjklllllllkjklmjhgghhhgfffffeeddcbbbbbccbbbccbaaaaaabbbba``_aceffffffdbbcccb``a``_^\\\_______^]^^_acbaaaa`abccdcddfggfdb`____`````__^^]]\\[ZZYYXXVUUWXXXWVVUUWXYZ[\]]]\\]_``___^_^]]\\[YXWVUTUUTUUUTSRPONNMLLKJKKIGFDCBCCCCB@>=<=>?>=;:;:9977788899988777666556678765445565533467765654433323444444345543455445677543334434445543345656788876555444568::999755678888875434457999:;;;;::9::::::::::::;<=<<<;;;;;;<<<<<;;:9::;;;<<<<;::9988899::;<<;;;::9:;<<;;;;;<>?@@?@ABCCCCDEEDA@>@DGJKIGGHIJKLLKJHGFDB@@ACDEEFHKMNMKHFFGHIJLMNNNMMNOPQQRRRSRQPNMKJJKMOQSUVVVUUUVVWWUTRQPRTVXXVQNNNPSUVVUUTSQPOPRTUVUUSRPONNPQRRRSUVX\\[YYZZXWWXYWSOMQX`a_][YYXYZ]_acdeffedcccbbccccb`][Z\`cfikkkifdaaaaaa`^\YURQQSUX\^___\YUSSSSTVWWVSRQPMLKNNMLMPSVUSPNNOPONNLLKKLL`_^]_`a``_^^_aceeedccccdddccccccddddddccccdeeeddcccdddeffgijlnpoonlkihhjjlmnnmmkjihgihlmmlkkjihhghhggghgggghjkkkjkjjmnmkihhikmmmmllmlkihhhghggffghggghiijiijjiihghhhhggedca__aa_cddba`fe^]_bbba___`abcbabaaabcdfhhjjiiihhhihhheacgijjjjjjjjkllkkkkkjkkkkjiiiijjhfffffedccbaaabbcbbbcccbabaaaaaabba```acegggghhfcbbbcba````_]\\\^^_^^]]]\]^_`aaa``__`abcdcdfghgeca`_^_`aaaa`__^^]\\[ZZZYYXXVUUWXXXXWVUUVWXZ[[[\\\\]^____^^^^]\\\[YWVVUTTTTTUUTSQQPONMMLLKKJHFEDCBBCCCB@><<<=>=<;::::98778999999988876656888987656556554466776565555554455555545665456555667864344454555654345677778:998665555678::999766778899976434457999:;<<<;;:;;;;;;;:::::;<<====<<<<<<<==<<<;:;;<<==<=<;;::99889:;;;<<<<;;::;;<=<<<<<=?@A@@ABBCDDDEFFEBA?@EILLJHHIJKKLLLJHGFDB@@ACDEFGILNOOMJGGGHIKMMOOONNOPQQRSSSTTRQPNLKKLMPRSUVVVVVVVWWXVUSRQSUWYYVSPOOPSUVVVUUTRPOOQSUVVVTSPOOOQQRRSTUUX]^]ZZ[[ZYYZZXTPMQYaa`^\ZZYZ[]_acdfffeedccccbbbcb`][Z\_bfikkkifdaaaa```^\YUSQQSUX[^___\YTSRSSTVWWUSRQOMLLONMLMPSVUSPNNOPPOONLKKMM~|zxvtsrrrqqpppqtvy{}~~|zxz|}~~~}}}~~}|z||}}}{yzzzyxwwvwxz|||{zyyyyxurpmkmmnnmkmqux{{zzzz{zzyz{|~~~}|{zxvutstuuvwyxwussvz|zumlnqsssuvy|}yxx|~u}}{}{zyyxyxxxz{zzz|}|{zyxvutwzzzzywxz{}|||}|zxxyz|}~ypa^dkpsttvxy{ysqzvwv{|~}wsnmopqstuwyyxwwwwwwvvutttsuvwxxupg`\[\[YVW[__`^XWery}{z|wuuuvy{|||}~~}|{{{|}~~ysnlnrrpruz{{zyxwvwxy{}~~}}}|zwvusrrqqqqrtusomlosvxyxwxwxxxz{{zyyxxxy{||||{{{z{{||}||}~~}}~}}~zzz}~~|{|}~}}}|{{zzxue`diow|||{zzzyzzz{xvvtuvx{{xx}}x~}|||{zyxwvwxyzyxwwwvutsssssqmkjpx}~~~}}|{{zzyyxyyzzyz{|}||||}}~}||}}zwuvx|}|||}}|zyxxz{{{{|~|{zzzz{|{z{|zxwwxwxxyyyywusqonpruyz{{zz|}}}}{z}}{{zzywtrpqruvul`WX^fdZWU^mqrpwz|ytssoglhfsyvuz{|}}{xuvvyz}vt}|{yxxz{|ymgimv}|wuzw}}vw||ndiroyxqlrz|hYpyyz}}zyyxuvvnmppooqssosyvsvwwxy|{z|}||||{{{zx}~}{xusqqqrsromqv{|}}{ywvwxxwusuxwttsuy|{wuvwxyz{}~~}|{~}zxwwvuuttssrstvxz|~~|zxx{}~~~~}}~~~~~|zzzz|~}zyyyyywuttuvyz||{zyxyxwtpnlkkllmlklptwzzzyzz{{{z{|}~}|zxvvttuuuuuwxwuttwzxqidgkorrrtvy|}{{|{xytplm{}{zzzzzz{zyyyyy{||{zywtonsyzyyyxyz{|||||~~|zyyyy{|}}ztlghoruvvuuqsz{smvwus|zwtsrrqpppruwwvvvwwwvutsssrtuvwwurkc]ZZYXWY]___]Y]lstwz{{sprstx{|||}~~}|{{{}~~{tlijnrsqqty{}~~|zyyxy{}~}}}~{yvuttssrrrrsuurommptwyzyyxuwyyyzzyxxwvvwz{{{{{{{z{{||}|}~~}}}~~~~}yyz|~~~~~}|{{{{ywwyyyxxxyvhchmsy{zzzyyyyz{||zwwvxz|~~}}~~}|||{zyxwvwxyzzyxxxwvuttttrld`akv|~~~}}|{{zzzyyyzzzzz{|}}}}}}}}||}~~zwuuwz}}|{|}}|zyxyzz{{{}|{zzz{{||{|}{wwxyxxxyyyywuusqqqsvy{{zyz{}~~~|{~}|{zzzyvsrrsvxxsg[WVZZXVYdnnjhqvzxvtssvxi`pusry{||{yxwutvx{~~|||{yxxzzyy|xqw{}xnixjswptx{zohoxx|zuqu{~}qhxzyz}{zyywwunqvupmnnjoz}{wuvy{}~|z{~}xvvyzyw{~~}|{xupnopqtrmkqw{}~}{ywvwxxwussuutssuxz{xwwxyzz{|~|yy|~|{{zzzyxwvwwwxyz{}~~}{yvz~~}||||}}}}{{yz{{zyvtsrtvxz|||zyyzxuromkkllmlkklosvyzyyyzz{{{{{{|}}}}|zxvwvvvvvutvwwvvvwwpkfimpqqqqsvy{}}~~z}{pc[Z`w}{zzz{{|}|yxxxxy{{{zzzwplovyyyyxyz{|}}|{{|||{{{{yzz{zvplpsyz{zyvpagztisxtr|~{zyxurolllptuvvwwxwvusssrqrstuuvuqi`ZWVVZ]``__^^isuppy{xqpsuwz{zyz{}~~}|||}~~}yslilqtusqsw{~~}}{zz|}~|}}ywssttttsrrrtutqnmmptwz|{{yqxzyxxxwwvuttuwxxxyyzyyy{||}}~}||{|}}{{{}}{zz{}}|}||{{|}|zxwxwwvuvxumhnsvyyyyyxxxyz||}|||}{{z|~~~}}|{zyxwvwy{|{zyyxxxwvvwxxunedlv{~~~}}|{{zzzyyzzzzzz{|}}~}}}|{{|}~}yxvuuwz~}zyz|~}{yyzzzzz{}}|zzz{{|}|}~xqry{zyxyyyxxwwvuuuwz{|{yxxz|~~~}}~~~}||{{zyvtstw{|{ti_WRRSU]ceffgosvwwulp~fYlwvv{|{{vuuvuttvxv{zw{{zxusqnhosotz~zo]qfr|ypowupwsqx{{}}zwy{z|ztyywx~~|yxxz|{ywsljjnmmjq|~xrtz~}yxzukjptwxwuy{{{{zwukdhlpusonty}~~}{yvvwyyxwwvsrstuvxyzyyyxxxyyz|xrigoy~~}||||{{{||}~}|zx{~~~}}|}~~~~~~|zz{}}{zxvuttvxyz{{yxyzzvqomllllmmllmoruxzyyyyz{{{zzzxxyz{{zxwxxxywvuuvwwvuuvupnjloqrqppqty{}~~~}vh[VYaw~|zyzz{{|~}yxwwxyz{{{||{wropsvxxyzz{}~}}{zz|}}}}{yxyyxursx{|wo`g{qmwxwt{~}{xsoljilrtvwwwwvuttutsrrsttuwwvof\VST[aba`__eqyyrrz|wwxy{}~}xvwz|}~~}|||}~~~~~zuolnsvxustw{~}|{z|}|}|zxvvwwwussrqstsqonnqtw{}~}|t{{zxvuutsrqrstvuvvxxxxxyz{|~~~~|{{zxwxzzxxxy}}}|{{}|||}}||~~}|zxwuuvwusptwxxxxxxxxwxyzz{{{{{wtsstuttx~~~~~~}{zyxwwyz}~~}{zyxxxxyz{|}xsoqw{~~~}}|{{zzzzzzyyyz{||~~~~}}|{z|}}zxvutvz}}zxx{}{zzzyyz{|~~|zzzz{|||}{pdguzzyyyyyxxxxxxyy{}}|zwvvxz|}}}}~~~~~}|||{zxvttx{}}|wnaURQSZ_bhoptuuuvvnuxfYk{|wstw{spquxxxtsrtw}}{ywvtocfhbbkv}~~}{kyvx{yvvxlsssuvv{}x|}y{}xxtqsz{|{xsqtvwwy~r]Ykssrrw~ytx}~|ytod\blsuwvtvuwx{xspf_bkosrruy|}~}|ywuvwyyxwvusstuvxyzzzyxwvvwxwvrjZU[b~~~~~~~}}~~~~}~~}|||{{|}~~~}}{zz{|{zyxwvvvwxyzzzz{|{vqnmmmmmnnooptvwyzzyyyz{|}}{ywutuvvvuuvxyzywuvwwvvusuuromnqrsroopsx{}}}|pbZZ]iy}{yxyz{{||zwwvvxyy{{{||{yuqoptvxy{{|}{{{zz|~~{ywwwvvwy|ysqw~zssvvvvx|~|zupljjkpuwwvvuuuuwwvvuuuuuwxyxupi]RQ\cc_`aaht{}{{}}{|}}~}wtux{|}~~~}|{{|}}}}~|xsoquxzxvuwz}}{z{}||||zyvsrrqrsrrqppqtw{~~|}{xutsrqpoprsuuuvwwxxxxyz|~~}|{yvqqsuwxxy{{{{{|||||}}}}~~zvuwwxwvtwxxwwwwxxxwwxyyyyxwvutsronmknw~~~~~~~~~}{zyxwxz{~}{zxxyz{||||xvvwz}~~~}~}||{{{{{zyxy{|}~~}}}|{|~}|xvvwz}~~{yx{~~{{|{{{}~~|yxyyyz{zzqa_\myyyyyyyxxxyz{|}}~}|yussvyz|}}}~~~~~}}||{zxuux|~~~~{qaVRSVZaluzxwvvwwxyvrhfqyxncciuqlpvxxxsrqiiz~{xx{yxvwvrqrvz|~~~{}|{{|}}{rsrvptwz}}y|~}{xsqqsux{zrgjpnnprwtijtzzxvx{}~|xz~~}|zwrjcbfkmuyywncoxzuh]fmlnprqtz}~~}|{xuuuvxyxwutrsuwxxyzzywvvutvwukbbcadd~}}}}}}~~~~|zyz}}|{yyyyz{|}~~}}}~~yvz{{{{zyyyyyyzyy{|{wrnmnnnooqstwyzzz{zyyyyxx{{zywtrpqqrrrsvyzywvwwwvutrstqonpstutmlmsx|}~~xj`^`cpz}zxwxzz{|ysqvuuxzz{{||{{{yvqopqvy|}}}umrxz{|~{xvvvwxz|}~{xy||yxywvvvw|}{wsponnrvwvtsstuvyyyxwwwvwxz{zzxwhUPZcc]_bckt{~~~ztqty{|}}}}||{{{||||||}}{yurrvy{ywvwz|~}}~}~~}|yvtrqpqrrrqqprtvz~}{xtrollknqtuuvvwwxxxyyyz|~~~}{zxuuwwyzz{zzzyzzz{{{|}}}~~}xwxxyxwwxyyxxxxxxwvvwxxxwwvvxz{{yurmmr}~}}}}~~~~~~{zxwwyz|~}|zyyz{{|||{yxy{|}~~~}}}}}|||||{yyz{~~}}|||}|zyy{|~}{{|~}zyzzz|~|ywwwwxyyui\b_lyyxyyzyxwxy|}~~}}|zwtrsvxz{|}}~~~~~~}|{zwvx{}}}~|yrg\UUXboy}}zxwwuqkd_Ydtog`YYYeigoxyxxuvxpjy~|zyy{vsy}}{yxy{|~~}~zplpox||{{zzzzyxvssvwvy{yljleipuvxzxz|~~{vrruwzzy{|zywvspoqqnosrrvldpvyucXiurrrrpv}~}{yvtstuwwxustwyyyyxxyzzwtuvwxzxpjjmotp~}}}}}}}}~~~}yvtsu{}{zxwwwvwxz}~~}}}~}{|{{|||}|{zyyyyyyzzwtpoppppqswy|~}}{zzzyzxwvwxwvurqonooppptxzyxwxxwvtsrssqpqtvwwtlikqx}~~~~||}}~}shceghtz}~zxwwxy|}xpknruxzz|{{zwxz{zwroouy|wgk{||~~zwuuvxz|}}}~}zzzyzyz||zxwwy}~|xtrqqrtuutsrrtvxz{zxwvwwxyz{{zz{q_SWbd\]cfmtz|}~}ytsvz{|||||{{{{||{{{zxwwwvurrvyzxwvvy|~|z{{}}||yusrqqrrqqqqqrtvz~~|xsojegkosuwwxxxxyyyyzz|~~||{|~~~|{zzz{{zz{{zzzyxxyzyz{|}}}}~}zzyyxwxyzyyyxxxwvttwwxwvvvwz}~zsppty}~~}}}}}}}}}}}{zxwvxz{~~~}}|{zz{{{{{{zzz{}~}~~~}}}}}}}}}}|zzz|~~~~}||||||~}{{||}~~~}}~|zxxwx{}}zwvvvvxwtmjnntyyyyyyyxwwy|~~}||{yvttuvyz{|}}~~~~~~}|{xxy{|{||yrmleYUYamv|}}{zyvpjg^Q^p`WVX[TW]frtmhinpqqp{}|{|}yvy|~}|||}}~~~~~~~}}}ongu|}|zzzywussuvxz|yz{wktrdq{~~}}}~{qgcgjmtxyyvtttuuvxyxvsrqjhqvstqebpuquuvw{}{ywuutsstvwvsvz|{zyyyxy}~|zz{{{{{||yyzu~}|{{||}~~}|ywtrqu|~~|zxwvuttux{}~~}}}}}}{zzyy{}}{zyxxyz{yxvuttsrrsvz|~}|zz{zyxwxxxtpnoooonopopty{zxxyxwvtrrturqtyzyxumjjpv|~~}|||zz{{}}|pkklmlsvz}|ywvvwz|{tmkqwyz{||zuopw{|zvqquy|{wv}{|}}yvuuvy{|}|{|}|zyyzz{{|~}{zzz|~}{xutstutsrrrtuuwxzzyxwvvvwyz{{z{{yn\V`f[Zbkrw~~}zxxz{|{{{{{{z{|||{{zyurpqqqqrtxzyxxwy|~~}{uuwzzyywtsrqrrrqqqqqrsuy}~}{vrkehosvxxyyyyyzyyz|}|zxyz|~~{zzzzzzz{zzzyxwwyyyyyz{||||}{zyxxxyyyyyxwwvustxzzxwvvwy{~~zvtquz|}~~~~~~~~~~}}}}}}~~}}|zyxxxxy{|}}|}||{{{{{{{{z{{}~~}}}}}|}}}}~~}}}{{{}}~~}}}||||||}~}}}}}~~}|{zz|~~}ywvuuuutstvwxyzzzzyyyxyz}~~}|{ywvuvvwyz{|}}}}~~~}||{yxz{|{zxwrjb[WUX`kty}}}}|zunkjWYeWQSW[VW[gnh[_jrsivx{|{|}{}{y{|}}}~~}}|}}||}}~zsu{|vqq|~~~}zy{zxwwwy{}~yyyvpyxpy|}}{{||~|tfXV^gintxwtppsuvwyyuplpn]fxuroljnxvsvwxy|}}}{xvtuwwvuuwxuqruxz{zyyyy|~~|{|zutv~ywvw~~~~~}{{{{|}}|zywussux{|~}{zwutrrsuy|~}{yxwwy}~|zywxz{{zxvxyxutstx{}~}|{{zzyyyzzxsomnnopppqqquz|{{zzzywtssvvttx||zxvnikou{~~}{zzzzz{{}}}qnpvnrsrwy}~zwvuwyz|wtsuwyzzzxsnilu{}}zvtvy||||{zz|}}}{yvuuwy{|}|{z{{{{zzz|~~}}|||}|zxvuuuusqprtvvvvvwwvvuttuvxyz{{{||xk[`g\Yanuy~~|yzy{{{{{{{{{{|||{{{zxtroopooptv{{{zxy}~{zz{yvuwxwwwvsrqqrssrrqqqrsux}~~~~~}{wokmswyyzzzzzyzyy{}{ywwx{z|}zyyyxwxyzyxwvtuvyzzyyyz{{|{~~|{yxxxyyyxxxvutttv{|zxwwvwx{|}yttx{{||}||}}}}}}}}||}}}}}}|zzyxxyzz||||}}}|{{{{{zz{{||}}}|}}||}}}}}~}}}|||}}}|||{zz{|{{}~~~~~~~~~}|}~~{vsuxuutstwzzzzzzzzyyzz{}~~}|zxwwvwwxyz{{|}}}}~~}}|{zyyy{{{zvtrg\WXX[aepy|}~}}|xqjkfc]TRTY\_`^Y`kmsx{zwxyzzy|}||zzz{|}~~||{|{{{||}|{|{zxuy~|wy}~|{yy{}}{ywvz{{{}||{{z{~}ypa^\dhjnsvtqnoruvwxwtpllfboyurolosxvuwwwwuy{zzvttuxywvuz}tmmpswzyxyzyxxz|{|zsigptrppt~~~~~}}~}{zz{|}~}|{zywvvwy{~~}zxurppquz~|zxwvx{}}zxxy{}|zwwz|{xwvwy|}}~}|{{{zyyyzzyxsnllmoqrrrppu{}}}||{zxustz|zz~zxwrllpu|~}}{yyyyzz{{}|ynlr{rzsotwz}~{zyzzz{zwvwxxuponkjimv{~~|zyxz}}{||{zz|}}{zxwvvwy{||{{zzz{|||}~~}|{||{zyxwwvusqrtwvutsssssssssuvxyz{{||{{xe_kfZ_v}{~~}zyyzzzzzz{{{{{{{zzyxxzxtpooonnrtz~}z{~~{vtxxxxyyyyxwtrqqrssrrrqqrsux|~~{vstwzz{{zzzzyyyy{~zyxxxzxx}~{wwwxxvuwyxvsrqsx{{zzzyxyz|x~}{yxwwxxyxxwtsrs{}{ywwwwwz||zxxyyyyz{|||}}}}}}}}}}}}}}||{{{zz{{{{{|}}}||{{zzz{{{{{{{{{{{|||}}}}}}}}|||}||{||{zzzzz{~~~~~{tuwvvutqooxzz{{{zzyyzz{|}}|{yxwxxxxyz{{{|}~}}}~~~|||{zzyyyzz{ysqsnhimmosw|{{}}}}{ywtsqpiffiorvsnely||~{xttyv|}}{ywwyz{}}}||{{zz{|~~}ywtvx}zrrz~|ywwy~}{z|~~~}|{{zxw|{voqvooooruuolopstuvvtstvvomxyttqqwvvvvxxtnmrvwvtstvyz{zwutquwsqtxyxwxtqpruwyzumluyumhj~~~~~}}~|{{{|}~~~~}}}|{{zz{|~~zwurppsw{~}{zzzz||zxxz|~}zwvz}|zxwxz|||||{{|{zyxyzzyxsnlkkloprrpquz|{{|||zxvvx}~}||xxyvonrw}~}}|{zxyzz{{{|}{unpw~ztpsvy{~~}~~}|{yxyyyrf`dhimtz|~~}|{zz}}||||||}}}{yxxwwxz{zzz{{|{|~~~}{xwwy{{|||zywutsuwwtrpoopppprsuvwxyzz{||{|{pakq_`u~|~~}|xwxxyyyyyyzz{{yz||wuw{|xtrqpnmprx~}~~~}wtvwxyz{{{zyvsqqrrrrqrrrrstw{~~}yxxy{{{{zzyyxwwx|zyxxxyyyz~zvtstwxvuvyxvsqpruyz{zzzyxx|w|~}{yyxxxwyxxwtsst}~{xxxxwxz{~|zyyyyyz{|||}}}}}}}}}}}}}}||{||||||||||}}}||{{{{{|{{{zzz{{{{{|||||||||||||}|{{|~|{zzzz{~~}||}}}~~~~}~~~~|zwvvvurojwy{|{{{zyyzz{|}}|zyyxyyyyz{{{{{|}}||}}}|||{{zzzzzz{{xuwxx{|{z|||}||}|{zy{|~yxwwy|~zy||z|zxyxr{|snruxxz|~~}}}|{{z{|}|||{ywvttz{qqwz|}xsv}}|}}~}|{{zzxvxxvt{|qpptwunikrturnnmkpuy|yvyvvvtszxvuwyyslkptvvtstwyz{{yqkoy|xusvxyxvronoruy{zyy|~yi^]~~~}}}}~~~~~~~~}}}~}{yvsqsvz||||}~~~}|{{|zxy{|~|ywwyzzyxxyz{{{{zzz{{zyxyz{zxsnjkkloqssqrtxywxz{|{ywxyzyz{|{xtv{zpnu{}}}|}~|zzzyz{||||||{tw}~~xtuvwy{~~~~|{z{zzuh]_dhr{~~~~}}}||}}||}~~}~~}|{zyyyyzyvwy{|~||~ywtvxvvy~{xwvvxyupmllmmnnpruwwxyyzzz{|{|zvjnyfcv||}~~|zwwwwxxxwxxxyyzyzyvw{|zwutrooqrux{~~~}}zvuuwxzz{{{zwtrqrrrrrssssstvy}~~|{{{{{zzyyxwvvwy~zywxxz||z|}~~~wrqprwyxvwywvtrppptxzy{zzzy}|{~~~~}{zyxxxwxxwvtttv}~|zwxxxzz{|~~}|zyyyyz{{|||}}}}}}}}}}}~}}}|{{|}}}}|||||||{{{{{{|||{{z{{{|||||||{{{{{zyyyz{{{{}}{zz{{{}~}{xwy{|}~~~}||}~ogltwwvtpwz|||{{zyyyzz{}~|zzzzz{z{{{{{zzz{{{{{{||||||{{{zzzz{|{ywuvsqquwzzz{}}|yttzxx{{}{{z{xvx{{yy}~~~xr{}potxyxz|~~~~}}}}|{{||}||}~}|zxrw}}zwvuwz|}|ww}}}|z{zzzzyyxvwxxwzwnpswxumlqvvpf^]YYiwyzyvtpttuuzxwvvxxvpnrstsssuwxyxwytnrrsvwutuuuuuuutuwz{|{tpprkee~~~~~}|zwuvx||yvrv}~~~~~}}}||{zz{||}ywxyxxwwxz{zzzyyyz{zzywyz{{ytpmlnpsuvurrruvuvxz}|{xyywuwyzwuru{zrpx|}~~}|{{}}}|zyyyz{|}|}}|yt~{yyxwwxy|}}~~}}~~|zy{zzxrdacmy~}}}}}|}|}~~~~|{{{{zxwrsx|~||~|xwuvvsuw~{yxyzzytmjjjllmnqsvxyyyyzzzzzz{zytuzpmx||}~~|{zxwvvwwwvwwwwxxxz}~yxxy{{xwutqqssror|~}|}{tttuwyz{{{{yvtrsssrrstssstux|}~~~~~{zyxyzyxvtuw~~}ywwwy{{{{|}}}~~|upoprx{zxxxwvusqonqvwy|{|}y|~~~}|{{{yxwwwvvvvvwxy|}}{zvpox|}}|}~}|{zyyyz{|||||}}|||}}|}~~~~}}|||}}}}}||{{zzzyzz{{|||{z{|||}}|||||{{zzyxwutsuwxy{}{yy{|}|}~}|zwwxz~~~~~||{}va[mwx{zwy{{||{{zzyyyyy{}|{{{|||||||{{yxxyyyzzzz{{|||||{ww{ywy|zuokmompszwy{}~~{vty|tty{|zwxyursvyz{}~}~~~}}|sqw|xxy{{||}~{|~||}}}||~qlvwyzxqw{vwz{}}}{}~}|{xxxyyxxyywwyzzyuprtwyxpswythXPMHLeyzzyvrptvxxyyxxxxwwsputpqrsuvwwwwwvrqquvvsqmjjnpqvy}~~wqqlghqtuu~~~~~~}}}}|{zzzzyvspsz|}}~~}~}}|||{}{z|ywxyxwuvx{|{zyxxxyyyxxxy{||zvsrsuvxyxvsqqrsstvy|||zxvwvwxwutqtz{tx{|~~}||zz|||{zyxyy{|}|}}{xr}{{yvtssvxyyywx{||zy{zzzyshcv~~~~~|}~}}}}{zwuqtz|{||~~}zyyxwvsrrtx}}{zyy{||ytlhhjlnoprtvxyyyyzzzzyyzzzyzzwwz{||}~~}{ywstuuvvvvvvvvvwwwxxxwwx{{ywuussvvvppy~~zrstuvyzzz{{zxvttttssstttttuwz|~~~{yxwy|zwustw|x|zwvvvvy{|}}}}}}~}}~ztqpqty{zyyxwvuspnmotwz}{|x|~~|zz{{zywwvutuvyz{||||{|ypmy~~}~~}}||{{zz{{|||||||||}}||}}}}}|}}}}}}}}||{{yxxxwxxyy{||{{{|}}~~}|||{zzyyxvtrojjnprtvvuv{}~}}||}~}|zyzz{~}~}|{}|aWiwy|}{zz{{{{{{zyyyxwy{||||}}}|||||zxwvvwwyyyzz{{||}~~slttjgpywrmptpru|z{}~}z}{rrwz|{zzzwrprw|}|||}|{zxz|{tqoqvxz}|yrt~|~|{|}~~|yse]lzzyxw~zwyz{{{y{||zyxxyzzzzzyxxyzz|ulnuxzxrvzyq`QKGAHdyzz{yvuxz{{zyyyywusruzytqpstuutsrttqnnsuutoifgjlnrrvxwploolovz{{~}}}}~~}}}~~|}~~}~~~}|{wtuy|}~~~}}|}}}||yxzywxyxvsux|}||zxwxyzyxwxz{}}|zwxz{|{zywtqpoqstvx{|}{ywwzywvtsrtz~{}z|~}||{{z{{{zyxwxyz{||}}zxq}|z{zupnnpqttssuy{{yyzz{{|}sh{|}}}||{zwurw}|{xwy}~~~~~}{yxyxxvspoopw{yzzz{}}|ztmhhjnprstuvvwxyyzzyyxyzz{z{{zzz{{{|}~~|{xusuvvuuuuuuvvvuvvwwvvvwzzywuuttwx{zwywuuuuvxyzz{{{ywvuutsssssssstuxy~ywww{~|vtrsw|{wuzywvvuwz}}~~~~~}|{zywsrrsvy{zyyxwvtsqooqux{}||z~~}{{||{zxxwuuvwz||||||}}|wv{}}}~}}~}|{{||||}}}}}}}}~}|||}~}}}}~~}|{zyyxwvuuuuvwxyz{{{{|}}}}}|{{{zyyyxvtqnggjnpqrsrry}}|{{{}~~}{{{{|~}{|~~}{{xhhqyz}}{{zz{{{{{zyyyxxz{}}}}|}}|||}}zwuttuuxzzzzz{{||pfqwohkooppv{yz|~|}~~~~~~~{truz~~}||zxtv}|xxyzyywvvxz~vljvx{~tu|x|}|{{}~zrsqspuz{zz{{xyyzvstw{}}|yxz{{{|{{zzyxxyzyoiijpwwrvzynZONIAIfxxxz|{z{|||{zzzyvrosxvrqqqttsqmkkprsqprtvwtpmkmpqodgpoptwutwzzxv}|{{{}~~~~|{xxy{~}}~}~|vsvz}~~}}||}~}}|ywxxwwyxwtux{}}|{zyxz{yxwxzz{||{{{|}|{zxwtrppqsuvvy{||{zz|yvtstsv}zy|}{z|{zzzzyywwvwxyzz{||{zs|zyzzunkkjknoqruxz{zzzz{}}}v}}~}zz{{{zxwvy}}{wtvy{|}~~~~||{{{zwupnnnvzz{|{||{ywtlhikprtuwwvuvxyzzyxxxyz{{z{{|{{{{zz{|}~~}|zywvxywuuuuvvvvvutuuvuuvvwxxxuuuuuwz||{~xyxwwwxyz{{{{zxwvvutssrsssrrtuv~~wvwy}~wtrsvxwsryxvuvwz}}~~|{{xusstuwyyxxwvvuttrprtwy{}|}{|wwx|~}|{|~}{yxwvvwx||||||||||||}}}~}z}~}|||}}}}}}}}}}~~}}}}}|{{yyxyyxwvvvvuuutttttuvwxz{z{||||||{zzzyyyyxwuspmnprsrqqppw{~}|{zz|}~~}}~~}|||||{xy~~}zxvt}|}{}~|{zzz{{{zyyyyxyz|}}}|{{|{{{|{xtsstuvy{{z{z{{{|~}qkw~~ysfbgnx}~~~~~~~~~xuv{|y{yzxy}|yy|}~}zz{{yz}{z{}|~~~wlxywy{{teps|{{zyxv|}x{|zzxuvy|~}}||}}}||||{zyxxxxuhekiqzwqv}|lVPRMDLgvuux{{zz{|||||{ywutuui[[hquuroighoquyxvwxyxurppqsunqrpt{xwyz{zrh}{{||~~}|{xusux|~~}}}xtuw{}}}|{|}~}||zyyxwxxwwuuwz}}}}{{z{zyxwxyyz{{||}}||{yxvusssstvvvxy{{zyyyvtrstuzrw|~}~}{z{zyvrrtuvwxyz{{|{{x}zxzzvojikklklptx||zz{{}~}{utwz{{zyz|}}}}|zwvvvwz|}~~}}|}}}{zxvvvx{|~~|wuvurliimqsuwxxwvuwxyyyxxyyyzzz{|{{zzzzyzz||||{zyxwyyvutuuvvvuuttttuuuuuutuxuvvvvvx|}z{~yzyxxxxyz{{{{{zywvtsrrqrrrrrrsv}xx{~xtstuvvrqwzwuuwyzz{{~~}}}{wvuvvvwvvvuuutttrptxxxz{z{ywtsw{}}|y|}zxxwxy{|{{{{{{{{{||}~~}||{xtpu|}~}}}~~~~~~~~~~~}zywurpononnoqrtuvvuuutttttttuvwxyyz{{{{{{zyyyyyyyxxwuuttuutrqpopvx||{zzz{|~|{}~~}}}}|{zz~~|yxv{||}}|zzyz{{zyyyyxxyz{|||{zzyyzyyxtrstuwy{||{|{{{{|~|vns{|xqigmu|~}}~~}~~~~yw|~yw{wtz|~}}~~}{{yv{{}zz{}utz|yx}yuvxvvy}}~|{{{zyxyzz~{zy{{||~~~~||~~||{yyxyyukhmkpvsrx~mRQRMERmvvwy{{yz{|}||}|zyvwvsiRLZszutplkmuvwzzzzzzzxvurqpoqtssuxwy{{|{pZ~~|zvssvy}~~|{|~|xtruz}||{||||{{{{zxwwwvvuuvy|~~~}}}{vuvxxxxyz{|}}}|{yxvvvvvvwwvvwxyywusqnnotwx|~swtwy{||{{zxrgiotvwxyz{||||{~zxzzupmlqvwsstvz}{{|}~{||z{{|||srvz||||||~~}{zzyxwwuuxz|~~~~~|{|~ulptspljjnrtvxxxxxwwwwxxxxyyyzzz{{{{{{{zyyyzzzzyyxxwvvuuuuvwvvutsssstuuuutpqxwwwvutuwyxx{~{zxwxxyz{{{{zzyxvtsrqpqrrrrrrv~~}{{~zutttuvsqu{uvuuwyvtuz~}}||{yzxvsrsuuutttsssrpuzxwyyxwxsqrux{~|{z|~zxxyz{|{{{{zzzzzzz{|}}|{ypf`boz~~~~~~~~~~~~~~|wpmifcdfilmpsuvxzyxwvvvuuuuuuuuvuvwxyyyyyyzzzzzzzzyyxwwwwwvurqppqtwz{{zyz||}~~~{y|~~}}}}}|||}~~~~}{zz{y|}}|{zyzzzzyxxxwwxyz{zyyyxwwxwvtstvwxzzzz{{{{{{{|~{rkrtrrsvx}~~~}~~~~~~}~}ws{{{{}~~|ztz~~~}pbgiekv{}~~{xwwux|~}|{{}}~|zy{~{yxyz}}}~~||{zyyyyvpnqmehhu~oNJLFEYsyyz||zxz{|}}}~}|{yxtqkSISkyxwvsrsyzyzz{{zzzyyxvronsxxvuvwz{z{|zh~~}{vstwy{}~~|yxz|~{urty||{zzzzyyy{||zxwvvuuuvx|~~~~|zwrqtyyyxyy{{{||}{zxwwxyzyyyxxwwwxvsnlkmt|~~vtklmosuwxwupbajrwyzz{|}~}||~ywyxropsw|~yussw{||{|~}zyxvwxxwwux{z||||}}~}|xwwxwwwuuwz{}~~~~|}nhnrqolkkosuwxxxyyxwwvwxxyzzzzzz{{z{{{|{zyyxxxxxwwwxxwuutwwxuwxuttsstuuttsonx{yxvustuwwvw|~{ywwwxxyz{{{zzzxvtsrqppqrrrrqt{~~}}}wvuuuvtruxtwwwyzwvw{~|{{{zz|zwsoptuutttsrsqquyxwwxwusppswy}~|z{}{yyz{||{{{{zyyyyyz{}~~~}|qfadoz~~~}}}}~~~|vkd`^]`ekptwz{||}}|yxxxxwwwvvuuuutuuvwwwwxyzzzzzzzzyzzyyyyyxvtsrrsuvxyzzyyz{}}}}||}{wz~~~~~}|||}}}}}~~~~~}}~~|wqt{}}|{{zzzzzyxxwwvvxyyxvvwwvvvvutuxzyywvtvyz{{{{z|~|sfinorwzz{}}~~~~}|{vx|~xqxz}xw|~~~~~~~}{wz}}x`QTQ_ltz}~~}|~}{yzzy{~~}{{|}|{|yzzyywxzz{xw{~~~}}{{{zzyyywuuwpd]d{sYKHGQgxyxxyzzyz{}}}|}}}{yvrolWNTbuxxzyxxzzzzyy{{zzz{zxutux{yvtvx{{zz{~{zvvvvxy|~~}{xwvy||yvux{{{{ywvusuy{{zyxwwvvwwy{}~~~|{xurpquxxyzyzz{{{|{zyxyz{||{{{zxwwxwtomlryzskfdehjllmnplggkqz{{}~~}~yvvurqqtxz{somlpu{}|}{y{zyyyyxz~{z{||||}~}{wtttvwxwwxz{}}}}~~~~~}|{~qqrqpnllmptvwwxxxyxwwwwwxyzzzzzzz{zz{{||{zzxwwvwxxxxxwuuuxyyxzzuttttuutsrrqov{yxwvttuvvuuy{~{yxwwxxyz{{zzzzywutsqppqqrrrrsz~~}}}~utvvvvuuvyxwyz{|}}|}~~}|zzzyyzyxwqqsttttssrrqruwwvvwxvqpsvzx{}~{y{||}|zzz{||{{{{zyyyyyz{|~{vsrv~~}}}}}}~~{qc][\_gpvz}~~~~|{{zzyxxvvuuutttttuvwwwxzz{{{{{{zzz{{zzzywutttvvwwxyyyxzz||{zyz||vx}~~~~}||}}}}}}}}}}}|}}}}~}odhrz|||||{{{{{zyyxwwwxyywuuvvuvwwwwxyzxwvtrquy{zzzz{}}{umjopruwxz{{{{||~~|{yxtot{~~zy}|}zy{~~}}|{{|}~~|zz{}|{rWAGPmqsy}~}{|{xz}zwy~~}|{}}||x{}yxwtpfenuz~|||||{{zxyyxxywpgo}|rh[V[lxzywvwyzzz|}|{{{|{ywurkkZRUatuyz{{zzyyxwx|{zxyzzywvwy{xrvxz}}{{}~{xvuwvux|}{yvuwz}zwuvxz{|zxuusuy{zzyyxwwwxwwz|}~}zxvtrpqtxyzzzz{{{{{zzyyz{|}|||{zyxxyxupnrw}|unkigghgfeipsnf`dqx{~~~yuutssrsz}xpppptz|||}{z{|}~~{z{||{{{{|}}}{wtrruwyyz{||}}}}}~~}{zzzyy{|tzvqoonnoruuvwvwwxwwwvvwxy{{zzzzzz{{||}}||{zyyxxxyxxxvuuvwx{|~|vrrtuutsrqqrquxyzywwvttvuuwx|~{{{}~|zyxwwwxyzzzzzzzzxtsrrpppqqrrrs{~~|x{zjouuwxwwxz{z{|~~|{zyyxxwwwwxusqsssrrqqrruvutuxzystxz|yxwyzxy{{|||z{{|||{{{{zzyyyz{||~}}{|}~~}~}}}}}}~~{qb[[airy}~~~~~|zyvvuuuuuuvuvwwwxyzzzzzzz|{{zxwuuuvvuuuvwwwwwwxxwyz{{yxwwyyvwz~~~~}||}~}}}}}|||{{|}}~~{niovyz{|}}|{{||{{zyxxxzzzywvvuvvwxzzyyxxwvvtruy{yyyz{||zwtprssttuxyyyxw{}|}~~~}{yzyxvwz}|{{}~~}{|}}}}}}|{||~~{zz{||}{iPR_osty}~}zyywuw|wuz~||~}|}}}yyxxxvrhekqw}{}~||{|{zzyyzzywtx{ylefefmttrxzwwy{zz{|{{{{zywttrli^QYdrwyyz{zzywvvx||vnlrz|yxw|~yuz||}~}|}~|yvvz{|~}zyxwx|}{xuuvy{}}{wwvy}|zzzyyyyxwvvx|}~}yusrrrsuxyzzzz{{zzyyzzzz{||||||{zyyzytqpv}~wrpnllkkjgkrwzrdafqz~~~{wutuutryvqmmpruyz{|}~~}}~}{z{|{{}~}|{{{{|}}~}|xsruxy{{|}}}~~~~~~}{wuvvtw}}|~xrppqqstuuuuuvvvvvvvvwxz{{{zyyyyz{||}}}||{zyyyyyyxxwuvwyzwrruvvtsqpppruvw{|z{xusuuvxy{}~~}wvxyz{zywwwwyyyyyzzzzxtsrrpppppqrrt|~|uu}udjtuxzyz{~~}}~~}}}||{zyxwwuuvw|ztrsssrrqrsstutsux{zvy{|~}zxvvvxyz||{{{||||{{zzzzzzzz{||~{wwxy{~~~}}}}}~{oa\`jtz~|zwvvuuuuuwwvwxxzzyyyyyyy{{zwsnlmoqsuuuvwwwwwwwwwyyzxvutuvvvvy|}}||~~}|}}}~}}~}|{zzyz|}~}|xw{|{xyz|~}|||}}}||{zzz{{|{ywvvvvvx{{zyyyxwwwvxyzyyyyz{{zxwvvuuuttwxxxy{~|y{|}~}}||}|{yxy{{{}~}}}}}}~~~~~}{z{|{vw|wtqoqsuy||zwwzzxv{|~~~}~}|{zreccnuz{zysoprw|}zy}~{{{}~}{zyzzyzz}raaimoqpliqzyxz{{{||{||{yvussttneVbksxwuuwxxxvttvzzxtmdluwtw|}|yz|}~~zuw}~|zyxxz}~|ywuuwz}}zxw||zyzz{{{ywutwz|}{xsqqstuuwwxxxyzzywvxz{{zzz{zzz{{zyzzwsptzxusqpooppnouzsibisy|~~~~|xustvzzyuqqmnqqrvyz{{{zxxz|~~~|{{}~}|||}}|{{{{||{{|~~{urtwxy{|}}~~~~~}zvtrrqw~|tqqqstuvuuutttuuuvvvvwxzz{{{zyxxyyz{||}}|{zzyzzyxwxwwy{~zutvvvtsqppqsuutvz~|wtrty}~|{z|||zvvwwxxyyyyzz{yvutsqqqqppqsv~}}}y~{m\eqvy{{|}~~}~~|{yz{{|{zyyxwuuvy|{wttttssrrssttrsuxzzx{||}~}zwvvvy{{{{|}|||{zyyy{{zzz{{|~|||||~~}}|}~{j``ju{~}zwvvvvvuuvvvwxyyyxxxxxxxzzxslghijmruvvwwwwwwwwxxxxxvsqqsuuuvxyzzyz|}||}}~~~~~~}{yxxy{}{yty}zy|}~~}||}}}~}|{{{{{{{zxwvvuuxzzyyzzyxxyyyyyyyzzzz{{yxxxwvvvvxxyy{|ztvy{}~~}{{|~~~}}}}}~~~}|}|z{}}{uv||{ywuuwzyyxts|}wy~}~~zz{|ynjstovz|{zytsux{wst{|yy{}}yxyyxz{~xpnrstusmggu}{z{{|}|{zzywtsrtwyvpbmquwsonqtwwvtrsvwy{r_Y^fkryxwywwz{|}}~~}urv|~|{zyvvz~}{xvuux{~~|ywxzyxyz{{||{yxwwy{}{vrpqtuuuttttuvxxvtuy{}{zyyyxxxyzzz{zwtsx~}yvutsrqpppquy~rdbgnx}~~~~|xtrsopxyzzxtx|{xy{zyxvttux{~~~}}~~~|z|||}}}}||}~}|xvx{{zvusuxyz||}~~{xvsppzzsppqtvvvuvwwttuuvwvvvwwyy{{{zxxwwxyyy{|||{zzz{{yxwwvz|wuvvusrpppsvwxsryzvrw~~{{{|zwwvwvwxxxxyz|}~}|yrrrrqqqsw~~~~xqu{n]dv||}}|}}}}||}}||{yxwyzzzyyyzyxwwxz||zwvuuttsstttsrsuwyxyzzz{|}}{ywutvzzzz|}~}}|}{z{{{{zzz{|~~}}}~~}||}zgbkv}}{zwwwxwwvuvvuvwxxxxwwwvwxyzxrjfhgiotwxwwwwwwwwwxxxwvtpnoruuvvwy{yxxz|||}~~~~~~}|zxxyy{}|zy{}{{}~~}|{{||}~~}}||{zzzzxxwvuuwzyxwxyzyy{{zyxxyzyyzzzzyyyyxwwwxxyz{zzxstx{~~~}||}~~~}|}|{|}}|{}}zyyxyzzuxtr}|y{~x|~}~ysw|}|v{{xz|~{xxwwvxzwtv{ywxz|}~|zyyxuvtty||zwyyttxvpit~|||||}}|wuvuttuwy{{znqtwvrmlquwwvuuuuvwwtgRIVgrzxuwwvsoqz}~~~~|wtu|~}|zxuv{~~|ywutvy}}|zyxxxxxz{|}||{{zxy}|z{rpsuutqooprrrsrqqty|}|zzzywwwxyz{||yvu{|xwvwwtrpoppsu}~sfa_ap|~~~}~}{xsqrqrtvyzxx{~}{|{{{yxvvw{~~~~~}|wz~|}|||}}}~~{upswxxwwrvz{{{|}~~~~}zwtqr}|{vroquwwwxz|zxwvvwxwwvvwxyzzzzyxwwwwwwz|}|{zzz||yxwwu}yw}xvwwtqppqqtx|}zy{~{z|}zyzzywwwwvvwwwwwvz|{vuspqqqrv}~~~~wlmvxmpz}~~}|{{{{{{zzyxvvvyyyxxxxz{zzzz{||zywwwuuuuvvutttuvxwxyyxyyz{{xvusuxyyz{}|}{}{z{{{{zyz{}~~}}}~~~~~~~~~~~}}||{xfk{||zyyyxwwxxwvuuutuvwxxwwwwvwxy{zumffgmsvxxwwwwwwwwwxxxvvtpmnquvwwwyzyxxz{||}}~~~~~|{yyyyz|}~~}|}~}{||}}}|{{||}~~~}}|{zzyyyyxvuuwzzvros{z{||{yvwxyyxyyyyyyyyxxxxxxy{||}xtuy|}}}}~~|{{}~~~}~}}}}|}}}|}~~|{zyy{zyxwxyx~~~||}vytmrz}~}}~}{}~{wwxxwxzzxxzxvwxz{{yvuttsqkhnvyxvwtjlvyvsw~|||||}}vstttuwy{|{wrqtvwqknuvwxwwwvuuuxyr_J[nqtxxyxvoghruy|~~}}}~|{~~|yx{~~}{xutuvxzz{{zyyxyz|}~}|}}}{yz|}{rqtwvtpllnpqpqponqw|~}|||zxxxyz{|{{zyz~zwwwyyurppqqpn{xpgfd`kw~~~}}}}{xusssssuxxwwy{|yz}|yy{~~|}||{vy~|{{|}{rlotwxxysx~}|}}}}}~}zxux|}~}yspquwyz|~|zyxxyyxwwvwxxxyyzzyxxxwwwz}}|{{||}|zzyytdXZn|{|~zvzyuonpstuz~zvvwxxxwwwwvuvvwvrnr{xvvz~{wqrrrsv|wjbgv}~~~}{xyyyyyyxwvuvwzyxwwwx{}}|||}||zyxxxvvvvwxwvuuuvwwwwxxxxyyzxutrsuutx{|zzsx|z}{{{zzz|~~}}~~~}}}}}}}~~~~}}}||zqjw~~}ywwwxxwwxxwvuttuuuvwwxwwwwxyz|~yqigluwxxwwvvvwwwwwxxxvvtrpoquvwwvwwwwxyz{||}}~~~}{yxxyz{}~~~}}{||}}|{z{}}~~~~}}|{zzyyyyxwvvx{|yrin|{{|}|yvvwwxwvvwwxxyyyyxxxxy{}~~{wx{}}|||}}~~~}||~~zx||{ss}~}||~~|{{{|}~}}}ytv~}~upps|}}}}}~~}|{~{xxzzywyyzxwwwwxxyyxsqpqqohdjsvwxxpeityyz{}}|||{|~}xssrsuwz|}yngjpstoloyz{zz{{zwuuzyvncowsotwzyvofdjnu{~~}|{{|}~{{}~~~}{zxwutuvwyzzyyyy{|~}|}}~|zv{|vqquxwuqnmorsstronory~~~~}{zzz{||{zz{}}xvvwyyurpoquuu|zojgijihny~}}|{ywuutssvxyxxz{ytrw{}~}||~~||{{zyz~|zy{|~{rlmrw{zxw~~~}|||}~~}{yzzz|z}{tqrvxz|}~~|{zzzz{zxwvvwwwxxyzyxyyyxw{}|||}}}~}zy|}}unnu|}yxz|v}}wqotwvwz~|ywwvwwwxxwwuttuwwskjpmov}|urrrtw|yn\Wblx~zyxxxxxwxwvvuvxzxwwwxx|~}}}|{zxxxxvuuwxyxxwvtuvwvvwxxyzzzywvtsrqqvz{yswfiw{}{{{zz{}~~~}}}~~~~~~}}}}}}}}}}}||zrs}~~~~|xvvwxxxwwwvuuuuvvvwwxxxxxxxyz|{skmtywvvvvvvvwxxxxxxwvvusrqrtvvvutuvwwxy{{|}~~~}{ywwxy{|}~}}}}}|{|{|~~~}}}||{zyyyyyxxxz|}}xnm{||}}|zvuuuvutttuvwxxyyyyxxy{|}}{wx{}~}||~}}}}}}|}}}}}}}||}~~}}||||}}~~~}~|}yz|||{{{{{yvx}~|zyyzzxvxzvttxwxxzywspooonhdhptvxwqjpwz|||}|||||{{{xutrrsvx{|wldhppooqtyyzzz{||yyy|{zyxzzvruy|{vncaiknv}~}}|{z{|~~~~}~~~~}||zxvtssuwyzyxxy{}~|||~|zwwwtqruxxvsqpruvvvutsqqw~~}||}~}{z{}|xuvvwwusqopvxvwqhghkoqgeu}|{{{yxxuttvyyyzz}|tlmvyy~~}~}{}{zzzy}|}~~~}|yxy{}|vomov|zw|~~||{z{|}~~{vsy~pzxx|ztrsvy{{{{{{{{{{{{{zxwvwvvwxyyyxyyzyx{||||}~~~|zz~x{}{{{yxz~|||ut{}yxz~~}zyxwwwxxxwuttuwy~ulmpv}|trsuy}~yh[ajy~~{vtxyzyyxwwvvvvvxyxwxxy{~~}}||{zxxxwtrqsuuuvwvutvwwwxxxyzzzzzywrlkovyytmudfl|}|{{zz{}}~~}}}~~~}}}}}}}}}}}|{y{~~}}~~{xwwwxxxwvuuuvwwwwwwxxyyyyyyyz{|ytlryxusrsttuvwxxxwwwvvvvutsstuvuuttvwxxyz{|}~~~|ywvwxy{}~~}}}||{{{||~~}|||||{{{zzzyyyzz{}}~~wq{}~~}|zwuuuuutssttuwxxyzyyxxy{{{{yy|~~~~~~}~~}|{{yxx|~}||~}}||}yuuy}~|||~~~}|}~{|~{y{{|{xu|}|{{{{zwwvvxxywyz{zwsqpoong]`mrrttqoruvwxz|||||}|zzyxwqmouwyyyuqpvrnpvxyxwwwyz{zzz|}||zxwvvy|}zqhgjhenx~}}}{zz{}~}}|{{{|~~}}}~~||zxvtsrsuwxxxxy{}~|{|}}{xvsqqrvxyxvtstvxwwvutsrx~~~}||||||}|xwvuvvvutrquvutlefhmswhat~|zxy{zywttuwyzz{}~}vkkvxy}{uz~}{|{zyzzzy}~}||{zwwy{~}xtnmszzw~}~}}|{yyyzz{{ypq}vn{ytwyyustwyzzzzyzz{{{|||{zxwwvvwxyyyyz~{zyz{z{|}~~}|z{~|~~|{zyzz||~yx||{{~}zxxwxxxyxvttuw{uqv~|uqs|~wtu{~|{yvttw{|zywvvwwxxwwxxxzz{}~}||{{zzyxxxwsplnooptvvvuvwxyyxxy{{zz{{xnd^nyyxtnrlmit}}|zzzzz{{}~~}}~~~}||||}~~}}}|}}~~}zxwwwwwwvutuvxyxxxxxyyzzzyyyyzzzxuootsqonopqsvxxwwvuvvuvvwvuuuuuuutuvwxxy{{|}~~}zxvvwxy{}~~~~}|||{zyxyzzyxwxyxyyyzz{{{zyyz{{|~~~x{~~}{xvuuuutsstuuwxyyzzzyyyyzz{{{}~}|}~~}{zwtsnt||ss{}|}|}}zwxshly~{{{|||y{~}zwvu~}{yx~~||~~}}|||}|{wrtyzywxy{zxtsrpqq_W[hoqqqonpqpprvz}}}~~}|{z|{tmotvxyyywvvsnqy|zxvttuwyxwvwz||xwwxx{}~}wpmkihpz~|zz|~}|{zzz|~~}|{{|}~~}}{yvtsrrsuvutuwz}}~}|{|}|{zxusssvy{yxvvvwwvvusqqu{~~~}}}{z{|}|yxvuuuvwwwwwvtsneeksy|nbv}|xuuwz{xurruxz{{}~zojtxz|wow||{||zyzzzz~|{||{zxyz|~~|{ypkovyx{zz{|{yvuuvvvxwqx{sv~|yyzywvwxyyyzzyyzz{|||}|{zyxwwwxyzyyz{{zzyzz|~~}}}|{}}}}}~}|yxzz{|}||~~}~}|zyxxxxxzywutux|}xz~sr~~~~~{ywwuvwx{|zxvuuwxyyxxyyzz|}~~|{zzzyyxxxxxvtrkjkkptvxwvvwyzzyyz{{zz{zyqiap}|zxvwyympz~~|z{{vtrz}~}}~~~}}}}}~~~~~~~~|ywwwwwwwvttuwxyzyyyyzz{zyyyyyyyyxvrhlmljjklnquwwvvuttuuuvwwwvvvvvvuuvwxxz{{|}~~|wuuuuxy{}}|||}~~|{zxxwwvvwwsopsvwwvwxxyz{{zz{||}~}}}|ywuuuuutuvvwxyyyz{zyyyyxx{~~~~}~|{z}}~~}{ytpmgn}yxtjjnqsvy}|xofgoz||{{vsyx|~|zrmvxwuvvw|~|{{||||||}|}{sswwwvvx||xvutrrhW]_fnrsroorspoorw}~~~~}{z{zuqqtuwyzzyvsqpt||zxvtrsvwutrtw{{wyyyz{|}}{xrmjnuz~}}}~~}}}~|z||}~|{zz{{}~~~}}{ywusrqqrtstvwz{||}||{||||{zywwxzzzyyyyxwvuusqs{~}{{{{{z|~yvvvuwxzz{{zxwumiox|~set|ytqruxyvsrsvx{|}~}|pjrz{zwqw{{z{~|{zyyzz}zz|}|||}~~~}||}vnntyz}xwy{|{xusrrssvwv{}wrty{|||{{{yxyyyyyyyyyyz{||||}}|{zyxxyz{zzz|uxzyyz{}~~}||}}}}~|{xwy{{|~~~}}~~~{}~~}{zyyxxwxx{zxvuvx{~~{{wr~~~||{|~|ywuutuwy|}zxvuvwyzzzzz{zz|}yxxwxxwwwwxxvuumhiotvwxxwwwy||{{{{{zzzyzwsnp{|||vuy~}|||ohlw}}}}~~~}}~~~~~}{xvvwvvvuuttuwxyyxy{{||{zyxxxxyyyywrfhihgghjlorrtttsssstuvwxxwwwwwwwwwxxxz{||}}}ztuussvy{||{{z{|}}|{zyxwvvuuusnikorrqqrtuwy{{{{{}}}~~~|zwutuuvvwxxxxyyyzzzzzzzyy|~}}~|yxyywwwwwtnidn~|~|i[bilouz}zwulistx|~{{}yvxvzzpjimruwy}}zxy|{z||}{z{}}wuwvuwy{}}zwutrn^[`\fqwwustwwusrpsz~~~}|ywwvtsrsuwyyz{xspu|}|zxvsqruwvvtuuvzy|xz{zyyxvurnlr}~}||||}}~~|y|~~|{z{{{||{|}~~~}|yvtrpppqsvy|{zz|}}}|{{z|}~~{zzzzzzzyyywvttssw}~|zyzz{|}xvvwy{|}}{zxwsquy|{wjq{~}ytpoprstrqqtwyz|~{xunmtwwvvvy{{{{{}|{zzxvy}}yy{}}~}|{z|xqtx{|yyz{||ywvututvx|ztqrtvxz|}}}{yyyyxxyyzyyyz|}}~}|}|zzyzz{|{{{yqwzzyz|~~}}}~~~~||xvz~~}~}~}|}~~z{~|zyyzyyyzz|{zwvwy{||zxx|}~}}z~~{{}}|zwvuuuvxy|}zxvvwwyz{{{{{zz|{wvvvwwvvvvxwvvwqikwyxxxxxwvy}~}||}||zxxyyvvqt||}{|~~yxx{~~}{j^k{~~~~~~~}}}~~|zxvvvuutttttuvxxxx|~}}}|zxxxxyyzzyxrgghggghjmopprssrrrrstvwxxxxxyyyyyyyxxy{{|||{yvwwwwxxz{{{{{||}}|{zzyxxwvvutmfilmgefhnqtwz{{{|}~~~~|ywuuvwxyxyxyxxxxzzyy{{{~~~~zvrtqqrwyxurqlv~{{z{qhlpqrorkajoqyxwwy}~yy{~~upu}~}~~~}sjltuvxz}zz|{{}~}xqty{|{yxyxwz||}}{yvurkfmdjuy}|ywxyyxtqpqv{}}|zyvutsttttuvxyz{zvruz|}zxurooquxywvw{|xyxzzyyxsqrsrrv|}|~|{{{||~{|~}|{|{{zyxyy|~{xurponoptxzzzz|~}}|zyyz}~|{{zzyyyyxwvtssw{~{yxz{{~{yyz{}}{yyxwuuxz{zztsvywrpnnnpqqqpqtwy{}~{umkjlopqsuxz{||zy|~}|{zyxy|{yxyz|~~}||{zyy{wrv|{z{{||||||{zzzy|~xtrsuwy{|}}{zyyxxxyzzzz{}~}||{{{{{|}}}|{zz{{{||}}~~~~~}}zv{~|||}~{|~}|yxxxyyz{{||zxwxz{{{xvvxxxy|}~}||}zyvvvuuvwz||yxwwwxyz{{|{{yz|}ywvwwwwuuuvwvvvvsmqwxxxwwxxvy}~}}~~}yyxxyxxrry|}{{|{zzyy{|~~zh^n}~~~~~~~~}}}~~~~~~|zxvvvuuuuuuuuvwxy{~~~}{yxxxyyz{zzwrgfggfghknqqssssrrqqqsuwyzzyyyyzyyyyyxyz{{{zzyxyzz{zyy{{{||||||||zyxxwwvvwvpfgllb_behlqvyz{{|}~~~|zwvvxy{{yzyxxxxyz{z{||~~~~~~}~|xuruyzy|}{{zxy}~|{z||zxttttvrgpwz{{wuu}xvux|}uonpv|}~}}|tqsvxxxz}|}}}}}}~}}odoxzzzyyzzz{|}}}|zxvsntvinsuyz|zz{zxtortrx}|zywussttvwvttwxyz{xtqllwzvrqnjgiqwwww{|yxxz{zz{wwyttwy{yw}|{{||~~~~~|zwuttw{}}zvtrqpnnpsuxyz{||}|xvvy|}~}||||{yxxxwvutrrx}~{yxz{}~}}~yssuwxxyxxyxzywxyuponmmnpqqrsuy{}~}{vpjfggijmptx{||{zz{~|{{zzz{{xwwyz{~~zyxwwwx}~uw~{{|}}}~~~zxwvwxyz{{{{zyxxxyz{|~~||||}||}~~}}}~}}}}}}~~~~~~}~|x~~}|}}~~|yxwxyz{||{{zyxy{{||{xwuuuvy|}~~~~~~~}~}yxvvvuuuwz{{yxxxxxxyz{|{zz{}~{yxxxxwvuuuvvvwxwuruvwxxwwxyvy}~}}~yxyy{zyvuvy}|zyyz{zwtu|zkfv}}~~~~~~}||||}}}||}}||}~~|zywwwwwxxwvuuvwy|~~~~}{yxxxyzz{{yvqhfggffgkortuutsrrqpprtwzz{zzzz{{zyyxwxxyzzyyxxxyx{zyz||}}}}}|||{yxxwvvuuxzuigklc_addhnuyz{{}~~~~}{xwxz{||zyyyyyyz{|||||||{yyz{|}}zxvuvx|~}~}}}}xwy|{}~|xuxzrosxzqkljq{}zxttuy{{zz{z{|z{|~|jdt|}||zy{|~}||{{{{zxxwzytodnonx{}{zxvtz{w{}{xwutsuwxzzwutvwyz{yvqkmyzurpom_X^htwuz|{xxz|{z|}~yuvzz{xu~|{|}~~~~~~~~|yvrrtvx|~|ywutspnnorw{{ywx{zwssw{{zzz{|}|zxwvvvvvsqw~~|yy{|~{trtuvvxxxwwwxxxyywtrommnopqrtwz|}|zwvrniedfimotwz{{{{|}}|{{{{{wmmqvy{}}wvuuuwx{{~z|~~~~|||zzzzzzz{{zyxxy{||}~}||}}}~~~}}}}}~~}}}~~~~}}|||y~}||{}~{ywxyy{{|{zzzz{|||~}zxutstwxz{}~~~~}~|ywvvvuuuwz{zxxxyyyyzzz{zz{}~~{yyyyyxwvvvvwxz{zwuvvxxyxwwxwx}}~zxy{}|{yxwy~}zxx{{zxsrz{sq}}}~~~~~~~~}|{{{{{{{{{{{{{|}~~}|{yyyyz{zyxvvvwz}~}}~~}|zyyyyzz{zxtpheffeegjosvwvutsrqpprtvyz{{zz{{{zzxxwwxxyyzzyxxxwzzz{|}~~~}|||{zxxvutttux{xohhkf``abfmuxyyz}~~~|zyz{|}|yxxy{{zz{||||{yxursvyzzxuuvvx{~~}~}}~}yy|~~}|{{{~ynltwtmkrru|~zuqrvz~~~}~}~yqt{}~~~rs{~~~|{||xxyz||{{}{zzulrhety{yyyxx|}~~|wttttvxz||yvtuvwyywurptyxuqonhTKVkxvsyzyvvx{zxw}{{|zz{vv}|{{}~~}}}}}}~~~~~}yuutrtvx{~~|{yxwtqonquxywtuyyurruyyxxx{}~|zxvuvxz{xtx||zz|}~||~sprqrspqtwvuuuwwxyxvtqpoonnpruxzzyxvuusqlgfhloquxzz{{|}~}|{{{{yo`]bkqv{|}}ytttuvyz~}}y|~~|{zyyyzzz{zzyyyz{||}}~}|}}}~~~}||}}}||~~~~}}}|||{{z}{z{|}zxyyyzz{zzzz{{{||~~|zvutuuuvx{}}~~~}{xwvvustuvzzzxxyyzyyzzz{z{}~~}{zyyyyxxwwwwx|~~}yvuvwxz|yvvwy}~~|zy{}~~}|z{|yy{zzxvw|}zz~~}}~~~~~~~}}}||||{{zz{{{||{{{{{||}~~}||||}}|zywvvwxz|}}}}}|zyyyyyz{yvspieeedceinsvwwvusrrrqrtvyz{zzyyzzyxwwvvwxyz{{zyyxwzz{|}~~||{{zyyxwustttw{zshgkic_`afnuwwxy|~~~}|{||}}{xwwx{|zz{|||||zyvrsvywvustxyz|~~}}}~~}}~}y{||z||}}|yyz||{rlonlmtyvw|zqqs|~xruz|}xwwv{~~}{}{ssx{}||}}{z{{vtmlttwwyzyyz||vtutssuw{|zuqqruxywtqprtusrolh[W_hllryzxwwxyzxw{~}}wsxzxw~|{z{|~~~~~~}}}}}}}||}}~}}}}~~}yxtqrttvy|~}}{xurppqtuustxxtrstwxwvxz|}|zwvvwz~~zz|}}}}~{y{|}~|{|}}}~qmkhinoqqssssuvwwxxvutrqonnpsvxyywutuvuspljkorsvyyyz{|}}}zyy{|xja[WZ\box}z{zvstuwy||~~}|}~}{xwwxyzzzzzyyyy{|}}}}}|{{~}|}}~~~~||||||{}~|}||||{{{{z{{~{z{|}|zzyyyyzzyyzzzz{{|~}~{xwutttuxz|}~~~{ywwuuttuvwxyyxxyyzyyzz{{{{}~~|zzyyyyyyxxxxy~}}{wvuwx{ywwy}~~|zxz|~~}}|zy{|{{z|}~~}}}~}}}}~}~~{zyy{{{zzzz{{|~}}}~~~}}~~~~~~~~~}|zxwvvwy{|||||{zzyyyzzywtrrohedbbdglrvvvvuttssssuwyz{zzxxxxwwvvvwxyz{||{zzyxzz{|~~}|zyyyyzyvtqrstuwwtmijjea`bgpvwwwxz|~~~~~}}}}}|zwvvvx{{z{{|||||{xvvwyvsruy||}}}wv}~~zz}x{yxuz~}vuxz}}xqigpx||xx}|rwz~|yx}~~{tefruqilxz||yvuy|}{|~||wrwwxxxwrswyz{zz{|}{vuwutrqquwywpjooijqokjmqsttqnmida```guyxyyyyzzzy|}ztsvyvs~}{yyyyz|~~~}}||||||{{{{|~~}}||||}~~ysoorvyyz}~|yvsqpqstttxxuttuwwwwy{|}|zwvwy|{{{|||{yy{{|}}~~}|}~}{{z}pifcfmvxpoprsuwwvvvututsqooptvxxwtssx{{yurppsuuwxxxyz||{{wxy{}|kdeb`ZVZet||yttuxz{}~||~~~~~~~}~~~~}{yxxxyz{zyxxxyz{}}}}|||{z~||}~}|{|}~~~~~~|{{{{||}||{|zzzzzzz||{|||{{|~}}}}}}}~~||zzyyyzyyyyzzz{|}}}zxvutttuwy{}~~~zxwvuuuwxxywyxyyyyyyyz{{{{|}~~|zyyyyyyyzzzyy|~{||zxuvx}|yx}~~~}|{yy{}~~|{|}}}|~}~}}}}}}}}~~}~}}||||{zzzz{|~~~~~~~~~~~~~~~~~~~}|{zxwwwy{|||||{zzzyyzyvtqqsumedbbcfkquvwvvuuutttuwyz{zzxxxwwwvvwyyz{||||{{{{z{{}~~~|{zzxxyz{zwurnlpsvvtqmkkfa`djrwwwwxyz}~~~~~~~~~}}{ywwusrwz{|{{||}||{zxxxutty}~~~~xx}~}~~}||}y}xuv|xv{~|wrs}zxwwwy~~~|~~~|zy|~~}{zytloxzoYdruwyy{zyz{zz|zujgrwzyxvvwxy{zz{{z{}zvvxvutrpsv{xoglmbdlgcdkotvvtrpkedfgbcovwzzyyzztswyvpszytp~{ywwwwwyz|}~~}}||{{{{{{zyyyz{|}~~}|{zyz{}~~~~}yvvvy{zxz|~~}{xussuvwyzzwvwyzzxxz{{{zywwxz}~z{|}}||xvxy{{z{|}}{{zzyx~ylgfgmrvvrsrrtvxwvuutsuttrqrtvwxwtprw{}~}{ywwwwwwwwwwyzzx||ww{{}~|rkefe_WU]ktvssvz|}|}{}~~~~}||||}~~~~}|||{{{|{zwvwxz{|}~}}||}|||yxy{zyz{|~~~~~~|{{{{zuqryxwvwxyy{|}}}}|||}~{{|||||}~~~~|{zzz{zyyyzz{{{||}{ywwvutttuwz|}~~ywvvvvwyzzzxzyyyyyyyyz{{{{||~}{yyyyyyyyzzzyxz{z|~|wvx~|x{~}{zxxwx~~~~~}}}~~~~~~}~}}}}}~~~}~~}}|{z{{}~~}||||||}}}|||}}}}}~}|{zyxxxy{|||||{{zzyyyxurpquxrgdcbbejquvwwvvvvuuuvwyzzzyxxxxwwwxxyzz{||{{|}}|{||}}}|{zzyyyz{{yxvumgotxxvtqnle_`hotwwxxxxz|}}}~~~~~}{zyxvspvz|}|{{||}|{zxwwvvw{}~~}~z|}|}}}~|wwvzqopz{z~}|}zz{}tqvxwz}z}wuz~}yssy{yxxxwz}|irussvz~~ywtqqrnjhltz{xvvy{zzzyzz{{{|zwwywutqosv|wqqwvpqsniimquxxwtrnkmpsoknswyzxyzztqrtqmr{zxw}}~}{xwvuuvvwxyz|}~~}|||{{zyyyyyyyyz{{{{}~~{yxwxz|~}|}~|||}}{wvwz}~|zwvuvwxyzyyz{||zzzzyyxxxxy{}}||~}|{~xuuwyzyyzz{yyzz{z}{kfinuwsrsuttuwxwvutssttttttwxyyxtsv{|~~|{yyxxyxxxyyywy}xwy}|~{vmdgmja^bgnqsw{}~v{xy~~~}|{{{|}}}~}}}}}}}}{ywuwxz|}}~~}|||{}{wvwyxxxy{}~~}}|{wjck{xtuxyyy{{}~~~}}}~~}|||||||}~~~~~}||{|{zyzyyzzz{zyxwwwwvuuutvx{}~~~~~~zxwwwxxz{{{yywwxxxxxyyzzzz{||{zyyyyyzzyyzyyxxyy|~yuxyy~~}xmmoqy|~}~~~~~~~~~~}}|}}~~}~~~}~}{{|}}|{zyyyyzzzzzz{|{{{{|||{{zyyyz{|||||{{{zzyyxtqoqw{vjdcbbdiquwxxwwwwvvvwwyzzzyyyzzzyyyyyzz{{{{{|}}||}||||{zyyyyz{{zxuuxrkrwzzyxvrle_bmsvwxyyyyz{||{|~~~}|{{{ywuw{|}|{{{|}|{zxvwy{{||}~~~}~}{}|wz}ww{}~~|xsvvmkt~|{}{srwzv|{utvwuz}xy{mpux}}~}zvnovzyyyxvttwywyusrsv{}zyvrqrqprwy||{xvw{{zzxyz{{{{zyyxwusplpv{wtw{xuutrrrruvxzxvutsrtyxsqtwxyxzxxxutusompv}}~}{ywvuuuuuvwwxz{|}}~~~}|{{{zzyxxxxxxyz|{||}}yvuuxz}}{y{~}yvuux|~}{yxwwwyzzz{|}~}|{zzyxxxyz{}~~|||~~}|{{wssuwyyxxv|}zyzz{z|lfnvzxussvuuvvwxwutrqrrsttuwwwwvuvxyz}~~|zzyzzyyyyzywxzyxz}|}}~{rokiknjd`dis~ytt{wst~~}~~~~}}||||}}}}}}~~~~~}|ywvwyz|~~~~|~||}}zwvvwwwvwy{~}yrlj|twyzzzz{|~~}}}~}||||||||~}~~~~~~~~}|{zz{{zyyvuuuwwwwwvuuvwz{|~~~~|ywwwxyz{{|{xuvwxxxxxyyyyzzzzzyyzzzz{{zyzyyyyyyz|yty|y|~ztqoqruwz~~~~~~~}|}}~~~}}~~~~~~~}}~~~|{|~~|zzyxxxxyyyyyyz{zyyy{{{||{zzz{{|||||{{{{zzywsqpruzxldbaadkrwxxxwvvwwwwwwxxyyyyz{||{zyyyyzz{{{{|||||||||{zyxxyz{{{yxwwxwtvy{|{zxtngahrvwwxyyyzz{|{z{}}~~~~}}|||{{yxy|}}||{{|}|zyxvw{|{wsw|}}}}{yzzx{|qltz~~}yqt}xos|~|z}}~~uadkkq|}|{zxvty}yxyqqtsuw||{{zwsoory{}|zsfnwxyxxwxvrrw||||{zwstx{|}{zy{{{{zyyz{||{{{zxvvxvqooprv{zwwvsqrsuvwwxwxxvuuwz{xvvwxxyywwwttuurmir}z~}}|zxvuuttttuvvxyz{|}}~~~~~}|{{{zyxwwwxxyz{|}~}|{zywvxz||ywx{}~zvssv{}~~~}{yxxxyzzyx{}|{{zyyyyyz{{{{{{|}|zywtrrtvvsqpou}{yyyyyoisyzxvtvwvuuuwxwvtrpqrsuvutqppruuuuy}}|{|||||||{{xx|~|{}}|qfcnsmdddlhb`izpmjl|}}}}}~~~}}}}}}||}~~~~~|zyy{~}}~}{{{zwvvvwxvvx{~{wwxxz{|||{|||}|}~~}|}}}}}}||~~~~~}{ywutttttuuwxxxxxwvvwwxyz}}}}~|yyyz{{|{zywvwxyyyyyzzzzzzyyyzz{{{|}}}{|{z{{zzxz}}zuz{{|~|wrportwz}~~}~~~}}}|~~}}}|{{{|}}}~}||z|~~|ywz{}~}}||zyyxyxxxxyyyyzzzyxwwyz{||{{zz{{|{{||{{{{zzzwrrrsovxpda`aelsxyxxwvuvvvwwwwwwxyyz{|}|{zxxxxyz{{|||}||||||{zyxxy{{{yxxyzzzyz{|}|{zwsgerwywwwyyyzz||{z{}}~}~}}||{|||{z{}}}||||}~}{zyxz|~}xx{}~~~|wpty|~zqiu|~~~|}zqqu~|xy{yx{}~~~{wtiaoy||~~{vttz~{wwuvsjk{|rrvtlfelw|oct~|||~zrovzz{zyzyusy}|}{zw}{{{zzz{|||{{|{yxx{{wuuuvxzywywsnnrvyywsptzxvvy}}{yyyzzzyvspmnqvwslowv~}{ywvuuuuuttuvvwyz{|}}~~~~}}|||{zyxxwyyz{{{|}}zwwwx{~|wsu{~zustwz|||}~~}|{zzz{zwvw}~~}|||{{zzyyyyxxyyy{{yxvutttuqljjkpzwxxxz|sqvyyxvvvvuuttuwwvtrpqrtvwusnjinrqqw}~}}~~~~~~~|zxy}{{}{qehrutsjfaco|tjint~}|||}~~~~}}||}~~~~}{{|~~~}xwz{wvuvwxwwxz}rq||}~~}|||||}~~~|}~~~~}}}}~~}{yvrnmmosvxyzyyxxxxxxwwxy||||}}~||}}}}{xvvwxyzzzzzz{zzzzzyy{{|}~~~}|||z{{{w{~{zz}~zqloqruv{|||}~~~~}}}|||{zzz{||}~~}{xwwy|zvvwyz{{{zyxxyyxxxxyyyzzzyxwvvxyz{{{{zz{{zzz{|{{{zzzywsstsoqvufcabgnuxxxxwvuuuvvwwwwwwxyz{|||zywwwwxyz|}}}}||||||{{zyyz{{zyxxyz{|||}}}}|{zwfjzzzyxyyyyyz|}||}~~~}~~~~}}}||{z{|||{{|}~}}}}}~}}|{{z{|~}wtrrstwxipx{|{xxs|~}{}{utrz}|ytpt{~~|ywy|ywy{||}||zyy}~|{{{yssrzxjnwrdZ]jx}}~{ql}~}zwx|xrw~}|{yxxvuwz|}|wlpz|zzyz{|{zyyzzyz{~|{z{zywwz{ytposx{{yqimwutwz}~}{|||{zywuqonouxvtvxy}{ywuttuuuuttuuvwyz{|}}~~~}|{{{{{{{||||}~}|}}|{|~~zwvvwxyz{}}~~~}||{zwww{||}{xwwyyyyxxwwxxxxzzyyxxwwwunjjkmq|yyyzz}{zyxvvvxyyzywvvuuttsstuvutrqrstwxwupjhkqsuz~~~~xxz{{yz|~|{}ztmovzvgdju|vuwz~|{z{}~~~}}}}}}~~~~}~}xx|}yvuvxyxxyz}|xx{{{||~}}}}}~~~}~~~~~~~~~~||||{zvplimswz{|{zyyyyyxwxxx{{{|{{}~}{wvwyzyzzzzzz{{{{{{zz|}~}~{y|z|}~{|||{zzz}~{tmpppruzz{|}~~~~}|{{z{zzzzz|}}||}{zwuuy{yuuvyyzzyxxxyyxxwwxxyzzzyxwvvwxzz{zzzyyyxxxyzzzzzyyyxtsuttqsthdcdjpuxxxwvuuuuuvvwwwwwxxxyz{zyxwvvvwx{}~~~}}}}}}}||{zz{{{zyxxz{|}}~~}}}}|{xjp||{zyyyxxyz|}~~~}~}||||{{{z{{||}||}}~~}}~~~~}|||{{|}~zunkhimu}nt{}}~z~~}{xv{|yvqrw|~vmio|~{||}}|}~{{}~~~~~{ytiuzqtzpYLZp{||}|xv~}{rknzzvx{{{|}zxwwvwy{}|ykfy}|zyyzzwtrsuvwwy~|vsqutsu}}|wtrtw{|{rijpppu|}|}{{{}{ywwxxvqqtvvusty|zwutsrstttttuvwxyz{|}~~~~~~}}}~}}}~~}}}}}~|zyxvvwx{}}}|}~~}}|{yxxyzz|ytqqsuwyyyyyyyxwwxxxxxxz}{qllmnrpmqrsux~~~~{yxutrw{{zywvwuttsrrstuutrrssuwxxxumikpuy}~~}tw|~zxxz~~~}}}}|||{{uruzj_kr{~~zt~{zyz|}~~}}}}}}}~~~|}~~}{wvwxxxxy|~|zzyyyyyz|}~~}~~~~~~~~|zyyz{||||wqkmsx{}}}|zzzzzyxyxxz{{{{{|~~}zxwxz{yzzzzzz{||}}|||~}|}||~z}||||z{zyxx{}}|{||ywwusuv{{||~~~~~~~~}{zyzzzz{{{|}|zxxyzyvvvyzxvuxxyzzyxxyyyxxwwwwxyyyyxwwwxyyyyyyxxxwvwwxxyyyyyywttuvvsssjdcgosvwxxwvuuuutuwxxwwxyxxxyyxxwwvvuvx|}~}}}}~~}}}|{zz{{{zxxyz{|}}~~~}}}|{ytv|||{zyxwwx{{}~|}||{{{zz{||}}}}}~~~~~~~}}|}}}|{||{{{{vqqs|}y{~{||{}}||~|yz||zxxy|~}yx{}z}}~~{{~}zz~}zv{~~}}sYJ_y~~~}||~{yodoz{wusuy{wuuvy{|{||||yuz|{zyyxvqijnrstpnvyxqomsqqx|{zxvuuvxzwpjjoqrw|{xvvz{}xrtyywtsrsuutnfg{yvtsssttttstuvwxyz{|}~~~~~~~~}}}|yxwuuxzyvw{~~~|{zyxyyyyvrooqsux{||||zxuttttuy{wqpoptxknuttursuusw~{yyvusw{{zyxxwuuusrrstuttsssswzzzzzslkpvz|~~~~~|xz~~}zxxy{{{zzz{|}||||xvyihwuz|tmo}zyyy{|}~~~}}}||}}~~~~{yv}|yvvwxwwy~}xxxwxwwwy{}}~~~~~~|xvvwy{||}~|wrrvz|~~~}|{{{{zzyyy{{{||||}~}zyxyz{yzzzzz{|~~yy{|}{zy{}|||}}~|{yz|}{zzy{~}|{zzz~}}|}~~~~~~}}zyz{{{{{{{|||{xwwyzxwuvwyvuvxz{{zyyyzzzyxwwwwxxyyyyywxxxxxwwwwwvuuuuuvwxxyywuuvwvuvukddktwwxxxwvvuuuttvyywwxyyxxxxxwwwwvvvx{}~}||}~~~}}|{{{{{zyyz{{|}}~~~}||{zzyz}||{zxwxyz||}~~~~~}|||{{||}~~~~}~~~}}|}}}}||}~~}}}yy{}}}~~zwvux{zyx|~zx}}|}~~~y|~}}|{{|}~~zi]l~~~}~|{wox||yqqv}zvuuwz|}}}||}~|wppuwwuqkilrttnlsvwtstunhr{{zyxwwxzywqmntxx{~wmlvywokqutojmnpsvxveZ{ywvuuuuvvvuuvwxyz{|}~~~~~|{|}|ywvvvvtuy~~~~~}{zyyzzzzxusrrsux{}~}~{vsqqqpqtz~~|xussv{ysw}|{}{wxxwwy|}|{zyvutwz{zywwutttssstuuuutsupvz{zy{wqnpvz{|}~~~~~~~~~}~}|||~~~}zyyzyyxwwxz{|||}~|wwsw}xz~~ujky~zyxxz{|}}~~}}|{|}}~~}~{qcn}~|zwvvwwx}~zyyxxwwxz|}~~~~}||~~{vsuw{|{{{|}zxxz|}~~~~}||||{zzyy{{{|}}}~~~}{yyzz{zzzzz{|}}yy{{}{zyzz~}||}~}{|}~|yz{}}zy{~~}{{|}}}}}}||yyz{{||{{{||||yxwxzzxutuvutvx{||{{z{{|||{zyxxwwxxxyyxyxxxxwvwwwvutssrsuwxyywvvvwxxxvkcgqxyyxxxwvwwvuttvxzywyyzzyxxxxxxxxwwx{|||{|}~~~}}}||{{{zyz{{{||}}}}|||{zzz{}}|{zyy{|}}}}}~~|zz}}}||||}}~~~}}~~~}}}|}}}|||~~~|}~||~|sot{~}|x|}{|}}{|~x|||}~}{yyy{yv|yry~~~}~}{z{|}}|zww}}||zyxy{}~~}|zxxwkeuywvuuqruvvsruwxwwxxsmoswxxxy{|}|zwtt{|}}yvnjrvl]ivxtpliinsw|~sg}zyxxxxxyyyxxxxyz{|}~}{{|{yxz}~~||{yxwvvx{}}}}~~}}|xy|{yzzywvtsttvx{{{~{urrqsrqrssrs|}xuuwyyxyyqpx|z{|zyxx{|{{zwwxz}}|yvutsssstuttxxwwvwjlstsrtssqrvyyz|}}}}}}~~~}}}}}}~}}|{{{zyyxxxxzzz{|~~}{xy}}|}|vtx~{yxxyy{{|}~~}|||}}~~~}|{|}~~|sZby}||xtuuw{}zxwxxz|}~~~|{{~}zvtvy|}{zxz{{{{|}}}}~~}}~}|zzzy{{|}~~~~~}{z{{{{zzzzz{|~~{yz{{|{yyyx{}|||}|{||}~}}{z{|~u|{~~~}|{{{}}}}||{zyyz{|||||||}}{yxxxyzyuttuuuwy|||||{|||}}|{zzyxwxxxyyyyyxxwvvwxxwvutsrsuvxyywwwwxyyyvjemvzzzyxxwwxyxwuuuw{{yz{||{zyyyyyyyyyz{{{{{|}~~~}}}||||{zz{{{zzz{}}}}}}}{zz{||{{z{|~~~~~~~~~{ty~~}||}}}}}}~~}}||||||{||}yz~~||~~xsx}~|}~~}||||~wywwy|~}zxwy~{w~~}}}|{}~}}}~}{z{}}|}}|~~zsuz~~|ywy{rjz|yxy|{xxwwxxwxxxxyzxuqquwxyz|~}z{zyyz{|ywsroostgZnyvtttnmptz||yt}|{{{{{||}}|{{{{|}~~~|zxy{~~~~}zywvwxyz{||}~}|vwyzyxyyxvututuvvxv{wottrtutrmkntyxvttvwwvusnpw{z|}{{z{|||||zyz}}{wusrsstuuruxxxwwtfakoomnpsttvwzz|}}~~~~~}{{||}~~}}}|{zyyxxxyy{||}}}}~z|~~~~~}~|~{yxxyy{{|||~}}}}}~~}|{zz{{}~}}xnoy~}|}xttux~|yyyz{|}~~~~}||~}zvvx{}~|zyyz{|}~}}}~~~~~}|{{{z{{|}~~~~}}{z|{{{zzzzz{|}~~~{yxz{{zyxxxxyzz{||~~}}{z{{{|||}}~~{}}~~}}||||}}}}|{{zzzz{}}}}}}}~}{zyyyyzzvtuwvwz|}}|zyyyzzzzyyxyyxxwxxyyyyyyyxwwxyyyxwvtttuwxyyxxxxyyyxvmktzzzzzyxwwxzzywvuv{|{{|~~}|{zzzzzzz{{{{{{{|}~~}}||||||{{{{zxuwz||}}}}~}{zz{|{zz{}~~~~~~}{{~|||}}}}}}~~}|||||{{{|||}}tw~}|{|}~zx{~~}~||{|~~~}|xwuuy{}}yvwzzv}~}}}|||}}|~~}}~~~|{z{||{|}|~zpt{~~}{z|~}y~|zyyzyxvwxyyyyxxyyxvtqruwxz{}~|wvvyuljtwuqnorurgeuvrstvqootzyvvw~~~~~~~~}}~~~}||~~~~}zywvvvwyyz{{{zvwzywvwxxwwvvutuuuvynhtvsuwxslkotutrrruuvtqprtxxxy{{{|}}}}}}}~~zwtttstuutxywvvtk`\innnnprtuvx{{|}~~~}yyz{}~~~~}|{yxxwwxyy{|||}}}}|~~~~~}{zyz{|}|{z}~~}}}~}|zyyz|}~}|||}~}||~~~}||~yttu{~{z|}zzz{|}~~}}~~~}}~~|zxx{}}~}{{zz|}~}}||||}}||{{{zzz|}~~~~~||{z{{{zyzzzzz{{{zzz{{|~zxwy|{yxvvyyyzzz{|{{z{{||{||}~~~~~~}}|{|}~~}}}|{zzzzzz}}}}}~~}|{zyyzz{{xwx{|}~~}{xvvuwwwvttuvxxxwwxyyzzzzyxxxxyyzzyxwvvvwxyyyyyyyyyxvrrwzzzzyxwwwyz{{zywwy{}}~~}||{{|||{{{{{{{||}~~}||||||||||{zvsxzyz|}~~~|{zzzyyy{~~~~~~~}~~||||}}}}}~~}|}}|{{{{{{|{xjow~}{z{|}}}}}}||{{{zz{|}{yxzzxvtw{{|{ywy{xmy~}|}||}~~~~~~~}|zz{{||{zyyzzz}}wow~}~}~}zyxwwvuvxyyzyxvsqttpprtvy{{||ztrswrdhwxrnmortphjssrsttpomnqpkov~~~~~}{zxvutvwwwvuuutuwutttuuuvvvuuuvw{ykn{yuuwzwnlpsssqqrttvrnosxzwvxxwwvwxy{|}~|wsqqrvutplilrqlhailmnorsvwxy{|}~}zxyzz|~}}}|{zxwvvvwxxy{{{||}}~}~}}~}}~~~||{|~~}}}}{zyyzzz||{{|{|{wvxy{|{{}ytty~|yx}wu}{{|}~~~~~}~~~~~}{{zz{}~~~}|||}~}}|zyxxz}|{{{zzzzz|}~~~~~~~~}||{{{zyyzyyyzzzxxxxxxxz{~{xxz}|zywwzzzzzz{{{z{|}~||}~~}|||}~~~}}}|{zz{zyz|}}}}~|{zzyyz{{||zyz}~~{vtsrtuutrrrtvwxwwxyzz{{{zyxxxxyzzyyyxxxxyyyyyyyyyxwvuvwyyyyxwvvwy{|}|{zyyz}~~~}|||}}}||||{{||}~~~}}||||{{{|||zwwzwwxz|}~~}{{zywwvy}~~~~~}}~~~~}|||}}}}}}~|{{}~}|{{{{{|~om{~}{z|}~}|{zyyzyxy{{{||vvwy{wtptxz{{{z|}ypy}~}~}}~~~|zyyyyz|{yvwyz|~xus|}~}}~|yyxwvuuwyzz{zyvohjomnqrtwyzzzyvusvtoqleeijmttpkilosvvtpnnjeddnw~~}}|{z|zurtwxwvuuuuuusrrqrrsuvuutuw{}{s~|wuwzwonqtutrqqrsurmmuz{xuvvuutssuxz{~~vpkjryvrkechpqnliklmnpsuwyzz|}~~~}zxwyyyz|{{{zyxwvuuuuwxyyyyz{~~~}}}}~~~}|{z{|{{z||{zzz{{yvuvxzz{}|xw}yxvtryult{|}~~~~}}}}}~|zzz{|~~~}}}}|}||{ywvvx{~}{zzyyyyz{|}}~~~~}~~~~~~~}{zzyz{{zzzzywwwwxwwxz|~zy{~{zyy{{zyyyz{{{|}}}}}~}}|}}~~}||{zz{|{z{{~}}}|{zyyyz{||||{{z}}}}~~|vrqqstuttsrsuvwwxyzz{{{{zyxwvwxxyyyyyyyyyyyyyyyyxwwwwxwwwyxxwvvwy{|}~}|{z{|}~~}}||}}}}|||||}}~~~}}}}|||{{|||{}{ztvwxz{|}}||{yvtttw{~~~~~}}}}}~~~{yz|}}}}|||}}~zttz~}}}}}}~~t~yw{~|yxywxzyuu{}||~~~|vvy{{xuswyyz|}}~}z~~}~~}||zyyyz|yxwxyz||srv}~~}}}{xwwvtttuyyz{|{ytigmnorrssvxwvwxwuuuulYXdlprvvrnkipwyyvpltqe_huy~~~~~~}}}|zz|{vqsuwxxxwwvuttrqppqqtuuttuwwz|wtttwuonrvwvtrppprrllu{{wutuuvvsrrtxy{}{qikow}xpiecfnppomllmoquvyz{|}}~~~~~}|{ywvwyyxxxxxxwwwwvuutuwyzzyyy{}~~}}}}}~~~}}|||}~~}|~}zyyyzzz~{y}|vtxwsry{moot~~~~~~}}~~}~~~|{{||zzzz|}~~~}~~|}||{zxvvwy{|{zyxxxxyy{}~~}|}~~~~~~~|{z{}~~}{{zzxxxyzyyz|~|{}}|||||yxxxy{zwz~~~~~~~~~~|{{zzz|}|{{|~}}}{zyyyz{|||}||||{zxwz}~|vrqquvwvvusttuvwxyzz{{{{zxwvuvvwwxyyyyyyyzyyyyyyxxwxyzxvwxxwvuvwz|}}~~}|{{{|}~~~}}}||}}}}}}}}}~~~~}}}}}|||||||||{yvvvwxy{||||{xtrrsuy}~~~~}}}|}~~~}zvsw{}~~}|||||}~vlku~~~}}}~~~{ujq~{xwxzy~wlq}|x{}~{zz{{yyyz{{|}~~~~~~}}}|{{|}~||}zwvwusu|~~~}zxwutsrsuxyz|}{||urtwwwvtqtvvtuwwtstpaX`jnnrvwusrqsx{~|tr}}mds|{~~~~~}|||}}~~~~~~~~}}}}}|zyyyvsssvy{{zxwustsqpopqrstttvyvx~|wtttutrpqruwxwsqommnkktzzwtstuxyvrqrtvxz}~{xqkpzzqidbcinpponmnorvy{|||}}~~~~}{yxwvwxyxvsrstuuuvxxwvvvxz{{{{z{}|~~~~~~~}}}~~~}|z{{xwxvty}{yyrpmnx}}}||||{z|}zwxz|{{{}}}~~~~{yzz{zzz{}~~~~~}}|{zxxy{zzyxwwwwwxy{}~~|}~|{{|~}{zzxyz|}~~~~~}~}|yxwwxzxyzz|~~~~~}{zzzz{}~}|}}}}|{yxxyzz{||}}}}}}{yvtx|}|vrqrwxxyxvtttuvvwwxyz{{{zxwvuuuuvwxyyyyyzzzyyyxwvvwyz{ywxxxvutux{}}}}}}}|{{||}}}}}}||}}}}}~~~~~~~~~~~}}|||}}|{zyxwwwwwxy{|}|yusrsvz}~~~~}|||}~~|zvsrw|~~~}|{{|}~}ulir~~xi_w~|yuvyz{yuty}zv{~~|||}{{}~~}~~~}}~}}}}~}{{~}zzzvuv|}~}~~}{ywtsrstuvwxz{z}~|||{zxurtvvstxyvutj[Yaipqqvwxyxvvy}|{tnz~}~~}|||||}~~}{zzz{|}~~~~~~~}|}~~~|zxwwuwxxyz{||zxusttsrqqrstssuy}{z{}zwvvvvtrsusuwxwvrnljklotxxwtrru{{wrppqsvx|~~{xru|ukddehmqqpooorux{|}}}~~~~~~~~{yxxxyz{{wrmlnpsrrw{|zzzyy{||}}|}~|}|}}}~~|tonry}usros{{{|{{zzyywvxyvstyzyxxz}~}|}}}}~~~~{zz{{||}~~~~~~~}|{{{{zyxwwwwwwwwy|~}|{|}~~|{yxxz}|z}}}~}|zxwxvwy{xwx{||~~~~~~~~~|zxyyz{|~~~~}|zywvwxzz{||}}~~}}{{xwz||{urrrwxyzywutstuuvvwwxyyyyxxwvtttuvwxxxyyz{zyxwwvustxyzzyyywutuvy|}}}}}}}|{{|||}}}}}|||}}}}}~~~~~~~~~~~}}}}}|{zyxwwwwvwy{|~}|xvuvx{}~~}|{|}~~|zwvwy}~}|{|}}{upls~~yhe{z}~~zxwwuy{zy~}{z{}~~||||~|{|}}~}}}~}|~|}~}{{~|||{sis~|}}||zwtrprstuvxyyyy{|}~|{{xvssrqprxyyytj`achrvuwy{||ywy}~}{xw{}{~~~~~~~}|{zzzz{||}~~}{zyxyz{|}~~~~~~~}}}}~~{ywvvxyzzz{|}{yursttrrsstuuuvz~~~}{zyzzyvtwvtstvwwvrlihjotuvwvutwzxtqqppsvwz}}{wuy}}xnfggelpponootx{|~~~~~~~~~~~}zxxyz{|}|wphgkoqppy~}||{{|}}}}~~~}}|~|~~~}~~~tjnzsuuokmu|}|zz{{zyyyxwxyxwvvyzyxvy|{{yyz|}}~~~|{{||}~~~~~~}}}{yxwwwwwwwwvxy|~~~|{|}~~~~}{yxy|}yxz~|}{ywwvywwzv}|||~zz|~}}}~~~~~~~~~}|zxvwy{|}~~}{yxvuvxz{|}}}}~~}}{{z{|}|zurrswxyzywusrsttuuuvvwwxxxxxwutuuuvwwxxyz{{ywvvuuqswwy{|zyvttvy{}}|||||||{{||}}}}}}||||}}}}~~~~~~~~~~~~~}~~}{yxwwwvvvwxz|}||{zzzz{|~~~}|{}}}|zyz{}~~}{{}}}{xtry~}}~~tuz|~~~|{{{zxw{}}{{~~}}~}zxz}~}}}}|}~||~}|{||{~~}zy{vlu~{~~~}|{zxtqnoqruxy{{{wrsy|zz{yvssronqvxyytljlmnrxyux||}{yz~}|||{z}}}~~~~}|{zyyyzzzz{||}~~~|zyxxxzz~~~~~~~}}||}~~~{wutwyzzyy{}|ztpqrttsrsvwvvvxy{|}}}~}~~{yuuutstuvwxunifglqstuwwwxzvsssonquwy}|yvw{}~~}{odbc_empnmopty|}~~~}}}}}}{yyz{{|}~}woffjppnpz~~~}}|||}~~~}}}~|~}}}~wrv~~}|}{utvtkeox{{{{{zzzzzyyzzzz{{||||{}~}{wuy|}~~~}{{}}~}|zxwwwxwwwwwvwxyz|}}~~}|}|}|}~}}|{|zwwy|}|}~~|{yxvwwzyy}{||}}}}}~~~~~~~~}{zxvuvy|~~~}}|zxwuuwy{|}~~~~~~}}{||}~}zwusqruxzzwusssstttttuuuuvwxxyxvuuuuuvuvvw{}|xwvuuxutwtw||zwuux{}}}|||}|||{{||}}}}}}}|||}}}}~~~~}}~~~~~~~~~~}{yxxwuvwvvwyzzz{{||||||}~~~~}}|}}|{{{{|~}{|}~~}|yz}~~~~}~{}~~|||{|~yv{~}{|~~~|zxy}~~~~~}}|}|{|~~~|zwtry{|~}zywtx~~xx}~}}|{yuqooprty{wzxsrry{xxyxwrtsporuuvxqqrowwsvyuxz{{zyy}}}{~}|z||}~~~}}~~}||{z{{yyyzzz{|}~~}{yxxxyz|}~~~}|||~~|yxxy{zxwwz{{{vsrsttsruyyyzxtruxz|~~}|xvtttsstttvxuoiffjmoqsuvxz{vvyyplntwy|}{zxuttvy|}~th`a\`kpnmprv|}}~~~~}||||||zz{|{{{|~}woggknoorvy||||zzyz{{||~~~~~~~~~~}}~|~~|xux}{z|zrjpwz{{{{{{{{{{{|}}~~~~~~|yw{}~~~|}~~~|{xxwwwxxxxwwvvxy{}~}~}}{{y{|||||||~|zwvvwyzxy{z|{zyxwxy{|}~~~~}}}}~~~~~~~}{yxvuuwz|~}}{zxwvwy{}}~~~~~~}||{|}}}|xuwtrrsx{yusrrstttttttttttvwxyxvuuuuuutttttuy{{{xw}{wvsu{~zwuvy|}}}||}}}||{{|}}}}}}}}}}}}}}}~~~~}}}}~~~~}}~~}|{zxvssuuuuvvvwxy{{{{{{|}}~~~}}}~|{{|}~}||}~||~~}|z{|{|{{{||}~~~}{{y|}|~~~~~~~||||}}~~~{xtqowyz}{x{{rorx~~~}{xtqqrrtyqcjmmmqvwutvyxnjjsuvxunnovuiddhouuvwyxxyyxwx{}}vu|}|z||}}~~~}||}~~~}}}}}}|{{{|{{{|}~~}{yyzyyyy{|~}|{{|||zyxyzwuuuwyzzywvvvtssuyzzzzwuwz|~~}|zxvttssstutsturlhfggjpstvwyzzx{~ukmvvwz}~|{|{{yvwz}~|qca]_iponqv{}|{zz||||{{{{zz{||{zy{|}yqhhmoqstsrtuyxwwwwyy{|~~}}}}~~~}}~}zsry~~|vtvxzzz{{|||||}}~{~|}}~~~~~~~~~~~}|zyxwwwwxxxxwwvvx||zywxyyxxxyxxzzxwuuuvvxvwxxzyxxxxy{~~}|{}}~~~~~~~~~~~}}|zxvvvvx{}~}||{zxwxz{}~~~~~~~~}|{{{|}}|wtxusssxzxussstuttuuttssssuvxyxwuuuuuuttssromry{{|~zvsty~}zwvwz|}}|||}}}}|{{|}}}}}}}}}}}}}~~~~~~~}}||}}}}}}}}~}}}}|{}yurttttsstvwyzzzzz{|}}~~}}}}|{|}~~}}}~~}}|}~}~}zxy{zz}|}}~~||~tqwzz|~~~~~~~~~}||}}~}}}}{xvsqwyz}|zyqgkrt|~}{xvusuzzq^X]einsvusuy{smktuvwvnmtzwbHD^pvyxxyxxyzvsv{{znnxyzx|{|}}~~~~~~~~~~~~~~~~~~~~~}}}~}}}|}~~~~~}|}}|{yww{}~~~|{z{{{yxusttttuwyzy{{zyxwutvxyxuvy||~~~{xwvsstttuwxxvtsrnjijkilvxxyz{{{{}rs~xvw{zwx}|h]]]fnnnqy}{xvuvxyzxvwzyzyzzzyutx{|{uhjortvvusrrv{}~|zz{|}~}}}}}~~~}~|~~}}yz}~|{|xwxyzzzyzz{{||}}~~yy|~~~~~~}}}}}}}}}|||}}}||{{{zyyxwwwwwxwwwvvvw{|~~zwvuuuvvvvvuuvwvuuuuuvxwvxxxvwwwyz|~~{zyyzz{}~~~~}}|{yxwwwxz|~}||{yxxz|}}}}}}}}}}}}|{{|||{vtxuuusxywutttuvuuuusrstttuwxyxwuttuuttttuvsjdfjv~|xuuw{{ywwxz{||{{|||||{{{|}}}}}}}}}~~~~~~~~~~~}}}||}}}}}}}}|||||{{~|torsstsstuwxyyyyyz{|}~~~}|||||}~~~}}~~|{{}~|{{}|{{{{{z{|~~tt~{wrv{z}~}}~~~~~~~|}~~~~}~~}{yxvtz{{ytpotus|~}}{zyvw|{vePO\krsvvuwz{{zuuutqpomrws]BDi|}|{|}{zz|zxz}|xoouvvt}|||||}~~~~~~~~}}~~~~~~~~}}}~~~~~~|{{|}~~~}zwy}}ywtrsttsuwz{{{||zyxwxyxxusrtwxyyvsonnmqvuvwyzzxusplhnuwsswz{{|}}~}z{ywwzzy{l[XWamrrsvywtqmnqrpmnrxwvttttsjkrwyywlmqtvxxxxuttw|~}~~}}}~}}}y|}||~~}{zzxxyzyxxxyzz{||}}}~~~~|zyy|}~~~~}}}|}}~~~}{zzzzyyyzz{zzyxxxwwwxwwvvuuuxxz{{{yyz{}~}{{}}}~~~~|xuutuuuttuutuvvwvvvvvwyyyzyxtuuvxy{}}zyxxxxy{~~~~~}}}|{{zyxxxz{}}~~}|{yxy{}}}}||||||{}~~|x{||yvuvututvwwvvwwxxwvtsqrsuvvwxyzywuutttttstuvvqh_\j||wvwxywvvwxyyzz{{{{{zzyz{||||}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}|{{{z{zzzxtqsutttttvwxyxxxxyz{|}~~}|{{{}~~~~~~}{z{~~}|{|}}~~~}~|xvptz{~ysrv~~~~}}~~~~~~~||}}~|zvx{|{~}xvw{}ws{~~~~~~}|||||zy{zwj[NVnuonsvwzzzwuvvtsrmklmqaRbw~~~~}}{yxz{yuuvxwu~}|{{|~~~~~}~~~~~~}|||}}}~~~~~~}}~~~~~~~{ywy|{zwuvwxvwz~}}}|{{{||zxtrpoqrtusqonomsxwvxz|}zwtqlhpwwsonsz}~|}|{z|}vaYU`ntuttvusldceec`fmspkgfghgacipuuuporuwxx{|{ywvw~~}~~}{~|~}{zzzyzywvxyz{{||||}}|}~~}{zz{{|}~~~~~}}~~~~}{yxxyyzz{{|{{zyyyxwwwwwvuuuuwxyzxronprtvwvutuxyyzz{zzxwvvuvvutsuvuvwwwwwwwwyz{{{ywsttuvwy{}~~}|yxwwwwxy|}}~~}}}||||{zzyz{|~~~~~~|{yyy{}}}|{{zzzzy|~}xy|zwututtutuvwxxyyxvttrrruvxxxyz{{zxvvuuutssstuvvqi_ar{}xxxxwvvvutttvxyzyyyxxxxxz{{{||}}~~~~}~~~}}}}}}}}}}}}}}}|{{zyyyxxwwvvwvuuuuwwxyyyxxyz{||~~~|zzz{}~~~|{||~~}vpqtx|z{{uw|pknv|||{||~~}~~~~}}~}~~||~{x{yrrxz|tlv~~}}}}}|{z{|{zzyyyvoWauxqouwwusqqrvywxvnkilwsnu~|{z}|zyz}|{||{zzz|{{}|{z{}~~}}}}}~~}|{{{{|}}||}}~}|||}}}}~~~~|zxww|}{yyxxuv|~||}|||}}{xuqonoprttuvurrwxtuw{}}{yvsploqpkhjqz~}z}~}{|}~|{{{|}qaXantruxzy|sh_]\]\_dfb\YY\^\_bdkpqqoopswxxz}~~|{x{}~z{|zz{{{zywy{|||{|}}}}||}}|{zz{{||}~~~~~~}zyyyzz{{||}|||{{zxuuuuwwvvvvwxyywrnkjiikmoooquvuuuwwwvwxwxxvsqrtvvwwwxxxxwy{yyyxzxsssttuwxz|}}||||}}}~|{zwvvwwxyz{||}}}}}}||||{{z{|}~~~~~|{zzz{|||{zzyxxyx{~{yyyvuttttuuvwxyyyytrrstuwyzzzyyz{|{zxwvvuuttttuwxvqkadovyzxxwwwvvvtrpqsvxxxwwvvvvwxxyyz||}~~~}}}}}}}}}}}}}}}}}}}|{{{yyxxxyzzzyxwvvuvwyyyxxyyz{||}~~~~}{yyyz|~}}~~~~~~|wsvzxutvwrs||topw}}|{z{}}}}~~}}~~~|{|~zxx{~}zpqxwyodr~}}|{{{|{zyyzyyzywx{vykvxwwxxywtqjdfqvuywpjjr}~}}~zutuy|zxwy{{|||~}zyz{}~}||}~}}||}}~~~}}~~|yyyzzzzyzyxxxzz{||}~}}}}}~~}zy{ytuxz{zywuvy~}|{yyxvwxxwvurpoqrsuuvxwtkqzzxz|~}|zxusonmkhhnv|~|{xz{{zzyyzzzyvtuvy}~lZbnrqx}sd^]_^_b`WTVY[^[bhhjnoonnmsy{zyz{}~~~~~~}~~}~{z{||{zz{}~~}||}}}~~}{{{{{{||}~}~~~|{zzz{||}}~~}}~}}yohjpuwwvvvvvvwwvurnkgfgijlmpstsssuvwwvwwxvqmoruwwxxxxxyyx{}wwwu{yttttttuuwyzzzzzyxxxyxxwvvvwxyz{{{{{}}}}}}|||{{{|}~~~~~}|{{{{{{{zzyxwwxx{~~zxxwvuuttuuvwyyyyxrsuxxzz{{zzyyz{||{zywvvvuuuvvwyxuui]dlruwxwwvvvvtrpqsvwwvvutrtuvvvwwxz{}~~~}}}|||||}}}}}}}}}}}}|{{{zyxxxz{{zzyxwvuvxyzyyyyzz{|||}}}}|zxwwy|}~~~~~}|}}~~}{~~{~}wqt}vqu}}|{|}~~~~}}y|||~~zvy}{vrtxz|zxz}zz~ytjdr~~}yyyyzyxxzzyyxxvx{xvsvvwwwwz{vpfeejompsvppx}~~|wpkmuz{yyzzvvwxz}}tlmt{~~~~~~||}}~~}||}~~}|zxyz||{{z{|{{zz{{|}~}||||||{yxyzxvvxzzzxvvwzzzzyvsqoprrrtutqrttuuvwxxvpqvxy{}~~}{xvuqnkjilow}~}}zzyyxwvvwwwvsssvy}}|}~pYanqr{{j`^___bbXVUY^ffkpnjklmnmlt}}{zxz~~~~~}~|yyz{{{{|}~||~~~|{{|{{{||}~~~~~~}|||||}|||}}}}}~~~xd\eqwxwvuuuuuuvuvvtpnljijhksrttttwxxvuuutmjmsvxxzzzyxxxxw||uvwtzzuvvuttsstuxxyzzxuutvvvuuvwxz{|}||||}}}}}}}}}||||~~~~~~~}}|||||{zzzzywvvwwz}{zzyxwvutuvwxyzzyvtwyzzzzzzz{zzz{{|{{yxwwwvvvwwvuvwysfagpvxxwvuuwwutttvwvvvusqopsuttuuvxy{}~~}}}||||||||}}}}}}}}}}||||{zyyyyz{zyyyxvuuwyzyxxyyzz{{{{||||ywvwz}~~~~~~}{{}~}}|{{||}~}plu}~wrw}}|}~~~||~|w{}{||~~{vwzyrptxzzwtw}~~|nbhv~~{xwxxyyxx{{zyxvtx|zxwwwxxwwy|wsssqpqlirusqv{}{ysijpv{{zxyyuuuwxzzmbepz~}||}~~}|{{|}}}{yyz|~~}}~~~}|{zz{||{zyyyxwwwxz{zzyyz{zyyxxxxwvtqommnoprvwwwwwwwwvwwvsrsux|~~~}|zxusomlmqsy}~}}|zywvuttsstttstvyz}~w_anru|~}~rhb`_^flc\Y\fpswxslikmmnov}}yz}~~~}~~~}{yyyz{{||}~~}}~~}}~~}|{||||{||}~~~~~~~}|}}~~~}|||}}}}}~~~x`]myzxvuttttttutnllkpty{wqnqqrssuxzzvtssphkuy{||}}|{yyyyx}zuvwuyzuvuutttssuwyz{{yvututtuuuwx{}~}}}}}}}}}}}}~}}}}~}}}}}~~}}}}}|{zzzzywvuvx{|~~}||{zywvuuvwxyzzxvvxzzyyxyz{|{{{{{{{{zyxxxwwwxyywvwyysgjsywxxvttwwssstwvtsuutqkjlnnpsuvxyz{~~~}}}}||||||||||}}}}}}}}}|||||{zyyyyyyyzzywvvwyzyyyyyzz{{{{{{|{yvuw{~~}}~~~~~~~~~~~}|{{{{zy{}~~~}}zy{ywtofhpsy{{vy}}}~~zxz}|zy|}~}{xwxvvxzzyuqsxzz||ockv{{ywwyyzzyz||||zxuyzzz{||{yuuy{z||{zzyrmrpjgkqusrnouy|~}{xttxvvxxysjgkpr~~~~~~~}||{zz{||}}{zyy|~}{zyyyzyxwwuuuuwxyz{{{{{zxvuuuvvuspnnnoooprvy{yxxxyyyxwtrqrtwy|}}|{zxurqqruwz}~~|zxtropppprrssux{~|yzkgnty}~|{~~zo`]]^hqlc[^nx{{|wnijlmpv{~}{{~}}|}~~}zyyyz{{{|||}}}~~}||}~~}|{{|}}}|}}}~~~~~~~~|}~~}|||}}|}~xck~|xutssssttttj_YYcipv}zspoprtwzzwutqllt||}~~~~|zyyzy~zwwxvyytuttuttssvyz{}}}zyxvuuvvvwxz|}~~~~}}}}}~~~~~~~}||}}}~~~~~}}|{zzzzywvuwx{}~~~~~}|{zywvvvwyyxxwwxzzyxwwxz|}}}|{{{{{{zzyxxxxxy{{yxx{yppswwwxwutvvrrqruspouwxvmihhhmswxyzzz|}||||||||||||||||}}}}}}}||||||{{zyyxxyyz{zzyxwwyyzzyxxyzzzzzz{{{xvvx{~}}}~~~}|||{}~}|}~~~{wry}zy}}w{}}|ztrusqnnmmljrzzy}}|||}~}zxy|~}}|~~|~~zxyz{||{zxutxzyxytnonlighox{{{{|}}|{{yvxusw|}}}ytuwttzzy{|}{xuja^^dijjlry|~{rouzzz|{ynjswm^~~}|||{{zzyyz{|}~~~|yz~|{yyzzyxvutssttvwxz|}z|ztqprtvwusqonopoopprvwwwxz{{yvussqqpqty{|{{{zxutuwxxz|}~~{yvspnljlpsuwx{}~~}}ulov{~}||}~{n]XZ^iomi^^t|~~}yrlilnt}}y}~~}||}|}~}yzwwyyz{{zz{{|||}~~|{{{|}~~|||}~~~}~~~~~~~~~~~~~}~~}|||||}~yiy}wtssssstuuvseWRZZX[ky~wqnnqtwyyxwtpkt|}}}}}}~}{yyyyy}zyyyxzyuuuuvutssuyz|~|zwvwwvvxy{|~~~}}}~~~}}~~}||}}}}}~~~~}}|{zzzzywvuwy{|~~~~~~~}|{ywvuvyyxwwyyzyxwvvxz|}}}|{z{{||{{zyyyyyxy{yyx{|wutvwvwwvvwwvutsqojjrwz{wqnlhltzz{||{{zzyzz{{|||||||||||||||||||||{{zzzzzyyyyz{{{{yxxxyyyxwxz{{{zzzz{{yxxy{~~~~}{zywvy{||}}||}~|{{}~~}vir}~|||tx~~zrqy{zuuyvlhox~zwz|zwstyyuv{}~~||}|}~~~|{|ztkq|}|{wtxzzxxyxtk^UOQcv|{{|}~~zwz{xsotz}~}}zwwvngowy{||{xwpe^ZZ]_`hnt|~~vgl~~ut}~q`~}|{zzzyyxxwyz{|~~zx|~|{{{|{zywwwwxxyyxy|~yywomnqtwxvsqoopponoopqstvxz|{wtqqssrporwz{{|{{zxwwyzyyz{}~~{y{|yyz{|}}}}}~~}|{wopw~~}||}{mZUX`jnnoghx~~}zuojmsz~|}~}||{{|~}}~|uxsrtwyzzzzyyz{{{{{{|||||||}~}||}~~~~~~~~~~~~~~~~~}|||||}}{u}{vssssssstuvwtpkb]WTZdjjpooquxyywwsrpw|{|||||||zxxxxy{{{{{z{zwwvvwvuttuxy}|yxxxwvxxx|}~~~~~~~~~}||{{{|}~~~}}}}}}}||{{z{zzxvuwy{||}}~~~~}}{zywtuyzxwwyyyxwvvwy{|}}}|zyz|}}}|{zyzzzyyzxxwyzywvvuuwywxxxwwvsqmiiouy||xspjkry{|}}|zyxxyyz{{{{{||||||{{{{{||||}|{{zz{|||{z{{||||zyyxxyyxwx{|||{zzz{{zyz{|~~~}{zyxwxyyyzyyz|~|zz{{}~|zz~~~}{y{}{}~|xy{x~{laep|{vvz}}{tmowuqw}~~}~~xvvwsal{}|}}{vtwxyyz{{yq]LCC\u{zz{}~yvzzyqmv|~~~}{{zzqacu{||{yyzxm`XPMPQbxz||||xsw|z~~xq~}}{{{{yxvvvwxz}|z}~}}}}}}{yxyz{{{{yz|~ywtmkmpuz{yurppqpponnnnpruxz{zvqpoprrroquxyz{{{zxwxyyyyyz|~|vxyzz{|~}}}}}{{{{|ywvvuqqw~~}|}}}zo]VXcloqrrsz~}{vqllv}}}}~|}~|~{{zzyy{~}yyonsvxz|{yxwxyzzzzyzz{|}}}}}~~~}}}~~~~~~~~~~~~~~~~~}|{{{{{|~{||~|yusrrsttssuvxyvpkaa^^lppqvyzzxwtvwyyxyzyzyyzywvvyz||}}}|}|zzxxyxwvutwx||zzyxwxyxv{}~~~~~~~~~~}}|{{{{}~~}||}}}||{{{{|{zyvuvxzzz{||}}}||{zzywvy{xvwxxxwwvvwyz{|}}}{yz|~~~|{zzz{{{{zywwwwyyxwvttwwwxxxxvtqmihnsw|{zwsnjnvz||||{zyyyyzzz{{{||||||{z{{{{{{|}|{{zz{|}}}|||}|||{zyyyyzyyy|}}|{zz{}|{{{||}~~~}~~|{zyxxwwvwy{~~|yyyyyz{|{z|~||}~~~~~}}}~~~yw{}|v|q]]o~xtvxz{{}|uswzsr{~|~~~|{zov|ytx{yvvwxxxy{}|wjR=Gevyyyz|~~{xyyzuux}~~}|{{{|{ndlw}}{{{{ypcTFAHOc}~{yz{~~~xtxzyx~~}}}|{zyxwxy|}~~~~}~}}}|{zz{|}}|zy{~~{vqnnqvz|{wsrrrrponmmlmosvyzyvrppqrrqpqtwy{|{zywwxyxxyz|~{ywsoqssstv|~~~}|zyzzzurrssrsx}~}|}}}}yreXYhoptw{z|~~|wqmlv}||{||zzz{||}}}|{ywxz}}uswx{zywwvtstwyzzzzz{{|}~}}}~~~~}}}~~~~~~~~~~~~~~~~}{{zzzz{|~{{{|xvtssrsttstwz}vrgbkqqptx{}{xuy{{xuvvuvwwxwvvwz|{{~|||~||zz{zyxvvwxz~}|zyxyzxv{}}}}}}}}}~~~~}||{|||~~}|{{|||{{z{||}{zwuvwyyyz{{{{{{{zzzzzxxzxwwwwwwvvvvwxz{||}{yy{|||{zz{{||||{zxxxxzzyyxurquwwwxxwurniilpsxz{zxrkksy{||{|{zzzz{{{|||{{{|{|{zzzzz{{||||{{{{|}}}}|}}}||{zzzzzzzz{}~}|{{|}~~}||||}}~~~~~~}{yyyzyywwy{}~~|yxvuwzzxxy{~|{{{|}~~~~{wuw{~~|su~|vr}}j^nz{wuuuux||xz~tv~}}~{w{}{z~}{vxyyxxyyyyz|~~{xbEWswyzzz{|~}{zy{{zz}~}|{{{{{}xgbpz}}}}{ytlXCBNcoyzzyxz|~{{~~{uosxz{~}}|{{{{}}~~~~}}|||{z{}~}{zz}~{wusssw{||yuttsrqonmlkkmquxxxvsrrrrqqqqtxz}}{yxvwyzyxyy|~|ywtrpqsstwz~}~~}|zz{zzsqprttux|}||}}}|zum[[jprv{{{|}~~|xsrrttsqtvwxwxyz|~~}{yyz|~~zw}xrooqsuwyzz{{{{||}}~}||}~|~~}}~~~~~~~~~~~~~~~{zyyyz{|}~{{yxutssssstutv{qlnrsqpv}~ywz{yursstwxxxxwwxz|{yzxzz||{{|||{yyxxy{~~|zyzzzy{||{||}}}}}~}}||||}}~~|{{z{{{zzz|}}}|xwwxzzzzzzzzzzzzz{{zywxwwwwvvvvutuuvxz{z{ywwwwxxxy{||}}}}||yyyy{{{zxwsptvvwwwxwuqliiomovz{{wplrx{|}|}||{{{|}|}}}|||{{|{zzzzz{{||||{{{{|||}}}~~}}|{{{zzz{{z|}}}|{{}~~}||}}~~}}|yvuwx{|{ywy{}~~}zxsqw}}{zyz||}}||}~~|}}}yqnqx~vemzyyw}~wmrvuyxuutsx|}|~~yz}|}}yxz{~|y{~{uy{}||||{zzzzz|}~zwm[fux{|{{{|~~|{{{|||}}||{{||||{oisz}~~~}{yveQQ^ssljspqy{xvw|}yuw|}}~~~~~}~~~~}}~~~~~}}|{wvz|}}}|{zxwxyyxxz|}{xuuutspmjiilortuvwvtrsrqqqpqtx|~~|ywvwyzzyxyz|zxvutsstuvy{|zy{~~}|z{{|zspqttuvy||{{~}}}|xq\_msvxyzzz||~}{xvxwqnqqrquwwz{|}~~~}|||}}~{uljntxzz{z{{{{{|}||}~}|||||~~~~~}}}}}}~~~|{zyxxyz{}~||zvsssssssttsqx~olptwsqr|~xwyxuqprtx{zzzzyyz{zzvstuwz{yyyz{~}}{{zyyz{}~|{{{{{|||||}}}}}}}}||{}}~~}||{{zzzyz{|}~~}|zxyy{{{zzz{zzzzz{{{zxwwxxxxvwwvvuttuvwwwwutsssttvy{|}}}}}}}{{zz{|}|yxursuwwwxxyxsnkjntoty{|{wtsw{|}~~}}}}}~~~~~}|||||{{zzzzzz{{|||{{{{{{{|}}}~}}|{{{{{{{{{{|||{}~~~~~~}|{xtqpswyzxxy{}~~|zxspu{~|{zz||}}}}}}||}||zokpx~~}pYcv{z|yy~{yvywzzwvvvz~}}~}|}~wppuy~|z{|}~~|wy~}|{{{{|~~}wvtlovy{||||}~}{{|||{|||||||{{|{wrw|~~~~|zzzumlsvxrpm^fy{{{y{~~zwz~}~}~~~|{{{|}}~~~~~~}}{xuswy|~~~{wvw{|}{z{|}|zxwwvurnlnrvxwuttsssrrrqppqqty~|ywwxz{zzyxwxyxxxvtuwxxxwtsrrv|~}}}}rorvuvw{{{x{~{}~|yt^drvyxxyyy{|}|{yyzwoowxyvxyy|}~~}}~~~~~}}}}~~~{wy~~zzqjouy{|||{{zzz{{||{{|}||{{{{||~~~}||||}}~}}}{zzzzyyyz|}|zvsssssstunb\fpidq}pmmrywroz{wvwvsqrux|~||||{{|{xwropqsuuttuwz}~}||{zz{|}~~|||||||}}}}~}}}}}}||||}}~}|||||{zz{{~~~}}|||{{{}}||||}||{{{{{{zyxxzyxxvwwvutsssttttsrrqqppqswz|}}}}}}}}}|{{||{zywttvxxxyz{zwqmkn|wwy{|||zwxz|}}}||}}}~~~~}||||||{{{{zzz{{||||{{zzzz{||}}}}||||||{{{z{{{{zz~~}|xrkhjnquvxz|~~}|zxwuv{}~}{{|}~~~}|z{|}|pisy{~~||q`q}~wpqz}|}~~|}}{}~~~~~}{z|}}qilsw}~}{{|~}|~~~|zz{|~~{rsuwwx{||||}~~}|||{{zz{}~~~{zz{|{}}{wx{}~}xwzxysbeu{~~~}{{~~}}}~~~~~}{zyyz|~~~~~~~~~}}}}{wvwy|}~~|yvwz|~}||}}}{{zxxvtqosw}xsponnorsqnnpuuv{|xwxz{{zyxyxxzzyxutvwxwurqsuvvv}~|~~onsxvvx{{yv{|y{|{ywdkvxxyyyyz{{|{zz{{wru||ztv|}}~~}||~~}|}}}}}}~~~~~|vu}~wwyxu}xmnvz|||||{zzzz{z|{zzz{{{zzz{||}~~~}||||}~~~|{{zzzzzzyyyz|~}{yvsrstttvqaLQ^YMOkvrnrxyupx~yuuutqrtx|~~}}~~}}}{xtomnnpqqpprsw{}}|{||||}}~~~~~}}}|}}}}}}}~~~}}}}}}|||{}}~~~~}{{|}}}{{{}}}zzz{|}}||}~~}~~~~}|{{|||{zyyzyxxwwwutsssssrrrqppqpnnoquy{|}}}}}}~~}|z{{{yyxvvwyyyz|||xspnlz|z{{{{{{zzzz{{||z{{{}}}}||{{{|}}|}}|{{{|||||{{zyyyyz{|}}}}}|||||{{zz{{{zwtz~~}}zsjfeeinrwz}~~}|{zzzz|}~|||}}{yz}~~wnwxw{}{|xt~~zwy}~zy{}~~}}~~}|yxxz|ylhnvy}~~}{||~}~~}|zyz|}}zruy|{{||{{||~~}|{{{{yy{~~zxyz{|~}|{{zwx|~|ysruwxxttqpy|}~~~}}|xy~~}~}}~~||}||{yxz|}~~}}}}~~~}}~|||}||}}|xvw{~~~~}|zzxxwvtrqtz}vpljihkorolmntwx{~}{xxyz{{zyyyyz{|{zxvwxyxwutvz{zxy{}|||mouyxxxyvvuyxwwyyxyjoxyyzzzzzz{{zzz{zyvy}}|ru|~~~~}|{{|~~~}|{||}}~~~~~~~~~~}{||vpx{vlsmnwz|}|||{{zzzzzz{{zyyyyzzzz{{|}~~}|||||}~~|{zzzyzz{{zyz{|}|{xusstuuxudSJ^iULQk}vopwzytw{wvvtsruxz}~~}}~~~}|zxrmmoopoonnpqty||{z||}}}}}~~}}}|}}}}}||}}}}~~}}}}}}||{{}}~~}}||{{}~~~}}}zzxwwyz|~~~~~~~~~~}||||||{zyzywxxwwtssssssrqqpooppnmnoswz{|||||}~~}|{yzzzyxwxyzzz{}}|zvtulv}zzzzyxxzzzywwz{yvvwyzzyyy{||||}}~~~}|||||{{zzyxxyyyz{||}~~}}}|{{zzz{||zvpw~~~~yqkecehmt{}~~~}|||||}~~}}}~{y{{xxuw{~}{{}~}~~uty|~}zyz|~~}zwvvy|~~vmpw{|{y|}}}~~}}}~~~}|{zyxy{|}{tx{|||||{{{|}~{z{{{yxz~{vxyy}~zwvtvvxvvvvurqrtux~ylrvy||zxxywxzzzz~}}~~~}~}}{yyz|}~}|{|~{{|}}~~}~|}}~|vty}~}{zyxwvvusqqtutnhfeehknmkkkorw{~~|zxyz{{zzzzyz{||{{zwxyzzyyxy{|{ywxz~{xzprw{zxxxsuuvustuvx|svyzy{{{zz{zzzzyyywwxz|}xx|}}||{z{zz{{{|~~}}|{{|}~~~~~~~}|||}~~~~~~zs~~z~okyxtxonv{|}}|{{{{zzzyyz{zyxxwwxyyzz{|}~~~}|||||}~~~}|{{{{zzzzzz{zz{|~}}|zxutsuvxzkRKUiiPIQlyopwzw{wswwsttwz|~}}|}}}}|{ywrnnoppoonnoprv{{{{||}}}}}~~~~}}}}}}||||||}}~}}}}}}||{{}}}}||{}||}~~~~}}ywvwwz|~~~~~~~~~~~~~~}}}}}|{zyyywxxxwtstttttsrrqoooommmnpvy{{|{{{|}~~}{yyzyyyyz{{{|}~~}zxy|uuxyyzyxwvwyzxttvxxtrsuvvvuwz{{{{||}}}|{{{|{{zzyxxxxyyyz{|}~~}{{zzyyz{||zxux}}{vmgdeipw|~~~~~~~~~~~~~{y|~||yyy|}|z}~}~yx{~~~~|wvz}~~}zxwwy|~}vsy~zw|~}~w{~~~||{zxwwxy{||yz{{|}}}|{{{|~}zxyzzxx{|yrswxwxzwxxwuutrponortsrsv{}|yy}zwwtruyxvvxy~~~}{{{|}}~~zxwz|}|{{}~~}}||~{tty}~~~}|{yxwvuuusrsuwuoifdefikkjiiknrx|}{yyz{{zz{{zyyyz{{z{yyz{||{yyz{ywvvwz~{w~ytvx|{zzzuvvtrppqtxzvwxxy{{{zzzzzzzzzzywxy}||}|yxwwyzzyxyz|||||||}~~~~}||{{{|}~~}|||}}~sov}nm~~x{|ov}}~~~|zz{zzzzzzzzyxwxxyyyyyz{|}~~~~}||||}~~}{zzz{|{{z{{zzzzz{|}~}|{zwuuuvxzx_JJ^i]IHYv}qovztxstxxsvwy|~~~}|||||{zyvrooopponnnnoqsy{|||}}}}}}~~~}}}}|||||||}}}}}}|||{{{|}}||{|~}}}~~~}}|xvvwx{}~~~}}}}}}~~~~~}~~~}|{zyxwxxxwutuuuuuuttsponnmllmpvz{{{zzz{|}}}|zxyyyz{{|}}}}~~}{zz|xttxz{{zwuuw{zvtrsvurrsttttvyzzyyyz||{{zz{{{zyyxxwxxyyyz{|}~~}|zzyyyyyz{{zyyz|~|zz}~~}}~|umfcdjqx~~~~~|{}~}~{z{}~~}{|~~~{yw{~}{{|~}yx{}}}||{{{|~|ww~{x}~ywzt{}}}|||{yxwxz{||||{{z{||}|{{{|}}{xxxzyxx|xtsnrwwtssortwwxwstupmpwyzz{{{|}~{yz{ypsuwzwsty{}}}}~~}|}}~}{ywx{~~|yxy|}}||z{}~xsvy{{||{zxuuutsrrrvz|ztnjhgghjjjiijlpv||{zz{{{{{|{zyxxxxxxxuwxxz{{xwwxvuuvwx|}y{ywyz||{{{zzvromlnrvwuuwxzzzyyyyyzzz{{|}{{|}|yvtstwxxwvwy{||{|}~~~~~~~~~}||{|{|}}}}|||}~~}sqq{}nr~sz}~}}{z{zz{{{{zyyxxyyzzyxyzz||}~~~~~}|{{|}~~|zyzz||{{{{{zzzzz{{|||{zzxvvxzzzqUIObbREJjuqvzv}wx}}wuxy{|~~}|{{{{zzywsooopponmmnnoqxz}}}}}}}}}~~}}}}||{{{|||}}}|||{{{{{|||{{{|~}}}~~~}|zvwwxz}~~~}}}}}}}~~~~~~~}|{yxwxxyxwvvwwwwvvutronmlllmqw{{{{zyz{||}}|zxwxy{}}~~~~~~}|zxvvvyz{{ywutuzzxwurstttuvvuwyzyzzyx{|}{zzzzzzzyyxxwwxxxxyz{|}~}|zyyyxyzz{{{zyz{|}|yvx}~~}{|~~{ukebejs|}}~~~~}}~~|{~}}~~}|~~yvuty|}}}~}||}|{{|}~}zvy~|{~~yt}z|~~}}}}~~~|{yz{}~~}}}}|{z{{}|{{{{{zxwwxyxyy~~tnqsvxwuurnklrw{{zyxsnpw{~}{xxyz|}yvxyrv}{zvstz}}|}}}}~}zyyz{||{xwxzzywvux{||{zz{|~|xyxxyyzzywtuuusqqty~{vrnjghjiihijlov||{zz{|}|||{zyxuspoppotusqrrrqqrrsuuwwz}}z{ywxy{|||}~xroljmtuuvzxxzzyyyxxwxyz{{|}}}|~}zxroqtvwwttvx{|||}~||}~~~~~~~~~~|||}}}}}}~~~~~~|~otrvyv|~}~{{{{{{||{zyxxyzz{ywxzxz|}}~~~~}}|{|~~}{zzz||{{{{zzzzzzzz{{{zzyyxyz||yjMJU^VLFMxzrtwz}wwz{||~~}}|{{zzzyxtpooppoommmmnqw{~~~}}}}}}}}~||{{{{||}}|||||{{|{{{|{{zz{}|}}}}|{zyxyz|}~~}}}}|||}}}}~~}~}|zyxxxyyyxxxxxxwwvvtpnmlllmqx{{{{zzz{||}}}{xxxz|}~~~~}}|zwx{}z{{{ywvutuvwwwvvvvwxyyy{{z{{{{||{{{{{{{zzyxxwxyyyyz{{}}}{xxzyxyyzzzzzzzz{{{zz|}~~|{}{shbackwz|}~~}}}~|~}y{~~~~xrty{~~}}~~}{zz{}~|ywz~~}|}~{z~}tvy{||}~|{|}~~~|zy{~~|||{zyxxxyxxyy}~ukpx{|{xtoh`blwxzyvusqrwyzzwuuxxx{}yvvz|~|{wtuz|~|{z{{|}}{xwwxz|~~~zwttuuuuuvxz|{{{z{}}}|yvvxyzxutuwvtqruz}zxurnlkjjjklnpv|}{zyz{|}}|{zywuplkkilprolkknnnoprtvwwvz}|{zxvvxz{||ypkegntrswzxz{zyyxvutvxyzz{{{zxz}~|yvpnquwvvtsvxz||}~~~~}|{z{|}~~~}~~~}}~~||}~~~~}}~~{}wx}{~~}{zz{}}}zyyyz{y{yvv{uxz|}}}~~~}}|}~~~|z{{{{{{{{zyyyyyyyyyyyyzyz{{|}zlHKVWMKKa}~|||}~}}yqtuz~{zz{|}}}~}}|{{{zzzzyvroopppommmmnqw}~~~~~~~}}~||}|{zzz{{|}||||{{|||{{{{{{{{{|{||||{zyxyz{}}~~}}}}}}}}|~}|~~}|ywwwzzzyyyyyyyxxwvromlklntzz{{{{{{|||}}}{yxxz|~~~}}||{zyz|}|}|{zxvussttuwxyxwwxz{z|}}~}|~~~~~}}||||{zyyyzzyyzzz{||zwsuyyyyyzyzzzyyyz{|}~~}{}vkd`aguy|}~~~}}~~~}~~zwz}|}}~ystyz}~||~voty|~|{{{|~~{{zz|~~|{{}~zxtrlkqutuz~}}}~~}{z|}}}}|zyyyyzzyy{xyztjmt{||ytnh\Yiwtspsywvuwxyxvtuwyuquzzyz|}}|wvvy|~|zyyyz{~}{yxwx{}~}zvssstuvvvwy{}}|{{||}{ywvvxywursvwuwx|~}|zxspmnoopqsx|}}{yyz{|||{zyxumgfffhklkjiijjklorvvvusuwxyxxttuwy{}xng`frwoqvwwz|||{zwuuxyyyyyxxvvw{}|zyunntyyxvtsvxz|}~}{zyyyzz{|}~}}~}}}~~}~~}{~}zzzz|~{yyy{|z{yuryquy|}}}}~~~~~~}|{zzzz{{{zzyxxyyyxxxwxz{|}||}{nHP\SKLRuvxutuutttwqsvzvs{|}||||||||||{||{zzzzzxtoooppommnmorx}~~~~~~~~~}}~}|{z{{||}|||||||}|{zz{{|||{{{{{{{zyxyz{|}~~~~~~~~}|||}||~~~zwwwz{zyyzzyyyyyyxtqnljlqx|z{{{{{||}}}}}{yyy{}~}}|||||{zz{||}|{zxwutsttuwxzyxxxz{z{}}~}|}~~~~}|{zzz{{zyyyyz{zwqnrwxxyyyzyywwwy{|~}|z{}}~~{rha_fvz|}}}}{}~~~{||wx|~}yuw|}yvy{}~}{~tacr{~}||}}|yx{}~{zz|~}unjmoeijdfs}~~~~~~~~~~~}||||||||zzzzzzyxxyxsprigluyzyuqlc\iwokir~{ywyz{zxuvxyyoltyzx{{|{yxxz|~}{zyxyz}}|yxxz}}yusrsuvvuvvw{|zzzxwwyzzxtsvxvqruxxxy|~}{xwwwwvuvy|}~}yvxzz{zyzz|zsligfghiihiiijknqsvusonrrortxvtuwy{}wngcmz}npvvvy|~}zyz|{{zxwutrtwy{zywsmqxzzzywvvxzz|}~}zyvvwwz{||}~}}~~~~~~~~~~~~~}zwuvvvw|}{yyyz{yzzxovmsy|||||}~~~|zyxz{{{zyxxyyyyxwvvvz|}~|||zlGUbQJKVz~yuvtttspmnqorw{trzz{||{{{{{{{{{{{zyyzzzzvonnooonmnmotz}~~~~~~~~~~~}{{||}}}}|||||}}|{zz{{|}~}}||{zzyxxyy{||}~~~~~~~~~~~}}}}|}}}~~zwwxzzyyyzzyyyyz{zwtpljlsz}z{{{|||}}}}~}{zzz{}~}|||}}}}|{{{||{{zywvuvvvwxyzzyxxz{zz||{{{}~|{zz{{zyxxxyz{{wnkorwyzyyyxvttvy}~}{z{ywxz}|zkbamz~~}|}|z|~}|}|z{~{xz||wpou}~|~~|{|~}yhiw}}}}{xvx|~{yyz{}{tpouwkhcQVn|~~}~~~}}}}}~}}}}|{zywwz}{yyzzywwxxtomiecjqtvwvtnekxroos}}{z|}~|xtssvypkopv|}}zyxzz{}~|{{zyyy{~yvz}|ywvuvvutuwxyzyxxurrtwxxwuvwwuvxyxwwy}~}}~~}{zyz{}~~{uvyyyyxy{||wrnkhgfhhgiijkmpsuvuqlkpnffowyyyz{|}wqjhv}zssyzzy|~}{xsponswy{zyvrmqwz{}|{ywvwxz||{xwuvwxz{|}~}}~~~~~~~|||||||}~~~}z|~~~}}{wusqppooqx~|yxyzzyyyxnvkry|||||}~~~~~|{yyz{{{zyyyyzzzywvuvy{|}{{|znJR\KIL^x{zyxxxxxtmjlmsy|xw{z{||{zzzzzzzzzzyyyzzzzvpnnnoonmnmpv{~~~~~~~~~}||}~~~~}|||||||{zzzz{||}}|{zyyyxwwxyz{||}}||||}|}}}~~~}}}}}}~~{xxyzyxxxyzyyyz{|{yvrnlou|}{{{|||||}}}}|{zz{{}~~||||}}}|{zzz{{{{zxvvx|{zzzyyyzyyz{{{}|{|}}|{{{{z{z{}}|zyyumfisyzzyzywtrtx|~~~~~}vpsy|~pdct}~~~}~}~~~|zz|~~{y}}zzzzyspv||zy{}|{z|~~yy~}|zwvx}vrwzz{}~}zxwxvwpl`HWv}}}}}~~}|||}}}}}}}|{yywwz|wtx{zxusrqqmjec_horuxxxunqyxxzz~~}|~~|vroopsvssvrv{}}{xx{z{}~}}|zyyy{~~~~~~~~}||zwtsuvwwxxxwurqqtvwxxxxxxxyxxuvy|}~}}~}||||~~zxxwwwxz{{zxvwurnkmmkkklmoqrtvuskgmj``lw{|||}}~yvnmwzuv{|xpmnqtwz|{ywtkovy{~~~|yvvvxz{ywvuuvwy||}~~}~~~~~~~~|{{||||}}}|}|{}|||{|ywutrqqppswwutuwyyyxxxyyvkp{}}|||~~}}~~~~~~|zzz{{{zzyyyz{{zzywwwxyz||}|xaQVKK[rxzzzzzzz|xmjmquz|{zzz{{{{zzyyyyzzzzyyyyzzzwqonnnonmmmqx|~~~~~~~~~~~}|}~~}|{{{||{zzyyyz{zzyxwxwwwwwwxxyz{{{{zzyyyyz{{|}}~}}}}~}{yyzzywvwxyyyyz{{|zyuoosy{||{{{|}}}||||{{{zzz{{|}}||{{||}|{zyyyyzz{zxww|~}{yxxyyyz{{{|{{|}~~|{zz{}~~|xxzzsgcluyyy{zxtqsx|}~~~~~~~|rnsy~uhew~}}~~~~~|vy~}|}~~}~}{zzyyyuv~|vpw~}}~~}~~~~}{ywx{~znmxz{}~}zvtuyuvws_Pj}xy{|}}|{{|}}~}}}}|{z{||{xniqy{vqpoomjia^eiosvvswwpqw{}~{{|}{vqnpsuyzy|{uwz||{xwyx{}~}~~}|{|}}zwutttuuvwvsqpqsvy{{{{yyyyxst~}}~~~~~~}}~}zwvwxy{{{zzz{zzzwvvurqpppqqruutkdfd`alx}~{zuuwvou{trswxz{}|zxumouy|~~}zwutwxyxwvvvvwy{{|}}}~|{{|||||||}~{zyz{z{||}{zwutsuwwuqosvzzzzyxy{ufn{{}||}}}||}}~~~}~}|{zzzzzyyyz{|}|}|zywvwx{|}}~vXUKRp~zzzzzzzz|yolsvxz{zyyz{{{{zzxxxxyyyyyxxyzzzxsponnonmnnry}~~~~~~}~}~~~}~}||}~}|{{{{{zzyyyyyyxxwvvvuvwwwvwwxyzzzyyyxxwvvwxyz{||}}~~}{yyyyxvuvwyyyyzz{{{zwrqv{|{{zz{|}}}||{zz{{zyyyz{{{{{{{{||{zyzzzyxy{{zyz}~{xwxxyy{||}||{|}~}zyxyz{zxy{}|||{xocdoxyyz{yvtvz}~~~~}}}}}}~}wuz~wliy}}~~}}~~~~~y}|z||z{}~}{zzyyzzz}}~~zv{~}~~~~}}~~|{yyy{|xpsyy|~}|zvvx{xx|ygcvypnv|~}{zz{}~~~}}|{{|}}|yneit{tnmppjec`ckmquwvuwrhjrz}zuuxxvsoquy|~}{zxuwz||xsuww|~~~|zyy{~|ywvutsrssrqpprux{||{zxxxxsr}~~~}}~|ywwxzz|{zz{{yyz{{{||ywsrrqpqtutmglqsvx}~}~xou{yyzyy{|||zwrrvz|~~~|zwutvxyxxxxwwxz{{{|}|}~~|{|||||{|~}}{zyyyz{|{yvvwyyyvtuwzz{{{zyy|qt{x|}}}}}~}}~}~}}}|}~~~|{zxxyzyyz{|}~~~}{ywwwyz|}~}cUJ^}}{zzzzzzz{zrrwxzzzywwx{||{zzxwvwxxzzyxyzzzzyurpnnnnmoquz}~~~~~~~~~}}}}||}|{{|~~~~}||{zzzzzzyyyyyxxwutuuvwxyxvwwxyzyzzzzzyxwvvvwwxyz{|}~~}|zyyyxwuuuwxxyyyzzz{zwssw{|{{{zz{|||||{zzzzzyzzz{|{{{zz{{{{{z{}|zyy{||{{|}~~zxxxxyz{|}~|{zz{}~~zxvvttsstw{|{|zzsfairwyz{zyyz|~~~}|||||{|~~~yqm{}|~~~}{z{|~~~~|xz{z|}|zyxyzz{{||}}}~}}~}~~}~~}}~}}{|~~|zyz|}zytu}||}}{|{zutyzttz{vhcq|~}zxy|}~~~}|zz|}}{ywqluxslkornd\gqpqrstuvtj`elqt|}xqpttsolnuz|{vvwvwxz{ztoprtz~}}zxvwz|~}|{yxvvuutsrqrsvyzyyxwwwvrsy~~~}~~}zxxwxzz|{zzz{yyyy{|~~}{wtsqqqtttqow}~~}~|~}~~}||zzz{|}|zwvwy{|}}|zxvuwyzzzzzyyy{{zz|~}|{|}~~~}|}}}|}|~{xyyyzzyz{}|yxwxz{zyz{yyz|}}{yu}xy{vy}}}~}~~~||{|}}~{zywwxyzz{z}~~{yxwxyz}}}kWKi~zzzzzzzzzyzwwxyzzytqsx|}|{zzxwuvwxyyyyyz{{{zxtqomnmnqsx|~~~~~~~~~~||||{{{{zzz{|||~}{zyyzzzzyyyyxxwvuuvwxz{{zxxxyz{yz{~}||{{yxwwvwwxyz{}~~~}}}|zxxxxwvuuvwxyyyyyzzywttx||{{{zzz{{{{{zyyyzzzzz||}|{{zz{{{{z{|}{yxy{{{zzzz{~|yyyxwwy{}}|zxwwyz|~~~|yvusssrsttuxz{ztiadmvyz{{||}~~}|{{|{{|~}zvs|~}|}}~~}~~~~~}wz~|yxxyzyz{~}~}xx~~|}~~|{}}}~~}}}}{y{~|yz}~}vkq~{{~~}|wpqy|{z|zvniw}ywx|~~~}|zyz{|zxyyvvuqonowwmas~wwrjmrvunbddgjpwyqpuutnknuz|{yxwuwyzywpjgdfs{~}zwuuwy{}~~}|{{{{{yxwvussuuvvuuvvursvz}~~~~~~~~}|yxwwxyz{{{{z{zzyz{}~~~|ytrrssttuswy~}|{{~|}}|}{{zz|}|zyxxyzz||{zyvvwy{|||zzz{|{zz{}~}}|{|}~~~~~~~~}~||}}}}}~~zxxz{{{{{}~~}zxyyz{||||}|yy~zyxxwqv}||}}|||}|zz{|~~}zyxwwxy|z|{~}{yxwwwz|}sWTq|yzzzzzzzzzzyyxyzywomux|}{zzzywvuvwxxxyyz{{|{zvrpnmmosw{||~~~~}|{||{{zzz{{{zz{}}{yxxyyzyyyyyxxwvvvwy{}~}zxxxyzzyz}~~~}|zyxxxwwwwxz|}~~~}}|{zyyyyxwuuuvxxyyyyyzyxuux{||||{zzzzzzyyxxyzzz{{}~}{zzz{{{zz{{{zyyz{{zyxxxz}~}||{yyy{|||zwvuvvxy{}~}{ywusssttttuwyz{ypdcnvy{{||}}}~~~}}||||}~|{{zx}~}|||}~|}}~}{|~~~|{{{{xy{~{vy~|~~{y|~}}}{y{~~{{}~}wpv~||~~~}{uosz|}}|zxtwz}yvx|~~~~|zxyz{ywyyysrqsusxysv|}~|hZdqwuroe^`dlw|vvxyxusuy{}{yyxwyzzxvqkjg`p|~~|xvutuwz}~}}~~~~}~~}{xwwvtsrtvvtrrruz~|yy|~~~~}}~~|zxwwwxx{|||{z{{|||}}~~~{uqruvvvvwyz~~}}|{{|~~~}|}}}|||}|{zyxwwxz{{zzxyz{}}}}{{{|||{z{||}}}}|{|~~~~~}}~~~~}}|||||||~~~}~~}{yxy{|{yutvxxzzzzux}~~~}|zz~|||}w{~}{}}}~}|}~}{{|||~||zyxxxyzxqv{}|ywvvw{|w]^wzyzyzzzzz{{{{yxxyyvlnyy||{zzzyxwvvvxyyzz{|||{|xtqomnqv|~|~}}|{|}~}{{{{|||||||zxwwxxyzyyyyyxwwwwx{~|zyyyyzz{~~~}||{yxwxy{|}}}}}}|{zz{{zxuttuwyyyyyyyyyuuxz||||{zyyyyyxxxxxyzzz{}~~{zyzzzzyyyzzyyyz{{zyxxx{}}|zz{}}|zxvutuvxyz||}~}zyywtrrstuvwxy{{||tgeqxz{|{zz{|~~~~~}}}~|{{}}|~~}|}}}zx}~~}zy|~{z}}~{z}~}}~~|z|~}|~}~}|||||zusy}~~~}||}}zy{~~~}~~~|zxxyyxvvwtnjrz}|yux|{y|t`XgsyxyznXTdu|{zyz{{{|}~~{zwx{|zxwvwptxs}~~}~}zwutttvz}~~~~~~}|{zzxwutvwwusrprv{~ystz~~}|{|}~~|zxvvvwwz|}|{zz{|||{{|}}{xuvxyyxxyxy|}}}|{z{|~~}}}~~}}}}|{zyyxxxyy{{{{{|}}}~}|{{{{{{{{{z{|}}|||~~~}}}~~~~}||~~~}}|||||{{{|~~}|{zzz{}~zqgdefmtvtrnzttw|~~~~~|}}}}~}}|~~~~}}}||}|{zzzzyyzzsx~~~~~~}{ywwwzzyihzyyyyz{{{{{{{zxwwxyvoryz|{{{{{zywvuuwz{|}|}}|{}zvqnnosy~}{{{zy{{{ywvxz||{yyz{{|}{z|zyvwwxxyzyxxyyxwwwxz|~|{{{zyz{z}}{zyz{{||}}|{{zz{|{zxtsstvxyyyyyxxxvuwz||||{yxwwwwxxxxxxyyyz{|}}{yyxyywvvvwxxyzz{{zyyxz{}}{z}~|zxvuuuvwwyxxy{}~}|zxxwusstuvwwxz|}}|vkhty{||zwvwy|~}}~}}~~}}~{z}~~}~}|~~}|}~}{|~||}~}}}~}{{{{{{zxy}~}~~||||}~{z|}~~|{yxxwvuvtpklsw{}|{{zxwvf]duz|{{~w\Ndz{{zyxvvuwy}~~~}}~~{yxxvz~~~~~~{ywvtstvy{~~{yyxyyxxxyz{zxwtsqrtx|{wssy}{yy{}~}zywvuvxz|}}|{{{||{yxxyzzzyyz{{zzyxxy{||{zyz|~~}}}~}}}|{{{zzz{{{{{|}}}~}}||||{zzz{zzzxvuvyzzzz}~}||}}}}}}}}}~~||{z{{{{{||~|{{{{|}~vjb^_ltsl_h|vggw~~~|{}~~~}}||}~}z}||||{{zzzyyy{w{z~~}|{|}}}~~|{yxyxzusywyzyz{|{||{zxwvwxywtuxz{{{{||{zxvuvx{}~~}|{|}zvqnoqu{~{wwsportuqonqtwvursuyyzyxx}zxwwxxy{zyxxyyxwwxz|~~}||{yxyz{~~}{{||{||{zzyxyz{zywsrrsuvxyyyyxwxvuvy{||{zxxwwwwwwxxwwwwxyyz{{zyxwwusssstuvxyzzz{zzz|}~}|~~|{yxwvuuvwvutvy{|{zxxxwvvwwxxxxyz{yzwlivz{{{xtrsw|~~~~~|{}~xx~}}~~|z|~~~}~~~~~~}|zyz}|{|~vv|~}{{{zzzyy{}}|}}yttx|{vw{}~}||zywtsuxxsoopqu{~|zwtrnbdr}{{zj]kzyywwurpqrvz}~yxxy{|}~x~~}{yxvuuuuwz}~|{{{|{yyyvvxyyxvtstuvxywvvz~~|yxy{}}{zywvvwy|}~~}}}}|zwtstvwxyyz{{{zxwvwyz{{yyz{}~}~~~~~~}|{{{||}~}}}~~~~|zxwwzvxxz{{zywtrsuxzzz}~||||||||}}}}}~~~~}|zxwxz{|}}~~~}||{{|}rc[_ppl_av}hZq|~~{yx{|}}~~}}~|}{rtz~||||{zzyyyyxyz|{}|w{yxyz{|~}zyywzyxzzz{z{|}|||{zwvvwxyywwyz{{{||||{ywvwz}~{zyz{yupoprvz{vvtppsuvronosvwuprsvtrqsy}zyxxyyz|{zxwxxwvvx|~~}~~~{xwyy{~~}|||{{{zywvuuvwwwvtsrrssuwxyyyxwxxvuwz||{ywvvvwwwwwwvvvvwxxyyyyywvusqpooprsuwxxz|}||~~~~~~~~}{zxwvvwwvuttvyz{yxxxxyyzyyxvssutvxyspyzz{{xtrsv{~}~~~|ywz~~~rl~|~~}~}yv|~~~~~}zyy|}|yy{~~st}}{{|{zzzz{|||}~{topv||wtw{}}|||{ywuuwz{xrpmlq{~}{xoihlqw|}|{|}|vrt{{zwuronkkry{~~zy}yxwy{}}|y~}{|~}|{yxvttuw|~~}}|{{~~{vstuuuttuvvvvwwxy{|{zyxz|~}{yywusstw{}~~~~|yuqoqtvwxyzzyyxvtstwyzzzz{|}~~|trrw~~~}||||~}ytppnvxyz|}}|zwuttvxzzz}~||||{{{{}}~~}~~}}|{zxvx|~~}}|{{|}{sgenfd_p~{y{}|wnwx|}zyy||||{zz{{{~pmqy||||{zyyxyyyzz{{{}wzwvvvwwy|~|yxxxyyz{|||||~~~}|{ywwwwxyyyyzz{{{||}}}{xvx{~~}ywutuvtspopruxz{~}zzzyyyz{ywvuwzzyxyyxuqmnwyyxyyz|}|{yvvuuuuz~~~~}zwxz||||||}|{{{yvsrrsttssrrssrrrtwyyzzyxyzxttw{{zxvttvwwvvvvvvwwxxyzyyyxwutrqpooopqsuvvvz}~~~~}}~~~}{zxwxxxwuuvxyyyyyyyyzzzxvsnnojntzyvzyzz{ywtsu{~}~~~|ywy}~}}{ztryxz~~~}|~~~|vv}}{{{|zxx{~~zsmrz||||~}|||||{{{|||{||}~{vsty}~}zvuy{{{{{||zxvspryzvrkho|}|yrlmuwxwwx{}~{{||{xsoomgbfquy}~}vsyzyxz|}}{y}}~|zwtrrux{~~}||{{||zyyutstttttuvvvvvxz{zzyxy{}~|ywvtrqporw|~~~}}{xurqsuwxxyyxwwvsrqrvy{{{|}}~}}}~}z{rrux}~}~~}||{|~xnhehlrz|}~~|{yxwwxz{|{~~~||||{{{{}}~~~~}}}||||}~}||{{zth^bf||okjkotvwwwwrnkt{~~||||||{{zu{|y}}utz}}}|{yxxxyyz{zzyy{ywvvvvuvxxwuvvwwxz|}~~~~}}}|zyxvvwwxyyzzzz{{{|}~}zwy}|{wtrqppqpqoopqstrsz|{}{}~}}zxvsrqqprx{}}}{xusrtyvxxyyz|~~}|xvtsrsx}~|yxx}~{{{{|}|{{zxtrqqrssrqrrsssssuy{{{zzz{{yurvzzxvttuwwvuuuuvwxxyyzzzyxwvuutsssrqpqrstttvz}}~}}}~~}|yxyzzyxwwwxyzzzzyyzzywuspplacjtzyyyyyzzxvtty~~~}||~~~~~yy|zv}}vtw~}}|||xx}}zxy{~||}}{xx||qb]fprsuy|}}|||}~}|||}|||{zz{~}yxy|}|{ywwxyyzyz{{zxsjeju{xunfiuzzz{xvxyywttv{}~|yyzytoomia^imow}}xw|{zy|~}zx~|yvsrrtx|~~}|{{z{{}|zxvuwwvvuuuuttuxz{zywwy{}~}{xusrqponptx|}|{xwxvtstvxyxxxwwwurqrty{{{|}}~}}|{|~yuz{vwy{||~}|}}~~~~~|}~yk`]_hwvz~~}|{{{{||{||~}||||||||}~~~~}~~~}||{}ye[cntdbbbfmqrstuqpsw{~~~}ywvxxzwyyw{}~~}}~~~~{{yxwxyyyzyyyy~{yyy{{zzzzzyyxvwyz|}~~}{zyxvvutuvwxyyz{zz{{||}~~|xz~}ywtsrrqpppqppprrqporsvyz|}|zvomjiggffov{|{zxyy{xtvxyyy{|~~~{zwtrpsx}~|{|~~~~|{{{{}|||{wtqpqssssrtttssttvz}}{zzzzzyvuwyywuuuvwwvuttuvwxyyyzzyxwvvvvwxywvtsqqrststwy}~~}~~~}{zz{|{{zyxxyz{zzzzyywvwvvvp`]ahqwyxxxyyyxvuz~~~{{|{zz}xyy~~~}{|zvvvw}}ss}}|}~}~~~}}}}||~~|yy|viglqpmrvz}}}}}~~~~}}||{yxy|~|{{||}|{zxuvxyxxxxxurifmuvwwshcgmqx|{xxyzyvuvyz{||yvuuyzuqollgadeht}~{z{{{{|~yx~}~~~|zwrqsw|~}|{z{{z{}~~|zxxwxxyywuutuwyzzywvwz}}|zwusrqqpqrtvwxxxvvxvttvwyyxxwvwvuqpsv|}|{{|}~}|{{z|wrv{}{yyz|}~}{{}}~~~}~~tg]YW_r{y{~}}}}}|~{zz{~~}|||}}}}}~~~~~~~~~~}}||}~~|{|}vbatwmedb^coqrrrtuz~{|~~~~~wnotvprx{z}~}}}~~~~~{zxxxxyyxxxxyz{yyz{}||||{{zzwxy{|}~~}|zxuttssrtuxxyyzzzz{{||}~~~|z{{xvuvwwwuttsrqpprrpqopprux{}|wrlkihgffdgkrvxxxz{zvvxyyzz{}}}}||zvsnoqty|}}}~~}}~~}||||}}}|{xusrstttsruutsstuwz|}|zyxxyxwwxyxvvvwxwvuuttuvwxyyyyyxwvvvwxz||{xvtqpqsttstv|~~~~}~~{{||}|{zyz{||{{zzxwvuvvxxsmh`cisxxwxyzzxxwz~~~~~~~~}}|{{}{{~~~~~~}zz|zuuvy}~ru||{|}}~}|{{|}~}|{}{sr{|ysrvz|}~~~~~~~~~}}|zyxy|}|{{|}}|}}zvuxxwvutsrqggnsrwywnebco{|zxvurqprvz{vqvvtuvxzvqopomighox{}}}}|{{||}}yv}|}~~~~~~}{yz|~~}||{{||{{}~|{zyxxyyyyxwxz{zyvuvy}~|{xvtsrrrstttsrssrsuvvvvxxyyxwutxxwsrvy~~}{{{}}}|{zyv|vrtwxyzz|}~~~~}{z{|}}~n\WW\h|~~~~~~~}}zxwz~|||~~~~~~}~~~}}}|||}}{zz{~oetmdbc`]cqrrpqsy~~~~~|zxyxrrw{}~~}}|zxyyyyyxwwwy{}|{{yyz{|}}}}||{xyz||}~}|zxvsrrrqpstxyyyyzzz{|}}~~}|zxuuwy|~}|zzyxxwutttstrsrrrv{~{vqmkjiihhgghotvvwyz|zyyyzzzzz||}}}}|yvrqpqsw{~~}||}~~}}}}}}|{zxvttttsrrvwvttuuwy{|}|yxxwvwxyyxwwxyxwvuuuuvwxyyyyxxwvvvwxz{}~|zwtrpqsstrrt}~}~|{|}}|{zzz{|||{{zxvutvvxwunkebeowvwxz{{zyy{~~}}~~~~~~~~}vy|~~||~~}~~}}~~~~~|yy|}xv{}||}~~yz~|y{||}~~~|{zz{||}}}~zsfVTahqw{}~~|||}~~~~~~}|{ywz||}}}~~~~~xvwvuusqpprfhpfjuyysg[`t~xwtqmiecfmsvuqvss{{yyuprsstqot{{wvx|}}}~~~{yx~}~}}}~}}~~}|||}}|{{}}~~|}}|zyxz|}}||}}{yvuwz}~|{yvtsssrstvwtrppqquyyxxxyzyxwutty{zwvz}~|{||}}}{zxvwvuuuuvyz|~~~~~}}~~|z{|}~~|n^WYft~~~|wty~}||}~~~~~~~~~~~}}}|{{{|{z{{}ztrb[]^\[crrsrrsy~~~}}zxy}}{yzzzzxwwvvy{{xz{{zyy{|}||}|{yz|||}}||zwtrrsronquyyyyyzzz{|~~~}|yvwy{}~~~~~~~}{{zzxxvvvy|~{wrnlkkjjkllmqsuuvwxxyzzzzzzyy{|~}{zxvssswz|~~~~}||}~~~}}}}||{{zxvusrqqsvxwuuuuvwxz|}zxwwvwxyyxxyzyxwvvvvvwxyyyyxwwvvvvwxz|}}|zwtrqqrssrru~~~}}{{|}~}|{z{{{||{{zxussuwwyygekecmuvxz{{zzyy{|||}}}}}~~}}qfo{~~}~~~~{{}}}}~~|zz|}xu{}{yz}~{|}~~}{z{{|||~}zxxz{z{|~}|xgIGbkox{}~}yz{||}~~~~~}|zy|~~~}|z{ywtstqnoppfcrcdpyxsh\gzzwyzwrkd]\bksxy|vwypjsxnmruzyx{|wvx{~~|}~}vuxy}}~}|{~~~~~~}|{zyxyz{|{{{{|}}~~~}zwwx{~}{yxusstutuuuwvtrsttwz{{zzzzyxvttx}~|zy|~~~}||}}}}|zxwvvuvuttx{{|}{{~}}}}{{}~~~~zwri_Z\n{~~~~zsw}~}}}}}~~~}}}}|||}~}|zzzzzz{|}~~r_XZ[ZZestttst{~~}zyzy{yuttvx{{vyz{zyxxxzz{||{z|}|||||{zwussvsnmqtxxyyyzz{{}~~}|zz|}~~|}|||}zxtronnnnoqqtuuuuuvvwyz{{{{zzyz{|}}}|{{{wtsuy{}}}|}~~~}}}}~~~~}~}}}|{{{{zxuqpnosvxxwvvuuuvxz|{yxwvwxyyyyz{zyxwwxxxxyyyyxwvvvvvvwxyz{{zxvsrqqrrsrsw~~~~|{{zz{}~~}|{{||{|||{xtonrut{kcrndkvz{||{zzyz{{||}}~~~~~~}vgox|yww{~yy|~~}{{{{yxz}||{|~}xxz|~~~~}z{{}}~~|tu{{y{~~}~sa_uuvz}~~}zy{{{|~~~~}|ywy|~~|zw}}{xusromopogZgnpxywtolw|vvz~~{xocZ]eosw}yyyqlqwmglv~}z|~~}~~ysjlz|wqlf~~}|z}~~}|yyy{{||{ywww{|}~~~{yy{~}|zxwvuuuuuutuvwxwwxyz{||||{zxwvstz~}~~}}}}}}|||zxwvuuuutux{{|}|}~~~}~}}}~}}~}ysld^_gt}~~~~|tw|~}}|||~~~~}||{zzz{~|zxxyz{{|}sb[[ZY]hrutssu|~~~~}|zzzzzvsrsuy}|wyz{zyxvwwxzz{||}}||||{{zxwtuxvpmptxxxyyzz{|~~~}||}}~~~~~~~~|ywxxyyztprrrrstwwwvuvxyzz{{{{{{zzzzzyyyyz{zxssuyz{|~}||}}~}}}}}}~~}}}|||{{{{zxuqnmnswxxwwvuttuvyz{zxwwwxyyzz{{{zyyyzyyyyyyxwvvvuuutuvwxyxwvusqppqppqty}~~}~|zyyyz{}}||}}yvx{zwsojnvvv|wiwykgv|}}|{zyz{{{||}~}tkfwxoouzywz~~}|{|}|zwz~|}~~}ytuvz~~~}}~{y{|~|rt|{|z|}zw{{{}~~}|}zyxxz~~~}|{xtsuz~}{yuz}yvsqoomljjfn{|z|{upy|xwz~~}zoa[^ffjuxuvvtuvm`br}wz}~xqiTVv~zztdc}yx|}|z{}~}~~}{xvz~~}}{yxwwx{~~||}~}zwvwwxwwvuttvz|}{{{z{{|}}{zxvurqv}~}||}}}}|{ywwvuuuvvxzzz{}~~~~}~~~~~~}|||}~{sjd^eqy~~~~~~~~~~wy|~~}||{{}}~}|zyxwxz}~|~{yxyz{|}~sb]\ZY`jrtssru~~~~~}}{z|}wqqrtvwxwrtvyzyxwvvvxyz{||||||{{{zzyvx{ztpptyyyyyz{{|~~~~}}~~~}}~~~~~~~{vsrrtxz{urttttuvxyxxwy{||{{{{{{{{{zyxwvvvwxxwtrtxyyz|~~}}}}}}}}}}}}}}||||||{{zzzxvrmmouxxxwvutsrsuxz{zyxwwxyz{{{||{zz{|{zzzyyxwvuuuuuttuuvvvuusrpooomlrz~~~}}|}}~~ywwxxy{}~~~~}wnqxzxvtmkt{x{|qw~uju}~}|{{zz{|||}~whkr{wrty}{wy}}{z{~~yvz}}~|wrrtz~~~~~~{z|~|z}~}{wqvzvvx|}~~~~}~~~~~}|{xvtux~}||{yusuy}~~}{xwx~}zxusrrsstvsqwxuvwpku{vuvx}~|z{ui_Z[]bltvx{{zyqdfrxz}|xz|tfoubd}}z{ymt{yxy|}}|{{zz~~}~~}{xuvxy{|{z|||{}~~~~{xwxyyyywussvz~}zywwxy{|{yvttrpt|}{{|~}{zwttuvwwwwy{{{zy|~~~}}~~}}}~}|||}~{shb^mw{~~}}|}||||~|{}~~~~~~}||{{|}~~}|zxvuvy||}zyz|}}l]Z[[[bmrssrrv~yx|~{yy|vqsvwwvsokmqtwyxxwwvvwxyz{{{|{{{zz{{yz}}ysquzzyxz{{{|~~~~~~~}}~~{zwtponnprttsttuvvwxz{zzy{}}|{{{{{{zz{zxwvutsstsrrrswyyz{|}~~}}||}}}}}}}}}}|||||{{zzzyxwtnoqvxyxvuutrrruwy{{yxwvwyyzzz{{{||}}||{{zyxwvuttttsstttuuttsqpoomkht~~}}}}}}}}}}|}~wvvvvwy{}~~wlmwzxyytjp~~{|xy}|st{}}|{z{||}}}}~~{oky}xyxx||xy|~~}{{~}zx{}}~|vqpsz~~~}~}|{{xx{{{wrpw}|vxyy{}}~~~~~~}|zyvrrx~~}|||{ywx{|}}}{{zz{{{zywuvwz{~|xsvuqrwskkkjpsv{|{z{wrj]Xcfkquvxzzyxtojm{xkjtg^vyz~{{zw}|zyx{~}~~|{zyw{~~{{{|~|ywsrswz{{}}~}~~~~~|yxyyzz{yvssvy}|wsrrtvvxwwustuuw}|zz|~}{ywssuvwxxwz}|{wwz{|{|}}||||}~}|{}~~~~}{z{wrf_apty~~}{z{{zzzy|~~}}}}}}}}|{{{}}}~|ywwvvy|}{{}gYXZ\\dnssrrsy~|}}vrmvyxwxyqqopqtvyzyxwwvwxxyzz{|{{zz{|{|}||wsv|{wwz{{{|}~~~|xtplikklmnomnrtvwxyz{|{{{}}~|zzz{{{zzzyxuwvuqnponnpswyz{{|||}~}}|||||||}}}}}}}|{{{{{{zyyyxxxvrstxyxxvutsrrsuwyzzyxwuuvvwwxxyz{|||||{zzyxwvutsssstuuuvvuusqppomieryx~~~}}}}~~~~}}|{{y|~uuuuuuvxz{|~ynotyyzzzrt~~{}|}{~{wy|||zz{|}~~~~}{u|~|x{ywz~|yz|~~~~}~}|{|~xy||}~~||}~}wsrtz~~~{yxy{~~{wutv|~~xz}{|~~~~}|z|yttz~}|{{|}}|{{{|||{|}|{yxwwtvy|~{xy~}xu{|sgcgsvxyz{|{yzwfaqsqrqpmouttvn^k~}p][iddz}|yxz|zzz|~}~~|{zxwy{}~~}~}|zvstvxz{{|}}}}}{zzzy{~~~~~|zxxyyzzywutux|~{upquuttuutstux{|~|zy{~~|zxutuwxxwwz}|{vtrvtoox|{{{{|~~~}|{{||}~}~~|ywxwvldhlsz}~}|zyyyyxxx{~~~}}}}}}}}{{{|}}~~{xwxvwy}~}}p^YYZ^eossrrt{|wrs}yxy{zsronpruyzyxxwwvvwxyy{{{zzyz{{||z{yuuztpvz{{z{|}~~~~xvsohdgnllllikoswyz{|||{{|~~}{zzyzzzzzzz{yzyvnklkkklrvy{||||||}}||{|||||||||||||{{{{{zzyyxxxywuuwyxxwutsrrssuxyyyxwvuutsssrsuwy{|||{zzyxwvututttstvwwwwwvurqppnjhgrw|~~~~}}}}}}}}}~}}}{||zuttuttttuvz}~|trtvyyyzxx{}}~}}|}|{z~}{z{|}~~~~}{z~}{wzzy{~|zz|~}}{|~}yyz|}~}tw{}}~~||}~~zwwx{~~|yxz~yuyxx}~~xy~~z}~}{{zxwx}~}{z{{~}|{{|zz}~{ywvutv{}~}zx{zw{{wnfjtzyy{}~}}|}vquusrpmfgnpnmkdn}zp^V`hly~|xtww~}|}~}}~~|zxwwwy}}|}~|ywutwz{|||{xtstvusv{~~~}{zxxyyyyxxvvvwyxrpu}{tppprtvy|~~|z{}~}}{zyyyyxvvxz{vnkiigktz|zyzz{|~{|||{z{{{{{||zwwy||tlutx}~}{yxxxxwwwxz}~~~~~~~~~~}{z{|}~~}}zxxwxz}zf^[[`gnsrrsv}zvrxyuuwyz|~xqimmorw{{zzxxwwwxyyz{{zzz{{|{yusrppogivz{{z{||}~~}yutsrqgciijjifhnuyz{||||||}~|{yyzzzz{{{~}ypihhhhjpux{||||||||{{{{|||||||||||{{{{{zzzzyyyyxwwxxxwwutsssstuwyxxwwwvwwvttsqqstwy{{{{{zyxwvututtttuwwwxxxwwurqqplgjx{}}~~~~}}||||{{{}~}yvuuttrrqqswz}~}xutwxyyyyz{}~~~~~~~~|z{{|}~~}~}}~~|uwz{|~|{}~|zwy|}zuuv}~ts}|}~}}~}{{|~~~}{{}{qox{{|{|xuv|znr}{{zxy{}~~|{yz{}~|||{xy|~{wsstx~}{xwz|~~xwz}|wqsxxttw|~}||||zywsqonfgorogfkvzwqcW]ks{}ulo{{~~~}|}~~}~~|yvuuuwy{~~||~}{xuuwyy{|{upruwvssx|}~}{ywxxyz{zzyxxyywwz~|wtssuy{}~}{{}~~~}||{zywuuvwxsggfbiuyyxxxyz|~}|{{{zzyywxy{{{|~~yu}~{~|spuyyxxxxy{}~~|{{|}~~~|zzz{~~ma\\`hprsrtx~{yyxnssvy|}~|sfkmoruz||{yyxxxxyzz{zz{{{|{yslfbdgd`jwz{{z{|}}~~~~~~~~|xvrrrtw}ue[bggedir{{|}}}||}|~}|zyyzzzzz{|~}vmffffhotx{|||{{{{{{{{{{{{{||||||{{zzzzzzzzzzzywtsuyxvutsssssuwyzyxvwwvyzzxxussstvyz{{{{zyxvvutuuuuuvwwwxxxyxwuuvtpjt~~}}~~~~}}||{zyxy{|~~~zvvuutrpoopty{}~zwvwxyyyyz{}}~|z{{}}~~}zz{}~{z{~tt{}~~|~}wtvz{xsqv~~rw}|}~~~~~|{ywz|{}|shkw|~|{wmnrwzkk~~}}||z{|}}}|ywxy|~~}{xz}}{ywwy|~}yxz|~|vrt|~~~{z{ytstyzyvvvyzzxtqoplovyujdkuztm_^oy}|shw~|}~~~|||~~{xutsuvwwy}}|}|zwutux{{tptwxxussuy{|~~|zzzz{|}}|||||{{|{z{|||||}~~}|}~~~}{zxwuttuvslmlgswipwxxy{|~}||||zwxwvxx{}~|}sddq{zyyyz|}}~~~~|{|}~~~~}|}~~}k`\]ajqsrruz~~}~|ytkpuvwz|~~|yphkprtx||{zzzyyyz{{{{{{||{xqj`YX^b`etyz{{{|}~~~~}||{{~~zwtrrpppv|oW\ccaepz~}}~~}|||{}~}{zzzzzzzz{|whfdejpux{|||{{{{{{zzzzzzz{{|||{{{zzzzzzzzzzyyvqosyxvussststx{{zyxvwwvwyyyzzxxxxy{{{{||{ywvuutuuuvvwwwwxxwxxwxy|{xu|~~}}~~~~}}||{ywvwz{}}~|wvvvusqoopswz~|zxxxxxyzz{|}~{{{{|}~~|yvvx{}zxy}rs~}|}~{wxyywsuy|zy~||}~~~zuvtkiv|yynkqy}ylorpuy}~ur}~}}~~~~~}}||{xutuw{}}{{||zvtxyyy{|}~}|||uqt|~}{zxwvvvtqonotxwurrsruz|zrpqu{utkjtx||{z}~~|wp}~~}~~}}~~}}~~zwsrrtvuuvy{}~||}}zvttvxzvsvxyzyuqopu{~~}|||}~~~~|||zxy}~~~~~}{xwvuttttrnsqmnliu{|{{{|}~}||~tqvwwy{}~~xjadnwzzz{|~~}}~~~~}||}}}~|~~}}~~~xh^[]ckrsssv{~~~~}}~}z|}}ypywwxz|}~}{sklqrrv{{z{{{zzz{|||{{{||{tiaWQV]abq{z{||{|}~~}}||}}~~||xtrrqpqpszw`T]__jw~~~||{zz}|zzzzzzzzzz}~lecgoswy{|||{{{{{zzyyzzzzz{{{{{{{zzzzzzzzzyxxwsrvzxvuttttsty}|{zyxxxxwxxz|}~}||||||||{zywvuuutuvvvwwwwxxwvvvwwy{|z}}}}}~~~}}}}|{ywuvyz}}}||wvwwvtrppqsvx}}{yyyyyzz{{|~~~{z{||}~~~~|yvtsuz}{}rs~}{}~zxyzz{}}{||{|}~|qjnphgw~zxqswz|{{}|wxvmkr{~}{|~~~|||~~}|{zwsnnq{|}~~{wurnpstwxxz{|~~}~~}ywwz}~{zxvpsroopplmsuuttsuwyz{{{{|zuvvuvw|{lit|}}zvy{z~|}~}}~|yutstuuttvwy|~~}|}~~}zxwwwzxvzz{||ytolqy~~|||yvwz|~|{}}|zxvttttttsqmspnnsy|}}|{zz{}}}}~pmvyz|}}}~~~xqoquxyz{{|~~}}}~~~}}|}}}}}~~~~}|~~~~~{uia]^dmrstux||}}}{{z{|}~~}~|ywxy}xzvwy{}~}}zvtrsrqtxzz{}|{{{{|}|{{z|}zqdYQOX^`iz||||}|}~~~~}}}~zwspqrqoptx{kTY\bs~}}zuu~{{zzz{{zzyy{}{neeluwyz{||{{{{{zzyyyyyzzzzzzzzzzzzzzzzzzyxxwxwwz{ywvuuuustx|}||{zzzyyxy{|~~~}}}||||{zywvuuuuvvwwwwwwxxxwvvusqtwz{||}}}~~}}}}}}{ywvvy{}}{y}{vuvvwxvuttuuw{}|zyxyzzz{|}}}{{|||}}~~}||zwsrw~~~}vr{}z|zw{||}||}~~}}~}{rhnvuu}~|}}wuvx}|vtw{|xqmw}}y{zz|~|zxuqihlx||}~ymb`gqvxz~|}}~{|}|z{|{{{{|}|ytrlrpnqrvoouxwwvuvwvwx|~}z{zxvxygU^rz}|yvvww~~~~}|}~~~{wutttssttx|~~}|}}||}}~{zzyxyww||||}|xpkox~~~~~|{{wutuuw|zx|}zywutsssstutojmnnqy|sqwzzxxy{|~~}}~~spv{|~}||}~~zwwxyzzz||{~~}|}~~}||{{|}}}}~}{|}~~~~}~~~~{wskc`enrsuvy|{{{}|yxxz{{{yxyyxvvwz~u|~yxxwz~}}ytstsqprtvx{~~}||{|}}|{{|}{scTLP[_cs}|{{|||}~~~~~~}||~yspqqqpnrz}r^Y]m{~~ytr|zxz{{{{{zyyyz|}wqnggr{z{{|||{zzzzzyxxyyyyyzzzzzzzzzyyyyzzzyxxwxyz|{yxwvuuuttw{|||{{zyyyzz{{}}}|||{{|||{zywwvuvvwwxwwwwwxxxxwwtspnouxyy|}}~}}}}}}}|zxwx{|~}{yyxvtpruxxxwwvvvz|}}|zzyzzz{{|~~~}}||}~~~~}}~~}xux~|z|~z{yrw}{z}~~{}~~~~}|||}~~~~|{{}~{~yqx~~~|zyxvvz~}xwz~~|vrz}~~~|vyyz|~~|xtrnfcdt}{|}xjbdinpqqruvy{}}zx{yvwyz}}|{{{z{zxqpmromoqrqv}}zywvvussty|}}~}|zxxzu[M]px~|wuvww}|||~~~{wtsrrsssssuz|{|}}{|~|{zz|~~}{{{zxyxy|}|{|~{qkmu}~}}}~|{zvtsrrt{~xw||yvttttttuuvvuqijnqsvqecnwwutuyz}}~~~~}tsw|~}}||}}~{x{{zzyy||{~~{{|~~}|{{zy{{{|}~~{{~~~~~~}|||z{~|ztjbenssuxz{zzzz~{xwxz{{ywvwxxvuuwz}}{|}|zysiozuvrijtsqppqsvy|}}~}|||}||||||wiUIQ_bmz|{{{{||}~~}}}}||}ztqoqpppqw~wk][x|}|z}wwyz|||{yxxxyz|yropskju}{{||||{zzzyyyxxxyyyyyzzzzzzzzzyxxyyyyyxxyz||{zxwvuuuuuvz{||zzyxxx|}zz{{{{zz{{||||{yxwvuvvwwwwwwwwxxxxxwwwupjltutz}~}}}}}}}}|zzyy|}~|zxwvvrklsxzzzzywwxz|{{{{zzzz{|}~~||}~~}}~|y|}~}z{}~|z||vv}~zz}~~|z|}}{||}}}||}|{z|~~|y{{z}||zzyzzz{}zz}}~~~xqu~}~}}x{|{|}}}~~}ytqomb]`r}||}zqjlnnkgddkvyvvzzwyyutw|~}zxxvssrtssrnntsqty}{zxvssqooptxzuv}|zzyzzp^`ksw{{xwxyy}{{|~~~zwtrrrrsttttuyz||}~}{x{}~~|{zy{~~|z{|{zzz{}}|{||qkqv|~~}}~}|zvuvvvx}{utwz{|}~}yusqrstuvwwwwwuoorsssiccputrrsuwz|}}}~~{ssx|}}|||}~~||}|{zyxyyz~~{z|~~~}|{zzyyyz{}}}}}~}}~~~~}}}{|~~}{sadnstvxzzzz{{|}~~zwxxyzzxvuwwyvtsux{{z{}}}{zxligciicesvtqppqsvz|}~}|{|}}}||{z|ucJPafv|{zzz{|{}~~}|||||}~}wrqprqqsw|~~zsjazz~xwxz{|||zywxwvurnotwomv}|z{{|{{zyyyxxxxxyyyyyyzzzzzzyyxxxxxyyxwxyz{{zyxvutttuuvy{||zyxwvvz{xwwxxyzz{z{{{{{zxwuuuvwwwwwwwwwxxxxwwwxvpjmtsu{}}}}}}}}}|{{zz|}}{xwvutpmnptvw{|{yxxyzzzzz|{{zz{|}~~~~}}~~}}~~yz}~~~}|}~~~}||~~yv|~~||x|xz}~{{||||{|~}}{|}||zzzz}}yyzyyz{{}~|{{|}}}~zrr~x|}}||{zz{|{vrppla[`r}|||xtrrrokilnpurlnw||zzvux|~{wuwysmruutqnpvxuw{|zwsqpponmmnvukt{{zz|}ywuvtsv{{ywyyy|{{{|}}yvtrqqstuuuuw{{|~}xxz{}}{zz|}|{{|}}}}}}}}|||}zolu|~~~~~~~}zww|}xsqrtttvx{~|wrqpqtwzzyxxxyyvuwxyzsmgnrtpqqrtvyz||}}|suy{|}||}}}~}{z{|{yyyxz~|{{|~~~}|||{zzxxyz}~~~~|{|~~}}|wcemrtvyzzz{{|||||}}yxxyyyywutwxyvtssvyz{}~}zyzxqb^cd_dsyvsrqrsuwz|}~}||}}}}{zx|vSMbmy{zyyyz{z|}~~~}}||||}~|vtrqtttw{~{x{p|{~~|yyz{|~~{zwvurqrrruttrx}|{{{{{{zzyxxxyyyyyyyyyzzzzzzyyxwwwxxyxxwxyzzyxwutsttvvwy{||zywvtuxzvutuvyyzzyzz{{|zxwuuuuvvvwxwwwxxxxwwwwwxwqltvuz|}}}}}}}}}||{{||{xvtsrrttokoqswy||zzzzyzz{}}|{{{|}~~~~~}}}~~~~~~~~}}}~|utvxz|~~}}~~|~{u|{xysp{~||}}}}}}~~}||}}|zxwwursyx|}~~~yyzz{|}~|xpvsy|xuuwwwpnpsn_Yas{|}|ywwxwtstxyxrignv||yy{~}|ywuw{zwwuutpmr{zxy{zxurppnnqv|vioruy{|{zxot|{wvx||zxxy{~|{z{||~|yvsqprtvxyxww}|{}~}|{{{{z||zyyzyy{}~~||||||{wnmx|}}zvx~|wsrttsrrtwz~~{wrqqrswzzxxyz{{zz|}}wikszsppprsvxz{{}~w{{{||}}}}~~~|yy{}|z|{z{|{{{}~~~}|{|{{zxxy{~~|zz|}~}||{zlhmruwyzzz{|||{z{|~}{{zzyyyxvtswxywtssvz{}|yx|~qjd`^cqxwuutsstvx{}}||||}~|{yw{dKarvyxwwwxyyz||}}||{{|}~~}zvutsvvwy|}}}~}}|}~~}{yyyxz}{wusstttttstx{}|{zzzzzzyyxxxyyyyyyyyyyzzzzzyyxwwwwxxxxxxxyyxvtsssstvwxz{|}{yxvuvxyutstuxxyyxyz{||{ywuuuvvwwwwwwwwxxxwwwwxxxvquzxy{}}}}}}}}}}|{{||{wtrppqstomklmls{{{{yyyy{}~}||||}~~~}||||}}~~~~~~~}}{vwz{|{{|}~~~|}~zyz{~wy{uxts|~~|{|}~}{z|{xstsstrsvvz}~}~~zyyzz|vpu||xusuuupnqtrf`hu|}}}{zyxvtuyyxvnhkrw}~|{zvssuwwwy{|{xxwsqtyxwvwxxwwwtpnpw~wbo{x{{tl^i}~}|}~{wuvz~}|{{||~~|xtrqqsuxzywtzzvvwy}~|zxxyz{||}{ywvuvz}~~|{|||{{wqpwz}}~~{vsu{~~|zwttvxxvtstw{~|xutsrsuxywwy{{z{|}~~ooyyqoqrsuwzzz|~z~}}|}}}~~~~~}|}~}|zz{||{|}~~}|{{{zz{zyz|}zz{{|}}}|||{y|umpsvxxxyyz{|{{{|}~|zz{zyyxwussvyzwtrsvz|~}||zyxrkcblxwwwuttsuvx{{{{||}}|zyx{tQbttwvuvvwxyyzz{{||||}~~~}}{xwwvuxxyz{~~~}~}~~|{{z{|}|zyzzvz|zvwvuuttsstu{}~}|zzyyyyyyxxxyyyyyyyyyyzzzzzyyxwwwwwxxxxxwxwvtrrrsstuvxz{|}|{yxwwwwtrpqtwxxxwxyz{{{ywvvvvvwwwwwwwwxxwwwwwwwwwvwzzyz||}}}~~}}||{z{{zvtrqqqpqqmfhkemx~zzzzyxyz}}~}}}}}~~~}||||}~~~~~~~~|}}{yvtu{z{~zx{}{w}~|z}~~~}}}|wtw{|}~~|zz|~{l`mts|{vsqu{}|{|}~~|zwxxzzr{~}|{||{ywwxxxutx|}xssy}~|||{xvtqrvxywrprty{~~yrkjkswwux|}{xwwvtuuqoopvzyxwtppuz}zp{~wl`l~|wrtz~}}||}~zvtsqqruxwvstw|~~||zz|}~~{xuttvxyz|||zxttw{~~|{|||{zwsstv{~~y|xpnpuy{zxxwwvvxzxvttuwz}}{zxusqtwwwx{{z{|}}}~~}wuzysrrswy{zx{~~~}}||}~~~}~~zw{~~|{{|~~}|{{zzz{{z{}~|{zzz{{z{{|||ytsuwxxxxxyz{|||}~}{yzzyyxxvtrswyzwsrrv{~}zxz|{pcivxwvuutsstvxyzz|}||{yyyz|}wafstvvvvwxyzz{{{||}}~~|{{zxwxwwzzyzz|{|}yxwxz{}~|{zyyz{{{{zyz||}~uvvuzxutsssuw{}}}{yyxxxxxxwwwxyyyyxxyyyzzzzzyyxxwwwwwxxxxwwvusqqrrrstuvxy|}|{zyxwvusqoorwxxxvwwxz{{xwvvwvvvvwwwwwwwwwwwxxwwwxyz{zyz{|}}~~~~}||zyyzzvtsrqponkb`akfjsxxyzyqsx||}}~~}~~~}}|||||}~~~~~~~~~}zyuuyz{}~|~{vz}|}}}||~~~~}{wtx{|}{{zy{{|}xdo{y|||z{xuuzvt{}~{xxy|}}zvw|~z{{zywxzz{}~}}}}}yz}~|zzyvsrpqw|}{zywvuvxz||xrllouwtqt{|ysptwxuqmmoqv|{xvqqu{~~~}|{y~|hUbz~}xtvz~~~|ywusqpsuuvtrssx}~~~~~|xussrttuvx|~zursw{~}}|||{xsoqsv{~y|zrmmquwwwxxxxwwxxwwvussv{~~~|xsqruwxy}}||}}}~~}{y{~xwwx{|}zwy~~}}}~~~}}}}~~vw~}{{z|~~}|{{zzz{|||}~~~~}{yyyyz{||}|zxuvxxxxxxxyz{|}~~}}|zzzyxxwvsqrvxzvrqrw{~|{{|{rifswwvutsrrstvwyz{}|{yxxyyyywnmrsuvvwxy{{||}}}}~~~}{{yxxwwvvxxxyyyxxvsrqrtuwyxxyz{{{yyyyzz{{{{zz{~~zqwzy|vutuuxy{|||zxwwxxxxwvvvwxxxxxxxxyyzzzzyyyxxwwwwwxxwwwvtrpopqqpqrsvw{||{zyyxwvtspprwxxwuvvwzzzwvuuvuvvvwwwxwvvvuvwxxxwwxyzzzyzz||}~~~}}|{ywxzzvtssqonkbW\`jgioswxyxtv{}}||}~~}~}}}|||||}~|{|}}}~~~}{zyz}}}}|yz~}|~}|||}~{{{zzyxyz|}}|xrknsqsztz}xx~zvimx|~|}~}|yvz}}xyyxwvwy|~~}|{{}|zyxwtrqsw|}||zxwxvwxy{{xtrtuxxtoptxunmv|{vrqtwxz}}zxvw{|yuu}q\f{~~}ywxz~}}~~}{ywtqqstuusrqtv{~}{ywutssttuwy~ztporw|~~}|{wqlmrv{}|tqqrtvwxyyzyvuvxxwurprx|~}{wtuwxz|}}~~~}~~}}|}|{yy|~{wz~~}}~~~}||{|ts{{zx{}~~}|{zzzz{}}~}}}~~}~~{{|~~~}{yxxxyz{{|{zxwxyxxxxxxxy{}~~~~~}{zyxwwvtqnpvxyurrsx{}~~}|{zxtpksvvsqqqrrrsuwyz{|{zyxyzyyxxtsrsuwwwx{}}~~|{z|zxxwvutuuuvvvvusqpnopqstrqqsuvwwwxxyz{{{{z{|~~~{xt{~zwxxyz{{zzzzwvvxxxwwvuuvwwwwwwxxxxyzzzyyyyxxwwvvwwwwwvtsqpooonopqtvz{|{zyxxxwvvsstxyxwuuuvxyxvtrrsuuvvwxxxxvtrrsuwxxxwxyzzzzzz{|}}~}}||{ywyzzwutsqool`U`bgehlquuxyyy||{{|}~~}~}}}|||||}~|||}}}}~~}~~{xwwxw}~~}{|{y|}|~~{z~~zuuuuvwz{|zxuqlcii^k|}}}}~}}z{}xiltx}~~~|}zxz}|{zxvvwy|~~}|{z{{yyywtstyzwvwxwvuwz{zzwsnnsy{|xspnmqrps{{wwwxz{{}~|||~~{vssqss|}tw|}~~}|zxxy}}~~}~}~}zurrrstttstrqw}~|zxyxwvvvwy{|~xrnnosw|~}zvroosvz}{|vqppruwwxyyywvwxxwvrpruy|~}{yyzz}~~}|}|}}~~{utx}y{~~~~~}|{zz}{sy~|ywy|~}}}|{zyyz|~~z{|~~~|{z|~~~zyyzzzzzz{{zyyz{{zyyxyyyyyxxxyyz}}{zxwwwvtpmovzxtrsuy|}~~{zz{|}|zxvvutsrsonpqssstuwyz{|{zxxyyyyxxusrrtwxyz|~~~|yxyyxwvtsrssrsssstutronoopqoopqrtttvvwyzzzzzyz{}}{yyw~}{{{|{zyxyyyvtuwxxxwutttuvvvwwwxxxyzzzyzzzyyxwvvvvwwwwvutrponmnopstx{|{yxxxxxxxwwwyxxxutuuwwvsqpprtvwwxyyyxvsnmnquwxxxxxyyyz{{z{|}}}}|{zyxzzzxvuspoqreZhgdbfkpssuz{yzzz{|}~}}}}}||||||}~~}}}~~~~~~~|{}|wrruw|}~}z{{xz~~||}}~~zvw~}sopvxy{|zroqmfbgfZo~||xw}}}ytw{wortxy{}~|}~~}}{{{~|xwvwy|~~}||}|zy|}zwvvx|zuuuvvvuuz}xxvrptz~}yrlkjmsx{zyz||zxxyz}~~~~{wtsuhW\x}}~~~}{zxwx~}}~~}}~~|xtrqqstuuutxxz}|zxxyxxwxy{}{uonnoqtz~}{xvuuvwz{zz{|uonoqsuwxxxyxxxxwvtrrtvxz~~~}||~~|}|{|~~zsqx~~z{~~~~~}{zz|~uw}~~}zvy|~~~}|{zyy{}}zz}~}|{yx{~}~~~~}zyxxxxxy{}}{yyz{{{zzyyyyzyyyxxxz}}wz~{yxvvvvtqnnuyvsssvy|}~~}zxwx{|{zxvuvssqnomoqttttvwxyz{zyxxyzzzyyvtqqsvyy||}~~|wrvyxwustsqqpppqsvxyvrqppoooopqrrrstuvxyyzzzzyz{{zyyy~~}}|zyxxzzyvstvwwxwutssstuvvwxyyyyzzzzz{{zzyxwvvvwwxxyyywurpoooopruz{|zywwwwxxyyyxwwwvuvvvvtqooprtvwxz{{zyxofhimrvxxxyywxyz{{{{{{|}}}|{{{{{{yyyvrpsvm_kj__ciorqsz{xxyy{|}}}}}}}||||||}~~}}}~~~~~}|{|~}wnluw{|}}|}||}~||||~~}yy~zor{}}}~rszyl^mshwzwtt|||zojx|yxy|{{z{}|rsx{~}||}}xwvxz|~~}}}}|}|zxz{ywvwz}{vuttuvuuxz{zywwz{zz{wrmgjnuz|xx{}{xvvwy{}|zwwy{|ywz{{y|qXa|~}|}~}{ywww}|}~~~~}~~}{yvurqrtvvwxx{{|}}{z|xuvz{yyz|ytonooquz~~}{yyyyz{{xy~~~wqryxqnnoqtvxxxxxxxwtrqqsvxvu{~}}}||zrry~~}{{}~}~}|||~~~~x}}|}{wx|~~~}|{zz|}{}~}|zxxxz~~~~}}}}}|{zyxxwwy}~{yyz{|{zyyyzzzzyxxxy|{qs~}zwvvwwuroptwusstwz|}~}yvuuy{{yxvsqorvwtnoquuuuvwxyz{yxwxy{{{{zxurqsuxy}}||~~}{wptyxwususppooorvz|}zvutrponoprrrrssrtvxyyzz{zzzzzz{{|~}||zxwvx{{zwsstuuwvtrrqrsstuwxyyzyyyzz{{{{zyxwvvvwxxy{{|{ywtromllmqx|{yxvvvvwwxxxwvwxwvvvvuspoprtvwxy{}}|zzqcbbgouwwxzywwyz{z{{{{|}~~|zzzzzzz{{xtsvyqagja`aflrssxywwxxz{|}}}}}|||||||}}}}}~~~~~~~}~~}ypoxy||}}~}~}~~~~}yvuv{}~}}ufyy}|vqor{ywojt}}|~~zy|th^ew}|||{{|}}|zyyz|}~~~~~~|{{{||zxxwutvy|}}zxvtuvvusstwutyzuminqprsqosx|z{}{vsqruwyzvokotvqmrtohdquks}{|}}{yxwx~||~~}|{{|}}}||{{yvtsuvwwvvtsuvy|~~~~yuv{|zxxz}~yuqpoorx}~~}|||}}}|yz}ywvwxsonpy~~{tomnqtwyyxxxwwvrooqtwzvqx~|}~}}zru|}}|{{}~}~||}~}}~~~yy~||{z{~~~~}||~}}}|{yy{|~|{||||{zyxwwx{~|yyz{|{{zyzz{zzyxxwy|~}~zx|{xvwxwuqnotvtrtvy{}~~}yutuy{zzywromtzzqgfluvvvvwxyz{ywvxz{|{{{yvsrrtvx{|{|}}~~}||}~~}{zxuvzyxvstsonpssvz}~zyxwvtrqqrrrsttstuwxyz{|{{{zzz{|~~}|zxvuvx{}|ysrrssvusqqppqrtuwxyyzyyyzz{{{zyyxwvvvwwxy|}}|{zxvokihhmsz{yxwutuuuuuuuvwwvvwwvusqprtwxxyz|~~}{|wh^\`ktvvwzywwxyyz|||||}~}|zyxxxyz{{yvvxztabiga`cirutwxvuvvyz||}}}}||||||{|}}}}~~}|zuw~}}}~~}}{z{~}q^\ny}}}~|w{tpprzwtqt~~tryyuy~|jRbutrz|}{}zx{||||}}}~~~~|xxy||zxwvtsvy||}{zxwwxxvomowsoxzulemrootttvx}|zxusqsuvvvvspnswwpnxvmXRmsppw|~~}y{}~}{z{|~~~~~~~~~~}}~~}|{{{|}~~~~~~zwvuvvvvvxywvwz}|{}}{ywvx{}|yxutrosz~}}~~~z{{wuuuvtrooswwwz}}{vqoqtvxyzyyxvutqoorvy{xrv{|~~}~~~~xz|{yz{|~~~}}zz~~~}}|}}}~~~~}{{|}}|{|||{{zyyxxy{}~{zzzz{|{z{{zzzyyyxz~~}~~|~}{||xuwxxtqmostsstv||}}~~}yustwyzyxwrpntwuogaktwwwwwxyzzxwvwyz{{{{zwtsqsuxz{{{{{||{zz{|}}{zyxwyzzywttrmntwxz}~{{}}yusrrrtuuuutvwxz|}}}|zyy{|}~~}|{xxwz|}~}{wsqqrttrpppppqsuwxyyzyyyzzzzzyyyxwvvvvwxy||}|||{ysnjhginy{xwwuuutsqpprtuvvvvwwusqqswxzzz{~}z~zn^W]kvwwy|{yzyxyy}}}}}}~}|zxwwwxyzyyxwxzvd^eib^ahquvxwsprtxz{||}}}||||{{z{||||}}~}}zx{~~~}|~~zut~}~}|r_]u}~|{}~~~~|wuuxxpx|~}lmrmr}~sarxplv|xy|}}}}~}}~~~~~{wvy~~|zyxvttvy|{z{{{{zzywyxwpqx{xutvvpgiu|{y}zwuwututsuwxwxz|||xv|y`[yuf_py~~~{xy{~~}}~|||||||||}~~}}}}~~~~}||||||}}{}~|yvuvwyy{|}}}|{}~|ywvz}|zz{|zuqtz~}||~}z|zy~}ywwwwutsrqrrpnpswywsruyyxyzzyxvtsrqrtwyzwqqv{~}}}}|zxx{}~}}{z}}}~}|}|{{||{{{{{zyyyz|~~|zzz{}{y{{zzzzyzyz~}}}}|}|xwxyywqmnrtttuw||||~~~|yvttwyzywvrrsstsqkceswwwvwxyzyywvwxyz{{{zxutqsuy}~}|{zz{{yyyz|~{yxwwxyy{zyuspnq{~~|z||yurqrsuvvvvvwxz|}~}|zyz{|}~~}}{yyz}}}{yzyurppsrrppoopprtwxwxyzzzzyxxxxxxxxwwwvwxy{{zz{|||xtpligixzxwvvuutsomloqstuuvvvusrruxz{{z|~}y{{q_Qcx{yy{~~~}|}}}~~}}||}}{yxwvwxxxyyxwwzym[aida`fpuxxvqmqtxz{{||||||||{zz{{{{{{|~~~~~~}|yx{~~~~~}|}~}|y|~}}~~|ytnp|~|}}}~~}zyz|xsy~~zqrusw}}z|xrqz}}|~~~}~~~~{wuy||{{zzxuqopswy}~~|zz|xtllsyyxxurrpiipx}||ztqpommpsuxzzz}~}}zyywqoxfap|~|~|xx{|}~zzzzzz{zz|}~~~~~~}|||}}~~~|ywuuvxy{}}zyyyz{}}yvuuw}~||}~yrsz}{z|ysvwwxwxxxxyywvvtsrqonnpswwutwz{yyzzzxvtsrrtvyzxsmmt{~}|~{ywx{}~~~|{}~}|~}||{{{|}}~}zyy{~}{zy{}}z{{{{zzz{|~|z|}|}~~|yxyzzzunmqtvvxy|y{{}~~}zwttvxyyxvuuztrsvriarvuuvwxxyyyxwvwxyz{{{yvsqruz~~|||{{{{yxyz{|ywwwxyyz|{zvroot|yxz}~~|{wtsrstvxxxxwxz}}~~|{zyyz{}~~}{z{}|yutwxvsporrrqonnnoqsvwvwx{{{zxwwxxxyyyxwwvvwxyyyxvwy|zxtplhhwyvvvvvvurnkijmortuuvvutssvyzzzz{|}}{xyysaUm}zxz~}||{|||zxwvvwwwxyyxwyypY^hfbagpuwvvsruwyz{{{{{||||{zyyz{zzzz|~~}}}~~~|zyyy{~~}|{{|}|{}~}~}{yz}}~}|}}|||{y{}~}}zwpsx}yov|vux}~}~~~}|}zxyyyz{{{zxtoklry|~}ws||zvoorqrstwyzzxtonqx~~xtqnjglty{zww{~}~{wuvz{{wy}|xw}}zz{{|}~zz{{{{{{{||}~}|{{|}~~|zxutttux{~~}zxxxxxwuutttvtx~}vuz~}zz|xtuwyyvvwwyzyxwwvutsqppqsuvutvy{yxyyyxwusqrtvyyvqlmu|~~~zwvx{}~}y{|vrrv}~|||}}~{yz{||{zyyy~~~|{{{z{}}~~~}|zxxy{}~~}}|||{{zyy{}zqlqtyz{|~|{|}~~{wtsvxzyxvvw|vstyyoesvttvyyyyyyyxvvwxyz{{ywtqqty~z{{}}}||zyzz{{wwxxy{z{||{wrppv{vuwyz{{{zyvttttwxzyyxyz|~~~~}|zyyz|}~}|}}}ytqrvwwtqoqqqqomlmoqsuvuuvyyyxwvvwxxyyyxwwvvwxyyywsrtvyyvspljxxuvvvvvvrnkhgjmqsuuuuuttuwyzzyxyyyyxwxyteaw{{z|~}}}}~~}|||{{zxwvvwvvwxyxvxxlVYah_`krsuuuwzzz{{{{{{{{|}|{xwxy{zyyz|~~}||}}}}~~~~}{wwz}~~~~~}{{z{|}~}}~~~}~~|{}~~~|z}}{{||}zywx|}lq~|vw}~}}}|||}~}|{zyz|}||zwsnmquwy{ztsxvtqliggmqvz|{}zlcdv~}|vmgiqxyywy|}ywxzz|zywpe^gx~}{z{|}~~|||||||||}}}~}{zzz{|}~~|yvtsrrsw{}}|z|}~|zzzyxxyy{y{~}}}~||~zwvx|~|xvtuvvvuwwyywvuuuuuuuvuuuvvvwyywurqstuwywutv{~}~|yvuwz{||~|vtx~~~~~~~|{zz{||zzyz{}}|{{z{{||~~|ywwwvvwz}~}}}}~~}}|zy{~~vopw}~|}~~{wtsv{|{wvttxzxvyxqjtxutw{{yyyyxwuvwxzzzzyvsppswzz|~~~~}{zzz{{wxyyz{{{{{zvsqrx{vuuwwwwyyzxwvuuwxzzzyz{|}~~~~}|{xxy{}|}|ytssvxyyvtpqpppnmmnqsuvuttuvvvvvuvwxyzzyxwwwvwxyz{zyvsrvwvtsonyvvxwwuuutqnifinrttutttttuwxyxvuvuvwvvxzvjm~|||zzxxxttuuy{}~~}{z{zxwvvvvvwwxxwvwjUSWhadrtssstw{{|{zz{{{{|}}|zvvxzzzyyz|~~}||}{{{||||}}||zz||zz|}}|z{{|}~~~}}~~}|~~~~~}||~~~|zz|~~{zy{~||~~|}~}}}}~~~}~~~~~|yvsqrstuyy{|pnjgc__emsyzwvw{vmgdnz|}~~zrlmsx{yx{~~~}|zzyuvyh\nmvfIVx~zz{{{{{~~~}}}~~~~}{zyyy{}~}zwtsqpqrvy{|||}z{}{yxyy|yx||~|}~{xvx~~zuttttstuxz{zxwwxwvuuxvspppqtxywtrqtyzyyyx{}~}~|}{wvuwz{|xw~~~}y{|~~{yz{|~zzzyz|}|{{{{|{|}~}zzxxxy{|~~|{z|{rpx}}~}zwssvz{yvvotx~|yxwqlwzttx|{zzzywvuuvxyzzzxtrooqsv{~~|zzz{zxyzz||||zzxussuz|ywvwuttuxyzzzxvwxyyzz{{||}}}~~~}zxy|~}}|ztqux{{{zxurqponmlmpsuwwvuttuuuttttvxyzyyxxxxwxyz{{{{xtrrrrssrswvxzyxvvvutohbltuuttsssstuwwwvtrrstvwwy{xqt|zrpopqqssrrrrssvy{||{{zxvuuvvwwxxxwuvlVNMaehpsrrstvy{{zzz{{{{{||{yuvzz{{zzz|}~}||{zxyz{zz{}}}||~~zxwz|}{{{}~~|}~|}~}||}~~~}}~~~~~~~~~}~}}~~|zz|~}|zy{~~~~~}~~}~|}~~~~~}~~}{xvvuuvvxy{|xrieegjmou{{utqnoxxjjxz|}|xsnotz{yxy||{{z{zzzyuuvi]`lzuVf|{z|{{{{~{zzzz{{}}}}|zxusrpppqsvxz||}{xxz|yux}~zwwy|}}~}ywy~|wtrqqppsx|~~}||{yxwx~ysonmmqvywtqqty|{z{}}y|~z{}~{vuuxz}{}}{{|~~~{yyz}z{||||||||{|||}}}{zyz}~{zy{wrz~~}zvursvzytstpw}vrpp|quy|||{zywvuuvxz{{zwrpnopqsz|~}{zz{{zz{|}~}}zyvttvy|~}{zzxwussvxy}~|xxwyz||}}}||}~~~|zz|}|}|ysry{}}||zyusonmkkmrxzzyxwutsrrrrrrtvxyyyxxxxxxyz|}~}{yurpoqrtvtt{}|ywuvvtohdqzwvtssrrstuwwvutsrsuwyyzzyvx{xuttvtsrrqqqppqrstvxz{zxvttuuvwwxxwuumUNM]dgmqpprsvxz{{{{{{{{{{|zwrv|}||{{||}}}{{yvstxyxv{|~}ywvy|}}}~~~|}||}zy{~~|yyy{|}}}~~~~~~~~~{{}|}~}}{{{~~}~~~~~|||zz}}z~}{zzzzz{{{xwxvnfgjotuux}td]qy}}to{{ywvtqnry}|zvtssrstuuvw{xuwrhbtuuyzxw||{|||~}}}}|{{{{{{zxwuttttsrrqrsy~|zzzxwy~}~~|sqrty}~~~~zxx}~zxvsqpqsx|~~}{zxy{}ytqpmmpuxxusqqty{{}~xty}~~|zz{~~}{ywvx{~y{~zz{~~|{z}}~}}}}}}||}}}~~~{y|}~}{zyxxyz{zuvw}~~yussrrvzxsqsw~vqvymv{}}}{zyxwvvvxz{{zvqnoqrqru}~|~~|zz{{z{{|}~~}zxutvz~~~~~~|zxustuv~{ywxz}~}}}}}~~~~~{|}~}z||{vy{|||{{yywuqnljjnu{|{zyxvutsqppooquxyyxxxxxxxyz|~~}{yvrmlnsxts|}{ywvusokmy|vttsrrrsuvvvutsrsuwxxxxxxx{}xtrqqqprtrqpprvyzzwtrstuwwxxxvvkPOU]aelpqqqsuwz||||||||{{{zyux}~}}}}}}~}}|yvsqtx{zy{}~~zxxy{||{||}~}}~{y~~~|yy{|zyy{|}}}~~}|{|}zz}}~}}~{{{{|}~~~~~~~~~}}~~|}}~}}|{zz{}|{{zysoppkfghmruwz}{se`w~z|{y~|yxuojdkw}}ytpmlllnmmonrz}{wpo|}xugq~}|}}}~}|||{zzyyxxxxwtqonnqtz}|yzyyyz}}~xtqpuz}~{xwz~~}{yvustuxz}}{{z||xqopoonoruwxvsqsw{}~~~}ywvwwtmmty{}|zyz}~~~~~~~|yy{||{|~~}}~~~~~~~~~~~{z{}}{z}~|||}|zxxwvuvvxxz{~}wsrqrtvxvtru{yrwloy}~}|{{yxwwwwxyz{zxxwusrponv{||~~{{zz{z|||}~~|zvttw}~~|{wttps{}zwwz~~}}~~~~~}||}}{tv|yxz}|{{{zyxxxvsoliiox|||{{zywvtrpommpswyyxxxxxxyz{}~~~}|zwmfhqywx|~~}zxwusppu}|vvuttsstuvvvuuttuvvvvvuuuw}|xupmmppprsrqqpprtwy{ywsqsuvvwwwwwiLS`\`cjqrrrsuwz||||||||{z{||z|}~~~~~~~~~~}zwtsx|~}}||}}}~~wtwyz{{{{|}}~}~|x}~~{z{|{{{|}}}~}|{z||{z}~~y{|}{{}|}~~}}}|}~~}||||}~{zzyyz|}yxwuonpojfdehkpw{~wttxzx||||xxxslifmw}}wpproklokisxv||yz~|umcr~~}}~~}||}}}}|yuqpoooquyzxy}~{~{{ytptx{}~|yx{~~{yz{zxwwxz|~~}}}~|nhlopqooprvxwtsuz~~|{z{yroonmommlnv}~|zyz|}~~}~~{wz~~|}}{zz{{||}~{z}}|{|}}zxvuuuvvxxxxz~}xtrrstvwutsw||vu}{lv{}}~||{zyxwwxxxyzzz}}ysssqouy~~}yzyzzz}}}~~}{yvtux}}}yvxtsz{xxz~~~~~~~}|{{yvsrtvzuqzzyxwwwxwuqmjltyzz{{|||zxvtrolloswyyyxxxxxyz|}~~~~}}|tjgp{|z{}}|{ywvttuxzzwxvuuuttuvwwvuuwxwtrrrrqqt|vtqnnnrx{xsssrqqqqqsuwz{xtruwwvuutwvdX`b]]biprrrrtwyyz{||{{|{{{|~~~~~~~~~~~~~}~|yww{{{{{zz{{|}yuvxxxz|}}}~~}|~y~~}}}}}}}}|}~~~~~~}|}~}}}|||{~}{}~~{y|~}}}|}~~}|}}||~~}}}}}}}}}|zyyxxy{|xvvurrrnhb`djlpx}~~|zyy||{zwwwtporuz{zvrswsoprmlw|z{~}zxyy}vjpsy~}|~~~~}zvtrqqppsvvvw{|zzwstvy|~}{z}}zxyz{{{zxxz|~~~zmhlooponpruxwuuw|~ywutvupnmjjmmljkt}~}{zyyz{|}|||}~y|}|}~~~~~||~}~}}}~~|{z||zwvuuvwxxz{{|zwyz}|xtsrssuutssw||y|{t||}}}|}}|{zyyyyyyzzy|{ytvyxvy|||xyxyyz|}~~}|zwuuvy{~}}~|{~yw}}yy{~~~~~~|{zxvsty{}yxzzyxwwwxywsokpyzyyz|~~~|zxurplnqswxyyxxxxyz{|~~~~~~~~~zrjo{}|}}||{yxvuwyywwyyxwvvvuuvxywvvyxtpnooonnpv}zomorw}|vuutsrrqqqsuwyyvtwwwtrrrvugfjc\]bhlpqqrsuuvxy{{zyz{|}~~}|}}~~~}}}}{zz{zzzz{||{{}xvz{zyz|~~~~}~||}~~|||}~}{||{}}~~{y{~}}}}}}}||||{~~}||||{zzyyyyyxwwxwuuuxxrnkeabisvw{}~~}zwxz{{xvuwvtuwyzxuvxywsprsqrz|zz|~|yxuuy{sjv}~~}{~~}{yxwvutvwyywy~||yywuuuwz~~~||~}xvvy{|}|zxxz~|uppnnmmmoswyxvvwxzxsqqqrroolihjjjimw}}|{zzyyyz{||||}~~~|z{}~~}|}~}zvux{~~{zz{||xvxyzzyyz|}~|vttvtsrsstttsrsvz~~z}}}}}~~~}|{{zzyyzzz{zzyxzzz}~zy{yxwwxy{|}}~{wuuuw|~~}|z{~~~v}~{z~~}~~~{yyx{||{{{{zzyxxxyz{zvqjs{{wx{}~}}{zwsqnosuwxyxxxxyz{|}~~~}}~~~~}wonx|{zz{|{yxwvvxwvwyyyxwwvuuwwxvuvxwrnlmmmmmlpvurry}|~{usuvuutsrrqstvwxxwwwurpqrutmmme]`gikmmorttssuxyzywy{~}{z{|}}~}||||||{zyyz~|}~zx{|{zyz{{|}}}~|{|}~}|}~}|~|yz|~~~||~~~~~~~~~}}~~}||{|}|||{{ywuvwxyxvtssqnpqvtlkliinu{{z|||}~{zz{|{zxxzyxwyzzywy|}{xvvwuvyxwxy{{ywvuuuqo|~~~}{~~~}}~~~~}}|{zxxxyzz{}|y~~zwwvtttvy}~~}}~{xuw{~|zwvx~~|}z{vqomlkkmsyzxwwusrponopppppmkgijihmv{~}{zyzyyxxy||}}}|~~z{}~~~~~}{xuqpqrv|~{zyyzzzz~~~yvuwvtsssrrsrrrux|~}||}~~||{|}{{{|}~||{zy{}~|yxx}|yvuvxz{}~~|uuvwz~~}~~}{zxx{~zz~}|~}}~~|{{}|zwuuvy{zzzyyz{|{xrkv}|wwz|}|{{zywtrprvwxxxxxxyzz{||~~~~~}}~~~yvrvyzuqvy{zywutuuvwyyzyyxwvuvvwtttuspmlllllmjnstrv~~~~}yuuvvwwvvvuttstvwxxxwvrpstwvroleakqppqpopwwvssux{zwy~}ywz|{}}}}}~~}{{z|~}|ywwxyzz{|~|{{|~~~~~}||}}xx|~~~}~~}}~~~~}~~}}~~}~~~}|||||xusuxyyvtpomjhklpnlmnnsxyz{|}zy|~}|{{zz{{||{ywustx{|~~|zzxvvxwutuwyyxxwvussu||}~}|~}||}}|||}~}|{zyxwxz|}~{y}}yvvutrrtx}}zwvw|}|yvux}~{zz{wspmjkoptyzxwwvttrrrpoooooonnljihktz}}|{zyzyxxy{||||||{z{~~~~}xtroprv}~{yxxz{~zz{|zwtrrqrrqqsuxz}{{|}~|{}~||}~~~~}zvz|~~|xx{~zwuuwy{}|}tvzzz~|}|zxxwy}|{}~~}}~~~~~~~}}}|ztopqsw|{{|{{||}}ztmw}|yxy{{yyyyxwussuwxyyxwwxyyzz{|}~~}}}}}zxuwyzxsuvyyyxusssuvxz{zzxvuttuussssrpnmlllllmprsst||{ywuuvwxxxxxwvutstvwwwwwvuuwywsojejy|ywxuqo|~ztstx|{x{}~xw{|z}}}}}~~~|ywwwxzzz|}~~zzz{~~~~~~~}}~~~|||~zyyz||}~~~~~}}}~~}~~}{{{|}}|||}~|xtstxzxvspnmhdilolnnknvzyyyz|zv|~|xywy{||}|ywtpnu{}}}|{zxvxxwsttvwwxyyxuttx~}yy}~~}~}|||||{{{||}}~~~}zytruy|~}{{}~}zywusqqsv|~|zxxz}~{yxvvw|~zxywuwvqjpyyvvwvuuuw|~{wrnoonnprvtmgfipx|~~}}|{zzyyyz{||||{{~z{yy~~~~~~~~~{vsssv{}{zxz}~{z{}|{vrrrqqrrtvwx}~{yz{}~~~|{}{psz}}zy|~xutuxz|~{~uz~~|~{zywvxy{~}|~}}}}}}}}|{yy{{}}}zwqmjjou|{|}|}|}}}{vpx}}zyyzywwxxxxvuuwyyzyxxwxyyzzz|}~}{{{{{yxwyyyyvsruxwwtqpprtwz|{{yvtsssrrrstsrqonmmlloqssssz~{yvuuuvwxxyxwwwvutsuvvwwxxwwxyxvpjis|z{yuozz|yxvx{|z|{zyyz|~~zy}|z{~|{||}}~~~}~|yxxxyz{{{||{xttu{|{}~~~}{~~}}~~~}zyyyyz{|}}~~~~~}}}~}{|~~|yxyy||||}ytsvz{xvtrpnjeinomprosxxwuttvzsw}~xttxy{|~}{yvqmsy{|{yyywxzxvtttttuxy{{xwwy|}|z{}}~~}}}}|{zz{{{{|~}~~|zvtw{}}{{}~~}|ytqpqsv{~}{yyz{{zxwvuvx{}~~|yy|ww~}wpx|tqstttsuz~vpqqomps||sjhiow{}~~}}||{zz{||}}}|||zz~wr|}xw}~~~}}}||}}}~~}|{{}||}~~|wttuwy~~{zy}~~~~|||||{xutsrqrsuwwxy||zz{|||zxz{~wqwx{}vstwy{|~w~~}}yxvux|~~~}{z{||}||{zyxwxz||{yusoonty||}}}}}}~}|xuy||{zxxwxyzzzywwwxzzyyxxxyzzzzz{}|||{yyyxxwxyzzzwtsuvwwurpnnqvz||{yusssrpqrtuutsqponmmoqrrssy|zwwwvvvwwxxxwwxwuuuuvwxxyyxxyzzwpmnw~}||zwvxv|}}zz|}}|ysrsuwz||||}|yy~|zzz{{|}~}|}~{vux|}}||{|{zytnlnvus~~}~}z~|zz|{{|}}~~}}|}~~~}||}|z|~}zwwwxzz{|~{utvxyxvuttssprsroswwzzyyvtqv~uuz}}}xkipstw{}~~|z}}||zwwtsuwyyvvvsrtv{}|{zyz{||yyz{|~~~~}|{{{{zyy{||||}~~~}|{z{}}}}|||}~~ysooqtw{~{zyxwvuttttuy|||zywy~z|}y}|vtvxvtstw~zvwvroou~ytsnpx{|}}}||{zzy{{~~}|zz~~~xmit~yy}~}~}||zzyyz|~|{~}}~wrt{x|xz{}|xuuvvw{~|zz~}~~~~}}|||{ywusrrstvwxxy{ywwwwtruw|~~}~st}w~xrtwz{xz~|ywvtu{~~~~}{zzz|}||{zzyyyy{{yxvvsrtx||||}}}}~}}{yyz{|{yxwxyz||{zyxxyzyyyyxyz{{{zyz{}xuyzyxwwwwxyz{zxvtuvxxxvrnlnsy|{yvtrsrroprtuvutsrqponnpqqrsw~zxvvwwwwwvwwwwwxwvvvvwxyyyyxxyzzxurrw||||}{{|{w~}|{{}~zyvuvyzyy}|{yxzyyyyzz{}~~~~}~{wuvy}~|xwwwxxuqrtzxw~~||~~|{|~{||~~}}}}}}|{{{||~~}|||||{}~}zxwvwxy{|~{vvxyxvvvxxz|zzyvsw{{|}||zzz}~vswyxsaVbnopvz}}~}|{zvsnmmmvy{xuroqv{~}{yyzywuprwwwy}||||zxwwxxxyyyy|~~~}{{||}}~~zspquxz|~{yxwusrsttrqv|}{wuux||}~ytsw{|}|wttw}}}vuy{|||||{zyxwuw|~}{{p}~~|skny~}}~~~~}~~}|{zzyz{|~~{{}~}}~tt}vxyvy{}}wz}|xwwwwvxz}~{~~}}}}}}}||{{yxvtsrsuxyyz|}}yvuutpmquz|||~xr}|{uux{|y~{xvutuz~~||}~}{|{{}}}}|||{{zyzywvvwuoty}|{{|||}}}|{zz{{{zyxxyz{}|{zyxxyyyyyyyz{{{zyxxz{tnuzzxvvwwxyz{zyvtuvxzzwtollpvzyxvtsssroqrttttsssrqponoqqqrw{wvvwxxxwvvuuvvvwwwwwwxxyyxxxxxxxwxwtvzz|||{{|}|}{{{|}~~|{wqw|zwr|{ywwvwxyyzz{|}~~|}~~{xyz{{|yzurptwxvutvz{{}~~{~~{z{}~~~~}|}}~}||||||{{{{z|}~~~~}|}}~~~{xutuwy{|}}}|zyy{zywwyz~}|yyxwv|~||~}|wuuspg_bkqsuxyz~~}}{yvx{{{unlmlqrtqjggmvz||zxyzumffoyxvu~~~}}|ywwvvvwvvvwx{}~~}}~~~{wuwz}~~zyxwutuxyvqnry}{usx}}|zssy}{{}~~|z{||{zzzzyxvuqrx~~||s|zuz}|}}~}zz}~||{{{{|}}zz~~~~xq{r|}ywz{}~ztw{~{zzzyxxx{~~~~}}~}}|||{{zzyxvtsssuxz||||~{xvtspnqsy{z{|~u~yw{|}{{vttvv{~|||{{|}|{|}~~}}}}|{zyyyxvvvvqv{|{zz{{|}}||zz{{{{yxxxy{|}|{zyxxyyyyyyyz{{{zxxyxxngryzywvvwwxyz{yvtuvy{{yvqmkntxyywuuttrqrsttttssssqponoppprvxvuvwxxxwvutuuvvwxxxxwxxxyxxxyxvooy{wwxy{||{|{{zzzz{}~~~~}}|xtz~zvr|ytwzzzzzz{{{|{{|{|}}~}}}}|zusyvvz|{ywuuw{|{||}~{}|zz{~~}}~~}}}}~~}}}|{{||||{z{|}~~~~~|xtrrxz|||{zywwx{|yyyz}~~}zxvtv|}||~~|yunkikmpsvxxvuuwzxvxxslmsv{xsqtuuutsnmouyz{zxxzzuh\_n}|xw~}{yyxwwwvuuuuvx{~~~~~|{{|~{yyxwwz|{vpmoty{zs~~z{zss{~~}|{{zyxxyxwusoqy~~~~~~}y~{|~~|{{~|{}~}|||||}}~}|}}vwp~|{z{{|}~xvx{~~|zyyz{zz{|~}{{|}~~}|||{{{zyxwvutstux{}~|z{~~zwuspnpuy||{{}{z}~~zsqqtx|~}|zzzz{||}||~}~~}|zxxxxvuuwwz|{zyyzz{}}||zz{{{zyxxxyz|||{zxxxyyyyzzzzz{zyxxzywpgpxzyvvwwwxyzzxvuvwyzzyvqnlnsxzyxwwvusssssssssstsrqpoooopquvvuvwwwwvuutuuvvwwwwwwwwwwwwxxwsjjy}yxwy|}}|||zxxxz|~~|{|~|{yxuw|~~}|{{{{{{zy{||{{~~~}{tu|y{~yvwvwxzyzzz}~~~}}~~z~{}}}~~}|}}~~~~~}~~~}{{|||||||||}~~~~~~xssy{}}|zxwurquyyz{|{||~zvqu{||||||~~|yupmjirvxxyxwvvwwpjjopkimrywuttuwy{||{|}|{ywvx|{vi[Ygz{vt~~~|{zyyxxxwvtttvvwx|}|}}~~}zxxxy|}ztmmsrsy|z~z{}yy}~~|{zzxwvwxxwusrw~~}~~}y{xuy~~|z{}{}~~}}|||||}}|{{|}}~~}x{{t}|{z|}~~~{vxz|}~}{{xxy|}|||}~~{{|}~~~|||zzyxxwwvvvuuvx{}|zwxz~}yurpnouy|||{~~}unnqw|~~~}|zzzz||~}}}}|ywvwwutuyz{{zyxxyyz||||{{{{{zyxwxxy{{{zywwwxxyyz{zzzzzyxy{zxtqtwwwuvwwxxxyywvvxyzzzxurnlnsxzzyyyxvtsstssssssstsrqpoopqsvwvuuvuvvwvvvvvuuuuvutvwwvvuvwyxqjoz}{yxz}}}}~~~zyy|~~~~{uu{~}}}||||{{zzy|}}||~}}~|yxzxy}|{{|zyyyyy{{}~~~~}|}~}z|{~~~||||}~~}}~~~}~|{{{{|}}}||}~~~}}}~~}xy|}~}{yyxumhrz|{|zz|}vpu{||{zyz}~~{xvvvtnsz{zzzxwyyypfb`_dkuy{wtuvwyyzxwwxyzz{yy{~xokd]`t|ws~~~~~}{{zzz{zzywxxxy{}|}~~~~~~~~}}~zwvxz||zslmvrqx}}~~{|~~~|yxxxvuuvxyxusuy|{|~~~~wvw}}{z{}|wy}}}}}||{{}~~|zxxzy{{~{u|xy|{{|}~~zx{|}}~~}||wxz|~~|}~~|{|~~}||{zyxwxxwwvwwwy{|zxwwx{|vsqpqty{|{z}roqv|~~{zzy{|~}||||{ywuttttvy{zzyxwwwwyz|||{{{{{yxwwwwxzzzywvuuvwxzz{zzyy{zz{{zzyxwvuuuvwwxxxyxuuvxyzyywurnlmrwz{zyxxvuttssrrsssttttrqpoqsuwwvussstvwwxxwvttttwuuvxxwuttv}wmlw|}{wy|~~~}}~{vww|~~~~~|{yy|yz}~}||{{{{zx{}}~}}|}~~~|yywwz{z||{zyxyz{}~~}}~}||~|~~}}|||}}~}}|}}~~}}{zzz{|}~}}~~~~}~~}~~|{~~~~{{{~xqlq{|{{z{}~wux}~}{yxy}~{xwy|}zy{{~}zyxxzyqeVORZlwzzwuvvyzzyuqqrvyz{zy~}uonrjcq}zv}~}{zzz{~~}{zzyy|~~~~~}}}}|{zzz{}}~~~~zustz}|ztoo{wtx}~}|~~~}zustuutuwyzywvx}}zzwvw{|~}}}~~~zyz~|{zz|zrmsz|||||{{{~~yvvvxwwy|xu~t}||}~}}~~}xy|~~~~~~}||~~~}|zyyyyxxxyyy{|}ywwwwy|xrqpqtx{|{z|~rsy~|y|z|~{{{{|{yxusrstwzzzywvuuuuuvz{{{{{{zyxwwwvwxxxwvtttuxyz|}{zyy|||||{{zyxvutuvwwxxxywstuyyyyxwuromnsx{{zyxxvvutssrqrrstuutrqpqsvyyxwurpqsvyyzzywuuuwzyxxyxwvtstvtot{}~~|~}}{{{xppt{~~||}~}|{{|}{{~|zzz|{y{~~~}|}~~~~~zxxwxxyz{{zyz{|}~}}}~~~~|}~~~~}}}}~~~~}~}||{{{{|}~~~|z|~}}~}}|}|vuyttz{|||}~}}~}zxww{{xwz~}{yy{{{xwz}{wjYT_ekvxyywwx{|zxutsswxy|yuvvqqt|vjq{~}}~~~|{zyz~}||zzyz}~}||}}~}zxvvvx{|}}}}~{wtsy~~}zwuzyyz}~~~zxtttwyzz{{z|}~}ysrrstuwy{|{zy{|xrqrsssx}~}||~}z|~|~~{zzyzwtswz{{{{||{|}~|vttvxxxx{~xv~}r~~~~}}}|zzzzz{{yy{}~~~~|{zzzyyyz{{{}~}ywwvvxzzrpoptx{||{}}sxzwz||{yyzz{{zyvsrruxyzyxvtsssspoty{{{{{zxxwvvuuvvvutsssvyz|}||zyz}}}}|{zzxwuttuvwwxxxxvssuxyyxxvtsporvy{zyxxxwvutssrrrrstuutsqqswz|}||xsppswz{}}|zxwwy|{{zzxwwvvtolrz{}~|{yyyn`\lw|{xy|~}}||}}~{yxy{{{|~~~}|{|}}~~{zyyxvvxy{zyxy{}~}}}}~}}~|{}~|}~~~~~~}}{{{||||}}|||yyyz}}}~}}{{{{siozxux{}~~}{yxwvsv}}}|yrrx{||zyxy{{{{|xvqihsvswx{zwxxzzwuuvwtuz{{tlnosxz{qu}~||||}}~~~~}||zyxxz|||||{{yx{}~~}}{zyz~{z{|}~}zwutsuz{|}~}}~~|xwz}~~}yzz{|{xuuvz~~wtqqqrtuvvuuvy~~~~{vtrrtvy{|}}|{}zunnnpprw~}{}~|zyyzzustvxyzzzz{{||~ysrsuyzzz{~z}zq~~~~~}ywwxxxyywvyz}~~}}{zyyyyyy{|}}~~}yxwwwwx|{spoptx||||~{v~~zvy~wsuvwwxy{{zyxtrsvxxyxwusssrqolpvzzzzzzxwvuutttuutttssvy{}~|{zz{}~}}{{zyxvutuvvwwxxxxvssuxxyyxvtsqptwyzzyxxxwvvuttssssstuvutssv{}|vpprvy{}~|zyyz{|{{{xvwy{zwnlrz|z{yvvtaKJZjwvtw|~~}}~~~|{zyxy{|~~~}|{}}||~z}}zwvx{~{xsvz}}}}}~~}{yz|}|}~~}~~~}}}}~|z{|||}}}~|wx~{wyyy~}|{z{zz{xmhu|xxw{|~{xwtrtwvsrrry}xrou{}~{zz{~}|xommqrtxuuw}~zyz{{vsrmkpstu{ztmmswy{yuy}}}~|{{{{{}}||||||zwuw|~~}||{{yy{{zzywuux~}zyy{~~{xwtrty|}~~~}}}}|{z{}}~}|{{{}~{uqppt~~{xvutuuuutrrsw|~~~~|yvsqquy{{|}~}}}ztrpqnjv~~{ywwx{|}xssvxyyyyz{{||}~|rqsuy{}||~~ut~|{yyxxxz{zxxx{}~~~~}|{yyyyxyzz{|}||||yxxxxxwz||sonpty|}~{}|z~yyz{{}xqmqsuuux{|{z{vntwxwwvuttttsqomntyyyyyywvutttttttsstttvz{~~|zz{|}}||{zzywvuuvvvwwxxwxwrtuyzzzxvutrswyzzyxwwwvvvuuuuuttsstuuuttx}~xqpqty{~~|{{{{|{||zvw{}}}}umv||{zywtsrY>CFZpmsx}~~~~ywyzyyzz|}~~}}}~|z|}~}wx~zy{|xrv{}}||~~xz}~~|zwy|}}}~~~~~~}}}|{{{|}||||||ww~}{||}}zxxxxx{zwtu{zzyz|~~yssvrmrxzxtoanytvvy}}{{||xodhqpmv{zz|y{||re^ROgwrqturnnquwxyuuuvx~~}}~~~~}}}||{z{|{zzzz{{xttwz{||{z{{z{|zxwwttx~|xurty~~|{yvw{}~~}}}}|{{{{|}||{z{}|zuqnno{~{xwvuuvvvvuwz~}}~}{xtpnrw{{{}~}}~zvrqqoy}~~}|zxwwx{}wvuwwxxxyzzz|}}|rpqsx|~~|~}|w|~{zzzzyyyyz|{yxwyz{{}~~~}{zyyxxxxxzz|||{{|{zyyyyywwx~unoqty}}~{}}{vuw{{rnlprvvtw{|{{}yqvywvvtsssttspnmoswxxxxxvuutttttsrrrttvx|}~{zxxxzzzzzzyxxwvvvwwwwwxyzzsvwyzzzxvvutuxzyxxxwwxvwwwwwxxwuttttuuuvz~yqqpqvz~~|||||||}zww{|}{y}{yyyxwtrsrX9;>Tpmu{~~~~||}|wuwyx{{{|}~~~~}~~|{|}~}wov~~~}zsx}}}{|~~~qhu{|}|zwu{}}}||}}}|}}||}~~}|||}}yx}~~~|xvx{|{|zrkty|{{{|}~~ysuwrknuz}t[aigrwwy|~}}}~~}yrpousnry|~~~{y|~}mTLKUajklnqponptwyysqqru{zyyz|~}}}~~~~~~~}}}~~~}||{zxxxxzyxvvvuwy{{||}||}|yxzwx{~~zvspow}~~~~~}}}}}}{{{z{|{zy{{|zyxurqo{|zxvuuvw{}~~~}{yvspquz||}}||}|xtqwy~~{zxvvvw|~zwvvvwwxxxxz||}~}qnnpv{~~~ys}}w~~~~~~{xuvwxzz{{zy{zyxxxxxxz~}|zzyyyxxxxzz{||{{{{zyyyyyywx|wppqsy|}|z~}vw{vponpswvtx|{xy~|uwxwuutsstttrommnquxxxwvuuutttttsrqqstxz~}zwuutvwxxxyyyxxwwwwwwwwwyz{svxyz{zzxwvtuwxwwwwxxwwvwzyxz||yvuttuwxy|~{rqoosz~~||}}|{{|yvvz{}~~}}zxxwwvutuy{`959Sxzz}~~~~}{y{|zyzzy{|||}~~~~~~~~~~}}~~{uqy~|wz~}|{|~}nixz{|{yvuz|y{}{z{|}}~}|~~~~~~~~}}}~~|z{}~|||}~~}}}|ywy|{~|j^lw|}}||||}}}}{ywvrnltz|s_`baiooopu|}|||}}|{zzxvtqos|~}{vstxqVRam`Yafjmpqrstvz{uosuvwvuuwy{~~}}}}}}~~~}}|||{|}~}|{yxwxxx{{yvvvyz{}~~||{z{}||}~~{yxwuqy~~~}}}|}}|{{zzzyxxy{{xy{zvts~|zyxvuuuwz|}~}zyvyyxxux{|{{{|}}zwr}~}~~}}}yvvwz|~~ywvvvwwwwxxz|~}~~tpnotz}~{xuv~~~~~yyvuuuvx{}|zxyyyxxwwvuw{||zyzzxwy{zyzz|||{||{{zzzz{zyxy|}rrtsy|}{|z}{sqnotvzzzz|xwu}}wwwvuttsttssqommoquwxwvuuuuuuttsrrqpqsy}{yxusstuvwwxxyyyyxwvwwwwwwyxruwyz{z{zxvutuuvvvwwwvvuuzzy{~}xussv{}|~zrpnnqy~~}}}|{{yxwutwxzz~y~zyyxwursx~kB9?^~}~~~~|z{||{|{y{||}}~}}~~~~~zuu{~~{|~~}{|~yx{{|||zxxz||~}ywwyz{|~}|~~~~~~~}}|{{~}xwxy{}}|z|}}~z{~}zz{m^nw{}~~}{z{{|||{xuvvqv|~ytpnkhgjmjinuyyxxxz|z}~|vttnglxprwqjjqvgfrqdZ^`glqwvspqswtnvzzvustuvx{}~~~~~}~~~~~~~}|{zz{|}}}|zyxyyyxxwutuy|}~|{y{|}zyyyxwz~}}}}}||{{zyxxxwy{zxyz{wuw~{yxwvuuuuttuvxy||y{{xtpnrv|{vw{{zyz|}~|{z|~~~~|ywv~~zwuwy|~ywuvvwxwvyy{||zrmnsx|}~|}vw~~~~~~~|vwvuutuvz~|ywxxxxxwvtssuwyz{|{xx{|{zyz{{|}~}||zz{{|{zyxz~|nmprx}||~|yssonrv{{zz{xwu{|wvttttttstsrpmmmoruxxwvuttuuttssrqpopqz~|zxwwuustuvwxyzzzywuvwwwvvxvptuyzzzzywutssstuuwvuuvutvwy{~zwurx}}~ysqpprw|~~~|{{zwutsstqtux~~sw{|{ywsrsz}tSK_t~~}~|{{}}|}{y{{|}~~}}~~~~~{uw{~~~}~~~~~||}|||}}}{yy{}}~}zxvxyy{}~~}}~~}}~~}|{||~}}|yxxz{||{z{}~~}|~}{zzompw{}~~}{yyyz{zzyx{}{{|}zwuspmknuwtqqroqsw|{y~~zzsUCI_IHbqqqrtsy{ug\]`gmsywrnnptsox{|vusstvxz|}~~}~~~~~~~~~}||{|{{}~|{zyxwwxwusrux{|zyxz}||||}~~~~}|||||{zzyxwwwyz{zxy{}zww}|zyxxxxwvuronoprstuz|xttuqmigimt}zx{{yxz}~~~~~~y~}rsuwz}{yy{}~ywuvxxxxxz|}w{sllpx|}~~~~ux~~~ztuuuutuvz|{wvwwwwwvtsrqtvxy{|}yz~~}yw|~~~~}|{{z{|}~}|zyx{pilry}}}xstpotvywxxzyyy|zvtrrrsstssrpnmmmptwyyxwutuuuttrrqponony}}{zyyxwuvvwwwxyyyxustvvvuuwsptvyzzyyyxvtqpprtvwuttusqqtx{~}zusy{|}wsqpprv{}~}||zwsqqqsnpruz|uy}{ytrqz}rtferz~~}||}~~|}~|{|~}{{{||~~~}~~|~|xy|}|z{~~~zuty~~~~|}~~~~~~}|}~}|}~~||~~~~~~}}~~}}~}|{|}|{yyy{{||{{}~~}|zyvvx{}~~}{zyxyyyzzz{{|~}{zzwvtttuvyyxvpjlqv{|wv|}~zrZ<69G?:Idsvvtr{zsicdlru{xrnmnonqz||wusstvxyz{}~~~~~~~~~~~~~}}|{{|~~}|zyyyxwussssuwvuvx{~~|}~~~~}}}|{{{{zzyyxwvwx{|}|yyz|zww~|zyyyyxwwurmkklosyxx{~}ywwwqliiihly~~{|{yyz}~~~~~~llsgmx}|}~}|}zvuvxyxx{zixtmlox|~~~}yy{~ux~~~~~~|{{yuttuvvvvyzyvuvvwvvtsrqqw~|zxxy{|~}{wu|}{{zz{|}~~}{zyz~ynmsz}zvvros{}zywxy}{{xussssrssrqpommnnqvz{zyxvutuutsrqponmmkx}}~}|{{{zywwvvvvvvvutqqrtuutttrpsvyzzzyyxvtplosvwwvusttssuwz}~~~|vsz}ww~|vrppqruz}~~~}}zxsppqsmpquxxxz~}{wuuzzmusrqruwxz{{|||~~|{|||}}{{||}~~}}~||{yy|zyuy|}xqlq|}}}~~}~}|}~}~~~~~~}}}~}|{zzy{{|}||~~~~~~||||}~~~|zyxxxyyyz{{{xyyxyzyxxxz~{xxzzmakrx}{vtwx|xrbD313859Xongeeknsvsmkt{{|ytppssprz|{vtsuwxyzyz{}~~}}}~~~~~~}}~~~~|{{|}~||||{yvttssttttuwy|~~}}~}||{{zzzzyxxxwvvwz|}}|yxxxvux~{yyz{zwusolkjjov}}~~}}}}{qljiiimu|}||zz{|}}~~~}||zl`vhky~}}~|wtvxyyy|l\swqmny}|~zvxz|~~~vy~}||~~}|{yuyxvvutuvvvvwwvvwvwvutrqqsy|~ukuyy}{{xt|~{zzzz{|}}}{{{|}vptz~~|yxtqr{~}zyyy{{zwruvurqrrqqpolmoqtw{}|zxwututtrqponmlkiu}|}~~}|||{zxwvvvvuusrpooprsssstqpsrvyzzxyywvojpwyywvusttvvwxz||}|zxw}zst|~{uqppqruz|~~~}}||{{xtpprsoqqtvuuv{}zyxwwpvsqoqtvx{~~~~~~~|}}~}{{{|}~~~~~}||}}~}|zzz}xsqx}~|yuqt{}}~~}}~~{}}~~}}}}~|}~~|~~}}~}~~~||}|{zy{{|}}|~~}}~}{zyxxxyyz{{z|{xwwxyz{{{{zyyy{w_M_fgpwuooqywwrN5346:G\cXT_ga^gnqqtz~}|zwssxxsryzzuttwy{{zyyz|}~~}|{{|}}}~~~}}~~~~|{{|}~~~}~~~~|zwuuuvvwwwvz{}|||~}{{|{zyz{ywttttvwy|~~}{yyvqkmsxz{yyzz{{wtomkkkgky~~}~{wronnmmmptz|}||||{yy{||}|{|~{lunp|~~xuuwyxx|tZWm}~zsnw|||xwxzz|wy~|||}~~|zyxuwxxwvuwvxwwwvvvvwwvusrrrqy|yu_q|w{{|yw{}|zzyz{||||||~~{qt{~~}|{ystz~}|{yz||zwuwzurqqppponjmoruy}~}{ywuuuutsqonmlkigr{}}~}}|{zwvvvvvutrpoooopqrrrsqqqlpxyxwxzyvpmvz{zxvtsstvwxyyzzxuuz}wrsy|xsppppqvz}~~|{yvtssrpprstopqstrns|}zusssvuttvxz|}~~}}|}||}~}zx|{y|}|}}}}|{z{||}~|{{zrqtz}}{zwwy|yy{zyz}}~~~~}||}}~~|z}~~~}}|{}~~~~~~}{zz{|}}{y{{|||{}~~~}}}~|z{zyyz||}}{yyzxvtttuvxyyyxyzyfF;JYYbpwrpsyvvnE49<=CQXQIVndVZekotwz|}|yxvuxzutzzyvuvy|}|zyyy{|}~}|zz{|||}~~~~~~~~~}|{{||~~~}|}~~~~|{yxxwxz||}}|}}{|~}{{||{z{}|yvuxz|}}~|yxuopusvxxxyyzzzxtnjjnpquz~~~~}|xqoopqqqqrux{|||}}{wvx{{{z{{~~~~z{~~zzux~{z|}}~~zvuwwwz~mW[m|xnt|{xxx{~yz~}}~~|zywuuwzzyvyy|{xwvvvvxwvusrttuwz|ugtwtxz~}{|}{yxyy{|}}~~st{~~~xty}~}{{||{xx{|wsqonnmnmgmquxz}}|zxvvvutsqnmmljhfoy~~}}|ywuuuvwwvusqonnnnopqqrqqokltwvvwxxwtw{}}{xusssuvwyyyywsno}zwy}~yurpppoqvz|}|zwspmlkjknrstpoprrrou|~{vpqty{||z{|~~}||||}~~{y|xty}{z|{{{{zyyz|}~~{xxwvv{}||zyy|~yxzywx{}}}{{|}~~~~~~}||}|zz|}|{{{zyxy{|}~}|||~~}zxy{|}}{z{|||{z{|||||}~~|{}||}}~~|yxwurqnlkmoprtvxyyoXEEJPhu{zxxyutq^I?OUSRMKYkqaYXYgmpsx{||zzxwxxuu{{zwwx|~}{yyyz{|~~~~~}|zzzz{||}~~~}}}}~~~|{zz}~~}}|||}}~~}|{yxxxx|~}}~~}}}|}~}||}~~zvv{}{xwtsuuvwwwxyyyxwsnklpx~|~}}~~}|wpnnqrsttutvy|{|}}{xvwyyzz{{~~}zvz}z~|~|z{}}}~}|||~~{wuvwx|iWex|qt|}zy{{|}{{{wtsuyzxtwx{zxvuuvwwwvusrrx|txz}~xt{{}~}{yzz|}~vv|~}{}~~}{{|{zxx{~|spljjjlldmswz|}~}|{ywvvvusqnllkigfnx~}|{xvssuvwwvusqonmmmnnopqqpnnmrxvuvwwvx|~}|xvttttvxyyyyvngjz}|yz|~|vsqppooqvz{{zwtqmlljghnruuqnprsuwz}~{vuvtvxz{{}~~}}}|}~~}}|rpw|yy|{zzzxwwy{|}}}}~}zww{zz{}}}{||}~}{ywxzzzyyxy|~~}~~~~}}||}~{xy|~}||||{zyyz|}|{zz|~~|zxxy{{{{{}}~~}|{{{{{{}~~}||}~|zzzxtqkecdinoqtwyxxnWEHWlox}||zutvrVKjzvk^arzumeY[jqopvyzz{}{xupmpz}||}~~}{yyyz{{|}~}}}}~~}{zzyyyz{||}}~~}||}}~~|zy{|}}||}|{z{|~}}|zzutwxwwy{~}}~~}}}}|ztopv}{xvvuuuvvuuvwxwvtpoopu~~~}~~~}womnqqrsstttwz{|}}|yxwyz{|}|}}||zxz~|~}{{|}|z{~}xuuwz~l[k}|~xw|{zz{}~|{yz~}~~~}{}|xspqvyurvvxxvuuuvwwvvutrrvuz~}~{zz{~~~z~}z{}|zxwwz~}upidcfijclvyz|}~~|{zxwxxvtqmjihgfeox~~|{xvtuvwxwvusqonmllkkmopqqjljltutuvwvy|~~~|ywvutstxyyzywmcet}~{zwxz|}~ztrqqpooqvz{ywwtqnnolhinrusppprty}||{ysqsvy{|}~~~~~}~~||zqqx{vx~{zzywuuux{~|y|}~}|}}}}|}}}}~~~zwvxyxxyzyz{~~|zz{~~}{{|{||{wvx|~~|~~}|{|}|{yxwx{}|zwvvxxyz|~}|{zz{{{|}~~~}}}}~~|}~~}{|}{wtne^^jssosxxwyyiSdsrnz~}|zyxymqz|xx{{z|o\ahjjltwxyywusplefr}}~}{yyxyyyz{|~~~~~}|{{||}~~~~~}|{zyyxxxz{||}}~}~}|||}}~~}{z{{|||||{zyz|~~~~}}{zwutqtw{~~~}||}~{yrnmsz|wvwvuuuuttvyzvtqorx{~~~|vmkmpqrrssttvy{}~~}{zz{{}|}}}|z||z|~zz|}}{{}~yuux{{hpwp|}{|~}zxxyzyz{{{~~~~~~~}|~|wsnntxsqvvwwvuuvvvvvutssqtx{}zyyzz~~}}|}{ywvu{~{of__cggckz{{{||}~}|yyyywvqlhedcdesy~}{zwuuvwxxxwwupnnmlkiikmnppeicbptsuvvwyy{|~}zxxwuqswzz{zxngdox{zxwvxz}|tqppooptx|{yxwtposxunlnrsspopruy|~~||}yrprvz{|}}}~~~~~~}{|zss{ztx|yzywtssw{~|y{}~~~~}}}}}~}~}}}}~}xrvwxyyy{~~~}}|zxx~~}{z{|||{ztrw|~|zyy{|}}}{yxwwy}}{{xusvxy{}~~}{zz{|||||}~}{yyy{}~|yvy{|}|{|zxvpjdclurqt|w{~}zu{~}}zwvw{{y{~}zvtvwyywonplijtvwvurooljiemu{}{yxxxyyyzz{}~~}}}~~|{zz{{{||||||{zzyxxxwyz{||}}|{|||||~~{{{{||}~~~}|{zz{{||||{{wx{~~{xvvtswz|~~~|y{}}|zuqmnw|wvxxvtssqrtvwtronrw|~}{tlhknprrsuvwwx{}~~~}}}}~~~}zx{|{}}~}~~zuuy}tsjm}~~~}||{z{zyy{~~~{uqkltxqqwvwwuuuvvvvuuussqpprw}zyyy}~|{}~~{xvutvw}~qd[[`decj}|{{yy|~}{{{{yxrkgdcbcfuw|}}{ywuuvwxxwwxvsoomlkiijkllodi`^lsttvwxwvwy}}|{zzxrrwz{|{wrniouxxwwvwxzyrqpoprwz}{ywvspot|{toorrspnoprsux}~{yyzwrqtx{|}|yy{}}||~}{|}}~~~}~~{y{sv|z{ywsrpty}}{}~~|||}}~~~~|{{yuwwxz}}||{|}~~}|{{|}{wu~}|yz|}}|{ypox{}}|||~~~}{yyyy|~~||{yvsuxz|~~|{{{|}}}}||~~}|zyxz|}}{wsuw{||zyxwxwwsoqxuuvzsx|~|{{}{vomqxxtu{~zupotuvxxyyvqrzzvsssqlflnghms}{yxwwxyyyyyz|}~~~~~~}}||||}~~~}|{zzzzz{{{|||{{{zyyxwxyz{|}}|{zzzzz{}~|zyyz{{|}~~}}}}}}}~~~}{zxwz|~~{zyzzzy{|}}}}~~|yz||}|{wqou}~{vuxxvsrrrrtwwtqnlmpsx~~~~yngilpsssuyzyz{}~~~}~}|xv}}}~|}~~~~zvv{}{obu~}}|{zz|~~~upijsvpqwvwwvttuvvvutttttspmnz}}{{{xzz~~||~|~|{xwuttstz~tdXXZ_abh|{{yurv~}}}}{xrjfccbchvuy}}{yvuvwxyxwvwwwupnmkiijllglhmdanquuyyxxwvx{{{}|zztrvy|~|yutprtvwwvvutty{vspprty|}{ywurpms{|yspqrsqopokgdmx{xwvwvsqtx|}~{uty|}~}|zzzzzzyz|}~~~~~~{vx}zxzyyvtsw{~}|~~}{|}}~}~}}|{yw{{u{}}|zzzyxxy{~|y|{xz~~~}{zqowz|}~~~~|{}}|||}}{{{{|}}|{{{zxyz{}~~}||~~~~}||~~}{{{}~}}}|zwssty{zxvuvwxzzwvvqpsztnnx~|{}zxxzzxvtstqiks||wtvvusru{}|zy|}ztsuvm^bptqlg~~|{yxwwwxyyyxyz{|}}}}}||{zz{{|}}~~}|{{{zzz{{||}|{{zzyyxxyz{|||||{{{zyyz|~}{zxwxy{|~~~zwvvxz}~{vry|yyz{|{||~~~~~~~}{{zz|||zvtu{~~~~}|yuuwwusrrstx{{wsoliijpy|tnnpuvvsuy{z{|}~~~||||zy{y}}z|~||~zy}~}ocy}{yxwz{~wpijtursxvwwvttuuuutstusv|urx{xw}}~~yuu~~~}|{|zzzxwvvuw|xhWVWZ^`fyz|vkhn{~~}|zqhdbbbdjutw}~}{xvvvxyyxwvxyzzrooomklophmnqomsowvz|zyyy{||{|{{zwuxy|~|zyuuvxyxwuutstxzyrppsw{}}|zxuromsy|zurrrrqoprj]Ucx}zwvvwwsruy}{ut{~}|||{|{ywxz|||}}}||||}|{yz}{zzy{yxvz}~~}|{{{{{}}|}~}}}}|||{{|~yz{|~}yxywvvx{||{x{~}{{rry{|}||}}ywxyzzz{|{|}}}}}|{|}~}||}}}~}|}~~}}}}}~~|zz{}~}}|{zxuqqw{yvtrruwxxwupnnrwsmpy~zqow{zz||{y||yncckw}wqpopqqswz{{zz|{tsuvn_^n|xph||zywwwxxyyyyxyz{{||||{{zyyyyz{|}~~}|||{{{{||}}|||{{zyxxyz{||||||||{zzyz|}~}|{yxwwyz|}~}}}{zyxyz}}{uuttvyzz{||}~}}~~|}~~|zxyyy{z|zuw{}}}}|zxvuuusrrsuvy|zwuplkihjv}}}|wtvxyywuwyyxy{}~~~}{{z|zw|x{~~zx{{x}|{}~}}smy~}~}zussw{~}}~ypihvutuxxxxvtstuuutrsusw~}}trzzt{~~~~}~zy{yz{zyxwvuvy}}nUTSUX[_kx|g`acy~}|qgbabdgltvy}~~}|{xwwwwxxxwxyzzxtqppommqtuuuuvuvntsx|zzzz{|{{{{zyywyy{~~}~}wtvyzywvttrsvxzwrrty}~~|ywspoptx{{xtrrqpoqvp^Sp~~|yvuvxxutvz}~|yz~}|}~}xuvy~~|||{zzz||z{|~}{x{|zw{~}}|{{xvy|~}||}~}}|}|||||}|{{y{}}zwy{ywuw{~}~||}~|{|vtx{}}}}~~}zxvxxzz{||}~~~~}|{|~~}}}||~~~|{z|~~}}}}}}}{xy{|||{zyyvomxyxwsnmntzwrysnnoquy|~zroyxwwz{zy|}{sigiq{vmijmpptwyz{zyxuonpsqicizyuq{zxwvvwxxxyyyyzz{||{||{{zywwxyz{}~~~~}|||}}~~}}}||{zxxxy{|||||||}|{{z{|}~}|zyxwxxyz|~~~~~~~}|||||{{{|}~}|xxuqsvxy{|}}~~~}|~~~~|yz}~}wtxzz|}~{ssxy{|}|yvutsqpqsuuuyzzxvsqrqnox}~|x|~vsswzzxxyzzywxz}~~|||||{{|zt||tou{}~~~upwy|~~|yzxv{~}~||~y{|~~}{vomou{~}}~wletuvwxwxxwusstuvvssxvwzxz~~~~~z}}}~~~~~~|}wy~}wxz|{zyxwuuwzsXVRRTVW^px^^hm{~~~|pea`bglpuxz|}}}{zxwwwwwwwvwy{zyxurpnkkr|{ywvskiak||z}z{{{zzzzyzzzz~yrtwyusvyzzxwutsruwz{uquz}~|xtqpsuxzzxusqponqwxjd~|yvtuwyxxxz}}~}}}~}|~}xtstwyz|}|{yyz}}|}~~{x}||z}~}{{{{xuy~{z|}~~|{|{{{{{{||{z|}x{|{{|{xwx|}}}~}{z{wv{|}}~~}{yz{{z{|}~~}||}~~~|{|}{ywxz|}}}}}||{|}|wsswz{{zyxyumkuuvsleenw}wnvwqommry}zttsqnpqstxwvxwplmwtjhlpnqwz{{|{ywqjeioqojittvx{zxwwwxxwxyyzz{{|||||}}||zyxyyz{|~~~~~~~~~~~~~}|{yyyz{|||||||}}}|||}~~{zyxxwwwy|~~~}}}}}~~|{|}}}}}~~}||}~|wttuv{}~}|~~}}}||{ywwz}|wrvz{}~zrpux{}~}yvusqnmnswwvuvvwvvx|}yy{{{|~zz~ytqpswxuvyzzzyy|~~{{{}}}}~{x||zwps|~~}|}~~~~}xqvvw{|~}}}yz}}}vvwz{{yumilt{~~~ufpsvwwwxxxvsrruxxvuzywwxzy~}}~~}}}|}s|}|~~~}|ypyxz~{vy}|zxxxvuvvxuc_YRPRT[lvhmwz~~|qd`chmstwz{{|||zxwvvvvvvuuuvxz||zuqnjjs}|vvtsmdVc~wzzz{{zzzyyzzzz}jbgnutsuxz{zywutstv{xrw|~~yusrtuvwvvtrponot{}wx~zwvvxyyyyz{||||}~~}}~|xusqoprx}}}zzz}}~~|x}}|{}}|{|}|{x{}zxxz{|{{{{{{zyz{|~||{w{}~|yvwz}|}}~~~}|{zyvy}||}~}~}~}}|{zz{}}||}~~~}|{yvuwy|}}||||||}~{toptxyxxxwtnihmovrkdfs|~xsutnljlou{~}rosrkfdfltxvx{wqqwrmouvpt{|{{}|zxsjccgikmnrqvz{zxxxxxwwwxyyz{{||||}~~~~}zzzzz{|}~~}{{z{||||||||||||||}}}|{zywwwy}~}||||yz}~~}|{||}}~~}||{}~|zwv{~~{z|~~}{{ywuuwyzytuyz}~}vqtv{}{yxwtqoosyyuqruwwy{~~~}{y{|x|~~{{|xsqqrttstuvwwy{~}{xw{}~~~}||~wttsx}~yuuz||{{z{|uxvtuz|x~}}|xxvssw|{rhjs{}}~~~~~~lnpqsuvwwwwsqsvxzyx}}{snnr}|{yx{~|{}~}|~}{xtowz{~{z}}ytuwwvurprkh^QMQ\hpywz|{}|pfdiptxxy{{yz||yxwvvvuutttutvz~~ytohjuz|{xvtttxobjyyz|}|{zyywxwy{u\[bjrtqsy}}|{ywvtuw}yvz|~~yvutuuvwwvtrpnnqv{}|}~zwxx{{{yyyz{|||}~~~~|zxywtpnmt}}|{~}}}|{z||{{||{z|~}~}{yvxy{||}|}|zwuwx{yzzy{|}}zuuwz{{|}~~}}|{{zz}}z|~|{}}{xwy}~~}|}~}~|zyyyz|}{zz}}}~}xtrsuuttttnebbfirusoopsqvwurnjedisz}~}sqywmcZaqvutuutsvwsrt{yux{xvw{|zzwph`]`gnrvutt{zxyyyywwwxyzz{|{{{{|}~}{{{zz{|}~~|||}}}|||||||{{{{|}~~}|zxwwy{}~}||||yy{~~~~~}|{{}{xxy|}}||}}}xw{}~}{y|}~}{zywtsuwyxuvwy|~yrsvz}~}|zwussu{xposwxxz|~~{y{}rq~{zwvrqqrsrrrsstux{~~~~~}{vuy|~~~}~zzwvz~}vqqx}yzxrro}|wmqx~yx|}~~}|{vrqsw{vjhq{~~}}~~~~~~}||}|}}~yrmmoruvwwxtqswyyz|}ttx}~zvrt{~}}}~~{vqpswzz{z{~~vpquyutqmpqe\SOR_uwyy{{}~{pghluxyz||zz|}}zyxwvuutsttuuvz}~zsglyyz|zxussturv|}zyz~|yvvwvvw|ugbfkqsorz~}|yvwv|{y|~~|ywvuuvyzxurpnnsw{~}}}~}zwxy|}|zxwyz|}}~~~~}z{|}xrppt}~}|}}}~~}|{{{{||{{{{{}~~}zywxxz}~}~}xurtvwvwyy|}}||{ywvwxz{|~~}~}}|{|}}{{~~zy}|}~|vwx}~~~~~~}~~~}|||zyz}}~~~~~}ztssrqrsumb^_dgouxuomhltvtqpl`_ds|}~~zvwzunf\jzxrpprqquxwtsstvxyuqqvy{|zvobY[goywusozyxyxxxwwwxxyyz{{zzz{|}~~~||||{|}~~~~}}}||||{{z{||}}~}{zxxxxyz{}}}||{||~~|{|}~}}}{zxvsrsvx{}~|{|~yxz||}~||}}|{zywtstvyxuuwx{|}}vuwy|~~}|{}||uonrxyz{||}}wy~zrppstutttuvutsuy||||||{zvuvy}~}|sjku|~yvvvsts~wlw~}yy{~}}~xs{~~~}yvtssuwpkrz}}|||}~~~~~}|}}~~}{z{{z{|}xnklosvwx|wttwyy{}tox~||~}yrsy}~}}}~tloqvz{{{{}ulnszvvtjot\ZYVU\rywxz{~~~~~ynhmry{{{||ysx~|zxwvutsrqqsvxyz}}wip{z{}}|ytqpsx{||yx{~~|zxwutvyyxtllmnmry{{yxwyyutv{}|~}{yxwuv{}{ytqoqu{}~}|z{{{ywwx{~~zwvyz}~~|vtsw~~~}}~~~|{{{{|}}|}}|}~~|xxz{y{~|vomqqrstwz|~}{yxvvvwx{~}~~~~~~}~~}}}zx{|yuwy}~z|~~~}~~}}{xy~~~{uqpqrtvxsg`_bfmtwskhhjqpoqur]Y]s}}}|ywxzwtrnx}tkgjollqyykcgjmrqljnrz}|zwk]Zoqosrolyxwxxwwvwwxxxyyzzyyyz{||}}|{|||}~~~~}|||{zz{|||{{|~}{yyxwwwxz{|||{{|~}}}}}}}||xutsqqsy~~~}~~~zy{|{{}||||||{ywtstwywssuvyzzwutuvy|~~~}}}~}|z|yrqtxz{{{{|ysrsvwvuuuwxvsrtvxxyyyyywvtru{}rhqoqztsuuqwyyzxy{zz{~uqy|{ywtprqpu{|}}{zz{{|}~~}~~~}}}}~~~|||||{{{|~tlkosuvz|wvxzy{|pmy~wtvrwz~}}}}~}ngsuxz||||~}usx}yzzmuw]`da[Ykwtwz|~~}~~xmlrv{|{{}|yoqz{zxwutsrqnorvz{z{{|{nq{{||}}xqkmqvwwyxzz|{{{~|zwvuuvvrpmjimruuqomllsurv{~|zxvru{~{vsruyz||{{zzz{zxwx{{wvxz|}~{yy{~}||||||{{{{|}~~~~~}}~}}~~}{vvz}||}~}zvqpsyvtstvy|}|{xvstvwx{}~~}|}~~{{z{||yvvwy||||~~}~~~}}}~~|}}}~}}~}}~}z{~}xuruyz||vmea^cktvogfjeflmotr]]_t|{{zwux|zz|}|yofckrlhjs|}jXZ_dpyrmfqz}|{ytliwpgjossxwvwwvvuvwxxxxyzyyxxyz{{|||||}~~~|||{zzz{}}zvu{}~}{zyxwwwxyz{{}}}~~~~~}}}}}}~}zyxvsprv{~|zy|~}{{zz{||||zyvuvyxtqqsuwzyuprtux|~~}|{z{|{zy{ywuvyzzyxy|~}{z{z{zxutvxxvutuwxurqrstuwwwwvurqsw|~vnpfjxpqrqltw|~}~ztuxvsu{~vsu{}}~}zwtsssw~~~}|{yyz{{|}~}~~~~~~~~}}|}}~}|||}~|pilruw|zxzzyz|~{x{~zwyruvz}~}}~~urzz{}~~~}}~|z|{ryzjnqme\froty}~}~|wnpxz||{|}}{xpszzxwutrqpnosy||zzz{~}st}|{zzzunmmpsqopvz{yyxx|~~}zxwvuvutqmlnqrqpqkf]jtuvz~}{wqmpy}ywwy{zyyz{{{|}}{{|}zxvxxz|}~~~~~~~~~~}||~}zz}||{{z{{|}~~}}|||{yuty}|{{|{yspqsw{xvutvxz||{yvrsvxxz{|}~~~~|z{|}}}|zzz}}yxyz|zyy{{|}}|{{|}}}}}~}||{|~}||~~}}zx||wsmg_dpwwnechbckpsup`mrzxyzyvsuz}~~|wwsifqumjggoxkYZeirwvzqtz{{{z{{{zokjoy}xwvvvuuuvvwxyyz{zzyyz{||}}}~~~}||{zyyz|~}ywz{~~|zyxwwwxz{{zy{{{|||||||||||}~}|{yvttuux}}yywwz~~|zyz{{|}}|zyyy{xrppstxz{ywvuuw{~}|{yyyy{zzzxwwvy{{xuux||wvvw{zxvuuxywuuwyxtqpprssvwvuuupou{zwqlsxmnrsqruvtsu|yrpqroow~}yy{}}~~}|zxvtty~~}|{{{z{{~~}~~}}}~~~}}}~~}||}rhkqvz~{||||{}~~~zwvxz~}}~~}{}~~}~~~|{{z|wpv~{{zsidhnkow}}~zumry|}|{{|~|{xy{zyxvtrpomnt}~zxz{}~~|~{vuusontqtrigs|vtz||~~}y{}yvxwvvsonmmmprnechourtx|~~zuniny~|||}|yvwy{|}~{z||zxwyz{|}}}}}}|||||}~}|}~~|yz}~}}|{{|}~~}}}||{{{{ywx{||{{{zypryyxxwvutuwy{}}|wuvz{zyxy{}~}||}}}{zzz{|~}|{y{}}}}|{|~~||}}~~|zz|}}}~~|z{||{xxz}}~|xwxyz~~yvurlpy{xph`bhjntzvtrxzvpvwxuqrw|~zwqtuqqtmkkhdenojoyxzyuwwxxz{{{}|{wrsvt}xxwvuuttuvwyzz{||{{||}}}~~~~~~~~~~~~~}}|zyxxz~}~~}|zxwvvwxz||{ywwwx{||||||||||}}||{ywvvttx}{tsssvz|{yxz{{}~~~~}}}}ytrruwz|}}}zwux|~~|{yyxwz{|yvsstxyxuqquy~~yutttuxwvtstwyxvvxywtpoprstvxxwvurrw~}}|||}~}zw}ymlruvvvsuvtz|z}zspklki{~}}}}zxwz~}||{{{}}|}~}}{{{|}~}||}~}}~xkjqw~~}||}~yxwz~~|}~~}~}zz{|rlw~zwtkillhkv~~~wmjox}}|yyx}|||||{zywvromlnu~yuxz|{|}~}xvutrruwzrpvzyx|~}~}~{}|yytwvtojhghkvvoiinsstx|~|~|xslgoz}yuvy{}~{vvx~{yyyzz{{{{||z{||}}~}}|{|}}|x{~}|}~~~~~~~|zzz{{{{z{{{yyyyyz{{{xsv{zxvuuuuuvxz|||yxz||{xwwy|~}{yxyz{|{yxy|~|yy{|}|~~~}{z{}}zzzzywvwz|{{~ztuwxwz}~yvvyzzyyvnechpqrxwyz||ztyzywsprxzusortqsvnkkhcfnqs{}}{wxyzyz{|}~~}yxyuxyyxwwvuutuvxz{|}~~}}~~~~~}}|||}~~}|zxxy{~~}{ywuttuvy{|}|zzzz|}}||||||||||{{{zxxxwwtswyyvssvz{zxy{||}~~~|zwwyz}~~~{vux|~~}{{zyy{|}zvqqtwyxurqtw{}uvwyxvsqpqqtwxxwwxxvtrruwwwxyzxvtssw{zzyyz}}qmsv|~|wz~yw|{xwnmmey|}}|~~}|{|~~}}}||}}||||{{{|}}}{|}~~ojry}{{||yy{~~}|}~~~|z|~rfmuzmssmmpmgjupihmvz~}ytr{||}}}}|{zytokkqx}}wsvy|{zz}~~}~{yutvt|vvwqghs~~}{||{{~{rvvuphfggiuywnknptw{~|{{xtnjqz~~}ywvyz}zvrw}~}{yxxyyzz{{y{~~}|z{|}|{x{~}}~~~}}||{xxxy{{|{|}||{zyzz|~~|{w{|zwtssuuuvwxyz{z{{|{zwvvx{|}|{zxuuwz}}{zy{~~|zz{|||}~|zz{~~}|{y{zwttxz|}zxyy|ywyyxuuwy{|ysnmszzyz{vrkfqmlsvwxzzxsz|{zwpllopomopmowwpjghpust|}{|{yyz{zz{}~zusonp{{yxwvvvvwz|}~~~~~}}}|{{{{|}}|{z{{|}{ywtssttvwy|}|}~~~}}||||||{{{{|||{{{zyyupptwxvuuwyxvy}||}~~~}}}}~}zxuvz}~~}}}}}||}}{yustwyzxwuvxz~|~}}zwsqpqruwxxxwwvtrsvy{{zzzzxvtrqszzyzz{|~~yrsx~|{~|yxsrqrv|uu|~}~~~~|~~~}}~}}}}}|||||}~~~|{y|}~~~~vms|}{z|~}|{|~~~}}}~~~}}}~~~}y|xcbmpcrunnrplpu~~gdjpy}{urvx{}~~~}{{|vokjtz{}}xvvy|zzy{|xz~zwuxu}ls{xjYcz{zyyy{~zxpsuvpjnooorsrmjhkpuy|}~}{zyuurvz~|}}{xwxz}~~}}}yww}~|xuuxxyz|zy{~}}}}|||}|{xvy|}~~}}}~}||{{xxwxy{|{|}}}}{{}}~~}{}{vsprrtvvvvvwxyzz|{zyvvwxyyyyyyxwsvz}~}{{{|}}|{{|{||}~|zyy~|xxwuvwrsu}}}}yvqpvyyzxtrrsvyxtomnu{{zz{{wi]bceosroqqqqxyz{ytjb`gilnsvqqtukisz{uswxz{|{{{{{zzzz{|}~ztpljj}|{{zyyyz{|~~}}}~~}||{zzyyz{}~}|{z{}~~|yvusssstuwy{|}}}}||{||||{zzz{|||||||{zyussvwvvtsuvvz|||}~~~~~}{xuuv{||{|}~~}||||{yvtsuwwxwxxxz}~{wtqqrtuwxxxwvtqprvz||{{{yxvsqonqttz{}~~~uts}}~}|zyy~u{z~{vuz~~~~}}{~}}||}}}}~}{{|}~~~{y{}}~~~~~~}~|kv~{zyy~|{~~~~}}~~|{zyz{{{~y}uhh`[qxlpsqprv}~~|felt|wuuvx{}~~}||nhoiu{z|~|yxz}}}}|ztw|{xwxyz{rtyzo^Pm{woov~{storuwrksywroonoabhkrvy{}~}}{zzy|z{}}}}~~}{yyz||}|||yyy~~}{xtuyz{{{zxz{{||}}}|}}|zwvwy{{{{{||}}}}|zxwxxyz|{{|}}}|{|||}~}}zuqnqqrxxutuuvwxzzyxvvwwxvssvxxzyvwz|}|{zy}}{{|||{{{}~{yxx|}zsj^Wbieoz}}{{xuoorvz{wpostvxuqmqt|~}{wuwqf_bflrrqmlnpqwyyzzvk^[`djnrvuswxstx{{tqtwz|||{|{{yyyyz|}~zvrnif~~}}}}}}~~~}||}~~~}{{zzyxwyz{}~}|{zyy{}~|zwvuuuusrrtvxyzzz{{{||||{zz{{|}}}}}~}{zxxxwuruyz{|{{}~~~~~~}|xtrty|yvvyz}}}}|||{zxtpppprvzyyz|{xvuuuuuvvwwvttvvvy{}}|{{zywtpommrnu}~}z|}~~~~||}|}uvqy}~zxvz~}|zzy|}|{{|||}~}||}~~{{||}}}}~~~~{nz|zuq|vx{~~~~}~}{{zzzyxz}||q_VYqytrtuuuvz{y{}{v}}geoz}uqptz}~~|{tpufs}}~}{|~~{vx}||y||}wjeemuVe|wodaju}~vnoltzzunvywsmkkbVYekqux{}~}~~~~|{|~}yxxz{{|||{|}~~|yywvw{}~~{xvwwx}}|}~~}{zzvttvxxxyyz{|~~~}|ywzywxy{{{|}~~~}|}~~}xspkoruzvssuutuwxyxwvvwxxvnmqrtx{yz{{{zyy{}zy||}}|{||yxwuvz~}{xp[E=DRV]ly|wxtqnpptx{ysooquxvrotx~~~|vqrswyyzzzvsnorstxzzz{xpgccckqrnor{}zy{}{wsrw{}~|{{||yxxxz|}~~}zuma~~~|{{|}~~}{{zzyxvwxz{~~|{zyyzz}~}zyyxyxvsqqqstvwxyyz||||{zy{|}}~~{z{~}|{{ywvy}~}|{{|}~~}~~~|{{yuqoqstqmjjlv{|||{{zzxtpmmnpuyyxy{~|ywvvuuuuuuvvux}~|}}}}|{{zxwvsqnqssz}|||~~{{|wwosuxyyvz~|zxwz}~|{zz{||}~}}~~{z{|}}~}}~~v}}{vozvx{~~~~~~{{{zzzzy{}y}xwj`Ynxxwvxwuswxx{}ynxydeq~vpmrz~~|xxpnmhw~}~|yz}|~|zVT`oojxyrg_blw{qormuywtowywsmjkdZ[clqux|~~|}~~~}}}zvuwy{{|}}|||~~yuvyz{}~}|ywvwy|~xx||zxxzvrtvxyyxxyz|~~}}}ywzzz||}|{z{}~~~}~~}{yxpqsy}rpswvutuwwwvuvwxyzpkortx|{{||||{{}|z{{|{{|z}}}}}}}~}ywwvussvz{||}kUHBIWY^s|zxuolpprtvyyurswyxtqux|}}|zussx{|~~{xustuusuvwz|zvsqjepxxrno{{xxyzvtvx{||{{{|ywx{}~~~~~{vm]~|{{{|}~~||{{zxwwxy{}}|{{{|}}}~}|||}|zwsqnnprtuvxxzz{|{zxxz|}~~}{wwwy{|}}|}|yy|}||||}~~}~~~~}{yyvqnkmoqrplijuy||{yyyzyvqlmrwyyyxyz}{xwwwvtttttuvvy~~}|||{ywwzvtoprt~}||}~|su|}yu||vvppprvwuv|~{yz{||}|{zz{||~}}~{zz{|}~{x}}~}~|wq}}|{}}~~}}}}~~{zzzzzzz{~~~{w|}{uqxyrgr|yww}{rowtuz~yoqrls{ysqty{}|waYWZl{xv}}}~|||{|}}{_dko~vyxmb^dnuopspuwuvuz{zyussxsfflruy|~~|~{{{~}~zvuwyz{|}}}{{}ytvy{|}|yxuvy|}}|tsxyxuw{wsuyzz{zyxy{||{{{xyyz|}zxy{}}~~~}~~~uuv}rquvutuvwwuttuwwz}uqvxvy|yz{}}}~~{}z}|{{zzz}~~|yyxvtsstw{~~ynjbfeiv~|{wpmppqqrvxxyyyyywtvx{{{{{xspsxy|}{ywunmrrqqtyyvsrsplv}~wpr~~}zwvvxxvtuvy{{yy}{xwz}~|{}{tnjY~|{{z{|}~~~}}|zyxxy{}~}|||}}{xuqonnorstuwwxy{zxwxz|}~~|{yxxyyz{{||{{}~}}}|}~~|}~~~~}{zxtojilqtwwrllsvzzzyyyyyytkmv||{{zz{}~}|zxwwwvutssttuvwz}}|{{{|zvv{ywqqrry~}}ysr|}xz~yqqv}~|~~|~~usqrtugsuw{}~~|~|{}~t~}|{{z{|}~}~{yy{|}~{uy}{{~~yv~}|{z}~~~~}}}}~{zzzzzzzz{{|}{{xsnmu|{{}~ywv~xpowrqw~{mdfx~}}~~zvtvxsxzyiZOTrwk{zz|z{}|||~zzz}}|wyxobZYbinpqsutuyy{|}}}|~xsrtvy{~~~|~yxx|~~{xvwy{{|}~}|{}|yyzzzzxvtrsx}~|tsuvuux|xtw{{{|{zyy{{zywvwyy{|}yy||yyz}~}}}}~~}|}}zz{}zxywtttuvvtssuvwx{xx|}vwyyyz|}~~~~|zy|z|~~zyyyxx{}}}||zwuuwwx|~~~~}zxz{xyxwutrqqpqrssswzzzxwuv{{yutvwwvwyz|z{yugeuwtuy{yqjcgpuz||wory{||{yvxxxvutuyzxx}|ywx|}yuxse`f]~|||{{||}~~~~||zz{|~~}}~}}~|zxvsqpqrtutttuvvvvvwy{||}}}}{zxz{{||||}~}|}{zz}~~|{yuoihkqvzztpmpqtvy|}}{vvvqs{~~~}|{|}{vrruvvvutsrstuvwxz|~~}{zwvyzxwxxwuu{yzyyzyqsopw~~|{z~~uu~zz|~|xroqpjmcqxz|}|~~}r~}|{z{|}~}~{yx{||~|yy}{y}~|ywz~~~~}}}}}~{zzzyzzyxxx{{wtqrx~}vrt|xuu{wsw}~rbc|}|{zzzursuif}p_cvym|yww|}|}|~{x~~}yxxyrfZY`glnoqrqry|~~~}}~~xuvwz|~~}z}{wvy|~|yxy{}}~}~~{yzzyyyxwurqu}|xwvuuwyzwtx{{y{{zzz{{{zz{}}}{{}~~}zxz{zzz{{{{{|||{z||}}|{||~zvtsssrrrsuvvx{{|}~z|{zyy{{}}zwvzz|~}|yyzyxxz|}}}~|zyz{zzyy{}|z{slmqruxutusponmknruwwwuuxwtoknstuwxz|z||{rp||ww{zwspberuyxxrjlsy|}}{yyyxvutstvxz}}{xw|}wrpf[\ei~}}|||}}~~~}}||}~~~~~}}|zyxxywttsqpqrttvwyy{~}||||||}~~}~zxz~~}|{xsmjkqwzzvqnmmpsw{}}|wtvy{|~}|||wompsvvutsssstuvvwxz|}}{zywtruxxwwxxy|vuwyw~{qr|usty~xtnlmi]hou}~~vpzv~~~~|{{{{|}~~|yy{|}}~||~}}{v~|yy{~}}}}}}}}~{zzyyyyzyyzy}{yxy{~~vrqyz{|zux{}xgf}|zxwvqlqsc_|}rjiv{|t}vyvtty}}~|uz}{z||}wpkgghjklorrt{~~{xxy{|~~|y|}xxzz}}yxz}}~~~}|yyz{zzz{{yusw{~~}|{xxxzzwvvxxwvxyzz{|}}||~z{yyz~zuvy||{yxxyz{{zyyz|~~~{y~~{vutttrqqqrtuvx{|}||{~{yyyyz|~}|ywuy{}}}{yy{zyyz{|}~~~||{{|}|xy~|z{|ytkefjlrxwwyvqomljjnu{z{ywutrojghjouxzzyz|~~~vqqrroqxljnprquskjqyzz{{{yxvtuuuux||||{zz||xurf`ipr~~}}}}}}~~~~~~|}~~~~}}~}yxwussttsttuux}}||||~~~}|{|~~~~}}zuqpswzxuqljkptwvx|~zxy||z}~|yyyytnmqtvvutstttttuuuvxy{{zyxxxsswwvyz|~psy}wy{sooqx~unlmqo^p~}|j~hwy}~~{z{|{z}{{|}}}~||kq{{~~}}}}}}}}|zzzyyy{|}}zz{zz|~}}|vmnsxtyyywujn~|zyxvsotrcdtzylikyzzwwvsrvz|~|vz~~|}~~}zvoifdeiovx}~{yzz|}|yz~~z~~}zy{~~~~~}|{{{zz{||}|yxz{|}}||{zy|}zwvwxuurty{{}}~}}}zywvw{ytrw|~|wwwxyz{zxwy{~~|w|xrruvvutsrpprstvz|ywuvywxxyvwx}~}zvxwuy}~}|zxxyxxyz{|}}~~}}||}{{}{trtxxwrmjjpvzyxyxuspqsprx{z}{yvvusqlgdgmqz|zzy{zpkmmlhgmppmjiny|tosz}}|||{vrpsxz{|}}yz{}{zwxxwqmsyy~}~}}}}}}}~~}}}|}~}}~}}}~}|{yxxvutssstvy|~~|{{|}~~~~}|}~~~~}{wrrswxvsojlosvzvt|}|}~~~}{xvxxuqoqsvwtrrtuutssststwyzyxwxzwtvvuy|}zu{{prtuy|srtotsszyxvy{}}zz{{zz}}{|}}~~|{|}f_|xx~~~~~~~~~~}}}|zzzyyy{~|{yz{|}}{{wz|{h\fomi|{vsskr{zyxvwy}vhbi}tgksx|~zxyywuuvy{~{xz~~~~~~wpid[_cmvwv~~|{{{}~}zz}~~}~~|zyz}~~~~~}{|}{yyyzz{||{|{||||{zzz}{wxyzvvpjz|z{|~~{zxz~|zyurtyzsqwxyxxwywx{|{ywwz|}|wwuopvxwvuvtommnpuy|vlptwvxxytst{~}|yttvw{~}|ywwwwvxzz{||}}~}}||~|{}}yqkpuxxvsnkszyxxyzyywxxxy|{{|zyvvvusohefgmy}zz{|}{vqnpokgcfjllkkrz~zwy{~~}}}}vonsx{|}~}zs{|{xussuvuuvx~~~}}}}}}}~~~~~~~}}||}~~~~~~~~~|{{~~}}||ywutsrrrtvxzzyyz|~}}}}|}~{xsqssuusomnruxy{xsvy{~~~}zvtvxxutrsttqoqtwvusrrrqquyzyxvx}~zvtswyz~~~y{}}ys{|v{|||vxzzz{~||{ywy}~||}}~}xyy~pWnrr~~~~~~~~~~}}}}zzzyyy{~{zz|}{zxvrtxrsvqqsbWpqpsmu~{yxwx{~zoagyq`mwry|{{|{z{{zwvwy{~|{}~{~xpg`c^blspmy}|{|~~|y{~~~~}{zyy{|~~~}{z|}{zxwvuvwz|~~}|{zzzy|{z|~~|{s|~wtx{yspkms{}|yxxzzwuxtrruvwtsvyzzyy{|}{vrqpry{zyxvrlllmpuz}shkrwyyyytsv|vv{}zwvx{~}|yxwvuvwyyz{{||}~}||||||{zvnkotwxzzvryzvuxz||{{}}}}|zz{zyxxyxuppoojix|{{|}{xurrohb__bhnrsx}}|}}~}|vklry}||||}{ywuqomopqqqt~~}~~|||||}}~~~~~~~}}||}}|||}}~~|z{~~}}{ywusrqqqrtuuvxyz|~}}{yzzyyxxz||{|~~}zvspppqrqnlqxz{zxtruwz}~}~|xtuwzxvssuvtqrtvvutsrqppty{zyxy{||{xwwvw}~{z|uy|~zz|}zz{~{y|~~}{|~~{rqlv~}jy~~ss~~~~~~~~~~~}}}~z{{yyyz}|{{}~zvtvspokjjp}o\xzlqwnt~}{xxxz}}tnryq`q~tn{zzz|zyz{}zwvx|~}{|z|yskeh^_bhkpx~}ywy{|{z{}~{yz~}}~{xxxxz~}||||zyyyyyxvtqopv|~~|yyyxy||{{{}{vvywsplmpxzxww{{z{zztmpuxwvsstwz}~~|{zywtssuy|}|ztnloqrtw}xmntxzzyyuuwypu}~|zz{|}~}}{yxwvvvvwxyzz{{|||{{{{{{{yvrqtwuttvuv}~{z{|}|{{{|~~zyzzyxxyzyvsvwytkp}{yy|~~|ywuri`^\^hpwz|}~~|}~~}}|}vmmsz|zy{{|~}zxuplghkknps~}}~~}|z{||}~~}}}~~}{zzzzz{}~}{{~~}|}||zwttttsrrrrsuvwy|~~|xtrqqrqrtx{{{|~~~|{xutqqrrollry{|zwvx{{|~~~}|}|wsuzxvsqtvussststtuvspotz|{zyyyzz{zyyurv{wz|~{y{~}~rku~~|{|~~}ohdk~~~}{~~~~w{~~}}}}~~~~~~||}~~|zzywwxz~}||~}ysvvplkgffiu~tl}vmrxqt~}zxxz|~~~zz~}um|k|yzz{yxyz|~{xz||{{|~~yvx~z||xtqeZTW`ozuv~~vurqsuwyxy|}~|{x{~}~{wvvxz~~|zyzzzxusssvwxvrnns{~}{||zwuv{{|{}}}~|{{zyyxxyyxsopx|}}~{vpry}z{yutwz~|zxwvvuuvy}}ysopsvvwy}srw{}}}zvuxwsuy|}~}|||||{zyxwwwvtuvxyzz{{{{{||{z{{yvtuxzuspsrjq{~}}}|{zyxyyyyzzyxxzzywvwy|znjxwwz|}~~|zxtmdb``jrx{}~}{{}}~|zzz{xrpsy{wxy~qqv|uokdgkhlpr~~~}|{{|}~~~~|{zyxwwyz}~}}~~~~~~}||{{|{ywvwyywurqqrsstvy|~}tponopqsuxz{|}~~}|zwuuqoptvwwy|||zxxy{{|}}|{{}|yyzwutqqssrrqooquxywrptz||{zyyzz{zyywsu~~~~||~}|yz|wnt~}}}||~wmsqz~{ux~v~~~~~~~~~~~~}|}~~~{zyxvvvx|}||~}zsxwhigg_dty~ur{zyuuryuu~}|yxx|~~~}|~{}~{xz|{xyz{{|~~yxxz}~|rimx~}~}}{|{bMSixynmw~somnqtuwvxz||{yxz}~~~~~|zw~zvvwyz|}|zxwxyxtpnnoswzzwrru{~~~}~|trw|}}~~{z{}~}|}}}}|{{{}~xno}}}{|wtux{zyyyyz|~}~|yxwwwwxz}~xrstvvutvx|~zvuy}~xsrwxwxxz}~}zwyzzzzyxxxvsoswzyzyyyy{|}|{{{ywvwyzvtsyrmij}{|||{zzxwvwyzzywuu{}xwxzzzzvtxxy{}||}}{xvqlmjintz|~~|zz|}}yvx|}zursx{uwywrpw}{vrnjormprq~~}}}~~}}~~|{ywuuuvwz|~~}}}}||||{{zxwwz{{ywtttttsrsvy|~ysqqqsv{}}||}~}|zwtsporw|~~}}{zyzzzz{|zyz}~~}xvvvutrqpomlpvz{yutvy{|||}}}|{zywww|}{yyu}|yz{||~{{~||~~|}~}y~}{y|~~|rpx}~~~~~~~~~~~~}}}~~~}|ywuuuvz|}{z{}}zwxzmjcb\azstusywutywyvw~~|yxy}|xz}|yz{|~}xvwy{zyjfmw~~~~~cSl|yoow{njmqsuvuwy{{zyy{}~~~~~~~~~}xuox}{xvwwy|{{{{yxwwxvrnlmpuy}~|yxz{~}xtuz~~~zy{}~}||}}~~}||}{su}}{zxwxyyywx{||}~|xyzzzzz|~tnrwyxustvyzywvwvx~|smnuvuvxz}|zy{~}|{zzywtpswzxxxxwxz{}}||{yxwxxxvtswuttiptxyyyyywvuwyzzxvpikquxyyzzyvvxyzz{yy{{ywtplloqtttsrsvxy|||xuz{uqrv{xxyyuty||xutsvxvwws~}}}~}{ywutrrsuwz|~~}||{{||{{{xxxz{{zyxxwvvtttvxz{xuuuuvwx{~~}{z|~~|{|{xxvvx|||}~~~}{yyxwvvxyyxz|}{wwvtrpoonnqvz|{ywxy{||~~|{yxvvx{}yv~u{{oq{~}{yz{zz~}wov~||}}~}|zw~{tz~}|idk|srz~~~~~~}}}~}~~|ywtttvxyxxwy{}}{x}xjYV\\mpvtsxvvv~|xux}zyz~|y{~}z|}~~}{xyzvzzwuqr|~~{z{~~uu|vvww{}|plopqrstwzzyyyy{||||}~~~~~}{{{}xpntyz{|{yyyxwwwwvrnnpsx|~}}}}}~{vtx{~~~~}~~}||}~}}||}~~|xz}{{{xxxyyxwxz{||}~}wwy{|||||~}vqvy{yuqprwxxxwwrmtwrmlrqoqwz}|{~}||||zxvwxyzyyxwxyz|}}||zyxxwvurilpv|sjquwxwwwuttuyzzyxwnddnrtwwxurruxz{yusuvuqrtplpvywvuttuzz{||xuxyywqoomsxvwxyy{||zyxy{{||zv~~~~~~~}|yxvtrppprtvx{}~~}||||}}~}||||{zzzzzyyyxyy{z|}zuuwwx{|~~yvuv|~{zz{|}}}|}~~}}~}}zwwwvusvyyyy{|}~~zyxusqrrroqwz||zyyz{||}~~}{yvssv|~}w{|n}yx}~||ywx{zz~ztps}~|}~}~~~yz~~}vnkvzry~}~vlpwpqz}}}~}~}zxutsuuvsqqwy}w~~nVJ]kclqsswyyy~ztv|~zy{~~~~~{|~~{}~~|zz{|{{{~~zyz||qq|~}z{{~|y{~zvvuslht~{rlmlmoprxyywwxxyz{||~~~~~~uqrwz|{yxwvwwwxwwwwsrtx{~~~}~~~~{wvy}~~~~~}}}~}||||}~}~~||~|{z{}zwtsttvyyyyyyy|yux{}}}}}}}}zy{{}{umimswwxxxwrsvtqqrqopuy|~|{}~~}}}}|{zyyyzz{zxwxy{}}}|{zzzxxxtfiqv|wsuvwwwwvttv{{yyxsmg_eloqtywsnioxzslghlomjtsllpwyxwqqx|~|||zxvqoqplgaittxyzzz{{{{{}~~~~|x~~~~~~~~~~~|{yxurpooqrsuvxz}~}||}}~~~~}}}{yyyzzyyzz|{||}~{wwvvy}}zwvx|{yyxz}~~||~}}|}|yvvvtrquyzyzz{{{~~~}{zzwusuvxpqxz{{{zzzz{|}~~~}{yvrqs}~|sq~~~|z~{x}{yvwzzy|~|uw~~}}z|}~}urz~}zsmouzxz|~~~|{{xv}}|}}|~~}}zzxtruuuqmmrv}wwyzr]hkllpttvzzy}zux{z|uy}{}~~~~}|}}}}}zxxz{{{}~zy}}tsz|{{{|~~{{|ztopphdj~ljhjmnlozywvvwxyzz{|~~~~{yz}~wutttvwyvuz{xwwy|}~~~~~~~}~~~~{wuy|}~~~~~~~}}~~}{||||}{}}||{{|~wrmnqsvxwwuuttuuwx{}~~~~}}}|}|}}|vlffltuwxxyutvvtstrpruy|~|{{{|~~~~~~~|{yxyy{|{yxxz|}~~}|{zzzzzwqqsw||xtuvwxwwwwuv{zuxxsnjffimsuzwtm`Ycpogcbinptttnjmuywwsqw{~}|{|zvokrqmlnruu{{{{z{{z{}}z}~~}}}}||}}~~~~~~~}|zvsqqqrsqppqrtwy|~~~~}}}~}}}}}{yyyyyxxyy{|~~~|zwtx~~}zyy{}|yvssxyzx|}{{{|xssrpnpty{||{yxwz{zyyz|}|ywvxz{vvyz{{zyyz{{{||}}|zywtpo}~xy{|{yxzs}}}~|}~~yot}xuvzyyz|}~~}|}wsy~uov~vttzy{{q~}}||{z{}~|z}|}{utuuusrrpt~~nqv}oonnoquvtwwwyy{|{{ytaWj}{}|~~~}|}}zzz|{yxy{~~|yyywvxyz{||~~}}|xsqokjrseiloopos{wuuwwxyyz{|}~~}~}||~{vuttvxyqpz}zzzyyyzz|}~~~~~}}}~|xtwxz{|||}}~~}~|xx{||||{}~~}}}}}~xmknsvwwvttttssuy{}~~~~~~~~zsljlqtvxz|zyxxxwwwvvx{||{{zyz}}}}~~}zyvuwy{|}~~~}}~~}||||||{zzzzzxvuuvyzyxxunkorrw{voqojhowz{xtpjYVgmjecirvutwwursvstutuwtty|~|vtuxwuvz|yy~|{zzyxy|}}}~~}|||{{{{|}~~~}}||}~~~}{xvtttvvutrqonprx}~}}}|{{{||{zzywxxwwwxxyzzzzzxvuy}~}{zyy|}~}{{{vtvyy{~~}{zz{|xsrrqpqty|}{xtsv|yxwwz{|{{yyyyyxxyzz{zyy{||{{{{|{zyxvsp}}}utstuw~~~~{{~{uqxyxtsvzxwy|~}{{|~ykwus{~|}|wp|}xxh{~~~~~||{{ywxz~}||~zuwyyusvxxz}|odox{sqpppqvxvvvwxz}|z||skb[\t~}z|~~|~~zxxz}|zxy{~}{|~}ywuvwwvwy{~}|zvqjfjsviuy{|xww{{usuxxyyyyz{{{{{}~}|~zvwwwxz{vu}~}}||zyyyz|}~~~~}}~~~{vsqsuvyz{|~~|tsx{{{{|{||{{}~~}|tqquxyyxyz|}|yxxz|}}}}}~~~~~}ztqqrtvxy{ywwxyxxxxy{}|zzzyxy|~|{{|}|zxuuwyz|~}|}~}{{{{zz{{{zywutstvyyyzvlgmvz}|zuxwojpwyyxutuh]jsqjedffekx{~|uqsrsvzrcfsw{zswywttwz|{|~||{{yxy|~}~~~~}|{{zzzyz{|}~}||}~~~~~|yxwvwxzzzxvtsssw|~~}}}|{zxzzz||zwxxxyyyz{{zyyyxxy{{|~~}{ywyzzzy}~~|ww||uwzzz{}ytuvuttwz|~|xtposzyyyyzyyyyyzzzz{zyyyzyxy||}|{{xwx{{{{zx{y{wqnpw}}~~}{{~|}ytrqrsuywy{}~}{zz|~~sru|}||}xs}{}p~}~~~~~~|{zzxtqt{{{x{~{trxz{vw{}|zxqlizztssrrrsvvuvz|zz}~~~}y{vbX_egp~~|}~}~~{y{|~~}zz|}~}}}{wvwwx{||}}zwtkgdixwk~|{|{utuwxxxxyzzyyyyyzxy|}}}wwz||}~~~~~~}|{{{z{|}~~~}||}~}zwwxyyyz|~~~yrwz{zzz{{||{}~~}{yxutwz{zzxxz}}|{{||||||||||}~~}{xvtstvxxywwvwxyxxxy{||{zzyxwz}}{zz{||zyvvwyz|~~|{{}}zwwxxxzz{zxwusrrsuwz{zrnu|}|||z{{vsvwxwyzywrmpwwqmie`^jy|~tmstuz}rhortwwwyywtuy{}||}}|||{yyz{}~|{~}|{{zyyxxxy{}~~}{{|}~~~~}|zyxxxxz|}}|{{zzz|}~~~}}||||{yyxy|||zyxxxz||}||zyyxy|zx{~~|ywvxzxuv}}{}sptwy{||yuwwusvz||}wrommquyxvvvstwyzyyyz{zyxxz{yx|~~}{urv|}|~}||~|yy|qmu~|vux~~{~|zz|~ysqrstut{~}|zyy~zux{||zxvw}~~~~rrp~~~~~~}{||{silssqmqvuux{}zrurwvwz~|{zsq~|ursvvtpppps{~tx~}~|~}yyyfMFXmbo}|~}}}}|}}yvvvz~z{~zwtmqtty~~}}{ywvwvvvvvvwxzzyxxyyxxvx{~zy||z|~~}~|{yyzzyyz{||}~}|{{|~{yyyxxyz|}~~~~{vz}{zyz||}~~~|zwuuuy{zz{wpmotz~}|||||{zzzz{}~}{yyxusuwxxxwwuvxyxxxxyz{{{{zxvw|}{zz{|}|zxxyz|}~~}|{|}~zvtvxy{||zwutsrqqruxxwtsuxz{}}{{{zyyxy{{xwvtuwywtrpngcp{{}ypkrxxz}|xvuvtstuxz{{||{z{{|||}{yyyzzz|~{yy~}|{{zyyxwvwx{}~~~|{xuux{~~}|zywwvuvxz{|}}}}|||}}}}~}|{{}}}|zxyy{|}}}xwwy{}~~|{{||~wsy}~}zwutx}yst}~zmjrvy|~|yvwvssy}}zztponorvxwtqqqrtxxyyxxxxxxwyxwx}~~~|xtw{~~~xtx|ywz}~}zrps|}w~|zyy~zwsqrsr|~~~{{}~ztwzysmqu|||~}~uuu}}}||}|tegnopnljihmru}{u~zuw~{|~}vaw~~}xutwwunkkmgozxkp}zz}}|{yyz~thVBWcK[t~yzx|{yxzz|~zwvw{yqr|{yvuz|}~}{z{zywwyxvutuuvwy{yyxyzy{|{|}|xwy}~{|~{}}{zzzywwzywwyy{{{}~}zy{}ywwxxwvy{|}}}}~~z}}{zyz{}~}zxutvwxxwxztkefiq}~~}|{zyxxwy|{zxxwtstwwwxxwvwz{zyxxyz{{{|{xvz}{{|}}}|{{|}}~}|{|}~~yvwyz|~}zusstsrrrstrqqqswy{||{{zyxwvwxxutuwz{zwtrquqit|{wrnntyywuvrmmssrnrw}~~~~}||}}}}{xxwwvuwzxwv}}|{zzyxwuuvx{|~~~~|zwurprw|~~}{yxvusqqruwx{}~~}||||||||{zyzz}~{yywwx{}~zvuuwz{{{z|}~}utx{|zxvtuz|tt|~~~~~{srtuw{~|wuuroow||xtonqprtwwvsopsttvwxxxvuvwxxxxvw}~~}zxxz}~}~{x~~}|y{ztt{|~}zxwx~}smqqu~}||}}}~~~~|y|||}~|vxzumgny|{}~{u{}}}}}~}vheimqusrhefku|xno}~}{|xeey~|}|xvwvsnjjkaixxdeprksyz|{vxz{y|kDSSBUnzwy~|zw~{vrsuz||~~~|ywwy}~vjirx}~}zyz{z||zxzzyxy{zwtttuvwxyyyyz|}~~}}|yyz{|}}}|}}zyxwwxyzzzzywwyyyyz|~xuz}wwy|{zx{~~}}}}||{yz|{zzzz{|~|xtrtxzywuwzukfffn~~|{zyxxwvx}}{zyyxursuvvxxxxz{|{yyyzz{{{||yz~~}}}}}}~}}}~~}||}~{yxxxy{{ytrtvvutttrnmllouwwuuyzyxvvwwxvqot{~}{urpmkgbpywroqsuxyxusnhlutrnqv}~~~}|}}}~}zxwvvutuwutu~~}|{|zywutuvy{}}~~}{zwtroorv|~}|{ywtsqomnoqrvz}~||{{zzzz}|{yxy||{zzywvvxzzyvtuttvwxz{}{wyzyyxxvwz~}yx}}||}}}ytvz|yusspjjtyzvpkmqrtvxwsooqtutuuvvusruxyyyyww}~~~~|zxy{}|y}|~~}}}|zxwtv~vnrp|}|{zz{|}~}{zvsryzz{{}|{|wqnmv|~}rz~~~~~~~}}}~~}}zkbeinuy}tmimy}sq}{st}z|}zdt}}vonmmmnmkpyxiikd_hljrzxyyxz~wSIKKfuxty}}xx{~yssswwx||~~~||zyy}~{jfksy{{|}|{zyy|~|x{|{{}}yutuxywxwxyz|}~~~|{}|{z{{{{{}}}~~}{ywvvwxxyz{{yywwwwwy~vuy}zz}~}{}~}|{yyxyz{{{{{{|}}xtssw{||zyy{wqnljq}|{zyxxxxx{~}|zzzzxurrstvxxyz{||{{zyzz{{|}}||}|}|}~}||~~~}}}~}|zxywxyzyvtw{{zzyvqnmkiinrspowzxvuuvwwsmkry{zxtssqmilx{xtrtuuvz{{ztptupnpsw{}~}|{|}}}|zxxxwxwutssu~}||{yvvvwx{}}}}|{zwvtqoopvz}~~~~~}|{ywtrpommmnosvz|{{||zyxx{{{xxyzz{|zzzwtrruvvuussuuvwyyzz{zwvwxxz|~~}|z}|{{{~{styzxtrsqmmsyyvpknrsuwxwrorstuutssssrrvz{{{zvx~~}|zxxxy{}u~~}~~}}}}|{zyvurx~|{pow~~{zzyyz|~}|{xronyzyz|}}~uoms{~~~}~~~~~~~~}}~}}}||mceint|}uppywpo{zwy|{|}irzj^`hjnprstoljkjddgc_]nyzyxz}xhFFZwrkrx}~~~}}yx|zvuuvvw{{|~~}}}zz|~ykckrxrlov|~{{|~z||}}zutwz{ywvwy{|~~}||||{{{{zz{|}|zyxxxxyz||zxz{zzyxvttux~zvy}{|~|~}}|||}}}|{{{|~}xsvz|~~~{z{|xtqpkszyyyxxwxxy{~}zzyyzwtrqrtvwyzz{{{|{zyyzz{||}|yy{{|}~}{|~~~~~}~~}}{yyzzyyyxwz{{zzzvqnpngeipwtttvvtstttsqnmqvvuux{zxwuruwy{vqnmnrsrvzxvuqrsuxz|~}}{|}}||{yz|{zxusssu~~~~~}|{zzz{|}~~~}{zyxvtrponptw{}~}}|||zxvsrqpoonmopuxy|}}{ywvwwxxxxxyyyyz||yutttuwyyvtutssstwyxwwxz}~}|{|}}|zyxz}}tpvyvqqsuvvwyywusttstvwxtrtuuuutrppqtvz}~}}{wx~}v{{zyvuz|}u}{|}~|{{||{zxvrqp}~~ts{}|{z{{yxx{~}{zz{{xrljvxyz}snku~|}~~z{~~~~~~~~~~~}}||}ogllnu}}yxysnt{{{{}||~qunRNWafkppnjddhjlmnmhaYd{~}yyywmNRqubclv|~~~}~|y{~}}~|{|||{zyvy}||~~~~~{z|~}k`jw|rc]bjrwz|~}|~}xwz~~|xuwy|}~}|{{{zzzxxyz{ywvuvx{~}yxyyz{ytrruy}}|||}~~~~}zyz{|~}z}~}}|{ywwwrw{xxxyyywwwy|~}|yxxyywusrstuwxyyzz{|||zzz{{|||{ywxz|}}}||~~~~}}||||~}zyxxyzzyxxxuqonhcbdmwywonrrqpoprsqruwxz}~|zwutpqvyyrnmmnnpsx}{yuwzz{{|}~~~}~|}||{zyy{~~|ywuuvw}{{{|~~~~}~~~~~}|{zyxvtqnmpty|||||||{zxvuttrqpnoqvz{}~}{yvttsttvwxyzyxy{~}zwvvvxz|zxxwutsqqrsuuwz~|{|}|zyxwx{~~}}xswzvqqtuuwzzxwwwvuttuxzxvvutuutsqprw|~~~}yx~~{sx|~}wrw}z|y{x{}|zzzz{zywtrpr}}x{~~}{|}|{zwz|z{}~zyz{{xqlkuwxz}upkv|~{z|}}x{~~~~~~~~}|{{|xsuqrw}~{w}tuuntxxxz~~wxr]UY^^dgca\W\fppooojdfn}}zvnkdg~lT[kvzzzz{}~}yvy||||{yy{|}zwsmox~~~||yxzn`jvxpbTXdoux{~}}~~zz}~{wuwy}~~}||{zyxxxwvuuutssrty~~zvuutuxzwtsvz~~{|}}|~~~}}~~yuvxzz|~}|~}|||{zyxzw{|}{yyzzzywuvwz|}|{zyzzzywustuvwwxxyy{|}}{zz|||{zzzyyz{{{~}~~~}||}}}}}|{zyxxxyxwutttuuphehhpy}ujflqpkjkosssvurrx{zuqqrsw{|wrpqttsv|~}{zz{ytqsxz}}~}}||{zxusuy}|zyyyyyy~}zyxy{}~}}}|{ywtrqrtwyz{{z{{||{yzyxxwusrtv{~}}{xusqqrsuvy{{{z{|zyzxxyz{{||{ywtsstwxz|}|||{yxxwwy}~|zz{z{{wspqssw{{xwwvuuttuxzywwupqstuttvz~~zy|{yy~~{x}z~z{z}{}~~~{yxxyyyxvtrpu}yy}~|{|~~~}zx{vz|||{ytppxxyz|}ytqy|{{|}~}z}}}}}~~~~}|{{|}|{vutxy~|x{~w~sbntqr{~||~xc[\SZ\[ZUNWtqqlgfq}}yrprowgU]pxxsppptztsvwwvvvz|{{zwrkddr}}~zxxxz}rcglql]Xbsywy{}~~~~}||}~||}~~{vuxy}~~}||{zyxwxxusstutrqot}~|yuttrmlpvyxvx{|yxz{{|~}|||||{{z{~~}wsvyyxyz{{{~||{|}}|zxxx{{|z{zzyxvsstuwyyyyyz{{{zyxwwvwvwwwxxz{|}{{{|{{zz{{|}}||{}~~~~~~~}}||}~~}|{yxwwwvwvustuvxywqqxux{~uibhpogdejnrsrpnmmsvrppswy|}ytruyvuy}}yxz~vjbdnw||}|{{{zyvqorvyyy{||{{z~~{xwxy|~}}}}}{xvutttvwyyyyyz}}{z||{zywvuuvwz||{{||yvsrrqrsstw|~~}}~}|z{{{|}}{zywvx{|}~~}||{yxyxvx|~}|{{|}}|zxuuvuw{zwwvuuutuvwwwwxsklpqrtz|}~~~}{zyy}~{}~~~}zz{~~|zxwwwxxwusolu~vv~{yy{}{xvx~|zyyzyywv~|zx|~}|zzz|||}}}}~~~~}|{{|~{wnqs|~z{zz~}vxqfo}~}}~p^RNWU[^YOV}zvqmmv{~~{xvrpgcet{yljjihr}xttx|ysrw{wttrvqjhap|zzu~|qw{|}wjfl|qbbhuswy{||}~~}~~|{{}}|||}~|wvxz~~}||{zzyyz|xwzwxxuxpp}{vvvutrpnou{}{zzwuwyyz{~~zxvvwxwxy{~~}xvy{ywwxz|~{yzz{|}~}{yxyyy|~~|zyxurqttuuutuwxz{{{|~|{zxvvwwxxwxy{}}}}|{zzz|~~}}|}~}|{{{}~~}|{{{|}}|zwusssstutttvx{u|{|{~|{{{umfjqpihkrttqrrrrpszuoqstvyz{zz{yssy}~zxx}~wk`_kw{}}zzzzyzxsqsuvxz|}~~|{~~}zyz{}~}}}}~}|{yyxwvvvwxxvuy|}~~}{zyyxwutstsrrsstttttttrqonoruwy{|}}~~~}}}|}~~|||{zyz{~~}||{zz{zyz|}}}|}~~~~|{zxvuutssssvwvvwxwvvwvrrrlgkw|}}}}}}{zwuwx|zy~~|{{}~|{~z|zz{zxwvvvwwvuqppy}~~~~uv}wvvz}u|}~|{zywt~~~{wttw|{yz~~~~~~~}|{{|{sksxz~~{||}xmw}{|}{iUW\Yag^SY~~||{xsqy}}zwogdghswuggig`Ri~~}~zttywmhlnqnlngqxuqht{tx|}}|{rhjywrokpny{||||}~~}|yz|~~~||||||yxy{~}||{{{{{{|~{y{{{{{~zyzuxvsqtwwtx~~}zuvz{zz{|~zvtrsuwwuy}~~|xwz{xwwxz||||zyz{||}}|zyy{zyy|}|zyxuqqttutspqsvyyz|~|xvuvxxxwwxz|}~~}|zyz{}~~~}}}|||{{{~}|{zz{||{zxuspooopsuusvxocluyy~{{zyxtprtsnmpwwwvvtqomlrrpuvqsxzxwwzyzzz}}zxx}~yqhaiwz||yxxxyzzxuutuwz}~~}{{~~~}}~~}}}~|{ywutuvy|xtsvy{|{zyyyyyxvtsrqpqpqssuwxxvurpoooqrtwz{|}}}}}}}}}}}||}|zwx|~}|||||~~|{|}}}~~|xsrpooprstwwvwzzwuuuvwxwneiw}}{{{}~~}{xvtomyxv||}~~~~~}}~{}|yyywuuuuvuusqmv|wvx|y{{tsux||yuvt|zz{{x}{vppv{vu{~~~~~~~~~~}|}}}}{yptxz~~||}{|}{y|}yjb`\hldZ]{upx~|zyvkbcllpsocfihdWj}|ywwna^jnponsmv{uogenz{||{{}ximnqqeg}~}}}}}}~~{yz|~}}{zyyyyz|~~|{{z{||}}}}{yyvqpv}~~zxzxpnsyzz{~~|yuw{{{|{||||{uqqsuwyywx{|||zxyyyyzz|~}wvxx{}|{{|{yy{yyzzyyyywttuvuttqqqswxy{~{wuuvwxxwwwyz|~~~|{zz{}~~}}}}|||{{}~~}{yyz{||{yxwwusqqqvxvoqukZXivy|zyyyxxxvtqlkktvz}yrnknosuvurpnrutojgdm{z{{zz|}ywtkou{{|ywwxxz{zwurqv{}}|{zy~~~~~~~}~~~~~}{ywtrrstw|{wsrtuwxzyzzzzzzyyxwvwwvwxxyyzz{ywvsrrstuwxzz{{|||||{zzz|||{zz}~}{{|}~|{{|}}~|uonnnoqtutuuuw|}yvtrrtuywor{|{xwz}~~|zwtslh{zvz~ytx}~|}}yx{yxwutttttsrqq{{{{uqsy~wqpsw{~~~|{|{xvz||w}~{yz}~||yonxyxv}~~~~~~~~~~}|}}}|||zyxtuw~~~}|||}}}|{{{niafmkdenmnv|}{~~|z|{riekqkgnpgkkhkz~~}|{uh[Znvtrqtv}yvr]cz{{{yz|xhYThros~~}}}~~}{{|~~|yxyzz|}~~~|zyyz{|}~~~~{wtngfnw{{zz{{xqotxz|~}|xwz||~|vstx{}xsrrtwxx|zy||}~}|{zy{{|~~}wvxyz{ywyzzyz~}~~zyxy{|ywwvutsrrrsuwxz}~zusuwwxxyyyyz|}~}|{z{{|}}}}}||||||}~~~zxwy{{{{yyyxyzzxv{zvklsuhXcz~|{{yxxyxvqkffhtw|xoloqnmswtprmkpplfdgjy{{zy{|~{vw|xxx{||ywwxxz{{yumjryxwxxxx~}}||~~~~~~~~~}}|{ywutrqqrtwyyxxwwxyz{z{zzz{{{zzzzzyxyyyz{|{{zyxwvuuuuvvwwy{}~~|{yyy|||{{|}}{{{}~~~|{{|}}~}wrooprtvutttssw|{wtppqrx{yx{zxvvy|~}|zwtsqx}{wy|{zz~}}{}|{ut{yxvtsssrrqqpsxtx{{upsy~ytoosw{|}|zyzvrt{}~wy{~zxz}{~qpxyyyx~~~~~~~~~}}}}}}|{skrtz~}||zzz|}}~}||~}|}|wdfnqqqpmhn{~~~~{{|riiqtl_kpoonin~z{~zth\^rytqqtzzxr`fww||wy{zk[_ksw|~~}}}}~~}|}~~|zyyz|~~|zyxz{|}~{wqliiox|{z|~}xsruy{}~~}{xvx}~}}{smqutwxvxyy{yz~{z{{}~~}|zxzz|{zzzyyzzyvuwxyxz~{~~}z{}~zwutttsrsrstuwy{}~ytrtwvwyzzyyz{}}}||{{{{|}}}||||||||}~}~}xuwyz{{zzzxwwsptxz|ohlr|zko||||zwvxxuphfgpyy}ypnrwvttsnhhgdegmqsruvyyxwy{|zwy{|yyz{{{yxxyz||{vmhkommpsxy~~~~~~~}|{z{}~}}}|}}~}}|{zxwsqppprty|}|||}~~}|zyyz{|||}}|{{{zzz{{|}||zwvuuutttttuvwwxxyxzz||{y|~~}|{{|}~~~|{{{}}~~~{tooqvxwvttsrquz|zvrponvxwwwvvuuy}~}{zwuuw~}{{}~}}~~}}zsq}zwutsrrqppoppvv~|xtv|}~~~uolnrwz{||{zvsosy||vtz~}zx{~wsuy}{z|yvy}zyz~~~~~~}}}}}~~|tlqv|{{{vutuuuwxwyyx{~~~~~|kjryz|~uxz~~~|}}~upqwvmggfnsrmr{x~~{wrmggx~uops|~|zsdjx}~z{}xqqstx~~~}~~}}}}~~|||}}{{zz{|}~~{vrmkmsz}|{|~{wuwz|}}}ytsuxxxwz~yrorspt|~~~}~~{zyz|}}}zvvy|xwz{{{zxusruxyy{~zx|~}|zwrpquvsqsuuttvxz|~~ztqtvuvxyz{{{{}}}|||{{{||}||||||{{{}~~}}{{||xsqtxzzzzzzxum]\my|zidoxz{}|}{srwvrmiimsz|}zlgsz|zvokhgec[Tdt{{xrsvvvwwz{{||}|{||}|{yxy{|}}{wsokgdgnx|}|||||}~~~~}|{{z{|~}}||{{{~~}|yurponnptx{|}~~|zxxxy{||}~}|{zyyyz{{|}|zywvvvuutssstssstvy||}|||}~~~~}|{{||}}}|{z{|}}~~~~~~|unmquwwussrrruy{zxwx|yxwuttuwwx{}}|{yxutv}~~~}{x|~~~}|}|v}zvutsrqpponprz}~z}{}~~yplkmsx{}~~yrsvxyyvy~~}}~~|yx}|lacgs~~y}wtzy~~~~~~}}}}}}~{vqrwxu|~yrollnqrpqrqv|}}tfpy~~~zqru|~zyy{}|}~~zywwxwj^myzyz}z{}}}qhfmtu}{uqvx}~}ztjpz}~~zvqv}}|~~~|{|}}~~~~}|||~~}}~}{wspoqv|~}}}{ywwx{}||ztmntvsrrtxyvssuutz}|{{||{~|suy|{{{{||zxtqqv{{zz}|xx{~xtsninx|xsrtsrsuwyz{|}yttutvvvvvxyz|}}|}|{{{{|||||||{{{|}~|ywxyyvsswxxxyyz|{lWYly}{kit}{}~}yqhluvsnjjmpv{yxxolswyyuljnmlj_Tftzzvibgkpuxz|~~~~~}}}~}|zxy{}~~}}{tnheipz~}|zzzzz||||~~~~}|{{|||}}~~~}}|{zzz|~~}|}}~~~~~}{wsqonmmptwz{}~~~}{ywwwxy{{}}}|{zyyyyzzz{{|{{yxxwwvttutttstux{{||~}|~~~}|{{||{{|{{{{||||}~~~~|tnmpuwvsqqrstvxxxxxy|{|ywvvwyyz|~}zyzywwzz|}}x}~~~~~~}|{|~|}zvtsrqqoonnqx~|y~|}umkiltz}~zrswz||{|~}}{vsxseY]r~}~}|rs|~~~~~~}}}}}}|{vtuwuqx|xogfejmlfkosx~{~aKant{~}{{zxvvvx}xsvw{~~}|{{}~{xy|pgt|~||xsx|vkjjv||{zqpqw|xqu{yvv{}~zrlrxwu~~~~|{{{|}~}~}}~|{|}~}|yvtsvz}~|yvttvy{|zzxsmovwxwtrstttvwwz~}}~~|}~~~}z{{xy{{zzz{{{zxvtxzywwwzzx}|srvqjp}|vrqppqrtvxyz}|vttstsrqrtwz|}}}}|{{{{{|||||{{{{|}~}{xtsw{yvtuvvvxy{tccmw}{sry~}~~~xnnpuvtleaaityvsrqsuuwxvmnwuplgerzyxufX[epuwz|}~~~~}}}~}|zyz}}|||ysnnsw}}|zyyxxzzz{}~}{zxvtsuz}}~~}}||{zzzzzyxxxxyz{|{{ywusrqomortwxz{{|{{yxwwwxyz{{||{zyyyyyxxyzzyyyzyxwvuuvwvtstuwxyyz}}|}}~~}|{{{zz{{z{{{zz{|}}||zuqquxywsqrstvvvvwwwxz||||{yyyz{||{xwzzz|z}wz}{|xv}~~~{utuz~~}}}}|{{z|~|z~{yvsrqqponnnqv~~~~~{|zrmkglx}~}{opv}|}zsln{~sTczekw|}~~}}~~}}}}}||{uvuqrpq{xldfgmdeZ]muz}|xe`hrvy|smruxyutty{~ux|}{|{{{zytsvz}~}|zxzyxv{}~||{yusssuxyvmift|}}wmkt}wywtprx{|yupmstsvyqy~|{zyz{}~~}}{z{}}~~{ywwy{~|xusuxz||zywuqv{|~zusrstuvwxyz{||}~}z{|~}ywz|}|zxxxyzzzyz{~xpmoqvuw|~yru{ytx~wrpooopqstvwyxwuststssrsuy{}}}}|{{{{{{{{{{{{zz{}~~}}|ysoqtuvvtttvxz|{qfdpzyyz}}~}~{rqtlkpmhd^htxtpnrtusrvyxz{wpihmtwzysla_jsvxy{}}}}|{{|||{z{{}~}zz|{xttvz}}|{yyxxzz{{}~~~~}|zvronosy|~}}}||{{zywvttuvwvvvwvwwvvusqnnoqsvwyyzzyxxxxxxyyyzzzzyyxxwxyz{{{{{||{ywvxzzyvsttuuvwy{{||}}}~}|{{{{zyxyz{zyyz{|{zyyxwx{}|yusstuvuuuuuvwy{|}||ywwwyzzytuz|}y~}su{z}~~~|yx{}|||{zzyyzz|zxusqqpponnosx}~yx|}|~woljho|~~}~~vw{{us{sx{uyz|{~}~~~}|}}}|{|splfnrnzxlqzrkd\QVmvxz~~}|ztnqswxxte\dnz{spqwwtr~~y~|}{yurmlovz||{zyyzzwxy}~|{zvmjoy|}|ytpbeq~zywsqw}yyqooqty~~zvqllrz{ps~}{zyyz|~|{||{{}~}zzyz|~}|}~|}~}{{zxw{~|yxxvtuvvwyzz{||||}||||}}{{}~~|zxvuwxyyy{sihlpwvx|ytw{}~~xrppopopprtuvwwusstwxwsruz|}}}|||{||||{{{zzzzz{}}}}}{ytooprvwtstx|~~~u_Ueqwy}~~}}~~~~~vvypjosrqnosusqprtvvw|{yz{xrkcbfkwxqpjgkqwxyz{{{{zzz{{{zz{||||{xyz{zwwxz|}~}|{zzz{|||}~~~~~}}}}}}|zwsomlmux}~~~~}}}|{ywvvvvwwwwxxyyzzzxuqonopsuwwwxxxxyyyxxwwwxyxxxxwxxz{|}~~~~|zxwz||{vsstuvvwyyz|~~~~}|{|||{ywwyz{zyzyyxwvxyz{~~zwuuvvvuttttuvxz{zzyvtstuvwwrry|~~~tr}|{~||~}||{zzxwxy}zxurppoonnnpw}~~zwxz|~tljiir~|z{~}|~|z}{z{y~}}~}|}||{{|vqehpjn{xqxynl\VZnw{~}|zxvrmwxzzywh`gqy{usu{xeo~|yu{~{wrnjjnuy|{zyxwxwttvz}|{ytmer{{wrnbdx{|xqpx~~}|zylorrtx}~{vokn{|{}}{zyyz|~}~|yy{~}|{}~}|{{|}~~~}~~|{~{zywutvwwwyz{{{zyz}}{{}}}{yxy|~}||zyvtstvvvw{~piinu~|~|wxw{{uqrrsqpoprstuvtstuxxxuuy||}}||||||||||{{zzzyzz||}|||{vqmmpvwusv{wcZfpvz}}{||~}}~xrqt}snkjqusqtutssssuw|voqxwtne[X[mwqkklknvyxxyyyyxyyzzzzz{zyyzywxzzyxxxz{|~~}}}}~~~~~}~~|{{|}}}|yuqnllqu{~~~~~}}}|{yxxxxxxyzz{{|}}}|zwtrqqstuuuuvwwwyyxwvvuvwwwwwwwwxyy|}}}}~}|{zy{|{vssuwwwxyz{}~~}||}}~~{xwxz{{zzywvvvxz{|}~}{xwvvvutssstuvvxyyxvsqqsuwxwrsy}|{~{z~}~{zz{{}}|{zyxwvw{{xtqpoonnnnpvy|~}~{ywx{|~xojijls||yxy|~~~~~}~}|{{{{}|zlwxiu}|wxy}}m__pz}wtqoiwvwyzyvrpkkpttz~yjmrhqry}}xwussrsvz}}{ywuusqqsw}}{yunlz|qnlfefhwvzwpv}~||{nutruwwz{ysmm|~pfk}{~|zzz|~~}}||zywxz~~||~~}||{|{|}|{}}{ywtrsvxxy{zyxustw{|ywxzzzyww{||zzxwtrqrtsrrv|zqllqy~~~~|{xz}~~ysuvxvuqppqstuuutuvvuux{|{{{{|||||||}}||zxwxy{{{|||{|ztmkotvvvx{~}xqnruvw|}yxy||{ytkfq{xrnkpqnnsvwuttvurrnlputqpmcXR^qtonnnrwwvvvwvvvyz|zxyyzywvvwwyzyxwxyzzz~}}~~}}{z{{{|}|yuqnmotz~~}|{zzzzzzz{{|||}~~}|zwutttutstvvvwxyyxwuutuvwvvvuuvvxxyz|}~}|{xwy|zvtuvwxxxzz{}~~~}|{|}~}|zyz{{{zywvwxyz{{|}}{yxwvvutsrrtuvvvwwvtpnquwyzxqs|~{}}y~~~}~~~}}~~}}~|{zz{yw~}{zzywvuux|}{yurqpooonnpsvy}{}{vpow{}}ulhhjmt{{ywz}~~}~~~}|{{{{~~~}{}~y|rlmz~~|uknliwstwyy{|uecmstz~xkkkikrxyxuwwuvzvv{}}{xwussrpqw}}}ywpq~zj`_YZ^aiqw{}|}~|xtqwvsw|ypmlojgkx}|{{{|}~}}{{zyww{}}}}}}||{z{}|z{~|zywurtwyy{|ywwsprw{zwtrtwz{{{zyyxxwvspoquurqsvvrppuz~}|}~}{|}~|wyz{zwtpoqqstuuuvuttuxyyyz{|||||{{|}~}|zxwwx{zz||{{||unlpstwyz{|~~|yyxzvuuz}ywxzyvuwwqrzzutrromkrvutttvvrnjpusqorrog]Xgxvsqruwwtsvvtrwyz|zxxzyxusuvx{{ywwxyzzy~~~~~}|{zyyy{{}zvromotz~~}|{{{{{{{{||}~~~~}{zxvuutstuuvwyzzzxvuttuvuuttuvwwvvwy{}}|{xwyzywvwwxwxyzz{{}~~~~}{{{}~}||{z{zyxwxz{{{{{|}|zxwvvuusrrtuvvvvuurmlry|~~yqu|y|||}}}~~|{z|}}||tl}}}{zzywuttuwy||yurqpooonnooou|z{vnhgt~}qkhikpuyzyx|{}~|{|~}|{{{|~}~vuw~}|}{vt|ujtklswy}zc_hrrx|vhbpzprtqqow|yy|yxz~~}ywustutrw~}|xx|yl_[VXZ[bny~zx{|tntuoq|~ullosvv{~~~~~~~~~}||}}}}~~|zvwz{~~||~}}}||||}}}{z{}~|zyxxuw{|zzzvuwxwy{|yuqpsxzzzyxwwwxxvsonqwxvuttuuttwx|~~~~}|||}~~}~~~~|xtqppqstuuwwvuuwwwxz|}}}|{{||}~~}zxwxz}|{||{zywtrrsrrwz{{{|}~}{{|}{spoy~~|{zywtsuwwy{|}|{wsqnptwwvuxyvqmqqlknuzxrh\fyzvuvutqlhkrqnqvx{xxy{{zvstvy||xuvxy{{z~~~}|{zyxxy{}|xrnlotz~~~}||{zzzzzzzz{{{|}~~~~~|zxvvuuuuuttvxz||ywutttuutsuwyz{{{||~}|zzzzywvwwwxyzzz{{|}~~}zyz|~~~}zxyyxxxyz||{z{|||{ywvvvvurqtvvuttsrokkt{~xqv~}}~~~~wz}~}}~~~}zxy}pf{~{yyxwussstvy}|yurpoooonnpstx}z{{shgw{ojhjlrw|~~~vvz|svz|{sry~||{{{|~|~~~|{}z{|~|{zzzzuh]hfhowz~skjpsuzxidqusrpjkimrqquuuy~~ywvvy}|ux~~|{~{|rc^USQS^q}}xtv~~~}yy|thkwyzunnr{}z~~{{{|||||||}~~~~}{vvxz|{yz|~~}}}}}}|yz{{||~~}~|zyzyxz|}zxxww{}~~}{vrprvz||{zwxxy{yxvsqrvzyywwwwvvwy{{|}~}}|yz|}~~{wtqpqrtvvxxwvuuuwy{}}|{{{||||}}~|zyz}~}}|{yuqqvzxtsvyyxyz||}zy{|{snoz}}~}|zxvsrqrx}}}~}|xtrquzxxxy|}{wuwpkkqw|zwohowwtuurmif_\hnliijvzx{|zwtstw{|{yvwxz||{~~}~~~~~~~}|{zyxwyy{}yrmmpu{~~}}|zxwvwwwxxxyz{{|}~~~~}{yvvwxxxwusstuxzzxwussstsrrvz|}}{yxvwwxyz{{{||{{{}~~zxwz}~~zvwwwyyyz||{{{|||{ywvvvvurqtvutsrommllv|~~}wrx~|||}~u{~~~~~yz}yvw}~vp|~{yyxwusrrrtw|{yuqponommotxxxy}~z{~sp{~wlhgkov{~}yqszx|~}~~oiw~}||{z|{~|||yz{{}~{zy{{zjZ_eiqwz~|xuvvtwzvuxtqoleb`aehjnqsv|zxxy~yz}}|yzugcYPII`x}{xtv{|||{|}|wwlabmuvtonoxyu{~zxy{{{{{{|}~~~|yuuvwxxusuy}~~~}}}}~~}{{|~~~~~~~~~}~~}{zyyy{||xvxy{~}wsqswy{|}|zwwy{|{yyyxvx|||yxxwwwxyzz{|}}}}yxz}~~~}||}}}}}~~}zvrqrqsw{|{zxvvvx{}~~}{{{||||||~}|{|~~}{xtnnu|zusuxxvvvwy|zxz}}urs{||}}|zxvssrrx}~~~}zwspkmuyxy|}z{{urrx}}{{xwxwsopttkcfc[cnmkhejpv}{sposwz}~}{zzz{|||~}}|}~~~}}}}~~~}||{zxwxxz|zpjknv}~}{zywuuuuuvvvwxy{|}~~~~}}~~~}zxvvwy{|zywvspqsuwvutssssrrqtz}}{ywwwxxyzz{|}}|{xy|~ywvy{}~~|xwvvxyxxz{{{||}}|zxwwvvusstutrqqmienrz~}usx~|{{}~}|~~}}}vy~zvw}~}}}~{yyxwusrqqruz{xtqonnnllpy|vsuyzzzzz~|{~{pkggks{}~skpqst||~}~}uhtwy~~~}}||{z{|}}{|||}~|}|~~tmlhmwypz{}|zwsuz}{wtqlfa]]_dhpsssu||z|~}}|~~}|zxywkfa]TIg~|vsmqzwuxwwy{~}{tneelrxupoquurqty|{wx{||||||}~~~{rqsutsvsmmu|~}}}}~~~}}}}~}~~}|{zz{|{xwy}~{usux{{{{{|zwvxy{zy{|{{|~~~{yyxwxxyyzz{}~~{x{}}}}}{zyy|~}|}~~}{xtsrqu{{{{{zyyy{}~|{{{|||{zxz|}}}}}}zxtolqwwttvyxurqqq}~{~~}xwxzz{|{zxywsuxz|}}}}{xwvtssvxzz|vrrsvy~~}~~{uolntwnglrnnpquxdYcr}|smoux{}~}}||{||||~}||}}~}}}}}}}~~~~}}|{zywwvwyywvuvz}{zxvuttttttttvwyz|}~~~~~}|||}}|zxvvx{~~||zxwtrqsuuwusrrstronqvz~~{ywwxyyxyz|}}|{yssx}~~}{ywwy{|}}~~{yvvwwvuwxz{{||}|{zywvtstvvuspprskfvy}trx}{{|}~z|~}}|}}vy~~{z}}{}}{yxwvusrqqqsw}~{xtponnnlms}uqqvxzyyy}wnighlu}umijkrquzx|~|}}nemjnpqy{{|}~~~}|||{z{~~}||~}}~~}zwtz}wirvvy}~zwsv~|vqpolkljghpyzwwx}~|xz||{yz}{z~}}}|zxvvxqmjgc_m{{vronoruuwvvwy|~|ungiovxuqoqrvx{|~|yuwz|}}}~~~~~{utttttupmpv{||}}~~}}}}}}}~~~~~}~}||}|{xy|~~~|xssvxzyyyz{zxvvx{zz|}}}~|{zyxxxyyyz{|}~}{|~}}}{zywyzyz{|}|{yvuruxyxxxxyzzz{}~~~|{zz{|||{yyz||}}}|}}{yxvqllpsttwywqoopq~~}z}{z{||yvttuvuv{}~~~||}}zyz{~}uq{~zqiecfilps{}|{zxurqsx{wvx|zwrryzcP]u{wsruvwxz{||}}|||{{~}}}}~~~}}}}|||}}~~~~~~}|{ywwvuuw}~~~}{zxvtssssrrrrstvxz{}}}}~|{{{{{{{yxvuwz}~~~}|{zxwxxyywusrtuutqoptz}~~{zyxyyxwwwz||{zwrrv{~}zyyy{|||||}~~~|zxvvwwutuwyz{|||{zywtqqsutrpmnsyws}~|srx}||}{|}}||~~}~}|}~~yy{}~~}||||}}|~}{yxwvutrqpqqty~zwspnmmmmnu}xtvx|{z{|~}qmhgipt{}~xkcclqjjvv}}}}fOUaqvx{{xy}~~~~}||||{z~~|yy{|}~}~~uklkpw}~{xvw}|zuonruvzyvvyzww{{yuuvzzxx~yuwyyzyyxvsvwwumefowtpllorrwvywwvwz~~vqknprwwtrrsy|~zxy|}}~~~~|}ytuuwvppvz{{|}~~}}}~~~~~~~}}}{{z|~~|}~}{xtsttvwwwyzzxwxz{|{|}}}}|{zyxxwxyyz{|}~~}||}~~|{yvvuvvy{|{yxwvvyxwxyxxxyzzz{|||{{zyz|}|{z{{z||}}|zyzzzyvplnsuvy{wqruvv}~zx{}}||}|xuvwvwy{||{zyz}~}}~~wry{kRJJPZ``aiw~|zyxvuronquz|~{uu|yjYbyywwxxustvy{}~~}|zz~~~~~~}}|{{{||~}~~~|{zxwwuux~}{zxvtsrrqqppppqsuwy{|}}}|{zzzyyyywutuwwxz|}}}|{zz{zzxvtssstvutqrv{}~~|||zxyxwuuwzyyxvtstvz|{{{|}}}||||}}}}|zxwxyyvqqtwyyz{|{zzztnoqrpnmjkrx~~}sry~~}~~~wtx{~}~~}~~|zxy|~|{zz{{||~{{|~~|zxwvusrqpppquz}yvronmllmpw}|{{|}|}|}vlkihkqtxx{~zjdqwreo{z~~^Xo}|z{|xy~}}}}}|{{}{x}~~|yy{~~~~~zvrngkw~}{wvvx{yrnrwwvx~~~}ssuxy{wrr|}||~{wwutwwx{{vvwz|tovypjfep{zyw{{zwvx~wsnmoovzywuw||zz~}||}~~~~~~~~~~}||wuvxwtw{}|{|}~}|~~~~~~~}|{zz|~~||~~}yvtssuvwxz|{zy{}}}}}|{{}~~~~~}|{yxwxyyyz{|}{yy{~~}{ywwutvxyzywvvwwzyz{{ywwxxyyz||||{{z{|}}}}|z{|}}|zyz{{{yuqruwx|}|xxyxz~}~yy|}|}~}}}|zz{z{yxvvwz~~ywxraLDCJW][]gt||{{|{zwrledlsy|}}|{{}}uijwxyyyuropsvy|}|{z~}|{zxwwy|~~~~~~~~}{zyyyz{}}|{zyvtrqpoooooopsuvyz|}}|{||{zyyxvtsuvvvxz{|}|{{{zyzxvutsrrtutprvz}~~~}||{zyxwttuwxwwussrsvz|{|}~~}}|||{{{zzzyyz{zwqpsvxyyz{{{~|uopqpmlkjlrxz{~}rsz}~yy|}~x~~|}}~{yy|~{zyxyyso|{wvx|}zxwvutrqppooqu{}|xuqnmlkknrx|~}|{{{}~}~}}|sjjjimtvvux|~{pqy{uru}}~wo}y{{xx~~~}}}||||~{sw{||~|zz}~~~}yurlfiv}|yust{ztruwtqtuqnzgepuxz{yxz~}{yttvww}{uvx}}zpjffr~~yw|~|xuv|}utporrw{zywy}zyy{}~~}}~~~~~~}~}}}}|~|xwwxxwz~~{z{}~~~}~~~~~~~}|{yy{}~~}~~~{xvuvxz{{|}|{z{~~~}}}zz|~~~~~~}zxxwxyyyz{|~{wwz}}|{yyywwwxyyxvtuvxzzz|{yuuwyzz{|}}}|{{{{|}~~}}{{{|||{{{|||{ywwwwx{~}{zzxy}}|z{~||}~z{{yywvvwvx|~~xuqrtl`WWdmimsz{{zy|}zxsneahqv{}}}||~}wppvvxxwurppqtux}}}|||}|zxvttwz}~~}{yy{~~}|{zyyz{|~~}}}{yvspooponnnnorsvx{}}}}~}}{{zxvtstwxutvxz|{{zyxxxwuutsrqppporw{}~~~~}}|yuxzzwvttuuvtrqnmrx|}~~~}}}}|yvwyzz{{{zxtrrtvxyyz{}|tsqokijorvy{|~}rs|}ztws~{}~}{{|}~~}zxxz{~|xxursy}~|ywvutrqppoooqwzyvtqnmlkjory|}~}}||~~unjhjls{{xvvz}~yy}|~}zw{wxyxy}~~~}||}}~|vm{}}yz{}~~~~|zskfefq|~{voms{{xyzwtqldbr^bovz|}}~~xvyxv{~wtst{}~uromw~zz}}xtvx|xuywuyxz{zyyz|~~}ywwy{}}~~~~~~}}|||}}}{zzzyz|~}zy{}~~~~~~}}~}~~~~}}{yyy}}zyz{}~~~~~}|z|~~~~~||}}}~|zyxwxxxyz{|~|xvy}}|{{}||{zyyxwvtuuwz{{||ytsvy||{{{{{|{{{{{}~~}|{{{|||}}~~~}}|{zxvwy|}}}ywz}}|yy{}}|{|~|xy{zuruwzywtrg{y||wrot~~zvrvuvurnmrtxyzyyvnikptx||}}}~|yttuttuvxusrrrpnnsy{||}~}{ywuuwz}~~|zwsstx|~~}}|{yyyyz{}~~|yurppqqpnmlmnquwz|}~~~}|{xwuvtvyyyz{|||zyyxwvttttrrrqonpsuwxxwwxyyxxuswz{zyustuusrpllry}~~~}}~}wsuyz{{||{yuqpqtwxyy{}}~|xrnpw|~~}|~{qs|~~~~~}|}}syy~}}}~}}~|zzz{|}}}|zzz|~~{wtxz|yxvutrqpponnosvvtspnlkjiory|~~yokiginw~{wvx{~}}~~~}zus}}{yyxxz|~~~}}}|}|pbww~}yzz{|~~~}}||rifhilx~}~~uooz}{{yxtnfmwdgqw{{}}~~}}~z~ysnntwx|~~z}{z|~{z{~}xtuzzvwzywzxz{zzyyz{||zxxy{}~~~~~}}|||}|||||{|}~}{yy{}~~~~}~~}{z|~~}~~~~~}|{{|~}|}~}|{|~~}}~~~~}}~}zyyxxxxyyyz{|zxx{|{{|~~~~|zxwvuuvwy{|z{|{vtuy|{yyyyyz{{{{z{|}|{zz{|||}~~~|zyyxwwz{{|wvz}}}zvsvy||}zxuy}{vtxz}||ygTjhswvpqw~}{zumqsromllnklouwuttxz|||||{}|zwvutrsuyyvutroh]ct{}~~~~|zyyz|}~~~}{yuqonpuz}~}|{yxxxxy{|~{wsqqrtsqomjkpuwz||~~~~}|zyyxyxttxzz{||||{{zywvuuuutsrqpnorqonmmmnpqsuuuvxxzyusstsrqojlv}~~~~}~|vsvz{||||zvokloruvwx{}~zx|}~zqsz~{{}}|}}}}|||~~}{xwy~z~}}}~}{{{|~~{ywvxz{|||}~~~}xxspu|}{|~{ywvutrqpoonnnorsrrpnljiinrz|~|~qkhgfipy~~{xvwz}~}~}~}|~{wv~|{xwwz~~~~~}}}}~~{]c{rq|}z{{{|~}~~}{yy|vjhkkit|xv{~{yvrqtnksnqpuz{||||{yyxxxxwy~}qijquwz~~|~{z{}~|zvs{zvxz|{wwxzzzzyxxz||zz{|~~~}|||||}}}}}}}}|{z{|}}}}}}|}~~}~~}|z{~~~~~~}||~~}~}}}~}}|}~}}|}~~}||}~~|zzyxxxxyyyyyzzzyz{|||~}{xuttwz{|~}ywyywuvz{zyxxxyyz{zzz{{{{zzz{|||}~|zyyxvuz}{zyxz}}~}woou{}~|wtsy||{{}~~~~zdR[jptpqw~~wssojolprohdb`_antxyx{}~|{{zy||{zxvtrtuz{zywvvn_au{}~~~}}}~~~}}|{ywsoklpx{~}|{yxxwwxxz|}}zvtrswwvsqkkptwz{|}~~~~|zwtrtzyvuwyy{zzxwvwxxxvuuuuuttrqrrrrrrrsssuvutwwwuvwwvstusppoily~~}}}}{utx{||||{zvokkmpstvx{}~}~~~~~xqsy~{{|{wwvyzzz{|}~~~~~~~|||{{zyy|}}{ywvxxyzz}}{zyvlfpzvrv}{xwvutrqppooonoopqqonljhinrz|}}~xmifeflsy|}{xvvxz||||~}~~~~|~~}~~|}}{zz}~~~~~~~}}~~}~}z[diytjj{|z||z|}~~~~~}|}~}yvvyyjjnkkr~~~|}{z|{yvrigrsjikllt{y{zumklnmliip~}|{zvnioy|xw{~}~}}}||~{utyywy{xwxyzyyxxy{}}}}~~}}|{{{}}}}~}||||{{|}}||}}~}||||~~~{yz}~~~~~}}|}~~}~~~}|zz~|}}}}}|||}~}{z|~~}|{{{zzyyyyyyyyyzz{||~~~||}}|xurtx|~wsvxxwvy{{zxwwxyzzz{{{||{zzz{||}}~|zyyxxv||{{z{|}~}yqou{}~}{ytpry{z}~}}||vdYhwxssvz{{yxwvsplnole\_a\\jry|||}}y{{wxz|~~|zvtvw{}}{yxvphity{}~~~~}}}||{zyvqmmpw{}|zyxvuvvwyz|~~|{xvwz{zxvtssuwyzz{}}}|zxuqlmsvvuuwwyyxtpmntvxxxxwwuuuttuutttuvxxxz{{{{vqquxxywxxuqopru{~~||}~~yvy{|}|{{{wqmlmprsux|~~|||}}xquy{xyxuuvwyy{}~|}}|{yxxxz}}~~~}zxxxyy|~}{zwtuqnuxovu}zxxvutrqqqqppoonnoponljijorz{|~~}{rhfeehnuz|}{yvtuwwxy{}}||~~}~}}~~|yxz~~}~}}|}~~}}|~}}}}{lgZhjadx{zz{{{|}}}~~}zyxxwutswwlnromr|~|{~|yxywsnhajttkda\h|~|yslmlnoooppwzyyyxurqy}urx~~~|z|{sv|~yvy}}zyzz{zz{{|~~~~~}~}}|{{{{}~~~~|{{zzzz{||{{}}{{|}~}||}|zxy|}}}~~~}||||~~}~~~}|z{|~}||||||||||~~}zz}~~}}{|{{{{zyyyyyyyyzz{|}~~|||}~ytprv|}~~vsuwxxvuvxxvvvxyz{||}}~~|{z{{||}}~~}zz{{{|~}|{{||}|yutw|~~~}zwtswxx{}~~||zyz{xqw~zxy{{{{z{{zxutnkmhcnsnhptx{|{yxy{{xwwy~|xwxx{}|zwsmghmquxz}~~~~~~~}}||{{{zxtsrty{~}zxussssttuuwy{~~~~~~|{{|}}|{|{zxwxyyz{|||}{ytkimrstuuvwyxxsnkpsw{{zxwuuuuvwvuuuvwywyxrsvz{{zz{xuqqy~~}zxy|}}wwy{{{zzzxtonoqsuwz}~~{yz|~{vquz|wxzxxz|~}{z}~}}~~~|zyz{|~~zyxxxy{~~ywztlqz}{wq{{}zzzxutsrrrrrqoonnonnnljijosz{|}}~~~~~~vmgeefjpwz|||zwuvvvwx|~}zz|}~}}~~}{yurty~}|x|~yx~||zxx~~~}}|}}}}~|}rX[`^gxyxyzz{}|}~}|~~{wsmkmppt{wmqwsnr{~}~~|ywtqljbgqwi]XS[u~xrnqqrrtz}{{~~}{xvy}~vty~~}}~}{~|wz}{y{|{{|}~~~}~~~~~~~}}{{z{|}~~}}{{zzyxyz{{{|}~~|zz{|~|zz{zxvvy{{{}~~~}{{{}}~~~~~}~}}}}}}||||}}}||||}}|}~~}~}{{||}|zzzzzyyyyyy{{|}}zzz|{uoosxz}~wtvxyywtrrstuvwxz{|~~~~}}{zz{{||}}~~~~}}||~~}~}|{{{||{zyxz}~~~}{ykemzzttz}~}|}~|z~|uu{|{{z{}}{ywtpoonpx{ztsstxyxvsy~}yvrt|}zyz{||zyvqielnjnrw|}|{|~~~~}}}|||{{{zzyxxyyz{{ywwvtrqqqrrrtux{}~~~~~~~~~~}|zxxxxxxy{~~}|wpnnoosuutvxyywtpopsz}}zxwuvwwwvuuuvuvtu|||z{zxwvyz{yz{ywxxz}~{tswzywupotxxyyyxxvrqrtwyz|~~}|}~~|zy{|{zuov}{wz}{{}|zzzxvxzz~~~}||}~~|zyxxxx{|yxytoszzwurw{z}}yvttsrsrrrponnoonnljiins{|{{{{||}}~|qhgfefltyz{||{yxxzyy{}xwz|||||}|zyywrppwxwrxyw|}yz{}|z}yvw}~~}}|}}~~}~{bYZVm|wuw{z|}}~}}|}|uodbnvty~ylq{uns{zz}{|~|urpmjegifXRW[^sz|yvtsrrtuzwt}zvtrsy~~zx|~~||}|{~~~~}z|}}|~~~~~}|~~}}||{zz{|~~||{{{zyyyyzz{|}~}|zyz|~~|yxyywutvxyz|}}~}|{y{}~}~}|}||||||||}|{z{||}||||||}}~~}|zz{~}xwyz{zyyxxyyz||{xxy||wpnqvx|~~zxyzz{{xsqruxxwxyz|~~~}}|{zyz{|||||||||}}~~~}||||||{{{|~}}~~~~nju~xoq}~}}|zzytxwprzzwuw|}|||xrsutvvtplmqttsqw|{yxux{||{zz{{{zwwvqihkgeglqy|ywwy|~~~~~~}}|||{{{{zzyyyxyzz{|{{zwuqonnnoopprtx|~~~~~~~~}|{zyxwwwwz}~~~zwsqnnqussuxzyywrqprx|{yvwvwvvuuutuutttwysrwwpqtxz|{zyyyyz|}|sqwyse_cafruyyywzxtstuxz||~~}{z{~~}{z{{{ztmv}}|}}~~z{~}{xwxyxqx~~~~~}{yyyxvz}yyzuuuwtrsut~yz}wwutsrrqqpoooonnmkjihns{|{zzzz{||zskgffegmvyz{{||yx|~~~}vtxzzz{|}zwwwwumhiwyrx|}|xpr~~}z{ywx|~~}}}||}}}|~sk`Rj~wsw{}~~~~~{|}rl_ax{wtojozvosyxy|~z{~}snxvmjmiMISminsxzyxvsrruvrot|{qlosw{~}{yy{}~~}}}{|}}~|yz|}}~~~|z{}~}}|{|}{zy||{{{zyxxyyz{{||{zz{~|zwxyxusuvwy{{|||{zyz|~~||~}}~}|zyz|||}}{yx{||{{{{{|||~zyyz|~uqvz{{zzyxxyyzz{yyz{|}}yvttvx}~}{zz{~}xvxzzzxxxz|}~}}||{zyyz{{||{zzz{}~~~~}}}||||{|}}}|{|}}zuqrvonx}~|{|{{yyyvstzxqpuz~|sknuuvustutpkiiorsrssuxz{xz{{zyyz{{ywvupijmb[^gmr|xspnqv{~~}}}}~~~~~}}||||{{{{zyyxvuuwz|}~~|yuqnmllllmmnpsx}~~~~~~~~~}|{zyxwvvuwy}~}{zvrnlmqtuwyxxwvutrpswzxtsuwvutttuuuuuroopswuqqrxz~}{yyyz{}~zwxxo_X]Z^msz||z}zuuwxyz|}~}{yy}~~~~|{{{tlv~}~~~~{|}{yz}|wqv}{{{{zwz}{{~zwtqlklsq|zu{|uvuutsrqqppooonnmljihms{{zyxyzz{yunheeefkry{{||}|xu|}zsswwuxz|}ysqtx{vdav~v{~x|ulmz~zzyy{~~}}}}|{|}}|~|wqisvsv|}}}yy}}oi_hrfehhhvwttwyz~|{{}yww}uXG[zywyy{{xtrtxxssz|{xtnls|~|{yyz|~}~}|{{{zyxz{}~~|{}~|||{z{zxz|~~|{{{zyxxyyyzz{}}}||{{~}|y{}zvttuwxyzz{{zzyz|~~|{~~zutv{{{}}|wtyzz{{{{z{||}~~}yy{}}}zrpwz{{zzyxxxxyz{|||{|||{{{||~|{{|}~~|ywx{}~}}||{zzyzzz{{{zzz{|}~~~~~}}}|{{{{{zyxvqpopppos{}{yx|~|yvuy{xolptzw_NT_ciqsuuvrld`gqssqpprvwvwyyyyxyzzyyzyqhileVRcrqztokilpvx|}}}}}}}}}}}|||||}||||zyyywwwx{}~~{wrommllllllmosy}~~~~~~~}|{zyxwvwwvw{}~~~~|zwqljmpuyz{zxxxvojkqvtpqtuutsssuwy}{tklsurpnqy}~}ywxy|~}}zxre`dbfrx}~{{|{vv|}~}yz}|}}~}}}|{tlw~~}}~~~}}|{}}{||}~~}|yrzxrqojkotmtsp{wpttvutsrqqppppommljiintzzyxxxyzyupiecddgnv{}|}}}}zx|}|}|}{uqtwwruy~zporxrgzz}y{vnnz}yxwz}~~}}}}||}}~}~}}}yxzyzvtyylh_nklurmjowzrlkfn~||xut{z~nYi}{~~}}zvtx}}y|zuqmlow}{yyz|~~}|{zzzyyz{{|~~xx~~|{z{|~|y{}}~}|{{zzxxxyyzz{z{|}||{}|{yz{{xvuvwxxxyzzzyz{|}~}{}~|xwz|{z{{zxwyzzzz{zz{||~~{||||ztxy|{{zzyyxxxzz|}}||||~|zyy{}~{xx{~~}}|||{{zzyyz{{zzz{{|}~~~~~~~~}{yyyyyxtnheehqwz|{ywuw|}{wxxxwtqnms}xcI@GMVcnuvuqmf`cnvxwuqqsrruxyzzyxyyz{}}ujlts_O\w~xtoliijorw{||}}}}||||{{{{|}~~}}||{{{{{||}~~|ytrpooonnlkkloty|~~~~~}}}}|{zxwvuvyywxz|}xpklosy|}}{yyxvqpprpmmqsutsrrtx|ykmtvqjis}}~~|xuvwz~~}zz~{zwoloosz|~~vv}}zxyzz|}}}}}|smy~~}}}~}~~~~}|||}}}yxuirrlonkntymoomz~rntvxwutsrrqpponmmlkjintzyyzzzzxvqkgeddejsy|}}}~~~}}|{{{yvsqpuwvqrw}~sqrys}|}~}}|ut}~zwwz|~~}}}}||}~~~~|{}z|~usxzqngqxpw~xsmgwytpofn{qfVXmhhsynw{}{xw|~wplhekw~~~|{yy{}~~~~~}}}||{{zyzz{}{z~~|zy|~}}}~}}||{{{yxwwyz{{zz|}}}}}~}}|||{xwxyzyxwy{zzzz{|}~||}~~}|||yyyzyxz|zzzyyyyz{|}~}}{zz|}~~}|||{zzyyyxyy{}~~~}{}~~|zz{|~}yxy{}~}}}||{{|}{z{|||{{|{{{{|}}}}}~}}~~~~~}{yxxxyyunhe\]l{zwttx|}|{{ywxzuvzvnhlz{mV;:BRfottrpnmfgqwzzxurpnpw|||{zyxxyyz{xst|~pbgw{xuqmjhiknsx{||}|||{{{zxxx{}~}}}}}}|}}|}~}{wuuutttqnkjjkoswz|~~~~}}}|}||{yxvuuvxwuvx}~~}|ywvuuy|~~}|{{zxvuvsmknqstsqqrw}~wquyulpv{|}}{wttuy~~{vv}|zxvutstvw{|ww}~~zywx{|}}}}zqmy}}~}}}}~~~~~~}|||}|{xupopromllnr{wqqqx~spwxyywutsrrqponmllljhlqy{z{||zusmhfddeeowzy{|}~~~~~|zz{wokoqtwwtsw}~tqptz{{|}~wy{}|||xxy{~~}}}}||}~}}||~||~}|usx|}|roxtsrprsokqwvwstx}{dQJN]WQUm~ywx|~{zz}~~slkihgz||{yyxxx}~~~~~~~~~}}{yyy{}~~|{{}~}}~~~}|||||ywtux{||{||~~~~~}~~~~}{yz||}|zx{x{xy{{||}}{z{{z{zwsuwyyx|}{{|zxuy|z|}}}}}}~~}yxz}~}|||{zyyyxxyz|}~~}z{|~~~}}}~~zwy{||}}}|||{|}}}|{|||}}}}|z{|}}|{|}}}~~}~~~|yxxwvvurog\Tey~~zxvvxyyzxvvvxwsv}xnceqxvm[B7CYjpuwvtpmkmtxzzzywsoqy~~}|{yxxxwxyz{z|{wutvvyupljhiklqvy{{|}||||{zxvwz}~~~~}}}}}||}~|zyyzyyxurmkjjknrx{|~~~~~}}}}}}|{zywsrtussty{}~}|||{yxy{||}}}}|{zyxtolknqtusqopt{~spy{tvvyz{|{vtttx}~~ztt{~||{zvrqqrsxzxx~~~{ywvvy{||}zqn{}}~}}}}}|~}|||||xurpqtusqptqpqstsv{~zmjtyzzxwutssrpomlklllhhow{||}~zrnifeddgirxyyz{||||}}|zzywqkimryzywz|wvvy|}~}z||x|}~~yz|~~~}}}|||}~~~~~}}~}xyxyuttxzztpmvxqlnmjjmuy|zz|}z{~hREIVSPN^z{zz{~|{{{zzxz|vqnnoq||zxvuwy}~}zyy{|}~}}}~~}~~}|||~~~{}~~}|||||{xsswz|}||}~~~~~~~||rrux{{||}}zxxxy{|ywy}|{y|}|}}|}wwxy{{yyyz}~ywy|~}}~~~~}}{zyyyyxyy{}~~|yy|~~}{{{{|yvy{{|||||||{||}~~~~~~~~~~}||}~}{{{{|}}}}}~}|{zyxvrnkiii\bz}}zzzzxsvywuuw{{z}yqgdfmrrmXDZqrrwyxurnmqwxyyz{|zvuz}}|||{zyyyxy{|}{zxyxxvztnjjjklnrvy{{|}}~~}|{yxxy|~~~}}}|||~~||{||||{yvtrpopruyz{|~~~~~}}}}}}}||{zvqoqqqqtxz}}|{{zzzyxyz{}}}}||{zyvrnkmorwwvronrx||x{}|zsuw{|{vttuy}~}zttz|z{|{tkjlmpvzxw}~~~~{{|{zyxxyz{{{{xqo|}}~}}|{}~~vrz~~~}}~|{{|||yvtssuurnktwunmptz}}|karxzzyxwutsrpomlkkllijmvyyz||wnjfdedehmuxxxyxyzyz{{zyzzyvrlnu|~|z}~zxxz{}}}||||z}~~}}}|||}}}~~}~|zvtuwuvvxxxzyr}ysrqmhlrvz~~{~~jBDTVJPl}}{yxz}~}{{zzytv}wrmkow~}|{yww{~|zzz{|}}|{{}~~~~~~~}~~~~}||||||||~~}|zzz{zyww{~~||}~|xwrrvy{|||}~{xxwx{~|~~}{z|}}}}~zyuz{ztrsy~|vuy~}{|}}~}|{zyyyxxyz{||zxy|~~~|wwy}|xz{{{{{zz{|||}~~~~~}|{yyy{|}}}}}}}||{zxtojd`koq{}}|{||xsuyyxxy|}zyvrkaepvsiar|yvxxwtpnpty{{zyzzzyy{{{{|}}|{{{zz|||{yxyyyyzwtqpoopqsvxz{}~~}|zz{|}~~|{{zz|~}}}}}~~~}{zwvuwz|}|zz|~~~~~}}}}}}}}}}|ytppqqqrtuz}}|{zyxxyzz{{{|||{{zxvrmklnt{|ztpnosx|{y{|ztuwz{zwtuw{~}ytty}|ywxzztjfkjnuy}xu{~}~~}wuwwy{|}}|zzzxpp{~}~~~~|zyz|}~~~}upx~}}~|zz}~{xz}~|zyxtsutspknstsrrtxzz{sqzvwz{yxwusrpomlkklljkmtvwxxvqkhfeeefinwywxywvvwwxyxxz{zzytty}~{z{}|ywussuvuttz}}~~~~~}}}|||}}}~~}}}}wxwvwyyxww}zytttplu||{}wOJOOEQ{xuvy|~~~}{zwwwxyyonokgo~~}}}{z{}{{{{{}}}}{z}~}}}}}||||}{z{{zzx{}~~~}|zyywvwxz}||}~~~~}z{||||}}}~~~}{{zz|~{|}}|{z{}~~}}{{y{||vrqx}|wwz~}{{|}}}|{zzyyxxxyzzyyz}~~}}~|zxz}||{{{zyxxz{|}~~~}}|zxxxy{|||||}}~~}{ywvunilx~||}}~~}zxxyxvuxxw{|wtstpjirvwu{|yzwvsqnmrvwy{{yxwxxyz{{{|}}}}}}|||||{zyyzyyz~|zxtsrqrtvxz|~~~}}||}}~~}{zxusuz}~}}~~~~~~}||zyxxy{|{yx{}~~~~~}}}}}}}}}}|zxxxvtsrrtw|~~}|zywwxyyyzzz{{{{zzwsnjjlrz{ztuurpuy{z{{yvvwz{zwuwy|~}zutxzywtuzztjjmlovxz~ytz~}}{}~~|wttx{~~|zzzyppz|}~~}zyyz{~~|~~{{|{ww~~~}z|zyyxxz~zy{~~{vzyttz{{vtstuutsvwwwxyvrory{zyxvtsqonlkllkjkmruvuqmkigfeefhkouwwxxvssuwwxxxyz{{zywy{|zxy{{yxuplpsttvx~{|~~~~~}}}|||}||~}|}~~}{vyxzyyzvtt~yx~zruvqnz||~tumS>Wn{wvx{|~~~~|{zwvvyzvkotrhjz||}}|{{|~~}|{zz{|}~~}|{~}}~~}|{{|}}|||}|zyyyyyz{|}}~~}|zyxvuvyz|~}}~~~~~~~~~~~~~~}~~}}}}|{|~~zz|{zz{|}~~~}|z|}}xwvwz|}}{zz|}}}}~~}}||{zzyxxxyyyyyz|~~|zz|}}}~~}{{|~~~|{}|{xvwx{}~~~~~}||zyyyy{{||||}~~{xwy~~trz}}}~~~{zxyxvqorvyzvrqsqkimsvtpmqxurrpmrxzyzz{xvvwxyzz{{|}}~}}}}}|{{{zyyzyxy}{xutssuwy{}~~~}~}||zxxz{}{wtrpmjltz~~~~~~~~}}|zxvuuvvxyz}~~~~~~~}|}}|}}|{yvtuy}{yxussrvz|~~{zwvwxxxyyyyzz{|{zvqljhlsutpsuvwz|}~~|zxwxz{zwwz|~~~}zutwvusprxyvorutuyww{yrx}|z~zx|~}xurx}}{zz{zoo{{}~}{ywvw~}zy|~|wuuw~~}x{~~{z}}~~~~}yvtyxtu|~~zwuutsswzxvusqqnjmw{{{xvtsqonmlllkkklorrpmjihgffehlnnptwxwtqquz{xwxyyzzzyxwxwvvyz{{{vmhlsvwxy}~}{xvvx{|}~~}}}}|||}||~~}|~{zzyzxyzyzqnn}tko{wokxzpq|~~||}}jUkx~ywx{}}~~}}{||xttzypks|zpjszy{}}{{{|}~~}~~|zyzz{|}~~~}}~zz||zyyz|~}|~}xwxxxyz{||}~~|zyxxxy{z{~~}}~~~~~~~}}}|}}~~~~}}zyzzyz{}~~}}}~}zxxy{||{{|}~~~}}}~~}}}|||{zyyxxxxxy{|}}|zxyz{{{|~~}}~~|}}}xuuwz}~~~~~~}{}~~}|{|||||||}~~{xwy||ww{}~~~~~}|{yyyxpgiqxyvssrmhcfknmbPQesrrqu{~{{zywuuwyzzz{{{||}}}}}|{{zzzyzzyxy~{xvttuwz|~~~~~~~}}}}{ywsosuxuqomljiinu{~~~~~~~~}|{ywtsstwy{}~~~~~~}}|||{{|{yvrnotz}}|ywtqqrvz{{ywvvwwxxxxxxyzzzzwsoliijknkmpv|~~}{yxxz{ywx{}~~}zvtvtrqnowyvolssrzz{~}zsw{zy}yx|~~xtrx}~|zxy{zooz{|}~}zwnqy{{y{~}xprst~}~}xz|{wvz|~}vqvxywqpvz|yvrnosy||xsmhknhlv{{{ywutronmlllkkkkkmmlkihhhgfejsttrvxxuqifny~yxxxxxyyxwwxwuwz||||yrmouz||||}}zvrprux{~}|||||||||~}~{uuwxyuporqcik|skhnhgovjmv~~|z{|}yprv{|{xyy|~}{}~}zz~vpswuvkpwvwz{zzz{|}}}}~}|zyzz{|}~~~}{{}|zyyz{}||~zxxwxyzz{|}~~|zxwz{||{{}~~~~~~~~~~}}|}~~}|{{yxyz{{|}}~~}}}~}{xxy{{{|}}~~}|||}}}}}}}}|{zzyxwxyyz{||zyxxz{zz|~~~}{yy{~~yvvxz}~~~~}}~~}|z{}}}~~||}}~~zxxyyvux{}}~~}{yxyzyyxxodhrwzyxwqhabnmgkeUFQmvqqv|{z|~}zvttwyz{z{zz{{||}}|{z{{zzxyzyxx}zxuuvwz}~~}}}||||||zxuqoqrtsqonljihilrw|~~~~|{zxuuuvxz{|}~~~~}}|{{{zzzzzxuqnpsz}}}|zvrortuy{zxvvwwxxxwwxxxzyxtqnkiihiggluzz|}{yxxzzywy}~}}zwuvutspquvtpqvsv~~}zuvzxy}{{}~~wtsy}~xxxuz|znpz{|}}~~~|z}yz}~{{}~|{}|v|}{}~yz{{xvvwzzxy|}|vko|}zuqopuvvtokp{zsnilpmpv{{{ywutrpnmlllllkihjjjihhiihggowyywxxwupeZct|{yxwwwwxxxxxyz||}}}|{wtrtz~}}~~}|yvspqv|~}||||{{|||}}~~|xspqvwpkdqq`mq{{xskblx}mimtz|||}~}{{{{}{xuvz{{zzx{}{}|toqnvmoutvxyxyyz{}~}|}}~~}|{zzyzz}~}}}||}}}|{zz{{zz}|zwxyyz{{{{{|}~}|zyxy{||{yyz|~~~~~~~~~~}}}~|zxxwwx{{||||}~~}}||}}|zyyz{{{|}~~}|||||||}~~}|{{zzyxxyyyz{{yyxy{|||}~~~~~}zxxy{~~|yyz|~~~}|||{zyxxyy|~}}~~~|{{zyusx{{||}{wsqtwyxwvphjrvz|{xsj`dqlde[UXcprrpsvuw|}yvstwxz{zzzyyyz{||{zz{}|zxyzyyy~|ywwwxz|}~}}|||{{{{{{zwtrqqrttsqomlkihimsy|~}|{{yvvvvxxyz{|}~~}||{{zyxxxyzywsrosy}~{vqmkpu{ywvvwwxxwvwwwyyxvromjjijjjnuwvx}~}zyyzzxwz~}}|zwvvvvurrrrsw~|rw{xx{}zuxyyxwz}~xttyy{vovtqz~znpz{|}}~|x{|{}~}}}~~}||||}|zxwz||~zz{zyxy|xqzwz}~~}|zrnu}~zusrtxwqqqns}~yttwwyyy{|{{ywutrpnmlllmmkihhiihhhiihhjsyyyyyxwvqi_lxuz{ywwwxxyzzz{}}|{{{{{zxuuy~}~~}yxvttw}~|||||{|||}}}}~zwvplstojjt|s}z{|qjoxwsqswwvvxxyy|}}{{||{zyvwz||zyx{}{|{nkjmoppruwwwxyyz{}}}~}{{|~~~~~~}{zyyz}~~||{{|}~~}|||{zyyyyywwy{||}}|||{zwuuvxyz{|||yxyz}~~~~}~~~~~}|}~zwuuwyz{||{{{|}~}{zz{||{zzz{{{{||}~~~}}|||{{||~}|{{{{{zyxyyyyzzzyz|}~}}~~~~}}}}|zxy{~~|{|~~|{{zzzxwvvwxy|}~~~}{usx{{{{{zuqoquxxxvvrkovz}}|{vh]`dc]RFRifgkrvvwz}~{xvtuvxz{{{zzyxy{||{yz||{zyyzzzy~}{zyyz{{|}}|{{{zzzzzzyxvtssstuusqpnljhgjouy|~~~}|{ywvvuvwwxxyz|}}}|{{zyxwwxyzzxwqnrw}~~{vrmiiktyxvvwxyxwwvvvvvtsqpnmkihghjortuz~~|zyzywvy}|{{zwvvwwvttuuuz}wztons{{vsvwvrt|~~zvuvwupsy{z~znpz{|}~{w{~}{zzzz{|~~}{wxz|}yy{{zyxy{rsty}~}|{zwty|zwtsswzxstwttuz||{wtv{~}||ywutrpnmlllmmljhhhhgghijjkmuyyyzzxxxvsltyvz|zyyyzz{||}}||zzyy{{}|zy{}~~~}yvwwx{}|||||||}~}}}~|{{{leloopokzzqnw{rpu{}|zxyukhkmmorvy{}}||{zxx{|{zyy{}{z||skhikoruuwxyz{||}}}zzz~~~~~~||~~|zxxy|~}|{z{|~~~}}}|{zyxyyxvx{}~~~}}}}{wrpqtwyz{|}}|||}~~~~~~}}~~~}}}}|}~{wvuwyz{||{zz{|}||{zzzzzyyz{||||||}}~~}~~}|{{||||{{{|}|{zyyyyyyzzz{}~~~}|{zzzzzyxy{~~~|{zzzzyxxyz{{|}}}}~~vuz{{z{{zwsqprvxxwxtqsw{~}q^[ce`]LCJOYfv~|}~~}zxvvwwxz{{zzzyxxz||zyz{{yyyyzzyx}~}||{{{{||{zzzzyyyzzzzxvuttuvvvutroligilpuwz}~~}|{ywvuuuuuttvwy{|}||{zyxwwwxz{|{vqotx}}{xvrmggltvwwxxyxwwwvusrpoppqpnmkihhikoquz}~|zyywvx|~|z{zxwvvvuuwzz{z{z{{ljkqz|tnotvqmv~~}zwxxut}|{zopy{|}~~|yy}~|{yyyyyz||~yvy}|xxyyvtqjwyyy{~~}{z|}|zwuuutu{|yrqvxuqvz{{zxy{~||}||zwutrpnmllmmmlkihgggghiklpw||{{zyxxyyxxzzx{|{{z{{{||}}{z{{z{}~||||}}yuuw{~~}{||||}~~}}}~~|{|}n]bfjoqgxyokvzsvz~}xsstqkf`]^eiov|~}}|{zyz{{yyy{~~~~~|xuuy~}{yohehmtxxxy{|}~~~~~xvtwz|}~~~~}{|}}{yyz|~~~~}}}{{z{~~}}}}}|{yxyzz{}~}}~}yspptwyyz{}~~~~~~~~}}~~}|}}}}~}ywuwyz{{{{zz{|}}}|zyyyyxxyz|}}}}}||}}~~}|{||||||}~~~}|{{zyyyyzzz|}~~~}|yvuuvwxwxy|~~~~~~~|{z{{{{{||}~|{|}}|}}}~vu{|{z{||zxurruwwtomquvz~~||{vple`cR<9EZkv~}{yxxyyz{{zz{{zyxy||zyzzxxxyzzzyx|~}{{{{{{z{{{zyyyyz{{{ywtssuwxxwurpnlmmoqrux{}~~~~}|zwvuttsrrrrstwy{{{{zzyyyxxxz{|{xwwy}~~~{{ytoklpruwxxxxwxxwvttrrrsstutspmjgfjlpuy}~~{xywttw{|z{{xvvuvwz}}{zzzuijotyz}|rkkpvtpw}~~||}|{{}vtxpqy|~~~|z{~}|{zzyxwwx||xx}{wxyytrpmqqx|~|yy{~zustvwy~zplostuwy{||{{|~vsw|||zxvtrponmmmmmmkihgggghikow}}|zyyyyz{{{{||}}|}}}||{||{yyy{~~}|z{{wyz~}|||||}~~~~}}~|y{|}s_bjiklozw||y}xzzzxojkopsnaTV\bhmx~||{yxxzzyxyz{{}|{upmknvy{zyzqgdhnvzzzz{|}ztqtxyzz{}}|{|}~~|zyz}}||~~}|zzzzz||}}}{zyy{}}}~}~~~~~|vpptxyyyz|}~~~}}}~~~~}|}}}~~~{xvvxz{|{{{{{|~~~zxxzxvwyz{|}~~}}||}~~}}||}}}}~~~}}|{zzyyyy{|}}~}{vpoqtvwwxz}~}}~~~~~~|||||||}}~~{|}{zyz{}}uv|}{z{}~}|zvtuwxtllrsuz~}xz{plpdG9Hbtv{~~~~}|{{{{{{{zzz|}|{yz||{zzywwxyzzzyx|~~|{zzzz{{||{zzzz{|}|{yvtsvxzyxvsroonnnnpsvy{}~~}|zxvutsrqppooprsvxy{{zzyyyyyzz||||{{}~}~}|{xrrpoprtuuvwxyzyyxuttutuuwvtpkigghjnsx|}yzxqmpw~{x}|wvuvvy|~{z{zqiknrsrw{sljlqtv|}~}~|yywpqy|~~~~}|||{zywusqu{{xvy|{xx{ystzopru~~|{wx{}}~}wvxz|~|rmkkovyyvy{{{|~}qks|}|zwutrponmmmmmmljihgghhjkqz~}{zyyz{{||{}}~}~}|{{|~|zz{~~|{|~~}|||||~~~~}}}}z|}}ypqrmlloxpu|zyxrkkhnqongbXZagfn{~}}{zxwyy{xwxzz}|zjdcbcktxyxvqhgnsx{}{z{}~|zvuwyzz{||{{||}~}{zz|}{{~~|{zxwx{}~{}||}|}|||}}~|xsoptxyyyz||}~~}|}~~~~~~}~|xvvxy|||||{{|}zxyzxxwyz{{|~~~~}||~~~}||}}}~~~~}|{zzzz{|}~~{tnmquwwxy{}~~}|||}}~~}~~~}|||}}}~~|}}{xwxy{}}xsu{}|{|}~~~~{wvwvromiksx}}vw~}||sX;Viqwz|}}}}||{||||{zzz|}}|{|}|{{{yxxxyyyyxw{~~}{zzzz{|}}}|{{{|}~}}|ywvxz{zxvtrqqponmmoruy{|~~~|{ywutttsqonmmnnqsvy{{{{{zzyyz||}}}}}}|}}||zwusqpopqqruvxzzzzz{{zxwwvtplkihgghkry{|yphis{{x|{wvvwy{}}~ukghllmt{tolknty}~~}}}|{zwqrx|~}|||||zxusqprtttsuwzzyxuqljksz~}{yz{z{{|||zwxz|~~xtuutpkimswwxy{ynku~}|zwutrponmmmmmmljihgghjjmu}~~~}{zzz{{{||}~~~|{|}}|||}~}}}~|zzuqoksnn{xyxwljsomghljebbdhhgm{~~~}}{yz}|zz}~{f`dbbhkruvyyutuwz}}|y{}~|ywwxyyyz{{|||}}{yyz~~|{|{xutx{~|zxxyzz{|~~wronptxz{{|}}}~~}}}~~}~~}}~~~|ywwxz|}}|{{{{}~~~zz|}zyxyz{{|}~}}~}}|||}}~~}}}}|{{{||~~ysruxyzz{|~~}}|{z{|}~~|{{||}~~}{ywwxz{}}|zwsqty{{{|}~~~}wwunknmehpqsx|y{~xgYqvvxz{|}}|||||}}||{zz|}~~~~}}|{zyxxxwvvv}~~}{zyzz|~~~~~}}}}~~~~~~}|||{zyvtrqqpponmnpruxz|~~}|{ywvvvutrpommmoqtxz{{{{{zyyz{{{||}}}}||||{zxvsqonmnortwyzzz{|{zywvuspmmkigffimt{~xpijqy{x{zvuvwz{~}{|}|rgbcgilu{tngglty~~|zyz{~||{wpquz~}||{{{{xwusuwwurqqrvz}{wstmafos~|xwz{{{zyxwqsz|z}}zwps|~xoihjnqqqtwwomw}|zwutrponmmmmmmljihghikntz|}~~}|zyz{{{||}}}~~}}~~~}}}~~}}}|{wuqhijn{wqu}~{ki}{m^cjlifdadjmkr}~{{|}{z|~}}ytfcacfknrv{|}{z{}|}|{yyyxxxyz{}}}||||}}~}}{{|~{xvwz~}xuuwwvuvy}}voklosvx{}~}}|}~~~~}}}~~~~~{{{|~~|zxxy{}}}|{{{{{|}}{{}}|{{{z{{|}~~}~~}|{{|}}~~~~~~~}}}}}}|||||}~}yxyz{||}~}}}}}~~}zyyz{}~~|{zzzz{|{xuqnoswyyz}~~}}}zwxshdjkcfljioxz}}yuy{z{{|||||||{zyyyyyyz{|}~~~~~|{zxwxwvtts~}|zyyyz|~~~}|{yvtrrrqponmllnptwz|~~}|{zyyyxwvutsrrrtwxzz{{{zzyyyzzzzz{}}}||||{zywvspnnopsuvxxzz{{zzywuuttsrokgefghls{xqmmqy{x{yusuyx|~~~}zwuvtmgfilnrzzvqojjoy~|vttw{~}zzzxpqtx}}~~|{zzzzywvwy~}xussuxyzyxwyvpsrmy{yz{zyxvtvrkqz|w{{usy}~ztrrqpnmmlptuqpw~|zwutrqponmmmmmljihhijmqy|{|~~|zzz{|||||||}~~~}~~xuuy~~~}}~zy{xutukdmu}zxy|~qmz~s^akrpe^Z\ksrty}zqsz~ztkeqzy~xrfa\^_bfmpw|}|z{|||{{{{ywxxz|z{}|{{z{{~~}{zyz||yuuvvspoptxzvoijmqux{}~}|{|}~~~}}}}~~~}}~}{zzy{{{|~~~}}{yyy|}~}|zzzzz{|}~||~~}}||{|}~~}}~~~|zz{||}}}}}}||||||}}}}}}||||}~~}|||}}}~~}}~~}zxwxz}~}|{{{|}|xsnmoruwx{~~}}|zxxzwnhjiddiijouyz|~}{|~}~}|{||{{||{zwuuvwxxyz{|}~~}||{ywuuwvusqq}{yxxy{}~}{ywuttsrponlkjlnqtx{}~}||||{{z{{zyyyyzzzzz{{zzyxxxxyyyyz|}}|||{|{zxwurpoprtuvwxyyyxxxxwtrswvvtmgffffhmsy~~ztqpry|y{xsrtyx|}}}{yvuutstuwvxz~zwx|pkq{~~|rlsy}}|yzzwqqsw}~}{zyzzyyxz|{zxvttvwssswvurqrux~~}{zyywtrpqtwy{~{wz|zvruoosplkpvxxuwy}}|zwutrqponmllmmljihhjlquyyx~~||||}}}|||||}~}}|}~yrqt~~~}~zy}{zplopnju{uwy|wrmplfbfqof^hlntqsuvtmoz{wsdX[y|tqlrvzp^YYW_ivz|}|{yz~{{{{|~}zxxwx{xwz}{yyz|}}|||{z||{|}}}}|~|zyz{yyvnlmquvrkikpvy{|}}|||}}~}}~}~~~}||}~~~~}|{z{{{|||}~~~}}}}|zzz|}~}|{{{zz||~~}}~~~}}||}~~|{|}~|zz{{{|}}}|||{{{{|}}}}}}|||||}~}}}}}}}}~~~~|{}~~~~|zwwz~}~~}}|{z}}vonnoqsuwz}~}}{wwy{ztnmljhkptwyzz{}}|{{||||{{{z{{||xtsuvwwwwxy{|}|{zyxxwtrsuutqnm}{yxxz{}~}{zyyyyvsqomlklnpswz}~}}}}}}}~~}}}}}}}|||{{zyxwvvvvvvwy{{}}}}||{zywusssstwxwvwxyxxxxwvsoptstspkhfffgilpw|~xutsx~{|xrpryv|}{zzywvuvvy{|{~zy{}vx|}}|}hmy~|{{{wpqsu{~}|zyz{{{z{{zyxwutuwwslnqsqmmrx||xqoquxxwtrtvyxwx}}zywwxpeipsnkt{|{}~~|zwutrponmlllmlljihikotyzxw{}~~}~~}}|{zz{}~}||~}fg~~}~~~|yjbbgqqxwwy{|yvvpkhkqxshnzvprqrrqruqx~vkpohcnzzrdds~zdSQblnyz{|{zyz}}zy{~~{yyyxzxvy|}~|xvwy{|}|{{zz{{zyxwvuvwxy{x{ztpqvxyxsmlqvz|}}}}|}}}}}}}}}~~~}}~~}|||{zzz{{|||}~~~}}}}}|{{|}~}}}}}|{}}~~||~~}}||||}~~}{{|~}|z{{||}}}}}}|||{|}}}}}~}||{{{{|}}||}}}}}}}~~~~~~{zz|~~}}~}{wvz}|zzz{|||{ywsoifefinsuvz}~~}yvxz{yuuxywsswz||{{{}~|{{{|||{{zz{}}|xuuuuttuvxz{|{zxwvvtqpqrrrpki~|zzzz|~~~~}}}}zvtrqppppqswz|~~}}}}~}}~~~~~~~~}||||{zywutttttttvyz|~}}}||{yxvuttuvxywwvwxxxxxwvsmmpppqqolhhghgghmqy{zyuu~{}xqpqxu{|{zzzxvvww{|~}yxz{{}~u~~}|{vorvwz|||}}}}~|zzz{|}|zwwwwvtstx}xmmqusqpqswzwibkrvz|{xxxwwtsy|zxuqgijijknw}~}|{|~}|ywusrpnmllllllkjiijmrw||xwxyz{|~}|{zyy{~~}||}~~|~}|~}{xqa_ggtnm{|xzz|~}zxyxqcXgpajsi`hoqtuuuvpv{veqysspy}bV`nvoci{|zzyzzzyz~|~}zyz||{zy|yx{{|ywwy{}|vwx{|}{zzyyy|~yxvtommqwyyyvxvrv{|}}~|wssw{~~}}}||||||||}}}~~~~}||{||}}}|||}~~~}}}}}}}}}}}}~~}~~~~|{|}||||||}~}{z|~}|{|}}~~~~~~~}}||}~~~~~~}|{zyyxyz{{{|}~~~}}}}}}}}}~~}zwuuz~|}~}xvwz}~ztpswyyyzwofca][`jswwz}}xuwwwvtw}~zyz|}}}}}~}|||||{{zzz{}~~|xtsrqrstuxz{zyxwvvtqnnnppnie~}|||}~~~}}~~}{{|}~|zwuuuwxxwvwxy{}~~}}|||||||}}}}~}}}}}}}|zywtsrrrrrrtvx|~}}}|{zxwvuuuvvvvvuuwwxxxwvtqqusqoppmmkjjkhfghmtxz|}xw~}{|xrqrxvz|{{{yvuxyvxy~yvyz{~}}{|}~}||}{unu|{||yvx{{||}~~|z|zw{{{xsrtvurprvyytvuwxxxwvxxylelsuyz|||{zwuuz~|uil{sgfqyx{~xrsz|zxvusqonmllllllkjijkpty||yvtw{|~~{{{yyz|~|{{||}}}~||xwttrhWa|hqlkuzxyy{}~zxss`HJ`rda`PSblotuxwuosyvmwxpssx`NQ`nvy|y~|zyxyzzz|~}vxzz{{zz{{{z|zwwwyxxwxz}ywwy{{{{|zxvw|}}|{yxvsompu~|xwxmfv{||}}xvy~~}||||{{{||||}}~~~}}||~}~~~|||}~~~~}||}}}}}}}}~~~~~~|{{|{zz{|||}~~}|{{}~}|}}~~}}}}~~~~~~}{zzzyxxxxzz{{|~~}}}||||}~~{ywvtrry}||~zsqv{|{{{uposwxz||ulkf[SZjuyz|}{vsqlmrrtw{|zy{|}}~~||||{zzzzz{}~~~}zvrppqqqsuxyyyxwwwvqlkknpkgc~~~~}|{|}~~}{zyz|}~|zwuuy|}}|{zyyz{|}||{{zz{{{{||}}}}}}}}}|{yvtrqqppooqqt{~}}}}|zyxwuuuvuuutstvxywvwvttsutrnpqmnljlokggfghmsy~~|{{wsrtxvz|{|~vmozzkgyzuwz~{xwxz}|zy|~|snv}{|zwx|{{{|}~~~{y||wzxuurlqvsqnpsvwvwwxz{}~|zumpknwvosz}~}~vwz~~{tqx}lhnqtz|yysr||zvuusqomlkllmmmlkjkmqvyz{xutx||z{z||~}zzz{}~~}|}yxusrtrqcfvhphequvnwz}~xwvugXdlfYbh]U]iknsvvtnsxrnmmpttv~|]RQ_ktwry||zyxxyz{|~~{wtuy{{yxz{{{{ywvvxyyyxz|~{wvwyzz{||zxtuzzzyxxxvrpoqy~~ztptsnuy{|}{ut|{zz{{{zz{{{{|}}}~~~~~~}}}}~~~}||}~~~~~~~}||||||||}}}~~}{zz|{zxy||z|}}||zz|}}}~~}}}~~~~~}}|{yyyyyxxyyzzz{}~|||{{{|}}yvutstwz|}}}}||}~~{pks{xvyzyvsswyyyzxtsqdW_nv{}~}xvumcempruy{zy{z{|~}{{{{zzzyyz{|}~~~|wrprsrqqruvwxyxy{{tljjlmigc}|zyz{}~~|zxwyz{}}{xtssvy|}~}}{zz{{|{zzyxxxxxyz{|}}}}}}}}|{{xtqrrqonmnnqx}}}}}}|{zyxvutssssrqsvz|zxwvutsrsrmoplmgisxrmljifdgox~~|{zwttvvxz{y{|nhpvherzyssvywsrsw{~~~~xuv{}rmwzyz{||||{zz{yvy~~|xs||zuqpppnqqqopstwyyyz{}~}tovwr{wqt{yrz|~|xplmpsrqtwwyxsnkly{zvuusqomlkllmmmlkjlosxz~{~}ysot{~~{zy{}}~~||~~}|{{{zprrsussrsjdqxzymppvz|~|uuvytiTV__bnfY]elpsrqrltvlmjgktvszoUTWiv{{wz}{{yxxyz|}~~}}}}|yvsu|}}yvy{{zzyxwx{||{zzz{yvuwy{||~~|yuruxxwvvussrqtz}|xsgp{|y{|}~}xkp|yxxyz|{{{{{zz{||}}~~~~~~~~~~~~~}}}~~~~}~}}||||{||}}~~}}}}|{||||wx{zx{||{{zz{|}}~~~}}}~~~~~~|{zyxxyz{{{zyyyz{~~}|{{{{{|~~{zyyxxyzyyz{{||||}~{upprrsvz{{zy{zwtvxxyztgfqy}~}xz}o`^emquy|yvwxyz}~~|{{{{zyyyyzz|}~~~}yutvwurppprtwyz{~{smkkihhg~|zxxx|~~|zxvxyz|}}zwtqsuwz}~}|||{{zyxxwvvuuvwy{|}}}}}}}}|}{wutttrpnlkmsz|}}}}||{zxwvtsrrrqqsty{zxxwvusrpnnqroqqtyzsoqpnljhlt{~}|zwutuuwyzz}xmlmpw}~xrppqrrprx}}~}}}}|{{}qpu}~qmw|wswz|}|{{{{zvqu|}zsjr{wtssomqttutwwxwwxz{{uolp{{tss{z{}|rv|~{xoe`bfptwyysjc]Z]qzzwuusqomlkllmmmlkkloswyz}~~xqmqx|~~{}{|||{|z|~}|}~~wmqsvwtkt}lbgvhz|||~{stuwvrd_jthmdZdkpuqonqswoeqkchwxswfQRVlz}}|~zzxwwwy|~~}|{{{zywtv}|z{{zzz{zz{~~|{zyyywwx{~~}{yuqrvwutsrpqrrtxyywtir||}~~~}yt{|yxwxz|||{||{zzz{{|}}}~~}}}}~~~~~}}~~~~}}~~}|||||||||}}~~~}|||||||}}}ywy{z{||{{zyz{|}~~}|||||||}~~~|{|}}{zzyxwwwxz{{{zzz{|}}}|{{{{|}~|ywz|{zyvuuwy{||||}~~}xkgnsx|}~~~~}ywwyz{|{tpu{|{zyz{z~~qbZ]hr{~~|utuvy{~~|zzzzyyyyyzz{||}}|{yy{{xsommptwz{z|~yvtqmlml~~}~~~}zwvwz}~}zxvxyz{|~~}yspqtvz}~~}}|{zyxwvuutsstvy{|}}}}}}||}|zyyxwuspmjimrx|}}|||{zywvusrqqppppsuuwwxvuutplmprrsxwnvsostqrsru{~~}{xutssstvz|t}xqmlotvru{}|{{|||{z{qow~~qlvzqjqx{{zzz}|}|yy{ztqjkx{vwvvuqpsuvyxyxvqtx|}zpfbdmrjosy|~{vt}|{||yunhdhmqrrrsi]UPQZrzzwuusronlkkklllkkjlnrtvz~~~~||{|}~~xuuux{~}~}{{{{}~~}~~{uuvzyuin|phb~xt~}}}vvvxwtphoxnmc[fnttspqux{vwwrim{znpk]SNevzx{|wyxvvvy|~}{zzzzzyxvx~~}~|yyz}~}{zzzzzyz~~{yxuqqvxtrrsrpprrtwxwvry~}}}}~~~}{z{xkwxy{|~}|{||{zzz{{||}}}}~~}|{{{|~~~~}}}~~~}}}~~}}|}~~|zzz{{||}}}{{{{||||}~~{xy{z{||{|{{z|}~~~}{zzz{{{|}~~~|zzz{{{{{ywutuwz|}|}|}||~~~|{{{{{{zzz}}zxsqruwxz|}}}|||~znjqx|~~~|{zz{{{|~~{{zwusqtwz|xtk^_lt|vtvwz}~{yyyyyyyzyyyzz{{||{{|}}{wpkmsx{||{yz{{{zyvtsq~}||{{|}~}zwuvz{uuxz{z{}~zrnptx{~~~}||zyxwvutsrrrtwy{}~}}}}||{{{{{zyxwtrnkjkrw{||||{zyxwvvutrqqpppsx|{xvuturomgisuvvxxwuwupsvty~}{xtsqqpptw{}}}~~~~xrqtwzysuw{ywz}|||{zzxy{~|qmv|odlz}{uuz}~~~ttrnrrtyrqpopqrstvwwx|yvtx|~woljjikpts|zzvvnnrxz|~}ywofemuyzxsmkgaYJKgv{{xvutrqomlkjkklkkkkloqsv}{zxxwy{}}pmvsv{~}z|}~}zyy{{vmjzqcct~zyz}}~~|{yvmlqwthhlckqohqxtx|z|}|y|zmmmn`S_sxvy}xxz{xwwy|}|zyyyzyyyy{~|xy{~}{yz{|}||}zxwurrwzvtuyxrpqrsvwxxv{~|}}}}}|{zustwtvy{{||{{{|{zzz{{{|}|||||{zzz{|}~~~}}}}~}}}|~}}}|}zwvyzzz||||{{zzzzzz{}}{zzyyz{|~~}|}~~~}|zxxyzz{|}~~}|{zzyzz{{zwustx{}~~}~}}}~~}|{{zyxyzz{}yrotxyxy{}~~|zz{{yy{}~~}{zz{|{yyy{}|wqoqqsvxtostiktv~|}zvwx{}~{yzzyxy{{{zyyyzz{{{|||||ysmpx|~~}}zuv{{zzyxvs~|{yxxz{|~}zvsrv|{utvyyyz{}~zspsx|~~~}|{zyxwvtsrqrrux{}}}}||||{{||}|{zzxwurpnnrvxz{{{zzywvvuusrqqpopuxyywussrppilvywwyyzz{xptxuy~|zwspopppqsvwz|~~}}}}~~yuw{~|uttyrpz|||}||{{|}~~{rnv~}tqv~|xxz~~vtrnrx}|rnllnnrvxyxtqtxxwyytptxwvsplnstpsmlmwwwrrxz|{{{o_[fptsxuoijigf]Woy{{xvutsrpnlkkkkklllkllmqx}{zzzzy|}wkjrsw{~~}|~~|||}zolzqc`o|{xxz{||~~|wpotyynll\ajjmssmx}}||~}~|qpqvn_cuyww|yz}~ywwxz{{yxxyzzzzzz{{~}ywz|}~~zxy{~}}zxwvsty|xwx}|vssstvxxxx|~|}|||{yyxsprtruz|xxz{{||{{{{{{{{|||{{{zyyz{}}}~~}}}}}}||||}}}||{}~|zz|{zz||{{zyyyxxwx|~~}{zyyz{~~}~~~}|zyyz{||}}}~~~~}{yyyz{zywvwz|}~~~~~~}|{zzyyz||{{~~||wrv{}zwx{}~|z{~||{zy{}~|zy{}~|xspt||tljnqqrroihouzuruxz~}yyz}~~{zzyxxz||{zyyyzz{{||{yyyxvtvz}}{xssw||{xttt~|xvuuwxz|~~|xtonouz~{utvyxxyy|~{vtv|~}}|{zzxwusrqrrtwz|}}|||{{{{|}~}|{{{zzzywttwyzz{{{zyxwvvutsrqpoooquxzwrppqqoqwxxwxz{{|xosxsuz}}}}|yvsonmprsqpqrvx|~~}|||}~~zvw|~zwvyd^w}|}~~~}||}~|ytry~|yy{yxxxz}zxupuzxttpjjlnsxzzxrprxzxupmfswyyxspruwun\`ew|~xwzzzzyy`Q_w~zxurkflnmpqku{|{xvutsrqomkkkkklmmlmnorx}}~~}yuvwwz~~~~~~~|uryqc^kyzxxzzzzzz|zwww{zrkbirrvplkx~~{{|||~ursvvko{{|z{}{ustvxyzyyz{|{zz{xxy~|xwz{{|||~~{xy|~}zxwvvwz{wvwzzxwvuuwxwwv{~|}||{zyxwwtpopv{|xwxz|||{{zzz{{{{{{{{zzzz{|}}}}~~}}}}||{{{{}}}|{yz{|{|}|z{}}|{{zyyxvuvz|~}||{zz{|~~}}~~}|{zz{}}}}}}}}}~~{z{{{{zyxy||}}}}~~}}|{{zzz{{}}zxyxtx}{{}~{wvy{~|zz~|wwxvtvz}~{yy|{unmvzsmjlnmnmf\]jw|umkt}~~{yz||}}~}{zzxwx{}}{zyzz{{{||{yusstx{{z{}~{tpqsv{}|xsux~{wtsstuxz}~~~{wrmkkpuyzxxxyyxxxz}~~|{wtsuy~~~~}|{zxvtsrqrstwy{|||{{zy{||}~}|{z{{|||zxxyzzzzz{zyxwvvuutsqqponmpsvtonppooptwxvuvutwvnrwqoqstvxvsrqnmknqpnlnqtwz}~}|{|}~~yuw{~~~i[qz{}~~}|}}|{xvv{~}{zxwwyyyz}~~{xtpuzvnnhfbhqwyyxwtv{z|zwxscnruvvutrsuxnSYcuyywz|{|||uVQn}{|wtrlqstvvyy}|yvtttsrqomllllmnomnqstu~|y|~}~~~{yxzrc^gszyyyzxxvt}~~~yvy{}unry|tkmnw~{zyyz|xstutrx|zwy|{vqqqstwyzz|}}|zyywy{~yxy{{yzyy{~~~|z{~}}~}zxvvxy{yvuuvwxxxwxxwuux||{}}}|zyzyzvolpw||zxwy|}|{zzz{||{zzz{{zzz{|}}}}}~~~}|||{{zzxyy{|{{{{{zyyz{{{{}}}}|{zyxvttvvxy~~}|}}}~~}}}~}|{{|}~~~~~}}{}}zz{||||{zyz{|||||zz{{{{z{|}{yxvsx}ywx|}{yyy||{z}~||}ywxz|}{zz}~{uosywqnmmlnrn^_r}zrljt|{yxwyyxy|~|{zywuw{|{{zzzz{{|||{ytqpsy~}zy{}yoimquy}}yuvz~{wsqqsuwy|~~~~}}zwrnjjnrwyyzzzzzyyz||zwuronptx|~~~~~~~}{ywusrqqrsuwy{{{{zzyxy{|}}{yxxy{{||{yvuwxyxyzyyxwwuutsrrqponlnqsqnnppoopsvvtssoipqmqvpkjklnonmpqolklooljlnrtx|~~|{{{|xtuy}}{xkany{}~~}|||||zxtw~{zywvxzz{z|~}~{unnuzutvia]itxyyxvuwy{|{xwo]couwvvtqpqsp_Qjuvvwz~~xaXr{xvt{zvuuwwy{||{zwuuuutsqonnmmmoonotuwx|~|xww{}~~~~|{z{qb\cpxxxxwwwshuvvwxsxyz}}yyzzkgopu}{y{zwz|xrurqrwzzwvuy|ysoqrrrt{}|}}~}zyxxz}~yxyzzyyxwy{|{{z{~~|}zuuwy{{wtuuuvxyxwxwwuuy{{z}~}|{zz{{unlpuyzyxvx}~{{zzz{|}|zyz{{zz{|}~~~||}}}|{{{{zyyxxxz{{zz{|zxyy{|||}}~~}}|{yxwussqw}}~~~~~}}}}~}|||}~~}}}{}}{yy{}}}||zzz{{|{{zyxy{{{|}|zxvz~xrorx}}{z{~~|{{~~{yy{|zz~|}~{z|{uomkkptyus|yqllu{yxvvuvvvx|}{zzxvutwxyyzzzzz{{{||zvssw{~|yy{{xrkikpx}}zwwy}xtqqsuwy|~~~~~~}|ytpljlotxz{|{{{{{{{zxtqomlllouz}~~~~~~}zxutsqppqsuwyzzzzzywvvy||{xvuuwz|}}{ywvwwxwwxxxxwwvutsrrrrrpnmmnmmnppusqrstqqmc`honosnjjklllmoonnmkklnmlkjknty|~~}|zz|~wrtx{{}}|rffhnv{||||||{{{{xwxzwvwxwwz|}~}|}{zwpghrwwtrgY`txxxxxvronqwzwtsibfgkoqsrnntwn_qvvtuy~~vidz{ojcgsxuqrtwz{|{zxvvwwvusqpoonnppnorvxz|{y|}}xrqtz~~~~~}||zp`Y_kuvwwvvupfqoknuwwwx|~~{{}}}rgipqrx|ytlmruwxrtoruvusqqty{{sopsqqry{{|}}{zzz}|yyzzzzzxwwxxwyyy{|||}yvwx{}zussttvxzzyywutuyyyz}~}}{z{|nfmnpsvvvtx|z{}}}~~|zyz{{zz{|}~~{{|||{{{zzzyyyyzzzzz{||xvxy{|{|||}}}}|{{|{ytory~~~~~~~~~}}}}}}}||}~~~}}}}z}~yxwy{}}}||{zz{{zxxxwuwyz{}~~|zz|{upptvz~~~|}}|}{y{zxwx|~~{}~}{tmjhhkr{~}|tqruvurqqrsssv|}{zzxwtrruwyyzzzzzz{||{xwwy|}{zz|{xtpnpty||ywuw}zurrsuwy{}}}}}}~|zvqnkknsx{|}||||||{zwtqomkihintz~~~~}}}|zxvtrqooqrtvxzzzyyxvtrv||yurqsuyz||{zxwwwwvuuvvxxwvuutsssttspnoonnooprqrtusokhcbjmonpnlmoponmmjgknlkmoppmihjouy|~~|{{{~wqsvzz||ypcltvxz{{{zzz{{{{zz{unqvywwz|||||zyvrlfhrwsxzwoevvwxxztg_[bpzxvxr_ccgjkqvsov}{qvuuuvvxz|zvrrt~~r][iwyzuqtwz{{{{yvwxxxwusrqppopolkotx{~ywz{zwrqw~}~~|||~}~}||yn^V\lruvxxxtolupegvxqsvz}}{{}{}ugfliffkpoldfkprupvqruurnmnv|{ypqvvrpqvyyz|}}||{|}||{z||yz{|{zyyywuuttvxy{|zvy{~ysprtuwyzzzywussuuxz{{{|{z{}mdlklnruutx}}yyz}~}}}{yyyz{{z{{|}~}{{{{{{{zzzzzz{{{zyxy{}{wvxz{{{{{||}}|{{|||zwty}||~~~~~~~}}}}}}}||}}~~~~}}}}}{}zvwxz{|}}}|{|~}|xuvwvtvyz|}}~}||}|}~zwxytuyxxz}}}~}||||ytpvz~~}~~{wrjeehoy~}}}|xvvwuqmkmmoqrv{~|{{yxtqruxyyzyyyyyz{|zxxxy{{zzz}|zwuuvy{|zxutw~zvrrsuwyz{|{{{|~}|ytqmlosx{|}|||}}}|zwtqomkhhhkqx}~}}}}}|zywutqpoprtvxyyyyxwusqtz{ytooqtwxxz{{yxwvvuttuuwxwvuutttuvwvspooppponnnpuutohhloooonnnmnoqrqponmnnlijmpqnjhilpv{~~|{{|~~~xpqwz{}}{vrx{yyyzzzyyyzzz{{||vntxyxvxz{{zzywtpkjkqqfw{yxqpwwwxzoZOOYlxyxuwijmnmmtytpuz}vxuuwwxvvvsrqy{}{{fn{zw{{wvxyzxvyxwwzxwwwvutrqppolmotz}zy{{yvss{~}}|}z{~}|xl[QZpsutxzyuoovqfhwwpqtz}}zwwvzrejoib\\afgffgilpottssvqjimw{ytlt|xqppuxxy{|}~}|||{yxy~|z{{||{z{zxvutssuwz|}zx{|ztrtvvxy{{yyxwvrnotwvvvyzz}~wlhhjmqsvvuxwuwy}~}|{zxxxy{{zzzzz|}{{{{|{{{{{z{{|||{xvwz|zxxy{{zzzzzz{{{{{{zyyxz{|||||||}}}}}}}}}||}}}}}}}}}}}}{|yvz{{{||||||}~~zuvxwuwyz|}}}|{zyz{}~}||~xyzoksy{{}}||~}}}zsxy{|}~~~~}zpfgnry}|{z{||{yvphfiklnqty~}{zyurtx{{zxwwwxyz{|{yxwwxxyyy{|zxuuvxzzxuttw~~zuqqsvxz{{{zz{|~~}|xuqpruy{||||}}~~|{wtqomkiggjpw|~}}}}}}|{yxwuspoppsuwxyyyxwusqsxzxsnmortutuwxzzyxvussttvwvuutttuuvwvtqpqrrrqqqqsuvupmklmmnonnnmnoqrrqpnnonkgfjomkjijjlsy|}|{{|~~~xop|z}}|zxxxxxwxyyyxyyyyyz{~{xxyxxvvwxxxxxxvtqhb__VLl{vwvuwvvwyjNIM[nyyxxwtxvsxwxvrquqstvtrenwxtporru|~}|~{twzsqswyxyxuqnxvrvyvstvvwwvtsrrrqsv|~{|}|zwvw}|{yz}vx~~~}ymTMZrwwuz{yuommpglxvpqsz}ztomszyqsrxoZRVagecfcfjnptrsxqdfmvxwrosqpmptuwyzzyz||{{{wv{|}|zz|~~~zzyxxz{xutvz}~~|yyz}~}|{zzzz{zzyz{|xoihlonmnpuz|~~|tjbkonpvvqruvy{}}|{zyxwxyz{{{yzy{||}|||{{{{{zz{||{}yuvyzzz{{||zyxxxxyyyyyywvwyzzzzyxxxz|}}}|}}}}}}}}}}}|||}}}}ywz~~|zz{|~~}~~|yzzxwyz{}}}}{zzzz{|{{{}}{ugdntvvy{yuuxz{{z|~}|~~{ywwz{zxyz{{xnfpzvy{{zxxz}~{wphgjllnqrw~~|zxusuz}}zvutuwwyz|{yxwvvwxvtvwvtqnnqsttssss~~}{vrqtwy{{{{zz{|~~|{xwvy{|}|||}~~}{zvtrpnkiggjpw|~}}}}}||{zywvsqppqrtvxyxxxvutrswzxsnlmprsrruvyzyxwutsstuvuttsssttttrqpqstttuuutuvwvtpmkklloponlmprsssrpooomllmkffjkkjjqw{}|{{|~~~yontzyuuxxwwvvwxxxxyyzyyyyyuty{|{{z{wutvvvvunaYXVK@NnzxwwwwwwyjNGO_q{zxvxxxxx}u{|rnldiprqnkjdojjmsrv|}}{{|{zvnjkov{{xrkrypjtypknrux{zwvuuwwy{~~|{|zywy{su{{|~zq\JTtuvsvvuuqihnkozvqpqwzvkdhpy|wpnupZKJV^__dhnrsotqsurgilqtsqoplkkotvx{||zwxxyzzwxy{zzz|||{ywxyz{|~zwuvz|~}{zyxwxz||}||{{{||zyyyxxpfddgiiiilqx{|||xpbgmmksvsruwz{~}|zxwwvwyz|}}zyxy||}||{{{{{zzzzzzyzyxxyzzzz{{{zyxxxxxxxxwvttvyzzzzzyyy{{|}||}~~~~~~~~}}}||}~~~{z{~|yxyy{}~|||}zxvvxy{|}~~}|zzzzyxwwz~{mgmqonoplghnsvy{||}||}~{xwvqruuuwzzvrwxwvyzyvvz~~|wrnpponprrv~~|ywutw{~~ytrrsuuvxzzyywvvwuokmmmklnmlklmpsso~~~}{xvuvxz|||{zz{}~~}|{|}}~}||}}}|zyusqpnljhhkqx|~}|||||{zzyxvsqpqrstvwwwwvvusrsvywrmkloqqporsvyzyxvutstuutssrrrrsrrppprtuuvvvvvvwwwvspnmooqrqnlloqqrsrqomllnrqjdeikkiiovz|{{{{}~~yonswwmmrvvvuuuvwwwxyzzzyyxwst{~~}}}{xuttssuukYSNJC>BavxxwwwxxzpUKN\lwxxuxyywuyw}zongW_mrtuuladedhnoqswz}}~zrnmmnt||zvsvvmkswpnnpv|~|zxxxz{}zzx{zssvwy}{vpXYtsspqrsvsiemnnwuqootvoe_ajsvsjjqn]FBPZ^cjntxvpuqssrlommnoopokijnswz|~~}ywvxyzz{xvtw{~}zvrtvxz{{zvuuvz{}{ywvuuuvxy|||||{{zywvxxxodbbdeefhlrwz{{{ztkehnmosttuwz{}|{{ywvuvy{||}zxxy{|||{zzzzzzzyyxwwvy{{{zzzzyyyxxyyxwwxwwvvuuwzzzz{|||{{{{|{|}~~}}}}{{|}~|}}|tpqty{~}y{}|xsrtx{|||}~~}{yxxvutuy}}}}vppolklja[_iptxzzz{{zu}~}zyshimpuvxz{yyvuruy{wvz~~{wssxvusttsx~|yvutvz}}xqoprsstuwxxyxxwtngglmmjlvyuojlptsl~~~}|{yyyz{|}}|{z{}~~}}}~~}}||}}|{xwtrponmljimtz~~}}}|{{zzyxxvtrrrsuvuuvuuuttsstvxwrmklnoponnoswyzxwvuttuttsrqppqssrppqruvvvvvvvvvvutsrrrrrssspmllmnqsrqnjhimqqlihijjhinuz{{yy{|}}xomsqrqpqsttttuuwtwxyzzxxy{{z{~}}|zytqmnpsum[MFECNcs{xxxxxxyyyfTO]frxxuyyzuloquusskYblswyypq^b``dcbcjv~{qmopqsx|}zvqptvvvvpkmrz~{yz|}~~{~|vrpvwz}}z~olwssrpooutojnnnsrqoortnid^cimjeiloeLJZ_cltsvyuqussrrosnmkmouumkjnswz|}~~}{{z{|}ysruz~|upruwz{yussuwz{|zwutsssuvwzz{{{zyxvttvy{tjdabccdgpvz{||{zxxlhpqsxyxvxyz{y{{zxvutx{|yvuutwzz|||zyzyyyz|yxxwvz}}|{zyywwvvwxzxvvxwwwwx{{|{|}}}}||{{{zzz|~}}}~}||}|{{|}~~~~{sllpwy|}}{{}~}{wsruy{{zz|~~|ywwvuuuy}|zzyvslfegdXS]muvwwwvxyysz~~udacluvxxxvwuqnsy{xw{~~{xrptz|zyxx{~|ywutux{|yrprssrrstvxyyyyulfmuvtidq|zrjknpoj}}}||||{zz{|}~}||}~~}}}}~}}|||}}|zwusqponnnmlov}~~}}|{zyxxxwvtssstuvuuttsssssstuwvsolkmnonnmnqtxyxwvuuutssqqonoqstsqpprtvvvuvvvvutsrqrqrrrssrpmlklnpqppnkklmppmkiiiihhkry|{yxy{}~|wplqy{wsrssttsuvwwwxxyxxwy||||}}|||{zysjdhlptukXW`gpwyxwxxxxxyyxvkemdswxuyzysfclqtknljikrwyz}t[ZVX^ZVR`r}rjimorv{}}{qjnpvzwvngir}}yzz||z~{xrpwx{}}{zvuyutsqopsqpmnnnpqpoostqklc^adbaijnj`ftgjsxxwvtttssqqksrmkkpvvollpu{|}~}{yz|~zrquxz{{yrqsuw{zustwyzzzyuttrssuvwxyyzyzywuttvvwupjdcddfkuy{|}|{zy}xtsuxzxvuxxxyz|{zxwutw|{vrqstuxy{|}{zyyzz{|{{{zz{|||zyyxxwvvvxyxwwwxxxxy{{||}~~}{{zzzzzz|}}|||~}||||{{{}}~~}wnmmwyz|{||}{xwxz{{{{xvvy|}}|ywwvvuvx{}~|xxzxtkcaddZVfz|yywvvwyyx{~ub][cswxvtrronnsxzxwz}~|wq`fw}|{zz|~|ywuttvy{{wuvvusrrsuxz{zzyupw~{wg_rzojhhjkkj}}}||||||||}~~~~~~|zyyzz||}|||}}|zwusqpoooonnqx}~}}}}{zyxwwvuutuuvwwvtrrrrrrrrstvutqnkllnmmllnquxyxwuuuttsssqnnprtuspoqsuvvuvwvvusrpoonnmmnopoonnnnnmmnnmnooonmkjihiihhnv}{xwwy{~{uomt|xtttuvuvxz{zyxxwxyzz{|{{zzzzyzysi_ahktyusqxyxxxxwwxxxxxwxywurhqtuvzzyuoppknoopnljprtzzveWPV`[VRYiz{xrrrstx}~{l]drttuxrllt|unrv~x{~|wzw{t}~~}|zzzxwvyxtlhqqqnllonnqvurlrjded_[kiiihjlknuywsrttuuqppitwqklvusqqrvz~|ywwxz~|ustuy{~~xsssvzyuuvz{{zwuuvwyxxvwwvuvvwxxxwxxwvuttvodckptzz{|||zyyzxttwzzxvuxtsy~zyyxutw|{tmnsxurw{|{z{}|{|||||{|||{zyzz|{xvuvvwxyxxxxxxyyz|~}|{zy{zyyz|{{yyz}|||{{{|}}~~}zqnjqxz{|~{{xrsz~}{xvvxz||{zyxxxwwwwyzzxwywsi^X]kjeq~{zxwwxz|~{r`Z_pvxwtoligiotvvwwxz||wo[^m{~~}~|ywvvuux{|{zzywurrstwyzzzzxw{}zuhcwsdfdehhhj|||||||||||}~~~}{ywvvvwyz{|||}}|zxvtrpooopopsy}~}~}}|zyxwvvvuuuvwwxwutrrqqqqqrrtuuspmkklmlkkmorwyxvutttuuurnmnortvtqoqqstuuvwvutrpoonmmmmmnooppqpnlkknnnqsqnkjkkihijhgktxuppqsx~{unmt|xwvwxy||}}zyxxxz{zzzyyxwwxxyzzxvma\htyzzyzyvwxxwwwwwwwwwwwtspplovzyywwyrfjorsrkdkihxyyu[PYigaZSas|}}|xvvy~~{hW]nootywvv{|slqzxxxyzxuwtv}z~~}|{xtrxzxrqrrqomlmlfituokxuqrnf\gkedghimpsusruxxvtrmtntusor|xppqv{~~}{xxyyz{}xvwyz{||vrrrtvutwx{|{ywuvxxyywuvvtsstuwxxz}~{yvtvwunlqxyzyzz{zyyyxwstvwxxxswwrz}xxyyvz}|{vonovxwz{{yxwxy{~}||}}||||{zzz{{|||{yxvx{|zyyxwvstxz}~}{zyz{{yyyvssuwz~|{{{{{{|}}}}}{xtrjox{|}yxvpt|~}}|zxwxz{{{zyyyyyxussuvvuwvskdchsstvz{zzyxxy{~~~|xsf_m{zywtrqomqwvssuwwwyytk\\fy}}~|zxwxxxy{}}|{zwusrrstuvwwxxyzyxulennggfghhil||{{{{{{||}}~~~}{xutqqrtvxz{||}}|{ywusqpooppqty}~}}}}|{zywwwwvuuuvwxyyxvtsqpppqqrrtsqmkjkllllllouyxvtsrsuutplnpqstvtrqpoqrtuvuutsqpponnnnnnnopqssqnkjknooqrpliilljiijihinojffims|{vpns{~}zwvwxz||{yxxwy~}zxyxvtstwxyyyvqspfpxyyyyyyxyvuwxxyxxxwvuqoqtjagowyyxwvxtxwvwvmgnmkx|}}dU\nuobP_pz}}zxy{~~}xhY\glqvy{|~~vqy}{zz{zxxx{~}{smvyxwvusqqppol^`kpomxyyzvmaajeacksoqsstwzyxvsrlwoppruy~|snpvy|{z|}~~}{{|{z{{xx{}zyxvssqpqsrsvy{{zwvtuwtpoqsttsqpruxxxz|}{ywusqpuvvwxxyyyyyyyz|zwwwtstxw{{zvwzxxxyx}{zwssxuuy~ypmqqsuu}}}}}||{{zzz{{{{{}~|{xy{|zyyxwvstxy{|}{zzz{|{zzuoklruy}|ywy{{{{{|}|{zywxwppswz{|ywvsw{{{{{||{{{{{{zzzzzzzyxwvvwutuvwsrwxxvuuuxyyyxxy|~}}~~||zupkw{{ywvy|yuuvroruwvvvsnkddiy{{}}{yyyzz{|}||zxvtsrqooooqstvwwwwxrgfmnjiiiijo|{zzzzz{{}}~~~|zwrpmmmoruy{|}}}|{ywtrpoooopqty|~}}}}}{zyyyyxwvutssuy{zxvsqppppppqssqnkjjllllkjmquvvusrrsturnqsttuuutrpoopstuttsrrqppppnljkmoqrrspnnmlnonmlkjjklkjijkjhhiiechmloz{vqpsxzyvttvy{|~~|zxxwwy|{wtyxusrtwyyyxqimrswyyxxxxyyzsgrwxyyxwvusnljgafadsyx{wniz}xwyyvibfqyzxttdZpvvmXety}|{zz|~}xwqdckosx{~{}}~}{yz||wowywuutpnqrsrnjilprruwxyum^Ziddkmrorstuwyxvtrrsxpknrw{~zuposwzwuuw|~~}|{zzz{zxxz{{ywttspnnpppowzywvvusrponoqrrqonquyywxzzyxwutqlkqtwzzz{{zzzzz{{{|~qhoxy|{qpxzyxzzyyxyyyyzyvxzuolkpqsv{|{{{{{zzyyyz{|{yw|~~{xxzzyyxwwwwwxy{||{|||{{{{yztkiqx~}yxy{{{{{{|{{yxwyzvqotyxyyvvvxzzyyyz{}~}{{}~z{{{ywuvwvutuuxyywxxwuqpvzyyxwx{|{z|}|{{xusw{{zxwvonnlpuvvwvvrnnnkry{{|~}{zyz{|}}|{zyxvtsrpljhhkortutuwzxsponmkihgkp|{yyyyz{{}~~~}|zwrnkjjloswz|}}}|{zwtqoooooopsx{~~}}}}}}||{{{zxwvtsqsy|}{xuspooooooprqnkjjklmlkijlptvvtqpqsvwtuvvuuuvtsrpoooqstssrqqqqqqpooqrrrrqpmnsqmnonkhhjlnmkjjjjjhgjigaekimy|xtsuyyusrsvyz{}}|{yxwxz~~|y{{ywwxyyyywqjfhqtwyxxxxxxwpbfswxxwvtrpmi^gmrnjntvzzqfv}yyz}|unouzyus|wkvxzvkqxz~~{{||}}zrjijortvz~~~|z}|y{ytuxyzwwvvvsqpptuxxxxxtl]Vhmkqqqosuvwxyxvtsqotrjoprwzwpklptvvwxz|~}|ywxyzzxwvvwwwuuqfdkopolkpvwxwwx{{wsrqrqonnquyyvvxyyxwutvnjptwz{|||{zz{{~~}njux|~~|sswrsvxvuuvyxvvvwyzzxusswxwxyzyxxxyyxxxxxwwvrmu{|yyxwxyywvxyyyyzz{{|||{zxxxyzvonsz}}{zz|||||{|{zzyxx||vqqvzzxuuuwyyywwy{}~|zyz{{y{{zywvuuuuvvx{}}{z{xvqquxxyxxyzyxyz||||zyxz{|{zz~{okmptqlr}|{vsrstpv{{zz|}~}{zyz{|}~|{zywvutrokhedgotrrpqv}|yvttrlgdcgn|{zzzzz{|~~~~~~~}}{wrnihhilrw|~~}}|{zwtqonnnnnprvz}~}}}}}}}}}|||{zyxutqrvz}yvurpooooonoqpnljjkkllkiiilquvwtpoptvwwwwvuuvuttrpomoqrssrqppqqqppqrtsqponlnvtnnnnljijnpnlkkjjihgiihehgfn{|ytqtwwtrtwxyzz|}}|yvwy{|}~~|yxxyzzyyxwxyqbalvyxxxxxwwvjeqwxwuuuqoojfquwxrlpvuromr|z{{}~|zwx{yvvyyxysppsx}~}}}}}|yxvrrstvz~~~~}}~|yqsw~~|ywwxvuuwwwvuuvri\Reyornmotwxxxxwvuusstpgqnilxyqlklptxyx{|~{yvuvwyyxvtrvwywwuifmrusohjqvxz||{soqssrpopsvxxuuwxxxwuu{tqwxxyz{{zzyz{|}}}|ytt|{|zz{z{vjkrwvuuwyvqonsz}xwzzz}}yyyxwvuuvxxxwvsokiicnxxwxzuvyywwyzzzzzz{||}|zyvuuvvxuuw{|||||}}}||||{{zzyx|~zvqu{xwutuwyyywvwy|}|zwvtsvy{{zxxwtrtwyz{}~~~~{xuuuvwxyy{zvtvy||}}|{{|}}||}}vmqvwzrmv~}|wxyzysvxzyyz|}~}{zyy{|}}|{zyxvuusqmifcfqvsqmkr|}zyxyvlc^]_e||{{{{|}||{{{{|}~~~}}{xrnigfhkqx}~~~~~}{yuronnmnnoqsvz}}}}}}~~~}}}|||{{xwutuxzxvuspooooonnponljjjjkkjjiijmqrvvsplosuwwwvuuuttsrpnmnppqpppoopqqpommpollmppqutommnnljjmonmlljhhhhhimnphgq|}ytnpsssvz{zzz|||}{wtwz{zz}}zwusuzyxwwwxxwngpvxxxxxxvvytptwxsrturosqiknywrmptsrvssyz|~~{yvuy|{{uuuthikov|~~~||}xopsuw~~~~~~~~~~}~xprw{~|zxwxyxxxwvurstwri[Qb|pommotzzyxwwvvvwotxlkhachpromjlrvvpu{{vvttvyzyyxvsvxzxy|xojpsrqnmorvz~|qostttttuvutttuwwwwwvtrlnwyzyyzzyzyz{{xxxwxz{{|{wvz||xkhpuwxwxxtnihnwywwyz{||zyxvusrstvwxvusnc]^bluvuy{tuyzwwzzz{|{{{||}|xtrttvvxyz{}}{{|~}}}}||}}}|||{z}~}ysrrsrrsuwy{|{wuvxzywtrrruyzzyxwvspqtwy{~~~~}zwtuvspsxxtsvy|~~~}||~~~~~~zvy~zvz|}}{|~~{ttwzwxy|~~}{zyyz{|||{zzzxvvvsqmkjkrutrkditzzyxvoc[WYVU}}}}~~~}|{yxwy{|}}}}}|wrnjhhimtz}~~~~~}|yvsqponmmnoqux{}}}}}~}}}}}}}}}}{zzyyxyxwusqpooonnnoonmkjiiiijjihijmpttsqpqrttuuvvvusrrqnmlmnnopponooooomlknmkimrtrpqpmmnpplklllmmljgfghhipunhhs|}ztonpqsuz{zz{|{|}zvuvxzyz{|yxursyywvvwxxxusswxwwwwxxxxwvvxupjstrpuwomptvrnoqrqopsxz~}zxuty|}|{xsjkmhhlqw{~~|{zyww|~~~~~}~~~~zsrvz|zyxxyyyyywusrtuxwh\RXlklnomsz|zwwwwwxxsrzmNUXfhpqrqkkqtsnqz~wstttvxyyxxwtvyzyz~ogimppoqrqq{{tzyurututvvvvtqruxxwzxwusrkoxzzxwyyyzzz{{zzyyy{{||{ywwyzwtnopuwrsvtlffimwuvxyz||zyvtsrqstuvwvusqbWZdruwxy}xtxyvtvxz|}|{zz|{xussuvwwxz{|}}}}}}}||||}}~}}||||}}}|vropqqswxzz}zutstuwuprruwzzzyxwwsonnpvx|}|}|vstvqlinqtswz}~~~~}}~~|y}~||{{}~|}~{vvvyvwy||zyyxyyz{|{zzywvwvurpnnorssrjceqyxxwulZPVVMF~~}yvttux{|}}}|zvpnkiijov|~~}{xvtrqpnmmnpswz|}}}}~}}}}}}}}~~}|{{{zzyxvtrponnnmnnonmlkihhhjjihghjmqsttttrsstuvvutrponlllklmnpqqqppoopmljmkjhlrsnjnrnlnrsomjikllkigfghiksupkls{|{uomnopqwxxz{|||}yuuvxz{{zyz{xnnwywvvwxxxxxwxxwwwwxxxxy{xnehjstsrvxtsuuvspmlnqppuwz}~}|xvwy}|vqg^]`kpuy}}{{|~~~~~~~~~zuvwyyxxyzzzz{yvrsvwymc`PO^dhjjjouvwvvwxyzzxpfU=8Qksrrrtwxyyxwvwxyyz{zzzyxwwwwwxxyzzyyyyzzzyyxxwwywrk_i{xotypcUOLOW]dkf_muvl^TZalsa\cinqtuvytmffidXSHBBPQisi]moiuz{{{{{{{{|}}}zy{|{{{{|zvsuxvtprtvwxxxxxwvwxwvtpmjlmoqruuvwwyzyoffhjmqmilllhffgcefedec_`elpsutollki\Vfrvz{{{{{zmciqvxz{|}}|}~~|wrnkkmjjlnk`Z]flqtvvwxrgffhjnoppnllpuxwwvusqqqqsuvvux{}~}}||{zyyyxxwuromllkmpppnjhhiijjjjklllnqttrnkiggghkpvyyyzzz{|{{zyxwvtssstuuvwyyyyzzyxvutsqnkhgggggggggggkpqqnllmlid`_chpmkjkjfdaacc`gimmmmlklmoolnmgfiijjlpssqpmjjjkllkfdfajltyzupnquvwxxxxvttstuwxzzyxxxxxxxxxxxxxxxxxxwusuwwwwwxwxxuwz}yqxttx}~|~~}pqvy{xuqvxrsz{|xz~~~}|||||||}~|{xpYAWmXNUbgglvxvuvstyytpkjllmmmnpqstsrmlhgjllifkqsqtuvuvpotxvqsssqonmwyxxqijiwr\TU_nX`^Ve]RE?>AVflklotwwxz{xxzz{zyzzzzyxxxwwwxxyyzyxxxyzyxyyyyyzsurTOoykpth\WPMNVfnljhhikkb^chsvgdlmnnppptpmhjl]GEIMIKZov`Mc^[v||}{zz{{{|}}}wtz}{{{zzyyxwyunimtwwxxxwxwxyzyxurnnnpqrqrrrqty|{mehkggmiadimlihjkospophbbfkouwupjeabdkvuuy|zyzyynex{yxy{|}||}}~~zvrlgjpllmki\Xansxzyxzwnkiiptrsrljmorrstrsqnmmnprstxz|~~~}||{zyxxxxxvtpnmllmpppmhgikkkjjjjklnoswwtpligfeefjqwyyyyz{|{{{zyywurqqqrstuwyyyyyyyxwvutqljhgffgggghjlmqrqolmpmkigeikmmqmjkjgdfhgbbglmmlllklnmllpleiklmnprsqpmklmnnle\^fgilqtxtqnquvwxxwwutsstuwyzyyxxxxxxxxxxxxxxxxwwvvvwwwwwwxvwxwux}zy|zy||~~x{}|xwxy{zvx{|zwz}~|x|zz~~~~|||{zzz{|}~~~~~~~~~~~xldmo`NQ]gektwturguwspljillprstussstsnplgmnoskoutrrqqtyolwzvprqonmjoz}zmosyta[Y]osg`cdaXIGC[bfk_fmrwvrx|vr{{{zyyyzzzyyyyyyyxxwxxxwwxyxxyyzyywuxr[KVjiom^ZUPKKQV]]UbdVdgemrvywnmrpmgpflqnompsojdJR]PWinYK][Yp~|}zzz{{{|}~|zyy|}|zzzyxyxyvogktvwvutwxyyz{zxvsrqxyysoonmoqx{}qdiweagd`bhmqlelruuutnkcbjouvxxuod^cmx{xuxyyxyxwsvxyyyz|}}|||}}~~}zzywwxwqmmliedjqy~}ywwvvustuvttpiejmjpurqrokihjnprs||}}}~~}{zyyyyyyxvspmllnpqpojjjkmlkkjjkmopswxvpkigfedehntwxxyy{||||{{zxvrpooppqruwxyyyyyyxwvurmjhfeeffggimqqrrqollmkljjjifabf`[_gjlpqngbdimmllkjkkkhfegirrqqrrqqoopmmnoolh``efhihjpspmptvwxxwvtsrrsuwxyyyxxxxxxxxxxxxxxxxwwwwxxxxxxwxywuqos}|tuwzzzy~uwzzzyyxz|y|~|z{~zyw|~}~~}|{zyyyzz{|}|||||||}}}}~~zrtufPP\hjlqtotjnookhhghlmvvsqpqssvuprpilyqoosvtrpopqwketxwpnmlkihr{vjtmas{{xp]YYMorohhf_UHEWTfSYjkfetlm}gYtmuzyxxyzzyyyyyyyyxvvvvvvwxxxzz{zywutj^SRVTqvg]SPOOORY\NKRlgUexxx{xrswi^a]ltrurqtxvrcLVg`\deZP``Vcwz{wvyz{|}}}|{z{|}}{yyxxxzywtnpvvvwwwxzzzyyyyxvtrsnkjiiikjfer~ykh~ukonifimqppuzzxvupmfjrvxxyyytljpx{{yxyyywwwwxz{{z{}~}}|{|}}}}}||{{~~uomnmjinv}zwuwz}~|yxpfbhkhntprvtjhginpqr~}|{|~}|zzyyyyywuromlnpqqrrqpnonmkjjkmprsvxvqmlkifdegmtvxxxy{|}}}}||{xsqonnnnpsuwxyzzzzyxwvtolhfddefgggfilmmlkkkjedehkkf^ZZYX_dgilpqkefhjklnomlljgbchnxwutsroljknnnnnnmkheaeghddflomptwxxwvustrrrtvxyyxxxxxxxxxxxxxxxxxwwwwwxxwxyxwsmloorxvqqswxyy~rrtuwyxtw|{||y{|xtvzy~|zyyyyyzz{{{{{{{{{{{|||}~z{pUS]hmmnsvpfokiedfgjnsvtrsuurqwvqqrjjvpprsuqooppom]RmrwollmljilncN]WTju}znU=<>]omkjjf\JPQSZA`fedfg^djUASTnzzwvyzzyyyyzz{zywuuvwvvvwwy{|{zxtk\VVfnIdym`WVVUTUXXJ>EjXRrpuuy{seX\TLHfwpvsstxzujhnlrsk`]\ebWRSeuxwwxz{|}}|{{{{|}}|yxwxyyxuqquvxuuwxyzxvuvwwvuwrikmmnlf]_br}}sm}|wwvrommnqtvxxwuutsqsxyxwxyzzwx|~|zz{{zyxwvvwy{{{}~~}}|{{{zz{|||y|vpmnnllpy~~ysru}}{zqfcjmloqpprphhjnstss}|z{}}zyyxxxxuspmlnpprtwwvsqpnlkjkmprtvxvspmlifdehntvwwwxz|}~~~}}|yurpnmmlmoruxyyyzzyyxwuqmifdeeefeffhlpollmkg]W]ckomfb``bgb^\`ejhedefhkorpmlkgimmhmruvtroljjlmmmkllkkf]dghca_jnmotwxxvutuvtsrsuwyyxxxxxxxxxxxxxxxxxwwwwwurqtwyrgbdnvutsuqpsvy{~sppruyyrortx~}zx{{wsuy{~|zyyxxxyyzzzzzzzzzzz{{{|}x`Z]fjnnt~jfgghffgjnqyqpuuvpgoxxpqtmjkouturgghlhd^MBciqlmoqplijbYXb`fbmz{l_DAELV\afndONSTKBIRets^[nhjejrtk`UMOSUiqrhZNMMNQV]`__`__^^]XW\bb_V]^MWfjnijmmhjsvtwwgjnrtwvuwppnnkeiljrvz{xsutqmnrtrqpfTKUmxtrigtOJey|vspptwzzzzz{wvvtqvwxwvtrsuxywpc]esvvqkggkpvttuvxz{xsmlrutx{|||zz{}|tpopqssrssrojfdfp}xkghpuxvwxyzzz{{{zxsnnnprsuwyyz{{{{z|}~|{xvuusrtvy||ysmihjpvtpowoaZ]jqrpnpqnlnorutsrzwttutrqonnnnoooonkigfgimpqpponoqqsqrtuxyxwwwwwvuuuwy{zyxyyxyyzz{{{zyyxyywtplklmmnnnoqqrqrspmmnprrpmjffjppnmf`ahnlhfgeamkika]`]Z_c^][\^bglmmmlkjjjjijmmmkkklmlljhhdjy}}}||}zwtsvxyxvtsrstvwyyyxxwwxxxxxxxxwwwwwwwwwxxxxxxyyyxxrjbkrniiglrtvzzxwz}}zyz{{|{wusuz~}|{{zzzzzyxwwxyzyzzzz{|~~|zzyyz{|}~}||||{{{zzyyxxxwvuuvyz~pmlmminc_gSVT_umfYa``ejhggnuxusrtpeSMHDPZ^ac^L@CIPMGQevwi\bplrpryr^SONOT`lde[QLOPRVZcgc``____aabghfaTSVOT]frmlotlhywndtoimtvwvuuqtsruqkbanuzz{vwwvstxxwsshZ^bhossfbv[QXYitonrw{}|{z{{ywwwuwxwvvtstuwxyum_euttpkgeimstuvvwxyyupptuvx{||{yz}zvnkkmqtvxwofdccggglkjnpuwxtsvxwuvwyyyyxvtrrtvvwyzz{{zz{}}zwuuuvxz|}|yuomnopvytu}kbbjomlnrpifhjmpqqrzvttuusqonnnnooonligeccegjlnooopstuvvwvwwvvvvwwvvutuwyzywwwxxxyyzzzzyxyzzywtpnnnnmmnoqrsstsrppopsssplfekrurj`aclpojd^ZWed`\WYcba_[[\[_adgklllmnkkihilonkhhjllmlljjhn|~}}|}ytrrwyzywtsrsuvwyyyxxwwxxxxxxxxwwwwwwwwwxxyyyyyyxvvslpuojhhhghlt{xssy{{wolvz|{wuu}~}|{{zzzzyyxwwwxyyzz{{{|}~}}}}}~~|{{{{|~~~}{{||{{{zzyyyyyyxwuuwx|ommmomrgij_SOSmmp_][Z_dginwzzvvvxsgTOJGW_`boraGCHOQZbpuukhoxjplpvnZQQUYYa]QVROQSVZ`fli`]\^__afkopmgbXSSW`imqonnprmw}nZmvlkruxwwvvtmtwph`Ygsts{yyyyxxyyxtsidfmhhsuc[|vaJ?\uvuuy{{zzzzyyzz{yyxvvvvwwxxz{|{omqqqojedfinuywvsuyzxttvxz{zyxxwxytpgeehnsuvtqmkhefaVRVetwxz}~}zwspoqtvvxz|zvtwyxxyyzyyyyz}}zxvuuuxz|}|zwsnmmmrtrrszpheeeejqvogehhjmmmiyvtuvusqonnnopppomjgecbcegilnnosutuvxyxvrsvwvvvwwvutuwxwvvwwxwwxyyzyxxxz{zxvsqppomllnoprrrrrqqpoprusnhfimpmifimsqnke^ZVdheb^\aZ[^Y[\\``bejmmmmmlkhgjmppnlklmmmllnpns}~~}}||xtstyzzyvtsrsuwxyyyxxwwxxxxxxxxwwwwwwwwwxxyyyyyxwusoiqrkfefghfgpvspsxzzwplx|}|z{}~}|{zzzzyyxxxxxxyyz{{{|||}}|{||}~~}|||~~}{{{{{{{zyyyyzyyyxvuvuynlmmnmuqidkXRQYesd^[XZ`fhrxztqsptukc_UQ`dbeihTEHP\aqrpidivutc`alsk\VX[^`TRMOQTVX\`goodYY[_``djnookc\Z[\eqsphjpnnqswl^Vcwpektxwvupe[imilqadnnkuzyyy{zywursjdgspnwv\QypTII_nltwyyxyz{zyyzz|zxvsrtwyzzzzz{wy{tplhdbbfkpwzwrnqx{wuvwwxxvttuuvwvoga_biosolmkb\]``ZU[kwwtrruywuqmlmorstwyyvuxyyxxxxxwwxz}}{ywvuuvxz|{{xtmhfglu{woqnea`_aioromlkjjiiifyvuvwutqonmnpqrsqnkhfdccdfhjlnptvutsutoomqxyvvvxxwutstvvuuvvwxywvwxxxwwyzyxwuttrpnmllmmnoooopqoigkqroighihihlrtwsokd^]^feZ`__dggc[[^^^`aejnommmmkiilnqrpnoponkjlptvy}~}}|{yvuuwz{zxvtsstvwxyyyxxwwxxxxxxxxwwwwwwwwwxxyyyyxxwurqoqppomjiikptvtssxzywqqw}~}|{zzyyyxxxxyyxyyz{{|||}||{z{|}~~}}}}~|{z{{{zzyyyyyyyyxxwvusqmllmmmpod\a]WWZ[]_cn`_gheln`]Qg[`fjf]_addbfjgb`T_k`mppkjqsi[_ehnqj_]`b`^^`\X__[_adhd^`YY\cbcehjb^\VVY^ahmeibkojnurvxcSZuvkjlprslbb_^dimmlnpkcl{wrsvvrlinrkbhux}ynMEkbW_\chghnsvrtz|{yyyz{yurnmqvyywyxxyyyvromlidahosvvtohm}truxvruurnruvvxwslaZ]djqplsrf_^]^cglrwsljkorstvtkgfkqtwxxutvxyyxvuvwwwy|~~{ywwvuvvy{|}{wqkfgltxwurnga]`cjptrpnmlke``^~yvuvwvuqommnpstutpkhfddcdegilnpruwurokfjlszzxwvvvvtrqqstuvuuwy|{wwwvvvwxxxwwwxxvspnlkkjjklllmnlfbdipqmjhfdehnuvvqomcYX]^ZVX^hmne[Zbgfca`djoqponnmmnppnmnpqqpojjmrvxz{|}}|{xwwxy{{yxvuttuwxxyyyxxwwxxxxxxxxxwwwwwwwwxxyyyyxxwvttsrsstrpopsy{{zwwz{ytqty~}|{zyyyyxxyyzyyyyz{{{|||||{z{|}~~~~}~~|{{{{{zzyyyyyyyxxwwvtqolkllmf[fb`ea\\]]bfjopnmjbdf\`NMOV_iiVU]jliiihjleiojmnmmmlkjaagjtylddghbUV`b]cb]cfged[`bYZW[kf][XUSPRW\]ij[i|uifssrw}r\Woxlfdbjnc^eaX`fc`hjmj]evncdgfb[[hoi]bsy{qYI@X_[Z^pk\aVgxilwz{yxxzywspkkoxwpjosvxyxvsqrsomlqvwuronknsmottrpqsrrw|{wzywpcZ`ijquswxre\]bjqtutphccgjkmprkb_emquvurqsuwyvustvwwy|~|zxxvuvvy|~|yuppsuxywurja^djpuvspnmljhkh_~yvvwxwurnllnpsuvurmhfddddfhjmnnmswxwojkootyyxwutttsqooqsuwuttwxxwvuuuuuwvvvwxyzyurpnlkjjjjjkkkjgccgoqnlidbcgntusnmlbXXdfa[Zeqn`[]`diifc`ekprqponnmnookjkopnmlklpuwxy{|||{zxwxyz{zywvuuvwwxxxyxxwwwxxxxxxxxxxwwwwwwwwxyyyxxxxwxwwwwvwvvwxy{{|{yz{|xtsw|~}|{zzyyyyyzzzzzyyyzz{{{|{{zz{||}}~~~~~~}||{{{{zzyyxxxxxxxwwwvtroljnnne\\_ddc``bekkZHimfa\\_YdcYQV_mk_acoofehmprqpjjnomkikolkijkoshcfjkd[YZUT\[Xdjha_ZUZWUMMbYY`TSUPSVYY[ZXoqjbksqxzzweZpynhfdmqb^a_TZaa_cghaZ_kaXXZZYTTYa\M\uxr]??BSc^UHDGWeN\q_dpvxxxyzyxtqnmpurnidny~zzxwvvvssvwyxvsolnurnloqnnorrt|~zvwtqme`foqswropwp]Zeovxwtpha]^achnpkaY\diprrooprtvvtrruwxz}}|zyxwvvwz}~||zwxwwxywwvogejpwxurnlkjjn||yzwwxyxwrnkjlosuwvrmigedefgjllmlkpuwvroqsuuuwyvsprsrqnpqtvwtrqroqtttssstvuuuuwxxvssqpnmmlkjiihiihgfiqrmjhd_`fotvtpkid^_ejeZWbha`deacfeb``flpqpnmmlllmnljknmkjknpsuwxy{{|{zyxxyyyzyxwvvwwxxxxxxxwwwwxxxxxxxxxxxwwwwwwwxyyyxxxxxxyyyxxxxyz{zzzzzzz{{xxy|~}}|{zyyyyz{{{{zyyyzz{{{|{{zz{{|||}}~~~}}|{{{{{{zzyyxxxxwwwwwvvusrolmmaNGP[ccccejmpbPABUPVVWZYW`b[_grqoiT\]X\llksitqprqonnommnpmlifcafki_YY][V^\[hlfYY[NNLKOIQO]kUPUTVXXVTRQbZ`bbamwwwxk_qvjhhhmphb[YTX`fhffbYWX]ZTSVY\\XRVTKWtypkWHH[i^X?=Pa[M^s`\bhpvxyzzurqpnkignqmtvvy{|{{ywtvwwwwwwuvrvwvvuwsopqrtzyvrspmfghjrxvoehqsoa_jsvwwrnmeZW[biqsnfZPS\hnnnopqrtutrqtvy{~}|zyxvuvwz|~}{yzyyxxxyzxxwtonpsvvtpliffgfqy~{xwxzzxsmkikosvxvqlgedb`dkonjhklosuussssutruxxsoqrqoprrpstqonnmmprsssstuutuuvxyussrpooonljihgghhhhjprjfgf__emuwxrkhfdeegd]Y\ilhjf_aig``aflnnmmmllllmmllmnonopstvvwxz{{{{zyxxxyxxxwwwwxxxxxxxwwwwwxxxxxxxxxxxxxxxxxwwxxxxyyyyzzzyyyyyyyzzzzzzz{{{|zz|~}|{zyyzz{{{{{zyyxyyz{{|{{zzz{{{{|}}~~~~|||||{{{zzyyxxxxwwwwvvvvvtqooon^TU_cdeglnutP:BFKOUVV[[`ST^itxk^TCEJYbjcNcXhovvrnmkkmpwtpph``aglg[VTUZY^agnnaLFJJNRSNEHU_aWKSW\_ZXUSXaX_`]aowxxunkzmWWgjouup`^[Y]add^ZWTR[aVSWY^^YOHOYQWpmliKH_gRQZh{cMMdxhPM[kvxyz{shprqnjkpvxwvrqx{||{xvvvuvxxwvvuvwwwwvtrqrstwtspoqojkmpuwvointof__ktvuunjrjZW[cjnnmh\PKThnoopqqrtttsrtwz}~|zyxvstvy|}{yvwxxyxxyyyyywvtrqrqqnjgc`]W`qw|yxyzzytnkjkosvxvqjfdeeehpsqlhlnorsttssropruwwrnprlighilqpmjjjkknrttsrsuuuvvvwwustsqppponljigggijklnoheiliddhmpwumihiigd`Z]fpohgeb]`c`_aekmmnnnmmmmmnoppopqstvvwwxyz{{{zyxxxwxwwwwxxyyyxxxxxwwwwwxxxxxxyyyxxxxxxxxwwxxyyyyyzzzzzzzzzzzzzzzzzz{{{|}}~}|{zzzzz{{{{{{yyxyzz||||{zzzzzz{{{||}}}~~}}}}||{{zzzyyxxwwvvvvvwwvusrstoc_`bgikoqp{fKCEJPXXP\_NQ\kswupTG>6?WiroZIO^iyxqkihjmtwwsod^_cmodVMLLJU_fkpg[SGGLS\VVYX^cbSKLQ_edgc`^SZa`cnwxyz}yvv]LQ]emttrfecWY^eaZ[[[Ydl\RUZ_]YWSSUNBLRWimga_hknrrtvltvyz{wsqqolhgg`]dZ\_dhkcTWVZfgmrpd^[Y[^fnb\cnYWebdek{}}||wpnswyurwupz~zzxtmjgknqvyvtvqsqf^fwufkv}rhfkstpquz{ypgnmlsjegum\_kuxxxyxyzyyxvutsnmllnvz}{{z{xcFJWfrwwwvvvvvvvvvvuttttttssrqqppqqponkifb``dovwxxxxxxxxxxxxxyyyyyyyxyyyyz{||}~~~~~~~}}}}}}}}~}~~~~~}}||||~}||{zyxxyyyyyyyyyxuqkkiknnmllpsrpppqqkfdgkmorqppiknoppqqpnmoqqpmloqqmmnnoomllkjjkklllopqolgdbabilic_`fqqfccillgbchleafgfddg_[_fgfffc`a`abbeiqx{{zzzzzzzzzzyyxxxwvwwxyyyyxxwxyz{{{zyxxxxxxxxxxwwwwwwwwxxxxxxyyyxyyyyyyyyyzzzz{{{{{{{{{|}}}~~~~~~}|||||{{zzzzz{||{{{||||||{{zz{zzzzzz{{z{{||||}~~~|{{{{zyxvvuuuvwxwvvtsppruxvmgtrSAXUT`cUT[[IB^zofCFKWTkkonhZ[eomj\^^lswy}~|yvsmfge_cfagiic]ZSQQWbiqrq_MSUUZmp`YSaVVka[]kz|}~|tk_jzynotvsz}y{xupontxwmjnrrow{o\Vovhirniuuw{|zzy}}}tihrm`V][yoflntxxwwxxxyywtsrsoibfkv{}|{y{xm^dlntwwvvvvvvvvvvvuttstttssrqqppqqpomkheb``cmwxxxxxxxxxxxxxyyyyyyyyyyyzz{|}}~~~~~~~~~~~~~~~~~}||||~}|{{zyyxxyyyyyyyyyxuqoonpqooonnqonppqrmgfhknpqpptpppssrqrromlnppmllmnoprssolllmoomkklmooomgdbabcimiecdgmk`_ahlkiecbgiklqmjqvjbcdffec^]abcccfmuz{zzzzyyyyzzyyxxxxwvwwwxyyyxxxyz{||{{zyyyxxyyxxwwwwwwxxxyyyyyyyyyxyyyyxyyyyyzzz{{{{|{{{{|}}}~~~~~~}}}}}||{{zzzz{||||{|||}}||{{zz{{zzzz{{z{{{||||}~}|||{zzxwvvuuvwwvvvutsrrtvvofpnO>OSPY]TTNBH;^sycGf_aUiturld[\cbiZHQdntwz|||xrlfc][befmomaTSUTSWbjof_^VY[X]idYTQQT^oic`cir}}zsi_dstlqtvy}~|{yzyyw|{pjlonoxoZQNaruwqaTdtz}~~|x}}ztkbptn[V`|wssjuxxxwwxxyyxsnmpojcgnvxuwx|yuvrlrtxwvvvvvvvvvvvvvttstttssrqqppqqonljgda__blvxxxxxxxxxxxxxyyyyyzzyyzzz{|}~~~~~~~~~~~~~}}}|}|{zzzyxxxyyyyyyyyyusqonopqqqqnmmlmnoprpnlnpqqpolrssstvsrssnkfjnnmmmmmnoqrronnnqtuqljiknmkjjjgdbcehgfefgikdbbgknkgb]`ltokjlsxpffdgheb^abcdecgowyzzzyyyxxyyyyxxxxxwwwwwwwwxxxyz{{{{{zzyyxxxyyyxwwwwwxxyyyyyyyyyyxxyyyyyyyyyyzz{{{{{|{{{{|}}}~~~~~~~~~~}}||{{zzz{|||||||}~}}||{{{zzzzzzzzz{{{||||}}~~}||{zywwvvuvvvvvvvutssssssj_E<>IUU_hZUWZPCdjsohlgjmsvwrlYX][XJEHOaouxzxxxtmfigcabgllif\SQUY[]fjja`\P_ea`]ZUQPMYqvqcPQ^p{vpjhjnqooruxyyyyz||zv{|yuqpqovuVINasvsqnjqtwz}}{vzzzxrikjo`Re~}x|wvxyyxwxxxvuukhlrssoqtrkmx|tpsupzyxvvvvvvvwwwwwwvtsstttssrqqppppomkifc`^^`ivyxyyyyxxxxxxyyyzyyzzzyzz{|}~~~~~~~~}}~|{zzzyyxxxxxxxyyyyxtppooppqqrrqnllmopqrrrqrsrqpoqjhomossqqqkhchnnnmnomkmoqqppppqrrpkhgilkiiiihfdcehgfddddiiihekmokb\`ktrlhkmlieediolfcdefigdgqwyzzyyyyxxyyxxxxxxxxwwwvvuuvvxyzzzzyyyyyxxxxxyxwwwvwwxyyyyyyyyxxxxxxyyyyyyyyyz{{{{{{||{{{|}}}~~~~~~~~}}||{{zz{|||||}}~~~}}||{{zzzzzzzzz{{{|{{||}~~}}|{zxwwvuuvvvvvuuuttsrpkjeTDInqfVf~|ssqnhelllgmsolt{|yuu~zmjpqytutjbvxxyxwwwvusqnortwyz|}{xwyz{zxvsqprtuvvutsttuwxxyyyxvuuvxxxvusqonnnnoolgc`]ZXVUTW`ryzyyyyyyzzzzz{|}~~~~~~~{{{||||{{{{{{zzzzzzzzzzzzyyyxvronoprtuurkhnlkkkilpssssrssrttsvvurmjhgikmmoqqppppmhktsrqpnlkjjlmoppomgdehmlkjknlmljighjida`behgefkpmigddhikfabdfeecglqtuuuuvvvvvvvwwwwxxyzzzzzyxwvuuuuuuuuuttuuvvwxxyyyyyxxwwwwxyyzyyxyyyyyyyyyyxyzz{||}}}}|||}~}}||||||{xusvz|~~~~~~~~~~~~}}}}}||||||{{{|{{{{{{{{{{{{{{{|||||||||||||||||{zyxwvuutttsrqqqqrstuwyyyyyxxwwvvvvvvwwwwvuuvuqoosvxxyzzywutttttsssrqpnmmlkjd[TW^eqpXPU[\cgf^`inrrqjmjfde_`qsvzzwrqqeUbooprqmhh\^P=A_pf_mwz{qkgddgedXTkolo{vopkmnfvuatsLXvvswvwxxwusqlkswxz{{|{wwz|{yyvsposvwwvuttuuvxxxxxxwvuvwxyywusqonmmnookfb^[ZXVUUVZfvyyyyyzzzzzzz{|}|{|}|||{{{{{{{zzzzzzzzzzzyyyxvsqprsrstsrolnljjjkmorsrqopqpsqrwxtponlklmmnprqponmlkmoqqqponmllmnpqrqpommnonnnnpllkjjkjjhc`^`cdcabgnmigedjkkfbceeeefkptvvvvvvvvvvvvwwwxyyyzz{{zyxwvvvuuutuuuttuuuvwwxyzyyyyyxwwwwxyyyxxyyyyyyyyyyyzz{{|}}}}}||}~~||||||{{zwttuwz~~~~~~~~~~~}}}}}||||||||||||{{{{{{{{{{{{{{{{{{{{{||||}}}}|{yxwvuvuuutsrrrrrrttvxyzzzyyxwwwwwwxxxyxwwwyyxwvwxyyyyyxxxwwwvvvvuttsssrrqqnhb``hpodTRV]efa[donnslZbilnje^rvwz|{rib\[ktroorthd[>59?TkdXPN]sticceg`ZSLl|riuxd^clpgy~yZfpEL[qrtvyxxxwutposvwx{y{{xwxyxxxvrpquxyxvutuvvwxyyyyywvuvwyzywusqonmnopplgc_\[ZYYZ[]cqwyyzzzzz{{{{|}~|||}}}}|{{{{{{{zzzzzzzzzzzzyxvusrtvuqnnqpmiiijjihknrqommnnnkkprrssrpqqponoooppporojhorqqqqponoprstttvuuuttttstmkjkkmmljda^^`a``bdiihgfehigcchihhhlptuwwwwwwwvvvvvwwxxyyyyyyyyxwwvvvuuutuuuttuuuvvwwxyyyyyxxwwwwxxxxxxyyyxxyyyyz{{{{|||}}}}}}~~|~}|}||||{{zyxxwwy|~~~~~~~~~~}}}}}}||||||}}}}|{{{{{{{{{{{zzzzz{{{{{{{|}}~~~|{zyxwvvvvuttrrrrrstuwyyzzzzyxwwxxyyyyyyxxxyyyyxxxyyyyyxyxxxxwwwwwwwwwwvvvvvsqmlnqnbPMUX[ZULUioeoud_agkkcctuy|zi]YZbpsqmkmtigp`G76Qf]OI[s|umfb_^YTQNqzij|ub]fvxqwvQZr]NL_`nvyxyyxxxwutuutuqtvyyustwwvrpqtwyywvuvvwxyyyyyywvuvwyzywusrponopqqokgdbabdegikntwxyz{{{{||||}~~}}}~~~~}|||||{{{{{{zzzzz||{yyxwusuvwsnnpqrnmlmljgknqomllmmnkjoqstsrssttsqommoqrrrmlqstssttsrrstuwwxxyxxxwwwwvwqpnmkmnmjea^]^^^beeefhhgeeecafkmllortuvwxwxyyxwvvvvvvwwwwwxxxxwwwwwvvvuuuuuuuuuuuvvvwxxyyyyxxxxwwxxxxxxyyyyyyzzzz{||||||}}}}}~~|}||}}}||{{z{{{yxyz}~~~~~~~~~~}}}}}}}}}}}}}}}}|||{{{{{{{{zzzzz{{{{{zz{|}~~}||{zyyxwwwvvusrrrrstuvwwyzzyyxxxxxyyyyyxxxxyyyyxxyyyyyyxyxyyxxxxxxxxxxxxwwwxwwvuvtqjZX]XUSNMGTheozojnuvsehpty{|vf^[^ipnnljlla`vx^;>cZUJE\v}tpjaUOPSPNu{pe}|mY[syq{dFW|uE/3Cdtwxzzzzzyyyxtpnmoqvxuutsqprqrtvxxxxxxxwxyyyyyyxwvvwxyzxvuutssrsttspmllmoqstvwyyzz{{||}|||}}}~~~~~~~~~~}}}}|||{{{{zyxy{}~|zxzyusrsuspppstrspoqnnpsroonnmnnosqqttsstuwxwvqljnrttttuvvvuvvwvuvvxxyyzzzzyyyxxwwwttqnmmnmlhdb`__aceefgiihggghiknppqrsuuvwwxyzyxwvvuuuvuuvvvvwwvvvwvvvvvuuuvvvvuuuuvvvwxxxxyyyyyxxxxxxxxyyyyyyz{{{{|||||||}}}}}~~}}||}}~}||z{|{{zyxy|~~~~~~}}}}}}}}}}}~~}}}}}|{zzzzzzzyzzz{{{{{zz{{|}}||||{{zxxwwvvusssrrstuvwwxyyyyyyyxxxxxxxxwxxxxxxxxxyyyyyyxxxxxxxxxxxxxxxxxwwxxwvvuvttqojehbXcfhlnruqnsxvrmnrtwyxupha`uqklkloqjjttj@ZsIKMOP]osqmeZPRPKNtyvpquxgVgzzuuVMY{nH07Letvwyz{zyyyzytmqqonmqvvspqrrrstvxxxxyyyxxxzzyyyxwwvwxyyyxwvuuuttuuuuuuuuvvwxyz{|||}}}~~}}}}}}~~~~~~~~~~~~}}|{{{zxvx|~|ywwvsqprvvusrttstqlqvvtvvsqppopqrtqnoqsuvwyzyzvsqrtuvwwxxxxwwxxxxxyyyzz{{{zzzyxxwwxxwvrpppponljigggghhjkkkkmmllmoqrssttuuvwwxyzzyxwvuutttttuuuuuuuvvvvvvvuuuvvvvvvvvvvvvwxxxyyyyyyyxxxxxxyzzzzz{{{{|||}}}}}}}}}}~~~}|}}}~~||{{|||{yxy{~~~~~~~~}}}}}}}}}~~~~~}|{{{zzzzzzzzz{{{{{zz{{|||||||||{yyxxwwvuttssttuuvwxxyyzzzyyxxxxxxxxxxxxxxxxxyyyyyyyyyxxxxxxxxxxxxxxxwwwwwwwwwwwwwvwtnruuuwzywvwxwusstuwxxvsnilztkjkpuxrlpqmFptM?QjqopqqpmePNPRTrsoigeagdoz~|xvcPTsyrSOcqvwvxz{zxwx{{vrsuuslmprqpqrtuvwxxyyyyzzzyyzzyyyyxxwwwxxyyxxwwwvwwvvwwwwxxz{|||}}}~~~~~~~}}}}}}~~~~~~~~~~~~~~~~~}||{zxvwz{zxyxtrponqtuuutrqqrsnquwvwywtrrqqrrqsrpsvwxyyzzzyxyvvvwxyyyyyxxxyyyyzzz{{{{{{{zyyxwxyyywusrssssrrpnmljiilnnmnprqpqrstttssttuvvwxyyxwvuutttstttttuuuuvvvvvvvvuuuvvvvvvvvvvvwxxxyyyyyyxxxxxxyyzzzzz{|||||}}}}}}}}}}~~}||}}}}}||||||{yxy{~~~~~~~~}}}}}~~~~}|{{{zzzzzzzz{{{{{zzz{{|||||||{{zzxxxxwvuutttuuvvwwxyyzzzyyyyxxxxxxxxxxxxxxxyyzzyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxyzyyyxxyxxxyxwxyyxxwwwwwxwwusux|upmnrw{yusro[zu_GXmxurssssn^Y]ceuroigcgsrvwxurrhMUscXgkuvutuwxyxwuutwwvtvxwqpppqqrstuvwxxxyyyyzzzzyyxxxxwxwwwwxxxxxwwwwxxwwwxxyyz||}}}~~~~~~~}}}~~~~~~~~~~~~~~~~~~~~}}|{ywwyxwuxxvtrpoqstuutrpoputrmsvxzxusssrrsqtyyxxyyyyyxxxz{ywwxxxyyyyyyyyyyzzz{{{{{{zzyyyxwwxxxxwuutuuuutsqqpommopqqqstttsssttssssstuuuuvwvuttttttttttttuuuvwwwwwvvuuuuvvvvvvvvvvvwwxxyyyyyyxyyyyyyz{{{{{|||||}}}}}}~~~~~~}}||||}}}|||||{yxy{~~}}}}}~}||{{{zzzzzzz{{{{{zzz{{{|{|||{{{zzyyyzyxxwuuuvvvwxxxyyzzzzzyyyxxxxxxxxxxxxxxxyzyyyyyyyyzzzyyyyyyyyyyyyyxxxxxxxxxyyz{xyyxxwwxwxyyzyyyxxxxxxwxzz{vusruxwyxvuvsw}sfvuwvuvvutsqmnrsxvtqpnrspturokhpZ`reQpsvvssuvwxwwutrtuvuuuuuutssstuvvwwwxxxyyyyyyxxxwwwwwxxwwwwwxxxwwwwwxxwwxyz{|}~~~~~~~~~~~~~~~~~}|{ywxyxwvxxwvuutuuuuutttstsrrqsvyzyvuuuttuuvwxyyyyyyxxxzyyyxxwwxxxxxxyxxyyyzzzzzzzzyyyyyxwwwwwwwvuuuuuutsssrrrqrrssstuuutssssssrqrsssssttttssstttuuuttttuuuvwwwvvuuuuuvvvvvvvvvvwwwxxyyyyyyyyyyyyyz{{{{{|}}|}}}}}}~~}}||||}~}}|||{yxx{~~~}}}~}|{{{{{zzzzz{{{{{{zz{{||{{{{{{{{{{{{{zzyyxxwwwwwxxxxyxyzzzzzzzyyyxxxxxxxxxxxxxxyyyyyyyyzzzzzzzzzzzzzzzyyyxxxxxxxyzzzzzyyyxwxxxxxyyzyyyyxxxxxxyyxvvvvwxyxwwwwxwuttuwwuuvvuutuvvuuuvvuuuuuuttssssrqqrrsuvuuuuvvwwwvtsttuvuuvvvuutuuvvvwwvwxxxxxwwwwwwwwvwwwwwwwvwwxxxwvwwxxwwxy{}~~~~~~~~~~~}{yxyyyyz{{{{zyxxxwvvuvvvwvuutuwyyxvvvvvvvwxxyyyyyyyxxxzyyyxxwwwwwwwwxxxxyyyyyyyyyyyxxxxwwvvvvwwvvvuuuutsssrrssrrrrstuuutrrrrrqppqqrqpqrrsrrrstuuvvvuuttttuuvvvvuuuuuuvvvvvvvvvvwwxxxyyyyyyyyyyzzz{|||||}}}}}~~~~~~~~}}|||}}}}}||{yxy{~~~~~}|{{{{{{zz{{{{{{{{{{{|||||{{{{{{{{z{{{{{{zzyxxxxxxyyyyxwxyzzzzzzyyyyyyyyyyyyxxxxxxxxyyyyyyyz{{{{{{{zzzzzyyyxxxyyyyzzzzzzzzyxxxxxxxyyyyyyxxxxxyxxxwwwwwwxxxxxxxwwwwxxxwvvvvvvwxxvvvvwwwvvvvvuvvvvvvuvwwwvvvvvvvvvvuuuuttuuvvvuvvvvvwwwwxwwwxwwwvvvuuuvvuvvvwwwxvwwxxxwvwwxxwxy{}~~~~~}{yyyz{{||}}||{{{zyxwvwwxzyxxwxxyyxwwwwwwwwxyyyyyyyyxwxyyyyxwwwwvvvvwwwxxxxxxxxxxxwwvvvvuuututuvuuuuuutssrrqqrrqqqqqrsssrqqqqqqpppqqpppqrrrrstuuvvvvvuuttttuuuuuuuuuuuvvvvvvwwwwxxxxxyyyyyzzzzzzzz{|||||}}}~~~~~~~~~}||||}}}}}|{zyz{}~}||{{{{zzz{{{{{{{{{|||}}|||{z{{zzz{{{{||{{zzyyyyyyyyyyxwwxyyzzzzzzzzzzzzzzzyyyyyxxxxxxyyyyyyzzzzz{zzzzzzyyyxxyyyyyzzzzzzzzyxxxxxxxxyyyyyyyyyyyxxxxxxxxxxxxyyxxwvvvwxxwwwwvvvxwxwvvwwwwwwwwwvvwwwvvvwxyxxwvvwwwwvvuuuuuuuuvvuuvwwwwwxxxxxxxwvvvuuvvvvvvvvvvwwxxwwwxxxwvwxxyyz{|}~~~~}|zzz{||||}}}}|}||{zyxxxxzzyyxyxyyxwxxxxxxxxxxxxxxxyxwwxxxxwwwwvvvvvvvvwxxxxxxwxwvuuttttssssssstttttttssrrrqqrrqpppppqqrqqqqqqppppqqqqqrsrrrsstuvvvvvuuuutuvvvvvvvvvvvwwwwwxxxyyyyzzyzzzzzz{{{{{{{||||}}~~~~~~}|||||||||||zzz|}~~}}|||{{zzz{{||||||}}}}}}}}|{z{{zzzyzz{{{{{zzzyyyyyyyyyxwwwxxxyyzzzzzzzzzzzzzzzzyyyyxxxxyyyyyzzzzzzzzzzzzyyyyyyyyyyzzzzzzzzyxxxxxxxxxyyyyyyzzzzyyxyyyyyyxxyxxxxwvvvwxxwxxxwwvwwwwvvwwwwwxxwwwwwwwvvvwxxxxxwxxxxwvvutuuuvvvvvvvvwwwwvwwxwwwxxwwwvvwwwwwwwwwvxxxxwwwwxxwvwxyz{|}~~~~~~}{z{||||||}}}}~~}}|{zyzzyyyyyyyyxxxxxxxxxxxxxxwwwwxwwwwwwwwvvvvvvvuuuvvwwwwwwwwwvtttsssrrqrrrrsssssssssrrrrrrqqpoopppppppppppppqqrrqqrssssstttuvvvvuvuuutuvvvvvvvvvvvxxxxxyyyyyzzzzzzzzzz{{||||||}}}}}}~~~~~~~}||||||||||{zz{}~}~}}}||{{{{{|}}}}}}}~~~~~}||{zzzzzyyyyzz{zzzyyyyyyxxxxxxxwwwwwwxyyzzzyyzzzz{{zzzzzzzyxxxyyyyzzzzzzzzzzzzzyyyyyzzzzzyyyyyyyyyyyyyxxxxxxyyyyyyyzyxyyyzzzyyxxyxxxwwwwwxxxxxxxwwwwwwvvvvvwwwwwwwwwwwwvuvwwxxyyxxxyyxwvuttvuvvvwwvvvvvvvvvwwwwwwwwwwvvwxxxxxxwwwxxxxxxxxwxwwwxy{|}~~~~~}||{|}}}||}}~~~~}|{{zzzzyyyyyyxxxxxxxxxxxxxxwwwwwwwwwwwwvvvvvvvuuuuvvvvuuvvuutsssrrrrrqrrrrrrrrrrrrrssssssrqpooooonnoopppppqrrrrrssttsssttuuvwwvvvuuutuvvvvwwwwwwwxxyyz{{{{{{{||{{{{{{{|}}}}}}}}}}~~~~~}|||||||||{zz{|}~|||y~~~~}||{{||}}~~~~~~~~~}||{{zzzzyyxxyyzzzzyyyyyyxxxxxxxxxwvvvwxxyzzyzzzzz{{{{{{zzzzyxxyyyyzzzzzzzzzzzzzzyyyzzzzzzyyyyyyyyyyyyyxxxxxxxxxyyyyyxxyyyz{{zzyxyxxwwwwxxyyyyyxxxxxxxwwvvvvwwwwwwwwwwwwvvwwxxyyyyzzzzxwvutuvvwvvwwwwwwwvvvvvvvvvwwwwwwwxyyyyyxxwwxxxxxxxxxxxxxyz|}~~~}||{{|}}||||}~~~}|{{z{zzyyyyyxxxxxxxxxxxxxxxwwwwwwwwwwwwvvvvvvuuuuuuuuttuuttsssrrsssssssrrrrqqrrrrrsssssrqpppppqppooppqqqqrssssssttttssttuuvvvvvvuuuuvwwwwwwxxxwwxyyz{|||||||}}|||||||}}}}}}}~~~}~~~}||||||||{{zz{|}~zxz|x~~~~~}||||}}~~~~~~~~~~}||{{{zzzyyxwxxyyzyyyyxxxwwwxxxxxxxwvvvvwxyzzzzzzz{{{{{{{{{zyyyyyyyzzzzzzzzzzzzzyyyyzzzzzzyyyyyyyyyyyyyyxxxxxxxxxxxxxxxyyyzz{zzxxyxxwwwwxxyyyyyyyyyyyyxwwvvwwwwwwwwwwwwwwwxxxxyyyyzzzzxwvuuuvvvwwwwwwwwwvvvvvvvvvwwvwwwxxyzzzyxxwwxyxxxxxxyyyyyz|}}~~}||{{{||||||||}}}}}~}}}|{{z{zzzyyyyyyyyyyyyyxxxxxxwwwwwwwwwwwwwvvvvwvvuuuuuutttuutttssstttttttssssrqrrrqrrrrrrrqqqqqqrrqpppqqrrrsstttttuuuuttuuvvwwwwwwwwvwxxxxxxxxyyxxyyz{||||||||}}}}}}}}}}~~~~~~~~~~~~~}|||||||{{{zz{|}~zxyzy|~~~~}}||}}~~~~~~~~}}}}|||{{{{{{zyxwwwxxyxxxxwwwwwwwxxxxxxxwvvuvwxy{{{{zzz{{{{{{{zzzzzzzzzzzzzzzzzzzzzzyyyyzzzzzzyyyyyyyyyyyyyyyyyyyyyyyxxxxxyyyzzyyyzyyyyxwwwwxxxyyyyyyyyyyyyxxwwwwwwwwwwwwwwwwwxxxxxxxxxyyyyxwvuuvvwwwxxxxwwwwwwxxxxxxwwwwwwxxyzzzyxxwxyyyyyyyyzzzz{|}~~~~~~~~}||{{{{{||||||{{{{{{||||{{{zzzzzzzzzyyyyyyyyyyxxxxxxwwwwwwwwwwwwwwwwwwvvvvvvvuuuuuuuutttuuuuuuutttssrrrrrrrrrrrrrrrrrrssrqqqqrrsssttuutuvvvvuuuvwwxxxxwwwwwwxyyxxyyyzzyyyz{{||{{|||||||}}}}}}~~~~~~~~~~~~~}|||||||{{{z{{|}~{x{{}|~~~~}}||}}~~~~~~}~}}}|||{{{{{{{zzxwwwwwxxwwwvvvvvvwwwxxxxxwwvuuvwyz|{{{zzyyyyyzzzzzzzzzzzzzzzzzzzzzzzzyzzzzzzzzzyyyyyyzzzzzzzzzzzzzzzyyyyxxxyzzzyyyxyyyyyxxxxwxxxxyyyzzzzzzzzyyxxxwwwwwwwwwwwxxxxxxxwwwwwxxyxyxxwvuuvwxxyyxxwwwwxyyyyyyxxwwxwwwxyyyyxxxyyzzzzzzzzzz{{|~~~}||||||}~}||{{{{{{{{{{{zzzzzzz{{{{{zzzzzzzzzzzzzzzzzzzzyyxxxxxxwwwwwwwwwwwwwwwxwwvvvwwwvvvvvvvvuuuvvvvvvvuuuttssssssssssssssssssttsrrrrssttttuuuuvvwwwvvvvwwxxxxwxyxxxyzzyyyyyzzyyzz{{||{|{{{{{||}~~~~~~~~~}}}}||||{{{{{{{||z||~|}~~~~~~}}}~~~~~~~}||||{{|{{{{{{zzyyxwwwwxxwwvvvuuuuuvvvvwxwwwvvvuvxy{{{{zzyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzyyyyyzzzzzzzzzzzzzzzzzzzzyxyyyzzyxxxzzzzyyyyyxxxxxxyyyzzzzzzzyyyyxxwwwwwwwwxxxxxxxxxwvvvvvwwxyyyxwvuvwxyyyxxxwwxyz{{{{{zywwxwwwxxyyxxwyzz|{{{{{{{{{|}~~~}}}|{{{{{{{|}||{{{zzzzzzzzzzzzyyyyzzzzzyyzzzzyzzzzzzzzzzzzzzyyxxxxxxwwwwwwwwwwwwwwxwwwwwwxxwwwwvvvvvvvvvvwwwwvvvuuttttttttttttttttttuutstssttuuuuuuuvvwwwwwwvvwwxxxxwxyyxyzzzyyzzz{{zz{{{|||{|{{{{{||}~~~~~}}}}}|||{{{{{{|}}{zz{|}~~~~~~~~~~~}}|||{z{{{|{{{zzyxxxwwwxxwwvvvvuuttuttuvwwwwwvvuuvxyz{{zzyyyyyyyzzzzzzzzzzzzzzzzzzzzzzyzzzzzzzzzyyyyyyzzzzzzzzzzzzzzzzzzzyyyyyyyxxyy{{{{zzzzzyyyyxxxyyyzzzzzzyyyyxxxxxxxxxwxxxxxxxxxwvvwwwxxyzzzyxwvvwxyyxxxxwwxyz{|||{{zxwxwwwxxxxxxxz{{|||||||||}}~|||{{zzzzzzz{{||{{{{zzzzzzzzzzzzzyyyyyyyyyyzzyyzzzzzzzzzzzzzzzzyyyxxxxxwwwwwwwwwwwwwxwwwxxxxxxxxxwwwwvwvvvwxxxxwwvvvuuuuuuuuuuuuuuuuuuvuutuutuuuuuvvvvvwxxxxxxwwwwxxxxxyyyyyzzzzzzz{{{z{{{{||||}|||||}}}~~~~~}}}}|||{{{{{{|~}zzz|~~~~~~~~~}}}}}|{{||||{{zzyyxxxxxxxxwwwwvvuttttstvvwwwvvuuuuvxyz{{zzyyyyyyyzzzzzzzzzzzzzzzzzzzzyzz{{{{{{{zyyyyyyyzzzzzzzz{{{{{{zz{zzyyyyyyxxyz{|||{{{{{zzzzyyxxxyyzzzzzyyyyxxxyyyyyyyyyyyyxxxxxwwxwxxyyzzzzyxwwwxxxxxxxwwxyz{{{{{zzyxxxwwxxyyyyy{||}||||||}}~~~{{{{zzzzzzzz{{{{{{{zzzzzzzzzzzzzyyyyyyyxxxxyyyyyyyyzzzzzyzzzzzzzyyxxxxxxxxxxxxxxxxxxwxwwxxxxxyyxxwwxxwwwvvwxxxxxwvvvvvvvuuuuvvvvuvvvvuuuuuvuuuvvvvwwwvvwxxxxxwwwwwwxxxxyzyyyz{{zz{{{{{{{{{{||||}}}|}}}~~~~~~}}}}|||{{{{{{}|{{|~~~~~~}}}||||||{{zzzyyyyyxxxxwwwwwvvuuttstuvwwvvuuuttuvxzz{{zzzzzzzyzzzzzzzzzzzzzzzzzzzyyyz{||{{|{zyyyyyyyyzzzzyzz{{{{{{{{{{zzzzzzzyyyzzz{{||{{{{zzzyyxxxxxy{{{zyyyyyxyyyyyzzzzzyyzyyyyxxxxxxyyyyzzyyyxxxwwwxxxwwxxyzz{{{zyyyyyxxxxxxyyyz{||}|||||}~~zzzzzzzzzzzz{{{{{{zzzzzzzzzzzzzyyyyxxxxxxxxyyyyyyyyzzzzzyzzzzzzzyyxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyxxxxxxwwwwxxxxxxwwwwvwvvvvvvvvvvvvvvuuvvuvvvvwwwwwwwvwwxxxxxwwwwwwxyyxyzyyyz{{{{{{|{{{{|||}}}}}}}}~~~~}}}}|||{{{{{|~~~~~~~~~~}}|||||{{zzzzyyyyxxxxxwwwwvvvuttsttuvvvuuuutstuwxz{{{{{{{{zzzzzzzzzzzz{zzzzzzzzyyyz{{{||{zzyyyyyyyyzzzzyyzz{{{{{{{{{zzzzzzzyyyyzzz{{{{{{zzzyyyyxxxxy{{{zyyyyyxyyzzz{{{{{{{{zzzzyyxyyyyzzzzyyyyyxxxxxxxxwwxxyyzzzzyyxyyyxxxxxxyyyyz{||||||}}~zzzzzzzzzzzzz{{{{zzzzzzzzzzzzzyyyyyxxxxxxxxyyyyyyyyzzzzzyzzzzzyyyyyyyyxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyxxwwwxxxxxxxwwwwwwwwwwwwwwwwwwwwvvvvvwvvwwwwwwwwwwwxxxxxwwwwxxyyyyzzzzzz{{{|||||||||}}}~}}~~~~~~~}}}|{{{{{{{}~~~~~}}|}}|{{zzzyyyyyxxxxxxwwwwvvuttstttuuuuuuttsstvwxyz{{{{{{zzzzzzzzzzzzzzzzzzzzzyyyyz{{{{zzzyyyyyyyyzzzzyyzzz{{{{{zzzzzzzzzzyyyyyyzz{{{{zzzyyyyyyxxyz{{{zyyyyyxyyzzzz{{{{{zz{{{{zyyyxxxyzzzyyyyxxxyxxxxxwwxxyyyyxxxxxxyyxxxxxxxyxxyzz{|||}~~~yyyyyyyyyzzzzzzzzzzzzzzzzzzzzzyyyyyxxxxyxxxyyyyyyzzzzzzzzzzzzyyyyyyyyzyyyyyyxxxxxxxxxyyyyzzzzzyyyyyyyxxxxxxxxyyxxxxxxxxxxxxxxwwwxxxxxwwwvvvwwwwxxxxxxwxxyyyyyxxxxyyzzzyz{{zz{|||||||}}||}}}}}}~~~~~~~~~~}||{{{zz{}~}}}~}}|{zzzyyyyyxxxxxxwwwwwvuttssttttuuvvuttstuvwxyz{{{{{{{zzzzzzzzzzzzzzzzzzzyyyyzzz{zzzzyzzzzzz{{{zzyyzzzz{zzzzzzzz{{{{{zzzzyyyzzzzzzzyyyyyyyyyyz{{{zyyyyyyyyzzzzzzzzzzzzzzzzyyxwxxxxyzyyxxxxxxwwwxxxxxxyyyxxxxxxxyyxxxxxxxxwwwxxyzz|}}~~yyyyyyyyyyyyyyyzyyyyyyzzzzzzzyyyyyyyyyyxxxxyyyyyxyzzzzzzzzzzyyyyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzyxxxxxxxxxwxyyyyyyyyyyyxxxxxxxxxwwwwwwwwwwwwwwwxxxxxxxxxyyyyyyyxxxxyyz{{zz{{{{{|||}}}}}}}}~~~~}~~~~}}}~~~}}|||zz|~~~~}}~~}}|{zzzyyyyyxxxxxxxxxwwvuuttssttttuuuuvvvtttuwxy{{{{{{{zzzzzyzzzzzzzzzzzzzyyyyzzzzzzzzzzzzzzz{{{zzyyzzzzzzzzzzzzz{{{{{zzzz{zzzzzzzzyyyyyyyyyzzzyyyz{{{{zyyyzzzzzzzzzzzzzzzyyxxwxyyzyyxxxxwwwwwwwxxxxyyyyyxxxxxxxyyyyyyxxxxwwwwwwxz{|}}~xxxxxxyyyyyyyyyyyyyyyyyzzzzzyyyyyyyyyyyxxxxyyyyxxyzzzzzzzzzyyyyyyyyyyyyyyyyyyzzzzzzzzzyyzzzzzzzyyyyyyxxxwxyyyyyyyyyyyyyyyyyyyxwwwwwwwxxxxxxxxxyyyyyyyxyzzzzzzyyyyzz{|{{{||{{|}}}}}}}~~}}~~~~~~~~~|||}}~~~}}}{{|~~~~}}~~}|{{zzyyyyyxxxxxxxxxxxwwvvutsssstttuuuvwvutstuwy{{{{{{{zzzzyxyzzzzzzzzzzzzzyyyzzzzzzzzz{{{{{{|{{zzyyzzzzzzzzzzzzz{|||||||{{zzzyyyyyyyyzzzzzzzzzyyyz{{{{zzyyzzzzyyyyxxxyyyzzzyxwxxxyyyyyxwwwwvvwwxyyyyyyyyxxxxxxxyyyyyyxxxxwwvvvwxyz{{~xxxxxxxyyyyyyyyyyyyyyyyyzzzyyyyyyyyyyxxxxxxxyyxxxyyzzzzzzzyyyyyyyyyyyyxxxxyyzz{{{{{{{{zzz{{{{{zzzzyyyyyxxxyyyyyyyzzzzyyyyyyyxwwwwwwwwxxxxxxxxyyzzzzzzyzzzyzzzyyzz{{|||{{|||||}}}~~~~~~~~}zzz{{|}~~~~|{{~~~}~~~~~}~}}|{{zzyyyyxxxxxxxxxxxxxxwwwvutssssssttuvwwvusstvy{{|||{{{{zzyxxxyzzzzzzzzzzzzyyzzzzzz{{z{{{{{{|{{zzyyzzzzzzzzzzzzz{||||||||{{{{zzzzzzzz{{{{{{{{zyzz{||||{zzzzzzzyyyyxxxwxxyzzyxwxxxyyyyyxxwwwwwwwxyyyyyyyyxxxxxxxyyyyyyxxxxwwvvvwxz{||~xxxxxxxxyyyyyyyyyyyyyyyyyzyyyyyyxxxxxxxxxxxxxxxxxyyyzzzzzyyyyyyyyyyyyyxxxxyyz{{{{{{{{{zzzzz{{zzzzzyyyyxxxxyyyyyxyzzzzzzzzzyyxwwwwwwxxyyyxxxxxyyzzzzzzyzzzzzzzzz{{|||||||}}}}}~~~~~~~~}yyyyzz{|~~~|{{~~}|}}~~}}}}||{zzyyyyxxxxxxxxxxxxxxxwwvvuutssrrrsstvwxwutstvx{||||{{{{{yxwvwwxyyyz{{{{{zzzz{{{{{{||{{|{{{{|||{{zzzzzzzzzzzzzz{{{||}}}}}||||||||||{{{{{{{{{{zz{{|}}}}|{{{{{{{zyyyyyxxyyzyyyxxxxxxxyyyyyyxxxwxxxyyyyyyyyyxyyyyyyyyyyyxxxxxxxwwwxz{}~yyyxxxxxyyyyyxxxxxxxxxxxxyyyyyyxxxxwwwwxxxxxxxxxxyyyyyyyyyyyzzzzyyyyyyxwxxxyzz{{{{{{zzyyyzzzzzzzzyyxxxxxxyyyyxxxyyyzyyyyyyyxxxwxxxxyyyyyyxxxxyzzz{{{{zzzzzz{{z{||||}|}}}}}}}~~~~~~}}~}{{{zzzz|}~}|z|~}|}}}}}}}}}{{zyyyxxxxxxxxxxxyyyyyxwwvvuutssrrrrstuvwvuttuvxz|}}{{{z{{zywvvvwwxyyzz{zzzzzzzz{{{{{{|||{{{{{{{{{{{zzzzzzzzzzzzzzz{{||||||||||}}}||||{{{{{{{{zz{{|}}}|||||||{{zzyyyyxyzzyyyyyxwwwwxxyzzzzyyxxxxxxyyyyyyyyyyzzzyyxyyyyyxyyyyyxxxy{|}zzyyyxxxxyyyxxxxxxxxxxxxxxyyxxxwwwwwwxxxxxxxxxyyyyyyyyyyyyyyzzzzyyyyyyyxyyyyzzzzzzzzyyxxxxxyyzyyyyxxxxxxxyyyyxwwxyyyyyyyyyyxxxxyyyyyyyyyyxxxxyzzz{{{{{zzzz{{{{{|}}}}|}}}}~~~~~~~~}}}~}{zzzzzz{}~~~~}|z|~}}||}}}}}}}|{zyyyxxxxxxxxxxyyyyyyyxwwwvutsssrrrrsstuutttuvxy{}}|{{z{{{zywwvvvvwxyyzzzzzzzzzz{{{{{{|{{{{{{{{{{{{zzzzzzzzzzzzzzzz{{||||}}}}}}}~}}}}}||||||{zzz{{|}}}}}}}|{zzzzzzzzzzzzyyyyyxwwwvwxzz{{{zyxxxxxxxyyyyyyyyyyzzyyxyyyyyyyzzzzzyyz|}{zzzyyxxxxxxxxxxxxxxxxxxxxxxxwwwwwwwxxyyyyyyyyyyyyyyyyyyyyyyzzzzyyyyyzzyzzzyyxxxxxxyxxwwwwwxxxwxxxxxxxxxxxyyxxwwwwxxxxxyyyyxxxxyyyyyyzzzzyyyyyzzz{{{{{{{{{{|||||}}}}}}}}}~~}}}}}}}}}~~~|{{{zzz{{~~}}~~}{z{~}|||}}}}}}|{zyyyxxxxxxxxxxyzzzzyyxxwwvvuttssrrrrrsstttttuwxz|||{{{{|||{zyxvuuuwxxzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzz{{||||}}~}}}}}}}}}}}|||{zzzzz{{|}}}}||{zzzzzzzzzzzzzyyyyxxwwwwxxyz{|{zyxxwwwwwxxxwwwwxxyzzyyyzzzzzzzz{{{{{z{|~{zzzyyyxxxxxxxxxxxxxxxxxxxxxxxwwwwxxxyyzzzzzzzzzzzzyyyyyyyyyyzzzyyyyzzzyyyyxxxwwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxwwwxxxxxxyyyyxxyyzzzzzzzzzyyyyyzzz{{{{|{{{{{|||}}~~~}}}}}}}~}}}}}}}}}~~~~}{{{{zyyzz}~|{{{{yxy~}}}||}}}}}|{zyyyxxyyyyyyxyz{{{zzyxxwvvuuuttssrrrrrrsttttuvwxz|||{{||}}}}}{xvuttvwyzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{zzzzzzzzzzzzzzz{{{{{{{{{||||||||{{{{{zzzzzzzz{{|{{{{zzzzzz{{{{{{{zzyyyxxwwwxyyyyz{{zyxxwwvvwwwwwwwwxxyzzyyyyzzz{{{{{|||||}~yzzyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxyyyzzzzzzzzzzyyyyyxxxxyyyyzzzzzzzyyyyxxwwwvwwwwwwwxxxxxxxwwwwwwwwwwxxxxxxxxxxxxxxxxxyyyyyzzzzzzzzzzzyyyz{{{|||||{{{{||}}}}~~~}}}}}}}}}}}~~~~~~~~~|{{zzzyyyz|~~{zxzyxvx~~~~~~~}}}}~~~~}|{zyyyxyyyyyyyyz{||{{zyxwvvuuuutttssrrrrrssttttuvwxz||||||}~}zwvttuvwyzzzzzzzzzzzzyyyyyzzzzz{||||{{{zzzzz{{{{{{{{{zzzzzyyyyyzzzzzzzzyzzzzzzzzzzzzzzzzzzzzzzzzz{{|||||{zzyyyxxxxyyyyyyyzyxxxwwvvwwxxxwwwxxyyyyyyyzzz{{{{|}}}}}~yzyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxyyyyxxxyyyzzz{zzzzyyyyyxxxxxyyyyzzzzzzzyxxxxxwwwwwwwwwxxxxxyyyxxxxxwwwwwwxxxxxxxxxyyyyyxxxyyyyzz{{{{{{{{{{zzzz{{{|||||{{{||}}}~~~~~~~~~~~~~~~~~|{{zzzyyyy{}~}{xxxwvx~~~~~~~~}}}~~}|{zzyxyyyyyyyz{||||{zxwwvvuuvuuuttssrrrrssttttuuuvy{||||||~|xvtsttvxzzzzzzzzzyyyyyyyyyyzzzz{||{{{{zzzz{{{{{{{{{{zzzzzyxxyyyyyyyyyyyyyyzzzzzzzzyyyxxxxyyyzzz{{||}}}}|{{zzzyyxyzzzyyxxxxxxxwwwwxyzzyyxxxxyyyxxxyyzz{||{|}}~~~xyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxyyyyyxxxxyyyyyyyyyyyyyyxxxxxyyyyzzzzzzzyxxxxxxxwwwwwwwxxxxxyzzyyyyyxwwwwwxxxxxxxxxyyyyyyyyyyyyzz{{{{{{{{{{zzzz{{{|||||{{{||}}~~~~~~~~~~~|{{zzzyyyyz{}~~{xxxwwx}~~~~~~~~}|{zzyyyyyyzzz{|||||{zxwvvuuuuuuuuttssrrssssttuuuuvwy{{||||~}xvtsttvwxzzzzzzzzyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{zzzzzzyyyyyyyyyyyyyyyyzzzzzzzzyyyxxxyyyyzz{{|||}}}}}||{{{{zyyzzzyyxxxxxxxwwwxyz{{{zzyyyyyyxxxxyzz{|{{{|}~xxxxxxxxxxxxyyyyyyyyxxxxwwwwwwwxxyyzyyxxyyyyyyzzzzzzyyyxxxyyzzzzzzzz{zzzyyyyyyxxwwwwwwxxxxyyzzyyyyyyyyyxxxxxyyyyyyyyyyyyyzzzzzzz{{{{{{{{{{{{{{{{{|||||{{{||}}~~~~~~}|{zzzzzyxyz|}~|zyyyxx|~~~~~~}|{zzyyyyzzz{{||||{zyxwvvuuuuvvuuutssrrsssstuuuuuuvwyz{|||~|xvttstuvwyzzzzzzzyyyyyyyyyyzzzzyyzzzzz{{{{{{{{{{{{{{{{{zzzzzzzzzzzyyyyyyyyzzzzzzzzyyyyyyyzzyzz{|||}}}}}|||||||{zzzzzyyyxxxxxxxxxyz{|||{{zzzzzzyxxxyyzz{zyz{{~xxxxxxxxxxxxyyyyyyyyyxxxwwwwwwwwwxyyxxxyyyyyyyzzzzyyyyyyyyyzzyyyzzzzz{{zzzzzzyyxwwxxxxxxxyyyyyyyzzzyyyyxxyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{z{{{{{{||{{{||||||}}}~~~~~~~~~}}|{zzzyyxyz|}~|{zzyyx{|~~}~~~~}|{zzyyyzzz{{||||{zyxwvvvuuuvvvvuuttsssssssuuvvuuuwyyz|||}}~~{xvtttttuwxyzzzzzzzzzzzzzzzzzzzyyyzzzzzzzzz{{{{{{{zzz{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzyzzz{|}}}|||||}}}}}|{zzzyyyyyyxyyyyyyzz{{|||{{{zzzyyxxxyyyzzyyz{{xxwwwwwwwwxxyyyyyzyyyxxxwwwwwwwwwxxxxxxyyyyyyyyzzyyyyxyyyyyyyyyyyyyyz{{zzzzzzzyxwwxxxxyyyyyyyyyyzzzzzzzzyyyyyyzzzzzzz{{{{{|||||{{{{{{{{z{|||||||{{{|||||}}}}~~~~~~~~~}{zzzyxxxy{|~}}||{zyxy{~~}}}~~}|{zzyyzz{{||||{zzyxwvvvuuuvvvvvvutssssssttuvvvuuvwxyz|||{{{zyvtttttttvxyzzzzzzzzzzzzzzzzzzzyyyzzzzzzzzyzzzzzzzzzzzzzzzzz{{{{zzzzzzzzzzzzzzzzzzzzzzyzzzzyyyzz{||}|||||||}}}}||{zzyyyyyyyyyyyyzzz{{{|{{{zzzzyxxwxyyyxxxyy{|xxwwwwwwwwxxyyyyyyyyxxxxwwwwwwwwwxxxxxxyyyyyyyyyyyyyxxyyyyyyxxxxxxxyyzzzzzzzzyxxwwxxxxyyyyyyyyyyzzzzz{{{zzzzyyzzzzzzz{{{{|||||{{{{{{{{{{{|||||||||||||||}}~~~~~~~~~~~}{zzyxxxyz|~~~}}|{zxwxz}~~}}}~~~}|{zzyyzzz{|||{{zzyxwvvvuuuvvwwwwvutsssssstuvvvvvvvvwy{{{zxwvusrrrstttuwyzzzzzzzzzzzzzzzzzzyyzz{{{{{{{zzyzzzzzzzzzzzzzzzzz{zzzzzzzzzzzzzzzzzzzzzzzzyyzzyyyyyzz{||{{zzzzz{{||||{{zyyyyyyyyyyyyyzz{{{{{zzyyyyxxwwxyyyyyzzz|~xxwxxxxwwwxxyyyyyyyyxxxxwwwwwwwwwxxxxxxyyyyyyyyyyyyyxxyyyyyyyxwwwwxyyyzyyyyzyyxxwwxxxxyyyyyyyyyyzzzzz{{{zzzzzz{{{{{{z{{{{{{{{{{{{{{{{{{{|}}}}}}}}}}}}}}}~~~~~~~~}{zyxxxyz|~~~~~}{zwvxy|~~}}~~~}}}|{{zzzzzz{|{{zzyyxwvvvuuuvwwwwwwvutttssstuvwwwwvvvvxzzzxvtrpoopqrsstuwxyzzzzzzzzz{{{{{{zzyzz{{|||||{{{zzzzzzzyyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzyyyyyyyyyyzz{{zzzyyyyyyz{{{{{{zyyyyyyyyyyyyyz{{{{{{zyyyxxxwwxyzz{{}||}wxxxxxxxxxxxyyyyyyyyyxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyxxyyyyyyyyxxxyyyyyyyyyyyyyxxxxxxxxyyyyyyyyyz{{{{{{{{zzz{{{{{{{{{{{{{zzz{zzzzzzzzzz{||}}}}}}}}}~~~~~~~~~}|{zyxyz{|~~}{zxwwy{~~~}}~~~}}}|||{zzzzzzz{{zzyyyxwvvvuuvvwwxxxxwvuuuttttuvwwwwwvuvxyyywuromlmnopqrstvwyzzzzzzzzzz{{{{zzzzz{{||}}}}|||{{{zzzzyyzzzzzzzzzzyzzzzzzzzzzzzzzzzzzzzzzzyyyyyyyyyyyzzzzzzzyyyyyzzz{{{{zzyyyyyyyyyyyyz{|||||{zyyyxxwwxy{{|}~}xyyyyyyyyyyxyyyyyyyyyxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyxxyzzzz{{zzyyyyyyyyyyyyyyyyyyyyyxxyyyyyyyyyz{{{{{{{{zzz{||||||||{{{{zzzzzzzzzzzzzz{||}}}}~~~~~~~~~~~~~}|{zzz{||~}|yxxx{}~}}~~~~~}}}||||{{zzzzzzzzzzyyyxwvvvuuvwwwxxxxxxwwvuuuuuvvwwwwvvuvwxxvtqnlkklmopqrtuvxz{{{{zzzzzz{{zzzzz{{{||}~~}||{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzyyyyyyyyzzzzzyyyzzzz{{{zzzzzzzzyyyyyz{{||}}}|{{zzyxxxyz{}}}yzyyyyyzzzyyyyyyyyyyyyxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyzzz{{{{zzzzzzzzyyyyyyzzzzzzzzzyyyyyyyyyyyz{{{{{{{{zzz{||||||||{{{{zzzzz{{{{{{zzz{||}}}}}~~~~~~~~~~}||{{||}~~{yyxy|~~~~~~~~~}}|||||{{{{{{{{zzzzyyyyxwvvwwvwwwxxyyyyxxwvvuuuuvvwwwvuuuvwvvtromkkkloopqrtuwzz{{{zzzzzzzzzz{{{{{{{||}}||{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{zzzzzzyyyyzzzzzyyzzzz{{{zz{{{{{zyyyyyzz{{|}}}}|||{zyyyxy{}~~~yyyyxxyyyzyyyyyzzzyyyyyyyyxyyyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzyyyyyzz{{{{{{{zzyyyyyyyyyyyz{{{{{{{{zzz{||||||||||{{{{{{{|||||||{{|||}}}}}~~~~~~~~~~~}|}}~}{zyxz}~~~~~~}}}|||||||{{{{{{zzzyyyyxwwxxxxwwwxyzzzzyxwvvvuuuuvvvvvuuuuuvuusqnlkjkmmnoqrtvyz{{{zzzzzzzzzzz{{zzzz{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{||||{{zzzzzzzyyyyz{{{zzz{zzz{{{{{{{{{zyyzzzzzz{{|}}}}}||{zyyxy{}~~}zyxxxxxyyyyyyyyzzzzyyyyyyyyyzzzzzzzzzzzyyyyyyyyyyyyyyyyyyyzzzyyyzzzzzzzzyz{{|||||{zzzzzyyzzzzzzzzzzzz{{{{{{{||{{|||||||{{|||||}}}}|||||}}~~~~~}~~}}}~|zyxz}~}~~~~~~~~~~}}}|{{||||{{{{{{zzyyyyyxxyxxxxwwxyzzzyyyxwvvvuuuuvvvvvutuuuutsqoljjjklmnpqsvxz{{{{zzzzzzzzzzzzzzzzzzz{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{zz{{{{zz{||{{zzzzzzzzzzyyz{{{{z{{zzzz{{{{{{{{{zzzzzzzz{{|}}}}}}|{zzyxyz|}}|zyxxxxxxxyyyyyyzzzzyyzzzzyyyzzzzzzzzzzzyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzyz{||}}||{zzzzzzzz{{{{{{{{zzz{{{{{{{||{{|||}}||||||||}}}}}||||}}}~~~~~~~~~~~~~~~|{yz}~~}~~~~~~~~~~~~}}|{{||||{{{{{{{{zyyyyyyzzyyyxxxyzzzyyyxxwvvvuuvvvvvvuuuttttsrpnkjjkklmopruwy{|{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{zz{{{{zzz{{{{zzzzzzzzzzyzz{{{{zzzzzzzz{{{{{{{zzzzzzzzz{{{|}}}}|||{{zyxy{|||~zyyxxyyyyyyyyyyzzzzyyzzzzyyyzzzzzzzzzzzyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzz{||||||{zzzzzzz{{|||||||{zz{{{{{{{{{|||||}}||||||||}}}}}||}}~~~~~}}}}~~~~}}}}~~}|yy|}~}~~~~~~~~~~~~}}}|{{|}|||{{{{{{{zzzyyyyzzzzyyxxxyzyyyyxxwwvvvvvvvvvvuuutssttsrpnmmmnmnoprtwxz{{{zzzzzzzzzzzzz{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{zz{{{{zzzz{{{zzzzzzzzzzzz{{{{{zzzzzzzyyzzz{{zzzzzzzzzz{{{{|}|||||||{zzyz{}zzyyyyyyyyyyyxyzzzzyzzzzzyyzzzzzzzzzzzzyyyzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{zzz{||||{{{{{{zzz{{||||||{zzz{{{{{{{{{|||||}}}}}}}|||}}}}}}}}~~~~}}}||}}}|||||}}~~|yyz|~~~~~~~~~~~~~~~~}}|||}|||{{{{{{{zzzzyyyyzzzzyxxxyyyyyyxxwwwwvvvvvvvvuuttssstuusrppqqppqrstuwz{{{zzzzzzzzzz{{||||||||||{{zzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{zz{{{zzzzz{{{zzzzzzzzzzzz{{{{{z{{{{{zzyzzzzzzzzzzzzzz{{{zz{{|||||{{{zzyz{|{zzzyyyyyyyyyyzzzzzzzzzzzzzz{{{{{zzz{{zzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{zzzz{{{{{{{{{{{{{{{{{{{{{zzzz{{{{{{{{{|}}}}~~}}}}}}}}~~~~~}}}~~~}}|||||||{{{{{|}}}~~|zxyz}~~~~~~~~~}}}}}}}||||{||||{{zzzzzzyyzzzzyxxxyyyyyyyyxxwwwvvvvvvvuuttssstvvvutttsrqqsstuwyz{{{{{{{{{{zzz{|}}}}}}|{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzz{{{{{{{zzz{zzzzzz{{{{{{{{{{{zzzz{{{z{{{{{{{zzzzzzzzzzz{{{{{{{{{zzz{{||{{{{{zzzzz|{{zzyyyyyyyyyzzzzzzzzz{{{zz{{{{{{z{{z{zz{{{{{{{{{{{{{{{{{{{{zzzz{{{{{{{{zzzz{{{{{{{{{{{{{{{{{{{{{zzzz{{{{{|||||}}}}~~~~~~~}}}~~~~~}}}~~~}}|||{{{{{zzz{{|||}~~~|{yyy{}~~~~~~~}}}}}}}|||||||||{{{zzzzzyyzzzzzyyyyxyyzzzzyxxxwwwvvvvvuuttsrstuwwwvuuutssttuvvxz{{{{{{{{{{zzz{{|}}||||{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzz{{{{{{{zzzzzzzzzz{{{{{{{{{{{{{{{{{{{|||{{{{{{{{{zzzzzz{{{{{{{{{{zz{{{{{{{{zzzzy{{{{zzzzzzzzzz{{zzzzzz{||{{{{{{{{{z{{z{zz{{{{{{{{{{{{{{{{{{{{zzzz{{{{{{{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}}}}}}~~~~~~~}}}~~~~~}}}~~}||{{{{{{{zzz{{{{||}}~~~~}{zzz{}~~~~~~}}~}}}}||||||||{{{{{zzzzzzzzzzyyyyyyyzzzzyxxxwwwwvvvvuuttsrstuvwvvvvvutstttuvxz{{{{{{{{{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzz{{{{{{{zzzzzzzzz{{{{{{{{{{||||{{{{{{{|{{{{|||||||{{zzzz{{{{{{{{{{{{{{{{{zz{|||{}||{{{{{{{{{{{{|{{{{{||}}|||||{|{{{{{{{{{{{{|||||||{{{{{{{|{{{{{{|||||{{{zzz{{|}||||||||{{{{{||||||||||||||||||}}}}}~~~~~~~~~}~~~~~~~~}||{{|||{zzzzz{{{{|||}}~~}{{{{||~~~~~~}}~}}}}||||||||{{{{{{zzz{{{{{{zzzyyyzzzzzyyxxxwwwwwwwwwvutttttuvvvwwvvtsssttuwz{{{{{{{{{{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzz{{{{{{{zzzzzz{{{{{{{{{|{{|}}|{{{{{zz{{{{{{|}}}}}|{{zzzzzzz{{{{{{{{{{{{{{{{|}}}~|||{{{|{{|||{{{||{|||}}}|||||||||{|{{{{{{{||||||}}|||||{{|||||||||{{{zz{{{{{||}}}}}}}}|||{|||||||||||||||||||||}}}}~~~~~~~~~}~~~~}~~~}||||||{zz{{zz{{{{{||}}}~}||{{{{}~}}}}}}}}}}}}}||{{{{{{{{{{{{{{{{zzzzzzzzzzyxxxwwxxxxxwwvuttuutuuvvvwvvtsssttuwy{||||||||{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzz{{||||||||{||}}|{zzzzzzz{{{{{|}~~}}|{{{{zzzzzz{{{{{{{{{{||{{{{|}}||||||}}|}}|||{||{|}}~~}}}}}}|}|||||{{{{{|}}}}}~~}}}}}}|||||||||||{{{zz{||||}}~}}}}}}}}}|||||}}}}}}}}}|||}}}}}}}}}}~~~~~~~~~}}}~}||}}}}|{z{{zzz{{{{{{|||}~~~}}|{{}~~}}}}}}}}}}}}}}||{{{{{{{{{{{{{{{{zzzzzzzzzyxxxwxxxxxxxxwvvuuuuuvvvvwwvutsstttvy{||||||||{{{{{zzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzz{{{|||||||{{||||{zzzzzzzzzzz{|}~~}}|{{{{zzzzzz{{{{{{{{{{||{{{z{|~||||||}}|}}||||||{|}}~~}}}}}}|}|||||{{{{{|}}~~~~~~~~}|}}}}}|||||{{{{||}}}}}~~}}}}}}}}}|||||}}}}}}}}}||}}~~~~~~~~~~~~~~}}~}||}}}}|{z{{zzzz{{{{{{{{|}}~~}||{|}~}}~~~}}}}}}}}}||{{{{{{{{{{{{{{{{{zzzzzzzzyxxxwxxxxyyyyxxwwvvuvvvvvwwvuttuvvvwy{|||||||||{{{{zzzzz{{{{{{{{{{{{{{{{{{{{{{{||||||||{{{{{{{{zzzzzzzzzz{{{||||||{{{||||{{{{{{{{zzz{|}~~}}|{{{{zzzzzz{{{{{{{{||}}|{{z{|~||||||}}}}}}}|||||||}~}}}}}}}||}||||||||}}~~~~~~}|}}}}|||||{{||}}~~~~~~~}}}}}}}}}}|}}}}}}}}}}}}}|}~~~~~~~~~~~~~}~}|}}~~~|{z{zzzzzzzzzzzz{{{|}~~~|{{}~~}~~~~~~~}}}}}}|||{{{{{{{{{{{{{{{{zzzzzzzzyxxxxxxxyyyyyyyxxwwwvwwwvwwwvwwwxxxxy{|||||||||||{{{zzzz{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||||||||{{{zzzzz{{||||{{z{{||||{{{{{{{{{{|||}}}}|||{{{zzzzz{{{{{{{{||}}|{{z{|~{{{{{|}}}}}|||||||{|}}}|||}}}||}}}}}}||}}~~~~~~~~}|}}}}|||||{||}}~~~~~~~~~~}}}}}~~~~~}~~~}}}~~~~~~~~~~}~}|{{zzzzzzzyyyyzzzz{}}~~}|{}~~~~~~~~~~~}}}}}}}}|||{{{{{{{{{{{{{zzzzzzzzyyyyxyyyyzzzzzzyyxxwwwwwwwwwwxxxwwwxyz{{||||}}}}||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||}}}}}}||||||||||||||{zzzyzz{|||{{{z{{{|||||{{{{{{{{{{{||}||||||{{{{{{{{{||||||}}}|{{z{|~{{{{{{{{|||||||||||||}||||}}}|}}}}}}~~~~~~~~~~~~}|}}}}}|||||}}~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~}|{{{zzzzzzyyyyyyyyyz|~~~}}||~~~~~~~~~~}}}}}}}}}}|||{{{{{{{{{{{zzzzzzzzyyyyyyyyyzzzzzzzzyyyxxxxxxxyyyxxwwxxyz{|}}}}}}}}}}||{{{{{{{{{{{{{{{{{{{{{{{{{{{||}}}}}}|||||||||||||{{zzzzzz{|||{{{z{{{{|||{{{{{{{{{{{zz{||}}}|||||||||||}~}}}}}}}|||{{|~z{{{{{{{|||||||||||||}|||||}}|}}}}~~~~~~}}~~~}}}~}}}~~~~~~~~~~~~~~~}~~~~~~}}}~~~~~~~~~~~~~}{{{{{zzzzzyyyyyyyxyz{}}~~}}~~~~~~~~~}}}}}}}}}}|||{{{{{{{{{{zzzzzzzzzyyyyyyyyyzzzzzzzzyyyxxxxxxxyyyxxwwxxyzz{{|}}}}}}}}}}||||||||||||||||{{{{{{{{{{{||}}}}}}}}}}}}}}|||||||{{{{{||||||{{z{{{{{{{{{{{{{{{{{{zz{||}}}|||}}}}}}}}~~~~~~~~}}|{{|}{{{{{{{{{{{||||||||||||||||}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~|{{{{{zzzzzzyyyyyyxxyz||}~~~~~}}}}}}}}||||{{{{{{{{{{{zzzzzzzzzyyyyyyyyyzzzzzzzzyyyxxxxwwxyyyxxxxxxyyzzzz{{|||||}}}}}}||||||||||}}}|||||||||||||}~~}~~~~~~~}}}~~~}}}}~~~~~}|||{{{{{{{{|||||||||||{|}~}}}}||}~}}}}~~~~~~~~~~~{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}~~~~~~~~~~~~~~~|{z{{{{zzzzzzzzzzyxxxyz{||~~~~~~~~~~~~}||||||{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzyxxwwwwxxxxyyxxyyyyyyyyyz{|||||||}}|}|{{{{|||}}}~}}}}}}}}}}}}~~~~~~~~~~~~}||||||||{{|}}||}}}}}|}}~~~~~~}||}}}}}~~~~~~~~~~~~zz{{{{zzzzzzzzzzzzzz{{{{{{|||||{|}}}}}}~~~~~~~~~~~~~~~~~~~~}|{{{{{{{{{zzzzzzzyyxxwxyz{|}~~}}}~~~~~~~}}|||||||{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzyxxwwwwxxxxyyyyyyyyyxxxwxyzz{{{||}}|}|{{z{{||}}}~~}}}}}}}~~~~~}}}~~~}}}}||}}~~~~~~~~}||}}}}~~~~~~zzz{zzyyyyyyyyyyyyyzzz{{{{{{{{{z{||}}}}~~~~~~~~~~~~~~}}~~~~}|{{{{{{{{zzzzzzzzzyxxwxyz{{|~~~}}}||||||||{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzyxxwwwwxxxyyyyyyyyyyxxxwxxyyyyyz{||||||{zz{{|}}}~~}}}}}}~~~~~~~}}}~~~~~~~~}}~~~~~~~}||}~~~~~~~~~~zyyzzyyyyyyyxxxxxyyyyyzzzzzzzzzzz{{||||}}~~~~~~}}}}~~~~}|{{{{zz{zz{{{{{{{zzyxwxyz{{|}~~~~~~}}}|||{{{{{{{{zzzzzzzzzzzzzzzzzzzzyyxxxxxyyyyyyyyyyyyyxxxxxxyxxxxxyzz{{|{{yyyz{||}}~}}}}}}}~~~~~}~~~~~~~~~}}}}}}}}}~}}||}}}}~~~~~~}}}}||}}~~~~~}~~~yyxyyyyxxxxxxxxxxxxxxxyyzyyyyyyyz{{{{{||}}}~~~~~~~~~}}}}}~~~}}|{{{{zzzzz{{{{{{{{zyyxxyz{{|}~~~}}}||||{{{{{{{{{{{{{{z{{{{{{{{{zzyxxxxyyyyyzzzzzzzzyyxxxxyxxxxxyyyz{{{zyxyyz{||}}||||}}}}}}}}}||||||||}}}}~~~~~~~~~~}}}|||||}}}|||||||}}}}}}}}}}}}||}}~~~~~~~~~xxxxyxxxxxwwwwxxxxxxxxxxyyyyyxxyzzzzz{{|}~}}||}}~~~~~~~~}}}}}}}}}}}}}|{{z{{{{{{{{||||||{zzzyxyzz{{}~~~~~}}||||||||||||||||{{{{{{{{{{zzzyyyyzzzzzzzzzzzzzyyxxxxyxxxxxxwxyyzzzyxxwxyz{|}||||}}}}}}}}}||||||||{||}}||}}}~~~~~~~~}}}}}}}|||}}}}}}|||}}}||}}}}}}}}}}}||}}~~~~~xxxxxxxxxxwwwwwxxxxxxxxxxxyyyxxyzzz{zzz{}}|||||}~~~~~}}}~~~~~~~~~~~~~~~~~~~}}|||||||||}}}}|{{zz{{|||||||||||{{{zyxyyz{{}}~~~~~~}}||||||||||||||||{{{{{{{{{{{zzzyyyyzzzzzzzzzzzzzyyxxxxyxxxxxxxxxyzzzyyxwvwy{|}|||||{{|}}}}}||||||||{||}}|||||}}}}}}}}}}}}}}}|||}}}}}}|||}}}}}}}}}~~~~~}}}~~~~~xxxxxyyxxxwwwwxxxxwwwwxxxxyyyyyyyzzzzzz{||{{{{{|||}}}}}}}}~~~~~}}}}~}~~}}}~~~~~}}|||||||||||||||{{{{{|}}}}}}}}}|{{{zzyxyyz{{|}~~~~~~~~}}}}}||||||||||||||||{{{{{{{{{{{{zzzzyyyzzzzzzzzzzzzzyyyxxxyyxyyyxxxxyzzzyyyyxwyz{{||{{{{{{||||}|||||||{||||||||||}}}}}}}}}}}}}}}}}}}}}~~~}}~~}}}}}}}~~~~~~wxxxyyyyxwvvvwwxwwwwwxxxxxyyyyyyyzzzyyzz{z{zzz{{{{{{||}}}}}~~~~~~}}}}}}}||||}}}}}}|||||||||||||||||{{||||}~~~~~~}}|{{zzzzyyzz{|||}}~~}|||}}|||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzyzyyyyyyyyyyyyyyxyyyyyyyxxyyz{|{{{{{z{|||||||}}|{{{{{{|{{{|||||}}}}}}}||}}}}}}~~~~~~~~~~~}}|}}~~~~xxxxyyyyxwvvvwwxxwwwwxxxyyyyyyyyyyzzzyyyzyyyzzzzzzzz{{{{{{||}||}~~~~~~}}}|}}|{{{|}}~~~~}}}||}}}}}||||||{{||||||}}~~~}}}||{{{zzzz{{{||||}~~}||||{{{{{{{zzzzzzzzzzzzz{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzyyyyyyyyyyyxyyyyyyzzyyxyz{{zzzzz{{{{{|||}}|{{{{{{{{{{|||||}}}}}}}||}}}}~~~~~~}}}}~~~~xxxxyyyyxwvvvwwxxxwwwxxxyyyxxxxxyyyyyyyyyxxyyyyyyzzzzzzzz{||||||}}~~~~~~~~~~~~~}}}}~~~}}}~~~~~~~~~~}}|||||||||||||||}}}}}||{{{{zzzz{{{||||}~~~~~~~}~~}}}}||{{{{{{zzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzz{zzzyyyyyyyyyxyyyyyyzzyyyyzzzz{zzz{{{{||||}}}|{{{{{{{{{|||||}}}}}}}}}~~~~~~~}}~xxxxyyyyxwvvvwwxxxwwxxxyyyyxxxxxxyyyyyyyxxxyzzzyyzzzzzzzzz{{{{{{||||}}~~~~~~~~~~~~~}}~~~~}}}||||||{{{{{{{|||||{{{{{{{zzz{{{{|||}~~~~~~~~~}}}~}}~~~}}}}||||{|||{{zzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzz{|{zzzzzzyzzzyyzzzzzzzzzyyyyzzz{{{{{||||}}}~~}}||}}}||||}}}}}~~~~~~~~xxxyyyyyxwvvvwxxxxwwxyyyyyxxxxxxxyyyyyxxxxxyzzzzzyyyyyyyyyzzzzzz{{|||}}}}~~~~~~~~~~~~~~~~~~}}}}|||{{zz{{{{|{{{{{{{||{{{{{{{{|}}~~~~~~~~~~~}}~~~}}}~~~~~}}~~~~~~}|||||||||{{{{{{{{{{{{{{zzzzzzzzzzzzzz{{{{{{{zz{{{{{{{{{{{{{{{zzzzzzzzzzzzzz{{{{zyyyzz{{||||}}}}}}}~~~~}}}}}}}}}~~~~~~~~xxxyyyyyxwvvvwxxxxwwxyyyyyxxxxxxxxxxxxxxxyyyzzzzzyyyyyyyyxyyyyyyzz{{|||||}}}}}}}}}~~~~~~~~~~~~~}}}}||||{zzzzz{{{{{{{{{||{{{{{{{{|}~~~}}}||||||}}~~~}}~~~~~~~~~~~~~~}}}}}}}}||{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{zz{{{{{{z{{{{|{{{{{z{zzz{{|}}}~~~~~~~~~~~~~~~xxxxyyyyxwwvvwxxxxxxxyyyyyxxxxxxxxxxxxxxxwxyyzzzzyyyyxxxxxyyyyyyyzzz{{{{{||||||||||}}~~~~~~~~~~~~~~~~}}}}|||||{{zzzzz{{{{{{{{{{{{{{{{{{|}~~~~~}||{{|}|~~~}}~~~~~~~~~~~~~~~~}}}}~~~}}||{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{z{{{{{z{{{{{{||{{||{{{{{|}}~~~~~~~~~~~~~~~xxxxxyyxxwwwwwxxxxxxyyyyyyxxxxxxxxxxxxxxxwxyyyzzzyyyyyxxxxyyyyyyyyyyzzzzz{{{{{{{{{{||}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}||||||{{{{zzz{{{{{{{{{z{{{{|||}}}~~~~~~~}||}}|~}}|}~~~~}~~~~~~~~~~~~~~~~~~~~}||}~}}}||{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{|||{{{{{|{{{{{{{{{{|||{||||{{|}}~~~~~~}~~~~~~~~~wwwwxxxxwwwwwxxxxxxyyzzyyyyxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyxyyyzzz{{{{zzzzz{{|}~~~~~~~~~~~~~~~~~~~~~~~}~~~~}}||{||||{{zz{zz{{{zzzzzzzzzz{|}}}~~~~~~~}}}||}|{z{|}~~~~~~~~~~~~~}}}~~~~~}||}}}}|||||||||{{{zzzzz{{{{{{{{{zzzzyyyyzz{{{{{{{{zz{{{{{{{{{{{{{{{{|||{{{{{{{{|||||||||}~}}}|}}}}~~~~~~~~}~~~~~~wwwwxxxxwwxxxyyyyyyyyzzzzzyyxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyxxxwwwwxyyyzzzzzyyyyz{||}}~~~~~~~~~~~~~~~~}}}}}}}}}}~~}~~~}}}~~}|||||{||||{{zz{zz{{{{zzzzzzzz{{|}}~~~~~~~}}||{{y{||~~~~~~~~~~~}}}}}~~~}|||||||||||||||{{{zzzzz{{{{{{{{{zzzzzyyzzz{{{{{{{{zzzzzz{{{{{{{{{{{|}}|{{{{{{{{||||}}}|||}}|||}}}}}}}}}}}}~~~~~~~wwwwxxxxxwxxyyyyyyyyyzzzzzyyxxxxxxxxxxxxxxxxxxxyyyyyyyyyzyyyyyyyxxxwwwwxyyyzzzyyyyyyzz{{|}}~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}|}}}|||}~~~~~~~}||||||{||||{{zz{{{{{{{{{{{{{z{{|}}~~~~~~~~~~}}{}}~~~~~~~~~~~}}}}}~~~~}|||||||||||||||{{{zzzzz{{{{{{{{{zzzzzyyzz{{{{{{{{{zzzzzz{{{{{{{{{{||}}|{{{{{{{{||||}}}|}}~~}||}}}}}}}}}}}}~~~~~~~wwwwxxxxxxxyyyyyyyyyyzzzzyyxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyzzyyyyxxxxxwwxyyzzyyyyyyyyzzzz{{||}}}~~~~~~~~~~~}}}~~~~~~~}}}}}}}}}}}}||{{|{{||}}}}}}|||||}}}}|}}}}|{z{||}}}||}}||||{{||}~~~}}|}~~|~~~~~~~~~~~}}}}}~~~~~~~}|||||||||||||||||{{zzzzz{{{{{||||{{{{zzzz{{||||||||{{{zzz{{{{{{{{{{{{|||{{{{{{{{|||||}}|}}~~}|||}}~~~~~~~~~~~~~~~~~~~~wwwwxxxxxxxyyyyyyyyzzzzzyyyxxxxxxxxxxxxxxxxxxxxyyyxxxyyyyyzzyyyxxxxxxxxyzzzyyyyyyyyyyzzz{{|||}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~}}}}}}}}}}}}}|{{zz{{{{|||||||||{}}}}}|}}}}|{z{}}}}}}~}}}||{||}~~~~|~}|~~~~~~~~~~}~~~~~}~~~}}||||}}}}}}}}}}}}|{{{{{{{|||||||||{{{{{zzz{{||||||||{{{{{{|||||{{zzz{{|||{{{z{{{{|||||||||}~~}}||||}}}}}}}}~}~~~~~~}}~~~~~~~~wwwwxxxxxxxyzzzyyyzzzzzzyyyxxxxxxxxxxxxxxxxxxxxyyyxxxyyyxyzzyyyyxxxyyxxyz{zzyyyyyyyyyzzzzz{|||||}}}}}~~~~~~~}}}~~~}}}}}~~~~~~}}}}}}~~~~~~}}}}}}}}}}}}}|{zyyzz||}|||||||||}}}}||}}}}|||}~~~~~}}|||||}~~||~~~~~~~~~~~~~~}}}}}}|||}}}}}}}}}}}}}|{{{{{{{|||||}}}}|||||{zz{{||||||||{{{{{{|||||{{zzzzz{{|{{{z{{{{||||||||{|}~~}}|||}}}}}}}}~~~~~~~~}}~~~~~~~~~~~wwwwxxxxxxyyyzzzzyzzzzzzyyxxxxxxxxxxxxxxxxxxxxxyyyxxxyyyxyzzyyyyxxxyyxxyz{zzzyyyyyyyyyyyyyz{{{|||||||}}}}}}}}}}}~~~~~~}}}}}~~~~~~~~~}}}}}}}~~~~~~~~~~~~}}}}}}|{zyyzz||}|||||}}}|}}}}||}}}}}|}~}}|||||}}~~~{|~~~~~~~~~~~~~~~}}}}}}|||}}}}}}}}}}}}}|{{{{{{{|||||}}}}|||||{{{||}}}}}}}}||||}}}}}}|{{zzzzz{{||{z{{{{{||||||||||}~~}}|||}}}}}}}}~~~~~~~~}}~~~~~~~~~wwwwxxxxxxyyyyyyyzzzzzzyyxxxxxxxxxxxxxxxxxxxxxyyyyxxyyyyxyzzyyyyxxxyyyzzzzzzzyyyyyyyyyyyyz{{{|||||{{{||||||||||}~~~~~~~~~~~~~~}}}}}}~~~~~~~~~}}}}}}}}~~~~~~~}}}}}|{{zzzz||||||||||||}~~}}}~~~~~~~~~}}||}}~~~~|}~~~~~~~~~~~~~~~~}~~~~~}}}}}}}}}~~~~}}|||||{||||||||||}}||||}|||||}}}}}}}}||||}}}}}}|{{{|||{{|}|||||||||}||||}||}}~~}}}||}}}}}}~}~}}}}}}}}}~~~~~~~~~~wwwwwwwwxxyyxxyyyyyyyyyyxwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyxxxyyzzyyzzyyyyxxxyyyyyyyzzzz{{{{{{{{{{{{{{{{{||}}~~~~~}}}}~~~~~~~~~~~}}}~~}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}}}}~~~}}}}}}||{{z{{{{||||||||||~~~~~}~~~~~~~~~~~}}}~~~|}~~~~~~~~~~~~~}~~~~~~}}}}}~~}|||||||||||{{{{|||||||}}}}||||||}}}||}}}}}}}}||||||||||||}||||}|||||}}}}}}|}}}}}}}||}}}}}~~~~}||}||||}}}~}}}~~wwwwwwwwwxxxwwwwxxxyxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyzzyyyyyyyyxxxyyyyyyzzzzzzzzzz{{{{{{{{zz{{{{|}}}}~~~~~~~}}}}}}}}}}}}}}}|||}}~~~~~}}}}}}}}}}}}~~~~~}~~~}}||}}}|}}~~~}}|}}}|||||||{{{{{{{{{||||~~~~~~~}}}}}}~~~~~~}~~}~~~~~~~~~~~~~~~~~~~~~~}}~~}||||||||||||{{{{|||||}}~~}|||||}}|||}}}}}}|}}|||||}}}}||}||||}~}}}|}}}~~~}}}}}}}}}}}}}}~~~}||||{||}}}~}}}~~~~wwwwwwwwwwwwvvvwxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyzzyyyyyyyyxxxyyyyyyyyyyyyyyzz{{{{{{{{zzzz{{|||||}}~~~~~~~~}}}}}}}}}}}}}}}|||}}~~~~~}}}}}}}}}}}~~~~}}}~}}|||}}}|}}~~~}||||||{|||||{{{{{{{{{||}}~~~~~~~}}}}}}~~~~~~|}~}~}~~~~~~~~~~~~~~~~~}}}~~~~~}}|||||||||||||{{{|}}}}~~~~}}}|||}}|||}}}}}}}}}}}|||}}}}||}|||}~~~}}}}}}~~~}}}}}}}}}}~~~~~~}|}}|||}~}}}~~~~xwwwwwwwwwwwvvvwxxxxxxxxxxxyyxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxxyyyyyyyyyyyyyyyzzz{{{{{zyyzz{{{{{{||}}~~~~}}~~~~~~~}}}}}}}}}}}}}}}||||}}}~~}}}}}}}}}}}}}}}}}}}}}}}}||||}}|}~~}||||||{{||||{{{{{{{{{|}}}~~~~~~~}}}}}}~~~~~~}~}~~~~~~~~~~~}}~~~~~}}}}}}}|}}}}||||||}}}}}~~~~}}}|||}}}||}}}}}}}}}}}||||}}|||}}|}}~~~}}~~~~~~}}~~~~}~~~~~~~}}}||}~~~~~~~xxxwwwwxwwwwvvwwwwwwxxxxxxxyxxxxxxxxxxxxxxxyyyxxxxyyyyyyyxxxxxxxxyyyyyxyyyyyyyxxxyyyyyyxyyyyyyyyyzzzzzzzzzyyzzzzz{{{{||}}~~~~}}}~~~~~~~}}}}}}}}}|||||||}|||||}}}~~}}}|||||||||||}}}}}}|||}}|||||}}}~~~}||||||{{|||||||||{{{{|}}}~~~~}}}}}}~~~~~~~~~~~~~~~~~}}}~~~~}}}}}}}}}}}}}||||}}|||}}}}}|||{|}}}|}}}}}}}}}}}}||{{|||||}~}}}~~~}}~~~~~~~~~~~~~~~~~~~}}}~~~~~~yxxxwwwwxxxxwwwwwwwwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyxxxxxxxxyyyyyxxyyyyyxxxyyyyyyyxyyyyyyyyyzzzzzzzzzyyzzzzzz{{{{|||}~~~~}}~~~}}~~~~~~~~~~~}}}}}}}}}}||||||||{{{{||||}~~~~}|||||||||||||||||||||||}}}}}|||}}~~~}}}|{{{{{{{||||||||||{{{|}}}~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~}}}}}}~~}}}}}}}|{{{||}}||}}}}}}}}}}}}|||{||||}~}}}}~~~}}~~~~~~~~~~~~~~~~yyyxxxxyxxxxxxxxxwwwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyxxxxyyyxxxyyyyyyyxyyyyyyyyyzzzzzzzzzyyzz{{zzzzzz{{{|}}~~~}}}}}}}~~~~~}~~~~~}}}}}}|}}}}|||||||{{{{{|||}}}~~~}||||||||||||||||||||||}}}}}}|||||}~~~}}|||{{{{{{{{|||||||||||{{|}}}}}~~~~}}}}}}~~~~~~~~~~~~~~~~~}~~~~}}~~~~~~~~~~~~~~~~~~~}}}}~~}}}|}~~}|||||}}||}}}}}}}}~~}}}}||||||}~~}}}~~~}}~~~~~~~~~zzzzyyxxyyyyyyyyxxwwxxxxxxxxxxxxxxxxxxxxxxwwwxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyxxxxxyyyyyyyxyyyyyyyyyyyzzz{{{{zzzzzzzzzzzzzz{{||}}~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}|||||||{{{|}|||||}}~~~~~~~~}}||||||||||||||||{||||||}}}}||||{{{|||||||{z{{{{{{{{{{{{{{{{{{{{||}}~~~~~~~~~}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}~~~~~}~~~~~~}~}}}}}}}}}}~~~~~}}}}||||||}~~}}}~~~}~~~~{{{zzzyyyyyyzzzzyyxxxxxxxxxxxxxxxxxxxxxxxwwwwwwwwxxyxxxxwwwxxxxxxxyyyyyxxxxxwwxxyyyyyyyyyyyyyyyxxyyzzzzzzzzzzzzzzyyyyyzzz{{||}}~~~~~~~~~~~~~~~}}}}}|||||||}}}}}}}}}}}}}}}|||{{||||{{|||||{||}}}}}}}}}}|{||||||||||||{{{{{{{{{|||||||{{{{{|||{{{{zzzzzzzzzzz{{{{{{zzz{{|{}~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~~~}}}~~~~}~}~~~~~~~~~~~~~~~~~}~~}}}|}}||||}~~}}}}}~}}}~~~~~{{{{zzzzzzzz{{zzzzyyyyyyyxxxxxxxxxxxxxxxxwwwxxxxxxyyxxxwwwwxxxxxxxxxxxxxxwwxxxxxyyyyyyyyyyyyyyyxxxyzzzzzzyyyzzzzzyyyyyyzzzzz{{|}~~~~~~~~~~~~~~~~~~~~~~~}}|}|||{{{{{|||||||||||||||||{|{{{|||{{{{||{{{|}||||||||{{|||||||||||||{{z{{{{{{|||||{{{{zz{{{{{{{{zzzz{{zzzz{{{{{zzzz{{{||}~~~~~~~~}}}~~~~}}~~~~~~~~}}~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~}}}~~~}}}~~~~~~~~~~~}}}|}}}||}}~~}}}}}~}}|}}~~~~~~~~~{{{{zzzzzzz{{{{zzzzyyyyyyyxxxxxxwxxxxxxwwwwwxxxxxxyyxxxwwwwxxxxwwwxxxxxxwwwxxxxxxxxxxxxxxyyxxxyyyyyzzzzzzyyyzzzzzyyyxxyyyyyyzz{{}}}}}}~~~~~~~~~~~~~~~~~~~}}||}|||{{{{{||||||||||||||||{{|{{||{{zz{{{{{{{||{{||||||{|||||||}}||||{{{{{{{||||||||{{{{zzz{{{{{{{zzz{{{{zzz{{{{{zzzz{{|||}~~~~~~}}}}}}}}}~~~~~~}}}~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~~~}}}~~~~~~~~~~~}~}}}}}}}~~~}}}}}~}}|}}~~~~}~~~zzzzzzyz{{z||{{{{{zzyyyyyyyxxxwwwwwwwwwwwvwwwwxxxwxxxxwwwwwxxxwwwwxxxxxxwwwxxxxxxxxxxwwwwxxwxxyyyyyzzzzzyxyyz{zzzyyyxxyyyyxxyyzz{||||||}}~~~~~~~~~~~~~~~~~~~~}}||}||||{|||}}}|}|||||||||||{{|{{{||{{zz{{{{{||{{{||||||||||||||}}||||{{{||||||||||||{{{{zzzzz{{{{{zz{{{{{zzz{{{{{{{z{{{|||}~~~~~~}}}}}}}}}}}~~~~~~}}}}}}}~~~~~~~~}}}}~~~~~}}~~~~~~~~~~~~~~~~}~~~~}}~~~~~~~~~~~~~}}~~~}}}}~~yyyyyyzzzz{{{|||{{{zyyyyyyyyxxwwwwwwwwvvvvvwwwwwwwxxwwwwwwwxxxwwwwxxxxxxwwwxxxxxxxxxxwwwwwwwxxxxxxyyzzzzyxyyzzzzzyyxxxyyxxxxyyyzz{{||||}}~~~~~~~}}}}~~~~~~~~~~~}}|}||||||||}}}}}}}}||||||||{{|{{{|||{{zz{{{{{{{{{{{{{{|||}}}}}}}||||{{{|||||||||||||{{{{zzzzz{{{{zzz{{{{{zzz{{{{{{{{{z{|||}~~~}}}}}}}}}}}||}}~~~~~~}}}}}}}}~~~~~~~~}~~~~~~~~~~~}}}}}~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~yxxxxyyzzz{{{|||||{zyyyyyyyyxxwwwwwwwwvvvvwwvvvvvwwwwwwwwwwxxxwwwwxxxxxxwwwxxxxxxxxxxwwwwwwwwwxxxxyyzzyyyxxxyzyyyxxxxxyyxxxxxxyyz{{{{{|}}}~~~~~}}}}}}}~~~~~~~~~~~}}}}}|||}}}~~~~~}}}|||||||||{|{{{|}||{zzzzz{{{{{{{{{{{||}~~~~~~}}|||{||}}}}}}}}|||||{{{{zzzzz{{{{zzz{{{{{zzz{{{|}}}||{{{||}~~~}}}}}}}}}}}||}}~~~~~}}}}}}}}}}~~~~~~~~~~~~}}}}}}~~~~~~~}~~~~~~xwwwwxyyzz{{{{||||{zyyyyyyyyxxwwwwwwwwvvvvwwvvvvwwwwwwwwwwwxxxwwwwxxxxxxwwwxxxxxxxxxxwwwwwwwwwwwxxyyyyyyxxxxyzyyyxxxxxyyxxxxwxyyz{{{{{|||}}}~~~~}}}}}}}}~~~~~~~~}}}}}}}|}~~~~}}|||||||||{|{{{|}}|{{{z{{{||{{{{{{{{||}}}}}}}||{{{{{|}}}}}}}}|||||{{{{zzzzz{{{{zzzzzzzzzz{{{{|}}}}}|{{||~~~~}}}}}}}}}||}}~~~~~}}}}}}}}}}}~~~~~~~~~~}}}}}}~~~~~~~~~~~~wwwwwxxyyyzz{{{{{{{zzzzyyyxxxwwwwwwwwwvvuvwwvwwwxxxwwwwwwwwxxwwwwwxxxxxxwwwxxxxxxxxxxwwwwwwwwwwwwxxyyyxxxwxxxyyyyxxxxxyyxxyxxyyyzzzz{{{{{||}~~~~~}}}}}}}}~~~~~~~~~~}}~~}}~~~~}}|||||||||{|{{||||{{{{{{||||||{|||{{{{{{{{||||{z{{{{||||}}}|||||||{{{{zzzzz{{{{zzzzzzzz{{{{{||}}}}}||||}~~~}}}}}}}}||}}~~~~~}}}}}}}}}}}~~~~~~~~~~~}}}~~~~~~~~~~~wwwwxxxyyyzzz{{{{z{zyyyyxxxxwwvvvwwxwwvuuvwwwxxxwwwwwwwwwxxxwwwwwwxxxxwwwwxxxxxxxxxxxxxxwwwwwwwwwxxyyxwwwwxxxyyyxxxxxxxxxxxyyyxyyzzzz{{{z{||}~~~~~}}}}}}}}~~~~~~~~~~~~~~~}}~~~~~}||||{{{{{{||||||||{{{|||}}}||{{{{{{zzzzzz{{{{{{{{{{{{||||||||||||{{{zzzzzzz{{zzzzzzzz{{{{{{{{|||}}}}}|}~~~~~~~~~~~~~~}|||}}}}||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~wwwxxxxxxyzzzzzzzzzyyyyyyxxwvvvvvwwxwwvuuvwwwwwwwwwwwwwwxxxxwwwwwwwwwwwwwwxxxxxxxxxxxxxxxwwwwwwwwxxxxxwwwwwwwwxxxwxxxxwwxxxyyxxyyyyyyyyzzz{|}}}}}~~~~~~~}}}}}}}}}~~~~~~~~~~~~~~}}}~~~~~~~~~~~}|||{{{{{|||||{{{{z{||}}}}}}|{{{{{{zzzzzz{{||||||{{{z{{{{||||{{{{{zzzzzzyyz{{zzzzzzzz{{{{{{{{|||}}}}}}}~~~~~~~~~~~~~~~~}}|}}|||||}}~~~}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~wwwxxxxxxxxxxyyyyyyyyyyyyxxwvvvvvwwwwwvvvwwwwwwwwwwwwwwxxxxxwwwwwwwwwwwwwwxxxxxxxxwwwwwwwwwwwvvwwxxxwwwwxxwwwwwwwxyxxwwwwwwxxxxxyyyyyxxyyyzz{||||}~~~}}}~~~}}}~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~}||}~~}}}}}}}}}|{{{{{{{z{{{{{{zzz{|}}}}}}}|{{{{{{zzzzzz{|||}}||||{{{{{z{{{{{{{{{zzzzzzzzz{{{zzzzzzz{{{{{{{{|||}}}}}}}~~~~~~~~~~~~~~~~}~}}}||||||}}~~}}}}}~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~wwwwwwwwwwwxxxyyyxyyyyyyyxxwwvvvvwwwwwvvvwwwwwwwwwwwwwxxxxxxxwwwwwwwwwwwwwxxxxxxxwwwwwwwwwwwvvvwwwwwwwwwxxwwwwwwwxyxxwwwwwwxxxxxyyyyxxxxxyyzzzz{{||}}|||}}}|||}}}~~~~~}}}~~}}}}}}}}}}}}}}~~~~}}}}~}}~~~~~}||}~~}}||||||||{{{zzzz{{{{{{{zzz{|}}}}}}}||||{{{zzzzz{||||}~~}}|||{{{z{{{{{{{{{zzzzzz{{{{{{{zzzzzz{{{{{{{{|||}}}}}}}~~~~~~~~~~~~~~~~~}}||||||}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~wwwwwwwwwwwxxxxxxxxxxyyyyxxxwvvvvwwwwwvvvwwwwwwwwwwwwwxxxxxxxwwxwwwwwwwwwxxxxxxxwwwwwwwwwwvvvvvvvvvwwwwxxxwwwwxxxxxwwwwwwwwxxxxxxxxxxxxxxyyzzzz{{{{{{{{{{||||||}}}~~~~~~~~~~~~~~~}|||}}}}}}}}}}}}}}|}~~~}}}}}||}}}}}|||}}}||{{{{{{{{zzzzzzz{{{{{{{{z{{|}}}|||||{{{|||{zzzz{||||}}~~~}}|||{{{{{{{{{{{zzzzzz{{|||||{zzzzz{{{{{{{{|||}}}}}}}~~~~~~~~~~~~~~~~~~}}}||||||}}~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~wwwwwwwwwwwwwxxxxxxxxyyyyyxxwvvvvwwwwwvvvwwwwwwwwwvwwwxxxxxxxwxxxxwwwwwwxxxxxxxxwwwwwwwwwwwwwwwvvvvwwxxxxxwwwwxyyyxwwwvwwwwxxxxyxxxxxxxxxxyyzzzzzzzzzzzzz{{{{{||||||}}}}|}}~~~~~~~~~~~~~~~~~~}|{{{||}}}}}}}}}||||}}}}|||{||{|}}}}|{{|}||{zz{{{{{{zzzzzzz{{{{{{{{{{||}}||||||{{{||{{{zzz{||||||}~~}}||||{{{{{{{{{{{zzzzz{{|}}}|{{{{{z{{{{{{{||||}}}}}}}~~~~~~~~~~~~~~~~~~}~}|||||}~~~~~~~~~~}}~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~}~~wwwwwwwwwwwwwwxxxwxxxyyyyxxxwvvvvwwwwwvvvwwwwwwwwwvwwwxxxxxxxwxxxxxxxxxxxxxxxxxxwwwwwwwwwwwwwwvvvvvwwxxxxxwwwwyyyyywwwvwwwwxxxxxyyyxxxxxxxxyyyyyyyzzzyyzz{{{z{||||{|||||||}}}}}}}~~~}}}}~~~~~~~~~}}|{{{||}}}}}}}}||||||||{{zz{{{{||||||{{|}|{{{{{{{{{{{{zz{{{{|||||{{{|||}||{{|{{{{|{{{{{zz{{||||||||}}}||||{{{{{{{{{{{{zzzz{||}}}}|||{{{{|||{{{||||}}}}}}~~~~~~~~~~~~~~~~~}~~||||}}~~~~~~~~~}}||}}}~~~~~~~~~~}~~~~~~~~~~~~~~wwwxxxwwwwwvwwwwxxxxxyzzyxxxwwwwwwwwwwvvvwxwxxxwvwvwwxxxyxxxxwxxxyyyyyxxxxxxxxxxwwwwwwwxxxxxxwvvvvvwwxxyxxxxxxyyyyywwwwwwwxxxyyyyyyyxxxxxxxyyyyyyyzzzyyzz{{{z{zzzz{{{{||{{||||||||||||}}~~~~~~~~~~~~~~}}|{{{||}}}}}}}}|||||{{{{zzzz{{{|||||{{{|||{{{{{{||{{{{{{{{{|||||||||||}}||{{|{{{z{|||{zzz{{|||||||||}}||||{{{{{{{{{{{{zzzz{|}}}}}|||||||||||||||||}}}}}}~~~~~~~~~~~~~~}~}}|||}~~~~~~~~~~~~~~~~~~}}||}}}~~~~~~~~~~~~~~wwwwwwvwvvvvvwwwwwxxyyyyxxxxwwwwwwvvvvuuwwwvwxyvvvvwxyyyxxxxxxxyyyzzzyyxxxxxxxxxxwwwwwwwxxxxxwwvvuvvwwxxxxxwwxyyyxxxxwxxxxxyyyyzyyyxxxxxxxxyyyyyyyyzzzzzzz{{{{{zzzz{{{{{{{{{{{{{{{{{|||}~~~~~~~~~~~~~~~~~~~~~~~}}||||||||}}}}}}|||||{{zzzyzz{{{{{{{{{{{{|||||||||||{{{{{{{{|||||||}}}|||||{{||{{z{|||{zzyzz{{{{{{{{|}}}|||{{{{{{{{{{{{{{{{|}}}}}}}}||||||{{||||||||}}}}~~~~}~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~}}~~~~~~~}}}}}|}}~~~~~~~~~~~~~~~~~~~~~~wwwwwvvvvuuvvvwwwwwxyyyxxxxxwwxxxwwvvvuuvwwuwwxuuuvwyyyyxxxxxyyyyyzzzyyyxxxxxxxxxxxwwwwwxxxxxwwvvvwwxyxxxwwwwwxxxxxxxxyyyyyyyzzzyyxxxxxxxxxyyyyyyxyzzzzzzz{{{{{zzzzzzz{{{{{zzzzzzzzz{||}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}||||||}}}}}}}|||||{zzzyyyyz{{{{{{{{||||||||||}}}||||{{{{|||||||||}}|||{{{{||{{{||{||{zy{{||{{{{{||}}}}||{{{{{{{{{{{||{{||}}}}}}}}|||||||{|||||||||}}}~~~}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~}}}}|}}~~~~}}~~~~~~~~~~~~~~~~~~~~~wwwwwvvvvuuvvvvvwwwxxxxxxxxwwwxxxwwvvvuuvwwuwwxvuuwxyzyxxwxyyyyzzzzzzzyyyyxxxxxxxxxxwwwwxxxxxwwvvwwxyxxxxwwwwwwxxxxxyyyyyyyyyzzzyyxxxxxxxxxyyyxxxyzzzzzzzz{{{{{zzzzzzzzzzzzzzzzyyyyyz{{|||}}~~~~~}}~~}~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~}}|||||}}}}}}}}|||||{zzzyyzzz{{|||||||||||||||}}}}}|||{{{|||||||||||||{{{{{|}}|||||}}|{{z{|||{{{{{||}}}}}|{{{{{{{{{{||||{{|}}}}}}}||||||||||||{{{{|}}}}~~~}~~~~~~~~~~~~~~}}}|||}}}}}}}}}~~~~~~~}}}}~~~~~~}}}~~~~~~~~~~~~~~~~wwwwvvvvvuuvvvvvwwwxxxxxxxwwwwxxxwwvvvuuvvvuvwxvvvxyzzyxwvwxyyzzzyzzzzzzyyyxxxxxxxxxxwwxxxxxxxxwwwwxxxxxxxwwwwxxxxxxxxxxyyyyyzzzyyxxxxxxxxxxxwwwxxxyyyzzzzzzzzzzzzzzyyzzzzzzzzzyyyyyyzzzz{||}}}}}}}~~}~~~~~~~~~~~~~~}}}}}}}}~~~~~~~~~}}}~~~~~~~~~~}}}}|||}}}}~}}}}|||||{zzzzzzz{{||||||||||||||}}}}}}|||{{{{{{|||||{{{{{{{{{{{|}}}|||}~}}|{{||||||||||}}}}}}|{{{{{{{{{|||||{{{||||||||||||||||{{{{{z{{||}}}}}}}~~~~~~~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~}}}~~wwwwvvvvvuuvvvwwwwxxxxxxxwwwwxxxxwwvvvuuuvvuvwwvwwyzzzxwvvwxxyzzyyzzzzzyyyyxxxxxxxxxxxxxxxxxxxxxwwwwxxxxxxxxxxxxxxxxxxxxxyyyzzzzyyxwwwxxxxxxwwwwxxxxxyyzzzzzzzzyzzzzyyzzzzzzzzyyyyyxxxyzzzz{{|}}|}~~}}~~~~~~~~}~~~~~~~}}}}}}}}}~~~~~~}}}}}}}}}}}~~~~~~~}}}}||||}}}}}}}}}|||||{{{{{{{{{|||||||||||||||}}}|||||{{zzz{{{{{{{{{{{{{{{{{||}}}||}}}~}||{||||||||||}}}}|||{{{{{{{{{{|||{z{{{{||||||{{{{{{{{{{{{{zz{{|||||||}~~~~~~~~~~~}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}}~~~wwwvvvvvvuvvvvwwwwxxxxxwwwwwwxxxxwwvvvuuutuuvwwwwxz{zzxvuuvwxyzzyyzzzzzyyyyxxxxxxxxxxxxxxxxxxxxwwwwwwxyxxxxxxxxxxxxxxxxxxyyyzzzzyxwwwxxxxxxwwwwwwwwxxyyyyyyyyzzzzzzzyzzyyzzzzyyyyyxxwwxyyyyzz{|||}~~}~~~~~~~~~}}~~~~~~~}}}}}}}}}}}}}}}}}}|||}}}}||}}}}}}}}}}}}}|||||||}}}}||||}||||{{{{{{||||||||||||||||}}|||{{{{zzzzzz{{{{{{{{{{{{{{|||}}}|}}}}~~}||}|||}}}}}}}}}||||{{{{{{{{{{{{{{z{{{{||||||{{{{{{z{{{{{{zz{{||||||||}~~~~~~~~~~~~~~}}}}}}}}~~~~~~~}}}~~~}~~~}~~~wwwvvvvvvuuvvvvwwwwwwwwwwwwwwxxxxwwvvvuttuuuvvwwxy{|{yxvuuvwyyzzyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxwwwwwwxyxxxxxxxxxxwxxxxxxxyyyzzzyxxwwwxxyyxxwwwwwwwwxxxxyyyyyyyyzzzzyyyyyyyzzzyyyyxxyxxxyyyyzz{{{|}}}}}}~~}}}}}}}~~~~~~}}}}}}}}}}}|||||||||||||}}}}}}}}}}}}}}}}}|||{{{||||||||}}}||||{{{{{|||||||||||||||||||{{{{{zzzzzzzz{{{{{{||||||||||||||||}~}}}}||||}}}}|||}}}||{{{{{{{{{{{{{{{{z{{{||||||{{{{{{{z{{{{{{{{{{||}}}|||}}}~~~~~~~~~~~~~~~}}}}}}}~~~}}~~}~~~~~wwwvvvvvvuuvwwvwwwwwwwwwwwwwwxxxxwwvvvuttuuuuvwwyy{{{ywvuuvxyzzyxxyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyxxxxxxyyyyyxwwwwwwwwxxxxxxyyyyyzzzzzzyyyyyyyyyyyyyyyyxxyyyzzzzz{{{|||||}}}}}}}}~~~~~}}}||}}||}}}}|||||||||||}}|}}}~}}}}}}}}}}}}}|||{{{{{{|||}}}}}}|||||||||||||{{{{|||||||||{{{{{{zzzzz{{{{{{{{||||||||||||||||}||||}}||{||||||||}}|||{{{{{||{{{{{{{{zz{{|||||||{{{{{{{{{||{{{{{|||}}~~~}}}}}~~~~}~~~~~~~~~~~~~~~~~~~~~~~}~~wwwvvvvvvvvuwwwwwwwwwwwwwwwwwwwwwwwvvuuuuuuuuuvwxyzzzywvvvwxyyyyxwxxyyyzyyyyyyyyyxxxxyyxxxxxxxxwwwwwwwxxxxxxxxxxxxxxxxxxxxxxyyxxxwwwxxxxxyyxwwwwwwwwwwwxxxxyyzz{{zzyyyxxyyyyyyyyyxxxxxxxyzzzzzzzz{{{|||}||}~}}}}}}~}}}||||||}}}}||||||||||}}}}}}~~}}}}}}}}}|}}}||||{{{{{||||}}}}}}}||||||||||{{{{{||||||||{{{{{z{zzzzz{{{{{{{|||||||||||||||||||{||||{{{{||||||||||{{{{{{{||{{|||{{{z{{|||||||{{||||||||||||||||||}~~~~}}}}}~~}}~~~~~~~~~~~~}}~wwwvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwvvuuuuuuutuvvxxyyyywwwwwxxxxxxwxxyyzzyyyyyyyyyyxxyyyxxxxxxxxwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxxxxwwwxxxxxyyxwwwwxxwwwwwwxxxyyz{{{{zyyxxxxxyyyxyyyxxxxxxyzzyyyzzzzzzz{{||}}}~}}}}}|||||||||||}}}}|{||||||||}}}}}~~~}}}}}|||||}}||||||{{{{{{{|}}}}}}}}|||{{{{{{{{{{{{|||||||{{{{z{{{{zz{{||{{{{|||||||||||||||||{{{{{||{{{{{{{{|||||{{{{{{{|||||||||{{z{{|||}||||||||||}}|||||||||}}}~~}}}}}}}}~~~~~~~~~~~~wwwvvvvvvvuvvvwwwwwwwwwwwwwwwwwwwwvvuuuuuuuttuvvvwxxxxwwwwwwwwwxxwwwyyzzyyyyyyyyyyyyyyyxxxwwwwwwwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxwwwxxxxxyyxxxxxxxwwwwwwwwxxyzzzzzzyxxxxxxxxxxxyyxxxxxyzzyyyyyyyyyyyz{{|||}}}|||||{{{|||||{||}}}|{|||||||}}}||}~~~}}}|||||||||||||||||{{{{{{||}}}}}}||{{{{{{z{{zzz{{{{||||{{{{{|||{{{{||||{{{||||||||||||||||{{{{{{||{{{{{{{|||||||||||||||||}}}}||{{{{||}}}}|||||||}~}}}}}||||}}}~~~}}}}}}}~~~~~~~~wwwwwvvvvvvvvvvvwwwwwwwwwwwwwwwwwvvuuuuuuutttuvvvvwwwwwwwwwwwwwxxwwwxxyyyyyyxxxxxxxyyyyxxwwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxwwxxxxyyyyyxxxxxxwwwwwwwwwxyzzzzzyyxxxxxxxxxxxyyxxxxxyzzyyyyxxyyyyyzzz{{{||||{{{{{{{|||||{{{|||{{|||||||||||||}}}}}||||||||||||||||||||{{{{|||||||||{{{{{zzzzzzzz{||||||||||||||||{{|||||||||||||||||||||||||||{{{||||||||}}}|||||||||||||||}}}}}||{||}}~~}}}}||||}~~~}}}}}||}}}~~~~~~}}}~~~~~~~~~~wwwwwwvvvvvvvvvvvwwwwwwwwwwwwwwwvvuuuuuuuutttuvvvvvvvwwwwwwvvwwxxwwvwxyyyyxxxxxxxxxyyyyxxwwwwwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxwwxxxxwwwxxyyxyyyxxxxxwwwwwwwwwxyzzzzzyyxxwxxxxxxxxxyyxxxxxyyyyyyxxxxxxxyyzzzz{{{{{z{{{{{{||||{{{{{{{{|||||||||{{{||}}||||||{||||||||||||||}}||||||||||{{{{{zzzzzzzzzzz{{||||}}}}}||}|||||}}}}||||||||||||||||||||||||{{{||||||}}}}||||{{{{||||||}}}}}}}|||}~~~~~}}}}||}~~~~~}}}}}|||}}}~~~~~~~~~~~~~~~~~xwwwwwvvvvvvvvvvvwwwwwwwwwwwwvvvvuuuuuuuuutttuvvvvvvvwwwwwvvvwwxxwvvwxyyxxxxwwwwwxyyyyyxxwwwwwwwwwwwwwwwwwwwwwwwwwwwxxxxxxwwwwxxxwwwxxyyxyyyxxxxxwwwwwwwwwxxyzzzyyxxxwxxxxxxxxxyyxxxwxxxyyyxxwwwxxxxyyyyyyzzzzz{{{{{|||||{{{{{{{|||||||{{{{{{|}||||{{{{||||||||||||||}}}}||||||||{{{{{{zzzzzzzzzzz{{|||}}}}}}}||}}||}}}}}}|||||||||||||||||||||||{{{|}}}}}~~~}||||{{{{||||||}}}}}}}||}}~~~~~}}}}||}~~~~~~}}}}||||||}~~~~~~~~~~~~~~~~~~xxwwwwvvvvvvvvvvwwwwwwwwwwwwvvvvuuuuuuuuuutttuuuvvuvvwwwwwvvwwwxxwwwwxyyxxxwwwwwwxyyyyyxxwwwwwwwwwwwwwwwxxwwwwwwwwwwwwxxxwwwwwwwwwwwwxxxyyyxwwwxwwwwwwwwwwxxyyyyyyxwwxxxxxxxxxxyyxxxwwwxyyxxwwwwwxxyyxxxyyyyyyzzz{{{|}|{{{z{{{{{{|||||{{{{{{{{{||{{{{{{{{{||||||||||}}}~}}|||||||{{{{{{zzzzzzzzzzz{{{||}}}}}}}||}}|||}}}}}|||||||||||||||||||||||{{{||}}}}}}}}|||{{{{{||||||}}}}}}}|||}~~~~}}}}}||}}~~~~~}}}}|{{{{||}~~~~~~~~~~~~~~yxxxxwwwwvvvvwwwwwwwwwwwvvvvvvvuuuuuuuuuuuttuuuuuvvvwwxwwwvvwwwxxwwwwxyyxxwwwwwwwxyyyyyxxwwvwwwwwwwwwwwwxxxwwwwwwwwwwwwwwwwwwwwwwvwwwxyyxyxxwwwxwwwwxxxxxxxxyyyyyxxwwxxxxxxxxxxyyxxxwwwwxxxwwwxxxxxyyxxxyyyyxxyyyyz{{{{{zzz{{{{{{{{{{{{{{z{{{{||{{{{{{{{{{{||||{{{|||}~~~~}}}||||{{{{{{zzzzzzzzzzz{{{{||}}}}}}||}~}||}}}}}||||||||||||||||||||}}|{{{||}}}}}||||{{{{{{{||||||}}}}}}}|{|}}}}}}}}~~}|}}~~~~~}}}}|||||||}~~~~~~~~~~~~~yyxxxxwxwwwwwwwxwwwwwwvvvvvvvuuuuuuvvuuuuuuuvuuuuuuvwwxxwwvvwwwwxxxxxxyyxxxxwwwxxxyyyyxxwwwvwwwwwwwwwwwwxxxwwwwwwwwwwwwwwwwwwwwwwwwxxwxxxxxxxxxxxxxxwwwwwwxxxyyyxxxxxwxxxxyyxxxxxxxwwwwxxwwwxxyyyyxxxxxxxwxxwxxxxyyyz{{zzz{{{{{{{{{{{{{{zzz||||{{{{{{{{{{{{{{{{{{{{||}~~~~}}|||||{{{{{{{zzzzyzzzzzz{{{{||||||||}}~}|||||||||||||||||||||{|||{||}}|{{{||||||||{{zzyzzyzz{||||}}}}}}|{{{|}}}}}}}~~}}}}~~~~~~~}}|||||||}~~~~~~~}}}~~~~~~~~~~~~yyxxxxwwwxxxxxxxxwwwwwvvvvvvuuuuuuvvvuuvuuuuvuuvvuuuwwxxwwwwwwwvwxxxyyyyxxxxwwxxxxyyyxxwwvwwwwwwwwwwwwwwxxxwwvvwwvvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxxwwwwwwwwxxyxxxxxxxxxxyyyyyxxxxxwwwwxxwwwxxyzzyxxxxxyyxxxxwwwxxxyyzzz{{{{{{{{{{{{{{{{{{{||||{zzzzzzzzzzzzzzz{{{{{|}}}}}}}|||||{{{{||{{zzzyzzzz{zz{{{{{||||{|}}~}|||||{{||||||||||||||{|||{{|}}|{{{|||||||||{zzz{{z{{{|||}}}}}}||{zz{||||||}}}}}}}~~~~~~~~}||||||}~~~~~~~~}}}}~~~~~~~~~~~~~yyxxxxwwwxxxxxxxxwxxwwwvvvvvuuuuuuvvvuvvvuuuuvvvvuuuwwyxwwwwwwvvwxxyyzyyxxxxwwwxxyyyxxxwwwwwwwwwwxxxxxwxxxxwvvvvvvvvvvwwwwwwwwwxxxxxxxxxxwxxxxxxxxxwwwwwwwwwwxxxxwxxxxxxyyyyyyxxxxxxwwwxxwwwxxyzzzyxxxxyyxxxwxxxxxxyyyz{{{{{{{{{{{zzzz{{{{{{{{{{zzzzzzzzzzzzzzz{{{{{||}}}}|||||||{{{||||{zzzzz{{{{{{{{{{{{||{{||}}|{{{{{zz{{{{||||||||||{|||{{|}}|{{|||||}}||||{z{{{|||}|||}}}}}}|{zzz{{|||||}}}}}}}~~~~~~~~~}}}}}}~~~~~~~~~}}}}~~~~~~~~~~~~~~~~yyxxxxxxxxxxxxxxxwxxwwwvvvvvuuuuuvvvvvvvvuuuvwvwwvvvxxyxxwwwwwvvwxyzzzzzyxxxwwwxxyyyxxwwwwxxxxxxxxxxxxxxxxxwvvvvvvuuuvwwwwwwwvwxxxxwwwwwwwxxxxxxxwwwwwwwwwwwwwwwwwxxxwxxyyyyyyxxyxxxxwwxxwwxxyzzzzyxxxxyyxxxxxxxxxxyyyz{{{{{{{{{{zzzzzz{{{{{{{{zzzzzzzzzzzzzzzz{{{{z{||||||||||||{{{|||||{zzz{{{{{{{{{{{{{{{{{{|}}|{{{{{zz{{{{||||||||||{|||{{|}}||||||||}}}|||{{|{{}}||}}|}}}}}||{zzz{|||||||}}~}}}~~}}~~~~~~}}}}~~~~~~~~~~}}}}~~~~~~~~~~~~~~~yyxxxxxxwxxxxxxxxwxxxwwwvvvuuuuuvvvvvuuvvvvvvvwxwvvwxyyxxxxwwwvvwwxy{{{zyyxxxxxxxyyyxxwwwxxxxxxxxwwxxxxxxxwvvvvvvvuuuvwwwwwwvvwwwwwwwwwwwwxxxxxxwwwwwwwwwwwvvwwwwwxxxwxxyyyyyyxyyyxxxxwwxxxxyzzzzyyxxxxxxxxxxxxxxxyyzzzz{{{{{{{zzzzzzzzz{{{{{{zzzzzzzzzzzzzzzzz{{{zz{{||||||||||{{{{|||||{zz{|||||{{{{{{{{{{{z{|}}}|{{{z{{{{{{||||||||||{|||{{|}|||||||||}}}}||{{|}}}}~~}}}}}}}}||{{z{||||||||}}}}}}~~}}}~~~~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~yxxxxxxxwxxxxxxxxxxxxxwwwvvvuuuvvwwwvuuvvvvwwvwxxwwwxyyxxxxwwwvvvwxyz{{zzyxxxxxyyyyyxwwwxxxxxxwwwwwwxxxxxxwvvuvvvvuuuvwwwxwwvvwwwwwvwwwwwwxxxxxwwwwwwwwwwwvvvvvvwwxxxwwxxyyyyyyyyyyxxxxxxxyyzz{{zyxxxxxyyxxxxxxxxxyzzzzzzzzz{zzzzzzzzzzzz{{{zzzzzzzzzzzzzzzzzzz{{zzzz{{{{||||{{{{{{{||||{{z{||}}}}}||||{{||{{z{||}||{{{{{{{{{{{{{{||{{{{|}|||||||||||||||}}}}||{|}}}~~~~}}}}}}}}|{{{{{|}}|||||}}}}~~~~}}}~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~xxxxxxxxxyyyyyyyxxxxxxxxxwwvvvvvwwwwvuuvvvwwwvwxxwwwxyyxxxxwwwvvvwxyz{{zzyyyyyyyyyyxxwwxxxyyxwwwwwwwxxyyxxwvvuvvvvvvvvwwxxxwvvwwwwwvwwwwwwxxxxwwwwwwwwwwwwvvvvvvwwxxxwwwxyyyyyyyyyyxxxxxyyyyz{{{zyxxxxxyyxxxxxwwxxxyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{zzzzzzz{{{{{{{{{{{{{{{{{{{||}}}}~~}}|||||||{{{|||{{{{{{{{{{{z{{{{{{{{{z{|}|||||{||||||||}}}}}}}|}}}~~~~}}}}}}}}|{||||}}}}|||}~~~~~~~~}}}~~~~~~~~~~~~~~}}}~~~~~~~~~~~~~~~~~~~~~xxxxxxxxxyyyzzzyyxxyxxxxxxwwvvvwwwwwvvuvwwwwwwxxxwwxxyyxxxxxwwvvvwxyzzzzzyyyzyyyyyxxxwwxxyyyxxwwwxxxxyyyxxwvvuvvvvvvvvwwxxxwwwwwwwwvwwwwwwxxxxwwwwwwwwwwwwvvvvvvwwwwwwwwxxxyyyyyzyyxxxxxyyyyz{{{zyxxxxyyyxxxwwxxxxxyzzzzyyyyzzzzzzzzzyyyyyzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{z{|}}~~~~~}}|||||||{{{{{{{{{{{{{{{{{{{{{{zzzz{{|}}|||||||||||||}~}}}}}|}}}~~~~}}}}}}}}|||||}}}}}}}}~~~~~~~~~}}~~~~~~~~~~~~~~}}}~~~~~~~~~~~~~~~~~~xxxxxxxxyyyyzzzzyyyyyyyyyxxxwwwwwwwwvvvvvvvvvvwxwwxxyyyxxyyxxxvvvwxyyzzzyyyyyyyyxxwwwwwxyyyyxxxwxxxxxyyyxxwvvuvvvvvvvwwxyxxxwwwwwwvvwwwwwxxyxxxwwvvwwwwwwwvvvvwwwwwwwwwwwxxyyyyzzzzyyyyyzzzzz{{yxxwwxxxyyxxxxwwxwwxyyzyyyyyyyyyzzzyyyyyyyyzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{z{{{{zz{{{{z{{{{zyz|}~~~~~}|||{||||{{{{{zz{{{{{{{{{{{{zzzzzz{{|}||||||{||||||||}}}}}}}}}}}}}}}}}}}}}}|||}}}}}}}}}}}~~~~~}}~~~~~~~~~~~~~~~~}}}}}}~~~~~xxxxxxxyyyyyyyyyzzzzyyyyyyxxwwwwwwwwwwvvvvvvuvwwwxyyyyxxxyyzyywwwwwxyyzzzzyyyyyxxwwwwwxyyxxxxxxxxyyyyyyyxxwvvvvvvvvvvwxxxxxxwwxxwvvvwwxxxxyyyxxwwvvvvvvwwwvvvwwwwwwwwwwwwwwxyyzzzyyyyyyzzzzzzzzyxxwwxxxyyxxxwwwwwwxyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzz{{{{zzzz{{{{{{{zzzzzzzz{{{{zyz|}~~~~}|{{|||||{{zzzz{{{{{{{{{{{{{{{{zzz{{|}||||||{|{|||||||}}}}}}}}}}}}}}}}}}}}}}|}}}}|||||||}~~~}}}~~~~~~}}}}}~~~~}}}}}}~~~~~xxxxxxxyyzzyxyxyzzzzyyyyyyxxwwwwwwwwwwvvvuuuuvwwwxyyyxxxwxyzyywwwwwxxyzzzzyyyyyxxwwvwwxxxxxxxxxyyzyyyyzyxxwvvvvvvvvvvwxxxxxxxwxxwvvvwwxxxxyyyyxxwvvvvwwwwwwwwwwwwwwwwwwwwwwxxyyyyyyyyyzzzzzzzzzyxxwwxxxyyxxwwwwwwwxyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzyyzz{{{{{{zzzzzzzyzzzzyyz|}~~~~~}}|{{||||{{{zzzz{{{{{{{{{{{{|{{{{{{z{|||||{|{{{{||||||||}}}}}}}}}}}||}}}}}}}}}}~~}|||||||}~~}}}}~~~~}}}}}}~~~~}}}}}}~~~~xxxxxxxyyzzyxxyz{zzzyyyyyyxxwwwwwwwwvvvuutuvvvwwwxxxxwwwxxyzyywwwwwxxxyzzzyyyyyxxwvvvwxxxxwxxxyzzzyyyzzyxxwvvvvvvvvvvwxxxxxxxxxxwvvwwxxxxyyyyyxxwvvvwwwwxwwwwwwwwwwwwwwwwwwxxxyyyyyyyzzzzzzzzzzyxxwwxxxyyxxwwwwwwwxyyyyyyyxxxxxxyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzyyyzzzz{{{{zzzzzyyyzzzzyyz||}~~}}}||{{{{{{{{{{{{{{{{{{{zzzz{{{|||{{{{{|||||{{{{{{{||||||||||}}}}|||}}}}}}}}}}}}}~~~~}|||||}~~}}}}}}~~~~~~}}~~~~~}}}}}~~~xxxxxxxyyzzzyyzz{{zzyyyyyxxxwwwwwwwvvvvuutuuvvwwwxxxwvvvxxzzyywwwwwxxxyzzyyyyyyxxwvvvwxxxwwxyyyyzzyyyzzyxxwvvvvwvvvvwxxxxxxxxxxwwvvwxyyyyzzzyyyxwvvvwxxxxxwwwwwwwwwwwwwwwwwxxxxxxxyyyzzzzzzzzzzyxxwwxxxyyxxwwwwwwwxyyyyxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzyyyyyyyzzzzzzzzzzyyyyyzzzyyyz{{}}}|||{{{{{{{{{{{{{{{{{{{{{zzzzz{{||||{{{{|||||{{{{{{|||||||||||}}}}||||}}}}}}}}}}}}~~~~}}}}}}}~~}}}}}}}~~~~~~~~~~~~}}}}}~~xxxxxxxyyzzzzzz{{{zzyyyyxxxxwwwwwwwvvvuuutuuvvwwwxxwvvuvxxzzyywwwwxxxxyyyyyyyyyxwvvvvwxxxwwxyyyyzzyyzzzyxxxwvvvvvvuvwwxxxxxxxxwwwwwxyzzzz{{zzzyxwvvwxxxyyxwwwwwwwwwwwwwwwxwwwwwxxxyyyzzzzzzzzzzyxxwwxyyyyxxwwwwwwwxyyyxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyzzzzzzzyyyyyyyzzzzzzzzzyyyyyyyyyyyyyyzz|||{{{{{{{{{{{{{{{{{{{{{{{{z{{zz{|}}}|||{{||}||||}||||||||||||||}}}|||||}}}}}}}}}}}}~~~~~}~~~~~~}}}}}}~~~~~~~~}}}}}~wwwwwwwxyzzzzzz{{{zzyyyxxwwwwwwwwwwvvvvvvuuuuvvwxwwvvuuvxxzzyywwwxxxxxyyyyyyyyxxwvvvvwxxxwxxyyyyyyyyzzzyxxxwvvvvvvvwwwwxxxxxxwwwwwxyzz{{{||{{zyxwwwwxxxyyyxwwwwwwwwwwwwwxxxwwwwwxxxyyzzzz{{{zzzyxxwwxyyyyxxwwwwwwwxyyyxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyzzzzzzzyyyyyyyzzzzzzzzyyyyyyyyyyyyyyyzz{{{{zz{{{{{{{{{{{{{{{{{{{{{z{{{z{|}}}}|||||}}}|||}||||||||||||||}}||||||}}}}}}}}}}}}~~~~~~~~~~}}}}~~~~~~}}}}}~wwwwwwwxxyzzz{{{{zzyxxxwwwwvwwwwwwvvvvvvvvvvvvvvwwvvuuuvxxzzyxxwxxxxxxyyyyyyxxxwwvvvwwxxxwxxyyyyyyyzzzyyxxxwvvvvvvvwwwwwxxxxwwwwxxyzz{|||}||{{yxxwwwxxyyyyxxxxxwwwwwwwxxxxxxwwwwxxxxyzzz{{{{{zzyxxwwxyyyyxxxxxxxxxxyyyxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyzzzzzzzyyyyyyyzzzzzzzzyyyyyyyyyyyyyyyzz{{{zzzzzzzzz{{{{{{{{{{{{{{{z{{{{{|}}}}||||}}}}||}}}|||||||||{|||}}||||||}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}~~~~wwwwwwwxxxyyzz{zyyyxxwwwwvvwwwwwwwvvvvvvwvvvvwwwwvvuuvvwwxyyyxwxyxxxxxyyyyyyxxxwwvvvwwxxxwxxxyyyyzzz{zzyywwvvvvvvvvwxwwwwxxwwwwxyyyzz{|}}}}|{{yyxxxxxyyyyyyxxxxxxwwwxxxxxxxxxwwwxxxxyzzzz{{{{{zyxxxxxyyyyyyxyyyxyyyyyyxxxxxxxwwxxxxxyyyyyyyyyyyyyyyyyyyzyzzzzyyyyyyyyzzyyyyyyyyzzyyyyyyzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{|}}}}}}}||}}}}}|}}}}||||||||{{||||||||||}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~wwwwwwwxxxxyyyzyyxxwwwwwwvwxwwwwwwvvvvwwwwwwwxxxwwvuvvvwwwxxxxwxxxxxxxxyxxxxxxwwwwwwwwwwwwwxxxyyyzzzzyyxxwwvvvvvvvwwxxwwwwwwwwwxyyzz{|}~~~|{{{zzyxxyyzzzyyyyxxxxxxxxxxxxxxxxxxxxxxxxxyzzz{{{{{zyxxxxyyzzyyyyyyyyyyyyyyxxxxxxxwwwxxxxxyyyyyyyyyyyyyyyyyyyyzzzyyyyyyyyyzzyyyyyyyyzzzyyyyzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{z{{{{{||}}}}}}}}}}}}}}|}}}}||{{|||{{||||}}}|||}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~}~~~~~~wvvvvvvwwxxyyxxxxwwwwwwwwxxxwwwwwwwvvwwxxwwwxxxxwwvvvvvwwwwwwwwwxxxxxwxxxxxwxwwwwwwwwwwwwwwwxxxxyzzzzyxwxwwwvvwwwwxxxxxxwwwwwwwxyzzz||}~~}|{{{zzzyyyzzzzzyyyyyyyyxxxxxxxxxxxxxxxxxxxxxyzzz{{{zyxxxxxyyzzzyyzzyyyzzzzzyyxxxxxxwwxxxxxxxxyyyyyyyyyyyyyyyyyyyzzyyyyyyyyyzzyyyyyyyyzzzzyyzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{zzz{{{{{|}}}}}}}}}}}}}}}}}}}||{{{||{{{|||}}}}}}|}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}~~~~~~wvvvuvvvwwxxxxwwwwwwwwxxxxxxwwwwwwwwwwxxxwwxxxxxwwvvvvvwwwwwwwwxxxxxxwxxxxwwwwwwwwwwwwwvvwwwwwwwyyyzyxxwxwxwvwwwxxyxxxxxwwvvvwwxyzz{|}}~}||{{{zzzzzzzzzzzzyyyyyyyyxxyyyyyxxxxxxyxwwwwwxyzzz{zzyxxxxxyyzzzzyzzzzzzzzzzzyxxyyyxxwxyyxwwxyyyyyyyyyyyyyyyyyyyyzzyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{zzzzz{{{{{|}}}}|||}}}}}}}}}}}}||{{{{{{{{||}}}}}}}|}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~wvvvvwwwwwxxxxwwwwwwxxxxxxxxwwwwwwwwwxxxxxxxxxxxwwvvvvwwwwwwwwwwxxxxxwwwwwvvvwwwwwwxxxwwwwwwwwwwwwxwwvvwwxxxwwwxxyyyxxyxwvvuuvwxxyz{|}}||{{{{{{zzzzzzzzzzzyyyyyyyyyxyyyyyxxxxxyyyxwwwwxyyzzzzyxxxxxyyzzzzyyzzzzzzzzzzzyyyyyyyxxyyyxwwxxyyyyyyyyyyyyyyyyyyyzzyyyyyzyyyyyxxxxxyyyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{||}}|||||}}}}}}}}}}||{{z{{{{{||||}}}}}||}}}}}}}}}}}}}}}}~~~~~~~~~~~~~}}}}~~~~~~~~~~~~vvvvvwwwwwwwwwwwwwwxxxxxyxxxxxxwwwwwwxxxxxxxyyxwwvvvvwxxwwwwwwwwwxxxwwwvvvvvvwwwwwwxxwwvvwwwvvvwwvwvvvwxxyyxxxxxyyyyyxyywvvuuuvwxyz{|}}{{zz{{{{{{zz{{{{{zzyyyyyyyyyyyyyyyxxxwxyyxxwwwwxyyyzyyxxxxxxyyzzzyyyzzzzzzzzzzyyyyyyyyxxyyyxxxxxyyyyyyyyyzzzzyyyyyyzzyyyyzzzyyyyxxyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{|||||||||||||}}}}||{{{zzz{{{||||}}}}|||}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~vvvvvwwwwwwwwwwwwwwxxxxxxxxxxxxxwwwwwxxxxxxyyyxwvvvvwwxxwwwwwwwwwwwwwwvvvvvvvwwwwwwwwwvvvvvvvvvvwvvuvvwxxyyyxxxyyyyyyxxxwwvvuuvwxyz{||{zzzz{{{{{{{z{{{{{{zzyyyyyyyyyyyyyyxxwwxyyxwwwwwxxyyyxxxxxxxxxyyyyxyyzzzzzzzzzyyyyyyyyyxxyyyyxxxxyyyyyyyyyzzzzzyyyyyzzzzzzzzzzzzzyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{||||||||||||}}}||{{{{zzzz{{|||||||||||}}}}}}}}}}}}}}}~~~~~~~~~~vvvvvwwwwwwwwxxwwwwwwxxxxxxxxxxxwwwwxxxxxxyyyyyxvuvwxxxxwwwwwwwwwwwwwvvvuuuvvwwwwwwwwwvvvvvvvvvvvuuuvvwxxyyyxxxxyyyyyxwwwwvvvuvwxyy{{zzyyyyz{{{{z{z{|||{{{zzzyyyyyyyyyyyxxwwxyyxxwwwwwxxyxxxxxxxxxxxxyyxxxyzzzzzzzzyyyxyyzzyyxyyyyyyxxxyyyyyyyyyyzzzzzyyyzzzzzz{{zzzzzzyyzzzzzz{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{|||||||||||||||{{{{{zzzzz{{|||||{|||||}}}}}}}}}}}}}}~~~~~~~~~~vvvvvwwwwwwwxxxxwwwwwwxxxxxxxxxxwwwxxxxxxyzzzxxvvvvwwxxwwwwwwwwwwwwwwvvvuuvvwwwwwwwwwwvvvvvvvuvvvuuuvvwxxxxxxxxxxyyyyxwwwwwwvvuvwxyz{yzyyyyz{zzzz{{{|||{{{zzzyyyyyyyyyyyxxwxyyyxxwwwwwwxxxxxxxxxxxxxxxxxxxxyyzzzzzyyxxxyyzzzyyyyyyyyxxxxyyyxxxyyyyyyyyyyzzzzzzz{{{{{zzzzz{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{|||||||||{{{{{zzzzzz{{||||{{{{{||}}~~}}}}}}}}}}~~}}}}}~~~vvvvvwwwwwwxxxxxxxxxwxxxxxxxxxxxwwxxxxxwwyzzzwwvvwwwwxxwwwwwwwwwwwwwvvvvvvvwwwwwwwwwwwvvvvvvvuvvvuuuuvvwwxxxxxxxxyyyyxwwwwwwwvvwwxxyyyyxxxyzzzyyyz{{{{|{{{zzzyyyyyxxyyxxxxxxyyxxxwwwwwwwxxxxxxxxxxxxxxxxxxxyyzzzzyyxxxyzzzzzzyzzzyyyxxxxxyxxxxxxxxxyxxxyyzyyzzz{{{{{zzzzz{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{|||||||{{{{{{zzzzzz{{{{{{{{{{||}}}~~~}}|||}}}}~~}}}}}}}~~~~vvvvwwxxxxxxyyxxxxxyxyyyyyyxxxwwxxxxwxxwwyyzywvvvwwwwwwwwwwwwwwwwwvvvvvvvvwwwwwwwwwwwwwwwvvvvuvvvuuvvvvwwxxxxxxxxyyyyxwwwwwxwwwwwxxxyyxxxyyzzzyyyz{{{{|{{zzzzyyyyyxxxxxxxxxxxxxxxxxxwwwwxxxxxxxxxxxwwwwwxxyyyyzyyyyxyyyzzzzzyyzzzzzyyxxxxxxxxxxxxxxxxxxyyyyyyzz{{{{zzzzzzzz{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{||{{{{{{|||{{{{{{{zzzzzzz{{{{{{{||||}}}~~}}}|||}}}}~}}}||||}}~~~vvvwwwxxxxxyxxxxxxyyxyzzzzyxxwwxxxyxxwwxxyyyywwvvxwwwwwwwwwwwwwwwwvvvvvvwwwwwwwwwwwwwwwwwwwwwvvvvvvvvvvwwxxxxxxxxyyyyxwwwwwxxwwwxwwxxxxxxyzzzzyyyz{{{{{{zzzzyyyyxxxxxxxxxxwxxxxxxxxxxxxxxxxxxxxxxwwwwwwwxxyyyyyyyyyyyyyzzzzzyyyyzzzyyyyxxxxxxxxxxwxxxxyyyyxxxyzzzzzzzzzzyyzzzzzz{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{||{{{{{{{|||{{{{{{{{{{{{zzz{{{{{{{||||}}}}}}}}|||}}~~~~}}}}}}}}~~~wwwwwwxxxxxyxxxxxxyzyyzzzyyxxwwxxxyyxwwxxyyyywwwwxxwwwwwwwwwwwwwwwwvvvvwwxxxxwwwwwwwwwwwwwwwwvvvwvvvvvvwwxxxxxxxxxyyyxxxxxxxxxxxxwwwxxwwyyzzzzyyyzzzzzzzyyyyyyyxxxxxxxxxxxwxxxxxxxxxxxxxxxxxxxxxxwwwwwwwxyyyyyyyyyyxyyzzzzzyyyyyyzzyyyyyyyyyyyyxxwxxxxxyyyxwxyyyyyyyyyyyyyzzzzzz{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{zzz{{||{{zzz{{{{{{{{{{{{{|||{{{{||||{{|||||}}}}}}}}}||}~~~~}}}}}}}}~~~~wwwwwwxxxxxyxxyyyyyzyzzzyyyxwwwxxyyxwwwxxyyyywwwwxxxwwwwwwwwwwwxxwwwwvwwxxxxxxxxxwwwwwwwwwwwwvvwwvvvvvvwwxxxxxxwwxxyxxxxxxxxxxxxywwwwwwxyyzzzzyyyzzzzzyyyyyyyyxwxxxxxxxxxxwxxxxxxxxxxxxxxxxxxxxxxwwwwwwwxyyyyyyyyyyxyyzzzzzyyyyyyzzzzzyyyyyyyyyyxwxxxxxxyxxwxyyyyyyyxxyyxxyzzzzz{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{zzz{{||{{zzzzz{{{{{{{{{{||}}||{{|||||||||||}}}}}}}}}}}~~~~~~~~~~}}~~~~~~~~wwwwwwxxxxxxyyyyyyyzzzzyyyyyxxxxyyyxwwwxxyyyywwwwxxxxxxxxwwwwwxxxxxwwwxxxxxxxxxxxwwwwwwwwwwwwvwwwvvvvvvvwxxxxxxwwwxxxxxxxxxxxxxyyxwwxxxxyzzzzyyyzyyyyyyxxxyyyxwwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwwxxxyyyyyyyyyyxyzzzzzzyyyyyzzzzzzzyyzzzzzzyxxxyyxxxxxxwxyyyyyyxxxyyxxyzzzzz{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{zzz{{||{{zzzzzz{{{{{{||||}}}}|{{|||||||||||}}}}}}}}}}}~~~~~~~~~}}~~}~~~~~vvvvvwxxxxxxxyyyyyzzzzyyyyyyyyyyyyxxwwxyxyyyywwwwxxxxxxxxxwwwwxxxxxwwwxxxxxxxxxxwwwwwwwwwwwwwwwwwuuuuvvwwwwwxxwwwwxxxxxxxxxxxxxyyxxxxxxxyzyyyyxxyyyxxxxxxxxyyxwwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwxxyyyyyyyyyyyyyxyyzzzzzyyzzzzzzzzzzzzzzzzzzyxxyyyxxxxxxxyyyyyyyxxxyyxxyzzzz{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{zz{{|||{{zzzzzzz{{{{|||||}}}}|{{|||||||||||}}}}}}}}}}~~~~~~~~~~~}}}}}}~~~~vvvvvwxxxxxxxxyyyyyyyyyyyyyyyyyyzyxxwxyxxxxxxxxxxxxxxxxxxxwwwwxxxxwwwwxxxxxxxxxwwwwwwwwwwwwwwwwwwvvvvwwvvwwwwwwwxxyyyyyyxxwwwwxxxyyyyyyyyyxxxxxxyyxxwwxxxxxxxwwwxxxxxxxxxyyyyxxxxxxxxxxxxxxxxxxxxwwwxxyyzyyyyyyyyyyyyyyzzzzyzzzzzzzzzzzzzzzzzzzyxxyyyxyyyyxyyyyyyyyxxxyyyxyzzzzz{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{zzz{{|||{{zzzzzzzzz{{{||||}}}}|{{|||||||{{{{|||}}|}}}}~~~~~~~~~~~~}}}||}}}~~~~~~~~vvvvvwwwxxxxxxxxxyyyzyyyyzzyxxyyzyxxxxyyyxxxxxxxxxxxxxxxxwwwwwxxxxwwwxxxxxxxxxxwwwwwxxxxxxwwwwwvvvvwwwwvvvwwwxxxyzzzzyyyyxxxxxxxxyyyyyyyyxxxxxxxxyxxwwwwwwxxwwwwxxxxxxxxxyyyyxxwxxxxxxxxxxxxxxxxxwwwxyyyzzzzzzzzyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzyxxyyyyyyyyyzzyyyyyyyyyyyyyyzzzzz{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{zzz{{||{{zzzzzzzzzz{{{{|||}}}|{{{||||||{{{{{||||}}}}}~~~~~~}}}~}}}}}}}}}}}~~~~~~~~vvvvwwwwwxxxxyyyyyyyzzzyzzyyxxyzzyxxyyzyyyyyyyyxxxxxxxxxwwwwwxxxxxxwxxxxxxxxxxxxxxxxxxxxxxxwwwwwvvwwwwwwvvwwwxxyzz{{{zzzyyxxxxxxxxxxyxxxxxxxxxxxxxxwwwwwwwwwwwwxxxxxxxxyyyyyyyxwxxxxxxxxxxxxxxwwwwwxxyyz{zzzzzzzzyyyyyyzzzzzzzzzzzyyyyyyyyyyzzzyxxyyyyyyyyzzzzyyyyyyyyzzzyyzzzzzz{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{zzz{{|{{zzzzzzzzzzzz{{{{||}}||{{{|||{{{{{{{{||||}}}}}}~~~}}}}}}}}}}~~~}}}}~~~~~~~~~~~~wwwwwwwwwxxxyyyyyyyyzyyz{yxxxyyzzxxyzyyzzzzyyyyyyyxxxxxxwwwwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwwwwvwwwwwwwvwxxyyzz{{{{{zzzyxxxxxxxxxxyyxxwwwwxxxxxxxwwwwwwwvvwwwxxxxxxxyyzzzzyyxxxxxxwwwwwwwwxwwwwwwwxyzzz{{zzzzzzzzzzzzzzzyyzzzzzyyyyyyyyyyyzzzyxxyyyyzzzzzzzzyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{zzzz{{{{{{{{{zzzzzzzzzzzzz{{{||||||{{{||{{{{|||{{||||}}}}}}}}}|}}}}}}}}~~}}}~~~~~~~~~~~~~wwwwwwwwxxxxyyyyyyyyyyyzzyxxyzzzyxxyyyyzzzzzyyyyyyyxxxxxwwwwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwwwwwwwxxxyzzzz{{{{zzyyxxxxxwwwxxxxxxwwwwxxxxxxxxwvvvvvvvvwxxyyxxxyyzzzzzyyxxxxxxwwwwwwwwwwwwwvwwxyyzz{{zzzzzzzz{{{zzzzyyzzzzyyyyyyyyyyyyzzzyxyzzzzzzzzzzzzzyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{zzz{{{{{{{{{zzzzzzzzzzzzz{{{{||||{{{{{{{{{{||||{{{{|}}}}}}}|||}}}}}}}~~~~~~~~~~~~~~~~~~~~wwwwwwwwxxxxyyyyyyyyyyyyyxxyz{{zyxxyyzzzzzzzyyyyyyyyxxxxwwwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyxxxyxxxwwwwwxxxxyzyyzz{{zzzyxxxxxwwwxxxxxxxwwwxxxxxxxxxxwwwwvvvwwxyyyyxxyzzzzzzyyxxxxxxwwwwwxxxxxxwwvvvwxyyz{{{zzzzzz{{{{{{zzzzzzzzyyyyyyyyyyyyzzyxxyzz{{{{zzzzzzzyyyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{zz{{{{{{{{zzzzzzzzzzzzzzzz{{|||{{{{{{{{{{{|||||{{||}}}|||||{|}}}}}}}~~~~~~~~~~~~~~~~~~~~wwwwwwwwxxxxxyyyyyyyyyyyyxxyz{zzyxyxyzzzzzzzyyyyyyyyyxxwwwwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyzzyyyyyxxwwwwxxxyyzzyyzzzzzyyyxxxxwwwwxxxxxxxxxxxyyyyyyyxxxxxxwwwwwxyyyyxyyzzzzzyyxxxxxxxxxxxxyyyyxxwwvvvwwxyzz{zzzzzz{{{||||{{zzzzzyyyyyyyyyyyyzzyyxyzz{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{zz{{{{{{{zzzzzzzzzzzzzzzz{{{||{{{{{{{{{{{||||||{|||}}}}}|||||}}}}}}~~~~~~~~~~~~~~~~~~~~~xwwwwwwxxxxxyyxxxxxxxyxwxyyz{{zyxxyyzzzzzzzzyyyyyyyyyxxwxxxxxxxxxxxxxxxyyyyxxxxxxxxxxxxxxyyzzzyyxxxxwwwwxxxxyyzyyyzzzyyxxxxxxxxwwxxxxxxxyxxyyyyyyyyyyyxxxxxwwxxyyyyxxyyzzzyyxxwxxyyyyyyyyyyyyxxwwvvvwwxyyzz{{{{{{{{||||||{{{{zzyyyzzzyyyyzzzyyyxyzz{{{{{zzzzzzzzzzzz{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{zzz{{{{{zzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{|||||||||}}}~~~}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~xxwwwwxyxxxxxxxxwwwwxxwwxyzz{zyxwxyyyyzzzzzzyyyyyyyxxxxwxxxxxxxxxxxxxxxyyyyxxxxxxxxxxxxxyyzzzyyxxxxxwwwwxxxxxxyyyyzzyyxxxwwwwwwxxxxxxxxyyxyyyyyyyyyyyxxxxxxwwxxyyyyxxyyzzzyxxxxxyzzzzzzzzyyyyxxwwwwwxxyzz{{{{{{{{{{||||||{{{zzzyyyzzzyyyyyzzyyyxyzz{{{{{zzzzzzzzzzzz{{zzzzzzzzzzzyyyyyyyzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{zzz{{{{zzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{|||{}}}}}|}~~~~}}}}}}}}}}}~~~~~~~~}~~}}}}}~~~~~~~~~}~~~~~~xxwwwwxxxxyyxxxxwwwwwwwwxyzzzzyxwwyyyyyzzzzzyyzzzyyxxwxxxxxxxxxxxxxxxxyyyyyxxxxxxxxxxxxyyyyzzyyxxxxxxxxxxxxxxxxxxyyyxxxxxxxxxwwwxxyyyyyyyyyyyxxxxxxxxxxxxxxwwxxyyyyxxyyyyyyxxyyyyzzzzzzzzyyyyxxwwxxxxyzz{||{{{{{{{{|||||{{{{zzzyyyzzzyyyyyyzzyyyyzz{{{{zzzzzzzzz{{{{{zzzzzzzzzzzzyyyyyyyzzzzzzzzzzzz{{zzzzzzzz{{{{{{{{zzzz{{z{{zzzz{{{{zzzzzzz{{{{{{{{{{{{{{{|}}|}}}}}|}~~~}}}}|}~~~}}}~}}~~~~~}}}}}}}}}~~~~~~}}}~~~~~~~~~~xxwwwxxxxxyyxxxwwwwwwxxxyyzyyyxwwxyyyzzzzzzyyzzzzyyxxwxxxxxxxxxxxxxxxyyyyyyyyxxxxxxxyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxyyyxxwwxyyzzyyyyyyyxxxxxxxxxxxxxxxwwwxxyyyyxxyyyyyxxxyyyyzzzzzzzzyyyyyxxxxyyyzz{|||{{{{{|{|||||{{{{zzzzyyzzzzzyyyyyyzzyyyyzz{zzzzzzzzzzz{{{{{zzzzzzzzzzzzyyyyyyyzzzzzzzzzzzz{{zzzzzzzz{{{{{{{{zzzzzzz{{{{{{{{{{zzzzzz{{{zzzzzzzz{{{{|||}}}}}}}||}}}}||||}}~}}~~}}}~}}}}}|}}|||}}}}~~~~~~}}}~~~~~~~~~xxwwxxxxxxxxxxxwwwwwwxxxxyyyxxxwwwxxyz{{{zyyyzzzyyxxxxxxxxwwwwxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyxxxxyyyyzzzyzyyyxxxxwwwxxxxxxyxxxxxxxxxxyyyxxxxxwxyyyzzzzzzzyyyyyyyxxxxyyzzz{|||{{{z{||||||{{zzzzzzzzzzzzzzyyyyyyzzzyyyyyzyyyyzzzzzzzz{{{zzyyzzzzzzzz{{{zzyyyzzzzzzzzzzzzz{zzzzzzzzz{{{{{{zzzzzzzz{{{{{{{{{{zzzzz{{{{zzzzzzzz{{{|||||}}}}}}||}}}}|||}}}}}~~~}}}}}}}|||||||}}}}}~~~~~~~~}}}}}~~~~~~xxwxxxxxxxxxxxxxxxxxxxxxxxxxwwwwvwxxyyzzzyxxyyyyyyxxxxxxwwwwwwwwwwxxyyyyyyyyyxxxxxxxxyyyyyyyyxxxwwwwxwxxxxxxxxxxxxxxxxyyyyyxxxxxyyyyzyyyyyyxxxwwwwwxxxyyxxxxxxxwwwxxyyxwwwwwxyzzzzzzzzyyyyyyyyxxxyyyzzz{||||{zz{|}}}|{{zzzzzzzzzzzzzzzyyyyyyzzzzzzyyyyyyyzzzzzzzzzzzyyyzzzzzzzz{{{{zzzz{{zzzzzzzzzzzz{zzzzzyyyzzzz{{zzzzzzzz{{{{{{{{{{{zzzz{{{{{{{zzzzzz{{|||||||}}}}}}}|}}}||}}}}}}~~~}}}}}}}|}}~~}|}}}}}~~~~~~~~~~}}}}}}}~~~xxxxxxxxxxxxxxxxxxxxxxxxwwwwwwwwvwxxyyzzyxxxyyyxxxyxxwwwwwxxxxwwwwxyyyyyyyyyyxxxxxxxxyyyyyyyxxxxwwxxxxxxyxxxxxxxxxxwxyzzyyyxxyyxxxxyyyzyyyyyyxwwwxxxxxyyxxxxxxxwwwwxyxxwwwwxyzzzzyyyyyxxxyyyyyyxyyzz{{{|}||||{{{||}}|{{zzzzzzzzzzzzzzzyyyyyyzzzzzzyyyyyyyzzzzzzzzzzyyyzzzzzzzzz{|||{{zz{{zzzzzzzzzzzz{zzzzyyyyzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{zzzzz{{||||||||}}}}||}}}}|}~~~}}}~~~~}}}}}||}~~~}}~~~}}}~~~~~~~~~}}~~~~~xxxxxxxxxxxxxxxxxxwwwwwwwwwwwwvvwxyyyyyyyxyyyyxxyyyxxwwwwxxxxxwwwwxyyyyyyyyyyxxxxxxxyyyyyyyxxxxyxxxxxxxxyyyyxxxxxxxxyzzzzyyxxyyxwwwwyyzyyyyyyyxxxxxxyyyxxxxxxxxwwwwxyxxwwwwxyzzzzyyyyxxxxyyyyyyyyyzz{{||}}|||{{{||||{{{zzzzzzzzzzzzzzzyyyyyyzzzzzzyyyyyyyzzz{{zzzzyyyyzz{{{zzzz{|||{{zz{{zzzzzzzzzzzzzzzzyyyyyyzzzzzzzzzzzz{{{{zzzzzzz{{{{{{{{{{{{{{{{{{{{||||||||}}}||||||}}~~~~}~~~~}}}}}|}~~~~~~~~}}}}~~~~~~~~~~~~xxxxxxxxxxxxxxxxxxwwwwwwwwwwvvvwxxyzyyxxxxyyyyxxyxxxxwvwwxxyyxwwwwxyyyyyyyyyyxxxyyyyyzzzyyyxxxxxxyyyyyxxzyyyyxxxyyyyyzzzzzyxyyyxwwwxyzzyyyyyyyxyyyyyyyyyxxxxyyyxxxxxyyyxxxxxyzzzzyyxxxxxxyyyyyyyyzzz{{|||||||{{{{{{{{{zzzzzzzzzzzzzzzyyyyyyyzzzzzzyyyyyyyzzzzzzzzzyyyyzz{{{zzzz{{||{zzzzzzzzzzzzzzzzzzzzzyyxxxyzzzzzzzzzzzz{{{{zzzzzz{{{{{{{{{{{{{{{{{{{{{|||||{{|||||||{||}}~~~~}~~~~~}}}}}~~~~~~~~~}}}~~~~~~~~~~~~~~xxxxxxyyyxxxxxxxxwwwwwwwwwwwvvwxxyzyyxwwxyzyyyxxxxxxxwwxxxyyyxxxxxxyyyyyyzyyyyxxyyyyyzzzyyxxxxxxyyyyyxxyyyzzzyyyyyyyzzzzzzzyxxyyxxxyyzzzyyyyzyyyyyyyzyyyxxxyyyyxxxxyxyyxxxxxyyyyyyxxxxyyyyyyyyyyzz{{{{{||||||{{{{{{zzzzzzzzzzzzzzzzzzyyyyxyyyyzzzzyyyyyyyyzzzzzzzzyyyyzz{{{zzzz{{{{{zyyzzzzzzzzzzzzzzzyyyyxxxxxyyyyyyyyyzzz{{{zzzzzzz{{{{{{{{{{{{{{{{{{{{{{|||{{{||||||{{{||}}~~~~~}~~~~~~~~~}}}~}~~}}}}}}}}~~~~~~~~~~~~~~}~xyyyyyyyyxxxxxxxxxxwwwwwwwwvvvwxyyzyxxwwxxyyyxxxxxxxxxxxxxxxxxxxxxyyzzzzz{zzyyyyyyyyyzzyyyxxxxxxyyyyyxyyyzzzyyyyyyyyzzzzzzzyxxxxxxyzzzzzyyyyzyyyyyyyzzyyyxyyyyyxxxxyyyyxxxxyyyyyyyxxxxyyyyyyyyyzz{|{{{{{||{{{{{{{{zzzzzzzzzzzzzzzzzzzyxxxxxyyyyzzzyyyyyyyyzzzzzzzzyyyyzz{{zzzzz{{{{{zyyzzzzzzzzzzzzzzzyyyyxxwxxyyyyyyyyyzz{{{{zzzzzzz{{{{{{{{{{{z{{{{{{{zz{|||{{{|||||||{||}}}~~}~}}~~~~~~~~~}}}}}}}}}}}}}}}}}~~}~~~~~~}}}}~xyyyyyyyyyxxxxxxxxxxwwxxwwvvvwxxyyyyxxwwxxyyxxxwwwwwwxxyxxwwxxyyyyyyzzzzzzzzyyyyyyyyyzyyyyxxxxxyyyyyyxyyyzzzyxxxxyyyzzzzzzyyxxxxxxyyyyyyyxyyzyyyyyyzzyyyyyyyyyyxxxxyyyyxxxxyyyyyyyxxxxyyyzzyyyzz{|{zzzzz{{{{{{{{{zzzzzzzzzzzzzzzzzzzzyxxxyyyyyyzzzzzzzzyyyzzzzzzzyyyyz{{{{zzzz{{{{{{zyyzzzzzzzzzzzzzyyyyyyxxxyyyyyyyyyyyzz{{{{zzzzzzzz{{{z{{{zzzz{{{{{{zzz{|||{{{|||||||{|}}~~}}}}||}}}}}~~~}}}}}}}}}|||||||}}~~}~~}}}}}}}~~xxyyyyyyyxxxxxxxxxxxxwxxwwvvvwxxxxxxxxxxxxxxxyyxxwwwwxxyxxxxyyyyyyyyzzzzzzzzyyyyyyyyyyyyyxxxxyyyyzzzzyyyyzzzyxxyyzzzzzz{zzyyyyyyyyyyyyyxxxyyyyzzzzzzyyzzzzzzzzyyyxxyxxxxyyyyyyyyyxxxxyyyyzzyyyzz{{{zzzzzzzzzz{{{{zzzzzzzzzzzzzzzzzzzyyyyyyyyyyyzzzzzzzzzzzzzzzzzyyyyyz{{{{zzzzz{{{{zzyyzzzzzzzzzzzzzyyyyyyyyyyyyyyyzyyyyyzz{{{zzzzzzzzzzzzz{zzzzz{{{{{zzzz{|||{{{|||||||{|}}}}}}||{{||}}}}}}}}|}}}}}}}}}}||||~~~}~~}}}}}~~~xxxxyyyyyxxxxxxxxxxwwxxxwwvvvwxxxxxxxxxxxxxxyyyxxwwwxxxyxxyyyyyyyyyyyyzzzzzzzzzyyyyyyyyyyxxxyyyyyzzzzyyyyzzzyyxyyz{zz{{{{zyyyyyyyyyyyyyxxyyyyyzzzzzzyyzz{{zzzzzyyyxxyyyyzzzyyyyyyxxyyzzzzzzyyyzz{{zzyyyzzzzzzz{{zzzzzzzzzzzzzzzzzyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzyyyyz{{{{{zzzzzzzzzzzzzzzzzyyyyzzzzzyyyyyyyzzyyzyyyyyyyyyyz{{{zzzzzzzzzzzz{{{{{|{{zzzzzzz{{|||{{{{|{{{{|{{|}}}|||{{{||||||}||||||||}}~~}}||||}~~}~~}}}~~}~~~xxxxyyzzyxwwxxxxxxxwwxxxxwwwwwxxxxxxxxxxxxxyyyyxwwwxwwwyyyyyzzyyyyyyyyxxxxxyzzzzzzzzyyyyyxxxyyyyyzzzzyyyyzzzyyxyyzz{{||{{zzzzzzzzzzzzyyxxyyyyyyzzzyyyyyz{{zzzzzyyyyyzzzzzzzzzzyyyxyyzzzzzzzyyzz{{{zzyyyzzzzzzzzzzzzzzzzzzzzzzzzzzyyyzzyyyyyyyyzzzzzzzzzzzzzzzzzyyyyzzz{{{zzzzzzzzzzzzzzyyyyyyyyzzzzzyyyyyyyyyyyzyyyyyyyyxyz{{{zzzzzzzzzz{{{{{{{|{{{{zzzzz{{|||{{{{{{{{{{z{{||||{{{zz{{|||||||}|}}}|}}~~}|||||}~~}~~}}}}}}~~~~xxxyyzzzyxwwwxxxxxxwwxxxxwwwwxxxxxxxxxxxxxyyyyyxwwwwwxxyyyyzzzyyyyyyxxxxxxyyzzzzzzzyyyyyyxxxyyyyzzzzzyyyyzzzyxxxyzz{||||{zzzzzzzzzzzzzyyyzzyyyyyzyyyyyyzzzzzzzzyyyyzzzzzzzzzzzyyyyyzzzzzzzzyzzz{{zzyyxyzzzzzzzzzzzzzzzzzzzzzzzzzzyyyzzyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzyyyyyyzzzzzzzyyyyyyyyyyzzyyyyyyxxwxyz{zzzzzzzzzzz{{{{{{{|{{{{zzzzz{{|||{{{{{{{{{{zzz{{|{{{zzz{{||||||}}}~~}}}}~}||||}}}~~}~~}}}}}}~~~~xxxyyzzzyxwwwxxxxxxwwxxxxwwwwxxxxxxxxxxxxyyyyyywwwwwwxxyyyyzzyyyyyyyxxxxxxyyzzzzzzzyyyyxxxxyyyyzzzzzzyyyzzzzyxxxyzz{||||{{zzzzzzzz{{{zzyyzzyyyzyyyyyxxyzzzzz{zzyyyz{{zzzzzzzzzyyyyyzzzzzzzzzzzz{{zzyxxyzzzzzzzzzzz{{zzzzzzzzzzzzzyyyzzyyyyyyyyzzzzz{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzyyyyzzz{zzzzzyyyxxxxxyzzzyyyyyyxxwwxyzzyyzzzzzyyyz{{{{{{{{z{{{zzzz{||||{{||||||||{z{{{|{{zzzz{{|||||}}}}~}}}}}}||||}}}}~~}~~~~}}}}~~~~xxxyyzzzyxwxxxxxxxxxxxxxxxwwwxxxxwwwwwxxxyyyyyxwwwwwxxxyyyyyyyyyyyyyxxxxxxyyzzzzzyyyyyxxxxyyyzzzzzzzzyzzzzzyyxxxyzz{{{{{{{{{zzzzzzzzzzzzzzzyyyzyyyyxxxyzzzzzzzzzzzzzzzzzzzzzzyyyzzzzzzzzzzzzzzzzzzzyxxyzzzzzzzzzzzz{zzzzzzzzzzzzzyyyzzyyyyyyyyzzzz{{||{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzyyzzzzz{{{{{zzyyyxxxxyzzzyxyzzyyxxwxyyyyyyzzzzyyyyzzzzzzzzzzz{{{zz{|||||||||||||||{{|||{zzzzz{{|}|||}}}|}}}}~~}||||}}}}~~}}~~~}}~}}}~~~xxxyyyzzyxxxxyyyyxxxxxxxxxxwwxxxxwwwwxxxxyyyxxxwwwxxxxxyyyyyyyyyyyyyyyyyyyzzzzzzyyyyyyyxxyyzzzzzzzzzzzz{{zzyxxxyyzz{{{{{{{{{{zzzzzzzzzzz{zzyyyzyyyyxxxyzzzzzzzzzzzzzzzzzzzzzyyyzzzzzzzzzzzzz{{{zzzzyxxyzzzzzzzzzzzzzzzzzzzzzzzzzyyyyzzzzzzzzzzzzzz{{{{{{zzzzzzzzzzzzzzyyyyyyzzzzzzzzzzzzzzzzzz{{{{{zzyyyxxxxyyzyyyzzzzyyxwxyyyyyyzzzzyyyyzzzzzzzzzzz{{{{{{|||||||||||||||{|||||{{zzz{||}}|}}|||}}}}~~}||||}}}}~~}~~~~~}}}~~~~~~xxxxyyyyxxxxyyyyyyxxxxxxxxxxxyyyyxwwxxxxxyyxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzyyyyyyyyyzzzzzzzzzzzz{{{{zyxxyzzzz{{{{{{{{{{zzyyzzzz{{{{{zzzzzyyyyyxyzzzzzzzzzzzzzzzyyyyyyyyyyzzzzzzzzzzzzz{{{zyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{zzzzzzzzzzzzzyyyxxxyyzzzzzzzzzzzzzzzzz{{{{{zzzyyxwwxxyyyyyzzzzzzyxxyzzzzz{{{{zzzzzzzz{{{zzzz{{{|||||||||||||||||||||||||{{{{{|||||}}||}~~~~~~~}|||}}}}~~}~~~~}~~~~~~~~~~~~xxxxyyyyxxxxyyyyyyyxxxxxxxxxyyyyyxwxxxxxyxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{zyyxxyzzz{{{{{{{{{{zzyyzzzz{{{|{{zzzzzzyyyxyzzzzzyyyzzzzzyyyyyyyyyyyyzzzzzzzzzzzzz{{{{zzzzyyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzyzz{{{{zzzyzzzzzzzzzyyyxxxxyzzzzzzzzzzzzzzzzz{{{{{zzzyyxxxxxyyyyzzz{{{zzyxyzzzzz{{{{zzzzzz{{|{{zzz{{|||}}}}|||{{{{{||||||}}}}|{{{{{{{{|||}}|}~~~~~~~}|||}}}}}~~~~~~}~~~~~}}~}}~~~yxxxyyyyxxxxyyzzzyyxxxxxxxxyyyyyyxwxxxxxxwxxxxxxyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzzyzzz{{{{{zyyyxyzzz{{{{{{{{{zzzyyzzzz{{|||{{{{zzzzyxxyzzzzyyyxyzzzzyyyyyyyyyyyzzzzzzzzzzzzzz{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzyzz{{zzzzzyyyzzzzzzzyyyxxxxyzzzzzzzzzzzz{{{{{{{{{{zzzyyyxxxxyyyyzzz{{{{zyyyzzzzz{{{{zzzzyzz||{zzz{{|||}}~~~}|||{{{||}}}}|}}}||{{|||{{{{||}}|}~~~~~~}||||}}}}}}~~~~~~~~~~~}}~}}~~~~~~~xxyyxxyxxxyyzzzzzzyxxxxxxxyyyyyyyxxxxxxwwxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzzyzzz{{{{{zzyyyyzzz{{{{{{{{zzzyyyzzz{{|||{{{{zzzzzyyxyzzzzzyxxyzzzyyyyyyyyyyyyzzzzzzzzzzzzzz{{{zzzyyyyzzzzzyyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzyzz{{{zzzzyyyzzzzzzzyyxxwwxyyzzzyyzzzz{{{{{{{{{{{zzzyyyyyxxxyyyyzz{|||{{zyzzzzzz{{{{zzzzyyz{{{{z{{{{|}}~~~~}}|{{{{|}}}}}}}||||||||||||{{|~}|}}~~~~}}}||||}}}}}}}~~~~~~~~}}}}~}}}~}~~~~~xyyyxxxxxyyzzzzzzzyyxxxxxxyyyyyyyxxxxxwwwxxxxxyyyyyyxxxxxyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{zyyyyz{{{{{{{{{zzzzyyzzz{{{{{{{{{{zzzzzyyyyz{{zzyxxyzzyyyyyyyyyyyyyzzzzzzzzzzzzz{{{zzyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzz{{{zzzzzzyyyzz{zzzzzzzyyzzz{{zzzzyyxxwwwxxyyyyyzzz{{{{{{{{{{{{zzzyyyyyyxyyyyyzz{|||||{{z{{{{{||||{{zzyyz{{{{{{{{{|}}~~}}}||{{{{|}}}~~~~}}}|}}}}}|||||}}}||}~~~}}}|||||}}}}~~~}~~~~~~}}|}~~~}}~~~}~xyyyxxxxxyyzzzzzzzyyxxxxxxyyyyyyyxxxxxwwwxxxxyyyyyyxxxxxxxyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzz{zzzz{{{{{{{{zzzzzzz{{zzz{{zzzzzzz{z{{{{{{{{{{zzzzyyyyzzz{{zzyxxyyyyyyyyyyxxxyyyzzzzzzzzzzzzz{{zzzyyyyyyyyyyyyxyyyyzzzzzzzzzzzzzzzzz{{{{{zzzzzzyzyzzzzzzzzzzyyz{{{{zzzzyyxxwwwwxyyyyyz{{{{{zzzzzzz{{{zzyyyyyxxxyxxyzz{{|||||{{{||||||||{{{zzz{{||||{{{{{|}}}}|||{{{z{|}}}~~~~}}}|}~~~}|}}}}}}}|}}~~~}}}|{|||}~~~~~~~~~~~}|}~~}}}~~~~xyzyyxxyyyyzzzzzzzyyxxxxxxyyyyyyyyyyyxxxxxxyyyyyyyxxxxxxxxyyyyyyyyyyyyyzzyyyyyyyyzzzzzzzzzzzzzzzzz{{{{{{{zzzzzzzzzzzzzzzzzzzzz{{{z{{{{{{{{{{zzzzyyyzz{{{zzzyxxyyyyyyyyyyxxxxyyyyyyyyyyyzzz{{{zzzzzzzzzyyyyyyyyyyzzzzzzzzzzzzzzzz{{{|{{zyyzzzzyyyyyzzzzzzzyyzz{{{zzzzzyyxxwwwxyyyyyz{{{{{zzzzzzzzz{zzzyyyyxxxxxxxxyz{{{|||||||||||||{{{{{zz{{||||||{{{||}}|||{{{zzz{|}}}}~~}}}}|}~~}}}}|}|}}}}}}~~}}}}}||}}~~~~~~~}~~~~~}|}~~~yyyyyyyyyyyzzzzzzzyyyyyxxxxyyyyyyyyyyxxxxxyyyyyyyxxxxxxxxyyyyyyyyyyyyyzzzyyyyyyyyzzzzyzzzzzzzzzzzz{{{{{{zzzzzzzzzzyzzzzzzzzzzyzzzzzz{{{{{zzzzzzzyyzzzz{{zzzyxwxxyyyyxxxxwwwwxxxxxxxxxxyzzz{{{zzzzzzzzzzyyyyyyyyyzzzzzzzzzzzzzzzzz{{|{{zyyzzzzyyyyyyzzzzzzyyzz{{{zzzzzyyxxxwwxyyyyzz{{{{{zzzzyyyzzzzzzzzzyxxxxxxxyz{{{{{||||||||||||{{{||{{||}}}|||{{{|||||{{{{zzzz{|}}}~}}}}}||}}}}}}|||{{|}}}}}}}}~~~}}}~~~~~~~~~~~}}}~~yyyyyyyyyyzzzzzzzzyyyyyyyxxxxyyyyyyyyxxxxxyyyyyyyxxxxxxxxyyyyxxxxxxyyyyzzyyyyyyyxyzzyyzzzzzzzzzyyzzz{{{{zzzzzzzzyyyzzzzzzzzzzyzzzzzzz{{{{zzzzzyyzzzzzzzzzzyyyxxyyyyyxxxxxxxxxxxxwwwwxxyyz{{{{zzz{{{{{{zzzzzzzyyyyzzyzyyyyyyyyyyyz{{|{{zyyzzzzzyzzyyyzzzyzyyzz{{{zzzzzyyxxxxxxyyyyzz{{{{{{zyyyyyzzzzzzzzzzyyyyyyyz{{{{{{|||||||||||{{{|||{|}}}}}||{{{|||||{{{zzzzzz{|}}}}|||||{{||||||||||||}}~~~}}}~~}}~~~~~}~~~~~}~~yyyyyyyzzzzzzz{{zzzyyyyyyyxxxyzzzzyyyxxxxyyyyyxxxxxxxxxxxxxxxxxxxxxxyyyyzyyyyxxxxyyyyyzzzzzzzzzyyzzzzzzzzzzzzzzyyyyzzzzzzzzzzyzzzzzzz{{{{zzzzzzzzz{{zzzzzzyyyxyyzyyxxxwxxxxxxxxwwwwwxxyyzz{{{{{{{{{{||{{{{{{zzyyyzzzzzyyyyyyyyzzz{{||{zyyzzzzzyzzzzz{{{zzyyzz{{{zzzzzyyxxxxxxyyyzzz{{{{{zyyyyyyzzz{zzzzzzzzzzzyyz{|||{{{|||||||||{{{{|||{||}}}||{{{{||||{{{zzzzzzz{|||||||{{{{{|||||||||||}}}~~~}}}~~~~~}~~~~~}}~~~~~~~~~}~yyyyzzzzzzzzzzzzzzyyyyyyyyyxxyzzzzyyxwxxyyyyyyxxxxwwwwwwxxxxxxxxxwxxxyyyzyyyyxxxxyyyyyzzzzzzzzyyyzzzzzzzzzzzzzyyyyyzzzzzzzzzyzzzzzzzz{{{{zzzzzzzzzzzzzzzzzyyyyyzzyxxxwwxxxxxxxxwwwvwxxyyyzz{{{{{{|||}}||{{{{{zzzzzzzzzzyyyyyyzzzz{{|{zyyyzzzzzzzzzzz{{{zzyyzz{{zzzzzzyyxxxxxyyyzzzz{{{{{zyyyyyyzzzzzzzzzzz{{{{zz{||||||{|||||||{{{{{{|||{||||||{{{{{{{{{{{{{{zzzzz{||||{|{{{{{{|}}||||||||}}}~~~}}}}~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~yyzzzzzzzzzzzzzzzyyyyzzzzyyxxyyzzyyxxwxxyyyyyxxxxwwwwwwwwwxxwwwxxwwxxyyyyyyyxxxxxyyyyyzzzzzzzzyyyzzzzzzzzzzzzzyyyyyzzzzzzzzzyzzzzzzzz{{{{zzzzzzzzzzzzzzzzzyyyzzzzyxwwwxxxxyyxxwwwwwwxxyyyzzz{{{{{{||}}||||{{{zzzzz{zzzzyyyyyzzzzz{{|{yyyyyyyzzzzzzzzzzzzzzzz{{{zzzzzzyyxxyyyyzz{{{z{{{{{zzyxxyyzzzzzzzzzz{{{{{zz{|||||||{{{{|||{{{{{{{||||||{{{{{{{{{|{{{{{{{{zzyz{{||{{{{{|||||}}}||}}}}}}|}}~~}}}~~~~~~~~~}}~~~}}}~~~~~~~~~~}}~~~yzzzzzzzzzzzzzzzzyyyyzzzzyyxxyyyyyxxwwxxyyyyxxxxwwwwwwwwwwwwwwwxxwwxyyyyyxxxwwxxxyyyyyzzzzzzzzzyyyzzzzzzzzzzzzyyyyyzzzzzzzzzyzzzzzzzz{{{zzzzzzzzzzzzzzzzzzzzzyzzzyxwwwxxxxyyyxxxxxxxxxyyyzzz{{{{{{{|||||||||{{zzzzz{{zzzyyyyzzzzz{{|{yyyyyyyzzzzzzz{zzzzzzz{{{{zzzzzzyyyyyyyz{{{{{{{{{{{zzyxxyyzzzzzzzzz{{{{{zzz{{||{{||{{{{{{{{{{{{{||||}|{{{{{{{{{|||{{{|{{{zzyz{{{{zz{{||}}}}}}}}|}~~~}}}}~~~}}}~~~~~~~~~~~}~~~}}~~~~}~~~~~}}~yzzzzzzzzzzzzzzzzyyyyzzzzzyyyzzzzyxxwwxxyzyyxxxwwwwwwwwwwwwwwwxxwwxxyyyyyyxxwwxxxyyyyyyyyyyyzzzyyyyyzyyyzzzzzzyyyyyzzzzzzzzzyzzzzzzz{{{zzzzzzzzzzzzzzzzzzzzzzyzzzyxxxwxyyyyyyyxxxxxxxxyyyzzz{{{{{{{{{{|||||||{{zzz{{{{zzyzzzzzzzz{{|{yyyzzyyzzzz{{{{{zzzzzz{{{{zzzzzzzzzzyyzz{{{{{{{{{{{zyyxyyyzzzzzz{{||{{{{zzz{{{{{{{|{{{{{{{{{{z{{|||}}||{{z{{{{{||||{||||{zzyzz{{{zz{||}}}}}}}}}}}~}}}}}~~~}}~~~~~~~~~~~~~}~~~}~~~~~~~~~~zzzzzzzzzzzzzzzzyyyyyzzzzzyzzzzzzyxxwxxyzzzyxxwwwwwwwwwwwwwwwwwxwxxyyyyyyxxwxxxyyyyyyyyyyyyyyyzyyyyyyyyzzzzzzzyyyyyzzzzzzyyyxyzyyzzzz{zzzzzzzzzzzzzzzzzzzzzzzzzzyyxxxwxyyyyyyyxxxxxxxyyyzzzz{zz{{{{{{{|||||||{{{{{|{{{{zzz{zzzzz{z{{{{zzzyyyzz{{{zzzzyyyyzz{{{{zzzzzzzzzzzzzz{{{{||{{{{{zyyyyyyzzzzzz{{|||{z{{{{{{{{{{{||{{{{{{{{zzz{{{||||{{zz{{{{{|||||||||{{{zzz{{{{z{||}}}}~}}||||}}}}~~~~~~~~~~~~~~~}~~}}}~~~~~~~~~zzzzzzzzzzzzzzzzzzyyzzzzzzyzzzzzzyxxxxyzzzzyxxxwwwwwwwwwwwwwwwwxxxyyyyyyyxxxxxxyyyyyyyyyyyyyyyzyyyyyyyyzzzzzzzyyxxyyzzzzzyyyyyyz{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzyyyxyzzzzzzzyyyyyyyyzzzzz{{z{{{{{{{{|||||||{{{{||||{{zzzzzzzzz{{|{{{zzzyyz{{{{{zzzzyyyyyzz{{zzzzzzzzzzzzzzzz{{{|||||{zyyyyyyyzzzzz{{{|||{{{{{{{{{{{{{{{{{{{{{{zzzzz{{||{{{zyz{{{{{||||||||{{{{{{{{{{{zz{|||}}~~}|||||}}~~~~~~~~~~~~~~~}~~~~~~~~~zzzzzzzzzzzzzzzzzzzzzzyyzzzzzzzzyyxxyyzzzzyyxxxxxxxwwwwwwwwwwwwxxyyyyyyyxxxxxxxyyxxyyyyyyyyyyyzzzzzzzzzzzzzzzzyxwxyyyyyzzyyyyyyzz{{zzzzzzyyyyyyzzzzzzzzzzzzzzzzzzzyyyxyzzzzzzzzyyyyyyyzzzz{{{{{{{{{{{{||||||||{{||}}}||{{{zzzzz{||||{{zyyyyz{{{{{zzzyyxxxyzzzzzzzzzyyyyyyyyyzz{{|||||{{zyyyzzzzzzzz{{{|||{{{{{{{{{{{{zz{{zzz{{zzzyyzz{{||{{{zyz{{{{{||||||{{{{{{{{{{zz{{{|||}}}~~}|||||}}~~~~~~~~~~~~}}~~~~}~~~~~~~~zzzzzzzzzzzzzzzzzzzzzyyyzzzzzzzyyxxxyzzzzyyyyxxxxxxxxxwwwwwwwwwxxyyyyyyyxxxxxxxxxxxyyyyyyyzzzzzzzzzzzzzzzzzzzzyxwxyyyyyzzyyyyyzzzzzzzzzzzyyyyyyyzzzzzzzzzzzzzzzzzzyyyyyzzzzzzzzyyyyyyzzzzz{{{{{{{{{{{||||||||||{|}}}}}||{{zzzzz{|}}}|{zyyyyz{{{{{zzyxxxxyyzzzzzzzzzyyyyyyyyyzz{{|||||{zzyyyzzzzzzzz{{{|||{{{{{{{{{{{{{{{{zz{{{{zzyyz{{{|||{zyyz{{{{{||||{{{z{{{{{{{{{{{{|||}}~}~~}|||||}}~~~~~~~~~~~~~~~}}}~~~~~~zzzzzzzzzzzzzzzzzzzzyyyzzzzzzzyyyxxyzzzzzyyyyyxxyyxxxxxxxxwwwwwxyyzzzyyyxxxyxxxxyyyyzzzzzyzzzzzzzzzzzzzzzzzzzzyxxxyyyyyzzxxxxyyyyzzzzzzzzyyyxxxyyyyzzzyyyyyyyzzzzyxxyyyzzzzzzzzzzyyyzzzzzz{{{{{{{{{{{|||||||||||}}~~}}||{zzzzzz{|}}}|{zyyyz{{{{{{zyxxxxyzzz{{{{zzzzyyzzzyyyyzz{{{|||{{zzyzzzzzzzzzz{{{|||{{{{{{{{{{{z{{{{{z{{{{zzyzz{|||||{zyyz{{{{{||||{{{zz{{{{{|||{|||}}~~~~~}|||}}}~~~~~~~~~~~~~~~~~~~}}~~~~~zzzzzzzzzzzzzzzzzzzyyyyz{{zzzyyyyyzzzzzzzzzzzyyyyyyxxxyyyyxwwxxxyzzzzyyxxxxyyyyyyyyzzzzzzyzzzzzzzzzzzzzzzzzzzzyxxxyyyyyzzxxxxyyyyzzzzzzzzyyyxxxxyyyyzzyyzzzzzzzzyyyyyyzzz{{{zzzzzzyyzzzzzz{{{{{{{{{{{||||||||||}}~~~}}||{zzzzzz{|}}}|{zzzz{{{{{{{zyyyyyy{{{{||{zzzzzzzzzyyyyzz{{{|||{zzzzzzzzzzzzz{{{||||{{{{{{{zzzzz{{{{{{{{{{zzzz{||||{||zyz{{{{{{||||{{{{{{{{|||||{||}}~~~}}}}~~~~~~~}}~~~~~~~~~~~}}}~~~~~zzzzzzzzzzzzzzzzzzzyyyz{{{zzzyyyyzzzzzzzzzzzzzzzzzyyyyyyyyyxxxxyyzzzzyxxxxyyyyyyyyzzzzzzzyzzzzzzzzzzzzzzzzzzzyyxxxyyyyyzzxyyyyyyyzz{{zzzzyyyxxxxxyyyyzzzzzzzzzzzyyyyyzzzz{{{zzzzzzzzzzzzz{{{{{{{{{z{{{|||||||||}}}~}}||{zzzzzz{||}~~}|{zz{|{{{{{{zzyyyyz{|||||{{zzzzzzzzyyyyzz{{{|||{zzzz{{zzzzz{{{{||||||{{{{{zzzzzzz{{{{{{{{{zzz{{||||{||{zz{{{{{{{{{{{{{{{||||}}|||}}~~~~~}}~~~~~~~~~}}~~~~~~~~~~~}}}}~~~}~zzzzzzzzzzzzzzzzzzyyyz{{{zzzyyyyzzzzzzzzzzzzzzzzzzzzzzyyyyyyxxyyzzzzzyxxxxyyyyyyyyzz{{zzzzzzzzzzzzzzzzzzzzzzzyyyyyyyyyyyzyyyyyzzz{{{{{zzzyyyyyxxxyyyyzzzzzzzzzzyyyyyyzzzz{{{{{{{{zyyyyyy{{{{zzzzzzzz{{{{{{{{|||}}}}||{{{zzzzz{{|}}~~}|{z{{|{{{{{{zzzyyz{|}}}}||{{{{zzzzzyyyyzz{{{||{{{{{{{{{{{{{{{{||}}}||{z{{{zzzzzzzz{z{{{{{{zz{||}|||||{zzz{{|{{{{{{{{{{|||}}}}|||}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zzzzzzzzzzzzzzzzzzyyyz{{zzzzyyyyzzzzzzzzzzzzzzzzzzzzzyyyyyyyyyyzzzzzzyxxxyyyyyyyyzzz{{zzzzzzzzzzzzzzzzzzzzzzzzzyyyyyyyyyzyyzzzzzz{{{{{zzzyyyyyyyyzzyzzzzzzzzzzzyyyyyzzzz{{{{{{{{zyyyyxxxzz{zzzzzzzzzz{{{{{{{{{||}}||{{{{zzzz{|||}}}}||{z{{{{{{{zz{{{zzz|}~~~~}|{{{{zzzzzyyyyz{{{{{{{zzzzz{{{{{{{{{{{|}}}|||{{{{{{zyyyyyyz{{{{{{{{{||||||}|{{{{||{{{{{{{{{{|||}}}~}}}}}~~~~~~~~~~~~~~~~~~~~~~zzzzzzzzzzzzzzzzzzzyyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzyyyyyyyyzzzzzzzyxxxyyyyyyyyzzz{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzyzzz{{z{{{{{zzzzzzyyyyzzzzzzzzzz{zzzzyyyyyzzzz{{{{{{{{zyxxxxxxzz{{{zzzzzzzz{{{{{{zz{|||||{{{zzzzzz{|}}}}}}||{z{{{{{{{zz{{{{{||~~~~~}|{{{{zzzzzzzzzz{zz{{{{zyyzz{{{{{{{{{{{|}||||{{{{{{zyyyyyzz{|||||||{||||||}}|||||{{|{{{{{{{{{||}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zzzzzzzzzzzzzzzzzzzyyyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzyyzzzzzzzyxxxyyyyyyyyzzz{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzyzzz{{z{{{{{zzz{{zzzzzz{{zzzzzz{{{zzzyyyyzzzzz{{{{{{{{zyxxxxxyz{|{{{zzzzzzzzzzzzzzz{{|||{{{zzzzzz{{|}}}||||{zz{{{{{{{zz{{|||}~~|{{{{{{{{{{{{{{zzzz{{zzyzzz{{{{{{{{{{{|}|{{{{zzzzzzyyyyzzz||}}}}||||||||}}}}|||||||||{{{{{{{||}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zz{{zzzzzzzzzzzzzzzyyyyzzyyyzzzzz{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzyxxxyyyyyyyyzzz{{zzzzzzzzzzzzzzzzzzzz{{zzzzzzzzzz{zzzyzzz{{z{{{{{zzz{{{zzzzz{{{{zzzz{{{{zzyyyyzzzzz{{{{{{{{yyxxxxyy{{|{{zzzzzzzzzzzzzzyz{{||||{{zzzzz{{||||||||{{{{{{{{{{{z{|||||~~|{{{{{{{{{{{{{{zzzzzzzzzzz{{{{{{{{{{{{||{{{{{{{zz{{zzzz{{|}}~~}}|||||}}|}}~}}}}}}|}}||{{{|{|||}}}~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~ ================================================ FILE: shell/resources/images/output_frame_900.nv12.txt ================================================ The frame #900 from the Big Buck Bunny movie. 1920x1080 NV12 YUV > ffmpeg -i bbb_sunflower_1080p_30fps_normal.mp4 -vf "select=eq(n\,899)" -vframes 1 -c:v rawvideo -pix_fmt nv12 output_frame_900.nv12.yuv https://peach.blender.org/about/ License Information The results of the Peach open movie project has been licensed under the Creative Commons Attribution 3.0 license. This includes all the data we’ve published online and on the DVDs, and all of the contents on this website. If any content on this site is not licensed as such, it will be clearly indicated. In short, this means you can freely reuse and distribute this content, also commercially, for as long you provide a proper attribution. ================================================ FILE: shell/resources/images/output_frame_900.nv12.yuv ================================================ YWWVTTSRQPQRRSSSTSRRRRRRQQQRSSSSRTVXYZ[[[\\\\\\\\\\[[\]_abbegjlortvwwwxxyxxyxxxxyz{{{zzyxwtnf^ZXVUUUUVVUSRQONOOOPRTY]]bnsof[RRUWXXWWVSRPPPSUSPOPOOONPRQPSWYXWWVY]_[QHCFLONKLLKJIIHKPRRSTUUSNP_aRKGFNT[``nzm``df^OMTZNLZ\_mi]luljop^Pd~yx{sofYW[]_`iaSVXXVUWYURQX]ZY^_\ZUSUUY[VQNOPRTVVYdkkid`flbX]fa]^]\_febdfd__[]juww|oQIPPMGHIPWYdmdZYUMUeju\TVVXYPCACZqbXPROIKIK]SCXonk|©TUbNLQMOOPQRTTRRRRQQOQRV|[QONNOOOPQUWTRTWVSSSTZcUHOtqAB[m[MFHJJKIHXiadrulX_QFNONGBBKSRSWMGOLKNPOSPJFHHBCCCFDBBBC@@ABCEGJQQPEBJ`sonlhdcc^UKDBBEE@IL[űfjkd]ZZYTSRQRRTVTQROPY]ZSRUTROMIKOPPNJIIKSUSUX_chq]VYYY_ZPNMQ``RDDehY[YWTSSSTYZSPQSSTVWZ`_WQPRTVVVVUVWTQRRZ[l}|{z~yywx~{wTU`VOOYYTNHKZa`XinQMKIQURLMNOPRRPNMLKKKKLOPQRQRSUTRQPNOPRSOHEEFGGFGGFGGFGHJIU|gS^rhY_mkUHFHLIEBH\ovvqf_[QLMNNMMLMNNMNOPOOLIFFFEFHKMPRSTTSRQRSSSRSTRPQRQNPVRKLPTWhvpUYVWUQQQQPPPOONLGQZSYWSPNNNMLIGEDGIKMOQOPQNHECCCCCBBAA@BCCHMOMMMJFDCA?ABBBA?>ABFJLMJDA>97:;;:9:879=BED>::::9;>??@CCC@?@CDBCCBBVviG>=<>8BTE>CDBBA@@AB?<=>><<<<=<=>>>>>>><;:::<>?>>A@@A@@A??BGLGBDNxwio{sT=9?@=;:;=AGGFCDFIGE@988644668>BCC?;9999::::::;:98513BNIGF<577;=NB/6888677774457BC?@<989::87788766788778998886558<>???ACCCB@>>>>>@?ABBBBA?=?@??@?>=?FNX]XF1*+-0.=QWdnX>:==<<;9877699:<==@@?><>?@@@@@??><<;<<<>?AA?<=?:??8;;973/,(),,-28;:8776:=@DFFFGD;7520000110122236;@CC@80/246799999::;<:9:;<><=?><=@DEGPRE987768=AB>98:98889::;;9:;<<==;;;::<>?@CHIGGGD?<:989::9:::;>EPNILRWYXUSQSOE?966579710=D@813:<:89;=EB965798:AFGHJIHHGGFHIEADO[hni`XPICBIIKk_>2QvHD>FZwM1LTC=@@AAAGOSv`jneXYa<9BMPI;24:==:753222F[Y?669>>=;:60/=[pT7/4E<0-06;HXnywcQVhxfF71/-66AE98EI7,+,07:873122027983--2,,SlTUcURQ`dE9@DNfgS<.12440+L}WUB8GJ@;9630.-))5HIC>:>;=CFDHH<2.5@@<947CC;9;===<<;7433DN<488::45?DHHJMPQQLGHHHF>JlylaZTQVY;'/2349??87BHGFB<;>>=:75454/2>QXMDD@9GJ1*-,./8GOME@===;;;:30575310.//1IWV~jmib]YYYXTRRQQSUVTPPNOVYWRQSRPOMJKNQPNKIIKSVSTVY[WRcobZYZ\^ZV[`kfSD@aYWYUTTSUUXZURRSSTVWZbc\UQRSTTTTUUWTQRQVWdv}}{v{}ux{|{u{UjlUMSZZTLEK]aVf~|eJILLTVPJMPOPSUTRPNNMKJJLNQSRRTVTSQOMNNNOOJEDFHHHGFGGCGG;JziSMY`ZedIEILLKGABFJLMJDA>97:;;:9:879=BED>::::9;>??@CCC@?@CDBCCBBVviG>=<>8BTE>CDBBA@@AB?<=>><<<<=<=>>>>>>>=<<<BCCBA><;=CFFGKOQRQLF?935989>IKNMG@===??>><:8513BNIGF<577;@QL35866777876557>@EB:8779877788766677678999896548<>???ACCCB@>>>>>>?ABBBBA?=?@??>=<<:=CIQ]nlI=>?@@@@@??><=;<<<>?AA?=@@9;<7:;974113578998886678;9LfãN9E?=?=KiZFEPq~|iIW{^UV7@HNSK<7:;<;9753369?XvhH??DE@?>94.5GUJ7/349=BDDEB>EB538<854100179=?=9411)0WlXP`\MH_cFAJYbcb^\_hgkh[G=ON8>=7;<::;?@?><8>GJG?8678=?>;78=945:>;87883243DM7/545625=8,,9@?BIMMNNORPKHHHE?>Yxte\TONQXF-/2238<944=EHGD?;8877:>IOF8139BFFGGFSP6,,,./;<<:997677540../135:??XpYJGHKOMLMMIx}wvǧYPYEINMOPRQQRSTRRRRSSRQOOnuXLMLLLMMLTeh\UWYZ]YNML`kgUGEEFIFIQMMQNOQKRT\rmitpgjnmf{rGBKQU]ZYYWRNOMJGFGEEFFDCBBDD@@AACDEFFEGKD=Lp}qlhgea]WLCAEGADc[cmkda][YYWVRONPTTRQSRNNLIMPMKNNNMNSYVPPNMLJJQUOQT[]ZSPXbZX[___^^^_TEERc`bXYZUTTUVVWXTQRTTTUWZdkh`XVVUTQPQSSSPNNMLOXix{~}}tz~u~aho^SRZ][SJCNZg]lu^cZ^gTRVMKNNMNSZ\[ZXVQKIIJLOQTVWUSQPNKJKKKKIFEEFGGFGGHHFOjhUNMYbprPGKORVWJ?@JSZft}r\YYVTSQMIGGHFFDABHMKEEGJNOQSRRRRQQQQQQPQQQPONMNRTRSSSRPObogaNNNPQPOOOONNNIVtcK[XSPOMKKJIGEGKNOOOOOPNCAFGDDDDDDCCBADFHLMMLLHDBBA?AAAA??>>=?CHLNMHB<9:::999989;@GG>9999:=@@?>@AAA@@BDCCC@?Lh^=<><;;79?N><=A?@??@@A@><;;;:;;<;<=???@AA?>>=>>ABCEDBACDEDDDDCDG@@JMXrpgO@ACDDGKNKEB@DJMPTTUSPNLFCEEEBBCFCTWMD@BCDCBCDDDEDCA>79S[KIB96=>@ACG=7876987876677868756557889788765688657899897458<>@@>?ABAB@>=<<;;=>?AB??><===<====>?><9;Hgsx}}xP7>>>>>?????@?@>=;<<<>?@@==IB6997789::9899<==:876665:AEEEFFGF?>?4.0110110111210003>NSLC@:6566789::9::9;<<<<<>?6/5AELRJ9685558=@?:888887899::977879;=<;97>;98626AD9;tvQGEIJC=<9/,48:;4236;::GRD>B?NIBE?6674/-/343@OJ68=81=PUG=?HQ\fi`RIPUU[_ehfZSz~C%18=@A?99@FG?88@C=315:::8632573019?<9776/.12FO3+32111354//4:=GSVPKLOSPHED>@GJYd\ZTMTRDGO:/212570+06?F@<9648;;@NZ\TJ@:4.3>JNLPM?3---/6:9BG<:>?===;=?;73/,-0355106:7,),baa^\ZWUTSRSSRRRSTTUUUVVVWWWXYZZ[[[\]\\\\]]]^_____^]\\\\\\\[Z]aflooqsssssrqqrrrtvwxyyyyyyxwuqnlg^YWVVVWXZ\^_^]\[ZWTSUZblpqplbVTVVVVWYZZ\^^ZTV]dfaXOLNSRNNLMNOTTPOQSW\befgda]ZXSRSQKHHINW\^]ZWWTUbr}|pp|~ncv{gfld^ZPbi`xyhujZ\jzn[\fa]`grl]^_^]\[XVTW]]YXX^f\RTRSPNQSSQRQQRSOTelihghlstojb[[bjlida`a__^]euraTLRV^gjv}p^Z\_bjl[LNVSQ_dXG;BIDN\RHITTNLMOMO|έnHUSLNNOPQRRSRQSSRRSPRdsz|]IKLJJJKKQ`mh\^kyyWSymmjTFHKJEGK]nUMaZWakpaRcqjsvsqutqm~sKCRZYXXVTNLOLKJFDDKSLECABCDAACCDEFFGHEGNE?[yvjgge^ZWLBBF@Ae[Xzhf]Y\ZZZYXUROJNTZWQS[`PTf_bh`VVVOYk|hNRQPNLJMOILW`]ZXUUWUX\]]abb_\WSSWUPPTXVSTTTTTUXVSSTTTTVV\cc]X^aec\WUTSRQPPOQPMXoz|~qsy~}}~v{eUsaR[YWZXPJIK`^`RSr{iMKQMKGKOMRZ^^__\WNHIJJMPUWURQOLKIGHJJJHFEDEFFEFHHEOuiUPLXpy}t\LINPTZTFABFJVl`QXYVUSPLNPPNMJC@DEILMLMOOQRQQQPPONPOOPPPPPOLKLPRUZ[ZYWQV_cgQPOOPMLMMMKJHCXjSPYWRNMLKKJJIJNOOOPONNPQKEBFFFFFEEDCAADGIJLMMIEB@???>?@@?==>>>?@AEKKGC@=;<;:9989:=CHB;889<>=?=9??=??@BDDEDDCCCCCDEDCEEFEGGKl}rcJ@CDCCBCIOPQQOORTUQPNLKJD??=767877899787557764325677888976655566765689998868:<>@@?<=??>=;::9;<<;;=>=;<<;;<>===?@@?@AACHRn~|{yyvF4?>;>=;;976667899:;<<<<<==???AA@@@><;;;<=>><:=<>><:::9855FH;2111011011111110.0=R]WQKC:43567899::9;==<<<==88CFGPSG<;843589<<878987678899977767:;::846>@BEEGIJJHHKPME>;;<>=::;;9?JMIINV[ULHB>;4477876544589::::::899ANJ<=79cQ:@CF_~߷[6HDACD;;HILF7-02F|jIFH670,19>>:7:>>:;LU<026<@>=?@=50@``˪O(/6,,288Bop7OmoWCEaqY;/5=;:KaYHGQM;,0:@crSMH913/)/BA:EPLMI?<=BNPWa>4;===855653234779FA2AC739B@45BYhh^L9/2BLO]dca]XXtxP9688AGMONIFEDCEOPFGUSFKYZI@JI=1:;022255/18:>B?8559?ECAGJHIPQPSC05GPLHFIF:56538CIA57>><;<;<==<92+.11698/%05*'+`a``^\ZWVUTTTTRRRRSSTUUVVWYZZZ[\]\]]]]\\\]]____``__]\ZZYXXXXWY^beffgjllllkjkmoprtvwxxxvuusrquklkhaYVVUVVWXXXXXWVVTSPOR^horrpgXSUTTSTWWXZ[_bba``djf[SRTTRPMLJKPQNNOOQRX]__^]\]ZTV]_]TJEKU[\ZXWXXVY^cpz{ycgmlcff`b`dvp[\vtXYkhaelqi^^`__^\ZXVX\\ZYYWVUPNPQPPQTUTTRRSSMM]hjkntvuqmg][clnkjheba__`^^fcWT[emxztpiha]ZY[`cef`QGJLGNVRMNVTLGHHIKQRQPNOMYڷPRVQMMOQSSSSTSQSSRTSNbķpWNKKLJKMOZgecpx^FX{[UVLGGGGGOkpWX\QOhlgcSZTPduroousm}MBLKJIIGFINKHIGGOOVVHB@?AA@AAACFIIJJGJRN>==<===<<>??><::@FFDCA?><:9989:;AGF=989=>;<<>BB?AFJHD??CB@=9;>>???ACDDDDCAAACCDCCCCIIBBG]uyiK>DFCBCB@CEHMRXXURMIIIJMJ;3>?>=<=;9989FK<889;:789878899;<63542237742213667899776567665467798886754433334444688998789:<>?@?<;<<:97778:<<:99;;9::;<=>>>???=?BGGB907Uw{y~hC<@<<=<::8777877799:::;:BA?=@>AA@@>==;;;;;<<;;>@92??@@??>><>A?<978>BEDCBBA@GLMJ?52110012221233200/8O]\VSLC;5446789999;;<<==;@IIHJNNIHB96557899879;;96568999888647::972/3=CBEIIIJJIJMMKE?<=>=<;;;78CNJDHSVG;8656655677778:BCCDFFEEDGHC@@>AUknhaQC>CLF:>?7Fxf?I_aUeC?KEB?:3\zY94347WtOJG;9BFCD>:>?B@988>GIp??h|kPSqyR4/?TG8PoU;BORI=65FNE==<8/0:>J_O915:<;:975566887:C=5?@?@;4337BOPHC;06GOPS\fb]\]XYsrD1129?DLKGB@<7420/..27;=>@;.,2CY[QU``VJHD>FPJA?<9742217DKHGFHIJT_XJFCVjaL@EMN[bR9.0152151121355?KFACC=56NR[_MKA;IFBELOD77A@=DB:68=<<;8402???BCBBGJIHIIKLJAG_urijf`\YTLEIYfcteRTSPRSPNLLMOQYUKCR{|dfzK䛕c\TWkom]XYWUSPNKJIGIMSPFEKOOOZ`Z[`cdgpvrdWUTTUVTSRSRPPTWVVUVTSRSPS[ZWV[`ced_\]abcc`\ZWRTRitlimoortu{tPOibRe_SQLKATb_kiWLKJLKMMTrtSFLTZ_a_\YTNLLKLNPOMMKJHGECCACEIFBBBCEEECDKUhyz~|vh\UOQ`syvsdPHIIIIIFDEGFDFM_o[EJRTRKGHJLNPQTTSSNMNNPQPPQPPPPPPQPPPOOOQQPRQLQ]ac`]ZYWTQV\XSQRMHIJIIIO@okKLJPPNNKIHKRSTROOPQPOPQSTTURJJKKLMNPPMHFGHGHIFCA??><;:<<<<<>??>?=::ADBABB?<:9999:;?DD?999:;;=?BCEE@;;AKQOD>=<:9<>?<:978779=?>=<=>>>>?ADDDDA@AAAACDDDBFFDEE\}xV@DIFCBBBA@ABDIQ[\UMGHHKOJ;9:9::;<;<:8633<;69<;98655543356666432454345666777986545677666<:8::876654333212222466665479::;=??><::9755579;:99899999;<=>>?@AAABA=:522//Ebr}xR=A@<<=<::999877688889:;:PMM7@?@@@?==<::;;;<;;<>=?>;CJMNFA><;<==ACCC@;999@DEDBAAAFKKOPD732001112112232365/7S\YYYVL<3357888779;<<===BFDFIJHKKC=856899767:==;75689;:887447::8837G^T<=<><:;:8;DIDEMK:37755656888:;>ACFHGEA;876679=<:;<;9889;>ACEEEFGFHGB?@><;X^:765Fs}[UYD5DK?8889=BDAFMRQOMNYgm^OOCL[bf~304348=:Ic>6]iHbxk[73JSJNYmE08DQZO94>JH;11488;CD;:AFJI?::657;48@MVI<@FFDB>84235788;EE=>GIC9115895,,=PX\jrk`Qahd`a[UUQF7//1458GNJEB=87642011148AGC6.Hsy\PTUQIJJIJLHDD?9:82/..4BKLJHNUa{z`X]u\6/8AL^Z@352.17741020-18HUNDEB:57=BBA?93/7CHUP;OM6<@EJIC8.6GA32579:==??81,.;B;101551Wp:)STVX\\[YWVVUTTTRRRRSTVWVWX[]_`aaaa`__`___`aaba```__^\[[[ZYXWUVWXYZZZZZYXXYY\_cefgijiihc^[ZWUYiifefgc[WVUTTTSRRRRRRSTUWZ`hpuujYSSSQPPPPONNNNMMMMNPONPRTTSSRTQNQRQQQRQPQQPMLLLLMMLMQ[ef[PLLLMNPPQUZ]_]YZbhjgggWbqSVXUW^krpof[bzaRRb{yipxsg`]\]\]^__^^][WST^b\WZ\d_RssOOR^aUTU_^OO^dehd_][Z[Z^kqprvvrmhc____ZZbhqvtuqjgb^hqqpnkkecbYdsuymVWeeM>ENKIHJLPPJMTRYv}vHTUQSRRSSSTTTWTNPPSVLmɩuTLMOPTYTVmsNHTTOQ[_VVOIFFKE6Tl___FWvaYRPZNMKHJKMNLLOHHu_EFOPPNOPMLJL[~CEME@?@A?IWWQPMIHHIHFEHHKbqomifedXLSgjdojVMKJHGHRTNIGHMQQUMIjogjHz|o[dZXcka[YXWUTQNLKIHIJNF>CHLLNamaY\_a`dmorm`WRSTRQQQQPOTZXWVVUUTVVVXZXVZ^`ba][]acba_ZXVTWQTryomkmnnpvutrSZaaZ[lPMHOVmlT]a]QGHNMLNMYr`EFIOYac^[YTNLLKLMNNLKJIHGFEDCBDGEBABDHID@IKBWvyu|{wrf[UONTbpuscOGIHHIIFDFFEDEDCXcNEKOQTSNLJIGHKMOPPOOOOPPPQPPPPQOLKKNPPQV[_XPSXZ[ZZZZZYZUNNOOSTOHHIIIHEIj^JJEJMMJFIQWZUUSPPQQQPRTUUSSQONORRQNJFCBDEEFFGFDBAA>;:9;====>>==?>;::;;;<;=@@@<:;<>@A?<@MSKB==CRddTF?><:>@@FPPKH@<;?@AAAA@@@BAACDDCBCCEFE^yeCAIGEEDDCBCDDEFHUcd[IJKMPL=:999:<;;;<>ACFGIJLNMKJFFEDA?><855556666555676777776654556764=D:8<;85666444344222356644326799;====;::96556679898999999:;<=>>?AA@>:633358436>jd==><:;:9975554567:<=>FL`M:??>>=<;:9:;<;;;<=>?><CCCFGB<;;99@CBA?@CEILNPI<764122/033112222563/;LZXV\WA235678989;;;;==>=?DFHKIHD>:767888668<>?;9:99:<::95259:9<<0KyH>GGIIHHIIHGHFA>===<;;:966EOIC>8777667779;=?BGJJJHE?=;988879=:8;;;98999;<@DEEHJJGC>=>=;G^jh^PCADC@<<<966:Qxo[xv]JJLTbigNDNMHAMutfY<889RxiTO;1:B7.2:B;.9MLHOSL^a9^^CGNbK@IG9185468:>@??IWZTS_ky|xhjiirzj`U:,;<8;99;71MpT8UaL\@=QA@\XZ=56=M\YJ>@W^B206?CBEB50:9;<:60,.6Poy~[FWl_SVYXQ9+-..022.:PUL>654320252-.2;EHDNliPJMLGFHMNGBCC>:?F@:024>NVVRTXnc]iJ1=?;FTJ68FB516831035311;HGDD?87:>BFB=;83198416:?;27;=<>]h>QRRSVYYYYXWVTTTSRRRSUVWXXZ\_`abcbbbaa`aa`bbcccb`a`__][[[ZZYXVVWWXXYXXWVUTUVWYZ\\\\\\ZZYVUUTST\jfcced_YVUUTTTSSSSSSSTUUYYW]lukYRSSQPQPNNNMMNMLLLLMMMORVWTTTSTTRSTTUTUVVUTRPOMMMMMLLQ\gf_WMFHLMMNOOT[]\^_][XWVQ\qk]ZZWVY\cnogd`[]ZRTtpmos}q[X^]\]\\]^_^\YWOO]b]Y[`lsbkfkw]^ZU\kcORa`[YUTUTTVW\acafqwphgc`_^^agorrtqsqnqmfdfghjmoh`XUjqr~iW`^OB?]^GIIJKLMJMRTUf}{quWHTVTUTSSSSTUUXWPLRZVXϓy`OLMMRRMdvaZVPSVSW[UUPKH?_xGImYV|lSjmgWHHGDGLNMMMMLKKJGjeHGKMKOSMNKOO\dJLJEA@@A>Ldh[XRHGIGGGGGHGQgrsonoleaikca^OIHIJMICPYNHFFKOMOIRwxnbQ|kldTtqNT^]VWWVTSQOLJHHHJGDCDHKLlsYY]_^^blrsiYPSRQPQPQPPU]VRjdZ[YXYWUTUWZ]]^^]]]^_`cge`ZXZ]TZo|~|oklllmszrpvVOUUXWSjhKJLWkziUNQRRNLPNMPPQ]\GK\XPUab`]WQNMLLLLLLJJHGFGGEEEDGGGDCCAEIGFOL>Llvrv}~yvpcYTOOOSbtuaMFGHHIGEDEFDEGJDF\ZIFIKTa[RPMBAFKKLLMNNNLJIIKKNMGMWU[\[YYdhiVM][QSTVYZ\\]^VLLOUVOJJIIIJATK[NIHFFIKEJT_`[XXURQRPPRW]^YSQPPSTQMIFC@@BCDGHHFFDCCCA<::<==<=>><;<<;;;<@CDDA><<<=>=;=??@@>>?AAA?;=FLKIJJFDTnwhNIHIMPOLHB@@=;?B@=;;;;;;::<<;;;;98:;<<==>>>>==@@BDCBCA?@CCDCERZL?DGEEEEFEDGIJLIDIYjkXLJMPNE@>FID><@FINQQQQQRSVZ\[\\\ZWTSVK;4356656665556777787654454546ED69=;64577654444332354444246789<===;:::97666567777999;;;<<==>==>=;9754557:<=94>jrC5@=<=;:;::8767718==<>=>@?U^<>===;:99:<=====<>???=;>CHMNMLLLLMJCAEB<==<;?>=>@BFHJNSM?8876431.131111221464.+8OXW[YC223468999:;;;===@=;::<;7546;>>8DTvjEBEGGGFGGGFGFB@@?=<;;;;:7=GB978877667777;BEGJMMKMLB<==;=>=>@=:<;:9899997:?CEHJHA<;;<=;?Rdf\MCBB>;;;<:<;25JbqŸR36B[vyaTNMQQEKeM@59@BKkpI742;?6=Wp_@2=O;E_TFHF'ZuB\jo_VOBI^J/1269==@C?>DKE@LTThub]_qj~HUD4S_<33220/?WB18=9C?IL49IAA8988EXf^CPgZI;3AWWC76417BMUC.-4EUM8/7C>9FNOTTJA>@?:77999G@305951028>?72;ABC@;8978>@>>?;14=KVRPRQF4+6@3'0>B:58:98679DLHBCFBB>;GJINQ_}xMRSSSUWYXXXXVUTTSRRRRTVWXY[]_`abbcbbaabaabcdeedcbba`_^][[ZZYXWWWXXXWXWVVUTTUUVVVVVVVVTSTTUUVVVV^fd__`^YWVUUUUUUUUVUUTRSVUQQWbbXRTTTSQQOOOMNPOOPQQONOPSWYXXWXXXWUVWWVXYYWVTRPOONNMNNNSZ]^]YRMHINNMMNPTX\_bccabdda]X[]ZWXWZabZV\ZVXQYy}twpWV_`__ZWY[[UQSX[XZ^__dmqsrg||VS]gkf\Yad[TSVYYWVWY\]]^aehgdeda^^^fqrsysoj^ltnkkkkli^RS]fiu~f_iUEIKkmIHIJKLLLLNUY_yvps{yLSVVVUUUTTSTVVWXRLT[RjĿՉTpVMKLMEMltihg[QSVTUWVVQNG=chKeb]ssThdIFFGECBEILLLLIJKC@\`GBBELRLMHEHHLMVMLFDCA=@Ra[ZVHGIGGGGGHHIVkwxttwxcWURJHMNNMWNBLZSJHHGFIIGZkjgc\icLbzncmZIlvTJWUSWVUTTSQMJHGGGHFDBFHMoyXY]]\\^glrqYMQRPPQPPRQU]WJZj_\[TUVPKLTY\\\\\]]][[fswqgb_b`PKcvojlmlopmmx{ECGGHHGNWPHKNQYXIGGHQWQMPMNQNZcNKgo[MP]hgaWPNLKLLKKJIIHHHHHGGGGGHHGGFDDGKOMGACUjoqw{xrl`UQONONWpxbLDEIHFEDDEEEEFHGDQ^OEDDNUUQQPBADIIHJKJLMLF???@DFOk~{vfZVYgf`VZ\RLPSY\[]]]_^UPQVXPJKKJIJEAJAEGGGDGIK\b`^]YXWTQQNMPYc`XTQQQOMIGFFEEDCADIJHFFDDDDCA@>>>>==?><<<<;:::=DED@>====?><<>@?>>?ABB?=;<<<=?DMSPJRnoXPTVXUGA=;<AFJHC??@AAB@?@?><=><;;;::9779;;;<=<<=<;9>EHFDBA?==ABBACDDDDDDCDFFFEDGIJJGDBEUljUGJOMHC>CFB>=?AAAA@???>@DKTY[\]\\[[^]L7/453345566666778:865444344:C;5:>:44577653455543444444345778:<=<:::::866665555579:=>=>>?@?><<;:766568:<==CC8?9A@<=;::99;;;<=====<=??><;<=BKOMPTSOGFDDDA=>==??9:>IIHIKPJ@:8879646972122122157310/;R[\[D1235779:98:<<;<<>ACFIIKLI@7578788989?CB=799<=:966<;<<=<:876776666555556><;:679997544;CD@=9799:=<8CZbZKDC>978:;;;<<;89gn:A;>QYSRYTMOL;;evJA@13GH8M]@<=7=:BgojW861JfWC>N88;>@CFEA@>949;46EBFCLFENVhSM<O\`_THCEMLFGMLC>=97VY6C>@:49BFIC70--.0440ATD.,-.01343579=GJJc~jikcUQQURNFDJTTKOV[cWMORJFD?@WmukX_gd_TWYKFU_`^J77<<3013981.0698<@>99?CGHEDTaRA@BHPR?/6<416>=8780-3-.?KSPLPM?7E_ZGHR]dp^TUVVVWXXXXWVUTSSSRRRSUVWZ[]^_`acccccbccbceefffdccba_^]\[ZYYXWWWWWWVWWVVVVVVVUVUUUUUUUTTTTUUUVUU\e`[[[ZXWVUTTTTTTSSSQQRSRSQLKPRRTUUUTOHHIKJKNNOPPONOQSVYZZ[\[ZYXY[[Z[\\\YUSQPPPOONOPNJKPX`d]RKIJKLLMOSVYagebchif_a`V[][_`_]WRV\^\WZfsz~}{vszu`[`c`eottpdWPLUhdWVYYallounxyn]Rerg`eih`[\^]Z]a][^eimmd]abcec_^]bpuvs`^[U^xz}{ywogaXQV[[^asughYYTD\qmSEKJIKLKKLUXdqzwdMQYWVUVVVUUUVVVUXWQTXOvĿ׎JvcPJMLM[agsm^VTTVTUTXYSRFD`zsVW`]k\LNGHGFDDDDGJILKIIIIR^cqcE;CMSRMJHGNRRYKVYCADC9@VWXWKFGGGFFFFHGNgxzwxqRDDJJMPOOQQNDJ[[NIGEBNNFgwQ@CA\[M`\RgbTT]iXQURRVVUSSSQMIHFFFFGCBFEOtfRX\\Z\bcbmlULPQPPQPOPPRX]_dg]WTOPRNKKOTXYYZ[Z\]ZVbrzxpkeb`UHJ]rrikmlp|lklypHFBDJEA??DIF@?>=AGHIOSMMNMNMQa[QnmMIL[nmeWMMLKKJIIIIHHHIIIHIKJHHFGGGFGINSKDCACTfowywpi^SPNLMLRjvdLBDIIFDBCCCDEEEECHWRFEEIGJKNNGHBEFFFGGIMNIA=>?=<<<<;;;:=DDAA@>=<;<;:9:;;<=?@A@>=<>>;879?HUULS_[SSQKC<;;<=>@A@==BFFC@?@@@@BBB@?===<<<::::8789::;<<<;:9:=GMKJGB=;??@ABA??@ABAFPY[XWVWWVXR=1454566666666679;863453355:;47:>9235776443555544444433579::9:;:<<;;<:76566666668???@@=;;;:76668::<<<@C:37=<:;<<<;;;;=?BDFJGB?@?>>>??><<<==<=====<<<=<<=>>>=<<;ALQRRLID?@CBA?>>>>B@>>9=GKJLMF:678878977?DBA:7CJE>:<><<<:>=;kmqsEBDDDFGGGFFFEGD??>==<=<:526866655556668?FIILNNPPMF=<<=ADB?===;:97788864203<=7423789:<8:MZWLD@;8789:9:<>A>8Bk?37;707KI8R}n`tfHCDDBCFcnT0,KbhXCQTKQ[Y:,@IZWDQdd_VJ;6699:?>;634997686,1BXB;:CN822231127854413EN9.22/001455FQ@LcQ@DIV\ID?55:>=EJ522/.0.379:767;CA58IL>55469;6;I>01/,-5??98:8>PLLwofhkk`UVUUTQG>:;>;>_R4=64643IvsEG\b_HVo[IHGVPGMISXXX\si^inbSSWSPQTSOKHGEEEFCBEBVznPOX[[XYbd]`]NJOPPPQPMKOX_dec^UQOMNPNMONPSTUVWV[cd]_hrvrnifd^NHO`uykkmkrwlki{jWdZNKFB@AFHD?>?CGIIHLNLKLMLLOPKajKHKXik^MJLLLJHHGHHGHIIHHHJJJHGGDDFHHHPSJDEC@EXmxzule[ROLJLMO`qfOBDHHFECCCCCCDCEDBOWLGEGGGFGNQGBDEEEDEGJMJD?=D??YsqYJHMLLX^^_YRPVSNRWWSQPQQQRTY\TLJKIIHFDFGFFFDFFF[hc`__]\[VQTVTZUVZSPNLHGGGGGFGGECBAEKKEDDCCDEGGGECCA>@><<=<<>@><@BABA><<;;;9999:<>??>>=<;>BCA=979HWWJKVSIC<99<===>>>>;;>BDCCBBBBADCB@?>==<;;;:::9789999:<<;::;=>ENPIA=;=======<@KVXWVUVVXUF745689877667578:<8545543568768<>634459744254565344444358::;;;:;>?>=<:76567866678<@?====>=;999775579:<<<<>?=9:;;<<<<<;;::::;;:9>>>>>>><<===>===<<@KPNHA>?>?@A@@@@@A@?=;:9BGKSOG<31103;E<4;92/0010134113311CV\R;//4EJ>76668;<<<>=52;HKLNG<677888:77@DA@<6>=>>=7WP=CABDFGGFFFFGHGDAA?><<:75777655656789>>@CDA=<<;<<978::9652124521125678:86BTVOG>9889:::<<;6899>_M4878866?LECUXJA=<>?Lw^`{SBEG\hXY~ylU9D_pGENF;GJ6,COGFIUflhYC6348:>??=;9=BDFKF=;:88<:3NY]kn]QSVQMI<387;6:8556;CF@<7?IFWpDFWY\YWYXQLGCGQD/21B?7@57:;:X`76CSUH>JI@Muh;+///.-/38;=;:?DA<:;<:88;<:538=;?IJGGEA=<>;6..>C<887521:J[nkSKA9CL=495/1=fjUC6*?hrVXYXXVUUUVVVTSSSSSRRQRSTVY\]^_acdddefeeeeegggfedcba`^]\ZYYXYYXWWVVUUUUVVVWYYYYYXXXXWVVVVVVVWUUTSTUXVVVVWWWUTSSSSRSSTSRSSRT[_[X[`badntwy{z|kNKPOOOORSTVZ`ccddbbbbbcbbba^]]XSTUWWXXVUSQNIGGJT_hni]TMLOQRRRQQQRTY^^XXb`[^^_cdddefa]YXZ[Zb}}iS^h_VVVZacpvkgeabhoxf^mi]XU_oxtlikriagfjvysmb]^\bjmv~vgabddhjedfnxuppf`ckqomkmkc\UT]c[`_[jknRO[^RJFFIKKLMMLINYqkaUMWSXVWWWWXXXYXVVWVUUYSNyׁJUksVLKXbbgic`^[WUUUTVUY[VPUqwtk`mvk[OKNLHFEDDDEFEGKKIJGWvt\UOkuTLPLNRPNUTFPRMz~`zM\THRQKHGFEEEEGFE`{vutmnl`SONLMMLLLLIGFL[_TICHXPBFEFJFGLIFFQ`QTinlgemvZRTQNPTTPMKIHFEFEDDE_oVHKSZ[WW]a]TJEIMNNONMPWckf`_[TOLJKNNNMOOPPPQSUTVdmg_alrsqkgb^OLO[lmkkiqzlheZM`bZPHEEGHIJHGIJJKKJLMKJKNMHNMC\tnWHJITgcMFIKKKIHGGGGHHIIHHGHHHFGGECDFFHOOFCEGFEOfxysjcXPMJJKMMXifRCCFFDDEEDDCCCCDEBHWRHJHFGHEJRHFGGGEDDEHMNHDBCA?QSMLLNQPNSUQNNNOUVPOPPONMMMMPUZ^TLHIHHGFDEGHHFDFGERfd_^`_`fgdpzj^ZUSNKJIGFFHHHGGGECBBCKJDCCCCDFGGGGEECA@??>>==?@?>>@AB@<<>=;;;::;<>@?=;;:;;<>ACB>;;DLMKADD>989:<=<<<;;<9:=DEEEEFFFFGFDCCBA?>;:;:::9777889:<<;<<;;6;JH@<=;=BDBBBBBEEECCBCCDCBBA@@@??@A?@EUd]IEEDCDFGGGIIIGD?=::;;<945AMORTXYZYR>2379:877667679;<:64554346778:=;54446:74333466644556658:;;;;;;>=<;;>CBAA@??=;;<>======<<=@FHB<>@A??@BBBB@A?>=;987:=>CHNJ=/)2?F:6:85/-/00/0221002422DZZB2.0BPG?9348:::;=;622=87?IIA;=?>>A94ukD;@ACCDFFFFFFFINHBB??><:9967877876678;@DHKLLLKKE?>?>?ACC?<::;::989:::75322110/133467883:PVRK?7789;>>;;95//51,Fe{oXQ:48778?BBHNSWPHCDPfYIIT}knzmWQpjA<7.14-+.GM;AD:AinO:68::<>;8;>@<89JfdD:<;:;;;?GA311/--/0011.,Hi^NL^bI355.3>@9>IF=[xA4;AFID=DWOBHA>@@?>>=<:A\lU:?VdsubI@BFHD>4/33-/11112/169;ISE79:9<:6325779<>?73>EA=9>@E_N07=>@AHORNFAEVfZADP\oXDKE@>=<7WxUYB4B?CQQA8OH-./-+--,.39>B>>EFB?@@<9>DIH=118?LXJ76:;:989:537<<:<:2,/46F\UADC;BG8.211,4Wpn_JBMRG7/W]BUVWVUTSSTTUUUSSSSSRQQQQSUY\]^^`bddeefffffgghhfedcbb`^]]\[ZZY\_^[YXVUVVVVWWYZZZZZYYYXXXXXXXXWVUTTSSSTUUUVWWVUTSSSSSTTTSSSSU[bdcdgiimsxy{~zhJIONNPRRTVY]`bcefeedeeeeedcb`\XWXZ[\]]^]\XSPLHHLVdkkf^XUTVWTQQRRNNQNWaZSTZd`Vankfijg_Y]\d}layz}cQT[^[Y[[ZT[ptleb_YY`biu~|x}}plmd]fswvruzlp}~{k^[^flkkoldbccdgb_kurrwyysproonmkh`XWY]`^]a\dk]KYYJAEGHJJLOMKKIWub\HvcW]WWYYYYZYYYXWWWXUSXQYvKYYfYLJUZ[lpeehcXSUUUXSU\Y\hyyqk\`gWRRNKJHGFEEDGFEMPKJJJJIB>QSUxiQKIGGEFSTDCGGS|O:HGOUKGGEEEDEHFCUntpnnmjaWQNMLLLKJIIHGHOXSNIEKKGKDBHHGGHGFagQJ\tdXdgrnWQPNNOPPONLLKJHIHCNcZKJHOXZWVY\]ZROMLMLMOSajjcZURPMKIGGMPNNNNOONNNORS[ehcahmssmjd_NJTeg}ohiglhdf`PJLWSMMMJJMLIIKMLLMKKLIHILIK\V=Kg`KHJGT`RDIJIJIIHHHHIJIIIHHGGGGFGGEECBMWSNHFGGFFJ^tvoiaVNKIHKRPP^bTEBDDCCFFEDDCCDDEEFOPLHEEGIEGLJJHHHECDEFONIHHC>ANLGMPONONOMKLNNPTXTONNNNNNNPRUW_ULGHGGFEDEGJIFDFGEPbba`a_dr~}hTQSPLIGGGEEGGGFFFFEBCDGGCBBBCDDCCCCBCCBAACB??>;;<==?AC@=<=<;;;:;>@A@?<;:9::;;;=?@@ACFHG>5689:;::;:;<:::98;;;::9988877:;:;==<969A=9<;;?DEBBBBDEEDABBAABB@@???>>?>=ADAG[eTFECDEHJKJKKLJF@<:;<:;85577:ALU[ZYZTB5699766667689;::75454346777:;:96569974333455543556668:;;;;;==??=;;<<=??=;86677899::;;<:8554456669;<==<;<<;;;;<<<<;;;;;:;;<<:::<<;;=>===<;99?BBA@??<9:<<==<<=<<<>==??@BBBBABBBBB@=;;;98788::8;DKG>DIKGC@<88:<;9966>IRJ5/555667638EHC?<78BIGA>=??A:8e~uf^RB94::?CCCDDDEEDDFIFBB@?>97:947767776667>>>>@BB=:::976788:::8543001101223566745HSSK?::99;?@<9AX^\WWJA;>awI89::;==AA;>FGFGO\~iPLhzytxy|I9A;CNKNUYf\QRF;7\oL78>;47??>CEA5,.Aca?8:<9458<;712402=B?:4246752018:44960.,,/-,010/-EGIE<=HSN;.-2579::;:BdoKEV_~`?211479621/00/.-.021223?JDCXd\QQVRC7/256:=@?<@B?=::CZ[;387::=?@BDB@GSRGL^V[[?GQKLHGI8O]DU_J34@UVC)Fd,.2//01110/2457;BFFGKJGDJLLMF=65@V\L<8;=;7:D@7:>>=?EE>4-+*,..08=53<810030*.572%/JPE73MN=TSTUTTSRSSTVVUSSSSSRQQQSUY\__``bbcddefffegghhgfedca`]]]]]\[[\_`^[XWUUWWWWXYZZ[[ZZZZZYYZZZZZYWUTTTSRSTUUUVVUUUTSSSSSTTSSSTUVXZYY^bdglonmqvycGGNRTTTTVY\_aaegffhiiihhihgeb^YVUUVVWXYXY\^ZSKJMOQTX[^ZTUYWSRSTQPPJ\ujVRZqkP[qpikptqgd^eq^c|u^VX[^]]^]^XUgqhbaa^_bXWo}{w{|lfjrx~~|l]aklhdafh_]abcd\Zow`dtyt||mnoni`XWVY]_]]]ZklMicVKAGJLJIILMMMMLGT|f\LYGZ[ZZZZZ[[ZYYXWWWXUUVLvfN[XT[dMJQXWbrsnpeWUUTUXWTVQNe~p_VTRQQMKIIHGEFIHBG^`LHLHE?7JjbO\wx\HFFDCDQTDAAD@uTJI>BOSQLHGFEFEDFDEMeunnqnhaXRNMMLKIHHGFGIIJKKIGHGHHHIGHGGJ?LgZPMIOUT[\^qq^ROMLIJMQSQOMJGGDDUVKNIGOQUYUVYY^dcUJLMR\hni`WTPKJJJIFDHNONNNOPPPMIMTUYbgeciqtnjibKJ[mnsrghdvedk|pOJMLLOLJMKJJKMKIJKJJJHJNMT\QGNXUJIHHOOGFJIHHHHHHGHIIHHHGGFFFFEFFEFABnmaSHFDCCEXpsnibVMJHHOZSHQ^VFBDBBCFGEDDCCDDDEFILJHCCEGEHJIIHHHFFFGFRMGHJE?@HOROONNNNMLMMNNPTYWPOOPPPPPRTUNdUKGGFFEEECEHGEEEFCHZdedZShj[RPMJKHGGGFGGFFFFFFDCEEFECDDDEEDBAAA?ACCCCDCBBA=<==<>AC@;;;;;99:>?@A?=<=;<<;;;979>@?AFIEA9799;<:79;;;<<<;9=DDA??ADGFGFGEFGHFCA=<;::9:::99899:;;<<98:=;;<;=AEEBBBACCCBA@AABBA@??????@A@CHEGOULEFEEGIIKIGHHHEB<7799776777678DQVY]`S>4897666777898325546435766799776669753323344444556779;<;<;=>>>=;;=?@ACF=;96677889;;:9876554467778:;;;;:;;;;;;;;;;;:::::;<<;::;;<<;=>==<;:77=ABB@>?<9:;<<<<====<<<<>BCCCCCBBABBB>;9::9879:;;::>=HKF?:8:AHHB>@@ABCBBBDEEDDDEECBA>;867765667775689?FIHIIHFFE?=>>?@@BA>;=<9768989::8643112102224446644AMRG89<<>;7;@?BPkuwriZFdm]?7;;;<<<;865668?JeͼoOYpxV6:J_y`[bg]JbtT;474019@DEC:0.16>>43588559=B?522124::4-,37867;90-6810/,*0<7.*/326ObK;Lwm7+:;9518@=7BQ@,5_SBMMID=;:BF5),/26789<<@ckG:9_`;3232./695468950/123132369Lp}kkx}oT?559;=BFHHKLF:9JXF1789:;CB;:@A<;;77UzqULBANWN@FSBSLB8JcO@LL?7+;]E+3311222352/40/@MJB?AADHQSLMKC:5:CHG=58;<78<==>?EMI;0,,+(-;<,(36420296)"(..6@=5237?BUUUVWUTTTTTVWYVVUUUSRQRTTW[^_aba`abcdefffhhiigfedca__^^^^^]\[\\[XWUUUVWWXXYZ[[[[ZZZZZZ[[\\\\YWUTSSRRSTTTUUTTTTSSSSTTTSTTTVWVTQRW\_adipux{zuwwaIHQTTSTWY[]^^bdeikjiijkkkkje`[VRPPONNNNQY_a^WTRQSSPOOQSWYWRMRWVTUU_vra]^nu^^klommostpjhsxxx}}j]YY\]\]^^][\ab``aa``b^\lyty||xg^eroc^cidYV\^^[[l}xgcpxwzsfotqdXUUTX[]\\ZXlzYW^fn`NFQ\NHJKNNMNNNITlUSM~d]_\\\[Z[[ZZYXXVVVVWYSR۳`T[WUSmtOJOVZaowqlf[TUVVYWT[SHcuQGJOOMJHHHFFHLG@QpsTFJB@ABCCDDDDDDCBA?<;@C@=:99:99<@A>>>===>>==;;867:;;?DC@?=;:99:AC=78::;;<>BA>;:9:=?@ACDDDEFEDB@?<:::;;;:::98::;<<:9:=<<<<>BDCA@@AAAAA@AAACCA@????@@ADFJKLNKEDDGGGHIIIFDDBBCDA@?=86677776423@@@@@>;9766667:===9666677789889:::::::;;;;;;;;;:::::9:;::::;;<<;;===<;:9:;=>==<;:8:=>>===>???>??ABBCBCCBBBBB@<:9:::999:::;<:=EB63798664/,*'&*-.--.--///32*?M3+466226;@FHEDA=:768:879FI72555666898;EIA:979CJGB@BB@>:534766667;;?ADC?>>?>;878988886431001111112223334>==<<:877778=;>LE/-9kpDIKEB>>;4343799=?=?B>A\Y<16]U.186555525=<8:<:3362234751Ps|ifuzqeM;@AQXL6:U^feAC/-Q\GD=4547B:001110/14788CEBKNF?=;;<@DFHLJC<59ADJF;889;<<519<;;;78EPNB1*++,9<0*/249;9AJG:21110012782/^^^][WVUUUUVY^_]ZYVTRRSUTQSW[^__^^acdeffgijjihgedba`_``__]][[ZYXXWUTUUVWXYZZZ[[[[[[[[[\]^^^^]XVTSSRQSTTTUUTTTTSSSSTTTSSSTV[\\ZWUWZ`cco|ztphetz_LPTTTUUVY[\]`dgjjjhfjlklmlid`]XROLLLKJKPW\^ZURRWYXWRQX_^][W[\YVW\bsua``j|mggdmkfaclqstpluseq}zl`][Z[^_^_``^]\\_``b`_```aivvxz{}~uhdbaeni^]chgeecb`]fwulv|uw{xxqgqysaRSTTWZ[\[YWl_X|wymrpidJJN\WMNNPPKV~j[QLqnZfb`^][Z[ZZZYXXWVVVXYSbصl_`VXXcZJNU`ccb`dkcOR[[[XVTOHquo|nMJOOMLJIGEEFHICHb{nYLA;;?AKLGNLTlmNDDDDDOPC@BBC@:=IKKRUOVpeEDIFFGGEEIJK_kktrjcXQLKIGFGHGGFEHIIHHHGGGGGGFDEGIBUeQQ[VQQRRPMIGOTOKIGGFCIQRQMJHEGPJDIKQYSKORSRQQOKJLO[jrj\SNNKJKJHIGJLKMPRSTTTVZ[YUPKGJMR_iklpxwxgM]~wqnzibjfkzqdfXB@DIIJJJJKKIKLKJIJIIIGFKZZJCHJJJIIHHIGHGEEFEFEEEEEEEEEFFFFEEDDDEEEFCAnsuv|pYZiomicVJIHK[]E>GNRKDBBBBDFFFEDDDEDDDEGJNQKECCDEFHMLKNSWRRLMLKLMHFKNOONNMMMLKKMMNPRVYUQPQSTTVXXWOJUNIDDCCCDDEHIIK@EBCBVb`_dcn|nOBEIKJHFFGGFFGGFFFFFFDCCDCACCBBBB@>>??ABBACDDDDDCCBA@<;?@?=:89::;>@?<<==<=>>=>=<:9758;>>@E@;:77;9;FLKD;5458::758:;?CE?;=ABCDEEEDCB@=<<<;<;;;98::;==<::>>><8678986666555557876553333445555789;===<;<<<==:<@B@>=;;::9996545:=:656679:::;:9:99999::;;<<<;;;;:::::9:;::::::;;;<<<<;;;=<;;<;<;:9:;>AAA@ABEEDCBCBAABBBBBBBBB@;99:::;:::::;?=:77?GHEBDC@=<;:9:99777986?CBBAACCBBDEEDA>:87776677777657;@FHGHHIMOI<7<@@@ACB=:=>:876578787422200011111000/1318AJ>22545528=63>>6HLGfj`]PEB@@?==<98889:;;=>@Wp{{jtgo~o_XutOZ]LF?9Dn|FHeN4889=?845555689;?A<547656766<91/288634759;9=JB28BLC25AJK@C_ysS==?=;3157:?=BFFIIBL^L:DII93<:746<;47DF?=5527:326432S|xf`hlimqcJ@CDCEJNSVXTFAEEFBFGB>=>AKUYXWRB;k5;@9BKL@G`hddN=A96CRE;>>8.33-38/-56582/2899=BFA50hhfa[WUUTTTUX^b`^\YVSRRTTNJQW[]\\]`cdegghijjjhfeecb``___^]\ZZZZYYXWVUUUVWXY[[[[[[[[[[\]]^^__^ZVTSSSRSTTTTTTTSSSSSRSTSSSSSUY^^_[Z[^bcagqtoiimt|uaTPQTURQSVYZ`jmgfjjjllmmmmljfb]UOLLMKJJLOQTRPPOQTWZ\^_accjxq`[YVW[fihohhnhbad][bcgw{idlobP[x|z~vkb^]\ZZ_baabca]^___`ba```b^Q]{}tuvrvxz{{|vuqc]acfha]]^hw{tolhinmadw}wy|yvlhv{q]QQTSVZZZZWVd}{{rPJKQXkeNNOPQL\|hZUVXtkQ[_dc`\ZZZZZZYXXXWVVZYSpăeaXVV[|fGT]d_ZZS\ntf^^YXW[YPUmskb[SLPRQMLKJJHFFFHIIXjtyyo_VMA@BGJILJH_uOCCCEHQPC?BBDJLIDDIMJEKYTHFHGGHGFDCFDO\cu{pe\OJIGFFGGFFFFHHHIIHHGGFGFFDEJFG`UDKOSRQQPOMJKKMKHGGGHEDIPSQLJIMMCDIJMLORQQTSOMLGKT`pyq]OLJJKLLLLNNSVWYYXXYYYZZZZXXTKGP]hpmikrx{eQtvxpbb|iczgur_`UAFBDGIIJIIHHIJKKJMLIJJEFLRNHHFHIJIIIHHGGFEDEEDEFEDDDDEEFEEEEDDDDEEEECCn|snt~yjdillg`VKIIMUSD@DKRNECBBBCDFFEEEDDDCCEFHKMOKE@CFFGNPNNRZSUSOPMNOLLLNNNMMNMMLKLMMNOQV[XSQQSSRRTVWYJQRJCCBCBCDHLLLOGLB?@INUdljplVHHGJIGGEEEEDEEEEEEEEFDCCCCEDBBA@@?=<>@@BCBCDDDDDB@?AC@?@@><:9;;:=?=<;<==<<===??>=:888:;<=OTIE>:>@=?GO[_L72/357;?CGMTRE?ABCBDDDFDDCCA?<;<=;=<98:::<<<:;>==<=?BC@>>?@@???ABBBCCB@@@?@BACHLNNPQI@=@BGJIHFFD@??@BGJNNC;98888785434419HUZJ968977678;<;?CEB9569875555544446787654323455556678:<=;;9::;<;:;@A><:899;;<;64335:4356689;;<;:99988999::;;<<;;;::::99:;;:99:::;::<;<<;;<=;:;::<@BDEFGGHHGFFEDCCCBCCCCCCA>;99:::;:::;:=CA:7534;?<::730.+,.)'.42221/-+/2,75656677898459AA;68@EEEFDB?<;8:998676765=A@AAAAAACEEEFD>966866677777769AGJJHIILPK=8=;=>7235678;:8ALC856886531/61.5=<:99>><;;BG94?HH@967??652>JD8<7@TZ^N27=35454365479ER>35,2MF0/49>;743448:5<:53;?=AGEFH=5-25912>7(>|yi_addeheQADEDFKOTVY]KAFKIFGEA==DLRWURU`KD:(?>88GPIYe\NMIAFF@CH@>@CGMNOVUNC=>><=?>:AG:572=RUSZR?@J@4--4?-)++7JPOUTE7--CRNNUTE73dc`\XVUTTTUWY\`ddc`[VSSSROKOSVXVX\`cefghijjjjhfeddca`_^]]\ZZZ[[ZYYXXVUTUWWXZ[[[[[[[[[\]]^^___]YUSSSSSTSSTTSSSSSSRRRRSSSTUTV[^^accedcb[Xaknoqqtxti^TNOSROQUV\ef__ehjkmnoooonjgaYRNNNMKMNNMMMLMORTSU[__`ccgs|kVWYZZ^]azr_w|rd^`ZXbfenurj`\[STn~{zz{~~yphb][ZZ_ffccdbaba_`aa`_bc`WRfxxy}wy|t{{sumo|so{udacec`^]]gvujggillb^o{vsx{|kUaxxkYQQQRVYYWWVVoZ@OXTaokXONQQMeg\XYYZYTX]acc`]ZZZ[ZZZZZZZXX\ZN~ǔm`ZXVS[tB_wudWWQS_lrob^^\VYRXUV[]\VRRRNLLJGGEEIMNQ[dfedbccXQKDBFGJNNIMtY@BDGNSPC@CDEIJFHOLC@DEFHIGGGGGFKUXVZ`bcswj^OFGEEEEFFFFGIIIIJIHGGFFEGBCMDUaDABBILKKJIIGFFFEEEEEGFACKSSLJJLHEHGHHHKONOTUOKJEJ\ipoZIKMMKIIJOTY^dfghhfeeeed`bjnld\\j{vhjhcfpwj`iomlkf\W{kohljMJDMFCDGGHHIIIHHGFGHECDFGILMMNOHDGJIJJIGGFFFEDEEDEFFEDDDEEFFFFEEEEDDDCDDIaxtdm~xtqnkjjf\SJJKOQLC@BHSRGBBBABCEGFFFEDCCBDDEEEMURIEEDGEEKMKKIJKKKJIJJLLMNMMMNLLMMNMMNPQU[ZVSPPPPOQSSURTRNFDAABBCHMLKKIBB>?CBN`mmm_RMMJLHEDBCCDEDDEDDDDEECBBBCCCC@?>==<;<>@?ACABCCCCA@@BCCA@?>=;:<<;?@?=;=>>==<==>?>>;:;758::@U[UXTIDE=9:BTdeH9;CJLLMNPPD=;;@<>;98999;;;:;===<=>A@>=>>@?>?@AAAACC@@@@?@CCFKMLLOOE?=<>AFGFEEDCBBEEHIIFB;867776665443115>Q`O62:9999:;<;==<975677755554444346877543334555566789::988788889=>?;9766789874335872356789:;<<:99888999::;;;:999989899:999:::::;9;;::;;<;<=@BCEE@<::<>@BCHJIHHGHHFEEEDDDCDDCB@<98::::99:;>CFB;89857;>=;:73/--,**1:832310/,/203:9311134566556558756632216855566777788857?DB:7:?BEGFC@@AA;5765555568686665666668=ELLIHHHIF;4@JIB???>=832002432331.--0///0012233454332.3962234444425ig<;Mw\DDDBA=:75668:;<>CShwmghec|tymi|`DKK:,/009?><@A85228<@HO@//AJA95>I?30++114?>;;=><847=>99?AD?8>4-.-*'<86617B?AGIHJQTVYYKDHGA=;<::GRY[YUU^gU[c,/68=EDCL^_KBKNIJGAA=988@MSOQLKNHLHDBACFLOONLHDA?B@88<92BA3-+3IYOHSRILSM:/14?H@:LK3))*->ZU>1.9C9+&*.3Gdsq]I@BQ]XPYcU:0ZYVUVVVWVVX[[[^bfgc`ZVTRQRQOOPPQW]_adfgikkkkjigeddcb`^^\\\[ZZ\\\\ZYXWUTTVWXYZZZ[[[[[\]]]^___aa\VTSSTTTRRSTSSSSSSSSRSSSTTVVVX\`fgeedcb[RR_jkfgpx}vj^VTQPRTUWZ\afhlnnopqrtsoke]WTRPMMNOPPPNMMOTSSW[^`abcb]ko^V[ilg^V[pynxo]^YN]z|rk``e`XVfz{wxyyyz{wne\Z[X]imebeeefdbccbbafi[Piyy|xwtr~z||sek}|wraaca`_^]`b_[[[^``ao}zpinxy\H]oj_TQPOPUYXUWU^o|GI[\ZY\hcQNSNOlr^WWWXXXXZ\]`_^\YY[[[[[\[Z[\[^ZLڽq][]ZUVhN^}sSMLHNXbi_`efZWXTX]]ZYVSQQMHMPIDBFPXY]ba_`\[hgUSSNKIGNSWPE\~mG?DGMUPDACEEGGFHNPJGGEDFHGGEFH>Lt}jm|}kooYIEFDDDDFFEGIJIIIHHGGGFFEG@HQLcZBNOIIJIJKIHIGGGFEEEEEEEDITTLLLHCDGGIIJKIHJRWOIHEQdii\IEKLHGIJMU\`fjjkmppnnqsru{}hanoZSYWQQUVQLLLNRPNNAb|p|SPyhMLKIFDEGEFFHJKFEIMLHKSSPKMONLLHAAGJIJJIGFEDDDDDDEFGFEEDDDEFFFGFFFFDDDBCFSY]`[g|vkggimqv{iMDHMPNGB?>DQRGAABAAADGHHGFDCBACDEEHRcjbTHBEGFHHHGEECEDEGGHKKMLMMMMNNOOOONNPQTWVTRNNNNMONONJPQNDCABCCDGJJHEBABCBCDAIYab^VORPOHEDBBCEEEEEDDDDDEDCCCCBBBA><=<<;<>?@ACCCCBCCABCCDDB@?=<::<;>=====>>>=;@;:99979:;;;<<<<=>@=<<=>??=?AAAA@BB??@@?ADFLPNKIJC:==8;<>ACCCEFGIJGIHECA<8576666664557<=;;MfP68:<;;<<=<9777545666455444432247666433355566666777778766500;><<8532234422225;<54456789:;<=;99877999::;;:98888787889:;::;<;<=;;98:<=>@BEGGGEDA<;;<<<:88;;:::98;FKC99;:6579;<;951/--1=<1..02223311244212201567775444466555643444445556665578778>E@99;?DHGDB=6f^;54444345;>?@@AAAACEFFHHFA:77766765788:AIKHEDEEB:5;FLH@<:;<840//03556764123310/01223557<=<<94432133344554)EQ2Flv^[F:9?LKDSeX;@b}{wlgnZCJdvkJ<<6200006<:<>?>QshD>JHBABEMMFGQWJ86CG>;OW@0-.0/2;?5./8A>602:6488<86625YylG>>2277::611-./..0234=JE9:>9-),/579=@B>433/.00./38;83123667742:@=<=8/,5=DG?4214BYsqP:5DZYJILE?:;AD?:636<86/ATRF@AIVWWYOA74;@>@IOK@4-5^_?@I;4AD:6Ikz]PSRKMNHN[V?5VUVYZZZ[[\]^^\\^dkjea^ZSOONLKHHLU[[]bfikmmlmkigfddcb`_^\\[[[\]^__^[YWUSSTUVWXYYZZZZ[\\]^___acda[VTTUTTTTSSSTTTTTSTUUTSSSSTUVX]addccbbc_WYafghowxvz~|n[TROPRQQV^dfiosqqrrtvvrmg`\[WRNMOQSSPMLMNOOQVZ[^_abdbbhf^[^db]YQb|yvs~cVVbnhmg_]ct}yxwvuutqj`[[\[\fokdfgghfcdedcelhZcsq}{tq~rfdl{zdab`````^][[ZZ[]]byvmfiodOIYfaZRNOPNNTSSZWeocWG[^Z[VV``QMRR[rzh[WUXZ[\\YXY[\[YXY[[[[\\\Z[]\^YT׽m[^`]XWUlfW^}|LEMJMNQSLNVZedaUZ]]\YUTTTOGN]dc][]__bca`\\cb[W[^]YMGKNSSHC`uU?DFKTPDABBDFGFCEOSPKGEGHHIIRUCFflZT\f^imOCDDDEDDGEDGHHHIIGEFGFFFEC>SRZcLRTQOLLLMMMMNNMLIHFFFGHMTWTMNQKGCFGGHHIIHGFMWPGFGTgmcPGGIIIOY_cefffffinsxz|vlkx~pZMILPNJHHGFIIIGGGFE@RpzzZDndGJJNKFDFGGGFEFEHZjlhjiaVMJHHJJGGMOKJHGHGFEEDDDDDFFFFEEDEEEEDDDDDDDDEGJJKPRPPVanrnhcgjnw~pRMQQICB@=ALMDAABBBBCEHIGGFCBABCDDFQaimm_NEDEFFFFEDDEEEFFGIKLKMNNNNOQQQQQPNPRSPPPMLMMMMLLJJMKI@>?@ACDEFFFEDCCBCACEA@GTSMLOOMDBCBBCDEEEEDDCDDDEDDDDCBB@=;;;;<<>?@BDEDBBCCBCDDDBBB?<<;;<<<===<<<=??====>>>>===G]XF:72CYRTZUOIB<<=7998>AFB@?ACCFHIGA9:@HB<;988998:<<<<<<=>>;:;<=>??@BBAAA@@?@BA?@FKMNMMGA;:<869;<>BBCCGHONGHGDCA>::6566887779=CEA;5>WVA<;<<<<<;75565345554555555331254444444444666565566665562;XO?887532244322227>;544555689::;:99998::;:999988877999999:=<:<=>>>;957=AAGHGHFEEEC@;99;;::<=@CEGGGEEFFFFFEDEC?<;99:<=:89:>CIE98;:88622685111/.04HVG3./002331.-0200236;;987654324455466446544445555544656515=?=99>CEFDB>:]r^;/2233459;<>=?AAABDFFFGGC=7676666558:>FJHDA?>><77<@?=;989:9887433579;;;=<9521000123789<>>??<86334433344530[t:6>O϶~C01;BCEB=86523568=A?84:5.HrgA?NWVX[gbF@IIB3.6DJYi`O;18>@>840/2599;:;d\5=LNMLKHHD=66GWYODIDQcQ645673382+'*3?D=5686655>C>>??;989???;8;==<8?INQ[`G/464//-/006DQ[bYD43<>979BIJHG;2220////1678634333312=>8:967=CIKKJ>30/=Y^B/.14:@MWUXZTPSW@-IfgdaYPLIFIUWHBGJGGOTG79=<5//:L]M8:>><=ACIVSC:;;958DGFD;33BLLS`f]K@?@>?ELOPMIJLLKJHC<:<<:9DGCJNMFE=05IVVYYK;5549CDGK@>[meC6.2BMOSXSPWVWZ\]\\^_^^^\[\]emmgc`[TOMLKKLMRWX\bgknnprpligfddca`_^][[\\\_``aa]YWUSRQQSUUVWYYYY[]\]^___bccdb[WVUTTTTSSTUUVUUVVVUTTUUUVWWUTW^cb``bcb`\]cghfa\XX[]^YSQNNOOPSUSXakqqqstuvwwqia\YVRPNPSTSQOOONKMQTVXZ\\]]^`_^^[SSXXZ]X[wv^knYYŨ~o`^[Vexyvtrqonlg]XX_gcamngfhgccdbcggosbcqlvwyvekw}vebc`_bbaaa`_]^_badz~vpodPIJWbZQLKKPRMMRV`\o[jKU[\]\[[[WRSSSato]XYWXZZ[\ZYYYYYYYY[\\[[\\Z[]]^Y^˳nX^gf][U^yyh[j^INJLLKIGEGEP_d\TY`]ZWVVTRNN_uxfddbcbbbheRNT^gg]MBCHIIH?KkbDCEITNDABBDFGD@DMNLKGFKLEGYgeQ?G]`RLNRi]GBCEEEIIEEDGHHHGGIGDFHHHE?EUZ^RKTQOMMMNNOPPRSSQMJIHEJSX[YLGVTFEFHIGIJHHHIEIVQFEFUijYHEFGGN^nttssrnnrysmrxs`OJNRRPPONMLJKKIJKJKKKM_q}[BZ|aCJIKQK=EYQEEDCTcbunbMABIPTOJLQSQLHEDGHHHGHGGDEGFEEEDDEEEFEC@ACGJKLOSSPMOOPRVY_deabgox}}hWOHCDC@?@HICABCCCCBDIKJIGFDCCCCCBCPY]dojVFBDEEFEEEEEEEFFHIIJOQQPONQSRRSSPNPQOOPONMMMMNMLKJIJGEEEDDEEFEEEDCCCBABEAES_YQONIG>ACBBCDEEEEDDCDDDEEEFEDBA@=;;;;;;=?BFFECBBBCBBCCCCCB><;;;<=<<====;=>><===<>>>=BJVaga[LE?IY[\\\[VH?>>=?[l]IJPRRRE:6678:?A?@DIDEFGFB:<>NF=<:98998:;<:;<=<<<;:;<<=?CFECBBAA@>@B@AEKNLJLLC;=?=<<:;=>AKRAQEGIGGFDCA?;956778899:>DCC@>=;:MPC:==<<<;75455444344555544431033443322234557765554435666>>?>=;<>CFGHHFFDDDCA=:657779::;D@?=<=;:;;8214641/010115KZRH?80*++*+//1789=DF:4664444433444653455544444455445665446=B<8<@CCA@BBNdzaB74445666997:=?ABDDEGGHF?9775555557;AHIC@=<9777778788888:<=><8535679;<<:732211023368878:;>??>:6554344447*1jk=01StP>532?oG47<;:978@D@<8977Mh\C?IQH>=E<-2;9521/.4:984007@AA>5220167;EJMM?2/7FMD>@<88;FX]MCEIKJOIAWg]YWQMMMJPhkI8I[]RQVC.5;7221/5GN@77;BFLTNKOA24=>?MLADJC74EQOV^_\WOJHGGHKKLKLX]NCB?:89;<:22BVc]OE?5,/6>=KTI814@F?==;6IggICKOOOPF1)--13('61"&'%&&6WpvyWWWY[]^_``___]\]Z[ennhca]VQNMOQQRTV\cilnpuvrnlkgedcba_]]\[[\\]````]ZWUTQPOPSSTVXYXXZ\^^^^_`acddec^ZWUTSSSRSTVWVUWXXWWX[\]]\ZXVW\^]^`b`_`][_bcaVLJKKMNPQOMNNMNPLHLUbknprrrruxtnfa_^YSPQTUTUUTTQNORTTTTSSTTUWWUUWYYXY]dbanxsc[gbX˭oVTXZanttsqonkjid^\hqjcgjihjka_ea^bo~sbryjltyns}}}qfehgda```ab`^`addgq{ygXNOSY^YSR[_Zdtom^X[e^U~Yf]R\_^]]ZW\YRZgraOVZXXYYZ\]\ZYXXZ[Z[\\\[\]\\]]_Xg㱇oV]mpfe\Yr~qesiQMLLJKLJIGFCGRYVZ\XVUTSRPONN\sidaecdtsb[WUV`aYRHXh`QOSOZcNDBGUNCCEFFHHABPQGIJEDJRFJb`[\EIqwld]^p|`DEGGGGI?7CGDEGGFEGGMQKJKLNLS]jVFPONOOOONOOOQRQPPMGEDHTZVTOCIXOFEGJJHIJIGGGFKXUKHEZn`LEDEFISalqtx|shnsjWKILPSTTSSRPNLLLKIKLLMMLMVfWBOhz`BHHELNDRde^XPHZqn{|e_TCJYbjcNLMNLMJECDGHIJKMNMHIIIGFEDDEGHIHEBBGNPRRTVUQNOQRROOU[[\dkptvrqrl_PGCEGB?@EGB@ACCDEBDIKLKGDDCBBBBDFINQWdmk^OFFFFEEDEEFFFFGGGJQVTRRPNPPQQRPPOOOPRRRQPNOPOMKNOLPVUSPKFDEDDDCCBCBBCCCTnqd[WTNHFEDBBCDEEDEDCCCDEFEEFFED@><;;;;;;???==??><<=>>GV`_^][]_P>ENRT\`]TPID?=@Sh^NOQOPJC<@C869@GC><<;9888::::;<=<;;:;<<<<=DJJFDDCAA@@?>DJMMKIHEA<>>BNJ?;??CGXE]VBCEGECBA?<977777998:<<>>>>?<:===;8666544323345534444223333211023334777766655665665312376544555535;:43455554577777889979;999987777669;;::::;==?>>>>=>>ACEFGFFECCCDC=6565556889859>CFGFDDEEFGHF?9:::;;=:7><99;;9743553101121,1ETVSND<::?GNZYOHFFD>512444444444455444445654434443354433203999;=ACBAACPWrx\D85556457637:=ABBBCFGGE>8764455559>DGE@<;;97677779:::99;<>?><9465111125434532245566665579:A3DQ5.-,.,-278MhV;BEDMG1,--;SZO<542.-./05?FE9/+*+++*8EA<:5/,*,3BNM@9>DADHCESW\c]ZVOKIHGGQf^HRghZ`rY<@?77;9767;;48CGGED>BSI32B@E[Q;?IE<7;BKX]YVZ]QEDEEDDEFHX`F22056257;93CYfh]B01673.4BRQC?IVM99@ABLQEBKLMMUZJ50WcBEEFEFFB>>?AABBBD@=;9::99999;>?A@?>>??>===?GU`^][X]eX>5;@BHPQRQRNECA=L_XOSQLIKMVQ=8::=?CSYKCDFEC??A?<<=;98889:::;<=<;;:;<<<;;BIJGDDDCBA@?AFIIIIHEA?<=>==<<:87754444333444344423334432122321467777766664444322235533345555787213454444677888877779878889777789;<;=>>=>>>>>@@=::>ABDDDEECABDHG;5777789:;977<@BCDDFFEEFHGC<8:;:;:;>@@<68:;;9899::953232211124523ESSQUWUX[`_TJBBC@9433344444345335654444566544554355443137??BIKA:743455456569;?BBACEFFD>755444545:AECA=99:::76799;;;:89;<::960++-36887767786677666567669:8988;9765345./IdDKuB#/16=`}238646;><86229>CHKZaGJPI?>;8327BME:869::::987:EJA=>:7<>:BC>=865459?<64,*-&:m|`:.,/0+ZkTdJ>]_HU[JC=6323447;;//441/342-3A@3=TS<15758II<><8879734/.xk:2352.4CI?@QI>NZQ?102.2;LZV>222..038:==962/131/+=G<699973.0>MIADJF=/6]hQPVG=BC>?S^\abZPJGEBA5:o~tsljmFC@9:<:;<;9:@GJC9587AUN4/;;=LJ>AFC=947ERWWRPUO?=BCCDFJNWXD76/7GE37PFDFCU\K12ITH:=DEOVTPLC824=EEEJHDCA@ELKB<>DGA2/0++2<@A>22bVVY]_^\XZadc`^\]]YWW\gle]]^YUQNPRTW[\]`a]SThrjhgeedccb_][ZZZZXWWVVUUUUTQPONNPSSSV[WPQVY[\^`cefffhif`[WTSQPQRTTTTTTTSSTSSSSSTUSQQQSY]`_^^\[]_`bd_VPOPPQSRQOOPPOOOOT\b^[iuuusnpslb\XUYXONOOOPRSSRRTTTTTTVWVVWVVWWWWXY\`fhfhfcd``gWm}af{zuuuutx|sghjmqrommlkmmlknmfda`[^t}|}pr|y|quwu|hdimo|}iababccd`_ddgqbJQkxyrbjxhbfjltbUXTRpɺȵhffT[_^^]^akveWb`PKMSYZZ[Z\__^]\YXZ\]]]\\ZY\^][^`UxP^\[brtmi[UWjsOEPVUPNMMLKLKLIGHHGKORWSPPNNNMMLKQrtbbeckeMViefxlVVbdaVMKABTVAKZJGIFEFJI?@HJGIENeNGMTobOQYWSQONMKBHZokPII[̶_6BBCDEFFDLaYGJJNMaxVDPNRUUVUROMLJKKIHEACQegVHHKTZNEOWQMNMKKHGGGHHLQPNMPXREDFDGTisw{~xoej|YFFHKMKKMOPQRRQOOOONLLMMLLLLKJRosMGILgXBIIKLJ]Te{jFO]qt_XTLXhg`[SNJLOPLJJLMKKLORTTTUUUSSRQONNLJJIF?;?BBEIKMOPMLLLNPQPPPQSUZ`inke]YST`eYJ@????@AABBCDBDEEGLNJFDDCBBBCFLHACJVedSGFFDEEFFFFFGGEHHHRXYXSKMOOPONNNOOPQPNOOOPONNMLNPQRQNIE?DDDCDCDEEDEDDCCHJIGFGGEEEEDDDEDDDDDDDCCHKKJJHFB>====<;;;;=@CEFEFFCBA?@>>@ACAA><;;:99989:>>?AMX``b_\^bT=58:<<<@B>EPQDDC;IVSUTQMT[UGDB?<:==IXOBBFEDA=<:9;;988889:::;<<;;;::;;<==@EGEDBBBA?@BGHGFDDED@?>>=958<=@GHLG@>QP6:@ABCC?<;76676677677998888::;;;<<;<<<;9875444444434433333234454322220024455566532333332322332223654895322234445558888988877987788988899889:;@A?A@??>>?<69?BCCDDEC@KOIIGA>=;99;;;;9::9<>=>AFE@@DFFIB9:;99=CE@72689:9999;;:86232///0246776@NMGQZY^d_L59CBB@>=<:524553444335544444666665444579:<8=\uoC/8=ADB<76;8-.24655454542688:?CBBDEED>864433445<<>@>:93/7;8787778:9765544455796546:=;;<<=;964;:3V^MfXWyndWDN\K988DF>;;6232397jsGg\F8/69<@FG>604DOOJCC=>?ELLKN@3686@DGLA98<:79<;4,,-,6Pi^;0/-.,Jy=EIL[U7@UYQF432//15:=9794269:65:@<7FXVD869;;<@>53461+02/./C;58:75@WVA7AKJLXK62650334GWD111.027=942148=BB?9/>G6,3;CGA::?B@?EHB==;>A;6Pj[JMQE;<>=>N\[[XQHCGHG>5ja@DE@>=;;=@DJRSLIDDKGCPP;2688966CQSRTTOHDGLMLIGJX]PB=;65MeRGVGA?:DI>9K_aQEHJIJMQM@46CFCDCACD>;;;=>:9872)&#&+2?@BBCKGAKMI`p[QOLKGFGH@KpqTGJǽr=EGCEFFGHJJUVHIJIFomBKOQTVWWUPNJNNHCAEKQYfeTEDKPTQED\plZNMLKJHHHHJJJGEGGB>?EGDI_z~uihp`KNPMKIIKMOQQQQPNNNNOOONMMMKJIJJNSHHIFZQJLHDDHJDQN_]PKNYYRROQZXPMJGFJNPJJVXQOPNNQTVUUTUUTTTSTWYWUQKGA?ADECEHJLNNMMMNOOOOPPQRRRXejdRLQXhypN:??==?@@AABBCDCCGLMLHECBABCCLRNIGHR`\PHFFFEFFFFFGFFFGDGQ[\RKMNNPONOONNOONNMMNNONNLLNRUWSOHDBFEEEFEDEEDDCCBBA@BDDDDFGEDDDDCDEDDCCA@FLNMLLGA>>=???><<;;=?AEEEEEDFGDB=>@@BBCC?<<::;:977:?=?=>?>?@@HOaea\`deedP;6:;=<9;<<=>DOEGEBIQVXXPVcSAFGC?<;8?KK??DEDC=:79@@:997999:::;;;;:9:;;<>>>@BBB@?@@@CGIGEA?@CC@?@><;85:5?>>AEECCCEEEDHUcZJE?>><==<<<;:96667::>BBCEFFJF>:::=AC@;6567988989;;975321/.-14457738JQJOVY]_R=>=>=:9==8688876532210111246741587687540/0388:-4`[Ojo;Mm~lF:9=JJBA?830/25/HB0/24417EKA56eh67976?S^M:6:GQJ<16;8320004C@30..038:4/.04546@IE<;=;;>BBA<65;=IUXVVSMJJHIHEFFGKUgslZJ?:>B?>=61/.0-,176,5DKNYflhWLQK:123UX\XQOQSSRW__]\YXXXXWSS[a^\ac^WRRRQQUYWUX[YXZ\_cdccdfed`][ZZZYXWVUSRQQQQQPQRRTVWY[^ZVVXXWX[\]^__^]\]^\WSTTTTSSSSTWYYYYXWWWWXWTQPSXY[\]]][YZ\]]]^^^[XXXYXWWY\_`b_UOORSUYYV_ouofigYVTO]pmow|s[QTTUUUUUUUTSSUUTSRSUUUVTTUWTRRT[a]\bZ]}zrnqw|~xsuy|{wogfnjdhlqporpmmlmomie`^l{}~zs{toq|m_ehowvvuadfifite`dfflpjdaT^x}{{zyxuqopskjpx|dUVY^hY\Z\]^_dyymtkYZXQNVac`]\^ga_`^[[]_^]][YXX\_`aa^bg[gb__^^aipuyphppd\USUQNLKJJDCGIHGFKRSSRPNLKKKJLMESrihb\PJB>ABOgvlUYunJ=DIMG@XMH[IHSOHDDB?>??????@B=BL8AprZMHGFFGGADdpNKZŀ>?IHDDFFGGDFTUJJJ?RsXHRQUVVUSPJLA7=>@KQ^aaYOJIKMSOKRT]mteSKKLKIHHKKJJIGEEDCBEGCKf~{mcfr~dORTPLJJJKMOPQQQPNNOOPPOONNLJIIIIHHGIHGLZ[OMLJFGJKTk\:;EFDIRRKMPPOLJIIIJJHNZ_ZRQRPOQSUTSQRRQQRQRU[`a\SOMJHFEFEGIIKLMMLMMMLMOOPPOMOZgcTU_ejr{|gH=@>>>>>????ABBACGKMLGECBBBBN[]YTPMOVTJFFFFEFFFFFFFEFFCHQYRKMMNPONOONNMMLNNNOOQPRNNOORSKIEDEFEEFFEEDEDDDCCBDFEEDDDFGEDDCCCEDDDDEEIPQNMLLE<<=>?@A@>===<=ACDDDDCFHHDC@=@ACEEB?<;::85479=@>====>@>FcypgaY[cieO;79;<<<;:;:>ELTOMJFFMTZVPV\FFFDCB=7:?@<;ACDC>56AHF<99789:::::;:::9:;;<>>>>?@@??AADJKIEA>>ABA@??><:75989GQdjQB;67878=EC;=@85876555555665556889:;;::;<<97545533443333455443234455532221111222233222221222212223323427?;10479:999:;;:;;::9;<<;<<:9:97666653321245:<=>AAAABDDEECCCCDDFG>C\ndOD?>><;:9:864456;:9CHHGFHHFB::@EC>=;;98787788999862000/-/35457855CRRTYZWLCFIHD@?BC@701223245444345455444455667537<<<987-:gzK/:CDC<6578:<;98876434223466:>ABCDEA98=?;85447:;75776777643787764468::99;;;<<<=>><:8777863/..0322223332329O\H,379B=,)0,3;->WRwϐmUO>9BLKFB=940/022+F{n|IFMGORIFG@Kx]U]NCD@BSaWF@::KN?QX;06866:86<:8DHJGBBA;530-/25636:86653/)+6;7::?744333,1840.00365301237@DGLG;?LMG>;@FB95A?8FULAAAAEIIDZŽi94:9:=>@?>AIPQMC=:88764369;;;;=?>;:@?42@OQJEBCT\Y[\PFIPPHC><@CDCCCDEA=?@BCA>?A=>GE8@W[NGIHHIIFBUxv\JW[>>?@@AAACGLNLHEDBABN^dcb`ZRPSMHEFFFFFFFFFEDFFEDHPPMMLLNNMONNMLKLLMNOOOQPPNOOOMEC@CEFEFFFEEEDDDDCCBCEEDDCDFFEDDDEEEDCEINOSTQNMMLA<=>?@BCB@?==;;@EEEFFFEEEEFCA@@AACDA=:;@AB?;::;;<=>>Gln\\kdY`fbJ89:9:;:::::;>;JTNKIIHJPSPOWEBACEG>8;A;:9?CDB?=?A@@@><=;88679724>oqP?4984459?A@;33:75555444554434689999:::886422332222212443344223445553333212222223221332122222222333446=A<779=?AA?=;;;;;:8789:;;<<:999744434444335678::<<;;;=BDECDBBB=CSOCB^|wgZK?>A@@AA?>>ADF@79<>AFGGGD??@C?>?=<;978887887773..//.0565568878=ISXYSG@AGIECCCD@4-.122224444445555555445667877>>=<955665544566667532286:IjoF3/DukZL9,/..@@^ЯnY;CHNHA=96100044.37;=3/ZsYHEBBIc}coXE>=>GUZWM@K]K9HG12>=:89985336>@?7*/3/8OV^]VOHH>?DFJG<5346EWXEDC@;941220-/157776676589512227<;:<>B[g<6556:><88DE66HSRG<9@MTUWTJABKMJG@==;>A@@@DHBAGLPSWhzvprwrhhnhNHOI><:5/.211RlWGMPUZ[TI?89;8655RRTZ`_UPRTSRSUWUTSRSUUTRTWXVY_baYRQQQTVUSSUUUWYZ[]_``acda]ZXWVVTTTTSRRRSTVXY[]]^^^_bb^[[[\\[\]]^___^\YWVVUTUUTRSUVTVXZ\\[\ZWVXZYVUTTX\^]]]^[XWWUTUX[[VSUVUTUWZ[]cbZTQQQQQPNOQQQ_jddotnfdfgrjPTUUVUUUUUTSRTTTUTRSTRPPQX\USZ`dlqmqxuyxtpjcgtxihkefllffqz|~xtnlopot{|stuonmo{pfsvtulbchjovvudhqvy~n`bcgnikpntz{qlsmntustor~~}iR[be`d`___^[d}z}{eWVSRS^nifjlihdba_]_bba`\YZYX[bed^p^e_acedemrpqurniYOLSPJS[biv~u]NLJIMQSTRPNMLJJKLMORP_slrlO>DNEDFB<47@EIO_`TH??CDHCQ\D??=AGD:AQQIFIJJIHHDLlzeMӎJJFDDEFFFGFIHTgbWOUiWHQRUPIFECBA9OѵYULGJLLNWRNVZfqtpiciqcNHJHHIIJJHGECDEFDDEC?Phmwvf^apk\][WTTWWQKJJJJJKKJKMNOPPQQPOMKIJJJJIGHHJJKMNLMNMOTF:X~^DJNLQUVVRLJLNQNGHUYNHMOOONNNNOONNPPOOONMKLORX]\XRIHIIJJIIIIJLLIFGGGKLKLNNKP\dYHKUblnjf^NB@@??????AAAAAAACINOJGFDABKX_`cbdd_WOJGGFFEEEFFEEEDFFDEIMNNNMMMNNMLKKKLMMNNNMMLNNNNMKGEACDDFFFFEEEDCCDDCCCDDDCDEHHFDEFFGDDCGNUSTSQNLJE>=?@@ACDDA><;;:>FFEFFFDDDDEED?>>>??><:::=CFNPPJ;99>A?@EKRV^ddb[_aVB69;::998:98985=@CGHGGD?=>?=?B><::98877988807hiF38:8763;EB9.28655444433333113689989:95333222211222014433332112344433211124785311122111222333333325;@DEDCCEGKNNKIC>>>:76557777799987543210124535677889740049;==@BDF>;IMNKLhxwsrbY\WNPOONJIJHC;456:=?DGFE=7:<8:;<;:<<98776753342462Q}f7/^|`PH<1)3`ŬoK78AJD>;7504:5//3//...!QiJEHIB1/AUueOB<::AKVbjeU=6;;7=F?88977:;::CIHKB7>D8:LTMQSXrY9JWSG941.-A\hM@937:865651303898785578860//--3:HK=/.12//5AKHFF>98:;97<>>C:230+06<@?979;?FC7>=89??99955:;659:96664542AcrdO>8989:2D[OEFD<8@LVƶ¬l;::<<7579;=>?>>@?81022467:>;57@A<::@@?KYYPE;>FIPWPKJD@FLLJA=BGHGGGHJMNDCVc\SONJEEFHKLIRclopmfahy|ZDLK?HND;>FFHTOBFH@@FG@=>:57;;87TSRSW]^VQSSRRSTTTTQRSTSQRTTTTY_b_WSSRQQQRSUVVVUUUWYZZZ\`a_[YWVUTSSTTRRTTVXZ\]]^```acdb_\\\[Y[\\^^^__^[TPRSSTUTRTWVTUVVWXXVSQQSSSUXZ]\YYXVVVTRRSSSSV\^WSTTTSSSUWZadb[WWTSSQPRSSRR\\T^ngSSUNZYOWUVUUUUVTSRQSVXXWTSSSQQX^YQZiifibowt~upnlmv{q__foonqlcbluw{}|yjeopr}|xzuuxspllx}~qabmogdhfdejrxysyyimtqqv{``eekjnrqvyysmicfiqsnmq|tgVXe|}bccbbcca_ahtqsudVWUUXcqjfpxshdc`_```aba^[[ZYZcfffnلbrgecdecfmqj~yZHNV[elsz{iYTQOLNUUTTQNMLIJMKHGHIRgowuR?@LPGDFC<;9:C@AAIMF@?@@@AB@=>@>?FDDZ[FAHKLLJHHDDd|fcVIQBFEFFFFFFGRdxufd`SIGGFDBBBCA?7Vx^hcTNKLLPOOVRUn|yxyurvt]HGHIIIHGFFECCEEDBBDCIXcsyiadzsSLSWWWWVXYVRNLKKJJJJJKLMMORRPPOMKKKKKKIIIJKKKKKKJHJMAABADEEEB?<;;;=FHFDDDDDDDDEE@=<==<<::988:=ABKW]aTGHHMPOO`t[SZ[aVD:99::9:9:986779@A@?==?DHHFEB>=>>>AB=;9999877887784J`F346;:848>A<432434443312233235679989853212222222221222344333101222322111113674211122111222444332107ADFFGFGIKMNLLLJEDE>5221344456565443310..023356778776533332348@FLMLLNOOIPmsr~}f[OGGHIIHGGIIE;98634=CII;4:>??>><:88866652.,+++-38;<::88:<;::@R]M>@DDEGGF?77;<82235344223355443344356666668::987651A~jM=8:?9322333346898832333444578=CEEE?9?CEC?:<<8:88776322141:953216<61148:766/0`IKLLC80',N\PPI=;:6:I\cP>85234:B@=KSKBFRQ^[JO\M21:8Sffu<@UPC;830/,=blP7-.2223663--65746>906986430-7C98AIH?O`jbH9;76;<<91./+.-'$0FMF@;:CQXQB=<;A=542.28=DJG?8;@KD12006=;55888;<45;CHE?<<:>735:>=;SRQQOU__XTSTUVTTTTSRRRQOORSSSUX\_\USSPOQQQTVWUTSRSTUUUUW[][YXWUTSSTTTRSTUWZ\]^_aabdefgeb`_[WVVVVTTUTUUSOPRRSTRSUWWVUUTTTTRPPQSSUWWXZYWVRPPQPPQRSUVX[_`\VTUSSSTTV\ab`]XSSTQQTRQRRPOKKQSNPZ]broSSWUTTUTTTTSSUXXYZXVUTV]`ed\`stjh^l~ruotwwymXZcntvnfiorsu{}|ptxnp|ytwvvztsplq~|tqkeirnjkjgfeir{ztz}szzmtqdffhjjmqtustqa^gijrsplp|wj^\Uazdkea_`cdcdeeb_cgmcWZX]_mvhnvxwlebacdb```_^][[Z\ccm|n{^tvogdffaqǠ}cfjlimszsXTYWUOQTTSTSRPNLKNMJIHGHZjvbAIHOODABIE:AX]M?@ONBBCE?X_BAB?IMFA@@??AA?=?A?=CITVC:CGGJLKGHEFXaHds?KIHGFFFFFGEKdp|kaTHCA@BCDDD@?@B;13SocUQOMKILJAA\w{xwyvqtvbLHHJJIGEEEDBBDDDCBCEJTasoe]wuLDKMORWYWYZZWSMKJIJJJJIJKKMORRQPNLLLLLLKIIJJJJIIIIGILO[XXTJOORUURLGHONLb~iOMLNONMMMNNNOOONONMLLLLKKJIIIHHIJJJJJJJJJIIIIHGIKLLKLLLLLS`WPLEBCFTdcWHAA???@ABBCCA@?>>@EGHJJGA=MRKNUTRV`ii\NJGEEEDEEEDEEDDDFGHKMNNNNNNMLLKKMMLLMLLMLLMMMNMJIFDCDFFGGFEDDDDCDDDDDCDEGIJJHFEEDDCCCFKOQQPOLI@AGGCCGJIHFA=<;;<>EHGFEDDCCCDCB>=<==;9::::==>;887ANdo]PKMPOXg^VY[VE8;>:::;;;;:98:<;=CKONKJJKMLHHJEB@@@C=?EHGEB?=<=>AA@<<;;:::89989882:PWC40598768;74333565311231//0003435667655668764568;BEHKOQSSRMLhv]NA?EJHIIHGHJJKMIC<302:@FJD;;>>?>><;:9866650-+,-,1:??=::8899998@TS@=BDDFFE@:34=CDB>4222321334422333344466666898889633B]\G.('4?>6223333225898853455444678A<657755786458866665556531111,$$-8?@?@@CGIIC@BAEIFC?<879<<:::73343427uwI8HE1JzyX?7<><<@BB90/325DTVNC?GF@CPNB@LGFOLGGE9/5?ITdj96HHBA9-,-'*EkX212304864:A60/205D@25:87672.NtX:M^Q<8?99>???>?@@;DOWK;LWMGIHDEHGJP@>ECPJJHHGGHIJAZ}x{urdRJEDDDCCBA@?=:==>LTSQQPLLKD@JeusrrsqnvlSIIHJJHGDCCCCCEDCBEFIMS_z~meqvCDPNKMPUXZZXXWSMKIIIIIIHIIKMOPPPOMLLLLLLLJHIJJIIIHHGGGOUREPzZ]dOLPRQPQPGHMRWZQKGIMNMLLLMMNNNNMNMLLKKKJJKLLMMMMKKKKJJJJIIHIHFEHKLLLKLLLKV`TMLKID>;Q`ZNCA@??@ABBAAA@>=>@CEEBAEGIOOIEJNMKPZcbWLFDCCCDEDDEDDDDEEFIMPNNNNNMLKJJMNMMMLLMLLMMMNMIHFDBDGFFFEDDDCCCDDDDDDCEHJKJHFDDAAABAEIMOONMKEAHMGCEJMMMHA;;;<=BDGGFFEDCDCBB?<<=<;;;:;>@A?;9:::86>@CHQPMLNNOMIDBBBA@?A8BNF8:BFFFFGFHKLJB;8779999::::::9:;=>?ABA?>=@EHEB@==<=@AA?<<<;::::99899997@FA732578754=@;30244310/023122457887753356677645432223444333432222343213111212445432110/122247;?@@BEFCCEFGHIHIJHGGGHGHKJKJF?86579842221/01232565678766567789:=?BDCDCEFHNQPN@I`ZMC??EHGGIJHHIIILPM>558986AIB=>>?>=<:88755640-+,001:><;;99988888?KF<>BDDFFA;669>CGJC:661/221133223333444556668889;967GK0,3./-2;<4223333336999864455434589;ADEDA<===::;=>=<:64454/:5Fw^3.3<@;FT>)Fu~h0(7=:30244><1.22236:<:875554326>/<nRQE?<61../4AG>9=;;@JI@FJ=455;HKQUJDEBF>3BN?/2>EA<.+,./,*BJ.*4737;;=V}[30..1=B>9:757;57cPN`SC7;=9:><6,2=@?3////>SbW8T_h^RSVQ=46846;DIFB=72011/4:A=;;54<>8:<:=?=::::7/;gmXPNYss[G72EZTKKD8585?ͲW2@EDFHC:445228;721572/2:?AA912349?EJROEAB@FZihr|kPLQMLK=2=LS_jknsmXIJMNE63@JG@<<>?@?AED@FS`daab_afN:Vk_UOFDHKD7671-8ILA757545:=SMACEFHJG>=@?>??>>???ANSIEVjooorkXJHGHM=X[HLMMLLLMMMNNNMMMLLKKJJIKOPQPNNNLLKJJJHIIIIIIGGKLLKJKLKKUYPLLMKE@BDRZTF@A@@@@ABAAA@?=>@ACA>?>DNRLGEEIJGHNU[YLDCCCCDDDDDDDDDEEEGLQPNNNNMMLLLMNONMLLLLKKLLLLJIFDCDGFFFDDCCBCCCCDDDDBDFIIIGECCABAA?BIMNOMKIFJKKGDFJNNNJD;:<=?FFHGGGFEEDBA?:9<<;99;;=ABA><;=<:8764;TaYPMV\ZYYJ7:>>==;;<=<<<<>?@ACEEGLMNMOQNIEDCBA@?=5?J?6:CFGFGIIJLMIA;8678999:::::99:;<=>ACB@??BFE?>>==<=@B@?<<<::9::88899:961/38855689822;=5/342220.///11245554555789::8875554233455433454445555887420.-.///001244578:=@CGMQRQLIHDCEGGGGGHIHGFEFFHJKLNMIC>=<=<96543233446677889666568:<;<:999999:<==>BEDCC?7468:AFA8=@<83321112222224444554556778<:6DX<-4212127842233333369::9864455579;::=@EF<46;;9765567543325:987678863.-1,+9BDCDGIKMNNK?;?AEC;78<>>>956:8434234/4RTLNB<41:87>;Frd0276654434763684224:?>:6566432124.28FKDFI=1...0EXI::61:OPCEF>7558;8=C@8683-*+20--178:<=AJF?4.**,--8FC7---/47/.6646712:BY~]8.-,,3>FC@;37?;Ci~[??DC407<236987;>7-*,222124:=<9835;=758>BJJJ^sK;7;GBISSL>569:::::;=>BFGEFLU]fhb[[dP5:@FH;6@KH90236:<60,*-25519bzxOPQQRRRPQVYXWXXWVWWWWWWWRMMQUUUUTUXVTTVUTRRSSROMNPRRSTVVTTTTUTTTTTUUVXXYX]_behiiiijjjijllkiggc\XXWUVWWTRSTTTTSTUVVVUTTTSTTSSTTTVXXXZYYZ\\_eiiijouwwusi[ah[NORQQQSSPMT_d`\YVTVXUSRQQQQTWYWQNZlrzug^VWVVWWWWXYYZ[^`]YTRTSPVailhhijrxwzuqos|{{uTZ`_^ZX[juokmptwtjc[ax|vy{wvvwxxvutuvomnllmkjjifdddft~{z~{xvwkvvtvxz|zqeaehjiijmmfdifdpw}{trwpr|n[TTdro]\acqxa[_gpmcfnph\atldimrt}dfpkfda^ckjb]]]_dhh[kсfposqljjif|~tn~pYXXVSRRRSTSRQPKJRWTSTSTXKtRTTJGPVG>nsR[ooVA@[[9?@???=>MUOJLal{wRHHKFLj;=>>;?JMJHIFIAOouomkjnptqYIJGFILHFEEEFCA@CTcfXMPQfod}OCOKJKKKKLNV\ZXVVTPLKLLJIIJJKKMNNNMNNOONNMMJGHIIHHHGHHGFGFHKIJOjycSOPOPPNJFFDHPLGFHLLLLLLLMNNMNLLLLKJJIIILOPNNLJLLLLKIIIIIIIKPPJJLLJJJKKKMMMMKLLEBD@DTWLA?@@AAAAAA@@?>>@@AAA>>CNQKGCCGHFFHOTSLFDCCBCDDCDDDDDEEDEHMPONNMMMLLLNOONMLKJKKLJJKLJIFDEEEEFFDDBBBBCBBBDDBACEGGFDDDCBCB@?@HONOMIGHKKKGDFIMNOLF=9AA@?<:8999::719DLV`f^W[K<;<<=>=;4>G>8=DGGHHJIIJJG@:8779999:::9999:;;<=@DC??CFF@99<>>;3141-*---5=JA;;875434456677776665443335544444566666431///.059AHJMOPU\ba\VQMNSTUSRSMHECCCEGGGGGGGGGFFFFHIIJKKJGEC@??=;:8766554667788966677:>BCCBABCBCCCCA=6;FHJFBCBA>?BEGGIIHHIIIGFD?8223714A>::::;:98654353.,069739AA==<:99;:9::9:=>DGEA>:75579=B=38<=<63321222122234344445456558D^X8/5513233562233333336::99764567:=@?<::=CF:.16;9434555555208@>;989:<;9769:535;==960/353466454(Mz^HB;<<87;51\`<26467642147:=?@92/0587645566531.00+3;BJPH900/.6T\B<<=LTM@62224455543665551./-...-01479:;;9;=90..+)/=13BI@81.8GYgG6.*-,-5@FHIE>=A>8?B>70-.2237>@@@83>ND:YlM6:>;40.04=KF1+3:74?>=;:;>;>ST]mWEHGIJ>8<87QbB(105,,ƽɑFAKDBABCA;889:?>75BDEGJMTbh`Z[YJ=58FI>?NVH4./3?ME2**,045401J}QQQQRRRQNOUWWWWWVUWZZZ]]WQPQTUUTTUWWWUVWUSSSSSPNOPQTSSTUUUTTUVUUUTTUUUUVUY^adiiiihgillllkhc_adb\XVTSSSSSSRRRSSSSUVUUTSSSTTTTTTTVXWWYXYZ[\\^^]^dnttstvraZfhWNOQSWWVSOQTX_c`[WSRRQQPOOORTX_[TUYar{{nZUWWWWWWYYYYZ[\][VSRTWUT]eghiedouswyopuqxwmzvyu_ZZcocZfme__\[\ejd`\_fu{zzzyxxuyzupnomkjjihhgfddhq{|vuvwyvot}vuvy{~{tokhgijhgge\Zbjkkl{tp|wfWRTzqb[_o`fqXW_figcm}}zggrmvg{rupgcbZa}jZ_]]acd`u؋cw}ujejllioeUWSPOPPPPQRRSRRSOMV^^\YWSZIgZMPJDTiZBdxur\I<FJLKIF?<<=?@??=;BPJHNUjhXJHPLMC\eFEIHHKKKJIIKKJJG[|{ywvx{rWUVOJFCBBDFDCHJEDHJIHFGGFHHOUTUX]a^QIHFNSMFEFFED>ARn|hUOORQlýegx^GMMKMKIJJJJPWXVUUSRQNKKIJJKLKLMMLLLLMONNNMMJGHHHHHGGGGGHHGCFHJN^imkYOPNNONKHGJLMMNLJKLLLLLMMNMMMLLLKKJIIKLLMMKKKIJJKKJHHGHHHHKRWRLKKKJJLJJLMMMKLKGCFE@FUWB>??@@AA@?ADINNGBBEHHFEILNMJFDECBCCCCDDDCDEEDFIMOMLLMLKLLNOONLKKKLMLKKKKKHECFEDFFEDCBBBCBBBBCCA@BEGGEDCCCCBB@>?FMNNLJGHIJIFDFKOPPNH?:=AELKHGGGGGGGA=KSJE>:9>CC@>??<977888:;;:?9?BEIJEBBCEGGF@89F?@CDGHIJKIHFEB?:9889::::9:::88:;::><=ACA=;;;:;;;::98999;<<878886669957/<4/3-+9JJYfc\:<>975433344455566655454444554444677751-//19IU_jnqv}~~si`ZZZXVUSPPOIC@AABDDEGGGGGFFGGFEFFFGIIFFEDCCA?@?>=<:9887556777775569;9;A@>BCA>>AEGHHHHHHHJJJIE;34469=BB=<=<;;;:9765452./48:73:?>><;::::::99;<=@FGB>;:8658:;=7358<744321221222344455444445545APB.234234334323333233568998754679;>AB=99;@C>77533335543567525>BA@=;:9899:>EHGEDEILLICA=:88:=962.3894/./13668?@=7402Sp_HFA>;8:KX_chpmgS:37667687423771+../00/:IIDHHEED?6-*('+./399;<=8213@F44E>9;=98725=;3?LB0/311:?:510/-/2/---/3669<:7423223312599<=<<;::86AHJh\IHCDTPE@BDK[V7-3162(xżſsJRI<:==<86788:<>B<1.14312455652369:::98=L\bZZuɖ85ABFCGH?BT]\]Q=5;CEDA97;;867889;:;?ADHHIU]]\[[__YVRHDEEHIE@53M_B/51-9@844.(VQQQQQQQQQRTVWWWVVTTWY[][XVSRSTTTTUVWWWWWVTSTSTSRSTTUTUUUTUTTUWWWVUTUUUTTUV[`acdeca_bfhfc_[WUX`c_ZWUTSPPSSQQSTSRQRTTSSRSTTSSUUTTVWWXXX[[[\]]]^`cgjkmquuma^feWLNSXZ]]VOKLT\bgg^SLMMMMMLOQTY\[UR\p{kUUVVXXXYZWW[VQRRONTWYXRPWafebenppoq}r{xkrkorkpnaesjYX\\ZX]dda_ZZx|{zwwwy|wwmvpolgeghhhgfedgq~sjox}{ttuuvwwvtvz}~~{sjglqrsstz{hexqur^QQjjizYWkrOUadceeddqqoȥyzrtmhbajrmc`a__`cdW~ߞjuumhdgimwsmaj}zoTTQOMNOOPPQQRRRQQTWZ]\YUVL\c>FCDQTRJDmxx`IBAFfZ9@GKLKKJF@?ACDDCE@DE;IdoSAFPMLLMIIEAHIJIHIIHHHHIIIHRfy{{zy{}|d\cYLJMNNMMKJKJJHHHIHFGHHEDGHFEGGHIIIEBOTKHFEFDEPkz`RPV\Uhpdq]JMRKIMMKKKIGKQTUTTQRWVPMJIJLMNNMLJGHJLMMNNMNJIHHHHHGGGGGHJLKHIJNTWZ\VQPMMMLJJIJJKKLKLKLLLLLMMNMMLLLKKJIGJPPMLKKKJIIIIJJIGGGHIIMOWXOIIIGHKJJMNLMKKJJIJIEALZP@@AAABBA@?>>?@@@????ABAJQOLJIJKHEGHILLHFEECAABCCDCCDEEEEEHLMKKKJKKLMOOMMKKKLMLLMMMMIFGHDCFFDCCBBBCC@@AAA@A@DGFDBBABA@?>=>CKMNLJGGHIHFCFNTUSPJ?:>EGHFEEEEFGFF?A^sphYRKID?=??>:534679:;<=;:>MQRdXO=@DILKMORUWVUOHEEEFFGHHE?GPMPLB;:::9;;;;:::::99985;ACC?>EHC<:;<<<<<>@?<9:::;;;;998899:;<97676433445965@H8LaypD9<:85555534455666665566555455444222/.3:DT^iry~|{}vjcZWQNPQQOLIFBDGB;=AABDDDEFEEEEEEEEEFFFFGGFDCAABAABBAA@>;::976656767778<@BBCCCEDDDCCCCCB?=<:;=>CEC>=BGIJHGHHFGJLNNH;5568>B@===<::::;:7545422458;839==><<:::;:;:9;=@EHG>789755579842/3743432122112333444443443444446:5243346542/3543322466799764567889:<;969AA>>>=57<;<:73257:849BIHC>:99;=AEGIHGJLLIE>67:97643340.1760,/6;===>@@=86513arVLHA==RvpI9>>=<:<964656994111469854458989;97434338:98956842110/4EOUT?>HNF4/45676310/./022210/.-,05896/,-/6AJVWG4-2DI;5932LfbI?=G\j_MIC;:8-/154331/8GJCAAADBAA;102358=961.7C@10CN@1365760.01//132/--.59516::4022233135559<<==<;98<=HXNZ^OPd`Z[]efWB245/32&h»˰ZMS@45:;711577:;<@=2,-135654466323358987=MX[Z[q`3EGDCA@=:DRSND:7788876567655459;87:>>@ACJQWXW_jg^TD::::=ELL?:R]:.864@DLHLo{{qINhS;CILNNLMLLKKLMMMLHC??^`JDHLMJFDGNIFGGHGGGFDFIGFGHFEH_vvw{z{}~rcg[KLMNNMMLJIJIHHIIHFFIJGFIIEEECDGIHC<=EIGFEFBXlTNO[eZ_ŭipfLLPNLKLMMLLKIJLOTUTSRWXVRLHIKLMNMLJBCIIILMMNNJIIGGHHFGHGGHGHLLJIJLQTRRRONMMLKJIJIJJKLLKKLLLMMLLLKKKJJKJHDM]YQPOLLLLKJIHHHGGGGJOPTZZQIFGGGJJIKLLLJJJJJKKJFHSXJA@AABBA@?>>@@@@?>>>??=CSYZ__QNPLGGIJMKHDCCCBACCDDDDDEEDCEJLKLLLMKLOONNMMMLMMMOOMMMLKKJCBFFCCBBBCCC@@AA@AA@DGEDBBA@@?>=<?>8546:;<;=<<<:935>H]`MEMRVVTSMGKOSRKHGGGGFECBBEKNQH979@GFEDB?>AFIIEEGHFFHFC???=;;;<:;;;;;:::;;97708?@@=@FC=9;::;;<;<>=;99:::;;;:888899::98756535587CH9MbU}V;788655555544555556655544345554222024;Nbo{yx~q]OLKMPTPHA=>;;98;@A@AABCBCDDDDDFEDEFEFFFFEEEDCA@ACEGGGEC@><<;:;:7899<<>>ACDCCCDFEDEBA@ABBBA<88:<@DDA@CGKKGFGGGGIKNPG>;889=>847779::;<:7666547979;848=<=<<<;;;;<<:=@CFD@:668755669<985122332221211222333443333333334:EE=43632549C@754322455678754457789;;;847AA99;=;9:;=??@@<67:9=GJGD?=@BCA@EIMLIIIE=5100556868;955895007=@AB??<8766663H]MKMMduR<6104688656744:<621/./155689::;;<:743233=?>@EC63557;ACC<9:9974-)/2028<@@8668@<505FN?:>>85334420/010/0034102697662/0133147;===>>=<:89?K]]SFNluquy|mD./3/)13&`Ƚ˽˔J>A8469=<2.489<<>>>8203466321/../1247;:8CV^ZVXhƞE>JGD=::7;:;@EIMOQTYUNG:34457;CKKJLL5/47;=;73059.KRSTSSRRRRSSRRTTRQVXWUUTSTUSSSSSSSRRSSUVUUWYYYYZ\[[ZYYZZYWVVUVWVVVUUUUVVVVXWWZZVSQQPPPQRRRPNNOQUZZYYXUSPPQQQSTTTSQQQQQPPQNNKJLOQRUY[[[\^]\][VTVTU_insuvzuhbghdWNOU\ac^VPLOXdlkhhh`UNLLMNNPU]a\Zcouv~~iYVUTWZ]c\QTV]xkXccWWZYTRWZ]`aahr||{sdZZeg]Z``^^^^cgdddn}tot{xy}mquswxrmiggggfedmsw}xqnklrvusrrtxxwwutuvyzz|}simgeilkbZYq{Yp_rgy|jiolbchjgitvps˵|tsfbdb`dfchkbbdf_\irhffeibip^\``_YSRPIBGAGbhbZVSPOOOMNOPRRRRRRQPPQOJG:tDEGCEEEEJK[veiN;FJLONMMMNOSRONMMNMDOwrL?DJNLKKKECHIHGHGHLMOLLSTTUPKGARnvtvxyzc^eUNMNNMNMKLKIHHHHHGFDEGGHIFFFFHKKGAA@CGEEEFDgq\OLOU]ZXrsnPMOOOMNNNNMMMKJKLORRTUVWXVRLIKKKKKJIAAIJFGIJLLKIIGGHGGGHHGHD=>HKJHJOSSQQONMMLLJJKIKLKLKKKLLMMMLKJIHIIIJIGDO]ZUUTRQQPMJHGGGHIIHMSTW[YSJFHHHIIIIJLKJKKJIIJKJIMWPHDBBBAAA@>>@AA@>>?>===AOUWgo\NOOMKJKLPMFBBDCCBCDDDDEEEDDEIKKNNNNMNPPNNNMMLMMMOOONMMLKJDACDCBAABCCBBBA@A@@BDECBBBBA@?>=;=AGJLKIHGGGFEDGRZYVUOC>KOLNKIHFFGFHFBIbm`ND?7568;<>>:89>@@@?@>@A;?8575=KeolbQGEDDGGGMSLJIIJHJOVUMEEOSK9;;=DFDEDB@BDFDCEGGFEGE@?<;<<;;<::;;<;<;:;=:3856>>>@DH=79;:8:;<=<<<;8789::;:99888889:9876668:=A7D[JB?c}{vPG@)83143333234354344444433335553223<=>>?>;:<<>BCCCA=::;>ADDEEFIIHGHHFFFFHFB=>;954444469;;<<;96677799;;<;:67:<<<<<<;;<<==?DDA9566566446568:@>75323212222111133333344333344348EB53//84GfbC67431122445543224567878:769AB=<=@?:659>?HTQC:76;FJECA?BEB?>EMLF?<:73.-00159448;=?@A><;97555654Ifle[޶`FGC74;;53778832;>8432004756::979::;;832238<8+,?J?4310/14IhoW@425658HX^N81459<98;=??;85466:;652/.-,.3GO>/04/--/,-Ty{wphLNH?<72/024324970*1A@8421025:>A?;:62/--/1025:BC@?98=;;=8:KPIGE=:>?;860,,./000/-.11235775447844:>><=>==<<;95:UT@:8>hy[0*122.25(Iķs=-2:68;@D=315:==<71279985057558:99@FB<968@DAIULBA>;514638?BHMJE;/.019;766105,0UUUUSSSRQSUTRRRPPQSTSUVSQSTSSSSSRRRRSSSUUUXYYYZ[[ZY[\]]YVUVUVVVVVUUTUVVVVWWXYYWSQPOOOOOPPPONNOPSUVWVUURPQQQQSTSRQQQQQPNOOMJKJILPUZ]]\^__\ZYTQQOOSYfswvutphgige]POY`df`[Z\_dlmhejaSPNLLMNMMS\b^\dimtufWVWVYY\jjXU\an}xfs|_U_f\OTTTVZ^TNbu|{|ri_]cda__]\[Z[]cimrqwtxz}~rmqurty{xplkjmorkhrywjcfjnssnlqsposutqppqstuw{~{pdapc`hiigch`odUdlm_lldbqvqgk¥|~pricb`bfdV^jbcedfV{ktkjihngnvi\\gbSMNPQNSgvyu{rieQFMQONONMNLNTSQPNKJKKED7oIFGCBBCBDIShxzL;AJKLMMMNKLTWRONMMKUoxjUA>GHIKIKLLJHGFFGIGGQX]_ajnosvtpohoykhkij|eNYYOMOOOMMMKHGHHJKKJJNKGHIHGGGGILKEAEJGEEEEGHc}YHPQSRUTSsvoXSXSRRPOONMNNNLKKLKKLQUVVVWUQNKKJIIHIDCDLHDEGGHJJJHHHFGGGGGGF@@ABA??@?=;==?CDFJIHGGGFFEEMWZTQNFCIIOZVOIEGHHHDFY_PC=??>=@A@@??<9>BCBCCAEGEB?<78677>HWilYB=CFDJPXKKJJJHLNRZWONPRPGEC<=CDEEC?>?=@CFGFFFEF>99:;<;;;:;;;<;<=:;?<4786<>?CDE;78;:99;;==<;9766899999887888898677545655767=@6;GYy}FK[>,60042221222233234433333334442212Kq}gL=:97421368889975567;?@ABCCBABCDGGEDEFEDDEDCCCBCCCEFFFGGFC@>==?@AA?>@ABBCEDEECB@?=:7678:<>?@AA><<;>=<<<;86668:=======848;;;<<<;;;;=>ACA9/1545753344556>EB;4343222212211333333333333443335832;QRNytG3853211112233210024556688:9:?B@>>?B>:88<=BQZVK?95:CEDCBAB@ACGG@7334214569=BFJKOKC@<::9:;====;889::87668/alkQKIB?=;78<:76348<975322333465323469=<3/010.39CSmc8+0.0129GYcaWC776>Zo^;-053353369<=9555558=80-.-.001IX@6;40242*2juCCPH@=93/-2767::2+++-3;==;976762/0/)*5@@964333332232:DC=7>:57>A>:;?>968><5EM:0788SA+.0274346<_ŻW=14:9:=?EE=417:=CD90/.//128956=;3/.08BKD@XnuvmnϹh@DEFB:3159;;;=@<66:=<88;<967??:9>A?;8319A5.--/;=9:;7210/WVVVTSSTSSUUSRRPNNORUUVTQQRSSRRSRSTUUTTUUUVXXYYZYYY[ZYXVSSSTUTTTUUUVVWWWVVVXYZYVTQOOONMMNNOONNOQRRSSTUURPQQRSSQQRQPQPPNNONKLJGINSX[[\_`][YWWUSRQPO\qwrpqoljiimm`ST[^__^\]bhkmnkd\QKNNLLMNMLR\a]]bfkmcURUSUVWdme]emkp{gYgvfUSWUPknJtmiy|c_eggghfffc_`a^e{}uqyzqttuvphkv}{rllrxsdcvvnotwwxskgimkinsspnmoprrssuxuj[TbkdkikklklbwxSR[yw}lֽoc`cmog^X^cgcbic_bdec_hvppnlpezpeljgkbUPRRNWprib_SgmORSNMMKFKUTPLLLJGDBG6bSBDDAAAA>@GNUg~UYDHIGHJLMMLOUSONLL\onWLJBCKKJKKLNNMKKJJIIHHNV[aksx~zZ\[Y]g[ew`LRXQONNMLLKIGHHJMNMNT[OFJJJGDFIJJLGBDGFDCDCEId|iPPYZZXVRRlw]RXXVTSQOMMMMMMMLJJKIGJOSUUTRSPLJIIHIIIC?DD?ACCEIJJIHHHGGGFGGHHCDEFGHKMMMLLKJJJKKJJJJKKKKKKKKLLKIHGFEGKKLKKJJKLLKKLMMLJIIIHIJLOQRTVVYXNIIHHGGGHIIJJKKKIHIIHIKKLTRHC>@BBBA????BBBA@?=<;;>>A?EIJJHGGGFEEJTYQMJGGHGJOUTJFGHECDLWM=;=<;BCBAAAAAA><<;:;=?<:>I_phM@DHHPWOLJJJHIILRUSPPQSHFIE=?CEEEA<:3;DGGEEEC?<8==::;;;:;;<;<<=<<><9579==?D@:=;7::98:<<=<:8777887898788888877666523555453//3.1;YoHLr^63313532112222233233333322222333.3\}tR4.3345678::::644567556;<;>AAAA@@BCDCBCBBCCDCBABBCCDEFFEFGEDB@>=?@AA@?@ABAABCEE>7865311478:;9:<<<;:9:<=>@BDDCCDDDCAAC@=;;;;:99=<>CEC>===;86779=?>>==>:548:;;<<;;::;=@BC>2-44256532333237>@733676201134434433333223334444546A@>>?B@=:8;<=HTVSPMD<=DHFC@AA?;993387766=CCFLMMQRSPD;46;?@>>>=:414899988765Nsl^jfXQMME75:<989988;;987541//22210001248<8554511KhVa|L%./0247;=BHH@986@`gD,.0/.-147765654764239631103663@U@;?:46IK5@CB>;EXmyT?3*0<:00112357:97435:<:8:><88:?=8KB44889:Wb),//57310?ADE>43:;;=3*-0234469::?A=7448;=:;SfozvtȤZ?HJD>833588887<@>:8=@?CEA=>A<2,-/4>A@?@=8432WVUVUSTUSTVUSSSQONNPTVUUTRRSTUUUTUVVVVUUUUUWXXWVVUTSQQRSRRRSSTTTUUUVVXYYYXWWXYYZXTPOONMLKLMMMMOPOOOPSSSSRRSSSSQQRQPPOOPONOOMIFGLQSTTW[][YXVXXTQQRPQ^koqjdloiijkpj\SQUVVVZ__`cjqpqaIKPNNQSSRQT\a``dinmbVONMOVZ_e`aquvjddT\]Muɿwwrwejljloruusrl``vupy|novz{voihjqyxqmsylY[y{vrnkhghjknqqqqsuuttstrtxma`lxaillmnprnfmNWZu|~dɕQDZgoi[UX\gljpfY^_accijxrrpooojdhlppnaWTRP_ustzzkonWVSONMJJPVUOKMPQJEDJ;Sc;@DAAA@?>ADHJOczv`zXDEJIGHIIIKLNKFYl`MCIRJMNJLONNPQQPONMMMKJIIMXhqusTYYYWTc|jQNMRSRNKKJHHHGHJMQOKPQKFEFFFAAGJJNTJBGIFDDCA?Ed{mWM]qof^YUYqhRXYWVSQOOMMMMMMLLMJNPLIKOQRQPQPNJIIIIHPA:>D?>@ADGIJJHIIHGHFGGGECBABCEIKKNOLIIJIIJJKJKKKKKKKKKKKJIHHFDIKKLKMLLLLLMJHJJIIIIIHJLNPQRUUUVSKGFFFFFFGHIIJKKIHHIHHIJJKNUMG=688:;<<;A??=<:7=RbaXQKGGHIJLLOSQICACBBCCBDEGECDEEILLOPOOOQQOMMKIJJKMLLMLKKJJFCBBCDDDDDCCBBBAAAA??ABB??AACA@@@=>>>M_FKMJHGFECDHPSOKHGHHHIHIMKGD?>EMQL?=?@AA@A?@@AAA@?@AA@?>>=;;<<=><>@@?==>COfoZDBDKMSMJIHIJKKKJJJJIKE?CHD<;;:<<<;<<<<<:7:7@@@??FF?FB88:9:9;;<;:87878:889998888887665556376435534566:7.Adh;-244333323322222222132212222235519b~~h@,,4646999::88765466556896568:<<<>===;;=>?ABBAAA@BBCDDEEDDEEDC@>=>@@@@ABBBBBBCCB=2021134578877788996579:<>ABCBCECBB@?@><;:9::99;<>@AA@??=;988:<>@><<==:436:::;;<<<;<>@C?600431674333322445753369;:4014653345544322332443477CsytE+4713477742221026874348878;<:9;?@=<=>><:::<;@MRQSTPGDIJFA@@=99677:;56;=;9:977:;9888778;46PinYRWTYXSG=<:;998=B=;9857B?=940261,9FGABBDJXgou}whd_G10432026::75311124779;===???:8C>7:85=7/j~4)223651*)>E;BZn_+'--7?=>>>@??B@839=;<90/365548?>868:988<@?=>K]hpooïT?IIB<966763114?=88AGC?>;3/6?;,).5:=@CGDAHKGEB=:6;KOA9:;>@7/-/04775643210TUUUTTUUSTVSQPPQQOOPSUUUUTTUUVVWVVVVVWWWVTTUUUTSSPNLKLOQRRRRRSSTTTUVXXYZZZYYYZ[\\ZTQONMLKJKMMNPPOOOOPQQQRQRSSSSRRPOPPPPPOOPQJDFIMOOOQTXYXWWYYURRRRNP[glgcouhejmrsl`XVVZ]^_\^ciorxtXKQQQRSTTRRQXabdgkqneYRKIQVX\[_q}rrzpceh\ԝztmqzrr{xoqnmosusrumbt{zxvwtnmrs|wqttpkktyvuxj\[l|wqmkjihikmoppqrtwyxxxxw{o_p|egommonqvmb\SWYnzt~|nȋRUdmk[RV[`bctkX\\\]^^WrpvvwqsnurekjkoqlaWPP]rruu~|\LOXSNONNNNRVSMLMPQKGDI@Jp=@BB?????B?IPCES]pq[YPQPJDFIGEEGD@QQ?DLOQNQQLOSQNQTSRROMOQOMKHITdpsw{aQSVUWi|QFLMNSSNJHFFFGGHMPRPMF@EF?9>CPWNOVW_aOHKFEDB?9>CB@?=>>;L}vKNQMJHEDAADHMNKGFGFGGGEHKKF;8FPNF><>CLNOG?88=<;:;<=?@@??@>=:;<>=;<<<<<;8;FQLDCBLQQMF<6:::9:;;::87878:89999888898776544.10123354566666863781344445554422000001122332223357868Ww}`:/38843689887433478776659:644456789:86216BCCB@@A?>>=<<;;;<<;<==<<;==><;:9:<>??=<<;;:5/4:;;;;<>>=>>?=83024215643323234434434327>>635553346633322233443588GmxY=242,/46::854331/0477567;8567799;?>;99;<;;;9:79?DDDDBBA@=:;;:88998899516:>EJF=87<8633<649>DIGMQUSHGot>/:>DF=>D@<=B=36677642100///.:HGXmk\B3GNJ__?302687::0+++.5>A;26<8457755:;99::;B:;4386CQE66542MsXMDKUMD?:82--0568;=>;BIOTH53;;;KL9.../333798::6446;@?;8789:5/+'&''*+(,:FG@=DM`qqnh_]k}j<*154.29=;886521123567:?BB@>=;:7:?92==+IwX4<>:63301EbbXpcNi`&"8:;?>86:>>>?=<847<===7267468?A81245668=FHECCVkopjWSE;@>=:865324MTQOOOPPOSVQJIKIGGGDIDC|A<>B@>>>>>?KXVKC@J^o{qevXRXXJFEECB@?==GKKNPRPOQOOQQOQTTRRPNOPPOQKJPZkml{{fUPSR[m`IIHIMOPMIGEEEGGHMUUQKDDCAISTfrbT\W[]HKGECA>ATjfRIK[w~rmkmmmjTZUQQOOQQOQNV[QT]]WZ\YTVQMMNOQQOLKJJIHMccD>EFECBBCBBCEFHJJJIHGGGDCCCDEDDHMJGIIJLNNMLKKJJKJKKKKJJJIIKIDHJJKLMNLIKMMLIGIIIIIJLPTTUUTTTTQGHIHHGGFFEFGHJJJJKJIIIIJJJINTRIB53:7:88EhjepkaKGGB?=J^aTORSQIEEFEEKSTKCBBBBBACDCCBBCFIHINQPOPPPOMJIIKLLMLKLLKJKJFCBABCCDDDCCCBBBCCCBBBCA@GXG:?A?=?B>U}WMRMKIGECBBCLMLIECFHHGFGJMI>4:FIC;9>BFGJC;325=CFB@@@?>=<;:;<=?ABA@@@<:7@DC?F[_QJGGHIFFHIMNLKHECA@AABCJOMJH63436=CGFC?=>;:6>BHPRNIB>?=;<;;;<;;AKOLFCHQRSJEC:9:98:;::997788999998899998877644:7:>D@<9;987665664572335666655332001111112332223579;:3NwyT/-686346676653222478776668::6455546566547;?BBBBAABBBBBBCEEEEEFDCB?>?@???@BDEEDDDB@A@@;;:87689630-/4:BIJF@=737:>@;9>BBAA??????????>>><<<<;;:::9:=?@>=<<<<:9538<<<<>@>=?>:4342221244444431245433341/16?A<75332168303322224678::97GSE7146?H@8:9887668::4.1469840/113688:964579997555532334685568;;98755668<@<<>DIC:64.'(3FNSU@8?;4312;DD=8667789<><>>=<;=AA>ECOku4:JI@98986458;<>=84;71925=:8781+,25:O~k[VODIWPG?5440147:;>?@>=FQTL;57;>EA1*,--/138:86544666726@D;2121/-/99<@L^lgXTaokQ7011.068643320/01100018<=<==:45<@;3;?5=MGDG?842./Owp_hraQXL4?NTVWV@.4?=>CA:4456;<;967646;>8.,28:98:AGHFGCNhuwkyjWZE48<75679:5,/6;=CS`^RE<;>;325;II712/&0TL596/4>9./2.*))()*+,,SSUVTRSSQRSSPNOPONPRTSTTUVUWYYXXXXYZZZ\\YROQQPPPOOONMPRRSSSSRSTTSTUVWXYZ[[\\]]]^^^^ZSPONNNNMMPQQQQRRRRRRRQPQRRQOPQQRPOPOOOQUVRNKJLLMOQPQSVWXXYYWTSTTRPWgqokni^blnlkoqi^YZ]^agjlkjemfQMOSSSTVZ_abdefikllhgj_KES_UZmt{}|}~wpoty}mqyoqw{|yywpvupxxljllkmsyx{rquwvusrtuz|xsk^avvolrtqppsrponljiknoppppnlotutux{s^Wttx~tqonmnrwchT\WU\punx}v{mƉQgbNSSSTYXkiUZZZYZX]_O|d||u{ysnqsprvw|hQL`uxyymSb~d<>EMUROQPQOORQKEFHC@BCEJI@{D<>@@??>@AIROLHGHGGLSnc\TZaXD;AHGEEGKPQPQPSRNPQPQRQQSSSQQPOOOPSOMIMdbaw{bWWYVhyo]MLKIHHMMHHGECFGGIJLPOJJBKTe{~kV^^c՘OOJGECC@G[h`JGMO[efjlln{\WZSPNOQRRQQRXWPTaeaa^]V[VNLMOPPQPNKIIHJ_kR@DHIIHFECA??CFJJJJIHIGEDCCCCC@ELKIJJILNMLKJJJJJJKLKKKKKLM\LDHHIJLOQRNKMMLKIHHHGHJOTTTTTVUWVPHKKIIJKIFGGFHIHHIIIIHHIHHJIGPSIIF=>;8:9;Eps{NNWOKGIVYRORTRKHEDEDGMPMD@@BBBACEDBAABEKLKOQPOOQQPNMLLMOPMJJKKJIIHEBABBCCDEEEDDDCBCCCCCBCB>DcrbKD@=>AEQj~aHTNJHGECBBELKGA<;=DHKKJHHG?88?FD=:>@@@A?9324;@@=<<=<<;;;::;=?ABBA@@>=96>DA=@LZXOMJEGGHHHKKLJHGD>=>BEHOOKF;7:5:@EIB56:;<:878;@FLQPKD>;::<=<:=ELRPECNPOLLONC:9999::::9878899999989999998886Dj`n^QG?@=;876766455333466553444455676631111355689;;;5VW.,5533456665544443356776668:964566654335;?@AABBABBBBCDDCCDDCDEFDCB@??AA@@BBCDEFFFDBBBB@@@@<5786419MUV_ba^YR?6149>??=;::988;?@><;;<=>?<9;<;;=@B?>C@746743312444344333453333310115>C>843328>;544222245:=<98934@=07Om~Z;9666778;@A:118962-,./0026656444665545689>?=>BCCB@<866679;>CFFHG?4052)$,:>@IOH<621258:96555668;=<<==:;<=>8;A:28=5152AU@A@=O@/5FLA63679<8/*04/8BLK448789979?=3,,./1211462135762/.,4DF935;JZYUpyWON;4<=;9845G^bYW[WZY?0.23--11//0/133431/--.04776447:;96leUXZSRXNDMVZ`hdH+/>=@DA6.2504;9566446881-.05:>ADEEGGFDETowkqhP]O922:>;??92/4=A?<=@A?=>=:7304:>>AOY]]VE47>;62045/*,0./7:8996.-//340/120/,)((SSTUTSRRRQQQPOPPPOPRSSSTUUVYZYZZ[[[[\]\]_YOLOPOOOOONOQRRSSRSTUVUUUUVWXXXYZ[\]______]WQPPPOONMOQQPPRTSSRRRROOPPONPRRRQONNOPRTVWUNLNNKKMNOPSVZ]]\[YURRQRTX]_hsuhTQ[]Y`ec^ZYZ]`bccf_WetfNNRSVWXZ\_adfghjllientaJKVROYdmsuxzxtnfjzwefovyx~tklq{rehkjkmoonpss|}}yspqurnorrupccetpirsokiotqnnoplinrqqqponmosutuxs_O_wwwsr{usrqpwtpf]T\WW]kuss}}~kEËXTYVW[YZXijUZZVUVVW\MjuRda^fkjknwxtpyiSbsy}ztqs~yx|hTXd_ZVPNPRSOOPMG@??>@ABGKM=pLCBBCBCBEIKICCEEFGHIDtoQxr\X^fWGEGHHJPQPQRRPUVQTUSSSQQQSRQQRPOOPTRNQ`pnhgzi[Z[YriKONLMMKKMNNMJHGHHHFGKMII@Cl|r~t`\fwLRGGFEFFGZmUFOMNQUW^a[e~dTVWTOOPRRRRRSTQMNYca^acX[ZPMNMNOTUQLJIHIVbVECIKKKJJJGC?@AEJJJJHJHEDCBBBAABEHLLJIJKLJJJJKKKKLLLKLMKWfiHHJJHIIOSNKMLMMJGHHHFGIMSVVWUUX\WOMMLKLNPLFKLGD>ADHHIJGIIIIIJELVQFIHC?=>==?=;;:9::::;<;;=?AABB@?=<<79@CCB?GLRZWEBGHGFGHGFGHGDA??CFGHHDB?>7=DGC8/13489998779@IOUQE=9:===<@IRVO?FTRMLPTOF<9889::::9878899999998999989:;;6]jakMH>>?=<:8665434433334568765788::;;9843336999::;;8@jW58=7258852334455443335676668:85345665434;@AABABBBBCCCCCDDCCCCBDEDCA@@AABBBCCDEFHHIGEDD??BBDB96867GZfheedccbd^WRRZ\[RD?@BCCBAA@????@@??????>><;997:>?:7:;;=?>===<;:=AA@@E>8;=<74312333344443452013311321:EE=43;??BA>84322335779826<:743HWX`J43655668:==<75:7.+,---.01234445444334668:>CFGFFHJIJJGFD<7755678:?BBA@<7671+09=:7>EFD:443688644555679<=<;;;9:<==AC@=56Vk@;FOSOI>12HL:<:99872-1:BA:2KoP47f]15A?846:8787439<8776545657861-*4=6893342269:;;:9?@44?NeeB49D<57/.ATQABOOD;65;>@BBCA70//2<@:4364-),-.398444./553/,/0-1?B==6=qs]MAA7>C@:;;>HU\[UPVT?203;77;:766348==<9421.-.14;C=5799:>B>30362--.)7d|z{kYa_ONTNMPPQX`_VC07=AB;42360.:9124655653220/7DMNKECDDCA@TlnrfJR_D/03@??ADHHC;438:<=;8:Jbi\LDDED?76:6+-6<=;;:9:70,,/42-1:9420,'&TSTTTSRRRRPPPPPPPPPRSSTTTUVWYZ[\\\\]^^^]aaWLLPPPOOONPQRRSSTTTVVVVUUUWXXXYYZ\\]^__`a^[VRRQOOONOPQPPQRRRRRRRQPPQPOOPRRROMOOPQQSUUQNOPMLMMPRRS[a`^^^XQMORPMMRarpkhQGOQRQPQSW[^aa_^^]bkpo_UQORVZZZ\_dgggjklqicrtbPMQMLTaklnsqgb]dvs_aputxvjnv~sgkmiknkb^cm{{|~}zrglskqrowxosvyttxhchsvpkortrmryvrqqpppqtutvvhX]qso|lz~xvvusw}tjrzVV\WY\epuvy{y[KTѓ[`ihngaUet[ZYTTSSSUSOܕ]ellaa_\_^aabpril~yvwg]XNOQHFNLW^E;DJOW\TPOP=cXFFFGGHIKJIIJJIHFFDHIvoCR]t~iXV\b[LDDJQRQRQRSQV\XYXUTQPPQQPQQRTTQQRKMaihnl_ov^ZXXxrTXTONPPOOMMNLJHIIS[\\UFF\xps~egaURRFGGFFGDcrHJUQ\\ZYX[WYb_URRSRPQRSRSSTVXRNIPagcch_Z[TNNLKMRWUOJHIHS\TEBGIKJKLNNLHD?>DIJJGGHECBBBBACCEJMLKJIIJJJKKKLMLKLKKKMKS[VFLLJHHIKTTLMNOMGEHIGHIGIRXYZVVXYVQPPNNNOPOHHNG@7;@EHKNZQNKKJIEGKMAAA?@AAA@?;;AHOJRSSSTRRQQPPPPPOJEEFEFFIKEBEEBBDCCBBA@CNTSQOQRRTTUX[\]]^`c_OGLMGFFDB??>@BCCCCCCCBBDDCBBB@=9=;7531001348CIDA@AAAA@>>>=>>@AAAA@@>;999667<>?>??@AAAA@@>==;99=@BCC@?BOa_OFIDCEFEDDCCEEBA@CCEEEDD@9;DD<766464558::;;;<>ENJ=9>?:;<?==;964433322333336::999::::::;;9889:;;;<<;;6P~Q3774679:853333456544334456667::6346653356;@AAA?ABAACEECA>@AABBABBBAAAAAABBCCDEFGJLKIGFFA?@ABCA;:3:[jedb`__`abdfhd^SD?>>@AAAAA@@????@@????????>=;;:;?@<8:<<=>=;;<<;;?CBBA?>?=;:98533333444443332//11013447>CC96?EEDC@9443344:??>>GF9:426?3.2048976678999:9663/-----...011344323333432369;?BABGGGGGEC;6662158:=>;::89:889AC87;<98==:966786335545689:::9889;?=:877755774111.-,8A0-4115434:==<<;84,0AS^V4,6=?AC<6;NQB@KM<1/1=HB<>DFGC<2//+1>B:1--//,-.024556779;5-(*/4837BHF4>}t]UILmk@>O3;E<69<<=GW^RNSL:356=GPKF?8557@;5332111/*=^aW]XMX]KISIJVXYXZald>08;<65985226610279::732225ANQQPPMJGD@65HZeyiOR`T6256?JJFNXVMGE@76;?ABCHJE;46;;;=9/.NmnovfTTVQMRO9-5;<=@A@AFD70.....1<923550-TTTTTTSRRQQPPPPPOOPRSSSSRRSRSVVWYZ\]^^^]^a`UMORQPQQQRSSRSSTTTTTUTTTTVXWWXYYY[\^``abcb]XTRPPPOPPQQPPQRRRRSRRRSTRQQQQRPONOOOQQQQRQOQRQPNMNQPPX`a`a`]XQQRNLKLTgmnzrTHNPLMPRVZ]``^\\cihhljbZRNPTWYZ\aeegijmrrf]cjcXUSMNX`flpje^V`vnZ`ttmu}ufkv|siojhjich}{yzz{ywrlswqopu|~||zv{ub]huvonqsutrtyzurssrrrsttuukeqzuzmo|ywwus{xrkaWXZWZ]fkox~~mvueON`\]ܗ\deabe[eq_[XRQQQQUWJZXk|}wnfkcWSUWZlry~`rb[\VOLUcTJVogMZkicmzgZRNF]iBFGIKLLKKJJJJIIGFBFGtmBKIQ_oiXVPNSMLSXUMOSQPRNT`WTUTRPPPPQQQRRQQNJJISaVZgfcmaZS\{x`]]]XROOOMLMMKHGMYde\KIIbJtwouaՇMUQGFGFGAIvg@LQ^ga``[[ZTRUURQRSSTTSSSQX_[QMKO]kmjifY]ZROKKNPRVSLIJJPWRGBFHJKKLNNOQNC=@DHGGFFFDBBBCDFIKLMLKJJKKJKKKKKLKLLJJKKLIGGFFGGGFGFT`VNPONKGGGHIIGIPVXYYYWWTRPNNNOPQROIEA<;;=?EKKkqXLMMIEBBAA@@>??@ABBA>@DCDFHJLPPQSSRONNOOLIGFGGFHLIDBCCCDDCBA??DLOMNOOPPQPQPOQUXZ[cg[KIMIEEDB@>=@BBBABBCCAABBAABBAD=;>ECUWpsSOLHGF=;<=96675458867:?C@>???AA>>???@@BEEEDB@=9898644:ACA@AAAAAA@?>=<;98;<@DHIHCAJ_WFGGGGGHIHFDCDEGGECEEDDEA:6==9;;<<<9547::;;;:9DQQOUYSNWYQKLHA<:;:9::877899999::99898899;=CIGB?==<==>=<=:997776443454269::;;;:98::<==;:9;<<<<;<;4XH,17107:97665444445543323334555797433434467:>???==?@BCEFB?=??@A@@@@??>?>==>=??????>>><:778==73333444444332100120134445=@@><@GHB>:5333559UfOKh[46353/2549<;87666789889766662/--,----011223333333335789;;:=ADGIHA746640.16;?=97667:>DC=56=67?<==;85554323445688889879;;<<<<;;;8:9-0>A>40.,*,0239FCBDEEA>9633430-,./6>;5-.4:62,,,-363468:<:8744556655772--.00/.0-2;9668;64=AA;3///16BFB:24569@==@FJC@GE6,./;GC=;CKKB6..1.4=?<5/-.156663211006983//567>;8BFA8GcbA2*(BebBDO27A;58::;>IRRMI>=><6332/*,/,+3875226@J@FZA7HSY_hnpnU3-4424::65741/.17>EA71566@OPMMRVQJD?:4,.7B\lRILNF::DMKECTkneXLE>21:@CBAEGC<<><::9409Wmt|ylfbY^X?0.=I@526>>AID4-40-215520.242TTTTTTTSSRRROOPPPOPQQQQRRQONMMOPRV[]^^_____^VQQQPQRRSSSSTTTUUTTUUTTTUWVVWWWWWY\^``addb]VTRPOOPRRRRRRRSRSSRRTTTTRTTRPPPOONOPPPNPQPQRRRPMLMNPSZ^`baab]VQNNOMN\v|zrZMLSSPRUX[^`^XZ[\adeileYQNONPTW\`cfhikkpseZ[\V\]UTTWamrljdX`t{ifu}x{vfejjiw}rkkhgbhwu{}z{|}yvwtqov|zywzzn`]huuqrrstttsvywtuussttuwwuttx{}iu{wtvutuqqr~QXXXWV[prmy}pp{bQWX\^_Xˎ_Y\]eaaja[VQPOPRTUQW_ce~ul\VVWVX\glvcIJVYV]b[PHPtwOdypl`[nq\aQFIQvDIIJKLLKKKKIIIHGFEGL{mAMLLPV[[UVTNNPPPRPPQQQOTZ`WMSRQQPPPPQQPLLSSRZ\[_``bcca̹jXXjxqg\]ggbWPLIHILJGFIPUZ\RLPvSBo~uvt]mRWNHHFHP?d{EBHLei``a_]SOUWSQRSSUUUUTVVVY\YRLLPY]ghiZ^e\QLMOPRTSOKILNMJFDEIIKLMPPPRQJECA?BFIHGECBCDGJKKJKKLMMNLLKKKKLLJJJJKKKIHGGFDDEEEBFS]XPQNNMJHHIIIIIMSY]]YWVSQMLMOOOQSRKE@>?=<=AFGY{_NMLFDBBAA@@???@AAAA@ABB@??CEGHJOQPNNNOOOOLGFGGHKMKA=@@CEEC@@@BDEGIJKLLKJJJILNPSS[ef[MHKECDB@>=?ACCBBBBBAABBAABDGVSKA?CBAB@DHMG@636<@CLTRHDH@;<>?>>@@?>@AABCEGECA?=;::;;;8759?CAAAAA@???==;9889:;>DIIIB>DHD@ABCDEFHGDCCCEHIFCCCCD@:8:::;=@@@=;:99:;;;<==>A?8GRGB<;@=BSWUVTPUUOMMKD???;9:98788888889988888899:;;;=>=><;;==;;;;;;:;;:86567546689:;;998::;<=>?@?><;;:;93[M).24467776555555555553334556435677543333236:=<<<>?ABBDEEDBAA@BBCDDDDBBBCDCDCDDFGGGHJKJJJIIKIECAAGC2Ccfaba``abcgfVC;::=????AAAABA@>=>;:;<<=>>>>?>>><:=LVTRNE><=;:<<;;<@ADEA@<7;>@;976666677777767896420/-++,./01133344323469;989<;;DKMJ@4466:;5347;>;8559=BGE926;8:@><=9656542112356787787789:;;;;;;:::>@73;@=52354573/MbGFLIB@B<42451,,/2249;43450----/1425?>DCA;;KMB643757;;951/14:=68?>5,++***+/:FIA16@?62:G<7(-/3IVH?FE24>?78==>>?=614:;3++.154576458<6E]B18=CMZhv|c5-30046889:50/.02;FD<:>=;FNLKMSK>?A<;96322LlXFA>??>KXRANkrfZQKE?88?@BA@CECGIB=:;?@>JHOela_ba]QLOQQQSSSTTSSQPUTTZ_ZSNLKMXgk]]idVNOROOTWRLJJMJCABCFHJLMNOOOQURICFNNJHGECCDFJMLKJJKPSQOMLKKKKMMJIKMKIHFDECBABDCGKOVVTRQNMLIFHJIGIIIKQVWUUSQKGGIMMOOPQNKC??>==>@JHbjRHEBBBBAAA@@@?AAAAAABA@BFILJHIHLNNNNOOPQSQIFGGHKORJC?>BADDCCB??@AA@CEFIHIIKKKKJKQZadXHGFDDCA@??BDCBBBBBCCCCBBAGQYYWVIGC?>?=IonCB><5AWaWJBDKOUY]a]Y_WMB;<>>??AAACCEDEFD?=::;<=>?@?><76=CCBBA@==>=;9788989:?CEDCBA??>=<<=>>?ABBCA>@EGCCCBB?;;::;<=?@BA?>;9:;;;<=>==<7AKLME;:;>MXUUVRKJLNMLGEFG<9998898888878988888899999:;;<<;:;<;:99::::;;:977986422478:::::9:;;?>?ABCDBCCCEEEDDCDEEFFDCDEEFGGEHJJJJHIIHHJIJJNOKD>>FH;?Zfba```bca\WG;;?@>?@?@AABBBBAA?>979<<<>>>>?>>==9=KSSTSH@=<;:;::9;A?AE=76;@@@A>633344444544443211100244326<@@>>@@@A@95444560.1314630.1GWH<;87667765667767788999983-,,..-.1234455545679;:758;;AHMOD5364:JPH<4259954:@EG@7579;>><<;:866886445556777777778::::::;:99:<<;>FB62783//24424;>73-/0../0,+17?>75?B<:9412467511///1484/189546==75536;7358865641024=>87@>;=?@A;;CABBCEE?:FOD9=713:<;841.5=9<::<:0,11+)''.?RZS6.99+*0998223489558933:=:8AFC>:53A@16=>DECDB;55CKTP<-5>:9RMA:;?<5@oX*/5014669<;7310/,.;HJGB<=BCDHIOE:;@BAB?553Aj]BBCB@>AJJFY_MJMKGD@>ACAA@@A<>?EJF:'0/9TQ?GOC>:7BR^gY7*/442/,*((UUUUTTTSSRQQRRQRSQRSTVWXZ\\[]`bc_____abba`_``\TRQRTSUTUUVVUVWWXXXWWUUUVUUUVTSRTVY]^`cded^VPONOOQRQRSSRRSSTUTTUTTTUTTSSRRQOPPNMPQPRRRRRRQNLLNOPQSTUWZWPNONNNN[pppx~|aHIRQSYZ]``\VWY]ahntvrkbZVUTUX]^bgiijjkorld\YZTZdbYXhutoffs|mbt~bahecghjlhiu{yojjl}o~~{pp}zz~zyyy}{qhfgchvwsx{yqsv{}vutuwxxwurqstrvxdlsuwwvvvz~sw}]RYWWSQhqn}xuw|~}~cY[[_[YZRVsW`ca]oiWZUSPOSZ[eql^udjlk[m|{xtppvwk]gXKMONNKKLT`]SVXWV\XOJ^x|gY[X]^SL@r~GILKKJJIHGEIO\SDHO?K~cBMKLLJK\XCEKPVRONKJKIFMW^WQTQPRTTTVWXZaelWXfecca^jsedYQ[ooZONPQSZfjaULIHGFFGGFHMPPY]es|zkR݌UXQJJKST?iuHLNGL`jb`bc_TORRQRSSSTSPOLGM_]T\aYQOOPPana\ffXNLOMKOWVNKKKMIDA@CGJLNONNMNTWPIU`[QMJGDDGJMNLKJIKQVSMKJKJKLNLIHEIA<9;?ABCDFEBEUadYPQSOLKJIJNNLORQQRRRTWSMIFDBDHMQPLLIDB?>>==?GJVcLCBBBAA@@AA@@?@@@AAAA@BEJUSSQJNKMMMNNOPQTRLIIHIKNORRLGB?=AEEC@>=>=;>>:Pfjv|D@;:@5:Shd^`_XXWW[\_bdeU><>@@@@AACCDDCC@;879:???AAABC@77ADCCA?;<>=;8666778;<=?@@@@@@A><<<=???AAAA><@CBCCBA@=<;:8=>?>@@?<99;;:><:88>===<>=954344444555533331111/0244127=???>>>:8:74333234432445536>B?<<:86656664666666678789:95/.00000024565555679;<:755:<<9;;:877:;:9;;968766677678::::::::99::9:<@=329Qg_VH8JqULJ@79CA5489522330.16=;81//0022-,16<=8AJJF@82014785231*/2694--*)-2199223227:99;:720/014?C7.26:;=?AA<:=@ABCFHGD@H?10-%2A<873..:C97<:2,)0884204EZ^VOD;<9/))0884342001384116>:9HKD<;4*?^=,46C>9:::66CJD=;<<88?CEA<;666459=>ADAERXZeiR=DC668=FII>17JXXK9;@=4.PyU'.3124447963221.+(/AQM?9<@@??CB>89>@A@966.=_RFJGEB@>AEHKA8=AAA@>?DD@@@@=66:>@AACHG>;:;<_TZ[<:LA,299DI>768@O\gfS?9<;;:7433UUUTTTTSTTSTTTTUUUTUVWXWVW\]\[\^___``acba```_^[XUTTUUUVVWWVXZ[[[ZYXWVVVUUUUTRONORUW[_`bde^ROONNPRSRRSSSTTTUTTUTTUVTUTSRRRQPQOLORQRRRRRRRQOOPOPQQPONNNNNOOOOMY^R[gm|]NRTSVWY\[VUY[^agknqsurg\XXY\^_adghijjjotn_]bX[mrk\S`moidivtoz}mccbddeijlllpy}qjhfo}xisywts|{wnigfjfesxsqssnkyzyxwwxvrpnlkjhlz|jflrxzzywvxqTUYXWQZvwg{ysqqvwt{odxV\]ZZT[b\hc]njY]VPOOT[grqpk^ےejjqcZ_^m{xmhncXUoѨgYxeMOIFECFRRLKKJEKPJJTfogeaXUPLBhWEIIIIHGGGCFWmo\JD3W[CPLLLJLSRNNPSRPPGI^mmv^LZRNQQSUZgmmhh]]nO\c`a\\RjwrdKRP]qlYQPNNNLKPSNJJJJIGHHHKMMMNXoyndZtXVOJGU`S`xZCLLHIT^_`dea[VSSTSSSQSSPPNKMWa`\YURQSRMTc_YfeUQZTVWRQWSLJKMNNIDDGIKNOOMMLMOQRSQPPPLIEFIMNMJIGGIPUPKJJJJJKLKHD@KMOZ_L=CJPOHDLeuvaLNROKKOOLQX\]]]YSST[\UMIHGEBCGLOJFFCC@>>==>=HKF=@BABAAAAAA@@@@@@??@@BHJJKPIGKJJKLLKLMNOQPOMKHIJMKRZ\ZRLCAAA?=;;;<=>ADN>;9;?=>AFU`eg_XVUX\__^_aZ@=>?@AABBBCBBB=868;<@@ABA?@BC>9><966789:<<<<=???@?@>==>>?@@ABBAA?=ABCBBB?>;;:97===<=<:9:;;:<;:89=DKPJDC;9@KXYRH:9FQPOEIND9::88888778878888888888889:::::::::8878878789;;98707765678:;;<;::<===<>CC@;<>>;NyvD+13458555565544555775446554444654456:31@;Od^\^_giZF;9::999:<=====>>>>GRUPMPPI@:;;;;:852159;;==<975443235544443321111/132105=A@A@@>82362012112332243457@@56<>;9865665455666667788::85100012224457655557:>?:756::>;:::887:=;:<==;98888667888888899999999;<=:4309C?<618IRJB935<:7678645762/156:::98776536523=HL@;94/0/.158859B>/07;1+15-00+03..12138=>@>60,/11:E=*%,-2:?AEG?769;>?@::C::4*0?>9@8240,1>=55850).;BA:57MdcO:587890).175112.//09F:0/4<<;<<G;:YR1.21112420./342/-,)3KO?:BJIC=9655787:;8551=VTOTOFA?98@IT^V>489759=@>@B>50118CC@FL>26BH>I}q>FJLcd@%*-(0>8,/;AIT`h_OJJIE@>?=:UUUUTTUTUVVUUUUUUUUUVWVVVWZZYXX]_^`aa`abaaa``_][XWUWVVVWXXXY^a_]\[ZYWVVUUVUSQPNMMNPTVVUVYYTQPPOPRTSSSSUTTUVUUVUUWXUTUTSSSSRRPMNQSRRRRSTSTTSSQQQPQONNNNNOPPOPUSMRVYgrhTNQRQRSSUSSUY^de`\`gnqi]Y[^_`abdfgggijmpqke`Zcz|dWY]hjjz{z{xuqoldbdejmkkjkigny||vidklbc{{wstwb[_elhbmxqgfjkghz|{xuttpjkmjouoopllszzyzzzvxzolsQXYYXUf~nnzpllom||mcW\[VTtüŒTYcYilY_XPNMQYnxpnmcqejgaotkfhigrxspj`Za\goOby^PUMXfbPLNEKTPC>EHNNJS_lp^LJNEZ~aHJFJLLMPPMIPXacTB3bXGPLLKKLNNOQQQPPMO}FM[NHNKQ[jyvfTQQnPR][[\\WYqfU\TTcqaRPOPONMLKMMNUWOKKJJJJJLHIaqg`_`[SLIJYaX{oAGIIIGJRX`fea_XRRSSRPPQQONLKIJXaYSTSQPOMNW[Vck[VwmdfgfeZOKMONOPMJIIKNNNMLKKLPSSPOQROJGHJLMKJHEDFKNJIIIJIIKKIGR|{JFNSUFMtlJHNLJHLPNRZ__]\YTTV[]VOKIKKIIEBEFBBAA@>>??;@CA==CBAAAAAAAA@@A@@?>>?>DLNJCFEHMFEHKJIIIIJKLOONJGHIKMPX_hqiUHCA@AEJMPZab:=CGIKLKLKJHJLMU[RGFFECBBDFEEEDDCCCCCCBCFDTuygYSFDEDC?=;<<::;;:528@KfkcZ[]^_``ad^C9:>@AAAABBBB@:67:=>>ABB@?>@AB<7:=>>>=<<<;9889::<<<<<<>==<<>>?==<<>A@AAACECCCBA@@>=<;><;;7G[[OGL[c\M4B\\N@67BPQROIKG?;;88888778878888888888889:::::98886657877779==;:85;=8899:<==>==;<=>@BBCEFC@BA@c}L1689764455576644555555455555433553446>?BINRNMKGC@@@ABBBAADFBCCCFFIIOOONIFCCDDDDDEJIKKKKJHGGGIKKKNPE843796I`]ZahlcM@????@@??????@@?@AA@@?=<<;979::<<==<==>DNVRMMLMNG?=;:<<::9;@==977899:>FH<224540)1Ob`_]O:5::97435668=A>;:::98<>;<=>>=;::9:879988667878899889:;:985389-+.13:8:;:::9:946:743247837F4'/677:=?HQH73669:9/+7610->_iP:71//.6://6453/0L<..07>>===:986/6bK(6;DD;9AILOQQNIKQMHLXkwlN:>HIFBDH@3>rxedT?;EK@7AB730-/463,*.37741/.,0>DACMOMIE?<<><6225444;Unj[WVOGC>?EIVtuK225411259=>:33439DDBKI7//DR>1bK36/?b\<8B8(0@:/3=DGP\aVPVUJA?>=:7UUTTTUUUVVVVUVVVUUUUUUVWXXWUSW]aaaefddcccccbbb_[YWVWWUUUUWXX[ab`^]\\ZXWWVUVTSTPOMNRSRPNLMRSQPPQPQRSTTSTUUVVWYYXWXYYWWWVUUUVTRQPPRSQRSTVWWXXWUSQPPPPQQONPPOOQQQQSSRSUWTPNPPPPPQQRTV[afbZTSWXVSSW[]^`acefghhjlmool`Y`txmdTYcix~|zwspnlke`ehmojhkmiegfk~vicfddy{yuu~wb\dliagpkdbehgfiszvv}|{pimojktwxpdqot}yzzyvyyiw|YTZXYX]r{en{okknmyuqP]WSx~LY[ioX[XQONUaqvnljkZffiieceghgqztsugW[h^`[Na`HJNHgcPIRWRKEGNRJKMNX^WMKPINxhHOLOQTX[[ZRLMNR]U=jXHNLLKKNOONNOPNPI^yCMINc\QX^ac_WOLZX|aLV^]]_a`br[R[XW[heYRPPRTSRRPPQUYXRNMLKJJKFD[nj`MyS\PJOYXVqwTJMIIIHINT_ggc^WRQQRRQQPQQONNMLKORSTSQMNPPSTQ\ngaxshiox{gRLQVTUZTNOOOPPNLJJJKNRRPOPPOKIIJLLJGECBBDEEFHJJIIIHGDSNCMQR@kpJEJIIGHGHQ[aca^YUQPTYTLIGHHHJLJEDB@@A@@@@?>@INONOLH@HMECFFHHGGFFFGIMOOLHFFEGMTV]sydUPSSWZ[``ZJ<;?CEJKKLKJJJJJJOUWLDCIMFGFEFFDCBCCCCCCDC@\~vXMFGGC?=;<77=?CC<8888609Ufkba_^^^_adaN<>B@AAAABBA@>769=>>?AAA@@ACBA?::=>====;::998::;<;<<<A=<;;<>=???ABGIFCCA@?>=<L[PMFYc?9779877887777888888999::::::998765556665459>=<;;<;:779:;<>>???;;<>BEDCCFFDC@MwzL39:75544356644445544345555666423443445????@@@@A?<<<<<=<;9;<<<==>>?ADGC@DFGIKKIFC@=:74444333222110229CA>@AABAABA6*')+-00234344334332123367998764443446678765431/.//00////123444457;?>:658:;:89CI>2121261)5Sd`WH89<:96434556>D@<:;==>??<;=>>==;;:9:;<;98656789::9778::::96554.,04:8;9:IK:/34542/,.//66KNN[\C/.00/-')03557431368==CF922-0>=58><;;93*Ea@1?>79;76DC55@A9457987>A;:55577650/385,+0589741/0566=HOPJGJPQNQQC2*+07B?Fk|o^^bVKKNQNDRdJ2333552158765667;@CEIC5/*:H=-FmT116+-HQJPT@1;>9?EA@EQ`g_V\_M<=<412UTTTTUUUUVVVWWVVUUUUUVWVWWVTSY`acgihhhhffffdeea]ZWUVWUUTTUVWW[^``^]\\ZXWWWVVTRRPONQRPONMOPRRPQQQQQSSRRRSUWWX[[Z[\\\ZYYYXWWXWUTTRQQQRSSTVXWWVUTRQPPPPPPOPPOOOPPQSTUTRPPRPOOOPPMKPUUW]dhg_VPMMMNQUYZ\]`bcdfhjkllmnngajusoriSRgy{wplknlhgfeioponlllkkmlmtpcghj~|{xv}majkcbeeedfggfehkfbjuwwzqhgjtuv}xr||mw}xzzzvxttkNXWXZ[aq}}|}{kjxxpmnou}npseTYQpտzTTkoWSVRQ[ckpmmkhm\qocijkjihhk{xynYSX]VlmXYYUQRIMv{ePZ_TPSPIQXLILJILRTNNLJznEW]ZWZZ]]YVTROQWYGpTJOLLKLOPOOOONPRG\׌KRYJZ~nTUQINWVTT\YrRR___`aig`RR\WVXW__WRQRTSQPQRQNNV\WOMLIIMLRbl^PE`[XPJ[fS]dF`]UNKIIKTaiid_WSRQRSSQOPSTUTTTPNQRSSQPQPNNPMQcjkqoilrx~s[OTajprfVQRRSRPLJHHKLNNNNOMKJIJJKLJGEBAABCDFHJKIHHFGCCV\seUCDMOHIuPEHIIGFFCJ[ffc`\SMGKPOJGECCBBIQNFCA@A@@@@?>?AAAABAABBAAAAAAAA@@@?BMWRRNLLJJJD?FFGGGGHHIIIKNONLGFDEGLQMWv}f[]]^[diP<:;<>ABHKJJKJLJIJKIIQQCAKUNIGGFEDCBCBBBCCCBAHf|lYNLKDBA>;::@@;858:<=>BGVghgfc][]_beZIADA@AABBCA?=67=@@@ABBBCCCECB@<;??>>@?<::998::;;;<<<<=II@9::=<=;;::;<;<=>DGHFDC@>>==;_RDPq[=;99899::7888788888999::::::998765555653238<<;;;;;8776657<>?>=99;=?@?>:AFIIGHKONKJNG=<97686?Ya^i_F>@BEECDDCBCB@@?>>>@@@?@?<=>>ADA=;:<<<<=>>@BBDECCCCA>>=>BGHFC@=:6543332221233AMFABBCDCDHQI404-1=<754433456544322456788865444556679842.--,,,-//....001333457:>>85579::99?C=53212461-<_iZ@27;985334444=GA<>?CDBB@>=>>=<<::;;=AA<9:977889::9879:9::975444433>HNRE><9777788312100//10-358=:965961010/6>>930/1226889675/464,/@J=,)'*01/-/036883134432;;9789S^==7./6<@HC68GLD=755526:;AGIJOQPJ?9=>EUfjV;=HD?<622/.08GYe^G<>:301344343377/,3777662027;;;DNNHFHHJMLIG=.')0=JKRn{~sbSGHQSVUF=CEA<439>:43311334755;DF?5.-276/3>519=3+ARNON>6:75DRL>Jcoqk`_b\MC>3.0TTTTTTUUUVVWWVVUUUUUVVWVUUVVUY^`dfgghijjihgffgc_\ZWVUUTUUUVVVW[^`_^\\\[YYXVUUSRQOLJKMNMNOOPQQQQQQQRRQSTTTUWXYZZ\^^\\][YYWWWXWTUTPPRQRSRQRQQQRSRPOPPPQQONPPPPQPQRSTUUTPPPOOOQPLIMRSVY[_flj_USQPQRVX[\^adefhijjkorwupsjbgmjmv]jxphglongfefglvxpihkkjkmrppyjbf|{ywus}}~nile_bfffggghigjrtkcdjpmmh_o~zxxom|q|xzzzwvnVQXVXZ]cozzvrppkilnowv_mevv[ZTbǽұaPhoYOTSTfmjkjljhih\_hjjklmlq{~zn[TWZVRrxYSY[SROHnic\VabUPSUPTTKJLIKPSRMMPEz|IV^_\\Z[ZWVXWUURRGwNNOMLLMOPPOOOPRSF`RHVTMUdTFGMRQXYVZ]ZbeU\]^_`ea[LY[VUWOMXZTRSPOOPSRQPPQ_eQLOIJPR`nieYcX[RKWhhYy|EQfcaVOKIIVglie_WSRRRRSRQTVWYYWUUSRRRRQQRQNMMNKTo{thcnxyspdSSct~vaTTUTUQNLIHIKKKMKLLJJIJJKLKJGDCBCCCEHKKHFFFGF>;:=DA>BMQONFz{cJIIFFEDACQegc`[OJFDIKIGDBBA@DMOHDB@A@@@@@@@CAADCCCCBBBBBBAAAAB@ABIPQQKLKJHFCGGHGGGIJJJJIKMMNMIHHHGFIFGio[[][^mW;<><<>ADFJJIIKLJJJKJDCJJCHQUQOJFFEEDCBBBABBCAFMGFWenmh_[]]adVCBCB@@ABCCB@=79?BBBBBBDEEEEBBA=;?@?@CA<::9878999;;;;:;?IMF@;97<:::<:89988<@EGFFA>=<><9:<@EIIIKNMJD?BB<9549::PbebC7=?@@@?@@=>ACEDDA=::;<===@A??@BCCDEBAA>=8//413668887644433222115;CHHEBCEEEDDKK=8736=<86434447777654322334777656656788741/**+**,,......./1111359<><755678899:<;543234561.GdgN4278643223457BA>=?DIJB:>>777547::8789999876555658GRbdG:100134563/36611230-479;7769;:7203688::2-.21257768413551*-2-)-.-,-00-,,6A:31169:56BE723210/3>?946:6.,4;5/.//-----/20*)*++,./6<92./..,).52+,1322357999@A>;OR;9BKLK?9>8-/9AA@<98966=5:[X6.15=DHIE?@A@BDCA>:5315;>BJOLIHEAB?G[c]QLONMKGA8008=?ESUE67;432/11222566658::857867?A<;@FF@?KSJ@>@=<;72236;>K`m}xcI:=HPTRHCBDHF<57=B?764100121/03<>81-/00102339AD;1>LD<;632225CPHQlvtpfWOX]J=80.TSSTTTTTTSSTSTVUUUUWWVVVUVVVVWZ_badfijikliggfgfda^[YWUUTVUUVVWY]^_^^]\ZZYYXVUVUSQOLLOOLKKMOQQRSRRQRRQRTVUSUWVWYZ[]]]^\ZYXXYYWUWWTRSTSSQMLKLOPPPPPQPQQPONOPPPPPQRRQQQQPNOOOPQQOMLNOQPQU[cd]URTVTTVXYZ\_abcfhijkpspruvrrrj`Zpxjrpotxyoccdcafr~yeahjjjmnil}w`k{wvuqqx}ky~jkgbfhhhhijkmljsn_^``jmdk~}||qjuri|zzyxwlubRWWVWXYdsvvqmkgdefilpyhknjieWVhrĹwSal^PTUWcmiluohigi_nbgiklnoqtx|p^Z\[\[WacYWY^VQOiuY]__]WQPRQNPQOMMORQMLNP>mNRUZ^\Z[[YYZZWUSTExKRONMMNOOPQQSTURK\CQOKKHV\JIOTUTTT[`[RotYX[Z[^[S]qGZYXVWUKSYSTWXWSQSSSUVORaaXOKKQaa]\vRWKQuyij~`@TZab\ULGHWjmjf^VRRRSUVVY[YYZXVVUSSTTTSSRPOPQMMZjtulegrthccXRaqvzvdXUVY\VOLKIHHHJJIIJJJJKKLLMMLIGDBBBCGJJGEDCDFECAA???BUXQMTî}w^MJGEEDA@BXca]SGDDDIKIGEDCCCDJNIECBAA@@@@@ABAACCCCCBABAABAAAA@AAAHNNKIMIHHGFLIIIIIIIIIHHKMMMKHIMMLIDC@M|`WZZbgG8A=>>?DFILKKJKLJJJKJD?@IFEFPRQLIFEEDBBAA@@@@?=Lz}~S25Qo>9<937==<??BBA<::98899989::9::6ARWQMKC9689987777:9;AFIJE>=<<<:8=HC;;:999:;<<<<<;:997::9999888987555555775545554434433444434511:CCB@?@@?ACCCCCBCDCCDEFGGGC=;<==?A@@AABBCBBA?==AFHKJGB?A:=HG>44;<8FecD6686AMBEGEDDEEED@=>???@?AA?@CEEEED@;:<=<<=<::;=@B@>=<<>?@A@@ABDDB@><;95790+./0112433332222/0:BHJHFCCDDC@<;=9656656654333567999874300/13688999888884/-/-,*++,--././../1011126<>;9865777888:9643346554.2Nh]9/56533211352264.-/132,..,0340,+--,0451-./-*,;ME104>?=88DB5;@HH>8>B?:3/13..=A6/-//.,,..021-+++-..-262112000,,5972.**-168;?;9:=AMD6;Pl\E8122,+2?B=5785:<673B`D/8?CEIIGEB<58;;@DBB>725;CLOIEHMRNAKbbbomVTcga[UHES^QNSJ@=BC?:1,.,-/-1878;;:976899@HE;:AB=4:Q]QINNIE@?>=9543;HSqa62>MTRNE:;AB<778:>A@=<:5100/,.4763/--/0122356:==<;==4.-...00-0@QZjtqg_N=LcUEA4-UTSSSTTRRRQQRSTUVVWWXXXWWWVVVWXZ`fiilmjhkkijigggfc_]ZWVVVVVWWWY[\]^]\[ZZYYYXVVWUSSRQRQMKJJNPQSTRRQPRQPRRQRSUUUWY[]__^][[[[\_\XYYXVUVVURNJJKNONNOQPPQPQQPPPPQQQQRQPPOOOONNOOQQQPOOOPOPRTUSOLMRVWWVXXXYZYXY]adhjimmotqnuvmltnntr|~~wjabcbcbbq{ggljilkknmynwzxvqommzinzyyvtruxzhjidgikkklkkklgdhprh[Xcry{}~}_N_{}}{xvunwQTWWWVU\jmkopnjfeefgigefnjctym`PmaOȸRYk_LSV[`ffkuehfgf`upjhiklnomlvvecha[]^]XVXXWUUMc~_`b`\TPONKJZ_RNPRRSROLNHtRS][ZZ]^_^]\YURRTC}HTPONMNNPQQUXXXQVjDQVOIKISZLHSWXVVXY]ZOZ}]UXVV\[F_eMa_\TSWQPWUWbfb^ZWUVWUUMRhePKPO]pbVdTNKb}qa~IISJVb_]QGHXjmjf\TSSRTVWY]^\\[ZYXWUUVVTTTRPPQQPQ^lcfstpppe\`^U]nqmje]XZ^`]TNLKHFGIIJHIKKLLLLNPQRPNIFDBCFJIGED@ABENULHIDAZ^VSVs~}iRKGEDB@@>?@BDGKOPPLJJJIJJJJFA;@DDCCEHIIFEDCBA@?@??>>=A`}ztF:]m*7;88;??@EOUSNJHB;;Nmud_]ceR@ADCB@AABDDA=:=ABBCCBBBA@BC?<<@@===>>>?>;;;889999::999989EVW[cb\PB8<=?DFJJ?9=AGIF><;<<;97BIA:9;:99;;;;::::9:FXM:Jdy]\~ntwiKFB<::::89999889::;;9:=:878887655566536888877665569::>AB@@?>====9534438?AHA768999:9999:98666655766567875532233332445535>AA@??@ABCEDCBCDEFFFGHHIJF><>>><<@@??@BDCA@>>@@@ACEA;=BH@>:LiU21441>TMECDCDEFGD>=>>>??ABBABDFFEEED@=<=><<><<<==>>=>??BCCB@@@ADEA<;<;:8;=;3/2244322222222206HJ@AFEDDDB?;866664444444555555677777543212235669:966540)&)/1++-//.12111012100//058;;:85677788887654455442-8V[;-56333221341.3:AEEEDEECA?BDJMKKFDGHIDCKICIaylD38:78999988879=D<>JPXU?6520012205DJ>2/158542100/-.18<::7449?FIHGB3+/5;6/+,0010/-,,.0//14/+*,++177,,7@928B;12G]ZP@=D?411/-*+4>95520/-+)')26461,.14.)*.4?=/*+)(/:?:3.+(*29<@C=1-478439HWC-.-&(*(-6:64<43@?7:64L^;6A@>BA@>;9::4248>DE?;=CGGDFJLPVPCIR[w_U_ddfhdZWTDGQMSUSPTWOID:51136437:7434446<><;;<:932I\XbjVIGA=<=>=97:66^]24AKQSNHB?:23:978<@BC@=<9:97227974341/03653775429BC;51.-,././-/E\hgZPRMBVxt^K70UTSTSTTTVWWWXWVWXXYYYZYXWWWVVVVYckjjkkgehklkjghihfc`]ZYXWWWWYYYYYZ\[ZZZZZZYYXWWUSSSQQQOLJJLMOQRRRRPPOOOMMNOQSSTW[_ab_]]]]]`ec`^YWYYXYXWTQOLLMNNNPPOOQSSUUUVWWSPQQQPPPOPONNOPQOOPPQSTSSRSSOLMQUVVVWVVX[\[[\aehihlppssjchffgpuv{zxm`^`abfe`b{xajlhnqpqmp~~{yxomkqnszuorwwxxtquncjiagjlnlkjlkd`ba`bbep|~ydU\kwz|zxxvvdUUUVVUReuiemoonkhfefhhe]\cm{iefvxT[dPföTWk`MSTY^`_hzlfhfege_hhhiiijheftsgmnd`aa`[WYYUQSJhe_eaYRPNNESndTQRRTWTNIKV{[O\[[]acb_\YUTQSSEFUPOOOOPPRUWXXYOVpLZZRJIKJKRSQVYXPTZWWXTO}dWXXW]aHh]Sa\XQPRRPUVYjmfee`XWYVWPLZc\PNNWlogp_XGXvq]OCO_wmZ_hYJIUgkheZTRSTUWXXZZ\\ZZXXXWWVTTSSRQPPOSRMcvjfstsnf_bd\[hngca]\^cb]XRMLKHGGILKJKLMNMMOQQRSSQOIBEKKJIGDFEA=MYPIJHIRXVWXQUbcgn{bQKGECB@?@AOZN>CDBFLLKJIHFDCDEJMJDCCBCA@A@BA@B@BCCBA@>AABCCBBEA<::>??@@GLKIGGIIIHHGGFGGIJKMMLKKLLIBEHGC@Qxz\TXP@?AABEFHMPSVUNKJJKJJJHE@;9>?>>>?M\^k̾4.B<;=?ACGRYWQMJGD>:8\ype^bgS>AECAAAABEFA:;ACCDDCBBB>==<;;>A<:<=<;:=><::889:9:<<::99::CFA=<;::98=GHA?=99::;;;::::9:<>DXf~rqUMG;999:::998889::<>:?;:877865456665558876667877:;>==BCB@>>=>>?9424568;>FE:689999988887667877666667766753225543344557;AAA@@@ACFIGJDBDFJKLNOQUWOB;:;<>>>>@=>?ADEA=<>@A?<:7?EFKJ<6>FGA?BA?SaWQ?7579K_\OKKJGGHD==?@ABBBDFFEFFEEDB?=?<;><;;<<>?@@@ABCCA@@?@BC?;:;;:;?BC6/344542022223234CCCDFFFB?AEJIEBBCDEDBHLE=?PNJ=79:99999888899=A939DGB;:50./2222CG8/../488865544215;57EJHIIIRYE02;C;=KLG>52//---,***+,/.(,.,+251484.8RI*,MljT;497/,01/)*9B=8751-*+.1*,99=;/-/0/*(.=F<,,312411354,*04;@BC>0+,/223:;3)'*)'*/1,-111419C?:::16VU9>B<998556==3/457:??>=AFA::HRQUQE:Fa{xZSV[_cheWC:Uhb^ZTMZpse[TJ;355//=?5011//2424972/11*2Lf}fC<=;;;<@C=543.GiJ.7;AGQXM:0-17868>BCEC?BDEE?:6347:<<74556546777?=:?A@:4.+,,,./,0HYQ@AMKE[|iD20SSSTUTUWXY[ZZZZZZ[[ZZZZXXXWVWXV[bb^`ba`acgijjijkjhea^\[ZYWXXYYYZYZZZZZZZZZXXYXWXUSRPPPNKIIJKMNPQRRQPOPOMLLLMPSSSY_cd`_a__adhhhibWUXZ[\\\\ZUPONNNOQRSTUWY[[[\][ROQRQPQPQQPPOOOONOPQRRRTVVVTSRRSTUWVVX\`cfghjkkmnoqqrsthWPUn~yuy}{uttkb``bdfhf`decihrrjo{~~|{zyqevox}yurrvsxtnlchgbiijmjjklmga`dg_b|{utyztxusrnnqtwxx}yz_VTSXVTSp~pmopomkheehihe`baY]bgcjmuv]xf\WXVgeUXUV\_`fhcgkgeghjc_cghijnos~ueejjffe`[Y[XSPOPPWyjY_c^URQJPr|cVRQQSSMIGKPbjHLS][\][YXUVXXWWV|CUPPPQRSTWZWUXUD~ETYXPIHIGISVSU\YTSTTSTSO`v_[[]`eXwWS\USSSQOQTTYbeehhb]``YTRRPYdWLO[iiXOFewZpjJ[MjtSO^cUIOdmhdZSUY[ZYYYYY[[ZZXXXWWVUTSSRRRQQQSNH`dVcklgcehf`dgd_\[^djf_XTPLRWOFHJPQMNPPNLMOQQRRRPKGKNIHHGDKKHEINPLKLMRMMOUZ_\[[\toaQIFEECBAADJJE>BA>EMKJJHHFCBCCDJPKFBBB@@AABA;B>BCDABEB@BDDDCBEB;;:<@?BFJGFIHIIIIHIHHGGGHJLMMLLKKJHGCHLKHDWh_YQB?BBCEFINRUVXWTOJJIJJJIFB@<8:8;>ACEEDCA@>===>>>>>>I=;z,BE?@BBEFIRXUPMKGC@>@Bqi\ceR@ADBAABABCCA;=CDDEDBA??=;969@A@78<=<;:<<::9:::<;<=?>>????>=GRdmhZSVXQQWTMB=;:98=EFA>768:98?IKD;9:;:;;:::::9:;<6Dq|iOC>JQM>COHfiuwPFcomc[HB>::::9:9898:=A@<9=@?<998765456775666655779::;::77;BCB@=<;;<:74357889>??>>?ACEA=;<>><:97:BKKE=6579?=>@AAABDEDDFFFEGEB?><;<<:9:==;989;?FK?2224443222223337?GM?3=CEJGD=976666654342344444446666753568876546;<;:;=?CGKLKC?@C@:76799::9665431/.014545557767:<:9875443322.0CF2/4432221221026;=?BBEGFA>@DHHB??CEHICEC<;73246::9999888877789;7.-776662/.13449>1&+/++29<<9655422699:73>UTJCDIYk_=/793AjjK>;841/-+(-3-.789;918;B?72352,/:FL>7:7751/00-,0;@>?FJKE3*,-,/14;<;=BH@/*)*1548<5230-,2=?1,0/.+1AC=68:5-;^O@LF:;7225:AB;67668::8?HB<2:11220/2216:8331.*%5bkG8<<98::33;63`e319?GZ^A,.0-29;=@BDDC@CFDA>=956:@A>?@A;548=BHKG:28?@:5.)*+,.0/+8KE8?IFDPZ]O4,-SRRUWUUWVVXXZ[ZY[]\ZZZZZZYXWYZYYYWWXYZ\\[_fkkllkllje_[[[ZYXZZZZZZZZZ[\\[ZZZYYYXXXUSQQOMKIHIKKLOPQRRRQPPOMNMLNQRRUZ_aaabbcdgjmnqpfXTXXXY\__[XVSPONPSWZ[ZZ[][[^b^TONPQRQQRRQPPQPNNOOONPSUUUVWVSRSUWX\_`_ahkjjknooonpqpvueXR\spaipkciliihca]m{cahqocew}|xywopڸzzopmklfhhhkhhihiic`hkdbcbq|y{tllpsqprx~|xsveSQNQZWSiy}tqtsqpnmjjmqnfadf`d`Mcblmjh^Vv~STbfZ]]\\__Z]bjuojlno_X^ekov}gU[eheed]YXWTRPNROAYpUXeeYQTGfhSMPQQQRRJLLL~qL[ZXTTRRRRTUXSK^puCSRRQSTVXYWVVWKaILUWTIFIJJJMTTU_aWQROORUZYfn_^accZ~RV[UUXYWRPQRV]egbemprogdaUNS_ZNJISgwcTKMS_wK]`S^h]OFTe`LI]ljaWX_aa^\[[ZYYYXXXXWWWVVTRQRRSSRQOMROkfSbjjfglpld`\Z[]agmf^YTRMS^YMIGO[UPONLJKMMNMMLKJLLHEDFFFHLNNNNMMNQSaXjUSQS[\ZZ]\`OCCBEFCBBBBA<6?CAFLJHFFEDCBBBAEMRIBA@@?@AA@A>=ABCCIONDCEEDB@=M[SQA9?DKHFIJJJIIIIIHHGGGGHKLNNMLKJHA7>NWQFDR_dUAACCEIHNVWYXXXZVPJGIJJKJGEB<;:;;>?>?CCB@><<=>??>>AC8D8ECBDEFIJLLLKKKJGC@=<;D}wbZ]NACECAAB@AA@=;?CDDDDB?=<<;97;DC;9:====;;::9::<<>>>?@BCDEECB?APgriYUWY[[VHB>=><<;;CGD@;9:;;77CJB98::999989999::;:8IoaHA?EIF>AJ=PdkW?3ShggcRIA=;::999898;EI:15<>@;9985554577766664457789886627>AA@?<:9886555676788A<444666766655445556665566778645654464556557AFEDCCDBCDFJIFBBDLOQQSQURH71020359<>?@BBB@?>;9998::98::>KJ@835:>=;=?;9Smk^XVTPOZbeghfd]ZXO?=>?@BAAABCBBEFEFGFFC><<<;:;;=@BBBCDBBB@@@???==?>:89PbSAGBKfZ5-5EC2073**4B=753330.H^PTN?=:38<=BTZ9453227=FIFC:8GOVP0IqvyaLOUWYY`aTXd_[XQR]keVnjV_>-457302333101118?><@9/28;HC9>AGI=3147776;7)DlM6INO\S4(/23;DD?<>?ACGDBJG<8538@EFE;67:::72/++-/020+3EA:CKMOK?870++RRSVWVVUUUWX\^][\^^\\\\\\[ZZZ\[XVWYXXZ[ZVZdllkmooookf^YYZYYZ[[[[Z[[Z[]]\\\\ZZ[ZXWVUTQPOMKIHJJJMPRTTSRPPONNNLMPQRSTW\`bceffilnppqup\RQPQSWWWWWWVUVWZaggd_Z\]\^cd`XPORRRPQRPPQRPNNMMMMNPRSSUVVTTSTVZ`a[W\ehghknkjkloqqstusc]lz~zy|dgrggvxnfccebhhahmogbj|~|qӖҥ|xuoffggjkhggdaba^hrrkdj~{xzrjgnvwy||~iqo\m|^Udntyzouzxyz{zxy|}rhjmfRa`rmouhyh_^eMTae]aa`^^_ahuw|yqjge`[alpwnUSZ_a`a`[YVTRPONRUJQtVSah[PNLfpQMRPPWcgYQQBwvOd^VTTRROOQPQKSdftFQRSSUVWZXUVVULQGSQRSKIPRRSRXjlhoha_ZZ^a`[U[{}a]```XtqOVXW[]^^]ZUTUVafenulknmjljgaUSPHMkmc\]bcafOXQNKNSdd^caSLUa^XU_gcb`_^][ZZYXWXXVVVXWTRRSSTTSSRM]p[bjlkmrtnaWY_badhc]WRQKNSWXPHGYWMKJKKJJJIIIIJKKHFDDEGGGJLNLOPLOOS\b|j\VXYUTTV^PA>@EHDAA@=CHKSVYVNIEDDBBBBAABDDKHCB@@@@@??EKHGHIJJIIIIHHHGGGFGJLNOMLKIF;6;::;;:=BCB@=89:;==>@@2_6=FCEGGILLIHHIJJJHCA??B>Gle]UEAEECCBA@@@?;;@@AABBBA?>=<<=AD@:;;>>>>==><9:=?@@@AABBDFGGEEC@Mm~q_X]cffJ?A@??>>?>?CBAA@=;:96;?B>:;;;::989789::;;8/F}OB9::;=<>D76IZG<5:Xbe[TPG?=;9998898:?BJYinU89876544567766544323554664348>@@><:99866456666566584233655556766444455664566566544443465445558?DEDCCDCCDIJFCABDGJKKNHLF:;=8;7777=::>?:Jfla^a``_][^abddb`_T?<>>@AA?@AABDFDDEFEFFA==<;::;>@BBBBA?=>?>>==??=@B?99=?BG@32235323322149@DB@<8:>@?DD@:8888886679=D=8654444334568==>>???BEJOQQMKIGEGRTLFEGGA;:97765789;:89<93//1/.36688889==;9875332134.,7;3155322112222479=@@CB>>?@ACB?;9<=:789777889876699999988899:::?:-/00.,./1479:81//./359>BA71.017628;854>T`b_\_ciqW.,-..-2:732215F^myKPZ\piL>:9:8995>H=7,@_^MRF25AFJNKB@CFPB,/49;=>;956>>2-6C?/0;8++7;324/-./,2L[PHB=@AEGC:GYB661/17>A@A@A<9AK81|VVpwbPNKIJJHCBNYUMIIQZenaKqcaL/110024310000017@C?=96BRSDBHD@HRQB2+/58632**UcCMQLNA1-.0:EHC;68@ECDFDA>;DGT[^\K:785.,RSTUVVUSTVY\^_`bbaa_^^^^^][\\\\ZXYYZYYZXUZcffhlqrqqpmg^XYYYZ[[[[[[[Z[]]\\\\ZZZ[ZXVVVSQONMKKIIJMORUUTSQPPNMNNNPOPQQSW\bccdeffdbacgeYPPNNNNNNNPRSTUV[chjmi`YZ`cdcbb^UOPRPONNNNOPNMLKKKMOPQQRUVTTTSUXZYWX^b^^fopmknppqqonvzpjnrsvxyvg`kyvf`hpib~sdiklkffqyzsszx}xПڰz}|uebddfijiieagsx{|ryvmdhms}s`Ŷsjeglw{}yyv}uqkant_m|{lly~xk]ebacRPTij^dcba`_j{zi][\^^alo{z\W^\[\__\YWURPOPQUWOLwsWS[b\QLXdqX]YNNZdhg^YExMUWUVVUSQOOPRXg]MfFVUVVWXXWVTTVTXgZMSSMMSQQSTTSNUgnmvwqpprme^Y[Vbg]]\\WoiNVWY`eaadda`\SUev|vofgoruyxm^YTWzrtxqt~qrqa\PPDHURhj`^^WOORNR]egdbaa``^[YYYWXXVVWXWUSSSTTSPTURW~rxyb_ehiglqk^\efb___]WPLWQLLXTLGNRNLLMMJKKJJJJJIHGFFFFGFGHHIOYYLFCEMWp}cYWVUXY\XOHFFDCDDDGUdpyyvjUJGGFDCBBBABCABDCB@@@@A=BTf}LGCCSSMGECDFGFB>C?KQUEEIIHIHHHHIHIHHHGGGGHHKMMKKIID>=BELRPLGQXL@@AACGLSXZVQNMPV\ZRLJHOTQNJEA?>><;;=>?>>=?@BBBA?>>?CB=>>=@@???BD@89@C@?@AABBBDFGEEEDGe}d]_`bQ>>@????>@@>@BAAA=;<==:7=A>=>;::99868:;;;;;:8OfH537:;;<>809CE?:1CQRMQUKB>=:8889::8=Tsg7889754456776653221133468879>@><<:8876643466554554333334556678854434676567655553444334456446:@BBDDA@ACCFJHDDEEDEFHFHJTQ>@EBB???=@FHDBA=776668:<==<:8:88CJ@9:>@@<;?@;Jhpc^ccb`_]]_cgiicXMBA>=<<=>?ACDEGEDDDCDGF@==;889<>@@?@>;9;==<<=?A??AA<==;;:73279743222104:BBBB>9:=?OX=57999889887:>=65455543333326;@BEDDCEGILNMJHFHDM^d[SMG=54899:::988:9::;;731/--16777757;<<:975543222102531344222232125;@ACCBA?>>>>@@;668789;;9778899::9:==<;:98789884;D33011344356766651-/58<;977108>@>86AXcje_`it]41026:;<9521/9_kQiu\VZO>3786678>?;E`lWD:887879;:<97=?<80)'5MUC38?JH2,2499.)-/.460*/@KX\REJXVNKKFEB?NA.45:>AB>;9;@>238?9/09:5;@5.,-,,,,.*4VL<=AHNLI@12AE:5227<>=<@>@@;<8,[h]nxXECBA>8>RYOD>?CBEfyJ8oq_\;.0012110.100249B@4.2;LXRGGONECHPQH9/18951/&9i_;AND2.0118>>:66?ECDIG@:<<;<@DHHIB32@B5/571/38944652//7<<855649GNYhjdWE954531SSRSUUSSUWZ^_aceeccbbcba`]\\]^]ZXXXYXXYWW[^[[bgklmnnole]YYZZ[[\]]\\\]]]]\\\ZZ[[[ZWVWVSPONNLKKKMOQTTPOOPQQNNONOOOOPRSV]bbcc_[TOOQMJNQQPPOONKKLMNMMOPT]jlkfYU^a`b_\_^VOQTSPOOOOPNLKKJJLNPPPRTUTSTTUVUVY^`ZVYbjmnopqqqqporsstnjnlnno}ub`jzp`gqi^k|djlkkfgjfdnoirys|Ġؘ}g\_bbcgjjlifr{mp}zpvy~wgmx}zehuhcfgrulluxqbed``eSvVSvo\ccedceo~xgcb^]Z\lz|]Z_]\[^]YVTRPOPRTQO[geuTTX]\QRaex~_V]XRY\Y^kliTxSPVRSUTRQQQUXYWML]H\ZYXWXXVTTTTVQFOWRRTSRSRRSSRWe]S\gjhnu{qefdjaQj_[\X_iMTUab]Z[[]_[VQWgqocbiqvvvutroka[[ftvvxsonjgcWOSUSUUVXYTONNOWeiedcccbb`][ZZXWWUUSQPPRRTTRRMQUSRZ^Z_odU\`][affbcfda^[]XQW}xULSROMEKMOPPOLLMMLLKJHIIHHHGFFFFFFNTTF??EKP\zwg[VUWX\\]^]RD@DDER]jw{ucJHLLIHFEDCCBBB@ABAA@@@@A>MNHGGGHHHHHGHGHHHGHHIHFJMLKJGEBACCGMTRSOHGJIB??>@=>=><<<==@CLOMLHN\[VPKFDCB?==>@BAABDFFGHHHDk2=ADHKLKKIIJJIIIHIGDBAAB<3BakJBBFFBBBA??@?<=>>=;=?@BBB@>>>@?=>@??@??AEE?8==>=>=>>>>@?@?=?CEEC>??>@?=;<=>;68;;:::;>;:WtfK<037::=>>=>9?><769:=LRMEBA<8889::8JwL8889754566776432111137:9:;:9<=<:97655543334445455441223345567875444656666777675445533345765:@CCBDEDBBEGGGGFIKHGGFGDJS\]NBAABAACEHJD<;;7556679==??=<:985:FE?>CBA?=@?9Njof]^dfcda__djkl_SWRMJHDA>>?ACEFHGDDBACFJD><989:;=>==>>:8:<<;;=?@>>>??@>:74321>A887222104AHB?B@8:=GaX878899899888:9753455533333337=CEGGDBEIJKLMJGFFIchhge_QC=<;CILMMLG@859=:99850-,067775579;;;:85543211122111244222232128BFECECB?=<=>??:65788:<;9778::8657=D9-37:;87;F_lR>9412799755544453/-.39>BDEHKOPNHGKMSUOKEDT_`jb^lqV/-/27;;9:;:507]~f[ajcTMOLE=5468CEK@2Oq]:3EHLOKED@83.0?G?9/)%*8;38A<=@835136.(,+*.131/+9PQS\\WPKB@?@?8D;+253:DD=4/0:>;3.6?:2258=FLGC=>ABD8DlWdnUDCB<:::FWOB@=977-:h_4F[WcU5,//1/./332256:?8**7?COP\MU`[OB@BEGGIIHECCCDCCGIKGGGGHHHHGGGGGGGHGFDDIMKJJGDAABCGMNQTSRVQF@?=::==>>=;;<;::@BA@@JNKKLLHg@9?=FJKKKJJJJIHIIHHFCBA@@>:9HcP;CSFCA@>=;;=<===<;<=@ABB@>?@@???AA?AAACFE?>?>;@B@@BAFD;<=<;868:<;2DSXK>7048=A@AJ@;789;649LNIEEC>:::::98Wa<5988775457667654211138=@<99869:76654333333344445541..022333455654344555556667765324533346775?AABBBEGGGGIHIJKNNLOMJJKNQSWVLC?A?@DIKB86885544568<>??=<:9867>BBFFB@?>@=9Plmf\\dfdcb_Z`gkkSBPRQW\ZQGCCCCDDGGFECCDFCA@>:89;;<====<:::<<:;=??>>>???>>;6333686653110-7C@?=>A<;999:;;:9989744344432233358ADDDFHDB=6@bldba`]WUZ^^aba``_WE65::88861.,0467AH:4879998665421112111222222222224=EGEDDC@=<==?@=9659==>><;;<>><4+..6IUSB7:=<98/*&',*1IJ>;:721-+13.,591001106AX]``UGB@:0/626:.-118CE<1+/;=@BC<43-4@A@EGGC>5-,/396AP878=;8678CMC:<<8593+N[C<@JWaJ/+/0/-1541/.19@=7>CAGME@CELTLB=8:?@?<427EH?79>?9,3LK734430,+3?C>728HQKHGD@@DB95:81/,*,RRQQRSTTUWZXY^```bcccdgjic_\]`a^ZXWVUUUVVTUTSSTUWWYZ[[WUVYZXVVXYY\\[\]]]\\\ZZYYZZYYWUUSQONMLLLLMOOMKHHMRQPOONMMMNPSSPXekmoiWORONOLLPPPPONLJJLLMOOOPPPRUY]ilb]WTY^`bfe^ZZZXWUTUURPPONNMLOQPPPRSTVYZYXVVWYYX\gmnpqrrrrsuwwuv{sfogM]oaVd~}}b_gibemknunhjjlkjjjhffdfhflȴ~p}vq{q^^cghfhiinn~yrssqwzƅx}~~˿prx|~dN|uz_hegfw}rmlvwibx}^d^bgedf\ìkJ_h^\c\]svv|w}q\[^^\\YTSROPRPMNTsvrbWaigZR]ege``]TQZ`c_Y[a[SYhGSOQQSUTRRTUSSU]Z]_\\YXXWUTUSSTUSSTUVWUTRSQOKS_gbT]i]QUYYOMU^kbxqkr[XZNz\KUbeYVVQNKPLjqIP\luqkigfcbadfghfczlttx|yvwxz~|sng\UVUXXSRSTVXYX[__````]Z[[YZZYUPYbgljfaZWTSUUSQOLOd}|cbxpa^_daZXWW^dc`ZXRPxziZPLQXQN[cVKKNNLMLJHGIJJJJGDGEHIJJJHFMXbau`{zqxnLEKOSXY]\^b`TJJWov_NLJBBEEECEGGFFDDHGCC??@B@>;>FUQFSUYUO>=ADGKKJFBAACDCBFIGGGGHHHGGEEDEEEECBAAINKJJF?BDEDCGVXVXY\M>====???A@????==>==AKNMMLJJIIHHIIJIDBBA?>??@DVNFRPD?===<::;;>=<<;<=@BBCB@@@@BBBCCCBCDDEECCDCCBBBBBBBBBCDCCCDFCM]c]K>==<;;<<==<<<<;<<=<ABAAAAA=:?EEB86;:==;@V_USJ<028<@CHG806?HJ@;NLCCDFB>=<:;89\S26:765565686675543333:><<;8775665444444443233444564.+,022222344443345555556657=A9112333346666@@AABCEGKIGIKMOPPOOOMKLNNNLNPOGBDADHHC738866656768:<>?=<;:889;>BEB?>><<<;Pmpi^[cfedc`YYff^I8IZZ[XTJDCBCCDDEGGGFFHHDBBA;988:;;=<;;;:::;:;<<::<==>>>B@:6440078555323:=?@:9@==>>=<==<;;;;;:898776543333344349=>ABAA@=<;;9889>?904Mhfb`][XXhtqmjheced]NA:8877641.0224HVCCDDDC@=<:68:9978:<=>>=<@IOKA3/604Owi;2;;7:8.-,.232453/.2520//00+()2@FFKRUYXSLJF?>:35@C@6KlolneK0++-03579:::;<79P[`cQFHPM=;OfV?ZxWXUO@6DDA>:72.*''9OEBOG<4.-,-6;/18/.../5;JhfZRJ<6AOC64000*(-14;A:/2:?=HC><::9981AQKU[JG_`9)11/-01/-+,5BMQQQKHMJ@EJ=;KL;8===<;;;763.1@SYSP?,-.*1435:<;;<97;<93454-*B]K725:5(,9@@=61HRCKMIB=<=ACEHIJGC@?@BFGIHHIHIHHHGGEBBCD@A@A?>EMKJJF=FHFOTJR^W`gh_QDB=:9:<>?@>>>>>?>>??@>;<@HW]XOJFDCBAA@?>DDDFF@p@8GFGOQONLKJIGGHKJKIDBBA??ABCBECOWCB@?>===<=<>=:;;<>BBBCCCA@ACDEDDEDDDDCCCCDCCBBBBBBBBBBBCCBCFDJ^jW?=@?<;;;=<>><<=<;;<;=DKNNLJHEDDDBA@>:87=;<<>>GVVXWO7247@CA>5/8ITTG>NJABDSE@=><;77Q}mE9:545565686665544458=>;99875555423445444322224445542.011122233343344455556545:E>333333454579A@AABCEFGHHJLMNOLNNJHHGFKKJJJIFEEEGIC82587766567779;=><;::989:<>??=;<:9<=Nlrk^[cgffdb[XccSD=Lb`PA=:9;>BDDDFGHGHHILIDD@:9:88:;;:;;;;::;;<=747:<=@@@BA?<8523<>99:;;<=<9:=@>=<==>>===<<;;;868976655444578999;9789;<;;;962336=>70-Hiib`]\XT^ptnigebcgjh^H:8866641//.4IQ9065578898764311122111101221226;ABBCCCB@?:410/4;==<::;;<=DOSND87725=K\X=2767?A2),,/012420/22/..-/0.-0=DGHJHEB?:41/,-217GG>97DKR\K6.,,,045798899<>67FTM67FQLCCWj\ADvoPHI>005:94+5Y\F;159=A?=@DC?5($8IAASUKB5051/95*(.0/**7M_\PC96537MeQ655011+1656502:?<7881151-B^e\PE?<=BB@?@:9MA.27856983.051,.6:1,3:<>AB9LqM4,;mPBA:326;?CCCDELUZ\ZUI?BF=6:;9;:62-)8ED:5397/4>;6875BQPD?=77>CBBA?==@B?;PPPQRRRSTTY`a^XU]fdcfillhda^]^_a`[XVUUTTTSTVVWWVWWXZ[\]YVVXYWUTVY\^]]]]]]]\[ZXXXWUSWZZXUSRPOMLMPQPPONNNPPOOPLJNOLLNPPRV\bhrs]NQOHGIJLMKJJJIGGIJLMMOOQRSTSU\abc^TLGIT^dhlnkggg`UOPQQQPQPNMNOPPNPTVVVVUWWVXYYZ`gmolosuuuvvvxxzymlyzsik_\fic^ckmjn{zz~ofgheddbb\ewudýxdm|qfsrdceeghjjonkvsutmk|ȃqȡrnutz}jqkgxqmcfdfhhjosoihhkmkgigaceeccccb]\g`^i_pw{uqpqsfW_]ZVRRQPUVOY|}~Lcda]hxmaab\VSPNKJILORTP|OlhTQUUX]`]YYYU[]YWUXWYXYXTSTTTTTRRRRSSSQPRSV[]UM[aecb^VUTSSQVFcvQNJkkVVUHTXWVWY^^[_]`]SKSYRXVMLKJJJILKGUe^qr_Vcrwz{trm^^c[UQT[fc]`_]\[[]ajrux{ztlcYRQOOOOOPQRTSQQSUluyq_MRmo_]][VRRPNMLPUTPTM@=Se`RONJFFHIGGILLKIHHIJKGDAGJHFHHJKIIJKMJWcgrsx^@>EHLVSOXZZ[[P[qqbTOKHFDCEEDEFGGFFDDCFFGHNF@=@EFEFEI[QAB@B>?@@CEHFDB??AHIJHHIIHFDCEGE@@AC@?==>>>=>>?>?A:3B\aWPHEECBBB@?BFGII@{7?@IKMOLLKIHHHGHHHID>>?>=?@BDA@N[K?B??>=>===>?=;<<<>?AB@ABA@BBCDCCDDBBCBABBDCBBBABBBBBBBBBCCCECIamP;@@?=;<<==>?=<==;<=>@FLONLJHGEDECBA><<=<:8:<95D~Y=965555557644444556986874564343212344433323443333587224433323466655545555555543::4563345558>A@AAADFFCDDFGGHHFFHHFDCABDFGFEEEEGGC6/4767765556688:<<;:;;989;<<==<:<:9=AMgtl_[bhgfd`_ZZeU??GLH>=><;<>BEEDFHHHHHIKIEC>87:979:::::::9::::96459;==>>?ABB@;;:79:>>=<<;=>===<=====<;99997688877664438;;;<;63216:=<;:987789<>91.Adod_]\ZSWiromkkiihjonZ@88887631/)3PK3265565699765410022122122332238=ABBDDB@@?820..39==;::::<=?B@>><9641.*.1112/1971/.-+-/244574320...06bgQCA920/.1515Lb\K:/-.7@>;ALNG>0).;DFJPPLG>A8.1994440,-:MN=3343662:U[=69@@>94EI/15437<93/565348:83149:5-/]U07-A^MSQDEEB;5321D<)*.6;=;984?dfA32CDCBBFHGHHIIB>=<<;;>ACFKC8:BBCD=516<:H_WQ_q|g@06=BDGGGEEKU^fgjaOFECMO;:C?840/1.2;=407>>91,.15>>>>CHHRQQQQQQSUVY[WRMLS[^afjmlhdb`^_bee`[XVTTTSSTUUUUVVWYYZ\^]ZWVWYZ[\\]__^]]]]]\\ZXWVVTSRUYYWTQONNNNOPPPPOMNQOOPPONPPNNNPQQQRSVck_POMIHGHJLJIJIHHFGIJKKNPTY[\[ZUQONNPOKOW]dknrttutqi]SPPOORSSOJKNNNPUWWWVUUUUVVU\gkiegostvxwvwwww{}{ww]dllb^fklmm~nbehfedddaezrȫll~}cbkiffghhimojptuvxsnwʼnlu·glqqswz}Ʃʹieacdsqhdbccbdghhdcdcddcbbegcabbd]o}uopqmviXb^WRQQRTSOWsZvmjpynbdcYPONLJKOQRRUKwTls_UTTVW^^XVUSSWYXVVWXZZXVTUTTTTTSRRRQQPNQRTYYUUcswsmf`\XUTZXLaOPGVw\PX~IVXURRVXXZWTZZURLM[bYPOMLMLKLKEQgYlZIYqwyj[UWYY\]UOQUWVSQPTZ\_dkuyxwtodVRSTTTWYWTUTUVVUST^ry~yxjVIWndZXVVTPOPPOPQXXUUYL=Q_PKLJGEHJHHJKKIIHIJKHNajHHJFGHIIGHHIIGDK[lqrXGKIEJUSGLPQSQTfbTVWRMIFCEDEFEFGGFFDDBCEEMPNTJGKLKPKIY]SXUOI??@CEFFEEGFDBEHGGHGD@>>BGD@>@A>BEEHJIJJJJJIIHFBIWQ`MA`nkfievs[D67>??><==<<=><=@@98K\ZTKHHEDDCB@ACFG:f?8CKMMLLJJJJIIIIJIIHB==>??@BEFBBPMAACDBAABB@???@>>>=<=?@@>?@@BBBCCCCBABBBBBBCCBBAABBBBBBBBABCCDDFSWF>?>>>=<==>>??>><<<=>@DLPOMLHHHEFEDC?=;;:::|~{W=9876555575434886568:99888643331244545689:;<<:99:;==;;;;:864369;:76545555555444345534467779=>>AABDGGFFDDEECB;9BIHGFEEEFFFFEDC??8137555565555668:<<;:;;9::;==<===<:9BJL`toc[bgggebbdcaM?>?<:?@AAA?=;77:>@@><<<==<>>?=<<<<;:98777677787766435:==:631138====<;:;<;=@@=940:]rh__^[TWiqssonmlihkodD59:987533*0KB024444359977651//01122222331/28=>?@AB@=><72.-/3587789:;;<:89;<<<:73220.+051++-,.044013457875531.+0BMTRGC?;5246553692/*.73,'++*).41,,.0147754551-,+--07;;DOL=:7/*,,*.11370///0121@WPBA/+*+:KG<>JQJ@70-:SWOJKV_VH9456740///4:5.-5?A><;:58PK96:?D>7;>5/3448720/.-/1*;rcE4465579::70?M43006:=:548478::449:::=7/=P9001KSG?><85BXF/33)CbB(--2?DEB:12>DDEGFB>965778:=CNN;2DLB:<<7357.6`c4+,22+)-/.,-5FRN@9;<;87;>BDRRQPPQPRTSRPMMLKNV]aejlkhdbbbceffd]XWUTTTRTTSSUVWXZ[[\]^]ZXWY[]^____^]]]\\\\[XVTSVYVSQSVVTRPPONMNPPPQONPPPPPPQRQPPPQSRPPONQUTSOMMJGFIKJHIGGIGGHIIKLNRUVUSSQNNKJQVXYXZ`ehjklpqqrpg[SOPSTUPIILMNPSVWXWUUUUTTV[aa]aotruxywuvwwwz~znbguqackjhkslcfghggfeghjyvвo~f\gmighhikookt~tuuvwqrĀgoqx|vlnquxz{~itɷmnm\dm|e]adeedeedcdddcddcbbbbcdb``]^}zsryuq~yd\gaVRQRTQLUo}}{ssvkgh\RMMMMLNQQRSWIg~Y\kh\TSTUXZUUWWWWWVSRUX[[XUTUTTTTTTSSQPPOOQSSRSVYbjkkihge`\YbS[SOMJQkdParLWXVURZebVOUTMIKJHTXSQNMMMMKLNFMdcveWM_n}usug_`YMT\TNOU[WQONPPOLP^ffhkqpfa]ZVRPPTVUSZc\WXWWXXXUTYis~zyu`MO`f\WVVXRORTVUQVYRMUULDCGKKJHGIOVPKLJHIJKJIDW|PBFNOLJGGIIHIIH@HbrpXLJFGGMPECOMFKa[GIOQQOMFABDEFFGGFEEEDEEEDGHN[\YONLMNOMLQQNKJAAACEDEEGJHIGIIIJHEDA>=ADC?>??CFHIMNLKJJJKIJIGFFEEHO@jkedinvzr`J=:9=?><<<;<<;9:<>:>?ABABDAETP@?BCCBBCCBA@@@@@@>=<==>?>???@BDDDCBBACCCDCBBABBAABBBBBBBCCAABBA@@?D@@?==?<<>?>?@?=<<<=>@CKPOMLJHHGFGFC?<==>@>CGJKJHFFGA:9;FOJD<>@AAAA@@@@BCCBA@@@?=;:=@@?<9766544334444224324566668:9=BABEIKJJHGGC=8349CLPLKLLIFFFEGE832695343444556668:;;:998:<==?A?==??;=JSLWotj`cfhhghiiidR@>EDA@?=;::;?DFDEGGGFFHJJHDA:68888888877888889888799::8:<<:8:?A@>;89;<=<<=>==>>>>=<<:98999766667877766668<=:61136:?>=<<<<<;>=:86324337;;741/0;8;<8469;=8/2F:6>12EB8-FP4H`]J@I:/6557;?=87>A8554-,GI/)-4==:9879?GIHDA@=:97557:=DLJABKIA;865200)&SuJ6e`.-;>>AFGIHFJI4=1''((&/?HHD<56743/6@:5SRPQQRRRQNMNPPOOPV]aeijigccedb`__\XWVUTTTRSTSTVWXYZ]___^^]ZYY[]]]^^__^^^]]\\][WSRUYZVRMMRVVSQPONNOOQRQQQQQPQPOQRQRQQSTRRRPMLNQPOQOJHHGGGGGHHHGGHJJJKKKLLLKLMNNOPPPPORW\acdhmrrpssk^UTUTSQOLJKLMNQSUUSTUUTTTUVV[kvrpwwtstuwwwyz|{zwmhm~xhekplkupdgjgfnqfdinogǬ~gamrkghhjmopmtyttssup~ƒhmosvy~|tspu{sdcw|`S^lsgbhrrdbbbbcccbbbcdbaabcba``aaba_`Xjwnvrr~{wn_]faWQSRLJWn|zxx~xwuj][PMQIFIJPRSTTWJb`L`iaVTUWUUUUXYYWVUQOPOOVZYVUUTSTTSSSRQQOORTRS\c___^]^cfhjiibFqyLNLKS^lwjRlgQWWWUS[e]RSWUQPOOJMRPOONNLKLLNLINtj]QP^ujXYZRGIEGkqUMPW]ZVSOSUXcoy|z{{|kWTSQOQRPOOOMSbg_ZYZ[ZVTVYagu~nTQYdaYXY]XOOQRQQNQRPNPULEHIHIHIKUYOOPMHIIIJCGfrODGNWSLHFGKLNLKTLCMfq[MIGKEGOQNSOCHUICHIKOPNHDBEFFFFFFEEEDDEEEFFMUXVMKIJIIHGGFECBCCBACDCCC?CIJKLNOLIFDBA?>CB@CCJMLKLKJKJJIKIIIIGHEEB^Ube``l{wuyolmeZM>7:==>>===::;<<<:9:=@FIKJIGDBCDG=t.===;AABAABABDEEFDBCBBAAAAABBBBBEDA?==@BDCCA@?==><<>>?@@?=<<<===@IOOMLLJJJHGGB><=>>??ADFGHJLKJHEA89BCC<<@?GNNKLJDA?>@ABEDYfznOE<78*TZ<=7588977555689:?A9567423345455468:;::=@A@?@?@ABA@@?@ABB@>@BA@@@ABBA@=:9864433443233334555467678;>@BEHHHIHFD@92243:GPNKMLJGEEHNQB34:632334335566688:::89;<>@AAAA?=??>CQYNPiuod_gkiikkjki\ICFEA?>><<;:=CFDEGGGFFHKKJFA<667788899886667:;;::;;::::;<9656;<<<<=<::::;<><===<<;:845789:9886579887767:>>;6567:>?=;;<==>===AIKB<9532-8Sgg_[VT]imonmmljhfkmX=79777763232//12115;BE=75651.-/000022113103689:989;<964000-16667789:;<<=>@@>=:8654543479FUPEBISRJEFHA=<>@=956AMORQLA@?64430/29:86443105;60/11023.-,-,*.7:730--.0028;:8:9;>=731279542/-+(*38?@:4383355,);R[_L?=8=<2FgcI>KcYF93,*++,5<;9:>EOSQNF<620/0.55/-268<7/4>ABC?4-*.57835QfI01432.-./012/3J>41.394.276777:=<4/5:988;8/8=2284/.V],,RumK=I9-22238==<;=<97533++91),069;=BIJGFEB><<<;::;:;<>EGELPA8<=854213:7=j\384*-27;6:FLLJMD.G@#,:JQF2-1249:;<>7/*(-8@@<4,)'(3=;640-,,,4=<=72TSQRRRSSRPQRRRQPRTY_ceggeccca]YSRSRTUSSSRRSSRTVWXY[^bdb`^]\[ZZ[\\]^______^]]]]YVTTUXYXSMMQTTSRRQOORSSSSRQQRQOOQRQQSSTUTSTTQPQPOQUVTRNIHHGFGHGGFHIHIJJKLMNMLLLNONMMNOOPU]cjppssppoklh\WSOQTQMLJJLLMPRRSUUUUTTSVcrphoslinsstvwxyzzy{yui]kxz}|p^oyhhjiiuqcd|w|yĹvmhtwkeikklopnr~}utssssrͅirkmwz|~wrrsxdp~m]Z`hc]daX``tilxzxj`[^baaa_^\^ccbaabdba`^^`ba```Zhzyqiv~vtto`^b[UQOOUbr||yyxxz}s_STQKQ\h_MOUVTSUNUlDUecTTYURTUVWWWUVRYxiUQRUXWWVTSTSSSSRRPOQQUhwqfbaa__achlnjW>dKPNPU[`jmUw]VWUVTTUTOPWYUTRQMLSTOPQONNMMLLPH>f[OYk{dR^\]]QH@WzjQSW\a^ZSPRV\nzx{~kXTVWTRQPNKJJIIWild]\\\YUTU^bo{bTT`f]YY\YOJOOLMPKLUPLKMOLGEHTZNSdXOQMHHGFHA?`ZECOSPKHGNMKSWQN^bUEGc\JHNNJKSUSUPIHECJIIKMNNMKIHGGFEDDEDDDCDDDDDKS[XNIHHIIHJMLGEB@ABAABBBA>BGGJMPQNJGFEBADIIIKLLMLKKKKLLKHIHIHGGGGF@O|f^\\kyyqjgeimmmeN:7;>>>>=:;<>>=<<=;9BOROIEDBDEFJJ8D[NIMMNIHFGHGIFDHLJFCAABBDFEDIdLCCECABBBBBAA@?@@@?>==<:;;;>CEEBA?>??<=>>=?A@@?>>>===?HOOMLLKJJHGFB?=<>==?@@AABEHIIIPIB98>?<:54DRIDHHD=88<=@DGThnq[E<=;9_[D<55667778879:;<;866654110122478;?@@??AC@>???@AA@?>>>??@@?>??@@AABBA@><;9644334433355545665687875:@C@?BDEA:8;941324:CLLKJGGFEJQYSD;73343343444667778::9:8?DEECAA@>>>AKWZPOgupf]enmlkjjjkfWIDD@=>?>>=9=CDDFGGGGFHKMMIC=7466888887777689::::;;;<====;:;988889:;::::;<<;<==<<:973479;<:99766897788:==9537:;=><;<=>=>>=>?@A@>;;8430/=[ibZUWainqpoopnliprX=77677785112211100/0;B<31220,,.///1221121025788768;:7630222598889:9:;<<<>A@><;8554434441HMPSD;@F=64530/3:94233214<>6005615614553/.6?=80//010059:88:<;95037:96563-)))+2==4/0234:@9+0QbhS;9BB95TgVCDFIE;61*+//06:99>JSTOFA;3/.+*+)*-.(*--41->RXRG@745:>;3-6D?55543331/121230<:10-/0/++253579;:85459;740/110355+,IT=0-UoA?L:020148;=>>>?<6434/)+,)()1;?BCDED@=;<<:;<9:;:869AACQO=:A?>AAABGTN0MkD/9;76:>=;=HONQNE`ȶ?)9?HQJ86;:56?EFC<78757:<>>6)$,32/-()48.%2MH67:TSQQRSSTUUTSQPQPQTW[`aegdbaa^ZVQOPRSRRQQRRRRQRUXXY[]aefc_]\\[ZY[]]^`aaaa`_^^\][XWWWYYYXUQOOQRSSSRRTUUUTRPQRONPRRQQSUUUUUTUTTTRQTWY[][VPKIGFGGGHGHIILMMNOPPNMMNMNOPQQOKMVborolggqrmnoh_VNLPRQMJIJJKNPQSTTUUUUTYdia^db\akppoquwwwy{}zkev~z|[`~jdhns|mi{|mcfz—s`prkzthjolkoqqruustuuvoՉlrqprx~wqnnsxpehzwmoswmqo\RyfZegeffgjmnopicefhjlifdbbcddba`^_lzrl|~|zt}zjlsmb_^VSQO[kx}|}|{|||wxdVh`QOQqpPQXXUSQMGxyGL`gXTVSRUUVWWUVWUw{`RSUTSSQRQQSTSSROMN_vljigedbcec\TKTWMRTWX\_^h_UXVSRRRQNMOQWXTRPLSYROPPONNLLLKQABygWKaq_MZ`XWWRHNmpWPUY]_YVTROQXiqorttjRNUVVTRPNMKJJKLQ^loia]^[WTTYYepZSXb\XXVUNELPIJQKI[[MIKGDFGHUfUUwjJJJHGFFGA>==;;<><;COTMGDCABF:ig4=JKJJOIALJIJJIJNMJKIFCBBABCFDEZVDCCBBBBBBBBAA@?????>=<;9?;=ABB@>??=>=@HOOMMLKJIGFDB?=<=<=>>=<:;=?@ADDGLD;;<;624>K<BDFIIHAB>=?NeLA<778777899:;;<:85345531013578;=>????????????@ABA@@?????@?>>>>>??@@A@?=<:645444556556665666689717??;65:<:5217:6113336BLKIFFFEHMSVO<4444333345555688999;:7CFCDA@@?>=?EPVURSi{te]eppnmkijlhZIBC?=>??A@;>>???AA?<:99::9999;<<<==><<;;:999;<==:9976666899::86105<=;;968>>>=====>>;:::<<73327Vlc]XX_jprrqooonnpbE6787777973/134210//.27762131-,.///02211110146666569855334579;;989;;;<<<=?BA?<:86421356546559AKUUSSQLIHG>3E=654422530//1/138;82./5933327:9730259944420.,.59:;::62..46674233-,158:=<52021/5=<2*DjdG7AI>9BabJ?=8:>?;5/,-,,,*+3CRTMC930.,*,0+*,-00+),2-+Mf^K>:;:9:8/,-366740/./0.-143465420.,,-,/6AIB:79:99955:;8431/006<;5-29??4Wf>FM=566:=<;<<<=><5342/-*((&*3?AAABB>9A;9AIE:89>DB5,.2/,.,(4KP?,*BG548TSQQRSSSTUTRPNMNRXZ\_beeeb`_^\XUSRTTQQQRRQRQQRTVWWXZ]aeeb^[[[ZZZ\^_acccca_^^]\[[ZZZ[ZYVTTTQORTSSSSTWXWTRQQQONOQSRQSTVVVXYYWVWWWWTRUXZXRLJIGGHHIIIJJLMMNNOPPONMLLMLMNMIGRdmhba`eqyyh`kpkcVLJLLLKIHIKNRTSRTTTVWZ\XWXWTV^glmnquwvvxyyzwz{{|jX[o|temtxv{oilnswb[`mmg}jhpmlpprttuutvzwqؚhospstw}}~upnpswxz}}~o_`td\vics{{yxvw~{gfmmnqrqnkihhhihedc`^^a^ax~qzuaeni_\\VQJWopoxzy{|zz}usxp[uyUOY[el^SVYYXUQQDsLIRedVPSTVUUVWWVU_zpaVOOQPPRTUTTRLN^t|{zzxsmjfc_SMNBnNOU]_]_^Z]]RZUSPQQPONOPTURQPNRVRNNMLLMMLKMM?Sq[F[smY[eftr\MPkw^OSVRQSTUUSOKTjrqqkd[UTSTSRRQQOMLLNQRSWgqmc^^\ZWWS[~uaTQUYWVQOOGEOMHMLKTWPMMPOILMRUW_ofMFIHFHHE?ABDGQUOO[d`VOMONOJO]ikcSGEMTTPPONQQNLJHGHHIIGHIIKMKIGGFGGGGGGEEECCCFLaj_JHIKS_cZVSRRPIDDEEDDCCCCCDEFGJNQSW^]^ZSPOKKKKIJJIHIIJKIIGGEC@>>@Bt`ScopnibdilptzdK><=>>=<=??@?=><;@GJGEDCACB;|:;FGCLnbMNOOMLJJKMNNLJFCBBBBFC@OaEABCBBBBAABAAA@??@?>>><87:<;;:98<@CDA???>==>>:EG??>=>>>>=AKQPMLLKJIGDCB?=<<<=>>>=;:;;<=@BFGB:8:9426;?;9;?=<=>@>B@88:@>>>?A@>???<;98:;<==<<82265665678A?=>>>=<<;?IRTRUS_wxl`eonmnliiljYFCD@???ACB>>BDDFFEEFDCFJHCDE<557654555789::9:<<<<>>=>>?????@A@=<<;:9999:;==>>=>>?>>>??@=:98777666899:97568<><;;7458;=>==>><<;::::988:87Shdb\XZ`jrsqommkjfQ858677778840144430/022.2<8584/-//../110133113445546876445678:==<;;<=<<<<>@CB?<:986423667785477;JMPOJ=;=:5:GMGFGLB3''9C;55432553/./.03332/.-,.6422127841/./2446540,*,4<=;82/1:?>89=80478:>BFHH@6:;50.2564,8`U?;5,').,-4<9341.--,,4E_jS:;<:93/3:;60.1;62>?@A43BHF?J]OBILFBEIJHC;9:;;;;855210,(')/;CEEDCA==CIEFKG=94/.0009CKLGFLQRLDCCEJKLPLaqTOWPKBHgt]CEMPW_]S``Pryf_onI+*.3<@>@DB;<@:58:=DG=.1A8&(/13?MG;;55;500RQOPQQQQPQRQPOORZ_``aceedb`_^^ZWUUUTRQRRQQRRQRTVVVVVXZ^bd`\ZZ[ZZ\^`abdeec_]^_^]]\\\]]\YRPTTQQRSSSSUWYZVSSSRQONPSSSRTWYXZ]\[ZYXYVTPNMLMLKJIHGGGHIJKLMNNNNNOONMNMKJJHJKJIM[c_\enpnt{o\ZkzxodWJINMKIHIMQRQQRRSVXYWTVWUWY]aefkqstwyxxxz|~ohorq|uyyvz{yz{poqog|sqyZ_^\jafwronopjoxvvuvrxoŦqrsqqqsx}~|yvwz}}qptuf\[a~j}wUkwcjtpmopqqomkjjjjkhgec_[]epy}y~yywcgmh]VURMVmxojopoqw|}~urzvnt~aIXa^\WTUW[[ZWTTDnNGM\aUQTVWVTUXYQTadzgSQPQSWXUUURTZ`ipsvxvpkg]SKLQEeMOU^^]^\YU\tR\URPQQOOOOPQPOQQLNPMNNKKLLMMLPODfg]{{w||wntmYSUXVVWXWUSQLUkroia\YVTRRQRRQRQOOORSTSLRetn\^a`\YUUxwqeVQOUWUSOOKFIMHJNMJIOOObkOJLLNRZ]YNIIIKNJEDHKLNPTX_`]YSPQONNLMN\elkYDHOTUSTURONMJGFFGHGFGGGIKJHGGGGGGHJHFEECECC>VkhJGKQY^][YTQNOPMHGGFFFFEEDCEGJOVXXYYRNKJLMILKJIJJKJLNQOKJIGGECBBA?TbQTiojd_bjpvxxy{t_H<;>?>=>???>====>ADDDCB@C@7wt5FIIHLOPQNLHIIIIJKLKIGFECBBDD;DZOADAAABBAAAAAAA@?>?>>=><67?==?=<;<=<@KQPMKKJIIGDCA>====?>>>???=;<=>>CB>9787418:;>>?<9=@<<==@;BCA??>==<=>>?ABB?=;:<=>???BEGFFFFGDAADGGECBABAAAA@?>?@AA@@?@?@ABA@@AA@@@=9657999888996765666555=D=779755358756865411343;DGIGGGHGHJK=43652234555655:99889;>>===<<<::>==??>?>>>===>@?>><;;:::99:;:;;=>??@@A@BB=6677777666777778>BA><;:95324=AD@=;:;;;;;:9::;=:Hcga]ZY[fprommliijX;596677898523444320/13/1985751.----.0001431023332469:6354688:=BECA?@@>;<>ADD@=::96576666655997:;91+;POD@>8304=ILJDAFK<09A40/012309Rjj[J7362/3>GF;7542//,*/Fb[=:A:3--6<7/(/CA0043=C@CIKE?:6:?FMPSUQJG?87898767753121+(*2>BFFD>;?FJJKJD?@A@?>>6/6EKJOPLLJIB:-0568QPPPOOPPOPRUX[^eiigcbefgebba`_\XUUUTRPPQRQQRRQRTSSSTTVXZ]`^[ZZ[[\_bccdfgea^^____^_____`[SNPQPPRSTTUWZ\YUVUSSQONOQSSTVXYXXWWYWQPSWVROMKKLLKJIGGHGGIJLLKLMNNNMMNNMMMMNLIIILSY_iqojlt{nTSfmkmjZONNMKJKMMMONPQQRSUUVWVWYZ\\[\ainruwxy{|{|zsltu|~xvvvv{qklkigbe|N^|lX_^^_aqm^svwvqfqxxwxqj~kstrropsw{{|~vtvx}}{~ypmmmpe[de|srv|jR~usk]n|oprooonllljjjhhfb]_gjotvv|}{|xswszzmqrjbXPTZq|{{{nbaesuqbg}oc^]b^gfRRY\\]ZVWMh{YPRPTTTXYUTWXZYQzi]|w^QLR\YUVU[debaa`bgkidZPKMPLWRONR\]]]YYP^lS[UTRSSQNMMMPQQTQS[UPRRPNMLNRRSTM^h}o}gixthe`VUWUUVUVVTVT[luk^[XWTSTTSRRRRQPPPRTTRPHMejWU\^^\WQmzrg]USUWVSRPNLJKKORNNNQQP\dQIJKLNNPQRRNNUTRRNNQRTO[mh]WSTUTRQNRPMS]dmcMNVTUWYTPNNMJHFFGGFHHGGGHGGIHGGIIJJIGEDEEDC>H[\JIMSWUTY\[WMFJNMIIHGHGGFECEGMPSTNIGEFILMMOOKIIIJKKKOPMKJIHHHGFEFHCU`GH]jheelsxwwvsojbRD<79==>>>=<====?@CCCCA@DE>[>IJLIKFQ[NKKLJJIIIIGFEDDCBCDDCURC@DA?@@A@ACBAAA@?>>>>?>:8:;>AABBEHHFEEFGJMKGDB@CDAABCCCCA?;8;;:8988:<@EDBB@?==;Gfih^L@=<;:;:BMPMMLKJIIHECA?<===>>>>@??=;<=>==>;876556;;>=>>;;=::;;;=@A?=>==<;;<>>??A@>=;<<=<=>:@B81567:?CEEDEGFEEEDBBDEGGECBCEFB@>;:;<====;98:::::<;;?BA>966799988887775554545>C701478676787456555213446>BGGGHHHIKK>23654235556667:9888:<;<<==<;;9:>GNPPNMCBbyre_juussrokdZJ@AA@DBA@AA@ADEEEEBAACCA@BEIE:3456677767:>?>>>>>>?@??>>>====>>=<;::;;:9888888;<=>?@ABDD;355656766666767:>@?=;::954227=HIA9678999::;9:=;=Zld^ZZ]elonnljhko\<5866799:987643445/-1223566321/,,,-//0014300233/035=>77656889=CGGHGGIE@=?AEC>:9::767766766688767=AB4-48>MPKHEC>56357?@<4211-/4:@AEIA4-,.++-/./573++.///.-,*,2>?<:1-4:8=?:21HVF8:81//1BUVM>1:D1'/3..2//1217BG_{pq]=1,).335@?5+'&''&$'0BOG=730-,*()*('***,,.4856976640//..,,04.*((1Dg}]OGKXZR\e]J?:9:93130-.:F=7>;439=:0+,6E1&+/BPNHABD>97556CNRTOD:85234554113335884.*1:AFF?9>=>>=<===?@BBCCCCF?^PGHHJIJSZ\NKKKJJJIGFEDDDDDCDB=Q^G@ACBA??AAAA@@@@@@?@@>???>=<::=?>?ACCDCEFIJKHDB?@@AABBBBBA@>=<;:8:998:>EGECA??<:Kdadi\G<<<<;:BMNMMLKKJIHECA?=;;;<>?>>>>==<=>=;<9766558:<>?@@?>;768:;<==<<=<<<;;<=>==>====;:;:;:9776455658?CB??AAABBBAABBBB@<@CEEEEB@@AAA@BEGD<4366789878:>?>>=>>??????>>=<==<;9998998877667668::=;99:8532432>LMC;=?>?CD>988;<:GbmaWX]dikmoljkneK8666679:;9:;86444469220+-48001011,,0010242014544546:<9<=757889;=AGKMPNGB@CCA<87:;9877677766677789;;.,28FMJGEA>;7688;=;820//-/39A@IM>3242-,131-06413//2001/-.572:KM6-20/1.-BVRC5,06-'++++-//0.,,27:BaeE2.+*-5/+7FG3,3850/-+0960.,,,,*)),-,+,/121/5<;7778=?4/212464.,-0:FMge=60;@>:8<>;668:A<73.-.-.49Jek_P?:==<:998DKGA;831232345662.19>=;:5,-8AB?87?DDGI@A>:Kpz]Obk}hKS_X[lqnZHGFED=7:AJVZXTWbjmvuoqy|zt9-8786.*&.:AB<4019BC<7<7.6CB>OJ.:F1*@PSSRQQPQQRVZ\_bdddefghijiiigeedb`\XUSSSQPTSPOQRRRRSTUVYZ\\\\]^]]^^`bccccddeda__aababbccdeefe[QMPQONNQTUSSSSTSSRPQOLLOPPQSX[]^__a_\[[[ZWUUUUVVVVUSRQPPONMLKLMMMNPOPONORSMFFIKLIHShtwzy{|lZW[XSTW[WQOMLKIHILNNNNNLKMQSSUVWWVVW^\U\irssy}}w{yfksn||~}vfr}yw|vmklmljkkigkoq{hdbfa^]^bonmzv{tilmhyz|{|vxr{zzz|yuutpp||rmlnqu{}qˑoorrsuvy}uo\Ţqonplq{dVVg}}oqqoonllkhdcbcjpz}lk|uqwqpqx}zu~|plb]ZYXSSYfv|zxZXUSWkv~vsjix~|rpsy}ytnfik[RX]]bempb]qSTZ[VSV[`[WWPG_x\\l~pMFMPSjvsponjb^\WRNOQQPE`LQRWXX_krePgsXWZTTRQPLT][WVVVSTZZ\YQSTSSRTQNLSbtkjooj^UWUTUW`gVMfujjl[RSVUSRRRSSSSTSRSRQQRTTOOGIRVUSSUVYWQ\f]YYW_pp`WVY]][XUTSRTZVPPRSTTSSRQRTSQONMMRSNUXPRTVXW`ءiRPPQSSSRQOQOOU[URSUWWYZROONMLJHGFGHHHHHGIHJLLKKKLKIIHFFEEGKLNNLMMMMMMMLLOWXbg`UKFIIHHFDCCCEFFHKPSSPKJLNPQLJFIKLKJHIIJIIHHHHGGHGGIHCHLB?>>><==>>?@@BCDDIK=BJKJIIKTTTOJHGHIIGEDEDCDDDCCBF_FFFCAEC?ACCBA@>>>?@?@@?=<>??<::<>>=>@BBCDFGIIFDBAB@DEDBAABCC@><;98;:999;BIGCA@@>:Lca`g[TH<=<<:AMNMLLKKJIHECA>=;;:;@>><@???=>>===;98:988:=@?????>;:889::;:<<;:;;:;<>=<<<===;9:::;88756555568:<<;:;<======<<<:98:=GRS?--3100/0111245655688778987788988755545534>>==;;?CMSQOLFA>8>^qe[gvuqrwunkiZHAACCCCAA@>?ABBCBA??AAA@ACED@96666888779=><<<>?@A@???==<<=::9767666557766555678;>@DGC954445654455678:;=<;;:98875443100?LPQSTSROI=7779;;6BaiZUYbklormimgN867667789:9:;876443:A521-/7:2/1256-*0122332136886678:98<@:67667658?FJQUOFACA?:768:9878767777667799<9-29BLKI@59=>5-57863/.34/...5;DI>002.,*,11.,,.6@B5.122782141:G;/.12=E9300(..,;C34FB51EYZJ9785351+*()+-,*+////.1343128;7768?D<48@@?;1/;EHLMDEP?/42-)/XjZP:98/'(8GLXfig\G::<>??CCFC9019;6443346:=5-3?D?;;9/+8C;759>BBED>>CCDLL@6567;;6YnIAWfyWQa^]ptjYJFDDFA:AFGMWajljjstg`ef\[oB7>776.+*9EA:;848HSMIC8217=CGOD+-=DBIPQ[XTSRRSSUWY]ceegggjkkjjjjhfeeeb^ZWTSSRRTTRPQSTUUWX[[\^_aaa`^^___`abbb`bccca`_`acbcdedeedfif]QLMLJHJLMNPPQSRQPPPOMLMNPUXVUX]__cda_]\[XUWVRRWXWYYXWWVTRSTOJJLNORUXXWWYYRJHIJKLKRfpqsty|wbZgibYZ`^VPNNNLIIKLNNOQNKJLOPPQTUTTVXTNT`hhjqtyulz|yvms|h_t}~xl[Vjyzumnsqlqrqv|wwΪgaiaa^]iz~{z{xxjgii`~}z}|pouuvx{|{zz}ysxyqnoqsvynuȕkhrxzw`Qghptzj[[bdis|}toppqqnjgecdehs}}~|{{knzywlggimrihsznZWTTRRYaky|{y~{{jYUWW[envztrnehqyui[`rupnnh^VWYVW\eoglSpcZ\ZUSUXXUVYTQLRvnWVisTHMgqnlljc]XVSRRRSVPSOLPV[ZZdncWUPMSRQRRPQQQX^[UW`^_lupd]XSS[T[rvbkyu~q_RVVUUV]lf^sxqaQV[VSRQPQQQQQQQPPQQQQPQNLIPXWVUUTTTUSNMNOPPQ`smZWZ[]]\XUUTUWUOORRSSUXUTUUVVVTSQKVf\SQTWXYZ^QRPQSSSRRRQQOOSSQSWX[][WPNNMLKIGFFHIHHHHGIKMOONLKKIGHIHGEEHNPQPOPPOMLKKJJKNQXcjgWHFJKJGDBCDCBBBEJNRRLJLMNNFCBDGIGFFFFGHGEFGGGGFFFFEDEGECBCJU^ivwogaVX]jvzP==?==<=>>>?@ABCDEFC@~}>JJJKMLGNMMB9EJIGDDCCCCDEEECEZIGJJGEEAADEEDCA>>??????@?728>==???>??@@ACBBBCCCBBDEDJKHDB@ACC@?>==<;:9:97=GHCBAA??Sa\Z_TUTG=<>=?KNLLKKKIIHEDB>;:;:84:=9=>?@?@?????@@?>=<>?@>=;>ACB@<979899:::::;;;<==<<<;<==;;<>=:876555545769:8789:999:::;:;;<:;=FPM:,0100112222456545643577789;<=;866456778>C>65555445796424323323444333325=BCCBCGHA734443335556556577998:<@@@@?==CJSTQOJD@?:8Ljj_frsoqttqpsdL?ACCCB@@?>>??????><>AA@@ACC@<:8666666889988:<>?A@>==<<;;:887666566667765466568:;>EH=544444555669<;;<=<:::::76656666669CQZ^a]M:5666667973FecTWakorupibN95766777899::97764366::2./5895112482+,.13434678:5/8<8;:59=8566576459=BOZZK@@?=8566788888766778889:;>=7=EJPRA/)5<:3/574.,*-33,-+*.498.+--*')+----,*/?K<)(-16;<:1.3IWF569AD98@JPQM>40-,),939=B@5/22/,/EF:EP>'2VZJ<1,088/,-156750-.10.////..,-.23357989=?@=70079=?518;9>BA>9>MU[]]]ZO?9;76@GHHH>205=>;863237==3-5A@9896/-;D<979=@B@>ACAAFML?43643/=ssE799=CIICIS[gvw_bXGF?ETL:99=PdkcZY\^ULMI@:=Jg\7EC<80.1;?76?<06CMPMJ5)5=BLMI?.$-AIFEE`_\WTTTSQRW`gfegghjkkkkjihfegigc`]ZXWUUUUVUTUUVWXZ\]]^_`abba``abbabbbabdedc`__`bbcdeeeeddehg`XVUUVWWSPQPQQPOPPPOMMNNQUURPRTUU[bddba`][[WPMORRRSRRRPOQRWVMKOPQTY\]\[\\XSNKKKNNPY[XZbfa_Y^f]^dec`[UQPPOMLKKLLNQPNKJMNMMPRQPQQRRRTZ^beflvl]cddut`ad_l}qYTY\`t{{wprvrotus~{ul~ԹvW_aa]`szuxoq~kqxrieu|~zvuwwwyzz||}szwrpsttw|ȝyu{qcak\kq`Ydnpoiltrpqoqsojea``dgjw|zz{~jrrgeedcada^irj\VSSOQbhl|{w{{ndWX[XWY\^Z]s|tk\OQRRW`fmnkf__`^ZVY]aOptJ[aZXUSTUVTTY[TRZZP[n[_peSVdmokgaYVUTQORSWNlKLRXZ\_c^NLURSUQPQPOQQPNLKMSVXbtvla_Xbrequdx|wbTTTQTjeartxgVV`\VSQPQPQQPQQQQQRSQNLLLLKLUXYXWVUVUUTQRRRTRSeobXYYYZZXVUVVWVQOSSSSUUWYYYXWSWvaQg~sWYYZ[YS_|USTWVTRQQQRPPPUVOPRW[^YSQNLKKJHFFFGGGHHHGHJMPPMKIIHFGIHGEDKRTSQOQPMLKKKJJMOOPPW^_QGHIJIGEEGJMPNJHIKMLKLGFFCCDDGGDDCCEFGECDEEEEDDDBBDEGLMMHHKOVippaTYhot~lE;@?<==>>>>?ACDEEEB>_NAIIHKNLKKHB69ELKEBA@AACEFFEDHNHGKIGHE@ADFFECAA??>>>>;?@@>>@AA@ABBAA@?@@ABCCGJIEB@ACCAA@@@?<9::98:CHDAAAAINLLKKJIJHEDB=9555BECABAA@?@CB?==>?>>=<<>>=<9:877778889:;;;;<====>;;<=<;=?>:8766665368898667888888899::;>>>;=CMH7001/1122222343444335667:=?@><778:<>?AFE=656667673EC5455413323455443235:?CBACEF>535443445556666579<;:<>AAAA?=?FMTSQNF@=>=9AaqhepuqprrrrtfK@BCBA@AA?=<<>>=====>@?@@?AA@<:97666668865456899<>>=;::99878787788877776666655689>?>=;9::::865678:=>=<=FS_fZ?12355555784<]gVT^iptxudJ74876666799:::888643524?<10334411//7:1+./13369862/:C8054/3863545765679=HX]O=<<;755667788876777889::9720451-*-/1/00-+++*)***0:;2-+*-//*)3A;,'*-08CC30/4IQC=CGD75N_]`aO?5-+*-9<631/-,+,,,-.39,6F7,=GG?2---+-9FFCOR9+>R9'()&,<=*):IPSJ6(,20/-,,+*++++,.-*144@RJ4/=HNKDD;02;><886/,./*'Ib81?MQE89=<60-+)+4@DEFFFIGCCNXS]jdXOB51394.@EOX^YK_VBGBFQE22>QhiUC@CEFIHKL;29DQjņ8@K?:7403:65=3/;58JOQG49FNVRF?7((34159_``ZUSSSTX`fhggijkkkkkkjihfegjkjgdb_[YYVUWWWVUVWWXZ\]^`abbddbcddedddeddfggfdbaaabbcbcdddeeeghijhgda^WQPPOOOOOOONMMOOOQQPPPPOOT_gijhdb`^]VNKKMNNMMMLMOOSVTPNNOSUWXYXY\]]VOLLMNNLIILPQKJPZYNTdhedb_ZVSRQPMLKJLOPRPMMLKLMOONMNPQQQU[_abehhcZUUdwp]\cdl{{`\illb`vxmqxyvnlqz~zwupnuw^ae`_aktkjgeigkx~xmaap~zxxyyxxz|~}u~|uqstu{wջ~ywoZdrbU[t|vtkmurpqppngdcbdefjbf{|x{y}{mffegjjkihihaYZ[X[^Z]hkq|~l^jucUUUTVVW[\`vxhTILPX\\grtvqjhdeiihgbXmmV[YXVRPNQUSY[\UT`\XYXkl^[jsXZnyod]VRSRRQSQVKlMNS[][YRHIOMKMNNNNNOQQNNONNOLPZbgprkd^^cjvxrppnisgxzzs^QPKaei|hSOW[URSQPQQPQRTUUVVVUTNHEGLJKQWYXWWUVVUUTRRRTTRUbh^VVVVUSRRTWWWTRTUSRRPMQUYXTPbxiufXSXZZXTdM`gZTUXVTRQQPPPPRVQMTPIOSSQOMJJJJIGFEFFFFGGGGGKRRNKIGGGFGFECFPXXUQOQNMOLKMLLMMLLJMOYZSJGLPOLKMT^gf[YPIHJMPNMNOPPMKIHFECDDEDDCCCCDCBCCCBBNbWLOWSNIQ`siWbqxx||trS<><>>==?ADDDDB@Eۧ@DGHJKLLJFA<9@LLGCA??@BCDFGFFGFFGHHGGDBBCDDDB@??>???=::<>;9;=?><<<@BAAABBCB@@@@AABBDFGEA@?@AAA@@@A?><:987;757BclZ8IKJFDDCBA???@=<?=>>?AGKIIH=47999:;;>I_W67>:7554455666555548CFBACEF;435444444776645579;;<>>:>>????@@@?=:975555777764445448==;:8776666789;;8777776667765677;B@85667667678:<==>=<:9999876568:BGJECJR<2\rD40-143/+-238CC4-///-*'*7ANT=)*),282,0562010*/9=7311AKDCGHA2&5O`a\VQ>*++08<;>:41-+,,,/.5N=3N>%3KQ<,*+)+6>CHNPL8.FD.05649A?-*?ZgaI10:8/..,*))-,.//1/*)-.DldORQJ;.4<;7:BB;@HA<;6//6=:255;HRPG<98543289:?HKIMWULGVVD]fQECAA:463/7=:?LI=55;737<<952279/(,450/215CFB?;:=>86?IJIOTURJ=2364@L?=>785AM?:=@AABGIEWUEHLGB==HWfi[E@D@8:GILQ@39BCHd^:>=;<716C9..';I1-BQJJJ=BOYVIEE<3-%".4]\[YUTWY[bhihijkllllmlklkigfghhhhgec_]ZWWWWVVVVVVWX[\_bdeeedeedefgfeefghhiihfdcccbb`_`abbbbbaba^ZVSQPOOONNNOOONNMMNNNOQQONOONP[gjhjhebbb_ZSLILMMMMMNNOQSWUMHKNPTVVY[[]`\TNLLLMKIJKLNMKNPNKMWchjjhd`[USQONKJLMOQRPONKJLMMMLNQOOQUY\acefflk_\aqw_[_Zdyyh_oymll`fuxqhmtxslblwxywwursuichdbfe`_[`wxjc`bcdijmwrg]f}}xxyywvy}}w{urqxedЩ{rlkwzsYtyncZU`uxrrnmljkmpniedfhjigiabvzxyrlonjmnigijiklf`\XYenuolmi|wnkhTAJ[ipiZTSSUXgtkS]ysRHX_ab^Xdeaffc`\[bge`\kpb[WVORZUOQWP\]^\OUPTa`]_r~WKRav}{{|yjdkpiaYRNPOQWWRVN^LRZa^ZRPQRNQTPKIKMLLNNLMMMMNOSQJS`hd^[^fmvwmf^Z\]`ckw~xup_SPuslnWQRUUTRRQPQQPQRUY[[[[ZXUPJIJGLSXXXWWVVVVSSSRRSTSQV`_WTTTRQPORSUUVVTSRQRMD?LOOL\tsoѥ\IOWYZY[[WQQTSTUUUUTRQNNPVXGHUcKEKLMLLJJJIHGEFFFGGGGGHFKRSOMJHHFFFECFPWZZTOMLIJQKJNLKJIJKLMJMYZSNW\YVTRT\jlfdVOIHKW[XVTTROMMONMLJGGFFEDDEFECDEB?NfiQMWXYUNGJ_e``hv|zzyok\B:??>>>====?ACDDEDG?H}FEFIMKLJGBA>AFJGECA>?@BCCGIGFFFGGFGHFBACDDDDBA@@@BAAAA@@>?@><>>=<>BBABAAAB@@@?@@ABABBCCA??>???>>ADC@>:8889@HC?=I]^_[X]WPTQ>=A>:?LMMJIIIFECA?>><;;<=???=;<>=::@A@@@A><;98767998876554577655566789::=AB:323333332232334435656776:>BFKIECEHJH@735999::;GTQF7;>:86678::766666632>DDBBGG:44655445577764545799=AA?=>=;;ALRVTPIA>??><9Psyihx|vrttrqbI>AABCCA?<;;<====<=>>=>??@@@?==;64444677::887645<><:9777788889:<:7667776668977877;>;7689:<><;;:9:;;<;;:9998776569;<><9665@[U62654445778895?[]S]lqvlD8=:777764467779989875546568774/,/00/.484/-.0031477;6**,//-131255566776779?KI:36753345567876557778::<@EKKC=;A9.@S80+'*1/+.7<69LK0#)3::68AJ>?K7()))/DI@?=:6476-),.2567=78GNM>-)$2V[JKXJ.(,276?E?631.-,,/4Bom=Xe2$9R=()-1478>KPF?87C?1*0Kkc92NL810/0/...--.,,..17AQbVIC6-19@?@?69@7>HHIIC==DA00AGEBCNVOFD?:=CD<41257=LRIAD=@WF*).4A@642131/8KID?9:6349=@ACD@?=:63651336;9558;::;AJJDDOX\YD.,8;<@77=4222ANC;?DDB??EFGJHIIIFLTQKIID=>DD@>AELK;489:<:Mxt?,:=:9:FI2,-4@?>>=?ACDEGFFD:cj>DFINILKIDEEEGGGEB@>@ABCCFHGFGGHHHHHE?>CDECDBA@AABBBCCCDDCCA==????BBBBBAAAA@@??@@A@?@@AA?>>>>=@@BDDEFEDB?:=FH;9?IJLHFFFDCB??=:GE:5KPFIMLKJHIGBAA@@@CCDEC?;<;8668:<;><;<<==???>AB@?>ABAABCBA@?<9667:;:;<<;85676555666689:;=:::9::864332222454467666679?;8677777524>ECAEG<7664544553564443578:<=<;;:::>;In|igw}uquvriTA>A????>>><=<===<:<====???@@>>@=766665689:99877;??;97779;<<:::;;96678776679:98878::87899;>?==<;;;::;:988888788779<<<:85616KH346554457788986N\T^osw{Z9<>878876346777889875431468<1/@K=<=BHGDC?:6031(*,)'>YXPNH<37<3*)*/38::16OWOE4+)'ASGBNK<-*384>F=6441.,--Dr|KP`C('=8'(-0542;KG74:XD018=><4,)'')*,7@IYZLD9.(.9DB:46;38@;KLLQJBBCEC@DGKMI>=HSVVNC?=614/*(,-4940.0;H;672*.;73311-,7FED?:877638@JNKE<8@H=27765530,0;><>CKMC;>DN[_E2CJC=8<@3(+.3;?=;?HHC?>BD?@GHIHPOE<9988:=?FKGADIB76769==9AK8-:?:9?M?,,DQD0./?U?',79>?BMYXUTD.'/7WWXZ`dfhkkjjihikllmooprqokjkjiihffcbbba`][[YWUSRRTWY[\_aaa``_]\]bffgfffggghjjigfedcba]ZXWXXWUTRQOMLNOONMMMMNNNNNNNOOOOOPPNNPMMQU[djlnmigffgcXNJJKKJIKMPSSTTSOKKLQXZYZ^__a_XOJJMNLKLMMLNNLLLKS`eiljhhe]UOMQPKMLJLOPSVVTONNLQUQPNNPPRW\aeffjllnnjkk`gzrjlke\]b`ZZ]cfhjnuvguxtstvvutrpoha_`a`guypjhfglqrprtuwwrmkq|{yzy}~ys{yytl{oRZ[T]ȫzwtqrqnlmmixqd\lse^[\[[]fruqleZ_vuhcflonlkkkhmxxrmkmprqpmkjjmmfb`XVUXchge]]d`TQTZas]NUQRX]^Z`pkTRZ]Wa|Y^jkleiooqsiivq\WT]zqbQOUULfeX[NQQSVY\]_`YYypaYZgluiNKVccahsvUadVPSVfnii_mn\^cg^UTRNNPQROPY^[ZZ\fmlgd_\\^_agjjnnf^\[]hdYZ]^`a_[csjW]app`_UOT\ZSRQPOOQPOOTXYYYZYXYY\\TFKUWWWWXZ[[YVTTTSTUUVVUUVVTSRQPONMLMMMNNQRJCDHHIIIFDHSeZMOXUVRNMMQVVUTUVVVUSRQOQPPSW_[ROLIJJHGFGGGHIIHGGGHHIFHOSPLIHGFGEFECP[ZWROMLMKHFEGJLKJJIIJKJJLPOR[`^[YWUVWZWNRSQMNORROOPPMLOPPQQPKGGGGGDDFGGGENkpUBHOQQOQTVSVTOMS]nvvvqlgWFBCCB@@AA?>ACEFIHGF;I_>GIICBFKJIGGHHHHD>BBACDDDFHGGHIJJKKIFA?BEEDCBBBABBABCCBDGGFDB?>@@@@ABBBAAAAA@@@?@@@@AABAA?@??>ADDACCDEDCB<;BGAAQ^^][Y[VMRR@:>=:=HKJHFDDDA@??=<646-.)?BDCBC?9667<<<==<:;;<;:<@CDEDA?<;>@@AABCCA?>>:45:<=AIIIH>:99899887889;=:7:?A?=854432345655777787:::<;=JQQLB?DD=9::889;75434554333434444679998998:;>DOSSQMFBCD?>>@A?=<==>?ACA>==>=9;<<<>??@@>>?>;8:;9778;:99867;><99768:;;;989;;:7788887779;987678899889;<:;;;<;;<<=;9666558;;:8;=;:986435;=645456666678990<899975567778887664341/0>LJ;&+5654232433.-..05871/-,,-*+//1024446667666772253223456677654578886/')/24428@8--2=JTN>63+.@HDC<5EC,LZ<18DJC>41;ADCOR[WJJD7;??ADG?4++/0-5A?ZddXD=?<;>73?OVOF>3,*'&''(),///047Fc_?00354321-.9A974678;8129>>96/)/DJ;5::874115>AAHKJC85:99HXQT_[PE=A@4+*-6?C?</*.0?ABBA@ABDEDD?=BEFCP_]\\YYUMQP=;@C===<:8937BKMLKIIIHFEDBAB@=<<@BEECBBBCA<<=?@@@??<<;;<;<=<=?@DGFC@:6549?@?>?ABCDFIG@::<<>@BHKB>??@@@><97669=@>=>?><9766555677678899979:::;<<>DKIBAA>;=<;=?@?ADA=;9::99:=A@>76778878756=BAAC@55434796534355664589899999;<>ENRSNIEEIHDA@=GmvhluuuvurpeL;=A?=>?@@ADEB>=?AA?=<;;<==>>??>>=;=<:989;:<<83147766437:;:97689976789:::87897655679;:8789989<<<;<<<<;9656458<=<:==;:998555654554466677888943LZ]juoT;489:;:87677767987777654-.?PK6535;;:850+.000//138963,+..-+00//1223466666557767920323323555675137999:?C>BB>=<:884/.3.<`YMMD713442.-+)+3;@ACF>652//.34-?><=BEJNF81483.,1>D=67::40;E<,(/FTMHRVU]e_N8)')5HPZ_]P1)>=?BFGGGGHFEEEDCDDDDDCCCCBBBBBBBBBBBFJLKHDA@@??@@?AA@@@??>>==?=>ABB@@?>=????B>?ACDDDAAFEDEXa_]\ZYSMQK>:@HEADHGFDB????>>=<<:9:::BHLLKIIHHHGFDDEB=;;=ADHFIIJJD>>?@B@>==;::;<=?@@ADFFEB>:5/27:=>=<<<=AHIJKKF?;;99:>B@?@ABBBAA>:6338AEC?<967887777788888999:85545<@<9=CGDBA?>?@ABCCB@AAABBAA@?==??<477666788769=@AC@435249<9534567766688:;;;;:<<=DLPPJDCGLLJCA<=@AABBDC@>>AEIJE?;::<===????=<>96779::;<82-/34441037999766898879:::::754554667:;:9999889:;;;;;;;98666568<=;<=<;:999666655554456677788870;S_hq]<4557;=:77888777889;:8544-1A?1/697568971//23321377764-/2454721/1122344344457642454333222333563047879?@><:72/-,2?7@>96468::961-.:ITWNA85676537=64OdZA3683006886--0-,G[A:ZY9,+0<@:5-+4>CA:52/-/1/1211026@HZkwsP249<850+(.48=@CFH<78748;1@K>:U]>B>Q|wUA6-,6GB98=51&>dkacfqoV6&),*)('*9:]l;*)'%%'(,035/'$&.:BLUM?=BIMOMKIHIH@77504C=-16855446:?FD932334642233322342'.GJ73=?6+**-,+.3567541/A><===<<<834=:HYXXVG;>DA=?ACDFPZZN9(+8EOSG5.37/),4737964520;A6)-5;AGNTRSZ_[RI>5++7>JTL;2@NDTTRQQRRUZ_dhmpnnmigioqqqppoooljhec_]bfdcb`^^][ZZYZZZ[\]]]^_`]VSSTX_cdefhhhjkklmlkjgcaaca^\WRQRRSROMOQRQPNMNPPONMNNNOPPQQPOOMLLNNNNMIIMONOS\bdiqsplkeXPMLMPQQQQPLIIHILNS]fklmnlfZMILKKKJKKLLMPOQZ[[emmkjiicSJV]TcgOKTdaIQ`WQW[XRRRU[YSPQRSUVXXXWX^fggim~x]WZZ[_diigۏ_rtstttvxwsppponoywspp}rggqwursz~rv~yvhemn`]]XUUV[`]SqDzjkt|f[ZZ\cijkswrmaUWfmhny~|lo|{zxvwqnrqquuqmnle`\TXdds}hsu|h\_TKJKLNQQPRPTZWXYWWWPMNOPQRRPOPRRSUOObbXYSmmZUNTOLPVST`RSWJPOPPOMMNNNPW[QPuiWXZXUX`jrsuuYJUONl|yjeu^hW_babbdeca__^[XVWWX[^ceca]^]Z\]___\YYYWWWWY[^cdeda]ZZXSLY{fX]_[YVT\dljVMMLLKKLMNNS[VX\QOPRVYVPUZYYY[\ZWTTUUTVVUUVWYVSRRRRPPOMKJJJHINTNHGGGFFGIIIECCDFbmRIMTXYVQQQQPPQRSRQPOMLLMLKIHFHIIHGHJLMJHGGFFFGHHFHNOJIHHGGGGHLOTOHGHGGFEGHILKHIIKKLKIGFGTYSORY^]ZWUTUW[\[[YVQKLMNNLLKLOMIJKMUdfev|xohbdocMGJLLHFJJJKMLMNNQTNFNV\^gdWLHHHGECAA?@ABEIIGEE>G@CCCA@ADAJMNHHEDA@@?=<<=?CHIGGGEBBBCCDEEEDDDCCBBBBAA@@ABAABDGIJHDBA?????@@@@?=<<<;;<;<=>??@@?>>=>>@@@@BAA@@BEEBEXb`_\[XSOPH=6?IJEDDDCA?>==>===;;:::::>GKKKIGGHHHGEEC@;9;?@@>===;==>==@BABBB@>=<8529>><==<;::=EDBACFA=>9<;<>?@@@?@BCCB@<841:EIEA>:55667789::::999843458;>@ACCBCDDCA@?BEDCB@>??AEFDEEA=@B=:577664677678;@AA=43314;=;544568756666:<:<<9;;cwkioppqtswrV=;>=?@@BBBA><=AGKMLGA<<;;<<<>?>>?>=:545899;;7432444434799888889;<<9788998754666:;9::99999888::9:::9987666568<<;<<<:98998998876565676777666621KbllH02126:;9779:9777779:;;742038.-851103798544567625887667:789974100122223223356522667643223333447:5589;=??>;<=>>=;:72-,+))(15/+-8BDEA@DA==H]\J@;9;<=97:AA6A[P1'+-/37>AC>77:86JT94WW:-.*/84-3?IKIB921../0.-040.,8I@/-8;58HD90.-,)0:=@BC@=9643156,0766;@4,4[dN3*()'+:BQaJ4-(>]f`dkpdJ4/-.-+*),7?dJ.+'&)++-/2561.,0=KOPK7(&(*-2:@EJLNNMJA:42203775534454JWF:61/2443224799777/&1JK74=7,*,045444322201;9-*(&'-882348;<8203896@QZY\^VQPQKG=8<95301:FB8MLLPV[_dlonnljiiiggkpqqqqppppommljf`]ZY^abbca^\\ZXWXYY[\ZYXZ[ZVUVX]bdfgikjjkkjjijjjgc`^`a`]VQPQRRPMMOQRQPNMNPONNNNNOQPQQQQQOMMPPOOOPPQQOLLNSW[bfhnpmjc[SMMOQQQPOMKHHHHLWekklnnlkbSKKMKJKKKLMOOPNLTcopmlknlbYc_Mn{hciePTi^MSYYTRPRY^XSRRSTUVUVVTRRY[]o}w^UWX\_e|lxvrstuvwvrqrrqlq~wvwzwooz~xwvx}{zpx|rktnZZcb^[Z\\]beXpmbnq]XY]ejruprrofX\vxejtw{ztu}yuvvsokknpqrommia\ZV]`[mnorsjXZTOJJKNRVWSTTRVYYZ[[ZXVSRONNLIIJJOTONY\WVVMje[^UbRIPVQVcNJRLQQQRQONMNMLMQRNRs}XQ[YWXVSbvsjkVT_MKOtueZRSy|ah[]baaa`]]bknf\XTVYZXYZWWZ\ZYejcedb`[UVUSUUVYZ]``_^^YVVUTJd{cXXZ\YVS^vtehfVQPLIJKNNHMa`]kUMr`OTWVVXYZZ_a]XUUUUUXXWVUW[XSQQQQQPOMKJKJJJKNPKGFGGGGGFGFECCIPigWOPOR[\VQPPMKKLMMLJIIHHHIKKKJIHIJIHILNMJHFGFGGGHFGHLNIGHHGHGIKIRMCGKJIHGEGHDFFILKKLKKIHEELVXSOT\ba[TORX[]]\XWTIHNMLKKMMKMRNJKKQUYjxviaacSFFFGKKJJJKIKIIJLOPONKLOS_e]PKKKKIGDB?>>?CGIHFEB;uq=ACBBBAC@CNLE><=<<;=?BFIJHGFDBABBBDEEEDDDCCBBBAAAA@@AAA@@CHKJGCA@????@@@@>>=<<;<<<;;<=>>??@>>?@A@@@@??><@DEGHPSRSUWVSRPH?9AHHCCFDB@???>====;:::;;<>=<====??>>=;;@><::<@?:79?@>===<;:9:BG@?>AA>@@=:<8:@?>??BBCDBB@<75:FIHHE<5567889::99866;@FNSKA@@BCCABBA@@??@B@>=;<>?ACDDDE@;@GA96455446665667<=?835536;;8544454566778::9<=:;;=FKGDBBHMOTQE=>:QslgnopuwstlP>>>>@A@@@?<;?AB@<::<<>>?AA=;74578898777644315:;;;;:::;:4224543333223487658768625787699694556300222222222445533556664212699754650037>=;9=HH95HB*')(+048:=<=>??@JN??OI?:61160/FXWNG<2/.**/7@A;M`H37RU;(')0757J\emu|u^D988;610/2:@SW95/,498236;BACE>=CCEKA-'**(''''&,126?FSTROH?8544430231CfoaS?01366667:==:9850+4CA5980./37;>?<3,,..2971.-02(*9;11;>941234:CDQZK>=/,330.-,4I[`W=5>BFGMK:0153,,7977653453028BGD>=<;=ADHIIGFDB@@@ABDEECCCCCBABAA@@BAABAAABBEIIE@@????????>>>=;;<=>>>><<==>?@>>?@CABB@><<=>@DHHC>==@DJLLLJGCCFFCEGFB@@BA?<<<;::::;;<=>DKLHFGGGFGFDA:9<;:BPF??>=>==<<<<<<<<<;;:679<>8468<=;98;?>==<<<;;:;>FE@?DC@DJ=73368;>?ABCBCCCCA@829DHHFDC@<;:;;;877799AUddSFBA@??@?@@<978:9876668:;<>ABDDA<;@D=74234566554546;<53765996643333455689;;88>?<:;?GJE@=@BGKOPPK?8DmogmqtwusteI<>??AB@>>>?AEGJMI?:=BFGF@:8:<==@B@@>::988559:::864347;<<<<;;;<=?>?=974455457778:;:877888877778::888999:98989<:;<:88889:::;;977667777778998894AfpR97:635678;;;<932454469;:62233344675542675368851/1121255295485100/133222223454327845542136:9754/-.-,.2745;:9:<;<;:8530)*;UTGhwKZbUQWTI='4\]J?77975538GD5-54+)+)')+-.0033448===BFEA;9<>=8?V]TKE9.//,,-7Txqg~X79>:2..1203017:76:3)*/143,+(%*41(*0246119A5.5_uH%1nj><9/6Vs{zM7;>@A:3455;@?>=636>>75:?FJMTPD>;6=E:/--.0220-+-/.+))-28EPTUL;/.0018<;<:771*0?FKI@<974242/01.,,.9@9:HK>0.C[VLOD1+---1===HMD>9-.3.-,.6<:4^`dgijkkjklmmoqpqpopqqrsqmmpqposrliic``]WTQQTVWYYXXVUTUTSSRQPQRSUYZXY^abbcb_^\WRRYciifd`^\\]^ZTPNNMKKMMPQRPJJLLLMNOQQPRTSSSSSQNPPOPPQSRRTTQLJJGFDDECDHJINTTTVSQSRQNLJIHGFKNMOMJNZ]SPQNJJJKJKLLMLJKYgcb`Z^dfhgcbaZXXU\diim}SR[[PLX[ZZWTTTTTTTTTUVVW[^WTZZevr]WTZjdpҧxwwusttttssrqzwt~jdovx{}sdl}}y{wnhmrw|vX]kibdgdeif]cӿzyv|p{r\X\ejkilonpkWVn}xz|{|}urxzvsqmmmmljkjgaZVZ^]^___fjuʽ|qoqQSPORUZ`_]\\WQPRUVXXVUUUUVUMFECBA?EI<<@BDDDCBBBAABAAAAABBABBABEAACDB>>>>>>>>====<<;<<=>@A?<<<<=>>>=>@ACDEB>;:;<=>>?>>;::;@FHKOKIGDDFGECA@BDA>;=<9889:<<<=>@FKHGEGHJLHHA:7789>D?==<;:864589::9966569<;8633457657:=?>=<====>>==AGB?EEEGJ:.+38:;;=ADDABCEDDC@818DGFHJE>===<:779:<<=GQI9:A><;=????<711222344445568:>BEFC<6:=95224555545646;:8:;:;<97665432555778;;67?B=:<@IJE?BA::;96239;<=;8789::::;;;;<===<=>:63355567778:;:999888777668;:86799:;::99:::;:888878999997777787888999999;5;_hG557754226?AAFG7,149?DC@<85331244688865877578:3220-+,,/5796463002484233233234300563343226874210/010/-)1<47:<;::;;:646=5,GcXBYttV`e_]ZTR:%2TWE8420,,-,2A@3-...,+++--.-----,-,-07@A9547@A=@LWQGA;6467:82,:hhXl^9)).01551,././3555.(+4?=7244088:B<4777737:DV]c_G<;65:>96634512121/4:;109<9;HM@,(./1<@<862-,,2=?BGOYROSPMMJD@4,1873.,/0-(*./1/&%8EA??;8863@T^c\QMLJGGGHPTFE@2eedcgjjlnmopooooponpqqqqqmnqqnkoqnllib^]\YVSOPQRRUWWUSRSSRRRQPPPRTVUTUXXVVVUUUTSPR[bddec^[ZZ[][TPNNMKMNNPQRSRRPONNNPPQTTTSSUWVRNMOQQQQQRSTTSRRPNMMNKGJIFMVXWXUOOSURMLKJIFFGGFGJLONINVUPJIJJKKJKKKLRVSSQRZ^`eijjf[RSVUSSUaujYTMSURUY[[YXXWTSTUSRTVWX\aaa_UQ[chs~sZZkdxsqstx{yy{ur}{ojjpt|sibcmojjquuqjkfhzsuj{~uqtofccbYWu¦~ywytu~zQZdmrqpqlhh]Vl|}~{y|~ztpjijklljee\Xr|keecchfaeƧ}ns[V^Y\ab_`egc_c_XTQRRSSSTTTTTOLMMJGCHN8_ELPOOGdn^uytpuvTZZNKIOPMJLPNNNPQUWSQPQRMLhtTPUVb~kafpcUUV|MQTY\TTUQN\[QS\[\kyvbUZWRX[bif_~ɰk^jjklifffddgc_VPTVVUVVTRVYbe]\apzxgUTVST[[WVQOQKSZUKMJKKCUVLINSSWZY[]]\YWXWVXYWUUZ`]VSTUTSSSQPPNNNLKLJIJHHGGEEEFHMSXVTSRRQRQQSVWYZUTTTQPNMNLIIIHHHHLIGHIIJKKLMKIIHGFGGIIIIIJKMNLKKKKKLJEGONIIIJJJJJJIHIJIHGGGFEGGEFHQ^[TZbecc_WQTXUNJHLLORSZYWcbM??GKIFDDJGT{ymWEHIDA??BDDGIKLLKIGHJKMORTTQUffOBDHJIIIKIIGDAADHGEG>O=BCCBBBBB@??@@@@??>===?AFJJFDDCAAA@BCEEDCBBABBBBAAAACCAABAAA@A@@?>===>====<;<<<;;;<>@A?=<:;==>@>>>>@ACDE@=;<<==?A?8:<>?CEJNMLIEEFFAAABDFB>;:7555679:<==>AEGFCDFILHH@87899:::;;<<:8544799:;823;B@;3022333323:?@>=<====<EI@ACAAF:2=>@A@><>CFDCDEEDDDB83=;9889;;;=A@:9?>=;::<=>?@A?;642356566654458;AFIE<4699854455667756=:9;@AA?>=<;;:86677678::66<@=;;ALKF@>???==BGNUE@]ljqx}|scNB@DECCDBACCCGLLIEAAEHIIIIHGA98;<>@@>?D=6;:84359<=;9:<;;:::9:::<<<;<=;643355677779:999986676776689865799:;<;::9:::8877767787778777888889999::;;68W_?2677740.0=MJENH@HOQPOIA=;64412369::989;;<87986577740025786462003;6.0667873,*8VS14<5.+-18@>4232232243-*.=H@3-,/28A@61220,,.++FG(0B=560*3).6//5>;8:EMH>527==82?UO>89<6.-;MH4)),1:*?dR=<:98444689::::54T{vZIJPSQOOSVUUOC:9=92/1;PZ\UI?45?HM<'(0029<=??>=BEE?5,(,1;>FLPYVOMKIMLD>4(.<=87531/--.////26:9779991-59;ETUUW\_]XTUbb\R<]\^dhklmnnnoopooonnpqpqrqpprqpqjgjkkgfjf\Z[YVUSRPQSUTSSSRRQRRQPPPQRRRRSSSSTSRRRSSRT[^^`a_\\\Z[[XTONNLKMNNORWXVRPNNMMNPSTTTTVVXYTQOOQQOONOPQSW[\[[[\[TNLJKOQSXVMLSWUQLHGJJGFHHHJKLIFIRWUMJKLLLKLLLMMNOONPTWZ^djkhhhd]XWQQYYSNNVVSSTWZY[][XURRVXWVUVWVVY[\\VTXTTb{qbdcq~zyyz{wy|zuwuf^ire\oxw{mfjqlikhhqropi^pvlxwmcbghbe|Һ}{yqtoy~Vfsmojfnmga\l{xv|xurnfejllkf_\x{dqswyywkdyβjurYZ]bbglgbfiai}}qd[VUUTTUUTUTSTRSRNLRVBrhBFNMMH_tfkposx|w_RRKMPMMMJKQPLNSSUUSRPQRSOMjmPUTg}e^dnfUMg_SYUWWRRQZisTQW[Wk`bfeZPSTXcg^Շܾ`dlqwvrpprl|cORVWVVVUW^badoqrxwnfZRSUQNUXYXXVVKJSXQOQKJJGGIIGGLT\]^`a^ZXVWUWYWVVY]]WUVWWUTTSQQOPPNLLLKIIIGFEEGMPQTVUSRRRPOOQRRSSRPQSRQQPQTMHIJIHJIIIHGHIJKKKKJIIIHHHGHGHIHIJMOPNMMLKJIDIKLHHIJJJKLJGGGHHGEFGFFFFFEBGW`VRUZZSSMDIRRLCGZ[^ggfcrnJAIGFFFFDBFJBMqtSGLKGGFDDDBCDFIKKJIHHKMOOOOQSaiTACIHHHHHIJIFCADGHGJ;L=BDCCBBAAA@????????<<=>AEIGCCDBBCCDDDEECCAABBBAAAA@BCCAAA@??@@?@?>=<=>><<<<::;;;:;<>@AA??===@A@@??A===@CB>;=><:=@?><<=>=?BEKNMGECBFGEFHIA;731257789=?>;::;??><:AKNFC8999;<99:;:9:879<=>=@>:8>A?721432112138=@?<;<====<::<<=@EB<@CH::>GECCDE?=@DCBCCDDDDEE;7=B@>?DH@;79::;<>?AA>?B><<;;:;<>?BDCA=853566666554359<@EB:46:?>95468998:<><66ADAA@AA@BCDA<978878778:<<::DMKE@?@?@??><>CDCbojsy~kM@>ACDDDB@ACDEGHEB@AFJJIIIHHD<78;=>??>>EB588774479;;;<=<;<<:89::;==<=<523333467776888:9976455666688657889;=>=;::;::8656767787888777888998999:99;96GO<26666654-4LTLJQ]hdRA;89<>;962247889988<;<9542238=ED434:98521/.03<;53334432122/1112332226;:410//121110=@+%+1767::971;gj:1/,,+$%5CDW]?23-)2>;5343-+,,0@F:<<=;:=BA:46789:<>;4,/;9=>54<=847;6/052//452////.-0:4'(-.,/9GJ?324/142/00-,2=E4(+,*,1;>94321-++'#)-+)/0,+*),//..-3?V{m1'+,,-./0.+,-2=;2..-/5:<4/Xk<0;=746?FD?LZO900/9LMAALO7.35995-)3HM<,,,...7;8634764589:;;::8@]so_RSWQHEEMS\ksjS=:@=?M[a_XJ<:@C;37;2.256437::>BCELK?2-27=BNQPY[LCCGHFA9/'.;96AJC94572/1@QUME@9952;BCCBAABCEIGFLV]\g}vkQU_fjnomnnnoppooonopppprrrqpoprnia^gldciibZY[\YVSRQRSSSSSTSSSSSSRQSUUUUWWWVVTSRSSSRUXXY\_]\\[ZZZXURNLJKLMMORSROLLLLKLMQTTUVXVW\]XQLNRPMLKKNSX[[ZYXVURONLHGIKSSMOTTUVQHBEKJHHIHIJIIHGIOSPLLLLLLLLLKKNONNPPQPRWahijopkc[WVVVU\r_PTVWWYYYXUPRZa^URTTTTUWW[_^ZXXTYbmoibs~}|vrpoou|ylgnrojicoxdgs{|zumiijjnqiYYyqvwikq|п{yxu{|rlqdhngdglojbco{{ysj|zzvquoehnmjcZlq_iiffgic_bkھfxlRQVZUWhmmmll|vuvxufYWUTSTTRQQPRTUZ^R[aNIJMOPJ\linhiu|rcSNQRY]YVVVX\_ZTUTRQQQQPPQSNOu]US`dPWfieTMgpUVZTQNPUg{jKUVYTcoJI_\PQQRTRMoիpajt{zwvuvunrrZQUYVTUY^_^cssknk_XVTSRSPPWYWPSYQLOQLIPVPNLLIHGFIP\_`ab_[XWWVVWWWXRPZYZ[YWWUTTSPPPPOMLLKJJJHFFGMTUSPRSRQRQQPOOPQRRQOOQPRSSTUNIIJJJKJHHHHFFHIJJIIHHIIIIIHDIKIIJLOPNMMLKJMGIKKIJKKKLLLKGGHHHHGFGHHGFFFEFGQNDBISE@A>AKQRNL\aaihacdJ;DNOIEFFCACKKEPooNJMLKIHFDDDBBCEGIJKJJJLMMLJKOWe\HCIGGHHGHJIGECFGHIJ=rI=ABBAABAAAA?????>?>==<=AGHDBBBBCDDDDEECBBBBCCBA@@@@ABBB@@??>@@?@>==<<<=;:::::<==<<>?@ABAAA@?DDBBBAABA=;;>===>=;:;==;;;<;<<HGH:;9:<<:989989:;>?A@@A@<;<<<===<::;<<;?GD68B:9:;;;:9<<::9::;=@ABCB>9532357887666777;><717;=>>:79;;;;=><87:<@AAABDGILKGC;7899::9:;<::DLIB?=??ABBB@BC?@anmtxyR<@A@ABBA>=>?BEDDB>?AEGHHIHHGA968;===>>=AB9677743689:<===<=><99:;<>>>>;41333125777777898876455544566568899;==<;:;;;:7667877778:988778889::99;;98998:=:777778982.=QRT__UJ=3324;BA>:63.,.3779983695.+,07AHD3+3@?531,.3505@?6222233222101012431..01//011334568;8,(*-125799:7357//121/-,--0AB3..))/3/5:8642108?<;8<>>@AGE94557<723?NPS]K0(,,1HXNELJ=037228<;.'+BFMYbjjchj\HBAEDJYenfI6=ELVVPKC<=I\jhJ584/66679<:8>EB=DJC:9<972-*264?UaZG6452.6L^`]\WNI>5HacV\aVJILLMI=78;BaU[dflpnllmonoonnmmmoppppstrpqqpqsm]Udm_[gle_]ZYYWURRRRSSSTUTTVVVVVWXZYXWWVUTSSRRSSSRTVUTY^]ZYZZ[[[YTPNLIJKKJKLKKJKKKKMOQTVWYXWZ][WPLOONMJIMSTRONMLKJKLNLHHJIKNPQQSUWXRFBGKKIHHIJKJIHGGKNMLLLKLLLKIKMLLLMNMLKKPZcfjnpmfa^WOY`RVWWVUWYVXbeb[RQTSSTUVUW`da_XVTQYgnmyzwypmmhgntqkkiivtf~zslb[^`_^nyqqw~Ĩ|yvvxqsnddhfeikptl^^myxxvsvxlpt|rv}|wqy~mfnpjahs_RWYXSQQOOONKc†k~uTMSUWWPR]_Zaswimw{}yh[XTSPNNOONNPQSVWUTSPPPORQJ\fdjefopfYRZgkkic_^]`fie_YROQRRRRPPRTOYwsZS^qQO\dddXUb`XVXSNVjz~zMTVUWTORdq{fVJQQOPOTMNNj`botstttquzn]ZraOSWUUV`d]djeb_YURQQQQVLKipmVISQPQRPHKVQONNJHHGGM[a`_ab]ZWVVVVWWYRLV[^b_YWWVTURPPPONMMLKKJIHFJQUURPQQPPQQQPPPPPOPONNPRTUTQNNMJLLLKJHHHGEEGHIHGHGGIKKHHQXMIJJJJMNMMMMKQXKGKMKLMMMNMMKFDFGHHIHFIHHHFGFHGFGG@FWL?@BCINSVQVbjlddhRBJJJMKIGEBACHLJGUk\LLLKHEDCACDDBABDEHJKKKKKLNKFIP^bPEGGGGGGHIIGFHHGGGEAFTAAABBBBA@@@@@???>>>===>?CHHDBCDDCDDCEECBBCCCCCCBBAACA???@@@@?@@?=>===<<;;;;;;<>>>>=?@@ABBBBB?DEBGEAAEJFA=;;===?>96:<878878::;>BKMKLJEEEA7//3:@CHIIECBD@:75546668938@B:=;9<<<;99:99:;??@@BAABB926557841/1138>@=;;<=<<<<<::;<:6:EK35899936?EB@><<<>AAA@@@???@>:;?EHFFDA=<98>A==>??>==<978789;>>>@BBBB?;98:;=>>=>>==;9:<<278:=AA=9:<===<;=>?>?BCDEEGJJLKIA;:;;;==98<::DLC=;;=@@@@AA@?<=]lrwypE7@@???>==<=>?AA@A@?@ACFGGGGGB:78:<===>>;BG:8;8448:9:<===;98:;=???>94212202467777777666445544555468:9999:;;::;;:87789::8769<;:;9789:<=>>=@?:53479:;;;;989;:913I[c]G78:8755:@@===7)%1324:653463,*.06=?6-,5=<11017@<46BK5210033332210123442,))+-/023456789:5-*-.0478;;:85.,036731210/0620/.++,*-;A:69854226<;?BCFG@;85238BHA71-'1VU;90(*+/4976850.1200.-,-..//03620.+.=A/''-132/--)(/673/+,,-..3852443/--.,++**,5@9/)*+-,,,/;E3,~:)2222211//1212/-./0335643.L`-&473026FORYM2*12.;TQ??B>:133-+/1.,*%%4EB6-+,/1,/APOOOKA=>>@BGLNJM]egdbZNE?AADJPY]M=@GHGB@>>@CHMYtqT3%04569<;68AB;77:758;??>>>>>><>?>@DFFDBDEDCCCBCCBABCCCCDDDDCABA?=;;<=====???>>==<::;<==?@??>=?@@@BCBBCA@ABCCBAAFIGE@;<==@@;8:;6311379:;:;ELG@@:998679;@EJLIGC@@B=:86678767967:97BG;=<=<;;:8888>=====<<<<<;::96327A7;<==7259<=>><<<=?@BBA@??==CFE@?DCFEB>>@@?=;;99:99::656568:<<=???BDCBAAACCABAA@>><:99=99::89?@=<=@AA>;=>@CEGFFEEGHHHGHEECA>:;<758:>><<<;;:;Yksww}b>7=<<=<<<====<=?>>?>>>@BEFEEEDA<8:;;==??8>KC88758<;:<=;;<;<>>:879:7544433346654455554434444676469:9999997999;:878:<>>:75:=<<<;:::;>??@AAA>:768;:;;<<;99;@B50LfS=857987669;===<;429712@><<862,,/04640-15841016=?78:@A95/,-03332210/02242.+++-/258;:876530-++,/48:9:9945954697685/2?J>3/('+++4A?9897541/5<4+.038;841/,))+,-------/132/..-),99('().341,,-16753258:>B@@;2.3<<34>:.++,+,4993-,./...2510,\e,*222232201485-)()))+3::/*/95)+/0/028A=@E=@A:11:B:..08;998630/-,+*('2>9,+.39827Rif`ZF8;-Bfieh[B4678?MWXhfHTshK@>615NJKLNONQZQKLKIIKJOew{qmgK?DDDFGGHHIFBDFJJJIJMMJHEDB@AAADFFDCBCEDCEHKLJKMLIILZcSHGGHGGGGGGGIIGEDCAB>ADCCBA@?@@?=>>>?>======BDDDDDDFECDCBBBCCCEEEEDDEEB?>?><;;::;:::<=====<<;:<=>>@AA@>=?@@ABCA?@AA@@@ABCB@EGGE=:;<==;:9943138<;:;:9:A?88788;>ACDDFGGGEC@@?;9988987889899=BKL:===<<;:8557:?AAAADA4454567764447<==<=====<<;<=>:753413;>@CA93357:=??>=<=?ACCCCCBCBEHGA?CEDCABBDC><;9764346533333346745569<<<<>@@@@>??<:899878::99856;@BA@AE=::9:?FHFFFGGHIHGFFHHFA:79626;=DC;:::<<;:9997899SjrusiI79<9:<<<===;;<;=<;<<<<>@BEEEEFG@88;;:<;::;:::8555644555544444446766678899887556:;9779;=@?=84:>=<<;;::<<<;;<>?ABCA?;85589:898?><82-+.=FBFK3-.+,.-,.00/12100130-32=@)-0112110138=7/-+**(&,7;20320565009752-15>LF3-13/,*)*2:C@==7//0.000,*47.,8@?=<48Zsm\B2487117;<93/6GOB7KaR<@F?645437:5123210//37;AC<65631..--/397.-Bbk\CKO1?sylK/,04:FNKQ\RRowS?IF745434.5_E\_b`fnqpqjaahlmnpsqibeospnmmljhiifegdUN_hZOP[b`WTUUTRQRQSSRSTUVVUTTRQQPONNNNOQQQQQQQQQQPNLJPSQRRRRRRQRRQMKKJIIJKKLMLJJLLJHGHIMSWXYZ[ZWTPONLMONLJIIIIIIHGIKJIKLKILPUZ`cdfh^H?CFGHHHHHHGGGGFHLPOKKKJKLMNNMMMNNMMLLOTY\ZX\chiigh_T]g^WYYXZ^aa^\`bWJwzNSSRWYT_aW[Yah_WRTUX_dhjmmkszpsofgloomlkjhjlt}wn[mngaZXfxz{{qfefhkmnpxnY[`hmh`]bls|xleğ|sor}p`kghlkmnkilmopsutvwusuvznqxwqmuzzzzxqw{kchhR|bZZitywvopqyuo}iZ[_ahh`WTVVVUVX\``babegggfb_UONLLMOQQOMMNNORXZZYWW[``\Y[]]^_`aa`]]agkmlid]XWVTSQSVWWTQ\_UTQQ\a\WVVUPPQOQ\ft}unlON[[SZVN_}|lXQPZZCiԟi_fggjlllifeiXPXUc{cWSV\a`QS^OGNQOPOOPPPObaQTSOLJKLLJONNRNMLGIU^dc^ZVUUVVVWUSMOVSMNXbc^UQSUSTSQOMLLLLKKKJJLNOOOOOOOPPPPQPNLLKKIFGKKIIIIILONLLMKHFHJJJHHHHHHIKOSUVPGGPGHKJJJIIIJJKKMQSRPPNMLLMLKGCCCBDEEGGEDDCCASKQRQNNPUUNIHIKKJNl|qeSCEEFHHHHHHHHFFGJKIJKLKHIIFDDDCCDEEDDBCEEEFEDFJKKJJIEOc\IDHHHGGGGGGHHEDCBBC@@BABAA@?@@?>>>===<;=>@AACDDDDDEDDDDCCBDEFFFFFEEDCA?>====>>>>==<<<<<<<<;;<=>>?ABBA??@@>@ABB>;@?>>>@AFGDDEEB>;;<<;;;;;7779=?=<<<;<8:;99;=CHGHHFECCDCA?>=;:9999878989<@HOG75=?=><<<:747:>@ABB?9675567776557:=>=<=====<<<<<:842258=@BE?;5347:==>??==>?@ABBCDDEEGFFFCAECBA?<96676432/-/0/././..-./**.03779<;<9;=<:;9536765456555337=BB@BA98:746:>BDGGHHIJHEFHLHA;7:835;@A>;99::99899768;8Mio|rM9;9879::;=<ADDEFGHC:79;9;?=:47FB6679<;<;;;<<;:;<;605>@?<:89<>A@@?><;:866655544444457777679:;:998657::8679;=??=;8=;;;:::::99:<=9524679:98BB==66;<98889::::;<==??>;>ACN[=341.-,,,..0003535::9643.0520//.-,-./01221//023322122124578767850,+.../0147;;4+-.-/8:468/-,-/.//44..39841/,+/4623?PZR@4/-++/4551;A<50*(*'*9@<9;:60.,/52-+,--/.,*')+*+*)'(% 6R<5?BA<;=;2.371.7BB@@81/-..,+4EOSE').+/0-)*,-1531134420330.+.011110/039>8441,+-+*08@?56::::4/790-+-14=:0--.)*+*)(3AHIMI?94../-++0346CJE=><-4`x]8.0-3BFD>@B=9::38\mQ4AXSE@6/0319OY[Z]fprokf_\bilkmolaZYY^ionllke```_agg]PP]bWOQW\\YSQQRQPQRRRRRTTSRQPPPPOONNNOOOPRRQQQQQQQPNMLNPPONMKMMLKKLKKJJKMMNNNLLLMLKJKKKKMPRSVZ_de`YQLNONMMLLKKKJIJLLKKJJJKLPTZbfedhmdPDEHHHGGHHHHHGGGINNLLLKJLMMMMMNOOMKJKLORRONRXZZZX^e`ZXZYZ\]_dihfda]VThgUWXXje]g[[Y[]Y[Z[XWVX[^`cdfkpnjotrklsrnmkjkjlmxuvie~z~|mWVVbzmkiahqv}ngcbca_a_bhytk}potrqx~ooa`bXdlihlpssuttwwsrtwztnmlpv{z|{up[g_Hwntxupqstvyp\]eih\RPRONSVYZXY[^`aaa`aa^[WVTQQOONNLKLPRSUWXWVUTWYYYYY\[\_`bcb^\_dijjgc^[ZYTROQVWWSPUa_USUYYVTONSUTRMVbehiabgucF_fQ\YQRtrprniw|qbZWMERݸ|^cghknoponns[LURMN_ml_RW`fXNYXLIOQOONPPRRBaXYSRNHILLIOSOPOMOQMO^ec^ZWWXZ[WTSQPNPTOGGRafc\WTSUTQONMLLLLKJIJJLMLMMMNMOOPPPPNLLMMJIKLKJHJKKKMNNMLIGHJJJIIHHHHIIJMONQPSaUFHIILLHHGFEGLVXVTRQOOMKKKKIDCCADKFABCDDEFQKSRPOPOPTVOGFKNKIOozhOBDHGHHHIIIIJIIIIHJKJIHHGHHFEEEDDCCDDDCBBCCEC@BFIIIGGEEWcN@GHHHGGGGGGFDCCCCDB?@@AA@@???>>>>==>?BJMMDAEEEEDDDDDDDDDDDFFGGFFGGECC@>=>>>>=>@??>====<;;::<=>=?@ABCA???@?@BBA>?DDA>@@ABFHFE?<;==;;;;;;;;;<<>?A??A@:::;<;;;:999888898:KWKJ>19??=>>>?=<;;<>@ABA9488756776678;=>?><;<<<=<<;;:85215=CCCA=86247:===>?>>>??@AABCFGFFEEFHB<>CA?50/-,.//.-,--,-----..012/*+-158;>@=::;:7652256642311212336;?AB?76:865339<@BFHKLHFHIJG@=;:964:B?<:89889987777:?8IlwuP9::975566667:BID@>>>=<<<;=ACEEFHIH?8797:>>:55?C=889:9989;;;;::::613;?=86668;>??>?BB<77644554444446777789;<<;::9767::867:;=?@@@@???<;;:;;;;:9:;<<;;<@CB?;84479=???AB959::8888:;::;;<>=>??=9014531.-,,.0/.--/023311221222222233566667775238725764348:4///-,>L7-2/.+,,,.131.--0242,*.2562.5JSH73/.+*,--,+,59988<:456-,.,-1485-)+'()((',>JJIGC:2---+**+4>ADD@;84,#8g]0+3//34780/463499675:>888JGIPTUF57==9:5=rzF48AEHLG;83,=UD+/IRLF>56859@HITXdmica^[[^aegeee]USVWWZahkkje]Z[ZX\ddXLNW[XQMPWXTNMOPPPQRRQQRSRQQPOPPOOONNOOOPQRQQQQQQPPPMLLMMLMKIKLJHHJKKKKLMMOOLKLMMMMOOOONLKKLPVWY^^WOMNONLMONLLLJJLMMMLJJIJMRTW^cdcbgpgQHHIHGHIHHIIIHFFHKLMMLKLMLLMMNNPQOKKMNNNMMPTVYZVSX^ca^^^aa`acdbdd^_nk]Y_e\}{s]`d_lcV[a]ZXVWZZ^cbaeiknoqrrrpmkjjkjlovxxww|u}mg~cS\]r{tv|}y~lq{ynfjd^Z\\i~}tp}ldn}|pku|tj^ZSOV`ciltuuuutvvtstv|okxvwwxqp~eaf^brstwvttsqprrmrnjb_gf\SNNNONQZ^\[[[[\^__][XWVUTTWXXVTROMMNQRSSTTTTTSSRTVVVWX[^`aa`]\\^``_[WUTVYZWOPVWVUSSY^^[YVSSQP\a[WSQUXXUOLNPhrTLheS`XSIbwmhlpq~jgsteG|ȔibfgkosuvtvhKSRPRRRj|dP\e[NNjx]KNOOOQQQSIm[kfUXTHGLNILONPOOTYTMZgf_ZWWZ_^SNNNOOMNNMLNXbggaXSTVSPPONMMLLKJJKKLMMMMMMNOPOPOMLLMMLIKJJJJJKLKLNNNLIGHJJIIIIHHIIJJKHGIWk~\DHMGBEEEGHHHLZ`YVTQQQOMLMNLEABCGa`G=ACCAD[IWPILPPOPRQHCHNLJLc|v_HDGGGFHHIIJJJKKKJHJKIHGFGFFEDDDCCCBCCCCCABABCDDCEIIFFFCPbSAEHHHGGGFFEECCCCDDB?@@@@>=<=>>>>???@DGOMHBBEGGGEDDDDDDDGGFFGGFGGFFEEDA=>@A@@?>?????>>>=<:9:;===?@ACB@@@@A@?@BBAADGFEB??>BFD@===>>=;;;;:<<>>>@ABBBDC><<=@EDFFDBBA@>>>>=;::;99999889887GZHF:9??>>>>???>>??@BC@7/378877887788;==>=<=<<<<<;:95213:@EEA=7111258<=<==>==>?@??@BDEFFDBADD>;>AC7//13425987776786332224:>A8/,,.4;AA?;78753212444312/032332358=DB85676544678:>CJJHHIHFCA@><=;5:D@;:99999998777;?6Ft}\78<878754554469ADAAABB>;<;;=ACDFGHJD95668==966;@?::9887679:::999972/7=73333356899:99;;;;;;:;;<<:::>DDCDC:2349?CFJF=88889999:;:9::;<=>><===@C9;70/.,*++,,,,//,098.-14541.-,-.///./012321231/00111123456777765459A<4<@<73256521014CZE,-.-++**)*)+00223576124551+,3?F@2/.++*+,+-.176553-160,6<>70-,+-15741-,0/-,-13.*)+15:65I>5LO<4?IK;,%%,3637AFD8.6E=21000.*)((+0/,2405<;633776533650-/010000-/22122330.//-.?F>65446;>646/-,--0564-*,,((((&*>LJF=30/,+,****0@A:6143**&&DL++:51-+2;70-069;>?<;934:AFFD@=999?>=>DI=/5EU\SNJ=;=B?95478570+-17?@><40:>@IJGG@3:LQJJNOYZE6<<331FL7BEDEDKPD76:FG=5FM@97018::>@=4W^h`URTVWY\[]_\ZXTSUWXXVV\diiea]ZWUTYaaVLKS[XQNPQROLLMNOPPQPPQRRQPPPPOOOOOMNOOPQRQQQQQPPPONMLKKKLJIJJJIIIJJKKJKJKMLJLMMMMOOOQPNKJIKNMKMOMJLMOOMMOPONNMLLMMMLKJJJKOSUX\^`_^dgZLHGGGIJIHHIJIGEDHJLNMMMNMLMNMMOQOMLNONNOOOPSW]bc`\\`bcdccb`]^_]``ajlb[diZt_hp[lfSY_`]\XXWV[a__dhhggjlmmmkjjkkjlsxquw{zvuws~~d\mtn~~yyzxznpw~|ic_XRWZ[enpmu|v|{wsjdc^ZUOSTSTUWY]\h{yuuuvvuuyu~ɮidaceaY_qlccw{~~s{ccc\ROOOPQUX[^^^]\[ZZ\]\ZUSPMOQU[\ZXXWVQMLNNOPPRRQPOPSTRPQV[]]\\YVVTTRRQNNNLNRYXXXWXWUQQSW\]TOQRSVfdSSTTSSTOMQPMTXUVY\TXd\XSN}{wx}lo_Uѩ{hedgkouxxy{XTRPTVPTr~bU\[TKc}VNRQQONNORMnSicPWUIHLMLJJLOORXWNHUikb\XW[[RMJJJJGGMORUTVWZekeYSVXTQPPPONMMMLLLMONMMNMMOPPPOMLLMNLIIIIJKKLLKLMNNMIGGIJJIIIHHIIJLKIFAGftVCIXVHEJLPRRMO[_ZWVSSRQONPQMGCCDHbtbFBEA@MLIJPWVNNMHHQMBBLMJLdwcIEIGGGFHHIIJIIKJIIGHIGFEEEDDDCCCBAABDCDDDCBCEFFEEEHHGFFCGZ]HBGHGGFFFEDCDDCDFEB?@@@@@><;>AA@AAABBCB??AFIHFFDDDDDDEHHGGGGGGGHGFFFDAA@BCBCB@?AA@???>=<:89;=>>?@ABA?@ABA@=>BBBBCEFHHCB@?@?=>=>>=;;:::::<>@AB@?AA??>>?ADEEEEDBAA@><<<;;;;:999998899737LD@4:A><=>>==?>>?CCDE=-*157887887778<=><<>??=<;:886226>CFC=:51012469;<;<<>==>@A><=@DDCDA<7;97;B@632348::>?>>>;8643339DGB;5/)*4=>952353322245467669<;:765544;B>646666577768;?@DHJHDBAA?=>:5=F@:;:999::::98:==:Q|xI8>;::97558988879@ADFGKE95557;<:977:<;::9886578:9988960.6<7222334345668:85554355554446788889:;;;:::986787668:<<=AFGED?;::9:::::::99:;:9::@EDFGB5-.037>FD=878999999::9::::<===>>>>>;950.--+)*,--..,*0420102122/..../../0222221331/..000234456776655444766?C>8235886009AHVQ;+-,++*(('&)/-3<97A6,+/5;;647639;1333.+.47.,+(',?QMB;0+++***+-.1;8.*(/1,*,'+5)*8620,3<<627>>;?ACFA836<<:;:;:989>>>LYSB:CGEDA>32310221.,.14>FIG:1>9666X[ZSPPRSUVWWWXWUTSSTVXYXUW^dedb`\XUTSV]^XPQUWTQONOOMLKJLNOOPPOQQPPOPPPPNPPONONPRRRRQQQPPPPONMLKJJIIIHIIHHIIJIIIHHJKKKMMNOMLMNNLJIIIIIIHKNKKLMQPOQRRRSPMNLIKMLJJIHJLORSRUVVUVTMHGIIHHHGHIJJJHFFHJLMMOQPMMNNMOPPPPOONNPOKJNPU_dc``^`fhfdcba_]Z\\[_a`_bdb_ttTprWbc\__`b_\\^_[\`bdeeeeeeegijjjllfk{ywzuplgjwumx}{{}}mszwszsgie\VYZYX]abhqpuzd[kpiYOQTUTSSUWSSQUkxwutvvvx~vu{w]Z[ZSYqsuoYj˿t{ysq|ti_XWUSTTVXYYXZ^`\WUSRVWVTRQPNRWX\]]\\^ZPJKLMMKMNMOPPQQRQSXZ\^[ZYWVTSPNLLMMMMLPQRY[YZYONRSUWWSPTY][RRTUVZ`be_VVPKMTWSPNMRX[[ZSg}~p}|WaԹnb_`beiosrwpUSTTTUQQkz`RX\RR[aZOPRRNLMPTK^aQNff[VPGDEKOOJJNOSTOHFQhof]XW^TCEEFFC?EPUXXVUROR_jfYSVWTQPPPPONNMLLMNMKLLLLNPSRPMLMPNLJKLKKJLMLKLMNNMIFGIIJIHGHHHHHJLIFD>:::=?@BB@@A@@AABB@==ABBCBCDFHIHECB@<<<<=<<:<;:::=>@AB????>@?>AFECDCCB@?>>=<<<<::::988889::;846C<55=@:8;=<=>>>>@DFEF>78577776776558<==;=>?A?;874435;@CB?:545313568:<;;<;==<>AA>;:>BA@A>50226::50243568<<;<<>@@?A?<:87615?BAAC>5,+/55546566788:;::<=;9::97656777<<866655455665656=7N~gEEA<<::976:=>>>>66ADFJF;77669<:9756:;:::9886577688896/.48422234433310124444344444466899::889::;::::97665579:<;;AFIJE:9<<;;:::898658:99869?CHJKA3..039@A<87899999:::::;;;<<<>>>>=<:62.---,)(,/0672/00032010121000//./23444421330.,,-./2455556655436::869>BA725><;900HVMLQH6-+-+*)*+,/.*.;<9=>;741/,(().31/11/5::621269;??0+?ME?<1*'(((**++.340,/8940/17<=:55;63FB+;E>66637?A8-0@JID?@=-;fW8132/-++)**,2987776431056468861--..-,+)*-//0223432330,-2CD5/33343116;>BI?771**/8@E<0*).@WTE@;1-+*))-/1362)&(-3/**(&)))/36655>FCADD>;=?>@FD8037988;<@CA@@=;;:9BSVF<@DBA?:2165200.,,07BGJJJB;<>F_ssZA:>=;;?FFC>=>==??<`nQ@77=DHGJH>97/.:I[[QPC0+2EPJ?997QQRSTTTTTUVVVWVUUSRSTVXWWY\^_^\ZXVTTUTSX[XSQSSQQOONNLLKKLMOOPPPPPPPPPPPQPQRQQPQQRRRRQPPPPPPOONMMLKKJIJJIHHHHHGGFGFGJKLNPQPONNNLKIHIHIIIJOOKJLPQQRTTUURRTMHJKJKKJIHGJLKKJKMKKKJJJJJGEGGFHIIJJHGGGHJLNPPNLMNMMOPOOPONNPOKJNOPSVY^ghfffhfcbcb^]\Z^ba_`_Z`_jub]qi\kuwumknaVajlk`_dec`bdehghgghgkmhnugw~}xyztky~{yv}yzmt}agolbcnun`YXW[_f|w]ZgqmaVWYVRRSTSSSQSgxyvvvvx|xrwpdllZXVSUU\u{ywh]qu}|sosniidiqk][][YYXX[[[[Y[^^YROOPPOOOOU[YZ`da]\\[VPNMLLJILONNQRRPSYbe````^_aegb\XSPPONLNRRQRTU[QZgXRPPSVX[ZXXRTTRX^fdb^_ZS`aQQSPMMOMMQRQNosfw|zodq[[^^`adeedmmZRTUUVWXYir^U\`ZVTVYYZ[WTTRRQPGMRhmiaZRGBEKOOMMMNOLJMTbni\WVZNAEHJGBFNVWXYWSSPNSahf^VVVTSRQONNMLLLLKJKKJKMPSVVQLLNQMIJLLKJKMMLMMLNNMKHHHHJIHHGHIIIIJLNKHJIIHGN\_]YWURPMPXZYYTRQQQPPOPMGC@ADADUebMOSTAOddT[[XWSKGIJNQQK_tZHLKIHHHGHJJJIGFHIGEEFFEEEDCCCCCBCDFJMICBCFHGJLJHGGGGGGHGDBIRMEEFFEEDCAACCCDFFGFDDFHKLLMMMKHFDBBBAA@??CFDCCBBBCDDGJIFFFFEEEFEDFEEEEEDFFEFFFGHHFDCDCDA=<;<@BDEC@?>@AABB@<;@A>>?BDEFIKIDAB>:99:;;;;;::>>?ACDEEA@ABB@><;;<;<<<:999988899::;:99=;8@>A87>>===>>@BEGEC@?;:98788766658;<===>?A@:6546=;89=A>==84216962111133347;=@AACCDDA???=<88@BBBCFD:0,/8BBB??>????>>>;<8434566569;:889888764446656657=AC@?@@><<::AC<:<;:;;;::::<<;<6PvUBHA?><<=?>:;>@EIC:8;?A>957:::;;<=>@EF@;9655897766899:;;9984454666773123322234332211113223433334588::9::99:99:::;<;843468::99:@FLG;5:=<<;<<7034214899::87>FJKH=3048;AA<:;:998889:::;;<<;<<<=<<=<:4,(*,,,*(+/4?@:5/,,.//01232111/.21/355663110.,,,,,/1466545654336;;9;;/)**)+-/0///-+,1/,,18@B=735=:7E@)8EB8+*,1=:975445531/2BRNKJHGF=5AfoB5437=ENRTSJ>:9?IVSN][D4C^e`XSJ@CEDCCCBBDEDGIGGGGFFEDEEEEFEEFFFFEEFEFGFGGEEGGEBA?=;;?DFGJKH?:AC?:9:9;<;;<<>?@ABA?=>>?AGKG@>>?@@=;::::9;;::9:9::999:::;;:;=??@>>@CFGB?;95666688667757;>?>=>>>=98;@CJL@8886654226799;=<<<<<=====;978<@>=:558:<:42101233335>EHFEFGGFFDDDCDDCDBBB@BEA<:427=>@CDA?><;;;765445667788;:979::998666556666568<>>>><>>>?A>:9::;;;;:::<<<:<5MjKCHBB@>=@GF>:;=CMPH<6:?>94689:9::;;<@DC>973267766788::;;:;:63233455554443233344433444443344333357::::999:<<;;<<<<<;8557:>>;989;BG>56<=;<<>>4,.//02579;;98:>BEE?86;>>@@<9<;9877889:;;<=<;;::;;;<<:81+,+,--./.6;996/)+-../012210/-**(+03456420-,+,/0146633534544458;<=;;=9201;DI?4/,+)+/12211-)++''0A>13><761257@G=,-75@jH/6521/+(((((,/3441146338:865-()*+..,198664460)(()*-1126><1*1;72012.'$&(.DUL@>>==3+-,/4;GQE/./-/20+**++-3-&'*1770))*))/78788;=<;88:999:843;@ABDC>:4102551/26>JKJIHIJA4>jT-6:;DILTSSYWJA?ADFJRUYVLIME?DB/+@MK@==A@ETiaGL`bbc]L9ZZXVWXWVUUTTTSSSTUTSTUUVVVVWVSRRRQRTSUVROPQPPPOONOOOONNOOOOOOPQQQQQQQQQPQRSSTVUTSSSRQQPPPPPONNNNMLJJKJIKLHEEFFFGHHHGIKMNMMMLNNMMMKIIHHHGGHGIKIJLJKRVVTQSWYVQLIHHHJJHHHGHIJJJKLMKLMKHGGGFFFFGIJJHGFHIIIKLMMMMNNNMMMNMKMOPNJLPPPY^ZTkgU^``cfijjhhjkjhgecmzuheauwnuZenlvrgc|lgulX[cma`eXdjp{g\lww{wm|}~}xrrvx}gese[VR\ddfc\fp`ONRQORSSTUUTT`t}}|z|zaVX]iwĢrw|in{rorotnlvxvnc`dfghfedcbb_][\[[[[ZZ[\ZTRRRRPPPNMQWZ_]VTWYWVUQMNPONOSRLR\_ad`]_bd`[[\]abed`\Z\_bgcXSTQQXIwbHTTTSQQU[YVY[ZUUUTTTXWTYR]QdkPLPPOPOPQNLJLMOULFRYcrtvsmklhy[F—pa_\ZZ[Z[YZ_YTRSWZ]_dcaie[Z\ZZZZYYYYYXXVTSQNQZ^`cekppgVE?@AEFFEEGHGEDDAA@??????BEEEECAABDFEFGGHHGGGFFFEFEEEDEEDDDDDDDDDEEDEFFDBDCBAA@@?B@=:>BAA@?::;@?<<<@DHMLC96>DB=::::<=;=?@ADHHC?>>??=;:::::99:;::;:::999:::9::;===9<70+.?@<=>>?BCB>:666766777557758=@A>==<:;=?DJLH>335555579:;;<<>><<<<<====<999964455554446887787899:978:::;9899767655557::;=?BBA@>=<;;;:;;::::;==;;=7SZ>GHCDB@??BGG?::8:?A;8899999:;<@CEB97535677679989;;>?=85224344444554334334455555444444344569;;:999::<<=====>>;868;@B@>;999<>76<>=<<=?>4/../11135778;<;;<<:9>?>>=?=:::9887889:;<=<<;;:;;;<<;?B;41/..3851204683,-/////0101231039502335420-,--/04?EE=347533346:CD>56:2+-0AK940Dm\6*12/,./012223/)*/2008?B@<;;<>>>@?==;9;@?9:?><>GKB8:98721:@9/12+),266532-))+(*6FMH=557::81748<:884,)3:BV<0331110/00+*)*-14212426;;51/)')*,-++6@:3.,362*+--*(*/36;62/2;<5<@70/1346AQH===82,'&+3=EFE:,++,/00.,+++,11'%)19;93+)(+,05<@:302345559AHF>62;A<55882/7<4=Zd_\[RIOUPKKFEED@7.-..053.154=MKEEFE@56QX3-NbmwiSVVNTXNDA>@GNSUVWURMC9;A5/=>@ACFGFDDB@ACDEFFFGHHGGGGFFFFFEDDCCCCCCDDCCDDDDDEDCCDDDCB@==@>;7:?AA@?:;:>>?=;;AHML@78=A?=:;::<<<>>=<;>EB?BEEDA>>>>><;::::::::;99:::9:::99988:;;9:::70--3:::>>?AA=<97788:986665555:?BA=<<;8;CHJJNE5.044445>DEDCBBA>>=<<<==;:989:<=?=;<?;;58<:41354444344557667779::989::::989998863555788:<@DDD@;:::;;:::9::;======;9?HJKI?68BD=:<;989::<>@AB>98766776798667:?CA;63333224545643445445675455554443445689::989:::<<<=<=>>=945<;::<937@?==<=>=720110//01126:<;8964;B@>?>=><88;;98889::;<;:;;;<<<==<72/---/00124=A@BD@=DB:8AF?8:82-*+156356,(*19:82/+)+-/28JQE::F>.,)"1RJA@IKFC625:73593/024.0Oc_[^UEI[bTB>BEFD=751139=;6535><37<;:;97,%En~\VSIMULB>;=DNVVTWYSID98D55`oRBG=KbjplbN;3/+SSTWWVUUUUUTTSSUUUUUUTTUTTUUUUURRRQQPPRRPPPPPPPPPPPPONOOPPPPOQQQQQQQQQRRPOQSTUVVWVUTSRPONNOPOONNMNPOLLMKKKKJIHHHHJKKKLLKJIJJJLMMLKKIHGGGGGGFFGFDFGFDCGHFILNNMMLJKMLKKIIHIKKJIIIJLMMMMMLKJIFDDEFFGHIIIIKKKLLNPONOQPPOOPQRQTYMYxfTQXR]``YQWY^`accdhfehjifhfgicgrzfeylpqhzveZ^SÉhn\_`llfnyk]qxy|vtosy~ztz~jgimtpuubnwgRSqhTcqiYPORRQTVVSUWZiƑfqpXĴ}]fprtvvrns}uǮowwe]aabhhedbba`a__^Z[XRSV^ebabec[ROQOLOT]e`XUVTTY[[ZXTOOPSTSUVRWcf`]]\]bdda]ZY[]`_]]]]^cffc_XSUE~WEUSQQRY]YROMLW^WSQRRVR^UP``Vt{SVWSQQPNMLMMOPNNMMPZab_`a____cejommzȖk_`dgjlknoYQTRW_a_^[YXWX[^[XXVSSRSTTUTTTTTTRORSQQTW[^ac[SQRRPQSSOMU]^XKHJJUdgdc`WT]ffaXPIP`ga_`bcde_YXTTQOONNMMKIKPOKKLLKKKKKKIHHHIKKLMNMKJLOONLJIGHIJIIJIJKKJM[fc^Z[YULHLMMLLKLLHGPWXXVUUVTUTRQMIECABFGDBISQNJGIJIIIJKKKJMPPNLLLNOPOKHHIJKIGJKJFEDDEDDCDEEEEFGGINPPQPOOOKIHEBBCDEEFGHIIIJJIHHGFHIFDEGGEEEEDEEDEFFEDCCDGHHGGGD@>>?>>>@ADGFDA@@ACDDDEEEFGGGGFFFGFEEDCCDDCCCCEEDDDDDDEFDEECCA@@>>@@>;::;?AA>9;99=@<9:89<;<>:>=>><=<=;;<=<>?@@ABABCA>==<;;;:::::::9999:::9999:::98:;;999:;:40.5:;>@?B?::869999888777577;?AB>;;746BKLKH>62475557CFFEDDDA??><=><<975578:;==?ADGF=4/010//1011004AHEEFFFGFFFEFFFHHGGIIGEDCA???B>515544444433434666777799::<<<::::89989865566679;:=BC>9899::9988::;==>>?@@;69HPKIDB@>?DJH@=;CD=5331132000345544675567656765333322346679:9::::::;<<<==?:36<>??=;<978626>>==<<;:;;62-,/0013788:76965=A?>?>==;79=<:::9::9:;::;;;<<<<;;:96211111014585/...,+,3342/01234LaK.020123455;<5/-04BNJS_D0544345:?7*18/0:@<-'.;F9)+,,-*-4621000//10-,09CB72/-+*('%)-.2:>759BB>;7403@PL8++.0446=<4.((.:<5-+)(/7:48ML:>IG;/2.(8J43EI?8889=:4410.,*(*/575.,/222221054-+*)*-....17/()/1-*)*)(()(*37-'+./0224>C6)+5>AA>844EL6,2:@BA>;?E1#(2@9*&4EJIEA7252,++)++)+-.185,+03/,,+)().8DGD>:;>BFILS]c_L637742561,.57543BDHE?7..,+3:99CF9/@f}tbOD@==DC>:8>@FQSPQUSID>;E?1581D{Q44+7UiuvY6,02/TUVWVVVUUUUTUTTVVUUUUTUUUUUUTUUSRRRQPPPPPPOOPPPPPOOONMLNNOPPPOQQQQQQRRRRROORSTTTSSRQQQQPOPPPOOONNOOONMNMKKKKJJJLKKLMNNNLJIJKKKLNNJJKJIHIIIIIHFGGHIGD?AHIGFJONKLNNONLKJIIHJKIHIIJLMMNNNMLLKJGEEFFHHIJIJJJKLMMNOOOOPRRSSSQNQ\XTzzc[Wi]zgc[MY`]ZZ[ZZYW[__^_]bcbdcl|zycnwnat~}mnb\vLTUcvqpw}~~p]m|||xwmxwx}utxefjntrw{hlvfwkPXkk]SRSTX]\RSKZƗphkjYz•ieqxzxwuuuypwxyg\debbecadc_^\Z^cddcaYUUWZZ[[^c_UPSPNS^gf]XXWSRTVXXVTONPWWUZ]YX]a_^][Z\`ca^ZXY\`cb_\\]`b`_]XYQR@OSONRY]XQNMNLP[[USTTRIzuKV\^XxzQWYTPNMLKKKKMNMNOOR]d_ZXUW]dijkihifa[XYrxaY[bkrnoxkRR\aba_^\XVUTVY[\ZWVUUUUWVUSRTTSSUVSQMLT\]ZXXUTRRQPQRPLU]]VJEQchgc_\SNW_`][UPKMZgb_abccefb]XVTRPNOOMKJLNIGKKKKJKKKKJIJJJKLKKLJIJMONNMKIIIIJJJJJJJKKLUXOMORURLHLMLLLKLKIHMVZZXWXVTUTRQNIECBDHFCKTMHJJCELJIJJKKGCHNNNOOOMIJLKIHIJIGGIJJGFDDDCEDDFFHHHIIJKMNOOOPMGDDCACEGHHJJIKKKKIHIHHIIJJGEGGFDEFEDDDFGFEFEFEGIJIGDC@>>>>?@>@CCA@?>>@DDCEFFEDEEFEEFFGGECCCCDDDDFFFDDDDDCDFFFFDB@>=>?AAA?=;;<>?A>:;98>@=99;<;:<99;9;><@BC?>=<;;;?ADA6:RN>ACA?=;;:::::;:;;:999:::::9:9::::98:9976689999468:=@?A?::989999889777578;?AB>97501;FNLA95699657;EFDCCCCA@???@???:543567:>BGF@@AD@869975762/113?IHGGEDGGGGEDEEFDFHFEGGEB@@@CF:24753354443433676677779;::<=<<<<;:9989998766688888=?=879:::9989:;;===?ABD>85AMHHFC??@DGE?>?AGIGFFD@;8?C>;::9999999;=;76886556567424:@C>6211121.,-14443566655567775321111123355788:::::::::;;;><9;<=??>=<:62478;>=<<:::>?:4,.2238977975438?BB@>=>=RTVXM<6776669;4+24,2B@2)+,/./1-'+/,/77202221269:;FZXB410/.02,$4C<9>?6/4AE5)28.*GdV;.05;>:69;1,*).;=0(((*0<6,5E;2<91.0771?N96;:26978773../-*))+.012/-/000021+/20+*)))))+.02--3640--.+('()*14.++---,,0>?3+-4=B>71/5:2*,/57:960+=@16A?5.3@GGC<94.-/,))))))(*+/64/...-+)++,/5@A87=??=>BGIIMOJB<:;<832/*)/:>85309K]ZA8HND;78=CFKOTQ@8BEDHJHE>54?HJGFILGCSus\PLLKLKB86:99?ACFEHIGGEEA9;:373-Qt;!&&*:]rC*/7:7WWVVUTTUUUUVUUUVVUVVUUUUUUUUTTUSRRRQPPPPQPOPPPOOOOONNMKKMNOOOOOQQQQQQRRRRQOQRRRRQQPPQQQPQRROOOONMOOOOOPOMMMLLLMMLKMOPONMKJJJLKKMNLKJIIIIIIIJIGHIJJIFCAEIHFGNRQPRSQPOOKIIGHJHHIIJLMLMNMLMNLMMKJJJJKJJJJJJKKLMNOOOOPQRSTTSQPYgkwm[`Ukgfmp_R_`XUWWZ[Z\]\]]_cdfsysxyrgvwr|tws|xsxdRnOay}~~}~~{z|obu~{xryfp}~vutrkjmrsvqnuw}z{hZXch]TQSX^fknehŝdXWU\Xmyfmv~}zvvxxv}ttkbbdcb_^bjole`\[^cgiheb]XTSWWUTWYUUWVTV]cd_[ZXTRRSVVVVTTW[\XUWZXX[^^]\\^ab_\YWWY\]^[YYYYZXZXW]JncGROMP[]VNLLLNNOYbYSTUPMntSQUUVSxwMUXSOLKKKKKKMNNOSRORXWUVXWX`dfga^cb[URRNM_li]WZ_ehenrXQab`^Y[ZWUTRPMRVSPRQQQRSSSRQRRQSTURPKHNX\YTSSTTSQOMONJQ[]ULPbleYTUULN^_XUSPNKLWfa^aadfkkge_ZVVTRQOMLNJFMSLIKKKKKJKKIJIHHIIJJIIHGHIKKKJJIHGHGHJJJJKJLNNMNRWZXVSSQMLMMIHJOV[[XWXVTUTPOMHEDDFFBJWP@BIHDDLMJJJJJGCEMONOOMIEFJLJJIIGEFGHHGDCDEFIHGHHHHHIIIIJOPNMNIDCEDBEHIJJJIIKLLKIIIHIIIIKKGGHFEECBDDDEBBDDDDDFHJIDAA?>>>>?A@@CB@??>>@DDCEGGEDBCDCCFEFFFDDEDEECDFFEDDDDDEDEEDDA?>==?@@@>===;<>?A=::9:>>=9;<<;;;:::9?GGBDC?>=<;=>@>;8FrvI9CD?>>;:;;;;;;;;;:::::9:::8:::999989973135789:999:=???><<;;;:99889887779<@AA<834528DNN>76678569?DCCCCCCA?@ABA@@>7421345;AEGA71.7CHGHKKGKB41224>>=;:998899:986688887:=;779:::9999;<<<>>@BA=:99>>>=<;8579:;>><;<;;;;:877747=;6787644=FECB@?@>?JPD77<<:::999::::;;;<<<<<;97432121222110/1109HPNPN>20011/-,.0.6B?633458973/+,=NRROTN=52122441./0/2;4$(,,+*22**2401651024556@A9.*),3:852.+*6II;9=846:=>??@FLG95=AACFPSE68EQXXRKJHAP~dRSROSWXZRC;8:?AA81?G?:BE>=>?ABAA@>>????ACCEFFDEDCBACGGFDDEEFFGGFEEECCDDDDEDCBA@=<==<>AA@=>?>>=>?@=99:;??><<<=;99:<;:K^RGEC><===><89Gih7?D@>>>;:;::;;;;;;;::::99998999:::999974113446789;<<>====>>>;:88778::9989<@?=;677957EPH75755512@??=<<;::99999988888779;;8799998889;<;=???=:78<9:AEGDA@@ACEGGFEEJJHEB>@?95;>:9:::;:98655565424444455423239A?80./.033333464222320123321100000000001222467788888778:<<==>>=>>=><<<;;==??<==;:;;<<<:9<=;9776427BFCCCBAACGJF:49;:::;:99:;;;<;<<<<<;:8654432122210000/5GSRPNK:343321//1237>=4/17<=;841./6@NTRW[K2.,/1100/...,+)&*.0022/*1772/11/024679AFAOuoE%(00-1=;/;QPC?>;961D4672.-**.0*%&)*)()++).443467640:8;?CEA6--2201.+,,,-24694-27526:<>EOH8228BORICD>?epabXRPG@CPa]D69AA;0(4B@<@>2*)+*+*(/8-'&')#(]n9&/.+-4RTVVUVXWWWWXWVVWWVVVVVUUUTRSTSTSSTRQRQQRSRPPPNOOPPPPPPPPPPPQRRRRQRQRRSSSSSQOPPPQQQQQRRRRRRQQQQPQPONNPQQPQQQRQQQPPQQPPRSRQPNKJKJJKJJIHJJIIIIJJJJJIHGHLJFBCFIPUWXWVUUUVUOIGHGGHIIIKLLMMMLKLMMLMQQONNNOONMOOONOOOOOOOOOQSUXY\^afcagg]cu`cvvf\ahhbcgdabddgkid_g}zxxyx{vomnonvynmqorvwuprtuutspr}y{}{us}timio}zoopqqt{yrv}{hdlry~wnooookigcbc\SQMOjp̺{NPTUTVSJ`ļhahijlljkmnxngffcaa`]WW_ioqleba`^]]bddb]Y[\ZZWPQZ]\[YWVVWYZYXVSPS[cikifffgmi[X]_el\IKQTW]\\`gkncSNPRRQRRRUX_Lj`LSSV\\VOLMNQTUUTUXYXYYXVUTSRPTJRlGPNLKKJJJKMMOOOSVURPRRQQ\gvrYSPOQRRRTWY]dgedlqj`Y\[Yc`WWUVUSSSSRPQRSRQRQRSSQNLLLLLMMKLKHHLLNNMLNPQQRSW^^ZUWYXZ^`caZZ\WQNMS[ZTPNMMLKMW]\]dghmcUHG]fia\[XSRPOYfcSLKMLLLKKIHGIWjoh_YURZs|fVRSPPXdh`SNKKJILSVUTUV\fffb\VOLLNPNJRbf_XVVTTSRPPMHGIE@FSN@?DDFECHPOJIHGGDELOLMNKFCACHKLIECBBBCCDDDDDCEGJJJJJJJJJIHHJLJHHFFHHIJIIIHIIIIKMLJKJJIJJJJKKJIHFFFDBBCB?@AB@@ABEEGE@>>>=>>>>@BBAABBABAABCBDGGEEEDCDGGGEDCDFFFGGFFFFDCDDDDEECA@><<==>?ABA>?@??=>>?<;;:>>;89=?>>?;>LiǍD;FA>>>=><:;;;;;;;;:::::9::9999:::;:998632111114579<<<;::;<;99755679<=98:;=>;;;69:944BPB38943412@GBCGHGGGFFGHGFD@<:645443332221351/4BMPOJ:002225>FGGHHGFC<633455541125;?A?@ABA?9:;965664544556679::::9::;<=>>>=<<<<:;9999999888879999:::998889::9;>@;9969?<8?FHEAA@?CEGGHIJJHGFBCA:689<::99876444334443444333344224215>>3.0135443334300010000100000000011222334224666778889:;<===>>>@@>?>>@@<:<==<<<;;<<;;:98;;86687328ADCDDCBCGG>4159:99;;;98:;;<<<;;;;<;;:8755421222110100>OQLI@8101000///133465/,/ALC;644340;OUSSZM0+*04212110/..+*-/1553/,.45/)+--/37855:EHY}j;$(0114<1)7B?CG@=:86=:/-=NC=KR1)12:IL;570,////,+*''),,,,./02478867731?A'&)3<4,.0343/+))*++,//,*)))'(*-/,)--,-//+,+.3654310/,'')*)(*)(),004;=4+),252,)&(-28=;511/*&&(*+-/351292',-.5:73232///-,,,,/440.....+*(()*-.263,,7=<:>753227>>9999V{cnmblhH7<5/./.)'))'#"$&')$3UJ/,*&$$&Z[\\ZZZYXXXXXXWWWWWVVVUTUUSRRSSSTTSSSRQRTSPPONOOPPQQQQQQQRRRRRRRRRRRSTSSTTSRQQQQQQQRRRRRSSSSSRRRQPONPQPQQQRSRSTTSSSRSTSTUUSONLJKKIGHIIJIIIIJJJJIHHIIKKIFEFIMRUYZXWWWWYYQJLMHEGIJJKKLLKKKKKKKLOONNNOOOOOQQPPPONOOOOOOQSUWWWZ`dddfmr~h\hiktmjh\]db\^adjkkiflqkdiq|}}zy}{jedddgjltkVUbr}voqsqoqppuwnu~ysrvnhlkqzyrqrttv|}uroh]drvz|xtridnokkkjjfb]VUm}reZ̒MOWSTRRUNMÿ­y_fkgfhhhfmzjfedca`_][\\\dkkiheb`]\^aab_Z]]YVROV^][YYWUTTUVXYTMMYgllkjjoyweZ[cefrkREHNPTVW[_bgi^PORQMNPOOUR[k=WVSWYUPMLMPXXTVWUVWWXWWWWUSQQSLRnXENMJIILLLMOOOOPSUSOPQQQRO]{S[WXUPPQSUX[_adbbcca]WTZa[TSRRRRSTTSSSUUTTTSTVURPPPONNNNOQPLMRPOQPMMPPPOMSbijlt{xifeWFHLNOOLOUQNNLKKJKKMSWT]jmineVLACFZhf]WNJUad^QNSONMMNMFLOLWq`ZXb{q]XXVUavvaUPMLIIU\XVVWY_a^]YTQONOONIL^faYVVUTSQQPMIIGADSNDBCCDECDMTOLJGFEDJOMJHFFCBABGKNHC@@ABCCEEFECBACFGHIIJJJJJIFGHIJMKIJJIIIJIIIIJJKLKJJJIJJJJJKMNNMHFGFDDC@?<<>>>?@CEEDB@@@?@@@@@BBABDDDCCDFFCFIHFFGFIKIGDDEEEEFFGGGGHGECCCCEEEEC@>=<===>=<>@CDBBBA<;=AAC?;DB?A@?>>>=GhŠX@EDA@>=>@>;;;;;::;;:::;;::;;99:;:9:97764322233233459:9866664155468;==;8;?===;<;797532?J@7:84466>IIFFILKKKJJHJKJIHHE?:5565421024665305COJ@0033435@HGEECCDIGE<21469:65466:<>@AABA?@?><;;;87667777899:::::;;<;<<==<=<=;;;99899988887668;<;::===<;;9:7799:::865554565554443443443332242/-6AA4.2554333332000/0000000/00000121244333213556778799:;:<<=>>?AA@>=>@@=;<<;;9:<;<<;<;7567667886568;>AABCCC=40136988:;:9999:;;;:9:;;;;;9754422222110005?GFB=41/00///0112357554-0FRE6/36688@OUTSZN1*,26687212133.''-27445-(.3-((*-/3872*->PjX1-341268,*/05CJB?729A4*5GI7786'&.543A@3-,.35540.,*)),/.-2962598755510AD+(+59744456861,)*,///45-*---)(+-*&*./-00)*-.266642443/,+,*)*+)'(,3@F>1*(-7>8/)%,9618??<6/)%'+.0111-(&,61'(--1BQURJ5+.-,*+..-,,+,-./.-**++,.10*$(1698>GJFELNC77>@@A@@BFC=6445:EA-*+,/1672/010/5@CB>=@B@=;;?BCB>62223<=96Bg|jfmdfvg>3=A@?816>:21006=:654530*))**)+0120->E0*480+($^^]\ZZZZXXXXXWWWWWVVVVUSSSRQQTTSTTTTSQQQTTQOONOPPPQQQQQQQQRRRRRRRRRSSTTTTTTSRRRRQRRRRRQQTUUUTSSRRQPPOPPQQRSTTTVVWWVUVVUVVVVSSPMNMKHHIHHHHIIIIJJIGHJHHJJJFEFHOTWXXWWXXZ[XVUTOIGHIHHJJJJJKKKKKLMMNOOOPQQRRSSQPPONOONOPPQSSSSTX\]abeszfom`\ca\]YXXY[^ceekvuppoorrot{~}||}~n^ZZ\]^bjlbXXf~|vspnossutyrunrzwrsrkijjknyvttwww}|yn[dw~~}}~uuwqlvvuyvsrpd[]`li]^SrqWUUUTQPSOH}ſadpmkkkjgwplmgdddcb`^^_^]]aegheb`_```_bda_[UQOPZ`][XVTQRSSSTSOHJ]pqnprvrZW\accoqVEILLNPPPQU\deUMRSPNNKNPCJLYZVVUOLLMMQWVWZWUUUVVUUWWUSRRRNOOFHKKJIJMMMPQPNNPSSQOOQQQTId\KQVchd][YTSUWVUVVUUUURQWWTSRSSTTTTUTRSTVTQQRSUVUUUUUUSQPRTTRTSONQTTQONOOPQV`mv{}yneWIFFGIKKLOMIJJIIIJKKMQZVVcmmwt]\W]WXSITfeUMPTSQQQPPQ[hdX]wv_ZY]nwj^YVV_r~mbYRNJFO[\Y[YZXZYWVTRQPPPPHFU`_YVUUSSSQOOMICGPODCEDCCCCDQXPLJFFGINLHFDCBCCAAELONNOOMIECEFEEDBAABCDEFGGHHHHEDGMNKIHKJIJJJIIHIJJJJIIHIIIJJJJJLPSQIDCFGFECA??AA@ABBCCEFBBDEEEFECBCBABDCBDHIHEFGGHHIKMMJIHGFFGGGGGGGGGGECCBCEFFDA?>==>@A@AAAAA?=<<<===A@>?BDDBDDDB@@@@A@>?A?@@@@@?;hq??CBA@>>?><;::;;:::::::::9:;;;9:;;96545455322344423347877656647CB===::;:85333@B::;8677=>>??@@?@@A@@@@@?<8889998879::::;;<;<<<<====<;;:98888888886689::9:>ABD@;:;=ABGIB:;>@?=>>>=>><>?>>>?AEB::<;;<<<<:75678999:976579;>=:8533423677899999::::::;;;<<;;97544322100100132364325212111112358:@H>15>D?4/48<==@KVVV[J/*-479=<30420.,((17<745/+.30+)*-0463.(*7KszA+4:;3110-0202@JBF`dNJ<-.=2-0.**3A?1*3@=/+.26674/.,*),1..5>947::9754..@B(*1845797558740+)-41.67/.6;>/*)++(),,.00**,.1455324432/..+,,+))**3DF8-+)+4>=80.18704<=;5-*,-*,..,+**,0?G92552;ZuuX6*,-+((++*)+///16441/-,-.--.,('079?A?@DGB::@DCDDA?>=<;<>@A:@ABFHJKJLSSNGC94312>>:===?AAAAAAA?<<=====@@>@BBCBCCEEDD@??A@?>???@AA?@{X8>@A@>=>?=<<<<<;;<;;;:::::;;;;99:;;743346333345542344689::8886>EM?>>?=ACB?<>=869975437?91799768DOPPRVUSRSTRQQOG@95422333433234467544414>=6112333;EGEDDDC>9=FIIB745<><<=>>>=?@?>???@@@??AA>=::;;:8667779:;;;;<;<<=<=<<<;9887779998865799989@A@?=;;=?BDJI><><8:EHC?>@ADIKMKFBABA<89<:975555457887644433444444433466557669>9455544344322110000000000111212468:87653223467878989999;;988;=<==>?=>BHIB=;;;;::;<96456788:::9876994023333112469::::;;:9::;<;;<<<<:85433221001110+*,.14761.00012333795?PD79889766:>>=;EUVUS=+,.347<;3041-+-4348@96564353-*)-01.,*)359bg92:@A5/.025872:GB6PveWK?-.+-./-3DM7+/..,8@B>:74/.....--*073,---,1563/+++(()(,01.,+,1445311220//-++++**,/5;81..-.39>;41/.02585/*(0761.-+(&*.78@LG<577-5[Y(+,-,+)'&)+/7:1486551.--/04>D9.19<@?BKURKMRNGC??B?95:<>B?:20:631-)*-..,*0:>>:5,)2856;<^__]]]\\ZXXXXYXWXWVVUUUTTSRQQRRTSPPPPQRRUWSOMLMNNOPQQQOOPQRSSTTTTTTUUUVVUUTTTSRRRQQRRSSTWXYZYWWVUTRQONOPPQRTUUWWXZZZZZZYXXVVUTSQPPONLKKKKJIIIHIJKKLKJIIHHFCCHLOTWXXY[YXX[\XWVOJIGFFGGGHHGHHHIJIKKJJJKLMNNNOPPONNNNNNNNPRRRRQRSXlu]Phrb[^```dmi`^\Z]^]]_fw{uuzzvsmnsu~ynmpuusvz|vf^^[[^__chgcdkniffc]]]arxaZp]]t|}xusqpoomjnln|{}xx{uvxx{}}x~]h|ywtouy|pgbWTTSU[hqjmbR[jcWSSSSTMKĿƱlmopsvvutvqrqcccbcc`]]][ZZ[]abcda\Y^^]]_[SOPSY`a^XRPMKNQNLKHHJJNZhjn||j`\]blttUGIJKLLMMMMPMKM]_NMSRMNQEfZM[TSPMOPNOQRRS[b^YXXWUUTUUUUTQOOMLMKIHJLKKMMNRQOOPTUSRQOORSD`^ejVXayw`[^a\LDINNOOQSUX[`eZROKKMRWWSTTX[_abbba[SOOKKLLLJKOPMJILOPQPPPQTSSSRMRhsvsn^LKECHLLKMMMMMMLJIHHHJMUcfc`^Y_qgRQPQ`fXPTVTUUSSSSSQVuy_S\w}e]]jsZSTW]fmmi_XUW\`dius]V\UTTSSQQQPOOKHKPUUVVVUTTRTTMLTM?BFDEDCBBBCOWOJIGGIMJEDDCDCDDAAEJNSTSTPJEBABCDDCBAAA?ABCCCCA@@?BEEDCIMHFIIIJKKJHHHIIIIIJIJKJIIHFINSRHDHHHGECCCDCCDEEGHHIIIJIHFFGGFDCEGHIHGIKJHHHFHKJHGHJJJJJJHIIGFFFDDEDBBBDFFECA@><>><=>?>?AABBAAAABA?@@A@??>??@?@=Dk?8A?@@==>>>>===<;<<=>;9:::;::;;;;:;<9533324457666653433359<<;89AAA@=;>?ACB?;;;74675433683.47985:JQPRU[[XUTTTTRJA:76554322233344467634423553113313=FFDEGGFB8249@GF;88====;=>>@@?>?????@>?A?>>>=<=<97665579;;;<;==<<====>?=:98888998865799;<=@?;9;<>AEGGG>9>@@>?><;@EB@>=BGKMOKECCA?;8:;97644664455444355554433322224667766779965555544444433210/000/001123345427=<<;:84235545777778767656:<>?>@A??@@B@>?<<;;;:89:65534556798788742232103310169:;<;:999;<====<;<<83311210123220../15762.,./0235447822>A;;9556779:;?=AMRRC1--.//.67..2.+)(++15==9678975/--.2/+)')65->E5;@F?/./17:<:34??,'5A>?UB55-13/9LG,+10)*7D>/$,551/-**+)*1:?9646762,)(.E9=MOLD?3--+))))*,+/86-'()+-,,331/+(&(,-.,,++*(+,0/0011..0-)()*)),.1/,..--15740..,(*.11/+&'4:;B@40+'()-13;FD9585%,]Z*./.-6B;-)-/19-1621/.+*+.4BE6-=>565=ZXJE>AIMNPON>65=H@50351,*$'6?;892/-)*/10,)(.662/,**05:;=@BBBCB@AAAA@@AA@A@@@@AA@?@@@@@@B@@@??????????O·^5@@?>>=>?>=><<<;<<=;<>==<>@ABAB?;:864554433665347;849KSRSV[ZWSSSSPH@<:99765321222334356645532111243325AFFEEGGGHC:3257?D?<<<==;:===??>???@?@>>@?>>>=<>>;98665667:;<<==>>=====@@<<:8679<;86679;=?@@?;8:<=@EHEA9;DDHGC@=:;AC?<>BGKLLGBDB;:;;97665658;7433433445544422212224677777888875556654554444321011000221333552023578;;73444355667764455348;?CDFFEDEFGFGGB@??BA:>><;;;611111102343210/03653.,+,-/48898770*3==;943344448>=?EMF3,,+,-+,22,-1.+.8>4-17<83598750/./0.)''*42*/-1;?=/.//18<=:22:4&$%-/@m\99055/:F4'.32*(,3:/**230/-+++()177634563/+'(.C6:<42670',,)'()++++5;2)((+0896551,''*//+)+*+*)**+,.010-.1-(%'))**+*(,43+*/580',10+*-12475/0<01877:<@A=<=@CIIQT@4;F=/08;32MVF>AJKBA@@HKD60365/.1-/999:3.,*+.///-,*('(()))-675:`````_^]]]\[[ZYYYXVVWUTUVUTSTSPMMNNOTVXZ[]`^YVTQQQQQPONOQQQSTTSSTTTTUUVVVVVTTTSRSSRQSTTVX[\^^^\XXVRPOOOOPPPRUWXZ[\\]]]]\\\ZWZ[YWUTRQPQRQQQRQMJJKLMLNOKJJJJGEDFKRUVUWZ[ZYXWZZXVTSMIHGHHGGGGGGHHGHIIIIIJJKKJKLMMMMNMLMOPNMMKIKOQQZwkaa`bdefccghfb____][k~|xwwpnx~||}{vuz}|dX[fdXW`gc`aaaba_ab_a_guz{iku{}uponpoosx}~|xwwvrkd`cjjaj|uwutt}utxgVQTWW_kigeca`aehkgfaXPLQ^dg¼nlmnpwyxww~rdadcba]YZZWWWWXXWY[WRXYTRSTTVX[`_XSPNNNPSTOILLKOMNbuszf_adlxxn^RNMLJGFGGFGHHIJKLORQLLKQMVgCJKRPLLQSPQTTTTVUXWVVVUTSTSUURLJMLLMLKKKKIJLNPPNNORVSQQOMMOJ]VHP_[YkufVSTKJĕyf^ZVVX]^]^]XZfkkjgfhfcabcdefggghjjhjjkkjhd`^\][WTRTVWSPOPRSWROdl]RRUOHHMQQPPONNONLKJJIGHWb\VV^khSYiRPUWUQSUTRQSUSSTRPQSPKi|fUQV``VOPNMMKLLKJIGEFHHHGFHHGKQSW`ylP]]TSQQQPPOOMNPRQKMSVSSURPRWRGCGHGDDEDBAAAJUOHHFFEBBDECBCCEFDBEHMQSRQMGFFDCCCDCCCBBA@>=?@BDCDB@@DEBADFHJIHHJJJIIJIIIIIIHHIHIIHGFHFGIIIKMKHGGGFGHIKKKHGGGGGGHGDDDEEBACEEGLKGEBBBCGGHIIIHFDEFILLKKIHGFGGGEDDCDEEEDA<:=CDA>@AAABCBABAAAAAA@@@?>>???@@@A@???@@???=@?8S̛F;E@?>>=>?>==<<<<<==??=9:;;;;<===<<:779988988867754212344357?AAB@?>;986644332366788:<959ITUUWXTONQPJE=:::86543123333334466645531122222229CFFFFGGGIKE834139?A?=>>=;;;;=>>>>>???=>?>>>===>=<:;:8764679<<==>?=<<;9:;:;<<=<::975467:<>?@?;9;<=DIKKLNLKJIHHEBDIJKFFHC:531025766787421011137<>>?=879;:9999:;<====;:96432112223544421332/-,,,,-.4<@A?961/9=<=;522223469:@903PMA;5=7-57*.553-)*(*-3/.0./-+*)++/0-24643,))().=5-*&'*./.02-()*+,,(0=8,(),,<5/*('&1CHAEPMG>2,-0/.DcU3.-('+.1/-*(*()/5::631.*-7AGLNPRRLOSUXZI6.+-460-7=?ACDLJ5%)7=:567549=FFB??<:?DKMC71;DCA:0%AjT74ChfE<40JS5+-;LG8037:54>>1-9;92-,.-.,+++,-12-)))+.0013````____^]\[[[ZYYXVWWUTUVUSRRRQPPRUWY[\]^`bcc`]XUTRQOMNOQQQSUTSSTTTTUVWWWWWUUVUSSSRQRTUUWZ\][[ZWVVSROOOOOONNQUWXXYZ[\]]^^^][\_aa_\ZVTSTUURSVTPOOMMLMMJJKKKJKMKLNPRUUWZYXYZYYYYYXTNHGIJHFFFGGGGGIIHIIIJIJIIKLMMMMMNNNOOOOMLMQX[\Z[cr|k\_ffdgihgiiigfcbcc`dz{|pr|wpv|rorsngcfpy}snv|q]SW^__```ab_ejfnzxu|uqpv|tntv|{tleaelhal{yyxh]h}~qw}yroXRUY][\]`cddffb_bbfgd_SYkvprĿkikgm}mnloztecfdba^YZYVUTSQORXZYX^b]YX[]\\\[WTRONONPTQKLPOMNMLYlqre``esypmi\LNWUQOKKNNMKJIIKRUPLNJAvzFILLKMLMTTQSWVVUSSUUUUVVTSTRMPNEHLKLMLLLKKJJLMPPPOOSSRQPNKLIHowGMN[c]fdaZ]b`Ryʦt_caWTRRPONNOWcifddfedcccccdefikkkjiihijjiijiihfecb`^ZVTTSSSOWiaOLPSRQOPQQQQPMLV`\SNKHGIQUURNRZYOLgaOU\XRSUUSQPQRQSTRPQRSPLQSONMJJLLKKKKLMLKIHHGHJKKKKJJLNPQRSWn~nYZXSQPPQOMMPSSSQIHRTTURNUYPHEEFFFDDDDCCCAHWQGHHGFCDDDCA@@CDEEFGFFKONIDFECCCDFFEEDDDB@><=@BCDB@BGGCCDEGHHGGHIIIIHIIIIIIHIJIJIHHGGFHHEEILIHJJHFGHHJJIGFFFEFHHGEDDBBAACCDFJGFFFGGHJIGGHGGFDDEFGKNNJIHFFGGEDCCDEEEDA>=>CHG?>ADC@@BBBAAAAAA@@@??>???@@??????@A@?>>><9s̿l9>A@>>=<<<<==<<<<<==>?@ID:::;<====;:88:977666666533457:;<=??@>ABDB@?@ABB@>=<98666544345579;;<=:5:JWXXXSMPSNF=:87:97544333333333456664653111111333;EFFFFFFGGIG9385./9@BA?>=;;;==>>===<>?>=>>>===>>=<<<:8876569<<<>>?>=<<::;88=::;<;98;<;AIJIIE@<987@G@;;=BEA99:8998420023369:888887878;<<==<<<9754233552344575465/**++,,--4>?>=7337>=:<:4100366688:>;50(&.1//.,,--...01,%!%***+02,.97/,+)(&')./+,11,57++//.-8BC8./:<5-2118665-*)''*,4>:,'+,('---*'-42+)(''('+4203>7*(.34.,))***+(,9>3*,+)7C:3331*,/+'&%&'+.//0021,*)/54+'&')*,-/489?>4.39933100/.07<951-)('$(6?>:94-&%*2<;=UY>/,((*-///-+++-/25521.('4DIJIJKHGKOPNMLC2)5N`cI/=IGDBDE1!&2:<5;FMLA9=ANaO06frC023ET@-/52QY:0:KJ=347755>G>*/>91-/354,'',+,9?91/,*)*,/0bbbaaa`__^]]]\\[YXXWWUUUUTRRSSUWXZ\]^`_aaadfb^\ZXWWTPNMMPRRSSSSTTTTTVWWWXXWWWUUUTSSQPRTTSUWVSQQPQQQSPOOOOONNOQRRRRQSWY[\^`bb```bcdc``^]\\ZVWXVUTSPNMLLKIHIKLMNNMMPSSUYZVUYXWYZ[Z[ZPIGHJHFFGGGGGHHIIIJKJJIIKJJKKLNNNNPQPPNMMNRTX_^WTX\`afjilokikkhhifefff`i~xnoxytwzi`cfdbcb``cpzor|wh[XZ``^_`bdfgw~ps}zvtssvqpuy{rkhefpj^gwtlbYWe{v~~^ZatiPOYcc`[\_flmruwtrmjmsskgehplwĿicf`eihggmlfeeddc^XXXVUSSTRV^`^ZY`fb[Y[[[ZURQSQOONOOMLOPNLMMLN[kxfa]^hrrgistl_\a`[[]`bdfbZTTTTUSOQC[[ALJLIJKMSTPSXWVURSTTRQSTWXMEecDHNNMMMLLKLLLKKKMPPKMVSRSTRQSL`XOTW]a^[[ZZ[_c[buVdtj\SOOONOORY^`_____`abbacfgjjloi`^^____aefedccefdbaaaa_]YS^eYQQPPRTRONNMNONM[jj`WPJHGHKPPNOMMMIKiYRXYURRUTRQQPPPQRQPPPRTROOOPTYSNLJJKJJKKJIIIIIJJJJKLLNPRSSQOUbwpTWZTONMMLLSZUNKILSSRQNRXRGDFFFFEDDDDCCCAJWPEGHGGFDDCA@?>@ADFFHECGIHGEEECABDFGHGFEFEEEB@@@BDCBFHHHHIGFFGGGGGHHGFHIIIHHIILKKJIHGFEFGECEFEHJIHFFFDEDDCCCDFHHHFDCBBBA>=?ACBACGJJIHHHGGGFFFFFFDBFLLJJIFFGFEDDCDDDDBAFHFFNVODAGJGCBBBAAB@AA@@>??@AA?@@?????>>>=<::97:͖G7?>==<<<;;<<<<;<;<;<;977677554547679;;;<97BTYXVRMPUN@:9889:97666554331224655664444432123459AFHHEDEFGGFB9563029@CB@?=;<;==>>=>>???>>==>===??>>=<;98877899:<<<<>>=9347:@JPRPHA>:45:<<<::;<:7567:CIHHIF?;:769?A<=CHJIHEA=96564279:;:865310123544444433457753234578:<:97553455544553320//0000000000000//135897664555588448989986579::879:;A<1*3;;4.2578=><<:1/4786131,**))&&0AG9+*)*,0/,****''')-12./13.>]Y6%/KF+')())+--+2@B=CVR5+'''%"#*053*%)3DRYUDFK4.*((*,-//,,--//0110/.**8DC?AGFADHHHIIE=-*R{xgPIOPKLQL=<:9<>BEDFE>3/@PPR^aP<8ADA=965;XaOVgM.+5EEW[M\rN7YU;?BAEC:4577;AA4(4?53:==;61//,,:GH?5,(*-./3bbbbbba`__^^^]]\[ZXVVWWVUVUUWXZ]__`aabbdeeebYTSTTW[ZWRONPSSRQRSSSTTUVWWXXXYYXVUUUSRQPPRQQPOPOMKKLMNQQOOOOOPPPRRQQQPOOQRUY]``\XVV[`cfhhgcbc`][XTSSRPNNONIGILKKNOMMOQSVZ^YQSXXY[[[\^\SJDHKHHHFGHGHIIIIIJLKJIJIHIJLLLLMQTSNLOPLHILNS\]RLWfnqstrnkmokhghhghe`ap~onx|{y{{}~jaba`bddccdkoV[crtf^\^^]_chlgd~rintz~yvulcgu}wyu|qjibdsn]gxtc[\^dtz~zeZVO^qcOP]dcc\_cnvllv~{~ztsrlqrdüyjf`^uucfeaabdddfd[RPRUVWY^_]_`]YVVZ_b^WVYXVUUUTSQOPOOPSSPNMNOOLO^}j^_agomc]aiklopqk]Yagikllib]\[YY\XQ{FLLJMLLLLOROTYVUSSUVTOORV\SKj>SWROMMMLKLLJIIKMPOIPXQRUWVWVV|KWVXWYXVYYYY\]\TzyQVhvlXNNNNNPRU[\[\]]]]_aabcfihilpi\\]]]^``bba^[Z\___abb`aba`_][]_\ZYYWUSNJLMMO\ggec\TNHFGJMNLHKMKKYnzn^]TORSRSTRQRRQPQQPPOPQPRSQONOQMKKJJJJJIIIIIIIIIIIJKLLNQSTSRMKPYumUZ[RNKJMRYVQLHHMVSNLSWPHFFFEEFFFDDDCBCCMTJBFGGGFDDDCDEEEDABGLPNKHFFFEECBDFFFGHFEEEDDDCB@ADEDGHHHIIHHHIIGGGHHGGGIIIIIIJKKKJIHFDCDFEBB@CJHGGEDCBABDEEFJMLHIHDBCDDB@?>>?>?CHIGGGHGIIFFFGFFFDCFIJIIIGEEFEEEEDDCBBCJNKGJTXQGGORKDBBAABAA@>>?@@ACAAAAA??>=;::::85875ne:>?<====;;;<<<:;;;;<=??@A96;<<;<<;864677655655443457==<==>?@CB@?@A?=<:965667765456889:;:9747L\XVTONPH<68:9999999888754324446677643354333224:ADFHGFCDEEGF@74557:=??@@><;<<<>==>??@@@??>======>?==<;:99::9778:=?<;;<<=>=<853468=GPTUWQC<8777679:88989:BGGHHGD>8514:?@?BHLIEA>97646689;;:855321123566666666799::52343357:<:7554345444455520.-/00000000000/.014778876445546842368:<:;:99:::89877659AGNRSRQQPMNNNPOLIIKR[UA21321//0369<===:75335558:96789:<;;<<:753313576344445664/,+*+----.1:7-++'6KI<2./0.,.4872-.3575.3@?;8640-,,+))('),143-*,-,.0.*)))'''(+377:3164.()+3:D=67B@0;XL74/38;988::42671++,,,++***0230+6A/%))*/122,,8>610042.,*-330,+,/048;::755685,&,99.'''*1557:<;9541.00003555551.3<@ALUI;@@=6;@:-(((()+/28HO:(.9K`oe96KF7*((((+130..-/0/.010003672/3>GJJDAJNP@4+6\rrvyp_YXWWZYUQF@>??>BFGD9*2HRRYd[@388430/-,5/@L@359:;=@<)'8=?HH?::751,(8PVJ7-.00255bbbbbbba`__^^]\\\[XXXWVUUVXY[\^``abbbbcefc\UQONPQSY]][WUTTTTSSSQRTTSSVWWWYZYYXUTUSQPPPPOONMMMMKHJKLNPOOOOOOPRSSSSRQPOMKMPRUTPNMLOTZ^_``^[\_^ZUOLLLMMNNNMKJKKKMNMNOQV[]baVOU[ZYZ[\]``VIDFGIJHHIIIIIIIIJKKKJHHHJKKKNOOQWZVLLSUPKLMShrj^Zjx||wtpjlqnkgbdjkgecaflkip|}{~zjafec`_aeffaaip~}gWQX]\^^^]Z^hlljfx||rgny~xvqceyu}l{uodZfvm`n{n[[`__ltbO^a]ggY[kqia\VX[_aZST\ixsifdc`airrpgxý­wlgdfb_bbb`_ceb[USU^a\\bhe`b`YUSOORPUXWUWYZYYXTSQQUX[\ZWSPNPQQPNX~f`dmunb\]acdejqz{m]SS\bcdec_]`adi^s`JPMLPQOMMNPPVZVSRTUWQLQ\dWKKGXVSQPOMLLKJHIKMNQMLTSORTUUVQbYSZUSTVYXWWWXWX[R]}TV`twaOLMLMNQUYZYYZZZ[]_`abdeddefbZ[]]^`ddbaa^\[\]][\\]^ba`_\\]bfggdca_]XSQPNMWccceb\UNMJJLNLJMMKTa\ZcmgPMQRQQQQQRRPOQQPQPPQOOPPOMMOMJJJJKKKKIIIIIJJKLKKJLLNOQQQQRRLJ]xeU\UOMMPV[UOOKJLUOKSWPHGIGFFEEFFEDDCBBCHLEBDFFFEDDFGGIIJLJHHJKJJIGFHGEDDEFGFFFEDDDEEEDDDCEFFGGHHIIHIJJIGGGHHGFFGFGIJIKLLKJIHECAEBBCDCFKMLHECCDIMQQRSVSKJKIGEEDDCDDBAA@AEHGFGHHGIIGFGGFFFFGHHHHHIHFFFFEEEFEDEFGHHHECDMUQHJQRKB?@CBBA>;99:9:84:;0VD=@=<=<====;<<;:;;=>?@@@@><::;;:;;9754688868889::;;<=?@=<<<;=>>>?ABAAAA?<;<97545666666788899876519Q^XVTPND748;:9:::::;:<<;:8666555678643444443215@ECDBDHDCEEGGB95889>====<=>>>>>>>>=<<<<==>?>>==?>>>=<:99:8668;=?>><<==<<;9:=:733;CT^WPF:65466538;;:=;;<<<;;<;:8669AMUURUUQOPPOPONMLKJNP:-40,058;?CEEEC@;9754456888878:<=<<<8421223478355455430,,-,+/0.---1/*+,,E75NF73(*//*+047632.*(()+..*&*5:7/,6;;<=:2.-+*('((-+'2CO[T9+(,594/-,-'(+.6972-).:=51561,-02784-+-.-+.6:730000/,+,44.)''.7954676675-*-02555432117;67BMKEC9667>;9+(7FA2.599?@BCB@?BCCCCC?98<:9:96::2Mk>B?<<<<<<=><<<;;:;>@AAABABBBB?@=<<74248<;<=??>>?>=<<==;<>==@BA@ABA@@AAA?:9;95345776666988886557::9964567764486333223;EEDB:>FFDEFFFE@:::;=???==<=>==>?>>==;;::;<<=@@ABAA@ACCAA@=;:;<<:777:?@=<<===???>;;:8866CVad_SJC:670/8<:::=ADGHIKH?8710;@@@DIE<::86558:;:::97531123346656788777778754323346785445566555544332100100///1233222468987888766530/110134679<==>>?A@?@@>><;:78@ACHJHHHFEDDA;633458:::9:<=<<<832222221/26655431.+*-,,020.,*+-,,15=;484,04333450(()().66..-+))*-.-340*(*,+*,-/.,,,,-,*-2337637968744;ED93:@6-5668531,((*.0/,+*))('+/.)%)41--+()/;KSB/,+*)(((*28.-9_jN/*4851,%(*))+.783,*))4?82640-/59>??821-,)(-2.+)())*,,.0/,)()/:@;40248<7.*-4<<62000-1=@6.:GEEE3/3792-+)''(+,..*'2DJJLFD]jG6CWW4%((()/332/+),220/011/..,()1AEGHGFLPL<2778C8dT-462,+/79/'.58=?5,.,+:G>,'+033-(FcW=6;A@:2/9ccbccbaaa``_`a`^^][Z[YXXWVUUW[^_`_^^\ZZVTSNMOPPPQUWUUZ_a^[ZYYXWWVUTTUVVWYY[\\^]WPNOOOONMLLKIHHHHHIIKMNNNOOOORSUWXXVSSUURPMJHHJJKIFGHHGGIIHGHJMNNNLNPPPONMMNOOOONNNOPRRQQQJHMNMPTXZ`fgd^SKHIIHIJIIIIIIHIJJIHGFEHJJOVXXSNT\VKSehfabtvuyvnikssnicafmplb_baabaansgftzqpnmov{|thfgede`^]Y[\cntqv{tomigiqy|sttrpmvzsrsufn}kfjtzs]YujajeXY][]__itt}cHLitv{aPasv}cZ]\UUYXTTTZ^YWVTROMNTZS|nkqvx|zrfb_^]\jr_\aj_IBBYcWPRVWWXWZZXXYUQTVVUS[bZUSRPRROX|abkh_YYXWWZ^`baciqqlaSKGGKJOTRU[Qp|OIONNONNMMLNPW]XSSRONLEI[gYG|٣CFRSSTRPPNMLJHKPQRYZQY]QNMLMSNdVRUSRSSSSSTSSSSQQTK\_YYSYmlSJNKLSUTSSSSUVX[^_acddca_]\[[[\^_^]\ZWUVVUWXWWXXZYYYZZZ[Z[\[[\\^`cedcdea]_``^[[YUPOWZYTRZ_]OKRXZUSRRSTVXUSPOPOQSSRQQQOOOONLMOOKIKLKKKKIIIIIIJLLKKKKKMNPPPQRQPOLCK`cZPOQSUWSOMKLHJUVPNKIIIHFFEEFEDCCCDCCDCBBBCDEEFGGGGHFGFGGFEEFGGGGGGHHFFGIIHFEEFGHHGGHGFGFGIHGHIKMLHGHHHIIJIHIKJJIHIJLLLKJEAGKKJMMJKMQQUXTRV\`a^\ZTNIGHIHHIIHEFGGGEEEGIJJKJJJJIIGGGGGGGFGHHIJIFEEFFDFFEFEFGFIKIGFEECDGIGCFLNLJGJHA?>>>ACCBABBABDDA<:<9;;;:977cH@B?=<<=;==>><:::;;>@BAABCDCEEDDA?>:778>CB@??=;<<;865789:;;;>BBAAAAA@?@A>9::731357766789:898756;BDHRWUPF>;88::;;<<<;;=@AABDDC?<:655567649@=433225@GEDC95>CDDFGFE@;;<<=??>=<<==>>===<<999:;=>?@BCCCCCCBCA?=;;>?=;@>>;77;?;:;<>?@@@?==:99877@Wgffe_YO5$.689768;@BCEHFEC><>CECBFHC<::9889:;;<;965311135667678888877766544333245554334566555544333234431002223322357899888766631//00022223688;>@AAA@@A@@?<<;96:LZWQPPRTRQRRQRPMJFCDDGJHFDEGFDDCA?BFFB91355788;;;==<;<84222222111243332/,,+,-.133/-++---2891.2/.02454640/0/-.3773-))493..-*))*02/1.*&'++**.352.--.-,+-0.39;:999:99::;=;99;7159;8785/+))+,+**++*)(*--+*++'')'%%$4\aD/,+*)))+#7L0,-92-/5862/...+1:??89DFB>87654-++)((()))(&&'6HKFC>>B>34R\9&)***+-.//-+-11000/////0002220/?TI,*2487;\z}nN-3HI:48;75433463/1:;47BB:<9Mc\"(-02.---,*'+28>8,-95+0;9,(+.04.+LeP>CFA@@50Bfffecbabaabbaaa`_^\[[ZYXVUTSTXZ\\[[ZXVUTTUTSRQPQSUVUSUXZ[\\[[[ZYYXVWWVVWYZ\\]_a]UONOOOOMLLJIIIHHHGIKKKMNNOOPTVWYZZWSSTUTSRQOMMKKKJJIIIIJKJJLOSUSRQPPQSSPNOPPPQPOMLLJHHHGGGFFHGGHJOUZ^`ba[RKIHJJJIIIIHGIKLJIHGGIJJJLT]]QJQ[VNQ`rnh}yo{~uokmtvofbb`drr]Vch`aoyumfbgorozshjnuyyzteb`_da\\]gnz|qmianxf_ij]\i|xrzxsPhladlvyq[Zszhac[X[[[]`acddmo^Z`xypswhYfvvzyjZZYXWTSSSUWXZZYXVSQQQRWLmqklpt{wfbcdoxxxvsmryfZauyZTXYWXXWZ\\]\[[][VazzbWVTOORSRRsw_a]XYWXWUSUY\`eghjkmmgbVIFHJIGLLG]`KLNMNNLLLLKMR[]VQPOKJGDN^bQ;c;PQQRQOOPMLJIHKORV\ZW`[QSPNMMXrMUSRQPQQQQQPQQPPRTINyo^RPLUohNIMMQWUQQQQSTVY]`egfeb_^\[ZZZ\^_[XVUUTUUUUVUTUWWXXWWWXXXXXXXXYZ\]^___ac_]_^^^_]RSY]_a\^dUNJKQPRSRSUZ^dieca\UQSUTQPQPOOOONLMOPMJKMMMLKJJIHGGJKKKKKLLNOPRSUVTQONLFL_fYPORUTRQQMKJ\\KGLKIIJHFFEDFEDCCDDCDCDBBBCDFGHIIHFECBBFJECEFFFFFFFFFEFHIIHFFGHJIGFFHFEEEFIIIGHIIHHHHIKIIJIHIJKKJIGIKLMMKKLMNQNLKGKQROSbfeiic]VOKKHIKMLJKKJLKKJIIIIJKMNOOMKKJIHHGGGGGGGGHIIGFEFGHGEEEEEFFEFHIHGEDDEEDEECBDFHFDGKD><<;:>AB?>@ACDDEA<8:;;<;84D~q5??==<>=<==>><:::;<>@BBBCDDCCDEEDCBA?@@><=:97655566655566467:>>??@A@@?>=;;<;622357766789:998757@DBHRUQH@=>==<<<<<==<<>AABDEEFDA>65677768AGB734449CGECC>99:AEFGGF@:<=<=>>==<<;::986568<;=?AABBBCCCBAA@?><<:8:@CB>@?A?;8;A?::<>??@@?>>=;98865BU``_ddbO5243111358:=BCCEECBBCFHKLD>;=;:;;:::;>=933311146789789889987765334333233333224666555554323455543333222222246899899766531/.010221134448>?@@I^g]TRQPTVVUSSSQNMKGEFEDDDCBA@???=:64990+'')***++*)()*,,+*)(((&'02-FlX5,,+)'''($FH),/'$2E?:730*)))))))..+(')('1??9984321,$&0//0/--/0/-,+,,..,,,*)(,5AF70,**+1883130+---,,,,/25>CDD?86799751.,*((((()))(&+:IF;5/*+*&8J8(),+*++,--.-/0/010/.0234762//./AL@/25.06;UwuT/0EB68>A>7455321226639A;:B@9;@DHOLQ\EL]MGEGV}wD<0,-11/262)')*/79/)-37506=956/./-0NWA>ML@867;Cedc``bcbcbbbaba`_^^\[ZZYWUSSTUWWVWXXXWVWWWXWUUTSUURQRRSUX[\[[[Z[ZYXWXWVVVY[[[\]\XSOONNNNNMKJKJIJIIIKKKMONNOQTWYYYXURQQSUWWVVUSQOLKKJJIHIJJJJLSYVRSRQRRSRRQQNORQPOOOMLJIHFEEDDDDEFHLLNRUYZVOJIIIIIIGHIHIKMKJIIHIJIIINW_^RJPWSGGYcdwse|{hlsmntvjZWXSXrv_Ybeaar|megddfcZ_rqijox~{yx`]_hka_l~lYWuzzxmdfc[Ybw~mxvWdugx|bKMbhX]dkrrgZW\\`c_ZZZ[[^`abbdfggmlmvwusplpvnh_WXZYVUVWVSPQQTWWVUSRPQQWP]xokijkc[comnxun{~z{oTXVUVWTTY\[VRPVcketSPOQTQQUXVdzq_\TQVWWVTSTTSX`cfgiiijpnZIJLIHJIHMNLMLLKLLJJIILSYYUOKKKIGEQ^\JE@ILMNONLKLJIIHGLQTXXVY[TSUWUTG`LOROQPNOOOOONOONNOOKHj|eNNOIYo^HJNPTTPOPOOPPTY_decb^[YYXXXXZ\\XSQQRRSSTUTTTTUUVVUTUUUUUUUUUVVWXXZ[[[[[[[Z[\_[RZdaabe_UVWURQRSTVXY\bcabeid[SSTRQQPOOOOONNNPQMKLMMMLLJJJHGGHIKKLLLLNQPRTUVTSPPOMMS_[SPQSRPPOMQa]IFIKHHJJJHEDDEDCCCDDDDDDBBDDFHJIIIGDBBAAEGDACDDDFFFFEFFGHHGGGFGHIHGGGFECCCCEGIJHFFFHHHIJIHIIGHHJKKIHKKLMOPONONNLIILMNSfwttsuoRHDBCHKMPPMPQNLMNMKKLMMMNPQPPOLJJIHHFFGGGGGGGIGEFGGGHGEEEEEEEEEFFFFDDDEEEDDDB@>;ACDD=569:<962\L=<;;<=?=<====;::<;<=?ABBCDDCCDDDCCDCBCD=5545446667677764446789:=@???==<;<>?;434557765677997776:CECJTVMB=@CC@@>>>>>>>?@AACEGGHHII?979987>>=>>>><;;9899636:=?BCCDDCCDEDC@?>=<<<<:9:;@DF>=GG=9;=>????>>CHB:8995;S`^]\^`E200/.,1359=AABBBBAACCCJRL@:<89;<=>?<=<722676789:<<<<<<;;:876643333323334332246655554442267755653221221112468888::864310//110111156446:>AC@@BBCDDEEGGILSXTNQROOQSSTTSQPNMNJCA?>>>=>=<<==:9<==<77:2).6999;<<<;8201113453322322-+,-../12211/+,.-.2564/+1982245:=7*+.,,..+,----,,/0011234320--/-.675/8;2/7?==;8@IKTM3Hk`F@ADeD"-+12/1793*('(-1/*+--23.1=?<;52/*2C=+/>A9-+159\[Y[^`cddcbbceca`^^\ZZZYWUSSTUVTSTUWYXWWXWWXZ[ZWTROOPQTUWYZ[[[[[[[YYYXXVVXYYXXWUTSQNNNMMNNLJKKJKKKKJKLMOONNOPRSRONNNOOPTWWVUUUTQMKHGHGFFHIHFFJPRQQRRSSTUUSQPPQQQQRQRRPNMKGEEDCCEFFIHFGHIKMLJJHGHJJHGJIIKLLLLHFHJIIKKNX``VLJKKJKNR`cZpzaQXjnqxlWRSSOTil_adbcfdbdhhegh`Y[bilorz}{}{}|wq\dutsolhb^]arsp~lf]OOVenu~~td_`homd_]PM\d_ZYZ\]^accceeenqhbip{hhhb\WWXWVVXVU]_WQQPQRTTTSRQPPQTPu|pkjf^\beqsoqozhTRTXYYX[cipsmlnlllab^\ZeaTVYZ[`ji_[XUVXWWUTSPKKOSY_cfdbhriRHJIJLLLKJIGGGIJLJIHJNUVSPLIHIHHGQYX<{jAPIHMNLIHIHHGIJRYY[XTXUSXYVVRQysIMJKJJLLLMMNNMMNNLNQJZ{gLLSMI\n\HKMPSOMMMLKJKX\__`_\YWVVWWWWWUTQOPOOQPQRPSSRRSSRRSTTTTSTTTSTUVWWWYYXVVVWXVUVTVafa][WSTWWVTTSTUVZ^a`[UTXWSRQRRQQQQPNOONOPPQQLKLLLLLKKJJHGHHIKKLLKLOQRRTTUTSRQQOQPQUTRSQPONLQcbHBIJIGIJJKHFEDEDCCCDDDEECCDFFHIJHFFDB@@BDEA?ABBBDFEEFFFFHHGGGGFGHHFGGGEDDDBABCEKJGEEFGGHHGHHGHGHJKMMMMLMNPPONONMKJMNIQe}{{vWE@CDJNQTVX[YUROMLLLLKJKLOPPQOLJJIHGGEFGGGGGFGFGGGHIGDEFEEEEEEEEDDDDDEEEEDEDB@;6;AGHITdCHxiv~qWJD@>@>;779;967[o4:889<=?><;;:;;::==<=?AACDDDDCCCCCCDCACE?85355776776666643688669?A?;:==:BFGDB@AAAA@AAABCDEHHHJLNJ>88877;CGE?723>?==;98768:<<96;ACA@=>@>>EHB;:==??>=>=FTPB::9:<;F\cc__L7036.+458>?@BBBBA@ABB>@IRQJBDIKMMLH<;5467=@?AA@@AAACCCA><;:976655431245454334555444334327:877775312222212356999:;953100/01100002554578;@D??DGGGGIJGDBA@AB<=HOLHJPRRRRQOLPNA=>=<;<<<<<=><8877778;6--2589;<<<;82/00/1454421120,+,.10/13111/,-0002232//6:6212389763//./7@GI?5685+',265/,+,.,,3850385332/,++*)(+36640.,*(+/0/-,*+,-..-296,))*,-,*)--++)(--*,//.-,*',@W_OGMLB3+.-+/492?P3,-.44+:\]_``T?>:420-)*3497/-)+6?80-*((*((>C1/661+&'*,--.)'(**+..//>J6(),**)+-..,/51-,,,,-,))(&,56.(*+,-/11/..,)(+/+4MQE61257645>GRP?/,0.-//-./0//,,.012221/-+*+-..////1>E;5;>;5/KWKD45LendN;8979@ACBCEEEFFFGGGGGGGFFGGFFGEDDDCBABAADGIGFDFIIIGHJKKHIKMMNNLLMMNMMLMLLJILLGLrvd[TSSU\holc]WQNMMNNONMMLKNPNLKJIGHIGGGGGGGHGFFFFFECDFFFEEEEEDDDDDDCDEEEDEEC@=@FLRW[^nb<<=>BEN:=<====?>=;:;<=:<====?AACDCDDCCCCBEFCACEB<645566445555553468757:==;30<=:>AB@:4466888777766655549HNPWVMEBBCEFFDCCDDEDCCCDFGGHIJJLLJA977779>CFD<33@EDEEDCCCDFE?>CEEECB::=??><=<:<::@AACCBBCCCA@@?=989988:;<=<<:9;>>BBA?@><>BDA;;;>>>=??JVXO>9;;B?5Dakg[ND<550.8:>AAABBAABABBBAACFNSU\^aaZM@=;7:ACBACCBBBBBBDFGFA?@@????=9741245555445544333224327::86775434432101136999:9642011/021////04566679?D>==>>954552145311359:;<=<71/0100234531242-,,.12344222.,.12201110179410./11/,+,,,1:DI@2-671-+)(050,,,..3<;5332/-./-*./.0132/.-++,,+)(+.-,,,.-.,*,//.-+*-/00./1.-*.84*.35443/3ANUWJ;9=;5//-1;=IDJF=67.)-13SNGdrYCFKHHHF=.+6GD1,+(,;>4-/010,()-,0971)')+....+)*,-../0/03/++,*+*****)0=?4.,,,,..-,(&&'(&&$$-HOA=82.**.74+8V_R?7@IIF?FPWgQ++1/-+-2444441111100000012454333349AB<;>?6)#<j6,.*:URHE:36:@FHFCDMQME>73436>B:/+1@E:A\dJ32<=:><81+*..-./-,.020+.34553/+-55.-430.0254+*3602:9.%'TUX\_acegghhghhda_]][YXXWUTTSRRRRSVWVWWXXWWXXXXY[_cec]YVVWYYY[\\\\\[[[ZYYYXXWVTTUSRQNNONMONMNNNNONNONLKMNMMLLKJIIHHGHKLLKLMMKIIJKJJIGFFGGFJMKGFHJKKMOPRUVUTUXWVVUUUQPPPRUVRONOLGFFEFHIIJJKJIIJKJKOPMJIHILMLNOKFFHIJNPV^ZYa_ULILNOLMRYegaajk``ntcTVVUUSU\^]bb^]^__]Y]geij_]ZSh}|uzux|~}x~}|vkca`XZyuy{xwnaada``eqy{~nYcjjhhea_^_\YY[]]_a`ckialo_YZTMQ`\MU^ZYWVUUVVTPQNMNPSRRRRQQPOOPQPPK^vjgifeffkkddmruiu}n}^V^_\\]_elighg`WYZYZ[VSLDBFHKPTZ^dlgSGKLHGEFKNPLGHJIKKKMQQOIHIKKLOPNRXDz̀>>??AFFBABBCCCDDDFFFGGGGGGGEEEEEDECCCCA@@AA>>?A@@>>ACA????==>==<>>???@BCCCCCCCCCBBCDCABCC@<96655654454444455579;;963574>EC?=8766788877776664542:NSQVRJHGGFFGHGEEEEFFFGGGIIKKLLMMKC<766678;@FG?56AEDDEEDCBCEEHD??EGBD>==>>=;<<;>@ADDEFCCBCB@<<<<:98777999:;;;:;;:@CC@??>===?A@?:;<=>?BJPTRE<;9:KH3DckdXOH<454:?ABCCBAABBBCCBBBCFFDKUX[^WB7@CCBDBBBA@@BBB@@ACCCBA@@AAABA>931356655422343333233214898788776753212035699897420010/021///.06877878>C<;AFGFHGC><===;636:@GIHJNOPQTSLGD?=<<<<<<=>>=>?;435752244444579::<:5389994122337:=5-*++,04433551,/2210.///043/.-,,--.----/54/53.,++.*).124673.-,+++-20&),-+-.0.-+(&(,/////24430000149414664333=JPRPF:;<9860BWT<736PZNG2+/11H@0DfT.-636>BD:0=NH6*+,*/==1055.'(()*,..-***+-,+**)*,021///-+*,-,+++++,--2?A6-,,./12/,-+'&)++*5LMA82/,*((+/2-,Jj^@128=93;LXmF)03/+)-7:767643322124589::::8545678:<==@@:2-E?3,7HHDYiUC?:4-*18:5*+30)1;?DHC=704:84:<5157/*-/..025752596-,:C9-*TTW]`abfihijiihda_^]ZXXWVUTUTSRQQRTVVVWWWWXXYYY\_`_][YWVUVYYZ[[[\\]\[[[YYYYXXWUUUTSRQPOMMMMNNNNNOOMNNMLLLKKLLMMLLLJJJKKKKJJKKIGGHHIIFECCFFHHIIHFEGHIJKLPTWWWYYZ\\ZZXUPPQRUUTWZXUTROMLLLMMMKJIIMONQTRQOMMLLNPQRNFFJGTXVSJRW`f\SNLMNKIR[]acjvpgkwu_RSTSSTY[di\VZZ[ZYZ\_bjh^^aakv{}{yy}vs}pkrz|}teT`yu{{snlgddc`bimvv[Ydgfa\YWY\^\XZ\]\]_chifcd^[YXUQQX]hnaZWVX]cc`bclk\TUWROOPPPOOORRNOOH[rhfefjkgg_Y][VQWfkqľösq}zvg`a``bdfidbgli]WXVWXVVSJGIJJJLOTY^c^NGIGC@IV[[SLMMNNLKNTUTRUZWVUTRPVZLaRLMMMLKJIHGHHJNSUQVUQ`]NMONOKd~PUv}jji\[XPOgjijbSMMNIGapTGKMJIKHJ[bSJMLHJL=H^\ca^YXXZ]\WPMLNPSSQQNLNLLMLLMMMMNMNPPOOOPPNNNOPQQPQPPQQQQQOOPNNQT[VNOORTTTTTUValh\SMJJIKOQRRRRRPPPONPPPPPPOMONMMNMMMMKJIHGGHIJJJKLNOPPOPQQQONOONNHGKRTTUSNNRQHMQOMKJJJJKKGFEEDDEDDEFFGFFEEEDAA@@>=>????ACEDDBCCCBBBEGGFGGFGGGEDDCBBBAABB@@AAA@>?CGGFF>DHFEC>EIKMNNLKJLMLKJJIIJIIIJKMMGXqk]u~zppg\agdcaYVSQMPZcea[QIIJJJIHHHIKLKIHFEEFFFGJJLUVKEEEDDEDBCCDDDCCBAACD@=<:<=>>>>@CDCBAABB?>=>@@ABBBCCDDDDDCDBBB@?>?>??>@@=85666655443445568;<9466882DGA<<:987888777666555764@VVRMILKJIJIIIIGGGGGGHHHIJKMLMNPOL@85655579?FG>56CGFDDDCCBCDDGFA@CC@;;==>>=<;;;=BDEEFEDH?>>=<<;:987879<:8:;<<<=;:BDEB@@@?=;99?B>;<==?CIJLPKB<;8DPG1DjjkaVNFB<@DABCCAAAB@BEDCCAAHI@>LU[_W@=DEECECCAAAABBB@@AAABCA@@@@ACC?;722566641/.12333333331368998:;;9731122133587774300000//1/.//.29<::;99>C?<=CGGDB>>@B@<846@C@BGHHJLPRVXOD=9:;<<<<=>>>>??:545786554455667889833@FFF<30234;C@1)(()(*.1136960/000.../...-,,+++-//010/15896.+)**+,-01100132/4<8--22/+('*-+*.35664110/20050)-0/)-011.-+*-,,,.1367874123441/6::7/-1016=DE?=?<8=DEU`UC181UiM;,,.-1A?03AA7/(#!&,466;AC@;:94.3;4,..*&'')****))(()*+)'&'*0443210-+)+,,+++++.113991,+.3753331.//*,7CPP<070)%%''),06.BkZ70350++:897687100027CG>889:8=NL9:;>B@2-3887588446=FTZ[fkaVB5DM@357?MQP]\KLE/)*.20/,'+9<8DSSROE<538:21>B733/+14/-343/-01)&-2.-6:64UVX[\\`fiijjjiigc`^\YXXUTUUUTSSQPPPRSTTTTUUUXXVWVSSRSTUUTUXZZZ[\]]^]]]]\[[ZYXWWUSRSSQQPNMMMNMMNMNOMMNNLJJKKLMNOOONLMLKKKLKJJJJHGFFGGEDDDFHJLLJHFDBDGGHIKQXZY[[Z]```_]ZYTQRSUV[^__^^]\ZWWVSPNIIMRRPQRRRSRNMMNPSSMFHLTR][GMLQafcZPKKKMRTS[aer~utyiSOUUSSVatr^X_a\TU^_WV]`_anwmkwqqzqx|pdaj|kforwtkje_dfdaaddjo]X\bca]XTVX[][Y\___^bjjdhlgba][Za`eyycV[^hkeecbjqy|wnpsiaXQNNMNNORPNOLIqoffcdon\UUSSTRSTTV[ýlqvtywlecccdegifdgji_UTSRRSWVSQOONJHHJLOV[TLKHDBGSUTUUVXSOLLOQRSTTVRPPNMLQORARLLKKKKJHGFEFHOQQOSSU^UNPPOLMS\p{pf_JXzfkZJHKMMJMMGHKLIIJIGLYVLLLGGI@YnI_g_[XWXZ]VNKJILORVWUNLNPPNLMMNNNNNNOOOOOOONNMMNOPNONNNNOOOOMNOX_TRRORPQTTQRVY_b[RLJIJKLLOQQRQRRPPPPNPPPQRQOMMLKMNMLLLIIHHHGHHIIJKLNOPPOPPQQPNNONOKECJOSUSQONPKKOPNMKJJJKKHEEEDDDEDGIHGFEDDCCAAA@?>AAA@??@CDCDCBBBBDFGGGGGGGFFECCCAA@AABBAABCCCCAAEFFGFDFJQXc[NMMMLKKJKKJJIJLNPOMMNMMNJDVri_v}~|x{g^dddd`[YUNOX`cb]VPMKIIIJJJJKJJJHGHLNPTX[]b[LDDFDDDDDBBBBA@AAAAAABA>@BBBCDEFFFGLbCDDADU[ag|hLDH=68;<<>=>?CCDEEDAAAA@BDCDDDCDDDDEEEDBB@>;889899;=?:7788753444444468974345673GG?::;:87888866765545864CYVPB>=<<;;=@CEHFHJ=<<;;:;:98769;>?:8:<<<==<=@CEDBBBA?=:8:?A====?CHIJLJGA:8>DOB.Qeim_Y[^_RDBBBAAAAA??CCDDDDEE?>FPZ\PCHFDCCDCCA@@ACC@ACA@@ACA@@A@BCDA?=72355431.-0443333345458::989;<;9533221224677521//000/-/////03:=<;;:8=>???;515AGFGIHFFJOQVZSG<46:;<<=>>>?>@?<7445555655556668888309FIE@61258<@5,)))+*+-/02574/...//00/.--,++*+,0100/.-./00.,+,/200.-1640.--,094/010/,)')//+,4655545305687.*+--*.///./0/0/-**/34765422231*)0887/*.-&"%+268854?H?80+"$KGQX7,,,,,/=C9AF?@7+'$+/236867:=??>8321-++-42*+02/,)(()****-,./445667420-++,+++*-012110-*+1=>;:=9/+.&%9LTPA85754211110/-*9KD304310,(;x~5;:86459>@;9;960,/59;>@=74569;:42222AML9,28;:@@;;IG>3399;<726876?@AABB@@CEEDDDDEGHGFGGGFGGFFEDDCAAAABDDCCCCCCCCBDGEEdoEIJIIIHHHGGIOSUVVSQQRQMNOIH`sa_~}zjelkfed`XPOWaeda]YRLJKKLLLLKHFFGKS[^ahmssbKEFEEDDDDDA@A@@?@@??@AABA@>@CCCDEEGEP\AGEFA?@BGYqziVYfupVA=>>>==>ACDFGFACEGEFFEEEDDDDDDEEEDB?<=>:8666668;:888875534444468:764344446FD<:9::85777777755567:63BXTG:7>CGKMMLLLLLJJKJJKMLNNNNMOOOQUG43876579@DA@@CCEEEDCEDCCDCEEFEE>536;>==<;;=>@CEEHD;<;:978987765?CDDDDDCA?><:9=??==>@DGHHIKF>8;?=G93Zge_[\_XIBBBBBA@@AED>=@BDDBBA@@COXL>BC@AACDDB@>?AA?AA@@@AAA@@BBBDDDDB<8533220..2543332457889::988:;;<<:64344336861/0/.000/.///00149<<;;:98@E>8?JG?=;:9789958>CFFFGGFGMSWYWL>5699;===>?@>=??:4245566666676788997129<;;83368:9/+,)),,,-.01340-,,-/1220.,,,+*)+-120.,,**.10-,++,,)()((00)$%')+/012///.---+/2158545462.16AE9,+-.11**-/21,-22-))+062.11//1-'%).12/,-,,+*+-/.,*-66*$#$"4QMHB430,+./6GTWO<1*(,.=C725::610/028<8321001/*).40,'(+,,,*,8@B>701349:::6/*++,,+/1120,+*)+3;:ENH8,)%$:RXPB7;;9988/'())01/.(=W==;SeC1532138AC=><960.5:=?B@87525<<59?;:=HLC0)269>FKEBED>3;F?>@;68859HPQ[`ZQN[gZHJXWPPK>436@E@@>1)-46.34417FQYVNNOD6.,./..+*/237CEC@;9879:2(4N]_bgZ;&&/XXWVVX^ejlkmmkkmi`\ZXWWTTTUWVTTUTPMLMNOPPPPPPRSUVVWWXYXXZYYZ[[\^_`___``_^^\[ZYWVUSRRRSRPOOONNNNMMNOONLLLMMMMNONMNMLLMNNMMLLLMMLKJIIIJJKOUVVY[XV]d^OFGIIQW[_^]__WNPW[]___^\\\XQNQQQQQSTQPRRQRSMHIKIHKNPPNOQSQONLOWSAjhsrOJPOJRdnlc]WNJNPPY^XXalqjhjihZQastsvvuwxxu|qXWdospx~{vttportuxqmnhdhqzh\doqheaWYbhhgimxxsx}zf\\^`^^`[ROQV\[XWY^acfki^^owoqwvpfdfmv~|zypdemw{{|~r_YWVYYVTTUPWnedct{f[\XTRPOPOQSOAi“i|zitZcmnmtzsjhhffgfhgil\GGMOSUVXWVUTSQMKJJJKJILNNMKGFHHJKKMLJKMNMJIJKKKJJIIKJLE|DLLLKIIJKJGGF??IPNOTMQ_TLNMROb}hQX^[^fp}dQFDHIJIGGGIKKJJJJJJJMQMMLHD^eAGVb]WVUTQKJFGJNNNKHKOPYY\XSRQPOOONPOOOOONONNMMLLNMMMKKLKKMNPTalj^XXXXWVWVTSX_ZPIGIJJIJKMNPPPPPRQPPNNOMMMKLOMLLLJLLKLLKIHHHHIJHJKLNPRSRSWSPOONMLNPPOQRQMLNNMMONONONMLLLKJJJHGEEEEDDDDBB@@@@@?>?A>==>@BCDGIIIGFDDEFHHHHFFGGFFGFFEEDCCAAABDEDDCCDCCCBCGDFʒHCIGGGHHGIJLPW\_\XSQSRSONQQKHXlgf~zkiiggfbZQPTY[[ZZYTNLLNOOOONJFDFR]cgjouo[GEIHEDDDDB@@@@@>>?@??>?ABA@BDEDEEEEFCP[AFDDGEFGFBBI[ZPQj[@=?>==>?BDFJHCDHIIHGEEDCDDDDDEEEDA@>?A?;85786788888867752444569:752233329@<9:99:8767656655678::65FRC<:9::<@FKMMMNMMMMLLLMNOONNMNOOOTM80795578=<<;=>BFA=>999854447766?CDEGGFDCC?:79=?>===AFIIIIJF>488=A2<]fbbZNE@ABBAA@?@AGQJ?<?ACDDDCEE>?@@@AA@@BBBBBCDDBB>5120/..2531234678999::779::;=?=9888732683..0/.010.///0001368:;;:858@?9AGA;;99878:<===@AADHJGEIRWY[UD88:9;====>?><>?=84333566677778889::99778::645486/--*+--.../023/,,,-/2430.,,-+*)+.3310/-*,24/...,*('((()())(*,-./0210000-/0,/4678634221.*,QrU4,,0;8,)+/0/.3:;72..480+/1//0,&%'(-0.--./20/-+**,,,+++,)'?SKA=?9/+,,-3H\RA9,'(176<7369;74.(&$',/1231/-,*+142//0.-,+*+1@MQ8+,./06=?=80***,-1//20*(*)+0/5IWH6-%*ETRUL86=<::89@EIKC2'&%073-& 7`Xb~vU8,00./05AC>?=:9:88;=?D@653/4<91:C<;@HJ:).44:@EDBBAB?FIA=@A;88859<>EPQHCCO`XIIO]fe`E11127::2.-/40+6I66MUXZSSUJ=3-17::6/++16@FKIC=;999:3)/DZjqmlgJ/,XXWVVV[`eggijijkga]ZYYXVUTUUUTTUURONNMNPPPPRTSSTUUUVWYYZ[ZZ[[[\^_```ccbaaa^\[ZXWVUUSRSSRPPQONNNONOQPQRPPPNNNNMLLMMLLMNNMLLLLMMMMNNMMJGHMQSTUWWY^cd^RJIKNPSVZ_bb]RHFJNSTRQRTUTPKIHHHILMJIKOPQSRNMKIGFHLNPTXWVSQOPT]P;aW\VMLSZemi_YSLHJT[ZTV\_accdd]`kmkjlmnul\_ovxsljivzoruvvqopjbgqru}sia_aeb\\cefeikopmtkvsd_bc_^_YRPQV[YVUUX]ceda]^jpjmqtw`Nb{vry}}yw|}gWXb_[]bgd`^SlcebztVZ_^XRPPONNNPCZ[yPfvPO\chktytlhfbdffgfio`IDJKMQTVWUSSSQNLKIIKKJHIKMKHHKKJKKIJJJKOPNLLLKJKKKLLNLabDPMLJIIJJHFFC?JY\Z__SZ^OMKNGYxdY\TPJShu{zwxwurjaUGHFGIIHIJKIJJJJJJKMNOTIC|PAGQ][UTQLJJJHHIJNTPMNOK[XOOPPONOOPPPOOOOOONNMMLLJJKKJJJKKKLMQTdnj^Z[[[[[YVSW_WHHJGIKJKKMMNPPPPOPOMNMMMLKKJILKJLLLLLKKKKJHHHHJKJKLORSTUVVXTNLNNMLMOOOQRSOKKICDJLPPNNMMLLKJJIHGEEDDDDCBC@?@AA@@>?@??@BDFHHGKMLHEEFHIHFFFEEFFEEEDDEEEDCCCCCDEEDDEECCDBCGCJžMDMJHIIIIIKPV[[YZ[XTSTSSQOPQPMHSgihvz{}yxwigg`^YRLLNPOPQRPNLLLNOQRQOOKEHT^afjjfNA@?@EFDDDA>=>>>?>>>??>=>@AA@BDEEEEEDFDPZAFCCEBDFFFA?EGGL\qrN<>@=;<>>@CFHGFHHHGGEEDDDEECCCCA?>CA@?>:867:9877688877764466568965243324987999887777655555589898:LJ78;:87777?KNOPOPROONMMNNNMLLMONMQO9/4:7467:??>>??;6:BFGHEDDCEEEEEEA7239>==<:<>DE>5477633445537AIJC:78:<<<<;;;;<<;@CCFFFFCC?<8768<<==AGKKHEFE?9:<;?@/DbfaZGC@CC@@@???@FQRNHA@=?ABBCA@CEA?>>>?ADHJLQUQJJJGDDA?@A>?@AA@ABBCCDC;310/-/243114677778998779::;=>=:;;9531462-./..010///000002337897446;==@>99;<=>>@@>==>??@CFHHGGNTV[[L<::9:;=>>>>?@?>?=732245666777889::;>??<::=;620353/...../0/0220...-/24541.---+++,1444330,084.0/-+)*.1.+,,+-1454442000100-.540268740000//--BU@2/-1?E9,*--17==<==>>@<3/12122-****-..-04/(+1/+&,0.,+-..(0PXOD752+&%(+3HN;231--8>.0456893/-,,,*(&)/21.*(*5?>78<94/)*)*(-?L5$''&',2;@@;/*(,?E6/31,'((**$/MO<417KTFDTG3:><9758@FJNL<,&/::5/)#*GRl{W<42.,,+3=?<>=;@ID;7:>C@61-.360-6:757EL:*063141-7?<<>E?49A@9665550/28=4.2:CEI:2WmjhO52433413740.&)8F5:W`[SRSH:72/;EGEBDA3/435FMB8:=<95-%,CZ_``^ZK1.XXXWTUXZ\]\\^cecba^\ZZXYYVTSSTTTUTRQOOOPQQPQTTSSSSUUVXYZ[[[[[[\]^_`befdeeca_][\YTTUUSSRRRPQQOMLMMPRSTUSSQPONNLKLLMNNMMNLLLLLKKMPRQQQOKJLMNPRTVWZ\_a_TLLJHIJMWadbcYHCCHKIHHJKLLLMLMLLNNNMLPSRSVVTRQPKHFGJQVVWWW[ZY[[B\d_SROJDR_biiaTJIMQQQSW\`^^b``iljjihikuo_ipnxub___lwupotvwxtph_gstvz{xyvfc`^`bcb_abdhfa`z|ikwwoggfa^^XSPQV[ZWUUVW[^`bb^cjhfjsrRZ~~|y|~ww{i^prf]ZZXOOTWTSTJkkbc`tiMQSTSOPPNLJINDVžİvXhyaMztWSVX[`grwungb_bgeeillXIKMKKLNRUUTTTQONLKKLMLKJKLKJJJJKKIHHHNTUURMLLJJMOQPPdir>MSMKIIIIIFED>Qqsnk`U\fZLPLGSq_QbXWXRRWWcjijg`chkotzzzvk[LGHHLNKIIJJJJIIJLSWOAwCJHNZXSQLHFHHIHIJKOOOONJMOIJJGIMOOQQPOOOOOONMLMLLMKKLKKKLLLLLLK`miaaa_`]\YVUWSIHJJJLLLKLNNMOONNNNNLKJJKJJKKIJKKLLLMKLKKKKIHIIJKKLORTVVVVWXUPMLMMNMOPQRRPNKKJBCJKPPOMMMLLKKJIGFEEEDDCCA@>?@AA@@@>>@EILMLLKIGEEEEFHKKGDDDDDDDDCCBBCDDDDCCCCCDDDDEFEDDBCFD@eİ_>JLIJIIJGJPV]_][YXVSSTUTSRPJJMOIM__UVZ]`abckojkgYTROLKLKKLNQMIIJLNOQRQPSPGHT[`ff\OCA?>@DFDDB?>=??@>>>>>====?AAABDEDEEDDFDNZCFDCDGHGFFFCDEFHBGS\el]E:>=<;;<<=?CGJHGGEEEFFFDEECCBA?<=?>;997768:9888788777664466556743443234876898887776555455687458?NE68;:988769EMNOPRTSTQONMLLLKLMOOPQG315:85469:<>??@>758?EGEDCCDDDCDDE<348:==:9>BCA8244332467626DMI@9898:;<;;<:;;;;:>@@?BDDC??B:736:<==AGKMFBBB?<6C=7FC;Ide[QE?CBA@@A@@ACHLMPNI??@CEEDEDA?>>>><>>@@?@K^dbb_\ZRGBACBA@AAABBBBCB?:63001345457889987757899::;==<;=>:642353//./1111//00001111246631378:<<;:=>>>>>@@BEGNTSVWMB=;:::<=??=@B@??>92235676568779;:::9336423/,,+,-.381#&;@/&0100/013:D_k^O;-%*1.,.1D@3562./46,+-06;7,*++-482-/22222(*CPC56:73+'*)('(073+*++($(2=C@5,)-OY;-11-++-//(/J?02DYQ4-EN959=<9524;BHOOB23<835;1.),N|a=8642-+,,1:;:89:=C@848>A>5-/233/.11016FF1)143561-253122./9A<7650/440033324513@9);[leJ=;8=EA:=E>2..2<=5AUYPIC85:91,/48>JQF852)1DE:57::51&!0N]UNSN?/&%XXXWUTUUUUVVV[^]^``][[Z[ZWUTTTTTTSSRRRRQRRRRSTSSSSUUVXYZ[[[[\\]_`abehiihgfc`_^^\XUSTSRRRRRQRQMLLKLOQQQQPOOONMLKKLLMNNNNLJJKMMNOQRRSSTUROOPPQTVWZ\[\`_UOMKJHGIS\afi_SIEEEGHHJJIJMPQPOOPRRPRTUVVVWWUUTQMKIJNPRTY^`_Z\UAWmVYUXXMHKKMZbb^[TJGJLJMPRW]``beeffhlnmu~mUSX^ghcbc`dnqkouv{xpkiqxxwxxy|~m\_`acb^]]\\^`cgkfaan}jcffa^\XRPRV[[YXXWUV\ejd[]efbacprgdwxx~y{zkPJYbekbKMMMMHHGGENjaafm`UWTVUSRSPMIFFCRjmͽl^cdmxX]r\T\YYZ\blsvqga`dhcgniYKMRNLKJJPUTTTSQPPNMMMNOOONMKKLLLMKHKMOVXONOKKKJKMPRRcf_uUERNONIHKIGEF?A`sql[QPan]RNHOocEY]QS^_TLTXORX]closzaKFIMLIIJJIHGGHHMRYPTCLFNXUOKHFGHHIJJJIILUTLGFMLJIFFNPPQRQPQQPPPONNNNOPPNNNMKLMLLLMGYhhdddceb\YVTOIKLLLLMMMMMOOMNOMKLLLLJIIHHIKKMMLLMMMMLLLJJJHIJKKLLORSSTUVVVVTSROLMNONPRSRNKKMLHEJKOQPOMNMLKKJJGGFEEDDCBCB@?@@A@@A??@FLONMLLJGFFEEHJKJGEEEEEEEDDBABDDDCCCCCCCDDDCCEFEEBCED>xt@GIJIIHIIGORV[\\YXWUSSTUTRSW[_X\nj]URRWWOFHOORT[cc\YXVVURPQRSQMIILLMNOPOSRGJY^cd[MFFBAEGEDDBBAA?AAB@>>>>=<<;=AAABDDDDEFDEFQZCFDCDFFGFFDAEEEHFEC@>K[T@:<<;<<<<=?AGHIIGFFFGGDDDDCAA?>===;8887678:97778877766456655556544456677698777766644456668:;8;HH;48:9999998;DNPPQSUVTQPNMLKLMNOORO=3359866679::;<>>=;79?CEEDEDDBA@?DF>688;<8:BD?:43333447:86;JRI858;:89:;<<<<;;;;:=>><;:D9=I=>Gi\HICCAABBAAAACHJIHHCCDBFIHFFFC@???=<>><:89@IYhggjigcZTUQME@ABBCBAAAA?=:514556678889974457899::;<;;;<<;843444433567530000001101234679;:8;===>@BBAAAA???>>=<<<;:<@AGPRRRKGC=<;:;=?><==<=??:2035786468779:::9:>AB>:9:5-**-33--..///,-:C6*+-+,010.------./01220,+*)2;6241/.-+++,*'-2-'+6<631-,,+0445651-...,+,-/..2313771*2GF.),**),.-,*-7A?9<@:433110./,))025:6&*GO91834=:1+--,+.49:40:43HXG1&6J?.5998852149EPPE:<<33:?=5$$DtL?437887546<:878764335:<80176341/00//=F8)-03;>:531.,*)')-?@CGJLKLJIGFGFDJMKHGEEEEEEDDCBBCDDDDDDDDDDECBAACDCC@BEEDˉDBEHHHIIJMQSTSTUWVVVUTSSSROKV{~{kabc[LEIEBCFVih_]ZYZXVVWWUOKIHIJJJLPSTPS_dcXLGGIGECCEDCBBDECABBA@?>>=><<>???@@@@BDFDFGVZCFCCEFFEEEDDCDDIFDBC@;@SP?::<<<<<===AFGIGGFFGGFDDDBCCA???=;::77678987667777766455554566534798666699777778764456877APF@<77>EFFEFFDB98BHG><6766>FC:66877788<<;BOTC716::999;<<<<<;<;:<==;;<<>><;A>;::9:;?ILE@@@?>>>B;?H:<><8GfM>FIBCCBAAABDFF?=@>CBIONKGFFDCBBCFLMF@?>=?=?Rdebbfjhcba_SE@BBA@?@@@@?@;4555788777762135788899::;<<<;;:767668::<>>;6221110/0254246;>?=:>@A@>@AAAAA????>>=;;<:99::=HPSQIDD@==<;=><<=<;<>A?61146766777778::99<<:5-*)*./-..///./,2IO/3C:141+%%&'()((2>H?764210/--4<9.)-4;=7)0IODBC>@FIHHYb\fhZW_ft|lH+-,4I;683++*(()***/1,.50-45(#+32///*1JN954-,/0/*'%(00+*'+5:4)'(1;90---,++*****-2662//2IYE313;?736766643102;IPH?:7434=A:,*7\k\WOA>A?=;857:;9854112344/.352250+061-;C3*0.9LI8-,,,+*)*(*>IIK>7>FK@123/135620.-)&(11-?>=>??AEIJJJHGEFEDMOHDDDDDCCDDDBBCCDDDDDDDDDEECA?@ABA@?@BE>fǜFDIFGHHHIQWXWVTSSTTTTTTTSSQRNPm||iTLBBDBFZgb][YYYXXY[YNKHHGHHGHKPUZ]baWKGJJKIEA@DDBABDEDCDDA@?>>=?><>>>=<==>?@CEEEVYBDCCEEEDDDDDBBCCCDBB@78=SN<;><<===<<MTSSWWWVUTQNNOQRQWH0/54677556777766567;;879>DFFGHEC;7:CEA@;757AE>79;=<<====>HRRB226:99;;;;><<=<==<:<>=::;<==><==;;;;<>BJI>;?@?>>?><9D;6A:>1M]?ABCBBBBAABDEDA?>@>@JPLIHFFFDCDIU[YK==98;>>@O_e`\^bcbceaK9997789877:AHE956788787652236899:::9::;<==<:879769<<=??<7211210.26754467;>>=>A@??@BBB@???>>957:99876776>LSQGBDDA@?>=<<?A=2+*++**+....///.*3LSC9>EGFHHGD?;6.-./.,,,++**3=8/-,++++*(*9C=9<;7840/.-++--01.0321.+*+'%-70)*,,,/=J@3=O[M70)*)'(*++2DMC50.,,-,0:CJG7)'/=D5(4JRLJHGGFGI\R1;VQ?:Nk]:00*+B@?:2..-*()**+/316<91+.3.(''+/+(3CA31-%&(,,,+)*02/,*/<:2/,),273/....,+****++,,)')*6=212+,27830.4654331.I;B_gXU]^\[\\]Q721233331,),0-+03,-;<.(7D7(*4I[ZK<2-,,.01))=HKN?0-:Z\7,4751277.()*(*,+7Vnsstvy{}ydQRUUUSRTPB:;4*()((,465?90.?TZ[K/)3.6gYYWVVVUVVUUVVVVXYXYYZZZ[\[YXXWWWXZ^b_[ZYYYXVVXXZ\\\\ZYYXYXXYZ\]_aaba]VTWZ^``^]\\[[[XSQPPQRTTTUVSQPOMMMLMLKKKLKKMMMNNNOPQRRSTSSTUWWXYYXXZZ[[[[XWXYZ[\^_ZPMRTUUTQPOQ[cda`[PHIGEEEEFGFFGILNOPQTUUVWXXYZWUVWWWZZZZ\\\]]]`a`cfda_^^^][WVRHK]^R[lmdduryjY[fuyoinv|`LJ[lptqjdanurwo\]bcnurtywx}{sc`aeijejoi`_`alv{||{zyune`cfed_[XUUTUVVZ[brzysiddpv|~z{i``WO]nxiSPRNHLJIKPWSm~hdcZQRZcfb[XZ^beb`c^WW^x{dcbefa}fPQW[afi`XY[X^vxidbbmzbGINOSVQNORVURPONOQQQQONOMLJJJLMNPRTPKMRRJIVZLG[qfVSK_nSAGMV_\XQNONMLIE@CQU[YRSPRa\JFIehYZPVVIJSSVULSVNNJEBBABELYd^ZXXXVXXXZSIFHHFEEFHIGJebKMLLKMOLHFEFFGGGHHHGGDHdYLJKONJNPQOMJNdvmseMMNLIFDFGJLMLLKKIIIGHJJIJKLNPRSSRPMLLLMMMMMOOPQQQPMLQUV\WKKLLMMNPONNMLMMLLLLLKKKIIKMRQSXYWVVTTSRSTTSTVXYZWSRSRQQRTSQOKHDEGILNNLKLLJJIGEEDBCBA@@>>>>>?@?@??AEHHIIHGGFCGPLDBCBBDDDDDDCBCCDEEEDDDDDDCCAAAAAABA@BC?QFKIIIIGIT[YWWUUTSVUSSSTTSSTSTQNohNFDD=B]j^[ZZZZYZ[WOKIIHGFEFFIT`eaXMIMOMLJD?=@FCBBBCCEEECB@@@>??>>>======>>=<=;RT@DCCCDDCDDDDBCDEEDDEC:72BVI<>=====<;::>BDFHHHGEDDDCCCCBF@>;;:878887778886766665555545555467776655665678:<:899778989:><;:::8789;;<;9;<=?@@@=?KTNC867699:<<;;>=<==>=<9<>>@<:;<<=<<<;;;;=?BDA=>>>=>=====:>;7MO8D?AAABBABCCBA?>@@@??AEFDEDCCEOVWVRI??>?@A=9EYc^X\`a^a_H3//0/3320159DNF:7779888885358::::::99:;<==>=:9;769:<=?=:60.11/./378765448<=;<=<;>@@A@>==>?@8047743224425DSRFAEGEB@?=<=<>HPK?77:::744798777778;;99<=>?@;/+--,**+-.../11/125ENIHOVWUSSRNJ@53210..*)+/5?E;1-+**-152-7DGD<:82*((+,.01.,,,-0110./4-&*/,())*+-154/Aub8365-++,-048=;63/+*+,3@HQL82/(9H3&8P^TH?:8324Y_8'))//*6@>7553)'3BD<4/..+))++,-6><881.>F1+/;<4315410-**-21/.---,,*'))(($ +3-&"&?@.,15750,).454451*0AD52543236856>/400Hnznu}}{_6.1245653.---*+/-/?J;('8G?-0GVSKB8-''*1<;+*=B@@:;37]X40;@91/9;0(-23>>13?L[`altrqwudXXYYWVSQQL@0+*'$%(.5D]m_D5/*),,*0740),3ATU?-',-7eYXWWVVWVVVVVVVWWXXWXXWYZ[[YXWWWWVUUY]]]\[[ZXYZZ]___]YYXWWWWWX[\]]]^\ZXXXXZ[\\[ZZ[ZYXUQPPPRSSTVUSRRONMNMMLKKLLLLNOOPPPQQRRSTUTUWWXYZ[\[Z[[\]__^]\\\Z\__]WNHHMMLLJIMTXZ\[PGFFHGFEEDDDEDFJMMNOPQRTXYY\][XVWVVX[]]^^^`_^```ccfgfea``_ZUSQVgl`[ea\s{~zoknzxttw}jcntvzthddgouuf^myy|}rq|~~~}vf]`q|x`Z^`]fv~}xsrpkdbbeffecd`[Z[ds}~qho}t~{tcfj`]VS^_[^`NMWNKKHIMTVUJW~mldTPTUYZXTSUZad`YUTTQWxdba_d`^WFMVZ_^]YVXZXWkoeacpmRIMQTTSPNMOPNLJJKNOOPLGKMKIJLLMNMNTUNLPNP\TLIC^p\T_nTCOOPPOOPPOONLKID?MZ[bWMRQU]WNK[cNTZY[SNRSMJTVTSLJJGEDDCBCFLMPdkjjjmvt`LLIGEFGJDNfUENLKJLMLJHGHKJHFGIIHJHHKMJGIMMJKLKKLa˭[FOMLJIIKKLLLKJJJIGFMX[ZYYXUSRPOONMMLLNNMMNNNPRQQQOLOPPYZQNNNNMNOPOMMMNMMMLLLKKJHIJMQOQY[YUTTTSQPRSSRTTTX]_]XTQPRTRRPMJHGEEFFFHILMLLKIFEDCCA?@@>>>=>?@AABBCFHHIJHHHFDLQHCBBACDDDDDEDCBCEEEEEDDDDDCBABCCCDEEAFAi`@GIHJKJIVd]TTVUTSSUVTSUTTUUTQRTOMyo\OKF:GlcYZ[\[[[YSNKJIHGFDDCFSaf\PMMMNOMMH=9<=<=<<:;6QO>DBBACCCCCCCCCDEECEEGC:30ESA9>=;;;=<;88>BFHHGECBCCCCDDDED@@<878777777779877766555466555656876655455679:;<:899:99:<=99<;999868999:;;:;<=>?CNUWYZWSPPQTVX]C05667764435665555665358989>BFGFEB;439?CB=;AA:7<@??@AA@?OSG?=988779;<<;===<<===;:<=>E>669;=<;;;<;;<>><=><=?>=?A@@>>>>><;;;9HE@KBBBBBAAAABB@@@?<:9<@ABCDCDMTTUVYWCBCCC@<45@?<<;7799;?@=:71/0.-.0268864348;:9:9879<<==;;;=?@=;94430012221:NUI>AEEEC?<>@>=FQL90028;9667876777778899<<;<93.-/0-*-0....12238<20DMC?IOOOPPNLKG?5111/17?EHKH;2.+)*,7CG:/>D<512+''(*,020...---/22114.**+,,,*)***.1.95/-+)*++)(2=96943NQC@;;DHNXL8,+*))/1-.2,)%(CF30+'-002/+***+,+,..-+(')'$#4RO4181<\b^XC64/,)+-//04327VQ5--2333323771.06.CvxsxjT502455665420.,-/.9PN6(+6==?OaS:.++))+-2;9,0?>;49GB9[cWVG965.2@41:84@H7.+-=FL^b\i~|nijkkkYFFNM@420,/1//1=da1)/+)*)'(*,++*+2ED2+-.-)JwxYXWXWWWVVVVVVVWWXWVWWWXY[[ZXVWVUUTTTX]]\]\[ZZ[[]^]\ZYXWVVVVWWYZZZZ[[Z[ZYYXYYYYYYZYXWWSPPPPRRTUTSSRPNNNNMLLLLKLMNOPPPPQQRSSTUUWYYYZ[[\\[\[\_aaba`^][\``_^THGIJJJHFFIJNZeh^OHEDFFEDBCDCEIKKLNNNORWYZYWVTSSSRRV]^]][[_abbaaabca]WUUSRQQXele_[STo~vqxyplv|xusw~yx|vmomacok`o{uoeht{{{}}zzyrb^_u}qb]a`]hw}wqjgffefffghhigifdio~{xzzx{yoninw^RSXYYWSRWc^S[\ntPFJPW_^TQNY{|nlcXQUYTLPVWST]eaYUTUTT}pcecaebWhSGIRY^[VSTUUXTTqqcafl\OONQTSPOMLMLNMJHILMONHIMKGGKOONNLPWUMMQLWhUHJMbi^a`nqUHNQQRSQLJOPLIGGGE@RaXWPNRPX^PO^fQEMOYYQRTSIBHQVSJGIIGEDDEGFGGHHXiuxuwz{|{oWOIEDFHGJNKLMMKIJKLJIIJOU[_YQLIHHKEFHHJKKJKHPR_y`MJMMNNLMMLLLJHHJJILVbjov}{iVOMMMLMMLLNNONNNNQRRQOMLMMLNPQOOMNLKLNONNNPOOONMLKKJHIKMPNPW\ZUSTTTRPQRRSRSTSW]_]YTRRQPRRPNLJFDCA@DGNNMMKJFFDCA??>>?>>=>@BCDDCDDFHJJHFHGGQNDDDBCCEEEFFFEEDDEEEEEEDDDCDCAACDEEFFCGCxAFFDFHJHPabWRUVUSRRTWUUVUTVURQPSWNSxljpq[@Uj[X]\^`]SNLJJIHGGFDCJZbZPMNMKKLMNMB7:=BCDB@@AACB><=>?@@@@@@?><=<<==>>=[L?FBAABCCCBBBCDDEDCEEFEB>41HH6<=;;==<;979@FHHGEDDCCCCDDCBC>@<88:888888878877765566466678:9:8766566668::;988779:;==<<;;:999987889::;;<<>@?>=<@:557:;;;<=<<:9<<:<=<====@CBA???>>=;<=<7DDDFFCACA@ABCCBBB@=;99=?AADGNSTTVXYWMB>?<:8876;K\^\]beYA9>=85323344567@IG<:;99:99648;;:::::999;;=?@??>;99::;==<<:752-,/02577655579889877778998999;;:<932322246764>PN=;BCGJA9BLF50.+17:;85676667777777:97740013578842/..0./77.*+/5521.+,,-00/,()*-2531H[?5752000.,+*),.10..-,+%#8VO2++,03231B[I-)(()('$4UN@4%@ffgzrgY942,7A?<;831-+*)($%,14::@VWQQH=AIIMI?880'+75*'#(A<*==('('+-+.364.)'(+,.11-*))&/HXQ?;AG7,Zn@56.('&()),245]}O>>6/35851111//2:58ktzd6045655431.-.,,./9LK4(,/-3GgjG.(,2431///0+6?98,)928@6//-9KXcfmttst|m?6>;89;::?D>87;SiQ.*.+)*)(&'+,+)'*..('(,-$.KJZZYYXXXXXWVVVVVWWWWWWWXZZZZWVWVUUTUWXZZ]]\ZZZ[ZZ[YWWWXVVVVVVWXXXZZZZ[[[ZZZYXYYYYYXWWWUSRQRTTSSSSSRPNNNMNOMLLKLLNNOOOPQQRRSSTUWYYZZZ\\\\\\]_aaabbbaaccbaa]TPKGFGHGECCEJViun_OFDDEDCCCBDGIJJKMNNPSWWTQNMMMNMLNV_c`[TSZ]\WTVVUSPOPQVXVUXfwuli^e}tnrsqxxhblty~~ztsx}}{}yxzpmpk_^fdkz}tkotvy|}{vvuk^achͱ|h`_^`ktqmkhffiijiiiiikjjfhjmmfowyvbUQO[\ROU[XOSaotrk]Y[XSRTV[]ZW[XYZ\flsjc_Vamne[]Z[sxrg\XW[_RINXXQNS^b\XXWWWtfdgffkf_ZsLLKPSW[TOPRTWTHTpocdi^MNQNQRQPOOOQSTPNNNMMPNLMKHHHHIIJKMSVRNNONQQFM_[Sevs~rJJeeYTQSPMNPNJHFEFFBN_RJOPON\VG]iVJLMKWXRSQNIA???>>>@BDFFEDDDFGHHHFGFJQIBEECCEEEEFFFFFEEEEEEEDEDDBCCAACDEEFDCDDVDGGEHHIIKSRPRVVVUTSSUWXWVVTTUSQRTSSR[pxqukxe@\iZ\Z\c^KHJHIHGIIHDJWa\KHLMMMMMMMMG<<>@EEDB?ABCB>:;=?@BBBA@>=<<;<==>?@bH?EBABCBCBCDCBDDDCCEEEEDD>6;D>:>====;:998>CKHFDDDCDDCCCCCB?=:66:;9888888887777778865689:9;:7767789:<;;:;8667677:?>96:<;;;989979:<<===???>=<<977644545555566677878;AFGE?:::=ABBAABA?CCA@@ACHNC?@=8789988;;<<==<<<<9=?@>>95455679:;>?@@=7:;;<;<=?@A@???>>==>=?==@?CIHDCA@ABCAABBA><99<=>@FOVUSVXWXWRNJ<03457:8;GW]^afdQB@>674455666667?E>988:::8558:::::999989;=????=<:;;<>>=<<:::72.-.02446665776678778865455444443455444468::77BM@8>@DKF<9=>=>FC4/0--19=73565446878867886542236=BD>41.//.--39:;96;DEDHNTUPJ?>C@>=;;FLOSTNA>>7.+))((.;;50/1//0340,)*,1@OM:.**,1475/+2522321..25443/*.+++,/0000.,++,.//)%')))&,BF0)-..-./*:P?+,+*))),682--"$MkyaVaHHD,1;;9:;9840*((''-521>JQQ^T5)9OLNL;192(/6,%',:J>-3.'(+,-*&%*38741-*+,02/.,*'?XE+2FFE3,>qZ065*,1&&((+/3;uw9>@;975675301332683Q}]2265765431+(*)(*-1>J;+,6-%Cm[4,,01120/--,,<>14/"(0(JjntkL345,-/8DA85400/,1DYao|ph{F152002448;;997:@9,)**))(''(()))+2698*&--++//^]\ZZZZZZYWWVVVVWWWXXXYYZZZXWWWVVVVXYXXZZZYZZZYYYWUUUVVVUUVUWXXXYZZ[[\]\\\[ZZZYZZYWVVVVUSTWWUSTSSRPOPONPROLLLLLMNNOOPRRSSRTTUXYXYZ[]^^^^^^_aabcddefggggffeb\URPMJHFDBABRkwti\OGFGGGECBDHIHJKMOOPRRQNLLKLMMMLNZdd_TJKPPMKMONONOQQYb_ZTVk{{vr}|wxxvxn^X]dmv{~|xxz|zrmz~y{~pinkca`bhuyo}yqru{ve]ccdzykb[\bmnkjkmmkmolhdgijknkghj}vbNEVb\^fxtmqonlkrvh]ZVUUUWZ[\\^dpieosxvfckigegb]fqufYX]e_MFHT_]NLSZ\\YY^brzdeigilkaLedLPNPRTWSNNQSTRX[blfheUQSRRPPOOOPPRTQMR[VONOOPMKNOLKKKMORSTQOMMOKHJQWST_m}KPjmhd[QQNNSPKJKIFFECJWUPQQLU[JSdTLNMHNXQPQNIF@=bF?BABEDCBBCDCEEFEECDEEDDCA;4=B<>===><<;:9;=EIEBCDCDDCCDDDEEBLNH<::87777887777788888747997546689:;<=@>=<;99899759><758<;::99999:<=>@@@@><<;;;>H[eec\TTUWZ\D<>CGFDB>>=:876654434666666777:CDDC<;;=:>>:=>:6675689::>DHKE<9;;;?>:;==>>??>>>>=>>>?@@A@@@FJID@@AAB@@AA@?<::::;@JQPORWZXUTSRQG87679:<<;>Q``cgcO>==867868;85679=;7889:9766889889999999:;=>>>=<<;=?@@>=;::<<83//.-/3766557769::;8444222332212356654468:;<;=GD9:<>DHC<989=CA3.21/.387555453587778988876335:AC@91-,../00//0210036;@BMXYN67FCBB@>@DLT\R96?=5210.,.9>;7326;?<8420/))6LM5()())0:<516;7775457:8/01/-,,,.26422220/.-,/82&&+++*)-021111.**(7C<8940///01+('))%6d{f[eU;0/).9>>;987:91036774.-;KJ?NH$*HNNN@.+1-(+/*&(.:6()*)*.0-++)%')+-493+)(().20,+-+$$2<@D2'-PoD0745K^C*)0333?^P29:;;AB<866679733831jj809<;98879<6)&(()-/4HJ604+#H\<)/81)+/011.,.@=073..+ /VkoXC?951+)8G>101441-/B\ouuwy{G-230,-/34+),/0)%((((**('&&''(*)'2NagileTJIIIGEDDFHHJKLMOPOPPOONLLNOONLQ\`^ZMEHIIIIMPSSQQMNVYYTOXhqokp{zwsbRPUZ`enz{|zpip~ufjqhab^`kpip|pr|rd_aevpcaZYanplnmlnnorlgchjknlfivtrrgVJZ\\|}ŻhW\WWXWVUUWY_ejptw}yo}jgdcefgecelrj_Y`fXJM^mxtXLQSWYV\gjewdfhghifWLPZUPSSTTSSQNNPQSUjyklj`V[[UQSSONOPPPPMR\ZRNNOPONQVVTRQQRSSQTVPLMNKHJLLORPl}VRjf__\[YURONLIIJIFDCBGOQQRQPXVWcSHMOLHUWMNLJGC?BNTPNHCFGEEFIKIIIJJHGJLJGO`a]YWVRNKIHGHJJJJIIIJIIIHHGGFEFHILKKLLLLLKJIIIJJGMXjFKMQKEINPOMLKKIJLMKHIOYekom`UOQTVURNLJILQRSZ_aa]VQPQPOMNNMPOIKPNMNLMNNQSRRRSRPMOMKIIJLMNLKKMPW\WRTSQPQQQQQPQRRRTVZ\fi^RSTTTRRPPNKHECCM``PJHGFDC@>??@?@ABDEGIJJIHFEECCHKGLRKEFFECBDEEFFFFFEEDEEFEEEEEEEEDCDDDCCCEEFFFIJGGFGJPQRSX_ccbb_YTTTSSSRRQQQSVUOUftpd\YTSTPVaj|zlnUJ_ZWYZSKJIGHHHIJGK[^OGJKIKNNMLLKJIIJHDFHHHGHHHGHIIJKJGC@<<=9::;87468:\@<=>?A@@??????BEEEDDEDDCC@?65?A????><==<;;8=IFABDEDDCCDEADFH_rnL6:8888878777888788875345544569:<<=>>?>>==<<;869=;867799:998:;;<>>?@@@@=;998::<==>===;:98888987788=BFD?<;==@FDA@BBBCCCCDB@@CA=;;:99789:<<<<<<=>>==<8;=88:9:;;;<<>EIJA87:99<<9;<=>>>?>>>>>>>??@@@@@@>CLH@AAA@@@@BB@>=;979>FHJOUY[YSOPPOK@767::=>83AZ_abdY@:<86984>====<>?@?>=<;;<;:964/,0564556899:;<<6223432222222244333368:<<<=BD<8::>EF?866;A>2.1200037754443477658997874468>@@?7.,-../0/.,-...-,-.035@QG.:I>@??@@AJRZP4)0642232138DKC947CHFCAAB>856AE6)))'&(5?;535532100363-/0012005;;74443221.*-670/00../,+.01372()0:?>=:5/*3EPC&&)('#)Rt{nzR+&')*2CKG@:57:88UQTI5130,(,/-++)*($(()+-//*))''()(,1/,*()+02/.+" %))(09+%8==8898@Xvh6/9;9679547:99>OG01765542332/4o}0*=>??<;:7;D@.&*,-031@PD4,'3M;"0A@2+-.021../B;0;743.%$.7X\RK:461*7A1(/034314H\h_~}wB%+10/.1;<14>?3$#*,,,-+((((,131-'.CKDB?:46T[;cb`^]]]^^\YVWXXXYZYYZZZ[[Z[[ZXXXWVWYYYXWWWVVUVWXYYZ[ZYXXXXXXYXXYZZ[\]``__^]]\\]\[[[ZXWUTUUUUWXWWXXUSSQPPPPOONMMMMMNOOOOQRRRSUWX[]^_^^^]ZYZ[^`bdefghjkklnnjfda^[UOMNMKIF@BLOR[b[NIJJIFEEDGJLLKJLOQQPQPPNLMOOONLOU[c\GDMMHGILNV__^XQQSSRV`fgb`n}wsscPOUUWY_lxuutrn}oipqd_a_bihk{ty|ub^fttSUXW^ntpnlkptspkiijkmqkn~vwmYTTSn|y}tpgs}}~~|z\RTWWWZZWUUX\cjqtxzunssolllllhfgig^\]XMPgwvytZOSTSSVaigaiocegghg`SNPJOQPSUVURMLMQN[qupmqkZQVPKQRPOOPOMPV^\NGMSTRPOPTWURQPPOONQSOKMNKJJMPPO[sc\ifkfiqlec`_XOIIIHECCCGJLNQPPTU]XKONNHHYTLNLHCBAEONIKHBCFFFHKMHHGGFGFHJGCGT\][WTRNLIFGHIJIHHGGGHHGGGGGFGHHHIIJLLLLLKJKKKKKKIVvRAIIKNLMMMMLLJJKJLMLJTcovo_YXUUVVUTPHGJLS]bipqppk`SPQQOKLMLPQNRQMKKOMOPRUTRRRQLRZUKJKLNMNMLMNQV[WSTTRRQPQQQRRRRRSTWY]ef\RQTUSSRQNLIFFIZdSHIGEFDA??>>??@AFGFGGHIJIHEDDEIGIPPKIHGDCBDEEEDFFFEDEFFFFDDDEDFGECDDEDCCCDEEFFGGFGJMQSTVXZ^][Z[XUTTTRQPQQQRRQR_jpi`UKJHHPRNK?DRce`p~XU]WYOHHGFDDEGFDK[YLGHIIIJLLJIGHHIJIFFIJKKJIHHIIIIHHGC?==?A<<=?<;;<>?W557998:=<:8789;?ACDDECBBB@?=77AB??@><=>?@?;:GF>=BEDDCCCBBCFN^gcI7888887777778877777753345456789989::;9::;;?:37==84677788999;<<=>>>>>?><;;:9;;:>Siqj`XUSVOCBBBBA@?>=<=>?AACFDC@<::;::98887=BDB>:;;?ECAAAABCBB@@??@BB@??><:99:;<<=<;;<:99899::8888:<>?<>?>==>>>=?>???@@A<>INJHCAB@?@BBBBB?;679<>DQY\[[XNNUVLC8779;;8587DTbcb^F9:68978?<8:;989::899::8667777888999:;;<<=>>===>??>=;<<;<<:::982035545579;;;;:84344454432220244344459<<<;;>@<89;;?D@888:>=4.1222245445531366424897885694...//....--.-,-,-.(''(8>7=?<98=A>=FQVF1-..,,378;?<=967877>=3-.1/03.1DA:61<>'$:4551,'#LoqW>;:5/41(*.03424>KRF>htl?))-/-),5;>AC;*#*2432/*(+*(/993/-0>]U;7;50=;&fda`^]^`a_\YYYYZZZYYZZZZZ[[[ZYYXXXY[ZYYWVVVWVVVXYYZ[ZZZYYZ\\\ZXYZZ\]_``ab`^^]]^^]\[[ZXWWVWWWXYYYZZXUSRPPPOOONMNNOOOOOPPQRRRRTVX\_```_]ZXWWY[^`acdefghgfdb]WVSQRSRQPPNLJHGIJJLOPMJJKIGFFEFJNNJIIKOPOQQQPLLNOOPOLLUgmWFLTNFEGFO[bge_\XSSVY[aeit}~|~}rus_SWXWWYcpvyquxwtquoa^adefiwywx~~p_alztbTWdquuqmrwwspnmljjpsqsvca`Sp|xss{yzzzeUVTQVXV[\URSTVYcjltnsx|zvpiec^\b`\[`b^`a]WRRVWWY`ggeXx{defhfgcYQORTSNNRVWVPIILQM]~pptscJMXVQLLOQPNS^d\PGIU[WSPOMLLJJJKKKKLMNLJKKJKKOOHUn_S`UVdimrkihffcVHHIFEDEEFGHJMLT\[UORQNMFKZROPOKEBCHNLHJHB@EGGILMHGFGEFFGIIJJJQWXWTROKHFHIHIHHGHHFGHHHHHHGEGHHHJJJKLLKKKKKLLMNF^fUKEGKQNLMLKKLLLLLLMPZkxvk^NJW[WSUXTNJMV]ceejmjd\UUROPQTUVTRTY_hfVK[]SOPRRRRRQR\feTKLMNNMNNMOQRUWUSTTTRQRRQQRRQQRSRSUVYaf_TSVVSRQPMKIIKTNDFHFECC@>?@@@ABDHHFFGHJLLJGFDGIGPQJIIHFDCBDEFFEEFEEEEFFFFEEEEEFFFEDDEDDCBCDDDEGGBEPTTUUVVVUVVVVUSRRSRRRQRSRNNc}smaUJDDCEN[WTGHMctqisxtxt[`Z\C>CBABBCEDDS]KBHHIIIHIIHHHHKORTSQOMLKKIIIIGFGGDBA@>DIG?:?DFDDBBCO5468989>B>:8779>>>>?B@@?@C=:>BDDCCCCEC??JD>888888888767789877677655568<<;:987778778633872786556778889:;;<<==>>>>==<<;;;;<<7>>>=====>??ACCA?=<<;::98878:@A@?<;9:::879:;=????=<<>>>==>?>=@?@>@AIPQLGDA@@AAACCA>><867=LY\\a^RJX`\PE;7;<:89<:7DVbf`F679::>>>>=><::::::::98754345665798997645765455443221244444469;;;;:;::::;::@?78<<<<6/03313543367400442004789:67:;=?=92//01211000232220.67044-0>A:;;::;=8@PP;38764.:D;:@=,;PG@CFH:*,.4;AFJC>BC@?CB=ADE?:751.16876789:::89>CDEDBA=9730.++-/8BA962--.**-065*(4EMH8*)-/+KD(0***'% !R^1/12-+04@GDA?==BMJ:2574;I:+,(*2?SD(%)-14589641,(+-)%(**)&%(-101/+''('%#);E>71-*((((*))4=7343/.//),=:068::::965449Fdi\I5110/1134763^99B><50./014797320.-0.-9;;8;=*"4A@:2-)+.---10E8.=90293(*(KvyZDB>71.,+..01444>JL;*dnBAF<89=<3+*0569:/$&*2?@6/)(+((264/12,3apH376.'%%hfbb`_`bbb`\ZZZZ[[ZY[\\[[[[[[ZZYYZ\\\\ZWVVWWWVWWXXXYZ[ZZZ]``^\XYZZ\^_`acdca``_^^\\\[[YXXWXYXYZ[[[[[ZVTQOPOONNPQPPQQOOPPPQPQRTX[]_^]]\YWWVWXXY]^_``aba^[XVUTSSPPPTWSQPPNMMMMNMKJLLLKIHFFFFGJNMJHGHLOQQQQOONNPPSSNLXikXFHTSHEGFHNPS[a_ZVRPS]jv|ysry}qpwhTW[YZ\bjqusuv~zotqhdgigfk|xx}zy|whe}zac_npqtqswskkmpomkkptz||sonq{z{ru|u}wq\TVSWZTSQSMGLPRU\hr{xj~Ǥwrzpvv|{tpmnq{}ldfiWMVXYVSRUZZW[ehd[wsbdfhfbZSQQSTSPORTURKHJLNMUm~pftdYqgVm~~kYSSTRZkfQIOZ_ZSRONMJHGGHHIKKLLJGFGIJJLPLVodKPROHM^dhkh`XRPMIHFFGGFFFFFHKKX_WUXUQONJSVKMQOKHEDGJIHHFB@CFIKNMIIHGEFFGIIKKKKNTTTSQMIFIKIGHJHHGGGHHHHGHGFGHHGIIJJKLLJJJKMJKMETqwfOILLMLLLKLLPPPPNR\lvuhSPSPQPKP[_]_gknpngb_ZVTOLNNONS[`d[VUUge`Z`pbSQQQONNMQ^phVNLLNOLJMNNOQTUSSTTTRRQRRRQSSQPQQPPQSUZ^`\TRTUSQPPNLIIHGIHHEBAAA@ADDEDFHHFEFGHJKMKHGEFILOLGFGFEDBBCEFFFEEFEEEFFFFFEFFEFFFFFEDDCCCDEDEGGGBIUVVUVWVVVVWXVTRQSSSRRSTTQUg|zmh\PGDCCENZXYOPN\vuxss`GWU]`eODHGB@BCCCFPMKKIJIHHGHGGFIQW_ca\ULJHIIHHIIFEFGEB@@BKOJB>@DEBBCCKX:348;79>FD@<989:@DDCBBBBCBA>B@789;????=?<:<@CCBBCCC?85445789988887887689888899889::>A??=><:8887894/-48556448999:::;;;;<<====>===<<;;:::<95>>======>?>@AA?>=<=<<;:9998:>??><;878?HGEBAAA>@FIOTPE:<==EF<>>=;==:9:<<>@A>>=<<==<;<<==>>?>??=@IRUND@@A@BCCCABID<:8:FRX^`^[KQ]b[TH;:?><>>?:>><=>=;:99::::976433466657766665578886555333222343332568:99::9::::99>?66?>9;842223333336740/120/-.479967:8:=831001355545679;:;92=;98;>=;:98667853=NPNPNLG@:2/,++.,-9@7-*(,30.-+14/+:[_E'+:8339P910++--+-)1Oln;1;HF=5,1IC851.*)+-/24:<==<641,&$7LJ6*)))')-+**01*,Sg@-86/)*+hfddbaabcdda]YYZZ[Z[\\\\[[\\[ZZ[[\^^_`]ZXWWWXXWXXXXZ[[[Z\aba`][ZZ[]]^bddedbba`_^]\\[[YYYXXYYZ[\]^^_^\XRNMMMNPRRSSRQPPONOPPPQTXYXXWUUTRSTTUUVWZ[[\]]][VSTTTVXZXTQQRSRRQPPNLNONNNMNNLJHGGFFEDINLJIHJMNOPQQSROPPRUSLHPekQ>L[RGHLJGGIMRY_\URVds{vkiosqlgjriYSVZ_]]eqllrrzquzkyzrkjkihmu|}||wouzyvw}yggwyxsZ\{ornmorrng`dilnolkpuqgimmjdaurm{wtwz|`NWZ[WPLSRVcwvZWaesyi^ņ]_mnlouytolnq|w__debTQX[XRUVUTOSaec\vlbbfkcYTPRVVTRRQQQQNGIKMMMQ]lcQX`OMyhd|q^VQYdYKR`cYPOOOMMLMMMLMNONNLHFEEIKLKGXneONRMNJFNZghZMHIIJJHGFGGGFEDFGHQWV[_YUUXWW[TIJFFHHHGFEDDEECEHKNQQPLLJFEFGGHIJKLLMQSUTROKHKMNNMLIHFHHGFFGGGGGHHHGHIJIKLMJIIKMJJMNSln_QKKKKLNNPPOVZXYXbjrl_TQRTTQKGR\cp|~}o[SRPNOOPONMNNONMKLPOZYSXsgRPPNPNJJM\shSNMKKMPNJLNPPRSTSTTTTTSSRRRQSSRQPPPPQRSWXXYYWRSSQRPNMJIHIJHGDA@ACBDHHGFHIHGEEFGGIKJHFFFGKJIHFFFEBAAADEEFFFFFEEFFFFFEFFEFFFFFFFEDDDDEEFGHGERXUVVVWVVWWWWVTRQSSSSSSXRVlynoc[MFFCCCK[YYTPXS`jtqzd::GY^iVSPLFCCDDCHLLNNKKJJJIHHKNRX\YSLEDCCCEDDDDFDCFIGA??CMNHMTQMGEDEDM[9547:8=@IIE@;;;;=ADB@@@EDDC?@D<779<@@?=<>??@===;;=ACCABB@<9:88777888887788778879::;;;;;<;;<:::;:98877851/267568779;;::;<<<<<======>===<<;;:9766808XkdX\U?A@@@???>?>>>>>>>???>==========<:::;?@?=<@BBB@@BBBA@@ABBBAAAAAACCBBBC@>:746GVRRRQRSQQRSTUWO@<=9AA<=>=<=><<==;<>A?><><:;:9;<<==<=?@@A?@JTPD@AA?ADCCCBFC@>;;AIQUV^bWNNV^_XF8>===<==<<;:::::9764334444556667787899986655433223444322457988::::::::8;>75??98;;7323323345531000/...038969;:9:52210/13344466788:996WkWMFEE6174/2>GNEHH2-24:94/,+)*044:FONKLE611108HN>0)/.2541/.133322420112563001/,:NQLOPMG;2,+)(''&#+72(')/62//-/133Imt]3+B:45:8>:0,+..)')'19Q=:O^O;>=-3JKA?JUL8)-/25872-*(*/;5,.2415>>4-,376.*('*)'%)/ATK<811/-*+*-=F?65553113550043DbL(*0-/322///02227;<<9630/243462/./1247956;4-...4:830/,*(.330.012;:,'*'*.452356/7F1/<6-/1042'=e`MD=740.,++,-.0111555.;h{[15:AN]gW?EUWUJ95;6''@PE1'***,+)'),/1+%?X4)411100ddfecaabddfe_XXZ[\\]\]]\\\\\\ZZ[\]__`a^[YYYXXYYYXXYY[\\]_bda__]Z[[^^_deeeecbba_aa_\ZZZYYYYZZ[\]_``bcb`[TPNNOQRRTTSQQPONOOOPOOQQPOOOOONOQRSTUVVWXZYXXXURRRSUW[^\TOQSTTTSRPMLNNOPOOPOLJJGGFEDDINMLKKKKMPQQQSRRSSRTTJDTkkSCOYNGLNKKNNMP\bZRYo|xi_cgfcelpwvkaYZ_[[bp}sgpzqg|yuuoljijmq{{rrwyy~q`gouwux~z`Ut}uvaX[~vtmklqia``aehkmlmqtplklkingxtrbcqyu}~hPSVVRPPV^g˫vYR]to]W]^ĝhcgknlkuxnjfbiosr_[da^ecXWZXQSVSQNNV`c[od_fjcVPQQTXWTRSRQPNKHIJKNRQZdQENNGXiqw^SgxWQ]WNXhdTNNPPMLNPPPQRRRRQMIFIJIKMNKUi_LMPOOMMJIS\WIGJLKKIHIFDFFDBADBASWT[YUTW[`di^RMEABBELIBACCDFIOQRRSRNOMHFFHGHIIKKLLNQTTSQMJKNPQQMLHFHJIGFGGGGGHGGFHIIIJLMJHIKNHGLSTWSLIIIKKJJKJNTY_`bddb`[UTY\VOKHIScmw~}u[JLNMNNPROMLLKKKMMMLLJGRkmYRPOPMPGManhWNOLKKMNOMMMNPQRSSTTUUUTRRRRQSSRRQOPPPQRTUUVZ`^QOQSROMJIIHJHECABCFFGHHHHHIHGEDFFFGIHGGFGGGHGGFGHFABCCDEFFFFFFFFFFFFFFFFFFGGGGFGFFEDEFFGHHGGNTTVVVVUUVVVUSRRSTUTTTUWPVwwnmXXKFFED@IZWTSMVNOimnlRSV]gTb\WUPNKIGDCKNJJJKKKKJLPSX[[YTIEBABAAAABBA@BA@DILHA@BEDJ\b^XRKHHELP775123:@GGE@@?>;;=BA??>BBDFA<>=;99;>@?===>????=;:;=@BCBB>;98:9877788887777776779<<<<;::;:::8889878:8773/076/069::9;;;:;==<<<<======<<<;::987635986Gaf``V:@@@@A???@??>>??>>??>===>=>>>>>>=;98?BB@@ABCACCBBCCBBAABCCDEDBCCBA=;4;OVTVWYZ[XUUVVVWSI>78<<<=>=<<<<====>=@ED<===<::<=<<=??@@ABA@ENOEABA>AECCCCCA?>=;<@JOOYbcOCKX[^S=9==>@?AB?;7779::;:98899:<<=;:888767887887778887:<;;==;;<;;::988865542444345566788889999866666433234444323565678;;:::::8:=54=>97<>9543222344431///..01/-3898:<;8311///.---./035789:;4?cdU\]XQ@245.6MS@91.*/51+*/>;23J\Q2-CG,2OP6/BYE1-,(&*351,+++.1/-*+,).51,*).47887542.(+9MUPQPC73-***&1B8"'333237;7.(,29UR)$,+,,,./.,,-,.159<7111//04682../014:AE?3?jR=@=835:513531443/,+),231/.///87)),)*06637:70AC/1:2,.0152*7GBB>231/.-*+-../0244/295=`mAOjF(33Fhn_C2=JF:5?E:1+(),1/&'*-.0.$2P<(../232]_bba`aabcec^ZZ\\]]]^_^^^^\]\[[\\]_``aa_\[ZXYYYZYYY[]^_abdecab`\\[]^_cfefgfed`^bdb_ZZZYYYZ[\\]]^``bdefda]WTTRSTTSSRQPONNMNNNNNOOPQPOPPPPRRSSTTTUVUUVUTRQPQQQSUVSTZ[XXXVUURONOPPQRSRPOMIGGGHFFJMNMMLLMOPOMORRUUTTWVMK_wsVITVKFJKJMONMVb^S\yk\[`_\]k{xuzyufUU]^`qwtnihyvx{tpnllmnv|upjtohv}wvvuyvS\abqhXWizyskour`\_abccfjmtrss^ekklo{f[ibgos~|yqqrQJOOW`ioqtxƮ\[zv_U_gcljztywhu|qic`epqlceib__in`WYURTUROMOS[c^gy^^miPKOSVWXVSRRSRQNJIKLLOSSY_RLPIKiwjqfUNRi{}mkgQShgSLPRQQONMNNOQRSRQNJGFJLJKNJYoZCINNMNMLKKMPOKJMMMMLLQKDFEBA@D>Ge\UQORVX\_a[URPOKFBDJJCBBBEIJORRRRSRSPMJHHGGHHJJKLMNQTTSQOKNPSSPNLJJJFDFFFGGGHHHGGHHHIOQJIGHMEAJNQOLJHJIIJKKKMS[]ac``[\^\ZY\WOLJIIShsty}zn[KINOPNMOPNLNNLKMMMLLNKG[pbPPQLQGGM_phVQSQLJKMNNONONOQRTTUVVWVTRQQRSSTSRRPPQPPPRTUUX^gcVSSROMJIIIHHGDCGGGIIHHIHHHHHEDEFFGGGFGGGGGGFGHHKIEEGGGGHGGGGGFFFFFFFFFEFEGGGIHHFFEDEFFGGIIIOTTUTTTSSTUTTSRRRSUUPLLIFHWjtjaIZJHHHF?K[XTTPQJZupqkflpqT?CVTXUQMKGEHMKGDIKKKKLPWYZ\YUNGID@A@AAAAA@>=A@>EMPMLG?@We_]_^XUUQPH>:=:9=<<>?=<<;;=B@::;<>@?=>>>?ABA?=<;:;>AA?=;;98898888887777787789:<<<<:9::::88788878:86630474/38:;;99:::;<<;;:;<=<<;;;;9878888647:935Kbij\=CCBA@A@???>=>>>=>>>==<=>>>>>>==<<;;?BCBCBA??@@BCCDDCEECBBAABCCCCCBBBCCA=6AVVVWY\^\XVWWWVVWVJ=:<>;<==;<<<<=>=>>>@BB;;>=::<=;<=>?ABABDD@FNJBBA=AECCDED?>===;@IOSR[`SEAINXZI;;=>??A@AB=777:<;::9998:=>=<9997876677678777788789:;==;9::8888777655433443456678888999997666665433333433324445569;;:9899;=64:<98:;87632212344221////033/18:99:83////0/.-,+,-/48:999:50Usd^b]^ZA78/C2#/B;+9OE,%8YD..-($(-.,*,02.04+$(')-0.-/../..//-.1,)4CKIHHFC?:6.*)')20(*132223333-+.0>J3&)*****+++**),,+-01////001341/./037BFGF@39GHCA8125555652274,)*.9??=95//-,1/341./3358767A:+/3/(+0231./-/75-..-,---/..-/275-.:7.13,07.(*(0>=BI8Jovc@126:84234;:.'/7.&)*+,-42&=B)&)+.35YZ\^^_``abba_]]]^^^__aa``_^^]\\]^^_abbdda^ZYZZYZZZ\]^`cehhhhfdb_]]\^_aeghijjga_ceea\[YYZ[[\\]^___`adeeeggb\XUTUUTSSQPPNLLMONOQQQSTSRRSRRRRQRRQQRSTTTTRQQPONOPMKNSY__^^\ZZXWSNOSSTVUTTRPMHGHHHIMPQQPNMNNNNMNOQVXWW\XNWl{v^RXUIHJJIIJJPY^^ktXT^b^\\j~|pqtiWYmr_b|stmhqliwwv~}wpirtqsqqqpquvuzo}}z{xu_URRpeX_]]ltir~rb`aaabbcgkqon}d\`lkmgY[cdgnw}z{{teosUVahqz}v_zětn\`iZe`wh{tkedltsmddjic]cst_TVTTUVTPNMP\fa_k^eeXMPTWYXXUSTTTQONLLMNNNOTXWQNQEZn]ZVOII]sp]S[hZILQRQPPOOOPOOOOMLIFGHJKIKKJX\PLLNMNONLOTWXWSNLLOPOSXPNRPNLKJJT[[YWVUWWWTSPPRRRRSTOHGFDCCEJLQVUROOQSSSOKIHGGGIIKKJKNTUTV\TNORRRRNMLFCEGHHGGGFGHHGGGGARjbWYYK^haYPNKIIJJILUcf_^bfhc[^dda]Z\XOIHMJJVeouyweTLJMNNPNMNNMLMMMMLLKLLKIUjdQJLPZXAB`maSRSRPMKKKMNONNPOQSTTUUXXVSRQQRTTTSSSQPQQOOPRTTX\dli]QPQMKIIHHIIHGIHHIIIHIIHIIJJHEFFGGFHHHHGGGHHJKLJLJIIIIHHGGGGFFFFFFFFEEEEFFFHJJGFEDEFHGHIKMQTTUTSRQRSTRSSRSTTPOXb^ZXPDRrvJGHFEAFVYSUSOIZvrrvssp]D@6ORWYSKHHGLKGHNNKJJKNRUUTVURPPRNE@?AAAAA>=AFC=@FLQUSIL`g``cb_^`a[VQPQRTVZ`\PFACC@?>=;<<:8864;=<:>>>>?ABBA@><;::<=?>=;;9899888887777878999:<<<<<:9::998888887777752395/4:<<<98889;<;:::9:<=;;:::96667778:9;;843=Ufn_7:;<=>@??>>===========<>??>>>>===<<>AABCDA=;=?ABBCDDDFFB@@@@BCCBBABBBAACA=KZWVWY\^]YWWXXXVZ_[L>:;<<==;:<<;<@=>>><>E@;==;9;=;;<>A@@ACEDACKJDB?;?CDCCEC>==??8MTFUWUZVF;=@HTRC=>?>???:>PSB6789;=<::9998:;;:999898655665766666689878;?@<8777666775655434433467877889::99976666665433233233333553579:::9878<;56::::9996310122332231///03425:<<;70,,,,/1000.-,-0579:97;6$:nu^dmfb^PC9=B=>80/287233335.);SRE@=COK?>=82,**-1796222--464347994./@;;4/20.,((/3+)=G5'%.MB//.((*)''(,14332-((,045566542../.*()**=YWIA:7B?:73-('*--/4863210.295-*+.65**,+)*)))**+-,+((),-/101011/////04=GIIHA33DHEA7..245544499-&%*28:====:4,)1;=<6/,14210.-/,''++'(042/./01/++++++-//-.//9A@:/-10.-+,(.<<0++.,0/)HvfM@.'&'&&'-=C4'2<*%*)'))07+18*&('+..XY[\]^_``aaa``___``abbbaa`^^^]]^^_``abccc`\[[[[ZZ\]]^beikjhijhea]]\[\\]abcded`_abca^\ZY[[\]^^`a``abbcb`^__]YVUUVUTUSQQPMLNOOQQQRSSRRSSRRSRQRRQQQRSSSTSSRRSRPOOMKOYabaa_^\\\XNMQRSUUUWWXVQKGGHIMRTTSPNONOONONLPVYYZ][X\eoqf_[QNMJHGHHJQYewzbUZaa^]]amwvsoc`qwk]mzgdieegmoj}knZbhbXOZtxrvtqoooqwzz~yynn|gUU\qeY[[Ygxsiq|wibaaabbdfhcbdzscdkh^`abckv{{}pmmMv}}YVeϼ`]kaPguoegw|icimlfa]g||dUUSTWVSPNLS`caWadcTNOSWYZYXVUWXTQONNOOPPPOQTRNMKHfiLLTOKHEPVQW_XLMPPPPPOPRSTSQQNIHGGGHJKJJKMMKMMLMPPPPOPUYYXTQMMPPNNOJQ]]]]\XTSSSSSSTVVQNPPPRTUW\a_RIGFFFEGKRXYTOLNRSTSMKJGFGIIIIJJKPTTZc^ROQPRSOLKCHRPHHHGFGGHGGFEFCQqoV^pcrpTJGIOOMNOOadYbfimgeed]WWXXQKJJOIKamtzr^NLMKKKMNOMLLLLLLLLKKJLLHUljVKJJOnrW_k`UQPQQOMKLKLMNPOPPPRSTUUWXWSQQQSTTTTSSQQSRQPPQQTXZ]dkeTNQOJHHGGIIIHIIIIIIHIIHIIKQMFFGGGFHHHHGGHJJLLLKLKJJIIHGGGGGFFFFFFFFEEEEEEEEHIGFEEFHIHHKPMMRTTSSRQRRRRTTTVTMIZȺRBDCDBCRYSUSOKPl|qntpiF>FAIOUZWNGEINJGTZPKJJMPRTTRONNPPQND??AABA@>?DGC>>>?DIMPW_babcb^aglf]]\ZXYZZX]^KABCBA?;9;;;97768;<;=@@>=>????>>@@A@==;;:;<;>>=::8798788887788878::9:<<;;;:999998::999777773156208=>=;9898:<=;:989;==;:::::8789:<>@AA=7457DZj]7567789;;<<==<<=<====>==>?>>>>==<<<=>==>?<9:;=ADDCCDDDDB@@AA@BBBABBBAACD?EV]YXY[`cb^YXZZZZ\adXC:=<==<:::;<><<@E?<>=;<=;;;=ACDDCBDDD@=:<<=>@A7G]HDWXZXF8:::AKIC@=;;;<:;>=97CD49;;<<;:9999887547::9986544456676666898779?@;6555655554667654333555766889998887767666654322223323444545767;<967;<737<<;;<;6676897511342////1225;9696/+,--/2200/.,,06788989927@D>54674244566..APE9>72AHCD@5('+-054341**,-/01348=<4-2=B<54449@7,,@`hYH=8878762-+*+-1-,61%&+/7?=;4,QO0:0*'/2.012Nqi\C5:90**-63-,/-)$'9>/&%1@>310+))))++,04872.,*,4::9::985/,.0++$&)MjaRNGB?=94-+**+++/6:<9633100/,-/.-.../.-,*(()*,,-,+.20269863////011/6CJJIC512:B>70-,0332345;5%$),.,)+.27=504:>@>6-164.**)('(&$'-34684225<:.&&)*)*,-.0114=DD@920,+*'$-@MK<344134-6lVARF1'%&+)(.23*17(%,,)*)*1560)('')('XY[]]^``aabbbaa``aabbbcb`__^^]]]^^_``bccca^]]\[[Z[\]^aehihdeiigda^[YYYYYYYZZ[\]]]^_`^\\\\\^`aabbccbbba^[VSTUTTTUVUUUTRPOMNOPQQQQRRRRRSRSTTSRSSSSTTTTSTUUWZ\ZWSQNOY_abba_]\[ZUPMNQRRUXZZ[ZUPKFFJPTVURPOOPPPQPLHLUYX\ba^ZY`geZTVSJFGGGILP[mm]]c`__^^\]grtuu|qWQ\rnZ_ebbffghovqZRTXUL\z{wzummmpsuv}~~yyyvdZjzfUV\lc[\\]anpjmrpgbaaaaaacebbaksty``llgcbcr}{nQeyy~t_cdppVceZYqd}hdszh^lrl`bb^v|gYVRV[UQQONVa`aTv}a^UOQUWXXZXVWWZYTPOPPPQQRROKOQOPKMloQFHKKMNTcbW\\IHMNPQPPPPRUWVUUQHDGGGHJKJKLLLMMMLMQTTSRPRTSRRQPPONLKKGHQVXYZXWNJJONNPRTOMPRQSUWXZ\]ZQJIKHDBDPVSPOMOQRSSPNKHFGHHIIIJJKRTX^^UPQPOPPLKKRWRFDEFFFGHGFEECGOhhOC|o_NO^\NOQQOIKKU_dhijjg^UUVUTOLLGER[gw|v^JGJLKJKMMNNMLLLLLKJJJKMKOkoXJIHJQ]gucNPSQNNNNLLKLMNPQPQQRSTUVXXURQQRSTTTSSSRSSSQPQONRUUWYah\NPOIHGGGHGGHIIIIIIIIIJIIKNMJJIIIHHHHHHHIKLLKJJJJIIIIGGGGGGGGGFFFFFDFEEDDCCCEEEEGHHIJJPRGDPXWUSQQRRRSV[ZSG8SǦPBBCDBAPXUWUPJIWromwlHCGHHFMSUYSC>IOHGZ[LIILORUUTQHHCOVPJ><=?ABAA@@CD@>=<:;8;M_b`aacdadmxn[[]\ZZ\ZVXf_FACEE@89<:;98889;<;=??=<>?????==<>=;;<;:=<<><;::899977888897899:;:;;;;;;;9899;;:;;;;:99886434336;>>=<::99:==;:98:=>=;99:::8:<>ADDDC@;6477;Nf^7666655568;<;<<;<<<<==<==>>>>>=<<;;<;78:;9899<;;AD=>======<;=?@@AACCA@BA:97;?@E@87;=>>?99US?MW[YF99978?CB@=:89::;::84;@<>@@<99988789874/6;;::98653333345668987768::75554555444468875324445555787779877667666664332235312445545636<=;;::;:66:<;<<;:7=JJA=6013320.///11362-0320/////0010-**067998864@RaokU]tskgfeWLC<96666445677502<:16=7377=F>.$).05:9;;82/-+(')*-17966;A@920./;@3,*.QiS:7<:9<;5.+)&%'++(291()+3>985/Ft>#)-.*3821/2KfL,)*..,/24775321.*).1-&'0;81///-,.26820772.-,+-7?=;;;;9.*+/10/($(Qod`d[I>75.%&./++,/5-;O?660'&)().32/.01221-)(*)()*+,3::;>><83111110.2@KMJD7--//3420/*,34344495'&.1.,++,--.04:6595/2992-(')*+*'%'3?EE=777;C=1*((('&''*-./06??<:83-*287=HKJC::>:7<9.Be?&MaN6,-)''&',,-,'*.1.)0627:1)('&&')XY[]^__aaacdcbbaaaccbcdb__`__^]^_^^_aabcb`^]][[ZZ[[\]`bba_]aebdfc^[ZXYYXXWVWYZ\[[[]___^]\]^`bccdddcbba`^ZTPPRSSTTTUUUSRQOOOOOOOOQRRRSTSSUTSSSSTTUUUTTUVXY[^bcZQOPPU^cca`_][Z\XQNONORUUVX[\ZUNIHINTUVURQRQQRRPKFKSUUZ_``]UU[\[]XLGGGHKMKN^h`^aacdededadkpto]QWcjeadegfhgilg{{~ynYNRTRd~{uwwyuw~}aZ\agnZTUZga]ZYcnpmjigfca```aacffffghfeqxiYanjfcdw|pZIq}~~{zvnd]cx~}qdqm\[\[V^y~qdkoszxriipn^mmQhzi]UQW]VQSQOVb`bYt|bRPXXXYWWYVUTUVTRQPQQRSSQMMORRPQHJfxjRGIJJKPS|u_eSFLLLMRSRQQSWWVVWWTKFGGIIIIKMNMLONLMU]]XTSSRRSRRQPMKKJIKJGHKKLIMPNFKONNNNNNRUSSTUTSRTTOJLMID@BKOIEHKNOOPQPNKJHHHHIIIJILRTSUWUNNNLLLKJLNMJFACDEEFHGGFFDKS``I6jHKjmPMMLMIkjYbcgd`]WZYSPLMJFYlut}vaPIIKJIJLLMNNMMLLLLJKKKNKKgxaKGHIJPXt}TOTSQNNMMLKKKMNOPQQQRRTVVXXVRPPRRSTVUUURQRRPOONMPSRST[gbRMNLJJIIGFGHHIIIIIIIIJIIHIJJJJJJIHHIKKKKLMKJJIIIIIIIGGGGGGGGGGFFFFFFEFFDCABCDDEGHHILNQMEES\[UQORRRSRTYSD9Ap̲KDECCBAMUVWWRLNLQes]LNcVJIMLPSXQA?IKDHSSKJKLPUYURNFKHWYJK@;;=?BCBBAAA>>=>=;6;Uffaaaaddeoq^\^^\[\[YXanO>FFEA<>;999::999::>=<>????>><<<<=><<==<<;:99899977889:9779::;;;;;;;;;9889;;;;;;;::988753337=?>>>=;::99=<9888;=><::8899:@FHJKIEB?:65897?X\77677654469;::;;;:99999:;;=>==<<<;;;:99:::9::==>=<<==;===<<=;;<>B@>?==>>=;:;@B@?@ABAB@8489=7NWEGQYYK<;;:898;=<87768999:?@>?AA@=87766799:;848;;::98755422004887665556655543443344224666433556557777669:987667766654443245332345546538=?AA=;=<:88:;;;<=3;XXD?7111100//0/0220.-,/2100/-+-131.*)/58:9750)2@JdtcShynjmifeZF52344225555448:/-:=882.9C5()22025;A><<93/+*+-0///18AFD:1/-/58+)'$DbH29@=<=7,%(()))*+()094-+/3..02?H-)..006<30-0562,*)+//598689535540*))')451+*+-344:AC6.65+)12+4@CA?===:-*01//.'$-Tf_\SF>:4+&(394-,-04*?L1-384.)++,1444212220+)*+*)((*-48:::96788653/+5JQNH;-*-//01341-2853147991*-.-..-,,,-276.-0-08:50,))+,-+('-8=CF<4457872-,,---.0210/0488301,).8@CDFHIFC><=98;5,60";^bN>=/+=?)%+,++.03/)4CB:5-'&(,((.XY\]___`aaceddddededddcba`a`_^^____``a`aa`^]]\[[[[\\\^_^[YY]^\^`_\ZYYYYZZYXXYZ[[[[]^__^]]^_`bdeeeeeccca`_]WRRSSTTTUUUUVTQOKJKLMNPRSSTTSSUUSSSSTUUUVVVXYZ[[\`d^XUTRRZcda`_^\\][WSNLLNOORTWZ\][VQKJJLQXWTSRRSTTUNHJPPNQSX^`XR[cb\SONNMMMKHTgg^_fjijjhgb_bfhkcW\fdaccbgllotxvps}pcWPLa{u|tpq{bW[YXXXUScha^Zaknidcccca`aaabccegfgmlbmvjd`Z]decf|}xxZQji~hougf^V^`_j{qtreZZ]XUYrt`el^buvsrlqpewNbwj^TT]bYQRRSZ``aYh}\MSXUVWWWY[WLJKLNOPPPQSSQKMRPMLIEEOYLDFGEFHJSuwu`FLNOONQSRRSTUUUVWXZVMIIIIJJKMMMMNNMNXaa[WVTRSTRQQMJHHJKJIFFIJFFK\]FKMQOJJLQX[VRPNMMLMNLJLOOJECEFDDDGKKLLLMLKJIIIIIIKKJMNPTQINLKKKIHGFEFGIIGEBEEFGFHILQUX`f>_mVA_oKDLJP¥fXdih^ZW[YPMLGJ`y{||`NLJJLLIKMLMNMMMLKLKLLMNOGQ{mTMLMPNTrdNORQQONNLKKKJLMNNPQQSRTWXWWUSRRSSSUVVUUUQPQQQPONNRSQQV`gYKMNNKJIGFGGIIHHIHIJIJIIGHHJJKKJJHHLPOMKNMJIIIHHIIHHHGGGGGGFFFFFFEFEDFFEECCDDDEFGFINOKEFOX][UQQRRRSPSQE@??>BZgdaaa_`cekum]\___^][\Z^iX=CD@::>;=<;<<;999;=>?>=<?>>>?@?>>==<:988889999778::97579:<;;:;;;;<:899:::::::::98875346:?@??=<;::::;98888;<<;9::98=FOQPLHECB?;758;97BF976776655679::::9876666799;===<<;;;;<<;:::9:<=?@?ADCBBBAAABBBBCDCCCCBCCCAAN`a\[^adc`^^_]^_]_fcL;<<=>=<===;;;;:;;<==<=B>?==>>><<9?CCAA?@CC;338;=@@><::::99?>;:8888776479<=?CCA@A@?=:8755568=>>>?=<::88669878988985553445776543322332122222333466555576689:;98777777766653234630155556548=BB>78>>;988:;;<<3:TTC@;3210/0000//22/-/..0/...-,-03320-/58:962..105Gf|dZsummlhgicI4353/.011235;<527<:82.9;++7:1,*,3;<::644311593-(*6CGE9111/..*)'#:O:/:GFC?6/,-,/40+,+&'03/../46204.'.57549<4,,+)(*+*)-25=HDA@=754443/+)'*/*)*+(*485=HD4*36,*14/:GGC@=>@:/.23.+)&);ZeYD30460&"3LJ7--/0/6G;')*/5642/-/13541.---..--..,*+,-033469<=<9740-3EPMA2+-0024444219<520589:4*)*---.---1671,*+0:<620,))*--+((2=>>>92/10--,)+379=?BEHH@9039=<5,.2547@HIIIH@7<@:;8,)+&-Ka^RL;8OP1#)1763..018DD<3*(,076./Z[[]__`aabeghiiklkhgfdccdcbb`___`_`aaa``a__^^]\\\[\\\]]]\[[[[ZYYZZYYYYYZZYYYYYZ[\\]^__^^^^`acdefgggfedc`_`_YVTTUTUUUUVVUTQLIIKLNPRSSSTTSTUTSSSSVVVXWWY\^```bcddba`]]`aaba`_^[YZYRLLLLLMOQSUZ\[YVPJFGPYWRRRSTUVWRJJMLKIINTRLQX\\VTSRQNKLIJ]kgcfgge^[\^^]^fkha^c`]_`behkqux|~hSctzyx{n_KPmkd|h]Y\[`[Qjqa^`hjfbaccddbdgfeddcdeebgndbpg]bbabbae}|u{wMrtxmX_d_^\Z]^[Z`hfeniU[][fǷmpva]`[isqvympPRro\WXhvbNSY^`_a_S`tOPVVTUVWWWWQLKKPQPPOOOPQQPNMKIKOPRQMLLMLLMLINZkuTNQQQRQOPRSSRQQRTUWXZWQNLLLKKKKMNNOOPUWYZYYVSPNNMKHFFIKKJIIJIIQVO\bKMKMRLHLU[WXXQMKKKJLNPTYYQJECDDDDEFHHIJKKKLKJIIHHILONLKPQLLNMKJKJIHGGIIKONJGEEFFGJHX[T`jEuUHeɸ`EJQRZk^hokaYW[XQNGHfrn|eMIJIKLJHJMLJNMMMNLLLOPKHMJp`RSONPNa}[MLLLNMMMLKKKKLMMNPRRSRSVXVUTRRSSSSTVVUUTQPPQQQPONSSRORZicOMOOKJIIHGHKKIIIIJJKKKKKLKJKMOMJJKNRPNJLLJIIHHHHHGGGGGFFFFFFFFFFFFFEEFFFEEEFFGHHHHMKGEHS[]XSQQQRSTSNGAHtʕd=HCBBBGQVWYTNJIE:Lv}hNKJIKLISSGEIEDGKLLKLQ[^VMIIB?TZKNSC;9==AEBBA@@@?@AACCEVeb`abc^`gnro]]bbbba^][]]aN9?;68>ABA?>>=;:9;=<;=?@?>@A@??@??>?<;:888899999:99998548:<=;:;::<<<::;;:9:;<<;;:9898547<<=>??==<:9::::;;::;==;9967=EKMLJFB@A@>:645987899766666566679:999987767899:;;;;;;;;===;<;:9:<=?>=?CCCCCCCCDDDDDDDCCBCCCCC@I^b]ZZ`b_^^______^aeX<8===<====<===<======>?@@?>=>@?=;<@DCB?@A?8238<>@@?=;999879<9BVJ24CWXG?@?@A?<?==;8348>ABBA@>>=;768:;=?AA=:7555335577644322112211110/123458;9667889:;;8777778999764322694.04454234588731:C@:889:;9::5>LJC>953211110110/21.,--.-,-----/2676215::950/23110>m~]`|znmkffne@284/*),-06;CF=95362.296,++)+373+*37322373-((7FIA4-0330/010*/<30;NND;877644650./20-/4525BD6..+(++/1156/+*)(**)(),.5GVRFA=730-+,,++++*'%+0016;;=JB/+/410024=GFB@>>@<30232/()0?[jH-0110,%#:WK2-/0//6;830+()075222000.-,*))-131242020/25358::986433108FI@:73-)'-20*(.9BD>840/0.*()),59<<:;COVL6,-3@ID<;@>619DJKJHD;=B=55-&+($3MSH<4232/+)4;=>8237:;;94/16:@@6/[[\]^_`abcdgknoopnkigcbdedcba`_```aaaaa`____^^]\\\\\\\\\\\[[ZYYYXXYYYZZZZZYYYZ[\\]^^^^_^^_`bdefhihhhgfea`^]_`ZUUUUUUUUUTUTQMLMMORSTUUUUTSSSRSSSUVVWWWY[^`_```aa`__^]ZZbgdbb_[ZZZWPKIJKJJKLMNNMPTWVRKGNSQRRSUTRUXRMLNNLJHGHJKJLQQPOOOMJNNHQdkiecdYMQX[ZWW_a`bbffefdeheflpsst[IMVrwp{lPXqmvg_bb_Uts]`hlmnnnjfeeeggcbcdcbagc_nq`]db`cccbbdkxrۗRovoxuw~j_ejic]_\XZVT]nmlpdWU]Y^zǸqhxzfd^M^sv}~n|^Mps`[\qiN[hd^^^[PbfKTWUUUXYWUSQQSVXWSQOPRSQOONLMRTWX[\XXZZ\\YSLLN]s_LRQQOONNRTTSPOOPRTTUWVURPOMKIJKLNQSTSRRSUWWSOJHFFFDFILLJJIIKHJksPWfQSNIPOKJPRKORQPOPPNPSWZ^]ULGFECCCCDFEFIJKLMMKIIIIINSPMKJORPONLKLLLLKJIGJNPPMHGFFDISh\IWd||qCQsWtdObcPPopflqkbWZZRMHNfmbyiMHJIJLKGGLONILNOOQPNNRQPNG[bYZWPNMJenXSPNKJKLLKKKKKLMMNPQTTSSTUURRRQRRRRTVVVUTQPPQQQRPNSSMLMSchUKNOLIIIGGJKKIIJJJJKLLMMPUSNLMLJJJMMLKKMKJIIIJIGGGFFFFFFGGFFFFFFFFFFEFFFFGGGHHHHHHJIGELW[ZTQQQRTUVSJDFkܸZ?GBBACELVWYTNKKD?]yYDJIJHLCCYGDGHHGLMMKNYcZMJMKD?A>>IQEC??>=@@@@?@AAAAACBAOccbcfhc^gw{b]]^[\\\\[\]`mK:866=BCB@@?><:9;>@AA???>>>=<:988989:;:9:::99::<;;=<;;;;;<;99<==<;<===;;::89857===<;:9:::;<;;;=><9876;EKIFDCA???=;:62137999887776566665688999987689:99:879;<<<===<<;:9;<=>=<>BEEDCCDDDDDDDDDDCCCBBDC?EZd_YZ`a__^^```aa__f]<7=;<;=>>>>=========>=>@A@><>AA=;;=ADC@@@=6139=@@@?=:88888888?SK527KXL=9<@CCADILMONKJGEA????>::>CCCC=546;;::;=>>><8656655656664433211221111/.011248<=@BA@?>?>;877567899865433258741255202432247;FJ?789::99;:7=GJC725532221111..242/---,,,---..3886448;;84//110./-CDA?>=??70,-1.&+19Yc2$.000-%%CS;/11////1631.05887<=511+')))()*.1137765349<9<;854321242/07=844555543122,,22223575323/-./01357;<:60$&=G?82,((3:4*/?HF@;2-5;<71,)/34;9315=IK>16819MUQOROG=;CHHGFDHKD7.//)).*'13.*)((*276769HMB:8755669<<==<95[[\]^^_`abcfjlmnnmjhfcbcccba`___``aaaa``_____^^^]\\\\\\\\]\[ZZZYYYYZZZZ[[Z[[ZZZ[]]]^^___^`aceehjkjihhffd^_c`_a^YXXWWVUUTTTRPQRSSTTUVVWVUTTSQRSSSSSTVWYXWWVVVVUSSRSSUUU^ihdd`\[[YYVPKJKKKKJLMKMUZ\`_XLDHNSTUWXXXZ[XTQNNPONMLLHEIPSPLMNIQSHJVdkidaVPV[[YWZ\^]^aktrqommkikovzxeZTRjvuzyu}tf{l[b`_}s^cmstsqoidcccc`]^addbbgfclrg`cc`aabbbb_hoZ_yjgdgjf[cnpmcY[\YWXdtqkhjcevV\YWlʹ{zug[gqm`W_lv~wpQnxe`aqwi^jng_[WXO[hWTXY[XWXYVRRSUWXVSQPPRTRQQTTSUZYWXXZ\]^^`]UNKKJLNLOPNOQQNPTUVSPQRQQRRSSTUUTPOLJJJLNRUSRSTRRSPLIGFFEEFIMMKJJGFIHK]k]W`UQRRWUOIJNGGIKMOTWVUUVWXWSOKGDDCCDDEEFGJLMMMLLLMNNOPPNNLOQPNOONMMLLLLKJJLLLMIGGEDI`aL>LwPINvۗxb@Uo`UT\gprl`XZTIBKglUgtRIKHIKKIFGMNNJNPPPSRMNQTVJP~[[^]ZSONNqbV^ZSPNMMMLLKKKKLLLOQTTUVWWUSSTRQRRSUVVVVUQPPPPPRPNMOKLJJVd\MLPNIGGFHJKJIIJJKKKLLMLNVjmf]TNMQSQNGFJIGGHJMKGFGFFFGGGGGGFFFFFFEFFFFFFFGGGHHJJHHHHFELXZVTSSRSPPQMHAUա|RAGFDBCBHSVWTMKKFE^eOIJKKNK4DQWJKIIILMNKR`bPFILMF?@>?D@CHIHGCA@@A@ABCBABB@@Odfcchfcbixa\\^[[[[[\]]`ko@466;=>?@A?><:;;<>>==<<==@??@AAA?>??=::;:8898:<=<;<<;;;>@====<<;;;;;;;;<==>==>>;;;<:8777:@AAA><<;9:;;::::;;;;>>;869BLOKFDBAA@?<;=;743578998877765665554568899876;;9998647:<;<===<<:99;=??<<>@????===<==AA?=;;>CCB?=95138<>?>=;988888998@HC:79>MN?:@BC@?@CCDJKJGC@@AB===<;?DDEEA;648>BAA@@AA??><=>=<<<:6568877644545555323422221/01122348=FKIHHGDA=:876668888555333369:7452376569:pp]o~xxumdbQ82/-/...+(&&),085*()))**)'')**,.+-6;6/-,.0/075-6FG:+()*+.126=;47949JA-*-0-,/0,,/1//11,/2844<;1//+(-1540/,++++---+*,*$'6;2)(((%$&'*+.<<:5-)()($+32QO)+--.4/$+MJ01530,,-01-)'*7A819:/-/+++*+*+--,-07=:545?8,"*@C82/,(*6<3*9QVJ90+/;GHB6-18748<:99:>KTSI<22559AA<;9689[\]^^^^__`cdeefgghgeecbaaa`a`__````abaa```___`_^^^]\\\\]^^]]\\[[[[[ZZZ[\\[\\[Z[\\]^^____``cegijmonkjhgecca_a]]c_Z\ZYYYYXVTQRUWWWVUVVWWWVUUTRQSSRRQRTWYVRPOOPQPPOOPQRSRVcedhb\\[ZZZYTOLLLMMMR]eggcbed^QIIMSTTXZ[[\]\XRLILNMLOPJGN\[PTTLSUKIKUdkgb^]^^\Z\_```bdgpvwvrorstx|zmmvleox~wkei{rh\^cq^gqrpokfa``^^^^`aceddcgiffhfdcc`bbbba`d_a|[ogldfijdaikjkd[\]XVduuoifjmcufXYUkvq[Xau|h^^bmz{X{kddgfguvigg[UTORWZ^]^b`]ZVSQRTWVTQQQQPNJINUZ[ZYWUTVUX\[YYWSMKLLJHFIMNNQTVUSUWWVVXYTPQQSUWWYZXWVQOMLNUXTRSSROLJIEEGIGFHKMLHGFCGJJGFJMU\PMU[]ZRHEKIIJJKKNRWWURQQPNNLGDEEEFEDEFHJLNMLLNOQRSRPNNMMNQPQQNNNMLLLLMMLLKHHJIHHJLQD=@XˬLBQR˨˜RA?]vgX]huul_WPHFQbhQUnLEMLHIHIECGKLLQXUQQQQLLOUQWyeKR]\URNLOzZW_[WVUSPONLMLJJJKKPTUVVXZYWVUTSQQRSUVUVVUSPPPPPOONMPULHFJZaTKONIGFGHIKHIIJJKMLLLLJHGWamvsgaccee`XXVSTRRRLGEDDDEGGFGGFFFFFFFFGGHGFGHGGGGIJKIHGGFFMVWTTSSTRJFGIC=oŕMCEEDCCBFMSWRKJKHAU{lU]RILLPF@?B@CGJKKMHFGFBA@ABABBA@Pddccca_hqz~d^\^][]_^^__`]sX35699;;=??>=<<==>>===;<=@??@AAA@??=<:9;:989:<====>>==<=>===<<<;;<<<<<;<>=>????=;==9678;?AAAA<::99;;;:::9;<<<>>;87DOTPIECBA@?>:9@<8<9658:9888876666655346789:88:?<588643379:;;<=<;;:9=>@ACA?>><;=???????>==@AA@<:;?BB<886458;<<::999889::;:>@BBDEDA>76;???@AA@??>>?@?>><9768:;:865555677765664444433444679;;;?A?:9999878999989:748?>75664332/,.7==:400/.--,-../0/486456:<96/,,0221141(BibZwvvztkjiQ2-20.,+*()+--.463.+--++)('&')*'*5-3::5-('*..,++*+)'(0877;60110145200.,,++153/-..,+..02)'),274.+,01/./5;:668>EFB;8<>:43322131-.0001353./10/12330..022340,))+2:=;:;8/(.:>710.,(->=-+DYXQA./9?HJD8.GO@<358:9:<8/5IX`P8BTZZWOJG>/$/AC<<5.,**,-28:656:==2*,198788\\]^^^^^^_aa```aabdccca`````____``abbcb``````a``__^]\\\^_^___^^]\[[ZZZ[\\\\\\\\\]]]^^____`cehkmprrqmkhechdZ_`ZY^]ZZZZ\[Z[ZVUVXWWWVWWWWVUUUTRRRSRQQRTWYYUQONPQQQQQRSSTVY[Y]c^XZ\[ZZ\\XSNKLOMPel]Z`dfhfb\PHIJKNPPRSUY^^TGDGKNQSOFGQ\_bZLVXMLIJYgkhdcb_\\_abdeggefpxwrpuzwrynas}tosv}}iXXdfbvdV^k_swolnkf`___^]aeddeecdggeddccedbbbccba_\ݫ]wm^lmphffcjkjnf]^[T_tvromkjkkb|[SYo~vsz}^Xabkviaa[b{ksgfkqs|yqtm[RQW^bca^_`_]YURSTUWVSPOOPNGDLRUWYZXUSQOOTXSPNLKLLLKJJIJMPRTUWXWY\]`cfdZOPPSVWVY\]XVSRQMMTYVRQQPMJIGFFHKIHIKLJGDHUZSLHGD@MWOHVW[[TIFHGGGIKKIGLRRQQPNLLJFEFFFFEDEFFJOPLKMOQTTUUSQOONNOOPPLLLLLLLLMMLJIIIIJJKNOJHEYxŠdžJH]ټÅKE>@itg]e{xg]VJCUhcSHqnMDKKLKIGGGFGIIKNbZRQOLJJJINnnXTYY[QHMJL}xSTYYYYZZYWTQMMLLKJJOSUUVY[ZXXWUTSRSTUUUVVVTRQQQQNLMUYUKHFFQ`ZLLLIGFGHIIGHIIIJLLJJIHGFFDFQ_jkgdaeiouqkmg_WMJECEGGHGEFGGFFFGFGFGHHGGIHIJIGIJKKHHGGFMUUTSRTRRWXNKDIyҵ]IFDCCCCCDIQUOKJKICLljmpPHLKIHXJPNQKIGGLKJP_UCADFECA?>?>@BCDGIILLKKKGC@@AABBC@Kcbba_^]hpz{h`\^^[_eb_``a^aj7577999;=>>==<==>>===<<=>>>>???@A>;:99:99:9:<====>>==<<<<<<<;;;<>><<<;<>>?@@?=====879<@AAAA><9889;;;;:99<====<99@LMLJGECBA?<;89B=6::538;:778886666655446799;:;==957875434689:<><;<:;>@@@AAA?CTc_bceffdccccdddh^A5359>@>=>@BEE?>><<=>??>>?>>==?BBB?;9=@=64699689546788889:::;::;:89:;@GIHKHA;99;:=@@@DKNPVTA7:<;<=?ACCED?:;=>@ABA@@@@?>???=:9:::>?<9778878999889778788776679GIHHC<777668877766313469;;::<=<>?A@:5344256778988898777;==:8764435AOQME8/-......./0/./67446:;74/,+.212202+'HdW[rtpttpmoiD170.--./20.,+272.01011-)'''((&.@<*'()+,.-,-/2457763,**,...-,,+-01757;?=80'#(00+*,++*)))2<;8622331-++..,-.+-7<60-.0//1=QZL9)8F>0=;>=6003433345641011232//2101234431/--/0-*+/6:>=:74-).688661,*&1LI0.HUMLI=DHA?7*)A;GfmRWytb\UPV^[SIkjLIKOLJJHHIKMKIIIIfZQQNKIIFCasPVTUYa`SRJEeIKNQTUX]a`][TQQOKJJLQSTVY[[YXXWUSRSTUUVVVVUTRRQPMIIOSNKJIIMZ^NHJIGHIHHIGGHHHIJKIJIJJKMNMJJMS]jmd]^b`][[YSNLHBBFIHFFFGGGGGGGGHHHGGHKJJPPNLLKKHHGGFLTVSTTTLHT`ZPHX|ŦФQPGDDDDDCDGNTPKKIIGEZwoKIMLNOWHLNMHHHMJIM\W?=@?BFB@@>>?@ABBEHGFHJJLLJIHECCDE@Jfdca^]]biu|rgb]_^]]a`__`abZi:798989:;<<==<=====<<<;;<;<=>>@@A=;988899:;;====>>>>=<=<<<;;;;<>>>=;<=<=@A@@?>=;;;:9:=?A@=>;;989;;;;:::9;<<=>;9=GJHEDEDBA?=:968B=7:961489888886666665445779;:;:76677765444457;>=<<<<;=BDA>:=@@?>>>>>>>>=>>==>>>>>>>?=@Ze`a`afddcbbddegV92013:B><=>@CDA??=<<>>>>>>==>=ABBEB><=;63369::9522467888::99:9789:;=ACDEFA=:<=@@?ADA@ELNNNI;67756:?AAB@?>????==;:<>=:;?=::9899:;;;;:889:8788887667:BGC=899=CING?:756567777764322578899<=<=>>;7467534666789:99989:=>?<:::988?KPRWVJ7,/1231/.///.+0522697520/,+045301/'.H^Y]stqqpnmlY?9777753351+*173474444/)('''))-50*)('''()+,+-02431.-+,3874.***-104:@;542.++,.0/0/.-,,+**3<;86300/+),,----.:>3*./1434;@J\J,*HJ3+7:?=0,++*+-0/,1494.3::0/331/-,+)%',-*(*+.0/,0BF.&***-110250/1/.--,--1N`J.5F?/,1.),485876543333.+-137??3*.55/)),.1455676443223321330012356644563./6;=??=851.15416=:.))$2SR76NP<;AA?????AABDEFFEGIKNNNJGFFD?Jhihd_^__epqfdbdc_][\\___``_j<8989899:;<=>=>>>=<===;;;9:=>>@??=;98768::;;====>>>>=====::;;;<====<==>?BCB@@>;:9::9;;=A@:;;9989;;;;:::::;;<=<=;997:C<8;961479888987666666555788:996676656765433359==<;<<;=@DA?;;>>=<====>>=<===========><6MibbadhedcccddegY;02346<=<<<>ACBBDA=<<>>>====>?ABCDDA?=9755679=72345788899:;;:8557<>@BBA@<899<@CA@AB@??ADFFC=<<857:;<=>@ABBA??@@=:977:@A=988<:878977888876668@EB=9877;DMLLG955678987765420246768979=<8458766655666889:::98=>>==:67::ALWWF4/13321/.//-+-0135765323347:8530.,.*Jlenzytqpnk]D8::;94/3=8,(-49<72210-*('())(-2110,*((')**++-153///./26640,,/1105=@7,)**,11,+03132/-,*(*2:<:95/--01,*0.(+45*'+16J?),>7()4./2,+++*),/0(&4?>65=<3=G<1+*))'##&(&$!").+3RV?,').0///137751---++,0ESC.*)+(&*.401=A0365420/-,,,.--2?B2((**+*((*-157302211158887640./2579;=@B@838?@??@=979;=:3/6>6()*"/VYCGRE23975:9<@42=A<1Jf\WVE3./342/+/?D32IVUQJB:63,*///69?>?CD@??>>==>=>@CHEBDGHIIHJJHDCALajiea`aahlg```dc_]]_^^_aa^ij5989899999;=>=>>><====<;;:;==<<=>><8678:<;;;;=====>======;;;<;;;<<<<<<>@ACB@>:88::9:::<>=:;:999:;:::::::::;<>@CEGEAABBA>=<;9:7=D=9;96246988898756666655578898855766467654432379::;;<=@BCB?==>>==>>>>>>>=<====<<<<<<<=9Badafkkgdbcccccg\;/44557;<<=>?ABEHB<;<<<===<=>?ABCCDC@99;868889843457888999::86215=@?@@@=66<>?@@@@@?@@<?@>:;>??:65447=@<9769:79::;:98999:<=<;:88887888887778:?@>:87679;AJOLB5365787766643123455683/5941477666655667889::988;@@=?@>=;50//148631//:/,_xhq|usrjU=35651..4B<-'+27:511/-,*(())++.352/./0/..-++,-28:863/-01//--0471.2;:4+('(*-.,)+-3894/-*)*)-6:940/000-*,4.(())().5??=4/7=5)*+"/[^LRH:37921757;79CEEIYdZQXS?0,*+07=@ELF>EQSJ@;86540'%1:<73.-0]^__`achjhfddba````aabbbbbbbbccdefhihihgfedcdcccca_]]^_cfffeedcba`\[YXXYZZZZ[\\]^__````````aa`_`adhlorqmgdc^]][[Z[^_abbdeghkmnlf_YXXWVVUUUTTTTUWVXXWYXXWWSPOPONPQSTUWWVUUVVSQVZ[`ionkfacfe_YRKIJMRRORYaehhggc\X\``cefcacfe_RMT|liiSZfj`QNPNMKP[]\cigccfmqrlcclnpy|ytxxrv{~}{{qZKPPNUae_dprrehbhgg`ahhfeffeeeeffbbfgeiqvuv{yw~{~xxy|uzz{xirnq{}xtnkkkmovvmlhda^m`Y\TQYcfbajkҳwqfnwpd]hlg`XQX[]_aed\UVXUVVSOMR\_\[TOSTOIKUXMGHNVSMMOSXVNHGHHKNRUVYdr{~tj^SOORSVZ^dei]NNTQJOVVRKGIKLKJIIJJLKEMWR_mg[XXXWQNOPONNNNNIKRQMQRPQORUTNDADBEIKLLLLJECCCEECCCCGPQPQSPNLJKMLJIHHIKJHHJKLLLLKIHHGHHHHGGGGFEELRs֒MOSJCPXheJACCBBEEEPkoc^[TQJT}rIHKBAEDEIHJJKPQQOJHHTQMOONKKKJKLLJUSQGFPMRiPQOMKLLMMMOPPVVSSOQVWXVUVUUUVVVUTSSTUUVXXWUQRQPPQQNKKLLLMMNLKRa[JHIIIHFEEIIJJJKKKKKNOOOOKJKJLNMJFJfqOHLLKLXgidWHCDGHHGFGIKLMMPLKUUOLJKMQSSPJIEEMURONGA>;=CDE?U¹ fbZNDDDDDEDELSQJJIFFIBOcULNNJMWMA;31I`VE?GL?A@@??@@A@?>=<:989;=>ABAAEDDEFFHGGFHP`ghedbcdkke`\]_a_\_b``_bc`mi2;:9:9;:99:;<;<<====>>=;:::;;:9;<><8779;<===>=<====<<<=<<;;;<=<;;;;;<>@BDB><:99::;;<<<<=<;;::::;;:99;:::::;<>EMKGECCB@=<<;;:;8=F?:<:52469999997566666666777876546665776555445579::=>?ACDDA???>??@@?>>>>=====<<<======:AZedgooidccbcbahZ4/544469:<>??@BEH=779<=<<=<=>?ABEFEC<36<;877679865567888998885017>A?>>>;89=??><@B?>@A=>IPMKIILMIHEC@>==>?:479:<9757889;;9768989:;;998998:<=<<:88887888887779;?@;89668987=FKG<43566666665521233455@I@847965556655556788999977=?=>@>=;:731.*'-7720-.0//./...-.0124467433;;300-0@<,'*068200-,+*((*+-./484.-6;7662+*+/28<<:4-,.0-)).49:1-/552-+)))(+-*(+6?@;2-*))((,111343001+(7A6)&)*(+/7=@GD66;3**%"0@;.,**,,-.-+,.'&*1896798:<3*('),'''/;?B9532BP6,4000,271/01430,,,,,,33//1///2HTF?504;2--.//.-,+**+-/05;72/-+*+*++,.0/,-+(-477;>>;84/.0589740.,.49:;=BE;3/4978?;36=92..$-\YEI@63:9545329?EQJJhyo_QVW@1.+)+-5?BDJD;DME:876686*+:A>9CJ1)04DH6**(+6@JI4(+*+.,,.,/7<=?>;9422^___bdfjmlhedcaaaa``abcccbbbcddeghjjijihggfeeedddb_]^_`dgggfeedcb`\[YWXXXYZ[\\]^_`````````aaabcccdfhihgffd`]\[ZYYYXZ\[]adgilnostnd]YVVWUUUTTTSRRSRTXZYXYYVPOONNOQSTUWVTTSRSSRRRSTZfnpmigfghhg_QHIORPNP[hnolkkhd^TT]dc^`cdccaXLLcbswDG]h_YRLKKNMOPZfjigjkillfeilpxzxwrppmjpxwsw|}zwmVOPQOTae]W`]fyy~z}gdedd`fjhgeeebbdcefedfgdhrsttxyvyjxxurmighlosvupmhfidnܕWOY^WNaidaiTuԲwoj{wyh`qsj_UY_]eh`age\YXUVVRNQX]_^^VQWTLIMVUHCKY[OIMRTUTOHFEFIMRVWWfow|j\WSQQSZenldehcOMWNHPVSLGEILMKIHIJIIICQYPOQRQPPPPPQPOONMMMMHMWTMNQQPPRUUQJECEFKMKKLNLFAABDDCCCCEIRXWSOMLLLMKIGHHIIIHHJKLLLKJHGGFFGFHGGHGGFGHJPoHSQFD<78=CCBAADELKYpj[YTQPNiqMJKDABHFIIIJJKNPPOIHGHIJMQQNMLJIIJIKQPNFNNOPQUPOMMMLKJKKKSUTWMQWZZXVTSTUUUUVVUSTUUVXXUQPPQPPPOOKGGKNPPNMMN^_LGIIIIHFDGIJJJJKKKJMNOQPNJJIHGHILLPcqraMJMLMYdfc_VICFGHHGGLQSSTQLLV`aXOKIJMSVTNEEOXTONJACCDDDE=Oö~ha[KDEFFFGGGLRQMKKJGGDLWSNNMHMWE?7,4R\D@><???@A?>=>?>:99;;;;<>>=??AAABDEFHIP_dfeefghqsja\]`a_^_`a`abdahjA<::::;:99::;;;<===>@@><;:;;::::<=97799;=????=;<==<;;<=<<<<;<=<:::::;;;;;:;8=F?;<96336988889755775666667666554666678876555545;??=>?AABEB?@@@@@@@?>>>>=====<<<<==>==:=VhedorkedbbcbcjP,15323216=>?>@BE@5148<=<<===>?ACFHF>614:<867648:7666788799899757<@@><<<;:;<==;>CC?@AC?=FNLIEDHHEFGGEDCBAA?:77898778987997768888888888888:=?><:888878999988778?A:896679966:AIF71465666665421133342?alU;68764565555566789999768;====>>=8201.)',/00//////....,-0123354008?934423037/,'Kl_fszwusq`C@?303/0<9,'+.47210--,+))*+-00363-+4;9763,+,03568:5-+-.+((.5;80-.2230.,+)(+/-)/?EB;2-+*+***-/3773//0+&8C4(%))((+3;BKI54;613-*=>4010(4B:99/+672+*048:5-/5520.-4-*'%'*/38::?@302120*0?>60/10.-,,,,,11121157>RaTG;.,8;4/,++,,*))*+,.024620/.-+++,+-.+)(&&,2249==952//14420.-,,18;;9:@?5--/12:CB9699873#*NU?EE8486343008BJSKKiqlro]I9482<@8:?;8:977997*/1(-<@4*+.-,++0//49<>>=<843^_``cffhjjhfecbaaaa`accccccbdefhhikkjkjiihgffffgfeb```befgggfeedd`][YXXYXYZ[]]]_``aabbbb``aaaaaaa`^]]\[Z[Z[][[[ZYYZ\`bdghikmmoqsrpj_UUXWUUTTSRQQRQSYYZ\]_\SOONNPPRSTVWVVVVTTUTTTST[fnpokgehopnfYOJMPOQV_gmpnjjkfZU[a``abdbafeYKKP^TBO^efURSLOKNNQ[eihhgcfmjgiov{|yfSYhkb^m}zxyzxq]NOOPU`d_\]]^eag{{}|ygdcaaanlffeda]^babgihdd`grvppgvvrplhefjnoqtuxibyxpo{UZeygKbng`bNsʿϫwnt{}v[i}n^W\_ZemYSY`d`WUWVTRX`aceg_Y[SLFMYNFN\cSGKPUWVTQLHFFHLU[Z`kqz~yhXSRSV`io{dfkoSLf]JPSMHGIKMLKKKJKIB@6IZF?>>=<<<<>@>?@>>>>??=<<<<<<=>><<=>=<@@?=;9;<;;;;=<878:;;<=<<;<;=<<<<<==<;:::;=?A@=;8:<;668::;<<<;;;;:::;;;:9:;::99::;@EFEEDB@><::;;;:;8=F?;=:754578899864677666666666555566669;>D76555349<<<=?AABDB>=@A@@AA@>========<<<;==<;<<9Gafgnrleacccdle=-243441,4=????A@61046;=<<<==>?ACFF?65129;975537:86577778889999<:;<>==AEB?ABE@;BKJFFGFFEGIIGHLLFDD><<;99:97776766666665667:;;;88;=?><:988999999999766:<988645886633?H>33557756654322222430Al{_>/5:85555555566899975689;=<=>=:4//0.,,,./..//.///.....//1331/006<513334454.,(Bea]iuvtqurTJF4198132,*+-27;9/,,-./,)*,../00-++-----*,.....01/,*+,++-/10.,+.046431/,*,11.7ILB72//0//0/-09<71+)+('7<())(''((+9JVR:,2@A68?A5.5=7%1ZYOQD6>>6-+/26666669<:9510)((#%-430.5:>8-()./:@;30./.-,+++,,/0017BIHDRcaTH6/=E=72000,)(),../12430./11...-,,*(''(*+*),5;94120001//../.3;::;8694.-1335>C?9644;D=&(EPCNSC541-02/-:FKKIKams_829IRPDDSO3&088768=;999:;=<944BN<2:?5(@_XAA@,)2662342/,)05326;>>@>:55``acefedddffedcaaaabbccdeeefgghjkklmllkkkjihhhijkifdcbcdeefhgggggea^\[ZZZZ[[\]^```bdddca`aaaaa`__^\[[[ZYXXYZZ\\\\^adhijkllmnmnmmnrtmaXWWVUUUTSSTTUUXZ]`baa\QLNOPPQRTUVVWWVVWXWVVVVVZflkjgacmqppndVMMOQOPWdopjjmmib_^^`abcdddgh\QQQWeaTNK[jYYe[W[WPORYdijicdlpjhr|}tppkhfah}xxzzZGJNOQV_ca_^_`O}ɐnw^u{~xuzfdcbckpjeeecbb`abbbbbcfhjnklx|{tomkigekolmptxrjp~bXmvz}wz{eZgjd^[Isϩtrg]us\U]a\ahaXONX_]ZZWX_fjkmrrbWZPIIUUDOegXKMSUWVUUSQPMJJNW^_es|ufWQRSX^^_wtchij]ZrdLPOKHILLMLKMNHBIPQ\e_SSTPNMNMMMLLLLLKJIHMSYZWQMMOPONQRSROLGFLNFHOMIFCAABAABEBBMUPJJLGINHHHIJIKLLLJIIIJKJIHFDCEFGHIIJJJJJJJNLB775?OLJLHHJORHACDDE@>==<<=@B@@?@@A@@?=<;;=>==?@=<<<=<;=?>BBDIVcbceinuxoebaba^^`ca``___coH89999998888999:;;<=?@>=<;;>?>?>@;678:=>?A@@@>;<=><=>=<<<;;<=<;;<;<=???<87:@?8679:::;<<;;;;;;;;;<;:;;;::::9;ADCBDD@><999:;;;;8>G???@CA==@ABABBB@>===<<<<<;:;<<;;;<>>LaikplebeddicG0333697326>AAA?>9101469;;<=<==?@BEA6241277874436::5466778879::>>?BB>???DCAFIEEFEGHJLLKIIHD@><;<<<;;;:877666655778;==?BCD@98::<<::989999999999877778986666535611?F;3566666666652012365->o^B847854555555677886348847>?>=9520-++,,----.../////////-023568:<:31225752.+*1C[f^equtqqfXSG6299312/.,025B;-++.23/)'*-,+*-,*('&&%&(+.-**--,**)))*-11+'(()-689863/*().02?NI932224335:866510+'(&*<@**,)(''&&(5K[L,/GB239:0.:A/''Tqgf`F>=3,.012047:88::73/2)*-+.,*,++*%$-;A3++.-1.,()++,-0-5EQVWODHVehZG>JXWQKID8-*)(+/014620.-/121110--+,///-+)'*28500111//0000//5<;874471-29;98<:45973=NM7/8PWTURA0++-/.2=EDDJJOguzvU54ALONPYbR0%+4876=A=;;;<:77968ED26BC>+*G]WG9/64.5<;752-')1337=>>A9257abcdffb`aabdddcaaaabbcdeefgijkkllmmmnnmmmllllklmnligffeeffgggfgiiifb_]\\[[[\]^_abcdeffecbaaaaaa_^^\[[ZZZZZYY[]_`acfhhhhknnnooppoprttog]WVWWWVUTUVUUVX\_`_`cZKJNOOOPSUUVWWWXXYXWXWVUTX]^blof`fmnopkaVPPPOQ^mnhkmnnlha^^_bcdgghnlaUOLP]_QMesXRlldjaQPUTWakojgksplyxw}ngeenywm\bPIONPRW`aaaa_\L{mJx{exdnutuupyfdcbfpohjliefgecec`adjmlllnqg{rnlkjikrxuonopwk`fgdfo|wljgb_[_UnӨqsmdow^Vbljeff]YZYZXTTV_hmlljii\PQNGPbPKhlYIS][XWUTTTTUROPRVXZ_qxl]OMOOPSTdkcefec]\eWKMJLIKNNMMMH=Ba|uj`SMMKKKLLKKKKKJIIILQRSVWXTMKMNKJMMMNNMH@CPMCINLHD@@@@@ADA>EKJIKNKTWIIJKLOPPOMKIIIIIJHIJHFBBDFHIJJKKJJJIKLJJJ@@FKLIFGHDAAEEEHKI~cSUPONLKHHJIKMLKKIFEGHGEGHHIKJIJIHIIKQQMMNPRRMMNNOQUNEj_Pk]PONPONNMLJJHJtcITYW]^[WVYZZZZYWUTUVUUTXVJIPRPPOOMMOOPOONNMLJM]ZJIJJKKIHFHHJJJJKJKKLMMNONNMKIHHIJJMLmxaRSX[ZUOJIMPKKRXWRSRPNNMMQRTYY_mtrdM@EOTSQOOQQPQOKGFFDCnƽòX>GDEGHJNRSQOQQOPPQQQOLLMNMMNKJTXQct}ucOA?>>>=;<<@BBB@@ABBB??>==>>>??@>>>>?><<=<@@BAG[eaccfknjfdc`\\^accbbbccclC8998888878889899::;=>=<<;;>>?>@>:768:<>?AAB@=<=>>==?==<;969<;;;==>??>;879>=:99;;::9:;;;;;<=<;<<<;;;;;::;:;<<;:9::::;8=F><>;:95346789844677767777666656777666=HI=62334579::;?@?==A;;>ACCCBBB@>>>===<;:;:999::;>=8J^hpnigggkiD04667;?:88;DDAA@<5123458:;<====??A@:33411358754459:755568889;;:<=;:767989AC?>>>@?===;==><<97877665679=DIJKJJH?9988::::89999999999989:8899887664236404;?;5556677778841113694.DqiQ<038755555567777736;3).:??>9540++,+,-..//0/./0112352.015;AFFB:42015731/*1DAFb^_nuupljT<8544379951.8:181(***+-0.-..,+,-**+)((&&()*,-/0/,*))((*-14/))').:?=92,**()-/8GM@0/334458>KKC910/.+*(*?D/-+)((()&$$(M\7+4...,.*.9<'''9oqrkO963,-/-,*+-255451/02/20:VR@0+,,,,,+*)-6D<61135,*)**,..15L_c]VNG?=ZobQGXtwi[TH5++*')-1696/--...01120.///561-**+,142/12111210/--03662/17=616?>:98415:94;DD>JUclT99DNPQRX_L,'*3>=;CD85555403<=74.+0466-'3NXM@7:6,3>;575)%,0005CMIFO^a~eORNLKKKJJKMMMKMMLKIFDDDEFFFHHHHIKMOSSMLLKKLMKKMMMNONJ{OXncROPPPONMLJJOKkwJM[_^\YXYZ[[[[YWUTUVUVUYVKHMQQQOOMMNOONMLMLLJJU^NHIKLMLHFGIJKKLMLKKJJJLNNNMKIIIIJJKNPnl_\XTRPMJKRYSQ[XQQONMNMNONPUXahlqujSEFMPOPPPPRQQPMIHDHĸÝIEGGEHKMPPPPMNNOOOQUVSOOMMLLPLO^NCUw|gJ=@@>>><;<=@ABBBBCDDCAAA?>>>>?AA??@@A?>>>=>?@>>Reba_^ahifed`^```bdeddeed_=<:;:::99988888889:<<<<<=::=:======>=617;:8:=>>?<869:;;;<=<<=;:9:;;:::;<;::::;;;;;:::;;;BEDA?>><>><:::::;8=H>:=;9:63356677634577777776666678986679@=;9522478:;;=?BB>=?:9=ADEEDDDB@@@?>>=;:;;9733567>>;Jcqqnkihoc52658=C?;75=FA<>@<41466689:;<===>?=84344221467654567:855689:<<;:::9878986:ED?>>??=;;:9;>@DIFBDINQOLIA<;9767779=?===;;:::997576689@HNLGF@989989::99999999999998999::::8876544555208>833477678887421354542Ju~rgI05:7555667777883:HB30259:753/**---..//00//110127;710/14?MI<87327:=<83.>L92L]]kvxoh`@,.10-3=?<4/3?@3/.)(''')/4871-./0-+---,+)*)*.5651.,+*+,.-,.20*(*/;CA:0(',,,,2@KD<=5/.025>MWXOB70+)))**:?0,++*+.30).%,F1$*,/.+*&-:5*)23f}kN@512/.-+('(*/3687412.375LcI1*,-,-*)*+*')1:?AAA:11220-+/3H[c^WQOI8+NmaNB[vaQ<+)-*'(+0684-+-...01220-,,,1342/--.01//1236778850/320,().6;747=;9:9457400;HQSMA>J\\W\[SH:55884263)'/3/,*,7=80*+0`accbba`^^`_`a`aaacdeefghhjjklmnnonoppqqqrsttssssrponmlkjihfecbba``________^^^_abdfhiihfedba```__^\ZZZZ[[[YYXVWYZ[\^bfhkmnprsttssstttuupf]YWVWVVUUTTTSPQYabffXGFKLNPSUVXXXXXYYXXXXWURNMPOScqocVLKRXXVSRRRQQU]kqmpqnoldaaabbceffhpp^NMX\WhxlW`nmyr_icPQSXfmmlje\\eikrz}}nowkirtmfWWYZYUQW^a`^]][ZXTQUYURQXhsz|_ajkjvplqunc_cdefbTMdyutuhdhihgehpqnlopm^Zcfbqzs}xnknpuwrutziUW`strrsv{~sc^``ffd߮nrwpgdto_UYr{vthZVWV[`aaVLLKKKJHFINOGWjMT{eJVmndca]XUUVVSQQQQRQPYo}zgYQLPRO[e\MGJXimiee[GDLONNNNMQE@woh\MBDMPOPTSQPOMKHHHEEFFHPWVSRPNKJMLJIJJJKKJHIF>@NNCFMLJGDBABBCB??CLRPLHFHHHHILOQQONLKKJIHGHGIKNUZYXYTPNMLKJJIIJJIIHFDEEEEDDE@DI@ESabROOONLIKLLKKLLLLRPMNMOIAAEDDFKNORPYejjc\ZXSTTTPJFGHFEDAH]li\USRPONLKKLMM|MPhUMPU[[\^^^[VTSTTUWVXQIGKPRPOOMMOOOONMMMKKJO\SGHMNNMJHIIJLKMMMKKJHHJKLLLKIIIIJKINIGa~wdXROMMLKRb`SRUPOMMNOOONKJNV]dedhpkXFEIJORQOQPOOOMLEGYWQHIILNMNNMMONNMKQ]\VWYXXWUTMT^IBHe^H<@B@====<<>@CDDDEFFFEDDB@>>>??AA??@ABBA@>=>>?>=Nddb_\_ggeeddcec_`cfedde_F:?==;::::999889889:<>>>>?<;;8:@@9778:;=?@A@@=;;<=<<<===>=95:;9:<=>==936:;:99;=<=>==;;::998887779:;;===<;;;;<:889:;8?G<8;9885434343333246777766666779988667857:97534789;;?:9>>=;;;<8212349C?AYnrokikqX4777:<=;625=A:57>>43466668::;===>?;42454421465664346;:55789;<=;8777778:;88@A?>>>>=;99;=>@DHHFHOQKCA><<<::;:9789::;;::<=<;;96756658>FD>=9899:::9999999;:998788878:::::887655544432165434777777786421456;;0FwsO2285456667767624J]YL>665443/*),---...//012/-..3983/.,+6HA4555>HJLI<5@K@5(6W^iv|r^A+--/-+2?@5-,:FE<341*)*.357:73/.153..121.+-/15;<:72-,,/12/+)13+)*/=D?6-'(.1.*0CK;,)))+04?JWQLA=3+&&))--7<4-+,,-079-6@*1,(230171+-1,+09.O|Z2/0//..-,)()*-39<>;50.48E[V<-+*()++**+(%172.9736I?32/-*+-4;BHE<95+#@e`H:]~^3$+-(&(,/12/,,.../12220,+-/.07;70-/1/./.07<;;50+*,-/2335699:<:6682-2;>>KTL98Xlb_`[PBAD=;C?7:A?7?^rdD7>?:IH*,21/4=:,('()&'-29ACDEGE@==7AQSLEQYLA=4-.//-+.8>5(&-1232..]^acbb`__^_^_`_abbdfefghhiklmnnnoppqrrqqrstvuuuuutssqpnmljigfcbaa`___`aaa``````bcdegijifeda`_____]\[\\[[[[YYXVVVXZ[]`dgjmnorttuttsstttuurjaZUTUXXXWVUSQQW`fhkjWJLLLOSUWWXXXYYXXXXYZZZVPOLLR^r}n`SOQSTWXWSONRetnrwnnojhhgda\ZZ^egjl_QYmtw~z_\p{xznVT\\Walmqogbcdehilowzw~wnt{{o^\Z]XPX_^]\\\ZYXWXWVVUSX[Uan]_^Z_flw{~wnfacegdUP^wnhlljhimpqopqlg``dgg_gppuyuwwtno|uswvo[chhacqqglob^aail^ըkotieimov}xdUO\kuxj\b^\nmWRc\LLLMMMMNMLL]bJZlZ\qskhffbYUUUSSQQPPQQQTd~~gVNNRO^p\GIMKJ^okjhSDR\UROOOMI8lfBMKNRY^`]XUUTQMKIGHGEEHIIILSVRNMMLMMJIIJKLJGFIHCAGNHDHJKKMLFBBCC@@DKONJGIKJHIEBIPQPNLKJJJHGHHHFBIZda[XVTSQOLLKJKLLMJHFEDDDDDFCYidSQV[SMMMMMJPRIIILMMQXRJNNdYCAFEDJW[ZZW`lpmigca\`mvreVMJJG5JsFWfolbXTQPOLKLLNR|WqcdMFPY[]^``]WSTVVWXYVLGFIMOPOMMONNOONMMLKKJIVZKGNQPOMKJJKKKMMLKKJHGGIJJLJIHHIIKJJHBI\nzfUNKJJLMT[``OINMLMMNOOMJJJRY_a_^dlj]LFFLSRQONMONNQG?ȼsWYNHHHHIJJJIKKMKIHOXZX\_]_^[WW\PGHFLH<>@@>>>=>>>@BEEFEFGHGHFDB@@?>?@AAAABABED@><>>>=;Offfcbeheccbdefc^^chgeeaS@=A><:;:;:9;;::;:99:<@??@A?>;:7=<97788:<=>??><;<<<<<===?>?=<><;=<=<<;968:99:::<<=>??=;<;98877788:;<=????>=<=@FD?>=<<<;;::999::8?E97;8765423431133456667777666778877778888987644578998=AB?;;9899<=@DEDDBBAA@@@?=<<=9423346=AAPnunigmmI4996988832577525<<4566666768:<>=>?;53445421466654345:;65779;>>:8655789;>;9=@>>>>=;988;<=@GIHIJIC<89;=>?>??=;765558:99;::9:955555668<;78899::::999999:;:886677678::::98866655443440/244589987777753125:BA0(KzyuT008445656665431:See^QFC<52-)*,--.../0/00/+)*+-3740/..2:80119LVSMD7>PF21,2P^fu}uP1,*.44,,;=0'+9A@=776202:=731000./32..///--179:;<;:6//02221/-00+)*0AD8-)'*02.)-?B1&*374-<>AABFD8.*4A=3110137:<;:8:=<=?>97,073/4:6.---,,6>@ISOLOTRI@CAHQJ<9NWJA<3*)-/01/9LE/'*.144/+[\]`a`_^^^^^^__acdefgghhhikmnopopqrsrrsrsttuuuuuvvvtrrqonlkigdcbaa`_`aabbbccca`aaabceggeed``_^___^]]]]\[[[ZZZYYZ[[\]`cfiknqstuuuttutttuuvtof]VRTY\ZXVTTUW^dfhkeWQPNQRTWXZZYZXXZZ[[]^^^XQOPOQ^nw}xkaWRSY__\ZXS_sootjfjkmomjfaXTY__^ehcgu|qhx~~yiXZj[N]adorjfggfeeiyxnw{sz~}j[X[VY]\\]\ZZXXWUVVVZ`b\Y]^]]\XTWbgiou{}gbfgb\^Zdvklmkjoqrssrmfdcbdglpgmtppsssw|xom|sq{cTbaZdrjadedafnszg˞grr_jrmlklste[_abcfjltnc\RIF[lTHQOMMLKLKJPQNUeqrppmkiloh\UTQQRQPQQRQQfoXOOKVykHHLNKEPcfk`FLgm`SMOPJ?erMX___`_][YVTSQMKJIHHGEFJLGCKTTRQOMLLLLJHJKJJFDJLHC@FMHBFLQXYPHEFEAADGIIHGGHIGEABCJPOLKJIIGGFFEEECAJ]g`YVUVTTPOOMLMMMLJIHBBBDFEGilTRQNKLLLLSVQHHLKPPPWXKIM_aOGHJJOY]\[[^addcb^^ber|}wm_MQQ>fUPU`imi\TQPOMMMNOR[aTmjPFKTW[]^^\XUVXYZY^SFEGGKOOONNOOOOOMLLKJJKIM]RHMSSPOMLJKLLLLKJMJMHFHIIIIIHIIJKKHGGEEQcjaTJJLKLQVVTXVONMKKMNNNNLMMOTZ]]^_cimdSCBLQQPNNMLMSPFWĺRMKHIHGGFHHHGGFHHGFHMW\``^\\WUTQEDAC==@@@?@@>=>>?@BCCDEFFGGGFDAABA>?@@AABCCBDD@=<=<=<9Jafefgijgdaacccb]]bhfdi_@>AA>;:;;;;;;;::;:98:>=567787889:;=?><;;<<<;====?>?>===<><==<<;:;::;<<<<<<=?><;<<9778:::<<>@@A@AA?==>BGE>>?>=;:9:8989::7AMECH@<99888679;ACCDDBBCBBA>>=<=942333569:Ggyshfl]94;9578864233322364356655554358>=?>:755554434566655437<;669:964249:;=?@>??>?>><::88::=;:97437:778887765556666676567998889999899999866777677988998866654555431/035689876665555106:@>6.,P|}}|T2374455556656626I]hc]]L5,)(*,-./001321/,++,./38411110000/0AUXPB8>PM8,/33I]et~yN21,298/+35.(+./.0135238<:3-*()/1.,++++**+-15:>=<:86203311223.**((2CA4,)'*13,*3?;/07AF>7FN\I2**04,$%*).-453/)141+2;5'2K6H=*,/25--*+0-,'$+>,**,.//.*(**++++.0140.24=IF=>:2*),-/475D^T5:A>;><@3&)--1>5)++,.8>EHB@IZM6jR--.--33-,//01321/02245442342.3;9201..0/,2<><:8653BCJQOFAJTTZcb\\dmaJLQF=<=<830048=HF409:7B6'%'((*,130251/..-,8FGISQGBISRB49BLL8(0CH<564,+021215BH7%)540//,Z[[\^^^^^^^^___bdefghhhiijknopqqqrsutsssstttvvvwxwvvtsrqpmkigfdcba__`abcdddecba`_^``aceeeca`_^_^^_^^^]][[ZZZZZ[]]]\]`befinstssrponptuuvxzyywrk^WVWXWVUUVWZ\^`ckg^YTSRSVXZ[[ZYZ\]]^^`bd`VOOQQORX[bjg]TRW]_]]][[a`^_[Y_eimnmmke]ZYZ\]`fkijrv{~ww~|ywvuxr\QilSOQR\ehigggfdgnlber}|y~rcWY]\\\]\ZYXWVUVWW[_]YYYZ\ZYWUURQRVc~kcfdbbaWSgszxnlnknvwxxznigecdfim~{{m}upqsqpsxwvuvonxxTWXdsd[ca`_^`fkrg{۷}j|w\]hnjnrohaVXjsw~tmgfYDCLKGbfIKNMKJIJJHFKSThx]akotvrm_UTRQRRRSTTRQomXRMLn}RCOKKJGJUbfUN_llbTEIOEXjRkmifa^ZURRQRQMKJJJIHFFFKLFL]\STUQMKLLKIIJKKKGBHNKE?BNLADLQWXVTROIA?BEFFFGIJJH@BG?CNNLLKIFFGFFEEFHFDN^c[TQRSVVSQMMNNLLKMLGEDDDEAMrbWPKJJLKKKTVNIEIMJQQLWQJSQNMKLMORSUVXZ\`ca^[[]_emj`\\ZOPWTTWZ\_gg^TPQPOOOOOPFJNOY{WEGJQW\__[WTUYYXUWLCEGFINPNNNPPOOOMKLMLLMKHWXJLTSPQOLJJLLKLLLMJTOIHIIHIIHIIJKKIGFHDESbd[LGLMNSXXPOTTPLKKKMMNNNOOMMRZ\\]_bekhT?>JRRPNMMNQSLOaFIFGGFGGFGFFFFEEFEEBGU_aa`^]TRIC@@BBBA@??@@@>=>@@BB@@CEDFFGIHDBCDB??ABCCCCECCC@=<<<<:9F]edeehllgcba_____`d`]h]:>@BA?<;;:;;:9999999:;=@AAA@=?<755688889:;<=<::;;;;;??????>?>===>=>==<;<<<<<===;<<<>>=;::978;>?>?@ABBBBBB@>=>CGE?>@A>;99888889;7E`a^_XWcr~zl[LB:643335655666677688656787898875545654348;988888679>@BCBBA>>=<=:4344344536PtyhhgI/377899876444432212346555432236==?>:765666665466776423:<65:;<>>94336;>>>?A?>>??>>=<<:9::?GLKE=525998::;>@@=;<>>:77:;9878975355556666776687766777788999988666776678889998767665556443225677875566435;837+#52D;&%)+-+,-2:0)'(*+++*-0330*(*042+',340,/589856<:3*(-.-2?DVqJ4279AB:-)*-,*3;7:L7((?WUJLJI[T:73110-08@:-@<<6,**)''(+,-22-+++).DMHMSE75:FJ:+-6?:(%/9;4-01024432201=8&$06641,Z[\]^_^_`_^^__`ceeeggghiijmnoprrrsuvuttsssstuuvwwtqssrqqpnlkhgfcba___`bcddefedccb````acddca`_^^^_^^^]]\\[[ZZZYZ\]]\]`acehkllkjigfehottty|}}}}{ukaXUUUUUWXXXY[_hme\XXVUVXZ\^`a_^_^_aehfd_YURQRPMMNRVVSRSTVVVVWVQPPOORX^`clpooolf`[WVW\cggecekiiv}zwssuvl_iubNOPOS^`_dgfbbgigkfiz||elueZ\]\[[[ZYXXWVUVX\_\ZYX[ZYXVSRRTQRbhdfeeb]UQMWimmponu{txzjhheddhkozoDcyopsuqmmsxvnt}tfp]RXdkXRWUUPSRQPQVQOWu~qc`X^ljkrpeVLMSYevdYMHHJMEIlfEKNLKIIKOLIOQVtbV`euwbZWTSRRQRTTTSRQljTPKVnaFLMKKKIFOaWObhfe\OKLFSmdUX_de_XUUTUTOMOPOMKJIHFHIJKO\faZXTQNKLMJHJLMMKHCDKLHECGLEEKMOPPUYZRF?@ABEELTWRKDEEBACJMJIHFGGGGHHHHIHITa_VQORTVUSPNNNNMKMLMLJHFG=?WRQTOMKKGNIMNOMIHEKISYKQRNNMMLMNMMNNQTVXZ_a^ZXY\^baYRKNRTXX`\WYffhg_WSRQPPPOOOPNPU_okPEFHLT]a`\WUUY\WOKIEFFGIMNMNNPPOOMLLMMMMMLHO[QKSSQQPNKJKLMLLMOKSQKFIHFGGHHIJJJJGFHIEMbniXIHLPTWUPNOSSNMLJLLNNNPNLIHSZYZ\^_ako[@?OSQNMMOPQOLOyþVEBBCDCDEEFGFEFFEEEECBER^ab`\TJFBDCBB@@@@??@@?=?@BDFA>@DGGHHIKIFDDDBA@BCCCCCFEBA?><<<<:7F]ecbbhpnhcb_^]]_a`b\Zf_>?@BEEB=;<<;:9:::::9:;>@AAA@>>:86568887889;;:;;;;:9;?A?@@@?>======>==<<<<<><===<<<<<<<;;;;;@CFC?@@B>;:989:9::;8Hfhaa^`iuvlea]VOOKB92123455566666667789988775545665657:9899988;=@BC@969=>???>>=<=:534445665/;_pji[6/258<<9899755543223234555322235:<>=9875666776666677642698579=?<7456;>@@A?==>==>>?>>><:9:CHGD>7457876899;>?=<<=>=;;<;<:88974445456666776765556666556766887656666678888899887777778766446645776787444A=069:@=4,3bvxyU.-54456666554108JbmR1-.('(*.0123343212476443464//110130.<[hJ5IK3-3644-2LasrF01054432/11-('('&&)366420--/5==6442-,062+*'&4HF90*-33498460-454722720/,*,24368622@HB9//HL@,)+*).73/.)(8;)&Cl]3)**1:1%%.:3''*-../06<0&(),,,+,04640..04676-(-2/+0=@7/.3896*(--.1BOkl<1(1;?62**+(%3HC;hM0-/FL4.24CIAtC(*)+6=>??<987530.-/340/.-*)+-/010/00-.139=832/033/,-20/J\VWSF<7413?MTXSHC?AQWPLKI_obYUQRF9?B=955@MOLF808BDD>631/*()*+,,.5<>:5.*))5GIJTN=:=;6640./1/()*.698620244455,*3:/-:LUI9-[\^__```a`````adeefgggghjlnopqstttvwwvutsrssqqqonliiknooponmkigdca`__`abceghgggfedbaabbcddaba`__`_^_^^]]\[[ZYXYZZ\\]_`adfecbbbbbbbcfjklprssusoqnic[WUUUVXXXXY]^_]XWYZXWXY]djh_\_bdegfeedb^WSSSRPONNPQQQOOOPQQRPOPPQRUYZY_koopssplg_[[^aa^[XWV\p}|yy{~~urugTSWSU\]XZchfdfhhkpgidOHNhzm\\]]]\[YXZ[[ZXY_cc^YXYXXVUSSVURTfgefhfaVUUP]khkrssvtq{qeffdcdjosmiumTLvyRUft|}~zssrsvzzsmoruvssyyqqaW`YUVSQOOQRRQPNPQQMHPjspf`eflsps|hVTRPQPKTqeMKKJJIJJBWvaJMOKJJLNNHGKO_~waYN]eTQSRRRRRRSSSSRNcmSMN\]LKMMLMMKJQXPXfbab^KVWPea]_][_[POSVWVTQPPTUOKJHFGKLIJU\Z[[XTPNMLLLIGILLKHFEGJIFDAHLGIKLNMMPUUOIDABBGQWXSMKGDEBCHIGGFEEFFEFHHHHGGN_b\XUQQRSSQOMPQNLMMMLMJOLEJRTSNMMIMUQKHOOLIHKMOSVQRRNOONLKLJJKKMQTVX[][YXWY[YRORQOPWa]eq`W[ecdijh]TQQPOONOOOPYi~rLDGIIR]a`\VTUZa[MIJIHHIJMMNOOPQOOMLLNMLLLJHGUXMPTSSRPMJKKMLKMPOTNE>DFEEFGHHIIIIHHHHFGVmun^OJPUSPMMMORPNKILLQPMQNNLDGPVWZ[\^anu]FGLQPNNNNOPPFPy=HFSQPPMJHHIFFFFEFFEDEFN\aa\PFCBACBAA@@?>?>?==>?ADFD>;?DGHIIJLKHGDEDBBCCDDDCFF@?>><<<<<7?Zifabjrnhcb_^]]\]_b`_f`<;:;<;;::9:;=@BA??>=<9768:;88779;;;;;;;:99:<<:9;<=<<<<==>>>>>>>>>>>==<;;<<;:;;;<=>@CDEEDEEFHIE@@@ABCCA@ABB@=<;9;;:;::8Jcb\\Z`lqutj``addguyfO@8654566666666778:;:8886655688989:9:9999;?A@@@A:4588;;<=?><><64445556400BaofK,13479877<><9756521344444444443568==987777876677666896216:779>@<657:???@@><=><:;?A??@=978?@??;66875445666899;;==<<====:8543345455446677656765544543434555553344555676788888878999::999887668:<<;96659824617<81'@upwyT114355565425<@?>Vs[*(53,),/2444443446:><96348835643332*.We=9I6+1122224AZs{g=*/29645622/,*)**+++.8<9650.26894231..01/)('(7JB3++033:>??6.+588>>3/1320..18;85325DF7+$*?E3*+'&',51.,)0B4(%.`F.*,+)-.*&/82+++0/..0671)()-.--/3221/034457;8,(+..3>B91269::/--151:P~W3&2@A92-*'&(0?C;3cn:,0)/;0$"!&-;T791((?J<:>967876579>@85640./2221/./10-068:8553.0230,'%$.Rhc]WQ:(*0=LVYZSF@;>R[WURN^lc\SHIH@BF>55>HLIA6/8KPPPA1/.,)))*,-19@?937@:87?DLJFHJKKKJLOONKGFEGORSOMJGFEEILIFFFFEEFFEFHHFFFJWac`XSQPQQPPMMRQMMMLLLKOONNMQPKKLIOlYLONMLKKLNOMNPQPNNNMLKJHHJJGHILNRTVVUTTTRQRPMLQYb]fdZYTNO\hnf]XSQQONQRRTd{~SDJKHP^cc_XUTZ`UKKLJHIJKMMMOOQRPOMKJKKJIIHIFLVNNTUUTSPJIKNMMOPOSTF8@ECDEGGHIIHHHHHHGFJYlvymVOSSNKKLMOOMKIJLPPMONMLGADMTY\]]]anoZIIPRPPPOONMEDsĿVEUgvme`XRLHIFFFEEEFDFGGM\`YPD@@@@BB@@@@A@A@?>?>>ADEA>==CFGIJKNOKIGEECDDDEFFDFGC><<<<<<=::Ngicfmomieb_]]^Y[]ab_bX<;<====;:9::<@BA@>??=<99;=>=::99:;;<;::9877776579;;<;;<=>>>>>>>>>>>==<;;<;;::;;<<>@CDFEFFGGIIC@ABBBCB?@ABA@><<9<<:<;:;K^b\WU^lpngda`bbdjv~pbM<6356997566668779::98565589:::::9:999;>BB@>@A>956778::=>>?>943335665426Wq_=-566555558@BA<78532344444444544546;<988888886777557998505;<:;>?:779;=???>>>=:98;@A?@@=857889==989855554455469;===<>>>=<842345555555677666665543443321333344322454465578888888999;;;<==;:;<<<>?>=<;;53565446:;7+6kv{D)454557755?GG?2DfU-+8<5./1355556566:BFB<747:856766554,-DD+3=--22136928VrsO-,16>9777542.--///1.-69631,(+1353010.--,+(&&'2>4*,1632=B<;0()29>@=4013321138:63119F>/+,3:50,-'&1;7+)$)9=.()*D<862,**)(+4<;5/.-+*+360)((,02//02.+-//23446893*)-037974469;=740380,Bm>*)AB90,)&$)8D>533<;83/02430-)'":s2074.+:UVKIA3-.1455>HKB>>83352123.-.1..36576684///.++,*&-D]da^Z?"$7HOPOKGED?BS^^^__bjfWLJKLOPE637;=>6($.I_^YUL@:1,++*+,)9LF72,-EKE@<43675+&*,+,2521=DGGC@=6,)('*7N`^B68:-%)&'^_a```aabbbaa`acddfjifgijkmprtuwxxzzyxxtrrolkihijiiijjklkkjhggfdcca`accegffgffecbaaabbceffedbbca``___^]]^_abaa`_^^______``acdccbbbab`^\ZYXXWWXX[\\`dc]ZYXXY[]]_\XYYWVWXXY]a\QT_hfa_`bfigcabb[SRRQQQQQQQRQQQPQRRRQQSRQQRSRPS\dejswtuwyupmkkjmnr~}|~|zzyutrf[XX\bdc^_mriejqobft[LQM\x{g]^^]]YUP\icYZ^a_ZXXWVVUTSSTTTSN|cgmne_[ZXT[psjltvywha`^_^fnssd]\QYtnQX[XWVVUUVTVbnnrzzz}|z{y|yxvtqxsVRPORSQQRSSQQQPPPQQKJcqb[nvloZYborVQPNLLOQRQLKKKIIIIGGFCVfYLLLLJJJJKLMKRYYTOUUTXWRQSQQRRSSSSNLkbNV^[QONMMMMORSSO[hb_bXMrdKQNdf]VRMTdffg]TSW[URRMHGDFLHFVWJLQWXXUPNORMHN^c[QMMONMQPFBB@JNFGGIJIIKIJKIGIGDHNOOLJGGIHHLKHFGFFEGHFFHGGHIILVa`ZUSPOOOPNKQUOKLLLLNKOUPMNLKKKKPZTMQPMLLKMPPQPPPNNMMMLLJHLOKEBBBBFGLSSSTOOTTNMPSVX[jsU_\YTNIJNW__[SSRPNHKITi{RHJMGM_deaYUTXWNJJJHHJJKLLMOOPQQOLIJIKJIHHIJLSNNSUWVVTLJLNNNOOLDRS=:CBCEGIHIJHHIHHGHIHKTcqrUMPMJKJLUUNJHHJOPMONKIFCADLU[]\\\^eeWLKSSQPOOKIDFi·<]hkm_USNKHHHFGFEEEFDFHIR_WKFBBA?@BAABB@AB>9@F@>=BGBCGG@CHIIIKPSOKGEECDDEEGFDEHF@==<<;<=<9?Uddfjklic_^\]^\]^`\_`H?ABBCCBBA?<=>>???=<;::;>A@@????=;<=???>>;;:;;<;<;::9988878:99:99:;===>>>>>>>>==<:::;:9:::<=>AEFFFHHIGFCAAAAACEB?AAA@?><<;<<<<=@DM[b^TQ^lqmd^^^_bfkopolliYI@4-.257766778975898767668:;::::998:;=@CB@?ABB=85677889<>>>=74435888:::Tp[<9:87777543<<>=977:;=>>>=<:86679=?>>=<8686559<;99988976652236:>??=>>=>?;96677665555666655445445434433233233433554445578888779989;;;;==<=>?@?>=<>?@A;553039<:98//S|W+1745589835Qqi;$039?8665553115:96641484,,*),0451/00-+,+**('(+-,(*2511>E@9-$'+6EB4/34323348<=9757=?618<:71-+)'2FE5.)$1A.'(,,+00//./1,(+6;?<5440.-89.$&,.132120-*-0211444444.)),./.,.2368=<6355.*7I0'6S;.*%&1-06;53450495.17:78863,9_J1343512Trhc^D,',//16BME=;5342--0/,,./,.///2466441.,(-9:1/25-3G^kkaSIFH>5)'+/03EPQN@46=CD>;8<8,(+**3=>=><=B@832563,'(/=Q[Q:-./0220,*`aaaabbbbbcccccfghiijkihiknqruvyzz{|{zyusroljhhhiiijjjihfedcccdcccbbbceggfec``_^__`abbcfhhhfeeecbbba`__``aceeddb_^_____`aacdddddccbdec_[YXXWWY[_`^`dedb^ZY[]^`cccb^XWYYYZ\\XTYej^WajkkkjjhghfZRRSQQQRRQRRQPPOPQQQRSSQQRRSRPQX[Zdrwsrxwtrromortvwyz|}{{|{{{ulc]ZZ^_`bbgkhhkia`p~nMRUSavqb^^^]YUQLNYZX\_^[XXXWVUUUUVTURMz{cgnkb^[XVUeuuqpqv}|wzod```abgntte_dXhvbglf`]^aa`^\bouwwwwxuv~|urx|rshQRSUTSSSSRRPPPPOPPPOKdkMMKKV_ZRTUf{}iVQOPONOPSSPNMJJJIIHFHIDMUXLGIJKIKLLLRSNMPRTVVXVSQRRRSSSRRQQLXxz[PYYSOONMLMMOQQSQXghaeOfQGMRce[SQRf|eY`][XUTSSRLHGGHMLHORUVV\YRSRMS]ZPQ]lrjYRSW]ikaVGAHJJKJKJIJJHHNPLJH@DJMNLJIINKFGJGFGGFFGGHHGGHIHHHJSZZVSONNOOOLNRTMJMMNOMNQNMLJKLMMPRMNPPNMNMNPNMNONMLKKKJKIJQTNGCDACEDGORRRNQUQOQSTTQNWTTWXXVTQJFIQSQPQPNQVQBBFLzpOGIKHFYeebXUWWNJIJJIKJJKKLNOOPRQOLKJLQRMJHILNQPPRUWVVVPLLMNMNNJ@CQK9;?ING>??IL@FLKEGKLJKLPTSMIGDCCDEFGFDEGHC==<<<<=<;9CUcgeikg_]\\]__^^^\d\>ABBBBAAAA?>=>@AA@?<;:9;=@@????@>;=@A@@?>;;<<===>=<<;;;;;;;<;:999;<=>>=>>>>>??><:99::::9:<>@ACFFGHHIHFB@?AA=?====?>>?AFKQXWQP_mojb\Y[_flookfb`ZSNJGB=93156679:;<88899:;:779;:9:8898:=>ABB@?ACB?;7478779:;<=<:::99;;;?@=NlX9?;:88975558=BB<522335554554478999:<==;:9866565554568:<8446;<>>=978:<<<<<;9657778;==<<;;:;9536;<;;;;==98642115;?@?=>>>AA@?<987644444425524777566445454233234676434445567777677789:;;<<<<=>>??>==>@CBB@;6235794340@d{{pB/4657789;@<1,.3DE,,88422345555664?@50,/51/24627=733/+)).2660,-,.4<<74Hmc4+32<9323353./9@><@B?7169-+1763541//..+,+*,-./*%&')-/-1>GF;3320/1./,?j4)(%*C>40+.3243420-2=><<<:;62>91575771Elwo`?(&,./018D=43132.++,,,,...0/014414<>5-+(/>?60-,);U]G29?;UcG8A@BB@>HRSNIJF3$%+7KVKB@=<82112/-./.175383,3;A@<82.,baaaabbbbbcddeekmidcimlhhknqsux{|{|}|{zvtrnljhhhiijjijhfcba`acccbbccccdegeb_]^^^_`aabcdgijkjhffeccefggdb`acdddeb_^^_````aacddddeedcaced`[YYYXY[^aabcefgfb_^][_bbcb^YYYZZ[[[ZZ]dbYW_gijklnnmmnhYRTTSSSSRRSRQQPQRQQRSSQQRRSTTQQSSU^feacnvvurnpssomosuuvwz|~{qjb_^_a`abdlpso``ix~TPTPVgpe___]XSPOUYYXZ]\ZYXXWVVUUWXVVUS}ubglib_ZUUfywtwwupvofsd__cjlihouvd^hb`sujjrsb_ecb`ZYkvwvxvttwy~|rsx{ʼ`QXZ[[[ZYYYWYXTSRSSQSfveRUWVX]`b_]W[tq^UQOQQOONPQPOMKJKIHHGGIE@JVOGJLJIJKLORUTRSSSVVWUSRSSSSSSRQQRPQcl]ZYTQONMMKKLNNQSQWfhb][yFPPW_\SOQVclZSYZYWTTUURNQUWRNNIDKXZSPOPQQMOY`bZSXfqh[VX[emjbUKHFIR[YQNMLKKWdYKJIFHJLKJIKMGBFHFFFGGGHIIHHHHHHJJKOSVVSPONNNOMKPWSLLLMNMLLLLLKLLMNOOHKNNMNOOOOONMMMMLKKJKLEHQSMFDFEEKRQQRQPQHCJOKHMTQIUTRPTUTSQOMKKKMNNOJVxaI>91AOGEEDSRKei_WTXXLGHIIILLJJKLMNNORROLLKQWYRKGIKOQRRRTWVWXWRKLMMMLKJCEE=HBCFHFEEFFFFGEFCCEEDDEFEEDCDB??EJIGJKEAAHatYCF?BRFAEFFGIKJJLMOSSNJHDCCDDFGFFEHKC=<=<<<=;;::C\gchlf^]^]__`^\[jbF=ABBA@?@?>=>?>@AA@?>;:::;>?>?@@@@=?@A@@??<;=>>==>=<=<<<<<<<=<:9:;=>>?>>>==>???>=<;;<<<;;<@DCDEEEGGGGECA@>?>;9DD>AA?@@???@@CCB@?>;9:;;<;889:9998899;??@AA@?@BBA<85777799:;<;::;<<;=>AD>HdU;@>:8998765317?>7343344666565789999:<=;98644543454468;><5458;>>=977:<;;::977789:;<===89?A@<:9:==<==>>>;864315:?@@=<==?ABB@>;855433357;:48>AA@><9666654334435676555445546786666689:<<<=<;<==>>>>=>BDCEGFHA62441264<[uxv{g@2556756;<8,(1,/8.'-1222345556779<2/76;>6334656>C?2***,1/260+---8<;93>f^2-3151/13450(/=>26CHG=/190/587421/.-,,+*)*+-46.&'()*+,0=HD6..1-(17+).20169>EFA=>8252:AA=640+();B3.22./8>?<:5+*28<60570*+,2-,.,,0277993-/035860.02231.06;=;2*(***+-1.+*,0=CE=321123451D~B'%%7N@0,),.011210.5EFBA=::725206867?A=^lA+''+.018<>;5542000-,-/--0442369505>>81**19:8420+3EL;1759EMU][PME=97MgoqX6/7CPI5-7JQG?KK78NJEZnpbLEOYXVRC200014KS@CCBDYe]URUS<%%+8@=95238:>;9;=?>@@@AA?=<;::<<=@BBA@??@???>?>==>>====<=<<;;;;;<<;;<;>?@@?>>==>???>==<=>==;<>ACDCDEEEEEDCB@@><;::::@??@@@>@ACB>967788999;<;;:<==;;<>CADUPB?=999997653/0:>9554346666777999899:<<:86544434456568><977:<<;:;98768:<===<;8:?@??@A?=<<>>?>>:76534:?@@?<<;;<>??>=<97754356:CFEKKIIIHEA>><965666654555566544445786566788:<<<:;=??>>=?BCEFHKLF=:9426626Plvyux}[6365767<;81-2/-42,,/1234455578:<41CHAB@=9568749JB*&*+/0.170**.3:>><27YT1*)*,/123453./43),6678.,23588520../,***+**)).1.+,,*)+,0=G@.+120-,-,-230158>IE:>>2-48AA953300.0<;,,0-)-7@G@80((3>B6,./+(+051.,''+./35<<6420275.-12122./5>D=1)(,*)+,.2,)*,8FG<410234673QX(%%II1-+(*,-./0/0/8OUNE98882,)08:77@G9JlR()*()*-/:EDAA>6/121../.,-12333794058;;5()277977953672348AHLKP]_T=215AWffE+)17>919C_YVTQIDGKOMGNQMLLLMMMMOPQPSUWWVULJKMSUUUVUUXZYXVRLLMMMKIIJIHJOPOPQG;FHGJIIHJLKKMMNOR^opZMX^VOJQSNNNQOLKFBABBCCCDDEGJOSSRSSW\\TJLQLEDHSTKAGGFHEEEEEEDDDEEDCCCCCBBDABFDEEECDFGE@RhynOD<>AP@>?@??ADDCCFKNQSPJHEBDEEGGGHFC:>>=>=<<;;;;:9B[iloj`_abceghhY=9==>>>>===98;>>=???A@?=<;::::=@CCAA@?>>>?>@?>>?>>======<;;;;;;<;<==>?@@?>>?>>>?>>>>=>?>><=?@CDEDEEEDCCA@@?<889:77976688899:;;::;=;::;AA@>>>=>@?<:87644;AA>;:8:;9:<=<<<<<:5235767BKNMMONMLJGHGB>;8776544546666444555775467768:::=?=<=>?><<>2-NT.&(+01344554100+*+*'%*+*/35963/,,--,***-2/(&((*-//,*++.@I6*-2100,+.1550037?JB9<<7:=>DA9511249:60-,,+-18@FD5,''4AA7+)+((/:?;5/*)()),.04890)*24.+02/01//7@D;/+,-+**)(--*))/8;951/013453]B,&'G:&(*+*+,.//0008\_Q<43671('08876?C7:G8(++()('*1@IFGA4130.,-,)+42,-125622326=8**589::;=<2/./8EHEHH;4H`P1$.68CQ@)%)/67))Tvl\^[D/6EGC>@MRWjlfmdPI[`A07:DP@8<0+269YzwO>>ACJG>???>>?BBA@DJMSVRKGEDDEGGIJHC@;>>>>=<<;;;;:;?Vjoplb^`bcdjsYBBD@@>=>====:8:=<<=>>>==<;:::9<=?BBBA@>===>>@?>>??>====>=<;;<::;;;<<=>???@@@@????>>>>>??>=;>===;97;C75642101467>>?BCCC@<977778879:::9;<;::99@FCCD>998776654310/5;;854556788:::99888899:9786554444578747@@;:<==><968:=@=;==>=;:;;<<<<<<=;::<>@@>>>>=>@><:87755=D@86678:99<=<;;<>;536674229@HQTSSSPNNNNLE<::9768867533334444764458989:869<=>@@?=<==@DCBCCBAEG?8573:]xzwyc=444567>;576;;96540/012345655667504:76653358::752.''+.1.)/7/).38>=><3*JS.-3045445524511,,296-)&(,02540(&*-,+.-,-31)()')/0.-,,*.=C.+5:3.-*+.242100/7=84536BA>EC<94/+-790-//+.357AH@/(&&6C90--3/*5AA:42-)()''''*12-((/40+-1/---09A@5,,//-+***)+*(),-8:2/,-./011YD(.1+9-*10.----.02327b`B.++260*(/8556;:200+*+++))*(%3JJB;440+(**',59/+.013005:9:><859?@==@C9++.8JVPIGB8,0>:-+4;?:0+*.370'",Yq[ahT949::<@?@WpmackaNMZG,-48A>??3/23445AF4(+.//,.1*)9BCA<401371%.BK:$%C]WC6Fgh@>CBGM?>>>>==AFNWYTMFDFGGGILKJ?>?>>>==<<<;<<;;==<<<::<=;<=>>=<<;:::;;=>@@ABBA><<=>>???@@??===>>=<==<;;;;;<<=???A@@A@????>>>>?@??=;<@ABDEFEDCBB@??;9898897799<@BEC?;9<==<;:9;E76642342233578;@ELONIEHR_imonkc\UMD;;::;;<<;;<=<<;;::999:=??@?=<<=@DDCCB@;8777776889:9:;;;:97;EGGE>8676544421011379966756998::::987889999886445651133359>>==>?==<;66:@B>:<>??>>??==<<<<>=:;=>@@>>?@?@A<8556669@A:55458989;;::;<=;9997778756?HKQVWTSRQPOJECA><>=;<:63444344476678;<;:9966:<<>?@?@DFEFFDCCAACC=98752544Rty{lG9523666?<6875322353112235676665794./2551,-28=@=4+(&(,02/)-6.)5:<><;966<:7<51664675015331/6CE>4*(+.02//+'*,**0/-+,,((*),11.-*'',54)*3:3+))+,./.-,+)**+++),64:FD<83-(&)---...-695?K6'''(6?1)).71+;F>520,)*+)*))()(((,22.-143/*(/9B>0(,1,((**++))(),3970-*(((,/08'+1?.-.1433100/035;57dS5/+*/1.,+-/25563-,++**,.132,$,NQ9344,()+(+7;0*/211115=AA@@@@=977:@C?.&4?IWYOJG:2.'$&1=CFE6'+3=D:*#!0^u^a]G966766:88G_ribmq\@;4)'(%$/<:30/0/.**/.(&+1-(-87-0BCDNTKJNNMLQPMJIGGHIIIHFHIHGdi?GED]W\aMEGGGFFHJKJNRPOOONONRTVWXVWXYSJSX[[YYWVTUZ\^\UMHOYZWUSPU\[[VTNPQRJHHHGIMQJJMNMKLLLLMPZTJY}KLMHGMNEACDDCBCCCDECCCA?AINORVZbcXHBBDDGDUU@IHIIHHGDDDBBBBDEDEEEEDBA@A?FRWTPMJFBB><==??DNWZWNGEGIHIPRNJA>B?>>>==<<;<<<<8Mhnqnc``b`cq]<<<:<<;::<<=<:9899:;:;<<=?BBA>:;<>>?@?@@??>=?>>====<;;<;<<=???@A@@A@@@A@@??>@@@?=;=@BBEFEDCA@@>><87888987778@GT^eifge`ZQH?<::;;;<;;<<<<;;;:999999<==<;=>BDDCCCC?:97777666799:9:;:979BIJH?7455322211012247;878669:9:9:::8767788755335663//0136:<>??>=;:<<75??AAAA??=====;;=??@@@?@@@A@9435556>>?>;:;:7444469;;;==;:::99;=?BA@ABEIFCCEDA@??>:51254560Dky_4864466/28887520136642223456676789733444/)+/49:4/))&'-010)+71,::D/,0/'',,-8;3(,10/0049<>?>><;4,((1>B<16HNQY[O?2.21+&'2BHF@1'+8JG/%16Bg~tf]G8779;6//41-Bm{w|gE1))+&%(!)7400/.--+(')*++*(),2994AA225)",7<::<:751*5OT8 #11$!&'dddddeeghebaa`___^^^____```achnrwyzt{t~wkhhgghgfffgggffeddcbccdddddeeedccccddddeghhikhec````adeedc`\]^_abdffghihgfgfedccddddeefghhikkkkjhgfed`]]][[\^abehihjkmqpia\\\[[[\]\\\\]\]\ZalpnpvxxwvutuvsbRRUTVYYWVUVVTSSRRTUTSQPOPSVYZ]c`Z\^]][XYZ[]\YYYUSSUWWWYWX^dktvvtoswifqupa^^_Z[nLQ[\\\]^^_\VWYVgl_]``[achtohnrw{{tjjxwhcfid_dkkknpponkgccdffc]RMUbjgbaaazsxbqpqwxfoa^^alhecZY[anpkmmcdgedddde_XROOQNUrzy}}{p_RNMOPRLbv[YSMTYXUQPLP[b^TNMROLXTKNOPPTUTSRQPUWOMPNOSTSQPPOPONNOPOQQOSWY\][ZWUUTPOIEFECDFGJLMMLKKLMMMNOPOYjgYQPOONNNMOONMMOPQPONNPQQOOONNOMJJJKHGIKJKNPSRORWZ\YTRPOOPRRRRRNJNQMHEFK>?CKKGHJLMONNNQTWYXVUUTVXY\sZNPOONLKJHIIIHHIIJLMNMKMMLMNOOPQPQQQQRRRQQN\djoqsv{y|{l`[USTRMRej^LHLKMLIIJKOKIQQDAWnxnQADLMOMLKJHFGFFGGFFGHHOJDLFERT]_QKLIGEEEHJJLPRQOOPONPTVVWVWXYUJTX\[YYWVUTVWY[YVTRSUWTRPW_`a]ZVOPYPPKIIJOZ\TRNMMMOOOOMJMKS{qRJGGDIOHCEGECBBCCCDCCCA?@DILPTW]cZICEFGLDSMFIHHJJHIFFCBCDDFEEFEEECBA@AABGNOMJGJHDFLoj@B>;ML=@AAAA@@@????>CMV\ZPIGHIHLTRLH?@B??>>==<<;;;;<5Ggopmeb_^`kkTB@BA@@BABB@>=;<<9:8667::999::;9889:=?@@?;<=>>?@>=>>=>???>====<<;<=<<=???@AABABBAA@AA??>@@><;=@BCEFCBA???>=:6688899988=@AA>=>?@C?<;:9<@G76431022334454444465546;BFO[\\]]YSK@=:9:;<<<;;;;<<<;:98889:=<==>@CEDDCCBCA>;86555677899::;:975@@BBBBA?>>==<;87975446667999:;=>??><:8766556568?HNPPRRQQPKD=9=@@CB@B@<853469;;<<<;:<;:<A@2(()+6CA5..0-*+./.-+('%$',13/,.,)()*('(*--/58.+/.--.00-+,*((+7E@4//,)&*46/,046<8,/3+&),-+,..+,.-.;@.(('(),01/**)**++-)&-:>92+,-+.54/0220/...-,,.0101210.--,-./*$,/0326578875346677768<1-2.-22.,,16663-))+,++)).44-+-(/1'(**%),/:@6/,21-+-25645:8432,)*.5?D@BKX_^SKHHHJOOIEB:??>?@>>==<;;:::6@^tuog`\\cjSGGB>>>>@ABAA>;;<=<>>==>=>=<;<<<<=>==>?A?@AABBBB@>?@A?????><;@@=<9:>?@A?==<<@CI775422333444544565643323559CGJLOQSQE;:::;<<<;;;<<=>=<;:::;<==>@ADFECCBABEFD?:8656678889:9988834FVO>44542222211446788::::99:;;;:::876776655557640499659;<>ACCA?95788<>?<9<>@A@???AA?@><<<<<>?@@@@>@BA@@>>;8777::6665444666897899;=>??><:8422466799:BMRSSTSPLJF@@ABDA@AAA?:756679;>?=:769<AADC=;ELFJPLE>:<<973*())'*+*2?B5#.Seaah^@3440-1641/47,/]h>294.9E@/7DC;7:==>CKVabWLHGHMOE=><8;<=@@=>==<;;;;;FJ<<>>>??=>ACCDFEEQcmwqcWLJJJKShrrqlaSJHGGGCEMTRKE?>=;=<;:;;<<<<=>>@@@ABBAABBDC<;<=?@>????=;;:756799:::;>??=<9::=>@@>===>BCG87544333344454445566533344455;B@BKSLC=;<<<<;:;<<<<<<;9:<=====>@CDCBABEGIJJHD?:976778889:9988875@?><;=???>>>??>@AA>99=:89::85444322344587788789;<<<:7311124:>??;7?LPOPSQOOMGBAB@???BEC@>8116:;@@<:54:>=>BEKROC:87652145566534644233-OyoE0875652/1688IWLHFEDA93444456788;8.+1880,/44321110.,+.355.'-87.))**())'')+./0383*-0/56/-441+)*))))')*-..,--,+(')*-02/.1331//6=;4./1,**((),*(+10,)(('))++*))))(&)--,(+4610-(,/-,/.(()*)(***+...47761.033-/3110.-.3554148==854/)'*))/554440*'+22/('065310/00/-+))'),/244579755646650/6=:60+.254/)''',0,(((-1//488306:4-+****.0/8CD<53000,+/2321266668:EJIE@:56>FKMFCDKJC=>;/$$(+*-5;<@FA0&(1132*'(,*'()('''&%(.7;@>:;2((0781++)'eeeddeeecbcdccbbbba`aabbbbbba__abbcdglmgeggedcbdddccddddeeeeddeeddefggghgggggffffghhhikmoookeb``aa```_`cdehjkkkklkjjkihhedeeefffghiijkklmlkkifbbba^]]\YWWXY[\bjmlkjilpk`ZZ[]\\]]^^_`bceehpxyy|xpqssttvyn[RQRRUWWWUTTUTTTTTVVUTTTTTTTUVXYYXWXYZ]bjllllkjigkvso}xgegbenkb`dqxmlwvh`Wr{{|}f]e`[YY_vyspc[ddf_abe`Z^djkklnr~|~}zywwuuxneedca_`bdefhlsphebcip}|}xmgddfiwnq\dnh]_bfklkrnZ^vyuqofZSVuwwzxxvfXY^`a```^YURQPOO\fqubVPNMORrl_ZZfqu{jU^^Y]icTLFGGIIJKIGJMNOPNONNNMNQQOOOOOOOOPRV[][WSPMJPWOGJSXQPUQPQPQPOQQNKFEIIGGHNQPQRWdfQBINKIOX[TRUXZ\]^]URTWYUNKJJLLLLKKJJMORVUSQORUVUQONOOOPQRSTVNMRNLOJPǟVlQIMLONMMQTU]]g|YP^_\V[ZZ`MGJFHIKLKJHHHHIKMMMMNNKJJJLMNPPQRPPOQRQNJFGJLQXirtxnNNPKRdx~gHDFGGJJKNQQOMLLLKSQGb֭]FJJKLLJIIIHGGGGGHHHIKMLKOOFHKLJIIIFDEEGGGGKPP\`XTTTVVVVWXMVUXWWW\dntu~s^LLNS_YTZYWTVVXWVTUUXYXXYXURONTVTRQPOPSV^^VNLRSNLKORJFMQNPQQQQRTPIEBA@BADHJNVZ^VIHLHGIJKJLMNMKIIIHGGGFFFGFDB@BBBCBLVLJNMLNJHLQMHFLpT>=?FKCMMIDBAA@@@>??@@CGP_cYNHFGNM=9:;8::==<<<=>?BCNhri_Z[a_H77CRD:><<==<>O[VOMIKS`glbYRLJIINW_bcb\RMKIIIIKQ[_ZVMBACCEEB>99<=><<>>@ADEFB=>??DKG@<;;>>@@@@?<;<>AABB@@@>;867999:;:;<=<;;;:::=>?@><;<=ABC776233334455533334665344565217>:7>KNPI<=>=<<;=====;:8778:;<==>@B?>CHKPROIGFEC>:98777898:99888843FYN8376312223565778:=<:999:9;;;;;8665565477:<=ACDB@>?>>==?@ACISVPKLUWTUURPMLMLKKHC>:;::@B@A@?=<<<@C@82377889:86654333344666777688:::;86445547@CBDD72>JJIMPPPNJC@A@@?@CECAB;536;=??>=<GI?766545556887546766557-Gz_357643566567=U^MLKHD=73464455788<8+*4:70++3>B@?6.++43-07=828>A<.)()**+02/-+**-45/.2?NM:-461*&&&()*,--,-164.+($$'(+25898530*'-9>;;;8/+++*)*+,,.,,,,,-/00-+*((*,00--27?93../.--,**(&(*****++,../.00257:98640/1210696645?C?:641-))*+-266523/'%&,1/@UP7./,//..--,*)(),.25455555664473*,8<635578631/+')./+)*()1868GOH@II5,-+)*,/,3AE<852-..,.00/0/055444;JKE?83467@LOMKEACHKKH=,&-2/2=@&'((((*.368731890`V$3@83669BE>88@MRLDBA@B8,,+/31/-+))**)''(('%$%'7HJ<15;50122,).56eeeeefedcbbbbcccccbbabcbcbcca```acfgghhhihfedcbcddccccddeeeffeeeddefgghiihhggggggghhhikmoprrnga__```__adegillllmmmkkkiggfdeeffhhiijjkkklmmlmmlida_^]]]][YYYXWZcfffghkpqkfaYWZ\]^^_`acdeehqxwv{xigqssvwxzwhTNSUTWXVVWVUUVVVWWUUUUTTTTTUVUVUUWXXWW^if\Z^_``_pv~xlomhkopttomu{_Yt}xn`ag`]^[dsxvihdacdb`^begaZbknlllkkrz~zrsuwy|uhbeeba_`dedcdfkgfedtsah~rVWnteV]`bdhkwqcjsqrx}~wqfbnssurpuyraXY\^__^\\[VRQPMYb[c}vaTPMJ\gmuyzmssiqz~~bT^^Z[feUMLLKIIIJIGFINLKLMMLMLMPONOOOPRTUVWXWSOJKOKHKMPMLS[TPTSPQQNLNTXYUMIHGHOVYYZY]fbO@FMKHHJPXYUSUZbdb`YTW\]ULKKKJJJKIHILOPRTTSQQRRSRPNLKLLNPSTS[\SQNKMJHoMOEHJNRW\aehqptUJafa]]YVTLFIIGIIIHIHHHIJKMNNNOPJFJOPOOOPOOPPOQROLMXUINGJg~}dLLMYiw}xxOFHGHHIJJKPVRNMKLMJH]ϾyQKONGJJHHHGGFEGGHHIKNONNPMIIKLLLNLGEEDCDFFFJQXUJJRRTUUVWYPRTYWS^n{~z}l\VOMMR\GFIKPXZ[YWUSSSUWWXXWTSX^cd^XTRRSW\^YTPNUVNKLNOJKPSRQQQQRQMJECDBABBFONNNR\[KLMHGIJLLLMNMJIHGGFDEEEFEDB?@DEFEBFNHMPKNHENeXFHGL]B>A?@AJOMGAABAA@@?>>@ADCIZcYNGFHIC:::;8::;?@A>>=<<<=>?A?AYmf][__N:7:9CL9::;?N^aWMJKNV\b\SMIIKNSY[\^b[TOMJGGHNV]]WUPIJMPPRRMA9=A><;=>@CII?99==<@KNJA749>@??@>==;<;:9:::89=??@><;<==@A77602333445553332355533555534;=769AJQTF>==>==???AEEEDB@>===<=@A@AFOSSTQHDCCCDB<:9778899:9877763/;VU;376202235667779>DB;9::99==;;:8886568?@A@@?=<==<<=BGUXQT[]]\XVUVVUTSRK@=87=AA@@@>9537@FA544334569;:86443324444677668999:989:::::;>BABEA54AGEFLPOMJDAA@@?@AB@@?<=;45<@AA@ACCB?:889;865455446866BC54:866659.@uT,64542377667-+,.1/.9>94.**)*//+-AT^R1).//+(*-.///.135740,*)'&'+269851-+)''-49<:60++++*)*,-.012345442-*(((*.7701CQO;,*030.-*('''()***++,/2.++)*046313551/01108=<5.1?C>:7640+'*1799;9542,*'')-SoT3-0*.,,,--,***++,02242./5764462-2;7,,38::7333/,,,/.)'')2;9>YgQARI.,-*)+/)-BFA<;50,-.,/0/.00/34018EMH=73154/6DLSUH>>>AFIMLNHMWbRPMHHIKLMLLMKIHGGGDCDDDEDDDBCDDEEDGFDNSL[ULOLNHGFHFCABAADNOMC?@BAA@?>?@@CFDBP^XNGGKB9999999:88@G>=<<;==>>@@@Qfd[\_WE;9<76IA7<<=?A?<<<>@CFB73<<<:9=FONE<:@?9<=;;;=@@ABCB@=:77889;98=H:;;:999989=?@@?>===:<@56403333344443222357743433228??:98;?GQOC==???ACCFKOQQPNLLKGA@BDFMRVTOIEBACCDEEA<:977789:999876405LT?6;73022356658?BGHC;9:;:;==;;;::876:@HNME?=>=@CBAA@@@>><<;<;?GPXSRWZ_c_^]YVTTRNNM@>?@@?>>>90,3@G?687311258::987653344455675577999989:::9987;=>BA726>ACGPTOG@@A???@@@@@>=>>:45<@@?ABADD?:997666446789=@@SR:=B955657.4iR)7444225665765GXNDB<;<64544667766414984-**-22581.-.37/*5CDFHLK<,.014/08852/+,*%&(),?U]T3).0130......07;8344.,.,**+/3430,***,-,*/31/-+*++*)*,,/57889961.+++**)+160,;QK=><6584/*&$%>I5,03+,***-,+**,+++,./20*(/55455469=4)*-08<84344/)'*,(',29<:BepG9K<*,*(*.+-?KE@C@5.)-0.-././//7<::HQJ=21210-+2=DHJJLPWTLE=1,.121108KQP[W@FS>*-.,,,,-,+,/222234.23,++-/-*/217?HD70.(<<57J7<<=>@>:<>>???>:;<>=;989>EKQQLE@>?A><;;977799985NN9::888888:=8=?5432334334444233238>::=93324:?@=988:>JRLB?@ABCEEGHHJKLNOPOLIGHKRWTOLFCAABCCDFED?<97778889::877534?LF<=7433335667CJJID?:8;;:;<;<==<:9:=CHKIA=<>@BDCAA@?ABA?>==<@LJISTSPOU]cba^ZWVURSQI@=@AAA??<3.2;A;47521113577::9975665444665456779:9:986654457:<<:637>>???@@?>===@=22<>=><<>>:7799766547:;;BTZVI@STF>86786/PN+3555444445547FGC@@CFA73554567554457863.+*))*-111/.,/410>HHMME8/0011.591,,++*+-++/0@Z\D,/7416:9876303=?60463///,+,.0330*'*+-11,-0/-+*))))(*/1125;=733.,/1.*('%)4<94A;1.)-1/-++))*)(()+++,,-0/*()(%%'*&%%&)+-/-*,-**()/47:;<@@2,6>=@DB<21763+*.154.+4<0,,**+,,**-.*),/.01,&(.247768;94/,*/;>855422.*$&)047;>3-,*+,*+BNC@?@;1+*0331010,,2=DCENN<,-7<90,258<;8GV[\VJ6*+/1674/+3DKOWP>??./876765-),--..--,1<4$,3'%**-7<77FSPIFHNTVZb_C7KW;&++((*28>A<4-:WP:56*0PN0)-,/00/,*4:4jkllllkjihfedefeeda```abdddcbba`_______abbbceeffeedddeddghhhgfggghhijjjklkllklljjjiihghijkjiigdb`^]]^_`eilosvvvqkjkkjhffefgggiijjklllmmnnnnooonmmlhdb`^^]^^^^]]^_^__`bejruv|{rg`^\\]]^_`fhghgdgorlemz{xyzz~{fWRSV[\[ZZZZYXWWVVVVUTSVX\]ZTSWYZXVVZcihdekh]VX\YT]hilrwuuwwwxxyvkv}~yqrofbYch[\\]`hjbltlfbb`^^cdeecbid_bknprnkiiiinv{yma]aabeedddcdedaefoszuvw{tsuwtqrjtmeugYa`accfki_Y[ZYZh|Zb_ZTQPT^hidqq[NMf~qzfRUVOKOOOPRQPR_l\GGKIIIIGG[m`RQONLKJLOPQQPOOQRRSWWTOMONPQVi|oGLKNOJJLLMMKHIMGI\qtswuyz^;>SNIHHGHHHHGFLVXSQPRSPMNPRSOMMMMKJJHGGJGEEGMRRRUX[[ZXUQRROMMIHLIJLKKIKJHEAAHHMfx[BDFFBBAB@@@IMNMIEA@@@@@@?ABB@@@;>MRMMI=79::9888;@EJMNOOMKLLKLJMJP^aad\NHJGCDC=FE<;==>?AA@CA=;<><=<:A@@;97348;;@CCCCCCDB@@@?>==<>AEFHOWhhK58AB@>=<>@?>=<;=A=7=HOSULDGKFEA==@BBA>;;;9789886;aB:998777889BKI@868?BB?:99;;COQHAAEHHGGEEDEFGGGGIJKMRVXSKDCBCDBBCBCEEC@<87777667788867767BJA;97543567:CLLKG@;9:=::;:;>?==>?@BDC@??>>??>?@@=ANSKKQOHDHLQWY]_^ZXWTRRLC@CCACA?=7103773432332223678::88887544554335579:;:8544345668;;98645>DJTYL<8:;;=>??>>===<>@848:::997446678756769;;=FYdS:@]cYRH>=>80FH36665444444536>2;HKJJC713455786367993//.-,*)+,2642/,*/2.37/,+*+++*)((*1892*(+-..0001.,*('''(')053+0:7*+.)+;6-,+*((/BQQF5+)%+42.-,,,+*)(*+++,,*+-*'+,(%&+-+$'&%).,*+***)*+,17::98548<;;51.,+)*,,++/10030)),/156446542.*09:665/-56/$&/41038::66753?PX[\WB.++.685/(*:FKOI;877:=>@BB@2()-/0,),++.+.392//+.PL+&0+)'%'+)'(#:XE6693(6??;DIKLMMNONOMMMMLKIN[aedWJHIGGJLNNMB==?>?ACB?<<<=?>AB;;;<==?BGLMLKIHJKFAA@A?>>>=?@BDDFGHLVe^D9?D@>==A?>??@DFB805>?DOYVQOPPNJIEDB><:;=:8898:2M]6:988656788:<>?@ABB<6F@2553343444333233248:;@MSOD@CFFC>:99:;>FNLCAFLMKJHGGGFGGFGHKOUYWOF?=>@BCBBCCCCCA=965666666667879;95;GC;::63268;DJJJGB<<>><;<<:;>@AADKLID@>>>>>@A@A@==>><;;=?===<<==??947988778766786568:<<;:=HVP>CV`^[YPC<57FC684253344333333,FC=923AA63101225ALJ@7355+(++--+(&''().570,,.//../00.,*)))'()',32)/;.'')%.>84661.0/7L_E50*(,210./0.***()*)**+*+-,(-30*$,8;+,+)),--01-**+)&*3861/0116?D@8/((&&2MAbtnkjR59KMJF@9.+)*++,./22231.010..///012.+,./1584+,465/070')*-231.)(,.-,/1,6J<5<:66559=<79>A>6363.22.(-;Qdica^K304557?LSW^_S>+&+3651+(11,1;>9@G[]\bZWSQSUZ^\\VQJCI^WA@EBDJBLVB8AMTNYWHLQOQRPOOONNQOKHGOX]ZTOILMI\rnSUmrd^ba_]][XUQOOQNOQRRSUVasiWVST]fg^XZ^cjlljc[VRT`lrnZSaUDCPPNMMJIGGFEEDDBABBCDDDDECALY^mnu}~cBJPTYPGCDB@@BABRWVNMHBA@@@@@A@<;;==FOQND;:9:99@CDD@>==<=>@A=>BFLNS[hkki_YMTc[K?=B?>?AABCEEFEEDDIPXXQB??>==>>?AADKE<856>B?6JVVRRSUUUSNIA>=;;9877786RF698875456778:=>@BBB=3:;345333323343322433235:EORLGHIC=:98789;>DID@CHNNNLKIJHIKLNMMQTRH@<;=@ABCBCCCCBB?;87567666666788:::68GF=<;64368:AE>:>><;;?GLMLIEA==>>=?@@??@@>=<<;;;:9?KPOHGNLIFGFGNOMIIS[[ZZXUTRKDCCBABB@<54543355553310256::99888644445446669;;:7534686566797556756=ITN?8897668;<==<<>?==96788878:97776568:;<:868BJF?JZ]YY]ZK<79=?7883423433322215COLIID95447789771183-,,./,),12561./64870*)-/.4>=;971.041*&'0AKG@;82.;D820/1336AKF>4/-)%'.9@>0'&'))))*+*-1100/,*-/-,+**+*),)(./.35+./.+.=DKG>0.1.*4F05B<40-02/.-,)(+*'(((((+032+.871,.68,5:40-/253-+*'&'+2420,*)+6CHC9/()(%DfNmxsnphMAKOMMJA9-'+/.001353420010/.-+,.0.+,01/2::30458>=96+&)))+/011/..--0-6LC/5<80179:>>87<><971++33,+9Obfaeh[;&*3568?IMWaaUB6338::72,.2560*.9?=76?HLRI2'-0-+--)()+-.0249;;9994;<;5-(&(035B4!.78:::4/2990)'(/4/5MSSTOLLIEB@AAEOUSNKFA?@A@@AB>:78;??>=DMRPB=>=<;=EJKJHHHGHHIJJJJJIIIIMV^f`JFGGHJLLKKLLKFA@CCDB@?><:9;?AAIQTWXY`monjc^X\ikaL<>>>@BDED;23433=:/9HQSRSTUUSSRNIF?:987752=E:7887764555678;=?BB@91482343323233433146510237=>=<<<==<;=EORNHC?>====>????>???=<;<;::@MROKEHLIFEDBAHOQJDITYZZZZWNFCBBCCEEFFA<97775566542223566899:96655654555579;;96558:75555776446757DSO>9<:7787:<<><>A?;88887888889867778:<:656=HIHA7B[c_\]^YOGA<<:?=5675543332222AQOHB;6556678754343-,.010-+,277410/16;9/**,.-29:<:4./9;0(')2FKA95355@F1+++-248BKD<3.($(*5G?.*),++***(&%+4541.+)*--+))*,--,,+,*-22.1?C=3@U^M6+,.+('+&6RPH=0031.,+*)**)+)''*/4750144555/2)/240/0242-+--,.11121,+*.7BJJ?/)**'8GHyssprtcTPMPKJFD;,(/575456542100010/.//0111367;>9348:?C<;3&%*-,-069750.-,,6JE037<1248:;==869::93*+2645:HX[WY^W<()02579;;@Vb`ZIMQCABA<40000-+0>GA8425>FJC747841*'**,0..26=C@;8:<89CHLQQLQOOZ_[[ZTV`]J5.++()045595058877522255/+')145?Frrsvvvurqpnmmkjihgeedbbbbbbbbccbbaa`aabbbcefeeeefhlswwy{}~~}{wsrpmmmmnprrssrpppnmlkkjjjiihghhikifba`abccddcaelpkdeeeeedfgghklllmmmnnooooppprsrqpmkighjkjlpl]Y\Z\ehikhd_YWXX[ZYZZZZXYYYYYZ[[[\]\]]^^VO]nictziXRTY[YYYYYYYYXVVUUTSU[Z]b^`_]]abacelouodb__cekusikoleup[]]cotpegsyuqrt{xorxtuvtvvvu{}pdbdb``acdffgipmfacvvfdebcdeimu~uswxtz{sorx}uputsvx{zvlutdc``hs}yz}sf^Z]^_ie]t`ilLT\chyjWYiqxuvriha^YVYYXXYXXYY[]^]\\[YXWTTTSROOPPPRRRU\a^\[TMJLNNOPLPi|hNOWYUPOONMMMLKIJJJNQPLLIGEAOswQ?LqjD?CCA@><:9<<=CGKQQQPNNKIHGOWNJMMJKLKJILOMKKJJLOOQRTSSSSUVUUTTUTTTSQNKIIJHJKLOLFFFCCCCDGGFGKMPT\`\WNIJJKLMLJHGHFFFFGFEDEECCDDDGGHHIIIJJKJKKKKKKKKKJJMKIHHKNNmwmpXEGPZpyvwxxxy[RRRTVVWUWHRwsSTPJIECFFFFGGFDFFFOFNt]URV\aUJVX]f`\WSVG;?>=BKTP@>>>>@EIKJHGGGHIIJIJHHHHHHJKS]g[GEGFHIIJIIIIJJFFGEFDB?>>=<<@CIW\_]\\]deecba`aejndL>>BDEDCCEFFC?613:@BNXWIC????BCB@;833654;:6:BEHMQSTUTTTTTRJC=97951DD7777776534456685277113222233333359;9432357;CFB>:53666558<=?@BA@EMPQQRSROKHGFDA@??>>@CGGFFECBCBCC@<87555665778877999;<<<86876578:;===;:;<<<;<==>>AIMMFA@A><<=>@@@@?>?>===<<:=ENPKHFDGGCBA@??BFILEDHQWYZ^UFBCCDDEFFFEDA;7:;777875322233368;;986576555554679::7577865545666546996>@EIIPTWVRNKEH?0*/67544431110002212211243357865007CLC3<4#&*-/.28<763/-)-BE..714?HKFA><;65:85<7/3:;<=AFOTZZSA2/5>;<98707UfdhZ[_JDID7-.0-,-15:<4,+*(1:@>9::=>4%*6.,58:<@GKD;45:;7=RYPLKKIFYh\Z[\djaJ4&'+')24421688:951./0.,/.*')-3>>=@IWH<>?ACGKLKIFDEGHIIJKLKHFJFEHHObbNFDFEFGGHGGIIHIIHGGFFE@???><>CJV\][Z\\^`bcddccdhrzjQCBCCDCCDFFC=5465;?@HZUE>???@@?>87458:;<==>?>>BFFGLQTSTTTTPI?8;9>J?668777553223557:?BA;33851223323333338=>=;73134568988644676559=???@@@FPUVVTNJGB=:;<>=>A@@@EHHFGECBBBBCA;8656666677887899:;>><7664578::;==<::::;;;=?>?BGJIEA@@?>==?@AABB@??><<<<<=CMPLFFFCEE@>>=>@@?@GLFAJVY[`SBADCDDEFFFDCB=9::887887433221127<;855776655554568;;87666665555546777976BK>5:?BDBBB?979864=DA77L_`^````P=;C@8)&,-+)))'&(IZUD30520/-+*(),0/)*284/04420.,***((./,*+39956=A=;:9520-+020,2=D?.)*(),21)&''$'.4@O[QC@>3/1354222/././//121232246541--//+)5MQ4-?C7)&+1235;873//-/60*-1,)1>DEC=:712=?;AD:8?A@@B?=R\SHLJ47KM@;8209Qjlnjc^KDH?/+02.1;AB>9647734=C>4.4==5/?E,,;CFC=ADC<1/5==CAYmS@@CDC@?><;=ACFKLKKLLLLJIIMNNPNKMJJIKKLNNMPUVUTKILLJKJIIIKKKKLMOQRTRQMKJJIJJKLJIIHHIIHIKLQSRVVQOHKNXUKJJJJJJKKJLKJJKIIIGFEEEEDGHEEEFHKLKKJKKKKKJKKKLKLLMLJLLIMmys_BDOcstuwvy~_NPTTUVVUUUVPPRGDKKIGFDBBCEFFFFFHbsnbOXYSxhY^\XRVP:AHOYSEFMOJKNQJFKIEE~eS[ZRQMHFGIIJKLJQZUNNOMKLMKLNLKKLMY^YY[ZZYYVSRQRQQRSTUUTUUTQZbO_jLOSUPHIKKJIIJHHHGFFEEEFFHGFT`TOVUNEDFDDCBCCCEFFEGL\v_Lvpt_S[aHNONIC@@?ABBBBDHLLLFAAA@ABB@@>;<=>=??>>HV>;BEHJKLJIFBBCDEEFFIKJHGGGGGGL`ZIGFHHHGGGGGIIIIIHHGFIGBB?@>>CJMTZ[[[[Z]`aefgfefiq|zn[JECCCBDEDA95668:=ADGRI===;:;;<:9889;<=>?>ADBB@==?EMTVTTUVUK=8A@:5475234332333415@A>><73234544455544775568=@??@@@DOVUQKD@?>;9:=?@CGD@>DIHFFEBBCBBBB=:778777777889::9;=>><97446799;;==<;:::;;;<=>AEFDC@?===?@ABBA@AB@>>==;;<<@FLKGFGECEE@>==?@@>=BHHBEQX]aUEADEDDDFHGEED>865555444331000.05::745666656545568::876666655556678888857EF96=;=>:8877877777668:;;86?HIE>769@CEK:1JYZYZY]WC;@B>=BB?8433430.--/2344235530.10//6A@3+*)()+,+.58864134-+156522/,,.-.//+)(-3,+452044/B9,42-.-,+)+-/01,,-)-2263-*(()*+.-&+=A32=@6,*-/,)*0359<>AA<3*.MS>:0/0--/1.**++'%=ZI3-02/.-,,*)))+--.5@>50.1551-)**+-56+*),4:4,.2037:61/-+./-),684+))(,15CPOG?60*! *><995-.>F;6===BECBA99VaMLYP17PPD:3/2>ENUbslcXMC5+0;64@ILMMIFIONGCIJ>-(293;JVV:1AMQG:78AB0&0>H@@FF@@?DTUFCSZbkR/ &66./10///06:8742/./0,(+0+%&,699;iiihggghiijjiiihhgfeddcbbbbcdddccbbabbbcddeeefeegimpy{ty~}|ywspqtuvvvvuttssrpjehlifghhdb`^_`_^_`abbbccceeffgfgggghhiikllklllkjloppqrsuvuutpkhffghikopsvk^`jmmnqi^etvph`]]]][[ZYYWXZZZ[[]^_^_aaaa\TRTUWY\clooomnzr^VW[^^^^\]][ZXXXX_gdadffgffeda__cfffggihd]VTVYZahfcgkkkjidb^ZY[\]`itxurrrrohbe{zm|pZdhgcca__`gjhct}yr{}|zwvprxvxurqwwyywx~}tyjcaaac_csvvwof`]a_YcqfY\[YRsZ]t{hwrjgefia]a_[XWUTSRW_`]YWVVWVUTQNPTTQOKNWZ_ca^\]`dhffd^XROMLMPRPNNKKNRSOJGIJIKJJLLLLLINLMsADD?UbF=ACCCA>>>?FOPLKIGGIJJJIIJMNLXSINKIGHHHHJLS[]WPIINLJIHHGFGHHHGFGIKMOPOMLJJKJJJJJIHHIIHKPY[YUKJLQTNKTRLJIIJKKLLLLLKJIIJKJHHHFFEGIIDBGJLMLLJKKKKKJLLMNMMLLLKJIJHPn|xYEMe~}ywvz{XNRVUTVVUUTTSJEGFHJIGEDCCCDDEFFECMqgeqRRLzdQXZZRWP@BKNRUPVZ^XPJH??BHH?IrǵmOZ`^YUQNMJIIIHGEGURLMMKKJJKJJJJIHK]a\[[ZXWUTRPQSRRTWZXVVWWUR_bNZo^MTVP@>JKIHIGHIIGFFFFFGHHIFKaUISYWFBDCBAABCDGHIFH^iuK}ockfdjquPNNLGAEHGCB@AADGIKHBAAABCDC@@?>>>>>??@?HN@CJKIHGFECA@@@@@???@CDCDEGKNLHOJIIIIIHGHGGGIIIIIGHGGFECA@@@>IVTSVZ][YWZ_cghihhhkouwvmaSFBDDFC@<53558:=?=DIFDCA@AADKOQUVXYUG;=JC<=978865563334668;>>:756545544333334=D?;>>83324534555554576448=?>=>>>?FLKGB@?>???@BBEHKH>=CHHFFEBBCCBBA?<:9:99997789;=;:;<==;;943688:;;;<==;::;;::>===>=>@BB@?>>?>>>==;;=AKGAIWabZIBEEDDFGHHFGG>51/10111220/////1588656666676554568::876666555456678::8866?@@AABA?;::998666666777:;:79?HIB:89:964245651000/.2AD6,+))(&&+0110-*),21264333641//..0/-*)-226=;50+).?D8<91./,()+++,4;.)).7?;0--*)+,-44++75+5B<.),./1,*155;CEF@5/,*;KD<0,-02353++//-%1S:'+10+,,,-+*))'+.18BF?5-/562/&$((*./+&$&*52//40147732220,)*,/.+**((-22Hjrpnr{v\E9/2FF7861.,,./-+*+-/03420.-+(%'*+*01,)*)5A-"7>HY=$):>4.2320/:>/#&(('))(-;>:<@9./BF2)3@CGHGFB9?`k^OENHLVI@9426<41;YysleQ<-(4@;;EGDJUVMR[XSWVNB;=>6.?T\ZB7:HJE88XfVPK8)%,?>0:A5*,/05874100011,(-0(#*466?Ekkigffffgghihhhhgfffeeedccdddeedccbbbbbcdddeefeffglqtvy}~zxvusqstvwwwwvusrqrrmgfijgdfhfba___^^_abcbbccceefghghhhhhhhijjjkjkkjjjnqqqrsuvwwvrmhfefghkmmlprgaltoptqc]gmklmic`\[[[ZYXXYZZZ[\___`bbbcc^XUWYY\]\[YYYW[giaXVYZ\^^^^^\\\YX^c`YUcojihghhfcddca`__`_aa]XUTVZ\[Z\ckowzxsmjhfba_abgkkhhjie`]grj|u]figcca``agmlkkor|{w{|s|}{~}}zvut{upxxwusquww{wj~icdbaa_dc[ixypf^]__gfcfa\[\Ucirre`hsq``eY[a^\YWTROJNX_`]WTRPNMNMMMPSSRMIUaYNLIEK[gnnhfYMPROHFHIKLOQNJLRTOJIJKKKKMMMLLIOFNPEE@AQZC>DEDDC@AACPYUOKHGGIHGFHIKOLH_`KNLHGFGHIMNMQX[ZUMKLJGGHFFGGHHHGHIIHJKKLLKJJJIHIGHJJKKJLRXSLOHFLSVOJKKMMKJKKLLLMLKKJIIIIJHGHHHFIPZ\UJGIKLKLLKKKKLMLMNOMLLLKKHJKGYtwUIZ~}{uUNRWUTVUUUUUSROKGEFFDFFFEDDDEEGC?B;GJ_OR?jyHZ[[XSVNHWPIQV[[PIHGCLKIIIJDGVĸQJY[][YROOOLIGFGGFNRIHHHGEFIIIHHFCI\a\\]ZVSSSRQRRRX^__ZWWWXXS`aSRhmVROIZeO?BIHFGIJIHFFFFFHHKJK_YEFQWQFBA@??ACFJLLFKd{m_i^gc_ruyfGLJFBCMOD@>@CDEGJD?ACABDFC@???>>>>??@BCCDIKHECA@??=>>?>=====>@>>>>DJIDGCFHHGFGGHGGGIIIHGGFGGFDA@@?@@HXYSRW]][YZ_dhjjhhdcgnnkf^\RABHG@8541249AFA:8998886678:<<=<;;:=ABDIFABCCGLIEFGIKLOUWTMJJ><=978864664334667:==9656577544343348@B>:;=83324434455554566547<>>=<<<;=@CCDDCCCBCDEFILOF77=BGEEFFGFDB@@?==;::::97788;>=;:;<;;=<53679::;;===;::::9>DJI@=?=>=>>==?@>=<<==>>=====>BHJGFHHGECBBAAA@@??@@=DQOBARa`YIADDDEFFGHFGF<3///0101110000/024687566667765556689:9766554555556789977754887:979;>?ABA<::99987655456567767=DFA:989;<>@7(N{c:9NWXY]ZH;?JPPMD;7554320-)+=H>5434679965430/8B?93/-,*+./,***++*.365.043666655651-(%4MQE;51/,)+9GRA)4AFIIIIHE>H]ilA)WfaZC;;:8610?F_{qncC0(&5?;:;<;@QULS[W_ji[MMRM<59BOE4=HLO@+.1.21147DMD>@8=PK902NZB/(14'.FF5:KE2++,-.01/,-..-)(-/./288;CCiiigggggggghhgfgfffffffeddddddddcccbbbcccdefffeefgjoos{~~|xussqqsuwyzz{{xuqooonmhcgkgeggcbba`^^_bdcddccdeefhiiihhhhhhiiiijjjjjjjlopqrsuvvwwvqifefghiikjdlukcovssur`W[]`dca^\[\[ZZYYYYZZ[]^_`abcefghe]WXYYYYWVUTTSSWXVVUTX[\]]][[^[[]ZXWTawpfgikjgeeeeeb`_]Z]b_ZWUSUXZZWX_cjllkkkkheffgglqjaaabbbdjtjz}|{ydhjcaccbachrppnkkz}jei|{{zxspqqrsqsvqgqvm{y]^~ygcbbaa]hfTbx{rg][adqsa\^]bcel{m\fsvqhZ[c`_\YUTNHKQ[cc[UTTSRPPPPOPRRRQJOgbGBEHSbmpnf_RDGNNIFGJJJKOQMIOUQJHIKKMMMMMMLMOHUVGIB@GWM?FJIGFEDD?>HPSSNJJIHGEEFHKOJDfnPLKGEEGIMONHCIS_aUJJIDEFEEGHIJKKLLKJJIHIJJJJIHHHLLJHJLOOONHGKLKMPONLKLMMMLKKLLLLLKJKMNLJIGEFDAGPV[cj`XNJKMNMKKKKLMLMNMLKKLKJIIIIKfvVFnpUPSWUTUTUUVVTQKEBAACFHGGFDDDDCFA<@:B@@GK>FMFS\[W^SLS\TLQTXRIEFBF_XZ^ZUYM^ȪcHNSUSUVTMJMRQMJGGFISJ@IHEBBCDFFFFCHS]Z^_ZRPRRQQQRYdigb^\ZX[ZTa]PSWmiKKeLHDGJKIFEFFFFGHKJLYYH>AIZRF??@?ADFJLLHJYo_t]bg`lyw~}GHFC@BNRGB@BEEFFHB=BC@?CFC@???>>>>???ABCGIGDC@??>=<=<>=<;<===><;;;>BEA><>?ABCDEEEDDFHIFEEFFEFDBAAA@ACJVUPRY_`^_cfhikhfYPU_\URMOWLEDB824=:>GOUL<877679:;;;;<<==<>>;@EIMMHECCBEKIDFGIGBFKNRUSI:7<:997556644334679<;8555697444345579;<:87664333332244454545546;>>=<<;9;?ACFHGGFEDGJKMPRC216?FFEDDCAA???==>;9::::8688:??=;:;;<=<867889:::;;;99:;:??><===>>>>>>=>=<;<@AADGGFFGGEBBBBBAA@@AA?>CPWTIAL]]UGADEEEFFGGGFB9320022111111100013686466666776557888876655545555468::977766787999:9;?BDC<548:97775455545613CKJF<469::;==:*5le;9.(11/21220.,))-2597-((%*4;<>=EVV9%?PIJJHGHGFLOgv8"Zjf`L@>@<2*8RO`zrqX-#$->?516<98FPPX[^kttjWQUTLE3'0,&/=KI5)7BDHJ<+-CMDEHAFMB72/385-&-1'/IE9;>E=2,()*+--+)**('(*+7>;66=:1hhhhgggggggggffggffffffddddddfeedcaaaabbbcfgggfeefiknty}}~|zzwtrqqrtwy{}~~zvrpnkillgghgfeedba``_^_bflojfeeffgijiiiiiijjiiiiijjiijjkjmqstvwwwwxtkddeffgghifl{tcmyustwlXVYXYZ\\\\\\[ZYYYYYZZZ\^`bcdeghkmj`XWXXXXXXWWVUTTTUUUWXYZ[[[ZZ\\ZZ\\[`fic`dhhfddfgghfdca`b`^[YWUY`_ZXWX[__``befffgho}|i_`abbcipynp|yrwyvlji`aaedcfmusmmq}}sdbt}ytsvvsnlortruyr{xWTvebbba`^bf^cv}si^Zissy_][`kkj}u{|shintk`fh`]XSIKQVa`_a]XVXYXXWTSRRRQOPURLetWDFQ]emqpdTOHBHKKKKNOMILQQNOTRKIJKKMMMMNQRUVSTm`@JGEDEOJEONKHHFEE>99@LROJJIHGEDFHJLFD`sWGJHEEGJNNKGDEJS^a[PHHHHFFFGIJJJKJIHEEIJIILLJIFFIIJNPMKHHJKKJIJKMNMLLLLLLLLMLMMLMLJLNNLKEDNWJADJOKOYiphWPPOLLMMMLJIKLMLLKMKIIFHIFScOQmURVUTSSTTUVVRMJDBDEGKJHHGFEDFEB?>?A?@>@@FCA>H_\W_QLTTNMSTSPOKJGESR^gd`]V~HIMORNPOPKGGMSVQIGFHSIKleYSLIGEBCDHMKPY_`YQOPPQQPQ^iifdb`^`d]XdWLXO\hWnSIHGGEDDEFHIJJPVJ@?@QUMC?@ACDEFIKJIMV\i_e^k~||RFB@DJNSMBADHGFFE@?BB>;@C@>>>==>>>??@BGHEDA@A?>>>=<=<<<=<=<<=<;<<<=>?@=;978;??>>??>?>;AECGIIIC@>?BAAAFIIFHIIKMPH:;865555443446689:8776798664445677665444443333222334345555359>>=<<;9;=>@EIKKJIIKMOQTN>656;BGFA<8:<<==<>=;9:;<<:7879@A><;:<==<;978989999999:<=>DKK@9;=<>??><=====>>>=<<<>?@BDDDDEEEEDBABBBBA@@AB@<@NWTSPGJWZQFCFEEEFFFGGGB843234223211110111357646655677555577887655544555568:::88976787788:;;<=AFGE=3379887544444443;IIFFE=789;<<9;41SQ2JYWa]H:@OMC=6442245545<<..668==;8.1788620,00.,%*.'(*&'7=96788779;<<;983.----../\P>KPJ9PA-,7;1-:EPTR_ttpqbRPQOJ6%-1*(:G=15CIQhkC$%>SNQNFH@2011-1;51,'%4J:25+4>4)&')+-.--,*'&(&'7DA6295-hhhhhhhgggggfffggfefefedddddefeedca`aaabbddbacdeeeggjr|~|xuyxvuspmmortw{|||{xspooniegkliffgededb``bbb`ewwlffhhhjkjjkkkkjkjiiiijjiijjjjjmqtvx||zyysidddddeeglptvrswvusuugWX\\[\\\\\\[[[ZYZYYZYZ\^`ceegghikia[XWXWWWWXXXXXVUVVVWWXYYYYXXYYZ]_`^]^^]^`a``bfhgjjhhkkjkjihea_bba_]\]^_]^_`begihlwwg_acccftt}}lmwmpolmlg\lcfffhlosrs}naj{}yxvux}wsnprrw|yzyos{mLQp`_aaba^^`]]o|uh]^lt{oZ`_[ipmnx~z~~~~~~}wmopfaab_ZNEQafnqdWRRTWYYWVVTTRRSRQPVVJWtaBER]dlsp_LIKIHIJJJMSTMJNQRQQRNKKKKKKKMRX[]^_ZitCEGGFFDKRONKIIIHFEC>88@GKKJJIFDEFGGGEHSodFIIHHJLMKIIJJIHLYd\PLLIHHGFHHHGGGHIMKACHIJLKIFMJGLVPMMGEEHIHHHIJKJJJKLLLLMMLLMMMLJIHHHIDGX`a_[TDAA@Mdk_VSPPRSSQONLKKJJJLMLJHEHHEDIGemUTVTSTSTTTVVQIJJJLMMKIJHFDEELI><=>><=>?AAAB=I[[[ULIKIFNSSPLIIIIDBKU]^\TV׭YEKLNPPPPOMJEDGLNIIHFSHZykkfgf_RH>AGEDV_`[SNOPOOOPX_^_```a^\X^dVPYVI[ï[HFEFFEFHIIILYNAA@DJMJCBEEDDFHIIHEPcj]_TrTD?BUSOSOD@DGGEEC@?A@=<>A>=====>>@A?CGGF@>>>>====<<<<<<=<==<<<<<<<====;;:98999:<<>CCB@AB=?FRVUXbhd`^\YVPLIHFFFHIHHHLTURU[]`gfcT<3:<<<==;==?@AA@?@?=;:>A=98;=<=>?DHGFGIIJMLB>;:;:89:<=BKOMLLMOPRSRB:<;88;BA;779;=>>?ACB?=;;;97669?A@=;<<;;<<978989988899:<>AGJB98::;>??=<==>>=>=<;:;?DFFEFFDDDDEDCAABCBBAAAAA<:IVXSQSNHQYOEEGEFFFEFFGID9434444432111000233565455566665556677555543444446899998899667767999::;?EIJG;24778865444444:@>BFHKE969=>;8775BsU-?PVacV?>KF;61/12245546LO7)/7>B@<=@;466/.//.4;5-,.1685/+,/1.++/8://5/,8=93/,,-)&Ow]FC9-023.'6D&$2;>BA51/-).;965666DH/.48<:33675632/*-7=<968621.,.../021*)0412<@:0-15330.2265/*:>-#()$-?D??=9788::8511/00/--..0FgCBA@@=:;3+,--./.--3=A?725950044/..-.-+,,,,,(*3=4/,(())'&*,+++.29;75:>=0((%)361/4@ISG9FRPQOLIIJKIB]sQKN[YC;GdvW-(19LSB+,4.$'/6@A;OpunumXSPC98@C9**<@53?E=AduN,(9RVUSNG5(+-/1;;*26'#6E1'*#+A6.;67>:2020,'&(&(2DI:6DJHhhhihhhghhhggfffgeeeeeeeddeeeedccba`aaba^`dhid^_ceffhqzyrljsyvsrpnljijmmotvsqomjhjlmkhfhjjjigedccbaaceggjysifhiijlklmmmllllkkkkkjijkjjjjikpqt|}}}xledccddeggkswvuvvusxwaV]^^^^^^]]\\[[[ZZYYY[[\_bdeefgc^^edZXYWWWVWXYYZYWVVVWWWWXXWXXYYYY\^``^]_]\[Y[]_bcfhgipuusrrqqniebbfnja]Z^a`_abghhikngabcddfsyypokjimkkd[~hhihieky}|qv}xijkiirxttxusrtsw}xy^ZkaRTg_acbcd`]\^[fwug]cluoUY^eopopv~}vn||z{{{y}vxrb^\]\QM]p~i_WSMNORSRRQPQSSSTUUSSSPOb^HLSXdopfUIGNTLHKHJJOTQLLOQRPONNLLMMLJP[_`beovjDGJIKLOPKFEHHHIGFGE@;8:BHHHHFGGFEEDEHLkmKIKJLMMLJJKKKJHDEP[\UOJIIHGHHGGGGCOqsYGEHHGIIF]|bGF\qXJBFHGIIIIJJJKKKLLKLLLLMMKGDCCCGPPHDLV^db_ZUNHMQUWYYXWVVVVTPMJJLMLJHIIHGIHIngUTUTSTTTTTUVPFHIGHKKIIIFDBCFMH<:=?==?@@BBCDEGMORHCDGHGNNNMJGGGGDDIKRROO?|IIJMNONQRRTQJFBCEGIHGQPMa^arzzxrfZLB9@@Vab[SNMMNNLRWXZZ\\]_`ZS_`TTSShОwz~fRDBDHIIHHHIUUECBCAEJKHHIGFHHHGGHGed[MUw~uU>APTRQQMFCDFGECCBA@?>>=?>=>>>?>@@AACEA?<;<<<;;;<<<<<<<<<====<<=<<====<<=;89889;:9<=>?@C@@AD><IUVUY]XPMLIIFEEFGGGHHIHGHHNQU\\YYQH;6:<=<;:99:<>@A????=;::9?D>;=;8:@?<<<;@HIGFGHJLD:;;;>?=:755665644655566679998665455556543444333443322233355554449==<::9769=>AIRRQQQRSTUJ::==<:>@;799:;>?ACEFEC@<;866659?AA?==<<==;987888877699;;><<===???@=;;=97988e]&/BMZdbC47485104974461=957:752.,-.01485./20276.*(*,.*'+4@=54-(044440++7Kno<-3.++,.,)8D/@PMJG>3/.,(*7ACA=7-+.6=6+*//12.,++,,.022/+*+++,..1?E8/469:DD:4.06::7210-,+.1101;BA=<=:3.0200/122410000/3763222/.,**-01.,8K@($*''2DPTG603420-+)),,+*+**.06[xf@;B<@=9782---..//+-5;:745:;41497/./.,-//..*-,,8@9@@=::74.+*)))-1:<527>A4)(')1433;CLRTRQRRTPMKIIJMGU{fC>G>1347707NB<=AF.'/6>CD@1--&%*-*,..>[lrul___I,=^R4%*7;56<>64F[P@79MRPW\R9'(+-4C9"6=,(38)&)&(;>>=>>>>?@@@AA@>=;;;;;::;;<=><<<<=<=====<=<<<<==;;<;98889987899:<>>CFA=ABABDDDB@?<>=<;86788:=>?=<=<;;::8>JLE@;9CH?<;:9;CHHIJJKI<9:99;=>>:87877644666655589986544444445455555554443333333335554448;==<==;89?A@AMWVTTTVTOB>?>??@CB<89::=?ACEGFFBA=9676659?AB@>=<<=<;:8777887668998=FF<79;<;<=<<<<>>>>@B?;:>EJIGGFDEEDDDDDDDDEFFEEEDA=@NYZVQPQOJNVKFIHHHHGHHILH:2464665543333333224443468:975666555655444555555579;;;;:99765456666799879>DFD:038866664346:<=?AABJRJ:5<@?<:9:3Lu,#6:LceK/&,54018<<7573:MP>/0453/035561,+,-/14433661035-('''(),//7:32/)**,49736KlzW*'/+***++)7JF[_TNH:0.-,((1@D?>701.161)'+-/.*'&()').1/-++,.//0//6<3,-4=FPB,(-16962//-***,.29==?@?=?<3/0454343034641352000001.+)(((((,(*2A:)#+)(:[]8-.245675,,540+'(*,-.04515;=C=1162--,,/20-.45/.3:=858:851-./17820/.2/(<@7FNLLKD?8-*(&'-079668=B;-((+13351/3;;99=905CEB:5JVU[`_I,&*+7M?*@D.,-,(''+-,?NfxG+**)'&(/7;;=6H~~dhijiiihhhhggfggfeeeeeedcccdddedcca^]]aem|wkgffijijkknrstromlhfdccccbbdddffghijjihhihhhgfeeeeeedekv~ogikklmnopoonmmmmmlllkklllmlkjhfeccddfikmleaccddcb^^kttuvvvutuwgZ^^^_^]^^\\]\[\[Z[ZZZ[]`bbcfhigaVSVWXVWUTVWXYZ[[[[YXWXWXWVXXXXYYXXXXXYZ]aca]YWY[\`d`[ag_\__]^`^]fw}pknlgeeijgdeddegjee{{wrmjhdgedmlqw~|~yq{|wkefjlmkfkuphhfguyrsqmpxxsvz|^[Z[[\lobf[SZ__fefg`Xfpe]`annVbffijlmmoonzxsmkpwvu{{gYXPUf{zvm`STWSRRQNNOOPPORUTUVUSRV[VMMU`b^ZTOJIKMNNPMEDFHJJLLLMPSSRRQPPOORPOW^]e}dTKOS[RKHCABEFGIJHHHGGHGE?75BMJGGJKJKHDGCRxcEKIHHGFGGHIIHHHHHFJPXZSMKJIIHGFDDC>>Pa[JIJIHGMhdFR|uPEGHHIJKKKJKKKKKKKMNNLIFFDCCILFC@@B?BABBDEEBFS^\TQSTTSTUTPLLMJIIGGGFDHF`wXUVTTTTTUUUUUOEDDCBABEGGFDDDDCCDDDDCDEFFEFGFFFHIIJKGHIHKKKJHFGFEFFHLKKLMG|~FHIICMMIJJKMPNIFDEGGDAGTKLJFEKUWV[^bjsj[ZdcXQQPPNO^kg`_``a`ZONLbcOUOUbXRs³zusu{}Q@CBBE@@PH?BBBACHLJGGHHGHJLNOPrraIJSnxnFQfRJQTNGFFFFECAABC@??@@??>=>>?@@??>>===;==<;;;;<=><<===<<=<<==><<;<<<;:::99::97876668:9;::>DGEFHHHIHGHHFFFGGFB?<:75AKUVG=88<==<;:98::::<==;:;:9:::9:AJKHC@BB>>=:89?HJJJJJH?=@A@>>?@A?<:87655666655567776555455554555555555554444332323544448<=<=<;;;;87777776565546AG>689:<=;==<<<>>>=?@?;GT[WURQPNJMUKFIKIIIJJJIE=5356555554553333333445578::97665554445444555555568:;;;;:987655466646899755@IF;0-3=>:985258::=::04s9!.,CB70//-,*++,,,*)))(*,0/,,15577875301.--4=GO6(+-26860./.,*-0.1>GD@@@=><2...//7;71-.37;<<:300/..,(()('&%$))#+:A2#')1NW1'-117>E=16BD@7.*,**+*))+-06<8-,21,,+*).32000+)3=;56;=:94('+3:7212750(@84EMKMLDA:.('*.32359:99?@5)'+02336:0/DNHHIGEGNSWSSL>S[IF=/-149505:/:VK.+3.0432=ND/**.253-+/6:DVfhgnmXEYjaSC::>><;?>44;??3*Fd_Z_cT5'**5K@/A=.1.+*(,=LJFLU}m=))'&&&'2A>,+0^`7jjjjihhhhhhgghgfeeeefdcbcbcdcdcb`]\^dlvyqkiijlmlopopokiigccccbcddeeeeffggijiijjihhgfeefgfffgjpxuiikkmnnopppoooonmmmllklmlmmlkigfeb__``acedaacegiiebhrttvvvutuyuf^]]]\]]]^^^]\]\]]\\\\]_abddfimne\YWWWVUUVWXZ[ZZ\\[[ZYYXXXXWWXXZXXXXXXXYY]ef`\_fnqqm`Y^aa``_didcu}{z{icaacefhhhggedccc_^sssifgmio_ipru~~|wv|~kpqnmllnoppqtusolhitxrpqqrwwxz~_\Z[[Zbvygekd``^_\elkcagldjhWX_UVagjlkkmmmlp{}vpotuw{~r`\Zctqg`ZZWUUSRPNOOPQSUTSTTSSSRRYZSPTVWYZQGMQSUTUZ\TJFBADHKLLNPQRRRSQPPPONNOSW`x]COXZ]TFCEFFGHHHIJIHHIHHHGB8BYWHCFJKKJGEIDFomGFIHGFDFHHHIIIJJJHGGLW[XSMJJIHGFFFECBFOIGHHIHOsdRlRCIHGHIIKMLKKLKKKKMONNLJGFEBEMJEBCDDCDCDDCDFCHZf\SRSUVSQOLLMLHHIHGHHHGI^vvUSUTTTTTUUUVTLDEEFHEEEFFFEDDEEEFFFFGGHHGEGGFFFHIIHHFHIHIIIGFEDCDEIIIILPSN\FKHIFOSLGFFGGIGFEHJHB=BM@IIGCACHOX_hnmkdY\]TPQQQMQmvg`_da[SrZJa\MSNKIDDD\ƣnlux{eKEBBA=JLBBBBCEHKJIHHHIJKLOMGSuvWDNJOYgkP^bJNNOMHFFFFDBABBCA??@BA@???>??@?>=>====>><;;;;;<>=<===<<<<<==><;9:;;988778;;;<:8467876?FHJQRPPONLJGCBA@??EGFFFFHIJJJIGFEDDA=;;:8@U^YJ<559<==;98889:::;;;:9988::;<:8CQSKB<>??DHKIJLKCAEEBAAA@A@>:86455444554433567665555554555555555555444433333334459<<:98857;?ADC6?SVTVZTEBA?>>==>><:9:>BCDDCBB@@?;:=<:88:=AAB@><<;;:657876775432/9FA55888879;<<<<<==>==>>ADEFGEDEEECDDEEGKJIIHHGFEBADPVWTSUTOLIKSKFILLLNPQJA:765555444444433333333566788887777766644324655545568;;;;;:8988878876568899606DF;1.*7JJGG?349;:;=AA?CSZK:;=?=<::2+a{;!/,-Fb^;+;;014?FA9;@98<;23;?<9:<::961---,,/3678886322231--4764/&"'/2.+**+->?@@=9632..7=>>0/-,-2540253.*/532?KKGFDAA>1)-/+-5<92*)/6@B@:3233.)(')+,,,5?3&(()8J7!,BOB*(,+(+2:4/>HHF<75/*)'*36,$*/00-,.0/-,)%(02112,*5>=98@95756N\F30/)5EF>?OG/),./3881/;?:Jblqnb\akkh^LD@?>>>=;746:=4$:gj]cbJ..;0*71*1-*21.-*:U_\?9DcD++)&&(&)9D9*&4mu7%kkjjjhhhiihhghhgeeeeedcbaaccccc`^_diqzyoiikllllljigggecbccdegfeffffggghhijjjihhgfffgggghgjnt|}pkllnonnpqrqqqqppnnmllmnmnnmlkiggebaa``abaaabegkkihinstvvvwtrx|rbZYZ\\[\^^^]]]]__^^^]^__^_afiklone_ZVUUWWWZ\\ZY[\\]][ZZXXXWWWXYXXXXXXXXVX\_`envyxz|ug^fhbhpstpw~}xgfgfghgfgiiigcba`_bimvjcefkprbiqstr~{yyvsyliknmlnpswyxx{{wqimutqporuxx}~sY\]\\annbbdba``^aaehffgghmjdb```fiklmtxwvvw|w{x`Udsyph[YWXZXVWTPNMMQVYYXWTSWYWVVUXYRRVSONNHDKUYZWW[c_NFEBBDFJLMNNPRRSSTUTONONPVb~{MZh_QMJGGHIIIIJJIJLJIJIHHJFDXcN>=BGKLJHHJIEbjH>DKKHGGHHGGFGIKKHHIFGR[[RLKJIHHHFCCB@HGDNQKGJuvYfMCIGGHIHJNPNJLLKJIMPOPPMIFCBEKJDBCCCBBBCBCCGFBQhhXRUXXTNKKNNJHFGGEIMJFKjjTSUTTTTTTUTVRKFFFGHIGGGGEFEFFFFGHHGHHHHFEGGGGFGGGFGGHGHHIIILLJNSSMLLJLRTVHEHFGHMPLGGGIIIHIIMMKFABQ?ABDFEBACHR_gc^ZVZZQQPLOLZwtjehtyzikiW_bx`ACBDwxw{{p`TNT\ce]VRNNJIMFBCDFHKKJJHGIKKJKMKEOmtMIHJFFR}w]\ZKOOOLIGFFFDCCBBCCAABCA@BCBB@?>>>>>=<><::::;;<=><=====<<=<;;:99::98766788;A<<44667?HHJMOMKLJJJHGGGEDCCFHGGBBFIJJKIGEC@>::998;VkeQ<6559<=<977788:::::::8778::;<;:?KWRIC@BDCDEFD@AJKKLLBCECA@A@>;8987544345432211234466554346555555555555544444444324457:<<876657;>@A?65L\]_^QC@=;;:89;=<;9:?CCCC@?@AAA;;??;::;>@@BB@=;;:8678869;965412?C72444212468:;;<===<;=BDFFEEFFEFFDDEGGKOMIIIIIGCACMWUURRXVMJHJPJFIMOPSUTF96766554322442233222333455666676677889888756655445679;;;;;99998:;;998878:::7/+7D?1/+/KYSQH649;;;=?A@@ISOC<:<<;988-Rs: 1/+4R]='25135;>98:;>B<99;CGC=;;;:762//.-,-27;9641////013673/./.(&-330.+))JqqYJHLD3+*))))**9N83CC93,/61*((*6>?AF=-,+*)*,/465443210//-+,2<@@AA>72212.-RWD0(&)'$%')2EFDB96:3,)()-:6$'43./-+.0..+(',-/57118?>>?BDGE:&"$',...03645?-/:CGEB?8.+,1*)20/4<>98:BC8)%.13347=?DGFGGEA>=>CD>856;CHE9./7:<>=5=[[D?3"*CMG=;ID1*+../8>86@9,Kg^engr}tlndQJC=<=?:0---/56*0Ylbja9%1,.C\='/iiiiihhhhggffgggfeeedddcbaccdedcbfmqsy}z|~pkkkkihhgeefedcbbceggffghhghiiihiiijkigggghhhiiigiqy~vnlmoonoqrrssrrrqppponnooppoomkihfcba````_``cefjjjjhlpsuuvwskp|{n_YZYZZ[\]]]^]^`__`____]\\\_fjjnrnib[VTUUVY[\[Z\]\\]][[ZXXXXXXXYXXXXXXXXXWXerxxwy{z~{nfelxzzup~}tnmqvvfj|yoeddeijedb_aceedif_bbdggnyflqssqu~}|zwwxmvpyhbhmmnqtw}yyzunrvnmmmrvxxZZ_^]`mna__^_`_]fdge_chfhhiqrojfiigl~{z}|y|s][jxo^XSV[_a\WWYTOOJMVWZ[XTRQW\ZXZ\\VQSSNNLJIHMUXWWWUVadTFCBA@DLONNPQQSVY[ZVPMNPUmU]g^QJFIJJJJIJKKLKLMLKKJJJKLSf]C;<>BGJJJKKMF[lKEOLKJIHGGFFEDCGJLMJECGMTUQMKKIIHGEEEDHFDM_YIBfevMGJIHHIJJIRWMJKKJILMOPPMJGCADIHD@AAAAAABBCDFGBE[k`RSXVPMLLOPHGHFEEINKFPzt\RTTTTTTTUUUWRKFGGFFHHHHGFFFFFHIIIIIGHHHFGGFGGGGGGGGGFFIKMNSXZaimgPQROQZWfjAFFFGGGGHFHIKKLKKMMOMJCBUC@@ACFFDCDHKNPONQYWOQWOJGMdlsܹ}\=@>P{xzp^UQQSYZZZZ[UQMGDFJKJIHIIIIIIHIJJFVnaIMGJJFKr~cXPLMOOKIGFFEDCCBCCCBCDCA@DEFD@>>>>>=<<=?>><;;;<<<=@@@@?@AA?><:988999988877667892=A973@KLIIHHFEFFEFGJJBDHGEFHGE789:;<<97777668::9::9988:;<<<=@?@IPRQJGGHHKLNIBIKLMJBBB@?>?><:8975565467543333564455655358656555555535456554444444458:<;876689:>@@;61C]de`N>;:77767;>=;;=ADCBA@ACFGC=;>=9::<>>=?A?<:887655569;;9866;A801123555788:;=>===<:>EGFFFFFFEFEDEGHKNOLHGHJJGDAFSXVUSTVRNKHJLKFJPSTUXWI:87665445345422333443333576544544567789:<;<;;::99;60*.=B40.-FXUNB338799:;=BDDMUL=9;:987=0=c@#/22/>XH+14146655568=><65300670)*45,*FQK2-49785,1NZOKG9+"((('%-:CA;8436730.-,77''6;31.+,/..-,,-+-5977::9>EHIIH;*))'.10100417>..,7GE>6--1382/--,/6;:9:@D@2((+1115;>;67>B?95212333/2XP@RK4E[R@8:CC5+,0/28=<94'3`b@Xrlz}fapm[KC;8>B9+'*,+07/&>SN]]8:XaJ-)-)4O\[F6-4l~N,+,*G;&*%%%$'395215D@+,2hhghgggffffeeedeeeeedccccbcdefgikljhjqzxqkihgeeededcbbbcegggghiihiiiiijijklkjihfghhhiigis|wommoooprrssssrrqqqppppooqqqpomkigdccaaa`___bdeijjiikortuuwulo{}zrf^Z[ZYZ[\\]^^^_`a`aaa`_^][Z^ekmnnlhc]URSTWZ[[]^]\]^][Z[Z[[ZZZYXXXWWXXXY]itsmr{zvszzuwzyvsqwyrmsuqv{rgios{qbbipokiccedefebbabbccbbnleknqpoo||{xxzxutwmrvmtmceknprrox||xvvxvqljmuxyz_\`_^_jj__`^^__]ailhbekjedeidjnrgZdzwxyyvrrquxd^in~xYW`ecgph[VWWRRMIT[YXWUSQPUZXWX^^VOOONNMLIOWUTUTRNJSgcJ@A@?DOSQPPQRSUX[]YPKMOVwjVjXLKLKKJJJJJLLLNNPPOMMMLLLNYeR>>??@ADGHJKMGWkUSVDDKIEGGGHHFDCGMNIEGHDIRRMLKIJJHIHFFIGFBU_]LK}hKJMKJIIJHFOYQIKLKKJJMNKIGFECFKIEA@AAA@ABBCDEFECL_cVQVTNNNOPLBAGHGFHLMCXpXRTTTSTTUUUVWRJFFFFFFFFFFFFEFGIJJIIHGHHFGGFFGFFGGGGGFGIMQSWZ`gousfOKKKR\VfUCHGFGFECEFGHJJKKLMMOOJCBUDBBCBDFFHGGEBBDGKUSNVecICTzڞ]ԇPqoKEFH^Ȼvxzrc[WVWVWWWYXXTIHLKIGGGIIHHHIIIJJSaOLLHJJGGU|dTFHJOOLJHFEEEDCCCCBCDDC@BFGC???>>>>==<==<<<<<<<==?BACBAACDC@<87778899988975568657=BDHOIJLLLMLLMOOQUTJDNIFFJIHB8CLMMKIG?855766<63QhP8579::;<:77787678::::::;;;<<>?@CC@;9DTYSKIJLNPSTQOLNPJA??<<<==;:;:7556889;987899987886775346666655555533466555445455568:;98778899<>B>83=Xfh_E98766667;>>>?ABDDBAACEHID=;999::<<;;<==;987531012589:98:?;212358>?>=;:;<=>=<<;:>GIFEFFEFEDDDEFHNPNJGFHIHGDBJUWUUWUMKNKJJKJHLRWXX\XE88778666655554555555333355432332234555679=>;98665447;<;;;;;889:=>???<;;989:730-2>91.-AUXP=013367778=??JSM>886567:11JA-12322MS84515655657::67:>>;5/058876565430-,,,+-/--,,+.6974..3597/*.578;80Qv`7)('&'*)),/100-976/*)'(3?=8;>;3-+.1336;<72-)')..)),,19?>6*)-+)*3=<>E1.4..-2:<870,---/17CJJLLJEBA4'*8<7210/-.123/.-./13/.5:535@?@2-:<;;8*1ZZE>:37@9+*)(7>7951247;:641.35)'283/-+.1210/./016;86743<:@JLG:47BJJ7+/545665/(-CO>/RrkwzSBWj\B@<8CJ@78:50381&.7+:QQhnN801,*HholU?.Fa=,+-(%'&''&&'')131436@:453fffgfefeeecbbbbbccccccccccdeffgijf^]gr}|pjfeccccccbbccdfhiijjjjjjiiijkjjlllljifhihijihkr{xqnmoooqqrtssssrrqqppppppqrrqpomkigfdcbb`__^`cehjiijkosutvzxtuz{{|vi_]\YX[\\\]]]_abbcdfeeefdZU[cghkorrndXPPSVZ\\]]\]^_]\]\\[ZZZZXXWWWWWW\juk\]nytpuz{{}~smnln||vphgecjupigffgjllmyxutpfgfefefhgbbcbbbaefflmmmmu}zxvwvususnmlwzt~sfekpqrpgsz||{ztloxxxyk__`__`cd`__^^__^_dlolijhecb_aeopZt~yxwtrrsswvaViwsYonaf^[[XTUTHTd`]XSRRRRUYWTTVVUQNOPOMPPSYTQQORXXQS_VEACBIQRQPOPRTUWYYUPRSWYsÑ\iYOONOMLKLLLLNOOOQSSRQQOOOMM]dK=???ABBEFGGIIMY^LDEGKHGIHGIIFFFFJLIIKLIIOPMLJHJKIJJIHIGHDFXigTMxaJLLKJIJJIHJOLIJLMLMOOLIFGFEFILID@@AAA@AABCDEDFECL[YRRPOTTQOHCDGHIFGONB\rYRTTSSTTUUVWXQIFGGGFFFFFFFFFFHHGGGHFGHGFGFGGFFGFEEEFGHHOTT^_gmnmfVKFGKOTSXTJJJHFGFEDFHIJKJIJKLLOPKDBUGCCCCDGHIHHGEDCDIRWTU[czݼ{TArr\pJGNQdİlUU`gea[RSSSTUUVVPOPKFFHHIIHHHHIIIJLMNNJHIGFCAb~gJB>DNQMJHFFEEDCCBBCDDDB@BDB?>>>=====<;<;<<<<<<<<;:;<<;:;<@DB;777788899899777667;66COZXOORUXZZZ[[[]b[QU[OIGIHIGAGOPMHB>955466794FZQ825789:;<8789988998:::::;=<=??@CGDBA9??=:99;>>>=<;:?FFFFFFFFEEEEEFJNOMIEEFGGEEGNTTRRRMCEIJJJIIJKPVZ^\I7689;:678776577776555333331212212213333336889::876546;<;;;;:8::;=ABAB>=;9898631--472//:O]V?311145555458AMN@875667743895433627KG3046666:>?@@649=70-052-15566763/-,,+)*-,,,,,04744322231,(/95398Bd]4**+,--*+,/2322-:65.*)')5=;9=C<0,.24535<<3-+(''.0-,+(/:><3-,.149C@1-+'+31,*4=<53/+,,)*+1AIIKKHFA6.+/:<61/--,..1/-))+./0139:9=71>8&,4856,+La;/D=2>PD2*,'9G648216>=9652./2-+01/.-,.36552//37886430/:EGHIE2)32'+10-.1'/?7/0+/5/065235630/1540//./489746;:114779=?;840.00..13/3GJ7*&*:FQMILK>48<:573#+Qi|l3 (.+,HfstcH3bl@?2*0-%((&'&&''),/1307C>:87ddefeeddccbaa`a`aabbbcccccdefffgd`]amw~vkdaaaaaaabbbdegjkllllllkkkkklkkllllkiiiiijlllot||womoopqrstttsssrrqqrqqpqqrrrqpomkihfdcb``_^acehijkjkmpuuvzzyxxyyx|wg__[YYYZ[\]^^_abcfijijkljd__`beinrusi]VVTW\^]\\]_dgea^^\[[[ZYXXWWXXW\df\W[chmwzx{~{xriflnmmnljgcaejmhor_ilf_mgcmpkeefefeefdcbccccegjltmkjm{}}|zwtusrtukqymcj|~|iekrrrph{~~zrpz~}~ymjfca``__aaaa_^^^__^^`lvulhfb``__bspt}~zwvwwvuzwm~֦mpwaV[]]VR`eW\ghdZYWVVUUW\\Y[ZSSWUPPQOSUQQRLNVcmiaX]\JEFFLQPRQOQQRRTWWVWZ[\Wcz^IAMTQRPNNNMMMPRQPSUVUVUTSSNNffKGE>>CDBCDDBEII^gIDKLLKJJHHIHFGIIIJIOTRMJMPOLJIKLKKJKJIHHFBNfqv\Kbw|YJMKJJJJKJJIHHJIKLMSTNHGFGGEFIKHD@@AAAAAAAABCCEGDDQZULKSYYPLHHIIHJIKQMB\nXRSSSSTTTVVWYPHGGGGGFFFFFFFFFHHHGGGGFGGFEFFEEHHFEEFGGFDJOSY`hljdZOIILMNOPQOONMJGFFFEHMOPOIGHJFGNPPGDUJCDDDDHKIIJIGFDEISUHGplj[KQRWj׷mYy~x{}pJGUPLm~dW[gsx}dVZURSSUVUUTNDFHHHHHHHHHIJIIHQMIJIFFDAAqmFB:ALRMKIHFEDCCBABCDCB@?@A@>>===<<<<;<;;;;;<;:::9778654459@B;76667887899998788878@NPOT`\XVWUVVWWUVVXXWZXVPGHHIKMMOKB:886656872?\S:134689999779:;989::::<<<=?>?AA@AB@AD>;FW\VOMPPSUVXYXTSK?<=<<;<;:;@AABDFFFGFDCCBA<9877779::999:::?AAADEB??>;98768524557;<;::98669==>?>=<@CEHHFFFEDEEEEGJMMKHFEFFEDIOQQQQOIA?BCFHIHHJKOW^^Q?>CEDA;678788777876455423321112212323333324678897777;=<<=;;;:9::;=@ADC@A=98776331-,11./4DXQA@94334444445:ELC;76887786466556781;L>268779=HHB?00;>2*,39.%,2367641/--,+**++,--,./0111320/-)&192-4?RM0&*,/55.*-225641,>T0,9EDD;75/,)'*6<;:=@:015420/2::3/0-((.12211.4>;110/4>CE9//14682)-8;8402552.*('5FJIHEEB4(+-,---**+*,*,-,,-*,02225;@A7.41'(*,-+#6W7&(OO51123//'(JC/6727?<4343-+/046/-..../1243215:86420..7BFGG;-)//*.30*.7/3=300,+**/7643561.2998872.-356655AB236=ABD@:40...,,+,26Mp||dbf[PRSUVVVOCFIJIIIHHHIJJHJNOIGJKHFEE<\oBCA@DNNLJJGFECCAABCCC@>>??>>>===<;::;<;99:9:99:988898665557:8765567888999:89:999;HRRHIXd^XRKHILLKJKMKJQPVZUMGIKLKKD<877765786>??@ABB?>;:>@<>=QgaWTRRSUUVXZXWN?;<==;;;:::>;788:===<=<:9;;:::9:999877666655444444456777555469:::99;::::::::5.9UXC<<<:99;<>?AAABDFFGGFDDA><9889999999989;<=ABCEGIHIIHGFDD@=98889::;97544568:=??>=<@EHHHFFFEDEEEEHLLKJHGGGFDENRQPPMG@@BABDFGHIIHNX[WNNTQKE?;878899777666545533442221112332212223557777899@EDC@;:99::;<<=CG@AEA=96554540+,///29FONI?87444556658>CB<967777777754678621:F<87588<7:@H@048/+/45/-355773//.----,,,,,,,,--../020//-('/6/,4CL3$)*,165-*-32496/,@W5-5>DG@752-*')5;:;=>70364000378763.)+0445<<..>:100/2>KE5169<983,*164435;<5-*)%,=HIHFEC5**+****''*+(*)+,/.((26566>EA31/+*((''%(=?**)PJ*!#%',,(&EK0053685./32.,.397.+-./.--/0555797672///6@HG@0*+-0225515=36:1..,*()/6853460-2:988840/355554BD48>AEJB;61-.-,*+,+17=A/#%&%#"1?<3-/62,?\ejaH7323-/6657772**5?>8/%#3OXF88=>>CC@?CGOY^YN@A>DOPMIL^sX/4419LH]ynZR`VFDB7*'&('%%''&('),/&%:B84;71dcdeddcccbba`_^]^_`aabbcdddffdehlqvrs{}zpqkedba`_``a`bbceehlmnnnonnooonmmnmmmmmlkjkllkjnu}{vspoprrstttttssrrsrsssrsssrrrqqomkijigfdcddeeghikkijpuvw{~~zwyzzz}ufcb^\Z[ZZ\]^^]][\]]]]]`dge]YXXY[\[Y_b[WUV_hfd^ahnsoaZZZZZZYYZZZ[ZYXYYYZ[XZefgxywqs}rcejkkjklmkjigghsmp}swzogghgfhfdejquz|wqkopu||xuuwwutsqmnrt}}q~timsquaRyv}|]X]_````````aaa_^^^___^\fvwtuob]^`dinolpohs}vvwyyzywxȃnp]\^jeZh|qWQW]afa__]]jyk`UOOSUURONPQSZeiheacfbd\IKVVPQQQQNPRTX\][ZYXV[all}kwQQQPQQRUTSUWTRTVVVVVVVXR[eWPRIBACFFFFDHKLFBJLKLMNKJJIHHIGGIJHFEHNUSMNPOOMJKLMLLKKKIHHGLajacdXYXVf~zPGIHJKLLMMMMKKIHIJJFCDCBDEDCEGKIEA@@@@@@@@ABACCEEDGV[NNWVTNJIGILLKJIFGGDqziYTTTSSSTTUVVRKGGGHHGGGGGGGFFFGHHGGFFFHJJKNPSSKHIHGFEEDFGPUVbijh_TKGHKKJIKNOQQONKIGJMVTMECEEEEGEEKJJFNMDEEEDCHMLIGGHIJLUrMWYVWS\iR˦cWiuxxpqyY:AGD@AJ]|vrrj_hr[ORSUVVPDEJLLLLKKLLMJGMRLFEHIGEHD@VgCACGQZTKJJGFECCA@ABBA?=>===>===<<<::::9:::988899888987775644655567888889::::;99>EPRQJEH\b^\[TKKKJIJMJLOQWZUJFIKKJG<866666687:UW67753579:965579;<;;<<<=>>@@??@AAB?>;8<=<@9Jni^ZXXXYYZ\]^aVB;<=<;;;<;9;:8889:<===<;9:;:9::98:99888887543344455557666544689:99:=<;::;;::;>><79>?<>?=<;:;<>?@BBBDCCCEFDBC@=<:99::999:::9:;>@???@BEHHGGHHIJIHGD?9;998742135659@??>=?BFHHFFFFEDFGFFILLLKHHIGECDHHJLNG=>AAAACDDEFEFIOSUVYVJ>;;99889:9776666655565444533333454423312556577788:>CGC>:9:;;<<<@KH=AEDC?6566441-,/./49:CSO:<;656779::;>=<;9677677777546784135<8647<=<567@IA63//01128<:6561+*,../1110-,,,+,,-./////0.*),-..39;50)),/0-)).0/268.-?\=288:<>;:7/*)*4;::<:0055202689:<81,).79639D1'58/-,.2EQB118;;72/)'-564449<2****,2;BFGA:50-+**)(%%*.10+)/4/()-/149@E<,*,+,)+,.-3A>6-0F;&&**+'(('6L8-1-,,*(*,..237<6,),,./.*(*/267788732434=E?3))-034226:;:079.--+*(+.6963441/154444424443441>D6CJICB9210..,+*,0..5=>0(*)(('+-.1661/(-L^_VC745<<42676891(-53,))'*2513?@>AGMKCADGN[da]UI5?RSSSRPcg@6=<;=DABKNMMKIIIIIIGIMLGHHGFMRSSPPPMKKMNLKKKJJJIIENcc`]YUVZ_lqPDIHKMOOMLLKIGFEEDCBDEEDDDBBEGKJFB@@@@@@?@AAABBCDEIPUORVRNKJJKNNLJHHHJKEZzgYTTSSSSSSUUQLHFGHHGGGGGGFGGFFFFEEFGGHJOTXZ[_THFHHHGHGFFEGKMU`ig^SIFFRNILMNORRQONLLNPVSJCFEAEEGHIIHHFLKEGFFEEEQPHFGHLJAzЌOWZUXYT\jMCСlgr}W>FJFDB>Idzidb\ilTOSVXVHCELOPOOOOQQPKJNOJECCCDFHC>====;<<<<;<;:::;;::988888878788788777:944567879999::;:;:=GNOPMIFHMY_bmo\PNNNNNOSTUXYZSHHLHD>8777676886>L778745679986457:<<;;<<<=>>??@B?=>DFD?:;<>@9Bbmfd``___accadXD:<<;;;<>><;;98888:===<;9:::9::98:999:9999754444455556667644689999:<;;;;<<;:;<;976667>@=>==>????AEGFCAABDCBAA??<:9:::9;<<;::AEFFEEFHIHIIIIC<:>=;87875528@?==?@BDFFEFFFEFHHHHILLLKHHGFDBABCDHI@:=??ACBBBBBBACINU[]S>;:97777888787776555677435555555686666433344455577977=A@@?>=;9:776652/--.08=97EN@:<879:=>=>>><::87887777876567775466642>HD;?=1+6F?3.,-,/7==95352/./0./0-,-,,,,+*++,...-.0/-,,-//./36/)),.,+,-0065252,;aC592/05871.++*3999;5*.74/015?A?<81//4<=;8754-/1.)(/CWK4,+26641.((/5532032,)+,..,,/8@8-4;1*((''''&*47-'.60,-.,+).4.8:2<3.)!,E=-3+%&&&&&(,9CIG7)(+**-.+)'(,5979:758:86:;5,),0112015;:5/:6--,+++,.5;84331000111122/---++.;E329<60/,)*03569<<531/7=HO@665CI?675696..8;.#%(&+201599:?HOMGFHJOU^cd[L6;MQTVSMSA37779:7Cm|~sOObU946.%'+(&&%%'))05/-MjQ6=A3(ccddddddedbb`^\\\]__`acddefgjrvrkhkptsqw~}}||xpljgdbaa`aaabbdefjnppqqqqqqppoopomnmlmnoonmlpuvvwy{}~}xtssrrsttuuutttssrrrrrrsttstvvutroljigfhhjllorqrpjffcbgpz}{{||{|~uhhje_YY[[[[[[[[ZYYXXYZYYZZZ[\]^]\VRTUUUUV^bfccfgoylXUYYYZ[[]^__][YYYZ[[[\\^eioumiy}o`[_`_`aaacluoawkoojhjjkszxqkionl~g\guxxxusv~zw|}vuvwxz||zzyyyxssqWY`gy}|k[\_`aaa`aaaaaaa`^^______adsyyzm`_cmjejmjpttjo|xvvwx{~t˾w}riϧ|l[_]\ckhemvVNLMSWYYZZX\jsqk`YZ]`efdbecUNXcaUTXXY\]\ZY[XTW_`VZdg~FMSKEQQNNNPPHIPPUYXXXWWVVUVRWbZRUSPKEFJKLJHGFBCGFHLMLLJIIIIIIHHLLKJIGFHLSTRRQMKKLLLKKKKJJIIGEUb^USPQXgngrUHNLMLHFECCCBBBCBABDFEGHGFEDFHKKHB?@@AAAAAABACCCDFJNKHOTOMLMNLKKIGHIJJJILhjZUSSSRRRTTRMHFFGHGGGFEEFFEEEEDDDEFGGHLRZ_^YUKFHHHHHIIIHGGEDN\hg^SHFKSKINPQRTTQNMMMMNRSSHDEEDEFHJIKKIQQGIJGGGDLNHFGHGGk˽Υ^VXUWX[UX_M?GǾrbflsuvtQEHHGFCBGKfsc`ZWnjPOT^S=>DJLMMMONNONLMKIIEC@BJRRPOKOPOXixlNHKGECB@?@BA><<<==<9::;;::9:::;;:988888877877779999>E?876776799999:::=BHMQPOKIKKMIO_jpn]TRSRQRTUYXW`^LEIA;67777676878<;6:8765679997469:<<;;;<==>@@@@?;89GOHC?=>>=<??@B@?<;99::64;>>=;9999::::::99:<<;;:864444455446667665588889:::;;:::;::::821346:<>>>??A@A@AGKGA@ABDFEDDCA<;:9:<;=>=;:<>>=9568:>@@BCDEGGGGGILF<<@B@<=>@@BDEEEFFEFHIJJJJKJJIGGFFEB@BCBEC<88:96652/-,-07<<86>K;:89<>B@=<<<;8887898888886521368876442:FD?;-0.06;B5')*09<;95244310/00/--...//-+)*,..///01.+*-0.,+--+)()-245412>9352*;^E7;63/.,*)(+--27886/'*5743108C?=:6426>BA>=;971+)',;TY8&&)/13310/.046661//+)*-//.+).43-162+)))(&)(',.+'-201;1+,('0520/-,)'*2:9B\J0-6854;@=?614D>>L751((+)(((*.B[]M.(++*)*+*)%(3987888<<;98531/02..1.18;851;5,-,./0.+.331000/-0:<5-*))(('%$'3E?BBBAA;5///,*-3=GG;4682/31)/>BEF9575434-'=M=5786AFA629=3,4;4+042')-0564469?GILKHINM\n^HLJ<;KZ^XSR>22558<;AWqcPY\L676*'+-)''''''-44-9dmJ870'$cbcddddeecba`^]\[]^_abbcdehhkolifgjimu{|~{xvusrnkifdcb`abaccdfhloppqqrrqqqonoooopoonnpprttw|}|~{wvtsqqstuutttssssrrrrrrtttuvvvwvsniihggghijihhikhb]]``er}}|}}|~znkkibZYYYYYYYYZZ[[Z[\]\[[[[[]^_a`\YWUVXWVW]ec_`hvyfVWZYZ[\]^``_^][Y[^\[]^\^bfefy}x}zmf`^__aabq|wzzqljjlnorvphhno|qobYckorxzuuwy{vuwwunlw}~xd^fmT^hlcqokvwfWZ^_````aaaaaaaa`^^^___^`ceen{ueadmmhnplqonhs|zyxvuuv{nqgsȻŨpmb`^Z^gcctzhSQSQUXY[ZYZWX`jqqh_^__bb_^`_[ZZ[QR]_^[^_]\[ZSQZXOJUncXCQUVTTQNNMQEAafOR]ZWXYYWVXVS]eYRVRLHEHMMLLKHFHGFILMMJHHHIIIIIHGHJJJHGGGIKNQRQNKKLLKKKKKKJJJLDGVZXWWUU]c^pkQROKE><<<=?@BDDB@@BDFIIHHHGGGIIGA>>=>?ABBCCCCEEDEJMHBIQOOOOOKIIIHIJIJJIITk}jXSTSRRRRTTOIGGFGGGFFEEEEEDCCCCCBDEEEGMTWUPLGGHHIIGHHHIHFFDCK\hiaSGEPPGGORTVXURMKJIKMRTYQECIEDEFGHIJHOSJMLJHFEGIHGFFEn˵Ͱd[_UUYW[PV]CED8uĬ]SX\]\Z_WFEHFCABGL=Ku}d\YP\ykLJ\XB=CGIIJLMMLLKLLKIJE?DP\ckptxyf[cnw~\EIKFDCB@??A@><<===;:9:::99999:;;:988:98889879:<>>?CFD<;:98667999;<;;@EJLLNOMKLLGJ@@RajrlWVTSRRTV[YXeYFB@=868877677788:;@<:87567989768:;<<<<;<==?AB@:88:;CKGCA??>==:B^ppkhdcbbfggeYD:>BBBBABA><<;9;;867;>=<:::::::::::;<===;:8666655544567767876666678899:99::::::86;?D?27=>>@BAABABIME>?BDFGGFDB?;9:8:=<;<;:;====:678:<<=?ADFFGGGGGFA====<::;85549A@=>@ACDDEDEEDFGIKLKIGGGEEFFEECADDAC?74569>A@@ACDC@?ENTTF888677998887777775333469;;899:>><=>=<;;;963455565579:;;:89?FKJ>8>Na[ECQQLNMG>8764.--./49;;88B=99=?=>;89::867879:87799841/-179:7432119EB<1/29/3>@3)*.4786.*/598--1//0110010-+*)+,.0440.,))+-,+*++**)(*3<;5.5<531/):ZE;@:72/+*++,-09873-)''.6928TP;>=;:7319FJHJH=3-(%*2EZJ*$*.46653232456773//0/10//0120.131-,+*+,/*)**()+(*-++10,-//02431-+**,29D_j@,;=434357;4*LkL4TU10-+-.,++(%4Xo_0(-,,))***&&,45326;=<<;7543210,-/.089776:7....021-*)*+-.0/0;IH<0*()((()*&1D<79>>?90,*().27>EC9642-,220;HKI@/,20....+;<==?ABCCCA?ABDHJIHHGGFFIIHEC@?=<>?@ABCCEFDEILKIJMNMLKKKIIIIHHIIIJL[o|{gWRTTSTTTSTNGEFEEFFEDDDDDCCBCCBCCCCBDIRXPFCFHIHGHHGGFEEDBCBFO[hmgSDHONGCLSUW[YSKHIILPUVXWKAFGDEFFFGGEKPJIJGEDEGGGGGFIϹmccZTUWTTETYBIOE3tĮf]`^[\\PDDGHHGGFHJAIrjYTRRezaKPWJ>@EGGILMNNMLKJKJJIHTejmxi^fl~nFAIKGDCB@?=?@==<<<<::::99999888:::999:;:::;=>CDDDEFDA<9866666899:>CDEIKKHHLMLOMB<<<;9988976667898;:;=<;7588888788:;<=<<<<<=?AA>769<=>CDBAAA?=>;7BiomifebchjgjcE9@CA>=<<=;:<;9:;;:79<<<<;;:9::::::<<<;<:88888877667777778887566677778889::::99;AHMTL54:;=?AACCCDJKC<>DEEFDA?=<9998:><:;;;<<===;988:;;=>@CCDDFFECB?;876676665559AB<<@BDEDCDDCDEGILLJIGEEEFFFEEDCFEBC?7445788:<>?AA>:@KSM9477679998888787765333358;<<::;>ABCCA@@>><84466786579:<<<;::@HLI?>N`ZHDQQLMNLC98860,,,.279;<98::5100013321/9=7(&()''/507oY<=<;:637@KMKE4)(()/4AS<-/249963334883---.--0440.//131.--/-+*+**--*))(+11,))0564434764342./655?Zr`76@;42/,*&(2.^eV>Af;%*)*.--,*(0Fmq7(,++**+**)*.11//29:9;;741/-.0/..0036778:7010/0231+&%(*,.2;CDB>8.-./0133-2C9/3742.**,*.689=?62430.-.0A;51,-49:ALLJFAJSPJ;06;/$+VvkQLXH'$,036;:6PrwlJ1470*.220-*'%')%&,-%@mR'')%'(bbcefhkmpsrnic^\\]_``bdfhhiiiijjjkoolnw}{uty}}{yvtssqmljhfedefddddefhmqstqpqponnooquy~|xropqqqqsw{|yvtqpqruvvututrrpprrrrrtuuwxxyzzzxqidegefhiijhhkloh_^jy{~~}}}|~|utqf_\XWZ\ZZ[\ZZ[[[[[[[[[[[[[^_`a^ZXXXVN]kb\fmu|rYRZ[YYYZ]^^_`aba``]]^]\]\_elvwy~}|~whaadjx}}}zy}~~ojklpqmnrmkjfgfehfirw{w{vpuvvspoqtyrdgnwnڎwzz~yxxqyljqlv_db``abbbcdbbca``___aaabeea]_`cffdbgnikmokjo{xvxxxyyz|~zldq¤}z_chhifejugRQS[f`Z]]]\YX\`ZW_hrkYX[YY\YSOWr[_ZYUX]XTVXTTURLJIYpXEQRSUSONMMDM|`QTWWXYZXXWPJJMPSVYXYQMWUOMKKLNJHJLLIFFFFGGHHHGGGGGGFDEFGJLMMPRSPLLJJKKKKKMKIFEGJNNMNNLJP`SHEB==?ACCDEEC@@AAAADGIJJIHIIKMMNNMMLHDA?@ACBCDEEFHLMLKIHGHIJJJIIIHGGHIJMevcVSTVUVVVUTNGEEEEEEECBCCDCBBCCBBCCCACMYYLCEHIIHGFFFFEDBABBBITYhriRCJMJGDHKQW\ZSHCJNORTVXXSHEFDFFFFGGEINGDEDBACGGGGIFEo¾rSjdXTTVSKEZ\DDNO=FƶhhruzmLAGIJLLJIKNEJqeQPWS_p^MOI??CGHILLNNNMKKHDL[ekptv~w_^l|X>@HGFDCA@>?>====;<<;;:99998:::::<<;;;<====>ABFIGEC@<:7666656668:?DIIIKJIEFMMMQF:78=<@Wgw|k[XY\]]^eaXA@@:878889765678999;=:<;9688888788:;====<<<<=><<99<>>;?AAAAA?===6:\qmjigeegiio`B@D?;7678999;<:;<==;<<=<<::9999::9;<<;:::99:;::99888877778887677677788999999999:@HMRM;499:=?BEEEGKI@<@CFFE>999989:9:==;:;;;<===;:989:;99;<=?ACCA?><6345455666669?>:BDECBBA?@<64457897579;;;;==;9L^[KGRPKKLKE<8971,,,-27;<;;;<<1;RZ[VE7,6<:;:5+*3>ASfbH7;910/-*'(&-9P[r?-\O!(-/1/.../96MsO,++***(*+-/11.,-/46569730-+0431022357;=<726500133-(')*+-8DA5364+-279:;:/.>9.36543101-+13474,,....,+1>CPZI1)++-.*)*)*,-/*/=>69@?8462++('&'C^Y?6OW3$(-57==2MtnX:083.*0820.(('()%+31)GkG#)*'*+ccegjnqsuwwusme_\_aabdfhihjkkllllmokkv~~}}zuuy{|{xvttsqnllihhgggggeefghlrutqooonnmnprv|yqnnpstrqrw~}zwtqopruwvvvtssqppqrrrstuvwwyz{|}}yqjgffeffhiklorsuqfes}{{}~~~~wrme[UZ^ZY]\ZZZZ[[ZZZZ[\]\Z[]_ab`[ZZWOQbh\UgwxvkZV[YWX\`_]\[]___^]^^^^^^__aju{zz}rjfds|z{~wmmpplmmkhghhijhehns{zxzkuzsquogkrtqszugdjdcbgm~vu{{|wupbϐcbejxrf™^ob^^`bdihdbbb_``_`abccdcb_]^`cfifaacfilkjhozwty{||}z]s{qϸ~qoccdbcb_el]Waadha^^]^]XY^b^YYZbneVX\RIP`߬`ZaZVSUZ\ZYXSTVRPMMSLLRQSTTSNMKEFutZMOQUYYWYYPD@BFHNTV]VPYTGHLKPTLDGKKIGFFFFFGHHFFFFFFFFFFFLSRPQSPOPMLKKKKKKLLIGFEEGIJJKIJIHIIGFFEFFFGGGECBBCB??ADILLLMOOOOMNNPSVURNLKLKIGFGHIKLMKKIHGHIJJKJIHIIHHIJKfp_VUVVVVWVVULFGGEFEEECCCCCCBBABBBBABADPYSHFIIHHHFFFEEDCBAAAAGTT_phQEJJHFFFEJS[[THDKONOPTYZ[WLDCDFEFHHFLOEHOQOICEGGHHHCPɆIdl^XUSSOGF[YDGHGJCffeot}|_EEIIJKKKJKK?Cjx[OWXQZ_VQIAADGHHJLNPPNMKHDSjrpt|e[bu_EBADEECB@????=====;<;;:8888:;;;;<>>>>>?@@@?>???CC@>>>=<;;<;:;;;FLLKA489:;<@DFGHJG>;>BFHF=6699:;:9:;<;::9;<;;;:88888754344689999:74356555566668==:<6789999:::98677665664344449>=:;>ABCBAAAA@:53445798768:;;<>=:78:;:3---.39<<<;;<=@<6;77788766675787558;<962/../.,,++6=:7((*4<96662/...-/16?HLJIHHGC@<1(*,+,042-,02/-,*((''(+13-+,-+++-AI?EJD<2++*+)7dY--+,,./01362,1;93.-.3.&*01,6FC:566898FB:*&).COjK@>:84-)**))'%(.?i_-!M_68DE;20015>4/PT3*---,)*,/132/,+,/00132-,27973333347:AFC?6:83112/*'*,+(,=C3&*0,+148@FH@/*997:8;=9332,')+++)((()**)*2:9MXE2.00/.,)()+.14,0=:/.459=>?EF<:LSSY^WOE62>835BG@0%%*:<.'Mh?%-,(**gghjmqsuxxxxxuogbabbdefijjjllmmnopprw{{||{yvvxz{zxwutsqnmmkihhhgghffgggjnqrpmlmmmmnorwz~~wplmoqoklqrquy||xuropqtwwvvtsrqppppprsqruy{{|||}}||xpifedeffggfgks|ypr{||}|}~giurgZUZ__]\ZZZ[[[ZZZYY[]_][]]^ab`^^[VORbeSYsumrn\Z[YY]__]\ZYZ\]\^^^_^^^]\[_mvsu|vfn~yz}|wrrqmlgjklkkjmlhhmqz}~xmoyo`grpptnfiprmkiiiijqf]eqŦ}}}uVTR^dfjutu{Wa`abdeghhdbbbaaaaa`acfe````aaaejiaZ[aehgfgnzyu{{||~{tnr|̴|{cmsg_[ZYTemS`tlkjlka^`][[`b`__^Z_cWUZZl`TbYXURSX][VSSTUVSPOLOPORTTSRPNLKh~eKFMQTVVVVSIAABDGHINQLFB?EKINYREFHJIIGGGFFEFFFGHGFFGIJIFIQSSRRKNSQQONKJKKKKKHFECBACGLLJGJMNOOONLJIHHGFFFEEDA@CGLMNOONLLLIHFHKPSUUVWWUQOMMMLNNMLLKJIJKLLKJJIIIIIKJKgxh[VVVVVXYWWSJEFGFFEEEEEECCBBBABBBA@ABENSJCFHHHHHEFEDDCBBBAAADRRSedQMOMIFDEEGP]aWJGKMKKNTY\afYICDEEFHHHJOMRWXXTGEGFHHGFFK˪RGjiZTWRPMGH\WDGGELGF|lZX\ajeNFIIIKLKJHLJ9AjpVOWSDJYZJDCFGGHHKOQQOMKHJYhhisq^_i\DBCBBCDCB@>???==>===;;:99888:;;;;=>>AAA@@@@?><::<<;:6556AILOOMKLLHFJRRPQP@6868=DC1Qpi]bfcfqsHFA:7865677667789<;9==6EC><:87567899;<=>===<;;<:9:<<=>?>@?>??>>=<;;:>cpplkkmnk[NA99;8889999999;<<;<;9:;;;;<;<<<;;:98988889:::;;;;;:7;=;8898877888777778888898888:=::>@@BBA@BC?8544557:<9568:;=?=87875;@CT_XMNLIFDB?<;=<3-./.3:<<<;::;<867677788655558:976777630.-/0/-*&/==:3/30289::74553.-/137=CEHHGEBFI=-(+-.2321100,))('''&(*-0.----,,,,0BM@3-),11*%4[a5),,,../0123.8A<6--.4/'(-0.-07=;9;><64AND1(&)3:82-3>A<0145440,)),+,.,,,**+/-*++)(*+++,+**)(&&&%1OYNF@CBJcn0*(%;J?/)((*@cU8766740-+))*&&&(C[I:#8gRLh[;11027<4)/>5*,-//.-/013552,,*++--*')0>=4/24337<@BMNLDA;5200.**/-'&3?4%*/17LQBCGLMC4058;>988520-)'*0.*(()('%&'*231?C=6331/,)()(+,2656;1*4AEHFCABHFHTSFHTY]TABFFG@@AA@ELE:875793,-/..0700C9*&+>JLC4;H;3365541,658JZV3"(2>9)$RbRDCFGHHHIMQQNMJHVksouhcleB?A?@ACCBB@>>??=>>===<;;:9:::::;;<=>>@@@@@@?A@=;999;9=>BEPOB>=<<<;:::9:;<>?>>?>>??=<<;;<;9RpsnllsubD<;9889988888789:;;;;;;;;:;;<;;<<;::988888889::;;;;:87:;<;:99977777777778888889:989BFJKC=<<>BHGA;9:<<;:87779:::9998998887543222213455557899979:997778;<:=EGEIHGEEFHHHHKJHGFFDA@BBCDDDDCCCCB@?=<>>@BA@B@?=86778889:9::;;98777656643444436;>::=@ABBCBAB?8666569;<:6689;>>=87764799DPVVPKIFB@=;;==6/...3:>;<<;::657577778876556755410///-,,,/0/-))5B>:5::6206>>:653/12.-/049?HNJCACGC7+*.478410/-,))**)'&())+,---,,,*$.?8++-+14..-1Pf@'+*++,-//-02CJ8-,+*+**0//1005=DCA@:/*5@91)(*03-)+3AD:,/23360*)/21.+&&*)')--))*+.--.-..+++(&%-:AWaVLCGSKO^'#+,*3;2(-*'&>`<368::30341.1:D72@:7OB'WbGpj1,,.0990--0/)*+-/-03333564,*(()++)('(29602556=CBBNWVRPE71//0//1.(+64(4KOMZeT?<79>>>==97987621/+('+031//01.*'%(,-2787640.+*(()))(/:;;=1&.EVN85<@HPSMC89;CUXJLNOQO@:@BDNK>88:<>:74.-241*(1/*'-@LI<32115:;==:2$+KenmN'(454.*%'341200;Afhlnpqsvxxyyxvurnlkjjjkklmmmmnoopqtuuvwwwxxxwxxyyxvvtrqonljhhfeeedddcbbceghjjjjkklmnosx}~zsqsuwyyxvx}~}ytqoquxyzyvtsqomkjkpjbbnoemstywtrrqmidcddefgijmkmruxxx}pnw}~kc|}xnZX]^`^[ZYXXXXZ[YYXX[[ZZ[[\^_abc\OTgdVcsgeyh\a_ZXZ\\\\\\[\]_`___^aa]\]_ekjp{{zxuvyzpflxu|vvyxwyzsokjighkmnliijkkjhfgikmheffhmmkjijkhedeghgfx}~{qbksbidop_[`cdedcbaabcbbbba^Y\b`Z_`__]ZY__\[^_dhhfem}}|~wnѻ~pgvk]_deqpctukklb^cki`_^\[Z[[[[[YYK`JWYXZZXWUTVTTSQUXWWZVQRPPRTUTQNPXgxzma\__\]`^UOMQWWMHLOOMMJECIKE@GYWKGHHIIIGGGGGGFEGIIIIIHFIKMLGIJKLPOLOPPNLKKKJKKLIILMOONNNMMMMIGEFGFFFFFGFFHKNMNOQQOMMMKIGGGHIIJLMMMLLLLMNOQQONONMLLLLLLLNMMMJIHIJLMNHU~}rcXUVUVWWVVTMEEHIIHGGFDDDCCBBBCCBAAABCDFFDEEEEEFFEEEEDBBBBBACJMOPPSaXNOLFDFGHGVe[IKW]`\UOY\_aibMEFHHHFEEFGRVVSDONHFFFEEDB͑HCHTc]UVVOJGN]REJIGGGG@XuOJPPPOQRMJHIIJLLKIGGHFAUocSSJ>AXdRDEGHHGJLLMLLJHb~sgmzR>A??>@BA@@?>>?>>>>===<;;:;:::;;;<<<<==>>??>>AAA<:::;<8F:6@KMLJKLMKJJIGHHHNQPOOL>946=H?7666MdkigfhjRE76797576666679899;977508??877867::;;;<<<<<;:88999<>???>>>>>><<=<;;;5@nuqkkvtP7899879876666679::;;<==<;;;<<<<<<<::9:;;:9999:::;::99899;;;:99877777887788888:::999;?A;57::::<<>>>CMKB==>>BHHC=;;<==<:988888989899888864443222345555579::9::::97766;=;AB?CIHFDDGIHGHGFHGFDA@AAACCCCCCDEDB?<;<<>@AABDAAB=9;98:88779;<;987775554443344328=<;=AACDECBA>966656:<<:6689;<=;8766788655=RUOKHD@=;:;>>5.,.3:>=><::85565666788777662.,+)(*+**)),/0/,*19=G?9;65303:<861--10-/3445:@BDGGDBB=4,-4:;7,(-11.,,,)'()))*++**+,.,,53((/0-20,04/BcL**+)()-/-)*6JH1,0*))(-<7,///3E@92/1:B;9IPA21.&7T3CEC@JXWWZM8//.24430/222DaqnhfU;00/0472,.121-.2111.-+%$/41249=7.+))08888885311/.-*''-44697/,A[R87ACHNNC6373.?ROIA70:;7=BINE87:;<>@?8..22,)&.,((+3?A3+047:<>@>4(+Myrg?(890*),-/124754=Egimoprsuvxywwwvsqpnllmmllmnoooqqqqsuuuuvvvwwwxxxywwvtqpomljhffffdbbcb``acehihggikklmnqw|~}yvx{{|~zvrqruxyz{xtrpnlihikie^]^^egfhfdbccbbaacceefffgghlpw|{~vmy~s`X\a_^\ZYYXWY\_^XVYZYZ\[\]]^`cd[NXke\dch{vb]c`[\\\\]]][[[\]Z^dcfg_]]]_cilnpqtqnlnml^uzw|ssxzyzy}tkiigfjnoqpllkjjjkkkjirxohijkigfhikjffgghfi}zcls|mjw^hdynjaf_dfcbaaccccb``^\]_^]`baa`_]]][[]`fkjgdqxrƠozaju}x~pY^hou~hcvxwxp]^fpj``_[YZ[[ZYYWWPYݢRU]Y[\\ZYXUUWWURSXXW\\USRQSUVUPLTdfaeebaed\TUWVWZ[SLMRWYTIFGFEEFFDEFD@JZQFFGHHHIHGFFGHIIHIIIKLLIIJKIHLNLJKKKMNNMLLKLLLLLLNRSTSRPNOOOOKHHGFFFFGGHIKMNOOOPONNMLKKJIIHHIIJKKKKLLKLMNOOOONNMNNNMMLMMNONMMJGGJLMOIHh~rcYVWUUVUTUQIEFHIJIIIGEFECCCBBDDBAAAABDDDEEEDDEFEEEEEDBBA@ADKRRNOQP^ZNJJFEGGHEIZ[OS]`bdb[ZZY\ehXLHKLLP_]LGRW\j\TYWNHGFJI;٩YFLEP\ZWUSIEER^KCHFEFILNOPNLMOMOW`d[RKGJJJJHGEEFHFCSf^TKC>HZTFFGGHJMOMKKLLGZqr|ogq~{CDCDA?@@@?>=>>==>=>===<;;:;:::;;:<=;;<<==>>=<>@@<;::9;6G7766?FKJIJIJIGEEGKPQQKF?<:2@G@34650B[wrlihgZB;88997665555679899954569FF=>769<759::;<=<<<;97788;>@@??>>>>==<;=<;<=>Baspjkve=7;9777766666668::;;;<>><;;;<<<<<<<<:::=<;;:999:::::99899:;::99887789997787779:::999::6228::;;;;==<@JKB=>>>BGIFA;:<===>>=:776788998788787765324445666679::9899:86666;>>B;7CIGECDHIIHC>DJIEBAAAABCDDBBCDDCC?<<<<>@BCCBBCE>7:<;:886779;;876754553444355216<<;952/4:>>><::8656666789856653-)('')*****)+.0/,-;95<9554565566541042+067765545;FKE@@?7..-/57.&+331.,+)''++*+,,*)*/452,*-03/,,+.44,4WZ4)+*)*+,+))3A=2580*+)-;:*-./2;IJ>3*'')*++*)),,+++,395,0368<;7310,'(..+/3-,4:1(2;:=A1)+,-,+-FL:-BXaZK8*+4:4*+//10))+%+4A0YP*7,%%,594,''**((4A>5277431-++++)()**)+1696642:EEEE?M]ZW[U;.-./1013569OirwsgWEA=>A:80'%&*95,*))*,-.185-.122;CB?5.28841379??<:71+()&'()/AF;8KbX>=EFJJJIA6515JRA2-'',.15>IG82556:>AB8.031+')/.*+*(,0,),6?A9')Txvi=:D3)')/8?>:9:859>fhmnnqtttvwwvvusqpnmmmmmmmnopqqqpqsttssuuuuuvwxwwwwvspomlkjhfffedcbbba`accfffghiklmmmqvz~|xwutuw|~}||~~~zvsrsuxyz{zxtpmkheeegfb]]`aa`^]]]]]___`bcdeeefhhhgfioru{qhrxywlb^\^__^\\ZXWYaa_aY[\Z^\\\\]^_ad_VbriZ\l{|l^]_^\[[\^]_]]ed][]bdeea^`_^^diiijmpmrwvrivxxrsrwz}{v|nefgfdioprsrqnlkmnnolis{qhhiigffgikiefiiien~yn؄}s|qt}z|Zge~p^_acdcbccbcccc`_a`^^_`_`_``acba^^^adfhjs{u~Ըqboq|wxyWNclu}wnabv~|vmkhgojcd`[[ZYZZYYWSVJsmN^YZ\]^][[ZUSSSSSY[W[^YTRQRTVTONT`b]ZYZ\`df]V\[SONMLMPQQPJGHEEFEDEDCDDJQKGGGHHHIHHGHIJMOMKJINQSSQNJIJKKJJIHJLLLMLLKKLLMMNPRPNMONOOOOOLHHGFHGGGILRRNNOOMLLKLLKJKJJIGGGHHHJKKKLLLLLLMMMLLMOQPNLLLMNNNMONKIJKLNKHUmxvqbXUVUTVUUUOGEHIIJKKJIHGFDDDCB@@AA@ABCDEDEFEDDCDEEEEDCBAA@@P\YUMOSQUVOKHFEFFGGELUVW]`accdZWXYagVMLNTXguoMGQW[ox[U\VNIGLNAYw=IHFLRWXQFBKGV^ECGFGJNKHHMQPSY]_fnoi`WLHJIGFGFFDDGB>Pb\MDCCGGEFEEGKNONKILLGUjqxggm]:CABA???>?=<====<;==<<::;;9;;:;;:;=;::;;<=>=<=>=<;:998>B5636?HLLKIJJIIHGKNPPOE=:8:@KA554533D_aspljj`E<5899876555557799:;62244>|bBF;HEKLF879;<=;:;:8878:=@A@??>=====;<=;=DILMToqhnnL6:;9767666667679:;;;:;>>=<;<<<<<<<<<<<<=<<<;::::::::::99::9:9999999:;;:876778:;=<:8764224799::::<>==EID>>>@CGIFA;:<<=>?BB<7767789877:9:;;843336657888999987777754665@DGLOLE?9;??96667768:7555555554444554349;;;?BEIKG=66555557:::989;:::::==98::9886/*1?IKKG@;:;:9:71039<<<;:98666898778754430,*()+,+++++*+.//,0:86002267997654328<3-6:751/0/04>DC?@?7/.,),000/...-+,*''-/,..-,+)/8:4/7951+'*0671-/M`>*,))+*)()*.246<;71+)-23,,-/05><788.)(',,*)),-)).04663413=>930//+'*.0/031/7=4&0NF:?4'&)+-.+61+(5IZ=,)*00*+*)+14754424AAFFB?;4//0,1KL>B>+&*)+2.-90Gj>&+)'/980++))+*(9US93797770+*-.,)*,,+-35/,,+-9DEGECWmi_^[@--+.+*-243;S_`gbTJLTOH?33004+)A@:>620++,-7J@00129@FH71;=7.)-68667;82-*++)&%+GTFAO_T>>CACFFD@745EO?*&'$*:A618>;31238<=BC91243,(+--46-&&()+/7?B>?@0!ߧUHNHHJPXUJFJKD\_BMSLOW[\_ZYX\bimlfc`^aaVJFGHHGFGFDDEACR_TFEEBABDDDEGLNMKIJNEWytciqi?>??????>>======<<;;<:;::;=<==<;::::;9899:;=<<<<;:9:876E=357@KONLKJJIIIILOMONF:867BO?=:97753Ed[dnmmlS969999776777777799:500135HqV9=?>;86533347999:::<><;@HD=>@@BFHEA<::;<<=BC=84467777679:;:71/0224568::::99986555445555=DB<5;DHDFGHLLE91@LHECBBAAABDDCCCCDEDA>=<<<;=?AEMSVUNCAA@:653567776556665555556566425:;;9983*)2874-B_I.-**,*((+.0258;<84-*+--,)*..-,)+D<5DE8?960)((),-5A3/GB-)+),22..*9kX*)+,-133210.-,*5RV92::9:93.--,*')...-+)%$-25;:5,*31(8U?/16;?H@2:???5,,./,04788604@;+"+MVC?JVN>BF==GF@=?CHQL7)*)&-HO73;:7745>B=>EG@9653,()(3C;.,/-+06>?;7<<-":er[F?9/('+3:CD=54569:bceimoomklnpqrrqqpppoopoqqqsrqrssrrrrrrtuuuuuuuvwxzxpjihgffffeeedbbbbabcdeeddeehijklmoqrsy~zumedhlihox~}zvttsssrooprrpkfccaabccb``a`a``_]^^_`abbcddfedefeeghkqpov|~wwz~|xsvldifgprlb]^_^]]]\]]WalgumZ]ZZZY[]^__`bbclmb]_er{n]Y[\\\]^a`c}vh`dcdcccdfhjijkptyvikgywysruutxohlkhghkpvvvxwurokfgjklb^gjhhhgghig^VZenid}|wk}gbghini^`abcdfecbbccccabace_^]\]]]]_]Yncbn~q~ïxwwmynuy~uskeqrha[XWVUUUVWW^fe_V_WYZ[]^\YVVUTQQSTV]^Z]\XSPRSRQPRVYZ^fe\VRQRSSZnhOJMNMNOONLQ^i\NLJOYZQJHHHHHGGHHIIHGGHIKLLLMLJLRVXWYXSPNMMLLMMMLLLLLLLLMNRRQOMKMNPONMMJHGGGHHFJTZTLKKLKKKKLLLKKKKJJIIHHIHHIIIJJKKIIHGGGGEEGJKKKJIJJJJKLNNMLLMLLMKKXtucUSUUUURNLLJIIIKKKLLMLKIHGGFGHHJJJIHHHHHGFFEDDDDEEDDCCC>GY`YQLJMSTSNMLHFFFFGGEKVVVZ]\\[VUWW\dZNKRZ^gJIRY__vzYWWTLHFIH=~@VSLKKRWQGQfbT`bRQSPV^fqj`bfihc^[Z]a]UMFEGGGGGEEDEDCR^NADB@BCCDCFMNMKIJNFPtocm|<@????>>?>>=====<<<;;:999:<@@?=<;;:9;;;9:<<:;;;;::988788F:16CMMKNLKJJIHIINPLNI>499BK@:=>:9975A^VYhosmE97:9667777777777877.-/024783059/7>VVC:<<<<;::878::;=>????===<::=>=;;<<;=<===<<;;;::;;;;:;;;;99889:;<=>==<987689=@??=865433479988::<<<<@DA=>?>AGIFA<;:::;=??=;88776776677642233235669;;;:99987643455556>DA=8;CEEGIJKH>8=FIFBBAAAAACDDDCCCEEDA=<<<<;=??=;?K`eVEAA=>>:7656666666645555565665357::/--+***4741//,)&&&(,0,-364.)+.5BLH=32.2CIC<:8-7WJ3531-*(*,/4>A<7860,**))*)*+*+*('.:<6>D8//+)*/0---+-.03.017:663.+,38868963//3A('*')++/)!+58::1,)'/7;77989?JE8*,GQA@BAA=@DAFLIIJMPNFC@721.(090589;><@GFBDGGC>:970*)3JK61421249:70-264)6dsZI;7;6.,.29GD5-26976bbdgknnkhhjmoppqqpqpopprrsstsrsttsstsrruvvuutsttuwyyrjgefeddddcdcbccbbcdddedeeffhiklklkjmquvusrpjffecdiqx}{yvsommlhdcglljeabbbbbccabba`______`accccccddefhhju|{z}~~|~uoprqqsla[Z\\^^^]_[Zbi}fb[YZZ[]a_``afbcjiecdiyzpe\Z]^^^_`eswqaedeeeehiijjjknqv~wrpklf]tx{wrrrrz~kqqmihipwxwxxyy{vqkknkhiihhhhhig^WWgmicfs̀u~oeijgc}ekpa]_acdedbabccccbaab`^^^__]]^]^_eit~xvyx{|xt{vlqggjsuf\ZWVUUVWVVWWah̀RYYSWZ[\[ZXVTTTTSQRUXZZ]]ZWRRRRQPRUY`ff_WUTQPRSN^]PRNPRTTRNLMU_ZQKHKUYSMJHHHHGGGHIJJHGHHIHGIOPMMOQTVXYWTRPPNNPQONMLLLLLLNPTRRPONMNRQOMLJGHGGHGGQWSKJJIIIJKKMMMLLLLKJJHIHJJIIIIJJJIHHGHHGEDDFJKLJJIIIIHJIHJLMMMMLMMKPkvdVTVWWVNIJJJKJKKKKLMMMMNORTTOMLLMLLJIIIIHGEEEDDEEECCBB?@O[[UNIDGRQOPOMHFFFFGIGMTOSZ]]\YSTWW][QELTZbrĐFJTY`fwz\WXVSHBDC@ܸX>>>>>==<=<<<;;::99<@EDA?>==;;<==<<==<::::::9876:;F84????>??>==>==<<<;;;<<;;<<<<=<<;;;;;;;;:::::89989:;=???><98889;>@??=9876434688778;;;===>?>===@FJF><;;:;;;<>>>>><:9;:;=:538;=@<77<:9<<:::99987435554556?D><9;AEGIKKF>>>;77;J]eXGD>AKNC8666766665555555545556459<>CFGD=545556666799789;>?;B^eSKC<;<98960,,)*4=CIC;;;:9983169::;:777788798789830/-,+,-----..--..../012/,-3;<:6675421,+266544440---,+*4>?/())*+(,03464/052+)-0,(2890**'0DC512207FF?434-1JJAG?8/**,-,.=F;/11-***))+..,*****)132:A812-*)14/+()++*++,,8=9<91-.2678::1,,25013:?6-182'(3A71,/1L>*)*')-,3/*/58=<8131+2;80++*)***13+)0,//0.-040,,'?iI++02/-230-,++,/6:1.157<=9310221+'*,,)&%*8BDDGMOGIaplbgoR..22121012-,=NQSOKIGFP\_fkbZVSN?314@MKD<2*(AK5*0:D:8JG9212/-)'.8<;207>@@LQM;;CB@:7<>=DTWC46?BCDDEGIIJJC601GbN346544476/*'(4<3Px[LFAADD>4221:G@2,17<6/bbdgkmmjghkmnooppprqqqqssttutssuutuutrsuwwutssrrssrqrrkedcccbccccbcccccbcdceefffgilmlkjklmmmllkjhgedddjry~~}zvrmihhgb^_bddcaabbbcccdcdcba``_^^`bcccccddddeir{yz~xsutsqpmd[Z[\]^]^`_`dsvjb`]YZ[^hebbaif]aiifdkpswzk[[___^_iu]lweeeggefiiiklmmopqrwuuyzvjZk}u|ywplo|kssqmjkpvxvwyz{z|ngjkhghhhhhijkf]W\mmmidgrtuiposzrovh[^bcceccaacccbaaa`_^^`b___^^]^VZ\crqqpsss}z}x~}|ͽfxpjopvwg[ZYXWWYYXWUUVQ֡cZ\e_TZ\[[[YVUTUVURRSSUY\`a[USRQQNQT]ig]XZVRPRSTY]WWWSTUVVRMKMSYZRJGIQWSOJIHHGGFGHIJJJHGIIIIILOPONORUVWWTSRQQPPQQNLLLLLLMOQPPRPONNOROMLKJHHHGGGLTUPLJJIJKKLLLLLLLLKJKIIJIIJIIIJJKJIJJJKJHGFFHHIIKJIIIIHHGFHLMLLMLMNLMcyfWTVVXTLJJJKKKKKKKLLMORVZ[XSNKKIHIIIIHIIHFEEEEEEEDCCBA@U^TRQJFBCMQNNPNIFFFFGGRPLMSX^`]XSTVW[VLEKSZbqqDKTY`hvQWWUSGBCCC=FHLRNPVSRLKaohp]JOnKPOMOUZ`efeefjli^MDEHIIGGGGEAK`NBDEEEFEDOOJJJKKKGDGU^mcz?@CBA?>>>>>>>=<<<;;;;9;:;;>DFEA@?==>======<=<;::99988969=B9;DOMIJIJJGIHIJKLLJ=;45BO?8:;;;;:;:95KWHQjvi8.7;:2/479877879999:80+,.11005662/36JR=<<<;::9877:<<<<=>??@@A@BGNVSMMJE=:@MmzJ3;:776667778777888:<<==>>====<<<<;;;<<;;<<<<=<<;;;;;;;;::99999989:;=??>><:9999;>???<:887645677658<;;::;=>>>???CGC<;<;:;;:;=??===>@@CHD>36@AB@=:>D@EHJLG<:@ACHGCA@@AAAABDDCBACECCC@=>>=>>=>>>=94@YgSE=:FTOA976886555566554445477457:=BDC=65654555666777658=>:BTTNLGBA=87971-+,--/5>C;;;;;;:318=<<<=766666678767730/-,,,--..-//...////0231-/5<;84357796./798999:94/.--+*1>C@2+*+-.,-57972:F@/(-0,,14640-)0:1%(.016<;2.-/,/CLFE:1.)(--)(4=3(*///-011131/.,+*,21);kj;01-*)13.+)*)(('()/=:8?7+.87507>8.),27229>;44:@:0+2CIA9./@9*+,.37611489;=8222,,3:6.+++*+*+24-)'/1120-040*2:.[d0+21-))*)((()))+/-+,049=;6326?@5,+,-+('.;CEGIMMEHjyihkJ-122/..0223;FIKC87@BALTTVVVWUTTK2*8P^SGC5)*1FE.*065CNA0,+,--,+,.>LD747C1UrhN><>?:;=>>G^^C/-1;@==:/+1:K\E,,6BJOK>52118?<0-16:6.bbdgjlligikkmnoopqrssrqrtttutstuuuuutssuyywsrqqqqnkfjsndaaccbbbcccccccbbbcdeefffgilnnllmonmlkkihgfccddirwy|~~}|zwtqlhffec`^^^_`aabbbbbbbbbb``_^^_`aaaaabcddddjttjgnyz~tfovmlrsi_[Z[]^^``_`dieaafga]`igcqyeW`eeeeffs~i]]__`_hlowmgfimhfgikmpuvqmqtqqswwpf^lsw}}nfjwtkrutsqnpvxwwxz{wkig`eniafihhijknmh]Y]rmsjbݟjfw¶^ext_gzh_ddcbbbbbaa``_`aa_`_]^^_bb^z~rnopnkpotsxx}|{}ɼ}kurz|twte^]YYYZZ[ZXVWTDsTeldU\\ZYZYVUVUUUTRRTZY\e`TPPOOPS]gdZVZ[WUUWWUa`TUWVVWWWRMLNRY]TLIHMUUOJHHHGFFGHIJIKNLGHLLIJNQPOOQTUUUTSSSSQQQPNMNMLLLLPOEJQPOONONMLLKIHHIHGKWXQMMLLMNNMLKKKKJKKJJKJJKKJHHIIJJKKKKKMMNMNNKKJIIJKKIIHHHIHJKLLLLLMNLMayeWTUUVQLKKLLKKKKLMLMMQW[ZVQMKJIHCA@ABDFFEEEEEEEDDDBBB@KdcRLKGCAAFKKMRQKGGGHHUVKLSXY\c_YTTSVVQLKLQYcs_EKRX_ds\XWUREDJFEDAIFIMLPTRQRNJ}xiQQKONMR^ehihfecafmcMBEIIGGGGFEDLWBDDFGECMOJJIJKJIGGIEFmkcc?@A?==<==>==>><<===<;;;;=>=====<><;;:::8789:87=>9=GMLLJIHGEHHIKLLK=776?KA389::999:::4GTB@W~k647<80+.58876899988975-)+,-.147632329KH<;;;:99878:<<<<=>?@ABCDHMRSOKGCBBAAFctK:;8576677678777778:<=>=>>====<<<<;;;<<;;<<<<<;;;;;;::;9:89999999:;;<<==;:99999;>?@@=:98764666667:=<=<<==>==?>>AFA:;<;:;;:;=>>=;GIHB97>@@CGDAA@?AAAACCCCBACDCDCA??>>>>>>??>;;5>Z`J<68GQK<668875665566555555775557;AD?8456556554556645;:8::>GKNOJBA><9773-++,-/03;=<;;?@945;==<=?:7656776776430//-,,--./.-//..//0002365337;:731234651376579:;940/..,.4>CIA7301875666549@;/*,-*-012420/2/'%(-03441)((*)/?PE2,(*(''''',/0,-3767?FE7-/.---.0450?ij?./-,,01-.1.)(((()4=23=2',=@7.2=620/394<<:3.2462-+226@HI>5+)./8JQA,1<2065//263/,**)*,2;;1,,23353/040*6K/CmA,6573,(((''))'%%&'()+1;<7327CJA62....+5AEJLHJG>Gk}sunG/4310//224.,-,051,((**0>OSI:0./15410233361bchllllighijlnoprsssrqqrtttutuuvvuuttsrtvvurqpoppmiffiicabbcb`abccccccbbbcdddefefghjjjklnnnmkkihgecbcegjov|~~~|{zywtpkfeghf`\]^_a``b````````__^_aa_`a_`aaabeccjlebmz}{|~yz~iafhjnsumea`[Z[^^^^^aaaajri]bxpizzcZ^ef`]^s~p`Z^ddew~rwpigitwsponosxytkkqqnprlb_bm}u{}mfkxvklswvutqquyxvxzxti[VYgxvpnihijjlmpo_X`smq~jbsopxsenq]m|ullhdbabbbaa````a__^]_bedbcw{|zkfillkkls|twx~volhz~|wrdbbYY[[[]\YXYMWRSieV[XVXZXUVVVYYTSVZUT^aSMQPOQ]h`VVWWWXWWYWX_YTXXVVVVUQMMOS]^RMNIJSWQJHHHGEFGGIKHJRSLIJJGGLQRPOORTTTTTUUUTRPONMNNLLKJRPBCNPPPONKJKKJIIIJIGQ[UNLMMMNOONLKJJIIKJIJKJKMNJGHIIJLLKKKLMNOPRSRPNLKJKMJIHHIJJKKKKKLLMNLL`wcWTTUUQMLMMLKLLLLKLORUYVQNKJJJIHE?;;=ACBCDFEEDDDDDCBBBTebULHE@>>=@EKRSNGFGGGRLKSXZXZ_]ZUUPVMNNOPPXl`EKQX_bp}[WUSPNLJJqmEGJFIGHQTSRSUL\os~YLONMPZbdb``b_YW\bZKHIIIHFFFD@EOGDEHKEEQOIJIJJHHHHKI@ejd|I:B><<<;<=>==@?>>?@><==;==?@>>>===>><;:9::878897:?;9?GNLKJIIIGGIIIHJE9:7?E=6789::889:;:5FP?9F`V456:6.))-477679989:857710/01258754345DF=;::998879:==<<<>@BBDFIKLOMKGEDFIF@C\iMB;5376688678877778:=??=>>====<<=><=;;;;;;:;<<;;;;;;;;;:::99::::;<<<;:;;9989999;=>@@>;:886566778;==?BEECA@=;;;AGI@:CB98:99::88853444558:647;8AIHA88?A==CEA???>@AAABCCBABDDECB@=<<====>>@>>@96Dc\B75999;;CPNEBA@?A=4/-,,-01/3::>;79;<<<32..0010.,,,.0331/./0-,--,059651)(*/7.6UM(%*('(,**()/:=:;;=CMSJ5&*+,,-266647B?3//.///.,/882,'''*6=102-)+592/1446411415676411.)&*4/(07BHKB::98LfP*3?C>71,/68412340-**)*3:<=7/07759:2151*6G0.bT2EB:4/..-*0AOZb\E@OM3%'(*(,6AF?521.*)*.9?><<>?CC>AFGEEEDEECBACIUaaVLGD@>=:?AABCDCBABBBBBA><>?===<>BCBAA>?@>>>>==>><;::98766677>@:=CGLKJIIN\b[X[[WL:47AJ?689889:7889;;7FH::>=945776.*)(.46877899::9:<;97765687679517A<::8897899;==<<<>@BDFJIKJJIFEFHHHFBDMTG?:5256798677878888:=??======<<<=>>=<;;;;;::;;;;;;;;;;;;:::::::;;<<<;:998:;;;;;<=?>>>=<;9776788:<<=@DHHEDB>=:9;==<99;<;;;;;;<==<9::<>@@=57<:@CGHF<;@=;<;;;;<;;:64443331432469FLF=??>??=96OeS;78@MPA68876666566655556656555;FE<6545557768:<==@KSUL=657/<[[OLGBFLG8/,--.//-06:;<;;>><=ADB=966888652.//....00000000.012322241-3<<:850...--.0,*,0234334652/.10/)(*++,.011469740--/3:;4./;C930-*.03--JX4%,*'*00/,)1?FE>7:ESYN0$%)+-/1200../-,-,,++))**2:92*&&+6<21/*)**++,.-1730..--.3:80..,0322,,-0.4IQTR?6SZ7+5>731.07820112.)'('*7=:<913><69?943-+4:+&Rb8;SSD6.+)''),+)*+,+*(&(/663;DGD?854644HRRUM@>AA82484973>JC633232/*5M\`]NABGB4**)'((.:9004310-*,676766:9ADDCHNG4*+(6hvN4@E?=6/--,/53231;JOLA/.=C7/9D:)-771///7>;5587cccgmmkiffgiklmprsuusrqrrtwwwwric_blqsrokijlmllllkjhgeccbaaaa``abbccccccccdedeeeeefeefgggijkjihgfecaadis~}}||||||xsppnhdbcffedbaba_^_^]]]]^^^^__```aaaabbaabbcceggdcfmuztostsqkeeu|dWZaagptutsmd^YY]_`_^__`bbcikcchgdfkceuvz|rm}wo|we^eiabyminpnr}|uqmhgilnlijloqsx|zwvuu|vx|agkjryyxqmoqstsqpvth`]\^sjeihijlmmf[rlqqrlomilkeaca`Yfjmkvxoifccbaaa````_^ekuyrn~|yux{}|vkb[\[[[^fszyolikstjUmصztf}hZ`abdda\XWPu{T]hm^VZWWVTRTXYZZTQUXXXX_`UPQSRTVWYYZYYYWWV[`ZWWTRQQRTPMLMPRSSSRONNOMJIIIIIIIIKKLKHKTUOLKHKOPPQPRSSTVVUSUSPNLKKKKKLMNKJHILNPPNMKKLKKIIIHHTZPJLLKJJJHIJJJHHIIJJKLLJKLKKJJKKKKKJJJJLNNNNPPOOONNMKKKKKJIJLLLLLLLMNOJNfvcXUVVTONNNNNNMNNMS[_YSMKJJJJHHJJIGFFFFC?AFGDDDDEECBBDJOY]VNHEDC@>>AIQSOKIHGJR[\XVTTVWXWTTYYOSVW`ns{ͼZENOU]djrlVYVOE?EKNMMLHGHIILTXWXSVd]POb``KOMMMMOOOOQQPPQOLLPOLLKGEEEEDEEFFJLHDKIDHKKJHHIJGHOIApisTGGECDDGIKKHEDBCDED@>>@DA><;>BBB@?>>?>?>>=>>><::::9765579@=:CGFGGHFHUpvzsR=CM=4=98889:8889:;;BB9:<83689973.++025877899:<><<<<<<9789878<722;<;:6A86688:====>>@BDGKIIIGEFEFHHGEECA>87846569987667788889>A?=<;<<<;;:9;=<<:;;;;<;:::;;;;;;;;;:::::::;;;<;:999:;<<<<;;=>=====;9778889:;<<=<<:;<<;<<;;=>?><:;<;;99<88<;9>?BC?;<<<<;<==>>?<96665320211129FKD?DE?<=>A@???@@@@AAABCBBBCEC@?;58=<;==>?=>??@=49SZA467DTK97:76776566655556566556=EB95445467779<==BKPMJH?65;7E^WJLMHFJNH8-+---...14;NMB;=;;==<<@EEA;66888641///////001100000/0222358843554430/....//+-6:972.06884.,/?QRG@CHD?ADB>:2-+)*-01/.2;><841/2@JB6/2AF6/,,**)+)&9YE(++(),./-(-<507B?:99731))./*#?bE6UO5/-,*''*00,-/2210*''/77;BC>>?><959KTTSH6210../02352/-/4798;HMC648;<<94BYb]QDB@:64/-,+)'(-.+,01041./4434458;<:612-(.??-#)9FF84@H>.-3814?3266KKIIMRG0&-&.qZ/,=OJ4+,,*',;A3+Cht`@,(261-.0/))351/04>FDA>:7a`\]ekjhecegimoqstsrolmprsvuqmfba`chkmmmlkkkkjjkkjihfedcaaaa```abbbccccccdefeeeeeddeeefgghkkihggffghimw{|~}|||||||ytqpnjeabffedcbbb_]]]]\\]]]^^_```aaaaaaaaaabcffdccegkrx~tnmmg]Wg}bQX^^dnuwywrlc[\faZ\^^^``abfdeeb^`fbtzwuuxudkt{|g\fin|{{}ysngegjighikljlqrqx}}ywrttw~}u|fcjhrwxyuonmnnqrpvvh^___mypehjhjmoqgevdpmlkkmmnnkk}pqple^^nsphgecccbbaaa`_^_fjquqx}zxzze`cbbchoqvutviWXcbarxwpf»|_PvɮnzqY`cdhjf]WUTPRW\fht{XVYWVROOVZVZ\XYZYY\ej\QQRSUWXXYYXXZXUS\`XUVQNTX\[RNNOOPPQRRQRRMJJJKKJJJJJIJPRHFOUQPOMNPPPQPRSSTVVUSTROLKJKKKLLNNKHGGJNPONMMMMLKIIGGPWRKJKJIIIJJJIIHHHHGGILMNJGHMONMMLKKIHHIIKNQQPPPONNNNOQPOLKJIKLLLKLLMMNNLKZxvbWUVVTPNNNNNMNNOU^`[PJJJJJIIIIIJIHIJJFCBBCEDCCDEDBBCFFCQYTQLGKKEBABFNRPLFEFKX^\ZXUVWVWUSU_ZQY_`jryѬTDNOT\dkjsUXTOBBHNRQMJHHGGHJNQRVT\cRMPGV|znNOMNNNNMLOQQRRQSSOPOLJIGEDCDDEFGFGCBIKCEHHHHJIHGGGJKAFxbIFFEEEFIIIGGEDBBBCBCBBDFC@=;=@DAA?>==>?@>=>>><::::9767525=9@:9:967:<80/,+-24444567:<<><<<=>>;9:::9:;:548<;9;VJ6578:<=<A??=;;;;:9;<>=;;;::;;=<;;;<;;::::;::::9899::::98:;;<;<<<;;;===<<==;:8899:;:;=@B@?@BAABA@>><<;:;;==<<<==?@@=;;<;:78<86:308:>@?>??>===>>>??=<8887521221138CGB@BA@@??BA??@@@@@AAABBBBACDBB@708><<>=??==???=97?QG344:KN?7:98776666665444666668<@<764344457<>>=>DKJC>>=:;@AEJC;JTLEENXTC.)-.,,-..3?IG=>:99;=<=CFE@86997531/////00011110011111235:;:72/++.111////0007?=972/27;93.-0>KD719B82328ADFA946553-*/9>>:72/4>@==<<@:-****)),,%-NN.)*(''((('(6AAA=938OK1F>3*-02-+,--,)()))*))+,,,052/-(*24--,/4430/010,)*+-+*-24.397EP78D?EPNJRS>./2>NXVN>17@<4230/8800/-,)'**,7@=3/6=830,&()&&((+&.UU4?@.,,+*('+362/02246/(&*5;<@?8>KG>86AOTQNE@CB9:PbkunH1/,,++./00//.146679>EE?:538;;K_^NEED;774-***)(+33.--,2?JJHD@8555327>92458>?4.24249;@JI:2445897:?;779@DEA?>===>>><=>=<:9:99747?;998557:2,)(*/45422689<=<>><<<=<<;;:::;;;957;;5K\Z:679:;;;=BGFEEEFFFGDCBCEGIIIIHC;223578988976;=;:9868=>>@=98:<;?GGEA=;<:;===<;;;<;:;;;<<<;988888999:;;<<=<<<=<<;;;;;;;===;:::9;;<<>@B@@AA@@@@?>><;;<<<>>=<<<>?ADA<==<;8797:?>@BEFFFFDB@???>;;>>?>;;:753344336=CB?@@@??>?BB@@@@@@ABBBBCBABBBBB<0/:><=>>>>==>@@=<<:CI7157?JF88:8777666654335668878:;:875434448>A@=>ACA>===?BAA@?<CCAA@BC;327==9/)*/-/COD93,*)**+),..(&?T;%')'&&''&&2@=541,,49/.,+(,12-.792-+))*++*+-////0232-+--/DH=?A941.-++))+.-+++1BOG5>H''EQSfiPDTZE31+/;DU^XME@611018822332/+,,*.;>61485131*&&%(('*)'EZ9'*('(*++)*2752111231($)3>?@?>FNO:05BKIDA?=95215:DX`B+***,-02200.19;9999@D>89:9<>@=9;:;;5/1:GQJ85>ACGCDBDID:/,5=;8679;<=FUT@<8.+-(/Y\2$(--'*-(&))(.CN>7nM!(.($%'()())'(.589@INMA6/^]\[[^aa``adgijiihdbbefggfdb``bbbcegghijjjihhhiiiiihgfeccbbbba``ababcddeeeggfffeeeeeeeefghhijhgghkkjjijnv}vsx~}}||yqlgdcbbaaaaabbaaa_^^^]\]^____`a````aaa``````__accdefhr|~vtw|{zva^da[Zahnuz{zvu}cVYajmpljqpsquj_dfbaeknxoklkighgghfgjmmosx{{{xusvvpsxxhflt{{vrmhlomjiifhhcamzwmghjijkkgqrhknmnrttv}vvs˘rcccedbaaaabeefijlkgoz}|}{gfimqzq\[`fwSS_abixxs``]_fxputwxuw~ra`elnf^XW[^\ZZZ\]bw]f`XOJR\^^`^\^[X\^`aZSV]][[YYYXXWUMLY^WSQW`^\WRPORSSTTSRRQPQPNMMLLKKJJIIIHPUPLMOQQPQQRRRRQPNPUWVROMMNNLKKJKMNMKIIKMNONMKJIJJJIHJMOLJIIJIIHIJJJIKLKLLLQUVQJHKOPPPOOONMMLLJIJIKNOQRSSRPQQPOOPPOMMOSTNMMMLKMPONVim`VVVUTQPPPPQPNR[YRMKKKJJIJIIIIKKJFFJIAABBEFEEDCBCDEFGINTVUQNLKLRMDCFHLMKGCX[TVXWWVVVUUUVZaZVZ^]]eqLGLPW_efloWWTRPOONMMLIHHHGGHJJHJ[j]RSOKJGADPYWOPMOQPQPQTZ__\Z\_adbSGEFGHKNMIEDCBKLAABBEHIHFDFHFLWRBHRMOIEFEGHGEGFCDCCBDDFFEA@BCCA?@CC>>===<;:;;;<<:99:99567TqztiWGGQ^^QHFP_fnw|{uy|z|{uP774348<<86789;;98774354-.-/2344326;<====>><;;<<;;;;<:;;;:56:=7NTG;8999;;>BFJE=<>DFEEDCCCEGIIIIHC:/1356898787=GLIEC@<=@A?A>;;?CDHKGBBB>89=>=><;;<<::;;;<<<=:8888899::<>>>==<=?=<;;:;::;=>>=<;<<:;>??ABAAB@@@@@@@?=<=>>>=>><<=>>BFB=<=>=96:;?DFKMMLNNKEB@???>;;>?????=85455535::><;;?CBAA@@@@BBBBCCBBCACA:2.5?>>=<>@A>9<<:B>4589@G=588777665664445677777898898754458=A@?>=====?ACEDDD@>G[f\GBN\`TGA5.+.0/1224:AE9;;;;66>DFC;578630...///001233110122233341.--.--.0012553433670,-)*045861-571,(()+-..0126:<:<<6,++*()*,*-,,/33,-8=6-+((+,,+*),01.,,/231,0D[[F>>942+%(&&*+..++6HND5)+0)$-EZopS8:N]H*&'&-9ALZbZE/),1358;::93-..,+3<<68B?:BH?2)%,20,*&5RF+&(''*./.+.5643422391+.4:=>FEAEI5(1<=85200.+)*(&(6E>60-/02320-.0358:;;;?CFEEEC@:8766962033+),)%'5<=FOW__[XRE6275:CB5+'&',16;@B>86:AA4+8GHMLKVUPWV@/,-2789::;JLH@7/\\Z[\\^___acccbccbbaaa``_____`abcdfggghijihhhhiiiiiigfgeddddcaa``aabbbcceeghgeeefeeeeefghhhfedgnqjccdgiow{yutxzz}}|{xpifdba``____aa`a`__^^]]^^____aba````a`___``___`aaccdju|{|upy|jceaYZ[bmssy~y{}m\W\enrnmu}xvqllr~}b_fc`ddiu}vjijhggfgggjopos~zxuvx{yoxckvwvusnjmomkjfcdhgguvhjlijlkjhekmnnnnsvxzww~qecfecbbbabddefghkkidku~tv{}|geks{zzo\ZdgoVO[`cm}y|ufa[]Tkx|xvzqa`dnrk`XX_`\ZXXZXTa~`icXMPXXYXYZXYY\]\a^UUY\[ZYYXWVXWJKVQSXS]h`SRSQQSTTTTSRRRQQPOONNMLMKKJJLJIQYVONQRQQRRRRRQPNOTVSOMLMNMMMLLLLLLLLNPQOOMKIIIJJJJIIHIHGHIJJJJJIHHJLNORTTTSTMADOQPPPPPPOOONNLJHGIJLNRTUUSRQNMLLLLKMOSSONMMLKMPPMO^g`XUUSQQQRRSONWYXSONNMLLKKKJIIIIJIGFKGBBCDDEEEDCABDGJKPUWVUQNMKJQUMGEFIJKGAimUTWVVVVVUUTUZ_WSRSRR[noLILQY`ekw\XYVSQPPOMLJHGGGFGIIJECYbURTOGIPJHJ?S^JSOMOPPOPSX[[ZZ[]]]d\ICDFIJMOFCDCIRH@GEFNOMNKFFFHUTC>KnLKNIHGEGHFGGEDCCCBCDGFDB@ACB@?@B>;;;;<;989:::::77::54ABYuy\GESXQLIGLZemzyw|~|Y<779<=>;9<88876664011/-.15953345;>>>===<<;;;<<;;:<<::;;:54::::;9;::89=AFHHD?98=FHFEEEEEEGHHHHGC;1257799::99ESSPLJJGFGGDCFIKIIIFB>>AEC<:=??>=<<<<::;;;<<<=:887889:::>=A?====>=<;<<<;;;=>>>=<@BABBAABCBBB@?>?@A@>=<>@@???=<===?CFA<;=>=86@GIIIKKJLOOIC????>=?>@A@@??@=745433422=A>=<:869@DCAAA@AABBBBCCBCCCD;/-7?A=>@@@@@>=>@A?;;<::?95989B?438877656665555676666688::;;85468>>==?BEFGE@ES]\dhZGK][JCEC;1)*03205JQH;==;<;06EFF>67852/.////0002343110122233221-,---04776677654221,,120.-/22-*9<2+')*,-/02457:;7777BTTF>9;?>:6/(%-EH3)+-,-/.+((*+,,(*GT;./..5;6026;1,+***)*+,035563,.<@7/+((,---,().1/,**-0.2DRRQA87656:4/-,-.--19A<1,,34.+(')KwrOE9.@QA0.0395..?PXSJ9/.39?B==<3/..01468BND;HJ;0))2=;2,++EWC-,-,+0320.3655568;655542,*122499:=@DJOROG;0/...-06<>>:645=HI=4484,&.ELIJY[KDPR?0./48879>BBHVR7*25//20054-*((03*&11&&+'%@WYfmZJ9--,*+--*)&'))('+>KIA950Z[ZYZ[\]]^`a`_``aaba`_]\[[]___acddfggghiiihhhiijjijiihhfefecbbb`_aabbabbdeddeeeeffffeefeedeglqw~~rdemomorqoquuuy~}}{xwyytmidba_________`______`_^^``__````````__^^_]^_```acjoqsuz{nmqv~nhhgcZW^eegryyxwrjacglllkib\Ybkrtsnjsogppn{hgiiifghgipwrp}~{zxuwswtvtrrqpmnqrqoicbgrzwgjlijkklnjowspollljgxyndabcbbbbbccccfkorqmrtsjn{~{vgcgt}qke_bgp[UZ_ctwr|~lkbZ[cZh|yxtokc^]cpwqbXY^`[YWVXXQRn˲pgn^NPYYXUVYZUSZYW]_ZVWYZYYXWXVWWOPSJMW]igYQQRPPQSTTUTTRRRQQPNNNNMMMLJKLKGJUZVSRQPQRRRRRRPOPSUQMKKLLMMMMMMMMNNMNOPNLKKJJJKJJJJIHHIJKKJJIJHEGMNNQSTUTRPMHBDOPPPPQQPPPPOOLJHGHIJMNQUWWTSPNMLKKKLMNOMMMLLLNNONOZd_XVTRQQQRSSPU]WNNOOOMMMLLLKJIIIJJGHKHFECCDEEDDCBCFJQUWXVUUQOMKKMPMGEFGIJGES]XXYWWWVUUUUW\^SMMOQT_scLILPZafuYYYUROOOOMLJHGGFFHIIJCJ]SMSSTOIHHIIFDjpJRPNOOPSTRRTWYZZYWSXUJCELOMLKECEEMKHIMOQSRPPONKHGHECDCcuHKNLIGEFGFGFDDCBABAACC@@A@B@@AA@><::;;:879:;;::878:;S`]UXlvz{YEJMNNLJHMYdr{`OIGGFGGGCEFHHA765210.,).3543358<;<=<<;;::::::99:<<::;;954:8604;;::9=CHIHE=;::=@BDGHHC???>=<<<<<<==;<<<:9777889;:>@>==;?IJGCBDEDCBBA@ACDCA?>>@@@A?;;<<<>CEA>;;;;64>?@@BCA><=??:54434108AB<89:75;@CCAAA@AABBBCCCBCCD@3,6BC?>@@@@@@?=>?@?<::;8::7899<>726878666655555676655569;<=>:5356:BEBA?>>???DHFFC@Wnm_fkhSJY`QBEIGD6,.2203KUHEGB;:<00CHHE=9:71/.///00001232110122334322/..-.38:;;:76554452007=:0)+12,*8;40'))+-/12320..5:=;=;1,,/102>ID78;7,()/5=B>1212SW7*/0-0895014468:=BGC1)/111-'#%'(*-/-,+****(')*++-3788755552,.5558;;88>AENK=8<==;69JVK@?;3/06>??Ma[D93;B910136988?JJJL<+,-*(&&))+.+*123-+DYE)%+*#&Gt{[=011-+,-+'%'((%%.>GE8022ZZZYZ[[\]]^`____````_]\ZZ\]^_`acdeeggghhihhhijijjjjjiiihfgebaaa``aabcaacddb`cffffffgfddecekusoutpppoonjhnwzwrpoomnsvtqkeca^^_____`aaaaabbbbb``_____```___^_^^^^__````bdfggku~{onnqzysoohZU\^\^hpstutojijjmmd^Y`}}zplj^brxxfkmkfgjghnttml{|yv|{~ystttssopttqnhcdfzrhlljklmmljsxspnidcb`{|xhcacdccdbcjpppnpuvslp||ueecblsomdajxbZ\^cssu~prshd^Zae[Yrqebb`_]ZYYat}ueYZ]][XWVXYXSZ}difRMVXZ[VXcf]RQW[_]XWXYYYXWWXWVY[\VKRlpYPSSPNNORUXXWVTTTTROMNNNMLMLLLKKIHMTWWTSRRRSSSSQQPNPRPMKIIJIJJJKKLMOOMLLMKJJIIJKJJJKLLLJIJQMJJHHHLVZSQSQQQPNKFCA@DPRPQQQPPPOOONLKJJJJKKLOSWWUSQPMLMLJKKKKKLKKKLLNNMU`^WSQPQQPQSQX]XQNOPONNNLLKLLKKKJIHJKKKIGEDDCBBCCDEGLPVXSWXSQOMLJHGGFFFGGGGICPZYXXXWVUUSV^_^RNNQUXezybNIMPXbhsXYXROMMMNKKJHHHGGGIJHFZYDKORWSIDEILNKLLNOMQOOWXSRRRQROKKNPW`gqseQKJJJFHHIRQSTSQQOMLMMKHEGIGAWx^JLLMLJGFFDDDCBCAA@@?;>B?A?;B@AA@>=;<===<;;;;;:87985Gm]]^emweKEINNLNLOUY`kywegysaRNMMLMMKPUZZVD7:DEEFC===:6548::;;;;;;:::999:99:<;:::;;66:3139;9:;?DHHGF@:;<;;=DGHFFFFDFDCEHF@8415=<99885ACGHHLOPKE>?=;;;<>??>=<<:887777778:D;@@?>>====<<<;<<;;<===><66AILGDEGEEEDCCDFHHFCA@@?>>?=;<<<>ADB@<976447<@?>>?AFMQRMC=>?@BA@A@@=<<=?=9545415>???@@?>=<=855649CDCA?>>??@BEIHDTpymbghcXQO[`KBKLQO>.-412DNEKP@6:<0*>MGID;:71/..//000111222122334455541/.0259:;=<744458:963586/*-33/,6423+)**,../0/,)3>74;=?=:99757>A7+(++((++,-../021-*085+,GI.%*)*+054210.,+*)))*(*5;628743210/+(.445=>1+268;9888:9.----.//-013@KMIRWM;25:97:6/+)))'6LE/)**%*:GGE@5*(&%$&,9JMAGRG77792+*,/16=<2-/.)'(*-.08>22=*:XH*)0039>;54447:<=@A:01640-,)'&%&)-/,**)*++++*,/03:7113435753778888=ACCB@BFB4)+..*'&)0;?=5:GF=7:?966653-***2BJH@=ACDBAEFIOJ=57>BBDJPUO>321,/637P_P<:606><2.0.1446;EHFA4+***,,*)()().54+3N\L6-,+(($*\qB83./.,+,*)'&()))08>:.,02ZZZZZ[\\]]^____```a`^][[[[]^_`aceeefghhhhhijjjjlmkjjjijhggdb`___``aaaabdba`aeilmlhggfdfkosz~xusrpooomgfkmkiffgfgikmligedb`_____abbcceedccddbb_^__`````__^^]]^___`__accddflxysqqyysoh[W^^YY^aacfjnolikohcrrkibZdpinkehjiikknmgi~{yxz}~}psrw|}xqqspjjcadeu}{pkmmlmmnonpwrouoidddbczxtz{}tdageddcdjqrpoopqrqnn{zlcec_Zupfbbdho}j^\\^lyxy||th[_dg^X]hkhd_[YWXYYYYW_ukX[^][XVVVWZZNcx]ofQOSZ^\W\sqVT]^a_ZVVYZXXXX\\\\\aWRgucOPRQOMMORUXYYTTUUUSMJKLLLLLNNNKKJIIPUVUUTSSRSSSSPNMMNNMKIHHHGFFIJKKMNMKKKJJJIHJLMNOOPPNQQOOMMPSV`hfWQRNJJKKLHBBDACRURSRQPPPOOOONMLKJJIIIIKPTUUTTRQQOMLKJKKKJKKKLLMNS\]VPNOOPPQQPRSQPPOPPNNNLJJKLMMMLIILLKJIIIGECAAACDEGIIJW^[WUSQOMJGEEFFGHGGGHHQ[YXXWWVUUTWaa\QRTWZ[isaQLORYbkpXYXQNLLLMKJJHHHHGGIKEI\RFMMPVTKHLOOPREgǚZMPMONOUXTNKIMXbipwx|~dRKJKJJQGIRRRPOONNMKKNNOMJFFEMUNMLKLNLKJGC@=?BB@?@?@ACIJJF=C@A@?>==>>>@@?<;;99989:2Eumedae^IAGMKNPP]dVKKR[^Z_^\NHJWWRPNNMKJIGMSXXQ@:JV\ae_WPH>:6>=<=<<;;;:::999:99:;;;99<<8781/18;:EHGEEEDCDGFFC<423=GC>;86>LRMKJHGHHHILQNIHHFBCCCEIJJNRWYR??A><<;???>>><:66667789::A>=?@?>>=>==<=;<<<;=====<748@HJNMHGFFEEDDGHIHHGEC?>>?><;;<>@BB@<8653249>A@@@@BHMRPE>??>?@@@@A?>>;?EB88=@CBAA@@ABCCCCDDDEEB<2;HECAA?>?@A@>>::==<;;;:877778758:8798755555555534444578;=<:75774IGMJ63:=4.;QGGF>:720./00001112222123344555652//25788;><754468;;82//,*+.120.1-+.+*+,++),0/-2B=/-03776786435684+**(()),.../020-,299-'>K9*.,*,.342/-.,*)))))'%*/000010..02-(/656@D>12;?A><;;;89730221/-+)'-=VYV\R@IXUH=71.---..,7:(%$)(&(5IM<,((''('#$+7Dc|\<242/)()+.10+)-)&%%(())()+',<0(CR9(+/49==;::75:=>=;:9>@8/++)(&%%(,--,+*++-./-.366:80/2335778:987970352//11046119977ADA?GOLB94128HQORQ;()010/5O`K67<926?=621.))2;=;41.)()-.,+*)'()''.636GA'%/1/.-,*2xS,64,+,,+*)(''(+-+,2754510ZZZZZZ[]___``_```aaa_]\[[\]__`bddeffghhhiijjjjknnmmllkjhgfdb`^]^__^_`aaa`__dlquwtpljjlnrtx~~zy||wtrponnnmnnhegfdeefgggecccdffb````bbaafgffeeeeddca`__```_`__^^^^^____`abcdefm{~y{~vzrnu|~}tnfXY^[XWXXXY]cgihgosl{~sjfbd{polehhhijikqjdxywuvz~z~xprpu~zqswoii^\bcinvwnjjlmnnpqruuim}pcbdec_]j|}~rs}{uu}|t`_hfffbhpsomqsrponnkr{|rehfc]Qrj\Zcgejvp^]Z`o~{sr^clf]]aa[X\[XTV\^^\YVWohX]_\[YVVWXZ\T[ybho_SMS]\TRbjcba_ab^YVYZXY[Z\^_YUXUpoMNTQQQPPQRTUX]YTVWYTMIJKKLMMNPPOMMMNSWUVVUTTSSRRRPNMLLLKIHHHHHHGHJJKLMLLKJJJKKLLNPQQQPNKR]QSV^gipwhWKMNLLLNMLGA@DFJOSUTSPPPPOPPPPONNLLKIJJILOTUUUTTSQPNKLLKKKKKKLLMOUZZTONNOPPPPPOOOPPPPPNNNMJJKNNMMMJJMMKJJJIHFCBAABCEGFEFVi[PUURPMKIHFDEFGGGGHFKVWVVVUVVSTY_a]SW_`ceweTPQT\eij|VYWQONNMLJIIIHHHJIILGU^KHLKKMLKQWUQROQH|ıfNQPPPPPSNNVbvnZPLLLLRWGIMMLMMMLORQPQSSRMIKJILNNMLLKJJKLKG??BB>>@?><997799:;;D_zyphYIADGMSUVckYFBGJLILOQMFBCELSTRQPQNMRRRRTI:CT[\`b_XRHCAAB@<;;;:;::9889999::;;99<<67932389:<9518FKE@=85FTMGFD@>@BBCEHGGGHGFFGGIILNPTSWZH@CBB98?>?>>?;887667789;:<@;?@?>>>?>=====<<<<=====;9:=>ERTLGEEEEDEGHHHHHIGB@>?>;99>>?AENOC=>?<;;>ACCA@?>BGD<65544?B@DFEB<;>ABCBABBCCDDDDEDDEB?:6CKEFFD@@??@?><;;<?@AELNDBd~}qdfhaZVSRS]GAPTMFH>224:MPF;655683:NIFF@:631000001112222223333344320/0235:<=?;32554577761..,+--..--,*(***+..-*,.02WomaD1,/-,51./44*)'(+2:67C9,))''&(),('8etTZP@4(%'''(*./-*)),/,***))&#&5:).LJ4,+27899;?<88:>>;;==91-,,)'&&&)-11,+,-,-0002466752222356688756;CCB@@C>/%*8B>868<@CDB>DF<0399625998668AQ\R8/65320127>@GKKIHD8/4HSOTS7&*--,9WX:09>D=17>:564/)&098.(''().63*'(((&&*,2?E93B@-'+06/+.#Gl@.84.*)))))(()*---059:=<71ZZ[[\\]_`a`aaaba`abba_]\\\]^__acddfffghghiijjjknqqpnnmkigedc`__^^____`a``bflquwxxvsrssnkjowxwwz~zwsonnnnrurmkigfeeffedbcddfhieb`__```aeffhiihghhhgfdaaa`_``_^_```````aabccdcirronomltz~wmsxz||tmk]XZZXY\]]\[\cecoxjd{~tic`rxqiiigiijkljivotuw{}}z{qqw~{quvojg^\aaenyvkhiklmnopqnsogrr^`eecfd][i~yszyrrzwtzi``fgfcfkmkmrrplmnpmnr~jaigcW^e]^igcpxbZ]o|tsziefbcb^]a`Z]eimoke]YUNae\ba\YXUUWYY[]]i\gi\TQ^aWQXeig_\cd_YVXZYZZWZ_aYUQeXMRTTTTTTTVWVXdhYV]]WOIIKKLMMNQTUSQUZWSUWWVTSSSSSRQNLJKKIJJJKKLMLKJIKLLLLLLLLNOPPQQQQPOLMPX`kt|}|}dGCGHILPW[^XTOHFHKLNPPOLLMNOQSSRRRQRQONNNNOPTUUTTTSQQQOOOMLLLLJLLMOTYYSMMMMNOPPPRRQQQQQPOOOOMKIKLLMMKKOMIJJJJJFBBBBBBCEECGT^WUTPPPNMKHFEEEFFGGGFFLTVTUUUVVY[_a^UakijvjVQRT]gefwUXXTRPPNLJIIIHHHLIBELdY?JKHJHFKVZYUSQPPNyLSPPNKNY^nrYKLNPRVZ\OGHLJJKLMOSVUTTSRSRPOLJRSNMLMNMIFJORQJBA>8:@@>:77679:9=MUWVWVTPLJHGGEA@><;;::988899999::99;:5788888999;@FFEC?;:9998888;CFFDA?AA<9788:BJG?;;65DQMIIGFCDFHMONKHIJIIHJJKKNPRTQPYRCBGG85@?@???=9975566678:;;>@?>=====<<<;==>>==>==<<==<=;864449=><<<==>BHF=:=><:<=ACCB@??AEGA85559FACFEFD?=@BABAABBCCCDDDEEEC?=9=NMGJKGC@>??>><<=;=??=;<<96569::86555553566422233249<>;78:;;;>A?86>B>?@ACINNACez{tcZdjf\YXSUN@BLNGFB3038DC<7868;;26INIF?94211110101112232333444553-*-4524=EE;-)285234434333//55652-)''&(*-1440.,/8B?2=ND76BFA;7/++/42/,)((******+..*+7EF:/104BE8,*-*+:54;2,())*++0/+)*('/469:3/3,&/25DIGFB=BIC<<<89??7149Yxw_=-*-.142+/40++1568><630+)))*-37<5,9SW?HVZR:'"$'((281)+-285/,',78-'0A9'9OD0'-010.3;=;9:?D?8840.+,,+')*+,263,+----./01123554221246566526AD@<:?D5$(5>JM@99@D?;:;@?6230.5=;:3,//.-/454-,-+++170))*))(.BA<87767;=5Hwzom_baage^LCGMRVRY]`fdXPSSUWXZ]\NGEEEGIQVVYZVXWVUROLE@LTVURPNKJIIIJLQQLF==<:9888988889988:978889889999<@@@?<9988777788<>>==<;<;:9:;@FG@;::85@PQNLKLJHJKPWZWOLNMLKLMMNQSVWVU[RBDHJ@=AAAAAA?;976666678:::;<<<=>@?>@>==><=<:;<=>><=<<;98?HQTKGGHHGGGGIKMKIHFEB=<;;=;=<>>=:854579;;:;===>>:88:<:<>>@BCC@??=?EG>547AFBCCDFEBABB@@AABBCDEDEDDDB=<;9ANKKLLJFB?>>>>=;:99:<>@@>?A>967:9777655555356652111126;>=878:::;?A>:;<@@>@@ELLC7@futt[Mbmh`^\\ZVH=?Vk[A3/220;?969>?>96ISLF>53211111111222232333434664/-177/0:DA/(0543111114562/28>BCA9/+))(*-.1110102<=4ASMF>7@LF;6300210.**++,,+*()+,*1?E9-4DH:;C9,)*)0D<0<@71-,00+373./.&'285><37>;105;BNVNNWVXR^thWBZ{L41-+../.,/.-,4>A:66896-*-*-4@><9@H9'1==JSB79AC>;;A??@A80/4?ACDDB@??@BCBBDEEFLSQMKJHHFFFEGHFFFOYUSTTTUWZ[]__ZjqvxbQORYemlqhUWVSQPONLJHHIIFGoyVL\ZXUVTRSUUTTRSQOEOrcMSaǮeRP]ddc`\YX\^SJLJQKIJMOPRPNNNMJHIJKKILQQPNNMPMIEC?AFFE@>=;CPLPNPLDGGCBAABBA??BA:77756;<7P{oijd[]\`cZKFNVWWSY]bjiZTWYYZZ\XNJHBABFHHVYXXYY[]\ZVSPLNSSRONLKIIIKMPRTQLFE>9:998988888888988999:9999989::<<978888888::99:;;;;=;:;==@@<999996=OSQOONLKMRX^c`RNRQOMNOOPSUZ[[_hT>FHHECBBBCBBA<987777778:::::;;>>=<;;;;===<::::;9;FPQMLMMMMMMMLLJFDCCC@=<<;;===?A?<84556899;;==;9888::;==>?ACCB?<9:AIF<6=97::;DNQPOONID@>>>>><988:;<>@@BC?969:7446555444456641022137>=8668988:=>=;=?>>>?AGMF835PmoeVO[mnfeebbaR@:Ijz]=73/1;@?=>@BH?6IVOE;31000000111233333344434785105::3/8:3.265221/.-/474-/67>GJLF3.1,)+-,*,13542278FSQPG3>RH96542100/,*+,,,-+)(*+/;B9)-@E?:8=8-))&/@5'5D@=9434,+8:3120(,43M|uO6(+-)1@Mt]?E@>A9-9HG=-2;=95200=OSG73=8GNHF=7//=MWM8*$%((+.'/>=5.(*4:7-'-BD/)/+)('%&).353/07<988:5+(*,)-0('-540,,,-,-++,,,**-/.1679:6.,,/04=@A=:BD/*8>>FJ=69CC<9:;=@IL>2149=;78=CHJF=40.+*+*&4TZ>9LKLTUURJ@0*,-+++6PR5(8?70+/587840)-11.,+*-.(&-341,..+*-49<>8AYO6-8fp=)..,*()),496/,*)+-,-.364.*)(&0F[[]^`acdefedccbbbabbbca^^]]]^__aabcdddeefffghihe_]`aaabbcb___^]]^]^__`bdfhjnqtvwwvwvrqsromhhq|}yuqqw|{xsokgdbcdeeffffggffffffghhhijkhd`^]^\Z[\\[ZZ]`dikllmljjgc_^_`aa`bddddbbcccdeb_^^aed_bp}}vtvvvwvvxp\Ypxmsxye`dajvzqq~sv|zokkl{phoy|snlnmnsuw}yq]\^`bdbbbcab_dhjkllmlkdrvbk|~u[bcdcdc`n~xxysihgffoutoooopqsrolheikj~xlea_[\diie`aba`__Z]Z_]S|iX\__`eli^evth`^wvi\VVUSTYclljh_ZXVX\`aa_ae`r΋ScNCK\if^WP^tugbbZXZZ[YYTPOXTUwMU]XXXWVWXYYXWWWYY]]\_ZPJJNMNPKJKLKGFHJLPTUTUTSSTUUUSONLKMMNNOOMNNNMKIHIIIGEEHMRURPPPPONNKR]mheveMLX_kkc`^]^^_`cggffcYWOLIINTUUUVUUUUWWVUUUTSSRRRRRSRRSQPOONNOOPPPRRRRONOONNNNOPOPPPQQQPNNOPNHIGBBJKKKJHECB@?@BCDDDA?@AA@AAABBELTRMLJIIIIEHGFFFGLTSSTTRSUX[]^^Yblqvwvt_QMOWelm{qYWVSRQPNMKIHHIJEJocKSRRXXWVTTTTTTTRRQRQYiƾdMKTmtmgeb_[Z_[KKMITRFJMMNOMKKLLIGGHJJHJPQPNNMOMIFCA>@ED@A?<>C@DIPLFIICCA@ABA??A@<87757::9KtjbikotgYQNKLV^[VV[^bkj^XY[[[Z_VDJIDA@EJGUZWWYYZZZ[]ZVTRQQQQPNLKIJKMPRSRNII@;:998988888888879999:998998877:;87888888:;;:::;99<<::=?>@=66799:6;NVTQPPNMPV[afaTOSQPOPQPQTW\_^cqdHHHHECBBBCBCB=987777788:::::::>>=<<;;<===;999::977?KOONNNOOONLJF@@ABCB?==;<>@?>@BA?8544689;;===<<;;;<>>=>?@BED?866:CJB9=CDEEGHHFEEC@@AAACDBCCD@:5//786GPNRQQRRPJB>???>=;;:999;>@CB;5786444435554445662-/5866:=767787799:;;:::;<=?BHMD;717YmaZPOjrmjgecbYG>=Ilu\A3066<@?@@IS?0EYSC4201111112223432334443368861159;6583*0851000..//340,.249>GPH504/)*,,),/26960/7HSSTNAC<7?>,,9=;=:87;CB9676:>FK@44443335:B@;<:1*)+/0-''3C>APYYWRQP>;7-0*'0@OJ7($*9:31:@C<76655010.+)+/1-.5>90,,-.1670*/10233.#HyB()1-*,*''+550.,,,,+,,.34.)+=<(5Kbbccbaceeeeedcbbbbbbbba___^]^__`aabbbbca````_]]]]^^^___^^^^^]\[[[\^__acehiknrwwwxxxvsqonmiegpvuqorvxzywtrpjecbceeefgghhggghhhgghhjjjjhd`__^\afc__dilmmlmopomnnlhda`a_`bcefdbcddcdedbaaca_^`iw~yqrttusqqlecirxyxoZ[vxklw{wrfiquxtt}ptw{zhgger|uuy}yqljifjtssqkv}~|}}}~o_db[_bb`aab`^ceglo{xzmdlxu_cdgged_r~y}z~{ubefffournoqstsrppmigjhg~tgkf]Y_hkgeeca__\\aWlf`VfiRXZ`f_`if_^bfha^{xgYWWVTUW`qlhha\ZXX\acccbfc^}kY^GHR]b_]T\qm```[ZZXYZYTIMNP}POYZ\\YXWXYZ[[YXWY_gc^^ZQKJLKLJIIJLJILNPSUWVUUUUTTUTSQOONMKKMNNONMMMMJIHHIJIIJJMQTRQQPOOPOMQMm|i}fgkibZ[\]\\\\_`_```a`b^XOMORUUUVVUUUVWVUUUTTRQQQQRRRRSRQQPPOOOPPPQQRRPPOOONNNOOOPPRRRQPPPOPSLFJEJQNKKJHGFEFFFFDDDDC@>>?@CBCCDDISRNLJIJQPS_]JFHGHNSSTTSRTW\^]\YY\\\\du~o^OMNXgqdVWSRQPONMKJIIIIEO{nJOV[ZZ[ZVTUUUUUTVUW]w͢iNJMT[Ycnjfeca_`fUHKLJS]OKKLLLKKKKKIIIJJIIKNPPNNMNMJFDDB@B@@@??<638BQNGKKECA@@@@?=?@<87769::7CdtstiZRRNKLW_^\_gichlb[Z[[[Z`VILKHC?DJJOVXWYWWSRTWXVUSQQPOOLKJJJKMOQRPLKIFA<988988887887879999:999999999::88777788:;;:::879:;<>@A@A?:5579967JZWSRPNNRX]bfcUPTRQPRSSSUX]aaaouXFHHFDBBAA@CB<79;977787999:;;;<@A@@@??>>==<;<<<>?<:998779988><==<>>>=>?ACFD?9677?DFGKLKJFDD@<?CRnpM519><:9;AHK?2AYU@-112222222223433434444468751//598??3/0,(-.+,U{T41.042/-,*++*GjH+'+/(1\}xP'&Ok8+0-/30-()15:CFIJHB6.6634<:EirT5,'(=C;51.+.34,&)6EJ?40-HdK5:;93.+()-/,*)-21/-,+*((+/27@@;<=9888/.,,03.*1?9-,----032-((0:7+)28999:80,27=CBAA8246-,26535;=>CD83659:>G@864222103?D<:8334598004-/?KYee[KHM<7=3'*3EJ?0())*/37=FJKC856:>62..8816A@;8:60+'.9::9/*+/,+33/+.}S #-.*)(')(*.+)-274.)*,-138=>?<9888;<;<=CbspYPSQOKKR]`bftxcioc[\\]\bfZSPLLE=@DJBHTYVQONNNRVTSSTUQNMJIJKKLNOPPNLLKKG?999:989878877799999::::9:9::988976778789:99989<==>ACCCDJ@2257873L_[VTQPQV[_egcVQUTTSUVVVW[_cd`i|bFIIFDAABBAC@;9==<<>>=??<:8987799::87ACBA@@DLH:469;<==>>?:7=@>>>=>>?@CFDB=:888=CDDFHKNNKIDBB<89>@ACCDDA=950/27:5?]\X`^[\XVQE>A@?>;889::9>:6Jljd]NWnyvlfa^[S?:@C[u`?3:@>888579:6>XV>*111222222233444545554568752-(),1;;461))*++-4:;80+.033../1123220,*,-.00,)'(/446EXXKA>>7778:942/,-24/+,+.31*',6<80*&(0.,/,('')7>5--....,,+**(')*+,--.00,)%%.2/+,038B--7Xl\Z^SL>.),/2/,))2641//.+(),16@A>AB:36:84/-/0,-9@0')**+.5972-,/32+.577776414;@CCDA7/0241-.00.3=ABCE@69=:7:CB>;537:;701:?:215AOTH;BLJGKGHQRIEFIG=?;,8HJ9)+.++++6EFEKLF:48>>:4+/FD:L\UF6.2765=ME4>A67BJKH=4=1Xu?)()+,,*)*)((*),6>>2&),,09HK=46=??aaabcccdeeedcccdefffecbb`_^]]]]_a`^^]\[[[[\\]\\\]]]^_^^^]\[ZYXYZ[\]^^]^beghhd`jsrooomkigeddcbbchnnotuuvwwrjda__acdfffhhiihhhhhhhhhjkkllieb`\YY\]^_`__bhnrqqqpqqppqnlkgcbbbcbccdfffhiikllkjhhkmmrx}ynjknuxzz|ujbaelvvnjmqnx~zvwsr||pcbj{qbgnidfhjozvqmjjjijpogiuujo{{w{~iclw~kadkpsu{}z{cexreedjjge`l}tp~}sbcksrmiilnonmlkjiiiddwwijd`egedcee`][YXXXYUUotg~\XQVZTVbe\\]Z[^aZe~n]X\`bbb_bkaZ`_ZXXY]acccbcegdw`_ONRRUZcfa_dd`^\ZacY\^\Ro]IWTTY``\Z[\_`a`]ZYZksld\YTMKJJJJJLPUXXXWVWVWVUTTTVVVROOQRSQNLNMMMMMLKLJIIIJLLKLNPQRQQQRPORQRWUěnnXNEELU\_^^\ZWUZ^^]_ccbbdfhhgf_YWXXWVVVVVVVUUUROOOOQRRSTSSSSQPOOOOOOPQQQQQPPPPPPOPSSSTSRRRQRRLCCKLNNKJKKKLMLLKKKIHHGGIKMOOOOPSUQMNQQMJGIOVPe{^NHEFKQSSUWY[__\ZVTQT\kzqZPNS`h{eW[XILPOONMLJJJIJCqƖWIPNOPPQRSTVWXWYzŴuhSOUMQ^a`aacddfbSLLKMOK[hVGHJJIIJKLLLMNMMORRRQPPNLMMJFEFEB;:=?B@=:99BPIMVJDBAA@?>?@@=;999;<;><8Ss]ILNNMKIMY\biw}gkqb]^ab_ogSMHJLF;:<>9;G[VHGKLMOTTRTWZYRNHHIJKLNOPONLLKKJC99::::987::8889:999:::::9;@=889:9677789;;::;5556882H^^[XVTRX_chgaWOTUUVWXXY\]_cc_g|dFKKGDBBBBCA=;;=C?88777679;>A@?AA?=>?@>>===>>>?A=:999888888:;::>@AEGFFHIKJJLLLLHA<<>CCBA@@AGPJ;359:<>>>=76AGC@>>?>>@CFEC?:8978?FFFIKNKGC?@=878DB@@><::;:9>B>73566553444555444579<;767896458777656;<86676677=GG>:=>:3DghebUTcsyrmgb^YK>;?J]\D87==559644727XW=,12332333333345555555679<<73.*++,2572((,,*+/48>@5+/3TZG96317:;98764/-01.,+*/32-)-8?3&$(*,,,-,*()3<5,**,/.---,,+-//.-,+,-//0/-*0AIBBDD;+%.223-'()/4+&&,-%(,010*9md0+))+,11/00276,2@KOMJJJE902=@=;X\-"4>4&.6++*))042//-$:V=$)'.]zzwncK/*.04575447557::3-//17===>@6,2<<1,)'()*..(&)(*,.3775104:5/2546665249?A>?D?1.322/,,.-,/49BDCC>8;<;=DHA8AEF:>IE7-/420,:W`[[_WPVSD3,06FMKMFAC74;4,+.02665>JH@FKB7342132-4GGN^c\P<9A=EPWcL*9VOFYqoaR?;CEH@95(+1023-))+-+(.:A6&&(*2=HA29DF@:^\[\\]]`bcdcccdddffffedb`_^]]]^^__^]]\Z[[Z\\]\\^^__```abbb`]ZYXWWX\_^]_bcedca[[bddfecbbba`_]]^_ddafpuvy{ytmf^]^```ceeghhgghhhhgghikmmmmligd^ZZZ[[[[[\_cinprttsrrrrrrqpnjd^^_`bcdfegijnoooprsrpooprv~skilqtvz|tsrrwxqmkkklwqn{~{|{mdk}~qljiegliyrkefhiijlnhdszompqw~~~~~~zy|z{|eZ]dq|}~yeuxjfgkkecdijlp{nz}}zo`dklppiijjkmomkjiedeiw{h_^diieffba^\ZYWXX[ZV`{|]VSX_XWUWdf`][\\\ZiwdXX^ceedabd]Y^][YVb`^bbabcdgggk_QPZ[VUVVZ\^``_][`bY^`UieGXWTSV]^WX\^bbcc_][YekdYQVUNJKMQSTVWZZYYWUUVXWTUUUVVVQOOQRRRQQQNONMMLMLJKKKLLMMMNPQQQQPQQOPPRUOnUtl[NFHIHHNZ_b`\Ybijfabbbceghhiijf_ZZXWWVVVVUUUUUSQPPPPRRSSSSSSQPOOPPPOPQQQQQQQPPPPPQSSSTTSRRQQN[[KEGFEGJJKLMNNMMMLIHIIJKNOOOOPOQQNOPRRNIFFHHIBCOXSJFEFGQYXWZ^a_[VRRX^gvrZOPWbgty^TYWKMQQSQOMKJIIJAbeGKMKJJKNRTTVZU`˳pWPSNftgcfgggddYOLMLMPJQlfOIJJIKKKMPPPPQTTSSRQPPNLLMKFFFEB<:=?AA@?<<@MLMYJDBCBBA@@@@?;99:;<<=<7W{aFDJKKIHHM`^cluvgntc^bgicdUGFGHFA:88877;QZAADDGILORSUWXVPIHIJJJKLNMLLLKKKE;:;;::879;<:889:999:::::9Zc__^[Z^elsph_VRUYYYZ[]_``bdaisYFKKGDBBBCC?;<>=:98888778;<@FFA>>====>>>>=>>??AB=88998888889;::::;BIOQPQRSSSQPOKD>=@DCB@?>==AKK=438;;::758BHEB@@@>>@BEEC?::967>FGHIKLJFBA>:778;?AB?;<965775568;;Th_`fgfg`K<>BBB@?>=:::9>C<9:<;7554553443444579:9777676568<>;85:=976555585;94:WW9-1385343333334555665689;==9523531345300.,,--,/460+.149520//.022.*(*-./4:847>BE=6KU?2312354443220,+++++...../3;:-%(',7401344554)%*,1410/36411354/-,--//.002,=`mkl_YS61864.()-13/*''((*./11.5SN))*++*.//0009=32COOLJLMD827DMEHof.#(08?3180-)&)?A2+.+*@VP5(*'!@v|y^@59::;8654344338A>783.598555/)+23)&%%&&&%$'*/32/+.59854=A3+26675358:<=;;DE:6;7-,-,,-..015=?>=@GEM`dW:7Qc_B&&67/8TdkmiT?GQM?227@IJIGAD<)''0325<@BBCGF=AJ@3240/1.0?EM^[UN@GWC,Gdh]<*1I]S]yZA==BHKO\ICCCBBBA@A@>;:;<==>>;@gpL@HHJIGFGKgjjwxkjxl_bhjZLFFKKD<;::89988AR>>=;>AAEKNPOOPNJHHHIIJLMMLLLKKKIA>;;::999;<;9888999:99:;:CFB=<=?>>>>>>==?@?AB>878988889999999:8:?JSSQRTWVSRROG@?@DDB?=:::58AHH:3:<=:99<>@BBBB@>?@BFEA=;:978?EHHJMKGCB@<8668=AA?:68766666559==Ieg`ekjjfU@9?@@??>>;::9?B<=BF@85434433333454567789866><:8<=887566775:A>998662:fndaYLPfqtsojgi\A7:ACFA64:@CFHIHB;9BUS6114;66433333345555666778:97448<:8864430,+./-,+++++,*(,0///01352+(),...-,.48::;74FJ6002420//.----***('+1-*).4:>4+28+,CC75;CD;.,)&'*//-,+/674/,5>3,-/.//-.1413LuufmP1652-+/35652-**(+02111265+*++/0,*-21.9>20?OPJHMNC55?EC=?@9-/11/.+)((-3('(**)))+*-7?:.&(2;=?A>8015775228==<:9>E>13DD1,--./3::;;::8:@?:::64?VfcUD1+8PeV3(4:58J]f^SC17KTUTPC9<>=?A=;/&,5789::9Q\E93,CM3%Ee\8&3/.HS`t:.FH>?;38;2+/20-+('+.157AD3')/10/./42...^`beikmllkjjihhggggggffeb_]\\]]]^^^^^]\\]\\]_accceffffghhggggggec`\ZZ[\^^^_^]``][[]^]]]\\\[\[Y\[Y[cnxzyx{~wia]\]``abcdeddedddddehjklmmmnonkfc`\ZXXWXXWWZbiklnptwvutsqpnnppkfc_^adb^`e`\afghfdeccehknqrrrpljkr|{ywsojly}z|xpkifeiidq|mmvpgewnho|}{ztkedgkmmmnppnihkotusqqomlllmw|uot~f]_][d|n{qhffghklli{z~|{}~~|xupkijkjhhhghjljihfn}|zj[_egeed`^]\\[XYZY\VP{UU^_jaWZWXZZZbicZZZW]t{k_\`fggfeba`^]^]\Z[fhdU[babdfgeerb`ROZ`\PSXTTW[^a`\ZZZWY[WUTTTUVW\YNUbedfknidbVLJHFLWYTPONNOQPOMLKMOQSQONPQSTUTSQRQRRSSRQQQQOMJJJIKLLLMNNNOPOOPRST]_PPMR]\wzM\_VSNNVNIJKJJMNQ`ieenuysopmihhhhfedb`]\XVUVVVVVVVVUTTSQQORTTTTTSRPPPPQPPPQRRRRQRRQPOOPRRSTUUTSSOFRgYDCEFHIIJLNOOONNMLJIIJMMMLKJIHFFEA=CMOKIGFDEGHKMQQHFGGJPY[Z`b_ZSPO^wwzrZQRY`ett\TWTQRUUUSPNPMJIJKKqXKRSUVY[ZYXUWPnʹhls]SJSwpogddcZONQPPSSOjuXIJKKJJLMMMMMMMKKMPPPPMNLKHFGEDB@@@@?@@?=BDEP^H@CCBBB@AB@<;:;>???@;Jw|WDFJIHHHHEFbilzxgaoi_acaJIHJKF=89:989;;:9B<<;9;=;;?DHJKKJJHGFFFGJJIIIHHHJJHC><;:::9;<;9877789999:;;<=<::9877789:::99;;;:;ACDFFEB;8778::9987;Ofe_epv{wlb\\[\]^^`cffhlwlPHHJHFDB@@BB>8;@=87678;:8:;<<>BB?>?AA?>>>=>=?@?AA<979:889999;:9:::987;GRSNNRSTTTSKC?@CDB?;:88954=GM@7EKFGFB=;=AAA@@?@BEE@;::999@DGHKLKDA?=;658;?A>;756756766669=>>UgcemlikfG5@??@@>>;998>A>?BA<85434554434566656888768?A???=<;::;9997777669;<;;87844Sokij\R_ovtpljhYA8::>CE?5;BLPOOMD>9?TH3655:5444444444555566555575003:<778742-*+,01///00.+*('),,,+.0375,)+-/0-()/234218?B9---24331--20-,-.--,+//,*,3:>83<@1-AF>:CPF0())'(,0..,)'/330(,;6*-02.,.1115).5.(+*'&&,230*)/HZYUC6IZN;3.,,193GL474EX\YH/$&)/2)&+,4;@=3.--,+*()+6<-,/0+,464/.491*'&+9BDG?415322138==:99:>?846;EC4..028BDA>9664:>303207KM9.*%%'2GK@53425:AF@980/DTVZ`R=63017852+288740-/49<@LQE>BCBCCAAB?<89=BBBAC>NvpOILJJJJJIHES]ix}oaZbfa]c^OQMJD?<;;9889;<;:;<;<;:;:9:=@BDJKIIHIGB<:BBBCBCCDIJGEB>;;::;;:876678899:::;;;<<<9966789:;857<;;;;AFFDBB?;998::;;;:938Vdaclswz}xria_]^^__`bflox`BJHGEDBA@@BB<8=B=75458?A=9:==?@@?>>?>>>??@@?;9;<;::999:;:;:::::94;LTOLNPSRTTOE=BDDB>;;96:::69OL8CPQQNIDA@BA?AA>@BCC@<;:::;ACEHJJIDA=;9669;<=;:856656777879;<8G`bgqplnaA5@?AB@>>::;;?>;??<:9655787775555666677776:?@@@A?<;;;:9::9777778:;>;77643GjqmpjZUe{}uoi_O?;:4:@@?::CRTPLIFA:=O@28:673554445654555665556564..3::412333/++-.-..032/-+**+++++++.56/,+,/0,+57212/0=IA3(),247>6).40,-.-185,+,--.034547:1-B@?@?4,5/,--..+/;<3441,.9<40.0/&&+'(9DFH>2.0.+-28<=9436;@AAEE;8E>32259??:61/0011--0100/.)+5>FLIA>=:6754112.8D?2;IMPXTA1+(*/76438<=;863379:;<=;C<*'-*&'+,,1."18,00+16*(F?#(/@Sy`PG9000-,***,1599894+***,,+***./.ffghikkllkkjjihgghiigggfda___^^^]]]^]^__^``a`abcfhjlklmmmnnlkmmlmllkkkhghhhghhgd^[[\\[[ZZ\]]\ZZZZ\]]\\\^^\[[ZY[[\]^_```````_`aacgikmnooqtvxvusoh`[YVVWWXXY]enrpqnklmnmlnqrrsvvvxxvttqnmid_\Z[[XWWY`eltx{{x{}te`kpqpqsne^^cdebadikhhiikliiy|h\apv|zz}tqv|}s}skjgfijknoqsutrstrqqsssrqpmjinqsvtl|lgeint|w{vrtv{}}~~x}z~~{wrrnkhhhihfcm~}p[bddfd_[[ZYYXXXWXZPboPbkmoa[keWVTUXUZklYX][jvk\\fkjjhhgdba_^_``XUjc_`ccddhkp[ftW`]\mjPOORUQRZ^ZXYYXYZXWVUTR[ZSQR\mqb_qscTKKJIJLONJFGHHIKMPU\][YTNNPOPQSTUTQNNQQRRRSSRQQONPQQPOMLLMMNPQRSSRSSTROORMNT^omVPNONOMMLMLIIJILPPLHMT^inpturppmgcbaaaaabdda_[YYYYYYXWVUUTPOQSTTUUTSUTSSSSRSRQSSSSSRQQQQQQRSSSTSRYfZGEGHKLLKJHHJMOOOMKKKKKKLLKKJJIIIHDBJQQNLJGFGFGIKKLOLIGENYUSZbb`YTUVYlsyvaWX\et{eYWWQNPTUQORTTRQNHQTlǭlLKNNNNNRWXYYV[yƴy[l}{^RLKZfotla`_amfTRWXWV\lu|p^RLJIHIIIIJIIGHHGIMPPONOMHGHD@>><<=@BDDCA@A?;5;?DBAAC?Rk^NNMLKKKJIJIKTgwyg_[`gd]e]^[YH<<>=;:989<<<;;;;::;<<<<=@@;BLKJLNMLB;@>=<<==?DHIJGC?;;<<;8665456889::::9::<<:98677788438;::;=;::99<<;<<:963>Wc_^cehnxzwofccca``acgouxkCFFEDDCB@@B@<@>?@??>??>>???@@>;:<=<<:9:::;:::::::986@KMLJMRPTVSF=;89:977799;;;;8675577778878;6:TahuwnZH:8>?AA@@;8:;=?>;>>=;9875778986555666677777=AA?AA?><;::9:::977889==;756565Ccnjnk[P^x}uphcXE?:79>>??9DYVSQLGA87E>19:753455545554556665568775314:;7666677555555554311/,)((,00-*.540,)*,,,5>6/1643ALB2++.46:@5)++)'(),6<7-*,-.1431/./0,,35.3II0'16/)0;==72.,,-/00/-,,+,0/(*;6573=SJ862)+/.*('(%%-1*(*>QR:8UVJD?5'&*)'.1:@-162;P^Q2(+)%$'+,)'%'/7?=520.01//35694-+/53*(*.0,,-'&6DHJ?1-/-+.589862139?DIKJE><=<836740-+++,-,,--491-08==/.039852248=AGJGGMNHA=DF=@FF=439;4.+)*,+&-;1&))-:4,5?2#-lv2#+&(Qk?MJ2-2/-(5?.%'056630-,-/1431---..hhhikllmlkjjjiihhijjigggeca`____]]]^^^_`_`aaa`acdgklmmmopqsrqqqoonnpqsrpnkigggge^YZZZ[[XZ]]\]ZY[Z[\[ZYYZYXXYYYY[[\]]]^^^^^____`beffhmooqvxxtpsuof^XVVWWWY\_ehfcceehklkjjklkkorstwy{zvrpolgb_][\[\bkrwxwy}~~}iVV]`_ejjebaba\W]ijfehjlmlejmd[]yzjjcagox{{vks~|yjigflnnopoprtsuvvz{tmmoopnkjlr}r{lpy|yylrz}~xx~wzxutrpmjjiigedkyz{xb_cdefc_\[ZYZYXWY[R[vWdqzxnfced^WZ]YYVcpf^Z\ind\]inllihhebba_``_YYnsfXV]aaabdd{bMaUb_]tsVLJOQMQ[^ZYYYYWVVUTSTW_ZSTSUdqfWevdOJLKJKMMLJGGJKLLMPV[[WTOMPSPNOPSTSQNNOQRSSSQQROKKNOONNLKKKLKLNPRRSUUSRSSROPOUVTURNMLKKKKJJKKKMNNONNLHKYchquqnpqidabccdfilljg^VXYZYYXWVUUSRQQSTTUUUUUTSSSRRSRRSSSSSSRQQQQQRSSSTSQas[FJLKLNMLJIGGJNSQMKKKKKKLKKKJKIJJGGPXWRNLJHFGFGHKLKJKJGBL\[V[bcaYUVXV[dn{bY[\qpTV[UQMIMPPQTWUUVLFXNClNJMMKNKMUWYXReuTeiSigUMRZ_irlc``aqzaPVXUUVXapvfWLJHIJHHHHHIHIHGHMOQPPONJGHD<78999:=ADDC@@??@ABCEDCA@B@97=ABA>@B?O]QPRPNKKKJIIKJPg}}f^_fiefaY`fjI7;>=<;::<>>>=:7799;=>=?=@B:8CIKLMNLJEA?=;;:;=?DGKKGD;=><98755335678:9::9:::;9887765430069:;;<=<<:999;=>=?><7694Hbb[]`fjw}ujgeddcccfjpuqvJACDDCCB@@A>=ADA:6778:AGE>99<>?=?>?@???????>??>?@@>::><;:<=;877999::::8:@HLJNROTWRDAB@@??=:88:?GHHFC@;8777889::;:7776677777756;71K`hy~f?699===>@A<;:9<>?>>>><;:85555566666667788888>@?>@??@>:9999::99877]lijg\SZltrohhcKA=>;<>@B7C`ZVVND>2-9<38875446555566655665579:88678879;:;<<<;;;9999962025541+),352*,344/))*).8:1.18;:@GB500047431-*)'&%)4=90/2467897422-*)),/**7:02;<2*,-05870-++,.012/--++,)(4B49NQJ@B5110//,/56:;/,+,**,01,)'(()*)+/42/0461&)10+/6217;856<CLLHHE=574-*((*,++,.+-BE2.7AIC9I`WF<8106>>5/.3BXWIEBDP[a]UG>7...-,-038BMQLJRURRMJE@DEA:/-.1330-,,*')8<.((/<=8?AAJTRRSQNMKJHGGHFLif`ageeo`__hmK9<>>>==>ADDCB>;9989>B?===><:;BHJLLLLJA=<;;::?CDC=877:?@CEE?99?B>=<>@??>?????>>>?ABA<4;<;;;;:999989@JG<=CCA>?BA>;78@HJHEB?;8877889::;97877878877766:92E[j{^76:;>?BDA>CB99==>==>>>==:8887766667789999998<@?=>>=>=;:::::::::879<;7655565:Yqnhc^WVbnroig`LC@D?:3+/9TWUQ=/-)(;GB=.*63+*(/69;=>=;311482(),-,,**)()*)))+-,('),++**-20*)),07;;0&!)>OC6468764221012458601>PUWUMFA;51000-+**++,>M=-.7;BCABWR73:<9=B@?DD<:EB43;BDFHINPI@4-45-*28=FKOLGKQT]_UFAH>01////17972.+)(3=3)'+=EABCB400),,,*,?HJSN922((.4><31,-7=92++1455760)''*,kklmmnnnnmkjijjhjkjiihhgeeecb`_^_^^^^^^]\[[\\]^_bdhlnoqqpkhhhijkhgiihfedb``]^bcb`[WXXWWYZ\^a`]\\\\[[[ZYYYXXXXYZZZ[[[[[\\\\]^]\]^_\YX\^_abba^\ZZ[]]\YVVVWXYZ[]_ceedgknnmlnolhfb^[XUVXY[ZYYXY^ioieffjnqqporttwvqu~jXYaa^]\ZZ^ddbgrsqqqsstuqttroio|qcc`g|sc`iichfckoqpppononmjmrzvliiklklmmlyzwxussqt}~w|{}ommnnomllljhfd`av~vn]mheecb^[[[Z[[]]TTwx]jvw|woqunjia]hnknmcfmf[[cb_\_konkjkiebba`a`\[Z[`c_ZZ[[^bgg_^_Tf´nXa^eikmeTJJMSY[ZZXVVWVVVVX]`WSUTTRVhiSLSOLMMMLKLJINQQQQQPQS[fjaSLPSSSQNOPQQOQRRSUUUTRPNLKKIIKKLNNNMLLLJKLLMNOOPPQRSSSSSSSOKJIJJJKMMIILOU\\ejrwi]`a[RR`mllllmkhiijjjifc]QNPTWWVUVUUUUTSSTUUVWWUUUUTRQQSTTUUUUUUSQQQQRRRSSSSPHIPRPPPOLJJIHIMSSMKLLNNMLLNQSSTVY]^^YROMLJHFFGHHIJJKKLIJPYZWZcbYVVWVUTOPlhXZQRe_YTMUitPOXXVWY\]LKQFbaMORSUWWVUWUaƌNLZYSL>^y\I`onnnle^^_av|^MTWVXYY_gjg\OHHIIIHGGHIJKKMTUKPQPONLIF@:78:;BB?>>@AEMSOMMLMKIGFFGGDGefbddWcnad_ekM==>???>?CFHHHHGC?<9?GF@<::;<::CGJJKLJB<;;;:;;;;>@DJNK<2254334434566689999::::9:::61+)'(4;<>>=;899:8898;>CGIHD@<885@\gegmwrgedeeegjnqlhuILUJB?@@@????BDC@968>>?@@????@@@@B>28>=>?@FHHHC<:<;;<;;;@INKGKRX[F9ECBB=;9999:99998CSE?ELOQPNOOMJB=?EEB>?BCB?9;BJKHE@=;;97688:;<;:88778888777769<:BRk|tS8;;=DHORKAED<>>=<<=>???>===<>>97677789999999;>=;<<;;;;:<<<<;<<;:758=9::76648Zvtoj_UT`lsqlfXIEDGE<9@D@?OND<746;@@3*14BK@5445555555666556:;97889769954;B@;60///.06;EH?325434541...4:5*'+.48::<>>???AA?=6-09.+++,---/9@9/(+7?B@:1.49:80,.-+**,/8A;0+,+')4<>4*))*+.1650.,*()*,/93.-+),,)((**),21.,,/-+*)+//+('''((&)24432781***(,25611/253/5<8+&*),//./0.+9H486>RaZI@>:0'%Chj]<-:7**(2>>>>>80-++,-*'(*))))*)&&&''(),,*)('''))*++*+,.028:4,('2A;,.48:74122334310-,2@MQUVURNA898762-,*-7HTB)',8756=EOG8>IOHCBALUL=,**&#(/0/((8NQUUD@<.',49<:AFEGIKZa]RD?4,.2457;AFF;-+*)3;2)'+=D96:=6061*,+*++'%,/+*35/--.474,,3751*,584344/(&'((ijkllllmlkljjkjijllkkjjhgffdaa____^^^^^][YZZ[\\\_beiifec`][\\\^`^\\]_`````baabbb_ZYXUVXXZ]]]^^^^]\ZYXWWWWXXWXXYZ[[[[[[\[\\]]]]]\[ZVUUVWWXXXYYXXYZ[[\ZVUVWWUUVXYZWUVZ^`adhjlmjgfd`ZUUZ]][[[_fki`]djmkjlmnuzyvtsux{|q`[_fgc\VYafhmorrpprrtvxwxyyxvu{teehs|lhuug_ixjhrslollkjlquuvwzqmlkijkkkmkuy{}mpx}|}wiijjjjjjjhged_c}zxh}nabc`]\[Z[[]]UVrutj`hhdbkha`ac\TW\]gnup^`_baZ`jpnkjkjfcbbaa`^\^^ZX\][ZY[]bgh`ZWW^a[XgmlniRFNSX[[YWWVVWXWVX_aRRXVTRZe_TSPNMNOOPPQPPTVWUURPOSbrqaQLTVRRPMMNQQQSSQRTTUTQOMMMMKKLLMNNNNNMMLKLLLMMLNPQRSSTTRRSOLJILMLMONO^pj^[YXKFJ[xvtrplkiiiihhfd`WNLRVWWVUUUUUUUUUUUUVVVUVVVUSPQRSUTUUUTSRQQQRRRRRQQJEHPRQQPNLLKKKLNQPMJKLNNONOPQUVWVVSSUUROMLJHFEEFHIHKKMOLKPUVVU``QUYWWUPKMihU\k>><::;;;;;<<>BJNE5045543455555569999::::9:::72-)+18;<==;:789987:9>AAA?@BB?979?DFIHGFFEA>69????>>@@@?@@AAA@?B?8:?B>7?MPPPOIB=;;<;<:;HNJEIO\YAKJDEINQRRSQOMF@AHIC>>ABC@==EKJFA=?><:758:<<<<;97777777777778>@BPmzbG@@;CINQSQICDDDCB@ABBAA@>>=>@@@><:87889999::9:;;:::<<;;:;=>=;;;::966:==;:8629^ywyxgST`lttj[NECDEEB=<>BDA625157=HL>0,0GL744444455556666669:::97558;<75;DD@91.-,+.38FM@/+233454430/286,'+169=ADECBB?<:750+,3/**-.-/226:6/,/5<==95116887652,**,18A9.+/0*),-0-)+,+.52/1///-,,-./3.(&()+/,%'((*-.,+,-/,)**)()*(''&')(&0::8884-(,--.243/.+/9?81.)$$'/57743697:<*/=NP@8554/+*#.ed<353/+'/AFFC?7,*(('&$')))('(()'((*+-*'(*($&,,'+000033301893/0147737=??:412466630+)1:>AFJPVQGB@=:76421*2P_N/!,3:>63=>==>CFEFGGFHIIIC@@FKKD=89;?ADDFHJF?<;<;;<<;<<===AJB5456545655555689899::;;:::75426;:;;;;;88::988<=BGIJIHBAB>984@autotzlecdefikoqkx}T=CHPSQI@>AA@?>@@=:89?CFIIHEIHB<5;BAA@@?@@?@@@AAA@?B@<=?A:2:EJQSTQLF@;<;=:>GCAIJN[S?CICABB?:99:::999:9>JFFFMRRTUSPNJBAILGA>?>@@?>BGGC?=?@>;669;<<<<<97887777788777=;;<<;;:888::978=><;:73=czw{w[S_lwvcJFCCBCDCB@>>DC31:46:-4332345556788779<<>A>6215<=749CE>5/-//0333BF6-.343345795/.020*+/35:CID>;<=92/-,,+-.))24137545217:;;<:973111249:4+(),3rX,3885,'*=KLD91+)'''(''(+*(&')))**+.23-(*+(%17//78::::951470,/489735>DB:20102442/*,9>739>CJC:?C>;9740-)8PJ537AFDIFFIW^RTieXQPNLI9/5/1?C?40.+,23653.*+):G6(%-=EAKo}z|veA(+0.+,9@71135410..0iiikkkkjihhijkmmlmmllkjigfedbaa^[[[[ZYXZ][WWXYZZZZYWVVSSTUVUUVVWWXZ[]````_`dfgfca^\ZXVWYZ[YWVX\\YWXXWVVVVWWWXXXZZYXYZZZZYZZ[\\[ZZYYXXWXYYXXXXZYXWWWY]]YVUVWWWVUZdgeefikmonllnonopnmh^XXZZ\b^UT`klaZ_jqppwyz||}||}}}r`X]dgjnmfekqpfagkmlnsxwwy{{zz{|vsmnrm_`ba`dnoicjrmmbx}lfhjedeeehgtzolljhijjjkvyowsmrz}{{qqroutrgniihijklkjheb^knzw|tf^\[[Z[\ZZlsaYXVT]gqmkqkkhrWNlocpn``be_Xfpppnlkjfdca`^WS]cY\pl_]]\YYZ[]^][[MooRWbeeghnjXLLU\ZXWWWWWXYYZYVY\[XVVVWWTQQQRQRSW\^^]^[VSRPNNNYuyaRQVUPNNLLMNPVWOKMPPOONNOOOMNNONNONNOONNNNMMMNNNORSTSSTTSSUQMMNPRTQO]γpKFLLLMPUKIFFhvkiiknoljhhecc`SOOQSUVYXWVVWWWWVVVUVWWVVWWVUUTSRRSTUVVUSRRRSRSSSRRUSRQPNLJHIIJKNONJIJLNOOTZ[TPRSV[`b_]\[\\[WTRPOPOOPOOOOMOWYTPU[[XXYXWOJMKVdXgfHAGMXWMHDBDHKLORSUZUONMNPK`tTKLMMOSTUXQlԳ`GSVYYTLJZja߹mboshZRURT_mtn_XWYYZ\crusncTLKJIIJLOOMMLLWXWSPONMKCCJOONMLKJHGEDBA@AABBBABFDDB?@FGFDDCBDIHFGFDCCBAAACDDCBIdndZOGGZh_^^__M;=>=>>=>EHEDFGFGGGIJHCBGLLH@>BDCBBDFIFA==<<<<<;<>=;88AHD736545655555688899:;;;;:9744588778:;:66;;:::>BFGGGD@=@A;8863Rv{oppheefhknqmvjCECEHJMROIB@@AA@@?>;<=@DEGGFFC@=7?ECB??????@@@AA@??BA<;<:749<>??=?AA?=;?@@<878;<<:=?948:77778:9775:D@Op\?ADECE?<==:;=?@ADFIIIIJJKJFA@>>?@><<<;::979::986669<>>===<:::876677779<>>>>;6=ezv|gPZlyy`BEECABBBAED;@F:597;=;@HIC87?;202345555567776:>AAAB<7303=@927BC91./12354285),14654534672/143/-.019FH>66::5/.///-.2(&/888:63524<@><;<9530/.,-5:4,(),3=>3),232111//130*(4:/.0121.--242,050,+*//(('').241/.-.2,)*,---//--/.0=50/001321/,19:5-.4:?>:@B?>><8/*.9;-*=W[KP_XVYcfadjeXONNG647;2#;PG>:2).@M\gieR;410580*'),)(->FISVQJB:76558962'(*)(*+*%&(()'&7I;-35?A8//)NP4IML9)SxE',/,'1=943/05521246iiijjhffddfhijlllmmllljhgfedbaa^ZYZZZYZYXXWXYZZZYWVUTTSTTTUTSUVUUVXZ\]^_^]_begfb`_]][XVWYYXXWVVWWWWWUTUVUVVVVVVXXVVVXXXXYYZZZ[ZZ[ZYYYXXYZZXXXYYYXXWY[[\[XWWWXWW\`[Y\`ddcfhlnmnoonmnnlga[YXY[[]cfa[X\cgkqy{|}}~~ve[`gkswunmlcZW]holfikjlqvuvumsqsumd^jidbccbab`dfghg_gz{mcedcbbccdcezxxoljigijiginv}ywpnmq~}|~~{}zzh]pnhhhijllmkjdbcn{lnzl\\\ZY[\Z\ipeZ[]WV^empjhjikeSa^Rcfesndnu^Uksqpolkjfedab]\qmUa`a_ZYYXZZ[ZTWgQUY[^^^`a]QKT\ZXXWXXXXYYZYY[\ZWVWWUUVPQRSSTU[acca]XURRRQPQUgm`VPNOONNNMNOQUUPLNPPOONOOOPOOOOPPPPOOOONNMMMMNNNOPPRRQSSRSSOORRRTSRPSgνyPNSONMNOOQOFEPmmhc]_fjjihecc`VRQPPRUWWXXWXYYXWVVUVXWWWWWVVVWUTRRSUWXXVUSRSRSTTTUVTSQPMKIHHIIKNOLLLKMONMS\a[RSVZ]a_ZWVUVXZYVSRSRPOOMMMMIFJNOKV^XY[YVRMLLIKmb[hWBCJOPPNJFFHIHHKPP[TOOPNMOKN}sTKNNMPTTVXQsһoEMRUZ\SMPY\Xڜ`rvdXQNKNW`nxo]WZ[]]apvtpi[PMLKHIKMLKKJIQRVURQOLJKOQTTQKHGGFFDCBAACBBA@???@CC?AGIHHEDCDFFDEEDCCAABACBBBCI[kgTJJKWma\\^YH=<=;=>>=CHJGDFHHHGGIJMKHILMLIHFDBBCEHHE@?<<<<<;<>>9667=GD74544555455578899:;;;;;:744777447:;848=<;:;@BEFBA=8:?;87983>_rosrjfefimmhpuI@FCCCACGOUMHDCBBB@AABAABC@><;;;:9BEB@?????@A@ABA@??BA=98656998HCGOUX[[QHC@?@EJHFC><=AB@@@?><;=?A<999<>>?><@DDEEEGHGCAEKLNOQQNLLKJHFDB>;;<==:768:87778======;::9997544568:=???>7=izt~rPVkzyZ@><<:7320--,,.//-**-4=>4,/35544426:3-)&-=:0.+)*)))/70&,82*+,*//,(',59951--04..000//230/210;D7/81/-,+,,/.(&)(')/10.-+,378:@:875,()+)&,2'(/41-)(/83*)'(((*,/,+0.*('(),122/*',57101/+-386-*2:=8.,470+)'(*,((+/0000114421/,/475017@DA>=>BCDEB87;7.**4PQ8Md_[\ee`ekdRNOO>3;84:38GB?49?JF:5)DSG\ZN5 &g\5+-/-088464/.45227;9edcbcca^]`cfhjklnljihggfffdbaaa^ZXXXXY\ZUUWXYYWWWWXVTSRRTTSSSSTTTVWXZYZ\[\^`cgfca___\ZXVVVVVVVUUVVVUUTUUUUTTTUUUUUTTVWVWYYYZZZZ[[ZZZYXYZZZYYXYXYXXXYYZ\\ZYYXXXWXURU[^]\Z[bjmnoppoomnqrpke_ZXZ]\[ZXWY_fqzxz~~}~pebdijklkg^VTXcnoha`einorsutiirwqhahy^`cdbadheebec^^agdnobecbcccccchpyytnnljhgijighin}volhl|z{|{{}s}}x~wbf[Ygqlihhjlmnnljgiusjqpu}n[\\[ZZ[\^^[WY[[UXlxokpfchgd[LWsr^drnsui~Zbvsrqomljfedbb`puVVtacc]VTPNQRSUJphPTTWXWWV\]TMSZYYXXYXWXXY\]\[YXVUWXWUVSVc\OSX^ded`ZUSRRRRQSU`d`UNMLLMMNNNPQSTQOQRPOPQQPPPPPPPRSRRRPONNNMMNNOONNNNPPQRRQPPOQSTSSPRRNPϰ{NLPQQOOOONQPHHQ^njdVRZagkidcba_TPOPSTUWXXYZYYYXWUUVWXWWWVVUVWWTRRRUXYYYXTTTSTTTUVUTRQPMJHHHIJLNMMMNMLLMLQ\c^TUZ^_]YUSSRRSSPMLNPPNLJHIKKLKJLMO]ZSX[YUOKLKHEPcaaI?CIMLMKGEHJIHHJMPZONPPNNNKOfuTKNPRVWWWVWǖ]KOOSY]TPTXLlЛauuaXPLJMT^i}zaWZ\]]bourolcUOLKJJJKJJJIIRRVYUTQPNOQRSQKGDDEFFDBAAACB@@ABA>?AA=@EEGGEDCDDEFEEDC@BBBBA@ACEJZmcMJPIHac\ZZTD=;;;<>><>BHKIFEEGHEGHKPQMKKKKJGEDDEFHIJF@>;=>===>=85542;EC8456544433567879;:;<;986435654359;95:;<:;<@?CD?=;8:;;:98954?Uft~skgfhlojnxI:55698:CEB@?>???@A@AAA??@AB=876667766:FMMMNMMLIC<=<:<=<;::;>ACCDGE?99;;99::9:@@>GLKMRVVUUWXWOFGNQQRTUSRTTTTROMHA=:;?CA957779:77;;<=<<<;;;:97567668;=>>@:7]xs]ShwqY>:BCBCDCCCCC>;;7:8<;:78;:7598798898654667766?KLIE;99624>C@78A?3.034346554224459<;9877;>>:876550,3=<56:;84101343249BFB?==73678;>=;9741011-,,,+-.-+-5==5244332220490(('&3;3-)$$'(*/7/'.85/23/-01.+2;:97/'*/41763.,,021156/7A6,33/--,,**.,*++(*-.-,+*-2899>?@:1&.4/.7?@<9874,()**(&''(.1/,)(.,(&&'''(),36340*'')),2341*$$*2466-')-00+(0794,-44.*'$&(%&'')+-../032/.-+,0567:@FE?;;>HHGFG;=D8)(*'=?*FTO]]W__fkVKLTOOJ<.-=GF69?1?aU=<6.*HvkH>79>7.362,4JMA=GSM96423227>=/,-+)(,.2::2+(*32/6814;AA?7*=J[ofH2$Jj.(---.274464.,/4338;:[[YYZYZYY]adgijlmha_\Z_cedb____]ZYWWWVWYYWVVWWUSTWXVTSRQSUTTTSSTUWVVWWXZ[\^^bffeb`_^\ZYWUUUUUUUTTSTUUUTUUTTTTTSRSTTSUVVVWXXXXXYZZYYYXXXYZYXYXXXXXXXXXYZ[\\[ZYYXWWWWYYWVVX]dhlopqoppppqstrmf]WVWWXXWX]jspq{}}{}xlb^]]^^ZWVUV[hqria`fqwur{powxy|h]adaaabekgedb`_^[]wvedddgffffkrplmpmonljhijihijlwrokfo|yy{}||{ugbdfjozkpwykggee^`nnhgimoopqrqqxzsww{c\\[ZZZ[]\[Z[\\YWqzz}ljgdfc[XWSYkokswtqjznsqomkjgecbbb{|t[Js{a[]\WZjne_ZZTtdPX[YXXXX[ZWSTXYXXXXWWWWWZZYWVVTSVYXUUXi[Q]efc_XTSQQQQPSTV\acRKNMLLKLMNPQRSRQQPQPPQQPPPPPOQSSRQQONNNNNNNNOOPONOPOPQQPNOOQSSSSQPQORϥwWLROPPOOOOOPOMQVTgli\TUW\egdcbbdXPQTVWVWXXYYZZYYWUTUVWWWWWVWWWVUTTUUWXXXXUUTSSSSTTSRRRQOLIHIJKLNMLNRRPNOMNU[ZRU`cb^YUVWTOMMHCCEHJIIIIJJKNNLLIZhTRY[YUPNKJJIETohN>BDHKKKHDFIIIKIJKQRMOPPPQRPSV\nzTKOSVWYYXR_ȡlTQMIOWZZVUUPѝazraTOLKKJSduwhYY[][joqnmjcXPNLJJJJJIIIKQRX\]\WUQPPQMD>AEEEFEDCAAABA@BCCCAA@====><9545438@A<76544444566779;::<:9863223234689;<::9:=AFGJF<;;9;;<;:::897A?C@BBB?>??FLLKJJHFFDDBA@>=<86677:BEB@?????@@@@A@?>@AA>9766677639>CKRSQQRROLGFG?BBGQWY]YG=>>?@DJJHIE@>DFEDB><::<<:;:;<>DGGGIID?==;99:99=@BFEDMVB?>?FQ[^\ZXYZ[[[\\WOLORRQSUUSRRTTTRRQKE?<AAABBDEDCBB=<;9;;:98766468665688755668768FRNG?:99865=EE<7>;2/34455667745778=FD=98889<>;96554357778972/--/1333:FNOK@<;735557797620--05630,+)),,.5=;445420-,,-/1.)%%%*4631.)&'+29638=;9999411005;644-+/16574/))-/00027/,31+-1-+/32004311-()((+//+,07653//55)-74.7A@<:762,)***-10/.11.+()00.)'''())*5?>:0)''((,4:8530,*,27:4+((*+,,...+,15+**(%()'(('&')(*,/0/,,,,-047:>@>:8<>AFC>DC/.A<)'+-9<2;=D[_NJYdU?@GKQR@/))08?)*EE@fe@95(',1422338;4.35,***'0DG6.,171&(-+/78:?6-;{YCquU2-+!-L1,))*)*+1663/,)*/585/TTTTSTVXZ\]^ababc_ZWTRW^bca^\[\\\ZWWWTSVYYVTUUSRSUUUUSRUUVWVTSTSUVVVUUVXZ\\]adfea^\[YYXVVWVUUUUTTTTTUVUTTTTTTRRRRSRSUTTUVVVVVWXYYWWXXXVVWVWXWXXXXWXWWXY[]]]\\ZXXXWUUUSTXXZ^chnnllnqpopppqrpme]ZYYWVVZ][^m{|yy|te``_[TQTWVVanrpjbcq~}x|vu|{z{__dace^`nofee`emqmt{jdejkiijmptsjippoqokijkijjjknsnnmkr|{}xvvx}|ou~{{{{~zptoyxqjd`bkyrmkjiliggb^fqpiinqtwurqomq}~|tc[\[[[[]]\[]_][Yjzolecd_[Zdnnljqvwxrlrrrrpnligedd_Wkzwuh]a[aa\YYZZb|xtruly_TY\ZXY[\\[[XTUXXXXXWVVUUUUUTSSQQTVVTQXutN\iic[TOPOPPRSUVXZbXHKNLKJIKMNOOPQPOPQQQRSRQPPOOOQQQQONNNNNNNNMNOOQQPONMNOOOOOPRSRSSQPOQLÄPKRSPQPOPPPOPOPTRNXjhaWVUTZbeccdh^RRXZYWXXYZZ[[ZZWUTTUWWXWWWXXXVWVWWVWXWWWWWUTSSSSRQPRSSQNJIKLMMNMJLSWXVRNKMRQPZefa\YWWVOGJPLFDEFFHJKKKKLMNKJNfbORZ[XTTTNLLMHHp~`FDFEGIHGD@FKGJKJIGSONOPPRTUUVXTUULQUVWYYXTypWTPMGFLS^\YRWӣunbPNLKIDFRexl[Y[clpnmkjhd\SOLJJJJJIIIP_[]^_`]YVSOPKA>=?@@@CBCFGHHFDEFEDCCBBCFIKLVbMLJE=8I_`YYXM?;===>ELMHCFKKKIHPLIIGHIFECCCEEHJC=<>=<<<=<:7567333;A;544445655668:;;;::88530///24668>B<8;?AFKNKC;::9;<<<;<<=>=8;SnzzmijqusE4???@?BBA?BB<@EIJKLKKIGFDCA?@@=;;978@DBA?????@@@@@@?>@@@?:777677558::?FPSSSSSSQL@0;OIJPSN@;;88888999:::98:CGDDGA;9:::;<===@EIIHGHJGC?=;9999=CDDFFEFB@@GQYZZUUTSRTVVUPPPOOPQQRSSSRQQQQPRSRONMHDFMRPIA@AAADEDDCBAA=:89:;;75545664368986667975@RVP?8899:76;EG;399214557758;979;;>BJMD968:><:87489446.'&()*,+,*(-1+&'*)')***)(&%%&)-/-..-.//25689854:=<841/.-%%9E4&,62=@5437:8;=<9879?CCA7,-3104999;=;9:=?BC?CA/'*-/.,)%%,7@DB5/:]??>>?ACGHHHFEFFECCCDDGIKLMNPQL?8::F]b[[WK?;>@E@:;=<;;:;?GKLIHHIJIKKIIHEED?<=<>>AF@=<>=<=<;;975665545:=744434454568:;<;::987521/.0357;AA:7;EFIEF@>;;;;<;>@BBA@DC?=AFHIJKLLLLLKJIHHFCE@75>CBA@???@@??@@@?=?AA@;7776777789998BHDDKI@;;:;<=??@BFJIGECDEB?=;:999>EFEDA@CEBAEHGDECDFFEGJGIHJPRQOQSSTSRRQQQQPPPQQRUVRIFKRTPFBKPKJGD@@>====<<=<;9:;;;:;:7:WvyZ\giaXOMLA?BBCDDDDCBAA=::99:86754357779:777767873>RVL8/4788437><20695/-/5:769;>><<876453-.891.//0.0;<6,))+,,--,,/42-))*))/8<<;82156-')+-./..-,++,+))))++**-7<61-+,-,*))((,05532,'(1;:/'+-((+()/=C4'*0*%(-:A=950/8@=4-*)%&))))+-(*/+&'(*,-+,.,**)''')+*++****,/4323334751+'''&'(.1>E;7;38G^xbFMWO>103445;9-)*.3-EmD3+&,.+38;648@C@>?AGG7053/05:86;@FKKLNTXK6583,,4<:7666622377652027:721.*)+*+.-)(/7;:50.39>=5+(-4.(08@BBC=98:6/5@FDDB?<8421010++25/,++-.1983.+**+,./358?=0*((((/8>=7/-296-+/23210132369;;;8546850430.-+***)('&&(+.001,%(7=2)(.0*(+*)*2:0(+2.%',;F:+'%(05343(%&()(''),)*+((*)).0*),++++*((('(*)''((+.1/0352---///12345:,6SSD8:FYk`HDIO[S@30//,16/'(/@F7PW>3&&:;*/4LRNGDDGIKNVI9779;<9:;;:979<<<:::;?@@A@>:<@CBDFFGIKOQSRQPOPPPNKB88>CCCA??>>??????>>@BB@:7766777777777776;VedabcY?3?JGYU?9875568::9:<=<9;;>>ESYL=;>==>BEKKGHKJF@CFEGLKE?;:;<>@ACFGGCA@AA@@?=<:989CHD?EJFA?>>=;;==>@?<:878;DFDKOQPPRRRRQPPPPPPPOOONONMNKHOSNA9BMMHKRRL=:>=<;99:;;<<;<<73Aez|gigc_^VNQT^WF?CDBCCA?><81/;EE87C@755685005766776533BBACFJKLI=324675467750--,,---*('-0-.17>>9:<;9776229;86312:A>821-))*-.-))2:;82-+2:@@7+'-44/580-.48><63/6?@=;9960.-./00*,11.**).223-/-+*+-..168;0*,130-0102444679;:7540//.03423/-/0.+++**)*))*+-/2/')7;2///1,+-,)&%)((+00)%*;H4&')*+/121+&'*)(''*-**(',.*&+.,**)+,,,,,,**+*)+/3321379:2'&0898:<=A?8/BXQKGMIGF>DPSWZPD??>7247/',,5QB0fyHC8$.C;)-158.1639:0:CA7;L[_fkg`G0274.1?GEITQLIILNMV^ULU]QB?GRTC/*.4//*,?d?#.0,+(()'*.79.Bo}R//11+*0442122SRSTSTUTUVVWWVXXYZYYYXXXWVVWWUUUUUTTTQQUWVVZ[[[[[[[]]\^]XUSTY_``_\XURQQSUXZ\]^ac`YUVTRRRTUUUUUUUTTTTTSRQPPPQQPQRQQRRRTVVUTUUUUTSRRRSUTTUUVVWWWWWXXXXYYZZZ[[[\\[[[ZXWWUUWWVWXWX\_[WYYWZ^]]_ekllmmnqttwyxvspnpuvwy~xlnuwy}wpga_[Ydx|xvtrpxv~yd_fdaaaa`chjghuw}n^wvjgknprrpmlquqkjqtmghiiikkjisxuppswz|~|xpqpmxzprw}{wyyxzxy}yn~}xsqqrxsooroigilu|~}xqn}yd\]\\\[\\VhkYYcimsvwwuqollnvzwopwpljgfdbpzkXh{f^_^\\]\\\^_^_cRaƄT\\[[[[\]]]]]\[ZYZYUUWWVVUWXWWY[Z]daXVX\_h{scXSU\c_YVTTQOQTWVXXUSRQQPPPPQQQPRSQQRQPPPPOQRRRPOPQQQQQPPONMNNPQQTXVQOPQQQQQRTTTTSTQPTPSSRRRQRRQQPPSWVSRRPQSQUm]RVUTURR]jjge_VUUUUUUVVVVVVY[ZXVVY[[ZYWVVUTSRSTU[ZXWVUTSSQPPOTYVWZ\[YWUTTOLJKLMLMMLLLKJMTVWWSOMMMSYZVSNMNNLLLMNOPRSSTVWh\NOSWYYURSSRSTUUO]|hQTUSTSRPNLKJLOSRNKMKOWWVWWXWUUUTQijIQXWXYUV_NMOPQPNMLMLJPZ\k[[MLJIHGHHG;J|V[Q7:V\ZehjaWOJJJHHHGQknf`YXUY__][WTRPOLJGCACBAAAA???>@BGGGEBCCBBAACEEFDCBBBABDDDEGHJJNPMI@<<;:;:?@IZ`ZI>;;;=@C;7:<=:8:<975>KRPIEFIMPWXH;9;;:;>ADDA<<==;::86666566665544444456544458:1;:::9899;=AFGA;:;:9;><<;<;;::8;AGHIHFDCD@?>*O|oqrr~@;?>??>???><;=ACCABFGGHILOPPQQRPPNNI=8>CCBB@?>>?>>>??>>@BB@:76667767987689:87D\fbacbQDJF:ISA9864567779;<<;:<=>;BRTC;>===>AEIGDEKNJCCGHJJJGA?<:<>@ACHIF?>=;;99;CHA>>AC?::=BELSPOSTTQOPPPOPPPPOPPNNNNOONOLHHQTG:84*'5AA;<@<8544664356666785335<=66665555564233489653.04647?DCCGJLKC8434101222311232230/2,'-21-08@A????>:75318=:830.2B:*&+1332/(()*3BH=.175375431/.**/64-+...-*)/611++**+042///4>C:/-/,.05>>70-//.+*-0/8:46414<<3.,**,//+,23/,,++**+,.00-,+)*275--6721243544441+($%+/2,'*7A.252.,,,*))('))(''*.*+&'/0+$&*--,)*,...//-++.369<;86=@@?5))18:8:;OTFFUSD>COXTV^^UNKMO@467.)(*/GJ9QWDK;&6D5,./..-472:7)-:FEEP\]abZK9-,--+.>IJQSE@FHHLKEFD=NaQC;.8JG1&*.**((6J2"'*,-*'((&%5E=;sD%,--..-,,--,,TSTUUTTVXXXYXYZZZZ[ZYZZYXWUUUUUUUUTSSTSUXXX[]^^\YY\]\YWVVTPPSY]``_^\XVTUUTVWWWWWUSRSSRRSTUUUUUUUTTTTTTSQPPPPPPQSSSVVUWWVUTTUTTSQQRSSSTTTUVVVWWXWWXXXXYYZZZ[[[\[[[ZZYXVUUVVWXXYYWUTSSUYZYZ[]bddcbcfhfinnllnlknmhimj]\fomgq}rgb`\Zenrsqmmzxw}uc]aca^[]dffhiimkhwqXvyhdfilihhggfhiiikmlhfiijlkjjly|vsu}{zynpv}zqnqx}|yxxyvu{z{ur~hiqjikp{yonplr}vb[Z[\[[\Z]xZ^djsty}}uihjhjnqwm`imrtmkhgfbiocZ_`\^V`ddd`_^\\]^aa`aRaɆV\```__`bba`^]^\ZZZWVWVXZWVWWYZ[\af`XWY`]krwr]SQX_ZSTTTSUVXZ[\[VQOOPQPPPPQRTUSQRSSRPPONMOSTSQPPQQQQQPPOMMOOPQQSVVSPPQPQQQSTTSSSRROMTTSSSRRRQQPRS]d`VSRRSRUTa]TUVVUVTS]hje_VSWWWVWVVVVVVWWXXWUVWXXTRPRRSTSSTTYWUTSSQONMNNMNPOPVZZZ[[XVSPPPPQQPOONMLLNSVWUQMMNQVZZWROPQPONNOQQRSTSOK_dQIJINWZXUSTSUUTQNWZWQRTUTRRRQPOPOMLKKKKLOWXWWWWWWVWUQXrhNSXXXXXWRTONPPONLLLKLOVZǪ`RPLJJJJJKJIFD`{[YJ67\hQXele\PIJJJJGHYghbWPIL\gb`bdghgh_QKFDB@?@@????>BGJGGDBDCBBABBDDCAB@AAABCDEEHIKKONK??<<<:::>:7;;=;78=:::<>CKNMKKNNPWPB89::;=<==;:87666656544444444444643431243-=<<:999;=BHJJD=988DI><:=<<=88AGIHHHFDCC><>4=mpqotf?@????>><<:::;<=?@@BGGBDHLNPSSSRQPOM@8;BEDAA?>????????>@BA=:766666689876778898K^`a``ZQKB7?KF:865666789;:::9;>=;?NQA=><===?AGIEACJLHFIKJJHHDCA<<<>ADKLE>><<>BDFIQTY^[URPTURQQPOOPOOPPOOONNNNOOOQJKVQA<>?JPMSXI999:789:::==:59cyeZjuogeleMMXL;5;BDEDBCC=641111//3679764455666557897300021243334543/-.///053+(.0.-1?1,//-03;B=6331/0-),27>>41+(,4843332299/)/4/*(((**+,,/0/-+(*1671.010-+17979=>==8+$)//01/455;=50.,'&(),,*))()-1+-+-43-(.52--++,..---+)+4;<;;:99>@@=4/..27889988@MQRH<;=EPV]aWYdb[XPJLA5891''''6;-.:CF8/:>40-,+*,462781108BMTUNJFA;4.**-15@FMSH54AHOUJ@??59^Y<5))6:/)*(')((/21-(&,2-''()2BMM>m|4"*').0-+++,++VVVVWWWX[[YYY[\]]\\\[[ZZYXVUVUUTTUUTUVVWXY[ZZ[[ZYZ[ZXUQQRRRPQSW[^_a`\[[YVTSSSSRQPQRQQSSTTTUUUUUUUUUSSSSQPPPQQPQSVWXYXVVUUTTTTTRQQRSSSSTTUVVWWXYXWXXXXXYZZYZ[[\[[[ZYXWVTUWVVWWYXXYVTUWVUUWYXX[^[YY[^_^`bacfhhfb]ZYXUXcnj]b{}|obYTU[mxoebjrwz|td`_aa_ehkfgjijljde`bwvnljgdgjgeddfghknkgegijlkijnt~}}{wpmtyv{vlq{vtrnqxzzrr{yqntw|vg\cbbdefhkwvog}~uaX]_[[\\Zix{zx~michq{{|}}ldhhfgkoshbglspliggddjd^^\\Z[^`bdgfc_]]_die^TbLjZabcdddefeca_^^^[[]]^]WZ]WUXY[\[\cd]WX[`__y{nzjVRX`b^ZYWVUXZWVWWRPPMNPQQQSSRSY[UOOSVWVSPMJLQTSQOOPQQQQPPONMOQRQQRTTTSRQPPQRSSRRQQRTWWWTSSTTTRQQQRWbd]UTSSSRUUVWVUWVVWWUT[fjdYTWYXXXWWWVVVWWXXXWUTTUUSSTUVUUTTTTSSQQQPQPONNNMKMMPRUXZZZVUUUVXVTTSSRPPKMTUSROMLNQUX[WQPQSRPOQSSSSSQQIJfVGFGDIRTSTTUUVVVVTRPPRUXWUSRRROJHHIIJKMLLNUXWWXWXWVVUUWecYXYXXXXWWVLLONNMLLLJLORTĉ_MONLLLMMLJGJHFhcVE?>cgPdpiaVMIHJKII[fc^XQGLcnc`daflnpmWFFHB@>>>???>@FIGFEDCDCCCCBBDCBBBB@?@BDEEEHIJKQND=>>>=<<<;>:KoaG<<;9:8;@<;;:=:<=<>=>?A@EJIE<=>CHKE=>>>><:88778:;DGACHKNPSTUSQRPJ>8:BEEBA@??????@@??AC?:876666678987667778689EK;787777899::;;9;=>==;:?JVYXWXZYRLDBJOQSTRQPOOOPPOOONNNMOPQTSKKTRA87?GMT[Q>57:<;8668;==:9=98bdY\hpomkmjP@EA@HQLEDCBCC;79::742001456665544556667861.++,-/0224442/,,....0462.11/+-6?@AGIC:2,+28866:<941347;AA74:3))*)5GPPMF?<:9<=>=946:=<730.00,,--44,('(-7<5.-+(-6>A9*%),03355442.19426/18/5885684/-/9<4591+,.44./(&(),2886;>9:6,+.0.129@;44420111383)'')//%&*20,2:7-+****.6814<;72/5DQWNCB@6-.--07=BGJC6/4?FMOIE>=>Dfb7,+)+-.10++,--,*1;;24:2)(&-DQKA;MV1%)'(*-+)(()))VVWWWXXXYZYZ\\^``^]]]\[ZYYXVVVUUUUUVVWXXXZ[ZZZZZYYYWUSPNPQRSQQRUY^`^]\]\ZXVSSTTTTSRRQRRRTTTUUUUUUUTTTSSQPQPQQQQRUWVVUSSTUSSTTSQQPQRRSRTUUUVVWWWXWWXXXXXYYZZZ[[\[\[YXXXWWWVVWWXXZZYWXXXXUTUUTW[YXWWW[ZZ]\]_cfb[WUTTUX_ff__lwz{y~sbVQWktma_clz}odfeca`iopffihhfeeft}xsj{qffnngccdefgimnjhhjjkjijls~zwrnkq{{uzwnrvrnnrsopuvrmq{wmxvu}z`ihffddgjlowf||tbWcg\[\[ar~ymmvvv{ygcpz{z~uihggghgkg]_lqrnifeeeeeb`a_^\]]\^bdd`]]ahsjZW`Ƃbiceddegjie```a_]^^a`\XY[WWXY[]\[^^[XZ[^aceh]U[fje`[XVUTSQPSVRPOOOOQRSSUUUUWXVQNRY^]XRMKKQTROOPOQQQQPPPNNQRRQQQQRSSSQPPQQPOQRQQRSUUTSSSTTSQQQQSW[YUTTRSTSTUVVWWXXVWWWVS\ih`VXZZZXXWWWVVWYYZ]\ZWUSTTTTVWVVUTTSRQPPPPOPOOONNLLLNNORRRRRRSSTURPNLKJJLFISSPOONNOPSVZUPPSTSQRTUUTUTPPK]]GHMLNQVURSTTVXZ`a`bdc^[ZYXTRQVZYUNJGGJMLJNSWXYYXXWWWWWX^a_[XWYYYXTNNNNNNLLLLILKPIj̹eWPPMLLMNMLIGGG@YkXJNEduZZlke\RJIJKJI\ea[UNFPipc\ZQNU\a_K??FBA?>@?A@@CFFEDDCCEEEECBBBBCCCD@?>BEEFGGHIKRNA@????>=<9D:FkaG<<;::87>A=98=>>?<=@B@AABBFJOPOOMD;78:78<=>?A?==:877777766555444444456531,,,+-/>;9:98899888;=CJNVMA<=DJMPSICEHIHEDBA?ACEC?>=Dpqll{`>><;>>=;997888899:>=;@GDCGJMQTUWTOLJ?977ADDBB@@@A??@@@@@AA<986666667788766777765?TbdgT899779;;<<<<;;<=>?;>DC?<=<<>?@BFLKF@>CFGGFFGGEED>=;<@BIMD=;98::;@DIKLMMLKKKMNKC?==<;<=@EJOU[ZWPMLHA=::=@DINQRRRRQOOOOONOONNOQSTQFMXI9=AEKS\\I6779:<>?ADDD@9=9C|dfYYfmrqohaQAA?BEF@78A=942357>C6-3/*)(-AQLA=9789;>??=82016::83/4880+*,.)&(*09;3)()),4==4*')+230168431.,,34/0./0.-,/32,)1:=9362)()23-1'%*.36767=B>6/++-//001553100123435<;1.*(('(.22,&#$(/0+*('(.24567778960-++*)23--./1100/0001//../14*1:920035411,''*/0-)))(*-0+-,**,/149975//42.---,/49:88877753364/./39<;::;<::DJEB@GQVVXXZagbSIKSUA5:7.)&(+/.)+,)).9><3.++-02;=36A=5789?HMC;>?844349>=<>;0/6>A?><;?:9H`pX5*'*-/2652//11.-3?EB?;1**(1L\R@557/(''''')('((((VWWWVVWYXXY[]^acaa_]^\ZYYYXVVVTUVVUUVWXXXXYZZZZYXWWWVTQOPQQRRQQQTX\]^]\\\[YWVWWVUSRRPPPQSTTTUUUUUTTSSSRRQQQQQQQRSTSSQQRTSSSTSQQQRRQRRRTUUVVWWWWWWWXXXXXXXYZ[[\\]^][YZZYXWWWWWVXXY[\\[[]\WUUUWYZ[ZXVWXXYYYY[`_ZWXXWXWY[]`bbepyspy}nZ\s|wh^]lshbgmmhjlljhggggfcabai~yoruimvpcabbdfffjonlkkkkiiiinyzrqomls~~~{|}}}y~rqoginrtoku{slputqxxyjcd`s|s|xsd[ln][Y\ksqrpnq|s~{~wfdrxxvz|nhggeegdcbahlpoieffddcbba^][\^^^]^__^^cmqgZ\Sqfqfdabgkmjd`_aba`_^cd\WXXYYXX[\[\^\ZZZ]dhm|q\\Z\^hrm_VTSRRPOUWSPONNPQRTTTTTUUVWXXVUYab`XOLMQUTPPRRQQQRQPPOOQRRQQQQPQSSQPQRPNORSQQQSSSSSSRSSRPORSUWWUTUTRUVTTVXXXXYYXXXWWVX_hi]XZ[ZYYXWWVUVWXZ]a`]YSQSSSUVWWVVTRQQPPPPPOOOONNLKLMMMLKKMMLKKKKLLKIGGHIJMQQOONOPPPQRRRPQTTSTUUTUUUUQOQbNENRUWY_ba_]]]^`ceeeed`\XWVTRQYfptm^ULLLJKMRXYYYYXXWWWVVX\]YWWYYXVSOMMMNMLLKKIKIMI=uҗFTONKLKLMMJIGHGCPmgWYWcyn\ObqlaVMIJJJJ\e_XRMHSgj_YXVTV[VEA?>CAAA@AACEEGCDDCCDEGIHGECAABCDEDB@@BDEHHIJKNPG??????>=<9@=@`bI<=;:9:9?@A?@@A<;AJPOONI>::<96:;<<>?<<:877777655555444444456541)-.-./999899::99=BGLQPOHA>?>BFGHLFEFFFGDA?>=;>BCA@><9;98676666688877666666667CZgj]E?689=B>:999:<>AA@@=;<==>==ACA?<;:;=???AIMLD<=ACCDEGFFD=<@99=@GMB888759AGJNONNNMLKLLMJGC>?>:7@M[[TSNIHC@><;:;;:;;=AIMOQSTSPONNOOOONNQRRSMHQM>?FFDGMQJ@==AHMLKJJLLK?;7Rb>c\TfpwtmaYRMLHFE>6786@CA=<:B;2..3>B><:)5E?431+('+.120,,++4?@9.+264:>9;C?24AKH@<9888:<;:@JE96765GKCCW^>(),.022341.-,.03359@>5/0/(2ReX>00.*(''''%'.31*,.WXXWWVVXYX[\]`egdca_^][YXXWVVWUTUVVUUVWWXXXYWWWVUUWXVTSRRRPPPPQQQSW[]^]\\Z[ZXWVVTTSPNOPRSTTSTUUUTTSSSRRRQQQQQPQQPQQQQQRSTSSSRQRSTSSRRRSUUVVVVWWWWWWXXXXYXXZZ\\]^`_][[\[YXWWWVVVVX[]^\[\]\ZYVXZ[\[ZXWWUTUTUUX[[XYYYXWWWW]ec_gqqiht|tz}ukmx|l\\fc`beistnkiihggggd`\WYk{yw~}zmpxk^adabddegjlmlkkkjihhkt{jgmnloz}ywy{yy~zipolprtliyxmnpqoý~xvua]fwyub`tq_ZZhxwurnmoortikwxttx~qegfdff`Y`fckqnjfgheedca`^\\^_aa^_^_^_fmia\\Qkcje`Z_knnja_`beg`\mSZXXYYYYZ[[^`_XUXdoolh`]`dh]c{|lYSRRRS[[SQQPPOOQSTTTTTUWYZZYYWZagf^QMPTURPRTTRRSSRRQQQPRRQQQQQOQRSTSQPQUUSPPQTTTUSQQRRQSSTWWWWVUVUTTTTVXXXXXZ[\[ZXWXXXbli^\\ZZZXVVUTUUWVY\]^_[UUUTUVWXYXTRQPPPOOOOOPOONMMNMOONOTY]VKFHIGHKQVXTPRQOONMNOQQOOPOQQRQQSUUTTUUTSQQY[QRSSVZ]bgiiknnke`^[WUSSSSQPPONRYftulc^XRKILRXZYYYXXWWWWWWZ[YWWWWUTTPNMMMLLLLJJJIIF:Hl@KLJJJJKKLHGHHHEIfcHN_Q}mQSZnpeZOIJKJK^e\UPLNXa`]]_cd`XOGHRBBAAABCCFGHGADEDDHIKMLJGCA@ACDFEDB@BCGJIJKLRIA?>>>??><:9;>>Q`J==;:::;:==;<<==?>;>AEFILLC>==;8:;;;?>?@DDFFFEECA><<98=DEB?A?ZqpxT8;29BE@;98999:::9:;;::;DGGCGKQUWXUJCFB=20EEAECA@AAA@@AAA?;8777776667888776666665985JfjbJ<989::;;;=?ACFFCA@=;;<<==>@BA?=;:;=>>>?CHLJ>;>ABBCDDED65C=5;=DMA66669BJKMNMMLLLLLLLKIIGC@;48GT]UGE@<<<;;<<<<<=>><;=@BEGLRRQOPPPPOMNOPQQPMNLC@C@@AABCEDHOXZQMMLOMF::7_?0M]Wlr|vaX[UPLKKNJAEC<>>BHQPNMKHA9445:@B?=868;<5.02;;0000113574207<:;;4../0258:4.+,486433337;;:::9643359633688:50.)()(2BA1/4678@HGJCALI>DJDA9/*/1123445/+,++38857==79=5(6[gH,---(((&''#$0;5/35WWXWVUUWZZ[]addccdca_^][YWWWWXWUUVVVVVWWWXXWUTTSSUXXVVVTTRPOOQPQQQRTX[[\ZXYZWVVVTSSRPOPRSSSTUTUTTUTSSRRQPQQQQQPPPOPQQPPRRQRTRQSTTTSSQQSUUUUVVVWVWWWWXXXYYYZZ\\]^`_^^]]][YXWWVVUUY[]^[[ZZ[]]ZZZZ[[[[YVTSRPPSVXZXXZYY\]YX\ab`dhjjehqpilsrrsrkktuqmjgt}q`^``_`lwskghgedegea`_biox{|{{usth]bd`adddegijkkkkjggjnxvgfklminvtx{yynpusrrqihxunmopnwvr~}uctktvw|rbeupaX_yxspp~~ny}|zxy~|y|qt}|j`aYR^eehkigggeeedcb_]]^^`___^^]_gme^][Um``a_S\qqlhc^_dgd`[cQ][ZYXYZZYZ\`_WT^pyn`][^grwd`z`TVUR]eWMQRQQQRRTUTTTUVWX\[VQSXblk`UMOUSLOTTTRTTSTTSSRPQQQQQQPPPRTUSRQTWUPOQSTTTTRPQTSSUVXYYXVUTVWWWWWXXYYYYZ\\\[YXXZZ[dmg\ZZYZYWVVUUUUVWXXZ_c]WUTUUVW[YUSRRRRPPOOOPPOONOOOOONS[cj]LJKIKQX_cb^[YWTRPPNMOONMMNOPQPQSUUTUUUTRQT][[][ZZ[]`deffdb^ZWTRPONNNNNMMLKKKRZacdegi_SLOXZYYXXXXXWXYYZ[ZXWXXVUTSQNNNMLLLJKJJJEGDSCHIHGHHHIIGGHIHEITJMSPPmgMXYfoi_QIKKJOeiZRPNSXYX[a_^aZKKUSSEAABCDEEFFFGBDEFIKKLLLIGC@@ACFFEDBBCCHJIJKNNE???????><;9:><;:::89;?ABBDFCB><;=??>>@@<=BKOJA?=;:<<<<==;9887887776665444444555554125651,368999:@GJHE<9:868:;<=?=>?BEEFFDDCCA@?>;\lbG=<9899:;>BDFJJHDA@?;;<<<<<>@@?><:;<=>>??AFKC<?@?;99;<\Vju|r\[^SLONMMOIFEF@@EKUTROJEB?:866>=;972--1335787674-((**5>86<;0+/8BE<2276552265212++9:1++*('-6<96562/..-)')2:=><742,,.,(,37620121/,,-+))*.,.<6,,/.,)'*52-*)))('''')*.45.*,,)))++*+,./0131+,++)(.:CC?9532,,54.,,,*)(&%&'*29<91.++++,--,-.1462-*+./00/241+,/6>:/.17840-,,,,+*)(*--.00/-079512430/037?@<868>><:630037?>8@FC=CKS[VILQ`}jHTS3)213322,(-5=:/*-,+*,5>90-+--.3;6458;AC<35777>@-)04510;A@@<3..-.9D@BLD417?E=3234668<<8221..6:;<=B@>DH<*@CEFDEFFD?=;=????@B?;=GRNC>;;<>==>?<998888877666655545555444444999960369888:=A>9644677:<>==>=>?BEEDDCEEEECB>=;96:=@?<<<=???@??><::<=>>>@??DFA=?ABBCBCE=34DA99?IC99>HQQMMLMMLKKKKKKKJJKIDA>?@B@=<<===??<:;<<;;<;<;;=;8:CFHMQRQPOMOQQONOPJC@AAABA@ACEILMLMMMONDB?D^?RL@YRdx{iT`_RLOLKJIJKFCJGDDIJJIF@=><:857>DBADGD;2,,1.-1346666778;<67<=<=:424798776668:96642117>BA>>@>5.**+-06863251+()-775?HE:.),5>=9;<<<;99:6225004553,((*08<85330//,+*).221333331..+(.443201210-*,/,('*,,42-,,++,+,76-+-//,*))(),2541461,*((*'&+.//142/00,)*3@A;8740-*/63.-,,*)(%%%%&'0;7-,++,.01.,-0221.)()***,1531,&&,6>;878830,++-.-+)')+--//,('*-03352./4<@BA@?ACE?;;84/05>C;9FHGHGMRNNNC:;BDIPWYM>=EJQB7D<()04::62+'3961-*)+*)+/470-)+-/37300033551-,.1/+)-/354;=83/-++,03469:93.(&5>:999;>:;BA7553013457?B>?BC>1AXA,/-*)(')))(''%(8@:6WWXWWVX[^^`cc\TQRUXZ_`]\ZWVUUUTUVVVVVWWWXXXYZ[ZWSPPQSSRRPPPQRPRSSTTUUTTUUVUUVVVVVVUUUUSRRTVVTUUTTRQQQRRRRQPONNONNNNOONMNOOQRRPPQRRQRQOQSSTUSRTTUUTVVUWXWXYYZ[\\]^__`a]ZYYYZ[ZYYXYYZZ[[\[Z[[\\\\\__`ZTWZXTSRQSVXYY[Z[__aa]Z\^aadihhfedegmctqjg^baa`\\gupb]isigefgiiebbbdkrssy}|}~{i`bc``bdeecchjjklifmxxmmsleghilr}vqtvvwwx~vpspnjhkmmmmpqoruy|t~y|~~z||lixvpd_kqspr~y{mhlolptؽvOlwkilkigdb``_^^]^]^^^^^^\akd[Y]Qa_^e__pvd`__chd__S[[ZYYYYYYYZ\\[Zhnga][]bisuh_YewXWVV]XPNQRRSUVWWWVVVWWVVXWTQQPRaqgVTWPJLSTTTUVUVVVTUTSQPQQPPPRRQPPRVWRMNQQRRRRSSTTSUWWWWVUUUTTTVXZ]a`\]__]\\\\[XXX[]_]]bfc_\[Z[ZYXWWWVVVWVVW]c_WTUVWVWWVUUUUTSQPPOPPOOPPPPPPOOOSXWVUV[cdedeeec`__b]QKJJKKMNPPQQOPSTTUUTTSTW[^`a`_]YXUTSTOJJNQRRQRQPQQPPOOOOOONONOTWZbdb`__^[YXYYXWWWXYYZZYYZYYWUUVVUQOMLLLLKKKILM@ەAGGIIHFFFGHGGHHGFIUZNILLMHVscQ[hfYPKJKUidTMIJW]RS\bZXWOGINMHB@CHGGFFEEHHHDIQOOPPOMLKHDBACFFGEDEGCJNMMKIA>????????==<=>:?NIC=<:;>BEGGFGGGFFIF?<<=??@@@B@==CORF<;==@?;8999988776666655555554444469:;<=7358788:<;6589:879:<>>><<=@BBDEDCECECA>987445:><:Fy`75989=BDA><;;:989:::98889BGFDGNQTVNB>A@?>?BEFDCBAA@A?><666765555677666666665546768;95=Wa@9::::79ABKEDFIIIHFD@=<<;;=>>>>??>?CC??ACBBADF>8:>=;9:@?==BILMMKLLLLLKLKKKKKLLHAACB?>@B@>=<<@@;;;:::<<=?<<>><=>;57<=?ADJOOONONOOOPPME@@@@A@?ACEHHJLLMRTG9BGCN7FXTTQewz^=R`SECBDDFIMKB?@D@2*++*--//02/.1104;?=;=::<97664765565668854432.0?D;8?C?4,(('(*283-)/00+*,33;CC>9.*-5<<;>@@@==@<85///1225<5((.49=;77740-+*-320,(,,.259:2+,2520020-/1/,-/0+&),*-63-.,,-,+3:7/),0.-.,*(+042/351-.0--+*/022479:5.+(+6E>2/-*(')160--,+**)'(((&!'65,+,./131/-02//0-(&()((,10+)(%''*8<><82/.+))-.-,*')+--/+)'%&*03331-/5>>@@ABDEC<7665329@@:BLHIMJJPQQTPHFEEJQSPHDED>8330-(+136683*&4>1)*,)))*+-/220-..1363/../-.0..02547;52332.)(,/-,*)..-+'(')3:=?>949<><99B?7765322027=>868?@=CJ6.0*(('%&+-)'&%(5@<5WWWWVUX[^`^[WSRSSQQSUZ^]YVUTTUVVUVVWVWWWXXYY[]]][XUQPOOONNPRQQSSTUUUUSSTTUTSTUUTSTUUUTSSTUUUUVVSRQQPPRSRRRQONNMMLKLKKKLOPQRRRQPOOPQQPPQSSSSSRRRSSSTUUVWXXZZ[\\[\]]]]][WWXXZ\ZYYYZYYYZ[]][ZZ\]_^]^`c`YWYZWVUSSUWYYYYZZ[]_^[\\_a`ceigfefhkifmsyvlkjkhebZ]efb`uyokgggkok_^ineix{h`cdb`acddbbfkkikprttmelwnceghl|ymoqtuuvw}znnoliikpnmvytuwx{{w{{~~|pmwvpebowuqs~~}lakqwtخc[n|vnlourgb`__^^^__^^^^_aaaeocXY`W^gfe_cxxahl`_spH]ZYYYYYZZZZZZ\Zaila\\ZX]jv{q_`^Uh[UVWVROPQSSTVXYXWWXWXXWVVVUSSRORehXXVLSXWUTTVVVVWVUUTSQQQRQPQRSQPRVXUSRRSSSRRSSSTTUUVXWYYXXVTSTVYYZ\]_aa_^]_^]\[[\^``^_babd`\[\[YZYXYXVVVVWVXch_TUXYYXWVUUUUSRSRQQPOOOPPPPRQPOOQWXWY_eddffffd`^`b^TMKKKMMMOQPPPPQSRTTVUUTTVXZ\XUSPLKJLOSK@AJPPQQRRRSRRRQPPOPPPQRRSTTVXXW\kri\XXXXWWVWWYZ[[[[[[XTRTUURPMLLMLLKKILMDmuBJGKKJGEFHIIIHIIKQWLHLKJNMNt\@?_i`SKJKSec`\SLNTRU_aZVQLIIJJF@BEGGGGFEEEEH??@@@=>==>;=IHC?<<@FIIJIGIHIHFFD=<<>???@@A@??BJNM@;=?>::899:999877677666655554444569:<>@<55668::;9887:;9:>?ADB@==>@BADFED@<<:986554458988:f\557568BDDGLQRQG?=??>=>BFFFDDBAAC@;7545664444788776666665446888:977I];6989:75BYXGDEILKJHGB?<;>HJDBCA?><;==>???@@?BB??@DDBACC??A@??==?@?>AFJMLKMMLLLKLLLLMMNMF@BDC@@@@@?=;:@@;:::::;<==;;<=<==;:;:<=<;>EIMOQMMPPNPOIBA@AA?>ADILJJKLNOH;7FOAKP=I`[UjytO-C_T8:?BBDJNPF0)4>7BRQQOOK=02768=CIKB3-*))+..--./.,*)*0CEA7;A?::963232100,,/46758=<6-++*.10.-..../1250,.330..22./122..0/)()))/0-20/++*2>;9750+,./--,,//0111-3GMEA9.(+./.-1A>887752//28<<306=CACA5/*(&'(+.2561(%'-762WWWVUVXYZ\YTRRSTSQQQPRX[ZXUTUVWWVWYZYXYWWYYZ[\]_a_ZUROLKLOPRRSTSTUUUUSSTTTTSSSSSSSTUUTRSTUUTUVSQQQQQRRRRRRQONMLLLJIGHJMPQPPRRPONOOPQPPQSSQRRQQRRRSTTUUVXXYZ[\\\\\\[[[ZVUVXZ\[ZZ[[[ZZZ[]]][\\\^^]^`aa^YWXVSTVVTTXXVXZYWX\]ZZ[`a[Y`cfdeffikf_hnz|}rttn`UXgf`i|yqlmigioqe[lxmt{h^`bbbbdeedcdjrojryulhfjoslihcjnrpossuux}zmkmmlkmoomz{w||z{|w~}}~x|vmuwpfapxvtx{~|~ujkqkblg__hjjiqzrfa`^^]]^___^^^`affgpfW[aObaec]dycn_cڮcW[\YZYYYYYZYYYYbhi`YYZYV[n{i]^`NPs}\SWWTPPQRSTVWXYXWWXXYZWUUTTSTTONYe\]VMU\XUTTVWVWXVUUTTSSSRRQPRSRQTWYZa_WTUTSSRRSTVWWWXXZ[ZXVTTTVXXWXZ]aa`_aba_^]^_aa`__b`ac`\Z\\ZYXYXWWVWVWVU_jdYVYZYYWWVUTTTSTSRRQPPPOPPQRQPOOQVZZ[agecfgfdb`_a_PJIJKLMMMOQQPPPQRRSTVUUUTUUWWSOLJIJJKNQI?@INPPQRSTSSRRRQQPQQQRRTSSSSQOMQ\fmh]WXXWWWWWX[[[[[[[YSPPPRSPMKMNMLLKIKNKHeBKHKMKHHHIJJIHJMWZKDIMUWWWNEHF9G\dVKIHJJQTWYLGNQW_^YPNKHIIJGDEFFGGGGGGFBI>==>==DEDC?CHJIHHJJKLKJFAA=<<>??@@@??AACELRC<>@;7:@=8899::99877777766665555444579:=?@@9644579::98799:BHJKHGECDDBA?BFEC=8555777677765659WuzP355347;BFFDA=<;;?>=?@AA@><=BEHMQPJB?=>>>=>@CFFECB@AA>8544565434456766665666655798777618QI3988997:P\OEHFKKJIGC@>;=<==??@@@@?@@?@EDBA@@@AABCDEDDB@>BIMPOONMMLLLKLLKLNPMDADDBABA?AA>;9=?>=;:;;;;;:<<:;:::;;::<=?????GOPOMNONNPLDABAA@@BEJLKIHJIC:79AI>=VUDL[Wiv`9,6HP03>@?AFPVO:'(8?9DKPRRPD418715BMO>.-,**,/.,+,..,)&(/FE949B?<;<:3133200///00025:<5+)+*,--.2120/..++,.021.--.132233/-//+'((((*-1350)*5<;5-)%&*/0+))++))(&')*.21/1335677882,)((1=:1...69435()3=8-*-1/-/260)*1344761118<2+-.+))*,,,./..-+('(((*/353*'*.0-+/220132/'"%,5;9540.23101:>?CBA@?830069;@GGDCGJKNOJKR__PEBBLNDCKORVSHA:449A7543/0-*&6K<(*-,('*,+,1790467;=8972/21-+09=:9>?EC;898784224898206=AAB<3-)(*&(7CA=><1('+-+)WVVUUVWVUVUSTTTRQSRSSRTWZZYWUTTVWWY\]\[YYZ[]^]\Z[YWWUQLKMOQRSTTTUUUUTSSSTTSSSSSTUUVUTTSRSTTSSSRONOPQRRRRRRRONMKLKIFFJMMOONOQQPPOONOPOOQRRQPPPPPQQQRSSTUVWWYZ\\\[[[ZZ[YWWWXY[[Z[\[\]\\]^_^^^]ZZ[\^__`_\ZYVQPSUUSTTUXZZXW\c_YY_`YUXZ^_abeijjgghq~szzf_`dikowtnkljhegoofiyyxjeea`dfedfgebjvwoosojlkhtwq}xqrpruutuw|volmnoonnmlyzz}}}y~{z~yp|wyv{sikrwvwyxr}||~yjkboɐutkbcccbinha^_]]^^^__^^`a_bnbZogYZ_YdY[[Wgxi}{^vtT][[YZYYYYYYYXWdmeYVYZZYU[rt`ZYURWcg]ZYXUSRSTUVWXXXXYYY[\[XVUUUTTSQRU`edVQTUVTSTUVUVVVUVUTUUTTTTRQRSSSTSTbcYUTTRQQSTVWWWXXXXYXWUTTVWXXXXXZ]_`acccb`_```a``_`_``^[\][ZTTWVTWWYXXVVYbjdVXYXXVWVUTTTSTSRQQQPPPPPPPPPNOPTZ[[^cddefdb`acaSFFHIKLMMLMPPPPPPQSSUVVUUVUUUTRPMKKJJKMOJCCGJLOQSSTSSSRRQQQQQRRRRSTTTQONNJJYb^YXXWWWWWX[[[[[]^\UPONNONMKLMLLLKJKKN?VAIGJMLJKJJKJJJLSUOGBIMX_]YLJJD?=GZYMJFB><>BIIFJP[_ij]PJIIJJHIGFGFFFFEEB@JC?KQTSRRSQOIDCCEGGFCEHEEKNMMFBAAA@@???>>>====>?ABDCCGIJJJJLMNQLGC??=<<>>??@?>@BDDAKVF>>?:78=;8799;:99877677776665555456579::<>@<731478:<<:9::=JQQQNMKLNOH?65@IOQMC??>>>>==@CFFEDBA@>;8655655433432455556787767888777721ER37878@ICCQPJKEGGHHFDA>=>?@@@???>?DDBA@@ACDDFHJJIC@==AFPOONNLLJKKKKKLMOKDBCBBABBABA=;9;?@><;;;;;::>>>====;:89:;<@C<8>HIONMNNMOMFCCCABBCEHJJGED@>>??>@=9M`YIW]ijA295:N92=;5<=IVUD2.>F5602<@<99982,,6:6542697743.10,*,-*)+19952210-,-.251-+*)+/23331.,+)'))()*+-2;9-*140132-'(,/,))++*))(*,+-./.+.243/.//1-,09=;:568:@A937,+2<=400/.0233.((*+*-121/044-,.,*))*-0122101/)(((()+.31*%(,-,,-/079970'%-7;:6210153,-08;ACA><<94/.49<>EKMIFJLOTUS[bYHDDHRQFDJKP[WC<854>E79>;5310*7NF-(-,((+,++,4D6478:869:1-11,+/699;>==<<<<>=;@DEEIIJJKLMOSQIC@>>>>>=?@@@??BDFFCDRP@=:846::8889;:99888677787675565457778978:<=:97:==<=?=;<=?KUUROONPUUI<>=<=?BFFEDBB@;7776775553351-1345569<=9899999:;;;7:A77:78BLNMGGKHHGEFFECA?>=FRRKJLLID<:=>>>>??>?>=>=CFDB@@BEGGIKJLKFEC>;9;=>><;;;<>>>?@AABB?<8778<@B>96=CBEHLNNMNNIEDCBACDDEEDB@@?>@BBB@>=AMbcfkmV,3BFA=83<;4:4?;;EE719??:66:>>0(4@<76:BGDB>:2++1/.0+,05742134111/-294+*)'&&)0442/*(''))))**+1<@90,,),375/++--,*,020+*,,*++-/(+11.*+-00..7BC<78;>?@A:39533443100////-+*+)))*+-//...+,.-,)(*16860///-*++**)))))&%%')*--069;>=924995530/022-((,08BD@=::94--3:::=EMIDILLRY^c`P@AIMSTLFCCL[W;2345<73>CCA@A9.5LR9(.0**,*)**-A=5@D;45:9/,12,*.369=<4=MRX[O7-250.,-/:?95227:4+,2:AA>;>>AE:7@A9:=:695,,5:7689==4/12-()0791&'/1*)33-XWVUUUTUUUUUTTUTRRRRV[][Z[]\ZXWUSTTSVXXXXYZXWXUSRQRRRSTSSSTTTTSQRRRQPQRSQPQQQSRSUTTUWVTWXVTTSQOONMMONNNNOPSSOLLLLMNONLLOONNNMMMMMMMMNNNNNNNNNOOOOOPPPOQSSTUX[\]]]^ZSSVWWXXYYZ[\\]]^^___abdda_^ZX\]]]]^_bed`XSROLKNT[]\ZW[a_ZWXYYYVTSV[_fkf^`wzsh_bhnjjwwhckmdbhkkkhglsxx~tgemlggfeddcbddgrsidhkiihhhrrn{tkmqv|}{vrx}umppqmjhis|tv~~egdcivNzݱkfkghl~~{yywxuw{}{yy}zz|z|qhzypmihunn໹kinnnllic[X_c_]]_bcba`_`^]bhgYV]\Zjx|qc\_Rc~pu߄O_\\[[[[[ZYXZW]jaVYZYXXXY\cif]WSTUW]\V`h^XUUWWXXXZ[\]afijh_ZYXWWWWVTVSQYi`QTUUTUUTSSTSTTSTTTUWWUTY[WQPRRRVb]TUVXYZXWWVVXYYZ[[ZWXZZWVVWXYZ]^____accccba``b`YTRQQQPLNUXnWmxYX`_\XVVXZ^[YXWVVVVUUTTTTRRRRRQQPPPPPPPNOQV[]^]^`bb``edYQUYUMKKJJKKKLMMOOPQRSTVXYYXWURMOSPJIKMMMMLMKHHIJLOSUUUTTTSRRRRRSSSSSSSSRPOQSSNOXYYXXXXXYY[[\\]]]VOOPQQQPPNLLLLLMLKIKHRCGGDGMNNLKLMOQUTI?BEFIH@GVTNE@?JCGKQQMGBBECCCCCHLWQK|gONPMKJJIIIIFCA=>=>CI>EINOS[ZWSJDB@CGHEFKMABKKKGBABB@A@?>>=>=<==<<<>><>ELPRPNMPTK=7=CGB967877789;;<<9457/0Q{A:888:99:?@>?CEHGDCGFFDA?;8857?ORG;;??>>=<=?BEGFDA@=86888996653553/0247768BC:9;;;;<<=>=;54::::>BCGFIFIIIHDCEECBA?>DQVOLMNMG>9<=>>?????>><=BGFDB@BGIJJLLJHEEGGFDEBCEGGIKKKLMMOOOKGB@?ABBBB@?><;;;;<<;:<>???@@@ACA<62356@JG=:9BG@<@JONNPOJFDBB@AAA@>===>>>??CLMHA8;Vpvlb?$+2==,-0;:87.1;DL;4A@220//5>GC;9826=<86435>@8**7>>?A;7762395/1440-+)''()1885678788865430,*(+/--6ACCFA9:85:B@84008EH;,2>;37GPNJGDA=63:>74/-00.-,.020020-/41)(('&$$*252/+(&&))(***,0;CB7,+-.0562.---++0871+)*)())+,+*-.---.0/).>B?638?BA@;83115630.-0540-..,++**+*'&+/-,/..//.*&)9>:/-/-)*+,,,+*)('&&&$$*0369<::==:8971053/-/0-*''*-8BGFA<;95236::87:BCBJJHKMacZE7>HKORLB<;ETM2)3;:3-7EFEIIFA1,CTB)-4+'/2,+**2;AONA4260(*33--.,,288--0.474/,.2>D8/15994-(,8CB=:619IH@DG<996463-.322337<<8412-*...02.**)(*-,+YXWUTTTTUUUTTTSRRRRRVZ[[Z[]][ZXVTSRRTTUVVUSSSRQRSRRRRTVVVUTTTTSRSRSRQPQQQQQRRRRSUUSWZYWXXUSTSQPPQONNMLLLKLOQNKLLNQQOMMLMNMMNMMMNNMMMNMLLLLMMMNOOOOOQQQQQRRTVY\\]]\VPOSWWWXYYZZ[\]]]^^_``cfddggc_]YVVY^`dfffeb]VOLKPW]^]ZXZ^]XUX[ZXWURUY]fke^fwvpkc_bpyuvqfkogbglnpmek||tz{l]\cfggeefccdchpnedgggghhfgfbeu}utsu{zvy~roqwqhhhm}pit}rejpffijTrcma`f{~zyywvx}}|{yz}zz|||||~~~motlgjkosyrjescSsrlmmifaZY]^]]blpjdb^[[ciepoXT\^[lvxjgk]dyoQbZ\[[[[\[[[ZUZ^XXXWXXXY[^be`ZTRX]_hledb[XWVXXXXYZ]_bfhedb^ZYZYYWWWUWTPWd[OVYXXXVUUUTSSSSSSSSUXWVXZYTPSRTZ^XSVWXXWWYYWVWWX[__]ZY[\XVVVWY\______acccccb`_]^bedeghhigs]_`MQ^a`]ZYYXXXYYXWWVVVUUTTTSSRRQQPPPOOPPPNQSW\^^]^```_`d_ROW]ZROMIJJJKLMMOOOOQQSWXZ[ZZWQMQTQKKMMMMMLMOLGFJKLRTUUTTTRRRRSRSSSSSSRRQONNNNPPUXWWWXXXYZ[\\\]]XOMQUWVVVTPMKKLMMLKJKIM~>KIGGKNNKJMPRVXTLCADJEB=@JKIAHDGFHJMMLIDBDCDCCCIQSL?_rVQTRMJJJJJKHDBB?=BDFGS^^ZUME@BEEFEFLK@AKJJEAABBBA@A@?>>=<==>?@CHJLLLMJJLMONC>@BBA@@??>>ACDCDEEEA==@PH3524579999;<=>>>>=>?===:87876778:;::;BGHHGGHHH@:87899?<;?CEDLNPUL:369@E=688777899:;<:755454>>=<<=?BDFEC?<:88988987779:862/032028>?;:<===>>>>?=86557>IKFGEIFIIFGDBCCCBA?>BOWSOOOONB:<>????@@A?>>>>>>>=>A:1.0/7IRI=<:>ED>AGKKNQOIEDB@@?>=<<=>???>>?BHLNNNHPadbV5*--172116331+,/9A@31.-+/8<75:;:987>>>?JUSLOSQPNB41000013330267=AA<0+18;??633248?@94210.,++,-+)+047;@@>83/-+./+)).413;BEDE@50-3=?<5/,,1<=6/2;914HZXMJHFCDBGQI7.)*)())*+--,./0/-,('((('&(.420.**)())+--..4BB3+.022342,*,,'(4=4+)')+*)))*+(+,-.-,-.(.B?8216<@B<0.2.+021/+(+021/0/.+*))*)$!&++.000100,'-=?5-03.+,,,-,-,+*++*()+/47;?A=;98887312330.--+)&'+1;BHJC9898878::987:@DJHAD>PYT:1=EFJMG@<<>C:*.@E9.3CGBIRK?;0*;PG.,50&3C>0'+2?NSNF=43/*+02.-+'%)13,'-8>;.)285/.145>B4*2=>:<>7+(2:AGB59FH??C@@>5362--/00017;=:411.-01332574-+-*)+ZYWUTUUTUUTSSTRQSTSSVXYYYZ[ZXVWVUSRTUTTUVTRRRQQQRRRRSTUVVUSTTTSSSSSRQPPPPQQRSRSTUXZ\__][WTTTSQRSRPPOMKKKKKKNNLLLNQQPPPOMNMLMMMMMNNMMMLLLKLMMNNNNOOOQQQQRSRRUY\ZYYVSQOOSTTTVYYXY[[\^^_`bcddcdffffcZRS[bcceccgie`\YRPQTZ`a^[[[ZWYZYXYZVRTU[egb]_nz}~uneeeaao}~vkkohcfjnqwqgnrsynl~qaX[bfgeeiiebfmnicceeffggeeehiip|wsuyxkry}{qnupmkjiwugrxhkjv~edeg{``zdhbrcadqt}zyxwz~|zyyyy{|}~~{y|wigdippqsxyih`zTVoqmnlic]YXZY\Ybuugab\[lmclxrbecfwlefhrrqSa[[[[\\\[\\[XWWYZYYXXYY[`fe[VSS]fjklnjbYWWWVWYZ[\]^aca`_^][[[[ZYYXVYXPRTTS[^]]]ZXVTTUTSSSRRQSXXVUX^ZTSRTWWVUUVTQQTXXVUUUVY\]ZXXY[YVVVWY]______abcccb`^[Ypźכ[MKbla`a`][YWWWXXXYXWWWWVVVUUTSRQPPPPPOOPONQSX\^^]]_`____[WX[[YXUPLJJJLKLMNPOOOORWXYYYYWNLSSPNNNNMMNNMOLIIKKJMQTUTTTRQQRSSTTSSSSSRQPONOOPOPTWXXXXYZZZ\\\\]UQSVYYYWWTQMIKKMNNLJLJLnBNLLKMOOOPRTUTTRMGBBF@]k_\VLHJMKKLMDBDDEDDDJNGEIMmwZRVRMIIJJJLHFHFD@??J@CCABO_a\WNE?BEDDEHLIA@NIHEBCCCCABA@?>><==?@DGKMMNNMMLMQSOC8>?HP434:7799::;<=?@@>=>>>?>98987778:;;=<>>??>856777BKIFFF?BJTUB5667@B:8887788988::975699:8>?;8:9:;::;<;>FJJCAA?;:;:9988:;9=JME?<>>==<<=>@CFEC>878::9888778=@9651-24319;==<>>>>?????=:9425@KIIJKJKJLNG?AAABBAA@BLVWSSQSUF:;>@???@@?>>>?BFHGDACIMPSQJ>868>ABBAAA?@>@@=>BIQTWUO[J++38432121///-/05;A?CA=92148::76436:>EB30...-,.46/((++19==:80)&',-*()277=EILF>62/+04551-**+-.,+1<<66@U`YSQNKF>BXT2))*(()**))***-/110+(())))(*021322.('*-11/-/;<-(./26412.*)+((683../01.)+341.+++*)))*2511/-(''((&%%)-12334100/5=<5242/1.,,,,+++,,-+,26889;?A?:75788642441.,-+)')-29AIIB759::989:::9:AEI@2519JL99CB@KLD;9:94*)12=GA=FOC50,)3GJ9491(1BB/(AZc]ICEC@DJH7.//+('&'+/-)(*,-,)185,*483.'&-=H;.0:CHE@CH@510.,-/015:;=;/).-+.01337?D=2./,)[YWVVWUUWVUUUUTRSUSTWYYYWUUTQPSUSRRSSSSTUTRRQRSRRRRRRTSSTSSTTSSSSRRQPOPPOOPPQSTTUZ_^^]ZXVUVVRQTURPQOMLLLKJJLOMLLMMNPRSQNMMKLMLMMNMMMMMLLLLMMNNNOOPPQQPQRSSSUWWWWWUSQPPPQQQRUWWWXXZ][Z[^aba```_`cc\TXadccba`cecabd`\VQQX^`_][[ZZYXWW]`[XVUW[^__acglifacecahx{wxummridjhbdkj`_ddfek|m^[\`cdedeifcjmiedcefefggijggksyzz{cbhytmqsvwm{yqcjygeilpz{flehnxtX\`bconzkaeditvm{}|zxy}~|{zyz{|~}~tl_[glmssvoffvqvtnjppplb\XWXXZY]dgebbWfge{qz~m^fesrxzdY^[[[[[[\[\\\[YXZ[]\[YYZ[bf_XVVY`fhgipuhXVWWWWZ\\]]]^^^]]]]]]][ZYYYVX[VSPQY```a_]\WTUVUTTSSSQSVVVUX\[XURSVVVWVTSSVWWWUSSTUWWWVVXXZ[ZWUX[^____```_abbb`[ZrًRaĭs\`a_]ZWWXXYYYXXXWWWVVVVTQPPPPPQPOOONOQTX\^^]]__^]]\\\]][YXVRNMLMMKJLNPQOOORWXWWWWTNNSSOOONMNOOOMMMMLLJHINSUUTTSRQRRSTUUTTTTRQQPPPQPOMRZZZZYZZ[[\\]][SRXYXXXWWTPONLKMOPMKMIDYFPOOQRRRSXWWUTRRPOKA?V}us\BFNQQRNNOFCDDCCEGGGGIMIZtbVWQLHIJKJLHHKHHDBAIB?A@@L_b^XMCABDFFGIKGC@RJEEBCCCCBBA???>==>AEJLLMNNNPOQUUPE;7=EDCBABBBB?>@BGFDBA?>>>>P@34;89889::<<=>>===?>?><::99778:;;=<<:87687669==;989=CRXODDF@CKK?8869A?98889887787899757;;;=;::899:8::;:=BHHFBAA@>=<;996438<<<<==<=?ADEDB<669::9888777<>8684,8SX>8;<==>>>???@BA=89:64>KJHJLOMJORG;>?ABBBBBDJTXUTTUTI:<=?=>??>==?CCBDGHE@BINSVRI@?>;669=BDDCEFGGGGHIJKMPMGA?@BCBAA?<;;;;:;<<;==<<;;<=>=:@CBA??AHKA:=@DGGEDCA@@CKQIAABA@@@BCCBA@AA@@@==<=?CLYa_K1*5=631/11-./.34339;=E82..28;87861-,.../3;:7676C>==>;=?=;976779@=5421/-,1792*+,,1698997/))./*(*4;>DGIJD8321.-+*/00000153.2<=;<<<==<:85678753350++-.*('(+.6?GG@658887655788:=@C8(+(+8768@?=EG>2++,*()032/3::51353,+)&+;F?<;/(*../GpgIADDGOYR9/64)&)(&(,-+)((((+054..244;>59JNFEJIJOI1!!)8B5%)>PRFJMQPTVUSUWYVSRRRRRRNBM}xMWXVWYQPQFEEDDDEHDBGJLLQhi^YQKIKLMLKHKKLLGACKK<==@H_c^ZNDCDFGIJKGEDCQJBCCCCCCBB@@??>=>@CINNLMNNORSXWMC;8:?DBBBABAA@>>CGHHDB?=<<:38L:69:99::::;:;<<<==>@>?>:::9878<==<;<964465437:?@=<=>>AID:8FFCBBA856;A?:9:::88777877877:<===<;;;;:748>A@@>=<;:;===>?ADED@9779988887778877994,ApkA7<=>>>??@??ACB>=>=;8:GLHJMQNF??@??@ABBCDEEHSXVVWWXN:=<===>??=8?FGCADGE@AIQUSLGDEHFA<;>@<=====?><;<=>=<;<>>>>=>@BCCCDA<:ACCDBBBAAA@@ITQF;>>>??=D>;BGFGE@??:7415;777730++3994+)+-24545564/.1/)&)4>FHAA@<841+,.)(18:;AA=9@KH7.++/6885)'***,0.+)('&&&&*6<4*()*+*(*-17>;30.)(14./.03,)*(()*)*00(&.784,,022/..)(,10,.24.(-56660,+(*,++,,-4323222101443673236743123210378742003874.))),-,,+*)+,-,+))*-/027==7356889:;9870,./.*('(+.6=CA9346777679;=====;3/2*'++*,19;697.((%03)%)*+-./,('&&'+,/5;B=:80-551Fkq[MGDEOQE4*38-&(*)(()++**))()/30/0123799DTXLDILHPZI0+&!8OB)*@STB8BC0'*(*.049984*,A@.-4?JQSB22698:@D][XWWVTUYYXXXYXUTSRSSUVRNONLMMMNPRRQQQPQQPOPQRTTTRRRPOPPQSSSSRRQQQQQQPQQPONNNNMOPOPPNMJINSTRPRRPPQQOMLLLLKJJKMLMLKLMMMMMMLJJMNNNNNNNLJJJIJJKMMMNOOOQQQRRSSSRRSSTTVYTPQPOMMNOQUTTTTTPMNQSSSSTTTVWXZ]]Z[^`_addddcbehikkg_ZVW^a`^]]\Z]gf^^^\YWTSUVWZ__aelojfdcgjmmomgmsonljikhfiiijdpiwpi`_baabbbbciidcdeebadedeeeeghgjwzzwtzvemttrno}s`cfb`eijjkjjkhgfjxzsmoofagrt|olbcc`^dxugfhbejdfbewzomorlklmsy|||}{{~vs{fdlfahllmonmlmkp{~tg[g{u`VWXXWWYW[s}j\Tw֝fzvZ]fvƮ|f^]WSOWy|dY`[[[[[[ZZZZ[[[\^]\\\[[[Z\ZYZ^_\\^_cgjlqpaYWVWY[\\\]]]\\\\\[[\]][\[[[ZZ[XQU^`aca`^_``^ZVUUTSRUUSSVVWXZZYWTVWXYXX[][ZXTQRSTUTVVVWWXZ\ZWWZ]_`_``__`aa`][Ugšݑa^~daaa`^[ZYYXYYXWXXXXWVXWXmh]VTTSQQQQPOQRV[]^_^`ccba_^\]]\ZXXZcaVNMLKLOPQQPQRTTTUSOMPYZRMMOOLMRUPIJKMLLJIILNPTXXUSSSSTTVWWWWWWUTTSSRQRTWWVXZZZ[Z[]]]^WLJQUVWXXVQRWUOLMNOONMMJPRTSSPW\WSMMLNORSSSOH[qHOWWYYURQQEEEFFGCAEIKLNN\li_QKILNMLIHKLMMIEEMO=;;@C_c^[OHDEFGKNLEEDEPJ@BCCDDCBBA@??>>>AGMNMNOOPQSXWM@:999=BBABA@@@<<<:6.)JC:::9:::::;;;;;::77:;<=;<:888:>??=<<;977556667<@A?>==;<>:5EQLGEA846;@?==<;:89987876679>>>=;<;;:;:878:=@CEDBCEA?>=<;;<<;978<>><;;<;;<==>@@BFGC;7777777767767765:><5Dq^<7;>>>@@@@AA@AB@AA?@C>:CGJLPLA88;;>>>>>?=9=ACDBDEE@AIRUOGFEGGGHFBAA=;?AB=CKNKIHHJLMHB??ABBBA@>>>>>@B><::<==<;==>??ACDAABCCAABBBAAA?DJGLM>5:==>??@?@AAB@?>=<=?@A::K_h]HA@@<76431255:95.+0;>.*1257;<:6640+*+-.02555:IQRRLB;8964?LM@/+/0/4@C?>BEFC?=>CC>9578567641,+4;:5,()*.23310/00021+))2>F@8736<<6/+*-4:?CHLPSPPNE=;>@=79<<9755224:9,&'(,/.,*)*(&''$%0><.')*,*(*+,1772//+(-45750.+))(&%&(').+)/782,-3651/,))+-.--//)&-7752/--,1313444424665431169656407;888744542023222443200,)'&),,+**+,,.,+**))&"&2?>428==<:752340+'&(,169<:5135688:>@@@@@@91/4910882/-8:16610/,>;))())**++)((''+5>DCB=77:?FIOfwsgWMKGDELG2&.7-#%('((()++-01241175//////07FSYQCFRNIUUJ@>-*PeM3;QQF=:91(%(,./24248/+>LOLFM_g^H712:C>=C^\XWWVTVYYYYYZ[XVUSRSSSSPONNONMOPRSRQQQQQQPQSTSTTRSSPPQPQRRRRQQQQPPQRTTTSQONMMMMLJJJKLLKMNNLMPQONPQPNMLLKJJIIKKKKLLLKKLLLKIKNNNNNMNMLJIIHIJKLMMNNOOQPPQRRSSRSSRRSTXYQNONMNNMNRSTTTUROPRRQQRTSQRTVX\__^^^[^cdccdeeeggillhc__ab`^^^]akeXUWY[ZXUUTRTWYX[hsokjklic_bkkippkjkjkkgdfhliqzm\dvng_`aaa`adhgcbedbfidbfffeeeegeh{zyunwohkkjko}kadcddfhiijjkiff`l|khkkheltqq~zagwhcaa_^X[acgihaf{ddd`n}tppqmqkmnqwzz{}~}~~~swvja_dglpqpqsvyz}{s|j`qskbZWTRSYWXxeVUrڒhvuae`bjvo\YVVSQtnضTY[ZZ[[[[[[[[\\\\\]^\ZZ\]\\]_``_\ftlWXdhquh]XWXZ\]\\\]\\\\]][Z[]]^]\\ZYWWYTV_a_aa`]]_`a_YWUTSRUWUVXXWYYYYWUVWWXYXZ[[YUSRSSSUVUVVVVVXZZWWY]a````__`ba]YTSvۿa[Qoj`abb`^][ZZYYYXWXWXXWVXVZghdb[USRQQRPPQRTY\^_^^_]\\[Z[]\\[Y[bf`\SMKKLNQRRRQRSUXVQLMWa]RMMOORZXSNKJJNPMKKMONOSUUSSSSTTVUWWWXWXXXXZZWVUUWVVXZ[[[Z[]]^^VKIMPRSTTSPRUTQOMNOQQPPOPRWTTTUR^`PGCGKMNQSSSQJZ{lHIOTVYWTVaAEGFFFFDHJKMOPQenbPJILONKGHKLMMGEEHK>;@CCZ`_[OHDEEGMQIDCDENGA@BCDDDCAA@@?@>>CKONMNPQRSXWK?:9988<@BAA?@@>::>EEEDDB><;9512?D<:;::::::;;;:99875468:=<:988:>AA><<=<;;877889:>@?>=AA?B>7CWQJJA947=@?>>=;98998887657:>?>=<;:9:;:888<>AFEDBCGB=>=;;;;;;:99;=>=9;<<===>@AACFE>8677677778889:;;9:A;3KkO><<=>@AA@@@BBA@A@@?@JL<:FJMOJ@=ABCDDCABBCEFDHWZSYZa^C9;>??@=<<=<=AB@CDECBJRRKGFEFEEHGFCB@;?OO;=GLLNNIJKLIB@@BBBBA@>>>=?BC@=:;;<;88=HacMA<87644347:9863.*-7A1/3345666695431321258879ESYUI>407:9JYN8)+DEEDBB@8788BHA=<:7543221-,4;:7.(*.3442/,**+,.43102<@:83+/9A?8308BC>?LVVQMD:34:<=<:<=?>>>=;64;;1*++/0,*++*(),.)%+;?3((,,+(())*+++)**((2=@:431/,)&'*,'%+0//5:5-.320/.,+*++,++++('1=:.+((*,13369:9845887651179645668:544421121,((*.37520/..,('(*+)),--,++,-+()(#&7C?89@B@<AA>1*-3/=;,)&&')(*++,-.,+388:>;9?JLFEQgrjTLLJHHD=621/23222.**)*-/1589>?-'**,0552262,-;Zj^TVYRC70-3FH71\[YWWVVY[ZYZZ[]\XUUSSSRSRONONMNNOQQRPPQQQPPQSTTUTRRRPQPPPPPPPQQQPPQRSUVUTSPNNNOMKKJIKKLLMLKKKLNMLMOPNLKKJJJJIIIJJKKJKKLMLLMOONNNMMMKIHGGHHHJKLMMNNOQQPPRRRRRSSRRSTWYUQPOPPQOMOQSTUVUVSQRRSSSRQPQUY]aba_YTX^bbbdeeddefhhjjgdddb`____ab\URY\[YYZZYVSTVV\`djjhjhc^]hnjkqoklmlfbaadihlqdc]Zqznib^`ba\]hmd\`feacopb_egfdccdaix}qpxofhhkmuxxpdffedegiiijjkhfgcrsfgiklnptyy}b[c_`ba`^Z\ehihikbc~gdcb^tzrppnmjpokmrvvwxz|~~tn|rnlimoonoqvzyzzwpgroivzg`vdY\Ls]ykpjqhVSSQ\|d[^\TSp~ٞWWZZZZ[[[[[\\]\][[]][\]\WZckleba^btuh]\jnaZYY[\\]\\\[\\\\]]\\[^][]\ZWVUTTUUWZ[]`a^\^_ba\XTSSSVZYVXYXWXWWVUWWWXYZZZVWXWUTSTUUVVVVVUVYZWWZ`aa``___`a_[WSeں_^fcsuifcba_^^]\[[ZXXXXXXXVWXgfdih^WUTRQQPPPQRUY_`^\ZXWVWXYZ[\^^add^XTNLJKOQRRRRQSW[VPMR_cZRNOPOZaZKGJIKQROJKQPNOQQPRVWWWVVTTUUVUWWWVV[^[WWXXYZ[[[\[\]]]^WNKLMMOPONORUTRQNMOQRQQPOOSRPRZ`WMKFFIKLMOQQSQQepIJNRVYWTYb@DGFFFGHIJKKNOKVkiQJINQNKGGIKMNHEFIO@=BCBN`_[PFDEFHPSHBDDFMDAA@BDDDCAA@@??=AKPOMMNQSUVUI>99:99;=?ABA?>=:98;:778:=<<:;;;;;;:::::88:99668;=<;::79>AA>;<=>>=<:8789:;>?>>@@AB<7CSIGGB;79=>====;:9998887658:?>=<<=<:8997::<@CEBBACHD===;:;;;;:;<<===;<===>??ABAAC@<977876778889=>=>?>;-3W`KFB?COK?DJMNKB>DFFEDDCBBCDDDDLSSWY\`H7==<>A><<=>=@@>AADFFKPLFFEEEEFFEEDC@;GWK7=>?A@=<=<<813;CDB@?=<:;AFFDCCA@??????<62;@30BP<>?=@::Ri_D85653446;@<3.-0408E525422005889;989743577616K\T@5545889<8654;@52;96421012/-4;;;4)+5:741.)'()(-86126>;AD1(+3;>;;@EHB8;GJKG9,.7<87;;;<>@?=;8679:84111/,***+*')02.&%4>5(',,+)((((').-)('%0@B87>>6/,''-/+&*22/3;8/01-,-,++*+,+()./((6>70.-++++,03887835;:765312336;:88:95220.*)('&%%*/1/////-+))((+()+,-,++,-,**)'/<>=?BEGF=;>>9301220018=<52222220023447<=92.++,+,($.?E>8788DIA/#,5571**)*)(()*+,./.,,+,05=8/-8A>:=CE@6*'(**-./006@RUIA<7431,'0EPKHI?8:98:=DH?=NV^bihK68?=4.)(/8:7531./.7UoqeWKC8/.,.B?>DZ_e[NHEFJRSF@HFJIBA@@ADDCBA@???>BMVWQNNPQTTQF:9:9:::<=?ACC@<:8788:@CDDB?<;9::;;9::;;;;;;::9::9::9:97:=>>=;;69=A@==<=>>>><:888::<=>>@@AB<;EJ@BB?<::;>>====<;999876678;?>=<==<:7567<<>BEB>ABDHE>==;:;;;;;;<=====>>??@AABBA?=<;98888877999<>>>>?=76Jh]bO;@>ABA@@AA@@@@@@?@@>FPKFKOOKC?BDDEDDCCDDCCEDEPXZ[[_N8@BA>@?><==<>?AA@CFHMMHEFFFGGFFEEDEEADH68>ADGNVTKGFGCCDDDDCA@A?=<><:;<>=<;625=FGDB?>=;>CFFDCB@??@A>;::868:768;;988:=><=????@A@>PmV:9><<78OiM45656878>A9-+-4;6;F97;:8633:;5676442001320--?TK4-49406MSMC,,FNIIB;7312;@95586--6765444562.39;<8/-7?>5/+()((&/94115=8;<0')2346=IMH<04A?61+'0;;9;==<==>=;95.08635892+,,-,+)'+364.&-:6*'+-+'(+*'*166.)(,6=706@>6/-*',.-))031055112210,+)+-1+%)..'+:5-49972.++-/1100.2;<:6431...28723::74432.*))(().0/-...//-*(''*(()+,,--.///,),5724AKJIHC99:4..013469;>=<;:9960,*+-/27>@;520.-.+'&-218886489A:,6:;1&()24-*'*)*+-.-,)).37AJNQPSWJ<;8>HA628:517CFDBDID5+1>GF?<4,4>IekVQTH23:3'+?I?AK?15322445677CM>7>701596-*0;?;8765301;J_svqdJ1)*(+6:0-XYYWWYZZZ[[[^][_a\VSQQQRRQQQPNOPNOPPPQQQQQQQQTSQQRSRPPPPPPPPPOOPPPPQQRSUTQQTRPPOOMMNMLKKKLNONMLLLLMNNLKKJIIKMKLNNMMNMMOOOONNNONNMMNMKJIIIJKIHHIKLMOPPPRRPQQQRRRSSSTVXWTQRTTRONOPQSUVUQNMMOQQQQOOSTTUVVWWSQUY\]acbacefhhgfehklikmjhhfdcd`\^aa_]\]^\[]\ZZZZ[YUUY[VXlsr|spqjhheekrmjrsfchd__bc`ac_]``_`b][hlb`abdecanxjbjmkea`]nv|}rcmmht|foqoesgbedeeeeeiiiiijkifr|lhhhhoqectk^acbbbccddfosmiggikllhfgfcbdjnpsokknpvwvxxw{ijuwtlijjgggijilmmmmlk`YZ\ʘjij^][ZklTac}r[_ZQSSUVYccblh\XXWQRl߹SY][[[[[\]]^]]][^`]\[UYk{xlfedca_^WZln\\[\bd_\\\\[\\]\\\]]\\^]YXYZVUTUWVVVTSSUYckc\_`_^[XWVTV[[XVWWWXYYXVVXYYZ[\_`ahjb]ZWVVUVVWVXYYYZZ\`cb``aabc`ZV`ǥڑ\Z][Zc{i_b````^]\\[YYYYYWXVX`bflka]]ZXVUSQPOOOPQY`^\ZZXXXVVVWXWWWZkt[T]]UPOOPPPPQSSOORQNX^XRPONNKIGFDEIFORPPRTWYYYWYZZWTSTUUTTTUSIGQUTNPTTVVWXYZ[ZYZ\]]]\XUSPONMMMMNRVXWUUQNOPOOOQSSV^ZKBEIGFGHIJLNOQS\IHOTXZXUU`VEAEFHHJLLJIIJJK\jTLNMMLJEEHIKMHDGLSJ@A;:?VgvpiSCGKTPD@EKNFB@@@@ACBA@>>?@HRZ\[WTVVUTMB;:;::::;;;?DF@><866657=CEDB@=;;;;;;::;;;;;::::9999::;<;:=>??@><8:?@@====>>>>=<;968<;;>?@ABB>@CC>?<99;<>?@??===;::9877779:=>===><:7249=?@BD>;>BCFC>==;<;;:;;<<====?ABBBCCCCA@=;:987888877:;;>?>===;:@F]ssD>B@ACBAABBB@@AAAA@@?BJMKLOPLC@BCCCDDEFEDDDFFFNX\^]aU;@HG>>>=;;;<==>?@ACINJEFFFFGGFFEEEDEFEA9??ADFGQYSHBEDCEDDDCABA=<=><89;<<;988>AFHDBA@?>@CDBBCBAA>>;899:999879:;;:9:<<99<>>??>@A;:HMB:101--,3>=8;@=5302797668:6117;:712<<<<<;:82/2448=:.&+240+('.6:96/+46-),.-')2/&*7=7/**2<7,-3742/--,+--,*043/.1102440++),14+&*-*)16,).5=?:1-/..+))((.8<;6211/--..../37666678873+(.421/+*.463,'&'((((*-./0///-+.43.)+;JHHE@5330.-.03355359BHBBIC<0+'*2589513652/---36-)6@?DKH5285775.*)&9<02)**)+,-0.),217DLNPNSaZ@9ADD>700789<@CB??C83AT\`][ZO95?IW`\X\S5.9:-.=D@?ABC>21360,,,*.1)$#%('(12*.9@?;99::403>AQlqz~e=('%#6;&#XXWVYZZZ[[[[]ZVZ`^VQQPPQQPPQQQQQPQRRQPQQQQQQRRQQRQQQRRQQQQQPONNOPPQQQQRSROPUTRRRQOMMMMKLMLLMNNMLLLMMLKJJJJIKKLNOMNONNOOOONMMONMMLLLKIJIIIJJJIHIKLLMOPOPQRRQQQQQSTTTTTTTSRTWUQPQSSTVYWSROLLOQQPOPRSRRRSSTTUXXVV\a_^bdddddfdcjlihmppnnlhfea`cda__cf\]kleb`^]]\ZXWW\cfsxxsogkolflwvngb^fmf^\^``^aeda`_`a^_ge_dgeebb`euvgiokeca]oqkywzidlspr}cnndiqaekgeffffiiiiijkjeslggfhlkg_fd`abbbbbbccdkslfgffghhhgggdb`cmpnjhjmz}~y~c`hmnmkjiggggefikp|zpj_\^Unɑhe`c_[]fr\dcr|XTXWWSQR\fffojYXXY[[^bW`\[[[\]]^^_fgiqgZ[Y`v{jfecbcca`][]cf`\\\[]^_][\\\\\\][[[ZZZ[[YYYYSRSUUVWVVUVWV[hkea[[^^_^ZVVWXWVVVVXZ\[XVWXXYZ[]`bfigbaa\YVVWWWWXYYYZ[\^`````ab_Y\{غՃY[\ZSH]lb`a_``beb]ZZXZZZZYVal]_je_^_\ZXVTSQPOOPT]c`]\\[ZZYXVWWWXWS_zrVVYVROONNNORTRNLSQLV[URONLKKIHHGFIKU\a\WTTRSQQQTXXXWVUTTTTTSQPQPTXZZYWVWXYYZYYZ\\\\\XVVSPONMOOPRUWVUVVSPNNOOQTV]UJFEGIHGFGHHJMPPQlKHOPTWUST[`QBEHIJMNKIJKIJLSUNJKJKHIGGGGJKGEHMQKAA;ANdox{nPAGKRLB@CEHEB@A@@@AB@?>>?HY__^_]`^ZWQB;:<<9::9<;9?HG86;866654??>?B@=;=?<<<<<==@@>?@?<979;<=>@ACB@@???>938>@@?@@?>=;<;:9887779:<<<;=>:6638;?AAAA<9=;;;;:;=>>??>>@ADEDDDDDC@><;:98887778:<=>><<=====:CbnOJACBDDCCBBB@@BBBAA@ACHJKMPPLEADEDDDEFFEDDEHHHLW]`feX=>HB<=<:99:;;;:?@CFGHQWPEDEEEEDDBACA====<<:;:977=DJDEIHDAA@@CCAABBBAA?>:>FD?:99879;=@?<=>;8:??>?>B[}nA8;::>;GN<853325:?9468::949B;=DB=951-//..-+*+,,,,-02145/+39312483/:JIC?5*(.1.+/37<@EFFB=7687889<@?4/6960/5AE:-)'&*-/,,.14/)%$')'%)./03?LL>-)4BDFID>=>==<<;:;749<;>7((0562.,+0698750/31-,--+-65()=E7+*)0>;000.-/0,+.//.--473.*/0-.00,***,.1+*,+)-20))+.799/.21-(())',795220..//.,,--02334459=>7,+-00/-*-34330*(''(('(-/10/.-*+46.'&'2?DFC91/00/--.00.).:AEA@GMOSIB626992*)2742322154/.24?LVV=/42/,2:5.+8@320//,*+,24,/754>EFFDIV_UE>=<997415>D<4369<1)6BAFPW_`L7487=IPYV8-6947??=81?<;:873..19DQcjtuK22+,@H40WWVWZ[[[]\[[[XTUYZXURQQRQQQQRQQQQRRRRQQRQQQQRQQQRRPQRQQQQQQPPPMMOPPQQRSRQPQSSSSRRQNLNNLLNOLKMMLLLLNNLJJJJIJKKLNNMNNNNOOPONNNOONMLLKIGIIIJKKKJIIKLKLMOOONRRPPPOQRRSSTSTTSSTWVTTSSTUVYZWURMNOQPOOPQQQPPQQPQSVVST[^ZZ`bbba]]`_bijginpooppnmmkllie__cdn{ymf_\\\^_[XX[YZeqfrtpmlqohr~uie`ajk_\__``\aoqe]^`ebegdafgfd__bafpnkkgcdb\prekmzyuofgenssv~pkkebd`gplhhhhiiiiiijkkeowfdegkkfbag}rcbabbbbcbccdeggefedefffeeedb`dnplgfjsy}}y~b`dcfkkkjkkjiffhlotrke^_`YSqwc_``]\_olbdivu]UZZYWUU[_Zarm\VVX_f^tY_][[[Z_akwcY_g{~kcfeccbbdb^cga\]^]]\]]^]\\]^]^Z[ci]WWX[[YY\\UTVWVY[[Z\\[Z[_ilfX[]]__[VVWWVVVUVXZ\\ZWWXXYZ[\[[_bbcjib[XWVWWXXYXWYYYZ^_``aaa\XjӬm[^^_V[fpa_b``gwxqbZYXZ\\[YWgyf]d`]]^]ZYWUSQPOPQU]`_]\\[Z[YXWVVVWXVVYtiSUWSPOMMNPSVSLWbUJUYSQOMLLMKKMSZXSMOSZTPPKLDBGKSYYYXUUUUUTTSUUTVXYYXWWWWXXYXXY\]]\ZWVVSQPOORRSTVVUUVVTRQPPQSW[TKJLKIIHGGGGHJLPOQOHMNOPPQRT^[KGIIJKLJGKMIILOMJHFHIFGGFEGHGECDGIFBCHYcin|zTCBBJQI@@BCDCA@AA@@@@?>>=BS]\^^_ae`WLC<;;<;9:::<;9>HC659765544;DDA?=<::;;<=>>=<;;;;;;;;;::;;<==>????A?>=??<999:;=?@>@ACEC:9:<=>@ACB@>=>?>96;?ABA@???>><;:9877778:<<<<<<8457;=@AA@?;;<=>EA;><;:;<<;=?@AA@@ABBABDDEEDA?><<;8888889;====;;;;<<<=<=KLEBDCCDDDCDCBAABBAAABDIIJMONJECFFFFEEEEEDDFHKIJX^^feT:FK;;:::899::::;>AEHIECDEEEFFFEEEEEFFHJD@@?AEGEFRVIDGGGEDBA@B>:===<<;;986:CJMGEKLEAABEFA?BBBAAAACHPSNA:999768;?AAA@=99=@?>?@@AGM`yU/:<988@ID?;630/27;845335549B9?E?;830/010.,*)*+,,-24310..0583366300>PM=4/**-167;<77?B@@A><9765:@=@@7.3:5/08B@2*'))-./,.000.+*(')*+041/1>KA509BBA92-3:::=;<=<<<<;;;;=:6:>=<4*,3341//-0672120-/1.-0/,,35-+=E4)*).=C>70)*0.,.0110.2874/,--),,())))+,...0.+.1/**+,-.-+.55.'*+)(,11-.232011332.../.--025661,+,/10/2:91021/)&&)+)),.1//.*(.5/'%%'.8@D<.000.,+,,./.0:@?:26DKR__YJ;3760+,1423663/.*+,+'8KRPC763+.2A72.0>5.5861))+2713?B8677768E[^J4///8?;0-:A6*,0473--**8LU]b`UPPJ>7>OK4-255:@<1.4>D;87987331,-477:339109?>=<<<62,+--.=VTSam~wI4=;CIEDHWWX[]]\\\\\[[ZWVWWXWTRRRRRRTSQQQRRRRRSSSQQQQQRRQRRRRRRRQQQQQRSOMOPPQSSSSRRRRSSSRRRQONMMMMNNLKKLLLMOOLJIJIILMMLLMNNNNNNPQQOMOOOOOOMLHGIIIJLNLKJJJKKJJLNMLOOMNOOPPQRRTSTUTTUVVWXUSRRSTVVTQOOPQPOONNOOMLNNOPNMMQTWVQT\bacfaWXZX_giggkomnprrttqqpojflwynd^YZ[[\]]\YYYYWWV\{rv{qptqztfdaagg^\_ab`^bnvn_\`higheceeeb_^ba\ftogbbd`[susnrqrqmhefktux~ysedggbcfjljkjjjiiiiijkkdewdadfiifedbfzyfbcbbabbcccddddeeedcdeedddeec`fnpjfdjvysw|{~~laaa`flnooqsrnjijklkh`\^\WeiYtpb\]]^_\]kx`^dqvh_a_]ZYYZVQ_mfYUW\af^߽e\_][[\XZhX^gntrjgfedcdaaea_kmca_^]]]]]]]]]_`]_d^jx^UWX[[YY^a_`a`_^^_`b`^^[\\bjb^]ZZ\[XVVWWVWVVXZ]]ZXXXXY[[[YZ\^Zcsmf_ZXVWWWWWWWYZYY[^`abaaZYɟܓY\a_b^ji^U]da`bmprma\YUV[\XYm}l`^\\]^^[ZXUSQPOPRW]]]]]\[[\ZYXVUVVVTRTY[YYWUQPMMNOQUQPipSHSXRNPOPPPOPRUWTTQHBUZXVLQXF?FMTZYWWWWWVUUUVYXYYXXXWWWWWWXWWX\^]\XVVVTRQOQTUVVVUUVVVUTSRQRSUWNKLLKJIHGGGGHIJNKPQHMMLLMNNOUZSKKJJJJJJLMJJKJIHHHHHFCFC?IFECBACFIIJYekludAAA@HMG@@AABAA@@A@@?>?>=>HX\[\]`b`YL?;:;;:99::9<;:>B=888765544;BD@><;:;;;<=@@=<<;;;<;<;;;;<<=>??@@A@@?=>@A<87889=>>>@ACEHEA==?@ABEE?<===>;@?>ABB@>>>>@=<:::988989:;;<<;968:;=?@@?>===<=C?;<==<<==<=?ACBBABCA=?CFFFFDA@><998889:;=>?==;::::;<<=<9;@CBCCCDEEDDBAAAABBAABGKMMMLIEDFFGGFEEEDDCFJNLLV\\`_J=TQ;<9899:9:;:;=@CEGGFEEEEFGFEEEDDDFFFFEB@>?BEGDIPLHIJIECBA?@>:<=<<<;979940002772...143:D<@@<;7200221.+)()*+.15421/-./464443224>NJ:20134:DE:96.4=:244447558=?@@7.18725;=5-*(*+----1443036-+432631/07>88=DA?;6347884/*-359;;;;<;>=89?@;20441//-+*1840///---,/32-,2533<>3))),;D;3-*,13135886489763.+*()*(+.,**--/220/020,+,,**(&.85+'*,))*)),0256533685.,,*))),020+++++/214GH;54464-7QXC124,+.0,)085..15544307JZ^aalstvwfA1<;1,.03?>@KWZZ[]`_SG>:::9::99::8;<:=>;987665434;AB@>;;;:;;<>@A>;;::;<<<<<;;<==>????A@?>=>??=97778;>>>@ABDGKGBAA@CDFF?;;;<==@?>?@@?>??>>>><<<<98987::::;:98<<<=???>>>>===?=;<==<>>?>=?ACCBBBC?;=ACEEDBA?=;9::8:<<>>>@@?=;<;;=>>>@CA@BCCCDDEEDCBAAAABBA?@CKNNLKGCEGGGFFDEDDDEHNPNJPY\_Z@L^S=9::::::<<<=ACDEFFEDEEEFGFEDDDDEFFGFFDA>>@EHEDJOKIKKGBA@>=::==<:::9:AC?BG@B@@AAACEHKLMPKD?;9879@FECA><7:><:?A?Eif;86777EEB9453+-990*/-276658DFA8./674695-+))*,-))-5:874691576471/..1.4;CC?<97799872*)+,289:;;;>7489697**=F;06@6)$$('(-6779:74666BV[bek~{yN0330--,5>BCHD?=5112001258>CHLJE:223223126981+,//>_eRF?GMRzu;#,1016=\]`a_^aa```_][[[ZYWUUTRRRRSSSTTSRRSSSSSSSRSSSSUVVVUUUUUTTSRRRRPOPPPQSSRRSRRRSUUSRRQPPPPPONORSTTTTTSSQNLKKKJJJKKKLLLMNNNNNNMMNOPPOOMKIIIIJMMMLLLKKJJJIJJIJLLLMOOOPQRSRSTSTUWWVWXYUPNLMNMMMNNNMNMNOPQPPONNPROHEHKKLMSXYZ]bd`ZSRSPTZWU_d[X`fc`^[[_]\^_ZYZ[XYYYYZYYYZYYWY[XV[[[gywnmlkhdfb^aa`a`bffeinqnddjmka\iqkiif_`iklmjgeca`]brql}|snifegqx|dk{ibbbbcaaejoonkggikjighfca``_```aceddcbb__bebcbbbcddccdedcdddcccddddccdebeppihjmtz{~uolfddfjgbbdlppqsleemjg[[[[}UVW[c]crhXWYZV^r|zulhihgcUU[_`c_^egggad\zxU`^[[YY[l{c\X\__`cghgeeeegdcb`dgfgc^]^^]]]^_]__^fhf\guaW\[[\Z^bddcefb`_`abbba^[Z`fa^[WUTZ\ZYXVUVVUWXXWWXXXXXXYZ^_``[`r{qkf\XWWWWXWX\_``___aa_]Vh׾`TY\ddb_aoe`c`_^X^a`bb^^^^]Y]x}n_\[[\\][ZXVSQOOQSW[\XUY[[[_\[WVTUUSSSTaRR]WTRQPUY[WPPSSPPQTVTSTTSTSRRRTTSQTRTd`XbWFeeLNNQUUVVVVVVTVY[ZZYYXXXXXXWWXWWXZ^_[VUUURPPPRVVWWWVVVVWVVUSRQSTRPNMMLJIIHGGFGGHIHM}SHMLKKKLLKGLSNNLJKLLMOPNLHHIHHGGGGINSY[aflu\RTYZemgN?@B@@BDDA?@@??@??@???>??AAKUXW\][SF;889998:::;9:;;:;<9777654335;@A?=;:99:;=?BA><;:;;<<<<<;;<==>??@?@?>>>=<==:8878><=?>>?@@ADD>>>>>>=989768:::::99>><=>?>>>=>===>>=>==>@A@??@ACCBBBB@=>?@CCB=><<;9;:8:<>@?>ACB@??==@@==??@?ACCBCDDDEDBBAA@AA@?=@FKMLGDCEGGGFEDDDDEGKQSNKMV[_Q@Y`P:9;<<;:::;;=AEEFFFEDEEEFFFEDEEFFFFGGFDB??>BHE?FOKJLKHB@>=>=?>>==<;=@BCDEGIMH>>?>AEBDJ=A@AAAAABAAACGKHC>;:65=GFA@;=5218GJ>0'-20)*6>7(07477745FLC8..47630-(())*,+')1:?93/,-.:;552-,--,(1=EA?<<;====<3.251499:;;;;A;559830-++./-..*+187431/.-+.482-.10143/))+,/77///-///0.,385576671*)+165/-6965:<867:82.+))+++-.04/&)21)*//00-.7<;::97532441.+-/0144/--./174)%*-/,*+)&)-/35541*),+(('()**)),.-./.+*)***-/256662.)!)9FS[L.+62/.00115980)()+.00237630-+)((('+07;@4'(+***++,/45117;512.',22//:<4/&%%&*5;?@91/342;MP^nu|ox_9764228BCAA?<86...0/0/16?GD?BFD=33321.,/13-+,/-3P\QG<2;BAmU&$)&'-4cccb__cffec`_^\[ZWUUUTSRRRRSSSTTSSSSSSSSSTTTTTX[\[YVTUUUSRRRSRPQRPPQRRRRQRRRRSSSRRSRQQQRRRTWYYYXVTSSQPNLMMLLLJIJKKKMOOOOPONOPPQQQQONMKKKJKLMMLLMNMLLJIIIJLLLLNOOPQRRRRSSTVUTUVY\XROMMMLKMNMNNLMNNOOPRRPNPQRPKJLONLORRTVW\daVORQNSRNRYVOOTYXXY\bikg`XWYWWXXWVYXYYZYYXZZYXYWT\osjhghigic[\_`a``dkkjklnmikpqhh{ompohfkqtlfhhedb_b_Zo~xpjgddnw}ahvla`bbddbdhlmnkghikjigdba`aabaabbcdcccbcdefdccccccddccdedcddcccccccdcbcgddqqikpw{xy{v~mljgfeda]bgnmgotqe^Z^X\thcdbZivcXZ]b]h||xys^Yabeli_Z^cgjkjhfhb^`YzVb]Z[WVhulh_Z``_`dhhfgffhcdc\pp_``^]^^_`]b`bkidZ`|cY]]\\[`feceefda`abbdcc`\Z[^^]YVWYZZZYWVVUUUVVVWXXXXXWVWY^cdde_dvwqmd]ZWXYY[]`bbab`^a`][VwҺYUXXZ[\fvpcc`^]]]]]\\^[]`_\_qtb[Z[[[[\[ZXVSQOPRUWZ[UPUZ[[b_XWWTTTSSVOPYxVNOSS]haWQQPPRTUVXZZXWVTRQQRRRSVVVO[_RcjPPZVRNILPTVVVUTSST[]\[ZZYYYXXYXXXWWUX^a[UUUUQOOPSWWXWWWWWVXWXWUTRRQQPONMLJIIIGGGFFFGGIvUHMNMLMNNMKMPPOLJLNNOPPNNIGGGHHHHKOT[bfiq|pSNORZf_J@@AA@@ABA@?@????>>>>>>???ACLVWX\ZOC=;;99899::;;:;<:8;98766553236;>??<:988:<>ADB><:9;;<<<<=<<==>??@@???>>><;;<<;:78?@@ACCDEFEDGGGE>;;<=>>==??>@@@@EMICA===;7776668:::::;@?<;=@<=<=>>===>=>>?@@A@??ABDCCCCB@@BCB@A@8;9:;:::9;=AB?>BDB@A@>?AA?>@?@A@ABCDCDDDCBA??>?>>>;;AIOLECDEGGGGFEDDDFHLQSPLMR[]HH\XH9;;=<::98899=CFFFFFEEEFFEEEFFFFFFFFFEEDBA>>CFAAJKKJJFA??@DGD?@ABA?BCBBBBDDA><;=ABA?868@>@CAA@>:768:?A@@?<84;EEAB>9I\T;-6A8562/03777:;;::85;HI=:;6310121137763.++++,**.0..3799998749;3...9EB4+-/330.-5;31><7891/BKA5.-178/'))*),/0*)/7;:4,(''/<757.**+++.6@EEB@?>=??AC?89=;<=<:;<>:40/2/,()))+,,+-//./59864430..024.+--.01-((()2<:1-,)-.,*(&)-*+++.3/*2:9641,-6:9=B;52310-*)*/221012-$*85+,24451/39<<<;5-189620...037620.-,/1+&&(++'(./((,27:95,'(,-('''''),020--.,)()++,.156665,$)2/+,?TB&+84/.0121671*%'().0/0//.-,(''&&%)58:=B6+)*,,+-,-/3;;303/*+,++/00/5964-+++17=B@3(*-/.6@G^qwjVdy^:8877664349=:6771./1357;DHB<<@C>32330.+*+02472,=WUF=0),.6c_,&,)(*0ljec`afhgfda__]ZWUUUUUTSSSRSSSSTUTSTSTUTTTTTTVY\^]ZWUTUUTSSSSSRRROPRQQRRRRRRRRPQRRSSRQQTVWWVUVWUQPPNOPPNNNNMKJJKKLMNNNNNONORPPQQQQPPONLLLLLMMMMMNMMLKJIKKKLMMNOPOPQSSRTTTTRQQSSRQQQOMLLKMMMONMKMOPOOQSTSRQSUROQRPMNNNQSSX`c`[TTSPNLJNTUQMPUX\adhjje^]\XWXXYYWXXYYYZZ[[[[[[XU\mrnnmjghf[Y^_aa``gpnheimmprqw~vemnkikouqllkihfbdb[fupmkfblx{|blx|ve``ccbbbdegkkhhihigfefghjtj]^[Z`acca``adefecbcbabcdhlf`cedccccccdeecbbefdlnhhuu}laxmkfeegc_]^p~eoq\^[]f}~xvzwwuildnjfw{soh]zplomof]agnrtrokgZZ]\T^^[[W`|dhrkfgc_aegggggfgfhscbr`b`^]_a``_rpeeeaV[tcX]^^^\biighjkidaccbbccb^[[]]ZXWXZZZZYWVVVVVUUUVXXXXWVVWVW^ehiebinssoh`ZXY[^_^bc`^^]\^]Y]̴TUVWXZbknmdcda]^__^_]\]Z\`_]]ed[ZZZZZ[[ZYYVVSQPRUYZZWSUY[[^\T`ZSSSSSUJBqmONVWR_cWQQU[\ZYZZ[]]\ZVSTUTVYXVTUVQSWQXgeULEDFHNPTVVVUSRPNPXZ[ZYYYYXYYXXXURKMX_[TTUTQOOQSWXVWWWWWXYYWUUUTRPPPNNMLLKKKIHGFFFHEDfÿWGMOOOPQQQOPOQOMLNQPPPONNIGIIIHILTY]bfimyzRFKKVkhN?>AAA??@AA@@A??>>====????@ACNVWYTO@;<<::9:::;:;;;;<:8;966655543589;??<9998:;?BEB<:;<;;<<<===<==???@@@@?>>><;:<>?<::>@@@@>?IRLHBAA@8377668::;:<>@>><<@;;<==>??@@@BBCBAAABDDCCCCABC@?>AB9:;9;:99;=@BB?=@DCBA@>?CCBAAAAA@@ACDEDCCCBA??=<====;AKNIDDEFFGGGGFEEDFJMSUPKLQZXERZP@7=;;;:99<:779=BFFFFEEEEFFEFFFFFFFFFFFFEDB>;:;=CB5/3/4A;=E@AA=;5678879?B@:6:@CDC@76;:4255:>75:;93,**+,,,-//.058888765587-(,.494-.0012230-6=6<>8781)7G@50+-590(*-.-057-+5;840,,*)16666.)**+-8BDFGEDA:8=;;;:<@C9+'-.)'(++++,,-,-2411599689652,*//,+,./0-(&)/4;7-(%'.1,*((''''&'+.,+1851-.00/4:=A5++.---/1.1332.02-$*>:)*034662/378<=3*-552/,+-041/010-+)&&&'')+($,9:-(-29<:2)'(*+(&''()*,3972,*,,,.1322376330&.K[J0#+FN3#,2/.//0054-'',*'+.,*)))***)('%)6@:425>A3*(),20015=A;/)))+-./2437==1-.1:956<>:/)(*-026;VknypQ>DXN8:<<:1,.,-5;;9<;3.-.7;;?EC=98655431(%1BKIC;;GMD90-+*).VuY.%**,/1nkc__add``bba_]ZWVUUUUUUTSSSTSSTUTTUTSTTTTTTVYZXXZZYWVVVUUUTSSRQRPPQQQQRRRRRRQPPPQRQQQQSUVTROOPPNNONOPPOONNMKLLLLLMNNNOONOPQQQRRQQQQOPPNMLMNMMMNONMMMMLLLKLMMNNOOPQRRSTTTTTSRTRMILNMLKLLMMNNNNLLSWVRPRUVUSRRQQRSROPQRTTQT\`eh`TQPMJJJNW\VMNTX]^]bmnhffb\YZ[YWWXXYZ\\ZYZYYYXUScysmrnhhhbbhga`_\`jqmiimsspq~zdgihhhjmlqvqigedbb_^{tgilkflvxv}peltxtrj^]ada_^^_^biifhfffho~{yp_\aeeb___`_`bcbb``acclvf]decccccccdedcbcjkacnjan}{la`pugoeeefig^cuuf[Yeyta^ilos`hniigYbȆw}xsfbbgotvx}sdVZbddO^[Wa~raY\iprrc^giiggggff^j}{f`b`___`beexzgcecZRjd\^^`^`ilkkklmjb`bddcccd`[Y[[XWWWXZZYYVVVVVVUUVVWWWWWWVVUUW_hhjg^aluxsi`ZY[^][_d_]]^X[^Yd˳oTWUX\\^b`Z]bc`]^^]]^^^]]]^]\[\[ZZZ[[[[\[YYXWUSPQVZ[ZXWWXZ\[WS[`UPQQRRLMnnMQghUOWVNNXdgca^]]\^^][YXYZ_dgfb^WPQVTOUXg\UOJEGOQTWVVURQNFEOVWWXXYYYYYXXWUSKIQZZUTTSPNORTVWVVWXWYYZWTSUWWSPONMLLLMMKKJHGFFFFEBcZGLOPQRSTTUSSQQPNPRRPPNNMIIJIIHIOVZ]^ahr|y[HIOTi|dB@AAAB@??>??@A?>>>===>???@@BCPXWVIB;;<;::::::;;;;;;::9;9666555456838?>;9;<===<=====<=????ABA???@?=:9<@@=:9@<<==?<;<=?>>?@AABBABDCBBCCCDDCBA@?=<::;@C::<9::::>BDCBB@?BEFDBAABA??BCEDCCCBB@?>>>>>>>DJHDCEGGGHHGGFEEFGKOTUPKJR\QL`WM=6<;:::::=>:68:=CFEEEEEEGHGFFFFFEFFFFFFEDC?<=BDDEGJJE<89:::9:::9;=ADDDEEEEC@<9=AA<21669?>DG@?BA;5588777;?@;79?DFB;76;FVaZLA?:77970110//1.+,-/1466688=IMD;8AYpq\C841/4;@@;:==6-***,../12.-2777654556520020/-*)+,-,+,0762:=<=873/,,=A82,-694.0333588-0;<72021+)+340.,)**).9ADCB@@><;=><B:))351//20*).0./0242/.16767:<6+(*-0////-+(&*3:90)'&(/31000-,.22240.+*+***(,21/377+%+/.-.///1111..0-$*>;&$+.26840/03;=3+/1/..-*(/3/,-..+(%$&&%&*-&#.?A84559;:2(((('&%'&'/316951-+-/035664341/.-2QkfH1+%6WI$)<2-+*,053,'(-*'),*'''(),+**)-9D@81/2DTE1($)2200139DI=.--/11//29AA6142>B2.686/*)+.0233BZgiT=9;@@>==:727748<=;BF?3.3:==;63122(-EVSJFDDGA/,-0.-/+Md@)')*066ie_\\]_^YX^cb`]ZYWUUUUTUTSSTTSTTTTUTTTTUTTUVWYXWVWYZXWWVUUTSTSQQQQPPQQQRRRRRQPPPPPPOPQPPRRQNNOOPOOPPOPOOOONMLNMLMNNNOPPPPPPPRSSTTSSRQQQPNNONMMNOPOMLMOMLLLMMMMMNMOQQPRRSUVVVVWWTOJJJLMMMMNNNNOQTZ``\WTRSTUUSRQPRRQRUWYWPLS]bgkcURQNNMJO[_VKKOTVRTaijfbc`]\WUVWXYXXWWWWY[ZTTZTZttchonkjmotrf_`^]_hrphlrqs|~yyyghjigfjjdp}uiddc```]hx^^krnlprrruwvqpomvtc_```afkmkh`]ekifeiwztxxxvqh]\aca`_abdegbcdcccccccbcddccjrmdejgaeyxx~vs}vaahh]l|oigghkfjnX[dozsQT[WYr}_aghllvzu{}wohbbinryxaU]kbSQZ\vm][ilbv~q\_jhhhgggjmm~nveafgdaa``__`_flgqzmghfeXnf[^]^_fqplllnni`^`cbbccca]YXYYYYYXXYXWVVWWWWVUVWXXWWXXXXVUUW`hlk`Z_kx{qg_Z[\]Z]hf[Z`[Z][jʲ_SVTVY[Z[]^___]___^__```^]^^]\]][[[Z[[[[[ZYXXWUQQUY[ZXWWVX[YVTQ^XLMOOPPRZKMXob[TQPMWinhcb`___^^^\]^\^dijljkcNHU_XTPUVPPNFELQX\XUTPOKHHOQRUXYYZYYYXWWWWUOMTWVUSQOOPSVVWWWXXYYYYVSSUXXURONNNNMLLJJJHGFFEECAkį`KMOPORSUVZ[XSQOPRRRPQPMKGIJIGFEKPQRWcoxzyp^OMOWao|_>>===>???@@BESZWOA==;;:9:;::;;;;;;;:8:;9755566576848?=;:;?BGGBHJE<;>AA@>=<===>????A@DJG>>AA>;:>BA=99<@@AAAABCDFFHKMOEAB=<=>>???AAAAAABCA@BJGILNNI<98787::::;=>;:=@@?>?@@@@@@ABDDCDDDDDEFEDDDCBDB<7979=E::;;::;<>ACDED@=ADBAB@>@CCCBAAHHA?BBCCCCCBB@???@@A@AJG@@BEGHIJJHHFEFGHKOSSOKHT]QZaOK?7;;::<<;<>=::;<@BDDDEEEFHIHGFGFFFGFGGGFEC?;9=CCEGIIB8677889:97778=EHFFEFFE@::@C>578765:EMJ?=AC;55888978:;<87=EHA:9:88=CUaV:04:?801211/.-++-257989:9>KOB6=cqS5.77:B@=>@>3))+,..0234103763445567516:5/,))**+*(&(+4><7>@><731/069631256753566752/7<82-096.*(151())*))*.2544678;?BB?;>DD;64049;=A;-4B@:401/)(/1/253240*'.5326;9/(()-46.)**(&-8:3*'&)/547>=:327?@751101.)(**(+1200,'',010/0/0000.../.')63%"(08885211267.,21-02.**-24452.+'%&&()+--)&,6=@@:799:8)&''&&&&&&*6:73)(12001345543//1++MidM41:21FH:FC637:>CSM7*(&*..,,.2?S_N6.132,*,2877?806:1+044/-.1469=;:GSPD:8@B?=94122416A>22>@60-8GE<><2)*34,4ISMILMFC?.-1-%+,#JS'$,)+376c`\[\\\[WTX^`][[YWUTUTTSSSSUTRTTTTUUUUUUUUWXXWWXWVWYXWVUVUTTUSRRRQQPPPPPPRRRQPPPPPPNNPPOPPONPRRQOOPPOPPOOOOMMMMLLNNNOOPQRQQQRSTUUUSTSQQQQQPNMLMNNNMLMNMLLMNMMMMNNNOPOOPPSVVWXXWYWRNNNNMMNNNNOSX\`aaa_[URRTXWUSRRRRSTVYXRKOY`cjlc[YWWWTRV\^VNKLMOOQUcld\[[ZZ\^``b_ZVZaeiqpbUVVWho_[emkjqtsuoecdb_^honosxy|zilnkiioofp{sjefdbbcb_cmwy`Xitnklmmmnoqtxwkowc^b`]h|taaghdnwi^]aaabcba`ccbcccccddccccdejllkiffdgrw~}yroqwyrhabhoxsnighigh\_c\d|wh]`gaY`w͘Z[fznebbgnsrstmfdfkovxbWaqjtޟVMqc[aXtltr^cigggghfj~nfkifda``__acdgld`rtiefeand]]]__lxuonoppld^^_``accb_ZWWXXXXXXXWWXXXXYXXXWWXXXYXXYYXWWVZfmhc`__n|xmd^Z[[WZko^X`_\\\tܖ[XUUVWXZYZ\]]]^`cccccbdfecaa_^^^]\[[[[[[[[YXYYVQRVY[ZWVVTTYWTSRUVLJLNPPMSQOORT\WSR]ntidcca``a`^^^^^^_`cgjjliTEKddQLLPNGDDEJP[YWVSPNMPSTSTX[Z[[ZYXXXWXXZSLQVUTSPPQRTVXYYYYXYYYXVVVWXXVTQONOOMMLJJJIHGECCCAnijdPMMOOQSUW[b`TPNPRRRRSQMIEHJHGHKQTTXet{}zqdYQQU^`erU:CBACEB@????@@?>>>==>>@@?@ACGTZWG><<;::9:;;;;<;;;;;;89;974556555689?>:89=?BHLIJJE<;??==;;;=>=>??@AA?J\[LADDC?:;=@@ABBCCCFFGHKQNACFB?????>?AAAAAAAAABBCEEEFHLJA:98799::;==;;=ABA@ABCB@@ABDDFDFFFFHHHGFEDDAGJ=2647;F<:<;99:>BA@@A??A?@DBCPTF>@?@ABABBA@?>?AABABE;9CDFIIIJKJIGFGGILNQRNKIRYXaLEKB79;::<=;;<==<<<;@<7677877789:86;EG@::<<::8=aiQ7-9?7012131,**+/59;<<<=<>HL?3I}zQ8@>4;FDCC@5+*,0100344212352234565/.571-+)+1.*(*+-/3;A;9AEB>73345333111376/.2662.2;<4,)0;:1-,132'&))))('''(*/0016AILH>:;867347:AF@9AH?6/,)('(-30/112573+(.111331)''&)//++*)'.95,(('*2415?C<0,5=?6/.2120-,,/-'*/-,)(*,/./////000.-./1-+//*(,5<:3035420,+/76231,+-378>?9?C79@>:6421/,+373-.5852/4=?=?E>6FC3;DE>1,.681/7?BGQRC=@6/*((.*DR*'-(*230_^][\^\[[VTXZXY[YVTTTTRQQRRSSSSTTSTVUUUUVWXXWVVWWWVWWWWVWWUVVUTUTSSRPPPPPQRQQQPPPPPNOOOPQONOPQQQPPPQQPPOOOOOOOOMLMNNNNOPQPQQQRTUUVUTTSQQRRQOMLLLLLNMKLLLLMNMMMMNMMMNNLNNNPTVUSQRUUTRPNMNNNNOQUY^`\Z`ca^ZVTVXXXXVVVUSSUVSRSSX_eiifc`\]_]XUX^]ULKPRPLRdog]X]kqoqnmkjmrx}gXVX_db]_gfdkrontqebab`[izuw~kosnhkrunrukffhggecdffhkpvse\ktigjkklnoqttuqp{j_^[jhfhfv~wc]abe[\_baabccccddccccccdeghgeffejkk{odfffkxukkpto{wwqighfhv_aegg}]Xbeto\ZjzvXc|x_\]\_jh^hnmlkmqrsjjogdjsfمb~`T\^Ynpqukihiihgghcninlea```bdfigkjVWordeedib^^^^[myxsrrrtqha]]__`ccca[WVUUXYXXXWXXXXWWXZZ[ZYXYZYYYYWWXWXdmida_\apxsia\ZZXXhvbY_a^Y\εv\\YXXXXXYZ[^`aceffggecdfgfdc`____^]]\[[Z[^a`^]XQRVXYYYXWSSUURSTTUQNMOQQNQONKJQRTVTfmibbccbbbcb___^]]^`befhhfWHGP]ZONQTROKIJJSNNUTQPRX[YZ[\\\[[[ZYXXXXXYTOQUUSQOPRTTVYYZYXXXXWWXY[YXWWWTRPOOMMKJJJIHGFDCD?oѿƹaOLMMMOQSTVaeUONRTTSSTQMIEFJHHS\abeku|}}{oaWPNUZ`qhD>DBCCECA@>>?@@?>>>>>>@@@AAACJWYRA<=;:::9:;;;;<<<;;;;99:96444554358;?=:9:<=?AGJJD>=A@>=<=?AC@>>?@BC@EWce`VJGGC@ACA?=<=@@ABDCBACEGILPE:CHGB??>>>?@AAAAAAACBB@DFECJQPF=<:99;:;<=?=;>ACAAACDCABCDDFFDFHHJKKJIFEDCAEK907854F@:;9989;===<=@B><>@@?@@?@@ADCBKOD<>>=?AA@@@@@??@AA@A;2;GFHKIHJKKIGFGHJLNPPMJIPYYT>@ME98<<;<<;<=>???=;;?BEEEFGDAAGHHGEFGFFGGFFC?:8;?CGGGC<6588999989998;BFGFFFFFCA@A><<9::820>C638<>>864355679::98:AE>8:;<==??I[gVE>781/010---*,06;;<<<>?>BF=6TjI?@>>CMLHC7-+-12212222112330/-.30),10,,+(-40+-68::;<>95=HF?:64321///..177,)398216;82,*2<;62,/22(&*)('''((-2/+)(+5ANVI62101003:GOLHFB70,)%%%',1.))+048;7,(-1.++*)'&&!'.**+)'*,-,+*).7:55=C8,)06:7./3-(+13/42('(())(*--,***)+021-+/231-/20/27:92+/692*'.8:731-*),8=:;A;/(((&*487/--,''4A<005=D='&('''&&%'&%-55-(3?:2345565354.1R_M?726?:/*.;3:GHIK?36:<<>@NH/B[VH4*+238EKL<0361,*)))*,1494)()++-18<@ISX]V?2>NLFB42:?@<850-+,-0211222/+7HA8<;AepC6DE@=;;:93,,23@TP;6@=4..78/#EY1$)%&/22]]][\\Z[]ZVUVVWYXTTTTSRQPOQQRSSSRRSTTUUUVVWWWWWWWYXVWXYWXVVWWVUUUTTTSQQQQQPQQQQPPPOPOOPOOPNNOQRRRRQRSRPONNOQQQQNLMNNOPPPPPPQQSTVXXVTTUSQQRQQPNMKJKMLIJKKLLNNMMMMLMNNLLLLLLNPQPNMMQSQNNNMNNNQRSUXYWX]aaba]YTSVZ\]\[YURSSQSTMO[bceije]XXZYQLTcd[NGSd]NPaonikpsrrliy~gVZ]_adhlhacmqnswh]^`^Yf}{}}npttmnuytpidegijjfccfjkjjloidnqfdiiikmnopprurqaX_hjfhkub^]s^_aabccccdddcccccdeffghgffljixwspfhhkvwolnoposuutkdccgo}dXeih|Y]bap{m]]xvxzrlfd`[\gnvhZ_cchjnmlmcepkdY`gZ䳃qe\\[Y^iohpspokikihgfe^ao{xigcababfgiijlpiY\lkgegd_\^^XXm{yutstvxob]^___acdb[WXWY\]\YXWWWWXXXYZ[ZZZYZZZYYXWWYYXbnld``_^ertmd\ZZZZbti[\`_X^ǭޟca^[ZYXXXWZ\`higghghhfdbbbbbb`^]^^^_^][]YY]egec[RRVSUX[ZYVTTRPRTTUYVSSSSPONOQQQQUXWYSSVZ^acdeedca`^]]]_abcddd^UQLMX]VSUYSMOSX[SOTVTVX[\[\]^]]\[[[YYXYXWWURRSTRPOQRTVXYYZZYYXXXYYYZYYXXXWUSQQOMKJKIIIHGFED?cĿ]LLKKKLNOONXcWMPUWVUSTQMIFHJJLT\^`fmqv|zm]QLIPYmuR>BCBCCDEB@?>?@@?>>>>>?@@@AAACMYXJ<<=<;:::;<;;<=<<<;;:9:876545542248;<<:::<=>?@GKC=BIFBBCEGHGDB??ABBES^_ad]LDFEADEBBC??A@BCDDBABEGKOH86AIJFA>@ABAACBABBABCDDBEFGEJPNG@><;;;<;<=@=;>BCCBCCDCDDCDFFFEFIKLMMKHFDABEIJ=2=>34FF:9999:;;<<:;==<:<>>>??>ABCDCBCCB?>>==@A@AA@@????@@?:3ALG;7;>=<<<==>@BA>=<=@DEEGGEB?>CHGEFFFGGGGGE?989=BGJH@979;:9:99998889?FGFFFGFEEA?><:::871-6::::=@?911135789:::::@C;6999<;;A<@O_bQ=4/--/-(05-+3;=<99:>A>>@<=e\;?]_?IPG>5-,-./11/..0111130*(+1-+00--.*'.55588:?3()*+22--30--1412/('&&'()),1430.,+-11,+28610134565443-.6;3)+7:73.*,,*(0;==;1()***.541.*))(&0>;.+2;>6)&'''''&%&'$'-.'(8A;578667648707MOE>518B7',=FC8421.))+,,.,))+.-+*+@RRE5=CAITI9764237L^@AmqS5+1A;0;840/,*-3311012/';^R;:94214CTL;>EA>>AD=0*=I3.2./499ZZZZZYXXXZYWWWVVWUTTTSRQOPQQQQQQQQRRRTUTVVWXXWXWXYYXYZYXXVWXWVVUTTUTSRQQQQRRQQRQPPPPOQRONPOMOQRRSRRSTTRPMMPRRRSSPMNNOPPPOOPPRTVXZYXXYWUSQSQPPPNLLKLKJKKLLMOPNMLLLMONLMMMMMJMPPNMKMQPNMMLMNOQRQQPRWZ[^__]^^ZTQSVYZYWWYWURPLKMW_`dhkjbWNPUSKKYhlcPLbfTLQ^mtpfdkjcs}wx`]`cekqtqkijllmobWWXXXaz|vz}tit|xttuqkebeggjkgddegiiijkjinkbchjklllmnprtpg]Tfqfhihikx}kYy[ec`bbbbcdcccbbaaa`boyidejhk~wnz{y{umjopoqtyqe]addcfn~][eamnW^b^g{o^`ef[lorrfe`XZeoxn^XZ\]_^[]aenrrsd_iZExժzY^`[]dhjiippllkjjihhgb_^X^ghpe__`dhiihklnsn[Zhkfgd^[]^UUmzyvuuuw|ra\^^]^`acb\Y[_ba``[XWXXXZ[[Z[ZYYZYZZZYYYXWYYY`npe^]__aippe[XXZ_bho_Z]_Xh¬޾tcc_][ZXWWWY[^ehgghhhgfdb`a```_]\\\\]][Z\ZYW\`a`[USXc^XZZXVTTSQQRSTXWUTSRQQRRRSSTX[]WSPQTUY]`befdb`___^^_abbbcegd]SU`[VWWRQW\fga]XW\]\\\\[\]\\\\[[YXWWVVUTTTSSQQQSTVXXYZZZZYYYXYYYWWWXXXXVTRQOMLLKJIIHHGED>Mտ]JKKJJKMMLJS^WOPWXXVUROLJGHKKLLQRVboy{k[QMOSfuXACBBBADFEA?>=>?@>>>>=>?@AAAABCMTSC<==<;::;<===>=<<<;<:::876554431159<<;:;<<<==>EIDEJMKIIKKJGDCBB?ABBO]^^`_ZL@DEADGFHGDAA@BCDCA?ADHLPA47>IJIA?@BDDCCCCCCCBBDDDFFHHIJKHB@==;;=<<=@?=?ACCACCCCBDEFFHGGHKMMNNLIJE@AEJPJ46HJ:789:;;<<<:9:99;=>>>????ACDEEDCCB?<;=@AAAA?@@???@@?94:ACHJJHHHHHHGHKLLMMLJILSTH>;>FH<8;??=<;=>=@@@@=<<=AEEFGFFD8:EIFEEFFGGGHF?:99=AGLH>98;;;:::9998889>DEFEGGFEFGA<<:;:96/*-6;:<@?>7062356879::9;AA:56668<>@C;6AQYJ3.,+--/;:=;53/2;<61.,**+-..-/6;6/-+-18;71...3;;<9..//,****)*6HPQJ7((*,++9F;--+'&(-1:JWRF2,6;3+('&%&%'()+.134674,)-683,(,8>;44;9.*,./../07==;4/1.*''',.//3555111/,('&'')+-.18<<;80+./-0;<611345763101/06;4.29964.+,-,))19@;)"*/-/12-*)')++*.55-(+01,(&'((('&&%&%',*&.;897656686024589933=5%)>D4/462--../.+*()**+*(5TYNB:97AUYC5873,+,6F8?pvT/(?XJ,*8=;6030)')*+162,6G=,&',.)041:QW[]M:7BLKLF.(4441-+++,1662/00/,&5Zkbds]>=<>CDA?A><79GRKELJA==C@7/.3:=>??>>>>???@AAAABBMNL@===;:::;<=>>>>===<<<:987665542037;<;;<<<<==>@CCDLOLKMONKEAA@@@>?CKW^^_`_^TMHECEGFHHFCA@BBBA>8:DIKLE;5;JKHAA@BEECCCCCBCBBBCGHHHHHIIJFB?=;==>>?@??@ABBABBAACDEGHHHHJMMMMNPOONDAAFDFTS;89IM:78;<=====:8888;??>=?A@>@CEGFDCCA?<;=?@AAA@@@?????=859ADGIJIJKJIHFHJLMMKIIIMSOA==:AI@::=>==<=>?@AA@?<::=CDEGJJD95=FEDDEGGGGGF@<;:<@GKF=79;:::::9::998:=BDDEGHECGIC<=<<<:5-)-5724??81374324668988<@?;7533465;A@;7;HK;1*+-2;GF:7?B<545:?HMMLGA`sFe~J<2+,-.00/-,,+,.133420..,+*++.2487//:EGGC@?:9>;52028;83.+))*./,,-3982.*+1981.-,/6<><4/-...,*,-/7FRSOD1'()*(%.6/*.-)(+,.6CRNB2(3>6*)(%$#%(()*,0223541++2651(4VaT?;ND6111100/19@?80(*.0+()-58747785487,&'')*-11.-09?>7/*...4>=4002456632/-,.27414776641/.-,+-29=2)/3.-0/)&''*.1/,*-,))**'&&'((('''&&%&,/.6>@A@841.04761-*)+0EUB4:0&*67,/551.00110.,***)*(*:RL=7766J\U;3><6-+**($?tv_@0LcY4",9@9.01+))+*.8>0&68+&%+6,*597BLRUF9AHPPNPRD35:51//6DEIOQTK92Z]fmtzvkb\XWWVTTTTTTSTRQRRSSSTTTUUUUUWY[\\\\[\\]\\]^^]]\ZZ[ZXXXWVUUTUVVWWUSRRRRSSRQSSQPPPPOOOPPPRSTTTUVSPOPRSRRSSPMOQPOPPPRTTUX[\\ZXTRTVUSRQOOONNOOLKKKIJLLLMNMMLLLLLMOONOOOKIJQVUMJLLLLLLKLLKKLMLMTZ\[XVZ_ba\XTUW\___aa_[UOIHTbikjjibYSTUSQRU^hdRIMPQQPU^_ZbtYdv|t`_ebbksvy||wcXZYZXVTTTWVRa}t^^c``gkhdabcfjmnlfccehoqefhihdfhggikknttsrh\Y^\erhpjchfddde`X\g{|~~td_aY\aabbbbmwk```_^dwkccafhq|ywz{ouusw{ztlnqqqpmtwsecccfkzb`gs}gZ\_alulbafmlbrbNSUTWYZ]^]\_^]\[XSYefk~ojhghdeUecikmmoqnmklllkjjlnldZ]hlnodkt]etphhkjjkkksti`WXggca___a`br{{|}~~}rb]\[[[\^`c`\_^\[[YYXYZ\]]]]^__][ZZ[\\ZZYXZ[[[\gyo`]^^`_^gmeYV[ad`dn_[^Vl޹iY_]]__[YWWWWXWZadghfeca^^___^\\[[ZYYZYXetb^[YYWVUVX[`^YURVUUTVXWTSUWWVUSSSTUTTUY]afiklh^WVUUWXZ[_bca`_^]\]^^_``_^][[]^`_\Z[]^OKW]]\\[\\]]\\\\\\\\\[YXVUTTTTTSSTSRTWXXYYZZZZZYYYYXWWWWXXXXXWTRPNLKLKKKJIHFEHA[źsXMKKJJIJIJQWUTTW\]ZUSPMJIHJJJI\rrq}o\ROOhX=FDBBBDGIF@=;<=>>>>>???@@AAAAACOLF>===;:::;<=>>>>>>==<<:98766543128<<<<;<=====>?@AGOPMMQQMD>@A@?@>@FV\^]_``aaXH@DGIGHHFCB@BAB@<66=FKJJA2:IGCAABDEEEECCCBABBACLKIHGIJIKIDA?=>==>>@?@@A@@@A@@ACDGFHHIHJMMMMPSSS[IA>;23OK8:>EI:8:=?AA@@?>=;;<>@?<<>@@>@BDEFCDDBA><;=??ABB@@@???@<77:@DFJJJJKKIHFHJLMLIGGEIQK>CC=AHD@<=?@??>?ACCCA?>;:<=?AFJIC934;AEFEFGGGGD?==;9>IHA;79:::::::::9999;AFEFGHEDGGB?==>>=9424650.8>5/2110/2579878<66542.17:<@=:?:1**0;DFC=<@?639?DIOQOJC8Oc:HiubA70+-/04882,--.024564331/-/,)1;9;>516@IF@A<69=:64334:9510.+)*.--.0541/,-176.+1889=>6,-////-+,/7FPONK=+'&'('&+-))+-**+++/;JG=921<7)&(&&)+(&()+/387672*++.26(5eqXB:G=,11212213=CC=4++196*&*2;:49;3/496-''(*,..-++-242,))//-4=;530022344/(&()+13234235673/-,+0546:884,*-,*()),/0/+*-.,++*'&'()('('('&((,5:?>@F@4-)&*3860,**,:csXCB;,+11./11/.-/35560++*(*)-7A<5453<>>>>???@@@AAAAEOIA<<==;::9;=>>>>>>>===;;9865553225;=<<;:;=======>@IQRRQQOF==@@@?@>>>>>>?@AAA@?A?@@CDGFFJKIILMMNQSSRYKD@;71388::=?:;=>ACCBCCDB@@ABA@=;<>>=>?ACDDFGECB>9;??ACB@@@??><877:@DFJJJJJIHHGHJKLJHGECGOG;CFCBEGGA>@B@A@ACDDCA@?><:66=:7;HG;77::::::9:::999::?GHHGFFEGGC?=<>=;<;:9740-064/0/./02369889=?@?;888643117<>=::85/.:BDB?=@A;35@ILNMKGC?5Jh7048630./01358:4--//037975432223/-7B>;>933:D=:?93:>72345456775420.034111--,++.22-+;H;-/2231./0211/1;INJJF6*(&'''')*('$),,)*,-7FD6673990))*,46*&(*-17=<651*)))+2->olC<:98-/2335835?ED>71-4DA+%(*3<69<-&/2+))**+++++*+-.-)%$&)+-4:7650././1/'#$(*,0310/,+0685.,,+07637=<5-*+*))+--,,,+.231/01.&%*,+))*)(&,0,3BB5;GB4+%$*2770()*.Guy_NI>.+/11/-...-25310/,),..+.1233453DOORUUTG:.,+.62An|rf``ac^LABFF>==95-$'(0;=-,+(''$,:0&8D9/1577:BBDGJUF41)'&2=7037876:3+0.2bvW/3`qhe^XTTROFFOOE??=>CAC<0*)/*/TA)???????@@AAAA@FOE>;<==<:99<>????????==<;:87655435:>=;::9;<<<=====?FQUVSJB><==>@@@BL`Y[]^^``abZ<5FMEDHHECBAEEFEA:84=LLMKI@BPJBAEEEEEEEEECABA@HNMIGHHIJKKID@>?@???>>@ACCBACAA>BHHEFJMKHKMMNPSSSVQIA@>=42887>??ABBBCCBCEFECABCBA=;;=<<<=?@ACEGFDC?99=?ACCA????=7388:@DFIJIJJIHHHIJJJHFFECGJGC@BBCDGJFA@BBB@@BCBCBA?CA7538BHJB54657;AEFEFEEE@==<88?>747<;9:::::::9::;;?HJHFFFFFGF?<==<66:;97531113///0100279988:=<:6554455548=<<:;;967DDB@>?B@96<97834;=5.1565579:63235358410.-+)(+-.,+5@9)$+9B5.-1538509HLHE@3-)((''(()*+,240-,+-3?A7//1585-,.189,%(+059>=830.+*(((-FnT15:43322248;25CHA;61/:E<,')(,:;730)-2/-/////..-,+--+*('&%&,464211.---,*'(+/210.+*)'(-44.++++*-2546863.+*)),//+*,014664488,&(,-,,020/.1/2=5(4FB5-)(*0572+)((Evw^TG2*,-...-./0/12-*())(-31...0127?JHIH>842Hm}mXA1Dkyxsl_TUUNJNNHBADB>56762.*-(,TJ08:9/3Bsrvzyxwxwxzvpha[UTTSTUUUUTTTUWYYZ[[[Z[[\^____abccefededcdb^^`_^^\ZZYXWVTUWWVVVTSUTTTTSRQRRQSSQRVXVVWVUUWUROPQRTUUTUTQOOONNOOOLIEDFGJLMMNPONNONMNMNNNMMMMMMMMLMLLKKLMMLNONOQTUUUURU\^][[\\[[ZZ[ZXVSPNNMNPPQSSRW]abccccc^[[^`abb`YVUPOU_inlgeaZWSPQQUSPQPRV^c`^V_yX]x}~~vcWUZcm{pi^V[YWWWVWYXWWUUTSexkfkh_\age`ahonfbbbbbdeeffffginolkmmnrwxz{p[Ygmt|wng_h{}}wabeegjklq{{z|w{g[[YY]^ckh^\\`_]`````_`____^^^^bffdddeeoqppnnqpip}ughjjkmptwtoy{hd^_cfghimowz^`ih`ap}te\]agid`]fxiYdKX]mmZX`flortrf\\ej\rsa\cbPkntponnmkmnkjkiace`cjh\Zdllkihgsvkmllkklmmt~ogcca^`\[y|{tj`]]]]\\ZWadWU[^\ZXY]`_`ab__fje][\`bb]ZXXY\^`_aw{d``_^^accdc][bcdcehkbYXwʸiX_]\[]^^^\ZXXXXXZ_ca_^]\[^`aa]ZZZ[[[ZZZZ[ZY[\YWTSSSTVWXXXWYTQWXYZYWXXWUSUWYY[[\`befhigfffda\WUUTUWY[_a```__^_^^^]\[[`fhjhhnmha^ZWVUWY[[\\]]\]]]]^^]]YTTVXWWVTSTVWXYVVWWVUVVVVXXY[[[[ZZYYXXXXVTRQNLLLKKKJIHFGHCL˥pRMOOU[]_kfWZWWWY]]XSSQNLJHLNJJNQSYfhYQbnZE>DGEEEGIGA<;<=>???????@@AAAB@GNA<:<==<:99=>?>>>>>>>==<;:876544469=<;9:99;<<<===>?BKYYRB<=<<<>@B@G[_W]__^`bb`O<8;F>;FGECCCFHJKE::9?@????>@BCCBCCCC?CJKEGJMKHKMMOQSUVYYND<=?:7862FLCBGHECDDDDDCBAAAA@><=>??==>?>?ADFDC?99=98:9:@CEHIJJIGHHHHIIGFDEEEEDJMA@BCDGHHC@BB@>>@BBBCA@HK;434=;649:77544211111110/2<<67:=<:64343200223437B@;;8;B@=;=ABA==AGIJF>5.--,$UP27536640/00...././24333320/0111.+.8DB66634;:76537=<6257654468775540263/046320,+/20-/1*'.7;3..01.02/>831.+)('%)AW:5576241111:;29GIB92/07=3*')*+284/FL@4776655465.*+--++.2/((,110/--.-,+,.-01561+))*-,).30,*---+*.455431/+)(&+0/+*/677877:>=0)(+.//5;;921/03*%/@?42,)*-49944.#8ow[PH63/--,--//0.-2530+*-/./-..01/>OG>0*ALKI:1/-+-48>ISD;OaRH_]KCGPX^_`^Q?3.,,,+.8;431&'43)2/+'(+2<@78FFHF@7().*$0139@JOTYXI5*+Lvt[D=CP^juvnaTXVMHLKFD=;<:68;==>91)+VT56980.3lovzyyxvvvxyunkf]ZZXWVUTUVUUUWYYYYZZZ[[]aaaaababcddcddddddbaa`__][\[YYVUVWWXWVVWVTTTTSSRQRTTTTTVWVWWUUUUTQPRSSTTTUVVRPQPONPQPONKFDGJLKLNNMNPQONNNNNNNMNNNMNNMNMLKKKLMMMMNOPPPQSUTRUXYXWZ[[VQNNNQTROPPOOPPOPQOQW\^^]]]\YW[ababdc^YUONTY^eknolc[XVSTUUSRQQRZbbda[ihTWel_\db^_]W^mv~hQ`|vUV\ZWVVVVVVVVVXVXfnefhb]\_eeaenpjc`_`bcceeeggdfjnpnnnnpruvz|vc^ejq|~qd^du}}j_adgjmmq||ztz|tkijlkhhjdZ\^^``ab```___``_\^ejigfeeeimumgjmoqhhmpknuyiijklnptzxjksi__cghjkntwgZejc``nyo_Z]chgc_bkia`vxYik{TZgmpqttlc_`^RTZUWYXZ`jromnmllnkjklgekg^`dfgge[Yemllgfmvqlnmmlkmmozytunjda`^b`Zo}vka]^^\]][]aZUZ__^[[[_a`bcfd_cjg_\]dee_ZXWYY]^]\ra^aa_^`cbba^]bceddfnjY^ŵڣ`W]\[[\\\]\ZXXXXWX[^]\[[Z[`acb]YZZ[[[ZZZZZXWZ\WUPOPRSUVWXXX[WUWXWXXVVWVTTWZZZ^_cfdeffgggfeec^WSTTUWYZ^abba````_^]\[[\cgiihhfgkd^\[[YXY[[\]]_^]_^____]YURW[ZWUSSTUVWXXWVVVUUUVVWWY\^\[ZZYYYXXXVTRQOLLLKKKJIGFHICLrTMOOT[\^stXWWWXY^^VRSRNMKILNKIJKMNTsrZSmd^F>DGEEGHIE@<;;<>????@?@@@@AAB?IL=;:<=<<:99=>>>>>>>>===<;;986445569<<;9:99:<<<==>>??L_XH@=;;<<==A?:[^\___^`bb\E<=><55??@CEEHJLPG;86:EKLJCCDOMBEGFEEEDEDDCEDEDKSONLJJJJJIHCA@???@A??@BCCDEEDDBFIKGILOMJLPOQSUWWY^L>88987862LXB?@AAA@>==<:9=AAB@;9;=AGGC@>>>===<:;ACEHHJJHGGGGGFGFDDDEEBFRVK@FCDFKJA@BA>=>@BB@?A>GTD5436CLE54344337AGFGGFB=<:611322:=<:::::;;;:;;;>@B@<98610-'+IY?>9;;;<<=ABACCFHKKE=8/*/6+Go1,0-0585/--,+++++-046310/.-.01.*)*-7E<35524896534;?;699976332358<:3-.0.,/4:<=>3+17973/,++//////.)+26ALJB<61021/02,*+,.-/1/152-,*2:;5.--+)()))()()*,05<>:41-+)('#*6:69869841116?:3:DGC7..1561)',1/+-5>_j[;8><<966994.,--,,.13-+-/,*)**+++*-1212343200168-)../15443/.37621.)&''',1.*)/9<:779>B>2+(+/23;ED7010/-*)-64+0/()+2;?>=5*/^yYBIH=2-,+,-/.---6AB@93221/+,.01-@TL7))6FOH0)--,/68<>937FYQ?XeN@BFNUWXTI>=;652,/=F?324/.6-,,*((.38985;:?Lcn@$KaA9749?HHIYgR/&,JlZA=;>HHPepjc^\WLCLLA826857BHIJKC5),XT54891.4qtzzyyyxxvuxwsqmgb^[YYVUVVVUVXYYYYYZZZ\_accbbcbbbbcccddddddba`^^^]\[ZZYYXWXZXWWXWUTUUSRSSSTTTTUWWWXWWWWXWRRUUUUUUUUVVSRQPPPQSTTUQLIIIJLLLKMONNMMMMMMNMMNMMMMMMMLKLMMNNNMLMMNNPRTSTTUVXXY\\[VQMJJLMMOONMOOOONNNPTTTRRRRRTX^baacca^\ZYXYXY_ipsohaYWUTTTSQRQV_aeh\ZZXUTUTTUUR_{~henw}p]MNbkTW]ZWWWVUUVVUVWWYfjced]\^^acdhpqgca`bdddeefjlecinopppopqrtxz|ghq}~ue^fmu|zr``bcfnoos~}z|}}zx}~~peaccefb^bb`____^_``_]aqwngeeiklry|yrpjkhfgjt}jjjlostvvzeakui__ehknmmrutdchj`_^n{j[Zeliba[[b_`fmgxȽxYZkoqqssld`a^WTUUW[_gnmnnmlmmnpkjti\`jg]_djjec[Xdllkhhpu{}nknmmlllmozqkfbkkcWXakhch|~qb\^][\[[_WVZ^_^^\[[_``bcfe`ahia\]dgg_YXXX]fe`\pc^ba_^^____^^aeeeeenmZdôڔYV\ZZZ[Z[\^ZXXXWWYYZ\\\[ZZ``ac\XYZ[[[ZZYZYYWX[YTQQSSUVWXXXX[XXWWWWVVVVWVWY[[\fjljffffggggffe_XSTTUVXZ^bddbaaa``^]\Z[]chiiigdcca\Z[[YWWYZ[]\ZZ^^^^___^[WY]\ZVRQQRRSRQRUXTSTUTUVWWX]`][Z[ZZYXYXVUSROMMLKKJJIGFHLEQýütTNNNRYWVhnZYXVWX^]UQRRNMJIMPLIKKLLPnyXUvwY_H@DEDEGHGEB<:;<>????@?@@@@AACAKG;::<>=<:::==>>>>>>>===<<;986545678<<:9:879<<<<<>?>?O\N???<<<<;:97;V\]]]]_`bcXA<>@B:5<;=BEFIKMOH<869@KMDCLJKHEFEFEEDDDDCCDFGHMSOMMJJJJIHFBABA??@A@?@BDDDEEDDCGLJHJMQPKNRQSUWXY]^G27688676;WX>:E@>=@ACDDCBBBCBABACB@@@?=;:6236===<>@CEGHIJIGGGGGFFECCDEDAJX^OAHCDIQNA@A@>>?@AA@?A>FXO>863;ID421101565>FEGHB<;71./211:=<::9::;;;:;;;=AFGFGFFGIKLE<::8676134122110111000-1DH;7ANPLIIOQLIGD@840*$:^O8=:5/4;@DA;=DGJNMC=90*49.LvC*/1/1331,,+,--,,.023530.,++.21.)*+-44635423565424:=87;987531/-013641,*+,,29>>=3+.3964542031.//.-(*39AJJA:40264257/-,-,),./374+'(*17851010/+)**(&(),168=:3.+))(&$*4*49:<9;5/115<647>DC7-.2420('.62*'3ZzzsM9CA>;747772+-/20.-,,,-.,*())))**-220035100--495.**.6777631474/-,&%()-02,&&-9B@76DPN=MiUB>639?A>>????@???@@@ACHJ@9:<>>==<::>>>>>>>>>==<;;:997656779;<:99878::;<<=>??FKCB@>==<<;968JVY[]\]_^`bYB;=?A<9<;ABCCBAACDDEDBA@@AAA><:73119DHIE?:?ABDEGGHJIGFFFGFFEDDDDCCN\bH=G[[N>:89CB321.,/6;15@BEHD<;5.,0410:=<::::;;;;;::;=AFGFHHHJMNQL@<:5575012//./01100000,1DMA:HVUOJLVYSNKID?<81*+I[<=<:6239CA65>FJSOC=7/0>?/@{z_@1222211/-)),/2445742110.,,,+/432.-+-01567610011114887;;579741/.-.,,/1/----299841../0-,/2344432210-/0-3FI@8412767::///.-)..1894,'%$*036433353--/*('(*.47:81*)((('%*4.+2/39<5/,*+++*,1:@5001110+*++DK(6Yb`^H5=;975552/,)020/140,,.0.-,,,,+,,.110287,&')((.792)(.687765661+**((,.253,($%0BE:6>C;11-()-/1=E3*..-..+)1;;510*'*166:;88:AZN8BB60-**,-.++048<>A;54241..0546891(*0)&.,+.576547=AEHIFFD5?cXD91*,7B>>>@FDCNTICDD:-)+;H=4,((&2:60&%YFtC9HJC85:JU>14+)-123A]nnigaWUSTSH(/9;:=MLJHIO?<8XV:455-&-vsotz{yyywvvvusomifca\WVXXWXXXZ[ZYY[[\_`_^_abbba__``_`bbaaabbba_][ZYYZ[\\ZXXZZWVWVUTTUUUTTVVVVWYZYZ\]\]^\ZWVUUVXYXXYZZWRPOMNOPPPRSQQOMOOONMMMNNNNOPONOONOQPNLMMLKJIIJKLNQSWXXWVUTSQQRUZ\^_acdcdbYTRMLNNMLKJLLLKJKLKKLKMNMR\```ba^^bdb`^WOQX`iqutpdWPPOPTUTUZ`dfbZXXWWWXXWWTS_~{celoeZZ[WVZ\[]^[XWXXWVWWUTTSWcf^`ihaa`_``]Y]cda``^billommrqkkoqtvwutrqprxnjsr~xwndklmqrrmaadjqqnuz{w|~}x}~~znc\]^_]____afw|nmnfgxoknoqsy}k`^^`iZ]fjjlkigeb^bknjf`bj|nWaq^^_wgmpbWQ]gW`~جOV\cghmspb]\\ZXUW`innnonmnrqkkXWPXbc^^beijf\Ycllknotqilomlkkmjvxme]]]ag`^nqvzrmmp}~g]\\[Z[[Y]da____^^]]]]]]`a_\`eb``dllaZY^erxupedk[aa_^^]]\\\^adeedccfYiϽoMVVVVVWVWWZ\[XWWVWXYY[]]]]_[]^USTVYZ[[ZZYYWUVWWWXYYXYXXWWVWWWWXYYZYXXWX^XU^cgijigffhiijihggfhf]VWWW[bgijebbbaabba`^_djjjiiijgeb_^\[[[ZXXWW^oeXKKPOT]\]^____\YXY]__`]XN[k`UTRQSTSTY]]\\\[[[YXYYXWTQOMLLKKJHHKKNMN»qWNOPQPNNU\ZXWURY^TMORQPNJLQQMJIHHMO^η]gzsd^PDCDDCEDDB>:8:;=>???@?@@@BBCCKF=<<<>>==<9;?>>>>>>>>>=<;;:::8777889;<:9987789;<<==?@@?@A@>??=<<<=ESWVY[]]^]_b^D:=>?>>??@D@=@HHMF;;;NRNLHHFFGGGECDFIKKFKMNOOOMKJKMNJ@;>A@@@@AA@?ACDDDDDBBFNMJKMRROPSUXZ[^_bdR476544:8;OQ?=<<=@BCBACDDDDDEC@>>@CCBAA><<845=GJNNH=8@IIECB??A?@BEEEEFGHIIHFFFGGGFDEDBBCJVXBEKBFOTMB@???>AEIGC@@?H[^ZH;9;??4340+-273/8BEJE=93,+/;<79;<<;:;;;;;;:;<=AEEEGHHIKNQOF>93453000/.-.01100000-1DPD;N^ZQKMZ_ZSOMKHE@7/*;SB9=<<7447=:56?ITRE=5.6JJ25huS@5684100000-*.57789:83/--,+,,,145694,.7:89970,++,-/578=B;17<851.....,,.110/36:71..,++)****+,-02564343.'&4E?5422246940110.-.-3<<;=;2(&,/45431561.30*''*-/0240*()))(&*2/**&&*.00,)'()('+36420--/222/+Ii20:102-+./12442/*(*..,,1750-02100/..--./011265,&$(&%&)38.'&+2689982+(''(-02342052(*:B;5;>931.((,,1=:,).,*//,%(395/-)').128:8535AA992+/.))-..-.699<@>4561544356643.&'/;2%%'05=@6115=BDGGGD@87DE<51/0GP=+,0/,0>P]a``]WTKJQA-.38?@ERKAJTZPQBWU723-*)+mjjtz{yxxwvwvsqomjklha[Z[YXYYY[\ZYYZ[[\\\\[^`_^^]]]]]^`abbabdecb_\YWWYYX[\ZZ[[XWXXVUTUVVVWWWXYYY\]]\^_`_^]ZWVVVXZZ[YY[YTRPNMMMMKJKLMMMOQQQQQQRQPQQQOPQQPRRRPOQQONMNPQRTWY[ZXUUSQPPNLMQUWZ\^``acdbb_YURPOOLJJJJJIJKKKKMNMLQUUW]abbbegeghdYRSU[ejnvypc[SOPSTRU[]`c`\WTVWWVWVWTPWcbfpuwpki`XXWX]_[XXXXVVXWUTTSWcd]biklha`_^]\[^a`_^_`jpmmkfiqurrqtwxxyuonmljhhltw{~pdimlmmnyvb`joprps}y}y~yowve`__^__^^blx|pjgho|snoqpqt|n```bi^`bccdeecb^`iohdaadmxl[xm]^bhuhe_[]YXReฯSXaegdhvs`[[\[ZX\eillkjggjmqcVXTQXd_\^_cijf]W^jnlox}rkkkjklnjkxqf`[X[Y]sqaequrmn}|ka^^\ZZZ[ikb```aa`__^\\Z\\[[^fgcbepqcZ\dntrkiji}k[`_^__]]][\]`beecbaa]`оcNXUUVWXWWVV[[XVVVXZZY[]__``[Z[WTSVZZ[[YYYYXWWWWXZ\[ZYXXVWVVVXYZ[[[[ZZYZ[[W]knkngfghjjjjjighhiiaZXXY^eikkgcbbbcdcbb__hmljjjjgb`a_^][[]]ZXVUUVSTJHJLV]\]\XTUWWTUXY]`cb`XZeg]TRRSSTTY^]\[\[\\ZZZZZYVSOMMLJJJJIIKMNJikTNOOOONQVXWVTSSZZPLQRQONJLRRMJHFEKPQf˳drxusfVEDFFEGGFC>999:<>???@@@@ABBCDFB=>=<>>><;;<>>>>>>>>>>==<;;::9778889;;;9998899::;<=?@?>??>=>>==<>@HT\[WWZ\___dcG=A@@@@AAACC>===@;<<;<@@?@>?EGEDA?==>@BEDCABA??<:@FIHFFFCJXU\WB7;<<8687-.022&.AEJG:3-,.07;86:;;;:;;;<<;::;?CEDEGGGGIKMOI>844420220-,.01110/..-2BOE?Sb[RJKY`\WROQLG?8316?>3;9665549<86;@IRK=1,;SR:9[nU==CC@:4222463/4<;:88741,(*,,++0234<>4-07>><:7,'(,./1488720/.,++,./120-4884-+)&&(**)*)(()++2=<7642/));>1340/.771033100/-7EMRUVQ;&&*+1331252032*&')++/331.,***)(,20,*'%&')000..---.45210./34315DFN4..+)('(()+.660,)),+'((+-,+,/33334442/.00000/.+*)((()(*//.)&)-3653-(&''(+//,.27=?82487678874/*).1672./0+)/.*$&,-++++))/457862/57530+-2,(+-.1129:8:8756658:<:74432,'+3;7,)/6;@B3--3=BB<;AD?940//12129C@?A9BX[GJ71-(*,.172*hW9IK8,()4DMQC*'111589:99:<>???A@@@ABBCDD@=>=<>>>=<;;==>>>>>>>===<;;;:989889:<;;;:99999::;<<=????>>===>?@???CR]]YY\``adeF;ACC@@?@AAB@><:88;><:@PDHUTOLKIJJIHIOSOHDGHESYMNPOMKLNPNG?=><>BDCAA@@ADDEDDDCBDLNMKNSRQRTVY]_aeipZ/6545;9;>:===<;988:=<=?B@?><=@ADDDCCCCBAA?=@FIKMPOE8:HKGECCBBEHEBGFEFHLJEJHGGHIIIGFD@@BDB@Wk[HISSGDEB@@@@DHHFFHFGMMV[O<;;=>98721135129BIH:.+,19?9159;:9::::<<<<<@CII=;99997::;:8544/))+--,-13/0;=3/14=D@93+(*12441017=9/14211/,*)*+-..//-0541/-+(('(*()/.+/0--5;:65464/8=1.32/2:A?:71/42,,:LW\[]`R2%'&)+,.0121/.*''))*16530-+)(',.00..,*+*)+.10/-/33552012/,,*)*75./0..+*)(())0;;/'(.1-'&')*(&'-1000110/-../......13.,-,,,+-00)$&,22.*(''(''+*&(/7;=B<57:8665410-/344310//+())''''(,23-*,49632212781..052)(,-.2555334/3:8788;?>62553/-///5407=??;1..2=A<428=:40/,/58645601JXZkZA6?:'',5>96:369,)/25940^}>AXL665>VNKP?69754442E]`U?/+-661/-9DGILKI:3:K>QW8*-,.0/mqwxyyxxxwurplggmqplha]^^]\\ZZ[[ZYYYYXWWWVXZZYYYYYZZZZ\ac``egefjlkha[XWUWZ[__\ZYXWVVWWWWYZYXYYZ[^^_````aaa_\YXVVX[[\^^^_]XSQPNMMNONLKKOPOOPOMNOPOOORSTTTUVWXZ]\ZXWWYZYWTQPPPPOPPPNNONKMMMOOQUWY\ZVSUVRLOTTSSROMKKJIJKLOPOONLMSY]_^YVZ`dhlmljfdb]Z`gijjigc_][YYYX\__[XWVWWWVUWXVSTVXSYlqbYY^dfeb_`b_YXXWVVURVabZ]kvvna^^___bdca```bksrkhkifmuvttnmwzgZ]bcbabbbgtygemnggmsrgadeditupnruqlnpnow}|nj~y~d\efqm`_^aie^dsuphgupfaadhjklmnz~s}n\\[[aX_bbbcccfgedtca[rw]ag`p}abof[Yr]boveVW\wהdknprop~rwhZ]c`]\^]^__]]cfb[|]gdc^]^_emnh^YYaklilruzypijmlllksym^TLORTlmnmjijgkzja^]]]\\\Z[]]^adedc`^^]\]]]^_bbbcex{gX\{ejxzkda____\[Z\^_cfbZX^_Zd¾ׯ`RZXXXWVUUWZXZ\[YYZZ[\ZZZ[^aa`][Z[\]]][ZZZYZYXYXWWWVUTSSSSTUVWXY[[ZZ[YWX[fpk]bljijjkkiigfffjnjgihb[W]dgikkhfecaaceffghkljkjijhXJOPa`]_iuaJ\_SXTOVe`VY[^ab[MHHGHNQRX\^]^]]\[YY\SQUTU[^\\\^]]]]^[[ZZZ[UPMLKJJIHKLLNQOVsùbQNPPRRNOTWUSRRSWTNNRSQNLNRSRNJFDDFPVH@l~stvi[EFHIIIJJD=:89:<>>@@A@@@ADDCDB?==<;==<<<==>>>>>>>>>===<;:;:999::;<<;;;:9998::;<=<=???>>>?@@ABA@?:7=N[^[Z\_adc@7?@BBAE@?AA@@@:9:>@>9EUNNTQLHJMNKJJKPNHDFKMKU]QNOMKJKPPLC>>>>>@ABACB@ACFFFDDCBELMLKNUWUTTX[]^bhlrY-65:=;::>@@>=<;955:;;:;===>?ADDEECBCCCBCEDBCFIKNPQH9:GJGFCBCDEMF?GEEFHLIEKIHHIIKKIHD>>AD@>L\[CLTL;BEB@@@?BGHEDFFEEHLTUF==>==:855:::=<8AFG;-+-3COD14;<:9::;;<<<<<>DFFFFGHIIIHGGD;444312341.,,..../.++-0:HKKPRSSLHS]ZTQNIC<99;A??@7066789>?AAAAA:.)EcJ:9=BJOMLKJHCDFA;:9:9999889:4-*,.25323.,5;:7406DC72,,.24430*+5:554./322.)(+//--.0.-.011222.+*+((268;5,')18:86522=F>/.24/('+,*-9DKTWX[R6&'$%(*-....-+++,/124652/+)&$)11..//872.,+++,-.243442///+&%%%$$&*/0/,)(+12-,3:8+%+2551)%*/-+*,..,+++*+*+,--..-,---.-,)*++,,,,*()283*&'(((''*(&+0006757<;862-*-0530/00-++)(()((()1;;3,),3730/1356311134.''*-2664202219<88845:;8698532/-*4:5?E@710/16<9632231++.059975421+PDC`ulf\MRZTSL:6AGMG6()-51ST;6.-/,.rsuxxwxyxusplhefmrpnke_^]^_][\]\ZYYYXWWWVWXXXXWWWVWXXY\_``aeffgjllkic\WXYYX\_^[YWVWXWWWXY\\ZZ[[\_```_`aaaa`^[ZXVVWY\_``ab^WRPNMLNONMLKMNNNOMLMNNOOOQRRSSSUXYYZ[ZXVVVUSQPNMNOONMNPOMNNLLMLLMNQSVZXSQTXUMJNSSSTROMLJJJJLNMMNOOOOPQPOONRVX]dilmmlmmid`^^_cgihfecb_Z[afc\WVWWWWVUWWWVVVST`bZWXajijihgeb_][XWWUSU]_[]lxwna[^a``bda_ceabktrjhmompsrrutsq|fZahmjghfadrzmjjiikourd^_^_ekqtqoompvtfg{jenYW^\cdija^\^hnf_kvqdZ\g{rfaacfijkkmx}|b\^]\\]_`aabcegihfs{hb[Ylq^bgY[oa]guusw]Sadb`efqͼZbc]aa\`ffmkea^ZY[\ZYa`__^\]_]Lsfeie]\^`fmoi]YX\gljfjrywojilklkl{w]QMMMObvloqkgiuxy~la]]]\\\[Z[]\]_`bbcaba_]]]]^`abccdwygWgww|zzyrica``_][Z\\^``_ZY^caYh¾{NVVVWYYZ[[]][\\[ZXZ\\^^]]]_aa`_^]\\\]][ZYZ\^^_]ZXUTUTTRRQSSUVWZ[[[ZZZZX^ipopf\hiijlmkgdefegimkhjke\W^fhikjigfebacehlmmlkkkkijlOJURa`Xez|g[phUYWRObe]\\_bdaRHHJJNPNV[[\^]]\\ZYYTTTUU[^^^^^_]]_^][ZXVYXSNLKJIIIKLLNRSLMoǼ^NONNXWMMTUSQOPRTQMNPQPNLOSTRNIGDCDMSNAKyprreZGFHIIIIIC=:98:<>?@@@@@@BDDCDA?>=<;;;;;=>?>>>>>??>??>=<<;;9999:<;;<<;;:::9:::<<=>>??>?>>?AAABA?=:98;IU[[Z\`b]<2<==??B?=@@?@?<9;?DACRVUVQGCCHPMIIJJJHFGIMPMT`TMOJIHKLJGB?>>>>==@BEEABEFFEECCBELNMMOU[YVUZ]^^emovd66:4?BA@>??BFGCBCCCCCFKQNB>?=>>;8<@=9;>=ACF=,+-5EMME>>=;:;;;;;<;<<@DEFGGFGGHGHGFC82224425651.,-...-,+,,084155557=>>=;9982-G]>5;CMOQPMKKHAAHH@;754565678:<5,+1795310/36?>3,.;>3-01034556/,58236436786.),131./11,),023585321122597/(&(.379:6-.>JC3+/9DNUS>+,.'(04305?FNOE5-,++143.,--,,+.5898883.+*)(&,770,--12/,*****+,.--.//./.*())*)(-892/-,/7=;01892+).2246-$).-,+,,,,)(''()*)+**(*+*)&''%#$&(*($&--).99,%&('-0*.2,+)(()/10598861..030-+./--,,,,,,,,2=A8/*'(./-./1340*,033/,)&'/8;72..235;;87842699:;8642/,+2959>=4/1//47112222/**.14873496.$0^{J8UZQB3./24;CEIKJ;*,48;?9,[vNCEQf_QOSdkg\G??@?@@BDDCCA>>=<;;:;<==?@?>>>??>>?>=<<;:999:;<;;<<;;<:::;:<<=>>>?????>?AABCB@=9:<99BQ]`\]a\=3>@=>?>?==??A@<9<@GFLVRTUG>=CHOIHIJJKLMMNQSLO`TJLIHHIHCAA?>>>>==>BFFCDEFFEEDDBDKNOOOT[[WWZ^bcgqt|rB7>???===<=>>?=:8779<<=?AABDFGEEECCDCCFHLNPPLJLNRRMDBHJHIHIIGHA9;FCCAACKOLLKKKLLLJID??DFFEDVbAKI/4<@@?>>?BGHDB@?@BDFHLPF?@A?>=;:8426?B;8AA.),8IJNXOB>;::;;;;;;;=BEFFGGEFEFGFGG@60112346874/+,,*+,,,*,1=HJSXUSQHFV`]SPNLKICADGGKEE8210100/28::8535:=8FU=5>MSRSTRNKIB@DFD?6-.1354427@9,,1443421012::10/370.35//26<<52552146789<:2+-0430-.11-.222357:<;<9100+'(+,/431793.481*,5@JQTPA465*.57/*.7@GHA>=778::5-+1551*(06655/+)()-.*).562-+.000-,,---.-,,**+,./-,,+,,+2><52368;<8//670-/./.-.,''((((,...+)++()+***)*-0-)%&%&()'$&'$"'+()03.('&%.2.363.-,++.00269:7531/0.+*-122110//-+1>@:2*'''(()+--.-)%&*-.-*(&(2<<50/0468:;97769<<96875530.,-123344431/020/0/1473.265468:<7,7^Karlg[G1.4:EMQNGF:2@KF>/*opb_Q]~z\GCHVlxgWXK=>@@DG;5<<4+'(1::6667666466*QJ6=;6.*;mouyytqrsqmjiffhknnoqrldb`__^^]^\YXXWWWWXVTUVVUSTUVVUVWXYVV[^^^a^YVTTUVY\]]_``_]ZYXXXWX[]^^``_`aaabcddddedb`^[[^_]YUXZXVVWWURNMNLKLLKLLKLKKMLNNNMOPPRRRSTSSUUVWVY]\UQPNMMNOPOLJLNMLMMMLMOOMLNOPRRUZ^^_c_WROLMOONMMLKKLLLLMOOOPNKKMNNNNNMMPSW\cdbbegikhdaadfgikkie_^__\VSUVWWUUTSRTUTTVYXURU[[[htmec`cd\WXZYZZWZdp{|oaYYafedceigefjotvnkrvtsvxpklqyo][\]_chhimqrzsdp~pnpprtoptvtsqnmmjcgxc\]ZSalbb``^[Zdjfjwuear~}{hdddfhhhilomfa[[o~eklZ]aaaabdcaaeehe]dpigZWQTT`]TSQ}dl}wkif`fhox~VZXWYZ\_acgjfcaaZ\aacbbsi[]fedb^bkjba`aabflj]XXXbnpou}{qlmkkllmxsZOOORtxiopmfcehov{pa]`a_][[[[ZZ[\]]^_`beggd_^^__^bgW[kc_XP_ɷofggeceeb_a`^[ZZ\\\Z[bfda``]U_º԰XTX[\\\[[Z[]_^]\[YYXYZZ\]^]^_`_aa___^\[YXXY[^``aa]ZXWYYXWWXXUWaea[Z[[`hmonnjilb[lprjccgkijgftypkkkic[`hihhihggecbdefjmmlkkgiikgPRZ^`^HNl_[]UUUSOTYQSZdeeYFHONMKKNVZ\]]]][\]YTWWTSY_a``a___a]VV\ZQEOZPLKKHHHIKNOPRULT¬XLMM]iVLORROLKKMNKMONNNMOQQQPOLJGFFHJMKDTtuklf[ZJFJKLJIHB<:99:;;=??@?@@BEDBBA>===;:::<<>@@?>>>>??>?=<;;<:999;;<<<<<<<;;::;<<<=>>?@@?@@>?ABBCB?;98<;8:?KX]\a^F>CB?>=?@=?FHCFHIJNTTRQQPQLL[YGIHFGHC=<>====<<==@EFDDEFFFDEDCEKOOQOT\]Z[\`fiksyxK7A@@?>==>>>?@>;877:=<>@ACDEFFFFECDDDDEHLMOONKLORRNIJKJIIIJKLH@?IKCA@FUYRKNMKLLMMIDBABFIIGEWaE@:/36>A@?>>BIJGCCC?@CFFJNG?@BB@>;5248>B@6498+),7GLLQOD>=;:;;;;<<;>CGHGGFEEDEFFGF;101223579972,((-5;4*&',8AJX[WTOGGXc`[XTSSMDELMNOF:5310/.--.157654?JMDCOK@>ILFDKJFDB?==;:=9,,25642.4;5-./02354313455422430021/03:B?768:9633452571,-0320--07;975443568=>6230*')-.030*+7;41-')7ELPPMC<840+2:91+5JRJA:9;<>A=72,,6>>5+((+---)()*,./+'%0=8/*05/.-,,----..,('((-011-*)+*-6867998787/.21.23012.,-+((+*+021//4660--/----./-)&&).01-)*,+(&((()++*'&(+,0;84134551/,.5:96321000..-154331/..0;;.,120,'&''*+**)(&%'),+(&&,6951./28;98;9448;=:0,44357510/4:867;<;;:8765202575016748>=92@vjeqnjgcJ123?NRM85>7;?@6/5:0(%&0==79967<<685+QJ6962-3Estvxwtolkmkgffghjoonopmgda]]^]]]][ZZXWXWWXVUUUTTUVVUSTVWURS[]ZZZWVWVVVWY[]^^```_][ZZYWWZ\\]^_^_`abcefffggfeda^]`cc\WVWXXVUUVTPPPNMMNNNLKMKKNMNMMMOQQQRRRSSRSTVWX[_`^ZUSQQQTTRPONONMNOOLLOPNMMNOQQQSSTW\cc`[TOMKLMMLKKLLLKMOOMMPOMNOMLLLMMMOSUX[XU[^XWZ]^\YXY]__`_[YZZYWTSTXZVTTTTSSRTVWVTTTWTM\sskib`b^YVUX[\XZerzyob[\affefhkibesrqwqmx~wqs|ynmordXXZ^bc`ekpy}uw~|{{z{|zwutrpnnmidrx]Z[]blfbb``_]\aggkomozykgihghiiihiigeb^i~zgedcbacfbblnege]jwskd_YUR]]XSd^`tu{xdYali\rܩXMZ`iifidcuzti^^egfabgfxk_ss`]hn`^cdedcccehf^ZZZboqpy|rllkklmnwo[ROMivkojgimoqoca~tb]aba`\[[[[Z[ZZZ[\^\behgb__``]ciXSbb[VVMWmfgjnvpb_^\ZZ[]]]_beeda_`[RtŸԪTX\]]\ZXWWW[_`^\[ZXXYXYZ[\\]_`_``__^^][YXXXZ[[]]]][YVXYZ[[XVU^hc^[[\`fklkmlmkli_jnj_\agjjiiefikmjghf`bhhhhhgfffccfhikmmljkeeijfU\cYU]KMs}TKXd[UUVUVMIN`efXIKONMKJIQW\_\]^]\[^YX[VUY_abbaaec^TSSY\PCCPWQKKGGHJLOOPRTMQȾVMNP`aPLPQPMKKKMLJLMNNNMOQQQPOMKIHGIIKMDGbmgmg\XJDIKLJIFA=;99:===>??@?@BEDA@@>>==;;:;<=?BB@?>??????>=<=;:9:;<<<<<<;;<;;;:;<<==>@?@@AA@?@ABBBA>;:8<;;;:;FXcd_RECAA???@;;@CA@:9>;AJJIUF00;GKE;HIJKPWWRSPMKMNZbEDGEEC>;;=>=<=<;;;>CECCEFFEEEDDELQQQQW^_]]_bioqtz{R7????>=>>>>@@>;987:@@CFEDDEEFFFFDDDDDEIKKLMMKLNNMMMKJJJJJJLLIFLRNDC@H^aXMNMKLMOOJBABEIIHHHSU;2580/>DKKKJKMBADDDGJFA@?@>:33;;;;<<<=?DFFFGFEEEFFFHG;21113547:;:::8>JOQIA?=;?DJY]YUOGGXda^^]XWRHHPU\]N3/3231.-,,.258:59==<:7687026214883/-/0/../13332212344555433530/14=FC;6:B@720-,+-21-.021/..1:B?;876430.693021+()+-.--*&+137738DLQQPD2+0++4;><7.:WXA2-*,9BA>;8208CC70.-**+*++,,-..-*%-?81.07-(())*)('(+.+(()0011.+***-25577339<:4-*(,4526;962-),31/3840/37:70+-1**,-,,.1//0221023/-+()*)*)((+/.)3C<1045784/)+4<:20/123432/176-(*-.3<;.(.5;:1(&&&'),.-)&%''()(&&,5961./27997::2.1130**22357:979<;=?@BDFGGB=;<954442/236998510IuwuohiU73/3CKA3).:?C=9)HnapM2?[lknmgP4?ZW?7873--,)'%%1@=/2@?9BC95/+UJ54,(/@Fyxwyyvofdggfdefgjnollonida^^^^^^^][ZYXXXXXVTUVUTUVUSSSUVTTW\\ZYXXYYY[\[\]^_^_aca^\\[XVVXY[]]]]^bfeefghhhhhhfb`_`ba]YWWYYWVVVVUURPPPPPNLJKMKLKLMNMOPPPRSRSSTSTVVV[`cdb^[ZXXXWUSRRSSSRQQNLMNMLMLMONNMMOPSZbghaYUNKMNLKKKLMLLMLJLRRLKMMLKLMNNNQPQX\XX]YQPW_^WQPTTRTYZ[\[YVUTSWfj^YVTSRSSUVTSTVXVNVpxplga`]ZWUW[\Z_ktwwn`\bdgkljillb_qxrrpr~}ngjrrihgcZ[\[\abW_}y}~~u~z{zwxzzxxusqoooolds\_honiedba`__^`ccc`fvpmkkkjklmlljfbdr{xwokgfeccjpl}yedb^mx{xyyn^TX_ioR\nxupvuj`^d{bM[ennjjacwohw|xqghkisnT^aZY`ZUbgeccdcbb`\YV[nroy|rmmkjmmnxhXSQSrqgfkosqkg]Ys{e^abdfb^[ZYYYYYXZ[\XZXbgc`_``]ckZS_aVUV[WQi{yl`_^\Z[]]^abdfeb^^]TeʷϜV\^\\[YZZZZ\^_][\[YXXWWXYZ\^aa_^^____][ZYXXYYXYXXWVWWWX[\]ZV[dd`^][^dikiiikjlnqhab[Y^bfhiiid]Z`gjihigfhhghgggfeedglnmonmklkbekgX_d_MWQ[qn]R`zyaW\YVNJCSddVMLNLKKJHLQW^\\]^[\_\[]\YZ_abcddg^SPQRTXSE=ESSLKHGIKMOOPQTOP}RNPR[XOMPPPMKKKKKJLMMNMMPQQQNOMKJHGGGJMGASZbmh\VKDIKLJIE?=;9:<>>=?@@@@@BDDA??>>>==;:<=>@BB@?>?@????>=<=;99:<<<<<=<<<<<<;:<<>=?@@?@@BBAAAABBBA>;:9::;<GYdbZJEFIHEDC;9=BCA;;BB?@FE>416@OMCDJKLNPSTSSRQMOQ]jHCGDDA???>??=<<;::=ACCCDFFEEEEDEJOQQRX`_]__ajuuvx~~W8?==<===>>????=;:8:BHHHEFDDDEFFFDCDCCDIJJKKKIKKJJKJIIHJJJJIJJIKMLFC@C\aYPOKJLPURJB?BGJIIHLXM,,272.;DCB?>CLOLHLQIECBCEFDA?=:889BJRTOA/,+-/--09>BEII>;<<<;<<;<><+46442/---,.9IQTTRMIB;7646<@?<9864234/-031120.+++,,-/13334333335777653440/.05=B?7117=<554/.03432100//027;:74333322463.-,,**)))*,+(',7>@?BCDFEC9.*011:A@>91;NC-'%'/=DA@A?:79BD:442///0012210//.+1=511.2.,+,++*(&&).+)**25441/.--011.-003<<63+%&*1438??950)*6864:5103:9:4/291.1322694000-+.341-+++,,)')/563/7C@50/1111,+19>;2./23343104:7/,/247;71/27;7-('%&()-33*$%()**+*),4=901420036:7-*++++,-013449;9@D=>HKIIJLMKFDFA?><;923669;5//39W}wuvh\G62/-3961+#+>JE=6?r|pwowH6?UgipkhqhODSY?5?:41(%(*,8@3$)<@@?=.)$,RD41((6F>zyyzzvnebdedcdegkmmlknojdca_]]_bb_][YXXXXXVUUVUSTUSSTTUTUY\\[[ZZ[[[[]^____aaacdca_^[WTUUUWXYZZ[_abcbdhihhiiheaaaba^[YYYYXXXXYXWTRQRROMNLJMMJHHJLLMOOOPRRSRRRTUUVZ^___^[ZYXXWUSSTVWXWWTRPONLKLLMONMMOPPNR\bffee^SSQNLLKLMMLJJOTZZSLKKLMLLNNMNNMR^b_`a[TXaeda_]WOQX[\[ZXVVVTUkziVTSSRSSTUUTTUWXTUkyrmke]\\ZWY\\\dprsum^^echtrjhjj^T`vzoozo[Y^`]\\[YWZ_]Z[`fmwtvyyv~|{xvwwvutuuuvttsqppoqgd|f^irscm~qmhfhfcZX^^\acb^`t}{z~}|ysmjjnpstofbcej{zuqnmprepp~ca__lvsns~{dZiyXSUTgo^UQceYfUcde^[\`fc`]{ϹttsqreNdtXYb`Uel^]_ba`baaa_\UWlpnurlmlljjvt]VTTYfjhmnmkd\Y[_of]abejkga\YXXYZ[[[[\^U\db_]`_[cl[T^`XUUX[YPX|ê~{|ra[ZZY[\\]bddeda\[_ZYɵ̀Z\_\ZZ[[\\]]^^]\\[YXWVVVXZ]`cbb`_```_^\ZZXXXXVWVUWYZVUW[^a\Z^a__^\\_djkhejieijni\ZW\abghgggefdZUekjjjiggggfefeeefinoooonmlrh]bm]Za`KT[lr]]vr`etj]^ZTQTFH_`UMLLJJKLKLLO[]\Z\[]]\]^]\]_cdbbb[QORRRQQSIFEHLNKGHIJMOPOORQShQNSSUTPNNNNMKJJIJIKKLMMNOPPOMMLKJHHFFJLHCCQYTZjj^VNFIKLJIC=;:9:<>>??@@@@@ABBA@??>>==;9;=>@BBA@@@A@???=<<<;99;<<<========<;<>>>=?@@ABBBBBCBBCBA@=::9::99:?>7?SabNBFJGFFJA8;@BA<;>B>===<:;=?BCACFFFFEEEGJNPQRXaa__]]hvzzyyb>EA<;====>????=<;:;BIIB=BCBCDEFEDCDDDEHKKKKKJJIIIJHIIIIIIHHJKIKLLJE@CY]TPOKHLSWRHA>DGKJIJOQ>+.59714:?AC;77:;:<<<==@DDEEEFFGHJKJMRPCCCC@55CEB@??DQ^cdejmmnnjddfc]UOGGUaa\ZYWX\UJKPFGTM84545421.+*/ATUTPIB?8232//5=B>8532.+/42/.--.--,++***+.1346788413:;96531.--,/7?;50/5=EH:6<64968853355345642212344345440,+--,+)*,,,04<:948=0$$$,9><<>@=<;:?@=844411467:;852/.-16/35./.--,-..,+'$&'&')/410.-+,,.-*'(.28=511-))+.037::443))5>:/57443767527;45667995.,-,)'*141,+,--*&&,7;6348>>9/+020.,/7=<81.044234568:;<<::;;6.020262+(('&((+.-)&')/44010/6?7,052+(-240)*,,,---.12246639?sR53451,+-/0/.,3BJ??GNG^QGihmxlS:J;>??@@AA@AA@@@??>>==;::<>@BBA@@@A@???=<<<;99;<==========<<=?>>=?@BBBBBBCCBBCAA><8:9:9989;;;?BA<97@C@DHA/3C?@HOWSPQRXZXVVVYXZWc{WILHGEEEDC@>?@><<<>>???<:::?ACDDEEEEGGGIIJKNRLJF>98;BBCBAEKOSWY]__chlnkhf_WSOGFQ\^YTRSTWSKKJ:19EC73565354+(7MVOID>;<:9:730/08;5110.,/46.++,..--,***)**,2668:9635<>7531/,-,-18=5+*3HSPLA48:9@==<748>?8689977778:7101221..00/.../13;ACB?<:9:8654248967::767540-)'(.441368758:<><9544436868<><7/.253./1,++**,+++,./(%'+.--.-+*)))***(&)/6:9310-,,,,/3114677.-9B?11878833574685321/463.+)*+.045/++01+(%'.8<5/4:7121.1421259;;810031/02333222587751,021231-*)(&''((()+*+3<82344::.)-/-)(*,-,+,.-,-+)(+048630267;CGJGMNQX`c\TNPRJHF=9;;:545:<15sH*9C?3,*-./2::35EF;;>AIXM988209=1-1+'(*641744FRH4320267-omjryui`^`abcddfillmnlmlhdba__dgc`^\[[YXXYXWVTSTUUVUTSRSW[\\]]]]\[\^`bcbbbbcedfgfc^\[[YXXVTUVVVX[^cfhjkkkkmnkigggdb`\ZYYZZYZZYYYXVROPQPNNPOMMMLLLLMPQPPRQPQPMORSRPPQRPNMNNNOPPPSVUXZZZYXXXXUQOPQOPPPPQRPRZacfhkkcSMOOMMNOQUY\]beeaZTOLMNONNNMNOPX`^YX_dgijjnp`SV]a`ba]WSSTVcbRRSSSSTUUVVUUVUUUU^lwwl\TVZ\[Z\^cjnkjnfX[\Wj|lVT]]YZVR[lzx`W[WWWWWWXXXY^fdc]YW[tupruwzzz{}~|urvxyxz{ywutwxuqomkks}y\T[WSYQJYcciglf[\][_cfbauystw{whehkkkliefkl[b}~|xqriZXrq^__fnpkklpt{umtoll[QǓd_dr\LKsqchl`WUW`[OTh`XWhpdhpustVU\Y\]^XYwva]__```acfceusn|{nill|}cZZWTQaemtlog^\\\\\]^om\`_YU\gpph_\[[[[[[Z[_\WYada^YblVOSRSRRQTVWYZOQy{onmbXTX[ZZYZaeeca^\\]_]VǽbV]]\[[\\]]^^^^\\\YXXWUUUW`gebddcbcbb`]YWWWVUWZZYXTW^dccccaZY^a_]][\aike`bdaadghon^acihfhkhfcgqqjgijiihgffffffeeefjoonoommmlaIOeic\YYXTKHKRYeiaNK[_YWTRRNLKPNLKKJJKJKLGCITY\\\^^^^]^_adaXRONOQPPQPPOOPPPKNTNKJJKMPPPOORNHlqPSTORROMMNNMKKJIGHIIIKLLMLLKKJJIIIGEFIKJFFIGEIZkkbRHJKIEA><;:;<<>>?A@@AAA@@@??>>>>==;::<>@AAAA@AA@@A?>>=<<;;;==========>>>??>>>?ABBBBDBCCCBCA@>;88999::9:9@GADLCBG?79DFEDCDC>954BIBBFC;=F=8@OTSQQVad_][X\\]Zf[GKFDDEEDCAABB><<<>>>?>;::9ECDOM=7=KVPIEDDDCB?=:6/2331480(9PN?53:BGIHGEDC@=:81.//00///-++-//..+)(*,,,+044455688753420/....28;5(,@OQOJE813:CB?>74;DE<68;>@?>>>>933200./361143./7<@A>70,,/4333212795498665540/.,,.,,,.../047;==95458::968>@A?5.2641+(*))*-1.,++*--*(+/1/,)'*--,+,./,+0574000))+,/6>=94567546971.6649621138=:51--/352-,2579:60,+..*&&+15632:;3.15202667899:841/-+*+-+))'$%.52/..03685300,&%'(((*+,,*,7<82.2582('*-+()((*+,+)))('%%&*594/-../6?EKMRX\aefgaTJKMQJ62::966;C@60Qf{yuQSZXF3.+,.-.7=:7>F?6.0g_4),2,-IDEsd812/37AD=GcfgtiKAHE>JYL94424621221*(.-6INKABCFC742/-,da[bqrh][]^abccehkmmmllkhecbaadeba`][ZYXXZXWVTUWWXXXVSRUY\^]\]]]\[\^abcccbbccdfhgd`]\[\]\\\^adfijijjjlmnlloooomlifdb^[Z[[Z[\[ZZYYWUTSRQPPPOMNNNMMMNOQQPQRQPOMMORPMNOPOMLNNORUUVXXSQTVXUTRRVVRPQQQPPPPPOQTVZ^`cfhf`TQPOOOPRTSRW^__bfd\QLNNOPOOOPPOPTSPT[`dikkkg_Z[][dhb\WSUV\ZQRTTTSTVVVWWWWVVWUSZhg]XVVWWXZ^`ejmjijcVUSTjudUUXZWVbmq~m`\ZVVVWVWWXXZ[[[OYY\jrnoqvxux{}|vtvwwx{yxxxwvvtroomipcOTZ[^]pV]abejij^Z\[\_`b`\fu{~~{~~~zmeeihjlkhfkjdhrx{|{zujqtgqr__ahnnllpnp|{n^VXZfh`}{[]ieUZhcfvg[YY[e]QLLS\Y\foomrp|vYW\ZY[]][`W{iaa````bdb_unx~pjjntZ]]UPP[kfsnjvbZ]_`aclplxs__`[TSWennfb_\\[ZZZZ\[XYZ]]`]bhff`Z[^bb\ZYXXVPHjollbXUY[ZYXZ`cba_][\\_^ZaɛY[\\\[\]]^^^^^^\\[YXXVUUTYdhdcddccddca_\ZZZZYYZZYXVRU_edcb^WYaa]]\[\eli]\aa`cgmu~s_acijimmfddfimomkkjhhggffeffffefinnmnnmmlm`AKtue]TYZNJHJLOPPTOJOWUTSRSPLKJKJIIJJJJJKGADKSZ]]]]]^^^_`b^ROPOOOPPOPPOPPPNMOPSMKKKMPQPONQSJQmSXQLOPOMMMMMKJHHGHHHJKLLKKLJJJJIGGGEFGIIFFHJGFShodTJIMJFA><;:;=>?>?A@AAAA@A@??>===<<;::<>?@AAA@AA@@A??>=<<;;<<=========>@@@@>>>?ACCDDEDDDCBCA?>;8889899::6:MRTRQ[hkefc_^^_[eaEIECCEEEDCCED@><<>>@AAEHIGHHGEFKPVVTYfruqmjgmwz|{tNDG@==<==>>>=>>;::;LYTJEEEDB@>;8)0325=;57:989749BC<<BCCDC@DV]UQQV[Z\itxhPSYTOMHGPWZXTQOLIGDD>533533./00/142/:G@.,3;FJMMKKKLLKB8/+-221/,),.//./..+*)*,-/.2553313664/24310//./39=8,1HQPOHB92-7EE6337>D@879=?BBAAA?=9851/+1<;6:=4.28<=;:80%#*/3443335654543312661./,*.,)())2==>=<<:769=>?=:>A@CD=3.12/*),+++-110/....//.,./2-)/670,.57402442,-2/..5@EEA<731/.-+)(('16-,-*&&+4:::6/-049503<=9=@7340-+(&(,13325==67=>5.27867897620-+*&)+--*')1531008;5483011-((('((*++)'-67450042+(*.0+(('(*,+('''()))*-231.---.27>INNWifegjcR?6=TW=3>;89;@A720.-cv;45GioZ:--++++,/9;:51;D2&QqS3,-*+-+.+,63*++,0650+;]deoaIHORQIHTI/.14;500230015;HRTT[Y\U@5/+'.^][\aeb[WY\`bcfhhkmljjkjhgfdcccbaa`][ZZYYYXWUTVXXYYYWSSW\^^]]]]]]]\\[[]_bbddccdeffda_]^__`abdehkkkkjijmnmlmoqrpnkhedb_\\]]]]]\\\YXXWVRPPNLMMOOOOOOOPQQPQQQQONMNOPPQQONOPPQSWYZ]\YSNMNPQQOOQSRQRRQPPONNMNRQQTY`ghgf`[SQQPPRRQOOTV[agge\SNLNPQQQQPNMNPOOPSZbiklmliecX[aa``\YVWUPRUUTSUVWVXYXWXWXURQSUUUWYZVU[`acfkiij`VSSZij`]]ZZVSk}h\VVVVVVWXXVRQPS^[]fnqrsuxxz|{wuvvtwzyzxusppppoqnkw~}XPTWZZX[Wbfcc_hii]ZZ[]__debllr}~{}|yvgchijlljhjjovvsqpmliiryxze`^cilmlmqmmmnpsf\NQUS_fljnT[Ÿ́c[Wl]\_ndX[VTWXSVWUSadwkYlnaZ]\]^^ZtUh}{kgda_`abb_fxysmhvl_`^TMT[vnfne_^dfmtxvvplutc`b\WTR\hmkfb_\[YZZZZZZXUT[b`awwnw{j`]YXXTWTtujlcWTXZYXXZ]``_^]\[\\]\Vp~T[\[\\\^___^^^]\ZZYWWVUUUZehdceecceedca_^^]^][ZYWXVPOWcecb\W[]\[[ZZ_gmdW[bdfilut]_ahmstofcbdeimnmlkihhgffefgfffgjmmmnnmmllgMSwseXIWZJIIKRRPPPQOLPPOORTRMKKKJIIJJJJJJFDGGKV]_]]]]]]^^[VSQQOOOOPOOOOOPQRRQRYOKKKNPQQONQRPEioYYMKONMLMNMKKJHHFHHIJKJKKKJJJJIHFGFEFFGGGFFGGFQhofWKIMJEA<;;;;=@A@AAAABBBAA@?>>===<<;:;=>?@AABAAAA@@??>>=<<;<<<<=======>@@@@@>>?BDDEEFFFEDCCA?=:788887789BHG>=FCA?>@CJ?GJE@>>>CMQJFGGEEC<554DTVQQbrqoqmdbba^chFIFDDFFFDCEFEB?=>>>?ABGIHFHJIGFIOVWU\kwzxvwtw~qGEE?=======<;=?:9;<>DFGHGFB@AABCCDCCBCDDJUWRPOLLLLOSSQPOPPNLLKJNNMQWSHTb^^WSNMVTEKSJLKIIIEC@4+.43457988?DFHA;@@O\TJGEEEA>;979>?I^kthH>:2145478569899@E56A=:7@GGDBCCDFFGGHHGHJHD=16CDCCDEDADU_VQRWWNYktxeOW[WQMHKU]]YVUONMHC?:654320.-./..143;C5(08;BLONMLD=<@A:1*.550-+*,24200//,**+,.346963324553/0542001004:?:/3FPQOH:3868FG1'/9CA638:>@DECDCB@><73.'2C<:F=--476348:4-,1146555433651120./8<3,/0,0/(&&+@@>@A;3475:A>3+(**)*.-)(*/3788888870*+031.48:2-.:?855322.+4?:17GIE?841.+)''()*-,33/-+)(-454430-*/379;=;8<@:7::3+&&*.110139??BGHA89985487630.+*('(.30*-564102:DB4042.12010*&'()))((-10011130-0386-))((*/101.+*,-0441///.,+177@4981631+')('**$'-,,04741+,IahcOEILR[TNINH0,=A4+-2=D@::?ERS]d`Z\@0,0-0\\^\XZ\XVY]acfikjkkjiiiihgfcbbba__^\[ZYYWVWVTSUWYYYYXXZ\]^^]][\]\[YWWXZ_bcddeeddfijfc`__`ba``acfffffgijkjiiknonmmjfefea]^___^\\][ZYXVTSSSQNOOOPONNPOOOQQQQPPOOOOPSTRPPQQPPSWXXY[ZYWPLNPPONPRPQQQQPPPPPPPQPNORXaeegga]WSRQSSQPMLRW]bhjf`YPJMRRTWPMMMNNNNMPW]ahmnopiidbbcec]WUURTWVUTUWWXY[ZXXXYVRRRTUUWZZXY[^_adhhijbVSZdhe``_Z[YRkw_UVVVVUVWVURKOY^[]ckosvvwwww||wtwxv{~~kchjjknqprj`nvfUTUWVWXW[ddcbcgfne[Z[\^_cdjrl}{|{v|mcghjlmlkjjpwywvricdhpqoprf```ejmpoonmjjlpojZWba[_fjq{dZ`WpˢdoϖN^\ZldVTTTTRTTTTU\g}\`txqf\^`]\`VRdhW[ir}zlfa```aa`big|skl{}hfdYOOW^grwhdswensy~~pikiinf_a]WWWX\dghed_\ZZZZZYZZTSXab`|ujtujegjqvngaW}glgXRWYXWVXY]_____]]\\[]SnS\[Z\\]]^__^^]\[[YXWVVVTVZbecdedbdefdb`_^^^^]\ZXVXYRLUbfc_ZYZZXY[[Zajh^W[clqqsy|b\agorythcabcgknnmkihhhgfffgggfhknmmmmmlmdl^Tje_QD[[HGILRVUSQPOMMMLMOTTOLKKIIIIJJKLIGEHHGT]`\\\\\\^]UTSQQPONOPONNNORVYXX[^TKIKNPQQPPOQQI[|pcSJJONMLMNMKJJHHFHHIKKJKKKJJJJIFFGFEFFFGGFEGIEK_lgZMHLKF@=<:;;=BBABAABBBBAA@?>>===<<;:;=>?@ABBCBBA@??@?>=<<<;<<<<<<===>??@A>>=>@BDEFFFGFFDCCA?;968887678>HG>67;CB>>=@BGHFCFIIJGFMYZXas|uzaDGF?===>>>=;<>=;:;=@GJJJHFDBAAABCCBCBCDCFTZVQMKLLKPUURRRRROMMLHONMZp_LQkomeQQOVLBMOKMLLG?BDE@08:6434:9;>BC>;<=ET]TJHHFDA=979?85LYfsj`_=467665689;89;;A<78<60;EDCBBBCEFFGHHGFKD<>=BIGEDDDDBGV\WUXZJ3FbrrYIY]XSNIO]c`[XWSPOLDA9565430------/36;14BJPOF6.GJC:?C4-.+*,493,(''&*00.,)-6;=@@>?@:1+*/2223431--;B9454231,4<52>JJC;520,*(&'(,1316<;:7558843321/)(,5=?;55<>=<=84+&'+.10/1258;?HJIEB=9777740,++***,162.48642224;A3.10/24463)((()*)((,,**+/31/4:=>:0+)((,7@A??6,,.144/-...--177<=4FUXadiiV@<3+6QaF122343-(.1107DB8011('&('*)&'((*)+.34,%,9;0)17830,+-.07?<2+272563-'8WWIDDIGKX^V?<;<=>BBABAABBBBAA@?>>=<<<;;;<>??@BBBCBBA@??@?=<<;<;<==<=<<<<>?@B@=>>?@ACEFGGHGFDDDA>;:7778889;DGCD?==BC>?ABBA@CEDDEBCEHGHMRNBC?637>IUNVxyqlfb]irDGEDDDDDDCDEFD@?>>>=>@GHFADGHIFDMZ\[ct~y~KAHC@?>>???>;=?<;;:=CIMJLLKGECCABCCCCDBCBCKUUQLJJJINRSPPRRRPOMLHIMLTpiQJovqpZQVXHISJKNMI;/8ADCC99:;DU]SJIIIE@:67=@78RPOhuxnG689888989:89::9:9685-5@BDCBBDEFFGIIHHG63@@@GGEDCCBAHW\ZVVS<'+IpfGGX]ZTMJP^dba_[XUQNC;766653/,,,,--.27<=59:69INNNLIC6-+,/39BB;531..3631//.,,--+,/27610./0231/.242344258:;956;?LM@2+>SLLN:,/7:4/3738C3+/32-*,/4446531021224310///.++48976673*1<01MSG@>?;9>?83:A:760,('-10/3/%(3687.*179?EEDD;1+)+.131,*--/;?5042001.11+5HNJC7221-+)(((((),06=C@658998852.+**/7:515:<=>;:2)&(+.122121,/:1-+)+7DHFEE9,-00/20,,.031167=21PO:Jai`LGB898@VL644685,+0/...)'.-*20+'&'.0('&)+)&4GJA5''0-(19:1.01341=UZC.55,183,)+479AILA<;<=>ABBBBCBBBBAB@??>=<<<;;<=?@@@CCCCCCB@@????=<<<======;<;<>?@A@=>@@@ACEFHHIIFEEEB>;:77779:=BGLHGFDCADEB><<;<>??AFEFHHHJOPOEDN=39AEJITwpgd]irCDEDDCCDDFBAED>=>>>=>ADFDADEDEEGJV`aeuG@A???@????><GMMJLONIGEDCCCCCDDDBBBDHLNKJHGGKPQPPRSRPPMKHFLLLcl[Hn{sr_SYXGNQFJMH;(+:8?GV]SKKKKG?957@=4?QJ:Qlj_H:;:99999989;;;<;8663-1=DDCDBDEFFGIGGF>02659FDDDCCBCIT[ZYSE1*%4c\>=>50AQPMNLHC93/./05:58C?5212210//.,-10+*,053+-0212201/./..23149:864963CK8.)1KSQN;./122456;>?@BILNOMLF8578;915;.+02/,*)-0468741///0131------,+1699;753,9J=8II<17@5,+,*.699<=:73*'+-0<=.)4:=;/)1439CIHA80+('*0731///1;=.(-1/./,++-;NRKC:762.+*))(('*+),5>;1../243/*'*-.,/4513:><::90(&),.13763//8?GHE@:9:<<71,)*++,04217;7791.99+%%++*+.268:71,*))+-2.'&'+3;958>?;73.+-/-/=GECCA4-/44340**07856775-=Q>*3FVMBF<4::;@D=727E<+/0.,+,++,+')3<7*$.8.)(*.02>NOQK5'')/6;:3+*,.012=<<:<>>@@AACCCCCCBB@A???<<<===>>><;<=>>>??>?@BBBBCEHJJJIGFGFB?<;8789:<@FHLIHFFDCCEB@::<>=<=CBDDSzslg_huDDFEDDEFDFECEG?=>?>>?ABDDAABACFGFQchiuPDC==ABBAAA?=<<<<;7?MQMLMPNJFDCCCCCDDDDDDDA?CIKKIGGINQUVVSQPPMPX[JMK[ieDf|vs^SUTFRKCJHJMB:AGFGFFC<877789628>=<=DS]TMMLKG>64>E84JRJ>@NTRC><;:;;;;:89:;;:;<;72-.5AFDDBDEFFGGGEA743+-9EDDCCCBCLUYXZR9,,))I\>IU`]TJINW_ceeea\YUOGEDB@?80,,-----5?BB@>2.@OOLLLHA74576565.5DGC?;5210/.,)+9@8/-032-.6;=:864432//22/3782-,0/+7?30/,9JOJ8-/11489987;CDEHNNMMA4787522570.02.+*+.158<<74100000-,---,.133347::520;KH=>;92:>-&())-340389;<80)')4@;019<8.*//-18DJ=.++(&*-7888887:9.+.23,-*)(+:MRIB>>940,))(((+1.$&+--+****+,+*),0.-/560.8<55682(#(/0.09;6/-6>CED=8:=;5/+*-0-*')+/67306=5-6:.('('',1246:;4-+)(*,3/))).68405;90*(%&,//.291.3EB-++/>A@;/0:>=:65408L@03*++***+**'#)8=5+1;92-)2>22FRY^WI<9ZiCZR')YXXYZY[^bfjklkkmmmljijihhgggdbbaa`[ZZXWWXWWY\^_bddcbccccdec__```^\^_addfhhgfeeffffgffeeedbabbbdfghhhjjjkkjjjjjlllmnnmjebbceedcccbbbcfgedgijnqgVNOQPNMNQQPOPQRRQQTTSTUVX[]aecbglj^KMWZ`ggda[UQONMMLLNQTUSQONMMQQSQOMMQ\efdgha\ZZZZWTQOQSU]fhgfb\VPKJKPVVQNNNPQQS[^ZPRUTW\\YY[cecaa_]\\^_[Y_ca_aa[XZYVUUUVXWVZ]Z[bfgd\Wgusg[\_``^][ZXR[pydUXXYY[BpJLicVU[m|rgbinmptw}~efrts|t_ZXYYYWTRQVbf\MX]QONNOT[dd_XXn~~|wokkjzyijhhijkid_^`bbaaaaabcbdgg`_ddkv}zuwgYadjw^NReXMNUZYbZaj]POPSTRSUVXUXyx{afmjohkysXINQMSfytc]^`c_errvsnogXRSW]bbbaba[~{rsnpwcdep}}h`jrrrpwtWWVWZfnia]]\]]\YTTX\he_^ZVUVTRX`pwmceow|tk~lfYY[[[ZXZ[[[[[ZZZZYYZ^Xu߳\Wd`[^^\]]]\\[YXXWXWVVVVVWXZ[\`ijeac`^[[ZXXXXWVVUX^``\ZVTWWWXWWWXX^f_Y\]^dtxw}vebjtq_bcbbbacdknmnmmifffeggefjoppomkmmmfcjlsvXZULKMRSW^YSPLKKLMNOPQOMJIILPTSRPRPQRSQO`c`bc_\\]`TBDLNURORURRRQPOQVYZZY[]XNMPPLMNNNLOON_|ZDHLLJJJLNOLKJIHHJKJJJIIIJIIIIHFFFEEDEDFEGGGFDCEELPMGGIE?=<=>>?BCBCBCCCCCCCA@@@>=<;<>>?@BBCBBCCBBCBAA@@>==>===>>><==>>>>>==?BDEEEDFJLLIIIIIFC?<;899:?<<=FGDKFEGJJKKQCR_OHBBFDR|vqkbiMCGGECEFCDQRFK><@A@@?@ACE@=?ACEEAMclluŬTCIB@CCCCAA?==<;<<<@KONLMNNMIFDBBABDEEDEEDA>@GNPOKIKOQWYURPPPLL^yUGMVfoJSwwt[ERPLUIHIADerjW=?IHGD?>>>???>53:=?=:EYXNMNNF<78CG1-HRFFKJLOGC=;;:<<;;::;:::9;=:3,,3AICECDFFFFFFDD;2/19@FDDDCCBENWYWTI3#&)'.FBBO]]SIHLU\_``abb^RQa][XUQD9212227?DDEDCA7-8JNLKJF@:9:;98511=HKLKF<11220.,-;KI<5565326:AA?;6595100/-155-''(*)/513612>JF2*0767;99935BA8BMPNK>/24/++0588530-*/30/49:732231//,*-21,+09<6,)-18622@><931204==97,)8KPH@?>;620/.-,,-20*)*)*../0011235760-0661054036:8/%'171,/65222208A><==5-++,020,('.78/)+2<;2120.,**+02246;:1+)(()+0.--+/672,,0/+(('(-01/+3@A@>>@C=982,/799=@>8129<0***5?BC<12?IGA8.487@FKB-2.'(('(()*),388989:3.2:CFC=AHE82AOMIJJA1''*.35;>8169?1')&16/0,&),&.HQDCA;;3->?ACBCCCCCCCCCA@@@>=<;<>@ABBBCCCDDCCCAAAB@>???>=?>>>>>?>>??><=@DGHGFFHLNLGHJJJHE><:8:;:=CFHHIIIGFFEEBABEFC@???JJFHGIJKMNJIEMNCGA?QKRxrnehZCIEEEFGEI[ZHMM=?BA@?@@AD?=?ACEC?Jbpnv²WAMKEDDDDCA>===;<<=@CILKHDBDFFDBAACDEEFFEDC??FNSTOLLOQSSRPOONNPMxmLKTghHHhwyX@QPSPIKF:ERSc\8:JFFC=>?>?>AB718:==6:NVOMNNF:9/,>IEEQUMHIF@><<<<;;:;;;;;::;?=3.3?KNLKHDA<965552/9LSPMJB8-+4;98759ELD<9889878=?=;77;832213597/'(*+-/124634=FA.'2=<=B97923<:2;IQOE5+..*''+07=971,,49507<6..1451.-+),10,/5;<0%&(.5534:3,1DJ:0,240//02/*,146;:8;@DE?:74113/*)'$-<9+'))'$&17/3=BA>60/111CH:;1.9JNG@><9435642110122,.46886555547:<80-144553/-26:=;2*/?A3'.8:72,'+9>;:80(*-,,-.,).76-'').7:1+,...//0223553/,,+('*-/02117970++,------0232258;@CGGDA>3-079;<@A?<=><71/17>D;3379858>FG@AF;**,&46(-1-,+)'.DSH8=<74=Taitf<)175'6j{jXXYZ\^afiklkjkmmlkjihhgfgggghihfeda`^\[[[ZZ\]_bccdcegiihgghfc_\ZXWVY_cehiihgeeddfggghhgfghdaabbdddefikklmmlklkklkkjjjjigebcdcbbcbcccbcfiiggddjqk^WVSPONMPSRRSTUVWXZ[[ZY[_a^`fjmpppm\OPUUWXZ]\UQOMLKMQRSRSSRONQQQRRSQOOOMLLKKLOOOPQRRQQPONOPRW^bgnpmeXR]`SMQRRQPR_qkWTWRWgqka[^gookfefeceicZ]``bedaedXSTUUWYXY^dhiga__cljggecba``_][`]]hw|`UYZZSuvRbjlsm`XSXjuspijnrwzwwz}ortuqhgimpqukTY_XQMLPPNfwQMR_iZOTVTOVUMVgemcxhggggfcegeefhjkmf[Z\\\`bdcddehja\ZXfw{z{|oP]dilxܥnUS\benp|cctxl_\\[YWSRRKk`d}qa_^`eme[RMI[z}sdUF?IRVY\]_Spxy{te[[^_bbfdbba`gqwusl{eb`\dzbhvxurs\UYXVX[cdc_[ZX[ZUVYX_fbbaYWYY[^[biifc]U[^^Xh}te\^\ZZY[[[]^^]\ZYXXXY[OZ]a^[ZZ[[Z[\\[Z[ZYWUUVXYZZYZ[[\_fhfd_ZXWWWWXXXXYYYZ[Ycp]PSUWVVVWW^d_XXZ[WWdjls~vedku~yh`bcbaaaa`clpnnljhfgiklmnnonrnmoor`Uqmjus{rid\]`]VHGILMKKPRTVVTTUWWWTNLJKORRSRTUVP\dcjeSU\`e[JDHLSp~qWWUSUQNQVYZZZ[^\TOMLMMLLLLMNMQSHJIMLKIILMNLKKIIHJKJJJJKKKJJHGGFFFFEEFDEGHIGFEDEFIGHFFFD@<;=>>@CDDCCCCCCDDCBAA@><<;=?ABBBCCCCDDCDDBABB@????>>@@>@???>???=<>@DHHGFHJNNJGHJJJID?<;9;;::@FJJJHHHGGEEB@BEKIGGFGJHGEHKKKLLLJJID;<:;WQR~upjlbFIFDDHJEIdcPE\C=A@AAA@@B@?@CEDCAHbsrxWCLKFDDDDEB=<=<<<<@CBDIIC=9;=@ABACDDDFGFEDCBACJRTPKKNONNONNMKOQBSl[ISaWFJXkkODLOVLHH?37>=JK7;FAD>57889C=ANLGJGCB@>=<;<;<;;;;::;?@94267?EEEFFFGGHB5045794=CDDCCCDNWXXYZ]X8+**1?A=KXTLKLSZ\ZXUTTNYyrvwxpaI<725>FGA;9:ALOJGKNMKJFDA:4/./00.9Q\TH?82,*7DD>;:78>?;9;;<<==?B<788999988:8852..2530113456=D?1*5ABCC77;439519HPI;/-//.+*.02;<:50-4<977:4-14862.,+))-037:70+,.03760,4<764..=:9851./4:70-113772-.258;<7+,@B@@EE@<727?<77:?NODSYZV:29=6AU[OE:,../0B\Q,)43,192.2/,01-35,,421DPPUZXXN7&$+=IB;=CDHC78DGGGB8670*65),4=8,)'&.DO;17;27Yijwl=&))174@CDDDCCCDDDDDBAA@><;=?@BBBCCDDDDDDDDDCB@@???@>@@@@A?@@@A??>>?BEHHHHJMPMIIJLLJHD?<;;<;<=CHKLHFFEIEDCAAACGJJJKJKKJHIJKKKKLLKJGB969ILNzuzbJJHFDHLAOom\HaK:AACAA@BBBABEEEDAEauu}EKJIFCEEEFC?===<;=@DCCGIBBGB=?@ACBCDEFHGEEDBBBENQOJKJKLLMOPLJMN@CgbJNMLLKLUSFFCQXJGC;77<;>?@=<==<<<;:30/1041.133:;<9645=?7.00.27981+),)(,48972+-376762,&*56450.3:956774/++-./*+;F=45:?BDEA??;95/*()+/363-+*,8801234@C5*+--05203550/;HF@<93..0..044+((-(+57;=<;<8.*)07620223651+*02230/)',1/0:?9/--,+,,**,02/+'())('''%&'&&&',///0///0/.151*).21000245548:7871..//.//.../--/2562--6@H\oZ..:5/4:9.&&(275;8,&$'6HR[[ZWYR8&&'0@FCFGGLJ;7CHID53A@8470&)1@=,(03--AI3,64?_fgvqH)),0:D:Ib\\\]_cfhijklmlmonjihhgefffffgfffeeec`^^``aacdeedefgiijjiggecba_^[YYVVZ^aa``bccdeeffefhe\SXdjedeaabcdghiihhiijkjjklkjihfedddc`^__`accca_acbcgijlmnnlf`]\ZUQQSRSUTSTRQSSRSUZ\_homig\Zq|kVLKMMMNQQRROMLKKMNOPPPQRQQQRSSRRRPNMNNNOOPPRTSRSUWURRQOORW^eeadgilaWTQPWWNN]qoimfahrpihhijkmnlljlk^SY[]\Y_edaem^QOSUUVZbiknmc[bi^\filjaapycZen~bXVaWY`ejlpkjikllj]Zmupprrqmz|{wwy}xliiiifjoquy{kpm\^ZQOSPI]pTRONsxouhYTUdd_bv}tphhonldmsdhlv~~xqhdbdgjkjpl\Y\]_aeijkloehSu{lfnlmdIPQW^_^}sjc_^ceWct۝_ac[SQYdhaYSQNV~aSZ`hppmvnYIYg\]bbcZPYqy`TRNQSO~xwr|vcX[`bba`abbdebexwuviisk^^_]Y_~ecoqnpqo}uXWYXWW_cca^[ZXYYX[[\bbf\\aa^\\_cccefbdegjhlh{lomf_[Y[]_`aaabaa]YX[WX}qWZZYXYYZZZZ[[[ZYYXWUUVYZ[[ZYYZ[ZZ]aa]XVVVXZZ\^^\XYWTeu_VYXWVVWXVY[[\YZYUUVZnyvdfk|v`]``___^_``ajrqonmkhhikllllounT[osgSSRHGJOW^ea[dq~~^Y^\_a_^^_`ab_]\\_d]PLQTVVTXXUN]g`XMJJGO^[KEHJPT_vyaWTUTQOQ[Z[[YY[WNLMMLLKKLLLLLLIEGKJIIILNNMLKJJIJKJJJIJJJJJHHHGFGGFFFEDFJIGFEEEGIJGGGFD@===>@ACDDDCDDDDDDDBAA@><;=@ABBCCDDDDDDDDDEDB@@?@@@?@@@AAA@BBAA??@ADFHIIJKOQMIKMPNJIF?;<;<<==;:=@DDDEGEFLG?>BDEBCEFHHHIDCBA@>FRNJMKHKKLOPLJLI>IifQKI>FHGIGDFDSXIFB<9:<:AC@<:;:868BA;=CGHFB;:BFGIJD>6/2721134318GMJEB@0,;BB?<==<<<;:;??=<<<42CIFFFGHGA;52210//423-++++/7@EDCBA?4//12453555310358:>;20125:<<=<426972,,6A<10117HH7/011034034579;<;>?@@5,*,,13662/--/1015521322149840,(08640.367899951-.01.+2ENA1158;@C@=@@<3+)+,.0221.-,,4:222259<70..-.00//131/5CHA;62,))..131,,-1**546<><<8/,/37751254113.,,,++)*)*+.02;:/**++,,*((+141*'-1/-*'%'))**,./1./00.,././10-.32-0341/-+.578762///001/./2324655:;>KTN4%1:99<=AACEB>BGG=0.4@JB31BWaU>/@I<>?@@7%'-()(1CMUUF45857738<1$)8><8.()+*2@L^_\[ZXD+&(,E>=]^`bdgikkkkkklmpojiihgededdeeeedddcba^_``a`adeefhhghjkkhghgeeecba^YWXY[^_^^^^`ceedeeefigZSZeedecabbaaabeiiiijkjjlmnmljhfedcdb`abbbbdcca_``adfhjmpsurmhfcYRQSSSTSSRRTUTRSTXYYdmheb_hqprrfZPJLOQSUVVVTPMMLMOPSUTRQQRTUTTTQMLMMOOPPQTWYVRQTWVUTRQQRV\^ZUV]`\Y_]UWVPOVggdopljrrifhjkllkjkhipiVX_]\Z[befektcQRVTT^jqnmlfZQPW[^mwlaeurb\drw]a]Td|ceinqjghgihhfaftuqomkc`|zwvw~tdfjiggkqxv_\o|]XVQPOL݃QQQPd}wbROSZeecbehjmidjopnliqvqighm{~{xylb_dgkkkneZX[[[`gijjjka|Q|kVXSPNT|GRRRMbaa`\_`XLYlwӍQ^ebZPSX^\VSRK[x[QSLGX|zkfbaaqnji[dkfj_SKLMRWmxylwmbW\bbba``chhfldgouuifkf_`aaaSoq`cgijjghk[QXZT\wsfa\ZYWXWX[]d_anbUXadc__aa`^ciknsx~{|jefb][YYZ\^__`aaca][[[[TY\ZZYXYYYYY[[Z[ZXXVVUTVX[_^]\ZYZYZ\_`\XVTVYY[[]^[WYTUsiVWXWVVVVWXZZZ[Y^]TTVTmzudgv|i]^```aa_`aabgpsqnlkjiijklllnpo^_pskXOSMIHGIS__V[jztaa_cca`^]]]^^^__]\]_`_WOQW[YSUQKNbi[YRKICLR_LEHLPQfufXRRSTQQSWY[[ZYXRNMLMLLKKKLKJKKIEHJJIIIKMMMLLJJHJJJJIIIJJIIHHHGGGGFFFECFIHGFDEGIJJIGGGD@>>?@ABCEEEEDDDEEEEDBB@><=?AAACCDEEEEFEEFFECA@?@@@??@AAAAABBAAAA@BEGHIJJJMPQMILOROLIFB@>:;<=CKHJLHGFDKGEDB@>AMQMLJIIIGGHJKKJKKLKKKLM<997Fg}b@EGKZxzpyvp\C??BBBBCCBABFHGE>HeyɁCKOJIF@>AGJJE><=;;>CEEFFFFFFG?;>EFDEEFD>;EEECA?:>NNLMLGIJMPPMJJE?DRM>>F5=ILKHFEJZZFHKG6/7;AD@=>?>=<<<97:ABEHGDGKD<:=>CHEB=52DMJDA9+,>D@?>>>===;:;>?==<;20:FFFFGIF=85332453:BCCCCBENWWODDFCDB;/)7A>FYYSMPVZ]^\ZUSI:Gf|G,-,.4658?EGHKG<35;>DJIECB>631//.0/-;A800//.0695330*+,+.47:BDGFEC80.0133555652369999711247::962+*,.-.-/9A:/,-17DB40120.27434215<=?FIG?;4/)(+/2333/,5:514511541.-7>=891+4652/047999972/476108DH?0/367;======90+-21220//-,,,..../01342.++*+./..122/7B>722+&)1100/,/36-)3348>>=966789:74683-+03/,+++,-,-/24454,(&(+/.+**-120**4<82-)),-/135664/.-,,+*.1.+-/032/2660+'&,138?@7//0013555788985312CSSQ;&(.5<=@B?EPLDFLMD3+/=II=/3FQHDBHQSN?463*)*(('&/8:722579>>30:@1(4867/(0;4*.KW^\RKGHHEHJEB838765311582*-=P_\IBIHBDJC86P|sB373/2@A8cdgjllkjkkkjjlmmmkiihfededcddffedccca__``__adeegjigikkjiijhgggfeec]Z[Z[\^^^^]\`ddcefegkomaZ\adedcbaa^\]`dghhiihilmnnmkhfedddc`abbbbdeedcb``__clqpqruukbZTQQQRRSSSSSUSSRTVXWU\egfacqndlupmiXONMNQTVYXWSPOLMPRUVTRRRSUVTUUQNNMNOOOQSW\[WPORUXZYWVUUVZ[XVUTPS`e[XXUTX\]Y_iqpnpkffillka]ekklrpe_YV[_aaee]go^QTTS`nronlg[ORZYXpnfieba^Y\_\W^gbdz|olnlhffffedejswspoonmlr{wuw}xgjhb`]apylVix|ZQRPMVuELMUwi`POWZan}vqrlbdjpvspkhdbelko|xs``dfmjlhZYZYYZ]bghgff_ޚTu|iMMIomKXVO^Ņ]_]\[WSzwtېOV`cd^XWZWRRVT_iOHJZmu]bojeo\Ɨsjotyq_LIEVepyn^\cddcbbdrtkzpd~qtpheb``abcb][}l\_ggggef^RVZS]uic]ZXXWVV[^g\zcVZad_Z]^_gnqu{}o]]\Z[ZVVX[\^^____^^\]\[ZY[[ZXXXXYYYZZYYWUVVUTVY]`a^\[YYXY[\^[WUTUUVXXZ[XWWQ_p_TVXUUUVWXYZ[\]_c`WTUR\hswefsbba```aa``aaacpxvpnljijkkkorpmtmemrn_TNJJHDGRZXUWY^`[Z_dda__^^]]]\]^]\]`aa\SPU[[ZVOGMfbUXWMGHFH_OGGMPWffWIEJSSPSSTYZ[Z[WOMMLLKKJIKKJJIIHGHKJIIIKMMMLLKIHIHIIIIIJJIIHHHHGGGFFFEDFHHGFEEGIJJJIHGC@>>@AABCEEEEDDDEEEEDBB@>;=?AABCCDEFFGGGFFFECA@?@@AA?AAABABBBAAAACEGIIJIKLQQPLKNRTQMHEDHB<;=?DHHIMIHFDKHGECB@FSQLGIJIIIIJKKKJJJLKKLKL@6@@@\uZ@FOgu_ef[UEA>@AABCBB@AFGFB>QrʐBCPMJIE<6:FMMF=<>=?CFFFGFFGHGHF?8>CEFFE=/,:GFDA>;:AKQLGIHJORRQIC>9775/5D???>>>=;<>>==;;611?FFEGIG<444444324BEGJJH<58?GKGB@@;54432111487432222456553.+-.-19::?GLMLKD>988402332226>?;=>844468884.*&'*./321;A80-.16@>6221/-024530015;DLNI<5462,,0452-,3;92-/453135423<<6<>1/4532..699885018<8238::81/3668;;;;9;:2+053210/.-++*))*+,++***)'&(+/1113664389301.,+/31.-,134.(24//4:?<::::::9642-(%'...---.-*+386430(&#$,30)+33110+,9B<0*),.047999;:62///////.+-005765542/))-.3?LL?421225899889851113HTPVB/404@BDCAS_WONPLCNQPXO>6/**+*))(&(+/=@88AILKHB=B@0-148728A;-+03DP@F[]F(->HQV[ZTMGFIEDB:=@6/12024894/16:EU^YNKPE9<=<8Cde?28557;85hikmmmlkkkjjjkmlkkjjhfeeedcdeeeedccba__````bdddfikkklkkjkkihihggeec_^][Z[[Z]][\^_acegikmqph``bdddb`_][\\_cefghhiklllkihhfefeb`abbbccddedbaa_^bjkgcafh`VRPPPQPQRQRSSRQQRTVWYYY]cffhkfekkjrxuj`WNLMRUWXWUSQNMNQTTTUUUUSSUVUSQONOPPQQRW]]VONPU[\]\[ZXWWY[\\VQV^^]]YXZ\^XV\jrrrokffikkgfheilghvzgTTV_fd_X\`cZY^[bmqsrmdXSY\WUstmneb`^ZVXZWYkxyz~{toljgfecdcccam|wtuvux~tn~vxzylywtsws^TSZlsgn}ztrmu|iXQSSTa@RMPfSy\Ykrtdejrzvsplhdelji{w{t`dfhmeam`VYY[\__`_``b^vҶWms{tXSE\NVSEz^[YWTPVƖwޕTP^\\cd_\VRSRGe_[qİxefjin|bˣyobgpxmURW[ksi_`cdddedqrry~wsojfda``a__akjuc[fjijjieZUZUWtedb]ZYYXWZ]`_vwZRW]][\afmuyna`\Z[XWYYZ[[\]^^^^_^_^]\YXXWWXXXYYXXYYWUTVUTVVY[]][ZYXXWWYY[[XUTSSTUVXXXXUVlgYVWVTUVVWXYZ[]]a_]ZUTSQR[qyednbeca`_```_aab`lz{wqlijjlnhuypqh^^lre\RHIIIOUSNS[\]^dcaaa`_^^_^\\]^_`]^\WUURQRX\^\[TY]RQUULEFGGPTIHMOSWTMIIT[YTUSUXZZZZUNMLLMLKJIKKJJJIIGIKKJIIKLLLKKKIHGHIIIIIIHIIHHHHGGGGFFEDFHHGFFGIIIJJIHGD@>>@AABCEEEEDDDEFEEDBB@?=>?AABCCDFGHIIJIHHFCBAAAAAAAAABBCCBBBAACDHJKKJKMPQNMLOTVTQMIFFIF><=?DFHJJGHEBIJHFEEHRZPKAAEGGHIIKLKKJKKKKKKKD6FH?@AAAA@@@DEC@=MwF;NOKIHD@<;EOOF<>>>@@>>BBB><71=LH;733?MORWQ<5BONGFD@@?>>;9;=>??>>=;<>>===;93+6DEFGHD<87677654--9BEECDMWUGEIA;FJKC94>FN`^QMS\`beb_\P=/+=ry<(0,+.113;@BDFGHFC;9?ED@<;<;666654688886534458<<971,,-//046;CGILLNNLKJG>31430.27?A=?@<9866532/+)').36621>A723014=<972262+,16600.-2BJJC71/1445?GB8-.681*''1<;778853465:?:137685/499861,1>A923430124689:::97684-+1531/.-+,,+**)+-.+))('(&&)-154359;98:9301231142---,+/-)02+&)1;<866668:71,))('+-./...,(-;=3160'&$%*63&*770//*,;B8,''+05::;<74553231-+044369876542.-,7CKNKD>;8535775577753245GQMV@:QE8=DHJN`cZYVPB-',/8GNF<428AFMLIPF:?8+##')))*+(*?J>=??@ACDDEGHIJKKJIHFCBA@AAAAAABBBCBBBBAACFJLKLLMNOOJIMUWWTPMHFHHFB>=>CGGGKSLAAJKHEEGLUXPH@;A@@CEHJLJIIKKKKKLKF?FE=O{NDOXpq[BCI>9;@?@AAAA@@?@DBA?;IwŻt=;HONJFEDCAAGOND<=CGGHGGGFFFFHHJLNLFEGHIIIOQDCBBD>412&8OKFHMTSTTG778:965?FHFIIJIEN]adg|qJE>2@LG>47<<@??AABA==7/8HG:629Pejge\J>BIKHGDAA@<8778>><=>>>>>=;6-0@FFED?<=;988753+(3@EDCCJYWHGF75KOOKC6=BI__NLV_dgeaaS=10*-NV1,2.,-.04;ACDFHGDA>=<<;9989:6656679999:843316>?>:60,+,22.-,1>B@ENPPPOOPMC9740036<@>>=;:9620../.-+*058601=B<64225:;:5--85,.3650/-*,6.,*-.,3@?;<:9::21648@7/47<>747985/(3EE810///./158;=>?<8671-.2420.,****+***+/23++../.**/46556887=C<0./23241*'('''+,*,,)%&,33112347:84-(0544220/-..-5?9,072*))(*97)*53+))(/=<0*((-7?>;AB=1)'(()0/&)?QIC=;9AJMQSTTSTVN;037;?BLWA'2DHNMPWE0)0Q_?,-'090.1//0116@DB>=BO_jdTKDCNMEEKKGLNOMA5-+^`dhiijjijje_`hqtrmjigeedcccccddcccb```_```bdgfccacnrmjklihigfggddfdba\WXYWVXWWVVW[acaab_^ab`^^`aa_]\ZXX]acdfiijmnnmlljifdddbabccbbbbbbbccbaaa`^\YUQNNPPPQQPQSRSRSSSTTTTTVWZ]aaabcdddgptpmopsvtfXQPSTTVXYXURPPSUY]`]\ZSOPOPRRQQQQONNS[cd]WROPRTTUZ\YVVSRSSRRVanh`^cc``^ZW^jorvsqopd^chjogY`wkV_mnoxZ_jnijx{z}rg_]ZUnogda`^[[YYXY]kvy~ykgjpmdaaab`[lyokzsW_l]du}{snlimwtkoaZ\[XVUTTX[YZhlhfyРw[QSOzٝ|w{kivzzwvnejrne_eqodbcfdipsjjrYY^kmszulb^^`Sے]wRLY]WqcqVpxMVraKQeozdhzdalwyjhjfc\X[qñm[NQ[ehhg^bgllcqqpt}odbkp_TYWX[^``bce^Z\Yxʃotutlecba`bbb`asqijllklqpaYWYch]LS\ZYZ]_`^_acrѰ~YXc`^pojfab^\\[\[ZXXXZ[\[[_a_a`[YYXWWWWWWWXXXWWXXWWTWYXWWWWVUUUTUWWYWWXVUTSSTVXYWYjeVVWWWVXYZZZZXVX]b[RWWSUTSU^}deqkghfcaa`aa`aac`g{xnijnl_\Y_utoZPMYkfhto`[ebY_^b___^]_`^^_^_^^_`aacegTIHIHIKKMNSY\[]_aSLPQOIGGDKRMLNOTOIL_tpcilYTTVZ]ZTQNLLMMLKJIJJIJIHGHKJJIHHJKMMLLKJHIJJIHIIIHHIJJHHHGGGGGFDFGGFGGIIKKKJHHFCB??@AACEFFEEEEFGGEEDBA?>=??@ACDDEGIKKMLJHGECBA@AAAAAABBBBBBBBCBDHKMLMNONMLGFOYWWTPMIEGJJIA;@42=9/5EE85;Snund_]YI9AQRJDDCA>;9:>===>>>>>>=<51/:GDEB>==;:88741./5BGEAAJ[XHD>;GVOIMIEGGIY_PO[diib[VG0).--7<322/-./036=CDEGGEC@><:988::;76566788889632219?:63451,.32+,..9EDBKQQPNNNPPD<5/125:>==<==:3.-.0144.,04660/7AA9/026:<:3)*3434543/.-,-7<8542.-0532<.*2:>942585.(8H@4/12/0.+(,48:?DDA;87645421/-,*)**)***.150../57/-/35677648HM?2-,/23/*'&''),,-,*)'&',.,++,.48996.+7><973/.,..1<=/+394.-,++560-/.)%%(073+,./4=>Pba`]KOeT:36?OY\XY\F.(*,/46::6>LQIJLPTUOFFC@GH9+&')22'*ATSJ>:7AMQRV`gaYUSF;9749;61.3>@BE5)4>BDGML7((9[[7,.(+65010//--4>A>79BL\dTJRWWVVSTPD?FLK@,%()_`bdghiihhgb]_gmqnkjhfeedccccbbcbbba``_^___adb][ZWWdqpjjkhhhgfgga_ccaab\XXXVUUVVWVVX[YWXVSRVZZ[\\^^\\YUVZ^``bjljklmomihfdcbbaaacedcdcbbccccbabb`]]\WUSRPOPPOPQQRSSRSTSSTUVVWY]^``acddfkppng^]a]ZURQRRSUVXXXWWVVWY[^``^[_f_QPTSRRSTUTSW^bba]TOONNOOQTSUYXQPSSTYbecb`c`cb_[U]celsvtjZWdgaenlekwtke__e}~agsnmnw|{}zl_[[[cphecb^[\ZZZZ[gwxx{|xpnyocba``_[lnhjt{rcZdv|zzmipqehql^TVXWUVVWYXYenk[QZ{eSdjT߃x{hzrw}zywsoottuldqpc`ceeghnrtoXX[fjm~q^_c][]gRVacXŤnֳ_NZd`_]]pveurhldQ[r~}wvwufW`oűt^QRTRV`egj_RSUZ]_uSwhggo}~zn^Wa[STXZ]^``d`VWPHoipuofcbaaaaa_a}mhkmlkouo_V]gllpx|l\Y_cg\Z_^U]{͹aX]^]iopkbmc[]\[ZZZYYYYZ\ZZ\\\_a]YYXWVVWVWWWXXXXUR]]UWYXWWWWVUVVURTUWWUVTSRTSUVXXSclZV[ZYZ[[\\\[[ZWWY`\UTVTVUUW[peftokkidbaaaaaaaba]yzoiknj]YX[clteLQXZ`hoywsxq`]^`_^^]]^_^_```^`diltskgTHIIHHJKMMNUYZ\]^WNHGGJIJEGNMJKKRLL^zvefkbKHRUW[YSPMKLMMLKJIJJIJIHGHKKJIHHJKMMLLKIGHIIHHHIIHHIJKJIHGFFFFEDEEFFGHIILKJJGGFCA?>?@ACDFFEDEFFGGEDCA@?>>?@@@CCDEGJJKMKJHGECBBAABAAAABBBBBBBBCDEILMLNOONLKJIQWVUSPNLHIJKID<=GJS{tOHCGGD?BGKROOJE?:88AE>98?@?@@@ABCCCCB>=<=o¼ҡ9:HDEHHCAA=>BCGNK@=BFIMMJHHIIIIIJJLLLIGHGKSVWRD?DC96>53JI?NNJNY^_[B5<<=;:=DGIMLIGBKZUGD]yz{M-01:IF@DA;:??867;>@@@======>@75EF8:Pmuqlfb__R9:PTJGHF@;<<>ADD>8;>=>??><5/-5EFC=<<97667520/15:DEABKZSDABOVWKCGKSUURX^MR_flg[SIBC;1,021210/-.000.6?BBECA?<;;9999;<=;;98653577643222:D8.-484/052(/?EGGHHJNNPPLIINKA5+/148==<9<;62/123354./366302;CB;2.27:<:51-38<=864/.-..3530/0,(/86.-;FGGK=4<;1;@,,146772.1559;3+0586/,196.,;E;1,493//+))-258BJG?<<97553331/+)******-1324/,/310013899968C>/+,,054/*-..013340()'(*-+(&&')134<:.-=@;:83/-+*)1?6'-7;851.++-00/,*'&&).1,(*-169:8243./>FC=9;4,.1;ME/+)+274100//-.17<:8>EKUUNXfje]VTXN6/:=82,&%&UUVY_egihgedeeeehjjjgeeddccba_^_`ba__`^\]^^^^[VVXYY[ennjiihhihghc[[b`^bb]YXXUUWWWWVUUTSRQRQRTXYYY[[[[YTTWY[[^ehjmnprokhdbbaaaaacdddcbbcccccdcba____][WTPOOOOOPQQRSSSSTUUTUWYZ\^_aaccdfehoqj_UQPOPRRQQRTUWYZYXYYYXXYZ]\cmrm\OORRQSTWWUTTVZ^a_\XSOOONNRTTXVPRTTUY^aced`]\]fdb]Y\deeb`fqwmZbxyklvpaWRUt{fuyppsw{xwyyxwtj[Zcb[j}sikgc^\\[[\\Y\n{yxijsieda^^][eniaghlykYYcv{{ghne^gqvbNSYXVXXWXXXWssdpcP^xcWk{sz|w||ywwzcqrc^cfffb_djcVWZchdj|t__ffNdZ\_fgafdim\LSOYeoqƟrsq^[^w{z|ξrZRQPT]]VOXijkjfw}i_na䴄yh`mxxutm^cbRNWY\]_acYTVMMs\jvrfcbbaaa__bǾsgfhjjjpseYas{u_[`fkbXep^[W{µiLR]^^urddo`Z\\ZYYZZZYXX[XYWYZ\^\ZYYXWUVVWVVWVXXTSW[XXYYXWWVUUVVSOPRUUVUSSSUUVVYWYi_T[_]]^^^^^]\]\ZXUY_XRUUXVUVX\xjr|uppmhebabaabbdZRv{ojlkd^YY[V[fhQVTMUXXly~n]^]^^^^^_^]\]^YUdknqxrieYPLIGHJLLMMQWZ]\\\ZQKGKLLJHKLIHIIIPliVQ[oYBBQUSZWROMKKMMLKKJKKJJIIHILLJIHHJLNNMMKIGHIIHHHIIIHIKLKJIGFFFFEEDDEFGIIJMLJJGGFCA?>?@BCDFFEDEFGHGEDCA?>>>?@@ACCDEGKKKLKJIGFDCBBBBBCBCBBAAABACEFGJLLKMOPNLKLOTVUTRPONJJJJHIDBIIHkrgTDB@GA<@EJOKJC;89;?CACQQIJJLKKKKLKMZf`VIsnMHRKBGJD@BBCC<99=?@@@ACBDDEDB==>>sû[2CFDEFC?@@?>BCDIIA>BFINMJIIKKKKKJKMNKHGHJQWQLPJCCB7.259><6EONNY_]WB;@>==<>@DADG<@dyrtqlb^[C4DPKJJE:56:=@>:528>>=:=>>>?>;4-*/EF;7785445420.0345=CBCJPD?FKOJBA@:AJLOS[ZJTchkbTRJBA@>684210/.-.00-,07@@<8525:;89;:;>?@?=:4004774222229850..00020.,.-*/:8,19;=AHJBA=357+*.14542/17448=BB:55.,3:933>?51/7:3./.0.,03423<=::51.,)'&/:/%099762/-+-240+('((*-0+&''+.//.-++7D@4034100672-))-23,))()+,+)/7=><:;Njmaca]V_^M?778889?@<?@?@A=638CILF7-(')-286-,/13764000-,./11/5ABFKQ\bhplbYVTL3(01342/02NPW_gjigfedbbceedfhigeeeddca``]\]__]]]][\^][VSUWX\\Y[bhihgghhfefg_Y]a_^ac_ZXVUVVUVWTSSSRQSTRRVWVWYZ[[ZWUUTUVX]bgjmppomgcaaa`a`accccbbbcccdeeeca`_```^[VROOOOOPPPPQSSSTVUTUUWZ\\[\]_abeghklljc[SOQQRQPQSTVXXXY[[[\ZVWY[emjkhXMMORRSUUUUTRUX\acc^VQT\bjiXOUUQSSSUW^chfa\XYfxj[WVY[\_gwp~{aYpupwqb[RSnriuyprsvxwwwwxzztllkcgxphojd`\]\[]\YUXm~y~ldnkffa]]]]\[[^`dgkxyr{}bYWdy}|pyrbhlgikrueUUYWVWWWWWVOmp}xYNavefr~xouyq~|rbqp`^bdef`\Z^^XX[agfdtxia`e`Xjkhlhtpdhz[KQOSYlurvgXexy{|ϡ|iVIMSX\_\ZXYes{qulƝrxvrnjnhbazXX\]`db\VWSUnVgutgccbba``_bŨ|i``ehgjng\douz_a\cgj\XoaY\WoXT_appbdcZXZ[[XXY[ZZYY]YZZZYYXYZZXVVVVUVUUTUUUWXSXZYYZYWWVVUSQMOPSXXYXWWWXXXZXVedTW^_^^^^^^^^^]]]YVW]XRTUUUUVXT^|t|~yusqlgebbccddg]Onyljlj`YZZYXUX^UPMGNMO]ktwyo\_\^___]`eWUSONVnotrliec]TNKIGJLMNNQUXY[[\^^SMKLMLJKMIGGHIOXNGKQeeIBQUNXUQNMKLLLLLKJKKJJIHGILLJJIIJKMNMMKIGHHHHHHJJIIIKLLJIFFFFFEEDDDFGIIJMLJJGGFDA?>?@BCDFFEDEGGHHFDC@>=>????ACCCEHLLLLKJIGEDCCBBBDDDCCBBAAAACEFIKLLKLNNNKKNRTUUTRPPOLJJIIIHGKQRXZ[VM@>G@:?DJMID>8799>HCM^]PIILLLLLLKQbca_HRο^3AULBFGDCDFF?;:;=?@@?ACDDDFDB@>=A¹̋7>DBBDE@=?AA>EEBEHC?AEGLOMKJIKJJKJLNOOMJFJTNB?LURLG<11587448JRLV^YRKCA=<=?ACIQLKHDBTYLF<<??=<=><=>>>DJFB<=Xw~yume\\aM0==>=92,)*AJ:266895431//1465=:=9753211..21/015>>830148:99:<>>AA?>;6/.1674332139;2-0442149>GHB=86014=CEMUYWTQI:,.02578520-023577530/37:500:A@?>=88=;100881./13423546BF?=<968997675/,..,+,-/0110.**+.00/29?=730+)'&,6:757?:/(/6:@=-&*./221.,*)(.)%6?::;:::6/,+)%(/0,,584320.--372-)'&))*./,(&''%)1+&(&)5<71131/1683-(&+43+)')152,''&+9BACA<>DFEDEDA>;;>Pijecb]Zc^OB;:82.26>ISVWZWJ;6789;?ACCLWY_ed[SL5$26'%+)*.4?DD<++/9DCVnksiA11-6@>>?AAEGDCB>:9=@:=OTE2-012221025=???<941121.,+3@AAAUgaeonf_VSB1,05887;EI`bgjkliecbba_`fgeeeggddedddc`_^^^\[\\[[\[[\[VQTYXXZZXW\ceeedbaabgf]Y_d^\bc^[XUUVTSTTSSTSRSSSSTVVWXYZ[ZYXVSQRTUY[^bgjkkfa_`__```abbdebabbdfeeddba`aaba_[XQQONNOPPQRSSSSTTUTSUUTTTTVX^acghffjooib^YTSSSSSUUVVWZ[\]`^ZVWYZ[]`ghZOQRSSTTUWVUVVYafgfaZ^nx{uXKV_ZZ[UUZZ^fghaUct[WUUet}hxkP\vwuwog`cpokrppprtvvwvzqky{ohnlha^]\[][Y\UYs~yfekhea^^^`_]]^]^`_hpmntjire[XVe~sz}pnjfinuwrieebYWWVWWXYYSUsnΧwmTX^[[sΡ|ourq{~wsrs{~nszq`_`cfh_]\]_]]^bgkdp}haccfZ{dsqhii]Xaxxqlj\NQPNP[]acchpjusY]mt|վ}X``YWVWXZ[UVatzhy{Wfokay|svza\ZYY]apre\Z_kbVfrrhcbaaa`aa`Ơvd_aceefcedj~{\Tb[kifusdgvqabʤhP[kpea[YXZ[ZYXYZZ\[\^[\b^ZXUUZ[URTTUTTTTTSSTVZ\^]YYZYYXWUSPNPVY\\\]]\\\\[Z\UUf[T[^^^^]^]^^^^]^]\\YYXUVUUUTVXWOfw|~|{xvtojgdcddeehfXbzmjlgZUYZYWUVZ[NHELTX[]fkba]b\ZZ[\WZgROIK_lonsrmgca^^WPLGIKMQQRUVWWX[[^[WOKJJJMNLJIHIMHILNMWgVGNTKWRPMLKLLLLKKJKKJIIHHIMMKJIIJKMOMMKIHHIIHHHJJIIJLLMJIGEEEEEDDDEFGIIKMMKJGGECA??@ABCEGHFEFHHHHEDB@>=>??@@ABBCEILNLLJJHGFECCBCEFEDBCBBAAABCEGKMNLLLLMMMMPRTVUTRQPOMKJJIHHMRfj^NMOLBDEB@DJONE=::986:HK\cb^QKKLLLLLKRb_[WDCѿd/GQGDGGDDCFGD?<9=AA@@BBCDDEDBA>;MÿͯY;>BBACB?=>CE<@DBEGCABDEJOQMJHJKKKKMOQQNKIKKB==AEEHB=74758@93;IRU^YLB??>>=?BBDDCGHDBVOJHBC58A7469?@CB=;>:13;;86<@>=<>A>>>>>@CB>9:AP[`c]WWWXU;8Yb\V@35632211236669??===>=70-**9J=168<<8320//247:@DDEG@>EC?ACA>;89?AD>>OK`eeaVSR?4;:1/7=><::843224<<9?C@<;:57;957@B@BB?>:;2..4654421142--/22..3:>7320-.,,-32/.140,/0002774ANQXTIGKKJIF@=;<6/,041../258878757>>:7777787520-,--,-.-.11221./)(,0/1340-,.12/)+00149>3((/38DA0'+*09:8542/+,+$+<@?:544/,*)'')-**.0.++-.-+,58+&&&%*,**,)'),-)(.0,)''*151.0//17;72)%,2/)(*+6;0(+*'+9BCEDBDJKIGGE@::97D^nlhe^`f\UIB>8/07<9::.)-.19<6/HebdlljTWT5/764:;??AAAABEGJNNLKJHHHIGECDFHGFCBABAABBDDGIKNNLLKJKLNPSSUVVURSPONLJJIOGQXiobKIHGFHGFGGNQMA88;:87=LSfa]caWKKKLMLLQ\\UUKBZ:HEFGIIGECCGID@9>BBAACBACCCCA@>8Xo;<;@BBA?><=AC<8;B>=;9869B9/.=OV_T?6<>??=><;87BGGCKW=EPONB79>>==9@???>>@>;<>><:;BOQSZWMWP>P`[QA3121237<<98>=6:>=<<<;623,,7A61;>;993/-.02469=ACFG=?>==9437CI@APJGD?65;9-2AECDDB;:950/45456310-,,,.03.,383**11-,,,,07>?>DLNG;73.,,+*,2897544222.**.47876583)4>0-27<=94357655420,*+-/45,(*/551179;;;:74,/=?3,,061.---/-.7CLRWWLFMSPKKIB><:3,()00.,,04:::::86:><76851333/*(),-.12/.11344694/1/01.,***1761,)))+166.$)356@@.)0+/9<;;<;4,+,(*7@=60//+)'(()+,+*)*'((*+)*.64($'%$+.+*)&'/21-(&),*'%&*/-,,-.19>;;3*-0+'*,.13*&-0.1>GEDCCHKKJJIE>:901?LZklh`dY[ZPE>715?GMNNPRQOB>FHC><=@=21Mimoqra>3,';A,4<1(4;236201JU7/A^Y9&-35:BNUSMHCGPPLJG?4/-(&';Y\RNLIFEB:;CBEQQI@;<>/&+/.10+%5VaehkrJ8ZM7DA10:@ELMdca`a`bdddccddegfeeeecddddcdeca`_`_]]^_`_^\]^\WUVXXXZ__[[^_]\[ZYYaf_X^f`SPW``YUVUQPPRTTTVVWXXXXXYZYZZYYYXVUQPQPPORTVVXZ[\]]^___`adhgecbbbceeffdccccccb``b_WQNNOPPQRSQPQRSROOMOTXYZ\\\]_adeehmolkib]\YX[\\ZY[[[\^_ac`YTTTUX]de]XUSTTSUVSRRX`egeenuqovzrtsctzkZSZ]XWYZ`egqyf]`VksncNRe}m^pxnb`Ycnjkijklkjjikoz~th\_emwsjozo__^]\]`]WWZ[g~}b`mg``_^`aaa_^^^^_^[Z\]_^]b`\kxdgpgeh^\acfe\VWWWWY[WZ`aVcgJYraMNPPUqv}zzz{wjbpnpvsquxidr}}qkigbbgofaaaaaaaekgXW|c_lsplZROMNOPNU]]XWORMbcO`teSSY`grgURJ^˭wKPXae\WXVVVW\gqwĂaz̆]XX^_[K{Ų®qio`VqɲvY詃k_oqjefb_`aab`gֺokkkihgfdn~`OYfdbbi{pmvhU[myWTlWbw}h^\]^^\ZYXXY[^___`^^^^\ZXY[YUTSRUVUTRSTUUY^_][\\XUTZ\\^ad`^^^^]]\\\]^ZT\h\Z____^^]]]^^]]^__``b`]YXYXXXXXVSSk~|yvpkfdcdeheaXQb}ylhe_ZYZZYWUQT_]VPWix~yd]a^]W[m}oOHEJNNIJZp_Pevligfda^[ULFHLQRRRRPJMY`\[]ZPJKMOOPNNMLJKNNRTSPOOMFMRONMKKKLLLKKJKKJIHIILMMLKKJIKMONNMKIIJIHHJJJIJLMNNLIGFEEEEDDDFIJKLOPONLJHECA@BDDDEHKLIIJKKJHED@>==>@@ABCBCFILNNLJHHJLJHFEEHIFCBBAABCDDFGIKKLMNLKJKMORSSUVVVSSRQPNKITaR^mfj_JDGGHIJIHGLLJA<79978?LR[a^]c\IKLLNLLJHQ\bS:@}SLLFJLLIGDBA?==@CB@A@BBAAABCBA@7\»t;<=:BBBB@>=;;:GaVC@AABDDDEHKONKJKMOQRTWXURXTIJD@:47@===;;8:>2403FW^K68>>?><:6213CJDBUS?QYXUJ=7=A@>@@A@@@???<=??<::?IS[^UMX]NLUTG;578:=CGJJHEC?<=>===<:9;8.+1413=<87:4.,-/01126:=;3/7AA>AHMVgh_QOK=4<:36;:9:=@?@>:621>LEBNMLHD;652-3>FECFC94976;=9465..10/.-/050-44.+152.-,,+-6?@:;BD:140,**+-17971.12235/)*0579;8564/58++28??72//013550**-/0242---/0-+2999>3+*(+,-,+)*(.>JMOTO;7JRNIHIF?;<71.+13/+*-5=?>==<;;??<994-.021,(),//164033340)+.//0/.)(+..054/..++(&-33)&4:89=.*6338:;__OD<7;?CKOaaababdddeeeefgggfffedeededdffdb`aa^]_`aba`_^^]YVWYZ\ac`^^^_^][XUXaaYV\_YQNV^\URRQPQRSTUVVXZ[[YY[ZZ[[ZYYYYYTSTRPPRTUVWZ[[\]``_abaadffdabcbdeffddbbb_]`bcccb\TQQQRQQRRPRTTQNOT[[[[\]\]_aadecdjosuvqjea\[]][YYYYYY[^bc_ZWVUTX^_[YXWTRRW`^YW[^^`adkicgswnmzxv{pc_\\^]XSRW_`]ikfpeXwx|\\bci\Thwvh`Zenfdfiovxvtsrtu{yja]^oyrrngtugb__hpvyphkg\eyze_nka\]acaa`````_^[Y]__aacga^dr|m_cac`]abdfe^WWWWWYZXYSpeVjUOQOMQSRSdos~}{ytqqkbmjqutjfsqnx~~}rjknlhhnrgcdbaadfjwnWRuxae~[ZQMMNOPTWV[cSgVWRVQ^fXUYX\kqbRLKX}ŻzSNTY_YXXWUUUcs{¿yd{ܣygwo_Q^f^OFayfpvuwvhZSxʽgZÌt~udgkihpc^bb``aqϴ|oosvxtj]qcU\dlj^]a^U^nqg_QLX~oSNYbXeh[]]]][ZZZZZZ\]]]`_^]]]]]\\ZWVUTVVUTSRSUVZ^]\]YWY^]]]^^^`]Z[^ZWVVXZZ\YT_bYZ_^^]^^]^]___^^_^__``_]^____^]ZVUbgm|xpkgeefgjh_UQXt{phb]\\\[YXY[UTUYY[dw{dS`\Xa~k_NHIKLMPKLXTPixommkg^[ZZVLHLQNNQPMIINW\Z\][VLMNNMMNLLJIKMQTQMMOOKOPPNMLKKKLLKKJJJIIHIJLMMLKKIJJLOOONKIIHHHHIJJJJLMONLJHFEDEECBEIJKKNQQOOMLHECAABDEFGJNLIJKMMKGEC@>==>@@ABCCEHJLONLJIKNNJHFGHJFB@AABABCDGHJKLLKMNLKLMNPRRSUVVVUSRRPNMK_clwjXUPHEGHJKKKFFFIJE@<<;60?PGBUb_]SAJLMNLH@BOffP?IrqHMGINNLIE@=99=::?>==;9931/-@?><;92/36AKDBYW]`SMMIA<9;<;?GE@CJD3/9DF>:;:;7688>>>;:=>@FPWXXY[\XQOH?>@BCIOOLPWUMGD@>>>>>==>>:1...14:537:3++-//12347;78>?B@AA?@@607?>56AL^h]QJC::8:92178::<>??=897/2DE@INMHB;73/08AHGDGB42=:6::6550*.7620.--30053/.23/,,,+**4@C@;<=3-0/-.../2320//3776630146;?=7468:<9.,27>;0+*-156542++36431.,,/1-(-322:@F=3+*7D@3-,))*+-/1..>EHB?@=644240--3;?BE@@@>=@BA>93/00121..00..10,*++.0(%)**+,*((071')..--/0*%-860,15465*)499:99:<7,-693,+130/0,+02/.-.//./334+%(*,273.00,(/41.+('*,(#&*,+''+,)()++,-./4:6.+),01/--.0-)+-,.666@IJLK@566588/*7FDB\peeha[YVNF=7F\ug6!,NhYBEKD;?MRbbbdeeeefggffhgghghhgeeecdfgdceecaa`^^`bbbb`__^[YXWZ_aegc_^`^^^\XSW]YRRY]WNMUYUQQQPOPQSTUUVXYZ[YXVXZZZZZZZYXWURPPQSTVXZ[YXZ\\]_`^]^`db__bcceegfeeb`^Z\bgcahib\WSRSTRPPSUTVZ]^`]WWZ^^^^_`bcbcgmtvuwtjhhb[VUUUWXXWXZ\`b`YTRQSVZZ[\\VQPVchdaaYRU[cgc`djmrwy|~}yoffe``^WTWX^g^dqifojht|{nr{rhcXXfx|n][egdfggo{vpng^p|vgkoqkaexs\fvc_eddije]^dda``cddcba]\``cegeeba_bbfpz|qcca```bbceebYWXXWYXXXY^XVYc^WSOMRXYXY]fsv}{yxqommo|yuvfmxstyy{|zrprrqrtuigd^cehilzkPpfbthSPXLKKLNQSnl]PuZ_\QSWQQMOUVWllVOSSUiVNRTVUWXWUTSev~Ǫqf{ȁS]{dP]]\WRAmqjpqslc_eLvlh`ᡃun_Zegyzc]ca```pֹxmptz{vkyn\dmqutf\[accdecWQMgu_T]sZanWhiZ]\\[[ZZ[[\]]]]]^^]]\\\\^^\ZYXVUUUUSSSTVZ\]^ZX_fc`[YZZ]]\ZZ\WSPRUWYZ\b`ZYZ[YYZ[]]^^`bdd`^^___``aacbaa_]ZWWWUZn~xqkgefhhig\UVWj{sg_[Z[ZZZZ[\VSWZ^[\tp^X^\Yk|HHJHGJJNPNOMKMfwsokhf`\Z[ZSJNQNMOOLJILOVX\[^^LJIJJJKJJIGIKOROJLOOORSPOMLLLLLLKKKKJJIHIIMOMLKKJJJLOOONLJJGGHGIIJJKMOONLIGEEDEECDHLJJMOQQONMMHECACCDEFHKNLIJMNNJGEA>===>@@BCCDFJKMNNLKKNOLJHHJJFAABBBBBBCDGJLMLLMNNJJMMNPRRSSUVUUSRSPOMLfgyrTJIIGGGHKMPOGDJKHGDEGB?5?K>5ASYVH9EIMOLD=HYWM@=An¿QFIIKLKJEB@??@@?@BAAABAABDEDCDFy~;>@@FHIFECCC?<=?APdeTFABBBBCEFHOUQMOQSWWXYZZVPLWLD<>?@?@>>=<8530/-5Q\L?ED?=<<;6266DGFG]bl_LBBFIHDA@::DGB>B;/6DHC@?><71,,138>A@>=>>==<>>?BGGJ[gb\[WOGDFFIMPPLMX\UW\XOC=>>>=>:4565./02620591*+/0024457;:/6EGBFJKKF736892.:Td^MKJ>568871.48<<=>?><:<=5-9A?DGE?;994/3;/-..//-,3:532123523420001-+--.,)0>HD;782./.-03211124689<<::><:88;?>768:=;:2-178/)(+0588653--5;;6-+--03.(-400=FJFFEB=75:956Fjm]PLJEM\TD72MxqXdw_2&*-,*,1534>ED:30..001.++-+(,2=T^WX\\O@=CPUQZ^N@6)%'?etx~ocd_T@57;?35^tbC67.),),:82::31?@@BCDFHJKMMMMMMNMLKKKKFAABBBBBBCDFILNMMMMMMJJLMOQRSRQSUTSSSTRQPNblfRKKKIEFEHJLNNGDNLDADHLLLHEC?89>BF?:@EIMMB:?NE=<;5mYIOONNLJHGC?=<778DEHKGEDFCACD@??;AP[`UIBBDCBCCDLXVQQSVWWXXZ[WSQSB?>>==?AA===:732543K[K@EB::<=>>::;FFFR_fcXOHFMQGFUVF::DB<;74:BDB@AA>82/--,/6;?<=>==??>=>@C@=Lae]YUPKGFIOQOHGT^UTdnjdS@=>??=5/276//10000242/.01124458::7;FEFR]\RC877451+:Z]JFKF;635BE:-2>@?>>7.1:===<:7665237:BEDB=65;:.,///02474..12344331--.01.-00///.7@>7553121.121014;>;:9;<<@B>:86;><677;;352.16610002344322./8==81/47751,2<<;CFI=67-.@@35:999:85;JLKLLJGE>2,4;97@GHDBC?::=83201583/@JFHB;@B>8568:9643210.,*))*,---./.+,,)'&+6?:55/)17.-085)2?;72-(''&-0.*)-369;<>=5..29;76887752/--42,3<6M;(.//11,-25444.**)'&(),28:7/%&274/7<-#%-2+##)-0/..,(')*.,&$&,/+'1AKH<21,')*++09CHGHHZqoh^QSN<0,/@X\___GAcnl`NJIKLC@A=ErsMJY@%'18=8.-1/3?FE=2--,*))*+-///048DTWU\YB37FSSQXZSSO6$".[vviUbbS;/27<1#8VM>773..,(-7=<5-.00,(6GHFY^IGM8'.4ddegffgggiiiiikkiiiihgghfcbbffcbb`aa`^adccccca__[UV]cc_^cfc_]YWWXYURTUROQTSOMOSTPNNNOPRTSSTUTUVUTTSVXXZZYZ\[[XUTRRSTUWWUSTSSTUXZ[ZZ[_baaacdffghjjf`[YVSUallnssoi\TSRPOMOY`ZTQR\a`\WX[_bbdc``aaaa_cea_cjmiaYVTUUVXZZZZZ\[YXYUQRTVXZ][WW_q{o^XUNT`igbcgjfevyouwqdfhaab\[beZ]t~zzy{~y[Xgmooprqlnvzqbowfeffhiny~}|{zy~q\]y{|ztombVTc}t|{idonbbeaabekkjkmmkiijhnvutg^eqsolmlongdcbcehjrzp^ZYYXXXVWYXYZZbkttf`baahnnlifruqrnbdknw}~|sofous{~}{|}z|yusmlnjqrlln|~odgxvsHJXziOLNMORTW[MK]UNONKNWPLQWbf]JKQSVVTUĵl\TOOONQVUPZs}mm}ϴdT\yrWTPP}Villljd_^`Wpzqlio|xqe|^dc`a``o͟rpnnnoeahlvyi^[YWcqsg]Xm`S_df]egbrľef\Z][ZYZZYXXY[\]\\\\\[\[[Z[[[ZZYYYWWVTTTVWZ____ecZUUVUSUSV[\]_YUUUXZ\^dcXRUWZXXXXYYYWWRUZ^_aa`^_``_\YUSU[RPQNPVTk~rlfdelnaXXYZSZnseZWYZZZZ[\XV[]MU\QXd_`YW\bX[P\NKIJIGJOPOLJRbidcdedb`^\[VOOQRQROKHHLPLLVZ\\PIHFFGHHGGGGJLMNKLPTSRQPONNNMLLLKKKKJIIHHJOPMKKKJKJLOOPNLIIIHGGHHIKMOOQOKIHFECCCGMMLLMNOPNLNOLHDBACDFHIJKNLIKMNNJHDA???>?@@CCEGHKLLLMMNNMMNMLLGAABBBABBBCDFIMNMMMMKKIJLNOSTTRQRSTSSSTSTRQRUQJJJHFGJEFGFEGIEIHF@9:CIILNG@:9::;>?@DGJMA::ANYUD8YnSUSRRPNLJE=97568;?BAABABDEEBVi̾_?IKJC=??BFC>@EDABBA@GW\UKDCCCDDDIUXTRSVWWXXZ\YZRC<9<;:=854345FXH:?;68:=ABBDDFKF[^dYRQNQTUJPee_S>=?>;;93578559<>;=A?<:=>7>PXURPOLHJOPONJGV]RUgmkkaJ<=>><83./55220//021110/334665547>FIEL\e_QA9;;53/)<74356342/00012320.-./0//39:98657:985/5CFCEEB788.-9;89:::88407KQOMH>:?=54:=<9?HGCBC@:99751..15/-@MFG?9AB5-165788652/-,*('),..//-****))(&,;A71;<1/51./68+)==<9985.&)/1,*)(,29AA>82346;<88>=;82.+294,2:6CY_ot^KF@2-*1G[V_bedWYkobPKG?72A?6.0,*7FHE?6.,+****+0;EA6596BUYXD.+2GTPQX[[]_I1/+Ir{yN6RaW?0/7CC-$0:87:9652)(6A;1./0/04AKJGHQXM?0&'(ffhiihggiiiihjlmjjjjiijjjfa`cedb`_ab``cffgfda`aa^Z[^a`YTYac`[WUSUWWUSSUSQQRPNMOPOLKMNNORRRRTTSUWXXVVXWY[[\]]][XWUTSQQRSSRRRRSTWYWWY\^abacefgijkklkcZVTPMVgpponousgXQRQORXYRQW\_][YZ^bdccdccdcebadcdhgbcijhfb]XXVVXWWXWWY\__^[VWWXZ\_]VU`hhge\VPS\bbbeecbjyyrnjtrjgbfi`]^X\szuv{tWXajmooppnnqtogeaceefgkmrx{tlz}mW_~yswxvuo__ltsx~y{qWhxfmlbacb`hmlnppooopprpkjosibkutpkjglolhbadglrvyzfZYXXXWWWYWUV[flmljhb`bmrleai{xrlmk`gmpxviitpopt~~{{~zxvtrnmqtvxsmoqxkl^]v`uNLB_nSKMMPUSTPMOQPPPRVphTUU]id[POSVXY[W]on]ZZWPKLTUNU}quɩiq{̘cRHuVegiihd`_\^[{yu{pd^`aa_`bhtۻwspnlogedgly~n`ZZ]oyuba^yq[Z`b`_smgbdmW]YWY[ZZYYYXXWVX\\]^^^^]\[\\ZZZZZZYYVTUUVY[^ahh\YZYXUTSSRUZ[YZXSOOTX\dcWRPRTZ][XXXWWVUQTW[aeca^_ba^WSONPRNOPMNTRYuldbeskYXXVWTYkpbVVYZZZYX[XXXVJNZKP]Z]YTSZSTWVNKIJLKMQPOJKWefaabcddec^\YUQOOPMJJIJKLIJTZ\\QJHHHIHHGGGHHJKLNPSUURQONNNNMMMLLKKKJIIHHJPPNMMMJKLLOOPNMJIIHGFGIJKMNPPOKIGFEDEFKMKKLMOPOONNOLHDBCCDFHIJMNLHKNOMJFC@??>?@ABCDFHJKLLLMMNNNOONMJB@CBBAABBCCDHJMNMLLMKKJKNNPSUVTRSSSSSTUSSQMIFFJIGGHPPEEE>=?CE>FH@:45@JJKJIC?;>ABEEEEGNB@FNevbC>?qSVWWTRQNIA;9779:>ABBABACDEGJTn͈@JHEB>8;>CCB?@BBADFF@=EPSNECCCDDDGSYUSSUXXXXYYXUP888537>>>>>:77679AE;477779;BIKHEHEEY_aTJKKNPKK[ebjhJ9=AGJPUTJ93A=86:<=?>?B@;<=;:?DGIJKHGNTMINNGLXQXijfgdQ>;=<>BA<:63541113332354357:840,1?HHHSbc\P?66722/)>V>8@?5,1=CDMTI;AC7-7<73200330-+*)))+..-+*+++/4667777778<=88?CA@?<68633557:9898866@NQMA3-/579>?<;<@FEA@@=;9742111242/?NFA:6?>/)05589:8752/,*))+,-..01/,+)*++'+9>3+4>;5651-12*&7;;8>EC7**267564*,2:964100.1535;;961,+03.,.14/F=//.+(),/1./244-(&&'&%#$*2751030)**+.1:>9/+-.12-)((('&&(4917C60/,+)'(&%%%&(+-0O`D555:CGE:1282,5AHHB:3/-,+*+*3ENG:5;;:FUJ-*:@HPNNQ[a^`UJM:>gx`5%5JN=..;IL>+(29;>>94.))2;81///048BHFIA9WY4*,)'eefijkihiiiijlmmlllkklkiihea`acba``bdfhjjigea_b`\[]^\YVSTXZ[YWUTTTUUTSTVTQOOOONOONNOONNOQRRTSSUVWXWVWXZZ[\]]]^[YXWUSONPQQPRSTTVWUSV[^`a`bddgllmmnnlaZXRMNXef`_`jxs[QSSTUUTSSYa_WU[_ccbddcdijilkihdbde`]`dhkkjfda]ZXVVTTVY[\\\[[\\\]ac]UTVX_`hhVPR[`_cfeebdlpf_wtlfdfa]Z\r||ywvy{xk_`gmoponlllpplhdeedegie`ejaZwi[axzvvvy}rgolca]gh^dnfe|rjib`ccdjkorvtpnporxrdbjrsjkuwtmkjmrsmbadjptuvyt^UVVVXXWWWVXgnliiifdbblqkegs|sslhljkptuxukcdnqlmu{x~xmprjimqvyywmlnli^paTjZKNQPLLMNTTSRPNOOQX[ls[c]_gfbROSW[\\ZaؠiSXST\\ZYSRSPKhpzʥtyI~yXjhfhgc`_]^^jç~}a`_X^`^a_YYatܦwtrrrse]W^cro`Z[gtyn\Zc{^QX^c`^xulkZPk~W[ZSY[\ZYYYXWUSSX\\\^_`^\[\]\ZZZZ[[[XVUTVY[]ikaWZ[XVUTRPUYZZ^`a\Z^c`^caX^_WTX\[YZYXWTSRUW[chd_]\aa^VRPQRMLOOMNQURxjb_kvaUYWVWUWhn\QSWYYYYXWWZZULIUGP^Y\\SMQPPPMLJIINPRRPNJKVbb]^`acehgc_]\VQPNJHIJIIHGIPX\]SJHJJKJJIIJJJJJMPSUVVSQONMMMMLLLLKJJJIIHGJQRNMNNLKLMPOPPMJIIHFFGHIMNOPPOJHGEEFHKNKIJLOQQPOPPOLHCBDEEFIKLNNJILOOMIDB?>?@@ABBBDFHJJKLLMMNMNOPPLDACCBAADDDEEFJLMMLJJLMMLKNOPRTVUTUUTSTUUSRPMJIGHFHCNYPBED=:;:@@HF@;67@KGFJKNIA?CDGEECENBFT_hjO?@>B¾V_a_[VQKB;8899:@A@BDFGEBBFGFDDDDDDEGOXYUSUWXXZZXX[L696115<@@A@AA@<;<==97755678995026>??@AA?@?>=AHKMMIGOWWTRSMCDPP\ljd`^UD?C=BTWXP82764224332477469<5./28AFGIUec\P;20/121,:E1798516?@?IRMA=;96:27@5,03346310//./5>C?AD>32@@??AEC@=<;:86103663344>MC94263-.48:;<;::8651+*//-+,./670--,-.,.682*/<>:==6+*,*)0441;E@2-583036;7.,.-+,,,,,()*-110-)&))*++,,*'9H.+)'$'**()+/.-*(&&'''%%)09;72340.011126?329:9@JG:6<>;627EKFA942/--,,7IJA:9=>>CD4,=ONIKLHFV`_`TLRD>UZ=*)(/72).=HHB<436<@?:3-*)+250.../37;@DF>):XB!$*)bbdhkkjhhiiiklmmmmklmmljhiiaZ\_aa``cillid^`efdcaZX[_]YWVUUVWWVVUTTTSTSRSTRPOOOOQQNNOOPPOPQQSSSSUWWVXYZ[ZZ\^^^^\\YXZYSPPPPPQRRRTVTQTX\]^^acdgjklmmnong\QNMNTUPQUZ`aXSSTUUTTUTSXXWUVVY_cegghmnmoomie`XTWYZ^adimooomigc]ZYWUVYXWZZZ[]`aba^[YUTTV]XTSTUW`ebde]\]\j}|sssh^][Xg||}}tgadlqqpnmllopkkjdaadih_WW^`\jwq`Xasw}}xtroqmoq^SYXZ^XXchuvjeb`aimkptqonnoqmsycZ``iolnvxusssopssf_cpz{|{zyia^XVXYW[W[u|xutqjgecbdipx}woqlqsxypgggdfpomz}xxsdu{igkmnpxxkhjinwy^igUdMWjGKLLMNOPRSRPOOONTYhs_a\\`heUSVZ^^_cܩ{_UTPOQQY__ZVXOZrzkzλri`kОchaijegeb_]irwkwʢ{n]_jhXV[^a_YLMQYYussuusr^WW]_g}reZYilp]TOjhQMRX_^VjrkgeVK^`Y]ZZYZZZZYWVTSRTWWVR_`[Z\^\\[YYZ[[[YWUUVZ]ch_XZ\XRRRQTW_eehty{{wsumb^_cokc[YZ[[Z[YUSRRVW[dhc[XZ[^_[SRRROLKLNNOVT~yhbatoXUXWVWUUceWRSUYYYYZWY][VLFPPRXXXXQKJJJIJJHHHJLNONKJJMSVWZ^acfihfa^`]WUSPMLLKIFFKQUY_VJIJLNNNNNNKKLNQRUVWURPONLKMMLKKKKJJJIIHGKRRNMNNLLLNPQRPMJHHGFFFGIMOPPPNJHFFGILONKIKNPRQPOPPOLHCBDEEFIKLMNJILPOMIEA???@@ABBBCFHIIKLLMMNMNPSPGACECAADEFFGGHKMLKJIKLMOMLOQQQTUUUUUTUUUUTQOMKKIEBB@RVH?DC>;::?FID?99CLJC?BCIJIHGDEEDCDJBJae\N:<?@?;98656777?MTKGDJJHKMNDBGHJA75,-24::;757778:><4/15=?>>?@BB@??CJPVRNUcc^`b`TE@KJN_f`YXWTRREBSWSF9675542210122236;:524;;<;,.40/12233332358=DMMEA<3--/3<@ADECCA717846:<=92-+/787:<8899=;4-),//113553555666548AA7/-,+--.2446?A;61./143.*+.010035660)2?<2/-*0=C?:;>91.17:86477336;A?9537988:IL@6-*7FHFCBADEDCCB@>>>=;8546985148=JA630//36889=??=;<;60--//,.01149<734433442201;?<@B7+)././///=E9+-98/(*042-))()*,,--,)**))*)'&'(+./011//I3.,($%(*+./,''))''''((().56424411138:==866674221.+**)('2?FF:235:B>4/021../.,.47674.)%&+),29<97533QY]hg[NF0?MB54337>7,,./35/6ID44<>9537>EGH?5001447@LC8;B<:DJ:)8PUOJHICCQ]`aM=DB@GA.(-/)),,/5=B@;523579;:3,)*.-+.//023369:3&">;;;;@JD>=7=MQH>68;<>FNOHGGFABHBQijXC759:;BN_ɿjmlmbM=87899::<>@CCGCEFFFKP\ugdTKEB>9:;?EBDZOCCBDDBABBBBCBBCEFEGD:M`XSW[]a_\VR?665444=NYXPJEB?<=@DEGD<532336>JMFEDGGGHMNAAHHC7/7KG>TVC9:9:;>FI<246::86997888;:6556<:;>?>?@?>=?AL[ZV`nh_chf^K>D:3@TYVUW[VLE>GN@5687556400/02/-27;:89>??CIIITffZG4/11254112342556656=GJHA?==<9.*+.121112258:@HPSPD4..,,-/4>@>:7:?=20:948?>=<70147777867645/--/003799975575442/06:970**+-,,1436;<71///474.*+/4533469=95AI98:6-*/79::8741/03>A:0-06557DE?934:<<>@AAEHFDBAACDCCB?<99995/2:?::74465+).0..,3IE/)/244566,3CGDEGGGKT]caH8?BAD<+&,51*,10+0<:10230-09;3*,-,))/11110,+,..,&$?L0)1hjjhfdbdghiklnnnliijjhedd__ecWSX^`_^^ZURPPRSX`_]`a]YY[\[WTWYYXWVVUUURRRPOQQPOOPRQOPRSQRSRQRSTVWXY[\[\\\\\\^`aba`^[WVVUSPOPPOPQRRPQSUXZVU]dfcejlnnmmknogYQQPNLKKKLORRQRTSTTRQSVUTTU_iigilnnllnonnnnpncYVXWTUXWVZ`bcfhihfeb[V\_XTTTVXZ[^_ba`a``^]^_^][^abbdffec`a_^jwwsrl]Ud~xvohipqnonlmmmmjd`YZahg`ZZ_hh^Z\ZXcv~wrqnkhaXY]]Z^e^Vmpkd_^bmspnklmnmmrty}p[Z___gu}~}}kdrrecpsw}slic`YVWS`e\filmiccumhkorqppnechghlttpji|zc^`_^dchx|wcYhwnMHKJAnzQKNPOOONOPOQV[cda_ZRwgWZiomushla]^\Ta`^_Mb}zkWY_[WVVWZYZ_^d~~kgp`zeZegzucZSMT^aaqiftvof[Ra⼤uzM^pbTUVRQV^YPSSnh\rmaRSV[esnyi\YVWWUThdRT]]\Z]_^_bb`_b_XrkYXWWWWXZ[YTQSTTUUQXg\_lrjVPX]\ZZ[[ZXWUTU]e_[\]YXY^ksuwyxwwqfaZUTTWkxk_XZgllmd]ZYZXVRRVZ[cji`XVWUUXZZ\YVSTUSPOQSP[thcjjXQSTUUUUUVVWWTTVXXXZZZ\[XQEJUOQWXVNKKJKLLLKKKIGGILMLKJJHMZ]_`de^\[[]VKLTXSOLIHFFIMOR[]LKLMOPOOMKMPTXXY\WVUQONMLLMMLLKLLKKJIHHJPRPONOOOPPPRSSSNJJIHEEFGHLOQQQNHGJLMNNMJIILNPQQPPPPOLHCBEEGIKKLNMJHLRPLHD@>@@AAABDEFIJJJJKLLMOPQSOIEDCBACEGHHHIKLMMMKJKLNPNKNRTTSSTSTTTUWVUVSPNKGEA;8;@BA96;<;;;9=B>9=7?LME>76877;BKMKJFGJH?Rhm`LF?78?LG8EZ½̦rniibN?:88:::;<>@BDECEFFHTn}Δbg_TQTJ@99;AFCFTD>BBCCBBBBAABBBCDEFGB09R^SW]afe_UOA767657CRZZULFB?=>DGGHGA73111358;>CDGFDIOMDBGD:127CAERD=KYWVH;>E@59;>?:8<>??><;95224699;KQB>@@>@?I]\[gng__fiaG7606?OWSRWROPG:87676640.-02/-4>B;5:?<8=EJIPceYD2134333457876667536=FJGB?=<;9/*-243/-.016><4,.1799;98<@=;;732;=;853431//.153129?>?<5345320/.37::5,*./.,+03331/02421233/.33356646>A=AJF6,6?53>>843552.28<@CB=8:;959<7-)+23/1>@=;64/&)9CCDFGFDBAABDCCBA@;987414=:8762*-7:9621;BEED?1(*78*&/5689<@@>?AA@>6-),./14;?:0-.0233324@F917:1)()-2.(&()*)(((*,,)''()*+-+(%'((,132;G1063-+,,*'')))()+,..-.2774214545?B<24740+)09>@>62///301BBE:'&/891.42)-9821331./33-+-*((',.//-+')0787:69LJ95mieda^_cfghlmmnonjhihec^ZXX_fcZTX][YVRRSTVTPPX\XYaaWTY[YXWWXZ[ZXWWXVRRPNRUSQPPQQRQPRSQRTRQSUUVXXXZ[[[[\]]]^`abab`]ZWSQRPOPPPQQQQPQRUVWVVY\]]_dhmnlkikonfXPPPONMLMNPPQQSRRSRQRVTSSX^^Y_lpommnprpprqprqg[WXWTSSRSXYUVXXWX[[ZX]c^YWVWWWXZ\\^aca_`abbacccccdfggfgfa\X]how~ui`]ds}zvnkprqsplfcgnlhbZ_lpf\WWbgga\^ackrrlaafbcefca]dh`Z[][bneVmtkb_`eornonehjkntpw}h[^a``cn|xtxqcgskbkztkrolifaYVRUauRY[Z^glhq|w{yvtgekpronpojfhhhjq|omiW^cdye\_`dfikr|vrx}uPKKNFHRLLLMNLLNONOQUYYW[ca_jj`h~xdatiXbe[KJYeWMU\oaTae_]ioc]]^^]bwpZWbf\V]T\nWQV[abgz{dc_ZYUU̝}Z`ou^SSQRUVVVUPǎun}XPUY^dnmktq]XQORUZk^WZ\^X^cb`\__^]\[T[|qXWWWWWY\]ZTQSSTUUQV]ZblfZRQVYZYZZZZXVUTTZa\[[ZYWZgztg]YWXVUUSRSW\kylYaiihaZZZZXVUTX\]ejdZUYZZYXY[]]\[YYVQQPPNOrrfek_RRSTTTTTUUVVVVUVXXYZ[]^[WOJKNLEOWRKJKJKMOONMKIIKLONKHHJJKV^bcbaZWX[[VJIQUQMJHGEFJLJJS]NKMOPRPMKJMUXXXY^WVSQONMLLLLLLLLLKKJIIHKPSPONOPPRRRTUUTQMJIHGEEFGKNQQRPKKQSQPMJGGIMNOPPPPPPOKGCDEEGJKMNNLIIMQPJGC@>@@AABCEGGJJJIJLLLNPQRSNIFECCBDEGIJKKKKLLLIJMOPPNOQRTTSTTSTTTVWWVVSPMKGA=99;>;:69<>>>;9=@=;><>CIF@8888999@KJKGEFA6MimmeaaL;Kv]HG@T¾„dfgcR@:889:;<==>@CBBCCDJMfqfcTLKZO@:9?<>DEHJHC=974674102>BGGDIKHIIGA5017NUL:6Qjvx|pV71738ED?<<@CFB>>=73/.00256H]L??@C@;E]Xcoi`\[cjaB35AKLQSPQQJIUSEADA@=77767630-/0/-3HM91<@:69ELFGZbXD565540269<=;:767712?JKFB@>>;90,1782-+-01577985:@B;522/--/147416>?==;634545334<@CB5*-560,,/223324654456403<=9:=<42:=;?D?2-8?61640112442489:@7262+(+/101;;4582%#5LRKGGGGDBA?=<>AA?@<956785=<3250*19:8998=@CED:)%3?9,+14689:73+(**(''))++,.011248<;74248=CMRE31650($(19==;98750,19:1*+.168:CH@84/+*)1=AARULQUQ@/05772121/+,5?F_lR0AS\]P>8989;<<80.00=M?,,.-22.,+3FONS][LACFFFILG>@ILML99D14DINXdYOL@959@EE;**7;:4/42)-77322234220--,)(((()*+)('.ec_^][`egginmmopojhmkcde^VTSXa`WRRSTUVWVVVTSSTVTTZ[WVXWVZ]ZXZ]^[[ZZYVSPOSVTRRRPOQRQPRRRSRRRUWWYXY[\\]]]^^_`aabbcba`^YTRPQPPQQPQQPPRTTUVVUVUUVY\^_befhgde]TNNOPNMNNOOQPQQQRRQQTTUTWVWYepnkkmopqppqpqqqpdVUZVVVVUVXWVUUUSSWZ[^`]ZZXXXXWVWX[]]\\^^_``a``aaabbbabca`ZZ\gywm_]ovxy~~{yqrz}~}pc]]cnmid__indZZ[giea^_dhc_^b_^^baa_`^\]a`\Z`dfnnbtsoieefotrneecbbhl^b{z_[`aabbcnx}zurtqldhfglr{mlpoqke\USUWenTU\X\alps~z}{tkjdlqusnjmopmoqqprx|[ST_g\]ss__abfiikr{}}~{dJGIIHBYHGHIKMKNPMLKLNPMXtwhiyqi[Qkqnh^hdUJ`_SVUkkRZdhjw{gaibb`UR~t}QWSJMLBѾjZW]acfiorֹ|S\[WYZҋʞ|jg\luYNTTSSSTTQܳϦwopUT]hllfli[jrgWGOX[^f]_^\XT]fec__`^][]WPl}\WVVWWZ]]ZVTUUTVVXX[Y[ZZUWXUSUXZZZYXWUUSVX[[[ZWYboui\WTRTUVWXXVTUXWYm[YZZ[Z[]^ZWVX\^^ce^VVYYVTUWX[]_\YXZXWRNKJ_rfjfWRRTTTTTTUUTVVVVUVWXY[\\ZXVWa_JENVPLKLKLMOPOMKIJMMOOKGFIJIQ\egc]YXXZZWOMSVSOLJIHILLKJLYQJKOOPNLJKOUWVVY^VURPNNMLMLLLLLLLKKJIHHKPSQOPOPRRRTUUVVTPJIHGEEEGKMQTTQPQWWQPMJHGKOOPPOOOQPNJFEDDGIJKMNNLHILPNJGC@>AABBCEFGHIIIHIKKLORRRPLIFECCDEEHIKMLKKLLJJLNOPQPSTTTUUTUSTTTTUUUUQNKJH@=:77<;:7;>BBCB?AEC@DC?@INB79989:7<6Igow{zkE[wPEOJgѮgejhWB=;:;;<==<<>ABBCECN[hznlm`LEKNJ@<;=BDG_lYKKGDDCBAA@AA@BCCDEF@417OYT]ekleI;9789>DGA9@PUNE?>:;ADHIE>AEB?BFB;1-<=AEFLIBKPJ@4..EcZ9-BSSYiyzhHD=16LH>?CDGF?>=;51/.01014>YXG??@?=E\]ls^QUX^`R@FLUWMGS]UOMP`VKMGA<;87787643202/+2FF30?ID:7DLEAJPVL@9762259?A@;9768<86>GGDB@?>950059841,00/3>PVNE@:.+,,.0113234568@IKIGB<=C>16:;99?D<32.++/0133426<<:98865468999;?EF5)0541.-./0149;60279940499;DG?63:=;:840023100,/443234677300/,-163121+),/1/1882*53(0HONJHHHGC>99::<@@?@=966>?35<6240/5;<===<=;:?D9((7?:/1457878<>BBEHF>3+)+*.3345532210..-024775871))-04332.*)'&'*+,)'()(((+,+(&(*--,/45=FB>3,((())(()*-.025689;=>;736@JMOMA2/24/(+0477ACCA?AD@BL@24654300.2==:DBEN80:ERZeS:72320;DFC54>;:4.22+-22111011110000...00--,)((3@DABJUXQUTL[\\ZY]cfhjmpoqrrqoklof`gfYRRORZYROORVVVUUTRTUSRSSSTWWUSSY\YXYZ\][[[[YWSPPRSRRQPPPQQOQRRRRRRTVWXZ[]]^^__^_abbabcdcccc`ZTQOPOPRQPQPPRSSTUTTTSRRTSQPY]aa^[\]WOLNPNNNNOPQQPQRRRRRSTUVVTVbmlghilopqqppprsrqqdVTVZZYUSWYWWXYYWX[[\[\\\[[Z[ZYZZ[\]_^^_____^^`a^\]]^__ad]]bdr}}}|{~zprpq{|{}x{iYXYbmnkgc^^a\W\cigdb`_``^ba_^]_b`^]]]]Z[]^Zaolntrzxpjikigowqdeh_[\\^\]lm_cb`bfha_gprrrqqrme]ckqpqrmmfiqoj^TTUWVTUWWVcrwst{|zyrojglrusnjkosvz|{uuzy\\dofZ\ee_acdgolbmz{z~~qf]ZROGGWqNDCK|gTPPNNOTRH\rdxnu\JZfzzMUgiV^`XXWehPQ^fn{|ccmf\[WEh˚wyiFKLKNΚ_U^ba`ceb_aۜwn\TU{ݩݚfuvc^_q`OQSSSTPMȿƹcexseRXiwljijh^]poXROZ_b`]eg^SP[ihfa`_^^aa]XceUUVWW[^^[XWWVUVXZZZYYYZ]ZYYVVXZZYXWVUUSTUZ][Y\dnn^QOSWWWXWWWWVVYWXVh~lZWWZZ]`bd]U[_^^][XUX[ZQLQTUVX[`ZWZ[[WPLMTyzpl\RSRTTTTSRSSTUVWVUVWXZZZXWcdWepSS]VNLLLLLNOQPNKILNOPPLFEHHIMTZ\ZZYYYYYXTRVVTPMKKJLMLLLLWTJINPPNKIKPVVUUY^UURONNMMMMMLLLLLKKJIGJKQRQOQQPRTTUVVWWWQJHHGEEDGKMQVUUTW[UPNLJJJMPQRRPQQRQNIFEDEGIJKMNNLHJMONJGC??ABCCDFFHHIIHHIKLMQTRPNMJFEDDFGGHJKMLKLKKKMPQPQQRSTUUUUUUSSRSTUUUTOKJJI?<<87=:98=ADEDCCDFHEFFCEMSD69:89:9:CKMJ?::9BUzgBdqWOPSYz̓Z`\OC>=<<<>==<;<@BBCGFXnsliqiaL>GFD@=>>BBE`fTTUOKICAAA@A@@ABCCEFB535H]S[dkldF9<=9?DFE=:@HLTM@=;8;CEEB6:HLJKMKA31C?:AEJH=;40//18>>=>MYQE>>??E^ek_GCKLPPF@LUURL@RaYY]`iXGVQA88889866555651,194.7ELJ;3@KGA>>FHB<94048;?@=6457:AB<>ADDBAA?9107:;965572/2@QQE<;9/+++.22/01///+3HQMJH@@??>>73:C=-/>B>::::87644:?DII>30.+))0566:<:64210///25997852/045:964-*)'&'+--*)))('(,-+(''%(+.146::;81,)(((((((*,07;:9878855667CMIC;0//-0.'*-26;?BHMME<993/126>GKGB<>LMC:9<=@EGKNOHEB>/)-3772372-/6>?DFFFHGGEEH@79965424864>LXbkmh\XTHGMNJ>530?FKTA/,7MZ`K./10//6AGKE@@<:4-13.-////0///0002344557:5/,)')1:<?ABCCEGGHHHHHGHJMPRUSPMMJFEDDGHHIMNONMLIJNPSSSSQSUVVUVUUTSSRSTUUUSNJJJI<;<;9?:89?DEFFFFHIIIGGFHNTF68:9:::9@INNE;8;:@N^nyVEYqxsfNJO[pyȜUPQLEA?===>>>;:=@ABBFIetphil_^QCDCB?>>?BACFGHSYPNKFDA@@@AAABBCEDA73C^hZXfllV=9?=9>DD?:;AGGLLB<;98@???64BNNLLJA88CB;>CHI:BN?;92///2>QXTNS[SI==>AEQicH7=DCABDHNMRKEAQZdha_d]MQTC;==<<;:987:;;7100.0A>=>ABBDD?7029;:887>=834@OK=6:80,,,/440/1330,6IOKJF=>FD:::9:<;;>@=8899:AA<8645986547:723558?CBDEA869951147985/,-/07;;<:9:553;?DMLA:=A@@:64564336640179559?957620./110,--*+/550044=MQMKKJIIGEA:>938A?35CF@@>;:986316:ELE6,/35401677;A@:5211000357878543579<950+))((+,+,+***('(+,+)'&$&).368894/0.*''''&'')-3=@;99>MSOE<7:DHF=+*.-*//),.15:ADJMLF>855204=FPVOE<7?IE:8;>@BEEKSF2-,)(*0523<;5/,.?]nvxujjseOKG><;?FIIIGHHHHE>8;976315;71:NYdmpi_ZWKHNMMD50,6AMVD-(1DRL9/1/.217AGMNH@994-01..--//////1224556668;80-*(*.0/1CURMRRZiXYYVV]__dhmmeZ\mqlmg^`]TUXSONOQRRRRPPQRQPQQRSUSRTSQRUVUVUSVZZYYYY[ZTRTVUSPNOONNPPOPPQQQQRRRSUUWYZ\^^__``abbbcddceddcb`a^YUTRRQPRRRRRRRSSSSSRQPSUSPTQSY^bbb^`a\TQPQQOPPPQQRRRRSTTUUUV]]\ckrsrqrrqqqrrrsswsdZWXX\[ZZZ[ZYZXYXXYZZZ[[[]\[]\[\\\]]]]]]]][[\^__][\\[]``ahegmomljehhhv}^TZ[dutkgfb][`cbc`^`aaa`[]a_`]\]^\[\\\][Z[\dllkpwmgkhhqjhqscamkb_^`b`becfjfeegf`[drxuw|zuw|{uvvn`_Z[dfhhjh^WUUWTUWVUc{zwwxut{ursnmnqojjlpvwz~|}xt}r_VW[_bbcdgjkeagtzz~~wzwiCsfBK\NMORUXTIYjfUybLKa^POGl\CNKTce^]\`ZTTVXY`{vhg[TVaebdi[[W\_abx^LTbj]RWbmoaXnWPOP䶄aOXhhesxpr`RMYŹePUXM{{cPYh]PS\\_]ZWTRPPT\a_]el]PP\jjg_^\YWV[XWYczy_[UVX[a^XUVVUTWXYZYYXXWVUUVXXXYXVTUXVTSSTY\Y_ml_SRUVVUUTUTTTSRSUVUVVVayte\Y[^aaa`__aYVY[Zam]UWUTSSRRYgfZWYZYTQKgybTRRSSRRRSROMLORVVVUTUWXZUPOZ`vrQLRROOPPQQONONNLLLNMMLJHFGR\`_^]\ZXVVWWWY^^\WTRQRRQPOQQNPWKEEGIKJJLQUUSU\[TSQONMMLNNNMMMLLLJJIHKRUSRRRSTUVUTUWZ[YVNIGFEEDGKMRXZZYYVPLJJIMMNPQQPPPRTRMIFFEFIKKKLLKJGJMNMLG@=>ABBCEGGGGGGGGILOQRSSPOMJGFFFHJJMNOPOMLKMQRSUTTTUWVVUVVUTSRQRSTUUQMJJJI98=A?@;9;CEFGHHIJJIIJHFHNSH:9:;;;<;;@GLLA:<:99>TtYWtcKKNZjaqϾnIRXND@@@@@@@>>ACCCCEERiffh`RQODBCA?>>@CBB=8?INOOMMLB@AAAAABBCDEA71Kpj`XbliYE9GI97<=879AIJJG<667;>;7843?LLJJHB96>@?ADGK:=G9U\C7?BAV\bt{4.?C9:JX__[L=981./02EWZVSb`UO?=?@BEYO<<@A>>;BW]TQIGKUd|x`ZccNHKFBB@>==;;97:==:3..038::?F@;>=9556:==<@CED@835999888???;:@DA4298/-..15512587319IMIIE;>GC86667;????==??>@F@<73552/../-379668@EGGDCC@=<><429AA@=67<<99;=<87843.7>>??=9;BFIEB@AA?<4202//12348=87;=86200.-//.)*04437;?INKORTMJHGFFFB=?CDBBGKKKKHEC?720137<=?????>:78<;8=HHED@;9:999846GI73305;=:456687AMJHGC>=<94225?HMLG=6;>;768::9:?INKKHGHJJB9697664135414EXckpj`\_VKJLNH<8667AJ=.15:@8/22-/658AGJJE=73100/----//0/..3456753468840-,,,+)'+?H>?QSWoXWWXYZYXZ^baTFJ_bWch[UUPNPONMOQPPPPPNPQPOPQQSTSSSPOQUVUTTSVWXXWXZ]]WPOUYYSNPQONOOONOPQQQRRRSSSUWY[___`abbbccdedcefeed__a_[VTTRQRRRQRRRQRSSSRQQSWYWTQQV\_ceffggaXQRRRQRRQQQQRSSTUUUWWWX[bnwvrqttnnrrprtuuyvndYVZ^]]^^^]ZWVVVWZZYYYZ[[[[ZZZZYXZ[[\[[[ZXY\adlnc[YXWX_d`_dkosrmhcdmrwtw~xfeddefhlkhdabffda\[]bcbba\[]cd\[[\]\\[]\XYZ^mpmszoagghrkirka^bdcbbcdcdeggkmkhcca^i{~{~wu}yuh]Zdgefc_jaUUTRRUWVU[pzxzwow}{sqqppopokgkuzxz~yx~~|prthZYXZ_bdeeilf`_aoyz}mVtAuԒk]PHNUWWQKSg’OJhgRKMMQPImZFLIKQ_hc`\VWWWXWUg{kcUORTW[Slv\YX]\]djmjPNYc]Z_flrpfWQqGRUP\pQMYjtp_TXRaͯ|\RUYXNb]WV_XLNQSVWWOKNPQSY__]dmZNQVc`a\\ZUV`bWU`eu{f`OUY[d^URTUTTWXYZYYYYYYXWUVWXXXURQTVTRQSY\\djaUPTVVTSTSSSRSRRSTUUUVUT^twdXX[ZXWXYZXTYbbfec[RQTTRPOOSaicXUYYXRGYy\SSSSSSSSRRQMJLNSVUUSUUW]SKQPkeFMQPQSTVVQMNNONNMMKKIIIHPbnmifc_ZWTTVVWZ\\[YWVVWXUSQUUPLPMGFGHIJLMQTUQV_YSRPONMMLMNNMMMLLLJJIHLUVTTTTTUWYWTSX\^[ZRIFEEEEGJMT]]]ZWTOLJIIMMNOQQQPPQPNKHFFGHIKMMNMKIILMMMKF?;=@ACCEHIHHIGHIKMOOPQQRQMJHHHHJKLOOPPNMMOPSTTUUVVVWVUUUVUTSROPRSUTOMKKHE=<<=>=?BJOF<<>??;Eq|un\ENNTbkZ>f͕KN^UHBCDDCCBAAEGGGDEC@^`dh[LFGABA@?>>AEC@?=?DGNPP]XC@CBAAAAABCE;=9CknVV_kdZG8EL>556557?GNNC4/28=>61234?HHHIH@32?@>>@IM89G;AB@@8=_O>Qf\eM:Ks*+FU?Fhvsno`>8C8.023BPSKOf^GH@=?@?ARO=@A?@B?G]h\UX]dmundb`LCGHFA@BA<87878;<:3--///0028976554568<>@FKE6/--..-.2669967<@EFFB:9::9889:::;96:B8),87//10486249=<946DJDDC<<=70++4;?@BD@:CKDAHD6-*074-,+,.,.7>=78=;<<?????><;;98;GPMKJGDBA@>=;45E>+4;4377:8776@@4,,/226:;6-*-./148:;;8/&&(&)11,(),--*'()*(&(+)&$&,:A@805LT<.,*('&%%').>B?W~pl{wqdF2-..1359<>;9CKC;=@@A>7011-4CIFDFMQD2/4656@LQQK<1.,*''*-,,7EIINE.->85954466558;<@JQOOOMMNI>4123664112200>FF`saV`g_LFGHGBBCC=;4+1857:3153,,326RTUlYXXXXYWUUVVQJEGOQKS]YRNMLKLNNOOOOOOOOOOOOOPQQRRSQPPQTTSUUUVWWVWYZ\][VSTW[YTRQONOOONOPPPPQRRRRSUVXZ^_^`abbccbdeeefiihhd_]^\YVSQRRRQQRRRQQRSSRQQRUZ[[YVRQT[cefkpncYRLMOQSRPPRSTTUVWXYZZ\]bnwrjnvpbaimpsruvux{wj]WV[cdceea[XVTUWXWWXXYYYXVVZ[VTX[ZZZYYXWY\]^lug]^ZVW\a_\\^_`ciidbp{v~`[ekpwym`[]hssmhcceeda\Y\egge^\`_ce^\\]^^]\[[YZ`\h}{uzlX`ciuy~ywwj]acbcdceghkomkjjebk{~~|z|vmZ^ljcdc]baXUSRRSUVUS_t~||zrny}{}trrqqquwrlmuy{{xh]cmoj`dfaZ]\\^`dfgjnfaa^l~zvtzz|{[A˖nXOPY_ULIWb~ENTTMPLLONG`tOGMNNJQ]imbXRNOSXDpq[NLNOPQSYeTGNU[[^aavs]W_]Y^jqhjvncOzBZ_WKLXOSg~[OoeP̞cSZ^WTVPSn^WOVSPQPPSSPPPQRRSTVY[agVNQU[[c\]\X_ikegkqv|}fR\\ZfaVSUUUTWXY[ZYZZYZYXWWXXXXSQOQSUSRSY]ac[VUUTTTSSSRSSRSSSSTUTSSSSSXnr^WVVUUWXY[^eog_deYQRTTQPNPRV]ebYXXYWLQwwWSSSSSSSSSRSTLGKOSSTSSUWZTN]SZsvTOPRSSTVWRLKKLLLLIFGHIIL[qukgeb_[YVQNNPTVWWXWWWWWSNOW[WMGEGHJLLMNPPSSOX^UQQQONMMMNNNMMMLKKJJJJPXWTVVVUVX[WSSZ_a]ZSKGFFFGHJOZ]][YWSOLKIIMNOPQQQPPPNLIGFFIJKMOOOMKIKNMMLID?=>ABDDFHIHHIGHJMNNLMOQQQNJJIIILMMOONNMNOQTVVVVUUXXUTUUUVUTTRNOQRTRMLLLJC?AEHHD<9@FGGHHHIIIIIJIHHHJKE=>><<;>BKJFHD;:=<[hHNbh^SC<5:E:74457;BII>4149>:2/159@DGIJI9+2@A<7;KL82H=DB9737or`mgeF)/lv?9BM:Bk{qtlQHVSD63;KVVSTh]?BA?AAAFd_=;DCBDHMWd`WZ^k}ztc\[KEHGFEGF<5335459=:2-...----.155444558;<@FLKC:64111-.1223438@GHFE;9><:876776657<>9+)02122259648>A?>:8?A==@>:2+)(/EDCCB@@EGA:=A?=?>;@@8.)*-0/.06=<==>>==><68CED=:98:845421222100//59654433540-+*,14;FPK>?PXVLJJIGA5),>IIJGBCA;8;??>>>=>=<94:ITRPOMLJIF@<724<8+3;61202:;:9>:/./2568;91*,,(&)/45661)%'''-51'&*,+)*')+*('(*)&&(6II<;5+4QZC.*)'(*/202@?1;`tvoilcD*'.02679;=CKNF<=DFC;4-+/15=EKJEJUM4-4623?@AD;:DFGGHHGGHIIIHHHFGMKB;;;<<=@DSP?>><;:?JNR[pvhOQIT\J;ALJpߞPQWLJJMONLHEEFO]f]L>HlwsyqZFA@@@@A?=CJJECA=P`VX`mhRAAAAAAAABBAG?=;AOCLfk]UF=1396422358;=<9855:;50036<@DHIID2*6B=93=EJ:2<9<=73,9{~faI5-G{aFCD;;NivwxqcUTWN76Q_]YPLe]=@GAGPICeb<=HHBEMROW]XWXf{xyxnc`\LIJEIRN>.,/23218?:0-../01554567633369747<=<:8767982./001302;977776536:<>8.,25546754699;:4-)*3>B=8@NMCEH=>G8*,.6BF>/)3843579>?<8:DIIIGD?52-*-5:83/6;=>??<89:9:8864249999;=;74421111.-04567530/230+,0.1?JE51CSSLKKIG=-%9PTRPH;6;?ACFFFB96>?>>=745>GGGGHHHHIJIJIHGFHMIA:9:;>AGJVS>;::;=EOLOWZgdnlPUQMLHA@MO@nsOPJJLNNOLEACCGSb`KBGhwzzePC@??@@A@=CKLGEC=NcW\gjXK@@?>?@AABDAGU[YUVTS`g\XC524110001357789:77:742247_X=@GCGRNEVT>AFGA?GQPPUW[_^epxsggkaOLJHNRC0*.35413:?8/.../05=>:89;:3147830243/./005;=90-/1/0.-8FKHIB@EB>;9789976668>@:9987666213;FOPLHFC=632/-,*-:FD;5/'+0<:@A<;AHLMKGD>8=C=8;=/6E?6683/7C?5-09<===;8::;;50-.-2986:@C@943222343.)+29:86129:5.,-)*7B>0)7JPMLJE?7./D]_ULC3,8DFHHHE?65=AB@@@???>??@?81/0ARVSLB>DGA:99865.,2420131/1322213:957855:903AC82465.'%(+-23//4877511000-*))()8JG63<;;>>;7D[WE>>>;52293)-5=IdvyzusR,).042204GUSJGHEBDDEEA:97447=HI:39=8446??81*%'(-5730.,+06747964-&),))+*(''')*-4=?@R|\[YYYWTSRRSRPMLMMMOONOQRRQQPPPPPPPPOOOPRQOQRRTSPPQQQPTVVXYZ[ZYY[\]]\[^a_ZVSRRRSQOOOOOOOOOONPQQRRSW[^_bdcbccbdeddfiiiiihe^WVURSSRRQPQQQQQRSSSTTRQSUVY\]]^__^YVY]a_Z^jk_VOLLNPPQQPQSUUVVX[[\]][\_`djdY]nusswvvxyzz{viacgggfghg`VTVVVWXWXae_Z`eb]WS[aTVZY[_`__cfeeffed``cdelvvx~saduxjhnZ_efhkvqeeddgikokbZXXZ_linsjgihhgfghijt~~z|~~|ztiuwrpmjhiikjhhiggjlhltWinY\gkikmomid^YZ]ZTSTQUdoqrvywuuupn~wxxx|{yzqWSYYYZZ]]_`bdedeeehnkgdcheVbiuiegZHDMOPHHUZVOLKKLKJJLNNJ[aSPRRQOOMLMLJmJJLMOQSWWYdieb]OJNXaPMQSRSQPNMMIJ^z|ia\[ag^iuJ]ovwo^NMVokeZEUVaggg`OY[YRRQXୀď\kvZV\ZYLnoZXQRPOPOOOOONPQOMLMNNNORTST\_haWXUVW`bTkÄRifQS_`gl_ZYXWUVXY[[[ZYYXXXWXXXUSQPNMPTUTUX[[WVVUUUUUTSSRSSSTTSTUSSQPPPPNPSVbmvug]YYZZYTLQ^USVTRRSTTTTRPTWUX^`^]ZYP`v_QTTSQQQQQRSRTUSLFINRSSTSVTIIMVjsj]WWTTUUVWUNJJKKKLLKJKLMNLKVeifc_\XV[]ZTMGHPSSTTQOLJLORUY[WNLPRRQPQOOKOYWQQQPONMNNONNMMLLLKJKLW]Y\a_^^_^\ZYUU]fge^VQLIHHJP[cd_\YWSONLKLMNPRSPPPPOMMJHHIKMNNOPNNMKOROMKGC?==?ACEEFHGGEFJLNMJKMNOQSTPMKLMPQRQONQRSTWYZYXWVUTTSVWVUUUSSSQNNNOOONNNI@?F;89:;;@FIPVR<;<=BLTZIEJKNQZ~nLJIGFEFGMN=3Χ\ILSTOKMJC@ABIS]]PF@Zqm]F@BBA@@AA@=BLMIGE?GZXWdaI@=>>???@@BE?CfzzxtxldaYN926=>=<:401368:<=;::976766GJE;9Qmomnpk[PG;@AB>:?JOPRY`_MBWqsdfnaNJKMOD4.1687427>?81/...1:@@>><>>8.3:855421/.--.2:=;4-01//,+6EKHLHDFCA@=:99:::866:?EID9444310.5GTTI?<:8651-/203=DEC>>C@6654:=1(*-7IQUS;(+5?B==GJ>7>JQNJFC:37=;79:>>=<;;;:5.+*(17639DH@8433323442.)-762238<;5/-,*,5>;.)/?LJJF=63//?Y_PDB50@CEGJG@:8=ACB@@@@@@?@@@?;2-/;MTNA65?FA=:4366314420.+)()**/2/274/01473-+5C>313794*'),0234588657554451,*('0AF;35:<<:;FH8?XS:8;4--03-(1<4#*FVWhqinpkfL/..,..)'7LPJGGECGKMLE>=:3.11.00+,5<:8979==<:873-//.2430-//2454,/??0'--0;???@@DEACD926BKPTD640/-.@F4+205Ri]B1+--,0:GJC9*&)''),049<>=:7+0>==:@A=?;/)%)3;83/,+.24572,,))--(-3-)+,+),36:=@Y_]ZZZXUUTRRPNMLLLMNPPQRRRQQQPPPPPPOOPOOQQPPPQSRQQQQPQSUXZZ[\[YY[\]^^^^_^_]UPPQRRPOPPPPPPPOOQSRSTUX\[X[_`aabbdeegijjjlld][WTTRTUSRPPPQQQRSSSSRRQPQSUWXXZ^bcaZRMKLNOUbmneWLKLMOPPPOPRSQQTVWUTROQQPRVUTX_inqtvxz{y{}~zoghhghiiijhcZVVWYY[djha^adgcWUXVUUUWZ\^adddgjjihhffgillk~pu{nejjb`m{oZZfjd]gi`bcaabgmh[WVY\fjifddfddbdgfeo~yswyu~{uflnkprtsspjijklplkkklnifvkU\mm^Z]cdeijghe]YX[_ZSOO\mtrqtyz{wrrqt|w{{wuwtspdWSVWYZ[\]_`dfeefba^gjcdmyuTWdkveooLFLTQQTWRNLLLLOUQLLLLOSRQTUQOOMLLKK[OIKLOSSX]cglb[ltg[VYY[USSRRQPNMNHbrdgXXho^^tTet|ygRPPT~t[Du[SZ`beph]Y\XO^“Ѹis}^PXO_uXUQNOOOPPOOMLNPNMMMMNNOPPOSXeqc__\[Y[[`o]kmXI[dem\XXWVUVVX[\\[YYXVXWXXVSRPONMOSUUVXZYVUVUTTTTSSSRRSSTUUTSTSRRQQPNORY]cjqqg^ZWVUSHIWTJQTSSSSRRRRSTY[Z\^^^ZXMNX[SQTQQQQQQRSRSURPJLNQRTTTUSGIKUq{hPIOSSTUVWWSKLMNNOONOQRRRRNJNX_`^\ZX^b_[ULHLQRSRQOLLMKIOUVQONPQRPOOMMJO[TRRPPOOONNOONMMLLLLJKT^\[dhc`ac`\[YUV]fgg`XQLJIJOZegfb\XVRNMLMMMNPSSPOOOONMKHJIKMNNNONNNNOPNLHDB?>>?@BEEFHGEFILNLKJMNOQSTUPMKNQRSURPOQSSTWYYXXWWUTSSUVVWUUSRRPNNNNNMMKIFB<=;::@DDFJJHGGGHIJJJJJJIJJJH;7FEBBACCB@No|}cQ:34;KUVXN901468<==<<<;;;:88<@?=?A>=FJFJ?637DG41102:48Nabdghic_]SILVP>F^`LCE@FTK:==>=>@B?;<@DFHORJ;1:L\ahhXEFMQM>679::821;@=61/./028=>EIB@CA22;>:63111/-/038;=820101.,7FJJKLHCABCB=9::;<;:::=GNI;0010/0.0ETPD<95434568::=@BDGGGD906:69?9,,-3ARYVF99;?ABFOSD65COOIB<736=>735?GB97<<847;9@B4159=JIFDFD>73;DFECAAAA@?@@?>=7//9KNA4,.9EC=7-,7<;77630.,+)''&(,/12.()*,-'',460-013::0('*0347786446768864/*%%1=848;;=A<8@KI7:PM3*(&'*)%(2=8()41+-8MVVJDA?6/20010--?PLFHF?BLQMF><@@8278/)++-4730026:?BD@1'&'(.683524:56@DIOD<:/=E72/.24776;AET]RLNPPF@GONA1-3:;=FF@BD?66FRB1*+0./6EK?/%,61,,36449??>?807;:8=>>DC8/'"*9=82,+-./6<71/))/)'390/55.(1?@ABCDEEFEFHJLKJJLMMORUVUPLMORTTVSPORTUVWYYXXXWWVSUUVXWVTRPPNNNNOOMMKJIH@8889<>AFJJIGGGHIIJJIJIJKLKF==FHFGFHMQI@DNZabbad]NLH?<=PQB=CHMNNND;9;>dTEZlmdYLDBA?HYapytcUF48AEFBA@@@?<=JTOKJHIIHIOXVD@=@RPE@ABAAFcgnfI.459K[ceT7.2467<=>>>==<;:989<@?;::=HNIIE<561137=CCA><:7766522AV]UH?AKRND?=;:94.0<@:51//122468DOIEEC:59<8101/.-/0037;>:50./2117DIKJHA?CC@@>;:;<<<<<;:?DB;3.,-,,,,8B@:7986227:<>?ACEGHIMLB75931;90016CTVJAHRE6>NSVL<858ENI:0124881+,8FA57=<8577?H94/1.+)**,4::48BGHFDBABA@@@@>?<409FB1)*+4BD@>96;>=:963-)+130-*()-0/,*++,,,0343.,/34794,)+256789644689=<874+'(/454426=B<8<77756EL@=B>7.*0;803?A@A:.28;44:=?BCDEFFEDFGHIIIJLMMOORSTSPMNPSUVXUQPSUUVWYYXZXVXXTUUWXYVTRPONMNOONNOLJIKE<8998:>FJJIGGGGIIIJJIIJKLKHFMTQH@@DGHEFP[``_^^a\NOQKF8;DA?CIORSTE=B>I`kpXGQ^dg\MBBC?DOaw|zt]=8?BBCBA@@??;?NVPLLLLLF;FXSAB?@ZeY@;CDCHYQUoyW>0855?Ra_I1.2467:=@@@???=95447==98:>>=::=841000./0002379742/14666=EIE:27>96<98898778889555572,++**(*-5:89AGD@@=:@DCEINPMPRJ=550/43225:IQIA@ITM:>TWK5,488478>D9>><:830.,+-/.4=@@B=32689>@?>9.+,*+23./4423224311101;<8=910471++1:@8,1>BCCB@>?@A=;AFHHFDBCCA@@@?@?837>7++-+3@CCHKF>;=;973/--5=<5/,,.0.-0256678688/)0841571-.57999;8338;<@>;96/+,/394+&.:?;9=??<4.1GN2#'02-*-0.+040,))27AQ4&(.:F@520/6A@43>?>DB>DOVPCBEHPRLFBB<1/1224689;?EEA>:666:==:;;631148633DB.,(,-180'2CFMX`gcNEMD++:82/14?IGEC97>7.'*53+,7??=8025;418?D@79>5&':B:.*-*%-@JH<055(*478:?90Fs~wbOfWZ\YXWUSRRQOMNNMLLNQQQQQQQQPPQPQQQPPPOPPOOORTVWWWWVTRRTUSSSTWZ\^`aeedca``^[[ZVTTTSQQPONNNNNPRRSTUVWWY[WUVWWY^_]_dedfihghfYOPPOOOPQPOOPQRSUXWTQOOPQSTTUVY\^^]^`ege]TPNKJKMMMKJKLMNOONNOQPOQRRRSRPPNOPQPOW[RRdojgqz|||sollmmljimmg`YUSSX`jqnklnof[UPVih[WSTXWVYac]_jtojjouwyysu{kkni_[]``^`adb`bfimjiqrlid__]cw{nikkjieaaaa`^`eeiuul|vdbqvzzprrpm`fnj_Vgrttsqrngp{ZVYW^a[X[^\_b`bcb_\ZWe~{vxvs{{x{}xwwtxvknonppga_\[]^^^^^_fggdihne__Z_ijg~{[crrmsvjecZ^_ZewvuwgRJJKKKLKILLKJIHGEEHJLMNMJHIKLIHLl̡wk|yV][QnraQKMMKKKILH\yVi_MYk~nPKTeh[RTZdu}lUTlY[ppf`dhe^X]ipnbdŚnr~wpfߢmiqs[OORRTUUUVWWY[]_VPNNORSTUPPid[XZ^cilhpfQNkwiq|_QQRQdbSTTUUSQSY\\[YWTVWXVTSSSRQOMNRTUWXWVUUSSSSSSRRRRRSSSSSSRSUVXWUSPMKVnjgmjih^YVWVTSSRPSXXWXYXXVVVUXhqpqgZVgsYMfiQMQRRQRRRPRRQQPSbdWSTTSQLFMNUcULLPOONLKJKLKJLNORUVSNLOSURMKQ^``\XXcrpdfcTNOONMLKJIJKKIDGU\YSMJIJKLLKMYXSVURQPPOOONMMNMLLLJL_idfnkfjtsja]\YWY]adec^WSRXcmpoojd]YROMLNNNOOOQPNNNMMMLJJLMMMMNPONMMNOOMHDA?>?CEDEFFEEGHGGGHLMMNPPPPQQNNNPRUYZVRRUVVVWXYYZYWWWUTUUXXVTQPONMMOOMPOJGGJF?<<;88?A??AGQY[YXZ\`[JEMROAAB??BKPVb_E=?CJ[]d]JEGKPNFCBBA?F_x{{rR89?BBBBA@???=@PZUPPPQQF6ASMHMC?]ywR<9H`snI=<:526I]X@/04567:=BFGCBDA91123686689;DID>9778>6//8BHHC959=??<733467;FNQSRHCFK`zyqg^YWWXXUTSSROUbTAEE?@A>;89<;:<=;79853359=CFFC@5+,7;309@>?BEEDDD@:55431111//112345767:::67=C@85770.67752000025746535742455856>CCCIPPNKC>DE@@DNSUTTK6-,-.,-/02;FG@@CGLOGGTM5)*3?KQSG21::>?;97-)14/4<=979889?EC:468655589:500025724;>=:865679C8-.354/))5B?<<@CFJIEABFIJGEDDDBA@@?@?;89:5330,2??<@GD:9=;6421114763/,*,-+*,/48;:77>A5-4:4-2643358;;<;8237<>?>9432.+,261+'+5<:;<<7331*-CK5$2;0*,,,-/0.-*&-85LE()+8IJA?>720.,2>A@C>9?IPMA1.2599@A3C\]dhR<=@1/;93..9HOOLF><<6/('**(*1;<976467449?CC?AHI9'0>>5,+*&)7ACA=8/&'19;<>8Cjuj\ST`OSXXWWTPOOPNMNNMMMNQQPQQQPRRPQQQQQPPPNOPONPTVXYZZXUSRQRSRQQRSUX^bdeeeea]__\ZZYWUUUSRPNNNNMNQSTUUWWYWWYXWUXZZ[ZZ[\\YVTVVUUTOLNOOOOOPRQQQRTWXWUROPRRUWTONRX\[\`_]`ii_UPOMLMMMJJLMLMNNNNOOOOOOOONOOMNNNNONONLNTXWU]fnvwsqvzxurnllnlkmnopnkgeghknmljkklifXUruec\WYUPPU^\Yahhfecips}nion`Z^bb`]\\\^`bdgghosobWZ_ftnmmmlf`_^_aadlrwyvkzznd``qr{w`[\`]`hnpssqlinwa]_ZSX_YTX]ekkfa\\]\Ygxvwut{}x{~yxphmnnnnjfdc\[__^^`dgfedfh~|kc^[cqcivknqqqqig^V]eYOVfsvwwiPFIIIIIIGHKKJJHGHHHJIKMNKIJNPMID]ᶒy{jNOQHV^NMNMKKKJMUWQ{sMY[OTWusQHS]\TV\[\m{alYcztkiovreZZ_imu๗yԧeficrveUTSUYZZZ\\^baWRSSTUUWVPY`Xcd_bhppihZPUY~q^cRSUR[fSRTTURQQW]^\YWUVVVUUTSSQPOMOTVUVXWUUTTSRRRSSSRQQRSSSRRTWYYYYVTRNKZnjmskeicVUWVTRQQRTX[[Z[Z[YXVTW[YW[][WW^PRkaLLNPSSRRRQQQRTQZnaOPWWQOPLOMMMLMNPPPNLKJJLKJLMNOQRRMLNQTQLKPWZ[ZYW_mqgflVGJNLLJIHHHIHEFKUYXRKHHIKKLKNYYUXWSPPPOOONMMNMLLKIUifdkqnnx|sha^\[YZ^`cfe`ZVXaotspomf_YROMMNNNOOOPNMMMMMMMLLNMMKMOQONLMNONKGB@??ACEFFFFEEGHFHIILMNPPPOOOONNNORUZ\WTTVXWWWWWYZXWWWWVSUVVUSQPNNNNNNNQNDBBCA<>@<99:CJKIGGGGGHHJKKJIJJIMW]ZRIFE@;;AFMRSSUZXVNE>@FLMJC?>HOQXedJ>=BEIKHD@C?D^vzwhH79?BBBB@?>??=@P]YURQSSB4M\QTWC@]i=C?DA646?VvmHFIF:415J\T=/298878=GNKFGHB945533444642;D@;87<=@31/5@FII>67@B<8335578>FGILGDC>@]w|tjc[VWWWUUSQOKN`dM?>=>??=:::9:::;:=>;52478@HIG?:EIC;;>=<>CDBDKJ=79BNWXVO9+.0/+,/237;;;@CDGIMQK9.44/3:;66866778;?A>7337::8:6331135599776572-+-.2:<5440.++)*6C@:@ILLNOMHDFJKIGEEDBB@@@@@=975554203:5,+1448<;756530-,++*((+,-+''*07;9:CGB95:820233026:<<;8536:>?<51240+,/0.,*,4;=<951010/++DM;560++++,/100.)*4*@??;9;28C=71,.5;BD"/O[_bK93.,29783*7MNNQI=8961/-*&%+259:87776536:=?@?BKH5/675-+,-+*0??>Toqni]RPUUPPRTUUSPOOONMLLLMNNOPPOPQQQQQQPQQQQOONMOOORUUVXZ[ZUQQRQQRPPQRQSX\^^_`]YWZ[[\[XWXVTSRPNNNNNOQTTUUVWXWUTVWWXXYYYZ[YYXRLKKKKJLKMONNOOPRRQQRTWXXWQOPRSVXUOKNQPQSTTSUZ\YUROMMMMLKKKKLLLMNMMNONMNNNLMMMMNNNOOOMMNPQSSTTVZ[^`^htlipkefijjmnopstsqooomkjjgddlfZhokqm`[WUSS]_YZ\Z^ge]i}}minm`Zadb`^]]]^`adggipqh_[[imchhgfecb_]_`_jtxxusvrsznheco~}vykVZ_a_aeiqyxuuxui\X^^ZXX[XVZY]gqpbUW[[i|xwwuuy{z~vxxdcikkihgffgb___\]agifdbfi}}vpmbidcnqpiiptcf]IOdhQW|rvxaLNQHFGGHJJKLKKIHIJLLLLLKHGLTVKGDoѡmOJKIFj[INNMLKJHOliJnfQWWOSJ\iPEQZ[Za^RLR_sjR]y{xx|iZZTUvknߡz`kcXdr~ud\]bccdlh`^ZWUVWVUVWWSZZZ_caerwpj`UPSrShSRSSSdURUUQQSRW]^\ZXUTUUUTSSSQMLNQUVUUVVVUTTSSSSRSSSQQQRSRSUW\^]\[XURNJXgisvf^hhVTWWTRRRSVX[]\\[[[[[\[[XVV[^\XWSXbTJLMPRTTRQQRPSQVfjPQNTXTRSPNJJIKNRQRRPNMMLLLKLLMNPPPOOPPPOKJMNKQZZZ_ekkejcLHLKLJIHHHKLKOQUYYSJHIKMNNMOZYVXWSRQPPOOONNMLKJIMckkoqtpv|ukfd_\\[Z\\_deb][`lvytpomf^YTONOOOOPPPOOONMNMMNNNNMLMNPQONNMNOMIEB@?@CDFGFFFFGFGHJKKLNOPPOOOOOOMMORUXYUTVXXWWWWVWXYWWYXVSUVWUSQOMMNONNOOHA?>?>;AC>:9:AIKIGGGFGHIKMMKJKKJOZ]RILPJ=8?GGINONPQJD@@?;;BLLG?>LRRYckV>;=<<<=BA>CJNUVOEBDBBVy~vaC6:@BCBBA@???=@O^[URQSQFHciWVVA@`vL?@BB6424879:?C@??==A<=Ywqglqojb[WXXWWVTROLHQc\?49;<==<:998778:;:853368?ILLGEDDD@=<<=;3.4@DDDDB?FK:0;EILNKHFA22?BBA@;:DKD==<=?=87?><>><;94++0215;<;4-3;@;4+,8@?<<<;9538>>=<;<=@C@=;7668:;;=?>:875,)./0232/=;,+))*2>DDDDHICGJMLFGJKKIGFDBBAA@?@=7/-//.0242.(%)07EIG=49<500221379::864248;=:42341../.,*)+29;71,-142/+'*?KE5+***+++*-13/,,&,I9:]j`]_ZUZju_>48<<9875:BNXZM@KRUXWTRPPM@68><2035567:>ACC@G[aZRONKB>7298.(,.49<=6220,+.0/,-99.09A?4428LD'#7MYXIA>6017:AA05LMLSN<5971240+),016:8757::3157996:DD5.13/-,-2/(-ADZqle_UIGKCQPPRSTTRQQPNMMLMOONNOOOOPQPPQPPRRQQPPOMNOPQRRQRUWXURQRQQQPPQRQQSTUWYWRRUVWY[XUVXWSSRPNNOPOORTTSSRRRTSSTVVWWWXY[[ZYYXQLJKLJHKLMNNOONOPQQRTVWYXRNORTVXVTROLJKJFGJMNNPRROMMMKLMKKKLLLMMMMMMMMMNMMMMMLMNOOOPQPOQQSVTRTRLNSNWjcZdcZZ``dlpnlqtsstsssqookhdgkgcchonf`][ZZ\a`^\W`ovsp}rilnj^`ieagib][]^]ajmkpm_\^`sxmdacdda``^_`iyrqukfotstxnkoqpvvqzx~k`_`__^_fs}mU[b\YYZY[ZZ[[Y]ffg[Y`^zxxwuwvx}|}{|n_cheddffeehgeg`X]bhkjfbejwjdadqnnkknrsoaNJXiWW~y|x]RZRHHHHGJKLLJJIHIKMOPQQOLKPWVONIiɫtugIJKLEQ]GMNMMKKIIfeMhoVPQPPSLLgeRLP[_bVKIJIP`nlX`|gXWYaxrqsxzɼy^fcP`SQ`gd\X]aglph\XWVVVWWUVVVUVWW``rxrgYTHir`x|dTSSSRdZSSTdeWUX]]\[XUTUTTUTPOMHKQSUUUUUTVVUSSSSSRSSSQQQRSRSX[\\\\\ZXRKGXa`qr]Zeh]YXVTRTTTVZZ[[[ZZY[\]Z[]]]^``]^_\]WOLMPRSSRRQRPSP^haSVMLW^gaOMLJHJRVSTURPOOMMLMLLLNPPOPQQPNMJIKJGLX\_c_^gigkYHKKKKIGGJORUSRRVXTJJLNQPQMOZXWZVRRQQQPOONNMLLKJXlmswvtrywlhjd`__]\[Y\adb_ajs}}wsojd_[VQPQRQQRRRQQQPONOOOOPNLMOQTQONONNNLIDB@?ACFHGFEFGHFGIKLMMNOOOONNNOOMNPRVVTSTXXXWWWWWWXYWXZXUSSXYWSOONNNOOPMHDA?>?>@GG@:98AJJHGGGFGIJMPPMLLLMSXOBDMRK<9GPGFMKFEB>=>??;9JSTUWTNGFEC?DayxdB7:@CCBAAA????BN]\UQQSSYekiZMN?@eyS=EABCP^fg`UKHFCA9637IWH2/:EKHDEHKNQRPIAAA@<865554122358;=<=A<107DKIJC:8D=2335:;;>BB>:778;;8Jg^FDQ\ZVYZVVYWSROIFCDQ]K34;;::97754444574322368@JKNONICA=:8;?>834;AC>3.4:83125:6556644456;BDB:9915DD??==<;77@GEA><707IHAA?<>?706616<=;95,*2889=>@;/13046426=ACDHE=;;;99;;<=CEB=94+)-157834B=*'+-1=HIHHHF?56=GLGHHJKKIHFDCAA@>?>9/,,+,6;4/.025:=><>=<:982.-+*)((*01-+,-..028@GF=58:2-/257:<<96433347987532212111.))+/360**/7<80*((+6GC-&'(*+.159;7/*)0<157975439HRMJPXfSGRRSTIKK:/17622118EF?@CBAB@LUVZYYVPI>8>D2#/54446/,+)*)))),5CJIJNPOIHKO[]C28>IMJKLMHBHKGK=4GSRSP>4<90133210-.487769?B;678:835=:,*+,,,./36649=3,2/(5AA<8:Wqj]UJ=:83OPPPRTTTRRRPOOOOOOOPPPPPPPQQQQQRRQQRQPOOOPOONNMNQSSQPPQPOOPRRRQQQRTTSQRTVVWWUTVXWUUTSPNNPPOPPPPPRPNQTSRSUXYXWY[\\[ZWURNLMKIIKMOOPQPOOPQQSUWZYSNMQTVWWYYVRNLKKJIIJKLOPONMLKLMLLKKLLLLLLMMMLLMMMMMLNONNOOPQPPQQRUSTXXQMPNP\_WTUUYZWXahigmststtttqpomkjhinkfeffeb_^\Z\`da[\kyyrwxokji_Ymyc^pwaY\^]\cmrqoia^^_j|zxw``acda``acdtsheihjnopmjvwmnspjpxzufq{uneVX^]]^hw}|eYguoge\TVUUUWY[abmobYf~zyyuuwuqv|yv}tgfighhklmgdiljb`fgkllkhc_f{`khiwqt_Zeitr[NLHVVYu}s[WULHIIIIJJIIIJHGJJJNTWXVUWWQNPPQP߰W̽i\XGJKLIOb[JLMLLKKJPb\M^lTPPNRVTPf_KWd]PMMMNPPanikjXTX_YQg}÷`quj_\VQHumROQUZRLOVZc_UWWVVUVVVUSUYWVOg`Ujyxk\OJ˽kXifYTTUTWeaRPQepZWY[[ZZXUSSQWZSLKKKOSUVWVVWUUUUTTSRRRSSRRRRSTSRW]^^[XYXZVLI^\WjgYY``_]YTSRSTUWZZYYYYYXWVUWX\^\[^][[\^`\VRONPQRQRRRQQVicUQRLI[isoVLLKIJQUTTUSRQPONMMLLLMNOOPQQONMJJKKJMW]cf\T[dbd\KKKKJIHIMPRRQQOQSQLLOPRSSPR[ZY[XTSRRQPOONMLKKJQhqruvvuwxtopmcbcc`_]\]_a^`gqxzupied`VRUUTSSSSSRSSRQPQQQPQOLNRUUPNNOONMKIDB@?ACGHHGFFFFHJLNNNMMOOPPPPNOLMOPRVVSSUYXWVWWWWWVUVZZUTSUYYWSPPNNPQROEAC?<<>?EJE>;:8AKIHHGGGHIKNPPNOORNJE=?JPQMB@LVJCFG@=>ABBB>9989=>=<>COTbxkHF[S?>?>Pa\UUQJFFJGDCCCkzg@9;@DDBAAA@?>?DO[\VQSUR^iji\LK>Fk~aH?CA@AMZ^hk_LDB<<8635DN@/0:CHHFHHJMSWRKGFDB<:87885243354568=?811:HLIJLA5?:2347;;DHJKHDA?=:78:;=@>>B@:5259984/08DA?=;:?>6331//133235642112330/48AGHIA;536;87:71.---/242247898/*.=GD>?CBCE@7:C:,+/:FA9;@A>=<;98742124567;;<<;7..286457:;98@HGCDEDC:5=@>?<8:<72/),2:=435/+0578=>>>66=F>31.5HPLKKI?2-..++6@CDEHB;;;::9:::<@EGB:31/.178613DC-',7CMSQKFCB@<89BLIGIJKJJIHECAA@@@=50-/17AA;778BEC@>88>=59@=83/,*),/44//9>@>955652,+-378;@@=952597795452/,+/453/,,-./..279:<4/+*+,(7H@.((-6FMMKIC826879GQX^`[WYZ[ZG6787994.0EFR[F<>2,/55230/5AC>?A@>?=@EM\\Z\]ZPCAE:,.---164420-))*)+5AHLMMOOMJOSW_TB?=?BBAEOQNXW?<9885/.32*()++.313860121-%)/6>@:/,;;<>DE?<<<:AKJHIIHGHJLNPPPPPPLB;:EPQNOIDLUKAEGB?ACDEFB=;9888:::;@EQol\ceYID;HbbWOOH@=EOONPUQ_yY:::AEDCAAA@?>?EQ\]YRUXNNW^_XSQ?LovXV[DA:12;CFDDEGJNUUPNLJHE@=<:997763331105>=521=LNJKMA3342459<<=BB9455338<77676BU\ZWPOi|qdgf[Ya[B377569::73.5B>6423:94342002232234300/1357578:?B@88844976640.-,-.0/---.2773458>;59ACEH@6<:9:;;:97547889998:;<8-,048=FLNE;:CIGEKPRRL@;:59943343/+,/45,.20..037=?>>;?C?8678789::9:AGG;1265355403GM9(,>QWUTOC<@ACB@GKGDEIMJJIIEDEDCAA<0+*28?EA@CA>@DCB?87?>16JI<72.*),132-/;EIJE=9;BD>71.+++-178:=<:88:<;::8665.+.45420.---**.4;8420-++-01,4C@-'/8L[[YRL@;=?77I@1*5PQ?844@RG331+.44220-/59@A<99::>@;<<;;=GKJIIHHHJLMNPPOPPL?8;BIHKQLFMPKHMLECDDDEIKKLOK@88:;<=9=cq{ud[C?Zg^QHC?97DY^XX][]kD9:?@GS]]]UW\PBDGECJMBGfwi`udD@@[cY[^[RB;<8433468997;=CA@BDHKORPMNNLKIGD@=::;;63321105><422=LMJIE>312347:;<=BA7234338<77779G[a_YMZ{tjs{mabS94>D?63323456544323341/05=;;?@>:62/29?FHG?<966:999714<83/0//057543344433453100039>>878;=647733765520.----..---.2524>EC;4378=HI<6;5*.1//5>>8:==>>=<;:;<<:=??>=>;;<8.+/9CFGIGD;:EIGGNU\_YE57:73012110--0235631--,07>>:;<=JXS=8>7CCA?>@?=:424578878?HJ<-066423203FRD./CV[VSF64>CBADJF<<@BILMNOMJIHFDA>6,*6>DFFGMI@?CBC>99A>09UTC;81,*+--+*.6?IKKC<>B@:3/-,+*(+4666788;<<<;::;::500453--00-**,/3540...,,.02/)5;0*006JU]XPD=?>969:<>BJWXLF=33567:>?85;=4.113676650;?0//-034320/14:=?@=9769>97LYZ]_[VTQ@32.,4<6/+///41),:CJQPE=>AFFDHLQTTURMGDEHONQaR0(+**(&4LH-'+(*,,,.//.,()3CIJIHB9530+()*()**+0BE1$#%&)+0CNA67@@5/-/13550)*.NNNPONONMMLNQSRPNMOPQQQQRRRRRRRSSSSUTQQRRQRPOPRPOOPOOOSTSSTSRRRRTSRUWWWUSTUUUUTTVVUWXVRLMNMNMLKJKMOQQRTTTVVVXZ]]]^`a]UQSQIEEECBDFGJKLMOQQQUXWSNKLMMNOOQTSPMIGGIKLKKKLKLNPRSSSRQPONLJJJKLLKKKKKKLLLLMLMNNOOOPQRSSTW[YXWSQSSRRRPPPQSSQPQSVVSZ`\W\]ajnponoonnsrlprlfa[]_drwq|ljhegd`qyd^fg`^[\_bbfpjabba`b]ci_bpp``feaaegf^`ba_`bdopmnowtjhluvnen{exv^cuqjf``jj_]`ZYgn]UYZYYYYURf~{zvtsrw{vs{}{{vpqvy}~skntwzvpvyqiefeilpprssuxjUSQc}~n}lsqe\YXPLMNNJFPj|q_VPKIIJIJKKJIIIIIJKLLNMLMMMKIIH|oZTJLLS`{dLKKJKKLLMLKJKJKLKMWSHnqeWZ]WYYTdndZSOMLMPLmՕqwfORMP[g՘TEydQQenIVOMMOOONPOOQQRUVTVVVVUUTTTTUYYWURGPtaIMI[~a\a|Ϫ]PWWTR\babaKINLLSZZYXXXXWSZemRIPTUVXXXWWWXXUSTUUTSRRRRRRTPMSZY]^akZGHNTVUUPCP_]XWXVWWZ^XRRSVXZ][WUUVXXXVVWTUeeZY\\VRZ[[\ZZXPOORQSSQPNLNXOLLEPsNQSUTVVUVUUUTTSRQPOOMLNPQQQPONLKLMOOSgxkbbVKGGKOMLKJJJKPPONMMKKKJJJQPRUTSY]]\^ZWWUSRQOONNKKMm{puyuuuuussro`bmheb`__]YX]mzzvrqsre[^b]XVVXXXWXXWVUVWTRPPPRVWTSRQQPMIGECCCEILJGHIIJKLOQSQONNOPPPONMLJMNOPTVVTTXXXWWWWWXVVUSRSRTWXYYVTSSOOTP?>???<:999;><;;:::CLJHGIIHJLLLMMLLMG<9:;>@KSOJMMMOQJCFIFDEKSVW_dP8;HKFB=9V{okgZcoo_J>::87GbgYUVZhb?=;<@DDCBAA@>>BJT]\^WYbUGF?719AAC`sareIAEhlZ`[QJEB>:7448<>???BA?9:@EIIIJJKNMLKKKHD?;;?>82221105>=511=JKHB8:5744468:;=@?:65547:;6779;ENRY]Zh{}vjivq[SM@IVPB:52134454312123430/4;A?<:::8:=><853126820345BSM88?97;<9/+29679:9;<=<<===::<;;999<;7-,17000.-3/)0;<75:9@?:43568:88=EI?24761/2236ANJ98FY^TJ<-/;BC?AD?67931232/,-147CLLC>BC<2.---*),/445679<>==<;;;;;;9645530134/---,/-/0021/---+/..0/0/*6LY[ZUF;=>;7999::>MTB=9/-024;>A>896/-052456;:003-,.13333447:=B?A@5255=ADC?;856;>=<750ONNOMLNNLKMOQSRPNLNPQQQQQRRSRSSSTUTVWTRRSSQPONPQPNOONORSSUVUSRSSSRSTWYYXWVUUUUVWVUSUVXXTOLLNNLIGIJJLKLNPRTTSTX]^^^`cb\SQTOHEDCCCCCEGHKNQRSSUSNKJKKLLLKKKKJIHHHGHJKLLLMNPRTUTSSSSRSRNJJKKKKKKKKKKKLKKKKMNNMLNPQRQQRV[^^YSTTTRQQQPPRRQRQQTUUY[YVW`hmlopnppooqrsuuvtne]_dbs{leagcfedkk`bc^[]_^`cb_ac_`a`_a[`c^difa`dehlkhfcccb^`a`nqotsx}thjutssusa_riZcirrikb^eg`\_^Z]ppYU\XXXWW^~wsrnfp~~|wsp|~|y{xsrrry~sosy{~{vx}}oddcegjjjlkkvhVUSZmx|pwskc\UOMJFGJAOqhZSJGJKJIIJKKKKJJJJKMLJIILMKKIGGRUOGILHI[XOIIKKKKKKKKJJJJLKOgWUxsVNWVOMNMGQwg]UQMJKPQRŀ]^`pbMPR]qnPWZaYRUReGTOLMMMMLNNPSTTTUVVWVUTTTTUQRYVPUXMLQKLMLK`ohiKDYvNUmnigmye[n^FJOKOZ[YWWWXZ^gqiOOXYYXYYXWVUXWTRSUUTSSRRRRRUPVrybY^]hfJEFLSQJGDNZZZXWVVRVb\SRSXYY`]WTTUWVVVXSX]XV[^^]\P[^[[]]]VZZSQSSQMIHJNMKLDDk\VXXXXXVVVVWWWWVTSRQOMOQRRRQPONLLNPMUq|g`ZPHGJLLLLKKKLPOMLKKJIHGGGIMPSTSZ^^^`[YYVTSRPONOKKcyxtvsttuqlmtqc_opgc`__`b_]f{vtutuod_fhaZWX\\[Z[[YXWWVTRPQSTTTTTTQPNKIGEDEFJMKJIJJIJLNQSSQONPRSQPNLJKLMMOTWVTVVVWVWVWWWVVWUSRQQSWXYYVTVUOOQB;>??<;:9:;===<<;;;?HJIHIIIJLMLKJHHH>:9:9:?LSQMMMMKJD?FNNJLQWWTYhX;@V]RJHFLdodTcso~oQ=:8886IggVPMWo\C@<;?CDBAAA@>?CLU\]]Z]cYONE618A?ADEEDDC=79@FIDBDGJMKJJKKKIA<<@?<62111/3>@411=HIF>547765579999999997:>@:3447A>?=8?C:579864689626AA859;;;AC<55317==9652014545666758DLA00887;GPG;AJKLMNLB<467765237::<>><9:854447>8.--3@HB=9897./@F4(/D`b>(+3BNNKC95208AINSWZ^\H49A92588;@HG;:@<5;JRVK7<>ADEDA=;;;<;99>B@77:70-26766DPI?DTXPC81/5:?A@>:35>NVVUUUTQOMMKEA=48NYYYZYTG>?DC806==65IUNB:406@A;545456;EF??C@:1,+/0,-3565689;>B>78<9657777898981.,,***,.2553/--/0110/014BU^[^YD9;>;755893/?P>37869;===?=52431146324540/-,/22332358<=?@=862026>@43.''*/1,*06,".BD<1,3967;@CFFGHMI<68>DGGED=ONNMNNNNLKMOQRQPNMNPPQQQQQRSSSSSSTVXXVTSTTTQNOOOONOPPPQSUWYWUSSSTSSTVYYZZWTSTTVYYVSQQRWZUNJMOMKIHGHJJJIJNQTPPX]^````ac[PNSQKFEEDBABDEGJPTUUVWQJIKKJJJJIHHGFIJIHHHILMLMOQRTTTTSTUUVWSNKHIKKKKKKKLKLMKKKLLLLLNPQQSRQV`gfaZSQQQQQPOPPPRTRRTUUWWWUP]hdflmlnppqpprssttuvojidczv|kWoj`^_a_`d`]]^aa``_]\^cfa`^YVirpmb^[_iloojfmpd_^`aa`luvwpznl{~|vqspgcbfe\fy}qjhea`\\_[gxkYYXXYXWuwqqpei~zvtouvrsqqqqxzvuvz}z~oec__`bflmstrcVZ[YWbsg{lll`ZVS`j`JCVsr^[[PJHIIHHIKKLLLMLLLKIGFGJKKKJIJd]aQIKJIJIHDFMMKLNMKKKKJIIIIJKGSoS_rVHJRPIILMJHf|i\URPMMPVZ^zd\_XZgubPJt͛daeZRSSYLb`FRMKLMLLLLNPSTTUUVVUUTSRRQPLNSSTZWPKHKMNOPR^mfPelSNo|upyvsvPDHMV[WURQX^mww^QW[[YWVWVVTW[WSSRTUSQQQQQRSVP[iYX]cMGHHNRIDEQYYXXXWUSQ`[TTUZQKY^XVVUVVVUURT^`Sam__\JQf]Y\__X]`TORQPLGEHJKKLKCNydU[\ZXXVVWXXXYYXVUTSPMPRQQRRPNLLMOQLRqlURPHGILLMNMLKLMKKKJJJKJIKLLOUZYV^_]aa[ZZXVUSPOONHXwyuzwtxytklx{k_lxkdb^]aceeftxsuwusmijmja[Z^b`^]\[ZYXWVURPQUVSSTVVRNNLIGFFHJMMLKJJKLLNPRTSQONRUTQNLJIKKKLRXXUVXWVVVWVWWUTVWURPQQSWXYYWVYUOMB6;?>><;:9:<>>>>><<;::;::@GNOMLLJGD@BDDBAA@?AEMV\^][^cXLMG35?A>:311223=D809CFC@;644323679975447>>>=:51110357=BILB315756::7641.29?A@=8;=8677543445426==89<>@BHF<89648;:757621233135655>KH6/7==;9;86?JPSVVVVXXH:;<94./357;>>=;<=:68??96811457:8458720-)'''+/124543212440.0;>>MY^\NB>=<:71.5:4(2ID328@GJD;:<8/)*,0331..01/,*(+45112236:<::;9425547<9:KW?885ALP]Z@+),+*-49@@3+*(),179;?CFDCSc_\hlc`\USP?234/.--03-&)*+31',-'%*++,/3640#+GQPPN>12/)),140.10+'(''-14<@;65=DHHIMRND?>@FKLLKANNNMMNMMLKLNPRQPONPQQQQRRSSSSSTTTTVYZXVSTUUSPPPNNOPPPPQUXZ\ZVSTUUSRTWXYYZYVSRRTWYVTQONPXXQKJLMMLJIJJJJIHJPRNLU\]]_b`_cbWMNTQJFFFDCCBDDGOTVWX[[UPLLKJIJJJJIHIJJJKHGIKLLMOPPRTUUWXWXZZXTMJKKKLLLLLKKMMLLMLMMLMOOQSTTW`hhhf[QPRQPPQQQQRTRRTSTUUVTUZ[Ycnjglnpqnoqnopqsz{urng`|svWgh_][Z_ghgedc`\\^_]WZhkfddc_qrca`htsnjhiqna\\`dc`fs{vkzvobnoqnkqsgslimkc]_]_r{dVXXWXYnzvllypopmhu||}xuqpypnnqrty~}zrlp|~rcd`[]bfptutf[Z]`_\Wjgnunuk`c]PLOM[|rut_Z_XLJMJJKKKKKLMMNMLJFGGGFGHIJJIJIIFFFFILJHHGGJLOQOLKLJIIJIIIIJHaoNY_KHJJHHLOQMFWl_WTSQMMY\NO^cc^WV^^QJ]~լzvWISVKqlGQNLMMMMMLNPSSTUVVUTSTRPOPQRVYYYUQNLKMNNORUV\_sr]Qztd^`wȈFAKSYUSOGWepqbUXYYYWVUUVVUWWUSSSSSRQPPPQQRTRSbgT]`MIKILPNKFPYX[WWVTRSSTUVVRQIJUYWVUVVUVUTYcgcg{p\[QI`ZSX[]W[eYPPOQNLKLLKKJJIAVxWUWVUUWUVWXYZ[[YWUSROLORSSSRQLKKMPPJLfhJHLHHJLNOONNMLKHHIIIJMPSTVUTX][[b`]dc][[YWVSPPQLLr}vvwu{}ro|xghurffb^addbfrzpswwspnopnh`]cigd`][ZYXWWVURPRUVTTUVVRONLIGFHIKLLLKJJLMNOQTSSQNNSURPMKIIIJJNWYVWZYXVVVVVVUSTUWURPPRTWXXYXWWSNI<9=><=<:9:;<>?>==<;DILKLJGB>;CNRPPRTURR\ZWagecaa`_Q>?E;Tre;:9:=CKWcbOALU`^L9;<>@DDCAA@ABFMWZ\\[]aQGMI68A>=?E]lnbRTXLOmw\KFCNjdIAA>>BFHGEEDGHFEEECACCCGHIJJLNLHA>>@A<5202645@=<@CC@>;85421335775426?EDBACD?6126>DEK\agpK^~rmhd\RNMQ_]B443100000/1216AFA856799<;@BCFLG?A@=<;520/1663223337723?I?05AA<60.+0@LMMUYUUZ\XB7=?6-/3469<>@>==;:>DF;,+003953DRRRRQMLE@BDHKNOMKGD@@;2/5:743772166544;JLB@>AG>7765555:BB>BLVUQPOOMLIECB=4,(%1EV[YQF<;A9(.?A?<:876469833=415658:7@WO=>80249VcK1)+,09CED=.)+*.10039=::57Sf]\hcf}rUSZN764*+032-'$)/0///..+&''(*,/361'+ESSOL?.+.,+-2650,*)('%$(+2?B<69DIJKMQPPSPKIHJKJC=NNNOONNMKKKMQSRQPOQSRRSTSTTTSSUWVVXZZXVUVUUSQPPONONNNOSW[][YVTUWWTSVXXYZZ\[VRPRSTVWROMOSVSNKKMONLJJJJJJHIMPLIOVXY]abbbdcZMNTRLJIEDDBBBEKRUVXY\^[UPMJJIIJJIIIHIKKKIHHJKKNPQSTVXZZY[[^_]ZWRMLMMMLLLKMNMMMMLNNLLNPRSTWZ^_cih[RRSQOPQSSSTSSTTSTUWYVSSTblhejnnqkkomoqppswtpprlcz|UZaa_[\fqqpja]^bnxyyrpvux}~wot}p]bn{yuvofenla^_bfdbdlutmw{luzlx|xokwvyvzwsokg`]]`ltfXWWWWXY]]Wavtutqcduq~xvtru}xqnpqty~{yurt}~cac]`cflnjea`abccbY\homifmoqmgTIGEPiQLTWLGINMKMNLKKKKLNNLKIGGHGFEGJKKNLKMKHHIKJIJIJKLNONLKLJJKKJJIJIJjiPNMIJMOQSVXZRJOroaZWUQLO`Y\iqlc^YUTYKgrGZŰkWE@GlnDPNMNNMMMMOQSSTUVWVVVVTSSX\]^^[WRNJMNONMNOPKb~qX]|xfc\UTR[ܻZBGNWROKGUek_STXVVWVUUVWUVY\VRRSRQRQOPPQQQRSSLYxdb^PKIIJJKMLOXXZWUVTSQQSSTLGNJDQ[WVVVWVWVYbmpljl[VHR]WUY\Y`hWPPOQTYZXRMJIHLFBi^CGLNORSSVWXYZ[[ZVRPNMKORSSTSNKJKNOOJGb|XFIKJJLNNNOONNMJHHHHHMTX[\]YUUTS[f``ge_]]ZXUTQQQLe|wvsu|y}rjoqjhebhic`eo}xprtstutrojd`fllgeb[YYXXWVTTRPSTUVVWVURPNLJGFHIKLKKLLLMNOQSTTSPMPSQOMKJIIJLMTXWW[]ZXWVVVVTSRTVWUQOQRTVXZZXWWTJC==>>;;;:::;<>?@@@>=<>BJIIIIHJLPPPOMJGEA;:999;?GJLLJHB<>HNLPTQMJIP\acghfeedca\OA>=OfvqJ79:@BFNXZYXXXYIDMO:7<;=CDNTSHBBP\ak|[D@A?XkX@9<>@DHJIFBFHGFFEDCDCBEHJJJLOLD?=<=@=720242.9@A?=A@>;987430,03532/5@CCB?AFE8025>DIOVYlxYQs}~ymgnhULJV_K::720010/-056;EKKIFDCCDGJE@DH@447546:;=GMKC7220//2687764228>??=8531223357730//04:::@EEIKEEKFBB91////37778<=;:505DE51?IJC:3367=DHMQXZYWZ^S;6<7002468:=??@A@@FF:/0CGJLNQU\^VF???BDEDDA<878997557:85DPQRRRNG=:@B>CMRQLHGD?7-+,150,285698<>69FE=CFDD?<:5332029>BHQUTOGBGIGABEB9.**&(6JWTE<>A?6.8BCDFB>=;7223258<;5+).32012469<<::612;A6.1579;AJROA8;98:91+()/33.***+276883486232.('/78862249A@;@C;31355692620341*&%)0540,+..)&%'*-.033.*=PVOI@5,,.-.3994.+*----//04538?EHKNTVSSWYUQLHDBACNNNOONOOMLMPQRRRPOQSSSTUTTTTTTVYXXZ\[XVWXVURPPPONNMNPRVZ\\ZXWVUVVTUWYXYZZ\]ZTPPPQUWRMOPPRRPNMMNMLJJKJJIIKLMKILNQTY^acbagfWKPTSOKHFDCCCDHMPPRTSX^\SKJJIHIHHHHHHHIKKKIIKMOSVWXYZ[[[\^]]^_^]XPKIJLLKJLMNMMMLNNLMMNPQSVVWY[ckbROSQOPQSUVWXZ[WTUWXXVTTT_dcflnnoiinkmppmjmpkhyynv|oW\_bc`[cpqndYbtifmh]k|tqvxnbjkcaadfdeffnsoqrpzktzrkhvqyyb^gknspfdgc]\`ffbZVVVVVVX[Xa|}~}geyp{wytlv}~yvrnsz}xttx}`Yaaabddcd`]gecba_abaff`\cn{~|kOQlreXMHMNMJLMKLMMMLKLIGIKLMOPMKJHFFGKNQQOMNKJIJKLKKKLLLKKMMLJJLLLKJIJHNtiHFGIOT`b^[XZSMH_sf]YVPJTtwrf`\VUQOsMU[sӷ{xceھmK:C҅DNNNNNNMOOQQRRRSVUVWYXWVVY\^^\WSRNMQSPNNLIDioVV^dZPPROPPNOVYowAHITSNKKScfWVWUUUUVUUUS]joiVPRQQQQQOOPPQRQSVSSRa~mfOIHGGGEHMSXVUVTTSRRQQSMDEHHFPYXVVVYWYV\fmzwpzcVLQ`\U[`]ddPOROQTei_UMHKLNMHSdMFGLNORRSVXYZ[]\\UMLLLLPRTURPKKJKLOOIHflKGLLLMNOOOPPOOMJHHGIKQTWYZZUPNKJZjceigda`\YVUSROY}zvsuwz||uqnkklhjlc[_p~}upqu{~yqlifgnmdadb[YYXXWVTTRORSUVXWTSQPNKJGGHIKLKKNONOPQRTTTQMNRQOMKIIIJLNRWXXZ]^\ZWUUVVTSRTVUSPQUTUVX[[ZYWSI><:<=;;;::::;:>FJHB=;8@IJIIIIJLPPPNMLLKG>9;;<>BFGGGFE@>AJQNWZTMLJR_bbfmnlihda`[K@EWacZE;;;BFHHGFFEFDCDGHHIMOK@89878;83/2322=HHEED@=;8766328=CD93116967<@GH9/06?CGJFDUVKg{{imxgNFQWG<<;40121-2AE?ALQRRPNOQSQGAGMIA;;98984247766730/011369AFGKF;@IDBD8./14668;=AEC<613BM@5AMQROJGFFE?:@IMT[\]\\\E4443222469>BCFGCCD<06HPRPE827<:66647752011//034430/58++9?=>?>=67BEEC>@CELQSVTKA77888657;51BOOONLD8--;C53;GNOKIHC>5*-0/+*398;:8BIHC@A>4-0//013:DLSTPHA??<7;CA5*)*(&/DPK;48:86247983/6@B<761B[J312342145548:3,.2..133578862147986874694-*/2457:;><5/,+0;@8.0799<=?AC@;;922=JOTTMD=DLJG@71,./0/.0+'273652:LRH=62.,288:8435A<50./10-,02.-059305@WdX^kXSydKJOB-,100/-..+'/87-'&*,01///101223.7DQMGA91,,.//4770('6>;873.))2=BDFFP[_\SMV\UJ?56>HNNNNNNNONLNPPPQROORSSSUVTTTTTVWYZZ]__[VXYWSQPPOMMNPQTWZ\\]]\ZWUTTSTWWWXYY[]^ZRONPSWUONONNPOOMMLJKKJLLKIJLLKKLLKMMQTW\^^`eaTLOSRMKGEEDDCEHIIKMMOTWRJIJIIHIJIIIIHHIJLLNMNRTVXYZZYZ\^_^^^^]__]VNHIKKLJKNNMMMMNNNMMNOORUUVUX][TPQQRSSUVWYZ\^\ZYZYYXYWVWXW`mpnqhdhfkookhedcbmqpnwzrozrcbaaba[Zjui^kujxxoqjklqqflmbbdhgefgelvutvvmolzpgnojffinsvxwu_abbdebcfd_[]^``\XXXXXX[^YYyxwqhp|y}{u{}}||zvojknt_S\b`cd__qg`efcbachjaZ[][[_kz}xqkRCCGIJKKKQPMMNMJJKJIHHHHKORPNJHGHHJPTPMRTOJIJKKJLLLLKKKLJFIMNLLJIIJFX|^EKLFFRbaTPRPOMGMryl`ZWPJVuic\UTN`sIT^^QӊctlRPe>o{WPPONOMMPRRQRQPQTSUX[\[[YXWVVYUQOOSZZUPMJIwfEHSNHKPQPOQOLM_gf]GHNRRRONSd_VWWUVVTTUUYiwo\MMQQRRQOOPPQRRSSUWUMSbjpSHJGGFDEMVXUUUUSRQQQRQJJIILJKVYXXYZXXUVbj|rppTOP\WPYd_aYCKTRQQ_pn[LHLMOPQOPJNNOOPQPSWXYY\]]]WNJJKMPSTUQKIKKKKKLLLpbGLOMMPQPPQRQPONJIIFJQQRSTRPOMJHL`mgjmkjgb]YWVURQzxvqs}xv~{~mglmnsm_Y[j}wnuvnmnmnoj`^`]\[YXWWUTTRQSSUWXVSRPPNKIHIJKMMMNPQPQRRSTTSONOQPOMKIJJLNPTXYY\^^\ZXVUTTSSRTVUQQVYVUXZ[\ZYVNIDB@@>:99;;;;;;BMRKD>;6>HKJKJJJLNPQPPOQRLCABAA@BEFDB@AA@AJRVZ\RN[cacecfntuogbbe]JAIRU^aN;9<:CRUX]^YKDMVYQ@:9?AAAA;3452178412524FROKIB?>:89998BPY^WA7><430/:CHC7249A=8;86@>CfspttaE@JOKHEC9/154/@^[D@LRSROMOW[V@6FRKEDB?<:9::;BJKHD912234577866557:<879<<735886554//012469?EGGC<AA@BGH@6209LK7?UVQQQPPOOND86@B>7988CNSTL?6569<6256::76532221005998862/7?<57::7)(06=>67;:@JV`bXD557887897//ANNJFC<3*+9D6..352.*,/7;:<=>A=8;B?=952/0578;@GJHCGH@;:9>EC7,()(*3CKC82,*-0/-./+%%4EF@858IO75A?8423311368963211235:<9631259;98;;66=IMIA>?@<9:986322127<<6.(&&+8A:2279889;<=@?=<80/:FJMQLB78HQUVM=.-01002.%(0232-.;FJIB50499873148>A;957>6.';MMG=3,+-6>BDCAK]ecM;M^WF:78=BNNMNNMMMLLNOOOPOOQTUSSUVUTTTUVX[^`abc_[YXUSRQPPNMNQSVZ]^__^^^YTUVTQSUTSTUVY]^WROOQSVUPOMLOONLKKKMLIIKKIJKKIHIIJKJJJLPSVWZ\WPLOQOMLIFEEEDFGGIJKKKLMJHHHIIIJJJIIIJJKLNOONPQQRTTTUX[^^]]\\\^`df`WNJLNMLNOMLLMOPONLLLMORVVUTUSRTRQSTUWVWXXXZ\\\\[XZ\[WSROXjnknf\_filmmmicacccfhlu~{vtuvmfb^]]foaY|qsylehiib^hpheglihihem|ywwt{tyynjoqe_gnlflpevmdfda`bcddddiia\^_^]\YVY]ZXj|b[xtjt}{~~}||slgfccgtxdZ`fddeakmadgjifb_`a^[]]^^bn{dNCFIIIJJMSRONMLLKJHGGGGGGIKMLKIGGHGITZYY_]PIJJJIIJKKIIJLNMMRSMKJIIIIBf}YLOIUm_TZVLLKJJHIb|qd\WQGWxlcZUQQWVGIY\]\WٗhMXceKXdCjjjjNHUXSQQQSWRQPOPOOPV[\\]][YUQQROLNV_`XSQKΣoOHNNOQQPOONNONM^iYnحQPXTQPNNQ\WUWVVVVUTTR`z}zcMLQRRQQPPPPQRRRRRTUUODOflMEGGFGINWWUVUSSRPQS\RIKKLRNOX[ZZ[[YXUPWdyoYsrSPQVSKT__^SDGRRRQSoiKILMPQQMKKKMNONNOSUUUV[]\[UMLKLMORTSOKIKKJJIJJInaJPSMMQTRRRSRQONKJHGJNPPPNNLKMIIVnoinpoojb^ZYXVShxtqry|}{s\hpklne]_fyqn}ukksvpjgb^][XYZWVUTTSRQQSTVWVTRRPPNKIHJLLMOOOQQQQRRSTTQNPQPPOMKIKLNORUYY[^^^]\YVUTTSTSSVUPRX[WUYZ\\[ZTNJGFEC?<89;;=ADFJPPGA>;7CCA966931=WB08?BCEIJC9>98@C;=N`daZI@GJ;5418DC9215AK9-38;DECJIY}fJ=CHNVY[U?/2442?^jYIJV^[UPNQTXH3:MNIHC<;;:;;>CKLGB;54445677777799:;::;<;755666661++/1137:@FGEHJHE?712302:LbiT<112588::921@LID@>9622;C:53312:?@B>565/2645868;:=BDDEEDB?EC88:98107ADGHIHC<8?JJD@BFGD=5.(*29AFE@91****(+00-2DPMF<36A<5CKD;5451,,.15888885459=:42479:;;998533?LMHEDB;79:866765447;7-'&&(/8;63665558=@BDA=;854:BEFHE<42@MT[\N5,020/11+*02/-*').6@I>0;B943.,17<;30388.+-/./@M8'-685353.5GK;3666752,+/.37/+,+*+)&(/06HX[L@MSQXQ>BE3,022-)+.254760-*(%,8=;86543/,,/38?BABB6,*;Z?.=C5(9V\RC4+079CU^Z:-J\VHCKLIENNNNONOPNNNMMNMMPSTUTSTTTSSTUWY]ab`[Z]_ZVUSQOMOOMMQVY]``a`]]`]TSXXQORQLMOOORY[VQPQQTWUPMMOOMKKLMNNKGGHJKLKHFEFIJIHGHJLNOQOOONNOOPOLGEGFEFHGIIIJHGHIHHHIIIIJIIIIJKKJLMMMLMNOOPPQSWVTRPTX]`dgijicXOMNONMLLLMNOOOMMLMMOSUUTUTSSSRPRSTTVXYVUX\^]ZVY^_[UTQVeg__\TZfdejmnnmlkgdbdejtyxvvvsqg\[]__ZUdwjdkslqpehje\Z`ikmlkihijknyztww}k`aeioqmorc]jtlaflhepsfadgccddgov{~o^[]]]\ZWY[\Z]gha[Zezsj}~z|~}{~|nhggc_\_bi{fghig__cn{k^abfihc]X_fbaabejt~pe]IFHJKJJIS^TKLIHIKKIGEEFFGGHIHIHIIHGL[ebae_NIKJHHIIJJIGHKOU[\VNKJIIHHGvUJKB^}]JY^SJKKJIFQt|m^ZXYU`}ylbYTRQNIKOUXTVP|>qЍNW^YPP}fOWSXe|gNOW[USUPQPONNMMNTXYZZ[[\[UNLMKJTbdaYPیuVJNONNNNOMJKP[XWbc`\acUMKLNQUVVWWWVUTTSQNU]`jpdPMPSRQQQPPOQRRRRQRSSROIOaNCGHFFHNUVVVSQRQQQQZWPNJNTTUYZ[[^]\[RKJRjxhKZjPSUXSKQXXWSNGMPSWReoJLQQRRLIIIGHJJIIIKNOQW[[ZVNLKLLMOPPNKIJKIHIHEEJev\IOVWYXWUSSSRQPNLKJJJJPUQNJJJKJLbwroptsslc_\ZYWexvtw}s}~sW^rkeihefhrvrvzhelvyl`]]]]ZWWXUTSRRQQSSTVXUSSRRPONKGHJLMMOQQQQQQRRRRRPORSRPOMKKMOPQTWYZ[]]][ZXUTUUUTSRUSPSYYVWYZ\\[ZTLJJHFDB?99:=<9AHMU\P99Ymkgfgdgr}}lPCEB>IVYZ[MDHQUXYNEHRWL@BMWQ@<:=@EDCBA?@BFQ^a]XVM@:78==999:;<==:767;=?><:866436G749>ACDFIF?=EIIIHHHHFC=9<@>DNF7244224555518ILGDEDEC?;:DF?7AY`_^[SJD>;;9;@<2116EN>03:?FIB2*PgR:7@KQTZg^E500357CWbWR]e]PLIFHSP<7HOKE@<<==>?@DHID=97566667887889:99:=?>;78:<>AFKC4,,,.16>IOONQOKHA=CD7.4>CGGDCFH@=@>?IB@V_YVSRRPOQN?4//25?CGILMHB=4020/27640+)**2FTRQQB4-.6<72023555:CHHFB;52348AB>969>?9123541.7B=2242156?]dF/--06:;=;<;8>EDCAA?>;7@@@=:9889=BFKB::<::EJIUaP72110034442,)*,./-1EI59A6.1..36::6;ABC7-.15:A@1/2566631/-5841/1440.,*)1?>30/--./379::@EE@;?IUUA:C@2/21-*(&(4;88730.-,*,4:831211/*,0;CA@AD;1-9V9!,BC28ZaL=3,/555<=GLA--@STD>;>DEDNMLLOPOMRVVWWRJJJJAAGJOUSHATfc_fjjmrzkG?FHGLROOPMLLLKLMKJLOPIDADSTA;9=@CBAB@??BEO]a][YM?:668::;<=<;;9755689;;86644468@8:;DHJIHGECA?;7;>:;A<544422124401=LS[^[WSNE==AB?60>\lklgR>8:=>>>8653;AF@64:?=::50XYD>20:ITW\[OEA6045537K\ceaVIFEDHLOFAIOJA;<=?@BCDCBA=977556656:;998:;:8:=??;5;FOSY^cbM3-038>HOPQRMD??<8BMC57@DA?>>CHC?A@>BEM[^[]\WSQPPH;53205>?@A@@;=?96::34751.,-,,@??@A@?ACFGHGGD<>CCBBB:3<=;961/20/23//47989::99:9@=9>HKJIIHDC>5/3:;=@ACJJA<9/&),1?NYWTL<08?73=D?:8641,+,-17=DB;65542-+.5::8864349??BNQOME835678;>@>;99877:95110..033322699988888988756:<<;;715545565552345412352-,//=B53553458<=?DGFEDEE@CVO7?F6169<=:8==<><974310/-.0:@6-,.0/-18AFFE??5*0>H/#(:E<9IK7.-./0..6<<<<<93201BH5(,5:CNNNNNMNPOOOMMLLNPONMLMNOOPRSRRTTSQQONORTTSQNMONMOQTX\\YSMSab[bg\RRTOHHIIJJJHJOSVUSQORUURNLMNLKKKLOSTOJGHILMKIGGHHHGHHKNNLMMMNOPRSRQONIEEFEGHHIIJHFEFFFHIJLMLMKIIIIJKLLKLLKKJIJJGGOV]chjigeeda__chbVLKMNLKJKLLMMNMMMMNNOQRTSTVWVUSRPNNPPQSVWWVW]``_^``_]\YTQNNVYZ]dhhhnutrtssrojguiilfea^`_^_^`n|||vgeddegiiigfedb``\X]`ccdfcbehhix{zn\^YU[^ajqnmidflmljklpmiovyzxmfhfektz|yaTUVVUUWXYYYYYYZZYWZfz~vuytoxcafhf`]bffkxya_pjhiicbcPHNRU[^]WY]YY]`bcflneWWRHJHIONJJGN[WJFGGHIJMKFEEFFFFGIJJJIIHMT]gqr^LKLJIIHHHIIHIIJOSSNPQNLLMMPUGMVLGJSIIIJOKJLMMKHVm|{nXOMSgsu}{maXSQOMLILPTPGWeXUXXgaOJKLR_mrjUNHG@Jf”\[]dXPPWVSQPQQRRSSSSOJKKLJI[rncphELKLLMQRROLKMQUW]iqXMUXZgiNIJRUVUUVVWWUTTPS\`[VUJIQQPRSRSRPONPRSSSRRQNUTQPBCEDFHGEFNSUUSRRSWY[LV[JEPQLKS\^^`_SRQHMY]^]TIKHBPYWSNKKN\eWNV\VUVUc^NNQRUSJFFHHIJLMPOT\de_[]XNKLMNMLMMMJKRYYYYXaxv`MWsymd`ZVTRQONNPPQQPPTWVTOMLLIozv{|~}zpdcbba{|uwzztx~ype]]tzgggnfk{ssxzxtoptztqh^]aa``^YUUWWYWTQTXXXXWRSVTQNNLJHHLOOQSUURQQPPPQRQPSTTRPMKLNOQSTWYY[ZZZ[YXUSUWWUUTSQPSYYWXYZZ[[[\TONKHGGC?=;=>?@;GHB8ALKHFEDDDEIKJQ\WJOW\grqqtrunOOXYTPPMLMMNMMMJHFHJMROH@DUTA78:>@BBCB@@AEN\`[YWJ=999=>???><;;98655689965445568?9<==BGFFIJE?BHJIFDA?>>859@=8535433113333218?CKPTNJID<=???=;>\sicc]L=567;;8>=7=@C?8589636;8[m\D9403?NSVZNDFE;2421/4M_b]WRRPJKNQOFDLNH?::>ACCCDB>:;;98777867>A?:9=>;9;>??:5@OXXXXY\M57@ABGKIA;>:65322=IIA@BB>;<@FHGCB@:;IW__]_`[VUQF:6663.18:;<;:6:A<7::54651////3FOMJ?45668:875321124:BC>9400356>GE;55534455655:?6/231004==@DGHECB?;?FGD?<42>?>;7332/,,.0/5<:785223511:@96:7/)+,?ZbXKD@=>=9;CILKJIFCA936<=<;;8BKF87;:88862-*')/38B?1,..+*(',4:964431.1=@?JPNIA9;:88:?DD>;99999;9764100/0/.06988866678:=;:9:=CF?:A@:<68MYTKFB;40257774..3;?ADD;13201117>7118P[]ZXYSA;9865444445479754699766448?E=3676668::79BFFMQNQPGFD>B>4:BCMSJDKNIB:56887-).85:D:-**)-,9?CDHJ@?3#';A-).15::95+(+.//-,4:<<;;7463076)'.16EONNNMMMNNNONLJLOOMKKMNNOOOQSRPPNONNNNMMOPPPNLMNNOPPRSRPLFIW\UV__UMNNIGHJJJKMLLORSRQOPSUSOLKKJIJKKNQTUQLFGJKKJHFFFFFFDGJNMKMPOOORTTRTSMHDEFFHHHIHGFDDEEFHIJKKKKJIIIJLLLLLLMLLKLNNT]a`cifdbcgdaaabehf^TNLMNLKKKLLLLLMLLLMONNOQSSUWZ\[YTQPPRTRRSRX[[]_befddda\UPOTXZ^gd^blporttuttrxqqzpfecbekrw|~yxvwtvqe^aacilmmljhebb^XX^^[\agikkhjomu|}{gVe}znd]afkkkiddkjgfinqqpqs{rihhfgn{i[YXVUSTSSUX\][XXYYSXgx~uuyuwtihgge^]aefhitlbmnlme__\URSRSX\^]\]]^abdfgggg`c\GDHINMJJHGTXLFGGHIIJIHGGFGFFGHJJJJIJLXflx{fNKKIIIIHIIIIIIIJKKJMNPSPRQONVkgKEHHIIIIILPMMOMKPermhg_TOVdfn}sjaWSPMLJIMOUXNKOR[\[nRNLKMMP\nt]IQNIISxwvUSSUSPNLMNMNNHHJLCCsiTblQFKMOOMNQVXURRTVX\ty`TWWZevcKJQVWUUUVUTUUTQZmsiXMFHKPPQSRTSQONPRSSRQRRS\VQPKHECFGIECKSWVSQRQQTXNIIAENNJIR\_^ZZNJJIRXWVURJCCAJTZZZWRJWm`Z`_WSRSSQKJNQSOJHHIJLMNOPRY]]^]\[UMLMONLJKKIGINSWYU]wjajzzrkea\WUSSRQQPQRRQPSUUUSQONT{{pfgg`wwwvwrruhdg^\rvhggbj|wy}|xurusxynd]\ada``^XWWVVWUSPVY[ZURRTUTQNLKIGJNOPRUWUSRQPPPPPOSUTTROMMOPRSTVYZZ[[[[ZXWUTUWWVWTQPQUYYWVWY[\]^_TJGGHGEC@=;<<<=@ABBBBAAA=;<<=?B;5799997767569>:<<;@HHHIHA=BHIIFB?=?>75:A@9323342/3=?:7977:507B@@A@<;>CEBFQ`fTFN`aPA54969DA?BCCC<79:86897Qs`A?;4..8FRSFHIFD@602204H`fd^RPTRNOQRN?>LOGA:9=ADB@?><:=?=;:9:;;=CHB9:=>;:;<==74@LHDB?>>51BTVUVVO@821/02325?HF@?AAABEHHGCAA<;IZ_\[[ZYVQG;44444//25998759C>421/122100-/>JJHE=;<8787555520/,-5>=97521266;HIA;9643577765>7-03/2724==@G>/,/.-/1137::89?CA?:8876;HD=GF;4:8673/23.,-034;@;6641234436::8972,++8QbZG@>;8889:=><;953>DOegK+->IQY\WJ?DIMOHC=9;;950+,-.025:7)&**'&'(067632790+,372;FB><:<:76:?BA<<<<=>@=88853221/-+,3:<:897557<@?@?EOKDDEII=614?LSOLHC>525:=<814:@BDDA=9974459><0.1.5DP[__UC==;989;94379?FIF9269::7569=B?;86557:;:98=CCDEELN>369736FI==CA<;<<:1.7984/),769C:/*(%'1@A;IM2!0;70414@=7620/./.,.5:=<<;;85466-(/55;GPPNOOONOPOOONMNONLMMLMNPQOOQQQPPPONNNNNNNPPMLMLMONMLKLKKJIMROJMXXOJKKHHJJIKNMLNOPPQPQSUTQNLJKKJKMMPRTVRMJKJJJJIGFGGEEEFJJHIORQORVVVWVTRKFFGHHIIIGEDDEEEGHHHGHIHGGGJLMLLKKLMMLLS\_YY\`a`bdegfgijjggkmh^TMLMMKKLLLKKLLLLLMLLMNPQSVY]_^]\YWWVSSSRSSUW[`egggggdb[OMY]]jh[Yaedgopppqrqp~{sy|voq|~ujedddgigca^]irnmrtqmhcba]\_`[Z]fknqkefbajja\hyr]UXig\beghjiechlgadqtqqnpy~xurjcdnw|`[XWUVVTSQRTWXWWXYZWW`nx{qw}tsxyq|zrojgfd`bbcdddhgclqnn_VVX[ZWTSTX\b`^ehhgimmifghg`SJHIKKKKJFNUMGGHHHHIIGDFGHGGFFIJJIKHMtn]m|kPMKHIIHGGHIIIIIIIHIIKJLNRRRV`cYNKJHHIIHHPXPKNOMMUVYfndWQS[acp}|qg_VROMLKJLNOSQNNY_\\R~HPMJLNNvpT`YSVZV\ZnÂPKTTROMMMMLLLNRJZɒ^U_\LMTSRQNMQTX_faYXXX]st]TVXZaxnPHQUUUUVXX\]]XPZlvwlYWa_ULPSQTRNKKMSSTSRPR\cXQONLHFEDGFBFSYURRQLIGHHEEDHKLGEP^_[USNKILOORQLGFDA@MTVZadcRHZkmkeXPPPLIFHKMNLKJIIJMPPPPQW[ZZ[[XTPOOONLJJKIIIJLOUV]vsomwyqkhc^[XUUVWURPPPQRSTVUVUTPMcyqljgryzz{to{vd`gq`]pplidoy}{wvw~vvnd]\_ab__`\WWXVTSRQRWXZXRQSTTROMKJKJOQPPTUVTSRQQRPPOQUVUSPNMMPQSUWY[][[]\[XWWUTVWXYXROQUWXXUSUVY[]^aUDBEHFBB@=;:99:==@DDCBBA=>A@C@IKNQQRVZZWUXSKOTTSRQPPKIIKLLHEB=FOE;?EEGi{k`XQQTTTRQICGORUYUJ@?DEJVZRSPB:;<<;9;<@FH@:::<>>;;:75HKIGD:;CFGEB@=>?=75:A@95555443??=>:57AGHEAACFMQGCQZOC;I^^PD76;8>GFHIJIH>69<99:::AD632336;FOQPHBEGHJA229>AHZbd]JGMPUWTNH>ANLDB@?ADFEEDCA??@?>=;BFHIHHFB@BDDHRXVVWVXSD:7543341/2466785:E=4,+,02222215FNHDCAAB@:963666431-*/7:865432545?B<:9645799:;=@8452.5:3377BF8,-31/0124<<:::A=E]h]=2ELJUZRDAJLHOVSD9==52-(.842640.)())')++/0/.-.78.+02423624::98658<>;:<>?@AB@?:656553220/2:=;897636<@>;58U[VZYTOF8/27?PPIEBCA=>>??;:<>@?@@CFGE>767;83325?<2Eag_RGEJJC??CD958=BJQNC832981/.03>EA>AC@?AEHJGA@BCA:781%%-1/2?=-#%6HB52/*+6:40/-.569?914><(0H>DD33@;:9:=;555651/.,/48:9::=92164+*0458@RQPSTSSRRQPOPPPOMLMMLLOPQPOOPSRRQOONNNNNNOOMMMLMOPNLKLLKKKKMLGIPTNKKJHHIIIJLMLNOOOPRRTWWVRPNMKJJMMNORUWUQNMLLLLJIJHFFDEFECFLQPORXYYXWX\XMHGGHHIHGGFEEEFGHHHGFFFEFGHJKKJJJKMMJNY]UQW][Y^cefhhjllljjllmleYLJNNKKLLKKKKKLLLLLMMNOQSUZ[Z[\[ZZWSSSRSSTTUY]][[\\]`[SLXeaku`X\ZZ\gqpdadhle]hngn}zyuh``]ajnkdaa__mvpqz|yrjdced`^^\]`lppnja^`ZTU_^a^^]\ZZajf]]bbbehgecempedqysrrswvffowmUY[VUVWVUSTUWVVVVZZUW]go|}mp~|qpymj~zrrjfca`bcbceecbcirqoaUUXYYVTSUW\`ZZehfflrtqjehhcTKIJJJJJJHLQLIHGGHGHJHJKKKKIKIHFJJICYgT\mpYPLHHHHFFHIIIIIIHIHHGILPLOWVSNMPSLHMMLHJTXRSSTSOKGGXhaXVUZ_ckuvnf]UQPMLKJKMLPTRQX`Z^\abHOLIJJIjuvYl{j[XURRFlǻsNTUSSRONLLMOQNZԍ][Y[YQUbc`WMJPU[cmj]ZZZb{sXSVYY[pmPHSVUUUVY`egm]MWeivzpksjUJQSQSOLIILTTTTSPP_i^QNNOMKLLNNJBRXTRROKGFGGHJKLJIFET`^ZXVRPSVUX_[KBED@G[c__flk^IIgzwjTLNKIGEGJKKKJJIIKORQPPPV[ZZ[ZXURPPONNLLMLJKLMMQVZezzsmkxwpja[ZXWWX[XRPOOPTXXVUUTUROqztroq{y|~swqhdhjjcimmjep|{xwv|tld^_`a`____[WWXWUSTUXWVVUSSSSRPNLJJLNSSRTVTSRRPOPQQPPTUVURONNOPRUWXY[]\\\YYYXVUUVWXYURQRTVVWUSSTX[]^aUA@FIHEDB?=:9:;>?@BCDDDB=>?@E=BLNQQSXYVTSTNFNWSXVMNRNKKMNJDA@;ERHACBIXnlfsk[OMSTSTSQLABEILQNC>@FMYd]C>D><<::9:BHEC@AKX\SNOA>??===<<<:8:;>ACB><:=B@<=;8;FJE<989>EJGE?8=DFFA??>>?=64:A@;865579>HROJBBCAAA@ACIKICFLNQRJGML??EW]VF87:=?ADFGHIGD=7368:;=@A86=>>?GIJLIDDEFQ[c\H=@D=9JPPTKFNVVVTNIEMSI@CDCEHIJLLHDAAA@@?>>@CIJ@55:<=<;:9842;E>768:9:67Nd_LKXR=@LG@>CC@>@DGC;?;863/.572323B>4-06756534>A83:C><:GH><>;84>QD*(7@?GOJA8132114975555322365:DI=8=<4269AMTYXTNHDBB?=><:;AEA:8L[VC6DLDJUOCAGJHJWVDABB@@:65653224522786456879;>;2*3Qcf_PMQN@3//0@OHB?DA=@?=<:==;<<<=@GLG9444521678CM;7Ui_[VNQPLDILF936;?EIGJLJC3+,+)*4GSRSXWLCDJMO[XA8APRJE>3+-/+,,,-48BVM4*.//26420./236:97>SX<+KRRRFEQah_C7ABFC;7613011/1/-,.0243333/*+-,)*-1417TTUXYXWVUUSQRSQOLLKKKMOPPPPOOQSQOOONNMNNNMNNNNMMNPOMKJKJIJKLKJJKLMMKJIHHIIIKMMMOOOOQSTUXXURPNKJJLNNOQUWYXSQPNNNNMMKGDDCCCDGIIJMORSTTQSXXQIFGFGHHGHHFDDEFHIJJHGGGFFGGHIJJJKMLJR[QKU]YRT\bfhjkllmlmmmlllnk`SMLLKLLKKLLKLLLMMMMLMORSTVVVWVWWUSSSSSSRRQRUWWWYYXWWVUX_cdqtcZYYYakuma`bb]\^a^l{qgfjnuxnbabbbbmvsy{xuoeafga]\]akyypeimjf_Z]aidbcc_\WWVX[\__aceeedcn|smquns{wu|ypjpwxqi^``[XWUVVUUWXVTTSUUUWZ^eotlbo~zuz|cg{wqjca__abbcffedbftsn[TYXWXVTRUWY^TXfgdemuwvre^\\PJJKJIJKLILLLLJGFGGGKQ[ZRLMUWKFHPSOLYfXQLXl]QKHFFGFFFGHIIJLNMLNQTSPLflVLKLMWNGNOLHLVVSUWVXQJPLK^^YXWX^bhlnle[TQPNLKJJLJNVVPR^adoeWPMMKIIKHSsY{eUWksf]YMLIQfXXWUUTPMKKORKGU]\UROKNWiq`MHIPasl_Z[]]iYQWYYXgmRKTVUUVPTX[abWTZUTevunn`KJPPQPNLJIKTVTVSPOP`cRMPRRRSY^`]QQVTSRNJHHIKVRKJHFDEW^ZeqaYPU_]ch`PFGCBNdnninrmi]Vgyn`]WNHMGFHIIIIIIHHJNRRPONU[Z[[YXVSRQPOONOONKMNNKNTY_hpxxpgdvaVXYWX[]YSONNPV[YWUSRXQU{vpr{}|yq}ydkrjehlqlfar|zvwwx{{jda_aa__]]]][WWXVUTUX[YUSSTUTRPOMKJKNRSUVXVSRRRQOOPPQRTUUTQPPPOQTWYYZ\]^]\XWYXVUUVXYYTRTTTVUUVRQRW\^`cW@?HKLLKE??@?A@@@ABEHGFB<<>@E==MMOPSZ[XUSSLJUWQ\ha[VPLLNOE>??9DSMGGANnrkQPjqkg`VUTTSRRMFB@BDA8=JOU^g\>58::99777CLGC@AJW\RF@<>A?=<<;:;88:<<>@EE?99:<>ACDC=>=;64:A>>;4358>EKRRMFEFDCEFEEFFD==A??@DE@95;>?@@@BBBA@>>8007<>ACC@ABCBABGPPKGEIQbmnnkZA717LOL\`[\[WRRRQQXYI>ACDILKKKJGCBCBA@@@?>@B<1.29::;<<<823:<4468:9:68NaP9DSG7:CDBAFIB=CKLKFBFHHIHCABBFFA?>BILLKLB:76566688676656779=87669<<;;:878BJFCB@><;62587878887532455555436=;3012554468:<;73220/476413:75469:987=><;514:9APSSSQRODFC>>???AD>647HO;.7B?@HNI;067./38853333458865:;5:B8/087@R\__`\TGAB@=><;;>@@;2:MOA67CBGPLEACJIGKKC@A?:80(/5506920221.-/20.../3541/00-..-06>=;754444464/6:86310.001123430/27;>=:>90,-D`dQADFB@7-*(-?I?6>?349<;;<<::9:<=?D=2003774367:LVAH`chg[POKFHOD6238>BBFWcd]J93101?Udghh`QGFIMS[VD:?E>;KNPPSX\]VTTPRVWSYnxui]TOOKFC>;7CLGIKCAZTCdPObmsoeXTRTVRSQJECDDB>@LUX^^Q=689:88678DMIB@AIW]RB9;?@=<::::;:>==<=>DE>?CA>>@ACJI?67:>><=?@A<;=CDCCA?<:<:539?A@9337==<>=;;<92269=ACCCCDDCB@G[d_XUSWgspr}lA23=XWUfnfc]XRQSWZ^ZH=?CFLONKIGFDDEDBBBB?;:<8/.3788;<=;822321368:9942FXF3@J>3357:?FKD=ENMGFIKHE@:5>GC??98;?GJHH?>:87677898766667788:679<>=<<<;877>HFC@><963/38:887775433555555545?D9//146446798875553129<4,.35789;<:9:DG973//-8M__YXUTTNFA98989;=<:87;10EK?64=BCMKD@>GGCCEFEEA;8/*.36248435530.//0003335431/011223;@>;865543342-259;507;;9:888889;;93.007?@81/10I]EEZeieWNMJEFKA4026<@@E[filiaF<::;@60///.034200/01476=K\[JCFEDR`aQTY:1ITD200/02.38632210.,,--)&%&&'()))/30,UUVVVVVWWVUTSQOMLLKLMPQQQQQQQPQQOMNNNONMNNNNONMMMOOOMLLLNLLMKJKKKKLKJIHHHHIIKLMNPPPRUTTUVUSQOMKKLLLOQRTUUVUSPRRRRSSQNJGFEDECBCDDDEGGFGEEHIFEEFGKLLLKHFDDHIIHHGFGGFFEEGHIIIJJJKJLPQNLMPW_fijmmmmmnnmllllmprsngZROKLIIJLLLMMMLKLMNOOQQQRUTSQRSUUUUUSRQRTUUVYZZXXVZWX]`\_\\]]fuyqd]^`_T[ik_Y]\XZgsoibkyuc]^^_aaa_enpqrlp{{qf_\]\[\_gpux~|}ulhfdcdabzw_[[[arwkeegeeeiz|vjvzwzzc_jou{zvokmtunf`XWUUVVZ\[]ba`^^```bcbeqz{yne``]\l~ud_aa___^^_`ahoqmdqr_\ZXb]RRSSTX[^YVdichqxxvx}eMHKJHHHHJIHJJJJJIHHKKIMLLTYZYZRMPYYUSPQLHIEFSTIFFFFEFFFFGLVZYXVQPOQNWfaRPRKEN]PDEFEGPVSOOQPOLGTa_^_YUSSSW]`b`]WROMLJJIIJIOY]SIUu~wp[MONLKJJIHHHuiKNPSfcILKKFKITѿ[][XWVTQOMNNnYS]]]X\\YWTLMd}ycQNhfNWZ\]huXSWY[\cgMMWTWTMNRSMLNQTRNPYddTWOFKSRPLQ[^^STUSUUROEFNRMKJJLNMQ]dg_TRRQLKKJJHES^XPNIIW^ZbelxbMSQLLNPQJCFQS`ruofbgnbVVSQMVibJFIIIHJJIIJLPQRSRRSVYYZZYXVUSRRQQQSSPLLMMNPRUY`a]Z_flmicaZNTXXTSUZWNLMMOSXWUTQPNJr|z}}zuxlku}tefmmf`i{}x{ywyutnida`^[Y\a]UXWWWUVVWXWWVTTTVUTSPONMLKMPSUVVVUTRRQPPPQQRSTTSQPQRSTUWXXXY[]\YVVWYXVUVVUTTRRTTTVVWVRPRW\\^ccTILRRPQLDEILLKHFFGHKHGB<<=@EA88BLNUZO<<9>MlgY_]\__[VSPR[QNRNHGJMPJDJV[VKE<678989879BLJCABHX_RA:=>>;:989:>BFB;9<@MPE:9:9:AHJIA956;B@<<>??<9>?AA@DKQPHDDFFGC?>>=821358:>BB@B;4?DDGOEA@?><;86<>>:99;8539>@ACCCCBBBEUde_\XWamljl_?,.Gc`Zloed_\VOQX]_VB8=EINPNKHGGGFEEDDDDCA>><746667:<:742201468:;;;60:G?6<;3/.--0:FJFCHLJEFLMJA6/7ITNC9129@GJHFA>=<;9:;;;97776678::7558><98999776;GID=9<70/.059984564245543444444?1()/78;<:<;:AKG963,)4J[]\\ZXRJ@;=?;;=<>CFGHHEDECBJLA67<921000234218500/-/356447,+/4865>M[egee`OBAC@=>>>>>;3.:D>9658>GGA=;??>=;::98742/+,4:>;422110//000/015731025<;84200.);B?A=999307<<>CA:867::9867568::;=>:/*,3>CE@5.',K[LIOSV]UKMJDC:72.38;@ADPT_vQEYMMY[Z^^[UGFGA;AC;8==8;CP\O408CI<.*.5526748:0.2233.'+/269CVcV=269;AHC546-7QH0(*../3;AA;6222344341)&%&&'&'().10*UUUTTUVVWXWUTRQPMLKKMPQQPQPPOQRQONNNNONMNNNNONMMNNOOOONNONMMKJJJKKLKKJIIHHIHJLLMPPQTTTVWWWTROMLKKLLMOQSSSSTSRRTUUUUUTQNLHDBBBBBACEEEEEEEGGGGGHJLMMNNOMLJHGKLKJIGFFFFEGHGHIIJJIJLNMKKKOTV[dgggjmonnmllllnnoqstpmh\NHHILLLMMMLKKLLLLNNNOQRPNOSVWWWWUSRQRSTUX[\^]]]WUY^\[]_`_dkmmjb`bb_\WRW][\\XWcg_c~sc]^^_ccb_`cb_fnmpvvne_\[[Z[]^dlswy{~wqrlhhhr}wf][[]bb_bhiefgkyyxw~b]gjormggjlmpttupdZVTV_fhinrlihffdbchifju||yp`]\X`ohY\_`^_^^^^]]cutli^S_`VidQQTX[YZ^\U`kdjwzxvw|nOFKJFFFILKKKIHIHHIJNT[ZUIJPTZVNORRSWWOHGGGFHMSKDDEEEDEFDGWa[Y\WSRTRLis[PJEFR]TFHNOPUVROOQOJGFN\b`\WRPOOQWZ\[YUPNLKJIHHIIP\^XLJ^t|yeQOOLJJJIJLGWXLKKHIm|FLMLKLJAf^^\ZXVQQONJeS`_^]\`bb_VOeia]\UTUX\]gyiWUWY^_e\HSXVWQIIMOLKOPMJJLN\\GFIHJRRLFPX[cVTTSUWTPKKORNGFEFGFGMRVVSQRPKLMLJHAH[gfd^ZWWX]eq|tXGDEJPTUQFFY_^iocYVZ_WLRZaaYZ\IGIIIHJJIIMQTTTTTUUWXYZZYXWVTTTSSSSQNMLLMPRTSTVUQMPbnhWQMGKTXTOORVQKJLMOUWUSSPMLM~|}~}}|fgy{omuxwkcoy{z{yqhhqsleb`][Y]]WTWWWWUWWWWXVRRTUXVTRONMMMMOQTUUUUTTRRPOQQRRRRSSSSRQSUWWWWWXY[][VTVXYXVUVVSQQRSTTUVXYVQPRW\]`efWHJPPQRNHGHIJMMKJJHGFEB>=?AEB?BQOOJJNRWXYXSIM\aL?G[lk`WXWJ<9:HZace]I<<>==97789:AFEBBO^kx~^:4748CJIF?:66;CC@=>@@><>BBBBB<9::8::7;DGJNNJDACKQLDBEGHJC86873159=BCACFKN<,ATKAEHGDA@>:78>A?86:=;515;=>ACCBCCB@AGOSTQPT[[[VOA02YpfcsscXYb[LJU`]O=7>GMRRMJIGGGGDCDDDDFHGA><;:8889<;502444678:<<=<9;=;992....--4AFDHPMIJLMLJB20L`^]U?--6CKGECBAABA?>@A>:7888789<;643465357777747ELFA?>=:83,/3:910574244444333557:960.2:>@?;657<=>>:37A<0+-495./499;DI?893*/J\^Y[\XQH=319A@BLNOTVTTTSLDAENPC42784.0222110022.-,+,142244..285313@R]b^]\PEBCB?AA?>><515;<<:316@@=<<;;9852/4416636668:50--.-0364/+-/0111/004=>>????==:5/,((-00/-////0//--../015741..3861..//.9<776773/7=>DCDCB:25;<952368:;>DGIMLC>>CEFE:-&9VWSPFBFUOL^OC@./0,499?BBHALwZAc[JVYV_]WXD/497==42:?938<<<;988:;;>==@BBEIJC?<99<>:;CLPUQHBBDHJECHLMJG<23667;CB@@@?ABM[F,B^VFDGLONKF@?EKJF95775312689:=ABABCC@?CJNNSZZTOMLH:Glqh\_hZCBV_XORVPE@DIKNQQMIGDCCDDCDEFEFGE>;;=<::;<<<4//4:;85568:=?A>;?=3./-.110/7AHPTKDINNJFB51MbdeaN5.5@IA8?FFDCEEBCEEB>;:988787633323457777766@LMOONNOND:88:=958==96634432235654686:IRPD>:87;=<<848?9106;=7/,-/03894470*=[^YXXSNID?<==@DHOSRQPNMJIKHAAMOB42563121232010-+,././23.,483/363,+-7FLQUVVPICBBAA?>==:415:>?>9359;:;;;:66FM>.1:60693553578::6,*++,.8;4/-.01111/015=?BGFC><<7-*,)))()*,//1011.**+,-,+,011/-.03410/13530,+1401889>@DDC?:8568529?=98=KSOS_YPFDFFD8-+ASTNB;?>HPVgT?;40.+4?==BHNA8djAYUCZ\PZ^V^\?15721,+,-(,?L?1155:;<7478625675,(''+4=:0-,(,59656:94,&####$&(**(),,SSTTTTTTUVWVTTUPMMMOPPPPPPPONPQQQPOOQPQQPNNOOOMLMOPNLNOONPNLLLKKKJJJIIHGGHHGHHJLLNQSUXZZ[\[SONMLKIJKMNORRSTUVVUTVVXXYVSRSQLGBBCDDEFFGHFFFFGHHHIKLLNOQSRSWXTRQPONJIGFEEEFEFGGHJJLLMLKMNMOW]\\cllmlj][a_`immnqssuuuwwxvl]SMKKJIIKLLMNNNNOTZYTTXZ[\\ZYZYVTUUUV\cecfea^[WWXY\__``aceddca^^^^]]_^Zboml|rggdcdddcacaeqskhjkhinj^XYYZ_jsvupt}ye``mzq_WZXYejervmopploz}}~pabda^``^ahnommoqiYSdwskmnmmkecb_nrigghiklmqtgdfmtj^Y[^]^_^^^`_Xd~lQVZUVac`gdea\drbScd[jVU[qzqnwtTMNJHHGJIFSf]JGIHFHMY_VJHJSWVWZQECLRKEFFEGJHFNVIBDDCCEEF?VomjhegfZiiLEHGFGIV^]_]WSRVY]`\WPHGFO]]VSPMLKLOQSSSQNLKKJHHHGIKMMLKJIKXgngWLMMKJJIHIIJLKJJJHEIKLLLLMLFLmlPPPUYQ_@OU]cgheachacϥh\\\[\\`oqaWWX\]\cfmeV\LIMKJJJIHHIFBJQU`NBHQJOPHCIJLQTTNSSVUNGHMONLKJLMGEEDBBJSRKJNTTPHNRT\fnxw_PWZeviY]WPRVQ\mjTJ\lla[ZRHUwvXIHW|YGGHGGHGGGHKPRRRSUXXWUVWVVVTRQPPPQRQMNOONLNUTNMMMNPTWWY[]XOKOQNKKMPPNKKKKNQOQRPNFbxppx}mk~whgz{~|qfgs|nfcbca]ZYWWVWWUUVUVWYVUWXXVSQQQPNMNOQQRSUUUUTSRQQORSUUSQSSSTTUTUUUUWXYYZWWWVUTRTTUVVQNPRTUWWWWWSQJPX\^`bf_NLSTQQOKHDBDHNPPNLGDBAAAB@ACEDGH?=DOXUVUMJPSSU[b`M=P_U?:::9A\gca_`XD:BPVYYZZZZYXTSQPONEDVXOKNRVPKC;:<=><9888;?>97@?BINPQMD>@DGCBHNNKD=7458>ABFF@;8897>VSCI[WJFHKQRNJFEHMON@6553112579:=?@@ACEGJMNLR`jg^SLGE<`mYUD=IF60@T^XPG??BA?<50.18;721228?@?<:=;1//-.010.6ERWPB;>LPGA?;:@L\c]O=469;968CEDEGGCCEGHG@<99765676338;9779;:975=KPSTSRTVQMGB?BFDAACC>94232024579526@O^]J>??<69<;866:;834:@?==6,)+/34334,&@Z\WSMFBA?>AGEBEFC@><97899>DB>DJA413543222233451,.133343/.783142*+-/36@FLSUQIDBBA?=>>=9438>@?A>:988889::65@?0(.3-+8<453149;<<;1*,-/2651-/0010245557<@FJHB::<4()0/+))*-/123565-(',,,-/./0/.,,+0632563.*.0/3566769=??@BFG=129717>>5.6IUPP^YK?AB=91-.:FD?9278@WefL<9742.6C@;AJI91KulTK9.H[QU_W[e`SD>Ne`>17:81,*-BVB4EFCMH766/,)7^}rL766:6.',FL;,-67:=<:998646785/*))+.20/12048987::51+$$%%%%%(+*(),-SSSTSSTTTTUUTTUQNPQQPPPPPPPPOPQQPOOOOOPPONNOONMLMOQOLLMMMNMLLKKKJIHHFGHGGGGFGIJJKMOQTXZZ[^]XRPOMJKJKNPQRRSUVUVUSSTV[_^XTSSRNKGEDEEFFFGGFGFFFFHJKKLMNOPQUXTOOPPPNLLJHFFFFEFGFGIJKKMMLKMPQTUTWdmi`[UPT[WT_ffglprrtvyzxvvvo`RMLKJJLLLMNNOQSTWXWWWWWYZ]^\XVTTTTU]ddehhfd\X[[dj^Z`bbccbba`bdeedegegjidpxmkmecbaabcaabjoollnlmrm_YY[_dfcmukgp{~~cY]ii`ZZZ[jwn_o|qpoehnjoy{}sha\cssgabbbbdfgmwupv}yl[Viskfikkkjgbcmujfgggiijkllgdegihfc``_`b`^^adcnjMS_`\^c]`\bd`Y]ZS`jbvfc[^~lsuTJMJHJHHJGKX\LHJHGIJNLGGHNZjli[LDITQGDEDEEEDFIXNDFECEFF@L{wjnllie]?EKKKIJZc_dbUQPQU[[VNIGGGELXZWROMKIKMNPQRPMKJKJHHHGHJKLMNMKIMU\`VLLMKKKJHHJKLLLKKLJIKKLLMMOIMtglWY^On߻BMOR[dmpla[YRSädZda`_^h||eYYZ\][bkr[kjBELKKJJIFFJGGOTXaMDLSNKNLEINMOXTNUTUVQIGKNOMLKIGDDFGDELQQIDLTVRPRUUU]pwiRMZ]cn`RVWZ]]QRadWOZoubSRRFLs}ZHFJufLIHHFFGGGHKOQRRSUXZXTQPRRQNMLMMNOPNMOPONHKSSLLMMNORVWY\`XNKKONMLNONOXbd`ZSNOQSOLsju~ofvtgg~~q{{pkirqeabbc`]Y[[WVVVUVVUVYYVVXXWVSQQPOMMOOPPQSTUTTSRRRQQTUVUUTTSUVVVVUUUWY[[XVVXWTSRSSUUVTOOPQVYXYYWWTOGQ[\[^^a_SMONMNMIFDDCEHLOOLFBCABBCA=@EDGG>@NYWIFMOKMOMLOXYL7COSUWZZZ[[YXVTRSVK=FPQQRSSOKGBBB@?>:8779@A;7=DBAEEFOORMA=99::75=LWfuwy{~mC2767:>EGA96652;HI?78?B?<87:=BA98;98>AAHOONNKB9;=>:40474?RSPTQIHHGLPMJJJIHKK>6893002468;=>?@AEHKNSSP\lolqoWB:Ctd;>937:526@JPJDA;7DWYSNLIEA@@?@ABDGFDDDC@=9:>BFFEC@=:887840.016<<9886421/-.01/2BOURE<7:JQC;=AE>CEDCDFHKF?;9876798219?:56:<;713;?BEHJKLMMNHECEIKGB<=>:621222358:506L^aR=;?@>:9<;97886779;<>BB8.++178633/*=QWQIB;999:=>A=4/-...368:;98BA7334678763455642344455544852260*2690.=FEEIIGDBAA@>=?=958;@@@AB><:99998;96:7-*,*)0<=65206=>=@B8,/2443//322100136667;?FJG=59=5.393-+*+.0456896.((/,,.1136521112218=<60*1?>8:87547?@@BFIKE;8:714;:.&/AOLO\O;29:3/,.0147::2264IgY8566654:BB?AG=2>IOQSUVWWXX[]ZWUYZOEFKOPMKMLILPNEA@>:8778?C=9>EEDJKJMLTPE?;::3:SpzlqvwrdPE?9579;EF;34635?JJB;?JKC;8:<::858;78?BAJOMLOI>7:@>AHKG@BILD75IKLKHIIEJPLHJLHDA?89@?720135558<>?CILJIQWXdplft{[;0MX08958<;:767>AFKA39LUUPLJD>=?@@@AEJGCDDCBBBDFIHGGEDDEFHD@;84214666676200/..01.9OVOE=:8?LJ<8:=>96771-155546898856:>AB@CEHGA=::8867523577557:9/+14/.6?BBBBCBBABCEFD@;434421344469734@U`WD5:?@?>===<;9538;?>9AG>3./135633<>9CNNHC?98;=>>>;738>8.+//+-454422;00=C=7??839?@@ABC>999:;::=>===830/2:=9443169>>913=?>;7/2@<384215:A@ABCDFJHC=769;3))/8GOSVF.)250-,,--/8:0-1608OA,-0247;<<<::;16N>7P^^B.*0@JNLO_YM_f_q}f=.63-.,--*7PO;26;BB82/,;\k]PHEGF>3&(CI96756;?@=;BCFFJW_`YVRHCILR]]SFACDFJMORY`d]afZA9979FNPRUTTTSSUYZVSVZWQPLMSSE;978ADDFFEKMB77=<8;CC@<@MRA67@DKMIITZbkibaooK32WwG5;89AAA?=<>@@DGEBBEJOPMLH?:>@@@AFMHCCCCCCCEHKJHHEDDFHLNKHFA712689;>>920/./11/7KUL>899=C=53322221-+/6754247778768;>><=;;:96312534:;9886.07/(+7?=;<<<=>>@BDC??>6//23344468:958GUVG85:>>>><979==@=7=@83/2@A5/0:FHDHLKEA?9789:<>A>56AB:793((253224:;:887758<<=<>?<989999764312/,,.,+5=;79>A=39GKGEDC@>>??:27AA>@DDB=:89:;<>?@@A>:89864213322/2;;>C7/1247>>81251.1.-3=@@@?>=E]S?Te\iv\5.9:41,*.1>SRDJ3)03446?C@>>;/)*,-///--,--..1,$%,.-/443011,'$$%%%)./-.16RRQQRQQQQQRUVVTRRSSRQPNNMLKGGJLMNMMMPPNMNMMOOLJIJMMMLMNNNMLNMMLLKKKJIIHHHHGHGHIHHHILNQQRTTRPMJKKJKMMNNOQSSSTTUVYXXXWY[\]]]\ZUNHJKHGFFGFFGFFEEFGIJJKKMNOOPRNGBCFIKKLPPONLJIHGGEFHGIKMOQRSVWXYYZZ[[\]XRLHHIKLKIJMOPONPQQRRQOMKKKKJKMNNPQSTTTRQQPPPOPPT[]^caZRQSUUSUVWXXXY[\\hnha]ZZ[cb``[WWY]`aafrzqe^^j|pca```^_bhnlqpkutmtvms{wvvvg\\ZXYXXTZuqZWZZVXwqegdemg^\ailkfn|sccknntx|wphcacefhgcn{ulcdkmkfd`eqyumppmklkifca`aa]]_a\abglklgb_[Y]um]QTa]TZVQ_e[]hnyx`UY[T˧ћURTMGEGIHFEHJLMONKKJIFNSRNIJz±bHNOZe]RIFGGFFFGF]hUMHEFFFFF>T|oqjDNFMRRHXxj`nhUJLOOQRQPJFEFGGJRTRPLKIGGHIJKLLKIHHHGGHGHHHJVveKHGIOQMKKLMLMKKJJIJJKKKKJIIJKKKLLKF~BNQ]\ROQG{POVVX[]__YSMGMh`ttbbdhmg^\_`aj\GPȖLCGHJKMMJGGHGHJFGHKHORPGS^SLPJVc[YUUXYXOJKHJKLJHCDHKJHFFFGNMLNT[TIHJNVVMEAReeefWMKLPYVFFXTPQ\eUGILPQRNEDFCG\WFBDHIHGGILKJKPONLIX^SPW]\Z^_[ONPOMKKNPOMKIIKJIJJKKLMMNPSTRNLPRSQNMLKKIGQl|ryn|vtz~oip~|ojx|se[Y\eg`]ZZ[\\ZXUSRRTVYWUWXWVUTQQPPPNLNPQRSSSSSRQRRQSTUVWXXXXVVWUTSVX\^^\[YWTUSRRRSTWYXVTSTY[ZWWYWTNJKR[\]ZZ[[Z`kihhkl\LPad``_YOJHOGCEGHFCFECGS[``^XVUTQPNOOKC?<<>DLMJOPNWQ?=:<78::ADEMSPIDHF<877?EB>?BFKKKLKIEHHC;35RpnOR[KQK>7:86?IC65679;=>??AEFA:6;CEFGHE>:::?DC?;?EA;5<@947===;:IJ9;;=ADFL?35863458:;=?AHLLKKIDBC?976:;<766312114541//5:962.6:<=?><;==:98:;;;<;;::9630139?=;==:9AA.*6=?==>><=>@ADDB?=?=437765446;<:7=KSL9026:=?>?>==<::;9;==9754330.,--.4;=;;==AC6;JKHFECA>>??=9=B=>CEDDC>:89<;;;;<<:9::6311244331223>F:/0159?@A>50/2233335;@EKD3,6E?3.2311//04357530-+-.//.-----6EIFC;9878?7/0..../2>FB=<====AGLLE;7854434567<=84211212353**),2322348;8:EE;43--5502DL@BF>78;;;;<<9EVK=Na\brV0,6984+-?@:433.**8E8,298621?J<./69:52478420*(+.////---./133+$)/122444211,'&-/*%)220035RRRRRRSSQQRUVVUSSSUURPOLJHHHHILMNMMNNONNNMMNNMJIJLLMMMNNNMMMLLKKKKKJJJIHIHHHHIIIHIJJLOQRUXWTMJKMLJLMMNPRSSSTWWWXYYYYYZZ\]\\^^XPKIGEFFFFFFFFFGFGIJKKJJKKMPONKHDCEFGJMNNNNMMLIGFFHIIKNQRRUWXZ\]^]\\]^`_ZTOLJJKKLNPRRRRQQQQQRQONLKLLNPPPSUUUUSRQPPQQPOMQZ`cbaXQRRRTWXWUVWVW\^_glf]^_chhhcYTV_jjc\`ruid_Wo~fbbbabbaajywvus~~jbaXh}{wxwfZ[YYYXYZV^nbWXZXTkzgegfgld[]`dddgkmihjqurtyoacf_[`hlhdk}{}}ukhlolhhmuz{xtttpmnmieedeee``cedggghwvfdca_i~rQSW[XRRSRVX^ceksvd[W\T|U{glofTJGHHHHKNOMKGJMLJDJWZZVWc_DPPSZXQMJIIHFHJLZ^LEDFKMLIFCCxu\sOEJWlzfL}chwmWDHNMOOMLIGFGGGINSRNLKIGFGIIIJKIHHHGGGGGHIJKQakwpOEIKPSMIJJJHHGGGHIJJJJKJIIIJJKLMLIIRHLOPPQQRM_xSQWYX[]^]SLKLFZc[hcdlti^^bbcjQFIh˜KFFFHJPOIFEEJMKDBCDGMPQENaWNVPUWSVSOSZZOEDEFFHIJDCGJKKJKKKNKIIQYTKLOQPRNGAMZ]_^[ZTOVYLFTe^\[[ZYXVQRUURJDDEFKKGDDGHECDHNMIHPVURLSWPPZ_[Y^a^SRROKHKNPONMKJKKKKLLLLMNOPQRPPNPRPPNNMMNNPeztmdo~sqw{ij{}wis~wdWX\cic[ZXYZ\[WUTRQPSUUUWYYYWTRQSRQOMNPRRSRSSTSSQRRRTTVWWXXWVVWUTSTUXZ[[YXWVTSRQRSVWYZXUSUVXXXWXWUQMKMU[\[YXXY[ZY\gprqaRYgeehif_YRLPX^^YSPPICIYZXVWWVW^\TSSG<=B?>AILF@F@=ViJ9;B=?@@?GPSX^`VLMOOOQUWZXTZ^`_]ZO==CCCJOOFFF=::=DIFEEEFGIKLLMMKID55UyjQR}mSA58DEEHF?7558:98878;==9549>AABB@<<>==??<;AD:25BF:2489>?>IF>@@<@D@@:58:722689FI?5433357899:;@FKKIPafT=:CLK=33666667;@AA@@ADFFBBEIKKMQNMMMMMNPLB;DRPC<<::?BDEGIIHGEBBBDFFGIGC806AILIII@2-/2433/3EJ?@@610/026<@@:12679;953>?BEGFECA?=<===<<;;;;:524BDFD><@DGFDBA>==98;;86556:;939JQH7-039<>=>?>=><98883//.-2887AA23EOIB?BFFDBB@87;:;:6=;>BB>964892++--.:??=;;:;89;:9:9::975545666666:88<=@C;1027=?>>A<68;7641./46?G9-/5;5.+/1110002359852.+-022/,++,('7FHD<:9.1:9/-,-258;DGC<:?@@ABGJIG@::<<;:;<==>@=<:84221266((04544321.03343/+/05CC>@CA>??;:;<=<8ERI@BQ]eiL,*2761,5HLGNQE3.453577+$;G-$,0541@A=2+''(((())+/0/..0///1330*+034553333110.5CC2%(598422RRRRSSSSQQQTVVUSSSSTRQQOMIEGJKMNNMNNNNNNNNMNNMKJKKJKMMMMMMMMLLLLKKJJKKJIIIHHIIIIIIJJLMMORUUPLIKNNMMNMNPRSSSSUWWWXYYYXWY[\\\^^]ZTLFFEFFFFFFFGGGFHHFGHILPX_]TLKGEEEFILLMNMMNMKJIHHJJJMQPQVYYZ\[Z\]^`bfgd^VSRNLLLLNPQQQPPQQSSSQONLLNPRRRTVWWWUSRRQQQPOIFQ`a]a`XVTSTWWUTSTUVZ`a`aa``dkhgh`XWcmmg^[^cfee`Wtkfddba`_aiy|xzpxxXXVay{{yh\\ZYYXYYXWWWWYYUbwifihhifa^_a`_aelpqprtuy~q`_b_[_gjegz~yvutqljknllvytuwvronmieffghijkfdfejih}xgcbehw^RYURRSSSRV_lqsog][[`f]`f>UY\eqlTHJMONOZ\NEO[XJBAJ]osfd\aoRANOMMLLMKIIIIJMPQPGDHOSTSMEEAf|XJf_HCMdn|aYdy|peMHLKMNKJHHGGGGHLQPMLKIGFGIIIIJHHHGGGGGHIJKLMP\yrOEHKPQJGHJJHGGGHHIIJIJJJIIIJJKLOONPfiNMMONOQQRSSZTTXZZ]^_`RJHJDMsUv~idhuzj`accdhNCCAOEEFGIQQFDFDS`H@AA@BGMOFKVTSUMLPMQOLRY]QCBGFEFKKDDFHJJJJJMRRHFORNLNNPQQIBBGKTY_fkaTY\S\dimklncYhi[RPPROGCEFGGGFEDDFDCEKLMNU`c\RRVZ_`\XWZ\XNMMLIGINPOONLJKLLLMLLLMOPQRSSSPPONNMNNOQT^u~spkmbtw{op~uovyrdZ]giec[TVWY[^[VUTQNPTUTVWWXYVRPTTRQONPRUTSSSSTTSQPPRTVWWWXXVTVVTSSTUVVVVVVUVVSSRSVXYZZXUSUXWVWXXWTPNMPW[ZZYWVX[XYbp{wqh^^^Z]eikjd]bjqpd\RRWNCCEFGDHRY]WIJ^[E>DEDHNNH?@=84344557;ABA?@CDEFFEFGJJFDHONOPPPQQK?=HKB=<88@FGFEFHIHFFDBBC@ACDC?52:DHGHHB89:644521:?@D@40//01:CII?57=::@B=:>>?GKJHFDCEGGGHEA>==<<<===:7CHJGFEB>::;:8765579981.=II<0027<==>@>>??:5443440.023120/:HJCAACFEDCDDAAEED>5=V_[]```daP<6532245656786469==64=A>BFC<96575.+,-+/;?@?=::;CIKJJIGECA@@@@?<42;BFECA=87:<;:989;<<;7456777778>73AGCB8/-.39:9:>:37:6310002599/+.*/+)*-////02658:8631.-/11/-+)*)(/BKD98;2.350.,.4;<:;;96100385048643212//02551.222:??AA<9:8875899;BA:CND<74GaT/(1520./;HHEIOI0%.7;:=<..A<+9OO?9?D>6?JFA=;5.*)(*,++*+./..-./0001.*,23224434454459ALJ6$'6>>832RRRRSTTTTSSTUUSRSSQQQQSSPLGGJLMNMLLNNNMNNONMNMKKKKKJLMMMMLMMMMLLLKKJJKJHHHHHHHIIIIHIKJJLMMNLJIJLMLLMMMNPRSSSTVWWYYYYXWY[\\]][\][SMKHGFFFFFGHHHHGFHMU\cjoppgTIGGFFGIJJKLKKLKKKJIIIJJLMNQSTTSUVW\`abdgihdb_[UOLLLLMNNNOQQQRSRRRRPOPRRRRTVXXWWVTSRQQNKHCIY`\]ba]ZXVVVVUQPQTX^cdbaa`cfghfZ[_kmd_[^_Z]fk_Zuwlegda^]^dknvno_WY[r||k\\]\\\\UYbYTXXYVrypolkkkf__ab`^`iuxupns|p]X__]`gkryz~~zvrnkiefhijw{snqy{snmngbehjienwmfc_cgjzqa_bjq|eQXURSUVWXZ`koje``b\[^]@D|tHD?DI[m^KMRSPNZc\X`bXGDKMXpb\XTFEKKKJIKIGIIKLMMNYYFJW^\USKFGFXzdEO`fiZU]W_OauxhiYIGJNNLIHHHGGFGLPPOMLJGFGHHHIIIHGGGFGGHLKLLMOZtmMEGLQNHFIJJIHGGHHIIIIJIHIIIJJKLOPOOPSQMNPQRSSRTTSTUZ\]^__aUJHIKH}hT]_bjn{~kbbdeefM?E?ivRCFFGITTFCHDNgM>DEDFIJLKNNLMNLKMMMMRSRVMCEHKLOQPFDIJJJLLHIQUJBHNMMOMMMLF?DFBLY`cmjVQWZ^]iwpt|dRch^TMOPPLECFIHGEDCBIKGFFKRY]adaXTVcj`SQVVVRMLKKHGIOPPPOLKKKKKLLLMNNNOPPQRQONNONOPQSV^lwuqsqxyìz~zoq|~tltwjd]\ismb[VRVY[\_ZWVTPPRTUUVVUXWSORUTRQNNPUVUTTSSSTRQOPRTWWWWWWVVUUSSSTUUSRSSTTUWWVRSWZZZ[YUSUZYXWXXVTPNNRX][[YXVWYX^jwzrkgd_VNQZaeeeltqqnjgacfXE<69??CQZRB4=XOJNICGPTI?IIEFJH@<9:==<;9548:=@DIMMNRUVPC8:AEHNQRSSNA6899;;::9:@GJIEDFECB@@A@>;7334558>GHC@BDEEFEEGGJK>5CWYUQPQQQRKCDF@<><:?FGFEDFIIGFE@;<:8?CHC:5;DHHHGB?CC:776633;BGA3.///07@GI@9;??@DGDBA??GIHDAABHQTROKD>=>>?????;85/07;<=>??>?A>:658=9/.///-/4:BEAAFHGFEEDDEFFGGH@4?Zb]^becce^G3021013566687567;?849CFDE@57884,+,--,05;;=BKOLJIGFDCA@>??=:49CFA==8217=<:669<=?@<767877747:4.<4101:B83442233742:ACCA@:787;==?;67991,0219FD=FLD=3+?aP.2>:,,5:AHIHEHH7/5:BC?:7>5)9Ub_H?E?3:LVPG=63,,///00,*+--,,-,.0131*'+//1433589999:=@B@7-/9@@<76QRRRRSUVVTSUUSSRRSRQPQRTSOKLLMMMMLLMNMMMMMMMLLLKKKKMMLNONLMMMMLLLKKKKJIHHHHHHHIIIHGHGFGJJIIJIIIJJJKMMMNPRSRSUUUVWWYXWYZ[]^_^^]\YXVQNJHGGGFGIJJLQUV\bjnpoossgVIDEFFGHHIIIJJJJKJJJJIJKIKLHJLLRY^`bbceefgjkhb_ZSNMMMMMMNPPPRRRTTUVUSQQPPUXVVXZZXUUUTRKHFFO^^X]cb`_\]]XVTPQRV^beigedcdegc[_gjhfchmc\]ip__z{mijgdb`_a^^pwpjVYYg~{}l\\][[^`]YfiXWYYYh~smmmng_]_ceeeirwwvsqxo[[```epv{{zwx{xuspmkhddhhq{xqklw|rpnogcglmk^fwvogda`gutc]bm{aTVWVVUVY\^]]\\_hkfXONPJ?L\QGDGDFYYNPQMNLMWaddZMHLNJCyxPTYLEHIIJJNH@FOONNNNVaDQ\^YPQMIIKM]RH]vQRKSPUu]UQHDFIKJHFFEFEFHKQSPONJGFFGGHHIHHGGGFFGHMLLMLLO^jNCFKPLFGIKKJHGGHHHIHIIIIJJJKLMNPPPOPTQRQRSSTTTUVVVX[^__aaaVKIJKIKcIOJ^pr|~kbbcdnaIADDLUGEFGGKUSFDHFFYO@CILMPOKORKJLOSSOPNOYRHLHAFHILPUWJFNPMMOQPFCQMDEPQOSQPNPPMRWQNOSXkoVGS`^Vjzs{vWJSUVTQPPOKECEHHECBFKTVPIGLS]c_]ZWRPW^VIFLRRPOOONJGINPPNNMLJIIJKKLNNONMLLOQQONOPOONRTW^dekqwx{ø|xwt{}rmvpfb_gokfaYSTWYZZ[XWVRSTTRUWVWWWRNOTVSPONPSVUUUTTTRQPQQRTVWWVVVVWYWUSRSSSSRQRSUUWY[WSTYZYZ[XUVXZZZXVVUSPNNRX]\[ZZVVYXYjvpkc^b`XRPPSXZ\lyunjnpmkjZD<8:<>EQSD767BYkkWGGPMB=AJPLDJirNB>BBCEE@@IUTSRQPMPRPWerm_\\XczkH5Ghut|tR@HRXTMEA;7@@;44>B>;87;84:=@EKH?:?BBGSVRRTM?=CCBDC?==>:79;=>@BIMMNQWWI?><9888;@GJHEDCCDDBDFC?=:534558@JJEBEFFEEEEGILLA9EX`WONPQPOOMLLHB@>9:CHFDCCFHEA@>8898>CHA88?FJKHDA@@?<<<9975=FHB6../.06;??<7:CFDCGGECADHIGA===?HSVRLD=;?BBBBAB@<984-,3@KJ?87?ONADE96::=IRI9567;;97456888:85523>@:9547:;<=>@?@BA=:7:>5-/0///5@EEDDJNNLA:ABDJKIJIH@3=[gbbfhfdfdM/*00013454477566:@=76:DGF?9;;6.)+,/00028<@=;::?HNNLIIHFECB@?>==96@H;3531/126778=?>??;5479;:53454/8D=1**+-.0232100.,,+(&%)7960,-/+-,,./000--/113554330++*+*)(()))+2@F>45678985641.7FGGDED93;GIHHGGJG=DPONMKIKLE?=<60/55-*-..9HE=IMIR<7\qoR<@8+2BEFLLF=?HB>>57E=2=H<=LZZQIA90-8>DNOE5*'*01.,++**++**+*-1353,(('*48757;=<<<==<:8669=??><;RRRRSUVWXVVWWTSRQSSQPQQQQQOOPPOONNNMMMMMMLLMLKKKKKKLLMNOONMMMNMLLKKKJJIHHHHHGHIIIIHGGGGHJHHJKJJJJJKLMMNPQRQRTSSTVWXXYZZ[\]`aa`]ZXWUROMJJIHIILOU[ZZ^cdbdimqssoZFCFFFFHHHIJJJJJJJJIIIJIFEGKQV\`bbbcdfeeimnljhd^VPMLKLMMNNNPRRTVVXZXUSMLRUSTVZ]^YVVWVRLHEHT\ZYZ_cedfeZSSUTSS[a`cgfffffgd^[dptqpqoe]\isdcyjjkhhgghkkjwdVZX`wz}j[[[XX[`aX_m`X[YWYenrpooprolmf^]\`hoqnpuxyyuzkZacbelvqpwvxuqonmlkhggp{|}unlruqtrqiekllm``uwyvyrlfbld`bk}~ZPTVWXWVY[ZTPU]bgniVNMMJJORMHGJHDJOMNKITNHMXcfZQSOIE<]eDPTKGHHGGIF@GTXSORRDzWBQVYWS[TKJKGJKRUdȱhOFLJFf|t]KHGGEFHHHFFECDFHLRTRPNJHFFGGGHHHHGGGGFGHOLMMLKLTcMAEIONHGHIKJHFFGGGHHHHHIIJJKLNOPQPPQRRRSTTUTTVVWWXY[^_`aacVKILKLGJj~NKFSeqz~nbcblnSGDHPIBDEGGIKQMGEGIJPMDCIQSYXPQQHNVXXPMUSVZMCDEAEHD@COXRJMQOPQUXPAHVPS]]YY\\\[Z[be]PMKZiaMH[hhgswtyiPHMNQQOMLKHEEFGHEBENX]\UPNPQZfeYNQPMLMOPPHFJLLNOONIKNPNMMLKJIIJJKLNOPOMKJMPPPNPPOONQTV`hnqrusw~~zss}qklyrhagojdc_VRVWXXXYWSRRTWUTVXXZZUMMTYUQONPUXWUUVVUTRPRSSUVXWYWWWWY\VUSQRRQQPQSTVVXZ\VSW]\ZY[WUWYZZZZUTUSRPOPW\[[ZZXVWXYgofd^]fd\XUQNQRLRnxvomnkf`P@<;<;cv|iIAEB@BGNPMECWrzveEAFGIHD@DJLPZ^UMPVSW`kxXTfhoxtiV?:Tpvxue`gmuybFBHEBDB@ITRQNKFEDC@?9;ivrzvLFHIIJKHA:79::;;;;;998679::9:><53;A=977954?HIIIA9;@==IW[USVVMFEDCGKE>?@>:88;9435768@IJGGHEA@ACEILLJC?AJQOMLOPJHIKOSQKHC;9BHFC@=>@?:8<;9<>?AD<37?CGLIB@@<;>A@>;9:>HJB8.-./6999;==@JNFBJNF<<>CHFA@@>;;BMOIB??ADDDCAFJ@3-,-8OZTF889<6589>=;;<;;;>?@AAA>;875.,10-169CGFIMQPLE94:;DLJJOKD=26ShfcdedbefM.*//0222333684455;><626BFBA@;0(+,.3643369=;7568@JONLKJHGECB>=<=:6<<>:3269.,.01356640.-,--.,-./2221-.2/.+*,.//0/.-./243432/+***+,.-02/..3<@=<<;;;<>;647AC@ECBB:31:CFEAAC@>FCBMQQOQVQI@==>CE>EN;=7//0136882374'.AMQRRD0%&****+/5=FC=HQR_ZKbvsQ6620>HDIMD=:>B?:8-+303BFHLKU^UG9.4BC;;EMK>,',./,)(((*,,,,++-3663.+'&-68779<=;=>>>=;957<=<>@A=SSSSTWYZ\\\ZYVRQRQQQOOOONOPQQRRPONMMMMMMMMLMMLLKKKKKLLMOOONNNNMLKLMLKJIHHIHHGHHHIIHGHHFDFIKLKJJJIKKKLMNPRSRRSSSTTVWXZ[\]^^abbbb_ZTRRRQOMKJJMORXYUTVWZ_chotsotq]JEHHGGFHIHIJJJJJIIIIIJJKQVZ`babcdefhhijmmlkjhfaZQMOLNLKMORRSUVVWXYYZVNJLQQRV[]]XTQTWUNJFFQ^ZSU]bdgge`WS\_RQ[[]acedegggd^bipomkid^[erigypelokjllmq|uhdYZZZanz||f[\dnobYVV]b_Z[YXYVVXVT`w}qjjg_`_bkttssttwg_kgdjuyp{tuvspnmlllihi|}w|{omnnqzvrkgjjknnny{yvkjcZbecdiu|TJRW[ZYYXXTNNXcgemmXUTIJUTTNGFHGEHKMKIJSPNOWbb[`ZJDGHIWLHNPKHHGGEBEjzaQNQVRUPDMTXbeh[NKLIJLPNLUwlLEEDBCVl`b[LGEEDEEGGFEGLLHHMRVTQOLJHGFFFGHHHHGGFFGHOKKLLMOQUJBEHOPJFGHKJGEEFGGGHGGHHIJKKLNPQRRPPRSTTTTTTUVVXXYZ\^`abbaQIILNPMMDELiMMJUfkypb^ipVHHFOSHCEFGIIJLJHFHJLPPHEJSY\\TQQLU^]XKKTVZOBBBCBGLI@A@NQLMQOQSTVZSQ\agplYRakc[X\hj\RTWdcKARehimtsssdPJNPQOIEHIHGHGGGDCMXYYXSRNOQU\[RMKLNKGJXgbOEGIJKLLKMOPONMLKKJKLLMNOPPOMKJNOPOOOONNMOQTalnwt{zy{vubc|wlcholghaYTTVWXYWWURRSTVVVWXWXWRLQXYSPONT[YWVVWVUSQRTUUWXYXYYXWVWXTSQOPQQRRSUUVWX[ZVTW\[ZYYUSUXZYYYUSTSRPOPVXXZZYXWXYZegaYclkhf[WRMNKEDM\floolfXJ>;:<>AITWPC::BRexhD>HW^XOKNXZWafqPWoooqbUND:DbsshdmuyrLSjh_K96DRRRQLHGFFFGDHlsXhSNNNLJGGD=9:<=???>>=;878;;:89<<85;@=9:;=<@KQNH@528;:;EQTRSUUUOHGEGKF>@CA;86@IG?>?@@@?@A@?;48K_gffbTPURIC>:779;>@BEGFECBBABB=97669956=FIHJHA98>AEKPH=;99ANPNNPQHDEGIQOKKJA>CFDC?:9<=85;<9<@CB@<87:BD?8/./39;>@CJMNRTMBHTPC:77;?@@A?=<8?GECDEDDCDDCFI=/-07F`bNB:659DIA=;54568CJD>8346579889;;:=ACCBAACCA==>@?<:=>ABAA@=863--/0.5?ADHJMRSLD;6478AG@DLD=;23I``YZ]_\^aM-).-/./12347967758<<=;58=AC?5,),.04776558;833649ENMNMLIGEDB><<<:78840...-04<=9=@;38=;4369<:2-.32-1:71/14333441--135555345/+,.-/321/-,,/0100/002310365-+--,-0.252025<><>AB?<;<;5/8D>=C@@>912669636:7;?BIPPOMMV[UMA723/)&&)5>895RRRRSUX[]]\ZYWTRRROPPPPPOOPRQRSQNMMMMMMMMLLMMMMLLKKKLLMOPPOOOONMLLLKKKJIIIIHHHHHIHGFHHEBCHJJJKJIHJKJKMNQRSTTTRQSSUWY[]^^__bccdghaWSSRRPNPNMNOQRRQQQSW]akqspjhon_JFIGEEHIHIIIJIIJJIJMNRWY[]__acdfgijlmlmmmlmllkf\WRMMLIKPTSUVVVVWXZ\_YNCLNPUZ]__YQPTXUQJBFU^XPT\^bgki_\fdSPUW[^`abeiihjjecbcggfc_]`llgkjaesupoqrop{k\TV[\Y]cdpzcZ]fwxp`T]`_][ZYZZXWVTb~thgfedcelvxuwtq|qjpz{tvrttrolllllggzws{vtqms}xpmppigrxxyo[X]_\afgehr}SHPV^[VXXWRNUckllniYWXPPXVUOHEFGFGIKJHKPPOOTVXdq\GDJGFCFLMMLKIGGDAxIHIS[QoӭMO[TTejf]RLMMLMOJJJJWUJEEDDB@KGNTPGDDDDDEFGDHYbUNMTXUQONKIHGFFGHHHHGGFGGHMKKKMNPWKDGEHPUPIGGJJGEEFGGGHGGHHIKLLMOPQRRRRTTUUUTTUVVWXXZ[]^`bcd`MHJNRSRONFEG`dKOSSU_wt__sZAGHILLEDEGIJJIJIHHHJNQQLHKS[YVOPTUY^XWSQORVH=BB@BLROGEGJMMMPPRTRS\`_bktwhLFYeWNPTbmdWW_g\ABZgfgjnlli\OKORQMHDEGHHJIHFCDPXXVURPOOQQOLIHHNRKGGMaunTFEFGHKMNOPOONLKKKLMMNNOPQPNMNOOPOPOONMLMNSZcjxy}|wadrym`ivoehf[VSTVXZZWUSQSTSVXYXXXUQPPWZVPQPRZZVVVVWVUSSUUUWWXYXYXWWVVURRPNOPQRSUVVWWX[YWVW\ZZZXTQTWZXYXVSSSSQOQUVWYZYYYXZ\dlaax{nkrf_YSLHEDCEM_jie`UI=;:@CCCABA=879><978:<:6;?<9<@AIRXUKA910587:CKOPRUVSOLNMJKH>AFB:6;AKE<;=<;<>@A?>>50=\le^b^TOPJD@;;=;:::97;;53:=:<@ABCE>45;?BA??@?@BCB?<748=?>8246:??FNOSVVVWSGCMTPHF:7:>@A@>FA:<>DJJHFEGFCE?2.09BDS]LA<526CHA=;53434;B@;4367349;<;;:;;;?CCDDEFC<<=@><:<=@BBBA>=;73//15SSIMUZXVWE-*,---1588:::=??>>=<@B<548=6-++-/268:9645;834646ALPONMKGDCC?<<><8510/+,.19@834:A:/19;95123433231..34455665331/+-68788840/-**,,/3231.,-/122222122/-4;9/-/0.-2/04326:==;90.678@A>@8./462,-2466:?COPMHGFM\]ZNAABA;..=EE>EF5AD>DOVC40/.,1>A?A@4.:@;H[[TMID>ACCBABB>:8:>;9899=;8;?=9=ABLUUSH=9;84569AHLMQVTOKKOPLJE?AFE?9=GG?;<=<:;>BB???77LdnhbegXFAFNSVYYL@>@;9EIBBCC@=;::9;CF;217@FIKH=349>EJE90338JUSQPRRKBADDEIKJLKGDDCC@:9;<75<=8<@BBCIL>8@BEFC?:647<@>::AGFGHIKLOMLNQNF@@CHRUKA?@?B@>HNB9=EOSPMNOKEB4*.1:D;=IH?=526@C>;8421038=>81167349;;:::986:BDCA??=;:98788:DFEDDA=960-0+)5?C?5*06>;/.8=9311367775/,+.49:;863122/+,7878872,)+**,+-01/-+-.0122212111.-4:5..10.,2/.3435:=<::=AEB365,2;=>;2/.3520025559=DRPD@FHLZa_XLCB@50<\VF7EC61>EC6046:;::>EHJGJ[X@6<9<7(@B/09LE7;=:3+-35426;;.1<>AA<;:96:AC@=;;;70,-,,,./132221100-)#$*++/0-1777720/.+.8ABEFFDDHJ?STSSSSTTTTUVVWWVSQONMMNONNONMMNMMMMMMMMNNNMNNNMMLKKKLMNQSRQPONMMLKKLKJJJIJIHGIIHHHHGFEGD@BHJGFFGIKJIKOSPNONMOQPPPSVWYY\_``behhggge]UQOPQRRTXWUSTSUVXXY^ba``ejmqspeVKGFFGIIIIJIIIJJMRRQQRQOR\bfiigijklllllllmnoljg_\XOJPVVQTWWVWYXYYWYZ]YPKJSX\]_aZQPVXVSLDIZ_TJLQT[cgghjf]WXZZZZ]]`befgedlmjihfd`aeeabgdZlvjqtqolaioh_`dfdbb``___]^]^`^\_qg[YY[[ZXWX]YXYW`{tjkprnimyzyxurpou~x}fikpqnatyho|ztpmlljoheypmps{~yrv~wrz}zx|z{qYPRZaacdelxzSILKLMQUVWWY^ipeeo]RSUVWVQMLIFFGGHJNPR]gMLMPO^aO\TICDEHHFDEFGG=no9IGIUXn[VLPTQOQNKJIIGGGJLMLKHAABBCDDEDDEGHECDDDEFFFGJS\_UKQZYTRONLIGEEFFFFGFGFGGGIIHHKNMJGEFIMR[_TGFIMIDDFFFGGGGHHIJKMOPQRSSTUVVVVUTTUVVWY[]^aabcebRGGHIMUYWJFGCGLLNOKHO{n_fYFGEGKOHBDFHJLLKKKJHJKNIPLHOTUXY`a][[WPU]]WVOC>ADCDLROLJNQNKRTRRTTUZ_bdkpkf_UPQQTSPMGJNP^`F?VfffhmoaQONOLMPOKECDGIJKKJIGGOUTTUSQPQRRUTTRPS]_\XKAHUZVTRQMKKQRRQQPOONLMMNQTUVTSRRPPONNONNNMMMNQST\ptsʺ~ksoz|qrpjmwqd`_ZVTSSUX[ZWURRTUUUVWUVUQNNT\YRQSTTTWXWVTSRSSUUVVVWWUTWVUTTTRQPOMOPRSUVXYZ[[ZWWXXYYZXSNQVXYXXXVTTSSQOPSSUWXXXYYZ[_dg}wokjiga]L?AD<:Kc_^[WOF?<9@MXX]^PJVSIDCA>?@@BJGDIF<@CDAZzd;>@>@>;:93Celfje\YW]XJAG_ibcmoghh`YfrutqmnphnyPAEGHIJLMNNKJEJP^uBF_cejiWDCDEA=<>@AA?>@@?=>==;;:::==>?BA=>?@GKMMA8;EA646:>EFGLSOECFIPNF?@ADLM@<><=?A@=<=BEA>@?9C]jotsfaZNBATiklreMCLK=BLSTSRMC@BBBEHIJIHGGCAA><==:9=<8;@AABEGA=>?=;:9:<@EHGB<768<>>>AJRKEKC9<><::<<963/5IZWMIEAAA?DNKAAHSYWWXTMG@1)037>758<;<><8342-+,/1358;><9@DA=9:;:=EOROMKGEDB@?>>>;83031.1.>?CF@5121+%=G/369?DEHJ?-'*./1;JNJHMRRH77GJOO7+2105?HF?316;971,0453.,++**)***,..-,+(%',.,*)*16872((((*,4>CFHFCFID9UUUUTSSSSSTTSUWVSQPPPOOONNNMLLMMMMMMLNNNNNNMMNMLLKKKLNPSVUSQPMMNOLMLKKJJJJIHHIHHHHHHGFEEIPUVSNIDDGJKJMNMLLKKMONNNQUURQV\^]_cc^[YWTQOPONOOOQSTRRRSUVVWYZXVU]gkklorroj^QLIGGHIIIIIKMQSSSQMLNSZ`dfghiijkllllllnpppple`]VQTUQOSYXWXYYXXXY[^`_UIJSYZ]cbYOPWZXWOEM]`SIJOQV^fhkkebcc`[ZZZ\_bccefjlkkkiiijgb^`fh_iufiqqvlW\jidgjjhgea]\]^Z[`djjju}l`ZYYZYWUWZZY[YXputxvqmkr|~{ztqplejx{oedihgry|thmvqmllikjd}vkloklnlkkq}v||zwmdfd^SMV_`_cjuySLNMQSRUWXY`hojZZg^QRSUYUNJJIHFGHIKQVWdhLKKFGdUFZ^KADEFEB=?DGEAGIVRTVVDJWJJSOFGFDEFHGGFGJLKIFDBBBBCCDEFFFEDCDDDFGFFEFLPOJEM[\WTRPNJGEFFFEFFFGGGHGHHIIMROFCEFKRV]cWFCKTLCDFFFGGGGHHIJKMOQRTVVVWXXXWVVUVVVXZ]`addcdg_JDGFEFLZ[IFJHIMNMNJN`jl`aNDFEHKKGBEIKLNNMMKJIJKLJKMMSUMQYbc_XTQMV^ba]WG?BDEGJKLLNRURV^^URPMPY]^dkpnke]YXY\_[NIOMMVWEH_micjtudMMPOMLNMGBBDGJKLMLLJJNSUXXTRRSSSSTXZYZ`eeYLFFJNRTTVRLJRTSSRRQRPMMMNQUYZXTONNNNMNOOOONNNNPQQQVW^ʾx|~sxwi}qpvqowug^][YWVRSTVXYWURSUVVUUUTTSQMPZ`XPQTRQVZZXVUTSTTVVVVVUUSSTTSRRRPPONMOQTTVXZ[^_^YVXZYXYZVPOSXYYXXXWVUTTRPPQQTUWXXYZZZ^_p{gcfhgc[XL@@D<9IVLLNOJDB>9DRSU`\PMG=ADFIMPSRJ>@U^XdD;Ukonkh`QDADA?=?@@?<<>?@AB@===<<;=@DELQL?8>A@CE;17ACAA@;;?<=?EG@=A?9BW]pxbXURJ>JjutvwcQYaQB<<@ED><;95247777523<@C@?;89?>4/000144:JVXUOGA?@>=AFHGHJLKD@BB@?>=<=<7;AAAABA=>BBBA?<9:=AEGHE>::<=:>BDLTWWXWQKGD7-19>?93158AB>;71./00246678;7455554686779899986433//220.-/026?>?@@@=850+*/KSSP<././5AMG@><=:86894:A<654107;21?A56<>:889:;759>ABCC=5.04653.+064430,+**)*-./.-./130/--,--,,++05.(()*+,-+,.77.+38:=;.(((*+7<:7553;<84225998655570.+1=DZ4*DRGIMPMHIJJFBEIKLF79B=6783//21..12.%;Q;5;;BNHBHD3)/3;=APSKEEJLG@AJIJN>.*%*;>ABCILJJG=8ESW[[SH?=EJJOUSLGCCMD;;2=^noldcdYE?CA><=>AEA;?=;:>GPWYL:3AGG@>C?68=Fpw`TNMG:?Yoz~{mdd_WJ>>DB?=<:635557:8215:?@BBAAE?41001212=OWWPD<::;::@FJIJKMKC>?ACB>9556:=?@BA@@?BEGGFGDA??ACDINF85BE6@UYOCCADPJ:9:6334530.036>FHC>;=<42>=>@@A@=50.,-06:71/10,.34223698886557=BFE<27INFGC83005@D=::8998748=BDBBBCBA@<71124468:::=AA<>=;;::88986664/4614@C=<<;616:::76;@CCAA>82367685-,6543110.**..*)/69600.,)*)))**)*.2-()**,03/3<>3*+24693((-/01:@@A=7?@=;:998<;89;87;ELD;@HVWXe]W^]YVQ@.,,1H`WFBFSOHEABGGFFB7:A7*'(1CE<7:?;4/,&%3@8+,-./00//.,*****)*.2456650,/1/+)*.2532227?@<:;8-%VVUUUTTSTSRSSSUVRRSQPPPONNNMLLMLMMLLNONOPONOPNNNNNNNPRTVZ[YTOMKLNONLKKKJKJJJIIIHGHKKLNRUXWY^___[PHGIJKJHJJJJIIJKMMNNMJIHFGHHGDEGGGGJLLLLLJIJIHHJKMNPSTX[YYXXWZ_hqvvtqqtoaRLLKKKNNNNQRRRQPPNPTU[ehiid__cgiiknqsuwvrnh^TPNJINQNMSY\_`____^_de_XRPPU]a^XPQVY\]XPOSTQOQRSV\`acefea`ghYORX^^ckf^_dhjklllkmlknjbfgmyzyq\TUX\_ckqohb`__elopmnoo{kh`ZUWWXXWWWX[\YS\zvf^`hnvz}xnhjptzwgaglmswumfkljhcctzkgigeghff`_a^^grtpnnlicfxo[U]\SPU[ZSTZ^bkvnPNRPPZyZXZYVUTT_dPRURKGHFEFFGHOVSS~nGMNKKU@BDDCEFHFCQQDADKNNWX[bgi]UMJHCAFEDCBBBCDFEDBABCDDDDDCDEDBCDEDDCBBBEFGGGFEFFFGHEIY`]YWVROMKIHGFEEFFGGGFHNSSRUSIDFJQWZ[UKOTQLIGEEFFFFFFHIJKLNPRTVXYYYZYXWWWVWWWY[]aeeeffcSFHHGFEHKW\IDILPQMKNNMJ[jfSHFGHHFEDCGLNPQQPNNMLLKJHLKR[]ZXUQLLQTSSUXSKN[cXILSOFDIMPR[cdea]XSRT[^]fnvvj]abURan^FEILLIGDNX[[Zi}gJFGGILQQMHFFGIJLMMNNP[fiaVRSTTTNFCEIZwv[KHIIFGR]XNKIJJKNNKLOSUSNNOOPV[\VONMLMMMOPOOOOPPPQRSSTOdijvuvqqj{}{ztf\[ZYWTRSVVWVUUUVVUTTTRTROONZebURWZVUX\[ZXVUTTUWWWWWWWWWVVUTSRPPPONNQSVWZZYZ\[XVZ][X[\WQSY[ZYXXXXXXVRPPPQQRTWYY[[[[[\api]SW]YURTQEAA???==@CJNNOH;8>LZ^PEGNSPNHKRQMKECHA76:AEB>:8_hB;;:98;:7O~rqsld]T[t{v|rvsnb^tr[M[]``\gvutywcG??@?@@FLQRRQ]egdvwZJ9?dnlgSEB?:547?DGID?AAAA@=:;<<95:JZZN>558>==;;:;AIKJGLPH94=?@>=;964557875566;BGFCBIC51001202ASULC<787679>FKLLKLJC>=?CF?40/2:>>?@?=<@DFHHHIJHFDEFEIMI?BPH7LbXMLLJOUM@;:7458;7139;?74?DFKLOSM?9>;2/17=;988:ACC@6,-045765543/00/24237<<977:><83.17851120./7>?AHJD??@AB@;642246899764-+043037998766666=GJB8/3FH:=D>9656;;<;:9866504BIGFFEDDCCA>7224566899?FE>?EA7;EEDGJKJIFCA@@@?>>><<=<989853560/326@F?5640,7A:488887776883,2323123.)*-*&'/7850/,*(((((())),0-('*+.5769=:0**,1230,.15956>DC=8:<987678;==@CA>@DC;25BUYYdaY][WWR@.110Jlh[Z`<:>EHHIJQTJCBAADMNC;77EFDME.*0.(.AH@ITJ<B5-4<61;MH1').35542.,(')**(+/45677::9::2)(*,/453244662-*(&$UUUVUTTTTSSSSTUUTUTSSQPPONNNMKKLMMMLNOOQRPOPQPPPPOOOQRTWY\\XQLJJKLLKKLKKLLLKKKKJHIKMORTUVVZ^__`a]WQKJJIGHJHHHHIJKKLLKIIHFFGHGGGGGGHJKKKLLKJJJHHHHJLNRUVX[\ZVWYZ`hjghd^\[YRMLKKKLLKKLMOQSTOLMKO^b][YXXX[^bcdiiikoeXXXSQPMKJJHIKPX[^a``aaaaacfe^XTQQXaaUNQVZ[\\UQTSRRSSTVXXX\bc_Zh}mSRZ\W[ff[[ahmmijppnpqqokiho{{pgZUXSV[\fkfdc`__cinplklqwkld`VWXYXY\][]b_VT`pkaa_Zd{{}yrqsvwtusf\cnptwzyhjqogeo}urphdddcehfdc_fx~umosphcft}rlbWW\ZURU[YVY`beo{jNNQOMMpxXS[WIJSTVdΚUPRPLIFEFFGGIPS]LSPOKMlcCCCBCDEGFK[QBACCDKSUT]km[GEGFDCCBBBBBBCDFFDCBBCCCBAA@ABAAABDDECBBCCFGGHFEEEGIGDHTa_[YWTQOMLJIGEEEFFGFEGMSTUWRGBGMSWWQNPTOKJIGFEEFFEEFHJKKLNQSUVXZYYZYYYXXXXXY[]_bdefgg_IELMHFFJMUiWEHINNMNOOQLWm[EDILKGEDDEJNQRSSQONMLLJIHQVVYYVUUROKKKJOTWRJIN[aYTYZOHKMNNW`bb]ZYZ[[\_`eoytbV]cVLVfZEDKRUTLHU^\`\aq~mOIJKLPRSROKGGJKKLOQTY`dc\XWTSUTQOQRRZpp[UPIFFCHWYNGFILNOTUQJJNPMNPPPSWWTROMLNNNQQPPPPPPPQRSS\Hõôstrlwexrppi\Z[YXURRUXZYXVVUVWVTROPSRONVcdYRV\[WWYZYYWUTTTUWWWWWWXXXXWVUTTRPPNPRTVXZ[[XXXWVW\][Y\\VRUZZXYXWXXXXVRNNPQRTVWY[\\\\]^bdKPXZ]ZVSND?@BEEDBA@CJOPPG<67GUXQTfpkVJEGMMNVWNB;769?CC?95TcC<;::::;;BKVo}~|qs~yroiq~}x{`GFM\bc`]]a^dqyueO@=><;;;<@CHUcbcdcYXW^U:BjzcXMHHFB?>AHJIMQKE?=AA=:87768BQYWG:?B:=KJIE@BIPLC@EE@:6@>?AA=;?CBAADEFHJIC;5.;;AG>30/38;=>?><;?CDGHGGHHGHHHHJMLNZ`LEZXHMVSORSLC>=9556684/08??@@@@ACB?6--0210////0/1344324:;75443268549<;9413235?JPRWZMA@ACEB:788879@A=961,,03336;;9856:==:>HH?;64?A8:@><;88;>AA?>;99:9>GJJHFFFFEDDC;2/1488799>EC?==715CIBBHJIHGECCAA?>>><;=>:8:831350.247?@5133.*7F=37943::5@?;@DDBIVSE;85..6>CBMK><@EF<50,(*-.4=;2+*,26*#3EPURJKM?0(*-0/01//024544468668;CJJHF>0(+-/220-.011.,-121UVVVUSSTTUUUUVVTUXWWURQRQONNLKKMMMNMNOPRRQPQQQPPPOONPRTUVWZYQJJJJKKJJKLLLLMMLJKLLJIJNQQQTYZYZ^cb`a^XRKHGGGGGHIIIIJKKIIIIIIJKKIHGGGGJKKKKLLKJJJHHHJKKOQQTZ\[\^]\]`^]_\VOHIMMKJJJIJJLLLNQTUPMMJNWXSQPRTUUX\\[__ZWVRIFGHIKKKLKHHINRVY_`abbbdcccefe`WRQX^ZRNQTTX]^YXYUSSSTVUTUW\__W^|jfe\UUZ_^Y\cgddfknlmnoomlkkkfa^WT\XUXW^`\bd`^]\eoupgdgijmeh`RTYYW[__djh]UP[\V]da^t~zz}xsh[Zfppuwr|vektppoy~xrjdca_cjmje_g}|pnookheciprspjeb\WY\ZVUXZYZ_bdkziOTXSNNWbXVXTIFOLITW`NOMNJFGGIHHIOgXWTMSLLTJDBBEFEHKMPICCCBCDLOPV]bYMFFFGEBBB@AACCDEDDCAABCCDDDCBCBBBBCEECBCCDEGHIGEEHJLQNGQbb][YWSQONLJIFEFFGGGFGKQTUXODDJQYXPNQQJHGHIIHEFEEEEFHIKLMOQSUWYZYZZZZYXXWXXZ]^acdefhhZCCNOLNLKPOQQFEHIMPPQRSNWkQ@BOYRHECDFKPSTTRRRPOMKIIHS[WRRPONNPOOPNPSVPIIFET`]X[UKLNMKMV\[TORWYXW]belup\QV_ZOMY[MEJRUTLKU[Xa[We}nMIIJJLOPQQPKFHJJKMRUY]]ZX[YUTTSSUY]^\ad^^WKGIGEIMLKKLMNNSYZTIGLMMOPPPOOQTSQPPOOPPPPQQQQQRRSSTLɶƶoipspxj{tigjcZZ[ZVSRSX]^ZWUVVVWVROLORQNS^_]WW[[YWXYYYWUTTTTUWWWWWWXXXXWVUTTSQPNPRUXXZ[[XVVTVY\[YY\\TRWZZXYXXWXXVTPNNOQSUWY[[\\\]]^a]@CSY_]YRGCEGHIHECA?CINNSRE?@ACB=HS@>;::::;>><:Hev~~suz~qH471?Wu]Y]dgehxnJ7;@@=;;;;<<>FU`__VLXYZW>N}yQGKJLVYYYYYWSQOKE>96468FSSPSKCMSFEOTSOJORLD?>><>><>HSUW^elwy_;6<>@@=:89>DIIGCFGIJID>:3=lxpjeZQKPX[o~{{tjeUE@DOOB<<<==<;==85>C@??<;>AB@?=;93.04623DMB76:95788>FLOPQMHDB>;:>E>102358;>@?==@ABFHFEEGHKKJIHNUX]YKIL?>NVTQUYUG=<;78>?8>OVSWZPIQVZe^[^G7=?BDGOLB;4875=EJGC@??BB@=5.//.-,.4643/17:733596/2640.5=>=@@B@91.247?@ACC@<:877;AA:40-.0016:865777=CEDDED>=CB8=?9;>;;=<<@BEECA?=>?BFHKLIFGHHGFEDA9336;;878;;9876653>J>6CMMKJHFEAA???>=;>@<:;932241125:<4/254.(2CB:882.11.2798643247512210/00.*()+,,-,,,+'()*)(()**,.0.)((+.14310-**.230,,.2433016529A?;=>96447>FJF<;CA;757:;AITS;1=>=G>444-,0UdWcifJCHXY\oe^`]YQE><<>CIJIMTRPOH@98AHCBMNF70;;53.+&%0AB>LJ879//9951+*.6:<<51//+'(#*APW_d]MGG?0+**,.//26:;88998757@IPVPFGH=35862-.,,/10-,6><7SSSRSSSSTUUUVVVVVYYWTSRQPPNNLKLLMMNNNORRRQQPQRQPOOOONPPPQQSTPIIJKKKKJJJKLLLKJIJLNKFGKORSVXVSW_dc`_ab]TLHGHIIHIIIIIIIHHIIIIJKKJIHGGGIKJJJKLKKLKJIHIHGJMMOU[^aaaccdea]]]VNJJLMNPRSTTSPMMNSUPNONNOPQPPRSSSUXXWYYXWXVPIEFEEHKLKJJIJJNW^`_bddegfeefffc_ZUUWUQOOQSUXY\_[TSSUTQUWUY^cZTj|{kYWVWY[ZZ]^^_`chjhgikmkgd[[]]VRZ[VVZ\\\acb_]_itwncbfgikiki\SUYWX]iokicdXWXV[`gcdv}xvygY_hptxvkf{~iqzpppvpigfgfeehjhc_f}xoqpkkjdbgijg`]_[XY\\[XWYZ[`cflxyeRZd_TPPVZ[UNIHIDEQXO[\RMLNMMMMLKJHW[R^TSVROIECDEHGHIIFDDDDDCDIMRQNSSNGEGHEBBB@@@ABCCDCA@CEBCDEFECEDDCBCFECBCDCDFHHHFHJKP^[JMbd]\[YURPONKJGFEFFGGHFHPSV[OCIMTZTKMQJEGIIIIHGJLIGFFHIJLMOQSUWYY[\\\\[ZYXXXZ]]acdffhgXECLPONPPOLIIGDDEGLRTTRQQYLDET_UKDCDGMRUVUTTTRPMKKIJOUQMKKJJOTUW]`]ZWNIJE?DS\YTPJIIIFDNWVOHLSUUVX_fjngVRRY]XOQ][MMOPPQMRUTZWPVpeKIHIIIJKMPROHFHJHJMPSWXVWXWVTRRSUWY^_[\a^UMKLLHEHNQRPONONQY^TIJNMOPPNIJKPTTRQPONOOPPPQQRSSTSJl÷¾}qsrqo~{psgbfhc_^[YTSSWZ^]YVTUVXXTQNNQPMNX_[XZ\[YXYZZZXVUUUUVVWWWXXXXXWXWVUTSRQNNPQUYZ[[ZXVTTVZZZWY^ZRSYZZYYXXWWYVQNNOPRSUWZ[[\\\_^_ba@;HTXWVTRTVTQLIFCA?BGKNPXSOXYN=5Di|{e`QRbeQB@@?>@A=?BGOH>C@?;:::9;<;<6?h~p{{V979:6CjPV`fmfdo_?6@CA??=<:;;;;<>B@868833=EB@><97:;8@?=>@?@EHEDEFHLMLF@MXQLHEFEBFPWRNWej]E864:CA;EVRFHONPZ``ijdbQ<:>?@BFGA<89;@LOMIB>:>85017:406<=98@>728>BA<=CJLD2/6667DGIPNA;<965>@ABAAA@@@@BEGKOJGHIHGFEDEHD=;==:78;633447846D8.A><<834433349;8.0453/+5@A;774220,*,05430/47533210//10.-./0.....+)*,,+*)*,05895/++/1443474.-2652./0//4767:518A@;@@=;;<@FGFC><>>@=41688:C@.&05464230--2Pa\fhkMABTVcv[Yhc]XJA>>HLJHJNNKNYWH<7=FDDJNPF1+38732/-18;>EC>:0-8?AD?6-)02.48;<3'$'-8?MZ^bdSA><81--....//1311223328GRXXH;@EB<;<81.0120+*(*3764PPPQQRRSSSSTUUVWXYYWUTTRPOOMLKKKLMMNOQRRQQQPQRQPOOONNMNMMMMNLIHHIJKJJJJLLLKJJKMNOPMHINTXWUVWY\`cdbaac_UNIJKJIIIIHHHGGGHGGIJJJJJJIIHIJIHJLLLLLMLLKKIFGKLJNX^___`cge^_da]]WNKOSY[\[[[UOLJNRPOOONNNOPQQRRRTVVWYXZ\_^[WQNKIHHHHHIHIHKR\[Z`efggggfeeghgea\YWTQPPSUTSTWecTUWUSVXUU\_WTcvzp_[[[[ZZ[\_`_`aaegikhhlf\YWZ^\TRVWVV]`_\[ceb_airpiggfjlmqpjbWSXXY]be]`_`\TSVY[djb_kzzpjro]`hnromjcgru}thmlnlhffhkkkjjkfab{xywusrkgfia\[[_[VY]^[XVYZ[`egmulZV^gg\NMVYYLEILC>FQUVUWRKJKNQRSRONHiXL_][[[RFBCEHHJGDDCCCDEGGHLNQQLKKIFDGHFCBBA??ABCCDCCCDDBDDDDEEEDDCCCEDBBCDDCFHHHIIJJSejXM[c^\ZZVTRQPNKHFFEFGHHFGMQUZMCIMRRNKLKGHIIIIGEGQVTPLJJJKKLNQUWWYZ\]]\\][ZYZZZ\^_befhieXKEILIDPVPNKJGDFHGHLX\\YSPLLMUYUOEADKSVXWWVVUSPNLKIJLKJHEFIKQVW_deffYMIID@@DNQKGEDDCCCJUTLINSNNUUT`kk\SSQT^^SP^dVQNONLIOTRRUTTfhWMHHGGHILOQOLIKIGFFJQUURTUUTPNQVTSW_a]]a\QMPNLLLOTYYVTTTPOTYYOKMMNNNMJJILQQQRQPONPQRRRSSSSTRHŪ³vorsppzrg`^a`_`_ZUSRTY]\ZWUUUWYWTRPQQLJR^][Z[\ZXZ]^\ZWWUUVWXXYYYXXXXWYYXWVUURPOMNQVYZ[Z[XVTUX[[XU[_XRV[[ZXYXXXWWRMLOOPRTVXZZ[\\]_^`beK9?FJKJVfdbZUOKGB@?@AFMGKS[\N@847SrqVQf`aypK;?=AGD?=@HNSK>?B?999899:::9:c|~~{@59:::CHJOZgmda_QC<:<;<<<@EIKGBNYUQR^a\bzpMBIKLRZ[[YW[`de[L@8D>:868=MWWW[\SFFMNONOMKQT@4@JIHHGFB:F\]ZbgehqtV75<>DLM::CBDSXOHCCHJE=<>@Pflfcf_D<<>;8=DGEB>89;?CDCFHHD<8559?@ABAA><>=66AMQPQPME<9;:8632227::<>@@??>>?CFDDEEFLNH;7MO=>?@BDA>BDDJPOKFB?=<>A@9/././.07::63213313=HHDFJD@>FHFB<:BJMD5269:;=:=?:9>AB@@DGGGC<86430/0/058;>?=:9:;;94////.-8DB>@A@==;9997443469>A@?AEHNQLMKIGFEEEDKRKA>@>99;8655597224009B?806GHCC@?@@?>>??>=:87521039;4.474207DC=7455530-,-/341//2544321/.14444651/.//////.-,*)+-03357420235569961013443/.0/9@EEA?:?CGHFDA><819C;0132131++12112452223I^^llUEAAHWpw\\aSNOHD?>HJHFIIAGJ@JE0,/8?FMIELL?0.122100248=>>;/3BEADE;,'*&*8=AA4%$(2:6C[[Y_[I75752221/..-.243323336@LSNA:;<;;;:60--21*&&&)1425OOOPQQRRRRTUUWWWYYXXXWUTQNOMKJJJLMMNOQRQPPPOPPOOOOOONMMMLKLMLKIFEHJJJJKMLLKJKNRRSVVPJJPUTTWZ[]_dhigb`^[SLJKKJIIIHIIHGGGHIIJJJKJJJIHIIIIJJJKLMNPQROMMLLKIKQUWXXWZ]YQWbb`a`XONSYYXZ\^\WQMJKMNOOOONNOPQQRQRVWWXXZ\]^^__\YWTPPPOMKJIHKMNT_eeigbbeedghhjjie`]YURSVVROUY^[UXWWXYWUXZTW`feY[bb`^][ZZ\]^abbablsqmg`VUZ\YUPRTUXTXb_\]cffdafkighecinqvsc[ZYXW\^URQSWRUUTUWZah`UYhpljmpmm|sdbefiikommtztihhhhkmljghkllmmnkdau|{}xxvuok[VXY\\WZaa[UUXZ[^cgosaU\dfidSMQOLHHOPHCHMOTVTRMKKLJLW^\UI\LZ^d`YPECBDGIHEBABCCDGKKKONNOKEDCDDFIHECB@>@AABBEKPPHACEDDEEEEEEDDCDB@DDCEDHGEHIHIHPamhVT`_\ZYXWVTRPMIGFGGGGHGGPUWPEDHMPQPMKIGGHHGFFCHSWYXUSOKJJKNSVXYYZ\]]^^]\[ZZZ[]_`bfgijbXPHHHFGNQPMKIHGGGHHEO`e_[NKMOSSUQEAGPVZ[ZYXXWTOLKIIHHCBA@BIPSST^c[X][MDGEDD?@FJHGC@@CGINNGGNOGBMRHQbcTQTQQZ`YP\k_POONCDMTRMTYX]e^ICFGGGIJKMLPQOKHFFHPTSPQTTRQU\_YV[a]TZ`YMLONPY[]`cc`]\ZURQRSPMNNMMLKMMMMNNOQRSRRRRSSSTTTRSQ_|ppopnvqh^]][[\[XURSSW[\YWVUVUWWUTRQPNMR[_^__^\XVZ__]ZYYWVWWXY[[YWWWXY[[XWWVURONLMRX[Z[\ZXUVW[][WX__WTX[[ZXXXXXVQMIMOOPRTVY[Z[\\]]]``gV8:;?AB]og_UQPLEA>??@EJF@FPJ:5676>JD:>VjiyN>;9;HF<@BBCOab[[VOQMD==?AA@?>=<<>AA?B?CTXRY`cknsODJFBGUa^^^`^ftyv]=69;:::=@@DYfbdsjC7L\ckkfb\V\c]URNIIHCA@?>=<=>BECAA>8ADGD@?>85:ENQPNLD;8;=:2,3=<:<<ACCDFEDJMB05JG;=AA@DA6>UO;8>Nd\=15@KNQLBEIGC@GTWSPV^]Q?9<<<;;>==FKJKJHECBB@?>??:4..0.-3952/240,-6@HLGGNMJIMPKIJD=8>>>?@@>>=:40-1581+35105DH><>71341//011011/-03478731179:;==90-/0/./1-****))++**.55202357:;930///474,,6:AEHHGIFC@A?FHD<;?EE?>A=83-9KB1/1/---.031/14687654@Wfl[B;@@DYnaS[SCABCE@@HEA@EA8;>6?F91/0@NMF:?EIB?HB7432100420229?@@><4+)*&+>ACF9(&).05Ja_X]eW>5543441/02335875234522;CDB@<989<<<4-36-%$'&)1778OOOPQRRSSSUWWYYYYYWXZZWSPNNMKKKKKKMNNOOOPONMMNNONOPPNMMLKLNOMLJHGGIIJKKKLLKJKNPRUWYXQHGKMOQU\`dggfeb\ZYSNKKKJHHHIIIHGHGHIIIJKKKLKJHJIIIHHHJKKLOQRRRSQMIHJLNPRRSSSQLN[ea\`bZOLQUX\_``_\ULGGKOQQPONNPQQQQSUUVVWY[]]^`baadedcb`\ZVTRPMLR]bcebYZ_`beghiknnliec^VPQURTSQ[\YYXYYWWY\WV_c\clbca]]\XXWWY[_c]Zcnqj`][_c^SNNPRSWR\g]_bbcggadijkfbbgknulXSY\ZW\aYQTRXXXXUTVW^d^RXecalvue[jsqqkhotux{zzvl_ehgffhlmilmkmnklohdn{|qy{~~mZWWUTUW]b_XUUXYZ]`clo\T`fdggZKFJOU\ce[PIGHKKGIRWUSQT`kmbOeRUZmzbLFEBCEFEEEEDCCDGKKLMKIJIDAABCEIIECA@?@@@CFINRPIEEEDDDDDEEFEDCB@AFDCDFHIDFHHIGL\gl]S^`\ZYYYXVTROKIGGGGHGGEPa]OEGMRRQNKIHGFGFFEGGKPRUVWYYRQONPTVXY[[^_^^^]\\[[Z[]_abehmjWY^MFEHJMNLLLJIIIJLMII]feaNHLNPPPLDDLSWZ[[YYYYTNKJIIJIGEABINRPLKPRIBQ[OHKLIFA=AILLGAACFDGFHHIHC@GMJMTXPOSSVZ]]RYofPNNKGGMTSOPSROQQDCDFHHHGGGGKQPLHFGHKNQQNLPY_flib\_d\KMYULLKIRbhghiihgeaXQOOOPOOQRQNLPRQONMNPSTSSSTTTUTTSSTL»ȼwrpqq{z{r_Z\^__\XSQPQV]^ZWUVUTUUUUSRPNLQ\^YZceb\VW^`]\[[[YXWWWY\\YXXXXYYYWTSRRPNNNOT[]\\\YWWXY\]ZZ\a^UTX[ZXXXXXWSMLKMOOPRTVY[[[\\\\]__f`687<;Dgpb\PLNJFB@??AGIF@>><96678754:>DYevg@;88:JH==ADECBEF?987777799::;DOav_dyO58:;=?BBAFRQKMQSZ^\OCA@@??>=<;?CDCEEBShdlvxzwwdMIJD;@ZqgelgTZwlB;A=857:FJHE>8684;JNX__N6>Z`YY^^]fgTI\geb^gqpcI@@@AABO[`r|_ACMPVUKIV[ZbkYGHKHGGDA@?>==?ADDA<<=9=AA@@ABFHB84:IOE=?BHLHC@@<99?IRQKD@;8=@;2/6?@>=<=ADDB@=<=?@?BFFACH?16DA@A<;<@?8>GA4005FL>47CLNND9BKKLHEKI@?KVVH<9;;98996;HKJIB:83.19ACKYYNCABDC?73225<;;812996:=>@CBA@?FKDB@95423338>?@>ANVVUNHGFFFFFC@GXZJGRK<::9;<<@B:20./132.*-?HFCBAA@@@?=?=5.-120///,))+,)*))()175114689<;73/..069601>FEBDDJKMH@DIFA>;<>>?DH?@GC=@A=<>CHA:9;;<@@DNXWB4=RQAC803JZTG<88866884.-.-14575/,**+)+9@DI<,.+',7H^`[ckZD;64352/.386579754556.'.:@@?=;99@DE64=4&,1)$)1588NOOOQRRSSSUWYZ\\YXXWXYVRNNOMMOOMKMONNNMOPONLLMMMNOPONMNMMOQPOMLKIIIIJKKKKLKJKLMOSUUXXRJGIIJR\`a_]YTUWXUPLJJJIIIIIIIIHHGHHIIIKLLLKJHIHGGGFHHHIIKLLNPQQNHFHJKMMPSTUWWTXbb_adcZPLQZ_^[\bd\SMIGINOQQPOONOQSTTSTVVXZ]]^_aabdfgghgggggfda^_dfb^ZTU[]\_ghfiorqonopf\UXkbUPPX\[[ZYXY]`[Yenn|vZ\^[[[YWTSVW[`\VW^a]\bhli_TNNOPTVYij^abaab``inhhgfgfcfogXUW[\[]ba[\_ab_\USVUX^\UYrwfghfmtzz}zv||{~~}vlbgihgdeilhksokonnomllkj|wey|m[XYVRQV]_\XVWYY[\]`ieSU`a^alrhZLZgjlgYRJCCCCACO\_`bb`didJeZWRczfJEGDBBBBDEFDBB@CHJIFFEEECBABBCHHDBA@???ADGHHEABDEDDDCCDEEFEDCB@BGFDEFIKFFHGHGJ\kiZS\_\ZYYYYXXUROKIHGHHGHGK[[ODCIKJIHGGFEFGGHHKNPQNLJNV`_`\WTTWXZ[[^_^_^_^]\\[\]^adgiphEUx_HIHKQPMNNOONNNMPPOTdg`MHLNPOKGDGPXZ[]\[[ZYTNJHHIJNOKGGOSPMKIGEAGY[OPWVOFCDABILGDBCCCCDILMKEDFIJJMSPNSY`]UYX_pbLLKJILOSSNHFFFGGGGIIJJFDCBCEHKKHHIJIINSOLWfkmpolgehfVEIOMNMFHS^eghjnpmh^SMNOPPORYZVUVURPPPPQRTTTUVWVUUTSUK]êxsopqqtzyqaY[aeed^ZTRQTZ`^YVUUUTTTTSQRPLLT\VVcgga[W\c_YY[[[ZXWWWY\\ZYXXWWVUURPOONOPPRV[^^\[ZXXYZ\[[[]^YSTXYXWWWWVSOMNONOQQRTWZ[[[\\\[]]_e]787:7Khma\OHMKHDC@ADHIJG@<>=9779988=BB@KYJ89;;@BBAADC>>ISW^gaK>>>>?<;;=?BGLPPKVoppztbcdYQOMLJRkzkfknXPjaAEC:85389:867:>:I^\]fV85ShcbgjbW[d]OVhjUKbme\RRRSQP]lp`RB>MXRHE>7:?@AAABHHRsqK@IHHUVNQfpXIWK:=B@ABCEDA>=>??AB>65879ACA@>AHJA64>HE:;@EHLHCBBB@:9AMPIA<;9<@=659:;=?>;>CBAA@>=>@>?FH=;A@79A>>@?@@B@:<=747878==89DKHF>:FSSSPG@823?MOB<=:<=:<:5@NLLM@108@B@?@GMD47F?10665443-*3CNNLJKNTTSOHB?EMLJH>8844TYA4:EHFC@K_W<46=EA::?B;=:>ABBCB@:26CIKJFA>=<<<<;<=:?NYXPCDGHHHGGGCAL]ZNUVE<;:;=BHH<2/-./054,*7GHDCBBBAA@><<@A@???=844653730.,*574;@82343310/011.-..,.252059:=>:4/-/00..010./2.'*))).8:65469;:::951014668:?GF>ADGHBLJIHIE@?>@IK@EI=610IqxqbMFB>CG?5/.4789:998753129<;;DC98AE;03<=9777>PikZD;74452//5976899::995,)2<>>@?=;;CKC238)#3=1))-268OPQQQQQRSSUWXY\]YVWWURSROOPNNPPOMMOMLLMMMNNMLMMMNNNNNNPPQRRQOMLLKKKKIJLKKKJJJKKMPRSSX[UNJFHPXVSQPKEFKPQNKJJHHIIIIIIIIHHGHIIIKLLMLJGHHGFEFGFGGGHHHIIIJJGEFGIKKLLNPRQPTY]`aacd_RLSYXVYbgb[[VKFFGKQUUSPNORTTUUUUWYZ[]_``abcdefgiklnnmljhghcZVSSYZVYbedfmqpprtwtnghu|xj_a_]^ZYYY\`^aptwsUX[ZZ[[XVUWXY\\YWWWZbmrpf^UQPPPV\ab]_ddceb\dpi^_cec^W`dgj^WXZ\]bdaadb_^ZVTVWWXXXWexuoms{ww||xpghiiinmje]\pwiotrqqolihjj^bjVW\^\]][[\ZXXXWZ]]`i^S^ddbbmyxVY_`aQDJHCBFKJEEN\`_]WSTS>\XWWTSPHEHJJIGFDBBAAACGKIEBABCACEEDDDHGDCB@?>@ABCCDCBBBCEDDDDCDEGFECBACFGGFEILHFFGILN]h^QOY_[XYYYYY[XTQMJHGFGHHIJJHEBBEDBBBCDEFHJKKLOPQPKDBFPX`fg_VUWYZ[[^___``^]\\[\]_aeijjXBEnkPMGIMRXVSX[YWQJJLJO`bXIHKORRKDCJU\]^_^^][YTNHEFHJKMKJJJKGJLLJILU]WQ\d\NFEJGACGDBBCEGGGJNRQKGHHFDFMQS[b`[RNSbo]HJKIHMRQOLEDFHKLLIHIIIGFEEDDDDEEFILLLPSRWahgejv{rebd]ICIKMNGCFN\ehksyvkb[QMOPPNPYcb`]WRSTUUVWWXXXYYXWVSVQTŮǿ|xtonswxpwn`]_bgigb\YWTVXZ]ZWVUSTTTTSRPPNJKVWTcmie\Y]ba[VWZZYXWWXXY[[ZYXXVVTSSQQPPPQRRRV[^^\ZZXXYZ[[\YZ[WSUVVUXXVUROMMOOPQTSTVXZ[YY\[ZY[]^fY;58==Nfmc\OGNLHDCBCGJKOMHFE;889:;:;@FGBAFC@@BBBJRTWTF>;?C@;7666879:998:Lrc@COQOOR`}vH3>?;;:;=?CHG@<==?AA?832547CIGBAFMLA54;>947@CEHFBCFIE<8?;78989@D;9@B@AA?=;>@@DC96:;9:ACA@ABBGKHIH>9<>>;<=:;FKB?==M\\XVN@7648CGA=>8577<;:EOLNQF88?A@?>?GSO?<=4-04453222:HRSOKLNJFEDB>::>C@?CB<=>;>BA>:;KQGFPTOF@89LJ4/-4B?;?JQF?EGC92049;:>=56=@>@BBAA?92,-;KOICA@@@AB@=98:>IUUI@CHIIJJHHGCDQ^XUZPB;;:;AHF9..00./8C6*:JIFCBBBA@@?=:=AB>;99876765620-*)8:14A@73431000012/-.//.,0/*/56;95.-,..-+,/12235-')()+1889;638;:99954455208BIG=6?EI>6LOQSPLIGB?>F8H[I:76C`tyvbOL>BEIS\UB9?FE4*-/48;@GRYSHDQY=4IC:CLE:9DK=22018@ACMRL?E]O62322/*-11+,-..-*%%/9;9,'B`m\<674452/1678998887641-2@DB?<:9;=?>@BEEHHHHHHIJIJLPVVI><@A<98878889:99988>C@>Mnf[^_mzr~aI<879<>ADEF?778CFIJHQ]`myh[WWUQP\jZ?LbWE@>;?IX_YbowvcJ>CJE86>CEECBB@=Wx`L_ojUINhT479:<<;:?>>?@:21235>AEC>;;989CHA=AAAA@?;67=@?=844469AFDABFMW_ba\QD>=<>??==HM@9=?L^c_]TDADC>=@?<96115<<=IQLMQJ??@BA@?<>FF=952;EA:5345:HRPNNKJJG@;9:;==??96@B7:D?<::;<>EKNIB?=8404=:2536;<;?LWOC@EE<4-.798BC96>ECAA@?=81.,.;GE=:;>@ABCB=79>=;;?@;7673./6DD4?LIHEBBAA@@@<::@DB?=:65677641/-,+6<76>A=653100/012003566530/566532.-+,+)**++/353-****+/226;86:<966654663/.6CG=319D?/8OQOPMLGC<3*4;JZSC=>@Ec~rWS;.564334568;:9;?=62468GL8''-4;EGKUVSLFGQF8<==BBEGBGY^XTI<>D?;J^d]\qvV755240/36321/-*''1=??@5/4LgQ./8532.-1458::84.**(*-28::<=98=INA457,",4*.;<6331MNPQQPQRQPSRRTTSPNQRRRQNNOOOOPPOMKIIIIJIHJLLLMNPNNONLLMNNMMMMLLLLNMNONKJKKJKLLLLMOPRQTWYYVNHHKKJJIGGGHJJIIIIHIIIIIIIIIIHIJJKLMMONKIGHGFEDDEDEGGHHIHGFFFECDEFGILQUY\bdfiigfecde^PHKOPU\cijda][ZPHLW_]YYWTRSSPPSTUTTTVXZ\]_`ba\\]^][XVUUTSSRQQSRPOOV][W^gd`chnnhfjhdgng_^^^^\\bjeZZV\qgX\gui[c`\a`][[[[\]\\aknh_]XURRUVSOOYadeflole^Z]^XTRSTVY\hqaWUWae`YXWYWWYWWYXUUWXZVS~}zz}xnjnttqignofVRPQNMStvs{~yyxsjfmhcYXd|uPUWWY\fqth]ZWROOVbgkf]_cdfhgm~eIQdkh^K@EXlstng]OHFIKIILHR߾hHPMMNKGGGLRUWXULFECCEGGEEFEDCCDFEDCDGGDCBA@@@@AABDDCBCCDCCCBBCEFFFFCHQNJKJFHLLIIHFEZcPIJGR]]ZYYY[^a]YUQMIGFGHJIGKRLCCKWYOKRZYROJIKMMOSSJCCDFKVb[SUWXYZ[\_``___^^]]]^_acdfiaKDCFSSFCGFGLY[]aca[UQLMRXQLHHIOTPDAHR[`abcbb`]YUPLLKLMOOLRSQRRTSOT]\WSV\`cZNFGGGECEFGGFFAAEGGFIKNLIJJJLNU]WMPSKBBKJFHHHHJMIHHCCFIKKJHFFGFEFEFGGEDDEHJLQVWTRTX]agvv]KICCHFDEGIHCCKUZbjt{{k[USNMNONNP[lpjc^YYZXVUVXYZ[\ZYWUDxôº{xwmovz|tmejmkgfd`^VTTUVVXYWWWUUUUSQONONKHLUTWmwi][]ab`\XX[^a``][YXYYYYXVVVSQQQRSSRSTURSVZ\][[ZXZ\\\[\YYXUTUUW[ZYUTSPLJNTUUVXYWVUWXZYXYXXZ\e]QMJGD=;CM_^YXRJBBCDECA@CHHGDA?>ABCA@?===CGIJLHGBFLQM?<<>?=<;:99989:99999=A@@?a|}qjiZ`squm`VROOLHEBAAB=9:;=BMQH?ABBCA<469GWXN=;;@J[UL_qr|nH7>HH?=EHIGDABA6;:9=>><:==;621236=DFFEDEFD>767657:=>?ACCDJMIFFDBC@<;=?>86>EA><869=;:84128>BDDBER`fihfd\K@=<>?@??GK>4;AIXbdaVC;DIE>;9756777;9:KQKMMC=>BBA@=:=HE36@?;9789;@HH?79;845:=:59:77::K@69?C@@A@>82.-.3::6667:?BBCB:49?85ALD:>DGGJMMMMLKKIMORQHDBA?:68=DF?5./4;GFFLKHECCAAA@?=<;=CEEDE>;9975421.-,4<>;89<=93011001203776:;63378443310./-++)),-551,++***,++0:>>>>:423334420/4?@4-25@6)3;:915A;50,*2LXXSI@AEB=0599AEJQQX^_]\LBII4')+1APIJUOB;?ILNI=9434ALJCDNY_`RJMLGRdge_bS2654225899640($)5??>@92&/D9++032/--15679:82(%%&)/10110248G[W=/-.)$1:209>=751MNPPPQQQQRQRTUTTRPRRRQQOOOPPPPPOMKHHHHHGFHJJKNPQQPONMMMLMMMMNMLLLMNOPPNMLKKLMLLMNPRQQSTTUTPJHJKIJJJJIHJIIIIHHIIHIIIIIIIJJJKKLNOPQNLHGFDDDDDEFGHIIIIJJJIEACBBKRTWZ\adedfdddeedef_QIGHP[djmmlhgmk^QLRROUWTQRRQQSTTSQONORSTUWWVSRRSSRSRRQPPOPPPQOOMNPTURT\_[Z^a`XV\`\Z_`b``ba^[gs^MQSQY]ZXawk[dddge_\][[\__]^`ca``XUUUUSRQRVWW^elnf_[_f_XSRSZVW\\efZUWad^XWWVVYYWXXWVWYX[[Vn|vnkfeeormlotti\MINOLi|vwtllojd][W`ou^VXZZ\]blswk`VPNOVbjmf\accehhl}_AO_cns]CJ`lncYZXPHCCGHHIG<{՜^GNLJLIEEEEFGHKIGGFDCCDEDEGGGFDEFEDBDGGECBBABAAAABEDAABBCCCBBACEFGGHEKVVNKJGHKLKIHGFTYMKKGMY\ZYYY[^a]ZVQNJGGGHKJHIKFBA>DKSYa_RKRXXUWZZ\XIBCCDKVXPSVXXXZ[]```___^^^^^^`bddfh[EFRY\\VLJOOGNY^bgd_\ZURSQJJIGIOSK@ALU]abcdccb]XUROPOOPSSPVWSRUWUT]b]VQLHLSRPMIECDDEHJKJHCACEEEIORNIHHLQSTZYOMQNID@ACEEFHHHFFFBBEFHIIHGFFEEFFHHIHEDGIKMRUUWURNOWi}uaQHDCEEDDFHHJRZ^RQ\jvyjXQOONMNONMVhtqga[WVTSRUXY[\][ZZLk¸IJzxvnjrxrmjhllheeb^[UTTUVVYVVVUUUUTQPNNLKIGPVVf|ra\[`db^ZWX[_a_][ZYXWVVVTTSTRQQQRSSRSTTQQUY\[Y[ZWY\[\[ZYWVWVTVY[YWSRTPKJPTUVXYZWUVWY[ZZZXXZ^dZWZ^c]TKJWdaWPIC>:9;;669AFGIKKGGFDA?=<;98?GKJFABDIOOH>:<=>??>;:::89;:::::=?@BCQVSe{}yyoMKfgebdcdinolaN?<<;:<>>?@=;?DDBB?;5=JY_N>8AZdW_tue\\]Y`jhZLNZkziXP_xehZ6068>?<:;<=BEKC639:6456>NOTbitzmBCJFGO_hP?T\JB=8:AJRHB^xy|iKAEGGFFHJKKHBC@9aaNXVOJFD>988=BB>88>BB=:<=<=<8510249?ACFDC@?<:86447:<<>@CADLNKHGECA>;:=@A=78CICAFJKIFDEFB<;>=99;:974218BEDEEL]ijieab]K?<=>?@@AEF;2:BGQ[`^UE6:FG@:4115;=<=::LSMLE84885A\ZNPOV]TB@BFGD@=;CNG61954;AON=6;@?=?AA?5--.05842466:>ADI=58<=3,:F=7BGFEKPPONNOLHILPOJFDCA>747?HC7..05CPNKKIGEDB@AA@?><;>?ABFHGC<755220/.3;@<53:A>40110011110/38;750/33345321231+((-3861,,*(***(&+9BBA@;53233334535973144>7+'%%%$1@:630,:KXYSJA@D:@`tuZ1.124565373=:75>G@/4<@=3*%-5301132/.3:<;:9841/..0352.--0>M[`VB4./47BGA959><96MNPQQQSSSSRTVUUUTQQRRPPPPOPPPPOONLIHGHHGFHIILORSRPNNMMMLMMNNOMMMMNOOPQRONLKLLMMNOQRRRRSRQQSQNJJIIIJIHIIIIIHIHIIIIIJIJJJJJKLLMNOQRRQLHDBCDDEFFGHJJJKLMLKIHIFHTYXVWY\abaabccdedcfh_OGGNW]^]ae`^cfggj[FHPRQPOPQQRRSRQNMMNOOPNNPPOOOOQRSRQPOOONONNNNOOONOQRWZZZZYWTVZ]^_abaabbb_iwcX[\XTWXUW`ecbfllf`]]\[]__^`c_]_`YQTVRQRTSTTRW_jl]Z_dha[URTWX\a_Y_YWX]][XXXXWYYXWWVWYZX[\Ya{~uplggedbmrqrqrw{[MNO[x|qxupqr{j_``YUZ[YZ\^_`chlqscVPQSYclma\`bcgiij~}eJ?LZWXdbUV][XOJPVRJBBHHFGGOKt]ILKIFDDCDCCBBCHHGHFDBCCDGHGFFEEEECCCFGECBB@BBAA@BDDBABBCCBBBBBDGIIJLOTVOJIHJKKJIHHIMLLLJGJU\[XXY[^`^[WSOKHGGHLKHJIEA@??JRZcZLFQac\]`abYHBCBDJSRRRTWXYZ[^a``_____^___acddfdQHUbab`\OIPSPMX^bgf`]]WSQLHJIHJPQG>CPZ^bcdedeb]WTRQQQPRUW[ZXRSWZ[_cd\TOFCGKQSUSPKEDFIMPNIGDCEEEJPSMGGJNTVSX\WUROKE<>ABDFHGEDEEBAEGHIHIHFEDEFFHJKJHGHIJJNU\_^YMFOhzywhTJFFFEDEFGH[vzplebcqtgXQPNMLMNNMScssib\URRRQSWY[]^\]RcľǶzx|rlxswukjikmheeeb_ZUSUVUUUTTUUUUTRQPONKIFLUU^wvd_^`ab`\WVXZ\[[ZXWVVUTTRQRQRSSRRQQQRRRRQRW[[\[[ZWY[[[]YWVWWWUWYYWSTTSNLLQTVXZZXWVVX[]\\\YXY[cXEPjsrqng`VLE>9769?@=:;>BEHJMLJIFDB@?><;;?DIFB@AFKONE>;;:>?@><;::98::::;;=>@CDC>=Vx|ztbGCS\\_chkprw{vU>9;;<=>>?97=@ECBA?=;5457=DT[Td~{xlA?GDHMRTH>KLEB=8;AFD=<[~|{ePPMNIEDBFNLFDDA7\y[R[VH@AF=788>FFB<7=BB?<;99;;DNH93;@=;:73/-,-5DIA<89BB8679;8567;@DGA58<::>@HSN>>@BCA6,)+/35432446=@CH;8?@;/+5==BKIEDHNPQPOPMIGGLKIFFDC@>:45;=92//0;MPLKJIGEB@@AA??=:::;=>@AA;6543310/4;?;57=A@942200//0/+)07:982,-1245543465-((.663.++))*))(&+:CBCA;53243246876744667=;1))0-*4?AC<0/MUKTTKB@@2%0O|;+//14544160<;:7<==/7>:EKUZUW`bU5*6;7-())*,681794467:=?=0)/-&.;@>@;0)+356754562,1:=;889886556695/..1C[fbYQKGMTQSMA;:99;CNZYSW\ZURPOJQXWRKEFMIEGGSI;>Um?BJJGFEDEDCBBEIJHIFDBBBDLKEDDDDEDDDEFEDCBBAABAAAACCCCBABCBACCCDFHGIONLLKIHFGGIJIGHJJIIKIFGS[\YYZ\^__]ZUQLHHHILKJKLHCBDIOMP[UIDFYgc^`cdVEAABCIPQRTUWXYZ[^`_______^_``acccd^SWcfeb]QFGMTZYY^cge`ZXVPNIHJKIMQOEAJT]aceffeeb\TQQPPPQRW]daXQX^dikhd\QKEIMNT\^__TEDEHORNIHHGFGGKPRKEELQVXUVZ`aVLHGB@ABEGHFDEHFCCGHHJHJJGAADFFHILLKJIGFEGWcdb]PGNgxxxhVQMMJFCDFJIRm|z{pfjjdXSROKLLMNOQYmti^ZTPPQRSUW[]Zd\ZDzƿ{yqtoqmlhjnldccdc^YUTXYWVUVVUTTSQPPONLKHGSZZkyjaaaaab^ZUWZZZ[\[ZVTRRRRRQRRTUWWVSRRPPPPRV[\Z\\[YWZ[\\]YVVWWWUWYWSSTTPLLOTUXZZYVWVUX]_^^\YXYYeX@IeuokhcR@8679;>KXXTNKIEFJMMKJGEGGGEDACCCBABBCEGJHHC@>=:>@@><===;99:<<=>?@ACCAEBIk{maYPORX\]^_^WSXjpT@;>>>??@@=>A@CBAA@@FLPJ@<;9>P__jldU?GZdm}jWZb_ICVQToqcW75669=>>=AHKKC76CF:5568;4BG=Tsvouk>>:>AB?>>XzyybSWXSF=;8COMHFD@7T|}l]WZSGBCB;799>@DD?<:;><4012345:>BAA@>?><;=8888777=?BJJFB@@A>99:;;<<=;=FJDBFEBBC>DIJF@;514A?==92//049BD<=>;=<59BHGC?<<=?EIE738723431//2AMNLLJHFDBBA@@A=<603854434545453237;:779<<:85442///////278983,+/3567776872)(.51,*(+,//,**-8?AAB?7211443488:87558;=@?42J_XB7?HC5(,SoXPPJB=7.(%9tc('--.010//1.:97;;272.GU9.572/.24767:BD<8;<0,5?==8,'+577;><665-*179869888766662010.6K]_[YXU]iaTIAGL?//7?QRTUTTTTUUTVUUVVWWSRUUSPOPQPPRQPOMKIHIIGGIJKMPPPPOOONMMMMNNNNNNOOPRRRSTUVWUTSRPPPPQRRTTVWVXZZXSOKHGHGHIIIJIIIIIIJJJLLLKLLLNOOQQQQRTVTLEDDDDFFFGHGGGFFHJKLOSTTRQRSPMPYbghiiiiiiiklj_RLKMLLJHGFEEEFGHHHJKKMOOQQPPPQQRRPMMMMMNNNNNOOQTWVVURPPPONNNNNNNMMMLLNU\]]adddcaababbbdeecabdefc]VUVZib[airhgd^Z\accb`ij]VRUcgUKOQRRRV[]`gkiYSX]fh_XVY]X\fhgb_bb\ZYXWXXXWVWVWWWYYXZ\_`[[oxqqpmkhihgjpspnqsutubMPQUZY]qqclkinoicbcimkfgkmfVRQRX^fmi[Y^_`dfneNAABLU`b`_^QIFMTSY]SJJKJMICFGGEHD=@ciFBLNMPU[__[VQMNSTNNLFEJNLHFDFGHA>>AFFB>>@ABB@>>AA?@@@@=98;=>@BDDBDCBD@;Ogf`[YUSVVMKKD:6A]bLABBBBBABABBAAAAAABCGGA;:;<::I[greUJA@Jg}yd]ek_JEUSN^wsZ62745<><>EMRJ=59DC8578877=621133469=?A@?AA@@A>9653339>@CFC@<@EDBCA;9?E>79:868:855;@DDBJ[defea][UE:9;<@GJD<7315=CGKLJIFJI>;<;;98;CIOQQPONNF839@FUU;+-2<@D\kd]TFDHMZXKNM>.+28A?79;>A=7579=EFA@ACC@=8459=@;9:9EHB?62JSTRRTRG9;EIJHGEDEEA9310/0--/9IONLMKFDDCA?>>>=4,/45431144657779;944542211255211243576434320-.377:<<99<6+)-,*(*,07:5.+00'7OKD?0,-.28?CCABC<-/7;:5+&+499;>?743,&(,38788887753/,,/0--2;DGJKHMXa^UO\dM,&.4RRTUUUVVUVVWXWWXXWUTUTSQOOQQPPPQPOMKJKIGGILMMMLMOOOONMMMNNNOPONNOPRRSUUWYXURQQOONOPQTTTUVVVXZ][VQKGGHIJJKKIIIIIIJJKKLMMMMMOQQQQSRRSVVSMHEDEFFEFFEEEEEEFEGKLLMLLLMMIKT`ehijjkklllkllaSMNPQQQLIHFEEEEGHHJLMOPSTTTSTTUTRPNMLLLJJLNPONMP\ZRRQTURPNMMLLLLMLLNMRXYZ`ddec`____abbcddbbaaceb_^_ake[plW_`[SUZacbfml`WPVkbMLPRSQQUZZ[hpjYSUYfkd_^\ZTZfihghmj]YXYWWXXVVVVWWXXYY[\^bcdt|vvtrngfglpstspnosx{}veWUVUTSVaqqjzj]jkhihlkjgdhqohkteTQQQX`iojaY]daafpv^BHRZ]]XQWcSDEKPU]]ODHQNIFBCEFECCCEBJHBLSJ@EJMKFCA@DKNKGFEA@GOLDBBCDDEEFFFEEEFEDJLGCAAAABCAACDEGJHFEGHIIGFEFMNE>=?CEFFFEGHHGGBF]lc[[\]^____[UNIIHJKLLNNMKILRNGFHHCBG[gXPam_H@@@BCFKORTUXYZ[\^___^_`__^`bbbbbbba_^^ZNDAAACJRRLP[de[OIJKKJFGMOKPSI@FR\dgghiiggcZPLOOOQRSSTZXHG\hlqma^XIQSPRXegXTSMHJJIOTPKNROMLKLLKJFCEIO]bVPSQOJEIOQMJHGFBAGKGFGGHXqyof\agbYNGGMOQPKEGNY^\[[VIDGMSOZtrg_XLECDEKOKI`lPA]vl[XVUUPLLLMOPQRXefWMNNMORSTX[]cSùĿóxmnzypwq`bmja_a`^[YVTWYWVWXXVUSQQPOMLKGEMWVZq{ngcbbabb`^^`_`]]ZYWWXXVTRTVXXYYXWWWURQPONPW[\\\[XWWX[ZYXWUVWWWVXZVSSPPONORUWXVTTUTUV[__^^\XWY[bXKHYkf]URPNL[j\NNHFLUTTVY[\XTUTPNNNJIKLOSSMKF@BA<::;?DDCCDFBADFFEB=:;<>AEMHDDCA@<:;745EWOCFMNJFB?@BBABBBAA@@@?=979;988?PdhVJKJCBYjaabcikmYL\XJGeyS446548;<7589;DRcqoUKerjoN38=D_od\MUlO14=AAAADEHPmweEFMC8347>=;;:7421333579;>??@@@ACB<84334;@AABA?=<=:5576558;;8:BC;8?GHFFB;M]WND>IQPZ\MC<0,/-0577743564369<>;:@GIF@<;:<@D?52:GRUQH=79GPOIBA@;73469CCABCBJUUSOLKHC?AA81047>HLMG<4/.-./1/11./7=CLKHLSWZO;7FSUSSTI7;KMMKIFFF@8467641.,.6DNOLLLHDFEC@??><91/57547854456669940//---0256656467645300/00.--389<<867:5,*.134569==8439FKB>CC??AA;7:;97885455BUNACGKPXYOEEKMHDBAADCAABEDCCDS[P@?FKIC@?=FSTMHHE?>FMHBACDDDDEFEILLLJEFT^UFAAB@ACCBCFHNLGFFGHHKLJHILKD?@BCCDEFFGFFGE?Gapi^^]____``\WRLJJKMMMOPNMLJIGFED@@CP]\OK\l^E?AABCFKOSTVXYYZ\\___^_`_^^`bbbbcca`\XSKBAABCBIW\RNRW_]OFHLKFBFOPLPQE@KV^fhhiiihfb\VRPOOOPPMNPNHK[fli_Y[VSRTRV\eaRKIGJPQSVYWPORQPPNIFDGJKKKMX^UNLIIIFHNPNIEBCCACFEGDAV|qptqjYHEKMNNKHLRZ\Y\[PDBDA@=Jmzrp`JDEEFIJIL\\HF^}pYSUUTTTQMMOQRTV_e\QNONORVXWV]Mkúķ}qy{fzszzeYcmfacc`\YWVWWWWWVVTTSTROONNLIEHRVVfztjebceeb`_^^``\Y]_^]\][YVTTVWWYYXXYYUSRRRPPVY\\\[XVWYZ[WVVUTUVXZ]YTQQPOOQSUUVTSTUUUUV[__^^\XXYZ]UOPZZ[[ZSQPO_aQFCB?CKMR^d`ZX[^^]YRMMOUZ\\YX\Q?<<<:8BFEDCB@=>NbooXJDB?><9899:BPI@CGPRNGA=<>@BDCCBB@?=::98998776=OQFOUPIGJH>Lglk}aO\QFAG[E;855558?CCFE>534555589E`q{vfZ\[RPO>8ABGapK32>KD;<>>;=@GPUVer^B=?:8877??ACCA<75632?HILORUWJ74?GF>:89=;68=AAA@?<869:5123334779<==>>@CGHC>:7769?BCB?><:9623666568965:?<8;AGKGB@??><;:8879?@?>?CDBGRZXWWUTTI=9:::9;=;99846?FFFGJHA>>;9<;9=:4=Va[YZXSD9HY^ZXUUN4.>FB:BRQG?CRXUWTC6/+13..1562.-1531488788AII<440--/1/0-,6CJOOLPY\^]N8.6ITSSTL@:5331/04431/02437;:898765210/144311.,,/2784/0462,,/48:88=?=;86:?A@BDDEFFD<88876686345:==10]|e@>3++.)5IhfQG=0-.,.78.*)))+,/10.3.1L^kgO946:>DIKJJKG<2=NB3204:90,7UoiM@BB9389,6RQHPZTDINLVO8Tx]XG;=4-(+6R\WUNNMDCJC<:;;6,()*.2.*-/.-*()*-.*(***+068:98720/..+,01.+-7DLJKG`nd`ZXK.#&&TTUWYYZZYZZ[[]][YXXWWWUSPOOPPPQSSPNMNONKKLLKKMNLLMMMMLKMNNMMMMNMLOQQQPPNMKKLLMMMMNOQSRRTTUVVWYYYYXWRMKJJJLKIHHIJJJKLMMMMMMOOOOQRSSRRTUUSPKGDCDEEEFGFGGHGFGHHGGGHHGKQUU[fkjjklmmnonlmj^QLLNOMKIGFEFFFFHJKMNQUWWXYYYZYXUSPMMLLMLKKJMPQQSUSTWWVWVSQPNKLNMMMPPPPQTY[[[YXZZ\_``bcbbceeeeddedcdgeelbUUUUVUTdu[^`\XY]`WMT[XVVUUUTTWZcgYUXXZ`bg]YWTQ]T^gime\\\Z[ZWVW[[XWXXYXWXZYYV\{}zxiadflvzxxxwupmuwxjWZa^\aheb_^YTKGLR`kovzqq}|taVX`inhZRROOXeowxhSXbfefblEEMJHDC?=DEADEGJNOKEDFHGCBBABBAAACCDBEU]RC?DGEA?<?BCCDDELRSRMGFLXRD@@AABDFCBDHNLIGDCBDJNLIHGFDDDDAABCEGHECEB>Lcoqha_``_^_a_ZVPLKKMNOOOOOOIDCCEC?DIMMLJLS]XE>AAACEJOSTVXYZ[[]^^^^_`__^`abbcdb`\VNIECBBBBAHYc^VJFS[OCCGIIHIPQMQNBAP\bgihiijifa^[UPONNOLHIJGJT`dfZORYVTSTQR\bVIECDJQWZ[\ZRMNOPTSLB?EMPSSUW\ZSOLIHHJLLJGEDBDB@ADHGFWt~yncWLJKKLLIHOU[[Z[UIAACCD@BXpxu[FEGGFGHEFONHPsvdXVUUVVUUX]`_]\bjg^WVSRRUTRSIPƸƳĶ÷t`t{|}p^\giceif^[YWVXYYXYWUSSRSQNMLLJGELVV_ttjhfgghgb]\]`_\_gkhb^\[YXVUSUWWWXXXZZWUTTTSRSUZ]\[ZXWY[[WUVVTTVX^`WPPPQPPTWWTQRTUWWWWVZ__^^\XXZ\[YSSTOX^]QLNSUMHFCAFOTW\ee_\^dedc_XV\]^^\[WW[R?8:::8ACEDCDMag^TJFEGB;9:;;<====<:9:98756=>AOWSOLIB=E]uMBI@CG8>@FA73555>DDA>825;;8779EXgsrf]eeI6=G@;DH?IiUAFFJSW[aeaRG?=AA=:<8785122246879<>???ACHKIDA?;725:=A@<9620235;>=;98745>>BHE:7;<;<>DE<59@@>@DDBBFNSTUUTSPF;999989::88;?DJJGGKMLD98;:=@?B@7C_jedaZQAEae[[XOTR88LIEFELNFAGQSSQI;30-16438:6/-288103425;76@EC?<;::@D=2,:\lWA:=EB8336558;88BCABB@?@GPUNDB@=;87:977;==>@C@>82681/000/,3HWUMNX_a_`X>4008ENRTNFMTUSRPMKJGEC@@B@=;7413?KOLKIGGGECBBBDFGBCE@=@A<411112479756677676872//016<=94420/0011.*,/0/.0235445=;993.2;ACCCEB<889:8698558853+1ev~aKJ7*/71?S`\KE600/.3>A6))++-./0003/CdhaZP@778;@ILPXVPI=BPG3/05?D>53CSK;:>GMIDAABFJIFD?>?@ABCCCEHJKLLGEBAA@??@ACEGEABGLPPKDBACGJIGDEFFEECBB@@@@ABBD@AWjkppiccdcb`b`\YTNKLMNOQQOOPLDBA?CNURJECFIHLMDAAAACEJNRSUXYZ[\]^^^^_`__^`abcdfaWULDFGEB@AA?GX\WVK@FPJA?@IRRQTPMNG?ET_dhiijjjjf]VROJFEEKKFEHEFRcd^PMSXTSTRNO[]LABBDIPWZWWTLIGHNUXPB=AHLQX][[][XRKGHKLJIHHHFCBBBCGKNPSbzy|uYOQOMKLLIGPU[YXTLFBBDDFEBH\kgQDGGGGHJGEIJGNkt_^[VVYWWdsvttqg\eomhb_ZVSRRRSFͳ«ȸű{nnpdbfhfehje^[YWVXZZZYXVTTSRPOMLJGEHSY^mtkijklheb`^`ed`cmtod_[YWVVVUUWWWVXWXZZXWVVVUTSSX]^\ZYYX[ZWVVUUVVY^ZSPRRRQRUXTRQSTUWXXWVY__^]ZVX[]_\UOOS`aXOLT[XSPKFDOTXdjgccfiigffe^afgc^ZXVOKG>88899=GLLD@;QuUPPKEB??>>@DIIHJU^SIIJIJKG=9=>>@MQIRfaVLKE?>B@;?EEEGDA@AACB>>>><976888:BLONJIHFBHhY4899AD4;DJJ@6687;=;;87@QZVHA>77>C>8765;B@?MZ]b`XNHFHLMB;7358:<>ACFE=9AG?3121247868<@A@ACCDGHFDC@<3359?>84201557>EGC;5535=?>=>AD?109<=CFLPF87;97@ABA=Hbnkg\SICRZOIICDTUDGRJJOGINHBEIGGF?82038;;:>=6008=7112007;208<<<;:98AGC7,5LVH;89>B@?CEC@><;=CB==>??BIMLE@?;:;89?=9:ADCCCB<23127420.003DX^P?DT]cgeP3/1107BKRQNSSTTTTRPMJHGECB@@?<9647DMOMKHGGECEFHIKJGGFA>=<831222379730.-2=@:7999:7005889>=:765544420.,)*,/13543246:=>@BE?-!'6?A@BFA;<@AB=:;:6682/,'.XnryLMM<0/62SWOD9;ACB?;=KPR]Z[e`SPD..59;>BA::A@<::@A:860=>??@@BDEEBBHMQRQMIEEFGHFBDHHHIJSVSRQME?@CACRYLWvxkhhhfbb`^^VNKKMNNPQOOPNFBADR^]SGBACEDEGECA@AAEINRSUWYY[\]^^^^___^_`abcee^ROEAKSLB@AA@FRRMMG>@GE@?AGPVYWMJJCBLZbehjijjjidYQQOICB@HKDCDEAH\g`[\]YVVTOGLXWJBADFFGMROIDDGDAJVWNGCBBEJX_ZX_cd\PIHKMLLMMMLHFDCDGJNOHUz~^JOPNLLKHGMPSQLIFDBBDDEEEHLOOIFIIIJLMLKJIHTmiPZXVWX[l~ytjahpmifb^ZUSRTO{ǹƴɷõ¶|noyidfilljhec^ZWVUWXXYYWUSRPPNNLLJHFP[\htokkmrnia^`aeiddmnid_^^[YXVTUWYWWVXXYYYXWXXYXWVRVY]\YY[YYXWWUUWVVY[RPRTTSTUWTPQSSTUXYWVXZ]\\[XWZ\^aVPLSVZYRNQY^`^WONLKKYgggknomheeihehgeb_[XVJ??=<:88;CLQQJ7EKT``TKV\P=:BD@DFEGLKJIKLMHCDFFA967:<:9FHB<74458=ABCO\[M@=BOUVTQJCACD@<;98996;R_]`]NEMRX]]N8155478:=BFB=>CD;2122466667;AA@BCCBCCCDCB@A?;<<852346669>DKH;1026;;87=DD9/1:@@DKOPG<9767;>>@ABJSSPRSPH?;::::75756CWbc\TRTURPQA.4ADEC@?AFTeiaSG@FM?4537EQRPPOJJKFHMICDEADD:558>?<>>=;60189300/07ED64:<:9;:9:?DE??B@A=658=BEFHHHD@??=;<>@@ABDHGB??;49CFILJ@9JONMJGGFEFIKLKHHFDDB=416971/163.,+*+3<>;;===:636<<999999:998:<:40/-+--031111248=DHLOE0%-7=@ACF>:AGJG@<=7573,),+.=Ij`>BLC8/./796/0B>21.,-382,)&(/100247FLEL@9:?DDA;=QTS]]bmo_M=++8=;=FKGFFFDA>@?61337DMWT8&5GD6;KWUV[M9/+%*9EE71ChqoutWELE876652,+//.-,*/2110/0//11-+.39;;:983+&'(()*--*)+--++1@JWTGEB71/0-+YYZ[[^^^^^^_```a_\ZZXVUTTUTRPONMLMMMMMMMMLLJKKLNMMPQQQSSRONLLLKKKKLLLLLLKLLMMLLKKKMOPPOMLLLLMMLLJJQY_efispZIGKLMLMMMLMNNONNNNOPPQRTVUUWVVWWWWWXYXYYWUTROMMKJJHEDEFEFIMLNWadfhiklklnrqpoj]QNQQPPRPJGHIIIJLNPSUUWYYZ[\\]]WRNMMNOOOOMLKJMNNX_[U]b`YXZ[ZZYUQOPPOPPPRSUWVWWXZ]``^[Z]____``_a`bebko\U[hspbTU]\a_WT]dZV[]`ZRSUTUUSRUYX[Xafa`ca^gzwpUYYX]]a\Yagd][ZZ\\\[[[[ZYXWWYSWtb_afmtqkpy}znowsbZdoswob`bba_^]]^`cYQPQPNNNMRVTTXZZZYYZZXSNN\p}|z^JLQh_CBGDEDCDCDDCBCCCCCBCCHUUPD?AAAFKPRLCBDC@EUa_QEB@D@?IZ`ZTOJHHEOZXUPNRX_b\NBAAA@@A@AABCA??@@@BDBABEIMQSUURMLIGIICCHILRYbdeeedYIAA@B@@;Muonmidd`_`WNKKMOOOOPPPPKFKX`\TID@@CFJJGDB?>?ACHMRSUWX[\]]^]]]^```_``bccdeWGBDSXMBACCAEOVQF>:@KLFACGHLX[PLKCGT]cfijjjjlkaSPUTSOHAFJDABCBDUgiif`YTTPFAJSTPICCFC>AJIA<<>CGKJF6MwtlTMOKHGF>DS`VA@FBAGKIFJ\dWHFLLD?EQ]ZE<;@AC<7=EEB@AFHGFGLRUPIGJKF<78CFB@R]^[VZK;76577>FOX_ZRNLJJGC@?@BCDAAN\ZTZZG@RZ\XLC>GMA79;<<>@@?AB@:3124677645:@A@BCCCCBCDDBAEFA95322365446:AIH9//38:977>D=5108FFBJPH?=>;;<=???@BEIIJNQOG?<:::<;95.5M_^YUUWURQNIB:;FMNLB;?CGUaYJ?>F>3116FPPQSSNLLLNMKIHEBDHE=:@GJC=AA??80/42/12/4BQNB@@>:999;=;?HLMD754.09BGFHJJGCA@@<68@DDCBDE?8768DPVZZYULB?BA?>941.0/1563037APWM>756>Qhb?,02./09FLNQQRTTTTUUSPMMKIGEEECC@<:<;>@>61120,-45-/22/-4BNONNF86<;=ACCE?>AFJGA@@6396/+.3547`O@ENRG7CVTU\]hnpcE?<5<1*(9H@AA81/.-+Z[\]]]^__^^`a``_^\[[YWWVSSSQQQPONMKLMMMMMNLKLLNOPRSSSTTTRPNONMMMMLLLLLLLMMMMMNMMMLLMMNOMLLKIHGHJNVblpuvuyx^LJKMMMMMLLMNOONLMNOPPQTWUWXWXYYZZ[]___`_^^^\[[ZYXTQMKKIHKMPWadeca`_]]_enporsj^TRSSUVWTPLIIIJLNOQSSTVVXZ[[]_\TOMMOOPPQPPNKHILRVZ^elhYVY[_caZURQQQRQQQRSSTXXVX]_`a`bedb`aa`aaacddcca_bhqmaV[d]]YW]`_TUhgYRUUTUVUST[^XSU^dgkhaT_yzrXXY]bVY[V\eib^^_`^\[\]]]]\ZYZXU{m_[`]\fttmoz}zsstlb]]abnwncbecba`acfbYRQRSQOPSTWZ\\[\\[[YY^_VP^u}{wWIMP^\F>CFEECDCEECBBCBBCCCCCGLMJB@@@DJKIEBBEE@EUgl_LBDB??Pa`RIDFGFDMVXXTQPNQ`h`NC@ABCDBBAABB@?BCDFFA?BFIKMPQPRRNHGIHEFGGNZ_`abaa`\RGA??>?AGttqrmhg``bYOKKMOOPQRRQRPOY_[RJCBA@AFQPGB@?=>@CIMQSTWY[\]]]]]\^```aabccdeicKBLTLDBBDGEGU]RE?>DSZSJFIHELWYVK@JY^cgjkjjknhZKJMNVWKBGJB=@CCESekgb]WNJFCAIORQKCBDC?@GKE@EMMGGHGEFMSODFR_^`mtpcUOLKNPPQQRUQJB?@BCCFHHJSPBIECCDDEEDDEEFGCABCCBCEEEEFFGHIJLORTUSONLHK_cQUUVWXV\~{spoooqlhb]\WRSPTоŽͿȸ½~sìyng|ywylam|xkd`^^[YXYZ\ZVTSQPNNMLJJIJISbfpzuqutlllkjikospmsulc^ZYXWXYZYYZZYVUUXYYYXXXYVTRSTRVZ[ZYWXYWWYZZVSNMQTTUTTSOKOQSY[]ZWVXYYYXXWWXZ_a]IGK^TCGWb`\\]][[XH?G_u{{ukfgZ`tlakxaYWSPNIC@?@@@???@>Vij[G=<;:9;?@??>922346788759>@@BCCDEDEFFCABF@633234422328?EC5-0579::>CB711/9JLGJLA=@@><;<>@?@AAABFLQMD><;;:=CB81=SUF>AKPHDNL=?FCGNPSOD?CHRXPA:>>5225FSTTTSRROPUVQLIFCACDC@CHKHA?<HLB8300-/8DLJILLIC@><;9;?CCBBB>70,0D[a^__[WOKRXRLF@?;2111122226BPO@::9825KM7+/1.-3BIKMPOQSSTUTUUTRQPLHGGFEEC@=@@BHGDBADEBB@649:4106668UIL|}Q96;=<=5/,).53/.-.,+*-1202330,,'5WG49HT]`T>BRNPRRfrtjKEE??=FOMHLJ<358?KPQL?>>0)..-,(.;ER[UTRE>@CEE<+'5HJ;@]lxoM/8F:9AA97542/..11*'+2542211334455785210.-++,./279::40-,-/12357861.,++Z\]][Y\^^_``_`a^\\\[YY[XSRSQOOOOOMLMMMMMMMLKKLOPQSSSSRRSSRQPOONLLKLLLLLLMMMMNNMNNMMLKLNLLLKJIMS\acglrttttzxfUOMMMMLLLLMOOOMMNOPPQSUVVTTUUVXZ\^```___`aaba`_^^^\\[Z[]acfeca^[USTUX^elpsspme[TTVXXWWQMKLLLNNPRRSTTUWXXY[\WQMMOOPPQQRRPMKKLMQZ`im`YXY]bb\XVTSTTSSRRRQRVXVX\\]^aefb\[_da_cfdddccbcdddeb_ad]Y_eie]WQ[fiaZWUUUURT]_[VY^`fkg^POdzpVWhojWXYWW\ge``deb^\\]]_a`_][[XZpnUP\^WRR_ntomv{|rqlc`_ahaXajfcgebbbccc_XTSSSRRPRX[\\\]^__^ZY^ebW_vxuTFMRXWHAACDEDDDEFCCCBBCCCDCBBBCEB@?ACED@@@ADEABN_iaLCCAJU^`WE<>ACCDKNMRPIFCBO]c\OGBACHHEBAAA@@BGNOIB@BDEFHIGEKOKFEGGFILLQXXUSQOMKKKHDAAABD@Muusnlb`d[OJKMONOQTUTTTVYVTNJHECBBCSVG@@?>?ADINQTUWY[[]]]]]\^_`aabdcdgefgODQPFDDEEGIOYVHCFEJW^]VKHLJHO[WC>O\`dgkkjilpfREGIGKPMIJH@;?CEGMYcbXSSKEDDDHLLLJEBEGFFINNJHKNJECCEDCKPLNV^VO\lpeQGIKNPPPOQRRI?>??BABFID;_wE>DDDDDCCDDDDEGIECCDCCDEEFGHIIJLKKLOSSOLKKKLMNPRSUSWYX^p}vsolnsojga`WSUK°Ģü|t˾xmotszucfuvkca_]]][YYZZWUTRPONNLJJKIIM^go}{tu{nlkjjnrx~y{xpd[WUUUVXZZZ[ZXUTSSUXYYYYZXVSRTTPQY]\YWYYWWZZXRRNNQTUTTSPLNQRU[]XUVVXZYYVVXYZ[_b\GFKgbJYprf^YZ\\`SBHN`qsbTQZeVduedx_MJLNQPF@@DDCB@?>AF_bTWYXWOBBGHIHHjvanrRAEMV\[UNNQLJLIE_TB9?BEHQMABJKLLMPMIHGHM\fdb[PIFC?@GEDDCBABGIB52?MNGFEEDDCCEGHHIHGKT[gke^[SG=?CA?EOYYPXbm}sdjY<7?BDA=99=L]`[ZQ;24547=??@JG@KYTNX^XQWPHE@<86=EMTTUV]cbef_PC844;CUennX@:::88<=:99622345579887:=?@CDEGGHIIFCDD>85556874665;>><4-0679;=BFB7101988:=?AAAB@@BIMH@>=<<;>DD??HMB4.2?F<6BD78B@@BELRNEBGQRG;876764AQSRRLFENSOOOLIGDBBBBB?BHIB:625BE>863/18<:68>@?87985786@HGHIJKHA=<;=@@AA@@=72-,=[ga`b]VTLGQ[XQJCA@7221001238GPF;8689/(15/,/0/-4AGIMNOPQRSTTUVUUTSOLJHHFEEC@?AGKLLJJGDB@???DHGLKKLKC86894003554336876:@B@95137:87::8997558;:73276/+-./0026;?GJJLKHIKKE@=:>LJIHCC>7754554/.03355CL{~hQCBA>;40.*),,.000/..0242010,)**R]5+9CS^`_J;732/.0450,.599886530////25322110,++++1;@?<40.////1366430-***WWWVUX\___aa`bdd^[\[ZZZYVSRQOMMNNMLLLMMMMLKJKLOPPRSSSRSUUTSQPPNLKKKLLLLMMLLMNNNOONOMKMNNNMNPT[\ZYcimjflrtvyzwlZNKMMMMLLMNOONNNOPQQQRTSQQQRSTUWZ]][[^`cccc_[YXZ^`abbcddc]XVTRPPRTUX`eiorrrrpk_VVWWVVUSQOONNPPPQQQRSTVVWZZYTQOOQQQPRSTUVSNJJLQU\geb`_^^]\ZWTSTTUWXVUWWY\ZY[\YYY\]\Vcpdafedeedcccdcccdb^[cnkba^WTLXkdYWUUUUSV\\YYY][`kf\RKY{oR]yzra]YWWXdiggjg`^^^]_bdffca^`c^[]ZXWTOQYcpsmnz|pkhba]\ov`U]efiiddeda^\YXWWVUTQRWZ\\^aedb_]]_bd`cxzUGIQXTFBBACDDDCCCCBBBBCCCDCBBAAABA>>@A@@@@ADCBBFS^XHA@E]okbYD<@ABDEGFEIGBA@>CLT[ZNB@EKKFCAAAAACKSQICABBBCCBBCHKHDEGFFINOMOOKEBCCB@BDCDDEEEI@y||ytpfad^OIKNPPPRVWUTUUSRRQNJEDDBAQXF>????ADIMRTUXY[[]__^\\]^_aabccdfe]RHGMIFEEEEFLSUJ>DIFLW[_\PMQNLRVI>??AAACFFAHYUKIFDDEEDDDFFFFFGFDDEEFGFDEFGGHIKKKKLNMKIJLKKKLORTXWSTSKJ\mrrokgn{ysxudTTJzĹƩť~ym{{ntxxi_hmf```_]\^^ZWVTRSTSQOLLJHJKHIVdm{zztnlkklpy{{~{ia^[XUVVWXZZ\[XSRTTTSVWYYY[YXUTTTROW^\YYZYVWZXRNPPPTTUUTURPRRTVUSQTXXZZXWVWY[\]_cYFDNnjUnwjd]UT[cI;CUf`VC99M_VepgtcLKOPTQHCGHEDHIIIKTmbWVSNMGDFJKKMPx~|yjbYHBCEP[[PQZVIFLWdjV;8DHIGECACKOMIEDHKOQTXeihml`UMFCDFDCCBAADHF<4;GOPLJJHGEDEDBDFGHGKNUdgcb[G9:BDFIFCILJLU]otwqN7:@EHFHJGVZTSMIH;24446;AB@?:E[`QNX]WPZZNG>:99;AKOLNU`lojaUB77=??<>;9>>865228<<=?CFA70/29>BDDA@HK@7503=AAHNJFB=;:7896:B@???AB;51+3Pjhbdd\VRLA=BGD<9;<8531000118HOD9458830//01101128@HNNPQRRSUTTUUUTTRPNLJIGECCCCFKMMLJFD@=97358?ILIDA;67653004544468866;?@;3--38977:;8664335788746982.,-,*+/8BKPNLKIHJMHA949KKJOLE8+(,01/,()/12376U~ofOC><;41-)*,,.12310/01570,+(+(3R9"6:.;OZ`M8@A==6*'/9>83468<<44Lcfkl[I[pP118BJSCEMLSORSNQC0/655322245335547::99875000/../012230.,+('/>C>:400111259986541++-NNNMPW]__^_deegga\ZZYWWYYUQPONMLLKKKKMMMLLIILLMOQPPQSSTVUUTRQPOLLLLMLKLLMLLMMNNOOOQONPQQQQPRTTQORY[]cilrwwwuvxn[PLMMLKLLLMMNNMMOOOOPQQOOOPQPQTVWUUZ`a`_^^[VSSTUUWWWWWVRMLLLKKNRTUU\fhkqssrrsoeZTTWWUTTTRRPPOPPPPPQSTTUWYXWUUUWUSRSSTVWWTQONOPRW[]`de`\ZYVTSTTUSZ\TY_a_]Z[\\]YWTVT]wijhdcddcefgica``]fto]UWWOOORVYZXVVVVTUZ\ZXZ]Z\hjYRT]tqQ_zxth_YXYV_hkmmf]\]`acfijjgc_gha`d`URUSRUYgrolz{ieccc_Yi~wd\`gjjhfeb_[ZZ[[ZZYYUSY_aadhlfcdddcdgeg{~d[LKSPDCEDCDCCCCCBBBBCCCCDCBBBBBC@<>BFFC@DKKECCFMSLA>?ATnsjdTB?ACFFEECCD@>@?@DKSXQGCEGGFBABAAAELNIECCDDDCBCBCFHFDEEFFGIECJMLKKLHDCBACFFFHJOFTČ}{zwqfebTIKOPPPRUVUVVTTRPLGCCDDCCLNB>???>ADIMRTUXY[[]__^\]]^_`aaaccd]MBCGECCDDFIKKQRG?HLDHOPVYTTUPNUR?26DXZkjieSPVTQHCHNJECJNRRSUbZSXQKGFHHJLNOQ^x|_OLIFB>GTXSW_SABLd{zP6<@CCDFQNEEB>>HEPesrsw[66@AEIKPX^gV=>=9==65786;FMJA=>954-0DMJC>:986425888985465433678;<57=>?CC=;@A72788?B@@ABC@9102456?>AC>:9779=@@?96;<989:5013336676789<==AA:5326>DB>@@:=EIJLPMDAFLKKNOI@=:65;GD;>CDB>94017>?:8;<76;;67=A@?<<:67:=@A@?@>;=AEHINQMJE@BB@>?ADB:2,8Xiebca[WTK=13:713:95641/....1=KH:9DE<8855663356328Ck]YLA=<:3/,*-13687632//.45-+-)),<8 7Y= )7FQLCAKUPH@4+0>DEF<>FCCB<7>FIC?>60-+)$7VVA9<=;80)8SYesdWf~j>/74=^^bOCLMOQSR<'+01035569810699889965886441.-++,,.02222/,1?C<43322357;?=41585.-1IIIKNRZ`_]_ca^^_`^[WTSSSVVQNNNLKKKLLLNMLMLJIKLLMOPNNQSSTUUTSQPNLKJKKJJJJJKLMMMOPPQRRSUTSTTQPNLKGIT\ailnsuvwwvwxl^PKMLKKKLLLMLLLMLMNNONNMNNMOPPQQPRVXUTUVUTSQQONMMMLLMLIIJJKKLLMPPNQ[bciqssrsupaWYWWWVVVUSQQQQQPONPQRRQTWXXWZ]]YUTTSUUVWYZZWPNOQRTZ_b_[YXWUSSTVVXZTV^`^[XZZZ]_\VRSYgmht|sohaaafln`[YZeqn`WXOIHIJJQ]\ZXXWVTRTXYY[][Z\`VQallcQ^z{wf[WZ\WZ`abggb^]_fijmnja^_a^[[[ZXWVRQV[aknpywe^`bcb[avxi_djjjfc_ZY[\\\\\\]\UWellknoebmkhlmngh~rVOQNFDFEDDCCDDCBCBBBCCCBBBBABBA?GRVTPF?DLKCAACEFB??>?E\ke\SD@BDGHGECBBA>>>AEJORPLGA@CB@@ABBCDEC@BCCCEFCDDBBEGEEECDDEC@AIMPTYWK@DGEDFFGIHED;泇}recYMKOOOPRTUUVWVUTPK@<@CDEGFEB>>>=?ADIMPRTXZ[\^__^]]^____`bbdbQ?;BIIHFDEGLIIPPHFKLDEIIMRTWYTRWP>@Q^cehijjjjlgVHEHLNPQRSVSB;FOJGHHJNKKLKKKHE?=DKGBBBBBA@CGHFEDEEDDCCBEIGGEDFJOOMMQOJHHJJKKJGBCFEA?@ABDDDEEEEFGECDCCBCEFFGGGGGEEFGHIGFFFGGHJLKKJIIJJJKLLMNOQTY\RKLLLQ[hnlljhuzxvqgYQUïǶƾ¯ǭlh{uh}fb_[Y]_\[\][ZXXWTRRRPONNLIGHGEFVfn||plrrrtzymid^[\[[\\[[ZZXUSUWZZYXXWWWXXZYVSSSSUWWV\aWTWRNNOOPSSTUUUSQPQSWVUWXZZYYXUVVZ]`\^bb\GBKcULqgWhpqtoO;I[]QPH8=?MZiZU||xdRXYNEACGJGEDGNPPMJOZZYOGIHGGFJMONLas|ZPRRPHBIRUTT[K=@Gd{A6HJB>=Pa[H:;@?AORNS\`abeede_TNJFEDCCBDFIILNOPRRRTVVWVRLE@?BFGGIHIQYcpvgI26AA>87FF=OXZcsxtcB8CDAEILOYb`G2588>C@>??=BJNMKC@Pafd_^YBOPUUE;?==CJJJMWjjYQE65<:7;68<=<=AA<>C>657?HGCEFDB@@=4/48:>DEBDD=64536?EGFGHD>;;:>A>:9:;:=BA<57CG=447522212478788659>@=84238<=738?CMXYUONNEBQSOMJQJ54@>44BKFBDGHGD?:69??<;<=99?BBEIHGE=;:557;@C>:=?@FLJFHOROKJLMKHEEDDE?2/=Xca_^ZTSPE813751/54258531100/6FF=HRMB:66775557930;JSVUPKHDHRTTUUUUUTSQOLKJGGFDDGKMNKFA?>;96:GOL@5/156668628?=::950/386311/289876665676665557:=;4037;<;:98649=8?KMPOMKI>-*272,)()*+.....,/?A6]hHGC?=;81-**/579>A?:621/1/-/1-*9JHI_uG#&+0:KUJKZYROB8=LD@I=?BC?>6*(/GbhYB7765449CHVlptz}~_8/36Tge@9XXOLPQ=,27749;::;60058:;:87647;=<;61/.-,+,,39<:854=D<.0743478<@=0(/66335GGHJLQZ___\ZYUQQX[ZUTSPMNRQPOMKJJKLMLMLLNLJIJJKLNONNPRSRTVURQOMKJJJJJIIIIJKMONOQRSTTVWVVVVVROPMIKS[`ekpqoqwxvvwul\ONKKKKKKKLKKKLLLNNMLLLLMMNNNONOQQNOSURPOOOONMLKJIJJJIJKKKKKKIIJJJQXW\jrrqrtlcgk[VXWXXWVUTTRQPQPPOPQQTVXXWZ^_YWVVUVVWXY[\ZUQSRRRUXXZYXXXVTTUW]ZVYWX]^WUXXVU\d_XZ]XPRlzliijhcXYeflh\ZXXOIJKLKR[[ZYYWVTRRUWY[][ZUTTR\ejYR[}c^]`^XUWWVZaeca`fnopqh[[^^\[[[YWWVSQV]dhilqnbZ^bdd_^l{|nehhhfda[Z[\]]^]\\]Z[emprqpgaosmuwj`irbUTSOKHFDDCCCCCCDBABCCCCDCCCCCA@CUddYOHCB??=<>AABFLNJGFIOTNEABDEIKGECCCA?>>@DJQPMLIB?>=?AAABBC@>>ABACDDDEEDBDFEDDBCBCBADJJMQONNIJMLKIHHHFBF9^ۥ}id`RLMNNQRTTUVWWVUTNB=?ABCEGHE>;<<>@DHLORUYZ[\^___]^^__^^_abd`Q?>EJMNKGEFGCEOQIFKNHHMLLOTUXRVYL>DU`dfhiijjjjaRJKLNNPQSTUOD@PVLHGGHGIJJHHIFC>>DGFBBAABAABCDFFFGHHFCBADHHHHEDHNTRLOROJEEHLMNJEFJHAACDDFFFGGGGFFECDCBBCEEFGGGHFCEGIJJJIIHHHHJLKKKJJKKKMNNNMPRTUYYTOLLPXejigjqzvke`VVIðȲ}xpgnxsa`a]\^][[\\[YXWUTRQQNMLLKHFFECL^ep{qsuuw~zofb\XWYXZ[[\[YWVTSTVXYZYXXXXXWWVTRRRRRTWX]`XTTPNOPOQTTUVUSRPNOSWWVYZZYXWVUVW\`a]^bb[HAEQFHvtMFayzePMEMQITZTFK@>LRB8Xy~nu~`Y\J?R[H>DJKQY]Q=69:<>B?>>=AFFFJYfZMZD26?CL]ms`B69CIE;5334688789779;843347;<;?EJGGEFFGHEA?98988<=86?C87EG816CIIEFHHDBEF8/4<@AACCDC>9775687;<9:CC:9@>507CLF9565321016999:7007==<9424:<758AMVZXSNMNMDAIKLIBIB17II98GUTOMOPKEB>;@C??@?>>AGFADJMOMB<<9778>E@9:=BINLGIPSPJMWZVTSQJDA>54CW^[[YRNNG<30043102224:;89993.6@=:BKKB83675345793.5BKRVPFC99BMUTTTTTTSRQOOMJIGEEFIKMJD@?>==?HPQD4.059988.+-06A<2152/--**,+,+--,=<:400,(+0103=DE>94223661,,EEWdtxB+/./8KYMIXWLF@@JVD7DED=1/8;@@=;4/158<>;666457<>=:854333339?A><959A;)+9844789:;3()/58;:IIIIIR]^^a\SOMJHKQTUUSMKKORROLJHHJKKJKLMMLIIIHJLMNNOQSSRSUWUQNLLJJKKKJIHIKKMOQPQSSUUUVWXXY[YSNMLLOR_lojhfjuxvvvusjZNKKKKKJJKJJKLLLMMLLLLLMMNNOPPQQOQSTRPPNMMMMLMMKJJIIIIIIIIIJIHHHIMRQU^gilstnhoqn`ZYYZZXXWVRQQTTSSRQQSVXXXZ^b_ZWXVVWWXZ\]]ZWURQRSUUWYYXWWUUVUXXV_[V^^TRURNMUejaZ[VXdiz}{|lXQ^u~kh]\[UQLIKMOQSW[[ZYWVTRQSUY\]\[WRRRSTZURYmzpbab_YTSTUV\cec_bjqtrha`bd`][\YVSTTSTX_feehg`^]addb`cp}wihjmjcZZ]adc_\\\\afjnststrbjxy{lTQkvKFPONLMMIECBCDCCCE?ACCDDDDEDDDDBAK\caWIDDDBBGJHE@@GPURLGEEORLEBEEGGFDDDBA?>=?HOPLJJJE><=AB@@@AC?<>ABACCBDECCBDEEDBB@ABAAFLNQPMMNPRQOMJIIGGIKC=̪gecVNMMNQSTTUWXWWVUQGBA@@BDHKH>9;<=@DHLOQTYY[[]__]]^^^^^^_`bd_VQNIKONOJFEC>BORJFKPMMQQOORSOO\ZF=L]beghiijjji]OLOOONOQTUTMFM[VNJGFFEHIHFEFDB>?CFECBCBBAABBDEGGHJJGCAAEHILLGCGNVUMQVRHCAGNQNHHHIGAAFFFGGGHHHHFEEDDBBBCEEGHHHHDBCGLNNNMNNLIJKMLKLKLLKLNPPONPTTRVaaSKMOVafc\`jzoa_YXLk»¼Ĺdz{tpjh|yf^`dc`^[Y[\\\ZXWUTRPNLKKJIIFDBGWajzvuuyxjc`[VUUTTVWZZZXUTSSTVWY[ZYZZYYVUUSRRRRQRVZ^_ZTSPNPPOQUUUVURRPNMTWWWZ][YWVUVVX]cb]^bcZGAAE@?]iQ>?SdZH;CEEA:FUYRVA5:;82Ccylpuc]K8<@A@CCDEGKUblcViz`MB?GHFBBGLJEFILHHZicca]\TMQL>;?CJITnlQ`v{o`[RG<;<=65ANJIYXLJ[`I@NPNIECDDFHHJOMHHLQRSTVYZ[ZZYPI=9AGHHPZSPovU86;BE=Jj|eIUwy``sv^S`eRAAHKV^TB9;><:89==<=;65=GHECFO\O=>K]iH?OVSA:AG]mqtxqQ75@KF<52347:97887898633348;<:>CDDEA:988669=CEDCDFE?:;??BHC86<;44:@GJC:66410247:;:71-3::899625;=76CRX[VLGNSPHCA:8?B=<:5BQG8AU_^XVUPG><<>DGGFHGFJMK@44=FIIE??=<;:=CE?;?DIKKJMRSPJJT[]]][UMFA99DSXXXUOLJ@5/.-.0//00149:;;::1.58642>G?77884245894--2:LWRB;743>OUTTTTTTRRRPOMKIGFEFIKJC>??AGKNRM=//59989;>AEE=4453126526=A?964378657;>=<;;;:976679853336542212326CLUSMHE?5457<>;8::4471(')))*.25=>;JKB713976204C37Biq70;7=BALIHUXGGGKJGRSKHC637:4;AB@>940159?@<6675455%)89557965871+.4<>>AFGIIGDDIQRKEDECBCDDBAA?@>BMRLGFFGE@=?A@??ACB?<>AAABCBBA?@@BDDDB?=>ADHLNQRQPOPQTOTQGJIEAKJEBa¯sfdXOMNNPRSTTUWWWWWTLGDAABDHLH?9;<=?DHKOQTXYZ[]^^]]\^^^^^__bc]X`_MJPQNJGD@;BPSIDJRRRVXVTUQIL[XB>P`deghhiiiifZOMQPPPRSUTOKHV[SLHFFEEFHECDEEB@@BDCBBDDBA@@@ACEFGIJF@?@DFIMKGDGJPPIFUWJA>ELMHDHHDB@BFFFFGHIIIIGFEDDCBBBDEFHIIHDCCJQRPOPRSPMLLLKLLLLLLMOPPONQTURWa_SLMOS]c^XX`fa_]_SW¼ÿ~Ƴ~xrpdiyof_]bfeb]ZYY\\\YWUTRPPMJIIIIIGDDN[fxxurvxlda_]ZYXTTVXYYZWUTRRTUWYZZZZZYYUUSRRRRROQW\_^ZTPNOPQPSUVVWTSQOLNTWUV[][YVTUUVZ^da^_acVFA@?=<CDGRZOJ`nM46AFFGh}qbi~~sltxpfYUdN=DHRTG=:>?<989<;:;:348<;;BNfbD55LTL;9?BA=DY`\g]QXYWdplegiT>7FHFD?734678<><967?@;8888867;@CCDCDIKGBDGIF>88;;;>@@DIE;88412575589755:;888:846:;87IYSLHBI\]OHJKA:<@=67@OSG?I\ge_]YSKA<;=BHNQRPQTRG9//46:=:9>BBAACFHEBCEHKMNQVTRMECISWZ[YXSJ@=?K\[USMKG>5//./22201248:;;951474455:>;:::73134793-+)2GUJ=663329GPSSSSTSSSRQOLJGFDDGKJC=?FKNNOMC73576669><:@?72220/251.2:1193''&(*.05<<;9964879;<;8:91)'*+*+1:AJKB30779;>D<24-FnG4<>G>44?BOTE9?KX]\R;224@=9====9AOVXTL?23?DEJTSIBA@CNfpbvS9868>KKDMKC=4247:13AD=9:9788<>>;456433:@?>;8789;@EDCCA@=68<4'(155788558::526;<;HHHHILOPRURKHIIIJKOQRQNKKNPPPPMIHIIIJIKMLKJJJIJKLLNORTRTUTSVWPIJJIJJJJJJJJLMOPPPRSTTUWWWXY\\[XSPMNQ\abaZYiuvwvsrpfZNKJKKJJJJJJKKLLLLMLLMMMNOOPQQQSRQPOLJKLLJIIIJJJHHIIHHGGHHIHGGGFGFFFGLQTUZ]RPYYWXXYZ[[[[ZYXUOMOSXXUUSRTTUX\_^^\[YYXYYZ[\]^aaca^[XXYZZYYYZYXXXZ[V_ie[T`lqtxvpmj_TQ]syots\RYagfal}|o\]llijd`\WOOPTSTVX[\[ZWTSUY\^^\aeYQPQONRSSKQ`kjd^]\XUSTW\`dhebba`^\WTVY_cb^]YSPQQRSTWY\cgedddcdfhkf`kvkbgmmhd^_cfigc]^`cgjnrzvdgZO^^QFBOmsQPQGA@@ABBCCBBBDENMDBBCCCDDCCCB@@JTOGCB??GR_lqbG?BDB?=@BA@@BC@>==>?BEHGCDJMQSQLMRSRPNLIF[bMIHD=EJKQJgd\RNNOOQRSTUWWWWXXSMJGEEDGJG@;<<=@DGKNPRVY[[\^^]]\^^^^__`baYXadTJRYMCEB?@ACDEFFE@>@CDDDFHQKFEEA=N^WC@CGFDAFFB@BDFFEEFGIHIJHGFEEDBAACDFIKMKGEFMSRNLNQRQPONLKLLLLLNNNPPONPSTUY[WPLMPTUZXWWZ]^_a\P˵Žrroct{idba`bca_\ZYYZ[ZWUTRPNNMJGGHHGGDHSbuzswwmgedca^[ZZZ[\[ZZYWUTTTUUWXXXXXXXVUSRSRQQOUZ[]]WQOOPQQQSVVVWSPONLPUVUWZ[[XUSTVWZ^ba^_bcSEBA==;767;>>>>@BA<:899:IXWUY[RG97<@@?BABCEI[qvnZI]zaLGWa_SLIJKJPTI=@KWqjb`RR]^L@>?DJP[jeXT`ed_\UG@ISWVW[XM@DMVSJEDIQSQJC@?BGHHJOKFHNSRRSTVXZ[ZVPH=7;>?EQUMAH`K49HHJVozv{ty||y\LedI?AA?>@A??=9=A<99=;96766568>DJMNUl]B?BKN[ZOC?><>EHV`efda`^__ad_OC>=;986446:<;9556779;<;87;<<<=?@@CBAAFFEEGEA:678;AB@?EQL58=:67:99:::<>??=>EMNFCFG@87::59GH>@HE=9512446512;BB><;8889988::88GNC=:AV_WOOQOJGFC>67JWSPLFPckf`[UNF>:;>BKY\VRPHB?<=97<;42;GGBGMKHHGFEGIPW[[VSMA8;CHORTXZSHA@GWXRQMID@<63576:62235::98754665469659<9651023562--+0@H<23323./7DPRSSSSRRRPOLJGEDDDIJC>@IJHJJA647::988<>:65200/000340+/:@>964367036;<<>@EG=0'(+.-1337?CB:34<@EML<:@51RW<9CA1*&,2@<<=8ARSUXE8<>HLKKVUE627>CHPBZ\>3,2;BDIC4133448?ECBIE;;AC@==?<71141017=>=:65679;>@BA@@=7794+'+17==636:668;;HHHGGGHIJMNKHHIIJLNPOONLLNNNQSPKIJIHIJKLLKJJJJJKLKKNPQOPSQJLRRNLJIJJJJJIJJJMOOPPQRSTUVXXXX[]][VRPOMU]\X]istuvvtqmaSMKJKKJJJJKJJKKLMMMMKLLLNOOPPQQPNMMMNMKJJIIIHIIHHGGGGHGGGIIHHHHGGDBBEISXTV\]XVRORWZZ\\]]\\\]YPJHJLMMMNPQRVZ]^_`^\[ZZYZZ[]^`ceffda^ZYZY[[[[ZZZZZU[ecWRcljpuwz|r]RRYqu_RQ]hophnukhV]xzqmgdcb[QNPSSSV\^^^ZWVXZ\]^^fkXOPPOOPQQPPPUafb`a]WUUUW[``\\^`a\UQRRUY_c`^YSQQQRUWXX]eifffhfdgnqh`k~rbcihd``bgih]X]`agmpuxwz]]ZPOMDDEQojGIMHC?>@CDEECABEGQOFDEDCCCCBBA@??DHE?<;;=HPPXcZD?GNRUVRIFIIFFIIEDCBAABCDDEIIFFGGGEB>>A?>??>?@@??ADC?>@AB@==@CEIOQSSTVWWTLABPWVNEAEHct\DCD>DSWRIQpc^TOONOPQSTUWXXXYYVROLKHEGHFB===>ADGKMNRVX[\]^]]]\^^__``ab^UYhsiYSI@@A@<=?ABCCDDCB@DHIEB@JXRFFIIGKY[JBCDDCBDEBBCDFGFEFGHHJLJIGFFFC@@BCEKQSOKIKNPMHHJMOOPOLIJLLLLMPPOPPPNPRSVYVPMMNRTQSTUVZ^^_fOo®Ĭ¾~~niqh_la`accb`\ZYZYYXXVUTURPNMKIGFFFGFFO]o~{u}tjfffc^YWX[[[[[[[[YWVUTTTVVVVVWWWVUSRTRQPOX]\\[UOLORRQRUWVVWTNLMMSVUUXZZ[XTRSVY[_a`^`b`OFCCDB?>;9<>?AEEAAE?;;<;;;97FWYVTOD=9=A?>BHGCDGLU`\TLCVv^RUgnkaVPJBKZ[F8:DTne[PRW_ZI?;;H^lpqiM?>T`]YUQUY]^\YZP;7NXG728HUVSKB?=>DFGJPJEJRSRRRRTVY[YSOI>67:=BJPI:@YL3>=;9:?CEEB>?>=><<>>ADFC??CHNQH94:>>ADEFHJC8=HHDBEKMKGHIIC99=@CCA<559856<=;987789:;;88<<13GI85DKC7//3556733>HD>=;887899;=>=:BE<:8DWQKRK@BHLIA<9R^WNIECB@>><;GZ]UPLB@GHGFEEA;9?HD@KSMGFCDGGGM[d^WQIC@?@BCEIOUVLCCEJNNMLGCA@>;:::;954458887:=:96543343793.-./12340-.04982000011126@KSSSSSRSQOLJGEDDCFHB<<==@GC<999?FB>@A?94/--.157788634:=<954367/46:;;?BGPLA><892??@@0)+('*-215>EFFPYRECEA96855:>?:9;:BNNSWB=QQMJJKUO=1/2;616=?>>==MWOOQE99AIIB=83-*,--.4:==94234531:FEA?;9862.))2=FD817??;612599JJIIHHIIGKMJHHHHIKMNNONKKLLMPQOKIJJHJMMLKKKJJJKKJKKLMLKNSQLIJLNLKIJJJJJJJJJLOOOPPQSUUVWXXXY[\[XVTPLMOWenonquvxxsk`SLKLMMLLLLKKJJJKLKIJLKJMNNOPQPQQONOONMKIIIIIHHHGGGGGGGGGGHIHHHHHGFFFEHLPSWZ_`ZVVUUUX\]_^\^^_^\WMFCDDFHJMOQVX[^^^^][ZY[[[]^_]]__ab_\YWX\\[[\ZZZXYY_c[Zcd``htvoeYROZtwdYZfqrsxojigokdevwnhc`ac_QKQSRW^__][YYZ[\\]^ccUMPPOOQTSQQRQS\^^de[UWVUXZZXXZ^b^VQSSSVY[]]ZUQQQQUZ[Z_ffegghhgknle_i}~j^`]abcehecTQ_cdlrs{}~_WXPLLHEFUn`BEGEC?=CHGFDBBAEIONKKIEBDDCCA@???ACA><<>?DJNW_VHEJLORUQJKRQIDIMFBCB@@@ACCBDFFFGGHHFCBA>>=>>>>>ACFGDABEEDB@CJMOQRSQPMKJKLF>@CIKLORWXY\]]]]\]^^_`aaaa]PXnyziM>?@A@??KUQMMNUahdbjpfQLG@;AQ^effhiijjjfZTVUNINTW\\NCCB?>>>BB@<>AA@DHIJNOKIMNHDDDCCCBAABDECCCC?BLQNHBBHQNPXZXXQLMGBCDDDDCCCCDEFHGEFGGIIJHIHHHGFC??DJPUVRONNNLJGFHJKKLLJHIMPPQRSRPPPPPPONNOONNNLPURORTVY]Z`]W´ɱľuxqfgm^^}qf`_`cdea][Z[[YWVUUTUSRPNLIHFFEEDHWj{wpxynfdda\WTUXXWXYYZ[[[YYWTTTTUTUVWWXVURTSPPNR^^[[XROPSQQSSUVVVWQMLNQUUVWZ[ZYVSQTX[\__]\`aZNIBAIGB@>;;:=<<;:;>@DILGENTQQQPMGJUZXQLH?779=@FIECNZG6>ECDCBLo~||vz}yutbZF857;>??@CMPKD<;EKKH@=;:977833CHD@??=<979?DDDEFC@@BEEEFFA>>==?>>AC@:67?KRQ?07ACA?BB>;7358<73:@CFHIGFD@9:>@@?=;;85568;>=:867758>@>DIIC;7>?;987667>EF@8559?BCBAEOYWTVSEACABIGAB?@CDCDMQKE<9AHGHGMbdWSOJD=;>@ACEJNJECCBEILJFBAA@?:677677768:==?@>=;853223575.-/03321/./25533431/011114?NRSQRSSQPMLJGFEEFHD>;66=BDIJA=GOIBB@<9521-/8=<;<;<:99:95112650326:<<>@@=;83,-57679:;;:645:?@@GJ@=GG>>@BD>94.-//08>5.033342345651/146?LPNRL:)%+30064003306?CCBFHFB@=8>2,582'%.1..14359<<;7616<73210/012/*6KNB<><8431,.9AFG@89>>8.)-142KKKJJKJIJJJIIIIIIIJKNPOKKLLMNNNMIHHHJLMLKKJJKLKJIJJJJIJOUURMJHHJKJIIIIIIJJKMNNOOQRSTTWXXXYYYZZXWVTMJOYdggkqtuwyuk_VOMNONNNNMMMLLLLLLLPSSPNNNOPQPORRRRQOKKKJJIHHGGGFGGGGGGGFGHGGGHGGGHGFGHINUXX[[\\ZUTX\_a^]]^]]^^[SLHDCEGKMNPSVY[\_^[YZZ[]^__^[VUWXZZXVX\ZWXXXXWVVV[_^__ekghni[VZXS`pj`iy|vsrtn`Vblgmjiy|vnc[Z`g]MOSQU]]ZTTY\ZUXZ\XSWSNPONNS\VPQSTTURO_neYXYYZ\]YXZZ^cZPRSTRTXZ[[VPPPQWZ\]`aaefeeehiihg`h~wcd][[`fihfZXcccnrzYKQNLLHEHYpX@CBAA==@EGDAAELMKILOOJA@DFECBA???AA>===>?AFOUSNHEINKIIIGLOG@BJPG>@A@???>?@CDEFGHIJJJG@>==>>==AEGIIFFJLHC@AEJJIGEEFFECBCDC@<=HKIE@@Ys|jIEGHFGFAB9D⽜zaTPOONPQSTUWXWXYYXVTRQNJBFG@;<==?EILMPSWXY[\]]]]]^^__``aa]YYYZd[E@CBCA@@JRSSROP\je_gnhREC>=IW`efgikkkji`WVXRKIIGLXWE;=?>>>?AEKU\XLDJX[[`]TMPSNHFFFFEDCBBDEDDED>?LQIFCDGJIVe_Z`WB>BBCDDEFCBACEEEFFDDDCDIJGIJIHHHGBAGOTTUTRQPMHHHFGIIIIIIILQUWUSSSPOPQRNKJKLNOONLPTTQSTUVX[\RǾ˾ƿvutojgf_hqifb``fjf`^]]]\YWVUTTSSRPOMJHFEEDEM`v{rr{qiegd\VUTWXXXXXXYZZZYYXUTTUVWXXYXXVTSTPNPOW_[XWUQPSSQQUUWXXWUQMMPSVVXYZZZXVSOT[]\]]\\baZNGB=CDB?=;88;=BHE>=CB@>>>>?GMQNEBBDFC@BEFEFGGFIKHGMOMD:@PNdype\cikj`URQOJ@9898E^bgsplg]TPOHEAB[pu{`OLMR[ZZ`fgdaba[\N;IS[XJIPLHMMDBB<8:<98=?87[iTB?@?@AJX^[YZ[YNC<9741>NKCAB@>;889@FEBABBABDDEFGC?@@@BAACA:767:DOH30>C?<=<:9669;;<>??<<<88@DBBGJE<8?LRLGKKHIHCDGC;9<=;5349>=:=@><;86523>JIA?CDCB@AGIE@9-,9EC?BFLOJIMJD@<976437?A@DPZ\ZXXYRB<97:A?<@?>DGGGJHB=55@GHIA@YdZWTL@55=@ABCFHHFCCCDGJIEBAA@@<779:87;>BC@>>>??<85456227544335443212465357876632347=FNPPQSSRQOMLKHFGHHGD>98;DKPQKIMMG?:87668747?@<::;:6568752025401//49<>@?;41-*/576767:6126>JQMCDH>0299@IGFDC=328878510243321247:8555528MQOVO<+(8?0*/.,+05944AEDGG>@CCEB9,-,)30261-136=?A@=::9799983./79/).1/.08;BIA<9Fh_NLRF1.533C=6NX[fS@EB;57635=EIGLSTPMZjkhcQ==JOU^R@[[@;69@;1**--../206KN@:AA:64115>5'$+///KKKKJKIHJKIIIIIIIIIKNPPLKKNONNPNKHFHJKLLLKKKLLKJJJJIJLNQTVVUPKHIKJIKKKJIJJKMMMNPQSSSSVXXXYYYYYXWVSPKMNOXgqrswvtrj\ROMJKMNNNNNNPQRQQSVZ^_[SPPQRRQPSUUTTSPMMLKKJHEDEFGFFEFGFFFGGGGGGGGGGFGHHHKQTXZ\\\\]]]^_][]]]^^__`\XOHHHJLLLMPSV[_^][ZZZ]_^^_^\ZXVYXSTW[XUUVUTUUTUVVYYZ_ihb^ZW[a^]hqpr|xqrohd_W`ddjfbjqph^YZajbROQOQUVTQQVYYSP]iSFQRNNOOMW_VPSSTUVPGUrnc\[\\\^ZX^_[a^RPUVVWZ\[[UPQQSY[\^`_`fgfdadgiifag{jdmZX]_emsllqihqipTFOMKLHEJ_y[BAA@@?=<@DDABLSULJJLNICDIJGBAAA?@AC?====?AEHHEB@?L^ZNHGFFD=9?=<>ACDEFGHLMLLHB?>?A?=>BEGJKIKLHA=;<==<<;?INMMLHBAB@>?ADECA=XuwRGGFEFEB@:/uԯlXRPOPPQRSUWWXYZZXWUURLGCFF>:<==AEIKMOSWXY[]]]]]]^^^____^]`[LEGHHHFDCBA?HOQQQPJMajbdfXLIB;@OYaehjjkkljfZRW\ULGECFKIB?=>>=<::DZkncPHN_dfkaVQNMPOGEIIFB?>>ACCCCB??DJDBAACEO_g__dWC>@CEFGFFCDDDEEFDDFFC@@GNMJJIHIKJGFJPRRTSRPPNIFFFFGGGGFIKRWZ\WPQSQPPQROLKKMOOONNPTUUUUTUV]Pg˽Ȼ÷ÿytpnlidciwzoifecaild__^]]ZXWVTRRSQPNMJHHFCEEHVm}x{~{vnijhb\YWVWYYYXXXXXXXXYWUSSUWZ[\[YVTUUQNPQS[ZVVUTQPRQQSWWXYZXTQNORUXYYYXXXWURRX\\\]]\^b_YJGD>:==<;99:;>BHLG><@?>>>>AJNJGC@DLKB?CGHDFHGDFHHGHQM?;Mkmztdfnmgb\RNK?97899@OUU\iph]XQLHJIEIWir_?>JSX[WPMWfjecgb\UX`WdpcVTPLMMJC>9769>GJGIQSLLLC:9?LYWD7=B@<:;;;;?@AEVgX=;?>>><;<:98>CC>>@@@>=:9AG[q{oVHJJDENTUVWW[_\J72532=NOHD@?=:766:DHD@AEBDFFEEEFDCDCCABC?<;;948=828?=::;CG:48:3.3>FIKOQSRK>:=>@AHPOJF=78=<;<=?@A@>=<;>CC>?BA?=@JSOHKNLMKGE@;;=>?>6369<;;@BA@>96410:GIDDEDBBBDJIC@=4/5=DIMNMIGMN?6=A>9888:>?AL[a_^]VMD:767;<=<@A>FOE>C>5447@GHF=>JSVVQJB:=>>?ADFGHFDBDFGHFDBAA@??>;>>77<=>CA<<=??=8459;208888766777435776468999654458;>DINPRSRQPNMKGEEEEEFC@@DKHFLQOMIC;42332669;<;::9<;5135655324400/,.4:=@?:/**.367752593*-9GPVUGCD=-)-6AHC?BED@ACB?:65532000//58574-4KOUYI8//>?/(+.-*/3767:BJFA=BINNF9-.,,:=52.-.49ACDFJI<4118>;30178/'(+,+,////2;8>irTE@;=3,.2<95GVVTF9:;989877766>MRTTOUiuzygPFDCENOLjsJ1-3;>70/-.205CE@HI=;AB:6400/5?DBA@=;91*)-./0KKKKKJJIIJIIIIIHIIIJMOOMLKLMMMNNKHGHJLMMLMMMKJKKKKKJJMQQRUWWTQOLKIHKNLJJJJKMMMOOPRSSSTVVWWWYYYYYXVSOJEGUhrqt{zpjdWLJIJLLKJLPRQSUVWYZ\^_b`ZTSTUUTSSUUUUURNLKLLMJHFFGGEEEEFFFGGFGGGFGGGGGHGFEHKOUWZ]]`cdca`XQY[Z]```acd_ZVQJIIKLNOSW\^_]ZY[^`_`aacc_\\ZRUZZXTSUSTTTVVUTVVVVWXXUTZdgaap|{}}tkkomfdb_acacb`a`]ZZ\_jn_QPQPRSRSQRTUUWUhlPRVRNNPMXbVOQUTUURNNizka_^]^^[W`ha\]WRU[_a_]]]UQQSV\ZV\cbcfgfdaafjieaanx_phb]\hrsns|ws|od}zRGOMJJKHKecMCAAAA???CFGJQSQLJJJLKJLPNHCBABBCDECA??@BBAAAAA>=PgdUKHEA@?==>?@AA@@A@>>?@@ACEFGKPNHFEAAAA?==ACCHRTPF<;;:;<=@AJY^ZQJGFBAAABDEEECA>LdxuRGFDDCA?>:6=ູ_TRQQQQRRUVWYZZZYWWVSKEFFC>;<==AEILMPSWX[[]]]]\]^^^_^^^]]YXWRNPTTOIC@?@GJJJJLHBPaef\KGK@9CR[agijjkjjhcSOW\UKFEECBCCCB@>;:>AIZb^WOJHQZ`_QKMKFJNHABIID=:<>@A@AA@@@CCA??ACUjpqobSFA?ACFFEC>ADEEFGFFHIGFEFPSOJGHIKLKIJMQTTSRQPOLGEFFFEEFFHLW]\\XRRSRPPPPONMLMNPPPOPTVUTTSUWQOÿʼɼ}wvromlkees|uqkggfdhg`^^\[[ZYYVTRQQONLKHFFDDEDLbzx|~xpnja[[[YWWZYYYYXXXWVWWUSTTVWZ[][XSSTSOOSTXZVVVSQPPOQSUXXXYZWTRPQTWYYYYXWVUSRXZ\\\]\\^a^WHHF>77:;:9;;<@CHRTC;>====>CIIED@AMRMD@CEEA@ELKIHIGAKH:8Celzpjomec]OLH>97679>GMMKWdZMIGJLOOE:BZ[B5=EP^_VJEXnrkmvtmmplchzu^SYWRPPK?777:?ILIKPOIKF:8?>?@AFHEABRvpmy}jM;?C?>===@CEGYZGCC>=>?DID><735:BJNMLKEFFGEDDGGEDDDBBB?>?>832./8>=<===?<6368:87==>>>==<;<<<>?:67;??ADE@;<957:<@A?<;;;99;AGD@:55536AHECEDDDCEGFFGC=88=305=@>DOY^^`^RE>;7899:;?<<@@JTA493/356?FGD=<;:;?CEFFEDCCEFEECBAA@?@@??;769835767;@CFB;89:649888767876314786457753012237899AJNRSRQPOMKJGEC=:9=?BDF<8CNPMIA;8321-./01115:>@?933444444552//2039:=;7/+.25667535;8-0>IHJONHE<-+,:D?8:?<;=>===<;:74210//4=CD?6142+5HPUL:44871024742357:=6:HG@IQV[Q>5/.**093/234:?ABBDN[VKB=<;>:32681+*((2<7//..8::SaL926A6+-4778@ILF8202;CGMQLA988LWYaUJWj|oSJLLILQSUvtF/<>72/30.:BFPOGJI=7752011,'.;A;9;5..12.-./1KKKKKJJKJIIIHHHIIIJIMOONMLKKLKKLJIHFHMPOMNNMKKLLKKKJKNPQSTUUUUSQMHHJKJIIIIKMMMNOOPRSTTTVVVXYYYYZYWUOLIJVfsww{}m`]SIFGJLKIIMUXVUUUX[Z\^_``_YTUWWXYWTUUSOMLLLLLMNNMJHFEEEFFFFGFFFFFFGGHGHHHGGIIKOTY]_`]Z\YUMIVWRV^a_^adffda[SLIJMPRTW_`_]Z[`aa`abdffa_ZUZ_\YURTTUUVVWVUVVUSSSTUSV_bajy{uvrjefllfddcdc^^_^][YY\_akp`QQQRTSQQRRRRUVY{oUY\SNPMXcVLPUTSRRROYxebea^]ZW]ik`X[\UW^a`]\]YTQT[\WOUdgggfeddbfljfb]e{^pxl[`otqno|rwkNHNLJKLGKf_JEAABBAA?CJLNNNOQOKJJKLNNKGBBBDEFFGHDB@CFE?==>>>@A@?BDDC?=;;<=>BHMJCDFDDBA@<=@ABM]^O@:;<<>BIPUdpkdWKFBCD@@CFFGFDC?BJWVCFECA@=<:<96`廤rUSRRQQQRUWXXXZZYWWVTOHEEB=;<<=@EILNPTXZ[[[[]]\\\]]]^_`^YRSVWWXYYWSJ?;JW[`gijkkigj_JJUWPGDEDBCEDDCA?GP\_ZZYVWXOCELOG@@FKJJMOF>EPK@;=>?@BBAAA@@A@??BDPds}u[LGDA@AABA@;<>@AACFGEGGHGIJOQMGFHJJJIHKRURPQRQLIGGGGHGGGFIMX^][YWUTRPONNNNOMLNPQPOPSWWTRQSUHtǺö³ϼƾ{wusqqppjgn}xwsnhgfed`]]\\ZYZZYWTRQPNMKIGFFEDDEUoxw|sqqeXVY\\ZYYZ\[ZZYXWVVUSSTVXXXXZXVSSRQOQTUXXWWSONORRRVVXXXXYWSRQSTWYXYYXWVTSV[[\\\][\^a]VHHH=57:;:99;=@CHNO>;=>@???FNLGD@ENMGB@CCDD@@HOLJKH>>>976AHgjgrldbWKJIGE849<@DIHCGNG>?ADA>EF;678:<<<>;99>CDIJHDALvs^fyE?@@?>>=@ELMJFHMJEBBBEEGHJIJC=><89=>HPPMPYfnlfllSHUM?DMQTV\ddVD<=BLTROPLC?@=8438@FMSUOGECBCCDEECBDFDAA??A>73422:??@BB@;53247@CBBEJSWWURRRQMB>CA@Sbb^YNB>????=<;==<<<<<85458:7;EB525786456669=@BED?<<979AHD>956863:DA;>EFEEDCDGHGC=8@PTJAAEGB<<9466/,2?<=;76:@<:BGMUK:328<74@CDDEEDCBCDCCBAA@@@@@A>;856730//19@FLJ@:97898888767544425886456752001269954>IORSRRQQQONHA<6202799;53;HOMC;<;510-,+,..04:?@=;865456568631487488753014676664357:87=HJKPRNK@/-.=IB>IE85;989;=BD?BFC;3/5?BC<200/6:AKH;7769427721126899677@OMLNQPF632-*)+0./7:=@A:0,271+,16::500.-139JPJR_YE:>=>>=BQUNJGCBEFB=68==@ETc`K>@>=@ACINQ]efd]ZUF>A@?CEFFFCBAFAA=>HCFKLA<<<;86߾YQRRQPQRTWXWXYYYYXWVSNGC@><<==@FHLNPTXZZY[\\\\\\\]^_`a^TOPQTVVVWXVMGEEHIMPKA@A88L^OHLH<@Q[]cggikkjjgWEEMMIDCCCCEEEGEALjsuqe^[[_bXMIEB=;>DOQNOSNFJRPGBAB@BEDCDDB@@@@ACCHRbvrUHNQSLDBABCDDB@=>@CDCEEEEDCDJLHCDHIHHGIMNKIJLNJEFGGGIJJKKMPX^\YWVUTRPOOOONOOMMMOOOOOTWUTRRRVɽƹľо~zxusrqqqkgbh}unhgfd`_^^]^][\ZXVSQPPNLJGGFFECCLczwx~zomrl^UVX[][YYZ]\[ZYWVVUSSTTVXXVVVVVVUQOORUVVUVSMLLOTUUWXZYYXXWSSRTUXZXYYYWVUTWYYZZ[\[[`a[UIHH=68::9889<>AGFD79=DIHD@FPQKFDGHFCA??@CHG@BJGFJI>589888CIQWXVidZknlXSWKBHNPRTUWXTNIHKPUTRRLCA@=9524>CFMRLEBA?@AABBABDFGEDC@?=848;;<=>BGEB>521369<@EJPVWSMILPOMJIQPDHZ`\_]K=?A@@?=<===>>=:77401236;;4355466679;=@ABCC?<==;=?A@;746<<56>=57?DFGFEDBABA;8FURFBDB838?>9840035>OZ\ZTL>0*2AB?C?78>?@ABCDCCCBBBBBBAA@AAAA@=8555544459?CHH;66468789987658=???<766667667745:<;44=GNRTRRRRUSI@720223456777:AEB76994.,-./2544689999875667799668:::85554246777651,,017>96;FPXURQC-,2?FFGIC>;::::502119;=?:689306=<.'').7898427EUM:6985233-,,-/003;><<@BCFMFBS^I/*3<=974,(*,*'9PF;A@AC@=:;2'())*+,087+%%%,7;BNQJLYTB44BW_^jfC;EMMKFC@.GackZWI.*(*02EZTC@@@ABDFGHIIIF@@BEDBAA@BCBEHGGID@BDB>98;>?@DLMGB@>=<=>@CEC@@CDDEGGC?=DCAA?>?FOSSXXE9=@@CDEFFB@><=<=2Q•eQQPPPRSTVWWXWXZYYYXWVMA>><;<=@FIKMPSXZZZ[\\\\\[\^_```ZNDGPWYXWUSQPNKHIMQVSGAA><EQROLJIOTTSMIFDDDEEEFHFA@@@ACFEHVptYO[giaYNHHJOUSE=?DGGIIGFEDC@BGGCAEIHGGGHHGEFHJJGFGGGIKMPPRTY_\WVTPNPRQQRRPOONMMLLMMMQVXZZ]J·þƮ{yxutuusqkg]fsmihfa^^`aa``_\ZXVSQPNNJHGGEDDCEWpzwnihjbVUVVVYYYYYZZ[YWUUVVSRTUVXXVVVUUUTQNORVWVVRLIJLQUTVVY[[[YXVRSTUWZZYYYXVWUTVXYZZZZ[\`_YRIHH?888:8777:=AHEA66;DMJDADIMLHGEBCD?<;;<@EBDIB=BC<679:>@CIKOX]ir_HDIIPfx\53=BFKKHC@CEFJTTMPUL@:7;B<:MYSLXksomvwuvsottjf[LNTSSTVVPD97H]hb\aeYIFMTWSMIKLMMMKGA947;<<=GNT]n_Yig\[aVJIKPUVTROORTTTUVTQOKB@BA?:522:DGJLIFDCBA@??@ABDHLIED@=;98:<>=99BJEAB>50/5=>;BQZTMKHGJLJJNQQRQPXba`^N>@BBCA>=<=?@?<8664113469<><9:99:99<>?>@B@>=<>A?==;99955>B;7;>:55S\YQA:;7239>BHB9?CA@ABFMME?CKMLG?@CA>;;<<==>=;855468;1/444578:98675249>?<989:>@?;8559:82,*.1566666569973345678;:8;:8238952355554/*+.29=:73;LZVTUI2.8BDFE>AD>9:;=?MXTMLOOD6,+/560-.-179<;:9;92+6@<0-.29@=75922.../111../257207:969<>@C>67;=<3/25561+('''$*@GC>7?B=?AA=0(&'*++/55-*,.5>ABDFIOSH96619NblZ63=;B<7HMLLB442Tsq|jVT<+,+,5EQOHDFB602221/-+-012664321/143/--JJKJJIIIIHHGGIIJJMUYXVURQOMLKKJHILPSQNQURNMMMNNMKLLKIIKIHIGEFGFFFFHIIIHIJKKKKKLPRRRRRRRRSUWYYYZ[[\^\TJHTZ\ehrurnUEIJGIJJIHGEHLOQRSTX\\_`a`^]]]_`__bb^YVUQLIGFFFEDDEEDDEEEEEFGHHIIIJKKKLNOOQRSTTTVVTRVXRJFEEFHIIHKRYWW^ddbdhhiheb]WTUZ^``abd]VWY_gijklmle^]`_ZXVVVVUUUUUSRRTUTYcfky~{~wmfgjfbceaZTTY^]X[dc`djljs~saUOOPQUZYTQOWgrnVQ`jgULXgXMOQQPOONOQQSQN[qp`^\X]mxwri[POQTSQPOOOVRGJOPTWXYZ^begfkz|h`gcddeZV[foqoomlkndWcXQHDEFHIHDOkzMDGC@DEDDHMOPQSSTUVPHHIF@???>@ACDFGFEECBAAEGEDCDHKIB@BDHFBEEB?<;=?@BDIKEBDB=>@BCEFA?@DDCEGGC?==>M[ZYQGB>?EEC@=;:;>>ADEGHFB?;7=HEDPYNLOKA@?>>;6uzlWNQRQQSTUUUVVXYYYYYYYRC=<;;<=?GJLMPSXZ[[[\\\\[\\]^__`XF7;JW__^[URONMLJLNUYTGCGE=>GNG9;O[^cggiijjkj^LGHGECCCCBBCCD?I`n__adhic^_a`XTRKGAIUVSNJGECCCCCDEDA?>@D[iWRfqpb^golih\ONRTYVF?DKQQQPMKIGEDBBDECCEGFFHHHHIJKKIJHHGGHKNPQSVY\\YXVOLPSSSRRQPOMJJLLLNOSY^_dWWͺÿǺɹ¼}zxvpq}{rlkecis~upnkg`]adfeb`_]ZWTRPNNLJHGFBABAKd~{xsligeYTUUSRV[]\\[ZYXVTUUVSRTUWXXWUUSRQQPOQTWWVVPKIKKNPOQSUXXXXXSOSWXYZZYXXVVWTUZXYYZZZ[]`_YMGHIA988887579=AHD<648ACDFHJJ\iL7AKK\ou_>6CJJKLHC@BGJNQMLUS@8:?B?=GVTQTdd^eu|zomv{spwjSH?GHGIIGDC?:BMMG?65Hh~r\[kzljHAFDEGN]cb\Y]ceWEEU_VKGIKLMNMH@?@>;:::>?K`hcjf_TX]OJLLPZYXWUVUQMMQRMJG@;<;;;::<<97?E@;>=5227@A:>>>;886655678=?>=;:<=<9:=>=:<@@=<?=:;;:9=A>;>A@:28DHC<9779;97?JIGKC1.:?3.8>=8206EQURI:9BEBB?;?KJAEPNEBBAA@>=;<>=;;::;>9013:>>@BBDDDDDDDCCBBAABAABB@>=;512:93:A@9.*2545889988:?BDGF@:;>>==;9631247951.,/71023457;==@B?;<92/58:1/3545543336:;998>?CHJE;65:JH<7730/...--02697106<;83343101*&C^L002.0/,-039>?BMYTGGHA;9<@=0))*,04674-,5?@ABCCBABA@@DIHFEDIOSSMEABDEGHC@?>?ABBBAACEHID=?A>>BFB?@DEEEFFC@>>@P[WUQHC>=CFDB@ABDFGC???ABBDFGECB@><:>EDGLHE>@@AA@@??:Kuqro^RRQQRRSTUVWWWXYYYYYXVK@;::;=?FILNQTXY[[[\\\[\]]]]^_`VC9:?O^`bfh_OGINJGFMPUMEIJHCCIB:AT]`dfgijjiie[MLLHEEEDCCCBA<=Ung[cjnnrg`bc`]\VLA;=FOUQIA@>9657:=>ADEB99@CCDEGIFCCC><>@B;6776568;>@BEJIC?NU<4>CG]lc]TJZ[PLNHA@@FMMLKVWK?9>HMJVjhSO^bQIWjk\QWed_ksX902ACEEEDFKNJHKNNJB67EPOGA@@>?DKTSE:>IJKLLKIHEOgqjacpzk]_XGAEKLQ_e^[ZXWYdbM?JXTHFKNOOOMFAFJB::;=<>KZjpsh[TXTKINORUYYYYYWRLEA@?AA<::;@C;3339FOPQQLHEDB?=<=>?BEEB>::;;::;;<=;::866:=843<@?=<@GLOSTRNKKNOMOQT\`ZQICCCBDEEEA=<<;;<:888755668::7677<@<8:<<;9:@B?==>>=>=>ABA<8=DF>47:8:=;;DJDAD9,2AB738;<<9:CLNNMICGPQOH==GD96@DB>:;CQTPRVP?6<;<<=;:::9652/38>A??@ACDEFFEEDDCCBBBBABAAB@>:6368/07><<@@A?<6222344773/18AEIMNHA::@KQOJCCCB>===:423359;6/-25533349>AAA=63234668?AAA?;<:5100;7346777:;:98669<;DJIA707LJHRMDKJNQ>-/0,-225<7+*08;87532014:@EHJKJH@<5FK7245431.....01484//4;><51/-,*,,*?hf<'/0,,7L]kwwwteaiib`]UK=@B2)*),47796-,9B@;79@D=68=<546997,,023769FKLJ=,($M}{zJ*2559:DHF@<3.39<=98:9883////0122138:99::KJJJJIHHFFGIKMOQRTWWVUTSQONMLMNQSTUUTSSSSSQPPPPPNMMLIFFECBDGJLKHEDFFFHHHIJJJJKKLMLLLLMNPMMSWXXY[[\^`b^TIBCGMSMCLYRFGHGGGGGHIPY[\]]]^^^^____^^__^^]_ceca^ZVSROONMJFEEEDEEFGGHJMNNNNNMIGGHKMNOQSUWYZ\YXPGDGIHFFGGGGHIJKKMMNPTTSQRRSSSQRVY\_aded`YQPZdgknnnnmkeZUTTTTRSTTSSSSUUTRVeqsnimpmidfkf^^ghb]ZZ[ZXZ_bc`_m~}h^WOPPXbddff_ZaTVZ[Z_fe[QWk[PQQQQPQRRSTTUVVcmvtkd`^dv|yxvkVOV[WTU[_IHLS\WZa]\Z]achmuzumlbUUiyvtsswy{yfOGdrFCJIDABCEFEGTpuOIIDBCCDBEKSWXWSMKIEEECAAAA@>>???@A@@CGC>BJIEC@FOTWVNGEGIMI>=ACCDEDA=<@GLK@=AA>@EGHFDCCB?>?JTROLID@>BFCA>;=EIIGGHIJIIIIGA::DHLNQTX[[[\\\\\]^^^^]_`VE@<8AOUZcliXHFMKHHIJJIGHJHFEB;;FX`bdffgiiig_XONLGEGGDCCCA@?FLSWmtppqpc^`bfgfdM@=<=?A@>=;K|wkb\VZb]RQPRS\^PCACGMPQPNMJHDEJNJGFFGFGIJKLLLJKNOMIIKJIKKKKKKKPUUSUXYXVUSSSQQPOPQPPTUTY`b`YjʹɾβƲòz}pozxnhfdbfryqkhcdikfa^]\\XURPNLKKHFECAAAKf||yphgbWSTTQRXbhhb\ZYYXXWUTRUWVUVVWVTSQPOOQTUXYWVQNNPOPONORRRTSTWTQRVZZZZZXVVYYY\^\ZZZ[[\___\XOHIHA:998775699987889987:>DE?8;?BDDFOPLFFKIA:==88986669;>ADDE@ACFC8@GMLINVKBC??HLMYh`NU_WJEGLNH@BHDGZ`I::=?BCADHJIFDFIJKMOKDDKKMLJKOQL@AIPRQPLICDKOLD><=<;;<=><;;867756;==>=96458@D<67@A?><9>ENRSQLMOPKGLPS[aT?:BFCBDEDEEB?=;;:63577743246631139=98=>;:;=AB?=>@A>;=B@<;<<<<==??=;:@FF<39<9;?=?JJ><=2,8EC=;;:;=AHMMLMNNNNKKNRNGG@76>FB83;DGNUQLK<2;@=>=<<<;;::<;4/-2:>>>967:=ACEGFFEEDDCBBAAA@@BAB@506;4.1:FE<43ADD>;DGEC?;;<9645:?@;66;?DGD:7;8?IFQRU\YIBB?BBE>3,8KFJRG:>ACB3)-24311;IL<,,6:711450,,.3623564477557851/0/,-03232.---*++0SmK%+84+Hy|_dqkcde^TIC.(+(-8955524=A?;>AA@@>===>???@DKH@AEFD@<=EKQTQMIFEHNIFC>ABEDC@@CGJIA?CA@?==?=BKMJEA?ABB@?CIIJKKHEDFGDA<8RrqmlbURRRRSUUUWXYXXXXXXXXX[VC9:;;>DGKNORV[[[\\]]]]^^^^^]]RD><:;CILQW]SHGILJFDINLJGAAC?=><<<@PmsWNKMPJHJLMP[aTFBAAENSQNLJIGIJMMKIGGHIIJKKMMKJLNMIILOOONMNNNMOSUX[\\ZVTSSTUVXZ[YURSTRX]bb]ýԺʵĿy~uoyzunhfcbi{~umggdflja\]^^ZWUQOMLKIGDCA@@EZw|{wic`\VSVVVX^cca]ZXWWWWWTRRWYXUTUUSRRQQPPRTTVVUSOMNPPPPPQUTTVVVVRRUWYZZZZYWX[[\]^ZY[]]\\_`][YRJIE=789:9877;966558=;89=BDC=@GDBDGLSSLFDHIC>@>9:;86679;>@BBA>AED?:@ELOTYbb\ctqVHID@>?FLMOQMBAD?@DDFMTVWXZSLHA<@F?;>=?IJHFEB?;7ALPRPLJLNNOQWWSOIFFDDFINLFAGQSSTSOIGHFACHHDAP\ZUQPQJA>315===;:::99877854423:>=?>968;=ELC79@BA@=:;<>FNPJMRI?ACBK\hZ>8DFBBBCCCCCBAAB>4/37:<94137840039;97:;:<=<@FB=>:24@ECBA=:9?<96359;99:;:769@GJKHGOOJGEBB>:866BE=79<@JF=5>EA@?<8459;:;;:<=<7679<=>=:6,),,++)'/50.-,))))fj^d_\_cgf^D+'(%,991046:@@>=@HKGISXPEB>:95.-..42(+7A?<;8-4BC^zh:6>;=?95212>>????@DHDAABCB@=:;BHKMLJFGQbfc\OHBCCDEIEEHGMIECABBA@>BMRHCA??BCACDA?FJMPQNIFDCDEFEFEFECB@>@GJJFEGGGD@96>GGBCDMIHHGC@=<@GctmigaVSRSTSTUUVXXXXXXXXXXXYXR@89;>CGLNPSWZ[[\\]]]]^^^_^]RD>=?@?CGEGHGDDCGMIFGLOIB>>C??DGD?=>==>>8NhEJSPKFFHHLR\bWHCABELNNLJKPTRKEIKMIFFGHJJKLMKJLMKHHLNONNMOQSVVUY`b_ZVTSTTWZ\[]]ZTPPQPUZ]hyǿѻŮĽvzus||ywxslgedhr~}vpjgfgjlh`\]^]XUSOMLKJHGDA@@AOl~}}{oc^YWVUVZ_abc]XXXWWWVUTRSSVWWUSSSQQQPPQQRRSUTSPMNOPPPPPQSUVXYWTPRUWYYYZYYYZ\[\^]YY[^^]]__\[YRGHC9689:;:6;>:768:>A@BEGEB=:;;76789:<>@@@?ADD@9AINQNFRde^hpYBACC?<@GKOOKFGH?BFCDDLV]^ZTOKHGFIFDGHECAACC8742DQTSRNJHIHGMTX]aUFBABCBDB@=DPQPPQOMNLHDGKLIBAKUZUQQNKC847JPNKUb\UYTT^[J>@HIKQUUTN?6623578;?DIKHB933;ADEC=?AA??=;<<<:7667779877?>;9;?=BHB=:?BBB@<;<:=IPNQNB>CD>Gcua=5>A>?@BBBB@>>AED>5369>@;42773138=?>@DC><<=>=;8798447;:5468:;;:;95477;A?;;;:<==CB:@B:6;@ACFC;88;AA:>KQRRRPOPONLJFDDGIE>8;>BDDA:6679<<8769;<>??>=:6348;;:86667;=;88::;:88:AIJMQRTQNIFBC><97895:>@?<9:=>?>=942222112233347<>=<=3-2636;=<=>;642:A922/7FQUXK66869;5/,*1>CSJ9679;82--01(*5,./..14:;0,.0O>+069:82128AD?@A?4++-+.+)-40,,-,,-04;><967Yv_jlpsrqqqG-*.*+8>73467>=;>>FKIQdjbRFBA;4100/151-3?=765-2?@IXmb:5;9>>2(/06@IJJOOIHG?88:5-+)*,,)*178756;;HHFFGFGGGGFFFFGIIJJJKLKIHJKKLLJHILMLMQTSOPQQSWWSQONKJJHECBDFIKORRNJGGIJJIHIIIIJJJKKJJJJJKMPRSTUUVZ^\VPQVTLGFEFFHGECDEEEDEEGMUVNMV_`\[]``aaaabbbbbbbbdfgeeeca]YRQUTJCEGGHHGHIIKMNPQTWZWRQPOQRRSTUTW]^\[]]`^ULIEEEEFGGIKMNNPPQQPPRQQRRQONNOW^`bbeedfbYLWbc`_fgeki^TSTRUWSRTUWYZZXUSTYeprlhhhijklqnifif^`cb^^cdcchc_dp{wk^PLUZRh{_QVXYXXTVjg\V\rWXZYUVVUTUVYXWVUUX_ZWVTVT\lwzuy{fVY[\]_`]]YSMNY`aa]T_zkl|vqmlifpxvusss~`NUYPJKFGGEEFFEBBCFECTyeDEHGB@@A@CEA@FJJIGC?@?>=@BDCA?????@@ADEB?<=BBFD?;CIJKJHGM[nomlf\ODACGMLKGDSYNC?BHH@>@EGECC@@CDCFID@CJOTYWMEDDFGGEDB@>:98CGLNPTX[\[\\]]\^^^^`^YI>>BEFGGGGHHHIJHEIEFJQLB9@@BC<6@OX_aabcdedee^TSTUW[WNHGIHCAAADLOZ}a_PBLWj}aEHB?>ENTUOEEEBBHLLHGF@@DFC>====?@?DTLK@CRWXURHAES^c[KDBCGJKIIILU_\KADLOKFEFGJJKMNLJLLJHGKMNNNNORVZZVW[\XTQPRRU\a`^]\[TONOORXZfǽͽĭŹwrsyuwvrkeceq||sokiiiknke`^]\XUSQMMKJHHDB@@@CY|~ne`YUTUVX]_cca[WWWWWWVTQPTUVVVUSRRQPPOPQQQRSSRQNMPPPRQPPQSUXXXVRPQVWYYYZXYZ\\[\_\XY\^^^_`^[[YQFFB658::<:8@B:68=ADDGJMJE=:8>?AADCA7AMNPHB>SjhfodDHQRS`^H@@BA@>;;:JNRRRRG<=;989>ERTHFKWgjffefefN:;?>GJNME><=>ADKPOKJH@513;JQRP\fc^ZUYd_H<@FEIQSUSJ;4454579=CGKLIF@869=DGD>=EKJD==>>=:667879=<::?A@@>;=BA;:><;;>BDEC?<<99CPWYNCACGEFYeS:35:=A@AABB>;::=CA8458=A<4135447<::;BLOLD@ED:89:=CD<7788986@MRTSRPONEAEJLHDGIF;5:>AGF:4777:==96449=ACCB?:757898877755::9>GHEEFFEDCBB@@A@@@A@A@>:30/17<>:=@=:6457999;B?>3-15874466:?@<64444431010//039?=<:80-/258<;==86319A70126>IWWA,/468730-).4?;2-13-1>=54540,,-5>ACDB@@?@@@@ACDA@??CCLNDELNKGGDDRVkq^UW][E?FJPXSFAL[UCCFKG???=?AAA@ACDCFIEACIMQTSKDCCCCEEEC>;<<>?FJKLNONLIIKaw\FC>BHLMOPRQQRHA@:Jomb`_YVUTTTTUVVWWWXXXXXXXXXY[WI<;>CGMOQTX[\\\\]]]^^^^_]VGADFGHJJIKJJMSQLFFDFLOLA@ACDB:7ERY`babcddcdcYRPSV\a]UPNNKD@?>GNNUz{TFB@JJWv|[<>@?@FMROGDDDAAFILNME@?BCA==?>@BDDE?ac9A?BN[`]TKFHS[_ZKCBDHJHEEHNV\XLBCKMIECEFHIJKLKILLJGHLOONNNNSXXUPOOLIJNPRVY^ca][ZZRNMNORWVuѿƱõ~orxxvvsmbai{uliiijlkkgb`_^YTSQOMKIIGFB@@@?In{xteb`VUTWY[[Z^`_[XWWXVUVSQQTUTUUUSQPOPPPPQQQRSSRPNMPPPRQQPQSUXXVTRPRVWYYYYYZ\\][\^[X[]_____]ZZYSNG@6579;:9>GD:89;=?DLRNIA;::8:>?DHILKA@AABCDB><><768;::;<=>?A@CDDADLMNFB@IcmgomS;BI@9?MaowVMQSPID@?@EKLLKLE??@@?<:99;?FEHOONVYRMMOSQD:529FNRRSJDD@:86259=A@EWklfffffeK7;@FFHKNG=89:;@JPROMG@658?KRRT\eb[VT_iTC=ACEGNRSQH;565569>AEHJKIGB<9:;BMKBAFJKC<;=??;545769====?@???>AFD=7249?@?;755788632696469;;<<<<;:;:8778:<;::;DRYSKIID:995;A:58953439GQSSQPPRL<8@FLI>BEF?:9=<8=;96537ADFCA>?@944=C<557:CC?<71-)+/2234437??825897520111..269<==;74/,.026;;5142/61222231./1-,,,-8=?4/2320/.0.*)',;:/07<96/6?@DILI<1,11-+0/++*(*8HHD@@@;8?HWq{@Pekf\UN:-0;7.*7?71452-058;CHEWgeckZBBDA;630.270+.3.)+-.-,+=`W97:8>=20:D;4?IHHKLKING62?G6'+-,,.25/*+4<9DDB@ACDDEGFDCFHJJJJJKLKGFGGGHGGGGHJORRSTUVVW[_a]UPOPMIGFDCFILNNNMKIGEFFHFFGGGGGHHIJJJKKKKMNOQSSTSOJGFHGCBA@BCDDDDDFGECBBBCEFHKNRRRRRSZ`deedccdeeddddefefghfca`a_WTYXNC@CEEEDEEEFIJLMMLLNQVXWVVVVWZ^^^_YPNWahlh`YOEFIIKMOOPQSSSSTTTUUUUVWYXWY[`acccddghidbhj^SRVR^g\RWXTSU[\[ZYWVTUWcqqolihd`ehiossnlieff`_bdehmvshit|vwp[TSQXi_UTYYYXWTSU^__pYYXZ[caZXYWTUW[Wp^^__WRRQXixwx{voonmkhfd`^acWLMRTPLJCOsz}yusmr}}w}uc_eZOIQSKHFEEFEDDDEDG]|\EHJGA>?@BBBCBBBBA@A??@?>=?BDCBA@@@@@@CEBEJKJGIFCNND>?C;GPB`cD;;O[KGMQft]C@BLQHKNF@AA=:9<=>==@@?AB@?BFHIHGDBAAAABBCC=;>AADKOMMLOSLIMUkr[KG>EUYWUSRQMHC?=<:Xtg^]\ZXUTTTUUVWWWWWWWXXXYXYZYSF=>BELOQSX[[\\\]]]]^_^^\TGBFHHGEEGILIINPMHHCCJIA@EBCFA:>OV[ababbccbb]ROORV\_[UPNLHDA@=CKJQonL>A@BGJKA=AA?@?BHMKGA??AB@>>BBDGJIIHMWK=>?EN\d[QQRSSTVTI@BDHJHABMTUPOLHFHDDCBCEFGHIJIILKHHJPRPMLLLPUTNKLLHDHPTTX[^a_ZWWWPNLMMRWPǾȪɾüy{syzookeessiikjlmiedcb`]WRRPOMKIHEDA@@>>[}}skfac\Vd\U\]YX\\[ZXVVVUUUTRSTSSSSRPPOOOPPPRQQQRSQPNMPPQQQQPOQUWVRRRQSTVWXXZZ[]^]\\[YZ\]____^\YZWY\L@768::::BHA;;;:9=GORLIA>@DB>=??ADGA87:;=<=?@CB=78<>>===>>@@@CDINLMMLGRbjnnhoq`A@KA8:>=<;;;=?EFHLKOUVRNMOSUI>><;BKPRRPNKB;759=<:;:DHFECLM>89<;866:BIHGILLJHD?=?>=956=@?635768=>?>@?=?ACDGHF:..9A@@ABA><;89@JRF=BIJLIB;8984?KQJFCCBA>>=<9798359<;;;84445:<:78=@@<::97446776654359==;:=???><:98;==;=>9:DMPLJLIA>=8:=67=;53339DKPQNIHJE;:;9>C829923=8;:976669@DGHC;657788777879:8.2BFDBBCDA<:;<=?DKLNMLC98=>?>757;>>@DLQLFDB??@<60,+-.03337765587448<<8520011/18=<<>>:6331//.162+*//-7?77><2*0=7.5DFGC;7620/./+-149>??;63111464.+**++,.7;:64220--./,+++6F;0569954CHGE>9:@DFHF9.0.+//,,+*(+8GF?COOD71**/CSZcmg;DU[N?8422241,/;=0-35-+..+/@C4@^ebg]EEIKH:20/241/,+*(*,--..AYJ58:9=>;:@EEDCDDEFGGIIHHKOQRTVYZ\]^__`a^WNLWgmkkje]TKIKMOPPRUUUUUUUUUWXXY[\]]^``aaabdcdfejuvjZVUPzy]SSVUU^ea]ZXWWWZ^gpz|lhj`Y^fc[dqttrib`a`beglrusmkpvsqpeWTUV\\WTXY[\[URQZ__rYVUWY[_^\ZWTUV[X`^^__XRVRQZipvwpmkkhgc`_^]^\VPMNNLLJHEPixxwy|{u}jlj`p~_RSMJGEEFFEEEDCGbTGKLG@>>>AABCCCCBBAA??A@=<=@DEDBA@AA@@BEEHRWSKC>AIF:9?@7TSCZN897>GLUVcV<>?BINPK?:GE<=@B?<:;?>;<<9=@DFLOLMNJKMJLNMURNQKL[gkeYOHG?==<;<BEKOQTX[[\]]]^]]_`^^\SFCFIJE?>CJKHHIIIJHA?DB@E@:ETY^bbbbbbaa_UKMNPSWWSMIGFFCAA>=CEJYVG>;BJG>AGC?@@BEIG@;=>=;>=;EOI<:>????>@FGGILMNOPNIC=>HU_`XUUWXYZ[UKDCDGJGA@L\UHILKIEA?AAACDEEFGFILJFIQXWRMKKKMNMKJKLIFIPUY[]_a^VQQPNMKKLSRpǻɸɮqtztnhehmqz{mhkllmmgdfgb^YVRRPMLKIFDC@@@=H{|{~okmke_TYtj[^]XZ\ZXYWUUUUUUTTUURQQQPNNNNOPQRSRRQPQQPOOPQQQQPOPTVWRPQQSSRTVWXZ[]_`]^]XW\^_`___\ZWZUV_[G:779::>FC<=>?@AFMOMLKKKLLJGFCB?AD@;899:888:@CBA????A@?;;AGLOOKWlzvmhiomdRE@:679=BBBPb\^spN=BHFCIUVHBFJOZ^RN[aedHHlhTOMHFDB@@AAAA@>=<;:;;:;<<=?CFFECGPVWSMLLNQJ==EJLNPRRPJA;63/7>=<;<:AYd\]fkl\@9BECCB@@@?<;=AJRUTRQM>CHFEEGJHDBA@<78>GKJJKMLKJHECCB<8BEFGIJB9>@@>=?BBACD<8ALQQI?::976;DHFEFECA?BCBBB?9348;;<;87514<=7019??;;?B>64:AFC<766779::;=@DFC=::;>@?>@A:4:ELIJPQH@?<:>=>?>=;85778ERNB;;<<;9459537966;>ACFHA8788888888559@DBA<766778778:<=;842586777>>406?B@@BB=79<=<<>DKKLJF<9=A@?>968<@>9=KOC;=?>974/.255544359875544469<;:860//138;<>>:32354440)(+,,,.11463103535>FIJJ?77650,-2323:A@=:5/.117AC90+)+.-/8988741.**-.,,./?S=100786AKGAA?62269@HB0%9YS1(41)',7ED8:P]O7++**)(*04=@@MLA8117:=ACA?DG>24<<51011+/<5*;S]c^HFIKL>2001122100/-*+044=JA7<<;??=;=<8(+;DA@FJFHD>@:@JA960.26763275,EEECA@??>ADC@@CEIJIGIKKIFCACFGEDDFMQOOSY[]^^\_dfbZTQOMKIIGGFEEFGFFEGLQYaZE>ABDEEFGIIJLLKJMOPOPRSTTRJDDFHHFB??@@BCCCEDCCBABDDDCDEEGJNQTY`ccdefedddddddeeghghihe^]_`_]_`YJBDDCCCDDEFEFGFGHJKKMPUZ]^\ZZYXYVOJJU\\\_bf_PJKLNNNPRSSTUUUUWYZ[\^`aa``abbbbbbcefinkf_^YTy\XSTV\hjb]YXWWW\hkjxronc[^gbYU\jruokhggggijlorsuwvwtonaWWWWYXVWXZ_]WTSVXauWVVWW^cc`]\YWURXY^]]\ZX[YXZ\_clqnmkhd`][\\VUVVTRPNNKEJKKSZ_bcu}c_VKԉQRPMJFEEEEDEDBIhOIRLH>>?>?ABCDBCBBBB@@BB>;;>ADCBBBDBA@@CDITVNFB@>?>9;@;8YRBHA<;;OhxrZbD8@BEILKF<9EDACBDEFDA?@BABHLRMBFNKCB@C?:98@KLQZ]_]VNA=9:<<;=?LY[`cccccbbc^OBFGJRSMGFHHIHCAAAACDBDGC;9?BBC?;>ACEHJH@=?@<9;>;9CMH;9<;;<=>BGIKKJKOSXVPKA=FT\[WWWWW`he^VMGGFJMHGNSPGHJIGFDBBCCCDEEGIIJLJGJRVUQMLLLKJLLKJKIHLORZ\^`c_QKMLKGNVT_Oƿİvt{sgebcjtu{xjehjlmlkhkpk`YXUSQOMLJHFDCBB@@BEJNOMLJHGJQQMKJIHGGFA<;;<><:=AFE@:>?AAA@:77?KSQPhvvjb_fmja`U=368:@IIDGWd^d|oJ;CDESaT?CHCIUUPWdhquM?upTVSLHFCA@ACCAA?=<;;:988:;<<CA><=:9FSJDWjiT;:BA?>@C?9=?<>EPSQOPTP>;LNKMLB?CDFJLG>9;@EIHHHFEBBEFD?73:DFFJORQQOLJHCACCB?:52441/7@CC?;?@86=@@@AA?=<BGGDCA?@BACC?;889;;;9755569951/49<=>??=;9;:769<>?AEFE@:;?@>>?AC>89@GLNLHA:<;8;===?@?;882/>NL?66:;999656779733542468;;963/-3:6-3<>AEE?615?CA@A>=@CC@=>@?;:;;:;>@;9EUUJEA?=6/-08?@=;99:=;7567656899:;<9/-/39>?=>;8;=;5159;<<3.-01///./0/122468;>@DFH>448:3*.6412=IE=840/235ALJ@4-,1007:::640-++,03352>R://,/4?KLF:9A90/06=DG5/ci)'LO.'17:D:3J]O8,,./1.,,029@A;/2>B@=CQYZZ[VLGFED@<:<=916B81BJPQCDFIJA321003568971**35669>@@>ACB>77650.7>>>DGEA<>MRPWTLHB:877865541EEECA???>?AA?>?ACDCAACGIHD@CEDDCDEMPMNU[^`ccbdfije\TPOKHHHFEEDFHJPW`ioryu^G<>?AAACCCCCCBBBB@AABDGKNQW\\^befeddddddddefghhikjd^[\_][^d_NCCDCCCCDEEEEEFFFGGGHMRTTRPQPPQPOMKJLKKLOTTOLKKKLLMMMNPRTTVY\]^^_``aaabbccdddeeegihffhaXzaYSQRV__YWVVWSR]lkfruruk^`ge`\[Xdqmgkkjjmomijmquw{y|zqcXXYY[YWXWY][WUTSRcvUWWWXehdbb`]WVTY`\YXWWXXX]bYPYmz{ywpga__\YSSWWWUSPRNBGOLHILMFNkqO@B>mGNSPLFDEEEDDDAJiIATJE=>A@@CDBBBBABCB>?CGGC@?@A@@DIHEDBACGLOMDBBA?=>?=A9>]L>>:=A<;;>>EWWMGHDACHA89?EGHGB@BCCDFHGGGEDBBHLNGGJJLOPQL=::<<<<>A@GNJDFMQQPLECCCCEEBAC@;@C@;:=<9:<>BDB@?@?<;CKMPMJLTZ_`XNF@@LWYVUURPXaXPLHLPKGKOMLKIFHIHFFGFCBDDEFFHKLKIIIJLOOONNONMKLLKKJJKMNOWZ\_d^NIKMLDXlle}̾ʼwmf__fossyylccfinomllorh\XXUSPNLJHFDCBAD9G}udblrmjg[SHNebZ[YXZZXXVUUTSSSSSSRRQPQPNMKKNQTUUUUSQQONOQQRRSTTVYYYXVUTTVTSSUVXY[]___^]ZY]\\]____\ZW[KJ\kwD8784>U[SG=;=?ELMMMGC?>FNNHEDDDB>;989;>A@AACC@==?@><<<=AAA@><MZK;CE?HPKQchei{lJBqo\\SKJFCBBCGE@=>=<;;;9789;;;<<<;88:CIF@==@DFA;;BLQSWWU[_UG??GMLE><S_Q;;????@EEA??=?EPSNNRVQ@;KOLLHBADFHJMJB>;?FIHGFDB?CFFEB818CDDKPSVVQLIH@67@H?1343335FJDBABA>>@AABCB?===@FLQMD@?>>>>=:9=@?>=<;9755776884359;>@>87:=<88:;=@BDED@;;?@===>@?=<=DMJ=652586345579765886@@A?;722442332322;CGHHGGEEECCDCCBAAABDDA;744=EECA=76789;;83103313:==@=966;DHFA?9;2-.7ABBBB@?AB<658:97689:;;;7..05;>>==<:8877678:==6003311220-042258;=<;K3/0/.2BNIE97=7016;>AB7Ko&,jq;$>?+AIE?>DC?DB8357668;<@AAB?BOX]acdcXJ8000//.//BCDCB?>??>>>====>>=<=?AEGEBBC@ABCEKLKNVY[`fghggilkcZTOJHGFDDFGLOT[bjprsuwsdO?>BDEGIIIJLMNPQQSUWZYZZ[XOHDEGHGB>=??@ABCCBACCCCCBBBBCEHILPRV]cffdddcabcdeegiiiklkicYTUWWUXZPDBCBBBCCCCCCDDDEEEEFIJKKKKOPRRRSPMMKJIHGHIIJKLLLLKLKLORTTV\^[[^^^^]]_bdeefffggghhiikkhdvned_\^acca`a`abbenjdrpijaY]fZR[^]exocddeehoojmnruwz{{~vdVVX[\\ZXYX[\XUTSQQerTVVTXhlgffec_[UZ_ZVSTTSSRYgZbt}}viabd_][ZZYWVUUTPDEKMLKIIEBHN[mtg`pkWECC?CBBFIHHHEBCFC>?DJONKIJFABHMLLLGCJQJECB@@=@GMQUWMRbF;>>?BBJZR<9;=<=@DKKMNIDCCHE==CKOPOLGA@@CEGINROGCDEHIC9>NH??AC=8?CF@CddYXXVUTTUUUUVVXWWWWWXXYXYYXYWSIDJORTX[\]\\^^^___``ZOJLLLLE?:55:@FJHB9567;<<:7;<4=R^``bedccbbc_N<==@CGIQZ\XUUOHFEDEFECDC????ABDHKJFEGFA?ACCA?>?><;9;AIPROMHAAGNOOMKMT`dc[NKE>DLONPUUSU[UMLNTXSDBMPIEDCEGGGEDEC@BCDFFFGIJGHIJJJLMNRRRPMLLKKKJLMNNRVZ\a\MIKINTboq]Ķȸwhb`abelpqtpgfghnttrpmki`ZYVSQOMKHFDBA@B>6j}zpa`hlj^_\UPR_\WXWYZYYWUSRRSRQQQQPPOQQPLKKMQTVVUUSRQQPOPQQPRTUVY\YXWVVUUTSRSWXZZ[]__^][XX[\\]^___ZYXYC>m~=7773?X`\PB967;ELMIECD>;AEA>==9788;<<>?BCBABB@?@A@><<==>>?=>AEHF>?Kcijfehgdb_b_G569:GQ@778BVROfsS328:BC?CCBIGBJY`dcaSC=JbnjcXOLKFDCBCHKD==><:964459=?@BDDDA;9>@==???AD@9897;M_^ZcicYPHJQNC;@ABEE@;866:?@?<<:868<>>:7>HB;=@@>>>?@ABA@A@>;BKQRNE>=>>>=97:?BAAA@?<97644:A>63699:>=76:=?BFG?9;>=:::77@C@81-//0221/./1232379:<<<:33898654468755668;;=@@=;;879;;;;98778:9778=@A?85211003235349@FHGFFFEEEDDCABAAABCCC@;76;AEKQF97988:;;:643124799759=?BEGFD@AINSSO@<=748=@A<415;?CDB@@?:89;::88::;;984102479;:::9879;=:769:4../01113.+/35657>B<79:=?;6;<1;F9-/;KK@9325852//8BJLJGA:2-013553/./26:>CADL302125@KHB8783..5;:74,>zGEz{C"PS)?WIA?91/-,--..188-'1LWIEFAACB?<@JQRSPOLDOebA7>BB?=;9AG7,/224//24566611<:.,37658>A=?CBAIOC856789:==;=E?;EJNarxv^P>.00--,*+@ACDCA?===>=<=>>>>==?@AACCAABABBCEHGHKPRQV^_[[^`\WTVTNIFEEDEGKOQTY_acjpporsl[IEGIHHIJJKMOPQQSVY\\[[\_[NFFHHHE?>???@@BBBBACCCBBBBACDEGHHLV`egfddc^\^`beghiijkkjkmeRKPROKHGDBCCCCCCCCCCCBCDDEEEFFFGJMRUWZ\_]VPMLKKJIJIHKMLMMMOPPRSTUV[ZWX\]]\\[]`bdeghhhghhhhijgijiijlmmnmmmoklnljhijhgwug^XZ_`TPX[\_stjjhfedfjmmnruy{{wsdUPUY\]\[YYXYYTRRRQQenTTTSTanopojea[TYXTUSSSRRSXgnxg^did`cc^W[^[ZQLEFJLMLJJHGHF@pǶđSHOID9^ePPRQMFDEFECDCBNl~SFICABBFFDIPRSSKDBECA@BEHKOQNMKIHFAHTOHQVLEGHC@@DOW[bc_kdB@=>zD?>hf@>ACY`I8=AAABCDFJHEFFEHG?=CJPUWTPKIEFGILSXUKDDCBC>9;FC>:CZ\OOUNHMNQO=;ABFJA5Pk\WXWVUTUUVUVUXXXXWXXXWWXYXYXVNHMOQTWY]]\\^^____``WMJKJJJIG>6699=CE<48::<=;88999IZ`bbdeedcbbbZH;>AACHYhj^UUXRIEEDEEEDEDEE@=CIKLKGEEED@@BAAEGFFEC?;:>FPQLHEHMLKJIIHJQXaf[IEGBAEEDGQUYX[_^_db[TICGJHFDBBEHGEDGFAAADFGFFGGEEHIKKKLNRSRPNLJJJJKLLLNOTXZ[XMJJGPdfmh{ºìøxhacfihhhrspjgikouwvsojga\ZYVROOMJHDA??@A5Hztpnlknoomdd_XXZ]\ZXWZ[ZZZVTRRRQPPQRPPPQQOKKLOSUVVUURRQQQPPPOPRTWWY[YYXWVTTSQRSWZZZ\^_^\ZXVWZ\]^_^^]ZX[XBQh63753AWaa\M?76?>=7799?AAABBBCDBA?>>?>:8BFB>CIDAFHT[ijfif___dcM8589=B?979=:888868AFGFEFFFFBA>;89;=?AA@85548Nc_]ghd_REHOI=7:DHJM=2426DE<=BGQUQI@=@A?@BJQRRTWA5AMNKJHFGB;8777888:<==>@=624559:89:98:>?=<::=?A>=?@@??AFJHA>>@@?>>=;;EICACD?96668AIC714657;<;9779=AA=<=;:98865:?@=;<=:45=>:9978>DA6120.242275002246:869<;;812<=9::4157546665568>>967:<>??95;>>;6247524777679CKOF:9::89897666302579:>ACCBBDGIGGJEC?;51028==?CA;99;;49[hP=44@GG>7:?B@<;;;;;;:;<<=<<;:88:74678::9999:;=?>946740/020253,*-5=719DE;57:BKJEE@-7QN6.@MD7743672,,--3BORTN>2-+-.232112358AKDIR3/2235:CC=8883..11.*))(@js~zD0_Y3AWOC=620/.,*)1AB41BMQQD?DEDCACFGLQNLT`cZ\py`OC?91/136?A5+&&),135568976=?600998<>?>?CFGKNJD;889;=?>:;D:2637Tox{UEE63111.,+BCEEEDA?>>>><???>?AAAA@BCBBBAAABCDDFFHT`dcdeed]WWZ_cfgijjklklonbRKKJHFDCCDDCDDCCCCCCEDDCCCAAA@BIPQPSX]bbZQNMKKKKLJIJKLKLOPOQRSSUWYXXX[]\\[[\\]_dgceghhhhffgefhllilmllmmmnkjjgddjvoiuq_YZ]ed\]`cc]gvwrmjihhimnkpuy|}zeVTVVZ]]^\ZYYUXUPPQPSfkTTSSQ^ntlgb\WUTWVSUSSSUVVWj~yh]emja_ag`X\c^UIAEKLLKJKHHJLCMRLOIFBCIKNQQNGEDEFEDDCQpyPLOBADFHGDGLNQSOHBCECBBBDGKMKJHHFBAITSMIPOJMNHDMLHILPU[s_?>?>>>3kbDIIQUTPWaVJHILRVULGDA=;::==>?@=GVJKSVTXWPPJ=?KREEEAGHE=CeaZYWWVUVVVVVUXWXXWWWWVWXXXXXVRNOPPSVXZZ[]]^`_]^__VMKKIHHJHB=;:57AC:6:<;9:?><98@P\`ccdfedcab^RFBBCBEJV[Z[WTROJFDBBCCDEGHGB?DLMHDABFKMKG?;ANPMKIHB<888=@DLPSROGB@AGIIIS`WC>BBACCFHGQ_XS^eiplTGFGFEDDB@DFFHKOPI@@BDFFHJGEDDDHLKJKNRUSOMLKKLLMMKKMORTVTOKLKHOcemfĽȹĽ~pptwztidhsrlegkqvwusmjhf`ZYWUROMJHFC@==B;5rw|wspoqqpnkhaZ[ZZXXWVWZ\[[YVTRPOOOPRRRRSQONMNPRSUUTTRRQQQPQPPQSVWWXXYXXWVTTSQSUWZZZ\]]\\YVUWZ\____]\YYaXL{IIC;5DPX]^[T?68@GJD;;@DHLICAFG>9899;==;:>BAABBCDDB@@C@@@;7BUVOKJEEGCDYok_aa^`aceR;579:=A?>><>BS`]_kg\PBBHE<658?AAEA96448=?>=<<=@?=>BDEEDA@@@A@@AB?>>>?A@=>BB@?????ADB:@AEF>78989::;;966<>814=@;7887>:78<>BD@;=@<9525;<::;;;;:;=>>?ACDDFFEEEEDDCBBBBAAA@@@?=:=CE?<;:86455676520137;AEEDA@EJLGC>742210/036:AFCAA@<:8=><::<<==>=<<=?BC>::;<===<<;<;;=<734553156.5@:,)-7>21@HB64:<841888;=??>CHJJKJF<865568527>6/,&(:XqxL4:5/-/1.,*DEFEEGEA@@@@>=>@@@@@AAAAAAABDECBBBBBBEGGFEEDCCCEDDFIKKKHFEEFILPRUX\enlbbmrqopn]ICCFHHILNMNOOPPQSSRRRQRRMGFFFDCA@?>??@@@@@ACCBBAA@BCDCEFFLZcbbddedZONW]_aegjlnnnnoqfTKIGGEDDEDDDDCCBCDA>=@GPXVW^_OBKKGLOU]\RNNMMKKMMLOMKKJIKJJOQSSUWXXXXZ\[Z[[\\[\]_[`ghiifb```adjhfgghjlgbac_[[bak}uorfSajc`cahieg`]n|wqonlkjmplntvz{dSUWUY___^\ZYVa^PPRRQfjUUSRUlusXR\[TSTUTTTSSUVWUVn}~{xoikmkg]YdfPFV\SKCGKLKKJJIHJMNGDeoMQKIGFECGKNMKGFFFFFEEETszQKMAAFHHFECCCCIUSFBFHIKOUVNL}Y>CEDTRRMADKLLJEBHGA@@@A?\Y>>@>=<:3L7B?=@>=@ABIKKGFFCABGOMNSRPLKJB?DHHNRUQYc`MGHINQRNIFA;89:;<=@EDDEIKDACFYlreWUI=G_aOUH?CFHB@Sh\VWWVUVVVUVUVVVVWVVVVWWWXXXWVRQPQSVWXY[\]^^]]^__VMJJIHHIHFD?959CC<69<;9;GHA:;GU]aceefecbbaXICFFEEFGDFVd^NIPPIECCCBBEHHIGBDLKD@?AGQXUK>?@ACIH@KaXHQ]_c`K:=FIGFDBBGGEISYVJ?>BFIJIIHEDCCGKLKKMRUTRNLKLNPOMKKMPPRPNHJLKHK]edyʾɹt|sg`_`ejkdagpy{wsnhhhc]XWUSPMKIFDA?<;?3L{~{rnkgfggfe`Z[WTTVUSTXXTSSRPMKLMOOQSUUSTSROOQRSUUSRRQQQQQQQRSUXYXXVWVVVUTUUSSWXZZ[[[[ZZXVVXZ]a_]\\\ZZdWNl@mlO6Yga``YQ<8=CGJE>;>ACLQKCDG>:878;<;9:CF@??ABDC@>@DDBDC;:H[`a\QJFA?WpjYV]a`abbW@6799;>CKJ>:EG=:@A<;>BFGHJOT_ji_L??Qbkd\\dcXRQLIHDEHHLHFDAAIU]bcbdbYTVW]ggcc_N?:<><9:=AGGEDGT]\cmcK73DLC?A=;B=:;=><;@GFA??@@>;BRYRMNIGLPRLB?81;LOOUSDJKJKIFCCCFKNLOMFB<56:<@EC@?=;<;::;<=>?><;::972./1589::87779::<@DB=:=AA@BCA@?ABBBBA?>@A@?ADDA@???@?>@ABBA?=>@CFAAFJG=8:<<<==<:767;>:34:>=75887626;:;<;:::8879;;::;<<=>@=537;@CEC>>=:6247<=;;;<<;<<<<;?FFDEEDFFDCCBBBBBBAAA@AA;10:=?><<=<;=>@A@?>==:765113543366/6A;,),14/2=C;04;9@QUI6*).29=>A:333663/++/.+,9OWUQB;@>852--0114F80EN<8EQUNVnjTKMMJM[ccqwh]YhjSJJ@34931=E>3)*79574-/7>B:/110012448=>AFIJID?64210/0,,360)),,2JilC+01.*)+,,)FGHFEGGFCCBB@>==?@@@@AAAAAAABDCBBAA@BDFGGFGEBAADDFGDEIKHGHHJLNNNNOQX`cbempmkkliXKDDGHJNPPPPPPQQQQPOMMPRPMLLKIFEC@@?>??@@@ACCBBBBABCDDDDDGS]^`abdjePFNUTV[adglopnmnj]VPHDCDDDDEEDDCBBABFMS]glppqslS@DJMMSXZUQPONLLNMMOOLLPW^edRMRUUVWWXXZ[ZZZ[][[YVST^hhffb__^`\Zab^]__``\XVVbure`onmwycOavm^dddi]fe]bnrolmpnintrru~gSTWTY_\\]ZYXXb[RPRTKjoTUURWqypRYjbUSTTTUTSSUUUVVg}|wtwwrqpi^VYP@GPLHFHKKKKJJIGILNOK?odKOKJIIJJIKLLKJIIIFEDFHWuxPMKCDGGFCB@>?=E^dM@FPVZ^`aZZj7ST>>==>?ABBBBFHJJD>DOPNU\XLFFC@CFFKR\SQSUNGJIJLNOLHB=;;;;:=EFFEHGD>IJ>_}}h\[I;Upd]cMA=@DA@LcbWUWVUVVVUVVVVVVVVVVVWVWWXXWWTSQRTWVXZZ[^^^]]^__TKIIIHIIGGD=64;CB:59<=AEILA8AOZ_bdfggfdcc_TEAGLHFFGKYfeWKNYVKHJKLKGFGGGHEFJGBA??FQWSG?DOSNFDCB@>>BGMNMLK?>FC;:>ACBB?CCCB??>?BE@9E\R@ENKGGB;=GMJHGGFKLIJQTPHB@ENQQMIGECCCFJLLLLPTURPMKKNRQNKJKSSPNLIJKLMQ[`aþȮ}|yv}lWQW_cced^_ht{{uqkghg_YXWSONKJGDB?=<;56}|vkhjf]WW]a`^XTTUX\YVWWMILLJJLKKKLNQSVVSTTRPRSTUWVTRRQQQQQQQRVYYZYXVUTTTTSUWUSWXYZ[[[[XWVUWY]_a]YX[`][cSD][~}_8VsqqqeM=ADEHJHCBADHKKHCBB>::99=BAACJJC=<>@EE@>>BIOOKIJNT[ahgU?24DQQSSGCH<4=G?2469>@<IJGEEEEEEFKNJIHDFF@:89;547755579<@B@<:>CDDDDCEIHA=>><;>>>>>>>=>AHJA:;<=>><<>=<;:;<<88:<>946:9:BED?639BOP@676564238:997316>AACFHE;1388;?ADB====?@@?<:<>?<9:7337>BEF?:<;61244459=====>;::>GHDBBCEECCCBBBBBBAABBAA=21;CB@?>;5568;:996655118@BBCFGGECA@;4112773/3?JOME??=<;<;9>?<92+0>A;@A?=<;:::;==;87=>>??@?80/0014323336764/++,.0026940352:JK;-'*/0,/683114882,+/55038EWYSF9>>???@BBABBBABBCDDCDGNSRVZ^chcTHGKLMORUZ_befhgcXVZWKEFFFEEEDDB@EPX^a`]ajsvsqomRDKPSUUY^YSRPNMMNKKPW]hqvuxjPPQSUVVXYZZZZZ\^^`]VQPWca[\]`bab]X`aYTVWUTYZR]xdZhne\akjepfWf`emhggec`cornpssst~oZUUVTYbXYZYXVTUPSRPQKvoRUUSR]lpXdsbRSSSTUUUUVUTWYZj~|qu}kakkQEIHFDFHJKKKKKJGHMNNOKFNSJIIKLLNOMONMMMMMLEDEHJYvuOKKGGGEC@?@??=HbgVKMSY_[TW]evb_b_e[LBA@AA?FKFCBAAA=>?>VS=<=<;::9;=<=>==>=<>@BCBACEGKSlr]LQW^XJB@@?B??GRVLJIGGJMLJHMPQJD?=?=;8>IHGIPQIFW^H]vugbYD@ajUSZQD;:AHLNTd^WVVUUVWVUUUUUUUUUUUVVVUWWWWWUSRSUVXZZ[^^^^^^`]SJHHHGGFED@:67=AA=:=?AIJFI?:JX\aceeghgedb[OEAHPMH?EXb]TPR[^UMLMPUVQLGDBDGIGEFD@?ELLF>?KRMEBC@=>>@CISRJB?>AEA<AFGHIKJJINQMMOMIHGEJUUSOJGECBBEILMMKOTUSQPMLNQPNLJJSVPNMLJLPT[`[s|vu`W_dedda^_juxusmhhhaZWWUPMKIHDB@?;=93bw|tibeg`SLQ^`^[TNQY]a_]]XKKQLFHPUPLMPSTUUSTQPRSTUWWVTRQQQQQQQQTX[ZZYXVUTTUTSVWUTWXZZZZZXWXXTVY^ab\UUZdc]cR8clxpFPrx{}sPCHIIJJIHGFHJNJDEED@::>CLMEEMIBGRWRNOPPQOIFMYcoywn^RNQUdmbYcsxtbQHCADJMOIJW^]]_b`][WSU^dYOXcln]>07@FMQRNHCITVRYcaQC?=8ASZWSKIG81=F>37:=:8;@B?>=;66==>>=;;;;:99;=?CFC?;52138977;:744345458=BD@;=ADCDEDCGOL@:9;=;;>@BABGIHHHHGGDA@ABBBDDDEEEHE;2003=EECDCAADC=8:CHFC???@@???AGJB;;===>==?AB?9:=;<=<<>=99=><><7312:DHE;69:972/158>?>@ABC@79BF:459945>BDFA7985122/.5=@@@BB?:68@EFC?@CCDCCCBBBBBAABBCCA@<:<=>>>=;679999:::<<92,1;BDFJKIHIKH>889:983/5BKNNF>>>=?ABAAGPQ>,0@FCCGJHC@@??>>=<987765421/06;:9;=<<<;5..3676311113;6+',.0234642022203:;2--.///0112347;92/027<=<:>JOPI85;94/.243544;FE=GT4034880,.-,,+.79:44@D6377654NqR%-899;>;7323359@@6-049:750/66.-BPSSJFZdctiC3?RsoFAKHE<100.35310013882-5AA=<<><0-0*&'(-7;::?=1+4:92.3536@FFJOS[bdaSABFEC=2+**+EGJIGHHHJIFDAABAABA@AAAACEEEEDCCCBBCDDEFFHHFEDEEEEGIIIJJJKLMNMLLLLMMNS^fjlppmfYNG@>@AAA@?AEILOQRSSTUVUVUTUUUSMHFDB@>>>>=>@BBBAABABBBBBCDGIHFJPU\ZQLHEEFFGFGKLMPW[\]VOV]SJIIJGEDCCCDIQSOJKOXhiacjnrqYDLVUUY[ZWVVROONKTadciswstzfMNUVTVYYXXXXZ\]_aa^[WUVSTWZac```ba^ZWWWVTUWYɸYSTZckmebgl\Sc\[gijhc]\^gqrrtutrjbk^UWVUUZhWWYYXVRPPPRSRO|jPUVSQQap\^k^UTSTTTUUUVVUW[X]yrr|{sYrwQFIHDDFIJKLLLKJGHMONOKNHHKHHJLNPQQSQOOPRPLFEFIKYwsOKHHGFEB??@AA?EX_a^WPRVTNQXYckZ^UKWOC>>?><=HSTKB@@@?@@=TS=:<::999;<>?><<<<=>@CFKD>@DQnGagZOF@?@B@<9=A?<=DPGHNRNGJQXRG@=?@@96HMDHY[LP`dOSWPU]KDJLKKMICDEC>:9ANQG?AC@=@CB?DNWWQIIQOH@;9EKHCFHDDNPD9;?CEGIONLF<=B@?HOJDIMMMMOQQQROHGGEKUSOKIHECBBEILMNMNTVUUTQMNONLKKLSVTQQOOQQQZaVȽ}e^aa_]_^aksttqjggc\WWUQNLIHFCB?=;<5Vy}yqfaa_YPP[b\USRQPRUYZ_bXSXXMGFO_]QUXYVSSTSPQSTSUVWVTRQOPQQQSTXYYXXWWUUUVWWUVWWVXXZ[[ZWTW]^XVY\ac\SRWeb`eS>>`p|aZlux}v\IKMMLJJJKJGFKLFEEDB;;?>@KLJIGFB=8>BKSSQTWL=:A@:CSUPSRI?46AE>9=@B95;@?<;;:517BJOLECEGNSRME=87AEGIHA=CE@?A?;<==?@@@?<;<=<:9;=?BDDA<6356898559;:6127;?@@DFB>ADBBDFFDFKI?64;C?=?@A@CGHHIHHHIJGEDDCCDEEFFHKC50008DJHEDCADE?74?NTOG@==?@AABACKMD<=???@??DE@8:>;9;<:71.1215>BAABED=516ACABEDCCBBCBBBBAAABBBCCC@@@><<;;:867899;=>===92,.5<@HNQQPKHDA>=:6792.7DJLKD?BA=@FGBER[ZOB>BDDFHIGA@A?<:;;:7755320.-,.1356;>96675336;<984011154/-13578;<621222222321110.0321248:<:52/07=?;79>AHH3,122003435404?F?HQ9>E>86765995103<>4?QH.+48:<7-51(-1368<<1))+*-:>701861135429<7CcbPOMDO`ipT1+17SZ@DGBB?740.14677767961/4;=@FHIF:/-,))'(08<96778:<;6168/+5EPUVSWabZRKHFEFE>6321HHGGFHJLKIHFDBBBBBA@BBABEFFFEEDDDDDDDFEEFEDFGFFGHJJKKJJJKLMMMLLMMMMMLMWfmpqlfbXIB?@A?BEGLTYZ\^___^]\[YXXYXWZZSNIFDA@?>>>>@AABCCCBBBBABCDEEBBFGKNKDCFECCCDDDDDEFIMNNLHJNMKKLNLFCCBCDCBB@?@HPQSWcmnrwrXISWWZZZZXYUSRNOTVUV[fjfjvxfSJPVTVWTTUUW[\^accdfc^ZXWX[]^^_a`_^\\ZYVSS~wMSOM[krplfc_][XRV[aid__`bglst{ybQYZYWX\\`cOS[YYXSPPPNW\Z~gMSWSVSXqjQT][WXXWWWVWWWZ\Z]hvx~y}v}]WYRIFEDCGKLMMMLJJGINMMNLMOMKIIIIJMW^WZ`\UROKIIIJKZzqONHHKGD@>?@AAB?HXdaVMMRSRVS@>CAAAACB@?@??>>HUYNA>AFEC@=UR=;;::989=A@??>>====?@ENK??ErۡWEcoVD???AB?;9888:1FlLBJSPEFP[XK@<>>DFBITH?NUPbk\OI=6?GBD^fE47>E?89BIIHERc^TUWWVVWUVWUUTTTSTUUUUVVWWWWVUUUUUXYY[]^^^^^`]TJGFFFECB@=<<===>ADA@@AB@8;LZ^addfghifcaZOEA@CLQOHKMCMddYV\cXHOXVWYSF==DLQUVSJFGF=:8:BLNE=@CBACFEFKRZcaW[_^YF::JXWIGJFFONB:<@BEGJLMNLC@CBDNVUMLKKMOQSWWVQLLKGHQOKEECA@?AFJLLNOPRTUVVROMMLKJKPVVVUSQTUPMY_n͵Ǽvkhnkc]``^XY[`jprslfdb]YWXSPNKHFDB@?;;3Dv|}{tlfc]ZWNM[\OHJSUNOQQIP[[Y\[NDBJ]_[[]^XSSTSQRTUTSUVUSRQONPPQVYZYWVUTTTUWXYYXWWYY[\[[[[VSU]`\Z^^aaYUU[b_afTMBJHFGFB?;6:EIGINRSUWX]``^VV_aK988:<>AGFB=437=DHIHHNNIK_od\kts[MOQQQby}y{TDE=FKMJKOH>;????DLNRXRB63;89;:99:>A>=@FKJFCAELPOH?:87:EICGUXI5266:FPROD;6>GMG96<=;=?@=:9;=?@AA@<6589634447:96315@LLDADDCDC@@BHIGGFC=40:DA>AA??CFHGGFFFFFHGGFFFEDDCEGE<3367>IMJGDABED;35AQWNC>=<<>ACDEGMQJ?<@CED@@EE<6:><78<=60//2987BDDB=8/+05;AEB>>>?<5/16>?:?LJCCCBABAAAAABBBCCCCB@@@><;9865569;=?A?;951.133:GPTWTH@>>?=51670/9EJKIB?BCA?FF@FTWUSSPKFDFGGDBAA?;8:;96544320/,,,.267::767888658<=;61//023554348;><741/00113532210/3522568:<;73-19:6339<:AG3)//00265245468<9L[MafXE868;DG>761360;J9'%+364123,02/6>@<;60-,+,154333/++.566;<>Oc]PPRGDT`Q2*//2AB6@BAA@;764//6:?BCA:3./016@GGHF?2--+*)(+2;=;9:;;:753351+-5=GS]adZJLY\K9>JF=99:JHFFHJNOLJIGEDBBBAAABCCCFFFEEFFFEEEDFFFEEEFFGHIJLLKJKJHIKKLNNNNNNMMMKNV_decZTSOGDEFJPTVXY[]]^aab`^\\\\[ZZXW\_ZSNIFDBA@@?@@@ACDCCCBBABCCCCCCCDDDDCAACDBBCCDDDEEEEFFGFEEEGKLNPOKGECCCBBDEFEECGZjklnopqr\JSYZ[[ZY[VSTPPNLKMLRcmmosymLHUPNOQRPQTY\_abcdffd_XVWWY\]^]]a`_^[YZWX}ŚXIQOJQ^jwsYWfcXUPQV`pd`acfd`ksmtwhX[Z[[Z^[aVEO]ZY[TNNZlhb[~cNSTSWXScpb\gd[]_]\[[ZY[a`^fuzrvy{zyxv}rtzbUNKFDDEEIMOONLKLJFJPNMNMLLMMJKKIGJXbS^siYPKJKKLMM[ylOMEEHFB>?@ACCDAFXaZNIOVURVRA<<=<=????@@?@ABIOQKDACHHGFHZQ?=;::::;=???>>?>==FPYN?<=?@A=;99:;>2cJ;EOPGDKTSLF@=69;:?NTWG=======>=>>>>98EU[abddfgghfc]RHBBAAJQRNKDBRdbTVfeOJX\WVYQD==@FOWVOIGHGA=?ADGHGABFFFGGHOUW^hha_`\SF;>JR\WPMHFJH?;?FEB@BIJIJHEB@FPVYUJGHKNS[][WSSVUNIHIFCDFEEECFKNOOOPQSUVVROMKJLKKT[XWUSQTUPQ[ZĪǼoaZVRPTZ_bf^XY^glnlfa`][ZWVSOKIHEDA?<;6:ys|wotunihg^][PLXYMGKTWVUURHCISYZYQD?I[]]]]]USSSRQRTUUTTTSRPNMMMOSWYXWUUSSSTUWYYYZYY[]^^ZYXVVVW\]\`dcb^YWZ^_ZbgTPMI?@DGEEFD?>;7:EIGGJOU[`gkhd_Z]cZCEI?L^jVDQLIOUWTQMB964569=?=?=9559?DFHLQPMP_mdWkwt_OKJDHf}|||aBAB??EKNRW\]UIGPUNNNOD@GF=<@>=CD<768;>BDFHFEFC>@A@?@ACKTSH>78>CDDFDA>:888888;?DE@=ADDC@>AGKIA;88:;>>:;=@@:46;<989>>;:9<>@BA>>;658:60/224543456>IMD>?CGE?;>>AAAACDEEFEEEDCEFCBCCCDDCB@=856:=@CJKHCABFD?85=99>>@DB@><==>=5.29;43@F?:<>>@@=;:89:988:;5/5AC:7::<=<=<::951159=@BB?<:<>=>?@=>AA=;7426=BEC:7888645:<;957=ADCACDBAAAAAABBBCCBBAA@?>;866446;=?>?>:62..2438DLNPNECHFA<83562/7DIKE>858>>FD>?FNQQPQOKIGGCA@BC@<78<9764321//-,,08<<8569;<:96569962.-..13442//167631,*---.0343200376238748=<6567631/08@;89:8653215861//0135567AG@:?JKEACH;,14665529>EKH?:;<968=FFD;1--.//6=V`a]I??==:;IHGGIKNPPNLHGFCBBAAABCCDFFFEEFFGGGHHGFFEFGHHHJMMKJJJJJJJJKMNNPONMMMLJLPPRQKHJLMJNTVTSQRSUW]^\[[\\\\\\]\ZYZZ\``\TNLIEBCB??@@ABBBCCBAABBAAABBBBBCBBAAABBBBBCCCDDDDBDHIJIHIKMPQPOLHDDCDEFFEEDDNWW\iurmihqfLNWVYYYZVSTQQPNNONQXaistsnhXMGCGLNNOPUWY[\\]^][YVTVWX[[[\[^^^][]cZ_b{ֿzJNSRMPMSc_LRd`VTUUVfug`dgieZ^qXPcm^[b_]YUR\ZFN[YY\TRZqp_`RTSPOWTOexpdfbbec`^]\]`cadhqvxvwwvsrquz^[_]\XS?DEDGIKOQPNMKMKEKSPLMNMLMMLLLKIJNMI]qjVQNLPOOPP`|gMJCCDDCAABCCCBDQ^]QGENUVQPSVPD@@@BBBA@A@ADHOUXOHFFKLLNP\RC=989:<<=>>?>>???>=>>?ABFG?ZAHEDC<;=>?A?<:889:1^9BHMIEGHHPSHDD:9N]\T@?LTag[RMF:9>DHGMWV`cS=8;O_XE:8CYYSTVUUTSTSTTTSSSTTTTUUVVVWXWWVUUUUWYZ\]^^^^`]RHFFDBA@??>>>>=======>=<8?NX]cdddfffgfc[NEBBAAHOPJB>@HRSMXdYGKTQOSTMB><;=GNLIJIIHCADIHIIFDCFGLNHIORLSbeedeXHKLJEEZf^SJEED?=CLLA=AGHHGEFEBGILNOFEEGLUaa_XUVZWPHEFEIMTVX[THKPQPOPPPSVUPMLKKLKJQYVTSQOPTQRTkϽƿȹļ|}xqswiYVYY]eokb\^cffca__][YWSQMJHGDB@=984m{u}tonnnooh`_]VT[ZSPPSVVVUSUNEKSUUURJNY[\\ZWQQQQQQRTUUTRRQPNKKMMPTWYVTTTSSSTVXXYYZ[[]_^ZVSRSW\_^ZY`fc_ZXX\b_X`eSLNE<]q`@BJJKPQPPIIJHGKIC>CHA>A@ABBAEGB==;9>?BFFJQRQUX\geYlvqdb_SH\~ywuw^FCC@@DIJJKSZQFKRTQQPMAAB>EVXG::<<74BIMOSRH?@@AA@@FKHB@>;;CIFB>;;;:<<99>HLMH>9:>=>AHG<7=>859<>==;:@IJFA;53223655888=BFC<:96489632343344558<=A>;@AAABBBCDDEFFEEGHD@>ADDCA=::;<>@ACGJIFCADD>957;HMI>BNQLIGOVVROLIFDCDDA@=;99;<;:;>>?CDB@?><=>701=A52@I?8:>@CEC=>AA>=;:::616;:88<;<<<==:66653679=??>=<>>=>@@:9=;54568>?BAAA@@@@@AAAAAAAA@@@>;87679>ACBB?;860/2555@JMOSROOI=853477//:EHA;9.-7=EE=58EQRLMNPQKC>;=BDD?77;<:75443221125<@>:67:;9876876541.0146566410--.20-**+++-/134820284//5536:96677645339=99;400//010/0034660+IooeH4/008LOKI=510-)*/7BA6,*/:KM=22<88<>AJOQJC@@ECACHD=5+&*.06Xppncadbj_ELRXZYZVTURSSQQPPRNO`rtjhlgP?BFHKNNMLQRSSTUUSTTTTUVWXYZ[[\]]]]]`]WYft֏[UY[XVUMRYUU^b`\WWUTf|ibfigaXX_TJQl_V`\WWVQ\gLVXWZYQUmk^TTTPQ_ia[vw\Xcfefca_^`deca_ZanxwuspmknkWUQQUZWLQFCIKMQRONMKKKFMXSMLMMMMMMMLLLMJ@CoeS[USSRRSc^MH@ABBCCDDEEFGFP^ZLEDFJMPPOOLD@AAEFDB@@BDHMQURJIMNONNNP[UJLND::=>=>>=>>>@AB@>==>@EL>kޠGIJCD>9;==>BB<:76794֍?@ADGEEDENUEEUK69P\YP[b^ZWOILH>=====>=;=KV[adddefffffe[LCBCABGNMB::BFA>DGC?>62DVUEDNW_fj_J@@BDDCCDDCCB@>?A@CEGC>:88867:;8448;9:;<;85>IJE@?>;9:997;AIMIA:8;<==?><:6368;=?=9:;=FLNPLD:41//124788;CB735547999::63235835:><;9::=BD;7<>>>?ABBCCA@ACCB@@BB@AABDGHHFIQNC>BEEC@@>?BEEILKD?CC=756=GJMIJOTSJJSWVSOPROFBA><>>?BA=::;=???BEEDA><<<81047=@DHG>>BAABA>===;==:9<>=<<<=>>=987::9999:=@?===<==98:74343366892.6989<@FLE50134.1CJ>9@ABA@?@@AAAAAAAA@@@@=9779<@EHIHA<9:941322=JOS[]WSM:1254554128<;?=<::99665578762007;=??=<:872,+//-.-+,,-.036960263,+3435:877776788:@:886420./11/020/220,,L\OC',1(,>PPGA7-299521079A@:>GNC748?IOSJ4*19:<;920244.*,./022301015>C>=?=?DDDCA><>DJORVSI@CGEFFGD>:3/.-/9A>76:<721017:86135555544238>@BEA4=T[[TKKX_bba[SXaL/),IJIJLMNPSTMHJHECBBBACCCEGGGFFGGHIHHHHGFFEFILMMKHHJKIHIJKKLNMMOOOMMMLJKMNNNNMKIKOKB?DOWTKGLT[^_`aabccbccbbaaaaa`_\WQMIFCA?>@A@ABCBBBBBAAAAA@@AAABBBB@@ABAACBBCCCDDDEHJIIIKMNQRRRRQJBAAAABCCCBADO_`bgcROmwaJQVWYYVTTRSSQRQQSPOXgicaYokF===>=???@BDD@===>DL<\΃;JICE<8;>>@BB>;75684E;BDFFEEFINH@JWO<>?>>>>>>======><9FUZ\bccddeffffcVHCCCBBGLI?<<FOW_YFFJJGKLMLLJEA>BIPNMLNOFAFYhkmolfbdVIWkiYHB?=@ADIIFDCDFFFHLQQIA:===?AB@@<;:;757;;:6488989:9758BHFCA@=<<;87:@FJID<8:<<<:9:;4.4:=>>;:>?:940366::88=?7467669;=>;52246::7:=;9999:?A@==>?@ADECBA>=@BAABCBAA@@@BEIIGGNNFBCEFD>>A>==;;ACDEHIEACD;656=DEDMNQPJHHLTTSPRUSJC@=;>ABDD>;:;>>>>BFFFB@?;:921;C?9>D=47=?FJD:8:@CEEB?@@B@?==@>=<;;=?A@=::==;;;989?A>>><<=;8986541-,054.4?@=>>?CIB1/3664B[`O>;?A@?>@@@AAAAA@AAABA><98;>AEGIGA::9:7410-9IKJPQORUC255667:83027;=:87548668;@LUVNE?;867:BFHC869=<975555668::9::;;86665335897314:?DEHFB>==;512110,*-0--/14640043,+24346666767899;D9765430/134336311.,*,JJ7@AK;$1Q\P>3/+267;84-&1GWND83994@CIPOG749>@ADC;6543.)*-/010,))0=9085;>>AEHECA@<=GNQTWUIDFGGFGED??BEB6./31,'&*34204;CF<756666431.0;CBBEGCHKOVTLJQXiyuk^R[h[C3GGHIINSVZ`[LIIGEDCBBDEEFGGHGGGFGHHHHHHFEEEHJLIHHIJJIIJJJJLNNMONNMMMLLMOQRSVVQLJFDDDHNMF@AHOSX^addefffffffeedbbbca]XSOIDB@?@A??@BBBBBBA@AA@@@AABBAAB@ABBA@BBAABCEEEEGGGIJKMPQQSTTTOHCAA@@AAAACEFKUXYUVhnprbTSRVWUSQQPORUQPSTUTX`]YcqteM?@EJLJKNPQPPOOQQQRSSTTSSTVXXXXYZ[\\c\eUJetqlhc]bqoiiikic]YUNSyi`kovXNVU\kkf[VSSUVUUixYa]^\ZTKFUoo_cWOUh|qpqljc\[fgd_\Q\lknrniec`\UaYUUSWYRHFGKLMWXPKLLKJHQ]\XUWURPMLLMLLMMMH\ٗaVUTRTjWCEBBCBBBCFIIGLXmZFGEEDEEJZ^PDEFECBABBBCEGGEB>>EOPPPOMQMMT\innR<=>=<===???ADHC>>==?H>>?AA=75582}֮J7@CEGDEHGLVJ;IVJ:>FBGWXOD;AGEQa\RXVNLMOE7;ILHSP>448;K^^TPRRRQPQRRQQRSRRRSSUUUVWWWWUTTSUXZZ\]]^^]XPFDD@>??>>>>>>======>>9>PZ\_ccccdeeedd\MEBCCBADGE@?AAAHTVRMFBA@?@@@=;<:@BCEEFFEFEDJQW]`I=9BLGAA@?@Tc^NCBFNQKIHHIOarzo[TYVSVXPIKOUPLKLMNMLLNNMLLMRSVQEſĿ|wpWO\gd]\adcglibaba^][WUSRQMIFEC@@?<8<}r~~xsqnmjhd\SDAPZOFOOLRVSOBAA>HPCRpm78HMPU_WJJJIG;7:==CFDA?>==>>?@CHMMB;>=DHIKG;76;JYfcO?AKY^lkVGGj{AFVTLFFIMOKCBCDDIV[[YXUTSOFKUaicP=8:9653CDEEDDEFFFEA>;9=??<96>FA759<:<=898789:99957ACA@@@DCB85?><986359>A<:?A@>:=DGHJHEC@837;:;=<;:9998558;=9567667=GC><:::::;=>??@AEIJJJFC?:8887>IME@BBA@BEIJGEFFDBCEEEA>@?<<;;>@AB?@FGFF>644;@;:ITRF=?CCKSTQQTSOGDA?ABCCB?>>>>>?@ADFFDCA><945<@>==@>:;=?EE:226ABBB@=><<>><:8>@>?@>>=<:;:86642.2622=DB?@C?AI?-,32.5J]ebT>:<>=>??@@@@@AAAABCA@><;=>=?BB@=9768<>51.6@>>>?<>IF?84688763138<<975431///-/:FKC6365449BCFA;79=;76566778864579::98885445:;8547:>CCEC@===>;54441-+/3.-.//,./.12/0442//1344556778987653311488;;<8841/02?;8Sa\A4MkkO3---569<:8/'+;HA7,'7@8AEJIB;48?BLXYWLFB73,)+.21-3PabR@@<556=>ACHFA=A<9FLOSWXZYOGFFFFGEFJKKG>2,-/1246:604AFECA:::952/0,.;CAAA@@7;XZRPJMS`uxqhQ;JclcDCEJQ]cfjqrbNFFFFDBCEGHHHHIHHGFGHGGGGGGGGGGHHHHIJJJJJJKKLMONMPPONNMMOPRUVXZ[ZZSJGHGEDCBABEMW_bdggffefffffgfdcdddda\XVOGDB??@@?@ABBBBBBAAAA@@BBAAAABABCBA@AA@@@BCDDEEGKMLNOQRQRTTTSRKE@>?@@?ABCEFFGJUgpkddno^NMSTSPQNJSWRPSUVTTUU]jkeko^H@HKHFLVWVSOPOOOQRTWVVVVVWUTTWYZY[fhnrijnmd]^[SYjme_emlc]XQGFqk`ow{VQYY`cXWXXVVWXRQm[`^`^_WQGGYj`dTKZ}}xvsprjXOYjjbbXLXp~wh]^_]\bs^TUTUWPGFJLKNTVOJJKLLJOY[Z^`]YTOMLLLKLLLLF?`ΈTUVRUnV@CHFDBBBELMKIHHPJCCDFHKIGR_YIBEELTUOEBBBBB@@>;DSVQOMJJDCPXfik`F===;<<<=>>@CFD?>><<=;Vd;:?ADD<7;>@>>;<<87696Ff5=BCFEDFJR]O99EGCBDED@>=HW[OLZecX_eMIWUB4>W_XPF;55:@IXbWOPPPPPQQPOOQRRRRSSTTTUVVWWUTSSTWZY\]]]]]WPECB>=??>>>>>=======>88JY[]`bbccddedccXICBCCBAAAA@?BFIRadXH@@AA@@@?>>;8CSQHRdg^RJMTVQNLJKLKKHJS]`UQZ[SMMQdu||ZC>D[dRBCD@?@AABDFHGCBIS\aYG>@JRQNGA==EMIB@ABJPNLKJITgv|wcVYWRRTPKKLNKJJLOOMLNNMLKLNQUQ?wȾƱþyv~kXT\fcVT_d]X_da``_^^ZVRPONKGDCC@<:;8elzutqolid^PJORYZVUNBGRRLB:AQURSSI?FSVXX[^SNNNOQQRQRPMKIIJNQSUTSRQQQQRSRTVVVUSONPONNOQWZZ\]`df`Z[ZX[`_^^\Y[gcaI:7:=><;=BGKNLD@C@:Ia_OXz}^B74:LS\twmlllklbH;=EKKGC@;8569@DEFFGHHHHC>89BSUE759@IQ_R64>\g?<@AEIJGPSOEB?AFJRYZXXWUM>6F_fYH>>@AAAAEQZ[aeb]Q?5458:<@BEEEEDFGHJG@;9:<=??CJKB75;<9?A<:856799<=<:>A@ABDGMNEBIKGDEDB?==@BB<7569:;@B=?CFHF;3799::867876569;;768;;98:EJB;9:;;;;=?ACEDFKPOLJIE>8677>MRHCDDCBAFKKGFGEA@DFCDJJECA>=>>==>>=GRPH@:418>:8CPK=7ERURQTTQKGDBDEDCB@ABB>=@BACGGFFD@>:56:<;<@ED@<;;A?4./8=BFIKJEA@<9BB@>;:=?ABBA?=<==<<<;;6863:DB?=?C:7A<.,31,09EQ\`P=;<=>???@@@@AABBBCBBB@?A?:89867899@@;73331-+,.3650-010016>?>?BA>:66679:977766889;???==?A@=;:8658<=;:98777::611242./1.,,,*+//,-12550-*)*01233566647755333499;>=<9;8;AB?<8;HMJIT]`bL.-06;;:966/*))+,**.:D>?BLD435478BZicIDK?2+)+/531VVDekcP>9;AKK>:8/3FKHQXYbhZMDCBDFJONJJONFA<8?=5013007><:9350Dh`RRMU[aly}b@17MfIJO]jnqsux|ydMGFFEDDDGJJJJJIHGGHHHHIIIIHIHHHIIIJJJJIJKLNOPONOPQOOOOPQTVXYZYYVPIDCDEDBBCDFJOVY\`deddefffghhfdehgdcb`]ZWQIDBBB@@@AAABBAAA@AA@@ABAA@BCCEEBBBB@@@@AABBCGLQQQRQRRMLMPSTVTME?>???@@ACDDDHOTUW[elmhb]SQTRQMHOSPPRRTTTVWYZXYfolg\LGIFL_ijbVQQPPRTVX[_^[ZXWUVZ\\ZY^ed`hpppk_WXZV[big[_jb[WTPKK{mbr}}c_[[`VISYXVWXZTPi^b`bbcUOHDH]dg[Wbqnx~~qwm`OIJWirr]FMjv^]_^_paRTSRQMFFJLKLMMKJIIJJKLQUPX]^`WQNMMMMLLLLLHGHYwSVVUZqYABJGDDCACMOIIGDBEFFGHKLJHHPZQA<@IW_TD@A?>==>>:DW[RLHB@>DRO[d^ZJ==<:<<====>?@B@@A?<9>HC929?@A<8:<>BB:778989>/;koF@ABDDDCEIID@99=AEKA;=======>>==<8CU[]_accccccdcc`THDDB@><<=???DHIP`fT>:@CA@@?>>=76G[YOM\dWLNSVXWQIFHFBFNW]bb^UOLMNHETq{^D;??>@DFEA=?M^bRFCCCAESH>@A?>>@BCEHNQNKKR]iv~fXWRLKLMLKIIJJLPPMLNOMLKKLMQHUȼ˹î}~pt}cY_ggb`c[NMS\`a``a`\WRPMMIECBA=987Qjy{rieeehjkhcdYX`]Y]_\N?@MQMD>DPRKHQYOHPSTTTUQKLOOQQQPNLKKJKLNQSSRSRRRSUVWXYZ[YXUQMMNNOPTXZZ[Z\`c_ZXXX]``a`]Y]gabP@8?@@8?_lJ;ItL4GTY]]VRI@:886689;?A?76=?97;ELLKIIIIDBSaWNgO864;Zrw{zjdaadhlUABJKFKQRONOMJ=9AGGDBBADJD==>HF5378:=?F=36>LrYH@@CIKLEFHHEC>>BDJNNPRSSL:7I[TE@BDDHKLPPOPW`gb]WB14<;;;>>>@BB?9656:<=?>::;87;>;78;86>DFKL>32477543334579:;;<;;;9748AB><<;98:?EGEEDCDILKKLIB<;=BIOOKIIFDB@DKLHHKJFABCBDMURJEB@AA@@??>GURE?>6.3>@??@;559>>ELOQUVRNJGCAEHECEEEDCBBCC?BIIFDCB=6148989CJGA<76;<4+0;@EILMPJ?9648;8964=EC@<<<1/7:85760.028H^dR?;<=????@@@@AABBCBCCCBAA>:63247<@CFF?;9;<844442/,,-/10./.148:<=@CA=89;><4--,.00.,,+*)*18?FGB>=:77789636::989;>BBA?ACFC<<=956985554312578500152../-,*)(-01,-1461*'+-++,--1444565676457:;<=<:9:>COXVQHAB?80+-152C|Vf~o\E9=NK940+6GIFN\^_fcUD?=?@FLNLLPPKHC<=DHHC7242..269;=<84565556621/4>@@@@@@?BFFDEFKTajffpuk[TSQJAHNMOPNPRSUVWVVYchmwxlZKDHRettfVRSRTUVX[cgb\YXUbqi\ZYVTUZedjrnb[^``c_`kiii[TQPMNNmep~|jZQdRHUYXXWX[XTky_ebbfeRHEDBHUk]abZpygou^RPMHFO`fTHJPbz`\[_c{`PUSOKJHHJLKKJIIIIGFFGGKLHMRW_ZTPNONNNNMLNPPKFJORTUW^u[ACHGGFFFFOMGGHKLIGJMLKFDIDFWTC;<=BKE@@?>=<<<=;FTTIA@?@@ESIDKHEA=;::>?@?>>>=?@ABCB?;=<985=?>>:89:>=>;5@SNFAABCDB;79AD>;:?PZ@:ES][PHR[ZbmmYGGT]VNJHP_VA8656;ALZgdVQRPQPOPPOOOOOPRQQTTTUUUVVVVUTSSSVZ[[[\_ZMC?>=>??><<<<;<>>>=;9?OZ\_aaddcccccccYLFEFB=;9:>@?>@CEISYP>=ANXZUVTOOR[\ZVLDDB:8CPTY\__]TJIJGEC]u|tWD<>LYQFHHC@???=?BCB?:459=?AGORPKFN\YQ^w|t@1758RouoYLUVajinOIPHMCK\ddefghZG:>@;::<@GGA?9?B8;@><<@B>78=CR|tTF@@BEJMD><>AE@>AEIJJNRTRG:8EKIEBABEIFHTVLMTVXX]ZD6>HE;9=ADEEEDEGHHC=<:89;<>=;87987:=><9776556:AGIHCAIJFHJLLLMNNMGDCAA?=>=;<:7778::9766767<956973:DGJUT?/3788654334678<=<;::98659<=><::9?LLID@@@?@EHGFD?=@EHJKNOKJJFB>@GJIHKKID>>BCENQJDDCAAAABB>ERM@<@<219@A@>;9::=BHGENZVLIHEBBGJHEGIGBCEGGD;>IJE@@@;668;:86?GF@<74583+1=ADHIJMI>8:??=AD?929FIILLKIE=8;AEIA49@@BCB?AB?<=>=<:9645????@@@@AAAABBBDCA?@><86437;>><978:<9655441//01100,-2302;BBABBA>;EPD1+..//.-,,+,.06>?==CE<31147757::87:?BA><;<==<=@>85784258753576434453/-/./.+((.1/,,0362+(-2.))-/4433579::::=<;=?<88;@GQ\``^\UOKA@QR;12;<16;43?F@;80+/+-/**.D@1?R=-9C>AF@JQEBFIMK@71/22:`rv{~|gMFPF6468@HJILXcenrZA=;<=>?AABJRH957>IMH=559<<70.16;??=;99:51/,)--4Wb]TRI>:QpzO;:2(W\dbbgnvttvuwxmYMGFGKMNMNNLJHHHHHIIIIJKKJJJJJJIJJJJJLKKJIIKMLLMMMMNOOPOMLLMOQQPONLHCA??>=>BMW[ZYZ\beegikiecfigdecdhid_[VQMGBADCB@@@@A@@@@???@AAA@ABBBCDCCCCBABDFFGIMOQSTSTVUVVMCEIINSVRG>?A@@@?>@BBAACFHRdnosvvoe]WJ?CHJLLKOQSTUUWZZYaqxy{thVIHSitrcSPSTUVXZaih^XVSbcZWTRNSdow|whbjlini`o~ziZSLIHFJmgn{{xoVfPHUXYYXY[ZVn|_iddiePCDDEAJr{SYZVjqtdOmiZPQQONJGIKIILEFkxbY[\gaMOQPOKIIJKJKKJIHIIFECDHHEHIL]`ZTRRPOONOMMLMMNKLOPSS\wYAFJIHGIHLVMEGGHIHGKQQIABECBMJ@<<;;>>>>>==<<;=>CKF>:=>>@@MN>>D=<<;;;>@AA@@>??@BBCA?==:87:>@>>;9;==@DCBDCAA@>>>:?DC@?BCDC;47DHB@>GcdECV_[NHLTZZaooZNQWZURSRU_YI>858>DO]db[URPPPOOOMNOONPPPPRTTUVVVVVVUTTSQTZ[[[[^\LA==>>?>><<<<<<<=?>8;IV\_`abdcccccce`PCBEFD@=;>HXmuT?<@GNJFHIEBA@>?@BBA@:?MZ]ZQLKLJFCBA@@??ABBBAEKKJHJQU\jrw{jVRQLKKKLORRNJJJIJMMMMKIHIIEr·ǿʷrgbalslzVNbkgab_]`aaa]^_^\VPONLIGDC@=<99]xdxw}vnomf\WROLHDK^g_JDJ[`XWZWLEEEEC@>DHEFLVZUQX\SHHMLIJMOOMJHHIIJKMPRQPSRPUVWY[ZZZZZ[ZYTNNLMOOSVZ[\^```\YWVVZ_`bdd_U\f]dXJ=99<=>@@@?:3:;EHGB:;=:97655766663;XjQ835555=KUTNHGR]^bmlnk=387=LWOF=58889>EF?:75678863477688767756?FHR^T;5899999732568=?;:999:::989;9>>:?B;349>@ABBA@@AEFDKXRB@BAACHJKJHHFBCGIJE;=GID>;<@><<=<95:BEB>95452.6ACABDGH?78AIHDCEGA89CFFHIDAGG=>:62/..148?B@:85456CVQ>99:;<>????AA@@AA@ABCDDDB>>>>:4/13556777887544242201120/,-01.3CKA?@BD?7@OO=.-//----,+++-6;456789988?FA737888:<=<<:865576764330034-).41..12441.030)+/3544446<@==AC?;;;879>DR]\\]afj^TPE;5.147;=:53@LLA:81,.-15.+*@C1AR:-8B:=GA<7:GLMPPJ=1,/344?c~ePK=::=@EHKLLQZaov\C?=:741379DPK;12ARPGA=869;3,.16>BB@>;:95/,.-0+(DhgWX>/)4Tm|L9=:8QU\`gossrtutuxxsdTIHLMLNPOMJHHHHIIIIJLLKKLLLKKKKKLLLJFEFFGKKKKKKLLLKJIHGIJJKOQQPPOIDB@@@??ENPOSW[dgffjmia`efefgghhijkf`[YXRFACBBBA@@???@?????@@@AAAABBCCCCCBBAEIIGFFHLPRTVXWX[WKBCHMRVXTF>AA@@@?@A@@?BDBGUjrqrttrni[JBCGIIGIOQRRTUXXVXeliikrm[T[irtp`RPRSVYZ[bd_ZXTYrzcXTUQQe~l^npjx}ow~aUPLHFFNkcqgxaMN[XYYXY[ZVs_kkmmgOADEEBMvyPQX`ktwtqootlTJMNNPRRQQNLKIKKLIJmweZX\g_NQQQOLJJJJJJKIIGHLLGDEGGEHGFVb`\WSRPNNONMLKLMPNLJMLXyR@HJJHHHGJVMEHGDCCDIOMF?@AA?DA==>A@>=>>>=;<;;<>@B@;:==;??FQCAF@::<;;>@AA@AAA@?@@@?=<<;88;???=::;<===AFJFBB@>===>?AAABCDC?98GLFFFOdmPF\`TQTXZ`][c[OGJT\[XWXZ^]XJ859@IU^\^_WRONNNNMMMNONNOOOQRRTVVVUVVUUTTRTXZZ[Z]]L=<=>>=>><<<<;;;CE<;DJD@DD@CKPMHIORR^nh[UF@HNRUNKLLMGCBA@BDDA@@BCEGGGFHILVeknnZPTSMLLLLMMNKIJKKMOLLLKJJIWĽzj^`dfY\fgj]Mbf`fkjeYU`b^]]_]SMMLJHFDB?<;5Fseovrw|}ohhc]YVTNJIFLW`UD=GVTKOWYPFEDDBA?FOSU[]YTTYXQLKLLIJJMMIGFGIKMNORRRRTTRUVWXYYYYYZ[ZVRNNLNQSWXY[^^```]YTTX[_`bec^X]d[`ZH99===;8;@9<<=>GEB<99=:976577439=AP_P8/2456;HTTPKC@HZkui[hvF46;LQMOg}wI:LDQa]UTS_rg@27989AF?:Qq|S;Ni_H<78;BC=PXXRNHCB<47EE758AD???@CHKNROF<88:BJH<35?LPRXaiqtreQJLD87@D@==ADFEECCGID>=<:<>=<=@CEDCB;4356534458;:9;<:;?@BFGFFEDCCBCIMNNGA@BA@?=;7657::512686367645535=??=>>>>?EF@BECA??DHIIKLJF@?@B@==AJOKB>?>?@?=>?<:?EC;788:==>???@CGFINH?=>?ADGHJMKFD@@CEEB==BFC?;;BD====968>CD?976644;BB@?@CC84:AGIG@?FHD@BDCA@>BHHB?BGF?=FF@=;>A<8789:9861-/7=<4/22/.037=BB?><978<@;4578;;<>>?AAA@@@@@ABCDDDCA@>:510114:423456644424331100/.../015?B77>CA<;=>B>0+.-...-,*)),7=;<><:87656788877777;=:5668863>JF71:@?>>=?@A:65569:9:;:7369=4.39722212454551..122234357:F90?GEIVYRJ;-,/6=06]|oj^KG;400365AMMJGCLZSEA@6135.+/16?A>=<::76329=4)-6POLP9/.,4Oo{K8;<@RWckomkkqvvttsuzufTLIHGLPNLJHGHIIIJKMMLLMMNNNMLLMMLIFDDEIKKJJKKJJJIIIGGHIHGHIIGHJIEDB@@@?@CDDJU`gifeikf]Y_c_`gighjkkllhe_YVRKCCCBA@>>>>>==>=>??@@@A@@@AAAAA@A@BDDCBA@DPSSXZVWXWVNHKPRRV[SFA@A@@@??@@?BBABGVc`\bghkolYEABDFEDHIJKLNQRSSVWXWX]a]]forstq`ONSWZ\\^acdb`YUrw[TTSQ`zqejZO``\v}|mTQPNLJOTi`xb]PQ_YY[YYYYU|`kqtsiNACEDAU}wPT_eheefe`_[ZXSRTTSSSRQONNNMMNJIq{eXW\e|^NSVTJHJJIHGHJIHGFGJGDDEFEIHHKV^a^ZVSNMMMMMMLLLMKIJJXzJ>JKJIHGEFIFDGHIJGFFECAA@@AEE@@?=@@<<=>>=<===>>@AA;:==?CADRE?B@99::;=@AA@@?>>===>=<;;;98;?A?=;9::;::>===<<<;;:>EC;CQWZ^acccccccccc_RB?DFFFFEA>=?@@@???<;9;<=8;<\\3bu^F3;ACEHJQQMHDA;66=>98:;=<:77?FHKJC<:779=DD:39H[c`^\apxqk_OFDB><<=>=@CDCC@BJJA<=<<<>@@@ELNLJG=3255334569<;:;989@DDEDBAA@?<;AGHJJFDHJD@@?;7445:;61157413786444237=GMA25767<>><647;>A?<9899:;<;;:;>?@@<428@C?8>;:>ACBA>:>C>9::988;?BA:67557;????>==LH@?@@GLMLNG@:7;>8778897531124::46><2./2:@ABED@;776424799;<;;=>?A@@@@@@?ABCDDCDCA;40000163/2459:974232100/...-.///.01.0>;9:.'+,-/011.*/8>BFD<88643369972245579;:7557742?KE50;DC?=<<;;87525;=:=>;65:<=758;:531014577543210122234:?>???>;7513425IRRUY_lwwraH71/3513:>?BDGD6032+-8A515+8C1FH.0=<:76:>??D9-/.00;@701/+8N]]B8;==R\ihebeowwvussuxwsfXMGFILLKKIHGHIJKMMMNNNOOOONNMNOKGFFDFJMKJHIJJJJHHIHGGHHGFFFDDFECCBAA@?@?>BN]cc`]ab\RQY]ZY^gjggikkkklmg^SQSNFCCBB>====<<==???@@@@?@@@@@@@@@@@@@@@@?AJMS[]XTRQZ\QKOQPTXXTLA>?>>>@@@AAAAAAEMIFMQTX]_YKA@BDCBDDEFFGIIJKKMOONMMOXhqppqtq^NPVZ\`bcfhhhbWU|eYTSQV`\YYRNOIKgseZTTTTRQRTibz~]c]c^[[\\ZXS}_pswyjM@CDEAYqO\a_feXQ[bccaa^XUUUUUTSPNNNMMNJEohYW\dr_JNUUQLLLJIFEGJIGFEDEDEEEEGHHEFQ^a_[XVRPONMLLLKJJJKKZ~uE@KLJIGEEDBBCEHNURKFCAACA>CMH@GJAA@;<>>>=====>>@B@<:<>@FABUI=??;99;<=>?>><;::;;;<<<<==:89=A@?<:9889;;DPK@DEDBACDEB>;<=>??>?HQQPSUYa^UV]XZ_ba^]^^\PB:3?U^^``[^[E36=COYa_NISRNMMLLLMMLLNNOOOPPPRTTTUUVVUUUTTWYYZZ[_RA=>AAAA?=<<<8:KNCCMUY^acccccccccccZLEDEGFEB><::<>@A?=;;:>B@BLKGHIK[pvmb`^WQRY\SNPRcqcWWH;8:;BO[\Z`ddVCFMGDGLJEAGNRNF@??>>ABBCCCDFHFGGHJILWfd[\]PGHIMZdXD?BBBBCCDEFP`ji[LLTVOIKMNKGEGIKLMOSJCCGgn^onjb^`^Z\gkgacpwn__cZapjZUSU^_UNKIGDC@=<7Mkgpstyurnlie`\VSQQQNKIFHKPKIIDBCFHJNLEDCCCCACFLPUXSOQTX]\UGEHHGGFDDFIMOQRSTTTUTTUWWYZZYYYYYXXWSONKMPRUXYYZ\]^[YUQTX\\^`db\ZabZ\]KJIA>::=><:8:84:>CFGECCKRRMHGHGD@?:=_S9=JZ`_`jg]QMOUPTiiQ@EHCGQRMMXbS86;;9:?B>[nOuN;@J@HNXULFB=86566799:<>>=?FGGHE>889999>@85BV`hnme\`msodQ?;BHB=?@=AEFEEEGLJ?;<=@@@?@?CKLIJF;346533568:>?=::99=EJJHECBCD@>FLJEBFJJIEBEE=75558<956532138:866520246887679<=>?A?99=@@?=;8878;=;::;;69DF;467689;=>?@BA7.1?@=:?IKD><<;<;9888;?CDA=:87778406AMLFDEDCA@>==AGLLGJH905CC;9?BAA@<79A?5777889;@C?;;968;=>>>><;BJHGHGDA?==@KJ>;74FPB8:=?FKQOLGA@:898888899889=@@<76=C@70.5BDACGF?;8887437:;==;:;>?@@@@@@@?ABCDCCDCA?:5111100359:6530......--//.,+,,,19<99((+*),.@C9>CFHF>88742/17;;5,/46558;97545643=D>207<><9753136526<;9;=:43575588654111125767742336322228?@?@AA>>@>;64:F@>FUev~mI73333//;@>ACD@2,27407C?@@??D3JI/0C^Z=,+-4GKRef^S?-+49CMSpUFRUNEBBEIHGHKMKCOYQQD:@@?=83368;CGFQ[XVM4&*,-3336633>??CLRSRQQTPHIV[TQWaefffhkkkllllkcSOSOECGFA=<===<===>?@@@@?@@@@@@@@@??@@@@ABBCISWWYSKQ]`XQLJOTTRTWK>=?@@@@@@AAACBDFEEFFHJKMOLEAABCCCCCDDEFEEEFJMMLMMNR_mttsrtoXNUVY_``adfhii[\fXSRRU_hkjf\NM]rycQU]\YWUSRTheyݳcbysha\[]]YXRx`yx{}mOADFFB^iO]XV^^NIZgmmhefg_\\\[WSQPNNOOMKErl[W\bq_FEOVUQNMKJHFEJLHHGDDCFGGFEGHHEM_\\a_\ZTRPNMNNMKJLML\rFBKLKIGEDDBBBBEKPQLFCAABCCFJHHLQQLHHE>===<====>?@?>=>>>B@@QM?>?;9;=>=>><==;98::::;;>@BCIPSSUWXYXTKLZXPU\\\_b_]XPIA>HSUVTRYS>48=GTVSJ=BSSLKKKJIJJLLMMMONOPPRTTTUUVUVUUUTVYZ\[[^WD<=@CEC><;;;6;JCCLTZ^_bccccccccccbSGGGGFDA;78:::=@@BB>:59DD@HLKGBGV]WVXX^\SMJJKJKL]kXLTJ9379AKX_YVbeRHKKFEIIFDBDEEDE@;=??CFHJGDCDEDIRTPMRaidXUSPLOKDJY[NB@ABBBABGMR[__XROSVRLPUSNJPPONKNKGFLcǹ~nmupmke`YWW_bUTevzjUNTYUcmYKIGMW_^WLHED@@:8=^ijlkousrrqqg\WSMJIGFHHEDGMLLLGEFGHGFGEDCBBBAA=:=GSROPSW]_`PFFHFEDDEGKNPQRSSUUUTTUWYYYZYXXXXXYXSOPOOQQQUWY[]^]XUSRUZ\\_`ca]Zaa[Z^MIG@<;<>?<:69?DHGHDAA?;8877:BIHC:969DHKKKIHHMPPOOMJHC?=GJQMJF?:76744577:>BBCHKIGFDB;;@AABC?5:LTXbjmiYOYkuhL61>HC?AA>BJMMOOONJA;:>DGD?=<>AA@B@9555433456;@>;::989AJJFEDC@?BGJJNH@HOIFFEGE<89869@A>;621148::86531594.5DEB=>?@?@A><=>>@A;877:<<;;::;859<;:8678;<>??@B<44:>???@FKE@ABEHJKNSTQMGEEC@?>62=HGA?><::89<<<>@?<:97678877=BHID@AA@?==;:;?B@>IWOADPQH??BAA@;57@?46667789>CCBED=;=>???@??GNMNNJBA@;;?KH;67:9;?@@@@@@@@@ABCCCCBAA@;45886137;?BB><:830--.00.-.00-+--,,187338>>9IP6,0/-,0CKB;>IE8367668:;;;72/266569<:8755545972/011441/...023437::<;820//2597223330//368:83369;334206=>>@A=7:FMMLILME@DI[ltqF3353-+3??<@B@9++8EB6/;HLMIDC6JJ0.:LWH+0306?@@@@@@@@@@@@???@@@@ABBBFMQQRPQX[\_\LEMTTQQWWI=?BA@@@@@BBDEEFHHHIIHIJLKHFDBACDDCCCCDDCEFHJKLPSRQRYdkrpnsjWTVVWVW_cejjkfZoVQUTV\itspfWV\dfZS\b_ZVUSRVfg~\eurod^ZYVPWV~iiOGIJJHhdQVMTTPS]ekpka]cotohb^YQOOONOOMLDzl\Y[bs^ECGPUTQPMKIGGJMKKJGFFFGGGGGIJJP\RQeha_YVTSSQPPNLLML]lDELKKJHFFDDBCDFFEHJFCBBBBCDDCC?>LLHPK?=>>=>>????@@@@A@????MN@;@=7;AA??@@@?=<<<<;::;<=?BCB@@??<:988765@F>6469:ENUSQSZ`_\[\RFJRKFNQF77:ABFHB=9:BDBEHGDDKTTU`if[X]_YMIHJFNWMGNF98:7CRUWVKUXLJKJHFGGFEDC?=>B@;=BACKTYTHAABBEQWSPXbd^VRONSXSE>CMPHB@@@@@BHQTUUSTRQSVUTTVTPRRVVQG?@@@BILMKGFFFFEDCDCCBBB@?=:8:HRQONQTVXSGDDCDCCEHLNPRRRSUVUTTVWYYYYXXXXXXXVRPRTRSUSTWYZ]_[VQQTX\]^aab_[Y_`]XWMGG@=<=>?;889BFEEFB>>=;98879=>=;865?MKC??BJNPPQRRMC<>CDCDEUJXaYMHLTOZhlc__f^T\ikV@>II<7@IMIGFCAEGHECeqMA>C@IBFF?769868777:=>>@CEFFEDCADIKLOMB9BQSSUVY\[SHTidG00BH=:ABAIPRSUTROLD<;?DECA=;9998998754344425:<:999878>C?:=B@87=JLHOL@BFA?BDGA::::9=FHE@8311457975532:B=15JLG>=;:;=?><<<=@A8259=:67;>=;;<<;:87759BFFNWXUPHEGDA>?;5;HHB@><9988<=;<=:88865558:<=>??=;;;<;;99989:34@V\OORTRG?@BBB?;:@A88765667>BIC968<:66537:48HPKECEDC@>9648=><;:=GG<54334425AHGC@>;::879;;:99;>BB=88;8::9217;@DB?=950.--/100/120-,..++197/03477;B=6=D>45=E6+;G7.6868:>AB>:757776779;;97655441-,.///---..020154-/8<=82////29<9766631//13465348:<5563037:;<:528DKPWTUW[]YBOWNywE0692*,8=>>?@>1)6MWK8-0BMMKEB:GC0-,,AR7/78,&Gkkc_TJFEFKA85?LFDQUUG8:<;;::954687.%)>RWL7*.1461.,(+49>>@;=B?:8842693--26568>???@@@@@@@@@???????@@ABDGJKIOZ\ZZ_`VOORSUUTZXG=@BAABABCCCCCEGHJKKKJKJIIHHGCBBCCCCCCCCEFFHJKOSSUUTUXbkoqrg[\UNQUY]`fghjfe[NQTUV\ijdUILV]^ZXad\VUUUSVdhzaddc_qna[VPJXYoiQLMOQRl`NOOWTPXfoqph_[_iuzpYUTMIMONNNLJA~l][Zbu\HFGJQXSPNKHIHGKONLJJIIGFDJJIKOQROLZgea_^[ZWTPOOMMNN`iCELKKJHFEECEGJJHFGHFDDCCABCB?@;:CBAGF@>>????@@@AAAACCA>>??IQEDF>8=AAABCCBB@???=<;:=@BBDEA=<>?=;:98874;B<:<:889:AGGCGND=BCHQXVTTVXXUQFDNICGRXRE:BU\\`d]QT[XUTK<59<=H[cmr^GAHKJHGGGHIIJKKMMMNNOQTTUUUVVWXWXVUTW^^]\\[RJ@99:;<<==DC>JUY\^_`bccccddcbaaRBCIJJHB<@B=99=ACDHIFFE<9@CCDEGIIUafgkqeWY^]UOLJAFOMGGA8=?>@??@CBBJYa[LBAA@@GMMQ[aYLQYTRVZWNB=7:8b^W^fmtaQSTTUQRXM<8:=??=<;<>AEFC@@@@BA>>>??@B?=<<:9CQPLHGGIHIECAABBDFJLNPRRSTUTTTSWXXXYZXWVWXXXURRQSSTXZXWXXY\ZURQTY]a`cb`\ZZ_^[XUOIJC><=>=;8:;A@ABC=<>;9876546999:::DNND>=@GOPQSVZXMGFGHLJKYPcfTA=NXR[d`\]dok^XTPJ@BI?41:RWMEDEDFEEB:Fnw}O?>=9D@DGB<;<::;9888889;::ADEECDFIJMPPLGIMOPOOPT^]QKNRD12IM:5@BDLQRRRRPNKB;;=<;=AA<77555676534767:<<778668:>=8535=?=99@FHHB=>?==@CFA;;=>@FJJGB8421335665533:B@76@CB@>648;=>=<;;AB7148;@F?78:;;:=A?:54:@DC?==;66;<<>@@@?=98887678;DOUUQJGD?==@@>?DD@>;778769<<;;:9887668;<==<;9899:::;;;<=?A?CMY\WTQPNF==@CCA@=?A=;975547<@CIOOJFGIJFCA?>AC>=CIC9;=@CGA:8975788:?=56BLIEFHHHE@956@@@@@A@@?@BBBBBBCCA@<743117=CECA=61..011101252.----++/56100..0//03EVQ?:;<+-EG8587898;=>=<:899;;;;:9:::85551./000110123233/282**166/)+1234<=;;;9754222000234679656301468767:=BDC;L\\bdaXVO2ZxA18<4,2979><<9-1H_`I83,/4GJA?<>A;:;85JLU_ipwywussuvtpmkgb^ZWUVTQNLLKJJIIIJIIJLNORW[_`acaZQLHFEEDACHLKFEFFECDDEEFFGIGFGGFFEEEDB@@?@CFHJKJEBDGGFFEGQWTOS_cbdgiic_^`\TPNLJHGFC?==<;<==>???@@@@@@A@@@AA@@???@@AABFEDFKPQTZ\]ccXPRUVVX\WH>>ABBABCCBBCEGHHIKLKJJIIIJLKIFBBABCDDDEEEFGIMPQT[ab``gooqrg\TOPQQRU^gjjjfmreXLNUUV_aWHCHRX[YWaf^YXWVRXbf|_Ydfb[Vxuc^YRIZ\o~rXLLOQSlWFKSVVTVesuumefiddomTPPNJKMMMMKI@m]ZYbv[JKIKORRQOMIIIJNSOLMNKKOTNGKJIRUTWTNYhgbb`_\TPPPNMMOchDFLKJJHFEDEFHJKIHHHHFEECBBBA??<??@?????@AABBBCDD@>=@?CUY[YH<<>?BDDDEEDB@@@>><9;>=<99:999:<@AFJB;>DGGHEBFLEDEACJPQQOQSTQOIDN_XVbg^J99@FQZ\[\^_[SI=68<>ABJTX\^^_acccccddba_\OGFGIIIGDCB@?>BFEFIJJMI=9@BBCDGD=NccWYu|bMLJGDC@ENOH?76>>BTL:BWJ9CLKGEDDHIGGIGE???ABBEHEEMVTIB@@==@DFMYYI><;:;<=@?<;:;==:9998;=??=;:>JQLHEDCCBAABAABDFHKMOQRSSSTSSTUWXXYYZXVUUVXZWTRQRSTVZYWWWXXZURQTY]a`cd_[X\_^ZYZXNIC=;=?>98<;<:;=;;A>9765666=><;:988;<99=CEFEEDDEGKRUTJ>>ISWZ[`dcXJA<55DF86@CCFLNMMNMH@869:779;<744543454334:><:;==?A<989;=>?>=GM@568:?B>976898;><946AGC>>><::;<:8?INNMLKIGDB=6457??>??<9347879<=;::99899:<==>=8668:;;:::;=>AJPKKW^YUWSNHB>>ADDBA>>@=<:85547;>AHNOLHINNKDA>:::435<>:9=?BF?99:7579:<><99>BCFLLKKD>;;BLTQHJNJ@41555433:CHIHFA;769;;>??;87779<=879<>?@@@AA@@@@BBBCCCCBB?:64347=EHGD=4/.0232203672./0/-,-/12100///.//1>U_P@?8*0IPE926;:64689;:889=?><;9;<<977532454369;;9520--23.++*-.+)+0149=<;;=;8866520155445656652/1457559@A@@8)O]]^clmiM1Df^819>8169425533/6I\^D884.27=>?=EA3.010333/.09EOPTbislLAIC8>P<4..2555786/-07;830-IMXeouwwwtoosvrmifd_UUVXZ\XPLKKJJHFFGFFHJKLNSY]^][ZXTNIFEECDDFFFDCDECBCDDEDDEHHGGGGGGFFECAA@@DFIIFC?>AEHHFDEHJKJKPRSUX[\QFIMIEHJKJIIHE@=<<:;<<=>???@@@@AAA@AAA@@@@@A@@@ABCDDA@AKWZ^hmd[XVVXX[_YI@?DB@BCCBDEEGGGGJLKJKJHIKKMMLGC@ACEDCDDDFFHKLNQT\dhiijlosrfUQQNLLOYafghjigicTMRVTVXSMQVSQTUT^feb_XVOWbe|z\\de^[Xvd`^SI\bkmyvZJMMLSpfUXRQSTUdv}zrlmogffa^XNKNMMMMMKIAo_YZcu\OPMMNOOPNNKIKTYTNLNQLJZilQLOMPWY^^OL_g_XZ]]ZWURONLQgeGGMJJIHFFEGHIKMLIGGIHGGEDBBA?=<>DEA???@@@???@ABCCCEEDA?ABBEFFFB@@@?>=;;EQTL@;<=;867999:>??BJME?AGIECBADHFED@>@CGIJNRTQMHFO`ZWdqjVLG@=FR[\]]YOEB=8::;DRVY]^_`acdddccdba]TLNKFDDHPQG@BGGFGGGILOMD@BCAABDD>9DXWCDa`?=<;:;@@ACDEGILNMLKKLOV[Yaxurw~{zvosszͼgc{tnifacouqpsqh_YUOIIHHGGHGHIGECEEA=::>;:>JPJFDCCCA@?@BCDEHKKOPQSSRRTUTTWWXZ[ZZYXUTSUWWURRRSSSVWWWXYXXUPRVY]__ba^[Z\^^[VPJ?:<;;=?>=<==<:::8CF<766667=ADD9:MNDHML[XQNONOPMJLJLJALLA::LWH>??QVUXM=?JZa`beaZMENL74=97668?EDD@86760?`\FA=>@CBBFIIKKE?@@>=<;:9;<>@@BFHGFFFFHKSXUE47JVZ_cccegZ@358878>CFDDGILIHF>5138;98940.058512321249@EHB757;=?BC?855445457:8;KQGGOMGFFEDB@??BEGGKLB73457:;62114:===>>=;<@EF?989;>ACEOP>5:?><=BDA<989<>???@GIC?;;==;<<97>><:::;<==>><9548;;;<<<;999::;;<<>>71037:::999:<>BLRKDLVRNQWNDBDDCDED?=??=<975458<><>IOHBELMMD??>>A@:45;::=?@A:6:=<;::;;==>==@AFKMOG?><@FR_aYVRD637655334:CIKIFA9459<=>BB;6555546779;==>??@?@@AAABBBCCCCCCB@=979>EJID<2053223445762/2443//111011256647<=GUOD;7.3HND63:=976668::998:<;7567776862134357<>;830.-+..--.-+,.241.-4<<<;;>;::99721276435667863/2445437==<7.;SEUadlqtU9:3783010///0;IP>9;<96555647:7.+...3>B>37A?7;[pxnQDBD?9UE9L<1>82>>88:<<81;HFFPONRP@70)'*,16624<@?=?<3-0577668978==7221/.022232/4<=70.02547=>700249;976LQajkifkuulinpmkhe`ZTTXXVUXWROMKJHFFFFFFGHHILOPPONNPRNJFCCCDDDDDCCDEDDDDDDCCCFHGGHHGGFFEDCDDDGGHGDB@BDFEDDCCCEGGHIKMOPRTOB;>AEGIJJJKKHC?<;;;;;<=>>>?@@@@AAABBBAA@@@?>?AA@ADC?;:CQ]eiigfc\XXXZ]_YJ=AC@BBBBCDDEFIGGHJKLKIIJIIKMOLECECCBCCDFFGIJLOPRV\afhkllnobROMMKOUV[]biljhig\TSVUUVY^aUNSUU\dg_\XWPUdezv^WV^\ZWwfb\NJ^d{ehtzuXJMRUctvdiSTVXXbvytokkksjT]VNJMNLLLLJIBp`XZctaTSNKKLMNNMKJL[aSMLNQJIhswl\WWQUY]]SJOWUJGMQZZYTSRPUjbHHLKJIHFFFHIKNPQTSNLMKIGEDDB?=<>BFCAA@@@?>?@@ABCDEGGFDA=ADDSblnjZE=>??ADEFGDAB@?>=<:=HSRJC=98888889:=?>@CBA??@BEIMHEG@<==??@CGHKTWTKIIKXSNYjj[UTTQLNY\YXQLJI=6?HFBEO_W?>DDLVODCECDFGHHIKMMLMOQSTUUVWWWY[ZXVTRW]\^^J@BDC>EPX]NBA?=>>=DHIF?DFFINRUXWVVWSKHIGBEMV\ZYYK=;ABCFJPTOHC??A@=;>A@@?>??>?HROCBEIHDBCDCDBBDEGHGFKKKKKLRYXTezouwxzyvpffY^`cfecmvtpj]UTTPMIHGEEFGFHHGEB@@@?;7UaWbflry{qhjg_TPWTONIGGDAB@;9=?>><:<<;;<;:9:97425868=HNIDBBAB@>>@BCDFILMPPQSTSRSUVVXYZ[\\\[ZVTRSTUUTRQRRTUUVVXYYVSOSY[]^_a^]ZZ\]]ZS@0*-445668;>>?>>>@CLC:886678@ACD7EtX>ENKVUUSRIKMLJLGIC?IE16359<@>?PVQLE@DM_ede\N=:HVK96=:7667;BCD=637<79Ou@:<<><;:;=>ACCGIJIJIIHGQUK<7FVWW[debbigH7:;78;;?CBBEIKHC=63115;:983.6>B8422222349??>;657;>?@@<96525:837<9=HLC@?=;;===?DB>AGHHIH?52458:<733017<==><979ADHID:68;?EIMH42ALB;?FKMH?<>@BFGHJHHD@:9>@<<=;:98AHGDFDDHKMMLKGDDDD=868989::=@@><;;979=>===;99::;=><<=<61/16:::8889;E@?DFBBDDB>=?@>==;5369=>=:AHMKA;:;=AHE:9=<;=>>>97=AA>999:;<==>@?@EJLC<;99?M]ge_WF58DA95346;BHJIF@847;;;=@B>;874422479:<<<>?@?@@@@ABBBCCCCCBBB@=:>==<<=<<;63343245310000/3873//,+-/.,///.0234851/5;<<==>>==;;;612444136:::8504632237754--LG-BONPewaA99204:=8057410//11/4;NJ&$,1554549@@A?70AICOUUVMIDE@3,-056426?E@;><403653346989<:720/.-.0320.-2772/-/2549BD:0.59;=?@>KOY\ZWT[ovjbehffd_YUUWXUNKRVUROMKIHHGGGFFFEFFEEGHIJMONMIFEEEDDDCBBDDDFFEDCBADFGGGEFGFHHFFEGIIIHHGECABDECBBAABCFFFJOPOPQQUOA;=?CGHIJKNLD><;;;;:;<=>>?@@@@ABBBCBABAAAA@??AABBBA>:=K\a^`cfkcWUY[YX[YI<>?BBBBCCDEEFGOQOJIJJJIGGHIMNOMHAABCCDFGGHIKNMMRX^dhkjjlok[QOMLORPQTX_dfhmpmaY\UPX^^^XOTWWZ_^ZWXWVUfetXVUZZZX{h_QHN`dgpv{qWHMR`rthVca^Z\Z`t{wtnoqwuaFJJGTXMKLLKIHExaWY]qdXUHCEILMMMMJN]bSKMONFJsvhondaZUX]ZTNKKJE>>CMUZWUTTXlaIILKJIHGFGHIJPVX]`[USOIFEEFD@>=>AHCAAA@@@?@@@ABCEGJHHG@>DEFLVcfYLA>>>>ABDEGGEC@?=>CKIJSVPG=:=><:8789;;<<:78;CGR[\NCBDDDFHHIJLMMLMOQSTUVWXXXY[ZYXTRV\\^_RB=ABBCCDDEOUVXY\^^``bccccbbb_\TB9=HSMA@HNIELNGHKKJLNLGDDEDB@BC?>FFBBCJKKKNLE>>>?@>>BA>;=@A?=?ABAACFGECCHKIEBDFIIFEJKJKLLNSbsyi{~w{wry{~ea\YVVWXbgdnytaMGIKKKKIHGGEDEFFFFDBCBA@;@aX]fkr{{olpi^YUWTLPJIIC=>@<:=@@@?==<;;<<;:;;973-/38FNLIDBAA@><>ABCFHKMNPQRSTTSSUWXXZ\]^^^\[YVTUVVUUUSRSUUVWWXXYTRPTZ[^__a^\Z[\]][SG:1--*-/,0:A@@@AAENJ@<=97689ABDC6KsW@BIFIHHIIFEJMNKHFA=B=44506A?AAA<9;@@@CEGID;53458;:977>OPA7443114449@?86779;<===;8755;CD@?<9?GFA>=;;=<<<>A@=AIKIIE=51369996643:;46;<8338BDFNP@36<@DCGG79JSB:AIKMKC?BCFJKJIHGFA::@B?<==;63:?BGGAAINOONLJHIFFE=3256988>BA><=>;769>>>><:::;<>?=;=:74225:::8877:;==8758854124;CC=?A=;;:537;>>=<>:79>FMJ@879=BIIA??=<<=<=?ADA><9889;<<=>@?<?@@@@@BBBBCDCCCBBBBA=>GKG?<;34:6436899831345?B5*+24014105858HN?./00022.-03?K=678>>AGD=6556775210/--.--/./.-,,04/.00.0375355558;;<=>>AA@<==822344126;<;9525620025621.5VB/3675KokH78656:;6.46532015502789=>738BLG;;>?AA:6:98=ABEGIGF?:F_aJB=8<@AG@0)036534=FCA><:JMN\PCL?8AEE?824972379;89>=42674235766:940/00-+-033/--.00//./2335=ED<339868=;IIKMMNPR_kc[Z_ca_\XVVUTRONNOQQOMJHHHGGGFDDDDDDDGIIJKLOMLJHFEFECBBCDEEFFEDCBCABEGHMPKGFFFFEGJJJIHHHDBBBCBBA@@ABDDDIOPNNNORTRI>9=AEHMNPQIB=;;;;::;==>>@@?@ABCCCCBAABCDDAABBBBBA@<6>LLGOW[`\ROTZZYXXXH<@BBBABBBCDDDEHMQQPMLKIIIIILQRLHCBBCCEFFGGIJKKOSX_fjjjjmmhZPNMLJMW[TRVZ^fjjge`YOW_]ZVPSWWY\VXXVVRTggw[\ZWZ\Zi^OJPcewerxmXHLKWhukSTobY\\`pwwxulmyzUBHShsJJKIJJIGzbZXWlgYTGACGLNNLMNRZ\SJKOKCJspWYcekjVWZVTUOHEDDHJLQRVYXWZn_IIKLJIHGFEGHFIXXVVZ[VQLKFFEC@>=?AAABBBBAA????ABCDFIIKMBFMIFLUUH>;>@@?@BBCDGJIE@?@DPXYTRNKJHLLF?;889:::97756;AIRTNI@EE75AIKHGJGFQSQKLKJMPPRTRRRRQOLJGFKPOQTRA?W[IEFJ@?HKIFP^]NDCDDDEGIIJLLMMMOQSTUVWXXXZZZYXURV[\_]XOICA>>BB@>>>?@BBDFECDHLJDCEGJJFDHHIIKQaxfv{z||oy|us}{u}zyghfhfaWPZghp{rTEKNKJJJIGGGEDEFFFECBCBA@9W^Vckpu{ttph_][XSNRLJJD>>><:<>@??A@>=;<<<<<;::4-+159FLHB@???=IQK@A@??>>=?DEINONKI>;AAI>705>;;?OVMHQWXX\]XI;446@GHE@><96657869646;>A@><=@?>>@BFIMOMLJFC<;=EUb`XUTRU]`fi\G@BHF?99==DFE@:56=A>9645332124559BGA6668;;;;<<:859AFHHC@=@EC?><;<==<<<<<FGJQI75?EC=AJKHKF?;AHJMKFACEGJJIIHFFA:;@CA>>;:75:ADJH?=CMOONOMHHHHID@9469::>AA@?==<977:>@BA<999:?@=;;:99769;:987789:;;:88:=<52259>><:854546AFAA?538;=?>>=869=DLG<658<@AAAAA>==<=;98::8655443124779:<==>???@@@ABBBCDCBBBAABA?@HID:7:23:55668=?=86755@@1,3:62251.387?BFD@=:545674115:;;;8443/,-./6:87ES>72.4(>maF67554565-255542369318=<==869GSUF?CCEE@@=;8>CEKQLNOH@>BILLM@=866662133039730../+*,14310/./..//0233128AGA745438;HGGGHLSTVYWUV]aa^][[WUTSRRPMJKKKIHGGFFFEDDEEEFGGHHKKNPOPRPIEDCDEDCCDDCBCACDHOXbfiotfNECBBCEGGGFFHGFDAABBAAB@@ADCDGJLLLKMQSVTI><>AJSTSRQME>;;::9:<=<=?@@@@BCCCCBABAAABDCBCBABA>:69?=9=CIQTQOTY[YWXZXKB@A?ABBABCDEEHLOPOOOMJIIIIIJNNQLDEDCDEEFFEGJILLNU_gijklmogYPLKEQhiZPPTX[^abda^YYZWPMNQRTYYWXYXWMRikx\XUY\]YidXKQdeo^lylYJPOTcxqaVeXSZ^`dknml`\el`bnbѣSEIHIJMKcYVUhk[WKHGILMMLPZ]WUPLLNKEE^[KFP_prYUWNIVVHCEKU[VODRb_V]p]HJLKJHHGFEEEA@HKNOUYVTSUOGC@===@BFIJHEDCA@@@@ABCCDFHKOIOQIAAQS>8;?AABBCDDCFMNKDEEFHKNMLJKNRUUQJB=:<<<<9678:?DKNH<;8AG=?MQSNKKDIZ]LCGIHFCGJNNNPUSHEHGHPUTUWJAAJb`YTSOKJGCCCDCBBCEDCGRUFBCEFFHMQMJGHHP]_O?@d[^hpsvzwpibfe[SRVPMJECFB?<==>=4.,.,/3;@@BCCCC;=AC@:9:=AFDCEJKD@AA@@@@@@@DFLLNUWP=8ESXQ@56306CPRS[\NEFQSSNC98;?=BD;?D9455774656?EA6;DECIJkMB52689;@?@@CC?>?@BDGMSTUTPIA>BO\b_XYUFCRagh\IAAHGB><=87;97====<78;?ADFIG@7146788469@PWH59CDBA>:BHFLPD9>FC=:CRRF=>=BIKLLJEEEFGHGGGGFC=;?DBA?;77=CIJKH?59FMMMSPFDHIKLJD?:;=@ABCB?==>=9549?CC<7669=?=<;;=?>>?;97665788;=@=;=AB=:899<=;7578754>EAB>77:;=?@?@?>;=@F@8768<@76=BBB@?>?CJF=7446666679;;<<66;?>=<:99::>AA@>DNB0/26?=978:;;88:<;51124432468:====>?>?@@@ABBBBCBBBBBBBA?@BB>53423855888?DA<;:77:3/:@?:641-+/6;FG>761-.10//..//-)1320,3CIB@BA8856546731021.,-/-./12236655420.-/120-38647::89;>BCA<8689;;9646:;;<;820.-,,*0:>;WG68626*?_B:640,..04/13320/03<;8;A@>=:95;K\XLILK@=D>97@MQRPKLMHHKKQZ_`SCDNMMcri`O:8>@?BEFHJKQ_P1+0/-247<<57:::9;?AA==;:9976100//25420.-+*,/2312330./14554563.+07963478;>FFGFGLTUTRRUX]`b`_^]\YVSSQOMIGHHHGFEFFFFEEFFFGGGFGHIJKMOPMHCACDDDCCCCA?DNW`dgpxzz{~zeL?>?@BDDDDDDDDDABBBABCA@ABBCDEGIKLOQRSSUQIBAHMOOQRSNE><<;;:;<;@A?AMXL98=;6?OUQRTRSVYZZZ[UKA=@BB@@AFNQRSQQRSQOKJJHIIJLOPOLIEBBCCEEEEEFGHLQV`hkkklnni`QJIXlk[XUYbaZ_b^\\\[VRMILIHRYYYWWWVV[ilqTOPUXXTihUGOddqco{m^T_`br{jf`\TSX_`cgdXVTZYUktqf|^EHGHJMKeXUXln^[SQRSQMMLRekXNOMLLLGAFLRSS]op[TVMFRXKCERbZsFInkU[s[GKLJIGHHGECDB>?ACJSQKKNU[WI=:=>>Q`cXMHGEBAA@@ACDDCDGIKMKFGC;GSD:=?ABCCCDCBFOROIECA>;;?CFGHIKLMKGB@?>==:8:=?ABFF@8:;CHDFKRWSJC?Pc]LC@AEBADCCBCFLHEEMQU[\YUPFBVN>=>>@PZVSZTKGCABBCCBCDGHFGRUJBBCCCJUUKLMLKNXN98EMOJA?BHQ\kyp^Zcc[bha`[JBFIMPPLKT`[TPR[_VMSY[`]PDDECBBBDFEBBDEEFGFFFEGNGCFEWp}{zwsfew}|wyvx}wp{~vmen{wcXPVgrsxmSNTOLKJJJHFFDABDEDC@>@BF<<;868=??==?@A@?>><7000/6=<::9:;=@ADDFILOOPQRSRRQQSUWXXYYZZZZ[[XUVXWUUVWSQTUTY^^XQRW\[YZ_a`[YXXYZ\ZXE0,45/.17;<=?ADFEECABB=88;?GHDBBHLKEBACEDCCCDEDA=@N[aV<5G^b_UH8375GZ^cgV:9NZUQQF97<><;;5?K914569==:=DF@89@B@HIEtr=>=<748>GJJOPLFA@?=<@@>>ADC=;>@@AACKUUUUULDFNYa`YX[I21EV_gbQC@BDEB?>=>CFEDCCCC@<88=>>>>;88:=>@FJIC91369888?HKNTQ>7BKMMG==GHHPL=;BA=887@JNLJIA;>CEEGMJ=;DGECCEGB=?DECBA@?@AA<4137:;:8779;=>=:9=BBA?<97554765:?A?<:8999788;<:;<<<<;;@EEC=9;=;5:DEFCA@CFGA97976532127::::::<==>?><9:<=AEDA@A<:ADA>ACB?><97778889;=?:7555542457<@?===<=>@@@@BBBBBBBBBBBBAAA?=<8411365598:@CA?;9;;4.6BBBB9/*+,/6?IE=83/,-37873.-./-1120.3>EAANO?4475210/00140,-..-046767666632223320-4;7234322455:;87;=<;;<=;:99999932110-*,26>X@4988;/GX468674323210120.++/588:>?><;;0-5Mc`TRRH>D?01?NXUB8BNPQW[_c^XYWF3>BPjI1,7AILNNNMH8,042136:<73:@B@=?FHE@<:::;9865444431/.-+,.1342231/.169<<;:984.,-/1468;;<;?@A@BDDDEDB@@?=<;<=:;AHR]cieN<;==BJJGGEELPSVYYY][QG@ACBBDGJKNRXZYXWRNMLJJJKLLLNQPMGFEDFGJKKKKLLQYagjllmnnqpeZY`gc[[YW_eX^vi_\WVURRPNIFMXZYXWVU]i`inNOQQRRQkcMFNderdr}lffnefyzofga[VV]jutlZQU_bdl`Q\`]aUIGGGIJO}hZV[oob[SPT[]TLOO^lXLMNLJJGAMQR\edjl^TQKHLPMEEVgcZRc^FSuZFKOLIIJJIGEEC@BCCEGJLLMQ\d_M@@CCZllZLIHDAAA@?ACDCCCEGIMR^hj`XZN<;=?BBBAAA?ETYQG?>=<;:<=>>>=<=@ABCDB@>=:9;=>=?CB=8>=?FFGGPTMB9>R^TMNE?PG>FNRXOQYPPcvoaYQEBCCFGGHJLMMNNOQSTUVWXXYZ[ZYXWVUUX[\ZYURTSSUWZZZZ[\\]^__`bcccb`\TRessc^K:;><==>=?GUWTYVI@>?@BCCCCCGHDFLOLEBBBCKUPGGJRSMMC>FMLJGBCHLLSn|z}{jZQTZbg[NPNEBCJONKJVcd^WRUYWNNYdhfUGEFFECDEGGDABCDEEEGGHI?D_q{yxtnsqearvnqooy{ysxvpx{pgovobYVXdrzwgVSSPNLJJJHFGB@BDCDD?<:8668878<>AA@@@?=::::;;:9989:<>@CDFIMNNOOPQRQQQRSVWWXXXXXXYYWVWXWUWTSQRTTSW\[TPRY_ZY[_a^ZWXXY[\XXE3AC5,,2:<>>?AEIGEFII@658>DJFC?=ACCBBBDGFEEFGLOKGRXbeaC3BdfgmdF9SUVakeS<7LacVMGA;8667897AJ91456=HIECFEBBBBABB@>Cq\JRQI99ABKMHKLI@979;?A@?@AA:8<@@>=;:BQTKMSE:ERY[YYXR60?HGM`h[JB?ACDABCFGGGFDDCDF@:9;AD<358435423347:87?@>;:;::;<@GJHC93379769EMLLNPD8>EJONKGKLHGC::>>?<<@CA==?A>88?C@>>>?@A?<96664479;<;;<>:426>B?9:::9755336998840135568:9:??;::;==@CA;9<;87:>EGD?<<9559::99DJ?CEFFA>@HNIB;:====;87777678;>?@A@><733455:??>>=<;=>?AAABBBBBBBCCBBABBB@@>;852346::888999::999863222//23467553.,2;BB>::;;:64435778:;;;:GHIJJLLMPSVWXZ]aa`__^[URQOMKJJHGFGGGGHJKJJIIJIGFFFEEECCIW`gmprodVIEJT_jkfgjllmmkouvwyudL>=?@????@@@@@@@BBCBAAAABAACCDEEEHPX[\`abb_VJAADBA@>=<<<<<<=>>>@BABCDDEDB@@@??;7:@FMWbgaaieR>9>A><>>:?KLHO[[Z\]^YMEDFFFFFHILKMRXXTRPNLKKKKJKMPQRPLGEFFGKMPUZ^`ceijkmnnnoppligda__\VU[WRr}maVTUVUTRJFMVZZYXXY\f_ipNPQSRQQkZJENdem`p{pkfndfv}ypfj`RR[jtrvp]aosytseXUPHIKJHGIHZm[RQkpc\ROOZbYNQQXp]LNMMLIGDUWPcojgj`SMFEHJKIGNYΎjcUN>SyXGLNNKJLMLJHE??EDDDEFJQVWYahcTLIIPW[PIKJD?=?>=ADDDCCFHHPo{tqokdRB<:=AEEB@AAI\^PDA@BGMNKHEB@?=<;=@CEB@@>::<<;;>CA65<<;GMTNPWPGCIRQOPSPC>AFHGHKVXNIVahh_QEA;449KHFNTVYZ[WMO[tn\XRFCCDFGGHJLLMMMOQRSUUVXXXZ[[XWWVVVY\]\[ZXYYXYZ[Z[[\\]]^__`abcbbbWC:DTms`A8=><>?>@@BBBCCCCCABDGHDCBBCFHFA@IW][\YSOJHIEADGKIHUhqqnfQ?BP[f\GIROECFJLMPYegfoqdVWYVZgc^QJGHGFFFFGIGBCCCFEGGFIDMz||xupq}ue^pm^gpv~~~}}wox|{skgeb_a^Zi~xaWUSPNLJJJHFGC?BECBC?>><:658<>?@@@>>>>>>>=:97889:;=?ABFIKMNOOPQPQRTSUWWXXXXXUUUUUVWXVTWVSQQSTUVWXURTY][[^__^ZXXYZ\]WZSJJ@0+*)-1346:BFEDFHA7677@IGIPKCCBBBDEHILNPPRTZ^hylefiO4>b^coqZ=_tiedR80E_h`VKDB@94578:7>I92677?IMKGFDABA@@???DJKNPPUTL<>IJKFCDGHC<9:=AB@@@?93;BBB@:42:IMKIJ<3DJIB;318BEHLLKKHJNJECCB>9:=ACCA>;;8658:;AJMOPMJEA<:?DDDECA>>>;748<<<==><;;;<<:97579::;==<9668;85566;?>;:;:967>FD<7:>?76:>BB@CIHDCDEB??>=9<@:333.,4<943347;>>=<=@B?<;:=BDGKIFEED@=;:99:;:87776668;<=CEFC@:3343359:;<<;9::<@ABCBBBBBBBBBBBDEECCA@@<4128<<<>AB@?<:89:9@HG:028<<66:4.022468;:989;<<;5/,*)+3:;@NRJ=68=>>:61.,,,,+)(*.5765779630-,,/0/05<>;867654216;70-+*.5::9863243/0443343336.2XA56998;5ZT59;9872//00010/6;;:873-19==>70.//Mjd]ULF=8977BJH91>RVVVXesmYCEWe\POK\Q3?CCCDIF7.,,8C;3341-*1>??????@?@BBBA@AAAA@BBCCCCDGPXZYY[]_][RE>>?>==>=<<<<<>@@@@BBBCDDEDBBB@AA>=CKNPY\XZ`cfhYA9==<;<;=FGBHUZ\\\^`\SIDCEFGFHIIJLORRRQOLKKKKLKLOPQSRNHDABEGINSY\_djmmoqpmnnomljhjkjfaZSTLT{iVTUVUTTPNSXXYXXZ[X]dkyoPOORSQQgPKFQegfasw}ynYcp|w~|ncnbOO[a]dqfx}o|xVPTOLLMMLKMomYKIhob]RNOY]UNPSYxeGMOLKIGGUWSfslij_QLIFHKJRNFDvm^QMD\~VINONLLPQNLJE>?FFGFFFGHPUTV]dd[OKGHIKLQPF=;==@BDCCB>;<>:7:>BA65:FKS`hWNPMKPTTVVY][NGEGGGJQ]\U\gjg_OA=:7458EFIRZ`bilaRMTmfYXSHCCCEFFHJLLMMMNPSTUVWXXXZZZXWWVVUX\]]]][YYXYZZ[[[\\]]^^^_abaab]M>75>Ti_@9<=<>@?E`uxdJ@BCABCCBAAA@@@ABCCCCBCCAB@BMZ]_feWKHIHAAM\[NLPRMGFILOQTaieutZ`g^XZUNFHJIHHIHHGJIGFFGGCCHNWqwhip{}b_jrghv|~vyxv|~wwoujfc`bhaYevn\WURPNLJJJHFFDABECBB@?KJKV\ciny~ppvxpe_hh\c_UQPPOKHEEEEDBBA@<:;>?ABCBB?>><:::98756889;=>?ADGJMOOPPQPQRTUVWWXXXWUSRQRSTSUTTWVTSQSUVXXYWSVYY[\_^\ZYYYYY[\WXP@3--./*,-/..03592677:>@EHGA?AAA@@?AHPLIMOPPLBEGIKGB>DJIECBAA@?AA<46=CGHF?626>HPPE92469EQXVCG_aLEL\igXIIRSKFFC?@DHHHHJJHGFGLI8146434465248?GFABEEDDCCC@:3/048@@=:868:<<==?>>?=??86:AEHKPTL80:A@;?PVH9106CKHILMKIHINLFCA@@?>=?DGE@9677865;DKMLLJFC@>>@CBCDB>;=@@>969:;=??858;;;;::856535:::=@?==>:6766666687200038968=@?=;977=>75435:>>>;<>:7:?@;32:DG?=?DIJGBDJKGEEBA?<86?A608<66;><852037:<<;98;><::>ADJNKFC?<=>@A?<8789876677888;?CC>9842223347::987668;>BBABBBBAABBBBCDDCAA@BA;447<===ACB?<:8889:;725:;=<626756742259;:<>><<;6-*-1.,6>DKMC867;@?9561..-))))*-46678:;8565.*,1//7=;:747985315850.-+.26962/.1210/001//.4=?/@`@26;;:95`R69;:=80.0/0/87.4AIKKF?3258;:;>CF=NhcbQ5?D1199:=B=2/4=A<5/,++)-8AEGGJKD7103789::96666>>>==<<<>@@@@AAABBCDEDEEEEEEHHD@@FOVZaedhiXC<>><;==??=??AGJHGFEHIFPE9:;;=?@CA6;a^^mjSD>;AIOPU\aggZRNGEGJNQT\ceb]L>;987679@DGQ[]fnrkXOThaWYTHBBBDFFHJLLMMLNQSTUVWXXYYYZXWWWVUWZ]]^][[ZYYYZ[[Z[]]]^^]_aa`caP?<;;:=?@AKovH@DCBBCCBAA@AABBCCCCCCBDBBFLPVQLJGGIGED>:BDEJMCFTWSU_\G<>@ACEEDCA@>;:987653578:<>?@ADGJMOPPPQPQRTUVWXYXWVUUTSRRROORXXUUURSWVY]ZUTZ]ZY[`_ZWWWVWXZYYS=+,11259.*(((('(,1@@97<=8=P]`__c[SLFHMTW]ih^XWRVn{[\l\@=Refa_^QJGDBA@?=9?L@1333542:EHC@BBCCA@BDDGJLNONLE@=?EFD@EJKKKHA=;>EC979<@EIKJC;76>HK@7425;@GXYMR]VNLKQ`gYHJUWOJLJCCDFGHIMNJFBAIK>9?>646665347?FE@?CHA:;?DEB;2.6CHFEFFEEEEEDFHKJHGCCA61489:<=<;:;:=@ACEEC@@?>=>>>DEFEFFKC54>FD>AOSA0/6@JMKLNOJFGJJHGC?:>CC?@CEDA9579975:EMMKIFB??AB@?BCCB>;;><85555689850/36522;B?8467599456679>A@:;=;;<=83/18AEEFHJIIJIIKLKFDCDA<8;@>78CD>=:9==8558:;;:9659><9;?@DMNG@==?@@ACC=5367764468876:<><844335688569987654459<>?AAAA?ABBBABBBBB@>@CA<:;=?@@@BB?<:87783.0359;<:5137774/.,,47,*493,1:=CNOD638@<53:7301,())*-26788776699401223:<999789865666224300224211120100//0..,.6=5SV:37;;<9;_N6;;=>80251//9=10BNPQNH:34688BPSODJ]acR8EH.(3965<>>NXUSWinP3(<}wMQY_u{`[\31DEBEPRLB====<=>??@AAAAAABCDGIIIHGHJF>:9;EQ[cfa[^e\J?<<=<8;DFDLYYW[`aZSNDCCDFHILOPPPPPOMKKLLLLNPNMORSQLGHIJMPTUVY\]_`adhjlmmnnquumikhXNYfesrVROSTWXYYYWTUY^ZV_[k|kKMKRSLOcb]S[gnddntv~snOV[`kmrlemp_SYdjmqhWQXuRAFMQRONLIGFMVp{bSNZqk[\QJR`^NLQURSRHIPNKJHEGNTmyoom[NJLMLLMR\X|tiTRVQiRHNONLPOOUSNKLJGFEFGHGHHHHFDGLKJJJJJKRXXIB@BAIMMMKHHIJHF=;>FMOOWUDEONLLHDA@ADFGHHIHIIKRRNLEJI@ALVQNLIDID>??@AA@FH8<=>>?CEB_sEADCCA>>?@ABBBBBCBCCBBACCBELNND=77AHFABBAACMROGJSYYZa^KACGLSTPCDGFGILMMJIPaifnumc]ULILQNKKKKKLNKJJF<>Qoy}yhdq}wqhbafmrqgaow{~|uqv~yoiiimmggmkda_YUROOOOLJHGFDFGGGDBA?KO[dgimv|stvupg\V]a^]XVVWTRONLLLLKGEDA>>@@@BDEDCA?><;875434679:<>ABCEGKOQQQQQPQQSTUWYYXWXYVUTSSROMOWVUVUQSXWWXWST]b]\_a_[XUWXYYYXXUB3465476311/--.048=BD?<<=@VhbTNZ_YRKCCXa\geYQPQ]unBZgD8?CLP?@FTcsz_NPO@Ihmjfg^NIIFDDA??<=E@51122225=FFDCCCBA@?<>FKKMNMKG==>?@FGHJJJJD<89BEB98:;>CEHOK@6369:99;979:BX[QTXVVSKJW_SGJSVPKLOKGFFGHHKKIGB>AFDEKD85888768=@CB<8?E=3369?C?77BKLIHHGGHGEEFFHIJIHDDC716::9:::=ACBCDDFHFD@?@@>>CEEDCBA@B<7<@CCA=:777:<=;;=>=;9755667798679<>AA@<:8888999633443239;83025321169:75;@A:7;=<<:400026=67@;4>@=8665433347966:997653237<><9568776651269;=?@?@@ABBBABBBBBA@@AA@???@@@ADB><:8986236413698410672../-,3?IID@=?>6./793-0:>CJMD537;843:;623.)*+,/36754344456655239=<9::;=;:;<><;74773001233442020333520.*)->?CFGB:;;88899999529?@??A?93.,+.1244446;>81026;???A@;436999:GFEFFEEDBFNSX^`bccc\TRSSPMLJJJIIJJKMPQPPPOPPQRPPSZ[RKOVWVZbghgghgb]\[YZ]^_`dfjppnoprvxvuun]JA@@@@????@@@ABA@@@@ABBCCDEEEEEGHIIKNNMLNNKIGEC@?>==<;=?>?@AAAAAAADEHKKKJIHGFEB?>@BQdbZTTdjYE>>?><;:9:>A@BFFIS[_^_bVE@CFFHIKNPPPPOMLKKLLLMNMLLLNPQOKHGIJRXY[`abbcfiklmmmmnoonb^_RMYkcTj^UQRSVWXXUTUX\XTaZj}fGLJPRLOgb`^`grdfolbjknPR[[cub]hpnc]cimpgRJOVbBHIIJMNNOLJIKMTt_VV`r~hYZSMSZYTQSTSOHHLMLKJIEKNRgtnje[TQNMOLXlvyy}nUQVPnPHONKHHHGKMLMOOMJGFFEEIOQOLIJJHHIKJGDDJNKHDCAU`URKJJIJHA??DKOPOTYJFG@FJFA?@DFGGGGGGFFEHE>DHGJMMKJY\ZKALPGABDEEFKMC@mhZ]PC:7@KPPPPOPQXVMDGU_aZQPWZdhQ:635889;99?KUQE7>W]OLPPMLQUNB>CEEEGIKLMMMNORSTUVWWYYYYXXWXWUWXZ\]]\\\[[Z\\]]\[Z[[[]_``a`Q@;;:9:;=>=;=>>?EG;:9<=?BBBBBBBBCCBCCDCELKGC>6=IIFEGLJCESXPLPVZ\\\ZOEGMKIILC?CEGKLLMKDEQUWkwvh\ZQLMMLKJJJKOPMJC?Rvytt}wmmwyijsf`cijihbgu}tw}o}x||qjjr~whikeba]XVRQONNLIGFFCFJCIFAB=EQ`egju}xryzuncXTV]b\VUUUSRPNNMMMLIFDB??CB@CEFDB@=<97432425789;=?ABDFHKNOQQQQPQRTTSTUWYYYYVTRQQPPNOPTVTSQSWWTTSRU[a^]`a_\XUWZZYYZWXSFBB@=>+3FIEADGEEDAFIB<R`\fdXL;:KZRCMO@=:9849EHECA@@??98BKLLNMMLF>@@??FIJKJIF@97;BA>98::=ACEGD<4235568;87:BOYZV[]\]YRNTWOHLRQKGINPLHGGGFFGHFD@ACBGJ@557767;AEEDC=9=A=86548=?AFHB>AFHHIKIDBEGHJIIGDC@627::9998:BJLGCBDEDB>=>=<=@A@@A@@@AA@DFFFINNDACDFHIIDA@??>?BGFA<:=CFEB??BC>;AJQTRRQOMHBACC@=<>ACGQUQOQQI?=@BA<9756<@>=>?==?=64567678;==>@??????><9997459965::877422115657:;:859=>:7;=;;;50///27BHGGHIJLLKJHC?BFE@>=75@@?<98<>=:895321369:889887776447:<<:878766676:?=:;>??@@@ABBABBBBBAA@??@@@>><:?D?:9877755::423566533871179611:EGEB?>:4/0552.2=:<=?A?=?A@=?<6695/0455310/0/126861-+--&>C2447?G=78f:668862.06-219AAHJJILOI>987525:JKJB:N_WNNC76643126751=Kawo_h`ce[]_nP,>giMGUIELE<@LUN;/0101587;@BBB@><;<;9887788537>A@@CB:42//5:;>><:<<83..158;<88?>6467643HGFFEEDCCHQX\^_`abd_SNOQOLKJKJIKMMMNQQPPPPOPPQPPQQNLNNNU]acfgdefeb_\YYYYZ]_bcfhilptuuvwtsqgYNHB>==>????>?@@@??@@@@ABCCCEGHJLLMNNPPRQQPOOLGDBA?====>@?@AAAAAAACEGIJJKLJGHJIDA>=IXTPU^cfbTF??A=:::;<==<<::EUciiml[H?EHGHJLLNNNOMLLLLLLLMLMNNOQRQNKHD@ACEKQW[^bgjlmnmmmooqrdVOLRW[]T^}h^OOQUWYVRSVVWTP^\j~dFJJOPMOiU\a_gsbhtikngnWZdkl]Rajieemofa]TLLMe{SFKKQXa`WSRNIFDFqd\\`mxgYVUSVZ^a^UQQRGHKKKKIIFKOLYklfYT]^UTWYqwxaSLMKv~NHNLGHFDDGIJJIMTQJEC?DLSSQPNMKJJIJHEA>@GKKFCCSplKIKKGCCCFHJJJR\PJDAMRJ@=@DGHGGGFGGGHJHDIOCDU]TBK[`L>GOICDFHKMPSMHj^UYK?;>?@BEHGA@CEEEGIKLLMMNPRTUVVWXYYYYXXXXWVXYZ\^]]\\\\\]]]^\[ZZZZ[^`_a\I:9:::;<===<=?@@DI=BfuK:JeV87===ACB@BAABBBBBCDCDCFFFFN@5BPNJKOPLJKNQWUKJRUSW_UEFLG?>@BBCDJPRNOUWNILO]y~dQOMKFEHHGGFJQNFJX{wngjolgdmthfjtf_cihcafr|~}r|u|nwy|z{wlp|sooib`_[XURQONMKIGFFDDIBGFDA=CVafjs{~ot{{ri`VSV_d]VUUUSSRQPONLLKGEB@ADEDEFEB?=<952100235688:=?ABDFJKMOQQQRRSUVVUSSSX[ZXWUTSQNNNOORSQQQSWWVUSRUWY[]_^][XUWZZZ[ZVTRJE>=BN5(158:>;:84=GPJ?ACFFGHLSbgd`\ULLX_i_UP@.2:>=CFDGHB42;DHNNT`VUPE>ELCKUNFJMHFHPROPMEIQ]UHDEE=9BJHEDB@@?>>DLOMMNMNME=CDA>BGKKJJE<57>@?<;:<=?AEEB?;6456666668DPW[Y\c`[^^VQRTNJOQIDGFGQSMGFFFGHHGC@A>>?=>=:9:>DKJB844:BFC?BBADHHJIIIE>;538::98:84:ELH@>ADFC=;<;::78>@AAAAAEJIGEEIQPHGFGHJLMLJIFA:8=A?;89DIEDB@?BCAGUY]]\\]TC;?DED@==?A?=EMKFIQMA:9;===<<;?@@AB?;=?;41333457:=>>?>==??@@=:98316;958??;8541113:=<==<<;:;<<<<<=<<=730025:@CEGIIJJKKKID=>BC?<;66:<=;AIKFDGH@73678;>AA>:78<=;9:<<:8;?ED;544348::::767:;;867779;<>=;98788@JKC99==>@@@@BBABBBBBA@?@????==:78841223454578766664444557:?A;105>EFEB;61./220.07>;2.4;;63121123430+-011452/,-147988777?@@??A@;8;<7487026863/../-1.560+)),/3B4+,-01=2-1`953433556:5633;EJIKMOGCJHC93168=?C5%6WUILB799633333/+.0Ghaip[LOcebn|{9F{}fRPJC?82297?ED>;<=:97?A>8623;ACDDB@?93/-/245783/7=:76420.MLJGFDCBBFOWYXY[[[]_ZSPQQPONMLKMONNPPPQQPOONORQPOMMMLMOT[addc`^^``^[ZXUWZ\^bccdfjorrqrtttrl`VPKF?=????>>?@@????@@@ABCBDGILNNMNNNNOPNMOQRQMKHDA@???>?>@AAABBBCBCEFFGKMKJKLKJE?BFFHHGGGHHHKLLLKODBK[fXNT[PBCGFDEGIKMOQOJ_NNVC7=DHKJNWWVTQNNB>LUJEGFJVSRY\G?977649?CIR[[PBEIB9788;=?@@AAACDEGIKLLMNOPRSUUVXXXYYYXWWXWUWY[\^^]]\\]]]]]]\[[ZZZ[]^^_VC89;;<<;;<===?@@CGB?Nc}`CAESM;<@=AIJCADBABBBAABB@@?BA>MTC?NVRKIKLNONJKTP@>JLGRaVDBDA?>??BDDMVVOR^d^RRRVgnXFHPKGJLJEEIJGJ[~ttrmkmkir~|lbgiisg]]bebclx|mn|w}x}nk|zyz|vzplssia^]YXURPQONLKHFFDDICEFIB=EYcjuz}truztgaZTTZabYTVWWUSSSSQPKJIECCACEGFEDC@<=<730//0135678:=?ACEGIJMOQQRSTUVUWYWVUX[ZURRSQNKKNRQOPPPQSWWWVUTUUUW\\ZZ[ZUVWYY[WUSOKIIHHK?++,,-,)*)),3ENEFEEEEFSfqh\YX\[QRY_RN`eI769;GPPRTJ718AEKOSTSUOI>0602?EGIGFJU^`cc]RMT^XPOOJEFLLHFGDB@@ALRNKKLMLNM?:FG?=AFIHGHB826>?=<<<=>ACEGFA;7444556659FQW]^_dc``_YRQRNKPQIDFCBLPLGDEGIIHGB=968@CFIMI:-4EGDFD?===>>??>=?DLMD=;823;?<58BCDGIKJJJF>=748:<;7889:;BDBBCEHFA><99;87=@A@?>?DJIEDEGKLGGGGIKMNOOMG>53;=;99;>@ADEB@@CO[_]]YUTXQA;@FFDA??@?<99>BBFKH@869:=@BBCB@?=<<;<=93122244455569=<<>?@@>=<:856987:==:8530/27<;9;<<===<<<=>>><=?;74468:89?CCDDB@><;<>CJIFGJF;547=>>?@>969<==<:89;:9;DE<65655899;;6368;956:@CA==?><<><99FPKB;879<=>@AAA@ABB@@A@@@@@??>=;951,+-.26876678865432004:?@BA<9=>ABCC>82..023233451-,06830//..037:82476245311455:=:8987;<85:=??>?AC@7117835735888433320/,920**))+9C/*)*+,4/+8h9313329>>@>:403?HIJPNDDQNG82A><:;@A?;30/5@B7/39<=@@<3-1799:>>>?ABCDDCBBDEFGJLLKJJJKJE?<=@CGIOZ`ejgYC:>=<<<76889=AAAAAABDFGIJKLNOPQQRTTUVXXXWWWWWXXVVWZ\^^]^]\]]]]]]\\[[ZZ[\]_\QE?;<<<<;:<==>>>??AB<=<;;::@NPIOVURKA?JRONPQI@>@DEFEHKMPRSTUUUUX[YUPNOJBBCHH?;HMQYSKFGKC4;32@IB>?HYcgfjkic[TKIWbXLLMLHEEFB?>?DNNGDHLLIGB6?CEEEED?625<>=;=?>>ADGHFA;7333445559BJNU]`dkjb^^[WTOMPSRNE@ACCDDCBBBDFD>8548@FJSWQ@13CHC<9899:<===?@DJLHA??;669:;;>CHE@IOIHJFB@858=>=;9GGHHHGHGB;78<>==>@?>=?CGHFDEFFHGHHIJKLLGD?:5029<=>>>>=?BDCA@DWf_\]UIGLMIDBCEEEA?A>:965:BFDA=99;;?BEDEB?<86:<;;8323433322226:==<>>????@BB;57<<:9988877779;968<<>::<:66777:>ADGIIJKKKKJE<;@B=:8?HLHFCBCB><;67DJDCIG<;=?@?>??=::=>==<;:99989?@;767558<=;:64333337AKNF>;==;=?>:8CKD><8459:;?A@@@@AA@>?@@?@@???>>==940/14688998885321/09CFB@@@@FIEA>>>;70-/02356862010-/0.-.////16<>98:74453/27858:;?979<<;64:<<=>>@?7.,4:5268987854552/-6=62.,++*15,++,+.01+Df:2/356?B@=A801-4EJHHJEHSMJ37532221.+,1/-Lt~pbSNbok_YqRB2'-3321/..0357>E@<:9==;8401:@;20383,4==:96555489751,4LWVROKFECCCDFJMMNMLKQXYUQTUTSQQOMMOPPPPOPQQQSUTTTTTQPNMKLU_b]TR\_`_^]XSSUZ`b_[^aabeilpstttsle^XUSQMFB@@@@@@@@@@>?AACEGHHIJLLLLMNONOOONPRSTTURNJHFDA@?>>>@CBCEDBCFHIIKLMKJJIIKKF?>@?=8=PahkmkbN?>==<GaZNOJA;;>GPQLHFFGGIKKLGQ[[LKHCKVZYUPMGDFFFGILG<>GE@CDEIIJLLLLOW]_ZPLHBGFBMRZaZH9Lcc]d`THFHKLLLMMUUK?>><8899?DFGC@ABDFGIJLMNNOQQSTUVWWWXWXWWWYYXWVY\_^_`^\^]]^]]\\\[ZZZ[__THDA<;::::;<==>>>>?@@?>HSB=BCB@>????CHIECCBDDA@@?;:;;:<>BEFNYRIJK@=KQJLRSD<>AAEJMOMMOPOOMJGDBCIKIFJXa```_[MJSOKNPRQNRE=Y~wfb^]]\]eumdgpohec_eqj^Y\ffiwo^k~tymcx~~ukkopkfa^]YVTTRQOMMLJFHDENCBGRH7Hequv|usvupjb[WSWcif_^_ZVVVTSSSRRMIIFCCDEGGGDCA>:61/././0235668:=>@CEDCFJKPTTTSTUWWUTK@9:8779;:63//6HWXSOPRVWUSUYZXZ[Z[ZXZZVUUUTSQSSPLIIID.(,.----,-.21**:E@ABBBB>Celsqk_]aYOOQXcdN73;>LTV`eYE96@OWY^X@9=<;<>@CA?AGNI<@84CGFA@BFGEEE@:66;@>=?@>>?DKJEAAA864568878;<A=<>CC=76:??72797>KM?6:=;9;;;;=?CHJGDBA>98988;DEDJJ975:?@?@?AFC??@CFHGDEFGJLJIIHHIF?:533258;>BA@?>>=>@A@BPbe_\VLFFGHGDCFIF@?B>98756;9:<@EDB@>=<9:<=<9622554433347==;:>A@????BEE?:998667899:<=;:;:8:<=?AA><<<<<96786346436=<>A@>=<;?@;878:;9677659BD=87521/-3:CGC=<;=?=;9987?@@@@@@>>????????@@@@@>:8620258:::88436;@KRJA@@@BFGE@==>;5/--/..11321110-,--./00121016951244311466579@B5<:;>>6379:;;::995//7615>;7674210--2B940-+*++++++,,-.01*J[5-27:<@CA<<5/1-,:A=;FEJSNG1OE6=CDA?OWUL:;EG;41.-,--,281+3JUURVWQ]qqVS{rx]E:,*13200//0256;DE@CC:8:767533111355446779=@AA=4,+/37;?@A?3,7??>>:435534787/0KWWUSPKHEDDDDGJJIJKMNPQRRRSRRQPONMNPPPPPRRRRRTVVUVURQPONNPUXUU]`][]^]XSQRVYWQNV]]]ckptuuuuqjec`YVUSOICA@@AA@AA@?@ABCEFHHHILMMNNOPOQRRRRTUTVWVTQNKGECA?>>?ABBCDBCEHIIKKLJIIJKKLJD??>;85BX`\[`i]FB@>=;>??><@EGMVdjjjkmhbMEHHGDABNVOGtNIMFHTSLEAABBCDEEDEIMOQTSOKGA?>>?AAAADIHHgz[HYaci]NIMOMKIHHECA@==ZfJEGC>:=FOTYSGHHJKNORYhnnXOH<7BXXPOOHEGGGHILMD=ACACCCIMOW\TMU]]]WNG@@CENXXlgOI>ARWMTWPFA?CFHEBBFJMLD?@<78=EGHND=CDDDEHHKMMMMORSTTUVWWXWXWVXYYWVY[]_`aa_^^^^^^]\][[ZZZ[^WE;;<;<;;:;<<<==>>>?@@??@>?@ABCB?==>J[WD>??@AA????><==;<=>?@KVM@AIHHOQLLOMFA@@AEGHHJQWXRKIJKIEDGIJIJXfgge^XSQX_[PNOQNIVokjhda]f{|ula`jlc`b`^ctraZZ`el{|dWst~yxymd~x{}|qlkomid`^\YWUTRQOMLMKFFCBPFCLZK9Utyy|yvtttnd]ZXT\fic^`aZVTUTSRRQPLJHFCCDDEEDCBA=82/..//012445679<>@BCDEGJMQRRSSTUTSQQG;469::8666743.4BSTNNQVXVUVYZXZ[ZZYVVUTTUUSQQRRPNLJIPJ7/-,,,,*)(.2/4?DABDDCB8>ey{omgfe\ZZ\^`fN=@GQdkga]^__^afdez~m`]XOGBA<88:<>>@A@=?E?75C9=KGDDBDHJGEEEA:9>?@@??>=?DLLKMOPH:77;?@;6763;MYdlhgeda]UJCFMROB=@=<=AB:65688438;6:OZTRTRPQOC:=FFB?<==<=>BIICCEC>:99878@EDILB?DGIKC5257=?@ABDFFDDEGLOLKGC@@?<95579<==@AA?><:8978;;::99:<:79;>BB@>;;<=>?>;8634676543348<<77=A?>===@BCDA920377655679;;:99:<>ACA?>><;867675443027<>CGIKJJJJKJE<:?BCGF=CKIE@?CB=987755:>?=>MSHABDDBACEEBAA?=?@=75787777766:AC<787420.2:<955;>>@@@>>???????@@@@@@@>=:40035798887@MTUTQICB@AA@BEDA>>92/,,-,+,++,.///0//12320252.+/52-.221/5;96568@7:C50456767787644781,43,4?<5675553239?6-,*'(-.,,++,,/011*PX,.8::>>;C=4211/+1757EEKTQ==P21.8BSVSQQ@8ILD;421/+*09@>3,+&',,:VY_zvQHuJSR@90,12213200233521686400/0136439<72267:<>?=:513:@A@>7.2@B@?@<412215;><2-BWWVSPJGECDDEFGGGHKNNNOQRRRQPPOONNNOOOPPQRSSSTUUVVUTSQOOMNOQU]_]]\^`^ZTQQPORRQUZ[]binqrtwvqgccb_[YWTPJEDCBAAAAA@AABCCEGGGHKMNOOPQQRSTTTTUUWWXWVUROKFDB@>>?BABCBBDFFGGGGIIIJKKJIHE@>=;8:CECEJMJECA?><>>><9GbTCFJH@?GNQ\aSFJJJJHO]dhg[YWWICWRGFFA?ABCFHMQSHACDCEFJLP]fWMXb[RKGEABDKX\Xih^ZJIIHGPPKJE>=>=;=>?AOWJ>==9>JQKJNB?CCCDFHJKMMMNQSTTUUVVWWVWWVXXXWWXZ]__`a`_^^^^^^\\[[[[[YVG;:;<==<<<<<<<=>>?>?AA>?@@@@BCCB=<=>LZQC??>>?>>>??DEBB@?@?>=DKNKKMQPQXZTOJFCCBADEFHKQZYTNLMMKIHHIIKLTcki_WTST[g_MKICO{Ÿxjeb]^cr{pkkllld]^`a_dste\WVdv}sY\su{wvwohx{~ÿ}yrommjfc_]\ZXVTQOOLLLJDDD=PJCQ^HFp|z~|zrstj^YYZ[`fd__b`YVTSSRRQOMJIGDBCDCCCAABA>7300////01234469<74688:89:9886523?ONMPUWWVWXYXYZZZXUSSRRRSRQRRQONNK?8<=2/.../1/288:FIDBFIIEB;Cix~tmhhlh[Y_aVKA=@::IUSD799?DCDFDDCC9:C>J[c`^^XYYPLMYZ[{s`TM>6798:?AA@@@>DJMR\ba]UG:9?CFC?>87DR[fkhjjc`]VI?>BB?=>>?A=:>:9:889998748MZYYZWURA6>KIDCB???====CEBCGHD=;:877AAABCBA?=??DFHJJE@845<@CCA?=>?@AACEEDCEHNQKHD?<;<<:78;=>=<@A>=<;989:<@A>>HT]]WPIEFHMNLKGGJG@;>BCA>=<6346658ADFEA==<;<;987579976643348878:<<<;:9;?CEB91257752147:=;::98;>ABA?>>;9789::8994139>@BFIKKKJJJJF=:?AAEA9>HD<=?CD?:78:7319BBDGHHMOKGFFFC?<9777766776678;:9;<85222589656:<>A@=;:987875422587679::<=?@>>=>??????@@@@AA@@><:854421247>R_b[QNLIC@B@@BEFC<:40.,,,+++****+/1223444431211022102221.2:::531/5F<1.//665754210242-.3.(5?:66889:=>;85412.++12.-++-.0113.[T28705><4C9.////.4638AEMVH6U=1;10Gb^VK@6=NM@950251,5DE:/-/+'('+GD6114896112469<<:;=5-066339>?B@627;@B8+,=IFA@@;42226;??:4->WXXTPIFECDDEFEEEGILNPPPRRQPOOOOONOOOONOQRSTUVVVVWWVUTPNMMNRWUQW\\_b`\UQPOMOSTUWY]`ccdfjnmg`acec_\ZXTPMJEAABBBBAABBBDEFGHILMMPQQRRSTUUUUVVVWWWXXXVPJGEBAA@?@@@@ACDDEFEDEFGIIIGFGGDA?=<;877:<;?CGIT`hibaYVfbNFDDDDDBBDHJIJJKMLIILNPRRTWWYWUUXWTSPMNPPRUWVVXZdnprttsqmfbac_`a`\QNOTUTY^`Zccm~jVPJPRGTqb^ZcpkvXat||vxsVS`o]KUGFIKLMOQQQRSRPOVgt{zricb^WSUYZSLkkXPIEWd~yqonph^\YYWW[UHDHLKKKFCKNPRURNLLKKIFMSUQGEEFFIGU{lpLGIHFGFA>FJKIEB@@?BIQWVIFJC>ADDBAA@BDEFFHOJH?BEQQJJLQUTQQSSRNE@?;A[_KGOMEAFMPR]YIJJKTTRSITW\g`klWZI:=B><<<>@EMTWOBCEEGJJKP[ZNLUXQHEDCCDFGRYX[gldRRTPGOTMKJIB97<@@=>AID>:=CL\aTSO@@DCBDGIJKMMMNQSTUUUVVWVVWVVXXXXXWY]__`aa`__^^^^]\\[[\]ZM=;><<@?=======>>>?>?AEFEDBAACEFB=;<=>BCCA?><===>??DILLIGDA>;=EPY\XQOU^cZOIFFFDBCDEHMSXYWXXULJKJGGHLNQ]bc^XY]Y]dOEJ:Nɿppue[_jrx}zqjlu{mgea_^a^dmriaYUhy{kXilsvuusooux~||xqmmlhfc_][YXUTQNMKKLHAAF@BA?731100//00133357;9FLKMSUWXXXXXWXYZXURQQQPPQRTURNNOL=-,1110113?GOXSQRMDDLPNHC>CcxybR[jj_YYbcH>=BNI;6:;6688874:BCAAG@EHJT`aZ[XQRPJMLSYZezxzrb[ZQ<287:<>?AA?8?ScaUTKPLGFEDEGHHGHHE@??@ABCDBFQY\dnqkc_VG:>EIMQSMIPUYgmiie``]SE>=>=89=<@C=57:9:97:?>9437BPVWYWQB3:LSIABC@??===<<>ACFFC?=:8879AIIGML>5679:;;>ABBBCDB@BB>>;DGGEC?==>??@BEECCEHOM><=>=>?@CB?A@:47?A>99:;<:9;>?>>ES_`ZRKGHHIHIIINQLC@EGDAA@=712544;FLGGC@>;88987659<:7565434788:;:9997648@E?7455575336:??<:988;?ABA?>=;:888<>=>@:337@@A=69@=9;@DFC;79=:426:EPJ9=DCEGHJNPNJFDDEB=78;9765665556756=@;5346777557:>>?@?><;:8753210463456679;>>>>>=>>>>???@@@AA??=>>>;851./09LXYYUONOLDAB@@BDGE<50/.,,****++))*/123651.253369731586684.-17:313/7D/1355643540,.012/*/4-)7@757899:AD@93/5:41485/-+--/03032`I582,2662<5-./..073/12=KM2CX:BC3*O_Z]O@CONFB=5/163-6FE7,+.0---*)/75620388305:89>?<84:A7*/CLFA@?93533:?=;7705WWWTNIFDCCDEDCCEFILOPPQRRQQOOPPOOOOONMMPRSTVWXXXXYYWTPOMKMRPGJV[^acb_VQPNMORSUVY\__]]\^^^Z\^bedb_]ZWTQMIDBBBBBBBBBBCDEFGJMNNQRRRRSUUUUVVWVVWVXYZYVRNIFDA@??>??@@ABDDDBABEGHFEFEFGE@>><:989:;=>>??>>>>=====?A@FMUZ_gcSSipbPC>?AB@BEJMLJIJLJHGIKKLNNPPPPIKQSNLLKJJIKMNMR[dnsrsutsrpi^^ZUTir]UPOSTUV[b[\gm{sgUQRET~hYXdldpW]jyxsqZTaqUCSHEHJKMOQQQQQQPOTbr}xskga\YYZ\][Qu~^LEFWf|ppqmf__`][SLKA@HLJKKEAJMPUVQLHGGFEEE?ABFEFCGMQZuonIIHHFDDEIMNJEB?=>>?@HMG>EJ?DLJLMNOQVWUUVWVTKB@?BU`RKQOGCFLOMSSJGGHdmVODL_^a]coh]E6:B?==>>BJQVXOB@CEHKFDNSLJOROIFCBBBDDDJWYYYeiV\r^FMUNGKH?:?GACFB<=B>;@FVfc\ZQAACCBDGIIKMMNPRSTUVVVVVVVWWWXXXXXWY]__`aa_______]\\\\]]UE<<@==@??>>>===>??@>>CORGAAAAEIJA;;=?ACGDA@>==;<=?@BLQQOJFA=9;BR\b\NKS^YRKFEFGDBBCDGKPUXZ\\ZNGHIFFHLPPXcWYaSRV^ZH@5_ý}hhqi_awvnmkedy|l_[^c_[_cigkkfd^_t{xg[tzkrvurqvyoŸǵ|tmkmjfeb_][YXUTQNLJILG?BIADMFOPWxyrof\XWW[]a`[YYYWUSRRQPQPMJHGEBACDCAA=?BA@743210////0333469:=>97;<958@INPRUOC:543578:;97641124>FGGKKKPSWWWWXXXYZYVRPPPOOMMPTURMMNOMF>;92//126>GRVXVNEDMQMFB=;NfqYG==X_VVYceL@KLe`J31655689628DE>@KMRKRba\]_[YULMORSZ[Yi~vupb`in`D667;>??@?8DZK=HTVOKHGECCEFHHHGDBA???@ABES`ekqspkhg`RE??DNUTRW\WYfng`X]_VHA?=?B?9=@EFA979:;;9;@>7326ACAGQQLA?NXUKCEEA>=<<=>=?BDC@=?=;:;<=AGHFHE:3269;<>?ABBBBCA==C<8AHJGHC@CIJHJGDB@=969<>@CEDDFKKA48=?@@AAEJBDD:16AC<79<=>:657?>=;9998:AGFFEB?=;8666899;=<5244334569=>=;986412=D<56645643358<=<98769>@@???>;:757;>?A@:4215;AFIKLLKIIKH?9<@>=;68=<:;?CFF<69<95449DOF:=>@B@;9:8755655556525=@=73688766588;;>>>>>>?@@>???>=<;9:863234>PUUXTQPNHDBA@ACEGD:1....-++++++,-..-0454/,-238=?:32:;7931114;@:34<<7>989419=:66:30WWWRMIFEDCCDDCCDFILNPPPQRRRQOPPPOONONKKNQQTWXY[ZZZWTRONLIKKIEIU_dbcdb\UPLKNPQSUX\_a`^\ZYXX\_beeda`^^XTOMLFEDCBBBABBBBDEGKNOOQSSRSTUUUVVWXWWXXXZ[ZZZXSLFCBBBA@?@@@ABBBCCDEEEEEDEFGFDA?=:::;<==>>=>??>>===>=>@AEILNSYVT`fcccZOIB?ADLQJDFJJKJGFFHGGIHEHIIGHLONLKKKKKKKOZgpttstusrrspok\QTKWt]YUSTTUWZXVjmuwlWLBS~lXXee_qWZeoreqqbc{YM]PIFGIKMOQQQQQOOS]jyrnjike^\\^b`Y^CBJZmsegha__`aaa]UPE@HLJKJEBFIKRQNIFCCABCD>9IVMDGJLVbkb_mMJHFECFPSRMC>>=>>??ADFA@FE>>AABBA@@ADFEHMKDDCFHDJOPOPUXXWYZZZUNKJEL\XPSPHFGJLJIIGEFE`lZSJFXab]VWZ`H>ACFDDEGMSTVVKB?BEGD;7?KQRRQMIFBA?@AABFU]fbch\jsWCHTSJMNSVKA@EQMEEGBACFVc`]^XA@BBBDHIJLNOPRSTUUVVVVWWWXXXXXXXWWY]__```_______]]\]^^YI>=>@@>>@BBB?<==>>??=?ILB98;?CFME=<=?BGIGC@???=:;=@CKOOJLMIC;<>AHS_[IDOQIEC@BDEDBABBDEGJTW[[YMAABDGDJTPYYJc]FINPI@>8HONA955323455:?<96410226=GKLMNPSVXXWXWWYZYTPOPQPNNOPQQROMHRVNGDE5**-.-.28>AGKGBIOG@;528BIBHC2=LQW[fgQHUR^bY@565344555FC44HIVLJGDC@;@EDGIECABA@@?<8Jfomosqlmrsl_TKA@HG?BMSX^^caUMX]K>=A=>BHEDFILKD>;<==<>?:5226B;3>KMNSVWTNIFFFDBCB?@BCCA@?>==>>>@DED@DC?975679:>@B??@C@>=83777:>ABEGGKQTNIGEC@?;317==?DGDCHC:=CAAABBABDABJD69FHB>?<98733?@@@???>>=;>=87769>A?>=8311111239>=<:975335<@:5776554234657865546DILMLKKKJF>9>@=;>99<=<<=?EG=78986658GLC:<@@ACBCCD?:=?>;<><987766755897326:;<:27>;87546779;<<8216852.,/3330.02332346:==>>=>=>>>????@>821024554224;DN[a]XUF:BGECDGHD?40../0.,,,---156/,011025315;==;54678;<3-0776469019*/.2678;:0+2<82283--/1:9,,58:==ADHJG<678856321-./.,(3::gM.1981/26>:6633334441.,0*FX839@=?LABEO^ggWE@:44564.8FIB:0,+,,,,+,,-03470QjASHBDDD=887662.-02554444555444332346666:71..+*-6@?3+,0/057536=EKJ?68>B>;;9469747:5/XWVQLIGFECBDCBBDFHKMOPPPQSSRPPPPOONNLIJMNMPSTTVWVSOMKKJIHFFGGJXffedfgbZQJJMNOQTX[^bcb_]]\]^_beggedcc`YROOOJFDCBAA@@ABDDFHJMOOOQRSSSTUVUWYYXXYYZ[\]^^]WRPLFA??>?@AABBCDDDCCCCBBDEFGFDB?=<;<=><<<;<@@?>>>>>==?@BEFGGJOV_a[\hia^XLBEOMEDHJJHGGEEEEEEDDEGHIIJLMMKKJJJLO\mutppuuolmoqpqvlTNK>cta\SSSSRRWZhe~swraPDXvkYYegbzWXprpleps_fVR`UMDDFJLNQQPPPOPQV_mpnkhtsf_`ab``[CBLZk|fR[djlkdc`_\ZSFCILJKIFCFIIHGGEDCB@@AA@;BNMJMOJK\kYUnRMHECADMMIB=====>>@AC@>@A?AAAAAAAA@AEGDGQOHHIIIILOPOOTXXWXZ[[YXXWST[WOOOHGHHIIGGGHIOYglldQUaaVMKFQIGIFMRQOOPRMKNIAAACE=56=LXVONKGC@?>=>>>GRZdkc\T_^GGSZcikjofO@>GPOKKKHECEXa`b^SB?@ABEHIJLNPQSUUUVVVVWXXXYYYXYYYWWZ]__``________^^]_``TD?B@BC?=BGGGA<=>>>?>=@FC>>??BEHB9;>?AAAA@?>?@B=9:?FMSNECJOKE<>@??DJGA@CCB?<<=AD@FKJUP[sOAHGBE:rκ~d]fx|wog_\^```\XVVWWYf|lanlkj\[Y^s}xhnpf^}w{y}szqlqѻö}vpllkjgeca^\ZZXVTQMKHHLC:LSRHFEGe~vmf^[XXX[_\WWVTSRPPPQPPONJGEDCDDCCAA?:=@AA87;82/...0221112235779<>>:6510008ITQB9EQX]ijOGPLUbdH44511012:EORLHEGCGem]RZch^SV]fc^Z[beeegisujddegimeM98;>>=@?:63>I@RHLHEB=5699>BBBEFB>??44Qruponosvyxqd^^Q?>>=DEAHPKU]QFNTC?BB==@AAB>72226:59FNORXVMFCAABDHMOJBABCBA?=>><>AACGKIA=?;8633436@IH>8>D>5451/23557:CJNNQSOJGFD@=<857<<;AF@8;<8=CCCDEDA>>@BJJ=A@?@EE@<=>=<>@>;?B>98766:ACBA@>:42112348<>=<:8646999866665532234334444447:99;==>:59<<;<;:<=<99:=@<:<=;:;:>>:776679;ESPE><<>@ACEHGC@@?=:79<;;;966657::844459=:2:FA:85345:<985/-1442333677852333321236:;<=====>>?AAA?7,),..1430-+*/7BOVZ]R80@GGFFEC>81/..10.-----.4993-,-/18=:7;<;;:6437:74/.4764368//4279?D;/3:75=>75772-.15:3*+158;=BEDHMF::<:6454432113/79?hU>17<32:=?==;654346794.(5XF084@LQUOH8NbhiM<50;JI?5,)*-.-,+***/3488IG1=ACEEFA9996655444554435678764112443345:9641////13.*+.--/25407FI>46=AC>9;=845557778WUSNJHGEDDCCCBBDFIKMOQOOQTSRRRQQPONNKGIKJIJLLKKMMKHGFFFGFEFHFJX`Z[_d_VTPIJMMOQUY\_bcdca___`bceggffeddc]TNMMJHECAA@@@BCDCEHKLLMPSSSSUVUUVWYZZZYYZ]_^_abb_YQF@?>>?@A@AAA@??@BCCCDEFFFGEA?<:;=>=<<:;>?>>>>??>>>?@BCDEIORW^ZTYcggieXSYI>JNJGFHGEEDDCDDDEFGIKJKNPPNKHIOamkghkqpigklmmklqseJCBI}d[XQNORUZbhc{rehYNh~bZ]dhe}XXsk]m|iOGcSU[TNFDFHKNOOOPOMTMFOhsuttwskecdc_efSNP[bpbS]mtuqjf`[UTNCDIKIJHFEKLGFGCAFECBA@?>?BDGMSRMHP_\]lVULDB??EC@@@@@?>??@CD@>?@ABCCCBBBBBACGDDKQPLJLOOOOOPQTVUUWXXWUWZ\[\`\KJOJHIIJKJKMNRZ[amyulbYPHEADDJJHQ]\ODDGFCGEDCEFH@EQVYZTMKGC@@BB>;:=DOQTa^M@?EScnry|qXTbR><<:<=>>==:;BKOOKA<@HMOKCA>==>:;=>=>@>===>?@?>??>>@@BKUWNC><;<@@>9<@:2/.//13322110024653452162--3?EB?8668:=?=ALLG?<99765;?@=ITWXXXVUUWWTPMMNPLFCABFKPQNIMOPJ??LG3)**(*.131--.035553456?KNMPQPPYbjkVLPQZf`@33318?DEKRUQIFCDHSoo]EBZ]FQkvuh[Z`dffgghnlda^[\]bjcJ89=>==:7=;B>;Kellhiovwupi`_f_NEDKTRE56AZ]K@EG=@E@?A<6DMH;:?A;8:==AEB9333229DKMMNNJE@>>>@EMTTMC?@?<=BC@==>?ADEHMJA>>;7313569CIB9;A@7333234752:JQNNPPMIHJF8279::;?@<:835975=FHIKKHC@@CCF?8:@>;:;=;;H^jhc_[Y\[RKJIJJHEEGIE<967:>>>>>CC=:<<<>DE=>KL=7:99<<=>>>>===;977889;>>=<;97666566666665444545689;=<;;=>===><89:;<;<;::<>=;8:?GLKKMMJE?;BA?;643467876523:=5,7KF978:9====?ABCC=403:8/14.)*,+*28:@GH:,4?<::<:8863200/-.-----.1484+*158;97<@98:8655553./5612105921437>948:2./03661,-0225;BD9@QJ98=AA:888::;?HEFCF^ME;5953;>==@:52144675/,'IS:99@UcgheZIZjjkQ-6KZ[RJ7.6>>81+(*.0-+))+-/247;AozH-/568;<=<6566667788877655664/-.011223546<;620374.+++,02/../22.09;43:>?<769:9899:;;>DRRQLJHFEEEDDDCDFGIKMPPOORTTSRRRQOOOMIGHGGGGGHHHHHIIHHHGGFEGFDIONJNSULDIMKJKMNQVZ]_`adec`^^`bcdeeffffdec^WOIIJHECA@??@BCCFJKJJNQSTUWWTRSSTTX]\XX]_^_`acecca_XLC@>??>==<=?@ADEEEEFFFFHHEA?<<===<<;<=>>>>????>>>?ACDEHHJOXWNKSbloqlfgZGKPKDFHGFFEDDCCCEGHHIIJNW[SJFL_nbW^iola`lpmmmnnnrvcG?HaoY[VPNRVZ`fk~yi_a[Wma_[beeYdfVVs~fFMl|oVXWSQIEEGKLLLMMLMOKEXtwyukhffdealtcZT\_nj`koqtsng^UQPHCFIIIKGBISQINSGABDDCBA?=>BCEJNPNJLPRdiW\XJA=>A@@CB@@ABBABDGEBBDCCCDDDCCCBBAACBAHPMJMOONMNOQTVTUXWROORWY[\ab[adZMFDFHJLORSUWY`qlVZUF?=?JIJT^T>3>>?>=<:?FLOMF<9?>?=<=<<=>>>>?@A????@@?>@ABHMLE??><>@?>>HORopC=DG6gľlmswxpic]Z]a_\ZXVX[YcmljfddbmlSayk]XO\yyryqjprr|sxP̯xrokjihedb`^[ZXWURONKFEDB@YTROB@s}xqo_X\[YYYXUSSSSSSOORRPONMJGEEFDDD@?D:7;??<:?@:1/.//13433223358777640+//1//3?DEB@AFIMRSRRROICA?;;;<>B0/,*/31476:;;89754679=ADCFVZNJUcfb\_daeW7426;EZgaZXMB;ADILSotY70BHEcvupaV[bciooomgbfmfUOTX_cXB69>==?@C@E;CA=>FRC;;946:@@=???@BB@>3@XP=:DCDC<=B=2123359::=B?614668=CGHFDDFDCCDDEJNQPLC>AB;5=HG@=<<=AB?GNF>@>99?A><;>FIE?;;;73369:;;;ANPMOONKIGB;4/26:=@FC6047771.>NQPRUQJEBFJLF?=@>;9<@>8889>@@>?AA=IYN<=C=9<<<@@<9:9<@AA?=9788899:9865655799889876545679@?>=968:;<;879<@@;447;BGKNLIE?;;<;<>?><::;>?=;;<8687?FEAACB949<>?BEGHHB;;>?>BGC=;8533455431/1781)7LE59BFEB>732027<=91/3689:976777776677315;=;<<=?@AA@@?=@C<331*)1::1269<606?=7777641/./2:<4-//079.3716<>?EE78>?9219:/+012002./1337<@>2;OL849FE:<<<=AGLRQVVVSCBB;:957:::;51./6557/,,2[H7;5YiiijeYW_gik`=9?Zea[I9234650++12.,++,./138;>C>3124323321455643469:;975555410049;9538<88@C91/25520/./485/-./0022106=>;86777:??@@ABCGONLJHGFFFFEEEDDFGIKOPPQQRUUSSRQQQOMKIHFEEFEFGIIIIJIIIHIGFFFDCFGCBCFEBAEHJKKLNQVZ]^^aegf`][^bcccdefffedbba[PHGFDBAA@@?@ADGHFHLQQPRUWQKLOONOU[ZXZ^aabbacefb`cbXNF@>>==>?@CEFEFFFEFFFFGIHDCA>=<<<<<=>>>????@@>>>?ABDDEFGJTWOKKUdihjebjgZRNDCKIGGFEEEDDEGHHHGIMX[SNIVi_KShoi\]lsomnoqrqqwq`RKKcxp]XTRSUV]_fnZ_`^]\j_YU`ceYolYkve`T]nwiOSQOSPECGKMLNOOJKSTWr~y|~korkeajiexeZPZfyypwyxxvnc^UPNECHJIHKGEQXVQ]XB@HGEFGDA?ADEEFLRQNLKEagW]\P?<=?@@@@?@DGECCEGHFDDCDCBBBCDDEDDCDC>CKKJJKKKJKNQTUSSTPIHKOUW[Y]cmzveRC<:;BLNQQRSUWathYlvbG8=KKNWVE66COMLNG@SaTHWggcbYMFBCGKLKD?SaOPqsWFEA79LSPXVcvsZLW^``^ZWRMNNHTdnYFCA@@ACEHJKMOPRSUUVWXYZZZ[[[ZZYZ[[[Y\]]_aaaa__``_^_`a\J;8<=?DC@>@BBCCEHLNNHCCFDBDMY[TJDHOQJEEEECA@>=<<>@@@ABDBAABB@??AABBDBA???@BB@FJQRSomH>I;Xporxypgda][\ZYXWXZZXWX^ij`^[X[jfWdh]SO^xujp}|jlsn|yռշxyxutplkligc`]ZXWUQONLMKFCDC>ZXJPBS{oh\Z`]YYYVUUSSQSSPPTTNMONLIGGEEGB?AD858;<<FGHHJNQTWUUSQOKHD@<><:ACK[USVYTSSQPONLJF>547;=@ELNOMMRY]UNI@558?GNJ?E=8IMJ>233576778:<:>NO@C@BEJ?H>A=?DF>:7447;<628<=>><:657=Nirhbgmnid^_dbYRPNLI;7@=78AB?AABDFFC;3/011236:<:998314;??<=CGD>@GGGGJKJLOMKHFAAD@41?LLC=87:>9>FB>?<9=HMJGGFFHIE>:;;634:=AABDHMNPNGEIF:431138?FE<216972,/@NSUYZUOKDHW[URRMHD><<98CDCCDE@63:AA===<===FPJ@@A=;;;=A?;9635=BEE@:8664567789;:768;:87888788888:;=?AGKF>=>><;956::879?CB@?<538;>FKLKIE?::<968;=?@@@AA>;>@@??><<;989;8479<;<>B>?HJB?DHGGC<99764344321114420:G>6>GIF>7671/479>?756777666789:;;:;;:845558;:<=>?@?AB@?>=;7/-4:?>538<=AECB?;::::=81.1455882+,-...-,--3AGA70089544331/,,,.7C?1,./0;:(/67<=>=<<=BB@91-45.-01/-/..116:;;952>EG7,5A959<@AFKLLS^]kZI@BB?>=:975200114537340JY=57/Sca_^UMQVY]jiQXX\]^cYE:9::92+-54---,--/247:<9677456554436;;97414:;;84244325<@BDB@<:>?=:=@;7754541/.024410211342./9@A><=;9:?A?BGJJJGLJIIGGFFFFEEEDFGHIMQQQQQRTTTSRSRQOLJJHEEEEEEFHHHIIIIIHHGEEEDCDDBBAAABDDDEFHKNQVXXY\`acca[Y^accbceegggfcbca\SIBAAA@@@?@ACBABHPROMMPMFFJKGELTVVVW[`b`acfd]TQTWSLEB@??BDDEEFGFFFFFFFFFGIIIFCAAB?<;:<==>??>?@?>>=>@@ABDFHIOWXWRPY\OIV`b`]SNLLLIHHHGFFEDFJJIIHJMUVSRPVaMG_mbXWhrnnppqqrrqrqpnYDCa|fZXUSSP_\]~nU^_a`\oaRKP_beXm}w|\\^bduiJIIFMWPDBHNTY\^SO^_f}{z}hm~{vknpZXc`XMXdqzvruqwzmeldXODBJLJHJGFW]]ZbbPYlQDIKGDABFFFEGOSVYQD_dW[XN@<=?>>>?ABEGFEEEFGGEDDCDFFEEEEFHJLKHFGIJJHHGIJLMPRSOKKHCDIMRV[Z[`a`aTND<;;;JTRRSTSOTbsoWTqtT=?NMOSOLLMQRNKJED\dMH_gabaYLB@JQLGJMC>bp_^SC>A?9IWO_mZT\cgkb[WJ[vsf^UORVUPT`WPIDAABCEHJKMNPRSUVVVWXZZY[[[[YYZ[[ZY[___``````aa_^^a`P=:?@CEIF@?AA@@ADGOTQKHDDCA>AINMFCCEIHFECBA>=<;=>>ADEFGHE=99987MVAGVRE@=@@ACC@<=@CDDCCCCAABABAA@@@@@BCD@GMWSSomLC@Gż~zyz~|mb][ZYVUVXYWURRU\fjcYZ[Z\]a]Zh\TQ_vm}czwzfftnpğ}rsrsromnlhd_\YUTTQMKJIIIFDCC8T]IMIs|nf\[_]ZYYSSWQRQWSSVYWLMRNMLJHEFF?ADC237:<<>?<85322253/00147:=;987666456764018?FKKKKLNQSUUSQQNJFCD?757@ADINPOMPW^\TL<,-6;GOG?B?=INJ>344699986:C>8AMI:Jchfkreg[748@<2239EI92123;C@`mIA;8A?]qtqldSINJHWmgew{zyjTPSQPH=<=<<==DMMBH@?99;EIDINNPC97116;?@ABBCBJ^nokkqruunccjld[XTPNE<9;<=ABAAADGF@:61/2567879:7569<85=C?;=DJE>BJKHGKNJJMLGEGC>?>7/2AMLB957:9899:<98:AEGIIIIGFGIG@<:635:7657:7327BJOSXXTRPJM[babddbZJ>=;:7/6Wonmqleb]UNLKF;46<;9AGHFFFFD?<>A=54:=<;<;:==:8:=<:97666666<::988789;><:;:7323479;>AAACCA><=?CA<;;;;;7569:66;DHD>>>;6>GGFHHFEC=8:=:677:@DFFC>;ADE@::=:32537@@:<>:665468:::;;<@A=846522789;>@@@>==:;>?8236741466319EA567788771-/4554794-.00//,+-2;BB:0/551131/-+,++,,1<<1...1<<&+.2>?>=;6=HG?74--..0//.57,+0169533/3>>:4.3:5227?@CIHGRVPdSVCBB;>DA>71./2554415958\I03/+7Xed][WWYVSgxOP`]XY\TD>>>><3.480**++,-/1469865553587669;<=<<;:77<:85425659AFJIEB@<:>?<>>?>>=<=>?@@BDGGHQ^a\[\XRGAOTKNLENSLGHGGFFFEDFIIHJLMNSYUPQSUIJ^fUOZcchttqqrrrppqsuqYCGfqf^XPMN[bkx`^^^\\xEIEM`bc~Xi{phecjeFKHBFUWG@GQ]cgjgXZ^bojnul]fk_ck}JSwIXZQY]\fc_]QawoqweSCCJLJIJGC\h``dnp~YDJKHEABFIIHEIQXb\NhcVZTMC>=?@CEDDGFFFFFFFFFECDCGMMIGFEGIJMLKKKJJJJIIKMNOQPPJDDFEEFJOSZ^_`ZJJJIKLJICJSQPRVYTQTVUMP_c`WKDQPJJKV_^YRPJMLJ[\FOdfdgf[LBFZ[E=@F?:Pt`@8>=@@ACEDEEGE>::69`|]akc[VTTTTROPQRQQF?BDCDEEB@BA@@ABBABDDBDIVQRmmMC:ʷ}ywz~}h_[YYWUTVXZVRSX_\ZZXXZ[YY\\[U]_RQ_tg}my{ubdv~irǵƮrnpssnmmmc`]ZXVSSSQNLIGJJHECB9P^KHcunh]\]ZXUTOQYPSV_SU[]WINTNONMIGFC=CI?,38=>>?68?:89<>;5.../2677666545523578831326?DKOQPPRSTSRQQOMKKKC93.1FXZWRQQMJHIF<317;-,-2:99>DLLJG<9536;@?=@KSPNLNULHT_gvlVIC547@CCBCHPB84344>D7@DA?ACFFACKJAAJNIDEFEFHE?:88516FQLB<8:::63468:=>?@BBDGFDCEHF@==98;>>>>;=B@;>DEDB?@A?:6556<:59=<;=@CFILQSONONTYZ^cdgki]QKKMNH?Rloonnf^YSNLLF;8>?85<@ABDDDDEEB>;98=><<=<:97778:;=A?6/037=ADEGHIJJHD@=>>??=<;:9856799979<===@?9?KLIGFC?;98:::8889=;;;::;?@AA@;557841:@@@A<8>A=:;98=A=:>?:665569;;;<;<@B>76=B=:966:<==><<;:755540.,,.6:4**2:838656753-1<<7555760-.0//--/6:851.0541452-+**+*,+*1740./1<;110*08;><7;CG?860,,11-,0C>,)+/561/2337:566287/-1295//2677740550F^:13../>Qa`db]][XcsXShi_VMIC=<;>;22:8,))**,./1357895456898659>>;;=>=;;=974427<>FLMLIEB<9=<::9;;>=87877:>=84348830///027=ADEHF@?A=8?JNKE<7HHGGGGGFFFFEEFFHKNQQPQSUVWXWUTSRPNLJHGEEEEDEEEFFGHHHHHGEEEDDDCCCCBBABABBDHMPNNPUYZ\^^^][\]]^`bdeffgjkkjgb]\^]WKDBA@>?@@ACCFKKGEDDCBDEEDA?AFJIEDJKGDEFEA==>>ACCBDGHEBABEGFEEEEFFFFEEFFFIJHC?ACA==;;====>==>>=<=>>??ACEEDHVdh^UWZZQJEAFLQWUIGJHHGGFFEEFEEILMNQWZUUUPDIXZONTT^rvqrrrrrrqqsusmdKDgufXTPLT[Te~ya]]\ZXIECK\da|Yiw}|va`r[EOKKMPQNKQU[`efgWQUYaba]YWXRFFKghES{\L[TOWWY^JHKBQqtzsdTDCJKIJIGC]n_fqtrlmUGIIGD@@DMMMKKSZ^]GmbSYZRF>>ABJOIHJGEEEDEEFEDDCCGLKFDHIHHIKKJMLLKJJJJMQQPPOMHEEGIHGHNSVZ^^_SGGIR`]XWRNMNQV^a]XWURMRJKJIFLPKKHFNNEIOKQJH\UFYfeeff[JCPbU>:==;;TiT=?EGJFDP\_WKMUSKOXcijdR^aX^RJKIKTZUOQRG@CDEGHILMNPQRTVVVWWXYZZZZYZY[\\YWY\_``aa`acdb_^``MBDLPNJIC>>>>=?BCBCKOGEIKHDA@BDGGFFGCADB>?CEEEFHCDDEEEEEGHA?FGSnzmcab[[[ZZZ[YWOBKcoY=>GHHGDBA@?>@BBABDEDEETPRjmJ4pȨ{upt~tf`^\YWUUTSQSX[^ZUV[^daZ^``]YVOgSUeug|lyj_ewr|Ĺѿwmkrwqijke]ZZYWVURQONLIGHJKFCA;K_LL}~tlf^]]ZVOOMO[MWZgUTafVGPUQTNLKGFB>IF9.49@BA<2@F=>?AB:54576787677665410/24543.,++.2;856>CBBHOSV]ZSWSF9KprM74445:HVVRJB=965459@A===@CCBBBC@:2/2338:;8996457=C@;?ABA@???>?@;8@IJFCABDGHF@967866BOQKE=9:;95126?FFFDCB@@BB?99AC@ABB@?>@A:4548@GGDAAEGID>;;<;54;=;>CCCDFGHJIFEHNMJOTZ^bee`XQV^^]_iqpkni[SQQPLEBED:38===>@@@?@CCABEFB==@CC>:99;:6227<855566?DFCA@><<;86666569>DC;77=>>==?>:9986568888548;=>?<99::99:<>>>;97778:<;6245459:78;::99>?@74>>BFC<9;<:865589;=>>=;9<>=?FE@B>54899;;==<940031.,+/479610/-/3866;><81:C>6785451.-./12135420-.0465895331**+,,+.450//0:678B6)0:=:=ACD?951//1/,+3I8'(),131025455563142.1/).7@LGL_ZOMRK@DC;9775425987654632[N6::731+>TXZYUUZccY_kj]PB:97669>=:988996568:>=@GMPOKEDGA87EKFB@=AHGGGFGFFFEFGGFGILOLGJRUUWZZWUTSQNKIJHFEEEDDCCDDEFFFGFGFEEDCDDDCBBBBABBACDGGGFLX\\Z]aa[VW[]]_abcdfghkkkjhgb[Z\]WLDC@@@@?@BCCDCCBBABCDCCDB>>@AA??@@>>=<=>>>??@ABDGIGB@BFGEEFFFFGGHHGFEEEHJKHB<=?>;;;<<===<<==<;<>>>@ABBBCEJTbtgOU_^TFBCHXdXLOOGHHIHGEFFDDGGIMQS\_^VIDKSNIKLSeqooqrrrrrqqrroqtcEP{ycYZJN[ANasx^V^__S{XCCHYe^zXgw|{sX^tYGQOMMOPRTYWTUWXWTNPW[YURQNQNDB>DOARy]OZRITTXcKAEBXywpdTOIBDIJHHIGCUbhx~mXDGKIGEDBA@FMQSTTTUUS@kbQW\XH?@BBGKHHHFEDBCCDDBBAAACCB@@DGGHGGGGKLKKKKIILOPONMMJGHJJJIILTXWTU_^NIKP]dfhbRLOSTX]ciolbTQJHDA@CLQRH;>C@HLOSIG]]Q[eb_\VRHJ\\MCBBB?>HOIFHKLMJGT[MGP]ioqk^ZSKZaULP^HCORMMLIBBIECCDFHHJMMNPRSTUVWXYYZZZZZZZY[\\ZXZ]```aa`acdb_^`\HCKRQNMJ@<>><<>?@@DID9>?ACDFHIGIMHFHEGIQVQOP]qsvkqtudVSPOPRTZZTB:TrF@KJGFC?>>>@BBBDEFGHFUOSfnACλ}xsv}qgb`]YXXVTNJP[]ZSSY^_[alha_[Y`S`jeko¦qky[djt{pyȼǩ{ppntukefd_\[[YWVURNKHFEEEGMDBA=D]P^znf`_^]WNOLL^I^^kXRgpXKSUU_MIMGG?BO@236=CC?6:PF;A=9667;?ACCBAACCBB>:71/256673-++++-2@NRQOPRUWX]ZTQPPPNNK<40GRSMIIE<20357;<>ACFHILQTQOU[XMLUS9)-422HVMIA966547>CCDFEN]c^[[ZVGThI044455===@DDCCBA?<62214<>:8:964467>FC??@ABCA=:;604AFDFHCBEGHHA85788;9;GONNJHDA?AAA<9>CBBDEEFFFF=415727=:69?AABFHGEB?=>?@BGO[acefiaSQVK>AOfkipof]OKOJB@FH>7=B@>>><;:;?@BDHGC??ACC@<99:;9668<986545>FFCB@??=<96567778<<>????=98:9547766:;98:<==;88>FLLJFD?977523566458988:::888:;738<<=?>;98888:;:88;=:77765665328<<>>859;8658>?>>B=67;?A>:?EHIA76999649;9;=??>;88<>?B93786665689;===;88866413876:>;1++.643:=?;762341-,-.:F-'),-)(-/12441.-28535844;GSYT]aSUXXNCFJGC<67:6::87779:7Ic::<<:630RPHHLMOUcg[ZYI91/0479:;;97774.,++*,./1236;><;9:<<;87787544455554320.19ADECBDD=9A@77>BBDDDB=7445548:768:<>DHKLKKMSUPICCD>7;GC?KROUGGGGFFFFFEGHHGHILMEAHTVWZ\ZVSQQOMJIIGFEEDDDDCBCDDDEEEEEEDCDEDDBBCBBBBBBBBCCCIV^YST[\UOQUUUY^a`ceghjlllkkjhb\\[WQMHE@?@?@AAAABBBBBBCCCBCB????>>>=>>==>>>?@@@@?ACEB>?GLKE@BFGFGHHJKJHFFGGIKNI?;<=<<;:;=<;<<<=<;<>>@ABBAACEFGH^vcVSONJHCAJY[XYUJHHHHGFFFEDEEGLQPWmzdKMNOMKLOV^_elopqqrrqrpnrpjnhUhu`]NLwO]`]cXP[\XSy^CEIW`ZwTepy~|]_t}VHQPNLNPRTUUUTRRRVQMX_THRSJHHDDEDF9WaGKLHSY`fLADG]maRE?BBAFJJIHIG@JbWD?@DDCCB@@CGKNRUVXTOK9iaQVX[OA=?@ELKFCEG@AEIECDA?@@@?>><=ADGFEEEJNKLNMIGJMMMMLOPMIKKKKJJNRQLL]eUMPKP`ekn[GIQSTP\rz}{iZPIEDAESRNLNWZ[WJORKHZeb_^^YLFKOY^VLLLKIE=8@FIIGJOLPLFJMV_ceghgby|]GDAAACFORUWR@Ix|QFHEFHC@>=?ABCEFHJJJTOScm=ũ}y|oea`^\[ZWRLKQUVTSSUXWUTPKLY^Umm\~~t{ĸo}mTnmwvwyƴǪ}~uosrpsnhd`^]]][YXVSQLHDBACBELA@A@@SZspfbba_XQSPKbHchnYQhu]TXU[fMKPMK?HP;177CEA76IRB=>9347:=>>=?@@DGGHHFC>645779;<6/.----4DMKJIIHLKRXWUQOQPPPKIIKWSKIE;2.0357;<=?BGHHJNSSNQ[ZQORYD*+0-)07555431237=ACDAFYhgadggf_YA:=85455>MMIHE@<98888:@CQgrgI4C[YNMPSSNQSOM`hL5ALUWGB?;E\\NNR^lku|86CHJM]pvvkG/203Ml{e\knX::CBBB@??@BDEEB@?;53318B?989753115>GE?>AEHIJGA9328BEDJMDAGIIIC95668=GNNQOC:<;724:BKKC>?BEHGCBBBBEJOQIA?>=>@?EQ\`jkif\SQQA:68OkttttnR@EE@:@;9:;>????AAA@@@A@<:99<>=:99999646>BA>>@CC?>:76669:9B=>@AABA?==>?==:889CNNJJHA:7743676654787887767:<:65:=??>>;:99768=>=:AB;9;:?C:5;=>B>5379755>@9;?>>>==<98641.1667745569;<>?>>??>9325447567:51357889:7872//0/./-./0.)+.///0322239BFC=52/+*,,./0356862/69674*5BFBA;10563++05CI9:75,'&,00132/,-;GCB@?CC:;FA=?DFDBB?:767753378768;>=>>>>>??>?@@????@@??DKID@ACEGGIJKMMMKKIJJIKOOH?:;<<::;<<:;;:;;;==>@@BDCCCDDFCCTZ\SFEJHDA@AKQXVMJIHHGGFFFDDDFJOQQf\]\VUUSRSQTcmnlnrssrspnsqkmri^qu[[YXdlVQQOYXPQu\CILU\XyPenxpetzNFOLLOOONOOR[\XUV\XR[bUELMHFDCCCBC<[dMFAFW`oqK?DFRKDAA@CDCFIJJGJI?I{fD?BA?>?AA?@CHIHHJMSRNI=88EGEEEEJNKLNPLCCGJJLMNRSMIIKKKKJJJIHUf[MOKJSS`slVNTYVTcyyk^YZQHEHQZOWeptlkYMXSLIR]a[X^ZJILOSOQRRSUQF>:JKGC=:;;=?AACFHIKMOPPRTVXYYY[[Z[[[\]][[[[[[Z]`aaaa``bbb`^WLLJKROLMNMLJIFDA>?BFGD@>><:;=@AAAACEJLSaokR=;AINHDFKKHJT]lngaTJD=AO}M<9>?ABDEGIJMRYJA^~]OX^grgF=?@ABEGIJKKUORfeX˼{ma]_ab`ZUPMOOOPQRONPPQQRODTcTvk{ŷszyh`ysmyţҺ~|qlqsqpojfb_\]^^\YXUQMKGC@?@BDJC<@B?@V~pfdfca[VWYLdMipoYRkxb]^V_iSRRSQCOM@79=FC?9EQH@>757;<>;98530035679>>:6455667995100013@@=;;97:66>GRWVUUSSSRPMQOIE;1./1558;<=?AFJHIMQSPNY^XUUYN1,10..4988654436<@A=P_ZECGEMi{bQII`ZLoG13:<]jT>GOKIID?=?@CFGD@<72102=:@GHGGJORRI=>BB@AA@@BCCBBBDGNL@:;<@B@98513:<:@IJFKQTX\][VNHGR[SD=?ACEFBDEMIX^UNGCCD?:;6Agylkvy[AABA95:@CB>:;DEA><<>@@>=?@@@AA@A@:8;=@@;778987679<><;CHC>=;8689;;;:48BEC?<<=AED@==<:9=HMHDA=:88657<:43455567777877779:=BC?=:::975:DG?77;>>;:97:=92136;@;8@D@;99=A@@B@==:9@=23632233357767?A;>>>?=7531213878:88557889:=ABB?622105;=<:;>?<62//379999972121012115?@70....11//05>AA@>=>=7-*.0/1458=A<./74312CLIA?71661-*.48AC??II:8534434558=CHJIGEPdkkjjjea][ZTXNLJGHHA75440.//4<=Hc<7899AB?:8::0)+,-.//01225973147:;88876>>????@@@@???>>?@DGC??CEFILMNOOOPOOMMMKLNOPJ?::;;;;;;::::;;<<<>??ADDDDDEFGGCFPOGEFCCCA??CILKJIIIGFFEEFEEGIMQPYrgf[]][UPNWhngfmtsrrrqpqronopmq}zebiWWiZWQMV^ZSy\CHNSYXRfs|xntpHDGJQSROLJLNW_]YW\\WXWTJGGFEECCB@A?TmlcUEJZgyxL@EEDB@ABABCBDHJJHGC>D}WA?@B?=<=?@@@BFHFCBBGHKH=sYOUWPX\MBCEDGIBDGLGDFKKHA@BCDC@?=>?AEEEEEIMKIHHJFDCCEHIJOSSMIKLMMLKNQOQa`OHDBCB]|}ui`YU^myrbicjkZLLX^Qn}sqVXbPKMPQKHNZUONMQTQRVUYc\E>=;:;?DA>>@CFIPYUIB>;>FJIEB?@Tjne_WOF;78:95RpH7=?CEFFIJJKJGCN[Q=RzxbRP^ofF>@ABCEGHIISPQh^ɵxi^^afgcZSPPPNLKLLLLMV`fj^JVify}txd~x~}|ƿwptwvrnjeb_^]]^^[WVSOKHFC??>AGKIB?AB6Q}ndjkedc]Z[N`QnymWTpyc`bYahZXRWSJVOKA?CIJHJPUTMS_\YXYW9+1832;>?=9;:747AFE=@UinotqoliN4JdmWL83HVI@@@?>><;:767=CLRTQJ>:KVNN]jh]JCczuaOA:CR_^TJHORSQOMMLGDGFJV`VC>DED]nQLGQV9BeT<378>Ha{xiWZ\E;KmpJ9:DICBILLLKGCAABEGIIB834643=D<137:9;DC94589:>BFHIKKE;8=DKLKIC?CIGGKICBD?89AKLKHEEC?>>>=BB@@<<@DDBAA>=@JLIA==?A?;843=EFDHSVPLPW^accebPCQ]N><@DGHHGHHH:999647::89KWPUkxbLIG@88;>A@??BFJIC=?@;668::8666:>;8BE?:998:;><;;8:AA?AA;=AB@?>;;=@@@AADGB;:;<=958BFE@=>?ABB@>>=976;DD?;99;=:77:820245555664444457:>AC@;::9:;;?HG?;;;;;<;99;?;229::=AFJF>855:?ABA@?>98:733222123333467ACC>669437869::>>713467988:;977763245667DJG9000,+---09<76;ADFGC5+02/1443:G>,)3310;JQOD=8;?90+-00/10,0LYVWG<776:9=FIB>DGKRbc^bmkmrvofgSRNLJBBEH:470-/..4?:bO553334=1JT:<71036768:==CB4-0469;;933;B8)*+,-//12/04662..279877779BGA<<;8410004556?EHLI<;JPLIHHIGB?@@><95579;=????>==;=DGFFFDHNONLHDDIOVcgbGGGFGGGGGGFGGGGHIHGJPSV[__ad\PJIGEDDEEEDDEDCCCBBBBCDDDCDDDDDDDCCDCCCBCBABCBDCBDEDCCDFGDABKRTNKS]bcgjihged`]_^YXSLNPEBBBBABCCCCCCCCCDCBBBBBBB@>===>>>??@@@@@@???>>>@B@??AELPNNQSRRRSQQQQPOOPSSI@<;;;;;::::::;;;<>>>?BDDDDDDGJFFIJJHECDCBCBA@CIJJJJIHHGFFFFGHKNSTdqcdbO[faXTSV`b^bmspqsolnoqppqqqqpsujeZR^Z_SLQbgY\DFNRVYWfp~uqsmT?BNUUURMJLMKTXXXWZYSMKJIGEECCB@@?=Vu|pbVU]hzuLBFDDEEB@>@A?FKKJID<>=TXA;?@@><;<>@@@@CFFEBADELF;uTHNQIHRUL@?@@EBCENHCCNQI@?AAA@>?>?@BEDCDEINKFA>GOI@@CECEKQXWOLNNNPQW^]U[aUG?@A=\}j`VQTXWZagpwegxoWOU_WouxlSc`KLHF?7?HNLLMNee_VSWbk[@;BDBACFHKV[NRm~ofmpkligpaJNPLG>=>??AGJGEDEEGKS]]QID>=ADEFEKc`RKEBDGGC?>=B:;=@EKNN@?C9Zmhqogkl]W]R[[n}lWXsxhbd]be][TXURZVUHDKLBFHJID<0.4;>A@@>>;622/,--.0332445556766788874239==<<=;72.-/5AEHHJMRTNNXYYXX\H-'346;:<:@>;;<=<8579<=EOTRH>=@Lj^Fb~pdSQe|}hRNSSNHDA@CDFJNW]VI?>@DViVCFECTM;:6Lxsc[PG@MipW?:@<66;@ADKMJIHGGHHHJIE818?;457523687=LRF8379=BEEFE@>??==?CFFEB>?FFDJPOMJD<=GMMHFHGGIF<5357?DBA?@BEEFD@<=ADCA@>?ACDB@CC;8===><:9:<<97579:67<=;:9;<=>=:963=GC>??=?A@?><:;=@AAAABB=78<=;977>DE@=;7569@B?:78<@>;9764223345555423557:?BA?<;<<<=ABABB@@A=77;=;999847:99;BHID<63258;;:87664158643342037:<;866788721356741348<==<;:879<@BDE@>AA<7434687<=5.2:<:635;;8799853576668::82231//0/0588:>BFG@=4,14204302EE8)/31.2;A@>88>@=:860,*-++/DT`eOAD9>???9650//0009E`8559997=2UI276227:;=718>BB>;?<95/-/14433?EIIJKLRXWSNHFKRV\dktFGFFFGFFGGFGGGGGGGHILLOVZWW^]RJGECCDDDDDDDDEEDDDDBBDDEEEEFEGIIJLNKGGEDCBCDCDBBCCDCCDDDA@AFKKHHMPPRW[YSRSRPMOX]WQLHKJCCCBBABCBCCDCDDDDDDDDDDCB@>==>>>>>>>?@?@??>>?>>@???BFLNLPTUTTUUTSTUTRPOTVQJC=9:<:899:9:;<<<<==>ACCDDDDFIHFHIJIHGHFFEDFFFHJKKJJIIIGGGGGIKMQUYUEMTDQjcYZWUSUUalrmpvmfjjoroppppoqwsdYMTXbUONYhaaHDOQVYpSml|vorsjBCTVSQPLLOPHHQXXNLPJLNJFFCDBAA@A?=bri[VYczxN@DEEEHIHEEHBEKKIJFAEE@@@>=<<=?@@ACFGGFEJPRG>wTGJIEBCGIHPKP[E>EGDCBLQLDA?AB>=?@ABBDCDEEINHDBHNSLAADHFEMT[_YQOONNW^ih]^aXL@>D?PpgG@DIOI@A@FPUOOXd^VV[MYpt_ZjVNK9338CGDGHHN^T]ZRWdeN8;BCBABDC@ENYl~~oXHVpywobbU::>FJGABBDNbqoe[MFGHIKMNPPPRSTUXYZ[\^^]^^_^\[[[[Z[[]adcba`_`bb[G>?@@?>BGGLUXYPPQNMJFCBA?==>@AENUQNMNNJHMQRSNH@>ABDFOYWGFFGHGGGEA>:;?@>ACCDGHFEGGFEEEHGGGOWKEjq[IP^cK?CDDDDDEFQNTXê{ugblqkgd_YRPRTOJGEEAIR\NEp{[at~˷ttmɺɸ|pmqtqkiea_]^\[[\YUQPMJGDC@?@??@HPND>?:_}pjromljZUcYXeq|hYYrynbaaec^YT[X[]XTJLONIHFDD=/,7>>@BBC><;9841/456799799::::;<=;<<<;99:;<<<<;<;<:871+-2EW[ZYTRQH7.0144689:;;=@BDFIJMNMMPUVUUXV:(2;<9444@FDDGNSTSQUp{vt]@BZk`FST]PDBC@A@HG:799<=<8678:89>BGKMCJs~[LTgpiesqVMQQMJFEFFDEGKZ\MHD?FOTWF>;=@=::=@BCGIHGFEEEFEFFC6/6=;8533454426FTOB@BBFIIEB?:;>@@A@;?IPNILQNE=<>?>><;BEEFHMRONSUU[dgg^H7798;GQOGGFFRdxoH?IHDEEC=<;;9759BFHT]WF85;>@@>?ACA<>@@@CEE?>@@ABCBA?=<<===>=<<=>><::;856::9:;<;;:::9516@B;:===<;==<:89<@BA@?BB=78<=<976;AB?<@A@AA@>=;879=@B@<98;@?<:7642224433788899=@CA@CEBA??@A@?==A?==;56;=;8547;;968<<<=;732477546<>;:88644357532343018;98535665643467974645:=>=;;:9;>@ADHHIHB?;2048988:810565425;;9899977887774214548@C>9668>FIFEGG:.//231/122.@@CC=9;83537265>FRYPJR5002454442..131,,,-./013479:<<963/26;;::;<;99=>;7412232119BDDEFMYZRLJJKKHJTTKD?:FJKQUVVZ[XPJLOQ\nqvFFFFFFFFFFGGGGGGGGGGFEHMNHDPZTIECBBDDDDDDCDDCCCCCBBDDFFGINORSSUVWRNKGEDDDDDCBBCBCCCBBAAACEHLRVSICEFGGFFGIIIKQVUROMJKE@BBABBBCCCDDDDDEEEEFFEEDA?>==>>>>>?????????@?>??@?ADDFMSSRTUVWVVVVVUSPQUVSK@;:9889877:<<<<<==>@BCDDDEGIIHIJJKKKKJIEEOTPKKKLLKKJJHGHHHIKMPT[\G9B@Nec[a_TPPQamlgnqebgdjpoooppqqstjq^NIQcUROSYgeMCLQWXnQusx{tmspkJETWQOONPRQKO[\VNIHJ^mfSEBDB@@AA???AGLJIIIOQQIA{VFGEEDDBGJVqi=BBBABCHPJC@@@>>?@ABBCCEEDFJFBDJLONCEIOOLRZahdVOQQQ[bnkfeaYOLB@?BKJB>@CDBB@>?<;>EHU\OMRF?`xj[jlOVL>LOIFIFFFKQLCU]\\]XC8>CCBAABB=:CcyugRB=C^v}n]\\UVROLGDA@BCKatthOFGGIKLOQPQQTVVXYZ[]^^^_^_^\\[[[\\[]adcb`^`aa_UF==>CGINOLKTSOHKLKKGDA@?<<=?AABNZWURPMKROJNONLEAAACKXXPJKPTPJFEFCA>>ABAACEDEGGDEDCCBAABEEKKPNFd{XIVcZFBDCDDEEFQPLhϵvofkzykca^YRPTVQJE@CFIV_aXpv}°ĴpstĻǸvmoutjefc]]]\[ZYYVROMJGECA@?@?>@@?>??@@BB@A?>???=?IG@<<;==<=??><=903NZXXUUVSL?50245799::=@?@EHHJLLMORSRRU[M;HHA8/16EJHKPTTRRSTsw]4/OfgPW[[YHCI;BPO<1589;=;87646;;9;ANUPhrcTII^qk_vlWMPQOMMKIHHDFCI\YFFI?JUPWbUCDUWOSF?>;<75Oulc`SD=BHFD@@?>>@CCDFHFEDEDDDCDB7/5;:?>?>;74304EQMIPQLJLLF:69CFABEA729AB@@EHGFKOPMJJLLLKKIFGFD>3/35:GOKIGDBDFECDC?@B?=BKOPOQRLC>@>;=BCCCCA==FLPW]YZdmcM>87755DTSK@>EUmsN=GKGKKA>=;;:8::<@FMQJ>5/35:>>>?@@?BDCCEGHFDBABBCCB@???====<;<=>>>>@?96:<;;<;9653578559;75;>>=;:;<:866=;;==><:;;:;??=:86421246129<<<==AFE;>FKLHB@BC?=9::877:><833:?=:89:97655569<=9547:9877522322442245448988645652464568::;:438=?>;;<;=?AAEMPNGAA@835:::68;3/0/0214;;:89::9::98997554317DNKEBACGKLMOPK;02421.--/3/2CM?322-.611GSLLSE1036@D?4337<=?N`]?OX]]hfI7UWNG<699;:<;<9=;.024443311.-032.-,---/1346;<:::;:106>?=<;:647<@?;75532101454:IRSSRMKNNMJHJSTLEA::<<;<=;:>FHD<=DCFT`[SY]XPKJGIc~FFFEFFFFFGFGIGFFGGGGEBDFDAAHPOIEDCDDEEEEDEGGGHGHECBDEGMNOQWWVUUUWUQNJFEDDEEDBBBBCCCCCBBEKPSW[^]UKGB@ACFHHHILNPRSQRSRMECCBCCCDDDEDEEEFFFFGGGGFDA@>==>>>>>????????@???@@@@?CLSTRPUYXWWYYWVXVSRWZXPGB>7799887:<<<<===>>?BCDEEGHHIJKKKKLLMKHFJW[YVMKLKJJJHHGHHHIKORW^J=DGO`_[baWQUXajf`\ZY`d``gmnnoppqssnml^NPZLKRPGWyiYONSYYpVsvkduhmug_KFQUROMNPPM[lp`TMEAPl|w^EBCB@@AB@=jtnTGPg~WJLC>BTYVVS`hXGILJGD??BBAABBBA?????@@BLPNLKKQPNGCTFFEEEKKLHDSoU?@AAA=CQQLGCA@>@BBBBBCEFFGGECDJMSQOOIU_OOYckp`RQWYU^hflia[Q[ZGBA?ABCBA@DBAAAA@AHKJSQGUYJKht]XiUGXRj}nPDEDFFHMD<@BBAABEF@8GiveNA>ABF`tm`ejgcf_LEECDEEDNbiaMFGIKMMPPQRSTVWYZ\\]__``_`_^\\\\\\[\`cca`__``^[XNGHPZjpnmonlUD?BBCCA@>>=;<>@@AMXWVSHCMTLFKMNLKEB?COYUPKNW\WOIHIECAAABABEECDEGFEDCBB@>?BESSGPPG^mFO[cQEDEEFFFDQPHǨznou~yja`]XQQWYRKGDIUT`szfrlr{nsxȿzqoswpged]Z[[YYXVUSOLJGECCB@ABA@===>?6348;>DEDCBCCCEGECB@AAAA?AMPJEBAA=<=?>=;?DCCQZYXUUVUUQD:64688:99@EHGHKLLOQRQRRZ]QMQB6/?FJMOOQRPOPRN[zm7(LliT]gkl_IH=CQUIGJB;>?<97637BDEJLOQO]kG>IHeztukZbhZZYRS_YKBFHCG?J]WAFI@KOBUkWJL_`ONNAM`U;6Da{vsrdNGONPIDC@@?@CAADEEEDCBCBBCB;=C=;?EFE?83426GTOKTXPLOPF93;=CECBB>::@MRW_a\\YM@:::;8;MXTPIIPXh{qTCEHGHIC>><;:8::@IKD@:300=?::=?@AABEFDEFGHIHDABBCCDFHGC=;;:99:;<==>>;879:;<=:5545688788879=??=;:;;:767:987997666559;?AADA?>=<;<=978<@AC@?<;87632257329;====AB96;DHKJBA@A?=:=A>:89::<>:634;>=>>;;<<86:=:;==;7337:9654222135863679:648:87553257567889;:648;<==>@?>BJPMB>?@;57<<845:41..0247;:999::;=<;=?<7561--5=BCGOPLHEHPVSI;76875333130.7EG:31..23;OXSX\H439:COE603595,Cie?8>??A=3.-.026BH?>We}oWZRPN919;:;<;;<665bL8OXU\ivmN:?U[TLD=;;:?=<;9536=@=8633210010--7JUUQPOORQMGIMNOJEA;8:;::;;;;>AA;<;4:L^\XYZWOHCCMhztppFFFFFFFFGGGGIHGGFGGGEB@BBBEGGIIGFDEFGGHIJKORTVUTPFEEEFIIKOUUUVVUTTRPMIGFFEECAAAABCEFFGGLSXY[\]^^[TNGBABDGGHKMNPSSRSVUPIEBDEEFFFGFGGGGIIIIIIIIFEB@?>=>>>>>????????????@@@@HPQOPSW[ZXZ\[YZYWVYYZ[VMHB:9::987:<<<<=<<==fujWNO_xmc\HAJVTPORY_[QKJKICBCDGGEDDDDEEDCBBBCMRRRQOPMKEF|ODEDEHQPMMG?8G\PAABA@?ITZ_UHDBDFCBAACEEEMLGDDDGQ]YXWMXfWKNYgql\SZdYV[Zmrb[S[eWOMHECABA@AA@?>??BMKAJdhossb\iYXXEDVYjFBCEIFDJCDQUMME>@BBA@@BEIH?9MigOCHNE85KiqorjPH]^JBCGKNOMNYYPJGHJLNOPPRRTUVXZ[\\]_`aba`_]\\\\]][[_bba`_``]YRNNMIMOW[`honsmD3:<>AA@?>===?@@BINOURCDRWTKGGHIKIC>BJOJKQTVWXURPOJEBAABBDFFCACGKHDCCBBAAAEDfcHMNCZWERa^MFHHHGGFRLSԷrkv{njd`\VQUZYQKHNRb^ey~d{quyuzpprvried_YY[YWVVTSQMIGFECDEBBGGIF8>OF?TKj|uxylwgaV]jRYrysef^hzvc`efbaWSb[caYVMJ[\XRJNEBNPG@BLPJ<=>>B>757;>DLNJHFGGHKNKFFDDDCCABHPSRPMD?;>?CFGHLLJNQQRTPPXWISB36PVORRPOONOPPNEScnpJ@^vUC`jme^VUFANdmfWHACA?=;:8=DILLLKMKI]vr^hlwp}zhXO]}o`ZbhZE?BHNRLM_XJGF?FG?RXMSPTSLBWMJiM4/7`|macZHKVTSRKD@>AAA@AB@BDDBABBCCCFLLB;<;=?=9766FOUPDC@ADDCBDEGFGGHKGBAFJIKPPIEGIIB<:>GKKPSQMLNMF>CGEEHC<53=IPOSWWN>=A>?CFEDDCBAFPUTU\a\H<=??=:=EPZZT]e^MFV[QIFDEBBEA?=;:9=GXa\N?601>PI:=EFCBCEDBCEFGIKLE??@@CGKLKD<9<<9888998877766:;::967799:99999::;==<::9:::;BDCA??A>;9<=AEEDEJE>;:99;:545798:;<;;9:6/1;?>FGB>;;<@CGHA<:<>CA@;658>?>@?>>?@>;?@98;876325887642344578538:>>617<9733236856677788769?>?><;:AEA879=;8;?A5058741036=<;999998:=??B@:422/,0;>73;JSNFFJMJD<6259<<=AA73322;DB920..8FPU\bQ75=E?FRL;427>;07SZ?8<@DA>?;8766:;:75>Jae[VBBD4/596566;=91F_38HKUev|pQ?FBKTUTF<=8@668871./0/./1/-,,,,.02358<;745:;857:<;=><;78:;73422100///..3?NVVTVUJA@DLPMKJEBBBA@@>;=@=335583,1@U[WX[XOIJQ]ccXTcGFFFFFGGGGGHHHHHGGGFECB@ADFEEGGGFEGGHJLNOQVZ\]]\YOHFFDBBFOUVVVVVUUUSPMJIHFECAAAACDGIJJKNQTW\\[\^][YSHA?ADEEFHJKLLKJNRNIECDEDFGGHHHHHIJKKKKKKLKIEB@?>>>>>????????????@??ACGGEHPX\[[]`\X[]YX\]ZZ][SKE<:;;:879::;;;<<<=>=@CDEFGGHHIIHGIKMPPOKINZ`PDKLGFHHHHHHIJIJLPZXSa_KKZ_X\cbbba`Z`s{r^QKJT[_cefiooqmpruuoh`NDJITbRRPT[\jYp}s\}q`}kDF@DNYZMIIOaq{t^TTYetv_LECABBCCA@?dt_KKIG_~vo_HERVQRVY[[ZVPMLNKFEGJIFEEFHJJHFDCDCHORUVTQIFCJxJECB>M\QDFIGC=:>ABDCBAEFNZSEBDRRDA?ADHEER[QCDDCJRTTVWemfUJMXcqn^Ugg```orf\UOX\[[PFBAAAA??><:==;HJAG_wqbg^OW\\K@XnhUB@BLPGDFAUibNFECCBA><=AGLIBFXbVFMgylSCJboj^J:AJOJBCIPRUTSZ^VOGHJLNOPPQRSTUWY[]]^`aceca_]\\\]^_\\_cca]]_`[NMC=FA><989?GFE^T89=>>?@?=>>>??@BBDHJFBMQQVSJDBBEFEDCDDDGNTQPW][VSOGBBBBDDCC@?ELPICCDCCCDFE@McLHLLZHKWcWIHIHGGHSJsƯ|rvyqlf_ZTQY_ZQKKOTirh¹zykwurkqvzmegf]WXYXVRRPPMIEDDDCEMMEJSPLECPK=ONg{|yymd_hjM]womipbe{wd_decbWRf\cbXXLH`_bVMWPMTKHGHOH>@DFGIJHKNPRVRLNXQO:0YechnI8QVL9;PdRFUijSCCGE@>=<<;:>JNMKIC?CB>[}uwh~~bUQLV}m]]_VLGFFIY\TO\ZUIA=ELJVTJ[ZTJFAOUEM<2/O}zza@CDA?AACCDGIE?<966:<>=<<>FMNQY[UI>::@DGGGC>>DE?9::;:9866557998::77768:?@?>95445789989;=@ABCA<8449;;<@D?86531159>BCDCBAAC@>=9767=>==<:963114;>=AEB9327>ENOH?=@CFEB=:9=@A@?>??@ADC?<78><8644447:964577774038;=?;69:52000489666655668:;=?BCDA@A=9757962248;<@CE?8;<;7426:??;89:987:=@A@<3.--.17=>;77:>@BKME:64359;==?AA;448989?@82/.39DP]YA6?GKBJSO=338?;628@=8:>@8CTSOC;=C?<=:55=et\iN;:91..020/04423^C-349ZojrrPA_G9FPQG?@6.NX2:BA=:<<<7/.00///-,,--,-02358<<;:7568:8668>BA?;975423320/.//00.,1>NULED7.4DQQJHIHGKLIGHF<7<@83100/..7ITW^^TMOW_f`QFFXGGGFFGGGGHHGHHHHHGFFFECBBEEEEEFFEEEGHJLNOQVY\\\][VOGDDDDGOVYWWVUUUURPONKIHFCA@ACCEGIJJJLQTWZ]^^^\[\ZRJEBBCCCDFDCCDFGGEDDDEGGGHHIIIJJJLMMMNNOOMKIECA>>>>>>??>???????@@@@@BC?=DT_[W[c`TR\\X[_^[[^^ZPF>;=;988899::;;<==>>>@BDEEFGGHHGFFGKLNPOKHLRJBD@=@DEHIGILKHHJLNV_g^A?\gZ[df]U[^Z[fqfM@?EKLWdcVZlqolwqtspnphYHBc[JILTY\eUp|g[lcBDCIUb[PMJLgwwj]WWh~ugZMFDBCCBCCB@@jlUHIDE`tcRHMTUW_efb^[WSNJLLHEEFFFFJMNLIGHIGEDBHTSTVOGEAL}JDIIGNXL@AFEEDAAA@?>>AOPIEDEFN^^SE@@ENLCQkdEA>;BE>;>>9@MD<=>>=<=?@@@@?@@>AGJHPY]fql]OFEGFFFECABFMTOHP\^YWTKCDDDDDB@=?GOOIDEFFEE@B@B?kZLMNXNIP]^LFGHGIJUGӷuyyyxmd^[TR[`ZRLI[caqjqplzlit{uffjdZUVVUSONLLIGDFFFFBFTQ@FWQMNVTE?J[wy|gbjlVXhhkpvhh|yjacghe\Te^aaYVKMZ[d\R[UUPHTIHF?ENEGG<;==@A9,&)/1/6?HJKJHGGHGEHLKNPQQQPGB@DA?H^lg]VUXXXVTSUWYXTSRRMD>;;AA<9;?CEFHIJJLOTTMJSYP=;O]SPZ]YSNOOMQSTMH1>Ycir[=340-/Eh\T[XE55AFB=;::;9;ERTNG@8>E9B}karXs|aZaZX|lnc[\RHJMPMP]\SPTOQJEEWg^]ZJ]keNDFDXJ?C@?y}|zuv_7/<>=:<>ABCCB@BILP[_S@6765?NPONE8:IQJEDDDEBAFKPM:1356778>CDFFA>EKMJEKTPKGGIE94>FEA><<@@?@NVY[YPMTQEEMLJKOUY`]PJHH\thG=CDDHJC@Wmgt{aE=@DJMLC:;?@BBC@;7CWer`C5464DPLHFEFECBCEFFHIE;58:<=?@CFECDFGE?AEA7344546;<99:=@A@><974358:;;;:76434437=@@AB>>@ABCBACFD@<;9:::;;<>=;867::<>=:9756:;=@?@B=21124=HMMIGFFGFBA@@><>A?=>@A?DE=65BCBBFCGCBA=986665415>>:758>>=?@=8668=2,5@B9458=<<:8896420/.///00/026AG<10--7GPOHEFMQQOMJHIB22@E=740-./18FV\VNMPV`e`SMS[GGFFFFGGHHHHHHHHHGGFFFECCEDEDDEEDCDFGHHIKNSX\]\[ZXUNGDCCELV[YVUUUUTRPOPMJIFB@ABBCDEFHHHMRUVY\ab_][ZZXUOHCBBCCBAA@CEFDCEGIKMMLLLLLLLMMNOOPPPQPONLIDB@>>==>>>>??>????@@AA@BB>>?CGEEGGHHGGDDGJKMPOLJKHC>758>DGLKIMKIIIIHQ^bP=Mdf\PKW]WZ\YZ`ZKGLJGGO[a`YV[\jfxonsqjlpnYStyS@@JRX\aSm|zw{eVVACJP[_TNIGGRildmmflogXNJGEDBDDDDCC?@vrYHHMZspb[Xd`W]jlga_]WPJFEEGFDCCEGLSPHFEHLKHF@^w^Z[NFE@NNCHRcbNACCBBBBDB@@>AILU`TDEKXeji^JAAFPNCRtw_ECJNPU\o{ojcYX`_RKFHTQP[it|kHIKLNQRRRTUUUVX\_``adffddcb`___`_^\^dcc{vQJūD=>>ABB?;=<7;@=<;::9=ACCB@@A@?BHPZZ`tveTLMLHGGGECAGOSMEL[^[YTLFEEEEGFC@AIPPLGGHGEGFBHCBJh[PJTRPNU^SHEGGHMQOϱ|vztsnke^YTU^_ZTQJ`}b{ǰˬ`~h{eȹ|swyvnpwtf^ac]VUUSQONLIGEDBCEFEDANcRCGKKJIIGEBAAA@><=@A@ABCBCEEDCGOTV^_Q?842.2BLLJD;:GPIEDDB@>COYXSQF80/113;DDEJHCGID?@KSSMD===86;<86:@CEBA@NY`b^TNTTHDMVXUPNXjfOJOO[pkMCMMJJLGBPir~tL:=;:AEC=8:=?@?<:7778DcP4585:HEFLLHEFGC??CGIGB@BA:6:=?>?>BIGCBBBDB;>DC=>DA::=>>:9;<:99:<<:7689999999768:;:;=;669;>AA;9>AABDDA=:9::;:99<<;;::887558==:87:=>;9<@A>943579:@FIHEDBCDCBB?<8:??;;6789997;BDEDCGDCBAAC?::;;=<56@JICBDD???A=98;>>9FK>7DB3-15249?EJIC><;9402::61046544566;=32TplQEERN9,29==8225;AA=1.9?DNI78@??>856;68XkhK679753/-19;1++3ZF0/4-3^iz~y{X]Y@&,0440*-RXDIIHF:AED?4/12452-,--,,/148:;<<<;:;=@BB<8789;=<<<9642134542358<<<=;720/5?JNLIHKUZTOOJFJG61?HDA?6-+,/49BGGKOHN]^]\Y]`GFEFGGGIIHHHHHHHGGGGFFECCDDDDCDEDCDFFFFFIOU\^]\[ZXUSMGA>DOWWTUUTUUTROPPNLLHB@@AABBCDFFGMRUVY^cc`^]ZZZXSKDBBABBA@@ABDEEGILNPPOOOPOOOPQQQRRSSRRQROJFDB@?>>??>?@?>???>>@AABBA@?IVREGOJADPRLNY_]\`cbcc_R?9;;::::;:999:<=>?>>>AEEEGGHHJLLFEIIKNQRPOOLIE@>>AFJKJKKJJJIHKSTKN_ec`M=LMIKMKOUTPMW\[bdb]TgeOFIW^[UQQKMOH@?@@A@@A?ASfow||snO9GRgjVp_AAGB@?CIJC<:;?@B>>?>=?EJKJIMizulgfcSC?CLZ``oyLIKMOQSTTTUVVWZ]_`abdffeeedcaabab_]^cdaqڱdx?@BAAA?<=>:79;<<>BILEADDDB@?>@GQTMRdg`\UPLJMNJGGEBBGLOMHNZYPLHFGGFFGIIGCCJOMJHHHHGFIJQOI@i~[_KL[RJPX]OGHHHQGnȲ}zlfje\YWY^_[XYNYpŮòuYxjjʹƱmkpoptvpdYXZYVTUSPNLKHFDCB@?CHEDDJ_fSN`[JW_WQYowxmklklc`\WpwqpvcXpsih\eg_bZTSWMW]cRNU[R[[KLVWSOLJHC>831220--10/-+,/200-))*.17@CBEJA:ESQ=;EQLSPFLZ[TSUXXY\\^\ZXUUVVSKA====;>CCEHHHHIKQUQHISVEBUcc_PFDJNIGTbifW<4IXcjsrJ21:C`~_915<;<<>@@>81177cfN>FS^`WRw{v_]bVBESXOW]YOSI<@K[dvlF?\kbp{YDHCF\KACH{|{ZHCABA>=>?@82=HG?67AKPQPNJFB>>>AB?@CCCFECCCCDDDGNTY^YNB942/-4CLGA=;?HHFDCBA>ESXJ>>G@6356778@?=;99;?>;876981:YK94=JRZJEJILPMJ@:?>?ADCBAACGD?AA?CD>>@?<98<=98=><;<=?ACCD?<>?<=?BB?=:9777777557;=>>;9679<=<<<>>>=<<;?DC=;>@@ABB<447:=@>969999;<;:989;ACA<9;==858;989999;>?>AFEC@<=AD@<8769=?<:=<<=:7789;>><:;;4,-79536;@EA888:998=>><<;KF>??BD@?@ABDC:49DA>@A@?@CD@<9:9997762/19?;45970-,-?F9?QQ:(6NL;337=@EGGJE@<;=>65;3-.570/37777::45QniVGGUH1-6;99:;531;<4/77+0:6124447767883>XP537;><;8?LQRC1-HW4-1:3:egt{ye\[M)*/..23-B]FFHHE9CF<94113563-,+,+-/147:=>>>???>?ACA;::;<=>>;7668;<<<;:9:;<=?>976204>ILIMTTY]WOJIIKH:19ACIG7,+.6C@87EPPROJJXHGFFGGGIIIIIIIIJIHHHFEDDDEEDDDEEEEEFEEFFHMW[YYZ\[XTRNIB=BNVSPTWWWUURPONMNOJDA@@AAABDEEGMRTWZ^ceb`^[ZXTOICBBAABAA@@@AAABDFHKNOPPPQPPQQSTSTTTSSSTSNIGDCA?????@@@????>>?ABABAABFGEAAC@?EOMCI[`]]beeccebTB9;<<;;;;:98:<=>>=>>?AEGGGHHGLUNEFHHLPQQRRSSQOMIINPJIJKKJKKJIKJRdkbaf[KL\eZHLUQKU_[OO]fc^YTZNZd^~p[s}sighijMCJJJMQPGAFGHKQTcsyylK:BPUUSNKLMNHMX]cc`acucCBFJ\\JCMQRm~a?=;<>@EFDCGJOW__OBGNMGB?=?GSL@CPWVSUZSLQTNKGEBCFGJIHMQLDB?AGHGFHJMKGGIIGFHIJJHDCDEYVJHj]cM[WMPU^VMJJJLAѽumib\_b]Z[^b]]XP}è~sTpxɱ϶qiikkksqb[WWVTUVTRQMJHECBBCBBEIMC>GPV^V\s^EU\[\jy~gqyv^koeWXowuxaWusklaek_bVXRYNS\aOOZWX`USYXNRSOMH@833110-,*(*.012585430/-*''0;;DLEC?QcB42?@QM:J[\VRSUWY[\[]__[VSTW[UF>??>=@BAEFGHHINSRMJLTND?VaXA;@CFFM_mrmX>;M[`eutF,/7?XnN439=:;;;=?;2029?HTYUSOEFLQKB>`ulWEEFK[aYVu^EDKICJUSL\ZTGWB59@QW]G4=Ocpw{SDCA5YbZJ=ajOIHGGHGEB>54AR[O>?HKMRSMGEB957@E?=?BHMJFDC@ACDEFIOSQLA744433<85AKHBABCBBEA4-3>?968<>>@@ELKDA?DD>BLQND745668>>66@CBHKLO[`\\`[NMQIMivcLNhvdMR^]SPTTPPPMKJNP?9S]J?;95<@==<<;<=<;;:9;><>KE>3Pk\XFEKJOURI=890/;@<;>>=@@<;BKJEA<987678;==<9424688878<8668<@>;:;;:BA?>?>?A?:759ABAAA?=;89;>A?<;<>AEGGC?>@?9651/5:86679>DIKIHC>>@@;41249JKHD?<:9975557;>@BCC>979;<<<::<7/,-/2456=FJH?<:;999;:9788KF=>@A?DHFCBDC=3/578<>==9CJJIDEKEA>>?D?=>714:82038<81/3.,387526;6,-./9>4-269<<<8115764721;7059?EFEELW^aR87UC32286J[D^{|U^XG603104858TLBJHC:EC433336653/-,,,-/136:>@@AA@@@@@A@>=??>=?>99;;<>?><<=<:979:::851//8@?AR[UW_[K>>DDA7-.5?GD4-39<@>845986;>EG826KHGFFGGHIIIIIIIIJIIIHFEEEEEEDDEEEEEDEEEEGGKSVTVX[[WTRNID@AHORTX[ZXXVSQOMLLMKFA?@@AABDEDFLQTX\afeca`ZURNIFDBAAAAAAAAAA@A@@ABEILOSXXWWWWVUUUUTSSTTTSNJGDBA?????@@??????@AAABBABA?@@@?@BEJH?FX^\]bffdcdggZH=;==<<<;:99;<=>=>=>@CGGHIHDCSXJDGIKNORTTTTRQTWYUMFGJKKKLMKKKIN^faagg\T\_RKQQMKUecKDT`ffTBPO[d_xmWrpsiwSFEHQO[\^Xmvick|ia^[WQQQMF?>ADCCMVJ==CFFDCCCCCDEEFEDCF^mZRS_utxX@>AH\aRKJHGEDDDFJKIHGEBBDKNJIGC@Az~eOFFI@ePBKhy}Q;AB@@EMRRIE?>SUCAGIDAEKLJKJGOdb_jsvpXFEQ^a^VPMPUVW[Y^gXPalZHIJF[ZIDMTN[{hI>@@@?A==;<=?HPRV\]VYgwmVPanjXJShqjdfo}{rVILNPRTVVVWWWXZ\^`acdfgffffecccdeb^]befc_Yc̬B@FABEILORTOJNW[\_`THKRQMIB>@FNE@GdiYX_d`ZVROKHGEEDEFGGHGDDDEFGHFGHLOMIHHEDFHIJKIHFEDHYTIZUo][[QOQY\UNMKEQϱynkh]]jmd[X]^JblNyѽ{{xNfϯϼzlggjkjkg][YVSWYVSQNLJHD@@DKIGFFXYGDMRSURcs\AMWgWgteq}ZiqgVLcwxu][zolmdek^_RZTZQM\`MO]WY[VVWUSVTQMI>8520--,++./-/22351246771.)1;;CHJN@GgW=E\WSQFQLV[TLNRUWWWY\_`[WVVX\WLB;<@@>?ACEEEFMQRROJPRVDKUB;BECFHPcortjF;L[`iyf9.08>CH=;>==<=>><<611224BRSGA<9=CKQTR_J>XSMGLV`b]eu~vZAFIIJPROM[ZEE\B8:=@>B63?DFO_bA=B?6StveHJhryZJJJLQMIC82>JNUQGJMLNPPLFEB6/4@F@GF@?DGA<=>DKD;=>DHIC@<4`sSGFEKLNLF?76?@A<7;?BACFE??<=AJMMOE95334579:<;5358:;=>=>?<::65:=??<889989=>:;>=<::;<==:8ABCCBBFID;:959@@:87537=EGDCBB@@?96566:@?:997>HE><9544213568:?EGHF@<=@?;:98:81/212357:DHHGB=:86457:99:AB<>A@AJQKCABA<5..2588752379=;72.,-0455=?:<<8;?<;AJI3.@PA4+'/EHAAKONLCCJEBBB?;>=<;99960025:;4/3EKHYk_C?B50./7<4(+781*+4<:6;==??BCA92023355:<52122357752/-,,-./1468<@@?=:=@B@=::;<>>=?>;=AC<66898898998756631125516MZRS_[E237852-+0:?937@>60,.3533579A@427FGFFGGGHJJIJJJJIHHHIIGFEEEEEDDEFFEEEEEEEGGJOTWYZ[[WTRNJEAAFNSWZ[[YXVSRPNLKLMH@=?@AABCDDEIOUY^dgfdb`ZQKJGDBAAAA@ABBCDDDDCDCCBCEFJMNOQSUUUUUUUUUUUUTQNKGDCB?>??@@@@????@@ABCBBCBAAA@?ABCCCABMY[UWcgeeeehkbP?;?>==;;;::<=>=>??@ACGHIHE>GWSFGKKLORSUUUTLQYOC=ACGLMLMNMLKKKNSYaikgdaUIU`URUZ^UD?HScfUKSOVd[onWlv{tztaHAHNNX]Z_rh]g~~nhb]NMTXXJ@@AFLJFKE=<@CECCCCCCDEEFEFEDXpXQT[tuvmPC@B@JedSOMLJKIMQMJJIIGFFDIOQOGDB@8SxlUIDEHAlPAHkZ:@EB@HYenYE?@MTE@CCCDHSPRTSQ]rkTM[h_NQVU[bgc[VXZZ[^SQ`QGZUKPRKFQM@FJOSOGRkT?@?98:9>Th~~s\mzmg\xniiVIKKIEDDDGMRO\vxgjoK9<@FEDA>=<>DILPUX[aosqofRCCGN`cUJPdpohfqYWRMKMPRUWVWWWWXY[]_`bdfggggeedbcdec_^adceiiXepaX>ECDINSWWTKGNZ\XX[ZTQSSQNJC?ABDP\mbTU\bifXQNKIHGFDEEEDDDEFGGHGGFFHLPOKJIIHFGHJJIIGFECHWNFrVv[]XNQ[^[WRMAg¨{x~qib`imllh`Z]ZC^\jӥ{~}yyJcyӿɭtjdejkjfb`]WSTXXTRNKIGEDA@FOUOFDPd]ECRTSWVgr\FKffdlnqachcbQYpqz}t[ajmkhdl]XPXWZRK\aKK[XWXXTRUWVVOH>57:1*+--/11.,-..02.,/434698=@:;>IF@?]_Tgi_VVUREO_UGLSUUTVWWZ`_][XUY][RA7=B?=?ACCCDIMQSRMOPSSJ?<>BGGHJQ_nuyzO8JZbjve<18>>=>@BA?=<=?=84211114895015<@@>DPifJD??@=73456666:AB<518FQUQHDA<;74236776974>LIA?BC@>@CBEC<>DD;65434446=FJGGHHILX\^b^MA>>>?@@;:?FJPVRK?TXCHMGINMD:76:>@?@@@?A@=?DCAAECABDFHIGC@AA@?=;=CGFB<:<===?@BJWR=6988;;;;=<999:<=>@=;;;;:8:;=<=;98758;:88=><987:;:67=FPUUQE<@FIHD@=?A?>?=<>A@??CLK@<@B@CFDCA@7027:948?BA@A?<=?@>@?98977B@:;84343234557=??><;;>:426753357579=<;?>:9:;<;;::;<=AGINRND>@@:52356674.0017=?=50./3895774:C;5;@BBHG2,4D0.+,,459ENONMDCF?;>@;;>206:;:6-,06>FFDCE?:BOG01017307?6,+.44.059;>?><:9:94;@HSUTVRNJOVD:><;BGO_T;:F\t\,Ub6/20///152=:647@DC>9778:;;=?@BEFA>;8996669;96553115730..?TSR^U=001111101686:DIA50/3:==>==>><=?DLGEEGGHHKLJKNOOPQNKGGFFFFEEFEEFGFEEFEEEEGHHKRY\\\[XTPMJEA@DJQVYZZZXURRPNLMNOJB>@ABBBCCDEGJPX^fjfba_YQIFFC@AAA@?@ABCDFFFGHJJKKKIJJKKLNQTUUWWWVVVVUUTRNJFEC@>=>?@@@@?>>?@AACCCDEDBA@?@AAABB?AQYJIajbbffgjlfUB8=@===<<;;<===??>>@CGJKIA@OUKGJJKMQSTUVUPRN==EHCEMNNOPPONONLKNXfpqrnXGRZNMXZRJECCIW\WTPMYdXkpXkklyoLFOOPRY^ea\ey}xnd`\PRV[[RJFB@IQMFE@AHVZYYVVhwiOHOUM>M`_\almhdd`^_^UGHBAMLGSZPGFC?IIJWZH8AC>BIIHHIIQ\got_Ykruy|gfbWXVLGIIIGFLTOOk`SqYLJDEHEA@?0-0465552..-./0.-.0-,069@>?@BBBCEINQRQQQPTOFEEDDFLORZgsvyQ8IZeltp\GIE>@A?>?>====:732221110,-159>BC94>]l`RbMECAI[b^YR__>KTTY_`]WE78O`A>AFDDD?<>@99B@72299EeTOZXKBMmoOHHKLJMD66JTQOF725ALJEEKJ=49;<@ADOTMKONJFHI@9@GDFK?0368777;?<613>MSPKGC?<<72257752245>HFA@ACFEEHB<=?@EE<33544532:HNMKJHIIQZbiiWE;4=LKKIFB4)>_rvbMZbalmR;>A=86AUUI@AED@:8=DAMggjTDBDUODFIE:58AB@?@@@@>@CIOKGCBBDGLNKKMME:6:@B@;9BGEB><<>??>>>BHE>:==<=?=<=<9;====>?:68<<:;;;;;<<::65:=<:;?@>===><748?GLMOPE;>DHJIE?===>>==?ACCBCEA;CNI?@CDFFA82353029BC@ADA=>GIC?;74566975765444436867;>BGKH?<;;?BACE<4599765543355;DHGA@@?>><;::;;?LMLQOC;>@943356873/42*0:A<213359;97229B=:@B>?DC703>41.,--./=LOORKD=2-896HG/,38;;8303?JJHIC4,,-11+--281*4>841/00-.2;CB<9879:42>KKFC?74?C=538TsokjVEFOI=;:<=AJZW@BI>@cn<.EcC*2<;622500NP;@@=;84.,,.22220--...0248;;743456@DGD<6358988?CBDDCPRB;;6346667972/16852218KSV]L6231243233458AJLG<8=BDDDDEECBBEGJOGFEEGGILOORWY[\_ZTMJHHHGFEFFFGGGFFFEEEEGHHILS\]_]YSLIHFBABELUYZ\[XTSRQOLMOQMF@AABBBBBCDEEO[ckqi[VWRKEAABAABAAAAABBCDDDDEEGJLMOTXXXXYZZYYZZYWVVUUUUTSNJFDA????@AAA@?>>??ACDDDEEDA?>?AAABBAAHODAWaVT`hjiiig]H<>>=>>>>><;;<=>>??AEHIHC>HTOHHIIKNQSUUXUUOBCIMJHKKMQTURRRRPOMNWdryoVFMMGINNMMLID@DIIIII]eVirXmrjrTPOSRPYeXTg|~}ma_]ZX\^ZUQNE=DUQFF=7@A@@CEFFFEEGHGHHD_n[TU]r~hF@A?AABBISRRXQJMMT[Z]VMIIGFEC>=FNMNISkt]EDDBCH=xQBAAATzfFGA?@DRaVA??@@@@@?;:@Wd_SKL]hWMOLF?9Fcibhqnfdd`de`^N@=ACHHO]YJQhhXOJT\VD8;ENZdd_[YSGEJUQNbkkq}s^RS^\XRMSXWSYaSALiTHpwlhLCJJCBBBGLOQO]w]R_o^EAJV_abdhlrusognĽkEV[OLOSWXXXWWWWXY[\^_bdfhhhhhgebcghfa_aacdeffgfehe^_[GCCCDFJRURPOPPQSUY^\VTSUTND@A>@Zhoyt`Y\ac[NMRPMIFCDGIIGEECBDEEECEIQWWTROLIIJKLKKJJJKKLNXOJyYwpmc\ivnb]XIͻ{urpmkhryrszplka\ecK͸selxjĥIhxy’~}ujb]^fjjc`\ZVONROJJKGCA>@DGQZYQZaXTX[^`WLTf^MZgfUMlowymngm^ka^j^`wjvYn{enfldfXRTVWWROXcRFRVXZWPMQQPLC@CKI<304/)'*-,),/0//04620.-,./6;99:4/=QUW\HSULSMLLROKR[[YY[[ZWY^_^[XWVX^d\F<=??@@ABDGILNQQRQPOQNKIFBAJSTQUjv}T9K^inqxtXJ@=>=@A?<93//0//27889>@949Jdof^G?=@HSZ?@ABA@ACB?<659:756;;Dd\CJOSMBNrtSHIIHHOE87@IRTE6216?EILNM@9>??BBFMNKKLLIGGHF>;BECHF==>=:66764678@LOKFA>=9423:>?>?CDFJHGHC;8<@CE@847735978DPTPLHHFKU^jp\>36HfopVIPTXMFJI?46ANG?BCA@><=AIJEB@@?ACGLLIJLI@<==>=<>ABBA?=<>BCCBCC>6:=<=<<<;;<98;>==>??<9:;<=>>>>==>>=;;==>?>?@??@BB?87<@BCEJKC99@HJIHD<8:>>=?@ADGGE@=AMWOCAEE@>:726846@GFB?BEA<>=<;;;:=JIJRM@9<>942124662098*,364//3568:<<;7;A?AID<;>>65;B?B0).7:0/?MSWP@3,+9:5KL:87865689>EF<530*)-0+,15651/-6;75651+*17ALC:5588740:MTRVVH:62/2/Bl}yuSAMXJCJLKC=CUSKVXF6AA+19WT/@RSD5750,AVB;987420./01210.-,.//0148:83249:;?DIG;1035667>C@BCAJPE:76555457:9502:@=9:>>BKVS>1330365334202;HOLA9;>><;=@BGLNLLPLFEEFHIMSVW[_abaca\VQMJIHGGFFFFGFFFEEDDFGGHGHR_bdc`\RFBCB@?BMW\^_\VTUTROMNOQQJ@@@AABBBBCCGTchion[KIID@??ABABBBBBBABBCDCCCBBBCCGJMNOQSUUTVWVUTUVVVVUTTRLHEB@@@@ABBAA?@@=>?ACBDDDDA>=?@AAABBBCCB?EKDBO[bc`_ch`K==>>>??@=;::<==?ACDDEDB=AMQIHKIKMPSTUXWWWRKCHKIIHGKUZUSTTTSQQOQbrfLFJFDGJILSTKA:;>??@F_gUeuWn{jmpXMKOPY`|WQd{xvm^^]\Y][XURRQKQWMJN@9>>=>P]RDCN[c_ZRKHEGTea\iodYWX[hngfUB>A@DAF_eZhwcTJDLZXL>M[`djpj]SMIDDCJMXUOYmkOMSWZliWamljqpV=9KFA[vldK=GQMEDGGFFEKrqPGKUdfYSWahjihmsyzy}sP_śRK\RNLKOTUWWWWWXXY[\^_aceghiihgcadgifb_aacdeffa_de`_ZNECCCDCGPUTSTQOKGIU\YVTSPMIGCFDAdrmwyf\Z]`YMMRTTQOIEGLOMJGCDEDEECCGGJKLMKIJMMKIIIJIHIJJKTWJfWr{yreo}da_JɸvolihjxulmrvunhbacOqˮŻ``dJkyx˴{zymaYYahkf\YUSPMMMJHHHCB@=>CECOd_[feXRQKM]ZGM[NTbgYJh|Z}zi|qypwisimqTSdcx]qw`jckdaXRYXVURLUbWDKTWXUPIKMLGECELE>74:.+,02236:9865798662.,*)287653JNQHMHOUXQJIIKNNSY\^^aa`ZV[^^[YWVVV[a[K=:=?ACDGIIKLQRRSRQOPOI@?BFJF=Eg|X7I`jloxuS:39BNRKDA@??@EFDDB5/120026657866;BKWZXQKE<4@X]VVOUz\LR^^I;IZ\VS=@@=<<<<>=86:?GI@65999;AFKLFDJG<87589?<;;;::>=:;=<;AJMJC=:<>AAAAA>::?DDB@AE@68==;::99;:75788?A>=???????@??AA><>??@???@BB@<<@B@BFD?:65;EHGHE;69=>=?BDDFHEBEMQRQNJFB=9753:<9;CDA@?CC@==@CD<31120039?B>877535:=>;99;ADC?==86;>=;9:;:98866511239?BABF>=====>><85BFING<8:=9436688732;;-**,.1566689:;?<<@@BHD932327@EEH0#-CL<)0CORF8275865IMH=83/143:FF;3.,++.6A:9;>?:5>GG=659<5)2@@ELE6-.5/-024=HMT\WNB3).5XrRP\_XSV[ZSKSdhgbaY<+/204RcIY^YF7851.6PJ55554345554430.-,-.//0489::;<>?@@BEE4+-11245AC=75569><55974:EC;?LPGCIKF=?G?00520366542038;EONB830///05BSXXVTVGGGFIMPUY[^_`bbaaa_\XRNKJJHFFFGGFFFEEEEFGGFFLZdgjllmhXGABA?DS^_aa]WTWXUROPPQSOD?@AABBBCCCHR\]VZjdI>AA?@@@ABBBBCCDCDEFGEEEDCBAABBCBDEFHHHIJKMRUVWVVVTUSMHEB@@@ABBBA@?AA@?=?>?BB@?>>==?@@ABBCCBB?====AHKNNMRWSKB<=>????>=<<<>?=>AFIIEB?=FOKILLKLOQSUXWXZZTKIHJIE@ASWMMTYUUXTQMT\PDCCCBEIJLQQF:;BCA?@D\iUczXk{rUzrVFIGJa[VOiyunTUZYWYY\]^]ZX_[NORMRK>?ACEEEFEFGGHGHBMj\UU^o}sK<=>v{IIHGFDBEI>yfKGFFFFB@TeXSVRGB>Dd]MFBFE@@@@=>DGEHS_abd\NGKLLVSHN_b[XWSXgmhjXB@AAC??^l`ecUNIBCSYPO`nmlrynRELRLFEPQQSRbeSPQTPNac]qysrvnP;9BDCKZ_RCADNNGGJIIGA`sE6=DHPY^`aahvtjkmpru}~bG]FKSLKJHLQTVVWWXXXYZ[\^``cfgihgeaacfhfb_`bcceedeigc__aTEBBBAAENRQQRQPMKLVYVTRKEBEGDBELqlU]gaXW\^WMNPRTWWOGGKPTRJDFHGGECEHKGMPJILNNMMNMMLFEGIMKM\QNo`turi_Pϼsjkjms~|lfhjpqpmjfdgkÿɧj\aWvu}Ɵ~xvoaWWblmj`TPNMLLKIHEB@@AABBCDCKZ^TZloaUZcaaiig\QOgrQTjWsaehxttlpjvjTOY`ycsk\fbicZWR\[TUSIS__JDPVVUPCHJIFECDJC@;7>52148:<@CDCB;774034680+)-1555>=HD36O\_H?HMNSSUY^cdgfe`YWZ\[\[ZWTRV]\O>8><82CfmuS7F]imrxtR939AJNKIFCBADFB?EF>754/.1445666>CGHE?CGLE805@CIXTSq{_F@MUT9?\d^YZG9=;88>JKA;;;<;9875:=DeRKIPNFGGaz[737;GWM;55;AA@;21FB87765=?HJDADGD?;::97:DGACKPPUZQDFKNQfeX^e`SE<:JVUNNNHDC?<:<==:977=>>@AAA@=99@EDB@BEB:8<=<:8899973235;CB;9?B=:=?=<<=?@@BCA=;;>@@AAAAA@@@ACC@BE?87658AGHE>9;>==<>CECCEDCHNLJJQXM=:8765;:78;;:<@C???>?@A;5456568:=>=;998646=@=98<@A@:8972255689:89887762/.--.47<;<:99;>@@=709@GK<::::9769;=;:84:9.-+,/6>;767:;:9;=?>AC>3/,*1>CAGF5%2LVJ4-6@B843>;2(2JPJ;?:422/7DF>5100/-5FJHGFB;AU[PA:9>A6)9GABGG=0,0/-/2/.:EJS^aWE82>ho\]aab`ZWbkkrz||m^`L/1?DEVodeYD:542/.-EL01222146765421.-,,.//149?BBB@AEF><=>0*.15426=>>@>93--4@H?44842=IIHMROKPSPH;472+2855675234=KQJDILF=82/--.2E[dcZOL@HHJORSUX[^\\^acbba`]XTPMJHFFFFGGFFFDEEDDCCHUbiloqqsulXIB?AKX_acb]VSUWVTSRSQSSH=?@ABBCDDDDEKNGDSYK==@??@?@BBBBCDEFFGHIHFEDDCCDDDDDDDEEDDEJOTXYYXVVVSTSOJEA@??ABCCCA@@DDB@=<>BB=:<===?@@BDCCDDEC?>>=>@@@AADGA?A><>????>>===?@=;>GMLHCA@AHJJJHIJMOQTWWWZZWTPNOH@;>NPLRXaZRWUUSRRNGB@?@DIKMPLC?FIEDCCD]jUbYjw{jXnYHGHQ\SWkt{zkFCMOR[\`c}gYVVWUONPG<>BCEEEFEGGFFGGBGpaVT]m}wMVe_[SSVUQBJYUT_jiorIJ[WMQQMHOYcq[IRSTQGJNfwr{wX@BHDBKKUMCHKLNMNMPTIKpF7>DEEGR_a\X`u~qa]]_blupS>b}ONNILLJLPTVVWXXXXYZZ\]^_beffgfdaacghfc_`abcdddcdb`^_`\K@CDBBFKMNNMMNMMLMMLJFAACGIF@>JeRBEJNRVZ\ULLLLMSXSIDGOWUKFJNMIEDHHIPe`STWblnjeca^XRLMNOL[VI{as]`ķ|pkortuwphhjhegkmsun;ϮXycf}ҼxxsdWU_qskaWOMLLKIGEDB>=@?BKPLJIFPac`ahpn[WoylnriYHHmsWTuwb^hx~ywzxgmcYSTcjgp`YcbeaRTR^]UXTIRYbTCOTRUR?FIIGECEI@C@9C;956:60,03755.'*142,2EI68GMTA;GRUXWY\aghhgfd^YY[]_^\YUQPT[^R=6=ABDFHHIILNSWWVTRQPI;?<;?QYGJF9E[hpwxo\E<;>BEGHFBABFFB@CFE?:5/.14544=CGIFB97<>A;21012>TXT\^PNE:BEBC?4<>618@GKHBB?==BFGGHHF@:<<77756>DDIOH@>;335558=EGDA=7566@OPFEDDEFFGPZRC<;@N[WMJMJPTQMEECEE=ANM?:<<:BT^ZTF>BEB?=<;;:9@DACHNNPRMEDIJUi`Y^ZPG<7BSUHFQRGBAA>;;?@=:87BIHDAB@:9@EDA????????@=;=<<<::;;;;85457=CB<;>>87=@><;=?ACDDA>;9>@ABCBBBBCC@?AA?A@=;:9A@>>>BDBBCB@ACB>BWfTA:99::<=?@=68AEE@=;<<<;7348:999:9:;<<=>933=B>;:=@@=71351//245667988776541/--04><=:7579>A>826@79=:88;;;;:59:1./048@>976?@D?4./,,7CBBHF;5BV[WB25755757:/(3FLCESRG7037=EJ=2/./.-:GIKH=6HZRHD?=CA3+2?@;BFHE0/0/01/.17?IZc`TM>:vsY|pbVQ]^a^ZmrqzwSNJ99HTX_olfV2.220/.+8N91233347754630---.00026=BDC??DFA?;52..029::?@<;=:54203>E<331-4=;>JJABPVRPK;/12.5;97<90-4GYbbWIGJIFC=60003=Qir]=3;HHKNOOQTY]\]`cddccb`^ZVQLHGGFEGFEEFEDEGLQT[bhkmoppqrmi\MB@FOW^``]WRPRSSTTSRSUNA@@ABCBBCCEKSYZVOHB=;>=>??@AABABCCDDDEFFEEEEEDDDCCDDEEEGIOX]]\[ZWWVUSSQOLGB@?@BDDEEB?>DJF@==>AC>9;<<=>?ADECCEEFDB@?=>AB@@CCC@>AA=<=>>====>>>??<>CJJIDB@AEGJKIJJLMOQTUVXXVVYXTMEABGS\a]^[TUWUVXVVSIDAADEIMQOJNPIABCDGclW`~Yiw{q]nmc`SHQ^YZsojtxyvx}lQGDEKXXchdNDKYVMD=A>?ABDEEFEFEEFFGDBtcVS\k{|U=?B@??>?FRFBHGGFECIEGs`sn_J@ACDEEGIJKNOSX\VGDLPXWMEBBCCB?BDFHKL[b^WPJHKd|j^cknhjosup[H@IJBBA@BAGW\UQMMOVWB?X\TOQP[tP^cZVYSHFOXhu[TXTUVQGEux`KLLFFPKNLOUYXUSNJRVCSzL>@DCEC>KacVSWauxbYYZWYfn`JIWOKGHNPMLPSVVWXXXXXYY[\]^`deefecbaeghgd``abcddddea\\]^ZMCEHGFHHIKMKJIHGFFDGFBC@CEJJTjWMEJHDKPTWWPKKKKJKQOIFFLSTNLNPNKGGIHNjsddtumighikicZSSSP^aPfy{fsǾqmtvxtqkgffgddcclzŶȘ^{ovrˮtqvlZY]jrm^SNONKJHFDCC@@ACBCKRSWULIboplealraWjxkei`\MPlhoazrex{}zzlie]YQ`Tfj]]afb^MSQ^[X[ULRV\VHQSQTS>CIIIGEDG@EB=9:=@CHNRNIGEED?:41/8:6//-30-9HLOJ82HC>FTY]\]`dhjiggda^\]]^^]\WSPQT\_R<8:DDFGFGHIJMSUUTSQQVK>:<@C@;AE;F[hqwvk`J?>>?EGCB@@ADEJJGFD?<80,15615HMJHGE>;734622332bYLKMNEIRRH:5400:935BKOEAB@<856879DGA@DFHIGGE@427415?IKLJDBBBDFHJKIFJHB<6777:AB=BHGE<23:;77DGPOIKMROSSOK=??<;=>;==;<;9E]bXMB@AB@><>??==>?=<=??BDDEBA==@><;;<>>=;97989<@AADC>=?C@@CBABCFGEB@><>=>??@@ABC@9=CCABAA>=<=>ADA86<@@BB?@BA@A@>==<8CgtfZI@F?8;HNI@46@CD@<:9::9522688779:;;<>AA:33;?>>?@A@;63462./234666789999;8321128IF><:875:A@8769;=>C?7<>=889:;<;89=;50029A?<::@CA<:<=><4,--+2;:D?:8/6?<99HOXS;1887BK>21.+/-09=B<33FLC@C@<@<1+.>AFI1/--0/..+.7=K\^UM>-dSNe`SGKQNQYgfUJPzwC9=:?IOZdmmjb7020//200HF9<=<<;=>66761---../048<>=:<@BDBB@3*,1578;=<977;854335<=6010.6<5;NNDITTMQQ=.1546;84<:.+9Rcb^^WNJIJJB7//244>cm8*6HHJLKLNQW]`bdedddcb`^\YUNJJIFEFEEDEGINW]_`cfggjmooooljf]SJCAISQS]\RLNQRSSRQRVSFA@BCDEINPWaegiibTF>;;<=>?@@ABABBBBBBBDDDEGFFEDDCCBBCCHRX\__]\[YWWVUTRONMJFDBBEEEFFD>=DKJB===AC?;;=<>ACCCEEBA@ACA=;<<;<==>????@@CFHLHBABBEJNMKIKMOPRUVVWVXZZXVUPIHawr`S]]VWUY\RPSLHCBDBFMRSVSNTSKG@JblW]zUfzxieirws^_cXOYcblyvhX_hoprpomj^JDCXgxncRGDDEHHDA@@@@@ACEEEEEDEFFHFAwcUR\jyZ?AB@??>=<=>>ACD@DEKMKJLUd_T\iswnc^geH;Q`dc_XZRXoanXept|}zxkfbeZVRbkT\`iaZJSQ\V[_UMTTZTLRQQSU>@ILLMDDF@FE?EAA?>>AEJRSQJGGJNOLE<8;<886/200>DHRQ70>BCMV]a\Z]acfgghdb`^]]]^^\\XTTUW\`TA9>CGFEFHGFIPTTTTRQPTH;:AA==@E?@BDJMLFAGG8+0:763:LPJJDA@?9:752247:=IY`WD746:79DUdbXUQZJ?<988@<8=>9X]MJLOKIPQF:7405@>;HSTQE:?@;Mkj\USPRYYXUMGFB====;;<:7755?HHGHEHKGE@9202229EKKLKGFFEFFGLMIFKRM?55:?@BA88BFD<34:>:9=?7.26568748BHGJLQSPGGID;9>FORNKMPVVTRMD:;;;<<<;<<<<;9@QYPB>BA??<<@CBA?>AAA@?9>CDFFKQUX__^ZLB=>BBCACFHHKNH?;8>EB@>==CHJJFCA>:;BCDCA@=<>?<;>BA>;<>@A?<::<;;=>>=@?=ADCABDGGDEIJFDC@??;9:=>?AC@77@FECCACA@>>>@>955:;;>A?>??>??==>>;A_wxo\QQG9@RN@526=AA><;99;:631011379:;::;>=82138=@CEC=967982./234556689:;==944424?KE@>=9749>A7258<=AC::999;<=;9=CA<96;C?98:;;:88994-*,.,,57-5C?67?LLB=3.39ALOMD6.8B7..67CLB9:54:=83:>2(/31020.2988>@=9>70/4>FC;7761/,+131/.262;O\V?0.Rnrrwuh<77334873CNCDHGGHILA:9:3--..,-059;::;=@AACD>3/15==88855677787458;<86:>87;9?QXVTSPMLI/,04640Nub966IHHJJJJOV]bdeedddcb`^\ZXSNLIFFEFEEEHNSUTSTV\bdejnnnnljgd_WLDBDFJPWSMMOQRQQQRTSJB?ACKQW\^begggiibVMB<<=>?@@@AAAABBAABCCDEFFGECCBBBCGOZaa`^\\][YVVUTRPNMMKIFCCEFFGHGC?@GKGC@>@B@==>>=BKIEJIDFGBAA@@?>?ADEEEDA@ABEC?><;<==>???ACCDDEJJDABBDINOLJKKMNPSTUUVXZYXY[ZQO[hdWP[^[ZVY_\LJKGDDDBGOTUYNE[lgP>LalWY~Rhzqbaiouogfd\Y^flql^TU[ajsqlflnjbQQk{zup^DGEBB?@@@@@@@BCEEFFEDEFFHH>{ycVS\ixZ>AC?>?>=>@:;BDGB@tyb\PDEEEEEDBBB@FEEHHG?LMKbXK?=AGIGDJNRSJGFKXX\d_MFQa[PHGIEF_\JLPRUVXZYYYWXXYZ\[]bdeedcbbdfhgda`abccca]^icV\[ZZWPHFGGFHIHECBDGJLMLNNMJKCHNWwNWRONPRTNIJJJJJJHGJKIKPSRRSRPOMLLKSZghehbY]WV[eeVWXXWkto¾ugp{ojfa]_dd``_akξϿ͟rvɉrq~Ѽ}yljdYW]ce^SMKMOOJGEC@AB>CEGUQMGCMXhwjdiqwrc]ffXGQXZd\EETheYqbOsl|xx}~rjemcRS`ZKTfh^TEQPYP\hSNUS\RNSQQRS>>KMMNBDEBHDAEBA@>>AFKRURKHHJOTQLFB?=89710/159@LXB:>CLV[b`USW[\]^bba_^]]]\]]^^YVUUUV\`VFBGB=?D=H[jryxteXOC>AFGCA?ACFFEJMIO_W6,EP>9>9==:=:4114:=@HSUG923533@Tbc`WPI\LLC:9:<>MD34>BA?A>:=>7P^IGOTQNQPG@<8HMKKKGFFGEEFKMJEJQO?35CHDA?99AC=8339>=;=CA961187434>HKJPUYQHFJC:9?HQRPMORWXUSM@:;;;<=<<;<<<;9AS]P>>CC@?=;@ED@>=@B@?:9>CDDFIRYbbcaWLDDCCCBBBDHJOQG>:6@ID@>==BEIJGB?<8:BCEECA>=????@AABCBA@=:A@>;98;;;;<;=:9>ABB@BDGGEEJKFBAA@?;9:;=?AB=57CHGEDBBB@>;>B:336:<99=?=;;=>?>?ABC@BM\jk_XRKT\N8114:??<;96688631.+,1678:9:9651/015EDCCA?<8778:==<:=CJID>=@>9855540154/),/..271*6C=:9>MP>60.QH+*50+*,.0/03:=08<6247?GD81////-+09?<;;744?RR8*100HTPSSUZ^VRYN:6953VpW0,3678Vb=9=CBBB@@=;@B=;;;<<969:::767;?BDB:6:88FQPQVUOB:61/589:@HI@78=<=L]`][YVRI<33556738GC:>=IIHHHHHMU_ddcbcdddb`^\[ZVQLIHFEFGFFIIGFEEHMW_chmmlnnljhda^VLD@@@BKOOONNPPPPPQQNEBGNRY^bdddffhiiihdYJ?>@>?@@AAAABBBBCDDDFGFFEDDCEENZ``]\\\\[[YUTTTSROLKLIHFEDEFFHJKIB@FLNMIA>@A?=>>;@SVMQNCEIF@>???>?ADFFFEB@?DHGFDA=;;<=>?@BCFHFDCIICBBDGJLMLJJKLMPQSSSVXWVXXZ[XTUUNMZZZa^X_g^NHECCDCLTVRT]_bls\DMbl\[Wlvp`_kqtvthdifbdhga\WZ]counienqqp_\quoptmWSJKGBAA@@@??BDEEGGFEEEEGH9p{cXV`jwY=AB>>>>>A?<@ACHU^btd^MDDDCDDCBBBDCDGFE:@HIG~bdpeHGIDCBEHJLOOPQQLEDDBAC@BACAA@@BGIJLOUbhdYTV\_`^TSKI[r}a??BA@AA??IQSWXVQHJRJ@<:ISN^dWD?@@JWWRU`ebTLIFPYQHHQWUZTIFGHGK`aLKOQUWYZZYYWXYYXYY[`ccccccceghhfb`abdefeYUY[``ZXZWKCBCEFGEEDBL]b]ZWPOOPLQWTKFƧoaWSRRTUQLKJJKKLLMKLQQOQOPQRSUUSROLT{lcjlg`e[Z`gxdYYXXfyvnn{zne```_aed]``bjɯ̶uxs͸ww~|nif]XZ^a]UKKMKJGEDCA>@B@GDJ[VSJCKLM\nnea``b]\]]VSOIXmq\@Od^pdtTutt|lq|qmnfVW`MFNna[LEOMSI\sWPXT\QMTSOOP@>NOMH?GEGJBAEB@?<>@EKSUSMJIKNRQMHBA>7530-.225BBCFGGGGHMQRSRRRMU^PIQM@@ACD?50695.4Kada^XKHYHKD6666EDCBECC??8H_MJV\ZVRPJECEOY[\ZVTUPA>IIBKWa[WSQSVUSUVL@9;;;==:7656769@DFEDDMPD663127>HKLLKHEDDFGHFGGIGGTWH:?MMC==AIK@5.196212:IPQWWVOHHKG<;GKNRUQNRVY]XO@:;;;;=<<<<=?;;H[ZE?ACBA@?@ABBGR`kdfk]ODMMJHFCBDNQSN>:65ALCBAAABBHKHA=89=CEGGFD@>=@BCCCBABC@?<:9:;;;9778999:9AEDA?=>>@ADFEDGHDA?@AAAB==>?@A>7:GJHEDCB@?<8>A9469==;89;98:;=>?@ACGG>7C_qladedbL82348=>><943564231--366689<:51./357<>;5101334424210375459@D>98567859BG@=<978644277555:BFED@><7766:<<<<@@?BBA=88;<86650.00.,--,.33,+7=987<88:?DB6151..-,-4CIE?9821;>2+--3KXOPTU[a`jSDCA;<86B;/04545_vX9;ELNMLMIGNFAACDFHNTC730./01128<>>=<:878=B@746754=CBIWWH98945;>B=?M[^]]]\VI@?;8666525AD?@IHHGFFGMXbd`\]bfedba]\\YUPLJHFGHHGFGD@AAAGPV[gnlijmnmkhd`^YQJHEBABGOPNMMONMNONNNPRSSY``]_dhknpqrttqaOFB>?@@AAAABBBCEEEEGGFEEEDDJT`aXRSW[]\XUTTSSTRQOKIJIGGFDFGGHJJJIGJOPRQH??A@@?>;;P`[ZOCFJIC==>>??@CFGGGEDDFHGHHFC?=<<>>?ABDHIFACEDBBCEGKOOJHIIJLNQQQUVUUUWXYYXXXUQYVIHNSZckeOCBDHLU^YFUzwnkcTM^kglXlqqkiiknttnipmhd_^_a^X`mrojghoxsg\_ehhgfdhja`LC?B@@@>?BDFFHHGFFEEFI:k}dZValy]BEE@=<<>C?AIIS_}zwgcSDBDBDDDBBBBBDGEC?EOEeh[dgPJRTJA?FKLNRVWSKDCDDEFECAAABB@>?DJLNR[iplaYUTTT^bROh|hN<@B@@AB@=GTYc\POMLXV=F^ZSUWZd^s]]ornecb^_[XUUpzZW_REX\x^USf[PcTSXUD@FB?>>@>>IUXRoZFCDD@Jbj^etrkca[TX]WOYpsbWSPKJHJW_ZOLPQTWZZZZXVXXWWWXY^bbbccccdfghhfabdfgkmbTVTyYTWQHDCDEGFEDCDMZc`acWRTTPTo{jZvǑ_WVUUUVXTMJKLMNPPMNRQKILOPSW[]_XOOu}_hpf`a`ceb^gztjd^[`mwkmvvgdb_^^jiecY`tevĭov˶so}vliaYY^`_XNHLOJEDBA@AAAABFDN]_^\U_Q>=IXXSRUZ]XVTQMLHGMcqFKq[l^{|bm}tlk^[`NGTv_ZBHMKKF]vbL[V[PMVULLL@?OLK@>JDMM@CEB@?;?@DKTVUOKJKMRQMHDCA:30.-.258;?Wg[QPTZ`ZLOVY[Z\^ZWTRRSRSUVW^fg_ZXVSRW_aZLB?BFFGIHEHOQRRTVROTZPTRC8@;Iar|ymeYIHNLC=@DFDDBFIJ[qnVQ`cYQGUaOA<;BDB>@@;66;@AA>963157524?VfcieYIHT=DA2364;BJKPVSGEIMIHC:CaOS^^\VPNIEHRXXTTUSRQOEAGFCKX]YWWVUSSTUTLC;<@>===<;98:=>AFHF@?GH<24532;FKKKMJE@ACEJMID=AJW`ZLGNRLA;<==CD<9>>9:?ABFLE81475333:ISTXXRNIIMH=BNOMRVSJGLU^aR>:<;;;=====?BFMUVI;=ABBGFA<>?=9<>>AFHFB>>???AK_idcaXTDILLLIDEPWUPE:623BIECEJHA=<=>?:7:?EFHHIJB746789?BDFG@>??@@=;89=><:;:;;:;<:7:<:;>@>?ADEA<>I[rrphYTK<7767:=?>;63465457525768;:98863346:<=70./11.,,0451.04556:FKA6327:<;>EC=:95366468=@<977<56:9:<<>2/3EXYWRJEFJJF<31654;EH?2-/101423DF1*0/.-./238<>HE?>64;>A@:<>0--,+++7KK;682.00..-,5M\QKRV]Yn~]SXT@3><30/44353bxGb6CHJMPRTRNKH?==?BGIG730./1358;?AA?===ADDEKPSTQNHCCB=>CB@@<78<;52578:==;>FD95:=::>CCFG?638>BEGJOWcf\QH@@?<:65435:DOMCKJIHGGIP[_[WY_efedb`][ZWSNMJHHIHHHHHFCBAAGOQYgkghkmnmkieb]WOGFGIIGEIKKKLLLMMMMNPPPQTY__]ainqsuwxyz|sbTKD?>@AAAABABBBBBBBBCGGGIN[`ZOJOY]]]XTTWZYWTSQPMJIHGGFEFGGHHHKMLORTUUPF@AAAAA>=Lad`RFGKMF=<>>?@@BEFFGGGGGGFGGGHEA@BBA?@BBEJICBBBBABEGHKPMIHHILNPPPRSTTSTTTXZ[\[Z[VH;>KSZacQCALYX\e^O_sz~vhhXNVighpXchhv{kb_`dmplklkge`bkkkkidfklopdYY^acdfefqvsp\YH>?@>>@BDDDEFFGGGGGICFB?A;B@CKPSTOKIKMOPLJFEC>61.,-26<=:C[[TNT_]MIQWY]``^ZYXWTRRSSTUZdie`]YURTX\]\RE>AEEFIHEHNRRSWVPMSZ]K<=I=HbsrdZNELPIBBEGHGFCFHObneWSTOce_dY91@NOOMJGA;87:?@@<6468854BC8=B9:KZ_ad`PGRQA=?9GgKS`[VMHHGITUYWQRUQNMJD<;?HQZ]\^^ZVTTSQOMICDEEC?<<;:89=@BFGFA>A?5244329CECCGE?>@CEIMID89NjfK>FPQLEA@AAEMMFABAAA?=?EG>6454554:ISTTRNKKJFBBHMOQUVRLIIJO\ZB4;::;;<<==?FR_]L>AHGCDHGBA@><;<=>@EGECA><<;Icsl`b\QdX\_`\QEKZ]SF=9516AFDCEHE=;99:;::=CCBEINN@669;=>@><;<;9<@<9==::==;;;;;<==9;\~z\?@FD=;;:::=?>83479878<98:<><;:9839@=:<===CIIEA<856434445762/.,-/1/,*/00+0IM6../64DPSNIORJIMKA61/3.,9A:/--../.-*182*.//-.//058;AA?B828=ABCKL<272,,(-AF5044564/-/4:HWQOWUZ`rd^\\J/6@920365:/Tr-wCLNNPSTTSPOLIDA@@DC;4451-/6:;@B?::<>?@A@DLRRNNPJAAB=:<<::>BEEEFFD=89<957;ABB@<972022-09<>AC;1257:@GFB@MacO<57::9:7427;<@OOCMLKJHGIOUTTYbffeecb`\ZYUQMKIHIJJJJJJIHCBBEHMWaceikmnnmkgd^VKB@DHJIJHFHIJJJKLKKJJJMSX[]`djmmqtwxyyz|zraUQH?@BAAAA@@@AA@@?>@CDCM\\TFDMZb_YUTW[^^]YUTSQMKIHHIGEFFGGHJLMMPSUVXWMA@ABEGGIR^dcYJFKOKA>=?@@@BDDEGGGGFEEGFGHGFFHIHEBBBDHHFEDDBBBCEFHLMJIIILMMMOPPPRSRRSUWXZZYYWRNLNMPSOHDK[a]Ydqkgot~zpmWGXedbYY]^Yl}u`RRZ[fjjhnsujmyr^Y^emokdZY[[a^\bbjuyxypsXB@@>>>@BCCDEGHHIJHI>cm`U[bugLNTUXRI@CHEQd}e[VSQMKIFBAABCDEEEEGHGJIKF\UMMVRMPNXclv[NNMLT`[JBEDBCEECBDEEEFGKOQU\`__mzk[VPQUfkTLJGIR^<@BA@@BAA>CMWL?b{[=?CIQXVGFYyx}ob^ce`Q@I|jNE?=>CD_maRW\KTqfKGX`LFFDCGHADYddb_x`?GGDII:Eiz|eVWRNOYadfa_bfaKIOMIMSRQRX[[YXVTM_zYWWW\`abccbbbbdhjhdcdgo}}hXVZZXVVTUTRNKHGGHGFDFVrzngbeZWfpz{fg|\TTTTQNJGGJMOQTSQMIGJNTXWV_kc^bq^]YZofTRahsrislto˹}oyrr~nep]iqmwlmw|ϼ}{equ~Ȧph{qniYTchXNYRECAAAABLOGJOEEADIIMQOKIKMMMNLHGC@:3,*,25<><?ADB>=9535798:<;:=ACCDCBBDIFB:=L[VA7=GLNMKJLMPV[UF?FIED?:AM_cQBKYWLHIFB?>>====>@CDDCCA<8=do[efVamrm`YQEIZ\OB=957?CEEGEB;8;>=<;;;GRTL?=A@@BCFGIH?;>?=EONIFEB@ACECCBCIMMNJC?=<=?=:;975688877887:<9CelP8;BFD=;==:9::6348::64:EF=9:976764369;:>DFD>:76777878:6237:::;::549@BDDBBB=;72448:<;<;<;;@@?75455?9324796685-++039>>:;4/CH4+/>`T@9;53+/8=?CFFGGGHC;;><;;>CEDED?;9634;3+48;:524659?DC??A@>ONLJHGHJNRZbggedccb_[YWSOMKIHJKKLLLLKIFCBDEKVZ]cghknmmjgb^XOGEFGHJLLKIHHHIIKJJIHHKPVY\`fhfflsuwxyyz{zseXNFBAA@@A@AABB@>>@?@AFWZJBALZ`YQORY]``^\ZWVTQNLJHIJHFEEFHJLMMNORUWYZRC>@BGMPV[]`d`ODIPNI@>@AAA@AACFGGGGGGFFFFGIJKNMJFDDEGGGGFDDDCACEGIJJJKKJKLKMNNOPRQPPQSTV[ZVXYYYVNIJFDEJX_^]f{wy}zzlY[X]gnd_[TP]nqbW[]TV`dhlqrmosneVS]cjlic^_\XYTT_bmuwsvwsf[L?@>=?ABCDEGHHHIGGDeo`VYatiMFHLSVQHDBBKFS~gRLHGGHIJGDACDEEEEEEFFEGFHANLPRKJIHjqfHOPFJ[YKEGDCDEDDDEGGHILORY^^_bagsgPPVU[cWFILF=?^xRA>?>?AA=?AEE=MoH;>BIPVGACNq}{wmjryyt_F?kjVWRC<<=UrkRNTQOLQY_lvjTNTMJJLOUTPPQPRXXWVTXUPWWX^^_cbaabbbfihcbhvwiil\TTSQQMJIIIHHJIGIIQnw_Y_b\U^ifejdsxSQQRQNKHHJKLNQTVTNJHJMRWVVgtm`qiLlp`os^\jssqwmsx˰ƴ{|}w~}ndh~peqsv³վjyWugrƢrlvwnfa[_yrbVnTILDGHMNJGHXRFARd^WpoaWWXY[]__^^_``XQ[kmaXRTW}zTQp\MT~yNczynunpoWXeO99NI@OD\]oJXPT^PMKGEDCGBAF7EPJM>=CDDBD@EBEGDJNKIIKKLLNLJHED=4**,02=DDANWPS[^^YMGLW\WRUY\\XWWVSPMPUX[]]__[YXWUTSX[SB?FHFHKIFGKQVTSRPPSVSPV>EexqZPUZTLHJOJD=EOOJQ[^RC=:Lljux]NILRTSOKIA:<4289;;8310.6DG@[rondShrcmtok^Y[UUYbifd`[YWXXWPLTf:8LOV[[TLNUUVY]^^[SB109GQY^_]VPF6G_^Y\^`aS?;?DD@:EH?AB>>ADIOQSSTVY`d[IEKKIC:8??;633555@MSTPFAFKB32>HLPVZZVRV^e`OHHA8<;;;:;<===BTa[QW`\OFFG?878;<>??ABBBCC@:9<;>B>9=EJIHLKDA@>EJID?>><:9533578889<>>?B@GLE>=>AC?9;??=:996589:877;@A?>==<;:7568857>@@<:98879<>><747>@?<;::78>DGIGFE?:;537999;;:9;:9><964456ALNOOMG=;?EHHGD@B8+281/5@VM942/D4,06;><5/39;=>?925AKMOQKFGE=:=AA?<;=AFHDCDA@?>>==<===BGECED=@^dF35=>:76339=@BFCCEB???>:55;?BGOUZ]^`deVFHMPOC=@CCBBA@ADFFHJKIFEFGHJKKNPNKGFEGFFGFDDDCBADFGJKLNMIFFHKMMQSRSRQPRPKT][[ZYZ\YRJEEFIKK^srkrmeXX]k\\bec`[RS]dedgkg^WW]lmigdkn^\WW^cfjhdff_VSSXainovkjvnggXG@==?ACBCEEHHHGGEA[o`WZatiLGCDFHGFECEIACPNGGGEEFGHIGFEGGFFFGGGGHHGG@WoYWSQF@:9nxnjZFQTDBQVSMIGFFGGHJHIIHJORT[^]_gkjf]OOV[vmD=@CEDB?VovZ?>@?=<=?@B?G{M9@OSQO[RV׏IOgZSVPR\WScgbc`O?=DGHNVNCBCMzb\IMaWLLIPWWbxkTKLNHEJTZTOMQskOOUVRTSYXU`]]ca_abccltohm||vyvmomYPRQOLHEGILKHIJIHHQdph]]ZW[W|idjfdlRPPQQNMLLLJHJOSXTOLLLLOQRZeepppWf{nmjt~}yqu˻־ɶvx|usvndfvg]źΪy}p}LdzweyϿsnsvlmfggmpbRU\P]ZbMBBO`HHJYea^ktpjfa][WSQRUZ_aXMFRcnlbTW_Fmn\DljH_vm|xoybWYJ78O?@K?\[nSRPQ_SMGCFEDI@CD6KKGG>=ACDEB?C@EECHLIGIJKLLNMKJFE>8/.-02>LMGMI@W_]]`VJKSVQRY[\\XVWWSNKLSXWZ\]``^ZWUTQPTXPGPTIELNJFGOTRPRRRQV]ZK9Mo~}aU[_TMNUZM6-3AHHIRSGBDHTjl}_>CQWTPLJI@5557=>??;989?C@6ItxskZVoylnwy{m\XYYZ`egfeb]ZYYZZ[V`C>MKNVTMGONS]cigdbU?49DLPX_bXB84.?^gbacdbS@;GSXVPF?=<=<989<@>8459?GMLLJGD?=@DFD?>::@A:LQ=;AABA?CNSTSQRX`jmXEJPH>;=>98745767@NRSQD=CFA63:CHNW][VOKNZbRBGJ;::;;<<====ALPQX_`YQMIF?DMIEB@?=>AAAA@=:87C]pm`fvtfeql[XRDBHMOEA@<525:@A?95:DNPIDHLKD=@DDCEHIC>??=9<@@?@??@A@><EGB?@@@AA?=968<;8>HJFDIGCAA@>@FIHDA?=?CB@CEFDBCEFFDBBAA@?:86677787@??@???>>>;;?>>==>;89;=>@=9=A@:99547854566668;===:65:??==?>;;?ADFEDD>;<:8::9646:<:51643466669=BEJNH>:?GLKJFA<<@A835319<5,,6DMPND<>?4),24575253852;JB2-4DOPTXJ?A9228I@53332123234862-+1=B<71147<:502BJIPPA5467833767742/-,.22228AB<``lgaZQB8877;;8035824C:@;gT>Q_jlkhb[XXVYVLMNMFCC3.02331.06::;?=607AEGMNJHB;79=@?<:89AHHA??>??>=;;9889=FFEGJDCK`jcJ;?B=746;;?EA<74492-=DDFHHIJMB4OOMKHGFILNPZcffged`^[XTPMKJKLLMNOPPNLKIFCEMRQRUYajponkheb`YPLMNPPNLJIIHGHHHIIHHHHJLRX[_c`Z[fptvwyxyyzzuj_QEAA@AABBBCBBCCCEFFHHFFHS[VHCN\^ZY\]]\\[YWTQNLKIHHGGGGHIKMNNPRUWXYUJ@>@DKS[_aabeZIGLOSLA=CECCA??BDCFKMLJJIHHJKKNQRPKFDEEGKIDCDCBADGHJLMOPH??CILMPVWUUVTTOEKV]`^VSV\^UGEHKB=`|x[[Y\JLZ\eb\VXa^UU_edgjkgd]XXfoichtzncZZ^bdjhdipcNRYZdflnsjjxp^^dZ?>>ACEDDEEGGHGFE:IoaX[ctrGEBCGCBCDDBCGILNMMKFEFFFEFGFGGGJKKJKLMOPPI\d_QH@;57g}dGB@NSGBISYSJHGHHKQTOKKFGUVVUV\chki\X]ZWgO=A=AGLJ<<[aC?AAGMHB?D=mösF=@ABHTOB?XWjTMMJ^XLD@IFGK=I@:MECA<<@CFD=>B?FCDGIHGIKKKLNMKLGF@;72/36=GIFH;0W`NLPQKILNRZ\[^^YWUTQMKJOY[[\\_ce^ZXWUSOPRRZ]OCHPOKKOSRPQQRSV]YWIWw~O?LL?@P\XD314<@EKTWTTUUYfv`@,7JOMKKJI?.-5@DB??GMOOTK47i|zcK6N[S_g{sg_[Z]_bgid_`__``_Y[UJKKFC@CJOEJhpqmf[GEOTVPKF@96689;>>958?FJKLNMIB:9>CDFHE95?A:LWB8<=?ABINOOLJJS^djZHMSG78>=548646998:<>GVYTLGCBGOL@DLB::;;<<===>AA:=SeigfjUBD^tlb\UKA;=??>=:97658Mhppuslfgg]ODEMFGMGKJHV\RRYRF<===<>CFA?>@ADHGA:AOYRBAIGCDHLD;@FB=@CCB@A@@@@BB@AB>969?BB@@?>==?B<66:;:8=EIHHFABCDGHEDFF@=<;;::<::HTH:=ABB@ACA<>ABA>99==95268:>A@=;;<>@?;;<><94891:A@933214775300269@A=7;DGIJHC=:<@:35306:69ENPMGA76==2,/36679:=874/5IQ?1;Za[XH=;;KWGPU;5552/.(&)/6?:1.28<=720,/69;>8169=GG;69::<<:77776430-.34148886urdbMSRL@;;999878:;7<;48@:<~3@Xnmkkjc[VOb`PTNIHFB3./..,-/48:8;?:48CFCDIKIA6489878:<>@DGE?<=====;::99:;?EEEGEA>69Npt[C=A99==:;5*,2=NUJ::<75DD?CLLIJJ;.NMMJHGFHGFM\fhhjhb^\YUSOLJJMMMOPQQPNKIIGDEJIEDKYgooorrkdde]PIGJLMMNMKHHHHHHHHGGGHJMRW\_a`\]fotuvwxyzzywl]RGAABBBCCCCCDDEDDFGGHHGIQRJDFMRQT\^]]]]][XURPMJIHIIIHGGHJMNNPRTWXXWNB@?AFMYcb``c\LJNNTWM@AEDEFA>ACACIMLMNMKIIKLLOQROHFEDDLQHBBCCACHIIKLLOI?;@HJMNQUUUUVXUNHIOY\TKGNWVMHGIFGVhya`^]snX]_^]\^cf\TXaghiia\`_WTXab_kuurl]Z^djnnnovlTZ[]`aimjjpri[hs_???ACEDDEEFEEFEE=BrcY]gu|H:?FKCAAAA@BIMQRROKFCDEEFFGGGHIKPTTQMNSVLgbYg[J@<<9JdjWE<>LPGDJPVRKIHHGIQTTOMML[TQTRX`fhjep~rd:A>BZpnW@BOC?@@GOYbM<<~Ŀa?@@A@FRQD?BY`PA:UvjP=EeQIbjU^WMQIS`a[PPQRXNYkmpzjJEORYTYrpc`^^]Z`UCGHDLOIHIGIXniUNIancbiaTOGSXHGKJYlcR`ROOZP[au^U`|_Y_ZW_abccdeekjgjr~~qlm^LMNMMLKJKJMgu[NNOW^lg]itebhieu{wkcYWSTTSSSRQPPNMQTW\_^XZWcsnt~]u~jlp|ut~Ѹɭxlfl}spʪlo{zy{dnvdw}˴vefpkaedzwvrm_hazrhPQHUbYHHUZTaa[WTSVY^dlmkif`[]affe[fhsM\q\_{{JDCgdCYqy|qbRK;GH7E9>VRhNIGD[^K@:MHJK?O=DD?@<8:ADF@:=B?FCCEFFGHJJHJLLLLIFB>:4289;<67ABBJTZ`caZRR]od?60?RVURNJJ@0/8DD=>M_`\[UF.8TX`K>:YO:B]zvy{ha_][Ydjgb__aglfXYaLHRTJEP_MCFlvmfcQ>BNLKJDLftiE6ET\\ZYWRH?>DC=?DIKLORL=226:<=<:;@EIJHJKI@849AFJQOG<:@A:CJ<7;>>BIMLFB?=AGOVYTNNMD84<;6686578<:99:87AQRHB?@BDFE@AHF=9;><?@>85C]t|}`>Ikztqomf[H==>=;9889:7GijxtohdhfYT`l`?@?MXZYYRILYYO>8>FIHILGFIKNPRL>;?CJMC?CC?@EJFDGKE@BDCB@@@?AGHEC@:557;BDB@AAAAAAB?<<>=>?>HUTKGGFDCCBCFD@;=ABBCDEEA?ACCBCFFA<99=@<668988761.26527AB=;976789:;<<<>@?:753/27=BCBA=<;:7448956@A:8@A67;::9533342/+-26878;:55>>>BFD@;8=;4585;CGJPLD<7646:;414668;?=7542./@L?4GljfiS?>>Lra.$$"&(+-00/.7<1/5@@>;510-/16=C>7537<:78<@@AE@8757@EEA717516=>HHGIJKG;456777:>AEFEBA@?@@@@?=;;<<<>ACCEGB<altv[C49C=8K_WILMF=MMLJHGFGGGRbjklli`YVTUROLJJLNNPQRRQOLIGGEDDD@?GT\acdglkfee`UKIHGHIJIJIHHHHGGFFGGHJLQV[^`a``fmrstuwyzyxviRECBBBBCCCCCDEEDDFGHHGFGGIHFFFFIR\_]]]]^]\YVSPNKIIKLKIGHHJLNOPRTXXWXQFA@@BEQ]ca`c^OKOQTYWIADFGJF>=A@?DKLMPOMLLMNNMMQQLIIECLTPHCCCBCGIIKMGJTNCBKOU[VPTUMNUXTIDEKNMIBBHJKHFFFDEJVlrkpthlwqbXYZ[hl`Z]emmfcfd[X^YTSTWV^eeeh^Z\alqorzwqe`ZmenmnhdgbdfvwaE=?ACEDDEEDCCDDE?=teZ_ltN?=@SSLF=AIOMIIIIHFFJLJIGILRQRWTQJOXVTXcn{z=8AFWUPRSKF@?>>@AHYU@<ü£wS>B?@@COTH?FKD@?>SfWFKX]SNPhaZTT_U`fa\IMULT\bweTY_]T]ww^\mqnpjRBCABGGHOPJT]XYZTOgrs~wjOFLKILKOalp|cPPks_Jڞbba|XW[VV_aabbbbddcam}jjgnhLIJLLLLNNLczTJT]lp~x_unelvjym]gld\]`c_Z]\`aZXZ[\``_]`pvghq|{s~Ⱦ˰}jbhrк}}˸oahuuyrtxh`zlʱrdktnb`c{hК~vaqavojQeNWlgQKSUMcjlosrmkneZ^ghjjlqw}oP?RvjhjiK>EQlDX}l}ziTKAG@8E5>VQfKEBB^aK:>QIKJBQ9>848CFE:9;B?CBACFFGGHLGFHLNLKGDB<68<8=;LQH@5?IFKPUYahfVHKV\TLI?Xmg`YSMNI;29A;7HdmbVQPN947:ELVQbQ=>Upztjfcc_gnqkcbgjj`JT`GEXcYPRXI@Ju|mhfVMQNGLQKQls^HN`ovod^YPKGGGGF@<>ACIRWQA33=@<97:DJKIGHH@515=EINQKE@A@=;73<@@BABHID@:637:;@LSTQHA?:78;::::<88DGABEC@;9999:97=GG?=ACDEEB?=@C=98:=@CCBB=>McumLQgihhhiki^I;=>;:;===Q^_\RHBEPUL=6:@CDFHGGGIOXTG?ML@?B@;;;:9;FSRJHKKHDA>AFD@?>;;<:8;@FIIIJMNFCFFBFJGBACGKLKMLIEDA?@@ACDDDDDDBABFHGA:79=<401369<=7003557;><876789:<<;::;=BB9344115:41024436993*+16;??><978@@?;433349=DJG@=9534663466:?@>@@=6/-..--1531Lljmn\IGGWt\=9L>GdesyolY8583100247>BABFA;878CLMJD<=968A@>f~_PA>>ADG;68<=@DFLQSH<778:3D4Q|urr~xjsFFIILNJ4-.,///13568>>>@CDCCC@@DE731>XaUKGJG<;lTRgszcfncPWZY^\Y_jtxsbZ]]XTWWX[[VRT^ca`^[VWaiebmihkig|vthlla^]gilpiG;?ABDDEDDDBBBBF@:raZ[irUDJG>24=DJMKIHGFHHGJLIIIIHHHHGEDDHOVYSG==FMMFBA>=<;?E@EƺsSDBA??@KUM@@CBAA@OWG?KY]OF:Yhade`YlodSJ^n]]mbp~{km|xqs_anl`R[nkWPOJFFNUMIR[XPPRNKS\Yhnp|z[FGJMMNKTlydf`X]uuTaʴnf~lUWVV\aaaa`adffb[`pj]ablfNPRMLOOPNMW`_[XXexetvׇu|kd|zyijmutonlnrkdca`bgilyymuttz~tsnhru֩xηhmqmxgd]isvȭphqwphffwsŨwrwboilXqTezrbZaOG\kmoqstnowyuoe\T[myynSC6Kl]Y]N@COqL]t~d{qmpVLED=;E563Hang\SJMO:9;:>SaN]K:GWowqmnkqvyqd_dcWM6MbLJWZTLDDE@Mxvvqc\XPKRXSSZVQZhszpicZPLKKMLB;=>>@IR^ZB5CJC?96>IJFDGC:68;@HIHC?AEG?:<64LRHEFDBB??;754549JUYYRIJD88?@>=?@:;DG@@EDFHD<;==97;ABACGHEA?><:9;967:BHIIHEBSjw}|~~{~}kchggeddabe\E<@>?AB@?<>@@`yrkoial~{iNAHJHHGEBDGGCCD@?DILMLMQOH@=@CA>?>=>=9:;>@CCCCFFB<=DEC>:79<812569<>>82256:?@=8322478:;<;;9;=CA9322235:>DEFB;448::;:87;AD82973-...39?A?:31259=<;9:=AABB?<:;71/0148>B@80.1359<7234:DKJHHFA=5.,..--//.>VkjaWJIMnrtmvhG??@?=:879:76:>;2.//112358=?BC>=CG>=DBFKGFA<>@@Gi[U<<>?GTM95:=?DJIHOPC4/667;8~D>m{oXWz|{mAINMMPJ4-/-.//03578:><;@FJKJJJC<512??@@BB@=AFFGI@609MY\ZRTa{xal\_qreRD>@IRTJIIIIIIIJR^gknookcWPPPNLKJJLNPPQSSRPLIGEDDCBDCCDDDDEEFMRROOKIHIKJJJIHFFEFFGGGGGFGJMSWZ]^acefimpsuvy{{vo^H@BBBBBCCCCCFFEINLJIFFFGGFGGHJPZ\VV\^]]]][YWSQOLJJLMJIJJIJJJJKKNRVXWSJBBGJLOW`dbccXOPTVUY[UJGINOE<77IPBBEDELUY[XRJGIOKBHSJ:HezelI=>>>>>BFMND=>?>>>JTZG>8Lhuwve\|bHZ|xgdasppiad^w~qk_[\bZOLKKO_aPGQ__RIIFBTkfkpnt~{uw_HHDFJKENthNKM\|UЪzey}feQZb]ZZZ[_eedbYX\\[\]aWLa_MLPOMKHEM^a^[loÍonvtz~vll`equūyu½ǹ}plfãԲxkqdZ^oȨplvwlfjpqyw{}nchilayZnwmey[QU_`cfhkmms}~wfPHOWw}kOKTckfPQWWGEGfYfqx^l_\t~tXLIC==A68RTYTD?Dm_P:NTKJAHOIO?::69BHHF22:A<>>@BCFHGLMDAEKOMKEEFD>@A?97AFB5=D>=<<89BIKMQW[\YUVXWVVVOGDJMRSSUYZ[]]ZTUVTSTSSW\WJACLROMMOOPRSTUXUXx{M?FLLLNPTC@QJIH?8Nbsv{tf^bf[@.>FCKYQLMOF8>BNiywpi`TMB9DF?>TbQ`P9Vck{umssuvsj`SQJ??7LcNLRPOMIGFANntv{pbYUVVZ^YRHLcqquwyqjgc[MA=ENL@;<:9=DJXe[HIONNF54AIFEFA>GLGFGC>::AIKEAEGIWZLFGD>=><=?=:?GJMNRXZVLA;=BFEA>==@GKE?@FRXVI?>?:8<>=::;>ABEQQJJJFLessu{}~~xyyxwvtojlkR=ACDEDB@<:>AQp~~j`_[cp_KXSUXYXULECBCA=978?MLRXXQICAA@@>;9:=AFIJJEA>==>=>>@B?BGIHGGGGGFEEGGDBBDHLOQSQI@?@@?<=?DHD<;;<>AA@BILFEJHCDHIJGAACHNNLKGBBA@><=BEDDFFA;>CA=::7785348:<@A>822457;<732224789;;<==?@A=952..3436;;<;7567;GLJC>BAB74863..-.5=CB@;53229=;9<@BDCA?:359637843788643/16;=;77;AFLNKIHHHD7-./.-394/1C`bZVMIroĠsm_J=AIEDE?;7779;CE@9:=3-442544356;?>;EY`I>IFCIKNKCE>6t4AQ756:===@IKGKMD5156771Iu6FZT94^v[CLNMOPJ4-//.-/2679::<>@BFIIKKJD94469<@HNPOLKMMMNLKLKF@?@???ABB@@?@DFHPB1H^Y]uo\qxgadwyy]IBA;08LZIIIIIIIIKPV\elmkjdXPNOMLLKKNOPPQSSQOIGEDDDCBCCCBBCBCBBDGIGFEEFFFFFGGGFEEEEGHIIIHIMQVY[\^aceggimsuvxz{wiWHABAABBBCCCEFFIPOHFHHHGGGGGHIKMONNW^^\[[[ZXVTROMKJJKIJLLKKKLLJJLPTWWSKDBEMTX\`cbbd\QQTUVW\\UMJNRK?<>@@@CDDFILLMPRQQNMNOOMLLLOTVSPNMSTLFIJHHNWZ^lY@EFBEGEDFEEGGFEEEDDEDCDDDCDEHIHJTdu{okmmi_XSRQS_dca__ZYWRQOPUXUPQXXY_^[WSZltdYZZT]ixqzrmpngeimd_jZ@??ACCDFFFFEDDC@?3~uic_fvdLA8=CUqzlVJKMLKJECHT\UJFEFDDFFEEDBAAC6o]VeiUXTGM]nw`D;><969DH@>@FLLMS[]\SJM[_KCNKDbz|c:AABC@>AFJJB@CCA??8jȬ~weI>??@IUPB?BBADGIBALMQUD>?NmmitagbOag]S\h^[esmk{rb[bidVLNRWRIBFYdUFEAF`phl|{xw}kNEZZHFFQjeXTSMXhu[hyjPXaWPQN\aceeca^^^][UNKWhWKMJGFJJNctd]c}z|yfsyƺrhtkͮjxnp~_\dzĢpoxvibbvÿfszceehhk~chrpkab`]\[[[\^^YT]qePDBsnKFNmmQFDb\OA[foqp^`SNhx|`NKC?=<65NSSXE@EmaR;KWPE?NJRMC;5EKMLMNNPQTTVVRVypYPKLJKNTUHT\LB<9;ZhqTQ[\VA;LPRTZROSUPCBF^vzwl_SEIIKLP]i_cb?_na}{plu}uphb[OH<7AGK^JIPPSVTQG?OjXeic\TT[^`fbTMj~uheipia`[QKD74BH?7645;@FQdo_HEMSQ>/9GJJHCKVTMKD>???BDFFFSeaVYOEFC9786@KECP^]UNNU[]P;7?CIKEAFMOMOPIAGTXYTE;=@BDGIJHFEEB@CE@;:=DMVWNHHFAMiutx}~{xwvtfL>@DGFDCA=;ABD`|ic\G`vjceWZ]_a\PEBCFD=8778;>CJPOF@GWaYSTMFA>>>AA=<@BBBDEB?=<;=>?==?ADEGIGA=?ABA@@BEGIHIGFEGJJHEBBDCGMJD@@AA?@A?@FIJJIHGA:;@>=AABDDCCCDCDA=>GRQKHFFEA?=:;DHGDCB=:??<88;9899;;<>CED>72245663.-0136898889:;>?>:981**22.045644542;S[UNKME?:6641.0144:@>:752139?BCGIFA@A=5.2889=<6013325754>936CC@BDGIIKLI?65:92/UgcIIIIIIIIKLLQ\b]X`d\SONNMMLKNNNOQRSQLHEDCCCBABBBABBCCBCDDFEEEEDEFFFGGEFFEEEFHJLNOPSWXY[]_acfhgfiostwxywfPCBBBBBBBBBCEEFLMGDGJKIIIHHHIJJIHJS[]ZXXYZYXVUROMKKKKLNOONMOONMMMNRUWSKFACMW^bbcbbd_TPTVWXZ][VOOTSE>???@ABABFHFFKPSSQPOOONKJJMTVTPQTUYWKFGGHKQVYd[FDEDEEDEGFDDEFDEECBCCCCDCCEFFHKPZiocRV[^][Z]XTU`b\`qu]T[XRRWQMNQU[UVZ\aadhhkbURTZ_arkmttmg]\ksibiXA?>@ACDFFGGFDDCAA5ztdahzgMHLRPXkl]PKMNNNMFAFNY^TJEEHKHFGGGFD?7KqWQ]NAQJDGR\_R>89=??@CD=;?IXWIFLNPVQL^mdOKNIUyU;A@@@?>?@FKIGHGECE=Nǯ[K]`akvvxyrsxn`U]LRW[`ee`ebt}pjt}yyf]OU\TMclV\adcba``^[YSIL[`JLMJHIUWWtqp{dzϺŨ}lnyʺ¦k{l{}{``}Ӻnqwsh^g|ƶ}X}v`a_fivq_~yqfhc][Y\fnvw{rga_f|sWomK9D_t_B)VbK`[osriwb`LK`sjTKAB=:45LTSZIBFihT=H]SC@SIZJHA9KTKCFK.1??:=<>>?CDJPJBAILIFIHHFEED<@;B@E92>:::;977:>BIMOQTRQSUVURMMKLIGMSRUYZYXVTPMLLNQSSRSY^]TIFFJIIKMNPRRSTVVWx_LNKKJJOXXXXXOE@ACXbzUGPVY[IBORVTYXWZYRGE[pnvxpg_SPPR^einebjARi`}xmt{ncZ\[UJB?BNL]EDMPUTQRG>OiNLQYZWY\]ckfWOmudY^kpgadaQKRH13B>556668>HWdZB;@DJF85?CDEJUWOLOE?CA==;79C[xsWQPIGB568>IPLJU_\ZRNPQRP@7=BDFKSZ\[RNSRIFOQQVNBAJPK@>>?BEDBDJLD=;6:LYOFGFC8?Xnz{wsrrrplaL>=@BCDDBAAABB?Ln}tzcJlqcihYTIIONIDGLMI=65;?CFEKSLCIRY^UMMIA>>;8;<99>>=?B@==<<<=?@@??ADEFIF?>DIKF@=>BEGGIGDEHJLKGDA==?B=9<@BA?@DEDCCIQRQQJ>@GC:;AFCCC@<===?<<78:==<@ADC@CHID<625779620023479:8754225:;=;941466334554525;K[YSTUO?788620.4897GJMOKA?@=;779:=?:423530/248BGA>BDJRUQONKKG?:??1,/08@A<73DTQJ?AHJڶzuoVELL<89ACDIMA,69LB6:=AIMOMA>>20>IIJA65549@Ts~eTO@/LspznC=PNLNPD2-/15:<:79::=@BCEHJIJLI;6?D9//?S^gid\VSNIGGIKLMNKIHDBDFC@CEACC?\TagNGӿoYGIG@AN[_YIJJJJJJJJJJMRPJHS]ZRONNNMKKMNNOPRSQLFEDCCCBBAAAABBABBCCDEDDDDDEFFGHHGFEEEDFHIKMOPVYXY[]_adfhgffglqvwuqeOBABBBBBBBBBCCFHFCFGJLJJJIIJJJJJLPY[WVWWYYXWVTQONMMMMNOOPPOPPPOOOPRTVSLEBBJWadddcbcdZQSVWYZ\]]YTVWNB@AAA@@ACDEDBDJMMKIJLNNLIINSTTSMLPW\PDCFJJJW]ODFGGFEECEGFDABDDDEDCDDDDDDDEFEJSOSgfSMOPORV]e[XVZa^ertcX_dZWVSOOUZZT]inty{fafWEO`rtuswzmgcZbgnidk]GA>@ABDFFGGFEEDBA;wp`ahvaKWggWSSQMNNNNONMJEGHOYUOHEPZSKHGHIH?7t^PNV@6?:>B=:;:868>@>EKD=:U{N;>????>>>?BFFJMMPJEKIn˯i@@ABNXTE@ABCDB@bw[KWgKCHJLRIwFHUMFFMNdcUhky}}~|{yrzzl]\^M@AFLNG>BZgglmkhijaadffdkUVU^oyo_jqf^lrn{縅pic\tQROQYRIwtO\bbbb``_\ZVKOURITQSRP]jcşĵ̭ɞǰýxdr˻ɨxhwidϳnqvvi_ŧqYp[\Uhpz^xvqlkg]SUVWW`szmdXPikF>7DZz|jVg28XhOxlqt_g^iON]mnZNAC=;1:JWVYJGHgnV?F]UGEVP]GKKBUbQDML/6F98?<>>?A44438669<@EGHMPQPQRSSRONK_iVMRPQTTPNOOICDJQUTTRRUYZ]^YPLHGGJLMOORSVUSTxQ;DJJHFMW_`[TTNKGENH\wkVY[]^eNANRTQX[XYUNIImk{{yuqnaTTVZakqgXiAJ[]vxllobQJRUOHJE>DCaODHMHENRI?G[NHLW[]\[[agcXBIKMWmtkgcfj]NTYD4:=:;=8226;@A@=:98>75?OWUPRTIA@>=:5/6GXjn]PONIB69FQSOQTXZWXPFBBAB@=??;;I^^TPPPQPKINPOPRPNOPE88<>?A@@DIKE@?CIPOIGGHE>9@TnytpsujUG<<=>>>>?@BDECCBDUm{{\omWOIFA7:DIIJNQPI;8<<;>BB@BBABEC@@A?=>@@@>?ADEFFEDBEFJKGC;@C?==?ABAAAELNIGHHFDIKCBHECFNRQOKD@A@BC>=ENOGB@ADD?;9;@C<79879<;8:;<==?A><;?DE@963699;9;9855579:;:73/04<@A?:7=A<998667964GV][USWTD41:48;94/,,+6EGCB@BFKRRPOOOL@3AM@008@AB=:@KI=9;FmGYǽggqhACA:=BBDDB@AE@6:DWU8-/14:?>4356=Ocnl^Wd^H8?FND`I5?>ML@=AHR]ZM>:<639>FF>229:=Hg{E;?1Nr3-hN1ADINM?2./038;6358;=IJ<46=E]rrgTLOKFGIKNOPPLIKJHFFD@>@AB::ł`WIk׮~aTUWXYVVSUHIJJJJJIIJKJJHFGLRSRONOOMKLMNNOPQSRKDCEBBBBBAAAAAAAABABDDDDDDDEFFGHIIGDCDDFGHLMNPRVWY[^_aeghgfegjtxzreYJBBAABBBBABBBCEEDFGHJKJKKKJKLLLLPUWUSUWXXXXWVTQPPPOOONMOPQQQRRQQQRRTUSLEBCHR]bdedcde`TRUWYYZ\_]YXYTGABCCA@BDDDDCACFFDADILONJIMRRT[VFJ\^ODEFGHHQ^O=AFFEEEDDFEDDDDCDDDDEEDDEEEHJLU]VPY[V\cSOPIPTRXTS^_gc`e_gkrgVUTQXZWS^lrpmnjadlaTR]egcmxynujih`jj`fhS>>@ABDFGHGGGEECCFrs`]`fqeQWadWKMMMNPNPPNNRNHDJRQNHEO^`SHGIHH<]fSGXO?<;8>@<866658@B=AIE=<@GHD96A]y|pigb\YZVH6=pM@>>>>?ABCEEFKMKSMG[~i=@>DO[UE?ABABCIoyi~eJVWZswWONQ_MFKLKb_?H~wxccXFDDDEA>Y{uojdfcUU^[Y¼YPUXcjphi~{hYY[ZN{㹠zg\ZVNOOQSSIlgW[[`aada]]YTOUUQaXbg_nxȨѳԷ׷ƾƺnxwf˸ǵq{meuήmrhoƌmlhSe[ir{bqu^d_kpmf_VMGBIU\emhbYgzkK@WL?ITzZAwi:cyd\lcjuW]OgcQ^itþo]TEC?=2BKWSXGNHbmX>B^YOPXXWCNUJVdTFSL2CDFINQPPQQQRQOK_zqXNNOKKGCEIC??IX[XURQRTXZ]b\PLJFFHKMNQSUUUT\fN>CFGFDCKU_a]ZPKFGINWjgcc_`adOANRQNX\SSNJJN[qepjh}wob\ZY]lzrRlUJOTfqa[dji[FAFD>@J?88:[XB?@:DRPNFCMOTX]a_][Z`cbY938KYklghfefcULTTD70;OXTQXYLB=<=;43DRST^cYQMID==GNMMTZZYWWPD<=?@AB@<84>VXGGRUSROOSURMNSSMF?=>=<>><=CHKFBAXl_JJHGHJIC==<<;98A<@?DIQTQLECD@;>FQYZWWWVTPNJEC@?>AA@>?AEGGDEKLFDIRTJ:6:?EG<6@IIJG@;;=@@=>ABABABBFRWTLHJKC@ADD??DQSSUSTRNDCHF?=FKD:9:>@==<9:<;746669;:9;;<=<:5029=BA;75469;=<<:888788;==9515;CFDB<7:<9789877613GUUSUVWM=26GC;98:99?DC934794.-/6FPIHVYH32;A?<<<=;9<>;4011,3JOEE>9=DOTRPRRLA22AG90=CG<26BVw_heΫțS1LO8;AEJIEEDEDDDB8>K][A0002344334709YooieihU7ABDGGIKMKHHKG@;;:5Rw}hE?LKDJQTSPMONIINLGDDB>>@@;:_yswg|޵urԾxka`_]cni\JKKKKKKKKKKKJIJJJLOPOMNNLJLMMNOPPQRLDBCBBBA@@AABCCDDDDBCCCDDDDFFGGIKJGEDCDDFJMOQPRUWY\^_beghggegpx|~t^NECCCBBAABABBBCCDEFGJKKKKLLKLMLLMRUTQSUWWXXWWURPOOOONOONPRRSRRSRRRRSTTRMEDDFIQZafdceecZUUWYYZ\\\\Z[YLBADCBBCDDFFDBBBCDABGKOOLHJPRT\aTFYiQBGDBGHJXZLEEFEFEDEEDDDCCEEDDDDEEEEEEJMQY^[XYY`jpVQSIEGIMQU`dkdX\apv~wlZNMY[UQVah^VTZfqn_ZX_USV`ijguebjkopidib@;>@BDGGHHGGFECAIlwd]afn~qWLDFHDM\YPSTTPMMZ^IDLMOMIEEQ_YIFHJFKsPBP`=8@;;@BB@=:978@B<>FE?=@EA;?Tk|wkfd^\\W@>>>>?@AA@@@?FKMNJA\QTY@UFDPXSEBABABCKpxӋXTZgf`X\zz`U\PHCBIKE:Tlb\HDEECLZuwwxwlfgfZQOQSVKT[_Zk][]YPPͽfUTPPT]fPi]RXa`^qca]\]WdWklcmr}ļ̢ɱѼΜˤ¾¾Ų~~sȺwǣy~qudxyf|̩my|gjkihgJlrnouzhtr_SOZjvx{{{|{{}~n^`r~|jT@JkbEA?adD__BYln^eyUTA[tP_gjĻqa[Q@<>4FNRKVGSIZhUAD`ZXVXZQ?RZOQZSJTL4@H4GNC=?:HPLKFBCGJIILKIIHGEDGIGEDAC>331165799=AAEHLNNOPPPQQPL]uxfQMJGDBABHID?IY_]VSSRQSUZXXQNNNHFIKKNQSTTWY\TECDDDA>8B68FJKPG;7?IONTPCd]YY]_Y^^[^ccVA?IJJPcmiefd_QB;CEAAC9.+06888438859ABBA=7/8HUTTZXMD==??=@MPLOY]ZQKFEFC@:9CS\ZYXUMFB>ADBA@>:5;TUBDNRSTTUWYVRMIKKCAEF=8:;<@FHHGD>KdiXOHIOQKMNGGRo~xW79@@><:9879?BACDB@HSXQKHB><;56=CJJGFIKLROD9;GMMG?;>NY^afgb\YWXTKEB>?AA>=>@CEDBCKLEAIU[L948<9458<<:;:99:8555459;;;<<;=;6217;>C@976578:<=;9877789;>=9768=CFE@720025788763.1589GSVUPHBCHA;;;<;:::72236966>E?8>:8FN?,1=><@@?@@B?96323445LOBE=58?LRRRSTNC4*1<91=DAC??@@?>;G\bmsj}G`ͤS(044=C?GJCDEEDDDC;@RZV=10/01//2124.9XpqpolndKC>,nISXWY`XJMXmvoJ3=F@:>CB;42=-]\W{a^OBS0LxQ5;ED;93//0//.0348:<>ACDFHIKKKMMJC@??94Dhw\:;NM@ETYUOLPQJINKEAAB?>>?@B;?BJLٹĻfn~|saV_uuk_JKKKKKKLLLLLLJJKKKMMLLMLJIJLMMOPQQRNIDCBBB@@BBEGILNOPKEGFDDCCDFFHHJLKHHIJJIJMPQRRVXXZ]_`beggfhghoru~bGBCCBBB@@AAAAAABCCDFJLKKKKLLMNMMOPQPPRUWWXWVUSPNNOONNPQQSUVUTSUTTTTTUUTPHEDFHKPW`deeed]WTWYZZ[]]^]]\RC?BBBDDDEFFGGFDCGFCEKQOLJJLQY\^_TTaOAEC@FKIQ]ZKEFFFEEEEDEEEEEEDDDDEFGGHQSOW]`bc_[krpYVVOIMMHO`lnpoaU[hljvnWFQ\`XPVej`_`fklf_TRZYY[^bekvhPbhfjjh`gQ>>@ADHHIHGFEDB@9\j]bipxP>57;=OlgTX_[PKLZ^KHRROKHC@BKNFDCLDm]GLgZ77<<=ADBA?<;99?A==CFEFCEECJlvnmjf`QC=?BoeNHG<>?>>>=>>>>@@???>@CEINMQWqmUDMT^BQRPKJCBA@LzOchǿɿvld]C8>8MRH@SHTJScLJP[ScX]WL?BDHIGJLLMOPQNZeloaKCEFGGKOTMFLRTTUVVSNJOQONPOSWRJFJJJMOPQSX^]OFCDB@?:62M\VMRULSSKKSTS[ccaUDLTPQ[]UVOLPRGTg`NP}zunxmBapVTT\gj\D>F]g`MDFFB<>C;IH@?>8/4=IU\[SJI>:DKE@@?BNSPMLJGJLGB60NfnaKKZWLPWMBFb{x|lJ6;BCA=;;;:;<=>BGD<=LXRIIIHFDB@?AFOWQFBGLHC>>?@A;8;>C@CEGMPQW]UB;;>ELSboqaMGOVXVPF?@A?=<>=@?@>?ADA?IXXI:89:<>;9;=>?<=ABA>;89<><9:;89;9776569<==>=<<:77>DAAE>9:<::;;;==:876589;>=<;;;;?DFD822/1478887540/(0KXVVXXSKD@==<<<91-/13458?@BGIIA402640/7LE8D<667>IRSRTQF8.+-22;@@BA?>==ACIVdooqdetM=̼I7456881>HCBDCCEEA=A@?;/.11112231116IcoqtyojeL>6<[K]]cgrobnTDIF=@ADC>>?:Cɠyr~ocQGS.=qh;;;4/11000/002358:<=@@??CJUWܾزjx{z{ib]JKKKLLLMMLMMLLKKKJJIJKKIGHHKMMOPQQQOLGDBBBBABCIQTUXYYVPLHEDCCDFGIJLNMJILMLORVZ]\[ZZZ\^`bceggfijhddjw~hH@DDBBB@@AAAAAAABCDGKLLMMMLMNONOPONOPSVXWVVUTPOOORSTTUTTVXXXVUWWWWVVVUUSLEDHLOPQW_cddeaYUWYZ[[]^_^^_ZH=?@ACFFFFFILMGDHHECKROLKJIQ[^[\__UEDFBDHMLNX^TGDFFEEEEDEEEEEEEDDDDFGJR^^RTbjjf_Tabheig]UVWUVckilkeWN`\Zf\VOaegaZ[`ife`XXUUXQNUWWW[bcilkcjfba_`\m_A:>ADIJJIGEECBA9Ug]dluuI:649A>;?GOSNEACDWzqmmqdC9=<6>bhL;;=>>?>?>>>>>>>=>>>=>>?????>>AFKQHA?finBRPONIDB@ABNgmbJފNqeZRrt^ef[__}STOJIIHJJGZ}twQDEN\lmejo{~ofeif[RrUClkIWR֢hdc\Xalot]Jcɴebd]QJwX_Zyzh_x]to~qŻȢϻŮ͸ǿǾĶ~~~zľ{˾æcos~xnjjdquy͑jgnCcphryXbuul]PQQSSSUetwviX_hbUJIMOS]]VZLSl~Yrk{Yyl[]S?JzURžzwkcP>>=VO=9NIQFM`EPWOQj[_RA;VYBMKSWOQ=NE:OUQ>ILPNJJI?IOLJHLJNQHEFKHGB>BDCC?:7>19L=;::<>@BCBDFHJMPRPV``fkZHKORQQPSRPOLFCOZ[UMIMPPPOOSXXURNJHIKLNPV[\XPACA@BD?17BHJU`ae[NMPMP[ffa\MQY^^`a_QNORRHXlfOAgt|~nJYq_XU\b^XW[_a_XF?FECCIGCRa^ZLBNQQL=DV]\BijTH96Fajb]\R?=GLKH^pYKKRWH3.01245238?=51..05BJJKMH>?D8.48=Q^[KHNF@PVE7428HLIIJMQWRIEC>AXkYDF@8>EDGJF>>EMVZ[UIEHHGHIIKNSRB9CPVUKHSTGEQVLFEJQPE>JQ\SNQRQXZPDBDX`h~pSU]P?:=BED?;<=?>>??AA@?;?IOSVUQNMLHD@AMZVMFFNUUQG>9623:==AGHFEJPX[RA8?NhuqcL<@IR[^XKA>==?=:<<<;<===<;:<@@E[ibLDMMMKGGGFFFFEDCCFFD@?ADC@?@A@;89;987668:>@?>>=<87@KLE><;9>?@@?>;=A?965469<>=::;<;=>6-.568:<127<;/)2;66D;5854?PTRSNE=::4.19DMRYfnutze=Pb9:386635?GC>?ACGF?7763//23310256613=Rhoqxp[WI:2]|7JMXjvOAJKFBCDEFEHI7ʆMvzvsZI\-2\|A95//001000002357:=@BCDGJLLKKKLJC@B?<=87>>9@FA<@FINQRPLJKKFBBBA@>>@B=>GNJDЫ㭉v[eZa`JKKKLLLNMLMMLLLLLKKJJJJJIGFHJJJKKKLLJFDCBA@DIMQWXXY[ZYXUPMJFDEGGILNPOKGHJJKLMPTW[_ba````bcddbejf\]da^dS=AECA@@AABBBBAABEGHHHJLMNNNNOOOOONOPSUUSQPPPNPRTVXY[\[ZZYYYWVWXWWXWWVVWULIHLUXUU[`bcfd_XWYZ\]]_``_aaTC>>>BFGGHHHKPKFFHFDHMNMKKLQW\]Z]cXFCGDGIKLMRZ[RHDCDEEDCDEEEEEEEDDCDKOYbdZOYgjea\b`gnpmfe[U[\\Z\e_Y\ZfdbYT]behidaVWgheTHMPONTY]]\Zhun_fottqlbb\fwlRF=FJIIIHFFHILNJ\kcfmxsD8979;<>BEFFHNXUEJVMHNPMC?;77:DDF?q^P]eR>9:;;>EA:<=><;:<==;;ET[TE@C@:BTjrC5====<<><=?@??=>??>=>>>?>>>=>>>???>>>=>GRSH>TvxfETVPGBA@ABMVXVVFWe]hgbZX^_VZkYkgTLMPSSMK_s]FGZ^YNOi|vgUZ`izmUSDN~^OWEuTX\fpvnkbcJpub]aYHCCVͼslmzd}oz}θȼ~{ʿĺʿ®~~}|{՞ùϪqxwwv~wqnijzeafswÅtpoE]yzx}|gPWmyxk```cgcZOHINWbipz~iTEITSPSNBWsQXv`vs|_bWWX?JsWpźõ}{wheZNCETE8:GHNBJ`FOUHXg[UO9:ZMALL]WILEW?DNWVAQRRSKLFAOSLJIMJPRGGHKLEBAJ@@@B8C56?P?>788:<>??ADDEGHMMQ^`]de\\[WSPMMQVQMI@DSYUPOSTTTTSTVVXZYVPMIJLOTTU[\EEC@BB>12QhcI:Fu|`Rhw]TmeZUXchfhgfda\IBEGHJJI[k_IGULALPCASZWY9ZkMBA=DWgi`R?1@SVORa^B@EFB6//23445206BFEA;:@HNRSQJ<:AI<3989GPOHHNPSWN93636BHHKOQVaaRKMNIQ^TC=;79;=DGC>BMVVNHGDDEC?@ACGJJE=9DQYXNFN\^_b[LHKPVVK524@DCDGIO[]M?=?BBDC?<=@@@ABB@??AA?CQ\^YPJKKMMD=EV_ZJCRdcYMC;55>@BFYormi]OFEMTYZPB;:9;948<<<>@@@@=;?CC?<;<==;:;<>CFC>?BEECADGGDB><;;;=?GS\O@DLNPLDDEDDDCDEGGDA@<>HNKEA@CC:568873368;?A@?>;869AIJD<755;@AABDBAA?9422368:999;<;9>EGA96655579;6/-.06I\YRUZWNB:@CA<=;1,5=>??AFQ^X>31.22457878<=CFF?77>IQRWhtv~X<=Ks`?3426899=AFA=:;?CF>34875555441/3;@<=DShosz^JIF@@XRNPJYoZ@34o{}jPf-1HM2100011000003357:;ADBCGKLKIKMNI@>@>735<@=:=@=?B@CMOIKMLMKDBDDCABAAC?GHCBMZP=;98:DF>TlSVfX;6::;>??<89:7:=><<;:8BTZOA=?EB84>odA9====<<>>=>?>==>AA>==>?@>=====>>>>>>>?ACLaVSOfJm^[SP?=?ABFJJJGLKBjʮdXjjbWOZ_LtƛkhwaYSW__IGq}hssSN_YKEN\]WJDR^gpymUERSSPVVh̢bXgzwnaVf^Lsx`[`_[]crȷφtszíʶvŪȽƳʽ{~yt®ͱԴnvĮphswnundŸsddfgvjsysFTpyu{qbQVaenqpmhcPFHKF<5Bi}plwjVZkZKzMXoZP{\VU@@^mϵyttvxwso^XNJLC9@EEL=F_FNTDW\RMI3@UCM>W^KNFPS>HK[VJUQUWLQCCUSLKKOJMLEIHIIDHIG@=BA@=->HSLKBF\{u`Tene]Wckhjlkmc_LEGKNMHKicG7=OL9ALIJTZZVBUmFCLLHL\ibP@1NjbWT]P@CG?3-//022244227AGJKKLMLLMMD7EJIKQQPWc]RNOLJKIFCA><9:==AC@<:;>ELKE@A@>FUWMEDJVb`VKGIMTO@7302;BDD>?ADFECA?>>?@@A@@@@ADEBFT_aWKHGFOUI>EPWRE?L[]VLD<9:3345:@BDFFFDB?;=@A?====;::<>@BA=<;<<=>?AAAAA@>?@@?ACEG<9DJMOJ@=>?BBABDGG@>CEGOROJFCB@:115645677:>BBCB=659;?EEA85;CMJHGHIFA<622246998:9::98;9314885114776558:3327A<545868KQKHJLNRRF=>ADEGLIDCGORUdtxx~y`IHGA???;889;;;<>A><;;:9<>6/034443233138=ADEO`ouzdJHFEEKMPYUUZh{Ț<9AEC0S+5=DxtTq13;538@?::65:f[Cױ͖qjbeŒb\hgWKKKLMMNNPPPPONMLLKKLLNNJGHIFEEFGFEDDDDEEHOOLOUUUVY\\[YWVVVWVSOLKKLLLNNLIIIHHJMORPRX[]bca__`_^_a`]YZ[PACFAABAABBBBBBBAABBCCDGLPQNOQQQPNNONNONMLLMMMMKKKKIGILNRTVZ^]\ZXWUUWWVVWWYZULFFMU[_`aabegbYX\\]_```aacd[H>@@BDGIJMOPOKEDHJIGGKMLPUVUTVVX`\MFEFFHJLNPPV_[LCCFFDEEEDEEEEEDEIWeiloi]VQMLNTPPd`XZbfa__]]Y^cUQ\]\Qba^fkkhb\WXTZXXTUNQcggglopg^WS\od`a`ccdZoqllP>;JY__^^]XUSUOVwhgmwP@@<==<=DGIKBAEC>BJE;;<<;:<<:;JLEUYgdI>=;::;;=BGIF;GSVSNG>8?QSE;;=<>>====?@@>=>???=======<=>??ABQsb]~z^T_YONRTPLGN[^b]_|WGURPMm×lq}udaR\wOTlrgXZ^{ըѧʶ˼úww{zĸ”ûƼͽô}zzҿүã}p¾j`dqmYrlf´ǽrfgejxjp{oKTjsjylhfa`]Y`kpo{yngZMcvZfx}|\Ue|tsIo{]@jhXTG/sͶĹn`^gv}~|h]XRLC>>?CCDMVXWYYXRHCHMOQRNMMMHHSWQPTWVVX[]]]\[WVZZYVPKHINV_[OJ??ON34CNJGGCILMMMOPONP\kfd^chkjeXRL@Ino`G8=@=3=YJ9DT`z{h\P\old`aeegfb[T^PFJNPNHIQC59=@C@>KRKQYXWHH\JKMOOHN\XF=4K]ZYRYUJEE?50..035689<:425;AEDA?>?C@@EGI@7118@BDHG=8859BC@BIKNVVRPNNWWSKLOMIFFEB@=:;;43>@@FH?7=HSMCCNRC?Q]TPPIJUSMJHDFMJ649528@CDC@DQRDAHK?:Ne\GADC@ABFJGDEGCA?@@@@>AABFGEIS]\PIHA9DMG?=?DLKGGNTQI?68AEFGHGIHB@A?<:::;>ADFSfihgbb`RFA?<::;=AGJNQNLPROMIC=;=@?>>>=:8889=>>===>@@?>@@@?AAAB@=<<<;AIKLH?87;?@@ACED==HNNRSPQOHD@9246427<<=@ABBDA;79:79@C@9;JSY\UKLOMLC98:78:<=::99989;<97899533345689>@@?@69Sa_WB/6?>8;;0&2CC?98J]lY:266679753252.AQD=HK@45@@9997679?=864620;DFHHDBGLKEB@CEFMPLHHKKNduna\Q?=FIGDDIHHFD><;::===>><:6:@:.+/1356557769=AAFO^jiN>DA@AABFEKV_mt͛;9DEGILROC99A<<76BUYy~Wxx794ev50211011101134689;>BGGC=;=@CEC=>BA=<=<:78>BCBABDGT]RIJLJJHEEEGIFEHEPIGD>?>8=@CUϺuuo_\ehoycV\jePKKKMNNNPPPPQPONMMLLLNNMKIHHFEEFHGFDCDDEILLJKNOSUX[^][XVVWWWXVSQMJIJJILNJFFGGGHIJLMORTTUWZ_a``b_^][XV[QCCCBB@@AABBBBAAAAABCFKNOMMNPQPNLMMNNMMMMMNNOPMIILMNNPPPMMOPQTUXZZZZYWVWWWYWRKEGOUY\`aabde_[[\]_`aaaaabaVD?A@BDEHQTQONJGIJJHFHKLXe_SOQSTWWNHFFEFHKOPONU`^PECBDFDCDDEEEDEFIKT_gokbb_SOS_\X[UXVUY\_dhlb[XTRPONKYjbcfjmke`dZXVSRSQO\_^]_iibYPMTagae\dfVPkvoeQ7BXfjhfc`[XUWRTwgelwUCGE?<>@A>8>DNWTN^ffb[YTE>FF>:;;DD8:EL==mpB9<=<<<<<<<<<=>===<;899;>?>========<=>??@A>Fyu[LM@.5M?JHGaI@NSOAECVaHTHJYXWJBUVKNJPQIHAJDENCNFFG@EDH>2:TKG<8=:56999:;<<<<=?CIOTUTSTUPD@@CRQOMKKLMLPTSRTVXX[^`abb^XTY]_]XSOOMMT[WPK_mW22BMHGG@FKKIHIJIFFQecYJQajuvpbQEXkcXH@CB?7A\O@DQ\ttf]RSnhekded[PLEE\ULMNPND?86;@>9GTHAKNVYRM=2LNGENPJFLH:5115FXRX[QB=?;1)-7;?ACDA;3,*.27;:657;>@BCD>754;DIID>92/9BJE?CKJL]e[RV\YROPSWPFGFDA?>;;955=DFGGA;=??KZSGMX^M>G\aSIR[Z^e_TMJEIIECIJ<15<::;DUaehf\RRVUQQLA9;@@?=>>=;889;>ABCDFEDCBAA@AA@@BCCAB?;<@C>?CHJF?::;415;?CFDA?><;:;;:;;==9BS[\aaWSRSVN@?A<=AAB?<;==;9<>@>;;;;:765535<@CBBA:;Pb`VGCJG;6;=4)4EC>;:K]`G66:;;=:213662-=J8.:A<29D?211468:??:;=85439DHD=8;CGD?98:=GNIEC@>@N^XB9>EE@CEFHKNLJG@>=<9==5/06;=;<<<=@A>AEENb_HCC:=<624@Vdɼ{.4KegRUXTH@A@AKhJ>2MG2322111111133579::;@B=99<@FJJJKGB???9458>DFEFHHKbqY@DPRTUSRRQQTSQQSPOE@BFGCG@/^ƊhhWBCXeZRbkbYY\W^]QKLLMNNPPPPRRQONNNNNMNNLJJIGFDCEGGECCDDEFHHGIMQTWYZ]^_]ZWVWXXWSPQOIGHFHIHHGIIHFFFFEDEJLRY]`aa`aa_^\YWZYJACCAAAAABBAAAAA@@ACGJJHHHKKKJJKJLOONNNNOOPPQPKGEFGGKNNPSVYYZY[[ZZ[ZWWXXYZZWSLJNSVY]`a_`dc\Z\^__aaabaad_OB@@ABAFQVQQTQKIIGFFHIHWjdRNOOPRQJGHEEFHJMQSRNS_`QGBDGEEEDEEEDHOSMGPY_^^feVXfmoplilfbeeaalmd[SRQLJKSP]a^\acglnh]ZXRONLQUWajlla^_\aX_njghgfVTeqodRBSadggeb_]\[\XVxgdluXALOB<<@EGFKLJDAEIHB:99;::6>OVYSW[jaF?<:?BJQOIACSVRZaa]YXUK@<<;<<<@@@N`_I:LiiO<;<<;;;<;;<<<====<@DC;6<=?========<<>>???>@GSkdA8gi\QGFHIJMOIBM_aEBGKMHHLJEDGKEV{}yndgf^RGEEDHPOY~wjgZUnzb[[bWJGPTRQT[]\[[ZrXLYZXTVvzuhshke[VWXZYts͸ɶþǻΰʽx~wy{|~~ζϿö̻zƳƹӻ̫u̟z~kb_`]iiůz~qnv|~gzcZ^ccopdckcYbmpid^XIG]~_k|vqkawpx]_az[zmUOtfGcīwg[[TJIcmgiYAEF6CB0@PALEEF;>8*:H=NERW>COREBFFgKONFQY]M=HTUGNHSOKMEQ@JKCPEBKFGFK=FJIA7554=FGCAFIECP[WQYeaUQXae[ORKAA?>;9;ADFGGGGD?EIHM^gebcbKHL@888;>@CFF?4Cd`=/C^_J>=<>FQ[cfec`WRWVUWWM?;??><=@C@>@A@?BCDFHHIGDABDCABBBCCAA?<;?C@<=DHC?===>?@ACEBAEHGEIMNPSND@@B@96646>CC?<;;:9867:<::?=:=AA>:9868;?ABCCED:E\]QLPUQB66IA798HOB486;;??723;=;97<>4+/3329<84344547?@88B@?C;@GDCA>?FHDED>;=EONG=79>BEEGGEDC@@?>;===BEEFC6-5DC:7:=>???ACFB=AGIVcWJK@<><3.5Mfr߫S2;TriLFEBBNHEHIGAFHDSɇj\llGlA@9FZ0222111111223579:868;;9;;:=??AB?<;;:867:BHLJIKIPelSDT_^YU]ge_^`bVNJLRHBIMLPUK:.AskrQ7`eY[PJNawdSUZUKKLNOOPQQQSSRPONNNNLLLLJKJHGECDFFDCDDDEEDFHLRXZ[\`dhjkga[XXYXWWSLHFGFFGGHHHIHFEFINTXZ]cefdbbbccb`^YUX[UIAABBBBAAAAABBAA@@CECBBBCCDEGJKJLOOOOPQQQRRSSPHB@@ADGKKLOQTWXYYXXYYWXXYYYZZYTOMRW[]^_^^ac]XZ^^``abbbbcb[NA>??BEKNNRXUOLGEEEGGEUjdPLNIHOOHFHFEFHHILRVPLT_`VJCEGFEEFEBBIZe\POVVTWXUOYie_eplkkllfa\`be]TRUSPSXV[^[]`cjg_WVabZW]QYa]boodX]a\\boplhriaa]^rpd[Q\hefgeb`^\Z\[Xxgckt[AINFB@EHKLMPRKDCGIF>:8:;>?M^`RnfVcfSD@;:AKU]YOD@PWKMVRW`T@>?:9:;<=9=<========>?AEHGFTSTJQլ|jMFHJKIEBHNzQDEHLORPLF@@DMa~jWTRNLMRURS[{yng\Tg~nr}YYZbUHSSIKU]\WWWXZWZLWXuȴ{vzyqixya]a_ZVQVhYï̼ļƻʳŽyvzvzȧƽ|ձŽλʮvvhZYaabo˻{tnzpfoaZda_fozh^WaicXYcjhcb^^tywrpthSsrfr`Qx{sxa|^XZj_iԵ{ncXURJAAVs~kgbMFF:>7-?=:KFOI><6.:>AOGRPJRTDLIRMMQLUDPBGOHFKLFIHCGIIJ;D@E<;=33;7899:CHTR@OgSCGQD\kPQRNJIGA>4.3;BOW`ebWJEA<18KNBBKSL75HL>56667:<;<<<;;;89=@DDFD;1.6@DDCDIIHHIJLUTVXVW^ceehfVE??><;@IONJFGKKPUUQWbgc_[[QITbaQUTMJPWYWOD?===;;<=?AEJH?:<=>KZcdfghi^TWZ][XQC;=====@CBBFIE@??@CGHIIHA?>@BBBBA@@@><=>?><:BFA><=>>ACDEFC??BEEDHNROGBACE>67<<;>>;:89;;82248:;;;<<>O`egfaWPC95689;?BDEDB@<::>A@=8<@>9778;>ABEFBBGD;:KWPMSRSK>5;FCCIB>@BDD24E89>@<7:=@@>?A=541/014:<73345644<@:4:?A@BEEDDCFHIHFKMGDFIOOE<<=>>:57?EFEACEFFGEGLJBA?<:;=ADECBA:229AD@:8::<>AGF>:?DI[WCKL9<<:98=Zne~۠_QMdsY>4626RHACGGELNK[v͏ZHI=;97655699988;::@HLNLHKLJR`[[c]WW_qywwqcaVMGLZXJKQRW`\E0)2;MlkXm[MPVSaÍcTSWUKKMNOPQRRRTTRPONONNKIHHIKKIGECDDEEEDEFFFDEGKPX\`bhoqssrnic]YXWVTQJFFFFGHFHLJJMRXYX]bcdededbaaa```_\VSTVQHEDBBBBBBAABBAA@@BB@?AA@@ACFHJJKNONOPRSTTTUVWODAAAACDCBDDHLOPPPRVWXZZYYYYZ\YQMNTY]]^__bc_ZY]_```bcccddaZMDB@@A@BITZUTQJDBDGGCNbcPFKGDJMHEFEDFGFFHKQSQPU^^VNECEEEFFEDHR^^ZYa_^ZOLNV[RJP]\[dge]\ZV_e]TQVWY^UWb`\Uapq_NMUaaajzpw|g^hhaafdbbntslfa`aaabqlch\Xmokjhca]XW\_]whdku|\BEKFCCFJNTXUPGBBEHGC=:8:?JRWVW|S[h\GB>??FMORLH@=J\QIOPPRG78=<;:;<=8Bmqhc\ZVOLF=<=;;<<;;;;;;<<<@9Oe<;========>==@JPicLXdZrǍfgxbLCGJJCACBBfA=IORRQRRJA<@SuYZ]ZSOPXaWYSX~g_[Y[c]f|XPT[aUQWMFQ^a^\XUTWTw[I[˵douulc]VV]]ZWSVvh}Ϻžʻ¸¼qw|uuû¢û¸ҵģnaX^gpjtȸ~ul{y~{cwic|a[cagcwow{tjeifa_]\X^klf`VVk~o|jam~}t}YceUdmjxo^Wvo{wѺ~th[ZVKD?43M\srbf[K?6836<.8JEQIA:507H@@BBOgNLQNQLJI:CLUTGMKMOQRRRLPANNIIHMIJEFELCL8MFE=<>3/;7889:;EPTPNKKLI>68;;<>BFKB99=CLRUVZ^_bdedc`^]^[YXZ]_`^[_a_XPPVWXZ@1?MPIGGACDEHR[]]XJA@@BM\__\URQV`aM@FMKGA96513APYiymSRqs^K>ZH<@XWVECNOG>76777788:>QhX:\XB?A5359?DDCEGA1*9IFDFGIIKNJFZkXO^a^]\TXfmiZG??>AIHIGFEEINVVQUbeZXVTVZ\\VNM_]UTXWTVRF>:?HMLHHJF@DID=>BCHLKLPWbkle^UOKC>>@>===<:736;>=<@DB979:<>??>;:=FTn|uZD><:6118>DTpvbJCJLMPRPFAFGLQMC>>>ADHHHE;:CJHFGGGDBER_flrtpXLW^^WNIB<==?ABCDDDGIFC@?@CGGGGFEA?@BDDDBABDA>=>>?==ABAABBABCCDFIKG@=BDDEKPJ?@ADC=7:BEC?<::9:;;98;?=987779?Shkic^ZO=137899:>DFFA;77;@AD=6:;:7789;<>?BCCFH><;>LVUTRSRPF=???EACLHOH;BO>:=CD@?>>@;4211367;BB:4357639A>439?ABCBDCDIIEACIHCCELUUSNG?=;74:9<;;BGIFEA>>:5:BA:568::989:=FAAL?566:>BBWgIjΑkvcRbhS=DD::A=6=BDDJQP_fuF;7^?<7,[D63011122223469:::<>@@BA?><:989<<:9888>FJJKJFIMT_c`a^TRbz{jf^ZWM\fVT[YPKJE>>62:HOI|ՐoreVNMKKLMNPRRTTTUUSPPPPMKJFCCEGHJIFBCCDDEEFGGFDDCHS^bdgorprtutroi`WTSPOLFEEFFGHHHMTYWTTX`ca_^^_a``_^^```_]YOILOKFCBBBBBBBBBBAAAAA@@AA@@@CFHHGHMONNPRTVWWWW[YMC@?BA@@BCDEFKQRVZZZ[\\ZZZZ[\[WQNRW[]^`aacc_YZ]_``beeeeedb[RJD><;CBHEq\PcgSG??CAAAACB@96@[SATZTI88<<:::;<=9?j|rlbXUUTJ<;=;;;;;;;;;;<<<@;>lZ;>>=====>A::?MKclUVkf͚{dXXgndXQGGJGGDCDKQ]8BJMMLPSQKC>DXq|raTW]VLJRcrmdWE`w^ZTUVUR^[JQU^aRLIGO\`^^\XTVVRX{WQialqnfcca^][YUW²ƿĹºȮľįsw|z{z{Ҿȹƺɻ¥ȳk`_Tpvltsmwydpi\vo^\Yhpu|cdq{sf``_aknmlpuobSMMMXw|lzkTaybPWYY[Uve\[xǺwsjUTYO@84.1CQgle`U@348C;0>IILKA8835>JIMH@>CGRURLQKJSURUKOOJQNHGHKLGHKHMDG@QKG@AEB;2028DEDFD715JQKHEAA@:9DOXYPA?DFGPTJB?EPY^^Q72=IKC96557;DQ_nwlRSejPC97655666556GqdQRVN=:A97CNMKUba^ZUKHQI6ETQPOJD?<:66<@>?>AB<8>;758>A?=@B=78::;??=<;<=PfxgKCABC?64;?CK_cUMU][]b\UJCDDP`_RHFHEA?CMH9APSI@BFFJNHCGQY_a^KBNRNIDBA@?>AHJIJHDCFFDCBBCDDEEDC??ABDEAG\YFDB?<<=?;9:<>=<<=<:;;=BFIHB<;@A;:=J\ejcWOK=7::9997988;?BE@99:9;=>>>;756:CIE<<<7BACIHQKJROB>89?CDEA>@>=94013588:?DB=:98879>@936:<<;:?FLPNDAFKMHCCHPQQPF<9845CPK?@DEFHNRXabVG:6:=<=EKKHFCEHA9:<==9678999;:97675@9F=Íu~tH?EBDhlXL2/4;==?DNOUW`޲yG1S:,4-FZ;;531121223358<=;;AEDCCCB?>=<=>>=<;87AFACJGHIPvaJMU_btsvr^[YZn|d`UDFJE@<;:8A@=;;;<==<>JG=KIOP<6;::99:;;;8EV[cpqh_bi]D;=;;:;;;;;;;<<<>?7SwE<>===>>=MLRpxj`]L82CMECFETHKA8;45BHFMF:=<:BALa\SJLPGCN>DMWQRKNJKUSRQEOONOOHCFJIFKKLNN>NPKMD>G>3>?;757;?=<><5>CBE85;@DABD<1589AIMPV]bffdgjjjjgc_\]ZRQUX]^cc^^\VVYUO49HSNHDAB@317:>A@?DIMTTH<=GOPTWK=236MLCKUI72322003;FFDFDCFMPE538;>?@>BJMKHGHG9;FMLJIDCA=;;;AOX\VIDEO`ml`UMMNJCACA?>>=<>@AAABFD=9:;88<<8:<;:WpupUDFCACB>ADFFGHFBMcog^VKEB>=>Qf`PJORG@CJQN@;?AACGGDDBBBBACCAAFLMLKJECEECBCEEDDDDEFE@>AED:PVCEC>ACBBB@@FKHA=>>?CGKQTL@>?AABA><;=?=<;7448<>?<9;AJMKFA><=GHC=;9;:99758@@?<9889<7699:;?A@93028@FC?:5222:EBJDIK@32;A@DGIHIOTJA6.9HHDDCBB@>:53666568;>CFFC@B@<=C@66898679BMSQHGJIKKE@><:::;64307GOI@=::BIPORXUOH>;==>>FIE=78AKJC@@>>?=:8999;<=<<:9HT>78:998:=:+em寈r`~L78=UrpbK1/59:::CLPLF9fk2PF1QM@}xBED9322111335:@?<<@DECCCB@@@?=>@@?>>>DA8:@BFDGacJ>G^yrvu}zIJZWksdkjWHEA88989=>:<0bʠ}`ZZgnUBOOPRTVVWWXVVTQPPNIGHEA@AABGJHEEEEFHHHHHGEDGSWRU_inoqsuutttsrl\KCCFEDDEFGGHKNLKQWUOS\_`bcdcbbbaa`_``___XJAACDCCCCBCCBBBBBBBBB@@@AAACDDCBEJIJKMQSUVXZ[[]]SE@=;<;?JWZ[]^ZNCCHIFEFGFEDEEDDDDDCDDCEGFDFKQRSSWaZLIGEGJJMUXXVPHN\LQ]^TORTY][SKMLW`^[XTU[b`]_Ybe_OAFRff[SRX^\[\XVYPU_a[XTQXdkXZ_bec_^]cefbeqk`TWesund[^`\dnujbdsypg]GCLT]ccdaVIECCCBBCGGFDEG<9>CgzRR]TB??;;CA>9:=:;ELD<9AmR:=>=<@C>`Z>O^\RSRWd[vrJEECJNPPV`_[NHcPCMX\YRp}WADGIKJGGJJHEDGNUX[]ULHJP_rh[PB=BTZU^d][[\gq^`ia[d`PHLUVTSSPOQPbjQVbTQ\_e_l֠uqlghg`]^``]ZW^ò®Ʃ}m|qr|rýȶͬųŶrdedYϜĮtehn~{zt~lVtyh^PKZwsmoYfujmm^elhbdkqu|{x|~zmj^Se||jgsvu_PataFs}On_ʻnYLNLE942;WM;:6EQwy}ygc[F8NOONA@ZIJA7:06GDDH>898DFB954:=:GLRVW[adgkonljie`ZWVSPLQY[_c]XYZWTU[F:LUPIFBB=1/33/0:?ABKSMAAIRNA>=954441.3>HLMSTNM^yzHJMgYHMN`Y\c[^G546676798679:89:49SM@NjlcF^sYKJZee_V;,9JRbtvrh_UOLJJF=BMN@4587440/6>@BFJLMMOLA98:9GJIKLGB@>;;:?JOPMCCDFNbdOCHMRLCAAA@??@AEEB@ACEFB>=;87:86;<6BcdUMA??><@EGIIGECC><=?@CDGGB<;>?>>?>===><<=:878;=??64777439?@AHKJKNLC>B@879:97766>EFFJF?>@?<;9976522225<=:7621?MPLLIAHOJEFE=49<;3008CJKHGC>?DA<;:8:;<<><@TI8:::9987:8:j,M7[bB@;CflZI9026:::;AIKHC2G=RawI@oGGI=322211139@B@>?ADDDEFFDDDA==@CCBCCBABBACE@<99>F_uqyn;ETPckR\zoT<636998;>?=CӚnkktyoukOMNOQTTTVVVVVUQOMLIEFEBABBDFHHGFEEFHIIIHGFFILNOV`emprstuutttsog[JDFEEEFFGEGKJHLOKGHMW_baceecccbbaaa``^_^WJBCCCCBBBBBBCCBBBBBBAAAAAABBAABDFFFHKOQRTW[[\[\[NA@BGNYab^ZY\_^__]\[ZZZYZZ[[[ZZZZ[\_``acdef^X[`adedffggggaVRRND=;;BQZ[Z\\YNCEIHGEEFEDDDEDDDDCCDDDEEECEIOPOV]\WSKEJW\ZXSQT]bethb]XNKRUYdd_YLGMY`a_\_``_^[`qpdYKIBWa]USX_]^a``cfkd[\YUOYeh\_\Zacbbdb]\jorhfbhrutmgefecb]pqsxjacnoKBPZ\\\\YMFGFCA@AADFFFFG=;584@H?B?1765>IP^cWCNFD?@EGD=BPM;27WcUXRcbKNMTA355556788778878892GaO4C_jHPsX:Nszq`JEOSUenngidYTRI;;ML<:BD:4235316>CHMOMOQPJ<8<:8=CDFLNNOK>439>CHE?H\mtthQDJNUbUD]loxlJCKGDA??:988767CSWU]bU@CUZ]UU]iiRBP]M::AHLLHFLSMB=<;;9;CJKIEAABFPL=7BJNG@@AB@?@BCFEB@@?>BCA@?=;;:<>==FSH;7<@==BA>BN\figkiSGB>FPIBEIH?8Kry_cxoaYG=@B=>JOFCGHGD@;@FIGEFIKMONKGDCCEFCDFFFG]wfWFHCDHMNI@9>JPPH@@ACFFD>99:=@><==>>=<==::;:9:::;>BFHIHFEA@FMNLC;>EF==A878899:9989836898889:=>><::9:<=;=<:<@AA@94540BLSSXP7)/AFC?CMNKIII>63DICAEEEDDDEA8787877?IJFIMOORPG?=<9:778776457?LTOHB>>=<;;;840363.,,,.0.0FKJIIE@><:987679:9;IQ:776658:=<*t30Cm8071395?diN75877=?>>?BBAA81B\mQ@^xF7QYBG>32221103=BA?@@BDDDDEEDDCA==@FD?AB?CHKLKEBDEFDNb|[>JQJRdRS{}?&.58;=<=<8wxrwytqrdMMNPPONQTUTSUSMKKHEBBAABCDEHGGFFFGHIIIHHHGHIKRX_empqrsuuututlhdPDEEEEFFFFHHIIIIGFJR\aacdeeeedbbbaa``_^^_WKCBCCBBBBBBCCBBBBBBAAAAAAAAAABCCDDDGIJKNVZX[[[^\J=J]a\RKNX_ac]^]\]\[[ZYYXXZZZZ[[[\_`_`ccddbca``bddefgghkgYMNRLA<<=HUWWZ[[YQKHHGDDFEDFFFEDDDEEEFFDCDDDGLNOWZ[YYTHL\bXRUTW]__ja\WTOU[ZWbpqh_VHMY\VWa_YPMWbgj_SSQPYab\Y[]^cfdchrtiTMTWS]ebbc\Zfgijmb]\bgrm`r|ylkfjpmVAQWl{lbaZhxiMAKY]VSLFDCGDCBBBBCEFFFG=;Br]_ncG?ABDDEC@>><>AFRXB5LH?:9;78988899:;;;;:<:CpU:>;::::;;;;;;;;;;<<=;=Uqzf?:=<<@LRSLFC@FXd]TT[^Qh{N]hYIDPRQV[[TLVNT]VOMMMdgIEKJHJJEA@FGGIPSLX_RLSOHDXbQ@AGIOW_cif^bvoo|slhd]WY]b]SP[ZN|~TcW]efXaҠrpttrrdTQRSQaqhhüʺŮx~yî~}x|wвÜ˯ǻIJ·{vm]VYӸѢǩvgouv|hWxv}iu]T_z^ihedw}|nd\QYsvofY`~hNgu]XVE\{aRkTELK;387A?;7<>>DFBAJHE=BKE<77C@83AID@IVOGNWYZakniddfff`X[]^WPORVZ\[WTVVTRRPTXYRG><62265/3?FC?<=?85;@;5344447;Qjspj[NLROOcxZ25Ac\TMajMEESA4323567767656756862AXL6FOOAK^U6,134623@JMNNLLRPI:9@B:=@CDILPPID=9GOCKZWgmUNXM<:>9689::=75HWSXSGBFTc^CARh_B9BKD46AQYPIIMVPC;;;;:;ALNLMJLOPMMGABGHDBGIE@@A@@BBBA?=<=@@@CFGFDDDEFC<AA@@>@EHFEB><=@BCHYmwsofTGFEGFCBCBCC@EViromtkM5:ACACHGCBHPOE??BCCDC?>BEHHGHLPVXRMJIFEEDACECBACOhYBIDEKMLH=6???@CB;9:9:;:89=@DIIHHGCDMWSKB==A?<998889<=::>;6333789:89@HJJGED>9;>@DNUSRRRSSSF?:;;<602676748EOQSWRKGB>=<<:4/28401/-.//19>CFHGFJUYSOHC?LQI>69AEFIJIJKF9//37776777AUF0544446DO7FU.60]}`:73629547PWF=CE;7>8;77,caHWQEwƝPL?8~r:C?322211149<>>@ACDDDC><<=AC?=@A<8:=>><=CC>DJKFEOlYgC@LMJLNMOtj74;=>?>>:>̝mmz|~qw~JJKKKJGIQTPORSLIGFB>>BCDDDCDFFFGGHIJJJIIIHHIMSY_cmpnqttuuttslaVKFFFFFFFGGHGIIIHGGKQU[bddeeeedbbaaaa```^^_YKCCBBBBBBCCCBBBBBBAAAAAAAAAAABBBBBBBCCDJPNOTTRRMLWZM@CQZ`[ZZ[^_^]]][[ZZYXYZ[[Z[]^``aaacccced`_acdegggiklfXNNOJEA?=AZcWOKIGHKUZNBKYYck\J=ALSRUYUPKMSZVJJPQOO_RDHHECB??AFHGKWVMXXRUUJDDR^QIPUZbdhkjc_p~~}rqkd`\\^`YQOXVOV|bZced]tzܬ}srp`SabSPPQOcq˷öȰŠ}n}||xyָDzƵΦЪɿŸÿna}pbXScpͿв}osylz~}h[z~n}ngRPtbUgaVXoz{vj^Yaouuvz|tidk}|KX~mS^ƻqTHIK<46=:?>/2EENHN>4CKK:;?;D2,9IOalb=IH;LQ.=Q>@ITKNVXUES:DKFHGJOFECEINIKMOJHOPKQGIJJMKLD@<7?>GIDEABFG=AID@=HJGC==?:.023445544:Pmpc^XKABFEMfxf//4TP=;QhYGBWI61/2567666555545995@buJ+022?JDFMOPOMLQM@9;ADA??@ACKSRICA??@><;9;63Tyqn`MHB;>GL^a_b\RRIBD@8989:9833K\QEBCDKbkS;:DVK8:??<5>JSZTMIHRRD<<==;;?JNLPX\fecbUECDBAGOPH@?B?<>@CCB@>AC@?CGJMLGDEFB>@@??ABA@@DHGGE?::<=BJZinnoosx^A8;DJLFBCDHNLB?@BA<@HILOGBEHJNU]^VPNMJGDA?BEHIHB@JfmCJDEGHID;7>JQUP@79@JQNE?=<>??====>?AB@>;;;;<:9;=>BJIGJKIHHIBAA;=BB>889:;?HF;;B=101358;;74:;:898889=ADB>9::58>?869C939SWKHJQRWSGK\f]I?>3;==;64667758AHMQUWVSLC==<;4/3867:964421357:;DPZb^MC?HU\_ZN<5>GJKJHJMI;126::87646NY:2122224FFB;8;=??>=:<970DpZZbi>II6422213579;>ACDDDEC?>ABEGB?=9898;?@?=>==GKGFFFjjVk|ooeJDNQLJKJLKrƳS>@@@?>:HscpwHIIIIGFEJLGFJMKJIJKLQVYXYWRMHFGGHHIJJJIJJIHIMSW^cjmlosuuutrmh[KFGFEFFFFFGGGHHIHGEHQY^^_acccdcbbaaaaaab_\]^TGDAABBBBCCBBBBBBAAAAAAAAAAA@@@AA@@@@@?ABCDGHDCFJLF>?Q]^VTVY[^_^^^]\[ZZ[[YY[\ZZ[[[\_`bbbbbdea^_acdffhijjjh]RNOOKEDFGEHRVXWRONMNJCACDDDDDDCCEEDEFEGJXf]T\YXYWWVTPQUVVWW[eoj`cfeddda\UQV^gjbORYjtzxrcPSVULEEDVPIM^baeeZOHMSUenkjle^^cfdcaa`cehlqpnj`[ai`txpgip^RBOjgTOYr}XABCaWG=:9::6898889::::;::::<7;IC::;:::::::::::::;;;;<:>_iL====;c|K^eOJXf{zpwz|}~re`hruohbg|pb~pOSzrZȺkWHGG?0>?>C><>H]@;GFMQ@<<[rrlc]_UF57GFKAGA6>FC9<=YV,0FJRetZ7ME8PB.KR9>KQISWYJEL>OEGIGIO@BDDKLCFKLGGOOKPJLKMOKJD@=8@@HIEFA@FH=BGECA@CCD@?@MTQF=A?6,,0466645?UWJEJFA;?9:Ddx{>:HSVCFSlSJFYI61.02566655554469=GPV[ZL5,8`}eZ]uwokdeTJKMOQPNipndVNE?JSXejf?+038J\[MMPQOKJKH=9;?BB@=>?BJSVJ?=AB@;788;5;\q~yni\VMSdk]KHNHITO<9DA7:953@GS]YC79@IB:@FKNIB@B>:<@FHFC@CD?>@BBHLEBBB?>@?>>@@?@>?GKIC<:=>>ACFXvwWAHTXRNNNQPG<>Ml~xwvt}}t\GEMLGGFFHE><=>AC@?BMY\TJIJKOV]\UNMMJGEB@EINSMGPlnʴTKHA@CFC=9DHD=;:=@?>><::=>>9789=ADJOLIJIKID<=A@;<@B=8:;;8;BA;413468;;76565246657=AC@;7763:>;768>5.8DRHPVTRWWOS__H<818AH914515BOTTUSKFFDHKKOX]^UIDJLG@@?:>?<@B776663=QW\QSVYVM?=<;404865:<::970/2334Cazu^J:9GX^^^[M@?EKKKJHHE=547:98651=UJ8552223573TE045363;<7453223454=A?;98::<>===<853/=J_f@DC>MS5=7322113459;=@CDFFDCCHLKIHEC@==@><>@>>>?AHMFEEET^TDO{up[NMS[TMJLKEKsԳc@DCBA>BUWADfHHGGGGEEGGDCFHKNPSW\`cddfea\RJIHHHHIJIIIIHHIKPV_dgklptuutsqj`VLFFEEEFFFFGGFGHHGGFEMWVW\`bbddbbba`aaabb`[XXYQEDCBBBBBBBBBBBBAAAAAAAAAAAAAAA@@@@?????AAAB@@AA?>CNZZOHJRYZ^_^^^]\\[[[[[Z[\ZZYWWVV[_`accddc`[^bcefhijiijg^RQVQJFCECBFLQRPONNONHBBEEEDCCDEEDHMKGGKWfeedd]XSPTQQWZ\YVUW\cic_W]^`aWMT```][YORXivmkoaW`XURNWdm_JQYalldZSSSQReslcb^V\^ZZ]]_____``dhf^XahnzqfvifaTQERejkZRZi~x\IGFnaDBDCBDCBFED?=?BEGF4ToV^faRNQJ<<=?A@BA??>;:>>Hfs\E?=88888899:99::::9;<98;<:;::999::::::::;;;;<;?QM?==<9CNen`SKBISUPVH=CN[^hrHTVSQSQUjwcHJW_YijhiYGHdpZF@@><7=8D=7@GMNI=/Birspc^[YOGM@GJ>@DCKF@EIEEILKJNLONPPHJEB?:BBFGJDCFMF=EUQHB?BDGNTZac_]`cbbcccb_XSTURQQTTTTRQV]_WN^\J98887987>@HF7/179><67FJAAFE?>>?93:_ufcm_ggcXkTQSY?0312356555554467;AB;9?KZL5:nsWfd\GELMTTI>VsveWXJ=KVViva?,09GT^aUNNOMHAAB>:;>@AB?<=BISYW@7=BDB:77604Y||nwzTGNWRD?LW_^G48M`V@>EEFSZNEEKOI@=<;;;>;8=BHS`g^Zi[A87BPWC6876545DQTPJUpoP:<>=?@BCGHB?@>;=DKJFCA?>=<<99=@>>?@?>=<=>>==>;9GWN>=ADJPPD7E]^TVbmkVHLV]b_QCGauwho}YEGFHJGDD?9;?@ACB=:COVZXSPMORWSNJJJIGFECFHJMLFFNioȻTMJBBBCC?;;>GRRA6=CGPRB:>DFC@>=:88:=??A?;8:@CELRVY\VKFBBEA==;::;;:86552224637?@;654559<446533418GJXWSTZYQTWJ7310BI:,6:73;OZVVRPIHPNFFIOX^XM?69<8;>>8@F=>J77777=LX[`WONTVQD::77::7305<>>?=414430H{_H@;EW`a`]YTNKJLOLE?97887997634JR;5;94445672z-0357=?A?75401458:>?=::98:::;:9;964303Kde{Z@CCAOn3:8221113458;>@BDFGDAAGLHDDHKJDACB?=<>?CIIJQPHEIHB@=AhzuiWV\ZYRNMORSNuϋDBIGHIINVRCEt~|}}HGFFFFEEFDCDEFIKMPU\ab`bfdcb_VOLIIGGIIHGGHIHIPZbfgjmprtutssk\PIFEEEDEFFFGGEFFGFEEEHLS]aabbaabbbbaaaabba]URSTLDCBAAABBBBBBBBAABBAAAAAAAAAAA@@@?@@AAABBABBBBAA@EJLIFEGLSX^_^^^]]]\\\\[\\\\\\[[[YZ[^`ccccfd``abdegijjjihd\UWSLJEDDBACHKNNNNMOMGDEFDCDCDFEDKUUMJKP^ggptdWPLQPS[_^ZVTROHKRQNY_ej^RXdffdbfgj_`ca`]]][PJSRasi[MXSUjj^Z]YRNLSei]RP\nbKFQVSRV\^_afii`Xahkxk`}zkhaTOG_mea^bn}}]OUdjRSOLHECAB@<99;>EIB9Y[cgYRNNF9789;?CCCEE<9<:?_sUF@;8888899:99999:99:;:::::::889:::::::::;;;<E351?J74CIE:>FSURYvsu_V_\JJDE;>B=CI;:6?X65=V@WikDBKIAD,BDG?=BC=DKJGIKPTQTPFJFDA=DFDLNBGKQE@FGHHEA@:C?@GLIB@>=>AFKQY^\\_ba^`bcb_YTSRTTRNPRRQRSZ^ZNPUMC==;:;;;=??><>?@ELF61;EGC=BMQU_\I?>>@@3>^quvufflbK\ijdgN;<7445664444568:=<5./-3LSANVakaTPPNNH;/9R_TMZ[QU\ZX[H3+/=QYXYUPLLJE=<@@<;@BADD>:BHKY`D25=EHE=9984OeXcwrN?ADFFGLZ^M77?E^|uUXfXQXNBHWR<59956A^^JF^zf@9GKHFC@>?>==?>;=EJHA@A:69:98:;;:;=??>:9<=<;;=:;J\TEEFHQVNA;=?FYnxvdG8BW]^igN>EYk{n\bu{QBGGIIE@?A@@AB@=<<>>?EOTSQPOOOKIEFGIGGHFGFIQVJB\wy|vrCKIFDCAA?=<<>CEGVdkjh_QPWWRKB=;:::<>ACFC=EW^\ZX\aa]RE=99;>@@@@>;::;<<;733111106@HKFA>;699997=TUFSc\ROQUXO@?DEB:3103>EDB@955645aj`XNFKW]aca^]\VPONH@84479:88765@RD47=;55543,\:3347:=><97555777;CGA:9989997776653245DYFNQFAELR};:8221113358;>?BEHGC@@DLGDHMOMFCB@BCA@ADLSX]YKDHJDCGAMp~jPIRZWSQPQR^q\id8FIKORUQHGFAf~{GFEFFFFDDCCDCDEEFHKW_^]bdbabb`[TOKGHHHHHHHHHLWaeghklnooqssrhZLBDFFEDEEFFGGEEFFFFEFFM[`^^^\Z[^__aaabccba]WTNOPECBBBCCBBBBBBBAABBAAAAAAAAAAAA@@?@@AABCDDDEEDDEDDCCBEGILT\_`_^_^]]\\\\[\]\\\\\\\]]]]`ccccdecbaccdfhiijiihd\URPMIFFDCBADIKKLLMNKFFFCCEEEEEELVZVQNNQ\mxn_^ZRRTZ^^ZSPSWWNJKPVY^be`YYUPZecdcdb^V]c`e_NIOZW\aZUOWVPei]agXNLIOZ]\\alviPKS[XVS^fjqnnng]^gmlb_uzlih^RFdqfa_iyaOduebNDIHD>989;<<>GM=VdQbg^SPMLB866788>FLQN?:;;6Cks_J@;988889999998998799::99:::998999::::::::::;;;<<9PvnbTFBGSWNFGIJKNMRUBVWKIILMONUdlWRSaXO\UNPNMRL@EPNEAEHIMTTRUTSRPNLIFECCC[zxdvot~{vreUPPPOMMQRQPMKMQQMQZ_^]embcsgwjghg_z˭ּɩźzIJϫȿıΗt߿Ӫ̰Ͳ׷Ⱦt{{`\_{oɻĺznqls}xhz^|qj{hsBOSN[m|}vsuw{~}ysqkc\XVZm|]oizeVͭymsxoMGL=2BRCNHFD3-0;D40DIA=>\qe:6\q~gVW^SMBC;<@EPM;8AIJ.?EbBUi`?EEVEC2Wh9HGREMecLAAC><=KC:C@=:EJHFFJPRMRJGQKJHDFGHRKHILQJIEIJIHB8ANIGIEC@>87:>AFIPUXY[\[Z\^]]\[ZWUVWRLKPPQSSTTWWONPLG@9:>@@>=>???;::EH;19FD@FKOT]bO<;<>AGIdumctofWcfMQpl^h^VTE555564357;<==:5443'3KHLntT|wfqnphZTP>1126BGGVfc`d[?4421/@RUQNONJGGF@=AGHHHGFKJ?;?@?GN@88;<@HJIED?Kpp]UTVXTC@DBBGLLQN@CNLCAY}|myWVUCBMF:<<;BNVelZFINPU`[C59:;:7Dl{snlbfpdP]]C=RcYKLLMNLH@<:759@C?>AC@==?<9669;;=====>><<;:;;;;BDB?<;;;>CDAAFNQRPMHGIIGEHJHIIIIINYXVax{|{pvJGF@===AC?=>>>Gfystxyr]SQC9<<=<>?ACFDIburj_MNVNC;899559>@?<<>>>=<:524651//259BIGB:7?BABTWNC=?@@@>5OQE@LQROMLPWZURPMPRKFC@=8478<=67GG527976O]F1KZXX_^[_[OMQLA71201?GEA?=::62Cjg]aa\SPX\SR_edcb^VPI@97435899775;MJ4348=;8545Ab)36789;;:989=AC@<@EC<9999998887764566:JM7[ݏKMGCD?CEGGDBBEKIMPMHFEEEEFFHHHIUaejgOBGNNMQKDO\PA?FLT\b^TR]o[Xpz]?FCV`^]O?DJFUEEGHHGFDCCBCCCCCCDGV_`_cdba```_\TKGGGHHIIIHJR^aeegikmnotrkhcUF@CFEDCEGGHIHGGEEEFEDFMTRPSRQUWXZ^```bddcb_]SPLIKFCBCCCCBBBBBBAABBAAAAAAAAAAA@@@@@@@@ABEFDEFFFFFEFFGIKOSXYZ^a_^]]]\[\[[[[\]]]]]]]_`aabcbcddcbbbbdfghhhiiiicYUURNLJHGECBEEEGLMMLIGEBBDFGGGHNTYYVQNKTqs]_f_[VT]_VMHNQP^iVNYWVWSOORUOHZhifVV`ZVaknnb\XX[^ccaci`Z_ri\dbYOIEOVRXhy{woc]_epqa^cmyolkkd]eibZ]}phifXGcrdc_i{dIwnkF:KLE?88=ABBBIK;~MOfaSQOKJ@6567966AGUN:8==:cyqiNGCCEEB:>JMKLSOMDHNE?AIPSOPUXQUJYQSsaRWVHEIECIHEBDEJPSQQROOQVWQHB@CDCdy^Qd~~mqeck[NPQPPNORSSSQRSONOPW^^djr_ajǹľˬĿͯԼϛt۷άȹֹ̬˺xs`nXrvhòɻzxz^n{}q}Zswgzt\OlcZc_lw|~ym`^adoxy{|{wfPCG`uQTNXšojnraPAGM>FL:TQLF9/28@81:AKHNT_b7.?\umdWcVRMA49CJQL=3NI?3COhAUiP>HPTGCDpG?LMKK\Z`IAA@:7DK?;=;=9BGJEDIMNINGHRONLJHENOLOJQPNJFLKGC=9ISMCDGFB:557;?CEJNSVWWXYZ[YWVWYYXXXQLLMMORRRQSVWUQVRD98@BB=<=BD=7006??66<72>JJPXO93;;AANhubxoaQdjOMdHHeafkT51655547;==<;76;:5.HNDl~V/@\ksua[O6176:>BA?=?IRRVXWKCOOHFIHFE@?CA@DHMPROMH@=74U|qXPHB?=<==<;>CFEB?=<=>>?>858;;;<>@AB@=<<:;;<<=CNWbe]XOGA;9:?A<;BGGHPVUQG?BIIFCBCEEHLMNMMMZgdn~gboe}CD:78;CD>=?@>CV_empt~}aQMLB==>=>>????I[iig[E??71/3<=834:@><<>=;:8523664/015568;;941:DC?:77655556776210000/0/./16>?=?99NVF9;@A@?>>=;::=A:3DI96673CYN85BLJRci\VTSPKHF;0/01;CA==@?:50NwexlY\_]ZLBMW[_a^VNH>76557999967EM9/657??;95/w05689879<86<@CIGBEFA::<<<<<<<=??=;:<@BBBA=EոosvtkT;Nf15433233237;=@CEHGEDCCCIOOHCCHFFUUD?KYiz~zwZBEMNKNRL@?BCA?BKTZ[WSSTPNE=RCIQgib`WQSMGM_oxyrhdXSUi|FGHHHFEDCCCBCCCCBCFR_cacdb```^\ZSIFFGHGIIJJMT\`dffhjorsxpa\ZNB?CEDEEDCCCDDFHGFFECCEEEEHIHLRRQV]`accdeed_\TOMGHFEDDCCCBBBBBAABBBBAABBBBBBBBAAA@@@@??@ABDEFFFFHGHHIJLNOOOW^`][Z\][[[[[[\\]^^_``_`aaabccdeddeddbceghhiiiiifa[YUSQMKJHFFEBBDHJLNMHDEEDFGHHJPVXYXWSQP\jikcY]XSY\TGGZe^\ic[^_^_WQRTYYXajihXW_[]hopgb]RJILQYchnnhcdac```UEANYTRZironmcanqZZiqfbdhe^]\[]_vnge_Mctdb\bnprdD|o=?RND?::AFGFBH?UaIYbYRQNKE=8678:8799SR72:;?GFakH69988889998888888888999999999999999::::::::;;>=89FOK\vUGR\N>:;>aVNJDJHB>:;<=DNTUOKMOIg^J_Xak[aXC>DHHIFCAAAHRTPPRMLOUUNFCDFFGMNIGTs{rphhbQR[SOQRPOONPPORY[WQMLNRYboriVbŰƵ̳ʰ­ȸȿīȼҹȯ~ܰ˱Ǡֻ~Org_g~ƽzdx~~Zkjuti{\[ysrcT\uj]`[]ku}}hTV`lxuCEa®jhniQTO4EJAD4RSRU:7/;;;7A9M?QAKP@@ABT_ke]`XVN99GOQM;>QUcEAZTGGHZi6GJLSPXG^G>>;>8DE;9<9<=A=4978<;@GKBBHLKGHDMMQOMKHIPNUOOWQPEGOMC=8AMOD:@HLB54446;?CHLORTTVYZZXSPQV[ZVTQOOMKKOQTUST[\TV[UE??>;<<>@?62//16:9761.5:DNPC8;BFQNPn|s`vi\V[aEEcEGeXV]Y@14665459::::<>A<:DLDgkO<3SrMdtp]WF12?D@EI?I^gj_F955:DOVWMFA@??ADGHGJRSH?GTL;8@GE<68AAAEHGIKNOOOJ=@LK?=;<==>@A>>?CJNOONWirj^f{wS@C>;?<;@Odp|rJ7IWRRVTK@889:8@_yxYObum\aV@FKEReYKLHA?@ACEDAAC@=<>???>;:8889:;=@FGGC=:<<==<:;@?>K_SECGLSQHECCKV[ixo[jgbdN:;=A>=Ne[D@=:98CMJDA>BEB><=<63;EIHOYVI=<@EFJLIFJRYUJLPXaehjpubRcm^sBIB>>?DB===?>;;DZaRNUYUTJCBFKQC>=<;><99>=;:753224;>8112599;96564/7><;:87643468;<;98865544545:;=;;;77@E;6=@???AC@:;:6@SPMRQNLLLMP_mld`eh\Z[I<@B?=<>>?;5=H<8756IL:89=DCG[fRDMWRBAKE4-05=?959?<78CTzhdbTE@;<>@FMPPMEA?><88977:59KF2399;@A>93FJ.667778:=94:>@DA=CD:7?BA>>>>?ACB@?=?DJJCGWaoxfkwKx62310111346:=@CEHHFDCACMMKKGFI>A[VH@GpePQNDEKMKMOE>CFCAAA=;BOOGFHHD>MTIHPhp\NT\^SHHIM\f_XRDBNUPHDCCDEEDDEFFFHGFKOLMU[[_bccdee\RVLIKDEDDCCCCBBBBBABBBBBBBBBBBBBBBBAAA@@?@@@@?ADEFFGIIIIJJKKKLRZ]\YXY[[[[[[Z[\\\\^^```ababbcdeeeefecccefghiiiiihe`\WTROMKIIFDEFEFEHOQKFFFEFGGILRWWVXZXTMJ_txaNTUQScbMO`geVRZ\YZ[\[XTR\gffhbc`ZWTVchb^\SLFAGQXaZcad_S[hlghaOEO^_TPYdhgdccqxvq^[ejY]aeb\ZY\bhyyrfhgSbqa^TPRNX_:_RHx[6HXN?:9=EKIC:>:{}MVf^WUSOIB:866789887[jYL=;@Sb_G4698888888888878888887999999999999999999::;;;;;<@>?=h{nPBPlr\B3LxPN@FFE=<:=CLOPTQKMGBDa\c[_x~fY_UACFJJGC@@@@BKONPROMNSSLIJJJHFAAFBQy}tkOU~bUKORRQQRQNMMNMMO[]TPOMMNUenlbXoijǹĺǯҶкµĬþ˵Ϲ߯ɼѽɸ^|dqr{qz\}h_sna{b_pkwwgjrw\[botqlpod\TPOXyoƤqG7otdhn\BD\C.J@?9Vfjc64-<;AE`FC>JC_BCLQC6E]q_[VYXRBFRQO9QH7GIEdN?PUHS^DGLQdS7FEJbVQD^E:6BGGC;/3;:8=>;2695;??GM?EHIFFBBNJSOLLJNNRVOXVSLCJROA7:GMJ>>BHI<354247;?DGJNRVWYZ[XTQQX][TQPPPMLHKSXVSV[`[ST^ZLEA::3/1575346750+-5AHD:=>ADEDEJNNI>:CKA7>EGGD=>A;7AIID@ABB;:88<;;LfvT/=[`M?NS?7=?=;95D^jfL>OchjiSDRWJPdgYOGA?ABCCB><;99;?AA?<99976779;@HJJG>;;;;;;9:>>H]UEDDCDDBBBCJNMVn|yvsaYf^B7:@A?FOMF@96:@FHD@>??<998:AIOMNVTJCDC?@MZ`[Wbm_KHKazppqeyysAICBCDD@=>>===C\ocSIFJGGF?=BP|k@;=;<;:::77AJKHECCEC@>=>>=;;::86433315@B91346:@@AA869;8:CJJGHKMOPSU[afnlhjh`ZK>AC?=>?>=<;>H=976699788:73317<>GI@?CE=89<9767BK>46758EC?:5{/02598656893568;<89:8:AC@???@@???????@FFDXa^d^hxyx^:YF.221222357:=@DFEBCDCCDKMNQPJHGPUHJPNgxzwVOd_OSZZVMHC@DFBEH>24BPOGD=@EDFJIH]weB:EOSKGIIGIMKOSJAECJQIHGFFFEDFFECCCCCCEGT^]_cdba`^ZRGABDFHHIJJJKLLQVUVYdlnnpuukXKD@ACBBEFM^knkdXKEFFDCDFGGHHFFIJJLSURW_deegibRKMFCFDCBCCCBBBBBBBBBBBBBBBBBBBBBBBAAA@@@@ABA@ACEFFGIJJKKKLMPTXXWVWXZ[ZYYZ[ZZZ[[Z[\^^^_`aabbddefffeeedefggghjjjjgd^XVTQONKIC@DGHGGHKPNIEFEEGGHLSWVUX\XSNNPdwiQNOLRyrglYZad]ZXUTROUSJWfcfkrghfWIENW__^_ZVUXhsqgaeY_]\VY`[\fcTRX_[X]cii]`pokgd^_ii]_`eaYZ[\_mvyzfgrnXbh]^SIMQRj4=;/=O;5GSI96:COOJ?61N\Pbh]VUSMH@7666679;7=mkA9BOYD26:88878888887777888888899999999999999999:;;::>=JgT@H\uylXGG`{t`=rߞTMDGECFFBADEEHOPLPSB9GOvmlpl`X`YTu`KD?=<>?@@BCJORONNSPGJQNLJFDFGCXqqrlRD\nZMMRSQRRSWOJLJKOORRMNPOMNTesxrd|wƸ±ǹķٻҴʻɿƦdzи±}Ǚ~ðvp~zuu|`|cUjwgl{|zrfavwd]h~z^Zckni]UXfvwlZJLRY_JEup]FKƲk_hnU;8KR=KD8@BFLSWYXXYVRQRTVTRRRPMMNIGQYXRV]a`ZQUXWQI?;;?9.1@IC9455540..2;A>38EIHKFEHHXnRenMB:8U^CfUG[B?@LK5/443545579?HG@=<=^v\VK66142V}sVH8215==;9@KIDHIB?A937BJJJKKHCEEB?@?<::8:=EJKJJMIECOza?<;=>DYp}TJ[gg[B>B:8AGE=:;@JTVI:;DSijTNWUQT[_YOIC@CDA??@=98;=??@?:556668:::=CEEA=::;::;::>CLJG^fQ==@@>=@KQNVo|jcYPPD<>?BPWOJKH@>??DKICBCGHEB?AB@AGIHJQ]^YTSQJJIAALZjeUYkk^WPMr|nohM@C>FGEC@>>=;=I[``e]QONRK@>@T[5>::;<<==@KRN?<;:98876764204>@;:88:;AA=85966777568;@DEC>;;:@>?@9;;DONHD?@EC739>;51?MF966557@@:0QK2/04;>;58623556896578:==???@@@?==????@A?Mf`\r\UGDFWpO57;;:98557:>ADEDABCCBABJNQ\WSk|idje[FO\ZdYP]ZPXdlmV@<<=@CKWairvttvrga]VOJFGHIIGGGHIILPPOPW^ejiil]GGHCDCBBBBCBBBBBCBBBCCBBBBBBBBBBBBBAAAA@AACDDDEDEGHIKKKKKLNQTTQPRWZ[[ZXXXYYXYYYZZZ[\^^^^adddeefgggggeeefghjjjjjjfa\XVUTSOMIC@BHJIJNOOLHGGEEEGLRVUUWYXVVTMQcg``mpo|UOYa^^VSUUPR]ek`OX]`^[[UIIPPV\_ac_Zjuz|z~rjlbZKIKRS]ed]X[]VRYei^]qrrseVYhihb^cc^^\ZZ\c}e[q{p`dkdaYMVkVvl:5?93258@HC76;@IEHF74lnT\fbYUUSLH@6666678:5>ttN9:;997897666777888777778888888889999989999999999;<85M`^bQHSRMPNGDDOkunW߷U?@>ADKICA@@GNONFLcWEG\whehkcg\z}PH?::;@DGC?FMPPLKPNEHPOOLIFEDBKObocPFShYKOSSQRRU^YIHKMOQQPQPPPOPUf~k|ǾĪϹƟƹƹǿҷͫմʭиɩȣr~}ymju~}aYPizXpvxqiMNl~sb`slcagqtjYQ[o}|r^PUaZRUXeTdrr~Ͱwf]hgR;KTSlXRB1;\JJH]?G16;:E<8F3:59FD;LHGGB@>8EJCEGFFFHKPP[SRULJWR=:BIGHECB?E=56665679:<>CILRVURRQOMOKIMQSROMOOJEOYXQT]___\WTVVUOFA97=FUVG74887521/14:C8/:FE=<;;9JnU]hRGF=H^Dc\NZMVXI;64566334469@FD>:9Ug^[D5211nR5Oox\E837=GKORUWVVYK8@QTTTXVNPK?=IPLGEDDBAAED@:8ATYLFIJIEB:78=FOUWURMEECB@><<GIA:?@>@CB@?>?;558:<>?=9:<CC=?[l\?6?CDDBAADJN`z~tlxoJ>CGE>Fbm\H?AEGC>AGEBBDFFEDCBCIT[YUQRYaeVLGFHJKJIR_XEKjyytZESxxyNOs<<;?BEGHDBGHLSQIDBQD?;::;<>EQ[\UD<>><>GIEB>979:88:;:6555<@BDB@@?=<>@8258:;60/53148<@DFE;37<<;978;<==9537455774469;@GJEAAA?@HRPGFLPTY`aaf`UqUGVYLC;:>A=<===<;?H>7=LL?7;=BFIIKMPSZUJGLQLC>96=@C?:;HKA<<=>=42@5:uf76113;87;>@AACEEDB@@??>;FYR`jSTLLR__ZMDJIGFB<77:>ADDFHEC@=9:EGHWXMb|piae\R[dhslG8GOPVe]OlkNEJGITH66=?CEFFEGJORSRPLIGBGUgaUJGFEFFEDCCCCDDDDLY`adb___[SKKJJIHIIIIJJJJKMLKKJJNW[\]bhea]WNHQ_imnprrrtuttrjbZNHGIJHGFGHHJKKLMNQY`a`daOAEGBBBBBBCCBBBBCBBCCCBBCCCCBBBBBBBBAAAAAACEGHHHHGGHIJKLLLMNNMMMRZ^ZY[YTRSVVXYZZZZZ[\[YWV[deefghhghhfedefhijjjjjhc_ZYYWVTQQNHDDEFEIMOQNJHECDKPSUUUWYYXYWRLPX`n{ytVOSX^\PLRXP[ukQT[]YWTQNONHMVZa`Z[[eoxwqoqdK>ATe[LTaWUZa]KJYd^Yk{xd\chjc`cjjcchdSO]~`d{{nehxmdYNQg_c[>7<:9988<><8787<;FM3JrRRbf[TTTSOI>5566677888QV>1487767776566777777777778888888888998888999999:::9?OEJbefNDUYMEDA?AF]pc[bXUDFJHFDCDHS^]ULJ^\QKwuekqo^|MKA;;;>GNQMLLMQJFKMMKLPRPJC@AACDW_QJHM\WOQSRPQQR`jUHOQNMW]XRPRWXZh}|ʼ´Žַ颹˧Ӱΰ͸Ծ۳ʺĨϽȻʻrxs{|v~lcnwr}`TMj~X}ghscSScqyvkdhpqnaSPSY^]\[[^d_ciYOidcF@E_̱m\`hULC9HC?A?=QJC}f?MR;JQF6GEFJ4B@@YQK2$LVPKRXTUaVMQLV6CKQ41BPUT?COPOEa?KG;JLEE@A>6FFBCDDCCEILPTPRTMPWLA@MLGEFD?;A<896756:;8907ADFH?74357:>>73Lmhg]D801-616>N\H0-47?NWZZ\^\Z\ZI;ERY[]][RMEAFQRH>9HLB;DUZTKNLFJJ?:=??BJQSSPJEFFEDCA?@CCCCFHIJNOIH@9Jq|w`B=A>>>B;A{k\ZalwoKC<9;:;<==<:;;>?7@`o_ICKROHEGD@@AAB>:?@?@?=;::9::;@HMOQPI@?DA:FRK??NQCDEIKHEEFNZegp[CGLI>?S`R=6>FHGCACCB@@EGFDCABNZ[]_XNLT\WQW[KFOPHO]P@Tw~~}|zW\ZTHURMF><;<<=>?CKSC:>>DP^ghVJne^D87=AN[ZXWMA===AIKJHB;78:99<<<=><9@=@FNOA15<=>>;88789653433455345747CLJEFEB?BQZRPROR^gfdgaToPBOVOF?=@B@>><:96:G@9;DL?7AHJMKGELRW]WRQQHBAC=767742446940/+YɈyftYEGPG>ABACDEGHFEHKB>DGFFE>:>9bu=<<;AB==848>BBCGJLIDABBAAABLCMa\`ZMFMciTQ]XJGJB87:=BBDHIED@959ABBIKCUƩyonnkgfhihor\MfwhhagWIGA<:?BACEEGGGHNRROJFINdong`ZQJGFEDBDEDDDDDJW_cdb`_^ZQKJKJIIIIJJJJJJKLKKKLMORTUWY[__]\\^^dkhioqqrrrsttspi`VKIKIGFFGHHIKLLJJKMORRQND@DBA@AAABBBDDDCBCCCCCBCCCCCCBBBBBBBAAA@@AEHIJKKJKLLLMMLLLLKKKPY_[TVYSNMPTTUXYZZZZZ[[\YVTVZ_bccdffggeddefhijjjjkg`[ZZYXVSRUUPD=BFBAIRTNHECFPXXUTVXZYYYYVSONYg_Vowju}cVV]irbKO\WS`]RUYYXXUXWWYNPW^g^OTXbltqjchpm^M>D`lXMNKJS[inTBK[_Z`pvvupb]bhbdfmqihxzfXa~}xvqghzj_UPN^tz^:699998799:9776:8FM8a[?RgdVSSSTQG;6656667787755578778777566667777777789:8888888888888788899999::8<]la^fp?DVTMORTUT_meQƙ[WND@BDGKRaie_VqeNKxw\akiok6<=::;=CMWZUNMPIDHOQNOXVOGBAAACFJIEFHIMPRSRQQPROZqeQPRMM_hbQKTasunȶɿ½̼խ©Ó̧կǯŨҹϜľǡέ «ļĤѨzʸmmg•~zt~rvlenocxbVLo~yWvajyssqmlaWPLJLKE@86>EIQUY_]^eWAHjz]MKG˰jSekKBG?SB598Ha>FxrWD[J4NVPD;BR@-617VOF*)HHTOPTQWQQP[DJ0DVF/DWaOI>RRVIJLCJI`mPVzh=4S_]PjD_L3G/>PJW<3FHNE@BBBBIHJVRUSPOWYNLMRNMIHF=8<::98856=;79;>BFIKLLMMJE?DOQLMPORSLFHNRRRSRRSTWZYURRX][ZRPRHA5,/441..//012@FB>@BA@BGLTuWOimltnS7Mb^^UTBHJ?38MXZ\YI;555699-@}mbfbV;;5/&&?QI?7-(0@JQU\_^]`^X\YHFPV_a`^[TLEHNOG=6/2>DABFGILPMHEEGIIGC@?AA?BLPFBFFMUPB=UwswI:<@??@@GlbE@>DbvB8;:::;;:;<===<;:9;>;?QZRMPRQOMKGA?==@A;8<=CGE?<;9:99::::;<>?DJMJB<88889:;<831358=BACGI=13:=AA;76445443211234345623>IIHIF@>;ERRQRKLend[]]TiSBM[MB@@ACDA?>;728GA;:999::;>B?@O^__aRQQRRRTTLHD;86229=<54:9]溈zxU?CGFCA@@>@JLGEFJHGOKCEFEC8EqW0),BTK>;8:>CHF@<<;::976=B@@ADEFIKLLC?BBBBEFLICk`\b_VJTl\LTXSNJH?879<@CEGIEC@83;DFFK_{͘w|{rttifgigbjnrzvcVY^cn{sRHG=6?LMJIIKJKVYMJMEDXoaNsrplibUNIFDCDEEEDEFKWaecb__]VLKIJIIHJJJJJJJJKKJJIKMNLNQSTVZ]]^_adhgejprssssssssrplh`SKIHGFFGGGIKLLJFDDHGBDC@@AAA@ABBBDDDEDCCCCCCCCCCCCCCBBBBBBA@@@@@BEFILMOQQONNMLKLMKIKS[ZQLPOKJLOQQSVXXYZ[[]^``^]_aabceefffhfddddfijjjkkib[[[[YYVTWZXOFLTK?AKQPJFDGKW^YTRRVZYXWZ\YRU]RQul\fh`ab\W]b\PVVQX[VTQRSVY^jlhcZUPVdg^QMYge\\blh`\VIUc\S]_OPaiswgUS]ca\^^`df]Y]dccaclnfktsiftwuihzp^RXarp;4:987779::9788:7CFNfE>]m[SSSSROC85556677777678666666666656666677778:99897888888888888888898989997JpnbW]qM-:LMN_qyrkheN`ȄWPE><>@?@CQ`gg_QQfx[V_xp[YAC:;98<]]FQSǫhRlnLDJM]H=:HQ`=DXfmCBO7BJJRU@G^F3,(4LJB6EEEOGOOMICNS`LK3CY7=T]lIIDYe^pI:HQEMWGL~~D;Nctb_sFZXBQ17T]SB7HKPB=GRJF@DD9KD=AADIESLHe[^SMR]bXUURPQQKI><<L\_aabbbaZRUSMVaggd`]XQPTRHA96755>BA>AMVN>AS_C?C>>=::OwpA9;:9999:=EHDEIF?<==<97;EQSKEEKOKC@@?A?:74:AA94567:::99:;=?BGKJJJGC@=<:>MephQ;9?DJQSLJTYVRFFKFIQSPMJGBHZhnfPEEC=?KVSPOGDFEFGR_cieZS[j]XnZFFOQKB=>D]qlmζP[vRIQKA>?=>>>=<=GRV_ebdebbv}xxrgE?@AB???==;9:;:=DIE>;97655778:;97722?FFFCCDCCEE>9:<<<;:97677:BAA9348;?<777532234763244344544;CGIIE?=;DIFIHGO_g[QW[U[hTHEIFEFGGHFA???;27FA;;;:741EN46J]hjnaJFNYef^]YULBBDA?EKC54?=MԒE]spmSCB;87997@QQNNORX`faZ]XUNT{uubGCCD?9537BAACCEGH9Ng]Yce]WVVJi}LHXRNQF:878;=ACFJJFEA97fcDPpiRRSRRPI?7555667777767655555566665666666667899888667778888888888888888999;7N^TK:Q]>9ILHM]otg[WMHvkaWVUJ=9:@HPZ\Re[bmoqm`icXxe;?CADKKIJRRLKFBEKPRSPNOJECCFFGIIIHEGJLNQRQPPPRVbkaQMXgd[SQQd}o¿ԼųͬÅ˺ƺĥȻƹվκǪϭӰӱҺ˫ˤwc“|{ux|qopplqqOp~j_X{Zgchhlbutihkoommlmptuwyy|tO;GW_VGIVæcRmlOLPTX[>J]GP87;kSALGJ86APXRLdBOR1JNciBDCNi\S0IM8FK:=QBFFFGHHFCFHFDGKNPNKIFHKOOOQPORSTTTSTVYVPVXUXXSF3-4AJPNF;30/68>7;=DKHDFJYYOVpduyra_okfPBFJGCBCGQ[^c^C1493/[sIPdwm>745CXaR?34AMIFVgiiiighfXMPRT[ruhb``SFIUO<35:=@ACDCCDVfW:1@IB@>4/>SHAFLNRVWLEEJRUTRKGGGHIIIJORU^_XROEKi{wxxqtzH5AT==;=@A?;HLIMRKB?>=;=@>?GF;6;EQRMHCA@=:?DDBBA@<33;=934789<;:99:;?@DA?ABNRNOPPYaWD@C@=>AJPOONH:DcnmaRKHEDENXRPQGCB@@C[nfngTPuELEGJOQNJKUW\]Q[hE??CB?IJFAABA?====>@BTn}ysptmguDIC?<9::<=<99<<<<==;;975334426;;<=64AFBBEC@=:986678:>@=57F@;;<<851Xq>JPm|nOIR[gpsniaYSONLJIJMG53;49t{Y\ؽySYN>DGCDGFJUZhzijloymJ=:778<=@BDEGFA><95@AAABDGG@:74]hWNLRSssFV\SMMF7579<>ADFIJHHFC:75556666666666555555655555566666668;DO>36767777888888888888899978U:BDJH>@BDDAABBDGJGEDHLHEKNLJIJLPRSSRRTWZVORTW[]\[R?8@BC@9103624>58AILJA;@klMSwz}mRcjcTJHECA@DIPZb`T=155,JTIMQe[;8;ATXG21APYXRWbb`dnpicd\QNOXYjqnifipJ?BB<89::::9:::;::;<BB@>?979@OZZNDBC?;7:;::<<;;859=>>>=?BDGNTWRJB@?@BFHD@ADHJJGFHR`^F9AHGA<8=GLLIF?F`icRHMRQRRTURTYL>8E_^gfiihu~HNEFHMORVbf]VMFd}P;A@D>:BEBAA?>>>>=>==AN_ksvs~{ިPUN?CEEB>=>=;;>@;89<==:753443369:>B>8BB=?GF>74688878;=ABA=8669;>@?=:66216642459@EC;7766445630/EMKIGC@CIJDB?@Qg_MQac][[YNT`c]VSRPH><><518G@;:99993IeVah|cCRgpuv{~mZUXULECCBFC711.7Uj`Wf˭]>=A[rphefytmpdmN888::?ABDFGFGD?aLKGN^`^XU]VURLG=868;=@CEIJJJLM;ZvQ=NQJg{bwɿͺtmrljqwllqooj|tkOR`ji]IDGGKW[W_`rrKHub>GLIGGGppqpnefePDAAABCDFEIXceffddd[LGGGIIJJJJJJKKKJKKKKKJJJHHKPWVUVVXYZZ_fjjkmopqpqrqqrstvtng_WQNLKPURMLMPLC??AAAACCBCDCDDDBBBBBCCCCDDCCCCCCCCCCCCCCBAA@@@?@ABDFHIGGGHJHIJJJJJJJJIJIIIHIJIHHKPTSTWY[\^_`be]J?BIMQYaghhhggea`cghhjkjf]VWY\]\[ZZ[]\]_a_LEJRLKh^?ERVU\b[]^]Z[Z[V`kKSOkv}t]VU]\\a[Z_`ijYOMKJPJHQV__XYST`bbb^mjULIQQYfk\_eiihe\[\^][bgnvsf]_lrkgaW[iple`djffwxowxlkSDJ\glqH4:987777788789940bjMTjgROOPONJC<6555666666655555555555555555666668JSXXYVPM[ptpXbe]UPO^{NFGIKOQSUUSOKIDBFLSUZ_bXNKIGGIHIIGFFHIJKMNMLMPOU_^ajib``chr϶¾ſѺʧǸȽɬ¸|v~ѻϹ¸۽ʲեѸ̾۵źǩѝȪinvzzxq}z~~eůtzgvZnkx{zYUiu^iqVLPXZYfof`h{rfcr~od}XC=j]EGiERšycYcfLT`VqT@58:==FPMBGP6QXANW[ooMGD=nU0,YPLaB]ffU~@.l}Q=CTFUclXXjTa_MfZLZORYD9NOORTAJG?`]WATckUi_[qucO`]quhRIT[ZTTQOQQPG@B:8:;:536679:;;=@DB<;>BEFFB?BJLEBHIGCADINPPPRTTVWVTRSVY[ZXa_SG:110/17;6CLNVZP>335/????9GQSRMMQTTRIEKV[ZZYODFKQWXZ^a^[[Z[ZSNRh~Չ{ݓYH@>??A=<>??@G98:889:75:;:@GE?>?CE><<:AU^LANPA@B><=????=88;>@=;<<639=?@=<>ACFMRUULB@>CVql[N@AEE?>?@EHB;=<679==<:89;??;98:=???@A@<9811651389<@EB?;88863231-.CILNNICGLGAEGCOgbR\e^ZWXW\[]qhQHLNHA;<7..9GA=<<::;=6;;Jm}sa_ehjnwzm^WTQKFHLLHA=:;H[ejQN㺧yWKRWY\aa[alk[G8?AACGJPNQH`EBFMZ\WbfTSTVPHF<57:<@CEJLLMNEVjg^XzйƿZ^pwtsngpxpcYTjłmk[nfSOIDGXecb[pmCixC>HJIGFFoprql`VRKC@@AABDDEFNVY^cbdk_JEGIIIJJKJKKKKKJKKKKKJJJHGJMOMPUUVYY\bhjggkmoopppqqrsrrrplf_\^``afcUMORLC?@ABBCDDCDFFDCCBBBBBCCCCDDDDCDDCCDDDDCCCBAAAA@??ACEEFHHIIJKONMKKJIKLLLKKKKIHIHFFIOQNNSY\\^aabdh^PLT]agkjjihiiia[`gggijjlfXUW]_]_^\[YZXUWb]IWiSG`mWDYmdgbYXXWV]ZWW\eenu}{z~yXKEKX`edcbbike]ZVTTTVQR^a]\\]_YWV_qeVJFCJ``UW[cf_`egia_XOUhxysc`fuifiaZassh^Z]ccckrw|shF=I[jl`qyH4:98777778879997FrZL`lYNPONNMIA:6555666666665555555555555555666669MmhD8689999788888888878899;D\kkcWH<5>>?Qirpnjfe\WQLGWnut}xaK;38>LVZYYXRMOcrzlZ_c]Zaeej}qfb`ZTNJHEBFMTWXWUOLLLJGGGHHGEDFHJKKKKJLPRT[mqdcesԳʼɬɝĞ˽ŭ˴׼ùĶļҿĿӷóӻû֪ͭ͸ħvzxwrvxzulezx~fķwzpgmy}ytYXisth_u{dVPV\bnu}spqdbjxl^ceTX8N`IZjCQzh[amNK`ZkPQhO+==BDZXA6?GH/.G^OJNKYqT>:33DNbPJ@CTE?PB>HF[sWNJSMjI0/_ZN`sQXgpt{R\oUGOtgNhq[TkfrdRfYUtK\YG7IYMLQIIIPjeX[kxtRk`ctud_eayr\OMV^[UVUVUVQKGC?>=<;635679::;:<>;8BCBACEILLMORUUSUVUSSUXYYV]ibXRD60/6?@AIOYTMKLPWT@duKJ`t{fCWkaRFED;8=ABEMF944518iF5MOFC?9BG914;EU\\\adfaPFTiqvu`WYXKOWUJPYejv`JIJHGD>8=GJNPE958::;=@=@A?EJLGWbQIHFDDFJOPPQV_[OGLX`cgikkbYZUZYXYivbp˭˟oWB4=BL_Y@=9OrE5:DA;;;;=?DKH@==<;;<>?><;:65GVE@WU@BGA:54699888;@B>:;<:89=@A>;=ESeWIB:88?FGEDFILMORXXZSFB@JQLCGORRQLJLLIPWKxqқmXdUGMJLMTWIHUsΪeQ==>?DIMTZZRJFCB@=CIPQW`rtps]ezZNSKB@;;@??:16ELF@:669<408?CC@??A@>;:79==<<<;;;;99769:8201058CJXXOFEGMD;BIIOZX\iaZWSSUhjUS]QJLNMJE=7249B@=??;0CfcWlohljc[^aQZieffTLRV\abdqwjPS}S^ʢimha^TVX\bgqnU@9X̻ɫugghX7+03448<759<:62/07<@CDDEA28GGF>15><>?>>>?DJMPDT|K@EEJRUfw[LSW]KD@9;:<>CGLNMMMQzUJpt]vѻryfhtr`V_hy|d\WrҘqidyvb_fQDDRca[Yi`HPICCJIHGGoonoi]H@FA?@@AABCCCFIJNV\ckcLCFJJJKKKKKKKKKJKKKLLKJJHGIJJLOTVUWY[che`bjnnnpppppqssrpnkjhddffdef_SSSMC?ABBCCEEDCA??>>BBBBBBCCCEDDDDDDDDDDDCCCCBBBAAA@@@BDCCEFGHGFGILKKJJKLLKKKKKJHHGEEHMNKJOVXX[_baabfebeghhhijhhikldZ]efehjjmmg\UW^^_^][ZYUOUagT]z^ANpe9NsonmehlZS[YXZ\YZgx{|uz|||{{zgLIOUcljeb_XWTTSSZb`ZPSff_]ab^YVT_naRIEO]f^OWZaVP[auvmaY\X^`_^`cg`Xch`]gsrs`]eeca`gt{w}}wnABCA>;63468897872599=BDA?@AA?BGD<;?DIKLLKIILRTTTVTSRSUXXXVZaf]\]OB;?HGAJRTSPEKOUPAZoELUx~xwsP?\kNKGFD<6<>:8=LV[_babcgg^PMZjroe[VYSP\dWMHELntl]PENTRLKHCFOXL>877878;?FPJ?HUTHObR?=;::;DTUKMWda]VQYP[gpswhW[\ZV^cibA;ssL\[IOP`e~I1Xc9?s]9<<=>@CD@<<<;<<<<==;:999?JDAORHFGD?:7777779>?<:=AB?:9?CC@=>=;>BBDB@=9MioiϭnGNJIO_\FVb_дVFQSTTSSUSMIGEIEAXbTU_erpl{ڐtpdUNGFG@=:3/7GNIA:58?DD?7.4@<6678:==703337@@>=>?ADFE?:::968679:;81/019@FW`]QFDBGF;?HJLMK_d[WVSLTmxrWPTVVUUTI=99:9;==?>;3EƤsslIMRFJTb`U^aZe[=<:96226:?A8315?EIapNOVnhDA;68:@GIIJNPP|˞`BFYxe``_ldiejc[cssb`\aţ{i\g^Uij_lUBEIRWRSWIQhXLOBDIHHHHpoece\J>AA??@@AABAACDEEHQ[\[QDGIJJKKKKKKKKKJKKLMLKJIFEGFGHPVXVWY]ac^[`jnmmnnnppqqrqkd_[Z`fecadgcZVWRD?DFDDDB@BEGMWVKCBCBBCCCCEEEDDDDDDDDCCCCCBBBAAA@@@AB@ABDEEDDEHLLLLKKLKKKKKJIIHHFFFJKHGIMMNQ\adfefhihfeehlkiiiikmc[_cdfijklplWLY]\]^[\]QR[_c^\qlXPebDUnscqzjUUWX]_`ZX_ddWY`bows{vu_MOUZ`db`XONMOOLS]\YOHVd^^`_]`aY\e`IGPipl]Y^XcYNQVa\bb]kgZPT\dgcY]ceY`gbin][bgihfb_dlwwslBCOZoyko~O3<:988777767773>s^Mdh[QUTRPMKFB:5555555555555555555555555555555557DK?79=<9567878977777778878866?P^_J::Epy]HQ^UigQLXZVOMIIP`^POTQF@8FLM4;@32DiU3<<\<8?<@8A=FBULU^Vyg>6aPPalV=PTV\XBETh}[iOFajgV^]bfZlVRFKSDB;:AFJLNNLIILPPORUSPSUWXXXVX[_[Y^\WSOLIJSXRNTHEADDZrrD?CA9564/L{gCCIKLJD@<87ET]`__bfhghhid\_ef]RQSP\je[[VNBKstheXBLYZX\^ZNIQG96999867?=:9<<<=?<9:>=8799;AEDHONGDCAA?=;999=?@AGIFCB>;=BCA;:;;;A@?>ABGKRbmdO=6APME=?79>DD@>BBBCJU_x|yFOKHMU_\`hlzqq~Й]STSOHEFD@CD;XhPXk^TV`sÉj\VWXE788:@GJH?869>DE=5/11/4;;87:<821138=CC@>=><:;<<;>?=;AA>>??;858::GNQVTKA:=KNJCGDBATXSVXWVWplVXYWWNA:9998::>A>:/^ڱlGCVbUKJT\^cfgcQEcvqw}eTek[Uvrr||nb]YMShb[kwCMn°ohv\==>>?EGFDDEFHJQYgwq`_~jqjfhobXuxUPVr]LXSH<;CGJPWW[bHI\jsk`\XODGui]esufY^fc]c`R|qvģĪowzyfHDHJ]mcYJDEFMTRONLSUOQJ?DHDDHJrqf[ZZPC@@>??@@@@@BEFGEBFKJKMFHIJKLKKLKLLLLKLLMNMLJHEDEFHKQYZWUY[ZYXZailllmmmopppnnkd_[XWWWZ_egd_[ZXNEEDB@CFLXahpxxoZIECBDCCDEEFEEEEEDDDCCCCCCBBBBBA@@??==?CHLMMNNNOOMKLLLLKKKJJIIIHGGIHFDEFEFMWdd^Y[b^V]fefhhghiihklb\`bdhjjjlqhTP[\\_[^`[XZ\]^^_qx\KZowa]x}hgobQPV`\]^WWZa]]bdujyf]TJNTWZ`cb\TSSVWNLSRTQKLU__[ZakdT[kfGN[cg^[[eddcmdXW^b^`lqj[Yk|xifllgfheikmlkmolje\Zk}yseEMT[p}~~R4>;88777777776,X^_kdPPUTRPLIGB:5445555555555555555555555555555554333336=;597?L]ac]TPYhrsvsmcWYZZZYV\^ap}uT>CRZXVUSSRMIKPUYZXVTPNNNOMHFFEDDFHHKGLXV^fov{{zŸŲǫɻЧμѹɿŻ̿µͳοֻӿθнñХοȱkt}dru`imeWj\kl~t_ymmÿ|m}}q|teuufm^jc}pmg~gk~pcan~jDOdo{rbaDKg[W_TL|uxŷ~_c_HZbbtbSI7VSFO>bkg:>;VM=DC888AL7/'*-8NI7DOj:8L;C@><<4VK\TVugLp[@[\gv>Bwyc^Talb]o^RuC_xiNTX]_Xx[]gY:@UeqrK[jp~}[hsqupx`hnYOgd`[c[YSSSTNVBJLLJG;37449:74758<979;;89;=<==?>=?CDGJMMKJKLLKJNRSUWZZYWWVVWWYY[_\[YTONTXSLRM643>tkIFzgULOitJDPUKB9<=@B?7431Cnj?=EDHH@:6:EOTSYcfdcgigiopd[YWQMJC9:;::767HTDDFHJKLMF<:<;945H`nlgb`__XADNmkEFNYTB=AX~z{՛YVgai`oV:<===:9;<>=<<=<:;>=96558=EIHGGDCCBA?<99:;=@?=@DGFB=:=AA?<;==>>??>;<@>98;=?AB@>=>><87@EDA?BISUXdgU=49JXPFEAG^BBBDDEDDHO[g|ʻ܌cWUPJFV^jƷ}|~|wshmzqYIHFDC@=:9?B:PwjXe`S\ltۻԍqvki_[Y[T=6?DGJHD?97876;@;610/17;9557:<8655:@BA@A@@;8;====<=:79;=;;ADGJEA;12323348@DGOJ>88O`^SIB?>KVXYZZ[UexoTQTRJB@>=;99:@7?ߩ~onnYZ\UWTS[`WNUfnhasnynWf¨zqmzkb__aeacbe^VYalLfZ??=?DFB=43663002Fbkcc\[aVMSVFHUWWVY]djpyd^aWWUebt}r_PNVdnkcaXL[pq{eZclb^lyzx~qk`Z_][abZQLDS~No|f>9A@CTYJDEEIQVSOPQOSTKFB?GB9CJonlbVOKEB@???@????ADFFECCCCEGIJJKKLKLLLLLLKLLMMMLJGHKSZ]^affd_ZXVUSX^bfiklllnooppnmmmnoiXQX^bggec`\]YH;@BFLRSRRQQQOPMKKKLMLKKJJJIIHHHHGEDDDDHT`]QIJT\WOT^a_`cegiieaik`]`adikjjmniYPRV\]]_`]Y[]_]WducGN_rlYniXahbUE>QYX`^^^Y_`R`rirbQQ\]Y\fkeZUW\[YVRQUUWUQ[d_cnhXS\fdPQ]`f_X_jjfgxnXTh]Qhh]]YRalpoicpytleie[jlhjkc\_`[arzsjSWX_iwU1;;978878878728z|cjk\GPTSSRLJGB94445555555555555555555555555555555568887;=AWfgS:6877777777788I`ebZOQOHLBTXoSRUVWY]VF=BS\N717AKYd^ieY_\ZgnstpfWZ]XSOPZdddifK6DUWXWWTRRSPLMQSUVTSPMJKKLKJIFDDEGIHMGLc`gqsvƹøʱĿ;ʥu|Ю̽¼ýǶͶŻĻһ͵Ͻй˼ӲŷŸøĘkhm|e]dgZdz[ggvuYrpjfynth{sygtohq\nclf{g{pquuh]Me{hLSZt}_qoM\^`kYlQnwp^`ZN`anUERP]IYPMkc66:LDEG:/3;FMBAH:38?EEUPF;FQ7KI673=QSU>Q}ZocjlEPLWlnn?ntg\nMkj_dYV^c{F?RTWYlhTzdbam|qA[ns}~WjulujucemSWgc_YdXXJQSSQRERQQOL:7@>9;:5779@=776578<=85;><D5429eewi\ZYiwbYQH@ABBA=;;85-7ckB0=B=;619AGU[YW[bgjjghiop_PTOJCEC78ObdY_db`_dtvjc[R^TKWjmrlSLI@<<<;999=DB@BCCCCFMQH=::87=CHVaa[T`b[?BuU@LXVG9GL;@n}rttyʥ_K\fS_n@;@;999:>??=<<<==;9:67?A@CIHA>ACA?=;855679==;:=AA?=;?CBA@BBBBBA><9:=<;:<>BC@;:;<==88BHHB>AP]YTTPD@JRTYQ@A>qV?HSOBCEDFYª¬}^NKKUsx{wnnpfex{xwpjbd]DDABBAA><>@FPPbi`c_`lob༢יnnUJZbc^UAEKKLJHE?;::62599856899989:::;;986;=:668:==<88:>?>9=?97ATeZE??>?A@=9=?@3lYzlOOZXWUU\_YX[]jiiywrϡzru{h]X^aWJT]qDHOFOf[EnVNF@??@CCA?=;;9985Dssk`XdLFB?<>A>9752346778::5;td-9==Uoj[UTPLL`|ypoldktugrxZMPWk}yotpnwtb^`abaidVaYaӦ\?Sox^DEC:82((LlVWac=86;79>=:;<>@CEFE@>BFGFGJMNRWZZVRSVUWYWTSRQRSUW[]_[LA1=C664SooifZdmhkR82?BFKX^^`aekllg\ZZ^hkj[OXlsncRMF><;;;8;>ABCC@ABCEGHIMD:::;;;=CRYVTgbrNz@8@Z`B4IOMcosonury¹oqnpflr?8:8>HB:<;<<;989;=?;78;:76658<==?@@BBBBDFFFGGFEEC@><=??><=AFHJE@?==<>?@HIHC>ANRD?@>?Ob_W_lSF?;S]OADDESexwy۱koTNILZQix}th\POXgqomja_dj]@E?BEFDAACDDX`ZX]^_`_`fqäyRRZ[fpb]QINOROH?=;:878::;<;;:;>AB@<::8866;>82007==77;?@<449;;BO[Q@?CC@===>?@?Plkc]HB76>d]OLKD>>>=>??@@??ABCDDDCCBCFGHIJJKLLKLLLLMMLJIMTX`dhmponnkijiie^[Z[]_aeilllllnnmmmmmlmpqrohegdceedaXOP[debelrtsrruxxyyvsgWJDFHHHHGFFFFFEECCCCCCCBBBBAAHTZ[[VPRTUUSRQQPONMKKKKIIIIIHHHHGGGFFEFPVMACNX^^[WTRXadegggfec`flg`__aejlmmnpkQ=ALW^]Z[^][XUS[`XOWs}v\o}vm[VffFKk^S_filvk[ixvofZbol]XZWVVW`lstn_QPY\SQZ[XTKO]]XV[_\]c_^c\Zbb\aa\LBFDHVf\NGO_c`fnpuk`icRP]jgcggeccaa\asq]VYckuxqY2<<;9::9987974rcBZn\?HTTSROKHD@823455555555555555555555555555555566654446:AI;;CFFDEHKMOPQRQPSUUWZXTQNPQRSSSU\a[T=7C>@GZ^yukk\gj_kV80:?BA<9;>8>YZ866,,6><;<;:999@JIB@A>::999868=>;855:>??@BEIIHGFEDEEDEGFB><>BB?=;@BFGEB@BFA77;;>Q[QSbtWH[dIB?@Qelpead|zqFKPMLYUP[y{rcO@EVep|ydZQsSMOAQSME?IXSR`a[baWOO]}bDCKUozcVKSgjI<=>;<<:89;==;;=ACDDBA=:8866@KKE9.0597:>><723<<8:<=CEEGC?AISXQNLRVJ@?84443347YtkrrkvcRWWljfY[`j{wigikk_ciJ>>Di]\diqrniirqJ\pqU8<===?@@?>>?AAYWa]G><9;ACBA=:;;=?ABA@?=H`y`{U56:?GNbdg~th_seqlV^UGJTKcܹ}owi~nYYi\P^VKMPanfbb\WRQPOPQLHEFHMOQWYRR]]RYee\URIDC_[L?>@>==<==>>??@AACEFEDECBDEFHIJJKLKLLLMLIJMWbggfeglnljighhghfea^YX]cgklkkkklnnlllklmmonlkjgb`dfdb^\]a]VWdrvpopsvxxwvvwtj^NEGHIIHHGGFFFEDDCCDCCBBBBBGU^YPKMUXVUTTSRSQPPONMLMKIIIIHHHHHGGGFFGHEBCGVa_TIHQ\abdfgghhhihfjlfaaadikllmllkV?>HPRRW]ZYVVW\]\V^~pf{`a_covgu|cY[dnv{{ihz|ym[opZV\^ZXU[ellh``miYRVRLOQXa[XV]mtoke``a]YVPY_\UNI@H[WMGL^hd[[accYS`ZOV`_]cljbdki`X_duysaUZaiqrl\3<<;;:::978;1KzLHgmJ>LSTSQMJFC?6123555555555555555555555555555555555567877AD<8468776666678788889C:Qw58B>6+x֒C;87>S^T;7>C>635kJDLTphiV@\adPtSSkZto|mvbj~[l^dhwzkqpNLnYT\dbSDKIFCQPIOFJOVafaTOQK<7@@:7747@E?13CI>=FF>@HI@;:;=?A@:1600?MRXdhda_`^YYdfdgc]\\OIYbXA9TfOCZihjpldho_QbiSNowleYJFHJLMHHHHHHIIGHC<:;=:9999?C=:AEFB=<@A=899;CLOIBAB@><<>???>?@?>;:=?@BKH@M_`\`CDDMf|̭vjfVGGR_pJQROGO`Za}pplbL@COayhZVJavWK[TE:Fb`NVdildONifM>:MYsd^^pz@3<=;<988:;:::<@AA@ACDA;7668CMSRD4/034:@<627>B=7668EQICEAATdk`LITQ?35653210353=7[R>DB>@@@:E|ۻٚ?6DMwkxpxzxoXnssw``[EAPLm֤fyin{Y^ZG@GHIbcWWY[[XVXWRRRPPOPQRW_a]]a^UW^ageRFPVXVK@=>>=<<<===>??@ACEFFGFDDCDEGIIIJKKLLMMJOYbgb[Z_cjmlihfgggggfgc\VX^dhklljijjkmjiikkkmmlkllga_bfdb_WNJHN_nnc\fsvvwxvvwxwrgaXJIIIHHHGGGFDDDDDDDDCCCBCJUUKBES]YSTUUUUUTSRQQPONLKJIHHIIHHHHHGFGEEEFJUXRGDO]b`acfhhijkkkiilkebbcfiklomgnoTCFFBEU[YYZYX\][XZvz{cELOV{{iuiZXX``Zd~}rckqZai_\RMSVTYcnng^XWUUTPU`^XWY`oqofehicWP]fc`SLFGOFGOPZmnaZZ[[WW]`[T\hjjrqgaiusaZ_XngX]glnnq]4;=<:::::8:94kjO^qd@BOSUURNHFC=4023555555565555555555555555555555545567853:@705877666666677778:=;7BG:7<;952ZX6B=7>QYL:27?A;518LH@<:6?kvWJIDHMFEGHKV\YUVQ?JkmRDFGC@=EQRQTQKGIILRNJHGDDEDDCDEFGIKMLX|}ĺȷƚùʖƿŨе£|zvwͼļƵ˻ƵƶǶůɮ̷֍̶Žſͧͣzxd\esyvrloXYWW[bx~qluĸ|Y`DIJxnmz{yl~tW_lYgxmitTivE^^Ri}ajhGz{K[dS]XnWtba]XuxaSokhQP\Xg[GXI`\OH8P`aN:8776;=LgQ9@LM0:8;5C6.>ZR@NP0"056>PwpTNkPskx]DF{?LUNDd{]I>FUdttbdWL`vZbrgpjsyiqWn^aixpuugA__QO^bcLBJEAATAIDDKO\fdYPUZM:?G>9:99@ED47>JC>@BBC;8P`@0/4:HUWW]fidaec][bhaYWTNVUD=DHMPMORJFFD>CFHJNQH}yPWdF0?Zu~p||xuxp^RUfu~lgoi^bmlkgWD87<@@=:88:=>=><99;;9:;<=<=??=;;;9;>DHIF=:>?=<;?BDEB?@A<6679?INOJDAA@?>>????>=<=?>>?BDDA=:>VZ[RQKTͯmdnaKP`tē{le_xvgcf[IB?Ec{mTPPPOONW[F?HTUPV`__[PYsiRKDSZ{jgso<99:<=8479;:68<;;<==@?<84227=CIJA865229==83IE;>=4H_h^LJOG=525548AGID77DJC63444:DB@?AMPO[c\ajROQMJLNORTQB5Dzʏ_Zkf^gbǗul`RP˪f:KUTLFHLDPWXhbro\TLBB=;IUW~{|psJ16=BPkpK:?>??@@@@??>;QR:><7@NKADHG@>=;;<=>?@;]?LYδ]˝pVKJ\fivx|iWTN>;EGc߯]PW]o~fheFCJ[bjgb]QSTTVSNMRSSSTUUT[bbabb_[ZSMYeZP[dRPIC?>=<==>>===>>?ACEFFHGEEECCEHHIJJKKKLLQZ\VOKKTakiccdefggggfddb\VX`fjkmnkfeggiifgjjjlllmljhb_adcaXH@AFT`]UWalruuvvvvwxxvohbZOKJJJHHHHGEEEDDDDDCCBBCFGDAFS[SKOUXWXXWWVTSTSQNNNLJIIHHHHHHHGGFGGGHJMHBAHSUSXbffgijkllllklkid^ce^dkkifgmlZLLB:M]_\YXXZ[ZXY_aU^aKNaS[[R`a[[^`bifw|yj_]mh``WYUU\^UPT^^Z^abcd^SMRXXXOL[kh^hy{ti[bdaXNLLMNIRcUKS__TSOSX\eYVSQ_sxzreahqrj^][mj[^pocl}\6<=<::::<;<1IvVXktTCLQUWURMHDA=41445555556765555555555555555555555444553456@C5377665666666777779767675877548=9>?;7?OH=;;;=?:75HZD99998FSLIIEHMFBAELV]ZNLO@?Vi_LGFC>9DQPPVOIIJIEFGGECCCCDDCDFGGGOo©ȹļκ~żˠɯs{qİ˽ÿͺʫ´˵ŵҽϱɡϷٛɸͧȨppn\_gr~w}mn_IHgvrmVWp¶{uvxmhilt~tjdR]yt_ihhpt|[amYESO^u}xX`Z_Tu\H^ynPy[]cQ`kXUkr[MUYZ]LSXKbk\^KC?NS>9:?118DA@FH:FUXK^:/>M87NTNOY:#&=S<;>Sjigo{_lal~k?Eu_iMI{dWXPc`YvSTMlhRvnOnz}ckaYla\kpt}i[DmOKL^``FBI>?HLAJ?FJS\_ZROY\ODNPC>@@AEH;7ALJ<@H?7CNC46DLMKG@:?DHHCDFFEEFGIJIKQTPIJPUWSPPRTRRRWYWSD]V]FUzjk|~j[PH>38ABDE:AnuA-8DPWRQW`fib_nfa^`\X`^YI864:=79L]L9?E[dYJP^feaXV_XF?L`f`TF@BGHIIIIHIHIGB=Ri]UQA?>;JZTGGEIKB?KSUWXToئ^:S^>07Uy|jcV}yn_VVUZfovdYW^a[\o|rgd`Q>69@JQI626>AAD;99=;779::<>AA@=88:=>>??=99;;:;?CB??>@DA759<=@FNOKJJFC>=@ACFHF>;8:Mo[^`iGKz|uȘemgfea]Z]OCABS`TGHJLNPC`}VfGPPOQTWQONMQM[н—_TOTaneyX@B86@A:68::968;779;:975443479:;;8776335:>><=BFHHF:39C?8997=MY\UNID=7338>HY_SE=75333445856653CPQILUkҬgQZTOQ[guzz\red}cpͬ|g^VyœUCHIIIJMJM\]`{pLPVOOOJ>>?AAAAA@?>>FJ=8?>=;BKG@=??<<;;;;<<><@DPKxӇٺÛgOSWafqtlb\SOB55;>DNTN֒UQXalzԬmmooqqrrnh`_XboePDLRSSUVUX\_^_ef_`gYMPW^^]^JJE@>?>=>?@?>>>??AACEFGGGFEECBDGGHJKKIJJKOMHDEGKS\\VW^adefggecbb`[VZbhklmomf`bdeeefhhijjlmlkicaabbaXG@EKKIP^inprttuvvvvwxxwmb_XKHJIIIIHFFEDCBBBBAAABBA>>DMUQFDNWZZZZYYYXWVTQPPPNLJJJHGGGGGGFFGGHGGGDCDHIFN^hiijjjjllnnmmllibcb^eeQRZXae[QKJC@aw_IJUWTTX][SLMakk][fjj_cJ5Tg_u|bgplpqb`kmklf_[mxslbVOR[dib\ZZZZ_eghicXQU]]XMN^nm\Xbb^ZNNRNHJUVLKZdngYR_f_]XUTSXQTVR_s~|ticdijb\`irqd\[aVTl^9<<;;::;=>74gnN\mfEEPSXYUQKGA=;5345655555665555555555555555555555444558>HKHNK81885556666788677888;A:?WG6663/0:D746BL@797>Ya@9@?>;:AGHHGIOGA?IQTUOBDKG@EYeXFCFHFKTVVWRHFGDABBCCDCDDEDCFHIILPqпī±|p͞¢ho{vǶ˷պƸġװдòȬҮͨȺȹwnthZ_\k~vv{zikIVRn}ziNH\tĽǿ÷ɵqpmzvUU_{kgk]kwxwz`j|uRBRRotjmRsUktChwhQwǺ]V]IWeRUkbMVVTWRT`OXSWvhFBNM_Y>G>09CFERo7,9Lx}[TJRQVv]viizH^ztqD\~dopBYhGY]ndQpeHuyP{Vdh]Tmgsz]SUgEENZa\BFH7>P@EF>HMQVVSPQX[VUYTIIIHHIGEA5;MK83CTWSLC;?DDEE?ADDCCFHILLIKONHHMTVSQTVTSRSUUZ^YebY{fQ;Hyzcqomd^WMC89^_5=NVXURXcjntf]tnjoeQDMQTD648ISGFOKAABE[l`DBZmplU9JTLIJKMKE@@CFHJJJJHHHJD83@clXG@>72A[_UMCDPSU[]__^f͏_D4JQ:12Mfbr}xnkM`q^[ckhftePY^c_W\ovnhb^VCAEEOYYI94<@VcD:;8746999;<>=<989<=<:9:;9999::89>DC=>ECB@?IKGJOJ@<;>ADHHFA>BCBBDDCCDD=APtZ^a~Ucr|wԠ]a_KILNMC=9GUUSYSFBTcRU輙̍DPPORRNNMEBB=Q辍uWM|qd{wljP<IH>8998754679;77873AQPG>>^ʁV^hmkqӻ}\ǭtmddƥmzo_W`ԍyYDLJDHJLOOMPSoWKAEMRQH5087>Sgģ|Y;:=?@@ACDCDBA@BA96>B?;;GLE>;:9:::;;<<;<9>N3;0W߻hbjrb_^ƩsXKHGF>25:<6@YPPү];PqxYVYXRKIWjoqqd_alSCQUUTUSRWac]`fd`dgbXQQai]XFD@?@@ABBBBA@@@?@AACEFFFGFEDCDEGGHIIJIIHHHFGIIJKLMNXbbbcdeedcca`]ZV[ciknonnj`^``bddfghiikkjigda_``aWHDFEDPgohfouuuttvvvvwxvrrgUJHKJJJIIHGFDCAA@@?@@AA@>>DHGDDIPY[[\\\[\[ZYVSRRRPNLKJHGGGFGFFFGGGGFFFGGEHTbhggijjjlmmoonnnmmkcaffcJ;KXYLINKLMCYt^LUZWPMR[^^\WTUYW|ym[gj\lroZX[`fcXUOP]isigrxy|u[OIHR][Y[]\Z^b\VX]e_Tcl_Y\fuoUFMQNMGMG:545565555555555555555444444444444445656;JQPMLKC63777777667997898779IQHad:582BU<<:8@CBA?@CA>=:9?U[@?GGD@>CIIFINPC@AJPPME=AFIJHHTVHBFQXYZ][WSJDGD@BDECIWNEFEEGKLMRa}ǺɼijǾouɻ~icqjǝŸ̡»ɩǯۿȷǩɰĿʿڿ˩ƷĢssx]bcTkut[`cvWSdqnrnTMIMW_üϾzm|zNZpyrmf[tv{^zvwvBLFg}y\}j^gRzOjuh[n¾^OXHU\LU`KOWTVPSe]T\JdX>GSkoNF2@CB:?82$/4:3FOADH<>F;?M\w97OLdpYSDF;X\\zeyqZ`x͘vdzcXs|}iIwOR]`eb]\bbTh]bpaTOfekuSQfU?AQRaT>NB/BRALPRSSSSPU[\\\TRUQNLNHKHLFDGF:8FOC9FV]\UJBCHFBB?:<>@ACFHKMNJJLKFHPRRTWVTTRSX\YZ`bc[OcWK@Hqxdt^TUZZMIHGGJB7LztA8S^]Z\cimnnyi`qzoaP;,8HLFDBJebLD@>HLCFZpeGDZswH+ASPMSWQI?8W][\eljkno{igoXSYs}phha^ZM\fJDJU_F9;?cb:58H@9=><<<===>@@=;<;;=>==<<<=>=9788;ADCGOSI??DC@ADCA@?<=??@@?>>???BCDFJMJKxvq`{]Zgbcxy̰qKmk?BDGJA;=DHGMXLA?S=@FMRQJLPD;@A?KK?i߬{bt}kdvxwG9::;;8;>:6AOK@;99999;<<<==>@5cӣN6761A̯U`u~hXNx͚`VQOLHB858;9AOTQWp[:`99D@<=ALctuwo[`v}xYJRXXVVQLUchgdefijlngYSbhYTGD>?CBDEEEFDCBBA?@BCCDDEEEEDDDEFGGHGHGGGGGIJIHIIJO\db`abdddccc`_][X[bgggiosk_[\^`bbdffhjjjhhhc`^^__VLIGCK\`Y\grtsprvvuvuvvttnkfPJKLJJJJIHGDCB@?>=>?@@@??@A@AGMQY\\]^^]]][YYWVUSPNLKJHGGGFFFFFFGGHGGEFECLZb_]bhiijklnnoonnmnnecgdgcGKiZBJOGFEOR]jdff[W_]\_]\]\X[]`iw|nxgXQXZZYLMUPX^t~vlqcYPNTUWVTVWY\XSRPUgs{ymja_hbJ>MYRS]fUDGReVEHOXPHHT]Z[\TJNVZ_]]bm{r_`ddgihiehqtpg]V_jlqd:9:;;;;;<77cnV\ejGBLSY]]ZUOHCA<545555555555555545554444444444444445557:=<989>HA32777777678789;:974Hg_RlQ462WT7>GQG;;@HLF><;:QPaL?O:/LL:E:LOSSSTUTOUZW\\VY^VOPORMFHDII@:CMHAM^`ZXQFIPH?@B=:99:=ADHLMMPONHEKSPS\\VUVVU[b]Y_da``RJK@Fgtcj]MPUVNIHGHJ:=jY=Ncgaaipqsutzm`blZ=<=2FYQIV\WRKC76ARH=I]pcEG]urD7@SUS[daS>28HNLKNPPKINUP68Rli`RGH?6AS[[ZW[^]\[\___ñ緜i*1;<46;;Jh{âߠ8GJSdmZIYmVSku}nUfd^cbefdljE>TghD:9KmH/XuO;CCABAAACGHE=9;<<>@@?>;;<=<9999:?EHLQPKGHIF@=?ABDF@:;=@?><9:;=ABDEEGH_קyfF\ez{yxy}q{ǘlkg@LEFF??ADCFSXN?@;cȬs=?DLPOKLNH>=<;GDN~~̆΄qѝwcZjq^KE957887>JOB:=><9999635679988:;:977555333579=??@A@96:<;;=<>@@AGKNMG=KuvxүTED:;>FQP@9><:?aʸmA=207;=>?75AB8AEDCCDEEC?:8847HND<98878::<<<>??C;[өj8=A=8771g͠vUhqi[YQWlLTYRKJG=78=ABELLKBC@=CAHHJZnwy|jOknhRJV[XVTNGNbtuiehkjl_PTTWZTRIF@@CEEEFGGGFFDCAAAABBBBCDDDDDEFGGHHEEFGGIIHHHIHKQUTV]_aefdcca__][Y[^b_UUfrhYUX\^`bbbdfhjjiihc^\][[VMHFHLIGSfqpljknsuvvvuuusmccZMLLKKKKKIGDBA@><<=??@>>?>?@BEHOX\[^___]][Z[ZYYWTPNLJHGGFFFFFFGGHHHIHFBAFKLOX`fiikkmmnnnnnmmnjegificjqYSa]`dNONK[tsc__nohaY[__Z]bccvk[clYV\VTPKQc|uinlbnhYW[`^[YX\^^[ZQOgzvqql^ZZXK=?NKRihVRQXo^MakrhTJ^ne`\QIJSVY^a`]gq`\jjddfdb`bhmqph_bmqtl:7::::;;;4Ere_`gYFJMX[^][UQJDB<5455555555555454444444444444444444444566433445BJB72477776678971BZVFJ[^Qji@57_;BSRD=:=GNJ?:;:BSel\FDRRJGJIBMfcVPEFLMLGBBA?Na^PISUOMORY`XLKXcVDGOLEDFHHHKJHFKLRt̷˻ƛǠvzfklgh©ɿº³ȻαôŨڼ½˵¶ɻؽɥȸͭztjdRM_\rrhhx}_UVytjrXZYMf_uȸ}~pRGiuotiZkpr~{abpNUR|qixv]d]do{ev[RXHJKLRSKM^`JLT[ZZIKOLLQJSPMgLFOO]ECK5:PA9C@YKPQRTVNKUTS[[\`\RQRVUJIJKJD?@IJFPbbXSRKITT?;BFE=7689<@EIJNSSMGHMOPS\]\][YY\dc`a^]\ZURRJA>?BA=>EKIC>>=<===?@>;89:::999;?FKMJIPSPNJA?CGFGLH?<>AA=:88:EDCFLLLWgtrlκdBCFJMMLKMLA:9AMDcr;fߩvƌtrR`my}|wiWC879:@HDHMG?;;;:546789999:;<;:;975346779;<=:65578:;;989;<=<:89@GIIIF?aãi|ü~rcW[46AFJD?Pij]^zZMECCB@>;987579;;;=???@@BIfqKBFDC<899;KZHMmBmd\dssnWPU\_TUVXSEBD=79=@EJNOIUʩF@BBDFM[mxvrcQrse_EKYYTUSLCDbqmjfcdUDGOOMQTFFA@CDEEFGGGGIHEDBAABBAACDEEEEEFFFGFDDFGGHHHHJIIIHHLY__agfdbab`^[ZWYYYTKGSefYSVZ]^``_`dhkihhgd^ZZYYTMGEHE>Kesodelhbivwvvuuwsf_WQNNLKLMMLJHDB@@>===>?>==>>??@BHQVX[_`_^_][[[[[ZZXTOMJHFEFFFGGGGGGHIKLKFCCBDM]efhhjklmnnmmnmilnliiggimb`nlgvrSZgbnxihw|xh_Z_^]^cjs`m}q~}o`ks~kctdXTQWdoVP]jkb[YUSYc\LThnkn]LZkkde`TU^]J9>LLQXRKM]ism]amuvl\[]XVUSQU\TQUX[^b`[ew{sklog]`npmmohWO]tl97:989:;78_ubecfJJKPY\]\YTRMFA;43445555555544444444444444444444444444454455547@GE:33576655647?Tqt_HIH=YpS80_̢BGSKDB@@AEGC<:;JZhrYAKSSOJJJ?EbilWGINLKGCB@=EW_WNUZUQPR[f[IN]cTDIMKIGECNYYVKLL\a̵˻~~|~fhlnȳľźŽż¼¢ӭƽش˯ƶȯ޺ӹɩɺ̱v}miTNY`c|}clmVOOpzlpdTaKggvƺŶzw}HIymhmfcvcxwyzw_SkTQnws{yngZUzg~ewYQTEGEM[PFQdUCPtjkT>GOQTRHSFYg[?:=57>9<=5.-A1?MbYBQ\Z_ura^][TZV^e^av{qb\[t~vYakkAI[R[SOhX}rflYsHGPIu}VygMWP_ciPPVPD2@GNW@EG5>L6:?N]HMPQROFHOOWY[`YQPUX]QJQOOJHIJKKR__UQPKJV[J;@DJJ:45666:?BDHKOLIKMLNRX\_a^]^^fkif`\[ZYWXZTPphof]HDMZSMMD4-Akz]O_njfpvuuvyzzr_RND861-0>RUI6,0.77>>;@@>=;899988:>EJJD;D]cOFA@FLKJNLB<<=;;::9:=@C?:=No}|yzyzܫR`i|~zy|~~v|Ӎف6Qn_@@BB?ACJmĿʞDBIIJKJMLB9;EHA[yT0>ȵefvvN\foxmK?ABCJORQG<::9646:;97899;=>>@A<85356779:::<>@A==>>>>?BCFKF?@@@<::BMH:8:::;;;EKMJGEABECLK:<=ICA?=?>>ADEG>EjK,17@?9::=>FIHGFDBEFGB96:865589;<<=>>>@CEGGEBFOTQJE;8:AKMLH1-5.>b^OWUYWYZY\\ZZZRA9<;8:=DLU_^Xp\>CEB?GRVizmge[Yio_QMRVVUWVPNWj|wY=?DFIIKCC@?BDEFFGGGGIHFCB@AAAAABCEEEEEFFEEDCCEGGHHHIKJJIHGO\_]bifa_ac`^[YVVSOMKHJT\YTUY\]]]]_cikiggfc_ZXYZVNGEFDEThmdahhYYmxwvuuttqfYLLMLLLLMMMKIEA@@?>===>>==>>???AJOQUY_a^]]\\\]]^]]ZUPMIHFEGGGGGGGGGGIKMNKIIFIWcgb_ahlklmmmlmmjknmjihhhjUTd]W]mxccz}zwZU{]^\Y[]^c|us}j\_wxs^WQ[eonijgyqhdcTBHRKAC]plib_llfcaYN\l`NGC@CJHGJDJaihecdglig_SVZYZapyiZOXagmihn|zmlpg\bqtvqukDHr|[97:989:93Kul`ck[AJMRY[\[YTSPIA:434455555554444444444444444444444444444444444465:GQJ:7:86523;Ss~qlbOLE/=hd@0nּPFRLJJHD?=AA=;=GQ]j_Z\VOONLIBD]ijODFGIIKF@@>>HSTMNTSSX[`iePP\^OEFIJGFGOX]]XNVen˾̴ŷvm\hq~ž®ƿɸ¿ÿĻõͿͱű¤ԯɬ̮ijʝ}ܸӵλȰɾɴnopqZYffYddXQQi{onjWeXli˾xwyuLXROYJS:O^WE9A;6864=E.;ME>MFWgmb[OROWTU^[XSUaWF^t]GZfk}~qXNjth|]54HM[JIsX_~s\aeFCBH~{mir_QMF`ceKPMX7/BDQR;KH8>B4:BbUJMOSRD@MNMQT\THOWW^XNQWTLOUTSPQYZSPNMJQaX??DFOH3244445:<>ACEGILLLNRUX\]\_`_fkkgd``^][X[]Xholwh^G6207@IF723034Ot}ub>07G_lfG>NPNouRHtR@DC:61:QRNPRWSHMMHLlzj\b\TJNXWMGHKKFCSkgMqpcs}ac{qbaqV=92*:RWf_GIIJIJPV_XWw`ESris^fph|vRW`V\dm{lSzzW>8149?SRD<416:>EE@=@AAA>;9999877=JJFIGA=<=::::99;>B@>Pl|{xwvuy紖XKTozusrru{~|}~|xrhvѝʣeoGLEBCAA?>?@ADGLRQOK@78=ES\M8;ACB?;>ECHU[VOLIE@CILHFD=K̴k@=:869=:::55@D>67;:97679:<=<<>>>>?CB?;>FNLHEA==AINPQE63243-@RPZ]mdM[Z[_[[ZXO?9::8=HU_ippk_E[sELIIGMQRethdaUMKUYXY[UU]YXhtŠiBHURPAA??BCDFGFGFGGFECB@AAAAAACEEEFFFFDCCBBDGGHIHJKKKIHGPZ]^eje_]adb_[YUUPJHLKIJNRSUXYZ[[^adijgggea\XVY\UKFEEDFP]cbecWWhvxvvuvtnhf`RKJKLMMNNMMJEA?@??====>=>>????@AFNZ_`__]\\\]__``_\WRNLIEFHJIHHGFFGGHIHHJOPJP]^[[]aimlklmnmmmnmjkmkihjgdZE?AS_fcU[lhXGQ~of`VVV[\dwpltrpea~kfe{h^rww~obhv`Q]P=ACIVUUZaglnd^XZs|hdhXEHTJEE?ALSW\ebeiik_MRUPP_qysd[bdbacjotwsppme`enxxuxqU_X98:989:48gwaaemH=LPTZZ[[XTTTMA94355554444444444444444444444444444444444444444567G^dUF=4264?ci^][XP81LiRAbHVTNLLKE@>A>;?FLVda``_[TOMKEDSehisqdWSOIDJMJNSRLHMSVY_dflgYTTJEFHJGEKT\[WYO^~˸ȳƨvĕ}_a{t÷Ⱥ»üȥ­º˦ͬҾIJɭDZ˭üvү۵ӱ̻;ǼĴezlrSZN^y^^c^VSfrmyn^`gt}ɸ{g\Va{qzvppzg=bomWrklqWojp{zjav_]nrx}t^toHN_Vo`zaNMEMVTKJSaWJH:=759RjJLNPPN@DVRMLXVEJYWWYMPWXUO[]XZVSTRQLKMO[]G;CAFSG10000014578:;>EMNOQSTVVVZbb`flkifefec\YYWZ^zesyi_VUP]O:323?cul`iwbN]mmmnlljhcWD6--@QblN003545Bdvwq]=05FblbF=HQScuvum[9=74342;l}lcRJTMZkj[ktdeZW\`dgdN@GFA?RmgKۮ|wn^P[b\VKPpf9362?OOQvdJPONMMNW]aY_auFJb^Zbgccw{`NQbrsgXje~WUU?25AgtP80/2549@@@DCA@><9:99865:?BFGA5/KO86=6=DC?>====<;:8887:ABF^wyskirmezۻXPlyokjnoqoq{~phpzȐ{±aPRGLHD@`kVyp(6=GMJKHDDCEAJj{[][\ouqj`I=FJJKJD@BB??=99;8:A?96676:<=?@@=60/2344556555DOG@;8CTgmilwl]YYXYYXVXTGCDEDC?GLFEEFGGGFFFHFVoI7:@A@>;76789::68?@934;:?=<>><;;=ADHKKOQD76459<:;Pppe^XRMS[_[]\XH>::;9DVhqvwypeVؐOOURRONLTlo__fTIU_]^bYPY^^uܝRK^^A@>>ABDFGFFFFFEECA@AAAAAACEFFFFFEDBBBCEGHHIIKLKKJHHLTZ]]`eb`bdcdaYVTPLIKKIIJMPRVWWY[_ceggggggc[YXZ^VIDFFDDKV\[VU]lutswxwwupb\_ZPKLLNNNOOOLGB@?>>=====>=???>>>=?P^a__\ZZ\]]_aaa_^[VQNJFHIJJIHGHGGGGGECEJLKMSQOW]cjljkmnmlmnomijklijkgjdO;G\cbb`b^`ju{`wsrkTES\S_`TYfsxpt`\s~|wzoz~iZfwyuyiUNLRZYXWRZiphZVbs|rTEGGCKGHOSRU_ddcaei\Y]RO^aaigd_\SQU]chhhnomifjuzwtpmkk_og;8:88:93SzeWcpa6=IQWYYZZYUSSMB9344454444444444444444444444444444444444444444458FWbimhT>115Mvnf]]\UI;/1W^KhLa^UQPNKGB@><<@JSXZXX^aWPNIEBMbo_PKGQXXTUSMEIPV\_cdalcLFGGHHGFFIUVXT[Tbþɸġļһs{è~}xhнɦıȿżȯɯǣϵʱΩ̽ͳ|fxڶӰʷŰ˿Ľĵii[[UOepq_ga`WZid|fUf{ƱqKLtofertplm]McngTulffS{|dr{riodyrfdYow{qsTqqCKWO`]{cNKFPUNLO_cE8IWQQ>OXTRJIRKMP[]MV`O27NO02+-0LRO:<@;M:TH=V]lsdPCBWlttqoy^bzʞm{m|hx}{WIJL7@U_tqEOQItGnrzbxp{rzQIHyyK?EX?(44BQ>AGK<:77EbTKKNOTJ=P[NLRXHGUZSRNKWYUR[a[]^VRTXSNKOX\L=CC?HSF310.-,-/23467:BJLOQSSTSQXbb`fkkhghjkh`[YTWZ^onlkb]_W]J3:D:Plqjju}nL[goi`dga`^D1/0>csspQ556516VpqrlZ<05Ecm^B;GRUYfwi95B954430^z]VPc||v]]mt{rK9ACB;EhaJ½wlbVLR\IFMk^97JIDN`|hNUTRNMT^a`\PRoTo\[^YTkyu{nzjCFVa^Z[cx|}vmF<9=WaQ=612323;??BDB>=;:9987669@FGHDB9;99;?>>?<988:@BAIaz{jamr˻Ye}~tknkmmmor|vwļ{afQVVNQSQOevnnsҘY46DJIKJIA>JZQEGEBY^CZSgVPiuvPPOS\bd\K@>>=@AAB>?AAB>9:;8:>:776336678:<;500123334543359:9?DDDDDMXURJDMPLE?@KONFGUZTRWWSZeb`]UQPPNI@=HSSQOU_Y¼ӽaGDHRZYMGMKIILSPIIINKBF\feb_\UJCDRhxtuylabcabcbabYIFEDDCCILGGHHJJJHIJHMm]8::?@?@>:6667898:?=614<:6;@BBBCCCD@<@IGA@<:<=><:;>><<>>;8;@HMQPPNKGECEHJIHHHA866676>[~web_xOMZ^Z[ZPC><<@EKamtww{toúzBCMPQQOMKUfdZhuse_`e]RYZkĺGBV@?<=@BDFFFFFFFEDBA?AAAAAACEFFFFFEDCCCCFHHIJKLMLLKIGHOUSQ]gecacdfd]WSPNLJJJKKKLOSVWY^bbcfgggihc\XY[_ZNHFFEDIRPJPaotohnzyvvvtgXVUSPPNNNPQQQPKF@=;<<===>>>????>>:GWZSSVUXYZ]_`abca`]YSPLIIIJLJIIIHGGFECAACDFIIIIQ]gmiflqqgfnomlkklmkkligjfPJR^aaedOB~luxxsmgdj^@CPNQW`l|mSftnxt{}}|{qn}ymiaforlbSHOgsh[ZUSZgoyzcMIEGXVQYWTUWXY[Y[gicb^`kijmeb`]YY]_cc_[Z[almmz~rpeTUXRfxmg=6:99:2AruWZgrH2>FTXYYZZYWSQLD:335444444444444444444444444444444444444344444559M^mv~iP=/Tyfeda[PA973+9GhoUeb_YQKJIFB>::;BHNVTRSVWRLF@=J]rsSONJOU[ZXTKFGNTZ]^`T[hMAGLJFDEFFIOVT_biȿѽÿŢy}ƣƈvmğĹļ͵}xrʼ¼ǵµųϫ¼гѸ٨ʷּȿõ̰ȴƨtauںҬîʼȶ¸|\jvi^g`bmzirhh_Uae|pSV÷yjƴs_YTQc{xmkb[gk]Rl\Y[~|p_}~juagwps^lNtv]~ssKbr?GQFU_hdNIENKOV^gL9EPLAARWWKKGHPKYTbVKJJ;>NE49:/3Bdv]K9L:CD]>GcXYrm~rofkamrW[Y[xppoO]oKFHL2@]cPZeXSY:pN\pf_||“rQEZd@=HU/.47FI;AJP=::=V]DPIOJ\@C\YOMRHDQWSOKHTZXQS_[[fYUX]]VVRVULAAG?CKOD9610.,+-013579?DFJMNOPNMT]_`gkiggjnnjb][WWVUV_w}odYNK[LK]PD]pjluzygUfuo[UfdK;6,3FSYe]IA;7553,8YhejdV@15Cdm\>;FNTUWZUF;=B>42461GcWlz~ijxx_QL?<=<<4;^[K˲wwza`FFOVG9EKQMLhp^YUTQMMW]][Sb}td^\ZZdtpyTcoL;>BOX\_nw[PG:::;?EF:3469;;9;AA=<<;:655568;<=?@ADHUanoifTDNRLHDCAAB@;::=>?:5?]ssieռ\rwd`jloooqw~ĿgSHfµ߄LXWZTPT]svlVђ\IJKIOTMGNc]FDB=Oy{fTYupdVHACVdSacSCBEA>;9;;?AC@9543578:;>?728@A=?@@@ACDCB>=EEA?>94=BA>?><;;<=><9n|`]igq˓HYaZZTE@??BIRT^dnuy{sv>@FLMJHLOMOLIV`WR\ceho{gcpiK`?=;;?BDFFFFFFFDCA@?ABBBAACEGGGGGEDDDDDHJIJLMNONMLJHHKLMWdgc^^fihd^ZTPNLJIIIKMMNQUWZ_`_`ehgghhe^VUZ_]TKFEEDFFCObkoibhswvutvqoaRQPOOOPOQRRRRPLE><=<==>>>>????>>CGJJHFJRWXY^aabdfcb`\WSNIIJKLLJJJHGGFEDDCBBCGMNJObomdfqvn^ammkmmmmmnmmkghjaTWkjb_POQlvUOWkqjh]A@ICP`kQRk^Z^vwn|nj|tltdTX_mtnqqdTSfpcXXUWbefqzjQOFRgdah_YZXVZ`_ZTWWZittrzwhd^ZY`fhkaQMPTYbjmrndb[QTXW`smd=5;9:46^zcS^ja67ANYYYYYYYYSNLG;235444444444444444444444444444444444444344445668?Sq~}ucKARZZ`c_SA54664/4zRQTSK@<@EDB?<@IKHMQONSURNLJFABJa{aY\SNNOSVRLIEHT__\Y^\Xd_NCMOEBDEHGIUWj}}һŶqȦŐxc·˸˷wvn½ùνʺ³ĿĻŽ̹ɵʿ׾þdzֺѷuaöپиϻʲ¨uSqt~]kl\htqv|fe]_px~yMròpʹ]SSLKM[}rljgjjTTdVVe^f~i^sVo{zv{gdypRhuVqmqQTuLDPAN`xZfOFEBATmkLCOX__^gXQTG3GI9%5RM441=OAA=[M2>?F]MHMJPOTBS_SQMDAMWVKIKRZXVQX[VabT[_^_]VSRMD@HC@DFIJLKLPVY^egeehimkgcb_][XWTVgzqUPPKY\glKIgohmx~zrld`YTavf:(.NOFCF8EPLQ]`bmrdYRUYVJESbc[YrvoxjUTZay|kA8;3012469;;;=@Wyzup`[qn_YVH;=B@99;;;99=DJWe^Qk|^vzxmjligkpsyw|ӥdPEH{`SXR\_QEToqpЂFCDMPOONQLD?<<>?BGGGFC>755776445568:?B?:7664333344344441258@A;40359@CA>=@A?AEFGC?>=AEEB?=<9><;>BDFFFFFFDBAA@?ABBAAACEFGGGFEDDDDFHIHKMNNONNLJHHFIR[_][Zakkjhd_WPNMKHHHIKLLOSVY[]_`bfiiige^TQV\_YMFEEDCCGR\`]\gsrpsrutpkgZJIILPQQQRRRRQQMD>><=>>>>>?????@B@???@JVYVX_aacefeda^YTOKKLMMMMKIHHHGGFFDBBCGOQLUltg_jrpbY`efjoommnnmmligehbdifmgLIvi_Tj~}vfI>ORTVovdWL`aWdb\Ymt\Wdoml~zaW[dcXWbe\[cdaabeaiozzs`GCLenmkgc`aaa]Y_aUSOO`kidmnjh_SU]dmukRLZc`]`ec]]aWU\WFRup>5;:83KsoVU_hH0>IVXYXYYXWWVPLI;1244444444444444444444444444444444444443333456765AOTMGNX]cbUEGVbe`VK=5888.DsTVMG?;;?DECGNNQWTPOMLPRPNPONJFBKoqjz}m\WSRTSNHEDRcfd_Y[dc`fcWSRLGHJLLJS`tѾĻ;zuçpȶյƼutt¤½ľƩƲDzͺ̻̾ǼŲƽҸͺּbĘ·ɮ̷ʺɧ˻ŹpTotterccrrmjda^y|lfÿnҔS67W`UTZhĽrjkidlSaXR]ntWto[XRvz|z{nZlQ]jk~ci^faZlfGUBKS_VdMF@>LiuR:LF8;CQYbgbR=EOZmbZX`^Q<>USP;;L_cslYB9Lp}c]J^_UT_^aag^vwTZZ[^w~hIB6PFGU_DQjVqshcI;FocqcmO_b˒s@YmPRMUK=7BDGKLNPSSV[^`ceeedb_bdb^[\\VU]unHQh`^eseCOjnlnu}hZJNPUav[66CH@4./002233322?MQPOMFEID?BbkY<8DFDHHE?;<=CB625/>u|hajik|opZ95887605;:DOZ`VLMTlyw}htokjf]SYlqvgH]vϸ]PHHmï]UOCKa`HFk}wéL;HJFCITKDG=:L\s{ksrZTHd?KKKGEGKKGBAAACGKIDC@;8667776558;=AC@<8876511233444665431248<;LO?4158>bp]WLFIPRXK:>MTTNIJSSROfnQfpDAD@AFLPQOOMKJJJJHHDDGBZi@@R[Y_rnTv{nmligd\WVWWPFELUPMVTMJJJHEEC=\g63;9::;;;5017BJNOMF;=EFB?@BCCCCCFIE?CKE<;;:8=GMJGEB>;;??<=>899;=@BBA?=?EILNQRQH<8/9ozC:FLIUojvZO[TFIJIMLHFJZfs}|x{i9LKIJKQTTRRWZSKGGKBPķƎhjnl==<;=@DEFFFFDB@????@A@AABCCDEFFFDCDDEGGGIMOOOOOOMKIECIPTWWZaggikljb[VPMKIHHHHIKMQUWX[___dghihb\TPPXa_QFEFCADHJMNP]oohosrqqmb]ZJDDMPQRRSRRQQRRJ?;<<=>>>>>>>>?@=>>?@DQWTQXa_]befffd`[UQNMNNOOONKJJJIIHFECBCFNROYljYZdc\TV`_ajnommmmmmlljihjjUUf]GPltxib^bZGSuaA^aLbpnql_W_bdbgg_Zn~pcg{o`YW]du~yk_`a[XY[bgotkedgpicl|jXOFC[fgh[TX[[\WKF]mbTJOWZc`^bgebadedqxnZU_eiib]]ahe[[\KTWlwp@4<84DIIFCRaVDQcRFIKNSSOPLIFKTPO\dovvg]ZTOTSJDDEP__[YVSU\`ZevpYOMOONMMN_ȿ˾—y}˔ƸԻڱ~m½ɾĺ¼ƾ°´ѼϿϳվɹijճ˾µmɒϪ¬ʺȠĻŸr[`r~~lmZvmfwcW]v{rw̡M:=?giVS]csĪmhji_jOnRTiy~a\zniEQqwzxv[nJL^gklq^WeganRYEDGQRqcNE?B[oX4NR66@JS_gxrbEET_\IGUcW;:ZaMMOdbZY`GFUF_thNVFU^XBMXY]cYRf^K:Lgzho{hLIoXhOIVDVaff[{B>k}YvX[xoů_Bq\fieSMBARA=D;TZ,:KJTKFPCKYOKYQSNMBBTc_F?LTQKUTPRSW\Y^\\]SIN[[ONOHHOKFJONNMB4,00+++-01259=?BGJKMOQRRUZ_ccbbb`_aed_Z\a^TUceYZtq`nub8Vjmqqx|fJAJYXB@TOGF@5..1212223331=<>EGaiY<6?AAHJF@;9:=:43648Y~ynijelŔwhVb{N6;989507>:773BXmjicebXTZi`PWPAAEFHJLLKJWymq~gXQQRWY\\\jwaqmU`v{E8JXXbuqdUNJHHHIE:6;==97=EB943468;<;;;:<>CFF>77=A<;=:Vzqj޽wdOHurH?ABA=DZcef_VP]wifwva`XOzr|~WAOW_\jůpYVOUXJFABNZQIsճxr~ow~bH=CILHAGD=;>?<747<=;658:;<>>;:9::710100234444356544324=GJJJI?=>8>CB=981/Hkp_Z\VPOQVYL>>?@>75CSRSUYq}lK?CBHo\@EHILOOOQQRPIIMMKKJDCE?QvbSi}up|roslgigaZRGEFHMQNOSTK>;@@>>8GlJ.79999876206DMPRRRL@<>=8557@HIGDFJFDJMB98765>KNJGDBB>;>@<<=:;===>>?CEAAIMNNMLGA>5>>>?????>>>>?DMRPKKV]XXaffghgd]WSNOPPRSTQKKKLKKHFFECEFJSUW`XKLQOLKR\_`fmnmmmmnonnlmihi[PPPJ_oXTTKXWILLQgt|vv}mrrpmcneWZl|rgdun\dumhrmcgqtxexyjc^Y\ilhjt{tl]Y]^\eeXLIMITX^^QORSNGHJO_oeRL_rsthcghikjgdcll^Y\\^bdb^dpria\Yb{uuzs@3;55Nmj[V]fM26Laffa\YZVRSTQLE9344444444444444444444444444444444433433333333455666677753235A^kfgdVK@:?:304KꚄ}ZC=>?CFFCBQ`SCZvcMGFOYTKIGE@F\bY^gp`WY^^SNTPDBGGIPPQPRIDScULeudQPTTRUV\eź̞|vϊǹà̿}ƷDzа˫ȻķǸǼճѸwȐſ̧ƸЮ«Ƹ{c`wwjdtmgxzgRfnuugEDDEieRP^deμjgjnb\OzsQ_tf]bzyo~rCOlpk|flXDP]fkufS`j_h_]<6?RDmeODAEWY7@]C2?GJR_[m`WFL\^A3G_T95EUN::6554433@Vdkieae{ݢsO_=49768615<848>9634777:<<<>@BCDB@87=AB=CRgx`l{wmOY}DBCA@@FY_ZZZYYYZ]`wkYOsǘpa}vxH?LR[`ý̺{skdjvtXOIHEFPSNq]e{ycvf?=977::89:768:;7423321245331586445666;@@@?<=?535679=;57?FKPRUVXWYSB7899519KSZZVVYUJDML=?RWKJKGLQMLNQPSTMKNPONLIEBBCXtwy~rVTrnjonfZP@9BLPPUZ_[G21::956^c567899875422=MPQPPPNE;8679:61247@IJIIHC>=<@B@@ABBCB@@@@EGCCJNQOKF@>75dxRCJOPVWKZ~߆FPSQPMLMMMXkxnUPPS?j@GECEHOUTTYYVTSLPs~ɬtw}x޾Φ{w{99:99=BEGGFDA?>===>@@@@?AAACEFFFEEDDDEFIKNPOPQRSQRSSQRQRTZcgfglpla[SLKHEGJKGEDFJNQSW[^`dgihb^]ZUONLJHCAA>@BBABCFTdgimswug]^`TEEEDEEGKPTTSSRRSRND=><<>>>?????????@HOKEBEPOMW_bfghhdaZTPQRSTWYWNKLMMMKIHGGGGGOWWVTNDCEGIOZc^[hommnmopponpmgjnYHYdig`^^\a]MLPXhlg[Peyy~nhigbcg^Xiujql^i~~sig}jW\glj_Z^`Z]YRTchcW^eUPLGQWURQRUI?PdkiqmcYWiolfdcbfeb^Y_ki][Z^miaa`dmneZY]bf]c}?484?bn_Y[d^A4=Thjigb\YVQNMLJD8344444444444444444444444444433333333333333344444567799998777:@DNa_K>65:813-)qVYCDID>;=ADBENJO{gQH>KWSJJIGAH[gb[Z^UNV\XTTTNFGKJHKOSSPNIT^TGLSTQMMS\drӭ~oĚײɦʭ˿̸ƽ͹˹ĺɸšŹvŨͭϡ˱ʽkiwrdeoyogjrmbhs»mČOFC?AcaRO]ebe˴ofjncJ[jRjy_dd{oupMOs`lrvXoQKQYioaU]`add[3-=RBJwUOWC[dyxdc]DM`^aWR`s}thfWRO571tPFWOdLxti`mR}xix=LRJhFCMHZk27S_OKDPDCVIU]K^TKHIN`c?AOOMP]VJKNNSXXW[XLHOPJGGEGQP?CTUTUIDC:373))**-//26;?BCEFHMSWXWX[]cjnnkhjid`[VSTUTRUftfliQ?]gryfI8117DD6:HI>2135633201101224Od^SLA945847C`iW8046=EIID@=5126531Pidbjlc_vxrG23;=@;545569CDBA<:<<;?BBCCSzVntdhpLUIHE@BNSOQWWWVX^Z͊uf[M_vZiկsrLS^\Yo}v{kfXPNOPNL^xgm{ȩjrz}{nJEHKKJBEVSFJOVhv|ujmq}sjq~svzvprD;B@ABDJLA743;EBLdeB=78?@=<::<==;964256565676644454212544225:898558;;;532147777412;<@OVaaa`LDJKE;:ERX\XV[\PMPQQMKJJLQSLEDEGLJHOWWTTTSQOLF?A@98N~jehr69gvvsmcZTA5BGCM]cpmP;9=;62HeG8>9;=:575766>KOQQRQKB>;:@FIHGGIJIFEFE=9:4018@CFGKPL>AGLQNKE>;5VvUBNNOQSRFVyBPNMLPROJUlqYDDGKFAr\DIEHRQJJT[YUTRQTe}ƻwgcRdui:::::>BFHIFA?=====>?@@@@@@ACDFFFEEDDDDGIKMOQSUTUTRQQPOPQRXaeinprobUOKGBACEFDABEILPSW\`bfhijf^[ZWSRNF=9=><;>>>?@@?@@?@@ADGC@@CEBFOXcjiihfd^VSTUVWY\[SNNNNNONLIHHHGJSUQV]QA@FIMXd\UeponmnoqqpoppmjnfNXpmbdpgae\LOZemmh[MOY_ZS[]cgPNj}ujbiy~ZYsrgYWba^\Y[][_UOU`ldUVUONTQcaSSPOTTUbptrolmbTZaehc\_b\ZYWamkfdZ\qvmba_fqiUY][WTS=168PmhZ[ciN86C\jjhgc]YVRNIGF@74444444444444444444444444333333333333333334444444555556666876736EQRF;76655->\\PMZabFɯ}kcfhGPueYqp`ic|g{~~lOPz\ntkyhw~gXTK^hZV[U^d_X:5LT>eqaMFCCCBL[?.DLENUNUA>PJXY?=HORC;GLJcsaPHY[dkiV]R:Rhg{w>AmmDJfq_aYACgjmeYtSRj^OIEC_[9;7_@*)0]`yxty_^qfB9LV\j:;3*()(+-./17<>@CDFLSXZYZZ[bkmnmorjcc`YSRQRQT`obbaKB\baV;/366424DKC6.0344322110000121FchTB3126=@>E`iV72978AFJHD?6/04549btnqneXTXOJlssɌ|kbiiUHA>:54:<:BchedxtYKLXVVTTYjyqPFBE@ACCBBJXYfx|~|Wba``cjno~vbbdVma;^bCBq[_ml~xvvbH?DB84239<;ANNF?;==97@GED@=?GE@DGEDPju}~rvո|qsbNBCKSPSZYZ[YlvPWYMJO]SPj~ңikomc]^i\FkvtgqcWPONLMVav}{{ygxdWZ^O=8ETSB@SYR\u~zqrqyjenuuqos}}ye<@KKIE@>;83049B=Afb199@DD??IV\]WNOPOME>AC;9dxXpv>16[stui`TK?>@<@^lrzsTD>=>6;^]>B@C?:<==<::79@GKPTOD<<=?DHKKIIHGGHHHD;67433:BCBEJND;DE8:ABDDFEECBA@BE<9AGGGEDD=5@`_GKNQRRNQ\gjW`hDTQLOPMLKTd_MJNKEFC<@JPV_httgVSVRPSRMWyylspZ_Z^x}f[TZ}mnoW::::;=BFHIGA=<<==>??@@?@@@ACDFFEEEDDDEGHKNRXXUUTSRQPONOPQWahmppqoiZNJD@?@AAA@ADIMPSW\adefilh_ZYWYUOKC;7:<@DB@ACCSjrsuvvxzfRQPJFFEC@?=>==>?CHDDIJG=9=@>??@@@@@???@??>>@A?>@EO_jhgggf^WUVWXXZ]^YROOOPSRPLIJJIJMOOT`[G?BGKS[VR^kmmlmnpqnoqpnlji[[cYGEHRof@8?\vphrp][jmabjfa`TN]lm[Piiciqnw|{vh^o{kVVUU_]T\`WSRSNX[NHGJN_u~ug]SDGR`a\`hic_ffclskb[Z]``[YZkd_b_[_lnefoxwkZUY`inevE+7L`hZY^ia;36D`ligfc`[VROJEC;544444444444444444444444333333333333333334444444444444444456688764;JLA86566*PϜ>@efF<:9BOL@89;PnhTOKBJVVSNKHGLZlp`TPNLKJMICKSSRNJIUebUNJQSW[WUWUVzzT_ɽÿȼ«ĕ¢ŢĦ̹ŹŴȿûɹǩֲҵ˼}xfdtѺƵǺ˦Ɵλ˰yv~qoQd{k^`[ulvvWǀPDHH>=RTMJY\[Gh¶ufdo\MOPY:WNUc\C=MdV78BV^gVLIXTT`shc{APjeV[dA7Lde9<_z}wrtkffheqtxII[PDBAapTP_ff^F3IicyuWǎx`jy'AQ^yXVWZ^e;,HsXFHH:DMKWSJ`c?NGLY\>BMMI[aKGJGILRVUUOIIG=@QR=4:=86Scdu\LQUUYYOHIKFDGGFECCBBFXhaaijeoa`epz~qv{rMPuU5Os^In|`VhvlllgheYJ?;=>?II=7989>@A;8=?99?EECBDJNKBCJB?Vvwʆy|_WKNWWVWZaaYS~klYX_OGmsbVPQRjʿzlmh^URTYZUsVuwI^]TIEIIJVZ_wj|o{p>5AOC2@adTNarjlwtqpqtxre^gceksyzxx}xovr_]q`@6666756989`h9@@BC=78;?A??>AA=85576788886555433344689;?:CQA27<7568865442332337<@?Tmie_SIFHIJIBF[faa`SJNPFAEMRTSE:;>@>;@JY_[OCHOQNB;@@:O̾ML[qD-2:KSSll_F;FNDD_|t]LDA>BBL`QMPZODGEEA@;:975;IRPMD:;?BEGKKJKHDDGHFB:74123:FGEBBB:?OI<;BECDGGGFECAA>7???????ABCEEDDDDCEFGIMRVXWUTSTRPONMNOOWdknpooopeRFEDBAABB@@DHLORW]beefimlaYXXZXQOLG?79GKB<>A@SkrsuwwvxrZJGFFFFB?=<:86558=86>>@@?=>@ENRW`cca\WUWXY[\_a_XQOQSUUQMKJKKJJJLS]^SA7ANLKLMS`jkllnqqnprppnjihicPITQdd>2Hmxo}wnacqq`W`\Qb{{nWRQentxpvik{obmuv|ypenmYSRZ_RV\OJFC=?JJFDDAKbdeb[WNTHIMQT]fc\`faltcXXW[kmf[SVfdb_WWakgfwl\YXYafickvB,Lec]YadjM145Ifkgfca`^XTQKF@8444444444444444444444433333333333333333333444444444444444555568::549??:5459.]у7?WvgJ:8:AHF=469Cb^BDMFHTZUMIHGJS`mgZRNKKIJGAK^]RNJJW_WRONSTZcYTX`aw}WūʷǪ•ŭŵ̥ӷȻ°ɼ˳®öǵȸľ͹ΦٴѾĤi{x~{ή¸ʯέƮlpaYmtl\L`wkZvĪ`EEII@BA'PaMJBD@MK<;IJ;@OSWHKRG^_R@JkoH6G[a\H;C`i_irhotISXTIVkj=C9aa;BLiiOqsRDj^[klQc?EfhY_TXif83[Kjsacȱ~ijG*JXqZkI]SV17geQMK::ILGWOQiVCOGLXM9HKMM\QCIGFHJVWSOPPKBAMWH7DH:/.((/.*(+.039@CGLQQT[___`acdfhgjmle`a^TQPTXYVTZzq=Gb]:*4600FA77;;;;<>?CHMOOMC?<2<@EB9>HFBatT_I<@?====<>>?CGH<667998843566555555658=>68BFC;753211/-/3209Tef^I>DJMK?6B\hcaYGAKOF@DHHFA<;>=<=AELUVMD=@KQJ<:@=99;>:@FIGNLDCFGHHIIGDB@>>??=9741/1?SSE>65=OWRSRWWMGJIIHGEB?97?HKIC968;=>DPQLNKLdubQcgOFRR[fgls_KKPQPQQRRSPOU[bic[bpy_INQOOPRNIc~|`sUWXYZfmndRM^WI9::9:=ADEEFB=;<<==>??????>ABDDCEEEDCEGHJMOPPQRQSTOLMONPQRYejjlmnpqo[LIHFDEECAADHLNQW[^bdeionbYWXYYUTSOJCENTK<9?@QjppsvwvwxeJCBBCCA@><;:75554456;CD=57>?@AA@@@@???>>>??@@>=AB?>FSZXWWVUWZ\]_`bc]URSSVXTNJJLLJJHIR]fcM<:COSPONVdhhggpooqrqpomkileY^g`Z=DRXUOOLLV\b]VYWdNELKPZd_[]cfjdUMKOZdeeecciejfa__cb_hqbYZ[[`iv|z@=fj]Zafk`:158Qkjdfa_``]YTNH@8334444444444444444444333333333333333333333344444444455554555556777758;;64663id3??QYO<6:::;836;:MV?7>??JUULHJHGQ\dhXSROKIJHI_shVNJJQRKNXUSVW[XSQmzs{΢зŔ˪~ļéĺưëŷ͹ýͰ·¼ƺǷ˾ôšyŰ۴ū|ʩƣŨppxrlggf{hIF}ob̃NGEFGA;=BFFVRMLAx¸tinoc^XORRPWTbcnlqldVhol~{ffacfgd]nn_?\[TPTXMGKLJ976#BaQKBECDA9@`cchgbYuqYM@Q\cx?HBU^WP77ciIDglhgCL{gOKKVLJDej=CkH8ud?.XCVHuʈ~ryn›=4Qd|i]L^ORBOm[TNB3BDHKQQahMJLGNLA>DLKPNDFE@DAKYULLWRGITWM;40126303312222222212222/IKVywtb_c@9bgG:AGE;6:@C@86;:CND88;<>:76AKNNOSTRE0=DHD:;Vn]k`FyL3<<;<>>::<@DEA958975851367888888679;;<>@:@Z_LB>C@?HKJ>8533210..03438GUU=2@IIFACKWbe`QB@GJGDEHGB=:<<<=AGKKHA>><=BD>79=7Un\sL+-8=?WX53.DgORpxrrF44479@?12=:43687775546FZO=<=AKRPMPNUVOJKKKJIGFB>;>BB<88;<<<ABCEB=:;<<<=>????>>@BDDCEEEDDEGHIIIJLNMKMNKJNRTVXZ]cfehklorvgTLHGFFGEDEEGHJTXY]]_gjkohXWZY\WWYJCPYQV]F7>ASa[`imtwwxlPB???@@@><;;:8863367;@A<668<@AA@@@@???>>>??A@>>@A==@HMOQPSXZZ\^`bdfcZVSRVYXSIFOOKLJGM_mpaNUelmdVNQ]eecakppnoppooomlfk]\yGBi}{SFMA^|vg`nwyzrtrpmj^YVWS[p~pm}smnb[djiePB@;<9AU__^^TNW_[MVdYWMT\NGO[^_bgkjZYdSHQTV_ilYYyoec^VSUXYSSQQW^cnv~~PPmdZ\cfmN333=Wkkfea____]WRJB94344444444444444444433333333333333333333333344444445555555555555578777>B727;UtH6C>>GJ@99745755<:JQLJJHHS^YZPLRRJIJFV~tSQPJJKJGO\XORW^`[arƫѥѽƞǛ̫wůȽ¹ͻ²ïͼ̸»ôʾϿxõӺ͹nǼǪyɝ[ym|hmr\s|UQxvoFHEDB@99=DFRSJDH_gjob\\Rb_TVKXUZizh_Ytnotzafg[bg]ZYefMA_`PNSRIBKJ>65*=5CRB4DSM@@F4J\LUR_rlZa]TL6CJYjNU`NKVXzsNJLWkk^B`X``0/QyjfvpkiUT^fdRG[KZ\mYGfG7T{~qK5]Qt\@vsקz~7=etqx@]ZZfN^c\TG58BDAOMXebMLLGID?;BLHMFGI>>>AUZVLSULHTZR<8BJB512445:>BEGJSOC?6&*64*',--.47;@IORSVYY\`bdedccehhfba`[TQPPOMLT\T?HZ^D-+7IH82233395154555655545443340;:KH\c=06;GLMKOZc~xbd[acffaUTUJEMKECAEGA@FCBHPTTT`oqkcWJj`PXjjWXokGEPTYcdXD@F@<::87;@=;::;<5/0,-6;<===;:::;>=75;?99JSF:7=?@BB>4244420399665216AD50?HHFBIMKX`TFDFGGECFIKHA==>>?CHMG>9;<<<:867962b9+4452254@`RMPI?>=:ABNVRZc]bmupnwXfcygjy{dmuB664>LQQSRMHIMH=897400245546;<@>87@HG=64;FIGJNOMMTcqnSWVNZnldZOUWKLQLJKTWW\k{h;>LOD;;;<<=>?????@AABCCDEEDEGGHHHIJLLGDGLMORX\\\]^^`acgjlmpk\MFEFFFDDDEEDISRPVY^dc`jl^[]Y[djdSJQWJHTI>?DONHV_druiotZB?>=>?@>=;<;9973255:@B=999<>AAAA@A@????>>@AA?>>?A@@DHNMILV[\]`acegd_ZUSVYZYOIOQMMKFK`osr[YnzumhSM]jjiejrokoqqqoopngqx{hQQouc]]bew|fOPQ:Eznbncd|}v~g_deeywbq|uspnt{{fLJT^_SQE;>>ES[^`^URYZXTUbdahmo_SYcnocadhaemYJORWagcUViqf\[YRSZ`YOQKBJXagedeSWd\X]]gb;143A[lnje`^___]YVNC944444444444444444443333333333333333333333333344444555555555555555677859QP49OJE?=FA>>>@@96899969<>@<89;98BNMJJJILXVOJKPQNKKEa{XALQKIJNQSTWUQUlxv׮˳ĬΗ~ˤuxȝɲͿƱ̯ɹ³˾ҵɛɯyxʙŖ`n~ynfrfh|k¿ϦgHJECB@::=@CKMD@NQ{ƽl`kh^URia]Q\cKGcqt^Wd~pusy\^la\feb_[\]OQ\YSQSM>HKA63,:r{aRJ@A:7:MI8;FG?AA@FZTUUWa^[O_QKDCRK^eZOILGGH<6LIEMKLCB=?QYbUKVSLSUOB5?NPC4'*//269<@CFKMQSLD<61,*+,,-158>DLPRUWUW[^abbccdeecba`_\YUPNMOSRKHOUXNBFPK6079647?63;?B;;@=<>@@?95585;>=:@C@IOVML^gY9AA;6.5>B@:885101;]_XVVUSTaiUz}|o^c^VJ?@LR=2i|rSFFGGEBA@CIHFHKHF`ŲmfuXVY^]YRZxm|}Qx[Pkv|u^_dK?XP;EPLIO[ZE799PjG-515>:8==:9::741599:;=?94312237;<<<=<;?BB>628>@???=879:9:81,.0/.16=FID@<867<>87BGJJFHPOPOD@HJIGCACDDDB=>>?ACHOKD@>=<95456941i_1=;97007=CJQUSNGA<;GRZYTY\`fhorZZſ´ynh_WMFGKLJG;565543334435646>FKQUXQLOUa\PZ\LMkuZTZRU[WKGFJSZan}{RCKEB>>HKMSSOJ^kffr^MTXQQjnYVWXZ`\RQSSRRNLNSTS::99:<=>>?@?=;;:;<=>???@@AAAAABDFFEEGGHIIIIIFACKPRUW[\\\]\[[]_bdeb`daRFEEDEDDEFFCGOKGKQYZVTYff^]Z[hqvjX\U:8?;=>?A@GQY_geVWlfNB@??@A><;<<<;843339BGB89<<=?AAA@A@@@????@AA??@ACB>DILGDNZ\[_acdfhfd`XUVWX[XRPPPNMHI\mptjT\naen_O`|yj`eg_boqrrpnomlow}{yocVUR`^SakhLTYD4BcoujMZdQO[j_ewuypcdzu{nfegbhsrjm~|tZTdi_TWUFDJNT[]]Z]hjd\UZ__^hgd^U_ge^_a`bhePCGRXZZ[^ZVYabZURRbnmaPKC:@P]hieZLTZXW\]jP2652E_oohb_^__^]YWPD944434444444444444443333333333333333333333344444444455555566665555677973JnN.\dB=BLLFA=>D=8BC==;:>AA:89<:8=IKJJJKLJPOMNPPNMII[WILNPLJKQ[[URW^Wvѳĭ̓{|ҳ¿þŵ̯ƿιƹϾʽƱδdzЬȿζʴs}Öv_ffnhl}÷mVgFPB@E@8<><@EB>7;EN=9=><;NMjkPDHY|iZ?LZkNhoRBamƭf~HBaΛv|yE6jZvTSZQYJgaQE65=>BJNMbdVJHMGMO5>TFGOLFAJBNT]^JMZZUSNE9@LVRF;/*--1559=@@AFRYRPMD;;;5/+*.279;;=?7>87MZVC:;8Qw=30G]DEDBB=:9:63Jt|rnfjuric^^eiq|~|wuwz{vå|qw|hVMKLVXM]fNQPSY[^cffghmzu_Z^^TGNO?7?D>;=;79DTd[QP88>@@BJQU[J8Ocd`QONTZa\HOY[VQJFCA?EPTPNMSSQTVV[\YbTG[y_:LMFKQWaj}{Q@JQVZ^YJCJKBC?H_sWShP@_@/5<>@@?:8889977==74;FPYJ?8:<;=@>95:>CEB@>;9999986344.0>JKMMJHGB<;>@::@EJPZVXZUI>AKKHHD><::=>===>@BFQUPFA?@=8778:89T`>9DA>8469<>AGSTRQKHOWTX\WW_elmnpaSIDFX׵ΧŠunsƫlLTOB967777679;=:9=BCBCABOdhb[NL[ZH<=ADGJG@88:;=FHEDDJLHA=;:;CLNMMIHKNONKVf_Q_mZP\THSRGCDIR\hpqtpifjj]ZZVXUUUUVRJCGUYXXX]VSlzwgWQKGHNPRTVXUNJ::9::;<===>=<::9;<=>????@@@BBBBDFFEEFGHJJIIGFHNRQSVWXZ\]^]\Z[[\]\YUV\TGDFFEGFECBCFGGHIKPRPOSZa`]^^cbmpZ]Z<3>;6>A==@DIPVUNJT`WFDBABB@=;<<>>:64329DJD88=<=>@B@@@@@@?@@@@AA@@@@CECBFH?BP][X]adeghggd[YWXXZYXTTSPOKKVgkor`[f_drsOKxo]]ZN\pooqtolijmlf`bknfkgYWT[d`w}poV]WCCOVY__kv[SRPYT\ddukijxntrxwidmuxtnlfcZLNSHHVRQ]^\_glje\TVSPOPONLR`aYYgiaX[X>;FQVVUWbe_\eli^UVowm^F?BCDMTW]bWMRWWZ]ie>2843Gamlf_\\\]\YWVOD:444444444444444444333333333333333344444334444444444455555666656667888844dv9CjO;GT^_YOGBAEJD?CDAAAA=<>>;9;@GJJKQTDFMLMPRPMHU]IJMNKLJKO^baZMbqlƷőǣþżŻìĺzºϻɸƣÝɴm~ָio{nfhfbþy~bHHl@JA>CA9AKHQd`PHIIGVI9MQJMNGANJMPUaLK[_ZSLKA62121/=[SQQMIV[qvzwvlmplhr{utvs]IBGLc|r|{wzvneN;96?EGIHEDCHJHGFCHendqjI:ALOd{}lOQVfux}yaKA;42CQitUBGIB=AJDNvD=lcSFJD8755>;968GOMJMG;;>BCFGCJW:6Q^U^bfmnif]PT]bZPHD@>=>@MUOHLROHMVaeSO@HSXQHNLLTZiV=GNV[^ZHA[]BBEdzc^Y;UuB.7?CCHKKLIA::88<=9=?FO\k[<5<:>FHBBDB>=??AFGGEC>>?>>=@B@98GZ`ZTNLMI@?=>???AHP[jeZWYM=AKLJHE?966<=<:<:9=GTZVNFDFC=;;;<;;A<;===>>:8::;:=BFJLJMVVLP[SUfomrtdQQSL;N׵Ԣɾ}H68=HKQg^AKH=569:;:9:@EFB@BEFFGC=OhgYSOS]XGABCCDEB?;>P^LCIJHGLPQJNis`VbcTXUHCEFAAIT[`^\wɡqxzpjfi`TTcypCEYad`YVUNJ[z|mjfZMJLOQVWWXMF:::;;;;=<;<;;::9:<>>>??>?@@ACBCDEEDDFGHKLLJKQTPOPSWWVX\]^^]ZYYXXWVTPUQGEGDABBBA=?@;;<<>?>95338BJD;79<<>@CB@@@@@@AA@@AA@@@@CIH<:@?>DJJO\deghhhjhc[XXYY[[XWUSPNMQY`gmm^[j^im\crxsc[XOSghhfihkeelnpobZNPUPSQIFU[\u}sfNTn]EJI[ik`VZb[Uasvjb\txszxu|{qmdTFKQWXJEKWbh```ULQZTPUUTUZeomeckjXMOOE=L\ZW[`fc[]oxymZk|gM57FKGEIQUYUOQVWZ^kP35745JbjkeZWVXZXUUTNE:444554444444444333333333333333333444444444444444455455566666656667789:;4;kHOPKNU`oof`SDLGABIIFDB@?CGFB<:;DJHIYT@=FGKPSRNOijOJMLJLNPQ]n|zcʱļǫծɼƼ¡ɻǼ̕šoʹƱ~wŧhvζpupqssc\mú~vbQUK\{wx^L?;<66:-/2066FgbSAM]HQH:czaSWb[G7DZ]XXmca_rlixvrv|o]rudd\WdkzrTBD@ayp^boO"Bb[7Obl``NMfzdwDTKis>MHyY?V`WJ41<<;CJJUbVHHIEI]DBNQOMJCKQLGLYZPY`ZRJNMA@FNNFFNHA7.-./---,,ATJ827@DDIK?,)*/37;CJRVUQRTWXYYY\abb`^^__^\[XTQOPOPQQc``__b_\aUQTV_PLYa_VPUWWYZ[[RECMCNK:E=>JYa`^WN\_^PYb\_YPD:;=71/0..IhSMNHF_bWq|xm`lg]YV^l|oluFMKOc|zv{yrspe_P?Grf_{wmME:9Yj[v[~zbNL?57?DMar«{pv}|sedjonx}pllnspquoy~|yp[^rvgVSZmWINTUQQ[e[IMWYWX\ahgZIEDDD@BFFFGJKJIKC:;CGHHB=JJAEMWWVWakmrlUU[_bVLI@8<<85Ib[H?GMDERdhUA>JRNKMPLKUf~d@@JOJBHE>di?BLjzXWG5Te;/9AGLUXXVJ>:9::===GC702KYWMFDDC?;ADDHIJA@DBAA>@E=>Xijd_ZUSJ==>>>;;EQZchg^SJC=AHKJHEC@<;><68<949JWXVRIFHHC@>><==@??><;===:9755447>ABEGMNRXTUcb`aXJFDMREjμe¦U:GC<72138=DD;36;=>=<>CE@?CFGGKPKHZlcQQQSVPEDHEABCDDDFFDBBBA?ADFEDEB@SlTHTWXY`ζ|~wgPgbUfeYTW[lr]jkd\UPRX[XUWZX::::;;;<<;;;:999:<>>>>>>?@@ABBCDDDEDEGIKLLMNRNLLORVVVY\^_^\ZXWWWWWVSSRKDDIPV\`fg[IBQSMNLLNSSVZ^]ckleI;LPWilPIWYVN<=>@>;6326=EC>849;;@EBAA@@@@@AA@@AAA@@BIKB8>@?HPTRMRrdRMPU[a_Z`iqż–n̹{‘xĤî̸ǽƤϸļ˯kĵzoƠirϾopo}{mRôsncXWPJ49BZB9B<=>?@?97E>LV=vhkcddga]PPPFGIIHGIHSo|dfaWUTYXXX^_XNB?JSLGMNE>22;I\S=GMNRDE?S{mSulPBLhxpZLWjqkdkYZ|i]scekQEGWjOOUhvbT|saF8Jcr\^^D4KLK92^wq[eOWɖo}UdDTZm\AHfxAEYhXC.285:ENVZ[IAHJ?T^DGO[LNDGQOHBLUSUVSQMIRN?;EPJ=AD7<6.4=?69867DRF1(4>AAFKHA:2.2=CGJNUUQQSUXXWWY]^^^^_aa`^\YUQOOORTMM[``ac]\a^\\\^WW_a_YUVY[[\_^UIISOSLDNIIMV_[YUPY^_U]f]]WXH;8:72.-,-QqYWPJVe]Sgl]QFpz[\j|wè~FKFeUe|uy|zztUAAEA<<>ADJLEHkvrqukVV]O>6:?SZaw{zzU?:7@[szpMD]RD]gb^f^GAGSO9T~z}|zK4;;Qkinywtutswtnnqf\o}iehoxq|}sxvnif]anvtdUYp}`OZfXKJWgVGNLTWWWSLIHFDDDGAAPagXLLIGIA7?JKFD@=DHJLJQWPIV[YomPUY[^QGG?9<;74DZUKCBMOPX`aS@>JPLGMPJITfynCADIA7>FE^nN@B`^NR84:951;CHOSQME>97777:===??=;9:=<:;863113?JSYYVJMPOQQOWT[[I@=?NWM^u_tQڥxJDD@?<7557<@A=;>>>>???ABBCDEEEDEGIKLLNNIDGMNQSVXZ\^_]\ZXWWWXXYVRUWUXenpsvwv}va`ULRRMMRRTY\^ahmgSHVXHXr`JVaYVC4:>>97@CBBADDDEDCCDC@?>@@>83259=@A>99;=@FEA@@@???@@@AAAA@AAELMC==<;77:BNQJD@@AB>@KT[NEIH@IUMGJCBNRRPMOiaWSX^dkjekxҼŴ¸ĵnvt~nŸϥ˹ȭ˻ƽոŸͨʡ~ʪzʿs~zn}{™pxqapxeteWVWLD8:7[M6A>>?>><8;DBcH=rlicb_XMPWQY`[VLVOD=CVkd`^VSPQVWS[aZURC8EUQHLMA9A?;>glbYI?>=54:EB.3AVX52GROKDCOpqewdObzlUPHCLckVb[De|poh_o^frsBMm`MEhh`kmXOEJVok7GZ]qMLW]2Xb~xrf?wqXoVBS{yhJAIs\;EirS>:9309JUXUP?=JJ8B>7>40@JHDGCBJGI?,-9<<>CHKLIFDC<99=FPTPQRTVXXXYYY[]_``ab`\WTRRQOOVXHIab^_```_^[Z]]^^][[XSUZZ\_[WOUWW[NMXRPPRSPQTRVYYVae^_ZXCB9674.))*Psa^QKV^QJ^`Q?:Zoտן@>Hsjeformr}sjhgffc\PCBB;3/8AFGNK:Pp|aAOe_JT[`YG=;?HLNMNVSGTVP^UGSWZUC?EA<<<879@EIH714:>ADEEDB=86644337<>=>:87=>>@Lbjhhb_`^SFME78DECDDDB<666448?DIRXWNGCDIKG?;;:863118BA:621301:Tlv{xnaYVTafLPUYRB@ZwmYbquknsef~Y>EKLKLKC:69AEC@@B?;97678@EEEIS\\ZSKOPQQUXWQGGDDDCCCAACCCCDDCGC6=QaZfjEKONPPNMQNFMZZJDCDCAADB=Ujbgyik܈<9@CP̴^Mu|s{{idc[êsX]^`^ahb[ZXWWURQ889989:;;;;;;;:::;=>>>>>>>>@BBCDEEDDEFIKMLLJDBGKMOSWZ[]__]\ZXWWWWY[]]_dfhlopprttuwrk_TSRRQONRY\[[\^ac`a_QQYjnZT`uaB:;=77?CAA@?>ABBCCEFCAAABA;32469>DE@779:BGC?????>?@@AAAAAB@AIPJ?;<;98:47555BLRY[[ZZYXWVTROJC;5455444444443333334333333333333334444445555555555665555666666667888869X^^UH?A>46?GP46HXR4:HKSFCMWbafuehp]A?BAGScRV`EIyscbaīxvGSszmbjiWJCM[fvv}g=6BhuXH^Sf{vYQþ{ja~NAZl]B=YcA;O}bXEE7..=RXPGD<@PGFlUFSaYMEFOF>CIMOKBCKORWQ@?IPA:BI=G@3:EJ@AABFKB<0/>A979=>BDDHLMD>;:CMPOPQSUWWXXVUX\^`__`_[VSSTSOLNWTFMYZ]^__`][[]`_YVW[ULOTWWXVVU][]]PS[TSTXSRQVVSWZX_a^_[YNM=777/'%*Pp_]OHNQHARaR<;XMz޽fboʇwlYZ]_[Y]`WOPOONKIKID9/,3DJGIJ>7?IUaiqvoqfZagc]k{ziNF>;ELOUlxX@T`\GDHCA<99:8J{|y|zvsMN\`bxx{}tia][[bicZYalmfijkgqvvsi\V\^`bfp|tjs~umsucOJLKQSUV@;@M^`N738DJSdN6=EKRfeKEDB@A@@>>>>?DGKHFSTCJLILMRU\]XLCEC@=:8878=@B73:FTVJ=@HJEDIWslQkx`QHKLKIEFd{Z92i`ZPHJJKQTSNKJ>96555447;??>:34>MIHHFEKSPA;:<=?ABDEGKMNECOTNB>743.7Ujx{iNGDA@=ALWX[^\^_`d`ZB=9317?EFIPRKEBCDGKE;41333339CC<61/05:DR_eii`cdacUGPK77MƳ|rweoyܔrss}}E6CMLPUUL>5;?BEHJD<:G`»slzqcakkdbj˚{z~nekxn]XVWYVPO888899:;;;;;;;:::;=>>>>>>>>@BCCDEDDDCFIKMLJGEEIMPRUZ\\]_^^\ZXWWY[]addccehmqpppqsuutnll]MKOOQUY[XUQXchdWRPLGLSJGYe]J<9FF<=@ABAAAAAABBDFCBDEDE@7568:>DFB=:63;CB@???@@AA@AAABCC?=DJE=9:998969EMRY_`____[WWZ[[XSRVUOLLJHJKIHHEGPW]^XTUUTRLCESYUZ_\ejgiwhNBI[gYLUlvQ^[OQeYWwy_lp[wzabmwyjhttzns~}rwxqa[[\^ff_^VRWZ]iri_`alwype`WPYXYhe\bba]`YLMXYRX`b\U]afp[LEC?CJG;9BLOOQTPUdQ36667:EKPWWWWXWWWWTRMHB;535544444444333334543333333333334444444455555555666555566666667788987:7?@@jZH`NgŻfjjdZdkob]YrgWQRIP[YZSNNJAESMLa_FGN?5COJNV?4<>;OWXPE?C=458;fL=IRNED@MNFIFEKYbobWJD9AOOGM^\SX=;Q}noskiZW}z_QHDFLVVequtxZ8iwfvtZR9^k_Zap̪ZrsxA@u]W?>^O8FQUTSI?GOC@GEC>F85@DG>BA@@>70.:DC<645458:?FHHGJIIJIKOPQRTTUUSUVY\\\ZY\[VTUVUQMILSRIEMZ]Y[^]ZWW[XPOTWPHJMNNNPMNU[[XUY]WWY[VSRYWRX^X_^^`]]WSF?992(%/Xj\bXNLIHCJYP=Kwd2/1;IMHD<4;DCEXohjueVcodMQl}vxwW=;:;QN;5;=C=75=CDQu|xv~qh࿂[T`yzxsw~vdXZXPQ]ebZdih~gjne^ijeZZZVX_bcciv~{uwzyvxvo`JBKSSLHJC@?ES^U:07=DZwb?=GPevhNFG=24;>>??@@AB@==IR?AGFL\lgfkhVFHF=9984==7:C?406DQM@=@?<<@FHDBOh{v]M\ia]YVLIKF?^xP-6]tt}r|yoVAERTTQPMC8765799;<>?>:5;HK?::=>=BIE=:=??@BD>=JOK@6;BEA=83425BNm}iFGJIB<@Vb^`afnl]INOJDADDCBFJD;56:>?BEFHEAAB@>BB:1048::;=?@>;3-/?PTX\VT[Q]\RSpSAGF?>>jyqnbpwvv]B?DHLOG:;=DPXXRLHGHIIFDC@=BFBBEPQRTRNI>>>>>>>@AACCDDEDEGHJLKIHGEINPRUZ\\[]^^][ZXWY\_`_\[ajolhhnstttttsqrq]ILQUXXZVUVcdWQJFHFB>=CLL?AK?>IUP<@CDDBBBBCEIFCBCDDDEC=989<>ADECA=63;CBBA?@CCA@BBACCDC>=??;8887788CGB_ijyiqdQU]Zdpgizqnfg~slfithstixxt|~m][YVWgi\WQT[VS]_ZWZ`dfa^]SGFW[clfdgga[SWWX]XLOWYZ_mtqjNfЛL=99>HD9>GKOOQWZde?15668?HJNUUTUWWWWVTQLHA9445544444444333334433333333333334444444455567766666655556666666678897@jbPMMIOWXSV_`ZTv]Z^ZLGHEFTYVQNLMNNNVa^aaYRPNLPLNR^d[R^Źʧ{rkcqݰͥ¾ĺɱ̳¡пʧƊã{źȻũtdcd_qy~xhUoÿrc\XTMIDLE=UOB?=@CC@==?@G[]KGXa`[7(JXnmjhvp~cnjmiXO^tyxtxu|g^~gOr^YfjUW[ekb^Siė~fgikn|,OkXM7GV>1Q{QOG;',*2KUKC@??NQF`_HS^bUNCKA2=LLIGBBLYYRLEFJH?IBB=D;584<=>?BC>77741//1579;ADHFFFJMMNNOPOPSVYZXWVTWYVTTVVSNIHLSPFGSWTTVVTOORKFKPTQJJLLLLPHDKUVTTZ_ZYZ[VQXZWXZ^Z]\^^]_ZUPF@A?1+2a]YbbUJFAACKH@R`TQPJWw~xōfigm~`KPQQRQMQSI9425?GIE<52>EFII^}gkseW`cP=58?S}{ohVA57:9A[g`YK8=VP73<]X6:KN^{}wnuoxܩfQzujnvl`YRNQWYbprowji_gnc\cdcQRZSXa`Z[bmruwyywwvm`^R>?MPKEGOPIDFJTVG6032M|rK@DRfm[DBDB98=??@??>@A:=DEN><>@O_iijqiUJIEBED83998>IKA>>BA@@ABAI]njZWYPOTZ^XFDIHChQ*2@DK`{M19;;86779::9:;;>DIMI7557636<;88:==@DB5/@MF903;>=;8545459ShZHMQQOG?:5Legdfjjge\RSQG?@A?>AGJI?9;;79CIGDBAACA;67656:??728M`gii]i|\bUMPQUD?NTG>>>>>>>@AABCDDDCEGHJKKIHGFHHKQXYXWX[^]\[YWVXYYXVWZ^b`Y\irssuutsrrqqoeXRUWYXUTVXOFEGLLGEEBFKG==AGEGG?9BGEDA?ACCA@BBBCCCEB<:::977889:7RI823>FC>CILLOWbhkW62666:@GKMRRSUWVVUTSRKGA944445444444433333333333333333333344434444556767776665666666666767886OԧgD>>DR[]^^`bb\Ums]E:AJPU\^]]YQNOQPN[u^PORQQN[eefk¼·jualûǾįûȿͺѻɾʥͫ׵˙̨ér_fgZyvqřrPrht\ZWSJD?HG>+Y>7CEEC@=>;@\QFYO>WDzxeke^{gz{XagRtnPWaNMLKXTPPPROBDKJ\hM?QRB=GUUNKB>4FSWODBI@0(7`yM:8:?4>UFIdiA7@\oK6>ST[ZH@NUXZ@28^jui~}r`Vkzdrihb`WMLasv`MKT`Z]oqVIuyONaUyYsPh_JΞxw``acfY&fRO=4JH27mbNRA)(+*8OOA@<:BQLKaTN[^`UJBL<1CSJBIFITUQOLFGHFGH@B@A7<@=ECD?=8/4DJE=BD>9=>72,)(.10026=ABACGIIJKLNPQTVVUTTUWWTSSUVSMJKLNPNJMQLHIIHFII@AJKQRKJMNMOPLGMXWSNQYWX\[WS^[X^[^[\\[^a]\YXLLJB8-1e]SYWNKKE??DA@QUOK__Hh||e_fouxY\[ZQIEHH=4231468he66C@Sv}yqimriyΘxw{ywmipxgTKPMCJctnpyhnajndf`PYTCIPZdYRbmpqoruusqcNIMFDMQJEFHNSSNIGGJI;4?7?xT;>O^`WMMMKFA=@ABA==GF=NdXS<26K^`ZXctncRG@?TY<3;;78=<=?=96@DBCCA=>N`cXRSYH2>SZM;?DAGz\/.07YsF:;;<<:68@A;8789887767;>CE@5-4@@>??@?<976422127?=>FPU[MDIPcjfjoohde]SOG=<>>77FKNTMC?949CHGFCAABB;339<;:=ADECA@AA==EOWafpnlmhjsqYILPf\Z^IHNY`mlflpdx73>BJGBACSiGACBO\[YYYXSKGIJIHFC?=9535>IMOB9:>EݲpĦ|~vvٛtuwikkr|^[jy{vs8888889999;<<::;;;<==>>>>>?AAABCDCCDFFGHJJIGFEGGJTYXVTW\]\\ZXVUVUUSSSONU[^hqqrtuuttuusqmkjaWVZZVQNGCGGGUUEHLDBGE??CJKE=;BHGEDEFA85;>;=BGIH@LWA6<@@AABABCCCDDDEE?87::8789<;999IUSVWPMQUVYYX\_XMEHROB?BEILMHGHIORSTSRSUX\YOE@IRRZgloooaK:?M]S;]q^|a@LEBIx[Vr}iWmu~ytlhhnvyyqg`[XW[YYXRPT`bXSYded]\`YPMY[^Xb^[WXZUSUUUTTTZ\][NWP67=F705@FFDEHKJM]kncB25678;>DJNOPRSTTSSSRPJFA9556555444444333333334553344333443334433235666678876677666665677676?pѯQGNS\ggffeccbba]lnaRGOej`]ZWOMOSRNSqz]SQTTTNYhyijnw|bpľƶ|Żyw~ïλƴξѾ̯ŭӻŮw{^jiT~w~xvQgefZXUQG@?BAB:.T9NVDERK24RjNZT>'))+@N@=A;9HNGOZMY]\^TFEM:4OYBBOILNFJQLEFGHHCDBA89<<;BED;5217DJC=CC>;?<83+.(5202436;><>BEFHIKNPPNPQRRSUXUSRRTURNKLLLMOMKJGDCA>@EA;AFCJPKKMPQQNSQS^bVLJNUZ[ZYXbX[a^^Z\[[__^_[YNXRI?13g]NOJGPVQFBC>DGDFJLKLJINPKJLIGCC@?VcKgj@7CR_kgB::;?EE@:=ORF]vxn61RaigN?TmmjRFK@JaLBB@=:FW\YWWYJ0@_^F9?C@Ee20:SxOKKKONH>9BGB;:;;;999788985AM=8:978;:946=BGEGGHHFBBEEDDEFFDTxssnsaER\aujTcdqvalfaƬU<=??GKLKIGC>>>>>?@ABBCDCCDFFEFHIGFGGIIMRVVVVY\\\\ZXVVUTTRRMJUfjeksrrusrrrsssuqegj`]_^[SKDERPIOQJJH?=C@;HYVScgZQG>@DEB?>ADA?>>@DFEEFHH?66;=AV_aaRA5>AFGTfpgjqbPERb``[brV?OG4>KFIasaYoxpyzu~wkY\hj_clpkpnrz{}wqwvdTNOX_d`]_RDIX^WW^adedff\KGLWMNZfTNW\WSQSTUVW\]RC88:>67H96m׬ɓQHS_ifccdeeed_]ccu|YHVfdd_UQMKNQRSMatZTSPSSUNQbǻǾ»ùy}rhpӽ˿zöz}lmɴɽΨƻӽĪƼϞɳ̽{wjr`VwuvVb{g{|}^WSQLD<;;:=:A/N{58<=HNMKCMooVjoagl{c_gVIJ>_e[^dWCBCFHW\VSRH9;BHRffJAKE9=H=?OG/8ALOGEI@49PaOOB:?DE?:@Li^hB7OEHb^C9C@MSRY]CIMATKr}i{z9g]v}m_0>LKXlwfRm}l^aa]FIPNJTk~igLDyc\O4V_dRBlQl{~}n^[XW[|yPXhoNC1'=?5MfRRbK2(%-7EB5>C?=KKEPPN\]]_OBKQ4<[Q;KNGE@EMJBCGECBF@=64989@;6504(5.5>:35:<:9<@DFGHKNNLMNPRTUVURQRSRQOLKKKJKLKHCDA?<>B>;A@;DLJKNPPQTYTVccSMJQ_^YX]_`W^a_]\\Z[[`^_ZVT_YUI87feXPNNQRRND;8?KT9?eS06A?EWZMUeqwbY\`dgkj^TRKNyoztPhwV;>6@DB<:9889:876:CEGJKD;541,06:<=<974469<;::;95;GRSWSYZ\dqvpnn]chN8677;;=MVXYM:5;=?FHB;;>?@@=98=ITTPLJIFDEFF?;DF@@dojebVHTYmobmmcmt]sGDA=BEINQPQONKHHGHGCDMW^ba^]\UMLMMKJKHDDDFHEEKF:>@CLPKJIIHHHGFCDUZGDGHѭ=@EGFHKOPRQPPPQTXRDDJGJMMOOE=QxTA=@Ecpzkht~iUdh_rjoek|}7788889999:;:9::;;=>>=>>=??@AABBCCCDFEEEGFGGGFHKMPTTTVY]^\[ZXWUTTRQLN[b`aipqpqsttsqqsuuupg^^_[\_SJHFSTJDITOHA;DTWFHMWhiVNF;>CCBAA><7>FEABFGFFJLF926@IJGFDFD9;899::97;HPMNTSJDKRVWWY]\YYYYVWUOS`dZUUQMJIJCMFBIV_ih`bia\ejcm{fP>=;96?PTV[^gqorojx|fUpzmv|{mjvroolnr{tvww||q^QOMPZagcYRPV]^[]gnhdggc]PGJW\[VYOI^aUKQX\]]]]XL<646::6wH<@@BDGHJJHJXhf]E537668;?FKLPRTTTTTUTPIEC>623444444355345555555555665455444566544556778998::889;>=9776568877?OD|ܡdPNORTPOSW]ege]Upohuym`OP_UUebWQLJMPQUQUe_SOQQQOOZgdkž°ǟyprzgʼֽɵ¼ŻîðӼӽɺļ{çͽϸ̺˼||{wvsYfn|xYjyf~kskVPMID@7798=HI,Zr:5C^LABJUODOdq_LNȮfgld^oUJ[]:RmgV^nWB78?IGA=?9128ACFcfFBC;559AA43<>IVGCG>1+6Q]aTEDFF<2ETNXZ6:ZTV_M:DRIOSZP@;ONA@]jpdvRJtqzenl{]Q\SA9Gq~zj\[LJGJV]ZVfuc[Ezxab;SeXENsDM}n[c\UJb|eVUi]D8*)9;2XVG[\='(&/??38HCACMHENMQY[^\JDQN3H\C?SGA@@HG?;@DCCHG9107:68GG>:9;75@JEDBB?ABC;3650(3:>=4258<<:9;>ACEHKLMMNPRUVUSQQRRQPONMKJIHJKHB<=?@A?=>?<9@IKKJLKU\ZRYaUONQ_d][Z^c^\aa^]]^Z[[^]ZWSTa^^V=D^qweSOLHORE:864:ce?5FSckTNVC<74;B?8P]GW\@BV__^Q?576?FB?=;77.HuY3=PTMEBJV_b_VM<89669=9GuD:kaWxwobOCHDD:;>A==:7>:986761/,,9A<87799<=:9?FLPPMC9:;50,-4;=;:88;??;:=@FEDFMSVTKHX`lyrqe9IZE25=DFBGSZZVG0/=@CJME?=>@DGFB>ANUQPNKLKIHIB1/BF=Ilvjeb^TOM]L?V]tbwrf\UkhLMH>@EJNSVWWWULFJNVZUMB:G^a]]]\ZQKLJJMG36IHNKFJMHB@>?AFGHIJKKGA>G\VEJFJ@J?:BEFHIJMOOOQRRRTVRKFTrkRScloesmry~K:=HZjce`j{utm\jdTVUXphjfj|9888899999;;:9999;=>>====>@AAAAABBBCEEEEFFGGEFHJKNRTVY[^_]ZYWUTTTRNJMPLWkqonlnruvusrtttropk[VZ\`YOIDDFF>DWXE@EJdwbKLXb[F??:;;8@JHBBGIHHJLI@:?O[QDEGIIJMHAAA?==@CDCCDDEEFGF>8=<:99::::9=IUTQVM?@LWXXY\[[\]jwvdLHW]YWWWSKKKCUnoutw|ffVAFHNWa_Ybrm^]lnfmkRECA?>v\OpbBSeqUDKfU?/*)30>O>SbM0$(*1;4/BLBGMPGDIMSY[]XFIQH9NQ=7@?;:EKEGC?AFHD;4:://?C;64447>?;79:=ADEGIKKMOQSTTQOOOQPONNMKJJHIJJC::ACA?@>;:9>IKGGJLVVTPYXRRU`g`\[^bb]bd`^adb_\Z]\VUR\d^c_KMPRfsiSHKXUHNYTRRShvzcatoeeopeyuǖkdmgVXYG;e^9B]zx[g]Gqr_afR=Umtvqie_\]^c]PJIHIQXPCIJ^wA4OhfNEEIRSE9FSVZTD>DGIE9.-58@?847;;?EDCDITZWWN>8/2<:6?Zst}ofgbXNDFyX99I[slfchn^HIXSNICDHLRX[YVSTRHGLTZZ_^WZadddcb`WOMKKLB09HGMOJGHRKEB>=@BFGIKQL@>JRILYJBMT2BABCEFFHJLOOOQSSTSTUKpٮ^Iiirxxt\ABF>=MggoDzdR^XEFWhjflxo9888899999:;99999:<>>====?@AAAAAAAACEFEEFEEEEEGHJMRWZZ\^^\ZXVVTTTRNKGESlvlfklmpsvtrrsssqjcjk_]]^b]NE?=@>=SoiWRPc|iXZ[I887889<==>?A=>FHDDIKJJLLKGGPYTGBDFFFIMF>=837=@BDDBCEFGGHIB9;==;:99;>;8DQSKLGAGLUYXYZ[\YYguqbPLRPRVW_bWMLQ]ZUriOK>DSUU[qtj^T^sl`ZMEDBAAAFK[jZIf{qt{|kh]OXdtvpnins|{{nha[Z^ZSOORX^^YZ[WV[YQMLMNIEYVMQIOXPSTZ\^]`dZYcZB8998;;3BrN@GECDGKLJJJD>E@7475139?BHMPRTUUUUVWWUPJE=64454444434555554444469988888988888;=:879::>IPJGHC;CNOUVM@<;:98889<7{ߢ`QUQ\^RILMIJUeg^PkPLMNIDDDKZ_\XUPNNNRW_s}k[XYWiͳŶͯy{y{{̿|et̳Ʒɝʺӹηɢ¾èƻsŽԔ¦|z|oggʫcxv|esss{exSo~vYOPSRULH@=?AB@8/rT}IN\OPVb]QHR[SЧsfjjaTPSkeEKcGE`qbcX918DN>6??:11;?7Da_MG?:53<>7A[ONBBF>.&)0;ENOHAME@MC@>77?=4=JHD@2/9AEC98EE=<=@@@BFLKHA>ENMH<5<>9>D;366117<<;88:;=@ACDGGGIKNQQNMMNOONMLLKJJIIIHGE@><=?=989>DEACHKLLMNSVRUR\je[]\debefbaeifcb^]][YUSa]]fbTTRMKYncPM[SD[xtc^`afdQWae`jmmeatkoasϐYRMSWC>\rlOGValc`}on~~ljhQG\ks}ywn[WSMHFMVZPLPTOJCXsZABDU[OJHHKMLECEEIR][PQ]ejcPMRH:6?P__[]]\PIXzx_[MB\zkODLueSHFN]e^Qbtlm~o^nxvqjovga[QN_oaTbv~|~ps||b[pk_SDEh~c8555;IU[ZA=GJEEH?401In{wrR3;JSZYcxg[iz[SXUto[bfuzXWV^[qj4Gp_1G^iQ83:CY[^bM^GOuwbNNKEM[cdXAGE9532/8T^z{W{szx_Q3=GNMPUTKAAEKVZJ>=4oZ9C?@CEFFGILNNPRTUUUOQշtZLnwXjFFCC=>XszTQRF@@@AAAAABBCEFFEEEFFFFGGHMTZZY[^^\[XVVTTRPNJFIYihaed`irssrrssqrpqfZ[ZXUU]dbWL@>@6?Xgssceuxmc`^TF>:79@<;9;BC<=GHCGMJJLLLNKKQI:8?BEE>ANK>7324<@@@BCDFGHIIKF>>>@?<::=>B@:;DNVXYWWX[]\Y\eg`fok_[^bkqfXX[WRez}w{zy`K=BNQUdlkpoZVlxuo^MFCBA?DTfm[CNuy|ZGMWfx~d^efhqzyvvxo\ONRRRKBAEPWTQQMOU\^SMMLO]ehb[JCGNMNSWUQ\add^OC<9878::3@YG@EEBDFIJJFDJJJ;246323;DFHNSUVVVVVVVUSNIC:434555567788886677766>IHCDBBCBAAABEKLE?ACABIQRNONEAOXUYZTLGFIFAACCB=rΧN@OPNVZPJKKHM[ca[Okw^[[]VRRTX]][[XTRQPXeggwyb`cqõʽüãii~}ǣȨζл̺ͪƸҾͿŖǻɬҴ˝ڵ­qٖß|~{y~sh{ǶɆ_}ryqqa~ctRp}qZONgc_GHD@><878?HQFNFPXWMHNVYUjë~hhm_QY\{~SLbU?Miie^XG75=RR;7BC8/7?;2I]TMC;558@EBWBGCAE>/%+1)+6CE@BGTV??DBCObTnP98DM]m_CCJK30SxhrU\Z@DhelJ38m]VbnhlkYQND^^dyuttkxsmzXmHpP2PwDb}fN\skvs=grEJ54McA',-+)BI2N[L3.3,0743HO=HZUKEBDKVZXUPHOKEDKBGGAH81>B37KF92/2DMH@85CA@=3384*/68:>87989;=?@BDEFHKMMKLMMNMMLLLKKJIIIKNMH85>;339=GJ?:BJJFCKPWQSTUce[ZZfohgjcagjgdbab`^\[UU]T]d`][WU]UZdXHNKHWrweXVRHMINUr{c^YUin\RKNy5GOWCHocnVGliQ]ep|zvvnl`RUOFVfdfk^\\PMRX[`^TJOWTGAHNFKQMNMIEDGGFJRWTSUNFFNSROU]ZSNA/1=Jad]ZZWTQblw{zyunijkusPg]ZXMOTWWU_igkilolot|fWbci{wjjqrot{yq|jgxqdQGSn`/215BMYdR8EMOG?><9745Dbn^r_dbֻ`X[D@Ud_sxNOJ>623@Zp{k{eousR3HdmlZLny:6Khu_=?D=:65:8:CHMQRTW]YRTA)/87EZegUHFHF>:CG>8@E>9DPYN:49AFFJHA316774454@T[[VNLQMM\f`ODCIPVUQKKIHCACHKNG93,/:B:49====H_gsqTMO[`T@:88C\VIJB9J~yhnjilWGHOFBMMIKVcmkifcfh`ZVZ\[YQL]svx{zurzVTSD8DPTSUUWUI;???BEEFHIKMNPSTVXRY};6JZ=Yv6BDA@@UyjGKLEJYa[[b_VV`hoo¼888899999999999::;<<====>@@@@@AABCBCEGFEEEFFEEFFGLRUVY[]^][XWWURPNLIFJV^`]WVaourqqsssqqrb_jXMMIGI[reJ=>?448?LJ>::AD??GGBGQROLLMNMKH>79:A@=EH?JTF31?D.0Shh\ROb~}ntys~zbKKft|i_gcbf`gq}~xhVPKLRRJGMRTZ[RINSU^VLKHPag`dcRLJJOQPMKO[gjj\?38:998;<5?PEBEECDFGE?>??>@BDDDDCCDCDEFOXVSROMPPPPPRTWVRNQQMOTSPRSQJJUYVWYUVTPVVPPVYQJiWCLGMPPTOLPQOV`b`^`hnhaafigeeecbba`^\VUT\ryc[bd_dbĸŵſúllp|шwɹŶǩʳ̷׼DZȸͫÿí˳Р˓Ȝ‰ϧçyw}}~lƊezt}qR}gvTp}qbQImrCJHAF;59@KZEZCHNOMIGJQ[ae[еoil`_VeqEWmMD_i^sWQUC86G]P55FK@:9@<Y`QFB??KUURSPLNIEFIDGBJD0;F72DE0*18KTNB;=<<;:===;KKBITUHKEDIMF>8?A?><88:5)1837=:787359;=?ACEFIJJIJLMMMMMMMLLLKKMOSQJB@>87=@DKF;>EEB@FLTPPTO^dVV[Zrmdib]fjfcdccd^\]]WWWS]^^_bfVwuMNOIIILTbkg]XXW_bWUuoab_Yim\`G=JO2BTSVr`h`QsPMb[iz|vrmkcUNDObflm_NTNBK]c[VNJGIKHC?>@AIPUSKGCBJKIPX]YSOG;;DNSTSRNLRQ>33C_d_\YRONKLa~kljjmxl\a`OIVc_[eopsЈlphmv\auzhmwvkipt~}u~~ohvun`enkqT545CV_i\>ZsrmU64?LY[Yc_Q,0CailucNW{ec^\wt|lafZpUSowY@Bbs`pqoլwcltdgkV;98;:6Vjk{uknyvvxq`LJpM0PglYOQHCF@<=>CDCA>:75:?BDFKUSIMN<-4GHFLVghSFID83@I@7;FJ=3>SJ57FQONL<3455465210:QYY_TEA?EOX^]TRYWWTRQMJKC?DIKL?0.05?IB9;@EFC@O]nwt`XXNMTT@8AEFPZZVL8:_~snnkhMCCB7;KMJIQ\quusrrqjdb`_]_]VU[cnwVWXIBELPRWURV[SHHOPKEGLNPSWUVP?:?J]M;>=:>B89==?ABDEEGIKMOQRRUUOqV0>?@A8k7BBCC@KlvfrGBGFEQdbRVca]fnsZz888899999999999:::<<<===>?@@@@AAAABCEFFEEEEEEDEEGHJMTY[^_^[YWWURPMIFEHPWXRSdrutrrrrssqqnhiuo\OGEDPjgNFF?89>27^xmUXdZ_jS>=DJLJC=CGHLE@CDBDP[WLKONLJFHJ?7:@HFFTaYHCMJ=BBFHCBDECEGIKJD@@DFRR=I]N45MV:0;KOKQRRTUTY_^]agebicUR]ghdehh`SSoxmWMSPW[VJF[ppkgbZ`dMAKHFC?LbfbaXJdx[[jlush]]ho|}vvyoiknorkeo}{e\ZUNOOMS]b_Z_bTOZYORUNJKRZ\[`ZWVY]]YTPPZ]fePD;688999:<69KECEDDCEH>2=W^RF=745458=DGIPVXXWTRQSUVVUTRQQRONQQONNNPRSSSQPRVVWZ[YZZWTVXXWWZYWWZ\^YVXWSSTTRPPSTTUTSTQQY[XY_da_dVQUTRTUQQQQUZ[]accbcdbabdfgffgggghfdcaZZ\aotYTSNUÿɰ¸·|}vhsycvp|ñū{~{̷ȿȫɶʺ˳ԭȮԤȦ}DZȡyozrq}tR~uqzTp}ylSFovMTOHLF98DJF?DfGHL@BBFJUgmcUsʤxlie^Zu|YDejGIiU^zTRYRG6=S]B/=MOD?CILGGWU>?LelL30?Skq_XRWbd~j[QdF==Ws[H7QC>cVk^JAA9L_V]QKOOIIYe[J?HcLg{sfsvh{casfZUZ{{NcfaRck\?gZ70A6IO2--/*9;8ENG:6//6:7:GKALg[IBB=?=8A@>;6-71.87;8851378:<=@BCDFGGIKLMMMMLLLKKKLOQSQMLI@=BFDIJ?=O\`gWWVFBHQ]aWKB@C@<@A=>CCDGLROHABNPMNNMJCAEIKLUY[YPHIS^`UBJ`ce`QILMFGUdqtfiq|vxejumTUOKO^ondbgrn|um{b_}zkKQxqdho{ys{ytkpnlku{xiE>FM]bbgSA?JKA?><:9756MiqlS11>GSY\bU\u148Rosqm^^pm_arynuufYPguvntYCOwzqsvvЯ~K*7@DGCJvc]~gO_yR2YiifkY???8:A33;<>:75434336@IA=HOK=7MTLEDXoaHF@2,:B;57;C>-.::4>PLFKC32544555545:CFL`fQ:2246@INTPILOUZSNPHFGJMI7,-3?GQD<>>==;==<>>?ACEFFHJMOQQRTTT[h|ԹMDIE>D@JܭQ;CADCAAFESxuobREECGGK`l^Ycdkx}uyw\888898999999999::::<<===>>???@@@AAACEGFEDDDDDDDDFFGLUY\_`_\YWWTQNJEBCHIFMaqsooprsrqrqpnkjlt|q]TRQR]hb]UF?>=3:bpR@SO@MYDJZ]]YWVUPLNM>7=CHHBCMYSKY\D>EGD8AL[aDDeW?ENMCN`Y]d]\\bo~ikx{}hfi~qmjksy}}pghooy~ux{y{]HKQUUNIR^^^fihe`ckeYXTWY\]__`SQV^bc`_a_d[ZT85998998;<96;LECEDDCEG<2F^YLD=:8716=AAGKRWWVXXY[^bdb_acab`YZ_[YVQQSTTTSRSYYWWYYVWWTRRTRQRRQRVZ^\VVYYVUTUSRTUTSSRPMKPXYWX^dbfc_`_^\[^]WVWY\]]ad_[_a\[]ae_badddfggeeb_bafi}z_MLLZ¿ϱomv~gtmq•ǭ¿{üȿֻͽԺζϷȠ~ÕôΥxrzspWrku{Sn{rlTIpvPUURTZ<:E?BH-lrI=A;>?GRcj]Wjoϫucg_gyrRRr^BPjLrxP[NZUB>CVL87EDDH=>K<;:BX40><03,6JMCKE3+,..05<<:CPMA=MT96I[W:5:5/Es^U]u|bT|UGSH;:=DVlz~|teXRSLKZc^Yesqpkcgf_ebc\dLeqfOY`ZSjrVG:}fZ10N6@@.,,,28.ASVG@:/3?FEHJAH^bG>AB;LIELQOOWRLOND;8<<=AHFB>67<.296>:21147779;<=>@BDDEFIKNNMLKJIIHJLNPQQPMHEDEFMHAAB?FNITWKOXUjhY^Z\je^eheba__^^c`\X]][_aa^\otWIMLLmzxud[[kdVbx_ZUO`\I@UˮÝ~|qpynjv{||Z@IYZfgjmZ>48AGMG:jYTbged`UD=EB:<==ND9@??CIF??GMIFGC;8=FQQJEJKIHJLKS`pg[accPDIVVMR_b~ybsydgx]HNOPWimukmvswogujKFbror{{u|yukoollr|qQ]krjTYhaUNZU=>?=;:984?^vnS/1CPRRZ]Rhb;DJXcfmkpokϧuj```^abXRV_x~oteUj|wxtozvmÎ7(>F@BSLFr`Pu}qXatL:[cmzkG?=53;C6236<:647;89:>5/34237755/,..3BK?5:7244345544443124Ig[82443349><=JQY\VPQIFFINB0+3CIGQI:>JVcc_^aa_^bYWDC>I=====<<===?ACFFGIKNOQRRSUUVGb}JLPLLHB@B>Uf@CAAA@C?>KRTcvyx_KLRKIEFEKgkaq}vpxi}888888999999999999:<<<==>>>??@@@ABABEHFDCCDDDCDEEDDLUY]`a`]YWWTPMIC?@@CNdqmghmstssrrpolhc_mm`ee`^^`f`UPJFC@GTYO@@ELG@>FVVPMD3+39C`eUNKJKOMNYjjb`]UH@?:8AIJFDIJFDMbeOHJKD=OWIABBBA?<>>=@NfR?TWNAB?5AOSKBBGHADU]ST^[XYQLRblqtg_ntigkppomx{zn\HU_`\zoVq~{uj`XNA@LLCIMIV^__a[[yzz{qmhTu}r``omjebo~|viYWmy{~}zp^PPTWZY[ZSNQ\_XTV[bab[WZ^a_VUXHISWTSX_kg[KB@86999::7<;74@IA@DCCFKG:=QXPKJEB?<7O9C@=ckMVTHB>Neg]YhxrxeekftoXceKC_cc~oYZ>QUSH:OP?3B6CMA9FM>=DO543?01,4:KK@CH?7B?6:76=A?BHDEFOQPOH?89;:?JIEMNMRYXUTMA=6><=DLIFA7B?/887A;./2576568:;;=@BBCCGKOONLJHGGFHKMOQUVSNIEEIJD>?A=:AGHE@FGEVODVPVj^V[W_i_^hhcacb]W]baYY\\]_`bccafWKZbZwz`U\]WU_{rYSNPMZR@8O|qjtlcsXWkkh_K;8=ABACYiq}riohL?M_YD3=c\:59::<>=;@=;;=@ALan\B,0FUTPQQPcpSAJQXLOglnustggZXUTSSVYV_ort|szsbpx|zyyw\_iaŬo_G84@^YBHk[Im`heHO[ct~wF2E[rsmjprsoXGB?<:;:637GHJSTTTJDINW`hi[KF7*AW<7AA=6--37511/-./6@>51222213433455424516EC3465555545=IRWVWWQEGLNH=54ASTOUOFJLN^jhkf[_ddPI>C=@3?aegkQ48PgcHJsM@EGFGE?@BDDUTDA>W~yux|rf`TDDIIPV^ksulc\_]YU]Y\[WL]f_RKLMOPR]cUD@BGQTB:<<=<<;;==>@BDGGHJLNQRRSSSVTSnFMIEECAAA@?=<@CAA@?BBBKRE=KFCW]]a]OHCDHRdtg~u{~x88778889999999889::<<=====>????ABBABEGFDCCDDDCCDDCDMV[^bc`^ZWWSPNIDC?=FVfgcfkostrutpmqpa[V^bTWfkeeg]MCBFGFNXSE>EOXebO?EW[YS8+3>N[``ZWUZeaRHSTIR]ODGIH?=HNIIT]XFCUca``^dSK_[FCNOC>@=;=>:9PZC>KOC:0,;KSSJ>CLMJTe\QSXVUUbxpbktkhllmjnp{t^breaW@@ZSAX~~NI{{bP^SAA@BC@9BNbgc`ajt}tum]Z_wzdboreeikgpzxvse]gx}vtwxsmi_ZVU[]^[QKLUWPLUXV[_\XZY]]KHNGKSVQLNUb`L?8788887998;:89KFADGFILQQFJXXQPUTOMKRSKPWPOVZVUY\adba_^^^[[[]][Z[[[UTTWUSSSUWVTXYVQNMPPLHGFBACMTRQQSV[[ZXTVUTYWUTSTTTRSVWWU]bXY`aaa]\_dge`^^]]^a_VTVUVXY]a_b``__cefgiiihhfegifgqmqstsfqvȶԱ˿~ǺƾӸ˺ѵ̴ļάľƯȌozvxtuԧaaY^dwz_myahU^zvCRZiko=>Q4IYgWJ^^QGFW`Zaioryb­kclfrmadDAVedqroiF9DPbW8INA2BBFQDBAK@=??445961*/8AGLB65671044=XX41FLW82EPRNVWHJ@<;SKLP@88PG3Klm?GIScbAPX^PaWUQ,DRNQgjeX=AU]etrtyomjkicfswsqxr|bVWa}iMFHVXUa^>2M}\P6HM^L5<<2A0*Re^M>DG=HJ?FD;CZWECE=:A:7:68D@9DIHFIQQRMH8889:?JHEMLLSZYWUSBJ9C?@FNIHC6KB2<45B<)10786338:9:<>??@ADIOPNKJIHGEHIKMPUVTPLHFGC<>@CCB@D?LSEIYLadSTYW_aZ_heaac_UX^\^VVWY^^^`ehfiaNY^QIb}q]X]\WUYp|aHEJJQ@3ZsroxrSTnlriZC6<@@KJNcssnbnlQDKimFAhrO2:D@98;=<<>CNVPEAKNA>=;;:9632:NTXOIKFCFIR_edXKG9+-463@KPND9685222/1656312223003677666334433334366556699=IRXX\^UKJU\F9GMTYTS[gi_MDSgnodY]__O?<@;A;<<;<;;;===?BDGGHJLNQSSRRRUUVVKYOF?@A@@@BBBBBA@A@ABBJLB=<;HY[Y\\WOHHPTVbebr~Ǟ87777788899::9888:;<<<;;<==>???ABA@BDFEDDCCDCCCCCDGPZ^abba^\YYTOKHFHDHSTSYfmlnpppqqkiflZCNZc\S_lb[aWKJHFEFOSKJIIJMPNKILQLKH33HIJLOZ__^\L=FPO]aIHMUglWHKOPO[hbSQYa]U_kk`H>EHDHSYLAAA<HH8:DA:29EOQQOJEJUPVfeSFSWU^hqu}vmqwwtqnmc]V[aYZ\FHXV>ApqR`wvx~[LYKC;8DMA=LXdiYcywxellpr}teZZZZ_dekv{xswtd\gnljox}}p_[YWYXUSQPPSVYYWZY[^\WWSTWRMMPRS[YTLNUQ?;8888877899997CMDKTSTTSX\\[]^[XZ][YU_`Y\`[W[\YYZ[]^\\YXWZ[XZ\[[[[[ZXVVUVVUTUXXWYYWOEIOOHEED??DPTQOQUXXWXWSUUVXWVVWXXYYZXXXW_d[[^^`aa`_cdda__```ba]YY\^]\\__aaa__cefhikllnieijkkoƷhxr~`muΰѺ϶Խ¹ҾʽڴŸ­ãƫml|xiup~nqefY[WcuzenpcjZ\pzr;N_pbeB9Q^qz~pGFIHIHPTQZgfmxtfcqechqjdI:Nhgjdry_58ASta;>C@3BYISEL?EA847<9401-+/:>GMB27KKG.0>E;,5FGG<8*AQR]SLTL;>LldAH>Tg]O\dUKTQ^{QAh]f}XYat}va^quttf_bgjllcq~SJWteM@LUPU^R:5e~ME7>MRC6A;9<):TUI2,CFCJABB@;GTI>>@@B8DIEHOPJK>5KND>C@=;;8<::=@=BPNLGLONKIHBB96:AIGGNHKSYXRR\MYBMDEHNIIG4WG:A=0?:31/?;7/,<;59;;;<<>AFKMMLLLJIGGIKMNPSSRRKGF=6;>=<>@@A?>>DSG?QRTeYMSSU[YYae`Y]aTS]XWZTRTZ\Y[`ehkmbWW[O=>P]cnd\^^_^UUtL=CHH6,>^sozib|{e_cjmxn]NF729@BQmsczpMQWNFBWwYf~b6EUE53:DIHE@CPVOGKOF=605BKL@7FixsuVIDp͖jqz{{Ȫoepm_I?DK[eekrzgy{fhqliu}ei|q]_fkkjfix{zxQ;\wnihcffdk^B=?=;::;<40/0224>MZ[N@:75665593+-23368::9899976444435555455455678>JSX[]``WKNZL@S^ZVOO^on]LHN]ee`ZYW\O89;=UY]dde`K:BT\qpp~UDHJIPUMGNimI@Kmnig\URSdsfYcmixdGIVVLO`aVOWbdfUHKOQPONK]o[EQ_YF<;;;;;:::<==?ACGGHJLNQSSSSRTSVIR[XMA@A@@@ACCBBAAA@A@CGE?>=I`d]ZZ\ac^\ZWXa``vzU_7777788899:::98888:;;;;:;;<=>?@ABA@BDEDDDCCCCCBBBDKX_bddcb_^\[XOIFDEDOZTMYnnimpopnlfaadZEIW][\`^VKPWYXUPIEHEGLHEBBJQMLOLEBA=CME;?JQ^fL75AD>8=98@D?5?LRQJNWKEJSUNNMOQXcgedeinjlw||upl_S]hdXc`BG`XLnw_mi\fu}ss]EA?ACHIHIdl_\Z_]_y]w|sxxeY[`dkwlap{tfempnt|paVWYVSQOMNPPRY`YY[ZZZZVUYVVXRMRVUXWTLRQF>;98877789::48=TMLX[Y\ZY\__^^^ZWYYXVWa]TZb\[_\[^\ZYYXWUSQVYUWZZ[\[[[\YWTVXXVVYZZZZYPCFNOJHFFEELTTTTUX[VSVWQUVVWWVWYYYYYYZYY\aa^^^^`aed__ba`_acdcbda[\ega^^__abb`acffghjlklkjmpruĿķrxw|yzfyɼɱðŮط˸ôijģöǎŰ˹̼Ǝxzmdqweovoy{دħvth_tyU^R`oy^hz|fdhYS_qn8IckR^H6kof]\UBJF?@KYSVa`erucZT~o^hflN:MaktehznE..@ewaF89@;CTJSHNHAC20@SL4')++.>JHA>?CHQQPUa\DAL?CGGE:G7FM=E1<;3+/<::5/:ICCF=?B;==>9HEBHLJKE1=RF>=?;;953A:=A99@DGFIODJTYURO\X_FRNNLPILJ9]M=FF)<:;5-F@9+,A=07;637:;=?EILMNOMKIGHKLKJNRUVOIHE@<879;=>>:8>NI=AQQX^NNQQTWT[bbYSXUS]\VVXSNW]XVY[]bjiefY`PCCFMYagh_W\_UUkP?DGKC/&Kgjqg^xzv{rO;<>=<:;?FkvpHHCDC?Eg{nzmKUW<127DSXQFDLSTPNPG5/5@@:?B83,/2237;8555847E?1145;EKKJOTJ8211147734F]d[J=:8:;87724@B<;?BHML?32797544333355544555666>KTY[]_^TJJUQMVZXUQQV[XSONPRVY\^\X[O35Gck_b_J=;;;;::9::;==?ACGGHJLMORSSSRTUSiOW_cRB@@@@@AAAAAAA@@@@BCB?=>O`_\[XYdkghd]cnkguqp\EH?@@@@BDDDDCCCCCCBBBEMX^aceffc^YYWOIDB@>H[[R\jkmqupiiecZPOKJHIIJUc`RFGV[ZZWNJIC@A9=MMMUVYQDHIGHDB?=DMIXfHEZbkmlournpuoRDJR_hhicVQYce^\a`VE97CB>>BFE@=@=ANJ@CJLE>EPEENRMHNMR]\Z\^XTW[_afmoplea]billpm[^b_divaZYKM_v{nmSQdSB@>OJH^jb[SMF?QSVhshwtl\U^gio}{_Xo}{}xtogc[ZYUQOMOPQRTV[UU[WSRTWYZUUTRDJZ[RHGDLJ?=9756767878;6:@DCSJFN>D-3J^T;+*..0;EHIPMC>CQejXE>CIEEEDD>DJ83=K]hYHR_X_T_T45EGekH1BPYFUSDBONBKYQZNPVou{q^dNT\djnfflginqre_]blzsZKNQLNPXa[Z[[GJP>JMI6,CjvRH<=8?::9:8/6C;=BA@BBBA?<:@JHGGIJ@KUUSQMXZZHVSSSSMOLC]R?LI-;7@.4FC:*9G66<BEGJJKKIHGIKKKKLMQSOLJHDA>989:;;56BI:>GNQUTIMPRUPT\`[TUVU^]YUVXKN[[UVXWX`fdgf^aKQRQ[jrsfWT[]TPS\YKCCEKJ?3NvvtzuP^{|xun`bO=>>?=7;=7C}nabICB<4Hmzvr^_K/0735EWYSOOSUQNK?0.7;75COLLQ^jllunXO>PrXVLQ^W>7BUj}xuzhjofWzsIOfs}}}|f]INONGJdgGbwUU^`e_SE758878973.0004618[nmnonaNDB<=HIFTfj_Sc|ylVQ[\ZdprֱshmjnjVJ]ou|zmd_pϳup{olNV^QIBZ~~kcp_;7[mpx~qC+1Khhd^R:122322687641323:711225==:BML=2//0/09?:3?T_^PC>:998754FUPGDBBDINE62566544344444444555765>KTY\_]RIFMWUVVWWVRSQPUWRSUTUZ_a`\]U?@P^caaabbcca^]foljjtdRHACCDQ]ei`cottiICTNOmym_hjS\neehc`g`MKZreR>:TTVlM489Na\NELPYZVOBBOZ[[P>:<;;;::999:<=?@BFHIKKMOPRTTSSUO`tdTRVmmI@B????AAAAAAA@@@??@A?>AFHMYZW]efdehtzutttup^]^LA>?7777778778::::9779:;;;;::;<<=>==?@AADDDDCCCCCBBBBDIOSX`gggf^TRTRMCA>;D\]TblnqstqhcdnhLHUURRHBO`bWMJLPVXVPKJJJA;HSGAI[k^GGMJF?@FGDLU_RJfc]q{rmstvvtiQJMR_ikigd^[eieei`PSON[_Z]YD<:9<@?BEGJJGGBCOOLLF?98?BMSRLKT[cgjbSU```_afbeijmnnsvrxrmj`]mhellgtrNLXNCIalcc^phJ=9IKEQ^]_aSHAIQWpl]uzxjOYehhotn\_c]eyz{zsg^ZYYWUSRRQQPPPQRUPLPY_^RONKHLWVHAA@@A@>;:88789:9;BHN[X[YTRRSSSUXTRWXUSSSSRPSSRV]\XRTXYXWRPOLORJHJHIORTY]_`ib_UXZ[[[XWWVVVURSRRUWXWU[^[Z]_``^WWZYYYXVW\WTSQOMGISTSWWUWXXWX[YST[]]\YZ\]aa_\Z^b^]^``bedccdffeddffdfptfqɽòyx}gzµĺãžŴǻͺټȽŸƴηբw¾͢ˮʪvrervn~j{p^o|ì{٪Éi|qVh~sqvwfXiQV_mVP]}agjdSMle9U\eR_IxaE@CKEBSUGITYQRYbjd`caayyjc^STSZjkemt_7..=bzJER:<90>>CSG;L6D,5LVH?7020/1Y]e_PGCEGP\glnj`TLPUNGCEEJJCMVVSRNUR=BB@?=?BEH@3CNA<9988<92AAC?5=JA.599=B?>@@=<@HMHBFID=KTOONNQXTNTPTXUNROO_UBPL7=9C*ADA:-HG6BC;*.267:=@BDGGGHHGGIKLLMLLMNPRNHHIF><:98649E=;AJMLRMKOPPPOT_[RUVV^b[WUYRHV_ZVYWTT]^`hc`YX\R\khkWFN]aYMLKGDF>;@BFG8=|~pp|XUdihmmbKV[L<89727=00]nr^HFQVIKct{lec]B,3=8/8JTVTPTUQJB=/-0-0@`roic`ab_q5Ou{pdqva]VVaaBDh~{rzwg]WOS\OB<\|~qfw\E@OPCSwPQlqgQA1.6;;;>=962.024788;ZxZVm{pZNNNKB?CHE8=MPCDkrTP\]Z[bel٪e\`eleSK[sol{yxwhkvqhjZSQZewtDPeM[QNPHN~l:/0,,24Dmsa@0.5QS<;532256678878775039:31/02401@MH<;>?@?;;C=32>PUMD?9668924BFDDC?=>@BBB?<83022443444444455556>KTX^aYJDFNVWWWVXUPQRV\ZVY[[\^aa`]]^UYbbb`^_`bdda_]ftpgmkcYG99:9=D[sZ48`pN55=3@p~`>V~aZ}rfd\QJKhgO:2BF@H;7<::>=BHLQUVVWVUOA?C@=;;;;;::999:<=?@BEIJJKMOQRTTSSWNmgKLSZUSopF=CAAAAAAAAAAAA@@@>???>?@9A[`[aedfejyzxywsqlaVfZHMC@?777766666898897688:::::::;===>>>?AABCDDDCBCCCCBBBDEGJR[^ZX^aXMKJGDA@>AR\_ksussrukU`qq_Xdf\a_PUYZWSOIHOQPONIJUOR_UEI_dho]GGJA@ADGKNONOLGIHLQF958=>JLKORXXaaYS\jlmnhkojpsntpdpypc^_]]]fjhghijMAQTGHg~i[NLH@KTW]cYCJ^^esjlxuweQlrljprqqosxn]Zailnotxz}}vldWOPUTPPSROMLLKKKPPNU\ZRIIOSRSTODBB??@@@??>?@CDFIKNVXTUWUSRRWWUYYUUZ]YVVTTRQVURUXXWTSTTUSKJMKKOJHFDIRWY\^_dj``Y\[[[\XVWQNQRRTRQUYZYV\]VUX[]]ZRUWWXVTRT]SRQQNLDHQLP[[WWXYYWWWQNUYZYXY[Y[_][]feZZ_aabdbbbabba``acdgnzy̾ɳ{mo~ôƺĻɷʧĨױѹѣλнȼιʹzṴ̃ßѬ|}pkvdekjWr|kw{vˑctuacuwtz{l|vopkwQSVg]MO{Zhop[Tp]D]VkTZTXE?S\OSYXMRVQJVgn`XpmZgwtkn^`^VI^`_gli?.2>EpoGGK=A73?:AP>2F1=3;NV=@@382/)2ADBBDL`nhXRYTH>>JB9ATgU-7JPOZlnKT\U]LILIadB06LfH3beAGIHE?;?DLTYb_G?]ega^YUQPR]^bgtog_\ae^PRSOHDCDA=AILMPYVI<::=DEJW]T:6+9C0%6823./5320.)(.A;>5BL;DD3;A8>:;=EJA8?ND=84556><GF6)14469=?@BDEFGGFGILMMMNMLMQUSNLMKGB=9978CEBBDLGIQKMPNKMNU^RQURZc_^WY[PV_a[XWSQPTVa_b`ZbXV]TPE569>@EDGjwy|nnzvcZdgql_jlJELI;57513;EQhp]NDATqyoijtwe_aQ<5;@?;=DHIIKRUPG@;/-/,/?awuplc\\T^v@pxxrhxm[VNLZicduoxzyupbajJ:GN\ztj\yqAMZI:Ok{qM@MViZ8+-5=BCDIF;6310025731T|nw|saOGCHRSI<B92ZwaM[e^\_c_k][]WV[VPLQZ`rqln_KMJBA@Hn}w`UWYI`~WLJIS}C+/-/.,@mwngV>;:(;M?:999::9678699885331341/1335;HKDAHNPSPHEHD7--:@<:85356751//5=>@GLLGEIIC<5121344444444555546@NSV]_THDGNVYYXYWQLOSW[[[\^^__`a``_a^`ba`_^`_`ab_][fqpmoplaG35756679978>H<26<5BosL0>osZdq[][\XJ_aN>598878;;8666:AGOLD@G^hQ;79<<<;;;;::9::;=>?@BFHIJKMORTTUWWYTXQWXWXXQkzQB666666666888777899:::::::;==>>>>@ACDCBCCBBBBDCBBBBCDGNQMGFNZYLCBA@?ACDCTkpstsrrtnVZorn`_eQSifWUZPOTXTNOMPVZZ[^ebRM]pieuu`NECGHB@P_cijfc^dhdlnbSJRUODJ]d\SWbd`cmidlo^HAL[\VKC>=HIFCCCCBHTSIHNPLD@DIJ?45;DFIPWUZ^YURMQclieemux}ysvugdwtddki\]Y`ihijlwmOKTMH[s|yqwmROOHZ\^d]^QRa`^`s}u}i[TXegkkbZ^hpx}ywvuw{sd[QMLJHEGLNMLOMMPQPNMUYOGGJQPSVQKDBC@??@DEEFILLLNQQPQOMOQQPPRVRSXVWW[\ZXXWVUX[XTVSRVVSOOQOKMOKJOPNLIRZZZ\`aceYb_`XX[\[VSQQRPPUTSV[[YV[XSRTVYYRMQSTSQQPRWMORRQNHNUPUb`YYYYXWXZVPU]]\VZ][[_^\dmi__acdb\Y[Z[]^_^]]aeknǽλŶε}yvhx˟ǭϾĴľɺʨӸҽʺƟǔʷϹѺ~xjsdqqji]kxsig~tuʳa{c_t}|repdx{i~SINmdGGx^poe\]fZO^Zp[ZgZQM_RUlcTYXOHPit^TmrYYozpOhs]^ZDH_T`hiP-8=DF{bOOF;<9AA7=L9-?349=IP7EA8J>1+*4@@=BDONSPHOK;0(11=JR^G8AB74DZJJOGni8,,1.(0C6.,*4432:6>522;<>F@?L8/>=:?88=IH<:FG<:42628<=B>A4+47O;EJF/+7656:@@>>?ACEFFGHKMNNNMMNQTWWTOMNJCAA@DLGGCEGEOOLOJEFLMUPMUOQ_b^][\XXdb^YUSPNKP_]YaX[\\_[PRF?K[]L@GQKD>44?BEFFP]YWUOfnotjRV`k{jVilKAGHC><:52@w\dHIB<9;859BFDEC?BLSMC@>2-1112BUt|rghcTuPJMLE::FYM=ICAI@/2:?CFEHMI<62000/2541Fywpnle[WZZ\\UK@989833@<656898888:;4/00027;>DFDBBEHJLNMJJKD9--/.011333562.07?AFU[XSNKJD9;=72444444444455446CNRTXXPFDGNUXXYZTKLPVYY[\^]^_`bcba``]^_``_``___`_[YeopnnnkbI6686666898624678:6:ON:65F[H2ZpXa```Q\]WE8:99::99:;:;;<:=>>==<;::999;<>>@BEFHKMMOQSTTVXVURfz^PRWWWYPetN????@?????====;;::;998DUbjhbdnonvuosyum`XRBEWW>>D?@AB6666666668888889:9:::9:::;<=??@@@BEEDCBBBBBCCBBBAABCEHGCA@CIKIECA@>EJG=Uonorsrrrm`\pzdTURBBQZRRULN\hdYVSNS`g[V_]W\fkmmnsxo^adOFLVfm`Xdk\QTZZOFA=DOPILZ[K@@GNPWeljkdSOKJOH85@CAJIGDA@AAHQL;8?EIE<H@=BCB>=7MNME;GH=4>UFPl}zoe]G-4T25ARAD`Q7BC4,1=>Vv_HF@AIPVZa\nqec_XMIBA@HNPPKJLMJJKKIKGJHSxgF<87==5/RwH?CTPaC('210:9-*-7><515Go?)0?;=>7@B7??/-99AJA9>@<:9;DFDF?@CDDINIJKJJLNSELQVTPW]]_^R_cSHTSQPN?8FL8HQC*2>;::;D@=;<=ABDEGHHKMMLKLMOQTXVRPNKIHIIKKDDADCNSLLKA>FKKLFQQIWcb^[`[Y`dZZ[RRLGFVaU\URY]fiY[[[YXZQA?MO?;807ADGHKJ4*J[UurtmfjcUYc~qPUicGGJICCA;:99R{~bzUAA>B9-?FJJMLE<520,/.011/8`~{xspnjiheYIBFF<66643:NPHKD?:568589:<>@<2/1138F;2444344444454446CNPRTTOGDGOVVWY[RJMQVYY\\]\^_``aba`_^^_``_``a`___[ZeoppomlcK89966564286556667643468627;22`kX`\jrgl{QKOA9::::::::<==<<>><;;;<<;:<>;9:99:;;::::99;=?BDGHKMMOQSSUWXXX[_Z[]]]^`a]bdZZVSSTRRRPONNNMLIHEDCCCCBELS^fb_biorutkflkfa_XMIEDFHGD@?@566566656888888888::9:;::;<=?ABBBCEFEDDBABBBBBBBAABBBCCBAAAABCBBBCLVWI>PaequqqrpmkkldPFIHFDEILSVPR\[XYUMDDLTUTVZ^_XWjysijruk\WWWZ`^RJMPVZY]WD?EEEOUTQPONG@@ENZc]ZnmUMKKH:7AB?DMNJJE:8@A=8317;=@<;@:4818OSMIPckfa^_bjro^[_]ajha[UT]mw{vg[ch_Q]zrslxnN?Mjsmtym_`nqyvoic[dd^_]_nyug`vpYephhemz|~||y~{T@CDEDFHIKJJJIKLMMLIHMOLGHIGGBEDDCDGHILNOPONQTSQQPSWTORWVZTSRKSYUQU\^]YVZ\[\\[\\MUTUY`a][\_`^YX[\VVX[QVZZ]\YX_a]RPOM[SN\ZQNOUTMU\ZMNONSQENUQEGFKMOJFLNGIJLKLLPSSS\aXUWZ\^]^`a_`gjhZ[ccbabckkhghigfdabb_[WWY\[_lp۽ũ¸mvmkw}dl}ɲϽǫĿ¼˪ȶȨ̧ļ~»Ͳļɿëtz{sup{|fcranp|ohtevra}zw{ZjrVmez^G_a?LuwhUnZdYfX\hmvZ^gZXpibgP\kgi]qq^ntx_N]fhYVLXJDb^EA`AUb|rSOQC>85SC41I>8I;55?[Q0<>KO4-828:><>6M;77>803:AL@C>75:CG=8;?@@4*-.6?;=:9A;5=>15::EI><<:969=DD>>>@BCELMGIIHGIOLDKQQJIR[[^_YbaSO^V_QP=DA>?CGB9::;?@==DIK^_eueXMAA<5=Taeh_H1*,*3ELIB<@HW[QHLJA?=57;60..BV`_`a\UUUPZquy}zutqnH=CIXt~y~{mlsb{z|pnjGNSTSOXenuoosuchlOPTP:358358@FD946=CCBDGMMF@:763,--/00-/Nputtqge`UG914;<869:52432;KHCUc\QLPso47DJ7+49>HLLIqlaRSpB_oX>8DLJJRoZUqsrtsruyoQ>67:AL[]tu\:2333344443444436DPRRQQOGBIRVUUZ[SMQUXXZZ[[\]^^^_``__^^_``]^aba`__]]enoprombK89:76666566777777667866767798:>76?GMVblllmmlifdcgloooqonnnnnoprtttuvvvsrtsrsrrssqqqqqqqppoonnmkkigeeecbfea``bbbdeb`begjijiddcegfbcd^[[555566556778999888999:;;:<>?ACCDDDGGEDCAAAABBBAAAAAA@AAA@ABBBA@@@BILKEBLT_nrsturg^UKEALOHKMIFHUZNJLC?IJCDEFN[aVRTPEL`efgdb[LHY\PNPLLMF>@N^aXNHHGHKNPNLR\]PFFNY^]f|qUOLHB:AOC@8478989;<8.9LGGKCA?BVaabbaabepi_imi``]XZ]`ekv~vxyohZaxofu|ux}x`T[jrqwsb`ky~|cRV[Z^`a^o}wrp_^pkloepmbt~{iuz~|zyrZ@@B@BEGILLJHHIHIKKKIHFEEEGGHADDDEFIKOUTPTURSZZXWWX\[VW_`b_\]Y^bVRWab_\Z^_]\\[\`Y^adfig`Z[^`_XSUSLNUYPQQRVVTW[\VPQNP`QM^UMLOSOISYRGHKLOJEKNLGFFHHIGGQPHHGGGGGJIHO\cZX^`abbabcaafig[^ddbbbbkkfeghgggilmldZZ]abf|ï©h{~xkgmr|razqĿúàæùƮܴµIJѬĴ÷«Сª­°ěætzuqu{jao`axr~gjzljxw|}_tytTvuSplpzkXb~a=29<4(/DA3;?65B@GB4GZYMD;8:AGLSdJJLTdgc\RUPLHGFDEDCC<85AKJ>>??=O^VI=0/C30AAO2'9;/04,.=MJ71<>6>XT?8A61:=KT>/9??;616>DB<7:BE>,(*29?=;8:>40B>1;9?ACGLLGGFFEHLKEIRM?ALNONOU]^TW`aaTS=CMFAVO23KOICDIID?9999=?BEEDEFHHHIIIJJMUYYVRNKIFACKLCQ^NIPE9?CHLHDOMDS^^XV`^[YUP_cQLG=BYZPPMIQ]e]SX]]]S[]JG=MXH3.157:99BTnfA;IH846:MRSRONIB=:::<3+1?]gfed_WSSR[xwvovc[ZWPCDhm^TKPHHMizvpoW6/3ER[bZ]d[F37QWXaS8;CFB?7122346987549>:879;==92/148999=AB;69?BCGLTZWMJD821136982//0120-5JYQ@9=ACAEJ>542333334434444337ERUUSSPGELSVUTXYSPUWWXXYZ[\]^^^````^]]^^_]^abaa__^_gnoprrngN88:9888777667788878<;76679878866549\vtyhA8778899998::9:;;;:::<<;;;;=?;7?Wkrx}{z{~~~|zyyyxxz|}~}|yyxwvusqnllkihhghihiklkkopqrqoljiggedfghhhgij5555555567889:9888999:<<;<>@CEEEEGIIFDBAA??ABBAAA@@@?AA@@@AAA????=;;=ACFMXacgdfslRA<<=FHBFICAKQKB>=;;BDFRSOW]ZRLIHFFOPB;@CEHJJKMIFKLLNGBIRW[WMKJJJKOOO]leXY\\YYfzy\KPK@@@BEAFIMLIEEEFGHJJFDCCCCGGICEEFGHJLQUUQWZ\[^_]^_`b`\]gfaabcbdfXU]c_\ZY^_]ZY][^bgljedaWQUWXVSPOKGKSZOJJNRRPTWRMNUQQ^NN^TLLNQIFSUEBGJMNFHJLKFFDDCFKU[UNKMMMLLNNNU^gb^cddbaaab]^aif[^dbcbabiifefggghiknomgbabm|øϲiv{xrzecdvqn~~~ans~øƻ̴˛ǹʹÿȾ˿ĵ–ĺÏʵĵצ¢īĿȲ|}n~u||mvnflŧe[Z}{it|yqaovlohs{xuk\ay{jUsTvqem~]`Z;gyrw|oQfZOJq^_sIY|``]{{n^btqYcwgob]mwobVVf^]x]TT[Ja^A^{IVujRDToXCJ==C>99H.7B*2>DC'13:C;6=J\bkmQ87539:8;GJB.(->37JQMB?==>BCVUG[W_ceTA9>:8EG>4:=B6KZ[H;4B51OFE3.77-(++3DF8138SI28=:98407?CA;5<@C7&'-89:=:79837J=8;<>F61335956@;06?=>?BFJIFEEDCCMJFKUG>IQEDEIOWWS[]g_\Q;NHFN[H3=SYNAMMJO>9997:6))9KENOLKS_N;MWQYI8?CKb[66GH;<959:8F`мxlaLOcxoO7/,/*-Gp`1*?OOKLQQJFC;:=:32:HXkf_XRRSUQSer}œ~unkcVGRE?GI]{{rrvxz~uTSr~}p[QRFBEDDGRk}{|vpqqcYmw^UZTIK;-;EBNO88<;>DLMI;:DHJHFF?,+-..,/JcggfdZ?.,-.01138=BB8.-.4=CIQ^W=16E_tOYI.1,:MA7MngF7241>Y_M6Bf[1C\=7YrRLQMGRhrskcX6&9beV`kjVB>95EQZ\B7:::DG700.-/2668;<>?857:<==<83247::9:??<99<;;Mc_WXPIE8./126;952.,/21.0BRG4/28>;:?<323232334444444448GTWUWXPFELSUVTWWTSWWWXXZ[\]]^^^_``_]\]]]]]^aaaa_`^aiooprrnjR88;;;;:97776778898876667777689:9997CcvpR<98:9888799999899:::;;;<<<=>:9Ps}|}~}zzzzxwwy}}{zxuurpnkjjjjiiiikmmmnnloqppollkiighhggghijll334555545688898899999:<=<<>BDFGGHJLKIDBA@?@@AAAAA@@@@@@@???@@????>>>?ADDFKPOKGLfqUMQHD=?C@@DKRL>=>>@CGJHNSPSPLOLGFFE??GGDEGHIIOULEIJIJHMSOR_^TQMNZ^XZX]`R]sseVViri]RNMDBJRM8?@,;,06365EXFIV\SLE=4@?44@D<4,.28@D@AFF@?;4/=<,+/.,0:;7522/(%/?<,)/3449CHIICBC?;;9>DEGHJICAA556946CPD?D?;=WE=3101.*-0-55/01439RGG[-6:96GH4<5:;8/2945:7;7./<@:VEJZXD;FY\KCRIJQ@9:;747>DEBABBBDEEEDFLQQQSRRPLHHFFJZODML@;>BEGDDLHIVYTQW`ZSNJXcYSRF<.0ANRNEFNID64GF9YL004AORsגcYQB:DcU4,4HH.0Quc3;UQEHNTQKHC78FA-2>@GSNGEEMWPGMJb}rvz}~xtsof|pMLCDDLo}}wqrqorywgXj~sgXPORPKGDAJe|zsrjirmZV`_SQTVVS?.9IGBIA8=:88=CD;9@CA=212-/0-.+/J_chaXRJ8/131006@GFB:-(/537AN[L21>CNxtHcH09/1EC?JWYH4//6YucE7FjV1@P55XzoZPFKbjv|rXH36]mY^svmb8.>JH;9946QeM>>;6222346;>>=;6;==<964355677776554326NfaRQOEB<0.0136751+*-11009?921.266445223233224444444447FUXUWZQDEMTUTUWWUUWVWXXXZ\\\]]]]]\\[Y[[\]]]`a``_`^`kqporrnjU98<;;;:98887788888777666777778888789GaR<759;9889999999899;;;;:<<<=:5<]~}~~}}||||zzz|}{xtrpnmkiiklkkkkmppoppprrrpnmmnmkkmljjlmnopp444455555678998989999:<=>>@DFHIIJLNNIDBA@@@AAAAA@@@???@@??????>>>?@B>=IEAOXPFB@A@@FMTNFHKOJLRMMKIFDDEEGIJFDKSXXRGGQTKFFFLY[TPMVhfZb_LDQlnjl]RY]bcSJPIMWbdG>HOJBCHPQXtkLD>:87:=7>^sgY\R@Rl\RYTNS_eapkQO\hegd\[[[[he_oqieamobdSc}tlo^Sbjxzdhzfhnb^nq_gkxu~~z}}~}oepzzurhsp]]cegkinxW@DFCC@CGFB@@ACCCEEDBBFFCFGKJLNOOPTUYXW]^^`c]`d`]][YXX\_XXaYU[YOKPTOQTV[ZYX\`]Z\]WU[WIGOSQQTQPRLDIRWNIGNSNOXVNLSXTQYMMUNNOQRFEQL?MSKTXPTNIGFF@DQX]^]\Z\^\Z[[\^^^_dhb]]]`W[[aXX\bbZ[aafebaeb_dgfdb`_`jt|һ}td|}vsnz{`cadt|}ltuu{giy}|óԱѵ׬иŴĸ׭{z{ĮǨ§׷ðŒƷn~zuouhmgumh{bWǖcT^o[n}kxtxm|c[o`Zcbrpgjo_rlrzOptuWmpp}P^uiijOjiOs|LNyzmz{|kj\Q)*+,=>GF>/(1>:650124;,%&$&%# ,5<2:E;1'""-@:'%+12-;SH;?DB@>:8BJdlUKGF?9=KSNE><88604LB0A?7896138=B=66<;>2224:5<=49997OL;51940.9@489<3/05@<9@C@;?EDDCA?=QHDMF@NTMEEOVQJIQZ`efhIKVJT\RFFN^UELQBYPD:;=7148DGA@AA?@BCBDEFIKMOQSSPMLFDJLFHJC;;?DFA>GIGQXTRTXSLHGQ`[T[TDBYUBAGIMMKKJLQST\fcVOO?EDI8-'6967:=;8>>13CQI;5?PE2/5:6@ABEKVXABGE}rlkkqx||xuoaatQMH:7Q{x~unqohrwcUT^a[TNOOOOMHDESdheedagrpYTZR:EKR[QFJVQE96:989952685468=:1*)/96..+0I^^egI9=94652213=GGD;379:9@GMWI412>DZsd@.@7/:DGHBEF6-/;SdO<6?aQ4TufD;6E`videj~}r='*369984:T_TORVP931247:>?>76999:7413664666655228;BT_VIFG=87302321331./001.,+,/3342.1112212233333444444437GTWTVYQEDMTTSSVWUTTUWZYWY\\[[\]][ZZZYYZ\\[]aba`_`^_lsrqttnkY;8><:98888877877779986677777777776798>:7879988899999998:;;:;;<<<>=8Ci|~|{{}}xtqonnlkmnnlmnnprsstsstttsssssspprpmlnooqrr444444555677899988999:<>@@AEHJKKKMOOJFBA@@?@AA@@@?????????????>==>?CD?FPLEC?@?EMRUOQTRPMPSPSWOIE@CBBHQ]cVBJ\RIMORPLIGFEHOOLJJKPZ`YKIRWJ>AJRX]UOORWVVa\G?QcbhvjUJJPLEHPLU\^iVCCG@@LNT\^nh]KEI=:HIC;=CJB?AC@5+%##&+.*$%((#!3<9)>T@%#!#/:4*,9A93FG87AFA@@=>Mc_H5870LRH%*+((*2;6B@5/25373139AH>*2@JB:>;<852/5=C@8369=:943967A81<;:@W?8,87011CC9649/;7;A7CBAA@>?QCDJAAOJA=BKOGEJQZbdcaLVVQ\[PLLS^NEOHOXPA;??9658EG@BC=<>>?@AAABFJMNPPOOOLJGEHJG@<JbgT:?B9hv\rnCaޏE;BVUPmzlirtK+:VC4=?86:<>=63?9.?KEAAFLTVJ9??Pwljdnx}umf^WXTTM77^~vnxsmomltoYMJPUTOKNONLGGLPNMU^\PXnpj[L]S@JFLZRNVbU>:;8213420//0..35AJKKNJ8300.2JD9>?NHavR;6326LYea^cWPfQ@;0-27:758@IMQW_V<667603=DB7684587554688888:=<74;GOX[OAAD=543133223333541/-,8RcL@95Fp}~|{}{xtrqpppoqrrpqrsstvyzzywwwyyyxvvwxtqpnopprrr344444444568999:98888:=@BABGJLNOOOQQMGBA@@?@@@@@????>>?>???>>>=<<<=ANWWSKFCBJIAHKQULKU]]_d_VRQKB@CGHGPYfgFPhN>BKRPOLIIFFLSUOJKJNTQMILNA@ITYVWVSPQVVV[RBALSUbsnbSJJGOVUTXY[eVEGGCHVZX_dmd^\VYMCAJW^`eqsidach^TZcisg^db^c^UYef^Y^jd^hxw][rqeZT[j}gFJ`vxchpa_neZpxzxep{{qo_Z\`dp~p[|zkUVkqrwr{qigmswfFBB@@@@BDCA?AAABBCCCDDFHEGJOORUTLQWXY]WWYUU[RNWWWWRQTVXZURZVKLOKGFLKPRTVUTVX[[Y\ZUTSJELTQMJIHJUPCJSWX\VZ`b`^`dd_ZWV[TLINS[ZRKLQXXSNLYXVWXY[YTY^YU\[Z[[[YWWUTQTZZ^\a_YUU^YZZ[UV]ZWXY]bh_Z^c`\bhea]Z^lw̴³¼ʳx{qhqqnkzx[bdX~wr||qy|ij|o}u{vǸͬǹķ׾þƠˠ|v̵֥гē~}izԭ|t}s|dh|cghZ~zvgeQcrqzoc|ohktciq`tTjto^Sc_`~}fctlsfYqskzOcW[md\egvlMQraU[qoqv~ynzfG@Hl~bl[vffp|wi[\XX[kFRnaUppdh[ZokGRPxlUMRVSgTb}fikJKNBVROKM056LA:GLHE2?552/5KXKH:EWUKK@?DQNIJF;88=9>@A:,+0*#$%+-7?BKA3578#(FB$-+4?2009GJ=BOXL=78@JXZTJ=:897;6CTR8,NJ90/@504>I@52>>>>:C<9D=27;AD@?;B:HOBCH;DJE=EA=;;AHGBCC:;<=>>??@ABFKLLONNNNKHGHGHGABGGC@JKIHKNOPNIFBCLTUQ]YPS\L;@DEHD:GM@FHINRSW[YT]VNP9/01355546:>;2:A;5V:6KNKNTROSJ7./4@AQuc17HE=ITSQ[W<0400GJ8Yc>=@>GW[SvxH;B>4L}dPE3)-86Fd^S_UJJHZ_D/-9F905>KMSYSH;:77:88<9:323579779;:<><88<@B=8802122233333344455666>LSRV\YNGINRRRSUVTQRUXXXZ\^]\[[ZZZZZYYZ[^_^`abbaaa^alvurttnn]<7::9:9999888887777777667777787777877888888888888888998999:;;:=:6Gq}~}|{}~{zzywuuttttuvvvvwwwxz||~~}~}}{yzzxusqppqqqq344444434569:9:::87889>CDBCILNQRRRSSOHBA@@@@@@@@????>>?>???>===:;;;8Jai`QHM[dYJKLNVV[^W]ea[VSSH>FKNMFKOV^NU^F=AJURPPLIECLUXVRMGENSKGKOQMDJVRMOOOQW[ZVLAALMIVikjhjhXY_ZZ]TVk_KOLJM]e`cdd]dpXORKJRaljisqgc]`ga]bglmg_[TQU[]``QLWclkglvsgWPXb\M`tsvvdGAMRttYVnt^\WVXs{wumaR]e`Ym]]p~~}rejvjfy}{unliihlq{oG8@A?ABCCDDB@BAABBCCBDDFHFIKONRTSLPVWWZTR[PSYOKTSVWQNRWYYVRVVJJLJICCKQSTTSRTVRSVZZVTNMIPXSPJJJIUSLW\]_YUZ`a]\^fec\\Z\YULPZaYRQRU^XOKMRXTUZ[]a]]^OR\\Y[\ZXWWTQOSVWZYZZXRR\Z[]ZVTYVUYX[cd[UZa^\bg`[Z[`rĞô˼x|qhiosllxt[`gUsu}}rzfe~p|m~¼ƾƾǼĺноϳҺͫЯſsÞĨԤʾվ~eơ~o}bobg`_xo`OZyqooil}|pfmyuotumrRp{kkVTX^iw~Zdp|qZO~kJ`^^xq_VlxvtJRoaa]~vivss|wpJ=Fpp|spX{e^nw{\TZQP_c;IDHC<;.701=?CGC?DOQ<:=;DIH?5/.2346887888:77=32M^OB<>6/,::F7G83VI,.8EG@=??NYYM2//ACGSS>/5:877<34>2-;@:ES98)6<24:HG;0?MAA6?C7CE05>>DB@:>D8PKACD;FG@:>FNG?GNS^]`aUGMZf_STTUXXOPFNYVI5HHB@>DGKGCE=7:;===>>?@?DJJJKLNMMKIFEFJJGHJFEKNIFDGORMIHA>DMOOT[UT\TB?DEEHB?M@>DDHJLRY[\deZ\U>3-/.244115?>7>AA;tkAOS<=JfW>FOSciROrtzyuAAOV\`mŐY>:I]e{rhZLMS\hZ@>KJA;72395-,:<0-1?LMGHKHEA;=<;Lr`apfmsjr|pgmxsickcEBIGOkjEIm{pZ=Ie_A:DKQOLE<@QgR@cjIDOKCAIYg`J@VW[ezbSmoR:;:34;7549OWH50022334347DNC47MPKKKLRH-'+09>@SK/76AE=1/048:78;=<==:88<@B@<96@MWYUJEHPM5*55212237;;992?V41122233333344455446@MQQV\WLHLOPRTUVVROOTVVWYZ[\]\[YXY[ZYY[]_aaaabbaaa^`lvusutopdE6999989998888877777777777777877888778888888888888889999999;<;;6L{}{~||y{~|z{}~|}~~}wvyyxwwxvuwwwxz|}}}~~}{{yxvsqqqqqq33333333446:;99;:7688:?CDCDIMORTSRTTPHA@@?@@@@@???>>>>>>>>>>==<;:==8BWfj]P^ok[QOHS_YebHEQOJOY]SGJSZXJBP^TIWdWGFPYOMQJGCFOW]^]XQSW\UQSZ`YJCORLNNNMLW]SICCFIP`jlqutgRQW\dg]UgobULMOW][_ZQXc^RWXMP[fqpigec`YZ``]Z\dif_^^WZ_ekdWNTaggegh^VSJAINBSnqnmmYSVPL]`UW|khbTUgzwjz~hNbojek{dMRk|nnv~rgknpvzmkkpoorvmUC@ABEEDDEDB@BB@BCCCBDCFGGGJNKNPQNQUVUQPS[PSWMIROTWMMTXXXVQRUKINHHA;HNTSQPRTRLMTXYVSQPSSYVWQRTSXUVab^_PNRZ_ZWY^^_]]^^\^TPZ^VSQV][TMHMLWQO[Y\`^^^QR\\XZ\YXXUQMMQRSWWVWURQ][[ZZUTUUUWTYc_YVW\ZY^b\WY[asпҮ¯̾t|wjciivhnxq\djXn{|{~tze[~yx`~õϼŨջļٰ֥óˠӼ̴ΩϿƲչymbݱ{h}xk}zah[im|u|WPZojpfftzmwohovttsvsk[slddQQOgk{gSbgOMj{Djgcwy~]ZeyGQokr[pkYywq~tP=Eqt~il\eaozVR\OJcW@cXgw_hedm_UGYCu|gUJLZTWm^YxzOFBE[F9KZK=9?H=FC:.=KGB=712+6BB=3697BF<8<@A><@NN<5/)'.1//3=@/#%')%$9@>IC631-%#)16@VC2:BSL;476==39ADFA?@I702A60*11,)*.25443684224444**A@@><6.0:=+.4#$MO*'7EA=<<4;C>BA@A??R>/.5<6'/40202--/2=E9/..3;8>:?:,59.5=>;II9/-@567>EB64RF<48B@=GB<:@FKB=INU]]``QBL\h^NUVZZWUUEQXUD7QGCBAIJKFFD789;<====??=BJIGJNONKJJGCCDFGGGGHKJEBBHPOJJJ>?FLLMUWTWWKABFCGICF>5ACCFGKTWV]feccPM845222269=DECGIKEv^[wgICdoNSigkl_]qjqB=_aLSwĹxBBIJSK_vb\]TPRRG?@C?@AJRNN[YQTlpnf[]lqqnh[cpV9:=FgnfowoY82WbA4BFDIVRHAXsbWqeKXbN>DX]ZfT6H``n~dQlfUHNQC@F6-/.0000.)2=ARC04>:29>27G?731:KG4-/01425245BOZWTYZRNMJPI3/.16?IE41@IC47LWTUgaC25@GeqH18470?LRVhyJ8MI;=RZJ:DH2-8D<59Ne\KINXWS6+3;R`D@I@;XcdkhTGMI97DJB9227:;99:963127;?ABB>;DSTUX[SKFMXE.45102458;;:;4/JvlY9222222222223333225@LPRW[THGKNPRUXXVQMNSUTVXZZ\\\[YXZ[ZY[]]`aa``bcb`_^aluustqpmjK578878888887777777777777777777777777888888888877878889999::998U~}}~~||||z}zz{||{|}}zwuwxxwxxvuvxx{}~{zwurrrrrr234322323348988997899;?CCCFKNPSSTSTUQH@@@????@???>>>==>>>>>>===<=AIIM]kj`_ebWNOPFRii`OA@C@@MY\YNHJP]T=Vu_QcmgXV\UJLJFDGRYXSYcaZ^edba`\VYPBLQNPQQRUZTKIHCDNZecZYWRLIJO]hga\`hi^NLQUXVTON]_[_g`QTajjb[XXZYTRRTTPXeeda^^eektrmg[QY^dltmaliPEMOFThijkqifc\QQ_kj{uQYjxvyt}s{~si`^f{{iaiqqsvswyuoprsqjUKFCCEFECCFGC@BC@AEGGEGEGHFFILFLLOQTWVSOOW]TVYMFQNTWGQWWUUSPPPKKSGBB9EJROLMPRJGNRRVVUUU\UWXYYZ]^]WY]YZXILNT\XRQXYWVV\ZW]XNMWTQJP^UOJCNIOMOQRUXZ[[RT\]YZ\[XVTMGHOMNWVSTSVT`__][XUZZWWUWa^YYYYWV[]Z\_cdr˶»Ľ˿}qwrh`hdxyenxnbmncfz{q{vv~cV|r[{Ǽʱǯ̻̾ϣѺصҰŬּʽ˴¹ʵѴqt_wΧs^}wj~llkZx}g{ylaf^_`qeernfmfmqhrpv~wthftc__NGWvg|UPekaOWexX~yssxw`fXsBOsqzXeZNxwqyvY=Fp}r_fhmsrOT[OHiRRVhtm]fng\NTET\oobTHHORgeq^ABBRK5?JQJC9@D>;88*-5=E?5522CF?9/.1:B:56<=<71*-2232/..,-.373,)&%/.,:@CB;50-,(*-/1>F>?HIC8,,577755@LI?<94597;%,686.*.3353205411/02*5C2+012.,)9>W4%"%$.B6/,643<;9AI=7/8?8<;@>=:CP;96?DFQ>'4CABB868J?COB>B8AB:8;?ED8@KPZZ]`\F>N\eUL[Va\V]WHUYS0<:<==;:;>><@GHGGMNLJJIHECBBCDEIIHEC?DPQIGNC<@FIKMRSUUPLGFGIOJG<2@IGFEGQQLXeecc_[XIF<2302?GJJKKICLMn]l}mYinFGproohY[ym|q`hA@SE@cP=OTC3:TZA8<:6133+).3106AECAGRQPTQJGLY`dYRapkcebTXgyO=>WurqpcHQW\I7=?=BYrogfurnrfdre@6CY^\sp>.[op~b?QVafpiYcX5*-,./010*4?C]_H9440176?LE<<>>BF5-.02434373?L\__[XWQKEHMHEC@:=E>4@OPI96GOZknjW;54?YRGQH179?C=CGUL2345768:78;2-+.0/,AZN<=EDBD2IriM`iSB3:clotm]IFI?9DKIB:7:<=<:9641/39=@A@??<@R^WORUROOSTB26204778876782;pkaqpK332222333333344336@KSUWZTGCHORV[\\VOKNSRRTVZ\[\[ZYXZ[ZZ[]]`````abba`_bluusurpnkM77876778888777777777777777777777777777777777777888888899:9;56d~{xxy{|||{{~}|{||zyyyvttvwwwwwuuwyx{~zxuuutts2243112222378778879;;=@DCDHMPRTTUTUWSH>?@????@???>>====>>>>>=====BPVU_i`^k_HEHNWZZekUBLQA=HQPKQNIMHKNCUxthkimpmd[XNCEEDOWXSWbc]\a^[`[KFKLX\KHPVTRQOKGJJCKYRVWGCGJNKIP]d]WZYWWVNIP\^TOMSaccgdYY]ek]PRSQQPOMLJKLV\[evtbhyxvwsi`efenotzo\TTVrxwymc_`_[`w~s~{gMTtwaq`XlXlypibptvpghkpw~vqttpjjm`G??FFFFFEBBHKFEKLKORRPMJGIIFFHJCKNUX[^ZVUW`^^b_NFPNSMCW[VRQPOMIFLXF?D:AFPJHHNNDEQPLRW]\UZWOQUY\Y\[VVVQTRHPLNUSMKSUPNPXSKVYJCTQMFKZPLE>NGLKLLMORUXXTV]^ZZ\\XURLHHQMJWXUVUZXifdb``\`aX[_\ab_`_]YY[__bfmmh}϶ƨ˽tlof]g_mtdqvhhnlt_|xykxvn|`]s^w˼ϼƹȸǺٸձѤطɟ̼âʮŰdh˿zigig~bk`\{qwtd}^QZrkbieaa[mtdnh|xxemt\]^MAo~fu~xoPQsVlX`}uexvklhiqdeAUzq{ZZKRwptslzy^9Jmzj^bowpIYRPPl[f~[}oa^`lTBTLBcgOkaTGAE[m~vaE?BHL??BGNI@48C:5=50/%2G<19<:<963+&-:95945:94,+068973*'11+18+"58-277+0783*+2.*7GB=BD8,&&0:5865;KPH>735983926>;3+-11/-,/26531521*4]N>3.-.*0D;YI!((3-*=IF>34:>NQPPT-,7?GJO9,+.5;73-+,3;=G=72(2826869CB769@9>=??9;CKB8<>AKXM+/AB=C<98@J@DM@>><@=56T^^LK^Wf]TdWKZYQ9IR@DHIKMF?M53C:===:79==:>DFEGKLIHHIKIHFDBCEHGFEDDMSLHNI;;GQWsumTlpRAFFC@WqcWRLKFACC?NmiB1RnV329FRRTRH>=?>DJL@57>APmwrgN5,>PPZ[A4AFLB+48:82)(-+)075;B1*)*+/8L_YGBH9ETRl{J\za8*;^fb[URJ?>=7@AA@=<<8@T]TR]^[XPPD674/19:863159>EPs{RR]_VG622233333333444446AKSXXZTDAEMTX^`^WMIMRQRSUZ\Z[[ZZY[[[[]^^```__abbba`dltvtuqomnR967656688887777777777777777777777777777777777778888878::;80>l~~{zxvwyzzyz{|~~~}{z{xwwusqtvxxwwwuvy{||ywxyxvt344333222357777998:<=?BFFGKQRRTUUUVWSH?>@????@???===========<<<:9>HEGMMLJIMOQRTUW\_XSROJLMHEHICNY`db`_^]`g^cicPNTPSEEUXYPLLQTMAGVI>Dj^SG6/,//+*),38:81/6310.JTO;36=/8A2FR..'51'4839?K\UM;97.+7DS]K.0=GLMA.5,/9<-9C821+(,5;=A3/+3;<4636:=939B@:<=A;89EF58A@@X]5-<9:;FK@BJ?D=>=747<=B56NOW[W_\E5E\^XHM^Xf]SjVQ]YN?SL?AILII?EL/?IA=<;85:<<:<@ACFHHGFGHKMMKGDCCCCDFDGOLGMN@;@?EDMKLNLNWRMS[\TMEEHABB;FOHM^^WV]^ejdf[E?5029DOXUF;4Cr`mysvwSEamrpnncekH8<@G@Psp}]=:DIGFDACQoyytj_SNJD:Eq`ZncC;==979:3,+,06<=<=AHPUZ^]SO|dSWWXTKIMQPH>jyqos~{qqthg_O:3BJJLSa{uuumjwnI34E\fbf|fIde=N^ea][VL;3;:3//11/.>E3Ibd`H+-=HNNC8:AEGGA3,-025646<18@?=>?C;,'*+9MQQRQMGJKCAC8.05:>Uw|s_;1GUZYOCDJV[Q=8:6*--,-,-11.BP0'(-.7FMX_`eX:P_WZmtO\`)*@ROPMNXTJG@57@FF?86?CGECILD>75D`uuxsaZK>963466667852469FR]f[KW^I42421333333444455446ALRUWWQD>CMUY]`^VMJKMPQRW[\Z\[YY[\[\]]]]^``_^`aa`abelsuttqomoX<55566677777777777777777777777777777777777777778888779;>;3Fu|zxxwwxxxxz{|~}}}~zz{xwvussuwyzxxwxz|}{zyzzyw3333322224678899998;=?BHIILQSTVVVVXYTH?>>???????>=============>=:JNKRWMEIGPenhYMGNOE@HaqcTcm\OMOVRGFDBBBIJJX\V`h]Z^ZYUNU`_ZUSTUTQSURQMFKX]bszwurokjmlli]VZ[`knsvmhml_TTMJlxqg`[\VZeo{d\gqnNdted|~USR]peQ^]LPaty{wjw|ldluiehk{~dzh_imfi||skl_KEJGLRSSRRSTWYZ[]_\VSUTMOTJCIIDYadhb[\^]cdabf_QQVWUJOUTZTEEJVSEALR?BWmbp_cissNoNPV^}vszhzvpc]\OHY:0_W:KkXMGGuqcVScVE84>ALRH@5-4;=A7,99/5:64246,)12124553103;>==>@DHC=>:4368/.2020-8<2&!$''&.8798FP8-*%%')+/32/4559<;==>>A;,-3;@<13552,&(*-386.++,0*,-46?94<>//655G@.),(,3652<@BF?6>;8/.;<=4/ISMJ?.6;)+344=?4/-)&*5:<6-('8C=46088433@D<<7?<86:A:-:@C4A1439<=A3?QK[XY^R76M`ZVIP]\c\QpXXbUNHSA>DMNHE=MB/LHC97<66?<;:;;>?ADDEFGGHKLKHFB@>ADEBDFEHOFFP^mnepid{T>LWVUYZK<::>:1,0542.8I?DZcf[9+ASND=89::=>7/,,,-3454=42<9516:0+..+5IPMKOQNMOI@F=*1O_Z^u~qE4GFCIGDBKmiLA?5+-1232.++AO-++.04:F;246656529KNBI]_P=1.232333334445555556@LRRSRJBAGQVY\^\UNMIHNQSZ_][[ZXZ\\]]_`_\]^\]___aaacfnuusqpono^?566566777777777777777777667777777777777777777788888:==75U~}}zxwwyzz|}~}}}}}~}{zyvssvzxw{~~}}~}{zxyyxw112322213458:899998;=@DIKKNRTTVVWWXYUI>>?>?>??>>===<<<<=====>@AAACFJNNJHFDGEACECBB>=MeX7LeWMTbXM[_[UBDQJMem]SPNSIFKNGCFR\TJMQRRMKFC@>BIOOPOJFDGWcjlc]`UGMP[ge^djeZKMTNFDFNG>FLMY]VU\cb[WTEAJWYVTTWVQNRTPNSSLW`\aknkjhs}wtsne^bdgmpqrkfkfVY_RXtja^WZ]aqym_hpkaejR<`n\jjjy~udSPU^ny}ynqzyt{wdbe{ekwvortmqsyueRMQRROTTSUVVWXVVXY[\WOPTTNRVIDOJJ^_`c^TWZWaba^^XQOY^[VXVMQYF=>OPEBCS>A<@BD:DCISJGMZXKLWH?EHSQOYWW[_]NMW_WFFINJGIHFGGEKMCLRJIRRTYTVTZ\c\[ZY[]_^`^\efbdcdefhjggih\]fgdeabfjlhffbdb^debeefnmgaciihedifgfж¼¶Ȧ|{mZZYmu^aYXr|afsyoswon~\iclqsìŶ˹ʿ´ӸпɽüѽҸջ͑tř̚տǻƛztuh|mp|jsoob[hisbYhW}u?Qk|]R]OPV_gUgjdlfQVmXV|qorsqdop{u]x^XspzsfxqNZtoq{n@mlgfcSHNebuhlupqXQF\eYscdhorPpK\dc{qtilW[YT_F-@YA?914;5/1201013.)&(*+*+-/8A?997201693.,+*05/-,(*/0/%,73'??%')*+)(.2-)-214/235>=@<.1>;?9-35772)$&(*,0+'+(')(*(+)1/051+/:@515.((+-8<>5<=4BHHKD@3+3/,+)GSOH:3C6.(.(7A70.+(%+5;7/.)-:>842.66539E>7<6A654:>1/?:>UaF==7886KO;74=+439:>@3IML^WY[D0:TbXTLP]_a]Tt]\`RNIL8=GRKHB?O1;SF@48927F:9:;:==>?ADFGFEFGGGED@@ABCBACFJH@D@@>@GCGFEMOHMW[[VUPLOMIABQPIRQA@IS\_]efid[NC?510:V_>*E[jibyn]j~zwxqk}zmxDIF:.DzgD7QtJGkE237=75::0+-,*).47381,35,7G?/,/-,/>JNOJBBDGHDHA,7j~{}~P7B4'0;72Cj}dD9@:.-265.((,?K-//13568>D_gB206:B\xtO+/69D>0=WZB643;B>7655;=87667887?AQ_U@755332334434455556658ALPNQPGAENTWY\\ZSNMIINUY[_][[YZ\\\^_ab_]\\Z\_aabdccgpvtrspnnnfE366566776666667777777776677766777777777777777788888;=69]y{}|yvxz|~~~}~||zvqt}z{}||zzyxxw011122222259:88999:<>BGLMNQTUUUWWWWYWK>=?>>>>>>>=<<<<<<<<<<<==>ACDFGKOMRWJ@IMEDGDDC=AUaQTjj[V_\QXabVAAHIKTYSQSLD@BGKMPMR^U@7IQFFKEBCAFLNUc^JCBCO]equp`MIOY[X[ZYai_PTNIPRYXHCCEO[]VNMXZPMF=BGGJSYYXTQNOQNKSbe[XXVWUSWboqw{rhccfhlpqqmloka[flawk}zoa[TRaovobh}~{thL7KLKdtmkm^OPSOM\hbejcgthYnmchzsvwvzskpzqlxs[SWXVWTTSRTTTTUPMVXYXPHINPMSVIDRNMYXZ_\STWV]c`\YUPQZ^^[YUIIZO=:ELAF@H=A;?8;:CGF>JCIWOIJVVKJNHAE@KVT\WUZW`YSVcf[PJONGOJCEKLHHETWQOXY[a\]]b[a]\[Z\]a`a]Zef_bgbcdfjbehg\\_aab^]ahifdebaa_edaeccjhbachihfedgleiɺͧǻçwzUVUcd\WYp~j`vrknsblu[s\q{vƮķȷůæüȿñžĬžɷʼպ˳rմȝΖòtxr}spuiwrnc\hww|ZYYXgS>`sYelLTYX^KnyjllbLjmCh|ohhupduuysoetWXkm~k`vmEk{}p|qgCnn^UXKD_jjqav~{lWOL_YSrj~ydcvlu[rQx`totsNQZ^Wg/7NC8Zob\W@Z~rhla>49DIDELL<5GEC:06>5/10./1550.-15641//07:7530025:;3)#$(*'+1-.980!!.2)?9*,(+,,,2/(,//12-,)/9:?10:66937;72.-,*+,-,+'38/,**,,234/.//*4<;=3)/'-2157:>97-5KSD44409;2($-/7676>45-819=2133+#-69-,7:99875/03:<7>A549<87>7>QE8CA>>/80.1498B;7LHP\UVW=0>\aWQLR[ca\Yrc^\PJIH6@ADFDDEEEEFEBA@@@@BEGFCDFD??BACA?HPGDNUUSUTSTQMGDOQGGI@?FNX^ZWYehf`YQJ;2.+BSOfx\s}vjSV[ZjojhfYikcn=VW?-?]XEFGM_KC@\qD,*6;;FGESgspd]a``m}svyV:9754469;96424E-//25:=?<?618:6875884;>:9Leigi[H=;<>FJRXJC@DIKQ\Q6.36:BJKD97EWT@354433334444446666776;GLLJNPGAIQVVX[]ZRPNJLTZ[[^][YWZ[[[]`cb`][Z\_bdddeeeirxwuvtqqqnK4675777666666677777777767777667666666677777777789:;84Dl~vy~{ww{}|~||{yvx|~~||{ywv011112222359:88999:<@DHMPQRUUUWWWWXZYL>=>>>>>>>>=<<<<;;<<<<<;;FMNQ[^TMHCCFGOYUU^[OKKFCMLKNE?EMLP[SC?BM[_bnys\NKYdUOUVWUVSShbTadbUHIPGLUTRNJNRKF@=DIHKV^\YZ^ZPNNNP`wm\\\\ZZ]b_grwulikmnnnmnkktwk`ikYVkxllpj_VGKUXbmuzuREJHRbrrjg\QRSMPglbkwot|b[ojr|{v}uupf]`fp}{kXUUTTSQPPPPPMPOGSUSUMGFHKHPVJGROOUSU\XSSUTX_]ZUMOWYY[XTRNJVUE;>8>6=FNPIGKIJWRMDVTLNLJBE=H\WTRTXNS^SNZifXNOQNTLDMRTJIMY_ZW[ZZd[W`eX][ZYXYY[^a\Xcf[`f_[\`d`_ddYWW[a^\^`bcdbea_`_ecacabddcffeghgedghqsv̱¾z]OYduk_QWt}kdwmekp`gyz]VkĶű©ĺŽ·ֶƹʻ²΢˱þһĊ~ٺѸݻŹϔǸvrb{w|}tcbncka[YTRVszMWrѝW|zZfYYXLplmql[JqZByihZbxkex{Wcfb[impiaxlQt||e|inQrnQNLDRnzn^d~|wbYVM`UProslwbamkxczcTp~|tF[\c`a/DL;Edjs_ZL6Twhk}`I<8@FB@KUG6@E>816:=74CI:<>23:510226:;:878<@>;83/+-479;7/.7@A;* $"#+4505:2"!%%,*)+.,')*,05)*../1.)!(77=7-454747653/.23/1*%.0*2115811.6;67:<@7-+$7QK8<8:=F?55.')1:9725ED983588*$390#*=F>9995,23>><>7026F8/04>3*=8BUPJF=8<<8>=8HL==D<;;1>+/1887C6>KFRYSTP93D]YXLMVZfaY^nicYNHJE6>;:<=>BCCDFGFHGEDBA@>?CFFCBEHD>ABB?N^[aliI20Fioofcbx}yd6MXJ;75;KRLJMJGE@A:56:::<=75@_xr\LB8-**+3>@>EGE?=GNGB<>JJIF?7334428@?87752*+,,.5<7<4-1-./..1:FJD>CYZF4,3PqoWNE3.CG;H\SAA5CF0(,.14-*?G1/.137::89FUXWU\Q9<[xe]S23-/<;35557;9;>:23=@96447?E;1_ng`WQD9ACFOXWLGBCQ^feN6/257>LLH@9ANG3212333334444555666777?IKIGJLECJRVUV[`ZQQNHOX[[\\ZXXWXZZ[]`cb^\]_befhjhjkikt|}{||xtspO457677666666667777766666777777766666667777767789;967Sx|~}{z|~}~~||}{yy{{{~{yvt0111112233479989988;@DHNRQRTUUWWWWXZYL>=>=>=>>===<<<<;;<<<<<;:AB??CKNLLMNQPQTPMJE>@GJGDUe\]ie`\TKB<<=ACDGMPSVMIHDD?CKRUMLHVodLGMIZ^FCIMLEGOF>IW[^`lzxgVNVUMSXYWPOMMkoeh`YRIJWKGNKNQKJNIDBCJLOSY\[]`ilVLOVVXmsidba`ccbbgpuoecefdfoussh`t{kljPQfotnbjshQP`WHSlumnsqroZFDL`strrutbWSQm|ptztz{h]X[^pzyqrvkgolb^afn{{lZRQQPONOOONLIMOFNOJNJEJIKEPVIKPPRURQVSSSRPTZUXRGOZYWWVRPRMQUS@:?BD45B@=CDPY]ZSTTVOSVSDZTSTPKAA;E\XIMPUQGXVHHdeZQPQRUPJVXUMPSVi\SVYT`QOadXXYXWWVUVZ^XW_dV^d[TUY^a[_eXTUU`^X]`]^cbea``_dbaccddfhjjigghfdeaa˼ȶ||tO_umkfQSxknylano_by|bokȼ˴ƪϽɼԽ׽ŬеʽĻäʲƿ̾¥zۿɻӗsqb|}~uwcYxqp`Ydjasz]^YIsgYẁgwsr\bPXtykuqePPoYVg_[Uo{sszqsMbgzatt_hezrqsup^xou[qpHIEG`p^Wn}ol_`^OjXJqqkco`cikr`tYuu|rVZYhrX6NABPVo}p`TE:`fvZLH=::>JNNK86ED5/16BC77C?-1A=3210047898799:==;87641+,16>D>12?>3)%%"$17104+$ "#%)'%)/,()++24+1*+./'$$265<2:6344698982.287-('+1(%)-2865-''* !11*/+./12+15=74;>;:3-(.E[SLA>;IKBGA*-2:C;727FD774797(%33*&+:DA>==4+24B;;7...=D3/.5=,/:ANJIFB63=<8D5>LB?>A8>467(24;9]@I1:46BG8?=:5HA8867=@A@CFGGIIGFDCA?@EIGBAEHC?AC>:?KLA?GLKJQTUXTQRSQJHKJIIKOZUJGQ^c_[[bf\HOglaR@Mv]_\fgM/4a|pcUlpTgQ0ATPE9-3FNLJHHIF:26<=:6416Pkka_`dc_^\Zenw~zvofV866641,)+.269@<7543=B0.KO;446Jd[TOJB@AA>M`\MD=>I`j_A3.4>DCGEEC;:@<2333333333554677767767?JMKIJHBCJRVUV]aXNOLIRZ[[[ZXWXWWYZZ\_```]`ehjjlmmnpmku~zrqU64766666666666667666666667777677666666677777677993;b~{~||~~}~}}~~~|{z{{{~zxvu013322113357789999:<>CINRSRTUWWWWWXZZM==>=======<;;;;;;;<<;;:;EJEDKTNGNRMMTVRLMTJAHKJOQS_d]Z]]TIFKLEBHKC;FPHC??BEECFJLH>>=HiyhZPLitM=HHE@LbTCLT\_dntuiPH\YNTZSLTYSLZ`ccRJIEGMGFJGHKLJJKOIGMKORRRT^`kv`UXUT\ksocdecd^_dddgijjgfadoutrhZfvqqjNQbbccbn|{WOngMTd]`qx`CDHL[gpumfebadsxihppytNGWWZlw{kmzuqsqmihhkwzn[OOMKKKLMNNLJFHNGNPFGG@FJJHUUHLMPQSQORPQNQOPTPYWIS\[^\Z[XVVVV^LE@AA<739A63545><(%.-+007<>AA=1,1=?351,,5F9,*/87+3?KG?BB>43>8@<9JE@=::7>1:..17<:@<A@<=70,.8FE@DUfjb^^_XV^kxwpjeI238961+(*+*',5>914=Qgoi`^WMMPKMRIJYbhswsos~~zrjd]ZpoFT^de^RSSOZjikk[TVYZYSU]^^aelrtvsvm>.4766?VjdOFB<5015;AFJJECEFF==;5201=AC5,470-,*+-;PD5=0011,6LRIJI=8=B7*-3:6;gxmZ9,;NKjdMKHMG52<]gJ-.9CKTQD<;;97554323333333557788777679ALNMNNH@AJQUUW^aWLLKMVZZ[ZXVXXWVWWY[^^``acgiikmmoooonxuu`:465666665556666666666666666666666666667777678999Iqwx{}~|||}|}~~~~~}|}~|zxtr134444333556889999;>@DINRSRSUWWWWWWZ[N><>=====<=<;;;;;:;;;;;:=N^YSUTGDPWSPQQKDHLEEKKGIV[X\XLQUKABMXUJLMC6BSH<9<@HRRLFCFGHHPgwombPex\EHGFBLbgYYahjlood[JN^WUTPQY[PLJLNRXNJLEDEDJMJGGIKKKQPFKJLTXWXgpu}gSYYPR[fc[`cb^XZdjiosnlgfegggqobbfoywsjlj]YY_bjrXUdZV]_d]HJFCL_rudXbhjporrdajxzyiWTS\ekunpxzwkhjfinlkleQFIJGIKKKKJHHEEIFLTKCD=CHHLZSEFLONSOLSQMIQMNOM]\N[bbligmjbb`Ze^XTIFQW`]bdY_[WZYXZcYYja`bbfd]\TPGIQVRSSRNRKRMBF_XSVMKQLMYZYSUOKiUBH[SYOQb_SXZYXXURRTQOQQ`WTa`WTU]_WW_ZPXXTXTU\XW[_bef^]c`aeghhhhgimjged^aeki|ʻΪunm{rTx}kqdnrЬåʶ̬¾ǖ˟Ƴͷºӫvפ׵֬vuǬdoms\cquss\LMd_yuWw\]suoyjmDap~suVZW\pifZOSevqwezYaneg{}teU|v`blbar\nlB:=JTF?@A;3/*-=A7;<*!&))&%'(,,*'&)+*/24+'+-/10-')/.(+02++-,.,-2/-0+'%#&+/,'&&%$(!#&*/<46:.0/0/949D,'0<2+.,06-(1;?71.-,.00.GTB5/HJC5.:>03744C7"$*+152438@A<0./B4,22,.AC/'*29429HC9>?A90=873:838)33;;>A9CDCFOION5EKSXXMJbZ^jea`^\TKRHN98LlR+1Hig>1BNI>AD>ANQH=72++399741/23=FUiMIRH?ND429BNK4-9=OS@;C8@NX^D3;IT[NFvq-.659@FE?;<:799569<<75>F=::846IWVI720;^_?-7T_YYRD:668884333333333557778877775:CKNMOQI>?HPUUX_`UKKKOVYYZYWUWXWXWXZZ[]``acghfgkllnnos~z{lA36777665555666666666666666666666666666777777771M|vuwxz}~|{{{||||}~{yxuqo555555543557889999;>ADINRRRTUVXXWWWYZN>;=<=<=<<<<;;;;::;;;;:::=JXVTOJIMQRMGCBC>9@KJGFIRSOKHFGIEA?AM[VPJC>Tg^otpfevsYcbglrcPvaPPetraYRf~qz{qt~bHbqyeKUM@AJPRSNC;:91*)**+033+&')++*'''+038;;<<=AC?3*((//2;8+&&**$"+33-'*+,-/11().--.,*'-2-,11+'*+)+,-,,-(#%%$&)+(%&((%/,$(%///)1'+/49>446&(6:1-301C2*,-8<7961-19<@QL8:ED;5:LGD6/<9/34445*%&)*63.1,4=@<-./@*+/1-1?7++-7;89AD88<>B44G?97BH=<9542;543,63;<@@=G@?ELDQ?8OQTXVNQfZbjgb^YYONWKH8DK]\QLRLFR[YHDA9ELDDE?DQWL7BJPRQNNQQONRZadYV_^PKTZVNKKMQ`jfgjg`_ZRFLc|w\zma`K:8A>4?:85247:=;/),/5=@DUiojf_OBGVXIBfthlkVVup][]~eJPgwhbVLGMaricvwuwk__`PTkV?KICTcgikv|fB462.2;ELOPRSF<839KNMH?A2GPH@@FNH<=AE>1.*()*..7??FM9(.+*+,.//0231/,/56336F^~84T;/?Rv{}]C@IJLK?46DPVP=4>JKOJ?XPGN^_8,LC0,/:;44;A@B@:46COJ;3307OKJ[Zoib`VNF=9<@>5212222455578888887776:BHMLNOF=?IQUUY_^QHJLOUXXXWUWXXXYZZYYY[]`acffdejkkmpqs{~wJ2677766655666666666666666666666666666677789964N~yvvvwy|}~}{|||{||{~{y~}|zxwuqnl67777654445889;;::;=AEIMQRRTUUXXWWXZ[O=;=<<<<<<<;;;:::::::;;:8?@?=AMTTRRH@JME@JRK@IcodSMOPTY``^dmdYaebc]UVXU\_]glicYTNGEJMNRQQZdiXOUKQ[UOHCPZVOFDEHIEGU^WNSTU]^emjii^\TQX^ZQQJGNPSV[\^djnrkccdd__pzxxysixwqebtm_uz~mnqiefoquvd}ERXQOUTXnzxxvulgnrmqv{ytt|xlhpjglqskf`Zerh[NHGFEEDDDDEC@AIE@DEJTODBDDEJXTBALVCZOHUVSKTLNTVejimniqrpqrphc_`bde\[T`Y_cZPPMV`ZOUl]l_ecekiggqqi]OSQIKWSXGPQGMDGSIHFEKFKXXWLNNWfTUR]WXT\dZN\_\YXVSTYUSZR\b]fjjdbccZWTYPT^RQZZXWW`\ac^^^_`^bedcdfhjkhd[bhjq̽ĴƪϿ}qßϮ½×Ъv˝ѫε۹ռٻ¸ƿtn~y}jbQf[vNSLUr|zr`ZfZUdozċYsqbwiOOUyxpbRvQ^xx|fljI^`wsPtŒZv{llpyi^aW{ix\mrhRl_b6BdnZiw|ceqjYf]klvgZwWJIcw|\OLg|rwzykuqSMuuD>PEXIRsvLQfi`ywreVZkcEGLHF3=IPPFDC<<:DRPKIKH;-/--45+0+)(''''()+.0467;>=<=BB:2**.,+4;2()*'!!'--*(++,-.-)',/++**++12-/1,('&)+-.-,,+#"%%%(()(''((),.&(%+#*"$%$/05;1*%*+1.50:/+H9--*4BBI>146-41=),-/-16+-23<<>;C98;89?;?I969I@6<6333;44/136:?@AFD;?DDAP/CTTYWRSYi\flfa]VWLQZMA=ORaYTTUKH[aODN>>HNHLF>LSTLADDEEEDCA??@@@@BAABBAA><9>98CGNQPMNSRLJLT`fe`a^VQW]YRNMMM[d[XbcfiklfWPVd^iSDmmZ]aO778roC.++,7:87426=CA4)(+4AKGNahcaeaTORU`^Qa}d`ebY^orfYRfu\Zkoe^VTUTLOXe{sRM]fga]_mrcj_>MKEXdkytmbS;.21.*)2=AA@A?=;;;BIJLH75IGBBBD@?CACD<372,)*/1224HO<&),*+./-**/1.,-.00/.03@yx/8VI0F^}kJEG934:GPJ901BSWQHIUVQTTTVVNK]a5-:?GG87A?BEC>;9:<<>?5)-1:9>OO:-4490'/4:857:=>?>6403?<012113<]|{uUOXLIF@;;CC6212235665568998887777:AHKKLKC:=<<<<<;<;:::::::::::9:?HNLLID>EBAGLJEHV[TJJQ]_X^cUHOMLQZc^RSWS\ii`XTTR^dOGKJJHIMQUTUW[]SSUMKHBLWYZLIPOMKHMQKNTSOLHPX^\OL`h[X[SLHHPSRW_`]]_`clkdhlh^Xajko{tjvwv|mbsql{lNPcjw~{zbisWRUVWTUd}vtruriqwyxv|wu\`kaiknpkfddpyqZEDGFB??@FJECFDHMEBELRWQGDCEJYTCBNYOUOLYVURXTRZ\foopmfhlogelhabYY`[V^KWW^_YZ][[b`Wbjhk^dcgjbaboqhf\VRQLUYTUGRGGGAHC@@DIGKYXULNUafW][^[^_bc_W^][YYXXY\ZY\Y]c_dlkigfd]YUWTT^SM[_YTU_Z^d[[\^`^`cceegijhfdd`i̾˱ȭ­z͡y}οȤ¨ſ֛ոɤ׻Ұ͹ºƨǮնϹ³yx|fhUifs_Z~svYOQVmvOFP]VV\ijwwZp\ajUZST|ox}Oi{Mkrt{{`aF^cv]Vrqykhw`V[_}dumhosQmvfV5Fsl[fcgfg]^XhoqnmkPKDbuSGGilmvlvewdNZ|}l6QKSU?ccKN`\eccd\^g^S[ZC=6FVPTVRND=?<>FUYPO[\XSD49-/952/.4??M?183;>FKMQB95CRJXF62('+.21.+07>?-,1---,,5D@.:6<.-,.-0/(1888<@=A6<998DDAC76BC8681204932,126?@AFK=:BBAGG,NTU[QOY]iZgqd]_XVEV[N@JVY[ZVZPIOfZAMRABBCEDB@?=>>>>>@CDBCCB:9:4DIJONIJRTKEFP\b`]__^\^\TNGCFLTXQUa[^lkkigeaWRDYB:RVLJ]aE67<=8;865440-:F=8>C=6/,++.+(-6::76788:><:CFTeiffhiihb[egYXu}tvcab^]^chli]\hi^URWXW\PKWSIOQOJGDDOYU\jxqalmECPYRX]nufK7,(,./,*.:CD@978;@A?AEIG99D;;?8/6FJ?<464:80+,-0206OVF2,*)+165.--0/,*++-..00Et14JQ;Mk~N+/0-*1ITI3,.6EPQSUYYYYYVRPNJY^/,67>BEPZLE`}u:3:AEIC:5/-/14:;3(*7>77>=634460-589667:><;920-,121221229Y|gB7?A??B<4>E8111356677689998877768=<=>CE>>?>@BBBBDFFP_aZJ<@HOD9>EJNPPJDA<;@BACAEFEJLGGOMKIGJICGHHIIQ]YQUYUVai`UOM[ncMINLILPMQ[\X[^`THFLLIEMUUYPLPMLMJGDHPQHDGIOO\[QT_ldVUPLJMTUVU\_^^__`ekmg`aYSV_dcirfY{ufTdrLb\EZiXTpvj]Qb`QRVccf}rnqurm|~yxwyzrttkikbcgfchookprZHGFKJE<<@ISNDNMIMSIDLRTYSKHEIXXFAMYYOQO\VYX\\UX]kpnmlcahlb]jgadVX\SQ`TZ[^bcmlc\ciaehni`echg_[]hicngYXYSW]UVKLLAGDEJ@8DKEJYXWNP^dcZ`_`\]_ab`_^][YXXZ\]\[\[[_[`hhfccb_[WWVU\SMY_XTUYY[aZWZ]``_adfegjkghcblxɺγɸӽ¸~ŭŴ|j~ƵԱǿէȓұºռɽǯͱӲʤӶå{zbYaJxke_|XN[UTUas`BEYgQOWje~`]^O\[TdZ]rmunM{`u`bsumVHZfo|[h}r|{lw\QVibmv]tzMlinO?Ptb^illjcfVQftdv}eQJAatG?Ij_erydhaw`Hg|Z=\KaGRyxZU\]VRQUYjiOJbX6:DPdXT\a_SG@=>7;WZQMIScU=76=9--+,2444550-,-/.0434>HA>E;-3;5*,54+)--&%%&%'%%')'%()/+'),**23,,2.*&(,0-*))**&%&''''())('+.* !+/&$$%',((+%&./22-*.-9:A1:62007AE8SF6A>CNJ6>EBCK68QUU\IO[_cXks`Y^^S?Z\ODVZZW[YZJG\gGDX?D[UI96=;=BA=ADCA?>=>===ARI68>>7<;>;9675:>9:AC:527;61.07ADA@=:9;BJOMJG?//=JMLB855=PaG40..//06;5++/-,*)'*0369FUbdlsmrwe\db]]^apyvrp}{lfccc_]^agh][daZOJaiXh[IW]LNTOSVG8Ga]hurd^j}xU>Xf=DVK`fX>/30,.221:FHD;738;<:=?===FG>?=34QN>52,948:5421230;[O:82&&+-/0/.-/.)),-+,-2-Bm56;HD@[{A/8:.6LS?).634EQVWWXXXVUSSPM[`0'05?JRb{`6Dtm949<@EC=730--.385039=<>4059?==>==:87678<:961-.0/02222452AbkPAB;<<>EJ?8>6123466787898888768878=CHIHJJ?;ENQSV[^UGGORQTVSTVVUUWXZZYZ[YWY_fiijjikkjkkjn|yuC3786554556666666666666666666666666666779<3B||xvvvuuxxyz{z{}~|zxwvwwxz{|{zz{}~|{yxy{{zz|}{xyxvxyvsqnjh;<<;<;99:;=??@BA@@ACFHILPQQQRTWXWXXZZRC<<<;;<;;;;::::99999:9997>HJA>@>=CC?BBBCBAA=@@8Iej]M=FRSH??DMMPK>5:IEAFDDC>VhU\|sq``av]FxzuRH[SdEo|{u\__RKHHLejL>_c:9\ZaYcgioiWNG>??S]]e_C4C@-,.1=6-)-5612462/,+++,-.-+189=;+#094-.1.*)(&&%&%%##''%')*0+')**+2/+13.**,3.)(&())''((('&'))(&()%"" #$%(+&*,//-/3-,100:AC4D<3013@LDX@1;?E<30BC5:3DP@LD35;698./30:7JJ+,,)-,,.5A6':>6,+./-.,;C:08?8@:;>19JC7=A6:=::2217233.--148<>HSE4@GCID-HLTV[CS\a^XnoZS\gMB[]QFacXU[YPEPgT;BePCDCDcSCNUIB?=8=>=<<;<>?@BCDD>>HCDHGFHOG;;HUWOLX\Z]afhcYMLW\XPOVPJWjhcjliquib]mlMRjx`KC79:58@@8>=?><89;:76B?A@A>;;=AJMMIFC@=BJIKE=<=?CE=5.258/-6=<655.)**))/49;8AKQqmot][ga_]Wi{zwnoxjihcekb]]ad_UYdcWKKcmPboscYTLTV[hcGLkjpod\_p|v^Nip;6TJOci]JL?--;;149;::7::755:@>25EHDFHM_a>0.-6?46;AA4121.>R;099=;<;6.+),..+-..,+.2/FpY5<<>?>AWuT.=B14KM1$1<8/9MSTVWSOPW^XPQag:(/5>CGVfZ?RvQ==;98;:876/298:?:9;;3.38=8337964467665540,.35201322102@E7;?999>IWU<24224466887998888668879=CGFFIF<?==<=>@ABBBDCAADFIKLPQQQPRVXWWVWYUF:;<99::;;::9:99999999989>=:>AC?=C>:AJMBCHEA@ALC-(02EA>0/;>;9/04AD7JJ+-.(.,-.2>/$8?4)+..-(4@A8.:;8=9@:3JH6:H?5:981*0;821.-1.27:=ALV<1HHFK<2MGRV[?V\bZYsmWOdlEH[[THlgXTZWHHab=@PhO?C>NjOHWSC==OVLX[PILH<<@J>=>@A@>==>=<;:::=?ACDC>BGBCGDFMH97EQULEOZYW]bilcWT\ZSKMQSQYhi_`hfgnmijnomZNM\rZCGA8669A?9A>?>?::=:57;CD<=EKLA5:GD=>??=;<>=DB>@BELMHJKIFAAH=36>7-399326:=@D>/'+3/(-8CB:=>Cs|hokWbj]YXZdighhinrtmd_hncZ\be[SW]VLFGNGKZekMUNJNQmpdlqkb^W`z{hOUqsT;N_U_mqldM/,??2/0388:@=6347?H>48=@GUfjJ/.20ADDEHC89DLNQUZ[OCCKPOMMORUTTVVXZ[[]^\XY]_bgklnnkkmoonw]75756656665666665555555566566666776668967e~}ywxxwuwyyxxxy{||zxussttwxyzzz|}zutrsv{|{}}z|}yz}~{yxwusssrpnlii?>?A@>>@@@AABDDEEBAEHIKMORRPOQVVWWUTYWH;9<:::9::::999999998789;<;9>BGHBA?EILQKKNGAH`dTY`E8?KLGFDEJQG?BACCDD@HXWLBCFHJFM_\MIIGCGNNORTUSPSOO\a\]hh`VLOOYbfldXOME@BLTNLKIGHOROHEGLHIIKNPTPJBDKOU\YX\YNHAHQOLLRXVOM\^\_aefjjda``_[Zgupg`^cg`dwtrqn_gkghd\l~lUNUTHQdaU`z}x}oylehifc`gkemmtvmpuunpwtjiiiopkbVNNRRRRSSKLZVVWSYYVY`]b`^b[TVWZb_WIUaS[YY[X^cfdhknje[]_T`\ZVVY`aU]caekhhhdbqole^b_]_gjbZQYYQLRQ_Sc\P^\\QQYU_OIUUJDEE6@MKJRX]e]Z`\Z[`]c[X[`^Z_U[Z\\^UQWVX[[QPUV^_``_a_^^XXXWUTX^WUVXWRSZ]UTZ_``bdgimlhiϩȽſù̻ùϿǵĹuαkjf}Ҿ³ΞتӽȭӹΡçzwz}Zhvq{]KS^\q~l]tW>hvkbZT`|taN_|ea__]_pvQrq`hbUQTs{hpd`vjqWINGgcMh`fx\\|uVOtZkux\hWQZYereXqQL^lpyz}pSI^wZtT?A[uiLTfYCDoTcik}_JrcA^SWI]`otw]@:9BFOaI0DZPLYYKXqulnxlTPPHBEEX^NQ^P>KJ?8*&282,122.%"##$&&&')*+))*'%*8?1%'.32/,*()'&%%&%&'''((,1+'(((,,.363.++1.*((()**())**('++++***'$$!"$%&%&$%*.21,++&*227=:24NI:39?EI+%1/5:<02//<-"29+674'&44.22016A7@I1/2*.-2/,;.&9>3,,,,,0>=<6079;7QUUTVLQWK=AERHB?@B@<<==;:9987=?@AAB@CBADDCHE98DPNIAHUXQU\afaWV]YNGKPPPZggaaa]]cd`dklmi\TOQZPEIHC?=>A?=CC?@A;9::9:8?DEDFFE?>CID>===;:;=>@A@?@EMKGIIEFDHK909B:/3::;;:89@ID2&,>:-0=FHEE?Etmae_[nlUPQQRSZdd_irsnSUnp_W[ad[RVXSNKICBNSLW_PWQHIG]y~ztsi^_W^oo`9Hnxa@:YZU]aekV1-@A3/29<:?GB7574=QR9/2.4JdP.#1>=EB;>8;>8@J9)+.31,+:G7*.>==FLG=99:;99858<8<<;:99972()/1,,1793,-..0348=;5/.670.5@ED:2577;EH=30113568998888877775667<@CCEGHC89CIMRUVULDDHLLLNQSTSSVWWY[\^a`^\ZZ^flmllkkmopou|n=486556666666666555555566666666677667;61Q}{}}|xwxwxyz{{zzzz{{{{xwwywtxzzz{}~~{z{~~|ysrw||z{|zwv}~~{ywsssrqomjjji@@ACB@>?@BCCCFGGGDCEHIJKNTUQNQVVVWUUXVH;9<;::99:::9899999988777858BB@D@==HSRTRPK@8?AA@=BA@@=CLNTYJCDEEDGLMQTTUXYXQMRYTR]^fnjkZ\haYSQMKHJMONLIGGFIPSPJIKKGHTYOQVRMFGS^[TW]ZTSMGKNLMJHQRMIPVX]copkjjh]XVVU^qsfcimf^`egijjdR^pkdpqv}`NQQIISWKciWYlfb[W]b`_cdlyuvvfmrojisumknpv}|lVQPQRQOOPMMK^[OVQW[ZX[\cb]^TRX[[^^]KRdSZWY^X\`ddghifd[Y]S[VZVRZdbWbgcegcfkcbmnlbY`b^[aa\WLUQMIPQWQePO`ZYOMRQ_OGNZKB@@9HMILTXae\WZXVX`YdZTY`[W_TXX\afZPTTU[YQTWW]_ca_a__b[YZUWXY]VVWYZWX\aXSYaehhiihnkfh˽Żÿξҫ°ѫ±wdkqČŝθٸºʸŬϹӮũlrk|\vlrySPOahk\`oM[sVMonUur_czUVegf\dvoeWsh`omTC\xhlp`mo_wVLGPhRPrsRl{hZmXiQwQhxtV^WKSTZogYnJPWrp~kf`VczRpPZN5=[PGVYUR]fjr{hSQRME=34519NP:6IKD3(+7:,'-1,'$#!""%%%(((,-++&#$2;4)%+0/--.,'%$&')()()(&.3*'('(**.551.,-/,*)))*++)**,,)).-,-.-,(%$""&((&%%&,,-+*()&)248=./3KG;5DCHY;278732//..-%&5E:'GK^RCAD>@9;C?988889<>>>?@CCACCBDC:9DOL@;?NTPOW[][VY]]RMKIHISafa`b_[\YTY`cjpk^UPMPQNMKIGFFFFDJMHBE=99:<95:CEGHB>?BEHDCFC@<7:?ECIPMFGKKLLFCEKNB53>A:1386;=;759@@2(3BA?ADGGFJBFh[QQU^kcTRRQPT]bZZeZ[o\TkhWTZ^bZQ\jfVMPUPUYOEPYVPOMNZkpx|wh[`^_`h\,:YkRC9GPNMHKcY1.HI5/6?ABCEB86:9>QUE<3)AL=,+4BNKFBHUKDGG=9FRPe`,(20B_bRA5DI:20(+=E9AQQM93;68CD6+(/)-19@1(,9?6*0>CQVUUMGBNWT[gH,)2CD;7423.@fH4::=BFLH;555648837;7=@A@@B@9734=C;/07;4/...0249>>93010($0CMK=7766563-.1013679::8888777775667=ADCCDGKKJGDEHIJLOVXSOPTVWWUUWWJ:9::::99::9998899999777648CPMDILC<@FNZULEFFFU^]][YL>DD=MYXNE@=?PUQOE>9?DB?>GW[C:FIJMI>@JCAIHJNQPNNRX][[^XPQTZhmngTU_UIGIJMROJMIKNMMOORTRMMNJFKacOPYOFGHN[^VVXMMaj\OLOXWLHKHACKU_fgll^[b\QV^\]hkiikrk`bimqrpnxxg^gtqcSPUSV`Y]mn}mSdccca]XX]ZVaqpdepiaqvjksxwjinusloVSRVYUEFIEJP\[VWQTWYYWW^]XYQSXZZZYZQN`SSUWYRYY]`bbb``^Z[VZTc`Vaid^ji^de`foddpsg[T]ec\YWWSHQONMNPQT\NP\WUTRQPUPDIXJDHG?EJFLTX_c\WXWVYb[eYT]b\Z]VTTZ`ebX[ZW^\V[]X\]_^_a][f^bbY]^\aYZ\```cdd\X[chlmnkjpompƨyŻ¿Ыÿ|ği}y͔ʶĿƶӢźʫʮӺ·ĭhrb~cyrd{wZOX]^qznTglfqBJrb[tqbej|RMbmpp`\kofg_`]qvM?mmfgfze\|qWKETYHTfxpZl{UZxQ]uZywQkymSa]FMMRvjZbFQV~r}vtih_cxQvM9B^nYd`jLN@ouMjln_Sh`IKBGROFYs_P9P<@>GZEEU^a\WY^[`goyu`TQOLIFA60//>D6->SKA0)2<5+**))'%" ##$&'&&./.*%!#/85+',//.0.(&%'),,*)*)(15,**(**+/4530./,*-,,+,++))*,,,,--220/-)&%$#)*)&&)(,-*(((+),1448-57>>433..31352)&,9JM-47("&#$+#629<-K>/9.5/:3*2/+:=01-+0;M=8A1.42.393*39BF0,"0?-/56;DKKB5[QKF:9GHEGYHJNXaUcbgKYF9WS^[^n]KPC<\iX9R[cUASD\i_c[TP<5HVZPFHR[R>=HRaOCI@7D7AJC<<::;:BEFFEBDB<>GLH>69DMMLSUTTW_cbXNGDDGPWYYZ\^a\TSY^ahusi_YTMOMOOMLKLNQMKMSMHEC??<;:;=@=CKFADEHJFJWQFA<>JOGLYWLKMTb[HFMSJ737?:711614666434755DGCHJIIIGI?@SE?DNR[\\[WSNQZYTXP1<;50123668998888877776568:>AAEJIA:CGABGHS`NCIDFPJ>=HIDGDFMPOLNRUXY\[OPPFGGN\XOLNLKLIJZbNKUNKSWVTTUSOKLMMJOaaOTWFAFFEJRURI@KhsgSINXZSHED?@FPbgc`]\^aZXY]`afje_eom_`svywrpxtythhgeheVXgji^RU`eguMamfc`^XWYXXhul]\]X]lmhu~tf`d^gwdcg]RTVaZGJGKN[YV\VSTUVVXXWVUWMSZWXWWUTKWRNOUSLUTW[`_^^^^ZWWVSkk\ghbdni]de^eqfhrscYQZde\SSUNFOQNSJOPXQSOWRTaYYXPUDOVIJOIB@CHSUUZ\ZX\ZS]e]h^[dda^^ZWY`ccd`a^[`a^_^VYZ[[]`XVhbhldhhehdcehgdimi`]`dhjknnkqu˶ÁľƷðһù˶²õʭsxo{u֟ѬƿҷڵʾЪ̸¸˘pwfcqexpcO_^`klmZ{olsJ;`pRUZWKNZor`WkqloVNchlo[OU{oZKh\}Taw~U^x`UPLQJDSfs}wba{qDXxPQ}btxUtwbQedECEXf\VIPnlwrksj\`vY}F8AbeWj_mGbKtztLgePRYYCB:QOFBekTIAV@DW\ZUT[wiVV]^bnxx~ubWSPNLKKGB?:679;AJJE::01;620'''&%#!"""$&'&#'/-+*(%&.340-/211/,))*+.0-,.+(2800.,-+-1253210*+110//,)*---.00.24,-2/*)'&(+)'%'((,-*'(*,-..101.:415/FS:?>A;0,(.41880+.35AV80E7#--#*'"7:0?1HG44.>576002,:=.3/+5EE7;5-38BB@?-1C71:2+-462268G=0/&?;,326?HGF:A[SKD<>ETEE[FMGYaU_^bFay@>YQb_eiZFJHJINQNOT\`fcM@EYjeF-369;>ADGINIF`b=2N?-1526>A@>8110,@Y\N;?L>;PYOGHE=./INLKHA:D_af}4'08KMd}vaJ:>93>?5=9.3B?B\`A.4A@<9-0./+(@P:1/0+.99('FbW:'*BX]TGPgaE:58754430143/:86B?;@D@<=>=;<=DKD7;A4,/230.,,,.498751/.2:?ACD@>>>>@HQR@00235788899888777665578:=@FJG?=DNRPNPSNC@FJIIIKPRQRSUWYY[]_aa_`eeacimoqsqnqssvp<475566666666665545555555577677888846b~|{{{{{yxx|~||zxzyvtvyyurrpqx}~zuy}}~{{}}~{{z{yxwutwwuvxxwvttt@@>AFC>@FGDDFHLLLKGEFIKLNRUURNPUXXUTW[Q>678:;;>ACDCBCD@@ABBCCCGZ^HISIAA@@;8AEB=;L\ZWLBIRRMOWYHE\_UVZUICBCFC@>DEB@A>j]`QGYvkt\lyjP]vdkB9@e^Uk[oLpPsitMgm?SUW>9AQCAMf`HBFb@\ibZZ_ssVT_ejt{sdYUTQONNMKIGB>:8FQ\V=37429/-8+)''&%%$#$$%&&''*++,+)'(-2411562/.,,-/120040)182330.+-1212353,-34210-*-12013238/(/4/,+)*.-)'&&&(--+)*,--/1110/8//5-EN1?J<680.11:B926:55:TN>@=+49()*++<(@5@I=2,@>;:4/718>,73,7D85:)2<@A=>5/BD520,,14557:E<)559F023/:EEAA9L^PEEA>KY>O^FLC\\UW^^Det=GXPhcgh[KA<]lUL[XUXMbSVe_RWZZ>8AN^RGGJRRA:FV]OFNG=JHIGGROFEGB=AJG@?BCC@AEFEFG@626;AGEGMJIOSX_aRA?AFONGKX_bhia\abZZafifjng[SLHBCE@=@JH>AAKLEBEHMIJKLLMQQQSRPQSQOPPPQTNGJLTH7>LMLZkja^]T<-7<=0*01..///04;DC808FOKA@IOI86;9(/>DBEIB=DNXcbWXT75DOinf\QU[_YR\bXT^jlc_d_[gzwZOLJP[dqr\E55:?QbL605@AB>?EJMUUVcfH=P7'/0+09>@=:663%2gcLKDHRY\XJAKULBBCA>;87:YfgZ%+<<3MqrP:3+1CA7A=-3C?@UcM7:;89<3)./13BJ@721+.61%)GaL0)+;U[PIAUjMJ6046885214;?I>5674349@F@BC@A?;?FGCBDGGB>=KQB772+,/30.,,,.5::934554235:@@>?AA>BNSA00225788899888777664578:>BEEC??GRTOOTXPAAIJIJKJJNRRSUWWXZ]_bcacgga`glnrvvsswvyN56556667766666555455555665776788985V}{{||||{wwy|}}}}~~}yzzzzwuvvuuutv{|zwvx{~yy{}|yux{{zyyxxwwyyyz{zxxwut>>?CFC>?EGDDFJLLLJHGGHKLNRUVSNPVXWUTUZUE<<=@BCEHKNNJKKGGHIHIKJFSWJEJHDA=>=@B=;;CJQULB?GSPMUTKM\_LIRRHHIEBCCAABB?><=;7>DCDA@CEAAKKPWRQTKMVU[hW@GT^^\WWUKLUTKIHCCKNGAT^PKEBECCDEJNORSVRPWPU]SXSKKJLJFGFBM]Z\aZjyY7G^OELKLSVX[^d]U_c[\becbfkcXX\VS_lonkbxq`j\WZY\[X^\PNe~zniegpriceggituniklnoia`bdku{rnf`bd]WY_TX\^^_^ch`_UZVW^PQRRSQQWQNNVSLTY[[PQOIHBOINGELJGM[_`\[VMMSQ`i^Y\WYcie^fkbisjknpgfRXb_ZYYUSMJLGTDUTURTNRXlgcejndScZ_^SFRLO[`WSUUWX_\Pacbid`fbf`gihhpsijoidfklji_W][ZZ]aVXhfjqpllmkkkjjiddkjecdbcdgknu~Ƹóá͵´εϛźɻv|zq|q͑iؚ[̞{ÝĹϸϲɪҹɨĺǻ~vjmU~l`b^tejuZlNNPGSamt^RLhrtzc_u_KOdgepiNSdpxrIQdW\obKXNozTGIBCR`mPhtoaPcaI`u[vbhLVb_G:UjX=-/22'%21*(&&%'%#$%%%%'+*++,--+*-0123551.,*+-020//551252120,),10..0483,3420//./24423664-2841-+,.10+)(&'*-,,*,/--1756653048.;@0[T9=C;<;=JMBBF9/:;GUQ;;43@6'((7,8:8@@1+RX:XdGPF[]SS]ZEdn>PUPme[j[S:BscQTfOU[ZeVdZQL[ZT=>DW\GHJONE@IGA??==<@FDFFB9246C;79@?:9;IH;=?EGDJJJINWWRRQONQRRQOMMMMJEERK83?GM]iie]WM5)3>A1)9<1872-17>GME4+0?MMGHLJ<;C:-3AFAGM=5DUae\TYVHK_innkf[Y_`TMTUNQ]dliaa``jiNLOR`lo{xK26;7?N?.159=DMPKKPUZaigQKO9-10-29@@/4fy]\XWWXZVD;M]ad^[^TH?:8d8*B=8X[;3-(5F@:AC53ANPWbQ:HI96J[;*4@HF?L<3/+,/))1>A2-,.0KXOF>BO@;6836;;70?]PA@9420379=?<9>?=>=:=BHIILPOI@5>PN;1/-,040,,-/16:;72311.**/5<@A?AHDCIG6/1125689999888777663478;?BDC>;@IOQPQTVPCCHJIIJJILPQSUWWXZ]_bedeec^_ejotxyyyyww}a96767667766655554445556667777889:4Gzwy{{yxywtwwyyyz|}}|}}|yyzywwyxvuuvxxwwwvwxwtuyyx|~{xz|~~~~||~~}}}}|{}}~{wy|zyyyyz{|}}{zzyxxvts@?@BCB>=BCDFHJLKKKKJHIJJMRUVSOOTXXVSTYWLEDEHJJKKNRSMKLKKJHFGILLNMD<@HLA?E@<9=GC?ET`P@AIPPVVMDT\HKNA=;>DCA??@ABA=<;AB?HJDC@?DD@EH@K`\SRNW_\dcNIMGQY[_WJHGNVMHIJIFEBFY^TLA?BCDBEJMRXXSPSTON[d^VPKJOMFGHFL^eghjtpV?@Z_RQQRRPSXZ[SPYWQZ`]\bgh_YXX_a_bklhhi_SV[[\_dib^f`S`{~dQ]mliifdcfv{rdkpvxrnkdbgnwuqmg``a][YYWWY[_[Xbkde[XVW]WUROXTNTPLLQUQPUYZQMMJC;EIMDAHE@GX^XSVPKOSZadVTXUW_e`]fkgltjlpqlnXWb^Y[]WWPFHIPC\VSXRPU`pa`aioa\^[_`^XXV[^\WUVVVV_^Sbaehi`a_e_hhgkqplklhghhgif_[^]\\]aa`gffknggieefffgddghfee^_dihpͿƿѿ̸ūһˮĭƲº{oyx̔޿cչɵ̦ӮҪӽȸwqskXq_bflfs_]gXHQ@SdiriQSi{o~[rkoelXDj]^p]Ghk~iIWhaWiaOMVwDTO;DOU{tNtcfE`WJju[rjdLQ]YE9BkdbLGltgule~gCXq`q|dK5@^JPif[rj\^glQkpCg]S6?Q9<`VdQW`tL\hZZ_pc_npq}xspplaZ\]\[YVTSQQQOLKA:IF@LYW?-.,(%'02-*('&&&""$&&'(+,-,-/1/-///0343.*)'(+144/,17;961//0*&(.0+'*/86,220.-0211452483.1;:42-+0132++***,----/1,24A7.=925=<15=:J5:>/+8AAA521757,<6-/.46456<@10/4LG19;0)3><:9F?#)=8AE2@9.6;;6=2BcZ==HL=XV:_jJRIX`RP]XEbfA[RQpdUk\]7Q{UOc^KY]ac[^QBS_UID@J_LBJLMHA?MSPLKGWHEKOGDXVIQOMFA@IIC?@=<=BFBFDDA=85=@:2Ifmpnd^ae`iyfROVYclYV]@8;<8;AD70235E\bSKOPUdnbRLI@>8/049;?;>CFE38c{n_[OIGA727>ITcaULERWKC[\0CGOlrJ0.++18=EGF@:AU]^aS;L^J=[f1@IFPGVL5,,,,-:G:(&),,+BTTH6.10/:NB3>@ABFHJLLKKLKIHHHLPTVTOOTXXWUTXXPJKKJJJKKJNPHDILJFACJLJJKHMPA;CHWM668=DFFJ[eR?FVUOTQIJ[YHYR?DE<;?AA=<;>FIGC@AA?@CB@AC@ESUOT`g^ZcYHHHFNMHHC@?CNQKHKOD>HLS]]VI@BFIJHGGINX]ZVUSRQT\YRPNKKKIHHGOZckoqrk]NFGT`]WWXUTUVWUUVVWXXV_ijnmk_Ufoiqvga^[Zbmnkmjc^WU]hfWZknr|uaZ`ullgxzohhfcehlmsnkga][[YXTTTW[WSZl`faXWUYZZYUY[XTPLNLKRQUURQOLLC=;IMF?E?@BVVPOSLKST`YhVSYNV]_Z]dkiksihmlpo]V][Y\^Y]P?FLIH^TR\QRXeg[^]ifV`TYX^aaYV][XVWWRUX_^Vaafef^\[^\d`_dnjeeecfhbaeca__^^]^aedeffbkcae^`bcdecdeegec\]badwϷζпƻ̹¬÷μͤ{ɷ·xv|twyԫՅâЧԽͤ׸ε˱ʯ̽Ű;uwjmd{_`_djkTgZKILHa`RVQG^^Yg`MldouyoXDRWbaGN{zueFZn\PmkJDdaDkS6EL]g^|Z[y^YcNUgizhjelKFZ[F7Kyd`\CKnxkew{is|dEWiZit^S1@V>Uj]T[c`neQp}|dPjbR8MJ/Uahf^frYImiZbf`U_qvuoec_\ZXZ\\[ZYYWUTRQPMJC:F[cL=GJD;,#%+21/-,+*)*)'&((()+,-.//01/011/132-)))),2893-.49;91,,-)$$*-+&&,31-/1/,+.54113355/-16620-+2332,+-.-,-./001+7;F/&A>5>GB42@6+@E@GE<0&0D=.)&*4*@559.'3=BA343732.60./-22456<7,.2@H>>C>/+?I=?D?(*CB7D6:D4-876582MeJ<EF?EFGHF=8997=DC>@KKLSW``\YODGLRVWZ]^^_[Yboi_]bcbmqd]YJ9332477987C:6=@AABDIOJIOMHJOLKMOOLJLOQPQROJIR\ZTRQQKC?AFJC>LMDIJD@>>?AGKPOF@EOPMMLJHHNQUUOKIIMRUWNEIY[LQc]Zipmjd_^VKLE++\|zsnfcccaWSUUW]chkZH?<;=BF?=9:CKQV>3Y\NFIw|EDKLZaXF2(&(*'0@IJKKKOV\_UBI_YHWPIXE@JbU3)***3EH<7=<83.<;<>>AGOUUQJ>750,-.,*+/-,+.;FA;9500008?>88;>HQLNYM=2.1013677998877677554568;>@@CE96BJLLLPTRKJMJFFDCGKMMOSTV[]]\^aef`][Y^dejqsty}|xv{}m<3757788766777665455655667778;94Hlrputtspmjjnossrqpprssqooonmnnmnrrpnppoooqqsuvusqrqrwywwwwwvvxxzzzyy{{}|}~|{|~}}{yzyvyzz}}|zyy{}~}|{{}{ywwAAABB?<=@@AEHJMMLLLKIHFHLORVTPORUWVTTXXOHIIFEHIFDKLDDJLJHCEMPKIJAO[E?FM]R539;;<=K_]F=JTQKGJJLYXUWKBEE>>><>ABA@>@EJPQNUc_NNYSJCAIMC=?<;BKLLIIMMDEQTX]ZPC=?DGGGGIKNS[^YTRUVNJPQNNMIHIGGIMPXemool`UWWTX[XVVTTUUVYTRSUX[^f_Yinke`gpvijodZ^gnice`RIKUYYaghp~~uaYegVfns{vb]bjjfabikoikh`]]YWXSQQSWSNSd_e_ZYTRTZc]Y]a\VMKPFGONHMKIFIF@?IKM>?@CEWTURXOLZT][g_]XHP]^Z_dgegrgcfgoraUVUV[_Z`O;HLEOYQU`QR[`_Y\[haSVLRWZ[^WQYWTWZ[TV[]\\]^b`_\XWZX`^[_jhbacbbg`\bacca```acdcdghagd]aa_^]_`add_edb_]bljnɼǽɮѶ{ԺϴͣĶɧùưľũ{}~uyrjyǴɟyzڛȭ׽³ŸκǸ͵̷upx~}]ZZXabca`XN^fqi\UR_mJIrpK[_er|}bA@xlf_DEpq_m[?\{paTsk?Aq}UPxT5FVoigiP`l^qhZ`WT~m`[vtPAV_MF<444:;B<5?=EPA8>:;@3+?F62/'1-=6100*-8A@65441011)&))-023862//3BAERK8*9LD@DB.'>9@9-.56443;WX8@:LYEaH4qjPYLWdMGYMJi^JeS[hMZl\_RvTAn[GUZ[mXOD6NlPPVFG]NZRTA=RWTJLYXS]BGSRLMUWPURVSHGAIHGAC?ELNNQ]haUF;CRY\WPQUX]__bfbYUW[amtlad\IC92//46;:8>64<>E?DBCCBAELEELHAELJGKPPLGLSTQOQUVSRSQOOOOMJLKIIHFNLDEFEDAFGHNLLPROMPPOONLKOSRSTROMKOUQMF?GTUHAP\cospmh`XMGLC2N|xjeeecb[POV]ckpnh[KE=69<@CFHC=:66EOARhffedtxMCIKW_\SH<4,&'.;=DSFIIFDCBA>62577989;=?>89AKVYWNA:751-++-/0.+,/;DB:75..359:82228GTOMWH42/0013666888777766543568>AACIF:?@CFJMMLLKKIHFFKORTTROOSXURTXXNCBEDCFHEDKLGHNOMLLKIDGHC>CJGLMCJJ:5:CB@7=]aB8@CIHBQUOV[^YOGEC=;>A?>EHGA=EUREC@CEAAA@@?=?GRXVU\[QMVeeRDJOONIB=>HLECFINRTXYZXQKIF>@FFEEHNOLNTUQOOPPKHLNNOQQNJHIJJJLNRZacc^Z^]TPRSSRPQTX[YYYYY^^b^Z`^]`dgjoxybkqf`hpsnmyoOCHPX[_dgm~x][Y[_^TZimrsbbftrfccccecca\ZXUSTRPNPQSMK^\`[\^XRSSY[YY^`\REHOCCBHMNG==DDAGDKA?HKQ^Ya]b[U`RW^ead\LM]``bccafoedebhqfYTSOU]W^Q>PPGWUT[aQT\Z[\[Yg\TPFT[VVZSOUXXY^bc][]]\\[^\\ZVUZY_a]]hia_eb]c_Zabfebbbacefcdijeeb[\`\[ZZ]`ef_efggig}оúĿШẕѺĸӬ̺οɴžzhknhn{~~~xwtrɬɰ`tիӱβƧʖϽ˾νïwzwdh|TO_OUgcQwjVwlrnZXiqaDPnVKeimlbtnY&+*+,+*****))*++)(***-.///..0002332.++,,+-31+(&&'),+'&$"" !#&%"%('*&&(+)%-31+(,/-*((-1//-)/123-*.200.1223346@9',CJCDGEDCA999IGB>::6:BBIJG;>IOMF:5B@.7A76;'-284.*1-)2;>:212795($)+)+113;:94/4=BNQD..FI>C<6,6C<9@:><,(-14655EZC2B6P\NaB6uiT\LUfKEXGOmYNhXaaJ\m]choFJmRJ\S_gHE8GX^ZK@DLUXY]a`ZRNQ]hmlklmo[JKB:2267=;6<54;BFDIIJIGDFHCEJEBFKHGHJIHGMQPNKKORQNMMNNNMMNMMOMHHNKBAEEDCLLLPMMOOMNSRNMNNPSSSQSTSQQTTMJKINSRMBBTdlolie`YNBFDBY_\nwlfghe]YXX[`jtjUOSNKE@?A;A\ll[GNL=:BGJLMWkX534433.+.0.+9C?BViigjkT55:>AGIHD?72B]cXX^zMDIPZeknquti[A.8GSbhe`WOTSEOml__l^9++6MS?D0,*'6MZaehibJ@UZLC5-.*4lU20E}RdeFJLJHGA74<<98638?A>:79CPYWJ;8544/+08<;2-,/28:752*-69520222:CAFOQ>.0/000255777766655664359=?CDHKC:BLLJMPTVPFCHFCEDAEKMNQUVX[^^__acd]\\]_ccdhjqy{{{y|ykB6::=@CBA@BB>;;;:85466667668;4;drlmoprqmf```behhjmnnmmjiihhghiklkkkjijjjjjkmmllnomnqqppqqssuuuvvuuutuuuwyzzyyyywwyxwyz{{|}{{{{{{{{{zxusuvx|}}|{{|~~{A@AB?;8:=?ACFJLLLKLKIHFEIORSTSNNSWUSRVXOB@DFEGJJINNKNQPQONPKC=<>@;9?AA9@F@?>DDCA:MbZH>>IPP`[MSVQNUKJJ=9?C@>MXSGDQYMDFAHWWH=@A@DLSTNJMONJGLZZLHOQRQLEBFLLC>CHLNSVUVTIBMTMLIEFFGKIFIJHIKNOLMMLNPQSTQMKLMLNNJIMOPPRRSUOHKRSQNLQ\a\]\YVZWYZTUUX\^cdaf~upzlnpjjrvv~xwmPEKWac``duqVOY]_ZUZijrvc`ish`fjmjjd\ZZVQOPSPNLMNPMH[Z^X]b`UURPPPQTVURMBKH@=IHOL=9>>@LDFJOUV_eakilgdfVU[]ZeaZU^`cggccimdfhcdlja\XNQ[W\VGWXP[U\_\PV^YZ[[WeXWTM\\V]]XW[_`^^goeZ^][Z]^^^\XW]\`fb^hja^ebZ_]Zaciiedccfihgikjlfa\\^\\]]]cjkbfkpmp}ʪ̹ηƿĪӰƨü̚ưǾƽǽt¹oS`~r[Zchefovzzz}{uvus–^^ҽxӺȲαſʣͼ̷{|{y~[]|SI_V\]Ykait[eVFgrbLBQXS[hq`ZdeSRL\^`tCJusjiPNXELWaYo~H6VpR[p6B]t}l_Nle_NSsgbMCop_[vmWHPjdJi[LUBAju\W{zx_h{hPR\TISfv3=NXk=IohmYjdLEg|Te[e_u_`PTMoVbcOinl\DG_cfmRPRRQQPPSUVWVUVY\^XSSOKJHTlycWU9LSQD%$+-..+))))(%%%'))*+++,///.012234540*+++(')(%$##$$##""" !!!"""#%&$#'*(#'0/)%&))(&&*,++)&**-/+'*.+2+0332129@7-.BKKACEGLG7GH@BD=L]TD7:<-6H;0:-(1=1)(4/*09=80,0>;60=KA:3-,6AD<2/44>I@=>/2:BB88@=<1$%&*5VYNEJLOOROSVQIICIIIDGBDFMEAHBBFCDGEA?@<=FMNGESZQKFHRXRMGHQWTQTZ]XSPP\ih^^cdomUKRMG@??;A91A95>FJHRiZCB>511,')+*(3<=FXbabc_I368.$;\O2.+((0Yn3(Ws<;=EORA458@D9138;=8/-16::8654@GVTC>AGF@CC@EILSRMI@BLMKHDDIJEFKKKKKS`d\QJGDGOMFFGEBCFMSRNMNPPQSQNNMNQONRTROKHHGGGIJIMOPPKIS`f`VXY^`ZYTIPTR\_aa`aehpywrompttur``]UV_hc[acejaUXacZ]kpnpiabilgeghgcgh[WXSLJNTOKKKKLLEUWZUZ_iYVVPLLJMKNKQNEHFIHKHOCBA?FVNIW^_]ihfmopjmnd^[[\ecc^`_bjmedmicijgilkiicXV]][ZW[\W^W]_VNX^YXWXWaV[]Zd]]jgcdcbaa`fpg\`_\\`acd`ZX_^bhfehga^daY^^\cdgihgfgjmkikkirmgdcdehhfejqogll{»īзŷŸ̲ɯѽſ{ie^RdO>P^MJRW`kgqx|wqrmmzxšiZiͺyʯͽʹǻҺ}z~tzo\\z]Q[\_Z]prcjT`daspcQO_W[bd^djhUG_cuyViaG[dYc^PLDAOWSYosf:XOFL,-1,5*#)()**)&&''(*+++.//.124544550*&&&$# !"!!"#! ! ! !#"#$#!#&&$#+,'#"$'&&$&&&&$"&#''%#$%#*'*,--./>A;23BIRDEDFNI4HeP:@PUPD=44249DPE8GSKA<:.9TH435'*<8()=6'.:;2.+)37IF=;3-9B>;9:>=6$ %1:>?CAI5>:2T[S_4F_IF]I7IXZKSK@WqUDWe\daGQ^PJMJKIQRQUXNGHDJJJEGCGMOEBF@@ECBCDEC?=BIKGAGRNKKIKKJIIHHMKJLPVVW[^aebZX\]ckaRZ_ZQONKHI?8F@7=HKHACHJJIFCBEGIJHFFGDBBCDFGDBCDEFEFIHGF?CJNGGLHFEEDBBCCCBDILKJNQMHIMNMNNOQOMKKRTQPRRMKMSTSQRTTTTUWWTVX]g[>+cT?``XIJE;2488452,0:???>;<@G<7?EGA658::<94158;;86>NWU?6:?==JOLGOa[8.0-//135555555445567546;?BBFJD8;CGHMRVWTJA>@@@AABDHKMOTZ[[\_aceghb_]W[\[cjnu||zwvvzwxmefkeZXXVVWWWOINQKGLMF@:55567899977Uodbfhjnlc][^abbbbbcfffedeeca^\\[YYYY[[[[Z[[]behheghiklkkopmnnllmlllkkmopprrqqstqooprutsssttvwxxwwx{||||{zxwussuvvxz||{{{|~CCDDA;8:>@@ADFHHIJLKJHDBELNOSTOMPTUSRRTSMHIKLKKKJIIIOWSKJHFCBCGGCA>999899?SfXFGJNJBKdj_YV[_ODOZ[`]_d`HAECAIY`^``ULNUXQQ[ab\QMOMICBFE@@FDGNEBPNHLOPPHEJIGGHGHKGCEGGHSce\PFDFIT^WNIEA@ADKVYOKOPPRSPNNLLPNKLSUPIGFDCCFIJMNLKIIPU[[\[ZeheaYNOSRY^aa]dov|zwtpnqrqu}}smle`bcccaiiZ`g]]]]\^djnaPTbfijhhfa_fh^TVQGEMTNFFGIIKCOSVVVVl]Y\MEJJMKLDLRJAHVQQOMJOSQ\`WSaed_idhklidmrnjedciedba_^fpfdlealjilllkomebb`Y]c_YY^WX]UNV[WVUTV_X\cahafqkjle]^abdlf\cb_`ddehb\[__cjgfeda^daZ_^^eddfiijjmqolkkksrpnnpmtvsmptokjhuʠԵwŤξ˵bVNPPDq}]MF8G}VE>@K^ljlwvut~{{qgfyoĭxX{yкuү̽ϵۼƑ̾Ͽ{s~|mxk\mvc^b_iZ\gk[N_~dp||{jW_l^V_dDmykZXspzhbeGU\GW`YQ@;?PP[dcxrB0DTL@;24LPB8>(*4?0*FE%);:*'.,&3@F9*@=684.4:75=A>=>/ #0:<=>9CB:A51XWS]?Ixe^dQ^cGOXO]iaUqYf[P_YY_aNJVfQGd[\F8?YM>QL.>Z\ORUBNiZFTe\ihXM^QOQXIEGRSQVXKFFFKILGICHURIDCA?CBAABDGD@EHD=?HJEFJIJLMMHBBCBDHLOS]fhe`XTX[]aa]_gdWSRQPNPMEGB:;DGF<=AFFECABBEKKHGGGEDCBACFEEDDEC??AAAA>AFF=>EA@??A@@ABA?CGKKIMPNKLKILMKJJJJJGNOMLMNKILPPNJJKJKMMNPRSUZ^TBBPXZapvz~feknqvwvyo>3F^cI844CUWZ]^TMLIA=Jlh@/6@;276+)'&4Vruqnjebb\L96;@FJJJIHGFAAWji@05[n]TXcuwzpN/#&*'3DFEFNX_bepxponejvw:'-4523Xc<,.1FTV`mkN;>5)4I?*)(&;pN/A@6Smo}xYHE73:73/+,.17<;99868<;@MQG409DKMIC?;958988>ILB4189:EPQQVZbmK+1..0024455443444467548<@ABFI@8=BGIMRVWRG@@@?>@AAEIKMOTXYYY\\_dfd][ZUVYZbjot|xqlihk{zqnmkjldaaa\YZZXWWVTQPOMKLRURME>;;=>>==<;?Wi`]^^_`_\XVY[[YYYZ]`aa`aa`_[YXVUUUTTSTUUWWWY\^acbdeefhiijkjjihiihhhhhiijmomklnnlkloqqppponopqqrrruyxvxzyyyyywvwwvvxz{{|||}}BCDDC<8:>>>?BDEGHJKJJHEBCIMNRTPKMSTSRRTTOKKLKGHIHIKKMbrV@DCCDDCCBA?:7779?CEVbUC=HLC=CKMKLQPLJR\efba^ODDGIEFT]WVVLLPPSQNQV[WMGJGABKNGBBEGNQEGSMDEEKRPNJJLHFIJJIHHIKOW^YOHBAEN\\WYOCFHIJNWXOJMOOPPOMKGEHIEFLNIFDBBBDGIJLNNJFKQHU\YWV`bb_[PMRRTT_bbq~~{vtnhiouupnhglidmohgdjmglpiijhfbail\Uahhotomgc]cb_SOQIDKTOGDEJKH?JOTSQOiY[[KDNPUTNFKPSCLZZZ[XS[bdli]\ffd_gcghfb^grnnolhmhffc\W`rfdg\_miikkljlljhc`]]b^[X[UW\WNQTTUWP[`\_gbhckqggkcY]_aejc[a`^`dedda^]_`cfbaa`^]c`^``afeehkjjijnolklmrsrpqrqturoprnhgqyٵԻkǷ̠ĽzSMQMKB`bMBHS_iY`THQ_m~yommmurtv}}yr}|ochssOx׎zĮɶuͻÓ̝ſľϿovuip`ienrocm[XjaGV}Yb]s|`]`]VSo^:qunh{gfrqMBfPH_RVK9=AW_Z]hyT2@P\t}M`~pehaWQ[TLeS?_mcT{jb\i~STpk||WC>?6(3+'%! "$%%&)+-/00./243/+**%#"    !! !! !"! !#" !!!! ! !  !! !"$,,677@CIFIDCINGS@8890CE?;58G30743EGBDA;8216119AC@>9+"$+68;==:>>@A63WUS[@Mte_fTa^JRXR_geWsYdVQYRV]\VRY_JKjS_A?QKEHHLLKJDB@;>BFLOT\fd`]XSUY[]]_cgdYRLKMMKKIDB;:7;?>>>?9;FGHMLMPPOQMHJJKJGDEGBLLIHHHIJLLKGEGGBEJIHHMPQU\PLNONOLPriTbt|o>F[]O;106KWLKJ:6978=VmYD93:6+.2-+(-Khpkc_bbdeN?CA@AFLOPONPOFMnwU:BF@-]eEgecvzZ;($%(8C@@GS]eq|}zlhp{8',2421VtD/5+1EVe|zI0.'%AV4*-8RsT1,(-bsJH;77411-+.03652124468AID=@GDCKTZTIFB7117:@I>4:8ALLNPHFQWUVC,0....02244333444432248??ACFF<9>BGJMRUVQE???==??AEHKMORUXYYYZ]aba\YXTVXX]bflsohcbaalpfca`_cc`^\]YUQOORUWXZ]]^_dgfd_YWUSSSRONNNQWYVUVUUUVUTUUUVVVTTUVXXXXVXWTSSQRRQPQPNNPPOQSTW\]\^_^\_`^_aa_^```ceeeffeegikjikjhfhknponmkiikmmnnmqqonpsstutx{wwxyutxxxyy{}~BBCEC=8:==;:>ACDFIJJIGDBCEJNQSPLMPSSRSTRNLJIGDFHHGFFJbz_ACDEFCBBBABEA98:::=CNK@CGFA><=GMKD@CBBLRPUVJ=AHHKKCELIGKJRTONGDILHFFABCBBDJJBBDIOMGEGGEBCGKOOJP^UEIKEGJJLNPPOQQMJIJOSPOXWOORTQPVVPJJNNLKKKHC@?CB@CDDBBA?ADHJIKNNNLMSKPXPRSWYW[]RKQROT_dlmnvzvogkt|uc[Z_ijhjllkhijkuzqklnokkga^`gijlmjhef[Z^aSISJBHTPIACJLG:BKSQNM_U[ZIGRX][SLR]]NT\`egeahejnl]afdb]c^`b`^XbmlnnnjokgidZQ^thecS^nhjjjkjgage^cb][]`WVV\\YMQPTUZXgdbehahekjbei]X]Z_eh_[_]]aeheb````acd_^_^\]b```bdfhjkmkkihjnllmorttqqrqrqppqokhl՟Ƙmĵӭw}ęfLOSROEWneX@A_hwdg}wbZdt}zg`bi|{xwsy{q}|nx~OtםdzhȻУͳ̷¼ŹovpqqiarRwfj`Z_S_oZIF\{h[b[RXdwIEruuqpWbj@]iHWWCQC6:MmiO_kgF2Fdtlxm[gpnYo^^IRU_rf@O]l]b`]txRXlwvVC\|mnujcTvlsUIKAIba><_ZA;dXRiLKN1Pj=KXaog]ldd?DdQRNPiTVm{hSQNMNNNMPSW[]`]UTTUSPTWTQTWVQKHDCDB@>?5:8'5**(%""#"""$%&''(+-/01/-.01.(#$#"!       ! ! #"*,19>AAEFJOQTN<=<9DKF?=?FC>?C95OL;;HG=768@AJ>>0.AA&5:CG2861=G=EE965354/:A;;<@7-()0589>>;;?@B:=VTSYAQpeahVaYTTZXadlXqY_TOYLTR[\[YZDWf\VBSG8=P?3P\PX_LD`l^WUSUigYTZPO\^R@DMPTRVSGFAFOHLGFCN_PMIIGFD@>?DIGBDB>:;@A<@FFHLMKFFF?8;AELPT\a_\[XSSW[]_bdee_XNBCMHHHBB=<<=D:59B>>?@@>@BCADIEFEFIKJJMOLHD>FA99::9AA@;<@<637=><<;6:FEGMJKRPORMFFIJJHCBC@KJDECDGJKKGBCIF?DIHGGJNORXOUTNLFHKfreWSbuw{]HVVG?42:LYP<1*)).:D]aEFOH>71/11/-.9CC?L`c_eZ:5GJDCGMNPQPMICJhQ6331+H~2Qvks_<'+>B=>FNXhnmsrsxxust8',0211Gc>$,++9Rd^RM;++**<]H,-QR*-/WEAGD>85642.,-/45212334567/0FXXOHJVZOII>307==?:ASDLTQKHB@GN@/+..//--/1133233344422039=>@CFD9:@BGKMRUVQD>>>><=?@CIMOPPRW]_\[]^^^\YWSVWVX]_aeec__^\cg^]][UZYWXXZ]\]bcgjlkklnrtvxzzxsqqqqnkjjhdbaa_\]_adddddcdddda\[[[ZZXWWWYYXXWUVVTTRQTQRQNOSUUTUUTUVURRSTSTTTVXYYYYZ\]__bddcaacdfkmlkjihggjkjjjjjkklmllnnnppppromoooprx}AABED=9999878;?@CFFGGEBABCGKOQPNLNRRQRTSPLGECCDFG?7BUbfXFEGHE><@BCFON?88:<>@=@EJLE??DGJH@>@?@HHECBA>@DCCEIMLC?BECBCDFIKMVigPFGEEHIJKKGHQSPPOMLLKMUXSRUVSRSSPJGKMJGEEFC??A@>>@A@?AACFJJJLNQQOQTNOTSQQVWUY]SKPRPVadhddousompvzsbUU]fhghehkgee`fyyg`ilmmc\__\aijghhceZV\`]KPMAGSQKDDKME8>IPNJLTPZ\JEX[a`_OUb^SY`ejkniebjjeZ_d`_[]RZZ]UV`biqgjhnk_fd^Q[ulehQVmgjhhlfcZa^Yed\X]aXS^`[\OYS[[_fkfihd`feigabfZ\^UZef][][\`efc__a__`bb]]^\Z]a_cacfgkmmmkihfhmlklostsqqqpppoopqmuۯ̝yuxƿƑqrv˵bNPYVOEFpVSDCZpm{}bsvgn{^[^pxzzuz|{z|è\fήttƿʹЊǸ·qyjyjhfoXie`XNhfpT?:m^ae_ZaodENdax{k\NmZOkTJSDCM>5AdoUXc_T>9Olp\pdO\fm]wmeT>V`i{qBH]{|pxce_qnV\gup\Kc{kmzqgTslwUJCSNhxiA>_TBUkHmfIJU;`[=S^jhoklbT_VQIAMmpRbxcSPOOMMNOQTX[]_[URSSROTWUSUWVSLJFFGIE@@.,7(9+%()&&&%&')*+****+++-//---*&" !       !! !"(-5=@@CKQSSF;;99?B:9:<<=;BI<0@RG@DJ@6799=J?C6/>A,7T.)30607/(,1)7?=B98<5@F0099AF@@J27G?;236AC;8=AC5*.36:@?=:=@;@9CURSXBRhfXjT^W[]`b`\qVpYWLMWLOGW\[TXGbb\EQX99JF0@SMZ_I>VoiUMORajWBIb[R_^NBHNPSPWRFF?FPHLG@CP_OOKJLOD?<>ELGCDDA==><=AABFIKIGHH>8;AELOSZZVVXYSRVY\addcddWN=AKFFFA?<=::B93:A<>@?>==>?>BGBEGHJKIINPKJEBJC99:99A====>;628=<:99;??@HGFFKNIIHCCGEHIBBC@JIAEEDGKLKIDDIFBDHFFFILOPLJPTNLPQVQ?9ES^lpy{||cDRV^k]HOOC>6@DRdytonnorv}}8'/4688<@4*)*)1Wtc@,&+),.8TO/5kuQ1,3^|fPEFCA?;63/--/2564565430-*-DaaM;6:@DINQRTVRF@@BEBCCCEJORRRSZac^\__]^\YWUUVVU_b]]^]]YWVUZZYXVRTQMV[afosow~}xvwutuw|}{|~{utwwsorutomqtwxyzxvvvvvtppqonqqnmnppomkmppjikjecd`WVYWW[_abdea_]][[\[[ZWUSRSRRRSUYZZZ\]_```bbcdddcceffffghhhiijjkjihjjifihgkkkorw|~~~@@AB@<;96544458CGD;8AIC?BB@@>:8::8AOPJMNNQPUXOHHGEGEBDILLIELIADEECEHGDDFFECDDDFGMV]_VIEFDBEHGGHIMPNOQNJJLMPSQMNRRPONNICGIGDA@CDAAC@<;==<=CHKLLJKMNSTQTURPSRPPVVVY[SNQSU\dacimfjmbfqskgkibYZ^bccb[^ke]]\\dn`Yeghfa^a_Y_gfabdc\\V[`fVLSJHRQLGEJLD8=GMJGHKK[`NNc_ihm\`g]]fjjlhka\]gf^T\]]^^YNVVXPRZ\cp_^]hhY`daV^xpdfUQidigggc\V\ZS_a]V[_YXd^\_Wa]dcglhcjfe[becea^b\^]OUdd[ZZZ\_cca^b_\]\aa\Z]^V_daecgikmkmmlkkihllklnqsrppqqqqqrrvȦwxxw̹יkykt~ʲXJVjaLC>s|TMEA`uluzu`{{wfffdju{|xzyvƋvNzʱeǷŗɾᢲy{zfo{khei{[j^\TYZnc>AMC:PfVI_bWC=HOcabgNGaoldi`Z:>h_mrJUi|ftmflani[^dpwm[kxfl~lVqts~WLInUmql?=aQOqRRO,!'+)(('()**,,*+++**+,00+'%$!    !&289;ALRI>;8793+*19=<:64T:*/953I@:74;AB;9=GD4)0;=:CN?;=?7383>QOSZDR^_PmS]ZZ]edbZnXlXQHPPSIDQ]VNUOf[GLRS?IH>AJEVdM?OidTEGT`cT@@RvbU\WPFNRPPPYRGD;@FLGCFGD@@<::9>ADJMRWOKPZ[URTVX[]]^ab^U@AHDDD@>@<;=>>==@>AEHHIHHHLLJIGOOE=<;?=<;59>;988:B=@C=CICEFAJIAGJGGKMOMJJMIHGGFFGHLPOCDKOMPSQVVQQRUX[]eff]ovEGOPTVLGIE;4BKMSVPA9::BLPUTJBELJFEFE??=:BHBBUY^eV7+?PGMHGIJF=506>:H^PD6588;nw*'O~}u`]fikaD85?F?@;@BBDFGC<:EeqC-+*++-F@8421//28><::852.*&'A_V;/:DEACOVYWJ?@@?EUcWLKE>CE;8//..020-./000/0355355469:9:9><94123225:>ACCDDCCCBCHKPQNKKORSSTTRT`pbE?=9;?OWTSJFHC?@A??BC@>>><978::9<=>B@98A?;9::;AHLNNMJLNOSUSVUQQQQONWUUYZTSZ]XX\]`kn^UUPZmtbU[aa```___^YW`b\]^^XXZ_hfbdgegd_dhdXVacV]ZY`gaNUWKQRNIFGLC8:EIEDCGI[eX]qfqn{ollggmkhfghYX_hdXP_Z[ZaWLTSPKQUX_k]TQ]aV_fjabwoedXL`_ihgbaVOXWOY[]VU[U^dY^_`dcdeke\`e^eY^e]daY_\ZYNUbc[Z[\[]a`^]d]XZY__^_`_^afdgeknpmimnnnnkhkmklnorpppppqqrtsȽƾŲxpvyϖ~ȱ|xkehsŲVE_wfTL8TXKHCa|{uy|jxxywiWrpqyuxfcbˢIсʷr·ɞиٿſ¾|q|ihs|idbny`hQNOlzdp\;G[]Slh^RjpXK8@\j\VLUdNTI7BA;8;[JCRRFK^^E7NHMbdcTMXpbk_P]E.Mv\nw\gwzc{qfakivxgbaflw|ei`ksbsi}_N[bml==;29E@6433>CC=--747?;>917<6M<+,:31=/-,.;FC:4./>CA7/.4CEFLHFME823:DC<8=D@30:<;?EB@?@@<.4518MHS\LPTTQrQ]ZWZeb`WmXjWKAULVFGMZJOSSbLCQLUNQIGLDLaTCLZUICJX]`U;9TmedR]UNHRUPMOYNJB8GOBNO?@U^ONLNHQG==::=;?DIIGEFGJIHHITNIJFCDIG>AAE;=A8;?999:;A<=CA?=AGA@@9=:06EAKSQEBC3AH2InZ,*9>84>7AJBA-.-///020--/10-,.4776668:::<==BLJAGPNMOQUSMQ\_WSPW\YXY[\\\]^___`^\^_^\YZ]^]]\]cg`[ZZUPQQPXSIMO\inx~xuvwz~~ywtuy{~}|~|yyyxz~~|zy|}~~}}{xvvvwyzz||z}~|~~|zz~}voqy}}}}||{xwuustvwwwx{|}~}vrmgdb`_]YWUVWVVUSRRTVXYYZ]`cffdcb`^^`bdefhiijlllllmnnoqtspo;;:<>=9620220157:<>ABDDDCAAEILMLJKNOQUTRQVaw}]B>=@LQOOLDAB@<=BADF=888;@?::@?<>>:9:?GKKHB?><=EE:9>@DEEILLKIGECBA@AA<`o\c{zoo}aprhZlv{uklggelfb^h{twflOg~nk>;_iqhOhP3`co;MtV]mj~oSmGolOghyhcxpW[SONOPQSVVXVRNJKNQONQUTSUVVSQOQUUUQKIC40B5##''*-----++*+../0222.'%&# !-9==@;2-.146:=967?@2'0<=5..:??B8,///0069139;:1-02<24+0.8JIA<507<4A4*4CD>CGCCC8818>D>:=@>6=KC:>A?AED?6/19578HGV\MGJNTsQ[YZWc^`UiZeOI@VN[AHPS?SP[\CRLQ[TOYEHH[YGELKHHLTVXS<8TYmeXV\TOIVUOJOXJJA8ELAMR>>U]OMMMEOH=>KMJHFJFABDEB;;;:>ACDGLPLHFDDHFCDHMOMMUZXTSSTUX_jia]PJFFFI@?E:;C>:=><>;6;ACA==@AGILJHGIGGFEEFNGQUNMLLJHMJOABB6?A:>FA=;>C>>>58<:=A=AC@HECJKE?BEJJLQRNPNMMMKLNPOLIIJNOONPQSTQOMLMNLLKS\YYWUTSQNMPQMMNJGCDECDFFEFJONJFIJFFJJFCEGHINPC?W_H,&*3JTHRUG;<>?5-)9I@ITI?B5Q2%5HeG6HFHKJCCB@DAIQA7NxttrziA5?@@CS\NN\fibPRH7=94.,/1.,330Dl}q?16346Dr[96=;7631/-.6@@<868844653>FEA@>53:FOV]TF>ACDEIMRVVTTTROPSXUOU_c[VQXZTWWWZ\[ZYYYYZ\_`^^^^cc`beeceje][^VPVVQSQP_pvvvzywvtw{||zvvtux|~~wx{}~~}{yzzzyzzxyyx|{{~}zz}~yvvxvomtzxxz||||xrqrropuvvvvvxz{||}}yvqllmmlkhgecbb`_\YWYZZYVTTUXZZZXWWX[^bccbcefhiihhghjjkmonki;;;;;96310000123579=>@DDCA?@FHHJJJJLPSTSPRYjvNDDHGFRLC@?BCEHD=JQF?EMA@@=:58==9A>BGA<;?@@CHFDFD@CEA?AB@;>OP9:SVKHILIFEEFEBA??@@@ACGKHEEEFILMJGFGGFFHIIIIIGGIKKKKHJNJLOOQOHIHEE?;8;FD>?=55>CGJIIGFGHILKPVRRRPORRONVQNVWPNTSIKWYUVVRPTZ\\[TNT`dddc\WUVVTUZ]bc\ZXZ]_][kteagbX\`[WbgbU`ig`^UPggRXRNICID@BKIDGR^altnugrkwtutnfjkilllilvn`SO`WTIUKAT_PKa_celbSS_elssroelppq^TRT`hk`\UPRPOVV`\U^Vbh\c[mfa_ghWP[jX^YY_[_aVXWR]^\[_``___ad\]bgdddbdefghhhikklmnookgjklnnlkihgfjmmkjlooonj˷ĴrjtrwƒjppbǵƬyVG[obZ_|nVMUgXjtttottfoquqyĬjh|dͿѿڝƪÜzuoyazp`hi`gs{td}jF;Msx{otkA9[yp^NUXcpG8AAIprlDBWGMUliPXOZ`K=CDDI?3KYFNnnexa\NorDIHBY\b]XpysmyVeriav{|rrvohZdbabdt~ds[rwm<=`ujXTS>9|qpfAa~\vahwXHWoVnr`m|}s[XPNOPRSTTTUSOKIJNPNLOSRSWVTRORWWYYVPIG;-9%!$&$&))+-//0/-...012/*# !!  %-1141/.-0662010-5BG6*4B@53:DD>;8/**,./21.2=1*363C4/,41?L@7:31:@=A21AC<9=<89?625>GB<:;<>BJC:?@;=BB=401=;997DRZYJGFJbqNWY`Wa]^Ue^`HGDRS^BKWH;ZN^SLPLU^LSQJJSZK?>???AEIQK4?U]OMLMDOH<>LOKIFKFDDGHGCB>;>BCDFPTPMH?@D?=DEEFKS[\XUTUWZ]behid\WLLNMBBG;:@>?B?=<;?FIIHGJHHQSOKHHJIEHG@EDBSUOLKKMNQNQGHC9;@CGFHHIKLMMMOOOPONLKJOSONMLMPONLIHEFFGRVSTUUTTSNILNJKJHGFD@?@@ABDKMIEFLLHIKHC@ADGJJNLLQD2+)129LEM[QB@?;('%(<>9<@@:2Sk,.5=Pqb586:GI>;55<>DJMPVvyrmkmm`XA6?FILRT<:YlWMAAJD=..75664BE@88ln>4NeYMWi[D?@=>AFJH>;64210..6?=:<@EIFHK@4:CFB:;>@CFKPVSTMELMNOICA?<:42412/049;58AIKFAACCCFHJKOWZWW\_]]`^XUSRTVWUW[]VKHTXPSRQTWTRRPQTY]ab`^^affabhhecijaY^YSWURZjw~wtwwvxxww{{xvwyyz}~yy}~~}xx{{{zzzxwxz}}|yy|~zwwvrorwwuuwyzz{zwwxwvwz~ymimqtvx{{{yuttuwwxxwwtrqppnjilllmjfc__]\[XVVUUWYZZ[]^`bcddgijlklnpmkj<;;;9764100/000014679=ADFC?@DEFIIIGGKQUTKFM_wtRGEDJQ_L;?AEGJOPLQWTHK]R98A@849<;;=EF9:UU;9BGLKB;?E@:=?=;>?=CGB?CC@DIFDGB8?NKEDEHHFDFHEEEDDC?>>>>==>AFIHDBABFIIIHFFFFHHHHHIIIIJKJJJIJKJMNMMIGJJHGD?>AED@A=49DIIIHGEDFFHMNOUPNQRQSSRQOJMTSNJMLDIYYNPQPRUZUTWWVV[ef`]^^WSUUW]`c_YZXVX]XVmqZYokRP[_]]ef]^mmcZVNfd[ZUTNEHGKLOHPY^jnqtrwajfkgmsk`hopqpnpt}pcYQYQOGQKBSgZRfhinwi[[imsvsrmednqsf\TT^hmca[ZXXSZ\faZddhmbcWgcc_bi\I[k\ZVY]^a^U[WTab\]]__^]^agbaehkkfddegffeedhhiiikljillmonkhghijlnnnnoqsroyȺzptlq̰scv{a̴[Lc}uvc}^ID]jTyomt{rp|›yvŬ{ijʽφӭʲtxvmqZyq^c}jlkqppfdENNhun_@MURefm^iUXVHMRGC@9N`JGZymrr``dzXAKI\dRb`[svpjrH]nks}|zmtwtgTe`ap`hgwpzpACh|YK[O8L{_qfTjz_TaZqo8r~jkjffyuo|{_TOOQRUVVURQONMKJJKKLNTUTWZWUTUUVYYXTLI@+-"(''&%&&(+./110...../)#!! "$')-20-020*)..+-3ELFBBA@;;CHB7796,+1/0/(+:2-A;@<32055>@73?52=LI96E@46:::98199FDC@:66D<=D<.5;@EJ;>55F`[SPQBLphOR[kU\]cVaf\A?ITYSILR:@]KYGYDP_NISCNNUM<887;AFNWWIGX^U^^ZaUQQQNSSXEGVPACDCJCJP?AU[PMKMDOF;@OQLJGKFEINMHGHCA@CDA?BMRVWURQTWXXZ\_dfcXHOSLFFG>=@=?FC>=@GLOMJOSLMX[RGHJKICGG=C;67757@:885=?88:8579LZ?/2/,2YIca4%(,??56546@KQWYS]ijiihiaS[H>BKXYUSJ=IeW=15HMA04EEB>DZYPB4[}d<1PnQMFCD>;=CJPKA?<;;;978JOGIV_b[UUWURTWZ\]`cebbdd_^aa[WZWOQVTQTTGCRWNPQRRPPRPMLO[`aba\Z]_^[]egaZag^T]]TSUf||sty{~|{|}wsuz}}~~}y{}|{|}|yzzxy{zxz|}~{yz|~~}zzzyvy}}{yxxvvwwz~~|||zzrkr{}zxxvtuyz{|}zurpnlkhfb_]\[XXXZZ[[[\_aeghikmligg<;;:9974100/..-.02468;?CFFDCCCEGGGEEFIPUI?@I]cQD?GOXhT;?DDB@BOYSRSJKZV96?AD95=?::?@=HaY?;?@CC??FKB45:;<<>><<>BEFFCAABFHHIIHGGHIJJKJJLMMMMLJIIIHILLMJBEIGFDDDEDCDEGDBHMNKHFDBDEDFNPOTOLRPPSSRPLEHMNOIHKFIZ[NOORTW^TR]a^]]`_[[^bZRSQV\]^YW[TRUZSSkiM[yt[QZa`[ce`_kuhYVLf^f``]YTQIRUTNdobkxuqqs]c]bahqj\fspomhnr|mfe\[SUPVVT^oh_jikq{nbammnmmmd`\fnljaSUbjofhbbcb_egid_hnllhf[hff[^icO_h_\X[`ge_\]_^aa]^]`aa`aeinhfinnfcfghga^]\^__bdgnpoonuurnkmnprtsqrttrsy̼úxpmʴ{]auwþkfuwz}urFGnxfyzy~~lkr~vtzstxƾĪs|~jǺ֠ϴʵsxvkg\}u]`{rtjmikg]J=MzuxhlF<~d_WIG_TQEUfdX^D:LS`cggl]LQITaPWWfd\qbfy{tlpBXjj}zthnoxjT_}aa}\as||wQMjwQGhX=_m^ii[o|cIRTP9Mkf_ichrio^PPQSTXZYUPLKNPMIFINQPTZ]ei`YYXTUWVTQLIB0*%**++**((),.//0211-)(&  #&-2-,0.+'(,..**4BJLC89=7:EE@03A7(0744-(398FBI.8:-6653067@<4,5NMMD67226@?9??;<<98815?:8918>6364248=><:?@BFFDLNKJJJJKLJKLLKKJGGFEDCA??ABEFKLIHHQUTSOKMOGJLGIGGHEFFHJIGJPPMNLLKDB@?>==DIKFBFFDJJHHJGJMGEGA;A@;@>CJQSQJNLCE=41+Aqq3(DE/-;FG?DEEJQTZ]\XW[abcdb[YaVNSZ\]][[USbcK;>ANG8;A<9>BDMZRA??>@?@GONA668:<=BGCPSBELF>>DGGDDLRJBBFIECEIHEGFBBCA>=>@>=@FFEEDABEGIJKKJJIIJLLNOONNPPOKJKKJHIJJLJACGDCBDDEC@DKKKPOMNJECBABBBCILNSLNSNORTSQNHFIQUKFOHH^]MOOVXY_WX`b][a_ZYYVSVUPNTXW[ZVXRPWZPSl^E`xsi`_`bX[e^^izn[ULf^knmhec[M]fe`sflzunmo}[_T[_iigZcnkkhcikvlirkd`jfdijlrrgjjhoyjcbfefdbd]XS_oijcLYflolljjkigklidckonkkibkkg]`jf`gkeaa`hoifd`gfcaababeeeefgpihhmlebilnlcZYZY[]chjuysts}zxusutvzzxvwyytsѶv}į``gz±pqzwnYfpx}tuwxq}phvwo{n{wxrzwȷԭw}wke^|[]yyxmjcef}yZL;S~puxdtKDbfYNS_LXIKsZJQ<:LSOYjhdgGGEOk[<.Ma]YHIYbtcVOddlpeEUi[fqqxYoxzn|i?Vhc{}wqedfzsQVzdiwWbz~cV`r[Ht\Acbeh[cvm>@YL]l7hh[W_fZZiht}x|WOPRSUY[XSOLKNPOKJOUWUXbink`ZWWSTUSONMKE8)&,*+-,-+*+-/112231,$"""'))+,+*''---,,.039;5.016@CC;2;H2)?87>..C@8<7.-:_WO:-4.,07>BEFGDB9.+@TTRKA98G6@doMQ\a<[weOChvQU^iZ[kT<9WRVPUN:CVWICJSXW?FTOIMM?1028LYSOLGLWYSTSSXSJPJUFGLK^JKUU@FK=GHGMAETXGCII@M?7CWPKMNHAHQVPEDDFHD@BFFFHGFD?:?>;:=B7BAH@KKB>JIMOPRPOROFJIGINMNQRPIFGE?>?>?=56=?;9.3<4.11026:::<<@DCHHGDBKOQROJKNGIKGIGEEFEDCDEDGJGILIHIEDFE@@9>BJIEEGIKNKQWPNPMLMNOSPOPKPTWWXWV\]XSNG?=;:952000/-++-/13689;>@BDFDA@ACBDHF@?FNG424ARJ+7LHjkB9CFECAABBBCCEHFEB>?EPO@@GHIMIDDBCGGHMPK@:99;=;@JAEK@GKC>?ABDGJHFFECEFDDFHIIJKHGGCBBA@>>BGGDGHEBCFGILMKJJIKNMPTUQNOROKMQMNMJKILLCEGCEDDCCA@EHFHMHEGDA@???@A@EHMSLNVPIQRRQPIDN[VIIN?Ne[NOT\ZZ_]`aa_\agYVYMFN[ZRVZY`[SURRXWJ[mNIhmgjg\[`XWea_i{s_VNhcnytmlnbZjvtsvlhrrikjwY[MTWe]dT]jiifbgktnnxsiitvorsrpvgjifnxhaa[]\\^]^XSbrlkfQejlnpnnnpkfjjifgloiijedijgdgjhinligchpriifbggfghifegghgefpgihklefmqqogcbbadgosrz}wxuyxyzxwwxzyy{}˿ʹ|̾ɶo}zu}|{`|y|zrw{~ypmssoxxpxko}smw}zes~r|swɽ֘ձ{wje_Z_|zvk\^e|zoYL:[isuitIQ_jZRd[RWQ_wTISGIL?@[`WiWBC6HC8HH6.371=G3+0=1:G;KL9A5.2@Z`M5(-/,-16<@@BA@2*3DPQQNA42:J?KliJPai<`qdL?kvNQ_jZ[hJJUE?6:?99149302214689=?>>BEBDKE@EGD>AGHHJKICH<;>?A@><<;<@?ABFFEIMPPNJHIFGIHG@=AC?=;=?BDAAHIFFEFEHKHG=BECCFHEBCCCFMOMLKHKONQVVSONQOJPTMSQIMKNNIMIELHCCAAGDAABA??@@=====>?BGJPSIJPOHKNLUUIJV]WHNJ:Ug]PP\a[^eadbceeik_]]WOScjdcdhk^ZXOTYTKda@Kh^amjZT[]]llkp}g\aomwyuponhflqrxssaimgjhsUXINR`W_NYjffcbimxuuxrlhnuoononqhhhdjwiaa\XYZhbfe_krnmi`pojjpmjmqkdhiiihllfhhggjiegjkhjmlljciqoffebdfjlmkhgfgjhdgommlopmlrtusroonoqsy{x|zvur~yvvuuuvsvy}Ϲxʿjhr|}qhzyrldkhgwro{itsms}xr^t}tw{{svž¦۶ǩtkae[czz{iUVdxuk]O?czdqnokJbanWUmZ[Yqz_HWYFQF;E]U\hRFSgk`nWMNWgxe_hcPwrrqnbJQgXmtpla]Vn|PVlxtaio|qzqntmVizNyeEec^Kh_vw/5ai`nUHxjNMY]TUltgfioxzhRPTVUTRQQPOONOORTUX^]^a_TJGHFCACFIJJHHGJC,&,*&'()*,.12453.*%#!&/6;;;9223348==3,581,)->C;HG?I8-96:B;BC7H?QPD33A89E5*.??BEIJNOMMNLHGFGKOQSST[]YWY\RPTQIDJLBAGFDBBABJHC>=MTC=@;7=C77?BC?<BACCEEBEIB@CEC=@EFGKMJDJ?:>===;:86:959;BDDILNLLJFDEGHGE?:@?89:EEEDBEDGLMKGEFLJA?DFGOSTYXUMJJIHJMKJIKNQSTTURPQSPPVXV[[QTTSSSQXZWXW[\XZ\[[XST\ZQX]VUWQKRZYLFNRSMHOQRTOORUWZ^^[Y^ZTTUW\\YWZZ[\[ZTX_\\ZUYa[WXWZ]]_XU[[WXRPZ][^`WWWYXVTQXVQSUVY\\X[[]^]ZVX`e_URTSRQRUTPNNMLS^dceaYYZ[_b_[\___]]ZY`d^Y^ec^`ba`_]aec^`^UTXZY[[WVTUZWZOLXKJFMWc]RTZVEOjxzy{xuvy}~|zw~zzz|}}}~{zwqov}ytw|zz~~~|z|}z{}~|zyvqkf^ZY>=<820.-++---.12367888:<<=@A@<9;=>@B?=ADIM\TFD).GMUTKGFHJIGFFGHGGKNLIHEEIJHGIJJJHHIIJIHHHHJKKLLIFB<9:<<63?=6:<@A?>?>=@BBBBBDFGIGFJMMMPRPNNMKJKHB=@EDBABBBBAAFNQPQNGJOOQUVSOOQOEIRINSJJKMNMQMJQPICBFKE=?@BC;79/2DQ92>PR>=BJPQSV;+&(/-++-/2;@CJWWYWLDFF?64@RG@OUfWDRi`CdcgD=hjOTbiY`dD?[RMN`M-8ORI9Mr^;MPKM]W<2/8LXOETfmkaXQGEQaj[itj`JGFE[U[UMTHHCJFDFFEHTS>6@QI@47MRFNVL=JX_MEECHP]]HGKRIAFGEA=A<=<>??BEEHLNNPQMEBBDGHJKOTXWUV]`UVYTLINKCCDCA@@>@EC>9:NPC?=86=:47A>9AB9<@?@ABBCEECBHIACEEA;AECCIOJELA<@=::9866;3/89==AHKJIIIEBDEEAAA=>=68:?A?<;;=AE>=CBEJIHHHIJJDEJOOPOQUWUKLIHMMNNJKMOPRSQOMLLLKMSVQRZTKJILNIMONSSRUVY[[[[SNSUMNRQQPHFPVSIELLKF?IPMLKKLMMOW^_XWWWWWY\]XW\YXZYWTX[TUSOV]VQQQTX[^TQWYUWTPY\W\_UTSSRTRPSMKMONNPTUWUX]\XRPYa]RQTROMKMOLGJRTW^a_`^Z[YVZ\XVXXZ[[XRT^`VS_c[Y^^[[[\`a_]_\UY_b_^]\\[^c__USeSNLPZf^STTQ[x|}ywxyxwwy|}}||z~ztwx{|~~~}}~tquxxtwzwy}}~~~zyz}~{|}~~~xqida`==:50/--++--,/12478998:<==>AD?99:<@?;;@EONkrA8?@==CEFIJJIGGJMMOPPPNONLLLJHFGJKGECDFGCCINOQVSIJOMORTQNNPNEFOHFRMCEHKMONLNUPDEKJC=ACE@6;@BIJJJKV]ZSSaaSPVMJIJMDHTYYTTYJLhi`_fhacmkjlhiimvshiiloqpmrztpjrxXMVRO[WDQilw~qlt~}|zxmlggmhtv^\ehlcqTWILU_TVNakgjiipqy{{sjjfemmmebhbbgfffqwmpwtuvvurssqmllkoligdihfgffdihilhkkhfigcefddghffehkiggffedccfjlkjikpssstuv{xxyyxvwy|{zyzz|~|sjmnuroompvuwwzŽŨƲ~tlzf~~epnak}wzyomjc_]Pwt~{mswob~egitbiXWjjuvuqjyxŰөط|zdml_kxvzbMNbsnh`VTecbghz\XyxTRb`l]hmjR^aA=SZc_XZh`aOGUkb{|S:K^sdQ^ZZfML]Ztv|zxf\ixoqwgdm[\maglni`bQ]|[Zxzx_{c^lw}fmf_tnQ|m\]OJgxeK;t|l}hBZneqgV]ajgfkedltskWSUVVQNNOPONNNOQTW[^ZOFDGIHFCABCB>=AEEDED8+)(''((*,.124.)%"!  ! '482,/9PPO]U@78:89A7-EJINNH>>CHHB?>CPRmeHL[JJ]^D4YO?1;TPEPTI?L]YGHEFL[i[MMRUKCBBBBAC>@=>???@@EHGHKLIC@ABDDEFKPPQUXZXV[[YVTTLDDB@?<>==?<:69KKD@8248=9:@C====NIFCMMKJECCHMQROLJJKLNONSQD;FB=AAAA?AA@BEBDLLCDFD@8?DB@DKEDG>;;::69>0/979:?ADD?:9:><9:=AKP_S=D=8>ACMOFADFEEDDCCEDBDEEEGIJIGFGGGHJKJIHIIIJLLKIJLKHFECECAJIHKKLLJGEDDB?@BGJLLJJHHIJKQSONNPOMLLORRQQPOOMLNLIJMOPRXULNRNMQRPNMMNJFMLCMN??BFLKMNMRQHJLGA=AD@::@LYZWX_aeidY^mg^]a]XXZPK[Z[][^ZR]nfafkg_enfmqgeekvrmjjkqpmowumln}Y[aYW`_ex}|{prlbqmpr]UbhjcoYYNK\b[^Vjonupmsqyyyrjligknpfbjbejkjhnvnoxwwvutssoiihhekfcebadedcdcgfhlhjkhffdacedcefeccfgfeefefffhnqqpopvyzxvuvwwwxz{xw}}||zzz{hdklnonnmpvxwwwòıŸ¾ĵzogszicbdU]qzv}zjehd\VLiuujn~mVy_aaq\cZS]f|vokgfwvrpʯϭկζ|yfovjozutZKH`plfa_]__^]gxZ]y~nLZb]mgnivS_[GCgn`\T^lh\GGodsk_:0*)463.=C::=;7404=/6I3([jK8O?VF,4>@H/,H_737;<:AFE2.3;5,:GCB@A<<=?=9/8FGEDDHLPB@ADU]GFSiZKb``2=`kS`bhQenSOaSUI`:-EO84[oETcQ<^dO9@`g[QWhrjZJKUcjnng_bhftmS>THMUMdGLSMHHQ>>FDBESJ<4A_M=/CTMFTTFCU\OFKFJRhmXRQRSOECFBCCCAB@@?><:;6=:8@D@@DCA??B??DDBDOMDCGHC7:@C?AD?C@:>B@AA><6:>,/729:9>?=?IKIKIFEAAHF=<=86==:886:?;9=>???>=;ADDCGGIJE=?BGJJGPJLNNNLFJMNMMLH==;:743569HYvS>E=5:EFVnV>CGHFCAAABBABBABEHFFEDFFFGIIHHHIIIJJIIIKKMMLLKMKJSQOOMPPNMMLHEHHCHMLMKHGHJHJTRLLMPQMKMPUYXVTSTTRRPNPPPRSUSMRSNNQSSOLKOOGINBGN>:;BKINPLMMMKHC===?IMJPahd`eqpmqh`jnbehmoddfa_h_\`fd_]bmadgdg_fj[gpha`iskklclrjjsxkkv}{iuxrkp~|y||~wvxastmm_S]ghco_[UQejggartw~vqwrwuupnmgmnmsmgmghjojhmrlnuspmllnmiecccahedc`^_cb_acc_flgfgecb`abcaadfcabcddefdeklnswyxxvx~|yutwy{wwwyzw~~}||yw||{|zuddijlnnnnquwvszºªųźznfb|\hW\UWct|sxxf^ca^PIbwmfnsYoZ]`hY_^TMl`vmgaeqvztqxw͵Ժ־|zio|ym}smTHF_lifdfd\]\Wfx[_u~_T`[]kpfkyM]YKPumSZ_gh\K@VjUyWRU?TMIZkL5`sO45VSGV~ljfkreZfcdeeefhbYpTTnXTni}axh_nk{y|vLZgOofZ~]YU`t|mbvnPjlSPe\X{ZOvgRZUX_`epwzwdRQVZVQRQPMKJLSYZWSJDFJLMNIB@ADEDBBCBBBCD<-)--,+)*,.01.)$"!&%&/@ZL;19PVMB8-,60:11=:49832,/>63F9._UFFWRZ94CEB81IaG03327?NI9*>=24FUOB81-.48237>HLKJJIHHG81BBWXFLUlSP^_N/BZfK`jfQinMX^TSIZ<5IF.LiNQnV6TgP>DgfRDPej_RNWcortpaUWZVelUP>YKRSO`ERMPLIN:A<9=AA>@BB@>@EHHHOXTMR[^]]_\WVUTRMD>==<:<>5-9BEF@9?>29@FDCGDB>HFEICA@DOPQSI@DHJLOKTRD::EMH@@E<9:<<>@?AA?=>D?9@IDBDPNEAHML:6?B>B?=B=8=A@BDA=59<,330<87==:>ILNRLJNLMPOGDFD@=@7342;>66?>@?>8=@CFFAIDHIHGEBBIJJJJG;8BA::@DKIFMLJJKMMKNOMONNPPRWWVUVRMSWXTQSOJLNMLKQPEHJHLJKOOJPZQNSXLPOILSWXXOENOJVRRROIJLC@HPTOIADEDPVA?QWQVZTOMMYZQLROMORNMQSTX]ZUTRPIJOPF@IWTJJWYPLPSRQRRSQPSQNU[US\YNTXPIKNKJMKBDMONSVSSTXYTUXWUWWQUWW[YVTTUTRPX`ZZabbc\XQ\VSPh~~}{{yvtuux||zyzzz{}~}{}}xusqqtvwxz|~}}xwz}~{xwz~}{{zwsrqoos}~}|~|{}~|wspnkhecc651-)((**)*,.0246:=>><:999/**,-0EX^^I=C>59CCGfjI@HGDA@@??@AB??ABEECABDDCEFEEFGHGGIFEGIJKMNLLOQNNQOONLOOQQQPLMOJFJMKKJFFIKGIROJKMPQKJMOSWXVTTVUSUUSSQQQQRRPRTQPQUTRNNPPGHL=?H<58AIHMNIIIIC@@=CEO^_^gnjddmvtoqldnm_hlrsffhjhee_akaed^dZdfcf^fhTdog]Yblgji`khakzyltslp{rz}zr}{kx~ppcY_ggfpjad_qusolvsy~uq|psqrorkgqpltqnohhjnhhlnikokgeggffgdbba`ggeaa_\aa]\_]U]id^]]_`\\`aZ\ec_`a_dgjfciqtx}}|zzyz}}|zqnuxvzwwuw|y}{{|{usxww|z~odfjlknoorpryŹ~͵ô²nzzxnc]lfhqTURSZbu~ooreY_`cKF]|yexfosnjTWdhTW]UMrqYtxmn[rdiiqjpr|vмѼȧȿǣ{|lx|nwpiRFG^hffdlcWYVTdsZau~sVY^Q[kj_spPaVL_sYHbmgUF>BbYemVibK-'418AGD<=<8=DMSNC::A>BHGCBDECBCGLKGKUULMZ^\[\[ZYZ[\ZVLCB=<:GCDGA@?BKORUH>BGHJMJTQF>>GJFAAB:97>?>>>@><?@A@=6:<4;34<46=>=@HKNPKIMNPRPLMLPOEF>866?C;7??ABDA?;@=CBMDAB>9=AAAC=C@DD@AA>?FGEGHF;8@A98>CJHELIHGHJJIKLIKMJIMORSRPTOLQTUTONOQOMKLMPQLKHHMKIPPIS^VY_VLROKORTWXIANGHSHJRJELKBCLLKQF=@@APS<=MTOUYUMKMVYSIOPLPUPQWWZZZWSUY\UVZZJCPXTNRY[OEOWOKRQLIMUPLW[TSYYPRWRIJLHGHGBBIKNRRPPOUTQSXWTVQLVWUZZVTTUTTRXa^\ceeb\ZQVOMc~}}{|{xutuuz~}{|{{}~~}}}~{wtrpptwwwwy||{x}~||~|zwx{}}}}|}~~~~|{vsqoklw|||}zz~}}||}|ywwuspmjigfdc21/+(()****+-/137;>?=<:889;=?DHGEE=.'%)15BKHKE>A=7337Bl|Q>FCAA@@@@@@>>?@ACC?>BCBBDECDFGIHGHECHKJKMKJKMNMMNMLIJOPQQPQSRNLKMMKIHHJKLLNMNKKPTMGKMORVVSQTXTSVXWUTTRRPPQSSRPRVUSQRQOJKF=BA98?EHFIJFEEEBAEJOVbecmrljikouspojnukdlmqnbbccdahb_ndd`Y]\dfee]egYeogZY]dbgb[gcbsw|}zm_eqkp|tpsgt~s{vvnflnilvvnsqzwstrsru|ur|plnqopjiuqlvuqqjhknhillfjlccddeeefcba``dhgaa_[_a[XZYPVdbWQW]^XV\\TYeaZ`a`fknhhpuy~{zzzxwuwzzkisurxywsv~|}zz|zqptqs{{vlbfnronqrz{~vпǵy|uqwwn_``r\}XLKQVXmkajdV\^aODWw{^hfosvgRTciRL^ZS[^a}ynu^af_adanmvxxʠТϸ̠wkrxpmdPFJ]cafeo]QPSR`lZcu}dRUUJ_hcdye[aXRhiAFcc[MDIQ]ZmXKas^WXXqTSmcQWssQ-@9.*2001(+--0,'$" !)519GZouhqi,(.760,8B30-&&2.=BGE?CblZC?@K82On{dG08?08AD@?>>=8BJF0,JO=QNHdydB`Y`Hs~]\faaXEXMIM?@@?QULXcFJ]WKPYfF:IVRLR]cfgikie`[SXJ\]eeeZ`QRSXXFYKNI?J@6IFA@M=9-BdJ?KVGJIYHHbWLSZPEMfjYVV^bX]m]LEHNOHJHEDCA?@CHLKGGHGBDJILPMLQRLNV]\YVVVYZ^_``ZNJE>@AB=037?DEEGIKLMLLOOJHE?9==>GBCG@@?AHNSSH<@GFIJHSPGFBFIDC??<9;=>><=>=?B>6;@BDDBCMME@EKL@7>@=B>;=82;;=>??=:@@>A7?<9?>CDCIJHJJDDJKOQJIIOSNLFB@=@EE<=@?CJG<=E;=?JFC@=;<><=@:9;BB?=@;=BC?IDG?9@B;>EFHGDJHGD@BIIIGFIMHBJJIKILSJLPLOSLJNSSNIIKMNKJGGLLHMOJS\Z]^XTTPQQNMTZG@I@KO;DNDGOMFGLJHLA;>=ARP8;IOMTYVLFKSXYHMRLRVQSUU[]XQQWXZYaecUNZYWXY\[NCQ[LGRPFEPWOMX[SSVZRPWSJJJGFEDBBBGMSQKFKSQORXWTULKXXTZ[WTTUUUSXcb]bcdc]]QLW]~||{}|wuutu{~}}~{|~}xsqqsuxwvtwzzwwz~|xy||usv{~}zx}}{}~}~~}}}{x{{|zzwxz}}z{}}~~}}~|||~~zwusponjgfedcb//-*())*,--,-/137:=?=<;987:=@DEFHHD6)%)38=@AFA=>87508Af|U?@@>>??ACA><;=>?A?:=BCCCEDBDGIJGFGCCGJKJIGHHHKMMMLIFINNOONRTQNMNOMMMOOMRVUQNPOOUWLFLNOQRRQNQSTUUVWWYWWTOOQTSRSTVWVVVVUTRIDIIBBJNJILPMHKRROT\^acbhrpkiiossrpnhtxmlpomjeaafmkmletrh`faefjid`fjfhng]\cegg\Yfow}zsxtttu`S]kenwkhi`iusuryyyxvzwtrz~|yz{wrrroppxtoumhjnmmiktpkutqnhgjjeiliehhbbeeeddfeb``_]hg^[^YXaVTRWOR[`TJX[ZQSWSSZ`aW^`hjlnjmux{~{vvvtspptwyifqrptwwsv~}ww}znpsps}}umeisxwpsư~xx}÷̨l|oorn^^[pz[yhIGNTR_}kYacUZ__TDRrzZahnryeOPWiYGZ\YTcUkz|yptqZvgV`_WlklvyզժպѝqkjmmaOGK]`]ffiZMJRQ^iYevtVQQOM]^`kpbc\X[q_;Tc`[LJXVSYaRTgrT^`cfVaaOwg?5EXƔOKbRQ|iXcUNW_[T[l][W[cachUEqXq}mjnculfimukytOTh_n\NXXM|zVvXk>rzzBSmg]RQYSSSTWX_eadkh`\VX[WRRQOKHKXWKIIFFJKJLNLGFCFHGFCA@?@A@>9,,::91*-,**+%! '<=<;:8?HG=Jcr~J660662fQ85+%"%,79=6@LeP>@:VM4=Pit\CN[92@>61@LGEOUUOIHLPKC?CCEE=9447FPI/7BNH6QLPuiVH`ZkI>JSLSbQC[VKKM^ZEGNNKJS[]_eiic[PJTYb^]hlhc[PJS\TFZKNH>JB6HFB@F:9,C_IBXQHILYCPcRNT[GHPgbXOTb]\pv[QQWSPMOJHGEB?@DIIGGKHC@IPPRTPOPKJT[[ZSOQTVY^ba^ZPQL>EOK::78?CFGIJORNNPQQNJE=6:;?F@BE>@?AGNRPH=?FFIIIQNGHEFGDC@@;:=<>=;BABDBCLJF@BIKA9????>@IEGAGECFDIRFKMHLPIGMRQLFCHHGEFEHNKHMMMUZZYXYTTTUSIGYYC@HEKFEHKKH@;<@<@RP6:IPOTYVOKJUVWJMQLSVRSPQX]UMPWTWZ`ec[YdZZ`\\XMJT[ONTPGNVVPSZZRSUYRPURJJIEBCCB@?FNQLHCISOOQVUSULMXSUYWXUTSUVTWca[a_`a[\RM^t}||}zvtuvw~~{}~ytrsuvwwutuyxwwx||yx{ztrw}~|{|}~|}~}}}}zwwz{|~~}|}}~~~}||}}~~zvz}}~~|zxsqmhdccddbc--+'(**),--,-01469==;>=978:<@CDFGEG?-*268=?@<5;9573-=N`fTB7<=<=?CDC@;:<<=>;97'%*&1>3/?TZ31?9fI:R`rnVW_D:KI20;?=>DHGFILMIFCBCEEA;8:9;EMJ:<@LE7=SJew[HM[foG;YLBSh\ac[OCIWFFMC=ILKMZ`QUUNKOYcXLJJIHMOMT_`XOJEGPV\^]cjrl[SLBQ]OFZIMF=KB8HFD?><:.CYKF`LHIOWBTaNO^RBTTaXVK__\k{ma_`dWS]XOOJHC?BDA>DPN@ANPQY^WOMHHQZXWSHJSVV[bb`]\ZUJGTVDACBG?EGIKMOOKLOPPQOE<8::@E@FNLIG?@GHJHLOLEHCBDCEFB:=:9>BE?32>C=?DDACJHFBBGJB=A>8@;7:44;:;;<@BCHGNCDIHLFGFHCABBAC@87:EMGDDEEDFHHIHD@HFFL=;FG>>D?@==DJF??<45:84/6=9@;?8>9AHMC;DB@BAGOCIIEKNFEMQOKGEIJFDBBJOJIMLQVVUVWURVXYMAGUUABCFN>8IE9C?;CIIGA:;AB7=QG8=KWUUY\[WS\YRMKMKTWSTHMX[RLQYOPY]ZXZ]c[]bYYPMXZ[YZXSUW`VR\[TQTVURPSIGKIC?>:999;ACEFDCGB99<:9<=;99;8771-?U]ZWI9;<::>ABCC>;;:8889;=ABACCBCFHB?C@?BFIJGBEFDIPOLLHCEHJKKKLLIEFIGEHOQLHRYUPORSSVXUPPQNLLGMOKHJQLKOQWWSTST[\XYXX[^]W[_^a_[Z\_^XW[ab^aggd`digijhihfinokfgmpnnk`Vbno{xopouxwtxtsx~}~}}}{x~{umooz~povvz}yx}y}}~|nqsh]k{wlerlSKW^Xjqcbg`fe^cacnqvz{zyxxvuvqouskimmmkpogjifb`_inomhkrldadea\^gidbceffffdc_\fc]_YMUcVJWTRURJLKIJ[UJEPULCMML`\[hd`dffjolkrorokojlgeafpoqecjjjikstx~yqnyxmotuq}~trv}|ĭxlqxx˿ñХy|rzz]mxhZ`iWP]wfe}wV@HNPQl|kRK[VW]]aLG]mVNfmwo{]@GDSdRGTZ[[}ZNYlnne}kcPUXglah[ss~{xԱݿƙ˼ʞ~y|qj{oraPKTab\he[]NDQW`gWnqXMQEKT]Yij`i`eihoUPhhTMSYP8HN\JMXacjZQMRZP>EZYBiuFF\R>JhmZSITaZMOd]XQI]d]d[?llgna`pVqqdhkmcfZT]}dT4UadF\mygdJsPCp`gaSQdTTVWX]djooklhda[UTTUTTWUOGEEFEGIIIIHEFIIHJJGDDDFDBAA?7*)3@E,+..+"*&+GH:614:8?dprpRA-G6),1/F:*9SS/,8;sOE]qv`OSID]M+-?H?447;AECB?;:>CHFGHDECCDC;1BGB?6:LVOwmf?Q]vp@CaLHl_^ceVDCLQAHL>DQDDQZ`[XJNLYeYHDEFHJKJS_[OILWce\PMV^hnnlZPI>P]LO[FLE;LD;GFE=;@:0BTIHcHFISRBVYMOa@NZUVSSUc_gxvdidgb\ii`\SMIFDFC>>HTJASWOYf_MHJKMTURQICMUTW^c`]^aaRJU[VKNHIF?FHLNLHHILMLOPJFA<99AD8;=;A=?DOIEFAAFKLGNMIFH??@BGJD:>C@=77@FE<2;B<:AFD@DHFFD@DHAJGBBCCCCEEEHJGHGFMIGGFGFCABBDFMKDFB78;5/-696A<@=B?AIIIIJFFOJIORPH@EHEE:?HFB<>JM@7?==>>DH>FB@IJBFNONPKKRRMHCBKNJKLLSWONWZSNTYWIBFONEC?>:899;@CDDCDECCD@<<;:;;<;::7/0?HEZjQ>;;;;<>>@A=;98888:;9:=?AAAACCAACA@DGHHDBEDELNMIHFEFHJHGIHD@@DD@@EIFBIRRNNOOPTVVTQONLKIGNKCDKNHJLPUQRSORY[UTTY]]YRX]]___ac`\XY]caXYeleX]dcilikjgegjgabehjlgZTY]euohppwztjmjlox{vxzvwt}toqmxwvz|~{tu}z}yvyyvv{{mttdYhwui_okTLVYUhqb_edfb^cgfpvyyyxusrpppmnqpmjolmnnolkkic\aqrljimoh_^gi^[gmjhfhifdb`__]T`j`[[QJ\XISUURREIGEH[RDAITOIJHUi\aecdebgoojlpgnngkdfcf_aplobbjeihiuuuz~|unjssjkqvns~quvugsw~պ̻ķ±ǽΪz}yv|rzzlwcYur\Q^aPSl}g]q{vaKLMOP^sjQESST]YaSHXdWMblviw_@F@C\_KNTVYot^JOcbfd|slNRbYzYeXp|}qĦѸϜϱʻw{{oxu_QR[fg[ieW_TKRZ\e]keQPQDMU\Ykg\d`kkhhOXi[JQWaMDKXdVTY[dfEIPR^Fs@AWMHgCM^OBR[\SIP`[LL]]VQBWh^a[Fktfm[VwuWns`nnpZb`QfWX0UguSC^u{_lyPw5++.>67BJP;20IUZatlq9[izr:PcSSa^jgODVSMAOJBRM;CO^cXPNLM\S>BMFFFB@DKKCLKIFI==?DHFE?AGB<;>AEC=<@;6@JJHHFFHFDBEG?;A<5==9>:><74=A@AKPSBEMFDKIIEBBDB=:9;<:49FB:>AAEBCCCDIKJHIJIOIGLMEEDBIJMLINJ@@A802<<6B?FEGHJUKJSQMKROGJQRK@BJID8>HEA>>JL>4:8::;AB;@;?KHBJOOSTMRYWUPGEKKFJJGLMHKVYQLOSRPJFLLGG?LE2KSCBKR[]VY_ekbb_OTTHIRVYVLHNNLJU[EGV\OPPU\\[NQX]ZT[`]YRX^ba]bb\QQRVSUNPH?KJF;@@BACBBCB?=<<=<<=805B>;JVP?7:==;;<:9985:<98;?@@ABBACBCCCEGHFDCAAHMMKHFGHGGHEDEB=<@B@?@CC;?MSOMOPMPTUXUNNOKJJLOE>GRLCIJOOJRQJKPROMOX\UQQ[_\^afe_ZZZXbaXTOZj`QW__dgcghb]^`_^__adifYSUV^jd^aattndbceapqlmnolkwrmormtztwvyxqq{{~}|{~xqvvrtvtqt{{~~yruth^hqpj_okTNVRNfm]]cdcbcjoms{{yyxurnmonkjkljhlhjllmlkljc\gwoiijlia]_ikbblqoigggdb_[]]]VcodWVVEMXLORSQRHEG@IYKACHZYTOP`i_c`_lkfntnhjmajlbeab`keanjnafmdkmkuvtuxxqlhqpgjnsqm}|ioľ̽ry֤żǭ¸¼°v~vyzo|szqlz{lbvkO_pdVS^YM^uhXhoogOQMINUghVEJNP]W\YGS_YM[grcrb?C?=5++.:S0*()*&!",=B>@EIC9LWatsvqaZO?;=E89VGCR@9=6O?QsGJUUN@;EM7.7DMOKGGJF<;<>AEJJILNMC;:87??8856>=?AJDFFA>BKJAHIGBG:8?IBBB=DKC>@@BC??@:5;EIHIKGCGEDEDFB>@;6=>;=:@B50EF:DQSI=FLB@HCCC?CGA<;:;?<69C=6;=>DAAAABFHIIJICHHFGIFJE?:88BMEBHKORPLSWX[VLKLEAGGDGHGJORNKHIOSNKKPGLLSG9@B8?F>FI;:DHLNC=GPOHHLPRVVX[_`__`QORKHMQTRNGFIILUW?IVYQJJRaZRENZ[RNW\XRQ[W][__YWNINSSQHOO@NNOB9?I@KZONWYURSPFFJCHQNSJRTSUQWKLMORQONLIFMKLWzzyvv|~{z}||zy}~~{uw|{xy{|}}}{z{{|||}zyx|~}}zzzxxy}~~|{|}}zxwtplhffeeiqx||-,*(((()**+*).11342489:<<;::;<>?@@ACB@@?=@A;?=:5NL96;><:9=????<:956<>:9=@BA@?@C>:EPPNMOPMORVXRMPRLKNQNA?MVK@FMLFFMJEEJNKKOWWOLS^\V[bd_WQX[Wb_WYOTcZLS\\_]Z_a_WUXVYYZZ]ce[RMPY\]YX]kmfY\b^Wkicfjgcdjhclrostpups{vqouyvy{{yzxnntsrrtqotvzsy~}utxtggrnpujroWNVKI`i^^ceghjrsoswyyyxtoifmojhgggehfffjjghjhcZdpfbefh`]`chjhhjppigfcbb`^__^]jogWQXJGVPOPPQRSAGDLUG@KOec]Z]ecgdfattmrrkfejbcicfeddomhpkncjqisrjosttutoienmgikqmg{}lnн|۴źʿºIJr||tv{lvylpwhp{ss_boXNbg^QP\QPkkT^jecRRODHP^e^JCGIZYT\KOZ\OVajapa<@?=DafQJNMUZVOMSZZlZ|suaOk\v\g]ix|ܻѼƮt|y~xkrm_lqWnhQaWJWZQfe^U]UNKYYZeoaYbipcYIPePR`[hTHIMk]TcY_V8CZZUO[_:LVTUBL[]NBNXZeQMNb]JMTUMQBMof]]InzopvbiyOqv[mwylz\XofeNejG\_yhHPbsk]`Y_zJ=PLtzgPSUXXY[WY_ceoyzrhb_bicVOGDDFGHGIKGGMMIHFDDBBA@?@CED?=>?8++4:P7,&%'% #0@A=@EC@=@p{fPVi]h{ibK:<=LJE:0@@CKRL<226;?AJTUUNC>AGMPNNTYG4-:AJXhjourR7fohhFe[UxyatUI\rXEPWKa^;FFZkSLXFHKBGIHLZ]UONLZhaVUWZ`f`Z`ny|vd[Y^L4DRMZRBBC;POAOSE=CT=;MMCQWJ?OKJJMD]cHNRCSUX[V^mq__d[Zevpkg^]VGKWXZa]OT^`cTPdpga[VQMLHJF;FNEHZ^SPY[XUUW\cgd^[[XYECOL:DEDEDGGA;759??;945;;@?GDEDB=AKH@EJI>F94?H?C;8FMD=>?A?EG>2348::9:<55DLBACGJMONPPT[WOQODCFFFIIIJKHJKFBIQMJHPNMRVKKOK@BFDLG;BMNLG>AGJLKGHMJQTUUTVZ[_UMJLFKLMNLHDDGOQQ?LWURAGPeTJ?OZRIMTTUPQ[WXY[ZVUGBOQNLJNPFTOPC3=J=;99=CB>BEDED@?B=9@@@?;::=;87C\N59<<87<85:@@<N^]OEMWPiRRPh`GIORLNGHno^jFr}qspdxMkzXhws`wpWizbUYkOh\biNkfebQIo}p<:H[uuYIQTUVXUS[aektxxokiee_REBEFGGHHIKKJGFGIIEDFFEDBACEEB@>>?:/-;;@9-'##""-:=>?AB?=;hvaLC[^btlc];/415;NLAE:;A?DDDCGJD<866;=@=:757;A?GCDD@;?JE=@OP>D;3?I?A5=>;GN?FDEA?HH;<:99A?;7:;=A=6:?=>>?@ABB@@@BFJMOIEEC==AKE:?CCB?===CJHGIKSSHKHJFE@CEEGJKFGHFEMLC?BISN@DDDBA>CF>662;<<99=43DL>=BBFNRMKNTXURTQGIJHIKKLLMBEKH@CNKFHJPKQWOTZXLGORQKHLTQF??ABHOKCFNGNPRPMOUU[XOIKDGJBGID?>DSONANWNPBDOaLB>QWMHJPPQPQVWRU^XVTCFXRKOTQOPTML?>FAAPSRSZ]RPOMMICCAHLM?MXNIHQHFGOQLNNJC=@G]~|}|xz|~|yx{}{w~~~}~~{{zyzwuy}||}yyxx{{|~{{~|yxxuqmjhfghhihgff,)'(((((&*0347<<<;<<;;>AED?=:;DF??FIHHEBB?::99956L`K7;=<:9=@??@@><88=BA??BECA@@@CCAEDCCEEDBBEDEILNHDHJIGGHGCDGHKHBDJIFKMMNMNPOLKMMOMJPSONRROJJPSPE?HMGLOEDGJKKKNVVKN[SHKTYSLMRXWUYVZ\RY]WVVXURTNKTXXVRTTTSTUWa\KAIWRRLL[hiZQVXUYgcbf_]_d``cgnonkjkiimjigmvspststunflsrrsplmrvutvqrxgutttwtu|tzyojjc^bntqjhlsrnmkehrqkorj\[chede_Xch`e^ce`_`ad_cia[_cdhhfdjgaggbecfe```afcadhjlilccc]bb`^]YSWQOTWXa]]^dcfb`iiourirunlfhlhkplqyzoqypuqtmlkmnpoljllsrnotl`mphklotiwm~½»otynpv~}kcw|lajymYcxsgc_`h`YYZTKQTGPi\Pgf\^KQT>HY[ZU?BINXOc\QS__NVYVZE4:;P]]QHHQGkPWQjfKELQHHJGl{doHlixhsUcY^z~qXky\[gxTPkNmXoanXcpFH{vU07BftooOKPRSTVRU\ajqssxsusncOECEFFFGHGHIIID?BIIFDEECBBBDFFDA@?><75<;37-(# '4CJJFDA>?dui^V[WIne[U8.82(+9FLOD9D:;DVM>5CXUQRTYUC638;=BJTWUQKB>==;94:FI@8L^km]i\W>DhimXNqglm_m\QXoI`_L`fMRLQkUHUGBDZ[L\WQHMZchjaW[[RNUgyvlea\X]`_]ZRHBIOSQQP@8W\OIYRIGYEMMFP^HC@UHR]GTiNAV@Paa\X^ah^_^O]mrdcigcXSY^dhga`lvrlhdgqlhhd`_ca[QLSJ>KYMGOUQMLKPX`jb^cdcaTPPMGECABCDBCJE<9:<>>>D>::68=B>DBBD@;A=:=F?@6ELA<=@GD>==9;C98HHE=@BCBJCANBA@BIC99876==66><9?;4:?@BCA=<>@DHIJKHEB?=DID;BDDD=88=AGCEGFOQBFEKI@?BE@<;3=?>::=65BL;7BAHORKIOTSRPQLINLIJRPNMNCBKKA@KJDECFHJUMQYYOPWUNTVQSMFGDCKOOMLPNKNNLHILRPVZRNKGEH9=F:8:CWMFANTHLHBQUH=@UUKHFJNKJNPQNUZ[YVGU_PQZWPOTRMG@OLCUSNVM\bQTQKIGCB?DJK>KXMHFIGDFLOLQNE<:GNo~|zy{}~}|{usvyywwy{~~}~}|{}~~~~{yyyxwz~}}|||{{{yz}zy|{xvrlifedcc`\Z[^^+(())*)&(18:9BLB;DJHEFFED@DJFDD?=??;63;KPE=>>>@?=<<<;;;99:>?@@?@CCAA@AEBACDCBDFC?CCA@CJJA?DEDDCGFEFFKKCAGKIHJNONNNONJHGHKJGKNOORSTTQSSRMIKJJRREGIJIILOUPIV[LLORWTLNWYTTWU[YW_\YWUVUSRMDPSRXSUQRRSRR[WIJQXQOJN_ha\XRWTY^[\^XX_dacfgjmkfdeddiecdkrlhijknnkfirsuvnkkt|trxso{gsvn~qnwvmsvu{uunhiqyocdkleeedajh`gpiYW]dcdh_Sch\c\^ebgb_ediog\`bekiebf`X^_]^]cb[^`cifbjljlhupkmhknlgbl]X]Za_\jojfbelibknpvpdgpljdemlksrx~vpp{owqrtlnpopmhimlqjhntj_nrekpqͻ~wżȽ|po{wkmtuwlaqylchpq_Uenea][_`YUVTLKQJG\bRYd[YMKYIHXZ]fJ@ABEGGEDCA@?=:4;1/-(##0?GIFA>>>^wpidQD=NUXXD;GLBB@3BYS;>8=>A:>=CD@;8B?;:NU@@?==A??;J>??=CLI>?>IJCENNKLKIGGD>?F@8F=?99C5:EFF99;>@BCCGJHEC@@HHB?C@DFBGP>@BDFEKLBACEMOMOEC@:>CBA?>8??=7;>78@J=8BBMPTJIPTRPKLEFOKFDXONNPD?JOC>DH<;:@CBSLNTTNTVKLY\KPMKSBKXLNWWTNLLJIBDLUPQWTPKJGF>9D94;?TL:FJGCHKJLTVWXWMZ[MU[OLQTPMDKSJSWMRSNY]TWTGIFAB=?AK=HWMH@DCBCIMKQKA;?CW|zzyxy{}}{z{vrsuwxxxz}~~|}|{~~}}}}{y{~|y{}~~|}||}~xtpjgdb`^[[]_abc*()+--*)0;>>CIIEFGA?CC?=A@>:8779;=???@ABEC@AB?@CDDCDD@>@>>?CIC:=CAAA@DEEDEKF?AFGGEHNPMMMPJFHFIJGHKKLONQVTTYXSRVUJJQPHIPMHFFNQOLTXPQQSXYQPYZVWWV[XXa[[ZTVURSOFNLIQPXPLVMMRRMOQUZOSRTbd[ZYMWPRTTTWWY^ccfgghlldb`]cdaa_hlfbabdgfedbjkkniiit}nmvkhzjqrqldoochooyv{zpgfomcadfbba`\cdX[hg\VXbcelfTaj^d``fhpjdhjlqk^\__ba__b\OTY]]Z`\Y`efikglqlnfquoojlrqhffeZaa`e_dstlilsrfklmml`^jkjbcihkquzzlllrnsqpxnqrsunempmpjemogcpqdksu̸ñÿ¿ú̼y}|qmtshmsoqqbjtkbhipjWT`db_]ZZVSQQLINMFM][T`XUQFWTGVURfN8ERegy~|zyxwvvtrpnppqolkkdme[e]ur}}{ϲǴߵûuǗטʵ}YgqavugZn\e`iRJV^ueVa\^reaYUa`[TZZRMbo]IHVYHZXVvcWSHMXRIHf\FV\LPJl>ITTZUIJKG[Abe`fZEMSOFTXayxssyh\etkf_~hHhmgkRoVKgvkUIeLddtvXp|O`RZhOB.4FVi[WRONOSTVX]]bknhfkkxqjYJFHFA@AEHIIKLLIGIHFDC=<=?ACFFDEDCCCC@;3:5/.("!%-5:;;;;;9Snc]Q<276?RWOS[_aaR=;TbYYPCGJKBRlF.250,-279@JPQL@65:CCCFJLLIFEC?948EORRRZMAUYUUXMMBP_`eP]Prjmgn[]vsUgoMX`VWbRZ^CNZRelRUJSHRdkbWNEACJ[hf]Yd\IDObrtrukVVTKGLPM\a98_cRF`bVG[IJHVdYIKUSXiacXLEVCIdieLfbecV`]fxr]^mhYVlkchkffntskhmqrqnlmlgdknhdplOFURADQNIIDDOW\aZ[^\aif]YZWNFE=9B;;DCEPOQRNJPPKFG@D@?;8;DB?86A?>7GTA>@?>?@>?E:?@?GNH>DILIEKMIFHIHKIB==C=2@9D9AC5??HA4>=:5369@50336=>6889<>9=>:>=>>@DHGFFCBIHA=FDHG><;=>?=AFBAM769=B927@=9=<>AACELMCBGFJNPPGDA7:AABA?=A;;::@<KTG@DD775;EPLC>EE=9CFE>;KD4@IA=?ABBB@GOIECAFIEABFGGFDEHFFIFCEKKFA=968<>@BBAACEC@@>?AACGGCA??><@>BI=5>B??A?CECADGB@BEFEBENOKHMPFEHGKKIMQKHJIMNNTZYQPXVMLMMKLQLGDDLLRSTTSVSTWVSTWXXYVU[WW\X]_YXTPTRKPKFOPYSMVLLSNMVVWXRXWX\TTWSOSGLVVRZ]^_ccfgffnmca`^a_b_[jmcZZ]`a_aaZff_geebkughibewthlroy|a\iibdfhnruwrc]egccbceb]WR[aPP`ibZXdffpo\amhgjfginmihdage\ZXWXYZ^^^MPY]]X\XZglkjmjkqmofgrkkhgmnhc_e^`a\ic^oxrlouvjihjgh`[fjjdddfhnuzrdijmnqrt|ussvysgoplphelhgipqdlwrvƾƽɼsyxqooodjrlk|wedol_chjl`SQY`b^[URROLKIIHEDP[TY]WSCLTDI[d~{wwwvxyxxxyzyxwvutrstttsqomnige^lly{z~ʍáǖŗիŧɹ~amnezrc`qcig`PJY`{^[g^eof`TQda[T\TKTihTGP_]NYQ^x^ZREMPNOKfKG^[LNSV@KQOYVJKKGU=`g\_[KNSNO]c^rvkjkd\wjgbzo@Wj_rUiWMb|m_[[OcrizrjW{z{M`iYUAW03GQbSQTPNPSVX[][]bggihctnaRFBBCBCCFIIHJJJJIGFFDA?>@@ACDB@CDCCDDA;5691-&  '1>GHFCCCFSXRUVN:<3*.82FHJUZYYWQLWTPMPJID>=;;==>96?=<8BPC9.82H9L:;?@G75ENSVORVLA>;7/159B4137DD=:<=BB>;9:>ACIC2:@<<<<>CFEEFFEJGB?FCFE>???=>=?FC?K2199:806B=5<=9=>>EOQEBGGKMPLED?58>BBB=@<<>GNILJKNOQNGFAEH?<9NHFLPH@IWMFEF>;8;?EOLHNLPUKKTZSCNTMTUMEKXUMGDDEEBABDKQLJKMLHKHWM@GFDCBMB>FD@EGKOOSVZKI?6>B=87::>AIHKE9FK]zwxyyz{{}}}wtvwttx|{y{~}yz|~~|{~}|~~|z|}{~}}v{~||~ytoljijjjigfgfhkkebdgh,-/6==8;H=3CC99<>??<;DKEA@AGGEDBDFFC@ENIEHEDJOPKHGB>ACAAEDCDEDCBA@@B@CKKD<=@=:@?BH91>@CDA@ADFC>CLNHFPLCGIHIMOSQKJGKKINRROKNVQMOLLNLNGEDELLW[TNQYTQSSTWURTUPQYURUR[\[\SRVVRWQJRTYUTUTOSOOTUUSXXT[WNUWVVRMW`_]`a``a`dedclk_abca]d[ZombYZ]`_\a`Tckbabe\doa_``dglednhrkYXb`^_\_ijnur^Zfc^cbaebWOKSYKN_ihcchjkomchlhdmjedhjgd\VZ\[YVQRRZ^[aOPZ][UXX_jnkihigillf`lhdddggb^^c_^d^oncktsoprvnieigda_fgjgfddgluznbfhotrty|xuuyywprolphemeilpqemxtz»ʶȿ·|oxxsplgjbkqjgtyh`jn`af_ddZMHS^`\VPOLHHHGEEAGXUVZMJFQr}{zwvwwxwwxxxxyxwursqomlkjjjjjg`dm{yxzӧ|ӚԟÏsϯɻlmkmxjhjogroUOMZc{W\pfjki]OQid[YVOO`i[LOZg[QZTfj``LDQNKRN]CH_YNHpJGLLKXUJLIJR=]h\\_VSYOTeqkn{ujgxne[}|ifgvFIgZlYeYMb~piuS`fegnTYiuJ_mOJ?g+2EP[ONROORUWY\[XW[`hla_nfUJCABEFGGGIHFGGGGFCCCCAAAA@?@?<<@BCCDDA;64:1*""1DPZYPOPQMTfefc[WWVTSQRTRIGRZNDD?>?3AaVGX|8-03112770)*,/0,-5=DKUZYXUWa_chf\XZ]]S@:MEA@VP?RJJWH[Ys`pVelsidhr[useZbTUp]dgGGrqioJTPQZd_QRWXVXWNIKakcPRV^p|ttxuxsdc[USQQQTZODWO^WclaDYLW]TWb_ep_kglUK[Z\Nbrl^ekbmYgkjog\algOUvvqsnfdgjg\\wyonnjlqsmjfgkwt_\dVOXWECEBMVPYeXUS[ni[fuog^POB7>5:OJRYYWVTOIVQONROKI?@<;88?=6;:89BHC<@@=49<@59ID@EQCEEFFEDDDFDAADJNOKE?6*1/IAL6A@GD7?ONONKQZPG?<91239B87:?OLCDC?FH><9;C?BI=4B?8999:EB?M2-985714B=2<;8<:;AMQEAGIKLPHAC=88CF@<?EJNVLT\VGIC<=;62357DQQMMIEFPTRKQTPIMPLIKHGJLNTRHHNHCA@C?;CC?@GF??BCCBA?8@B<;F:5C?79<<>>::CHD?;@HEDA>@AC@;CPHACADJMLJJKIHJHEFIIIIIHFEFEB@?BIJC>=?>6<@?E5,=;;C?@@A==CA>=?AB?>ELLEHQJBHKHGNQRNKMKLLNROHHKOTOLOKMPLLGHKIJLWWRKOXSPPPQXTKOPMNSROMNVZYWPQUXX\TNVX[YWVVTTRQRWUU^WU_ZU\`__Z_cgjic_^^ZWbb\bid]acc^]dW^rha]\^__]_^Vbfc_`cWbk\\^`ZYfdabefZXY\ZUUW_iclwu\Wfc[ac^_]SOORVOZgkkiiilojeflhe^gi`^`cbbZQUYXWVQOQX]X_TT[\WTX]ejigdefddihd]ggdbbdaZZaccdmisvomnpqoptokeiifaflegggdefgrzld`fpwurww}}oxwxusnjmeaigmnqsclyzͬij{ʮ»óĴ{nwwrrkch`lthiorhbeja`cU]b[OEFS\[WQMJGEFHLJDBGHP\_y{wxwz~||||{{yy{xwtqnljjjigbp}vusʲִoغñʻwhmqpkmxoozpOSUZisTcykggkXLZld[YOQZhdPNXalSO\^a`j`GIWKITOQCK]YMF]JMJIKWTJMJHT@Tf`\`]S[RXk|wmkxromdaiv~daf|T@_]d[]YS\mlVrm~kYlG^\pFbcNMGh%5EPTMLPOOQTUXXZVUW^igVZh^LFECEFFGHGHGFEFHHDAAAABBBBB?>=9;ADBACEC;64:1(  .?DLSSQZgpxwi`Y[d]UPJHLJD=CQaaZTNKK=0457=BFLQZaefebabaa\SS[_XP6;G>EHaE49:9;BEC?AEE79??47EA>HL?A?HIFEGHGA:9?JOMNMF8&-2FLD9ACHC>JOHFGHOWPHCEC878>CAA@GPNGHGBHI=<9=B<C<;=>@GLHGLKGHONB@>?A;92EE;DOK@BKMGGMMKOLLSLIIFJQQOPRSG?GLPZJUWJGLHA;523557<@?9ANKKQK@ERRIKVRNKMHFOMFJMLPVOCHRIC?>E@:?BBHMF8@@9:EIJIAFOwv{zyz{}~||{z{{|~~~~~~|vy}|}~}|}~}}|}|{z|ywxz}~~}}}~{||||}{yxxwuttuwvtoigghjkjjnqsuvFECBDFAAFDACCBBABA:=EA<><>B;;C98C=6:==<::;BDB=8AIBB@:;>B>6ARF;><@HJHHIIIIJIIKKKLMMMLLKHA@?@GGDC=<>2:D<@6/=:=B>A@@=>A=<;<<;:>FKIFINKCFKGHORPNKMPMLQVNDLQMQPNNKPQNMJKNMKLPPPJNUPMNNKPPILNLLNNLKMQRSOFKUWUUQQVW[ZXWWY]YSZ_XYa\Yadcbbbb_ffjql`[\XTU`_Ybf^[`b`\`bXbldb^^^aca^]__[_^`[P`dW_aXMV`d_X_[XVWZZTS[hkgnrs\Vgf[ac^\]YY\^^[dkljedhjjebaefb\eg_[\\[]ZPPXZWURORY[V_YW\]X]diljeb`beabdhe[aeca`a_[^kgimwvuusnloqonqnkgiihekodfhiadb`puje^dovummr~yqsstsqniia^bdoqsulr{{ȺȟĮ~nyurvk_c_nsdfmkbcba]`cOU]WTJDGQVTPLHGHIJIGBEXo}xsuty}|{{zyz}}}yvsonnomkdnt}p~uk˚sƙơrâŬɽ{frqjnphz|iS\][pjWn|q`hmQLeka[QJUdf^KWcjaGR]`ZfmWDOYEIUOHDN[\GNJTPIGJWQJRJNxZKNcaY\bV\\fsxpqtwpqp^Yvp}c^\~cESfd\VYZRymdhnvnVr@_^vBg[aXKd%@FLNJKLMMMNQUUWWTRZd`RZcYJFGGHHFEFGIHFEFIID@@ABDDFGDA?==CFD@?AED:5473&&1>@?HQT^kqja\UGI\^OFBCGF:37DUagp{~gNMVQckD0499AFOVQP\^SOOPU^gjhaYNHKIFCKU]^\_`X>,CHNPcb8FVMHVGkgu]x_{djZepbfnj_d]hr}l{NEvjciPZQs_=Qmpfe]GKUiuxdcsxxuqroiys|zb`[V\SUZYZWRYI^lqpcEK_n^KUdqpvum\ckoQKnpomdXh\fsljf\\hcK]vz~r]de]]]Zduj`gijlrskkbXamm_[gdhqeNGCKPJK\\NOTghSUkocbeiaRY^LCKKJNMKJHFDBPKMHGKMJRPA8;>A>67:;;BGECCHJ89B<57;>=GB>==GIFFGGF?89CKFCLOG<+'6ANA=?A@?@MIBADGIQKCCKLBAEGEEFCHKJDEGEHE@?;@?;?B7A>54954<:?BDLD@IDCLH?BC@?=CHD?6DC?G9)2><2,/54198>B48:CKB?AHGBLD?B<=@>BCIGA=@C?CB@@FMHENLFGPRE?;=@:;/EA8ALJ@AHKDEKNMOKLNJHGFIOQNNRPA@OI<@HIH<<>FCMSI@GNMIQYRONMADSMEINOPPHBJMHDA>F?:@A?ELG8?=7=JIHGEGl}v|xww|}}|z|}~yxy{~~~~}~z}~~}yvttx|{}}}}~}~~||~~~~|{{|}}~}{{yyxsomquz}~LKGCCFCBEBCFDDA?CC>@E?=B;=C<?<::;?B@:7AG@A<37DHHGIIHIIJMMKJLNPPRSOJA@DDFFEE@=<2DDBFIGKDEKGJQSNNLKSNIQWQBHQMNSSNLOPPQKJOLKNKKOILQOIHMEKNGJKHHKKJJJMJOI:58=>BFEFDBG;8>;87:;>@>:@DKI@@EFA<6'9@J?:;:89?HB?>BDBIG@BKMGJJIEFD=BDGA@GDEDB@=B?;B@9?7/7;27:;@?HK>?IFENG=CD>@ADHGB5DFBD:+2@?2*-00167=A259@D@==FFAJB>B>?B@DAFLI@>CE@@@?9:@C@FLHGOIDHQTIA==?:>2A?4>HF>?EH?AFKKMFEDDCEFENPKLQKCHME?AGGA6;?>==;60->>?@CEDFHEGNJKGHEKLHWS?DGJ@NGQTJJCAENKA:F<=D=;;6A9/037<@@>EDDHCGLIKQSMNNITOFISS>BOKKUTMMMORSJIQLHOKHNJKNMFFLCIKDHJGGKKIIHIKNB;MTLDDFKPPPQRSTWZYZ]]\]`Y[_aaY^]TX_^bf`][XUWWYZY\]SVa\T``U`_`cX\^\ddZ^f\T][^[JR]SW[K9DP]_RZXT\[Z`ceeerrjklkc`cgdbbfkhbcchdbb]c`_ab_a^VOZkb\ba][ZYUV^]X\id`gfegfedfjhghjonmd]b\]a[^^caQSaiggms{|xustu{olfcgmljhhjechfeglecjeWd]^mlhnjnoxtgni~uqlhgkpkcedbcksuy{{{}|sϷұͿϾɯlpuva`_amd[cga[_]YW^hR@KSQNGGFINOJ@;CSl~~{{||{zzzxtqqoquz||zwvwz~}wuttrqqpnnonlijdbehqlͯdzpŸ˩thzltgs{feiclaemhfvtp[mbRakc]PTY`c^PRlpX>[\\fbiaHIXUELLI=KUYUB\D\PLFKUHIWL_lV[HRafjnqqpsrprswvkqpnOtc|{XHwtc9l^YZbLcwhhvhqjpBUz=bkKxnUU5J6KEFFGDEFHLOQTVUTY``c`[RIHMNKIGEEGJHFEEHHDCCEEFGGGEB@AEGGCBA@A?:5331&%0:?DFGHKRUWSPVdcRKHEFIHGDHUkzy\C9:DJJA;>4?MIOQXWRSPT]eegmoniaRIEGMNSOEHZgjja^X\MTQBgMHnZa[cSfkhg~ulbV[`_^lfZXge}{ufwVqoiy]^\qHkhXP{UdkR_pkoyragonojb^jgjYL`cXUNHWPUiohYGJymLGVb~{rwxibqp\Ocguijc`jghmd]U[[iWakqaQgh[UU^aae^[]jmlookhadlh[WfsdgokcYOMUUUTMQ\`OP`c\^cfjigmh_QAADDEEFFGGC@GJKC@IBFLOTMJIGB>88>ABFFHEACA8::;8:HKIMD@CCHOMHA@<=<;;/9@@785727=E?==AA;CIGDFHEHFCCCC:?CE??GCCDCA>B?=E?;;-,::6:6<9>MA8?JHGME>.3:A?=:;BABIC>C@BGGGAEKNH
?C<8;CEAGLHHQGBIRXRD=>>:A4?>16CD=>C@;>BFILEBBCBEBALPJJKGNOHDACEF=16:::87834C@>@AFDGJDCMEFHHEKLJXWA?>:>BBFOHEFKHEORSUUMHBQN>DTTKKCIH@AEHIJIDCFHEBFA?G=>D=:<;=@;7;CE;:><=>=:=A@@A928:82/BG8=GCBJJMPKGDJILOLKIKMPSTSMIHQUJGHGHDKOKMHKHBE@GLFRGDLIE>NJIOPLMLLSQGKRKKPJINKJKLHFIEKJEHJHGKIIJIHOL?DQRKEHKORONSVTTUWWZYZZ\^WZ]]\V^ZQW\Z_a^][YVXWXYVXXNT_XR`^Ua__[RY^\c_W`eYV]X_[LU^SXTEHKV_c[\ZV_`^cdhfeoqiijgcbaa``^bhd__`_`c^[_aaba^`^[S[kb]bb_\[Z]Z]ceemnoojolkihjqlgkkmkmc[_^]_Y\\_aQTbkqsyy~}tutqwzojd]dkifdfhdag_^djg\fdSha`ojltpuoprgsdztrniglqnihimnotvx{|xyr}̿Ÿɸž˼˭~}pvr\b_ajc]bd][[\WUZeXEELOMJGCCMCEf~|yzz{zzzyvspolmorvvtstwzytsrqppqpnmlljigdddfzugȴ͵lzͿѾέ̾pi{mx`twq`delhjklhsvr^j`XhlaVOZWdc]S[i^HU`U`fbfUHLXSHNNI@PUXQ\GH[PLKRVBNVMYV]Vervyyvsqrpis{woaZEnhqUCfxs5ZlVZcU\m{j{gg_oMRq6Wa81./-#!+8@CEILMJJLJHYgcTHGDFHHFDJ\s}|}yiZJ92CG;95GjexTQNDT_Xdgkptusxmolkf`WPOQX``abb]KIQNQ`N]p\mmdWnydi|]cJ]]W_prXa_Xkhu\|k|pXa\mbeRevQkXMhrlsxwmiws~t^fcjrmoSJfeVXKK\PSjlfYGTxoHIVd~ol{{ubhp^]b`lodk_ll_ik_VU_\lRjituS]l\YW[^ZceUYgoihjkjfcime^bnm_eomeYRX]XSKLU`RJ\bWU_egjjnnibTIGGEEEFGGHDBDHIC@G>CGMXQOQOGC>:?CCDEIG?BC879<8:=E@:8EBIKKMBADELSMHHC81;<<39>:3844/6>C==>B<:@IQGA@?FB=BBB<>CD@>FCBDCA>B@>D?=9(,;98;7=;,28@<;89?=DGA=DDFOMLHIHLM@CN=?C=8:CFAGKIKPFAIQVSI@>>;B8=>04>B;=A;8>@FCGKB@KB@FFCKLMXY9BG8JWSJI?AIIA<<=A<>ADC?@A>;AAAABDJKr|~}~|}z|zyz|~~~~}yvqrx~~}}}|}~~}}}FGKC=ILCBFJKNNFDGFHEE@CI?@C<>@<8>HD>>=>CA=AC73:9623GG=GLFGSRQTODAJHKOLJFHKMOSRHFMVTJJIGKFOSMLILIDD@GJIPGINKE>KG34=:88<;9BCGMNMNNOQKIQJDRK;9KT=:IKGHLNRNJSREIRNMQNLOMIFKJEHHMJGKLHHLJJLJLVSHMRPPPQQTYVRX]WTUTVWTVWWYSSVXUU]UPXZV\^][ZZXXXYYSUSJU\SS[[Wa^\QLY^^`ZZacY_[Yb[TYaY[VT\[_dne`c_dfdgdegdinggfba_\[[ZY\`]\\]Zae^\effcegcbf^_eb`bee^^`hlghooqvtronnqllnokfdgijmd[^^][W\\]d]^fm{{{~|{qqunitrib]`eecaeecad[[clhXdfXlf`pmrtoypimgqfqstvnjozyrqqvwqsvtv|wz|lkýɿɸĵȫ~}sul\c``fb]`aZZZ[TSVdZLFEJMKF::Nm~{{~}{{|}|yvusnlorrqqoooppoommnnlljigecbdignzzpz¥ppʙϳҳ̼}{{mi}ux^vq{`[cnplnldqvtag^\mk^LTYUg^^^e[MTgUTgcabPPPXSGNTGDTXXJdCJ\PLPVYBSWK[cnqwzz{zvqqh]UrnYM>\siXEVx;I]]_gUark^SdZVt;OR6|~P:RQ2>K?;A??ACFJNSTVX]\_c^QKFIKIEEEEHLKGFFFFFEDFHGGFEDB@@A@>>>?@@@>9/()&  $+27BKPVZ\WJNafUEDD@ACDBC@AWx}nd\WK;Eal]AKb\VUhtmPHURSROOQV^cdefeaZWTRWWWVUSLA7GNN`T]`p`vwa]Wl{n\_HaYT^sxZeQWfqpetu|b\cf}xaWpiRdJWmbftumvlu~u`]kjwwogPTha[\HR`OVjhdXK]eBPUdwhksqm]kdPkb^mggabrebn]UMb]p_WiftcYh^Y\[a\\i]VephfefhifckjbhliXZfmnbSWnbTPNRXRL[`RR`eedjloopfWUVNIIFGGGGECEGGCCE@BCKKJPWTNJD>>EDCDHIBBA:9:;:;?HB8A>AEKPC<<:FC9@BB>>FDA>FCBEC?=FDA@?@7(3=8;<9?AK>2=GKKF?=@GD@HONIFGJJKJMTQI@9743.-.//=8176?=:67:BE@78BGAGKJNPEEKNOQQF?A>?>>>15<>:<>75;ABFHB@AAAB7ECLNPRW>KORNMKRSFEGAGN@5:A45CFRBDIPPKKEEIKKHINMOPDGFMRGETVOLF=JJ==>=>=<?>:=BAAADII`|~{xwx|y{}}xuvxy{{}~~~FIKE@INHEFIMQNFCGC@BC?HMAB?8DE=;AA:3:LJEJLOQVUSSQC=KHLPJICEJJLQRFALRMGKHDJKKIHEDKIBBCECGJHLKJEDLC8?E@?@@==CEMQPOMKKJBCOF>MI85GP==FKLHJMUQJTUIJQQOSSONNJBILDGJNJHNPIHMJKLKNXYSSRNRYZYW[]XZ`[TTPUUPQTSPMMPSQSYOMWVTXZ[ZZ[YYY[YQRPLVYTTWWZa]WPQ[^`^Z\cb`f[]e\]_da_adiijjokbededcjecechkede^_`ZWWVUY^^^_`\cgadghhdglfcfgcbcbcih`biswpmqqptpnpmpuommhle^dhrne]]_]ZV][\hkinq{wy|vsonuobkui`]\]bcadcbbb]_dph[hj[mf`popqiqpfhjomqtwytmv~wtsvtmsvos|{~|pnĽȻɻ̼ƨsyxwg_gdadf^]^WXZYPNQ_ZLLEGJCEdſ~||}}}~}|xx{ysopqppoligillljjlkkjhfeca_agimttwww¸̳ziӥˬԶο}tuli{x_xmx_V^rvipeaptu``X_pgWLYWWi]chfPUhaQ_f`a\QRSXRHPVIHTZULNCK]PLQ]YBSXVq^mquwyuroh`YKE=sqVM>Ivj`KUsZ;ifWtQayrsdMYb^oHFLO{v\Q_VFFOF>D;<>BEGKOPV[[Y_YLGGFEDA@ACDEGGGGFHIHECEGFFFEDCCBA?><:;====<2%"!   '29=AINPX_^^bXJDJJBABBA@;8=EJ]kpdVMPRBAQ`_DSCDebXPJKUP>2117=8;?CHOTXYYYTJ@BGF91BRG_[^a^sfts^jJhX^]PiSQ\vz^_Tmnten}rs\abuzc[ne^YGdjQ`meepp{{u}tackpyf\OYg__XBZdM[jdbZRj~OAWS]vkgjpbbdYWsX_ljiZlobadUOVgdzP_cfj\bbW^^^a]acXdnibedfihedmhkpi`QXgldTQlq]XVUWTQY^TT^c_[ajnottd_c`VKFGHHGGFEEEEDDCCCEIFEKTRPOJD>BGDBCHDAA<::;<<>DE9AKIMMLEAIGJMKGMSHAFIIC?;836?;//9ED:<@HKGJOG<=;8FH;=BDDAIEC>GCCFD>?JD=;@B5,7=<>87576?>9348>HF>@LHIOIJLPJKJHIM?EHC66BHAFJKRPCINKKPUJADB=A@?159:8::349>@CE@>@@??8?FB<9BMRQF=@D@D?9=<9=@?;:>BI?4E;;BG<9G830CILZEVYRRKOINLJJIMNILG@GETOJTWTLMAAK?===>??=?FLD==;=?BBABFKU{{||~~}~~}~}~}}|zwx~~}zwvwy}GJLEDJNKFFHLLGCBC@;<@>GNA?:39?@@>;=HF=BFCAEJHJLEBHIGJNMD>DNKILKPUXTONO@8JGKPJH?AIKIPTE:FNIEIA;IJECCAAHGAAEE?EFHLEFHHFBBEJHGJHEDEIQPONHEGH?@L@9IF56GJ>BGMQKGKSQJRUKJNNOVVLINH>ILBFNPIGLMGGKJJLLLU[XUQPTZ\ZWX[XQ[]RRPTPLKQSLGGLMMPQMJMQTTVVVXVVXUY\TRRUZYVVWWZ^ZWYZ]`b_]]adcg]`g\]`bb`cegggflk`_bc\Y`_]_`dgbbf_^ZVUTSUX]^^``\acbbbbaZ]db``ceba^^dffjmtvplqpkomjnmlsngcaj`Zchtpk]ZcZV[b]_qvqqswrv{ztnrrpqfftm_]YWbgbbbbbbbchqfbnf[kcanlkmceohitsruwyyslw|zxsprpjrwrp{~{xôõϽüȿĥ~qt|{bajjcgk]Y[XXXWOMOWYNNF;N~y}yxyz{zxttvwwvtsqpomkfdefhhhihggedca^^^Zgyo~~hwrɸпfֲɯոƒ|xopmguarmr_V`yzgn_bnwo\ZRgnYUV\TZkbgm\MfjSZ`bea[URSZQFT]QLQ]SdyEGN^PLPYTD\ilf]msmksk^ZTK>222ptRPEEsl~hV`vu9|psPxV`jl|oU[be{tcg^rwnpnhf[UUSWNL=?A>=ADJNUZ`_[OBFDCCB@?@ABDFKKGFKNJDCEFEEEDDCDDCBB>;;;;;::8( !!! !"!  $1?CCAAGNU[^`cc_ZRHIHE>=ELTXUOE=B=1>TEGi\ianseslZwfIbP]X`jMRe{zZWl~qq_ou|e[hb|~z|m[mhhQFhhK^]Zbos}wtwrlfpxsZVQ^f`\MCefPeg]_^\rk=GSIa}f_nn``WYfiS`mp`aoiZ_\TUc_wnQabdb`b[]`^`b]_\bmg^d`ffhe^ekjunh]W]gfTG\ud^^\\[[]]XW[[WSWcloqtlhmlgZKIJGGFFEEEECCCCBCHHHHJMOQUTMA>GGC>BDBD>9<<==>>H@DJGNMLDFJDKLKJNRKMRPPIFB>>>>7/4BEB7DKSSDGQB9>97EL>:AFFEKIE?IHKKD=AF?6:A@10:?C=5@AG79EFGEED@>BD@?EKIIGAFGDKJOSOIB@HF7.578;8636;:4127DKGCFKEGJCDHKEHHGIN??HG84?L@BJKPNEMRKJQSKHHE=DCA14::7::::9;=@@>=<<=??AA<78BGMNE?FLIMOKLLMMKFD?ALI>:I6:@B=>E79ALILMLIVRMJJNICMSNPMFIJCDA>CPMTYL[WMMIWTUHFLLOLEJCBFKUNWZSRSMEICDJHCDJHBEKGA==DECEFDEJQt}z|}~||~{||{{z|~}{~}{xz}|~FJJCGMOIDJMHEC?>>>;8>@EG:7408===;8=E?>CEBBKMKMLHGHKMPROKIIJIKMHKRUPMIJ=8LDHOJG=?ILJQVE5@LHEG:7HFBDCB?HF?@FC?DDIGCHIGCGJHLJLOOKHGKNLLIECEH?AI=8GD27GC;ELPSJFILKFOPGIKLOTPGEJD;HLCGMMEDEHFFJGHJKKSXSOOQQWXXVQTUMTZROOTQKGOUMDCGHJKKNJELSRQSTSRTUQUXSSTWYXWWXXZXX_^Z\^a][_cb_aY[d\\bab``bca\`ij^V\aYSUSV]]^`\[a^YTVUSRWZ^^__]Z^bcb`__VS]]^^]cb`_Z]flnlrrnknpijlknmirm^[`eYZbbrni^Zd]T]h`cy}wptwrwvwrluymoodnnb]YYdgdeedcdegnogmr__jdemffhefqnt|rtvuuunjvxvwrloqptwss}{ʸüɳӼʿôû|zwrz^fltjdgWZYSXVUMKJSXMKh~zz~zxxxwyxvussvwvtqoooojecbceefgfedcb`]]^V^ppr\~wyzҷȻŞl׵׿ŶӺ̖{nrlmapbwrm_V_|hfZgkyfWVRpfS\[YQ^kdjlOTlbW_Yjh^]YSX\PFXcULM`TZDMUaLHL_fg{}`ioid`^TMH@7/0@R~rqNPGMshym]rolGtw~NrdZasxsgfcj|tk}vjstia\YXU\XSIKG=88>GLOU]^VKEGCBA@@@ABDFKNIDHONFACDCCCBBBBCCBCC@?<::<8/7- !!"""!!"!"!""#"!! ,@LJGECADKKABZaLDOQNKMKPWVTK?49FLE97>>;?@AEKR_\<:AGZbgjibXNKQNHCBMVX[[[WPE7;>AG?7;:?B:>LGGGGNLLDKIBKMMJNRPTUQQPNLHGC?:6?DA@>MSUODDMD7::9ELB9@HGGLHDBIKOPE;@B@;=@8.6BDB:;EID7JMGFCGJC<>@<;BIHGFBDE=KMMMMI<=IE<4CDCGL:9IE;6=K?AEHLJFKMFHMMBJHC@D?B46:<:89??78=><:9877@C@=97:?AIJCBKPSVTQSVXPMUPELSJEMQHCFHGIIEHKOMQOLDS]JHIRK>FHIOPDFOMLACSONWRNQRIFKWXTEJPOOCCMFCFSTW]RMUSKLGITTJJQUOIHMH@>BIEDMKHIMi~~}}~}}~~~~~}|zz}}}}~~~~|{}~~|{~}|}FIGCHMPJFNMDA@<99;;5=FD<11009:7866<@9?FGFGMMLIHJJIJMMLMLKLIHLLGGNPMKFF<;MAGOHG;=HKHMWJ6>KIGG:;ICCECA=GF>@FEBCEMD@JKEEMLKLKNQRPKIKMJIFECFH@BH=9D@3;G?@BFKIIKGFMQPPPOOQPMRUQQSTVVVVWYYXVZb\VY^aYYbdb\[VU`aacceb_ad`Y]ijZPW[UNOKT[X[\YWXVYTXWTZ^[]]\\[Z]bfe^^j]Q][Z^]`a`a\[hohhpnjhkmhhjmoomqk[Z^_XZ\cj`h`VhcS]lbh{xqvwsusskiv{ikrahnc]\befikkfgjgptposrcgjdilgghlmqtynsqnlmiltqrwoiqxxxy|}ҿҹնξ÷~z}rsZjrwjedSXTPXVTKJDAU{̾}{}~~wsstttsrstttqpnnnlihfccccdddba`_][^bXdzp~Svn}`ٹǨ}ٳԾѿƸ͜zgvj~rdmcsk\T_xf]UiivXRS\qX_eWTQ`jfqcL`k`__Xme[^\U\[QE\lXIKaZKLO[ZEQ^w}Ui_NRVOI>23@ACEFHHDBKQJA?ABBBCBBCB@?>?>>><;=@8(+) !! !"""!!"!""""#""" +=KNID@?A;20IXV]_WRNKIPZ_hjdQ9/;JI<8;=<;9?MG=GQWK=CE@@ES`gpy|raRRVSMLKF?GFIBCC83
=DJODHSHEDCJMB;>>88?FFAAEAB=KMJGLG7;IC?>CFCDF@<:::656@HGEGMC@HICCHC;@AAAF78I@<6=I@A@AHEFFB?EGB74=@728;763444@C<:899<@GGCELPSWTQV[TGMYNGQRQSY^ZRRRRSRNPQONWOKBP`LEFQLMTEFQOKAHNLJSMHMOFBQRSOFSZPF?LPGHQVV`TGNWNLMGY^UNVYYUNPSLEDHIGLPJMPd~~}~~zy||{|~}|yyzyz~}~~~|z|}}|~~~}~~~}~~xw~EFCCIKNIFNJ@<:656688@JC6.455<:8:;=BB>GKJNMNMI@DLJIKLLLMLKOGFKLKJMLJKCC@=JMIF>AJHFDA@=EF=>HGBBGLCAJKHLNLMKLMPURNLNMKFEKIHLFEH=:B?5?H>?KSSLJHECA@HG<=BHNKDBBD>8EIDGKF?@>DDBLB:INHNMFLMGKPNQOIKLGPWKFKQSMJJPD7=?GJEGEELNKMMIIMNHHSSPQQRTXSSYWVTPX_YXZadZX`dcZWUR]d`_ffb`acd`aji[NRWQLKHSVSZ[ZYWV\\]\]cb\]Z]WTZ_ahf[^oeSZ\Y^___`cbckl_anlhddjicglmompk]ZYX]XTe^WhZQllX_kdk{|tsttqmnmfeuwchp_fnb\blgenqmlnllytwwwwlslfjmmmjppovojqohffflpimvlhw~{}ȿڼԴµô~~}tsrjXmtuhf`OXTU]VOFAQ{|xwz~yxy}yupopooprrrpooomkiijifedba``__^\ZY[n`X_{r~klxtr࿺¹Ĵִҹĭô͞tsuizzonctj[Qcn_RWijoKRUkdRocRTWbgouSPfd]a]bl^YbaS[\QG_s]GG]eI\RYWav}~zwvwyHPJFKE<43AVaY\jo^RNAhzi_sXi}gd[`}f[~rkkfrctNzklrvqjg^[\\\_XXWUSMJEBCHMPQMEB@@??=;>AAC@=<=AJKC>=@BCCDDDDA>=<::9;<;>B:)! """!!!"""""""####""" "/=GMPNIFCDHPJEONMNNBAQYT`wrXA4476776:=AGFNYKQT[uwmbapy|stmPDEFHF<65EZU;N^YBMXP\jnCg{SI{bTis~YgvvyOLxgdzzZ\Zaltxt{iSYw`qI^~{~yk{|YXs|oaQJhiQZXNRXcm\JKCS{tJVdVTQIXYRT_b`^n_]ah_X[]apbYd^Y`ha^bf\hjWW]kpabZ_li^UYcmjfohfgeghfYSSTX`ehok]e^CJYNReie`^]goonkileRIIFEFEEDDCBBBDCBCEEFGJR\_]XSF@LJ979BI@<:AG>CNOIDIJFIGJ>BLLJERVRSNMPQPOMOSTOHOGMJMPQNIMMBC>7;7AIHABCDLH?CHIIQWG@MKLJML?:A@C@CGKNINKCECELIA;>>43;CD;>F@?AHJIBKG7:HD@@CFHLMGFFKJ>@AHCBBFKA@FHCCHD;??>?@8:J;:8@::9769@FCCEHHMQPOQPIEMNGJMPWXX`\VWWWUQMQQNPXJLBQ[TECNJCMD:GVNJQSIEICLGPCGLHFBVPOLK^`H>FROJR\W\YDFUSNROS^[TS\_]WTZWOLKLNOPPRW_~}}}}|xx{zy{||zyz{wx{{}~{|~}|yyyy{||}}~}}~~|DDCDHKLGGLG>8434628DIMI;6?AAAAACGFIGHQMLOOLMJELICITOCBPQHE@DOLEE@@>CG=;EHBFKG@AFJMRPLMLMMRWSPOPQMFKSPOTQKIB@EB>EG@BKRMFFFC=<=FC8:>CLIAC?A=6FGBFF@;>=<;98;>><8447<@=68;=>>?@@AB?=<98879:<<=9,!  """!!!!!"""""#####$#"!!"-:GMMMNMPTYVB4@NMJF@>IA>Wp~lH63?IK@>DGEHUUD>LMILTK?BC?BAGEIKLOFADCHKGB<>?409BD997<>DECB?=;=NCEPJ==><73782:@<07;9907=@9557>??BCA@FMNIEEEGLHGIFNSTTUTVWWWQIJSNKTTJMDRVYLCIINLG??UUMRWJMJ?JML;LCCGAZQNHOeXBDOQMPZ_Y[KBMXR[XUZ[XU[__[X[]URSSSSVSOU\v~{}}|{zxy{z{|}}||~{vwz{}~}{||~}zxz||}}}}~~~|z{~~~~~~DDEFEKMGGJF@?;:;96AMVUNF@IKJECIMOMKJQYQMNOLMI>JNGGIKFCKLKSEAHLOJIJJKAFC=ROKPLHEMVNIPSRJP\TJE>CPPED=>;AEA<:5;=@KH>B<>:1FGAEB:8=8BA8C:3HJBLC?GAAMJEJJE==DMKSSKQPMKHE<6>HJGEGHHLMKKD?BDAALMISOLNNXVIKOLHCOVU[\`d_SXd_RPNMV\_]`b]YY]^[`kfYQLFHH=AMMNT[]`gb]^`_ab\]bXQILU\_afUYn^S[^ZbbXY\^ejjm][lhf_Zgi]^^^`amj`UOVZTSPVbcZZryjkhchuuorsjddccT]qj[dj`ih`\glgalloquu}yzxuplfajoumilelro\cnl`^dfigaciq~zý̶׾Ʊ}zqsluctz\\ekncfYTSSYQgõ}ux{xxxyyzxuutqjghgilllllljfeeggb]\\[[[[\]XYzXSrvkwx²ɟǛϺ˨ˮovksv`|~k[Qmz`NLmjfVZRcmZhhSW\UWjuUI]WScc_rkXak`P__URir]FO\VQks{zwmebZKWd:4707E\osmhgTPhqnXVLD\yxYalyvuchxqZo\}yn]Kccs]k|tkouy}uic``\XZYYYWUTQMIA=:<=<==;86547::6432230--244545778::9865678:=;72+"   !!!!!!"""""####$%$$#!!*9HMKJKMPPONGIQLB=BT>7Jde^q}~pUI@Pwy^edcSlmmaR;@A>MPO\ge_NDVWMUceTQLBL]OS`NK@AFE<:8<>BB>@JA<;527@D:9BB@G>AH>EB6;GB<=D@@E=:DJMQDFIF>@?CB48@>=CCC<898;@=@H01:4:;<457;CC@G=;:?KBGIE?>>;867:2;A?=>ADE7GNK=AE@9789;:?BA>?HKEABEDGNJCBHNNMNOTWVVUPIMQHLVQOODPUUQCGHONID=QSSQTJTLAKSF@M=ECH[NKDUbKDGQQNX`_[SFNUW[c\ZZX[Z\_^\Y\VPTUUTTYUNMl~}}|{zzy{}}zx{|}~}|zxz~}{}}{|||}}{{}}|}~}EFIHDLOIGIJJIJJHBBMRXTOLFMOKIEKRPPOQZYPJHMMKHEOJFIHIA;ILJQG@BIOEBMOG@J?>WQPZWOO[`WUUTUW\d^PG>AOSDC>AJLOMLGFJGJPRQQQRNQTPRUYYWZTNRUQMIGMOND7>E?::GLKEGGB8;IMGT^VTPMKKJ?@LMNNKIGIKIKLC?CAAENJEMJHKISQCFHIGCQUV]\]caRS_\NLHJRU^]YZXSPSTT[dbXRQJHIDT[XSSPGQ@?XvfwaYSg^YkaEMa]`;77HLJKTWSPPOMKIKBGLHMOCMWGGK>>EHDF@=D8::99ADCEF7=JICJOOJGNSKCLMC>@=>?EDCEIGB?>AHGBEG?96898=D?7:<@I=9C;A?524::>B@=?777:>@AB/1:24680349E=;C:;5AECH?=B?=96?>5.?CGPFINOIRZQGLNC<<E@TTKEDZZIKEPQRac_ZLUYZZia`_\]ad`^^]\WNNRRUSSTVF]}|zzzz}~~~}|xvz}}|zxxyz~~~}~}|zJKMJJNPOJGQRLOQKEJSPMIIJDKNKJIJNMOPU[SJFDKKIHKM@DKDE?6BIGKF?:ANA=JL?>MCGVQT^ZSZc`]\XVTZaccWLFBLWIEH@DF?@=?DERHFK=AIJMLJDBEBFMNNNLNPOKJPTUTTVQOTUPQMIUUOC6>F?9<>?61;:;FE=<9A5*CFAA;03>28?8:79A;<@9@=5>GHBAF<1AROIT][ZSOMQULLTPQTSNEGMJHNGA@95GhRJ`xmhefn~wlm^Ufx|gVOERdkzsUWjco]yrw_Ozpkfsb]@D?>G@3HORUWZJNA4:6@``6[p^EgjcDcQUpxreTfshjygegiv~htuztwîvjrh^_bdcQITNYfqdH\o_PbKV[eWGRaf]gc`]ZdVTZcjbob_daZkmbcXUbZcngccrvf_YVenYZjdXafilmcoecXhbTR\ikit}lZ]_MAJYYPMMQZgjhlmjlkYGCB@A@@AA@??@BDDEGHIMPSRRV[^ZUWXRKHHOSNK;=FEF@E?>;3;HHIIOQPOPPNKHL@AICGIDKSEDF;>DE>A@AD8;948CEFFB9DKFGNKJNRTSKGIHIDA>;9D@??CA?>>BCBBED=638<67B@844;3358=@<:@859;>CA>43:2.22.14:F;9@9;0@DCA78AA?>?HA86GIRXHNRRPSWMNSPDFLA?;@JCGJMKHMJJPQQUOGEEJJJIIIAC?GLMLJHMSKBHOOPPNPMLTUKPQNYXRH:>G?:>=;23@<9CE;39F4*@EC<4,39-8=:97:=8<=9>64=AE>AK;0IVMKQVYWRRQSZZTRSPRWRIAFNHJFB<14GPB?IEDF@HOEE@FPHQ_e\QLRZNGSUF@CLPPWXPIJLJFFNTTX]^][XSKU^ROVX^^WX]d[\gia]`_TNW\bddmgefbTTacbea]akhZZffcdZTUO^j[SW[QY`QR^aekjjmpnpnilkhe]XVei_jqf]UTVNVfZXhd`d]W[^q[[eilp}{wtsmpqohifolqciccce^efg\Z[ad\VWnþ½лoy|txputkYgwb^pkf`WRb}{|zxtuvuspnnllkjjjjigfedb`_``_^^^^]]]\\\ZXWWU^j`hzat}v{wl~ɾӺӰɮȫŤoo{pks]yi``ii_giOebobZXWXX[giSQEF]g_UhnWXidLV]WQ`qfTM_aRbqd^aVNPQN77b}Ugqkkqotlf]bwydXOIYpryzbKa]qkzy}lpdEtaTg_[BQo\ʨ}wrryxhikjkozeZYYWUUROMKLKI@60..///.....-,++,,,,,**,--../1111224655=G@+ !  !!!!!!!""""""#####$$$#"" "(8JWahjhd`]V_n]>AODKguriSǸXNh|]IYbISS]eed_vs]`\9B;8<]xpNEij\GmuGZkvj]Udsa`oik`wr~{xxpĵùze}jpegb[KI\UVav^HgkV]_?`d^IE^df_eei__dPX^aj_nedd\\nfeeY[ZXjjc_lsldYXVgcU]l^XcbgojljngcqVKPaloryp`b`PEJXTFJJMV_aafiit{q]PHCAA?@@@@@@ABCCEGHJLMOPQT\c`VX\YVKCJQRH8?IHG>C==53=EFFGILMMNPNJHMC>FEGFEKPCBA;CF?>>>8557NP=<:8;>>89:3469<=;A;7::;CA?;5:2*/,*/4>F88>78/;EA:49AABBEICEEMNXPEMOMMMLMOQKDKJBAANOCCGJIJQWRKJHD>;>;>GHHLNLMNOV[TLTWROJABHUHDHQK>6MLTH;GSJcXKEWQ=BQMOUBIYTSKKPHRa`TMne]dhWW[_hnfYYYZ[\XWVXVNFQO=ey~~zxyyzzz|}||}|}~~~}||}~zwwz}~~~|{}~~~}}~UTNPXWYXNNYUMJGABIJBAEG=:EKOGKPHJOOKQOJIIOOMJB@@KE4?H<;CFID:4;JD>CADRRO]WQUVVY]^UU^\UQ[`^^^^YSU\[VZZT\ULMPMKPHNH>DBEILB9BCAJMJLHJOTH:GPMMOKLKHQRGJOQWSNJC@C>==>:.8C<7?E7->J5.@C>95-65,8;=:7:;7<<9937<@EAKTG?JSNKNNPNKMMMT]TMTKKZQME=LMDEA<11FOA8CCEF@KQKG;GVMS_dUGHMTMGSWIBJUXUTQMJILIFLSYX]efb``^VYc\TYY\^ZYZb][fic`bb``bekljqlkkdX[iieegjlkaY]_^^bXPSMXdYSV[U[\LP]XYijhnolnf[dj_[ZWS^b^jmd^RQWRWaVWga]\ZWY\mX^fnvxxw{stlfpgkinlqpqekdd_aaiib\^ZigX^sƷƾκ|s}y~rr}trrjaWhm_amk[Xcý~~vw~~|{zyxvtsqomkjkjihhggefgfda^^^^\\]\ZYYZ[ZZYXX`al_rkpu{wiνͰٳ~xqptZxlfone[l]Tbao_VVYZY_gZPM@Qbg]Q_oWZg[CU^UVika[QboUcqd^\KKVRS>afv}mt{oxkvjaxykYQRc}}pRehrwtvuwjgiHyvXNZdUPCh̸xsrrr{~sinrmjtue[XXWWUTSPNKJKJE9.+.-+++*+,,,-***+,,,++--../0111124676>JE. !!!!!!!  !!!!!!!""""""#####$$###""!!"#):KT[``^TVVLFB7BJ8ByŬĖhŻjfcWNTUD<>ALWnwg\VdhHB989;FMIKFLTIGD:?9:ILVJepgDMegSJxcD]`jaUVezp[]nkrY{}}xv}lƨɻ~u`thoaPO]cRTjsTUja\gSNhb\EHgaf`cdod`aO[`_h^liieYcmbh`WZOYjb^amld_VW[eVUakZ]b`ipjhiydsgMN\hnmkfWZi`SU]RBGKKT\\Z]agt}n]RICBA?>??@@@AABBEHIJKKNPQS\gg]VXZ_WNNMNF9AMJJ=@==26>EEFEEHJLMMMJGHD>CDFGCKPD>9;JE>AGDDJE<05EC@CDBFJDEMJGO[VILKHEIJHD@6:L?>@?<7<=79EI@6203/15-1:;3*/=?1776657;::9;<@=87.2MM<9767<=07A5438;?=A@<<;<>=C>782+,*)-1?D46;63/8F=43;@BCDEFJPJMNSEFIJHHIIJKJGDI?@DLNIFFFHJNSUVWRJHA859BBCEFEFGEHUYPPVQLIB=BFSD:F?@CNK@9HLPF;ELFfYDEWK;CPJUZEIWSMFQJFPaZH_rZbh\QSYch``XZUR_^^Y_aLAGQ=By~}zxyyyz|{}~}}~~~~~~}||z}~}|}}~}}}}~~}}~}}~~~||~}WTKO[[YULPWURNLHEKJ?AGC67DKMBLNELONJOOOMLVUONAAILA7BI>;DGG?55:D?BMNPWRO]XRVWWX]]QR`^QR[]\\^`\WYZWUXYZZURQRNNOIPJBFCHOH8:FC?JKFIHMSTA6JNKJKKJHDKKADINQPMJH@==<:?7/?D<6=@31FK78DAA?:495079>;7;:7;<8636?DHMVYTQPQMIKHGICBFEKYULTKDSMIM>DKFIA>63FN@;A@HKMPPXK;IUSVY\MCKQROMVXMNV[^YSONQOPRRZ`cdeihcbeda^be__^\\\YV]ZZ]``ccdjhfkonkrnlid\bmkcelpld^^`]_Y]YQWUW[WTW\ZYVNT\PSfedlmhkaS^fVVXVQY^^ih`]OMUSV\TWc\X[STY^gYdjuztsvrqfdmbhilnpqnfkdd]]ckj^\d\ioqƿǺκzzuvvlqyqq{zl_WXeb]`daa~z}}zttuwwxvrponkiiihhhgfedcbba`]\\][[\\ZYXXYXYYZZacrqmrzdpzya|Žȴٸu}s~tUvohqfahS[]_iXMUZ[Z\[MTHJ[_dUOcl`feI?T_T\mgaX]uwY^od]cMShenavmuwzqeyyvYVYt|hr{s|pwrnk]lSnwWMQgRYChƥruurv}yqmrqkkzukd\WWYWUVXSPMLJLNI8+*++*))***,-**+++--,++--..0110124677>IE3" !!!!!!!   !!!"""""###$$$$$$$###""!!"$#+9HOPNI@989;?DLOEEWkǽʵwr`TLJT`H@6LLdbXi]RKKSJBA::ITMNPDFFEDC?E7LDCRNjkX?Ra^FOVEX[aaOXk{neUY{fktVyxsrsi×ĺm_wksfQYrfT]ogR^d^`fYbe`dLNh\labbri_`Sacbg`klk`Xmhaf[UQFZe[YbheaXVX``Q[ibZ`\almdftnj~]Xbmlkb_XSbmgcg^LKKEQ[YWWWcw}zo\MGFDB?===>??@@@ADHKJJKMNOQ\joj]WT[ehdSG>;EMLH=A?<28=EFEDEFHKLKKIFCA>BAFGAFNE<4ABAAKA@GIEGSWMDIKECMKFE@9EO?>BA>;<93=<;:C>761/+**,+<@15751*8B810>ABDDDEMRIKKK@EEGBDEHLGGGBA;GJJCA?@FHKOOPY]VRRG719C??FBBDA>FTUPTSKIE@>?EQA9DA>BLOI?ANJGHUB:CJJU\EIUQDIQ@DWaPKlbVbdPOR]a_]]TSHVeaYYeW>ANA4dy}}{wwxxz|~}~}|{}~}~~~}}|{||~~|~}{}}~~|zz|~}}}UQHO[ZUMJNQTTRQLIPNCGF:39BJH?LLJNQNMNOSRPZXTQHNQKEFKME@GKI:05==>?>>@BCEHJIIJLNOQ[gnpj[Q[clsmW>>A?FF?>HD<8?FBEEC?AD<1>I>;@@@HD:?GHBGQPF?EHCDMMFDBALM=?EB@@<59BFE=98368140*++2)%193*243104:;5+:A96/$/E>9855574,:<91/688@@HDCA?=8<=743-.**.*87-537/(?53..?CDFFCEHMGJJEL9;@B5AFEPZBHUH@RE9HZTJ[_SO^[LJUb][`WOJMZa^W__H?LO5J|}~{zwwxz|~~}}}z{|}~~}}~~}{{~|yyz}~~}~MIFQVSNIIKNSTUVOLSPMMI>7=AIHELJNOSNOMOVVT][\YUYXTNVYXQPTQRA:?CMFG[[RVUO\^UVUVZ]XNN_]NSZZZ[[ZWUWSKNSSXVVWRUXUMMVQHHNM<4@MN@FQHDDCLYF6EFGF@LGEG??FLBMJLZ\UVUXSLCFOD=B>:>DPWSOE:?JAIPAFTNKKMSSOIKDEUWOKWZJGOOWZU_ZJPUSSTXZRX^Y\SMPOT]adhkmnlkhdceeddabd^VPOTVTTVWWXX_`\`bY[gjehfba`^^ae`]ehga\cklikecidfhhgdbZXbeXTW_jnlnplb]h`OX_SSUVRSSUgeXURJMRYQQYXSWVW_[hfmxvsnprrmc`bYjikigj^^kg`dbhmpiv|ǿ±Ʒßěto|tkqskotrollg\UT[ZRZs}}}|wxxvuuusqmkkkiihfecbb``_^\\\\]\ZZZYYYZZXWVVX`_ZY^l}{{{mmvjwʲɭнl|ǷvzyorptugdScchTEMY[SQLVlPIWb[QI`on^SCeobIbp^UtqezucpiWjkhy^j]pht`fjn}mOLXLEWɾwosz{vrsxtsogiklnaUVZXWY[ZTSPPNIIMG2$'('&$ "  "$%((*-..011103569=BG@." !! !!!!!!!   !!!"""""#####$$$$$$$##"""!!"##&*4@IIGO^gbVM@G^irȾҰf`adbPDNggXT^kbe^hSr{ENK?999@JJGJKFCCCA=<>>>=@DFGHHHHJLNOSZdinsi[Y_jqxs^GECCAAFC:B=BEEEDCBEDDFGGC?<>@=GF=:DD=?ACDFB@>@?7:KA697;CF8>GGHEGJKA;FHCEMMFDDCME;AEC@?<;AFFEEFDA@E?;62-,4,(166'(54.-3;=- 3?7-(%-?79627641-79:23309<>EEHG@=:89744+0))/)50)027..@,.*-=CCIHADEGEIJB:>=DGDFD>AH@@HC;=BDEIOOQVWV\e_I<=@>=>?C63LRE3=CAMVAHUDCV95MVJN]UFJaPIK[b\]YPJFU_^TZcWBBRG6p~~}{zxyyz|~~~~~~~zz|}}}~~~}}}|}~~~~~}~{xwx|}}}~AAGPOIHGHJNRSWVONTSVQRI??EJMQNIPPSMPMOWZV\Zb_R[ZYV`[\]^ZU]GOJRWKKWYUVSO[_USTUY\XONYYOSYYZZXVTRPMHLQQSUTSST]XJPYQJNRD5@QVKBMOGCBDOXBAJAC=EOFCE??GJ>:GF=BKJ>65:7/2?AC@56/1BJAFQHFMMLF@BFFGIDDEDLDAICB=>FPTTOGB?FCGTGKZPRVYaYKJI?JYRGHQSJFMRYYUd`LQURRPT[QU[UUPLMMS]cdhnqokifbceeddbba[RKLQSQQSUYVT``X__SW`fcdb\\][Z_d_^eggc^dkomohgnhhmqlmk`aehhe`hxwsrrl_Zd`QW]RQUWQMJOe`QQVJPU[SY\\b__fhilk{yz}rqrtsnhb_ellljgfbdmkhllpzyŮΣɦti~}p~dosmqsnmkf_YUXUM_~ywxwuttutplijjhggfda``^^^]\\\\][YZZXWXXXWWVWX`d^WU\k~s~|̨̱ͽonɻu~nxyeXkhhLKU[VLMKYZLSZraLHZie[QDqqYgq_lychuphwrxrh}k}~}ilr}_ZqintqPMRL?|¬pkotzzpq{zkagnsufVUXYZYZZWUPNMIHKO?)$%'$!-1-,-)$"!"$"$%&*,--/001355:>BGA, !!"!!!!!!!!" ! ! !!!!! !!!!"""########$$$$$$$##"""!!"""%'*7HX[gmh`V@7UhnvüΧw~~ZQP[aQJXvjT[j_]tuQZbJJG;68;@ACDFHFDCB=MnjgP5RX^bNg``SMCSuachdzЮq[[sú§lmepb{~^[{yu_Q_m^k`kgWKjqbsrbVvi^`pgf`ofgjekja_il^]dREFNY_SQY[YSPSXOU__YWSS^hfdehjsecrokfdee___\aiiaWY\\WL9:MhiZbtslifeWLE@>?>>??==@CGIIHHHJKNPT]ejovvpT\rqlweLDAACDA@G?BDCEDBBFEBDFFC>;>@=EE=9DDD:>FLFHGDDG:9JHAFLKEDDCL?9BD@???AEFFGLPLNMQRGC?9961,243&'43,,29;/(94*&('<1690690**554/202;5<@BKE?;;71141/++)/)3/#*/1.86'+*09>ELIEEBEEHI@7<:B@;=FFBEC?DH?EKB;?BBDJOMPUUU]e`MAFH?9=?@18;?JNFHHIIQ`UNIL6;LF;ELTVWPIPS\[RBB>FFVN89?:NPDA=9=?ACHIHFGHJOPS`jppjjyoYfmcky|hKCCBBAIIBCCCFECDKKEEFGB<9>A?DF?;FC;>@A?;8;?DANP<<3,8E?AHIG@GD@BFGFGHJLLKLNPTKKIGG=7362-',0,*//031$)5,%(,(5-48373.-,/0.+,2?=565AFGD943/,0//+.)/)1-!(*,0=8$)368>EJKOKCDDEG@6;9C>8@LF?AABIBBRMA?NKSO=99FJKMIISIT:=LMQSFBECGPMNRQNQWX[Z_[VVX[`bWOXTQQKIKT_[YYQdTTZ\]\P[gg\\cYX___aa\X\TTPP[VJLNOQPLINOORRUROQNMLKIEHMKNOIKKOXLFTVRTXSPVZZPLQQPRQPTVW]S>XJ>=8?HE=;@HJGHOXVPQSSUSRONKGMLNJHRVVMLRSSOOTVWVRSYWT\ZTYSLMPGESPISRHOVXRCEC>JOKLVYXYX[TY`_c\W\XWQMWVMJHCINJDBIKINWYVWV[YKPPKHCFLFEMMJIHJRZckjkmnmgfd`cffc`cda^ZWSOQPKGPaVUaYTYUMKU`^YVVPQLL\aegdglqvjfqmopovmiqsrqprrjs{toqtw}rq`SXd`ZUONRUOHCM_TJQ\\ekgknksytxxqstwy|||}}~{yxuunhvwqvvty~xϿ¿ëħl_xyhlh`nvttmahj\TJJmzyyxtqpoliffhgebbcccca_]ZWUVXYYYZZZXXYYXXUTTST_cdb^\b[\uovm˶Ҵư~z}{zi{zŒ}soyxgeVRNBES]OEX]VFXQQ]ZVVDMUgt^XbpYZkzgmbO^jvwjpx˼}}fWmpUwucUaOPʫ}{ummt|wmkklklmmknqfWRUWVVWWYTLKLJILKE( AfdRR[cb^[[^LC;6.'(,./12356>@AA?/ !!!!!!!!!!!!!!!""""#####""###!  !!!!!!!!!!!!"""""##""############$$$$###""""!!""##$$%(6FHQV[YSSk~̹{^KKMdtiymYitp\VTQH;528MYTE:;BGEDG]i\XI8:CH^rl]kVguRaUUebfCLYcbGX`Wvt`|ohkռmRdȾtvqah||i`mrnkawus{gqkbVluZjri`ie^hzwpsppadk\eZUYim_\bGCUVY]CNWRKMNTIJZTOMNVcd`aa`bXTcyc]ksobTNTY^db`j^R`hN;O_VKU`defimmieZLCAAABBA?=>?@EIGEFFIOQRZenk`\k~p[UY_fpj`TFCECHHFDBCHFCGQRGDIHA96>BADFB=HC:<==;9@P[MQC;EKHUHB8WVNJKP[UNL@JEPPPTZZ[SLRIf~{yxwwz{{{z{zz|~}}||~}yxxy{|}}}}~~~~56;BA>@DDIPLKJKONXVXY`[Z\aacf[T]YQQKJLT`\TXNZTSUS[ZKXgdUZ\WX[X[_a`^_WYWMXXGEJLKHGGIGNSNOJHKJKLKFAHMIPRJKJLPIGQTSTTUXWXUMPQRX\ZYZ[\[JDTELZ@>EFOSKDLVVWVV[_^]_bilaZXYTP[^VKPZVXRQX[\ZVPV^WSV_]Y``[[VQMNDDRJFSODKSXXINPKWTQRY\Z\YXYZ\`c^WWUQKCNVMHJDDMOEBKLLS[XRRPRQHNMFE@@FD@INLIHOZ`fkihhiife_`ceda]cebbcb[TVWSOVaWVZSQTOKIO\]WTSNKIM[`deadhnuibohkmlskdijlmjmreitpigms{{oobVV`e[SLMRTRF?N\QJUdinnlosvwvvxumnpuwyy||xusvpjsxvuvwyŹƲԻ̺|iaxtec`anutsi]mm]WYý~~~vwvtqnnmkgeedcca``_^^]\[XUUWY[[ZZXWVUVVWWUTTRSZkl]V\d\X`ms|pǚ˵zxu|ys|zuunwrpXNGKY]P;Jb[PLWZecX]iTLY`VYX\hZh}doVQmmy^HNm|eutɰ~saqzUuwkZ_Moˤ}uolpqgbgmpnnlkqunaYVUUTUTUTPOLKKKJI5%LbgYS[`dcfipa]RG=6/+-034456@FA<7/$ !!!!!!!!!!"!"!!"""""#####$#%##""! !!!!!!!!!!""""#############$$$$$$##$#####""""""""##$#$&*/7EQSON_zȸÛ}dLI[soqnoj`VQME8:IRZehXIGECDHQRPPK>9FPSsqqgl\cmMg~[dml^:TWo`Ol[Rvwm|mzl^wtMfǾqys^ox{l_kqnnj}xwzfn|jPgq_jqi_afhjwvtysj_agY_SOWgl`^\EC[WbTCPRNFNKREQROKLT^fa`^__[NUriVeql_UOT`d`^^aYPi|fLZf_RQUUX^dlonli`TLHA>@CB?<>?>@EGGFDBDMURZnsg[[tmV\]^`ad]NIIIIEEHEHKGEISTIGPRE;9>@@EDEAF=6<<<;:?HFDGBG=4?EKPODED9EB>@:3E?CIJ@1/<=3601/*++30'-/02474-3<;:>HQRMEEEBC>8<6C<8DLA8>HLHLLJJINMGJIFIXUILPOSTI?ITF9<84886?YMIJNTWNLAAKKXNJV[VXRTQ[||{xx{|||{zyy{~{{~~}}xux|}{}}}~}}~}~~12:@?;=ACJNLHDMSMVURW^YZ\bcbd\Q_\TPKPRT`^PRSTSSRMYVDTc^KUUT\VQUXZ]]aXW_[]]QJLJCACFIHQTMMGDIJJLLE>GNJQRIHIJKHJRROPSWUSSNPQPW__[Y^c]RKU^T[VBNY]c`VUbd[\_]]\\]aiqmaZWVSR]`UHRZUXTV^`bb[S]dZTWbc`a__ZZUOOFITLKTNDJTXVO]\S_UOSZ\]^ZWVTVY^]ROOLD@CGIHBAHVeabsky}c^aa`\ddVSIFLFCMMPOIFJRQFIUSHA?A??ECD??64??><:>BAFHG>;GKKUSGBE=5AE7<63AB97?AAAA;=I?ERNKOL@:?JH;;CAFKBEECJIFKNNIAEJOKDC?2'/9664,6(%-2:?2,-3%,.,#-67::/+346:?FE?67BGA6;752-39337997598-2D>5;HQNKIGECA98>5A>;DE98ENNKHGOOLPOKJIHV\LGQOJOOC;EPHDC;/569?<>IQPIFG^fdnkVUP@JQSGTRJb\\he\QNNC^TQTUL[TCSI>NTPLTQ]YFRRM]PKQUUUQYVS^b`b_UOHBDHHLNPPLNICHJHLNI>DOKPSKFINKGNVTOPVXUVSQTPR[_[Z\__VRX_^^_VR]cfhb[^f^S\aYX[[Zbjjga[SMLPXYXNLQR[ZX^bcbaZ^c]US^da_ZZVZ[TWRUXUVVRKPYXW]h`Y\RMRY\]^ZWTOQW[ZMJPLA=GQHGNHPXVVQMQQSUOJGDCCAMJA?8@CA:ATZRT`dcgfbba_[bcZ^da^]Z\aabed``a]\aa_[SSXJCFEHLY\OMHNEER]bhne^gjmremd[d_fd\XZcc_`i\WliZXfgiuljb]\Wc`UNIRZSAATYS_lrhjklnnyyruujglhltsmv~~~ztvwupo|~}ͻʴŝƶy{them{kfdfkmqtt`Yr|{{zyxxxxxxwtnllnmlkjjhda`___][[]\ZXVURRTTVXY[ZVUVVVVVUTV]bX`l_Xc\S_Yy|poryp|zzortrt}ʴØZpieFuxZ?Ib^WZFMdmbiW`fM[]qouwtyxy}oSW:P~~invYx]eYsƻ~xtqppuyvnlu~{qikkc[[\XVTRPNNONLLNNGL7$6BOZYPRW][YY[amqcPIME:3236=CEF@1 !!!!!! !""""""""####$$$%%%%%%%$#"!! !!"!!!!!""#####$###$$$$$$$$$$$$###"!!"!!!!"!""""###%')+1=DY̿oqxccwptjYy~{utuje]RXaL?ABBBCCCDFJQ`nzzc\`ng`h`XIERH>NSSMGGKOIDLPOLJEE@>BCC;;46ADE<<@DFII@;BACFKGBOQKLQI<EA=7=DHL;@ACA8BA;FFGFDCGB1;MC63@?MTJMSOLIMW[SGKRJFMK@9AOMMMD107@@?@JPLAGTbWZmx[WMJISRLRQKfU[]aa^[SAW^SN^SYU=QC9UYOVT9U8HATKBGHPTHLR?CPM`JBQY]SHKq}~}|}~zy}}}{}}|||~~~~yx|~~}||{|}}}}}{wvwy}77?C9:GIHKLKFGSTNPOHUZMOX\^\[WS]ZSNKRNQa[NORNTRVSTL;SXSHOSH]OGRUUQHPPOX\\`^WSJENUPLOMHKJECHLJLONGHPMPUOJPTOJPXVSTWXXVUWURTYYWY][UQZ_Z[\ZYY]b^[ZVX\RTd]QY`YXdhchgWNJJNVUYXIISce\[ab^`]YZWNMZ^[[UUTW\[d``[^`Y\UY]U[hd^[UOLOVX[_ZWUHIUUXQJTOEEKOHMQMX^^\QPQPQMHEDA=>@JE==9@B@>H\ecbecdf`_a^ZX`d[ad_\[Y]``beedeea]ei`]Y_`OFFBHNXSIECLBES]fgif\flqxjgaV[X`aYUVZ[`_e]SdgXTa_dskgb^ZUb_VMFU]RCFY_[hkjihilnmttmstefnhkpnmy~zy}|tuz{}|wzy÷вùհͿò}xtzdbszfgfhljjpn]d~{||{{z{{z{{{yurolllkjihfdca^\[[[[\ZZYTSSSRSTTSUVUUWVUTSRRRWcb\hgW`cdc\fuqsqsøƻŎpwpx}o~yÐkcrn|VXoVXp_T[FOjqio~~jso~uplzq|_GISZTPSZYYY\crsgZQLKF=21=IHB?@9$  !!!!!""""""#"#####$$$%%&%&%%%$$"!!! !!"!!!!#$$#$$$$$$$$$$%$$$$$$$$#$#!! !!""""""$%$#%')*5Q_sžrflo`nwȸ{xqpmlib```Z^QHajihhqrPdkEfmK`ukaYCinIlUZ{aej_[tiVsjkkGvq}cx{u}mci}wi{mn_bv[UjX^iZb_frqovztje^\VQGPPYcfZIIMcY\GEHPBIEDPSKEEZVSh_X][`QUit]pi\Zfgee\btslkouriikleY\c]UX\]ctumijif_UJ@>?@BBCEFFEH\z}zedq}kdfaRJVK=JPOHCFJHCGLKILPKGB?@A@<>8:9AC@<3::81<9:DCJQQDGQMINQG?@AC<7<>CGB@CEMOFGLNLIUZX[[X]RG<8630+,8157?9:@;8<>7?FCLQPM@EP@>65BAF;7>BFK@CHLMFJIGPOTTNLUO>GSL;?HIGEEFDC>59>4?>>@61ANK?7DSMGMRQOMPURLIKKEDKH?9=KPRTO=49GAEAILG=P^QJ[mx`ZLQGSZQQPNcMVVYab_TITdYH[ZVT:HAV}{{~}~~|{~}z{~~}~~~}|~yy|~~~~}{{}}|||zxvwyz|}<=CC=FOHILIGDIVQJNNESSGLV[ZXVPN[SPLMKHPYXNNORUTXRUMBXWQKOQD[MERTVKIPJMUU[]SPVRIMWTLLLIKGFEFOPOOPPOQOQUPOWVQPSXWVWWYXTVVRTTVXTX^XQV_[UZXVWTXZQTUQSPScbNN^^SZgfbiaOJJKPWVX]TMWij_Z_a^]WVTOIITWTVSTTRU_ha]Z`a^b\]_V\f[\[SQKMQSY^ZXTFFOMRSRVQNOQTVZVS[``[UUUSULHLHC<:>FA::?IGGOWdlnkedeb\^b\VU`d\ba^\\\_abccfhifbckla_hnfXTNCMRUJHEGNGKR^ic`g\bkqzn^`YXW\_XSTTVa^`\T^eXQ\[frkgbaWSccWKM\_[NOcfbiegggikomoomrsbfogghlt~|xz{wy|ļӻƳǽ}xk`]uxefgfghhmmp~}|yyyyyyy|}{zzyuqmjkjhfedb`\YXZ[[XWXXUSSSSSSRQQTTSSTTSRRRRT`f_a]VZannSZxwvwОkzy|uk͛ˬ_mt|Zu{_ggZ_IYs|zjpbx`xhgxz^Tfwl{vwpj~|zqZ|V^[̻|psz{vnnnkzpippigebfh`]_``[SPQOKKJJII93:CPYTNQWXZ[X[eWPNLHIKG=;EEC?BKJA% !!!!!"!"""####"####$$%%%&&&&&&&%%$"!!  !!!!!!"#$$$$$$$%%$$%%$$%%%%$$$#$$!! ! !!"""""$%$#$&+4Fsϼ]a˴~vhx|źzwsikidb_^^]XVR^qcbofa`Ok`LtaFgmbZOKTNbXXzeipg^glWo|nnY}~olwmy|oxlapshx`q|Xo{jV^dU[_\c`mwqoy{vlgZ^UMHPMV`dUGLRbYXFEIJCEAITMGGP\P^hU[``_O`sidq__^e\a[f{ylmrtohegmmhioqkca\apsebgkige`VIB>=?@CGIJIJS^uztsrommp}zx}qpl]SRL?GJHEACDA=GIGEGROKEA><<@E@ELOOMMRSQOKFIMMFB>;=@<:7@EMKFJJMJO[YW\[Z`USLJ@90*085;;A;>HFAELHNQSVPOMGSQFG<>IB?FIMNIIRQINZYMKXSIN[TBDDHGFIDDC>4797?>?803EPE5?OPIHKQROPPONPKFEBCHE@<9FRSYPEB=GEEAIIACWU\]RYALO??EMACJKRNENMFFMEYGBPZd^E{zwxy~~~~}}~zy|}}}|||}~~}}}||~~}}}|zzxxxxy{||ADGAETOEJKFD?EXNIHNCTPCHTZYUTILTKLLKHHNRULJNSTXZQUQQWYTKMODSKCRTQLOIFMSR]^QMRTNKSVPKNPPLLKISUONQQPPNQTPSVRSTVYXXYXYUPTTRUSRSSY^XQZ_SRYVVXRTLLZSQSP^gSIY_POckd`b[PLMMUZWZacUXega[]]^XQVVMFFSUNOQTPKO\bXSXYZc_W[]W[^U^ZTSJLNPU[YVULJPRSRWXQRQW[^c\Y\_a[Y]\W[TRYRIC?BG@;@JOQYacipqkbcfc\]c^UU`dZb`_^_`bcfeagkibafonb_qvjcd`MPYVMOOU\]ZX]f^_f_^ejxlX^VUW[^VQRPYf]\ZX]bTMZVeqjfcbYWccZRZ]cgZXjhfhfjiginonokkrs`epgghowww˹¼¹DZ¦~|xc|~[]xwcdmfbc`pû{wvvvxxxz{zzzxwtomlkifdb`^[YYY[ZVUUUTSSSSSRQQRSSPORTRRRSRS\b]`XXdhhpPTضysvy~—ufȹӣֵezaz{v]uscKQo{vuxnZlqeyTN[gp|trypmh}r~znXwWYbposrjfloqsxkktsihjhgc]_ba_\WTSOKKJJIKC33?BFIHGEE;<RNmÿfU~zҿtvkaeecb_]ZVTTRg`^]cXc]`gbVsUHo|aaZJ\GQd`V}epuubVk\l}ot~tlpaq{tu~ivpilokp\sqZrmd[]`WX]dddsrnq~|zqnfXbSKDNIQ[cRENU`WTDFGDF?CPUIHQTQOf]WcecVXpoapdf^]WY]g{ynprqolediqpnryyoc[aomgfghgffgfaVI????@BEGIKGB@;;FEDCDQPQLDA<<37?::6:DA857689::GCILKE<A?@L>CJJLIEIXPALYQGLXPHO`SAD>JFFICDA=656>2-7FI;;MOJDBIPKJMOOQPGCDBDFCB>;DQWXHFNCEK@@IG@MP@5S]elc[KTZQZLSMQ]QIFMJS\YS[Y]TXXGS@>@@^ZSJEPLB@GIBDLKRRKMJEHABVGAL[^Zp|uuw{}}~|}}|||}~}}}}~|~|{||~~{|}zyyyzzxx{||}IJGCOVHCJHCC;AVLFBNCPM=CSXUPQEINLHJIHKMPRKGNQR\XTWVWV[UNIOFOGCP\PDNJCGQZY\ZOKQSRV[ZUUTWSRTOSVMITTKLMRUOSVSRRUXXXXVVUNOQSTQMMRW\WQY\QQXQPURMFQXOSX[b[MV`VIVjh]Y[\[TSX_b__ai_V^dcYYZ\WMTYQEDQVKELQLFIYaRKRQTcaUU]YZ[T_\URIKLOTYYWVVSUYRJPWSPQYYZa]ZYZ]\YZ[Y^YZcZOFDHLEBJRT^ehijppg^cfd]\b^XV`eYbb_^beefggcege_]flkb^qtliopZU^]X]_ehol`]f]XgbZ]_nmXYPRW\]SRPPdj]XYacaTQXTdmjedgc]ceZZa^fg_`igjlilhejtqqqgdos`dogflvz~Ȳ־ǵƼyzvau~dezxego_Xct}zyyyxxwxxwwwvvwurnljec`^\[YYXXXVTSRRRSSSSSQPQRQQQRSUUTTRPWe^c\]~yscə˜Ѱöq}e||cĴצټ•tnf~zobt|Xgwhokej|p^`[`zzxjnnldltpxsuy{m_y]WjyκƷstvqjgilnpqtsurgegda__^^^\XWURNLKJJJJG9/4@KLECGHC?>=;;<;>>AEIJFAMxvU=76B_syulam\CMHEC?CA9;FCAACONSQLLEBDKLILOQPPNHJNPOMQTEC@5FCGFA?7:=7AMBDOHA@AB?BFA6:@HFAGFHNQYSOPPPOWRVYWUTQJFEFLGHJKOMNRLIMSKFOKBHWP@IKGGMAHJDIKDLJLKDCKVD?JOHESRHGPZI?:?LEC@CC?<66:>>?:2-9C?:HNHB=@JIBDJNRLA?HJBFEDD??DNUTCGSGIKL]QPZRHOV[^``^\TRVUVUQRMENUNIKRSOTZVNPTSTVUQTWPLNNMLHIOSZVLPUPOTMKMNKEQULT^`ZOR]\RQaf_ZTT[^\beghea`ibWZae]XZ`\PR\YKHJTP>DLJHKZ`NHPNR`dZT\\YYT^\VPHKNRTVXXXXW[_YMLPPOPYSXaXUUTWZRQPT^VV_[RKHJMLMSW]gedghlla[ddc_]][]X_fZce[befhjfgbcba\Vbgic[nnginueZbgcijklmqjefaR]bTSVbk]PNUWZZUUQZmh^Z]mk`Z\ZVbehdcli^be\eb]geikkjnmingejtqoma^ipadminr{в³ö˻|vvesrmxzkfh]f~~~}}|ywwussttttuuuvurqolfc`]\[YYXVVUSRSSQRSSSSQOPRSSRRSUWWWVTYf`fieչŬڽûvz~`ðpb̰ӧut~|tn[q}psmkvSgcwy_n|{~jesregalmxz}tu{qwzpkvykZksųŪ{yrmhhmqwvomjgfc`afe_[[ZWUTQNLKKKKJI>/.8EIEAAA?=;;;<;::AFEEDA17>CIORC-: !!!!!""""#####"#####$%%%&&&&&''''&%%$" """""#$$$$%%%%%%%%%$$%%%%%%##$$$#"!!!!"""##$$$&%$$(/9PgȲ՜{~m]ŷxxib`a`^][YVTQPQSWRjZNhj_j_dgoMLm^VucB|x>Oucbxaoj]^lQdtj}v{Ϫygq\dojljznubq`xkvllvdffgvedd`QP\PMZge^lpfjtzutech^dhLOGQOOSYPEKSXOE@F?=C;OQJEQRQP`]YcoaQf{g]sbmTRP_fllimmkmokhippjnwyqkihgfjokhfecbdfiicWLC@@@@?@CFGGTr|wrjK4?EC?;?<<6@BF?AFEHOTRNKNPNJVNPZXVVWLEKRTKHKMQNNSIEJPHFOI=HXG8HKIHHKPMIOJOPNQIDFLK;FGEEJSIEHJQE;7DGB?;?C60-5<9>ID>9CMTL:8@LKDFHGDCDHKNPDLSJKE@ICERF53OHSe]]XPJZKKBHDFPLF>@DGQMOUUUQJaIWLT]QdY[JHQGLJOLCEGJS^_TPFBAIGGDFVX}wvx{~|zz|~~~}}|||z|{{~}|{yxxz|}}~}~~}~}}UUWZXKAFKFBDAGUMKAQKHA5CLLHMOPTKSNNOOURPQKKRV]TUSTTY[a^_VQORFIRTNIMM>9IUMFNOMSZ]adb^\RJTSOVPPNEIUQEJQLLVZTLPSRSSRRWYSNKFDFFHLOSRHELIFMJCDKLFNSKS\XOKRXVST_^Z\VRY_ajjhhda_eaYX\fcY^idVT^_URJPXC@HILR]XLOQQX]a`XZ][XS\^YVJKSTSTVXVSX]]^\TOMPTXPX`QOTMQXLHKPYQNXVTPKILNPWXci_`bbgi]Zc^``]YY_Y^eZcf[`fdfjegc_^]ZR^ee_Wlibffjg]_kjhjehgmkkf^PQ\PLQZg`LS^[Z[^^Zemfb_gskded\Z^^_^cmh]ccegablmvxsrtplpggiomlh\\gkckooȷçtyls|ztvzk]j|}~~}}|ywvrppqrrrrrssqpppmhc`^[ZYXXWVTRRRRQRSSSRQPPQRRPPRSRX[]f`uhf{Ѿ¹̹Ψ͹n{e»ipʭɧؼǶ|xearvwgvo^igwdyzmacuvb`ccgs~zyv}q||yp{vqkhv`goĶ{vspklpzwmecefd`cge^[YZXURROLKKKKJKB1+4ADB@A@@?=<<<;;;?DDDCA24@>XIFJROPWaZ[jm][uw^mif^NNWb_felmjkmligjnjefknlhebaismdcbdehiggfc_WJ@>?ABCDEBGnvcTDLlzpNIZ^bfiktyvnfe`zqNTLNMNRMOROLMPSNPVYZVVVTTSNKLSUMUTRLUTTSQPOOPRMC7=F7,89?=>AB?;89:4+125C>6BA6=EB=;:=<;>?A;AFFEKOJIGIMNGSMKYWUUVKCJSRIGMLNKJPGCJQFHOD:KVB8IIHGIPNGJMIMLSTKIIJB=IDACIGCFFIPLABGA>7;G867=:A9>C5/,387:<879?D@=?GRL85CIJHCGPOFHKJIJKJLPNHCHLFOQ6/CMKN`T[TM@RGC=@<>KJG:;ACHGIQUMIGaNWL\]\c\e\WZQVROF;@EKS[`YVF?GRFFEGOpzwy{~~}~~}~}}{|~}|zyzz|~~~Z[]\WNGHJFIOGJUOOFVKD>9DIJGRRVUMSQUQOXSONKNYXaZZHOY\_b_cbWPUJNUQIGPN<;FJOHFLRX\^_b`\XRKPNHPPQMEFQREHPFGYXMMRSRSSOSYYWSNE?EJGEKNLHBCC@HJA@GLIGNJQWMKJLOPNOYYW[[[`gdfgef^\__^]WVcb]inb[Y^a][QNYNEFHMT]WORSV\[]`YTZYUO[^VYPMROT[UUWTX_^_c_UMTZXNW_MNTGMWJEJMSMLROPOLJKJNXYfdV]^[cg[[`Y\^[WX\Z_cWaj`cgbageid[YXYQ\b^[Ucea\`b`]Xjk`c_ffeffdZQOOLKMTcaV`e``hmfemhfdbklcimg^\Y\[Zdmiadfgffmsw~{xwwtopkjjkkmk^_kmp|zqĹ¾ʴ;Ȳöưszzqov~trjiɿ~}}|}||}|yxwusrrsqqpppommoonid`^[XWWVVUTSRPPQQRSRQPOOOOORQPSQTZ`sps׷ԽѹȰtg}mě|ézϯǦײtbzx}]gz{i{hoqr`ZasnZ_c`kx{wzw~gv}ctyp~q_b{dbmïvuuroosxocadfda_`^[[YYXVSRPNLLLKKLG7-2=A@AA@@?>>=;;;<>BDFDA85?EEGRXB !!!!!""""""####"####$$%%&&&&''''''&&%$##! !"###"#$$$$%%%%%%%%%%%%%%%%$$#$$$$$###"!!""#$##%%%$+NzθʥĢ||ֳvzv[~kike`_]ZYXVTRPORm]bZjvfn}ZVurNP_S]~QU{XEVuiaiigesQ[tÝs{|skluaNfe`Wkzkwlx}cgud]fjiYced{a\XTQPWOFK]c[cg^hegkod^cbdmcX_P[aSIOVHAJVK?DDA;6<>0*,-6>55<31;@?>96E@::;>EIHBBFHLEMIESRQPRKCENLEGMHIGHNEAKQDEK@8LR@;GFEFKMH@EEDDJSQPMNL>DBDB@B>EBBSQNJNG?7.:@17:?:A;893/+5;410248<;4BNMIEAFUTJIKJIJLMJNNFEIHLXG.6MDPI[MWOH9LD><92:IKI89?A@BCQTEDH]TUH]Wa]_ilfc`^[PA5=HNST\]YE@JVGHI:O~zz{~}~}|~~|~~~~~{{zyz|}~~~XY[ZWPLNNMUVLMSRQQYJIDCJLGIWVZVPUQWQJUSMMLO\[_`Z@Q_\_`_ae[RZPR]RJNSOCBEGOLIOTZ^]]a`[URMJMHLQPLGELPGGNDG[SHNRSTUQMQX[\WQJBDHEDEGLF;:>?BKD?CKI=GHMRIKJGGIILWZUWbgjkaabccWV]ZY^UQ[ZcqcXYYZ_a\VPSVRIHLN\_SPUWZZ[_VLSVQKUYQVUPLGSbWR[VWabaa`VOX]YMU]JNSDMWGBHKMHGKIKKKJKKPX]fZO[YWbfZXZUY]ZVW[Z_cVZjfefa]ddgeYVUYTW\XWV]e^V\b\ZTbfZ[Ybda_]\XTQJJIMZeiggecjtogjlefbafaamnb[\V]\^imnhfiijmuvx|ywtvwrrmlllmqohlssyĻĽøĻıij~rpzsntqjw~~}|{z{}{z{{xvvtrqstqppnnlkjjkjgb_]ZXXWUUTSSQOOPQRRQPPNOPNQTTRTSUammªĿɬsvmƫ˞խzغٿѣir~u[twhulsw}aYYduj\b_[oqontz}rco~td~qyyuoY`{c^kʼ~}yqlksmcbdfea^\ZYZZZXVTSRPOMLLLMMC309>=?@@?>>>=<===>@CEDB>==<;FLJ?3"!!!!!!"""""####"####$$%%%&&&'''((('&&$###!!####"#$$$$%%%%%%%%%%%%%%%%$$#$$$$%$##""!""#"$$%%%'%GȺԼɬţuȻl{~mƷnmqc__]YYVUSQRX`yasf{yo|UavvZSVYmvQ_iMQWr]^xv`s]eȜ{u}sge}zVSmg\Tqgzts[kpWYbi]Xf]lsXTTNHXUHGH[_]g[]e[afcY`c`ni\`fVgdSMOXH@HRF:??=A>SO?PSRQS[`blpeevt^idn[JX[[V]eceihddffededceffc]VYae_WZceefjifefefd^WOF@>?CB?W{lluuhXNE@FXiwvojcdk|\QNPNVYTSOMKJKJLTTOPRPOMMLJKMONS\QMRTVTTWRSVWWUJFOE758>@?CGGB@HJ72//>>365*08<=>99C:89;?:@I@8AFG>>HFLFGE@NMMMPMDBKI@EMHGEFLDAJMADI>:LPC@FDCELMDABBA@HNOOQTM?I?D@>=@E91/2,+9<2/024568=A<<=<=IJIGB?FSSKFIIHIMMJMNFEGEOU?7IH@EIXERKF8B@@B7-8EKM58?@DE;6;9?MK@AID4?CJPHLID@BGNY_YYeljh_`ba`WYZXZZSTUVjkRSUPU[^YVRSY\QNOO^`SOUXXYY]TIJTQLMNOVXSOKWcWS[[Zbb^_^UPY\ULTZJNN@OUD>EIIECFACGFFLQOUafRJWTScgYVVQW\YXVYZ_cVThihhb[aacd[TR]ZRWUZ[_c]TU^[WKY`WV[]]d\SZWWWLOQVfhmnbbemqigijgdab_\dmgYYa[`cgopskhmooqvvuwuuqswvrmpportrrvy|¾ÿ̾·vukvyqqtv}{{{zzyyxvvtqootvqnnmlkihhhd`^\ZXWWVTTTRRPNNPPQQQPONOPQRTU\_bfx|ĸþӷ̳ǧil•ӯ׭Զ}yuuxpvyllqywrfX[_lwi\]R]kjgfpzx[s|wf{eq}rttz{|nW\yaZi~Żtjimidceffcb_\[[[[YWWVSQQPOONONH805;8:>>?@??>==?@=?BDCC<224??DftjzmI:Zv|xx~{qxzmpi`fyjONPLQRPPLIHGGFINNMLNMLKJMJKLNNRYNMMQTPPSQQTUSTQKNMG:8AA@EINKJUWDC>>NH<:6-0978@:;;766CE>@LOFDHFDEHJCHEEA@@JOKPSJCHDBA==HA:KSMIJMJB41888:=1983-.4,/:94422432;@609<<=A@ED=>FNPOGIGEIKOIJHEDFENN=CYD=7MQ@OID99;AG9-7=KL3:?@:GHV?>FJMUDIZfaY[jqeafcce[JJTVXLW\YKBNTXI=R}~}|}~~}|}}{{{|{{}|{z|~~~}z{{{|}}|}xzVZ[YXT[[\\\XPRRUYZWSbKLTNDKUUVTQSOMFKNIHDEPUUVTTSab__]W]_ZV[UU\YYYWSMJD@KMQ_edb[W\_VPWQIHIJPPMIEBGEDHBKVKHPSVWUNMRWXUSUWN=BGA;8G?1=@GNHLI@=AJP[dabfhe`^_c`]\_WU\TPVS_kWIQNKTYWWWTT\`XTUV_aTOUYXXXVOGISQMKHLTZVUV\^XT\^Y_aZ]]UQZ\RKTYKNMAOVD:@EDA@@;CDAFNPFPdbMFQNQdfYVUKS[X[UV\bbVSdojjb\\]`a^QO_`WWV]bda\ZSWZXIT]TW]SXg[PYYZ\UX`fkkkjaagmidhijhc`cY[jncX^jgcksvstvssstvyxsqrtoqx{rnstsv̾Ž|yȿƼ{wyiryl÷~|zzzxxxvvtronossnjikjjjjhfa]\YXWVVVTTTRQQNOOOOPQQONOQSQW_r~ҽڿʹĭ¤jv}ΫյկŽѬ|}l{nVe{}̴|~vnz}z{s[[dhsv`UROehdeeszfXt{zi^vc|{tpvzoxlSYx_Xgzvpkhfdceggeec_]\][ZYZXTRSSRQOPNL?24937=>??@?>==?A=>ADCF;(4?CGKTRB& !!!!!!!""""#######$$$$%&&&&''''''&'$$#! "##"###$$$%%&&&&&&&&&%%%%%%%%%$%%&%$$#"""""$$#%&'('+C׵ǮͲ̥DZw]ÿxc``_^]XYTUSPVuirs~|Up`PgphQZZI`YYQl{yq{tulquuqicldJ]xYes]SPSY[[T`o]JIGPUYH=>AU^\OSgWU]YU]d_ko`^ij]i][]\_UBJN;69>?@MR;=5;C;<9544;?7@B@2=B>8>FEJIA<9ACDEEEGBPI:GMIGBCGD6IH=CB?DNOIIJLEDDGOJFGB=8NLHMSHHGFCCOMLHFLLF@=88<<=1>5//77.3999813412;6).=>=;;AC:8>GKLTGIEBIKOIGDE@FEKH>IXE;4OHAKID=97AG;175HG5A@?>GJO=@MKB6;OQB?GA4<>GKHMIA?HVS[cbbca^]]`g`]_aWW\SRXXdaJKOLKSUUUUUX]_YVY[a^SOVXVWWSLFHSPMHEMW\XYb[VUUYYV\\X\[TPZ\QKSWMNMCMWD7=BBA?>>FFACINCF]aNEMNQcgYXYJOYW\YV\feWR]klia\YY]^\QO_fb_^`fg`]bXV\[NT\Uc_OXi\Q[[\^^^fljhgedbfjffhihfbba[alohahtqgmz|vwyssuuvupoprnnvztnrtsw·vuƹ;ʽĹ||nt{ko}n³©|{yxxwvvutsqopppnkhgfefhige`^[XWVUUUSTSQQONMPOPPQPONPQWX`oǡǽ̛x{qظԼбŶϚu|~}p{zeX`geqoSRQ_f\fjp|s]dwtvtXirpzm{lrwon}lM`w^Wgvulheeefggegfb^^]]\Z\ZVSSTTRPQOND.+8049?>>=<=>@BBD:48@DFKMH>0  !!!!!!!!"""""####$$$$%&&&&&''(((''&&%"!""""""#$$$%%%&&&&&&&&&%%%%%%%%$%%&%$$###"!"$$$$&'()(U|չѿűìŸƼyjc`_^[\WXSTSPWncrwwVpUaekhTj^`haSWyo{~dsszltaMSvrZOHP\VQPaeNEIGSbUC:;@S\XHXcHSYVT^cbm_ba{h_`]fgceVENK66;A6>FDIHA:6>?A@ABGAOK@IKJHABEB5IF;BB?DLOGHLQDECIW@FHB9:PGHKQFLJFGF;DFBISRKIGKHHHJ@8;?;5>329A9159=?84764:6)(4?>;::??89>FHITHIE?EKNHEGE:FCGDBHMD?:OD?FIFFA4@F>97/EB6GA@GKJI=DORVCESf^[XTeaa^^[^ge[][\^TXYXYMKW`NYxx}~}}~}{~|||}}~||zxxvwyz}|{w|~}~|zzyxvvwwz{xwwvzY\\\\\]]__ZYZOR^_[X_VKRODIKCGOHGJFFFIA@E@GPKKN^_`^aa_[X_^SR[VS^a`]YVTTZXTXX_fjk^VMVWMO]VCGHNNMKB@GBBHFNRHIUZZVSOPSWVRVXWWSNPRNKKLPQO?;MQKHMJ=:=EHIOLHFSbXX]\]_^\^_dl`Z\^[\ZVU\^\XQMGNOORTRS[`^ZVW[aaWTXYUVWTQIDIPOKDFS^^YZ_UMPRUTQVUPYYPOWZQKRWNLKBLU>5>?BC>>BMLEGLSOO]`OIQQSbg[Z_ROXW\^W_in\PYgmf`]ZW[WUSQ^lmgddki_`lb[bd[\`]obR_m_Z`\\`dbfgedecccdgdehieddc_]gosrnr|{oq~xv{rpsonomlnqlhpujisnpxŽyλؼ̿ƹyvy{kl~}ml}{Ĭ~{{ywussqnmnnnooonlkjfddccccb^ZXWVTTTRRQPONMNSTSSSQRPVT`sv¿úǿͽϻ˿͡zhgǣŴ˿ưƖĝ{zulfs|y}}{xbk{w{~nfbmf\`ZHR_eSQps|zfafnpxgTutzje|{lrp{~kq\Rnt[Ubq~}kkdfhigfeeeb_```_[]^YUSSSSPQPLE>9<0367868>A??@B@@>>@<668>AGGGCA>6' ! !!!!!""#######$%%&&&'''((('(&''$!""""""###$$$%&&&&&&&&&&%%%%%%%%%%'&%%$##""#$$$%&'()&8мңtȶҵŽqf`][ZYXXUWRRSU\`\rzs[nayrjpm{idMcuo~ö½±vɫkyl{ljnqn[EIcZJIS^UIOKQ\]@>:=@P[UKdSFQTVW]bdgWhj`aWapkkePLSD6:<@9DRCKSPY\^bgflsrqxp]g^ZfdM[ZY^`]UFSd_\`afkokhd]XaffihhcZTSUVUZ^bdeghehnjZPLGCP[RD?CIGCs{`SY^ZYT]||xox{\MIHB>KCBA@?@DA=JEDIE:FQJ=GJPOIBB@JNJILHFKQNNURJJIIJHADJIEFKSVKJDESSQSVQLHIUGAB@?B@HKB;CMEJHPHLNHNG=HHENWPKKCLDEFPG87:89:58?C;7:;CC<<;;AB3,1589988:::<>JDIUQJFCLSWLERa[U[XW]``[XTZe^UWX_b\[V[bXRZ`Tyzy|||~~~{{}||~}~~{yyyxxyy{~|~wy|}}|~~}|zwvwwuuuuwwtvrq[]]_``]_bbY[_LVe_XY]VSVLFSM7FKBIEDDKF=>CAHRQOT``cZ_d_[\_\PS\VWcaa`ZX[Y[[YZY]_ejb^LGXOEY`HFGMLNL@DH@FILQOFLY`]TPQSTWWY][VYWTZ^[VY\WUWNDLQSMRQA8:/4;>>>CFFKQE# ! !!!!!!"#####$$$%%&&&'''((((('''&"!"""""###$$$%&&&&&&&&&'&&&&&&&&&&(''&%$#"#$$%%&&'(*)7ʽܵؿǽwh_XUUUUVWUTPOT]daZuzq}`qq{[Ll˹¦éɦjɹh{éªĞor]EahOLLVVLVUMcZK<15=@LYPU^ALPTXZaZjZ_pwoa[ToqnkVOUSCD@9B;HOFTRRcZ`ddbkupszf`b`\mVPbZ__\VJRYXO_lmmlmnndaglkjifa\Z\^b[X\[^deggimpka^WMGFA=<:=C;:JACG@8FRI:FFNLG??;HKGJJECFOLMQOIGGFFD@DFC?BGMQHA>BKLKPPMJKNPKLLJIHJLOE?EC>5EJ9;CCCBA82;;88;?G?GJOPDLMB@BCCBB6<=;>@=CNF97>;6568>@<A=GUOID@HB?EOCNMKT\ROKLSYRGS__RYa\_\^\URQY^ZTUVb]\XP^d[Xa``|zwv{~}}|x{~zz}}~}~~}{yyzzxxxz|~~}|y|~||~|{yy~}ywuttssuuvvuvvurrnx^a]^hc\cafY_\K[k]WZ[Y[ZNQ^K2LLEPFEDOD7=EEJV[Z^__^T\d^WZ_WNUZV\c^^`]WYYXYYYYWWZ_`aPAUUBM^PKGLKONCNLDOORUNMW`c^UTUVVVVZ^][XTXbb_]`b_][VQQRQOQQC:?DJSSRUPRZPBKRTXZ\]`caZUX[ZUVZ[]ZTPMBGVQHLOS\_^XSWZ\]XSceLMYWLLJFMNPOIM\c_UMRMCBNTKJSHLVSROQSNHMVLDMOLJDFNP]aXZdgecbdnpkif\]edbchia\[[YYYa`^]apUE]c_[SXZTLHT[\lokegol]clmiikfdfdgcenl^]`[XZ_\adZcbT^b]^acfc^chhgjuz|}{{ysyvmjehgfh_ipfhiptt¾úԹμuy~}xomqiemllipƿþú²ȱʵ{}}|zxusrqmihklkifddhijjjjifffeeb`[XTRORRPONNNLJVeb_\YOdgjxʾ¹ӼʍŜxukzްŤʼǼiwkitijkk|{uxwejl|xaQWbp~x~x}|y|ziaeTRnXGKp{iixst^puqhmn_pbXjrdjlk|je|{}v]kulULU`ht{nclywz|rgghgecadhga[ZZZYVSSRRQPPQJ]Q>2.-36EQROG?BDBBGC:8?A65:@GQ\R3! !  !!"""#####$$$%%&'''''((((('''%#""""""###$$$%&&&&&&&'''&&&&&&&'''(''&%$##"$$$%&&(((,8-Eþ̚ѽwyȭųȺ|odZVTTTTTTVTOPVcmh]t~vqau~XXv¿˿mĹgyă~icmVRLETOX`T[e[N;1;@CQXUZHAXXTZ^_]`UssuddL`wmp^MVWNORCAJBC<7FJGADAIHF=<7GGGLIABDNLLNKHFDDD@<@?<:=AGMD;9@FFFMJGILLLNQQPMKSXSLDHGD4?I<9@BBB?98;::9;@MEBEKLIRUFGLIFEC6;=79D;8OWOIINWYXZXTSSUYXVa\NXZTMKNOSNRUUX]_XOMMHCFQNAKNETZOOOOOKFOUJP\WRSW\]bkjdjqmkkkjnrmigbcgffbdhaZTVSOR[`c]QkdBR`]XOW\SHDW^\ilkcgrl\dkkgghgfgebcini_]]\Z[__ecajZSc^XZ\_egfiqsns}||xzvqvqkgfch_fgdllqq}ṷ̂ĺÿ}{xnw|~xtnhnidjfadw±ɳñµìy|{vusqoljikkllkhcdefeddccccb`_]YWUQMOPPNNNPLEXtnee_Pgz|ŬӾ·ʽte|}ڱʻüĬzdwq}}obbgb|}xkbNSkx{e_yyqXm_DHSnr_\q|yu{rZgjJRY~unnzqWul{xhubdlW\kh_g^uneexmzqxyhsiQGOWaqy{w{}k^`hkimssqlheec_^^]]\]\XYYWUTSQOOOF[N>1(('5DA4.3EXSCUUG?BC>@ECELPK@63+$     !!!""######$$%%%'''''((((('''&$#!!""""#$$$$%&&&&&&&''''''''&&'''('&&$#####$$$$&'(()Bh^Ʒͽ΢εsdzxlaWUUTSSTUTU\XTZgsd`rsqtes{]kͻ̼ΫxzįcwȯϬu`XT?MT[g\b`ceU5GNHNTU]TFZ_YR\`XdKf|sefSItoplVRVSP]XJSJ4;>=>?FECFBCOJKLGEFDBD<8<:769=DI?56?AADKBEJLKKKMMNNPTYOPIJLL;=GB:<=BGB;>A@?>=FUJBFNKPVYPQUNLKJ;CE9@AOKHCKKBNEFKFGLHMLPSLEPMIGPTNRSUBHOD78=GGA<;BA?EFFIMNNJMVTPNHD>:71,0654=FB=;AQ@G@CBMJIH?NEHRNPMKHGCJJB@EWI7K?>NFC^WBOGLVTO\XZ\YV[`\Zbglnc^WQNNPQSUVIKULKGJZ]OXaY|wu{{y}~}{z|~|~}}~~}~|{|||{{zwvvwz}~~}}~}}|{{zwy||||}}~~~}~}~zy}}|}~~~~{wwy{||usqmlnnnnpqqppqoler^[TWd[Wa`b[^XL]jWWXZ]_^Z^]MXZXVWQIDOJ;GTPT[`^XZTQRZb^VVYPISPR_`[[^\TT]YT[a[SVVVVWVTQUPGKWQMLPOON]TU]^ZS[baa`]]\[ZXUV[`bZQZ`\[]]\\^a_\^ZXXTPMFHLINOLKCABGMJLTXZ^bd`\_WRZ\ZYY^_ULNOFGSTNGGPUTVXVSMPUSPQWUVa[WQLSUQOVX[\ZYNKLBEHHKEEJGFUSNOKJNMNWVUeha__fhjnnmkosoljjkmpmigcdfcebch^VSSQKLT[cZH_hIL[[VNW^RGCW^\hijcdpl[ejeeefhfec`ehlicdadb_gjfcjj\^g\V\^^bmuqt{vy}{xvw~~tsulfcbZgieigm¾»~Ƣ©zvwhkwunmfhgbbefmͽԼôȻô{zzvtvwqmmmjiihijjda```aa`a`^]\\ZWVTROOQQOLNQLG]z|unf_eϽĪɿlhwп¤jjhb{ilrrom}~zs\bgFq{ubXfsjLYZKP_q}xkf[c`}}|{vhwmli^rtebkx_frqitd[qaQYg]_ek}i^illqh}zcsdOEJR_jnppyw|{}teghd[^_Zckrphdiic\YZ\_cb\XYXWVTQOMMKLPTE24BNK;9LgqcOYXMCDFFJPQLIHDABIJ8! ! !!      !!"#"""#$$%%%%&'''(((((((('&#""""""##$$$%%&&&&&&'''''''''''('('&&%$$$#$$$%%&''))._ηԱâ~tk`ZSQRRQRTXTWcgZbt{_bsyjowtnuzaĽһ²̺}ƨf{ȨƏyƧc^XJR_difca`p_:GaVSQPT]V\aYQT[_UUSxslc_>eziqcYVTSZi]VZ@BOJSO\^V\a`\qr]tq\jriWcTonYh`\YLRJO^fPH_nl^_jtocbccihgovsj^RN`d`\_aachmnmjgZOJHDBFE55KHLNG[p]qsoi_gp]TlxjWJEA@9@CEFDLRLG?=96;D@BA=9C=?662?BDTL>ACOKJJEDGD?@9465413:BD913:<>DH??CJG@EJHFEBNZKEOTMUVTSSQOPVP@MPFEOA:6D>>?KEEAIDEL@CGEHDGMJPOKDLIIHNRPU\UGMWE3;@FD>9>B?CEFFLONNORUVTPLFDGI>2377=ED957CR=EEHFRLMEKMHHOP[UUPGEJMB>PZ@7F9EG@9FQE=KevnXLYZI??GPUUUQONHHJLTI/ !!!!!!!!!!"!  !!"""#"$$$%%%%&'''((((((((&&####"#####$$%%&&%&&&'''''''''''((('''&%%%$%%%%&''().2,jûͻšényumigb]ZUY\RVaWYinXgij{qiq|ntzuõüãpϔ}˯v˨ƼzbjQ_liphfdbpjJNoc`UMJXac\WULUYYX?msiegDO}lli_[RSUepebQ@NQQUJcV\U]\f{a]|wfcusaV[\ehkaZWNVKTdTCYj`STdstf`bab`exraY[___]YX\[\`fkljjj^XYNBCF=.?CPKHHEDGD=>81420-.8@>51378=HB:HKJIGNRTVVVQPQLHPRRPNLKGGKJIKHNQPPPNUZIJXSOZTQONONOYPDPURMPI:6E@;;@EFD:88ETCJFLLRPJKQKEFMU`Y[PEHNO@=SU@;A8?CHJP9;9@GHIQaVWTWacWWa`eg]][\SJLHJLMIBHJC?@DHDEMLi}~}zxwuvy{yxy|}{z{{|||||||~~|{|~~}{{|||{xxxvwz{|~}||{zz{}~}|}}{|}||}}}}}{{{wromiggijjjjiihhhc{LGKKRPS\]WQYVFT^PPSWY\\ZYU[cY_e]YLTYXNOXXXVbTKTRSVX`bPLVKISQZ[[[\]UWX\ZX^`WSV\VQS\\UNOPOYQPQTPP\YTW]c_^aa]^_\YW[\QNWc]LGQ[WVVUWYZZ\`]]d^`c\VSLIIGIFJVWRLQ^\[`dehhececbeilkgkeXXXXZa]UQLSTO]f\WVNVhcMGHBQURP@CUWLNQPONNGAA77HND=CFFJEHORJIW^dffgghlnliiinkafiqrhjeejfa]bgcehcd``gWGLKQXOPX[\BDcYJR_YOXd]RFTXWX`bZZkiYhgaceijdcccljknmtljphqqhsrtusrwvouww{zy~w~wxz~tttrutrsocaber}ƾļõķƿҾ{r{}tf^dtyiagdce]Ydwɹɹ¶ʾ˻zxwuplmpqolkieionjgfeb``]^^\\]_^^_``_]ZXUSONORX]QSUcyjӻдϴϰ½rʍzy~arh_uymuq{~biq`lytzyzpkextki}~ojjs\lm[d|xn}soqtug_kZVofXG]]RWRdh[^d`b`hwvbhgWKILOS[\cnu}~zwundmwoXQSZQWWepmje`WRVXZ[YWSQRRRRQONLLIDKA;=ID=GY^TMLV[K89HUXXVTPPTVSLQT>   !!!!!!!!!!!!!!!  !!!"""##$#$%%%&&'''((((((((&&%#########$$%$%&%&&''''''((('''(((((('&&&%%&&&''')*(/@8k̾Ϻ׼ѻ{|kfic^[ZgoQWm][lrYqu|{je{puwyǴıçƤwzNj{;Ȟb|oe{ttigmhmnaXojh_SMNeaUT\RMSXXNPthh_R>iuapeaYPTYlpgfLKVOVPRcXWNZ_tjVhwqgutrWWVk~bmd_XXXNP\S@Ve]JM^nuf[b`^_gtth^`ca]XZ_\Y[XZ^dhhjqebl`HAFD6*@EHP]bhfr~vu|vsjbl|t_Zhz}~~{ys]RQKNPSSUTNZWVQKCDIE:;D6<>37344;B>LL?=BOJDGDDEE>?7031.+-7<943356AI9H@@=I@IFIWLOFLPJTEQOG=FNZZXYJENTP@APSF>=>CDMIJ772BCGCSZUPNS^\SWa^e`W`_bUHNDHMKD>IH@=>CA>EIO{}~|zzzzz{zzzzz|}}~}}~~}|}}|{{{{{|{{}}}~~~{xwvx|~|zxz|~}~}|~}}{{||}~{{}}||{xspnlifffhihebdcc_jGDHDRNNY\WMWTCNSNMNQSXYVSRY^W^b[YOZ\\POXWWVbNLSQSXX^bTOWKKUT\]\Z\bTVZ^YX_^VRU]UQS]XRNPPPXNRRVMR\WRS]baaa^\]_[XUZVJNX[PFNURQUROSWVW[[Q[dV[`\Z[RPQFHIHW_XMRd`\chddefeeffjlonjmk``ba`_dZRUYUP[b_ZYUV[cUJJEPNNN;=PVOFHNJKEDF>7@LKBDEFFGHRTQMZgfeefdafmjikhikcYafpmbhabe^[[ad_chcd_`cXHGHNYUQW[]GA[]JN^\TZd^ZLOPRUX][ZheZheahijmecfgmimrpvrpros}sltuwwv{vz{}zz~v|ut{xnsuqt}s˻żŴ¾̴~~uprytj]^oxg_eafeXZj|˺Ͽ±ͳƸɼy|vroqqqnjjiggjiggecaa_]]]\ZZ[[[[]]\[WUSQOMNUddSX`mxuyȺʸĶ˾μƼƻ}uw~}qfw|j^bxpb~rlqcacno~n|pW`m^nvnqqfTkujnz~px{zzuxgkk[kmeNRjWY_SNNS[_`acdtwjfj_QTTNOOV[ahmw~~z}vpedpp_^ZSVSXakc\VLHHJLPTTROMMLLKKKKJIIHFD?CJG??DBDBGJPH:?KSQLOPPNQX[USQF3()%  !!!!!!!! !! !   !!!!"""#"$$$%%%&'''((())((('''%$######$$$$$%%&&&&''''(((((((())((('&&%$&&&&'(((*'*=MJŰп̮Ǣʱz[_]`Z`{xSZrdZpu[{|vhl¬|symͫʹİznxvħzȬģrwnxhwsqpkfnfde_RUfnPP]ZYUWVOJmgfeQ;Tl_csddUOUdnif`VTSMWN`bYPP[jlTXnnotmlOWYrvcg[\Wa^JYVBNaTFLYipaU^ga`doka]]]ZTTbiZMPUX[]`dbirbdiYOJGB0.EGHMWbpnkxz}|ssmaawpY^ow|{}y[QJRVUTRTLSTXVSRQRLBCP?DE55459;A:IG<;@MI@CCDAE>B816/,*,46543338FC4=HMMHGRVZZSVSTTKHMOPPPPLFMNMKOOTMLNNNTKERQLSTRRQQPPNNMFLPRJPMAJSD6GK>:H8I8AQIPKHF;7;C9?IHINNNPXMLKLNMLOLJLQVTQTSOMIJSVRPNKNVPHMKJOGKHJIDJYOPHGLETFOJ<8JUYQUQFJTYPDJSRI?;BFHO=@BABBBf}|{|zyx|}|{{}|y{~{x}~}||{|}~~~~zz{|~||}~{~}{{z{}~}{zzxuvxuqnljhedfffec`_db`JFHBUKJW\ZKSTCJNMMJJNTUQLMVWQY[XWQT^_NMXVWX_KITNQXUZd]U\OMTU]f_U]bYY\^ZY_]SOQ\VQRVQRPPPPRPQTUMQYUOO[`fa\WY\ZWVSROJPSKEHTSLPNLJQUUUXYRX^RSY[XWVXYSQTNXb[MQa]\fg^]_bdcedhklljmkbcfe`^g`XXXVSV[ZYZYVQ[]SQQRSTNB>LYRGKSSTKKOKJLRQLSKHJKUZVRYghecba]^glfhohheYSX`jf_c[^`ZWY^b]_ebd__`[TMKNY[WY\_QEU^MK[`XZc\\RMKLTT[_bc`[jeeqnkmifikliouvyzxvvw}{twy||y||z~||y{|qyst{ulruvƿ¼ĴÿǼʭԯɬuy~trov{xp]Ylwh]d`eiXYnó̾Ҹĭyuqomljhfggeccddccbb`]ZXZYYYYYYYYXVSRONLKN]mcU^psn{¿õѾѷǦ˛ĽŽȺssnz|}seffnlnnwxhio]mk}vz}kMgq`_BCjzsrseV\khdju~rz~mqxy~xwzu}zpkydVXmeWhkhUOUY_db_dsnkjm]Xb[OSNU[]_cjsv{xfgW`ji_dYQSVY`_SMKHHPNLLLJJIHGFFFFFFFFFFB>AIH@9:;9<>BA?@GSUL@@HKLMRUTRPI<693'!  ! !!!"!!!!!!  !!!"""""$$$$&%&&&&'(())))(''&&$#######$$$%%%&&&&''''(((((((()))))('%%$%&&&'('))'((4ZҼıѺĨƺǥ̓VWUdWg[_uqVs{^~miuƤyx|v԰͹Ǥɑù|zzvssǼsy}|wrmme]okd\fu`\lbcja^WL]f^fZFBdaVpsa]MN[mjdi[^UQYVYjeUKWdjYV\hluwj`PU^srb`VYUh]QXKM_R>BVec\NZjaccpn^\`^XUW_aTOY`Y^\ZY]bjhcbWYcXPF/9QMOLN[nuop|}srtj]l`Uait}{}iOGHSPOOSKMUTRVUVWUOQYNPP?987@IJA?CDECELLMMVMKMLNORRNLMRWOOOUMKGHOQNQRKNULJMGIOMRHIMDJZKQGBCEQDLA5:RSOMSMGQXYOJRSOH@>FFG@0E36:9A?@VLEAFOTOZ_\\WSYdi`OHMBJHEB>JC:ABDKKD837;>CNLD?>ADD@GOLLLCC@B9'! $" !!""" !!!!!  ! """##$$%%&&&'&&((()))))((&&%$$#####$$$$%%%&&'''''((((((())))))('%%%$&&''(()++-2)6xåĶܶӾȩΫTY^mTgnezXv|^jf{Ɵw~ŭӬ̼ͱͥĢyzcjx¾y~~yogrraZgrj^zjquofac]eXaaOIW`W\znXLJOekfpd__XXdWlnhKS_c^T\YanwmkZST]qra[WWVg\QKPVN@BIW^ZNRc^dcml`_cd_[[]`de]YZ\]YUT\cccc_[hfVVP:M^Y\VV]fqolw~|xsxwlmnSV_dy|moqUAAGIIJPHJSLMQPRVXYZ\XZ[LE@=F?>CD0.3781/7403?>4=FLKHEHPQROIUPNPMLLKLQSPPEGHDHIEGFGFCNR>AEAGNPMKJKOSTRPDHKOFGJMOQIJSOIEFJKOEOFCK7IKPFLA;598<8>A?CIHLMSKMNJKMPNKIIQZNKJTKIGJMJIQRJNRINPDEOOQFGLAGTIMC>?BMFJ91CVEHNRMMWZUOLONIBEJJE?1/A3A98A5FMB?EENMP`[XVNP\hg[OJKBJGCA>JD::>GE?:i~{x|~}}~~~~~{{{{zwuy}}~~}|}~yvz~zx{~~~~~~||~~ywz~}~{ywwwuutsqnjgijgccdca__^\\[\`a\pNKKK^FKY_]GQSLMLNLHEFMMF@ENHJSNUGFIVPFGXV]cUHJJKQPPYghVSSQOLQaiOO[cbe[PV_dYOQ]dZMORZKONGLSYUEEMYFMOTb_VSPRSMRURMILPD?AHPPPPNLKMOQRTUPTc]U\b__c\Z`b_``fdSV]QN\\URRa\aebfggifgc]aggffljc[VXWZdd`abd]YbRO_Yag_^chgfhgdckf\dghfgkkd__djcWZbc`fgaZW`klebiwhc^NQSYa[VYQSYVMR\_^acchabhgggfdeijlibb]bh[OQba`c`ae_XW^bqrmlijpmlpnkmmmnmmorx}zx{{{||zvzz{ywu}vxurnqwhtqs|tr̼Ǽúϰׯünivru~rjcV^rnSWgbkq{ɲúžŴǩvnllllmmmkhededdeca_`^ZWXZXVVUUUUUTTSSQQPS[egb]`tz{ryƱɿɭŨʵ~ǩȮ{xsip{peysltzg}qtzuefmXMUUSXhl~~gVrzdpvssnsfy{wma_g~zi[TXbZ\bbgm`OU^_lxmb`b[Zee_SOPT\ejqywpqrad``UOZZOOUVKGJPVWPRSL??AAABCCDDDDCCCCB>58FMJFE:9>>?@A@?<;;?@=BJHIIDEEF:&(1*! !!"!!  !!!!!! !!!!  ! """#%##%$%%&'''((()))))(('&%$$#####$$$$%%%&&&''''(((((((()))))((&&$%&&'''(()*),+3rػŨĠջϱ[c|Wl}f^~~`kaÛv˾ү̴ƞ˿|qyn]a¼wrbZcuqltrjwpcntfg^d[QR_TUbz`NFOUhdmt]d`\`bjwubL`]XVVU[\lwvmm]TU[koa\YVXf]LJSI=CEGVZUMY^Zjoi^[``^\[[_hgUMW``ZTSWbecaaahl\QZZQ^fejc_`fqomv}{vx|zv~{_SYX]ujam`>77;698=??BGFKMOGMNHIKKJHGGQZPGFPLHGLLDCPRHMPKRRHKOLKBII?CKIDD;;@IGG37LP>D?BLI[[TXRJQ`h`YQIIEGCAA@MJ;=DGFHTRNPMPQNMNPQSNTf_[_bab`YZ_\_dah`UWTGK]WOLL_W^e`egffceb[bghgflgc_[\]ahjeabec_fYVbaejcdmmiinlhagl_eihihjifddgkbU\fa^ebZUXcifabjwg_ZPURW]WUXNOXSJO[abfhhkeclokhjjgjnokehddf_YSehdeehkhfchnxuronqonlmmlmmnnoqsuvyxuwxwwxunu{otvrvrspnilukxmu}z~˻˻ŻŦеɣepvotrggY]omXSg_f|Ѻ»ʹòƿĿxnnmlqvtrpmgdhiggd_]^]YWXZWSSTSSSSRSSSSVZ\]deeaaqz}oʿѿŵŭĬ|ȳ~~jqwkutzyƼwkx}zs_RUO\UNKQcl}rX`y`Hbkw~clkf}y{spmko}f][T^f]ZYZWf_YYTFara]]^\hmncRMNRX_dfdcaeb[^Y]VV^SMHWTIGINZYOOHC@@???@ABCCCCCBBA>95=INB50;EIJI??DB:46:=CLDDDAGLJC0&(%-A<&!! !"!  !!!!!!!!!!!!  !""""#$$$$%%&'''((***)*)(('&%$$######$$%%%&&&&'''((((((((())))((''&%%&&'''(())*+.0[šÚǢDzкnǼȧdhb}flenbϯ›vʿҶʵ͑nqo|֚UYkƙ|z{p`lwzqyq}`hxlue^YZ]XNYhqOKMR^eer^\cc`^izyy[\j]UUYT^YjrfnmcTWWfia^YXXfaLPK=GD8HUXUS[\bje`ZZ\Z[VU^gfOGTda^VQV]``a`acig\Z`_SJPQNQUY^jrru||yy{{z|||pZY\W[nzrefbF<>AECGEGJEGILMRPUZTSZ_SUXXJAB@A>679@HJGG;KPFHHJEDHIOUUOKJJJMEILJPNMLLPNKLNPKNTPKOSB8ACEDBLA3?@71A99A9I>4ACPbQU[NIUeg[[RGJIGCA@@MQ>EMGE;o~}{|{{}|||}~~{uuz}~}}|{}~{z{~}{~~~}~|yvuuuvy{{{yy{}~}~~~~{zz|}yvttrmmpnkifdddcaaaba^\\[\]`\YMPQOaMQ^e`T\\WVUUTRQRTPFDHOKRQLPDNMPKKPZ^]ZMFIJLSWZY][OFR\WJMW`RPSY^dZMW]dc`[bjdcfii]aXQW^dXDKSQQNS[[SLVOJJL`\ZXWSOG@>JXROQNTVNKMNOQNTf_^c`^^YUX[Y_ecg^VQKAQ]OKJHZTWb_bfec^``[aefdbica`__^bjia^bfcag]Ycdefccijgilkk_ak_ehbddbda]\bk]RaeY[d\PQ^ca_^bkue\[VXRWZVTUMRXNJQ]eehkmohekqkdgjejqokijhgdcaZjmefholmpikopqponrqnikllmmppnu{sswvtttsrroirvilqp}~oonjkchun||lyz~{ƵʸǼļŻιɷȵ}wgwurufibanp^Te`f}ηǻ«}ywuuy|zwupgeihgfa\]][YWXXURRRRRRSRQQQSU^^[fmj`dq}wĨ٧ع˾{yêƬ°®{wuzxt~}x|w}wipyxnc[TTWPUQN]jrdTkf[\Vd{t_ebj{q}ddjp{wibdXdo^agSLN]bo\HIdeaZb]hqnmcUOLMW\YUSSTWXYTY[XYXHHHWMFGDLWRJF?=?@>=?@AAABBBA@A?=:CHLP[mvqt}|zyyx{}rqylejia[emjhcO@ACCADCFHDGKKNQMSWQOSYNT]\JBGCCA:9<=ENKKCNNGNOKGIMLGACIEDJJMRWVQNLLMOQHPSMROOOOPNLLOPKMUWOMUG6>DEFFH?1=;?HHAEJCCIKKJJ>?AD>CGFLC@PHOQD>FPROWUOOMHOBC@7=99762>B>:?GIJF@JKGHKEEB@EKPNCDLJHHLK@ANMLQMJORRWULIFN@4B@E9F?=8@A=7IJFALONS\TOMQROLMQK?A>=ENHB6;?7<;AF18>>\YR^VJL[hcZ_QHLIKD?>AOUCLWJ:P~}}|~~~~}z{{{||}~~{utz|}~}}||}}|||~~}~~|yutvvvwz|{z{{ywy|zy|}}{yxy|{vromljgdeghfeeca_^^_^\ZYYYYXUpHSVQ^WXbf`\_\XWWWUUXYYRKIKTRWWTRJRQTTVXZa[XPHKNQTVUVXVPIT\XLOZaWTPXadZT]]ccc`gmgelokaeedd^f`MSXPWR\XZOLSJLORb^^__\ZPEHPTQPRPVWMKMNOPNU`[`e`YVVSTZZ]cbd_UIHBSXIFGFUVSa`_cbaY[^[aca^[d`_`[c__dd\]`d`ag\V_a^^``egackig\Zi_cc[\_^_^TT_fSQb\TY_XIO`b_`_clsb\`]YQXZTSSMSULPY`ifhmmoecfie]bf`fojgjegfbhnajj`biojimdfjkllmortlfjjkmmqply~rnutrsqpnmkhquefljx|lijiichsp}xm}|í˾̺úIJۿwnwzozyglh`lsbZfdizúĨ~ǿδ{z}ywseddaba\Y\[YXWXWTQRRRQQQQPOOPXa`\hyvbjr«ͮӯ}ɽûʹ›wwͯwzwuyryym|tqqgWUU]XPQ[igWTi[Uacgqoc]]osq|gVOdru\_fnpg_J]pTSS[in^VameXbbcrnljdYPEI^bRGMOPPSVP\RQLJCFGQKMJHKLIGA==>?>=>???@@@@???>>BA:;BHOUVLNNKIHIB=IWYNE7116EKIJIE=?MH* $!  !!!!!"""!"" !!!! !!!"#"#$$%$&'(()****++)))(&%%$$#"#""#$$$%%%%&&&''((((((((()))(('''%%&&'''()*++,*/O֦Ƹ̡ŕȝ}ž{ulou}mӺȨϳ—}wdZaYr`Is…rsvovztuyyzyepueY]dlaMTcoSGOQbgdhVXT`jWkvv}kekg`__`bS]hfbel^QZN`bcd[_`]kQTGBC2ATSWYY]X`]_V[QW_`cghZ^_`ddaXW[[Y]\]^`bddgh`OZ`UNHHIIPZepqrxyzyxwz}qdtxuvzxf[_bhmXGFFDACACFDEKLOPJOUMLNQKPYVMGKEEC<=@BGNLKJNLITPIHLNMJIMMGJPMNSSOOMJJPTSQ[[PQNNPQQOLMRRLORXRLTM;5>96971CB95?FHKG@JLGGJFG?@DDNLEDKJHFKM@?GINRLJMPPQSRSNN>5F=A9I`N\^MIRbf`[aSLNGLH=:HRWHPbM7z~~~}~~~~}}{yzz{{}~~~|wtx{|~~}}|}~~~}|||~{wuwvuvwvwxyzxvwy{yy{{zyywvx{vmgfoupfa_]YWVVTTRRRRSTRSVXTT\\]`_`cgjjllpvz}~FV\T][]eg_e_\YYYYUW]\[WQKPY[^aZUSZ\]\_`_d^XSORTWVSMWVUSOT\ZPR^bXUPXccWX`^ccbdkliimrmajood_idTVVPRVaW[LMQELS[a`baaa`UMPRRPPRQXVMOOOOONU[Xad_RMVROZ[\\`bYMBGDSRABCFM[N]`Z_^_XV\Z^_\YUa^ZYXf^U[^Y\`^\dfYTXZTYb[bb\`fggYTf`__VTY][XRQ\\MU^RQ[\PDR__bd_fro__gd[SYYSTSMSQNX_ahghlhjb_cc]U[_Ydna_ga^aamoceaY_kjghbacdddhmppoheikjlnpnny|slrtkppkkjhgqsebifs{jbghhbisr~rpíţ̿ÿǺѯ{{ow~mnlnkakteimemzȽ̽}zt~oeb]]]ZWY\[YXWXWSQRSSQPPQONPPYbe[f~mpv̽ӾѦڵ{~̰ƽª~Ģ|~Ƞr|twuwzrwiru{n`SZeXUk^h_EXWKRT[hfo`Y_qlrs`PKhrgU``es\[Tdj\cKTope[co\]abqsjkjcYKEVmgRHNMNSRSNQFECCAEELQWNLLHIFB>=>?>==>>?@@@??>>>AL>4-6EMKIKKCAJG,$*# !  !!!!"""""""!!!!! !"#"#$$$$%''())***++*))(&%%$$$"#""#$$$%%%%&&&''((())))))))))(((('%&&(('')*,,,,1FjزЪɟгƶytipӻǨĜʤȘvbU_OiǶRQ}ǣrqpµyxx{o|y}kxks|uxw^deprYNXceKJOTjec]UQLl^[rtuzhkkacecb`S_f``gk[T^O]`ddabb^jXUEAE2KQSYZZTT`Y[VTW\^hggijaba_`a]`ZSV_\\^_abekg`^jhWJL]a]WY^cgptv|zxwz~vjnvw|~yd]ahziNIIGEC@BDCFKMQOHKRJIJIHNUROLNHFE?@CEIONLNOKLVOGJNONMNQOIJOMOPMILNIITVSX_[TQOORSSPLNSRMQNPUMUSA:DMHHIKKGABJDBGFCHFGHGB<>>=87;;KKECKIEDKM@>DHPPLJLNLLQUYURDCK<@BAFAA>@58DGEDLONOINNMJSNMPRNPGAGGOTKB?;7:=>4<=@ZPR^MIKYb_\_aSQSHNPC:FQYMJeRU~~~||zyzxz|~~~}xtw{|}}}}{}~~~~||}}}~}xvwwuutrtwxyxvvwxxyyxxwusrrsohk|yuqmigd`_\YWTRPKMQPQPPRQQRSSRSUTSSTUUUVVXXWXXZ[[]]\\[_ba`eijlprtvy}GX[W\^bfgcc\^XYYYSX^\\XQLW[_cdYXWcb^`cdhh`XYY\[ZXSOZWVVUV\]UU`bZXOXdZT[^\ddadlmjggqk_jsoc^heWTTPO[`UYKLLDOX]^`a__acZVVTTQPRS[XNQPNOONSXXaa^OFSQLYZXW_\PE=HCRKIAVjfk`[epnqnVQYtl^^c_[mefoqamgSUxrlY_YP_bnxmlme^XPTjseWVQLMPOPKCCDBCAFEJTTMIGEFFB?=>?=<=><=>>>==<;<><0@7:?CDDIONLDNLKHSOMNQSVHEGHOLHB@<;?=<@AGG;9@LYg_bcc__d`SRRSUSQMZ]IIWhU?Q[UVXVW^\TQQPOYb]da^`]ac]^g]WYOPUYWMJKMJK]PEPWTFIaeahkfoticchheb]ZSV[PPPSX]_][``V]]XXXWMSTK\dSWWRVVaodZWPT^g[X[VYY[\_flnf[[^fjjospq||zvntr_aeljdbatua]bYhwfW]fkinnu}ms{óʽȵ´Ρ˼qnuzukep~zx{shnddtlģ~q|~nccaZ^dc]YWWWWVUSQPQQQPPONNQUUP^fVz~wrơɶƺÓʴ̄лɹIJµyôà}zmsknj~xm{ot`\ddcb^u`KcKZeBPaihmlttnmgTVixgklijfynnusgosZizrooaNMXmrtjqk\Z\`itmfidVNJFGLECEFEDCGFGLIFCA?BDA?===<<<<;<<<<;:99:95>C@GYeQTVKY\\MW]N>EheEDRUI@CGIJLI>:?<-" !!!!!!""##""""!!!!!!!!   !!!!##$%&&'()++,+,,,++)'&&$$#"#####$$$%%%&&&&''()))))))))))))(*)))(('(()*++,-27Oӿs}ԘΞ|Ƹmyfoׯ©IJ~lw^I^WrqHT~pxxӪzsv̵|s{ti~vv|vowrpljytyfT_X\WJMZf[\`RJD_]`jfkoofblifdcbb_aWYjmaVYdUVXcaa`gdbc]CLE1LMV`XSNWQR_\ddWchhjf^flhdeff[SZ^TW]ac_abidenqlbUNQ^gimlkiqsruyvvxz~xprsz{{vrlhzjPPOKDAHLHGLSTPCCLGGIHFKMPPLMKKHBCFGIJKJIIHGIGBFIJIIHHHGHGKPQNLMHDKQMOSSQMHCGNLLMKOURQRQOQUWUJCCJIGHLSTHMNLOQNKKKJHFIOAA?>CEF@AIFDCDEFJQPHEMRMEHJJF?:A@BGKJH@KJJDQOMMMRPLJJID8?@;?AEABHEDQPJWGCQJURNR^aWZZPOPMGFNVQPMb~}}z|~|zy|~{xxz|~|||}|~~~~~~{~{zzxvusqpsuvustuttuuusqrqph[dxqjjkdcb[XVTTTTTSSTSSUUVXWVUVWYZ[ZYYYYYYXXXXWXXXXZ]^][[\]^^^Wd_]Z[_`fjZNTTTTXPa]\]VPOV[fld`\[]V[cfmmm`dbaddc]cf]^[]^YY[ZT__YYKU^MQZTZghabkjia[db^elj`Z\\QIJGS^QNVNECKYZWWUVUW^^\YTTVPPX\]]RTRHMNJLR[bZPGFUSMQMONPKBCACBFGFDBBDGFEHQSPPTMIMNLMMLLIDADJFEJINSOPSTRRX[\RLJJHGGLURJNMNPSQNMQMHELNCCA@EIFEJHEBBDFJJKKGFMLB@GHFGEEGJEGSIHDFPT@AHJKKEMPMRVTLNHFOGEHID??<7?FEINHBFD?AHOSWZ[WUMRKFGHNB@??@?;CFDDDAIII?NOMJKKJMKSI=36<;@DFDB?>EJFDGPPMR\TNQRSRMHJGBCDDDCCBILGMQTSOWY]VQQQOMJNVQJIIJKNMLLQIGHIJFEACMQKKMJLJHFDKICDIKH@;@FGEHJLQSOMOCEFHNVC>@@GF?DIHQTPPTMLSNGFHC;::EUgX[bXONLD@MTVL^~|{xwxz~~}~|ywx|}{|}~~zy{{yyxyxvtssrpnnnnnnmkloh^o|vpkgjjfc`\[ZYYVWWWWWWWTTTTTTTTUWXXXZZ\\ghe^\_][ceXOSXRRT\b`[`[UUSXchdcZW[]]bchch]b`^``^\df^d__a^T[[NPXLULPY^ZRW`fkmffhklfaehglmaX[_YNKWgWJRZTPTMNPLGJLS[\RSddWU]\Y[[[WXZVVVOQZje\RLTYUROMQNPIDUSKN]kXQbgmeinlj^_ccea[QQMJKRW<;O^N2?TMMXTX^`dilmjfmslpthfkieljb`aZKNYUGKNOLXcZPPWbmcdfjigggjchffkelqiadc`fe^]\Xb[SaTLVSILMEJMEPSHNIJFQbXQTTUek`dg`aimheflqolllklsy{vpxtu{sxv]X_him]ey]V]Xgs\MSbqspnld}ξķŲ߶ɺ~}xh{r_qzgh|~mdeh}s纡xvsnmpnfcgjigghfedcbb```^\ZZYXXWURQNOONOQSQNNRUQKR^TX|lǸ~»i´øƊ˷ǶǺļq˝лĊзƽʻƭ\mkpyvwlZhvV}|o|sg`{yn{nxuvzioyzkfurnpgUW^dmrsrrmpsn[W`TKMVPB?B@=@KHDADDEGGF<89:9;;<;8576237:<:6IIFCEOLKS]SMRUVUQMMJEDDECGCAEFBKMOPKRTXTPPRUSMOTRKIHKHIHLMLIHIJIFFEHRUMLJKQQMIIKD>BHG?7:BGFFHKNUWVMICDFLJPG>79DA>?BDKHJSQMVVQGFFA:9:@FEBDB?AA9GBHNSSQQVTYMGWMNVGGJDCB;HHFCBBFFJ;HNDBILGBJN\QSHGG@LF?GNICAGNC???EIC=JUYOXWYURRG=JXVP}zz}{{}|{{{y~~|wtuy|{z}}{~~~~||~~~}{z|||}|ywtrpnlljiigjle`uzxwtonnkiea^__]\ZYXVUUUUTSSUUjfd_^a`\_aXWWXVTPccebb`]XSW_ddcZVP`a__^^c]`[^\]\[d_ce[[d^T_aTRYIWOP\f`ZccbkrkgijmhbmrilslcfjgZXhpeW]d]_`YYTKLMX\V^RVjcRW`YW\[[][ZY_XHOYkfZUSY[ZXVV[VWROa^X`jn__adeagjiaXZY]cehVYOGLQP9>LZN9?NRU^_cejmorqkjqplsrdgnignifhe_RX\XVY^[Vgf\Z[_gkabaiidjlmfijmtnoslehllpofbf`ihYiaQYVMQNCLRKNRIMHPQ]b[XZ[asofqnjnvxpmksxvuttpntxxuptrs{osf^glop_bs]X]ZjnYQXepsstshz˼ƬȾϭ˩z~|r}{qfi}u_xztgdbu{rľȶrqpmljggeeffeecb``__^__^\\YVVUTTSQOONMOQRQNOUVMLNQSepħ}}zkâǺŒžƼǫ÷zxǟ¢Ѱ̱]trwuyirfXrvPuzw|}td~vo|x~z`w{jtxslo`\abhyzppkhswndcgWXWfRDB@>>@NQOHJAAAGE;689:8=>=7483/8?<;=?LTNNQZjeVJOYokpdH>IPICMWPPOKFDHSTTUE.1>+!  !!""""#####! !"!!!!!!!!!!!!  """$%%')**+---++++)'&&&%%$$$$#$$%$%%%&&&&''())))))))))***+,,,---,++,---./1Exպɹ~|xʿȺf~npwyv|pԹϬͽƼǪnh`ju}wTqh`pzzyncvtwumxvcoyzyk\lmipkfujk}t`_ajpsr[`mhaSb^S\^WaTMPRP]cRTWg`Shg\f\VcohLI[ltid_`qbih]e^`i^_gaT_aLJWmQRYKF<]dZUVWSX^hgstyoeswiiccikikWJJO_]kqhirvuocUQJIKQ`dLEvuiddb]bfjqu|teUVZbuyhl\RQPQTURRUXVVVTSRQQSRNRQQPRMNNMMCCDACE>??9736>@DB;4@KHEADKFJQWJIQTVUUSQOJFFIBIEFEE@GIKKDKMRNLJLSRNNQPKGEKHDHOMKJJNNKKLKKSTMIGJOPMJNH@BGE<77?FEEFFINWSRJFGDEMGGG908E==;>BC@KTLOXPLGFCAA::AFGE@<=B?DKJODAOTNIRNZ[\ZWSTOC`~}{}~|||||||z|}~{xwx{}zx}y~{xwxz|}}~~}{z||~~~~|xwtqnlkhghhe_c~|xuttssqonljgedb`_[Yiff`]ad_^^Z_^][[Rchegab`YTV]aecYWL\g[[ZX^^^UaU[X\cYiaSVc_S`f_VWJ\RRahgenj`fsnjjgkl_oxcfqqmptqddprrgjlgkhhg]T__kgZj^`k`V^`TXd`_eZU^fVHSWj_Ua^^a`_`ae^]][kecigda_^^_`gecVUWPV^ci^[NJOTPEKJQNC?K_dgjijmoorqkknmnrkainijlgmlc`Y_`[\gnafve`cfiec_a[gldqvnjlnq|yrrnlknrwtoelmiqfmo\]]ZXVLRWSSTNTR]cjgedefmyqrwlqsxzwslw{wxyvnkswsrpqwysswmh{o_otsubbm[X`]gfW]ioty{~þɿɯͺѶȳֻƸĸy}}s}nhdsz~frzxxk`ap{vѮ׼zxwqsxrnmiffeeecba`_]^`_\\ZXUTTSSRSSQNNOQUTNPZVKKNP^r}ktn¿óƥ~zmʯɫøʮ{novv`qf\q]~yzzpz|extlz}~zz[xny{uolk]alxsgjcjyxmmho]gcvTJH>CBBU_cNOEEEMD88:986CB=5D91;EDADGNPGJOW\RA?GX^giYMFEQZVY_Z][MJLNOPUWQINM=#&)"   !!"""####"!"! !""!!!!!!!!!! !! """$%&')**----+*++)'&&&%%%$$$$$%%%%%%&&&''(()))))))())***+,,----.-+,,,-./5PåջǮv¥lzwxqtx}Ͳֻүξƹƻyk_mvwkWXinljh^u}stt shk|{upZjxm|{i_jnni^cueq}aX^eu}qhia[igfc_i[Ug`XXOMPNW`YOYYeZ^r`[hYWkoXC>9408=@A=47CGED@DF@IRRCEPTVWWUSOMIHIAGHKDF?CGIJ>EGMIHFEQQNLMIE@DJFDIOMLMOSPNSRKJQQLECGHJIJMEDMLC67;AC@DECEMVGIHFIDDJEEI1.=?8>9?@;=QMHROGGFBAHG:9CEHD;9FNQOMLXSTAD\R\YMSWMIPOMNNHGBCAC;EJB?IHDBHIWRRX[XW]MO\SDDKWNEBLTLUIKPQLGTVTXc][d`SM}}}|}}~~~~~~|{{zy{~~~~|z{}}}}{|~z|}~|zxy{|~~}}||||{{}}||}}zvusokifeheZe~yxz{~|{zywtlgggf_[ae``_Z^d^aaUbkbga`_ZUVZ^ccWVSSj\VXTW_ZV^SYV\^Zk[KRb_WbjgUVVYZ^jlmnpob]mpjmgfk\jw`]iokqyoglswulmppojosj`hkwncsjhjihgcYcpehlUTilZWb]g^`oe`cbdhkjaaaapgbd_Z\]ZYZ_ba]KRYMRZ^b_XPSTUYWVNOPNESljklkjnhlqnfeghnl`_jjijdgme^^^`]Ydpognvfbckma`cf\gqjwqoqov|}xqpqnqvywujjshmutui_efdaZ^][\ZX_bilpnmmmmqxswtgnpsutsirwpwypijtrnqopqsuxxlfpo_kxsvjdjb]cceick{˽ȼͺ}ȝɩθwlndapy{~nnxvyn_dq}{ƿ֮Ư{wzutvnieceecba`^]__^[YWWUSSQOPRTPNNQXTOPR[VJKMVixzzlypo~ĦufƸȫì÷Ȯyqt~u_}ug^mptz|on{isl~iwzzz[zp|{|qvpZhxzbeger{qkokwbuj}SSW=MDOllqNWSONPA;::945JB;GH17HFEPVEABAHIIG=?FRWX\XHG@EQYaccdgYMTZZWZ[UO\^O42<- !  !!!"""########! ##"!!""!!!!!!! "!"$%&))*,---,,***)'&&&%%%%%#$$%%$%%%&&&''((())))))))*****+,----.-**++,--/[ʯѶżȧpms}~svwyy«¾·һͿԺôżǡydkvp|f`uYlf_^Z`olyzi^o~u`Xiog{cajql_[gscrrU[]kxqebX[fkggdjfW`k_XSPQRO^[OWX[a_oqXa`[erkEBabjsg`afnemhgt^_iZ^m\XggV[reIXPJ:B\_RPVPQVYb\mnfalmopnmuzmaRPX\djrmcbekqywlgf_NABOWc/SvaSYWPLP\dgqgVPRYYZu|feUMQTUSQOPPPOQTVWVQWRRSTOOPQNXSPMG:;C>=C>944:<==:8@D>BB=EB?IQKDHOTUUVVYPOKHHAEKODI?AEKLDFBCGKLLQTOKOWPDFONH@@FFGFGHCGSNB;;@SHLPHCDE?DNF657?>;86@SDFCO\PTXOGG;GNZagnkm`Wab`]eXNV^NLFG=0,$ ! !!"""####$$$%#! ##!""""!!"!!!! !!#%'(**+----,++**)'&&&%%%%%$$$$%$%%%&&&&'(((()))()))***++,,----./,++--//-9ɊuɷWov}zp|uqľԼýǥkgu|}zgseXpWUWUxxwdnl]]y{qUXhli{Y_iqgZ^msepkV`XptfbUOalkigfma[le]\TWWSU`TTZU_ajsjSlXiov^AVi]jp^^_decmbvwXagV`kVZggajwZI\QK;E\`UQWMOVS]Rjc_^ahgikj{mb`dddgnnd`bgkquvsohe\K.;WY+Nu_PRSQONUZ^dcUORZYXm}kdXGPVQPOLOLJKMPTUTQUQNOOONPSLRZPSM=;B?=C<68:;;;:;?CA7?>FJDFMQVSQQS[QPMIE?BOQDF@CGNMBLHJKLHFORRSMCBCEA<ELIC;=DDDDACAFQIBGEBB>@CDAABBCIOIPKL@DEDKJ=5HDFG956DB@ILIA@FVOM[VZRO@KabKQ[NMJX\VSXOQNRRRSQKP\X`f\T~yvtw{~{uz}}{yuswyz|}}}}{{zxx|~||{xxwvvz~{xwuuusstsomljhd]]q{z|}~~~}|vpjhdaXW[^a`][^jc_X`d^c_WSXYRIX\\WLOX\f\U]WTX^WU\X`bgi_U[eaeotojkookrtlsulhf[Yd`fi`bZTkiTbqgdphdjinlagw~tosqedliqobijcfxysruqqxkfjmrqmqspqqsqjinnmjllggjnjVGS]NRWUTTaZRSFNYVORVUUUW\VU\\WWaaabjmbgcYa_YcbWW\ZYc]Sbe\[Z]if_]]gf]\imouyrlntukeozrkuvr|zoopwy{yqqmkputxxpcnl]nutsdcmlhikhejkdjvthnssqliinnleZ]fkhmjjnafqhcfkjglnport}xmjoonxzwwokqzrrßųíȧˢtoʥϻëzyvwyk^l{w{uioptueasuyijΪˢѻսz~jprhgdca_][[ZYWTTTRPONMMNPPPQMGUZLQ`VHHUhqqvyx}{z¤{yeϿǹɳ·Ĵï{ko}puryu~dbolqitpxwZq{ksuu{wf|qx{ugp~yhgnkrshdqnmpoxkybb[WRM}uTp^KRH\]X`TCCDMBDMPUGFXSO\ZJIFAMT[mx{oxl\ggdafVT]QNORH=?8( "!" !#!!#####$$$$#! !"""""""""""!!! "##%')*+,,----++**)'&&&&&&&%$$$%%%&&&&&&''((()))()((())*+,,-,,,.02/,,--.03Hʶ~{nx{}u}nl~~iмп½ýmeyxnl__eORP^nsk~v_S]{roLYdjsmTcipcYbuselhXa[sj]^LQhmlgcih]dm`a^X_^\^[RbVZbgpm^\k`sspSSgcXnfT\__`ab`mSef_bbP\glirqWPeNREL`fWP[KPTOWVf^YZ_c_aef|emqonkmmg`^gjkortvtmgdbE=YD.\hXLLNNNNPVZ]_VNQYYWfthbZFLQLMLIOGDDFORSRQPKKNKPROSMNUUSSG@FF?D?7??:99;?DA99>@NOD?DHKMLJOMLKQJJRRRSOJKLKB9:?EILMH?ETJ=>DHD>8>@EGBAMJFEC?AB:BHBEHICBDHKPPKLMOQKGHKKKKJOMNIEEGMK@6=LEMG<56@GD78:LE;ML9HQR=EVKWNLRQPNU[]YSUTHEHE9:BA@JMI=@FRJJUQUPK;L][NY[NMLb[TZVRMRVTKRWRXWYdgSdzvuvy}~yy{~{xxzwtv|~~~}{{{zxxz{||{~~ywwwvwy{}xssutsqnmmljijf__w}|}zuolhed\XXZ^^_b\ji_U`^^]_VLPXQFU]\\MJ[]fd[]c[Zd]Zc_dnmrlbfjjotvqtputmsqemtj`b`TVZbfaaROhj]epgcmeZfhffahvwqupcdmknk`klbfwxurmqytbcqvqoqqrsrrqpnptutjluqlmoj[FKaTSSQQSVUMRKKTUQSUQSUY^WV[YU]jgejkea^[Z]VV_WQX[Y]f`Zje]YWajgfdjul`crsqz|vstz{ngu|moxwwzympqtwwsqqhhnpqssofghafloqh[ch^ahgefhdlwtilrqqheeiljaS[feemkkg\hoghhggknqvwuuskp{}}y|xqvy͠˱ĺǭȲgpĵƪ˹ļ}||}x}n^e|~uuliiozn]jqv̯ڸĢδ;xlupkvsldcba^ZYXWWWVTSROOMLLKKMONLKWYJMXOFL[oogwq{|pv{ſİwzvzβɺͻþmxr}mrkpq~vatq~qolnsysy]y{kt|os~~~}uo{~pr|xrzwonrsjlagunnnswivmcWhPV~r\qVKZB:KL2=ZaWT]J@Vmdb]XUQLYMmfbVKfKIc]Q@GD:N_ftn]jhe^g_g`MVQRFHJ6*))'" !#"!""####$##" !"##""""""""!!!!! !$%#%')*+,,---+++**)'&&&%&&&%$$$%%%&&&&''''((())))))()*+++,----../21,+,,-/7Dnţqytvxeghзͻid{p_pwbg]WRUiwx|xkYN_{r`I]]m^XgbkgZczsejg]gfn]X]R[kkhcai_]gdag__aa^iU[fTcbjnjXkfmnydYgjXXsWS\^^`^`qbTkjh`YO`msloi][kNZR\ffQW^PWVWV^d[SZb_X^_mmezztquqfb^akjmnqtrpljoppg_CIXUPIHLLLLPV]]\VNQXZX^cb_YIIKHIGFJC?>CMOOOOKDHHHOPOSQPQSSQPKNMDIH@EB=;;ADCAHI><@BD@<7=B@@>=AKIMPJABBBGHCOLIDKJLQRMJORTSMKNROJHGRHNEJHJOE:9KIMSI>5=IH@9B;@?>GKG9CEJGHKMPNG:OZUPabOKNbXV^VROYUPGbZZUX^gfN}xuz~}~~}~|zy{{ww}~{yyzyvuwwy|}~~~~~}}ywvxyz{|{|~}~~}|{yroqqpnkjihhfij__}}}}|}}}ztomgega[YY^[aeaileT^a^[`XMMUVLT]^]OK]chfb]mn]jc^igdsmxvjnqtxxtouqttoql^fokb_^XWZcd``PPimgkkfemfYekgfgltzurtnffkkllbmpehx}ynbpqb^m{spusrtqoooptxzxll{|utpmhLFd]VTPPRQTOQNGKQWXUTWYZZ[Y_`]hkbgoi____\YTU[WSZ^^gqjfohf^_lkhmuyymdl|xxz|zusyyngsuajwssuxsioqnsulnq_ajikljjifacggijj[Z^ZYbddgebowqlkmqmc`_dii[N^hahpmid_jmlleglppw~}w~uqu}~}}ŷЦķȶ{lpyΥŽ˺zyub_yqvoefhuwdaiwһĎǚ͸ſȱvln{gvtjjb`_]ZWVUUUVUSSQPONMLJIMQU_g]RNKJC>Jasfft|~uyrmyĔƴǽxt{|ؼ˿÷þžs~iqzlzhnqzplxxuxool||ssn{x{uhuwiq||tosw{wml|~yystlwpchbpuonlsoftsbZqMa{ndmPT];@VF+Vab[aYMDoncb`gkT\T|^WRmdK`XU@CJ=Kcu|vk^gcg^jjudWVRZMNH1663,$"%"#"!!"#""""""! ##"!##"""""!!!!  !#%%%'))++,,-,,+***()'&&&%$$&##$$%%%&&&&''''((())))))()*++,,--../..10---...:W_yȩ}dz~vvyxvflø̾õе˹e]otjZtj`kij[^jz{}}cXK_xowXL[UtZ`cYiiVb{skmghsojZYa`eied`cfYbc\fe]f^dgfUf\[fbggf\phmpzaeofTapRU^\]\Sfzu_\rlf\WScqqilgcefT_^ijbPi^]ce^Zd^YR`e[U^^tzak}xtuznd^^hkknpqpmmjnxwj`[MEHGFKNMNRYb_ZVRRWZXY[]]\QIGHFCEE@=@FLPNMLHBEGFKLOTTQPPPPQRRQIOQKOHCFGGIIKKNNMNLLJFKIEMOHFHEE@FRSSSIBGLCAHIIKMMRPLSKHOPOPLHIOTSMHIHIJH@:?E>:@A@@?>=BDBA>:;AI9?AGEQTJEGFGKLGQMHGMLNQNKFKKKJLLLOLEFJQIKCKJHHA8BULRRG9?JIBBDKCA5>MD9:BA9=B@?CEDEHIGFD9?DG8A@BCOMCHHHIKLCJLFEJLIKIHAHGDEJJGHGADKNNGEKEDAB:MXQNMDJB76GNB?GOLLNGGGH\cUUZTT[ZTVPKGFJILPBFDCBBEMFI@AUTWQ``QQJPU^WTUZSHG_bPOY^_`Nn|~~}}}}~~{zy{{zwututsuvvwz~~}~~~}}}}~}zz|}ywwwxxyzyxyzzzz||zxwvusqoommmljhebce`\q~||{zy|~ywxz}~~}|}}{{|zvvxxvvusqjeghf`[`hdRehokc_Tfa_e]VVPUPbZUWO[djhbbayxbjm`ekgolqvxyxx{}yomquxxsiceowsf_bkkjdbc]_hhjrqjknnnmlnpqqqroqrnhffcajhcgdiv{xtg_iumXZrtpttooonlilvwrnnhlqq|rern[gga[RFPZSaWTNKRc]Zeb]U_jXbvwoedsnjef|sfcaank_afmtzujmot{|qhep|ejowxtqsttljjfcej^WeecfhhdanjdopbhlY[__`ddcfvk`qqmjgibeneaojjietvnnjjs\aZYab`OTeickjgdblmph^ktrt|}zusru~ɼǽԡƶŴÜ}oȳɳ{pd}zjy{h\ftsnhafedquboѳ۞}͹urzpl~nfb`]ZYWTSRQSSRSSRPNPX\]XSMQ_\U]`O@?;=Zb`cbw|}v|x|ŹʴvsçįЪȸq{lww|tw~{x{wvhxvssm~|wg|xqhrnaly|{ffrvvslcszmsuwnnkjhs|opkgpffimdgjTmuekjnPe>M_L0S_Vouq\>hunXbx_y}pPezzIJ@fzu~{{u}b^_ks[hgtb\ZckWMHHH52=5:7##"!! !!  !!"####"""""!!!!!! "##%&&')*++,+-++*)**()'&%&%%%$$$%%%%&&&&''''('(()**))))*+,,--../////.00.-,--5f¡~Ũ°zr{dɼѽ̴ƽҮѿ´öfRW\juv{y_tt^hwz~diUYOcmdgdSFNUvz_`ZYtbOdwqtpoyoxqdinlbak`dfheSa`Zcd\li^i^[i_e_\Vjmngybhju_`odWY[YRITjkf\ihcacTXbphdjhejdbehojbndpw~vgiea]bmdZcgV|h\lumqymjnqqnhciplkrsooqqnrvfabXPJDGOPNQTY]WTTUUZYT\_be`RQQNKQLJPXURWXRPTOIKMKMRRPTPNQVVUUWTSVWTNQXTPOQRTTNMMONHHNJHGC>DDFFFJPRPPRLOOMQJJOLMLLMPKGMLLMMJIJJJJJKLIJMLD@CB>BDBDKJIKKJJLJ@EJE:B?<@IE;IBCEHEE@23EHBBCIFLMILELY^WUXSU[ZXWQQOPVSOSJMG?@BGLDIAGUU[SZZNSBKV\SVSTKHP_TFOZ`^YN{{}~~{{yvuvwvwvuuvyzzz{{{}}}~zz|~}ywwwxxwwwwxyyxxxxwusrroljjkkkifdcdbXVv~~|zzz{{|}}{{zywwxz|}{{zyyxxyyvvwvtsqqqhfhhgb_djib`qjkgb_eddh`[]OROb\UTO[gmg`^cyn_jo`bhgllowzzxxwx|rlnq{pikiq{uidfonkhebcigfitrkmonmlmoqromooppnibb`\ffZ[\fsvssiZbnkY[ornqsmmmljeluskflfcgctm`jm_dhe^ZWQ\\f]W\Y^kecib_^gl[dxumkpohpfqqjieiwobgmlsxtmonxwlhbnp[hotqonmkohb^`]cgWXa__``_^ah]coi^diZY[\afhcfzocqzztnswwsmiwommmywqqmondc^`Z]]P[hjbhhcagmoladsuvx~~tpoonw{w||̽ÐظͲüҼſätȮɿȾ~{yv^kw}ans`\`prhh`addoqgsұ̕ɮž}s^vwhje^][YXXXWQQRPPSTTQIWicYT\^OQXQWYLA=?>JZa_`x{y}tlyxùyɸαƶ϶į}|ȥũ԰ijvtk}{||}njv~qstuqq|vzf}sqiqm^jv|tbfnxus||j`oohm~rgieoovzsqiiobihkineXjv[ghkX]?X^7I=@AC>:=D;FBDADBB;C@>;AC?<>>>BLPLNLKKMOHXQCGJJIHJIHIMQPGA>C=04DECC?GFJKLMFNW[ZSVSU[[XVRQSWWWRQKTODCJKLEPHKTSXSVWLSFKSSRSNFAISXFMKZWURV~{zyy{||zvwy{{yyxvvyzzxxzz|}{{|}~|zwwvvwvtuvvxywvwwusqonmjgghhhgdbeaW[|~|||zxxyzzyywwwuvwwwz}}{ywwxxvwwuuutrpprqghhhgffgkllbqglnglhikmd_dVUUdbYPU`nof^agrdajn`affiinx|{zwtuyskmos{phqklztniiqnmke_gndejtpinrpihlpqrojnonnmj^^_S_fSRSdqqjraP\hjZ\mokolhlgedbjrkgele\]]kgZag_bjhahbY_fogajflomjiabeio_f|smpnddohtxpnlkr{sjnnmswssqn|pkh`nxfT_nrhfpfgm_XW\Z`aRY_\ZYYVZd]Rbk`ZcgYZ\^bjmck}rfp}v|wtrxsqsv|xssqsnihffX\XTdjjcddc`honiiqwwz{z{}ullolnztrwuʽɼDZƔǯõʻſtɲzǼDzvywd]z}cgzq^Z^kndgb]bemmisũ߽¼ʮty|`m}f]gaZ[YWX[_ZQQTPNUVRXdpngb_Y^XMOMIDE@;EKB^cZ^o|{pytűɐ̮έ´|yå¨Ƴжvh~||z|eltkl~~mvnxxr}h}qpjqkYi}r|l^dm{tsy{a_m|gge}jfg]vsuxxqhknanijmrc[gupYcfb^RGZU;\dQg{S@btwgluynojKUf~}yimrpro^_fvvXbhr^\Zduc^`ZLACCGJ8,,&))#!!""""""""""""!!!!  $%&&'(()*+++,+*++*)''%&$%%%$$$$$%%&&&&'''(((((()))******+----.///00//////--,0Eqœsѧƞƽox}gtsзʎڴŮ˵Ǭ~ih\gqqbhpuxbt|mTO_mz\^cXM>GWvwyTada}[Psvqwk|zv{wrvukkjjpf\ff`\[iklqZWfbe[YVWlhalfalxbXeke\\UH>FS^[NWj]^kaP[ciZdl_ehea`ipkupk{zxxrkacurciuYsuZboiallgks|{n[`tojkrlkplchhcbhkkhaWPNLMLMNORX\[\^YRSY\gh\WSSTVUUVUUWYYZZZY[XXWVURLMNLKMPTXWVSSXVQQUSRQRRSTNJLLNJKOMCFC=DNQOJJNNMJKNOMNQLINGDKJFIDDGFGHKHKKIHAELLIIKLNLJHMOJJNNLOMMJLOOLMPCC@88=@>E@>?@??>CF@=C@=<==8NU\OFZbYckYR\bdXgi[dhd]^honvppv{xzujahwkjxlbxn\hqc]kicju~}k]ozkfjnfnoloifb_dgmtqgZTNLKJIMT\a^]^YQSW[ciaWTSSWWVTRPQRTUXXX[[ZYUTTNMPMIHLPRTURQUVQQTRQQQRSTQNPOOLNQPEIGIJQTQLJMMMKLOONMOLHLD?IIACAACDEFFGKLIHAEJKIGGIKKHHOOJJPNLPLNILNUMOQC?HA6?E<=E<=CA67?=?@>;>>=?ELMDEG?=<;::ALQPNOQRVNNVRDLTOJILJGHLOLHA?A6,;CADEEFFGMULGOTXWQSSV[\XTSQVYUUUOLW[VMVTLLTTQRQTRQTRSQKBHQLDB@JPLLJGCILC}{yttvy{}}~~~}}||}}}}~}{{z{||{{}~~{zzz{{xvutsqllpqpqssrrqomkjihccdeeee_We}{zzxxxy{|~|yvuwxwxzvux||zxxxvuutrrrrrqonongfoldpshrzcsttpiquwspkcqqhiprh`kputjgjjljkponnnpvztvxuuwsojqla`\fpcdm]ipqpdggqgZ[ad_b_kc^v{qikmrutmcnvsqpoeaYL`dXSUcon`jSEWab^begebafoYN\dig]_ba_ZVS]\LN_^^krrrqlhr~uqvtwsonh``cag]atj`_fdY`adhlkjku{tmqpjqvssnly|rstbgleXUhpbZll^^UQRUXVRNTXWWSNT_YLQac\XhcSeijnssnz~vpuvxxutvwtzwr}}yuywxn`akwqihc`adqypz{vysyqjsuqrmijfdhtqy{ɹͽҽ|ռƸµzvv̹żtivuytnt~~}xmrvj_ZXXbc]a`\cfdbrɼȽ˨{znsznptvxob[_ZXZ^nwoYIW\MWY`wwg]VYVT[g^KA@@DKH:Ib_V][yZdyʼµê~zʸӼũwwxp~ovtfnrzSlnrqhrdsrnskphncMmwkr_g]tnzniN\rze]aw}jei`pojw|pkkowwqtuo_^hobZ^e^XFS_G`cP[]aietqrw~cbs|hst{~omjp_gokaaktuV^klTTXbwiihd[SNKIIE=68FF?@@=DC>:BC@A;9=@B?DOVRLQLE@<845ANQONLGMSIIPKESVMKNONMMMMJGDCD:5@CADKMIFGQQJHNSVTOQRX^^WSSRVXUVVNLUWTSVUVVTRQQRQNNQRTXODNSLGFEHKKLJGDIAP}zwvuvxz{{|~}~}}||||}|{zyx||{}~ywwxxwussqnjilnllllnnmkigfdd``^bcb\Ti}|{||{yy{{}~}|z||zxxxutx{zzyxxwusrprsrpnmnmlgerqdruht{euvupjuuvsonmprrlqumjpruvlmkhqlqwwwxxzytuqrusldhm^XVYfa[f[ajll\\_k^OV]]][Xhblzuspnosyulfp~|trtnh[PjgeaecmlahPFZ^\_ceg`Z]hoSJYfi_V[`^YYNKTWHH[`bmyxwtmknyskvsuvpqh__ZY^T]pbRQacTX[`gihhku|ujqrhoussljovsuujjhk`TcofXet`XXRUWYXRLQTTVNGS[OIS_b]XhbVmqnquuu{yuru||}rutsqpsp{uq~{z|ukqv{vrojfciwwq~ztsrwifrsnlihjb_mu{uuϼִȍΚͱʶ»}ǾѶzwp~}xzu{z~vv~pc\^W]f[Zc]`ebduǴ˸rszzljxiz|r|q_`e\W^atxdOXcLV^gl`ZWSURPX]UG<;@ELKCXjUO]TFYnZ]~xxųʹ˸~Ŵɟ~ǹ͓Ͻ¯wËxuu|~mx~yhp{hOnoksem[qm|rkksei\Loogm]iY{o}zk\I]tnY[a{df``mel}zqnmp||xyvmaajkaY^g[QLfZPlTRhp]j\akw|bwoZmyyqnztgois_cmidbrrnU[nhLLV`rmkdggZWURNJCCMVB46"! !""""""#"""!!!!!  !%%%&'())**+****)))&%&$$$$$$%####$%%%&&&'''((()))+++++,,*,-.../00122211000/./6KbjЪ{o~˫|ò~j|zɻ̚Ӭϯοпpzzspxjtyu]csoh}]Qd{r^hsUUOfkhj~Qqsqpg}{s|s{s{vrrcdku{~wjee]dJL]j`YT^^[jmah]Q\fhYH9Q_YT>N[Q\aRSYY`T_c[``hYQXejpvmpr~t|sgijesrmwp[cswedhm_hztfbn{oeggekpnqplkihgikmmkked[RS\__djed`[TSUVXah\VWPQZUIRHICDOQPPPNOQOORRRVXRGGC@GLHHMPMJPMKKPTWWTRVWTRSXYPUOUVSSTNJLNMRTMLPNLJGH:9CA:8:;9FKCAGHEIE9@IKJINTWUTWOMH@705EPMILF>GMCDICDPOGINOPQQNKHHGJNFAEBALMMJIGJHHJMQTPMORZb`VRSSUVTWWNKQTSSTX[YTQRQROJKNSUWVQXVLIJIGINMIGJN>`~yvwvuvxyxy{}}~{z{}~}}{z{||{zxw{}|ysstvvtrqolhfjljhfgiiihfdba`]\\_cZRl}|}~~|{}}~}zxwussuyz{|yvtuvtssssqomnopofgrrdongtzvhusroktsqpopsopwlpvpjqtwremnhnjp{xvxy|uoporrnmb\h^SOOZ`U^[[hieXSVeZITXVZQYmm{wrsqqvyxupnt~~ususncZrkqpoiolhoYO`]X\ade[QZimRKXiiWOYa[QPDJTWQRdmns{{yunigrqgqjnqmpkd_WTUOVh]MJZ]PUYblqohfqxl`jj_inlribfonnroqhmhYbln`]qg\_WW[^^WMMOSYI>PZKGX__^]jgezxrttstyploow{tt~wloljhhhjx|ou{}~}~xtz|z|wqmjt}utxsppvgdrrhdefjf[htv|xĹ¥֬fͼ̶ǿw~¿įʼqzq}}}}~j^hZYmgU_`_dchsְ~{|}sjpyhbht}`gpcY`hqn[ZfS_a`^[XVWSPNOOKE?66@GGXpdMDBTXQWtt[m{Ы|ȣåžu̶|»ɫnģśz~{~yx}lq}}~m|ufoXRust}lwcg]~iivr}fmuafUMpeeg[jXt}pdOG`oaTZe|uwac]_fbuyspls}yulfgoka\fhXSanWchJZz}ae`Wiibnvlbdvuktq|irgvgfmgg`rlhTVjdGEVdllkahq_^\YXSNPUTAA1&(&! !!!"""###""!!!!! !#%%%&'()*+++***)))'%%%$$$#""####"$%%%'''(((((())*+++-,,,+,-../000122211101/..1;jʫwþjsxùwtƺϩ˽Ŵй°œ}yzmvooq~sadrmid^l{zns\afwn~xPnslgxr{wxyxur|pgrsu{~urleacFYeu^OU`XZmediUTZhaWAFecYP>YWM\WLSQZ`Vb\\bccUS_gfpznnu{utymgkcj~|lprhZp{viejo`kwjafqunlkgfjnpqoolgiklhjkknigdYXafedeca``ZVWX[_jaWXRQ[VJOCFBBJNLKMKILPQSSUY]YPJECEGGGIKJEIIIJORVVROPUTRRUWMQIORONPJHMNMOQIIQONLLJ;;A>=57:4LNJE>CMICELHILEDOTQPPQPRSTVSUMC85=LQG@FAbx^TNEcRNZQKMP`\V]Xaai^V[cfbs|mmxuqvugdiev{mjlj\l}rmenoclodbgnqrokfgkopprndeoolkmlimmki`^ckibcbaba\\]^`cmbTWUT\XLNCDBBGKJGKLHLTWYYYZ\[XROMMIIKHHIEGJLNNPSSPMLQRQQOSKKELNKIJHFIJJJLHGLMLNNLBBD?>3574:<:97EDIGCJRMCBFEDDD@;>;BJBC>BHGGGHNOMUWHHRPNFBLMDGHIFHHKSWUSQQMKMLMPSWQFBCIPPE?C?@FIDCB@AEDB@FQONLHBGKIIKHEC@BFFIE>?DEHJMPOPRSTXZ]ZMNUNIMNNNICFNPLMUVJFNQVPKFCIIRSQXYZYPUZWYQMPXWJ~|xwunoxxuz}{{{zxuvyzz}}~|{z}}}{yyz}~}~}|{yxyyyvqnmnnmlkiecgigecceedcca`_[XY\SJj~~{wxywusvz~}zzyvutuuutrolkjknpppcgni_igfgbfmrqokmpkgiqxwjdlditkalrog`ehbesokmnnmorg\\blunhjhXU[NHFGTMGTMdn]QIMWOGMGRV^r{tormksy{z{ywwyyrsqmqoouo~xuustwwkh^\^_`aTMWcbVLXn`U\\^^_`^nwr{s}|zw|occhlgo`^igjjpl_YTGFYYLLW^WW_dklkc_kr^N[^Q^d[d^Ydmb_fjolusosmmlabfemj][[^`ZKF[ZFISSHLYbflyxt||mlpkcck`Zdeinlmri^`]\_[Wblgjsrpqvz~|rsnswvvy{wv{xwwmbosmkpjlyaXnúĴϬܰސϺz}{uhy÷¦ĽkvyxiroorqVclhbfm¤|}yx~|{w{wwxnkmsp]qoj|wyqeW`ea}{mbacurrjf[W[WPGDFFB<1?aeSLF?>@JJDOotcv~hoy{xtp˵һŲįtwnstv{iyyiixp~wpi_w}ca|Rnqmi`~kywqkdZhqee~ooq^mo_eO\j`b`aka}su]PCO^\SUZjhqjiZ[^^g~{uwmg}}ywwlkotkgoui`mrfidUalq[_Y\lhwf{h^Zgersqvgdrgs^gfiTI]aD9Re_fl_f|_`aekf_ZUOPC2FE3,#!# !!!$#"###$#"!!!    !"#%%%&&'())*++*))('&%%$$$#"! "!!"#%%&''&'((()))))**+,--......./0001223444310/.-4PЕlp~mys}Ťpa|кıdzоʯʾɹɷēluxh~wgsz|ur~j~w{x}ofrkm_b{h~usz}x~~ft{kr}uu~giqXSnyvRSXZS\mahee\Xf[OLywXTQObNOVMKKW_VRYZ_`nX\cgfcuwkmzpoxqecjp}o`he_ez|stohvnejhbcglrrnihjpooormcjtpmoqnkkmomhgjlfcddcb__`abbbg`STRTYVOQJHFFHJJGKNMQW[]]\[ZXYXVVVSPPMKLKMQTUUURQPNJOOOOEQLHFLIDBABCEFGEJLHGGHMMMJKNF=68669864???GBBJLB=DGFJKA:<:7CF=A>AAIFEFHHIUYSRRRQJJQKHNNKJJMUXVUURPLJLFHKPUUSRSSPLEABAEFFFFEEDIJFFNWURPDCIHGHEAA@=>ACEB;AGFGJLNOOSVUVX[YONUQILNHKK@@JLFHQOB@IMQOLD=CGNOLQVYWOX_YXSW_`MS~{zyvqqutqx}}|ywutvxy{|}|zxzzyxxwuvy}~}~~}}}||}}||yroqssqmjllkjigdccccb_^```_^^\YUUWRJd~}{yzzxvux|~yuuvwwusrrpmkiikmnonabig`ceeaYcopokcmme\cpuqe\e`hpf\hnjcdac]cwj^iiihim_VX]ltjdfcZXZNGFISQCSMZn]IENPGHDB[cjuz~nqujkx{|||zxxyyprphpttsnzxuwnuz}rj````_[TIP_^YQXiZYbaehorv{z~}ywylkksoqfZdffiopib\NHUWNQ\g`]cfijha[hnZMZ[M[`Wb_Wdk^Y^jokuvsrsrjhc_cijbZST`dLE[TPWRUTXdjkpywstpdfkcZZb^U_b`jlikbX[UV\SM^d`inmjlot~vlpjq{rsxz|ut{{wkt~ywsom_rħ̫Ӊů³|zunuıϱzuzɼ{nvsuqW^micemڴȵqrtwv{xvuzks{nbos^h~ip{}mhX]ea|}sc]_jzu\QXTH=:?C=13Pf^H=BKMMLORJUp}lgmxqw|f~ʮɿžΛ»~ox}mkwpoxoigbxzgglnyu_fwxtb^uctjwg\[|xmtqph`Z`qe`~gko_fqoaWgg`_]jikqtrSKCPXZUX[hgrieXY]_jsuugj~uwzxjmqrjpxvgeqojg]`ej^U]Tihng|m[U`t|g}y]brgqdajpLFX_A;W`[hlag|_^bgnoj\SQOA:9988:>@>IGCEFEGTYUQOSTOPRMPUUQPQTVWVXYUPNOMDKKNTZ\ZZTJGDA@BEFFGHILNMLINY^[YUGIMFFHB:;@@>?BCBAEFFFHLNPPRVSRWWWRPUUKKPGEJA>FIBDOM@:CJPOMB7@FJKJMPXSIV]WUR^j`Mk~|zxvsqqoov}{{|xuttvvwyz{{ywwwwwusstx||z||z{{yz{{zzxpklmnnlijjhigdaaa__]ZXYZYYXXVTSURH^}z~~|||||{zyzzxxvwyz{xwvvtuvuqqqnjhhikooo`\cf`_bg[SaljneXliaV`pof\Y`]cob^bgmff^a_fvf_fca^jjYQW_lmd^b_[`[ODHLRR@OTTg\?CNG@CEVprrsvursrgr~~|zxtpqpdpsvrksusrem||tj`bdc_VSHK[XTRS]TX`dmq{}|z~~|}xtn}}vn]cfbempof^XUZZW\bjk`aeikbYTafTNXUN\]Tab[gi\W_kmmurim|vhnib`io`VW[fgRQ^]``]ilkrrnpprqhe]ah_TQY]TY]Yfibd[QXQPZLJ\^_ikhhffq~tkmjtvqqz{{vm|~}{ytpez̼çܴɰəij}|hsoy|;ı¿˻}þǥqx{{s[Zkidbm֨ڽϵ~stzvtruvxtf||bq|_\qx~kmh_hcw~|d_\YgzcHBJHB:CKEEFQYPID=ANMNQIKQOqsxvppph̽ǺǞ̯ųdvjotwxngurcpg^tmZiwnumYgtwrmn`crrign_S[xnraove_ZYq^__hqahsWeiba[^xiw{jukIDCNR\V^aejtgbWS`_lzktnctupwphpwomyzsgkpnlfdeb]T\UWolmmyXRYkyr}|^drcnnavwJER_AE`]Wkkgl{_[egrws]RRKGSTHL423# " # !%" $#"#"! !"$%%%%&'&'(())((('&&&&%%$##"!!!!""##$%%&'''(()))))*)*,-----......./0112334554223228gydtƿǿŮ´˸¼˝ʷżmpjp}|wvsygg_crlont}~h~qaumryvzyevxduyys]`_STdjhfnghePM[pr]^ajknZSOFLORRT]rb]imShmdhmqiptyiowikcmyvaig\hvm`nmfxnnmcdbefisokienuommsxq{rkwuqrnljnncjrfdikf_\ekbY[][VSRQRTTVWXYZ[[\\\\[[ZYXWY[[[ZWRW[VPQRTSRRSRUXXXYQPSRTUSNLPROKKOMFB>;;BJYHKJHIHHOTSEFKCC?;:<=?JD@CA9:DEBDGD?:88<@;<@?@=HDDDEEFSTPPNSTOPSOTWWUSSTTXTW[VPPTPJMMRS[]Z\TFDA>=DDFIFLMOUNKHQ]`b_VMRRHKOC67>A@?ACCCDDHGHKLQQQSPPRPTWRUXNKRH?FE=@IECIND6@IOOO>2?EEDFHKVQHRYWSO[eWQ~~~zwusqolntxzyz~}zwutuvuwxxywuvwwvssqquz~ztuvvyy{~}wxwxvutuvwuplkkmmjfgheeb]^`_\ZYZVUWSSVWSQURGV}}}{yy~}{{}~~}{{{z}~|{{zwwxyzzzywwwvvwxxxxwtstvurpqnjiijlpqqaWadc[aeZT]fgliPjf`[^oh_TW^[]i_]]amnmbbfothmf`Z_mcNPR_lja\a^Y`[ODJOOQ>JWP`Y=EXHMNGIFCKPNGHLMQC:ED@GIBAB=8:==AHIG@=<=A=;<=>>>FBHHGGGPRNQPPSLLSMTVWQQNTPSOU[PQQZUMNQXVY\Z]UCC?<=BC?ABCFBINLLJIOPNOJNMHSVRVYMLQI=BE?=GEAHOL;;FOQNE;=GDCCBCUPHQYVRKO\PT}zvutrnjlswxwx{|yzywwvuvutttuvvuuutrppvxtomkiprrt{tptqsqoorutqmjllnhcgfc_^\\]\[XYZVUXRQVVPOVMLw~~~|zzywwz~}~|{xwxz||~}{zyxxwwwwxzxuuvussvxyxxwuuuttuvvvuspprrrpnoomlkklqrrf]`cf_ab\ZW^dhkY]b_^]laUPXXOUcZUSci{sienyqnxjc^ciYLPUehb^Za^Zb[OHMPLNDQYT\SCMSONZvzzxtvrrypryzznjlt]bhkqheeeg\dzvthf`bjgfgV@AQQQPQ[[`eku}wu{qpuz~vnz|~{tvuriglmqmgfb``aakpb\fpi^VP^aKMPNWb]P^gia[]Q_klvkbjxuutfbtq`apvrsxrptsuxvuvogdedde^\XXg_NIO[NPVR`dYYSFUOGSFF[]^ea`ddj}yummyztqvpx{v}rmu~nl|ǼœxuԷϾėyy~|vmi{p̰ϟûδ~κ»ȕðpyrZfcbhrÿƯв|hhy{{vilxw|kTt_{xpc^tyonpbJNj_SeeY\UURRXVQF=DQSA6:?AUkfaq~q¶öµȤsǞwkm}{{zxtzgX~weyuiayakdgqmZb^nwvfepiS_b^_cbV~gqZa^QFfhsdZ~myt\dXYhXpxXhvgLdwbgd_~urbmoT>;HKOa_one}qmgY_cXp~jedcptnjro`munqwuplmnqtuokk_VgTPtnemcKScjpy~vu||yxarsoxpcNW`P[gT`y{mwm\tu|xz_^gYaiZZ_GGB66+(***#!!"$! !!  "#$$%%$%%%%&'&&''(((('&&&%%%$"#"! ! !""""$%&&&''(()))***+,-,-.......///0122454368985322Ulw~ƻǽһ¿ϻüθ˽սƶij|lyeZ[p|am~py~sjj{t\pjjyhqlovzuly}ng\[`ijocuejXNT`vfWhowvrd`KP^PU\cxs\fhaXjkclf]\wtrdlqfrdiskdkcclfdidmlflkdb`djmmhjd]drqklk|xqylzxpsprlz`imaagqmchnkcbjllefhbYVVVX[]acdfhkkjjlmmkjhgfc_ZVVXYYYXXXWXYXXXWVTQUSJKPOKIPRJKQSUWWXQGCKG@BJULKQLKHEKPLFFGKSEBLB>ED@AA<:::CQVPNGHJJIE?BSPGPUTOHGTE\~{ywwvuurjmuxzxyzvwzxvwutrommoqqqqstrrmipnffjhhlikqsuonsplmmnpsronknnqlfggd^\]^[[XTWYUSUTRUUNNQSpz{}~|yxz}~~|{{z|~~|y{|xvvvutvy{{z|}zzyxwvvutrqruwwvuuutssssrrttrqrrrppuwvvvuvusrsttrrpnmmnoqommmoonoqssrncbdkfccbaW]dfmbP`^]\iXMOYVISbXQKnktnhrtrrkhihb`[bogb[`hbegZSRUWSPS`[`aZW^]\arzw|zyu|yz|rux|lfhxg]gfoj^b`d\fvrnb``deehr]ANX\eY]ngnyy}{uwzolsxyqmz|y|}zzystqjmuulhgfdceorljntrfa\ehJOZU[fd\_dnga]Xhhnuffvwuwvggsofmutsxypotsrplotka[]_^_WVVSc_LENZJNQN`cTUO@SQGNAF[]^cgnmmt}vvwoyqo~{xqfkvmxŴwtnsΧ°ǵ~}}v{Ͻȶ¸ȾȼǢƯɿšxz{gmjgnvĸçϿętc{vnl{zu~lUnuZpi_mqwpaRYtj^loX[ahaVNMMJ>?JJF@>CGAjpewrҵοĻvհDzij{~{z}{luyl^XgokeWt[gd]on\Wdcjc`lgSZZUYd`\sapU\]JEjjn_lepkXjS^c^wvTjxwmRxseohm|xmbmhO;=GGW[hwlonpigi\]rlga^frkbd}``lpptxnlmkmw{yttmbgfJhwedkTT^ferr|ju|vx\yrngabl_fhZrxwcy]ns_lqvtdLUO@?05;40'' *&"! !!$%$$$%%%%%%%&'&&'&''((&&&%%%$#"""! !!"""#$%&&'''((()****+,---.......///001344436998663,C~~Ⱦ˷μӿĿзżƽӻ²}Ļ~gscTar{^qxm{vu}fmv|d_pawmen}rvpmy}qnZeb`lrkmdm^Wdjr^XlqvtsibWXgS[djum]d^[afdel`UT{vmbhnepbcnieldcljecjrdflhde`djqmdf^Zgqmhje|qppjvmpknpwngrk`fjxmfmjcbfnpmknmc\\[XY[]^_`bejjlmoppomlmmmkifa^\ZXXWWVX[YVTUVXXYTMKMJDCKIBIPPUWY[XMKUJJPZXSMSUUQMRTPGGEEJFHK=;?>AA><=>>?EOPPNPQKHLLKMBAEGQZUSQQRSUXVUVSSSHRSSHHVTDKLMOEQX]XSRZ[YWZY]XFEDBA?FQONRSUHGFFROS_UQNWPW[OMVVBLTC>CGJORY[ZXZURQHBKEANPMQTLJRQDJJMMKUSNSVNGKTYYUPPPQQOHJSSLTSRMGHRFi}zxz{yvsv}|yslouy|{{xpswpkkmmkihgikijlopkjkjmh_agcdjeenpmlnvrklmnqusoompqsnlnhed`ba]_[WZXUUSRTUSRQUnzyyxywtsuxzyyyyy{~zuwyyzxwuuuxyrnrutqstuwwy|}}}~||}wrstqnnnonlmpqsqqqqqqqponnpqqoopqolntutvxwvussttpmllkkkllllmmnopqrstsrqmhirkgeiideffjiPc][^iTLPXWMSdXMLtr~vrkp~zu{wqrvwusnuzmlcotmwxlb]gngabmiklmnrkgoq}{}xnrruqgduqbh_jnY]^c_hslh\X\_`^ly]Hanlnhlsny~|}sqwwuqq|xsrsuz~uywq{uisx}vmpsonnuxwxx{wsknpW`lcbkonggyvlaeqequgo|stuukmpjmwxsuzunoqlhfdhnk`WY^^^ROTSc^KEPYHJLLggPTJ?URLNBK]_grx{y}~v|q{sjm~~ĺ{ɮ{k{tkͬǻ˽}uzwοŽ˜Ԡùüîx˻yozzpqxŲʬy~~x|oqrlt`j{colkf~y~l_\cpc[jiTXjvYJPTTOB?KIKUONNQRqpy³ǹ˾{ϼī\fo~uiw}att|_U|muY|iSk^fgSjtcQvrceje\ccRSRORb^agakO^YAFnmaazy_i_TmVb^_ylTsy\hqnqox{znclcH<;BJ^Vtvounmtg[ee[n\`ll]YguZ`fpsruhikeo{}xyogsU[vmeib\`bam}n~dt{t~p_~z{lfvnzildf~s]vhyvyb^dVDA@EG70"7."<2""# ""#$%$$$%%%%%%%&'&&&'&&&'&&%%$$$#""" !"#""#$$&&''''())***+*+--........///0013444457:95100Bx|x¡ʼ³ŵʸɾʿй·vbq_Pkq~|esnpttumemlr\fka}seglzy{fpy}rp]jYXmqqpkp`_rrmZZmqwwqkge^l^cjmpoedZ\eeaek`VQyvh`ejanc_jgckdaoq`gvnddljfeaekxpdd\]imnfeaxklgilckhnn|unmrgcjrxnjlgdhjmlklpmebdc_\[\]]^`dhklnppppoooqrrrqmiea^ZXTQTXUROQW\\YVUVTOGEJKHIILUTPXTLSVKUYbVVRVZ\XSXYVNMJHIFII@=<@C>;>AAABDHKMNPRNNSSQTLLQPWZTROOPQTTUVYZWTNVRRKS]RGNLLJ?QVWUSRZWVX[W[^RPMLE:FRMMPQSHHILPHT^UMO_U]^KPZXHQVEAKMKSSZ^_bcZZ[GDD=ALNJKMIHRXLIP]VO`\YXZ\UUUY_[WUVWXXSUYVRVRUQLOWVmnqolrz~}|yvrsuvyuqvzqnrvx{yvqhjqjabfgdccbdecceffebchid^]_]agbalnklowujlmnquroqnqssoqtihjffedbadd[VVVVZ]XU[lzzyywuvvttvwwxzzuyzsuxz{vsqsuxvlinssrssuxywxyyz{xtuutnkkjijjjjklnoppppponnnmlmopnmmnokinsstvywussttqnkiiiiiijjiiknoooqqpqplmmlrqkhmqpnhefrgkc`lnZUW[`YYi]O[uxzwttprwz{{z}|ptvzxxrpzxuqx{x|||zszxzowrv|{lfkvhiWcnTV\bdkqkcXRZ[[]ls[Thzupuutw|ztru}tollnq}zrusn{wjwy|qtuxzz|~~vyzix~olrwzpqxiorgvwqvxrqwwptrntzwswzsorphb_``cke]Zbjg]OV[jeOMY[MJKJmpRXMI[Z[TNZck{wsrw~ǿyfizlϿնģũ̩z}nu}hv¼ɬɭ̻î}Ƶ˶wo{uy}~nyswzhdqyszkuhv{ra\hucY^]VW^XHHRTRLFGXjgXYbf\Yq}¾¶ĹoǫŵsUnts{|zl{y~fewqta_o`jX`caqP[gMkhZm}ogYZaSKIGN_\dbc_NePDKOHJKHKTXRMUi^Whegbaf`^Y\dca^YY[[WZ]ZWVSXZXZYaffdb`_bhjmruvuuttsqssr|xsyunotvwyzvnaboieaagcbaabc`^a__c`^edbb][]eicfnnpsryykjklorpmmnrrsrrvohkklihffqp^XY[`fia[k~}yywy{vswxvuvvvxzzvw}{vvxzzxpovxythhmqqprtvxxvvvvxzxrprrkgffgggghjkkmooonlkllmlllnnmmmmmkkoqsstvusrrrpnljhghhhghhhhimnkkmmmmmehjpwvomquxrnmoquxjp{zpkdiqlowmcpw{ywxzrmt}~}~uy|~|}|||}z~~~}{pvwxukjsliP[lTQ\adgmhaUMWVW`igYZhzyz~}~tty}~ztjggeqx{ummxvhttxuknuz{~s}wwvuytvpot{yxuz{uro{|wxwvvxuuy|upstka__`blmfdkw~qW\gspX^ld[TRQx}]jbZirqagtsxzyqǻ}wikoѻ̷أÞ|ypȲǷĻëu˲wk~{z}|yxow}z|zzm||fqy~xhvtzmv`\ovaPU[X\^O@FMJGQWOVwfbrw{m{Ĭµ}lƝjeqmpqovs}Ɏ\u}lidx}p^cSri^w`S}nKebWl|vkXQ\TE@CL[Ydwa`ZTcJFYpRLchUTXWo]J[{mPdzyikwwirrtveqoQD<6DV\otsxyrrbe_G`nUmk[K^wZU[iofgeae_crxyvr|dmrnqqovgfm{zr|x_tlwnu{kcyi`ikoz{ypdV]LLHB=@5KX0.=1 "##$#$$%$$%%%%%%%%%&'&&&'&&%%$$%$$$#!"!! !!###$%&%&&&'))))***+++---.-..-../////02334456884QiZfz¨ƒ÷˿ëǸĻ|}tqyYiV]~hxosd_uvovvejj_gZoell[V^hqwhdv|uokaRNkclkwkphvytpZRnrptloldhkkihnhpudT`jaeehebUjwf`^c]mhadbcfg_ppaovpgbkliiklttkejlokoaXasec`g`[`chmhliqg`ilvlqnpqopopnmlicdhjifilifddegijjkmpqponppqrrrssssrpjfc_WPOMOTVWVWZ_`[XWY]b^XXYUUWNTYVTXXXTRUXY[ZWZ[YVVTSTQRSSRIMDHPHHPJHIPYRPOORPIIQQNUUOUPILGEFLNKJJISZW]f[^\cd_Z^][QLNJQVQU]XTTTPTXTTUUTOQOQTUTSQSQUTVXXZ\`^ReiQQWTPRVPQUVWX]dhhooniobTKHJNQHIJKQSTV\kphiiltmiledbbggfhY[_[Z]^\^YV^bba_ceddddb`bfgiklnpppprtvvz{y~rkmvxusurjdemmmfckgebcega_a^^ecbgeefb`djkfkqtwywy{nhhjmmmljlstpqpusginnkiilwwg`abhstgfv|xwwy{ywwwuuvvvvyzwv|zutvwwtpotwxqgjooonoqstsstttu{{rprpokhgggfffhiikmlkjiikmmllklnnmmkjnpoqrstutttrommjhfggfffgghhikkiijjkkidgnvwvrrtvxtrtrt|vr{}}{ry|{yyy{z}{xz{vpv~}|y}z}{|~}~}~~zw~|{}}w|{}|rqrsgNTgNKZ[^afc^WJVUYbeaV^s~tuy{}}xjfdemv~smoqsgntqlelt~~u}y{zyyr~pk{~wunvtrpn{xuxyuttrw{{wtuvpebfolsuqtvber~zdt|mod^dosp}|n˿ο~{}mrѹƨȕçʾqx|οɳƦɺéyˮvk}z|}x{|zy{ky|yxtzrskxvhstjwbe~r`dtsmnhO8;AEWgqnd}|¢q~p©|fukxxvkwspktztno}qw}hhwmPblcvu`|nKi~\^fu~n\JTRBSfoiyx}ʴѿ¹ǻ·øų{zxvl~tSeWldu~npXazqpvrdji\jZmdk]VN`pur{[rvptedEaacqhwing{urrYKnponehp`ikmmglgivlU`l_gffedYgsfbZb]jjc`bcdh]ppbntpjajiglnm{tpkopqpubZgoa`dg_[Zgekhdis^_ijpinorsoqrqqnlidfhjhhlpokgffgiijjknomnmoooppqsssssrrplic\VRPRSVVVVX[ZY[\^a_^]Z\_\V]`^]\[YXXWWYZ[[\\[YXVVWVVWWWPTSUXTVZTUW\]\WSSTSGINNLQQIQPOMMNPSSQVWX[a[]bZ^agabbfeb\[PNTXSV^[WYRMPNMRTST[TOPSWXUTTSUV[XZfdjfZgp^TVWVS[[NWf^`hiliouqlyqeZQRSTKQNOVQUagzyqwloxwuokhilkggod[de`aa_a][gkkdbkjjjjkjhijjjmmnqpppqrtux{{olnw{upqqjmompqminjjhghihecacjiinjhkihilmgkq{{xxzrhhhkkijjgormqknrikoookinyxkhjlpvvpsx}zxwvx{{ywutuvuuuxwuw{xrrtuuspnqvyogmnonmnnnpqqrsssy{tkumtqjhfhgfffhiijihggilmnnmlopnmmljmqrqqttusuvtponlighhggdffgfggggghhijgnquyxwtvwxxuvwuw~vt}~{{{}}{||~{{}z|}|yy~{x}}{z{uu|yxw}z|zy~jS[cNJYUZ^_aa]S\^cijdXqx~~|vxz{}zjdhlnuyropooemrmmkmu}x~z~um{~pgt|okgppikoxvuy{trqpzyvyxvwymdvxz~}vnp|xsxpm}w«ýŸvx̾ǾӫǾ}ͽ̵ȳʹuȨ{pvz{{~xs~ytnms}z{zm}kvzlpohy}nh{jRl}gjeRB436Iw{ǻ~hu~tsymssugl}ǥq}muemt^|{wsir|t[]kjvunRqy\^\lwaLRN@=ASKFbtf`d`fq_[TJ\waNnllgGKriQ_kulmvnZpeuibo`lQU<9WT`|uwsjsoffJMtPZmZDQxr`YY^aZ\_[_[Ydr{urns|ztqnqvtpj}~fsz{iixrqwi~o}o}s_uwU[yp\eh_YUC>PZJ3>G9-'*'*$%#.("%%&%%%%&&&&%%&&%%%%$$##""! !! !!"#$%&&&&''(())*+++,,,----,,,,--...///134566751aaMwtkpµ˸þľ¸ƪí~~v{w{m}oRc]x^s{mkQg|mpwo}{ejf[m]ihgSPIk{hzyqWxvvjqcXGfQgqlrlkhxqqr]Lkomj`coccknnfjh\spY_l`dngedVemgcXb\dkg[_cdi\poblrplahffnol~{trrrstx|gdmm__ji^ZYkchi^opX^higjkmssossutpkiegijgjpquoihghhhjijmnkmmnnnppqstsrsstvuqlhd]XTQUTVSUWYY[]]_`]\[]^^]a`ca__]\]\Z[Z[[]\[[[XZZYYZZ[XYZ\\Z[_]Z[acb^YWVUQQQPKPNGLRRRSVYWYWZ[X[`_]^Y_cc_efgffcbUQTWW_]]Z]VSQLLPROSWTQOPVVUVUUVW[Z_jiimccyrWZfbZdeS\jgkokmjjvqi{voj^[\ZW`\Y\\^enwytvqrwzqroorphinkiihfhkildcmpnfdnpmnomoqsqllnnoqpppqrtuv{}}nnpy~tnmpjpvmsusrqloqnkgmnlhcinlqrlnutmmpilqy}zxzvighjidjndfmkpklrllpprmhmwyokrttwxwzwswxwwx{}zwttuwvtuwusx{wqqsssrpopsyljpkoomljjmopqstrvxwhqrvtlfdhgeedfhggfddeimmoppqstssomllqurquttruwutqnmlihhgffeefefeeeeffiiewxyywvtvwxxvwvwz~ss|~}|{y{}zz|zz}z||}zy~~x}}{y}~zrt{zw|s|~~ximm`Xc```dbpkmjouv{rn~qw|{ytvyz}}kejrotvyrqnpgpnrxrnz~||v~~|smw}~qgnyniamqeflstswzrrqnypoy{wxsr|}~w}y~xw}zľϲĶ{y¾Ϫɰ˽|ν̿ãȺ{ykxvszx~xjyz}tuycy}x{ymunnooogu}{vxdX_UJDIFDNUNJrx~~ygn}zseu{r|jqjgď~ktafj~_l|suvl|m_rw~u_t~}\[Xdy|dVOG?@HWHLlchb`|}d\W^gS]smzeAVkdgZpnhypxfga]sadzZabWc>=`Tawrxr~konhfGYkM^fNAbyg_XYZYUXZ[[S[dtprfkrzyuqmrvt}mtspm}f|x{gjvlxsj{skj}diiQe|r_ppfb`NTRTI3=EB3*.//%%&=)!)+&&%%&&&&&%&&&%%%%$$##""!! !!""#$%%&&&&'(')))**+,,,,,,,,,,,--....//123456641_tonj}ǮƾƦ}|xx|~w}rslkR^zm||^rylgRmwkqum{tjka]segncNLUrudvg[vtimegIOYNnpmlmmjsmpp]Smomi`blg^knpggjWmp^_jb_siffSbigdW_Y^km^Vcbj^mpahrol`edennk~vtrurstkpql`anl_Z]lbfc_plV^ghgeiksrmstwtoligiiihlooupjhghihkjhllilmmmmnnqtsssuttwxvsrnhaXSPRVTZ[WZ\\_`^\[\^^]`c`_^^`^Y[`a_]\]]]^]]][[^a]\]]\]_]\\`b\\cdd`\[XWYWVUOPOQUUVVX[[Z\Z[]ZZ_b_\[_c]]eedddeeYRSUVUb`\^[YWRRRTRSVSONNTTSWTTVX]\^kliplfuwi_pucnnddltvskljfsogvwmrpfa`cfihanmjquwutrsv|yqtppspiinnomkikompphnqoifpomnqmpprsnlooosssrqprruz|ylnoxunloksvlsutwrnrvslhuuolciomouqo{ypopilpt|zxzxljjjjfisi`gmpopqopqrsnjlvzonwwvxwz|vorwwux{~{vsstwttuvusy{vonpssqpojsxjnnkpmmlnllmopssrvwvjgxrvrkjjhggdhihheeefkooowwvx}{xppnnsyuuxuvrvzyxurpqmjjjjhgffefccddgegiezz{xutrtwwutuqr|zpqzzxxxwxzyxz~zw~|zzzyvv|z{}|~yw{~{~~}xot|yxt|~|{|up|}wptt~{nxxflwxs|qqrv{}~nluwoqvxpquppt~xsy|}z||~~{r}||vu|~uliuroakr`^gmqsquqstnofgu{x{z}~~x|~y}жȸ½Ͼȳɴ{wϿǩñžt~|~rv}wo}ytxyzap~vt{i}le{z{vsnqpqgtqxertyYOxugfl}{o{wwo~ebsr|t`smyxvhgltjluYlyb]uquzlw|{}n{a`Zl{sh`L=HI4.591''.I'!87'(&%%&%&&%&&&%%$$###"""! !"###$&&&&&''(()))++++,,,,,,+,,,,-...///012223529l}|u^gnvʿĖÿĵœ~|u{ěmru{{ypnsqiW_rzwbqwid^vnjqrlymum[gkgr`GQit_itZerlbn_dEUHVskfhhkhjipmZatmoh^bhk`imsgcl[drc`he[nnhiY^defVZSXil_Ocbh`ko_fsoj_`acohg|pqsuqpqpupnejppd[fk`h]`qfQ_efb^eftmlrrqnlilnijklnpsljhfkkhmkgiifijknmllpsssuwvtuvxzztojb\TTYY[]^]\^__^]]^]^]ae___\bcZY`dc^^aa_`aaa__bea`a`]]_^^]`e]\fdca^\Z[``]ZZYX`hhea`__[\Z^`\[^ba`^_bV_ga^^`dfZUWWVU_d^`cca^]Z[[WVTOOOTSTYSVWZcgilkkrmgtwnj{xhruqouywijienpeouipynejmjliguttqsqpooqtqrrqlosokinqspnilrqrspmopmklnllojnsrqnmnnotrsvmorpquy|}wmlnu|tnkoqtshrtsuoswvtpqxrnkflojkvxu{uppjjkm~|wuzxokjlnilxracpttvtqqqwwqloyyor|xuxxyzullxwsvy~zuqqtxrrwvvtyxsngkttpoqkwzkplkolmlolklnlqsqwuxmamruvutrmlkhookmgjjkrwsv|yy|rsust}zx|yyuz~zwytrrqrrkhhffddegkgefd}}xrrqrwvrstnowmnwuttvvvw~wvy}yt~{{yxvqs~zw~}{|xuvz}x{~{vt}~z|w{{y|z|kqt_g{ztwtnvnifpzz|rqzypnyuotvt}|txxvzx{|zm|z|~zzupzlmnbhlprltstxpmiiq|~|z}~y}{z~Ѹ½ǺҮŹļĶǾʯ̼ƾyrķĥ}v}vx~zpvr}{xpyp}`hxpzi{}yb}{nwjrqpkmyty}cno{}VU~sw}}vsuqfcZ{mmzw^klzxwo^ro{v{la_il\lswq~lkqwwz~ndE?X_a\]zz|lyq_jeoy^Zfncaonn]vqYOfche[[qpdilDFc\c`gxm|j|udplbVlTRbTB[nje_RZWNPWYSLQ]g`baaclmjmprvuppmvxfjz|tlhazitbgrt|^lnimxpyi]zRPx}pysx~|xjzo{jsb\lJ5CML43<=.*+8M$)K@))&%$%%&&%%$$$#$$###!""! ! !!"#$$$$&&&&&''(()))++++,,,,,++++-,-..///00011-/-0=raj^v}dXouȣĿżðȼŚvs{aixxxlkzrtkeipuftsceswdlkpovk|nTziiuYC_kxn^|}lQjmadeeSJNGbnecfhfbhpvlcuvjqe\ihqhhktgak_^sebdcXinhjZ]bcg\VOQgh\M_backn[hsng^^_aod`{lopuqln~|svlpnsprk`mk`hYdn^Racd_]beufqloznllipriknmmrndkifnniolefecechnljiosssvywutuwyzz{ypfZVZZ[]^]]]_a_^_`_`_cia`a\`d]Z`dc]_hf`aabcbceeecdd`^``b_`g`]hfdcb_]`cdb_\\hrzxngdb`]]\ad`[]ddec`aXcj]Z[\dh^XZYYZZ`abfggdcbaca_ZWSSYUW^_YYdnnlmmmtoirxqo}tjqxxrvvyggihjqihtkk{thnrlmijtvsqpkighkqonsohotnmjnswvsjnwtruplnqpllllknhmsrponnnowsuwjmrlmpuxxumjlrytojoxvkdqsqnmyzorwusomgfklggx|rw|sqjihft{pqzxpkjnrqpxwjetyz}xssq~{upr{ypwzvxxyzsggxxptxztontzpqyv{uzvomceuuonsn{{mqrqnlnnolkpsjlrqzvunfotvx{{vuvvrxvtusrtu||wy~z|twxxw}y}}x}{yzz{|qkjhgddfkohccc{}~tqrprsrqrtoq}vjluttsvusuzvvwzyrzywwurlo{|wv~}|{{zwuvz|}z|{wy~|z~ur|}}y}|qmo\cttwtuqkvnedqwsttv{tknz}rsxw~}wuuqoxwy{}ymyrvtwwvyyyyt}yz{wwrm}usqzx~ӴŵǶ±±ƶð{jʾɮðŨxutmomk{xxusnqk`wzvrrnt}mne~^mn}|lmxwls|eexw\Xjm}pn}qkmv[kPpfc{w[bgztxq\qoxq~{wrfsozgpwytunwxfD^m\f`qz|yyrxhsjp{wsoiXjpgIYcXj^WcmdaefCM`dcRcqiyb|oaphbdeOS^QRccdgWS\VKQ[UILW^_Z^\^[kfgmprssokioi^itunr{bbvkl_kstziYgmhi}ofv~z{xXejNTv{qi{nqvz{~ywnvtmz]rmZCQVV;=I8.35@L"2UE-+&%&&%&&%%$$$####""!"!!! !!""###$%&&&&''(()))+++++,,,,++,*,,,.--..../130[xufhiw{xgbmȇľȯʾȳô}śymvektz}wzj{rvntrl}xiwb`wl_scsuvh~mVervQJldw^tnQXck[a^bCKGSgeigfdbcr{{ltwnx_`smzqlmtjdfc[seb_`Tbjfj^Zc`cbTMLddWQ]bZekmWirkc\\^bkfZzfkfsphj{wsuitvunuobphbhWflXVb_^Z[^jr_vdmqpkfhrqlklmosgckfhrmjsogfeed_elmhhmrtsstsqqrrsuz~}re\ZZ\^][[Z[^___bbb`ejaab__a`]_cc[ajb_bbbccdedeeefcadefa`hc`gfccca^acda^_dryyytogc`^^_efa\_efng\_^hdXYZ\be\YZYZ\_]`ggffgghihihba`ac\_jk`boroqqontqmquqrwhhluxotqytcekkiqkcsoguvjktohegqwsplfdabgnsrrmfnsnnijqsuxmlvsmqnilpnefhfelafspnmjkkpxqttbismmhpvrsoiglssldmyqdfpkhimytksvtqonb]chhesri}tmaafalvkisqlhgkrqrvvpmw|~zrrr{yvpszvqzyuyvzxqki{zmrx~{qlouvprzyz|qinifoysmspz{ntuqpmnonkmtwklru}ytorvvyy~|}}~x~~~|{{~wzzy}ux{xw}z||x}~yuqolijotumgfh{zwpnpqrrsrqqqs{vkkpsttwtquwuvvyxrxwstrpmry}xuu||yy{zwuuwy|yz|z~xqsx~||wrq__qpxxn}pixqjnrspmox|nbnyw~|{yzvor{y~~{qwov~~~~}vj~zykhizÿſѳſǹ¸¶ŷſ|uдëzmnjp|ykrvprvqk|q]}_i~u|rqxmr~{xggzZah{~ikxurvazeXyspd\|z|n_|vvfosjiV}JeybUxtW`wrjsxmqvjiqu{z{|u{{|q~~|wy|~cQ{d_iprjo~zwh[]opXIc`\j[\me]\b`HQ^mbM^eexYwncmdbk]LQZVe]ZbbPX[TJT_NDPYZYYXZU^cdgjlnotmhknc[bjoiztabsnyh\portyZYbl^gud^ssmufLqcLaruflt}epuuw{zxqt{{o\moW`aaGOQ-5A:MC"6SG:/(*+(%%%$$$$$###""!!  !!"""##$%%&&&''(())))))*+*+*+**+,-+++,,----0/+jZhX_bY:PM^jjqdf_fszn{x{\n{q}tsuusmbf`qc_\_PYedfaWc_adPJJ^bUWZbZeijVerg`]X[dkkXyai`nneewrrqfu}slvsftddgWjiWZc]XQX\rjasainmf^fsrkinoopfelhkumksoihfge`fkjffmrttspnnmkkouwux~|qd][[\^[VSV\ZZ^aa`_ef_``_aa^\^b_Waf]^cddcddddefggedfggbdngcgdcccc_`fd^[bikpqsspfd`ehafha]`fhshX_`f^UWXW[^ZYYZ]^b[^ighhgiihhiiiijlojjsogltonrromrtpososm[dgoqjohnlbcklfljdpqgntjdnpedfjtqmjdb_`diqqrmchomohfnprsolpojllgilk`Yfabh^aonlmghinunpqbgqmpkntnookgiorh^mxmbgmigfltpnttspqpaV]gnjn~weo|shZ[b^fpfakniefmqrtxwsqv}{pprtwsnsuvrzzwxs|yonl|mnt|{ohoutpr}|z}}sflvmgvxlqpuyovysrnoonlouyqqt|}xvvyyzz}y|}z~}y}wx{xw~{|{yy}}zvupmqv{{uqnq}unmlnoooqqooptyvljlttrxrotstuuxwrtsnpnnorvxsru|ytw|wruyxz}}tx{}~v{xz}~~}|mdrv}{o}tl|zvyvtupmx~kevy|~~wz~||u~}rbt|sticf}ɻ¼˴ȼȴúüƲĶ~~|ǽɽеpymjkzsƱ~muetpoemogh}XinUur}ud~nwrw}uiumj|cX^v~cis}}{py`yzjVpwnip{wyxvyuXesz}i_ymbvXQ_ujQvsWfs`oa|{qcnzpxwvpst{{[isapw|xv}~rh|{i\dyuomSPibel`lp_\\`\TQ\r_NY]`sVqreibbjXHSWbkSWeYQYXTKZbFCUSUYWQXT^\`adhlpwnlqnbWZehgm^aqmog[roqj{xV[`jVgja^miakXR{\Oimqcqul`rros~i~|ns~ruucrvgigeQ\P.?JDQ9#;RKB2+01&$&%$$$#####""!!  !!""###$%%%%&''''())+++,+*((((')6,$(+-.033580>npN_tU]Xcxgkp†ɛǿʻŽָȴ{§~vbliozuz_uyqa_palu\y~vorhrcxulpkbNUk^cWbhP=TQhrvl`gfzzuuc}v|z{{x~s`kise_^]NTcdacWacciNHIVbT[X^\cgcUata]\VYfojXt_gZkmc_qnpmdprltulucfeXleW_a`ULYfxXekdemg^X`pnhikjlmggljnxnnqmjighgbhigdflpssplkkmlilquqnt|{of\W]^[TORXTT\_^]^dd\_a_ab[VY]XU``[^bccca`dffffeeddeeadqjbeedfgiedge_[dhcjmlnlcb`jg[ehb[ZadnbWbbc[UZXUXYY^^]]`aY_iefffeedcefhhjpokqskhnoinrrnlqrnmnmqdV`ejgfkeegeahidhieovigpm`dmfeebmpkga``_bdjlpmaahkndbinooklljeghdehh\U`^be[^kihlfhikqllpehposoouopsokkmtj^pvlgjlmmknrrrtursvqdX]krpluyhgvrcRT][epfagohagpqpv}wtsszymnoqtqkouuqv~|wvrxzmqt|mjoxzphouqlnwwtx|tei{tfptmoprxrwzwxrloooqw|vw{~zyz|||{z|z~z}}{yy{xy~{{{yy{|}zwvssx~yw}yoikonmllmonkpvyulikqqrvomtrrtsvyqqpkmllnrusppt{~xpuzurxzy|{quyz{yr~zy~z}zmw{u|v}}~yuzzsq~z{y}mZjyyv{qlo˼µ½ɯ¶͹¸Ϻŭ̫¹wmoĺū«|n~hvdmjȬɤyzs|fgwoubbifeiaWvsMao~|aljzo~uoiu`xhXYhwb`w||wltfz`ms}ypxvwyppsZYx~tfzveqjz`it`zy`lzZx_q|{uz`vw}oxm}wexlqutzxjnsv|y~Vc{yvjXWtinqgtl_Z^`Z[P[k_OR\^lWnxdcabgUGX[nbMWdPVWVSLb\;FTKZ\PN[WWZ[]bfltstwpnbSYfeklZ^pjefYmopc}j[Y`kZfehbib\_R\lWWimy`uy{^_vnmr{~{c{~dxztftt|oiabQaG?LRLP.*@PL?2,53$''&$"""#"!!!  "!"#$$##$$%%&&&&&')*+++*)('())'HV56;>ACGJLIGXbWNot\QSOfzkxqǦſͿɿ׿}}rbjz{y|~]py}y_c|{ess\y|yvxotpyj}e^Nqbn^YfcNLSTuyv_\nv{}ut}wbrqwlda]PVdhae\aifm\NMKbV^Z]_ag^T[t`Y^WTcsb[l_eWhib^jjkide}ofmyqr`ic[ke]`^eSL]rqNmgbgkb]S[lidgheiigjljpzooqkjjhiifkigchknsqnjhlonlklprpnrvund^][YVOMRQQX^\Z]cc]_a_bdZRUYRQ\YX[_cca[\dgeffeedbba]coh_befhjmkjigfegiaklglj]_`g_S_dbYRY[e^Xdbc[[aZW\[[`]\]^a^dheeccbc_]bdffjnfhtrifkkfmqnllklkkigm_V^ddcffeccfdhf`ehgipmafpb]efef[dqjf`^]\^_dhkla^beib\bfiniigfabc_ccb_Z[]`bZ]ffehdijknmnlkjqovuosprwwqlnzpersroopossrsuuuwqwricdlpqpnnmepp`NPZZeohfgpjeiqpjwxtvqv{|xlllorkgjoomszwstpr~mv}|pkosxtnpwvkguxrtvsecosmmnnlnltxyzzxknprvx}|{|~z{}|||xx~{{yxu|w}yzzywz{z~~|~~~}|{wwvv|{phglqokjkkkkjr{zulhlportnosqsuqvxppojkkmpssqnntz}{rmswqrz{z~~totx{~}yxt~{~~~x~zy|||u}x~|~vdp}ϻ¹϶­óľŴsk¸źǬxzjoegj~q|˽̶unw}qevmeWcebViwVelkReyhzpho}wrdx]um[]UhrZuzy~kw}dvyq~|{uoz}zoymkkd[szvuq{qrayv|yn|r}~ku~tyxpw|uqv~|mx{h\m~t{ykQzzulddnuriukbXcbX]T\caNM_aeWkyd^_abUI[hpUIV]N]TUOOgL6NLKcWGU_VZX[\bfnnixwmoaQah`i~pVZpi^f[emjazcaQemaahqdaZ[TMf]Y_jy\xrZ`vilqu{|sj|uazufrwif_VQZHQTQMJ-4EOH=3-:3%/+&$#!"" !!   !!!""##$$##$%%%&&&''&#"%+1*,07BJPW^Q_]PEDGLORYuput\\^~Z\itŠǼ¼ƻwtzx~rcixyz|w{x]mwzfcyiztb{{xuuvn|nrg^kub|d`j]XWTi|o^c}{~zfy{{vkf[[Xfugbhcnlqo_YF^Zc]^e_g\RZsaQ]YLav[\d]dUeeb_cegf_^wn^iyul`kc]kea`^aNR_rcTme\ibZYQZgdbbaafdflljownorklnhhlinhfdjklspligklklmkkmsrilqolh_YWTNGLPPVZYY]bc]^a_be^YWTRUYWW[_abaY[eebfedfba`\]elc[cgghilknpkkkmlakmeji^_[a_PVbcWQWWa]Zdcb\_d]\ba_c`[[_ecegfebccc^\aeedkmbettifihempmlmkjhhifg_\b_\bdadeaehgf]^deckna\gd[\`ce\]hhf_][XY\]afg`^abed\]Zhqic^ea__W\b`_YYYca[[_dfdbhilnmlmmmrpv{qrrsw|yqs|umtv}yspqvuvvxxuxrwzklllnqrllklllaOQ\Xeojlhqnllprhr~uuwopuywjiilofaaehintonroonv|russwyusx|vnvwwupoh^cmomjlijhpxz{{tqrtyz||{{zxv~~z{vqw|}xvwxu}v~tsttrw{~rz~yy~}~~urx{v||jikpqmkiikljitzxsjhkporqlpqotvosxmmnjjloqrqollrxzvmkrtns{y|znmsy{z{ywxu~~|~}|~||zz}zut}{|~z}y}¸ĺ÷ʧĻȴĮ³̲«ǿ¼ɮ|sgi|y|o{z}İ˳|z|{tjqmslR\e_TYxbTgp]Vo{tnsuvzvh{^ur~r[ZM\yfmvtxyersuû~{lry{iuyqfdqgpzpyrl~mx{y~z{rx~|v~lgvnXUht{}xdVq|pnls|szmmvueWkeX_\ZY^MMah]\ixb]\_]WMYueMGXRU\MPJX`<>UCXfMJa\XXUX[agnbbxnlpc`hi[bstUUlj[ecake^w^eRgl__kud\OZLHpW`fkdrm\ftblrw|ze~tygnflnda_LTOSRQJE>7.! ! !!! !!!!!"$%&,1;<=DILPONMKHIHHIMOSUURNKOUcrtm^S_cgii]|w||Ƹ˽Ĺįѿj}uyv~iuv|°~zmagxygsmoex|~t|wq{q}xvuzjx}~~}{jrsutmrfkiM]kpKHWDKw_XSR^YScY`X[[VW^ja^mqkkdg`afjfL^P[Yhk^fdZ[fWf[YYTUW_YX^W^sn^\]eqmjkmelppwklpoehssmdcijghqpeeppjllknrofabYIKRV\ZTSZcdaejdhppqkefjc]bga`effddc^a`_hccd]]gka]bhhg]hqielc\ehbbfafjfffeidgpmhgghhjmooonnnkghiilmfb``cgc]fb^dhi\Zjk^_ecbgkd_eb]hnjfmlejimqgcgigXXjeW]^V\_UZPJ_WWb^UQYUJETifXOUc]TRRT]X[eZ\a[ab]ZY[WS_gYPbb^RScdda^ZUfqbixqiqurvlillgesslvwsxrqyz|znr~wuqqwrsxvskotqwzvrsrsuvutuqiqnhgfizsfrhllmmifbqvsz|vxy}xoxthj^][]_]fmhfmqoqy~{vx~~|z{utz{}z}|}}}|}~wvuyy{xyvupqxwopyuhnvlumqqkhe`cdp}jbrqmqvposxpcx}r|~{twjvxohhihghfcirqnidbijjliktjj~yisuffhhjmnoooljhlqod_irswxpvwqqih{qlx}x}|qov{z~|~{}}wow~wtqy{qt{yxz~wvy|tt{zvx|{t~zwx|~~tp|~~~xx~x{~ty||tv|uvy}|pm}}}~þòûyԽƧx}|nŷ~}ϸȢ{xxy}ijn{_kufWHYcSEicUVphdpjywvhuvjipaRjldedtuk^UWKTbjx{gWm~eq{l~|q{}|}y}~y}{wzzq}|s}uy}ovlX[]Zhkk~qzvqZfmgojknnorxpqtqpbXh[ajaQCV]YddRgei\PTIY`S_qG=NHWd@CDMOBEDDDFJEEMY\ZY\aj|rWJIIHHIIJJLQUROUc~~mgkuw`]`ele[RI[olgmToҽƸШƳ{|rw|~zhfqphiox^`{}}vwv{~{wzv`dp}\I[VDnk^HFTYRbW\PRYOS\b\]_nf]aa^jcr^U_KV^kkbcWWhffd_ZT^YX]W][QcvhTQTdrfaedcilprkptojptsofhmjfktnbhsnkolkijuyqlib^^aededbdddfjggrutspnmkihfbgjlqnghgeklhhghknoneflje^]cjd]d[SX^^a]Wakgchjnnjoopngiklmqxtqpqmghkmtvolknpqniuokurropyqbec^a_\WZ`X[baigacbeelpfimlf]OO]ZPQMIPGIUGLYNUXTMLVK>BXc_PKYZVTRT_]blb`ecimrmclqlmpkflwsbajihijjkmwyxoq}yssqsjgtxtx}zsktxnr|vkkwxuxslelqotqidjoeoyssnuxnt{xlnvqjltquon][dgjphfsvtx{|xz}txrpniimopltyxy}tkty~wvx|uw{|{|{xy}|zzyxw{~{npzq|r{vusiisi^n||qeeqjlkjgc_[XY\mn^brldnthjl~uf|w}zwxyvv{umgefggd``kqnhedbbbggfpqdpmdumadhikllnpnjghmng_dopuwjkunjlb\jzoadx|ktsh{tspjvxxto}~mfnpruqnoqtty{|zx}yym{t{|rrn~vqwyz{mdfjuyyxw{g\mxpiok]l|omtyusstqpwvvrqxxofowogeju}|xttz~}{yźqʶn|oûȤxngky^tovf|eQMepYH]rmfQUv[tf~~~~xq}g_kla`^M[\Z]QmxfttQLW_pdgxeipyo{|}v|xzytuppuw|tjrt|ovx{{uqkkg_wi\tsunQ]twm^fopobXh|hdmndd\XXS`dYWFWceY`gg]qUBTQXbTkiAB@@eJC>DNBCXVOIW\RegNJ`]WTSRYgigedeid`ffhhimfkomjtcpjfqrid^dg|pjb[vvyzzhwtinmoc~itnq}nvk\_ae`KQdNONLJIGFDBDHLMKJGFDACP\`]\_`_b\SQQJIHFEFGJOWZ]evsry}cSXY[]XP[pdqpNƻżӹ˽ɺ̛ʶytwy}s{khpkadmvbe}~x|p|~}}~|xnlzcNddGhkdHBPWQ[VVKPWOQX^Y[YjbW]_\ier_bXIYfmcZ\Y^kgd_\WX`Z[\V^YPjwaONTfrh`d`^cglnjnrompsqoklnmimsk`hsnorklkcisvsnjdabefecbccedhfdnrrqommljjkgikluqilkiqpijjilpoldkshb[\_d_Z`XQTYZ]ZT`pl`emmkglnomjjkklqwspoomjkkmtvrqqyzutpwvtyvvww{uhnk`daXS[\Q[b]fd]aacckmairng`PHRVOOJDLJDTPGVQUWUOMXSGCTbbTN[```U^legrkilgmrwvlpv|}zxur|liolkllntrx~ztpx~xstvuskpsuxxuplsujpxoijqqlu{tdhqmtrjcfqcdxuojt|mpv|}xpmspjhpmrsn_[clquqouwtx}|uw{quwvyxwxxwr|||ukquzxv}q}wxx||yxy{yurw}|vtwu~}repwztnywtpfbni^i{ynb`ljiihd_ZWRTZjyg[hphaoxoijrul{~|}zwvqjgffeca_bjmjecc`_^dfjpoathdpf_bfilllnpnjgimle_gppqohlqnleYYnyiaftuk~htuj||ot{tx}qozsbfpnnlkjhmqruvwvuz~|~~~urxqvz||utr}xuy~y||jbgjrxxqnsxdThxqflfVitgoomlnopoospnkqvshantia`gku|xrsy}}{~{zzƸǚmw~{ƽǸsp}~sqph]kzyw[t|uqzssmdNPquTEVhsaJcemrio{ivjVajc^SM_YXZMhxuubCY]nwlvzz}}vnv|{ns~ppzn{gp~upykhopxzl|~r{y{uoonr|`dzZVquws]LcqpgZksqgYQspZbicbcU`a[]]i]JXj\R^gdWrM@VTU`TkfB>:NdDL7IN>OXNHMVQ^mMHaaUNLLRbkefcbdcc_dgedililplnvpstn}rc^`jjzqllgvp|yuymwxzp[nk\rXUgQQOMMMLLLKDA@>>??A?9?HIOZdj`RLIKMIDKRX[ewqtyk\aeZf__\Pyzl½ɿȾƱĖĨtr}|}zssmgsm[diwir{|zyyw|wvm|y{|z|w~{}}~~~xyqmVhrNejkM>KSSTWTILSOPVWUYUe]XU_[fhnngKQ[gl\XW[fji`]XV^`\^YUaUPnrXKJRepg_a[\`cgiikmlmoqpooopplnri`iqkoqlomeehpuuphb`dbcdaccd`bc_gpromjknkkmhmpnwsjmlksqknljlomjditjd\Y]c\W\WQRWX\\T^mrefkklehjllfgjghpwromnmkjjltwrrs~xzux|zzwx}z|yktuglhYVa\O[c\ccX_b`^ef`grnlhUOVTOONKLROZ_RXX\bZTX]\\NQaeZSbkjiadwqjutqsmouywvux{~zy}vv}sowrmopowtt~{~{urv{wqsuszmkosstqnprplpuolknnhn{}kgmlsrkg]pi]pvohnxoqqtyyrlrolinknupjebnyvvy|}yy~vtxrt|{}w~|~wmqu|t}z{pxzxxszy|srostsop{~sptwst}_di|uinytpgZdi_d{uka\fmhdhc\URNOUhveZkmhaoqomns|s}|ytoighhda_^dijgdbc`\Z]eope^x}dem_\aekmklnooliknkfdjppmjimlmh]R^vxdalljttj}jptwwq|yssrg`krkjjggfjoqrstsssvyxx{pzuntwx|xxu{}zy{~x~lgmlpwxmorvgVmxqgj]Sjngpiedikmmnmhjhqunc_nmd]\^ap|xqy}v{|vu~|{y¹¿Dzxn|ŵ¼¹oιw{vjpobYpjzdanzdbtolpcLVsH5;^UMH5QGAUVIINOXiWA[b`NFFK_njcfcaa]b_bhc`kiklkkpusuxwtgdjoq|xsztr~z}{{zy`brS~icoSPLDDDEIKJGB=;98776468=HU\XNDFGQWSS[clqjdl|}n^YX[^fofrcUnZT}òȼů˳º¦ȷyquz~||}utqnftmfggztppozp~nxxowok|suzx{zvxut|~s}|w}|{}~}xztxajzYghpY@KQSRWTGJONPUQRXS_XXO\ZdjludKW]hi\]T]egf]\VUb`]bTUiSOqjPJFPeog^`X[^`ddjikknopqorrqsnorf`jolppmpokffkouvogbc`bdaccd]^a[alrmjghmklljqtowuknmmsrnqnjkpliddomf]VZbZTXUPOTV[]V[fqifjkmhhfijdfihiltsnknniijipwurr{}{w~|x|}}}stzvvrd[hiRYd]__W]c]\_\^htonn]]aYUWZWYcbhmeedhmfchhcnh[`j`Yhssvpew}srvwwsqw{vwxz{{yy}ytxytuztqoqutqwz}xvsuzvortp|wimrnpokqqlmprpnjgknjqwikkrtmiW_o_gwofjtrqnqvuqlrnnjllnpqsqmswwz~{vrvssyz}z}ymru}qy~t}}uosxvwsxy|zuyqmhjrqnlqztinxxn|{w{gYapwmcrtphX\f_^xsi_V]kh`ebXQOLMQcqe^lidfsmprsu|}~vplgfgfb_]]dihe`_a^ZX\frm_f{pbcec[`cmjekllmmnonigijonhdklkk_WTdyp^cridzykunkzm{}ur{yvvrjamwkkiddgjnopooprqquv|}~{ttplwxtwzv||~|{z|~yvmrqswyonotrXmuudo^Sgpksfchjkmlmjejcpukb`mja[[ZZn}wq|xsxytu~|žÿȬvÛ̾Ŀzsβ}r~wpprgVbv~pizqZuncpeenjjm]TfufI;QiUEbxougvbeqmonSRhg]LPs`UUTfkdg{qx~îxono}¢}|lzo~naktaodr|vm~sbgklsmgxvmpshtodhiopcTokFUoq}rn`IW`edO[urhSPjfXXXYY^Q`oOSc{iIMSkQTllccw?BV][N_gY71G`FV>=R>HVQFHMR^_IR\fVBCM]pneada__\a_bbacikjjikrtuxsv}{sqvux~v~|{PrjS}rvfVPJ=768789522225897569;;:=<;>GRRY]]_fku|qx`mikvhfec[_\YVVU[eY`cfYzO^~ýòɮ§¤ļյ̻ʷwvz|x{kunqmjxrnjgyq{|winshziuli~vkjzxymplyytsqkpy~t}n|wt{zz|z}~yxywyep~ekkofHQQRSUSGHNMPSLOVS\PXIVZbjjuaMX]gfdd[_bcd\ZSVca_`Q\kNQrbKFEQdnf_]UY]_`agfgilnmootrruoorgajsssonrpmhghksxsnmg^`c^abcY[aVYdolfegmhlknyuoxvkllmqrqrnklmkhdajkh_W[bZUXVTQVY]^[]cnjhiiljjehkadhhfjstpikoggidmwrpo|~x|x{~{u|ypdk{`Wd`^]X]c^\[Xahnonobgklf`mjlssxuvrmntvsqpnuyofkohoyw~ykt~wuxyvry}xxzz{{yz}{tvyvt|vulqvuqtx{vvtu{vprtny}kjqmpplqpmnprpomfkqikz~lijqrmm^Sqaevqhgqqrnpttolqnnlllmnuw|w~y}zxussxwx}~psvvu~vtor~~zvu}vu|qrsieiwvnnnvpcip}lk|twn\TevoedqqhXQ[][mqi^UVfkW^`UPLJMThimorlblwkrx|~{rmgefgc^\[]cfd`Z\\\XW^krd^o|faa_]\^cnhcjllknpooifjklicekijjYRXivg\hndn|nj~xew}tszssyz{{zunhfqunlgabjklnokjmrrnstyzuvuur{plvvrt|yw}|{}}}~~{w{{{xvsqosyfvtym~jbssuvofuspompjiopqtkdfjg^Y]\\p}xurqqssy~½¼ơ|~ȾķƿĿz~¹vvzzr{m\Sas|merl_Z\sb^ibcc]Xho^D?Z[DJhvtdgrfewprpOLlk`SV}iWRc~kt}~ópklr{æ|vpwulvaZenZze`t|wn|q^giiledmiitigma^ddkgWVp]AYmo}vfgXMX_eTHkxl^IZfOPQORXXTt^QYx}TIFakRpq_kqk7HZcQS[eA1A\TLR5GK?Pbqo^\`a``^^``bjcdnjeflmntypw}|zz{h\~v_fpu]S\^I6+-/./32258999;<=;;96139>BIGFKU^cejsvouc]eajg]_g[TfkbXZZ\li`XojzkDZɫǴװ·Űzuz|bvitquypum{u{|wl`tmbonq^c{tnjssohieutqoedkszvotuwly|mnyvvxw}wvr}xuyzluusqkpV`TQTXSJFPLNQKJUXXHTEPW`cjqZRW_gfonda[Zc]SN\c`c\NhfGZoYF@FUfoc_ZRV\\V\cbdfiijjnursvqopjemryunosonjihinqqqqlbba[`bbVS[US^oibaeielko~vtvijlnortqllmkiecafigb\^b^\]\\[_aabddeighmghkqjhk``dfdentrfdlecd^futonz~wy}y~|ryref`baW^f^\XUehiokmhjqsnjwwx~~yysry|~{vx~yqoswy~}{{}yx|yvy|wzz}{z||{wtvxv}x|uszxrstywvuuywqqqqt}tjpqrrpprqrrvrrtkqvieqtkiopnrhWneftsjgpptoqrqonprnnoqqr{z||}uuyuwwx{z{}tu{}}u|wx|{vujioysrwz}racjwwfpxuoeQ[rnd^mti\NUZZhlg_US^i_YWPQMJO^sou|~ukp|x|lhccff_ZYY\cd`\WWYYVU_praatt``_[Y\_elebfilklnnlhgjjjfcgjgkjWR\ko_\jebtugqyil{otqnpw{yz}wpjdhstold^bmmjlnffjrsoprvxrnloxrq{rltsqpy~}~zx~~}w~|~~}~~zy{yxy|v{~y{uxy{qy{qsssuyyvtjklfgb_hefx}yztlnkpq}Ǵ¼ƻ¬Ƶęv{wvty|Ɯ~oxw|n|~~|dVRjs|sjr`d{T^nilg]^[U_kdOAO]KH>EXAABVLITLLbZK^hmo]VZ[^cfc_UXnnWaidX]ngirtqv|{yʪ|~yy~kt{zsxpskw^Oh\ZSLIHD=00004333576239:AGEFKNST[b_QIHNOGL`gZQWRjokhtspjUU^fnktsgIJžǨûϾƿ–ī{~|}s~|vhury|y~z}tq|lfkxj\V{lRaqvyhQcusnghgbga]kqh_S^jmxwvterblsqciqmlnnmotajw|sip}{stsv{nnpixj\]fbcTYTOPLQUgQCSIOPTSi]GLVlupiadY\k_OGWe__aYejJEfaL=8K\ia^^JLTZWKT\\^`baafospsusnqsfmy}tmqsrttmjosnekutttiY[ec`ZTWVWkk^ae`ftmyt{xlnqply{pnpqnlbdgpjggfdedegfe`ckggdcga[^lmbcopiga\Y^b_ftsd]eb[[SXlrqttunx|~x{z~tuplgbgkc]\Zkqejhn|vuvvt{xx~xvpw{zzwuwtx~}}yy~~zz~yuv}||~}|{uwwv~}uvruz}x{trvtrqrrsvsuwrt|}}zz}|kjfo{}snortywppoqu|pnoruqvrqtuuqwvwww~~|{~z{~uuzt~~}xnvz{wy{}yprwu|szpsi`inneempd[ZSSaffbUS]kt^UTT[\`z}}xlddmi`YUVZ]b`[XSSSSPWjymanvaU]ZTT]chg^``djfgifdffggfeefdeni[]bhh[ab`klepslx{`^rmgotrs{xnhh_dyykijiinoknnebhqvsopppnliflwqmwvqpnlox|z~{sz~wt{}}yts~|{~~|vz{wtp~zrz|x|}|yç̽o|pyrkqp~ǿŧtslgh{gppXPiq}~wtvt[bxk[ZRXaVHGaWHIe~s{ldxy|w}{{g}psr|gu~l~~~p|z{osw~{yyyutflfzjSNZfSh`gwwznci_j\\[T\YY]YWTDFRXmiIFaP?Qb_`^TWZURVK@Qh\bfSE?@?OXQTqyZaZhoNFPgnSWp_Vxt^FLlbXGIP8JaVQm`8IK:DW??LU@JMIY_[ecbjdZTR]bgg`WUlnV\eiYRfidrrlt~{~{y}rzsylzx|xws|Ym|w\\\IONUG>:776695298777;>=TL5LYA@UJ?IJT^`l`T\iaXPZbchbXXfiNPlj^Q`h`oofryxxz|~{u}{npw{y~t{~prmoWHW`YOJD@=<===>A?>>==@>>CFGHSbqufYX`[nwY\n|xwr[`ckxnh¶—Ǹ®yx{|{|vxqx}t~~wrt~~qx|rx}{vzwhgut^btbW]v`YTx{zLZkkicSdjum^_eZ_UUglTPS]agzvbvg\ilg[fndcccfigYjnoegu|vmkoipvinqdknacipicmeV[]cUl\RSQQHUX[VRX\bc_ZaaaiaTWen`^c^eiSGYiXC6>TdbVYTAP`\MLWXX[\YX]ehhqtoopuxgm{{klttvxtmt|wjbq{wvwoejpkokZ^f`lncd_cpqw{vv{~wszwnvvqwux~wkuzxhqujkqliikbX^ca\^_XTOWe\gpnndede`^dlwoddib[e^`ooqvqy}pbnnyxrvxqqjptnllgipiprr|ulozsopw}xsxzysxzropv~z|~upzyoovwv~w|~~}~py|vttsvvzxqxqk|yu{uu~q{o~xzvry}yuu{x~woqrzpvz{}|z{w~z{zw|~|{{~|}t~{{m{vu~{u|{|}}tzoqu{~{y||~{y}nizmoifbcb`f\Xdu{sabXcuq{~y}w}kkqla[VVYYXXSPNONMILg|q\fviTYYTTU_jh[Ybachhf_bbdggebaeiikpibbbcda\^hgbiknseQXfddlqsvpffja]pxjagklomkigfadmvqgmvnimkhffmvpktpoohdjuulxypv}jm{~xvywrstv|~ywvyvtjo}w{{}||wz|~x¿djrwej}sļƵDz|v}Ŏwx}~mg`zxju~hjXet{|yjazgaa\X_Xgpsi}y}z`xyw}zzxmmqlzzu~wyns{~rvu~qumkpp|vxzufqppkepeMFThQ_bhwy|gVcjl[Y\TMSOIQVLA;ERo[?JR@BZQKQVXWXSOKAEUOPjV:EC@IG=Qvs`\_ch]\llZVigakoemcspbdUHFCR]\WncRNXF7]UDA\EBKUWYj_NOde]PUfbgaVYciQLigcQZf_gmahrszwprsz|xq}zy}}~{zfs||zou|xepd\TMIGFEDBB=?IOJJKOOMJGFEB@CPbhda]fiZS{}xr|pcdirznkʿ~µŰtz}xtqzyy{nx{{u~}vvuzvw~z~{rqysstsmtwfankY`{p^S\u[]Yxn|OVgj^_U`fxiU[dW\PUfdHNVZZjxt`wd`gg^Wfla`[bafbXlgjbhrtohikfqljsqchk`]krgbnoaaagajf\SWXH]]\ZXZ_cia^jjb^bcenibdddncSVgiXA;L[d^VWKFYaVISZUUXZXX\ddfuvjlsvvekxxijqrtssoyugdv{wwyqkssqvn^gi_lnhf^hoo{xsuy~uvyupvuuvz}yr~~uluxqrupmlokZW`_[_YTXRXhat|osmgfpmchs{nhpnfcnhjxopzlzuvtn[glq~pt|z{zrvprtqrnigmmuwoqphqsjowzv|}zw|zslt~~|wz~~|z}tkr|yokqvv~{xzzruzxptupvyzsutow}{~y}qzxup{y||jkq~uy|}tyyzyv}|vt|}{o||x|y}{|~~u}|x}to}ts~~}~w{zxy{lzxtsopl`kc^jyymqi`~}~zywyyxkqtj[WUX[XTTQKKONLFQq|k\hqaSZVTTV`jaTX_]che_]abedde_`fkknoifdbcca^bebdfhjaRO]fcekssldacbakuj^agillcehba`fsrej{vhholgghmsolsnonebisrdwxvuwjo~~xvwvstwxyzyvsvwp~kk~{~~xz~z{zyz|~~y{v»|}{`hnnhkǩûľv}v|wzѽyysoyhhi{smmu]c{z|{}pr|vfXfy~zzz`puqzwzvniqmy|~tqzs}x{oruxy|mus|ksmijr~uytyw}dpprkaleJARhR]~cfwy}`Pajh\Z_THQLDPUL@9?RlWBFI>DWJBPWUVXRSKBIQFZjDAEECCBCGMOPTRPQUZUNGIPSTP^cUNtupslfhtyns–|}ɵv|w}wvon{umnvyyu~~{wv~{vxvxomx|~uvsrniptqomimud^heU`wkaQ]vTc]smxQSdf[\VZdvdOUeXXMUf^BNVXRmvp^ubbdcYUfh\\Y_[g\Vkeg_jkmkchiepxgjzqdjiaYkqfakrgdegjiieT[`PfcbaZaloogfql[Zmqmgchifjrg\`on\CIZbf]YZJN[`SJVYTSVYWY[dccswihtvtfkvwggklqqpkzqghz{wwzsqysv~sekdZjpoi^fms{sruy}wzzsuuvtvyzx~yspqyurwvtopvdT^c[a_X\Y^oi{v{yjgyzjlv}vq}wikuqusozlmmx}xkiZ`jj~mrx|utsw|zrtuqlfkpz}lmqkvxms}x~{z}pn~x|xw{puwooxvpmmvx~vxu}trwynuxlzuywqvu{|x~xvpzvxkgl{~vvzs||~|~{w~ut~{t~{y|{j{zpx~wiw|v~qszx}xy~x~{vwjtqinzx}h|~}~yv~vu}vlstiWUTW^UPQQIIPLJJX}wc]klWRXVSTYdh[TZZZch`X]aada_`^`hjknnihfccdbbbeeedeaRJQaf`dmqka\_^^ksf_dfdgh`^fe^]`iqg^ungmnlghilqmkqnmmc_dorpty{v{|mn{ywvutswyxxxtpuxpsnrs{y~{{{{xzz{}}}z~z~vx~{u~`ihikr˲÷t}vzryȶzx{quul`nzkxqo~yaeux}s}o`mu{}^k~vnwu}zurnurmvv{nsvo}z~~{~xvoz~qouszktpzgrkicszt}yorzyenpsk_cdFAUjT_vdeusy^N`fa\]`TFNI@MSK?7SWORVZYA@KCDhY7AB;:BKamk`VYjrjqocevn[begrxu]bpmVMJTY`dhhWTUR=c\MAOaCITNRWRX]ZXWW[a]aWPZ]YS^dWSV\[UaaWeljmqglnvxqxrizƥwupwyrgz~t}rxu}z~}}qnVbVMC;@EGHIB>AMKORRPMKQ\dfigafjgcSSp~txyrlmyzq}wyxеt~~{wnzvdty{zzrtltw{zs}}t}zyzp||xsr~kqp|yjimv}|nkzyohecfrnljecpd\_bRbucaQYvNc_lnqQSb^]ZTR`pbROc`TNWbTEOVXLrug^qbbcaTVe`WZXXTdXXfe`]hdjbafcdmpam{kdjieZjneberhbgehjddV\`^qhfh[dpwsnnpk[dttmcglmnnuoddux]LZeig\_^QT_`RS]YUTXYX\[db`qwmetzokmsuecffinjl|lejxxwxypv~qvufkbXimni\hqu{qruu~{xtxrtstvzz~yspoxtrvvurr{u^_kbbiddeaot||jf{ppw}xmsuu~yqzpdrtwuie]]hinot|ws|v~x{pvzukjhszwulnqzvy~vq{x}{vyru~zxsyytpo}x~yxvxu~wvv}wyor{v|xwsw~~zxwswut{js}uzr}{~x~}y~wz}tu~|{}~}nizrw~znrs}rmx{|y{{~yvz}u|z|||z{}yu~vsv{krseSTTW\OKOMHKPIELfnY_m^NSVPOU_hbXWZWZcdXT_a_`^\[\aikjmolkheeeddaddba]UKJUfd^fpl^WWZ^hqj^]egfhc]bc]^^cki_c}}kllgkiikmoljomijd_foqotz~y}{ks|zwvtssuvuwxrlt{rozqsnytzyyv}uy||{z{z}z{x{vwwxux{vuxpz~zljbeoyĿ|yq~yzu{t{pxvUpp|lxvrgzhcvv~}pyou}qq{|whg~xjr}u~xvurqtotx|j~r}w}xyrnxnzvz}{{zwv~yutnz|oknpyhsm|jqiidutnxujoxyaipuj_^]AE[lXclfenot]L^b][]bTAIE:HSKA59SbQFF:APT@EZQHKShR6@I9PTbd[Rayule\^jb[bbenvuwf\nzjSGF^VfgedLTYSQdRQC]WDPNKSIPXXPTVY]\YUUSe^SSaSKO^XJWdXXifdfmemqyujynf}ĵ|rz|~k_~u~{iskuvwwy{i_d`I:=DNTVU[_eeab[ZZQEFINX`iwymdZ\szmw{|ss}|lq}|Ƕ{ƚźѬq~uoj}keyuvyww~|nouxyuqyzm|}~v}zvkx}y}}rqjl~whihlziefjtyiajqpd^\\iijeZace\W`Vet]]VTxPY_ehkNX`VX[PLYf^TKZfVLY^GGJVUNvzq`]ka`cZQXbXQXZOS`VY``X[aaf]_a]aihYtv`hhkl^ijge`mg`gbilc_Y[_ayijhcjnqompqj`msqhbmrsxurnin{qZ[kpog`fe[`i_Wcf^\Y^Y\_Yeafwuol{{jmnqtd^_`chbfzte_gttvyvq{wlu}tii[Wiqld]jvvyqtut}yu}pssswyw~}z|ocorottsssx{tmstimtoonkwz}qjz~wuu}v~xuuvqeqqqpkh]Zjmplpuryzv|~ux|kmpy{vynnv}y|z{~{z{{z}~~z~tryx~wrv{z{x~~us{z|xyzzu~yu{stxyz}{tx}z}|s{}uyx~{~yx|wy~~|wdzw||zzxyvpv|{w|{}~{}xwtx{{xytzzlqrbQRVXXLJMKIKMFBQsxaPahSMRQMOXbi\WXYVZd_RW`\]_\ZXZahijmnlljgeeeeabca]TMHN^f^`mk]SQRZenla\_dhgf`cdYY_]gjb_kyplkcdjlmmmmkimlfjgaionlt}{ykvy{xvsrrttruxon{~xwsxjozpzxyty}~xz~u}~zwtt~zu~sqorx}ws{}nzorwwoõð}}vu~otlryyxtm[irµ{}ue||ytr}vxq{}xu}|enrwzt||nvm~uem~cm|y{~}yvpgyxxwtvi{lp{|wvxyumxtt~}wk|ssxw{ozwru|xpo|wzgtox~~z|xxwuoy|qqui{{qmgq~{xgqiyo|ofjetpjsnfjqx_hpwj_]V=Lal]jfhbkmo]I[^XX\bWAEA5CSMB15U`KGG>IWS[Y98@B=H\U]YUl~jSOZYXZilcplksk[e|y^N8P]\jecXEUa\^\RTPbQKRGMJFOQVNPYY[VOVTYhVMVUFI[YMM_`Y`cb\jejlwquv^m\z}}|rztns]}tx|s~rnyuftvmrzv{{{f~lNIHFKZ`^ZYXZTXRPNMLGGGFC>Zj8-CA@]G49AAEX\WVXkzrviPH[WSTSbo`msO7KcNb}vtkzfajU]prYQ9LkcfcRZHE]nV\KK]\WRaSUODNPZRBDK_VIQK]`ZaiTQ_cjrn]`f{cbdOUrZYXHChq\]K[O@Qt\T_?YYKSZo^^F4__^MERNM_X\XqS>TGN`TZWWXWVZVZY[_i_kqnf]h~{}zs{pi{s~skn`~z|{pey}yvlgvtuspflt{wnsqqty{ohrg^ft_fRV[][YX]bmw{vphlqld[KKT]l~lg\DXr|VWy}{uv~muПrǴ{˫ȿet~~vptvx~ootwqjrsvzv}sz_yZiTQrnyf_^LOWmgfe^^_YX^[[]ZPPTX[`]Y][[SdgdZQ`b__VRQNNUMFRI:ABB@;IMJXMOPcNFFTefROVLN\bTMJi]IIQYYSVWKNbLUSR`ZWOQZ\`c]Y[``[\`aqeWXY_ea^[X[U]eb]qj^^jjgjgnqf]`pscejfrxsvnrqgemojkilkowvsosyxwwsmkrqouyzomsqmkmorrondejhsoSQiqmilmjo|~xvunmvxxxxusqv~z}y~ut~twyttw~~}zxyyvvrtqqvjyquz}tyzsztvsq{{~vsuzyz{{|xmdwzvlqtsnozz|trzlnuxojrwvwx{vy{~}{{{|zz}||}~}~{~~z}}xt{{lq}wfjxw~|t~{{}||}~~~|zs~jli[b^XSJ@BKRMBASfnbLXgQMMJHHT^VPQTQJM`]PWYMLUULFKS\[Y]bhomhdcegfbhxqaedVW_]_e^WXYZcnk]X^`^]\fdRUc^^piSSSXrq]_`^beca_^adc[^mb^geecdcmpgeb`pyuldxq\alaW`ic_cluyzlx~oxyvwv}ozw|||{|{svu}{w~vx}rtxvxqrodbiw{~|}{}~}p|xz}wzy{~~~{zwwvwl}{|uwokvsyzbfwjjc|hyǰ{}Xoin~_Zu}wvl~_hr|~t~yvƱw{qxr~|~|~|pnztsxqzhclemeepnc}y{}|ynos~~l}gvm~wxqb~qe]|nw^__dc\liRq_cp}tmw_xzmlaWWfpesghyd~~RXwc]fizus[\wtwmtrzrouwupwxmrW^uqyrYobWptehZfjdeoTO_`[vdrid\g]owX__OWjeYZrb\iaq`hhWU^klNHFAIQNSE:D@PLZX=FZ_NMOWW\_^b^c_`r_WP[swXdYNcwQ_WJNsbYPN[EB^oOd]H_PMYbtYZC9gcWTQPKTcUZchDAWG\Z]\ZWWVSYT_X[]hdjojeon|}usu~b}y}y{kifv}Sewzzilvtsc`j{}skoopi|~p~zstxr||u{GDOW^[PFFNWdY[PHKPQNNJGO\f[VH>yz^;@^zx{p||nuɸ|k}yyx||lozvo~w{s~_|r\iSUmmv|j[cSJRhahe[\i_P`]ZfaRQGJV[hZW_TTah^fW\_X^VQONQJMMRH8BF8Omsqwxo~s{wż{w}{zgv{~}x||k}v[bU^jkzti__[IUf\fdZWghLb_WedTSM>NSccQ`TRWk]g^\^Z\WQMMRFIRRK8AO=>H?VLRPONbZHCXgXUSPPKQ^[INnYQMNY[]WWGadQYRR[_ULQX]\[YY_[a\I`dphRVX\h_`XYVRZac_jcYYZ]kf\gc]RRejba[_rlntinmccjjg`bkhmysplo{zwytllonp{|oinlijknllrtrowwjegnzvgjlio{zw|vlpzywyzttts}zwxt{wkpxfixw|woxqp{|}~}{z~{z}yvwy|vx|zp}uloq{wsvu|xsyzvtrpmc_w{qqbbmqjes}xstoztsxv}qwtw}mhrrrkl~ruryzr{{~}~}yxzwy}yzqp{|wq||{{~{}~{~wyv|~~vw}{zzwyysy{}wy|v{~wxz~}svwzyx|qls~y}~}yx}~}zxvmkf_]ZVSJBS_REAMYdeLVj[KJIFFT\QHOMMKNa_OSVKKSRJEFOUUQTZchgdabdcbacnvplp_SZd_bia]eghlhYWZ[]_ci]N\e^aj^OMN]qiXY\\^^\]_abbcaZ[fcVbaaabaafd\]dnqj]]wrYVb[KXbYRZfnlnjfwvtzsmmyykosrtyxxu~ysyzwx{ttxx||~}~~vihqslktz}}||pqtvtqmnifuz~qx{|s}{osxvs~zmzuu}q}óypijYsy}xxx|}|uyz~fipptdsj[jggnx}}s{v~r~xix}}yjzqo}l]w~kVXymmlOZk_kd]dUnforwosjdpgt{]KUdu|unil[Qmue~]eqlvq`Pn{hz~~wmsmo{z|zykf~a\twwbmcWautlO^qdgnZT`h`}etkjbbim|gaxqk|frsbsnWSzt]YI8B\Q9@QZSRNVTRRZ``JJZdTYWLSKL\\JIrZTONY][VUI_lW\RT]^ULQW][WUZeZ`\I`doiOVY^ma_[\RR]`c\`[UUU[iaWbcWKQch_ZR^lgkwkbki`dhedbejhpysmir{txyqlkkkp}srtnkmmmjkqsutuqiiknxukiiinxtr~wkv~{yy|urvsy}wtswsnmocesptpfo}nhtxxx{}~||y~}|}}}ox}|~}|tzxtzxvtrroabuts{iY^nqigxvytp{mjypmtqsy}vrxw{ylnvqsqrvwt|{pyzy}~~}xy|tywu{~}z{qr{rvst|y~}~xxy}{xx|{{{wrz}ztu{|zvssvvsvv{qvyz|z{~wuxuyy}~{u{kel{{wx|~{s~}}}tswwoh]Y]XTTNI`hRAMOXhXIbeQKKIDKYUDEOJEI]dQLWNCOZPC@GSVNMPXeh`\[`ec``fotnpm\Vagbcicbjfgj_Y[\[]fldSVdd^ddQJMWkpbYZ\]]][[]dfedaZZc_S^__`b`]b`V[hnldVbyfOY`LH^_OO^jkilflsqv|wkgls|thmnoqsvzmpwkttsstsstv~z}wwuyoc]goidluxyqr{smlnpmcb_^l}}{xoy|x}zqusxvp|pŷ|pwnyZm{wzlhxmwxvopbnpnxrrr~|w~}tkvxw{hvmfv{hYoviSTw{fmbL[oVl_bl\fjkprrsehmk|oVSTfwxurlTe~ti|e\zltrdMh{euzzmmgoyt{m_wdZvwzfneY]txtKWtejp]Yhgatfvuk]Wu~gqns}v}uotZRwtd`T<@[O3CchKVW\;D^SGfmX\]b^\bhOOkcJdqX]OMU`gpscocQr[HUVTKKWegvbZ`OR`gjbSOF^e]GN\\X\ZXeZPZYT^bb[VT[`PWQ^cUehq|hiay|uw{ulrp}fewsmvh||tcrbz|~p{cJc|pr~yr}i`xrlotr^bmhhj~xlofinquytojp|pkifkkc^[^bacdgnoqg\X_dehlia[XbzlZW\gzbjqtzzu||kzokt{½ŷy}r|xpdzwtrs|tjYbpY`pkf\hbIXeVY^TLYafhkUVieZZKDIZhRTa[NfbSaeYVcYWTLPJ:HPYD=WkKKl[X_\TjcbLYY_WZXOOLJX^RCq\XQK\`WRRR]p^aSS`_WLRV^WQQ\iY_VL`bj_PZ[frd__]O\d_cYXURNS^fZWa_NLU^d]TO`gcdhcYgg]dfbdfgiktwrjju|pyznlkgfpurwplpomilqrtrlmjjlntqmgfgktll}vkz}zy~wrxwyzuwsrrnl`boklkaiykeosstwy}y{uz|~~tvy~~xsuzsflxnwsa^fqolp}srootgivojppqxtpvy|tmt{x{vv}xy|}txpw{z}y{zz{{wn{nxxrz}|}{}pt}os{uyy{z{|{ws|{{ytsyz~w}vl{|~~trtv{ypnoqrrr~z{}~nxvxz}~~}{zw~y~|wxtyuz{y}{w}|uxhdhw{uwy}r|}}znnuyn^U\`X[_TQjhGENP]fNOfZMJIJJSTIAILDEUdWHSTEFVTEABJRPKOT\daYVX^ca_bknnmsi_^bedekgdjfdf__c_^_hn]U[ee^c\LKUenhc^[^_^`aabgigea[[b]QY[^_bbZ]_T[ljg_SjyZIXXELcYHRcjhijfnnmuzr`cjlmknnnoov|igyufllmnopppu{|vy|{}~zxpq}{qkgc\ahidhqttmev|fcejg]YWXdxvpy~~}~z~z|upwxcwykuw{~rr|qrsntrsmswu~mx~|xp}{|swgtnepteWfnfOUtsahXF[gPlYtnbsenmoquk_hnouide^vsx~]\wvlzgT{pmvgNazbkzxnkbnyntsb}riZ~wwzine^YkyzMOtfls`fph`l|k|}dUXo}o~|t|zZRtnbd_@@VO6SnjX_dYE\\GKqnaZW_ZZa[ETl]U~_HVLQ\ieknd|URpOEXYNJNZgqrgaPO[V]\YSOIg^VJNahY]\]aPR[VWX`eWQVa^NTV_aXgbo{iidw~gnuuzrupetugvyWcm_gmpxsuvxZ_plzx|{xrqXmwqgnraZsmkf|{krbcooxkcjq~nhqe]jgdh`]_]\\\[[a`WS\bc`YWZZZukYQLbiVZpwv}orz~|ljuplx}mvñ}zu~st{{{z~gm|~|{}o~rrin{pkXfsU^hie[chHYh]R\NK`Vair`Mci^ZLKG\dYSZdWagRYg^SjaVUTJPBHLXSEPxiGso[fkZnpbNbSWZVZVHMKS[VAm`^RG`cSOR]\naj[L_`YPWTbVKP\iZ]PK^^dUX`\kqc_`[TehdbZZUMIX`^U[`WKORYaXLK`b[[bZUf`Zda^abflooqrlnqvwq|xklidbnpuzpnsrplnrrspgimmklmmndcdkqfhzvn{}zx}zty||~x|tuxomcdmijidjuidjotvtszysw|l|t|~z~}~v}zz{qx{n~jdoptrr|}|~spmmm`hpjhkpqwso}}}uv|~z}}rwwohxzx|zwttywuyy}vjxny|tyuy~svqqz{y|||yx}wqt|}wywouy~u||wi{||rvx~v~~~yznlmsrrpy}tv|zkuw{|~~}xw|wy~{~ww{yw{|yuw|ww~}zxu|w{vvebes~{rv~y|xytqsx|hZXdd`eaOXn[>JRT`[H]fNLMINPSG@FJDER`\JKWJDPSD?CEIMMNSY^^XURW^a__dllirwhcacddfmkekigebcdabbik][\dbafVMS^khgd[]___adeifihd`[[d]RUX^acbXV^V[phb`YllOISPDOdSDZhecihfnnlqui[bhkqflmkmrrsvkfprg`behjklmrxwur{{uy|}wwnfxt_h`VacgdclnmmZg}hU`hbXXZZcwyw|zz{y|z}ry{ast{~xu{wjzod{h||{t}{}|qskqwnip}ze[aidP]pwlabMA[`PkZfhginttqreYhssvzzuwvveXnwkunOuvj{pT\yh_jol\jy~mlwfvnp^wsvyklbbXftyUGjensatkf^atpz]O_txpry^aui[baEATXGdtc\hlX]gTGUtqfTX]UX^NAUgYexG?YSSmj_eifwKXeJN[UCHM^krnfPEPRKXQVQHShQVMQeq^_Z]ZMRYX`PYeVLdh^OS^^dahbsxqolmvt{pm}m{jgoyn^pfyvnQiwx}yiho|ylt~po~qztsR[ntkmmgRpxonx{jpc[gyvyebkvybrm_`i`dl\UY\a`_][U^d_ZWRQTZafozywr`ROdq^TY{wh}wvz|tjjmnyu{{grrqxx||np{~p{y}{f~{y}w|wy}rp~tqo{gmwni[juX^^ja][eI]jpKURRgX]iuoQXi`\GQFda_WThe[iWQ`_OljUSZL]KLPN][MnUswgftll|eSgRQZSXZKMMSRXDiceYE_fUOTh_japiI]cVO]Q_YLK[hZVNIW[^OZc]klc^_][koh``aWIO`_UU\WPKGHW^RFI\ZTVXTS_VY_]]`adkljlpmkkowqr}wjkgcanz}iymotsurqrstofgtpglhlk`acmpejzsn{~}yv}ysy~~x}wy|psnionnkipsgfhluwqjqtlr{x}g|syyyx}~{zv~y}{}~~{}thk~tw{x~|ww|~xvnnkakkdfepqqvxz||x~||sos}uhd|tt~{wxvnrt~}xuzwy~yqkuqyxvuwtvwnw{y}}ywzxvtt}yyuuytsz|yk||~s{~zx{z|z}nipzvsnw}~{rs~|qtw~z}~|~u~x~yxx{tv}vp~}||{zwvww|}vtyywuuxu|yyucbap}lr}}{titw|~~_]akhgfXMbqO>SPSdTLb]GNMHSVI=AGEAP_]NHONGLRIACBCGILQUY]XQQQX`_]bfggkzwfdcbbbckidjjhfdfeaddkl`]`e_`aVVbijcji^`_acddfkkkfcaZ]b`VUZ_bcaWU^V[rh]_]i_GGMLIPcRF_ha`fdejifmp]Wegq}igkkkjtunqpdmrf^^^behhjqurrpryytxz|{{vzvgrz`a^X``ceeimrqX]wgMYeaVS\^dz|uxt}{y}~xxt|zzy}rgcs`}ryy{~|z|vsqzupsxukcb`]YcgmkbYFD]aSji~ceimmw{rn`[ksw}}x~r\dqjmrKl|kw|]ZwmZnqnWev{sj}xjqmrcrsurii`fW`lxZEbbqrb~fe\[nswWLaqmz}ruxotwp\[^JLZc\lt[ZnqcqcRK[wyaXZWOVWE>O`\ja8AbURzeYagi|gGZUP\TF;GMiqocI9FMELTKSMH_aNZKVhvc\XZXRQV^fNRbQPhqbQQeZiqjcpu|ruwq|x}]}zbizgaczsg}~pySydfnq|zlcjtw}tppwyrw]]bjzmjgTcp{pxchkRXswopnfsmcicb[]ael\VY[beosoXZ[ZTTOOSUTUaqlZX\YVORZ`d`XWlvcvxqonlefwsov}srthehmtuwtgqot~v}}~vp~wwzyxs{~pu~~zhymtpnmcinje_nwXY[j__[dR`ntHKZYh^Xkuq^Wha^GYEihe[Shk\l[KXaSigSTXNgTNXN^iQZftvndt|j~k[kZTXQUUTMMSKZNeeb^F[g[UZjdeaxyP[bZN_R[YMHVeZSKFSXZPW\age]X\\_qse_dbYOZdWOXZTOE@FWZMBHZTNSRJLUTY\[[[\fogdimjfgmuoq}tekf^_mvz|l|{lptuwtqtvspgjwtijgmh[`gqpfo{njy}zuu}xr|}|x}xxyxtotuupmqslihkvzochnhlrr}vg~yov~rsy}usxzryvu{|~~}zy}{{u}~~~|wnsxzx{|yu|}|{qoonrgdlfmrnxzvv|~z~~xlnsx}qgkos}|urstw|muuzwzzxvsos|twz~{wutv~ns~~vw}wtwy}{s||zyzwrx{zv{yw{y{~||oms~{upv{}zttwtt}zy{|}s|y~yyuvpnxwl~~~~~~|yvutxxtrtvsssrr|xxki_rmy}w}{v~tcqz||Ycilhf_UWjmLEYTW^OTaPIOLMUM>?FE@IZ_QFLNGIOMFGD@CGKORVXWSRST[`\Ycfbfq}odeg`^`ahgeigcdgfc`bflj`_ed]`bZamniclm_]^bgfcjqnleca\]bbYV[adcbYU_Y]sh[_afWEDGLNTbTMbb\_a_dgabmhRZii{qgkgfkfrwnppilohd[Y_cgjlqvqrrpv|}zyz~~xyw{|mr{ddccbbcegmnqx[\udKTeeZPbhg{{zptr|qzz}}ıx}}}|s^da\~uh||r~}zzx}||yvwtpcU[gh^ikaXIH_bXiv{enilryzjdmno{{{baenavS_{oph[wpYwttSat~zzkwyojmrgmuslbealUVfw^E\^sqc`cXXisuQKbudqr}uz~z{wzb^XVd]cjkrSUwwovaVL^|\]RSRWQB;JX[jQ5KePZybXaflqaMXM[XH:>HTxqkN1:HJCMK@KSTbYYUL\lv_VYYXXTVafRT\NVcycOVfYl{helqtr|}t~}ddravqe[u~pi{os\le]oilvjnjmrttxmdrur[he\lifVZuiu^ZsNOwpgsxemg]][`RW`ahZV^\_YfpkUhKHJKJHQTRTdmfTXWLGHJTZc_]r|]w|xtnrdjpgaivhmwvtyvyhe^npjxlnkgp~w{kw~zx{voxx}qtzyvzxzwsips}tkwjynvddcbbb`qyUT]e]``j[`ooFQXVleMkskjifd^VaGstsSWmjjrTGYd^a_SVQSmXO\V_iWLzjptngphxq`oa^]SSNUQLOJZY]iV]KQg_^`ejae}\]a_MbY]SKIO^ZRIDOTTOSX`a_TT[X_tp^]fc^]`^OU]UQMB=CXXI>GYPKRKCJS\YX]]]^cmc`gmiggjwpm{rbkf]]ksxwnxqkptwytoxyroglxumkili\eovtjx{fi{{wss{tr{yzxt|utyzysrturpmnxzob`hfimnule}|ukvxlt|~}sss{yuxvwz|~y{y}vwtloy{}}{{}}yyyvwyw}ux|yuvz|~z{wrrx|pfrmjzpynr~{|ztuty~}wolorv{|tjtpo~xyxokrtxxszy|wxzwrqx{w|z{~v~qo{mqy||soytpwxw}}z{}}|{|ux{zv}xz~}}pux~wwyz}~zzvwytzyzzyq}z{}~xyt~tpjw|hz~~yzzxxwyywtuxuvvut{v|tp_xuzrxwwx{}sav~~Zlmjgd__grhJM\XYVMXZIKKLTTA7CC?DRYRGFLLGIMKIF@@EJOPQXWOPTUX]_YYcb`kxxebgf^]_`eggga_aif\Zagkgace`_dheinjfbmn^Z^dhedpvqjeda^_bb[W\dfcb[W``drgZ^ecPDCDLTWaTQf_Z`^\ee]aj`Q_ooyzhdjdclepuooopmljp_Xadiknrvstxuv~|{yz|vx~x~ww||jmmkihachqqmy_bzfQZimfYmrm}{||qsu}y~}z~psu~|{{~yz|zeZh[hymeuv~{~}|ry}p\WfvjZmp][RH_b\kvskviiv{ppry|z~lj]q]ocWxrlq`vs\yuyPZsxzkyyshnrkjwqla`cnWKbs_ES[npd\bTV`wqMGojdrn~qws{x|zw|kdWhwXbojmOW}xtsg[N`wZVL[_VKASdSgsc[`difeQYRZH>:DHfyoi>8HKJFK;;UaZXW_EObqpWS]YWYY[bfY[YNW`ybMaf_tygljh}tbqiuwxcm~_nxo^tztourhec]Ysphnismmt~qkjY{dnrXofSuohkVVz{fr^QnRNrkej{mhbV]UTP[X[f[V`__[o}nQjGPRRPNPPPRWWRJRSPW\dsplkvY[ov}X[bdhxt\bnn{fixvxzrrzxnpZmtjepvjcqkm{~}pmz~|tzxyxrlwx}xrtkr|wx}zsrnho{o}puqqvn|`gVY\batyTTa[]_imabpcN]RSrgHkrjnuhi]hnZw}|Rcvw~tQNbcd\YVWL\m\R_c_g[IsjkllinfpwcwgdfcVMRWGKNZ`ViQUSOgccacpbi~d`aeMb`]QEJKW[SGCMONMMTb\TOS[WaxhX\hfedc^X_]WSNF;BZTF>GYLFQF>GVfYV^^abhoecilkmlmvtpwsaikb[f~strppgjosvztpwvrpioyupnjlmdlvyulzzhq|vupqzssz|}yzwr~wx}~|wwwxxutqw}ugacefiorhcw|{ritxohrz{~tvqs~|wxxw{|x|zy~w}trthnvwywxzz{z}~vyxzr{qxvv{yuuz{~|~xz|xv|krxjzv{mpwwxmklr~unkgmvux}{}vjvqlwuwsidrx{{{~~vx~~su|~{x|{z}}ojumoruv~qls{towwvz}|}~|xx|xu}x{~~{rw{{z{~~|~}zw~x{q{t|y~~|zwpyyw|yzs{uohvkv~~{zyv~{yzz{|zvvyvy{ww{u{th~|snstwz{fcdljgeedgpucHQ\WUPOWPHLHMZN;9@>>OYMDDHLKFHLNJ>;@FJNPQXVLOVXZ\]Y[_bfszqedea]]^`dfgdZX`ibUWahhcbbb__gnklnhbcmm]Zafhdgsupkeda__``]Y^ggcb]YabfqfX]f^NGBBKSYbTRd\Y_\[eaZ`bWXelqqjdbabejjopnnpmelmhjkgilmorwuvywv{wxy{zvx|z~}xw|poqxog`^httkukk}n[jnppesyt}}ts{xrzxr}}~}t³t}}x}y{sz~z}uf_jwau}xfjz}z{{q}bchtyk^rrY_UKa_`ormrqjjxy}~z~r{]p`cmYoxhz|`rtcg{zPSpry}k~xupzpqnjwsja\ej[E`n_GRXkne`_TT\vtmINr_fno|qmvuztzwuzsf]wyTbnnfNavvqq^Qet]RUjfQF@GQXn^IFTc]hraZ^e\dcNaUL?8?BOylp`9KKPHGHKaLKTPWOckRWVhggefjoc][QQS@BYVG8EUJDNICMci[Z_fiklmommqqqvvov{spadppggyzwpri_flqt{totkksnqyrsurnmqqptsq{wr}wotknxswvswvrquojv~xu{{|~}{z~ur}zpkflmiprnmqx|rptqqquxwuwwpt~{xxzvz|wzyv~xvyyxorvtwx~cx~trlsvxwuxsuyqzwrywvztmsxuw|~|ywwstz|z}|zzv~wk}|rvllpox{ujdcts}zwqsuquvxrgqxzxw{~}{{}|x|zy~~ztx}zymdlwj\itnvhkwxqwzxw~|~|uzx{{~ww}wtvytxyort{rru|~~yzz|xz|~}~yw|{yzwxvz|xu~ywxuxu~~xy}~sp~}v||ov~~~wz|y|{y~~zz~x}u}mp{{{tt~z{gedfb`fnpbPRSTRPOQSPOGJUUC<<=CLOECCBHQHAJOH96AIIGGJR[ZTT[[VSPU\_grnhgea\Y\^^`beb^ZZbf\QV_a\\`_[Y]fmlmj`]eni]_cdedowqypcbdebbbacfifbb^^fdejb[_^ZWM@AJS\icVZXXXWZYTZbZR\ilg_ZVSW]ctldpwoqtqqrrwytwwqryxstsssu}r||{yvuvuwz{~|zvvs|zwurw|xz~|z~urj{znx~wy{xu~szw}u|}w{vz|v{pzx~y}tw{x|}xs{~}ww{}~}|}{x}vwx{|qlnetfT^^font}|xls}}yxv}{|{yz}tvvqemieulmhhve\XRkcwgqvtr{yyuutqxkrwaf_nWfJZaXINWhgnxR[\N[are:pv\_j^p`nxouqmswprzgkjcoyuTevp|snufs}u^fyfMKF_`gwkV=P_jXceV_]UVZUgQG@7>A`pcs\7XSGGYJRq]HFNgdV\V^khnhZWagbgaY[]]_jqpk^yr|tsgdw|q{vfntandfth~Tg|tly|kSaggiim\iyy{s\wjqg_PkjlmhVXaZSOH>DpVKYaabdi~shV]YOYYXUUYZWPICBDEFHMU]ffXYqs`irr~~^Y`cZjxglft{n\cYildh{{mhilkh}wu|}zpp}uy|z}~otyzyvu|{cz~xxmrynzskhh[fweXWm{wsvzxvpw{y|vpzxoen~wTc\NjeU`opQgYM`i~}nrcTp\Uzhjotvxzegywn~v~fl`TPXZ\Td`ci^dVGVjciXefs~jzW}wokpkT]RFFJ[WPZD[g[khlqkqkw{ZfeQbleYUV^GWTA8CHIF?O[ELPPTKa\KXThhfdbln_`\MS^ML^XG;JTJDMPMZimfadnpssrqqsvtsz|puvmfgqurpx|ysriehknq|tmskirsrvqtrronupossu{vrrjrjqvu|rnxtnoskhu}vt{}z|~~|{~tt{xqlipsmtrlsuxyuxztqsvwv}xxznn}}vu|wuxvyyw|pu|{ymn~vvy~vgvttpmwsysxwrw|usxst{wwypjrvpry|~~zxxtrsvzwxzv{}x}m}~qxsrwquztjhmxywtys}yvwxyru||~xxwz~~}{{}~y{yyy{~xsvyvngfrhZgukz{lju{sw{y{{z~|t{yvy{}{vvz~trstqvqipox|mktt{{vywx~vxz|}}yxz{{z{|z|~~v|yz}zwt~z|vww}lx~y|~{}}|zz~pu~p}||dddd]akme]VYSQROOQSXMDRYM@==>HNGAABBPSEGRI:4=HLF@DP^aVPTZUPQU^behkhfb][Y[^__`bdb]W\gdYSW^^\[][YZ]eljji_\fmhaabfcdqsr{oaaegbacdgkgecb^_hfehc``^Z[UFENT\lhYXYWSUYURZ^UR`if_[YROU[etdg{xmswtstruxtvtoqwupronqt~ywy{zxpquuwyy~zxuttzuz~|xy~~wq{p{}vxwzy}vo|}~q|~~|sp{ts~{s|~}s|{~x~vt}vvxy~~~~}w||}|}~{ywu~uqujyva\anoowzrs{|ywv|sr~wx}}x{yyut|s}xhkiaqrk|ldqc[{bVf[tz[jsus|{zswvmynow`ignUfQZ[XHMWdlutN_[EXdvTBlUdbdpqawrmtjipslq}qcreuq}tYlnnqokuzxfartRHUYjirnfHIch]N\ZX[UKP]fYIL=8HVidleARbGg`BBPgja]VVfsnf\Wai]]aZP\eim|s|yyu{ur~|~v|uj|lnq\nwrogxd_jmu\iptuirwnXUpdiv^OW_YQOF:MzMBO]_aabp|tW]\Yhm^RU]\TJDDFHHHHILQUVZdpiWYirtDSSY^]gqm}dd~ti_cdoyhquezndnu|enn~|}~tn|{x|}{y{v~uuyru{n}y`z{}zynu~yttmee_Xhn\SVp{~v~}v|~rnxpoln{t\f[XpiZ_vk`sXSkmwzR^w`aguvs~qhl~yz}xsk{`TKXYSSi_ff^iQH\mdaXgp}|s}^vyqyoiebRGRT_R^FWpehihqjxhrv|WabSpkgfWXcMQP>;CEHGDLOAIPUPM]OHWSgidbbll]_ZN[jXYdZQIRSJHV^[fnpvnjqwzytpqy|yv|wuzljmrx{~{vojllkkoxkrpiqyspqtopoptnoruy{ur{mjplwtx~mozoknqjht}vsz{vz~y}zqwxupmnsrpwrk|yuyy|tpsvtr~~yz~rnx}~tqyvqtvwwz}qqvv{nk|x{zzthustopyr{y{rtxvtvwsz{txwmjrsmouwz{xwwspnpzwsxrr~{}v{t{xx|rtzwopuz{|~xv|x~~ywx{yv{x}|uwvy||{|z{yvtvuv{|wssy}wpmhlj^gwmv|pnv}wx{zyx|}uvxvw||ywww{~vqopqvkflmuym|jt}rvsqwuv|ysw{|{{}{x|{|~y}|~}}~{y}wyu}p||~~}~~y~u~~}baa``hkg`\\YTSQNOTWXGI]WB??ACJIDCBAHUOGNN>4:CFD=AR`hZNR]YMKTabbfhggc\VW[]``__adaYXgp`WV[\[[\\WVZ[clgbc][gkba`bf^doopwi_chf``bfklddca_ahhffea^_\[WIJSW\ln\VWTPSXSQZ\UUae]YYVQRV^klaqsmtvsrttpqqrplpwsnpllwvtwxxywslpuuwyx{vtrosv||~}uxu}xxoz|qxz~rprwrq~zv|uyy|y~x~xvst}~uz{xuwys{|y}yz|{s~{rvzrm~e]itsu|}xor}~{spsvphwrx}xvutxly|rx{hki]mqmlvhg^_xl[dVsrQeoywtz{q~zjysoscjomYf^ZRZFLS^qxsM`OACDGJJJJJIJHIOSSKLVZdswuj{TVyn[^aglotpddvfca^cjiyokr\Zv|obhzsxx}~stw~zzvxxzxsqvxmyxtk|t_{uqynx|otfbfXUgeXSUq{~upmrispmywedXdridjzcxt^cvr~xGpyjmp~{n}nhl{uvuhzaSOYZQYhdg^itONfqc[]q~~}uv~x{yqnvlWi^k_gOVrrmcdpfvjop|YaeUwlioWSb\TJGXa^ZWZa]NIOZ\]\]ehb[VVUY_ceeb[[bdcfnl[UZ[X]c`RP[]Xdk^WXU^jdWTW`bYfshmo_^eibZY`ime_ba^`ceeeef`_`[[ZV]\X_gle]ZURVYXYZZY\]YXWXUTX\`cdkvoflssuvtqhhklklqqlopjnuprwvutplintqtuttsrnmw~}ynxz}t{|wx}~{}w~~z{w|wusv|tz|}~}wzwz|nzvyuyy~wtqs|{||pswmo|{xovrqpo}ux~tvnsztvwwsqmlkv~rmswq|rw|u~z~wwuixxs|xskdq|y~xlglxt`bz|v|vvtkxnk}so|kkk`gmsctzdV^x|}m]ZSqdRgjp{om||qxshptkaZilhdfd]^HCRfffqQbH=VbXElZJZkt{s`{sjppjy~iagZjtgpyq~ou~zbdcgoigXUrt[CUVX]Z\aamh`[C9CYTD>C]ZBLMCDDIVomdXLIUdafWWj`TZdZZZX]_`cfisjue_zjhoo~xuzmadvtz}^k~qou^ognb^\]UU`\QOdz];@DBNa_d^bnnl_afkr\GC>>?AAAA?>=>CFIOQSSSSW^fnt}kTWqfRmta^qmVhp|ufriTbidtgbi`dikne[tozpt}nw}ry|q{syqnzqppqkqn|wvyjgyxjkp|o|iishtyz|}g^^hZWa\d^]murmeppryyl\kwvlgquopyz{pzcw|lwu~pbmuxphpoepx|rkjr`fX\^_rYYeikwq]anne\x|xy~}}jjz}}ghbfgfts{foi`tpmtkXZjfTPMNOCJIHS^KU]RFRKJVYadoSarf_cibnwinrqwljjjuwwuzyy~wy~~x}yqsw~~sov|omrplpot~plumpwmlikoxzwxwohmiqyoxxnuvljutnsv{ylnpmlrtquwxtnmlllmppottgk{ww{yppomnns{yttvmkpsopvqpsxzwt|pkqljnx|{|ptwqkqyvx{rmuuqlmwnfmlhejngihhloqrtj`dklinpkmwxqs|}}}}z{~{~|~tls{s}{vywrxzuyx|ztx{yvxzuzntrrvvrrvvut{{tnnm{wtpmvz{zzw|yzvxwwvtyyz|}ok||smq{vvr|xtvzzqnusvxwuzywtwz{{|~yxzw~~z}}zrty{{|y}{{{yx}{txx}{vvz|z~_afkkb^]^TT[^][WZ``PVfWJJJLQNLMKHJPTLGHA;EJIEKX`_\[]`VKHNY]\Z\_b_\XTTV]begdXS\ggcflgXW[Y\kiZOP_^Wfj[VRTel]RTY`]Zmsfkf\_fi`WW^eg`\b`]adddeegb_^[\ZYa^ZafleYWWVW\]\ZZ\]YY\WTW[\\aenjidchimxzojggiklmrpjpojprmqvutrnkhovorsrrrrlm~~yrowyzzv|~}z|uzvs~{~{~|xz~|ssq~p{~zs{z}ux}w}i{}y{trpqspy}pkjpyxxsmqtmpzzyzjtplmp|twytyhpyquwvsmeggvwivmvkouq~}uwxxwvwoxxr~tpkblx}v~xidi}vi^sr}sw{nstkv~umz~zlhlfigvckwkS\uuzm]SQm`[gjnydkv}orbj}mZTalmghia]IBQha^nUaHAUbTKz}PKeuw_f~{yqgwsn~g`e`zqgtyjwq|yacjgddZTjziIJY]VWVY`tobVA>BOWIA?Pcea_grokeminkQIA>??BBBA@ABEHRVSUWX[]]ceaeUGN[}|^XzsXTsnUmoztoyoVireta\]^_bindas{psnmuxhouzw{|s}qtnhsonoshop}{|rvteervin}nxysxaipdoxv[^Zjc[[Zte^m}yvmempsyyvYk{zneotxvw{yzt{q}vnvk}oxkbiqvr_qxfuwpcjasekq_X^[_tUWhfyrffsqrns~~~}uvvmehjeur}jwkbvtptrd[mi_]]SSIRLMceQV^SERLM[[advYbsjgjrkrxsuswyqmpuzzxx|z}|o{zps{}yxotzymosplppsqkunrxmjfiqyzvzwoiljnspwunssmjyzruvywkmpmnqqquwtqljhhjknmjlqegvwyx~skpolln{y|woxrfhmskmwpnrzzv{mlnilrzy}tuxpnvy}zt{~pmxunkmqhcjjhdilegdcfjorrdZbjidekklpvplv~}{~}~|jqvz||vyxpuwszy|rw|utvzx|nvrv{xqsywv}~tw}xopn}wspnt~xx||zyxwpvxzxok{}tnqzxtzzwxz}vrxtz||swz|vx{}{}}yz{qxxuz}yz|}poswz{x||{yxy{zzswvy{zrsy~yz~~dgihc]\\WS]jgY[^_]\W\TQPPOTTKLONNNORLHG;DLHHP[]]\\\cYNGHQX][Y\`a^XTTX^bdecZV[iiddgicVZ]ZkvaTMUaYZjgYWR\niXOSZ_Z^rogn_Zafi`UY`aa\Z`a]_dcdddec^_][Z\c`[bgkbUVXT\k\RY[_^Z]WSWX^]^gnjdc^_eejtvocbfhjlormjqnjpolpttsrkhhptlrrppqqln{uvrq{x}}{y~vwwwvznp|zzwpu{~n}xpz{y~|}wup}ztv|w~{{i~quriowgprlrupefqutppqoorvux}|vmumgnt|swwtygpzrsuuulcfiurakp~fbt{ttzxtxxsnvwyupuvr~qol_hx|u~xhcg}wiboz}rvyqmujw~vku~ynameq_udasiSYsm{xk\LRf`gdkpu\iuql^hpWU^hmumha\LBRh^Wq]^HBU_VQjHOr~vcg{ywpg{sofbfknjtvjurxecqeaaXarmXEN^ZTTTXitfWEBKSUL@=EPMJDQZ@C[r~hSHHduomsheZkayqgoyxfYimrtjxy|}n}v~yfjwu|]sqcipYaeyiA;9@DAE\fh_crooeojlqYNIB>@@A<<@CELY_[TWZ`eebVPYVKIQhyY`rXPrldrwzutz|[owit_\W^_]jpdcnpgsfmt~ocjlmy{|{s~pplennmosgmj}wspusdeix~gsmrquvVk|nfmtmV]Vkh_WXl]m|~xumejntyy|[j~{nemrvzzxxwnvp|}ojk}yufddloq^tpw~hY^_ayshuyfUY`YfrVVgs~sjhkyrw{}w~vstipkvs{k{k`xupssi_nj]`meWPUPShhVV^TGTJP`_cg{dcvpknxquxwytyzuqsz~{x{~|~{i{{nt~|v~xmyunpspioor|olvptxnifipx~vyynnpiorpwtprqniztuwyxnjpqlpqpswurghleklmmlmmbgtvxr~mlmljipw{soxoadrmfsqnmty{xqfrmhkx}vwx|roxz|zt|}omxumkmpgciihdhkdhdafflql`W`jgbcfjlnsoiu~}|}lpwz~zwz}{quvp{x|qv|ttvzy{nvtt{yrr{xuy~tt|vnpmxqonry~xu~~zyw}mvw{s~pky~vor}zyvzzvsz~utzwy{}tw{~xw}}zy|z{nyqn|vw{stvy}|pnpvx{y|}|zyz{{zyxstuvxxxqqx}z{~gfec`\ZZUZhe[U[daab^WTYXVYZOLQSUTRQRNHFHMOMR]`\Y[[_XNMMQW[`][]`a[RQW^dgf^TR\eld`eig`[ZWavpZRR]`U_mcUSSeocUMSZ^Zbplfg`[_efYQW\\]^]bb[^deecdfc]]]\]_da\fnk_VWX[djWU_^`c`\ZZ]\^`fjfb``^bggorkf_agiclqojigmjjllqqopnfeinnlqppnnplp~xqzsq}zz~xurqopstzsqv~upuv}m~snsvwz}|z~zn{~v{w|ur}yx}yz}{~ylymoget}ohoidoog]btvtmmwqnu{vw}wlwlcq}ttuvzit}sru{sj`imonfesy_^swtuutswyjfxsmosllxt|omm\ewzt{vfdd{wkll}lu|tgtkv|thlzwn[rfxgjbXohSTpnspgZKT`egbism\eovafcsVQZbb|sa\]POTe\RkgZGJYTXXeGVuysxefyywkm~rrigoy{nosplvrxilsaf[dggaJE`[MRRThp_OJKX^YH6:JJGMM^Z>B`p{jHTbnspjkc]\_uspzzp[_wxvxw}zxu{zqxhi{ur}qy~aa`khQ9@=BQ8=Nerc`hfrc`jnsk]VPJC>?CCFJKMRTUZ\YWaknfXQMHGWtkXjqg^apbio{{z|ir~vt[]_^^`qrehjkjpyvejormc``adpxr}||wnmjciknrqihf|ojmtscegw~fqvjmtnVlolrip}lU\XincVUs`lz~~utoddlswy~_i~unkmnqyyrsp`mpxl[h{o]fadfphwt{cOT[ZgrjqpkZK_aYmnOUp~pggggy{y}}twv}swmxldtrpsoncjndgvra[aZ[ee_X_WJZLSighp~no{quu|yz~v{~{uu|x}|~wj|yju{u~yxrogs|pfoopwrpttsvqhfiqz~x|yqxrissnwuqrqohzyxvyzqksvosrqu{xuhjpihhoqmmk^hsuvm~efhjhjq{sumpvm^bqffpjjkrtx}hmsliq|v~|vqz||{v|}qpzvnkoqgciigchjdhcaebhrq_T_kic`^honpmkv||}pq{{yw|}suvp{x{pw}ttvyyznuvt}|tqwxsv|wruqkpmy|tonqx~yz~~xrssyu|okw}zrpz{zyzzwsw}zyzxv|w|{}y~}{v{wynvojwxstrmkxpw|yxzyrnoswyy{~~|{yzz{zywtuwxyywqqw}|{~fdb`^ZYYX_f`[Z^heeg\VZ^]`c]NQVVYVRRQPIFRTTV\]XXZ\ZZTQSSX^cd^\_a`WNR^dfe]SSZfifcdjlcYZUQgtbXXW`_WemaPR^mm`SKT[^\emdbf^\`edURUWY^`^aaZ^eeebcfb]]]\\bgdclmi`Y[\^ehWXdefga\^^__adigca__aeijje`]Y`jf`ltleffkjghkqnhlj``jmfjqnokkolrwwsqvqr{}||z}{~zuz|{~ujllkjjt~l{|}~}|ou{o}m~plktsw~~{{vs{t|{ms}ymy~|qn~|~x|sz|{|umyniehsynhmfboj_Zd|{vojzuow}|vwm}t`uvqrx{qxzoypj_orkonxfvw[bswvvxtswudf{wigmqfjyuz}nkmVbwwrwtdd`rwnqmz}lrxeoot{sheyupYqmvxe_RlhTNgjkhcVJS\fgafwe^bn]xr`{r\TVaUtwXT\P]Uc[OimYCQaJ_fcF\urstdfxuyvdsqvokwtqqokottxlut`jefaYSCT_TTSQ]eVNTS[bWD9=HMIRcpmSPgmslLXsgb^ae_[rwx~pdn}~{q}wvv~stxyor_~qwtm`YXWOC;FFI_>@ARrh\Z]npYhopwh^]XQMIECCGHHIIEGRYZXUXXSLLQTg}}d]sxfajp`^jizzpr\lg_bixohijiinymdfdcb`^\X\jtslyuuxz~mlg`bhnuokccwjblrs`ego{fmhjrhViciyikz{kSZWivgZSzfl|}qsqc_iruz|fg~toplekwzjnlXeprmSbylYe^\^rts~u`JMVW^klnk^\PQha]iaQ^{zq`ahcyw|~~~tunylllmpslnferqmx{kbeeddci`aZOaUXpnkvxuvxwz}y|x~y~~}zsq~rdzyv{uz|ki}~|mfoopsslmyrssigjsz|~~vu|mlypkvvqtsnm~}~wx}ultwsyusw~}yknxqmmswrsmcsustm}`cggijrtrrkrqj\bqcijcijnt}rpiuumj{wzv~|z~}tu|ynkqqfbhfbcgggkacd^gqp]P]mjd]Xernljkw{}|ww~}zx~~vvvs|xzrzttvyzxnsxw{vpuyqq{{molgpmv}xomv{~{{qtz}vokuzztoxzz}z{yqu}zzzv{~{}{~}}{ryy~prrowrpqjgjoot{vrszwsnlpuxy{}~}|yzz|{zvuwxzzywqpu~}{edb^\\[Z]bda[]bkige\[b`age]QX[]^WSSTUNJY\[\\ZUXZ[[[YWSYcehg`]__^YU]jg`[UW_dhifcdlg\UXSXpn[[[[da[hj\PVdnh]RLZ^a`gj`ac]\ad_PRVWZ_a``_[^defadg`^_][^ehejqid_Z]]^gh[`ljge_`da_cggeecaaacfgje^`XVhk^corh_`gkebfknfcid\_ihbimnphimmtuuqqrqp}yyx{}{}}{x~tzz~{{}ysw}utwphnnmkkozq|xmuxlp}snhrlt|{|xz~{loovssvynl|ygs}xywp|x{x~ukunilrsvqgklinf_]g}tizzpyt}ypydv{np~~v~w|~sncvwityyiwu\ktr{zwqsvo`lyncguk_jur{~v{mmhOfwqkqmbgcn|wtrzxnp|iiruwumc{wr^hwrgZRfjTJ`bbb\THQVhm`gyab`lybe~iqpg\Q_WevUP\RfU`VMhqYGVaJix`Fcumrmajppxsaxyqy|ko~}lrsnipnwvo{vfso_USINaXWTPTTQUWSS`^QHHM[`^gqhV]cdc_N[xmmcYmukou~|rz~{~~}|u~vky}~ukjynqu~wyx{vpx}{{kRPKAEIEOUScQJGOqraW[hybdecjbOLNPTSLHDEDBFIHFILNFENRNKJKTjtkaixlZaonN[dhzx}fjxj_iuxflhfdcu{bdf^\X_`ZSXbjjgpmi|zwnhe]\howhkdbrg\it|\`gguflskrykZcZerjh{|n|nV]Vr~i_Zngy}|nqqf]dqrz|mn~qlqnbduvdikX]kl{mY^pjSb^V]wti|fKNNSV`rpp^OQVbla]aabjih\djq}~}zx~|z}vqzoqjhqsehherwx{|tjjljf\jhgeZg_dxxrxzyzu}yy~~{~x{y|x~~rv|hj{~wxkw|zzmcotrongkzstoeggpxy|r{}kwlhxyuwvosxu|wnvvt~{vz}ou{vtw}yvtnz~xutbfhjpqu~nnllrmj]dqhkdadgovuwwfnywnqz||~~z{~zoltsgbie]eiemnafb\msn^O]nmjXSjtnkjoy~{}|~~~z}zwx}zy|~w}~{yxvt{wulx{jmnssjtvwv}sz|}s~omvswxpsxw~{zwps~yx{tv~~}{|}v}~tqwy{uutihmmntyuqrvrppoosyz}|}~|yy{~}vvxddb_\]\YZcjcX^gpkhfeda`cfc\W_`e_XX\WPIW_]a_ZYY\``__\YZegehg_Z\_`aell\V\`djigjg_`cZRTZZgvhY^\_gcaifYQ^klcZQS^_`agi`ac^^ab\NPVX\bb_]]]`feebdf^\_ZX`jmemrhe]Y][_kgeptib``efbchkhda``bbbege_^_V_qe^jplb\ajg\^fjf^bf^Y`gc`glomhiilstsqqrqt}yvx~x~{|x|r{x}zzqqv|{suyoimtyyvt{k|umzwkzwskseu~~~ywuskpyomr|spwkpzsk||xzsn~zvws}zluuqvypvsisytpcahlxix{qy~t}xs}iypqy~}wtn{yhyk{x_txpvqssfbsuh^nx`Ygquxjurq`Tprhhjdgkdm}t{ztpq}xhuusxrh|zs`gyqnVX_g[HX`Y\YSFRPgpcisddblsxeYvtnomgQZd[sUT\VoVWMKgv[Ma]Yoy]Litjoyb`qhkuqbypozsisxppojjljzpprquj_VNMZ\SVSPOMLQIGVdZMMZkofhm]NWbaXSSb}sde|rwxzvyy~~z|xy~~z~}~xtz~x}zo{bq~we`tmqq}zxvxy|}}|w|~lD[GIBJJP[Y`\USSkvk``mywq[bf`TD:989;=AACB?CHJJHGDEKMJJMPT_fcbmpi\eqbKQ^i~}yglkdquvclgcbf~v`cf\XW_e\TY]_aeinlxxui}ba\elwelgdlcVjqb^gcolkofrnvse]Wipii{ugy[gUvdfdtkvy}~|jqnh\^psv{oszmkmodbtyl_diZZdkvi_a`uiQ^^Vczk_ySAPJWW`~puXQRbjjhaflll~rcidox~y|qw~tu}|uwughqsc]kgivy|}pprql]ipmoinmsz|xy~}}u{|y~}}|w~||vuw{|{uyyiwyv~zv{{zqix}snndjystmehjovw{{szsfp{vwwyq}yry{suwv~}z|}tw|w}|w{y~}}rllim||t|ujkjqqilcfmqm`^\hrv{wznbrzou~}~}sqzvjelialjbqm`ha]oum]P_pmjSWrsqlku}|}|z~~~}~||}zz~~}y{ytzyyxhv}yv}z}|zzy{potqv{nnvp}|}xop{tq}tn}z|~}}w}rs|oqw|wroprqrsrw|}~}}|^_^][\YVZio_Ubonljjjha_ef_]^acg]ZZ\ZSR_c`^\[ZU[fgec^`glhejdYX`gfhlm]R^jghnliid][ZTSW^dpp`]b`cjgdfbWScok`[VY_^abgidba_^__YTUW[bea`^\`cigfbbd][]ZYdpnehigi]WZXanmrztfbghgdciljgb``bddfffa_e]Xhjchnlg``gi_X^ee][`bXWbf_\dmngfhgkrtsqppow}srvz~{}{|yuwx|ttw~}}zw~z~|zym{xmyuj~{vo{fv|~{wlmpxznf{|mtwrw}my{~zxpnzxwws~|py|ryzq}|qehtt{lw{q{}w}|stlyvry~xw~yjwo}jxnuotqckwk_asjUWbqyn_w|n^ftjgjcerm`l|xyvuuzjuwqyto}{_prssY[]ddNSaWWXQCVLbrgomheknjs}fZmvqklln^VfbpZT\[wWSLJbz]Pk\go|v`Xnpbmn\`zyegpqevlpxwjcrtrkedmei|}fsl}fjgUKUSPPQLHGIG>DYg`U^lrhY\eZMPY[WSVfywtwzzx{rn~v|t|{yv~vvx{{{v~xv}tuyns~wq{y]g||}u]Yookm|~t{qwv~syx~}zywxwphOfYYOJKQ]\_]YVL[khgdi|ljojdYOFD;79@CCDEA?FMV^`\WVVSV]cca`gpmifrr[NU\nvxveknontelfebppccf\XYci^WWVYaegnnvyq|eh`kowhlkei]Rkim\iajpl~e`ujlqk^Vkxmsuupl}bv]pfmi}tst}yjokka\mqsymqvjijke`sydZbm^W]iufafYghS^Y[job^uGARPZRgn\\Zgmggouqmmvfgnm}su|tkwyr{pzoeputb[qkdrvyxv{ztdity|vzzzy{~}xy{~x~}{xsyxzwszzw{|wxtr~w}y{}{zxuoodkwsvpjlmpw{}zv{u~zjyxww|y~wu{}tsz||{z{zvx}y|y~}~zzsjuvzplmmrljmhgjxi^\Yirw}~{mdw|nw}vt}xojmlfojbngbg\axwj[RcpofSfvrvonz~z{u~}}}}|}~||wy{{y~u~uv~}{}}zssuttysuwjwz~{mmzsj|xl~{}}~sx}ytuvvx{z[]YUVYUUdqhVXjnhfffgf`_fd\_cchd\[Z[[W_b_\ZZZZX`ihffeflmglj^Z`hlghkdW_pmejolif_XXY[]`bjqh_ceeiojb`_\^flkc^]^`^abdgcaa__^\WXVV^hf`b^]egmkid`b^VV\agmidcaifXXYYdor|wihhjicajnhfeccdfffgfdacd]_igfloke`djeZY_`]VW``V[gf[[enjbegglptsrpnpzwlpttxvz{~{y~||{||uvzyp{~}yvsytm~wwtuyyzxjpu{iktl~{x|wl~x}xqnmxyvw~tsx~spq~swvmvzv|wpmnuz~}t{||{{nuwvsoqqqlgmtg[co^PTbt|zbh~wkoqplhhirtlcj|y{yx{uns{qvnu|atrv|v`^``eVYdSTYO=\Nctfqlmetp_ovdZlqlbhfkq\dop\OZeVOMI]zbUtamnmrbgpm^qd]b~yjggoiqnnsmcdr~ssh]dlbn~n^}{lyZpcMMWLKOL@:=<9=><<>>BHFBCJPPRUYZWVRMJKSTVbndTWbdw|zhnonlmqglhfdu{mdbf_W\hl_YZRVdfcjlp{zyfphruzlmtigaSlc|Xhcink|wbfxjinoafmy|igs~ksjrstysl}wus|}kjekf`pqu}hluihhhh`qybT`vcUUctfalYZiW[Wbob_cm@GZYSMvmeh\imbiwyxooohtvw~v|zy{~{ln|wrdyz~s{n|fiquubbwkds~tv{z}zrnw{{}w}{uwy|w~}z~usvu}wuox|vu{~~{xxqw|}w{}wpripzw|notw{}}vqv~qr~}vy{z}|vw}wyyzzrx}xxx~}wo}vtnsmlrjprnfizfb^]kn~{jmyu}~uy|wrrtooicmfbg]dvtiVTfmq^[uprypt{||xv|~sv|{|zxxyz|qv~|yz||{~w{{wwxwuyx|hpw}|lqw|ti{zp~~{||~[\WSTTS[niUQ`mlcabcdc^_da^abfi^[[ZZ]\baVV[^[T^mkihfikkdfqj[dmljgnofetxljnlkh`[X\^cecbknhgkjjnpg^abbnljlhddd`^bcbdb_`c_[[]`YWdkdba^chktnkd_`_WV_gihdb^_i^TXW\hszzkchheb`hqleeedfghhghhdhl__jihoonjbbii_X[^[WQUa]VajcX[fmf_efhlotsrqpt}{qhpuppmw}~~vx{}ry}prsoz|çyyprz~vywxxotu~wnxrp}~{nryw}~|ummp{yx}~{~y}{~}rsqkpzvruungvtr~v{~u|}z}y~y}rs|qtwswnlkmrbYeiVMWiswlar|ssumqfbrz~tokmz{z~mrqvsg{|itvxvyhakadWcjVSZQ>[Ripbqmpf|p[gnaZmrn`ba`tkbsr]IVjUKKJ]{k^zejtbncork_vw_bewqhanprnlpg[et{ssf]cfdu~x^]qklci[MQTGIIC87AFPZVJN`ndSPRMFCFJWeiknnmmsopv}y|||~}rdc|zpqlvservvxqvv~yutqsy}x|{ohzhvo{p]UrzzxdSjygizxyo|vrvvz~{qxpgi^pZf}ibUCP_ZWX[VVdR_jb[bt}zX^VLRbF<:=>??@A?;BGDDDDFC<>NKCENQICEIS^YJHWcn~vuv{}cmvpeeplkkjhfuukfbecZ]jpfZ\STehaej~i}whrouzlotkmZoi|`fjpmj{zqounmsnewuyc[tth|~}vup~rju|mmuwlg`jfewqwjjvhfjdicqyaS[|hVN\peau\QiZVYioZ^gf:KcYGS|ofg\lh_kuzvrs}{|pv~y~xrsxzxw|jgzyr`~zu~y|o~fqvy|ag|pjt|z~zpytz~uy{ysuw|v}{{|{~srro}zrup}s}tpyyw{{quz~y~xtyqx}sx}}pn}uouyxuzwu~y~}{~}vwyz{rz}}z{~xu~sorwhnphtwtek{ffjilryitv|~u~yvxupifjfgd^ivqgWXhkoZgyivzpvy~u{mrwy}or|z||xwsrzzmt}{zyw|xxw}}~|yxyyvzyiou{~kuvz}nz}v|}YUQRSQVfkUIXhkfa`aaa_]`a^_bdge^YXYZ]^_^XY]_UOhmjgggppggnrjanlklhrvgl|vmrqmja`^^`dgdcjlilpmkmoh^bhmqgfjkagha`_c`adbaca[[^gb[ajjbebcieoxnmf_`a_ekfefc_]ag\SVWamv{mfjgccbepqgeedegihghifij_`mimwtohfbincY[]ZWUTZaZXdg[T\hj`^efilosrspqu{xnfouommu~zy~tv|}{tsuvrkou~y~ynsxsywwzlotuxw|ot{~|~zl{ouxz}nmnty|}}|}sonkqurprvpgo~mywxxxww{r|~xwqsuxkvjrpachaLN`punchx{tukmd\{}vrmq~{|z{isqypg~|osyyxvhjmn`XbjaTYVE[Rlgbqmpf}o]bg`\mrnd\^Tkybgs^DUi[IJK_togvfgvdmdprjd|hYeguuj[ksslto\Qbwzytqgbdchw|mQhhgii`TOYQ@FG=:FW_YQOU_ih]USQJFHMZnyvpljiuurv}~x|z~tymdo{yrphss^q|~vuzquz}wxuqoszvzqu|rsmkgrux~iJp{iRidi|r{upwx{}pvr~r{sucam`tskgZGP`SYW[U[fWYbaYOXifRPYEJ]Z@8<@AABEECDJJFOUXWK=??DB?GMQKKPW_ebXU[ZPKNXajnromknuxv{~z}~o{id|wysoiqw]px|tt|svv|}vxouvvwz~wzvh_x{|{HinRrmkytny}s||}jqkpl}pxyy_mer{jlh^S\`NRS\R[^WZY[ZUMWQKQTE>R`K:BDDFIOXWNPQPNOOKEA?><;?IUgw|sopvqgcso_Yltnnfshhopjbbc`bcepp^]RPgpa`h|gk|{x}rs}x|qjtv|nmt~rvw}uwnu~yzrl{|jn|v}{p~tut||`ih{p\am|oZkbech|rrrfmhanaigpu_SQpkWFRg^WtpFkzmYJZdkdgc\EYiLCdo|Xblid\mv{|}{ym|}~rrqyonzttt}|xf}~~{{}yrnzxssbk~{s|~swmx}nrrr{okq}uwqt{x{usqiyxflsxok{{nmsvyrt{zsqz~~zzz{ykwvnuy{{pjmzxns}~}}zsz|tqvzz}}rn{sjthktrsjptduml}}izr~wzx}w|xvrusfnjefk{tfghjojgyxu{uquyxrpsfurt{rpxixzz{{wzrllurortvusrunq{ms}v}{|}{~{yz}zzvruw|tlw}~xz|~txyJEHNOUb^KFS`b\WVX__YS\`WY\\abZTRSX]WUXXYZ[ZYghgffilpebovmfoliqpopko{yrnhegjoohcehkjkpru|vmnrrjnyrhfagqmmocabfg]`gfedb]`mnghpmfcnlmqkuylomffkmmh_cd`^^bb][Yantuoinoc_flqk^bjebfgedhjkkifhnmw|pljfhkmg_]]_]X]c_Y]cc]TS`ha\^agmnnpprtvttrjgkoooovwszyoxz|}zzyzz~}y~~~}lu{{xu|skl~|x}wyvrgnsxtq~y}}~~~y}~wtojhkpgmskxnez|xxo{tnw|noyzrx{~}ww|ugrvg\Scuqcgntvnhmosqot|qkopr}}n^vqtfi{ksrsw|swxwsa_\oaZ^L[edZ_llmhxuh`ZY\nrld\W=Nsj]]pUOWpfFM^jhimjibcrdfplwaRxvnvv|lkqqmkq`VR\|umrlreniqrmR[gcgk]SVWUDCEFFDDDDSXUUOHJ[cVQZcifi`eorttwx~~z|~z}k}hevyumilydp}}{vw~uusx~zzmtru|mjPgvRz|xq}|j{ws~{mkjhowvtrzlgxfzdrjgec_XPO`S[WW\UXX_QKIJXRH?J[T@@CCC?AFJKKIJLPXXRSUMEBADEHPZ][[^bklg^a[gcXWuwkdesehnpiabbahe_mq`^SPgtb^c{ma}yxzxyjjuzwservwoeuwxvx|}y}xu{rszyzypymztwsq\lwgxnY]isg}}Vggc]dwtlsefgcmggconYQQfmXDQcZQivMeoeXL]bafp[\S[bKNjxm~Sgxj_Zs~~vtz|yy|hmz}t~q~t|yrs~xq{|cv|zuxi{xlr{yljko~xkfn|vtrors|vtphtvdgttjhwxljmpxzot|~uow|{t{{zxts~|sr}}ukoxsfjv}}twzurtxuqy}xsqwrvoirpoupmpe|kq|{ynwm~qvx~zz|xy{vnqmmlr|ynqmkqmt{xyxrpyzqkngtnov~ptqgryz{wvpfjsllopusqpollv|itvzyzy}z}z{||yvx~ylv|txx}yBCGMS^`O@HX[WUTSU[YQP]\QUXX]\UQPSYYQQXWTTZ]cfeebajok`gtrjemhmsnlpnv{tpmhioqtogdinonnsu|ulpuphrsgfffjsmonbbbff^ahkjfcahsmjqtlhgmosuoxzlqqllqroi_ile`ahf^afhoqsqjnphegloaWelcdjeagljhfdgkntyrkiikjnlca`_a]\eg^Z_cb]SSaf]Y]ainllnpqtvsrphgkonkpy|rszwwzt}||~z{yuy||||||gq|z|}yx|vml}|z|yytqnhmu}tw|}}x|~zyqmljjkviftix{dr|msrswpfw~u}}x{y||y|mh~zdgfl{m`nrqohhpy{ckuvskjmlv{f\uso`kzw~ewnkuzxtxigWmfZ^M\m_T]hlgesujcZZ\ppe_W]:Cimj^snQTffPPekbejmsZb|zgdimxoR|msxzqwtlinuaPV^vtpqflhuponbKp{`ghgZXZ]RGFFMJ>CKTVMGDBHT\ZRXfgeajcm}~xuuy~uxuiyliw~}{ywmlixnq}|usp~~}wvxnv~oyv{_gZsw}wk{uxxu|}wfojmw}tnpv{|ktynngrlto_hmSSo^TRZ\TQVj_HKNVVSNKY`O@EHD@DD@@@EQSQQLEJJEBACIQX`e`WNHEGJJJHFBAEGECDNK^a]d}hamtfiurg_bbchaVem`]TRcse^`xq]{tssxoxxhemuwqamrqp]j|uz{vwvwv|yuv}vq~|}rxloxrwq}j`srhto\Yen`wzWglfZ_qxlwrdfhjjkd_jfWQVekYCR\WN_uYabYYV_eXcsQXZY^S^omhwmXtwrP[}zx{}iq~||{}q|yswvrwg{wws|sduyiksukafn{sc_m{vuphgizzwtpfqwabvrggttjfgnwvkstou{v|{lw}vz{u~|zwsqytdfwwt{wqvsosxto{xyurtuzlpxpmxtilghqxyyrojzjsy}|y}|~}yz}pp{wk~ypsmlss|{w}wlq|rkliv}igq~pq}kfpuy|yvoj`hpgiklqnmmljltxgtp{|~yt|yz~~|{|z{{wv|ywv{zŽ<@GQZ^TB?NXUQSSSTTRPTWPOSXZZSNMNQVRNQWUQQZbfedc^blrc^ktleelhqtlmppuysqomnsvslikqtonrtxtnstknvmeikkpvmmgcdegc`iimkhdhvwkitsmkllqyvr}{loqonnssj_hmhbdkh`eoporvqlrupjhmk\Zjkcijacklebbaimowqgjhmqnplfdccdeglf]_ddeaSTefYW\bikjkopmprnqoihmroho{ulqtx{{pt}}|vquzz{w|~w~coy|}z{}|~zy~~xooz~}{~uosmhq|w~zty|}|u}qfiqmfxn_tqrnnmsutu|yht}{zox{zz~z}mrxeuqvjnqnoheitxalmhkjjpqs|{`^{qsrZjqquvgfcp~xv{jk^gi[[O\o]P\esa_imhe[\\rm]XU`C@fpujnzdZ^ab\hgZ_hrwaar{ldbmr{awwqvvxynelzeJ]ipnwradp{vjfYUt\mec__]]THFHIIHIKPH<=>@HEEXhdtoaev}uxkhlnfab`^^`_W\eU^i\[kh[enb[fn_q^ddl`VXheuz^]iorvqljnigbdent|swzsst}|qv}rgg~kxpxdg{_uwtmcsq`ejcfrw_dhgwviWgvzlmhifg`Ydil`HZYW_hljUSWP]f_Ugu`a```]s[c]`pszxwz~}~z|ys}{yw{x{z~leqrlbf`fscYequhXWdohr~hcysZ^s~yxj\mrYWrshbge`^ahmvrkqpcqtrkpw{g^|tqrpr{{nnszy|~x~z}zwzmgemxrlknqjhzuz~zy|~z|yxpsy{{ox{xzpxywv~z}uyvr~tu}z|{rnrtswwq}zoku}zrsx}id{~kebdnmrvsyqha^cdcfkimjjlnlspjgkv{{yx{~~z}sv|}{~~zz~}~}ǿ¾ÿ¿»GNUVM?7=KRMHIKMNPPPLFBDKOOMIFFFJKHHLOMLU]abab`]`mqX[jk_]fd_luhelmnsxxvuy~zuoqqlsrrvz}}wvt{y{woxynpyigijkpjkqyslmnot|ugoulhnonrsowxkqqvwuzzpoqnlpsonoooppu}{~xgeibejkpoikoia^_cinrsmegnpusljkptnlknxrilkffjld[bng]_dihfiiigeinlnohhmruxpeilrvzuoqxzvw~u}|}~tz|uyikespjvrkkxumwxonp|vxzxvmxer}uqq}{vy~woxrmjkt|yx|xy{vy}utu}y|z{q\fyyqz|lz{vwtyk|x}}n{uutiuxw}|zst{}wmvl|vnrx`^ds{wvz|~u\ib\ryaS^d_iiWvbep~iuuurpf]V[cgeSjluc]\hfXP[]ed_O_g_RbrzwkjqqopOYnq`NU^ctlizr`dggkrm~wjjv~semhCVlfgzs^mqkmfgdpjcdpkti[ZOMRKFB@PMGJHLTPQYdlpuwzqu{}|}{{}~{~tz{|~{mhekukmwkscv~lyr{{nmrwu~t[sr~unzzq{ftdflqlg|_a_ielmfn`f\fiyiWqcwlqj\qZ[WaglYO[Yh\mSC\cX\a_XXYZSOSGSUGLzpYXP_XEDEEFDDGGHIDBDEIKHIKEGGHJB??JIKgjeqg]fxuvnhhmf^cfc_]]]RZj^_j]\gaZ\fcU]l[eg`bd[QP]csya[fkntoddie`_[amk{xvzvrpusuqki~mzryui~czyxynywhdfggrycficwxjZgxknkkcfi]gmpbKWX[jhmkXPZXde\Zku_cc`bllYeX^pw~zz|z}{{{rxvyy~{~~mltnibhZ\ufX_krdUSamcoyddvpYZq{vg^jo[Sowjad`\Z`iiqpfl|k_stm}}hrt{{`d{{sijloywgftrux{|{|~{~tgjnxueelrrr~s{x|xrz~}~z~}||w{y}|}||uvqstuzxxluvuvstun}s{zuwr`yrgdiomprsvngb_aabfjjljikortnkgkw{|{vy{r~}}~||||sx~yy||ݾýĿĻJSUTH;8?KQLHHILOOMMHB@EKMMKGDEFHHGGKNKLX_`_``\Y_ml\^li[^gc^mthgkmnpyzuv{wrnrqosqqv{||vwtz~}wowvlxvhgjippku{xpnnpqw|lessgjommrqnxtkqqvwu|zpsyonrroppoppos|{~tdegfjjlqminme_]ahlrusidlpuyskjinurnnprpljjmkigcdmle`cijfdjihgegkkolejpsvobckkmwwonowxuw|}}u}{}{p|~{w|w|yhgdometqknuqrsuwiq|ryyyqq_tx{om}ysu{uk}~xqiiktzw|o}yryysu{utu~}{yz|bcuzwnwsv}tyszj{vxzkstywqmsuv}|{tsx}xm}{{uyvxr_lz~~z|{v{|kZi]YrvWT\_YheVmbfqxevquvng]WagefUdpqd^[ccVU\\aabPZl`[bqxwjikmoogUesjTSWZh~piw{dbdchqkwiil|zwmleLWjdfvobhoggfhfjbcfonxk^TK^\QIB@LKIRU_aUWcgxxxwvvw{|{x}}~vv{|y{|lhdktidpzlkbw|~irrvnmstr{sT|zp}t|x~pr{nwmrfhepjeY_]e_prdgb]XVam}XchkmoyvhvoeTRhlkY][``loOF]^W[eXTXYWSOQKRUF]l]]Ub_^eNMTPOMJIIECDB8;FE@B@AD=?=>GKJkgcg^\gwqvtfdin]^dfc`\^WX\aaci^]c]X[acPYiY\v\b_YPMTaqwaZfiirn^``bd]]`sko}|wupp|yvtzptrrx|t~rw}}uv}pnfigtyeglduwl^jvloklfd{cimpeNUU^ngmo]W]\ec\^ltdmyae}kboU^fzyyy~w}}}st}z{zyp{{}}~npumgchWUsjVZereRL\n_mu`fumYZq}te`hm\Qiwl`b\\Y`ihon`h{i]stjukqt|x]gzvrcchlxub`yxvnr{v|zwwyxqyvjmtytdcmpwwsu}}~{lw~|~}}}||}||tuq{tv}yxtmtwuspv~{r}uyyvxyax~jjoqnprtumhd`a`bfhjljikqwsmjejx~~x|~wp~|{zz}z}|~zty}vy}~|øþĿļƿMOPN?9=CIKJHGGLPLFB@CDIMLKIDABDGGFFILLNV[^^^]ZYbje]eja[bf`assehklnqxwuy~|yvmnurosrsxzzzuvw~{sowwr~kekkktvqx{uppprswvhiungnnkopnpz}omopuvv{yrxulrvqnppopons|zy|m`fhjlimnjlrj```foqvtlehrswxnhjoxxonnppkkorrlgfhlphdafjieekihgdkmglkfnssrh_fpnlqrooprrrsv|{}|~t|||~|u}|y{u}xrs}|xxyfcdii^lrkn|so|lq}kxznz{{g}_uyt|oit{{wroyuix{ypdfjsv{uxiypjwwmp}ywuv{xyx~mhqx|mqtw}t{uyxixtm|ykl}sv~unnqtw}zwq|t{{p~}}}ywz}igwxx{z|~zxys|ZWgXZopTVZVWk_Ygbfrofuhvyhlz\[mleg[cpkf`\]`\b_Ya_i\Yhfaajvwifonkjocbmg\UUZWutnp{mbaabll{vmjfsvuvqcQ^c`drpfipfhdje`Zfikq||naWXg_XTG?NKOaink]clm|ww{|}|~|}w|}u{z}zvuy}txz}jhd~kpg^kuecbw}~y{~fmorplssrvmTmrul~xwrj{ps}|qfgejjfY[_[_pci`\[PV_quVj_sqlpxnlkpLQicb^kZYcqgLQ^\WebJOQX]RPOMWQKpaVY]njkhPWWSYUHIIFECB=?CFJE><<:=9@BR]l`[VS^hrruujdikhY_fic`eWSYZ`hlg_c`YV\baPPdZUvcb^TNHNYou_Ygkeqp^[Y^dc[b}tg|}uru~yx}ktz{zw}ys}zlkjwxfpshuwmdsuqojjmc~pmloiUTPeqfmkdlf`dc]glss|bjtmjvk`hw{yzz}|}tuwv}xpn~}z}yyo{z~~|||pvvldfkUQsqWP_m`OJ\m`pr^kvk\]rpcaemZNeyp_^X[W^ielkXcze]uqe}oknv}t`ivsvaaekut_^}orkott{}||mn}|{t}vs{~zsrvyxohjqyt|r}~~}{pv|{||}{|}}~}}|uvvxvywyrs}{yooy{|zxuvdumqttstuwuojf``_cjkmnljmx|smiek{~|~~yv}|yyyy{|~||{v|~}x}~~}¶¿üĿü¼JJKI:6AJHFGIFELRI;;>BHMLJIF@=?BEEEEGJNPRX\\[ZWZehabhf[\fd\cwraglijqxux~|ywsjnxsotssyywxtvy}xonxyt~}ifmlowyvx{tpqrsuwohnohjqklsmmq||noootuvyyvypjtwpnpqppporz}vxzi_fijkilliquiacelssvnhfmvrtshfmtzuonnpnkotvskhlnpqhdbiliegkjieepkakkfqwtqfaktportrnoplmruwvx{||zu}~zz}}{wyx~~vz|rt{n}wok}|nx}zuyd_cdaYhokhqohrvxl|}~`|bu}yxtwodhutwuohvteqxzo_bjsr~{}xttduidsodjz|ww~uw}yvwt}vkptyrlt}zxx|t{~wt~whtqbxz{ifzqr}tlnprxyznwpz~v}~yu{zoosqsvv}qztszwQXcV[kjQXXQVm\^ecft|vehpcxwejv[\urfc_hshfb\[`did``gkgcjleefqqgbqp`flkbhg`Y\aPetrntrb]_VblpvqnlknnyxhR^[YhrpnipicbmeYXmies{xpe`hgehbJETOZptxoblrq~x}{|x}{}ysy|z|rwp}yvrw|ptwzgfexn|ieWcq`^cszywxz}d|hmnrktsq}zpcXg}x~kp}k}uvj}yqrtx}g^mcigx|\W\[bi\kZZZJRfryg]f_vaosqjnnt?TfXastXWmpYMY`ZWhSHNKYdRPKS^NYtXTVbukndWecWSMFA@AABDEC?DMJFKLHDCBA_fdXQPUbinrtlihnf][dijcafTRS^hnpe_kbYWXb^SO^\Ukp`^QJFISkq]Xilcpq_XUWfi_g}n~wo{~y|dt{}xy|{swnmywi{ymtvphxt|xxiixdzztlnnbRKjwgnam}mfcbejlr~cn~mpl~csxyyzzlytvmt}|xn}poj}x}~~{{yn}{~zwryxk\joRQsvYL[g]LG]lbssepum__vmbbcmXKdxq^\U[V]ibjiU_uc`vod}{lnkx{pfhsszu]`fjrs[bukkhmquwxzsduxzsq|ynwzx{uqv{yrpoptw~wy~{}zvwyz{y}~yz~y~}|xv|wttz~~m}nm}~{wut|kqwwxxxxy{tqsja_^enprpnko|~rlihp~|}}||xvvvx{~}}z}|xz}|z˿½¾¾ǿÿ½Ż¼GKMB57FMFACEFHPOB9;?DIHEHIC<:=@CCBBEJPPOU[[ZWUZfgegg\W`e^Zgxm_hlghqxu{{yuqioztorttzxuwtv{~ytloyyt}{hiolpw{zz{topsuywijphhnpgltkkq{zoollqsuwxxyjjzzllqsrpppqvvquvh_fijjinmjvzicgiovurjnlpwnppffpxxposqnlkrwtqljooqriglunfgjklkhiri_ijgrxtngfqwqsyxtomnjirvqx}{|{sxxs{|z|x}}|~zwvv}|{xzuqtsszuzjxyoktexyhp~|ryd[eb[Winmhs}nz|~|nv]{zmzx|t{ztqfkqmvrgdvwfgr|o[Zdrnw~}y|tqm`t|gang_hxytv|xuyy|wstrx|kksuvklxtstvrz~}qvvhrs\s|whbuppzskmoqyy|mtky~{zz}yw}xupnklvy{u}zxwwsqpohMY_TZf`LXTLUi]ccadtuibgg]|rcbv^`yvabdgsjeh`_hjkifdphjkljed]beb]hr[`dkdck_\dcRZntuonfY_UTdhwtrohdfu|sUVXPlsnqlpqa\kcTWqg_nxqldcmekuiOS`Te|z{rhtwr~|}ux|zy}}vqx}x|uv}sti{|~{zlrykouxdffsqx`cT^jZ]cqxrqsvwexcqnsfqqrsl`agz{twvexzu~zju}trmy|rqm{mViahfo{dXSada[iVYZDOjlj]a]gq]rrflnvo_7V\OntRbqcQX^g[R[GQNS_dTRN^gQdgX_^gsimc^omZTLC=:<>AABDDGLJHKMLJIEMf[WHGT\ajpqkcggeYY^fjhfg_URQjl|hecnic_Va\TP[_Vh{y_ZLHDDKeo[Sgmbmo`YXVfpjkwwzz~~o~{~{vtdw~|wy~tuszi~quwrgxuz~jhnwz{qvrlYTrwkkbymgjeninxwbuwqonym~{u}u~qdtpkktvyvll|hln~|{|ywy~{}{y{nyz}~y~rqyzn]llQZwpWOW^ZLFaoevwmssrb^zmddemVLcws\[W]Y]h_dcT]macshb{vjmkz{qlinuhW`kmrsWi}gihflpsstsfjy{xnsupotopvppvxussosw|}~}y~~~}{}}ytvxxx|{v|||vvvz}z|}zttw~}|}nvv|zwuqu|rq~{{}~~}yzzmea`mvuusqnxytpnkx}|}~{wwvw}}~||}~~~ʾÿľ»¹ƼHKF849EIC>DHIOQE55;CJHCDIH>8;>@BBAADJOLKU[YWTU]cfggaWY^`\]mvfdgffiswv|}ywsoiq|umqtv{wtvrv{}zwpinxxt{xhjomqw{}{{torswzsimogjplentjkr{zqnjjopqsw|zhl~zklstrpmllmnovtd^fkkhhnnoxwhdilszxpkolpqinpeet{thlvrljkrwsqnjqstqhk{}mdjlkmmchvg_kmjswsmggu{qt|xwtmljirvl}yzxsrz{~{s}wtxu~{~vy}||}}xx{|yy~tym}~wjvrvjfjbvwfg}{pydWfdYXkpvi{|zxrn}^t{~zx}xwptuerresqc`w|jco|o\Ybn{luzyztwrof_txe^h^[hyunruqwwutrompowz|hgtswqfpnjkszn|{snogp~uZl~wi^qnlxqiknqxy}nqgy|vwv{{z{yrolajzztpwtkonnjd\LXXRYa[NUQLVg^bbbcmi_`_][{k_\r]b{u^abcsghrbcqpophoggmnlfbYWVZ\]p`X^if\j_^hiXYhqwukfVWZOZ`x|tsqh`_n|v^NWJbqononweWkbOTqi^kvkib\kelraNcl\oy{voxyuzytx|zw}{}~yrs|xw}rxqqxupczpzyz|gqxdgst^dgluoX_TZeZ`aowjmop{ojp\rnqfjot{lldozmuuoqlfzwxhly}fkw}wrpqnusQcdnbh{r\QYiY\gQXYEOroaY`Xio`mhelmnqN;ZXU~pOneQUccl\TSM[U]fb_aShlTk`\ehjqjk`gyoOHJDABGG=@DDAGMICGJD>DRZ]ON@MZ^bnpi`]if[S[dghdhaTTV_lndi_opocWb\XMY^UbuudUIG@?JcmVQakchhdYb`gpplq|x}{vs}}y|zxp~kkzyt}uz||i~ruwrjyuxonysxyuuaf|vnyhxmntlzho~{un{{oot{vo{{v~lniot|cksz}tgbqzikx}xywzvvs|~x{wzmxz~y~{yooxwn_jo[avnWNSVWILemnw{owzukbz}kcfik\S`upZ]`g\_g[\[Q[g\dpfaxsklm{{qnmjucRcsnwqZpr_jfcjooojg_xq|wlrspvpiprlnqruwrosxzy~z{zty|xszzvyztouxwy{xw}xxttru{~{|}}~u}}vtvwy~xyxzu|w|zyxvorzxu}tkhiuyy{yvq{tqss~~|xvy~ƻÿļûȾȾEB:7:?LMJPK919AKLCCIJC75=@AABBBGKKFIVZWOPYbefgcZW\]\]bppdgjedmtuyzuuqnis}tlqvx{vrrouyxwvngmvwsyvhjnnrv{|yrotuzxqkpnimrietshjr|xqnijmllou|vgp~wkotvsnjhhijkwq]]gklhgkmqwqedjow{tpsnfkkgnpfguynbnvmiilrwtpljuxumhsykiommrmbmwe`lmjsupmiiw{oszxzyolnltts|r{yqos{z{~uv{~yyp~tt{y|y{x{{z{{}}{~lxyxhpntcecbtti\|oweUhfV^ozk|}}~wvjy\q|}|}xnlrufumdvthc{ohqzm\\`h{vinwwrwtvpi^bvreZ`WZjztjnonwqmnmjilgnvwdbtqtvchidap|fsx}vjhgm{v[g|tfWmlgtncalqv|x{nog{tqrqvzx|{upohct~ulnxv{ebejle[TMTOPY_ZPQSMWd[bbieb_]]YX[xfZ^iWeykWXZdk[mzbhysurj~kkiloih^TLQ][gaSXci]agcar`Vbkq|rf]M[TVYhqpomdUbzvePQI[lnhlmxlXffTUljajrfd]VefnmYQnv`ixx{yqttrrus{}yv}x}{vntxw{syltmqstg\|gqswgqwa^opWbgjuiT[UX\\b_qugjklw{jteXuoqj}forreonxwuppepdpvsve_nXgq|x|~qrll|uO]hy^fx}gXNkYafUXYHXshZWWXclcf^mhholRLdUh~xgTmYLaiikbVP[]\eihtv^qp[sadmtnwxqchwsWQYQIW`QAGNI@FRHCXUD?IabSKHDV]_jqj]V_m_X[cndacbQSUcihpygexzsaZk_cT[YW\rplUHHAGQL<13:>?>?@ABHMPMDCO[`ccc[USTX^`doj`dda`ablvywotspilywnmrz{tpnjgmrrnjcfqvpjljedbipsvvtrkkrsrnnlilqug^~clqtwtnfbdccirsicpymelpllmjheeehnkgighjkga\bjdbbbmxyvttvk`hjgpndjoicop`b_bplcisrsqfagzsvxvyupuuw|{ompryujjnmifgkrxysrttx|vx|knskjlrvz{yyyxwxymow{uosztyststwmu}zv{macoZv~pUjvm{vnUcuwvkq|quyypjox}zvr{m\jcqz~|zwzqrqmsqrxf}{morlqr^^Z]fofV^ve]rojdPYomg~]ONQbsiYXYhk\X[[]]UQUV[QP`am_M^hgYjwktyytm`hkrgTgqfkx~uS[schnURntnmqsvegmp]fh`qtrornnnfkemzqpxyyrji]RZZ\UGTSRgZMLFWXchxhyhirixsR^eddURTSZe^lWHCJPf^\_br{tnq{gcnnnlcw{eZhk]ZZ[\]bdfptlf^ZZiklhfR\a^PSmxk]^kdNSabWNLRRW\SP]qt[SVYZ_eT\oiQ@BTTQGUrgo{phtxkYYbejvyz|}{xyy}xyzqvzz}wvxv{qhpbt{ohbfj[e{jy\NudZgum[lm{xoQPXg[WbphHDEWqVcfWhaRV`cc^qeKavqwx}hwswc__inz{yptocYt{nx}p[ozn{mOhZjjKo{xkocnfrsfk`UIbr]eZgifahjssdi\tx_ivsrttpeS^|q|wyyzxvtnvtu}{q}|{wr{zlropujjqv}ummyytqnjrxmrywvfnfjZdZipYZRZjcdfafbjW]uofookouol|ticl}ukpqwp\hz|~rwu}yqamjVw}}vsmx~{}}stvlozzu{~xw~v~~|uw|oyvs|tlxjjmomnm{yanddfOYwxpunk\u}v{~is~u^gzpnwr|unx{ztzwwvy{~oklr}wo||nnso\NUanssvx{~spl`e{n]fsnfgfjulj|~~orrkfapz`c|vvxhq{|htwqwzoq~}quugkrik~lhxpqmgmploqqwzxyyy~vmmfdfsx`Xehkm_\ddpxldfcd}pVk}jWgqljatwdppYZ]bs|k[dtrhiz}{yywtwrvy}zuv|rksbzrzux|wkotq}žźĻýýſº¾ŻVUW[UPOMJGC@DHGFC:6CVJ3+07@A>><;;;<>CLNLE?GX\_`cbVPPSZecepg`fb^^_cmyyuptpsglxuooryyspmhfmrplgdhsvmgjgbcdimprrrpiinqnnmhiorsafqeprqurlgdecckspgfsshgkkglokfbbcikgopehljd]Yah```bnyvsussiaiigplfjicdlg[_]dnfdmtppj]]i~zrytvztqux|zolt~|ojkkmh_bnrqolpvx{{u}|joumjkptvwuuwwvuumq{|w}}|wxj{}vt~lnxsrl}~{~xxusafoap{wvUiqkxqk_U{w|l|~zx~~sl`gyyurlzodgao~vxwrw{pvvjssocxjilkpsZ_Z\enbObw^[qli`L^ogdYLIR`ueWQUfhXVXVYXQMNPVOP_ahZJ`kjcp|gl{zomcelqfVgtjmz{yYTtiepUTjmkhmpu`ipjZee^rtuisxgpgcnenzrnx|xmlqbX_^`YLYcZh[SIPe`ltqr{rnu|kUl[bfMPPU_Z^kMFEJ[dTYaiuwnio~xkkkmq|~ihwzkemwi`dd^]hlddmqgb`_hcehkYWi`WJ`rj^XedVY_b`MEWQT[OHRhp\USU`bhSWjmO=>IMKEOj`}~japykUR^dg{t|w}|}}zxwu{yuytou{}zwqpmr{uek`ixoe``iW`{hu[LseWgtmYikwvhKMZf_W\ohEDD`wTbhZ]_TV^a^Xr]LaunpsziysvcY[ttprrxtqYe}uspsf~l^jVds[pzwslcnxuukpa_Wdqcvblmefmstpi`m|e{xszptqp`M`{tx}~{zmy~z{{zzsyzvro}{~~yx~}|{}voix~uv~ywvkhogg\ow`e`_k`fm\]_cSXsskojouxqjwqgeo}pvrswcj~~~x}yyvxho}m\{x{{ioz|x{zwqpu|xwts~|w~x~zxtwm|w}jgj{rcpfo~m`j^jaM`~snuynev~u{xkq}u`_xnd{oxvjvwvs}{ywzxx~unps~y|qwqtg`ipwvuww}}soojbfyo[gqniilpuot~~rszyxs|ge|yzkrzlzt}||wsuy{xruwqx~lu{mnlfjplotw{z~zskrmmlv{`Ydagp`Xacosf]b`dxfXpwaReplfatl[niVXWdwyfXcsnfnz||yy}wvzqvyx~rr{qivcqtuz|quzu|}ǾݼĻÿǿ]]^[PR[XLC@BFJHDCDEQQ:++3<=;<<:899:?HLJD?@Q]]^`b_SNRV`jcgrgbh_\^ahr|zsrqmthlxsppryyrqmgekppjdektvkehebcgjjlnprpihlkkniekqro]mihpootrkefhcentniitlcgjffklgdb^amjgvqbhni`XXbe]_`dowqovtpgcjfgrmijcbdkcZ^]dicfptmkf]bnsqunrwsrw}uko}xonhgphZ`lmjhiqwxzwvxipxokjptvuttuwussrv||~{nwwx|ztwpj~{zqr~jkzxonz{~}}x~~zzmxbkomvwnw\_nnnveoUs}xswxjkZ^wvnkhzoygc\owv~y~{swoszxpx|mrypanibgxnntY^[[bi]MguUWohbVKdmdg~UJCSbx|^UMTdcWTVQRTMFGNSKL\`cTJclnqvda|oe`elpi^hvoo~|x_Rqpht[Xegienro]ordVecZwnnfxperbdqak~ywmgw{wkqygalhf_Vgnfka`Oaqix{lt}i~|bfhXi_IMNW_UddIFEMdYMVckpnihnwzqpioouwhmz{rnl~xljlgdmrkdglhecfnb]dl`Ofd_KVil^Q[dXYd\hYAUYVYOAG\gb_URfjiWRbnQ:=DGG?O`Z{cbovnVK\dg{uqzs{}~{{|souvp~oouyx{}slkfoxtdfa`spd_[fZ[|moz]KtdVhqo[cjtt`EJ`ka\VkkDAFdxUbh_W_RX^]VQqVNfqijkvmxwt_QZ{ryljtwlPrz||{tkztqgUgznsvxx}mhmx{worcjgjjjlnuhoq{xwkgm}hukqktor|aM_tux~ww~~yv|{}z{w{{u|vhr}wuy|uwfglgpakwhlifk[cuVRZ`U[tuoqhs{wntqilup~txmf|}{vuzpqw~rg{~u|{gqz{{v{}unt|~vy~nqsq}y{{jz~~tohx{^hlgrvdab\m[Mipjuvpx{~u~~}wkp|ta]sl^~pquessrp~{xuwv|~{tuv|tv~ouowzzyzyx}zrrpmigvtdouriht{wt|yzokz{pzwr~o~vxz~~}}|s|vorqlkroqy{toxurp~|_^f]eq`U^cmmaX]]eu^XpnWNbmfaeraVneUVSh{r\Ucoiequwy{{y}ssxv}ro{pkvdiuw}vy|~Ƚɿĺź¾ľɾccc]W]aUHDDFKNMJKQRS?*+39<99<96787KZ[[`a_\QOSXgj_grfdh^[^clr|zsrpmuhlwrppryyrqmecipqg`elssieeaacihhlinsphhigjnfcnqolYjkjrmorqiciidjrqljjqf_cebekheea\cljpzkblme[V[`[[b_boslksuneejejsmmi]_eh`[^\cdaiqrkhc_gv|orphqvrqx}olytroajtcW`kgggiqvwwuztkqxnkjrwvrqrvwsrsw{|ywqqstqutqtkn|{z{|xplr{ljxxlnty{}w}}}z~z{|xs~{kwcqorw|htfTgwhvbvhpuwuv|{p`bZVorfacxjok^Xlyn~{yz~vzlntupxrn|vu~cfi\cprirY[Z[^bZNjoLTnb\NLjici}tPICTd}wUNHTb`WUSLMPIBEMOGI[c_NKfqtx{hVxz]Ximokbkvmr}veXoqkud`bcdeqsjburaTf__xtehiwgfs`ho]lxusedutrlvvdpxjigiotipjj\qx{~xkx|gwdydhoYNKRSXTfULIMY^RKUelkhhkp~|lnnmlswnryuqsn|sosrmrqmgfdfeehum\XdgRYfcPP[caPPdYOf[ddHR\\XQ>BS__hWRfgdaUZjQ7GEAF>QXX~bgnplUK^bjymsytz}ww{{mmqqjympu}vs|woigcmqre_c[lucZTcaWytis`KsdTfjvr]`glm]CFbkb^WerC>Ff~^bf`SaQV[[QLpxYObmefhopru~nYI`zjqk`{|w^X{~w}nw{}luk[djyw|sqivxsypvljhlf~xq}nyv{w~lplstemhqmxufN[myv}}}ww~ww{z|}~~pk{|rx{wyvtcejhsijskpfgmYYw\HRZX\v~rwi}~tsrnt{twvvh{~uuxzxomyzw{{x~~ndrx{ztz}vrxx}y}wktsrt|yz~}|{sxvu~tn|c\jcith]`X_kZTp}zojw~wut}wz{~zik|vc]omY|sorarpll{|vz~ovpz{}y}wlvt|zxy~}wvsroiu|sz}shqu{~|o{~{y|~o|zw}xwx|upvqt|~uv{wq}chi_ftaV_fmg]V[Zbo[\shOK_h_\lszxWTm`TUPm}fSWeideqou~}xz}z|upwuxtn}pnrji}~y}}}½Ⱦøƿ÷½ǽfed`aaVHFIMRTTRQQQRG1*3:;;:<=85249AGHFAGcdPAVwyyw\hmcmrokdu}lvj`yvgz|gfgjkmvxmvn|w^Vfell\XdsgXeoegfbqmlfYajhnqsmjzdipwvskmvoqxoqs}tho{}}tknm[]\SWUX[k]V`n_Jbdfnpnmv{yxnptltzrvswrouvzuvvsqtoihfefckpd]RW]W`bYMPXZ\QV[LVi^gaSS`_\E:KceTgmhd`f_UYM?>:716;IWOQ[QMDBHG<8>@AUs^KOmw{sxwi|wqtkfo~m{rgqwztnmontvstjwt^bmj_XTUdeYWake_`hke_YV]]ck`ijmwi]onnlmmgjpmdfoujehnt~dgtn``dc_ah_|j^uXTtojrrmmx{zsovuwzzv{pqqrs{yxotxlqxykllliklh^_eWDX^_^LHPV\ZTTQUoe[gTN]^o]AF\j[]hv\_hrVQPRUPTRSJK_rk\[XgcQS^rwlc{wungQk{qlYjpqfrqv|~z|vnyug^W_klf^P^idne\SGY]_n`UWOly[LWQRf^Uc]RZ[ET]`qbcnJTglWGO\aeZ`^\o`LFUeaohPqulougqlcocxygqrrjotvuzyz}izzx~pqrsx|xspywtzp~x~~tzzx|zt{}~|{z|y|{{pks}kdn\mhYQce^`c\ZcbN^pr~z||yz~{zpv|thjutejvt[Vdipoijoic[Zcyrhdqzkuty~rwjm|fe}y]leetahvnnyrkorqlknkv}|~qoebjg\nsctn~qtsifmvulntyv}cenovieqmwvavr[eslcdcdazgtlW^{ocdq~eqllvg~umiz~{y|~vx}t~~~{~~~v{}~z~|{u~{wyne}b]pcXZ^_^hwj\LLYWOjybjpQQ\IFYnvZQ_^\YdiZe}tz|rsqyulpokkodwyolossqwyûÿ¾¾üƿ̿ÿĿbbbb_adehkgghe]ZYZTJIHOHBABACBA@?@?EIGIQSTUZXXYZbb]_rm^fproh`]aahmoowpfhe^mrnorwyoega_aeni_[cif^\^]axo_[UZemic`]XYmi[`dgi\Wi{pcachog\_mopndigkpaZ^`caWY`]]_biosqkegldX]gXVkeUXeofZ`osjbeafvmlucU^aWW`\Sckekh_dpjchfci`cpnrpnwxsktx|tmzuggouxtmghmmhhntskhomkjmollnnnrxusttsssqqqqovtmlmmsxqpkrphrqlmnmkpmo}{wnnkjjq}tqow}uzy~{}}z}~ul|}zsrl}|ma{zrostqit{z{v|l^tuvt}prw~{~}xi}`g|xiqy|pQ8OZVZM[ehej]MWbyv}g`lrgZdwteifb\Qd`GM_ol]bZQZaVKMZlYB]eKL\ic`eowWBKZ^pz`D9Q]MU^QRJBFF<>?Dcv{hYQVKhRNQAV^aMENR^_X]U]lRUS\fevjTvmjnlizcbhgwldoqvpbx{nkwz~{uwurmuo{|~r~tnulxv{}szyy~}x{}{|~xxz~}}z|visjvbijXZhh]aicaZh[duu}{|~{~zyrtwytfgrschts[WcajmdimgaYTcvl`^logqnu|qsimw`d}m[h\fl]ipkvyeq~xmnofefdwxx~}|}{znjol`txg{u{srqdckrqjgmxvxacpovgeohst^orZanjbcbbc}zeqjV\ulagjhlgjwc{vfd{y{x~{xwyq{}}v{~~}x|~}~}|{xz}~~{z~qkeTiiZSZc^d{jXSPWQQos_hnYRUHDWqnNT`[YYffXn{sxzlfk{uiomfjmhvzolmrvz|t{¹¾Ź½¿ż¿Ž̾aaaccbeknjilmg`_ccXOTYSHEOMGGDA>>DGLLKQVUTUXWW[_ge`bui`mqrph`_cbimnnvobdb`lpmoswxmcfa^afpi][aec\\^]e{n\YTYekfa^XTYpgX]bgbZXk{n_^cjlaY_nnqjbhgon]X`ce\PW`^aaaissjigghd_bdUYkaU^hiaYansi^bbhtjmu`Wa`UZbZVglhjc_gne`gcadcgkoqilutokx}vro|sfhurmhmslefkushgokggnqkjnonsyutrrrsrppqsowtlmlnuupnnoohtrkuznqpporvz}hhjrsxynlszuyy}~w|{z~{{ttyz~{wjvu~|{{skhyqd}vosolw}wtynbuvu}~yw}}vwlfZswlds}zzpO=\\ORNgfcam[JXg}{xf\fqiZ\kqebbbWPd^HO^lkZ]\X]c\KQ\l]Ne_FQ`fdddtwPEP_`pz]<:\\I]bT]QCEE=C?=V`r\Yrw}vztux~trxa]{tp{~yovz~uusrrws{pjxphql[RQPSYVOUehYWdb_]UTWRRiaY_lnfc^]b`bj`\di{d`gphRTeoyncdexm`flfaiofsqipwd]shgqignt~}wyvjrxpz{{lrffijk||trnljxxiokrpovqh[]`XTqk`[FEQWfhWNXyrW]iQJT_z_SC[b`xpjfk_ZWSTV|j`LRfj[RSRc[OP^zuglusyjSDfyzh[yhigoky|wz~u{xg_QXbjf]Talabad_X[WYebRLQjnTOKGC`hO[ZQTeaQ^bsb[gYCFamokdPPHgULIIZVVIBLJZXTYQ^gOYkjjmzm\whdf[tzYedr{wzaaoryufdzdiv{|{|{gij~r|}uiqhstx|r{yy~~}y}vy}tuu{~y~{r}sxrimceywbfsin^ilq|{}y~|~}~xsrrrqeeprbirr[Yb]gk`gib^XRapg`Ygd_ignvmigon]i}}b`bWhb`hmiwqhy}enii`bYcxnr~{t~ztrrozp}|uxpmfcdqngfiuuu`bvqwdckcor]mtY_jhbcaacsvckgUXqg_jcmebjv`{u]c}|ux}{w~}|xwvnt|{yt}~}}y{{~qsz||~yup`klZO[fdb}sXYUTOYtlYit^RQFG\oeIXeZVXhc]wzpvrg`g}vemjbhkkv|nkkry}{z}¹Ŀýĵ»ɾû̽abba_bmsnknqlhffieZ[ebUT\VIEFCCFKRTNLSZXVVX\XY]dlgahshhnostj`_eeinokto`ba`kmmnswwlad`^`gph\[`ba[[`_h|lZWUXchc`\RQ[reUZej_UYm{o\Zbii[Vcropfafgql[ZadcUMW__cdaksngjhggfcaaX[i_Uajf]Zbnqh]adkrhpt^Zb^T]cZXdkih_^kl]\d`]bfegpmdlrpmkw~xx}lsrgo~}somstiadlvrgjqj`dprjhnomszsrrvronprsqrzumnnruqqnmnnmtsmu|pumqsolz|i`pvtysmqvw{~{ys}wv}~uw~w~~xontyswzz{wxzi{rq{yvyz{mdz}o}kxkz}~~ywzpntxv}y}x|}up}wlniten_ezvn~zlTNb^QMXn_dluWJavy{|zhYanjVXchd^acRRc[MR^kjWX___gcMWamc]m[HXfhhhevpMLV`_ryX>JkaOgjYd]LJJ?E>Cflmgesxzuxvv|ysrsa_mnz|}pr~uuxrov~t{~llxqsvgUPRQPPOKXg_TZ_[^ZUUXPPhbY]qp`^]]``cf[^^ns[_glVIYhlp_aYisj_hn_Ygqdqtikmc`la`peeotx|uvxgkwoy{ympf`chdv{oplklzr}hrirrlysniY\_Ztil[]HUS\jdQJqy`Yq^GQ`wh^NIvelqvibe_^TNjj`WXeeWPMRcUPRdytlmoqw`GAexzgc}djfmk|u{zz{whaUV\ff^W`lea_ea\_ZV\c\OPinUOLHG\jPVUQS^kU[ereWc]JK]dckmMFGjWHBQXKRLAEGSTPNUed]]zosvmbsad^J{{Rfbxzvy]`tywsbhxbkryty[lk|mw{vhmeq}}~st{r{zz}}~w|rq{ssxov|x{|pzuornylunhx|q}z|}yrqomnedpqcioq[\aYek_eea]UP`mgbX_Z]c`hombfng]m}s^e[Yj\`fhjqmry{w_mhd_\Rjthp|ur|~vvz~w{~u}jnga^rkdghurs^f~zuafkepoZlrT[ie_b`_bipaidVXqb]j_qa_kx_}tXhwnwy|~|{~{wy{yytjnvv|ur~z|zt~wwy|~xlnvy~~~z~|rro_Zfjphx~\Y\TQewhWixg[PEOciYF]fVSVhkmzunrlc^f}taghafloz}nomtw||yw~ſýôú¿»ſ˻`ab]Zgtojnqnkihiijhmlb_ecUIGJLPUY\_ST``XW^daYY_hlebnqgjkmu{j``eqjopip}o]`_[glmkowwk`b^\`gpgZW]`_Y[bbfzkYXRWadb_WKP_qdRZil[TZn}pZXae_UWfpmncbcgrk[^bd^ONX`bbadooigihhjjda`Y]iaZcke\\fnne]aekqiss^]b\S]bZZbjid]bogUXb\Zeg`eogblnkmltxrtvlgxqmxxrpqskaalwxnjro]Yfsrhgmnouxprvxpnnprqnt|smoqvtoqpoonoqtntywvttxmsyz{|pbevwtsoppwy{w}ty}rsz{|rs}~t||}ynxmlxtttsrrt{l|sqwqmy~~vl~vllw}yoq|wr{s}z}st|wkq|phyvs_pxbZmmtyig^ZmRQbj_uvOMs}|x|{sy{f[`fkUSabaW\gPOg_R\_kiUVafalgScfpmhs[K`psiglxgMQ[eartYM^xjWovcmo[KKJODQuqgqpq|}nsyz|~unoqb_||klx{{lo{xmpvqjwuwwbowr|v]STUPLKJKZ_XVZZ[^W[_\RQljZawi_`\heca`^]_][^f`HJaghbWYTlifbgj[T`kaswehcagdY^ncgopqzpuwffqv}yxljd_^g`p|jjielwiwhrejnhytsv^]ecvpo_^_\XTbk\KdxdTmhKOctg[YIv|okixt]gbcXRxgc^Zdh[TQ[_KWYgx{lgilpV?Dftufm}eibnm~}qzrxjge_\_e_\_klg_bfb^_\]dc[Wfo[VPLNWcRWRXUYk]]aqeU]\QOU`TckNBEkZD@YTFUPADFMUKQjpsdnytsliq[cTPwySiey|uyVa}uo`nreno{rs{{z}euvx{in~zjieqyw|~ypqyr|z{~|x|qkzoro~isz|}x{{|xysys||~l}x~z}}yrtnjkbgooefop]_b\gj`cccaQOchbkYWW]][aolWfp`]m|j^jW[i^bcenluywxy}lekk`]Y[qijp{qv{~{|y}xzdphcaqidffspqZrrdokkvnZjpQVha\a[]abi\fdX\s_^lan[ao}`}uVnuzjwv||v|yzzsxwuoohl~}povqs{uw}m|vos~vontxzwz}u}y}}~zqnmprut|m^e]\mvo]hrgZIVggVKdfRRWjyytoosh\Zezs``fdemt|twpvv{|wr~~x}~øŷú¸ʾüʸ_`_^dlnijppoidfloruqjhibWPQTWY]eggd\bg^Y^ji`Z^eiibhuoiijmv}j^agvlpphkxnY\][cmnhktvmbb[Z_fogXUZ^^WWfef{l\YNV^baZNHUco`P`ogVUZnoXYbaXT\immkabahtjZ`fdZJL[ca_^gsmfhhfjmifgaV\if^cje[_illc[afkoisp`a`ZU^_Z\`kl`[gk_RW`XZii^akcckhglmrsnqlch{}stz~}wonnlhhoz|pmuueYcktmceklptqpx|vooqrunls~qkosvqlpqpqnposnptxyxwvnutsstxmgvzs{wqpqyw~|q~{quwoswuw}pq{z}{sw|{z|||rwjfxzpmkkjhn|jxwzpnsmgyywpw{{z~unlfx~p|~z}rry|phvwlpzq{SrlX]x{bx}~t~c^lL]gjppJSvxz{zztwsxmb_a`i[Ra^_U\lRJij[bdogSZfjerk\plywpwXQk{zjksveX\bgaovgaps^uosuaQVZ]O`wo{vp}{kw}z}z{}qmopa`|xegwv}wilxqfjqjdvtyj^swt|kWY[WRKFHQWWZWW[^XUcc`VYtn]otejd^pk^X_`XuhW[^cPDSdd`UTMXg^cigaZRRc`sq^f`[e\R_l`glliumwviim|vukfa^Zb`nzfedbapdphpbajgvttydahjn{jgXig\[[lgU`tdOelXLdpiYdRozqxioy]cgd]`zsji[Xfma\Y^RFb^i}~ef{_ikM8Kkoogt}if`on|p~zk}{kjpng`ba]_jnmeafh`[adgeechoc`_VUY`UYTd^\de`YkbRUXPMX]JWgRBBg]D@\VHZ[JEBPe[p~utx|xskolScYUzvTnlvztwPdwibppiqlw}zs}{|~n~u}z~{z|q~qrx}pifwz}}mdeourz}molvpyyxwy|{}z}pbukoi}cpvz{}|r~}~~{{zzk~z}{}~ztukgj`hpkghwtb^cdmicgihdQTnebx^YXUTU[scQlmZ^jxdhqV]edecehqzutqzjljma_anocns|q~~{v{wverjggmfedgskm]}}nnwot{q\foPQc`Z`[]`bi\df[cx[^rdiXgwf{x\swxjvtz|~}t{wsxuqxutiiei|zliqovys~{u~hywlt~{tuwyyx{~syw||{}|xwvx{z|thnpnsv{gjwspZ\lhXWkeSSXn|ompsh]\g~|f`mpfkz|r}z|yzyss}{uy}v~¼¼ȾŸº»ùɼºǷa`_ekjhjmnnmgagsvrmjlnfZWY]]^ahrskfjlc^djni_afhijirxmiijltzi\bkyprqfgrlYZZY_oqdfpundbXW_fneWSX^^SWjfi~m]YLT]b_SIKYfl[Qfp^UX\p}iTZa]UWdlhlf\`cotdZdg`VIL^b`^ansighfcjngjl_TZikaahe\aikmd[chlnksnbd`YW_][^`ln`]geYPV]UZhf^`ecehdeknpoplcelx{stz}|tjlmouy|}wmt}q_^mysebgijmpnu~znmruuwpkrzrlqvwpmnprsnomronrtvxwnwyorpmzvsx{uy{pmqxsyps{ylov}}krumpznr{uy~wpuyyyy{|}y}ihtzqhdccbi}xero}}rkilkl{|~pwu{yrul{czju|yumsy~rkhuwqutofOsw_P_~wZ||pYaeIigpfKa~svzz{uxqqqqvd[^cadbV\^_U[qXGevfgiqcUcnljyrjyvzvwUXt~krzxmf_ejcq~vswjxuvwe[dkk_q|r||r{zh|yw|wxwliom_bzv`cumushktkefkfbs|ruv_`tssr_U]^ZVJBLZVX]VX^bRZn[f_h|pfvijw_bsh^VgYanY^Wd[DD^a[WLLH^\Vdqd\[OO_]lhYe[W\UN_f\kiearjyvnqm}zrrkcc[TZ_nyeed_U_climc]ggmrvvhhgjiyje`ijhm]ekcbmfT\ccP`ek`h`ntq~ocs^YgjejukpkRUfqhbZWISietx^noZjeC_jQjo\xz|~}{~{esryfwpv]cY}lz~pd}fsfq{k}xp|jsrb}vvjksujob~v{wahurvwnsrsrlx{wmocu|qsv|zxnz{w^bq}zw|rv]Zibojryvudy{`bqmeirq}tor~}rmmnkc\c^fjhq^_ej{zp~{{|uyw}}~y~uw{q|vxvquxkcpit~wsyqwst~{pmqrw{~phdd]cw`\np_`]mlkv]lt`fi~zo||kilvx}|{uy|y|~|xwulpuqifbgniimnxw~ujsg\`afguuk`sov}|um~|~~~uxw||sozynslh{zdktjuxvx~st}kv|y~~s}~~y}~wny}wuy{{||wrvxz~|ymnsxpdd~|}z}sz~z{z}~~}|}Ŀû¸Ľźȿcccddekqmd`cfhgdccdgd\^degiotxussttjdluywrqollnsyywohilkmuvgeplxyhda]hkZWUQWtw\agkldYNR]hi]QQVUKObqgmf^WHQ]aQ?BR]hhYgpXPYZdqeQOVVUU[`]ac[\dgh^[hh[XPMYec\cpqkkjf]eggrk^X^msf^fgehjhknc\bfipvskih^Z]]Z^_bmhX]`[PHOPQY`b^[cngX\cabda\UYbkvvqt{ufhjluomrupq|t`ey~tfafkkdewxtsmmwyywtqppooosrnmlnpqmkjpsqqgkqssqrzrpmltwxwzzusukipppywpvpry{|jkvwnp}j`nd_honrxo{sgowwww}zrhq{xmrxusiWTT_kkX^meZjhhe`iu~|vz{zxfkzzwnkvx~fpyuls{thvm__pxxqtsfhv}zqxr`Rgpummgr\ARpYFNjqKOuoozwej_^_lyqZtzuqpxz}zxjgoulbniilehrd^pa]iamrhYe~tzuls~yw}{~kdnx}{wrhuux|y~|}zhkzwqrrszvk_gqhpoeqo`\da`aokV]gYmtgf`d`]g`acdkk`XWbb^a^WY_drkO[pecqpfa|haptj{wsrrq{o[|uijp_ubajZ_R<;_]OE?>;OOXcbWZTZULLRfaNZ^JNJN`Z[vj^anl{t|vmnlmSMNQ[fvUYVUHLP_mdbSSWOXoe`_`c_cc[ris|u[_lbdob`a[X\efhh_lzqqtl_XVWkd[\`mfMSapY]WUlzhlii~kRgcPHbb]dtsyg[c\mh|mbrums}qhtywy}}|{t{{pzw~sit|yxx{svl]Qn{iml{hNM\NNik\Opyovu|s~w~ooswps~]cZyfspuuwjjzlxqsovulb{uu~hgpthy`nowmdajokzgnikngtyucjdn|yrp~xzzqyu|b_hw|vzqq_Vi_fgoxqrjwsZapm`hos{{}hlwxjhjibb]aZagcn_Xecte{zo{v|xxyxwj}trsmtyocsoxzst{{{~torsxmqqkjx{bnypcgfuwysexoinwuv|kcqszxr|x~~{v~x~z}|wiqytjechlemtvy||}zmwthjkqpyirzwx{}~}x}zur|~vyuoz}io|pwuvt|tt~nv|xx|~w~~|tz}{yy{||{xtvzz|~yuu}}vnk~~ÿſþĿ¿üźǽ»aaaceglnc[_hfc`_^_cfdbcfgimqsstvtokhltzztssljpsvxupiejkjnvsiqqfw}iaa^hl\UOKWzyX_dhjfVJP_jh[PQTQJQfrgn~b]UGP^_L@HU^gfamhTT\\gk[LNTXYVZ\\_]U]fgaZ]gaWQLQ`jd\fqpknmc]efpsd]\boobaeegjhekn]Yddgrvnhhf]]^[[``akeS[]VQHPQOWbcYWeodV[`_^^\WQXdovvpsynhmgksmjnqryxb_t}wmfhlnkgsxnqojtwxzxrnmnoqtttnjknqpkiloqrrfkqrqpppuqmjovvqysqrnmmkmznnpokt|tmm~veqxfanedfjqqxu{pfu~tvvzzpgowrrwxwlYQTbmjW^h_Zeagifkyz~swkutr__u{oairq{|blwsos{yjfxzc`koqpfpldgwqtsuptXQ`rtdfekP?WhJFLmhHRsletueeYX\pxzvd`nu|krv|ts|necmnv^mhcuncli]obWigpqgYgy~r~{zziek}u~vyrovwy~wx|ywwkkvtqvpp}qtdXm{meo|hcok]\`^^_ngX]^Wnqbfb_X]g\^__gh[WX\]ZZ[YY]`pmXfseezzgrfukvg{pqsnvidvktpi~x_h`]^I9TiSH=A<=IRfcYS_OP_PKOc_IR`JRMQe\d~keelt{}sz}roprmOKOY[buTTPOBHM\g\YQOQLSfaZW[aXd]Zvkopo\bg_ij\^eVY_cgpeem~wmpk^VNVha[S]jZL[u|]X[V_rnkydgm~_WiYSVmk^eprsa\a[mnzzkctuko{{cyz}x|r}wpz{tx|w{wral|nlruy]\q]Uqoaxis~}rvssepa`_vanqy|xmauvirkswni_yrv|kanv|kw`elrfj[`kfvdjbehcq}wnXdckxtzm~u|}|ylz{~vg^btwwxpkaRi]bbkrmpmtiW`og_iiv{xggotddhc_c]`V^d`l_U_csa~ymxw{vxzx|sepnqitzrctu|{uwvrt~vz|lwzvy}g{ymqr{vrrryt~}j_xqyvoyz}{yy|xx}}~~~zygszymceiifn~m}z{n}~wp{yvrw}}wz|}zx~|y|ouyyy|vr{utrx|vx|~}|}~}~||{vv~|~~{x|zvwþ¸»þ»ĺǹ¼aa`bfjjd]^bf`][\\^cfccfhimpssqsvnddit|zuuvnglrtvunkjiihhqvtuyndzocb^gn`TKGUyyU\cfffTGM_kgYOPRMGRgqhovZZSHQ`\FBLU]eegm_T\_^gdRJMV[ZTY\XYVR_gc[T]eYSMKUenc^jnppml__ejwna_\gsk_aegggd`jlYYeacswlfic]`_Y]d__ibR\_VOIQOMWc_RYhn`T]^[YZWSS\jsttsstjkqimsnhjrxwiZlwmhghondo{lltnosvz}tkhknptxqomijnonjjnnptykmnronosxojjnrsu|{sprqmhgmwhmlkkv}qrrzodtvikumokkts|{yjezpyyyxmfmu{vw{zsaQYgjh^ebYZb_goqq|xz||zwphmoo]Ymzjakrm|yblqtns~pcirm^hujfgan{gckqiqvxesoSOdywoacddG?[`@BIu\DVr__sp`]RRVtysk]jvgryjswyniy~e_d_d{_ihbut]`k`lgWgloqgZi}rvvf`i~|szs|rnoqu|w}uswtqvmirrrqunmvkr_Ss~rhdpv^`ofZZ\][^ldX[XTmm^de`UZfVWWZd`VYVW]USYYZ\^mpcnrek~zhlisnuhpqjx{emtpzjr~nbi]eXENk^SA;E9AB`k`RVUGSeQMM^\GNbSWXXgalnkei||sy~lptwkKKT`_awVPKL@FM\`TROLOOQ^YSOX]TcUatnjclabedee^cdX]bditbdp~|kmi`RIP_fcQa`NSm}lXYSUeqgm|banzZ]cQY[qqaglojY_^Yrrqwjfytilwa|}||y~{sp~|~zvh{vomssg~z]ukyw^}ky{zjizq}`ci\as_mqs~{tucqy}dtmptoi_vpt|o^puynob]jidnXYfdsy`c^`bamvrhS`ahps~kxn~{p}hv{{v~|o^etuvumfcNg^__gkjkmqeS`m``eeuzpgceqcbf_]d[^Q\__hZPWhyh~urz~~w{wxmboknds|tbtzwux|xtt}}zyp~{jwyzyy~wj`~~tyvow|}z{{|ztx}yz{}{y|mt|}qfmkjijq{}luzz{uy~~u|}|~|yu|{{tz}x}|~~yw{~z¿üÿļľ¶½Ŀ¹ĺ÷»dcbdhie`_bb`XUUY]`cc_`ekmprsrsskebfqzxrsvmfipqqqniijjgfkstxxee{nb_]eodUHFRs{WYadddTEI_keWKMQKDRgninlSWOGSaT?AOX^efjjZU``[a\LGNX]XQTVWVQT`a_WU^`SSPRYfk^^hmqnmj]_guveba`msh``ckhca`kkY[e^`rvkhhaad[Wcg[_k`S]bWNMQMLU`YN[mo]S\[WWWUQSbrqprpoiamtkorhdnwxn^buzqjeeou^gslgvsnnluznjfimnqwympniijkjkknlouzmoqtjiouqghilnptxwqmonjefmsgljlpw|qwwtkixvnuytxrpvy~xik||nxvtxkakt|wzz|{mY^nkgfueU\]^i|w}yy{uxv{|x|ykfikn^[iwialyslxsbosthrhbnhiasze^b`nracrigttjeyeTYn}npdba_CF]Z?@N}PEemUahh\QKKSssm`[sqfjrjpys~tbtza[eTZwfc_\s{[Uh_ilUkseofYknqsd\h~}nqt~mfjiour{sozogspelpnkkzngmfr\OyumibroV^jaZZY\X\gcVRSTliXajcV[eRQRV^XSYPR`VNUWY]]jpgppgo{wi~yroormfllk|}teu}qw{lzxgefbaURgdZX9?D8ALqdYTPFMb[WJEVYJQeaaa^nkvrkah~t}{iryzbNR]cdbuWJIG@FO[ZNMLHOPMWQMJSRSbXetrcZigea_bidf_d]fdls]]phigcKHJYnjU_WN^zwb\SLXelhs\\wwRZYTa[sreiilaWdY[xti{ik{qfgsf~{y|~ts~qz{xhq~r}kix~la\t}|wcbrz|okq[x^apck{rl}wol~zppwxluqrvujgi{q}w`qsumjh[{lbfo\Oadk|s]][\[`lprcU[`cit|{qti}ul~lu~y}uywt_f|vtupkf|kId^]\bfhgjraNbi[aaftyxj^__ob`fZZgZ]LW[[cSM]xxzn|~|}zy~~|zvh_~ogmdo{vbs}~vvr}}tzts{||~w}rw{w}re{{wtpv{~|y~~}otyuxz~{y}~xy|}uovqoqgzo}~|sz{|yv{~|~{{}Ŀÿż¼¹Ļþeedefeccbb`[SQSX^cc^[]fmoqturtre^fpyumoumcfooklmjhhijfgqutock|k__`eofUHGQl}[X`abdSCH^keVIJOJCTgjjlfRWLEVaL9CRY_gkkfYYc]XWSFDO\]URSSTSPT][YUV^[SUSU[gcV]fqrhoe\_mpadahsmeb_fpibeelhY]bZaqrjhdagcUWgfXbm`U]bTPQMHKS\TL\np]RYVSSSPMUgpilqmib^msmokagvzqe^kvokg^dxi^ipensmlhjwvfadjkmszwpkffggeeijmkovwoqtogkqpidgikimsrqnlkgecgmphhjpru{tuttpo{urwywzspw|sju}wjqqrxi\hqvzz~sdfunfso^bd^o}zssp{{u~z|~|jefhl^bgvkgipwktnbsrqdo{ebjbif|y]\^`ol[dsfjypisza[gw{nvkc``KQ^Y@?[sMPkgW][bWIDEVshiX\xzmeblhn}mo~}_~othVbRQmtbUUm~iS^\ckWpw]ldXs}h~jmdXf~|hjpy{cYdbi{}povol{maqqbekidcqkhhapWS{qljesiP_e\[XVZZ\^`RNSVkcU`liY\fPMPT[TNWPN`[MRWX[]iphmnjnurjwfopjffgfm{wpf}xmww{pbdbbZ[djZeQ2F@9EerZULCH\_YU?BVZV^kkmlftu|uhdo{{wvis|x^V`jaiioWFGFAHO[SKKICNMIROLINKW`bjokhffjjX\ihpf`m]a_rlW\k}deedBHL[mfX[TUi{gZWGM[_giywV]{mMZY[f\xqfkhh^]gTa~qe}fpzibdrxyy}{t~w~~~gm}~~wz^s{fvjcnz}tx}wc]lkqt`w}[~ibqjjwtf{q{mg{zj|usxwvw~}qrmwertoimt_xoeju^MadevpZX[UX`lnp^PT_bbvvqwri{or{xu}vywtumdh{}xrrnldyuI`\]X_fhahqYLhdXb]fvxpgU_\i`_gWYhV[MV[W\TRly|vn{zwzx{|v~udZyoakfhwygq|}vw}kz{oyoqz}{p{{y~wzzv|tvizzxoyz~s~~rt~svxz}||{z||xxsuzl~t}~~}}}ty}~~}~}~»ÿŽüúż¼»eeddeeddb`[UUUX\_`_]^agmoprunmfdbnvwkipqhgimhfijhffgghnttu~zjip{k`bcfkcUKKSg|aZb_bdQCI]jeSGILHEXgfijbQVJGX\F:FT[ahkicW[d]TSMCDT^XRPPPROPTZWSQV[TNVVT\h\S_gongk]]ev~jdfdnofdabnskhjfhdW^`Wapohccik[P[hbZdmaW^`XWRFEMT\RI\pnZRUPOOOKM[hecnpgc^bppjja`jurfdglmjfbcjqbeiflqhgfhovn]cjijnswrncadda\ciilimvsoophgrrjeghijflqlkjiifddjnhmempotwrmnssvzuuyvvvppx~}yqiuxtpmopuh[fm~tyv}skkysi~yigpbs~z}{~rphvx}~pighjdgfxoidjvirl`snmfqtgaifmlx|a_`csn_ipin|os|ebu|xvzpgbk\_[SFEg~mSZlcZ[ZbSFAB]v\^V^wpdc`hfm~gdv}fv~iklUZZS\wdVQd}x\UW`hWls_k^V~y~g{~affWf~ygjjwsYU_\k{zxmlrmizm^nm_bdeb_miff_kTU{rokhtfR[^Y^XRTTX]]NNTXn`TbkpdaePLNT[VKTRL^^QUXW__gqhiljkrjk~xx`lg`abbblsqnmqoqzxk_a_`\cldag=>THE[wfZM@FW[UY@UQP]UFA>NM7HMXGDPieifiltxzvoktytxuvhgroeW[dscZZrbSWV^UUgLCYo_JOMEEMYgisTMXZrcM^S_lauxddf^geLQwpamsfqbhqhy}xvtuvtq}ulnsv}p}wwzx|rz~snuz{psotegnu|sbrwybUTeanR^klqh{dkivx~xvf|s|stbZvvZsTOkPabgmiRBNkr^ocez~alks|vxu}xz|{jJw~rtbfqeq_eXORX_cW_vZ`k^VWUonWbg_Sa^Wvuapiigboppzuu{u~i~z~v~t}wmvswxuyyzxnwvfPf{yqwsfgskqsmmnwmp~q`m~xmrqdetzvb[ltsp{~tu}}o|dykrpzyz{|vn|w|zvzw|wwy{tv~~t~wquu}yvvyptp{{~z{uww{{{}~yz}}~~»ſ½Ŀhhhgggec^TS^]ac^]\\_emmloh_XX\fjiecefggghf_[^cfebbiqqopx|vnnuvvrilsmeih_\YOUivoeeabcNCN]c[HDHHBMceahgWNMHPXF9AMYbhkidWUpiNHCET^XTSOIILJNRQQNINRLIQTSW`[RWagigd`^ejnljhgif`][ct{rkifiia]XWYbonffic^bdcfeeggca]WX\YTUVZ\OI]o[RWKKJFAH\eZTag]X^bgfeda`eeigaa_YXTS^hd^^aegga^cmnlf`immjjnonkg_ZWVZ]mkhjggiffhedgieckjhlglnjgfggdbbcddeikffljgdcq|xstusqogfolpqponlnqsnfjkokddcpvy{mdi}hesn{rr~xqmpuomvrqszxyy|wtmuqyttnxykcuvqowwlgq}~zk~zvxmlzv~qy{tqqivqYhexv|_edS\gMALRcrFC[gq_K\fSV[fWmkpepox_g^QV[]bp[QS`cdVN\dT_mej\f}ww~{s}v]Yf^c{vfljsqcTO[eurogcj`eg^rmVeeQX_``Zac`VXXSrxrmoudUWfh]XbiTQ^OHPezhMUjpw|reXWde`aZYjgabX]WScacf__^Z^blqruWWYYWYUVfe]ctw_hyuqsl_]cZ]prkbfJ_eewmVadd\XQHKQYauqw~{|y}|rqlwnpqsurwxeftn{xnozfz{adZEEG^TTeX>;GWD:DUTBE^pgachqvw|up|v|z{ywkrsh]\fo_X]ucZYW[YYgPAdkT>RT@@QZikbMMV]qaSaObiZjo\de_h\H]xncpkindrtc}{zxvortljwshlto|jv|tp}{sv~~vms|u}ssf}cdfszooquvmP[g`}wZPim|sgeqj{|j~x{}nfmingXuVehljkRBMt~eo]fx}gojzw{v}}vtz}N`tre^milfjXJOY\aQ_v^igbVTXqhUehT[cQizosqrnz~{w|zuplxy{{~yyrv}jruxxpx|wpvtvgRcuzmqoiishqqljhs|lm{k^gwvkole_pwr`Uhvmqv|vtwzzyznqdrgt~p|zwg{w|xxx~xvzvxy~vt}s{~|~yystrxurur~mwpzy{uzspwx|||}{zzvz~~üþĿýkkkjjieaZSW`aed\[[\bjppjd^UT\hokccddddddb^Z[_bdb^dpsnot{wmitzvqmnrumgkga_YS\jrphfbbbNHU]`[HCGFARcb`geTLJHSR=8DP\dhki`R]ucHBCP\\SQPHDLMHNRMMKHNPJNUSQX`XRYadeea__biomhfhfa^YZgwxmhhhki`[Z]`irnd_bbee_`feagf`a[TW^aXUX\^NOel\ZZLLIDBNbdXV_]VZccdcca`bdaff_YVVTPVdd\YZ_dfc\_mmdgeipnkkjlnnid\VSRYepgglfeeccde`bgdephhnfjniffigcba`cghhddjkdcbl~}tlmqqnlghkjoqonlmnrspeklmokcbqvu|xj_gzielnxivzxs~kl}~qogoqv|}vu|w{yyww|{s}lkxsr{{toxy}wwmv~~y{qql~pewr}xx\lgPbjKPVZ]nFM\_oYANjRLU`YupkesnxiaaUUVfZm]QG_\\ZLZfP^lhj\pxovxtz{`Sef`yvfnpqi^TNakjor]]l^ccSmnVcaNV_Z]]_a_YM\l|zrntveVdqjZVunIV`LGYw|_IWrwytf`^omdeaeqqfb[`UOahkbXZZUYenhsfSUWVSUQTk`T_xkUowrqohZceXfpnhc]WkdryZZnqjUULOP[bguv|x|x}woihqjnrssh{tz_hpj{ynrqd~t]e]GET`U_lU8DTY?@HgKEGjscXfjxxwuvv}{xuyrjbjh\]`rg^VX[\`iPDgZH;W];DX[chXONXgp\YcIedWba^a`aeRPdwpipgkmj|pcv{mytloqhapoejuxykyfqxpkz}|~{~{t~yorsx{rgng]dp~_kmyjxFZobtydPhx|zflzqp}~znyq~h}mqurfpWAMxumYkwnsm~yyx{zzxuv{gOqpi[dkhiqXHHYY_MbtikjfVQ\wcThgYf[cx||s{~qwxlpz}umyx~v{zzumnfnwzxp}{z}tfzpvhR`p}hljjktgqolhcmxjjveZaqsgkf_\kvo~\Rbxjrpxrrwwwopplijfyxryuezxsut}w}yn}tvv}xs{rq~{z{zvur~mt|pm|sitm||nvup||tvxpl}{s~}}}{xty~|~}~¿ļiiiiihfb\[`cegd[Y[_gqtj^ZVSXelkfdedbabcaZUV[^``]_jrpmrxxpjktysllqtunimgfd\\djprkfddcROVY_^HAFDBUd`_fbPIGHSL:;GS`ghhh[RgrXEBGX\TOMHDIQHFNMLKFGPPMPROQ[`XRX_bba_\Z_jpiehhb^]W[jwvnkjikga\^efmnf`[]elfZ]fc]bd_`[UZbcTQ\a`RSff\b]ORNFGTebSTYVT^baba`aabcff_WRRPMR^aYTSW^bc]Zdla]jprnjifdhnmfaZVSS^ijgikd```acc\`gbhreklbjlgfhkib_^^ejhd^ahgdfp|ynkjlnnnkjkghmpqpnnmvxsfkqqqneestowwg]jwhcdiscyzsrpzihvpocg~px{uq|}w}syx}}tqyxz~|ww{}txyz~psxsvxxz~u`kcXkhVa^dYeG^[YpW9@c^ILVYjueijpus`bZXPf]icP?UTYZO\iNXlfhhtwlprq|wfRcl_pvcjzo^XYOcualvVXo\`cQjmS]_OV`W\b]__^Qo|zwowyf`trgW`jG`ePLeyWI_{{{skfbsochdm{umc[bYOYir_QRSRVfibrw^QRVUORO[iXSdu^Tsylkm`YifbljjebZfio~n[iwy[YVUUR^bkt{|wzwyqkdikelsslcytrZlmfzxmwhd}k^f]JKc`WmkL=T_[FHYhGONrm[cgo{tuz{{~~}~}wmla`geog`TZ\YenLIcJDG[[=P]Z[cZSMfvmVa^HaXPZ^`_`b\RZdysnkfnptgjx{wu|}ezpehnh[ji_j|rpsfsfosoeu|xzz~|{t|up{rzqie}oX]j]abxi}ILklqukUdmy|r}{~~~t{~yxkqiESy~m\syu|v~o}wruv{t}zwU`xj\_edgwYDER[YOirvqmiSMe}VSkllecyykunosu||eg|xxt}uwyrmlem{}zr}{rw}|yr_y}p|ufT^l}ejghnufnnjg]frhhr`X_nndib[[hsl{YR]zgmkrkowrusjwnu|hoelsy|ncwwmomwz|w|wkoutuv~{rsvjuz|zryq{otwljzqel}~tokovir|x~|rrwpgvn~~~yvz{~y|~}~Ŀÿľ¾ûÿÿǿ»¿hhhgfffeccffig\U^bfnupb[YXZ`higccdc```aZRRWY\[X[fnnmnrtpkilttifnrtunjkghjihjkqtmhgeaVRU[caJ=DCEXc^\b]NGFKO@6?HTcigedYWqpPCFQ_XLIIDGQMBHPMJGBIPPOOMMS^aWSY^`bb^ZZ_knc`ge]ZYW^mvtoljiiea_chjmf^^[_jneY[edZ\_]^ZX_d_PR_gcW]e^]bWTYMLUYg]NPSOQ`b]___`abgkbXROOMNY`ZRPRUY]][`gaVcxwmmlgaajoi`^\WSVdkhfhid_\\^caZ`ealpdjebkjddimi_[_`ghd`__achs{xkfkmmmnoikmfglpqqpqow{uilqqqokmutltsf_kulc]fn`{phfiwgduml_^y}m~zto|w}~w~yz}z{w|~z}y}w|}qw{yw|{{qbfbhphmsjp\_Mj\Un]=;TcUKPYZtkiesv{bb[XNafgiN>OPTWT_lIWobmywztjiik~yswpYbk`itdd}rTNYVhx\hvVXrdc_PjlOV`SVaW^m^]jbf|r{xhn~thYrbPfhTTsvUNpxx~sqigwocqjqumg^a\VXeq_KKLRXfddqk[SPQQNOQ^_QRhnTYxwhlk`ffmshdjb_cpg}ygepzWa^eSQemsyzswusgg`mfeitvd`tvlTkke{unydkwb]e`RYlZ\wfMRcecUSgWMR^uddljvupv|x||wkbipsrgj^dcQisPQaEBV^RDW_\YZaOSwt^RcVP]PPZ]`^]`V^Zlyvpikspwdwr|rsyz~rb{xl`blqjWdaYgxlinamglmp_pwsvx|}|u}wr}qsoffqv]Xexea[fi{ZDZlpurdh{xryx|~|rsyWYrs^u~|{{ixkzvvl|wx}zutfUukY]aggw\>DM`STlp~tmlRNqzM]mupdtmrktwvxi_g|}rv{nsyp~ohck}~{vwmpy}uzo^u}qytdX]hwhedfovdkvkgYbnffo\U]jh`gbWZfqiv[PTzedfm`jwopzgg~nks{rkzy}cpw{~letxjlkot}yxsngt~tqts~{vmyi}~sy|yp|{t}svtkn{odjz}|fogtpmxxwxspzwclnw|xw{zv{~|~}~ƿþûÿ¿ºž»gghdcggffeefff^Wfnqtqh]]__aeggdbaaaaa`ZTUXXXXUUbmmilmmligiorngjrtstmjihlnoomlsullle`YRSblaJ;ECI\a[Z^XJEELH63AIVfkea`Y_ymJBJYaRFFHGKQHCKPPF>GQRONMLMTacUQY\]__ZY^bki\[c`XUTZdnuqljihgfbbhkig`_^]dmi`YYa_UX\^`\]ce]QYdb`\bd[ceV[bVUY\gXKPOINddZ[\\]_elg\VQNLLV^YPLLQSTUY_d`TYungqkb_dmod\ae]V\kobdkjd^YY^b[Wabalhcgbgmf_cjme\Y`cjea`__bdkzvffimmklmlhmmdflpqqqoqyxummmmpsstywlpnggnsqd[hnd{{h^\aqh`o}kh\]xwmzrm}s{uzv}~{z{}{|wws{yrv~sz~mbaesuq~vx_dSicXh_MAGWbWQRQkuejuzkc[WO]mejK=KQLV_clJaqavxtpgbaexxklvdeh`iqhczxOHSalq[^lXZtpdWNjmQSbZZ_Vfw\Vysxtsl{vea\\liWcvTYuv|z{or}phxko{oh`a[[\`m\GJGQZdaflc\TPNMLJT^TMWoePgzqhlkigjzn^hk]aqllygekvj^hnfL\rx}|{rmtrl_b]obeftxb]nwhTjhi}pnwbqsYWad[hmVe~cZfmkm`\eGWYmmilmsvmqz{w}~{z|njpx~qnyjtoRgtYW`HD]_PM]b`WVaQb|bQahR\YRX[`ZXZ\\b]x|{tnuuqnlgxnryuqgfzyuk]]oi{lW^_Wesigh_gigko]n|rqszy|uzvx{rqlcagp^Wbnzla\SevkFNflw|ruvv{qu{uq}~~z~yyxnczqf{}y}}pi{fox|mzyu~}yzyxvso[avZ]_ojr\9@LZS[ksonmQXpRlpwmqwsokyxxx^eewuuwjpwm~sech|z~}uhlx}qqj]s}rvqaY]espdddquekzol[aifgq]S\ac]dbSXbldqXOSw`\`k]dtljq]a~vfenyqfos}br~vsitxjmmksqrzppipttmvrvxzmxkz}qvy~yov{wvtqpv|~ikoq{xwcvwelumuwptqp|}`eqtzvw|zwz}~}zy~|¾½ýĽž¾¿gghebfhded`bgigchqutme^`defhfdedba`a`[RSZYUUTT^lmhfjjiigfjnnjjottsniihjprrpomsvmpof`[SVmq]I=HFM]aYXYRFCGJC46DKYknc_^[j{dEAM`]JBDIJMLGKPSOBBPVPLIIJKYf`PQYYZ\YTZ_bkfVYa[URU`hnqnjigfggcflid^\_abjndZUV[ZSW[^a`bd_XU\ca`]bdcldYbd_XVceSLMJJRedYXY\\enm^VURTNLZ_QEFJOQPQYbaTQgr^hsf]`fmkb_ele_dnj[fpld^XV^_TW``ad`debkh\[bhiaYY_gjb`_^bhioui_gjjiijjjiplbdkqppolo{vtmllmquxy{xnpmjortrb`lmkwreYX^meZlsjd[azsowoo}ys|tww}|y|wz|~}w|xy|zyzns~{vyp{uzzkc`kvwxsgn^]k_faXULN`gWJT_{kkv|wiY\RZsfiH:FOEYlfocjlq~tojd]]crxdcvwokdcikmju|TCOfmj_]bZ`szgOKfnVQccb_^tyV]n}pusbnbfop^vx_ntwtzvkullrjbe[]b^jXDKBP^c`fh]^UONNKIVWMN`t\Wssngfskd}s^epa]ntesi`no|v^jsv\Rky}|xjiqqfZ]Xs_fetwa\lxcTljj{kntduiVX`gemgZp}ggprrq`d]Ieepjwlqzqcw{zvs~yxty}{w|qproykywUis\UcNNaZQP`d_SW]]pqTSxhQcT\Z\bSSb]f^iyv}ttsuz_}motuqfcprsshZWqeooa\[TcqhfdXbl`km\jyqrpz}wyvtrmc\_iaV`hpp`aN]pxRIcez}{||rnxunovqk|ww|wtv~zpxwngxvuylkzlbsq{p{}srrrwkhW|wad]mxoZ7;MWT_it}knjUje^uvrs~woo}{yt]iaqyvrgntj|~vfae|y~xhjv{mhh]t}ttn_YYepxlheqqgn~upcghgipbU]\\[_aTU[iap~VNUv[Y]e]crqglY`|s_`j}vo]js}gx~|wzprzmhtgpmpxlsjjmqjvtrw}{o|wly{puxy{uq}zzpoy}{dsvjxwogm}fetorvpsqr~|}}[cnpyvwz}yx{}|{~z~{}~¿þ¾ſ¾¼eeeefiheb\[foljikprnjdcdefgmpga\cfd^YWUVWTSQS\jogbdffeefhjjjkmrurnhfghnutrqpopsqxsf``WYtxWHAJIQ_aVVUK>BHI=2;GM\nn_[]]r|Z?CUbXD@CGLNIGMQQHERUMJGEEEL_fUJSWVXXSV\Xdm]R]_TQS[ekomikjfeghdjpg_]]`gmnh]VST[YRV[\accbYUW\\^a_`eoo]]hb_ZYhcLFHLS[gcXVY^anujWUTW]SQ^ZKDEGNQOR]aYPXsyb\imb]afigbbhmjilje]frrldZT^[T[a^_`]cadi]RXbgf[Y]dhfba_]cijpn_elhgdfihiksnaejnnonjnzurklnpsw{}zwoqoosrstahpmosncWZ\icYn~lg[T]xrvqpr{uw}qt|{~xzr{}su~vy{||qy~vzxrz{wriuwy{kx}ztjfeou|~mqyiWldmgek\Y\pcNVbxskw~q\iUUsieH;DMEgkh}fptwxqjec]_dgu|g\iuwuafigmsp~`APfllc]]`gkzsPG_p_TdjgbmxYsmtnj}xhnywj|py|w~yosnjun`h[]g^jTBJ=Obb_cc_bXONNONWNMWhlXhunj_gscv|edul\nvhgp`ptrzdbw|xV\v}}zv~xegmmaUYVv`geuv_[my{]UnllsgoohveWYagikbevynorrxm\kW_pqsu|pzvm^{vromu}{stozx|yutt{rpsp}ksvXot\WeVSc]RQ]dWUb_fwgL\bPgXZUe]Tciag_v}~pw|tp]ykr|urm_h{fs~|mgSPrcevjVYN_mfd^Q_pZhi]fvusj~|}zwrrh[`haU_finaeWVhxePf`r}zrwkfqnjiqyyynlwuoovtokpz}tmjkdzqprtmny}ff|vgu}srxkmhvbb`ikhk`_~y`95J^T_hqylmhc{`k{{p}|yuu|ickar~xqcksg}|zyg^_}x}{hkvvibgZsxvq`YWhn~vporplstpsohgkh[bWYZ]aYTUg\m|SKZv|]SW[V]x{feUazq[ZfyrnZes}q}}~y|yur}rb}dilpsjvpheqkwtpwz|qzumvxoutr{{p~qr}{awwhz~ye{jezh`ruswqtsu}w}zWdjm|{|}quzzw~}y~}yv|{|~}|ÿÿþ¿ľ¿üľbbaekjfc`Zevvnjkmnnkgedfhinxqd^`efe_YZZUQPPR_lne^_ccccdhiiikmptrlgcfgirwusponorsxtg^a[aytRIDKNV_aTUTA9AIG92>HN^okZY_bxzP>JcbN??EHMMGHMNJEOVMFCACCESe[KKSTUXUS]XTnkUVaXMNXdijnihjheeggdmqf__aeqth\STTU^ZSTY\adc[VUWZ[^_`cmpgchja[Z`dYKHUXX_fcYV[afqtaTXSZeVR]SEEEHNOKP\\PWiznY\fh`_bfhhccimnopib_hrumh\S]_]^]Z\cad^eeRKXce`XY_dgfba`dlfjvfmmjijjkggilrhaeiklnnjnxtpkloqtx~~yvrspprprufrxjqplcYY]d_]qtifUQfuw|nku}wzwnrwx}x}whwtmqyuw|s}{xpw|xuz|~~xp}vsrhct}s|v~ouvsrgkmots{}n^jsmmqnthc}rWPh~smxsarbSskcFFGMVtiszey~|q}qhfbc_^bjm{kVd{wsujhebp}kygCYjnng[Siqbs}UB_qeailhh{pj}w~zprjk}|up}}~|y{roqr~{ys]g[Zh_hUBJ:Kd`][]daYNNXUMTHUbk^[qqp`aohrpgsz^fxn]jcbupvp^q}sQf||vs~{xbgmjZNVVvakfxv^[oysVVollmeofks`\[dglgbpzttotvwfad]px~vz}~zrjgzrmnfk{omyqlnwrhgn~tlmsulrpYsud\ddYfaSR[bSbn`q}]Kj~YWi_Sbm]frgbgf|wmw}nf`tqrzuok]s~_x}{jwjNNr|b^ryWWH[iebZM]oWbe[ft|rf}{{syn`ni_X^cfedibX_rpehkn||qrl_lmj`ipxulsslpiny~kieh~t{~ztp}\erptqyrstvzvr}]myrb{puwqkcdl`XagtjjvdfTr}mD0BbV^gp{topnhv|o}z}{u}ggnhu}ylciqe|{w{i]_|x~~ipvvgchdx|zwi_]or~vxuttyxytnkggefXYY[a\TNd\hsRMdzv^OURP\rd[ShupZZfoqm`d}t~vu}}{q|{}z~sgbfmxqrhvvheonwvovy{rxtmusrqom~ru{se}vn~|{bnl^zj^q}xxssrwvowUfgkzy}|u}ouyyx{{{|}~vu|{z~|zÿſ½ÿƾſÿccbflib^\_qymhjnnmjfdcflqyzb\ene`^\\^XOKLR\kod[]_a``acghikkjnpjebbdfnvvtsqomntwytkba`mjPKJPVW^`TWT>6BHD74?HO`qiTXdh|tGBWi]C:AGKKIFKOLFJVMBEC>?EL[aOINOOUWUVZQ^q`T__MGP\hgiifjkecdffgnmc`choul^XUVW[bYQWZ^ac^WUVWY\^^cklhcgjd`^_^\RLP``V^gcWVaehsnYTYYbi\PSOCCDGNMNX_WS`vy\P[ee__cfhfcdklnsvjachryhlcU]ddaXU\igd\d^LLZcbZW\_`fe`bcmsdjwhnjgktqiegjliacdgjkkkhmwqllnoqux|}xwurpopnqwmtzqsomb\a_^Z_spicRXjv||mlv|~{roouwy|yysez}zsnjuvuurz|souysu|~z{~uqwmnn_bsnv{qyrppvw~~{lgoomtw|}udiuuvypxpk}hRmsny}vjyoWrkbTOPR`tu|huwqxp_^[_a^_dnzpZfvurqpnc`ycpqTbkqogcWlvhvdIgtllmtjnozy~sy_s}nr~{{|pktx{vwt]`\ZfahUCK=Jc]XS^ga\JMdRNPD[gdVcqmgahgnwpu}iYtn[]g^nqqshj~~cVp~{sq|vdfjfRMUVvdog|u]]ryrNYoklhco_kqaW^einabrussmx}rce`hrv{}ssmnooomegpyfaqojgp}n^_i~tgdvlxmsl[urnaitiicSR__\jlcvPVtqVceZYrmauq`fho}nlvyj`c{wlytli_~|c|||fjymUOrubYl\SFWfdbXIWmU\f^fswb}}}uywlh]\fjjemc[dqwvjty{{{}wpmts[cml\_lsrgxpiihgtwed_d|zp~wuv~~ukr]cvwz}trunr~fnslabWnrlxvitp]bbcQXcrhbdmRbunM6?`Z_er|ztwumxq{yv|glunx|qidijby|w|kj`xynm}{ljkquigu|}xx|z{ufhol]ZWYb^WOZX`iTZmsu_UTOOZciXRhvo\Xbimqhdxv|q|{tp}}}~|rlbbnurtcq|kfoqzwqwy{ryupwqoqoov|y|ooqnv~{cd}w_vk`n~zuqsyrkrTheixtz|uzltwtvx}{x~|wt{{}}|}|~Ŀſ¾ÿ¾ſĿggfike^]ajx{pjhkokigdcdlv|{j\eok`]\]a_UNMT`ehc\[\\__`adfghiffkjdbba`grustsqolmu|{uni`fygUSTU\[\\TYS=4BHB99BIQcreR\jl{nEM`dQ<:CKKFFILMHDPUF@DC;FcZPP`eb\IUbOOGLcd\Ximebcbi||nyvYltbTefivrpnku}sXdr}vrn~rhffeNMV\vkqo}u^`vxrG\nqmcbp_kmcY`bkm_drnqllzyg`dhor~ulqqhekukfmavcXjjigkzkXXeztb\zwhpnpi^topdvod]ST`egkiiaKgpc\hZWeumlvgbnjy}}{ekttiakwiwriekun}~|d`rm_Qq}qaVhaNEQbadWDPjTWlkjs]zy}~wybYjwjeudclvywxwuz~tsnkra\elYZgrsdt}ig_gcp{m^\]bxvtptypm~qx~telicrrtunkdmzbnultk_v]drklrlgxw^a[cPL\oidxnjXYmoVGB`\dctyyzsntq|yuv|uju|v|xhhfmgayz|kyittpxrr{vs}~~~hmutdcYWcb[USSY`TgvkvZXYMS^[wvZSc|o][^aftrft}zmwtyzts||w|y}rrhboqsvalqgntzsx~{qxvuzpmpnt{uwwq}ior~zcasfvkco}|rw~mfoRmehqmxyvw||wissouv}}s{xyv}|}|zz}ǿ¾¾ÿ¿òĿ½ſffffd^[`jruogghkkhffddkv~ucbjkdbacge]WTWahd_\\[[Z\]`abffcacfie`ab^_lspptuqlkox|qjj`l{c[]XVa]YWV\S<5AEB>>CJSfsbPbmoxgKS^VB7=HPJCIONICHUPCCD=8@KUgs`SfkptaPUSG77GQRGEMQMGDPWG@HC78AKRSOHGIMSUTRQXeaX^_UKDGU\[_cfjcYY]]_gkffnpnlkhb_df\ctqgddcgg[POU^aaabehgbcd`\]_aZZRObcNIcib^afacjm`X\dlkc\[]UCHU[\``XV[`\WTTRXZUZ_cc[]chjfjuvedgggx{kpognkgaerlZXd`SOX[VS[XUW\[W^gjkkjoigpfdrwjcinsgbjfbdeecadpo`jnglsrx~wsvurmkjlprtz|w|pui^jqx{kZcp~miiir}x{ortboyzxuxtw~wkuzfjrsotkg~vvy|nolowjvgowpwsd\ko_XbkiqsbncX_kysrz[fumiisvvtlglrux{uo~{{tlworw{{xywytv|y^kvvrebmajmurrmghRMRaeWevztovppbnzahwbm|ort}uqlf~rhsiq|}~~xl~iy{wyvupwx|zorvxuw~~t}x|xzuuzpn{xvspvfdgbgadYNUBP_PQ\`ckVNhYFEM__^\bhcd`dpvmj{e]xuX]usuvphgjpuwrdiuz~wsnezpsiacTO\ctwwzxrcfwzsM^nqpa_uijkkfe^nohggbnltxeVdp|ms|urunhl`\qpkdsWhjUW`ildlbUPYmm_Tqqdkiggdmpum|y\TZW]hmiprxlFddfhhYSblqtumkyqr{|~uuZkn}mlmwymvwq[kpsxxicZi``[lvoZOlpTDKYYgX@Mg`Wmzvyltkrx{}}qhhm{qu~|~{sxp~qootu|kbdlaSiU^^kuduq|bniTf\]qcYYXeunfxrpwtemlng}{}io}jgavj~lnyeufogY`acmOkfszKhwosobfb_iwk^Y]^FL\alpd`YdhU]Xeahvz|~olrop}urty|qy{m{talsmjqzwytuz}ztwvlat|c_[T[cZgkgPO\_\ieg{h^fl^ccWZr}}}~{pejj|jow|svlru|}~yquvruj{\d~rp{{}yw{qqrvxyupolxfon~rbdf|qujfrtxwd`ePrgbibqtwo~||~~{lvtmtruw}|qwz{~|~}~{y|ÿĽÿüĿ»¼¾ɸľ¿ĿYYYXW[blqpnjffhhgeddfp~|slillgcfmqmaZcjihdb^Z`ZVVZ[_ca]XXbkh_\[Y[dsskjrumijo|oecfgylaed^[daXS[bYC:?BHC<@MVfq`Wgirs^USE;5?PTMINRPKGJWQ?DLB59FNQOLFGKNSSONT_a[[b[MB?JW[]afli\TW[\agfckpnljigbbhd_nujeillh`SMS]dgf_djidbba`_^^_ZWSZdSHWc^^cedbefb]\`higa\_`XQYb[\e]W]\\\YTNMSVV[^_[W\diidhttdefgkw|isulmmhehqm__b`TRZ\WT^YSUXRR]fkjfijcgndivuibmtqdfjececcc`eogclhdlqrxxrruurkhhkoqvyy}~uy}onvx}ram{zlikptxuumug`w}~ss|svwvurwmbsqxuzbh}utuz|wgjinxgq|cquiwu]Zmo_XaobypegVUblvyipkYorjgkrrrqjaitpyss}{zvmrmnw}yuxzyv~q~sinia`idirgnk`j\NR`iR\yqsvqmas{blsbjzqx}|znfotj}tksz{vsyzuiqfyqvxvzmozvqxznnmrpv}vowpvzxrmx~pm{zywssmnpg^ciVW_N\ZV[]\cjUWkQCCPb^^_bdca^mthez}mgs{aWvxspoledhruvnil{{yxtobuptmaaXRagtxzwsqbdt{sV_rlrd^ukjmqhcZpwmcbcmpwt^Yl{}n||ppmvjihdcrilduY^jQR^kr`c]RNUgkZOjmbeda^eipzmusVNYY`mkhqqp[Th\rk]QYaht{zpuxqv~w{soaji}klswrovnXyhxzz`]_e`^^lvnXSl{t]QFN[g]DUelan}sufupx{~|ysgx{~w{zxwzfsrpkktj^ZfiSaTXdcrfyswyckyeQiZXj`[b]cmdd{pl}rt]cdvcy|}ff~}dg_mzjzherageqiVY_bhVMrlOen~wi`cf[^oqaX^iEJXYjpi\bgbQZaeen|}}{|pis~on{}pnrvw{}nt}u}wfozss}utywy~od}qig\^jbd|pg[VXa`kqi}pZmkacl\`t{}uumgej}bly}jqjoozzvtwx{ym}}Zn}{~|}|~pprzv|ns|kk}|do|mxnadfxsujiu|qr^]bSulegbopu|k{{n|vlzwtz}ztz|~{~Ŀû¿Ǿǹľ½ľ¾ſɻ¾ü¾UUVW[_djokffddeeeccdlz~vpnpnlffqqmgbfkhecbbaa]YXZ[]``[W\djg^\a_Yamtlfnuohikuwfeddl}yhched`abZT]b`J<=CIB:BOUdobZgivsZTJ?::BRZagiic[YXXY\`bcdedcdcddglkhsxjdnsni]RV_gonmndgieokX[heaacd[\]QKT]]``]bbYY[ageaacceijhkjc_cpd^_`eaUPVVUTU[a[SUZ^bdb^fmkgggfeu{mozokpibfklica`[XW[`aiZSWQKQ\ek_ah`^ke^rwmgjwxkgog\cg^]hdbhabbcgprovxqmpokfegkmmuvy}ux{xu}~~xsv|~vysqsvywwxwkWtx|ztuoowqjqwhprd~{Wo~{trnns|r^dhgsmfs~hqv\mw^Zfl^RhwppyddUNeemx|pk`bnnknoip|ngcqoo~|r~myvqclgeszurwsvxhruvrqvzfhpamr[Zuk`ii\Zvovxupgsjj~f]c|xv}|esov}llqtljmnuzc`}|ahpoomvtgemupnpuyh`bcmtwqghlgoyzohrwyrq~|ytr|r^\ijalmqcc{dbcggYeiWGEVbbgb\a_cnj_h}rpspp^evwofijddcpyvwvqyx{vteptruu\a]ahux}sil`bp{ujmxhqfdqfoureZP|dZfikutk^n{~|xunwvqwtiu|jkposgX_cPOUflUYWLIMZ`NH\saYYWVMQTZgbbdPS^\lyt{j_^[jglt\WXcg~rstssr~|uqylreYs|drqypg|psy\zo|}ZKWjbbYjnjWZnrrefeT]hk\up|~o|||tv]xnpypw}xu~ut~xnpn[frr_c~xc\QeeU]Ge`ngqpqdck`ThbZ_dps]cgcq|tf|kdt^Vgr_q}kWg}gcmmrjngXV]^ssjvtQN\f_Av`ld]cv{j]Va_Rdvrh\kq[\]oyxUm|ofhear|stuusl}ls{nixzkionqwxjlxz|{}ywxvyxmszzw}l{uswzzvrqkv`^ikzb_|fsmt~z|x|ooihepxy^j}{enkijqyxsvz}{z}w|tqu}ytwynv{ysn{y}{q}nemd_ehs}|npxosm||X^}\[|yjfgnjttk}~~~z|yʿ¿¾¿½Ľº¾ļþQRTZ_aegf`\^abbbca`fx|mlooonkmtulhjlkheeiokda\^a`^\WW[ejgbbfa\^hkhbhpqlilluvfc`akyyidlkgjk_kcY`bbS?;EK?9BP]gigb^\[WTX^_`bcbbcc_]bimnnpmeekoojd]]gqronmidhmqn`bpmgffe[TRLKQUX\bb`]WW]dgc^]^dgklhddbmnlehidc_[\W]hl]\[]_ca__cda`kplljfc`wxmkvnjmdchihigc_\ZY^nql\[WNNXagh`cg]bg]jxmkoqpoljibbic`gmbch__aflsmjvxmhiggfefhijqtz~zvwwwx{|z}|{yuw~|u|z{}vlpzzyxsqouhan{submtvrpsxrrmefsqYXhccughsttxXpvea`bakkvqfq[aUcfhtpyoY_lmmnzov{tfz~vy{~{yk|uqpmbfe^jsvylqq~{|t}rsyrqogsmahvqfmpe[smxz{mjx|jisfZgz~~vrvzwbr{qshddeedeq|meqd\qz_Xhoigold`afjmpqviX[`elvscdiefnxwjnuvvrzxlv~z^Ymjg{uct]y}g`gqabbNUaikh`jkkmepvsqqqmfpzstgdhhjmruz~qovuy}hpxlw~XYm_ouz~scbY]ktsry}hfhimgw|mcVLY[e_musjnuvs|wy|tx|kmwxvanc]XQL]lYUWJDFV]GE]hMVRNOGGHQ[b\d_gnszxzwf``hmjkia\lps}qoppqqzzu}spsumaulfz|}bpssjtqlt}eNT_idghrlY\nqi]udlr~urztv}v{xpzjZkk~zfz~}}y}ouvhft`PXpe[itvbLNom_S_`drRrsrfbdh^ix`agz_mUzhztf[giLjpkkxsnXVtorsfikkn`^Y\crsh{tWXZfSakd~oY]iu~mibMb\g}jyqlqsufnw{~mdtlempdiywupwojv{{}j`pknttgitvzzu~mnvugrurs~wv{~nn}]oumzy{w_u{ypz}{|}ywsnt|kquyio}|lrrnm~wxynuz|{||{yx}~zysz|yruvhda`kkpxzxr{n}tnWdfb{zsqkkiwlq|}{¿ƾ¹¼ĿźþQSUUV]ca^ZX\^bbba`ez~jinmkhjuzqlprpmgbhsxrfdddec\[\`fgghhiaSUde^`djmjefihsqh`]\bsugbiosmbkbgk`^_]UC=HMABNQTcia_fslOFLHFHMQSRTTTPNTTQRWXRFAEHLJEKQPQSSQU\[Z[[RG>9>KWenkc]ZWSTW\__`dc`bc_Z]flmmqofafmnjfcaepqknsiadktuibktqkif]TRRPNNV^^`d]RRX`ec]\Z\gplffadnqkegnlea]d`Rc|o_befffb^_ddefnrsqmf`byukhrmjk`ejhikje_][[aprme_XPR]ajg`fd^be`suhrvlmligfcgibdpmfge]dfjpretvqliieeffffhkpt}{zxuuwy{yy|zyxv{~}}v}uqxz|}wsosxkj{vwjx}tuysovprvdapsVRh`^yienwy|Youhe`Zeqjxr`p_`]lfnoo|bUftlmt~rx|sq}~~{sgxyrnkjZ`d\douxgjm{~}x{zuzysnnwocrxqgjul\l{kw}wyjmyyoile[jtx|sqrx}scpwjrwg\\cbderyhejXczjU]noegpka\^glorrtcW\]gorm`chegr~seksuur{ujyx[fqfkqnib~hhktbjoVSannlgsqoknwsqrrpjnzwsqbdggnuvs}mmyyv~js{il^Sq^iu{vta]UYhpqpibjljkzxkcOR|[`e\muqhy}rwt}w}vwls{}ti{ea]KMbjVRVI@ET\CE_\IULIJC=FLUcZifiv{}w~vibdqmitnaewvvyvwnlmrxwv|unvxnv|io{i~xtnwxkmq|}oZU^iiklsnedhzlWquortmvx{z|mstltd[}ihwiv|w~yzlntc^pjNRfhYaiyjKKqtcU]]amXhxrieamahfhm{fqR~kzkk^eoEmqnhxrxsd_Uplq{ndlkg[a\[moxrp~kYXbba|h|voZ[ls|wmbLfeiwzzkq~vwu}qjp}hahlbhvtzotplux~zzyj\nikrrhhuvzxw|~|jdswdrsqyxutzx~|~tn~msm~vw}m|p}}sw~x}~ymptytv~}vzxmusx}qu|}|~}u|{mt}xl`cosq}~||{rukZhwk{q}tmnynw~wûſ»¿ÿ¿RSSRT]c^YWWY]a_\\`ntikljifnztjlssokffqzwkdeffgc]`fffgjljaTSakb\aejigedddy~uqd\\_grofdgmtqdjceke]]USF@MQCDPQR_fcbfs`@ESIEMTQQVVSQPPWVQV_ZRMIKLKEGUVNPWVSW[[[ZTRB5=KS^gnf[ZXVUXXY]bge`aebZ[bhkmnnjdchmlheeflpgepnbbflvugerwqnnfXTXVQOR]b\adZQR\a`]ZWX`qtfhgaorkgfjqmd`ag[Z|}ihhihfda_bggijox|oeba`stjfqljk`gphilmhb^]]eopnjbZWZ_bghdca_cdfxpjttkmkcdcemhdjvojg`_gpsrlg|mjlhkhgfegejlnu}{|}xruww{ywywvww{}z~||yw{|xrpwxjn|zu{{v~u|vjtrr}janp\Qea]tmeotw{_mtjiaYgqmwk`pb`gtimntwYYkujowmu{s|z{u{ulatwqnhjV^e[_msvdfjw~xzw{}u{~skq{ocz}peexn[gtfpvuxhnyvtjdc[jnuxkmpvwjbnuldvr]V]]acgrrbddVnvWVelibfgc`Z\iotrnr]U][grmia`iehyj]jqstwwll}sdmpjtuy~kksihwnut]Wjrsonxtsptwsvrrqmq{sskafdgszxrjm}s~nw|yldeMq`duznuc[SSflnmi]npfo}pgbJevbbaZovpkuqxw~z}|tt{~vtli_NUfgTPRICEUZ?IXRMTGHI@=HGU`^qbkwxywxodpwjrzngszyvvyqjikqv|~voxwztqtz|vowzjqqw{tjbcjoogrwul_qYozquflss}q{cgqgq^bzegtvq~uz{kiqaYksRL]i[]avtRKquhWZ[`j]d~sig_tcleoy{ouYkvingjvBgqinlqs`]ZmlkzxfklhXaa]uuvzn{y_[]kowq{st^Upv}}vaQjop}}pf}u|oml{~c^fg_iuv~uq|rls|uz~wwvk\kkiqqiftyywz||xkbmzzz~mrpqw~ujtvry|~zup~wqxqtztuz|y}ptlv~}~q~|sysv~~|~~|vwzknw{w~z|m^mzzvys{}pzÿľ¸ÿ¾ÿÿ¿NPPRY`_YVTUX\`]VXgz|kghggfjx{oiomikhis|yqiegghe`dihedhmh^VW_iiaaccdedddfmxrno_Y[ainlgfijrufieegb]WPQNDPXIIRSRYadegjP:HTJFMUQQZYQNPSWWX_^VUUPNQJGQRKJT\XVY^^W\ZR:;LUZagiaUT_[Y]VZbilc]cg`\dhgilkiffgjliecfjnh_irf`dgmwshkvvrrmc\[\YQRZa`\`_WTW^`^ZUV`inhhngkunggilmib_e``{~kmojgfdbcdegjkin{yhabccoohhmiijflsfinokd`^`jrrmhb_\_adghde_`eclvppunjkgdfcgngfovqjc^cisuoetsemkhjihfffelnhwyw}}rovvvywttsuwwy}~{z}}vsu{zr{w||yxw|{v{vitwnt^joaS_`Zoqgqnuxgqujme\ixqolgmd[swmim}nSYkrkrxmz}q|t{qkxwof`pslmdfS^eY_zgos`dhr}ptpyz~vyvhmxod~|ncaxo]eo_jruudoxtwf\c]giqqgjnpnbakiccu|lWR\\bcipi^c\`zgRahc`ea^bZU^kq{slnYWZ\kqggeclhnxZZloqvx{fq}~ukprp}z{ltyhltt|vabvrurqzz{usstuosrmpxrtmceflu|seo~oxxxwrkb}oKkd^xxdrd[QOcgmkjXoucqzlf^Nyre`^[otkonrxx~~{v|{z~ureZbhgVMQQGBWV@OTMQQFJLCLLF[[kn^ltvx}wkkvriytdo||zxzqnkiim}ztw|ztx~~}}ypspwuvzstvmp}xcgy|]uu]nr{w^bim}ky_bnapWmw_g}vtzxvvjgo`UawZHTi\[]qz`LpzoYY]dgcbrhk\tox}cu}ywl|kt{nnlt|OZngcjum[_mmkwyodmy\gggyusuzmccn{tzyz~jYr|h]zvxz{b}{u}ynkl{qa_gabltzxpvsnrwqv|vyvl_fmhomjgq{zv{||vlckxyxyzzwmmv|~zy~~te|}sumtvu}wp~yznwusox{~yl}z~m|~zx~w|~ws~z~}}zzykr|~wƽýſ¶ûľ¾¾¿LLLT`bZTSTTW]^UR]rtdabacgu~vljojedgt|oigggilifilgegji_XY_fihda`_ab`bgovqjljZY^ehghhfhhrxhkgec`]VMOTJQ]SQVURU]cggaD8JRKHKUVWZWNLOTX[`^UY_UMSUKLRJET^ZVX]_WX`]H=NYZ^ehc[SUc`ZXWbkmh_`ec_ekjfhjihhiiiiga`hnh_bppaahjqvoiowtrtk`aa]XUZ__^\``WUX]_[UTajhbbqlkvridfimlcaa^c|jjsniffeehhffkkiq|rbccdhpkbjlhfgkrqdhmnjfdbfotrkfb__acdfgec^dheptnrtkigeffdjnhisqkgc^dmrokjijjqkhiihggddmomxtuwkpvrtytrrmnzus~{ux~{~~xv|}||{zxxywuwzujovm]cleT[\Viseonsuswvjoe`z}pjijkfV{upet}cP\mkmpsx{|ymtl~wrfcsthcbmohl`dQ]dSctalk]bgl}lnjs~xx}ytwsfgtme}{ja`wq`ehZgospapvpt_Xd^efoj`klidZ`i`_fquhTQU^dekmbY]\rvVag^]^fY^aQP_gunpgW]ZcpjfnkhmjweP^qoou{qsgw{wsrtu~{xozykvtxzukpzputu{~wqqsplpomnsqtpeekpyresipzmgdawzPbh\zu_nf^MM_dlijVpteosli[bvja\_^nngv{}ktxx|zx}w}{wpijkhXLX[FEXZQYVRWSKPUV]IL^_rj\csu~}whmtjqxkdx{|yrxojep{xo{}z}smwuzqtz{h`ogdz\fsvq[[ae|hvbff_~eVtq]mvzt~szqtlkmcRWvbHPg^Z[myiRqp\Y]lddhqjkWg}vev}xy|~tmrwull}z^\vi`gv~e^nikt|ygkvmrtvrux}{yot~qky|}g}}zt{rohm}i``l`lpxwptspr~}vlr|uzz}~unc`kimkiilzysz{yvlegpx}w{u{~ynfpz{x}}t~yw}}zvcvqwitt|pz}zoyulwqn}{~yqx}|s~~y}}~~v~z~zy¹ƽƾ½µľƾþ½ľHHLXb^SQTTTX[XQSg{wf\\]\`n~ynmnmfdgt}pgehhillihnmiiigd_^`fllf`^\]^`adkrrjhlbZ]chgceecfhqwhlke^\]XOOVTT]YXYVSU[cfcZB:HPMIIV\X[VLLPT\b^VYgeUUYRNPOKO]`XY^^ZVabTFQ_a^`gd\TS^c]XVammh_]abbhlkifghiiihhgec^akk`^ipibdhlrsllrsrrphaed^Y\efc`^a_VSZb]TS]ikednkfrslgchkke^_aavlhssiffgghhhgikkksvjdfdeloh_kmfcdmrlejmmkjgfmrspidc`decdfidc`gimwpnutkgcdcdglniktheeddhqmjhggiormfhhhhgeilnrwrxqkssntxroojovq|~{~tq{~|}yxv~||~zux|vqwztijtozi]aj`WYTbqfjpsqx}wite_~rmhjjgY|rxgv|ZM]likjyszsyojmkyxsj``oncbellgk^bP]dNfp]heZbgg{hggk|wnr|ljmecpme||cY`vscbbYimqj^ntppYYc^bbofbfgdaYab\difnfPOQ^filj]UVczb[pbZY`bZbYIN]fipbZa\hpfjsqnmo{WOdsokvtxkkz~w{vuvy{~usxw|twuuoyvnpv{{{xsrolhnpplprvphjqt}riwhnvh]]em|][jZzqamhbHK[djdhSnugkimi`{g`YZ]`keh}q|}ivxuxzxxx~}}xrvka[VfbLT`mga\Z^XSZgm`FVdjwmUcwzu}}lhfhvupnxt|ski{muy}n}zopughwy]oc\w~{som[WY]tdreh^bv[[u}hbwxywxss~vw}}qrkdRQumJNd^WUmylZpn^][uecmqnhV\xkv~{q|{reprznmsbjq|{eerxgxnrsvmzx~|zvy~~{o|{xvtvxlobr}dcerdvq}tnrsop{~yrdrzswyu{}uog\fimkgijwxrr~ssmggmp{ytpz{rfks~~rwsu{u|~lzzz|z|as|o{frrtpttvmt~r~qtzvt|~}t{z~z|{z}ǿ¾Ľǿķÿ½½¼FIQ]`UNQRRTWYRN\qwgWV[]bjx{mhkmebiv|ofdgillkkjklljihffedgloj`\ZYYY\ekonibgj\]]`ccca`ahipvinndYX\]VQYZX_`][XUUZab^SB@HOQJHX[X\VKLQW`c[Vbk`WZVOQTOOYc]X[_WR_f]RVca^`fbXXUXgdYX`lmiaZ\`flmljhddklfefgfd`^hm`Wcojeefikoqopqppqngdgfa]_fhhfbdbYXafZS\ddjkpvcgunifjmhf`Z`eq{kerxmadhhgffhkkjklqofiihhlkecokgjkijjhikklmhhqqnlgabfljb`ijcddiiuslrwsia_abchominoegedklphffdgmrrkcfhhgegmllsur|mnsnluulkkkppvz~~xxwxps}}xyun{xv~|xsw{usz{uihojuzaWcq][VZlgbjspvzl|i\tpiifdb}jtowSI[ceemqrsnvhjzfhntoa]^lk``emjfiY`P^eNjjXccYdgevd``evvhj{yfah`_mle{{[Tbtrea^Zhjoe\lqqmU[baa_rb`bba]Xd][kh]ldHJUcinmeZTYppTnrVWY\\c^PJPYn{kl_bf^iiguxtno}jSVhkjmxp|nmzxu}wxz{~~uy{|ytwvm|ypkw}}uyurnhdsznepwvqlouvxuly|luscWYjbsj[gXuoeheeFFVfh`hSn{iefpjls_YU[ZdgZi~xn{ukvuruzx{syu~~}|}g]chtl^gs{kcbbe^[est^LbmngQv}~zkfglv}xux|{utx|~uq{vxt}wmpb[sr`pstskkYRSYl_lhbYmjT_{slgvx|q{~~}{wwueeVTqtNLaZTQnuj_spc`^}j_p}tocUZ}{qs}{xkyq_nlzwrncovmo}~xy|{yv|~svtwuzsqovufp\x}fmswf~qomnslny}xl^rtptsr~z}vtl_aikjejgqusj{qmmjgkl|xzkuzvmmtwlpqowrzzj}~~~~x~^uxnz{}cjmr{~~tkmu{olrvtwzs{r|}v}|z~uzzw|þ¼ǺĿû¿½ž¾üHMW_ZPMOQRUWTMPeywi^TV\^fqwrebfc]fvzkbbdfimljjjllihhjjijlnpmf\VVVWYajnlf^_ih_^Z[`bb[X`jinshni^XW]^[XZ[\_da\[XU]^^[QB?KQTKHVZY]TJKRZ_^YZfh_XWTWVOKRae[X]^TWef\Ycd^bhdYUWY`gb[]fmkc_]`jtqlkid`djhdehhgc^epfW\jlechkhjmooqpnoqmgegfabe`glieee]aj]Ubhahqkxqcpohfknhbba\cqyocpwndaiihgefilkjlnmjifilmkiehmimqgckjkjiknjipqllhaahmlcbdjebdhkjxjiuwpb\]e`bipjhrhdhfempigcacfosle`djib`glllrtw~vkpoinvrjkjoqv~vrwqz{utwvu{zuxzxpoxst}}wurpsvw{{qgigbzmWYujbZTdh`gror}{n}r^}|sgdd`e|czloKGX[`alnqrjqkevqcebre_\\ih`^fncfhX\O^fPkhV_aWcgdsrb[Y_ntdc{{utb]c[ZhjaszWPdrrha[\fhk`_hlvkR`a_^`pbbcb^X[][dkdVkdGIZeqqjdYNa|a]zhRU[Z\g]OJO[}smidgddfcp||visy`T\igmp|~uxpixsw}wy}}xzw}y~zmwwlx{qlvvnxwrpef~hbtxurouxp|~rxnuaOYb]ht_aYooifcgFBPjg`f]p~jaeulx]_WT[VccVmmnypotrps~}vyuqrs~sg^ozxpnp}ygedgh^aluoZXpm~Yh|{wkllvr}|nzvozgUcrdmjrrliVMOYh[jiYayaQczpsltzxx|wvoYbZTnvXHaVTTio\crf^`k]rztkaUXu~rn|yvf|yq\mhzlfvy}||nx}ppw~pwyunluvmqc}rxyxop{jkltknz|zqe^w}mosin|y|~wwp`ahjicighsskmuhomhjervzqpwxqrtzlnrqts{tjzu|~}{\xsoxz{achpos{viikulmpo||uzv~t}|{~r}|t{¶ȼ¹ý½Żſ¾¾úIRYYSNLNOOSVNLXn|o]UUY[^issh^_a\bt{th__bcdgkkjkkkkihjmnllmqngaZURSYclnje^Ycjgc\VY`c^UTaiinpindYVW__^]^_^``_^^]U\]\YQEFNSTLISXX[OIMTY[YV\gg^WWWZSMPZedZX]\Ydmf][]`eokVT][\ac`_ceihbbfluwokhb[\egbeiiif`cqlZ\hkicckleimnononopmihifbhgclnjiiidfg\_jb`uvlwhdrjbhmga``acrynclwob`fhhgggikkkkllmqjehljgjjienvh_gmkkiinohmqkjic^djkfccfhb`ekkothiuxjZZ^`\alrfenedihgmidfb\afqsh`_eli]]hnlknsrmpljovsiihozurozqnxtnvyxqotqvzmfrzlrxvstunkw|}ysgff[qyu_Sosi^P`f^dnpkwzn|zdpqib`\l{bxkgGIVV]^giommmm_ikaZ]qb^[[ae_[gp^h{eUWQ]eWlgU\a_jgcmraWRXhpa]wzmna[_WXci]gxZRhqqh`[]dhg[_eivjXfb_[apaabb^V[bcik_Vk_FM\jujgcVSl{]l{_RVY_j`WULLfkkrqk\gbb~wl{}xbVcjmtw|zhivoy~z|~vywzw{zwkwvjv}tounmuvtrak|ffyw|uouz{i}r~trv_J_WWgtf_]ljr`bgF=Wkgicez{k^b~ltTaZQZ\h^[u~gnwrrsonu|{t}npps~|pje}|xwzszsjfclg`fkqhYfossbs|l|rm{|pt|rt}T]xffkrrmgSKQYgSegVovWPlrwwx}y|}xw}}jV`cTor\JaR[Y]nUbuhbckZryrkbWWrtjtzvhv{r^ok~wo|}~{}{ks|rm}w~xrw{yomuw{ys~xvzxzwekithny|ve`\{gnrekww{~xyrbdihl^fdbprkhshstkjemstwpswuutvjhrsrszpq~zs{z~y]{pswwz}`bdrijy|ichoipokvwrws|}ns|~ÿ÷˾ɾ¹ƿſſ¾¾þݾüLUWTOMLLLNQPLRfuwaPPWZ[bjnh\WYZ^pxob\\^`bdfghiikkighmqpnmkmjc]VTSS`lpkd\X_hihdVRZ``\TYeggnnhm^ZYYb__bb^`c_[\aaWZ[[YSJLVWVNKQVWXOIMTWWVT[gg\TWWTOU^dfaXY^]\hnf\XYbpq^S]a\^_`cbccffdhqxvliibYV]dddjmjibaor_\iiggadkffjjiikonnolffiddljjqpljjmmie_hi]h}oor_mraakj`^a`gqwrcatub`cdefgggiihjljjrslkliginiflwp`bikljhlnkjoljib^afifbehiebafklonfjuuaU[^^[bmmdcdbckhhiecc\Zbentg_]eleZ]hllklu{qqklopxqehlv|wtouqqwpoutqjirvuobbp}siprooswmhw|zyyk^dWhyygSjxlcP[a_`kneqzmv}khtka_[quczndGLTP[\afkfmjk[dg[S\pf[\X]i\Wks`jwbRUS]dZlgWXafpgakp_VLTcgZ[s{ifbZZSY_f]cudXirlhbZ`efdZbcftg]kc`Ydq_cfebZ`hhll\arWGQ\trahcY^xvcsvaSXXimT\]OVvht~uh\j_nvw|yyd^hpuy}v^puo||wrywv|twlwtjuzysuiqsuvsbsvkj~w{qpqwm|rulws`OdOVhnlcdhgy\dhI@`ehvbtvl]q{mfWf`KWen[kytemwrsrlox}yu~emrv~z|{}~}wnxwz|ylrumbckb`efha`mmltql~}tqu{s|}|}qXcviarqqnbQORYdKafcwpOPy~r{}oueSaiVqs_U_Oe_VhU`xqcfkWswpni\[t|uipzvr~v|sbtv||yzy~|wvksxxm{y|x}yw}rnv~ssz|u^kgseou|ua[\{|hmidspuz}y{vfhmdk_c`]kqjiogq~olnlynuusuwyusjbttmv|r}yq{wx|yb~n~wwtxs^iatj`vhZfmfusks{sz}u|r}||z¾ɿüķ˾º¾ǿ¹¾¾þĿ¼ŻþĽLTUOKKKKLLLKM]qseOHOYYZbif[SSV[hrmaZ[\]_bdeegijkkjjottqmkkihaXTX\^gnmd\W[hljh\MR]][[Y_hdcijhk\^^]b_bicZcg^WZddXVXZZVLM^]VPMPUVVOJMSVURR[gbURWUUW[^bb[UY_^ahkg^X[jwfT`g\X^__b`^aeegr|zofhdYTY`cbflmjd`kvfZilbffaii_dkhdeknlnrjaeiciohkrpljmrnjgeid]uhqobtm]gog^^denwpe_gsk_ab`bfgffefhkkhjprpmjggkmeiywd_ghiihjoplkoiif]_fgecafjieaaflmmjdlunYT]__]enica]\diebbba_U\eeorg_\dk`V^hjjijxspqgnpozqafq}{ssqustuorsnkkgoypa^iszz~jgnmkntymgz~wx|k]c\jt|yhSgvlVVej]mj_mzlo~rgx|tm^_arnk}sbNQRKY_`ehbmek\dfXQ\qgW\W`o[SnvhlqcSTU_c\hi_Pbipf`jp^QKSa^SYo{gaa\WQ[\dcdrl]jvfeg\dged`daergcpd_\jtablicbhjjmmZesTGR\xp^bgdf~qowvgSY_rdQhfWj}o~vefm`|x|s{udijsv|o\usu}zqqvt|stlvqlrv|pvxhtrtttewqonuxooptxvvog{md[bMbgknmhen|kffRHfep|k|xmenzdajdGVom]zsngnsqrpkrz}xxw`ntw|xz{y|}~}{ryp~mdtue_bb\`dcbaeqz}kwhtyuy|{sfkvkavqqoaTSV^bTfxt{nO\~z}zurxzeWciWpyf\]PheW`V_w}gm}kZsvstl^`vvven|xy~y|tlz~~uwt{x~vqjtvzoz~|z||vsp~nq}wywYnqmdlvrwhX]xtq\`}lrx{z{|lmtcghiebimklqgpvqumqu|wr{wq{~}jayvn|~}xxw~tpvzj~p~{wsumWlavpVolVanfy{mpxy}~zx~~~yľȿþķʿķ¹Ǿſž¾¾ýƾ¼Ļ¼ýÿžMRRMHHIIJJIJTgqgUIKTYXYcf^VRW^ejjbZY[\^`aacefhlnnpruuroljijcYTX^fgkme\Z^ekjleQHT^^\[[ahcaefheZaeb_akjbXdl]SXdeYRWZ[XK\ccXRPOSTSNJLRUTPP[c\TTVWYYSSY]XTY]^ckncZTZtpYYgcXW]^^^\[_dcjy|ofifYTV\bbchllhahwm\eofcjeeld]djgcflmjop_Yegenoilppkhsxokhfg_]{{colhreaqpd]^gkqqf]^jpe^ba]_fhffeeiljiknoolighlkeo}n_eidjiijsolljfge_cgc``bhlkc_aglmmedoqeWZ````hle`]X[dd`]]]]\\^aenne]]fi\T]egiegy~nomgpmo|m[gu|{ssrttttosqmkmfhun[^ptswmgjjggnsvsox{wz{k\[jok{ufRfw_Tdp`nkVexnlxxlrvmn]_jsgy}ucQYRK]fadhdofm^egTQbtbTZYgs[VoxrpleVVU_e_fjgL`jsb]hk]JHT_ZOWo~dZa]UO[Y_jfmsdqzdchcgkggfd[drihpe]^nsdaklikhflodSjsSHQki]gmin~txxteV^mu_\nd_x{u{tdpmlztqhmsvqzh`vtz}{vrro{p~vpsqqpwymztionpsrizytsqvtnpzuqpe}nid_Umelsxkiv}lc^Wjpzv|ztymjnohAXyjhhtioqrsllv|}xykfrsxzzxwy}{~}zruqkzt`dyl[^ZZY^ccfgev}du}kzt|~}}zyqzvixwyudSSaljizyx]wzzpx|{nlWdeVne_\Ugj]Z]axos|mau{z|m^`wqw`nz~|xwz}}wtrvv}ujhtxxk~}z}zxqq~}iptnvxYlyhckwmpy^`vV_|nuy||{~tw~ihlxnimmpnykt|w|v~xy~yp{voy{{gb{xsz~~~}rpsznq~|yovmPihzwUixsZ_ni}sox{~y}u}|~zſſǾ÷ǿǼ¹Ż¸Ľþ¼Ž¼ýNQPICFIHHFHR`mjXKKRUWY^daWQW_dgf`ZXZ[\_`aabdehmqsssqonljjjf[TX]ckjjfa_ekigkl[HJTZac`X`ia`effaZdea\eqjbVci\RWcfZPV[]\ObihXRROSSQMIJPSQMOZ`XSUTTVOHMX[VVYY[dpq`SP[qaWcbURW\]\[Z[`ccozqddh^QSZ`ddfikkfgvvdbolcjkdimc`gicbilkkqjVZdagpkhornggwynlhgi_a}vcmjknchtk_[_hprlc^akl`[a_[_fhffegjkhimllmigfgklmrufckf`kjmtupliedgebfd^]^djie\Z`fjlibfpl`Z_bccbhh`[YZ[a][\\ZWY__]dlg][^fhZR[cefbgvuiokhojqwcZjx|xtwussstsrrplihhqo_dttouyoafjcahoqootuwwxxo][yil}qePe|i_dpjnpU[ssow|prthq\`pqj|ufV^SQbkefjjogpbhiUVluZUZ]mv`\oxxtnhZ\U^i`dgiM_gs`YfgXFGR\VLUm}dS_bVO[V\tjgyku~f`gjjpldge[dojkof\]otfglnllcdnq[NqvRO\uj]jsmtzwuucYgsq`mudm|y{x}rktlsuypnp{vq~~bgvz{~~vrrpnwpxsqtsq{tp~uhijkqooy{vk|~urmr}x|ote~xrnib`sjqyjqzrfjjr}}}vu{vf>]zmv}_}hnstshpy|zw{}kptu{||yvx~|upjqlqh\kvaW[QVTX_dmigxsYuytwzox}~|~{u|uv|jR]|twyqys}zxjrWfcWiica_prf^dc}}zy|un{oac~r~z_q|||~rzs|zwqosqxr{khrzqd|x~uy~oo~~zzgpmfm~`muodjwkanhzxyffiz{}~|~unnxqxs{rx~|~||}s}xn{x}fbz}|~r{|{vow{vy}}mrqUfj~~bgmycfmk~wqxxp}sx~{þ¿ƿž»ʿǾþ¿úľ¿Ŀûƽ½þNPMFADHGDEO_kk]NHNSSV]feZQS_c_]`\XWYZ[\^acccdhnrtpmlmkjjll`UY`befeddinngbdnhPFNY^fh[Rbla^bbc_\eb_]hsgaW`eYRVaf[MTZ^^SbjlYMRORQNMIIOQNJNZ\SOOONNIFNZ[VUTT]hrmTHMbjZ[`WLOWZYXWW[`disticd`WRU^efegjhfhrykcmogjoiekjcdfd^cmjcls^S_b_ipfgpqkdj{zkklieammclnpifmnd]^biooj`]emfY[_^^cefffegihghkkmleddfjmtsidhifckluxpmkgcehdega[[]ekd\Y[bfjhdemoh`^adeede_ZWWY[_YX][WVX]^]ch`[Z_ffWPZabcagsmfoihojpo__muzvsusqrsssprrnjmlnpkoqsoqohdhh`enpngltsrvxurdhcq{pg[g~pklosor\\mrtx{rsvlobfppq~ythTcY`glmjlopkqgllZ]vrX\[aoxdaox|xqn_dU_h`c`eQ]hs^UefT@DPYNJWeziS]cYMSV_|kd|qs{ibhmmqsecfaemkknh]_stkkmmtnfgooYVwuX[fwk]jymvzswt_blrpfsunzxzzzyrrmnzv}rrtxnuz}z|_l}ystsjvlyyurttuzot{seecgnnry}khytqlx{~|t|m{qe~~wspjbhwrs}iy}wsvvvt}yaEixtlagkvtniuy{wxxzwwy}~}z|zsogplmb`qn]XXOTNO]mmaoscZsxsufruy{~wx}zy}|||v~~y~~q~t`yw||ut~xpozXgfZolfje~|oikfu}{uimv}^t|uw~u~zpvxvxqnqornykjrznZzsqv|ymk}wuuckfdi|jthukltpVwxk{zw`~x|tx~z{z}~{~o{sjew~z|q{|}~{}oxw}z{vksbdjniiylqmquvxpysq|{z½ǿýķ¾¿üƽ½ĿKMJDACGEBHZjl`QLKNPQXbfaVQW^ZVX\ZWWXXZ\^`bccbfnpomknnmkjicWU`cdeeejrvreY]flaMLT_fh`OTln[Y_`^]]e`]`lre`Z]_WSU^c]KOY\_Wakp]IMPUOHLIIOQLHNXWMGHJJIIKTYWRPPV`hmbHBPliXYWNJNWYTPQSYcglokfdc[RR[eifbhmgfqwqeimkjnoihlhcdcaagkdbpnWT_`dlibhspgem|{ebpm`atwbbnrmfinh]_cejnk`XZho_V\^]djfdefehhgfgijomcaceiqzm^bigfhku|wmjmg`fidhi_XY]ei_YY\bggdemnkea^ciida_[VSUXZ[VY_YSUY\]^cd^[Z`ieUOZ^_aagnhfnehplkh_eorxrqqomnvzpknqpnolkotxorppljhffdjqpjgnsorvtqml{wezrmlhl~yurqtvopa`ms{zzstusnjmpow|ywsiToblklpnqtprsjooffzp[bYeryefpt}{vudgW_f_d[bT]is]QdeNBDBBMalgXLLLNPU_c_YTUYWSW\\VVVVVZ_aa`abcglnmkkmnnkg`YW_dcegkotythZT_iibIKZdhaUM^riVYb_\Z]c^[blpd`[\[URU\a\JKWZ`\_lr_FIXYOGNKNOOKGMVTIDGGEGJOUTSPKP]bcdZEE^saUUOIKSYUMKPU]fghkjb_aYQOalib`gmnqvvgfimjjomjmlgdcaadjfaindUV_agicbhpnfen~vYauoaeul^grqdclmd_cfikmeZU]igZV[\_iidegfeggeefhiok``bfjsuf[biffknz}tklngaiichg\XY\de[VY\bgccjklgbabgkic_\[VQRVYZW[`TMZZ[\^a`ZZ^alcRZ[^__`giafk_gpje`cknoyulpoiiqysmmlmoplhlsy{moomhhjhcgnrkbkslirtpkhuro~rmqruzztstuvnljmqx{ztstpmlooowxvvrhmpionosquvrusnqpmq{o`dTgs{djpt}{yuelZ`ebbYaU\kr[QceK:AOQBOWXvv[V^ZHOVd}ibtpslllppszhdqikomnha^pxusmo|oilpm`it`blzyl^j|mxwpzo[jnoporpsz}}}xrrwfr}|uvzwtmzquteoqzfoqo}{xvrrvzrnv|oaaZejmqxkcxofli|}swqknzhwznei}ulwvhli}{{vkxyx[a}v}^zsfkqno|xut}xnx|wwpdmle\`mh^ZUMPKKdijulrqdhpnbkturmvziwrp}pmnvz}xuyyumlmlr~zzpztlquxvp]gwh|tqyqmvxyu{{hq}suyky{}{ry}|nvtrqp|yqnnkitpuhhvwo[}zq{wkhhfco}zlie[`]_iv}uk_tqzrrjsy|}~}~pipvhr{}xwvw{ozquyrlpjizseout{|pyru||}~{}jxy|z¾ÿ¹þ¿ü½¿ľžſ¾ĽFDB??@?@GUcc[PMJJNRX`_YVVUUSUZ[YVTTRU]dc`^^_bgihijkmmkicZW_jgdfmrvxqcWSYbhdZNT`hcZW[ms^PW^[VW]`[\cllc`\[\VRUX[YIISW^]]lr_FM\_PIRLVSQLIMUPFFGBAFKSRPSPIT`__aZGQlnVSSJFLVWOHJR]figiig^[_VOZgic]dkorsonhhhmmoonkmkfde[[ii^_kl_TW^de`agknlghuiOi~hcqq^^rvj`dkgcddfhhi]UVdh^WWZ]dmgbhhdfhgddfjlkd_`dhmsj\\ehghmx}zplqk^fmfdga[YZ^a]UTZ_daaiojke`dhkkc][Z[UQSUWX[bZIQf_ZY[^^VYcdgaYbY^acdfeclkZeoeafknjp{xmmkjiisyolkjlpoiisyzxmnnifmnidkmne`rqcismgcf|mxykpwvrw}zrrwwslouss{xtrtpmlmppstttssvroquuutwxsvuqrsnv|pihTjw|bkot|{{sit]^jj_X^XgnmYRbdJ9@OO?QWWtz]S_XOUTh{kf}snqnoorrqo^sqkopoecaoyusopzojklncg~wbcnxxoamyntyts}j]lknnlps|py}|ywnovjsz~~}uy{wrwvowqszjypdn{y{{{kn{vjw|n{lb`Yejoquaq{yibgc|utzqkgosenkbkxkhy{ajsw~|m}yv_p}unblhkloq}vru~n~~paoib\[kj`[PLQORhfrxi|gnkidfsh|unh~zy{o{t|fptnwljlsyzrswsoifhfo}{zvq|kepv|sxs~anzr~wt~vox~x|wwqn~|qzxhyq~vuiuy~ntxpokt{}{romognoricytnbzzpxwibb^_huzticWT]\Xhuxyx_w~txyxxp{zyxkl}zgrzxwuvvnxoy{{qzwxipsltycmz|{~xq}rv{vz~utylmu~y|~üþý¿żĻ¿ſľĿ¾¿þCA@?@?=DP[]XQJHGIRX_a\URPOOTYYTQRRPR[de]WX\_cfecejlokea[Y^ikffnuyysgSMT_ccd[YX_bZV_ntjRJV\VQV]]Z]eliba]XYVUUUYWIGQT\]]fr_HN]dQLTNYWPKIMQJ@DE>>GNQONUPJY`Z^cYLYmgOOMDEQXRHFKVgjehkgbXW]UWcfc^_ghqsinuiilqqtrnkljedb]`ha\foeWUU^b\\gnlkjgj~[PrcfpdYk~r`\bfdfiffffbVU_igYTXY^ln]`ojchhfcbfknh_^cfkpk^Yahhhkq{xmoqcapobeg]Y[\_^SPUZce^eokhkd`gjih^[[\]WTTSUWadRL_i_XVV\\U[ihgd^^W`ihdegikcUdkcdookirvpnnjfhjtqjkijmqnkr|ztyllngirponojiimsleptg^]km}riryvou{xrtxxomrwqx}|wprupmmlqqprpqtwvqkrzvwy{|vx{suvox}qlmToypalnp|{zpt}cjzq`]Z]tmeWY`cK8AOJDA=;8;ER[ZPJGCISXZ\a^PGFJSWRKMPONPU_gcWPTY\]^`dfeed`[WV]bfgcjwynkgZOLT^`^^`d\Y]^^mrm_OLT[YTRVXUX_ddbabWQ]]TTTPRKLNNY]]_a^JS^bVUWR^XMOONJ@>D?<@HOMFQYNO[ZY^`ZXddUIEABKRMEDIScg_agdc]TV]_ba\Y[cffrffzxgjsrtskgjia_cccec`dlfXXY]dXXisogdbf~mS`}vdcYVnr\X[`afmlb\a`ZY_ebURW\`hjacmicghegjklqh[[cfioiVPajeeknquwoild`pwhagd]\[``VQUZZ[[fngce^^eghe_\W[`\YSOTZ]bcfjh]ZTOYdWN`qnd]X`injcfpk_]Zbmjhjniknnppkmiclsrbejclpporywtuvokin{ohjpqppqrspnnld_eztjrugo{rhkv{uitxngmsqo{zyonrqqpnpsllpiq}wsjhuwmrv{xn||mvzs|txtc}pcgppn{~vp{}|zrhWnrgfac_nmRFR[XchfvqXccky[Zobsquliqvp{}p}jgjjnsn_bcjuuqlkqlig_cchupblunyskpnfjoyvSbqfhijpv|lbvvfnteeuvs}zvxu||zyvzkls~z}ws~~yy}}|w{{fqxf`wv]nkaZLWjjeS]zm`laX^qgkof`^^a[e|iY\anddeh|_^ny{|{ysyvqppuso\jkeanzfsvnhgqnxnrxyz`c_Vix`M]TWg^h~ywhczZWeoujfn_c|thtt]vj|}sb[owmo~}u~|jpsrwyy~qwxcpepobr|y~}{{{dVowp~~t{x{{|}|ysz~xkusyzssiouv}|{i{Zwsysux{l~||~~~zyxrnbeqzsvlai`^wyd\yfgqwrhptaQQOOPif`a[LMW[Qc||vjvw}qqttuzzwsouwz{wqi{|hssklxtnjszU]{eksx~whyskqssjq}tqx}rwytqv~us|zw{uvrpÞqzrktxslszy{llitu^p{ttz}|wÿǾĻľľþƿĿø¿žĿ¾¿><:66>KX\TKGBGTUVY\YRFCHOTQIHNPLNU[df[RQUZ[\^`efb^[ZXW[cefehptpig^QOSW``YX^e_W]homicXKLW[WTRUTRX]bbaaaURb`PUSMQMLKJW\^_`^LU_aVWXTaYLPQPG@=B?=AGKHHRTORYYZ^_]]a_QD?=DNNHEFLXdb`ee`^ZSW`a`]YW\fgioal}rgpqotqgfje^^ddfe_agiaXZ]cbV_rsg]`cpcVkqa^Sa|}gYY[afink`\`_\]baZSUY\ckhemlhffcimkkppcY^gjkk_PWggafkmoushhg`etqccf_]__c_TRWXZW`oi]bb[`gfhc[\XZ`^XNNY`_eljcb^VQXdcQSgpkb_bnnigikpg[]\dmjihjhjminphglkqul\hjemnopuysqppokmvujppnmpsrquummohdmvkmvmirxlenvwoewvmhlqrr{zvnpqpssqrqilnhszrrkkppmpqtsk}|luxp|rtqj~mbgqps}~qs|xuxq^oqpofgiz`HZmgcikpgalfsz_bjfvrggrnkq}xrgadksl[^^cqphegkfc`Z]bjpkbmtl}ieplcilxqOdpbgknquyg_up\krbbrwtxzturwvsy{jqs~zu{uz}}vx|y~zvuiqt`\xsZki]TESki^PbvcXh]R]f^gfb_YZ[UfvbX[elch`gy^^pz|v}xsp{pmfp|sk^ja_]oyirshcfphuem|}}~cb]^pyXWgZdj_p~xehzZTbmqkjibnz~vcqsVppyzvpcXjwhlzm|{pyyrwz}uthulqpmx|~z{zv{}mcpxt}~{{}w|xtv~tmni{|tpramqv{|}ev\rysuvs|||{{{tmf_esprxbegYklZqjhut|xilvaIMSLGj^V^[LN_bSeu~~|grtnjwusyvvw~snorrz}zy{}}uiz{hv}vigxthjvsP_xbjtyduszlrqtjrzst|v~z|qqsrlr}umzzu~yuwytsjŚmyqjssqqqswxpumk}hmztw~}tƻľŽÿ¾ſĻǽþ¾ÿ¾<:87;ESZULGCCMTRV`_RGACJSQHFKPMLQY`ieVQRTWZ\^`ba]XVUUY^giffloookbUNV[Z__XT]hcZdnnd^\VOT[ZTNORRQU[_`_a`UXc]RVULMMOMIUY_^a^OW`_UXXUc[LQRMCA=@??CDHIKNORVZYY]_]\]\Q>;>FNLGGKS\aaaba]ZVWZ^^]ZXY^dhmj^q{hirmpskefga\_ddfd_aghaZ\bg_[kvn_Y`iyu^`x~k`USk{q_WYZahipm^\]^\[_]XXZWZflhhkhfc`crrhmum`^dlnldUTahc_djkqtidfaamukage\_cee[SVXXW[jm_ZdaZaffh`Y\WZd\OLS_]]mn`^fZRWbcWO_nhfbgkoifkrmlg^[_kniffijkklmieirvqth^lkflmmpvtnlkgnptwrqrqnnpxtltvnopjjpnimseksrfhrvrhcyrkgjotszxsopnprttuogkmhrtosmkjmnplnpj||htxo|nrrn|i_gvoxz|mywuw|pfmp~uklq`Lfuidkmjfnrm|zihjqwrejrgi|trviY_hrkZ[X[ijb_ef`_[VV\dif`mqi{c^oeeplunOdnafmpsrxh`qfWhm_]nwvv|{wppsyvoz~uqv}yjqwp~}}yrvzy|~yw~mnrm[\vqZgiYOFUgbYOcp[Th]N\^\`]_\WYTVkp^W\gjcgamp^aruu|v|xsskf\mtjaj]Z[ovkppaahnet[mymjglssZmocqjhzgmuZT_msqnik}zyzxtbonVnxwssmaZiuerqhy~ytv~wu|umu}{|~x{|tzy|wqpwuz~x{{txs{xtvwlrjc{mrqot^kpu{}hngyruvxyzz{|wxmlc\gmn|jdg]_x[hpf}xxymiufDGXKCkdQ[cMNmkTev|rnqrvrcvxvuwrusxunhmmmz{yysvzy}z~mw{m{}yibwykoynZi}l`nzzgqp|rkvrvnx{szyvy}vyomkpjq|vizyu{tpvsutiĖvo{tkqrwsssuttrhxxrvy~sûĿ¸ʾƽ¿ƿ¿ļ¿¾ÿ¿ĿĿ:87:AOYULFBBJRQQV^YH?BHMMHEGILMLS^eg^SQQRTX\^^\YWVUTVZakjdekmoqi\ST^a^\[WR[klgomc^^\UU\]WMJMPPPTX[\]`_Y^dZPWVLKMUSKRU\^b^SX``XYXWe^MQTO@C>?A>HQRLGCDGNQRTWRFBGLIDAAFIIINW``XSPOOOOOSY[YRNNNPRX]`_XXhqmoqf[\_`de`ZYWR]s}ob`^]XQU`]JDJWYSOMLOQRTX[]a^URYVJFSd\JDMRV`dWW`d_ZRV^aSOVV:ELGG<6BMVJ=L[]\WWYVTO[iK=>DILKFL\d^MCNQPJEGLSVRICEFGIKQW[^^^]]ckfcnofefhhhebabccmdWRRV^[UU\a^VIHKHIKLMPTUTSW[\TBQ]]\XWUKJWodBPYTKU``bac`\_TTZY`\[XF@O[XatfQ[f_]died_U[`\XVQNTWVYbfbcdmwqfiqmebdnpqsrpePBBISgl]KCJSQL]nggj[USQRUY^a\\ceadd_^XS]he_a_RLVcih_\bhieZZaekvp`dga`ea]cbVWddeu{eXc]Rakie]WZWTZ_[]`YNRa`RLOZe`SWgi`ZXWV[WW[ZXZcjikh_Z]`^^___bfhc[Z[^bdddjmffmojrvrliigffhkoqnknprnopoimnopvrqqmknquskilnnnwrakqpulbdhnomkwvgotlbjrxmgnsaonopffnijkkloqonokh{|^hbprjrgfhjjm`gfge_eeispx|ooqlmkhzxkxnq|rkks~~|{vnq|qpxrortwjipvs{tqtx\Un`D86BPJ@CPZVG9:>AOMNU\\^eM?eccy~~||rgnwbi|gTpVGYYWcdnyms|kjpxvgt~jqu|}zkgdowzp^qyptzkqtpx~ttsss}nspmrkhgd[TPY[VUX`]MIEDTfdXLR]gq_JOUWYXnelt`mvheymfq\hlgx]cxtqhq~kcs~r_TBEgkskVb`RKWVSfdQO`piV]kbiighbtyfp}}~~}|}|{xqto}zlxdZ_ilmon`vs\]rw{~{}noxsyxxpwjh|}phrvqhei_nxttwnszszfxnvwronoiu}x~u|~v~zo}uopotrmypjiZxey~x}x}}xzrroy}}qhxvww~Xxilzny~rpy\mzxz}|irmbkvtpbe_chcONZtfrpm]{dlj_Ziwiv~trwt~{|{}{wwuz||ngmqutquwu}l}~{mus`ixy~}ÿǻżǾ¿ÿľþLMPNE?HUVOLPVULCCA;=GLKHFIZf^K@FRPJCCIRTNEAADFGJOSY^^]YWY`ifbmqkhhgggfdfffdl}cOOVY\]^`]ZXTONJGIKLNRTTSTZ^\O?BKTTF67@BMNMX_ZbbH@mj`t|||{qijqknzjSdbIX^a`br{qq{pjmu|ko}nnly~wkebk~{tycnrqsznssmw|puxuvmxulqmhdleZSZ^^`cb`SOQOUge\VU[im]HKTWTXjeh|tdongg|}keoecgdq\_xtldrnisysgYC@orqlX^^PKZSVj_ISmr_T_laikkact~vamzy~y|~{|~~sx}{s}}vrbZ`fjoscdupY^}s|vzzvwhv|puwwlsggxvkgrspc_d\j~wtrqiowpz}jpmqusro~wey{~~z~|||sqor{zmv}tnk[wq|umpzxxyx{mcwvwzftwsxu{wv|m{~y{}z}|mlidkpsti`^__hXOQhukkxwWnrcij^^xzt}|n}uwxy}}{v|uy|~}~il~yfpyus}wv}ubuy}{º¾Ľ¼ɾƼȾþ¾ÿ¿OOLF@CQZULNWYQC@@BBHOMGDIW`XHCFNRHABIPRMC>@@BHLPUVX[[ZXUYcjigmohhhhgeefgihffv{cPQY`bcdd\Z`_VMIGJLLPUSSSU\]XL<;JY_TGCEDCL^^YYZY[YWXYYTQKDEOITS;F\N6CT[\^]YREG`tXCUWUP\b\`cb[[]SVY[c[]U>EVV]ppX_i\W]gb]YTY^[YVPIKVUP^c]``jytifmphdinqmjmcg_@>Q]d`ZPEHKKKXhgce\RVSKYcdd[V`f`_a`]SPY`bYX[QKTZ\_^X\ce`WT_gixyikuqebcbbZPR_d_jxkYaeY^gfgbSUYRQ[[Y^^WS^d`VQX_\RQbk`USRUSQU\WR[bfijdYVY[[Z[YX]cd^XUTU\eeceihdhlmppqmcltb^eqtmnmjopkjnnklnnlpsppnjintqnikpvskvzjqwtsojikmllmrkhllglnokafnmfutqkndeeidddoqjnppozv`kcktgnkcgnfgdagm_[benos{}lfkvvmemhlrdumj}pack}yzrinxulqqnqqslacov}{oglp}t_frZ>6>GLBESS_ro\cgYV]ca[SS[][WPKFLWWP^d^^coxpfhonfflnoklnbgS:NchcZTFEIKGNbkeb`TOUQL\gf`WVce^_`_YPP]b[XYTOOSX[`[V[cdYQU_glzzkp|qacdb^QOXaa]juaVec]gcbi]PWXNO]ZX^\UW_daXTY]VP[jfZURQUSQWZRR]behg^USWYWZZWYab`YVRTWbebcdifcgmmooohdts^bmzsjljjrohimnjkmmlponomihntomilqwsj{zjqtssnllpnllnojillhqold`iojjxuoina`fh`\^omhlopnvvakfcwfdncjnghfbim]\bfnqu{{hgrtoffohjgclbn{d_blyymfpyrkrnlrqne]diz~zxhfjn}odinZ=7=GL;8ADNSE4/@PWONidWj_H^zl\mzz|yplcgsuvo]^{pTZioacx|unvumnmswopyhdm~tma\izyks{ifrtryrvrhuxkwv|wq}cjpegjcfifhntmfefg_afhgifZYln^MHSWPXefenqrolkz{ofdim^\`dX]kpjaittvwursmaLfzypmdbNK[O]fPGik]VZixhkioknuztuij}{uzoy}wv|~}{}{yttvz~qn||zte`nuyupiqsljk}{tr}trsq|wds~qryv{nrihuwcjwsn^X|~a[izyvqi^jmgu~qc}smty~uzlotxw}|xrpty~xuw{vqk{xw{x}oclyzv}zzxuvw_Zrv|wy}{|{~wxv|qwxsgdkiglzjZ[XWYYQ]iuouiq`^sq\Sdicy|vuowqpnu||qxt}~~|~tvy~rv{s{wyvwÿ¿ÿǼÿ÷ȻǿÿĿºúſQLEBKW\VMLUYMCBCGOSRIBKX\RA;BGLPIBHMROC99;=?DLRTUVVUUSRST^oxsnjccimmjhfgjkgeqxgXX`fhfb]bjhYMLHHLQTUVZXVVSPSRC?KRWTNBFGDL[[YXVW[\YWXZVNFNTQMW[EHVFFKQXZ_aYMEH]nQFSSW_^^RXf`]YSTYY^aY\S?GPQdvnce^TW`c^TPV[[ZTLGEMXTQ`b^_fpujekpiciomjijghmG?foeYVJCGLKLXhhba[MMUOL^fcXOZeaX\_\SPV`_WWUNLNQVZZYW\c_TQW`hqyuozibia`[LS`a[]lmZZgc`e_biYRYVMO^ZY\YY\_dcWT[YRUci`XSOOSQRXVOU^add`VPRUVUWXVXa_XXTPT[cc_`cgdbgmmmmjejyo\fpzskljlsmfjnmjkmmkomknlffptomhnttqqukrrrrnmnpnllnnjkpomwnfaflrfmxumil]aifZW_nhdmqrjppcmhcvf_lhrqkkhioi\\bgmtx{ycgtrgcntkc[bdetrZYel~xvfiszrksnmspkc\hj}zxobdfk{wkfllX>8@FK:7BEOSC3.?XaQVseYl`Uhzk\kyxvxuol^_qxyo`]wv[[lsfew|tnsumnmq|skmddt}tm`[fu}yhkxjduzoppxpfuukx~sxur_imbfg`oulir~uqnjrkechist^Vmx_OLSY[Zchglorqkl}vnfdil[X]cX_fkfberuxwxoopo[et}trjfNP]UcaLNlf`[cl~nkep|rrtursmjs}uyoz}vq~}|}zrxy}{|zrkityz}{smwx}xskqtqvssotw}|zvvvpoq{zdq~vstx}otoiv{bp|to]^{~`^jz}wpgZjkmx~vez{os}~}rwzyx}zsrx}svx{vs{zz~yyvl]lszw}wyxm|{u]Xpuyxz~vzx{s|vuxkajiedtuYZXUWXPYfxqtkleX^x|gRVhdjvtjwznjjpxz|psv~zxurzyk}|~vwü˿ƹɼſ½ŽŻĿPJCFR]^UMOWUG>CIMTVLDIWZN>9?DGLMJJLONE;78:68<@FMNJHIIE=535:?BGOSRPOMKLPX`fea`gpuy{wmddddffhlbVbzvcafglvvnf]YbaTKOUXYZ[a`QJE@ETYTQTYOIKWF>IRTSSVRY\YXWYRHHWWNSVWQIMGIHMUVg\M@B`yaIKTakXTNR_gb`]\]YZ_\YWRIHQcx{l]UQN[cYKIUZSRQF@AHROI]f^[dok`ahidcjkgfggivvTbnWTOGFOX[U[ee`]QCBPVV`dcQDVd\RUXRKNZ]VQNGCEHIKRSKLVYTRX[Yat|rk~qkoig_U`lbQWc`YYcjliXSe^QQPNIUZUY[^a\`jcWXbb`a`_[TNIJTX]YQV^\^f^PQXWROSTSTY\TWQLQZ_^XW[ZW^lohffdbvn_acmtqiifhslcgmojfflmgggfriahqookhprkyvhlsprnpwyrinoqmns}qzrqjlotsptvsnpqjeicaagbYbqoslbnnjiklffpsvmpmiuq^`mps~jaspbfw~tfded`kpfObpvutmbt~}livousdmkmtsqpx[Z^acbcbfqoYDQbO?9EQRPXO2/NhdcsvjnqpjlpaWavypljieidXhlsub`ke\fknrjakqqghieskqqivz~rV]sri[S^ongdpucZpj`hmZpormpvhkq|vtY\YTb_Yz|qqt}zull~wWox\\]dqrrqmio}pat~{jiboubUOZb]dhd]_bopdnwzklw{nmtpnuoQnpbfe_i`\hexjd^strxekvolahzx{wj~yz{~{xswrvx~wxyufcdovqnotyr{yw~~z~zqyz~|}nlrwquw~ztnouzw}vy}~gikjZ`swx~~z|z~{x~w{yy{|ssz|}~p}|~xliOomzwhmwznmnmtqZhtfRUgs{~sz~~~{rw|uysqrsxumbkeb^tmRUROUVDVY{shd\bZPdraRYfccxtb`issaYit{yzx|}twĪƻƺµžļɿTOU[]`]VRSPJIMRUMC=BRTB67<=@JROIECB=6247=BEIOPNMJDFPZac`\[apyywuofcdddeffgd]k{sa`cfmuoeefhlaWSUY]\\_d_MB@?EXd\S[\NLOTE>JSSSTVRWYXXWVOFJYWMTXTRKLGIFKTXjXC;JiuXHP\ihQPMVcgeb__ZV_b[VWVJJWixweUQNL\aSDKWSNRMB=AIQLNadYZfng`cfcbfhffgggk}s[w}\RQLGKT]]X_fb\UG>DQY^bb^KG[`VQTTKHU`ZQNICCDFGKPMJOUUPVZXXexxjo~lnmdg^Zfj^SY_XV]gpqeSRaXRPLKHUVRY``a_di_W\cca`ab\RLGM^^]WRX\Y_eYMV[TPORRQSYYWUOMT\_ZRUZVWfniedc\kybZchpsmefdfpjbgmokeclmefeetgahmnqkinpp|oiprnnkqzzoilqqmpryqyntopqsqttrrptxmdjgcdkg]fqksvdkpigljdiqstonijxo`alpxugfqmfnyzqfjjdfipoJpt|lxmfv~iivotqhpnwtntot]X[^^^^_gso[Q`bREDQZ[T_T.6\gboxqlomihgg^Vattnh`a_ah_ehitg_nfRdmipn_blpibdbqmgxinqypZZprh[OZpkcbpubWmh\d|mZokkhru`dp~w~m[[MMb]Xzyrrrvlo}~jthdei}zqnqy}ofzrikcrv\VX]eaef`]acntikw|vq{xkktqrqq_svk`blradptdbatnmxcn|oi^m~{z{kz{}{xwtwt|}{wxlccqvroowxvwvy{|qw}zqpqtuww}x~qkt|x{|~jnoi[ftz{}}w||}z|}|}x}{}un|xz}vvvwkdPpivmegqxmhhkplVf~n`PQdq|}}|{vt{w|yz|~y{vw|uzurq}ozymcjhb]hqUYSKLVGKUg~adZ[_URlhVXdd_i}v]_glrgWbp{yv{z{s}{Ⱦ½ýɼøĿŶþĿľǾYT[`^_[UQQPOPPRPH>BOVG637<>DNRMGB>:5357:AGHIKKKIDAJYbb]Y[`hsyunkigeffddcdffjrwrc`cekpmhnrrl_YXW\a^^_f\F>?EN^iaYfcOLRTA:FRTTSSOVWXXWTKCKZVNV]PSJHFFEKSYhON^deaZOER\TONNKBQeYKHC>>@DIJJHDKQNPYXNPcqpjo|vhkmeec`dhf^XUSV[eoqhVNY_TSNHGOSSX`cdb\^c^`bbdegkj`RJM]id\UV]X[i[MV[TOOONNPSUTSPMOX]YPRURXcnebg_[iufS[fmonfcgacngbhjjfa_gf`d`lo]^cfpveinxzscp|rkhdq{umhkqsnnqqopjnrsrpovtrpkszodhgelsgamshknlpnefkjfnvoxuwqihrwiefmqqupikmlmssqppokkigqy_usoqppxefpolstrs|sp{sog\\]]\[_oskejreaRDXadde^BRse\jlcfmg`bUR]bgfeg`TTTUbg`gcehXiqJTnlkie_blode^bwhoymfapnTSqu`WPVlf^`qubTc~fX^pkbrjefsoMTr~|sod]TCP^Q]unsto}y{rkuxyroy|tk{wv|jx{\^hdwjcjSYcfgpw~osm~ljtp{znkrhq^jvjn}waknmfkumavga^}l}}xgxxhu|zyxxx|}yy{}}{yuzxirx|yw{ttxlp|~xyz~pfou|zuz}|yxzz|~~~~wqq~x~yuz|~kypxzwu~y}{|yqx}mx~]^s_qa[fpulgkolk]hvk[QViq~zwzxzuzuf~rwxzz{vvwsv~|||r}tqxvutk|nifkf^\k]dcKDMPCPWtw[\WS[QZd\UZgobouid_eiqcc~|pxyxŮľÿȿǻ´½ƺƹž`_ee`\VUUX[\YNJIKOTO<27<<>JTPGCA:3136:>AEHIHGHHEKV^]WSV`jkhhnqkgikkjhfdaacgfftyjabdipmmtuj^ZZ[Zahc]]gfG:5/0368=DDEFGGHKLOWWTPS]fjgdaekkgefggfda]\`ef]bs{n`\\ajlmnfYMNW]acb`^Zeq`HPUTT]feoy]X`P6:FNFEQPNPTZZYJACLQQQZSOSJFIKNLJPNGVcjZP^hpcSRTUX[ds{oTXlkfTWegXYbkrpbWUUX^VE@FMLJH>68HFBA>@GGGRUKKWcgffni^jueZc_W^dcb[RQXdhloheb`_]]TJJT^^Y[fmbW[ba_agmokhkj_W\hje^YZ^abdYJZbRJMOLLOPORRKDLVUMHRMIZ`fcbdZ`kpVLZgigh^TZ_^hqjb`de^Y\``]W^lbX[eghgpjuwsj^g{rn]dnqxtjdjstmjojdgehsofhlloqnjklleefijiome`gp{rnidjmqpnrkmppknlvseemojjtslnqppskmqrninkhlquytq|wljpnedgmhotkuzmlzzl{tfe___frjgide`fYVaTSceahba\YaYaaYjod^]Y`kgb`QFIFFWd`V[^VUYo`GZhobYfc_jf]bSl|bja[[W`MPoqRFQ`cVRnv^Nb|cV_etzxk[YibUi{qjknvZ=MaZYefbp}}zxzqhgqvqkix|zusw{jsuuulh\lt[g|urkkyvcnxvd|znov}z^e}ilnotw\bofngtx}qpm{|{tw|zx|x}z}pkyw|uwvpysrnolmmfgr||jz|yvx~y|y{~}zwnptqip{xrrqkjp}vloigrqv{vw~|lq{yiow~~}t}dpdw}zov~v}~}tuopstrx~xu}xsqp{~z|}}|pzzztt}b~x|z}vyr|f_}z|sq}}}pzno{{uoelixrhqcsngwcMDPNT^ctmnqaZXatwnso{twf`ys~}uv}|wx~½þĿû¿ž¼ƻÿſ½Žcbgfb\W^cc`]TN[eYIA<56>EHMTQF@;0*/8=:>EDDEFILQTTRMKNYfkf__`begdabfgdb`\ZdkeZ_r{q`YZ^fkli_RHLW_a```a[ctgNRXVX`ggrx^[`R78EMDAQSONR\]XHACKNRS]QKNFEKNPJKNMRdfcTQaml[QTXXZ]jzybP^lmbUagc[_fmql`YWVZ^N=AILJIE947@PXPKPXbhbYZ\T]tra_koe^cu}vtiYKIW``fke`cjcL=AMY_ac[MOVSOKFDC>AQXOFGE<47CF>;;<@FEIRNJOZcbbhh_arp[]dVS__]^]VS[hjlldfg`_`]PJMX_ZW]kjZW^b`_cjmlhhmj_]afif_Z[`cdbRN^^MHOPJLPPPSQHFPWMEISEP__d`b^XcngJPahhefXS\]^lpe^__`[WZ^]ZSak\UXbhdelnwtk_^k~rf_fotwrjbmvrkhlhcccisldfkloomkjijfefhhkpja`gs}qliejnsponglpnknlvqfgmnhkrqnosqpsknsqmkoliortsut{sjlpkdbjogjpftxkjurm|pgfeb`ipgdliafq]\bWXadgh^fha`U`d\injjbY]ghc\MEHDASa^YUURPQefOQagbYej\efY\Tfcb]T[WXMNn}qRAN[_ULmw]I_w_X_bzwkWVgbcospmo|vODSg`Zcdfx{~yvtme_munii}}sr{|~z}qss{nvzwtnskux[qqqzzjiw{}rrtpq}|~v{]iipvltp]knqzgvxz~qto~{|vyzyy||xtwx|na}xxsrqp{qngjkkkcfsz~ov~}zvuyyx}uuy|wrnhn~wnihtyknpffisvnwqdfkppwtr}}mk|zygnx{|~}v}}j||ey|tz~{{}}|z|~~{z~yw}uxnzve~zsxl{ti}bbyvwxjo|r{x|on}shmilzslq~mv|l[L\YYkqzpo|nbcr}w~woeq}u|~~zuxyƿſľüľþ/ľºŽddgea[Zchga[XZekR@A>6;GLKLRSD871-5?@FMJJHA848GWVLKS]ee]U][Qi|j]cmi^^iy~xrcVKO^a`jkb`giX@;KX[]aaVLPVRKJDA>;ETUIEIE72=D>99:<>AFNOHHQ[`^_c`[grbUb`NPZXX^_YW`jkkhflg\bd\NJR__WVaibXY`a^_gmljgkojcddfgfa\]cfd^PSaXIGOPILRQPSNHIRRHFISDW`_b\`[]cjZKZdhfdcTRZZ`om^[\ZZZWVZYVSdhYQVaf_fhrxpd[_nqacgpuvngbpvohfmj``cjqhcehkollkjiigffhknmd`cis|pkhhlpsooielrmlnowphikkhlpqnowsrvkntollplkqtrrzvvwokqrwiaboqeimdrtijojnxefhf``oqhgmjf{x`b`^_cgokcqtphYcigknqmd[Zahf]ICJHBPb`]SLNMM[dTO^__[alcbcXXU]fTZNXUQIMl|qS@KV_NEkuXD]q]Y[_}rgTUeimmnwsupOPbn_Zdgp~u}ssrg^Zijglgwxjj{zsvx{ynuq|q}vuww~zi|ns|jgw|zxp}zttt|w~}tscqix}isiavy~|~gv|t~y{pv}pz}~z|vwywyzztqtv}m^|zupoor}njbfmhkagtz|}vvtx~zsvzvv|tuws}vnne`uvlmantlilc_fgqtnqfailllunw{lixuvehzvwx~xyo|so}{x|{|x}{tunrk}z{stfnscvzecovk~ia{szw{usthtkuzy}lqg]mij||zy}vlm}v}w~~~xvtyyĿ¿½º»ļý½ĽŽĽdcfea[\eggeccchiO>DA18B?789:<<=FPKEMY\Y\_]X]ihUV`UJPSTZ`^WZdhhgfmqc]dc^SMXb^U\kf[Z]a`[_jkhfimnkfeeggfd_ahhbYPWbUGHQPGNSRORMIJRNGIKMPX`__]`YaccSV^adda[OPYYcog[ZZZZYVTXWSVedULVab]efwth\Y]sibgfqtsjcdorjdfqk\^ekmfcefkojkjjjjhhhjnohbbdis{nhdinqsnlgemsllrsumjiihiknpmryru{iktokmqjisuqwvvutmmvurfafqngijdqnegidnp]hig\atpkkkhj~igedeimuopzw~wdjpqqpplg`Y^ehcMBFNKNacbWKMKKO\WO[a_ZZfjb[TRSWzmRSHQULFIk}oRAGV^GGkoQA\k[VT]laVV_mrij~|~mX_ro]Xir~ro{oqn^WXebfoerrdauy}xnxwrvvkvqvqt~~u~{|}m|qfo~yx{upzsqsxyr|yu{qiw|i|dpee}|}{dr|xq}~lw{rz||{yyvxvsywwqnrx}zi]}v{tklnt}kg^eofi_htw{zzztyvs~xru{vvzuwvkt|wljg]gpnpcgiochdZbaeqmpj]ebkaumn}mjrxrsic|vuuy~t{gzz|{tyx{wso}uz~rpjlqakuhadthp]|}swy}xv~xnus~|srzt~|{~o}k~{z}~}txz|þþ»ľ¿ſþ¾ǿ¿ƿdbdeb]^giiikjfgfLAIGCMUOHFNQA5678?DB>GQPOPTYYOFDIT^cb^\\^`YVYYW]eiga]``^]chc`kvp^SWYZ]b_SMXb`^^\Z]_]bwx[OTZ_fjkme[^_W<;LJ8AY_UPU[YTIJHKXVWVRPMFJYMFLMXgnf[QQamla\`_][\gztfb[gteUafc`bgjnme_^_aaTLXWJJJC<36EWUGFS`b]X[aYOgr[`gh_[cpyxmZSVPV\\ci`[bfZD:J__Z\]YQMOZSED@:9AQOBDNF31=?7688:<934789:N__VQUYYXYPFLYZ[XX\SJSZQOPYhulXNTiohddda_\\`jrle[dwqYWecbainoofcbcc`[_fZPLMG?98F\WCBT^^ZZ^aYMcw\Zae]V]kqpeSKNWYYWX^]UW`[KDO`e`][[\PIUbOD@87BJG@CMD339:313679;DozdTCD^]KUbcSJ_eUJKf~t^ZYOfye_m|~tmm~u_avzmaln[daMJS^_jiTnyi\Yw~pp~qevsqux~xrutyx~xzusoxqqriruufrhrqkkhwpmqlom{uvjttzpn{|{s~lnfwzrnryz~}zpmkz}ytrsw|{vtt}}}}ytw|wqounfknrutnhr~|wqgfwhltpj``ppYUjr\adtohtzhm}ry|zx~txwtvibotjgkha\bVTcfzfiouigj]eVZkle^VQXZ[pd`{sflvsr}yrqsrrpvqwoe{l|x~xux{zvms|^a}cl^dckf\ajfuzhvx|~}zpvx|~qo~nv½ýýĿùľƿûþc`abacmqpomlhedYIMWWU\[LBHSYUMIDCJPSRTVPMRY]VPVYXZ[]ZSS[[UQPRVY`eddcacdeecYRYfmjcbZOLR[`ec`\WUXYVZ^_arvb[]\ahjg`^___[GANGDUa^WSVZ\\[JER]_]]b_QR]_WSUbsyjTO`plehida^]^enmhcamwiV^hb_cornkfedddbcjgXSRMF>:@U_NBM]_ZY]b[OVvm^__\WYdnoj\MJPVUVVX[XSX^XGEU`ee`Z]^MH[dL?75;GK?ELOSTQKKSRPZa\PJNE>EPUYXUTTZ_a`aed`_bdb_^[bbRSfj[]f_YZ^dd]_eiiinibcdekk``jle\Z]fiPCZ`SVZTNNQMEIKEDJ\d]XXZYYWY[Y^[RY]b]LCEKYklZTXRLSYTLLQMS``LDJT[\a`fn]TS\{zd\\afgi`\agebhjpgX\bmnedccbinljkklppkjlolgjihnwwmfmjfihhhaiqnuifkkgcoohgkmpswr}vgppnomfcmtptyrovrlu|wnrqckqomkhefl`]_aUVblhcggkng`^lhhxiclhqzs|otzzvu|xokihghhdhmfcbYilV]cdfcjXG]\NOJRefMNanqaE:K_l_G<@KH=HpwdWFF]aTT_eTLffQEOl|o\XQLtu[el}uqlv~l`n}z|pfcmjZd^KJS^`jeVpsh\b|mozlszuuz|vxuzz{}xyytoz{z~xtieswvl~oiyoihjwnrqnorsyltt{inz{zsrkjg}xkqovw{ux|mkhw}}zspnsyyvst{x{|sqr{smqtidjkqwuldj~{rqknpcjsmma`npVWjs[afyoiqzmi{w~z{x|~|zyz|pkfftjbddbW][O_`vteowndmia\Xhod\XTVYYeh^v|mlxxy}yrorrplsqrrg}m}~}xtyx~|~smrh`opg]c\io`^ffmvq|y|~y}~|}x{y}~xnpnqȾ¾ý½c^aefkrtsomigedYIN[\Za_MFNVZXSPIJPTRQRSQPU_`URXXWZ\]WNQ^`QILQVZaedccbeeed\RPZeihdf\KENZ_aa]WQRWYWY\]artia^^ciib]_``_]JEONLYa]XVX\_`YFFXddcfk`VZ`_XVYgyxcU]kohfkie`^]^gmkf^hvtbYcf^\fpolieggffgfmfYYTLFBCM^ZII\b]Y\a^QMcf`^\WU`imk_RHJQSRRTXWRSXZTGN\cff`[a\FI`dG;44@NH9?J<-04200223689AKPPQMIHNUPWdaSLLF>@KVXWTRRU[`_]`e`Y[bda^]^b[NZjdYbeZWZ_aa^aehghkd]bedki_dljf^]`cbMJ_dYUVTONPKDJGDJScaZXXZYWVX[[^XTZ^cZE?EQcocSTXLJTYRIJQOV_YGBISY\a_fjZRSgt_WYcige\^bcaamlld[`golcedcbimkjjhltrkgmqkglkjqxvkgofbigggaskqsddjjbctlgekprtxr|vkqllpichoppvtmswokzsqyp_oyqonlgkl^[``]_ejhcfdgmg]^rg[pn_dmgzyix|ywu{ukhhfdehgjnhc``pmZ`^^fdrdAWlYXWUgoUK^rxtX;Kbm`G:CRI?Qsrb[JHZaXU\gWPjgJAXtygYUGSyfWij|zmlkyyhbtwuwhbgog[cZHIT_bkaXsuog[iyhhx~|wz{~rswy~~|~}xx~uo{xyt`gw~wzhtzjnfpvqvqupvw{ntszwfq|vxilzgm}qlqio}xxp{ztwpicsz|ys~ojnvvsrryv~{yknr{}qmql`aiip~uicc|{qpmpl]fshngbjlSVjqYag|ojq{nf~z}yw}~wknfcuj\Yaf[T]U]]fcm}tljlvecYcofXZWRWVcnZkul}~~~yrkpqoinqmsh}sy~wqzv{~|rlnwbh|k]eWfyd_bfhq{zu|}w~vzxz~yzxy{}|z}{rlqtt¾þ¿ĸĿĹſÿa\bilqxxtnjgedcXJP^`]caOLTX]][YPNRTOKPTVV[cbWTXTRU[[QLVc_PIMSX\adcccdddebUKPZbgihhZFCNX^b`[TNQVVWY[\artlf]\fji_\cc``]LISUR\^[XVWZa^REI[fffgkb`hk_TZ_m~w_Yflidjngea^]`hkifenwo__g`Y`jmiijeeghjkloe`\QKKIK[`PGTa_[Z_]SKSmx`[ZXV[fhigXIELRSOOSVTPSXWOKV^djgbaeT?Kf_G837EPC:FF1,32-.022358=FOMLLGEIQRSbdSLLH>?IRWVTRPPU[][X_dZSYbc^]]__VQbh[[iaVW[`^[]cgheeg_Zbccid^gkhf`bd`\JPbh_UQSPNQGGIDEQ\h_UVZ\ZWUXZ^[ST\abR?>G[hgYPXTEJVWMGLPRY^R@?HQX]`\bhYOUqkZSYehf]Zaa`^auiib]dkrjdeebbikiggbkxtieotjgnmkqyuhjqd`hihec{yirqbdif]eqldblquwxr|wklilnfcjqnowslqqlo~}nszncxvhnqmkmna^djjffgfggcdke_frk^knY^w|bgnz}xwtysgffedbehlpjc^aroadZSdfnrMKsg\fckoaVavxuDOimlPAIQZ`^W`hVN\zz`RP]ee`Z]a`]]gxeea_glskded^_ijebabpxmegstigrokryufmtc`hihfk|okrjahhbZbkg\_msuwus|shhfkibdkonquqllllq}wltxln{qhppjpsnddjsqjhefghbcfceiqtgdjZa{suq`u}w{sstypddecaadchpmd\arogk^Q]dgtbNpo]kpoklhiy|UZrz~WOegbdhtvle\T[sfTag[\icTRapwfQQ_srelnsvjpyyvmk|qkoelxogce_NVcmnh^^tprskt~jhy}ys{}r}{~}zzz~vu{z}sgv|v|nu}c}{wxzvrxouwrtll|j|}imlevqltdao|}roxtusladqqrvptocis}qhlsvv{xndis}qm~u_W_igr{fdazsnrneVludo~kctkTVhm``m|psuvoe~v{w}|wruoc^ZcclbWdrlYwgydsxrympmkudUZPRT[pqgm}vmjt{d]m|ylnpvzyr{xtrxjwsmyyokixd}}zck^ewpdreru~sqq|{ir|~jkok}{}vomtwxŰnzzps~{||ɿ˾Ŀ¾þľ¹º^_fkms}{sjd```]ZY]aadhe\ZY[bfh_OMQQLMW`a_``WOV^VNZ^QIPai\MKQY]_abbda\aca[OJPZaegjkTADNV]_]UNLMLOV[[Yevvn`X^imgadda_``WTZWP[[[\WV]`SLT[aginnjjljbZ_ae~ub`deehureca_^djielrvrf_eaW_lkhlkjifehjsvrraKOTTV`fWJWc_[\^TLMUg}aTTSRXdha^VHELVYTONONLMRTPMT[_ijfiiUPbc]UUZYVVVWVSWWSXceQ>=DNPQ^dO?BEBEPSMKIHIMTWVSRTWSNMPWXST[[ZYX^__rnWQUZ\\Y_hfa_^`_WQTX\^Y]gegigkg_\URhubRVVNLLLJ@E\h^UQSXXUVVUTRUST^e\F=EVaZX\TTL;FRNGFJMOSWL<=CHR\bXP^_NQiubRMTZ\\\]_^\Ydwj`abdhkqiefaZ]fg^Z^coob_lwqcj{rhovriprddkglqumgkhgpq`^]^`^\fnnpzsqneb]cf]bmnklpnijiegovpktpisslllkrxspolx|pkhiliddhgkmsrke_hxw{w\m}vrmkostlaa`]U\d]^eeb_\eqomqkRMart`erfjmtyrv{}}uqy|svuvsngp}llggos{vgl~yoz~}wwzuv}}ujr{z{sovvwmcqy}wpopzxuxx|zvx}{x{v||y{ts}}~zym}ys{|||~~ysvwsqjmnv{ozleogmvpj]enu|towtrvsgdkfhplqoxl[exuoeltuvyvmbiq}lok][aidl]jp{}jor]_uoksg_ogZemfeesswxnlqxuqrq~{wx}~|lbjgpqqtqdu|fevrxq}~z|{pio`T_bfnunzz{|sil~lan|{zyxz~voyuhjbuquqhormlev||yrwt|uvwu{fxzpymjcv|c`p}wa^bcuswzhiƿʸäs~|||}ÿĿǶſÿȿý½]gkks}zoke^^___`_`aaejha^^`dghbURSSU[bfc_]]VQXXMN`^OQbkeTMPUY[]^^^^]ahbWRMHMYceeggQ@CNW[[WMDGKNU\[W_lsqcTUcnbZ^eb^_`c_^ZWWYX\[WVZ[OTaefikomkjje]aiiosddgghprlhd_]^begknqqka^[W]mhfhongedgllv|u^Q[`Zdnm\Q^j`WXXQKPZh}ePOOKL`g\XUGCOYYTMJIGHNQQPMPW]ckgigXDD[iZNMKQWJ@>;;@@56<81-,3@JOURE<9>KTOQ`[D=BFFIOKGEFFJQVVSRPPSNHJORRRUXX\YU]_jvaOOUZ[Z]chb\\]_\TOQW\ZW_dchhgkha\TTpl_ZZVMMLRJAQffZRPTYYUUWUQRRNXa_PBFT^a[]^TPF:8;HG;7<=0(+1;DILLFBCCCFMRTRRSONMGEINOQUVX]_WT]aqnXPPSZZX\ef_XX\]YUNOV[VU`dcihgnlcZT_tg`b\UMNNTIF[i`WSRV[YVWXURSQOacYHDR^c[^f]QKGHIIJFGIFMUM:8@CHU_XPOXSKWkdQPRTTUX][YZXZno___aehkoiea]Z_b]VX`efa`djmhetvcehnompqeilgnpnihfbo|ndb`bbfikfk|s_kiYRY_VXkoa\hj\_ib]dhkknqa_pnjcdqvpnplmulijjiiejgbltqiggissyxcfunaktpnsjgf`][WX\YY]]]^^_eknkljjnipkcnmlt{q}{{|}zp{urrt}us~|my}uv|{vv{t|}yxy|~~{vy{{y|oizzzz||{ow}~yzzns|wp|ootimoxx}wqnwknosn_ezw{bw|ioojkqrkihfihrhUdqeoiqqtvvuoVct|v{tmgghfqk`lw{xis}kn}ppvmccdlvj\etxhzzkeqtnlwvrry}us|rwqv}}|~|w{u|r|r|vy}e`kupjmtwpp}vnnxux|tstw}wwz}tlk]mz|trmglwjy~}yt~{zy}w|}jafsmijf^`hs`Ui}hPV[cqsvrsü¤{|½Ŀ»þýŶſÿ¿ž¿¿¿ÿÿ`hio{xnkga[\^_`bb`^^flgbbccefge]YZYX\ceb^\ZYWPJQ^aSPcoj_RQUVXZ\\[YYafcYWRJIWdd_bf_MBEOUZXNIFFIPWZ\`ioqfUUfmdX[ceb_`cca[VVXXXYVWWWTU_ccfhhjhihie^fop}{qeeggkppjgc\Y^bchnoki`WUXdlfbiilod^beirzwh]bccjvxokpj]XWUPLQYb{lPKNJJU`\[U@>Q]YQKEBDJOQSPIHQX`jjdf\ORae^XTWNHJ=69FI=57;9+(0;GQWYQ>4;BFNNIQYI:=HMMHA?AACKQQOORQLIFDEHKMRY[\\TR[`drdSPNSZXW[edYUWZYXTMNVXRU`ddiffnndXVioecb\TMQVPHQffYSSTX\ZVWZSXSQXfaSHS_eb[baXMLIHHHHGJJEOUG9;>@IW]TNOSPO^h[MOPRQRY]TV[W^og]]]`cgjkgc_]]_^[WZ`ba]_ceegevpadbjonmoeghfmolhfddsyngcbeehikenwa^ncSQZZUaohWWgdT]g_[cgfgnk]`nhd_ftrknpknnfhjkjjikalptohfgnut|oelqd^kqnkuheg^`^WV[YY]YZ^^]djmihoxscnpdmklyvx~uwx|~urspruwqtwq{|r}~~~{}yw{zvz{~suy}{x||ruqy~}||wpv~}rm|}qw~uky~nilt~xrwrpnnqtjcszxpbxgpjlpuslihjderhScr]mqspsvwvrXav|t}vjmmldq~sfjx}suw}uqsoy|th^ewwk^hxw|myjdst|lorouxsp|qi}zyqqmv||~y|~|}v|~qTm}lft~qpku|rpzw|~}urz~uur}z}yroesy|yuht}o|~|u}yy~~|}wy~kug^nlig}oW^dnaRi}_MSbotwyizĽ½ĺžĽɾſ¿ÿþûÿ¾bhjpzujhe]Y\\]`cc_\]eidcffebdfd\YYYX[beb]ZXZUKIVa^SXjqeXSTUUWZ\[XW\egaXWPIO\da\^aWICGOV[VJEDDJRX[]ekmocX^ge][_cdb_afd_XTVXWSWWXXVX[dcbfgggfggigdfmt~|zqeghilmmjhbZX]beinkgd\SRUgmbdkijg[]ackwzqf`bbfr}|sppg\YSSUNR[g~{[JNNHKW]_aLKWXQMNONR^`SJMOOOQXWQWXU^kdZY]_^gggda__^^]\\\^_^\]__bigulaf_goninffffkmlgeeisupkbdgfillejl^cm^ORZX\jm^PUedS\f\W_lfckaZdic^[gskhoniojdijijknkcyptlhhgptuulejka`klkiskbea^]ZVWW[^WW]][bgighoyvdnrgmkmxzu{{ns~u||nsrpsr}rnquy~}~z|xt}|z{|zv|zv~x{wrs|x}www}}s{x~~~~}~upu|vyxs}nq}xkhm{}wsyv{qqqsufl{wy}ggufllnsvrnhgod`pgYbpXfytortx{x_`v|s|}jrtpco|yyrjwvx{{{tzo|}wk]f}wocnwt{uulfqr}~temkmorxjzkcxyvpqhwuxou|wrWumcuz{|golqur|~z~z~}ysts}uso|~vtoxy~zyp}t~xv|wyz|xx}}qlrXjkif{uUZai`Ql}^JQizkt~tźþüľƺ¹ÿ¿ľ¿»þûžÿcghovqgf`YW[[]`ec]X\egdehfc`adc][YXWZadb\YXXRKR`cYWero`TQSSTVX[YUX_ed^ZXPMU_d`ZZ\TGCIS\^TFCDDKU[]^ejnmd]_``^_`_bbcced\WVWXWTZ\YUU^aebbdffgghijigelvzxxoghilniilhbZW[dgjkg_^ZQPVim`cjggaUZabkyzncbddkz}rmlf`XPYWKUbokNGMKFMX_i^AARYSLHB>=BLRXWJBIQXmo\_^TTY\[[PLOJWK9;IQB=<:90,9ELSYZP;5?B?ELKKNJ@CORJ?=><:BNPKIPUQKGEEGGEIUZ[]TKSa`ZhiOGFITXTS^h`TSWWVXUMNXWRXabdgcdppaZgljigc\NQ__VVcl`Y]_]^`]Y[]XQVYcl]U[fidbcf[RMPICGJQNLJFMK@;>;>MVTONNNNS[YNHJLNOQSQUXRR^haWX[[]eedb`_````__^^]\\[[[`igqh`e[enlgnfeeeillgcehptskafhfjolgjidgkZLSY[eofTNXd_U_cXVaja`gZXec\YZgnehmjhqwhjjffilniowlpjiihnruslhge`cjgjhmmahec`]SRU\^US[\Z`cdfjnvwgnrkmjnvutxulrzws~sqzhtnnrqz}zlmuuvw}y{xvyy||zz}vu~z}xxu~rqvyp{sw{}wxq~yvx}~~~~}~~wrr{~}zs{yvwy|tejtx~u|mztrtsdszuzzcnqhjlpytotieugXmkedm__}zpspxf[v}r~oqyyin|xw{mu~~{u~vr|xn_iywlvtn{ywomjoqy|qbdchknif_sztnsewotip{rm~og~{z{ikqu~{u~~vy~{{rmu|q~{wqm|}~}{yz{z~pvwu{w|yy|yqxxW_dfcq|ZXbf_Ro{hTWj|yjw}z}~rŹſĺžýöĻĿſ¾ûǿ»bdfmplgcZTUYY]aeb[W\eecded`^aca^]YXUXad_ZYYVQPZdaT[nqj]TRRRSVXZVV]bc`^^YRQZee]XYZQEENV\\RGCCENX^^_cjnkc`]YZ_aaabdefe_XW\^YUZ]]WUWafdaaceegiijomgfmvwusjgghljfjlgd\YZfijf`]\WON[mj]ekeb[SY^bn}zj`cehs{qmkgaUY^IG^kyxTHHJDFPXehN=ERXRHB>;=EQZYNCAIP`rhYZWQRUWZZQTRVZF8AKL@=;;;55DLOSWP?5AKC?FNKFEFJPUOC>@<8;DKIGLUULIHEDB@CPZVXZNN[aY[j]JFDJVUOS_e]UUVUUUSOS[WT\`bceceqo`]hihiid\TWc`W`mla_aba_a_]^^XQYYirYYciiedfdYWUQF@IQWSNIFII@;?;@NTSOONOOSWRIFGJNNOORXVNS^aZVXWY]bcbbbbccbcb`a^\\[YZY`ifkc`bYdnkflgfdbiklgcegnqpfehgemqkgijhjkXPY\_kk[QVbd[\c]U[ge[bcY\c_VTXdebikihqxpkoldcjmonspkniiihnoppljhdcdfdjiglbkhgeaSOV__TOY\Y_aacjnuzkoslmhkrqrsnlrtspxulfwbthloqo|xfpzypxzzzy~u~vx}}z||{|v}wtv~q|wxmqyln|qsxovu}~vlq{rux{}}}|||{z}rszzquyyww~mkuz~x~sr}tqwrfrzuzycynjikpzqk{makUepmhifc{rvprnWqr|voywqxvtsq||st|zzvgoz}pyujvvmlmlnpry{pe\_dge|nc[m{qlvexmsll}|tsq|~~ulqv~}v}sw{{ymjyxwqxzy~q||l~x~||}~lutzz|{}y|xt{[Z^cdha[ff`Soxtdeln|yt}ozqƽ´ǾÿƼþžĿùƼĿƽŽºľacgkljf_SOUXX\`b`[W]cdccca]^bb^]\YUSWac^YYZUOU``XT`mmeYRSSRRUYXTV_aa^^^YSVafd\XZZOFJSY[XPIDDHR[_^aelnjecXRX`bccdfgfc[VY_`ZY][ZSW_egbbcbdddikpumghovusohgkljggkkhg^W[ijje]]YSMQaof\djd`XQW\dvtc^aelz~tlmmh\YcV@SimtdIFID@IR[i[B?FUZPD>=;?JY_SC?CGSkp\UWQOQUX^\VZ[`XB>KPN?<>>:8;HPRTOA6APLABINIFHIPXTDJWTOVVMVb\T`eRIECKVPNVbaZXYVTTRPQZ\XZ`aacdagrnefdegjjd^Y`ga\emjdcccb__a_^]WUZYqxW\hiigfhaX^`RBDRY^WNHEIM@:B>DPRRVSMNPRRJDDGILKKOVWPKT_WTWVSW\_``aefeeedcbd\[][[YYbidcaba\fnjbihhd`iilidcentndjlcershehiilk[Yaadj_UZ`ca_cb]Y_h]YhaU^cYQQ\b^chijiqsnoohbblmqrlnkkiiihlmlmnmlfbaabjhdmkshbhfUMUcbQJX\Y_`^`hjt|npqnnhipqqpnlpsqnrtpmewy`rweilpxk|tdy~|~}vn{w|vw|vr{yrvwxx|wzz~xq|{qtu|wmvtncqphp~vkwqjss~whh~|popuwuvvsvxwuzyoyvq{zuswwp|{{y~n||rrtqiswytholhjn{ng}p_vZ^rtohglywusnvZeytzqu}uvu~yov{vw|{|{rv|}rzwiqsijlknnmryp~gZ^bdboy`Wj|phyk{junl~xmztvv|u{qxy}wkfwoswy|}t|xzm~~y~{~}s}ots|szzy}y~~x{bYZ`jkv~feojgWnvyrwxqu|pwzypwupǾƾƽ¼»¼ĽĿ¾ž»¼achjiie[OMTWW[`_[XY_bbaa`]Z]aa]ZXWSRX_a\XWXTR[c[VWakk`VSRRRTXXVTY`ca^a_WT\ceaZWZXNIQ[ZXRLGEELW^`_dgjllh[OR^dddddefdaZY_b`_^\ZWU[ejeabccdcdmsuqhflttsrmijoohchmkhi]S]mkjb][WQNWfj`^bfa\UQY[k}}hY]`en}~vlinlf\acNHahfhSEGFADMS_gO=AO]ZK?>>>DR][J::CN`qcRRQLNTX]ed]\aeP?FTWQCBF@98HUNCFMMMKKLJSVG;;><9?HJHHNTOGING;6:GUTINXSO[aVWf_MJBCLRNNWb_XZXRUWRNXa_]acb`ccbirlhhfejmke\\dfaainidcbdb^^a`_^SX[^zvYbigiigh`\ddSHP^bbXNHFOPA>DAIRQV[SMPQMJHDCFJJIHQYSJKS[QTZRRY[\^_bfdcegdeecZ]_]][\bfbb`ddbhmibiiib`gfkkdcdownepl`erpgghhimma_eeeaY\d__bdgc^\bh\\g]Q`_TQV_c`eeijlromqnedflnwsemghgihhlmlmnnmg_`]ejhfrwwhchi[RYffSKZ^\_^\^efqyjmonngfmnnonknto}oqpjkjvo^ppdfkpxul|ri~y}|{ppy{v|}ruopx{uorqux||}}}qxw}zro{ussswpu~~sqf`x{khs{mjrikkr~{q_mslloonquojuxozu|y|zpozy{|vqouy~zz||m{rpptlytwrpxtnjio{phzt_ccp|thflx~sqpy~f]{s|}vrzwuu}uq~~z||{~~xw~z~wuyrqrijqkmjgmvoziY^defd_Tmqgxozmusrv|py{|}x|n~z}shdvkvyw}{svtxl}{|w}zn{ruwtr}{umx|w|~z{~oYY[irryikuulZmtzx~{|wr~wjo|rxn|q|ʽľǹžǾŶĻſ¼¼ý÷ľû^dhhgfdXJLTWW[`\WV[aba``_ZX\a`\XUSQRX_`\XVVTXdcXUZcjh\TWVONUZWTV^bda`b^WX`db\UVXUNMX]YUMJGFGOZaa`cgjklaNJWceffecbcb`^_dfdc^[[Y^djgdabccaciuysjcgptqrqlkmomd`jokhhYSaqkh_\\VOP]he[_ad_YSSZ\o~t]V]`gr|{oehoka`g\OZhbc_JEHFEKOTb`D=JW[UD:>A@JZ_TB4:G\olUNQMKSWZckh`\caI@P][PEFH?8:>LRPE@N\VDAJPOOPJEN[P>::;;=AEGHKOOJIOL=6:DSVIETYSU]YS_j[KHAEMONMZa[V\XSWWPSagfdddbbbacotkggfckqne[^ggeehnof^_fd]^a`_]Q\]f~o[gjfhkhhdbjdUO\efd[NGHTREFFBMUUZ\QPUQKIFDCFJIGHSYOGKSTQWZPS[XW^^bebbfkcfga[__]^]_bd```gihhlgdjiha`fdkkbacovmgqkbjpliihhjnnhhhhe_^ff]aehje^\hh]ef[Zc[WWYbecccijntmktlbeimnzrcnefgihglmmmmnke_c_iejkt{vhdimbV\jjTK\`__][]cbpvgimmngdfgknnjovnv~roigmjne^okcdjpusm|ppw}|{skryuu}wpt}jnu}xomomrxz|v{zjxyt~xujmzyuupruj{yrnh]fogitugjnhlir}ype`x{jhlkfgnpgkrpr~iuywsrs{yppnszwzxlzrnmxszyqur|qwokho{vpxydppr{vlicwrqrpocqwp{ntsvxlx|y|~xz}x{o}~uqhlxlmfekvqzh\cndkd~fSoqjvstnu~~{wzuy~||o}{naftwgzu~sqpuv|k|}}|zr~y~|p}|}uw|umz{y}rgu{zu|~r~}}c^V_urslio|vain{w{zpytxriikuz|~xlwyryŶµ½»ü¿˿ºļ¿ûýû^ehfee`QHNVWW^^WUU\ba`_^\WV\`_ZVTRPQW]^\WTTT\e_UU[dhaVU\VLPYYTSX]bb``b`Y[de_YUUURORWZWPJHGFIQZ``aegikhVJQ]cfgfdb``a`adqia__\]_dmnec`bccdmsyvjefjpsrsnjmnkg`cloihgXYiqlf_]\TNRbfa[_`b^WSU[^o{iW[_^gr{xh_hpj^aj_Wbd`aTGIJGHLNWcV?EQVXO<7?ADT^ZN=3BMQLDK__I>EIIMQQHIZ_L<:89;97AJMOQOG@HQNBDPTOE?P[WWY_[W\ZV_[JDHPQP_g^agbXV\Z\drzjckhih`i{heeeozxsnhjnpmggpsk^^hia\]_`a`[\fpqfajjchjmnggngbbcccc`USY]ZMIWh_\ghYZ\ZRIGFCHQNGNXVMILQOO[XNTYRR[`ea`^cc`fgdaacccbaabaa`epplnlniigdadfdhgffeiloqrjimgotjeelrqrunkklmmkflkplgouphfknh_ajd_ff]_kmknlflynfilmosvrhc`a_fjoqmjjjjf`akljem{smlljihhkjjk^Wcejgeb^adhe^_mpfa^Zennlkmk`m}hfuqd`cqqneeoktuexv||uzxkdhtibvsenuujkisvjgfaepwxtvtnrmkmn~qjbelpqrkjghuqoce]Uj{o__clsgclldcnrl`ZkvlaefUSdh]W_k~rjreoidgys~zqxjqp}|sismmvxpnkqvptnxiqnhbo~wy{sslxrkosq|xoy{z~z~vxv}~~y~lrz~wosk}}jztz|yr|s~}zsmy}||v}~n}}peVtzo~ad{zs|gpr|{izz||qkrpr}}|uoxyv{wdg{vxlnpdhqqr|xlpln{{wraWjzkfdj}wc^wqrrrfjmkjkf{|}}~npz{wu{wvɸûǽƿƿżþ½ſû½úƽľ¿addba\RJJRYZ\`YQT]b^YZYURQUZ[\XOJJLOTXYUONU]^WQQZeeWMT_ZNT\VPRXflbWT\bfd`_\XTQRSVYXURPMHEGJRZ^^]\`hh[RU_abba_^`cegjnpmnfceckqrlf`___`fsyrnifgilmnopljijhefkpm`bh`^gknojeaXOR_c_[\aca[TW\^etlSR\`botm_`llbcjnh]\`cZV^TIHEETchaZRKNTQC=KJN_^PIA:Jag[ROLLYb[W`mm_]bZQT^^__SQ]WKDCFIMMLS_V@AKHJRLL`f_WA.7A;5EUXTX]^\[ZVZe\KFHQQVeebdd`VW]_bl|xghiinhctrccfny{vsolqtplhhrti]bmi^Y\\^geX\iokedlhcghoqfhoieeccff`WX[_ZKTkl_digada[PNLKGQSOLT[VRNMOMR_VOTTPU]bec_^addfdbdcchgbabdbaakurllllikgccjgdkjgffgloqrllieqthfglqrsumlppnmmhkjpoosvojimlh`fmedgbblsjgomfpujiijjnrrqjc`_^gjrulgfihgcfnllem~sjlnmjfkqnkng_fhpoifa`dje^anod`^Zdqrpigf`ozgkvqe_ftqodhphuucvy|{umkgbgndeukfouokmjqthba^dpuvvwupmjjhsvgeaflonoqc_mxlf_`U[ord[]dlnacqh[erm`V_oibei^N]j]SWatumcfr]duvyy{z{wzfor||{~ngtlhsxoqsotxrlqgjrfao{xw~~mkxtllqoy{oz|{ww~{~nssrtw|~t~{xupk{wy{~xt~j{}~hc\xztnu_g}y~zszgrwxmz}~~ohlpv}vulm~quyp_mxrrfjielvw}nxxfhlxktzprgZg~oeagxxe]pvppm{djjhign{}pnuxvt~{}}x˿ǽ¼ļŽû½ļ»¹ž¿aa`a`VMKLSZ\__WRV_a\XYXSPOTYYZWLIKLOTXTNLOW^\UQS^haPMZ^ROYYPLRbpgWRX^cca`^ZUSQRUZYVSQPMFEGLU\^[WXag_QQX^`a`][\bgimpsqliecehmpoj`\``]cotnhgfgjkjiknljiijjilqpe^eg_agilrngaXNSac[[^acd[TZ`ahpfST\`bqqg^aje_flnhb`gcY[XKECCQaff`WLJMTOEFNPZbYKE??Tb]RPPOU_]WYelbW_`TSY]\a^RXbVKEFHJLLOVZPCFJGIKGTfdZL62CD9J\cce]MLKMQOLNSXcaTJB@HZ^SQRSTY[XW\fh]V`^TXYY[`ZS\_QJGJMPPOQWYLEFFFHHN]eaT?/=LECOWTNH??JPMHHQ[\P>:KVTUY\`aXVVWfgTMQWUScjhgb`^W\fdnmehjnmmv~yiccl{{ssvqmwysnjjtuhbimaY^b^alf[bffkjhlhffdssehpifeaaji`_[V_[Youeailstm\ZY\ZPRZRSX`__]RQSQZ^TRSNQY^bc^\[`dcc`dgjmh``ehebafqsplhfhlmfbfkfhuoaefgnsrrnidfvtgfgjopposmmplklikinoquzmlnmjhknjigcgvxjgtuhmsohhfeejnmmgdcaaejuxlbfkeglhflmdbysggppigktqjw|mhgrsqsf^fmijlljc^_^dtwqb]c`k}wku{mb_mxtmgtohxvcquyzkcheahlgjoonkwxoqspql_\^_gnprttus]gvky}hihaoomqth]ej|qXZXNWmiYXZagj\axhUcpfYR]g^[jgUUb_MGQ[j|xrrp^XhgYu~x|qwn|x~wv}xt}xsqs`o~yvy{|wjoj`jwfcnwsuvvzs}|wg{lu|qmvx|{wm|zy~v|{ttoqoepxvty{|x{iz|xcfmtqlr{dXr}~u|tv~v|}}}magxupijowlijle\qpohb`adltw}jmoq]`qikegvtrj]_qzqcY]oi[mrmdhrnzpqnp||zwspxyq~zyϿÿ˿þ¸ɸľý¿þ¿üûɿº¿ž\\Z]XMMNOU`db^UX\d\UYZSLJMQUWYSHGLJLRTMHKR[_YRS[b\NL[g[S\ZKGK[onWOW]ba_[YXVRPSUVWUUPNMIDELSY[YTTZ^YQR\aa\ZZXX]dimnolidbhnpqsofabdeegmofbcegjjgdefhggfilnmlib\`gfdjiiotmaYTTad\Y]aehgYVagfil_SX^akqi`\ademklhkqpd`]VNOEEXccbaUKQMQQPOTY`e\RKBBL[[SSSSVXYXW\bdZXa\V[WU[]SQ^[LKMRUUWTQTUMFECCDJW_b]L83HTOUYVPHB@JUPHGP\^WF:ASZTV[_c`YXW^mdQSXVSYgfmh\]^\eidtwigfjrmo~tfbht|vrw{soyyuojmvtkinl^Ybgacoj^a`emkjlfdddsqdiogffablh`_YU__htnecjotun`___[RSWVZZade\TSUU]ZTROLT[]bb[^_b`_cbhloof`bhjgcahsqnlgdjmmdbgiglvj_cefmsoqnhcgwsfddfnojmxkjnhimkmhooqw}ommkjnnggkgeo{qfpyrkrpmhfedejnkjffcbeikrwmbflfgohdjie`tsjfnsjghopjs|rkfprnphbholmpjif_^`hutn`\d`h|wkx{hbeputplwsnxugps|vjgibbgknoqwrlx{sostqoh][^_elprrsst\d|pz|ghhdqrmvr\]fkeQ[SK^k^RV[chdWkv]^mk\TUaaR`o_R]eUEKV_pz^e|]XUjdd}|yyqt~z}wz~|suzui|}||wret}i\lvkhjnovsusnzwou}ftxqy~|wtz~}y~zuo}smpmel{wrzxxzy}kw|~pehponyjvtZZx|~s|px{lblztjinxxjgeeiicmupd][]dirnjfdil[_o|cicfomqn^[jvqbWWf~qYksnbajuw|||z}vw{q|{øſýÿŷþƿſþƿźþºYXYYRKNQRZghc]X[_eWT]ZNJIKPTWWPFHKJLQQIFLSY\WQX`_SFMchXSXPFEL_qiQPX_ba^YTWWRQRTSRUVRMHCCHOXZXSQVYVOQX^b`[WUVW_gjnomicaemqrrrjaaegeehmlcbcegigeceegfddiokfgc^_cgghjelsod\YY^ed\Y]cilfWWchhii]UZ_iolc\\agkmihlqtl`a]USMFVcdb_WQTST[ZUTW]c_VWPDHS[ZTRRQSWZYZ]aaXX`]YZTTZYQW_SKRWYY\[RQTRKHC@ADOZ_`WH<@RZY\XQKEGNWYNGNZ^[RB>JX[VY\^ea[YWfo`RX^WR^fembX_]`lgev{kfhinqmr~oaalx{tqz}soz{wojnvslmqhZ[giddqn^[^enllkdddesnbjohgfadnh`]VU_gtqiecknsupb`_^^XTX\Y\dhf\VVW\_XRRMLX\\caY\cc]]cdnpljd`fnkebclsomlgejmkcbgjjnse]cdemqlpnhagwrfaaekkcmyghlfgmomhnoqx~pmjhkoldhkgkwzleqtooplkiffegjnjhefddilkqwnbdkfgohchgd]mrkjopkfgkojpyrjgnpmokehnoqqkjg`^dmuqj^\ebhzwkz{eelqtsppxwtwumpr~tkigbcgjqpt}qoyzvrpuxrnd\]_aejnrqrstbcvt}zifihpvoyrY_jp}YS[NQdeUPYaehZ[tiZlqbVSXaURnjTWa\KCLXez{[UxfQVVkho|z~vys~u}}xpys~tmbzvfXpyqelnuvkqlkuvntd{}w{~|}}|z~~tnzslz~nkdfzznwvvzxyov{zjjjtknuhzkTd|z~s{n{zkbowownjpzkbh``fnhfyp_\UYdgpjz^b^hhX_owagcehglp`XbsqbVR^yuYg|rukdi}wxz~u{Źʺ¿ĿĹþ¿½¾ýøŽ·¾ýVVXUMIPTWakg_\\_`bSWaVJHIJMSZXLFFIJNQNGGOTWZUR[_ZKDTf`TWSECEOdo_OPY_aa]URXYRPSSSQVXPIC@DKU\]VRWZUOPV[ac^XTSUXaikmmjeacjpqrrofbfiieglkfcbceggbbceedbadnribcc]^dhiidboshba]]chd\Z^dikbVYcghhe]WXdqoe_[\bilhhkourfdd[TSMR`cb^UQYYW^^YVV[`^WZ_PIQ[[XURPPTXYX[_a^YY_]YTQTYWW_\ORY\Z]`TOQTRKHB>BHQZ`_RHEK[`_[UMHKUZXPJQVY][RABT\ZXZ[_d_[WZkk[U[_XU^bej]W^^flbhwpbdgnsjjvze^eoyypr}xmq{|vnlpwrlmofZ_ijeetr_Z^fnmmjdcbeslbjjegg`dng_ZUU`pvhfedllruq^_^^_[VZ[Y^gieZXXW]`VSSLLX\\c`X[eb\aaftrigb`hpkcbgppmolggjmjddgjlqqa]acdlmjong`euqd`_cgecluggkdfmomgloqxpliglmfgkiioxzgisonokjlhegikkmjhghggiklpqjccifgld_eed[jnjjlnkfeimlnuqkhlnllkghnqrplkha_fouri\]fchxvmzydfmprpppxytttqrt|tjle`eenvpw}pqwtrqpvytmb\^``ejnpqosukcmv~xmhihrqyw_epsqNZWHX``TQbigcSgw`app^SRYWLdrZN[_QDALZn}eMlqPJZVqr}|z|ztp~z}}}|m|tybrdWv|tfkmyqdmhkpwrpl||||}|yz|ytuyqjyspv{ofedr|nvxuyyzqv~{sklothnqg~fRn}ysywzmdopluuhosa`j_[arkczlX^XYdfmhmY`ZifT^qv`c]ddckpaWZoncXPZvz`iv}xzpr}z}zѿĹź¾Ŀʽ¾þþŻ̿¾TTUQJJRX\fmd\[^`a]V`aPGHIJNVZUHEFIJLMIDGOTVVRRZ\RFFZe\VULCCESjlYMR[``]UMPZ[RPRQQW[THDA@GPY^ZTUYULNV[^baXSRSUY`hkliebchmpsvqiaelniehnicbbcefc^^becb``hpneaa_]agjiebhqk_cebdehc\\_fjk_V\bghgd]W[lrh_ZV\fkfchmqsibfbXVSR]dc_SMZf`b`VRQXa_W[i]JOZ_ZVUQOOTWYY[]^]Z[]\TMNT\\]`WQY\YZaZNRRTSMG@>EPR\`ZRDFU]abYRQQU\^THOZZ[]YNFJU]\XVYad`ZU_neXY]]YZaadg[X`bmj]ntc_cfrufk~~m]_ksyujstku}|tmmsvqknmaZbjjfgus_Z]gmllha``cqh_gfcffaene^ZUVbsocfbdjiptpa]__\YY]YYbihdZY[]a^VUUMRZ[\b^X`g`]a`l{qfebbjpjcdkqlkmjggjlhfffhlqm_`acejiinle_brp`^^aeablracicdkolejnr{okggljdkmhlswtilnknlgjnjfilmlkiiijjkllmnmfcchghib_ded`gjjihihgeejkmonkiimljhijlqqpnlhcaipsrh\_gdixur|ufelrpnopvwsruvtt{yolkd_bftwnz{oqsqpppxyrlddfb_gnnqrkrvofjuz{qkmhyqwxhjsv{bN]OM[Z^RWkmg\Xsubgnj[QPRJWwfR[a[G?IS`vtRW}xYGLY]wtwy}xmv}~yn||}jsd[{wljlym^ieiq{x{nwz{}uyw~z{v}|twxs~tri~xswvvvfcbozzv|sx~}}{{rw~|zmnksqcqme{bQ||wsuy|qkpnjzudng[]jaT]sje|eN`\[aejh_X]Xk_P`rua^Tbd[pob\ZffecVc~im{|±}|ŻƸƻǼ¾Ŀüɿ¾·ʾÿTTSNHLW\bkk^Y[]__^]e\LHIIJQZZODGHIJLIECGMSVRMPVVLEM_c[VMB?BGWliVLT]a_XLJT][RONOPZZODABCKU\[VTVRJKTY_ec[RNPRTZafjidbbglnqutjbclsohhimhcbcddc]Y]bdca_clnfb`_^`egjgcdmoe`hieijjc\\ajli]X`bfgfd^Zdsoc[VU^hf_ahoqi_acZZ[YZcg^SQ^lokdWPRW_aXZliLET]\UUUQOPRVYZYY[\\\]ZNHR_c_^_WVZZW^cUMYVTVQGCEKU]e_PIBO_]_bUQ_]T]bUMU\Z^_XOKPX_^VSYbd`WVfm_YZ\]X[a`ab[Yahmb]oi\__fupdru`Z`ktvmhwqku~yrnou{rjnk][ekkghuq]Y]fkkke_]]cne^ecaff`goc[XVXesibfbeigoto`\_`[Z\^WYfjhcYZ\^a]VWWRV\[\b\Ybf`_abv|hbfbcmoicekmggjjhglkgljfhmqi\_bbehdhmje_^nm^\]cd_akm[ah`ajnkdhnr{ojfhlgfnlglswpihhkmihnplgkpplhkmlmoqmmnkhfcdhgggc_bec_chiiiihhechllkkljgklgefhlrspplfehlnqqh_aifkyvx{qkgmtolmmrtrqvxssvrmljc^`jyqo}wrqoppmr{vlhflmd`nunqsjsvmjmputnrkqszrnvxsRT_LU[ZYS_oneZfwqikleZQOJKmvXYdaWECMXg|jMi~iHBS_nutvu~y~wqq{}~{zpzw{ufc}zqhn|j[hdhty|r{|vw{tv}yuwwou~z|yqvzzusg~xty}w}na]}mr}x{t|zz{xyrx}yxjokxjczvkhyYTyxspyx|xulvs{xdk_XYfgO[sff{cP__`bdgmzVUXXlVQ`ruc\Vbd]ondaZdfnxkt|mz̺þɿɿľ¿ýĿļ¿þ¾¿úɽTSPKGMZ_fpi[Y[\^^_ceVIIIILU[THFHIIJLJECFLSVPJOTOEFWfbWQG=I_g^TH?;;CRdkZLOZa_SGGR^^ULIKP[^QC??BN[_ZWWUNKPVZ]b]RLLNOQW[^cd_\_egjpssjbdmrnjgnplecbbab^X[_a_^^bkmf`_aa_chhc^aimfdlokmnnke`ahkhc_`bghebbckurc\ZZ`d`\\_hnh][abeggeeaUPdwyl`[YZ\\\[[elY@CU[VSWYQMKJR_]QNQUXWWXKGZmgVU_a^ZVX\b_W`b^^XSRQUVjt]MBDO[bbcefg`SZlg\bh_ZbbYRNWfcXOT^a_YYbd`]ZV\_TW`a\Z[[`e[Vcf[ZZ]oodvrYT\dltk`qvhnvsqqpowznkpg\]injhiuq_\_dhghaYZ^dha]a^_ecaji_\XW[gh_bgbgeemrn^\`_[[\\\bjjf_Z_cca\ZZSYa]Z_c]^fgfa`r|l`ffaitmdchmgckmjgknelwidgnlfbddeie_cijg_Yehda`_^]bij[`g[]ggfdhloxslghlhlmgfkvxnggjkklnqsnjpqpkovnmzxjjomeeijjkfdeb`beb`ddfhjihgg`]ejhdchb^ca\abdnpjkkhfhoqnmkebiefuxwvplntqjhijmpnpuunmpkgkhaZ_ywawxffdllhittcajifpnbvmnsmoulhpmo~znuouyjx{rsv_RbVN[ZVUhortefwrghife`RHQmu\`iafXKO`poodkwcNPcsp{rtgxx|ryv}|u{yqxzw~}to|zv~~st~vqwi`qhr{{rx~twynloyyoq}|knzqwciutnfjxwxvy{~|ti~}}z}{du{gu~}}z~wx}v~pyzwyxxlzZ_xmpswSgy}tx|wyq|yxnqxcTUURblkk_eleilc]_i`vkbQM_eLShxk\]cicjgpieh~}»˺ǺĽǿ¾ĿſĿǿýüƿƹRPKIIP[agmfZY_\WX_f^OHKMQZZOEDHKLKKIFDDIPSPLLPOD>OghWLB;;@HU]^YXTLJNVXY]^UIGKOPRV\``_Z[afhkrqjcahsujegmnhda_`cc]X[`a^^`dkjd`_acdgfd_\djidfnmknnmleadkmjd`_akmga_gqrha_^^ce]WZ`gic]]bhmkigdZQ`wudYXXY[\\\`im^GANYYTVYRJHJKYbWKMQSTUXRENfk^RWac^WUX]ca`fdb_TU\[[]usRJHKTai`_nuj[Saqi`hnaYadZRP]lcUPV^][YYac[WUR]`RXc^VW[Z]^UUb`YXWbpjm~aRT\enpdayqhqrnimomvxkmqf`dmnighusa\]afff]TV]dd_\]\_dabjf`^WU[ee]`eadbemol]Z^_[ZZ]^ejiea^bcca[[\V[b][_`_`figagxwebkhdmsibchiceonhfmnerxdbinjffdffic]bkki_Wcieb`_]\eii^di^^fgdeilmtwkghijljdejuwkfhjlmmnrwpjnppqtrnw~pgmqidmmnlhcbcacdd`aeceijjheb_[_fc_^da[\]Z^^`mohkjeaeoqnnjc`hfcszrrpkpqlhggglnlouslnmddlh`Zc{mdumf`aifeirj\bkjgtwfuqiprmrpfkllzopvi~guzutre`eTS`[WbrqwtclujgmjceaRNaxr^jnglYXcpvpmjrp`Yhulrxxkiyw}tmvqz}yvxyuuzyy~yw~l|wsz}yxx|jgymv~uoxxlqthjnw|yoks{yxfqwt~capvpdbouy}~t}}~}v{|wp}}yzvxms~|||xxu}oyxxy~zurVcoqrvu\oz|xxm{}ws|~xp{pYRTOZppg]ef`gnidZoez~akaSc]GWptgd`Vipgmnes~Ľҿ¾ǻ·Ľÿ¿½ŽɿŹTNIJLS]bimdYY_\TWaf]NHLOTYSGEGKPPLIEBACKRTNINQI@EYjdNC?;:?NbjcQLV[WJEKRVTLEGMW^_RD=?FPZ\[WSKGMTWWY[WLFILOPSY]_]WW]cfjprkcacowobdgjhdb`^chcZX^a__`bfjhdbabedfb_\_fhfcinmptmllgdioold`]cnlebbmrmedc_`feWS[bee`]`hlmjigaZarudXZ[XVY^abgndNBFPXVUYSHBDISa\NIKORVZVID[kbWUZbc\WVY_cdiibf_U^hd`bxnLPUUXdm^\s{jZWdtmcjlbX^f[OQbnbSU[\\ZYYaaWTST^\R\dZQWYYXVSWa]XTZijh{nTOU\foh\j}hjrlhhmmlttkpnedinmhhgxxaY\`febZRT\cb\[[X^c`aifa`VTZda\_a\``ellk]Y^^ZXY\_fihd`_abdaZ[\Za`\_a_`dghd_jzraemhhppgbdfcaiplfemmjxsaakohfgghhjb]dkjiaXaifda^Z]jkj_cl`\giffikjq|gefhjkgbdluvjehjmomntwnknprssnu|wlioofksmmiaccdcbb`^_cehhlki_[[Z^caWX`_XYZTZ[[imegfb]`loljic\gian{pmmkplhgecciklnqpmke_goj`^jtejkdh^diceild_djljs|ll}ujoupprkfhirujuitnoywponieUXf[busp{seophjolegcZ_l|uhvtuq\nuy~rlmukfo{ueus~ejyz|olmmwxvwuyxqx||}x~}~}n{wly}uyy~npwz~yvowvjkphfnwwmhgv|yyvoxzy}k]irsj^iss|~x|zwzxw{~s|zw~{wt~}}~}vuu}oyxuv{fVjyrtu|zhuzzj||upyz~xzxgVXX]osk`gf]cnuj^nnyzWcudeUH_tqardOa|purgyɽķƿ¿¼ƾ¸ȿŸ¼YLHKNW`fllaY[^YVYcf\NIMQXYLBDJOTRIC@@AGQUSLJPNA?RfiZE>=::DVfj_OPZVLEHRURMFEKS[^XJ?=AJV^[VQKGJQUUWXWMEFJMOQTY[[UPV_cgnsod_cjtth_dggeba`bhh_W[cc^_bdfigefffedb_\]bgfeeknmoqjkkhiorura^alledhipqlhgb]dg]QT]baa^]aikjjhechqrg`baWTV[cgghfTEAHRXVWSG@AHOa`NFGHMS[[NDSheWWZ]_][YXY`ceofaf`ZfoibcwmSZ\Z\bf\`v{j\ZgsniljbY`i[MSfraT\\ZZYYY]ZPORV^YUbdVOVXVSNO\`YTRcndkz]NOU]hj]^xmbmncdhmllsrmmefloplijgz}aU[`fc]VPS[b`XWXW^c`_ifb`UTYd`Y[[X^`ejjhYT]\XVX[agihd__abfaZ[\`d_]`a_cjkh``nxkajkglqlebdeacmojegomnznbclohhkkhjjb]ekjhb\ejfd`]Xbnkj^fr`Xknfgikho}edegije`dmwtfchknpmoyxljosvxnryyunmrljyrkle_ddefc_]^]`ilgmofYVYZ\`aTR\_WTUQSWXelcbc_[]inkhfaYei^hvpjjkoheed^aiijlnojd`^jqkfdlodkdbiaiiaeigddcfnqs{scqzqpssstrfdgm}gpomvkywlltndXYjhlzqtmgqmnmnlglifkt}yv}~lh}tmmwvuvwmrwszfny}ygjklvtuxuyyqx~~{xz{}rzyfqy|~sy{rx}yw|ou~vjfmicnwqfgi}|ytqz||nbiutmbYrws{z}wy}pu|wp~{~w~}~utu}oyxtt\Tqrt|xt}}h}|tmv~~y|su`\cfouriifabnwncmwyx[]wteUQiuncoTa}uqyŹùĹ½þÿǾɿĸ¿ĽYHGMQZdjli^Y^_[Y[ce[NILQXWIAEMTUNE><@HQRJGILOH=FajaQ?89:PgdSE;69HYedYQSUOGHQUNFFJQW[ZRG?;>FT\ZTPLIKNOQTVRGADKOMKLOOOONPU^ccgha[]emoh`]aeb`_`ehg\U[dgdb``bhhlnoi__^]_`befffiknqnilnmkjpz{jbemmgghjlqumike_hgVUcje_[X\\Z[jtpqpg[Z_\USRTZ^``_[PC;AMWXTK?@PbcQB:54;EO\c_VRUSKGLSPGEJRZ^]VJ?;=EOXYUPLJIKMNQVTI>@IOMKJLLLLLNT\`ccc`[Z`kpj`]__`_]^bhg_VU_iib___cjntsmd]\_`baceffginrplmomlklu~sbgjkieillltukgib`hdU[knf_Z[_\Y_ptnlf]Y\ZTRRTX]_]ZXSH>>GSVSLA=H`g[UTECIPRUZXY]d`UNPXcdWYd^Sakbbb`^_eppqqbX\ehaaebaca]mziaa_itqmigfboqUKTlocg_]ZZXOGDFHQ`^SXaWJMSMABQ]VKPaga]iujRKQXac\cyv^WaaYWZafjlhd`^fpllrnlncayrRLW`aZSLNW[[WSROP\^[^eb\VMRVcaQPLQTRZbaOIPSQPORYded^WWZ][WUV^`_][[\_dif\\gpfcjf^eqrja`e\]oqfadkomnpidckkbekkllljfemmdfjkkkdaagsoilkysakumcfhkn|~a_a[erpgfgfotqgfhlropz{umnrxxt}~vmyzvtfbkjhkf_ZWXZfkglm`]`]YY``YXSJHQSOKKMSMMZZUUVVUTZcaXSPUYRScicako`bec^dh[_imi\WW\o{rmhdiloibr~oelkhlqtqn~ruynnwxyeuxtjnpmlzwj|~snkookligvkumpwtyosx|}}wy|w~~{u~}sy}zxz|ytsxyzx|{tz~zvwwfrhj|tz}zo~wzyyuw}}h{dZkthkgnwbv{]t}pfqvitpskkxz~pk}|t|zyzzqxxnqu}|_izvtvqoxvz~|w|qr~yv}|{v|qwqy~z{wno}~ueox{Ŀǿ¿¿¿ÿ½ɼ¿?CQ_d_\\__YY^abddefZNKOVWMBFTZOB=>CMROJFHJHB=FZg]G:538BMV^^XUUUQIJPPIEJRX]]WM@89ALTWTMKJHHJJNTUK?ENVSNF@FYh`RPPCFUZVVY[`_\WRPS\hdW^h[Thoc\[_\]hsrrp^X\ce``ffdbaampded_gqqkghidotXLTmrgnbZ\]UJECEJWc]RX^RHOSG=GY[OKXfc\^ko`NMU\a]]nyeUZ^VRUZ`eiie_[]kqmioopkaezqPKX`]TOKOWYWUSQMNZ\Zag`[VLQVcaPLJORPWa^LGNROLLQZcc`ZTTWYXUVYa`[ZZZ[`dgb^`gocci`^gmng^`cZdumcbfkmnpjeccgebdiklmmjffnjbhlkllbcensiklp|lertgadjmr}v`d]Zjvpkjggvxibknmoos~rlpuyzwxwo}y|ufiollmfbYVY_hiikc[]_]YY`aWSPFDMPLIIORLHQURRTXURZc`UNNTWORagcbhkbcec_bg]_ini\XV_v{rngchqsicumhpljsuvvtrtypqxwzftwvnnpixoy~irsmjpmgmjazw|lsl|yr|pt|~}}xzvvr~}x}q~{{xvyz{y}zov{t}upaofjxrxxvpxxxvzwt}|hngfqrlsntyq~qwvsg|gikxxyll~{v}~pmzsxwoty~ln~zx|svwx}wxuq{|vywwvsx|}xwom}}qw|y~ÿ»¾ſ¿»ÿȼ¾¼?IXdd\YZ]_YZadeffd`WOMOVWMEJWWK@=@GPQJEIMIC?@PabM:326AMSY][VVWTMIMOHFMSVYZWOC:6;FQURLHIIHFGJQTMBM[SKQ_e]X_lkXJOZ_^]gvnWS[VNPVY`deda]X_pqkgnopgal~nMKZ`ZPNOQUVTTTQMOWXWbf]XRJQVeaOIIMQNUa[GFNPMJIP[b`]XRRUXURW]a_YXWX]_ba]^cgg_ef\`ilja\a]YlsgcdgjmophbbccbcdijlnmjgfnibjkjmkbeippflkpxihplcbfimsxpddX_qurohboqdhpmlooy{mlptx{~}y}ry~zsmpnmnlg`VZ[cghjeYW^`]WWbbUOMA?HLJHJMQKEJPPNS[VPYbaTILTUOR^ddcgidddbbaha_gng[Z[fxyrnhdhqsjdr}okplnwxxyw|osvrrwtwgqxuonrlryoxln|sliqkcnh\ywyljtwu|rsz~{|xtsqp|z|}wy~v~||vjt{s{rk^meitrvvu~x{svux}wryjbrwuooyx{|{}~{rkp~bijzytgp~xx}{{jyu|z{syvv|vzx}xtwsy~x{s~{wtwy|zz}rl{}|}{{z~|żž¾Ŀǿƻ¾ĿDQ^daZWX[]YZbfeedb]VPMPRRMHNXTF@?CKNJEFNQH@>H[bW@458@LTVYZXUXXRJKMIDLVXVWSNE:8:COTRLIHIIGEFKRPC<@MWYMCCDEEGIPY]^_ZSOR[dif^VVZYVVY_cc^WT]ec`^_`bhtzvlc^\]_`b``hllmnmhggjifdfmvxoijljjjkllqzxkkg]`jkhlpmgaagpbY_fhjjgb\XUUSSVWSJFIJGFCDPVOHEENah]SSVUT`c[XZ[]\UMRXVWaic\daUYnn`VR^^_nspsfWX\^`_aime`bdme]ikdfjpmfkqiqv\NSmpm{i_a[QKFBFQadUOZ[NIOMCCSXLMZb_YX`khPES^_^bnp]PUVOKOVY_cb_\XXdpmgflolbfp|jMM\aXMOSUSRTUUTLNTSWbbYVPJRWddNHGLMLS]TDELNJFIQ\b]ZVOQUUQQY``\WWVX]^][Z^cf`]ebZckke[^aW`rmeeeglnmlf`^^^`cdgikonhchnfciijnhbgkqlfjhotjjlgbbfjnrsmhbUiuuundhywjgqtljnvqinqtz}|{uwxv|{{uqrnmrkh[Vc`dhij`TU_aYSXdbSIIA=EKKEGQPICELNJN[WQX`_TMPUSLPZaccfgehc`aagc^hog]]`kyvnlieiqrkepzplpnnxzx{x}zlntsotormowonnqklsnvpmwsljphbpg^~t{tfg|rw|vtw}xtyw{~lpyjqztwy~~x~qguzpzph_jfiprvzu|xx}qwwr|xr}ym^{wqs|{zzrxtopvkjyzzsfut~roxxz}|}|{z~{utw{}|{twwyxv{|x}ury|~zy}}ľ¾ľ¼ýʾþÿ½¿ƿƿź½þLYca\YWYYYX[bdccb`]VPMNNNLKQXOAADGLMIHLQNICCTa]J89>CIPWYWVVUWUNKMIDKVXVWSKB;56?KTRKIIHHFDFHMOG>?JUYRFACCDFHNUY]^ZTOOT_ge]WTVXTTY^ce_WW]egb_`_`grzwpg_`^]_``_bjllmljfdfhgfgjrxrkiiiijlkilv{qije`fnokopnf`fnk`\cfggfda_YRNPTTOGCFJGDDDHRQIBDN^icXUUY^`caZZ\ZXVSQY^ZZbhd_c\TZlm_PQ^^aorpsdUY\\^]akkbacfka_njdfgllglqiqv^NRokml`bYOLHDHUdbSNZ[LIPJFKTRIS^`[WXblaIEWb^_gncQOTQLJNUX_b_ZXU\mrjceloifinxgNQ^`ULQXWPOUVWUKLPPWb_VUNIRWh`LEFKIKQXOCEKJFDIV]`\WQMPSQNQ[a_ZUWUZ^\\ZY]ba\\c_^dhga[c_Rjvgdddinoigd\WY^bcceklnldakmddiiloc`hnqihjforkkkdbbflppqok]\syyuhft|pglwvlhq|hipqt{{ywpw{~zywwtsnpumfYdjbfjjj_X\c`TQ]c`QFF@;DJKCHTMFDEJKDK]YRZa^SPWXRKMYaccgggnd\cage^ipe_aeozsjlieiopkhmupmojkvvqwuxviisqjoioqmrjmoohhqnqvjpomlkbbpedlyp_gly|wssyzpnttyxgntetsnrt{|~zok{vlzrjb~ifintxwtv|{to~xs~}vywra{uzz~vwwm|hsnp{|x}|tgy~v|wz|x}y~~~uo|{{xvu{||~w}x~u{}u~¿¿¿ǿ»¾ȿƽĻľX_b_ZVVWWWW\abaa`^[VQMLKJKNUUH@EIKLLJMQQMJMRZ`S=:CGGJQXXUTUURLKNKDJWZTRQLB<75:FQQKGHHGECCGLNH@@IQXTIAABCEGMSUZ^\RNNRYbe^VSTVSQW_aa_WT\eha[]_^anyxrja]bb__`__ellkjigdcefhhjmtulihggikljhmxwnihdekqoooold`iqeaaeeecccb]UMJPUPGEJMF@EJHKPJCAL_jh^WVW^edcb^^]YUUUXaa]\agfbaXSYkm]QV]]bopop`TZ[Z[[ajg`bcdhadskcffihgnohqt^OTo{emnbbYNNLFKYdaQNZ[LJNIIOQLNXZ\[TWbgWFK\`\cjdVNOOMKJOUX^_ZUTT_qpfeeingfjmudNU`^QJWZTONTUWVLJMPXaYTULJSWlUGCEJGIPTJAEIGCBJ[\^]UNIORONU^c^YWXUZ^Z][Y\^[Y\bacdcb]^eXTrtab`bmrngc^UTZadcdgknmfahnjbfjjnl^ajrngkgiqqllibbafmonopk`iw{zqgn|yjiq{wkhyqfmqpt|ypz{oy|ywxwvrortmefqhhkihjdadc]SXab`PDC>9AIKCHTKEDFJE?K][X_`]VW^YQMQZacchgiqc[dbhg^ioe_ekqyrkliejnolhlrpmmfgsplurqrhgqqighnmk{ohnqnggnklzjmnmnf]bmhmfxmXc}hx{vknxtgjqqwqdnobu|nlknuyx~}nmsiytlk|gijlu{tvu|tzv}xx{~wwujz|x~}qu~j}ys|woyvz|sj}}}sxuxzvo{v|wv{~z|~y||~pýļúȿݼ¼½ƾ»ýĿa`]]ZVUVVVWZ]^^^^]\VQMKHHJQXQCBILMMKKTVQMNTY_[I<98ANQIDCEFC@ACIOJAAJRTUMEAAACIMQSUZ]WMMOU^caXTUTRPQY__ZVTYcgc]Z^^akuwtkd]`cb_^]]ailjggfecccehkmosqihgfgimkiirxrjhgdimpppnlh`bkjigggdb`bbbZNJPVTNIIMH;?MPIHIGEKZijc]YX]dgfdcb`^YTTXbfb`]_ehd^VRZlm]QV\_foonm\TZ[ZY[bie^abadbfrkacfgefnoioq`QXrt`mpdbXPSQKP]d^PO[[MMOFIQPLS[UY[SVa^NGR]]_ifWMLMMLJJPVY\YURRWgrhbbcmneggkr_NWa\OJ\`QLMTTYVJJKPY^USUJJV[hLFAEIFHOPD?EGC?@N\\ZXPJENQQRU`e]WZYS\[W][Y\\XW\adfdb`\b`O\si^_`fnrkf_VRW]cddfhkmhacmnfbgjkkd\cqqkhieltolkf`aahmmlkrmopz~pilszqglu~wfkzjmqmmtwtotn{~utuuvvsrttkiqtnomeflkhfc\W^`aaN>@=6?JKBGQLECHF@?J]`]_`[ZbcXPPV\bdcghlm_]eagf^jnc`gmrvpjkhekoolilqokkegrokolnqgeooihfikkx}ldnsoegleg||hhnmmc]^glvzcrjUaxfsupfksi_gnquiblecyvhifipru||nnsh{tqy|jomlvv|vy~r||~xy{xwuu}zy}zlq~rpzwqys}}v~snt~xzì|w{v{{{{}zs~Ǿ¾ɾÿĿǾ¼a]Z[YVTTUUWZ[[[[\]^XQLIGGLSVLCGLLNOKNXYSQTY]`WC=GJGFR][VSTVRIHIGHQZYTSNE>==;>JQMDBBCA??CGKKCBKRPNPKC@BEGLOPRUWVOINTY_a^WUWRNPUY[YTSW_fe____`jvxsmf`adb^]\[\djkfeeddbacfjmnprlggffhjljhnxwmhhggjmopomjf`dkkjkmkc^`bbbVHP\[RNMKG?;GOMFBCLOVagda_ZX]bggedb``ZUUZdeca^^dhb[TR[ml[RV[_homlhYT[\YX\fic^``__bhpi]_ceddmoimnaU]sp\lrgbWRWVQT_d[PQ\[QRPEJQPQUWUZYTZ^UJKV\_fj]LGIJLMIHOUVWRPPQ[kocbbcliekcgq^PZaYLKdbMILSUUUKJKQYXQPRGO[_\FGAEIFGMKA?DC?=<=FOMDBDD@>=@EIIEBIQNILRIAAEILNOPRUUMGHOW]`]XWUPLPUVVWUSU\cec```agqvsmhfdfd^\[ZZ^fjidcccbabehlmnpoigedehjjhjsztjgiiklmmnmliecimolpolb\_bb`UNZd[OMMH@=EPPI>@HUYZ`dbaa[Y\chigc^ab^\ZY`cdd`^cgaXTQ[ki\UUX_kpkibVV]\WW`hhb^aa\^fjngZ]addakmghiaYcrl[j|sgbWSYZUVadXRUZZWXRGIORUTRU[WT[[PINY_cgcTHEEFLMHHPSRROMNUblj`^[ekcjn_eo]R\_UHNicKHLRTSRKIJR[SMQNJT\^UDFAFIDGLH?>B@<DLJC?ACA>=?BFGDAEKMGIPMA?GKJKNOQSUQFDIRY]^ZVTPIJTXUTUSQV_decaa`forplihiiha[ZZY[afiebdeb_^agklmnomifcbegijjnwxohgikkllmmljifglprssmjb[^ba^YYafYNNMG@ERWPG=FR\\[`bbbb][]bimh`[`aa`\X_dffa^af_VRQZig]UTXalojg`WY^ZVZcihb`cb\`kkkeX\acb_ingfga^ipdYiwnfaXVZ[VWceXTZ[Z[\THIOVVPPV[XUXUMLS[bebZOGECDNOFIQQONKIMYgkd[XZehdlfZgjZT^ZNHXncIFKRROOKGHTYOLOKMY\\PDC@GICFKF==?=:;GTWYRFEFIV_[W[`jaTYW`aXcaTTPMSYabamlaf^OMch^[^`glfb`ULU]_cfgiijkikkg`adghhd^`hlljhgiornllic^]fmjcmko|d`jnsusvz~ogt{prwj^_inhj||g`mwrhhpusrprzznep{}xlhqwupnpsdW]dh^HC@;>BHIB?AB>;<>BFFE@BILIHMNF?CLMJJNPRTVOFEMVY[ZYVOHJQUTRRRQSYaddca`bkqmjjjlmjd]YXWX^cefcdgf^[_ejiilmokfdccdehhktxrjghjlllljkjijhkotxusmkb]`e_]^`deWOQOLLRVTPJGOW\Y\bcbbb^\Z]jqi`Y^bab\X]ehfc`af]SNPZgf]UTYcmpje_Z]_ZV]eig`bfc[`mlicY\ab`_imfeea`lm^Wgrie`WVZZWYcdVT^][_aXJIPUSLQ[\WWVOLQXbf`[SHDFADRPFIPOLKIHO^hg^US[fdhjWYjeXX]TII^qdIDKQQJLKHKTRLLNISZVZKE>@HIBEGB<;=:8@KUUWLCEHK]`[Xabm`SYYge^i^PSNNW]cdjwl__WPUdc\]aagifaYLR^acefiknoqnkgbbdgfdeccgijjgfforommmia[^emhcsuhzjbemlqssxzvil{{ssxqb\`hjcj{s`^krjcgprqpns}yjdq~vlntusrpqpe`higb[MBLUSRQOPWSSVNDLV[emhbdghjf^acajtkaipgacdbad__jd]ftxqomhghkrxumpxvqlefijjljemolnnomeekghrxqd]dlfcghbfm^Vbj_ZaZ\ozvc]_ZVltbfg[]c^UV]jjZY\]joc\ZXZeqzy|yyqtx{{~yzxxq|{xz|y|uzz{{}~yw~|vt{{|}xy~~{xuvzx~uii|lqvisudgvtyxn|Ⱥµÿ¿ʿ¿]\[ZSKHJNTYYYYXWZ]^UMJLNPPMKKPTSPNNP[`dhfeeaXRT\ab_XRNMRUQKGEJYedXOOPJA:BEEDDHLLKKIFEGHFCBFKOQSUOEDNXYWVVPHKSWSMPQMNS]bdb__cjnmgejlnid]YWVVW\cebafgaXW]ec`afnpg`egecbegmuuohfehnomlllkkllmoqssrqpkedhibacb_[UWZ\_\TLTa`UTWXY_ec]^`^\\cpteWQ[addZW_dprleeh^RKN[eb[WW\fqrjdabfd[Ydlihfbcc_boofb\[bd^^egccc`bnjWWfhbe`TU[WW^e`SW_XVdg\VVVOJM\g^WZSJMT\f[OTLBFCPOGILNMLKQ[WUXL<8CLICC=988769ENQQPDAJL[lca`e_raU_gqlpkWSVLSdihlu{aXTX\_bd``cace_VW^beghhjpvxslhecdijd_gjkfcdfedemplkmoj]Z_gmkhs{tism^fkplknpsoigpqmtwl]XX^fc`kr_V_fcZ\birrnlqsi`fv{omqppomowzmioorqgX^b^^]`b`WV_[WZbigjmgegjnnhee`dppgaiqg`ccba_^bf`]juqlljdajqv}unx}tomhilmmojertnsvofejkhksxshehjlnqqa]gdacgiijknrtpe`fgltfdeff`Yakjfdgorwtd[[Y]hz~xtznrh|}vuy~~yuuvtzywy|~{~yyrv|{{tstztpwkm|vxzyv{|~zxv}}wsvufvxqxew|fllpw{|rvȳʹ»ÿǿ¼ɿ¾ZWXVQKKNSXZXWUUY[^[QJLNPQNIJOSTUPJNYadfffhg_X\`dc\SQQLLSWPHHKYhh_Y[[P?6BEEEGKNNLKHEFFHEABFKPTVRE>FSXXVUTMHNXUPORQLNZ_ee_[akpnjffkole_YWUUWY_fd`bgdYTY`c^^ckplcckhcaceiqvrjfeflqomlllmknnooqrprpojfflibbda]ZW_`^c_WUdoeUQVXYbgd[]_\[]dlufUMXbchYSbaqrlhii^RMO\e_ZYZ^iqrjfddig]]ilhlmcaefdmpia][`d`^bdabb_bqjUWfgcd_QTZVW_e_QY`TTdg^][TLIPdl^XYQLQV\_SOQEDG>BRSHBMTJDBCN\bYKFNW^agaRQ\a]YVURM\fkbHEPN>ASMEHMMKJKW\UUXD9:GMGCB;87775;HNOPPG>IL`qgbbfbpaW`krrrjWYTJXlmopsybNTabcgha_cbcc_\^bdeghhlvyvmhfcbgkibdlkjcaccccfopkknndW[cknkq~tmr|u`eensjipsnlggpnkttfZWY_f``ihYU\a_WW]dmpokknf`hywmmoonmlnwzljpprqljfc`ceiibW[ecbdjljnlfghjnnidc^conhbhpe^aaba^\bf_]lumjlgabkty|to{}romijlnonietujz|igjljintwsjhjjlrskaahgegnpmrwuqrrmjpvthjkijeanwpouwvoca`_kx}~sszoneu|uty{|{|yrrtryzwv}~z|zw~st}zzxsoqy}}sntim~~xwwwx{|}uzxmzoh~rznmylolqwpƳĽſǿþVUVROMNPUZZWVSTZ^\XQMOQQPLIKPTTTOMV_adfffgf`[`cb_UPQMKOVXLDJTbhf`__TC88AKLHJOI;579;@EEHKLMMMMKIHHFFECEHMS]ZL@COVVUTTQMNSTLPUSNKSacba]]fmlihfhmnf]YUSRSW]bcabfg\TV]`^]biomebijeaadgmsqmhdchprommmllmpqpnoppppoifjljaff^XX^jdbe]ZdqqbONUX[hkbY[]\[_hksdWQYbek[Sggosmkli_TOP[d^[\^clrrihjjmibckjhpsfafjhmnga][bfb^_b```\briSZgecc\QUYSWae\Q[_PRdgdf_QHIVhk`YWSRWY^]RPKBEDCNSKEDMRIEBFT\YLEGPX_deWNT[^\WTVUS_fi^IHQG6@SIBGLLGEKWZSVW?8=KLFB?768866?MONPNA:LVnrdcefdraZdpttrj]XOLcqntorx^L[feeiha_ddffcbbeddhhjqyulhgebckjdcoqkc^`gfefinnlllg\Z_fmpp}rqvwocikqrjjrskjfiomkqmb[Z\_c]`e_VVY^[VV[bmplhijdal{}rknnlkklmvwllpoopuqhgilnlkaY^gklmomorlfgjlmmga_[bmmgahmc]a```[Zbd]_mqkkja`emw{yqszyromjkmoonigxvo|ekqmkkntwsljjimusjhfgkkmrqrz|wpswsv{}voqsopljy|~zrtpmielx~{~rr{qhimuswxyzzzwqpsryyw}s|~~~sx}xvzzu{yvywqjn{{{~roqhp~~~}zvuvxzy{~|uyyonnus~rwrn{yx~~öʿƿÿļÿÿUWVQJKRTWYXVSPU^a[TPOSUSOIHMRUTTNR^bbdfggffa^cc_ZTROHKW^UEDP]eedb_WI<:?HQPJLL?568;=CGJNNMMNNMJHIHDEEFHJS]`TDCPWUTTTRNOTRKMTSKIQ\cb^[]djkhgghlnh\VUONORY^abaeg`UUZ]\\`hpldbiohbabfkpsmjebdkrrommonnosspnmoopolfhmnkfjf[VXdlebc\`nsl]MKQV]jnaXY[Z[`ikobXUZbfn]RkoosnmmjaXQQ\c^]`bgnrqjlpnppffllirui`fomoleb^\che_^`]]^[_ohT[fbccYQVWRXceZPY[NRcgfjaPDH[llbZUUVXX][POGBECLWNDDGPRHCAKZ[OCBJRX^eaQOVZ[ZTUYSR]ffWIJM>5FPC@HKJEDMXWQXU77AMHB@;528<46CPMLRL<=Tg{jagfhjtb_ktutrlaUKUorptkvx[Ufhhkleaeggljgfdfdcjjluukdeedaknhcmtka\\djihimnmlmi^\_ckor}zqxumjlkptljlrnggdknkknf`Z\_`a[`c\VSUYVRT[bllfdfgbfqxwomomjiilouulnqolovpjlosqkliddmrmpqoqrkdgmnmme^\Z_jlf`eh`]____WWbc[apnike\aip{qmx{vrpnllnpqnlkywrygpqmmlpvwtnkiltwqlmjkooquwy}{wrwzu{}~|xuvwxvwzsuwpsqmq{z~~|qq}re}hirpwwxwwwunmqrxyx{o{}~}ptxtu~uz~xqrtnei|~|wy}pomgt}|}{wrpswxv|x}{vrxqs||y}sq{|y}{ŶĻƾþ¿·ÿWXVNJNUYYYUSRU\_]XTUVVVTNJKNSUSSRX`bcfhhhgb_adcZUSSNHO\]MCKZbcddcXIA=AHSVNKOG735;BGLQPMJJMPONLKGEDDFHJR_cTEBMXWRRSSPNPRPNUUKGMZ`_][Ybhkihghjnj_UQRLLQV]__`cgaWRW[ZZ^fnqe_gqnc`adjnpoigc`gotqnlmpqrrrtojkpqpmhfjpqomkdZW]iid^]]dooh]MIOU]ioaXWXXZ\hnj`ZX\cgp_Qisqsonnje[RT_ca_acgnrpnprossgfmolrvl_dtuslda^^dhhc^^\[[Y^niY_d`caWRTUTZcaUMVWKRbcclfOAI_njb[UWZZW[ZRMCDGDRUE@ELTPC?ESYQE@DLSXae\NMTYZXSTXRR`ldRJKE79JKACIKICDOWRQXO27ELEB>831;>38JSKJSG8D[q~a_jhjqtbemuurrn`POewrrrk}v^dlilpocbmkjwrifegeejlntnegfbbiplilrn`Y\dkieilmnnlea_adfmpwvt{rjmolqvkllngceelmlliea^_`_`[aa[TPQVSORZbifabb_`jstollkhgfglputrpnllqtnlorxshoqgfssmtqmopibgpnkkc\[Y]ii`]de\[_]^[RUcbZcokgj_\fkq||lmy{vrqollnppqrrzxxuktomonrwxvokjrzuoqokppqxz~}xww~~x|~|~vt}~|~}wv}zovxrq{x}|qp}te{ijupsuwvtrqn{gkrxwxym{}~x{~qr{uw{y}y|}vjnrk`g{~uy~lolnz|yz{xpkntqtuu{xyzr|tu{~uy~~||zw~{y}ǹÿȾ÷½»WURLOUXYXWQQ[a^\ZZYZ[ZTPMKMPTUSTZ^_`bgkkie``cd]USSRMMW_WGJY^ab`caTIECFRXTMORC415?INTUNHJORSRPNJECDFGIR_dZG@HW\RLNPQQQQQOSVMGLW^^^YW[fkkjigjnj_VPMMLOV]^__acbYSUYZY[bkpjbgqoe```flppkddcajttplnpruvvtpkhkptohbelrromke\Zcke_Y[`enmfZKJPV[ek`WUTXXYhpd`[[`fkraSivtrnnnlh]TYbebabdhnrqqrsrtqfgnsqswoaarzukcb_]dkmh`^][ZY^ml]_c_a_VRUTT\a[PLVSHTb`_niOBObljb\V\`[X[ZSJ@EIIVN>DHMVM=>KUSG>?GMQWcfYMLPY\VRWXSXfn`OMLA4@FLMOTPB@EMGA?715:B>4CSTLMQDCYhyy\eplospdglttptlZXbnvpvtr}khilrupelzsxzkbbjlkkkqppjjjfhkmmoqle_]eoph`clrrle`^fgcelo|rqxqoopvqtuqljefebfllomdfkcee\^^b]UNKMTRMOX`ca^^\\gnmkihfb`^`goqssqljnrronsoqzvnzwgnujswjlqpd`kogdd^[ZW\gbXZ]XRY][VPKTa_[de]eiZ^lpwxolpvwvvsnhmwtlpyxx|uklposxzvmmtztllprqqowzzwv{}|{||tw{{}|y{yz}yuwrgzrnruvutrpllp}ubdqut}ut{qy{vzzwp{{wx}zpzv|~}}ufittoqz}xkx|rtmyvjgkrkpytqruuzlqyu~syz~}~}z|wurvrz~xwz~¶UQPTY[Z[VNR^d_VWZ`cbb[SMKNQUVTSZ_`__djnia]ae`WVUUUURW][WVZ]]^^]`_WQNQY\URWWH728GSXTNIKSXWSTSPHBACGGLZe]IBJT`\MHNPOPSTVWWQKMU]`^ZTV^fjkighjmbTKIGDHQ[``[X\_[QPUXVV[cggcgvxg\^`^bimnleb``l{wpnmqy}|vlhginwvjbairwuniffbaegYPQ_cdieYKGOWX^fk_ZUQTXXhqe_\]hqwwg[jwvnikprogafhfbcghinqquvvwvofirvrsvpfbp|ymgd`bioqqib^[[Y^ml__aaa^WQTVY__XOLPKJX^Z\lfOKS\hif]S\`[[\]SA>NUY]GBWTMPHAKVQA58CKORXc^KGKMX\SOUZ[_fcQGKK<3EPDAFE?>@FJJNTK@JNNDA?3/8@@<:ITUMOOHM^iwu_golpvpcglssopi[[enssyrrfcioutnhv~pxyh_fokkkmtpplkjhkmmormd`]`krla`kqrrg]\cigcels}mpupoovxrvynjhdghhinnnkdllbhj_]beWNPKMUTMQW\a_]ZV^imggheb_]\`hoopplijprnlqumo{xq{vjrpjwthlql__mmccc]\\WY`^ZXVROW]XSMJTa_]d_[ifYcoqvrlpquvtvungpvqnrxu~~qikqprw{unry|rlnnstrszyz}tx}{xz|y{|z|{{z{y~yysiy~wurw{wtsrnmtwbaqvs|}zy{o|}txx~wo|}{|}~{mpw{}uegvwrsy||j}ztozvgblrhlpkkorsy|sesxsv|||}zxx~wtpqss~z}t~xw|Ÿÿ½SQRV[[YXTT^gf[X\_cfec[RNNRRTUVZ_```aflkf_]abYSUWXVUW]_ZXZ^_]\]]^^[XXZ^\VYYO@57CRYVPJLSWTRQSSMA<@FKP[gcOAGV]]QFIQSSUVWWWUMIPZ^_[VVYafjjgchkdULIEDIT[^\ZUV__UOSVUVZbeeadqxj[X]__eklmjgb`guzqllnt}woiffmtvre`dlsywmhdfdaffVLUbeei`TKKUYW_hk^[UQTXVfrgZW_kuzyi_nwwlgjqtqidjkgbeihjpqpuvvxvmfirvrsupgcp}znhdbfknpsnf`[[Y`lld__cc]WRSW\a^WOLNHLY]Y\kbNOSZfhe]S\`\]^^R@CY^YWIN]TLOHFQWM=7;ELORY`VEFJLY\QOVZ\^aYHCKI99JMBBEB<=@EFIMRMGPQKCB:,1=D>;?NYVMPQQVcjtsbhokpvn`dlrplkg^\ejqx{nvx_`lrurlk|}o{ygblrklnruormkjjlmnpng^]`fqob]hppnj`Z`giebep|tknqnnqyvrxxjifdggijnrnfhqhdoj]akcOMPLMWUMRV[]_`US`khagg`\YZ\`hmmnmjgjqojmsrin|wtsjqmlvnemoi]`liacc]\^XTZ][TQON[^YSKJTbb_aY\jaYgpstjirpsurvvngrwrrvy}zxpmiosrw{untzzsqqlturw}}{sy~{y~||z}z||{z{{|tkz{zvx~|tssstx|y{c^tyvx~}xn~tyx~yq}~~}|ql|{}vikzy}zlup{wc]ttejmfhnorx{vhezvtw}yz~|{~w{xut~}{soo{pu}}|qw{s}|y¾¿ÿ¾}}RQTX[[WTV^gg_WYaefhfbZSPPQTTRV]ab`_cilgb]_d]RPTWXVU[a^ZZ]^^\\^]]^\Z]aa]ZYPD:8APYYRLKTZXRQQSM@8ENB?DGA:;AFGHMOQSNLHB@6+2BD=FLLNU\ZJDFFP^\NMUVUWTJBCIGCKM=?FC<8>DEFHMTXVMIE@;2-8FB>>GWZWPR^]`hmrqghklssgcelpjfheabgmrzqkmckoswqko{yusghoomsyslrtkkkklmhd`\_hllibclojgc_Z\biic`i}zyvgkegckqwrsuoigcghhljnrnkpporn`gpj\TYPKPYTMRRV\_WPU`f\[caVRV\]bhghjf`elidjopkep{x|~jgjkqneelng]aeb`b`cmeOJWaYOLJR`]YPIMVgg`\R_hY`mmnmfjvptupuumgqvuuzx|zu|sblz{{ztqsvxy{tku}yw{|vsy}}{zyyz{y}{|}||~up{}~~yvry||z{}hdvwsnt{|w}~ws{zy|r{tenvckldhklsyuof{|onvywyy{~pw{vu{~umr}wmmwlt{w|}{xnvtyxƾþ~{zz|QSX\]\WYbpobQM[fllhd^ZVTQUZ[^`cdddgjmke`^\XRMQYYY\__XV_ba^Z[]__^_^^cf`YVNFB>?IV\PIMZb[UTVSG;;EQYafg[ICLW][PIMVZ^`ZVVWSMMT\caXRSX\ceb][af\QD?AHU^[UWVQQY\VRQSQQW\^\\cmqdUVYXY]dkqqgedisupjijrvolnihpyzna`bfr~|ndehgeffaZZ^hebd_UW]`\[`gb^ZWSVWWixmXYht{|{okuyqjfhqyvjlolighkpsqmkmprusmhjvyrrrokhqyxqlefmqmlsqkgfa]dorlfgigc^RP]kkb[QJKMRQPW^fXMVSVcecYSYZ[_`ZMFVi]KK\sdEERWT[VC>GJLMNV[UHEFIT^XMMRSTTMBBHHEIME8@D>88BGFDGMUXQGEC?8-3BHA?AKX[XST_acjotqfgimrlcdelledecbehltwmo~mikntumio{vvsihnoow{qmvtkmmjoj__a_emifghkmmjc__]^dkd_cp{qzofiddblqsponjgeafhhnknrllprqrhcnpcWY\LMRYUMPQV^]QOT^c[[`ZQPX]^begic]\fgdchomedsxx}zdcglrkefkme]_b`_aanv`GFWbXPOLW`]ZQLQWij`XPafXaljkldivqttoutjfpuuv{vxr{qbp|wtvurv{vmwyvvutz~}~yxyzzyz||||~}~vs{~y~xqy~|zz}nkx{uow~}|~xx{~v}mushoicikkv~wpurrumvyty{~{{nvz~~syyykp~|}rmu}so{vw~~~vwtvzſþ¼ÿ½~~|zyyzPTZ^_[X`lpeWPXflmkgb^ZXWVZ]\^bdedgmolgb__ZSOQV[]\^`\V[cd`\\^___`aaade]SMHDA>CQ]XKLVbaVQSTK<9DSY]ehaPCGTZXTMNY_`a\UTWYUQS[``YPOUZ]ab\W^gbPD=>FT^]VQUTMP[[TRQQPSX[ZY_inhXRWXTT_kssjabgmqqmikr|pnoniiu|ugccdft~yjbefgefdaZZ_jd`b`\\_aZZbgd^WWWYWVhxnYZgt{z{qmwypjikryvmnpolhfjsvpiimoqtsnjlvysrrmkksywrjcdmsnkqrmigb_dnrlgilid^TQ]kmc[RLLOQNLU^dXOXTWabaYQTX[__[LJ]l]HNaraCFU[X^ZGBKMMOSXXRGCFQ][PLORSSSK>@JHDKK=5?A:6;GG@>FPTRJB?>:53@LHBCGR[Z\VVccbjpuqefinqhadejgcdaafhfjuskq{yolkpurhfnxtw}phjopqw{royrmpqokbX_ddkkafqnkkkfb__^_gk_]lwrm|hgea`cmqonlifdaadegnlmonlpuqkejtm[R`[MQUXTMSUZaVJOS]a[[[UNP\_]`cgk`V]fc^ajojbhrr{~t`afmqifhkkc]]___aewxXCFXc\XSNZa^\ROSWlobUObdYbjiijchvrtsnvrggovvs|utn|pbszstyupt}xnyxuysvtz}}~xxz{xvx~{~|}z~~~|zv}}x|{ry~xx|ur{vr~~yz{t~p}npvg_jlj|wn}lyonvxu|~~y{zymux}sy|lmw|ztywmywr}x}wwuÿÿÿƿ¿~}{ywwy}OU]a_\^jpk]SWdilliea_\ZZ[_`]afgegnqogb``^YSQUZ]`_^\W[eda_\\^```aaabdcZNGEDA@K\aRJUac[RQPJ?:CNUY^dcVIGNSRPMOYcc_[TRSVXXVZ^]WQMOW]]\[YZbcTD<=EQ\^VRTUNIS_ZQOMNQTWYY]flgZRUVRQYhstkb`eikklkjr|vpppnjpzzmccbdgvwfbeeeed_[ZVaje_a``aabYXblg\SV]\VThxpZYeu|z{soyynkjlrwvoprqnhekuumghnnpsrnlmw{utqllmsxwsjbdmqnmrrokhebenrlilnke_VS[loc[TONOSMIT]cYQZZY^_^VMOVZ\_ZLNemSEUdp_CHU]_b[KIPNMSY\XPGCIU\UKINQSTOC=DLIGKD79C>45?GD;>HPRPG>;957?LQGEKQY\^b[Zheakrvoefjmneadeheca]adefmupjpxxslkquqfdnusw{jelqrrwxtuzqoutmbYXdgfkcatxlilkdcb`^agh_brthkwhebZ]emnjkke`_^cdagnlknnjnunegtvfWVeURWVVQOZZ^bNEPS]_[YXSMO_a\^cjhWR^c`\`ilfblqq|{n_`gnlggjljb\\__`glxuYIKXhh^SO\a_\QRTWpucQPdc[bfhhh`hwqrpmwobfosrp|uon}neyytvzuoszpxyvuqtry{}|wxz{ytu|{||~z~}}x}~yz}uyxxwz}}yx}|}~{tyjw~f^jlmqrvo}zmowx{zwyy|wlrwyty~nls~~{vvvyszy{rĽ¾½ÿÿǿ½ƾ¿¿~}zwwwx{QY_b__grof[Zckjihfcba^]]`cdcfkljlppkc_``\WVX]__a_ZVXajd^^\\^`bbbaacc\PGFFDAFVaZKO`d\TROIB=CMTW[_aZJCKRPMNLRag_WRPQSUXYUUZYQLOV\^]WUX`^TC<=DOY[UPSWQJQ\]TMKJMQUWY\dkh[PRVQNWittj`^agighhjq{xqqqpliu|se`bbbgvtdbcdee`WTXV`geaabbbabYYdle[QW`]TUjunYWdu|xytr|xlkkmqusprsrpgdluslgjnpqsroonw}xtpkmnruurjbdjmmorrokhebfnrlimplfa\V[lqg_WSSQTOIT]aYS^^Y\]\THIU[Y_YMQhkJF`hn]EKV\aeZOQUOMTXZUNGFNXXOHINQTWK9=NNFFG>6DJJMU`_TS`b]WRMEDIJNQSVY]YPMNLIILNQ]e_TMLMOOPSRNPRQQTY[ZYV[_`SF;EMSRIEIKIHHHLNLIGIKJJPT^fg^SLHGGPanj\UV[^___\\_fnsrpljijkhdelqyse^adedehlkg]VWWWX]\Z^gllkfZV\ch_\`_`_\ZY]bfgihb[_ciottriikhgggfmjcbehkg`^kqpkggpxqkqtnlynhjnooopsqklpvyuqpjiknrrmhhjnplimnmllkkmigklhfgdee`aifUNUYOFLUUSSUXZZY\d[O]g[V]b^Z^fibUMW_`bb`fbLJ]a[[\Y[a`^[PX^`mbZ[XWWUYTJO]b[UVUQLVbc`Y_jtplxvgchnlhnslefjjjd_ry^LOSR]opdckleatzpxynbV]hlnnomkmomqvwz~~okklqpgd`ejnx{wrmqvqqoamzvnmpkcgmbYULHPU\SQV[WZ[ZTIO\_cg]TRX\bjnjjd`injjc\\iyzne_`\VZZadZ[^Y`khhmfY^fjcPcvwoiedkv~yof[^dqrfhkghoidafjkmrsnwqdhrnjibegdadilqmbW`rjYSVahYSbfecXW^[TY]YZcjnrslkf_gwzhajx{oq}xplvxsuokvztonoorvwpnrrmoplr}txxissnmlstx|dwy}vo{tl}z|y|zt{qrwjntstsplkqngi}|v~zs~w~tsqkmmo{xpwyoxzsy~~{}{{}{{yji{z{~nruz|}~|~{vzy{z~~v~~~~{s{|uz}omvwwttnrxý½¼þÿ½þþ¿¿ù}{zyz}~zxvtssrqrrrpnortxhnuungkywkb]adgijmmmlnoonnooida`a`acb\XZ^\XZche[XZ[[\]afikkgfgaUIBFNOR[^]]]]^[YULGIMMLOSUYYUI>@JV^]UPQY^REEHJEEHMONLJKPSUWY[`\M<:ACCEFMOMLJKNQSSSQPKC=9>HNTTOMMMLJJJKKHEKPJEGNYdebWOLIIKP\ge\RQSTUVVVUVZbjjfdcbaaa__fllmoohddddcdfjhaa]RRYc[V[]_aa`_\VT^gaZYZ\ZYTSZ``aegf_WY]ft~sabhlkflttla[[bhd^Xapslhikrsmikqvx{xokkhffffju~~yuqqprtolmrvwskhjnommtzwrpsrpsrqqqqpmooigjofTW][[\\ZXUY]\]_`b\S\fcbeffcaifZ[_]Z^b`ce[Xcfb_[]egiljdfrroommllb^jmb^`fimnllkjighilp{slvxofhmniilfa`chjhhx|]IQYTWhobYdkfiv{v}sd_^hpnljhikmortxw}rnquyq`aegx~qntrtxwkkt~xxztsyyri[OLVZ`PJZbhbNPQUTZ\^[[XPMSW`ikhcchhheZV^s{poifefhg__cfeabcehihkllmggq}|nnypmmmsl`eipqdejgkoihghfglpqiohabgegeadfghijkkd]^t~k^ZX`cZcg\`^PSZSPUOHO^jfgqib]X`gv{hnuhqsnkjrunmprsooru|zuzupstxxnoygylpqknlpoqy~tkyy{vnghlghr~~ntzvunvsn{{pmmnkyleeacfovvxtuyvttvprvmjnoiedefjrlekjcgrnhovu~ux|vyrw|u}u}}|w}{y|~vvz~x~~}vmn||sey{xkwvitüýƼĿ˿¿Ŀ¿ÿƿ~|yz~|wsrssv{~}||{|vrpomkmmopmjjloszxslfkzzoiea_bhlmkiijlmmkjkhb__abccc`ZZclg`ekmie`[[Y\chikmmlf\VUUSRSWZYWWUYchcVJFFFHMRWXTI=:AP^e`UPRUZWL??DFFJNRQKFEJPRSSQMIC=;;=FUYUMFEJPRLFGNNGITWNJQ[a`\SNJKLLMT`f_SNOQRRRRQQV]dga`a_][[[\agmkekpmigfffegojcec[TW^`VSY[[Z[\][TUeg_YXYYYUST\b`cike[TRZi|n`bhmkmw{tg^[Zbic[Ybprkhklrrigjpvzzvnjjhcacfjs~rmmkoupkptxzulhjmmqu|~xqkq~qotuttrnovtniop[Vaccb^]YX^baaacioe_hhgjknh_dd]^ab_aaclhabghb\_hllnnotvxunorponhdnsjghimqsrtqlmmmoquxopwrljkomhjf^\`chiel{pOP_[Q^mfYYdggmy}w|kbbjwtljigknpqqv}zursx{oa`iiwnhttw}jkw}xxxsz~xtgWWdmfTPfoo^OURad]^ca]UPNQWdig]^gfde\RViumhle^_cb`]_egc__bgjijjjiihovunjsqjkeovpddhnrebffgdcgghhegklhkbZ_e_cdcbdggegie_[cy}j``^ab[ehY]]NW`QMUKDN`jdgmfaYW`o}tdzpeptmgjsqfeqwrpv}w~nowxz{qnwen~rrqhrwqnio{xls{}zrnhefdhjqml}~vpkptlxsmspjjed]djnpryssurqqpmpokkhgfccddhlddia`kj^cnmp{ztwzttrmv}sx|z~}y|u}|vx|{z~}}or~z|lzjvov½´ʽ¾ʼĽ¿û~}|zz|~xsqpprvz~{zyxwx|}wqnmlkjkmnkgjjmow|ricj|{qjb[[afhkkhedhmmkifdb_^_bcdcb`bikf_cptmcca]\\bimljmi_\[[\WSTTVWXXZaghaULKJKLQX[WNE@AKYbe`TPSSSPIGIMRTUSRME>@HQTRPMKGC=;ESZRJDBGPUSKDIPKIV\TOSZ__[SKIKMORU_d`VPNPQQQQPQU\df`[^_^[YY[^dkmgdkoligfeefjmfdieZW[`^TT[[YY\\^[U[iiaZVWZZTRT\dcflleZRQYi~l^aimlp{}tg`Z[dibXYdpslkllsrigipwyxtmihhc_bfjt|pmkiovqmotx{vjekqstx||vomw|opuuttqkq{wmlstaZ`cfc__]Z`eeeehknhdkiimpphbecacbdd`bjniceiib_dknpptz{|}unqrrqqmimrmjjlpttuvsnnnoqrssqxujklikjff_WY`ehgeo{iNUaXTek_V\dehqxxz~xgaft|tlihiknspmw|~vrsyzqcdnjuohtvzjkw|}vttu~}xm][jrk^Xhsr^WZWlmcbhg`USPRWghcZ_igeaWP[orggj`Y]a`\[_cd`\]cijjjiefhksuofkrgl~gflurfcgotf`eddaad`cgccgjii`Y`c]bdccegfccfb]Ycw{kab`bc\eiZ]^O[bONUHCPbgagkd`XTat{oj|}mequibowmcenvtp|~ylr}}y{tpxgk|tuthnyvpfk|zmp{}vnnjeccggkohx~wmhotlyrnxrhxoad_clrps}rruqpponoljifggabddhhace`agc\cllnvysrtqt|zomw|}|yqz~|{|w}~w~{uz~~{r|wqlwvy·ƻ¿½ǼſûžĿ}zzxz||vpnnoqvz}zxwvvwz~vpmmlkjkmojgijkov{nfcovng`[[afhjhgeehkkhedba_^_bdcbabfje\\ispg`aa_]]flmmlke]^_^[WUUUUTX[^cig]QOLMPTY\[RFBEJT_d`YSRSSSOKKPX\YUNIE??GPTTQMKIFA;?P\TGDCEMUVOGGQRIS_[TSUXZYUNHHKRVX^a\TOOOQPRPPQU^ceaZZ^^[XXY[^fmmfekmmiecbafnjbgkdYX_b]TV[YUZ^^^\ZdljbYVX]\TSV]fegnleZRQZkk^bkmnt~|sga[[eh_VZfrsnlmlrqhfjqvxvsnjjha_bfir{omkhouqopsx|xhcnwzxxxytmo|ynpuvutqnu}wnorsmc`dhe``_\bkigilmmmlliirvrggkddgeggcgpofdilgbcfkppqyrntrporplnoonmotvttwuqopqrrrstzthjlghfc`YUY`egeerxeQ[`VYhgYU\ceirvv}rdbk{}tjfhhkormmy}|xtsyyrfeoltogtx{ljvz{uqrwzqfcqwne_kvtc_a^oqifnkdWUST]jf`Xbjge\TQ`qmdif[WZ^^YY`ba\Y[biljfabfhnuqicnpbwoggksrf`enxh]ed`\_aZ_gb_djhd]X\][adaacgfa_eaXXbrxlabacb\fkZ]^P^cOPUGCSbdbhjd`WSfzwmszulfpugcvxgdelxwtrnuy|xrwjiyvvuhjz{rghy|noz|rjnle``ghgscr}xjfmtl{qq}sfos_ebcmrnupqtpponnmllhdjhabdeie^cd`dd\\djkltvqpposytkny{zxsozv~~~u}z}~zt{z}uvxsy~ľ¸ǿľĻžž~{xxwy|~ztnlmnpuz|yvtsttx}wolkkjllnnkgiiknuz}jddq~zqle_]]aegihfcdfhhfdba`^]_acbaabee^Z_mqjb``aa^_hmmllkc^ab_ZWUVWWW[_beeaXQQPQX]_\UMGGKPXa`YUQSUTSOLPY`]TLDABDIOTSQOONJE??JY\I@BFMVZTLGMUTU^`WVVVXWSOLKMSWYZ^\TPOQRQRRQSUYad`[VZ][XVXY[_fongeilmica`agje`il`W[cf^XZZWS\a^^^aikgaYV[_]VVX_fgjnjdYQPZlk_fmmryypic[Zfg\TZhssnmmmsofgmpuvsqpnmib`degqznkjintqoptw|yicoxyvvvvsorwnosuusppy~vqrrwufafkhbcc`domhlonopomgjw|rfhnfgiejkimqjehjkhdegmqqt|rptrqqrpmoopppptwtsxvsrpqrrnu}zpjkkffd`]WUX^fheequaS`_U]gbVV]bejquymcdqzmedfhjolhnz|}{xtsyytjfljtphux|plv{{uory{tnkv{ojktzvifffqpljsndZXXZhlc^YdjhdZQSdogbg`WUXZZWY``]ZXZbilg^[agjprjehqifvhieiqqe]bmyiYae^X]aX\gb\bihbZV[YW`ea^aee`_c\SUanumbabcb\hm[]^R`cPUVFGVaddhhd`XWkyrtzsmjhqsfe}xadinyz|{mpy~w{xrujhwvvtjiwzqjiw{omw|ofooe^]ghb|wan|yjdosj|qvsfm~vdjfdospznssppponlmogemhaddhk`\dc_caZ\elkjrsmmmnstmiqzxvsrpyy~w~}r}~{y}{r~}z{zz{õŻ»ĺÿƿ޾ý|zwwuwz~~yrmllmotz|xtrqrru{wnljjjllnnjfiijlrx|~hbcqytnjb^^_ceefedbcefeca`^\Z[\_``__ab]ZY`kngaaaaaabjnmjjieceb\XWVXYYZ^aaa_XSRTVX[\]VMJHKOUZ]ZVTRTUSQJNV^^UKECAGMRRQQPSURJB@JVVNCCEJS]ZRMPVWZ_`]XSTXYVNNNQVZXYZY[VOORSQRTSVZ\\ZWWXZ[YVVWX[_hrngdillfba`cgdaakk^Yagh`^^YUT\b```elje_Z[``[VVZafinlhdWPQ\n}jahmmt}woleZZffZR\lsrmnmnsnbiqprqqqromjecddgszmijhlrqopru|{qkrxvsuutppxunortsrprz{usss||jbglidegdfoojlpopurkho{{qgjojkkgkmosngjmihjihkprqwvsurqssolnprssrtwtruwwroqsqlu~{mhjiec_[XTTX^fgdeqp[Ua]X`eZRX_cekou~wicdwvhb_bgkmhfq{{{}zxtsxxumgjjvqjwzsnx{ytoqzwrnx~qmv}~xmlkltrqpwqha\\anq`[\gihfYOWdleedZUUWWXV[_]YWWZafgaYY`fknjbakmbrmpmbfpre\`kyiT[c^VY`XXdb\`ghaVU[WV_da\^aba``XPS^jqlc`aca]hm]\[UfaPZ[KMX_dggfdb\_pus~xdghinocjsagjq{{}tnt}|vzwnp|nhsuxvmktxrnluzpjs{mbmsi^\fea}yam}}kcqqipwqfm}ykpjgrvv~lwrnqtpjkpogipfbdgnj\`fcbd`Y\ipkjqoijkosohht{xrqssy{~w}~t}xv~}u~}~}}ƻǽȽ½Ŀÿżÿĺ~~~~~~~{xuustz~{vpmkkmpty~zwsqppqty~wnkihjlmookggghjpvz}eacouqkga^`bddddccbbeeca_^\YXYZ]^^^_``[WXajleabbaacdkpnihhgjjb[WVX[\\]`a`\ZVUVY[]]\TLHGIMSZ\ZUTSTUUSNJW_]TLEDJLOQSQMRWYTMFDITYPFCGKR\_WSTW[]_``\VTVZXTQTVY[WX[[[ZTNNRVSSWUW[[WSRUYZYWVVUX]bitmffilke`abdec`alj\[hjicb^XTU^ccbcimid^Z`da[WV]dflplgdWNQ^p}|jbhmmu~}uonfY[heWSaptqmnmnsiakspooqssonmgeddhtzmijhkrqpqqt{~wsvwtrsurns||rooqqqqqv|xtutt~jcgljefghiorpqrpqwtklv}ypimonpmkmoy{lfnpkjmoortrszyutqpstnklmsuutvxtptzzqlqrolyvifigc`\WTSUX^dgcdnkWXb[Yc`SQY`beimuulad{qf_\agklghuzw|}zxssxxtoiikwrkwzvox{wtoqz|sp~ro|}zttsqvtvvztohbahsv^ZbkggjYS[chhicUTVUUWU^^WTUW[adaZWY`eike_`ihd~yowl`irqaZ`kwjSVb_UV^YZa`[\dh_RUZUV]ab][^``a^VNQ\gonc`acc`il_[WXj`P]`RSZ^flgcec^etsvs\bikmjbunckks~}npx|wzvnoyrhntyxqlrwsqnsupiryl`jvl]\fc`zal~jasrjpxogn{}uvnisyzo~qjryuhiuqgotebditgXcgced_X\ovjirmegjorkdjw|vqpsvx}~w}~~u}vq~}|Źɿþ½ÿ»¾ø~}|||||}}}}}}~~{vtsrty}ztnkjkmoty}yvsponosx}wnkggjkmpplheefinty}c`dnspjea`cdedcbba`bdea_^][WVXZ\^^]]_]ZWXbiic`aaaadglpmghhhljaYXY[]^^_`a_ZXY\\\]^^ZNHGHKQW[\XUTTTTTSPU\`ZPJGJOQRRPOSZ_^SKINSVULFFMT^_ZW\]_`ba_\XXXWXVRYb`\SQZ\_\RPRTZ[Y[][XWWUXUUYZXXWWWYahkvmdhjkkeabeffb`bij^\opkkh`XUV^ffbdkmg`\]cd`[WX`fgnpkgdWNR^r}|kbjllu~{topfY]hcVUfptpmmnppfaispoopvtqpogfdcdp~|ogigipqpoppw}tsvvrqsror}{tponopqqtzwuvuu}phfklhefgkntwwtpsxslr|}wokoppronmr|jgoplkpsuvtrt{}wurqrtpjhkowzwtturot{xolprmmywffhfa^YUQPTY_eebeleVX`[Ya[PPY^`eiow}{sk^f||maZZ`hkifkwvu|}yxtsvvuohhlyrnwyxqvxurnowvsup{{zyuxxx{{wrmjjr{w]_kmfip[Z\adnkaQSXUTVWa\RSVW[bc[UVZ^dghe]afepotue`jup^\bgolYT`_TU\Z[_^YZbh_RUXQQZab^]\]^`\UOP\ellc_`cedhi`ZT[oaP\`WUY]hngaefaivq|kXaikkhjkhnmu~}~~wls{~{wyuknw~thktzyqmqutsprupjqwj^iwn_]ebc}cli`vtloynhpxzplw~~toit~ueivqjurceelvcWfidgf`W^tvmmrjfhhoqfepz{uqptxz}~x}}x}tn~}~}Ƚ·ÿ¾ɾ¿½}{zzyzz{{||||}}~~zuroprx}}wqmjikmosx|ytqommmpu{xmigfilnppmhddehotx|a_dmqnhdaadeedcba_^`dda^\\ZUTWZ]^]][[ZXVZdiga_`a`adilljgjiijf^[[\^``aaab_YZ]`a___\SKHHLSZY[ZYWWVUUUVWaa[RPOQTSRQPQRYa_[WRRTTROKKNU\a__acdcabb^[YZ[\[YZbf]QNU]`_THLUZ[]]\[ZXXUV[XWZYWXYYX[eel{mdhllkebdghfcbdjh`fupmrk_XVX`iibdlmf^[age`\WYafglpigdUOV`q{ykcjllu}zsoqfZ_gbWYjrrommnqoeamroojqyvrspjhfbdr~zngighnqpooovzsttrqqpqw}xtrnkmpsrwxttvutogejnhdegkovzxrqvwppx{ytmkprrrqnmt|vhgoqlnsvwwtrtz~yvtqqqqnigjr}~wtspnqy}skprnlsofgfca]WSONRY^aabfi^TZ]Z\]UMQZ]_ejr{}voi]i|wg[Y[ajkfepwor|~xvtsuutpihnyrmtx{ruutrmmwwvuq~}}|{xyy}}zxspt{x_gsnhot]]]`ewk^PTYTTWZbWPSUU[`\RQUZ]deb_[`hjywkvqbalvp^_ecgm_R\_URWY]^]YX`h_QUVPMU``]\[[\][UNPYahjb^^ageefa[R\pbR\b\WX]ime_fhdmvr^Uckmjgskpppw~}ypnu|z{zvxtjkw~sgirzxplorttpoonhoui[fyr_]dagenjaywopz~miqu|pn|}ynhxpalvoqwkhjhpvaZijgjiaYc}wnpoiihispgmv||xuux}}y|~|sj~~~ĻĽ¿¿½ƾ{zyxxxxzzz{{{{||}xrolmrx|}|~vpkiijlptx}ytpnllkmqwxmhedhlnqqoicbcglsw{^]cmpmgcaacdecaa_]\_dc`\YZXRRVY]^]\YVUVU]gic_^_``belligglkjfb[[\^_aabdca`]acca^`a[NHLQY\]][YYYZYVVVYbg^QNPSTUUSQRY`da][[ZVTSPMPTY`eccdeddbaa`^\[]__\]bc\PHNY`cYJHR^`\]]ZZZZXTYa]ZYXY[[YX\cal}nbhlkjebehigddfifeqwmoxm^XXZblibekjea`chf`\XYceeklheaXRYaoxwkekllu|wrpqfZagbY\krqomloqncbnronisyvruumjgbgu~xlfgghnqqonmu~urrqponq{{vssnikpsvutrvvttmcejpidefkq{~vnqvtrvzxtpllqvurqonx|qghoqmotvxxtrv{|{xtppqrpjhgjtvrqoms}zlirojlwzlggd``\VQMMQY\]^bheXS[]Z\[QLSZ]`eks~{rng\l{pb[XY`kmdertlr}}zxutrrstqjgpvsjpvsrrqpklvxwus}}~{xx|~|{uu~udpwmhru^^_^k}l]PU[QUY]bTOSTT[\TMQVX\ba_\[ahslkvmaamvn]aga_lcQV[UPSW[^]XW^ibSSWTMMY]Z\_\WXZTOPV]efa^\^ilebb\Q\peU\fc\Y^ilc_gifpuswUUcloif~xjssu{~~{|~opx|wyyuxshjw}tgfqzxpklotvrlkjhntj[cyua]dbihnjb{xrryznkqu~op~}}mg{lbrunwxhmnlww^^nlkomc[kzpqnhlilwqiu~~~|z{~~{{{|rj~~~øľ¼ƿĻ¿¾¼ĺ~~}ywvuuuvxxxyyyzz{~{vokjlqx|}|z}{tmighiloty~ysplkkjkot|ymhddhkorrqhbabeiqwzZZbkolecabbdeba^[YX^ec^YWXTOQVY]][ZWSSUWaif_]]]``bdhgehkomhd_\]^_`abceebbbhjfc_aaZRPT[aa`_]\\]][YZ]becXOORRSTTSTW`ijb\^a]UTVSQV[_dmlgdiecbaba_^^addbab\RMLV_`^RIM\ea\]][ZZ[YW]ecZUV]`]XYZ`apznbhighecehhgffhgcjxvjs|n]YY\emicgjedb`egb^ZX]eeejgfe`XSZ`kuvjfkklvzsppod[bfa\alqomlloogahormkkt{vrw{olgdjv~xjcgggnqpokjtwprrnmns|ytssnikosupnrwvst}}pfdjoidfgjt}|qkqutwzwurnllrwwspooz|nfinpnptvxxrqvyz|{xuolnrpkffflw{spoljt}sfjrlhnyvkgfc_][WRMNRYZY\dicUT\\[ZTLLVZ[`flr{xpne^nwi_YXYbmkdhrplt{xyvssrqrvtliqv|shmv~tpoopklv~zwut}~}wx||{w{whu|pirua_`\mq]UW]PY]_bRNQSSXYPLSVV[^\[[\ak|tfosg`bovl]ch`[heSRXSNOQX\[[X]geWPW[SIPZY\f]STWTPPTYae[W[\ipe_b^P[qhVZii]Y_fib^ehirsunQVepqgjtmwyy|t{znpyztwwtxrhlx|seeq{xoiijrytjeeflrm\`xydZeglmlld{xt~qwwnlqv~oq~~{igggvsq}wfpsr}u^grnnspc]q{qunkojnzsmz~}|~|~~xuqp}zľſǿ¾¾·~}}~{wutsrstvuvvwxxxz}}}ztnhhkqw|}zy|~zrkhffhkoty|xtoljihjmqx{ohddhkosrria_aehovyVYbkmicabbabb`_[WUXbgbYUUVQMPX[^]ZWSRSUXdid][\]^`ccfdcgoqmhd_]_aaabceggdbfjigb`ca\Y[_cdcb`__`b_\^acebZSQRTSSTVZ]_bffa^d`X[\[\]]`eikljemdabbcdccceggd`ZTTVW^d`XOMXdd_]`_]\\][\efdZWY_^^V]baaquk`fededdfhghhijdbozrju{m]YY\fojdfgee`_fe_[XX_feefeed`WTZ`isthejkluvololb]beb^dmpnkkmomcajqoijkv{vtzxokfdku|~wgahhgmrqlgirxorslkovz{wrqrnhkoqojlswsruzzrgdjlheegnxzrklruuxztpqnjlsywspmq}xifjkmoquwwuqrvvvxutqjhoqkeccfnx{vqonihvzkemqihr{{rkhe`^]ZWRNPSXXW]di_SU\\[[SKMV[\`gmqutpmdapte[XX\emhclrmmvzvxuqtrpquvniqvz|rjmu{toooommu~|}{wtt|~uw|}}|zp}tntwdb_\lu_XY_U]bbdQLOQQVUNNTURW[VW[\bu{kisn_^isuj^dh_ZgeTQSQONNSWZ^]\dg[NT_YKKZZYegYPRSQSVX\bXTZ[goe^a_QZogW\ig]\adeb^bfkrqxhOViuqgqtq{}}o|vmszwruutwqinxvndcp{vkgggoyvjb`chmk]^xgXfmlxqknf{xv~rutolnzoo~|}xgjcjwptreryv}pdnsqrvrddz{wwoosnr{vs}|||}{{}yvt}rw~}|x{ſ¾ÿµ¿¿Ⱦ~|{{}~yusrqqrststuuvwwx|~||xrmffjpvz|zzy{}xpjfeegjnsy|wsnkihgikov~{pgbchlptsqia^`dhmtxUZdmmha`aa^^^\[XTS\de^VSSTOMRY\_\VSQQSVYcgb\Z[]`accdccltqmhf`]_`bbcegihfdehhecceea]`higedcabcb`^`ccc^VTVVWWWWX]dgeda_dha[bcafiedlprqieke`cdhgggfgfd]WUTY\_bd`XQUdh`\`eb_```]bkicY[^a_^Zcgc`kog^dc`bbdffgjjlh_aqynjvxj]YZ]gqmeeggd`_fd]YXZ`heccccb^WVZbjsshdhkmstmilia_debbelpngimmidckpkgjkv{vvzwnkgfktz|ufahhfkqomijq~{osrkiovwxslmroikmmlioxvqrvxyrgdijgdbhv}vlgmrtwzvqoolgiszwrnlu}sffjjmpruxurprvtsvsolhionfabcfpxxtoljfjxuggnphiu|xoihc^_b^XSNQUWWX^fg\SX\\YXTLNY]]bioqpppk`ctp_YWY^jmfeorkovwtvqptqnovzpjquwxqlnuzuooppmlrz|zz{v}}ut~|{|swz}}~{zruxgc`]mwc[ZcY`fhfOKNOSVSMNTSPUYTSZ\i~~njnqgW`qvqd_hi_[gfTOOPOLLPSVZ`^_gaRO[_OGU\Y^k`ONRSUWXX^[UX[ckd[^]P[ngY[gf^`cceb]_dkrs}~dOXnyqlywu}yqtmsyuttoruokrxrjccpzsigdblxvka^`dgf^]xnXeqkrrkph|ww~rqrojlrm|{wgl{bkvot|mduz{}omtsrsvren|~ypturu|{yz}|w~}}~vwy{~|uts|x|}~u{}}||yy½¿¿¾ĸ¿½¿Ż{zxy||wsrqppqrrrssstuuv{}{yvpjediovz}{ywwz{~vnhddefhlrw}}xrmigffgint|}rfbehlpssqhb^_bflsw~U^gmlhb`_\ZZZZYUSS]ed\TQQRPOSZ]\YTQPQRX\`ca]YY]bcacdbgsvokgd_]^``acegjhffghhfefiib^fmmjhfeccca^`bbb`]ZZ]\\[[Z\`ilic_ahhcbeggjlgfouvphfgedhilkjjhifaYTWXY]acb_XU_hg_\cheaefebhoke[]cb_`agh`ajke`da]_cebagjkleZ_qxjjtuf\YY_iqoeehhd^^fc[YX\cjdabbba^YV\ckrpfdfilsrjgjg`aeeddekpnehnhgdekoiegkw{xx|wnmihkqxzsdagfdjonnkkoy~nrrkiptuuqkkqrkhjkiisyursuvxrgdggcadqzoihmrv{{tonlhgltxtpklwzmcehknrsuvqoqrrrstoifdioia_`dirwtpjgedmxndinlimuxunhg`\bhaWSQSWWWY`id[W[\ZVVSMP[a`dinppnng]fsj\YYZammegqqkpvvsuspuqmow~ulrstvrmmsxwooppljpxzxx~yuyzttzwy~xqwxz|~tuvjfb_owe`\i_diojPGJPTSPLLSROUYRQY^rtgjpm_Vetsi]`onbZceUONLKIIOQOS^b]beYOT`WGL[\YafVMPTTVYXWWTVYahc]]ZP[keY\hd_bddb_\^cksx|dR\t}suww~sttmuystqlqtmktyribcpyrheb^iwvka]]bec]\usXevjnsntmzvx~olnnhjsnyytfpxdmtotxjfx|~oqwtrstqlw~{txurz}|zyysy~zyuxsw}yx{x|qz}sq}yr{|}}zzw{z{~zyþǻ¼¾ùzxvw{|yvsoooooppqqqrrstvy}}{yuoiddiov{|zxvvyz}|rkfbbcehlrw|~ysnifddehmrysgdeilpssqha\]adkrv|V`ilkgb^YWWWXXWTQT_gdZRQPPPOT[]YTQQQQSZ]`ba]YZ_ddbaacmvsmgd`_]^``bdfijhffiihfghkgackomjjgeedca^adbba```_]][\_`dmoi__hlgddfhhjihjsutnhffffmklllkjie]TSZ^_`ab`_YWcic_bghdfkifhppkd`bf``cfjg`aiiddc^^_cd^_gllj_YcnqgiqqdYWZ`hsqedhgd^^fa[XX\ejbaa``^]ZX\djnmffeglsnfege`beedddjplchngeefknhdciw{xz|tmmkjmotyqcagfdinnnmlovoqrjjqqrqpljpsmefjjksxssuvwxrhedca`l~|njigkrx|wpnlhfgmtspngkywgaehkprttqnnqqooqpidbbimd[]adjsuokhc_bqthclkfkqsssmhe^ZflbWSSUWWVYcjd[Z][WVWUOR]eefjnoomlf`lqdYZZ\frneirpjpuurrtpuqlnx~xnrsstromqv~zooqojhnvyuv}xuvvsswsw|smwwy|vuukjf`pvgdamfelxpPDIRTPOLKRQMUYQOXcz~jdjmjXWknhb]ito`YbdVPMKHFFNPJLXa]\b_SOZ_QIT[UYb_ROSUVZZUUTQW_ed^[WQ\hbY\fc`dda^]Z\clu|yfVa{x~v|}}r|vovyppplptnmtwqibcpxrhd^[gvujb][`db[[rtYfziksq}zswuy~jglmhksruz{ohsueosntuhj|zoswsrtrmo|~z|vu~}}{ywwou{wv}tyytuw|xuvsy|nszspztnxz{}|z|zqzyx}z{廾ʾ}xvvwy}yvtqonmmmnnnooopqrtx}~}{ywsngcbhntz~|zxvuxz}yqjdabcdglqv{~ysnhfdcdgkpw~uideilpstpha\[_dkqt{Xcikkg`YSSTVWUSRQWahcXQPPQQQU[[VRPQQRX]^ab`\Y\cedba_eqvoic\\]]^__bejjjiggjigfgjjgfhlpmiiheccdcacecccbcb`^]\]bfillf`cmnhfeefgiijnuuslhhfffhklnlkjjgXOV^cfecbbaYYeidchkhejojhpuplecfe`bfhkgcchhbfb\^aeb\akmlfYZfkieipmaWW[`htsfdhhc^`d`YWY_gi``_]]\\[[_dhklgfeflqjddee`befebcioi`hlfcghjjfbafrwxzzpmlkkmmrwqeafdcgmppomot|uqqkjmmnonkkpsnedhmqruqrwxwxsiedbahwpfhhhmuzyrnkhecfnsqmhckxreadhkorsqnmnqpnmnkda`bij`X]bckttnie^]espcdmhckqrqrnhc]]kl_WUUWWWVZfmf^\_ZRR[YPTahhgjnomkicdqqbY[[^isnfktokqutqquovrlnw~xprsssqrnls||poqnignvwsu{~wttrqsuqvzojwyvxyz|}wttmjgbo|thfdnjeooOFOWRPUMJRQO\[PNZl}t`ckjbV^me^afprh[XbcWQLIFDFLOMIP\[WZ_ULV`ZMLWVTWa\PQUUY\VPOMPXcd_ZVR[f`Y\c__dc^\[Y\dmy|wk]gv~yxwowxnoplnpnmoqoiccoztjbYVdtskc\Y]baYXouXf{kksu|v}wttz|heikfmvzyrzukivtgprotrgm~~wqqusrrplq|~|ux{y}|uvmryvt{uv|utuzxtuswyloxtp{pktwy~|ysy{ntww}{}z}ľſ˿ÿľ{vuttt{{wsqpmlllllnmnnmnoprw||{~{xuqlfbafnuz~~{xvttvy}xogcaaadfjotz~~zsnhecccfjou|vjdfglpstoh`ZZ]bhqu|[ejkjf]SOPRTTSPNQYdjbUOPQQRSV[ZTONPPRY]\]``]Y]ceb`_]etumf]WYZ[]^_bejkjigghhgfhjlkjkoqnjigdcdefggfeeedec_]\^`ejhhfcbiolggeeegkjkqusojgiffhkmnpljjkgYS^eghhebgdY[fhgilmkkoplmvvmjhgfd`cgjkgcehhdf`Y\bf`[cmnkfXYehedhlh]UW\ahuugdjia]`d`XV[djh`^^\\]]]acfgijgffflngcddcabegebbinf^gjcahiifcbadnuxzvnmljkkkpupgcdaafmprrmkq{{rokhhgjmnmkpuoebfossspsxxvwsjeb_duufehhioz{snlhd`afmrpib`muka`djkoqqnkknpnkjhea_`dhcYW^admuqiea\^jtkbgjdcnsqopog_[`oj[VXXXYXW^hpldabZOQ]^SVdkkhimnljieisk_\]\`ltlgntojrvupquovsmnv{rrsstqtqhq{~sqpmheluwqsz|urronstmtyjgx|stvut~z{yttoljfoyrjjgnkfugONX[OS\OJTSRc]OM^qyf[ekfZYfk_ZdormbVV_aYSMHFEGIPRILVYUU[VLQZ]UKPRROZ`WRTSUZULJJLS]da[UQ[d_XZ[Y^cb^\ZX]ep~wyo`nx~~}z|xp|zlnplllnkgkmjedozyl`USbqqjbZWZbbWWntWgnk|tvxq~{stzzebfhemyurzqgixqhrrnsqgo{vrprtsqnnu}{t{x{yzuuknutsy}tvwstxwwsqtxulmvtq}nhpuw}|x~~ox{nouw}|}tzù¿zttsqryzurpnmlllkklmmlllmnpuz{{{wsojda`dmuy}~ywusrtx}wngb```cfinsx}~zsngdaabeimszxkeggjortqh_XX]bhqv~^fjjhcWOMPQSSROMR]gk_PLOQRRSV[YRNMOPT[^ZZ_`]X]dc`^]^fusje[VYYY\^_beikigggffffhlnmkmppnihfcbehghgggffed`^]]_ehkheccfjkigfcceimmlqvqnhgfegkonoojjkje]\fmmjhecfcZ]hihknmkourlrxulijlic_cgjjeeehjie\VYbf^^innjdXZbeddgjeZTX`agsuidlk`]ab_YW`ilh_\\\\]`aeeijihggffjkfcedbabffc_`gjd]gibahigd`__blsxxpllkjiihlsohdb_aflpssmjpxsnkgecglooknupdafnssposxzxwske`_k}~jchghjpzxoljdaabgnqmd^alnd__dkkmpplikmligfda_]`edZSV^aepsmeb\X^lshbgfcfqrmnpqg[ZdrgYVZ[\ZXYakqpfccYMQ_aVZgoojjmonljflpe\_a_doskhqtlkswuoquputnnu|usrstpurgpzusqlecjsuoqxztqmkmvsjs~xedw~tpturpz~wy~ztsqmlkqvqllhomfydOQ[WKYeRJUSThaNMdrm]YflcX]lhZWewue\TV\]ZUOIGDCGPSMIQVUUYWLLS\[NNONNR\^YURQUUMIILQXae^TR[b]TUUU]ca^\YX^gv|t}scx{}|}xt{joplikneaknjffq}|n]QRanokbYUZa`WXl|rXkpjuvsso|{stzwc_aego|}{qrz{mfj{ogssnsqjqyvrlnttomou~yr{wyyyyukmqqpw}uuzrtxzxplrvrklvtq}lfmsv{|y}wlu{uqtw|~qzǼļxrqpopwxtpnllkjkkkjklkkkkmpsy}zz}{wsnhc`^bluy}}yvtrpsx|vlea`_`bdhlqv|~ztngc``adglrxznggginrtqh_XW\bhqv~bfijg^PKMQRSSQMMT]ggXKIMRSSSW[YOLMNPV^^WYab\X\da^\]^hunecZW\[Z[]]`cgkjhfffeegjoqnlopolifecdikhgfgfffec`^_abeiihfegljdcfdabejmmmqtplgedeikmnonjjkjb_emsqkffge`\ajkjnoljpwsmv|umklkgcadhjifegjmkcYVZaedhnpokbX\bcccehbXTW^afrvidmma_a_]YZemng][\\\^acfgkljgfgffhgcceda`afea]_efa]gibcihfc_]]ajrwujhjkjhfdhonic_]_fjottmjov}umjgc`elpojnsmecenrplnsx{yvskc]`stcdhghltxqmlg`]_ekpng_]bhe__aeijlonkjklecddb`\Z^c^TPW^bipnie_VT^nodbebbmtnknpqgYXetfVX__^ZX[dmrskebXMRabZ]jrrnkmpomjjmlb]cebgpskjruljtyunq~wsusnmt~}xrptupvuhnx|{xqicahqslpvwsohglvqhq|xdctxnmqqoluzsvzw}ztsqnnosrpmljrmf{dRV^UOckWOUUVgeVQhqcWYfl`WaldXWg|t^ZVXZYZWQLICAFLQSJLUUSWXNFNWYTPMLNOX_]VSQRSQJGJNR[fcVS[`ZSRSV\``_]YY`iyywti{x{zlrslgjj_cqoiggs}n[OQammjcXSY`_XXiypYqpho{xoloyxsu{~sb\\ahr~zslsz}wjdj}lguuospmvvwqhkssmnqt~wp{y{yy{ulmrnlv~vt{~svwyzqkqwqkmusrxkcjqwxz|~vlsxztvy~~pzɾÿ¼ſ~wronnns}~vqnmkjihhhiiijihhilnsw{|vx~}zvqmhb^]akty}~{xusrpsx}~ukd`_^_acflpv{~~zumgb__abfkpvzohgginssqj`YY]cjrx}cfghbTIINSUURMKNU]edVIHMSSSTXZWMIKMPX^[SXdd\W\b_\Z\^jsjb`XW^[ZZ[[^bgkjgeeeefinrrmlopojgfeejnlhddhgfdaaaaccdfhijjkkkd_bdbacfjllmospifdbeiijllkjikicdlruphfhhd_`flmnpnkksvrq{~tmlkiecbehihfehjmjaWW[`hmmloqk`Y^bbbcegaVRW]afrthfoma``_][_hnpf]\\\\^cffglmjgffgfgdacec`^aee_[_dd_^hhbcihea]\]`hpwshdhjihd`ellic[Z_egowwmiotywlkhb^elpnjqtjdcfnrnimrx|yvtl`]e{k`fhfjpwtmkke^]`emnha`_afb]`defhmmihjkgacdca]XX]`YPRY]ajniebYSUboj`_a`frpjimpqgWWguhV[d`^\Z^gntvogcWLTcc^alssrmmqqmjkmja^dfchrskkutjiv|umqyuttoms~ysoruqvvkoux|rhcbforjntusmebitogoyxddpqjjlmkhqwppts|wsrroorvsomloumh|`S[bVTgk]WUVZigaYlnZQYhj]Yce]XZizq\ZYYYVWXSPMD@CGMRMIRTPSXNCJRUWPLJKNU[[VTRQRRNGHLOWdeWS[]WROSW[_aed[[bl}|}sq|z|outjfif^ivoight~lYNQalmjbVS[`_Z[gvo^xnejxwkhoyxru|zo`XX_it{{nlux{qebj~}igwxnppoy~svodhpplptu~{tr|~{}|}yuolrmjw~wtwxxxyzslourmnuoqvlbgmvxu}xkot}{wz}u|{º¸Ŀ¼¿|upmlkkpz|toljjhggfggghhffgijmqvz}ytv~|yuqlga]\`isy}}{wsqoorw|}sic`^^^`bfkouz~~{umf`^^_aeiou}{pihginsrqjaZY]cjsyegheZLGIPVWUPKJOV^dcUIHMRSTVYYULEINQY^YQXed[W[`^\Z[_kqha^VW_]ZZYZ^bfjhdbbddhlosrnmmqpjfecflnkfbeigd__acdeeefhjloomg`]bbaaeiklijmnjecbdfiijkkjjjjijmqupighigc_bjoopqmimvupurmkifecbehigedfkoi\XY[bnohgmqi_Z_a`bcff^TQV]agqsjiomc_``_^dlppf_^^]]_ghghnnjhhfghgb`cec`^aed]Z_dd_`jjcehgc_]^_biouqgbfhgeb]clmhbZX^cfowwnhnrvxmlia]ekmnlrtjccflpmiilt}{vsl`_ovfchhgmtwqkkkb]^`fkha_``be`\fiddhmjchmhaaccc`YUW[YQMSY[`ilgb\TRZhoe]]^ajqkegkoreSVguh[`gc`_\_gnuyqieXNXffaequtupnstolkkiaahifjttloxtijx}rms}|vssqlqzsmpusuwlotv~ukcagoqilsurmc^fsoemxxdenliijkifovnlpq||urrsoouvsnlmtylj~^U]eUUhmg]UW_lkh_plTMZll\Zc^SW[kxm\ZYZYTTXTQNF?@EJNNINSMPVNAGPSXTMIGJRXXWURPPSSKGINW`bYT[[SNOUTXbemj]]ep~ty}|tvsiehfeqvlhiiu}jVNR_ikiaUS]ba^`hqof~jcgtugeoxwpv}vl_UW`jw~y{{lnvw{~ndal|gg{|mnps}{qvoadookrvt}zst}~{y~~rrvmpljxvsxzzxyunnssqqunq}rzmaelvxpzmiq}y|~~~ļÿý¾¿zuokjiinwzqlkjhgffeedeeeefffhjouy|~}}}wsu||zvqmga\[_gqx|~{vspnmpw{|qha^]]]^`ejoty~{tlf`\\]_cfls{}qihginstsjb\Z^dluzhhhcUIEJRXXUOIHOW]a^QHIMQSTVYXRIFLQTY[VR[ebZWZ^]ZWZ`kldb`VY_][ZWX\adhgb__ceimprqnnopoidbdjligdbffb_]_ceeefefhlprqhb_^`bcdimljghkkea`aeiiijkkjkkkkottrieijifa`dlooppljqwtrz|mjigeddbdhgfddfmogZX[^fqnffopf^]aa^`bfd\RPV\ahprllnlgaacecipqoga``__dkkijrnjhhgggea`ceb_]`cb]\_ccaeljeggea^]^aciosne`dfeb^Zajmhb[W[afmsumhlouyolha_cikmmrujccejnmifgr~|wsmcdtzmdhjghrxtmkmj`]_afga____cbZ`kgbdgkgbhkd_aa`_\UTWVOKNUY[clme_XPS^klaZZ\cmmdbhloqbRVfsi_gjdbb_agnvzskgYPZghgjtwvvqpsupmmlhacllhlvvosyshky{rmq|~wrurlq~zqkrutuwnnrsxlaagnnhkrtqla[csoekvzeeojeefhfdmtjhmr|~wsppronxwqnmox{km~cY`gUWotnaTZcnpncrjQK^qk\[aVOU]lwkYVXZXPQVRNNJB>BGJLHLRKMSPACOUXVRLEGMQVVTQOPTUOHGMU\a\UZ[QMRYWXblxo^aktv~|}~}zyulghhoxshgjkuyiXQT_iiibTS_edbfkppngaeqoceowtnv|tj\SXalx~y{znqvv||lddo~hjnmsv|{rxp_bpomuvs~z|ytx}z~~|x|}pqqsomzwszxsvrquwwuwpzvpz}pdfnuvrxuip|u~~Žü¾Žÿÿ~ytniigglu~{rljhfedddcbccddcddfintx{|{{z|~tqsz|zvrlga\[^fovz|yurnllpw{~zoe`]][\]`dioty}|ule_\[[]acjpy~tiffhnsutld_^agnw|ijg_RHFKUYWSMGHOX]_ZOGIMQSTWZXPGFNTVYZTR]eaZWY\\YUZbkh`caVZ`^\ZVW[adgfa^^agjmpqqnopokgddhmjbabdfd]ZZ_dggfgeehmsunb]]^`aejnolhgijga]^aeihikkkkllllqtqlhhijhdbdhlnnnnlnttpt}ujhhgfedbdhgeddgnodXY\`ipmgjqnb]aca]^cfcYPPV\cjoqomonhacfijorpmgabb``glljnunjhiihea_`ceb^]`b`]^_bbdimkghgd`^]^bcjpqld_cee_YYbikic[WY_glqsmijntyqmgaacfklntwkcccflkhdco|{wrninwtgejkhjwzrklpi`_bccb_^^^`c^Yglcadgfccgfa_``_\WSTUOIJQWW[fnkc[SNUcjf^XVZhqi_`hlpp_QWfricgjeddcdgmv{skgZR]hjjmvyxwrqsuqomlgbfnokmvwtuxqgmyxqnq{uqtsnr{|zokswuuwonqr~zlbahmmhkrspk`W^pndho{zgdlgbbdecblpedjr{zsommomnzyqmmq}|kp~i_biV[tyr_T_gotrjr_ONgre\]ZNMU]mwiWSW[ULQTOLMNF>AFFGHMQKKPOD@LWXZYLCDGLRTRQNRVWRIELUY`^VZ\PLU\YWbto`irxw~~z}~|vmjilvxoffklu|th]VU_hhibRQaifglknpue`cmh^fpwqkw|riYQYblxyzzruwv}{jdgqomnlty{{r{r]aqonwxsyzxx|{t|~}|w{|npwvso|xrzxpvwuv{{ywypnzzrhfouusvmp{u}ǾǾÿƾ¾ysmhffeks|{tmigedcbbaaabbbabcfinswz{zyxy||qoqw{xvrmha[Y\enswxxsonjjnvy|xnd_\\[[\`chntz}|umd^\ZZ\_binxuieegotvtnfbbdipy}gif\MGHMXZVQJFIRX]^XMGJMQSTWZWMEHOUWYWRS^e_ZVX[[XSZbje_cbX[`][XUUZ`bef_[[bgkoqonnopkeegilkc^`baba[Y[affgffefiowwl_[[]_afnqokggike]Z^befginokkjjknqpkikkiheadhjmmllmntwnkv|rifgikhcabgedcdhnocXZ^dknkflrk_^ee_[_dgbXPQV]elprpopojbehjnstqmhdccabfkllpspkijkifb^`cda]\`c`]`abbekmkghfc_^^`bbjppkc`cee^X[dkkic[WY_flqrlhilsxqle`abdkmqwujdecdfgecbjxzuqomtwnefkkjlwzrmorlcaaba`^\\^``Z`qm``cdb_dfa^^``^ZTRTRKGKSWX_hjc\VPNXdhbZVS]lof^_gkon]PWeokdfhdbdeeditytlg`V[gkkluzwvsoqtspnlgbhqrloxytuwpgn{vompzqpsppty|ynksvuuvonoq~zldbhnmhlrsoj`S\lidho|xefidbbcdaajne]hqwtmiikkknzyolmu|lv{lccjX_wxv]TdkowvsqYNPmsa[]WKNU]mugVPV\SJPRKINQJEEDEEIOPMKNOH@IUXZYMBBEJPQPOOUYYTIFKSW`_WY\PNW]]Ydyneowy}y}~zw~~||}~vmpmqyqkeejktyqkaWVahfhbRScihlplnq}|c`cie_grumjy|qhXR\elwxyzvyxvyhdjsrnpkt{{{t{r\crpoyvrwxzy}zq|}|}yz~osyxvs}ws}xpwzyz{}zz~mpzwsmhquuuwqt}~ǿǿ¿xqlgefeir{|tmieccba``__`a``abdglquxzyxwx{vnnqw{xuqlg`[Y[clrvwvrmljjouy{vlc^\[ZZ[_chntz}}vlc^[ZY[^`fmvwkeegouutohddfjry~egcWKFJQZ[UOHDIRZ]]VKHJLORUXZUKFIQUVXWSU`f_XWXZZVRYbha`ec]^a[ZVSTZ`bdd^Y[chmpqonnpofaelnle^]bc_\[YZ^dfffefefkt|vgZYZ\`flqolhfikia[Z_befimpqnkjjkppkfgjkjga_djnnmkjmswrimzyneeghkfbacedcbcjomaXZahlnjhmqf]`fd_[`hjbWQRV^glrsrqqpkchlnruurmhfeedegkmqttokkllid`_adfc_]`c_]`cddfkokijfa_^becdjppkc`bcd^X[dkkhb[WX_fkqrkfgks~vpjdba`cimrwvi`dccddbaaguzusqrurhdilmlpxzrmquneb```^\Z\_`]Zlyh\_aa^]cd^]^^^]VPPPKFFLRUZchd]XQJM[dd^VPVemg_\`fhlj[QWdlifffcacggcfsxrke`]ahkjkvysrpmouspnlhfltqlpzzsruqgp|umlozqoqpruw|zmltvsuvpnor~zjdbhonhlrsoh_SZhfdhnzyhegb^_ab`aimbZepqnhdegfio{xoloy|pzyqceo_dwvv[SckowxvnWNUxu\[]QIPU]lqcVOUZQHLNJHNQLLHBFEGNPMILPLBFRYYWNDBDIOPPQQVZ\VJHLRV`aYWZRTY_c\kqhszy~{y|}~|vw}{|}{|uqvqsxnhffijktysbVXcgefaTXfihlqlksxa`acccirohn{{rfXUahlxwz|}yyxgfov}rsmu}|}v|r^etpqzsqww|z|{rz{|~zv{{|zzxtxv~~}|~~umxywuqnrtw|zy|~ſĻüſþxqkfcddhpzzslgdbba`__^____^_`cfkpsvxwvuvzvlmou~{wuqmg`ZXZajquuspljiiouxz~}tja\ZZZZ[_chnsy}}wnd^[YXZ]_ekt~ymfegqwwwskffhmt{cd`UKHOW\ZTMFDIS\^[SJIJLNQVZ[SHFLSVUWUSWcg^WWXYXTQYcf_`geaa`YYURRY_acb\W[djpsqnllokdbhqqh\Y^bc_\YY[bhhfedeegnyuaXY[^djproieehhc]Y[adglqsrpolhhlqogcfikje\\dmrojhimrsifq{|tgbegjjeb`cccbadkoj^X\cjmmkknlc`ced`]`ilaVRTX`insttsspkeiortvvsmihgfffilntwsmlmnmha^_cffc_]`c__bdedgmplkkga_`ficdkqojdabde\X\ekkgb]XW^ejrskeejr|}toidcbbbhlrwvfY`b`acb_`gtzussrqlefknmosz{rnqvpgc^^^\[X[__\fxsa[_`_]]a`Z\]\\XROPLECHNQW[cf^ZWMGP^c_WPQ\ika[\_bejfYQVchgggfc_cihbdrwqjda`djkikvsknmjnuroomjkqupms}{rptqhp{tljlz~onppsvw{ymmuvsturonryiedhppjmrsoi_TZdddhlxyide_[[``^`hl^Xdllidbccdho{woko{|tzyxsbhs`iwvtYTcjqwutnYP]u[][LJQU^loaTPUVMHIJHIOPNOHBHEENRLJLPNDBNYWUQIDDIMORSRV\_YLKMPU`f[UYZ[\agatrlw|wzzzz|ztu|y||zz~vtzvutjfggiheuxbW_gfceaW[fiilrljuua_^`cfmsjes{qcY\ehm|vy~|}vgisxwxpv}z}r_hwqt}poxw}{|{uyz|y~~yu~}uozyuwtsusz~}{ſſ¿ùyqjeaccfnx~yrkfca`_^]^^^_^^]]_cfimruvusstytjknt|yuspkf`ZXX_iossqojhfhntxy}}si`\ZYYY[_bhnsx|~yoe^[YWY\^bir|{ohffpwyywphglqw}ba]VMMV\^ZSLFCJU^^XRLLMLLPV\]RGHOSSSUUV\ecZUVXYWSRZcd_elhc`]YWSPR[_`a`\Z]djopnmkljeaelqkaYY_b`^]\]_dhhfdccdjtp\W\^fknppmjgcbc`\Z\afmsvupnnmgelqldaeijhbZ[fprmgfjnoldgu}|pb`fhhgdb`accbcfknh]Z_dilmlmoibbded`]cmm`XWVZbkpvwuutokhlsvtvwtnjihhghkorvxqknoome^_bdhfe_]`c_`efedgmolkkhaaciidfmqohdacde^Z^ekkhd_ZX]cirskeehr|{uqicddbdjprutiZ^a__a`]_gtyusssphbgmnmptz{trvxpib[Z[[ZW\_[]vk]Z]^]]^]YX]_]ZTNNOG@CJNRW]bb[VSKHUbc[RNSblh]Z[^`cidWQV`cdfffb^cigbeqtoidbbejjgktmfjjhmuqnnmjnsuqot}zrospjqzsjimzxklnptuv{xmmssstsqpouwigfhppkossokaTZccdfjvxkdc^XX^_\_jhYWejie`^__bhnwslip{|wwtxvdjvhmxvoWVaiqunmr\Sir[^WKMRU^km_RRUTKFGGGIOPNQIFJEEOTMLMPOF@IYXXUOEFJLRXXUV\aZNMORWemZS\_cbeih~~sq{}xzzxx|yqs{x{zxz|vy~xuofdimkfdyze^fhdbheY]fiilrlivq`_]`eiooghvra]ehhs}vy~uhmxy}ux~raj|uv}onzy~|}}vy{|{x{w}yxy{ztv~|xſ÷û|rjd`abdlu}~}wqidb_^^\\\\]]]\\[]aehlpsttrqrxrjimszyurokf`[VX^gnrrpmihegntwy|~{qh_[ZYXXZ^ciosx|~}zqd][XWY[]bhq{{qjgfpxz{yrjgmrw~b`]XOPX^_YRJDCJW^^WQNNOMKPW^^PHJQSQQTV\ce]VTUXVUST[ba_klhd`\YVSOR[_`_]\\_cjpnlkkkib_gpme[WY^`^]\[_bejhedbadmxjWV^clopqoljga_a`][]cjptronomiefmof``cgjf_\`murjfgkonhely~xi^bhiebaa`_aacehlle\[bgjlmmmle`bcdd`^grk_ZZ[_emsyxuvtokkpvxwxxuokkkkjjmrtvwqmopqnd]aefige__bd^]eifdilolklh_agkiejoqmecaaef_\^fkjieb\Y]ciptmecgr|{wthaefbdpvrrtj[\`_^_^[^dqxvsppmd_gonmqw{|wx|yrjcXWYZYW]^Xci][\\\]]YVZ^_\VQMMKC?DJNRW_b^VRNHJYa^WONXfjbXWZ]^agbUPV^abcdea^cihbeorngbbcgkidirkehhilpollllpssoru{woospmqwrhem|vjkmptsv|xnnrrrrrrqpzvjhgjqpmqsrpocTXcddgjtxlc`[UTZ[ZakeWXeheb][Z\`hksoggp{~}xurzvfl{pnxudWYahqujfvdWum\^TJQTT^kj\TVUPIBCFGHMQQRONKEEPWOPOPPI?FWXYXTKGIMX`^ZVZb]QQTY[js]R[fojgjo|ss|~u{yyvxyworyv{~ww{|{u}yphdenrmeh{igmkc`jh\_fijlqkhyoa_\`flpmfkzs`cnjj~zwy}vjq|{zy~~scmyw}om~|{~xw~{{}~sw|v|Ĺ¾Žÿļukd_``bjrz|~|vohc`^\\[\[[\\[[ZZ[_cgkorrspopv~phgkrzytqokg`[WX^ekoonlihefmtwx{}~zph`[YYYY[_djosx{~~zrg_ZXVWY\`foz}skhgnwz}{vnlotydca[TU[_^YPHCDKX^]UQPPPNKOYa]PJMSQOPSZ`ecZTRTVTRRTZ^_cpmgd`YWURPT]_^\[[\`cjomjjjjg`aimg_XWZ\^^]\\_bgjhdb`bhp{~dWZbgmmopnjieacb_[]ahoqonnpqlecioka]^bgie_]htvqifhknjdfo{~ra[bjhb_`a`_`acfhlkc\]chklmnnicbbcdd`_jod][\^biptzyvvsnklptwyywsnkmmlkloruwupmopoja]bfgigd__bd^^gigdimmmknf^bjligkqqkcdb`gha]_hklhfd_[]biptngcerz|yug`fhbesxposj[[bb^]][^dovvsolf_ajonnsy|}y{yrmeXUXZYX][Zrzc]\ZZ[]\UU\^\XROLIE@@EJORY__ZSOJEM[`ZQLP^ie[RTY\]`d^TOT]_^_bd_\ahf_dnqld_`bgjhcfplcegilmmkjklpsqmpx|tnnrpopumacq}|qjkkotsu|xoopqssrsrs}skigkrqnqssrpdSVbeeghqwla^YSQWYZckdVXdea^[XWZ`hgnmfenz~}wrrzxiosmxtaW[`fmqifwn`zna^TMTXW_khYWXTOHABEGHMQRTTXOFJT[UUTRQOCCSW[\[PGHQ`jf_VYecXZ\`amv`Saptlimt{us|~rwwx}vvvsnrwu|zrv{{wwjeehsvlgs~omtlabig`bgikmqhhymb^\bhpqhcn}ubgslmyx{{ulr~}|{|thp{y~ok~|xw{~yy|wy÷źþɾ¿¼ý¿~}~~~}~~~~ymd^^^ahpw{~|vohc_\[[ZZZZZ[[ZZZ[^bfjnqrqoopv{oggipx~yspnjfa[WW\chlnmlhgdfltwwy|~}wof_\YYYZ[_ejoswz~}ysg_[WUUWZ]dny~tmiipy|yrptx}eec_Z[^_^XPGBEMY_\USSRRNKQ[a]RLQTOMOU]ceaYTSTUSPRSX\akwohf`VUSPRV[][Z[\\_ejkjghjhc_dihaZVWZ\^_^]^aegjhb^_djryb\bfjklopnjebdfb]Z_imoolnrspieglle^^`dggfbdotplhghkkgbhs{zm^Zcie`_^`_`aacgjkib]]dijkmonfbbcbdd`bljb__`afkptzzxurmmprsty{uomknmljlptvwsnmoolg_\cfhigfaabc_bghgfilnmmnd`eklkjnqoiefdaghc_ajmljgfd_\`gnsnhbcqz}ztgbgjhisvnmsk]Zce`\[Zaemtwtpkb_elonns{~}}zrphYUY[[[\Ya~o^[YYY\^XRV]]ZTMKHC@@BFKQUZ^[VOKFFQ]]TMMWdhaUNSZ]\]a[QNSZ\[]`a^[_ed^cnpg_]_cfhebhpi_afgikkjikmpqolpwxqlnpomosi`hv{wnhjlorqv|wopqquursuz}qljjnsqpqrrtqbVYbeeffoum`[VQPTXYcjbVZca]\YTUYbgejifgmx|spqyxnutmxr`[_aejkdfwyj{~mcaWOUZY`jfZVUPPJACHLMLRUV[dQHQ\aZZYUX]NFQY`ccWHJVhsneYZjibcddeq|gYhstmjnx|wvt}|nu|vu~|ussqnrtt|tnw{{{whfinwwon{spwmbdigeegikmohiyma\]dktncduwelxoqyz|y~unq~~~||zvls|{~ol}{zy~~|}}wuż¹õ~|{|}~|}}~~}}}}ne]]\_fnu{~{vohc^[[ZXXXXYZYYXXZ]`djnpqpnmowzogfgnv~{spmifa\XX[bfjllkhgdelswwyz}~|vme_[YYZ[\`fkoswz}}ysh`[WUUWX[dmy~uokms{~ztsv{hgda\[`a^VNFCHPZ_[VUTSRNKR\`]RMSSNLNU^ce_XTSTVSOPRW[gt{ohf_VTQOSVZ[YZ[\\_ejjfdfhgc`fie^WUX[]]__^_bfgif^[_ektvb^ehiikoqnjc_efa\^airnmlnqqnheimi_[^aeffffkrrlgghiiihglu{ue[_efc^]]^^`acfjjhea^_fjjkmojdbbcbed`dlhdbbbejkouyzyupmnqsrryztmllnnljlrvwtqnooole]\cghjhfaabb_ciihgilnmpncagkllkoqnhfhgfijdadknlkggg`\^fmrnibaqz}zugbgkmmtvmkqk_Ychb^ZZafmtwtpib`glnmnt{~~yrqjZVZ[\^ZXo|f[VUWZ][SRX[[WPIFC?>?BFKQW[\YTMFBJW]VNMR]ebZOLU]]Z[]WMMSXZZ[]`]Z]bb]cnnd[[^befcbjof]`dggghiikopolkqusmkmnmlmmebnwwrkgikmppw}unppouwssw{plkkosqrrrruqbVZcffddmum`YSPPPTZcf`X]c_[YURSZegafgfilwznnqxxrzpltm`accehe^dvqx|mdf\QX\[`gb[VNMPJAGQSPLRZZajUNZdfa`_^ch[MT`fik_NM]pzuk__mkiiiiisrdnvtolo|{tvw~xktyss|{ropomoqs}~ply{{~whhmtzzxyrrxpdejiihhilnngjym``dhowlaizyjp{stz{~x~}vnq}}}|{xqv}|qm}z{{||w|~xvŸù»¿~||{{}|z{|}~}}~~{|rf]]\^emu{}zvoha\[ZYWWWXXXXWVWY[^dilopommowynfefnv}{uqmhe`ZWXZ`fikljfedeksvvxy|~}ztle_\ZZ[[^bgkqsvz|~}yrh`\XUUTWZblxwronu}{vuy}jjfb\\`a]ULDFLS\`[XWWTQMJS]b^RNTSNLOW^cb]WTSTURNORX_mxymge]VTPNSX[ZYZ[[\_eghedehfabihaYUWY[\]^^^_bfhhb[[agmyr`^dghilpplhb`dd^\afjnllopnmkhgmod[\^afhffjorngefgggggjpuyq`[afe`\]]]_`behigba__bfijknmhdbbcbca_flhedccgkkouyzyuolnqqqsxyqlklmnjhkruwsnnmmmgb\\cgijheaaba_diihghknorlbcgjllmqrmgfhijijdaeknmkiih`[`flpnibaoy|ytidimnpttnlmjaZdkf`\Yaiostqpkcbfhklmrz~~~wssl]W\^^^W\}wbXUTW\\UPTYXWTMFB><<>BFKQX\[WQJEDMYZRLOW`c_TJOY_[XZZRKLRWXXZ]`\Y]a_]dmlbZZ\addaajne]_bceffghjnpmikpspjjlmkiljcdpwumggjkmnoy~sjnqouwrszzplkkourrqqsuqbY^efgcdmum`XQNMMRZcd_[^a]YUQNQ\fc_dffjkv~slmqwxt{{kjoldhefff`\dr}wvxjcjbU`_]afb]SFLRLAM]YRNP[`fkZYhliigihkoeV]jlmogSSfw~zpfgllmmnmmsymsutqmn|yuxy|thrxqqzyokmnlnos~{lk|{z}{~xjlty}{|{ou~sffkjkjjjlonhly{mchmkqxmcm}{ls|uu|}w|{xpr~~}}}|{sw~tm~y}}{y}q~}|~|{ķǼȾŻ}zxyz{}~|z{{}~||}||xxwj^]Z]dmuz|zuof`\ZXWVVWWWWVUVVWY\agkmmmkkovwleeelv|{uplhf`ZVUX_eijjhdcbdjrvvyyz|~~}}xtle^\[Z\^_dhmqsvx{~~|xskb]YVUTVYblwysrrx~{y}lkha]^`a]TKEHNV_a]ZYZVPLKT_c^TPTSNNQY^b`[WTRSSQPORYdsxsifd]WTPKT[`Z[Z]\\afeddefgfbcie]XVWY[[]`_^`chig^X\chpl^]cfghmqojfacfb[\fjkkklppmkjijmj^W\`cghgioqnieddeedeglrvvl`]aec\Z]]]^`dfhhe`]\^aeijkljfdcbcca]_hmheeefikkovxywtplorpotyvnjikmmhfjswvqllkhhd^[]dgiigd```aafijhhijmprkdegiknosrmgegikklfcgmpomklj`[`fjonibcnv|xqjfkpuwuspnkic[dnjb]Zckorrqrndbddilkox|~wrrl_X^cb]XgscVSTX\[RQXXUSPJD@<;<@CFKQY[WQKFDFOXVOKQ[a_WNIQ[^YUXXQKMQTUUW[]ZW\`^[dmj^VWZ_ba_akmd\]__addefinohglpqkfhllhfhc_grtpjffhlmkm{rhjprvwrvwokjkpwttqqtvpcbcfghccnsk_VQLLKOYab^\]]ZVSOKR`f^]defkju{mhlpvvv{vhjkkjlejhf^Ybp{ztreblh[dbacff^LANUPFUj_VQM[gkldflpqonorsto`alqstk[]o}{rklmopqqqrwyqttsson|xuxyzpeq~}tnow}wmhjkklnt}xil~zxvv~~|}ymqx}~|}vnzvgfklmmlkmqnjo{~ynfnrnsznfr~|qvzux}x{x|}ps~}}|~~}ux~wpz~~~zx}k|||}ƾ̾øǼywvwxxy|||~zxxy{~|{|||zyvv|~pa]Z[bkvz{yuof_\ZXWUUUUWVUSTUWY[`ejkkkijnvwleeelu{|uplhe`YTRX`dghjhdbadjruvxy{|}}{zwskd_]\]^_aeimpsvwz}}~}xrne^ZWUUTX`kv~|utw}ljhb^`ed\QIFKT[cd`Z]]UOKLVbc\TRTRMNSZ`a_YVTRRQOPQSYfvwpgdb\WSPOV[\\[\]\\beecbdeedddfc[XWXXYY\a`^`fihc[X]dirzd[\bfghmomhc`cf`Z_ikghkqrojijklkaYW\aeghkpsoiheabdcbdhmsvpf_^bb]WX[[\^bfhgfc^[[]bhkkjjifcbbcc`]ajmhedfhjlkpxxwwsmkprnovyrkihikkgejsxwokmkfdd]Z_dgihfc``_`agjjihiilpokdfhhknptslgefikllfejopponolb]bginojbenv|vojhls{|vqspkhc]dnke_Zbkprqpqlebacikimuz~~vrpj_Zaif[_v~o_TRUY\XQSXVRPLFB><:<@DFJPXYRKEDEIQVSNNT]`ZOIJS]\VSTUPMMNQSSVX[UT[_\[engXQSV\__]bkj_Z\\\^acddiokehmpogdfkjecd^]jspmjedhlmhm~rfflrvurv~tljjlrxuuqntvjbhgcfhceprh]XOJLGMX`^]^]ZVSQLJTbc[[ddfkjsvifkottwwpeggilmejje]W`pzzqmdbjh]cdbdef^ICQWXRatdYQN`mlnmmmsxuqrvwyvidmtusndhw{tpoosuutuux{xtusswpo|~wtvwwldo{ypjlv|siegijkmu|tfmxsst}{{|~zqu||{}sqyhelmooomospmt}}wolsuruyniu~vxywy~xz~wyqt~~|~w{zt|z~|~~xw|}gz}|{{~~ƺɿ½~xvuwxwwzzz}xvvxz~}zyz{|{yvtw~uf]ZZakvz|zunf_[XVUSTTUUTTSTVWY[`dhijihilt}vledejsz}voigd^XTPV^cghhgdbaciqtuxy{{||{yvrkda^^^`acfjmortvy|}~}ytof_ZWUUUYaku~xwyljhdaegbXMFHPY`iid]_]UMKNXbb[SRSPLMS\``^XUTRQPPPQT[huvnfc`\XTORWZ\[Y[[Z\bca`_bcdbccda\YWWWVV[a`^`bfc]X\aejun[W\aehjmnjd`acd_\bhhfgkqrmgfjmkcZWY^begintulfhc]_aabdhmttjb__b_WTWY[\_dhieb^ZXY\cjmmkiieccdda_`fklifegiknmryywuoiinnkpwxpiffehidcjtxuokljeb`[Z_efggeb__^^agjjihhhlpmifhhgimotungefhkklfekooppqrne_dijoqlcfnx|tmlhlw~tquphgb]fnkgc[_irspmmlfa^`ghgjpw{uroj__hmc^lykZQSVYZURVXSOMGC@><;=@CGLRXUNHCCFLQROKNYa^TICHW^XQQRQOMLLNPSTWXRRZ^[\flcTOQUZ][ZdlfZWZ[Z\`abbjniehnnkebejg`__[_mpljhddilkfmocbkrtrqx{qjihmuxutnmutc`ljaeieipmb]XNLJELX]Y[^\VSRNGJXdaZ\ccejlrqfejnprsokbcbhmmejle\Xaqwvkhfdge]cddegf\OPUYd`fykVN[jnmprpmt}wsuz{|zqlrwyuqmt~~zusrtyyvtvwuvwxwstysp|wsuutibmxulgjuyoeadhhhku{pfqtpqt}}xx{{~}w{{x~~vpt{hcnqooqoosrpw|tqry{wvwolv~zzyyzzy}}{vwtu~|~v|}vx{~||uuzydy~|}|zzxxzzŹʿ¹¿¾½}wttuvvvy~yy|vttvz~{yyz{|ywrqrxzla\[akuy|zuof_[WVTSSSSSSRRSUWY\^dhiiihhls{ukddekrz|wqhec]XTPT\bfhhfdc`agosuxy{||{{xvqjea__`adegiknpsuwz{~|yupg`[VUWX\dmv~|y{ljheegf\RKGKV^elld[`]TOMQ[db[SRQOKMS\`^[TSQRRQPPRU^jwvmeb`\ZSMPY_[VX\[Y^dc_\]bcdbbba_[XUUTSU[`_^^`b`ZX^bgmzy`TV\adfilmha_ced]_fgdehmqqjeeijeZVXY_cehlpsphfh`Z]`aacgovqe__`b\SSWY\_bgjib]YWWX]cioojhheccdd`^dkmljhgikmnpuzywtkfillkpwwphfeceebajvwsmjjhc`^ZZaffedb`^^]^bgkjihgglpkihjhfimotvnfefhkklgeknppprsnhbdjjormdhpz|sklinz~ttyofgdagnmie^^gruokkkfa]^ehfgmuyspmicdklegw~|viVNTX[XTTWUPLIEBB?<<>BCGMTWRKFCCGLQPMLPZ_YOFBK[^RMOPPOLLKKNRSUURRX\Z\gj_RNNSY[YZdjbYUWVWZ^aaekmfcinojc_cgd^\\\clljiebdkmicp}kaajqqrryyoheelvxtqlmuo`boj`ehekof[ZVOLHEMX[VY[YTSQLEJ\f`Y\dbejlplbbhlnqnig^]_hmjekld[Xdtvpghiffc_cdfghgb^]W\medyrXTfsnmpsplt|xvy{||{wruz{xuv{}yvuvw|zvtvwtvy{xsv{tp|usttrgalvsjdhsvla_cgeelxxift}qops{~}zuv{y{~|~wvysor}}fcrtppsqpssryzqrv~xtuqow{zyz{~~xzzywxwx~~~uz~wt}}~~zrryuaxyx{zxwvvxwǽĺſÿ{uttuvvux~}ww~{ussuz}|~{xwxyyytpoos|re^]ajuz}{uof_YVTSQQQQQQPQQSVZ\^bfhiihhlr{~ukccdjr{~wqicb]XTPT\aeggfba``dmqsxy{|}|{xtpkebabbdfgghjloqtwyz{zxuphb]WWZ[_gpx}~~~jigghgdZPLJQ\cjomdY_^VPNS_ebZSRQMLOU\`\YTTTUTSPQSX`mxvkeba^ZSLT^_XTX^[Y^da]Z]abcba`_][WUSQQT[_^]]^`]ZX_chqoXRX\acegijg__deb^afdbdhnqmd`eje_XWXY^cgmqroidfg^X[_`adhnsnb^ab`XRSUY]`dijf_ZVUW\`ejoojgfeccdc__dkmlihghlooquyxwrjfhkllrxwphgdbcdaakwvqkiigc`^[\bedc``]\\[]bgkjggfglpkhhjhfimosvnfdfhjklgcioppqrsojefhjprmcisy{qkljp~{rw}odedfgmnmib_eqwrjhif`]`ffcelsxqnjhffjllu|}{ugQNX\[WTVVSOJFDDD@;:?BCFNVWQIECCGNPOMNU[[RGADQ\ZOKNPPNLIHINQRRSPQWZZ^fg[OLMRWXW\ff_XUTSSW\_bfmlfehnkfb`bc`^][^gkjhgc`dkmgduva\ainooqx~}xmdbemvxrlhltm`eojaegemm`WXVPMFDNXYUUWWTSQJDK^f_Y^faejkoi\ahknnjdb[Y]glgdklcZYfvsjfkkfca`adfihnrkc\cnfewsa_ntnlptokszxxz|||{wux||zxy}|yxwxy}zttwwtw{|wuxztp}~tttsqe_ktqidhqrh^^cfbbnxpchu}zoomq{zxxtuzvv~qv|supp{{igstrrsrortt{vnt|xstssz~zzxyzzzxxxy~z|~}~uz~wr|~~|xoow~~t`uvvz}xusstvv~~}~}»Ƚ¾¾ÿ¾xssstuuuyztv}ztrqtz~zz}~zvtuuwwtollouvia_aiuz}|vog`YURQOPPPPPPOQTWZ\^adghhfgjpx}tjcbdjq{xphba\XTQSY_ceed`__^aimqwxz|||zxtojecbbdegghijkmptvyz{{xvrke`ZZ\^birz~~iiiiifaZSQOWaglokc\][TOOXdfbYSRPNOSW[^[ZXYWWUTQQTZcowsjfdb^XQP[`^WUX\ZY_b_\Z]`ab``_]\YTRPNQV[]\[[\][YY`eku~fTSY]`abehgc_`dda_adbbdhmnh]\eh_YXXYY]dksvogcdgcZX[]^`cimph__bc]URRTZ^afihb[YVUY_dhlpnifeccddb``elnkhhfhmpqsvvutpifhjlmrwungfdbaaaakwwpihheba^\\bfdb^][ZZ[^afigdfggkmjhjkgehlosuoedfgijkfbhopqrstqjgfgiqtkekuyxojklsyrymbddehlnome`drysjhif^\`efbejpxolihffjmox|~scOQ_`[YXURPLHDDGE>9;@BDHRWSKECCCGNPLLRY[WNBHWXQIHLMMLHFEINPOPROPVYZ_fcRHJLRVUXah`TQQPMNSVZdfgecehkfa_^^]\ZXZbjihid]]emiaj|~jWV_hkkmpyxzuf^`hqwrlfckqhaikgcefjoiXRURSPHJSXTPQRQRSPDEYh_XYbfbfjjg]WZ`flh`^\WX^ghbcjia[\goliiplc^dheagsvyursnlljntsrssomossrrqtxxyz{zyxux}}xtw{sv|yxz{ttwwtw{xw{zxtx|stsqna_lqkdbipj_Y]`^Zbppbamt{shhgoxplusnsqrx}vv~{lryppyxupottsrsqnqux|zno~{vsuwy~~{{zwz{vz}}~||}{|v|yuz~~~{wlip}{y}u_ptu~|wqpolnux~vy|s{{v|Ľſ|toopssttyvqtzztpnqw~~xwz||wrqqruurnjjjlsreabjtz~}xogaYSQPOMMMMMNNOSX\__acceeeehov}{ribabir}zphb_[WUSSX]`acb_^][^chosvz{}}|ytokfddddfghhijkmortwyz{zytojd_^`aemu}iikkhd^ZXX[ahmmlic_\XRLRajhaYTSPPSWX[\[[\\ZYVTTRU]gqvpihfbZQNV^`]VVXYYZ``]Z[]__`^[Z[XTPMLMQVYYWYYYYXX[bhpyxdROTZ__^^bgd__bdb``aa`behki_[`c^SUXYY[_fnsri`_dd]XXZ[[_fkke^_bb^XROPSX^dfea[USTVZahjlmhdcdefedcacilkihhgimrrssssrlgghghmsuqiefea\\\]essjefea`_]\^bdc`ZXXXYZ\`ee^_deehjhhjjfdgkmuwodcefghieagpppqrsrlgedgpriekrtqkhjmtxu{k`dddhlprpjges|vnjkhfbdfcbhkl}wpmhfffknnt|{}tfNXea\_`VMLGDEGHB:;?ACHPXVMC>=CIKLLJMTWPG?9>BCIQXZTI?;?HLKJJMRVPD==GPROMH??HMIDACGIHGKPNLPTW[a_VOMLLRVW_fbVMJIHJMSZadcabdhhc][[YWVWUY`egggd\W_kkacqvfWPS[eiilq{~ytzyfZ[cimmidbdfcaadhigfejpgTKPV`YRRRRQPQMKPPMDMkoYO\jjbhhf_URV^bb]ZZZVadbccfgfc\]dkotvmehmmifep}usqkikosqq|yrooptttstxytuyyytqrv|{tq{zpqy|xwywustssrqqtz}zruwqsrqlfmslbbhlh^VVWTU_ki\Ycko}ofc`fpobaihikippkzrdlskiqqhhorqnggpqimzzkl}}{{usrv}~}}{wwx{|yy~y~}~w|}ryu{zz~xu{xmimswywsv|zgo{tzysligglsvqqrw{s}{z¼ľ¿wolnoqrrrw~voos||sonpuy}~zxz||truwz}~{zuonnoqqnjfdedjtrjhow|}}yrjc[UPMLKJIJJKLOTY^abcbbbbcbcipw|ypg``dkt~zpjd`ZTRPQUZ[]^^^\\\`cflquy{}~~{vplhgfghiihhiijmnpswxwwxwusnlihjnt{psnecbdc_aforqmkif`\YXZelmf_\\]\YXY[`da[VWYZYY]`aeimooolcYQLNVX[ZZYYZ\_a_\[\_aa_[YY[UOLLMRUUSQQSTTTUV[ftylUJKMSZ\YWZ]]Z[__`bb`^_aaa_\YYZ[WNMRWXZ_jrrld^_cc[UUVWX]dhi_XZ`b]VUOJNW_cb^WSSSU^ddgjheccbbbcccccegfggfdehkmoonmlkjgbbbaflpokfefaYUVZ`hmid``_\YZ\]]__^\WUSSTY]a`][]``afhfeikd_`cksqfabeca`cb_foqpnnqsogbaejhcglnmkhgims|yvu|wg`bbejnqwskoquzxuqokidimjkmjo~sqnhihhkjmz~tpohmpgbda\WNLNQQJ<9AEGMTYXOD;:?IMKHIOUSJ?:@KPPPLB:?HKGA@CHHEEKPMMPTX\^XRQOLLSVXag`SJGFGIMT[cc__befe`\[\WSWXRVehegf_YZ`gfafsr`TORZbgijr||utws`V[ejlkf``dca`adggedblrfPGNXc`URRSRQOIIMNLGRhlYP_njbijf_SRV^a^[[Z[Yec`ddfhfa\`fmqvvkdkqnehjtyuuqjimqtsvxrropvtssuzxqsyzwpmpv|woqtmtz{wuuuppqrpooptz{wpysprrqnksvkacjleZUTSSYcjbWYdio}{jcbagng]agffggv{fh}jdnngiokdiprpjcgpldl{uis{xzqqv}|~||xw{{{yyz}}vy|s~yv{xx~wt{xollqtwwttz|npxt||wqjedelssnqty||vz|üÿ¾wnlnpqsrqv|wonry|tnlosw{}}|yy{}|truwy{}~}y|ztnmmnppnjdcbbgq{xolry}}}yrkc[UOLLJIIHIJLOTZ^acdccaaaachou{ypf``fmt~|qjf`ZURPPTX[]^]]]\\_aekpuy{}~}xrmiihijkigggjlnoqtwxwwvvttrpmlnqxrsjbcdffcejprqnmkg`\\\`hllea_`a^[Z[_cb]YWY\\[\`dcbjnnoqlcZRLPVWYYZ[[\]_b`\\^_aa`\ZZYTNLMPTUSPPQQRSSTW`lxr`OJKNUZYUUX\ZX[]\_bb`^_ab_][YWXYRLNSVX\cnsqi^Z_a]XUTTVYafge[W\``\VUMHPZ_ba[TQQT]dggghfccbbbbccbcdfgghfeddhlmnnlkkifcaaaaelnlgdff^USVZahjgc_]\[ZZ[]]]\\[WSQQUY^`^[Z\_`aefdcgjc^_ajrodadb_]]ab`doplmnqohc_`dgedhlligfhilqzxtu|teabdeknqwrlrtuwyurqqjdinlkmkq{qrngihhkho{qooforhcda^\QNPSSH>=BIMSXZWK@9:BHIIHJPUPD<:@INLLH=68@GGB>>CGFBDLOMNPTZ][TQQNJNTUZbdZMGDACHQY]^ZU[efb\XYYWTSTPP]gdaeeZRUceaajqeRLNSZ`egjrxwrrthVU`gfda^[\^^\[]`ffcbfpm[NLQZecYUUVXUOGEOMHQ\di\ThoihnkdYSRY_a`]]^]bdabhdjmdY[chow{ofkrridjqzwwykimqts~|tststvtssvxtotxwpgiqxxmhr|wmlsusqpqpmnomkjlosutop}toqqqrtuvrheinj`WRQRZdgbWW_dhpxna__`eeZW`c_]br|e^q|lbnpedhd^botmd`egc\dxwgpsxyopz|y{{zx|{~~wvwr~}yuzuw{utzxopollqxwtw||tstu~zupibagquqlq}}y~~÷ƺļ¿Ŀ}}~umlnqrsrprwzpknu|}tnjjotxzzzxy{}|rqrtwyzzytv|ztnllllmjgc`^]`hpxzvx{}~|xskd\UNKJGFFFGHJNU[`bdeedca_]_dkqx}}xnhcbfnv}|voic[TQNOSWY\^]]]]]`bdjouy{~~zsojjjjkmlhfgilqtuwz|{zyxxyxyyxz~|{}rnfdghjjjmqqommnkebadgjnomigffeb``bcc^YVX_ccb`a`_itqpmlhaXSMRZ[\[]^^^_bb`^^___^]_ab]UPPSWVPMMOOOPPPU_jsqaPJKNPSTTSTVVVUW[^___^`a^YVWWTQRPLMPTVYbgoqmbTU^[TUWSRVZbd`]Y\a`\XTRMLS[^\WQOSV_gklhd_^adddca^]_`babeffdbceikkiihhfb_]^__dkmjcaffYOOSX_efc_[ZZZZZ\]ZXYZYUNMOW]``YTTY^]\bi`^cfaZZamqh_ad`YXZ`backlhhkome_^`bcbchjgdbdjljlruquypb`acejnppkjqposvrrwukejoqonkxxprnihghhixrjqpfoskfefidYUUWREEKLPVZ\ZPC<;?CFFEHLNKC>AFLNLH@759?DD?<>DGB@EMOMNQV\\YTRQKJNSUZa`VKD??CKU\]YUT]eaZVVYYTQRQNR_daacaWQVac`aik_OLNTZ_cfjrwspppbQUchda][Z[\\ZYY_edbclpiWSSU[g]WZ[]]TPHENNNV]cjcZjrmlqlcXTT[acba_baddafkeln`\`eiouwkeltqhfls}wvvnlqtv{wuuvuvwtrsuusptwvmehqurjhrwrklpooonmkkmnkigiorrnlr|yopqppswywoihlni^SNPU`ji_Y[aehpth^^__b_TV`a[Ybwr]_uxddtpddd_]eopf`aed]\kwjewrxtlt}~|{z~}{x{}~~~xxts}{wsysv~zuuzxopomikvzuuxyurrwytqjb`jsuqnpz}{}øɾĽ|z{~}tmlnrttsqqu|rlmrx~vpkjnswzzyyy{|}{roqtvwxxwrtxztnkkklmjfa_][\blu{~}||~~|xsld]UNLIGEEFGGJNU[`bcdedca_\]djqv{~{wnhcbgpv|~xqke\TPMOSVX[^]]]^^aceinty|~~{vqlkkklmliggilquwy|}||{zzz{{|~}yx|pkeegjlmnqsqmlmolebdhlmqqmkjhhgdddddb\XX[affe`abfntrpmjf_XTPU[\]]]^^_`bb`_^`_]\\_dd]TRXZ[VNJLNOOPNPWbpsjXMJKOQRRQSTUUTSW\__]]_aa\VTTTROONKMQTVYclolg^TUZVQUXRQX_daZXZ_daZWSPNPV\]WSPOT\ejlje^[]beedc^\\\]^_adfecabehhhgffhe`][]^^bhihccfbVMMQV^dea]ZXZ[[\]^ZVWZYTMLOW^`\URTY][Xaj^[be_YX`npe\`d^VVY_aabjjhgjomd_^_abbcgiea`dikjkptpuwnb_aceinpnijqonrurs{viejorqnk|woqnighihkohsqforlgehjg]XWXQFKTUX[_`XJ>:=ACFFDHMNH@>BJNMJD;46;@DB>=@DD@?FNNLORW^]XTRQKJOSV[`]TJA<=DPZ^ZTQU^b[USRYVPOQOLS_`_ac^UQW_`^agfZLJNTZ_bfjquqnnk\NUdfb_ZVXY[[ZXV^ec`coqcU[\X`gUT\]b`TQHEMNR\`flfaltposlcZVX^bdcbbceddbimhmj]_hhiqtqigntohhnvwvupnsxyztywvwvxtrssssprwtkdhrtnghrtnjlmmmklkfhnnjfcgormikszsmqqoruy|vnklmoi\PMRZgnhcabddjqpbZ]^_`ZQV_\UYh{~eVdwpamwkbb_\ailha^__^[crn_onrunqz~~{}~|~z||wz~{~}}xzqs}|upwru|yuv{wnpomijuyuuvvuqpxytrlbblvvrosy~~|||ĺ¿ſý¿~{z|~}|slknqstsppt~|rklpu}{tmjmqvyyyyzz{}|soprtvwwupqt|{rljiijjhd`^\YZ`hry}~~~|xsld]UNKIGEEEFHIMTZ_bcdeeda^[\binuz}~yunhccipwz{slf]SOLMQUX[]]^]^_bcfkpuz|~~|wqlkjjklkjhfhlrvx{~~}}|{z|}~|wvzkhggikmopstpllmokebekoprqmljjihfeeee`[XY]dhhe`ahlnsqnljf]XTTW]]^]]]^_`bb``_`_^]_egbZRU]^\TKJNPQPONSYdonaRJJKOQQQQRTTTRRX]`^\\_`_YUSRSQONLKOQSVZenmicYTUUQOUWQQZ`a]VW\`d`XURQOQW[ZTQONVahkigaZY_efddb\YZZ[Z\`cdcaabefeefgfgc^\[[]^bggdbcf_QJLPT\bc_\ZYZ[[[]\YVXZWRLLOW^^WRRSX[XW_i]Z`e^WX`nob[ad\TTX^``bggfeiojb^]]_`adgfb_^bikiinpputlb_abdhmplghpmnqsqu}vhfjpvqlk}wnomhhikjo~nhtqhnplgfijg_YYYVPUZWVZ`^OC=;?BCFFFIMMG@@FKNKE>627>CEA=>ACA>@GMLLOSZ`\WRPPLKNSV[_[QF?:=GS]\VRQW_^UQPTXTONONMU^\^a`[SPW^_^afdUIINT[_afmrsnjjeWOXeea^XTXZYYXVV^dc_dqqbYaf]gfOS__dbSQJGNPT_emoggoumpskc^Y^bddcbbeefddjmmmc]bjhjqqlhiornkkrx}wxvppx~}xv|xvxxwsqrsstnnuribjstichrrlklkkjihgdhmlhdbgmmhgjsunmqpoqv|}vompqohZPNS`nnhiigcekok\W[]^]VOV]XS\orZUlwhfvtc^_\^ekid`\\ZX\jrfa~{ksrnu~}|}~~{{|wx}{}|{x|}or}}{~~{uourtyxwx|vommmjksywsqvvppx~~xtrnddnwyurty|}|||żøſ{yz|}{~{skikptuurpr{|rllns|}wnjlotxyyyzz{|~{soprrstusnnpw|rkhhhhhfc_][XX]dmv{~{wsld^VNKIGEDEEFHMT[_bddfffc_[[aglsx{}}yuniefkrxz}wqi`UNLLPTWZ]^__`acegkpuz}~~}ysmkjjklljifgksx|~}||z||wuyjfhkmmoqtvsnlllljedgmprtqnlljjigffed_[Z[`fjhd`_ipqqqlkid\XVVZ``_^^]^`bddbbaa`_]bkh`YTZ`^XOIKQSSPNNV_hmeWMIILOQQOOQTTRQRY_`][]`a]VRQQQNMLKLPRSV\hplf_VTVQKPVUPV_`][WW\bb]VSRRQRVYWOLNOZdijfb]VXahfddaZVXYYWZ_cca``acdcdfhif_ZZZY\_cfd``df]NFJORY`c_\YY\][Z[ZVUXXUNKLPX^[SOQSWXUV^f^[_b^WXamm^YacZSSW]__`eecdhmh`]][]^`cec_\\bjjggknnspib_`acgmokefnknqppuvihlrxqlk}xnnkhhjnntxkjrolnnlihijia\]]^^]\YW\`XG>=>ABDEHIKNMFADKMLH>4029>BD@=>AA=KW]YSPRX]YQNPUUOMMMMPYZV\`]UOPW]]]_b^ODGMU[]_emsrmif`RP\gfa^WSY]XVUTU^bb\dtsf_dkjidNQ`cgeVUMLSUWbkutkkruprulc`_dfgfebdfgffgjmql`_fijnnjhhjmopoot{~wxurs~{x{wxxxwqqrttukltsf`kslabionmmkigfgfcajkhcbcfjiddhopmlpnnrx~|snpssndWQRYgrninphcelneXUZ]^XOPX[UTcv{fT[rsfmxl[]]\`hjgb_[ZXW`lkbmrqvqsz{~~}~}z~ww~||~zxy{mr|zvz}ztmsssvwyz~uomnomin{~plwvoow}}xtspfhoy|xtuy{|{||ƽ¿ƽĿ{yxy~{z{{skgioswxtppy}slkmqz~ypiimsvxyyz{{|~yrnnooqttrmlmr}{slhggffda]\YVUY`gqy~{wsme^WNJHGEDDEEGMTZ_acdfggd`[[_dkqwz{{xsmjghmtxz~|umcXQMMPSVZ]_abbcfhimqw{~|yvoljjkmlljgglt{}|||~{vvzhhkmooqsuurmlmlkheeiorstqnlkkjigffeb]ZZ_fjjhdabkpqpokigd\XXZ^cc`___`bdefdbbaa`bhkf`[Z_`]TMLOTVTPMQYfll`RJHILPPOMNPTTPOSZ__][\``ZQOPPMLLKILQQSXakmib[UUUMJPVSQY`^[ZXW]a`ZSRRRRSUVSLILQ\dhid^XSWchecc_YUWWUVZ`cb````bcbbegie\XXWV[`dfb]^efYLEHMQX^a_[XX^`\YYWTSXXRKJLQX]WOMORWWQS]d^]^]ZVXcnj[WabZSTW\__`ddaafkf^][Z\]_cc_[Y[bjjeeklmqlgb_``bgmmicelkmoonxviimsxrkj{xnlihhlnpsijronnnnkjkkkc`aabc`\ZX_aPB<>@ACFGILMNLDAFLLH@4,.6=?AA>=?B>;@@?EHGJNONJEDGIHC9104;?@@>=>@@>=>?A@??AHMPOOTY\\ZWMGMSUVY[]XI<=DFKV\XSRRUVSMJNURKHIIJNTUSTUTNGHQWYZ\^ZNECJPUWZ^goqnf`]SLXijcd_TR\_YTRRUYWWYeqoe_eotocVY^`isj_Z\^[\fxqmsvuvwnimmkginjhhgifimlppgadglmgbegklkoutswz{wstwts}{wxuww}uptxuruujhssmmmf^`hgfiotpcaabcdefa][_efe`[]aehhihdjtyvqprutld^]`eovuv~|odagje\WWYWOJNXXUYgu|r`]lwrltt_V^cegiigb\WSS[hmlpy{vty{zyz~}}|~~{z~{uy{~~z{|xtzykmwslmuxqhktxz~}{ytposy||zrnklqqox~tho{ztquyzxwy~umsz}~|{{}ľ¿¿¿}xwy|~||~~|xw|~ztlffkqwyvrrvwrpnou{}vmijmqtvwwxxxxz}|vpmjjklnnmjggks{}tnkheddb_\ZXUTVY_env~{vrlg`XOJGFDCCCCDIQV[^acfhhgc_\]_elptuuspnloqu|{l_USSUVY]bggijkmopruw}|zwspmmoqqnnmou~{tsuzmmoprstvvrnnnmjhgjlqvxwvsqqomlifdcabceeipnieegknonmllkjda_bhgfca`abcehihda_`eillhdba``ZVRX^]YWVWY_ipl_TOMMMMNNNNQSTRNNUY[\Z\][ULILONJGFGIKKMT_fee[TQPPMJKNPQVXVWXYZ[^]VQQSSRONMJHHINX]a`YUMLW_bba^^YRPQRSY^`_]\\\]_`_chfb]YWWTV`ee`XSXb^OEBFKOTX\\WTZcb[VTQMPUQLJLORTSNHFKPQOLQY`^\\[XTWel_W[^ZWVXZZY[]`a_^ad_YXWWY[]`^XSPTahc`djjikd``]Z\^fjjd^bhjnljp}ulkosupifs{mifhmrqx~lglponoqrpnnmkfjorqiing]VNHD?>?CMTRRTRMKJHEDB?;55=C@>==>@CBABDINNLNUYZ[YSKJPVVTSX[RB:@GGMY[URRRRPLIJQVOGHHHJNQRSTRNJGHPVXY^^TJCEKRVVY`hnokb\ZSO^khcg^SS_cZVTRTTUVYcklc_dmqlb]\`blukdaaa]^i}rosusuwplokkgkoliihhijkmspgacglidaceiiimsttwxwsprsqs|{ttxvwy~totyuqstnmsutrka^ejfeimttf`acdghd_[[^ehe]Y[`dffggdjrvqmpsupgb`abgpuuzvhaaghd_ZXVRLJQ[XS]myxk_fuvmowkWXbegkljf`ZUU[fppotzvry~xvxy}~z}~{}~{z}ztwy{{xzzwuz~xmnuqikrvphipuw{}zyvqnnrx{zvqnllrwv|znjr{{wruwxww{ypty}~þ¾¾¿¿{wwwx}~{{}~ywy|yumggjpwzyutv~wqonpu{~xnjikortuvwwwxz|{upljijlmmlhffhoy{uolhecc`^[YXVVXY]clt{~zvrlgaYOIGFDCBBCEIPVY]`cfhhgc`^^_ekostsrpnnqtx~oaWVUWY[`dkjlmopqrtwy}}{ytqonprronmpwyrrtynmnqrtvwuqpnmljhhjotwxvurrqomjhfcb`behhknkgefiklmmmmlkjecbehgedcbdeefhhfbabejpmifdba`\VWZ``][YXX\fpsk\SONOPOPQRSTUTQOPVYZZYYYVOIGKOMJGFHJKLNU_cc_XRPOOLJKMOQTUUXYYZ\\XSQQRRQNMKFEGJS[\_^VRLLX`a`_[YUQPRTVZ^^]\[[[\^^^bhd_[XVSRYbec[SQX_ZLCAFKOSX[[WV_gcXRROKNSOJIMPRRQMGFKOOMLQY`_\[YWSXch_YZ\YXYZZXWWZ^````b^XWVVX[]`^WQMSae_^chhiia^_[XZ^ehgc_bhiligtulmpsuphfq|mgfimusx{jflqpoqsrpnnmkhlrstpnkbWSOLH?<@FSZUTTSPKHHEDEA=;==BGECCFLOMJNUYY[XPIIPSQORZYK>:BIKQXXRQRQMKIGMSPECGGHJNOQRRPJEDHOSW[]ZNGDJNRUVZbjmlg_WVRTbhbei]RVcf^YWUSSUWZaijc_diokc_^admtjhgdcaclspruptvpopjjgmomkkhiijimuofbdgkhb`adffgkqtvxwpklppnryuorxvu{|z}~tpt{tqqrtquwyuj^^ejjhlmtxkabehjje_[]^gidZUZ`cdefdbipsnkpvskdaccbfotv{|pe`bhgb_ZWSPNPX_XTbtxrhdltqlrteZ]cgjlkheb]Z]gpsqquwrr{|uuwy|~}z}~{}~|~{{}ysvwxxwywvwz|{|vmotnhjqsohhorty|ywtollpvywspnmlr|~}tknw{~|xvuuwy~{tvxý¿¿¿ÿ¿~yxwx|}zyz}zwx|{yunhgiovz{wvw}wqnnpu{~xokjkmoqsuvvwwy{~ztoljiikkkjfddgnu|~}{uolhecb`^\ZYWXYZ]bksy}yuqlgaZQJHFDCCBBDIPUX\_beghgda__`djnrsrrpnpsy~re\YXZ[]aelmpprtuvxz|~~|yurpoqssqppt{xrrv{nmnqtsvwsqqonljiilswwwvutsrpmjgecbbdgiklmjfcfijllmmnmlkfedhigddddfghghgeaachormhfdbb^XSWbe`][YZ[anvtiZROOQQQRTVWWVTROQWZZZYWTOJGHKNKHGFHJKLOW_`_\VQOONKJKMOQRSTX[[[[[UQQQQPNNMHEGIMTY[[YROKMY__`^ZVRQQRUX\^]\[[[[\]^^bfb\YXUON[de`XNOX^XJBAFLPSX[ZWWckdVOPMILQNHINPPRPJFFJMNLMRZ`_\ZXUSXcc]YYZYXYZYWVUX]^```a]XVVVX[]`]UOKWca\]dhhgg_]^YV[^ehfc_bhilgfwtmmpssnhfq|mggkptszuhflqporsqonnmkhnutvuqh\UTSOIBAGU\\XWUSQLIIHGIHFEDFFB=;=BGIFBCJOMKKPUXZ[WNIJQSONT[WH<9AMQSWTPPPMKJHIPSMECEFHJNOPRRLDACHMSW[ZULEELQTTV\djlic[TSTXac_eh\RYeg`[YUSSUWZ_ghd`dgmib_`centkihfdcfntqrrotupppiiinommmhggkjnumdbdghf``abbdeiosvupifhlllrvqmrwuswzy|{squyuooputuw{wj]]ekmnnmuznbbgkmle_\^`hkdYTZ`bceecbiprlgovrg`becbfmqvzwlb`cgfc^YVSPPW_`XZmxwoggmolmqlc_adinnjeccdcgpuvrrtrpuzwtvwx{|{z}~{|||~{{}~xsuwwwvy~}vvz{zzzsmprlfioqmhinqsx{yvsnkkotwvplmnlq|lkv{{wstw{|wwx½þ¿¿{xwx{|yxyz}~{vx}~{yupjginv{}zww|xqnnpv{yqlkkmnprtuvwwyz}~ysoljiijjjiecbeksy||zupkgecba^\[ZXYY[]bjrx|xurmhc[QKHFDDCBBCHNUX[^adgigeb``_dimqqqpporv}uga\[\]_bgnqssuvxy{}~|zvsqprstrrsv~wqrw|mmmrwwvvrqpnmlkjkqwyxwuuwusolhfdccdehjllliedgiklllnmljjhgeghfeeffgihhhfc`afkpplgedca[TT^if`]\Z\`isvobWRPQSSTUXXYWVSPPSXZYXXVQLJHHJKJGFFHJKKQZa^\YTPONMKIJMOQRRUY\\\[YTQQRPMLPMFFJLNTYZXSONJMY___]XSQQQTWZ\^][ZZ[[[\\^`ca\XVTOS^ec]TLNX\UIBAFLORWZYVXemdTNOLHLPLIILPPQNHDFJKLLNSZ__\ZXTQW``\ZXXWXXXWUSSX^_a``_\XVVVY[^`[SMK\d_[^ehghe^_]WV[]efdc`chijdgw}tmlnqqngeozlggntuqyqfgkoonrsommmljgmuuwupk^UYYQHEKVca]YXWWVTQNNMNQPMLKD:69ENMGCBGLMJILSY\\\TKJKQRNOW[SC:47CPSMEEKMKHIJOY`daWNJJMQQOS[[O=7DSUSVWQLJJIHHFMTMHEC?CIKMQRPIB@AGLPSWYXSHCGOTUUZbilke^TMRY__]cmfUSckfa__XRRUY\_cffedeihda`dhlolkighjkqtppmmurnnkiiltwpkjc_enoqsmgffe`ZY[^_^^ciotpicbddeilmmihosqpqvzxsnqtsqlkmu{zyzxl`aimpsqnv}sffknnmkjgefmsjZV]`_dkjecgptjdmrmc`cedcdhmorqf_`dec^WSUXW[cd^_mxsnliihhkljfbacglkgfgikjntxxvsqporvvttuux{}{|~~{yyz~||}|}|xtvuttvx}}vu~~zyxrnppkffmslglqoqvxuqnmmmsvttogioqv|or|}}zqqx}{xw¿ÿÿ}{{{}zwvwz~~~}{yy{~}zvvy~|xupkhhksy|{yy|yqmnpuz~yqlkjjjkmpstuuwxz{|}|xrnkiiiiifeba_`ejpuwvsplhecba_^\]]]]^_ciqw~}zwurmid\TMJHFEDCBCGNTWZ]_cfggfeca`bfjmoopoqu{yngc`_^_adkptvy{}}zwvtsuvxxxywruzjjow}}yuqonlkjkjmuyzyursvvtoifcabfhklmmkhecfiijlmmmkgejmpledehhghikkhd``dhlnnjhfeca^XWbmjda^]_fourkcYUVWXYY[]^]]YPKKQWYYXVVPJGIJLNLHFFGHIMPU\^ZURPMLKJIILMPPQSY__\ZXTQQRQNLKMHACJQTVWWSMLOPSX\\[XURSUVX\]\\ZYXWWWXZZ[[]_[QKKSbhdXRNIMVXQE??DJNQUXWS[jl_QNKEFLLLLLMNNLGDCEHIKMRWZ``^[WRPY^^][XWX[[YVSOP[bcbb`^[XSTY[[[[XPKPZ_ZW[aeghe_^XQUYZabacbcjmf_gyztokikoofagwvlehyujvlhhkmkmqpmjjkighqwxwsqlc`b]VRS\fea_]]cea^]]]^ab^WO@58COTOHEJPOIHNRX_fdXJHJLNPRRV][M:8KXVTVSMKJIGGHGNRKFEC@DJLNRTNG@>CJORTVXVPFAIPTTV[cjkicZQLR[`]\fncSTdieaad]VVXZ]addfgggiheaadhkomkgefhkutpnklqpnmjhinxxpig`_hnprsmhgfb]YXZ^]]\ahqskd_`bbchkljhhnsqnovxtqoqqpomkltzyyyxmaejosurowviinpoopmjjlpsk^[_`bkomgcfptkfkokb`decbcgknrnc]`dd^XSNS[]agc]gvulijihffikhebbejmgbfmpnlpz}yvtpoqtuttsuvw}{z|~}zxwy}}|{|{xvvvsswy}~vu|ywqnpolgfltlensopvwsmklnpvxsrnggpv{}tw~|ooy~~~xw¿þÿÿ}|~~{wttv{|}{{xwy}zvvy|}wuqlhgipw||{{}zqmnquz~zrmkihhgimqrstuwxxz|{wrnkiiiiheca`_^chnsvtqplhecba`_^`aaa`adipv}|zwurnje_VPLJHFECCCGMSVY\]aeghgfec`adgkmnnnqx|tlhea___bhouy|}{xwvvwy{}~xsw}ijpz~yurqoljijjnw|{xsqswwsmhdb`dhjlmnmjgdcfhiikmmkgegmrrjbbehhhhikifd`afjmnlhffda^\[\fniba^_birupe[WW[]^]\]_aa]VMJKU[[ZXVTNIHKMOOMJHHHHIOTY^]YTQPMKKJIKMMOOPU\ca]YVTRRSQNLKKE?DOUWXWTPKKPUVXZYWUSSUXZ\]]\\ZXWWWVWXYYZ\^YOILXfi`UPLKNTXPD>?DJMPUWVS]ll]PMLDDKLLLMMMLJEBCEGIKPTWZ``][VPP[__][XY[]^[WRNS]bcaaa`[VPT][[WZWOMPW[XW\acfgc`\UQUYZ^aabbelme^exzsmiikoof`et}vjem}pht~khikkjmpokiiiggksvwvurnged^XW\fjdbbbbgjhedeegih^RE:;EPVUOKJLONKOUY_feYIEKPQRRTVZ]XL<>NVUVUOJJJIIGHINNGFECBFKLPUTLD>=DLPQSUVULCCIPSSV]diie_VNLR[_Y\ko_PUeie`dmf[Z\\_cddfgiijjeccdfjmmidceehz|rpliknomjhhhozxnge`bjoprsojifb[WX[^][\bksne`\]^_`fiiiihnqnlotvqooollnnlksyyvutpiilpssrsw}wlkorpqrqonnqunb^`chpqnicgpumgjniaaddbabeimoh_]`b_XSRQU[_ceaanwogghgeefhjhdbdhkibckpqons{|xvsqqsuvtssuvyz{~|ywwz~}}|{{zwwvrtwz~}vv~|ywqnpolifktodlurqwxrkhlqu|{sqnhgoyzy~rpz}}~{yÿ¿½¾~}|xtsuy~~{zzyxuv|~{wwy|~xurmhfgmtz|}}~{plnptz~zsmigggfgjmpssuvwxz{zvrnkjiiihdb`_^^aejptsqolheccba``abdedcchov}~|zwurnjf`WQMKHFFDCCFMSVY[]aehiiigdabcfiklmnqz~wplgc_^]`elty}}zxwvwy|~xuxilq{}wtrqoljikloy}|wspsvwrlgca`ehkmnnmkgedegghiljfddlswoa^adefghikifbadhjkljhfec`\\]bkmg`^^aemuumcYW[`a````bc`YTMHLX\[[XURLHHLPQONJJIHHKQX\_\XSQPNLKJIKMMNNNV^eb\WUSRSSPMLKJC?ERYYYXSMJLRYYYYWUTSTX[]]]]\\ZXWVVVVVXXZ[[VMKR_ifZQNMMOVYRE@@EJNQUWVT_lj\RNJDCJKLMMLLKIFDEGHINSVXX``^]VOR]__]YY[]__[VNOV_bbaacbZQNYa]XUYVOMOSWVV\`beec`[SRVYZ\_acafmmc]hy~xqkhgkoog`cr{vjgu{ifs|ljjlkhkpligggefmvxwvvtpjkg`Z^fjjgeegijkkjjjkkkcUH@AIRWVSPNNMLMRX\`eh]JCKSWVTTVZ_]VKBEOTUXTMLKKKKGEIOKEHKEEILNRWUI@;@JOPPRSSRH@DMPPSX`gie_YRKJR[]W^nnZNXhkc`gqk_]^_adffghikmkeccdghkmidcddj~wrqliinnlhdfip~|oebaelppsupjhe`[VW[][Y]gppf_\[[[\_fgegijmojhnssonmlijmmmkrwvurpomlmprrruy|vmlprqsttqqqtxpc`chmqrojfhqvnhklgddedb``chnmc]]__\UQRTY^`ccbepsjeghfdefhigeehiheeioppqsuxywutsrtwvtttuxz}y|~|yyy{~~}}{{yxxvrsw{}|xuz}{wqnpomjhjsuhjvwtwyskflty~sonjiq|}z~wsz}|}|ƿ¾¾ÿ¾ý~~|xuttv{~{xxwwttyzyz|~xuqmhefkry}~{nklnrx~{tmigeefgjmnprsuvwyzzvrnkjiiihd`^]\]_chnrqpokhfddcbabbcegffeipu{~|zwurnjgbYROLJGFEDCFLSWYZ]adgiiigecbdfhiklorzytpjf_][]cjr|}{xwwwz}yvykmrz|xtrqokiilmqy}{vrpruupkfb`afjlmnmmjgedeeegikhdbeovuh[\`bbdfghigebbeijjjihfeb`\]ailkd^\^bhqvsi_ZZadcbbbbcc^TPNJP[^\ZWSQMIJOTVROLLKJKNT[_^\WTRPNLKJKMMMLLNX`fbZUSQRRQOLLLHB@GTZYXUQLLNTYXXXVTTUW\]^^]\\\ZWUVVWVVWWY[[UMOYdiaVNKLLOWZRF@AFLPRUXWV`li]TOKECHKLMMLKKIGGGHJKPUVWW_`_[SQV]`^[W[]bb_XRMQZ`bcccecWNR`b]WUXVOMPSUTU[`bege_YSRVYX[\`cbfmkb_iy~xpifekqof_arztln{ygdrzkjjliehkheceecfozywuvvronjb^gnmjihiklmlkkkllniWHCFLTXXTRRONMMSZ\bki^ODESZZYUUY^`]WOILRUXYRMOONNLIJKMJEIMHGJLNRXSG=i8d:bBcRi_n^p]p\o`ncmengoirmvoyr{s|t|u|v}v}v~v~v~w~wvs}q{pypxownvnwoxoypxpvpsnrmsmtnuououovpxpxpwpvovovoxpzq{r{r{r{pzh{k}t|wvvutr~pmkihhhjloqrtttutssrq~q~p~opq~r~rp~ooqsts}s}p}q~t~wxyxxwwwwwwvvuvxyyx~w}w|vzs{r{pxowqxqvptlyk}l{pyuyvurmrlpkmlnnxtsssrpnl}k}l}l|k|l|l|j{gzs|u}pzjwkxozw|v{p{t{z}z}w}s~q~q~s~uvsqqqtuuvwxxyyyyyz{{y|z{zy{wzxzxzw{s}o~l~moqtu~usp~p~l}k}j|i{hzixjxlyo{qzrzsysxtwswswswswsxsyt{t}w~z{~y|u}p~nnoopqqrrrrssqqt|v{u{s|q~pprs}u{vzwzvxwywzu|t}t~t~ttustt~quxz~z|}{~|}zz~z}z|xywxvwyw|x{zxxmyQQpzyz|||~vqqqsrtz~~}zz{|||~|~}~~~~~}}}{|zzzyzvzu{u}v~w}r|p}t}x}y}x|w{wywxyxyy{z{z{{y|x|x}w}w}v}w}x}w{wywvwtyxy|y}y|vvurtquryw{x}xyx~vxtvtxt{u|v}v~wwxyz~{}{|{{zzxzwzvzuzuzu{u{v|w~xyyyyyz~z|zzyyyyyyxywyvyvywyyxzw{sypwpxnxnxovpuotmupxw{z}w}u}s}r}s}t}w|x{y{y|{||}|}|}|}}}~}~|~|{}z}z}{}{}{~{~{~{~{{{{zzzz~z~z~z~z~y~y~y}x}w|w|x|x}u}t|t{uzuyuxuwuwuwwwxw~xy{|}~|zyuusssrvsyvyzx}w~vvvwv~vuu~v~x}z|{|||}}}~}~|zvsrw||{~z|~}~}}|||{{{z|{}}~}}|u|l}i}r}~~~~~~~~x~i~_~w~~~~~|yuvyz{yuty}zv{~~~}~~~~~|~|}|}}{{}~~}~~~}}~~~~~}}~~}~}~~}{{~}zzzvuv|}~}~~}{ywtsrstuvwxz{z}~|||{zxurtvvstxyvutj[Yaipqqvwxyxvvy}|{tnz~}xyyyyyxxxxxxxwwwwwwvvwwxyyxxwwxxxyyyyyyyxxxxyyyyxxxxxx~y~y}y|y|y|y|y|y}y~y~xxxxxxwwxxxxxz{|}}{}z|z|z{{z|y}x~xxwwwwwww~w~w~w~w~w~w}x|x}x~x~x~w|wzuxswqwouowoxnxoypzq{q|p|pznxmulsktitgsereqhqirlsltlslslumyn}l{lzm{m}lzkwjvjvkvlvltmrmsnupspupwpxpwpvprpnolnjlkjlioithxgxgwftfrirmup{q{pworopopnqmskvixj|j~klmmk~j{^xRrbuknmg|YuBk:d9d?eLh]m`q_q]p^oaocogrkupxs{u|v}u}u}w~w~w~v~v~v~v~u~r{pyoxoxoxoyozp{q{pwornmklknmposornrowr{s|szrzqzpyqyr{s|s|r}r}k|h}n~r|suxvq}n|k}ihgghilnprstttutsrrqponnopqppprsss}u}u~x~yyyyxwvusrrrssstvwxwxxu|mtjoinkrqytro}moswxvsnujsgrcoasg{jmnkj{j{l|l{k{kzizhyiy`wUvbxlyev\s\tfymziy`xfxozx}{~z}u|s}t}r}s}t~u~s~o~oqtuuvwxxxxxyzz{|z~z}{{{z|{|{}w~tpl~k~m~psssqpom~k~j~k}l|l{m{p{p{rzsysxswswswswswswswrwryr|t~x{|ysqpqppppppooponno}q|r{s|r}o~mnn~q|t{vyvxxxxzu}sqqqsttv|xzv}uvsruxw}y}x~y}y|yzyxwwyx|v|wzyf{G9]wx}w~x|{w|t|sssv|~~~|~{~{{{~|~|~}~~~~~~~|}z|x}y|y{zw{v|v~twv~v~w~y}y|yzyyywzv{w{x|z|z{{y|x|x}w}w~w~w}x}w{w{wxwwyzy|y|y{vusrsruryw|x~yzyw}u|t{s{t{u|u}v}v}w~w~x}y}y|y{yzxzxzwyvytytztzu{v|w~xxxyyz{|zzyxxxwxwxvyuysytxxwyvzszqyoynymwnuntmupvtyx|w}u}t}v}v}v}w}x|y{z{z|{|{||}{}{}{}|}}|||{|z}{}{}|}|}|~{~{{{{{{zzz~z~z~z~z~z~z~y~x~w}v}w}w}u}s|r{szsytxtwuwuwuwvvxwy{|~}|x~v|uvx}{y}x~wvvwwvvuv~w}y||{||}}}~~|zwvwy~}|||}}~}}}||{{|{}}}}{|u|p}l}s}~~~~~~~y~h~e{z~}~~~~zxwwuy{zy~}{z{}~~~~~~~~|~|~|}|~~|{|}}~}}}~~~~~}|~~~|~}~~}{{~|||{sis~|}}||zwtrprstuvxyyyy{|}~|{{xvssrqprxyyytj`achrvuwy{||ywy}~}{xw{}{y~y~z~zzzyyyyyyxwvuuuuuvvwwxxwwwwwxxxyyzyyxxyxxx~x~x~xxxwwww~x}y|y{yzyzyzyzz{z|z|x}x~x~xxxxwxxxxxyzz}|{}z}y}x}y|z{{z|y}x~xwwwww~w~w~w~w~w~w}w}x}x}y~xww~w{vyswqvovpxoynzozozp{p|o}o{mylukrjsithtfrergsisltmununuovozp~nn~n~n}m{mzlylzmzmylvltlwnvptpsqtrvqwqwpvprploiohmjiogtfugvgwgvhultqwszsxrtqqpqopnpmslvkwhze}gkmnm}m{ew`uiyl}kki}dxJn=f;g>gHeXl^p^p]o]n]o_ogtoxs{w|w~x~v~v~w~x~x~w~w~w~v~t}pzoxoxoypzp{q|r}s|rwoplhhgikpoqqopnppyrtu~s}q|q|q{s{s|s}q}o}k}k~o~r~twwr}l}i|g~ffghjmnpqsttttttssrqonmm|opqpopr~s~s~r}r~t~u~wxxyxvutrrrrtuuwvussuwtmtijknpzttsqqsuxxvtqsnuou`oNkRm]ug|i}i|izizj{k{kzkyhyfyexcwVxZyhxew[vYvdynznyhxfvlyt|v{q{kymyvzv|v}v}w~s~o~pqtuvvwxxyyxyzz|{{}{|~|~}~~{wspn~i~i~n~rssssrpnops~t}u}u}r{qyrxrwswswswrwswswrwrvqxpyp|rw{yso~nnnnnnmmmmmmlll~n~p|s{s|o}l~k~k~l~n}r{tywxxyv|rpopstv}wyxxxzwwusqst~v|v}x{zyzwzwzv{y}w|wyzYv5Dy}}||~|{~wzvzv|uu|~~}|}z}{~|~|~|~|~}~~~~~~~}}~|z~x}v~wy|{w|w}wuy{z~y~y}y{yyzxzvzu{v{x|z|{||y}x}w}w}w~x~x}x}w{w{wzw{y|y}y|yzuurrqrssyw{x}yz{y{w}u}s|r|s{t{t|u|u|u}v}v}w}w|x{x{x{xzxywyuytyuyuzu{v|w}w~xxyz{}{yyxwxvxvxuxuxqxsxwvwuys{q|oznymvmtmtovtyx{x}w}v|u|v|w|w|x|y|z{{{{|{|z}z}z}y}y}x}y|y|z|{||}|}|}|}|~|~{{{{{{{zz~z~z~z~z~z~z~z~y~w~v~v}w~v~u}u{vyyx|w~w}w}v|vzvxwyx}z|}||{zzzz}{z|y~x~wvwwvvuuw~y}|||{}}}}|zyz{}~|{{||~}}}{}{|}|}|}|{|x}t}r}y~~~~~~~~}}~~tuz|~~~~}~~|{{{zxw{}}{{~~~~~}~}~~~}zxz}~}}}~~~~}|}~~~|~|~~~~}|{||{~~}zy{vlu~{~~~}|{zxtqnoqruxy{{{wrsy|zz{yvssronqvxyytljlmnrxyux||}{yz~}|||{zy}z}z}z~zzzzyyyxxwvvuuuuvvvwwwvvvvwwwxxyzzyyxxxwx~x~xxxxxwww~x}y|y{yzyyyyzyzzzzzzyzy{y|y|y}y~y~xxwwwwxyz~{|}z}y~x~x}x|z{zy~xwwvvvvw~w~w~w~w~w~w}x}x|x|x}w~w~w~w{twsuptpwoynzozoyoyo{n}n|mzktjpiqirhtgtfshrjslvnwpvovpvpxoyo{n|n}o}o}o~o}n~n~m{lykukumuotpsqtquqvqwpxpupnpiqfogjlgqgshthuiwpwtwvxvztvssssqsoonnmqmumwiyf}gkmno|myjviwk{l}l~m~l}l{YoBdYXMa\natbrauhxmzdy^|XsNh@_A]E\C]A\C_GdRfQbI\BY@YF\M^R\T_YbYd_kcpfqhqjohofpfsgwixjxlzo}p~p~o|n{nxp{rssomnoomlk}l~mnppockttsstsrmkiiijnmjcdkswqnzh{knonnmmnopqsssrrsssrqqqsuwwwwwwxwwwwwxxxxwyzwuoi|ezfzh{i{j{kzlymwnyn{o|o|p|o{p|o}p}p}q}r|t|w}|}y|q{pznzm{n{o|o|q}s~vtpoo~p~stvxyzzywtrqrrrrst~t~uuuts~r}qzqypyoypzozo{o{p|q|q}r|r|r|q{p{pzoxmumumuourwtwuvvvvvvvvwuxuytyrworhndkcjbieihkkmlonoporqtusvsususuuwxwywyvwwvxwwuxuxvvwszq{r{t{v{v{w{w|w|x}x|x|x|w}y}{}y}y{y{xzzvxkscsXs`t\t\uawqxuzv|w}u}v|u|t|s|u}t}s}w~v|r{mzlwjvjvkwkwlxoyqzt{u|u|v}v}w}w}w}w}x|y|z|||}{{{}z{|{}wz~z~{~{~yyz{~||}{zzz{|||{zzyxxyx{}|~{{zyzyyyyvyuytytxtxtwuvuwvvwrxnymyoysyzt|r|r|swtturwryrztzuzwyyy|z}{||x{tztxvwyv{vzuzuxtxtwtwtwuxwzx{v{q{kzazdzozvzyyzyxyx{w|w|w{vzvzvzt{r{p|q{szvyxyxyxywywyvyvyvyvxwxxxxyy{y{z||}|~}~~}{zx~v~v}u}u}u}w}z}{}z}{}{}{}{}{}z}z}z}z}z}x}u|t{t{t{ryqypxqxqxryszuzyz{y}xwvvuvw{yzyzy{x{x{y{yzzy{z|z|z}z~y~x~x~y}{{~y~yyz~|~~~}|{{zyyy{|}~}}~~~~~~~~~~~~~~~~~~|wsvzxutvwrs||topw}}|{z{}}}}~~~~~~~~~~~}}~~~~|{||}~zxx{~}zpqxwyodr~}}|{{{|{zyyzyyzywx{vykvxwwxxywtqjdfqvuywpjjr~}~~}}~zutuy|zxwy{{|||~}zyz{}uvwx~y}z|z|{}zyxxwwvuvvuuttttuuuuvwv~w}x}w|x|x}x}x~x~xxxwwwwwwwwwwwwwwwvvvvwwwwwxyz{{~{}z}z~yyz~z|{y{y{yzzyzxzxzyyzzzyzxyxzxyzyzy{y|x|y}x~x}x}y}y}y}y~v~s}qzrys{uywtwuwxvzu{uzuytwsusvsys~ss}r|r{ryqypxpvpwpxpxqwqvquqrppoonqnrnsnuouovpxpwotnknqmznzpxrzs|r~q}p|ozoxmumsnoonpmpkphqhqntvx|yywwxwxyz~y|x{uxrzr{q{qzozpypypzpzpznymvktiuiviyj}kkjne~Nl?ZKb]nar_qbxfihef}[sEdC^A]>_<^>_DbP`IW?T>VEYN[R^R[Vb]h_h_j`ncoeofndncmgslym{lziyizj{l}n~pp~q~qstonmnnml~l~m~nmmmj}i~lstsssqokjjiijljZMOSV[a~c}gknnmnmnooooqqqqqrrrpoonnpsuvvvvvvvvvwwwwxxzyuni~f{fzf{g|h|j{lzlzm{n}n~n~n}n|o|o}prstu}v}x~|~}y{s{q{o{n{n{o|o|p}r~ttrpn}n~p~svxyzzywtsrrssttuuvvusq~p|p{pzozpzp{o|o|p}p}q~r~s}s}s~r}q}oymoihjjlpouqwrwrvtvtvuvuvtvuwuwuvuuqrlnhkbgafdgiikjnlpmrptstttsssosvu|vzwvwsvswtwsxtvuqumwowrvuvwvwwxyxzxzxzxyyzy|x}{}}}w~w}w}u|{|y~tztrtstdt[t`ujuewgytzwzuzszpzoynxmxmxoynxkxhwkvivjvlwlxmyszv{x{v{s{s{u}w}w}w}w}w}x|y|y|y{x{{{|~}{xz~{~{~{~yyz{~|}}|~{{{{{{{zzyxwwxx{~~{||~{zzxzxxwxvyuyuxtxtyuxuyvxwuypyoyqywx}r|syuuxrxrztzt{t{uzwzyy{y}z}{||x|t{rzsyvwzv{v{vyuxuwuuvuvvwxyzx{u{u{iz]zdylzrzu{w{x|w|w|v|v{vzvzt{r{p{q{szvzwzwzvzvzuztzrztzuyvxvxvywzw{x|z}{~}~}{zx~w~v}v}u}u|q|s|w|z|y}z}{}z}z}z}z}z}z}z}z}x}v|u{u{u{szryrxrxsxszt{v{wztztyyxwvuvx|y|z|y{yzyzyzzzzz{z|z|{|{}z}y}x}y|{z}x}w~w}y}||}||{{{zyyy{||}~~~~~~~~~~~}|}}|}~~}{~~{~}wqt}vqu}}|{|}~~~~~~~}~~}}y~|~~~|~|}}~~~zvy}{vrtxz|zx~z}zz~ytjdr~~}yyyyzyxxzzyyxxvx{xvsvvwwwwz{vpfeejompsvppx}~~|wpkmuz{yyzzvvwxz}}tlmt{tuvwx~x~y~y~yyxwwvvvuuuuttttttttuvvv~w~x|x|x}x}x~x~xwxxwwwwwwwwwwwvwvvvvvvwwwxyzz{{}||{|z}y~y~y}z|{z{x{yzzy|x|x{x{yzz{y|z{y{zzzzz{z{z|z}y~y}y|y|y|z|z|x|t{nyoxryuzvxvvvvvxvzvzvzuxtvtvtwtzszszsztyrvqspqpoopprqrqrrtrurtqqprotntnununvowpxpxpvnpmqmvnxoyr{t}s~q~r}q{oxnvnunqonpkpjpiplqotwv}wwvvvvvwx~w}u}tzqzqyqypxqwqvrvswrwqwpvnslsjsjvjyk}l}k|j}m~j\pCYJa]naq^rd{jjjikd{QjA`>^<_;_<_FbRbKX@VYN\[fhpnsswnxgsbl`iakcmcmcngopvussl}f}gyjzn}nllopr~q~q~q}q~q~q~qrrokhghjnrsttrmlmmmmmllmpqnje`]ZVUX_fjlmnonnnnnnoqqoonnoqu}wwvtssrrrsttuuuuvwwrjd{cycycyfzi{l{p|p|p}p~n~m}m}o~stvwxyyxy~{}}}~~}|~y}w|t{s|q|p|o|o{o|o|o}q~r~t~t~s~r~o~npqtwyyxwutssttuuvvuuso}n|o}p}r~r~q~p}p|p|p|p}q}r}s}t}t~s~r~nxg`g]mmpypzqxqvqurtrtstttututvuvtrnllhlikkpntnyl{mwnqqntquqvrwsvstusxtztzsvsttsusypzhxktuoyq{o|o|p}r}t|t{uyuyvyvyxxz}{z|u}v}w}u|y{z|uvuu~t~t}t{susnumwsyvzx{x{uyqvnuktjuhtgthulukulwqxw{|}~}}}x}v}v}x}x}x}w}w}w}x}w~w}x}y}{}zzyx~x}x}x}w}x}y~{~{}|}}}~}~}|{zzzzywvuvx{z|x~{|~}}{|y|x{wzwyxwxvxuxuxvxwxxwyuztzuxyvzvxxvzuzuyuysxryszv{z||{|{|{|{|{{{z{x{xzxyyx{x{x{wzwxwvxuytytwvvyw{yzyzsygzjzs{yzw{x{x|v|t|t|w{wzsyszsztzwzvztzs{u|u|t|q|k|j|l{nynypxsxuxvzx{y|z}{~~}{~y~w}v}w}x}x|w|v|t|r|r|u|v|y|y|x}v}u}v}w}z}z}y}x}w|v|v|v|x|v{szqyryrysyvyxyvytzszwywvv~wwyxzzyzyyyzyyyzz{z{{{{|{|{|{{{z|z{yyzv{u{w{{z~zz~z}{}{~z~yyy~x~z~{||}~~~~~~~~~~~~}|~{|{~{}}}{zy{}~~~}}zy{ywtofhpsy{{vy}~~}~}~~~z~xz}~|~~~~~zy|}~}{xwxvvxzzyuqsxzz||ockv{{ywwyyzzyz||||zxuyzzz{||{yuuy{z||{zzyrmrpjgkqusrnouy|~}{xttxvvxxysjgkprtttuuvwwwvvvvuutttttssttttttuvvvwx~x~y~y~yyxxxxxwwvvwwxxwwwwvvuuvwwwxx~y~y~z}z|z|{{{z|z|{{|z|y}y}y{zzzyzyy|yyyyyxxxy~y}z{zzzyzyzyzzyyyxzwywyuyuxuwuvwwxwyvzu{u{u{t{t{tztxtvtuuututvtvsussrpqnpnpnqoqopoqprrrvryq{pyoxnxnxnyoyoynxnwmtlrkqkrltowqys|u}u}t|r{qzpxpuqrrqrqrrruqwrzs}t~uuuusqqr~r|rzqxotmrmonpppqprprrtrtsqsnulxk{k~k|kyjzklmmiXkTg]nbtdyf}g~g|h{i~ii~hz_oB`9]9]A^Rh^qZlMc>[O^fnvxy{x{q|jwdn_iajcldmfpmvt{tpojg~i}j{j{j~iijko}r}s|q}p~s~sssqmiffikpstttsmnrrpoooooqrssrnfa\XW\begilnoooonnnoonnmmnrv}xxusrrqqrrtssssstuurlgzfyfyfyizl{o{q{u|w|v|s}n}o}q~rtwxyzz~y}y|z||}~~~|~y}w|t{r{r|r}q}p}o|o}o}o}p~q~s~t~u~t~s~p~pqruxxxvutttstuuvuutrp|p}r~tvvus~q}q|q|q|q}r}s|t}t~tsnxjcmku~ut|rxrurtrssststsvtututttmjd_]Y]Ydciiiphvj}mpzssupxoypvrttrwrzrzswsuttwqylxlsto|k|p}p~n~n~oq~q|szvywywzwyy~yzzw{w{x{vzyzy|t~u~ttu~t~t~sszvryszu{w}y}y}wzvyrxmvhuhuivkvjvkwpxrz||}~~~|{z~y}y}x}x}x}w~x~ww~x~y~z~yyy~w}w|w|w}x}y}z~|~|~}~}~}}}}~|{zzzzywvuwx}{z}y~|~}~}~|~{}z|y{yzxyxwxvxvxvxwyyxyxxwxxwzwxxuzszsyrxqwpwqxtzv|v}w}w}x|z{z{z{z{z{{{{z{z|y|x|x|xzxxxyyw{u{wyxxzxz{zyzpzp{s{wzwzwzx{w|u|t|v|vzryryqyryuysypzo{u|w|x}v~m~i}h|hzhzmzszwzx{yzzzz{z||{}y|w|u|v|w|y|y|x|v|t|r|q|r|s|v|w|v}t}s}t}v}y}y}x|w|v|v|v|v|u{t{pzoyqyrxsxuywyxzx{xzxz|yxw~wuyuyxzyzyyzx{x{y{z{z{z|z|z|z{{z{z{yxyvzvzx{{zzz~z}z}z}y~y~y~y}x|y|z|{{|}}~~~}|}~~~~~~~~{wry~}zy}}w{}}|ztrusqnnmml~jrzzy}~~}}}}|}|~|}~}zx~y|~}}~|~~~~|~~zxyz{||{zxutxzyxytnonlighox{{{{|}}|{{yvxusw|}}}ytuwttzzy{|}{xuja^^dijjlry|~{rouzzz|{ynjswm^ttttuvvvvuuuuutsttttttttstttuvvvwwxxxxxxxxxwwwvvwwxwwwwwvvvvwxx~x~y}y|y|y|y{y{zzzzzy{y|z{{{|z}y~y~y~y|yyxzyzyxxxwxxx~y|z{zyzyzzzzzyzxyvyuytyszsztytxvwwwxvzu|u}tzs|szstsqspsrstsvswsursrqqopnpopppopoqpqprrqvqwpwownxozn{o{nynvmulsksjqiqjplqotsyt{o|l{o{q{qzpxrurtsurwrxrxrzs|t}t~sromjjln~n{nymvmslplnolojqlqpssturwoxn{n}m~m~k}j}illkiau[l^obve{g~ff}f|g|f}f~k{hnG]9X8ZE^Ui^o\mUiG^Q^nt{||~x~r}kyfrblbielfnjtq}sspllnpm}jyl}llk~k~m}r|r|o}ostsp|l}i~gffilqttutrppqqqqqrrqrrsturomjgdbaaaeikmopponmmnmmllmpsttqpqqq}mlypvvsrrrsstsozlwkwkymyqzs{u{vzwzx{v{t|p|r|t}r~swxz~z|z{z{y{x|z}~~|zx~u|r|q|r}s~r~q~p}o~n~n~o~p~rs~u~v~w~v~t~r~pruyyvtsstttuuutssr~r}s~uxzzyvt~r}r|r|r|s|t|t}t~tsoynipywwv}twstrssssstsusutuuuutvqsge]WYR]Z^Z_Xa[ekjyk~owtqwnxnwqutrwqyqyrxrwttvpxkstl|j}i}n}q}o}o}o~q}p{rywyxyxyxyy}yzyyyyyyxxxzxyzuzu{u}u~v}u~ts}s}uvyuzt|u~y{}}z|rzkwivkwjwivjvmxlyw{|~~}~{}z}y}y~x~xwww~x}y}x~x~x}v|u|v}x}y}z}{}}~}~~~}~|}{}{|{{{z|z~zzywvuwy|{{||~|~}~}~|~|~{~{}{|x{wywwxvxuyvzyzyyxywxwwytyqzoyoxownvovrxvzw|u}t}t}u|w{xzx{x{x|y|{{{{|z|y{y}y|y{y}xzyv{wyxyzxz{{|{w{u|t|v{wzvzwzw|v|v|w|wzvyuytysxqxoxjyjzr|w}z~{wq~n}l|h|l|t}z~z}{{|z|z{z{yzwzvyuzuzw{x{y|x|w|u|s|q|p|q|s|t|s|r|q|r|t|w|x|x|w|w|w|x{y{zzxzszqzsztytywyyy{z}{~{}{|{~yx}xtxsyuyxyyxzw{x}z}{}{{{{z|z|z|z{{z{zyyxzx{y{{yyyy~y~y~yy~y}y{xzxyywzv{y|{}|~|~}~}||}~|{{}~~~~}vir}~~|||tx~~zrqy{zuuyvlhox~zwz~~}~}|}z}w}s}t~y~yu~v~{}~~~||~}~|~}~~~~|{|~z~tkq|}|{wtxzzxxyxtk^UOQcv|{{|}~~zwz{xsotz}~}}zwwvngowy{||{xwpe^ZZ]_`hnt|~~vgl~~ut}~q`uuuuuuuuutttttsstuuttttsssttuvvvvwwxxxxxyyxwwvvwwwxwwwwwvvwwwww~x}x|y{yzyzyzyyzyzxzxzw{y{zz{z|y~xxxx~xzyxy|yxxwwwwwx~x|y{y{y{y|y{yzzyzwzw{w{wzxyxyyxywxvyu|t~tysyrwrormrnrqrtswrxrvrsrqpoooqpppooonoopoqpqqpsotovoxpzo|n{nwmtlqkqjsishrhpiomrswtzj{e{m|p{q{pzsxswswryrzryryrzs{s}rndcfhkklmmnn~n~o{oyp{r|sysyszr{q|p}q}i}b}\}g~l~i}g|f{aw_o`pbwe~ffe~f}g|f|h}q{lmEZ8U:XI`Zj_n\n_oZg]hsx{~{w~s}nzmuiocjcmhsmzpqrrmorsp~n|n}n~ommm}r|o|kosrpj{f{e|g~f}f}i~lqtttsqpopopqrssssrstutrqpnlhb_^aeimpqqponmlllkkkmopnmmpq|qupnouvsrqqrrstxrsprptpwsytzuzvzwzwywyuzt{s{v{x{w{w{x|y|y|y|y|x|w|t}w~~~{ywt}r|r|r}s~s~r~q~p~o~n~n~oqrt~v~x~{~{~u~rpsxxvtssttuuutsrqr~u~vwy||{yv~t}r|r|r|r|s|s}t}tsq{oup}uwv{uvtssstststsususutuuvvvwntfpak`b_]^W^TaZdddjhjqpxowouqrunxoyqyqwrwsstrtpowi|i{j|l|r|q|q|r|r|rzuxzx|xzxyy{{z{x{y{y{wzu{uzuwuwwvyv{w|vu~t}t~uyxwyt}uy{}~z|oyjxlxlxjwjvkxixqx|}~~~}~|~{~z~y~xxw~w}w|w|w{w{v{u|v}w~z~{~|}}}}}}}}}|}{}y|w|w{w{yz|{zzxvuwyy{w|x|x}y}y~z~z~|~{}{}w{wzwywwyt{u|y{zxxwwtwpynynymxmwnvovqwsyu{v|u}t}s}t|vzxyxzw|x}y}y}x|x{xzxy{z|z}z~y|y{z{xyxzw{y|z|y}w}v}v|uzuywzy{w{x|x{xzwywyvxsxqvmwixiyo|u~y||xs~p}j~k~ry{||}y}x|yzxyvxuxuyuywzx{x{x{x{v{u|r|p|p|q|r|q{p{p{q{s{u|w|w|x|y}z||{}{~z~z{{z|y|y|z{zz|{~{|||z|zz~y|ytxrxsyvyxxzw|x{|||||{|z|z{zy{y{zzzy{z{{y|w~wwxxyy~y~y}y{xzxyxxywzx{y|y}y}z}y~y~z~|~|zz{{}~|zz~~~}{y{}~~{}~|xy{x~{laep|{v~v~z}}}~~~}}{}t}m}o}w}u~q~w}~~~}~~~~~~~~xv~v}w}s~al{}|}}{vtwxyyz{{yq]LCC\u{zz{}~yvzzyqmv|~~~}{{zzqacu{||{yyzxm`XPMPQbxz||||xsw|z~~xqvvvvuvuutsttttttuuutssttsstuuvvvwwwxxxxyxxxwwvvwxxwxwwvvwwvvvvwx~x}x}x{y{z{y{yyzxzvzv{v{wzxyzz}yxwwwy|yzx}xwwwvvvww~x}x}y}y}y}y}y{zy{x{yzzz{y{x{x{wyvzu|t~syrwrtqmqkrmrprurzr{ryquqrppppsqppnpnonnonpnqnpporouoxozo{nzmvlqkpkojpjrhrhrhokqquuxmyezk{r{s{rzsxswsxsysyrysysyszq|o~njjk|kvlxlynzpzp{m|hdhoruu~t}t}t}s}p}m{Y{O{Y{e|dycwav`v_u_q`qbwe~ec~b}e|g}h}m}xzuoO];V=XNc]l_o]qgrmrlswzz~ywt}p{nviqblalhvnoorrno}p}p}n}n~l|l}llln~q|o~nqomkg{e{gzhzfyfyh{k~psssqommnnnoprsrrrrtutqpopqomiedehlpssqponmmllkkklmlllno}rysqqsrqqpppqrysopnosnvmxozp|q{rysxswtxtytztzwzxzwywzxzx{w|v}v}u}u}q}s~~}~zxvt~r}r}r}s~r~r~r~qp~o~o~o~op~r~t~t~x~x~r~ompwwusrsvuutttsssu~xxxz}~}zv~t}r|q{q{q{r{r{s|ut~r{p|r|u~v|vyuutstrtrtsututvsustuuvuxpmmlylvhpekdada_^b^jlwpzprqqvoyozpzqxswrtpvowlylylxmyozsytzuyvyvzvywwzv|v|y{z~|~||}|}}}{|x}x|wzwzxxyx{y{x|w{v|u~t{wyxu|uyz}u|nznzoylxkwkxkyrxv{}~~~~~|~z~z~z~yxx~w}v}v|u{v{w{w{v}x~z|}~}}||||{}{}z}w|v|s{s{t{v{z|~{}z}yvuv{xrzpzqzq{s|s|t}u}v}v|v|v{vzvzvyzw|v~y|{uxqvqwmxmxlxlwmwnvpvrwtyuzu{u|u}t}u}w{zyzzy|y~z~y~w|u{tzuzwzz{|{|{|{|z}y{w{w|w|w~y~y~x~w|v{tztyw{w{w{x{xzxyxyvytxqvmviwhxn|sw|{zws~n~jnvz~|{|x|w|w{vzvyvyvyvywzxzxzy{y{x{w|t|q|p|p|p|p{ozp{p{q{s{v{w{y|{}}|{{zz{|}}~}~|||}|}|v|w{zzxytyryrytzvyyy{y|}}~|}{}z|z{{y}y|z{{{{{y|v|v}v~wwxxx~x~x}x~y~y|z{zzzy{x|x|w}w}v~w~y{~~|yyyyyz{|{z|~||}~~~~~}}}~~~yw{}|v|~~q]]o~~x~t}v}x|z}{~{~}~|~u}s}w}z}s~r~{~~~|~~~|~{~zov|ytx{yvvwxxxy{}|wjR=Gevyyyz|~~{xyyzuux~}~~}|{{{|{ndlw}}{{{{ypcTFAHOc}~{yz{~~~xtxzyxwwwvvvuttssssssstuutssttsttuuvvvvvwwwxxyxxxwwwwxxxxxwvvvvvvuuvvwx~x~x}y}z}y|y{yzyyyxywzxzyy|y}y~yyxwxx~xwwvvvvuvv~w~x}x~x}x}x}x|y{zzzzz{y|x}w}w|wzvyu{t~s~r{rvqqqnrnrqrvrzq|r{rwqsqrrrurormpmomnnmpmqlqmpoosovoynznymvmrlplpkqjririqipkqottwqyj{k|m{qztyswswsxsysxtxtyszq|no~o{mylwlslokqlsnsqsstrvo|lors~vvuv~t~s}r|fzIyMz^zaz\uZrYrZs[s]r^s_xe}c~b}a|d}g}k}p}zyrbeBX@YUh^o_patowv{tzx|x~xwt~q|lwgqdmclgvl}m|k|p{q|m|lzjzjzj{k|j|j}klloq}rtrlhgf}i|k{kygwgxizl}oqrrpmlkkkklnpqqqqrssrpppppppoligilptutronnnmmmllklmmlllp}qrqpoooooopuqsqwnxl{izhyiwkwnvptqsqtswtytzszrzrzpzs{w{u|u}u~utr}q}q}|~{~xvts~r~r}r}r}r~r~s~rqq~p~o~n~o~p~q~s~r~n~l~klovvtrqrvut~t~tttuuwyxwy|}|yt}r{q{pzpzpzpzq{r|uu~r{p{r{t|uxuvtttststrtsututvsutswrzqoquuvqm}mvhr\gZbfksqyqtprtvxv{r}s{sxqumyl{m{oxqurvsvuuvvwwxwxxxwxvxvywzzy|y{z{}~y|z|y|yz~}|{|yz}z{zyvxuvzv{wzxvzv~y{|~{u}u|szoylxlymztx{v|{}}|}{}{}}}{}z}x}z}y~x~x~w~v}u|v|v{w|w|x|w~z|||~{}z|y{y{w|u|s|r{p{qzr{s|v|y}y{zzwuvtwlylynynzo{o{o{n{n{o{o{szszszuzzz}xx}zqxmwowowowmwmwnvovqvrvtwtxuzu{u|u|w}x{zyzyy{y|z|{|x{vztzu{u{x|z|x|x|y{zz|x|x|x|x}z~zy~y}x{uzryq{uzwzw{wzxzxzwzuxrwnviwixl|psxz{zxr~k~ksy{{y|x|w{x|w{xzyzyzzzz{{{{{{|{|{|y{w{s{q|q{p|o{ozozozpzrzu{w{y|||||{{{{|}}}}|}}}z|t|v{xzwzuztzszszuzwzy{}}~}|~{}{||z}x~x~y}z|z|w|t|t}v}w~vwww~x~x~y~z~{}|{|y{y{y|z|y}y}w~wy{}~~|yxvuwzzxxy{~|{{{|}~~~~{wuw{~~|su~|vr}~~}j^nz~{~w}u}u}u}u~x||x~z~~~~tv~}}~{w{}{z~}{vxyyxxyyyyz|~~{xbEWswyzzz{|~}{zy{{zz}~}|{{{{{}xgbpz}}}}{ytlXCBNcoyzzyxz|~{{~~{uosxz{vvvuuuttstttttsttuuutttttttuuvvwvwwwwxxxxxwwvwwwxxxxxvuvwvvutuvwwwwwxx~x}x}y|y{y{y{y{x}x}y~y~yyyyxxwwvvvuvvuvw~ww~x}x}x|y|y|z{zzx{w}v~v}v{uztzt}s~s{swrursrsrsqwq{q|q|ryruqtrtvsnrmqmonnomplqkrkqmpqouoxnxmxmvmsmrnrmrkrjqjqjqlqntsxszp}m}k{nyrxrvswsysztytxtysyq|o~q|qypwntlrkpjqksmsptswtzw~yv}spkmqw~r~s}v|fzGzY{ezbzYsTqSpVrYt\t]u]x`|a}`|c|f}h}j}m|vzukmD[F[Yj^pcrovs{o{r{u|y}y~yt~o|kxgshrfretetesaqgtkvhwhxfwfxhyizl|n~pqqqrssojgfgl~o}n{kyjykzn|p~qqqpmlkihhikmnoppqqqpppppopqqqpkinrrwwtpoonnmnmmmnnnnnmo~qrrqonlmlmzowp}ppmixhrhokonqsstuuwvywzwzv{u{t{s{t|u|q}v}x~xuq}p|q|{}~~y|wusrr~r~r}r}r~s~s~sr~r~p~o~n~n~o~q~s~qllkopssqpoprs~st~uvuvvvvvvxzzxt~p{ozoynynyozp{r|s}vt~r{p{qysxtutttstststsusutuuuttvr{okmsxwwsstnXqUlinkrrsyqrp|v}}vw~wyqwnzn{pysuurustsutxwyxzxzxzxxwvwuxvzv|u{xy}zwxxzvzxz}|||x{x{{|||u{pyty{x|xzyz{z~{{}}}~y|tzpymzpzuzyyz{y|y|y{y|y|y}z}y}z}y}x~w}w}v|v|w|w|x}x}y~y{|{z~x|w{v{szq{q{p{pzpzpzr|t}v}ww}x|~xwwtxlzmzoznznznznzmzmznzmzozpzq{s{yz}y~w|xqwmwmwowovmvmvnvouqtsususvtxtzt{uzv{vywwxwwwxwxxyxxxwyv{v|u|w}x}t}t}u|v|zy{y{yzy{{|{}{~z}x|wzsypztzvzvzwzw{w{x{wzuyqwlxixi|omovz{{~w}p|l}r|xz{y|y}y|{}{|||}{}{~{~|}|}}~}||z|w|r{q{p|p{pzpzpzqzrzt{v{y|||||{{{{|||}}}~~}}y}u|t{u{v{uztzszt{t{uzu|y}}}|{~{|}y~wuv~x}x|v|t}u}w~xxxwww~x}y}{|}y~vu~w~x~{~|~{~ywy{}~~}zxsqw}}{zyz||}}||}~~|}}}yqnqx~vemzyyw~}~~wmrvu~y~x}u}u}t}s~x|}|~~yz}|}}yxz{~|y{~{uy{}||||{zzzzz|}~zwm[fux{|{{{|~~|{{{|||}}||{{||||{oisz}~~~}{yveQQ^ssljspqy{xvw|}yuw|}}uutttttttttttttuuvvuutssttuvvvwwvvwwwwwwwwwvuvvww~xxxwvvvvwvvuuvvvvvwwwwxx~y~y~x~x}x~w~y~y~z}z}z~{~zxwvvvvuuuuuvv~ww~w~w}x}y|y{ywyvwzv|u}u}u}t|t{tztxtwsxryryqxqxpzp|q}q{rxqururuotnsmpnmojpirirlrorrptounvmwmvmtnrosnrlqkqjqkpmqotrxu|v~u~o|myrwrvswrysztzsysxsyqzp|rzsxqvpumtksjsjtlupvsyt{w|yzwyt{k\]ht~q~t}t|dzU{i{m|gzZsQpSqYt]t^u]v]y_|`|`{d{g~h}h}j}s|xoqG\K_]mdsovtxoylzozpzx|z|u~p}o{nxkvlxjwcqaneqcqdreqeufwgwizj{l|o}q~s~ssrqrpmigfhmp~p}o|o|o|q}q}q~qqpomlkiiijjklnoopooppqqppqrtsoknssyzxtqonnmlmloppppop{qrqrqpmkjjjiimqnjujlkjonstwxyzxzx{yzz{z{y{y{{{u|q}q|w|}}y~ro}p|t|z|||y|vtrrrrr~r~rss~s~r~r}q}p}o}n}m}i~q~rnomnoponnnnorsstvvutrtuwwsq~o|m{mzmymxmxnyozp{s}u~vtr|q|rztvtssstststsususttrtqspqnxkhkrxwwtuwo~WoSl`p[tqwzsuqtru|y{~|xrwnyqxtuwqwptrrtrxw{|z|z|z|zzywyuzu{vzvzyvs{tzuwwyz{{~y|yyywzs{u~z}w}u{w{|z~y~y~z|{{}{{}~z|u{q{s{v{x{x|w|w|w|w|w}y}y}z}{}y}x}w}w|w|w{x}x}y~y~zzz{zx}v|t|r{r{qzpzqzqyqzq{t|u}w~v~u}x||zxyvyp{p{p{ozozozo{nznznznznzo{o{r{tzwxxwxwwxsxpxoxnvmwmwovpvruststsutvtwtwuwuwuuutusususutvtvvwyw{v|v}v}v}u}u}t}u}w{y{yzxzx{y|{}||}y}x{uzrzszuzwzw{w{x|x}y|xzsynxkyj{n~toty~{~|~{~w~t}s|w{{{|{}{~}~}}}}~}~~~~~}~|}|{|u|r|q{q{qzrzrzrzrzszu{y{}|||{{{{{{{|}}}~}}z}v|t{t{u{t{t{u{u{u{t{t{v|{||{}{wvtuw~w~w~v~w~z{yyxww~y}y|{{~xtqpswyzxxy{}~~|zxspu{~|{zz||}}}}}}||}||zokpx~~}pYcv{z|yy~{yvyw~z~z~w}v}v~vz~}}~}|}~wppuy~|z{|}~~|wy~}|{{{{|~~~}~wvtlovy{||||}~}{{|||{|||||||{{|{wrw|~~~~|zzzumlsvxrpm^fy{{{y{~~zwz~}sssrrsstuuuuuuuuuvvuutttttuvvvwvvvvvvwwwvvvuuvww~x}x~x~xwwwwvwwvvvvvuuuvwvvwxxyxxwwxy~z|{{|{|{z|y}x}vv~v~v~vvvvuuu~uv~w~w}x}x{yxzuysxwvyu|t~u~u~u{twuvuwt{r|r}q{pzp{p|p}q|rzrxswqwqvpuoronplqnsrsvsxrwquotntmskslsnrqrprmqkpkpmqoqqtsyv~yyt|qyqwrwsxszt{tztztysxrwqxrytxtxsxpvmtjuiwlxoxsxtwttusvrvrsvj|`[lsvn~a}c}i}e`}SrNoTr]vaubv_w^{_{`{^xb{f~g{g}i~r|}yqtK^Rdarqvtyoxkxmynynyv{u|o}m|o{ryryozkwdodolwnxpyjvgxhyiyl|m}p~qr~r}q}q~qqrpliihim~p~q~r~r}r}s}r}q~p~oppqppn~mljhiiklmnnopprrrqqsvxwomqv{~|vqonnmlkkquust{twsyqrr~r~qzozljijjjkosomqnjqouuyy{{||z|z|{{{{|z|z{z|{r{p|v|z{z{t|o}p|s|x{{{{{y{w|t|s~rrrrrrss~s~r}r|r|q|p|o}m}g~mqpnllmmmlllmnprrssssttsrq}q}o}m{lzlzlzmzmymymynzo|svwut}t|sztvtssstststsusttrunnibf\efdpdiednqxxxuvyt}YpQmTmer~ywwsrsotzz~{{wrvowsvvswqvrrunxo|x~~|~|}|||z{x{x|x{wxyw}rop}qzs|u~utt}u{wrzo}r~z}}|}|{zz{}||}z~z|~|z|u|v|w|w|w|v}v}v}x}x~y}z}{}{}z}x}x|x|x|x|y}y}z~zzzzyy}x|w|v|v|u|v{uzvzx{z{z~x~x~w}u}u|w|{|{{{{v}u}t|t|r|r|q}q|q|q{p{o{n{n{o{pzsywx{xz}yvxqxnvmwmwpvqusttstsssststtttttstrtrsqsqspsptqusvwwzw|w}v}v}w}v}u}u}u}w}y|y{x{x|y|z{}z}y|w{t{t{v{x{x{x|y~z{~z}w{qymyk{n}|wwy{|||zw~x}z}|}}|}~}||~}|}|}}~~~~}}z|z|{|w|t|t|t{s{t{t{tzsztzt{x{{|~|||{{zzzz{||}}}|}x|t|t|u|u|u|u{v{v{tzs{u{w{{{|z|z|~zuvtuvvxyz}|{zyxxy~z}{|}xrkhjnquvxz|~~}|zxwuv{}~}{{|}~~~}|z{|}|pisy{~~||q`q}~wpqz}|}~~~~|}}~}~{}~~~~~}{z|}}qilsw}~}{{|~}|~~~~~~~|zz{|~~~{~r~suwwx{||||}~~}|||{{zz{}~~~{zz{|{}}{wx{}~}xwzxysbeu{~~~}{{~~rrrqrrstuuuuuuuuuvvuuttttttuvvvvuuuuvvvvuuuuuvww}x}x}x~wwwwwvwwvwwvuuuuuvvvwxxyxx~w~v~w~y}{{{z|y|y{zz|x~wu~u~vv~v~v~v~v~vuuv~w}w}w}x}x{xwxvwwvyv|v}v~v~u|uyvvvwuzs|r~q}q|p|p}p}q}r{r{szsxrxqvptpqqoqsswt}srxqsoplojnjnkonrrspqmnknlpnuqurvt{wyyv|rxqwrxszs{t{tztytxsyrxqxsztztytxrultivhwkxowrusrsqssuuvvuvqvj}_kqrnf~i|e~YS~HoLnXsbxgvfv_x]{\{_y\vb{f|fyg{i|p{zyrwVd\klvqxoxkylynykynzr{q{l|n{qztzt{p{kwhrlur|r|qzdtbvj|m}n}p~sts~p}m|m|o~qtqnkkkl~o}q|r}r}s}t}t}r}q~o~mmostvu~tqmihgijllmnpqssrqqsvvusnmp~uxwrnnnnnlklsxz~y|zvxuu}p~owqwryrxoul}jhhjnrsrmxmmrnwvzz{|}|}|{|{||{|z|z|zzzv{pzu||{yzozlzq{w{x{{z|z|z{{x|v|s}r~rrrrrrs~s~r}s|s|r|q|p}n~k~kmonlkklkkkkkmnnnnnnrvvq~m|l{l{oznznzmzmzlzlylylymzn|rwwv~t}s{sysvsstrtsutututtvoqha`L]Q^^`Y`M^Ohkwxxvuyzjv\r]nkroxuyruspuxy~}yvuququstuqvrutpxm|o~x~~}}|~{~x}w}z}z{yx{tomnn{p~qqppr~svwq{q}{}|{||||~}|}z~z~{}~~~}}}}|y}w}v}v}w}w}x}x~y~y~z}{}{}{}y}x}x|x|x|y{y}z}z~z~z~zy~x}x{x{y|z}{}{}z{x{z{}}}}wztzrzr{u|v}y}{||||}{~|{~{}y~w~v~v~u}u|s{q{p|o|n|o{qzwy~yzy{xtxowmwnwqustususuststssrsrsrsqspsprqrpsnsnsosqtuwyx{x|w}w}x}w}v}v}u~v~x}x|xzx{w{y{|y|y{x{v{v{w{y{y|y}z|||~x}s{pznzl|z~|z{{{{{{zz~z}z{{z{z|z|zzy{x{w{y}~}}|}||z|x{u{s{t|w}w}w|v}v}v|v{u{u{u|v|w|x|x|z{{zyyyyz{|}}}|}y}u|u|w|x|w|v{u{uzuzt{t{u{vzuwrtwzy~vvuuwwwyy{{zyyyxy~z}{}}zsjfeeinrwz}~~}|{zzzz|}~|||}}{yz}~~wnwxw{}{|xt~~zwy}~~zy{}~~~~~}}~~}|yxxz|ylhnvy}~~}{||~}~~}|zyz|}}zr~uy|{{||{{||~~}|{{{{yy{~~zxyz{|~}|{{zwx|~|ys~ruwxxttqpy|}~~~}}|xy~~}qqqqrrstuutuuuuutuuuutttttttuuuuutttuuuuttuuuvww~w}x}x~wwwvvvvvvvvvuvvuuvvvwxyzxw~v|v|w}x|z|z{{y|x|zz|y}w~vuuu~v}v}w}v}v~vvv~v~w}x}xww~w|v|u|v}v|v|u}u}u|vxvvvwt{s~rqq~p~p~p}q|rzrzrxrxrwqvptprqqsttzs}rvqpolljjijhkknoqrpomllmlnotqwsxu{x~yw}t{qxpxqyszs{s{tztysysyryrzs{t|t{tzrxkvgwhxmyqxrwsustsvuzv{uzrxoyo{p}ggonm|f|YP|KmRo^ufymxnx`x\yVv\v]uaydxewfwgyoywxvyajdokxkyjylznznznzozozo{o{pzqzrzr{ozmymvoyq}r}q|ar]uj|m~nq~s~s~q}n|j{j{l|p~ss~pooo~o}q|r{s|s|t}t}s~r~p~olmmpqoq~trokhhiijklmoqrrrqpqrq~p~o~l~j~lnopnmmnnnllmswy~{}{{w|r|mvnpqxr{svplkshffjqwtplmonuwzzz|y}z|z|{|{{{{|zzzxzuzrztzx{|{uzaygyvy|y}z}z}z}z|{z{w|t}r~rrrrrrr~r}s|s|s|s|r|q}o~o~kkmmlkkkkkkkkkjjjjjmsvsn|n{ozoznznymzlzl{k{lzlymzm{n|svvu}s|q{qxsutststtuuuutxsuidaS[JZ^]i_U^L[Qfkwwxvuxyv}nv^oXppwqzpyttvwx{zwtvqvrtrstrtusxqzo}r~y~~}~}|~{~x~x}z|zzzx|rmmo~o{p~oonnpq{tuyu|y|~{~z~||}}~}}}{}{~|~|}~}~}~|~}~}}}y}w}v|w|x}z}{}|}{~{~|}|}{}z}x}x}x|x|y{y{y}y}z~z~z}y}w|v|v{x{{}}~~~|}{}}}zyzsxnwnwpyszx|y~yz~y~z~{~~~~}~|~{~{~z~z}y|w|t|q|p|p|o{rzzyzy|wvxqxnwowstusvsusustststrsqsqspsororprpsnsmsnrosswwzzy{y|x|x|w|v|v}v~v~v}w|w{xyxzxz{z{y{x{w|x|y|z|z~z{}}|zv~t|u{l{v}}~zzzzyxxzzz{yxwwwuzu{uytvsvswuywzxzvyvyuyu{s|r|t|x|x}y}x~x~w~w}v|v|v|u|u|t{r{szvzzyxxyyyz{||~}z~x~w}w}z}{|y{t{szszuzv{u|u|tzqvmptwx~wvuvxwwxxyyyyxxxyz~|~}~yqkecehmt{}~~~}|||||}~~}}}~{y{{xxuw{~}{{}~}~~~~~uty|~~~}zyz|~~}zwvvy|~~vmpw{|{y|}}}~~}}}~~~}|{zyxy{|}{tx{|||||{{{|}~{z{{{yxz~{vxyy}~zwvtvvxvvvvur~q~rtux~ylrvy||zxxywxzzzzqqpqrrsstttttutttuuuuutttttttuuuttttttttttuuuvwv~w}x}w~wwvvuuuuvvvvvvvuuuvvwxyyxw~v~u}w~w}y}y{{y{y{zz|y}x~wwvvvw}x|w{w|wwwv~w{x{x|x}w}v~u~v}u~u|u}u}u~vv|vvwtvyt}srqpp~p}q{qzrysxswsvqvpupspqrqstsurtqnohmfkekekhmkqnommkmkmkoorrtwu{x~x~u|qzoxpyqzs{s{sztztztzsyrzr{s|t|t{s{rzkwfxgypzszsysysxsyt{u|t{ryrwqxqzj~_ipo{jx\TzUp]rdwi{ozqx`xXxNsXu^u`vbucsetcukvwxz|jsiviygzjyn{o{m{lznzn{nzozoznznynymyiwjwlxnzo|p}ixfxj|k}m}r|u|o{lzl{kzkzj{m{p{r|s~r~r}q}r|r{r{s|s}s~r~q~o~nnnnknmklq~qoljjjjijkmnoqrqpn~n~n}m|l|k|j}i~ijj~k~k~l~m~mnnnnosuuzosp~w~qzm~nopkrytxqtlxcbgossqooonrvr{t|s}u}y|x{v{v{w{wztzqzmyqyyzv{wzjy]xfxvw{w{x|y|y}z}zz{x|t}s~r~rrrrrr~r}r|s|s|s|s|r}o~o~kjmllkkkkkkkjihhhhikp~q}m|o{r{s{r{ozmzlzlzkzkzl{mznzn{o|s~uu}t}q|pzpxrutttsuuuvuxtzpkdR^KXUZi^i`P^I\QglwwwvvwyzqyUo_powmzowsu{vwvsswqwssstuttwszs|t~w}z}}|}}{}z}y}y|z{{y{w}rnno}p{p~oonnopryvv{w{z{z{||}|~}}~}}}}}}~}~|~|~|}|}|}{}z}x}w|w|y|{|}|~|~}}}}~|}|}{}y}x}x}x|x|y{y{y}y}y}y}y|w|v{t}v|z|}}~~~|~}}}yyrwmvlwnwszx||~|{y~x~y~z~}~~~~~~}~}~|~|~|~|}|}y}u}s}q|n{nzty}yy|wwxuxqxpwutvsvtutututtttstrsrsqsoroqorormrmrmqnspyv{yz{z{y|y{w{v{w|w}w~v~v}v{xyyyyzzyzy{y|y|z}{}{~{~|}~~}zxy~|}u|u}xyyzyxwvwyz{xwtutsvrxrxrtrrrssusvsvsvrurwrzr{r{t{v{w|x|w}w}v}v|u{u{v{w|x{v{szsztyvxxx{xxyyyz{|x}r~tu~u}x{x{tzpzqyqytzu{u|u|tzrxqutxv}vvvuttvxwxwxxyxxzz|}}{vmgdeipw|~~~~~~~~~~~~~{y|~||yyy|}|z}~~~}~~~yx{~~~~~~|wvz}~~}zxwwy|~}vsy~zw|~}~w{~~~||{zxwwxy{||yz{{|}}}|{{{|~}zxyzzxx{|yrswxwxzwxxwuutrponortsrsv{}|yy}zwwtruyxvvxyppqqrrrrsssttttttuuuuuuuuttstuuutsstttttstuuuvvvw~w~wvvvutuuuvvvvvuuuuuuvwwxyxxvvvwx~y}z{z{z{y|y}y}x~xxwww~wzwxxwxzx|wwwx}y|x{x{w}w~w~u}s}s|t|u~vvv{vtvtuys}r~q~p~o}o|p{qyrxswsvruqupuqsqrrssutwruqooilfkdjeifkinknkmjniniokqnsrtxw|w}t{qyoypzr{r{szszs{s{szsyryqyszs{s{szq{kygyjzp{r|r|r{ryryszt{tyrwrvqvqwpzd~foo{kwb~\y`tfvixl|o{rzbzUzOuXv]v^t_r_p`p]qetxxvzhvfwhxgxlyn{m{k{kzmzpzpznzlzkzkzlzlzhygwixlyo}rrp|l|j}k|mynxhwgwkylzlziyixlyozt|t|t|s|s|s|r|s}s~qpnlmmrronnmjm~p~o~mlkkkkjklnnpponl}k|k|k{j{i{i|h}h~h~h}i|j|k|k}l}m~noqssocsZoeyuvp}mnpmt~v~sxm{b`hrusq|qosvu}o}o~r~uz~u|pzpzp{qzozkzjzqzyzqzrzay`xiwrxvxwyxyzy|y|y{zx{u|s}r~r~rrss~r~r}r|s|s|s|t}s~o~nlklkkkklllkkjihggfff}g{gzgzlzq{t|s{n{mzl{l{kzlzmzmznzo{p|s}t~s}r|p{pzowqututuuvvxuzsxl_`J\JW^[i`]`I_H_Yjvwxwwwvyzt}\q`ojvlzntrtxssttrxrxtsvvxwwyw|u~x~z~{}||||{|{|{|z{zz{y|v}rooo}p{p~onnnnoq|swyu{v|u|w|{}}}~}~}}}}}}~}}||~|~z}y}w}w}x|z|||~||||~}}}|}{}z}y}x|x|x|x{y{y{y|y}y}y|x|v{u|u~w}{}~}~~~~}~}||qxlvkvowsxz{}}~{y~x~x~z}}}~}}~}}}}~|~|~|~}~}}|~y~v~t}q|o{ozxy|x{wxxwxsxqwtuutuuuututututuststssrproqnrnrmrlrlqmtpzv{zy{z{z{yzvzvzw{v|v}v}u}v|xzyxzyzyzy{z|{}{~|~}}}}~~}{zz|xttx~z{{zwuuw{|zyvvttrssrvrusrsrssstststrtrvryqzqzsyuyuyuzu|u|u{u{tztzt{w{{{yzsyvyxxwxvwuxvxzyyyz{|{}s~r~s}r|qzqzqyqyqyqysytzt{u{uzsyryszt|t~tur|mznzt}wwxwwxxxy{{~}~~}}~|umfcdjqx~~~~~|{}~}~{z{}~~}{|~~~~~~{yw{~}{{|~}yx{}}}||{{{|~|ww~{x}~ywzt{}}}|||{yxwxz{||||{{z{||}|{{{|}}{xxxzyxx|xtsnrwwtssortwwxwstupmpwyzz{{{|}~{yz{ypsuwzwsty{ppqqrrrsrrsssstuuuvvvuuuuutstuuutsssttttstuuuvvvvvvvuutttuvvvwwvvuutuuuvwxxxwwvuvwx}y}y}x}x~x~x}y|y}y}y~xxw}w{wyxwwxw{x~xy~z|zyzxyyw|v}s}q|q|rzt{u}vv~uxustvsyr{q{p|o|o{pzpxqurururtqsqrrrrrsvtzu|tzstpnmjlhjghghhjjljljmiminjolpprvv|x|w{szqzq{q{r{r{r{r|r{rzryqxpxqxpxqxpxnxjukwnxoxnzo{p{pxpwqwrxrvququqvrwrxm|hmp}myh{dygwkymzn|o|q{e{V{TzXzYv[r]o[mYlXncrsvlwdufuhwgxkzmzlzkykynyryqynzkzjzj{k{m|k}k{m{p|uvurm}j|gydvbt_satjwmxlxgwgviwlys{t|t|s{s|r}q~r~qpnkj~j~krtqnlkj~l~o~n~lklmmlkjlnnoonm~k}j|i|j{j|i{i|i}i}i}i}j|j|k|l}m~n~oprt}sms^qVqcyv{s}onprwywqdairut~sstzv}tn~q}usvs}o{lzl{mzlzk{l{p{w{ozly\ycxlxpyrysztzwy{x|y|zzzv|s|r}r~s~s~s~s~s}s|r{s{s|t}u~spmkkkkkklmlkkkjihggfe~c|azbyezjzn|o|o{m{l{l{m{lzmznzozpzr{s{t|t|r|q{pzpzpxqvsvtxuzvztzpqhU_I\OXb]baR`E`Jbjmvwxxwuxzwfu^qfvozpvs}uwtxt}r}swuuyx{yz{z|w~zz~{}{||{|{|{{{{z{z{y|w}s~ooo}p|p~onmmnno~qwxszs}r}t}w}{}|}}}|}|}}~}}|||~y}w}v}w}y|||~{{{||}||}{}z}y|x|x|x{x{x{y{y{y|y|x|x{w{v{u|v~y}{}}~~~}}|uzlvkwnwuxyz}~{yx~y~z}|}~}~}~}}}|}|~|~|~|~~~~~{~yxx}v|p{uyxxxwwxvxtyrxswtvtvtwswtwtwsvsvsustrrroqnrmrlslrlrmtqywz{y{z{z{yzvyuzv{v|v|v}u}v|xzzx{wzxzy{{|}}}~~~~~~~}|zxvvv~y}z}{~{ywutuzz}xzwwutrssstttttuuuvuvtuswsyszqyqzqzryrxs{s|s}s{szrzrzrzuz{z|zqy{yx|xxwuwsxqxtx{x}yz{|~}w~r}p|pzpyryryqxqyrzszt{t{u{szqypzo{p|q}s|qylvmxt}vwxwxxyyy{~|~~}{|~~{ukebejs|}}~~~~}}~~|{~}}~~~}|~~yvuty|}}}~}||}|{{|}~}zvy~|{~~yt}z|~~}}}}~~~|{yz{}~~}}}}|{z{{}|{{{{{zxwwxyxyy~~tnqsvxwuurnklrw{{zyxsnpw{~}{xxyz|}yvxyrv}{zvstz}oppqqrrsrrrsssttttuuuuttttsstttttsssssssttuuuvwwvwwvuutstuvvv}w|w}w}w}v}u~uuuuvvwwxwvvuvwwwxwwww}xzyyyyyzy{x|x|xww{wxxwxxyzzzzy{w{v{uzxw{s|r|q{rztzt{t|u~t|txtysxsxryqyqzpzpypwqtrururursrqsqsttyu~vvu{svqrnnijfgfhijjililhlimjnloopvv|y|y{vzrzq{q|q}q|q|q|p{qzpypxounsmplojphpgoktoulshqjrlrmrmqnqororospupurwswpzm}np}ozl{iykwmxnyo{o|p|j|Z}VV~TxWrZoWlSjWmctkuduevjzgxgxizjzjykylypxrxrwnxkykzl{m{n|o}q}s}t|w~wusn}jzex\rWo\qbtivkwjwdtdtgvjxp{s|s|q|o}opronkj~h|h|j}o~olkj~j~j~j~j~j~i~i~jmnmmklnnoonl~k|j|j|k}k}k}k}k}k}k~k~l~l~l~m~noprrt|r~ooktbrhxxvsvryy{yuifksvtvt|vxtn~u}smrup~n{m{m{l{k{n{o|s|o{gzYydxlxoypzpzq{tyzw}x}z{xwzt|s}r}s~s~s~s~s}s}s|t{s|t~utpmkjkkklmnmkkkjihhhhh~f}b{czgzkzm|k|h{j{k{l{mzmzozqzrztzvzvzu{t{r{qzpzqyqyqxsyszu|u|symjeM_J\UZ^^VaLaFbMfxouwwwwuwyynzcrjttwqzuw}vuuuwwwxzz{z|z|y~zz~{}{}|||{|{{z{z{z{y{x|t}poo~p}poommmmn}qwwr{q~r~t~v}x}y}z}{}|}}}}|{{x}v}w~y|z||{~{{{|~|~}|}{|z|y|y|y|y{y{y|z{z{y{y|x{x{wzwzv{w}y|z}|}}}}}||z{uzpyoxqywz||~}~{yxx~y}{}}}~}|~||||}}}}}}}~~~}{z{~z}v|wzvyvxvxuxsyqyqyrxrxrxrxsxsxswswsvrvrtrpqnqmrlslslsmtqwxx{x{y{y{xzuztzv{w|w|w}v}v}w{zx{xzxyzz||}}~~~~~}}|zwx{~}}z}{~{{ywvutuvww|wxvwvwvwvxwxxxyyyxyw{u{szr{p{p{p{q|qqrq|q{q{q{p{s{y{{qzzyx|xwwtxryrysyryuz}{{}}u}q{oxoxrzryrxqyqyrzsztztzszqzpzozo{q{s{szrzs|t}v~wwwyz{yz|}~~|~{}{shbackwz|}~~}}}~|~~~~~~}~y~{~~~~~~xrty{~~}}~~}{zz{}~|ywz~~}|}~{z~}tvy{||}~|{|}~~~|zy{~~|||{zyxxxyxxyy}~ukpx{|{xtoh`blwxzyvusqrwyzzwuuxxx{}yvvz|~|{wtuz|ooppqqrsrrrsstutttuuttttttttsttssssrrssttuvvvuvwwvvvuttstuvw~w|x{xzx{x{x|w}vvuuuuwwwwvutuvwwvvvvv}v{wxxwywyxyzy|x~x~w~xzywytztzuzuzu{u{uzvxxuzs|r{s{s{szs{s}s}s}s|tytvsvrxqyqzqxpuqtquqwqvqtqqrrsutzvwxw}tzsxpulrinhlikjjljkjkkmlonnpovv|{}z{wzrypzp{p|p}p}p|p{pzoyownulpklikgkeiflipmrioflhkikjnknknlompnrotpvpwqwpvozo}p|p{nzlxmvnvoxozp{o|m|]TRPyUpUkMeOgWnbtar^sfwizfxgzk{kzjykymxqvsurtnvlxlylznzo{p{s{uzvxwzw}vt~o|kycvZpXn\qdujwjvhvdtcsevixozq|r|p}o~nno~o~n~l}j|h{hzi{j|j}j~j~k~j}i~i~i~i}h}h~jloppoooooonl~k|k|l}m~m~l~m~m}m}m~nmnnoppqqrrq~o{o}lwnxw}xxwwxyxukmruvs{twxsp~x~omsurpp}m{kzkzm{m}p}p}ez]yfynypzp{oyo{ryzv}v~{xuxxvzs|r}r}r}s~s~t~t}t}t|t}s~tsoljjk~kklmnnljkjiiiijkk~h|hzb{j{o{l{e{i{k{l{nzoyryuyvywyxywyuytysyryqypzpyqzr{s{t|s}qzjlcH_K]V\W`MaKbKdaipt}v~w|w|v|v}v~w}v}qylqntsuqzt~v{wvxwzxzy{z|{}{}{}{~{}{}{|{{|{|{{z{z{zzz{y|v}r~oo~p~ppommmmn}qvwr}q~q~s~t~u~v~w~x}{}|}}|zy~w|w|x}{|y{zz}zz{{||}}{|z|y|y|z{z{z|z|z|{{{{z{y{y{x{x{x{x{x|y{y|z|{|z|z{vzqynxryvz|{}}~|yxxx~y~{}}}~}}}}}}}}}~|~~}~||~|{{~{}z|vyuwtwswrzqzpzpypyqyqyryryryrxrxrwsvsrroqmrlrksltnutvzwzw{y{y{x{t{t{v|w|x|x}v}u}w{yyzxyxxzy|z~{|}~~~}}||~{zyz|~}}|}}|{z~xvussttuw~x|y|x|w}w}x|z|{{zz|w}t}r~p}o|o~ppqrq~p~p~p~q}r}v|y|v||{z}yvytytztzrypyqzvz|z{|||uznwmsouqyqyryryqyqzrysztzvzsypyoyozr{u|w}x~wwwwxy{{zz|~~~}}{~}~vkd`aguy|}~~~}}~~~}~~~~~~~z~w~z~}|}}~~ystyz}~||~voty|~|{{{|~~{{zz|~~|{{}~zxtrlkqutuz~~}}~}~~~}{z|}}}}|zyyyyzzyy{xyztjmt{||ytnh\Yiwtspsywvuwxyxvtuwyuquzzyz|}}|wvvy|pppqqqqqrrrsstuuuuuttttttttttstssssrrrrstuvvvvuvvvuuutsssuvw~x|xzxyyyyyyzw{v~wuuuuuvwwwuutuvwvuuuuv}w{xyxxxwyxx{x}x~wx}yzyvzs{szsztzu{vzvzvxwvyu{t}s}q|q{p{q|r|r}s{tytwtvsvsxryqwqurrrsqvqwquqwrxt|vxyyw~v}u|pznxmslplmnnnononppqospxw|~}{}y{sypyozp{p|o|o|o{ozoynxmukmjghfgfefehgkhlfkdjfigigjhjikjllonrovpvpvpuospupwoxoyoxoxototpupwqyq{p}`TOMxTnOgE`LfYrawYoZqgvdwbwezo|o|l|m{ozrwsusupxnynymynynyoxrxuvuvvwv{v}u|rzkybuXnYnctkylyixgvdtcsevhxlzo|q}r~pnl}j{fzcydydyfzgzh{i|j}k~mmj}h}i~i}i}j}i~jloqsrqqoonnm~l}m~n~nmmnnooonooppppppppooq}r{v~wyxxxxwuqtwvwtswwttytsttrp}ozlzjzjzk|m~oqd{_yeymyp{q|pzo{pywur~yyqquuys|r}r}r}s}t~t~u~uut~t~tpkjiij~kklmnnljkjjjjjjkjl}o|b{_zezizgzk{l{m{nzpztywxxxxyxywyuxtxsxrwqxpzp{q|r}s|s|r}o{kndH`P^\^SbK`LdRgumqsvuxvuvtuuuuututttqwqqrsrvrzrvssx{y|z}y|y|y|{||||||||||||||{||}|}{|z|z|z{z{z{x|t~ooo~ppommnmo|ruxr}q~p~rr~s~t~u~v~y~{||{yx~w}x}{~}}||}{z{{|z|~}z|z|z|z|{|{|{|{}{||{|z{zz{z{y|y|z|z{y{x{x{x{x{x{wzsyoxpyyz~{|}~~}zxxwx~z~~~~~~~~}~|~|~|}}||||{~{~{{{z~xzvwuwswrzq{pzoyoypzpzqyryryryrysysxstsqrnqlrjsltquxw|wzx{y{x{w{t{s|w|x}y}x}v}u}v{xyxywyw{w}x~y{||~}}|||~||{zz{|~|}|{z~x~wutsttuwx~zyxxxz~{~z|{z}v}s~q}p|p}pqqrqppqqrs~t~v~z~~}~|y{szuztzt{s{rzqyryuy|yz{{zqwlqjnlrowrxsxryqyqyrztyvytwpwmwnyq{v|x~zyxwxy{}}{{}}~|~z~{~}}~~{rha_fvz|}}}}{}~~~{|~~~~|~w~x~|~~}yuw|}~yvy{}~}{~tacr{~~~}||}}|yx{}~{zz|~}unjmoeijd~f~s~}~~~~~~~~~~~}||||||||zzzzzzyxxyxsprigluyzyuqlc\iwokir~{ywyz{zxuvxyyoltyzx{{|{yxxz|ppopppppqrrsstuuuuttttttsttttssssrrrrrrstuuuuuutuuuttsrrstuv~w}x{xzxyxxxyxzw}vvvuuuuwwxwvuuuvvvvvvvvw}w|wywxwxwzw}wwx}yyzu{szrzsyuyvzv{uzvxvvwu{r|ozmzozqxqwrwrysztztxtttssvsxrvrqrrquqxqxqxryt|vwy{zxwt~r}q{qxqwqwtwswqvnunvryy|}|~y}sypvoxozozo{oznyozozn|nzlskljihgffegchcicidhfigihihjikknlqnsovpuosnomnororlolrltpxqvqtpuowpyq{r}cTMLwTnNgCcQmbzh}ZnYpcv_v_vcym|pno~p}rztyszq|p{o{mzmxmwouptsrtttwuyu{uztynwcsXm\qfxnzlzlzlykwgvevhxjznzp|u}s~m}gzby_vbvewfwfzg{h|i|j}lopk~h}i}j~k~k~j~j~lmpstrqpnmnnnooooopqqqoooppoo~o~o~o~o~o~o~pqqsuwwwwxw~wvvvwxtrvvuvxwurn}hzgwgugvfvfvgwk|n}pf{dygymypzq{pyqzrzvxovmtsuys|r|q|r|r|s}t~uvvttsnhhhjkkk~klmnljkklmmkkihmv~k|^z\ybxjzm{n{m{nzpysxvxwyxywywyvxtwsvrvqvqzq|r}r~s|s|r|pzlleGaU_b`QcJaKfVlzq~ryrusvutututtstpsmrnqqqosrtwu{stur}z}z|{z|y|y{{{}{}{}{}{}{}{}{}{~{~z}y}y|z{zzz{z{v~o~nn~ooonmnmozttzq}p~p~qq~r~r~s~t~w~yzzyyxx~z~}~}{{~|||~}x}{}y}{|{|{||||||}|}}|}{}z}z{{{{{|z}{~|}{}z|y|x{xzyzxytxrxvyzy~{||}~~~~}yvw~v~v~x~~~~~~}~}~}~}~|}}|}|}|~|||{z~xzwwuwtxszrzqypypypzpzqyqyryryszs{tztwstrpqlqjrltsuzw}xzy{y{y{x|u|t|x}y}{}y}v~u}u{wzvzuzu{u}v~xyzz{}{|||~|}}~}}}|{{{||{{z~ywvuvvvwx}y|z}zyxxz{z~z||y|v{s{r{q}qqqqpppppqqrsttv~w|w{vzszt{t{tzsyrxrxxxyz{v{nwingkioorqwqyqzryryrysxpvktitlvqyv}x~zxwwwz|}}||}}}{~z{ywxz}|zkbamz~~}|}|z|~~~}~|}|z{~~~~{~x~z~|~|wpou}~|~~~|{|~}yhiw}~~}}}{xvx|~{yyz{}{tpouwkhc~Q}V~n~|~~}~~~}}}}}~}}}}|{zywwz}{yyzzywwxxtomiecjqtvwvtnekxroos}}{z|}~|xtssvypkopv|}}zyxzz{}ooooppppqqrsssuuuuuuttttsttttsssrrqqrrrrsttttttssstssrrqrsuvw~w|w{x{wzwywywyv{v~vvuuuvwxwvuuuuvwwwwwwvvvvyvvvzv}vvwx|yyzwzvyuyvxvyuztzuywwxvytzoynxpxqurrqrqtrwsxsxswtutvtwtwsusvrxryqxqwrwsyu}wz|{ywvut~t}t}t~v~u}s{ozoyqzx{~}{~x~s{puovnynynynyoxoyo{o|n|mwlrknjkghdgbfbhchdgfihiijjkkmlpmsoupvpuoqmllklpknififjonwqyqyoynzo{p|r}gWONwXqRjLh_vm}ozdsasdybz`zbyh|nopqrstsr~q}n{kxksnpoornrsswsys{uzvyqvcrTm[qhwmzj{q}s|r{lygwfvhwjxozs|p|g{_x_waubvdwexfzg{i|j}k~mrsmh}h}i~j~j~j~k~l~lnqtsqommmnopppqrtttrppppoo~o|o|o|o|o|o|o|p}p~p~q~sttu}vzx|xwyvswwr~p~tst~t}u}ro{iweuasaqbpap`o]o]qfxl~kc|gyixlynzpzpyqyryuxnvkrwyr|q|q|q|r|s}u~wxwvtslghiij~kl~j~ijnnkklnp~onkjjovr|n{dyayjzo{o{m{mznyryuywywzwzwzvytwsvrurvryr{s|s}s{s{s|qzmnfJbR`\`KbIbLh^mxq{qzryrxsxtxtxsxstrmqjrlrmvsxyz|{x|w{}z{{y|x|y{{z~z~z~z~z~z}z~z~z~z~yy~y|zzzzzzz{v}p~nnnoonmnmpxvs{q~pppqq~r~r~s~v~x~yxxxwx~z}~}|||{}x~}~w~x~y}||||||}|}|}|~|~{zz~z}z{{{|||}}~}}||{|z|y|y{yzxvwvwzx{yzz|{||}}}t|t|t|n|i}m|o}r}u}{~~~~}~}~}}}}}~}}~}}}||{y~w{vxuxtyuztyrxqxqxqypzqyqyryrzs{s|s{tysvrrqnrlrosuu|w}x{y{z{z|z|y|w|z|{}z}x}v}u|v{vzvzu{t{t}u~wxxy~y|y|{|||}}~}}|{zzz{{{{~zxvv~x{||{zz~z~y}y}y}z}y~y~z~{~{{~}}|z{x|u}trqqqqqqqqqqqqqqs{}~|w{s{t{u{vzv{vzv{z}~}|z{yuynuhmefiinsqyrzszryrzrypwiterjtpxv|x~ywuuwz}~~~}~}~}~~}vpsy|~pdct}~~~}~~}~~~~|~z~z|~~{y}~}~z~z~z~zyspv||zy{}|{z|~~yy~}|zwvx}vrwzz{}~}zxwxvwpl`~H}Wv}}}}}~~}|||}}}}}}}|{yywwz|wtx{zxusrqqmjec_horuxxxunqyxxzz~~}|~~|vroopsvssvrv{}}{xx{z{}ooooooppqqqrrsuuuuvvutttsttssssrrqqqqqqqrsststsrrrrrrrqqrstuvvv~w}w}w|wzvyuyvyv{uuuuvvxwvuuuuuvwx~x~x~x~wwuuu~u~u~uuuww~x}x|x|wzxwytzszuyvxwwwuxsxrxrwsusrqqqqqtrvrwsxtxtxtxtxtxsxryrxqxrurvtyu|w}z|{zxwvv~v}v}u~uuus}q|q|x|}|y~wr~qzpxnxmwmwnwnxozp{p{oznxovowmukrhnekdmemfkhkjkkllmmonqnrotpvoumskkjghmhjg`g`ilmwo{o|n|m|m}p}o~j`YSyXvSnWmiwqzpukvi{hgcaeloprrstttsp|lxkpmmnnqqqtrwrzr|t{wytwgtSk[oivkyi{s~y~u~p|jygvhvjvnxnzk{fyawavbucudvdwfyg|h|i}k~mqpjd~g}i~k~j~j~k~l~lmorsqolk~lnopppqtwwuspooonnn~n|n{o{p|p|p|o|o}p}q}qrsu|w}xwvzsqvyt|o{o}o|p|p|o{n|myjwfuetcrdqdqfphpjskwiwbu`tiunwqyoyoypxqxqxsyyy~vkpx{u}qs}q|r|t|w~xyywuskgkjjln~t}r}i~g~lnkjko~rr~q~mllnpr~x|ozezezl{n{n{nzozrytyvyvzw{w{vztzsyrwrwrwsxtytzt|t|s}q|nxhacQaVaKcKd[jrlxnzpzqzqzrzszszs|rxrmsjumwqxu{z~|~{}z|z{zy{x{x{y{zz}z~yy~y~y~z~z~z~z~yy~y{yyzzzyzzw}q~onnnonmmm~qwxr|q~qqqqq~q~r~s~u~w~x~x~xyxx~y|~~~}}|}}z~xxvx~y}||}{}{}{}|~|~{zzyy~y|z{{|z|z}y|x|w}x}w}w|w{wvwyw|x{x}yzzw{~{{x{dzdzey^yZy_ybzg{h{n|u}|}~~~}~}~}~}~~}|}||{{y}v{uytyuzvzuytwsvrwrxqyqyryryrzr{s{s|tzsysurososstyu{w|w|x{y{z{||}}|}}}||z|x|v|u{v{u{uztzszs{t{v|w}w}x|x|y{{{{|{|{}|{zyyy~y}z~z~{~zxwwz|uvy~|}~{yxx~y}y|y|z|{}{~{|{~{||z}y~vtrrrrrrrrrrrqrty~||x{uzuzw{z}{~{{z~|~|x}xyzszksdgbcglnuryryrys{szuxutnqjsqxw|x}w~tstvz~~~~~~~~~~~|rnsy~uhew~}}~~~~~~~~|~v~y~}|}~~}~}{~z~z~yyyuv~|vpw~}}~~}~~~~}{ywx{~znmxz{}~}zvtuyuvws_~P~j}xy{|}}|{{|}}~}}}}|{z{||{xniqy{vqpoomjia^eiosvvswwpqw{}~{{|}{vqnpsuyzy|{uwz||{xwyx{}oooonoopqqqrrsuuvvwwvutssssssrrrrqqppqqqqrrrsssssssrrqrrrstuuvvvvvvu~u}u~uutuvwvvvuuttuvvwx~x}y|y{y|x}wvutttttuvwwvvv}wzxwyuytxtxtwuvuvvvwvvtsrqqppqpsqvrys{t{s{s{sysyryryrxrsstt~vx}z}|{zxwv~v~w~w~vvvvtr~r~y}}}x~vrq}pzownvmwnxoyp{q{q{pzpzqzr{qzpznzmwkvkvkulrmqmpnpopoqoqprounultjkidgffdf`gailmxn}n~mlklljgc_{_z]ueupwovpoounmnjfinpqqqssuuvsn{ktmrmsowqxqzr{s}u|vzwxluUm]oiukyj|r~ws~p}lzgwfugtiwjxhydxcwdvdvdvdvewfyg{h{i|k}mqqjdf}j}m~nnopppqstrpnlmnnnopqsvvusqonooooo|o{o{p|q|q|p|p|p|p|q}s~tvxwvuvppvuq{lziylzl{lzl{o|p|p}m{lzjwkuntssxuywtwgu]q]ofsivmzlzkzozpyqxsyv{{u|fynw{u{pq}q|s|u}x}yzzxurjgiijlp}z|y|l}f}hlljkp~t~u~u}q~mmmmou}s|j{dzbzhzmzmzoyqysyuzv{w|v}u|t}s|rzryrwsvtwuxu{t|t}q}o~jveXbUbKeRhpj~kzlznzqzrzszszszr|rysovlzs|v}x}z|{{zzyxyxzw{w{w{x{yz|z~x~xxxyyyyyx~xzyyzyzyzzx|s}p~onnonmnn}ruyr}q~qqqqq~p~q~r~t~v}w~w}x~x~w~x}y~z|}||}|}}|{zyz~z}{||{|{|{|{}{~z~zyy~y}y{yzy|x|x}w|v}v}v}u|v{wzwxw{v}w}wxyzz|z~zsy_y_y^xXxVwYv\v]wZxXy_zl{u|y||}~}~~|{{}|{zz~x}u{tytyuyvyvxvvuutvswrysysysyrzrzr{s{s{szswsrtqtvu{v|v{w{wzxzy{{||}|}}}{|y|w{vzuzv{u{tztysytyuzv{w{w{w{x{y{y{z{x|y|{zyzzz}y{x{y{{}{}z}y}zy}sstw{~}{~xwxx~y}y{{{|||~}~||{~|}}|~yvtsssssssssrrtuw}zz{y|x|y~z~{~z}x{y{{{}~|~|||w{pxhoacadhopxryryszt{zy}vwtqvuzy}x~u~rrrt~{~}}}}}}~}wuz~wliy}}~~~~}}~~~~~~~y~}~|z||z{}~}{zz~y~yzzz}}~~zv{~}~~~~}}~~|{yyy{|xpsyy|~}|zvvx{xx|ygcvypnv|~}{zz{}~~~}}|{{|}}|yneit{tnmppjec`ckmquwvuwrhjrz}zuuxxvsoquy|~}{zxuwz||xsuww|oooonoooppprrtuvw~w~xxwutssrrrrrrrqqppppqqqqrrssrrrrrsrrsssstuuuuuuututttuuvwxxxwvvuttuvvww~y|zzzyzyy{w~vtsssttuuuuuvvv|wywwwvwuwtwsxrxswsvrsqrpqpprpupxq{r|r|r{rzrxrxsxrxrsrrt}vxz~|{zxvvww~wvvvutstz~~}x}u~rp|pyowowoxpzpzq|r{szrzs{t{tysyszs{r{q{o|o|pyqwqsproroqpppqptnultjmhgcl]q\sdvixn}mmlljjjjihg~g}f~nvtxqopupponmnopppqrsuuwtpl{lymyozqyqyr{u|w|u|wznw^rbrivlzm|q~s~r~p|kzhweuctdvgxgydxfxixgxewdwdxfzg{h{h{j|mtungg}j|p}t~wxyxxxxywussrpnnnnopstsrqppppqqq~p|p{p|p|q|p|p|p{p|r~tvxxvutso}o}so{mzkyjykykzl{n|qtutss{uyyvzvywvypylyevdtfugwizlzn{p{r{rzsyuyz|xqtts{xxt|o}q}s}v}x}xyyxuqighnpmk~u}z}p~g}e~jmkko}v}x}x|u}p~o~mmmp~t|r{mzaxcxjymznyoyqzt{v|w}v~u~sr~q}r{ryswtwuwuyuzt|r}p~k}gcdUdJh^k}k}l{mzozqzqzrzszrzr{qzuryr}w~x~z|zwzvyvwuwvxv{w|w|w{wzzz}x~wvwxxzzyxyzzyzxzyzzy{u|r}pnnnnmo~qzutzq}q~rrrr~r~q~q~r~t~u~w~w}x}x}x}x|x|y}{|{{|{||}~}~~~~~|}||z|{{{z{z{z|z}z}z~yy~y}y{y{x{x|w}u|t}u}u|v|w{x{yzx|v}w}wx~ywzwywzpzezczaz[yZxZw\vYvUvQwXwbxjymzq{w|}}{yy{|z~y~x}v|tztytyuyvxwwwuvuvuuwtxtxtytysyszszszs{szswsstsuwv{w|w{x{x{wzxzy{z|z|z|y|w|v{vzuzuzuzuzuytzuzvzw{w|w{v{w{xzxzx{w{y{{{z{~}}|{zyywyw{x|y|y{y{w|t}s~tuwx~yz|xxxxy}z{{z|{}}~|{zz{~}{~xvtsttssssssssu~zz}xvvtts~s{tzwz{||~{||xzszksbf]abikrqwrytzw{}zy{yxzy|z~x~uqpqt~{}|||||{|~~~yqm{}|~~~~}~{z{|~~~~~~~~~~|xz{z|}|zyxyzz{{||}}}~}}~}~~}~~}}~}}{|~~|zyz|}zytu}||}}{|{zutyzttz{vhcq|~}zxy|}~~~}|zz|}}{ywqluxslkornd\gqpqrstuvtj`elqt|}xqpttsolnuz|{vvwvwxz{ztoprtzonnooopppppqqstvw~x}yywvtsrrrrrrqqqqppopqqqqrrrrrqqqqrssssssttuuuvvvuuuuuuuvwxyyxxwvutuuuuvy}zz{x{v{wyzx|v~utstttuuutuvvv}v|v{vyvxvvwvwuxuxtvsurtqrrpsovpypzqyqypxqwrwtwtvrrqsrytwz|{zxvvwxwvvvttt~u~{~~}y~u~r}pzpxoxowoxpzqzq|r{szsztzt{tysytytys{r|p~p~q}s{swqtosoqoqqqqtototkqeoUwA}AVkoo~n~n}m~ihhhhiifcdkkl|m~mooopqqqpooqrt}t~tqom~l}m|n|ozpzszw{w|t}q|mzgwfvkwnyo{p|q}q}m|kzixevaucwhyizgzizmzjzgyeydyf{h{izizj|n~qsok}j|j{l|r}w}~}}}~~}{{||{yxwqoopqqrrr~ss~tttt~s}r|q}p}p}p|o}o|p~stvwvussso{lxlymynynzoznynzo{q}tuxxyy|zy{xuwtxszr{rzpynzk{jylypzu|s}t}u{tywu}xvyr{~v|yr}r}t}x~y}x~vvvtpkjnwyqisztk~ggklkn~u|z|{{y|t}r}omno~t{vzuyowfwfxmylzmzp{tzv}w~vtsppq~q{rytxuwvxuytzr}p}m}ikfWfKjin~nznzozqzqzrzrzrzrzsyvzzw|w|x|yzzxzsyqtqqsssxv|w}w|w{wzzz}x~wuvwxyyyy~yzzy{y{y{zz{x|t}q~omnmnqysuxr|q~qrrr~r~r~r~r~s~s~t~v~w|x|x|x|x{x{x{z{zz{z{z}{}|~|~||~{}y{yzyyzyzz{z|z}z~y~y}y}y|x|x|w{v|u|u|v|w|x{zz{{{{z}x}xzxxytzn{tywzr{l~j}g|c|b{a{^yYxVwVw]vdwcw`x_yjzw{z}x~xz~z~x}w}w}u|tztxuxuxvxwwxvvuvuuvuwtxtytytysysyszszsyrwrtstuxw|x|x{y{y{xzxzxzx{x{x{w{v{uzuyuyuyuzvzvzuzvzx|x|x}w|u{v{wzwzw{w{y{{z}{z|z}z{xyvxuyt{t{t{tztzszrzr{s~sttu|yy~yyxww}yz{z}{}~|zxwwyz~|z~wutssssttv~wvv~w|yy|vusss}rzsxtytzu|x{zx{tzntei\a^dempvrytzy{{|}||}{~{xuqpqt~|}|{{|{{|~~~}zvs|~}|}}~~~~}~~~~~~~~~}~wz~|yxxyzyz{~}~}xx~~|}~~|{}}}~~}}}}{y{~|yz}~}vkq~{{~~}|wpqy|{z|zvniw}ywx|~~~}|zyz{|zxyyvvuqonowwmas~wwrjmrvunbddgjpwyqpuutnknuz|{yxwuwyzywpjgdfs{onnnopppppppqstvw~x}yyxvtsrqqqqqqqpppooopppqqqqqqqpqqrssttttuuuuuvvwvvvvuuuvwxxxyxwwvuttttuxzz{w|u{u{wyyx{v}utsttttuuuuuu~u~u}u|u{v{v{v{v{wywxwwvvtursqsququqvqvququsvuvtuqrpspvrzu}y{{ywu~v~wxxwvuts~s~v~|~~~z~t}q|pyoxpwpwpxpyqzq{r{r{r{szt{szrzsyszs{q}p~p~r~u|uyrtornrospsotptouksbwCy:O`ko~p}p|s{n{g~eeegiic[YZbhklnnoopqqpnoprs|s}rpnll}l|m}m{n{rzwzu|q}o|kzhyhxkxmymzlzo|l|i{lzjydvcvfwiyj{i|l|m|lzhzezf{i|o{rztzt{u}u~ts}q}p|m{j|n}rtsstuwyz{zz|~~~tqonoqq~s~t~t~u~v}vww~u|s|q}p}p}p}p}p~qsuvvusrqp~nzlxmxpzq{r{s{s{t{u}tuvx~{~{}yz|xyyuyyzy{x|v|v|t|n}ml|myoyruvu~xzyxwx|wq{vu}t|w|{}{}w|t|p|ptqmqsyzupw|yqidgkjlr}u|xzwzv{u|p~lp~q}tzwyxxvwnwixjyk|nzq|u{w~wuspnnop}q{sytxuwuwuwszp|n}ksgWhTlqp|pypzqzqzqzqzrzrzszuz{z|y{yyxxywzuyqwmommpurxu|v}w{xzxz{z}y~wvuvwxx~x}y|yyzx{x{y|z{{z|v|r}pnmmo}sswq{p|q|qrrr~s~sssrr~s~s}u|w{w|w|w{w{xzyzyzz{{{|{}z}z}{{}z}x{xyxxxxyyzy{z|y}y~y}y}y|x|x|w|v}v|v|w|y|{{}{~{}|z|xzxxxtypzuzwyzzy}t~rr~o~n}l|izdy^x_xdxfwbwXwUw`xnzv|w}x~y~x~w}v}v|u{uzuyvyvywyxxwwvuvuuuuvtxtxtytysysysyszsyrxquruvxx{y|y|y|x|w{wzwzwzvzvzvzvyuyuxtxtyvzvzvzv{w{y}z~zw}u{uzvzvzw{x{{{}z{zx{v{v{vzuytytzs{r{qzqypxpxpxqzq}rrrs~v}x|z|{{~yyy|{z|z|{|~zwvuvvxy}{y}u~ssstttw{zy}x{xy{w~uss}s{tytwtxtyuzwzyyzv{rykp]d^chnqvryt{z{||}~}}}|~wtropt~}~}}||||}~}~~|{{zx}~}|||}~~~|~}}~~~~~}~{|~~~|{{{{xy{~{vy~~|~~~~~~{y~|~~}}}{y{~~~{{}~}wpv~||~~~}{uosz|}}|zxtwz}yvx|~~~~|zxyz{ywyyysrqsusxysv|}~|hZdqwuroe^`dlw|vvxyxusuy{}{yyxwyzzxvqkjg`p|onnoopqppppppqruuvwwvusrqqpppppppppooopppqqqqqqpppqqrstuuuvvvuuuvwwwvvvutuuvwxx~y~xwvuutttuwz|{x{v|u|t{uzwxzw}uttssttuutttts~t}t}t~t~t~u~u}u~v~u}v{uxuwtwtvtttssrsttvuvutprnrmrouszw~zzy|vyuyu|w~xxwv~u~s~r}s}x~|~zu~r|pzpxpwpwpwpxqxq{r|r|q|q{rzq{p{q|r|r|q}p}o~q~v~x{uurqornuovovovovkw^yGzO~ek~n}o}n|m{m{j|c~bbcfhhaWSU]fikkklmnqsqnoppr~rqpnl~l}l|m}l}n}s|u|r|n}l|j{hzhykxjwhwexhzg{h{mzmzhxgyjzk{l}k}l}n}m{i{f{j|r|x|z{|z|{||||{}{}}}~}}|{{v|r~onmln~r~tvvvuv~{~}}~|vqnnp~r~u~v}x}y|z|z|{|z|x|w|s~q~p~p}q~rtvvutrqp~o}n{nypxrys{s|s{rypuotovoxpxszwzyzxzsuyxvw}|~~~|zyxs~o}k|kzlzosvv~w|y|v|u}w{s~z}u{x}}}}z~w}q|l}popvvxxuuy|}yofdhijl~l}l{n{r|s|p|k~o|p|uzwyxxwxrxmyjzoxsquvw{wwvspmlmno}q|syuwuvuvswp{n|lwj]j^nwqzryrzryqzqzqzrzszv{z{~{|{wyvxuxtyrypvllknoyryu|w|x{yzzz|z}y}xwvvvx~y{yzzzzx{x|x|y|z{z|{x{t}qomnq{vv|sq~p|rqq~q}ssrsqqq}p|r{u|x}zz~y}y{x{x{x{z|{|||||{|z|y|wzvxvwvwwxxxzy{z|y~y}y}y|y|x}w|w}w}w|x|{|~|||{|xzuytysyuy|z~z~{{~vvvuutt~q~m}l|l|j{dy^xZw^xgyp{v|w}x}x}w}v}v}u|u{vzwzw{x{xzwxtutttttutwtytytysysysysysyrypuquwxyzz|z|z|x|w{xzwywyvyuyuyuxuxuxuxuxvywzwzxzx{y}z~zx~v{uzuyvzxzzz|z{yxyvyuzuztysytyuzt{s{qzpypxoxpxq{q}rrsstvwvw}}|zz}{z}w}y|}zxvutuvx~yyzu|t|t}u~uuvzz}zzyyzy|w~trr|sztyuxvxwyxzy{{{{y|{|wtbg`epquxuzv{z|{zz{||~wtrpqu}~~~~}}}~~}}~|{{}}|~~}|}}~}~zx}~~~~~~~}zy|~{z}~~}~~~~~{~z~}~~}}~~|z|~}|~}~}|||||zusy}~~~}||}}zy{~~~}~~~|zxxyyxvvwtnjrz}|yux|{y|t`XgsyxyznXTdu|{zyz{{{|}~~{zwx{|zxwvwptxs}onnnopppppooppqsttuutsrqpppppooppppooopppqqqqqqppqqqrstuuvvvuutuvwxxwvvuuttuvvw~x~x}w~vvvvuuvwy}zz{w|u{t|t{tzvyzv}utsssttttttssttts~s~s~s~s~s~t}t|s{szsztxuwuuuttvrwqwrumskrkplrpvt{wx~wyvsttuzv~ww~v}u|t{s|r}t~x|}zu~r|qzpxpvqvqvqwrwrzr|r}q|p{pzpzp{q|r|r|r{q{o|q}w}y{wxuuqvnxoynynxlxkycx^yh|n}n}n}l|k{izf{g|d~babehhcXUWbijjjhjqphbjoopprrrpnm~m}l}m}l~o~s}q}o}l}k|i{izhygyfxfxhxjymyo{o{o{n{l{l|k}l}k}m~m}n|l{m{o{v{t{s{t{w{y{zz{{|||}~}|||{~yvtr~t~v}x}y}x~x~w~w~y}y|{|~~~~zsnmp~s}u}w|x|y|y|z|{{|{{{x|t~rqq~rtvwurqpp}o|o{pzrztzv{w}v~sznqhgcd`ebfjmqtwvutorknxzx{{zy{zuzrtntmwk|mps~u~u~t~r~t~wvv|t}w}}}}|~|}z}r|jjpxwwxvwz{{{qb~^~c~i~jhfc}d}g}h|h|f}i|k{pzszuzuzqymylzpzssuxuuuus~p~ml~l~m~n~p}r{tyuwuwtwqznzmylilhozqyqyryqypzp{p{r{u{{{{{yzsxtwswrxqyovmomrpyszv|x{z{z{|{|{|z|y}wvuuw}zy{x|w}x|y}x}x|y{y}zz{v}qnno~s{y|yvs~sp}n{n{o{kziym{o{o{lyiwjvnxszv|w|v{tytyuzw{x{z|{}z{wzy|xzwyvvuwuwuxvxyyzz}y}x~x}y|y}x}w|w}w}x}z}|}|{|~x|s{r{u{xz{y~z{z{}wvvvvwwwvvspl}j{gzfyhzl{s{v|w|w}v}u|t{t{tzuzv{v|w{wzvxstrsrssttvtxtysysysysysxsxuxsvpuwwyzz|z|y|x|w{wywxvwuwtwtwtxuxvxvxvxwxxyxyxyyzy{y|y}x}w{vyvywxyy{y|w{vxvvvvwvxuxtyuzuzu{t{rzqypypxqzr{r}rsstuuvtswz}{zz}uw~y|~zxvuuuvw}wxyuxuxvyv{v}v~x}x|yzyx{x}wuss}t{uyvyw{w|x|z}|}}~}|vlkgh{t{yw{y|}|zwvwy{|vsqpqu}~}}~~}~~}}~~}}~~~{z}~~~~~~}~~~~~~~~~~}|~~~~~~~~}~|~}~~~}{|~||}~}}}~~~}{{{{{{zxy}~}~~||||}~{z|}~~|{yxxwvuvtpklsw{}|{{zxwvf]duz|{{~w\Ndz{{zyxvvuwy}~~~}}~~{yxxvz~~onnnooppppoopppqrrsrrqpooooooppppppppppppqqrrrrqqpqrrsttuuvvuvuuvwxxxwwvutttuuvww~v~v~wvvvuuwx~z{zy|w|v|t|s{tzvxyw{uttstsssttsstutsss~s~t{uyuyuxsyryqxrxrxryrzp{mzlxowktjsiqkrntrxu|u{uwustsuyvwv}u{uysyq{r}t~xzzxur}qzqyqwqvqurvrxqzr|q}q}p|o{o{o{p|q|r{ryqxoxpytzuzuzuyryozn{n{nzozoykxjxiyh{l|k|i{hzeyezh|i~fdcehig`ZXciijkhinnc\hoppqrssqon~m}l}m}lo~r}o}l}k|j{j{i{hzhzizk{n{q{t{q{p|p}o}m}l~l}l}k|l|m|m|p{ozmzkzj{kzizkznxpvqusvuyyz{zzz|z{}{yxx~x}z|{|{}z}z}y}y}{}y}w}z}}~{uonq~s|u|v{uzu{v{x{{{|{z|x|trpqsuvvsqop~p|p{q{r{t{v|w}wvt~pvijab[^]_mlvtwsnlc_fh|zzyxy{{t|kvogpglwjlp~t~vvuv~y{x|v{t}s~x~{~{}~}|}|s}jmuwvwwy{zsk_VUb~knm}ize}ccb|b|c|c|e{h{kzmzmzlyjykyk{lwm{nzo~q~p}o|l{i|i}j}l}m~oq~t|v{uytxryoxnznunspypwqyqzpyozo{o|q{w|}|{~zxxrwrvqwpxpyowntpusxuzx{y{{{{{||||z{zzzx~vuvx{{x}w~ww~x}w|w{x|z}zz{v~qno~q|uz{{{|{u~n{kwkwkscp`ogrktkugqcobnfqltnwnvlujrksousytyuzvyvxvxz}xzwxvwvwuxtxtyx{yz|y|x~x}y|y|x}w|w}x}z}|}~|zyx~s}s|w|z{|y~xyz{z~vuuvvvvvvvusss~t}s{p{m|n|t{u|v|u{tzszryrxsyszt{uztyswpsprqrrstutvtxsysysysyrxswxxwvpuvvyyy{y|x|w{wzvxvxuwtwswtwuwvwwxwxxwxwywywyxyyyyyzy{y{xzxyxxywzw{u|s|szsxswtwuwvvxvyvzvztzs{rzqzqzr|s}s~srstuuutstv{}||y~wxz~||{yxwvuuvzwuvwuytxvvyt{u|u{vzxx{x~xw~v~v|w{w{x{x|x~xyz{yzwtlqivz~{~{{xtrsw{|urppru}~~~~~~~~|{}~xx~~~~~}}~~~~~~~|z|~~~~~~~~~~~~}~~~~~~~~}|zyz}|{|~vv|~~~~~~}{{{zzzyy{}}|}}yttx|{vw{}~}||zywtsuxxsoopqu{~|zwtrnbdr}{{zj]kzyywwurpqrvz}~yxxy{|}~xooonnoooooooooooppqppoonnnnopppqppppppqqqqrrrqqqpppqrsttuuuuuvuuvvwxxxwvvuuuttuuuuv~v~vvvuuvwy}z{{y{x{v{u{u{uzuxwwzv}ttsssssssstutsrrr~s|t{t{t{s|r{pyqyryrvqvnxkykylxkvjtjsktmupvrxryrwsvsvtzv~v~u|tytxryp{q}svwvvtr}q{qzqyqwqvqvqwqyq|q}p~p~p}o}o}p}p|pzpwptnsntovpwpxpypypzn{m{n{ozkx_w[v[wYy^zd{f{fyeyezh{h}g~feegijj`[dkmm}lihjlfdkqppqrstusom~m~m~moq~m~j~j}k|k{k{k{l|j|g}b~j}p}o}o~o~o~mk~k|izfxgwhwjzevgxhxizi{i{hziykwmtnrpspumxlzmzozw}zzzz~z|z|z|z|z|z|y|y|z}y}x}z}{}{~v~r~q~s}u|tzrxqwqxrzt{w|x}w}u~sqooqrssqpp~q~q}r|s|t{v{v|w}wwvsnrfc][`_vptpolc_hatv{{zyyz|u}ephvZxqs|m~nsuvvu~w{{yxxs{m|l}n}o~q~s}y}|~}|w}tvzwuvwyo]SMXehntt{srntgzd~c|d|d|d|d{fzfzfygygyhyixjykzl|k{j}j|jwj{fycxdygzi{k|m~qtu}tzsyryqwozpypxpzozpzp{ozn{n|o}r|y||{|zwwsvsvrwpxoyoypwrwuyvzz{{{|{||{|z|w|w{xy}wvw}zy}wwvv~u{uzuyuzw{wyyu}popzrxvxzxz}}yq{ivgvktepcpismukvfrbobngomsnvmwkugpirlsovotnrmqpsvyy}yzwywxvxvyuyuzw|x{wzyx}w{x{x|w}v|v|x||||{x~w~s}v~z~|~}{}xw~y~y}{yutuuvuuvwvuuv~v~y}z|w|p|m{q{s{tzsyqwovnunuovowowowovntnsorqrsstsuuuwtxtysysyrxswwxxxtvuuxwxzx|w|v{vytwsvsvsvtwuwvwvwwwxwyvyvzvyvywyxyxyyyyyyyyyyzwzv{uzszqzpzozozpzrysxuwwwxvxuzt|s}r|r|s~tts~r~s~t~tttssstuw~y~zz{|~~}{zxwvvw|wwvxuztytuvsyrzr{tyvxwxyxzxzy{y{zzy{y|x}vssutvxy~s}pyzz{{xtrsv{{uqpqtz~~}~~~~~~~|ywz~~~rl~~~~~|~~~~~~}~}yv|~~~}~~~~~~~~~~~~}zyy|}|yy{~~st}~~~}{{|{zzzz{|||}~{topv||wtw{}}|||{ywuuwz{xrpml~q~{~}{xoihlqw|}|{|}|vrt{{zwuronkkry{~~zy}yxwy{}}|yooonnnoonooooooooooonooonoopqrrqqppqqqrrrrrrrqqppppqqrsttttttuuuvvwxxxxxwwvvvuuttuvv~v}u{v|uuuuwy~z}z|z{zyzxzv{t{tzuyww|v~tssssssrsttssss~s}s}s|s{r{r~qr~s{tvtsrtpusuruotntmumvmvnvovowowpxrys{s|r{rzryrxpzp|q~rssssss}r{qypyowouospsptpwp{p}pp~o~o~o~o|oynumqlolqmtmvmwnxoypzoznylykx`vRtQsRtQwWyazezezdzg{i|h}k~l~kggilo|g^fnrtrrprnwjikjjmppoqrsssqmj~j~klmkhij~k}k|k|l|m|k~e`eklmnnli}eyat]p]p]ndvfxjylzl|l}j}i|hzjwmuptttvvwxwzxzwzx}xzzz~x|x|x|x|x{x{x{w{w}w}x~y~z}z~y~w}v}v|t{szqxovoxp|q~stssqpoooopqqqrs~s}s}t|u{u{u|u}vwwwt{nsfgfesnhfgdb_qp||~y{wyw{w}wxz{z|lsw|nwxr|otuvvu}vz}yyyn|i|i|j|h{gzgzm{t{|{~}|}yxriTEFZqtopwz{p{muqoyl|j|f|e|e{gzhyhyexeygyhykzkzk{j{f{e}fwfzbw`vbvdvewewhym|q~q|pyqxqxrxpypypzo{n|n|n|n|n|o~p~s~{}~||{yyvwuwtwswqxpypyrytyvzwz{{|{|{||z|y}w}x}y{~xv~x{{x~w~wt}syqwpuotouqvqtssxp~o|purrusxtzw{zz{~w}pzlzoznyoypypzp{mylwmvruvwvzuztyrxtytytxrunqimlntwyxyxywxwyvyvzv|v}u|q{tyzvxvyu{u|u{u{z{~{{yv~t~s~wy{|}}z~w~x}z{|wtuuvuuuuvuuv|x|y|{|{|x}u|p{o{q{pyovmskrkrksktltkskslrlrosqssrtrurvtvwuyuytzszsysxtyyzyxutvtvww{v{uztxrvqtrtsvuwvwvvwvxvyvzvzvzwzwyxyxyyyzyyyyyyzx{w{uztxrwqwpyozo{o{pzqzsyuyvwvvvuzu}t~t~tuut~t~u}v}u~utsssssv{~|{z{|~~}{zxwxxzxywzuwutvtxuywyxyyyyyyyyyxyyzyzzz{x}v~snnojntzyvzyzz{ywtsu{{tqprw|~}~~~~~~~~~|ywy}~}}{ztryxz~~~~~~~~~~~~~}|~~~|vv}~~~}~~~~~~~}{{{|zxx{~~zsmrz||||~}|||||{{{|||{||}~{vsty}~}zvuy{{{{{||zxvspryzvrk~h}o}|~}|yrlmuwxwwx{}~{{||{xsoomgbfquy}~}vsyzyxz|}}{yooonnnonnoooooopoonnnooooppqrrrrqqqqrrrsrrrrqqqppoppqqrrsssstttuuvwwxxxxwwwwvvvutuuvuu}u}utttuvxxyy~y|yz{w|t|r|rzuxxv{t~ttssssstssttu~u}u|u|s{q{r|r|rzsyuyvuvtuswtvtttstrtqupvovnvnvnvnxpzq{ozmznyoxoyo{p}rqqqqqr~r|qypwovntnrnqopooorowo|o~o~o~n}n}n{mxmumrlqmsmumwmxnxoyoyoxowlwcvUsMrOqRrUv]yd{e{e{f|h}i}j~o}s}s}i~gik}lzheir{vrvrsuoxl}klkkmnooprssoonh~h}i~j~khijhi}k|k|l{m|l~jhjkkklljcxZnShPeUhYl_rjzn|o}o~om~l|i{jymxpwswuxwzx{y|y{y~y~zyy~w|v|w|w|w{v{v{u{u}u}v~xx~z~y~y}x}w}t|s|r|r|r}rssstssrqpppqqrrsrrr~s}t|t|t{t{tuwxwuszqtkh]^cbhft|z|toqkqjqkqottvvxwxw{wwrnktw{uvv~wx~y|z||w|g|g|g{f{ezcue{q|{y}}~~{u`I=Hbt{vtsw{|}~u}tzzx}r}l}h|c{aydxexexfygyizk{lzkziygyff{fydwbvdvdvcvbudvixlxkwiumvovqwpwoxozn|m}m~m~l~n~p}q}u}{||zyyuxuvuvuwtwrxqyqyszvzwzxz{{|{|{{|y}y~y{|}~zwy{}yv|u{pwmtmrlqkpjplqlpnquo{oxpoqlsntnrqsszu|x{x}v{s}s~s}t}qzpxovkskrkqpqrpsrwxz{|}}}}}z{xxuunsmrptuywvwxvxvyvywzx|y~w~t}p|rxvvwtxsyrysyxy}zzyt~tstvwy||}y}x|xy}vstuuuutvuvv~v{y{|{~{||x}x|v{p{pzoxmtjrhqiqirjsksjrkqlrmrqsssusvsvswuwyw{v{t{szsztzu{y{zyxuuruvwzvzuxsvrtrtsutwvwwvxuxuxuyuzvzwzxyxyyyyyzyzyzyyzxzw{vzuxuutssssvsyr{qzpzqzrzsztytxtvvvzv}v}vvwvw~x}y}w}usrrrsux|~}zyyz{}~~}|yxyz|z{yzxwwvwwwzx|y|z|z|z|z|yzyzzzz{y}w~uspplacjtzz|yyyyyzzxvttzytrru{~~~~~~~~~~~}||~~~~~yy|zv}~}vtw~~~~~~~~~~~}}|||xx}}zxy{~~}}~~~||}}{xx||qb]fprsuy|}}|||}~}|||}|||{zz{~}yxy|}|{ywwxyyzyz{{zxsjeju{xun~f}i}u~zzz{xvxyywttv{}~|yyzytoomia^imow}}xw|{zy|~}zxoppoooonnnnnnnooonnnooppopqrrssssrrrrrrrrrrqqqqqppqppppqrrrrsstuuvwwxxyyxxxwwwwvvvwwvuuuttsstuvvwww~x|yyzv{szrxrxtvxv|u~tsrrsssrtuv~v}w|v{u{tzs{s{s}s|tzuxvvvuwwxwwvwvuutusuruqtptouoxpzo{lzjykwmwnyn{q}rrqppp~p}q{pxounsmrmqnpooonopotoxo|n}n|m{lxlwlxmvmtmsmtmvmxmymxnxoxowowlw_uPrKqOrTt[yb{g{f{d|e}g}i~k}n}s|q{e|e~iiybugzjkq{uvtwqym{l|l|k~kkmmmnppqroqqk}h|h}h}i~i~mlef~i~k~l|m}lllkkkikh~byWkL`E]F_Uhewdvizn~pqpp~o}m|n{n{o{p{r|u|x{x|y|y~zzyy}w|w|v|v|w|v|u|u|u}v~vxx~y~y~z}y~wwuuuuvvss~uwvtsssssrrrrqqrs~s}s|s|r{r}rtuvuvvyge\[dcmnwvtqdnblblbofsmvqxrysxtuqps|wx{v~w~v~wz}ywvuxdxfzhway`yfwm{{~}~~}~{}|}x~tb@-?f~{zywxz{}}~{~{xv~o{g{dycxcwfxgyiyjyjzkykykyjyjj~j{iygygyi{h{gzizjzjzhzhykyoxpvnwmymzm|n}m~ml~m}o{rzuyxxyvvvrusttutvtwtxrysyuzy{xzzz{{|{{|y|x}z~|}~~|x~z}~z}uyqwntlslrkrkqjpkpkpmqtpzptplrirkqkplomrpspvryuzv|u}t|rznvkoimgjdicgdgefffnouv{{}|~{|z{xzywyt{rxrtsvuxuyvyvyv{w|x~x~wt~t{uzuwutvrvpvswxx}xzt~vuvstvy{|{{z|wtrsttuu~v~z~vvv~w|y{}{~{}{|}{|x|t|q{owltiqgphqjskskskslrmtptstusvswtwtxvyzy}x}v{tztztzvzzzzyyvvuuwwyvyuwtususutvvwwwxvyuytztzuzvzwyxyyyyyyyzyzyyyxzwzvzvxvvvrwpxpyswwvytyszqzq{rzsztysxtxwwyw}vwwxxx~y~w}u~srrstvx{~|~zxwxyz|}}{zz{}||{z{yzxyyxyxyyyzy{zz{z{z{z{y{y|w}v~wvvvp`]ah}qywyxxxyyyxvu{zustx}~~~~~~~~~~{{|{zz~}xyy~}}~~~~~~~~}{|zvvvw}}ss}~~}|}~}~~~}}}}||~~|yy|viglqpmrvz}}}}}~~~~}}||{yxy|~|{{||}|{zxuvxyxxxxxurifmuvwws~h}c}g~mqx|{xxyzyvuvyz{||yvuuyzuqollgadeht}~{z{{{{|~yxoooonnnnmnnnnnnonnnnooopopprs~s}s~tttssssssssrrqpqqpqppooopqqqrrstuuuvwwxyy~xxxwxxwwvwxwvuuttssssstuvwvww~x|xzxwxrwqvsuwu|tsrrrssstu~u}v|v{vzu{t{tzt{s}s~s~s|tzuxvxwwwxwxvyuyuwvuuuttsuqwrypzmzjykwlvmwozr}trqppp}p|pzpwnumslrlqmqnpnqnrntnvownxmxlxlvlvlxlvmtmtmvmwmymymxmxnwnvowlv_uOqKpSs\vc|g}h|f{d{d|g}i~k}l|o{j{bzc|hhw]rgvi{k}o{syqynzl|l}l~lkjlmmmnnnoqqkf}f{f{e}g}i~kliij~l~l}l~lkjijkjk~btPgD]=Y=WH_`rm{gyi{o~oqqqp}o}o}p}o}p|r~u{wzwzx{y~yxx~y}x|x|x|w}v}w}v}v}v~vvwwyy~y~yxwwvvvwv~s~s~s~s~t~uwvvutsrrrqpqr~s}s}s|q|q}r~st~s|r{s|w}rvfbgaqtvwrmnekdibg^mcuowqyrzrxr{tuz{~x{v|v~v~v~w~z~wnostmvqpqrdxe{ozx}~}}}|}{~z~y~|~}N2-Ux~~}{y{{{z{{x~o{hzdxdxexgxiyiyjxjxjxjxkykzkjk{jykyjzj{k}j|k|k|j|i{h{jznzowmxlym{m|m}m~l~m}m|pzrxxuttuttsrssrstsuuxvxtytytz{zzzzz{{{{y|x|y}{~~~~~|~z|{y{vxsvrurvrwrwpwountmtmsmrtqwppplrirkpkqkojpmplrnurxu{v}s|qwmrjlgkfichbgaf`f_dcgikrryv|x{x|x|z{{ztzsvrvtxuyvyvzvzw{w}x}x}v}v|u|szsvtstnuovqwtyyy|w}zywtssvxy}x}usrtttu~v~z}}{~ww~w}z|||~||}}|}y}u|s{rxmujsirjsktltltlsmrousuutvsvswtxuxwyzz|y}v|uztyuxyx{y{xywwwvxwyvxuvuvuvuwuxvwwvxuxuytytyuyvywyxyyyyyyyyyyyxywyvyvxvvwsxpzn|o|r{uxxvztzq{p{q{sztztzsytyvw|vvwwxxwv~u~t~srstvxy~{}y~wvvvy||}~{{|~||}{|y{yzyywzv{w|x|y{z{{z|z|x|w}v~uvvxxsmh`ci{s|xxwxyzzxxw{zw~vx~|~~~~~~~~}}|{{~}{{~~~~~~~~~~~~~~}zz|zuuvy}~ru||{|}}~}|{{|}~}|{}{sr{|ysrvz|}~~~~~~~~~}}|zyxy|}|{{|}}|}}zvuxxwvutsrqggnsrwyw~n~e}b~co{|zxvurqprvz{vqvvtuvxzvqopomighox{}}}}|{{||}}yvnnnnmmmmmnnnnnoonnnnooopooprs}s|s}tutsssssrrrrrqqqppppppppqqqqqrsttuuuvvwxx~x~xxwwxwwwyz~y~x~wutttstsstuvvvvvvv~v}v{vyvzu|t~tsrrrssst~u}u|t|u{u{u|u|u{u{u}ssrs~s|t{uzuyuxuxuyvywyvyuxtwsxrzp{nzmylvmumvpyt}vsqpp~p|o{oxnvmtlslrmrmrnsntntntnsorosnsmrlslumvmvmvmvmxmxmymymxmwmumtnxnxdwRsNrXvbyh~i~i}g{d{d{h}j}l}k|h{bzaybvc|evcritmwoxpyuzqzl|j}k~mmkjll~llll~l~lmljk}i{dza{d|i}kmmlllk}klkjijkmn~^nE\:W;WE\Xhm|rm~np~opqqp~p~p~q~q~r}t}uzvxvwwzxxxxy~y|y|x|w~w~w~wwwwwwxxyx~x~xxyxxxv~u}r~pprrrstu~v~uuttsrqqr}s}s}t|r|r|r}q}q{qzqzs{w~ypojeqtpmkdibgcf`d]kcuqwryrypxqxsvyuvvu~u~v~v~v~x|z|xxyzx~rxrhwj{u}~~}~{}z}z{{~G)Cr~~~~}{zyyy|{xp|hzdxfyiyjykykyixiwhwiwjyk{l}j|k{j{ay`yhzl{l|m}m}m}l}k|k|n{pxnyjzn|m|m}m~m}m|mzqxtvusprursrsqsptsttvxwywyvyuy}z|z{z{{z|w}x}z~~~~}~||zvxruruuwxyz|{~{}y|wzvztyrxqxswtuqtotmtnsntmrkskrmrmrqvu{v~t{qvnqkmhkfjdicichdhcgcgehmottxvyvzwzyyzy|uzuyuyuyvzvzvzvzvzv|w|w}v}v}u}s|rytvurvqupvqysyw{~}xusrtwwvuuuuuuv~w}||||}y~wx{~}}}}}}|}z}v|u{uzpxmvktktltltlslrnrrvvwwvwtwtwuwuwwxyy{y|x}v|uyvxyx|w}v|wzxwyvyuxuwvwvxvywxwwxvxuwuwuxuxvxwyxyyyyxyxyxxxxxwxvxvxvvwtxrzp{o}o~q|rzuwwtyrzpzqzszs{t{rzrxtw}uuvvwwwvuu~usrtuvwy}wvttux|||~|{~|~}}}{|z{yzyzwzv{w|x|y|z{{{|z|x|v}u~tvv~x}w}u~nkebe}o|wvwxz{{zyy{{y~y~|}~}~~~~~~~~}vy|~~||~~}~~}}~~~~~|yy|}xv{}||}~~yz~|y{||}~~~|{zz{||}}}~zsfVTahqw{}~~|||}~~~~~~}|{ywz||}}}~~~~~xvwvuusqpprfhpfjuyysg~[~`t~xwtqmiecfmsvuqvss{{yyuprsstqot{{wvx|}}}~~~{yxnnnmmmmlmnnnnooonnnnoppqpopqr~r}s~ttssrrsrrqqqqqpppoopqqrrrqqqqrssttuuvvvww}w}w}wwvwwxxz~{}{}yxvtststtstuuvwwvu~ttttttssrrrrrrrst~t}t|t|u|u}t}v|u{u{t}s}s~t~s|r}r}s|szsysxtzu|t}s}s|q|p}o}n{nynvouowqzv}vsqq~q|q{pyovotnsmslsmrmsntnvnwotorppopoqnqmumymymxnxnxnynzmymxmwlultntqyp{jzUwQv]zf}ikj~i|e{f|h|k}m}l}i{fzhxhvhwjvkuouqusuqvvyozk|k~l~nnmlll~k~jj~j}j}j~jhip~k|cz`{d|j}lmnnlkk~kklkjkm~oo|bnG^Bs}z~~}{y{~tmif~ekrp~m}gzhyjzmys{lyguetdtfvgxi{k{hv[y@zD{Fz8y+x1xDx\zhzl{l|m|k{pzt|r}o|m|l|l|l|k{kzmwmulssstvqsqnrmtqvtxx{x|y|y|yz~z~{}{{}xy{||~|~z}y|wzwzx|y}z~{~}}~}~}|zyywvwxwsp|p}u|x|y|v}uztxrtprlojnknlnlnnooqoqptququpuououovpvswuyvzw{w{w{v{uztztyuzv{v|w}w}w}x||{~{|{ywwtvsuuuyv{w}v}utrrrstux{}{|z}y~x~y~y}z}{}{}{~|~|~}~~}~~~}~}~}||y{x{y{{{vzmxmuiqhpjnlopsuvyxzxywxvwvvuuuuuvvwxxzx|y{yy{x}w~v~w|xyyvyuyuyvzx{zzzyzx{w{wzxyxwxwxyyyyyyxywxvwuvuvuvtvtvtvswsxryqzp{o{mzlxkvmsqrwqzqzrzr{s{ryswwv~uuuuuuuuux~z~{wuttuvttsstu~{|{{}z}z|{|}}~}~|}{|{{z{z|y|y{y|y|z|{{|xytyozn}r}u|ty{wukvc~rndkvz{|}|~{zzyz}{}{||}}~~~~~~}vgox|yww{~yy|~~}{{{{yxz}||{|~}xxz|~~~~}z{{}}~~|tu{{y{~~}~sa_uuvz}~~}zy{{{|~~~~}|ywy|~~|zw}}{xusromopogZgnpxywtolw|vvz~~{xocZ]eosw}yyyqlqwmglv~}z|~~}~~ysjlz|wqlfnnnnnnmmnnnopoonnnopqrs~srqpqpqqqqqqqqqqqpoooopppoprtuuussrrsstuuuuuuuuuuuuuuuuvxxz~{}{|zzx}vttssstuuuvvvwxx~wusrrrrrqqqrrrrssrrsst~u}v|xyxywyu{t{s|r|q{pyowownwn{o|p}q~q~qponn~n{nyoyp{u~xsrt}v|vztxrwrvqupunumumumultmunvnwnxnwnwnxnymzn{n|n|m|m|m{mzmxmwmvmsntpztso~Z}\~e~jkkl}m}j}j}k}m}n|o|o|oznxowovpururururtquoxm{l{k|k}k|j}j~jjjijii~j~i}hhiki~g}h}j}k~klmnmlki}h}j~jkm}lyjs_lQd@^@_Sgetm}oo~o~qq~pppppqrssss~uu|rttwv|vvvvww~v}v}v|v|w|x~x~wwwvw~v~u}s|n|k{kzlzmzo{r~tutrpttrpppqqrrrrqppqrt|xzzxzxxyvzu{t{t|u}vwwqshbe[d[bZaYe]nhvrwuwtvsvswuw|vvuuuvvxyz{|||zyyxxyyzzzyzxyyI[x{||zxy|xwto~i~i~i~h}h|fzgzkzqzrzivgsfresfuiyj}k|mwiyQzI{GzCyHxKvKwLwKxSzbzn{o|p|s}q}o|l|l|l|l{l{lzmxmwmtqupxqvtpqmwpwtzx|x~xyyzz~{||z~yyxxz~z~x}w|v|w}w}x~x~y~y~z~z~z~z~|}|{ywwwvvwxvsru|uyuwtxtxtytyszptnpprqrsrtrtsuttwtwrwqvnunvpxrytzvzw{w{w{v{u{u{tzuzuzuzvzvywywyzyz{}zyxxsvsvuuyuzv{v|u~tsstrru{}}}|}||}{}{~{}{}{}|}}}~}~~}~}}||}|z{z{{{}{vzoxoukqgnimlnqsvwyxyxxwxwwvvuututvuvvwyxzy{yz{x}w}w}w|xzyxyvzvzw{y{z{{z|y}y~y~zzyxyxyzyyyyyxxwwuvtvtvtususustsutvswrxqyoxnwlvjujsnqupypyqzpzpyqwtvyu}uuuuuuuuu~x~|}|~yvuutssttstw||zyy~y~z}{}}}}}}}||{|{}{}|y}v|xz{yzywwsuoxj{n{vzvyvw|uwvizwykgv|}}~|~{zyz{}{}{||}~}tkfw~xoouzywz~~}|{|}|zwz~|}~~}ytuvz~~~}}~{y{|~|rt|{|z|}zw{{{}~~}|}zyxxz~~~}|{xtsuz~}{yuz}yvsqoomljjfn{|z|{upy|xwz~~}zoa[^ffjuxuvvtuvm`br}wz}~xqiTVv~zztdcnooonnnnooopoonnnopqr}sytxt|tsrrqpppppppqqqppoonoooppqsuvwwutsstttuvuuuuuuttttttttvwxzz}{|zzy{x}vutsssuuuvvvwxy~y}w~utsrrqqqqrrsssrrrstt~u}w{yxzvyzw~s~p}o}o{oynxnwmwlxm{o~pppppooo~o|o|o}twrty~z}xzuwsvrwqwpxowownvnumtmtmvmzm|m}m{m{m{mzn{n{m|m}m}m{mzlxlvmunroqpvr}qnd~ehlmmn}o|n|n}m}n}o}p|p{pypwpwqvrusuruqvqvpxnznzlzj{h}g~gh~j~jkjjjj~j}i~hgijjij~j~j~h~i~loomki}i|i|i|j}k~m{gsYjNdB^Meaqjym~opp~q~r~r~r~q~q~p~p~rrrrswvrwsyu|u~ttttt~t}u|u|u{v{w}w}wwvvvu~s}r|kzcy_x`whxmzo}suusqoopno~q|qrrssrqpppqs~w{zyzxxyvzv{v|v}v~vwvqshbf]e\bZbYg`pjurwtwsvswrxuw~wwwwwwwxxyz{{{zzzzyyxyxxxywxtViwy{{|}{t~p~sxy{||yr~k~h}g}g{izo|v}nw`q_q]r\t\vawlxhwcrhtqv^yBzEyXx]wWvUvVv[xcylzq{q|q|p|n|l|l|m{m{m{mzmznynvoxp{ozttppupvtzy}yyyyz~{|{x|v~wyuux~x~w~v}v}v~v~v~w}w}v~w~x~z~z~z~xyxvttttttuut~s{rvqssrqrqtsxtzs{quprttutytztyuyvxxwytxrxowpyt{u|v|x{x{w{v{v{u{u{t{u{uzuyuxvwvvwvyv}w|x{xywxtyrxtwxxyxyxzw|v~utwutw~~}}~}~}}}}}}}}}|}~}~}}}}|||||~||{}{}z|zvzpxqvnrgmhmkosuvxxxxxxwwvvuvtvsvrvsvuwxxzy{yzzy{x|w|w|x{yzzy{x{x{y|{|{{|z}z}{}|{{{z{z{zyyxywxvwtvsususurururtsttutusvqvnvkujuhshrkpsowoyoymxlxrvzvu~uuuuuuu~u~v}y}||{}y}w~v~vuttutrszy}wwxx~y}{}}}~}~~}~}~|~|}wnq{xwzwxuvutvmxkyty{zxx{w|xqyw|~uju}~}~|}{{z~z~{~|~||}~whkr{~~wrty}{wy}}{z{~~yvz}}~|wrrtz~~~~~~{z|~|z}~}{wqvzvvx|}~~~~}~~~~~}|{xvtux~}||{yusuy}~~}{xwx~}zxusrrsstvsqwxuvwpku{vuvx}~|z{ui_Z[]bltvx{{zyqdfrxz}|xz|tfoubd}}z{ymtonnnnnooppooonnmnopqr{tytxuyt|tsrqqpppoopppqqqpppppqqpqsvwx}xvutttuuuuvvvvvvutsststtuvwyz}z|z{z{zzwzvusstttttuuvwy~y~y}x~vutsrrrrstttsrsstuu~v}x{zx|u{vzxuyq{p|o{ozn|n|m|m{m}n~opp~p~pooopoorspu||~y{uxswsxsyryqyqypwouosmslvlzm~mm}lzlymwmwmxmym{m|m{mymvmtmtnropoto|onkkkmnno}o{o{n|o~n}o{pzpwptptpupvpwpwqwqwqyq{n{k{jzhyf|e~fiklkjj~j~i}i}h~fhikkkkj~h}f}g}j~npnlj}i|g|f|h}i~m{esThLbF^`mkwk{n~rqq~q}q}q|q}p|p|o|o|q~rrsuwvs|t{u}u~t~s~r~r~r~r}s|s|t{u{v|v}v~v~vuttt}t|nzexZvZudviyl|rvxwtqqqlnq|qrsstsqppppru}xzyywzv|u}wxvv}vunld]cZc[`[c[ibrmvrwswsvrwrxvxxxxxxxxxxyyzzzzzzzzyxwvvvwxvpgpvxywwyx~rymxp|vxyz{uqn~l{kymyr|fvUqNsEvEwKwRvXs\oXkQm[qotnwXyAxt;=C{=x8Kjs|rxlzk{m}psttuvwwwxz{|||ztlj|jxkukukvlvnwp{q~uvwxxwv|uzuzutrmjmlotvwwvvuu~t}u~u~s~q~q}q}r|r|p|o{nymwlulskrkrksltmvmwkxkxmyquvvvvlcussrrr{syswswrwmwftdrfuiws|t~t~t}tvwxxxww~wswtvu}uwu~vwyzzxunxhrmtrwrz~{xzzzz{{zz~{|zyw|vytwsvttuuw{yxusrrrpnmnqrttuut~t~s~r~q}r{rzrzrzt|v}v|u|u{uztzuytytyuyv{w{wyyxpvuv{surutwxw|w|w|t|r}t}s}s}s~s}u}v{vyuytzu{u|s{tyuxvwwxyyzzz|y|x{xzzy{x|x|y|z|y}y|ywyrxpyqzr{r{s{tzwyzz|{}}|x|u{yzzyyxxwwwwwwxwyxyyxzw{uzsxvvxt{u|v{xxxtxvvrnln|s{y}|t{xyyv{tyrvsurtrtotpurutvuwvvuwtxsxrxqwpvownyn}pqqrsywv~vzuxuvuvuwvwvwvwuwvvuwuwxw|w~w~x}w}v|v|v|v}w}x}y~yyy~x~xyzzx|u{r|rw|||~|~}{{|{w~}|{~{~}~~~zyvuvyzyy}|{yxzyyyyzz{}~~~~}~~~{wuvy}~|xwwwxxuqrtzxw~~||~~|{|~{||~~}}}}}}|{{{||~~}|||||{}~}zxwvwxy{|~{vvxyxvvvxxz|zzyvsw{{|}||zzz}~vswyxsa}Vbnopvz}}~}|{zvsnmmmvy{xuroqv{~}{yyzywuprwwwyvvvvwwwwwvutttttuuuuuttttttttttuuuuuuuuuuuuuuvwwwwvvuuvvvuuuvvvvvvvvvvvwxxxxxxxxwwxxxxxxyyyxxwwxx}y|y|y|y|zzzxzw{wzxzxyxyyzyyyxyv|u~uutsrqr~s~s}t{r{p|p|p}o}n~m~lkklnnzosppqqqupxpzp|pppponnoppppoon~n{mykxjwkulslrksitgtereqgvj|l}l{jwjukulxmptwxwtqpp|q|r}rq~qyptpsqwq{ppoon|n}n|lwltltmwnnn}n}m}mvmulyk{k|k|k|j|k|k{jzjyjxjwjukwl|lmmnn~o}o{o{rrqpnqsnhhlmpU}FZo~s~r|rsrktnvyvph~\}KTefilpqponmlll}m~n~oo~p~q}p~nmln~p}q|s{szszryszs{s|r~qonoqq~r{q{p}omkkloqnkihhiikkkiiiihhgffg~g}f}ghkc~Ot?t8}8;EvGr<|7Ok}kydwgzj{l}n~qsssuuuozhtjwq{w~{}}zunl{kzkzlzmymxnxpxr{t~uvwvvuvwthhlquxyxzyv~r~p~m}l}m~q}t}t|r|p|o{m{kzjziyixkvltlslsmsmuoxozp|o|n|i|i~ptvwuqrrrsttt{rxovjtas[pZnZq]sryu{rzq{q|uwwxxxww~wuvwwwxyyzzyxt~jymwr{w|}{|xyyz{{{{zw{uvstrttvvvx{zz{ywvxzzwomnqrs~s|s|r|q{q{r|s}t|v{y|z}z~zx~wu}u}x}w}w|v{uzsyryvyyx|v{v{vyvsq}vy{u|t{szszs{s{s|s}s}t|t|tztzu{s{t{t{sytxuxwxxyz{z|z}y|x{xzyyyxyxyyxyyyzyyyuytyrzs{s{s{rzsxvxxyzx{x|n{gzryyxzxywwvvvvvwwwwxwyvzt{tyuvxt|uvy{~{}yvqmk~nwtxxzyyw~u|uxtwturtqtrtsttststtttsws{s~sqypuozn~opppryvwxuvuutvtwuxuxtxtwtvsuutxu|u~v~v{wzxyxyxyxzwzxzx{x{y|x}x~xy}x~vwoxo}y{wwxy~{}|~|~{|{{zzzz{~}~~~~~~~~~}~}|xtz~zvr|ytwzzzzzz{{{|{{|{|}}~}}}}|zusyvvz|{ywuuw{|{||}~{}|zz{~~}}~~~~~~}}}}~~}}}|{{||||{z{|}~~~~~|xtrrxz|||{zywwx{|yyyz}~~}zxvtv|}||~~|yunkikmpsvxxvuuwzxvxxslmsv{xsqtuuutsnmouyz{zxxzzuh\_n}|xwvvvvwwwvvuttttttttttttsssssstttttuuuvvvvuuutuuvvvvwwvvvvuuvvvvvvvvvvvvvwwwwwxxxxxyyyyxxxyyyxxwvwwwwww~x}x{xyzyzxzwzwzwzv{u{uzuyuxvvxt{s~r~r~q~qpppqqqqnjfhkkm~m|o{q{p|p~oooopppponnooppooon{mykyjxjwjwkzj|g{dvapamdogtjym{mznsp~qnotyzzvs~qzq{qrrrqzqsrsr{rrrqqppppoonooo~o~nmm}m|l{k{kzjyjxjxjyixiwiujskokqlyl~mmm~m~m~m~m~oprs_KWglnq}tyq~ijsvsrsuuutp_KWhhhjkkj{j|k~ll~l|m{o{q~rpn|o{o}o~nop}p|q|q|o|r|r}s}s~sssrrrrpo}o|o}onnmnoponlkjigfeddfgihggfffghihW}Dv:w99<@Ep:~8Pj|n{mzp{o{l|l}n~psstwrjxivkxn{s~w{}|wo~k|jzjylylzm{nznzq{s|t~uvvvvvvskjlnqtutrn}j{j{j|j}k~n~q}t|u|t|r{o{o{nzmylxmwmvmumtmsmtnupxq{q}r~n|hzf{i~ouuussstuvvu~rzmwbuXsWpXnWp\uqyv|t|r{q{tvwxxxwww}wwyyzzz{{wzwp{ozs}z~~{yyz{{{{zxzussqrqstuxx|z||{yxy{}}yqnoq~r}r|qzqzpzpzq{s|t|w}y|{||||{zv~u}w~x~x}y|wzvxsxsxux{v|u{uywww|zv|u{tzsysyszszs{s}s}t|t|tzszt{s{t{tzsysxtxvxwyyzy|y|x|w{xzyxxxxxwywyxyyyyzvztzsztzt{szsysxtxvzxyywzpygypyxwzwyvvvvvwwwwwvxvyuztzuxvvyu}vwyzzyvqnlnysxx}zyxw{wxvvusssssssssssssssssstswtzsr}qup{o~ooop}qxuvvuvtusvswswswswsvruruvt{u{uyvuvtwtwuwvwwwxwywywzwzw{w|w}x~xw}sojsj}y~}yxwy~|~}~}~|||zxxxz|~~~~~~~~~~|{|~|{yxuw|~~}|{{{{{{zy{||{{~~~~~~}{tu|y{~yvwvwxzyzzz}~~~}}~~z~{}}}~~}|}}~~~~~}~~~}{{|||||||||}~~~~~~xssy{}}|zxwurquyyz{|{||~zvqu{||||||~~|yupmjirvxxyxwvvwwpjjopkimrywuttuwy{||{|}|{ywvx|{vi[Ygz{vtvvv~v~wwvvvutttttttttttssssssssssttttuuvvvuuuuuuuvvwwwvvvvuuvvvvvwvvvvvvvwwwwwxxxxxxxxxxxxyyyxxwwxwvvvvvw~w|x{yzyyyyyxyxzx{wzvytytxtwvuvtwsxq|pppoopqrqlijl}k|l}l}n~pqppppp~qppponnnnopooon}lzjxixixiyj|i}gzdtbmbmdserislyn|ozqrootxzzvs~qzq{qrsrq}ryryr}rrrrqpqppppppppp~on~m|m{lzkzkxjwjviwixixjwjujskrkwl~llmm~m}m~mn~pqrupacnpqr}sysrnpusrstttutbJVfhhhe{dxcuhyk~mn~n|nzp{rron}o{p}q~q~q}q}r|r|q|o|n|q}rss}t|u{t{u|v}u}s~p~lkmmoonooonllkjgffebbfiihhffffhg`}Ix;{89v:~<=@B}@r9?Yqtsrq~o~nlkjklnollmmllm~qyzu~p}n}mo}qqqppqqrsssssr|rzpzpzpzpzp{o{nynyn{o}ssr~swwyzy~vt~r~p|n{kzizfzeyeyiyrzv{s{r{r}r~r}qypwownvovpxqzrstuvvwwxxwvZzGrFpIoNpXtrxv{t|t|s{r}stuuvvwwxwusomkntzuv}}|{|{{{{{{zw}uswxz}~}|||||||}}|zwwy|zuzkwqzs|v{}}}~~|||~|~{y~y{zxzx{x{zzzy{v}s~r}r|u{xxytzrypxnvmtmsnsnsosopooptqyt{u{v{v{u{szsxsxswsvtvsususvsvtvtuutvswsxsxvxywzv|y}y|w|uzvyxzy}y}y}y}z|y{yzxzxxwwwuvtvtvuvvvwvwvxvxvxvxvvws{suxyyxxvtsporv|yy{xzwywxwxtxpwnvnuotqsrssrsrrrrrrssttuvuyt}sqqs{wyzx|x}x|v|uxtssprpssuwyzz{}}}}{|yzvxswuwvyw|t{s{wzxzzx{w|w|v}v~t}o}l|r|z}{~}~~~}~~~|{~y~y~yn`\lw|{~x}y~|~~}}||}}~~~{yxy{{{|~~~}|{|}}~~{zyyxvvxy{zyxy{}~}}}}~}}~|{}~|}~~~~~~}}{{{||||}}|||yyyz}}}~}}{{{{siozxux{}~~}{yxwvsv}}}|yrrx{||zyxy{{{{|xvqihsvswx{zwxxzzwuuvwtuz{{tlnosxz{qu}vvvvvvutttssstttuuuuuuttssstttttttuuuvvvvvvuuuuvwwwwwwwvvvvvuuvwwwwwwwwvvvvvvvwwvwwwxxxxxxxxxxyz~{|{|z|z|y}y}x~x~x~x~x}x|w|vzwywxwxxzv|v|v|v|u|u{t{tyrxq{o}n~m~l}k}j{jzkymznopqr~s{szs{s|s}r~q}pzownumtmsnuozp{o|n}o~o}p}p~p~po|oxnwmzm}m~nr~p}oyqzpzo{o|p{pxpuoupvrzu~v~rwptkqjqjqlrntnuovnvnuoupvqyr~qoprqqqqqqqqq~p~p~qp{nvmtlrlrltlvlyl{l|m}n}n|n{n}nnmzmulnlnlnlplplrmwlf_befjmnprssrrt~uvvv}v{u}uulPEVciggfee~f|gziyiygzaz\u[s^tfvlxpypzlzizhzj{j{o|q|o~nprysstrtsvuxyyzzzzzy{rljjjjjihhjmopnmkidksna_cefefgi]~Hz;}8<>@Az@q;Dasssrq~q~oljjkmnnnnnnnmmovyu~s~q~qrstssrqrsssrqq}pypwpwpxpxpxqyoynwmvnyqzu}rmmqtyyy~w~t}p}k{hzfyeydydybydyi{r|r}q}q~q~q}oynxnwmwnwowpxr|rtuvvwwxwwvZ{EsEpGoLpWtqxv|t|t|s|s~rrstuvvwwvsplkmrxwrx~|||{{{{{{{w{vvy~|~~~}||||||||}{zyyz||~wzlvsyw~y{|~}}}{{w{s~u~vw~w{xzyx{x{yzzy{x|t}r}s~vyxvxrypxnwlukslslslrmqmomlnppvsztzuzuztztzsxswsvsusurtrtrtsusuststutvszszvzyy{y}y~x|v{uzvzx{x}x~x}y}y{z{zzyyyxxvwuwtwuwvvvvwvwvxvxvxvxwvxs|suxxyyxvtsqp}t{wyyxzwzuysxqxqxpwovovnuotqtssssrsrsrssttuuvwu{tss~vy{w}wwwvu|uvtpspsrvvyyz{|}|}~}|{zyyzyyzy{u|r{u{v{wxzv|w|y}{~z~w~n}l}r~z~~}}}~|z{yv~v~t~aKJZjwvtw~|~~~}}~~~~~~|{zyxy{|~~~}|{}}||~z}}zwvx{~{xsvz}}}}}~~}{yz|}|}~~}~~~}}}}~|z{|||}}}~|wx~{wyyy~}|{z{zz{xmhu|xxw{|~{xwtrtwvsrrry}xrou{}~{zz{~~}|xommqrtxuuw}~zyz{{vsrmkpstu{ztmmswy{yuy}}}wwwwvvuttsssssttuuuuuuuutttuuuuuuuuuvvvvvvuuuuvwxxxxwwwwwvvvuuvwwwwwwwwvvvvvvvvvvvwwwwxxxyyyyxyz~z|z{z{z{z{z{y}y}y|y|y|y|x|w|xzxwxuyww|w~w~v}v|v|u{u{syryp{o{mzkzjyjwjukulxn~oqqs}szsysyt{s~rq~q{pxowntnrotqyp|o}n~o~p~p}p}q}p}p|o{pzo{n}o}o~q}r|r{q{p{p}p~q{puoqnpoprtv~wu~r{oxmvlumtnuounumumtnrprqsqwp|o~orqqpqqqqqq~q~q~qp|nymvlslqmqmumym{m{n|o}o~o}o}nnn}mzltlrlplqlnljlvg_W]b`djnqsuutuutuuvvtt~swhNK^gfff~d{cybwbwcxe{e|d}`x[sVs^vixmykyhyfyfzi{i{m|o|n}n~pr|rrrqssuuwyx{z}z|y|s~mjiiihgffimooommlehruiabegghifVA~99<=>?u>t<Shrrrsrqoljjlmnooooonnmoswuu~sttsssrrrrsrrqpp|o{oyoypxqxqxpzo{nzmxmxoxq{p}k~k~mqtu~u~q}m|j{gyeydycydxdyezezg{i|j}m|n|n|m|kyixjxlxmxnxowqzq|stuvwwvwxvc|IsGoGnKpVtpyv|u}w~u{s}rqrstuvwwvrnjiltxvr{}||{{{{{{{w|wzz}}}}||||||||{|{zz{|}}y~pyuyzz{{{{{}~~~~{x{q|m~q~su~u|uzxx{x|y{zz{{|v|n}twxxtwqwovmultltmtltlskqkokmmnntrysytytytytyswsvsustrtrtqtrtrtqtqsqsrtvtzt|v|z{{z~x~w|uztzu{w|w}w}x|y|y{yzyzyyywxvxuwuwvwvvvvwvwvxwxwwwxxwyr|t~uyzzzxvutrs{wyyxzwztyrxpwnwowqvuvuvnuoupuruuuststrsrsstuuvuyu~tt}xy}wwwvut~txtqspsqutxyy{z~|~~~}|{{{{{{z{x|v{t|r|uz|v|w|{}}~}~}~}~u~m~v~~~|~|{zywts~r~Y~>~C}F~Zpmsx}~~~~~~~~ywyzyyzz|}~~}}}~|z|}~~~}wx~~zy{|xrv{}}||~~~~xz}~~|zwy|}}}~~~~~~}}}|{{{|}||||||ww~}{||}}zxxxxx{zwtu{zzyz|~~yssvrmrxzxtoanytvvy}}{{||xodhqpmv{zz|y{||re^ROgwrqturnnquwxyuuuvxw~x~x}y}x~wvutssssssttuuuuuuu~u~u~uuuuuuuuuuvvvvvvuuuuvwxxxxxxxwwwwvvuuvwwwwwwwvvvvvvvvvvvvvwwxxxyyyyyzz}z}y}y|y|y{zzz{z|z{zzzzzzyzx{y{zxytztywxzw{v|u|v{vzu{t{szq{p|nzkxkwkwktltmxn~opp|rxrusrtttys~srr~r|q{pypvqwr{r}p~opq~q}q}q}q}q|q{q{p{p{p|p}n|o|o{ozo{p}q|rzqupqonpnsov{xxws~p{oxowpvpuouovnvovpvrurwpzn~oqqqqqqqqqq}q}q~qp}n{mxmtmpnnnrnwn{n{o{p}p~p}o}o~nnmmzmvmrmqmqmoiybZ[ab`cjmqrsssrrstuvusrv}x~vbNXb~b}c|bzax`w`w`xa{cgif}bw\v`ugwgwexexdxeygzhzkzn|n}n}pr|qrqprqssvxw|y~y~x|s~lhhhihgefilnnnmnnfenvpeaeiijjeS}?|89<>??w>|Hdrssrsrqnlllnopqqqppooooruutsuusrrrrsrrqq~p{pzoznzozpyqyqyqypzn|n{mylxmwmymzl{l{l}l~n~o~n}i{gzeydycxbxcxdxexfzgzg|f|f|i{k{m|o{pzpylymymymynwpwpxrtuvwxvuwwk~QuInFoJqStnyu}t}y~x{usrrrsuvwwvsmifksutu~~}||{{{{{|{x}x}||||||||||||||{{{{|}~}yt{xvzu|w|{|}}}}{{r{n{l}p~rv~v|t|wy{y|z{z{{}{yzq|vywwqvpvntlslsmsltltlskpknkmlonspwrxsxsxtxtxsvsusurtrtqtqtqtqsprororptut|vx~|}}yv~u{szrxqxrxsztzvzxzxzxzxyxxxxxwxvxvxvwwvwvwvwvwwxxyyzyzys|vwyzzzxvvut~u{xyzxyvxsxqxownwoxpvtwxwpwowowrxvxtwtuststttutvuxu|u~v|zx~wwvutttytqsqrptqvvwzy~|~~|}|||{|z|w|t|p}tz|w{w|{}|}}~~~~{y}~{yyyxwtrs~r~X}9{;{>}Tpmu{~~~~~||}|wuwyx{{{|}~~~~}~~|{|}~}wov~~~~~~~}zsx}}~}{|~~~~~qhu{|}|zwu{}}}||}}}|}}||}~~}|||}}yx}~~~|xvx{|{|zrkty|{{{|}~~ysuwrknuz}t[aigrwwy|~}}}~~}yrpousnry|~~~{y|~}mTLKUajklnqponptwyysqqrux{yzzy{y|zz|xwvussssstttuuuuu~u}u}u}u~u~uvvvvvvvvvvvvvvvvvwxyyyyyxxxxxwwvvuvvwwwwwvvvvvuuvvvvvvvvwxxx~y~y~z~z~z}z}y}y~yx~x~x}y|y|y{yzyxyxyxyxyzzyzxzvzvyvyuxwvyv{v{u|u|t}s|r|q}o|mylxlzmwmxn{n~no~pzqvrssptouwutttsrrr}s~ts~q~p~q~r}r}r}r}r}r}r{q{q{pzp{p|n{nzoyo{o{q|rzryrxruqrqqsov{xxvsq|pzpxpvququpvowo{q}r~r~r~qqqqqpppqppppqqp}n{nymvnsnpnqouozp|p|q}p}p|p|o}onnn|nxntnqnwmyi~_Y`cb`empqppponpruwwvtstvxoXV~^{^z_x_v`v`vawb|cdhig~dzewfvcv`vawbwcxcxbxbxezj|l|n}p~q}qqpnpnrpvvw{y~x~w~rliiijjihhjklmmmnogejrqjefjlljgYyEs<};>@@}>wAVostrrrrqnmmmoqrr~r~q~p~p~poooqtttrttsrqrrrrr~q{qxpupvpwpxpzpzq{q{pzpyo{nzmylxkxkxkxmxlxkzij~k}k|hzezdycybybxcxdxfxhzizj{h|f|h{i{j{l{nzrytysynylylymwoxq|stvwxvvwxs]wIpFpGqOslys|s}u|tztssrstvwxxwtng^gsvrw~}|{{{{{{|{x~y||||||||||||||{{{{}}}}{x}{v{w|{||}}||v{pzo{n}p}s~wv}t}x{|z{{x{yz~y|yuyw|xrwmunultlsmsltltltlrlokmkmknmqouqxrxsxswsvsususurtqtptqtqtpsoroqnqnstt{xz|~yvs}szqwnulumtovrwtxvxwxxyxyxyxxxxxwxwxwwwvwvwvwwwxwzyzzz{xs|vxyz{zzxwvt}u|wzxxwvwrwpwnxnxnwowsvywuzqyoxrzw|v|vyvvuuututvuxwzx|yz|x~wwvuttt{trsqqorouswzy~{~~|~|}}|}{|y{v{r|uy}v}v~z~{~}~~~~}}zxxwwvutuy{~`}9|5{9|Sxzz}~~~~~~}{y{|zyzzy{|||}~~~~~~~~~~}}~~{uqy~~~~~|wz~}~~|{|~~}~nixz{|{yvuz|y{}{z{|}}~}|~~~~~~~~}}}~~|z{}~|||}~~}}~}~|ywy|{~|j^lw|}}||||}}}}{ywvrnltz|s_`baiooopu|}|||}}|{zzxvtqos|~}{vstxqVRam`Yafjmpqrstvz{uosuvywzv|u~u~w}y{{y~xvtssssttttuuu~u}u}u}u}v}v}v~w~wwwvvvvvvvvvvvvwxxyyyyyxxxxxwwwvuuvvvvvvvuuuuuvvwwwwwvvwwx~x}x}y|z|z|z{z|z}zyxxxyx~x}x|x{xyxxywxxyxyxy{y{yyyvyvwvwywzv{v}u~t~s|r|q{ozn{n}n|o|o}o~n~n{oypxrwsutqtytutttsrtuvus~p~q~r}s}r}r|r}r}r|q{q{pzpzpzoypxqxqyp{q{qxryt{uzrvqttsw~xvts|qzqypxpvququpuowozp|p}q~qqppooooppppoonn}nzmymvmynynxoxpupxq{r|q{q{p{p|p}oooo}ozoworo}mi_]d~dbbjrsqnm}j~g~e}jpuww}vutqrup`\}^y^v^v_wazf|g~fffhhg~eycw`v^v^v`wbwbwaw^x_xdzj|l~m}n~p~ptoponqoutvzy}x~vpkjklllkjjkllkloonihjpqoliknmjgX{Ex>AB@?u>vE^nopqqqrqonnnpqrqr~q~p~p~pponpsssrtssrrrrrr~qyqypvpupuouovpxq{q}p|pzoxoynymymxlxkwkwlvmumwi{i|j|jziygzgzexdwcyc{dzgyjzozp|j|g|j{l|k|i{i{jzlznzlzi{jzkymxoyq|suvwvuvyxd}IrErGtPsjyu|t}n{o|orrstuvwxxwvpfYaryqv~||{{{{{{|{y{|||||}}}}}}}}|{{{||}}||{|z|}|||||{{{s{q{n|o}t}v~zz~z~z||{x{w{uy}w}vwuwwwmvjumtltlsltltlslskqkojmjmkomqoupwrxrwsvsusususururuptqtqsprornqmpmqosvy{}ywwu{tysxpumsmsotqurvrwswtxvxyyyyyyyyyxxwwvuwuwvwwwxw{w|y{xxr|u~wyz{z{zxvu~t}u{uyvvvrvownwnwnvovpuyuyztzpys{w~x{}zxwuvstsvvx{y}z|y~xwvvvuutztrrpqnqntqvyy~|~~}}}{}{|{{{{yyvxvwutwxzz~~y~zyyxwursx~~k}B}9|?}^}~~}~~~~~~~|z{||{|{y{||}}~}}~~~~~zuu{~~~{|~~}{|~~~yx{{|||zxxz||~}ywwyz{|~}|~~~~~~~}}|{{~}xwxy{}}|z~|~}}~z{~}zz{m^nw{}~~}{z{{|||{xuvvqv|~ytpnkhgjmjinuyyxxxz|z}~|vttnglxprwqjjqvgfrqdZ^`glqwvspqswtnvzzzv{u}s~tu~v}x{{y}w~utsssttttuuuu~u~u~v~w}w~x~x~x~xwwwvvvvvvvvvvwxxyyyyyyxxxxxwwwvuuuuuuuuuuuuvwwwwwwwwwww~w~w~x}x|y{yzzzz{z|z}zyxxxxwxx}x}y|yzyyyxyyxyxyyxyxywxuwtwuwyw|v}u~t|s{ryq{p|pppooo}ozoypyqysxtwtztttssrstvxwtqp~q}r}q}q}q}r|r|q{p{ozoyoxpxpxpwpyp{pzqxrytzx{twruswwyvt~s{ryqxqwpvpuquounultntnuovoxoyp|poonnooo|oyo{n{mxltkpknkrlvm|mo{pvqwr{r{rzqypzp|p}pooo~o|o{ozo|m~h``~b~bcho~uuspm|jydwbvh~mtvvutsrqsnb~]z]w]u_wayf|iiiggggg~eycw^u\v^v`waxbwav^yayg{k|l|lnpoznrnmonsswxy|x}uplklllmmlkklkilokfgfkprutnmn~njfW|@}?CCA?v?wG\mnnmnqqqpnnooqqqqq~q~p~p~p~onpqq~r~sssrrqrrrr|qvpwpvpuountouovpzp~o|oyownxoxnxmxlxlwlvmtmslslukwdyhzm{m|k{gxfxg{f|d{fzjylzj{f{f|k}p~s}r|n|izgzg{h{g|g{izkynxpzr~tvwvvwxvf|InFmLpRrjxv}u|q|p~pqrtuvwwwxwwrhW]oxqv~~||{{{{{{{{z||||||}}}}}}}}|||||||||||}|||||{{{y{s{s{o|n~r~v{{z~z}{|x{wzuy{u|twsvptmtktltltltlsltkskrjpjmimjmkomroupxqxrwsvsuststsusurtqtpspsornqmplolplqrzvxwx~v|vzuxswqwqupuosotpupvuw{x}y{zzzyzyyxwwuuvuwuwvwxvzv}x|vvpzt}uyzzzzywuts~s|sytuuqupwnvnuouovruwtxvuwsyt{xy}~{zywwuurwxzzz}y}wvvvvvu~uyssrqqpqpsrvwy||~}~~}~|~{|{{{{|z}w{u{tsstqtux~~~sw{|{ywsrsz}t~S~K}_~t~~~~~~~~~~}~~~~~|{{}}|}{y{{|}~~}}~~~~~{uw{~~~}~~~~~||~}|||}}}{yy{}}~}zxvxyy{}~~}}~~}}~~}|{||~}}|yxxz{||{z~{}~~}|~}{zzompw{}~~}{yyyz{zzyx{}{{|}zwuspmknuwtqqroqsw|{y~~zzsU~CI~_~IHbqqqrtsy{ug\]`gmsywrnnptsox{|zv|u}sstv~x|zz|x}v~uttttuttuuuuuuvwxx~x}x~xxwwvvvvvvvvwwwwxyyyyyyxxxxxxxwwvuuuuuuuuuuvwwwwxww~w~w~w~w~v~v~ww~x}x|y|y{y|z{z{z}zyxwwwwwwx~x|x{xzxywxxwxwxxxwxuxsxrxuwxw{v|uzuysxszr}rrqpppp|p|p|p|r}s~t~tssrrrstxz{x~sp~p}r|q|q|r|r|r{qzpzoyoxpwpwpwoyozo{ozpxryu{{}vzswrwv}vt|szryrxrxqxoxowpvnulrjojnkolpmrnsntouozooooo|oxntmtlukqjmiiigiiimjtl}oqzrxs{r{ryqxpzp}p~poooo~o~o~n~lidc_]fn~ryv~wvus}mrfsduhwlzrtussrtspid}b{ayaye{i}nomkhhghg~eybw]u]v^x`xaxaxaxczi|op}kwi{mnmmsllnlrpuxx|w}t~qlkmmnonmlkkkhkkc^~_~ajprttqoom~jdS==CCA?u@xJ_kllklpqqpoonooppppqq~qppooo~qqssrqqqqqr~qzqtpupupuouotnuovpzq|p{owovowowownwmwmvmtlskrkqltlvixcyc{j|q}mynzq~q~p}pynwn|m~j~h~h~h}k|n{m{jzg{e|f}f~g}g|izlynxq{rtuvvwxvkRpKiMlWrlyw}v}s}rrssuwwwvwwxxtl[\ktqu}~||{{{{{{|{{||||||}}}}}}}}||||||||||||}}}||{zxzszt{p|o}t~vywxx~z{yyyxyx|wzsvntlrkrjrksksktksksjripinimimjmkpmtowpyqyqxswsustrusututtrtornrmqlpkojniohnmytywv}v}u{tztytysxqwouqvuv{w}w}wzxyyyyyyxxwuustttvuvvvwuzu~w{supxt|vyzzyyyxvtqp}pzrutrvpwnuntptqussvqxqwtuxt{x~z~}}{zyuvsxy{{{{y|wvvvwwv}uwtsrqqpqpsruvy{|}}~}}|~|}||||}z~wsqqqsnpruz|~uy}{ytrqz}rtfe~r~z~~}||}~~~~~~|}~|{|~}{{{||~~~}~~|~|xy|}|z{~~~zuty~~~~|}~~~~~~}|}~}|}~~||~~~~~~}}~~}}~}|{|}|{yyy{{||{{}~~}|zyvvx{}~~}{zyxyyyzzz{{|~}{zzwvtttuvyyxvpjlqv{|wv|}~zrZ<69G~?:Idsvvtr{zsicdlru{xrnmnonqz||zw|u~s~s~t~v}x{yzzy{w}vuuuutttuttuuuvwwww~w~w~wwvvvvvvvvwwwwwxyz~z~zyyyxxxxxxxwvvvvvuuuuuuvwwwxx~x~w~w~w~w~wvvvvww~x~x}y}y|y{y{y|y~xwwvwvvww~w}w|xzwywywywxxwyuysysysxswuvwwvwuuvuxt{s~srpqqqq~q|q}r~ss~s~rqqpqrtx|~~|}v}q}p|r{q{q{r{rzrzqyqypxpwpvpwpxn{m|m}n|oysyuzz|vzswrwu~xu|szqyqypypyoxowownukrjmikjkkllonsoyoxpxp{o~ooo}nymwlwkwiqhlhihihihhilkyn~q~s{s|s{ryqypzp}p~pooooo~o~m~ljiib`hqt~vvvwt~qlmljslgmmpxqqq}q|r}ttqml~m}m|n}qrsrolhghigezbv^u^v_xayaxaxd{iosjz[iexnomktlmmlqotxw|v~tolkl~m~noomlkkjiib[}[yXyX{a~inqqqqqokh\K?>AA@uCxQdlllkloqqpoonoooopqqqqq~q~qpoqqrrq~p~p~p~p|q{q{qypuptotouovnvnvovpyqzqypvpupvovowovnvntnslrjqjqmwp~j|dzfxnxsyq{q|t~v}y{zwyuw|vtplf}d{h{hzhzg{g|f}g~g~f}h{jznypzq~stuvwwvteyTnImYsmzv}utssttvwwwwwxxyxshafoqv}~||{{{{{{{|||||||||}}}}}}}||||||||||||}}}|{zyzyvyvzr{o|s}{~}~z~y~w}x{yx}t{x{yxqumslsjsjsjrjsisiriqhpfogmgminknmqovpzp{qzqyrxsvrurtruvuwtssormqlpkoinhmgmeklxv{}w}t~s}s|s{s{u{vzwyxwzw|v|vyvvvuvwvwvvuvtuqsqsrsttuuuwtyt}tyrtpws{vyzzzyyxvtpl~o{svvrwpwovnupsqtttvsxswuuwtzv}x~|~~~||zvxszz||}|wzwy~wvvwvv|uvtrrpqpqqrruuyz|}}~~}}|~|~|}|}}zxsppqsmpqux~xx~z~~}{wuuzzmusrqruwxz{{|||~~|{|~|~|~}~}{{||}~~}}~||{yy|zy~uy|}xqlq|}}}~~}~}|}~}~~~~~~}}}~}|{zzy{{|}||~~~~~~||||}~~~|zyxxxyyyz{{{xyyxyzyxxxz~{xxzzmakrx}{vtwx|xrbD3138~59Xongeeknsvsmkt{{|ytppssprz|{zv|t}s}u}w|x{yzzyyyzx{v}v~vuuuuuutttuuvvvvvvvvvvvvvvvvvwwwwxyz~{}{}{}z~z~z~y~y~yyxxxxwvvvvvvvvvvvwwwxx~w}w}w~w~w~wwvvvvvwwxx~x|y{y{y|y}xxwxwvvvvw~x|w|w|v|v{wyxvxtytysxswtwtxtytwuvwtyt|s~rqqrssrrrssr~q}p}p~pqrty~}|y|r{p{rzqzqzqzqyrxqxqxqwqvpvpwozn|l}l}m|nyqxsxxxtvqusxvyw~s{pynynzo{ozownumskojljkjjkjlonvo}pqq}p~oo~n}n}m}l}j{iqhlhjgigihiimkun|qs}s|s|rzqzp{p|p}p}o~o~o~o}o|n|lllmmjjmruvtrsszrlp`ovnhokpyppp~p}p}rqpppq~rstssrqnjiijhf|cw^t^vaxdydyayf|osnZlF\_sqrkiwjqmmpnsyv}u|s~okkllmnnnmljjih]NzNvUxZz_|d~lpoorrokkl~g~P@?@AvKy]immlkkoqqpoonooooppqq~r}t|t|t~sssrsqq~p}q|p{pypupypxovovnuntmumvmvovpvqwrwrvqvpwpvowovountnrmqnqnsqytg|k~suvkwutyrys}s{v{{x|ty|wvsog~c{ezfzfzfzf{f|f}f}f}g{i{m{q|r}rstuwwvyt_vJp[tmzu~stttuuvwwwvwxxyywqkjnrw|~||{{{{{{{||||{||||}}}}}}}||||||||||||}}}|zx~x|xyxxytzq|r}{~~~}~z}y|y|yy{r{yzywmrmuqvpulrkqirgrgqgqfpdodlfmjolqmtowp{q}q|qzrxswruqtqurtstprnqlpkoinhmglekaikuy}y|u}q~p~q}q|s|u|x{}zx}wxvqvovovpurursrrrprororprrrsssusyszt{qwpxs{rvyzzxyywvojp|wxysyqwovnupsqtttvvxvxwvxuzu|v|{}|}z{xyw|}~~z}s{tz|xwvvv~v{uutqsprprqtruuyz||}~~~~~}}|}z|z|z{{{}xtpprsoqqtvuu~v~{}zyxwwpvsqoqtvx{~~~~~~~|}~}~~~}{{{|}~~~~~}||}}~}|zzz~}~x}s~qx}~|yuqt{}}~~}}~~{}}~~}}}}~|}~~|~~}}~}~~~||}|{zy{{|}}|~~}}~}{zyxxxyyz{{z|{xwwxyz{{{{zyyy{w~_~M~_~fgpwuooqywwrN5346:G\cXT_ga^gnqqtz~}|zwssxxsryzzzu|t|t|w|y{{z{xzxyxyxzx|w}v~vuuuuuutsttuuuuuuvvvvuvvvvwwwxxxxy~z}{||{|{{|{}{}z}z~z~yyyxxwwwvvvvvvvvvwwwww~w}w}w~x~xxx~wwwvvvvwww~x|x{y{z|y}y~x~ywvuuvw~x}w~v~v~u~v|wzwwxuxuxuxvwvxwxwwwuvtzt{s}qqrsttsssssrq|p|p|p~qruz}{{y|s{qzryqzp{pypwqtqtqtqtqvqwqyo|m~m~m}m{nyqyqvrqqkomnsnxozo{nymymznzn{o{owntlokmkkkkkklgmknyoqqq~pon~n}n~m{lwjrioininhmimimjpltnzp|r}r|r|r|r|q{pypyp{o|o|o}o|o{n|l~kmnoopqrrssssus{plounnopp|pqppo~ooonmllklnqqppomllje~`x\u\u`wfyexcxh|qr^tIZ?WUmj}lih~lznspnswv|t|plkkkllmnmmllkjii_|NxPwXx_z_z]|jrnqsplmt|hFBADwTyhpqpnmlnqppoonoooooppqr~t|u|u|t}s~rrrpp~p|pzpynxlumwqxrxjwivkukwlvmxnwpwqwrvsvrvqvqwpwovounsorororpqoyn|kyszuz_xqv|twr{q{r|xyywy{xvsske}d|dzezdydze{e|e|g|i|l|p|s~s~ttuuvww{vg{Lq]to{v~tuuuvvwvvvuvwxyyyurmprx|}||{{{{{{{||||{{{{|||||||||||||||}}}|}~~~{zw~v}w|x{yyzs|t}z}~}}}|}{|y}zz|s|zzywrurwwzvulrjqiqfpepepfofn`jgmjolrnuoyp}q~q}q{ryswruruqupuptnslqkojnimhlekci^girz{x}s}ono~p}r}u|x{{zxwtvnvkvjvlvnuotoroppoqopopopppqrrtrwrws}qxqqq|lpxyxwxzyvpmv}zz{tzqxovntpsrsutyvzwxxwyvyvzvz{xu~u|zz}|w~r|szyywvvu|uxtssprprprptqvvzz|}}~}~||z{xyuvttsstsxr{pprstopqstr~n~s|}zusssvuttvxz|}~~}}|}||~}~~~}zx|{y|}|}}}}|{z{||}~|{{~z~r~qt~z}}{zwwy|yy{zyz}}~~~~}||}}~~|z}~~~}}|{}~~~~~~}{zz{|}}{y{{|||{}~~~}}}~|z{zyyz||}}{yyzxvtttuvxyyyxyzy~f|F|;}J}Y}Y~bpwrpsyvvn~E}4~9~<=CQXQIVndVZekotwz|}|yxvuxzutzzyyv{u{v{yz|y}x|xzxyxyxyy{x|w}wvvvuuttsssttuuuuuvvvvvwwwxxxyyyyy~z}||}z}z|{||||{|{}{~z~zyyxxwwwwwwwwwwwwwwwww~w~wxxx~x~x~x~wwvvvvvvw~x}y|z{z{z|y|y~xwvv~v~w}x|w}v~v~v~v~v|v{wywxwxwwvxvzt|t|u}t}t|s}rrstuutttttsq}q{q|r~rsv{}{{y|s|r{rzq{p}o|oypvquqxqzq|q}q}ponn~n|nyoxouoonpmulskvkxjxkxkylynznzozoxntmnljljlnmpmqmunzo~qq~q~pon~n}m|lxkqjojoipiqjqjqjqkrlunxp{q|q|r|r}r}q{pwpvpxo{o{o{ozn{m{k~l~n~q~tzu{u~usppq~qzrrqonznuoxqqrqpo~l{kzn|nqplhlopoo}q}q~qppmg~bz\vZu_wdwdwfzm~upXmEWB[Rmb|fhkppxpnrtu|rmjkkkllmnmmmlkjjkjdY{PxQxWxX{amkptpn~px~pMABGyZzovvuqpnoqoonmnooooopooprt~t}q}o~npmko~p|pzoyjwgufujwjzezdyfvgyiyl|n{qxrwsvtvsvsvrxqwpvouosorototnunwlzs|yyuxgwtywvttxrzp~t}w{x|yxuwrje}f{dycxdydyd{e|i}m}p~s~uuvuttvwwzwmSs_to{vvvvvvwwwwvvvwxyyzxusttx|~||{{{{{{{{|||||||||||||||||||||||}}}}~~~{yvv~w~x~yzx|t|y|}}|~|}|{~{{|x||{|xyxy{{|wwksjqhodnancmendm\gemkqnuoxozp}pp}p|rzsxsvsvsvruqtoslqjnimhmhlejbh^fiozyv~qnno~q}r}t|vyvwvurupunvmwmwnvouosnqoopnpnpnpnpopprququr|qyqto}kltwvvwxxwtw{~}|}x{sxoumsosrsvuzv{wxywyvywyxw~sno}}|~zw}y{}zwuu~tytutrsprprprotqwvzz{|{}z|xztwqsopmmklkkljrknrstpoprrro~u|~{vpqty{||z{|~~}||||}~~{y|xty}{z|{{{{zyyz|}~~{xx~w~v~v{}||zyy~|~yxzywx{}}}{{|}~~~~~~}||}|zz|}|{{{zyxy{|}~}|||~~}zxy{|}}{z{|||{z{|||||}~~|{}||}}~~|yxwurqnlkmoprtvxyyo|X{E{E{J|P~h~u{zxxyutq^I?OUSRMK~YkqaYXYgmpsx{||zzxwxxuu{{zxwywyxy|y~xx}x{xyyyyyyzy{x|x~wwwvuutttttttuuuvvvvww~w~w~xxyyyyyzz~{}}|~z~z~z}z}{||||{}{~{~zyyyxxwwwwwwwwwwwwwwwwwxxx~y}y}y}x}x~w~vvvvvvwx~y|z{{z{zz}y~xww~w}w}w|v|v|w}w}v~v~u}v|v{vyvxuxtxsxt|t~t}s}s~sstuuuvuuvutr~r}r}sstx}}|}y~t}r|q|p}o~o~nzovovo{oppqqqppo}n{nxmwltkskukukvjwiwjwkxmynyoyoxownsmnmkmlmpnxo~oo|pq~r}q}pp~o~n}m|lwkpjniniqirjsktktlultnvpyq|r{r|r}r}q{qxpvownynynznzm{l{k~l~os}vzxvyzyusqp}ozn~omonn|n~qrrrrpn|nzo{n}l}i}l~qrqpoo}o|q|r|s~sqm~i{^wZu^vcwdxj|sumRiBWLe\xcimnoo|pqrtu|rmkijklllllmmmkihhikh]}PzOyY{bhkqrooqsojVGDI{_|txwusrpoonnmmnnooopponpqrrniknhgn}p{p{m{iwct_s`ubyaz`x`tbwexj{nzqxsvtutusvswrwqwpvounsnrorpxq|rtrxuzw}wx~yxytw{v{t}rruw~yxwwvrkh}f{dydzezf|i}n~rsuvwwvttvwxxvs`vdvo|vvvvwwwwwwwwwwxyyyxxwwvx{~|z{{z{{{{{{|||||||||}}}}|||||||||||}}}~~{yvv~wwyy}{{{}{~||~|}|{}{z|y{{z}x}x|{}~v|hsgpdl_j_j_jal`lWdcmksmwozo|p}p~p}p|r{sytwtvsvsvqunslqhnflflfkci`g_fenvxs~ooopq}r|s{uxuvustssuqvpwpwpvpupsoqoopnpmomomonpnqospsqxqzpzn}nmrxvuvwwvx|~}}z|uxpvntqtttxt{v{xxywyvyxy|vng~j~z}}~}~|yz||z~wvu|tvtstqsprpqorotqvvyzz{x{uzrwptnqlmklilgjegmhnruuqnprsuw~z~}~{vuv~t~v~x~z~{~{}~~~~}}}|}~~}}|rpw|yy|{zzzxwwy{|}}}}~}zww{zz{}}}{||~}~}{ywxzzzyyxy|~~}~~~~}}||}~{xy|~}||||{zyyz|}|{zz|~~|zxxy{{{{{}}~~}|{{{{{{}~~}||}~|zzzxtqkecdinoqtwyxx}n|W|E|H}W~lox}||zutvrVKjzvk^arzumeY[jqopvyzz{}{xupmpz}|w|w}w~www~w}x{xyyyyyzzy{y{x|x}wwwvvutttttuuuuvvvvw~w}w}x}x}y~yyyyyz{~|}}{}z}z}y~y~y}z}{|||||}{}z~zzzyyxxwwwwwwwwwwwwwwxxy~y}z|z|z}y}x~wwvvvvvwy~{|{z{y{{z|y}x}x|x|x}x|w{vzw{w|v~vuu}u}u|uzvzuuttuwuxuwuwtys{s~tuvuvuvwuuussttuy|}}}~x~s}q}q}p}o|nzmtmompmvn}opqrrrrqo{nxlvkvjujujujvjviuiukvmwoxowovotnpnononpouopqrs~s~r~r}qq~q~o~m}lwjoimhnhqiqjrksksltmtotqwqzr{r|r}r}q|qypxownymzm{m|l}k|k}l}o|r|vzyxyzwuutq~n|n~mlmqonqrrrrrqp}l{i{j|j}pvvtspoop|rzt{u~trn}axWu^udwfzn~vumWlF[Rkb}d|j~nkhilxsws|pnkhgjjkkkllljgc{bzdze{f}f~e|c{RyVz_~ejpllmljghbQCH}d~uxusrqnlmmmnnnnoopqrrq~q~qpojhlmhhm}n{n}j|ex]sXpVq\vby^u[r_vbvgxlxpvrususutvswswrvpvnumtnrprrvvyuyz}~zsuwy}xwusruvxxwwwtpk~g{ezczd{i~os~tuvwwvroruwxvtxi~jzp~uvvwwwwwwwwwwxxyyyyyyzxw{~~zyzzz{{{{{{||||||||}}}}}|||{{{{{{{{|}}~~{yvvwwxxzzz{{}|z~{}||zzzx}w~w~z|~v}hufp`iVdVcZf]i^jUcblkvmynzn|o}o~o~p|q{rzsxswtxtxqvntkqgmcjbiah^g[f\edooxm~oppqq~q|r{sxsvstsusvrwrxrwrvruqsqqpopnomnlnlnkokpmroqpuqwqj|ljltutuvwvy|~~~~{|wyqwpvtuxt{s{tzxxywywz{y}wmc~e}t|}{~{{{z{w|x{zz|y}w~vzuttrsqsqrpqorotqvvyzw{syrwpwotnqmnlnloilfhqinrusppprty}~~|~|~{~y~s~q~s~v~y~{|}~~~~~~~}~~||zqqx{vx~{zzywuuux{~|y|}~}|}}}}|}}}}~~~~zwvxyxxyzyz{~~|zz{~~}{{|{||{wvx|~~|~~}|{|}|{yxwx{}|zwvvxxyz|~}|{zz{{{|}~~~}}}}~~|}~~}{|}{wtne^^jssosxxwyy~i}S}d~srnz~}|zyxymqz|xx{{z|o\ahjjltwxyywusplefr}}vvvvv~w}w{xyxyyxyyyyyyyzy{x|w~wwvvuttuuuv~v~v~vvvvw~w}w|x{x{y|y|y}y~y~y~y~z~{}||~{~z}y~y~xxx~z}{|||||}{}{~{}z~zyyyxxwwvvvwvwwwwwxxy}y|z|{|z}z}y~xwwwvvuvxy~z}z{{zz{y{x|x|x|x|x|x{wzwyxzw|w~v~uu~t~t}t}u{uzvwwuvtuquttwt{t~u~uvvvvvvvutuuuux|~~}w}r|p|p}o~n{mylrlnlmlsmzoqqrsssrp|owmvlwkviuiuiuiuititkvmyozovotnqnonrnxo{p~qsstssttttt~q~n|kvjmikimipiqkrkrlsmsntotqvryr{r}r~r~q}q{pzozn{m{m}m|l}k}j}k|nzq|u|xzw|usutro~ppsjmnorrrqrrrpgzezk|p}tutttrono}q{s{t}usq~eyWu\uexj{rvupg{RhZpaw[pg|heeci}p{p|l~mmkiiijkkkklif}dzbxcxbyczcycze{\{X{\~cgjjjihfefkdGI~guwutsrnklmmnqonn~o~qrrs~s~s~qomihllijl}l|j~f|aw\sTnRn\tax^sZq^v`vdwiwovpurusvsvsvsvrvpuntmsnspqsttxw{wyzwwvywvussuvwxxxwusl}fzdycyczkuvuuvwvqifmtwwwvwplzpvvvwwwwwwwwwwxxyyyyyzzywz}}zxyyz{|||||||||||||}}}}||||{{{{{{{||}~~~{xvuww~ww~wxyy{}|}}|~}{{zy{w|v}u}{|~xp{fo\fI_M_TcYg\gVc_kmzl{m{n{n|n|n}o~p}q|rysyvyvyswovjqdl_h\eYdTcQdWepsuyopppq~p}p{pzqwrusurvswtxtxtxtwswsurpqnpnomnlmkminiokqmqntpvpe|icbptsuvvwyy~{|~~|}zzvxtxxw}u}qzsvwzzyzy{}z~xngd}o{xx{wzwxwwwvxxxzx}xx|wtuqsprpqoqorpvtxxy|u{pyoxowotnplonssxrugnwlnrsspopruy|~~~~~~~|~|~}~y~r~p~r~v~z{|}}}~~~~~~~}{|zss{ztx|yzywtssw{~|y{}~~~~}}}}}~}~~~}}}}~}xrvwxyyy{~~~}}|zxx~~}{z{|||{ztrw|~|zyy{|}}}{yxwwy}}{{xusvxy{}~~}{zz{|||||}~}{yyy{}~|yvy{|}|{|zxvpjdclurqt|w{~}~z~u~{~}}zwvw{{y{~}zvtvwyywonplijtvwvurooljiemu}{uuuuv}w{wyxxxxyxyyyyyyzzzzy{w}wwvvutuuu~v~v}v}v}v~vvvw~w|w{xzxzy{y{y{y|y|y|y|z|{|}{}z}z}y}x~x~xw~y~z}{|||||}{}{|{{{|{|z|z|y|y~xwwwvvvwwwwwxx~y{z{{{|{{|z|y}y~x~xxwvuuvxx~x}y|y{yzyzy{x{x|x|x|w|w{w{wwvxv{vvuttu~u~w{yxxvwvutustwtzu|u~v~vvvv~vvvuuuuux|~|u|pyo{n}n}m|mzlulqkmknmwnprsttsrq|pwnvmxlxjvjtjsjsjqjrltnvowotnrmomnnrnwo|qrtuvtuuvvvv~s}p{ltjljhikjnjplrlrmsmunvowqwrxr{r}r~r~q~q}p}p}n}n~nm~lk~j}kznxr{uwurptutssrmdsssrrrrqssog|f{m}s}urkiiilopp~q}r~utr~mzYuYugyp}uuspq_t]sUjYmg}a~bha]ij~cc~dhlljjjjkjjihge}f|e|c{azb{dzcy[yZ{chiiggggghqtROowwvvwvoklmnrupnn~o~qrsstvrkikmmkijkk~hd{^uZqQkPlZt_x\q\q_w_vbwfwkunupurvsvsvsvquounumsosqqspupurvwx{xwwxwvvtssuvxxxwwvk}ezdyeybylwvvvvuvngdkrvwwwwsn}rwwvwwwwwwwwwwxxyyyyyzzzxz}}{yyyz{|||||||||||}}}}}}||||{{{{{{||}~~~~{xvvvv~v|v{v}wwx{||~|~z{yxwvvuwtyv{w{}u~jqXd?[G[O`UdYeVc^jo}m|n{o{pypyp|oo~p}q{r{u{x{uyrxlrck\gXdUcNbIcPftuzwq|o}oopo}p{qyrwsutusvtwvxuxtwswsxrvrsqopoomnlmkminiojrkslwlwod{i`^lsttvwxwv~w~y~}}}~|z{yz|z~xr|rww{zz{{|~{wrni}ozuuxtxswswsvswuxvzwxwyvrtqrpqoqpsrxwzzy}t{oyowovosopnoqtx|y{ot{oorrspnoprsux}~~~~{~y~y~z~w~r~q~t~x~{|}|yy{}}||~}{|}}~~~}~~{y{sv|z{ywsrpty}}{}~~|||}}~~~~~~|{{yuwwxz}}||{|}~~}|{{|}{wu~}|yz|}}|{ypox{}}|||~~~}{yyyy|~~||{yvsuxz|~~|{{{|}}}}||~~}|zyxz|}}{wsuw{||zyxwxwwsoq~xuuvzsx|~|{{}{vomqxxtu{~zupotuvxxyyvqrzzvsssqlflnghmsuuuv}v{wywxwwwwxxxyyyyyzyzyzzx|w}w~v~v~u~u~u~v}v}w|w|v|v|v}v~v~w~w}w|w{wzxzxzxzxzx{y{y{y|z|{||{}{}{}z}y~y~xwxy~z}{}||}|}|||{|z|z{z{zzzz{y}xxxwwvwwwwwx~y|zz{y|y|z|{{{z|y}x~xxxwvvvvwww~w}x}y}y}x}w}w}w~w~v~v}v{vzvxwwvzu|t~tutv~w{wzwyvztztztyt{u|u}u}u}u}u~vvv~uttttx||t|oynzm|m|m}l|m{lwkqkoluo}qrsssrr~q{pvpunxmxkvkskrkrlrmrntpwpwotnqlnllmmmpospxr~tvuttvwwxw~u~q~myknjgjiklkpmsmsmsnuoypzqyrzr{r}s~r~q~qpponnm}l~k}k|lxovr}uvto}l}qttttq~h|h}yxvrrqqqrroji~n~r~usoke`afkmoqqrq~mzbv\vk{u}vrqpsh{WoJbauk_enfV`b^ZX_lomljkllkjihhihc~`}a}c|f{dz`zb|f~g~hffggihjlVVv}yxxwwqlkmqvxronnopqqsurjhllkjijjihf~_uYpOiNjYs]vZp]qaw`vbwdwgvltotrusvtvsvquptntmtntrtwsuprmsnzzz}wvwxwuusrrsuwwwvwwh}d{h{k{dxmxxwzwzvuupheiouwwwwuptxxwwwxwwwwwwwxxyyyyyzzzxz||{zzz{|||}}}}||||}}~~~~~}}}}{{{{{||}~~{xvuu~u~u|u|v~u|uwyy~y|x{uxuwruptqttsxt{zx~qtXd;XDXLZR_XaUb[hm|k{l{pytutrsvq~nno}p}t}w}x{uxlrbjYfTcPcJbDcJhnvyuqyn}nnoo}p{qyrvtuuvuwuxuyuxtwsvswrwswruqponnmmkminiojrlql|gzlh~mdanquuyyxxw~v~x~{~{~{}}||~z~ztrzv{y{||~|yutp~r{twvtwtwrvqvqustttvyww{wvtsrpqpqrttxy}|y}t{oypwouoropomts|{}|zy}spqrsqopokgdmx~~{~x~w~v~w~v~s~q~t~x|}~{uty|}~}|zzzzzzyz|}~~~~~~{v~x}zxzyyvtsw{~}|~~}{|}}~}~}}|{yw{{u{}}|zzzyxxy{~|y|{xz~~~}{zqowz|}~~~~|{}}|||}}{{{{|}}|{{{zxyz{}~~}||~~~~}||~~}{{{}~}}}|zwssty{zxvuvwxzzwvvqpsztnnx~|{}zxxzzxvtstqiks||wtvvusru{}|zy|}ztsuvm^bptqlgu~u~v|v{vywxwwwwwwwxxyyyyyzxzyzzy{x|w}v}v}v}u}v|w|w{wzxzw{w{w|w}w}w~w~w}v|w{w{w{xzxzxzx{x{y|y|z}|||{|{|z}z~y~yxxyz~{}|}||||||||{|{|{|z{y{yzzy|y~xwwvvvwwwx}z{{z{x|w|x|y|{{|z~y~xxxxwvvvwvvvwwwvvvvvvvvv~vzvwvvvvuxtzu}t~uu{uvwrvyu|tysytzt{t|t{t|t|t~uu~u~u~tsssw|~~}~t}n{m{lzlzl|m|m|mzlvktlun{q~ss~r~q~q}q|qyqupuownwlulslrnrosptqxr{q{pwosmoklliminjqprytvtrptwxyxwtp|mtlnlnlpmunvnvosoupyp{qzr{r|s}s~s~rqpppon~l|j|k|m|nzpysvwuo{iym}suutq}nzs|~~xuqqqqqqqpmnp|r|uusrnhec`bekoppf~jzcyp}v~sooqrn}VoJceykeiomVU]\ZX_lqomjjlmllkffhhdabc}g{hycxawcze{ggggeii~ji_^v}yxxvvqmlnrwwsqpoopppqqnjjkkkjiiiiji`wXpLiMj[t\uZr^sbxcvcwbwdvjtntqurususustqsptnunssvxv|suur{xz{txtwt}tttsqqpqrtvvuvvff}n~q~hynxxxuxuv~tspichmtvvvwwuuwwwwwwwwwwwwwxxyyyyyzyyxz|{zyyz{||}}}}}||||}}~~~}}}|||{{{{||}~|yvuu~u~tt}w|w{x{{y|vztzqzqxowmvnvouswx|ytx]h=W@VFWLZP^O`Zfpykzm|tvxkzhwnr{nmmn~q~v}y|wzmqahVdNbIbCb@dLjnuttowm}mno~q}r{sxtvvvxvxxwyvytxtwtvtxsyszszqroonolommnkolrotp~h|m}nqomsowvz|zyyy~{~||{|{{~zwu}x|y||}~|zyuu~v{xwyvxtwruquqtssutwxxzyyurrpqpsswwz{~}z}v|qzpxpuprpoqmws}y|z}urrrrqoprj]Ucx~}~z~w~v~v~w~w~s~r~uy}{ut{~}|||{|{ywxz|||}}}|~|||}|{y~z}{zzy{yxvz}~~}|~{{{{{}}|}~}}}}|||{{|~yz{|~}yxywvvx{||{x{~}{{rry{|}||}}ywxyzzz{|{|}}}}}|{|}~}||}}}~}|}~~}}}}}~~|zz{}~}}|{zxuqqw{yvtrruwxxwupnnrwsmpy~zqow{zz||{y||yncckw}wqpopqqswz{{zz|{tsuvn_^n|xphu|u|vzvyvwwwwwwxwxwyxyxyyyyxyyyzy{y{x|w|v|v|v{w{wzwyxyxyxywzw{w|w}w~ww~w}w|w|w|w{w{w{x{x|x|y}y}{|{|{||{}{~z~yxxyz~{}|}|||||||||||}||{|z|z{yzzy|x}w~vvuvwwxy}y|z{{y{x{w|w|y{z{|z}yxxxwwvwwwvvvvvuuuuuv~v}w}w}v{vzuyuxvyuzs}rrs}s{vuuutttttvtyszszs{s|s|s}tu~t}t}s~rrrw}~|}|~t~n|mzlxkylymym{mzl|lzlumwp{r}r}q}p}p|pzqxqvpupunumsmrnrpsqurvryr|qzqwounpllmkmiohqjsvt}usqnrwww}w}vws|nwmtmvnxmyoyowpupwpyqyrxrys{s}s~srqppq~q~o}a{Y{gzn|prqsutozbw`|rutrqoxt{|v~t~qqqqrrrrrsszlxe{dmttumrp{gx_}ilmnln|g{s}v~pnprt}s}_sTmdykjhloaSY_\]`hopl~i}ijllkkc`efffe~e}ezdu^s^s`wd{fhkjg~g}g}j~kfenttvvusrqnotvutssqqprqomjjkllkjjkkknlcyUpKiMhZv\u\t_uaxcxcxbxcvitlsptrutuuustrrqsrupsswxxvy~{}x}stqrrzqpoommmoprssstrmlrqnowwxzytx{v~u~r~jcintwwvwwwvvwwwwwwwwwxxxxxxxyyyzyxxz{{zyyz{{|}}}}}|||||}}}}}|||||{{{||}~~}zvvv~u}uu~xzzy|}}{|yyzu{rzqyoxnwnvnupvvyy}v}en@Ud@g^lptsvryp}n~n~o}r|u{vxwwxwywywxxwxsxqwtxuytzsztxrtpqnpmpmonmpmtqvtu|u|u~uvuvntsx|zzzz{|{{{{z~yyw}y}y|{~~~}~}wtv~yzzyyvwtvrtqtrrssuvwxyzvwtrsrwtzy}}~~{~x|syrwosmpmospyt~x{{}xtrrqpoqvp^Sp~~~|~y~v~u~v~x~x~u~tvz}~|yz~}|}~}xuvy~~|||{~z~zz||z{|~}{x{|zw{~}}|~{~{~xvy|~}||}~}}|}|||||}|{{y{}}zwy{ywuw{~}~||}~|{|vtx{}}}}~~}zxvxxzz{||}~~~~}|{|~~}}}||~~~|{z|~~}}}}}}}{xy{|||{zyyvomxyxwsnmntzwrysnnoquy|~zroyxwwz{zy|}{sigiq{vmijmpptwyz{zyxuonpsqicizyuqu{uzvxvwvvwvwwwxwxwxxyxyxyyyyzyzy{y|y|w{v|v|v{w{wzwyxwxwxxxywzw{w}w~wwww~w~w~w}w|w|w|w}x}x~x~y}z}{}||}|}{~z~x~x~x~y~{}|}|||||||||||}}|||{{{{zz{y|x}wvuuvwwxx~y}z|zz{y{x{w|x|x{yzzy|x~x~xwwwwxxw~w~w~w~v~uttuuv}w|w|w|v|u|u{u{u{u|s}r~rr}r|txuxtuuqvsuvtxsyr{q|q}r}s~t~s~s}r|r~r~q~u~{|y|zw}q~n}mwltlxlzmzm|m}m~l{ksmsoxpyq{p|o}o|pypvquptpsoqopoqospuququqyqzqzqxqvpsnqoroqpnrosxt}t~ttrsvu|rxo|qr~qvmsmsmwmznzoxoxpypzqzryrwsxszt}s~srqq~p|q|q|q|e|V{f{p|stqsyxjz]t[|qutlg|ktoosus{r}qqqrssqi^TKH~HQ~b~qttgmvuxpswlyg|dfiml~r~spoqq|ryozfxbvh{n~kefno}\~R[b``dlpj|g|ikmkihU~FyL{Z|c~g~h}e{av[oWmZo_ud{instnh~g}g}i~hiklnppprvvqruvtqstssqponkijlmmllnnonomibwOlIeYt\u]v`wbxbwbxaxbwguksosrtsutvtvtstsvxsvuwxyxxxupznxozn~mml~l~m~m~nprsrqrpopusrqvwxzz}zy}y}v~ldkpuwwvwxwwwwvwwwwwwwxxxxxxxyyyyyxyzz{zyyz{|}}}}}|{{{|}~~~~}|||||{{{}}}~~~}y~uv~ww~x|x}{w|y~~}wx}zy|v{szqypxnwmuourwwzxksCX5V9R;R@TDVZW|^qpoxy^^~h{mv{qnmmn~q~u~||lpUeGaE`@bDgUllpsusxszr|o}n}o}s{vzwxywzwzwzwxwywswrvvwzyv{szuytxtuqrnpmnnkpkury|~}}{~ywvskiak|~|~z~}z{{{zzzzyzz~z}z~~yrtwyusvy}z|zzxwwturtqsqrsutwwzx{uuuqyu}z~}~}{~w|uxqtmqnpvs{u~xzz}xusqponqwxjd~~~|~y~v~t~u~w~y~xxxz}}~}}}~}|~}xtstwyz|}|{yyz}}|}~~{x}||z}~}{~{~{~{~xuy~{z|}~~|{|{{{{{{||{z|}x{|{{|{xwx|}}}~}{z{wv{|}}~~}{yz{{z{|}~~}||}~~~|{|}{ywxz|}}}}}||{|}|wsswz{{zyxyumkuuvsleenw}wnvwqommry}zttsqnpqstxwvxwplmwtjhlpnqwz{{|{ywqjeioqojittvxu{uzvxvwvwwwwxwxxwxxyyyyyzyzy{y{y|y|x|w|w|v}v}w|w|wzxyxxxyxywzw{w|w~w~wwwwwv~v~w~w~w~w~x~x~y~y~z{~|}}|}{}y}y}y}z}{}|||||||||||||}}}}|}{|{|z|y}w~wvuuvvwwxxy~z{zz{y{x|x|w|w{wzyy|x~xxwwxx~x~x}x}x}x}w}u~uttuv~w|w{v|v}v}v}u}u}u~s~r}r|r|r}t~ss|uwutvttusvq{o}p~q}s|s~r~r}r}r}r|q|q{pypwpwozo}o|nwmrmvmzm{n}n~nlzkrlpnunxp{p}p~p}pypvpuosoqonomonpspwqwpvpupvpvpwqvqvpxq|q}qyrys{t{t{u|v~urtsmzgzi~lyltjqlplsmwmxmunvoypzqzrzsytyt|t~tsrqq~p{p{p{q}l}W}e}t~wwusspg{cxb|qtrl|dziwnposq|q~q~q}q|p}meR>8;FR]h~p~t~x~w}hkmxrqvvtvpwm{llnnpqpqppq|n~j}j}knjbbi}nyczQR^`_ahlg}e}ghkjhi[}Gv;v@wLz\{f{hybuWmRiVl_th{pvzyuqmj~i~l~kjjjllmpvxttvvsposwwupmljijkllllmoqpnmmm[uEfTp[s^v`w`wawbxaxbxhvksnrprrutxsxsvuuxzvywwxwzxxzuyt~qnn}n}n~n~n}m}m}o|p}pstttrqonpuuusuvwzzys~|xngnsvxxwxxwwwwvwxxxxxxwwwwwwwxxxyxyzz{{zyyz{|}}}}}|{{{|}~~~~}|||||{{{|~~}|~|y~t~u}w|yy{p{y~x~z~{vy}|x|vzsxqxoxnvmupvuv{xpuIc3_6Y8RBO[gmpq|o|n{k{rzh{e`|fusxtvutvutzqonnnruspxynllnicbb^|PxH~NZ^__cgd}^}^ciihii|^xJx?v?sJsZwf|h{[rOhSj_sl{vz|{y{xr}q}t~q~qpmklnmqttvxvsnlqxzwrmkjjkjji~i~i~jl~nmmllmlRlRnXpZq\s^uavaw`wcwhwlsnqpssvsxszsyuxw}w}v{xsynxntrp}mmnoppq|q{rytxt{t~uvvvsqpoosuwvuvwyy|y{{}wqkruwxwwwwwwwwwwwwxxxxwwwwwxxyyxxyy{|||zyz{|}~}}}}|{{{|}~~~~}|||||||||}~~}|~~xs}u{yx{t~o~w~z~{~~~{z~}}{z}xyvtsuqwowmvoutr{ptrOk4h4^6Q9MBQW\}hypxy|wz}|z{wtpnmmnq}z|epHf>d=iSpntsxrxsyu{s{rynzm|p|syvxxwzvzv{v{uyuytvt|tutyvwzy~{{~xystqonhrjyu{z~|~{xvtttxobj}}y}yz|}|{~z~y~y~w~x~w|y~{u\[bjrtqsy}~}}|{{xytwrvqtrusww}zwywv{z~|~~}|~|yuvruttzu}uvww~vtrpnnqv{}|}~~~~z~w~x~x~{~{~{~yyyz{|||}~~~~~|zxywtpnmt}}|{~}}}|{z||{{||{z~|~~~~}~}{yvxy~{~||}|}|zwuwx{yzzy{|}}zuuwz{{|}~~}}|{{zz}}z|~|{}}{xwy}~~}|}~}~|zyyyz|}{zz}}}~}xtrsuuttttnebbfirusoopsqvwurnjedisz}~}sqywmcZaqvutuutsvwsrt{yux{xvw{|zzwph`]`gnrvuttv{vzvxvywywyxyywzwzw{x{y{z{zz{y|y{y{x{x{w|w}w~wvw}x{x{x{xzwzw{w|w}w~wwvvvvvvwwwwxxxxyyz{{~{|{|{|{}{}{}{|{|{|||||}|~|}{|{|{{{z|y}wuuuuuuuuvwx~y~z}z|{z|x|w{w{y{{z}yxwwx~x}y|z|z|z|zyzyx{w~u~t~t~t~v}w|w{w{w}x{xxxxvyt|s}r}r|s|s}r}ppps}sxqwl{l}m~o}r{rys|s}s~s}s{szrypwotmslumwpyqxpunvnwnyn|o~oonynrnsnvozo}ooo~o}o|pzpwpupsqspup{oxmplolsnwnxpxqzr|r~rrqq~r{syt{u}vrtqus~o{lzlwmvmrmqmqlrlslrmrnrospsqtrusxt{u~ut~s~s~s~r}q{ovouqys|h~_~x}vtrt~q}p~npqrrozmzlwmvrzr~r}qvnqiqEx6GZelprph}^y\z]xRrfrloaep}r|twtmuqtxs~onlmqurqyypmmmgdcaZyTxM|GPY^_cda}\~[bihhi~k}h|_{QvDr=q>sNw`{avRjQhbqo{x~}|zyvt~q}s}r~p~ppmmoonnrwy~y~xtnklp~p~okijjkjih}g|g|h}i|i}k}l~mnmmqbyUrRmTmXo]raubvawbwhxmtnqssrwqyoymzs|wwww}ytxtsxo}m~mpqsstzuvyrxtw{u~vwwwusqporuvvvvwyyyywrnsvwxwwwwwwwwwwwwxxxxvvvvwxxyyyxyz||}|zyz{|}~~}}||{{{|}~~~~}}|||||}}}}~}}}~}{~x{zv{q|p~s|w{zzz{{~z{~~}{|~zvypsqnuoynuotwqzmxp[q5e2\2S6O@RU_|u{wzy|y~{}{z}yvronmmp~z{apEg?hKlauqxsyrzu|w|uzrzn|n}q}qztyvxxw{v|u|u{tysyt|t~u~u{vxz{}}}z~wzssogsl|y}y}z}|~zxussturv|~}~z~yz~||yvvsvtwtvvvxw||~ugbfkqsorz~~~{}}|wyqvqwuvy|zw{xy||~~~~~}|||vyuwxv|u}uvyz~xurpnnsw{~}}}~~~}~z~w~x~y~|~}~|~z~xwyz|}}~~~~~}z{|}xrppt}~}|}}}~~}|{{{{||{{{{{~}~~~~}zywx~x~z~}~~~}~}xurtvwvwyy|}}||{ywvwxz{|~~}~}}|{|}}{{~~zy}|}~|vwx}~~~~~~}~~~}|||zyz}}~~~~~}ztssrqrsumb^_dgouxuomhltvtqpl`_ds|}~~zvwzunf\jzxrpprqquxwtsstvxyuqqvy{|zvobY[goywusovzvyvxvywxwxxxywzw{w{x{x{y{y{zz{y{yzyzxzx{w|w}w~w~w~x|x|x|x|x{x|x}w~wwwvvvvvvvwwwxxxyyxyyyyyyy~z~z~z}{}{}||||}|~|~{}{}z|{{|{|y}w}w~vvvvvvwxxyyz}{{{z|x|x|x{xzyyzx{w}w}x}x|y|y{z|z|z~z~y|x{v|u}u~t}u}u}v{wzxxyvzszrysvvtxs{r}s~s|r{p|n~npoymxizh|l|p}s~s|s|s}t}t|t{uzuytwqtpsntovqyqxpuounwnxo{p|p}po}ovnunwnyo|oppoo~p~p}q|q{q}p|p|nuloknkrmxnypzp{q|r|rrqpqs}u}uvwvyutr~pzornpnpnsntnumtmtntnuovouptqsrusyt|t|t|s|s|s|r{qzovouovqyn}\~sywvwsqorrnqsvus}ttr|pskj]k9uJ|jrsutpi~\yMvQvYvKsTtnsj~lutrpwqlrwq~polkj}lypys{v~s}q}q~omfccddxdsY{FFPY]_`_~^~agiiijl~lg}^yXvJt:s>sQubw^pXkcrmzs}utttpn}n|n|n|n}l~mnoqqpotz{~y~s~nki~i}j|l}l}j~h~jkkjh}g{gzf{f{fzf{g|j}pstssk^xUnQkTl[oasav`w`xj|pwntstuwuysyr{t}wxwwtxouxp~n|o|p~suwxx}xyzrzsyyx}xxxxwvtroosuwwvwxxxyxuqtvwxwwwwwwwwwwwwwxxxvvvvvxxyyywyz}}}|zyzz|}~~}|||{{{|}~~~~}}|||}}~}~~~}}}~}}tlo}q|vwzt{t{t{w{x}yyy}~u}lznsspznvovxtzj{oit@\2Z0Y3VWn~~~~{~w~v~x~{~|~~~~~~~~~|}{}z|w|v{v|y}z}v}k~otrhj~z}|}|~}~}~|~{}{}||~|}}}}}}}}}~~~}||||}}}~}~|~{zz{|}~~~~~}~|~{~~}}||||}|}|~}~}}}|}{}{}|}}}}}|}|}|}}~|~zyyyyyz{|~}~}~~~~}|zyxvu~v~y~z~|~~~~~}~}~~~~~~~~~~~~~~~~}}}}}}}}~}}~}~}}~~~~~~~~~~~~~~}~~~}}~}}}}|}{}||~}~zz|{~zz{|}~~~}|z|}}xwvwz|~}~}~{~z~z|}~}~}~}~~~~}}||{zzyxxxyyyyyz|~~~|zz|}~}~}~~~~}{{|~~~|{~}~|{xvwx{}~~~~~~~~~~~}||zyyyy{{||||}~~~{xwy~~trz}}}~~~{zxyxvqorvyzvrqsqkimsvtpmqxurrpm~r~x~zyzz{xvvwxyzz{{|}}~}}}}}|{{{zyyzyxyxxy}z{{x|u~tssuwy~{|}{zz~zz{{|~|~|}|~}}~|~|zxx~z~{|}}{wtrpmjltz|~{{{z~{~{~{~z~{~{~|}|}|||z}x~v~uuvvxy~z}}}~|~|~}~}~}~}~~}~|}}|}}|{yvtuy}~{yxussrv~z|||~|~}{~z~wvwx~x~x~yyyyzz~{~|}{}zvqljhlsutps~u}v|w|z{||}|~}~~|zxwx~z{zwwz~|z~w{~~}zutwv~uspr~x~y~vo~r}u|t}uzyvwrwt{xyvuz}yrx}~|z~|z{x|~|}yxxuyrzxz}z{{{}|{~zz{zoo{{}~~}~}~{ywv~w}~~}zy}|}|}~~~~~|}w|uuw~~}~~~~~}~x~{~~{z}~}}~}~~~}}}}}~~~}yvtyxtu|~~}~zwuutsswzxvusqqnjmw{{{xvtsqonmlllkkklorrpmjihgffehlnnptwxwtq~q~uz{xwxyyzzzyxwxwvvyz~{~{~{}v}m}h}l|s|v|w|x}y}}}~|}{{yxyvzv{x{{|||}{zzyxwwvvwxwtplfbdcbbbccba]URPLKOLLJILNQTXXSPMPU]djllljjlpssssstutsroliecbcfhkmnortvvxxyyz|~~|{{z|{yxxxwwutssuwxz}~~~}}}}|||}||~~|{{{|}~}}~|}}}~~{zzyzxyzyzqn~n~}~t~k~o~{~w~o~kxzpq|~~}~||||||~||}|~}~}jUkx~~y~w~x~{~}~}~~~~~}~}~{}|}||x|t{t|z|y|p|k}s}|zpj~s}z}y~{~}~}~{~{~{}|}}}~}}}}}}}~~~~}}~||||}}}~~|~zyzz{|}~~~~~~~}~}~}}|||~|z|z||}|}z}y}y}z}|}~}}}|}~}}~}~xwxxxyz{||~}~~~~|zyxxxy~{~z~{~~~~~~}~}~~~~~~~~~~~}~}}}}}}}}}}}}}~~~~~~~~}}}|~}}}}~}~|~|~|}}}zyzz~yz{}~~}}}~}zxxy{~|~|~{~{|}~~~~~~}~}~}~~~}}}|||{zyyxxxxxy{|}}|zxyz{~{~{~|~~}}~~|}}~~~~}xuuwz}~~~~~~}{}~~}|{|||||||}~~~{xwy||ww{}~~~~~}|{yyyxpgiqxyvssrmhcfknmbPQesrrqu{~{{zywuuwyzzz{{{||}}}}}|{{zzzyzzyxyyyxy~z{|x}vttuwz~||~{zz~z~{~{~|~|~|}}}}}}}~{ywsosuxuqomljiinu{}~|~{{{{~{~{~z~{~{~|}|||{}y~w~tsstwy{~}}~}~}~}~}~}~}}~}|||{{|{yvrnotz}}}}}|ywtqqr~v}z}{~{~y~wvvww~x~xxxxxyzz}z~zwsoliijknkmp}v||{~{~||}~}{yxxz{ywx{~}zv{~~}zvtvt~rqnow~y~v~o|lxsvsxrxzwzw{x~yyv}ty}zsw{~z~y}}{y{x|~|~yxytyrzxz}zz{~z|zz|x~y{zooz{|}~~~}zw~n~q~y{{y}{|}}}~~~~}~x}p|r}st~~}~}x~z~|{wvz|~~~~~}~}}}}~vqvxywqpvz||y|v}r~nosy||xsmhknhlv{{{ywutronmlllkkkkkmmlkihhhgfejsttrvxxuq}i}f}ny~yxxxxxyyxwwxwuw~z~|~|~|~|~y~r~m~o~u}z||||}|}|}}|}{z{v{r{p{r|u}x}{|{zyywvwwwuofa`begfdcdedb`]WTPNPRIHIKNOQRWVRPMQV_fklkkkloruttssttsrpmjgcaacfhlmnqtwxyzz{{|~~|{zyyxxwwwusrsuwwy|~~}|||||||||~}{{{{|}~}}}}~~{uuwxyuporqci~k~|~skh~n~h~g~ovjmv~~~}~}}}|{{||z|{~|~}yprv{|{x~y~y~|~~~~~~}~{}}|~|}|z{z||~|v|p|s|w~uvk}p}w~v~w~z~{zz~z~{}|}}}}|}}}~~~}~}}}|~|||}}}}~|zyzz{|}~~~~~~~~~}}|||}|{|{|}}|}z}y}y}z}{}}}|}|}}}~~z~x~xwxyzz{|}~~~~~~|zxwz{|~|~{~{~}~~~~~~~~~~~~~~~~~~}~}}}}}}}}}}}}}}~~~~~~~}~}~|~}}~||~|}}|~{{yxyz{~{|}}~~}}}~}{xxy{~{~{~|}}~~~~}|||}}}~}}}}}|{zzyxwxyyz{||zyxxz{z~z|~~~}{yy{~~~}~~yvvxz}~~~~}}~~}|z{}}}~~||}}~~~zxxyyvux{}}~~}{yxyzyyxxodhrwzyxwqhabnmgkeUFQmvqqv|{z|~}zvttwyz{z{zz{{||}}|{z{{zzxyzyxxzzyxy}zz|x~uuvwz~}|{z~z~{}{}|}||||||||||}|~zxuqoqrtsqonljihilrw}||~{{{{{zz~{~{~|||{}z~xuuuvxz{~|}}}~}~}~}~}}}}~|{{{zzzzzxuqnpsz}}~}|zvrortuy{zxvvww~xxxwwxxx~z~yxtqnkiihiggl~u|z|z{|{|}~}{yxxzzywy}~zu{~}}zwuvutspquvtp|qtvsswvz~{{zzy~v}uy}zuvz~x~y}}{{{{}~}~zwxtyszyz}zz~yxyxzx|u~z|znpz{|}}~~~|z~}}y}z}~~{|{}}}|z{~{|~{}}||||v|}}{}~yz{{xvvw~z~z~xy|~~~~~}|vko|}zuqopuvvtokp{~~zsnilpmpv{{{ywutrpnmlllllkihjjjihhiihggowyywxxwup|e|Z}c~t|{yxwwwwxxxxx~y~z}|}|}}}}~}~|{wtrt~z}~}}}}}~|~|}|||y|v|s|p}q}v~|}|zzyxwxvne_^_bghc_aceffc^\VSNNONHGJLPQQRTTRPORXagkkjklnruvvutstsrqnkhfa``cgjnmmquy{{|||}~~|zzyyxxwwvusrsuwwx{}~~}||||{{|||}}~|{zz{|}~}~}~|xspqvwpkdqq`mq{{xs~k~b~l~x}mimtz|||}~~||}|{|{}{}{~}{xuvz{{z~z~x~{~~~~}~{}}|||{|||||t|o|q}n~v~m}o}u~t~v~x~yxyy~z~{}}}~}|}}~~~}~|~}}}}~}}}}}~~}|{zzyzz}~~~~~~}~}}|}|}|||||}}}}}}|}{~z~z}{}{}z}z}}}|}z~w~x~y~yz{{{{{~|~}~~~}~|~zyxy{||~{~y~y~z~|~~~~~~~~~~~~~~~~}}~}~}}}}}}}}}}}~~~~~~~~~}~}~}~~}|}~|zxxwwx{~{~||||}~~}}||}}|zyyz{{~{~|}~~~}||||||~|}~~}|{{zzyxxyyyz{{yyxy{|||}~~~~~}zxxy~{}~}~~|yyz|~~~}|||{zyxxyy|~}}~~~~|{{zyusx{{||}{wsqtwyxwvphjrvz|{xsj~`~d~qlde[UXcprrpsvuw|}yvstwxz{zzzyyyz{||{zz{}|zxyzyyy{{zyy~z||y}w~w~w~x~z}||}{~{}{}{||||||{|{|{|{|{}{~zwtrqqrttsqomlkihims~y}||{{{{zzz~{}{||{}{~yvvvvxxyz~{~|~}~~}~}}}|~|{{zyxxxyzywsrosy}~}}~{vqmkpu{ywvvw~wxxwvwww~yyxvromjjijjjnu}w|v|x{}|}~~}zyyzzxwz~~zv{}}|zwvvvvurrrrsw~w|vrzw~{{x{xz{zyw}vy|zuxy~y}x|w{z|}~~{xytytzy{yz{yvxoyvyt{q}z~~znpz{|}}~~~|~x}{}|}{}}}~|}{}|}|~{~u}u|y|}||||}{|{zxwz~|~|~zz{zyxy|~x~q~zwz~}~~~~~}~|zrnu}~zusrtxwqqqns}~}~~yttwwyyy{|{{ywutrpnmlllmmkihhiihhhiihhjsyyyyyxwvq}i|_}lx~u~z~{ywwwxxyzz~z}{|}|}|||{|{}{~{~{zxuuy~~}}|~|{|~|}}y}x}v}t}t~w}}}{zyxxuja`aehheb`beeefheb_ZSOMMMKJJLMQRRQRRQPRW]cgjjjlnqtvwvutssrqoljgda`behlponrv{||||~}{zzyxxxwwvttssuvvwz|~~|||||{|||}}}|{zyz|}}}}~~zwvplstojjt|s}z{|~q~j~o~xwsqswwvvxxyy|~}}}|{|{}|}|~{~z~yvwz||z~y~x~{~~~}~{}||||||||{|n|k|j}m}o}p}p}r~u~w~w~wxyy~z~{~}}}}}}~}}~~}~{~{~|~~}}}~}~}~~~~~}{zyyz}~~~~~~~~}|}||{|{|||}}~}~}}}|~|~|~{~z~y}y}y}y~y~w~w~y~{~|~|}}||~|~{~z~w~u~u~v~xyz{|~|~|~y~x~y~z~}~~~~~~~~~~~~~}}}}}~~~~~}}}}}}}}~~~~~~~}|~}~~~}~zwuuwyz{~|~|{{{|}~}{zz{||{zzz{{{{~||}~~~}}|||{{||~}|{{{{{zyxyyyyzzzyz|}~}}~~~~}}}}|zxy{~~}}~~|{|~~|{{zzzxwvvwxy|}~~~~}{usx{{{{{zuqoquxxxvvrkovz}}|{~v~h~]~`~dc]RFRifgkrvvwz}~{xvtuvxz{{{zzyxy{||{yz||{zyyzzzy|~|{zyy}z{|z}y~y~z~{}{}||}|}{||{|{|{|z|z|z|z|z}z~yxvtssstuusqpnljhgjou~y}||~||{{zz~{~{}||}{~ywvvuvwwxxyz~|~}~}~}~|~{{zyxwwxyzzxwqnrw~}|~|~~{vrmiiktyxvvw~xyxwwvvv~vvtsqpnmkihghjort~u}z|~}~~|zyzywvy}}zw{|{{zwvvwwvttuuuz{}zw~zt|o{n{s{{ywwz|{vsvw~v}r|t}|~~~{zzvzu{v{wzuypysyyz{|z}~~znpz{|}~~~~{~w|{|~|||||z}z{zzozlzxz}{}||~|~{}}{wx~z}|}yy{{zyxy~{~r~sty}~~~}~|~{~zwty|zw~t~s~swzxstwt~tu~z~|~|{wtv{~~~~~}||ywutrpnmlllmmljhhhhgghijjkmuyyyzzxxxvs~ltyv~z}|~zyyyzz{|~|}}|}|||||z|z|y|y}{~{~}|zy{}}~}~|||~|}~y~vw~w~x~{|{zxurjdabfhhhfebbgkhggid_aZOMMMKKKKMNRSRQPPQRV[beefilnpsvvwvttrrpomjgebbbdhloqqqtx|}}||~~}|z{{yxxxvvuttssuvwxy{}~}|||||||}~}}}}|zyy{|}~}|~{{{leloopokzzqnw{~r}p}u}{~}|zxyukhkmmorvy}{|}}}}|~|~{~zxx{|{zy~y~{~~~}~{}z}|}}||||||s|k|h|i}k}o}r}u~u~w~x~yz{|~|~}~}}}}z}z~z~~~~~~~~~~~~}}~}|}|~~~~~|zxxy|~~~~~~~}}|}{|z|{||}~}~}~}}~}~}~|~{~z~y~x~y~y~x~v~x~{~}~~~~~~}~}~}~}~{~w~r~p~q~t~w~y~z~{~|~}~}~|~|~|~}~~~~~~~~~~~}}}}}~~~~}~}~~~~}}}}}}~~~~~~}}}}~|~}~~~}~{wvuwyz{|~|{zz{|~}~||{zzzzzyyz{||||||}}~~}~~}|{{||||{{{|}|{zyyyyyyzzz{}~~~}|{zzzzzyxy{~~}}~~~|{zzzzyxxyz{{|}}}}~~~~~vuz{{z{{zwsqprvxxwxtqsw{~~~~}~q~^~[~ce`]LCJOYfv~|}~~~~~}zxvvwwxz{{zzzyxxz||zyz{{yyyyzzyx~}}|zyxy~{}{|}|~{~{~{~{~|~|}{|z|z|z|z|y|y|y|z}z}z~zxvuttuvv~vutroligilpuw~z}}}~|{{z{~|}||}{~ywvuuuuuttvwy~{~|~}~|~|~{zyxwwwxz~{~|{vqotx|}||}}{xvrmggltvww~x~xyxwwwvu~srpoppqpnmkihhikoqu}z}}}~~|zy~ywvx|}~zw{|z{zxwvvvuu~wzz{z{z~{}{~l{j{k{q{zzxw{}|tnot~v}q|m~v~~~|}{z{w|x|x{uztz}{|}}|}{zopy{~|}}}~}}~}}~}|}y}y|}||||||~x|w{zywyvyyyyz||z~zyvy}}~|xxyyvtqjw~y~y~y{~~~~~}~{~z~|}|zwuu~u~t~u~{~|~y~r}q}v~x~u~q~v~z{{z~x}y}{~~~~~||}||zwutrpnmllmmmlkihgggghiklpw||{{zyxxyyxxzzx~{}|}{~{z{{{||~}}||}|{|z|{{{{z|{|}}}~~~|~||~|~}||||}~y~u~u}w}{|~zyvof\\bknmjebdgikllhgffaacWMNMLLLLMMNRTRPPPRTY]bcdgkoprtvvvutsqpnlifdbacfilqqrsuwz}}}|}~~~}||{{zzzzyxxwvvuttttuwxyz{{}~}{||||}~~}}}~~}{yy{|||~{~|~}n]bfjoqgxy~okvz~s~v}z}~}}~x~sstqkf`]^eiov|}}~}}~}~|{zyz{{yy~y~{~~~~~~|~x~u~u~y}~||}}}{|y|o|h|e}h}m~t~x~x~x~y~{~|~}~~~~}~}~}~~x~v~t~w~z~|~}~~~~~~~~~}~{~|~}~}{yyz|~~~~~~~}~}}}}}}|{|{|z|{}~}~}}}}~}~}~}~|{yxy~z~z~{~}~~~~~~~~}~}~~~}}y}s}p}p~t~w~y~y~z}{}}}~}~}}}}~~~~~~~~~~~~}}}}}}}}~~~~}~}~~~}}}}}~~~~~~}~|~}~}~}~}~~}}}}ywuwyz{{~{{zz{|~}~}~}|zyyyyxxyz|}}}}}||}}~~~~~~~}~|~{||||||}~~~}|{{zyyyyzzz|}~~~}|yvuuvwxwxy|~}}~~~~~~~~~|{z{{{{{||}~|{|}}|}}}~~~vu{|{z{||zxurruwwtomquvz~~~~|~|~{~v~p~le`cR<9EZkv~~~~~}~{yxxyyz{{zz{{zyxy||zyzzxxxyzzzyx|~}{yyyz{~|}}{~{{{{~{}z|{|{}{}z|y|y|y|y|z}{~{{ywtssuw~xxwurpnlmmoqru~x~{}}|~{~{{~|~}}}|~zwvuttsrrrrstwy{{{~{~zzyyyxxx~z}{}|~{xww~y|}|~|~}~~{{ytoklpru~w}x}x~xxwxxwv~ttrrrsstutspmjgfjlp~u}y|}|~~~{~x}ywttw}{zw{|z{{xvvuvwz~}}{zzz~u|i{j{o|t|y{zx}u{~|rkkpv}t|p}w}~~|~||||}}}||{{{{|}}}}v|txpqy|}~|~|~|||||||}z}{|||||||~{}{|{{{z|z~yxwwx}|z|xx}{wxyytrpmq~q}x||~}|~}|}y}y{~zust~v}w~y~~}|z}p~lo~s~t~u~w~y~{~||~{~{|~vsw|||zxvtrponmmmmmmkihgggghikow}|~}|zyyyyz{{{{~|~|}}}}}|~}~}~}~|~|{~|}|||||{{y{y{y{{{~||||~}}}|}z|{{z{{}{}wyyxzz~|zti^\_ejjjjjihijklmlheda^bbSQPMKLMNNMNQSRQPPRUY^bdfkorstuvvuttrpomjgca_aeimpsttuxy{|}}|}}||{yyyyyyyyxxwvuuuuuuvwxyz{|||~}|||||}~~~~}}~}|zy{|||y}{}|~}s_bjikloz}w|~|~y~~~}~x~z~z~z~x~o~j~kopsnaTV\bhmx~}~~|~|{yxxzzyx~y~z{{}|{up~m~k~n~v}y}{}z}y}z}q}g}d}h~n~v~z~z~z~z~{~|~}~}}}~~z~t~q~t~xyzz{~}~}~|~{~|~}~~|zyz}~~~}}}|}|}~}~}|}|||z|z|z}z}z}|}|~}~}~}{zyy{~}~}~}~~~}~~~~~~~~~~~~}}|}v}p}p~t~x~y~y~y}z}|}}}~}~}}}}~~}~}~}~~~}}}}}}}}}}~~~~~~~~}}}}~~~~~~~}~|~}~}~}~~}~}}}~~{xvvxz{|~{~{{{{~|~~~~~~~zxxzx~vwyz{|}~~}}||~}~~~~~~~}~}~|~|}}}}~~~}}|{zzyyyy{|}}~}{vpoqtvwwxz}~~}~~~~~}}~~~~~~|||||||}}~~{|}{zyz{}~~}uv|}{z{}~}|zvtuwxtllrsuz~~}~xz~~}{plpdG9Hbtv{~~~~~~~~}|{{{{{{{zzz|}|{yz||{zzywwxy~zzzyx|~~|{zyyyz|~}|~{zzzz}{|{||||}{|z|z|z|z|{}|~}|{yvtsvx~zyxvsroonnnnpsv~y~{}}|~{~{{|}}|~zxvutsrqppooprsvxy{{zzyyyyyz~z}|}|}|~|~{~{|}}~}}}~~}}|~{~xrrpopr~t~u~u}v~w~x~y~z}y}y~x~uttutuuwvtpkigghjns}x{||~~}~y|zxqmp~wz~w{{x}|wvuvvy|}~{z{z}q|i{k|n|r|sr{wrz{sljl~q}t{v||}~}~|}}~}}}||}}}|}y|ywpqy~||~|~|~{{|{z{{|||||}|~|}||||{||{zywusqu{{xvy|{xx{ystzopr}u|~~}~|||{|w}x{}}~~}wv}x}z}|~~|||}r}m~kk~o~v~y~y}v}y~{{{|~}qks|}|zwutrponmmmmmmljihgghhjkqz~|}~}{zyyz{{|~|~{~}}}|~|}|~||}}}|}{~{~||{{{~{|{zzzz{z~zzzzz{~||{{{|zyyy{~u~jqy{u_UU]dlmkjkkkkkklkljgeb^^eWLTQLJLMONMNQSRRPORTZ^beinqstuuvuutsqomkhd`]]aflpstvvwz{|}}|{|{{zyxwwxxxxxxwwvuutuuvvwxxz{{||}}|||||~~~~}}}~}zy{|}|z||}}~}ypqrmllox|p~u}}}~~~|~z~y~x~r~k~k~hnqongbXZagfn{~~~}}}}{zxwyy{~x~w~xzz}|zjdcbcktxyxv~q~h~g~n~s~x~{~}~{~z~{~}~~}}}}~~|~z~v~u~wyzz{~|~|~{~{~|~|~}~~}~{~z~z~|~~~}}}}{}{}~}||~|||{|z|x}w}x}{}}~~~~{}||~}~|~}~|~|~|~}~}~~~~~}}|}x}s}o}p~t~x~y~y}y}z}|}|}}}~}}}}~~}~|~}~~}}}~}~}}}}}}}}~~~~~}}}~~~~~~~~~~~~~}~~}}}}}~|xvvxy||~|~||{{~|~}~~~~z~x~y~z~x~xwyz{{|~~~~}~|~|~~~~~~~}~|~|~}~}}~~~~~~~~}|{zzzz{|}~~{tnmquwwxy{}~~~~~~~~}|||}}~~}~~~}|||}}}~~~|}}{xwxy{}~~}xsu{}|{|}~~~~{wvwvromiksx}}~vw~~~}~~}||sX;Viqwz|}}}}||{||||{zzz|}}|{|}|{{{yxxxyyyyxw~{}~|{zzzzz|~}}~{zzzz~{|||}|}}}|||{|{|{||}}}~~}~}~|~y~w~v~x~z}{~zxvtrqqponmmoruy~{}||~|~||~}|~{ywutttsqonmmnnqsvy{{~{~{~{zzyyz~|}|}}}}}}}}|}~}~|~}}}|||||z}w~usqpop~q~q}r~u~v~x~z}z}z~z~z{{zxwwvtplkihgghkr}y{{}~~~{||yphis{{w|{x|{wvvwy{~~~}}~}u|k|g}h}l}lm|tqz{tolk~n|t|y|}~~~}|}|}}}}}}}}}}|}{}zwqrx}|{{{{{{{{{|||||}~~~}~|~|~|}|}|zxusqprtttsuwzzyx~u~qljksz}~}{y}z}{}z~{{|~|}|}z}w}x}z}||~||}~x{t{uu~t~p~k}i}m~swwxy{ynku~}|zwutrponmmmmmmljihgghjjmu~}}~||~}~~}{zzz{{~{}|}|}}}~|~|||{{|~}|}{~|}}|{zzyyyyyxyyyyzzzyxxxwwmbqxrcPQ\gmommmopppomjhhhfda\[XPRVQJILNPPOOQRRQPPSV\aeimpstuuuuutsrpmkiea][\ahnrtuwxxyz{||{z{zyxwuuuvwwwwvvuttstuvwwwxxy{{|}~}|||}~}}}~~{z{||}}}~|zzuqoks|n}n}}}}~{~x~y~x~w~l~j~s~omghljebbdhhgm{~~}~}~}}{yz}~~|zz}~{f`dbbhkruvy~y~u~t~u~w~z~}~}~|~y~{}}}~}}}}~~~|~y~w~wxyyy~z~{~{~|~|~|~}~}~{~y}y}z~~~}}~~~|}{}|}}||||{|x|u}t}x}{}~~~~~~|~z~x~x~y~z~z~{~|~~~~}~}w}r}o}n}p~t~x~z~{~{}|}}}}}}}~}}}}~}}~}~}~~}}}~}}}~}}}}}}}~~~~~~}~~~~~~~}~}~~~~~~}}}}}~|ywwxz|}}|{{{{}~~~~~~~z~z~|~}~z~yxyz{{|}~~~}~}~~~}~}~|~|~|~}~}~~~~~~~~~}}}}|{{{||~~ysruxyzz{|~~~}~~~}}|{z{|}~~|{{~|~|~}~~~}{ywwxz{}}|zwsqty{{{|~}~~~~~~}wwunknmehpqsx|~y{~~}}}~xgYqvvxz{|}}|||||}}||{zz|}~~~~}}|{zyxxxwvvv~}}~{{zzzzz|~}}~{zyzz|}~|~|~|~|~|}|}|}|}|~}~}~}~}~}~}}|||||||{~zyvtrqqpponmnprux~z}|}~}}~}}~|{ywvvvutrpommmoqtxz{{{{{zyyz{~{}{}||||}|}~}}~|}|}|||{{|z}x~vsqonmn~o~r~t~w~y}z}z}z~{|{zywvuspmmkigffimt}{|}~~}|~xpijqzyw{{x{zvuvwz{~~~~~}{|}|~r}g|b}c~gil|urz{tngg}l}t|y}~~|~z|y|z|{}}}}}}}~}|||}{wpqu}z{{{{{{{||~}}}}}}~}~|~|~{~{~{~{xwusuwwurqqrvz}{w~s~tmafos}~|xwz{{{zyx|w{q|s|z|||z}}}zwps{|~~}x}o}i}h~jnqqqtwwomw}|zwutrponmmmmmmljihghikntz~||}|~|~|}}|~zyz{~{~{}||||}|}|}|~|||{{{~{}|}|{{~z~z~yyxwvuvxxxxyxxwwwwvtiavtcSPYeonoprssrrrqnkjjigeb\TGJVOKHILOSSRQQRQPPQUY`eilprsttuuuutsrplifa]ZY\aioruvxxwwxxyywwwwwvusstuvvvvutttsstuvvwvwxyz{|}~}}}~~}}|z{||}}}}}~|{wuqhi}j|n}}}{}w}q}u}}~~~{~k~i~}~{m^cjlifdadjmkr}}~~{{|}{z|~~~~}}ytfcacfknrv~{~|~}~{~z~{~}~|~}~}}}}}}}~~~|~{~y~yyxxx~y~z~{~}~}~}~|~|~|}|}}}}}}}~}}~}~{}{}|}}}||~|{|x}v}w}z}~}~~~~~~~}~x~u~u~w~w~v~u~v~y~}~}}}v}o~k~l~o~svx~{~}}~}}}}}|}}}~}~}~}~}}~}~}~~~~}}~}~}}}}}}}}~~~~~~~~~~~{{~{~|~~~}}}}}~~~|zxxy{}}}|{{{{{|~}~}~{~{~}~}~|~{{{z{{|}~~~~~~}~~}~}}~|~{~{~|~}~}~~~~~~~~~~~~~~~}}}}}}|||||}~}yxyz{||}~~~}~}}}}}~~}zyyz{~}~~~|{zzzz{|{xuqnoswyyz}~~~~~}~}}zwxshdjkcfljioxz}~}}}}yuy{z{{|||||||{~z~yyyyyyz{|}~~~~~|{zxwxwvtts|~{{{zzzz{|}}|zyyyz~||~|||||||~|~||||||{{{{}||}{yvtrrrqponmllnptw~z~|~~}}~}}~|~{zyyyxwvutsrrrtwxzz{{{zzyyyzzz~z}z|{|}}}~}~|~|}||||{|z|y}w}v~spnno~p}s}u}v}x}x}z}z~{~{zzywuuttsrokgefghls~{}}|}~xqmmqzyw{{x{yusuyx|~~}~~~~}zwuvtm~g}f~i~ln~r{zs{zvqoj}j}o}y~~||v|t{t|w|{}}}}}~}}|z|z}zxpqt}x{{|||||}}}}~}}}}}~~|{zz~z~z~ywvwy~}xussuxyzy~x~w~yvpsrmy{yz{zyxvtv}r{k|q|z|||w~{{usy{}{~z}t}r~r~qpnmmlptuqpw~|zwutrqponmmmmmljihhijmqy}|{}||~||~}|}z~zz~{}|}|}||||||||||}|~|{~{~{}z~z~yywxxwuvuvytsrrrsuuvvxxwvwwxxtiavmWMT`lppoqtuusrrrponmkheb[PDCQEGHKNPUVTRQQQQRT[^dhloqrrstuvvutrqpmfa\YXX\`horuwwwsrspuutsstttsqqrstuuutssssrstuvvvwxyyz{|}~~~}}~}{{||z}y}}}~~{xutu~k{d}m|u~}}}z}x}y}|}~~~~q~mz~s^akrpe^Z\ksrt~y}}~zqsz~ztkeq~~~zy~xrfa\^_bfmp~w~|~}~|~z~{~|~|~~}}}}}}}}~~|~{~{~{{ywx~x~z~|~~~~z~{~}}}}}}}|}{}{~z}{}{}~}}}~}}}{}z}y}z}|}~~~~~~~~~|~y~u~u~v~v~s~p~o~p~t~x}z}v~o~i~j~mqux{~}~~}}}|}{}|}}}~}~}~~}~}~}~}~~~~}}}}}}~}}}}}~}~~~~~~~~~}~{zzy{{~{~|~~~~}}}}~~~~}}{yyy|}~}|zzzzz{|~}~~~|~|~~~~~}}||{|}~~~~~~}~}~~~~~~~|~z~z~{~|~|~}~}~}~}~}~}~|~|||||}}}}}}||||}~~}|||}}}~~~~~}}~~}zxwxz}~~~}|{{{|}|xsnmoruwx{~~~~}~}|zxxzwnhjiddiijouyz|~~}}}}{|~}~}|{||{{||{~z~w~u~uvwxxyz{|}~~}||{ywuuwvusqq{{{{zzzz{|}~{yxxy{}}|||||||||{{{{{{{{{{~|}}{~ywuttsrponlkjlnqtx~{~}~~~~~}~||||{{z{{zyyyyzzzzz{{zzyxxxxyyy~y}z}|}}~}~|}|~|}{|||{{z|x|w}u~rpopr}t}u}v}w}x}y}y}y~x~xxxwtzr{swvvtmgffffhms}y|~|}~ztqpryyw||y{xsrtyx|~}}}~}~{yvuuts~t~uwv~x}zz~w{zwx|p}k}q}{~~|{r{l{s|y|}|}}}}}|||y|z}zwqqs}w{}|}}}}~}}}}~~~~~}{zy~z~z~y~yxz|{zxvttvwssswv}urqrux~~}{zyywtrp|q|t|w|y|{|~~{wz||{z|v|r}u}o~osplk~pvxxuwy}}|zwutrqponmllmmljihhjlquy~y~x}~}}}}~}|~|~|}|}}}}}}||||||||{|{}{~|}{}z|y}w~wttryqrrqrtq~pqqpoopqsuvuuvwxythfj_QOZelmmoruvusssrqonljfb]WL@=JGFIMOQVXUTQQQSUZadiloqrrrsuvvvusqqpme]XWYY[`gnqtvwuojlgnooooqqrqpqrrrssssttttsttuvvvwxyxyz{|~~~}~~||||z}y}~~~}~{zplopn~j|u|~~{~u~w~y~~~~|~wrmplfbfqof^hlntqsu~vtmoz{wsdX[~y~|~tqlrvzp^YYW_iv~z~|~}~|~{~y~z~~}}}}}}}}~}{}{}{~{~|~~}zxx~w~x~{~~~~x~w~z}}}}}}{}y}y}z}|}}}}~|~|~|}{}z}|~~~|~{~|~}~}~}~}~|~~~~~|zy~z~{~y~y~v~n~l~m~q}u~v~r~k~i~kpvy{|~}}}}|~|~|~}~}~~~}}~}~~~~~}}}}}}}|}|}}}~~~~~~~~~~~}~|~{~z~{{{||~|~}~~~~~~}~~~}~}}}|zzz|}~}|{{{zz||~~~~~}~}~~~~~~}}||}~~~~~|~{~|~}~~~~|~z~z~{~{~{~|~}~}~}~|~|~|{{{{|}}}}}}|||||}~~~}}}}}}}}~~~~|{}~~~~|zwwz~}~~~~}}|{z}}vonnoqsuwz}~~~}~}{wwy{ztnmljhkptwyzz{~}}}}}|{{||~|~|{{{z{{~|~|~x~t~s~u~v~wwwwxy{|}|{zyxxwtrsuut~q}n}m{{{zzzz{{|}~{yxxz~{}}{{{{{{{{{{{{{||||{{|~}}}{~z}y}y~y~y~vsqomlklnpswz~}~~~~~~}~}}}}}}~~}}}}}}}|||{{zyxwvvvvvvw~y}{|{|}|}}}~}~|~|}{{z{y{w|u|s~sss}t}w|x|w}v}w}x}y}x}x~xxwvsxo|p~tstspkhfffgilp~w||{}~xutsyxw|~{|xrpryv|~}}{~z~zywvuvvy~{|{~~|yx|~zy{}v}x}|}}}|}{h{m{y|||||||~|||{|{}{wpqs}u|{|~}~~~~}}}}~~~~}|zy~z~{~{~{~z{{zyxwutuwwslnqsqmmrx||xqoquxxwtr}t}v|y{x{w{x|}}~}~z|y{w|w}x}p}e~i~ps~n~k~t{|{}~~|zwutrponmlllmlljihikoty~z}x}w}{}}}~}}~}}}~}}}~}}}}||{{{z{z{{{}{~y}y|v|u~qolopq}rfrguuvuqpnmlmnoqruwwyshd^TPT^gkllosuvuttsrpmkjf^UPKF?=GGGKOPQSUTRQRSUY_gjnprsssstuvvvuspppmdZUVXX[`flpsuvqjdhaghjkkmnpopqqqqrrrstuuttuuvvvvwxyxxxy{}~~~}~~}}}~~~~~~|yjbbg}q|q}x}ww~y~{~~~~|yvvpkhkqxshnzvprqrrqruqx~vkpohcn}z~zrdds~zdSQblny~z~{~|~{~z~y~z~~}}}}}}}}}}}}}z}y}{~~~~{yy~y~x~z~~~~x~v~y}|}}}~}|}x}v}w}y}{}|~}~|~{~{~z~z~{~~~~~~~{~z~y~x~w~v~uvwxy{x~{~z~t~p~q~v}x~y~x~s~m~lqvz|}~}}}}}~|~}~}~}~}~}}}}}~~~}}}~~~~}~}}~~~~~~~}~|~|~|~{~z~z~z{{||~|~}~~~~~~~~}}}}}|{{|}~}}}}}|{}}~~~~~|~|~~~~~}}||||}~~~~~}~{~{~|~~~}~|~z~{~{~|~|~}~}~}~}~}~}|||{|}}}}}~}||{{{{|}}||}}}}}}}~~~~~~{zz|~~~}}~}{wvz}|zzz~{~|||{ywsoifefinsuvz}~~~}}yvx~z{yuuxywsswz||{{{~}}|}~|{{{~|}|~|{{zz{~}~}~~|~x~u~u~u~u~ttuvxz{|{zxwvvtqpqrrr}p{kzizzzzzzz{{|~}|zzzz~||~{z{{{{{{{{|||}}}}|||}~}~}~|}|}}}}}~zvtrqppppqswz|~~~~~}~}}}~}}~~~~~~~~~~~~~~}~||||{zywutttttttvy}z||{~}}}}~}~|~||{{yzx{v{u|t|t|u|v|x|y|w}w~v}w}x}x}x~xxwvs~m~mpppqqolhhghgghmqy~{zyuxuw|~{}xqpqxu{~|}{}z}zzxvvww{|~}~|yv{yxz{{}}}}~~|u|~|||||||||~}}}|{vorv~w}z}|||}|~}}~}~}}}~~~~~|zz~z~{~|~}~|~z~w~www~vtstx}xmmqusqpqswzwibkrvz|{x|x|x{w{w{t{s{y|}}||z{x}u~q~g}i}j}i}j}k~n~w}~}|{|~}|ywusrpnmllllllkjiijmrw~||||x}w}x}y}z}{}|}~}}|||}|||{|z|y{y{{z~z~y}w|v|t}t~stxzwv~v|xvusrrpmihghlnsvvxsh^TNQXbillmpsuvuutspmifd_RD@@@A@FFHNQQOPQRRSTUX^djnqstttttuvvvutromnneXTUWW[`ekorttnd^f_abehijkmnoppqqqrrstuvvvvvvvvvwyzxwxyz{|~~}|~~~~~}{xqa_g~g~t}n}m~{|xzz~|~~~~}zxyxqcXgpajsi`hoqtuuuvpv{veqyssp~y}bV`nvoci{|z~z~y~z~z~z~y~z~~}}}}}}~}|}~}}}}z}y}z~|~|~{zy~|~y~x~{~{~|~y~w~w}y}{|}||||v|w}x}{~|}{zz~y~y~y~|~~~~~~}y}x}v}t}o~mmqwyyyvx~v~r~v~{}|}}~}~~~|~wssw{~~~}~}}}~|~|~|~|~|~|||}}}~~~~}~~~~~~~~~~~~~~}~|~|~{~|~|~}}}|~|~|~}~~~~~~~}}}}}}}}}~}~}~}~~}~~~~~~~~|~{~|~}~||||||}~~}~{~z~|~~~}~|~{~|~}~}~~~~~~~~~~~~~}}||}~~~~~~}|{zyyxyz{{{|}~~~}}}}}}}}}~~}zwuuz~~|}~}xvwz}~ztps~wyyyzwofca][`jswwz}~~~}xuwwwvtw}~~~~z~y~z~|~}~}~}}~}}~|||}|||~|}|~{{zzz{~}~~~}~}|}x}t}s~r~qrstuxz{zyxwvvtqnnnpp|nyixezzzzzz{{{{|~}}~|~|}||}{~{{~{~|}|}|~||{||}~}}{{|}~}}}|{{{|~}|~zwuuuwxxwvwxy{~}~~~}}|||||||}~}~}~}~~~}~}~}~}}}}|zywtsrrrrrrtvx}|{|~}}~}}~|}{|z{xzwzvzuzu{u{v|v|v{v}v~u~u~w~w~x~x~xwvtqqusqoppmmkjjkhfghmtxz|}~xxww~}}{|xrqrxv~z|||{|{}{yvuxyvxy~}yw{~yvyz{~}}}{|}~~}~}}}|||||}||}|}}{unu~|}{~|~||y{v{x~{~{||~}}~~~~~~|z|~z}w~{~{~{~x~s~r~t~v~u~rprvyytvuwxxxwvxxylelsuyz~||||||{{z{w{u{u{z|}}|~||~u~i~l}{{s{g{f|q}y~x~{~~}~x~rsz|zxvusqonmllllllkjijkpty}||||y|v|t|w|{|||~||{{|~|{}{}{}y|y|z{|zyz~z|z{y{y|x|xwwvwwvvutssrokhjghkqtvwsfYPPU]fjklmpsuvvutqlga][SD;;@BAFKFLQSPJJPXZZZ]afmqrtuuuuuvvutsrqoljjkcWRSVVZ_dgjnpokc\_[[_bdefgijklmooopqrsuvvvvwwwwwxyywvvyzyxvxy{||||}~~}|}yxusrtrqcfvhp~hequvn~w}z}}~~xwvugXdlfYbh]U]iknsvvtnsxrnmmpttv~~|]RQ_ktwry||~z~y~x~x~y~z~{~|~~~~~~~~~}{}w}t}u}y}{}{}y~x~z~{~{~{~{~y}w}v}v}x}y~y~y}x}z}||~|{}w}v}w~yzz~{~|}|}z}x~t~u}z}z}z}y}x}x}x|v|r|p}o~qy~~ztpts~n~u~y}{~|~}~~{ut|~{~z~z~{~{~{~z~z~{~{{{|}}~}~~~~~~~~~~~~~~~~~~~~~}~}~}~}~~~~~~~}~|~|~}~~~~~~~~~~~~}|||~|}|}|}|}|}}}}}}~~~~~}~~}~}}~{~z~z~|~{~zxy||z|}}||~z~z~|~}~}~}~~~~~~~~~~~~}}}~~~~~}}|{yyyyyxxyyzzz{}~~~|||{{{|}}yvutstwz|}}}}||}~~{pks{xvyzyvsswyyyz~xtsqdW_nv{}~~}~}xvumcempru}y~{~zy~{}z}{~|}~}}}}}}}{{{{zzzyyz{}|}}}~}~}~}|}w}r}p~r~srqqruvwxyxy{{tljjlm|iygxczyyyzzz{{{{{{{{{{{{|}~|zyz{~}|~|~}|zxwyz{}~}{zzz{}|{}xtssvy|~}}~}}~}~{~z~z~{{|{zzyxxxxxyz{~|~}~}~}~}~}}~}~}~|{{xtqrrqonmnnqx}}{}{}|}|}|}}|}{}z|y{xzvzuytzs{s|s}s}r~q~svz|z~x~wvutsrsrmoplmgisxrmljifdgox|~xy}~|{zwttvvx}z{{zy|{}|nhpvherzzuzyssv}ywsrsw{~~~}~}~}|x}u}v|{{~}rmw}|zyz{||||{~z}z~{yvy~~|xs~|}}|~zuqp~p~p}n}q|q|q}opstwyyyz{}~~~}tovwr{wqt{{{{{y{r{z{|{|||~}|}x}p{lxmxpxsxrxqztzw{w|y}x}s~n~k~ly{zvuusqomlkllmmmlkjlos~x{z|~}}{{{{{{zzzzzz{~|}|y}s}o}t|{z~yyyy~y{zzyyy{ywvvuvvwwvutslegjiijoruqbRQT[bfhijlortvutqm`WKHC:6@DDECJOGMQROJMS\`^\afjpsstuvvvvvutsqomljiih`VQRUVZ_dehkmmlg^\YZ_acddegijjlmmmnoqruuvvvwxwwxyyyxut}x}y~wvr~r|ux|z~{{{|~~}|{{{zprrsussrsjdqxz~ympp~v}z}|~~|uuvytiTV__bnfY]elpsrqrltvlmjgktvs~zoUTWiv{{wz}{~{~y~x~x~y~z~|}~~}}~}}~|~y}v}s}u}|}}}}}y}v~y~{~{~z~z~y}x}w}x}{}|~|~{}z}z}z}{|y}v}u}w~y{||~~}~}|}y~u~r~u~x~x}w}v}v}u}s|s|r}qtz}|xsgp{~|~y~{}|~}~~~~}xkp|y~x~x~y~z}|}{~{~{~{~{~zz{||~}~}~~~~~}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}~}~}~~~~~~~~~~}~}}|~|}|}|}{}|}|}}}}}~}~~~~~~}~}~}~}~|~{~|~|~|~|wx{zx{||{{~z~z~{~|~}~}~~~~~~~~~~~~~}~}}~~~~~~|{zyxxyz{{{zyyyz{~~~}~|{{{{{|~~{zyyxxyzyyz{{~||||}~{upprrsvz{{zy{zwtv~xxyztgfq~y}~~~}xz}o`^emqu~y|yvw~x}yz~}}~}}}}~~|{{{{zyyyyzz~|}}}~}~}~}}}y}u~t~v~wurppprtwyz{~{smkki~h}h{gzyyyzz{|||{{zzz{{{|}~|zxxx|}~|~}|zxvxyz|~}}|zz{{}|z}wtqsuwz~}}|}~}}~|~|~|{{zyxxwvvuuvwy{~|~}~}~}~}}~}~}~}|}{wutttrpnlkmsz||{}|}|}|}}|}|}{}z|x{w{vztzs{r|r|r}q~q~sty{zxxwvusrpnnqro~qqtyzsoqpnljhlt{{xy}~}|zwutuuw~y{zzz|}}xmlmpw}~zuz~xrp~p{qrrprx}}~}}}}|~{~{~}|q|p}u}}{~~qmw}|{w}swz|}|{{~{}{~zvqu|}zsj~r}}~{wtss~o~m}q|t|t}utwwxwwxz{{~u}o~lp{{tss{z{}|z{{{|{r{v{|||||~}{}x|ozew`wbxfypytzwzy{y{s|j}c}]}Z~]qzzwuusqomlkllmmmlkklo~szwzyzz|}|~{zzzzyyyyyyz{~|x}q}m}q|x{|{~zyyyz~z{y}xvtttuuvvuutsogchgghlptn_PRW]bdfhklorsutsnh[O@=;;4399696:MNKICFRAGHIJS_bkopqrttuvvvutsrnkhgedb``_`accca^YZdjgVY]gUO`^`bhnqpmk_fkhihhhjjllnopopqsvxwvvvy|z}|wsmoroooqqrtw{}~|z|}~~|~{~z{qb\cpxxxxwwwshuvvwxsxyz}}yyzzkgopu}{y{zwz|xrurqrwzzwvuy|ysoq~r~r~r~t~{~}|~}~}~~~}~z~y~x~x~z}~yxyz~z}y}y}x~wy{|{{z{~~~~|~}~zuuwy{{wtuuuvxyxwxwwuu~y}{}{}z~}~}|~{~z~z~{~{~u~n}l}p}u}y}z}y~x~v~x~}~~~{~{zzz{|~}~|~z~y~z~{~{~z~z~{~|~}~~~~~~~|~|~}~}~}~|~{~{~{{zyyxx~x~z~{~{~z~z~{~|zxyy{||~|~}}~~}}|{yx~w}u|s}s~qw}}~~~~~}}}}~}|~|~|~}~~~}}}{}}{yy{}}}~|~|~z~zz{{|{{zyxy{{{|}~~~~|zxvz~xrorx}}{z{~~~~|~{}{~~~~~{yy{|zz~~~~~|}~{~z||z{zu}omkkp~t}y}u}s~|~|ypqglqlyu{|y}xvvuvvvx~|~~}}}~{zzxvu~t~wxyyzzzz~z~{~{~{~|~|~z~v~s~s}w|{}~~|~yy{~{}xrkikp~x~}~}}z|w|w|y|{{|}~xtqqsuwy|}~|~|~|~|~{~|}||~ytpljlotxz{|{{{{{{{zxtqomlllouz}~~~~~~~~~~~~~~}zxutsqppqsuwyzzzzzywvvy||{xvuuwz|~}~}{ywvwwx~w~w~x~x~xxw}wzvzuztzsyryryrzrzrzp{n{m|m|n}mmnppusqrstq~q}mc`honosnjjklllmoonnmkklnmlkjknty|~~}|zz|vu}~wrtx{{}}|~r}f|f}hnv{||||||{{{{xwxzwv~wxww~z~|~}}~}}}|~}{zwpghrwwtr|gY`txxxxxvr~o}nqwzwts}i}b}f~gkoqsrnnt~w}n}_}q~v~v}t}u}y}~}}}|~|vzizdzzzzz{zo{j{c{g|s}x}u}q}r}t}w}z}{}|{zxvvwwvusqpoonnppno|ryvxz|zwuvxy{{|y||{}{}|x{rzqwtwzwwwvuuutssssstsb^jstojf`]^ZQKHD>8:FRZ^ehklllnnnjhaR=25:?@BavxxwwwxxzpU}K}N|\|lwxxuxyywuyw}|z~o~n}g{Wy_zm~rt~u}u|l|a|d|e}d}h}n}o}q|s{w{zz}y}y~yzzzrznzmzm|n{t{|{|~zvs~v~v}m|kyswwzp~n}nzpzv}|~|zxxxz{}|vwxuroihaUOSTSOZ_ZaWVUUVWZ\\YQH@=@CFHJHJGHGFGHA75=KPNPV_defgg`K:56>DGC=AKPQOMMR[OKHTXTOMPSaekmqjYMCITTX]ZY[VY_bcca^[[]_ba\crvcPLik_dR\[^ddZTTV[YYdzvrroijlfllmllopooqsuttttuvvwx{zxsrrsuvwxwvttsttvwvrssszszuxw{xzys{s}v~wy}{vpXY~tsspqr~s~v~s~i~emnnwuqootvoe_ajsvsjjqn]FBPZ^cjntxvpuq~ssrlommnoop~o}k}i}j}n~s~wz~|~~~~~}~y~w~v~xyzz{xvtw{~~}~z~v~r~tvxz{{zvuuvz{}{ywvuuuvxy|||||{{zywvxx~x~o~d~b}b~d~eefhlrw~z~{~{~{z~t~k~e~h~n~m}o}s~ttuwz{}|{{ywvuvy{||}zxxy{|||~{~zzzzzzzyyxwwvy{{{zz~z~z~y~y~y~x~x~y~y~x~w~wxwwvvuuwzzzz{|||{{{{|{|}~~}}}}{{|}~|}}|tpqty{~}y{}|xsrtx{|||}~~}{yxxvutuy}~~}}}vpzppoqltkkljjoaw[}_ip~t~x~zzz{{zu|}{~~~}~zyshimpuvxz{yyv~u}r}uy{wvz~}~y{uwuszs{xyvxuys}tts~x}}}}~~|yvutvz}}}{x{q{o|p}r~s~s~t}u|w|x|x|y|x}x~w}t{nwgqgjlemgmrjzlqvkykuiosjzl}p}t}s}lz~z~z~{}||}{~y~yyz~{}|}}}}~|{z~{~}|~{zz{|}~}}~}}}}~}~}}~}~|~|~}~}|{xwtrponmljimtz~~}~~~}}}|{{zzyxxvtrrrsuvuuvuuuttsstvxwrmklnoponnoswy~zxwvu}t|t|u~ttsrqppq~szszr{p~pqruvvvvvvvvvvutsrrrrrssspmllmnqsrqnjhimqqlihijjhinuz{{yy{||}s|}xomsqrqpqsttttuuwtwxyzzxxy{{z{~}}|z~y}t|q|m|n}p~sum[MFECNcs{xxxxxxyyyf~T}O{]|frxxuyyzuloquusskzYxbylsw~y|y{pzq{^|b|`|`{dzczbzczjzvzyy~x{xqzm{o|pqsx|}}zvq}p}tv~v}vxvwpxk{m|r|z|zz~~{yz|}~rrpmj`XVQJEGIIINRQYPONNNNONLHC>;;=CFFDBD>AAAAF@9@HNNMNU^efgfc]I614;BJHABKQTOLNPZQOMWXUOMOT`fllnfSHEOUP[_ZY]XZ_bcba_\]^__`hmqpeUSiiV\Z[]bdb[UTVVTWaxytrngikgkkkiklmlloqurrrsttuvvxyztrrqtvwxwwuuuuuusmlqtst~u{w~x|xvyr|p}vwz}}z~olwssrpoout~o~jnnnsrqoortnid^cimjeiloeLJZ_cltsvyuqussrrosnmkmo~u~u|m|k}j~n~s~wz|}~~~~~~}~{{z{|}ysruz~~~|~u~p~ruwz{yussuwz{|zwutsssu~v~w~z~z~{~{{zyxvttvy~{~t~jdabccdgpvz{~|~|{zxxlhpq~s~x~y~xvxyz{y{{zxvutx{|yvuutwzz||~|~z~y~z~yyyz|yxxwvz}}|{z~y~y~w~w~v~v~w~x~z~xvvxwwwwx{{|{|}}}}||{{{zzz|~}}}~}||}|{{|}~~~~{sllpwy|}}{{}~}{wsruy{{zz|~~|ywwvuuuy}~~|zzyv}swlxfwepgoduXyS}]m~u~v~wwwvxyysz|}~~~~udacluvxxx~v}wzuvqunxsy{xw{~{~p{ixpr}pt}z{|{z~y~x~x}{}}}}~~|ywutux{}|{yzrzp{r}s~s~r~r~s~t}v}x}y}y~y~y}uzltfjm_u]vdtrivdmqd|bzhrtjzk}n|p{o{jz}z}z}{|{|||}|}{~z~z~{}|}}}~~}~|~|}}}~|{zz{|~}}~}~}}}}~}}}}}|}|}|~}}|zwusqponnnmlov}}|~~~~~}}|{zyxxxwvtssstuvuuttsssssstuwvsolkmnonnmnqtx}y~xwvu}u{u{t|s|s}qqonoqst}s{q}pprtvvvuvvvvutsrqrqrrrssrpmlklnpqppnkklmppmkiiiihhkry|{yxy{~}t~||wplqy{wsrssttsuvwwwxxyxxwy||||}}|||{zy}s{jzd{h{l~ptukXW`gpwyxwxxxxxyyxvke{m|dswxuyzysfczl|qtknl{jzixkrw}y{zy}zt{[{Z|V{Xy^yZwVxRy`{rzyx}xrxjzi|m}orv{}}{qj}n|pvzwzvonugzi|r|}}u}ty{z|z{|{wuyxpe_^[QHGIFCEGHHKMNPPONONMKHEA@=:;=CEH><=<=@?>D@@JPNLMNU_egfd_RG6/17;EMKFKPUPLJMUTTW\\XNMOT_flll`RHHWSM\`XX\WY`ccba_]__acgnolki]Yi`YW][_dd`YUUUTSXau{vrlijjhiiigkjkjjmospppqrssttvwzutrpsuvwwwvvvvutqki|osstvzw~x{xxyrzp}wx{}}{zvuyut~sqopsq~p~mnnnpqpoostqklc^adbaijnj`ftgjsxxwvtttssqqksrmkkp~v~v}o}l}l~p~u~{~|~}~~~}~{~y~z|~zrqux~z~{~{~yrqsuw{zustwyzzzyuttrssu~v}w}x}y~y~zyzywuttvvwupjdcddfkuy{|}~|{zy}xtsux~z~x~vuxxxyz|{zxwutw|{vrqstuxy{~|~}~{~z~y~y~zz{|{{{zz{|||zyy~x~x~w~v}v}v}x}y~x~w~w~w~xxxxy{{||}~~}{{~z~z~z~z~zz|}}|||~}||||{{{}}~~}wnmmwyz|{||}{xwxz{{{{xvvy|}~}|ywwvvuvx{}~~|xxzxt|k{czavdvdyZ{V}f~z~|~y~ywvvwyyx{|}}~~ub][cswx|vxturqrnoknmnxsxzxwz~}w~f|fwvq`fw}}{|}{~z}z}|}|{}~|ywuttvy~{{{zwzuzv{v}u}s~r~rs~u~x~z~{~z~z}y}uzpowd~c{gwkgl_mrjzioojrhuhwjxkzk{jz}z}z}{|||}|}|}|}|}|}|}}}~}}~}~}~}~|{{z{~||}z~yyzz~|}|}}~|~|~|~}}|zwusqpoooonnqx}}|~~~}~}}}{zyxwwvuutuuvwwvtrrrrrrrrstvutqnkllnmmllnqu}x~yxwu~uzuyt{t{s}ssqnnprtu|s|poqsuvvuvwvvusrpoonnmmnopoonnnnnmmnnmnooonmkjihiihhnv}{xwwy{v~|{uomt|xtttuvuvxz{zyxxwxyzz{|{{zzzzyzy~s{iy_yazh~ktyusqxyxxxxwwxxxxxwxywurh}q}tuvzzyuopzptknoopnlwjp~r{tyzxzzv{e{W|PzVx`w[uVvRxYyi{zzy{yxxrzr~rst|x}~{l]drttuxurtlyl}t{|xuusntrxvr~kfejmh[RNLFBCFFEEGHILNPQQRSRQNKEA@>?@AACCE?68>CCB>CFLOPLILOW`ghfaXCD;1366@MSLKLRPIFJQY^ba_XJJNU^flojYOJLXRL_^UUWUYadcbbacedghhihdcfb]]ZWU]Z`hf^VVWUTXafoxzskmljihhhgmjkiiknqommnpqqqqtuyuvroqtuvvwvwxvvurlhxj{mq~s|wwxzxwxx{yt{~}~~~~}|zzzxwvyxtlhqqqnllonnqvurlrjded_[kiiihjlknuywsrttuuqppitwqklvu~s~q~q~r~v~z~~~~~|y~w~w~xz~|ustu~y~{~~~xsssvzyuuvz{{zwuuvwyxxv~w~w~v~u~vvwxxxwxxwvuttvodckptzz{|||zyyzxttwzzx~v~uxtsy~zyyxutw|{tmnsxurw{~~~|~{~z~{~}~|{|||||{|||{zyzz~|~{}x}v|u|v}v~w~x~y~x~xxxxxyyz|~}|{z~y~{~z~y~yz|{{yyz}|||{{{|}}~~}zqnjqxz{|~{{xrsz~}{xvvxz||{zyxxxwwww~y~zzxwywsi^~X~]~kj~e~q~~~~{~zxwwxz|~~}}}~{r`Z_pv}x|wxtromlhiegeimo{tvvwwxzzp|l|vwo[^m~{|~}~}}}~}|||}~|ywvvuux{||z{yzzzzy{w{u|r}r~s~t~w}y|z|z}z}z~x|wv{p}lziuihicnwrstdsfmdkelhrhyh{jz|z|{|||}|~|~|~|~|}|}|}}}~|~|}|||{{~{}|{~ywvvvwyz~{~|~|~|~}}|zxvtrpooopopsy~}||~~~}~~}}|zyxwvvvuuuvwwxwutrrqqqqqrrtuuspmkklmlkkmorw~yxvut|txtyuzu}urnmnortv~t|q}oqqstuuvwvutrpoonmmmmmnooppqpnlkknnnqsqnkjkkihijhgktxuppqsxw~|{unmt|xwvwxy||}}zyxxxz{zzzyyxwwxxyzzxv|m{a{\~htyzzyzyvwxxwwwwwwwwwwwtsp{pvlovzyywwyrsfyjorsrkvd}k|izhyxxyyyzuz[|P{YyixgvavZwSya|s}|{}zw}y|xvv|y}~}~{hW]noot}yvwvvzv|{z|tsylpqazex`XTTY\YOGCBAADHKIHIJLNPRSSSTSQMIC@>@BEEFFD?C96@HHGFGAFOOJDJQYbhhcZP=;74474:FTPIELNKILWaihb\QBGNU]flngTMLQWQRcbYQQSX`bbaa_]^cfea\[\ZUYZVUUW`\_if[WXWWZemlhnyunqnlkjijlpkljikmomkklnoponrsutxspprstuvuwxwvvtroxkxkyqzsxwuxwxtwvw}wzx{||}{}}~~}|{xtrxzxrqrrqomlmlfituokxuqrnf\gkedghimpsusruxxvtrmtntusor|xppq~v~{~~~~~~~}{x~x~yyz{}xvwyz{||vrrrtvutwx{|{ywuvxxyywu~v~v~t~sstuwxxz}~{yvtvwunlqxyzyzz{zyyyxwstvwxx~x~swwrz}xxyyvz}|{vonovxwz{~{~y~x~w~x~y~{~~~}||}}||||{zzz{{||~|~{}y|x}v~x~{~|~zyyxwvstxz}~}{zy~z~{~{~y~yyvssuwz~|{{{{{{|}}}}}{xtrjox{|}yxvpt|~}~}~|zxwxz{{{zyyyyyxus~s~uvvuwvskdchsstv~z~{~z~z~yxx~y~{~~}}}}~~~~|xsf_m{~z|yzwutmrfqao`mgqvwvssuw}wzwxy{y~tk\\f~y|}|}|~|||||}~|zxwxxxy{}}{}z|z{zzzwyuxszr|r|s{tzuyvywzw{x|x|y~z}yvxlujlleqnvnzgygqfogohuh{i{lz|{||{}{~{~{~{{|~|}}}}}~|~||||{{~{}|{}xutqqrtvxz{~|}|~}}|{ywusqpooppqty~}|{}~}}~}~}}|{zywwwwvuuuvwxyyxvtsqpppqqrrtsqmkjkllllllouyxvtsrzsyuzu}tplnpqstvt}r}qpoqrtuvuutsqpponnnnnnnopqssqnkjknooqrpliilljiijihinojffimsx|}{vpns{~}zwvwxz||{yxxwy~}zxyxvtstwxyyyvq~s|p|f~pxyyyyyyxyvuwxxyxxxwvuqoqtxjra|gowyyxwvxt|xwvwvmwg|n{m|kzxy|y}z}zd{U{\znyuxowbwPy_}p}z{}yw{}zxy{}~}~}xhY\glqvyy{w|y~xr~ivnqayJJJHGGILHE@??@BGMPMKKLNPSSTSRQNKGEB??BFHJJIEAD?==JLIFA7@EFB?JTZ_edYND:7656655>?@ADJPROMMNOQSSRPOMIDA@BACFILMMKHDEBD@HHD@:3:756?NZ]\\YNA;865677656CNI@ANW\bhf^UIE@AHMS\dkke_ZOSVRS^bZNMV[_`b`_^\YVVVSRRVWTRZ^]YV`YVZ\\]agkryytf^cuxtstsljmrrmnmlmkhgiiklklkjlnorqtqrqpopssuvwwvss{s}s}s~u}v{vywzw|vusrqqqsuy{}}|wowywuutpnqrsrnjilprruwxyum^Ziddkmrorstuwyxvtrrsxpknrw{~~z~u~posw~z~w~u~u~w~|~~~}|{zzz{zxxz{{ywttspnnpppowzywvvusrponoqrrqonquyywxzzyxwutqlkqtwzzz{{zzzzz{{{|~qho~xy|{qpxzyxzzyyxyyyyzyvxzu~o~l}k}p}q}s~v~{~|~{{{{{zzyyyz{|{y}w|~~~~{~xxzzyyxwwwwwxy{||{|||~{~{~{~{~yztkiqx~}yxy{{{{{{|{{yxwyzvqotyxyyvvvxzzyyyz{}~}{{~}~~z{{{ywuvwvutu~u~x~y~ywxxwuqp~vzy~y~x~w}x}{}|}{}z}|~}~|{{xusw{~{}z{xuwlgbv`oknxnlpuv~v}w~vvr}n|n|n{k{r{y}{~{~|~~||||{|}~}{zyz{|}~}}||{|z|y{xzvwtusurvpulnjlhmhpktovrxtxuytxuyw{zyxxsvpvounumwkwiwh{g|k~p{|{{|y}y~y~yz{{~}~~}~||{{z{{~{}{|}zwrnkjjloswz}||}~}~}|{zwtqoooooopsx{~~}}~~}~}~}~}}}||{{{zxwvtsqsy|}{xuspooooooprqnkjjklmlkijlpt|v{vtqpq}s{v|wtuvvuuuvtsr}p~oooqstssrqqqqqqpooqrrrrqpmnsqmnonkhhjlnmkjjjjjhgjig}a~ekimzy|xtsuyyusrsvyz{}}|{yxwxz~~~|y{{ywwxyyyywqjf~h~qtwyxxxxxxwpbfswxxwvtrpmi^wgym~rnjntvzzqfv}yyz}||uyn{ou~z~y|uzsy|ywzk{v{xzzzvzk{q{xzzx~w|~{{||~}}zrj~i~j}ortvz~yvq_LB@@>=>?BCA==>@CDEGKOPOMNOPQRRPKIGDA??BDGILNOOMOIFKLJH=87644108GUZZXVMB87655678665?FGCET`ff_OEGEA>?EKRZbimhc_RUYUS[cZOPY^]]``_ZY]^]YSQSWXWU\ab]ZbVQVX]ckrtwvtqkbcltwtrpmknssnonnmhffjjlljjiijlmposprpnnnqqsuvwvtttt~tv~v|vzv}vutrqmmmorvy{|}~|y{ytuxyzwwvvvsqpptuxxxxxtl]Vhmkqqqosuvwxyxvtsqo~trjop~r~w~z~w~p~klptvvwxz~|~~~}|ywxyzzxwvvwwwuuqfdkopolkpvwxwwx{{wsrqrqonnquyyvvxyyxwutvnjptwz{|||{zz{{~~}njux|~~|sswrsv~x~vuuvyxvvvwyzzxu~s~s}w}x}w~x~y~z~yxxxyyxxx~x~x}w}wvzrymu{|~yyxwxyywvxyyyyzz{{|||{~z~x~x~x~yzvonsz}}{zz|||||{|{zzyxx||vqqvzzxuuuwyyywwy~{~}~~~~|~zy~z~{~{~y{{zywvuuuu}v}v|x}{~}~}{z{~x~v}q~q~u~xx~y~x~x~y}z}y}x}y~z~|~|||z~yxz{~|~{|zyzr~i{foikqmyptqlr~}~|{vs~r{swtwpyv|{z{zz{z{||}|~||{{|~}~{~z~y}z}{}|~}}~}|}{}z~y~w}vzuwturpolkghfeidngsovtwrvrtpsqvv|}}||y{vwtqtjrllwgdcg}n{|{{|z}z~z~zz~{~|~~~~}~|~{~{zz{~{~{}|}}{wrnihhilrw|}~|~~}~}|{zwtqonnnnnprvz}}~~}~}~}~}~}}}}}|~||{zyxutqrvz}yvurpooooonoqpnljjkkllkiiilqu|v}wtpop~t|vzw}wwwvuuvuttrpomoqrssrqppqqqppqrtsqponlnvtnnnnljijnpnlkkjjihgiih}ehgfn}{|ytqtwwtrtwxyzz~|}}|yvwy{|}~~|yxxyzzyyxwxyqbalvyxxxxxwwvjeqwxwuuuqoojfq}u~wxrlpvuromr|z{{}~~|~zw~x{yv{vyyzy{y{x{y{s|p}p~s}xz}x~}}}|}{}~|yxv}r{r~stvuzv~yzvkS@;;<>@BACEC>>?BFGHJLNNNMNOOMMLMHCCBA@ADGILNPPPNNMKSRFB62124612>NXYRTLB95555567:98;DAFMYcge[L>5?EB>?BHPY`gmhb^TW[VSXb[RV\`[ZY\\][ZZ\YTRRW[ZX[_^Z[hWTY[`luwwvpmlnhhfmwwonnlntrnooplcdgjkmmihgjklmoorprpnnmoopruuvtttt~t~u~u}u}uttsrplkkkptwyz{|}~|yqsw~~|ywwxvuuwwwvuuvri\Reyornmotwxxxxwvuusstpgqn}i}l~x~y~q~l~klptxyx{~|~~{yvuvwyyxvtrvwywwuifmrusohjqvxz||{soqssrpopsvxxuuwxxxwuu{tqwxxyz{{zzyz{|}}}|ytt|{|zz{z{vjkr~w~vuuwyv~q~o~n~s~z}xwzz~z~}}}}y~y~y~x~wvuuvxxx~w~v}s|oxkuirivcnxxwx~z~uvyywwyzzzzzz{||}|z~y~v~u~u~vvxuuw{|||||}}}||||{{zzyx|~zvqu{xwutuwyyywv~w}y}|}}}|}z}w}v|t}s}v}y{{zxxwtrtw}y|z|{}}}~}~~~~~~{}x|u{u|u}v}w~x~y~y~{}z}v}t~v~y~|~|}}|~{{|~}~}~|}||}x}nvjmqqxv{w~zrmv~~~}|wx~y{zyyxsxvzxqzwyyy|z|||}||{{}~~}~{~z}y}y|{||}}}}}|}{~zyxv~uzusskqhmdidfhcnftqxvysxqsmmkory|}}|z{yxxtyrvtlc^]_e{|{||{}{~{~{~|~}~||{~{~{}{||{}{~{~{~{}|}~{xrnigfhkqx~}|~|~}~}~~}{yuronnmnnoqsvz}~}~}~}~}~}~~~}}~}|||{{xwutuxzxvuspooooonnponljjjjkkjjiijmq~rzv~vsplos|u{w~wwvuuuttsrpnmnppqpppoopqqpommpollmppqutommnnljjmonmlljhhhhhim~nphgq}|~}ytnpsss~vz{zzz|~||}{wtwz{zz}}zwusuzyxwwwxxwngpvxxxxxxvvytptwxsrturosqik|nywrmptsrvss~y|z{|}~~{yvuy|{{{zyzu{u{u{t{h|ikov~|y~|~{yw~x~}||}}x{oypys|u{wy~vutndM;9>@ABDDEEC???CGIKKLLLMMMPNJFFGFBBAABCEHILLOQPKOTVTE:862013646@LTXJJA=66666779==BCFNV]dkf`]UW[XRT`ZVZ`a^[ZYX^`]ZZWTQOV\a\UW]ZMXY]]^iv{vtrojlnjkhiryuspmnspnmpoj^eikkkmiffkmmnnopopoon~n~n~m~n~o~rssrrrr~s~s~sssss}r~rrolkknqtvxz{}~xprw{~|zxwxyxxxwvurstwri[Qb|pommotzzyxwwvvvwotxlkh}a|c}h}p}r}o~m~j~l~r~vvpu~{{vvttvyzyyxvsvxzxy|xojpsrqnmorvz~|qostttttuvutttuwwwwwvtrlnwyzyyzzyzyz{{xxxwxz{{|{wvz||xkh~p~uwxwxx~t}n|i|h|n~wywwyz{~|~|~z~y~x~v~usrstvwxvu~s}nvcp]t^zbluvuy{~tuyzwwzzz{|{{{||}|x~t~r~t~tvvxyz{}}{{|~}}}}||}}}|||{z}~}ysrrsrrsuwy{|{~w}u|v|x|z{yzw{t{r{r}r~u~y~zzyxwv~spqt~w~y~{}~}|}~~~~~~~}{zwwwtzu|v~spsxx~t~s~v~y~|~~~~~~}}~||~~}~}~}~|~{~uzrvxy{}~~zvz|}}{|~~}~|{ztwtuwkzxw|x|y{||~||||}~}{z~y|y{z{{||||}|}{~zzzxv{vuvosnqgmekljrkxrzu|t{rukhdfiqt{z{zyyxxvvwo}c[WYVU{}z}{}|}~~~~}|{yxw~y}{}||}{}{}{}|}}|wrnjhhimtz~}|~|~|~}~~~~}|yvsqponmmnoqux{~}~}~}}}~}~}}}}}}}~}~}~}{zzyyxyxwusqpooonnnoonmkjiiiijjihijmp~t~tsqpqr|t|t~uuvvvusrrqnmlmnnopponooooomlknmkimrtrpqpmmnpplklllmmljgfghhip~unhhs~|{}ztonpq|s{uz{zz{|{|}zvuvxzyz{|yxursyywvvwxxxusswxwwwwxxxxwvvxupjstrpuwoym}ptvrnoqrqops}x{z{~}}zxuty|~}{|z{yxzs{j{k|m{hzhlqw~{z~zzxvvw~||{z{ywwtwm||vpomm`TF::DHCCFFEDB??@DGIJKKKJLKJNNHECCCBABDBEGHIJJMPQMPVZP:24432248;9566767;;;CJIQW_ki`WLA@?::CD@FEFKQZ_fhd_WU[XQR`^W[cc`\YXXZ^_][XRPMMWcaRU\[SSYfdjt|ysporhmnjjjiowwvronpnnlplh]gllkjlhfelmnopooooooo~o~n~l~m~m}oqqqppp~q~qqrrrr~r~strnmmnoruwyz|}~zsrvz|zyxxyyyyywusrtuxwh\RXlklnomsz|zwwwwwxxsrzmNU|X{f{h}p}q}r}q}k}k}q~t~s~n~qz~wstttvxyyxxwtvyzyz~ogimppoqrqq{{tzyurututvvvvtqruxxwzxwusrkoxzzxwyyyzzz{{zzyyy{{||{ywwyzwtn~o~puw~rs~v~t}l|f{f|i}mwuvxyz||zyvtsrqstuvwv~u~s~q{bWZdxruwxy}xtxy~v~tvxz|}|{zz|{xussuvwwxz{|}}}}}}}||||}}~}}||~|~|~}}}~|vropqqswxzz}z}u{t{sztzuywxuxpzr{r}u~w~zzzyxww}s}o~nnpv~x~||{|}}|}~{|uvtswt|v}qlinq~t~s~w~z~}~~~~}~}~~}}~~}}}}|{~y|yy{}}}~~~|~|~{~{~}~|~}}~~}{{vtvrvty}vw|y{||||||~|zy~y}x{y{y{z|{}|~{}z}z|y|w|vzwwvvuqropmnpnvoyr|s}s}rvjec`enqyyyxxxwwwuzlZPVVMF{~{{|~~~~}yvttux{}||}{}{}||}zvpnkiijov|}~||}}~}~~}{xvtrqpnmmnpswz~|~}~}~}~}~}}}}}}}~}~~}~~}|{{{zzyxvtrponnnmnnonmlkihhhjjihghjmq~s}t|t}t~t}r|s|s}tuvvutr}p|o|nlllklmnpqqqppoopmljmkjhlrsnjnrnlnrsomjikllkigfghiks~upkls~{z|{uomnxospwqwxxz{|||}yuuvxz{{zyz{xnnwywvvwxxxxxwxxwwwwxxxxy{xnehjstsrvx}t}suuvspmlnqppuw~z~}~}|xvwy~}|{{|{v{q|g|^|]{`zkpuy~}zxwwwvw{}}{w{s|m^fadfd^PB=>?FLHGHGFDB@@ACFHIJJIIJHFJLFCBCBBDFIFGIIHFEGNRTPLPG432356348478:7:ADIRVOP]geVMOJDD@:=?LJGGGDA@?@BBCCDEFFGFFGFDFHFFEEABCDFA=CFIJKKOJGPA:<3:86789;EQQH@@J<9874::FKMRPOEOMR_XJHGJIHF?>DGFCGFJOPTVZbda\WVXZ]TSSUW\_`^YVV\_\XUWY_ca_YGUn^MYmwusoilkerwrjfq|ugmrzyqllmmkgihjifgmgcdmjkloponopppqpqpppoonmkk~k~l~n~n~p~q~r~s~sxzyxvusssuwxy|}~~~}}}||zyyz{{}}{zwywvvkhmZNYotrpnqpsvwwxxxyzyja~o~~|o}Q}o}c}cp|{vtrorvwvttvvuuutv{zwwwxxxvtttuxy{|zxwvtoRBINQOXotspca~lposwyxyvqpqpoqqqosvxzyyyzz{|||{{{{{zz}}yvvvxyyx~r~l~e~f~jqz|wt~u~}|zxwwx~z~{~z~x~vsstuvvtrq~n~mmb[\^Zbpmvxwx{|{trp~ruxwllvz{xywvwyz{||{|}}}}|||{{{|||}~~~~~}|||||{zzzyxxyxxyzu~q}t{qzoxmvlvlvkwkxn{u|xxxyyxyxwwv}v|t}p}o~rswz}~~~~~~~~||twjpikrmwnzs{w{|{z~vs~u~w}z}||}}~}}}}}}}}~{}}}~|}|~|}|~}}}~~}~}~|}|}|{{{z{z{{{{{|||}y}v|qykwiwjymxqytyw{y{{{||~}~~|zxy~y{yzwzvxttsrssrsqrqqosqvtwuxs{u{w|x|v|u{rvpsovq{v|v}t~uxuvvwwyv{t|u}t~p}q{u{xyxtwz|~~||}~~ytrqsv{|}}}}}|}{~zyxwurqqswxuqmjjlnqtwyz{{{ywtrrvz|}~}}}}}}}}}}}}}}~}~||{zzzyxwwvutsrrrrrqomlllkkkjhhhiihgghjlnnp}q|r|q|q}q{rytxtyrxoumwk{j{i{i}jkje__hnppoooonmmpqqnmpkccfhptqppomlljgeegijjjhhkomkhiw{|{xsqtvwwwwwxyz|zwtstx{zzxwqntyyxxyyxwxxwwwxxxxwwwwwvwtrlqwnptpcfnvquwz{{vstsupdkhjhoz~z|zy{}|}}|~~zy}|~}|}~{xvuvwxwspj`\R<=CA?;9:IGEDC@????ACDEDDDDEEEEFEFGGGFFAA@@BA;@DHKNOJF>B@684<<6579?GHMKI>B<7765=EOHAGGIDDHS`NGOFFGGG>AGIHDDALSQSUV]bdeZTWX`RRSVVZ[^]\\Z\aaa```^en`[aiaVQ]syurolkjt|xuiq|sjouyyrnmlkkkjjigegmf^`ogffkonmlooopoqpqqqplnmil~i~n~m~o~p}q}r~swyyyxwuuuvxyzz{}~~~}}}}||zztt{~|}}}zzywwrkl^W]eqrmnqquwuvyvwzwj`e{q{|{~z~xkq{zwrpoquspopsvqruvvx{wqruwyyvtrsuvwxzyvttrskNFNTVdossqghmjltxyyyxwutqpprrrtxww{zyyz|}}||{||{yxxy{xwvzyyxuq~j~fjrwxvtxzyyxxw~w~wy~t~n~nrnqtuusnp}e}c}fZRUWWerpxuusx{||x~v~uurqm~g}^}qy{zwssuwxwxz|~~~|{zyxxxz{|}}}~~}|{zzzzzyyzzyxyxusvxur~r|m{lwkvjukvmwpyt{w}w~x~y{zxxyxxx}v{uxtxr{r}stux~{~}~~}}{|wyqugrkmqktpxosnxs|u~t~u}v|x{yyx|{|zz{|}{{}{}~}}{~|~||}{}}}|}}|~}~}}~}}|}{}z}w{u|v|v}x~y}x{twlwhxh|m}p{szu{u{v{x|{}~~~{yxz}z||{yzvvslqepjpmnugzh{hykwmvnzo|p}p{n{oxqplhifhhlrpzu|v{xyyzy{v{u{v{t|t|tzvywyxorvy}}}}~~ytqqsvz~{}|}|}|}{~zzzzyxvsstsplhfefhlnruy{||{yxwwy{|}~}}}}}}}}|}||||||~|{zyyxwwvvvuuuuuttsqomllmmmlihhiihgggijlln~o~p~p~op}q{rzszr{pznxlwkyiyi{i~jjieeimopppponmnqrqpopldcegpurpomklmlifegijjhcchnmjgev{|{wrptwxxxwxxyyzxtstux{zyxxxxyzzyyyyxwwwwwwxxxxwwwwwxwqjlrwsrogchhtc{gpuz{vqminkdjihzcxh{}{{{xy||~}}{|~~ywx{xy~}|ywutvxxupg[PLF;==9:89;?@??ADFFDDCBCDDEFFEFGEEGD@><>?CFG=?;7998>IN>5<:;84::===>DCA=<=>?ACA@BDGFCCBABDEFGFDEFBBEE@:8:<;6165347986369>8=<;79:;>AD948@A@;@@<::=>ADDBACEHFBBBACEGGFFDDDA?@B?96677899:;:<94344433466567848@;::989:;<=?85;===@IQYPIMLQNLQMPSQLNOHOSXWRQWahibWOPVPVY[ZYUPX]_d`[[XVX^a^\knib][Tduxob`gkompqmp~~ux{vqslojijhcqg`Weba`[lg^^`cca``fkniiihgcbce\beci~h~i}j|l|m}o}r}tuwxyzyyyzz{{{{|}~~~~~~~}|z|xxzzurrsuslml]MRZfmkquyxtqtutllmpuwy|wtqmnpnklmnnlifhruwwtrvyzyxvxuspruvvqmmpqokfhlhoe\MKTN[Z{_hqspoqkqsuyxxwvvvvvvurqrtxzz|||||{{zzzywttvxwutxyyyyxzyxxvsuuuvwvtuusoh\V{`umzpbktutsq~py]zQKFK~KLMVow~xv~xwxzywoi_YLD_qhiswyz{{xwy|}}||{{zzzz{zzz{{|{{{zzzxyz{{{{||}|xtu~v~w}w{xzuzrynzl{kylsotqyr{s|u}x{|{z{||v~tzptqpsnvpxozm{h}i}m|q{qyqxswxwzzzyuxsh}]{cbl^whzp}p}lzh{f}j{uptihk_l[nTqSuWx\zh{v{~|~}}}||{|z|{}y|x|x{y|z}y}y}z}z|{}||z{y{y{z{z}z}y}v}r|o}o}r}w||~|yvt~rsqopxr}qzpulren[rbzk~e~f~ge~fzkmu`~etu`{\z\w]zaxgshtkxpzszszqzpzrzryszt{u|v}vkmrw{~~}}~}{xuuxz~{}{~{{zzzz{||zxvsqpnligffghjlnoppprvz||zxvuvwz|}~}|||||||{||~|{zzxwxwwwwwxxyyxxwvusommmmljhhhihhhgiikjijklkkklmmlhgh~h}j}jjhfdcabcjqolknqqpopqomlmmlrqmmkkkjklkkighgggggghhjgar{{{vporvwwxxyyyxvtsuvwyzyxxxxxxxxxxxxxxvrqtywvwwwwwwxxskmtropibjlotrkmu{yuqspommnmm~k|h}\P[mrwz|~~}z|~}{xvuuuuvvuu|uurrpzlVD966887678:=?@BA;=>;9;>BDEDBCFGGEBABBDGGGFDCCA?=<<;85445566787753455531256555635>;8899999;:975:>::@HQXSLJQROOUTRWVJOUPQRWVPQW`di`WQOTPXY[[ZURWZ^c_\\ZXYZ_ehhif[ZZTcuwn_^fkntinrvz{xjmliifapfaXbd]L_ie]\^a^b_`dikfce_][[c_[_aaig~g}i|k|m}n}p}r~t~vxxyyyzzzz{{{{||||~~~~~{~{zzytpqsvrciw^LP]ilmpuyxvtvtojpptywurqkjkmnnmnmnmmidenpprrqvyzzyvtrqqsxzwrllmpqkdekommmaIHTOU_gmlcO_^dbevxxwwwwwwwvutstvxz|}|{{{zyyyxxwwxyxvuxxyyyyyxvtiqxw~uyxvxuwwk\PNY{_UQe}wuusq}nyezUPL~OOV}]]^xirvu~twvwmmkfZSBCh`S_ksx}|wuy{{{|||||||||{yxy{{|{{yxwwy{{{z{{|||yuu~v}v{wzw{u{s{o|m}lzlqmroyp{r|t}w~z{{z{||s~hylrqnunwpyozl{i|j|qzsxowiuissqvqtupvnisamj_v^yayfj|myjybfvunxmsmin[pSuO{P[g|s|z|}}|}||{{|{}x}vvuywzyx|y}y|{|||}|}{|{zz{{|{}{}{|}w}q}m}n}r|u{x}zzxuq}oqrrtyo~ppmxkojmlrk}h}f~feg~kvqkwhqifr`{`_{a{pzryoxqytzszr{qzqzrzt{v|w|x}worvz~}}}}~~|{zz~z}z~zzzyyyyyywutsrqpmjhgghiikmnnmnoswyxupmlkotx{{|{{{|{{||||{yyxvvvwwwwxxyyyyyyxurppomljihhiiihghhjnlijkjjjklkifegilmljhhgecejommjnpppqsspllnpqunjkkkklnmlolffffhiihhhiiesz|{vporuvwxxyyywuttuvxzzyxxxxxxxxxxxxxxyyyyyvquwwwwwwvojo}ljotliropswtw|~yrlononoopqrpiizzwxy}}|{~}ywutssuvvv~uxrqkqV{I;656689888<=?@@CB;:<::=BFGFDBEJLJEBBCDEIIGDA@@=<;97654223345455444577640013565424:;7899986756778;79>DQZSMHUUMOTSV[ZKPYXYWWURSX_di_XWUWSX[\[ZUTVUV^[^cca]XZciedbWVUS`swl\]eikj^lwz|~zvilpjgd`caddX[bQ_fb[YZ]Tgbeed`[Z`WTVWa\YZ^afe~f}h}k|l|m}n}o}q}s~t~uvwxyyyyzzz{{{{{|}~~}}~~~~}{xutuyr\Lb_OP]lmnouywwwtrnrwwwuqrplihjlprsrnljljfdjlkghnvz{z{wuusrvy{yrlkhoupijnqkrsiTS[Q]Y]he`RDGLEVqvwvvvwxxxxvutuwyz|||zyyxwwwxxxzzzyyyyzzzyyxxusquvqq{{|wuvyveTLIJNDLzk|laju~qydtWRSY]yb^^^azi}ruxx{xoddheb_J:QcV^immvyuwz{{{||||||}}{yxxy{{{{{ytsuxzzyvvxyxxxwv~v|vzwzw}v}u~sol{kqkrlyo{p{s|v}x~y~z~z}z{|qlvpjugxjxmzo{o|l|mzrxsunrgpgnjkkifrducffhcx\^|]za~gznyo}k~mrvpxuswnwewayT|L}[|j|t|y|z|{||}{||y}swomrkupxv{y|z||{}{~z~z}y}z}z~zzz~|z|t|o{n{ryuwouiuqxryqxmyj{ik}kymypzqxrpreqgquk}e~efgil{otnkknjyigi~w|{zvyvxwyv{t|r}s|r|s{u|w|x}wqty|}~}}}}~|z~z~yyyyyxwurqomlnpqpmjhghhiijklmllnqturolhggimrvyzzz{{{{||{{zxwvtuuuvwwxxyzyyzzywtrrqomkihhhhhhgggdippnnkkklligcbehmmljigfdabfhfljmmnnopqooomnonmkjjiimrqoqmhgggjkjhggdjiu{{{vpnqtvwxyyywvtstuvxzzyxxxxxxxxxxxxxxxyzyxtpsxwwwwwvttq{nswv|n~qzqpsy|}~}~|wlnruvtrqturnnuyyxy~}}|~{zwutsstyzwt~n{_}L<4477789;:;<@BB>?A@;;=<=@EHHECAENQMHCCFFFIIJD@=;98875335443446457544799761.-03775337:79:::9552367788:9=OXNLJWXMORRVZ^WU][\\[XSRW^`cg_[VYUZ\][ZWVUQPUV[[cfb\X`ffdbZXRS^rxjY[cfd^\r{{vzvs~ommjgifebcdTO\\_dc_UZ_M^Ydj[WTVZNMTU_ZXW\dccf}i}k}l|m|m|m|m}n}n}p~stuvvwwxxxyyyyyz{}}~}}~~~}{yxyqV6PcSOZhikmuywwxsrsyzwrnnnmkjjlmq~ttrnif~ghhgfghfiovxyxyvuwuusvwvsnmjswppnklitqcXX^UW^y_VZWQ=>=8Qksrrrtwxyyxwvwxyyz{zzzyxwwwwwxxyzzyyyyzzzyyxxwwywrk_iz{}xotypcUOLOW]dzkzf|_muv|lv^tTZal}sa\ci~n}qtuvytmffidXSHBBPQisi]moiuz{{{{{{{{|}}}zy{|{{{{|zvsuxvtprtvwxxxxxw}v|w}xwvtp~m|jtlwm}o}q|r|u}u}v~w~w|ypzjykoqfxfyhxjvmuqwmwiwlulrlnhjfjfkgjctezfkerd}ewcx_`}ezlxpzszuvtwoylwlvkxiz\{Vzfyr{v}z}{}{}{{{|zqmjcti{q~vx~z}{|||}{}z|z}z~z~zyyz||wzrwnukukrmmjjjslxnyky`|Z]zftlxq{t}vvvbwZxfrvgyfzf~hj}nxoypvpvn{llp}u|x{w{wzvzu{s|q}q}q|q{s{u{v{vux{}}}}}|}~~}}||{~z~yyyxxwuromllkmpppnjhhiijjjjklllnqttrnkiggghkpvyyyzzz{|{{zyxwvtssstuuvwyyyyzzyxvutsqnkhgggggggggggkpqqnllmlid`_chpmkjkjfdaacc`gimmmmlklmoolnmgfiijjlpssqpmjjjkllkfdfajlt~yzupnquvwxxxxvttstuwxzzyxxxxxxxxxxxxxxxxxxwusuwwwwwxwxxuwz}y}qxttx}~~||~~~}pqvy{xuqvxrs~z~{|xz{wwtsrrsty|rhbXD742269:9;>?AACFF>>>>;>>=@DHJHECAEORNJEDHGEFHJE@;7556643356655554577668=<8720.04896444669<<;;651357788<67KTIJKXZRRUUVXcdce``^\VRQV]baki^Y[V[]^[Z\ZSNMNQ\V]e_WUafdcb^[TQ[qxl^_beb\d|uszoz{oljjsmjc_[UTXd[cgiTivZNM]hXXWVUFJTU_]XV]fadf~h~l~m}n|m|m|l|k|k|l|o}q~rssttuvvvvvvwxy{|~~~~~~~~~~~~|{xpYAWmXNUbgglvxvuvstyytpkjllmmmnpqstsrmlh}gjllifkqsqtuvuvpotxvqsssqonmwyxxqijiwr\TU_nXw`^Ve]RE?>AVflklotwwxz{xxzz{zyzzzzyxxxwwwxxyyzyxxxyzyxyyyyyzsurTOoykpt{hw\wWPMNVfn|lyjwh{h|ikk{b|^chsvgdlm~n|nppptpmhjl]GEIMIKZov`Mc^[v||}{zz{{{|}}}wtz}{{{zzyyxwyunimtwwxxxwxwxyzyxu~r|nynonnpqqwrzq|r|r|r|q|t{yn|m{sm{ezhxkxgngdmlioarduirmgleikhpjsk|osxp{owprhpbxbvfuktowuw{u{pwjoenatbyd{kzvxuzu|y}|}z~yzy~yrnle{x{yxy}{}||}||{|z}{}|~|{zz~|zvvmrmlogmjgpjlwlm~k{iz\}Xxatnvsxx{zxygxZz^wpnwkuitinpitnr|srljm}o|r{r|s|t{r{s{q|n}m}m}n{p{rzsytxz~|}~~~~~}}}}~~}||~{~z~yxxxxxvtpnmllmpppmhgikkkjjjjklnoswwtpligfeefjqwyyyyz{|{{{zyywurqqqrstuwyyyyyyyxwvutqljhgffgggghjlmqrqolmpmkigeikmmqmjkjgdfhgbbglmmlllklnmllpleiklmnprsqpmklmnnle\^fgilqtxtqnquvwxxwwutsstuwyzyyxxxxxxxxxxxxxxxxwwvvvwwwwwwxvwxwux}zy|zy||~~}x|{~}|xwxy{zvx{|zwzzy}~~|x|{wtttrqrsx~zwzUFB;744568:;<>><@@=BHKKHFECFPSOMFDHGEEEDD@;64456544666777778:;;89AA977.914;:6666776@>:<723454777<78ELHHLX\ZXXYZ]bc`_bbZSQPPTZ_`aaac]XZ\^[[^\SOMOQ\VWdhWRY`_aa_\UQXpzocacedejrzrry~{{vpyljgjwibgb`S[X\]YUfa}yZjnnfWZ[XJBNUVa_YW_chef~h~l~m~o|n|m|l{kzjzkzl{m|o}p~p~q~r~r~s~t~t~s~s~stvwy{~~~~~~}}|}}}}~xldmo`NQ]gektwt~urguwspljillprstussstsnpl}gmnoskoutrrqqtyolwzvprqonmjoz}~zmosyta[Y]o|svg`cdaXIGC[bfk_fmrwvrx|vr{{{zyyyzzzyyyyyyyxxwxxxwwxyxxyyzyywuxr[KVjiom}^}ZUPKKQV]}]~U~b{d}Vzd~gemrvywnmrpm{gpflqnompsojdJR]PWi~nYK][Yp~~|}zzz{{{|}~|zyy|}|zzzyxyxyvogktvwvutwxyyz{zxv~s{rqqcx[yYyasvo|ounnmcofqrxn{p}qqudwivwyetadgldo`sb~homZqglteyl|ruuu}txnqkhcjbsjyo{u{v{x}x|utoidh^rcym{xz{yxzu|x|y~yxyxw|s|v~xyyyz}|}}}}||{|{|{}|}|~}{~{}|ztzgybwdwcx`wkqxm~m|luijeqdwjxqwyx~z}|ywwjwevrvvupsmtkunvttpiej~mwjyp}u}r|q|r}o~ki~h~j|n{pzrys|~|}}~}}~~~}}|}~~~~}~{~z~yyyyyyxvspmllnpqpojjjkmlkkjjkmopswxvpkigfedehntwxxyy{||||{{zxvrpooppqruwxyyyyyyxwvurmjhfeeffggimqqrrqollmkljjjifabf`[_gjlpqngbdimmllkjkkkhfegirrqqrrqqoopmmnoolh``efhihjpspmptvwxxwvtsrrsuwxyyyxxxxxxxxxxxxxxxxwwwwxxxxxxwxywuqos}}||tuwzzzy~}u|wzzzyyx~z|y|~~|z|{{~zyw|~zttuxsrsrmi}^B620259::<=??@ACHMJHF@@A@>CC@EMOMKHHFHRWRNIEFFFEC?@=:6445776567789:;;;<<=;9BE95;<9=1=?9658997??=?956743665:79?DDELU[^^]\]\]^\[`c\RPONQSSRRU^kj]U_`[\`\TPTLKXZT^j\OPXZ^__^XRWo}thefhlmomtvtz{wx||inle[hqaYca`T[VP^TCURhfVvve[^\U?FVPO^b][bfkggim~n~p}o|m{lzkylylykzkzk{l|m}n|o|o|p|q|q|p|p}p}q}s}u~x~{}~~}}}}|{{zzzyz}zrtufPP\hjlqt~otjnookhhghlmvvsqpqssvuprpi~lyqoosvtrpopqwketxwpnmlkih|r|{vjtmas{{xp]YYMo}rohhf_UHEWTfSYjkfetlm}gYtmuzyxxyzzyyyyyyyyxvvvvvvwxxxzz{zywutj^SRVTqvg]SPOOORY\NKR{lgUex~xx{xrswi{^za]ltrurqtxvrcLVg`\doeZP``Vcwz{wvyz{|}}}|{z{|}}{yyxxxzywtnpvvvwwwxzzzyyyyxv}tzros`n\kfjpisipidk^jhfveprv~qymkphn~jurktoynyi{f}iomdqup}p}u~zzxv~uxprmjffjsr}v|x{x|y~y|yvtllmjup{x|{|{{y{x|y|y~y~wwwwxz{{z{}}|~|}|}|||{{|{}|}|}|}|}|{|s{i{d~`b~nuzo{m{nzmnjsi|n|vy}yyxzzwvutwqzf}d~fiv|y~xpfb{hukrhwn~t}p|rzvxtwj{h|g}i|n{pzqyr~}~}}~|{|~~}||}~~~}~|~zzyyyyywuromlnpqqrrqpnonmkjjkmprsvxvqmlkifdegmtvxxxy{|}}}}||{xsqonnnnpsuwxyzzzzyxwvtolhfddefgggfilmmlkkkjedehkkf^ZZYX_dgilpqkefhjklnomlljgbchnxwutsroljknnnnnnmkheaeghddflomptwxxwvustrrrtvxyyxxxxxxxxxxxxxxxxxwwwwwxxwxyxwsmloor~xzvyqqswxyy~~r~rtuwyxztxw|{|}{~|y{|xtvzy{tuvwwtrkWG@510247;=>>@BBBDFGKLHD@BDD?EEBFMNLKJJIJSZTMKEBDECA;:99655688877789:<=>=<;;:9@A63;D<>28A=579:;:BFDNA95852664:88;>@BJRW[aa^\\]`\[`b^UPNPRPONNRVevlYb`\]_[TSVJFT]XVa[QNSW]cc]WUZn}wjegjptsjmirxsxtrffc\Zfhc\_WY`XSQ\YOUUg|w^_accbTL@QVDK^e^_finiijnno~n|mzmylymylylykzkzk{k{l{l{m{m{n{m{m{m{m{o|q|t|v}z~}~}}}||{zyxxwwwy}z{pUS]hmmnsvpfokiedfgjnsvtrsuu{r|q~wvqqrj|jvpprsuqooppom]Rmrwollmlji}lncN]WTju}znU=<>]omkjjf\JPQSZA`fedfg^djUASTnzzwvyzzyyyyzz{zywuuvwvvvwwy{|{zxtk\VVfnId}ym`WVVUTUXXJ>EjXRyrpuuy{se~X}\TLHf}wpvsstxzuj}h}nwlprqsukr`]\ebWRSeuxwwxz{|}}|{{{{|}}|yxwxyyxuqquvxuuwxyzxvuvwwvuwvrci]k`m`menhl^fb]l_vburu}v}psqmj}f|yw~wv~r}o|mxmsn|q|t|v}x~xwuu|tzsvqts{x}y}x|w}x}y}zzzvwwx{|~~}|}z{z{{|{|z}y~xwvvwy{{{}~}|~|}|}}|}{}{|{}z}z}{|||y||rmnvv{p{m}nn|l~lp}yz~yx~yywsvrsug}emkgs}y{zz|qf~czjwmvlzo}q|pzpvrrpohthujtnwsxtxsxs~}~}|z{}}|||||}}~}zyyxxxxuspmlnpprtwwvsqpnlkjkmprtvxvspmlifdehntvwwwxz|}~~~}}|yurpnmmlmoruxyyyzzyyxwuqmifdeeefeffhlpo~llmkg]W]ckomfb``bgb^\`ejhedefhkorpmlkgimmhmruvtroljjlmmmkllkkf]dghca_jnmotwxxvutuvtsrsuwyyxxxxxxxxxxxxxxxxxwwwwwurqtwyr~gbdnvu|txsxuqpsvy{~sppruyyzrxo}rt~x}~|}zx{{wsuy{xtuwy~}q[F8333478:=ACABFEBEIJHIG@?CJG@FFBCGIJKJJLLRXSLID@??=;76787557:;9868889;<=<:8778<;43:>A:64<>99;:;?NPFPB=8;62675<779:==GSRX\a__^`b^Z^`ZRMOW\[^beaZ[txfb_]`a[VY[KEV_\SV]SQUW^hibYVYl{wjfgktwriijrrlqw|xoyxqf_bfbddk`]Z[`TMUdbuosz}Y\mleaIHJWP>Nbf[dhlqlkkpnn~l|lzlymynxmxlxlykykzkzkzkzlzlzmzlzkzkzkzm{q{r{t|x}|}}~}}|zyxwvutrtxy|x`Z]fjnnt~jfgghffgjnqyqpuuvpzg{o~xxpqtmjkouturgghlhd^MBciqlmoqplijbYXb`fbmz{l_DCMJBCA??BCHMLKMMNOMGB?=;97555777657;;996778889887455554549988:::ETQVY___^_a`Y[^VPOTcdciqun_Xkytd_^aaYW[^MMX^\TO]USVX`hme[YYj{xkghlrumigkqhjlurvtjafngfgfcab^Y[XZTKWim~~ma_clca`DETWKBJZhZiimnmlkpml~l|lzlymynxmxlxkxkykykzkzkzkzkzlzkzkzkzkznzqzr{s|v}z~|}}~}{zyxvutrqrtvy|}ti_eimmtqgffghhikoqrrsruuto{l|oywpturnppsuusVJ]dYMLLFH[agjruuqlia[eedrlrwqgOBBDMckmkhddIQM[ef_VS\llg_RI@=HYkutqwz{zyzzz{||{yyxvnqrrvxxxy|{yrg_ako]OScb^\^^]WQRQMCAQ`fe{tqnpqndw\uaR?9Hnipy~wtsrrmqvrdUTcbUy^vh~rniflvxxxwxxzzz{{{{zz{||}|zyxxxusmmoijsssomgfjmp~p~swtm~jziml^l]k[tZu`mnj|qt~t|t{r{s{r{s{t{u|txoviym{qypukugwezf}g~k}m~nquvv~vu}u~u~t}u}x}{}|}{}z}|}~}}}{}{}{}|~|zxwwwxyz|~|~|}|}}}}}|~|{zxwwxzywwz|}|vl|iyo{q~km}t}{{z|vvtsqmqmpss{zvu|xy{w{w|w}u|q|rwwvunomlrlsiqbl[h\eddog{lps{ttto~}}z{}~}|{{|||}~{xvvvwwvurolklmqtwyxwvsqnljkmprtvxywurmheefkptuuuttvx{}~}}}|{xwuspnljklrvvvwyyzzyywuoljjjigfdeefhjlknpe[^elhemrpicdjibY`gkh^WZcgebchjiikiijhc_grsmmnnlllmlighjjjhjljgddnvsoquxxwursvwutrqsvyyyxxxxxxxxxxxxxxxxwwwwwtpjintrjfjt}{}yuzwipuxyz{~{}ttsrsw{}}xqxfyk{pwxwz~{wuv|zu~tuuvvugO;43447:<>=>FJFDHHCFKNECGA?DMJA<:<=@BELOMLLIE@;889876556798766;<88767655655533458798<::9:97444?JOS\T9A?;6<859:;A:9:;84BZUSSZ[\\]`aYWYSQU^egknlj_UScw{ja_c^WZZbUW_[ZZP_\WZ^cgllb^Yjzxlgilmlpwmnqtkilpvkb`ifbbdca]]]\b\RTPVhprqh\~tvr`]^MUXPBDE_][gjnnmlkolk~k|k{lzlymxlxlxlxlxmylylykykykykylymzmzn{o{p{pzq{s|w}y}{~}~}|{zywutrppqrtx}|ugfgkhqkfdghjkmptttsstuuro}osyvqtvusstvwwuXIR]^WGHIIQWnuvxywqhabfc}anptvqmf[MNRbijkh]VJBAQ]deZMOhygL=963357:;=@@?EKIFIHDFKNDAFBACFA=:9:68>N\\VRM:CF>:99:<>?C=:;<85?Z]OQVUWZ\^_ZUUQT^egnqkhe]SM[r}ticf\Y\XbY_a[Y]PYb`]bfbfohd[jzyoijkkfsm`plo{mwcedffaa_\gh`]aclfRRVagaQgmrta~viU`[XdWE:CHaPYdgkkjimlkk~m|m{lzlylxlxmxmxnxnymymylylylylymzozq{r|r|q|o{o{p{s}v}y~|~}}|{ywvtrpooprtx~}slhdboigglnppqruuuuuuuspp~sw{uquxxvvvwwur\TZZPFKSaV^\qsvxzyuiacdggnopqqqq`S[YdihhdYHC@EKW_d]PJ`wmYMKSbmmptwwvvwy{zzyyyzyyytfQ]h~ofg~onqvxqihjfYQS^e~d`bef`S_qf\NGILXi|c^ivupkycq_[PLLV}\z`}lutqomrvkYUT[~[YYWavc}hqtspsuxxupx~{zzzzzz{|}}|{{{{||~yuuuzzz}yngklmnsvvuqmi{i|l{pxnym|mrs~r~q~o~n~n~o~p}s{tyoshlfqerfqfrat_{bcabiqu~v{rypzs|x~z~{}{|{}|}}~~~~~~~{usqv{|{ywvvxz|}~~}x}v~v~y~|~{zzz~y~y~zzywvy~|}zxwwpxmwxx}yy|w}x~y|xwtustqtrtvwy{{xzxwytzr|s}t|u{uxsmt]sYofipdn^n\m_fhbpaqhnmlninfoepf~}}|}~}|{||||~{xuttuuvvtqmjhjpvyzzyxurnljjmprtwy{zzvohedhnuwwwvvvwwy|}}}}||{zzyyuqkjjnqqqrtvvuwwxwsnnqsqmjfedcccelmjknnqnedlkklllkjig]SVhcYWbd^YY\dkkjjjkllorsomnrrokjjjgfgijihhihgdeouspquyxvttuwvtrrstwzzyxxxxxxxxxxxxxxxxwwwwwwwwxxxvsorz}~|{|{x~lqx||yy}uzj{qyvtvzv|s~t~v~x}z~{{{}|zz~|{}{~|zwsfWC556589=<=BC?CKJHIHGHKKB?CA@?=::;;>ADECBBA?><975468:;<;:88878789:77743223347>EQWZ\WRHB;;:;@@AIS\aXKEGAAF;869=@BDG?;<=89>W]NMTRUZ[^]XSSU\dhjrrlifbYNTizztgdZ\^Y`^a_ZZ]TUadaddbfnli\iyzpjjkigouebmexjedeed]be_Vkg`ZSXdd]Z`zw^eioz|i~nVIWJLUW;6DQUNSfcegggmiklp|n{mzlylxmxnxoxoxoynynymylylymynzq{t|v|v|v}r|q|p|r|s}w~z|}}|{zxvsqpnmnpru{zskcaqkkmrtuuuuuuuvvvuspqvwxspvzzxwwwwtm^^bb\TO`{s_SMdjquyyvkb]aljkkilqqqlnfZ]fecb]T??FN~W\\YWUdolVKZ^acfmvyyywtwyyxxvvwxyvk^NXZgyqc{g~eglqtniie|htgdhliedb|\{[]`eb`]SOQS~[uW~]ajusnxfz`UQZy`_XYhrsooplcZX[[acYVTU{^xfnsquyy{yqbmzxxyxxyyz{}}}||||}|{z}|{~~}{{{{wlfhlpstokhjnqqqp~s}u|u|u}r}n~l~n~o~rusvnfd^_hbqfsbvb{nnebj~t|wyuuptmyr}x~|~|}z|y{z{{}|}}}~~zussx|zxvv~vxy{~~~}}}w~u~u~x~zxwwy~y}y}{{zwy}}~zwvvvyspuuxv~wyyuzw{w{xyvwuwtxuwwwwwwuutrsouoyq}s}t{svrlqcpkntjrep`p^pbnjlnkhmanbo`n]m`oi}}~~}~}|||||}~zwuttttuuspmjhipxz{{zxvsoljjmoqsvyzyzwogcdhrwx~y}y|z|z|z}z~{~{~{}|||{{|{{{zzxsomnppooorrqsuwvtomqtqnkhfdccbdfgjkipwlccfgknpmgfkjd``acbcfcYX[\`ilklprusrrqnmnrrojhhggikjjihgghgfhqurqquxwustvwusrqsuxzzyxxxxxxxxxxxxxxxxwwwwwwwwxxxxvvx|~}}{y|xsox~}{~~y{p{v~|xtwxv}s~uz|{y{y|}zy}}~yoiiXE;::98:;@=<::;=>?@A>;999888776679;<=<987888:;=<976322547CD@?ILKIIKHHE><=<;::;=?@@?<8545667888889:;;<;7679:;>?BA;77535:=DKJHLRPNTNFD>9<>8GPPID>>=9:ACDI?<<;@FIJKE@EE>9HKJTNQUW[Z[\TT\fkefqonnmkkhZNVl{xlgjklgajaZX]`^^aegghhkmrrajxzqlllkkkgcb`afeeecbcZXc`TKTd^bdaVZ]\hjgbu||qrXZGZQ^W9ANIKKbkVZdcgifnqp~m|l{lznzozoypypypypypyoynymymynypzs{v|y}|~}zywu~s|v~}||||{xvsqponnnoqtw|{vwusuvuvwwwwwwwwwwvvvvutspquz{yxxxxwmdfgbZQJRZRKP\`iqst[RNKRY^jnqrqpqpg^YARJZ[_agc^iRGNPOfnlbON]hoovwuxvwyzwzxwwtpnke_ZXWWVUQNNOSRW^fddlqqssq~ng^df~^]bcflomtthz`|Z~pxqpo}jyfudxfifbkotvuuruqlhc_ademidZYj~p~k~dlw{wwodbhtzwwyyxxy{||{{zzzzzxurptvwx{}}|}{vrqtvtrnkorsttt}w{zzyzx{v|u|w}y~y~z~ywtipmsuuyx|x{u|t}stusr{svqrqopstxx{~wzsnqcpfpktrxvwyuxy{~zxrnpsuy}~~~~}~|||y}v}t~t~t~stuvww~z~||{z|~~}{wv~vzuwswtvtvqunuovqwuxwyxzwytvprmnlmjkgjfmhtozw|y{x{w{ttknekecjfmriwhymxqxqxlvkuotlrhtkus}}~~~}}}}||~zvttttsrqpomkkjkqx{zywvusqonllmnosvyzyvromknuz}|{zyzx|x|x}y}{|{||||}~||{{{||}}}|zwusqpmkhkmoopprsojhjjjkigfgfedcca``bfjjigecjpoe`flkig}g}gkha`abdbaeimosxyvrnllnnnlmmjihimonmjhfgkpty{yvtuwvtrsvvvtrrqsuyzzyxxxxxxxxxxxxxxxxwwwwwwwwxxxxxxz||{zwywsy}~{y~~{y|||zyy{yy{}z{y~~~}|}zn]QDCB@?AABA>>DA@DEAAJMLJJLGFB::<;;:;<>@A@=85434579:::::;;;:97558;??BCED>:<<==;ADLOAB@:9::<@DGKAEA@CIKILGEKG=;JLJRTNRV[[YXW^fhjgiooooomnleTQaxtfdfmojqfYX_baadfhiijkotuelwxqonnljhgdd`adeihgij_^_ZRKBNPQT\MOfgvj_nliq{thr^PCRIgQ=HLDNGjdR\abgfjqro~l|k{l{ozpzpzpzqzqzqzpzoynymymynyozp{s|t}x~|~~~{yux}}}}|ywtrqpoonnpruy~}{|xusstuvww~x}x|x|x{x{w~wwxyxv~t~rprtxyxxyyyzphhgc\SHPVONSbftskgJGKNKSastrrrqpnaHB?DHPVeimeXPHD;B@WVd^QRcouqomnqxndruqvxxvpg\UQUY[[[XUQRTXTXX[[_hnpmhm~qmfff`aeehovwy}xjfrztsr~ozlzjlkghlnquyvtrqmlfbhjh~tqma[k~upntuvul^`dlwyvvxzxxyzzzyxxwwxxxvtuxzz{{{wsrtvy{zuqmlorssuuv}x{{zz{u|q|t|x}y}z}{~zzwrv{y~{}|~|~y~v~r~ruu~r{pvosnppstwxx}m~dof^gcgk_r]rhllrt}|}~}~zwuw{}~~~~~~}~|}{}y}s}o}m}q~stwxwx~{~|{{{zz~|}|~yx~w|v{tyuysxpvmwnwrxuyyzzyxxstmmhhfgfifkerh{osutr|qupspvrxt{s{m|nzpvsusvqvqvsvrwoyq{r}}~~~~~}}}}}|~zvtttssqonmmmmnoruxxwuttutrpnmllprtuvwyyxvusuy~y|yyxxxxzx{x}z|y{z{z|||~{zzz{|||}|{xvvtrnkhjlnnooqrpmjjlmljhhikjiffefjjloqphddglpmd`fkn~k}h{f~haWX_ccb`aeimqttqnkjlopommmkjklopnmjhfdjsy||zyxxxvsrtwwvtsrqsuyzzyxxxxxxxxxxxxxxxwwwwwwwxxxxxxxyy{{w~rsvrjpw|~}|}}}}{zzz~}~~}}|{}~~|{|~{~{~zzy{zoh\KA9:>DIABDCAAECBFGDELPOKJICA<67:;;<=>@A@>:6444568:;;;;;<;:8657:=AEHIJJJGDDDDEHIMMLHGGJHJF?=ADBCKMB=AA=:==>AFHLCLIGGKKCLHIOF;?FJRNVMNQY\XS\hlqtojnlpppppnl[QXn}}truwxuzsdX`eccdfhjkkmostgowxrqqrjhhhfe_^degffge`ZUVVQGFQU``UOT`{ycvn`fuht|qWGIHiGAMJKKMh\Ucc^keosrn~l}k|m{o{o{pzpzqzqzqzpzoynynxnxoyozo{p|q{t}y}|~|{yw{~}|}|{xvtsrqqoooqtv{~|{ztxpvputuuvuwuxuxtytzszr{rzryvyzz{z}y~y}x|v{uyst~uzu{uuvxz{}rlkif^YVZb]UUairiSKFJPSMT^nttsrqrqcOA@CHO[cnviSQOM@=BNWlgWTgruoelutpaN_cYftwuk\QPNSW\]]^\YZZ]Z}YXYZ_``f`S`nnmghohfhmtvwxvsnrtwvwwus}p|lgchkkqvzxwoqqmiiopoqogUGXsspsnlsXKepnsvrqpuxyzzz{xwwurvxyxvruwxyzwpifksyzvqkgjptssuvx~z|{|{}v~m~m}s}v}w}y~z~z{y~{}{}|~|{y~u|r|r|q{qzqyqwpwqxuyuyrpugkgbfehn`x\s]acaljvr{z}~}}~~y~xz|~|~|~|~|~{~x~w}q|m|l|p}q~svxxy}{|{}|}|~{z~{{|{}z|y{wyzw|uzuyuyrxpyryuyxy{z|yyxstlmggffhglgjgfpfuhumtlsgmekholurxs|q|nzosqnqqqupvqvswuys{s|q}}~~~~~~~}}}}}|}zvttusrponmmnnopqsrpnnnpsssqomlmqrqpruwyz~x~v~u~uw~x|wzwywxwwyx{y|y{zzzz{{}z~yyz{{|||{z}y|w}w~vtplijkmmoopqqomlnpnkjilmmkihefimmnpjdbehiki`XZjn~m~g}caa\WY_a`^_adjoppoljijmonmmlkkkmoomlihfdiv{||{z{ywuttvxwvtsrrtvwyyxxxwwwwxxxxxxwwwwwwwwwxxxxxxxxyyzzuwhqtpgglw}{|z{{|}z}|}|}}~~}~x|x~}~|{|~{{|xxym{VLI@97;=DDBBCCBCDBCHIGHNRQLHF?:757:;=?@ABC@<87654578:;;;;:;;697AFILORUUTTSROJEDEHHJKKFFFECDE@>CJGAIL@?@@>:>>?BGJMIPPNJKJBMHJOF=AFHTOUMLOSXVUant|zpimkqpooonnbST_u~zwsrtr{sabefffgilnkkmsriqwwtqpogpkhgf^Zdefed^ac[NRWTGCPWb_\[ZXmpokxwfhqfszxXOGTc>FNMRL]fR[gefdeqtqmm~l|m{n{o{ozpzqzqzqzpyoxoxnxnxoyoznyozp{s{u|u}u~wwx|}|||}|zxvusrqppprsux{~{{zmwhwkwlvlwmxnzn{o|p|n{m{n{r{rzrztzvzvyvxvvvuuutuststxt}uw{{~rlkkiaehUcYX`xcoriRONNSX\]ajuvtsqrjTA>AELV\afndONSTKBIRets^[nhjejrtk`UMOSUiqrhZNMMNQV]`__`__^^y]XW\bb_V]^MWfjnijmmhjsvtwwgjnrtwvuwppnn|keiljrvz{xsutqmnrtrqpfTKUmxtrigtOJey|vspptwzzzzz{wvvtqvwxwvtrsuxywpc]esvvqkggkpvttuvxz~{~xsml}r}u}t}x}{}|}|}|~z~z{}|}typyo{pzqzsysyrzsystrroqjlfidjfhpb}bxikigkhtpyu|x|v|w}x~y~z~z~z}{}{}{~z~x}s}n|n{n|p}r~suwy~y}z|{|{}{{~zx|x}um~i|p{wxzvzuzuzszr{tzvzyz|y|xyvsumqikhhjgpmvrtqphoawbodaiZm]mjsqwrzpxnrpdqgnqlunuotrvuytzs{r}}~~~~~~~}}}}}}~~zwttutrqonnnnoooonkigfgimpqpponoqqsqrtuxyx~w{wzw}w}w|vzuyuxuxwxyy{yzyyyxzy{y|x}y~y~zz{{{zy}y{xzy{y~wtplklmmnnnoqqrqrs~p~mmnprrpmjffjppnmf`ahnlhfgeamkika]`]Z_c^][\^bglmmmlkjjjjijmmmkkklmlljhhdjy}}}||}zwtsvxyxvtsrstvwyyyxxwwxxxxxxxxwwwwwwwwwxxxxxxyyyxxrjbkrniig~lurytyv|zzxwz}}}vzyyz{{|{wus}unzXB88769=@DEDCBDFECBELMJJPTSKFB;7568;>@BDDEEA;8997678:;;:9879DBAEKG@DHBBAAA=@?BEHJNMVVQLJIBMIINDEFGCUUPKLMOQSWdqwyvlfliqpoponmgXQXl~~la]`jhvxkfgijjjjmnkijqqnuxxvpmkgnmjjg[Vehhfc`heUOPUXF=MYYLSNLJ`gmb`dbcg\oipRTI[\?KOSUUgbUclgg`gstqon~m}n|m{m{nznzozpzqzpypxowowoxoyozoypzqzrzrzr{q|s~uz}xwxz|}}{yvtsrqqrstvxy~~|xzozlylylzm{n|o}r~s}r|q|r|s|q{n{n{mznznypypxoxnxmwnvruwu~vyz~pmlmminc_g}SVT_quwm~fYa``ejhggnuxusrtpeSMHDPZ^ac^L@CIPMGQevwi\bplrpryr^SONOT`lde[QLOPRVZcgc``____aabghfaTSVOT]frmlotlhywndtoimtvwvuuqtsr~uqkbanuzz{vwwvstxxwsshZ^bhossfbv[QXYitonrw{}|{z{{ywwwuwxwvvtstuwxyum_euttpkgeimstuvvwxyyupp~t~u~v}x~{~|}|}{~yz}z~v|nxkvkxmxqytyvzx{wuohfjdscrcogogkgflikpjqnoptuwwzx{t|s}v}x}w~u~v}w}y~y~y~y}x}v|t{r|r}t~v~v~w}y}z|z{{{{|z{zr{f}abcfn}xz{w{u|u}u}v}x|z{|z}z|xyougofmonmojpqvzyvthu_]}bkhbkbkjnosmtlonbr\peiofuhujqmspvqxqyr}}~~~~~~~}}}}}}}~zvttuusqonnnnooonligeccegjlnooopstuvvwvwwvv{vyv|w|w}v|vzuytxuxwyyzzzyywzw{w|x}x}x~yyzzzzy}x{yzzyz|ywtpnnnnmmnoq}r}s}s~t~s}r}p~popsssplfekrurj~`~aclpojd^ZWed`\WYcba_[[\[_adgklllmnkkihilonkhhjllmlljjhn|~}}|}ytrrwyzywtsrsuvwyyyxxwwxxxxxxxxwwwwwwwwwxxyyyyyyxv|vws|lpuojhhhgyhxlyt~{xssy{{zwvoxl~vz~|{wuxu_}IA85679;>@CDCCBEGECCGNOJHMTSIB=9658@AFJHFDB;;ABBFID@DFGC?AD???CGHJPQ]\RJIKGMJHNAHJI@RWHHNPNNQWerwvrmljippopnmlk\PTbw~eYZ\gdoutmlmopnkkmljjprquxxvmimkmkggk_ahhjhghmbPROT]NEJUVHUTRPboj^_f_\e]db_RXQ_VEPSX[\i_]kolfbkvurpn~m}m|l{l{mzmznzpzqyqypxpwpwowoxpypyqzqzq{q{q{q|u}w~w}u}t}s}t}w~z}~}yvtsrrrstvwx|~||{t{t{t{t|u~v~v~v}t{s{s|t|r{p{o{nzmzlylykykyjyjykxmwruxuwx|ommmomrgij_SOSpmhmrp_][Z_dginwzzvvvxsgTOJGW_`boraGCHOQZbpuukhoxjplpvnZQQUYYa]QVROQSVZ`fli`]\^__af~kopmgbXSSW`imqonnprmw}nZmvlkruxwwvvtmt~wph`Ygsts{yyyyxxyyxtsidfmhhsuc[|vaJ?\uvuuy{{zzzzyyzz{yyxvvvvwwxxz{|{omqqqojedfinuywvsuyzxttv~x~z~{~z~y}x}x~wxytp}gyeye{hznzsxuvvxt|q|mwkuhuerfmaiViRoVuextxwzxzz{}|~}}}z}w}s~p~o}q}t~v~v~x}z}||z|v|t}w~y~x~x}y|y|z{y|y|y{yqzf}mg\`t}}z~x~vuuuxz}||}|z~wssknmmqmqmvrxtyrqrgsczgpkhiefeleqesjkq_vdoigierhthnjomrmtmti}~~~~~~~~~}}}}}}~yvtuvusqonnnopppomjgecbcegilnnosutuvxyxvrsv}wzvzv{v~ww|vzuytyuzwzxzwyvzv{w}w~xw~w~xyyzyx~x|xzzz{{z}xvsqppomllno~p}r}r}r}r}r}q~q~poprusnhfim~p}m~i}f}i}msqnke^ZVdheb^\aZ[^Y[\\``bejmmmmmlkhgjmppnlklmmmllnpns}~~}}||xtstyzzyvtsrsuwxyyyxxwwxxxxxxxxwwwwwwwwwxxyyyyyxw{ussuoyiqrkfefghfzgxpvspsxzz~wypwlzx{||}{|~zw{d}I4478::;<=?ABCCDGIGDDHNOKHKRQI@:877:>BDEIMLHD?8?S]SA<<974249@EQVJLUZ[YUVVRPKGB>;::9:<>ADGCBA;;>@AEG@@CDH>=BF@?>DIIKRUc\NGKMJLJIM>JMJ@OYGJQTRPRYgsvwtrpnkoonoplkf\TTZm}n_`emfjkxywvuusnknnllpstuxyujhmmplcbkcgkjlgikn_LRSZ\QPP^eZ_\WOVeypmrfcql\^dWZ[`QQTW^``hahtunbapxuqon~l}m|l{kzkzlznzqyqyqxqxqxpxpxpxpypyqzq{q{q{q|r|t|z}r}o|q{q|r|t}x~{|~{xvutttttvwy{~~}|~|~|z~z|z~w}s{r{r{r{p{o{n{mzmykyiyhyhzhyhyiykxmvsuyvuynlmmnmuqiydkXRQYjeosd^[XZ`fhrxztqsptukc_UQ`dbeihTEHP\aqrpidivutc`alsk\VX[^`TRMOQTVX\`goodYY[_}``djnookc\Z[\eqsphjpnnqswl^Vcw}p|ektxwvupe[imilqadnnkuzyyy{zywursjdgspnwv\QypTII_nltwyyxyz{zyyzz|zxvsrtwyzzzzz{wy{tplhdbbfkpwzwrnqx~{wuvwwxx~v~t}t}u}uvwv~owgqau_{b}i|oxsnollvm{kybx\x]x`q`lZpUu[yk}w~w~t}r}r}u}y~w~u~qml~m~o~r~s~t}w~y~y~v}u~x~y~y~x}x|x{x{x{w}w~x{zt}|wijz}{ywvuuvxz||{{xxtmmmhpfqgrlsuz{zwpojqnnseqah`h_oasipolrrommilpkrjmjkilililf~~~~~~~~~~~}}}}~~yvuvwutqonmnpqrsqnkhfdccdfhjlnptvutsutoomqx~y{vzv{v}xx~w|uztysztzv{vzuyu{v}vwxy~w~vwxxxw}w{y{z|y}xwuttrpnmllmm~n~o~o}o}o}p}q~oigkqroighih}i}h|l|r}twsokd^]^feZ`__dggc[[^^~^`aejnommmmkiilnqrpnoponkjlptvy}~}}|{yvuuwz{zxvtsstvwxyyyxxwwxxxxxxxxwwwwwwwwwxx~yyyyxx~wxusruqoqppomjiik|p{tvtssxzywzqyq{w~}saWQF<9:=<;;====?ACDEHLKGFHMPMIJMMIA;:::<@CEGMPJB?=:CORK><;73027AD?FIGDINUSKOROJD@<989:::9:;;=?@CHA?EBG>;CH@<=EKHJRY^W@DONKJIJG@NLJCMWHMSWUSU\hssrnopololkmpkib`ZTSby{ie_gpmcjtwvtsspnnnmnpssux{yrmmmljfhkdfmnjfhjm\MY_[[_TSVba`XFBLYgb^`bn{w[Zc\^``Q\Y]bdcgdqxuoaeuxuqnm~l}n|n{kzkzlynyryqxqxqxqxqyqyqxqypyqzq{q{s|t|u|v}u|r|o{ozp{q|r}v~y~z|}}zxwvuuuuvvxz|}}}~}|~|~w|s{qzo{n{l{lzlzlykyjyhyfyfygygyhxjxmwpvuu{sqmllmmmpod\a]WWZq[s]_cn`_gheln`]Qg[`fjf]_addbfjgb`T_k`mppkjqsi[_ehnqj_]`b`|^^`\X__[_adhd^`YY\cbcehjb^\VVY^ahmeibkojnurvxcSZu|vkjlprslbb_{^dimmlnpkcl{wrsvv{rlinrkbhux}ynMEkbW_\chghnsvrtz|{yyyz{yurnmqvyywyxxyyyvromlidahosvvtohm~}}t}ruxvruu~r~n}r}u~v~vxw~sylvayZ~]dj{qspqlvszryfy_{^|]|^yczg}l}r~w~s~l~j~k~o~r~s~t~v~tkgfkq~t~w~x~x~u~t~v~x~y~y}x|v{u{v|w}w~w{yy|x~zy{}~{ywwvuvvy}{}|z}x{zwwqkklfnggljt{xwyuvrwn{gyal]f`lctjupvtwrtpqnqmqlmkjec`b`e^~~~~~~~~~~yvuvwvuqommnpstutpkhfddcdegilnpruwurokfjlszz~x|w|v|vv~v~t|rzqzq{s|t|u{v{u}uwy|~{}w}wwvvvw}x|x}x~wwwxxvspnlkkjjkl~l~l~m~n~lfbdipqmjhfde}h{n{u|vvqomcYX]^ZVX^hmne[Zbg~f{ca`djoqponnmmnppnmnpqqpojjmrvxz{|}}|{xwwxy{{yxvuttuwxxyyyxxwwxxxxxxxxx~w}w~w~w~w|w{w{wzxxxxyxyzyzy{x|x{wwvtt{tsrsstrpoxprssys{t{xz{w}w|z|{{y{tzq{t}yw_E::97:>A?==??>==AEFHJNPLJJLPOJHHFD@=<<<>BEFIOOF;;AIKC;647841059@A<=?>?CGOMCDHGD=9668:;<;::9=>@?BIFAFAD@=DI@>@FMJKSWVL8EPJJIDHFDPJIHLSKTWXXVX^irolimooonjfjpkhdc^XQZrtdXeuqbclsqnosrrppqqqrsux{|wsqojjjlnagpkcjlpgY[af[_kW]Y[`d\VTZ\TPHEHXca]Xb_c__V`Y`ddnojvzvpgnywsoll~k}o|o{jzkykynysyqxqxqyqyqzqyryryqyqzq{q{t{t|t|s|q|o|n{nzn{p|s}w~x~y~z{}~~{yxxwwvvvvwxz|~}|~y|~y~u|s{q{o{m{k{iziziyhyhyfyfyfygygxhxiwlwnvptuqolkllmf[fb`ea\\]{]{bfjopnmjbdf\`NMOV_iiVU]jliiihjleiojmnmmmlkjaagjtylddghbUV`b]cb]cfged[`bYZW[kf][XUSPRW\]ij[i|uifssrw}r\Woxlfdbjnc^eayX`fc~`~h|jmj]evncdgfnb[[hoi]bsy{qYI@X~_[Z^pk\aVgxilwz{yxxzywspkkoxwpjosvxyxvsqrsomlqvwuronknsmottrpqsr~r~w~|{wzyw|p{c}Z`ij~qzuxsyw{x{r{e}\]bjqtutphccgjk~m~prkb_emquvurqsuw~y}v}u|s{t|v}w~wy~||{}~|zxxvuvvy}|y~pjk|rywuxpop^sdu{xy}wxuvrujtam^edjjtpyu{v{sypwntmqlojlhak^h`_~~~~~~yvvwxwurnllnpsuvurmhfddddfhjmnnmswxwojkootyyxwu~ttts~q}o|o|q}s~u}w}u~ttwxxw}v}u|u~uuu}w|v}v~vwxyzyurpnlkjjjjjk~kkjgccgoqnlidbc~g|n{t|usnmlbXXdfa[Zeqn`[]`diifc`ekprqponnmnookjkopnmlklpuwxy{|||{zxwxyz{zywvuuvww}x|x{x{y{x{x{w{wzwzxyxyxxxxxxxyxyxyxxxwwvwvwwwvwuwuwuwsxryrytytxtxtxtxrwsxvwyw{w~wv}w|v~vtwlxjyk{k{k|l{myozr{s|sxstusxwv|aH50156:?BA@@A@?>>AFIKLMPONLKOOJEC?>?>==>?CGLLSXI=AA?84358;=>>>=;=BCDDBABDCCGKDHBCCADGA@AFLMNQRM?7GJFFIAFHJRJIKMNNYXZZXZajqnZbjimpolbjqmkgb^[SUh}za[ism^`ionlmsvrqqrrsstvx{|{wtpjjlnmcjsl_kgbY[akgXcjSib`iog^^ca]bb[XY]\a[ade\_\^Zbbgtrpzzwsosvtqmkl~m}n|n{lzkzkynysyqyqyqzqzrzrzszsyryqyqzrzs{t{s{q|p{n{mznzm{p|v|x}x}v~v~wy}~{yyyyyxwwvwwyz}~~z~v~v}u|t|t{r{p{n{lzjziygygxgxgxfxfxgxhxhwiwlwlvntqrvo}l~jnnne\\_ddc``bekkZHimfa\\_YdcYQV_mk_acoofehmprqpjjnomkikolkijkoshcfjkd[YZUT\[|Xdjha_ZUZWUMMbYY`TSUPSVYY[ZXoqjbksqxzzweZpynhfd{mqb^a_{TZaa|_cghaZ_kaXXZ|ZrYTTYa\M\uxr]??BSc~^UHDGWeN\q_dpvxxxyzyxtqnmpurnidny~zzxwvvvssvwyxvsolnurnloqnnorrt|~zvwtqme`f~o~q~s~w}r|o}p}w~p]Zeovxwtpha]^a~c~h~npkaY\diprroopr~t~v}v}t|r|r|u}w~xz}~}~}|zyxwvvwz~}ztq~p|u|zwwxfwhw~xyw|wwvqoogqeojqpxw{x|u|rznxluksjsjsnd|[|]y~~~~~zwwxyxwrnkjlosuwvrmigedefgjllmlkpuwvroqsuuuwyvsprsrqnpqtvwtrqroqttt}s|s|s|t}v}u~u~uuwxxvssqpnmmlkjiihiihgfiqrmjhd_`f}o}t}vtpkid^~_ejeZWbha`deacfeb``flpqpnmmlllmnljknmkjknpsuwxy{{|{zyxxyyy~z~yxwvyvvwtwuxtxsxsxsxsxsxswrwrwtwtxsxsxsxsxtxtxuxuxtxsxrwrwrwrwrwrwqwqxpypyqyqxpxpxoxoxpxpylylyqxqxnxmxmymzk{kzkzjzjzjzizjzk{l{mxmxoyn|gJ:322679>BCCDDDBAACGJNNLLMOPNONGA?<<>>?>>>AIQKNVKER`]G641/11112333685777>=622596323679=BDEGFFEFFFHLOOMLKKOQNKD=<<<>@?=<;>FLBAMMHKME:554211011222465666:CG@::<=:8657;?BBDGFEDDFHIGFLPMLMOOIICEEFFCCCEKUJIE?@?AACGIIHNXWOKMMLR`]]]ZY_msn]beainlmlornkhd`^ZSZk}tfuk[WarljkossqqqrsvwxxyvsqommlmnonnlnnniecjialfahdbfblfZ[_c]YUZZ_]\^ekdchaeic_hhelnowwvsqqrqqommno~p}p|n{lznyqyrzqzq{r{s{s{s{szsyryrxpyryrzr{r{p|n{n{mzmzmzn{q{q{p{n|o}q}t~x~z~yxxyyyzzyxwvvwy{}~||x|u|t|s|s{r{q{ozmzlykykxjxixixiwjwkwkwkvlvlvkvlvmtnqsoxo|on^TU_cde{glnutP:BFKOUVV[[`ST^itxk^TCEJYbjcNcXhovvrnmkkmpwtpph``aglg[VTUZ}Y^agnnaLFJJNRSNEHU_aWKSW\_ZXUSXaX_`]aowxxunkzmWWgjouup`^[Y]add^ZWTR[aVSWY^^~Y{OHOYQWpmliKH_gRQZh{cMMdxhPM[kvxyz{shprqnjkpvxwvrqx{||{xvvvuvxxwvvuvwwwwvtrqrstwtspoqojkmpuwvointof_}_}ktvuunjrj~Z~W~[~c~j}n}n~mh\PKThnoopq~q}r~t~t~t}s}r|t}w~z}~|zyxvstvy|}{yvwxxyxxyyyy{yywxvxtyrzq{r|q~qn|jyguct`w]yWs`pqnw~~~~~|yxyzzytnkjkosvxvqjfdeeehpsqlhlnorsttssropruwwrnprlighilqpmjjjkknrttsr|szu{u}u~vvvwwustsqppponljigggijkl}n~oheiliddh~m~pwumih~i~igd`Z]fpohgeb]`c`_aekmmnnnmmmmmnoppopqstvvwwxy}zy{u{t{szsyrxrxrxqwqxrwrwqwqwpxoxoypypypxpxoxoxpxpwpwpwpwpwpxpxqxqxqxqxryryryqxqxqxpxpxpxpxpxowowoxoxoyoyoynynymzmzmzlzkzkzkzkzkzkzjzjzjzjzizhzhzgzg{g{g{g|g}c}]SE62335899>DGHJJJIJJJJLNPPLJGKPLF?:;<<=A@=98:=>=EMG?;:864333210012345657748BHA87::::989ADGGIMV]XRNPQPU```_[W[mtqcfdaiilrsolkifc`^]VWeyzom_VYivgimttrqqqppsvwwuqmjhhjlnnllqnhhigfglefihfkfiibiaY\cd_\[[V^^_ajoojeeilfdnhglprwyxxutrqppoopp~q}p|o{nzpzszrzrzr{r{s{s{t{t{sysyrxqyqzqzq|q|o|o|n{mzmzlzlzlzlzk{k{k{m|q|t}u}u}v~vwwxz{{zxxxxxz{|}~}z}v}t}s|s|r{p{nzlzlzlylykxkxjwjwkvkvlvlvlvlwlwlvmunsrrvs|toc_`bgikoqp{fKCEJP{XXP\_NQ\kswupTG>6?WiroZIO^iyxqkihjmtwwsod^_cmodVMLLJU_fkpg[SGGLS\VVYX^cbSKLQ_edgc`^SZa`cnwxyz}yvv]LQ]emttrfecWY^eaZ[[[Yd~l\RUZ_]}YWSSUNB>:77668>>:9:::842123310012357988847AGA96899:;::;@BCFGGFFGIJMNMOTUUPXZQQKBGGHGFHGRONLEKH?@GDDDHU\\USRSUUW\c`a]VYkpnfd`beeoojhggfdb`_\ZZ`q|vfZXcsrbjoutsrrpooquwvuqmgehlnonlionga`behkgkljjnjpvogiidbaaced[_`cfnqtpifgllimgdouvxxyywurrqqppqq~q}p|o{o{q{s{s{r{r{r{s{s{t{t{tzsyrxryqzq{q|q|p|o|n{mzmzlzlzlzlzj{j{jzk{n{p{q|r|r}s}s~uvxz{zyyyyyyz{|}~~~z~v~s}r}q|o{m{l{l{lzlzlylxlxlwlvlvlvlvlvmvnvnvmvmunupuwumegfcklossosYAIHLQYPPa[T[mmtyxr\E>=<<<98767755>G>47:<=:51/2443101237:=<:868AD>96667;==<:=ACEEEEEGJLQRSSTTXPQYVUN@GHKJIJKXRPPKTKAELFCEK\^XSQSTXWWWc^c`Y\imjdb_aadnc`_ddca`_][a\[kzzkabnti^jrutsrrqppqrtuvuqmjlopqponqpjd`_dlokoonorrspejnoh]Z_e`fbcdginorpjggmrnmggqxyvvvvtrosrqppqq~q~p}o|p|q{s|s|s|r|r{s{s{t{t{tzszsyrzrzr{r|r|q|p|o{nznzmzmzlzl{j{jzjzkzmzmzm{n{o{o|p}q}s~u~w~xxwyyzzzzz{|}~yu~p~o}n|l|k|l{l{m{mzmymxmxlwlvlvlvmvnvovowownvnvnvpuzrpplgmorutpqieXQSUZ]e\N^]lorwvbLGAWjiqwf[W\kyztrmiikqu{zvo``cff[SURHIPYbkmc[SNORU[Yy_b^^lqeTPV\^xehnyytsrqvxsppux}~}|dPVZafmpwzzxhkkecczehkjntk[[[^^~aeowrk`ZLSUVfwq[Rcy|qa_hwpt{yyyzyyxxxzyxwvvvtsrsy}~~~}|{xrnpsvwwwxwwwwwwwvuvvvutssstrqppppqpoommlhecdlvxwwwvvvvustsqhdhmj_Zmxwwxxwxxxxyyyz{|~~}|{zzyzzzzywtuxz{{{{zzzzzz~x~v~trrrqqrtsmovyy|yxxxyyxwwwxxxwvuplgedfjnprsrsrrrqqpooomihjmnpqqrrqotuuqonpqmhekrtuvurqss~r}w|x|v}u}v~wwwuroljiijjhhiigeefifbafd~e~iief~e}d}dgiihgecbcffcddc^YZ`a^^acnwy~x|v|v|v|v|w{wzwzxxxwyvyuztzszs{szryrxrxqxqxqxqxpxoyoyoxowpwpwpxoxoxoxowpwowowpxpypypxqxqxqxqxpwpvpvpvpwpwpwpxqxqxqxqxqxqyqyqyqyqxqxpxpxpxoxoxoyoynynznznzmzlzkzkzkzkzjzj{j{j{j{j{i{h{h{h|h|g|g}g}g~f~b[QD8212369;>BDEINPRRSTTTSRRQRTURMOMFDA=:;;73026755?E<57;>>940/2444200259=AA<878AB<97546=@@?:<@CEEEEEGKMSWWXTTZRCTZWP>DKMMLKQXVUQRUOFINIGMY\\TSRSTYWYU^\b^]djlje``\ceha\[`aa_^]\bd_Ydv|mefkidcknsssrrrqprrstppupoppqrrrqqqnifgkpppqrsttspmghkmi``dfcfghhjkmopolkknpnmhlsyyvuuuspmsrqpoqrq~p}p}p|r|t}t}s}r|r|s{t{u{u{t|t{s{r{s{r|r}s}r}q|p{pzozoznznzn{n{n{nzmzkzjzizjzkzn{n|o|p}r}s}s~s~vwyzzzzzyz{||ztq~m}k}l|m|n{n{n{nznymxmxmwmvlvmvnvowpwqwqwpwnvmuosurponnkvxwssusfad^bkc[fg]opstsi\MF_wuaconY\qzjlulhgkpvuyvibbgjeYTKGHJR[`ko`OPRRSVY{^|^ZVamnidVRT\dgkv{|truwrqqqsv{}}q[V^hrxzwvy|zsmgkoyf{jqtxwriijliigluwe_gc]TWmzqh\^qtgfmpswy{{{xyxxvwzzzyxxxwvsoovy||||}}xoltvvwwwwwwwwwwwvvwwwuttsssrqpoppppooomkgdbcjwxuvwvvwwwwxwvusrojgnvxxwwxxxxyyzz{{||}~~~~}}{{{|{{{z{yyyz{|||{{{zyyyyxxvvuwxwxxwxxyy|yxxxxyyyyyyyyxvuromkjiorsststtutrqpopqqqrrqpoqsttrqssqnmmljhgfmstuutqoront}w}w|v}trprttqnmkijkjkmml~e\`fd_`f~`}_~gkih~g|g|c}efedccdeba``abb_[`eedccbo}y{{zzyyyyyyyyxzwzv{u{t{s{r{r{rzqzqzpypxpwpxoxowowowpxoxoxnxowpwpwpxoxoxoxoxowowowpxpxpypyqxqxqxqxpxpwpvpvpwpwpwpwpxqxqxrxrxryryryqyqyqyqxpxoxoxoyoyoyoyoznzmzlzkzkzjzjzjzjzj{i{i{j{j{i{h{h{g|g|f}e~b`^XMB:301148;=@EIHKPSUVVWWVVUTRSUVUQQPMKD;87753//255358548CF>659A?899636@A@@<=@DGFEEDEJMUYZXRU[WEV]YTEJPPRQNT[ZXRTXULKOMMV__YQTTUSXX\X[ZbZahjlmi^\^bdf]Y\___^]\]dc`]_q{leddadhjmqssrrrssvvsqlosooopqssttstrqqsuusrruvuuspollklliebfgjlmllmnonmooooonliqvxwvuvxtqlrrqpoqrq~p~p}q}s}u}t}s}r}r|s{tzu{u{t{s|s|s|s{s|s}s}r}q|q{qzqzqzpzozo{o{o{n{nzkzizgzgziylzl{m{n{n|o|o}p}r~uwyzyyyzyz{|~~~{vp~n~n}o}o|o|n|n{nznynxnxnwnwnvovpwqwrwswrwpvouptqssrqpoozzwvuyvqmnkmqliqrgkmqrrhZG:4//0246642125:>AEB858@>7:;837A@=@>?BEGHGECCGMUYYVRW]]KVZ[YORTQUUQV]]ZTW\[NJNNV_c`WQWXVSXZ^\^ZaXahiknl[Y]^ceYY`b`__^]_dafc]m}neb_]hllmqsrpoortwwufmttpnnoprstttvwvvwwvtsstvttrmnonlljgbkolkmopnooopmoqsqonmjrvuusstwurnrrqppqrrq~q~r~t~u~t~s~s}s|t{uzt{t{t|t|s|t|t|t}t}s}r}r|r{r{rzrzqzpzp{p{o{o{n{kzizgzfygykykzkzlzlzl{m{m|o}r~uxwvwyyzzz{}~~{vsrq~p}p}o|n{nzoyoyoxnxnxnwovpwqwswswswrwqvquqtss|rqpq|zwvuxvtrrtwusnfnpfW[bcKFB;Hketiqsmnn_Z]SkoooprsuuroonlnngYVTSNOSYalou]QRVY\bgdflklkka_`Y\dilifikuxxwyzzwvvy|~wgbkvz||xsuvvoknz|oclvxtmkw~sjvnnqlWVkseUfztd\WT]r}|zyjkpwzzyyyyyy{{zyyyxvqqsvy{}}}}~zqnssuxxwwwvvvvvvvvvwvuttttssrrqppppppomjfb`agvwwwxxwwwxyyyxxxwwvvwzyxxxyxxyz{|}~~~~~~}~}~}~~~~~~~~~~~~~~~~~~~}}||{{{{|}}}|}}}~~|{{zz}|zxxxxyyyzzzzyxsolloqpomlnmoprssqonmnqrsssrpnnnoqsrppomlprnigilnmlklorpniikorpkedgijlkjgghjlnl~jfgmmnhdchc~d~edfilfa_\Y[\bgigg~g}d}b~deeb`^aegaa}rwzt{t{u{tzt{t{s{s|s|s{szrzrzqypxpxpxowpwoxpxoxoxoxnwowpwowoxqxqyryryryqypypxoxowoxpxpxpxpxpyqxqxqxpwpwpwpwpwpwpwpwpwpxpxpxqxqxqxpxpypyoznznzmzlzlylzmymymzmzmzl{k{k{kzjzjzjzj{j{j|i|i}h}h|g|f|e}c~[L@:763233459:;>AB;56<;7:;936@><@@BFGGJKFBBFMTXXURW]_SWVZ^XYZWYWUV[][X]a^OIMP\dd^UQXXTSZ[^\bZ_Ybffglk[YYZ`cXZcecba___bbif_n}pe`_aknmnprqpprrrttrntrhmopqqsststvwwtqssuttstrqoloopmlmikpoonprtqqstumoqtrnpsoptrrppnproqssrrrssrrs~s~t~utt~t~s}u|t{t{t|t|t}t|s|s|s|s|s{s|r{r{r{s{t{r{p{p{r{q{p{o{l{izfzgyhykykzjzjzizi{k{l{m|p}r~t~t~t~uwyyzz{|}~~|{zwus~q}p|p{pzpypyqzqyoynwovpvqvrwswswtwsvrvqurswr|poq{zxxwvtqkikpkon_ei\JL_kYOE9964212321259<>>>=;96300124688643249>?>=:669858:957=<<@BFKIFMNGBBGMTXWTRW_^YWUY_[\\Z\ZXTY[W]dcZNLQ\b``\UOWURS[[[Zb[]`cdb_ikZ^UX^aY[dgeda```cdig`n}na^`flonoqrqqrsrrtuttwtpppqqqstsstuwwsqrsuutsrrrqppppmmnnoqopqsuusruvumpqtqnqvsqqqnoqomnmsqqqstttsrttutttt~t}t|t{s{s|t|t|s|s{s|s|s{s{s|s{r{r{r{t{r{p|q|r|r|q{p{m{jzgzhzjylzjyiyhzhzhzizk{m|o|q}q}q}r}t~vxyzz{{|}}}~}{xur~q}p{pzpzqzrzqypynwnvpuqvrvrvsvswtwswrvqtpsrqvo{p~uxyyvmom\MZ^\deZZWLHMc~tkYD8>vLzRWimga_hknrrtvltvyz{wsqqolhgg`]dZ\_dhkcTWVZfgmrpd^[Y[^fnb\cnYWebdek{}}||wpnswyurwupz~zzxtmjgknqvyvtvqsqf^fwufkv}rhfkstpquz{ypgnmlsjegum\_kuxxxyxyzyyxvutsnmllnvz}{{z{xcFJWfrwwwvvvvvvvvvvuttttttssrqqppqqponkifb``dovwxxxxxxxxxxxxxyyyyyyyxyyyyz{||}~~~~~}}}~~~~~~~~~~~~~~~}}}}}}}}~~}~~}~|~|~}~~}}||||~}||{zyxxyyyyyyyyyxuqkkiknnmllpsrpppqqkfdgkmorqppiknoppqqpnmoqqpmloqqmmnnoomllkjjkklllopqolgdbabilic_`fqqfccillgbchleafgfddg_[_fg~fffc`a`abbe}izqvxr{p{qzrzrzqzqzqzqzqzrzqzqypypxoxoxnwnvowowoxpypyoyoyoxpxpwqxryszt{t{t{szryqxpxpxpxoxoxoxoxoxpxpwpwpwpwpwpwpwpwpxpxpxoxoxnxnynynynxnynynynymylykyjyjykzkzlzlzk{k{j{j{i{i{i{i{i{i|i}h}h}g~e~e~e~d~cZA4/--.148<<<<::>BHLRVZ[\[ZYXWUUUVUUSROF>:75421233357:=>?>=:74101345777654437?@;876797469857<<=ACJNHFMNHDCHOTVUTT[`^UTXYa_\^``^[PTYYae`VOPVa`Z[ZUMRRPV[]X]`[]cdegdhk\_UX[`[Zeeba``abehjgbo{k\Z`inoonrtqruuutuvvwxvsqpprsstttstuuvuuuvussrsttssrpooppqrrrsuwvtsuwtnpssqnqxytqomopqnkiqlmqtuuttuvuuuuuu~t}t|v|q|s|t|s{s{szszszszszs{s|s|r{r{s{p|o|q|r|s|r|p{m{jzhzj{lzlzjzhzgzfzf{h{jzl{n{o|o|o|p|r}t~v~xzzz{{|}~~~}{yyv~r|o{q{s{s{qzpyoxnvovoupuquqvrwsxswsvqvptosopspxr|uxvmgtrSAXUT`cUT[[IB^}zofCFKWzTkkonhZ[eomj\^^lswy}~|yvsmfge_cfagiic~]ZSQQWbiqrq_MSUUZmp`YSaVVka[]kz|}~|tk_jzynotvsz}y{xupontxwmjnrrow{o\Vovhirniuuw{|zzy}}}tihrm`V][yoflntxxwwxxxyywtsrsoibfkv{}|{y{xm^dlntwwvvvvvvvvvvvuttstttssrqqppqqpomkheb``cmwxxxxxxxxxxxxxyyyyyyyyyyyzz{|}}~~~~~~}}}~~~~~~~~~~~~~~~~~~~~}}}~}~}~}|{||}~~}||||~}|{{zyyxxyyyyyyyyyxuqoonpqooonnqonppqrmgfhknpqpptpppssrqrromlnppmllmnoprssolllmoomkklmooomgd~babcimiecdgmk`_ahlkiecbgiklqmjqvjbcdffec^]abccc~f{mwutzq{qzqzqzqzqypypypyqzqzqyqypxpxoxnxnwnvowowowoxpyoyoypxqxqxryszt{t|t|s{r{rzqypyoyoxoxoyoyoxoxowowowpwpwpwqxqxqxqypypyoyoynynynynymxmymymymylxkykyjyjyjykzkzkzk{j{j{i{i|h{h{h{h{g|g}g}g}f~e~e~d~e~ecM90---/49=>:9:OSPY]TTNBH;^sycGf_a~Uiturld[\cbiZHQdntwz|||xrlfc][befmzomaTSUTSWbjof_^VY[X]idYTQQT^oic`cir}}zsi_dstlqtvy}~|{yzyyw|{pjlonoxoZQNaruwqaTdtz}~~|x}}ztkbptn[V`|wssjuxxxwwxxyyxsnmpojcgnvxuwx|yuvrlrtxwvvvvvvvvvvvvvttstttssrqqppqqonljgda__blvxxxxxxxxxxxxxyyyyyzzyyzzz{|}~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~}}||||||{z{{|}~}}}|}|{zzzyxxxyyyyyyyyyusqonopqqqqnmmlmnoprpnlnpqqpolrssstvsrssnkfjnnmmmmmnoqrronnnqtuqljiknmkjjj~g~dbcehgfefgikdbbgknkgb]`ltokjlsxpffdgheb^abcde~c{gxouwryqzqzrzryqyqyqxqxqyqyqyqyqxpxpxoxnxnwowowownwnwnwnwnxoxqxryrzs{t{t{s{r{rzqzpyoyoxnxnxoyoyoyoxowowowpwpwqxqxqyqyqypypyoynynynynymxmxmymymymylykykyjyjyjykzkzj{j{j{i{i{h|h{h{g{g{f|f}f}f}e~e~e~e~e~fhU=1---.28<;669=BFKMRWZ\\\ZYWVVWYWRNNMF>9655566688788998865432123469:855655439@=634698434447<>@CFJIILONJHJPWWUTUZa\TYc]VaYR]ace\LQZ^d_QPX[YYTRV]XRPS[\\\Z``bda_dddljc\Z[[`^Va[R[^`abfmmecqvcXYblqnmnuursvwwwwxxxxwwvutuutttssuxxxxxxwvuuvwwwuuvutsssssstuvwwuuttttsssqrsvvrqoqpkmpopuppqqrsttvvvuuuuu~u~t~t~s~u}q}r|t|t{t{szszszs{s|s|r|r|q|p|r|t}t~s}r}p|o|m{m{n{mzkzizgzfzezezgzizk{n{n{m|m|n|o|n}r}v~vuxyyz{|}}}||{{|{~w}q|q|t{rzqypwownvmvnuovpvqvqvrvqvpvoumtkslsrszsssj_E<>IUU_hZUWZPCdjsohlgjmsvwrlYX][XJEHOaouxzxxxtmfigcabgl~l{i~f\SQUY[]fjja`\P_ea`]ZUQPMYqvqcPQ^p{vpjhjnqooruxyyyyz||zv{|yuqpqovuVINasvsqnjqtwz}}{vzzzxrikjo`Re~}x|wvxyyxwxxxvuukhlrssoqtrkmx|tpsupzyxvvvvvvvwwwwwwvtsstttssrqqppppomkifc`^^`ivyxyyyyxxxxxxyyyzyyzzzyzz{|}~~}}}}}}~~~~~~~~~~~~~~~~~~}|||{zzz{{{zzz{|}~~~~}}~|{zzzyyxxxxxxxyyyyxtppooppqqrrqnllmopqrrrqrsrqpoqjhomossqqqkhchnnnmnomkmoqqppppqrrpkhgilkiiii~hfdcehgfddddiiihekmokb\`ktrlhkmlieediolfcdefig~dzgvqswqyqzrzryryryryrxrxryqyqxqxqxqxqxpxoxoxowownwmvlvlulumvnvpxqyrzrzrzrzryqypyoyoynxnxnxnxnxoyoxowowowovpwpwqxqyqyqyqypypyoynymxmxmxmxmxmxmylylylykyjyjyjyjykzj{j{i{i{i{i{i|h|h{g{f{f|e}e}e}e~e~e~e~eedW>0.--.26:9348=BGKNPTWXXZYUTSSUWUNHHHB=865469;<;:987886544444334469;966666548??733699655458;86546=:8775578877777679=<87677767=@8336:;976568<:::;9779:886666669;74359;:87678001111258974348:;<===<;:@GB=ADEEB?=;:::::;96?KKGDB?<;9769>CB>;>@<7544477655566654358::87778<;<<;;:76;?BFB=ADA93311666544663334579987777BB?=;;<>?>>@CB;@>DE?:5478884212465447EFELPMJFA?>97:;843322232/1345678755756<@FKMLMSYZW[`^\\`chgfhe[XT]aadb\b`W^fY[[[\_fieXR]Z`bbca\\bbke`be\VTZbiaZbmdaaig`cXL\jkkkhiqojiilrx}~~~}}}}}}{ywy}~~{yyyyyyxwvvuuuttuvvwwwvvvvvwwwwvvvuuuuttuwwwwwwxwuwwxvsrrqomllpqpoqrpnnruwwvttuuvvvvvwxyyxut~r~p~p~p~q~r~t~tvvuuttttr~q~p~ponl~k}k}h}f|d|i|f|k|h|e|e{h{j{j{i{i{jzjzj{j{k{n{n{l{l{l{k{l{m|n}q}s~ssssstv~y~z~|}}}}}y|u|s{tztyrxownwnvnuotpuquptptormqlqlqkrkrjsjsnurvvwywywxwwwwwwvxvyvzv{v{u}t}s~s~srqqrrponia[`gsvvxyyywtsrolllpppolihfbchq`Wbf_a_a]^bb`ekh`^irkcszsqnlkcorxzvtsvui`ijjeiooklrs]M^|seXcuuruusmgrtqu~}tpxz{{tjyxigfjw|||}vyyxxxxwvvusqssuruxz|~}{yz{|{xvtutttu~vvutsttuvxyyyyxwvuvxxxvtsqpoooopolhd`]ZXVTSXfwzzyyyyyyzzzzyz{|}~}||||||||||||}~~~~}{{{{zzzz{{{|}|||{zzzz{||}}~~}~~~}}}}}zz{{{{{||{{{zzzzzzzzz}zzzxzvzvyvyuyuyzwtmmmqrsusqjhnlkkiiknqprstutsuttvutromkjjlljlnonqsomlmoqqponlkkklmnmrsihcco~qoonmlkkjihggiifcacgijllnojgeddfgigccgkgeadhxmtpprmtmumvkvkvkwkwlwlvlvmwmwmwnwowpwqxpypypypypyoxnwmwlvlvlvmvnvmululukujuithtguguhujvkwlwmwnxoxoxoxoxoxnwmwlwlwlwlxmymzmzlzlykykykyjyjxjyjyjyiyiyiyhygzgzf{g{g{h|h|f|f|e|e|e|e|d}d~deeeddd~caYF::216::859=<=:4102587658<@?778556789:=AFKPQQSSOJGFCDMRPNKD?A?AE=9??>InqfVf~|ssqnhelllgmsolt{|yuu~zmjpqytutjbvxxyxwwwvusqnortwyz|}{xwyz{zxvsqprt~u~vvutsttuwxxyyyxvuuvxxxvusqonnnnoolgc`]ZXVUTW`ryzyyyyyyzzzzz{|}~}||||||{{{{{{|}~~~~~~}|{{zzzzz{{{||||{zzzzz{|}}}}}}~~~~~~~~~{{{||||{{{{{{zzzzzzzxzuztzszszsyryqyrx}vronoprtuurkhnlkkkilpssssrssrtts~v~vurmjhgikmmoqqppppmhktsrqpnlkjjlmoppomgdehmlkjknlmljighjida`behgefkpmigddhikfabdfeecg}lsqotnunumumukvjvkvkvlvmvnvowpwpwowpxpxqyqzqzqzqzqzpynxlwlvlululumulululukujuithtguguhvivjwkxlxmynyoypypyoxnxmwlwlwlwlxlylylzkykykxjyjyjyjyjyjyiyiyiyhyhxgyhzhzg{g|f|f}e}e}e}e|d|d|d}c~ddeddcc`YM>437605776?CAB<411489:999<>?50234437=BGMRX]abccb_ZPFFMRPNPNE>?@><;>GLDBB;;;52013552/0345666533458>CIIKONQWXY[]^^aeb_geb`]_`Y`dZ]gcUYdf\_bd]\cmeWU^`_fddda]efnf`ic[YZV_jeaclhbabccb[Y_fklkjlcf_gnux}}}||||||{xusvz|{yyyyyyyxxvvutttuvwwwwwwxxzz{{zyyxwwvvvvvvwwwwxxxwvtsrqomllmmmnnljlllijnqrssuuvuuuuvvvwvwvvut~s~q~q~p~q~rsssttuvwvusp~n~l~j~i~i~i}h}h}g}h}h|i|f|d|e|h|i{i{i{i|j{l{m{l{l{m{l{k{k{k{j{j{k{l{m{m|m|m|l|l|m|o|q|t|v|v|x|y|{|~|}|y|v{szqypxpwovoupuptqtptosnrmqmqmqlqkrjsltnurwvyxyxyxyxywxwxvwwwwvwvwvwvwvwvwwwwwwwwvvvuwuxv{u~qoo|syvyxyxzyyzzz|y~wutt~t|t|t|s~ssrqpnmmlkjd[TW^eqpXPU[\cgf^`inrrqjmjfde_`qsvzzwrqqeUbooprqmhh\^P=A_pf_mwz{qkgddgedXTkolo{vopkmnfvuatsLXvvswvwxxwusqlkswxz{{|{wwz|{yyvspos~v}w~wvuttuuvxxxxxxwvuvwxyywusqonmmnookfb^[ZXVUUVZfvyyyyyzzzzzzz{|}~}|}}}|||||||||}~~~~~~~~||||{{zz{{{{||{{zzzzz{|}}}}}}}~~~~~~~|{|}|||{{{{{{{zzzzzzxztzszrzqzqypyoyqx}vsqprsrstsrolnljjjkmorsrqopqpsqr|wzx|tponlklmmnprqponmlkmoqqqponmllmn}p|q|r|q~pommnonnnn~pllkjjkjjhc`^`cdcabgnmigedjkkfbceeeefzkspotmvmvovovnvlvkvkvkvlvnvnvowpwpwpxqyryryqzqzq{q{pzoymxkwjvjvkvlululultkujuiuhthtguguguivjwjwkxlynzoyoyoynynymxlwlwlwkwkxjyjyjyjxjxjyiyiyjyjyiyiyiyhyhygygzgzg{f{f|f}e}e}d}e}d|d|c}c~ccdddcb_VNB6/28:1468:CGEE>5347:<=====;<4023345@NWXY\afijigggfd^VSVSLPRMFCCA>>@GUPAA<;>86413773/045666643237;@FJGJOLOVXZ\]]][^]]abgd`_^]ce\^g`V_hg`YZh^Yam]VZbcc^befd_gfhdch`\Y\U]jheclhedcced`_`dgijjg[`lrtu~~||||||{{zwttuwz}~{zyyyyyyxwvuttuvwyyyyyyzz|||||{{zyyxxxxxxyyyyzzzyxvsqqolklmnnnmlllkkhilopqqtuvuuuuvvuutuuvvut~r~q~p~pqqrrtuwxwwuspo~l~i~h~h~h~h}h}h}g}h}g|f|e|f|h|i|i|i|j|k|n|n|m{l{l{l{l{k{j{j{j{j{k{l{l{k{k{j{k{l{n{p{r{s|s|t|v|z}~}}{}x|u{syqxqwpvpupvpuququqtpsnrmrmrmrlrkrktltpvuxwywzxzxzwywywxwwvwvwvwvwvwvxvxvxuyuxtwswtwtyuyvxvwuvtwuxvyvywywyxywxwxwxwwvwuwuvuvvvvvwuxtytzs{s}s}rzr|q~qnhb``hpodTRV]efa[donnslZbilnje^rvwz|{rib\[ktroorthd[>59?TkdXPN]sticceg`ZSLl|riuxd^clpgy~yZfpEL[qrtvyxxxwutposvwx{y{{xwxyxxxvrpqu~x}y~xvutuvvwxyyyyywvuvwyzywusqonmnopplgc_\[ZYYZ[]cqw}y}y}z~zzzz{{{{|}~~~~~~~~~~~~~~~~~~~~~}}}~}}|{|{{{{{{{zzzzz{||}}}}}}}}}}}||||}|||}}}}|{{{{{{{zzzzzzzuzszqzqzrzxzwyrxxvusrtvuqnnqpmiiijjihknrqommnnnkkp}r}rssrpqqponoooppporojhorqqqqp~o~n}o|pzrysxtxtytzvyuzu|u~t~t}t{tzs{t}mkjkkmmljda^^`a``bdiihgfehigcchih~h|hylmpntnumwnwowowownwmwlvlvlvmvmvnwnwnxoxoypyoyoynynymymylxkwjwivivjvkujujujtjujuiuhthtguguguhvivjwjwkxlymymynynymxlxlwkwkwjwixixixixjxjxiyiyiyixixiyhyhyhygzh{g{g{h{f|f|e|e}d}d}d}c}c}b~b~bccddb^VH>60.16;567<@HIEB;558;=>@BBB@>>500017FVbgdbdhhjkhfcbdfghgbZSQSUPHDCA?ADPL>C?:?=>=33784/157666643459=CHKGJPMOVYZZ[__\__`\afdaa``aa_`fa]hkfaZcodVec[Y`dei\]cde`ec_^fc]\V^V[ikfbkghfbeggec_`cekleVe{uss|~}|}||||{{zyxxwwy||~zzyxyyyxwvuuuvxy{||||||||}}}||||{{zzzz{{{{{{{{{{zxvtsqnkklmmmkklllkiiknpoortttuuvuuutttttuuur~q~o~pqqqqsuwwvvttrol~j~h~g~h~h~h}h}g}h}g}f}f|g|h|i|i|i|j}k}n}o}m|m{l{k{k{j{i{i{i{j{j{k{kzkzkzkzkzl{m{o{p{q{q{q{s|w}}}~}~z~x|u{szryqxqwpvpvqvrvrurtptnrnrnrmrlrksltnuqwtyvyvzwzwzwzwywxvwvwvxvxvyvyvyuyuyuytxtxuxuytyuyuyuxuxvxvyvyvyvyvyvxuyuxtxtxsxrwswswswtwuwuwuwuwvwvvsvuvvvuvws|qmlnqnbPMUX[ZULUioeoud_agkkcctuy|zi]YZbpsqmkmtigp`G76Qf]OI[s|umfb_^YTQNqzij|ub]fvxqwvQZr]NL_`nvyxyyxxxwutuutuqtvyyustwwvrpqtw~yywvuvvwxyyyyyywvuvwyzywusrponopqqokgdbabdegikn{tywxxxywzy{{{~{{||||}~~~~~}}|||{{{{zzzzzz{{{{{{|||||{{zyyyz}}}~~~~}|||||{{{{{{z{ztzrzrzx||{yxyvx{wusuvwsnnpqrnmlmljgknqomllmmnkjoq}stsr~s~s}t}t~sqommoqrrrml~q}s|t|s{sztztysyrxrxswtvuuwuwuxvxvyvxvxwxwwwwvwuwtvuwwqyp{n~mkmnmjea^]^^^beeefhhgeeecaf}kzmxltlpokrjtnumvnwoxpwpxpypyoxnwmvlvlvlvkvlvlwlwlwlwkwjxjxjxkxkwkwkwjwiwivivjviuiuhuiuiuiuhuhuhuhuhuivivjvjwjxkxlylymymylxlxkxkxjwiwixhxhxixjxjxiyiyiyiyiyhyhzhzhzgzg{g|g|g|f|e|d|c}c}c}b}b}a~`~``abbc_RE:31/-/39:9:@FLID=747?DE748:5027865665467:?DJLIKQQPVZYXY^`_a`d_a`abca`]]adgfemjec]lf_[`_^]dcbhcV[`d^b_XXc`[YT_YZgkfajehhcfgihd\\_aioeYrwonu|}||}}}||{{z{{{yxyz}}{zyyyyyxwwuvwxz{}~~~}}}}}}}}}}}}}||||||||||||||||{zxwuqnlllnonnmnnmlklnponprrstuvvvvtssstuuur~q~p~p~srqqstuuutttrolj~j~h~g~i~g~f}g}h}h}g}g}h}h}i}i}j}k}l}n}n}m}m|l|k|j{i{g{g{h{i{j{j{jzjzkzkzkzl{m{n{o{o{ozozp{t|z}}~|~|}}|z|w{uzsyryqxpwqwrwsvsvqupsprorornrnsltmuovrwtwuyuzvzwyxywxwxwxwxwxwyvyuyuyuytxuxuxuxuyvyvyvywxwxwywywywyvywyvxvyvxuyuytxsxsxtxuxvxvxvxvxuxvxuxvwwwvwuxvwvwyvzuxvvtxqjZX]XU~SNMGTheozojnuvsehpty{|vf^[^ipnnljlla`vx^;>cZUJE\v}tpjaUOPSPNu{pe}|mY[syq{dFW|uE/3Cdtwxzzzzzyyyxtpnmoqvxuutsqprqrtvxxxxxxxwxyyyyyyxwvvwxyzxvuut~s~srsttspmllmo~q{svtuvtwvy{y}zz{{||}|||}}}~~}~~}||{{{zz{zzyzz{|{{zyxwwwx~~~~~~~~}}}}|||{{{{zy}xsyv{}~|zvxrzwyusrsuspppstrspoqnnpsroonnmnnosqqt~t~s}s|t{uywxxzw~vqljnrtt|tztxuwvuvuvuutvtvtwsvsusvsvtxtxtysytzuzuzuztytytysxsxrwrwrwstutxq{n~m}m|n|m|l|h|d~b`__aceefgiihggghi{kunspppnqkrjsjumumvnwowpxqyqzpypxowmvlvkujujuiviuiujvivhvhvhwjwkvlvlvkwkvjviviviviuiuhuhvivhvhviuiuiuiujvjvjvjwjxjxkxkxkykykyjyjyjxixhxhxhxhxixjxjyiyiyiyhyhyhzh{g{g{g{f|f|f|f|e|d|c|c}c}b}b}a}`~`~```__YN@521///029;<=CINLE<648>ABCGLMNJFB;219Nfmlkhhjf]`_VRQPOLOV[afgfcad\UKIIA98COKDA:>@CI@68:6237975565689<@EJLLNRRPVZYVV_b^^`gabbbbge`cbcejljlieeik``ab^`bebZcbXZ_a[^_WT`]ZVS^ZYgja`hhfbedehh`WX\^hmd`pvnmv}}||}}~}||z{|{{zyxy|{~zyxyxxxxwwxyz|}~~~~~}}}}||}}}}}}}}}}}}}}}}}}}}}}|||{wuspnmnooooonnnllmooooqrrttuvwvsrrrtuutrroprrpqrrstssssrpljjj~g~i~f~e~f}h}i}i}i}i}j}i}i}j}k}l~n~n}m}m}m}l}j|i{hzhzhzhzizizizjykzkzkzl{m{n{n{n{nzmzo{r{w|z}x}{|~|||y|w{u{szrxqxpwqwrvrvqupspspsprornsmtlunvqwrwsxuyvywywyxyxywywxwxvxvxuxuxtxtxtwuxuxuxvxvxvxwxwxvxvyvyvyvyvywywxvxvxvxvxuxuxuxuxwxwxwxvxvxvxvxvxvwvwuxuxvwwvvvuuuvvtytqojezh{b}Xcfhlnruqnsxvrmnrtwyxupha`uqklkloqjjttj@ZsIKMOP]osqmeZPRPKNtyvpquxgVgzzuuVMY{nH07Letvwyz{zyyyzytmqqonmqvvspqrrrstvxxxxyyyxxxzzyyy}xwwvwxyyyxw}vwuuuvuxt{t|u{uzuzu{u{u{uxuvvvvwwyx{y~z{|||}}}~~}}}}}}~~~~~}zz{zzz{zzzz{{zyyywwwww~~~~~~~~}}|{{{zxvx{|~|yuwww}vsqprvvusrttstqlq~vvt~v~vsqppopqrtqno~q|szuxvwwuytzvyxzzv}sqrt|uzvxwuwsxrxrxrxrwrwqxqxqxpxqxqysysyszrzs{t{t{tzszszrypxpxowowoxoxqwrvwrzpypypxpxoxnwlyjigggghhjkkk~k{mxmulslqmnomqlrksjsithtjukumvnwnwoxpyqzqzpynxmwkviuhugtftftftgtgufufufuhujulumvlvlvkvjviviviujuhuhvgvgvhvivivivivjvjvjvjvjwjxjxjxiyiyiyiyhyhyhyhxixixixixixjyizizhzhzhzh{g{g{g{f|f|e|e}d}c}b}b}b}b}b}a}a}`~_~___[SH=4012233469=@AEIQRJ?86;ADEGKQSRLGA739PdhggegidYW_YMLMNNLKORUZ[\^\aVUIIKC83=NNGBAGHJG>987547:856677:?BBCIOQRWVQY[YUTbeZV`i`bebfmhcjiddgjhhijili[\_cdddb_\ZX_^aYUX\]QZYWRRUVSXTQ\g]bfi_`aWNW_Y]bXagvxrqx~}||}}}}}||||||{yxy{}~zyxxxwwwxyz|}}~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}{wutssssrqpponnmopqqqrsrrttttsstttttsssvqlqqqppppqrrsqnjijighfefi~k~j~k~k~k~k~j}j}k}l}m}n~o~oo~n~l}l|k{k{j{izhzhzizjzlzmzmzm{n{n{n{n{nzmznzq{t{t|r|v|z|z|z|{|{{z{uzszqxqxqxsxswrvququqtptqtpunumvmvnwpwrxsytyuzvzwzvyvyvyuyvxuxuxtxtxtxuxuxuxuxuxuxuxuxuxuyuyuzvzvyvyvyvywywyxyyyxyxyxxxxxxxxxxwxvxvxuxuxuxuxtxtxsxsxrxrxsxtxsxryszsytyuyuxuxuyuxvxuxtysxtwuxwyxywxwxvwvwxwwwwwwxxwyw~usux}|upmnrw{yusro[zu_GXmxurssssn^Y]ceuroigcgsrvwxurrhMUscXgkuvu~t~u}w}x}y}x}w}u|u|t|w{w{v{t{v{x{w{q{p|p}p}q}q}r~s}t}u}v}w|x{xzxyyyyyyzyzzyzxzwzvyuytxrxrxrxswsxtwtwtwtwsxsxrxsxsxswrwqwqwrxrxrwrwrwrxrxsyuywzy|{|}}}~~~~~~~~~~~~}}}~~~~~~~~~~~~~~~~~~~~}|zzzz~~~~~}}|{ywwyxwuyxzxvtrpoqstuutrpoputrmszvvxvzyx~usssrr}s{qztxyvyuxsxryqyryrysytxsxrxszt{syrwrwqxpxoxoyoyoyoypyqypypypyoypzpzrzs{s{s{s{s{s{rzrzryqypyoxownwmxmxnxnxpwruruqtqupuounuktlspqpqrpvo{m|myoxpvqtqrqpsntltktjshsgshtitisgsfsgshshthuhuhuhujvjwiviuhththtitiththththtgtftetdueufuhvhwiwiwhwgwgvgvhuhuhugugvgvgvgvhvhvhvhvivjviviwiwhxhxgygygygygygyhxgyhyiyiyiyhygzf{f{e{d{e{e|e|d|d|c|b}b}b}a}`}_}_~_~_~_~^~^~]\]]TG9200479:;>BBA?CFHGIPLA::<@CFIMTUPHA99HXUPUX[_`YNNUXRMPSTUUSSSSSQMONIHJOMKG?8:HNIC@DGIGD?:666458745789<@CBCJPTSTYQW\ZVWddYV_e\_fcfkeflib`chfhjhgie]_`adda\][WXab_YX[[^PYXWTSQSOPQOXaZ_cd^a^RSeg[dVXinz{ttx}}||||}}}|||||{yxy{}~zxxwwvwxy{|}}~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}{yxwusrrrqqqppnnoppqrqppqqrrtssssrrrptppstrqppppqqqqokihjhfhgffgkkkkkkk~j}k}l}m}n}opom~i}g|g|g{h{f{gzhzizkzmznznzn{n{n{n{n{nznzozq{t{q{n|q{v|w|x|{{~{}{yzwztyryqyrzsyrxqxqwpupuquqvpvovnwnxnxpxqyrysztztzuzuzuyuyvyuxuxtxtxtxuxuxuxuxuxuxtxtxsxsxsytztytytytytyuyvywyxzwzwzwyxyxyyyxyxywyvyvyuyvyvyuytxtxsxsxsxsxtxtxtxtyuyuzu{uxtytytxuxuwuwuxvwvxwywywzvyuyuyvxuxuxuxvxwxywwxyzzzy{}vusrux}w|yzx{v{uyv}s}w~}sfv~u|wvu}v{vxuutwsqm~nwrxsyx{v{t|q}p~nzr~spturokhpZ`reQp}s{v{v|szsxuxvxwxxxwxwxuxtwrwtvuvvvuvutususurusttstststtuuuvvvvwvwvwuxuxtxryqyqyqyqyoyoxnxoxpwpwowpwqwqxrxswtwtwtwtwsxtxtxswswrwrwrwrxrxrwrwsxvywzz{||~}~~~~~~~}}}}}~~~~~~~~}}}}~~~~~}}}}{|||{|~~~~~~~~~~}|{ywxyxwvuxuxwwwvvuvuxtzuzu|u~uut~t}t~s~t}s}rrqszvwywzyy{v|u{u{u{t{tyuwuvvtwrxqypypypyqyryrxrxrxrzryqyqypxpxowownxnxnxoxoxoxoypxpxoynyoypzrzrzszszszszszryryqypyoyoxnwnwmwmwmwnwowpvououounumuluktksjsishrjrnroqprormsksisjtmuouquptlsisisjsisgsdrcqcrdsdsdsdsesftftftgtgshsisitjtjtjuiuhugtftetdtdudududvfwgwgwfveveufuguhugugvfvfvfvgvfvfvgvhvhvgwgwgwgxgxfyfyfyfyfygygygyfyfyeyeydyczb{b{b{c{c{c|c}b}a|a}a}a}`}_}_}^~]]]\\\\[\VG:1/0169?@@?DBGCEFGGFGD?<:<@CDFHMMHB<?:55633663479;=ABBDJOUSRYQV]\YZbbZX_aY]ebbeffkkcbgidieaiacail`YffW\\WYbb_Z[][_RWWWTTPRNIPVY\W]bc`]ZQ`lbZfSbqtxywvx~}}||||}~}}|||{yxx{}~zxwwvvwy{|}~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|{{zwtrqrrrrqqonnooqqqopnoprssrsqpqqpootutrqppppppppnhhhigfggjgeljkkllkk~j~k}l}m}osmi~i}j|j{j{h{j{f{gzlznznznzn{n{n{n{o{n{nznzp{q{r|o|l{o{t{u{v{z{|{|{|{{{y{u{q{sztztysyrxpxowpwrwrwrwpxpxnxnxnyoxqyrzrzszuzuzuzvzvyvytytxtxuxvxvxvxuxuxtxsxsxsxrxrxryryrysysytyuyvywzwzwzwzxzxzwzwzvzwzvzvzvzvzuzuyuytytxtxtxuxtxtxtxuyvzvzwzwzwzvytytyvxuwvxvxvxvxwxwywywzwywyvyvyuxvxwxvxuxuxuyvyvxwvwvwvwvwwvxuytxtwswswswtxuwvuvtvtuuuwvwwuvutvrvququtttuuvtvuuuuvuvvvvvuvuvutututuststtsvswsxsyryqzq{r}r{sxuuvsurusususvtvtwtwtwtvttssrtrtrurvruruqvqvpvqururtrururvrvqvqwrwrvswrxrxqxpxqxqwqwqwqwqwqwqwqwpvpwpwqwrwrwswswsvtwtwsxsxsxswsvswswsxrxrwswvxxy{{}}~~~~~~~~~~~}}}}}|||}}~~~}|{{|}}}~~~~~}}}~~~}|||||}}}}}}}~~~~~}{yxyyyyzy{v{v{u{szqysxtxtxtwuvuvuutvsvsvswrvsuuuxtxuwwvyvyvxwvwvvvwvwvwvvvtwsxrxpyoyoyoyoypypypxpxqxqzqypypyoxoxnwnwnwmwmwnwowowpxpxpxpxoypypyqyqyryryryryqypypxoxnxlxlwlwlvlvlvlvmwmwmvmvlvlulukujuithsgsfserdrfshsirhrgrfresftjumuoumtjrfrfrfrerbq`p_p_q`q`r`qapbqdrdrdserfrhrjsjtkukukvjvivhufuetdtctbtbucudveveveveududueueueufvfvfvfvfvevfvfvfvfvfwfwfxexfxfyeyeyeyeyeyeyeyeyeydzczbza{`|`|`|`|`|`}`}_}^}^}_~_~^~^~]~]~]\\\\[[XPF92/147:>EGDBCHEEFFGGDB@=;<=?@ABBCA>;;?IKFGJPVYYWUX\YTRSVY\\ZXXXYZYXYWSPMQTOLKHHJKIFFHHG?;=:5453244337;=?ACBEJOTRQUPT_`]]__]\__Y^d_^bffigddghb`]gf_cdoneYaie_WXZ`a_\]_\`UTVZUTRPNFTZZYTZ^a[VRQec\[eYiwwvxyxy~~}}|||}}}}}||{yxy{~~zxwvvwy{}}~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~}}}}}}}}}}}}}}}|||{xvsrrqqpppponmnpppnpklnqqtptlppopruwvurqpppooppojhhghggfefecjijlmmlkjj~k~l~mlh~g}h|h{g{g{g{e{b{dzjzm{n{n{n{n{n{n{n{o{o{o{p|p|q|l|j|n{r{s{t{x{w{v{y{zz}{}{|{z{y{y{wzuzsyqxqxsxsxrxqxqypynylymxmwnxpyqzsztzuzvzvzvytytytyuyvyvyuyuyuytytysxsxrxqxqxpxpxqxqyrysytyuyuyuyvzw{w{w{w{w{w{w{vzvzuzuzuzuyuyuyuxuxuxuyuyuyvywzxzxzxzwzwzwzwzvyvxvxvxuxuxvxwxwyxyxyxywyvyvxwxvxvxuxtytxtxuxuwuwtwswtwtwtxtxsxsxtxtxtxswrwrwqwrxsxtxtwsvrvqvqvrvsvswtxuxvvvvvvuvvwwwwwvvuvtvsvsvsusvsvrvpvqvqvqusvtwtwswsvsvrvrvrvrvrvrvrvrvrururuquqtqtrurusvsvrvquqvqvqvrvrvswswswrwrxswswrwqxpwpwpwqvrvrvrurururvqvqupvpvpvqwqwqwrxrvswtwtxtxtxswsvrwswtxuxuwvxyy|{~}~~~~~}}}}||{{{{|}~~~~|{{{|}}}}}}}}|||||}~~~~~}|{{{{||||||}}~~~}}}}~~~~~~~~~~~}{yyyz{{||}~}z|w|u{s{r{rzqyqxqwqvpwowoxozpyoxpxowrxrxsysyrxrwrwrwswswswswrwqxpyoynynynynynyoyoxpwoxoyoyoynymxmwmwlwmwlvlvmvnvowpwpwqxpxpxpxpxpxpxqxqxpxoxnwmwlvkvjvhviuiuiujtjujtiujviuiujujuiuiuhthshsgrgrfqeqfrgrfqeqcqaqaqbrdsdsdscr`q^q^q_q_q^q\p\p]p_q`q`papbpcqcrcrdrergsitiujuivhvhvgvfveududtctbtbtcudueueueueududududueuevevevevfvfvfwfwfwfwgxgxgxfxgxgyfyfyeydyezdzdzczczbzaz`z`{_|_|_|_|_|^}^}]}\~\~]~]~]~]~]~]]]]]][ZQB30016:=@CIKHDEIDFGGFHD>=<<=>?@ABA@?>>@EIJILOSXYWYY^c]XWWZ\^_\[[[[[\^][WTQRVWTRNNNLJHJJHG?:=954420233249>@CEDFJMSQPSQU`b_]^^__^^Z_c_]aegcbbcgf_\bddadckkm]cick^\]^``^^`\aZQW[UVSOPHX^[XVW]_NQUY__V^bboxz||{yy~~}||||}}}}}|{zyz{}ywvvwy{|}~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~}}}}}}}}}}}}}}}}{yxutqponnnopnnnoqpnpkjmopqpioppoqstqppppppoooppojigcfhjgbbcbghjlmmljjijjkji~h}f|e|d{d{e{d{bzdzizl{m{m{n{o{o{o{o{p{p|p|p|o}o}k|k|n|q{pzq{t{rzpzrzs{u{{{{||{{}zwztyryryryryqyrypyoynylxmwmwnxoyqyrztzuzvzwzvzuzszsztzuzuzuztztztytytysyryqxqxqxqxqxqxrysytytytytyuzuzvzwzvzv{vzvzuzuzuzuzuyuyuyvxuxvyuyuyuyvywzwzxzwzwzwzwzvzvyuxtxtxuxuxuxvxvxwyxyxywyvyvywyvyvyuytytxuxwxwxwxvxuxtxtxuxvxvxvyvyvxvxuwtvtvtvswtxtxtwswrwrwrvrvtvsxuwuxvwwvwvvwwwwwwwvwtwtwtwswtvtvtwswrwsvtvsvswsxsysxsxswsvtvtwswrwrwqvqvquququqururusususvsvsururvswswswswswtxsxsxsxsxsxsxrwrvqvrvrususvtvsvsvsvsvrvqvqvqvqwqwrxrxrwswswtxtxsxswrvrwsxtxuyvyyz|{~|}~~}}}}}}||||{{{{|}~~}|{{|}}~~~~}|{{{{{{|}}~~~~}|{{{|||||}}~~}|||||||}~~~~~~~~}|zzz{||||}}}}}|y}w|v|u{tzsysxqxoxoxpztztyqypxqypxpyqypxowoxoxpxpxqxqxpxpxoxoxnxmxmxmxmxnynxownwnxnxnxmxlwlwlwlwmvmvlvmvmvmvnvovpwpxpxoxpxpxpxpwpxowmvkuiuhtgtftetesfsgshshsgsgsftftftgtgtftftfsgshrgrgrfqfqgrfreqcp`p^p]p^p^q^q\r[q\q\q]q^q_q^p]p_papbqdqdqdqdqcrcscrdrerfsgsftfufvfvfveveveududududtdudvdvevfvevevdvdvdvevfvfwfwfwgwgwgxhxhxhyhyiyiyizhzhyhzhzhzfzezdzc{c{b{b{a{`{`{_|_|^|^|^}^}^~]~\~[~[~\\]^^^]]]\ZVJ?73249>CEHGLMJEDEEEFGHFA=;<=>@ABDEEFGGGHKMOPRTWZZY[\`eb^\[]_`a_]^]Z^aaa_YWWWXZYXUSSPLJLMKI?9<954310122226=@DHFFJLPNORRVac`^]_a`__^ac`]_bd]cbcfe`b^_cbdckmnZhjcchba_`___a^b^RWZWWVMRL\`[W[U^[QWZ[SbU]bjtz}|zy}~}|||||||||||zzz|}x~vvwy{}}}~~~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~}}}}}}}}}}}}}~}}|zzxurpnmkklnnnmnqqpoliorotfaonorrqohlkoooonnoopqmicafgjhb_abfijlmmkiiiiijlk~i}f}d|d|d|e{h{ezfzkzn{m{m|n|p|p|p|q|q}p}p}r}p}m}j}k}n|o{nzo{p{nzmzkzkyjzqzx{}{{{{z}zxzsyqyqypypyqypyoyoynxmwlwlwmxnxoxrysytzvzvzuzszszrzszszszrzszuzuzuzuztysysyryrxrxrxrxsytytytytyuzuzuzvzuzvzvzuzuztztztztyuyuyvyvyvyvyvyvyvyvzvzwzvzvzvzvzvzvyuxuxuxuxuxuxuxuxvxvywywywyvyvyvzwzvzvzuyvywxxyxywywyvyuyuxvxvyvxwxwxwxvwuvtvtvtwuxuxuwuxtxsxswtwuvuwuwtwuwvvvvuwvwvwvwuwtxtxtwtwtwtwtwtwvwvvwvvvuwuxuxuxtxtxtwtxtxtxtxswsvrvrurtrururusvtvtvsvsvrvrvsvswtwtwtwsvswrwrxrwswrwrxrxrwrwrwsvsvuwuwuwuwuwtwswrwrwrvsxsxsxsxswswswswsxsxrwrvrwsxuywzx{{|~}~~~~~~}||}}||||||||{||}~~}{{|}~~~}|{zzzzz{{{|}~~}}|||||}}}}}~}}|{{|||}~}}}~~~~}{z{||||||}}}}~~}z}w|u{szsyrzrzryryqyqypyqypypyoxpxpxpxpxqxqxqxqxpxoxoxoxnxmwmwmwmwmxnwowpwpwpwowownwnvnvmvlvlvlvlvmumumumvmvlwmwnwmwlwkwkwkwjwivhtgtftesdsdsdrfrfqfrfrfreresdsdsdsdsdsdsesfsfrgrfrfrererdqcq`p^o]o\p]p]p\p]p\p[p\p^p^p_p_p_p`qdqergrgqfqerdscscsasbsctdteteudveveveveuevdueudueteuevevevfvevdvdvevevevfvgxgxgxgxhxhyiyiyiyjyjzjzjzjzizizizhzgzezd{c{b|b|b|a|`|_|_}_}^}_}_}^}]~]~\~[~[~[\]^^^][WUOG;22368?FJOMHLLHCBABDEFFC?;:<@ADFGHJLNNNOPPQRUUXZ\\[\^`ec`^^`a`b`_`]Z_cdda[Z[YYYYZYWVUQJKLLJ@:;964210001104;?FKHGJKNKOPRX_ba^__b_^__bba^_aa_`acedaa`acccdjlfVskd^egf``aaab`c[YYZXWWMSU\`\\aVXUYXaZW`W`ekuz~}zy{~~}||||||||||{zz{}x~vwz{}}~~~~~~~~~~~~~~~~~~~~~}}}}~~~~~~~~}}}}}}}}}}}}}}}}}||{{zwspmljihkmlk}mqrpoljrrloa_gloqqomnmnooonnnmnopnh]bdfigbZ`dgijlmlihhiiijjih~e}e}e}e|f|h{e{f{k{l{m|l}o}o}o}p}p}p}p~p~r~q~l~j}l|m|n{mzmzmzmzkziyjyjylypzrzu{xz}zzyyysyoyoyoyoxnxoxoxnxoxnxnwmwlwlwmwowpxrysytztzrzryryqzqzqzrzs{v{vzvzuztzsztzszsysxsxsxtytytytysztztzuzuzuzuzuzuzuztztztztytyuyuyuyuzvzvzvzvzvyvyuyuytytyuyuyuyvyvyuyvyuxuxuxtxuxvxwywyvyuyuyvyvyvzuyuxuyvyxyxzxzwzvyvyvxvxvyvxvxvxvwuwuwuwuwuxvxvxvxvxuxuxuwvwuwuwvwuwuvuvuvuvuvuwuwuwuwuwtwtwtwtwtwtwuwvvwuvvvwvwuxuxuyuyuxuxuxuytytxswrvsuststrvrusvsvsvrwrwrvrvrvsvsvtvsvsvrvqwqwrwrwrwrwqwqwrwswsvtvuwuxvxvxuxtxsxrwswswsxtxtxtxtxtxsxsxswsxrwrwrwsxuyx{y||}~~~~~}}}}}}||||||||{{|}~}||}~~~~}|{{{zzzzzzz{}~~~}}|||||}}}}}~~~||}}~~}|||~~~~}||{|}}}||}~}~~~~}}z|u{s{rzrzrzqzqyqyqypypyoyoxoxoxpxpxpxpxpxpxoxoxoxnxmxlwmwmwmwnwnwowowowownwmwmvmvlvlvlvkvkvkululukukvjvjvjviuiuhvgvgugugtfsfsfserdrererereqerdrdrdrcrbrbrbrbrbrcrcrdrdsdscscsbsasar`q_p^o^o]o]o^o^n^n^o^o_papcpcpcpbqdrgrirjrjrisgsetdtcs`sasbtbtcucucvdwewevevevfufueuftfufvfvevevewewewfwfwgwhwhxhxhyiyizj{j{k{k{l{l{l{l|k|j{j{k{j{g{e{c{b|b}b}b}a}`}_}_}_}_}`}`~_~^\\[[[\^__^ZTLHA:4137=@GJMOQJDB@;::<:742210034249>GMIHJHIGLOQW]aa_``b^^abcb`_^^^^`cdfecbbbddbejh^Ztgf^`iia`acdcad[\Z[ZXXNTY\_^`cVUS][a]\_Xapkrw~}{yz}~~~}|||||||||{zz{|x}u~wz|}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}||{yurmkhge|h|j|jhykpqomljsrih`cimonlmprqpoonmmmlmnnkdZdbbge`Z^eghjkkjhghhiijihgf~g~g~g~g}f|d|d{h{l|m|m}o}o~o~o~oo~o~n~s~q~j~j}m|n|m{l{lzlzjzizhyhyfxgxhyiykznzuz{z}yxyrynymylymxnxoxpxqxpxoxnxnxkwjvjvkvlwnxpxqyrzrzryrzqzpzpzrzs{u{v{w{v{u{uzuztztztytxtxtytytytytzuzuzuzuzuzuzuzuzuztzszszsztyuyuyuzuzuzvzwzvzuytytytysysysytyuyvywywyvyvxuxuxtxuxuxuxvxuxuyuyuyuyuyuxtxuyvywywzw{v{vzvzvyvxvyvxvxvwuwuwuwuxuxuyvyvyvyvywxwxwxwxwxwxwxvwuwtvtvtvuvuwuwuwuwuwtwtwswtwtwuwuwvvvvvwwwwxwxvyvyvyvyuzuzuzuzuxtwsvsurtruqvrvswsvsvswrwswrwrwswswsvrvrvqvqvqvrvrvrvrwqwqwswtwtwuwvxvywywywyuytxsxswtwuxuxuxtxtxtxtxtxtxtxsxsxsxtyvzy|z}}~~~}}}}||||||||||||{{{{|}~~||}~~~~~~}}|{zzyyyyyyzz{|}}~~}||||}}}}~}}}}{|}~~~}|{zz{|~~{}v|v|x{y{y||}}|||~|y}z~|~}}}~}~{}w|u{s{rzr{rzqzqyqypypyoyoxoxpxpxpxpxpxpxpxoxoxnxnxmxlxmwmwmwnwnwowowowownwnwnwnvmvlvlvlvkvjujujuiuiuhuhuhuhththuhugtgtgshshshrhrgsgshsgsgsfsfsfrerdrdrcqcqbrbrbrcrcrbsbsbsbsas`r`q`p`p`p`p_p`q`p`p`o`o`papbqdqdqdqcrdsgsisksjsishtftetdtasbsbtdtdududvevfvfvfvfvgugufugugvgwgwfwfwfwewfxfxgxhwhwhxhyhyhzi{j|k|k|k|l|m|l|k}j}j|j|i|h|g|e|c|b}b}b}b}a}`}`}`~`~`~a}a~`_]\[\\]__][VJ?<72149FKIHIDCDILNSZ`_^``a^_bbba`_^^^_abdfdcccdeecgkf[eqcga]jiaabdec`d[]\\[XYQWZ\]^bbUTUZ]````Zkuely}{zz}~~}||||||||{{zz{|x}u~x{}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}|{zvsmkihfzfxgzh|gxj~nomkkkppkjgknooifjmpponnmmnnnoojc]\i``ec_[_bcfhiiiffhhhiihhhgg~f~f~e~d}c|c|h|k|m}m}n~n~o~m~mm~n~m~r~o~j~k}o|n|l{l{k{kzhzhziyfyexewdxexfyiynzryqyoymykxjxkxlwmwnwoxpxpxpxoxnxkxjwjvjvjvkvmwoxpyqzrzrzrzrzrzrzs{t{u{v{v{u{u{u{t{uzuyuyuyuyuyuytytzuzuzuzuzuztzuzuztzszszsztyuyuyuytztzuzvzvzuztysysysytytytytyuyvywywywyvyvxuxtxtxuxuxuxtxtxtxtxuxuxtxtxuyuyuyuzvzv{vzvzvxvxvyuxuxuwuwuwuwuxuxuyvywywywyxyxyxyxyxyxywywxvwuwtvtvtwtwtwuwuwuwuwtwtwtwuwuwuwuwuwvxwxwxwxvyvyvyvyvzvzvzvzuxtwsvruququqvrvsvswswswrwswswswswswsvrvrvqvqvqvrvrvrvrwqwqvswtwtwuxvxwywzwzvzuytxsxswtwtxuyuxtxtxtxtxtxtytytytyuyvzw|z}{}~~~}}}|||||||}}}}|{zzzz{|}~~~~~}{|}~~~~~~}}|{zzyyxxxyyyzz{{|}~~}}||||{{{{{{zyyz|}~~}|{zxwwxy{|~}~{}x|u|t{u{v{u|v|{||||x|u|u}v}w}w}x}w~u}u}t}u|t{s{rzr{rzrzqzqypypypypypypypyqyqyqyqyqypxoxnxnxnxmxlwmwmwnwnwowowowowowowowownvmvmvlvkwkvjvjuiuiuiuiuiuititjtjujuitjtktksksjsjtjtjtjtjtiththshsgsgsereqdrcrcrcqcrcrdrcrcrbraraqbqbqbqdqcqbrcrbqbpbpbpbqcqdrdrerdsdsftgthtithtgufufufueteteufufvfvewfwgwgwgwgwgwgwgvhwhxhxhxgxgxgxgxgxgygygxgxgygygzg{h|h|h|h|i|i|j|j|h}h}h}g}f}e}d}c}b}b}b~b~a~a~a~a~`~`~`~a~`~`_^^^^^^^^WNF<442016>BEGMNPM?865434566778:=;4111237999:?CFDDD?=@GIINV\_^``_]`bba`____`abcdedccddeegikf\lnbfe_ki`bceea^a[_\[[W\UZ[^\^baVTTXZ\_bbasq_o}{z{}~~}|||||||{{{zz{|w}v~x|}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}|{{wtmjihgzgxhyizjyk|nnljjjlmonklmiloqkkmnnmllmoopmmf`^ahcada^\^``deghgeefggghgghgg~d~d~d~c}b}b|f|i}k}l~m~m~n~k~j~i~k~l}o}m}j}l|n|l|k{k{j{j{f{g{jzfyexdwdwdwexgxiyixhxgxgxgwgwhwhwiwjwkwlxoxoxoxnxlxkxjwjvjvjujvkwnxpys{s{t{u{tzszrzs{s{t{u{u{u{u{uzvzvzvzvzuzuzuzuzuzuzuzuzuztztzuztzszszszsztyuyvyvyuzuzuzvzuztztyrysytyuyuyuyvyvyvywywyvyvyuyuytytytyuytytytytxtxtxtxtxtyuyuyuzuzvyvyvyvzvyvyvyvyuxuwuwtwtwtxtxuxvyvywywyxyxyxyxyxyxyxywyvxuxtwtwtwtwtwuwuwuwuwuwtwtwuwuwuwuwuwuxuxuxuxuxtxtxuxuxuyvyvyuytxtwsvsuquqvrvswswswsxtxtxtxtwtwtwtwswswrxrxrxrxrxrxrwqwrwswswtwtxtxuyuzuzuztysxrxrwsxtyuyuyuyuyuytytytztzuzuzv{x|y}{~{}~~~}}||||}}}}}}}|{{zzzzz{||}~}}|{|}}~~~~~~}||{zzyyyxyyyyyyy{|}}}|{{{{zzzzyyxxxz|~||{yxwvu~t~t~t~u~v~xyz~y}x|u|s{r{r{s{s{s|u|x|{|z|u|s{r{s{s{s{t{t|s|s|s|s{s{r{rzrzrzrzqzqzqzqzqzpypyqyqyqyqyryryqypyoxnxnxnxmxmxmwmwnwnwmwmwmwmwmwmwmwmwnwnwnwmwlwkwkvkvjvjvjvjvjvjujujukukukukulumtltltkujukujujuiuiuithtithsgsfrfrerererererfrererdrdrdrfrgrfrerdrdsdsdrdqdqdqdqdrdresesdsetfteufugtfuevevfvgvfugugugvgwgwfxgxhxhxhwhwhwgwhwhwhxhyhyhxhxhyhyhygzgzgygyfyfzf{f{f|g|g{g{g|h|g|g|f|f|e|d}d}c}b}b}b}b~b~a~a~a~`~`~`~_~_~_~```___^^]]YI<3.024436@GGGFFGC913432445677;>ADIMPRSUXYY[[[\^_`abddffghgfgghijjkllljjlnonquvutsssqpljjigfb\RKHGJKF=>?8311369==<<9:=FGEHOZ^^`_\[ba_a`__```abcdedccddddihif]rgcfgakh_bcdc`\^]b\Y[U]Y\^^[^aaYTTYVX`aclupht}{{|~~~}|||||||{{{z{{|w}u~y}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}|}}}}}|||xunjihg{gxi{k{l}m|mmkiggillpdqqrspommnnmkjkklljkhfbcehdcc`]\^^_bcefedcceeffgggfe~c~c~c~b}_}^|c|e}j}k~k~m~n~i~f~f}h~k}l}k}h|i|j|g{j{i{i{h{e{g{izezdxdwdwcwdwewexexdwcwcwdvevevevfvfvgwhwlwpxpxmxnxmxmwlwkvkujujvlwpyszt|u{t{s{qzpzoypyqyrytytzuzuzvzwzwzwzvzvzvzvzvzvzuzuztztztztztzszszszsztyuzvzvzvzuzuztzszszryrysytyuyuyvzwzwzvzvzuzuztztztztztztztztztysysytytxtxuxuyuzuzuzuyvyvyvxwywywywyvyvxuxuxtxtwtxtxuxuxvywywywzxzxzxzxzxzwzwzvyuytxtxtxtwtwuwuwuwuwuwuwuwuwuwuxuxuxuxuxtxtxtwswswtwtwtxtxtytxuyuxtxswsvqurusvswsxtxuyuyuxuxuwuwtwtwtxsysysysysysysxrxrwrwsxswtwtwtxtytytysyrxqxrxsytyuzvzvzvzvzuzuztztzuzv{v{y|{~|}}}~~~}}||}}}}}}}|||{zyyyyz{{|}|}|{|||}~~~~~}|||{{zzzyyyyxxxxz{|||{{zzzzzzzxxxxxw{xxwvu~t~s}s|r|r|r|s|s|u}w~w}w|v|t{s{q{q{q{q{q{r{s{u{t{szrzpzqzqzqzrzq{q{p{p{q{qzrzrzrzrzrzrzrzqzqzqzpzpzqzqzqzqzrzrzqzpyoynxnxnxmxmxmxnwnwnwmwmwmwmwmwnwnwnwowownwmwlxlwlwlvkvkvkwkwkwkvkvlvlvlvlvlvnvnunumulvkvlvkvjvjvjviuiujuithtgsgsgsgsfsgshshshsgsfsfsgshshsgsgsfsftftfsfrfrfrfrfsfsftgtgtgteueududuevevfwhwiwivivivivhwgwfxgxhxhxiwixhyhxhxixiyiziziyiyiyiyiyhzhzgyfyfzfzf{e{e|e|d{d|d{e{d{d{d{c|c|b}a~a~a~a~b~bbaa```~_^]^~__``_`_]\[SA3,*/289869?FFA?>93.13334578::>BCGKORSTVY\\]]]`abcdeffhhiiiiiijkmnooqqrstvwwxyzzzyyzyywwvurplf[QJHIKH=>C<62026:@A?>=:6787670+*/4;?>;78@B;8520/1445679;=?CECGLPSTTX[^__^_acdffghhijjkkkklmnoqqsuvwxyzzz{|}}}||{{zz{{zxwvqg\QJKMH?>C@:42139AD?;:6335547=BCAGLV\\[YX]a_a_]^`abbbbbccbbbcefflecbomhfedblg`abefhikkm^X\PXa^baZ[\\YVY_RUc`gpuvu{~}||}~}}}}}|||{{{{{{|v}uz~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}||}}}}}}|zwplhff}f{jzmzp{q|o}njd_]`ed`]rvnkjkjjgddefffcbegkljghgeb^[[\^]]_____`_`bcdccdeca`^\[[~\~^~a~e~g~h~i~j~h~b~`}d}g|h|h|`{]z`{`{c{c|f{c{c{hzfzeyexexexewdwdwexfxhwfwevdvdvcvdueugththuhtgthukvnwowowownwmvkvjulupvuxyy{zy{v{rzqzoyoyoypyqyrysytzuzvzvzwzvzvzvzvzvzvzuzuzszszszszszszszszszsyuzuzwzvzvzuztzszrzryryrysytyuyuzuzuzuzuztztztztztztztztztztztztzszszsytytytyuyuyuyuxuxvywyw{x{x{x{xzxzwzwzvzvyuyuyuyuxuxuxvywywyvzvzvzwzvzvzuyuytytytxtxuxuxwxwxwxwxwxvwvxvxvxvxuxuxuxuxtxtwsvsvswswswrxsxuyvzvzvzuyuxswsvsvswsxtytyuxvxvxuxuwuwuxtytzt{t|u|u|u{t{tzsxrwrxswswswsxrxsxrxrxqxqxszt{u{v|w|w|w|w|v|v|v|v|w}x}x~{|}}||}}~~~~}}}}}}}}}}}}}}}|{zzyyyyyz{{}|{{zz{|}}}}}}||||{{{{zzzzyxxyyzz{zzzz{{zz{||}~r|r|r|r{q{pzpzozqzqzqzqzq{r{t|t|t{t{s{r{szrzrzrzqzqzqzrzrzrzqzpzozpyoypypypyoyoyoynyoypzqzqyryrzrzrzrzrzqzqzpzpzqzqzrzrzrzqzpzpyoynynxnxnxnxnxnwmwmwmwmwmwlwmwmwownwnwmwmxmwmwmwlxlxlxlxlxmxmxmxmxlwlwkwmwmvlwkvlvkvkwkxjxixixiwiwiviviviuhuhuhuiujujujuiuhuguhuiuiuiuhuhugugvhuiuitiuiuitiuiuiuiuiuhvgvgvfvgvgwhxixjxjxjxjxiwhwhwgwgxgxgxgxgxgygygyhygygzgzgzgzgzfzfzf{f{f{gzf{f{f{e{e|d|c|b|a}a|`|`|a|a|b}a}a}a~a~a~a~bccbbaa`__^^^___^^\[[ZU@/+,04:@A?9798521012455789;=@EGEEGMPRSUY\^````bdegghiijkkllmnnoqstuvxxyzz{{||}}}}}|{zyz{{{zzyvodWNNNIC@CC=73116@F>874335559@EEDKPV[[ZZZ]_^`^]^`accbbbbbbabceggke`csifddbdgfdfhlolkllo_X]OTb\__\YWXXX\cPRechpuxz}~~~~}||}~}}}}|||{{{{{{|w~w|~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}|||}}}}}|{xsnieef}izlzozq|p~qk]TS\chelnleeeeb][\^abdfeefhkhgfefb_]VW\`]\]^]\^]]`a`_`abcb_^\ZZ[\_a~d~f~g~h~h~h~d~b}e}g}h}i}`|[{^{_|a|a|d|c{c{gzfzgygygxfxfxfxfxfxgxhxgwfwewdwcvdvfugthtithtgshtkvmvnwnwownvmvlukulunuqvtxzy~z{}{zzwzwyvyuyryqyryryszuzvzuzuzuzuzuzuzvzuzuztzszszrzrzrzrzrzryszuzu{v{w{w{v{u{t{szryryrysytytytytztzuztztztztztzt{t{u{u{u{u{uzuzt{szszsytytytytytytxtxuyvzv{w|w|x|x{x{w{w{w{vzvzuzuzuytytxuxuxuyuyuzvzvzvzuzuyuytytysxsxtxuywywywywywywywywyvyvyuyuxuxuxuxuxtwtwuxuwuxvxuyvywzwzwzvzvytxtwswswtxsxsxtxuxuxtxtwtwtxtytzu{u{u{u{u{tztzsysxrxrxswswsxsxsysyryrysys{u|u|v}v|w|w|v|v|v|v}w}w~y~z~{|}||}}}}}}}}}}}}}~~~~~}}}}|{zzzzyyyzzz{{z{zzz{|}}}}||||{{{{{{{zzyyxyyyyyyzz{{{{z{|}~~}}}}~~~q{q{q{p{pzpzpzqzpzqzrzrzr{r{s{t{t{s{r{rzrzszszrzrzqzqzrzrzqzqzpzoyoyoypypypypyoxoxoxnxoypyqyqyqyqyqyqyqzqzpzpzozpyqzrzrzrzqzqzpzoyoyoxoxoxoxoxoxoxoxoxnxnxmxmxnxnxnxnxnxnwnxnwmwmxmxlxlxmxnynymxmxlwkwkxkxkwkwkwkvlvlwkxkxkxkxjxjwjvjvivivivivivjukujujujvivhvhvhuivivivivhuhuiuiujujvjujuiuiviviviviwgwgwgvhviwixixjxjxjxiwhwhwgwgwhwhxgxgxgxfyfzfygyfyfze{e{ezeze{e{e{e{f{g{g{f{e{e{d|c|a|`|`}_}_}_|`}a}a}a~a~`~a~a~abbccbba`_^^^]^^^^][[ZZXF1,-/37=<975442044456778:;<>DGHDEHMPRSUZ^_aabbcefhhijjkklmmnoprsuvwxyzz{{{{{|}}~~~}|{zz{{zzzywsj\RPQMFCED>95002=F<56545556:BHGGLQVZ[[[[]^]^^__`bcbabbbaa`abdfgjd]ooiecbadjjjmouulglss_WbSNbYY]\XPTVY_aKWfglpuw|~~~}}|~~}}}}|||{{{{{{}{{{}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}|||||||||{ytokgefh|j{m{p|prl[MMUahhimecbddddb`^\ceeffghkgffde`]]OW_`][_^W[\[\__\X[_aeb_^\YY[\^_bfgg~g~g~dc~e~g~h}h}a}]|`|`|a|b|d|c{d{fzfzgzgyhygygygyfxgxhxhxgwfwewewdwevevguhuhtgtgshtjulvmwnwnvnvlulukuktltnuqvvx~zz{{zz~z{zyzvzszryszsztztztztztztzuzuzuztztzszrzqzrzrzrzryrysytzu{v|v|v{v{u|t{szsysysysytytyuyuytztzszszsyszszt{t{u{u{u{u{u{t{t{r{rzrzsztztztztzsysytyuzvzvzw{x{w|w|w{w{w{w{vzvzuztytysxsxsxsxsxtyu{u{u{uzuyuytytysysxtyuywywywywzwzwzwzwzvyvyuzuyuyuyuyuxuxtxuxvxvxvyvyvyvyvzvzvyvyuytxtxtxtwswswsxtxtxtwtwtxsxtytztzt{t{t{tztysysysyryrxsxsxsxtxtxtysysyszt{t|u|v}v|w|w|v|v|v}v~w~xzz||}}}}}}}}}||||||}}}~~~}}|||{{{{{zzyzyyyyzzzzzz{|}}}|{{{{zzzzzzzzyyxxxxxyyyzz{{{{z{{zzzxy||||zxxxxxozpzpzpzpzozozpzpzqzrzszs{r{r{s{s{r{rzrzrzszszrzrzqzqzrzrzqzpzoyoynynypxpxqxqxpxpxpxoxpypypyqyqypypyqypzpzozozpzpypzqzqzqzqzpzpzoyoyoxoxoxpxpxpxpxpxpxoxnxnxmxnxoxoxoxnxoxoxoxnxnxnymymymynynynymylxkxkxjxjxjxkwkwmwmwnxnxnxnxmxmxlwkwkwkwkvkwkvkvkvkvjvjvivivivhviviviviviuiuivjvjujvjvjviviwiwiwjwiwhwhwhvjwkwlxkxkxjxixiwhwhwgwhwiwixhyhyhxgyfzeydycybzb{b{b{b{c{d{e|e{e{g{h{g|f|d|b}a}_}^}^}^}^}_}`~a~a~bbaaaaabbbba`__^]]]]]]\[YZ[Z[J5/./1376543211/4556899:<=@BGHIDHIMPRTV\```bcdefgiijkkklmnoprsvwwxz{|{{zz{{||}}~~~~}}|{{{zzzyxun`VTTPIFFFB=82118C:355687673/../123321122/2578;HLHIOUVVY\_`^]_`abaaddbbdea`_^abba[e^jl`eikmmw{xtmg`[VZixv^[\UUYVKSZXRUZ___clw|~~~~~~}||{{{zz{}y}|}~~~~~~~~~~~~~~~~~~~}}}}|||||||{{{zyvrlheeegijllneRNZlonlhedb]da][Z[^bhkljfikpkecZ^_Yba^]^[RZ]\ZW\ZOKPSW`[[[VOPPPSYZX\bddeeghhgf~g}i}g}g~f}f}g|g{gzgzhzgygygygygyhxhxgxfxfxfxfwfwfwfwfwfvfuftgtgsisjtjtjtjtkulumvnvmumtktjsgtgukvsw|xyz{{{{{{{zzz~zzzwzuztztztztzsztzszszszszrzrzqypypyoypzqzrzr{szszszsztytztztzuzuzuzu{s{s{szrzqyqyqzrzszszt{tztztztzszrzrzrzr{t{t{t{t{tztzszsztyuyuyuzuztztztztztzuytytysysysysysysytyuzv{v{v{uzuyuyuyuytytytyuyvzwzwzwzwzwzwzvzvzvzvzvzvzvzvzvzuyuytxtwsxrxrxqxqyqzryryrxrxrxqxqxqxqwqwrwsxsxsxsxsxsxsysytysxsxsxsxrxrxrxryryrxsxsxsxrxrxrxrxrwrwrwrxsxsyszszs|s}t}v~x~z{|||}}}~}}}||||{{{{{{{{|||||{{{{||{{zzzyyyyyyyyyyyyyyzzzzyyyyxxxxxxyyyxwwwwwwwxy{|zz{|}||}}|yyyzzyyyzznynynynynynypypyqyqyqyqyqyqyqypzpyoynynynyoyozozozozpzqzqzqyqypypypypyoyoynynymxnxmxlxmylynyoyoypxpypzpzpzozpzpzpzpzpzpzoynynynymynynyoyoyoyoypypyoynyoypypyqyqyqyqyqyryqyqyqypyqzrzrzszrzrzryrxrxqxpxoxnxnxmxmxlwlxmynyoyoyoynypyoyoyoypyoxoxnxnxmxlxlxlxlxlwlwlwkwlwlwlwlwlwlwkwkwjwjwjwjxkxlxmxlxkxjxjxixjyiyiyhyjyjyjyixhxhxhxhygygzf{e{ezezf{e{e{e{e{f|e|f|f}g}g}g}f}f}e}d}c~b~b~b~a}a~c~c~c~bbbccba`__^^]^^^__^^^\\[\\][XVOHA:410/0013443211112477;=ACFHIJNMILQRQQTX^```bdfghijklmnnnoqrsuvvyyzzz{{{{{{||}~}}~~~~}}||{zyxwwurkfaZTPNMLKGB=9632531557<<78?HKGGMTVUWZ^_^]_abbbbeeccedaa_^aba_`b^mjijouvrvqke]\][W[ixt]W[NVZVNTYVVX\b``iu{}~}}}~~~}}|||zz}|w~|}}~~~~~~~~~~~~~~~~}}}}|||||||{{{zzyuoieddchplnlRLKPW`a_]]dbgfaXYX]ddgflfbdlpoefU^]acb]]bVVZYZZUXWJGOMMZRVSOLKJIIKORZ^^dg~e~ffffe~g}h}g~g~g}g}g|g{gzgzgzgyfyfyfygygxgxgxgxgxfxfxfxfxgwfwfvfufuftgthsjsjtjtjtktlulumunuovnvlvitgtgtlutwxy{{{{{{{zzzzzy|zxzvztzszsztztztzszszszrzqypyoyoypzqzrzrzszszszsztztztztzuzuzuzt{s{s{szrzqyqyqzqzqzrzszszszszszszszszszt{v{v{v{v{uztztztzt{uzuzuzuztzsztztztytytytytytytytytytztzuzwywywyvzv{v{v{v{vzuyuyuyuzvzwzwzwzvzuztztztztztztzuzuzuyuyuxtxswsxsysyuztytytxtxrxqxpwpwpwpwpwqwrwsxtxtxtxtytysysysysxsxsxsxsxsxrxryryryryryqyqxqxqxqxqwpwpwpwqwrwrxrzr{s|u}w}y~{}}}}}}}}}|{zz{{{{{{{{{{|||||{{{{||{{{zzzzzzzzzzyyyyyyyz{{{{{zzyxxxxxyyyyxxxxxyxxz|zzzzzzz{}zxxyyzzz{{|nxnxnxnxnxnxoypypyqyqyqypyoyoyoynymymymynynyoyozozpzqzqzryryqyqypypyoynymylykykxkxjxjxjykylymynxoxpypzozozozozpzpzpzpzoyoynynynymynynynynynynynynynynyoypyqzrzszszszszszszrzryqyrzszsztzszszszsysyryqypyoyoxnxnxmwmxlymynynyoynyoyoypypyqypypyoyoynynynyoyoxnwnwmwlwmwmwmwmxmxmxmxlxlxkxkxjxkylymylylykyjyjxiyhzhzgzhzizhzhyhygyfyfzfzf{e|e{e{f{f|g|g{g{g|g}f}g}f}f}e}e}d~d~c}c}b~c~d~d~d~e~fff~edcccba`^^^^]^^^^___^^``a`^WSNIB;4/00/1135554322334699=?DFJLNNORJOTUTTX\aa`bdfghijklmnnopqstuvwxyz{{zz{{{{{|}}~~~~~}}}|{zyxwwvuqkd_XRNMOOLFC>9532320587;=:;AHKEDIPTTTW[\\\^acccceeddec`cdbcda__a_okpttsqif^ZWSTYYX]lwnZV^SVZUSW\WY]`d`cny}}~~~|||}}~~~}}}{{y|w~|}~~~~~~~~~~~~~~~~~}}}}|||||||{{{zzywrmgb_bdfknfHEDHLIBL^\dch]^VVW\epokpjegnppgcU`]cbc[_cVX[TUZSPOFCKHFRMQPOLGDA>CGMVZX]a~d~dddef~g}g}g~f~f}g|f{f{fzgzgygyfyfyfyfxgxhxhxhxhxgxgxgxgxhxgwfwfvfvfuftgsisjsjsitjtjtkumuouovnwmvjuhtfshtou{wy{{{{{{{zzzzyxyzzzvztztztztzuztztzszrzqzqypypyqzqzrzrzszsztztztzt{t{t{u{u{u{t|s{s{rzqzqyqyqzqzqzrzrzrzrzszsztzszszszt{v|w|w|w|v|v|v|v{u{uzuzuzuyuytytytytytytytzuzuzuzuzuztzuzuzxyxyxywzw{w{w{w{wzvzvyvyuzuzvzuzuytysyryrxrxrxryrysytzuzuzuytxswrxrxrxsytytysysyrxqwpwownwovpvrwswtxtytytytytytysysysxsxsxsxsxrxrxryryryqypypyoxoxoxoxownwnvovovqwqxqyrzs{v{z~{~~~~~}}||{{zzz{{z{{{{{{{||||||||||{{{{zzzz{|{{zzzyyyyyyzzzzzzzzyxxxxxxyyyxxxwwwwwz{yyyyyxyz{ywwxyzz{{||nxnxnxnxnxnxnxoyoyoyoypypyoyoynymymylylymynynyoyozpzqzqyryryqypyoyoynymylykxjxjxjxjxixixiyjykxlxmxnynynznznznzozozpzoyoyoynynynyoyoyoyoyoyoyoxoxoxnxnypypzrzs{s{s{s{s{s{s{r{rzrzrzt{t{u{t{t{szszszrzqypynynynynxnxmxmymymymymynyoyozpzpzqzqyqypyoyoyoyoypxpwowownwmwnwnwnwmxnxnxnxmxlxjxixhyiyjzkzjzjzjziziyizhzhzgygzgzgzfyfyezezf{e{d|d|d|d{e{e|f|g|g|g|g}g}g}f~f~e~cb~b~b~c~cdeeefgggedccba`^^^^^^^___``_^^_]YUSNIEC?6/-./022344333335568;=>CIICCIMQQPQVYXX[_bccdeeefjhbbefggc^^`_plgmkf_WTRQPOPTVY^jsfNMYQQVVVZ^X\ace`fq|~~~}zzz{{|}~~~~|{u{w~{}~~~~~~~~~~~~~~~~~}}}}|||||||{{{zzyxupjfegggii\<:79>G@BR\fcinnb`dibnqnrnmlnmlh`\b`dad]ebX\[ROZQHGH@FECFILNRRGB?:>BHSXTY~]~a}b~b~c~d~e~e}f~f}f}f|f{f{fzezfygygyfyfxfxfxgxixjxixixixixhxhxhxhxgwgwfwfvfufthshsisisisisjtktnuovownwlviugsgsktxvy{{|||{{{{zzyxxxy}zzzxztztzuzuztzszrzrzqzqyqyrzrzrzrzszszt{t{tzt{t{t{u{u{t{t|s{r{qzqzqyqyqzqzqzrzrzrzrzsztztzszszszt{v|w|x|x|w|w|w|v|v{v{v{v{uzuzuzuzuzuzuzuzu{v{v{v{v{u{t{u{uzxyxzxzx{x|x|x|x|x{wzwzwzvzvzuztzsysyryryrxqxqxqwrxrxsytztztysxrwpxoxoxqysytytytysxrxqwpwpwpwpwqwrwtxtytytytytytysysysxsxsxsxrxrxrxryryryqypyoyoxoxoxoxnwnwnvovovqwrxszt{t|w|z~|~~~}}}|{{{zzz{{zz{{{{{{|||||||||||{{{zzzzz{{{zzzzzyyyyyzzzzzzzyxxxxxxyyyxxxxwvutwzwvvwwwxyywuuvwxyz{zzoxoxoxnxnxmxmxnxnynynyoyoynynymymymylylylymymynyoyozoyoypypyoyoynxnxmxlxlxkxkxjxkxkxjxjxixjxkxkxmxmymymylzlzlzmznznyoyoyoynynyoyoyoypypypypypxqxpxpxoyoypzq{r{s{s{s{s{s{r{q{qzqzqzrzrzr{r{rzqzrzqzpzpyoymymymxmxnxnxnynymylylylxnynzozozozpzpzpzoznzoyoyoxownwnwmwmwmwmxmxlylymymxlxjxixgxfyfygzhzhzizizizjyizizhzgzgzgzgzfzgzf{f{f|e|c|c|c|b|c|b}c}d}d}e}e~e~f~e~d~c~b~bacdeffffghgfecbba`^^]]]^_```__^^\ZXUMHFECAA=5.+-/133321013457779DLLWUGB@<>ADPZVY~]}_|`}`}b~c~c}d}d}e}e|e|e{ezezdyeyfygyfxfxfxfxgxjxlxkxjxixixixixixhxhwhwgvfvfufugthsisirirjrjsjsltnvowoxnwkuitgsitsvx{||||{{{{{yxwvwwxyywytzt{s{s{s{r{rzqzqzrzs{s{s{s{s{s{t|t|t{t{t|t{t{s{t{t|s|r|q{q{qzrzrzrzrzrzrzrzrzszszszrzrzr{s{u{v|v|w}w}w}w}w}x|x|x|x|x|w|w|w|w|w|v{v{v{v{w{v{v{u{t{t{tzwzx{x{y|y}y}y}y}y|y{y{x{w{u{t{s{szsyryrysysysxsxsysytztysysyrxqxoxnxnxpxqxsytytytytytysxrxqxpwpxrxsxtytytytytysysysysysxsyryryryryryryryryryqyqxpxpxoxoxoxoxpwpwqwrxszt{u}w~z|~}}}||{{{{{{{{{{{{{{{{|||||||||||{{{zzzzzzzzzzzzzyxxxyyzzzzzzyxxxxxxyzyyyywvuttuwuttvwwwwwusstuwxyyxxpypyoyoxnxnxnxnxmymynynynymxnxmxmxmxlxkxkxkxlxlxmxmynynyoyoynynxmxlxlxlwlwlwlwmxlxkxkxkxlxlxlxlxlxmymymylylylymymymynynynzmzmznznyoyoyoyoypypxrwrxrxqxpypzqzq{q{q{r{r{q{qzpzoyoyoypzpzpzozozpzpzpzpyoynxmxmxlxmxnxoyoynymylxlxmxnynynynznyoyoyoynynynynxoxoxnwmxnxnxmxmymylylymylykxixhxfxeyezfzfzg{h{i{i{izjzizhzhzhzh{h{gzg{g|f|f|e|d}c|b}b}a}a}a}b}c}c~d~d~d~c~c~b}b}b~bdeffgggggfecbaa`_]\\\\]^__^^][ZVQLIECBCDCB=4-+,.13320/.02469:989AKK[WHCA>@@AOUUZ~]}]|^}_}a}a}b}b}c}e}e}d{e{dzdybydyexgxgxgxfxfxgxjxmxlxkxjyjyjyjyjyixiwhwhvgvfufugtgshsjrjrjririsjtlunvnwmvmujtgtiunvwxz|}}{{{z{{zywvvvwwx|yuyszszr{rzrzrzqzqzqzrzszt{t{t{t{t{t{s|s|s|s{s{s{r{r{r{r{q{q{r{r{rzrzrzrzrzrzrzrzrzrzrzrzqzrzszt{t{u|u|v|w|w|x|x|y|y|x|x}x}x}x|x|w|w|w{w{w{v{v{u{u{t{tzuzv{w{x|x}y}y}y|y|x|w|v|u|s|s{s{szszsysysytytxtytztztytysyryqyqxpwowowowqxrxsytzuzuzuztyrypxpxpxpxqxrxsyryryryryryryryryryrzrzszsysysxsyryryqyqyqxqypypypypypxqxrxsyt{u|v}xz}~~}}||||||{|||||{{{{zz{||||{{{{{{{{{{zzzzzzzzzzzzzyxxxxxxyyyyyyxxxxxxxxxxxwwvussstusrsuvwwwvutttuvwxwwwrzrzqypypyoxoxmxmxlylylykxkxlxmxlxlxkxkxixixixjxkxkxkykylxlxlxlwlwkwkwlwmwmxmxnxmxmxlxmxmxmxlylylylylykykykykylylymymymymzlzlzlzlymymyoyoypyoynxmymylykyjzjzjzlzozozozoznymymxmxmxmxmxmylylzlymymymymxmxlxlxkxlxnxnynymylylxlwlwlxmymymymynynyoyoynynynxmxmxmxnynyoynynynymymylykyixgxfxdxdydzezfzf{g{h{i{i{jzizhzhzi{j{j{j{j{j|i}h}g}e}c|b}a}`}`}`~a~a~b~b~b~a~a~`}`}a}a~cdgghhhhhfca__^]]\[ZZZ\]]\[YXVRMHECBDCDEFEA;3-+,.1442/..0257:=;9=GHHIJQSVXYZ\\\^`bdghhhiijklmnooppqqrtvwxxxxyz{|}}}}~~}||{{|{zyyxwtqjdb_VPONLHDC@;;86?BD?=GD=@HLMMJDGJGGFCELKFMPKWX[agjhhrrgl~|qmghu~lhb_qkVJJNMNMJJNQRQQOF=@A?EFKMUY]\adabis{}{zzzzzz{}~~~~~~}||zv|{|}}}}}}}~~~~~~~~~}}}}||||{{{{zzyxxvwvtmia^VI;/',05:@FEEXi``egiosutrmrrpqhbhjg`cgb`Z]_abbc^WSR[PCK>=C>8>HI[WIDECDCANTUZ~]}]}^|_|_}_}_}_}b}d}e}e|d{czcyaybydxgxhxhxgxgxhxlxnxmxlykykylylylykyjxiwhwgwgvgugtgshsisjrjrirhrisjsltmunumtkthtgugvox|y{}}|{{z{{{zywwvvvvw|xtyryrzrzrzrzqzpzqzqzsztzt{t{t{t{t{s{r|r{r{r{r{r{r{r{r{r{s{s{s{szszszszszszrzrzrzrzrzrzqzpzpzqzq{r{s|t|u|v|w}x}y}y}y}y}y}y~x}x}w}w}w}w|w|v|u|u|t|t{tztzuzv{w{w|x}y}x}x}w}v}u}t|s{szszszsztztzuzuzuzuzuzuzuytysyryqypxowownwnvpwrxtztzv{v{u{tzrypxoxnxnxoxqxrxryryryqyqyqyqyryryryrzszsysysxsysysysysyryqyqzqzqzqzqzqyryszt|u}wy{|}}}|||||||||||||||||{z{||||{{{{zzzzz{zzzzzyyyzzzzzyyyxxxxxyyyyyxxxxxwwwwwwwvutrrsssqprstuvvuttttuvvwwvvs{rzqzqzpypyoxnxmxlxkxkxjxjxlxlxmxmxlxkxjxjxkxjxkxkxkxkxlxlwmwmwlwlwlwmwmxmxmymynynymynynynymymymymylylykykykykylylymylylzkzkzkzjykylymymynzmzkyjziziziyhygxhxjxlxlxmxmylxkxkwkwkwjwkwkxkxkxkwkxkxkxlxlxlxkxjxkxlxlxlykykxkxjwjwjwkwkxkxlxnxnxoynynymymxlxlxlxnyoypyoyoyoynzlzjzhzgyfyeydydydzezezf{f{g{g{h{h{h{h{h{j{k|l|l|k|k|j}i}g}d}b}a}`}a}a}c~d~c}c}b}a}a}a}a}`}a}a~cdfghhhfeca_]]]\\[YYYYYZYVTQMKHDBACEGGGGFB;50.--/2441//02368;@=:>FJMOMRUXZ[]^_^`ceghijjjklmnooppqqqrstvwxxxyz{|}~~~~||{{|{zywwvsphcb`ZSQQOJGC@=;>FKMKFEFECCCBEGEFQPJUUXcosjt{cj}|i_bkno^[[_pOKPQPPNNQRONMKEBCDCDFIKRW[Y_c`agpy~~|{{{zzz{{~~~~}}~~}{xzu{{|}}}}}}}~~~~~~~~~}}}|||||{{{{zzywwvwwurqgVD6.+,/6;<;<DC>BD@AEPa^bcdbhpvx|}}}{ncbdcgfdbZ\_aa``_]Z[TWJHGCJE>BCCVXQKNIPNJOQTY\~]}^}^}]|]|^}_}d}i}h}f|d{bz`y_y`ycxgxiyjyjyjykylymxmylzm{m{m{mzlzkyjxixhwhvhvhuhugugtgtgsgsgrgrgrgrgrhrisitithtftfuevkwxxz|||{{||}}}}}{xvuttvxwryqzqzqzqzqzqzpzpzqzqzqzrzrzrzqzpzpzpzpzpzqzqzrzr{s{t{u{u{u{t{s{rzrzrzrzqzqzrzrzrzrzrzrzqzpzpzp{p{o{p{q{r{t{u{u{v|v|u|t|t|t|t|t|t{s{s{r{s{sztzszszsztztztzt{t{t|t{s{s{r{rzrzrzrzsztzt{u{u{v{v{v{v{vzvztysyryqxqxpwpwpwpxqyrysysyszt{t{szsyqxoxnwnwnvovpwqwrwrwqwpwowowoxpxpyqzrzryryryryszsztzs{s{s{r{q{q|r|r|r|s|t}u~wyz{|||||||||{{|}}}}}}}}|||{{||{{{{||{{{{{{zzzzzzzzzzzzyyzzzzzzzzzzzzzzzzzyyxxwwusqpprsssrpprstutuuuvvvvwwwwoyozozoyoyoyoyoynynymylylylxmxmxnxnxmxlxkxkxlxkxkxkxkxlxnxnxnxnxnxnxnxnxnxmxlykykylzmzmznznzmzmzlzlzlzlylylykykylxlxmxmxlylylykykzkzlzmzmzlzkzkykyjyiyixixiwhwiwivjwiwiwiwiwiwhwgxhxhxixkxlxmxlwlwlwkwkwjwiwiwhwiwjxjxjxjxjxixixixjxjxjxkxlxkxlxkxjxjyjykylylynzozozoznzjzhzfzezezezfyfyfyeze{d{d{d|d|d|d|e|f{f{f{g{f|g|h}i}h}h}h~g~e~c}c}c}b}c}d}f}g}f}f}e}c~d~c~d~d~c~b~aacddcb`__^]]]\\\[XVRRKCAACCCCDDEFFFECBA=81.-/00001212446778:@BACELOQRUW[^^^`cegjjjjklnnopqqqqqqqqrstuvwyzz{|}~~|{{zzyxwvutqnfa_XTRKGD@<9::=DHIKI@=ELD;@CGF?CDEFGGHHGEA?=<;60--/21/./135678999;@DDEGNQRSWY\]]^dijihikkmnopqrsrrrrrqqstuvwxz{{|}~~~~}||{zzyxwutqnh_YTIB><<;86568=DIKMI?AHHEEJMKELXZ[\^grxy{{{{yridb``aei^]^`^]ZY[][LHCBEKPLKKF@OWW]RP\RHRSX\_~`~`}`}`}a~dgklj~g}d|b{azazbycxfyhyiyjyjykymynzn{n|n|n|n|m{kzixhwgwgvgvguhuhvhuhugugtftesesfrgrfrgrgsfsftftftfteueuhupvyy{||||||~yio{|xvtsttvrxqzqzqzqzpzpzoznznznynynyoynynynynynynyozpzqzrzs{t|u|u{t{s{r{szszszszs{s{s{s{t{t{t{t{s{s{rzrzqzpzpzpypxpxqyryryryqyqyqyqypypypypyqyqyrzrzrzrzrzrzrzrzryryryrxrxrxrxryryqyrzrzszt{u{u|u|v}v}v}v}v|v{u{tzszszryryqxqyrzrzszsyryrxqxrxrxrxrxrxqwpwowpwqxryszszsysyrxqxpxpxoyoyoyoxpxpxpypyqzqzq{r|r|r{q|q}r}s~t~t~vwy{||{{{{zyyyyyz{{z{{zz{{|||||{{{{{{{{{{{{{{zzzzzzzzzzyyyyyz{{{|||{{{{||||||{zxwurponopqrrrqqpqrstuuvvvvwwwwwjxkylylymynynynynyoyoyoynynxnxoxnxnxnxnxmxlxlxlxkxkxkxkxlxmxnxnxoyoyoynymylxjxjxjxkylymymynymymymymymymymymylylxlxlxmxnxnynymymynzozozozozozoznymxmxlxkxkxjxixiwhwgwgwgwgwhwhxhxhxixixjykzlzmymylykyjyixiwiwhwiwiwixjxjxjxjxixixhxhxhyiyiyjyiyiyiyjyjykylymylzlzl{k{j{h{g{e{d{f{f{f{fzfzfzeze{d{d{c|c|c|d|e|f{f{f{e|e|e}e}d~d~d~deef~f~f~e~c~c~ccbbbbcdcba`_^^__^\[\]]]\\[YUME?;;:>DDGHKKKKJJGB?<:984.-./11.-/14689::;<>AGGIJPSTUYY[]^ckkjhghjmnopqrstsrrrqqrttuwxyz{|}~~~}||{yyyxvroie^SKF=5213543457;CIKLI@==BB=?>BA68969;?BCBB@JMOREDDRYVQIBHD@@FSSOLIGKSZ\aa][W[][\\][XXXWVWXUOQTQRTUX^dqkca]ajsx|~|{{zzzyyyyz{}~~{xxxvwqwpxv}x|~~~~~~~~~~~~~~~~~~}|||{{{{{{{zyxwwwwwwukG/-2.49537:CHIKLPOMKJIEAA>9763/-.///..0258:<=>@@CFJKLNSVWTYY]adgjihhhijlnoppruutrqppqrttvwxz{|}}~|{{xwyywtmcZTMD=:620123334679@JKKHC@<=><==@>5676>KRNJGE>TnhjVEERTQMEGOIFEJUSNMMIKT\XPWYYZ]_^``_][[[ZZ[\XRVVTVTSX^esngd_^dlqv{~~}|{zzzzzyxyz|}}}~|zy~yuyqxqxt|w~{}~~~~~~~~~~~~~~~}|||{{{{{{{zyxwwwvvvumO+,,+)7E35788:@EHLTWSTV\aiqvwyyvtogYMOUYZ[b[[\]^[VRLID638AHGHFMTOCLRUYNQ]D?RPX`ceee~fhjknmkg~e}e|f{fzfzeyeyeyfygzgzizl{n{o|o|o|o|m{kzjyhxfwdvdveufuhuhuiviviuhuhugtfsgsgrhrhsishshshtgugugugufugujvpw{yz{|||~~{||xvttstuvxwoyozozpzpzpzpzozoyoyoyoynynynynynynynznzozozpypyqzrzqzqzrzr{s{s{s{r{r{r{r{s{s{s{s{s{s{s{t{s{szszszszrzrzrzrzrzqzqzryrysysysysysyryrzrzrzrzrzrzrzrzryqyqyqyqyryqyqzpzpyqzrzs{t|u|t|t}t}u}u}u}t|t|u|u|u|u|u|t{tzszrzrzrzryryryqxqxrxrxsxsxsxrxqxryszt{t|t|u|u{t{tzszrzrzpzozoynxmxmxmynyozozp{qzryrzr{r{r~stwy{|||{{{{{zzzzzzzzzzzzz{{|}}}}}}}||{{{{{{{{{{{{zzzzzzyyyxxyyyzzzzzzzz{|}}|||}}zvtrppqrsssrqpqopprsttttttuvwxxkxkxjxjxkxkxlxlxlxlxmxnxnyoyoyoyoypypypyoynxlxlxkwjwjwjwkwkwkwkwlwlxlykykxkxkxlylymymymynymynznznznznynymylylykykykykykzlzlymymynzozpzpzpzp{p{pzozoznzmzlzkyiyhxhwhwixhxixjxkxlxmxmymykyjyjyjyjyizjziziyiyjyjykxkxkykyjyiyiyiyjyiyiyiyjzjzkzjzjzkzl{m{n{p{r{q{q{m{j{h{g{g{f{f{ezg{i{h{g{f{f{f|f|f{f{f{e|d|c|c|d|e|e}e}d}d~e~e~e~d~e~efdcbcb~b~a```aa`_^]\[[]]]^]]\\[ZRGB>:7779=AEHJMOQMKJJJFCBC<752/.-.////1369;>?ACEIKMNOQUWXUZ[^ceghgfghhjlnppqrttsrqppprtuvxy{||~~}|{zuuwvtn`OD?<964432123346886=MMJHDC=;;;;;;95679CPOMW`NE]lXNLJFJPMOYYQKIRQRQNMPNJSZULRXXZ`dfed_[\[]\]^][XXXWVUSX]etrkhddehknx|~}}|{zzzyyxyz|}}|~|{z|ztyryrxt{v|y{|}}~~~~~~}~~~~~~~~~}|||{{{{{{zyxxwwwvvvunZ8,+,149;348;54>?ADFHJLMNLIHIKIGEHC9210/.-./01358;>ACEHIMPQQSTWZ\[]^cffeddefghhhiiklorsrpoooprtuwyy{}}~|{zwpnqoi^O?643222223323458::7;JKHIHE>:99899657:>CBCMUZQTu{l^LJGO_TaQDNSghVNROOQXdj_TSUWZZevtns_^^^]]__`_]\[[ZXVX\fvvoljjjjlnuz~~}{zzzyxxxy{}|u~~}||~}}}|}|w{szryrxsyu{x{|}}~~~~~~}}}~~~~~~~}|||{{{zzzzyxxwvvvvutrjH2.--/22;1/=C?9;96>LTX]flqttutqoheOFNPTSNPROLNXPF>84248:6@H=:@MSBDKNNCHD:F@GPX_eghhhglnnifeg~h}i|h{gzfzeydydzezf{i{i|l|n|o|n{lzkzhyfxewdvdvdvfuhuhuhviviviviviviuhtgsgsgshshsisiththuhvhvhvguguivlwtxyz|||{{{zyvtttttttv{xsyqzqzrzrzqzqzqzqzqzqzqzpzqzqzqzqzqzpzpzoyoypypzpzqzrzqzqzpzpzpypzoznznznzozpzqzqzqzrzsztztzszsztzt{t{s{r{qzqzqzqzrzrzsztztztzszrzrzrzqzqzqzqzqzpzpzpzpypzozozozoypyqyrzszs{t|s|s}s|s|r|r|r|r|t|u}u}v}v}u|t|t{tzszsyryryryryryryryryryryryrzrzrzs{s{s{s|t{t{s{szszrzqzoynxlxlwlxmynynynxnxpxpyqyq{q|pqsvy{||{{{{{{{{{{{{{{zzzzzz{{||}}}}|||{{{{{|||||{{{{zzzzyyxxxxxyyyyyyz|}~|vsrqqqstuuttsrqqpqrstttstuvwyzzjxixhwiwiwjwjwjwjwjwlxlxmymymynynyoyoyoynxlxkxkxjwkwkwkwkwkwkwkwjwkxkxjxjxkxlxmymymynynynynymymymymylylykxkxjyjyjyjyjyjyjxjxjxjxkxkxlxlymynzozozoznzmzlzlzkyjxjxiwjwixixixjxkymynyoynymylykyjyjyizizizjzjzl{m{m{lzkzjzjzkylylzmzlzlzlzlzlzk{k{j{g{f|f|f|d|c|c{b{f{f{f{f{f{f{e{f{h{i|i|h|g|h|i|j|k|j|i|h|g|f|d|c|b}b}b~b~b~c~d~c~b~b~ba```ab~c~ca_^]\[ZZZY[\^^^\WUQLB<976567:APak{_U_[PRiymXXeyaSX`bis_db_\^_`bba`_^][XX\hxysqommnorwz}~~}{zzyxxxyz|n~xvtqp~q~s}v}t|q{qzqxqwsxtzw}z|}~~~~~~~}}}~~~~~~~}|||{{{zzzzyxxwvvvvutrmK30.-+.01883@HDAA@@GT^finpqqqplicbONRLMQKIKHEFOF:55645985;F=:>>?>EJFFHA<>=<<;98;BGGFNVZfgQRVVQUcbLGcz\ABMU_i^Ydi_jmcna\\Zlz_TVWZZ[b`]Z]`bfdfjeb`^Z[^hw{wvspppsvxz}}~~}{zyxxxyz|o~sqnki~j~k~m~l}l{nzowovqxsyv|y{}~~~~~~~}}~~~~~~~}|||{{{zzzzzyxwvvvvutrmQ5...+-,02754:AEGGCDR^gjnmmmmkhbZ[MTQEIQHBHHB=C<448;778479CA@@GMDHMMKD@=K;CEIRZ\]\^`afgfdd~d~e}g}i}i|h{g{gzezdzfzgzfzf{g|i{k{lzkzkyjyhxgwdvdvevfuhuhuhvhwiwjwjwjwjwivhuhtgtgtgsgsgshthuiviwiwhwhwhvhvjvrv}xzzzxvtrpoopqrsstuwzxsyqzpzpzpzpzpzpzqzqzr{r{s{t{t{t{szrzryqzqzr{s{t|u|u|u|u|t{t{s{szqzpzoznznznznynyozozpzpzpzqzqzrzrzqzpzozozozozpzpzpzpzpzqzqzqzqzqzqzqzqzqzrzqzqzpzpzpypypypypypyqyqyqyqyqzqzr{r{qzpzpzoyoypypyqyqyrzs{s{s{s{s{s{szryqyqyqyqyqyqypypypyqyqyryszs{r{r{s{s{s{szqyoynymxlxlxlwmwnxoyqzqzq{q{s}s|r|r}rssuwz{||||{{{{{{{{{{{{{zzzzzzzzz{||||{{{{{{{|||}}}||{zyyyyyyxxxxyz{{||}~slkmpsttstsrqpqqqrrstttsrstuvwwwlwkxlxkxkxlxlxlxlxlxmxmxlylylykylymymylylylxlxlxkxkxlxmxmxmxmxlxlxkxkxjxjxkxkykylymymynynymymylykykyjyjyjxkxkylylylylylylykykxkxjxjyjyjyjyjyjykykykykyjyiyhyhxhxhxhxgxexexfxhyhyiyjyjyjyjyiyiyizj{l{l{m{m{o{n{l{kzkzlzn{n{m{l{k{k{j{j{h{f{e{f{e{fzfzfzf{fzfzfzgzfzezezezezeze{f|f|g}g}g}g}h}i}h}h}g}g~f~f~e~d~c~c~b~b~bbbaa`^^^]]]]^^^]\\[ZZZZXUPLIE@:546675245779<=@ABCDCCBBCCCBDDFB=830/.../12468;>ADHLNPRUWXY[]^`bcddegiifdeeffghhhhiikmnoqstuuuuvxz}}|yupldZNLKC<865543589;<;:9;@A@ACCEIGB@<>??>AHNNNU[]mr^WSc^p~qMIQQMBEEFCMOLSZiznZd`\^^^_]YZXUUY][YX\bdgefqmba`]\_gpvyyurqruwy{|}}~}|{zyxyz{|{~qroomjik~l}m{mzmxnwowqyt{x~{|}~~~~~~~~~~~~~~~}}~~~~~~~}|||{{{zzzzzyxwvvvutsrpeC./000013776:@=23??EMQonjcjeefWPPIYN@GTD=IC:99746<@;=956:?CHFEIENPNICAGF?CGJQVTSTVZ_abbb~c~d}d}f}h|i|h|h{hzfzezgzgzezeze{h{izizjykykyjxgwevevevfuhuhvhvhwiwjxkxkxkxjwiviuhuhugtgtgtgthuiviwiwiwhwhwiviumvrxyyyywuromlmnopqrstvwuyqzpzpzozozozozozozpzr{s{s{t{tztzszszrzq{r{s|t|u}v}v}u}u|t|s|r{q{o{nznzmznznynynzozozpzpzpzpzqzqzpzpyozozozozoznzozpzpzpzqzqzqzqzqzqzqzqzrzrzrzqzqzpyqyqyqyqyqyqyqypypypyqzqzqzpzpzpzozoypypyqyqyqzqzqzq{r{r{s{rzrzqyqyqyqyqyqypypypypypyqyrzs{r|r|s|s|s|s{rzpyoynymxlxmwnwoxpyq{r{s|s}rr~s}ssstuwz{||||||||||||{{{{{zzzzzyyyzz{{{{{{zz{{{{{||}}|{{zyyyyyyyyyyz{|}~~yniilnrtvurpnnnopqqrssrqpprtuvussnxmymylymynynynymynynynxmylylykylylylylymymxmxmxmxlxlxmxmxmxlxlxkxkxkxjxjxjxkxkykylymymymymylykykykyjyjykxlxlymzmzmzmzm{m{mzlzlylykyjyjyiyhyiyiyiyiyhyhyhyhyhyiyhyhygydydxexfygygygyhyhyhygygyhzh{j{j{i{i{j{i{g{fzfzgzh{i|h|h|h|h|g|g|f|d{c{d{d{ezfzfzgzhzhzhzhzhzhzgzfzfzezd{e|e|e}e}e}e}f~f~f~f~e~c~d~d~e~d~c~b~b~abaa`_^\\\[[[[[[[[[\\[[ZXRG?9643555666534579;=>ACCCCCCB@??>?@BBA<61//../02468:>BEHJLOQSUWYZ\^_aceecdjmkecdefggfeffggikmqtwxxwvuuw{~}{vpjd]VJA?<9788:946<=???=:7?BDEDDDCB@>>@BCBA>931//./01358;>BFILKMOQSUWY[]_`bcecaelomgccdfghggggiiiknsvyyyxvvuwz~|yqic^XSH=8768:;==89>?ABB@@BDD@?@@@A@<98=BCBCEFFIKNOPNO\ptPHLRVSK==GIGGEIKFIMOIKKHT\thY^afjja_cknda`[^_cebbjhjtlfzsdcbbhszywwxz|}~~~~~}||{{||}}~pokkklmooon~o{oyoypxryu|x~z|~~~~~~~~~~~~~~~~~~~~~~~~~}|||{{{{zzzzyxwvvuttstuqQ54679::9;;=;511115@BDFFFEDC@@ABDED?:631///01247:=@FIMPMNNPRTWXZ\_`abda_fnqojfeefgikllklmlmquxxyzywwxz|~~~}zumc\YULD<659=@?;>BDFEBBDDB>98757989;?BCCDEFFHKLLKLHLUKG@@?XO=:@DEGIHKPP]\SKLNMY[e\VZ^ablqkggffda^ckhanjabe{ycopga_`emrstwy|~~~~~}|}}~xnjggfghjkkop}o{ozoypxszv}x{}~~~~~~~~~~~~~~~~~~~~~~~~}|||{{{{zzzyyxwvuuutsssrY=667::??;=DB8::ELDC;ESLHANKOSKFCBNB7@>5110./12137@BCEGGEDC@@AABC@=8420/./13469<679=BB@?@??DEFFCCDB@<6334568:=@CDDEEFFGJKHEDD@=HMC=>GIA>ACDGIHJO\fZTJMPPWYYXUW[]arqhfhgeb^_bhcbljd_bllcgsn`_`cfhiouy|~~~~}}}~~ulheccddgjlnon|nznynxqzu}x{|}}}}}}}~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~}|||{{{{zzzyywvuuttsrsqtfK7258<@B@?DC:=@CC?D=LOLJEGILMLHCAOA544200/./001248<==<;FMNZb[IZ\RPHILHLVUJBJOLJNQSX~Z~[~[~Z~[~\}^}_}_|`{b{e|g|h|i|i{h{h{h{g{f{dzczdyeygygygygxgxgygxgxgxgxgwgwixlyozpzmzjyjyjyjxjwivhvhvhuhuiuiuhvivjvjvivhugtguiuqu~utsqyoljjjklmnpqsv|xrzp{p{p{p{pzpzpzozozozpzpzpzpzpzpzozozpzpzpzpzpzp{p{o{n{nzmzmzmzmznznznzozozozoznznznznznzozozozozozpzpzpzpzpzpzpzp{p{q{r{q{q{p{pzpzp{p{o{o{ozozo{p|p|q{r{szrzrzqzqzqzqzqzqzqzqyqyqzq{q{q{q{qzq{p{pzozozozp{p{q{r{r{s{s{s{r{rzrzqzqzqzpzpzpzp{q{r|s}s}s}s}r}q}p|p{pzpzpypxpypzq|r}r}r|qppqrtvwyyyyxxxxyzzzyz{{{{{{{{zyyyyyyzzzzzzyyzzzzyyyzz{||}~~~~~}spqppnnprtuvwxy{}izhyixixixjxjxixixhyiyiyhyhygygzgzhzhzhygygzgzgzhziyjykyjzjzjzkzlzkzjzizgzfzdzdyfygyhyhyhyhyiyiyjykylylylykykyjyiyhyhyhyiyjyjykylzkzkzkzkzkzlzmznymzm{m|l|k}j}h|h|h{gzgzgzhzjzlzmzmzm{l{l{k{j{i{h{h{gzgzfze{e{d{d{f{f{g{h|j|k{k{k|k|j|j}i}h|f|d|c|b|c|c|c|e}e}g}g}g}f|f|e|g|g}i}i}j~j~j~j~i~h~ffeeeeddca`__^]\Z\]_abcccbbcba^\ZQC513212359;:54345678:<:6334578;@CEGGFDFGGJKE@?@>>HH<9:>@?ACBBEGGJO^[USJLSSTX]^XSTVYa][]_a`^XZ]_[[`^Z[~\~_`~^~_jj^`~b~c~bbbgnvy|~}}}~~~|wpjd`__`begjkllm|m{myozs}w~z{|}}}}}}}}~~~~~~~~~~~~~~~~~}~~~~~~~~}|||{{{{{zyyxxwvuuttsrrprbG<=:5>CAGB?B@@CC@:EAOPMJGGHJMMLC@L?1//000011101246789:AAABDFHHFEBCB>:8655431//1359=?ADDDCKWTRRSTVWWXXZ\]`b^aklecfjjjihjjkjkmppqrtvwxwvy|~~}~}{ywyufULGFF=9HB>>GMJIFGFJJHFEC?98975678:>;<878;ABAACDEGKWSRRKMVUV]^]VOOPUW\VWVYZZRUVVUV[WV~Z~Z}\}]}\}X~\~`~^~`}c}b}a}a~`~bglpsx|{xxy{}|vrmieba`abdfgghij}k|mynyq|v}y{|}}}}}}}~~~~~~~~~~~~~~~~~~}~~~~~~~~}|||{{{{{zyyxxwvuuttsrrqpY;6=A>8AEAEC@=>CCA;EBOOMLJIIJLLKA:C:2000001222223455679:@KRZ]XV]QYWUTQRSUNCITTSTY~Z~[~]~_~_~_~^~_~a}a}_}_|`{a{c|f}h|i|i|i{j{j{i{g{e{d{dzezezfyfyfyfyfzezezdzdydyexfxhxjylzkykylylykxkxjwiwhvgvfvfvfvfvgvhvivivhuhuhuftesjsuttsrpnmmmnmnoprtwwxmzm{m{m{nznznzozozoznznznznzozozozp{q{q{q{q{q{q{q{p{p{o{ozozozozozozpzqzqzqzpzpzpzpzpzozoznznzmzmznzozozozozozozp{p{p{p{o{p{p{pzpzp{p{p{p{pzpzoznzn{o{o{ozpzqzqzqzqzqzqzpzozpzqzq{q{q{r{r{rzqzqzqzqzpzozoyoyozozpzq{r{rzrzrzrzrzrzqzpzpzpzp{p{q{r{s|r}r|s|r|r|s|r|r|q{oznzmynzn{o}oonopstwyzzzzyyyyyzzzzz{{{{{{zyxxwwwwxxxxyyyyxxxxxxxxxxyz{|~~xniiloponmkihhijklmlljgfefjlqtuvwwxz|~dzezfygyhyhyiyiyhyhyhyiyiyhxhyhzgzgzgzgygzfzfzgzhzhyiyizizizizhzgzgzfzezezezdzdydydydzczczbzbzczdzezfzgzgzhzhzgzfzfzfzfzgzgzgzgzg{g{g{g{h{h{h{h{gzgzhzg{g|g|g|h|h{h{i{h{h{h{jzizjzk{k{j|j|i|h|g|f|e{ezdzczb{b{c{d{d{e{e{f{g{f|e|e|d|d|d}d}c}c}b}a}a}a|a|a|a}b}c}b}a}b}b}c}e~dfghihgecaaa`^^_^^]\\[ZZYY[\^_^_aba`_]ZXVJ<3224545545543345679;=BDEDDDGIIHFDBA=96545421/1359<@BDEDCBJTSRTTUWWXYXYZ]bc_biidbehiiihjkjfemnnooqsuuuwy|~~~~~~}zvuypbSLGCDA?AME?GOOOLJKMMJFEC=7799889;=@EHJLNMGADIIJKB<;;;;=:79878:?AABCCBEJRVSPMQWVX]XVRNNPXV_[XUVWYPPQTTTXV~W~Y~Z}]}]}Z|X|Y}]}`}`|b|a|`|a|b}a}c~dfhovuonquy~~{zwronlihggcbdffbbbef~h|jylyozs|vzz||}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}|||{{{{{zyyxxwvuuttsrrqoT4<:8;=@CIEED>=@DD>GEOKKNMJKJIGD;48432222223234434556789=DNY\YYUS\[[WSTPPKFSZWTY]~\~\~_~_~`~`~`~`~b~a~_}`}b|b|b|d}g|h|h|h{i{i{h{g{e{d{dzdzezezeyfyfyfyezezdzczdydxexfxgyhyiyjykykykxjxjwjwiwhwgvfvfvfvfvfvgvhvhuhuhtgtdsdsjsttuusrppqqppqrstuzwnzn{n{m{lzlzlzmzmzmzmzmzmzmzn{o{o|p|p|q|r|r|r|q|q|q|q{p{ozozozozozozozpzpzpzpzpzpzpzpzozozozozoznzozozpzpzpzozozo{o{o{p{o{p{p{pzpzp{p{p{pzpzpzoznzo{p{p{pzpzqzrzrzrzqzqzpzozozpzq{q{q{r{r{rzr{r{r{q{p{pzozoyozozozozpzpzpzpzqzrzrzrzqzqzq{p{p{pzpzq{q{q|q|r|r|r|r{q{p{pzoznynzn{m|mmnoquvxyzzzzzzzzz{{{{{{{{{{zyxxwwwwvwwwwxxyyyxxxxxxxxxyzz{|}~}vjgjilopnmmkjiijjkklmlkjihhikoqrpqrtvwy{|}~d{dzezfzfyfygyhyhyhyiyiyiyiyizhzhzgzgzgzfzfzfzfzfzgzgzfzf{e{e{f{e{dzdzczd{e{ezezezezdzczczbzbzbzbzbzbzczdzdzdzdzczdzczczczczczczd{d{e{e{e{e{e{d{czezezfzf{g{h{h{i{i{i{j{i{i{i{i{i{h{h{h{g{g{f{e{d{dzdzdzdzc{c{d{e{e{e{e{e{d{c|b}a}a}a}b~b~b}a}`}`}`}`}`}`}a~a~`~`~_~`}a}a}b~cdefedb`_]]aa`_^]^]]\[ZYYXYY[[[[]]][YUPQJ:1025666654433345579;=ADGHFDEGIJIHEDA<865443200136;?BDFGIIIKPTUTUUWXXZYYZ_ff`adeccegghhhjkkjipnhhknqstuwy|~~}|}~}|wssum_TMGCEGGEKLIFKNOMKJIJJGDA;679:9:<ABCCCBFJRVROOSWWXYSQNLORWWa\XTVY]PLNTVUWW~W~X}Z}]|]|Z|X|Y|]|^|`{a{a{a{b{b|b}b}a}a~bhpnediou{|ztppmiklljjlgaeehe^[]`d~e|gzjxmypzt}vyz||||}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}|||{{{{{zyyxwwvuttssrsrpW;9?;5HGMGJSNJHE@<9523344343433245444556789;?IV\YZQV]`\UVSMMOO^ZUW^_\~]~__ab`~`~a}`}_}b}b}`}b}c|e|f|f|f{g|g|g|e|d{d{dzdzdzdzezfzfyfyezezdzdzdydxdxexeyfygyiyjykyjyjyjxixhwhwgwgvgvfvevevfvfvguhuhthtgsesfsgtmvyvvutttsrqqsstuwrynzo{o{o{n{n{m{m{m{m{m{mzmznzn{o|p}p}q}r}r}r}r|q{q{p{o{o{o{n{o{o{o{o{p{p{p{p{p{p{p{o{o{o{o{nznznzozozozpzpzpzozo{o{p{p{p{p{p{pzpzpzp{pzpzpzpzpzozp{p{p{p{p{p{q{r{q{q{p{pzozozpzp{p{q{qzr{s{r{r{r{q{q{pzpzpzpzoznznzmzmzmznzo{p{q{r{r{q{q{q{q{pzpzpzp{o{o|p|q{q{q{p{p{pzpzoznznzm|llmprvwz{{{zz{{{{{{{{{{{{{{{zyxxwwwwvvvwwxxyyyyyxxxxxyyz{{|}}~xqmkjjlpqonmlkjijjklmllljihhjlosuuuuvwxyzz{|}}}}~d{d{ezezeyeyeyfyhyiyiyjyjyjzizizhzgzgzfzfzeze{e{d{czczb{b{a{a{b{a{aza{c{cze{fzfze{e{d{c{c{b{b{b{a{`{`{a{a{b{b{a{a{a{`{`{`z`z`z`za{a{b{a{a{a{b{b{azbzczdzf{h{i{j{j{k{k{k{j{j{h{h{g{f{e{d{d{c{d{c{d{ezfzezeze{d{e{e{e{f|e|d|b|`|_}^}^}_}`~a~`~_~_~_~_~_}_}`}`~a~a~`~`~`}`}`}`~`abbba`_^]_dcbba_^]]]\ZXWWWXXWWWXYYWUQONF5/269:986653333568:<>AEHKKJFEFHJJHFEC>97764210135:?CFHIIKMNMOOQSTUWZY[[Z[`gh``bbcceffgghjkljhmkghjmpstvx{|~~}|{ytpnmpqf]VOJGGKLJHMMKKKKLLJCAHIB>:779;;=??AFJLMMMKGBDHHIHA=:76777789:<=@CEFFDCHKSVROPUWWWTPMKKPSVXc[USVXXMLPWZWXY~Y~Z}Z}]|]|[|Y{[{]{]{^{`z`zazb{c{c|b|a|`}`~d~kha`ekrxwqihgcbfhebdbeedhh_WV[_a~b|d{gyjylyp{r}uwz{{|}~~~~~~~~~~~~~~~~~~}}}~~~~~~~~~~~~~}||||{{{{zyyxwwvuttsrqrqoX=284211256555655545654456789:<>DR\ZZTZ^`[TSOKQUV`ZX\ca]^``ba_~_~_}`}a}c}a}]}a}c|d|d|d|d|d|d|d|c|c{c{b{bzbzczdzfzgygyfzfzezezezdydydycycxeygyhzhzhzhzhyhxhxhxhwhwgwgvfvevdvdveuguhthtgserbsctfumwuwwvuuutssttuvvvxozq{q{p{o{o{n{n{n{n{m{mzmzmzn{n{n|n}o}p|q|q|q|q{p{o{o{o{n{n{o{o{o{o{o{p{p{p{p{p{o{o{o{o{n{nznznznzozozozpzpzpzp{q{q{q{q{q{q{pzpzpzpzpzpzpzpzpzpzp{p{p{p{p{o{p{p{p{p{p{p{p{p{p{p{p{p{q{q|r|r|r{q{q{q{q{q{q{q{q{oznzmzlzlzmzn{o{p{q{q{q{q{q{q{p{pzozn{m{l{m{n{o{n{n{ozpzpzoznym{lkkmprvwz||{zz{{{{{{|||||{{{{zyxxxwwwwwwwxxyzzzzyyxxxyz{|}}~|vrnljkloqsrqonnlklnmnmmmmljijloswywxxz{{{{{{|}}||}~c{d{d{dzdzdzdzdzfzgzizizjzj{i{izhzgzfzfzeze{d|c|b{a{`{`{_{_{`{`{`{`z`{b{czd{ezeze{d{c{b{b{b{b{a{`{_{_{`{a{a{a{b{b{b{a{a{azazazaz`{`{`{`{`{`{a{a{azbzczezf{h{i{i{h{h{i{i{i{h{g{f{f{d{c{b{b{b{c{c{b{c{c{c{c{b{b{c{c{c|d|c|b|`}^}]}]}]}^}`~b~b~b~b~b~b~a}a}b}b~c~b~b~a~a}a}`}`~_`aa``__``bgdcba__^]\[XVUUUVVUUTUVVUSPKB:/07;=<;86543234689<>ADGJLLKFEFGHIHGFEB=:863100246;AFIKLLNOPPONOQSUY\[\]\\ahia_`abdfgggghjlmkihjjhlpsuuwz|}~~~~~~}{yurmhfhjmke`XQLKKNOMHKMJGEDDFJC;BG?:989:;;=BBCGJKLKJHGFHKJHEA?=:87679:<=?@CFHIIGDILSTROPRSTSNMLKLQVVY`WQQVUPNPSY\XY[\~]}]|^|^{]{\{^{_{]{_{_z_zazb{c{b{b{b|a|`}c}g~e~aadiossi`bb]^^][\][ca\XUQQV[_`~a~b}d{gzizlzo{r}swxzz||}~~~~~~~~~~~~~~~~}}}~~~~~~~~~~}}}||||{{{{zyyxxwvuttsrqrpjU<04@H>A>ABBD=:>GIIGKOC>QD::720//3697657877667765679:;<<=@BP\[YX\X[XROLQYZZ`Z]`fc^^a_aa^]~]~^}_}_~^}]}a}b}b|c|c|b|b|b|c|c|c{b{b{b{b{czdzezgzgzgzhzgzfzezeydydycycydyeyfzfzfzfzfyfxfxgxgwgwgwfwevevdvdvdufugthtgserbsctfufvhwovyvvvvutstttuvzxpzo{o{n{n{n{n{n{n{m{l{lzlzlzlzl{l{l{m{n{o{o{o{o{n{n{n{n{n{n{o{o{o{o{o{o{n{n{n{n{n{n{n{n{n{nznznznznznznzozpzpzq{r{r{q{q{q{p{pzpzpzpzpzpzpzpzpzp{p{p{p{p{p{p{p{o{p{p|p|p|p|p{o{o{p{p{p{p{q|q{q{q{q{q|r|r|r|r|q|q|p{n{mzlzkzlzm{n{o{p{p{p{q{p{p{o{o{n{m{l{m{n{o{oznzo{p|p|o|n{m}lklmpruvz{|{zyyxyyyyz{||{{{{{zyxxxxxxxxxxxxyz{{zzzyyz{|}}~~yqmlllkllmlmpqpoomllponnnonliijnpuy{zzz{|}}}}}~~~~c|c|c{d{c{c{c{c{d{d{e{g{f{f{f|f{f{e{e{d{d|d|c}b}`|_|^|]|^|^{`|a{`{`{a{a{b{c{d{d{d{e{d{b|a|`|`|_|_|_|_{_{`{a{c{d{d{d|c{c{c{d{d{c{b|b|b|b|a|b{b{c{czezgzh{h{f|e}e|c|b|b|b|b|c|d|d{d{c{b{b{b|b|b|b|a|a|a|`|`|`|`|a|`|`|b|b|a|`|_}_}_}a}b}d~d~e~e~f~e~e~d~c~d}d~d~c~ba_~^~]~\Z\]^^^^^^^`db``_^_^\[YWUVWXWVUVUSSRQLHB8002;@>;;:75334578:;>@DGIKLKHDDEFGGFDEGGB>:73111368;BGLNPPQRRQPNPRUW[^]^^]^bhfa^^`bceffghgilmljhjmmortvwy|~~~~}~~|zz|}{woiffgikllkgb[SOMNOOMJHGECBBADHC?@ACFIKLJIHHKRSQQONOOPMMNNNTYTZ[TOOTTOTTV~Z~\[Z\_`}`|_|_{_{^|a|a|_{`z_z_zazbzb{a{b{b{a|a|b|c}d}b~ceilolc]`_ZZXY[VP]_UOMMT[[]_``c~c}f{f{h{j{m|o|s~uvxz{|}~~~~~~~~~~~~~~}}}~~~~~~~~~~}}}||||{{{{zyyxxwvuttssrqojN;917FFF>>A?C=:=FKKFKQD9I:3320//04@A=84413@BFHJKJJFCCEFGGFDEGHC?;72012468??>;<==<::@GFDFEEECACGJKJID@??AB@::=BCBABEJLMMJKNKLSSQROIKMOMNOOOWYT[XSQOTTRY~Y~X}Z~\~[Z]ab~b}`|`|a|a|c|c|a{bz`z`{a{bzaz_{`{a{a{`{a|b|d}c}c}e~hkjha]`^ZYYXXRQ[WJIKQW]]_```cc}e|e|d{g{j{l{p}rsuwy{{}}}}}}}}}}}}}}}}}~~~~~~}}}}}}||||{{{{zyxxxwvutstsrrohD8=20DJKB;H>B<8=EJKGIND87401011027?CA;89A:877:986;?BDFH>AC?IUYUSUVVXVSPY_]]`\bdea]\^[`^]\ZY~Y}Y}Y}Z}\}^}_}`}`}_}_}`}a}b|c|c{c{c{c{d{d{e{f{h{j{j{j{i{h{g{f{ezezdzdzdzdzczbzbzbzbybxcxdxewewexdxdxdxdxewfwfvfuftfteueueteueuevgvkvpwxvvtsssttuwuyl{k|l|k|l|k|j|k|k|k{k{l{m{m{nznzm{m{m{l{l{l{l{l{l{l{m{m{m{m{m{m{m{n{n{m{m{n{n{o{p{p{p{p{p{p{o{o{n{n{n{n{n{o{o{o{o{n{ozozoznznznzozpzqzr{q{p|p|o|o|p|p|p|p|p{o|p|q}q}q|p{ozozozozoznznzn{o{p{q{q{q|q}q~q~q}q}p|p{n{m{l{kzlzlzmznzozo{o{n{n{m{n{n{n{n{n{n|n|n{n{o{p{p|p}o}mmllmoprtvxz|||{zyxwxyyz{{{{{zzyxwxxxxxwxwwxyyz{||}}||}}~}vrnjiiijkmmnnoppqqomllllmopqqqpopstxz{{{||}~~~~~c|b|a|a|a|a|`}_}^|^}^}^|^|_|`{b|b|b{b|a}a}_~]~]}\}]}]}^}_}a|c}d|d|e|e|e|e{e{f{f{g{g|f}c}a}^}\}\~\~\}]}]}^}_}a}a|c|c|b|b|d|e|e|e|e|e|e{f{f{fzgzi{k|l|l|i|d}`}]~]}^}_}_}^}^}^}`}c}d|e|f|g|g|g}f}e}c}a}_}^}_}_}_|_|^|^}`}a}a}a}a}b}b}d}f}h~i~i~j~j~jjif~c~a`_^\[\[YXY[]\[ZYXWXZ[[[[[[[ZYYY[]]]\[YVQHC?;54336639EC:9>97669<>>??ADHJLKIGECDFHHHHGEDEE?941135779=>@@?=::@GFCB@AA>AGHEDEHMPPPLJONPTSSTOKJLPONTSQZZT^XWVTXUU~^~\}\}\}]~\[^ded}b|a|c}d}f}e}e|e{czb{b{bzaz_z`{`{_{_{`{`{b|c|e|e}g~hgd_^__\[[[QLTVMEHKQZ\_aa`bfdg~d~`}`}d|h{k{n}o~qtvyz|}}}}}}}}}}}}}}}}~~~~~~}}}}}||||{{{{{zyxxxwvutttssrpe;1:=200/0233249@EC>97@<777<:97=EGIKK>DC@@@@BEIKMLJHFEGJMNMLJGDCC<51136789;<99?EDA><=>=<>CFGHHGDCDHHIE?BJLIGGJORRTQLNQTWUXWNRNOTTTWUTZZU_\\ZXZVY~a~_~_}_}_~\[_eed}b|b|d}g}i}f}f|f{dzd{d{czaz`z`z`{_{^{`{`{b{b{c{c|d}d}d~caaa`^]\WNOWRIEJOPXV]```bgfib]]~`}c|g|i{k|m}psvx{|}}}}}}}}}}}}}}~~~~~~~}}}}}||||{{{{{zyxxxwvuttttsrpe;1>LQONJC=VEB:;=@EIG>;70--/1345458>BA<86=?788:::7>HIJKJ@FA:AJOSVTRPPSTRWZVXVWVVXUSTVU\]]YXY~X}W}W~W~Y~Z}\}\}]}\}\}]}^}`}a|c|c{d{d{d{d{d{e{f{g{g{g{h{h{h{h{h{g{fzezdzczbzbzaz`z`yaxbxbxcwcxcxbxbxcydyeyfyfxfxeweweveveuevevdvdvdvewgwhvluptrttuxvzv|vwyys{p|q|r|t|t|r|p|o|m|l{k{l{l{nzozoznzmzm{l{l{l{l{l{k{k{l{m{m{m{m{m{m{m{m{m{m{n{n{n{o{p|q|q|q|q|p|p|o|o{o{p{q{q{p{p{o{ozozozoznzmzmznzozpzp{o{n{m|m|m|m|m|m|l{l{m{o|p|p|p|p{q{q{q{p{o{n{m{mznzozp{p|o}o~o~o}o}o|o{o{n{m{mzlzmzmznznzo{o{o{n{m{n{n{o{o|o|n}o}n|n{n{nzn{n|m~llklmnpqstvx{|}|{{zzzzz{{zzzzyyyxwxwwvvvvwxyyyz|}~~~~~xrpoonnmlmnpqrsttsssqolklnqrtvwwvuuwwyyzz{{|}~~~~~a|a|`|`|`|`|`}`}_}_}`}`}`}`|`|b|b|a|a|b|b}a~c}c}c}c}b}a}b}d|f|h}i|j|j|k|k|k|j|i|i}f}b~_~\~ZZZZZ[\\~^~_~_}`|_}]}\}\}`|b|d|e|h|i{h{g|f|d}a}]~X~V~V~U~S~V~W}Y}[}]}^}`}b}a}b}b}d|f}e}e}d}d}d}c}c}d}e}d}d}c}c|b}a~`~_~^~]~\~]~^~`~b~d~efefeeca_]_aabdcc`_abdedb^]\ZYYYXXXWXWWXXWTSTUUSKB9329???ACFJLMLKIHIJKMPPNKGDA?93136899:;=@FJKHFEECB@?BEGIOWZZZ\_ae_[[`ccejgecbcde``irxwtttruwvpjkmnkihijhabebacfikjlkjklkjhaWRQQPLJJIFEIKLJGCQH89<=<;999=AA?<;=??>?ACEILKGEFLOLHBDKPNKKLQUUUVRSVWYY\ZOVRRUYZZYY\ZW_``^[\Z\ba~a~`}_~[[^ddb}a|c}f}i~j~g~f|e{dzd{dzdzbzaz`z`z_z_z`z`zazbzb{a{b{b|c}d~dccba`YUOQRNMKMNQRO]_]]bhghbZ[\^~b~d|h{j{l}o~ruy{|||}}}}}}|}}}~~~~~~~}}}}}||||{{{{{zyxxxwvuttsssqpc>6=BHNMFA=VHC;?>?BD@742/./01356546:>=976:>8;9:::8?HIIHIAB<7>EIPWTNLKNPMPQOQOTOORQQQTUZ^^YXZ~Y}X~X~X~Z~[~\~\~\}\}[}[}\}^}_|a|c|d{e{e{d{d{d{e{e{e{e{f{g{h{h{h{g{ezdzczczbzbzaz`zaybxcxcxcxcxbxbxbybybycydyeyeyexdxdwdwdwcvcwcwcwcvdwdwdwdvdwewgwkxnxrxxxyyz{||}|~|~||||y|w|r|p|n|m{l{l{lzlzkzjzk{k{l{l{l{l{k{l{m{n{n{o{o{o{o{o{n{m{m{m{n{n{n{o|p|q|q|p|p|p|p|p|p|q|q|q|q|q|q|p|o|o|n|m{l{m{mznznznzmzl{k{k|k|k|l|l{m{mzm{n{p|q|q|r|q{q{p{p{o{n{n{m{m{n{o|p|o|q}r}r}q}p|o|n|n{n{m{lzmznznznzo{p{p{p{o{o{o{p{p|p|p}p}o|o{o{nzn{m|m~llklmnpqrsuvx{{zyyxyyz{{{{zzzzyxvvutssrrstuvvwxyz{|}}}~~|xurrqqpooooopqsuvvvvutrpooqsuuwxxwvwxxyyz{{|}}~~~~~a{`{`{`{`{`|a}a}`}`}a}b|b|b|c|b|b|a|a{b|a}`}b}c|c|b|b}a}a}b|d|f}g}i}i}j}i}h|g|d}a}]~[~YYYYYYZ~[~[~]~^~`~`}_|_}]}\}]}`|b|b|e|k|j{i|i|g}c}[~XUVVYZZW~W~W~Y~Z~]~`~`~a~a}b}b}a}a}`~`~b~b~d~e}f~e~d~c}b}b}a~`_^\~[~[~\~^~^~^^___`_^^^^`cdfefeabdfgigb_][YXXXXXXXWWWVSNFGKPSL@77:>?ACFILNMLKIJJJIKNNKFC?:52248:99::<@FIIFDCA=<:9=@DHNUVVW\^`c_Z[_bbfmjdcbbdfaZW^mtrqpkltug_aflebbcba`_agfehihhghjjkjie^RKLLMJJKJGGIKKJGFF?:8:;;:99:=@@@>=@DECAABDIQOHGILOPMHFKSTNLNSWWTUWXYZZ[][STXXWZ^`a`ZYYadca^^^_bbba~_[Z]cb~_~`}c~gjlhd}c|c{c{dzdzdzbzazbzazayayayayazazazazb{c}d}e~edba`YTONNNSSNMRMK^^VT_fdf_UWXZ\^~b}d|g{i}m~puwxxz{{|||||||}~~~~~~}}|||||||{{{{{zzyxxxwvuutssrqo]A7=EGJHC?=JHC=A?>@<720//./013443346::8768;8<::;::AHGFGG?<47754222224<@DDA><<>@CFILNNNNMLKIEEGHGE@;53258;;989:;878=@CFLSSRS]\]`^\\adaiqmfdccglh_WWcmmmkgbbndYY]fb]\^^]^]_dgecbdfghiihge^UJDEGGGGJJFFHHGEDB?;999889:<>@CDDCBEJJGECACKRTKFLPQQQMIJSXSOPTWYWWY[\\\\^aWV[\Z^adec\Z]dffdbaabddca~^[ZZa_~\~^~dillgb}a|a{b{e{ezfzezdzczczcycybybybyayayaybyczc|e~e~dcb^WTQOPSXUOOUNN[WNP[]^bXORTUVX[]~`}a}g|i|n~qstvwyz{{||||}~~~~~~~}}||||||{{{{{zzzyxxxwvvuttsrpp]E>ACCFE@<;DHD?A?;;71/..//0012333346::877898>;<=<>DGEDED=927<<>@CEHKMLJIHHIHHEDCCA;62148;>=;::;;>?DHJGC@<:9;?ADFKPPOQYYX[YWX^edhnngedchmjbYU[cghgd^Ub^VVXb^XWYYZ[[X^`abdfijiea^\[VJBAACDEFIHFFFFCA@=;::9999;>ABDGIIHGJNMJIGAAIPSMFLSQORSOLOVVSTVXXXWZ\\[\[]a\Z]][_dghf_]`effedccdddca^ZXX_\~[~^~dimkd`}_{`{b{e{f{hzgzfzezdzeyeydydycycybyaxbyczc{d}d}c~a_[WUSSTW[TLRWPRYOIRZRY]QIOQRRRTUWZ^~a}g}kmortvwy{||||}~~~~~~~~~}}||||||{{{{{zzzyxxxwwvuttsroraKEEB@DC?<9CGC>>?;62.-//001123444479;<<;:9:9>=?A@CFFEEFE>94:>?BDEHLLKLLKJJLOOSMLKRZX[\W_`\\\Z~[~\~]~^~_~_~`~_~]}[}Z}Z}[}]}_}b}c}b}b|a|`|`{`{a{b{b{a{a{b{b{b{bzbzczdzdzdzdzczczdydydydydydycycybyazazazazazazbzczbybybycxdxdxcxcxcxcxbyayayaxbxcwcwcxcxeygzlzs{v{x|z}~}}}}}}}}}|||{|r|m|j|j|j|j|j|j|j|j|k|j|j{j{j{j{i{h{h{h{i{i{j{j|j|k}l}l}l}l}l}l}k}k}k}k}l}l}l}l|k|l|l|m|m|m|m{m{l{k{k{j|j|k|l|n|n|l{k{jzk{l{m{n{o{o{m{l{l{k{j{j{i{i{h{h{i{j{jzkzk{j|h|g}f}f}f|g|i|l}m}m}m}m}l}j}h}f~e~d~e~f~f~f~g~h}h}i|i{i{h|h}hgffffeeeddca`accb`beghijkkjjjiigfdbaa`_______^\^`_`acdeeddcdeghhgedbcbbcdeglptwxyxwutsuwyz{||}}}}||{{{{zyyyzz{|}~~~~^{^{]{]{]{^{^{]{\{\{]{\|]|\|\|\|\|[|[|Z|Y|X|X|X|X|X|X|Y}X}Y}X}X}X}X}Y}Y}Y~X~X~VUTTTUTTTTSSTTV[`~cda`_~c~daa\WTSSRRSTTUVVWX~Y~[~]~]~]~\~[~[~Z~Y~XVVUUUUVWXXXX~X~X~Y~Z[\\[[[[ZYYYYYZYWWWVVXXYZYZWVVUUTPNLMNOPPPPQQROJE?;989<=;87=BGJMJI=4257558:;<==>?><<<>@CDFHJGC?=9421359=@?<<;<==?CGKKHGC@?@CDFGJMNMOUSRWRMPV_dbeihfedegfdYTWZ^cc`^SYZTWX\ZXVVVWXYXZ[^]_dghd\VQMMKC==?ADDGIGEDDDA?><<=>>><=AEGGFJNNLLPQPNLKEAENQMEISQNQVSOLPVXZZZZZY[ZZZYVW_]\^^\^djjg`]`bbcdcbb`ddcb_YV[a]~]~a~dhkib`|_{`{b{e{h{izgzgzfzezgzgyfyfyeydycybxcxcybzb|a|a}_~]ZXWXWV[[SQRXTVYMKYULY[QJOPQQPNNPTUZ`~e~gimpstuy{{{{}~~~~~~~~~}}||||||{{{{{zzzyxxxwwvvutrpmm^RNMC;=?>=;@B?;8;930..002334456677:=<<=BCCB?95436777:;==<;<====<=?ACEEFDA?=>BEIJGA:621247:=@?=>==>?ADGKMMJGCCBEEFGJLLLMTQOTQJOVZa^`ffeedadddZUWVY]`_^UTVSVYXXWUUVVVXYWY]^][[ZUPLGADB?==?BDCGIGDBCB@@??ACEFECCGJNMHMXXQRUTSQONKDEMQIBENQKOWWSRNOUYZZZZYWUTSSMPUX\^]Z\diie]T^\X]__][Zdccb]WX^aa~a~b~dghgb~`|`{azb{d{h{j{hzgzgzezfzgzhzhzgzfzeydxdxcxbyaza{_|_|\~[~ZYZYX\\UUWZX[YOQZMK`ZSOQTTSNLJJQNT[`~a~c~g~nppquwxyy|}~~~~~}}}||{{{|||{{{{{zzyyxxwwwwvutpmkb[U[QD9;>><;<;:75320///12455667889:=?AB>>>?@BCEFGFHJFHHLLC=>EFEECELQROOQQPQSVSRLMNQZ[_^XX]]][Y[]]]]^a~a~[~[~^~_~_}a|c|e|f|d|c|b{a{`{`{`{a{a{a{a{a{a{a{azbzbzczdzdzdzdzdzdzezezezezdzczbzbzazbzbzbzaz`z`z`z`zazbycxdxewewewewexexexdxbyayaxaxaycybybybydyeyfygykzp{u|x|y|||}|||}|~}}|}|{|{s{i{g|f|d|d}d}c}d~c}d}d}d}d}e}e}e}e}e}e}e}d~d~e~e~e~e~eeeeeed~f~h~j~lprtuvutrpookiko~u~x}w|m|h|g|h|h|i|i|i{i{i|i}h}g|f|c}b}a}`}`}`|_}_}`~a~a~a~`~_~`}b|c|c}d}d}d}b}b~a~`~`~_~_~`__``aa~`~`~`~a~a~a````__^^]]\\]]]\]]_^^^_^^^__^]]]]]^_^^]^_____^^^^^^]]\\\]]]^^_^_^]]^_`abcehknqttrmhhkifhjlnpqqonmihkplhggffffhkopsvz|}^z^z_{_{^{^{^z^z^z_z_z_z^z^z^z]z\z\z[z[z\{[{Z{Y{Z{Y{Y|Y|Y|Y|Y|Y{X|X}W}X}X}X}W}W~U~S~RQQPNNNOQPPOPRTUUTSRQQRRRSUWXYZZY~Y~Z~Z~Z~Y~X~Y~Z~[~[~Z~YXWUSRSUVWWWWWVUTTUVWWWWXXYZZZZZYVTTTUTSRRRQPOOONNNMLKKLMNOPPPONMHD<768:<;:8559==:976544568:;<<<<;:;=>>=<<=?ABAA@@?@BDEEGH=6201589:<9854210//01234678889::;=ABEG>@@CDEFHIJIKNKLLPPHBEJJIGDFMSUPPRQOPSVSNILPPVX^]WVZ]ZYZ\\[Z[]a~_~]~`~a~a~b}d}f|h|i|f|d|c|b|]{\{_{_{_{`{`{a{a{a{azazbzczdzdzdzezezfzfzfzfzezdzdzczczbzbzbzbzaz`z`z_z_z`z`yaxbxcwdwdwfwgxgxgxfxeydycybybyay`yayaybxcxcxcwdxhylzozq{t{w{x|y|{}}}|}|{{zs{g{d|a|b}b}c}c~b~c}d}d}d}d}c}c}c~c~c~b~baaaaabbaaa``acfjnprrtrrpnnrmkkmt|~}}u}i}d~c~c~d}e}e}e}e|e|d}d}b~a~_~]~]\\\]]^__~^~^~^~_}`|_|_}_}_}]}^~^~^~_~_~_~_^]^^^^^^^^^^^^^]]]]]]]]^_^^^___]]\\\]]^^^]\[\^`a`_^^__^^]^^^^^^]]\\\]]^___^^]\]^`aabbcefgikkieaaca_^`abdeecba_^abb^]]]\\]^`cegjnoort_z`z`z`{`z_z_y`yay`y`y`y`y_y_y^y^y^y]y]z^z]z\{[{\{[{[{Z{Z{Z{Z{[zZ{Z|Y|Y}Y}Y}X}X~V~T~S~RQPOPQRTSRQQQQRRQQPOPPQRSSUWYYZY~Y~Y~Y~Y~Y~X~YZ[ZWVUTRQQRSTUUUUTTSRRSSTSSSTTUVWWWYXVTVVVSONNNMMLKKKKKJIIIJKKLLLLKJHC>64369:964558:866555678::<<<<<<<<=>???>==<>AA@@ABDFEDBCD:42147::::?B@ABDEGIKLPSVLGLJFCABCFGHGJLJJMQNQZVUWY]bcde]\d_\YWVTY]`]WNROV]][YWUVVUXXWWSH@<:;>@BDBFHHGFEEECEECBCFGKLKKMOSTUSPMOUYRNUYVUWVXYVUUROOSXQKSVNKRUTURKKPRSSSSPKIHJGJLPSSRQV]^ZTQPQMRWXTNNUWY[^ZY^~c~c~c}d}e~dd~e~e~d}c|c{d{d{e{g{j{h{j{izizizjzkzjzjzjzjziyhxgxewcxbyaza{a{`|_~\^`__^\]^`_a_]^VHTe^ZVX[[XPJINSLQXZZ[^`~beinpqrtuwy{}~~~}}|||{{{{{{{{{zzzyyxwvvuvuutri[[d^ZONVRE??>;7320//010123446899:;;<<>ACFGBABEFFFHIMJJOONNTSMGJNLLJGHMRTPNMLKKNRQLHLQOQUXZWWY[VVZ[YVVXY[\^bbc~c}d}f}h|h|e|c|`|[|W|W|Y{Z{[{[{\{\{]{^{_z`zazbzdzezezezezezfzfzezezezezezdzdzdzdzdzczbzbzaz`z`z`y`xaxbwcwdwfwhxhxhxgygygyfyeydybyayayayaxbxaxawbxcxfyiykynypyqzs{u|x|{|~|||{zzv{g{d|e}d}d}c~c~c}d}d}d}d}c}c~c~c~b~a~a~aaaaaaa``___aceghgjjmmmljjnlmmkns~u}p}f}b~a~a~b~b~a~ba~a~a}`}`~_~^~\[\^_`a`_~_~`~`~`}`|`|a}a~`~_~^~_~^~_~`~a~a~``_^___^________^]]^^^^^^^^_`___^^]]]\]^^^]\\]_bccba`_^^]\]^____^^]]\]^_____^]]]^`aabaaaaabbca_\[[[ZZ[[[\\\\ZYY[\]\[ZZZYYXYZ\\^`bbaceazayayazazayaybybybybyayax`x`x`x_x_y_y_y_y_y_z^z^z]z\z[z[z[z[z\z\z[{Z{Z|Z|Z|Z|Y}W}V~V~V~UUTTUVUTTSRSSTUTSRPOONNOQSTUUVUUUUUUTTUVUSRRQQQQQQRRQQRRRQPPQQQPPPQRSSSSTVVUTTSQNKJJJJJIIIHHHGFEFGGHHHHHGEC=9423578765567898777789:<<===<==>>===>????>=>==>@BDGGC>>@83247:<;;9=@BCEGILNOOQRTJDKLE?>@BEGFGJKKKMNPTZ]TWX]beffdY^`^[WVVX[^\ZRVRW_`_ZVUWXWUTRNH?;:<>ACEGGHJJJGFDC@BBACFJMPQPPRTWWXUQMMPUQLMPPPQPTWVTUTRRSVTNRUOKNPONLHGIJKKKKKIGHKIKLPQQQQUYXTPQQQNVZ\VQUWSV[\YZ~\~`~`}a}a}c}c~d~e~f~e}e|d{e{e{e{gzjzh{jzizi{j{j{k{k{k{k{jziziyhxfwdxcybzb{b{b|a}^~`b```_aaa`aacaULY`\YUX[\XPLOTUPTZWXZ][cfhjmmnqqsvx{|}}}||||{{{|||||{yyyxxwusrrtsqpkc_c``WF@PSKB?;7420/1122112345789::;;<<=@BEGCBCEFEEFIMJINRQPVUPLMOOOLJILOPMIGFDEHMNKHJPOPRVYXXY[STZZTQTWWVX\^aaabccc~`~_YPOR~T~U~V}V}W}X|Z|[|\{]{_{b{c{c{c{c{czczdzdzdzdzezezfzfzfzfzfzfzezdzdzczczbzbybyaxbxcxdxfxhyiyiyhyhyhygyfyeydycycycycxcxbxbxbxbxdyfxgxhxjxjxlynzqzt{w{{|{{yyywzl{g|g|g}f}f~d}c}c}c}d}d}d}e~d~d~c~b~b}b~b~bbbbaaa~`~a~a~abccaefjhjjhghhhhg~g~h~i}g}d}c}b}b}b}b}a}a~`}`}`|`|_}`}_}_}^~_a~b~b~c~c~a}b}b}c}c|c|c}d}d~c~a~`~a~a}b~b~b~baaa`aabaaaaaaa``_^^^^^^]]]]]^]]]\\[[\]]]^^^^_`abccbaa`_^]]^_``a```__^^^^^^]]]\\]^_`a``_^]]^^]\[ZYYXYZZZZZZZYXXX[\[[[[[ZZZZZZYZ[[[[Z[\aybybxbybybycydxcxcxcxbxaxaxaxax`x`x`x`x`x`x`y_y_z_y]y[y[y\y]y]y^z]{\{\{[{Z{Z|Y|X}W}W}W~W~W~W~W~V~WVUTSSTUVVUSRPNNNOPPRTTTSRRSSRRRQTSPQRPOQQQQQQQPQRRRRQPPPPPPPQRRRRRSTSSSSQMKIIIIIIHGGGGFEDCCDEFGHGEB>;8532356787778999:98889:;<=>===>???>===>@BA@@???@ABDGFB<:863359<==;9>ABCGJLNRQPPPOHCKMD:=@ADGFFIKKLOLPUX_XXX\adggi^Y__YUVVVX[[[ZZYZbda[WWXYXPKF@<<=?CFFDDGGHJIHFDCA?@@@EHMORRSSTUVWWTQLJKJIHGFDFFFMPPPPQPOOONLLNNKJJHGGGFFFFFFGIIHIMMMNQQRSSUVUTSRRSU[b_\YZWSU\\Y~[~\~^}_}_}`}b}c~c~d~f}f}e|e{f{e{f{gzizjzkzizh{l{k{k{k{k{k{j{jziyhyfxexdyczc{c{b|a}^~aca```bcb_abf`VPVZXVQZ][WPLU\UVXZTX[Z]dffgjjlnooquxz{{{||||{{{{{{|{zxwwwvusrpqqpnlihd`ZPVK8DIE>:74211133321113568::;<==<<=@BDFCBDFGFEFJLIHLTQQVTPMOPQQNKIKMNJEDDCAFILJGIOPQRVY[ZYZTUXWPMRUVWWWX[[[ZYYWUQMKLMNOPR~T~V}X}Y}Y|[|]|^|_{^{^{_{_{_{`{a{b{b{c{d{e{f{gzh{h{h{g{f{f{e{d{d{czbzaybxcxdxfxgyhyhyhyhyhzhzgzfzezezezezeydycxcxbxbxcydxdxexfxfxgyhyjymzo{s{v{yz~yxyy|zo{j|h|f}e}d|c|c|c|c}c}d}d}e}d}c}c}b}b|b|b|b|b|b|b|b|a}a}a}b}b~b~b~bccefedeff~e~e~d~c~c~c~c}d}e}d|b|a|b|b|b}a}`}a|`|`|`|`|`|a|`}`}`}b}c}d}d}c}d}d}e}f}f|f|f}g}g~f~c~a~b~c~d~d~c~bbbbbbbbbbbbbbba__^^]]]]]]\\\\[\\[[[[\]]]]]^^_`aabbaa``_^]\]^__`aa`___^^]]\[ZZYZZ\^_``_][ZYZ[[ZYYYYYXY[[[Z[[ZZYXZ]\\\\\\\\\[ZZ[[\\[ZYYbxcxcxcxdydxexexdxdxdwcwcwbwbxbxbxbxaxaxbxbxbxaxay`y_y]y^y^x_x`y`z_z^z^z]z\{[{Z|Y}Y~Z}Z}Z|Z|Y}Y}Y~Y~XWVU~U~VVWVUTQOONOPQRSTTSRQSSUTTSQSSQTVTTTTTTTTTTUVVUTSRQPPQQQQQQQPPPPPOOPOMLKKKJJIHGGFEDCBAABCDEFEA?;97545678:::::;<<<<;::::;<>>??>>?AAA@>=<>@CEFFFEEDDDDEE@:75346:<>??=;?CCEJLNOQPNLJIGDLOC:>BCCIGFJLLNSOPV]^[VW\behhjdZ]_[STVWYZ]^^^^]^cd]YXUYYNF@<;=?EILJHHKHFFEDBAA@AA@@HJNOQQRRSTUTTPMIGFEDDCA@CCCILLLLMLKKKJHHJKJHFDEFGGGFGGGILMKLPQQQTUVWWWWWVUUUVY]aa~`~^~^WW]_~Y}\}\}]}]}^}_}`}a}c}d}e}g}h|g{g{gzg{g{h{i{j{l{j{h{m|l|l|k|k|k|k{jzizhzgyfxeydzdzc{b{a}_~acaa`aadb_bde_WSSTRRMX\YUNNW^VV[WQZ[UYcb]_edegijlptvx{|{{{{{{{{zxwvtttuvutqonnljhhhijd\XWOCAA=74322233555321159;=>>?@A@@??ABCCCCDGHHGGJMIEISQPRPONOPQQNKIJKLGCDEEDHHKJFGNRSTW[]]YYRRTSMKQSSSSSTTSOLJIJJIIJLNOPQST~V~W~W~X}Y}Z|Z|[|Z|Z|[|[|[|\|]|^|^|`|a|c|e|h{i{i{j{i{h{h{g{f{e{ezdzczcydyeyfygzgzhzhzhzhzhzgzfzfzfzgzhzgygyfxfxdxcxbybxaxbxbxcxcxdwexhyjylzozrzxyxxwx|yozg{e|e}d|c|c|b|b}b}b}c}d}c}c}b}c}c|c|b|b|b|b|b|b|b{b|c|d}c}c|c|b}a}a}b~b~b~`~a~b~b~`~`}`}`}`}`}a}b}c|c|b|a}a}a}a}a}a}b|b|b|b}a}b}c|c|b}c}c}d}f}g}g}g}g}h}i}i|i|i}j}j~h~e~d~e~eeedcbccccccbbbbbbba_]\\\\\\\\\\\[[Z[[Z[\]]^]]\\]^_`___````_^]\\]^^_`aaa_^^]\[YXWVUVVY[\]]\[YXWXXXXWWXXXYZ\\\\\\]]\ZZ_^________^]\\\\[ZYYYcxcxcxdxexexexexexexewewdwcwcwcxcxcxcxbxbxbxbxbxbxax`y_y`y`xaxbyazaz`z_{^z]z\z[{[}[}[|[|[|[|Z|Z}Z~Z~Z~Y~X~W}W}X}X~Y~X~WUTRRQRSTTUVVUTTUWYYZYXYYWZ[YXXWWWWWX~X~YZZZYVTRRRSSSSSRQPPPQPPONMKIIIIIIHGFEEDBA@?@AABCBA>;975555679;<<<=>>?>>=<<<<=>?@@@@ACDCCA@?>?AEGIIIIHGFDCBA>9667::=?A@?>=BDBDJKLKMLKHGGHEMOA9>IECJLHJLNPVVST[\[TW\_beige`[]]VSUX[]_abca\X`e^ZXVTSKD><=ADJOQMHHMHDCCCBDEEFEDCIKMNNMMMMNONNKIGEDCBBBB@CDDHJJIJJIIIIIHHJKIGEDFGHHIIIIJLPQOOSSTUXYY~Z~Z~Z~Z~Z~Y~Y~YYYZ\^~_~c~b~^~W\~b}`}\|_|_|_|`|a|a|b|c|d}e}e}h}i|h{h{hzhzi{i{j|k|m|l|i|n|m|m|m|l|k|k{j{i{hzgyexeydydzd{c{b}`}a~c`^^^_``]]`]WRPPONOLVZUQKKRYUXVQR[SNR[UQTZY[]_ag~kmotxyyyyyyyyxvtrqpqstsrpmjhgdcdfffgiea]RC<952334456888753239?ABBBCDEDCBABCCDEFFHJJJJMOIFIMMLLLKKMOPNKIHIKLHEHIKILKMLHGOSTWZ]^^[YPOQQKJNPOOOOOOKGECBDFHLOQRSTUV~W~X~X~X}Y}Y|Y|Y|X|X|W|X|X|X|Y|Z|Z|Z|\|]|_|b{d{g{h{i{i{i{i{h{g{g{gzgzfzeyeyfyfygzgzhzhzhzhzgzfzfzgzhziziziyhyhxgxgxexcybxaxax`x_x`xaxcxdxfyhzizjzqyzyxwvwyyh{d|c}c|c|c|b|b|a{a{a|b}b}a}a}a}a|a|`|`|`|`|a|b|c{c|d|e}e}e|d|c|b|a|_}_}`}^}^}_}_}^}^}^}_}_}_}_}_}`|_|^|]}]}^}_}`}a}b|d|d|d}d}d}d}c}c}c}b}a}d~ijhi~j~i~i~i}h}h}g~f~d~c~c~ccbbb`````__^^^^__^]\ZZ[[[[[\\\\\[[\\\]]]^___^^]\\]^^^^^__^^]\\\\\\\]]]]]\[[ZYWVUUTTTVXYZZZYXWWYZZZYYYYZ[[]]]]^^__^]]a`aabbbaa`_^]\[ZYXWWWdxdxdxexexeyfyfxfxfxewewewewexexdxdxdwcwbwbwcxcxcxbxayaybybybycycybzaz`z_z^z]z\{\|\|\{[{[{\{\{\|\|\|\}[}Z}Z}Y}Y}Y}Z}Y~X~WVUUUUUVUVVVVVVWXZ[\\[^^\^_][ZZZZYZ[[]^__[XTSSUVUUTRQPQPPPOMJKHDDGHIIIHGFDCCBA@@ABAA?=;:9888865679<==>???@@@>==<=>>@@AAABDDDDCBBCDFGHJLLJHFB>;:::98:?B?>BCB?=>DDBEIIIHJHICFIJGLMB:?JLGIONKKNQX[YXZ\]YZ\]_aagec`^^YVXZ]_`bcebZT[^\ZUQOLE?==?CHMSSMHFHFBADFGGHIIHGFJMMMJIHHHHHIJIGFEDDDDDDDFGGIJJIIIHHIIJJKLLJHGGIJKKLLMMNPTTRRUVXZ\\[~[~[~[}\}]}]}]~]}]~]~]}]}^}b~e~c~_~[~`}d}c|a|_|`|a|c|d|d|e|f|e|e|f|h|i|i{h{h{h{j{k|l}l}m}k}j}o}n}n}m}l|k{j{i{hzgzgyexeydydzd{d{c|a}a~a~_]\\\\[YWVRLKLNMMNLSVQMIHLQOSPKNVMHMSMNPRSVXZ]cggjpvxz{zzzzzxwtsrqrspnkigfedfeegfdegaVVL:742456:87:=<:87878>DDFDEFGHIFDACEFGHGHIJKLMOOLHIJKJJHHIKLLKHHIKKKJILMNLNMNNKJPTUX[\]\YVNMNNKKMLKKJKKLJHFFGHKOSU~W~X~X~X~Y~Y}Z}[}\}\}[|[|[|Z|Z|Y|Y|Y|Y|Y|Z|Z|Y|Y|Y|Z|[{^{`{c{f{h{i{i{i{i{h{h{hzizizhzhyhyhygzgzhzgzgzgzfzfzfzgzhzizjzjyiyiyixhxfxfyeydxcybyayaxaxaxbxcydzezfziypyzyyxwyszi{f{d|d|d{e{d{c{b{a{a|`|`|`|a}a|a|a|`|a|a|b|c{d|e|f|g|f|f|e|d|c|b|`}`}a}_}_}`}`}^}_}`}`}`}`}`}^}\}[}Z}Y}Y}Z}[~\~]~_}a}b~c~d}e}d}d}c}c}c}a~c~h~iddedddc~c~b~ba``^^]^^]]]]]\[[[[[[\\[[ZZZ[[\\\]]]\\]]]]]]]^_``__^]]]]^^]]\\[ZYYYZ[[ZZYYYYYYYYXWWVVVUUUVXXYYXXXXY[\]]\[\\\\\^_____`a`_`cbbcddca`_^]\[ZYXWWWWdwdxdxexeyfyfygygxgwfvevevewewfxewewewdwcwcxbxbxbxbxaybycycycycycyczbzaz`y_y_z^z]{\z\{\z\z\z^{^{^{^{^{]{\|[|[}[}Z}Z}Z}Y~Z~X~X~X~WWWWVVVVWWVWWYZ[\\\\[\\[ZZZZZZZ[\]_`^ZXTSTVVVTSQPPPPONMKHIGCDGJJJJIGFDCCBAAAABA?=;:999:996678:<<>?@@@@@?><<<>>>??@ABBCEEDDCDEFHJKMNMID>997668:<>BEA?BDA>;>ECAEHHFEGFI@FKLIJLD?AKRNIOULLNPW\\ZZ[]\\]]]`affec`^[XXZ^a_`a`_UPQSSRQLGD@>=>@DIOSSMGEEECBEGIJKKKJHIKNOMIGFGGFEEGGGFEEFGHHGGHIIJJJIIIHIIJKLMMLJIIKLMNNNORSRSUUTUVXZ\^^\\~[}\}^}^}_}_}_}`|a|`|`|`}d}e}b}`}_}b|e|e|d|^|c|e|g|g|f|f|g|f|f|g|h|h|i{h{g|h|j|l|l}m~l~j~o~o~m~n}m}l|j{i{hzgzfzfzfyfyezezd{d|c|b|b}a}^~\[ZXXVSRQPNLLLLLMMPOLHFEFHHIHJLKJJOOKPOPSVVX\bcdgnuxz{{{{{{ywutsrrqnkdgifejfffheeb^ZWH=944356;?;7=E@;9;9:;<<<==99:::;<>@AA@??>=<<===>>>?ABBCEFGHHHJKMNPRQNG@:632359?CCFHD>BC@=:@HDBGHEBBEDJ;ENOLJJGDDKPTOQUMNMNSY^^]\]]^]]]_adghgb^\ZVUW[[YZYVOLLKLLJFCA?>?ABEJPSPJFDDEGFHKMMOONMKLNRSPIFFHHGFGGGGGGIJKLLKKKLLKKJJJIJKKLNPPPNLLMNOPQQQSUVUVYXWXY[^_``]\~[}]}_}a|c}c}d|d{e{d{d|d}g}h~d~c~c~e}i}h}g|b|g}i}j}i}g}g|h|g|d|e|g|g{h{h|f|g|i|k|m|l}k}i~p~p~n}n}m}l|k|i{g{f{fzfzfzfzf{f{f{e|d|c|b|`}^~\YWVUSQPONMLLKJIJLLLJFCBCDEFGIKLMNPPNSQRTWWZ\__bejrwzz{{|||zywvtrqonmijigefghhgd`YQLKA:746679=?<8CI@9:@C>?CDAIGJLMNOOKCDFJLMLLKKKLNNNMMMLMMMMLLMMLJKLOOLKKKMNOPPOPQOPSUVWVTQOMKKLNONNNLKKLNPPQRSUWY[__^~a}`|`|_|_|_{`{`{`{a{a{a{`z_z^z^z^z_z`z`z`z`z_z^z]z\{[{[{\{^{`{b{d{e{f{g{h{i{j{j{j{k{kzkzkzjzizhzgzfzezezfzhzhzhzizjzjzkzlzjzjziyiyiyiyhyfyeydycybybybxbyayay_yayfynzuzzy{yzxuylzh{f{gzhzhzgzezc{a{_{^{]{^|_|_|_}`}`|`{a{b{c{c{d{e{e{d{d{d|d|d|d|c|b}b}b}b}b}a}a}b|c|d}d}b}_}]~[YXX~X~X~WXXXY[]`~b~c}d}c}b}a~`~_~^~][ZXWWXYYYZZYWWVWWXYYYYYYYYYYYYZ[[[ZZZ[[\]\\[ZZZZ[[[\]]^^^_^]]]]]\[[YWVUTSSSTVVVUUTTTTVWXXWWXXXWWVVWXWXWWWXYZ[\\[ZZYYZZ[]_____`abbccdeeeb\XWWVVVUUVVWXYexexfxgxiyiyjyjyjxjwivivhvhwhwhxhxhxgwfwewdxdxcxcycydydxexexexfxfyeyeyeyeydycyay`y`x_x^y_y`ybybybyazaz`zaz`z`z_z_z^{^|]|]|]|]|]|\}[}[~Z~Y~Y~X~X~W~W~W~V~V~WXYYYYYXXXWVV~VVVVVWVUTRRRSSTUTRQQQQPQQPNLIFDLJHLPQQOONLIGEDDDDDDCB@>==>>>=<><;;::;;=?BBBA@?>>?@@@@??@ACEGIJLLKKMNPRRSQLC<744558?>959;<=ADAAII<9BIFEKKGGIJKN=EONNIHLSMEJWWRQLNNOQTVX[ZWVWWVVVX[^]YTQQMHGFKLKKJIHFFEFFEEEEEFGHIKKLLKIHIHMRRPPRTVUTSRSUWXVNLLMNLKMNNNNPQRSSSSRQQPOPQQPPQRRSUVVUTSSTTTUWWVXZZZ[]\\]_acca`^]~_}a}d~f~hikkljjklljiggmnimnmli~g~b}d}e}c|b|c|d|d|c|d{e{f{i{j{h{h{i|l|k|l|l|k{k{k{j{i{h{g{gzfzfzf{f{f{e{e|e|e|c}a~_\ZXWUTPLJJJIFC>@GKHIHGHKLMNNNPRSUUONQQUVWVUUUUYZZ\aelrtvyywutrrrqooolib]ZSSZ^^ZMFGD>CD=9>A@ADIGEID:;AEB>?EHELJKMOOQRRKKKNOPONNNMMNOOOOOPQSTSSRRRRQSSUTQOMMNOOPPONNOPQRRQPPNMLMORUVW~X~YYY~Y~[~\~\~\~]}^}_}_~_}`}b~cce~h~h}g}e}e}d|e|e|f|f{g|g|f|e{d{czczdzdzdzezezezdzczb{b{a{`{a{b{c{c{c{c{c{c{c{d{e{e{e{f{f{g{f{e{e{d{c{bzbzczdzezezfzfzgzhzi{i|i{hzhzhzhzhzgzfyezdzbzbyayazazazazazbzbzazbzcydycydyczbzdze{e{e{c{a{_|]|\|[|\}\}\}\~\~\}\}^|_|`}a}a}b|b|c|c|d}d}c}c}b}a~`~`~`~``__~_~_~_^]~]\\]^^]\ZYXXWYZ[\\]^]\[[YXVTSUVVWWWWVVVVVWWXYYYYYXXYYYYZ[ZZZZZYYXXWVUTSTUUVVWXXYYYYYZZYXWVVVWWWVUUUUUUVVVVUUUUTUVVVVVWVUUUUVVWWWWWWXYYYYXWVVVVVWWXXXXXYYZZ[\\]][XVUVVVUUTTTUVVWgxfxhxjyjykykykykxkwjvjvjvjwjxjxixhxhwgwgxfyfyfyeydycxcxdxdxexexexeyeyfyfyfyexdxdxcxcxbyczbzczczczcycybycybyay`y`y_y^z^z^z^z^z^z]{\{[|Z|Y|Y}Y}Y}Z}Z~[~[~\~[~[~[~Z~Z~Y~XXXXWWWVVVVVUSSTUUTSSTUUUUUTRQONMMLKKMNOOOQPPNLJHGFEEDCDDEEDCBBBBB@===@@>==>>ADFGGGFEDDDDEEDCCDGIKMOQRRQPPPSUXL<66:<<=DBA>ADE?>=<>?A@@CJJGPOGKOLPNEEONOIIMRSPBQWSRPPPPRSUVYYXVUUTRPPQSRNKIIIJJKLLLLLKKIGGIIIIIJKLLLKKKKKJIKKLQWWUSTVWVVTSTUXXVPNNOPOORTRQRTTUVVVUUTSRQQRSRSTTTTVXXVUUUUUVWXXXY[[Z\^]]^`cdda___~a~c~e~hkmmllllmmoljhglmnqonkh~f~g~c~_}a}b}b}b|b|b|c{d{fzizj{f{g{h{i|k{k{k{k{k{k{k{j|i|h{h{g{f{f{f{f{f{g|g}f}e~c~`][YXWUQLHHHHFD8?GLGJLLMNQQPPPQSTWWR~PQSUV~Y~Y~X~VUUWW~VSVYagkpvvtsrrrqqooonje]^MMX[YTLJVSQKEA9EH@DCIFBCB:?EE?=?GLKILOMOOPQRLKKMNONNNMMMMNONNOQSTUUTTTTTSUVVVTROMOOOPPPPRQPQRRQOQRRSTVY[~[~\~]}]}^~_~_~`}`}`}_~`~a~a~a~a}b}c~deg~h~h~h~g~g}f|g|g|g|g|h|h|g|f|e{e{e{e{e{f{g{g{g{e{d{d{c{c{bzbzbzczczczczbzbzbzczczczdzd{e{e{d{d{c{b{azaza{a{b{b{b{b{b{c{c{d{e{f{f{g{g{gzfzfzezdzdzbzbzaz`z`zazbzczc{a{b{b{azay`y_y_z`zb{c{d|c|b|a|_}]}[}[}Z}Z}Z}[~[~[~[~\}]}^}_}`}_}_}_}_}`~`~`~_~_~^^^^]]\Z~Y~YZ[\~]\]^__]\ZZYYWWWXYZ[[\[ZYXVTSRSUVWWWWVVVVVVVWXXXXXXWXXYYXXXXYYYXWWVUUTSSSTTTUUVVVWXXXXXWUTSTUVWWWWWXXXWWWVVVUUTTTUVVVVVUUTUUUVVVWWWWWXXXXWVVVVVUUVVVVVUUUVVWXYYYXWVUVVVVVUTTUUVWixhxixkylykykykykxkwkvkvkvkwkxkxjxixhwhwhxhyhygygyeydxcxcxcxdxdxexexexfxgxgxgxfxexeyeydydzdzdzdzdzdydydydydyay`y`y`x`y`y`y`y`y`y_z]z\{\{[|[|[|\|]|^}_}_}_}_}^}]}[}Z}Z~Z~Y~Y~Y~YYXXXXXWWWXZ\[ZYYZ[\[ZYWSPNMMMMNOPPOOOONNLKJIHHHHGEEEFFEDCBCDEDB@@CCA@@ABDGIIJJIHGGGGGGFGGGJLNPSTVVUTSQSRSF724@CCCFLNLTRINRNQPIGMPPJKORUSIMUVVTTSSTTSSVYXVRPOLJIJLLJHHJLMNOPPOOOPPNLKMNOOQRSRQOOOOOONMOOPTZZVTUWWWVUSTVXXTRQQSRPRWYWVVWXYYYYXXWVUUTUUUVWWVWYZZYXXWWWXYZYYZ\\\^`__`bdec`__a~d~f~g~jlnnmllllmnmkjgmpqsokif~c~a~`~b}e}d}c}b|a|b|c|d{fzjzgzdzfzj{f{i{k{j{k{l{l{l{l|j|i{i{h{h{h{h{i{i{i|i}h~f~d~b`][YXVQKHGGHHI=AHMGNPPQRSSSRSSTTVXVTTVV}Y}\}\|Z|Y|X|Y|V|V}W}TUVX\bjqqqqrrqpoooopnjdcQPZYTNILXUUOKI@IJBE@NB:?>9<@B=?BKOLINRKNOPRRKJIKMNNNMMLLLLMNNOQRSTUUUUUTTUVWWWVROQPOOQQRVVTTTSRRUWWYYY\_~_~_~`}`}b~b~c~c~c~c~cbbccc~c~dfgj~k~k~k~j~i~h}h}h}h}h}h}i}h}h|g|g{g{g{g{h{i{i{i{h{g{g{g{g{fzezdzdzczczczbzbzbzbzczczczczczczbzazaz`z_z_z_{_{`{_{_{_{_{_{`{`{a{b{b{c{d{dzdzd{c{b{b{a{`{_z^{_{a{c{d|e{d{d{c{b{az_{^z]z_za{b{b|b}a}`}_~]~[~Z~Y~Y~Y~Z[ZZ~[~\~]]]\~[~[~[~\\\[[[Z[[ZYXVUUWY[~\\]^^][ZZ[[ZXWVVVWWXXXWWVUSQQRTUVVVVUUUUUUUVVWWWWWVWVVVUUUUVVVVUTTTSTTTTTTTTTTTTUVWVVUTRQPQSTVWXYZ[[[ZYYXWVUUTTTUUUUUUUTTUUUVVVVVVVVWWVVUTTUUUTTUUUUUTTTTUUUVUUVVVVWWWVVUUUVVWWhxhxixkxkylylylylxlwkwlvlvlwlxlxkxjxixjxjxiyiyiyhygyexdxcxcxcxdxdxexexfxgxhxhxgxgxfwgxfyeyezezezfzeyeyeyeydxdxbxbxaxayaybybybybyay_z^z^z^{^{^{_{`{`|a|b|b|b|a|_|]|\|[|[}[}Z~Y~XXWXYYYYXYZ\^~]\]^_``_]YUQOOOOOOPQQRQPOOPPONLJIJJJHGGFGGGFEEGGIHEEEGDBACDDEGJKMLKJJJJIHHIJJKMNQSVWYYXVTQNMKA657@IGFHGD@==<;><<>@CEEGOQOVTLQUORRLJNPPMORTVUPJQUWVTSTUVUTTURNIHGGFEGIIIIKMOPQRSSRRSSSRQPPRSUVWVUTRQQQQQPOPPRV[\WQTVVVUTRSUVUTSRTWSOT[][ZYZ[[Z[[[[ZYXWWXYYYYYWX~[~\~[~Z~Y~XWWWXYZZYY[]]_a``abbcb_^_~`~d~e~g~i~kmmkiijjjklkkinppqkfhid~a}c}f}d}c|a|`|b|c|d{e{hzhzezezhzj{f{h{j{j{k{l{m{l{k{k{j{j{i{i{j{j{j{j|i}i~h~feb_\ZYWTQMJIIHINDDJOJQSSSTVUSTVUTTTWWWVXY~Y~\~\}[|[|[{]{Y|X}Z|[ZYVZ^`efjmprpommllmnnnkY\eYSUSPXTRPPOFGEA@DL<:@@:9?ABEEEFNQQTSOSWSSQMKMNNMQSRSROLNQRQONOPQPONNJFDEEFFGHIIJKLNQRQQTUUUVVVUTSSUWY[ZYWSOOOOPPPPQRTWZZTPRUVUUTTUVVUTTUV[WRX_a_]]]]\\]^^^^[XXYZ[[[\[XY]~^~[~Z~Z~ZXWWWXZZYY[\]_aa`aabcb]~\~_~a~b~a~b~d~f~fffdc~e~g~fhkklknmmnhbg~h~e}d}e}e|b|c|b|b|d|c{d{d{h{hzgzhzj{i{g{j{i{i{k{k{l{lzl{k{j{i{i|i|j|j}i}h}g~g~gfdb_\YXUQNOMMKKKNIJNQPSTSSSSUUUXXUTSUVVU][~[~[~\~[~[}\|b|\}Z}]|`~]}\}Y|]}\\^]bdioqrrqooopqpndgkXVfbXWQRQRTKJFBBMJ@@B@98=FJLKPQLGMSHIOOKHEFHKLMMMMMLKJIIJJJJJJKLMMMMNOOPSUTROLMMMLMKIKNMOPRTWYWX[\[]a~b~b~b~c}c~d~e~e~f~g~fedd~c~c~d~d~f~h~j~l~l~l~l~k~j~j}j|i|h}h~h}h}i}i|i|i{h{h{h{i{i{h{h{h{g{g{hzhzgzgzfzfzezezezdzdzezfzfzgzfzfzezdzezezezdzczb{b{b{a{`{_{^{_{`{`{_{_{`|_|_|^{_{`{`{`{_|_{_{_{^{`{`{b{c{c{c{c|b|b|a{_|^|^|^|^{^{_|_}^}^~^~\~\~\~\~[}[~Z~[~[ZXWWW~V~V~U~T~T~UVWXXYYYXXXWVUVWXYZZ[[[[Z[\\\[[[[ZYWUTTUVWXXXWVVWXYYYXXXXXWVVVUTTTTTSTTTTTTTUUVVVVVUVWWWVVVVVVVVVVUUUUUUUTTTSTTVWXXXXXXXWWVVVVVUTUUUUVVVVVUVVVVVVVUUVVVUUUTTTUUUVVWWWWWVUUUUUUUTUUUUUVVVVVTSSSTUUewewgwiwlxmxmxmxlwlwkwlwmwmxmxlxkxkxkxkykykzkzkyjyiyhyfxdxcxcxcxdxdxexfxfxfxfxfxfxexexfxfxfxfyfyfyfyfyfyfyeyeydydycycydydydycydycycybybybxbycydyezezfzf{f{e{d{czaz`z_z^z]{]{\|[}Z~Z~Z~[~[~[~[~[~[~ZYYXWWXXXXWUTUWWXWWVVWXYYYWVUUSNKKLLLKKKKJJKKIIIJLMONMMQPIEFHHIJJNPQOLJKKIHIJLNONPPQRQPPOMLKG@??=<>>?ABEFFFEFNQRSQPQVSQOLJKJKKMNONMMJLNOMLKHHHHGFDCBDDEFFGIIJKKLNPQQORUVUVVUUTTUVWY[[ZVQNNOOOOPQQRUVYWSPQUUUUTUVWWVUTWY]XU]ab`^^^]]^^^^`_[XXYZ[[[\[YZ__\Z[[YWVWXYZYZ[\]_aaaaaacb~\~\~`~a~a~Z~]~_~]~]__~^~]~_~b}e~g~jklkkiikfd~e~f}e}f|g|e{e|e|b|f|d{d{czczh{hzhzi{k{f{gzkzjzizjzkzkzkzkzjzj{i|i}i}j}i~i~g~g~ffeca_\YVSNKOMNMMLNNOQSSTURSRRVVVXYUURTUUT^][Z[~Y~Z~]}f}]}Z|^|b}_|]{\z^{]|\}[[__djnqutqoopponljbW\nj_ZOURSVROLMNRKJFB?<=CIMOOQQOLMLJJMKJGEFHLMLMNNNLKJIIIIIIHHHIJJKKLLLNRTRPMLLMMLKJIIKLNORTVXZ[]]\^`~a~b~c~c~c~d~d~e~f~g~gecc~c~c}c}d}f~h~j~l~lllkj~i}h|h|g}g}h}h}h|h|i|h|h|h|g|h|h|h{g{g{gzgzgzhzhzg{g{f{f{e{e{e{e{e{fzfzfzfzfyfyfyfyfzfze{e{e{d{c{c{b{b{azaza{a{a{`{_{_{^{^{^{_{_{_{_{^{_{_{_|`|`|a{a{b{b{b{b{a{a{`|_|^|^|^|]|]|]|^|^}]~]}]}^}^|]}]}\}\}]~[~Y~X~X~W~V~U~U}T~T~U~U~V~W~XXXXXXWWVVUVWXXYZZZZZ[[\\[[[\[YWUTSUVXZ[[ZXXXYYYYYXXXXWVWWVUTTTTTTTTUUUUVVVVWWVVVWXWVVVVWWWWVVVVVVVVVVVUUTUVWXXWVVVWVVVVVVVUUVVVVVVWWVVVVVVUUUUUVVVUUUUUUVVWWXXYYYYXWVVUUUUUUVVUUVVWWVTSRSTTSewfwgwhwkxmxmxmxlwlwkxlxmxmymylylylylylylylzmzlzkzjziygyexexdxdxexexexexexexexexexexfxfxfxfxfxfyfyfygygyfyfyfyeyeyeydydyeyeyeyeyexexexewewfwfwgxhyhyhyhzhzgzezdzcybyay`y_z_{^|]|]}]}]~\~\~\~\~[[ZYWVUTSSRRSTVY[\]\\[\]^__^\ZXVSNLMNPOMMLLLLNNKKKLOOPOOPTSKHJLKLNOPPPNJIHGFEEGKLONNNMMLJIGEDDA?>@??@BDEEB@>==?ABBCEFIJJJIIMPRPNMMPOLJIGEEFGHIJJIHFGHIIHHGFEEEEDDDFGIIIIIIJJIJLMONKNRSSRRRSSTUVVXZYWTOKLNOPPQRSTUUUTPOPSUUUUVWYYXWWZ]`[Zbdd`^^^^^_^^]][XVVWXYZ[]]ZZab\Z]^[~W~V~V~W~Y~Z~Z~Z[\]_``aaa~`~b~b}]}[}`}c}^}V}Z}Z}Y}W~X~X}X~W~X~^}c}f}h~jkjgegjf~c}b|d|f|g|j|g{g|g|g|j|d{d{czazh{jzkzk{j{e{i{mzmzlzkzkzjzjzjzj{i{h|h}h}h~h~g~g~feedb_]ZWTRMHROOLNNOPRUUUUVRSSRWUUWXXVTSTUQ]aYYZVZ~\~b~a}\}`|e|a{^{_y`{`|`|\~^]\`dgimnllmnmmlkg]U`kkhfWRUUVUUUUVVQSLD??CINQSSSSRPNLLMLIIIHJJLMMMNNNMKJIIIIIIHHHIIIJKLLLLQSQOMOPPOOONMNOPRSTUWY[\]__`~a~a~b~cddd~d~e~f~h~hdbb~b}b}c}d}e}g~i~kkkige~d}d|d|d|e|g|h|h|h|h|h|h|h|g|g|g|g{g{g{gzgzgzhzhzg{g{f{g{g{g{g{f{e{dzdzdzdzezgyiyjzjzjzi{i{h{h{g{g{f{f{ezdzdzdzczbz`{`{`{_{_{^{_{_{_{_{^{^|_}_}`|a{`{`{`{a{b{a{a{a|`|`|_|]}\}[}[|[|\|\}]}^|_|`|`}_}_}^}_}^}\}[}[}Z}Z}Y}X~W~W~V~V~W~X~XXWVWWWWVVUUVVUVWWWWXYYZYYZ[[ZYWUTTUXZ]^_^]\ZXWWXXXXXWVVWXXVUUUUUVVVWWWXXWWWWWVVWXYXXXXWWXXXWWWWWWWWWWWWWVWXYYXVUUTUVVWXXXXXWWWWWXXWWVVVVVVVVVVUVWWVVVWWWWXXYZ[\\\ZYYXXWVVUUUVVWWXXYYWUSRRSSSewewfwgwjxkxlxmxlxlwkxlxmymymymymymymymymymzmzmzlzjziyhyfxfxexexexexexexexexexexexfxfxfxfxfxfxfyfyfygygygyfyfyfyfzeyeyeyeydydyeyfxfxfxfwfwgwhwhxiyjyjyjzizizgyfyeydycybyaz`z`{_{_|_}_}^~^~^~^~]~\~\ZXWVUTTTUVWZ\^`a`_^_`abb`]YVUSPOPRSRPNNNNOQQONNNOPPPQRTQLLNOOOPOMKKJIHGFFEEFHJLLLKIHHFDBBBBA@ADBBBBCCB@??@ACEFFGIJKMNMLKMNOLIGGIGFDDCAABCDFFFEDDFHJKKKJIIJJIHGGHJKLLKKJJJIIJKMMLNPRQQPPQRSTUVWVVVTQOPPQRQRSTUUTSRPONQSSTTUVVWXWW\_^[_hgc_^^]]]]\[YXVVVVVVWZ]`b]Z_b]Z]`]~Y~W~W~X~Y~Z~[~[~[~\~]~_~a~a~b~b~b~a}`}b}a}[}^}h}\}W}Y}X}W}U}U}T|U}T}U}\|a|c|f}g~h~f~c~b~c~g~g}d|_|d|h|j|m|i{i|i|i|i|c{d{dzazi{k{l{k{i{d{j{o{o{n{m{l{k{jzi{i{i|h}g}g~g~g~gffedb`^\YUTRMITPNIMOOPRUTSTVTVWWXTTWZ[ZXUWYSYZYXZVY~Z~`~d~^~_~c~`}^}_{b}c}c~____acceikjkmopoolgdbgjjgn_XZYYZZZYXWWYPJHKOQTVWWWWUSRQPPMKKMLMLMNNNNONMLKJJJIJJJJIIKIJMPOOORRQQQSRRRRSSTTTUUVVWX\^^^_a~a~a~a~a~bcccc~c~d~f~fc`a~`}`}b}c}e}f~h~i~ihfdb~a}`|`|a|b|d|f|g|g|h|h|h|h|g|f|f|f{f{f{ezezfzgzfzf{g{g{h{i{i{h{g{e{dzczbzbzdzfyhyizizj{k{k{k{j{j{i{i{i{hzgzfzdzczbz`{`{`{_{_{`{`{`{_{_{^|^|]}^}_|`{`{a{a{a{`{a{b{a|`|`|^|]}\}Z}Y|Y}Z}[~\~\}]|^|^}^}_}_}_}^}]}]}^}^}^}]}[~Y~Y~X~X~X~X~XXWVWXXXXWVVWWWVVUTTUVVWWXXYYXWWUTSUWY[\]^]\[YXWVVWXXWWWXYYYXXWWWWXXXXXWXXWWWVUVWYZYXXXXXXXXXXXXWWWWWWWWWVWXYYYWUTTUVVWXXXXWWWWWWXXWVVUUUUVVVVVUUVVVWWWWWWXYYZ[\\\ZXWWVVUUUTTTUVWWWWWVTRPQSSRewdwewfwhxjxlxlxlxlxlxmynynyoyoynynynynynynznzmzlzjyiygxgxgxgxfxfxexexexexexexexfxfxfxfxfxfxfxfyfyfyfyfyeyeyeyeydydydzdzdydydydydxexfxfxfxgwhwixjyjyjzjzjyjyiyhyfyeydycyczczczbzb{b{a|`|_}_}^}]~\~\ZYXWWVVWXZZ[\]]\\[ZZZ[\\[XUSRSRSTTTSRQQQQQSSQQQPQPPOOPPNLMQQONLJIGFGHJJIIIIJKLMNNMJHHHEDEEFDEEGEEEEDCBABBDEGIJJKKLOMLLKJIHIFECBCBBCDECCFEFFFEDDEHKMNONMMMMMLKJIJKMMMLLKLLKKKLNONNPQRRQQRRSTUVWXWVUSRRSTUUUTTTSSRRQPQRRRQSTTTTTSUY[[[`heb^\]\[[ZXWVUUVVVV~VW[_ac_Z]a_Z[_`~\~Y~X~X~Y~Z~[~\}]}^}_~`~b~c~b~c~b~`}`}c}c}]}_}f}]}\}[}Y}X}X|X|W{V{W|W{Z{]|`|c}c}d}b}a}`}^|c|d|c|]|c}h}l}p}l|k}m}f}f}e|d{ezd{j|l|n}k}h}e|k|p}o}o|m|k|j|i{j{j|i|i}g~g~fffeedb`^[YWTSRNLUPQHMMNPQTRRRVTVXYWTTW[_`\XY]XWVTX\V]Z~\ba]_`}`}_|c}e~fc_abefgi~k|j~hilorsrpnmnqomii_b`^a]^_[YZ[ZVSUXZZYXZZZYWTSSSRONNQQOMNPRRRRRQONMMMLNNNMMMNKMQTTSSTUUUTVSRSTVWXWWWXXXXZ_ba_`b~c~a~_~`~bbba`~_~`~b~b^\]~\}]}_}b}d}e~g~g~g~e~d~c~c}b|`|_|^|_|`|c|d|f|h|i|i|h|g|f|e|c|c{c{bzbzdzezfzf{g{h{i{k{l|k|j|h|g{e{d{c{czezfzgzh{i{k|l|m|m|l|l|k|k|i{g{f{dzbz`z`{`{`{`{`{`{a{a{`{_{_{^{]|]|^|_{_{_{_{`{`{`{a{`|_|^|]|\|\}[}[|Z}Z}Z~[~Z}[|[|[|[}\}]~]~]~^~^~^~^~]~]~\~[~Z~Y~Y~Y~Y~Y~X~X~X~XXYYYYXXYZYYXWWWWXXXXXYYYXXXWUTVWXYZ[[[ZZYXWWWXYYYXXYZYYYXXWWVVVVWWWXXWWVUVWX[[[[[ZYXXXXXXXXWWWXWXYYYXXYZZZXWVVVWWWXXXXWWXXWWXXWWVUUUUVVVVVUUVVUUUUUUVWWWWXXXXXWVVUUUTTSSSTUUUVVVUTRQQQQQdwcwdwewhxixlxlxlxmxmxnynyoyoyoyoyoyoyozozoznzmzlyjyhygxgxgxgxgxfxexexexexexexexfxgxgxgxgxgxgxgyfyeyexexexeyeydydydyczdzdydydydxdxexexexfxgxhxiyjzjzjzjyjyjyiyhygyfyfyeyeyezdzdzc{b{a|_|^|^}]}]}\~[~Z~YYYY~YXYZ~[~\~\~\~\~[[ZXWXXWWVVTQOPPQSUUUSRRUVTRSSRRQQPONMMNNLKLPONLKHEDCDHLMMMMMNNNOOOMJIIHGGGHHGIIJHHHGFEEEFFGILNMJLJKOLHIGFEEDDCDEFGGGGHEINOKHFDEEGILOPQPOOONNNMKKKLMNNMLLLLLLKMOOOOQRSSRQRRSSUVWWWVUSSSTSSTTTUTSSSSRRRSRQQSSSSRSSTXYYZ_bca]\[ZZYXWWVVUVW~W~W~W~X~Z~]~`a^[\`_[[`a~]~Z~Y~Y~Y}Z}[}\}]}^}_~`~b~d~c~c~c}a}`}c}e}b}b}e}^}^}]}Y}X}Y|Y{X{XzZzZ{[{[{^{a|a|b|a|`|_|\|`|d|a{^}d}g}n}p}k|j}j}g}e}e|e{ezf{j}k}ole}e}k}o}p~o}m}k}i|h|i{j|i|h}g~f~fedba_\[[ZXVTQOONRPQTNMMOQRQOPRRPQTTRRSY`fcWQ^^[_UWY\[WX_a^^`~_~^|b~fif`cdejkkkj}h|h~jmnprrqqtrpokhda]ce[^aba\[ZYZ\`g]\Z[ZZZVTSRQROSTUTPNOQSTTSSSSRQPPPQQQPOOOOPRVWVVVXYZ[[XTTUVVVVWXYYYZ\`ba_`bb_~]~^~ab`^]~]~^~_~^ZXY~W~X}[~`~d~e~f~f}e~d~c~c}c}a|`|^|]|\}]}_}b}e}h}i}h}g}g}f}d}b|b{a{a{a{b{c{d{e|g|h|j|k|m|l|k|i|h{g{f{d{c{dzezfzh{i{j|l|m|n|m|l|k|j|h{f{d{b{a{_{_|`|`|`|`|`{`{`z`z_z_{^{]|]|^|_{^{^{^z_{_{`{`{_|^|^|]|]|]|\|[|[|[}[~Z~Z}Z}Z|Y|Z|Z|[}\}\}]}^}^}^}]}]~\}[~[~Z~Z~Y~Y~Y}Y}Y~X~Y~Y~Z~Z~Y~YYZ[[[ZZYYXYXXXYYYYYY~YYYWVVWWYZZYYZYYXXXXXYYYYYYYYYXXXWWVUUVWWWWWWWWVVWY[\\[[[ZYXWWXXXXWWWWXYYYYYYZZZZYXWWWWXXXXWXWWXXWWWWWVVUUUTUVVVVUTUUUUTTSTUVVVVVVWWWVUUTTTTSSRRSSSSTUUTSRQQPPPdwcwdwewgxixkxlxmxmxmxnyozozpzoyoyoyozozozoznzmzkyiygygxgxhxhxgxfxexexexexexexexfxgxgxgxgxgxgxgyfyeyexexexeydydycxcyczczcycycycycxcxcxcydyexfxgyhzh{hziziyjyjyiyhyhyhygygygzfzfzdzbz`{^|]|]|\|\|[}[}Z}Z}[}[~[~[~[~[~\~]~]}]}]}\~\ZYWVVUTRQPONMNOPPQQPPPRTUTRRSRQPOMLKKLNNMLLLKJJIHHHGGKNPPPPPQQQQQOMKJJJJKLLMLLMMKKKJIHHHIIIKMNNJLIHOJEECBAACEGIJKLKKKLILSTPKHFFHJMPRRRQQQQQQPONMLLMNNMLKLMMMMNOPQQRSSRQQQPQSTUUVVUUTTTUTTUUUUTTUVVVVVUSQSUWVUSRRTVWXY[_a`][YXXWVVWXXXX~X~X}X}Y}Z}Z}[~^_^\\^`\Z_c~a~^~]~[~Z}Z}[}\}^}_}`~b~d~e~c~e~f}b}b}e}g}d}c}c}a}`}^}[}[}[|Z{Yz[y]y]z]z]|_|`}a|`|_|_|^|\|^|a|a|a}b}f}j}j|h|h}i}h}i}h|h|h|i}l~nqh`g~l~oo~o~l}j}h|g|i|i|g|g}f~ffeb_[YXWWWVTQNLMPQOPTNLKLMNNLKMNLMPPNMOTWWVOKXZW[PSUXVPU\b`]cZ\~_cifbfggkmkomh|g|g~ijlpsuuvtrrokiggf`X_fid`]]]]_cj`_\^ZZ[VTSRQQQRSUVQPORUWWWVVVVUTTTTTTTSRRRSUWXWWW[]^^^[WUUUUUUVWYZ[\]`a```a`~]~Z~]~_^\ZY~Y~Z~Z~XWWU~S~U~X]ac~e~e}c}b}a}b}b}a|_|]|[}Z}Y}Z}]}b}f}h}g}f}f}e}c}a|a{a{`{a{a{b{c{d|f|i|l|n|o}n}m}k}j|i|h|f|e|e{dzdzf{g{h|i|i|j|i|i|h|f|d{b{`{_{^{]{]|]|]|^|_|`{`{`z`z_z_z_z^{]{^|^{^{]{]z^{_{_{_{^|]|]|^|^|^|]|]|\{\|\}\~\~[}[}Z|Z|Z|[}\}\}]}]}^}^}^}]~\~[~[~[~Z~Z~Y~Z}Z}Z~Z~Z~Z~Z~Z~Z~YZ[\]][[[[[ZYYXYYY~Y~YZZZZYX~X~XYZZZYYYZZYXXXXWWXXXXXXWWVVVUUUVWWWVWXXXXWWXY[\\\[[ZYXWWXXXWWWWXYYZZ[[[[[ZYYXXXWXXXXXWWVWWWWWWWVVUUUUUUVVVVUTUUTTSSRSTUUUUUUUUUUTTSRRRQQQQQQQQQQQQQPPONNNdwcwdwewgxixjxkxlxlxlymymynzozozozoyoznznznzmzlzjyhygxgxhxhxgxfxfxexexfxfxexexfxgxgxgxgxgxgxgxfyfyeyfxfxfxfyeydydxdydzdzdyeyeydydxdxdxdydyexfxfygzg{gzhzhzhyhyhyiyiyiyiyiyiygyfyeycyaz_{^{^{]|]|]|]|]|\|]|]}]}]}]}\}\}]}^}^}^}^}]~\ZXWVUTRPONNNNNOOONMLMNOOOOOPPONLKKLNPRRQPMLLLMMLMMKIKMONNOOPPPPONLIIJKKKLNPNNOOMMLKJIIJKLLLLNQMPLIOIEDCCDEGHKMMOPONOPKMSVSMIGHJLORSSRRQPRSSSRQPOOOOOONMNNOOPQRSRRSSRQPOQQRSTTTUUUUVVVVUVWWWWWXXY~Y~Y~YXWUTVYZYXVUUVWWXXY[\]\ZYYYXXYZ[[[[~Z~Z}Z}Z}[}[}\~]~^~^~][]a`\_c~d~c~`~]~[}[}[}\}^}_}a}c~d~e~d~f~g~c~c~f~h~f~e~d}a}_}]}]}]}[|Z{[z^y_y`z`z`|a|a}a|`|_|_|^|]}_}`}a|d}g}g}g}e|f|e}f}i}k}k}k|k}j~nqldcfjlm}l}j|h|h|g|h|f}d}d~c~cc`\WTRQRSTUSQNKLPWPLNNLKJJKKIHJKGJKKJIJLKJKKMMOLTMQQQOLTZ`^[`WY]`daafgghlltsk~g{f|g~gglquwvuuurooong]^ckceca__^`ci``^`\Z[VTSSRQQQRTURPQTWXYXYYYYXXWWWWWWVVVVWXZZXWY^_aa`\WUSRSSTUWYZ\\]__^]\\[~Y~Y~Z~\[YXY~Y~Y~Y~VVWU~U~V~X~[^a~b~b}a}`}a}a}a}_|]|Z|X}W}V}W}X}Z}]}_}`}a}a}a}a}a|a{`{`{`{a{a{a{b|e|h|j|l|m}m}l}k}j|i|h|h|f|d{c{b{b|c|c}d}d}d}d}c}b}a}_|^|]|\|\}[}Z}Z}[}\}]|^{^{^z^z]z^z_z^{]{^|]|]{]z]{^{_{_{^{]|\|^|_|_|_|^|^|]|]|]}]~\~\}\}\|\|\|\}]}]}]}]}]}]}]}]~\~[~[~[~[~[~Z~Z}Z}Z~[~[~[~[~[~[ZZ[\]]\[[[[ZYYYXYY~YZZ[[\[[~Z~Z[\\[ZYYYYXXXWVVVVVVVWWWVVUUUVVVWXWWWXXXWWWWXZ[[ZZYXWVVVWWWWWWVWWXXYYYYYYXXWWVVUVVVUUVVVVVVVVVVUUTTTUUVVVVUTTTTSSRQPQRSSSSSSSSSRQQPONNNNMMNNNMMMNNMLLKJJJdwdwewfwhxhxixjxkxjxjykykylylymymymzmzmzmzlzlzkyiyhxgxhxhxgxfxfxfxexfxfxfxfxfxgxgxgxgxgxgxgxfyfyfyfygxgxhygygyfyfxeyfzfzfyfyfyfyfxexexeyeyfyfzfzfzgzgzgzhzgygyhyhyhyhyhyhygyfyeyeyczb{`{_{_|_|_|_|_|_{_{_{_|_|_|_|_|_|_|_|_|_|^}^~\~Z~YWVUTRQPOOONNOONNMLMNNNOOPPPPPOPPRTUUUTSPONNNNLLKJHIIJIKKMNNONMLJIJKKLLLLNLKLLJJJIIIIJJJJJJMMLOLHKGEFFFGHJKMNNNOOONOKKOQPKIKKMOQSTTTRPPSVWUUSRRRRRSRRQRQRRRSTTSSRQQPQQSTUUVVVWXYYZYYYXXXXYYYZZ[~[~[~Z~Y~X~WXZ\\[ZZY~Y~Y~Y~YZYZYZ[[ZZ[[[Z[\\\\Z~Z}[}[}[}\}]}]~^~_~_~^]_bb_`c~d~d~b~`~^}]}\}]}_}a}c}c}d~d~d~f~g~eeehge~d~c}_}[}^}_}\|Z{[{^z^z]z_z`|`|a|a|_|^|]|]|^|`|b|c|f}i~i~g}e}b}e~g~k~l~m~m~j~j~kleb~gfgij}h}f|e|e}d}d~b~^~\~[[ZWSQQOOPQQRQQONMPWPLNNMLKKLLLLMKHHIKLLNLKJIMMMLIPLRSRMKUY]ZX\TVZ[_[^bdcekovunjg|f}hffksxxwwwtrtwqjfdoedccca_\]_e^_^a]\]XUUVWWWVUVUTSSVXYYXZ[[[[[ZY[ZYXXXXY[[\[ZZ\__``_\WTRQRSTUWY\]\\]]]\~Y~Y~XY~Z~Y~\\YY\~]~\~YXXY[\~[~[~]~_~a~b~`}_~_~_~_~_~]}Y}V}T}S}S}T}T}T}T~V~X~Y~Z}\}]|^|_|_|_|_{_|`|`|a|b|d|f|h|i|i|i}i}h|h|g|f|d}b|a|_|^|^|^}^}^}_}_}^}]}]}\|[|Z|Y|X}W}W}X}Y}[}\|]{]{\{[|\|]|]{]{^|^}^|^|^|_|_|_|_|^|]|\}\|]|^|_|_}]|\|\}\}\~\~]}]}]}]|]|]}^}^}^}^}^}]~]}]~\}\}[}\}\}\}\}\}\}\~]~]~]~]~\~\~[[[[[[YXXYZYXWXXXY~Z[[\]]^]~]~]]^^][[YYXWWWVUUUUTTUUUUUUUTTVWWXXXWWWWWWWXXXXYXXXWVUTTTUUVVVWWWWXXYYYXXXXXWWVVUVVUVVUVVVVVVVVVVWWWVVUTUUUUUUUTTTSRRRRQQQPOOPPPPONLLKKKKKJKKJIIIIIHHGFEEEewewewfwhwhwhwiwixixiyiyjxkxkykykykykykykykyjyiyhxgwgwgxgxfxexfxfxfxfxfxfxfxgxgxgxgxgxgxfxfyfyfyfygyhyhyhyhygygyfyfyfyfyfygyfyfyfxfxfxfyeyezfzeyfyfzgzgygygygygxgxgxfyfyfyeyeydydyczbz`z`z`{`{`{`{`{`{`{a{a{`{`{`{`{`{`{`{`{`|_|^}\}[~Y~XVUTSRQPPOOONNNMLMNOOOOPRRRQQQRSTVWWVUSQONNNMLKKIHIIIIIJKLMMLLKJIJJKKLLKLIIIIIIHIIIIIHHHHHIHIIIGIGHHIIJJKLMMMMNNMMMKJMNMKJLMNOQTUUTQNOSXXVVUSSTTTUUUTTTSSSTUTTSQQPPRRTUVWWWXXZZZ[[[ZZYYZZZZ~[~[~[}Z}[}Z}Y~X~X~X~Z~\~]~\~[~[~]~\}[}[}Z~Z[[[Z[ZZ[\\\[[\\\[Z~Z}Z}Z}[}\}]}^}_}`}`}_~_~a~d~d~a~b~d~e~d~c~a~`}^}]}^}`}b}d}d}d}d}e}g~hfeefg~e~d}c}_}\}^}_}[|Z|[{_{]z[{]{`{^{`|_|^|\|\|\|^|`|c|e|g~i~i~h~f~b}e~h~l~llki~i~ig~d~d~e~dde~d~b}_}_}_~^~]~[XVSRSRQPQNNOPOPPOONNOPPMNOONMLLMMNNKIHJLNOPNLNPPQPVMNRVWVTPSYZXTUTTXYVPZ[Z\dgostslh|f}hecgryxxxxtssspnmpldcdcdc_ZXZ\^^^^^^\ZWWYYZZYWWWUTUWXYYXZ\\\]]\Z\\ZYYZYZ]\]\\\^`_a`]\WTRQPRTVVZ]^]\]]\[~X~X~Y[[Y\~\~ZY]_]~Z~Y\_^][~\~^~`~a~a~`}^~]^^\~Z~W~T~S~R}R}S}T}T}S~TUV~W}X|Z|[|\|]|^|^|_|_|`|`|a{b{c{d{e|f|g|f|f|f|e|d}b}`}^}]|\|\|\|[|[|\}[}\}[|[|Z}Z}Y}X}X}V}V}V}W|Z|[|\|[|Z|Z|Z|[|\|\|]|]}^|^|^|_|_}_|_|_|]|\|\}]}_}`}_}]}\|[}[}[}\}\}]}]}]|]|]}^}^}^}^}]~]~]~\~\}\|\|]}]|]|\|]|]}]}]}]~]}]}\}\~[[ZZYYXWWXXWWVWWXYZ[\\]^__^~___^]\[YWWVUUUTTUTTSTTTUUUTTTUVXXXWWWWVVVVWWWXXWWVVTSRRRSTTUUVVVWWXXXXXWXWWWVUUUUUVVVVVUVVVVVVVWXXXWVUTSTTTTTTUTSSRRQPPONMLMNONMLKJJIIIIIIIHHHGFEEEDCBBBBewfwfwgwhwgwgwgwgwgxfxfxgwhwhwiwixixixiyixixhxhxgxgxfxexexexfxfxfxfxfxfxfxfxfxgxfxfxfxfxfyfyeydyeyfyhyiyiyiyiyiyhygygygygygygygygygyfyeyeyezezeyfyfygygyhygygyfxfxexeyeyeydydycydzdzdzdzczbzbzbzbzczc{c{c{b{b{b{b{c{bzbzb{a{a{`{^|\}[}Y}X}W~V~TTTSRQQPPOONMLMPSTSSTUUUUUVWWXYXWUSRPNMMLLLKJJJKLKKJJKKLLKJIIJJJJJJIHGFFFFGGHHGGGGFFEFEEDEEEFHIKKLLLLKKJJJJJJJIIIHIJKKLOPPPSUWVTPMOTYXVXWUTVVWWXXXXWVTTTTTSRQPPQRTVWXXX~W~XY[\\]]]\[YXYYZZ~Z~Z~Z}Y}Z}Z}Y}X}X}Y}Z}\}\}[}[}\}]}\|\|\|\}\}]~]~^^]\[[\\]\\\\[ZY~Z~Z~Z}Z}[}]}^}_}_}_}`}b}d}e}f~e~e~g~g~f}c~a~`~_}^}_|a|c}d}e}e|f}g}h~h~hgdde~c}c}b|^}^}]}]|[|[|\|_|\|Y|\{]{\{^{^{]{\{\{\{^|a|e|f|i~i~i~i~h~hikmmjgde~f~f}e}b}a}a}`}_~\~[~X~X~Z~YXVSQPQRQRQQOPQPPOONNNOPPQQRRRQPOOPQRQLJKMORSTQPRUUVT[UTW[[ZWSVWWUTRQUXVRMUTWbjorononh}i~feceqyyxxvuuuutsrrleeecef`WTVXZ[\]^_^]YY\^``_][ZXVVWXXZY[^]^_`^[]][Z[][]a__^^^^`^^^\[XTRQRTVVW[__^]~]}]~]~\~[~\~]``Z^~^~ZX^b_~^~^ada^]~_~a~a~`~`~_~]~\~\~YWUSST~T~U~U}T}S~TTTVX~X}W|X|X|Y|[|]|^|_|`|`|a|a|`{`{a{b{c|c|c|b|b|`}]}[~Y~X}X|X|X|W|W|W}W}X|X|X|Y}Y}Y}X}X}V}V|U}V}X|Z|[|Z|Y|Y}X}Y}Y}[|\|]}^|^|^|_|_}_~_}_}^}\|Z}\}^}`~^~\~\}[}Z}Z}[}\}]}]}]}\}\}\}]}]}]~]~]\\~\}\|]|]|^|^{^|^|_}_}_}_~_}_}^}]~\~[~Z~YXWVTTUTTUVWXYY[\]^_`a``aaa`^\[YVUTSSTSSSSSSTTSTTTSSRTUWWVVVVVVUUUVVWWWVUTSQPOOQRRSSTUUVWWXYYYXXXXXWVUUUUUVVVVVVVWWXXXXXYZZXVSSRSSRRSTVVSQPOONMKJIIJKLLJIHGGHHFFGGGFGHFCAAA@@????gwgwgwhwhwhwgwgwfwewewewfvfvgvhwhxhxhxhxgxgxgxgxfxfxexdxdxdxexexexexexfxfxfxfxfxexexexdxdydydydyeyeygygygyhyhyhyhygygygygygyfyfyfyeyeydydyezfzfyfyfyfyfyfyfyfyexdxdxdycycybycydydyeyeyeydydycycyczdze{e{d{d{c{c{c{d{dzdzczczb{a{_|]|\|[|Z|Y}X}V~VVUTSSRRPPONNOQSTSSSSRSSTUUUUUTSRPOMLMMMMLLLMNPQQPPOONNMKJHHHIHHGGGFDDCCDEFEEEEEEDCDEDDCCDEFHJLLLLLKKJIIHHHHHHHHIIJKMNQRRRTVXVSOLNSXYWYYWUVWWXXYYYXWUUTTTSRQPQSUWXWW~W~W~W~WXZ[[[[ZZYWXYZZZ~Z~Z~Z}Y}Z}Z}Y}X}Y}Y}Z}Z}Z}Y}Z}[}[}[|[|\|\}]}^~_~``_^\[[\\[[[[ZYXZ~Z~Z~Z}[}\}^}^}^}^}`}b}d}f}g~f~g~j~k}h}c}`~`}`}`|a|b|c}d}e}e|e}f}g~h~jgbbb~b}a|a|^|_|`|_|\{\|]|`|]|[|\{Z{\{_{_{_{^{]{\{^|a|e}g}j~j~j~j~k~jgdcbcehg~e~d}b}^}]}]}[}Y~W~W~U~V~V~UTRQQRTUUTSRQRSSSSSRRRRSSTTUTTSRQQSTTTNLMOPTUWUTWZZZU][ZZ^_]YVYXXWVTQVYVTQRN[hjnnkh|k}p~k}hffgiovxxxwuuuuuutsolkjghhaWTVXZ[\]^_^][\^bcdca_]ZXVWXX[[]]\^`a_[\]\]^`^^a``^]]]^[][YZYVTTUWYWX\``^]~]}^~^~]~]~_~_`c__~`ZX_b`~`~acda]^a~b~a~`~_~^~^~\ZWTSTUW~W~X}X}V}U~U~V~W~Y~[}Z}X|X|W|X|Y|[|]|^|_|_|`|_|^|^{^{^{_|`}_}^}]}]~Z~W~V~U}V}W}X|X|W|V}W}X|Y|Y|Y}Z}Z}Y}Y}W}W}V}V}W}Z}Z|X|X|W}V}W}X}Y|Z|[}[|\|\|\}]~]~]~]}\}Z}Y}Z}\}^~]~[~[}Z}Y}Y}Z}[}[}[}[}[}Z~Z~Z~ZZ[[~[[~[~\}\|]}]}]|]|]|^}^~^}_}_}_~^~]~\~[ZXWVUTTTRRTUVWXXZ\]^_``__``a`_][XVTSSSSTTSSSSTTSSSTTTSSTUUTTUUUTTSSTTTTSRRRPONMMOPPQQQRTUVWXYYXWWXWWVUUTTTTTTTSSTTSTUWWVVWVVTQONNONNMNPRRONMLJIIGFEEFGHGFEEDEDDDCCDDCCDCA?>>>==<<=<<<<<<;;jxjxjxjwkwjwiwgxfwewewfwgvgvgwgwfwgwgwgwgxfxexdxdxcxbxcycxcxcxcxcxcxcxcxcxcxcxcxcxcxbxbybycycxcxdxdxdyeyeyfyfyfyfyexdxdxdxcxcxbxbxcybybycydyexeyeyeyeyeyeyeydxcxbxayayayaybybycxdyeyeyeydycycycydyezezezezezdzdzezfzfyfydzczbzbz`z`{`{_{^{^|]|[}Z}Y~W~VUUTSRQPPOOPPOMLLMMMMMMMMMMLKKLKKKLLLLLKLMOQTUVVTQONLJHGEDCDCDCCDDDCCCCCCCBCDEFFFGHHGHHIIKLMMLKJIIIIHHGIIKMOOOONNPQRRQQRSUTRQOQSUUTVUUUVXXXXWVVVVUUUTTSRRSUXYXWV~U~U}T}R}S~T~U~U~VVVVVW~Y~Z\\\\~[}Z}Y}Y}Y}Y}Y}Y}Y}Z|Z|Y|X|W|W|X|Y}Y|Y|Y|[|\|^}_}`}_~^]\[[ZYXWYZYW~Y}X}X}[|\|\|\|\|\|\|]|^|_|a|c}e}f}g}i}i}g|d|a|a}c}d|d|c|c|e|d}c}c}e~fghea`~`~`}`|_|]|a|b|`|[{^{`|_|_|b|b|^|]|`|`|`{`{`{`{a|c}f}i}l~n~mligfffghgda~_~^}\}Y}W}U}T}T~T~U~VVVVTSRRUXYXVTRQQSUVXZ[ZYXXWWVVUSRQPQSVVWSRQSRQRWVTZ_\XV]]WZ\^[YUXYXWXYR~W~^~][YRX^a`cghhklmjginnqstvuwwwwvvvvuuttssqmgddddcca_^__^]^_ceedcb`^[YXYY[[]\]^^_^\\\\\[[Z\\ZZ[\[YZ[XUWY[[[\^_`^]^``]\^~_~_~_~_~acafdcc`_`bcd~deea_`aa_[YXXXWVUVWX~Y~Y~Z~Z~Y}X}X}X~X~X~X~W}W}W}W}X}X}X}Y}Y}Z}Z}Z}[}Z|Y|X|X|Y}Z}Z|[|\|[}[}Z}Z}Z}Z|[|\|[{Y|X}X}Y}Z|\}\}]}]}\}[}[}Z}Y}X}X}Y}X|V|V{U{V|V|V|V|W|W}W~W}W}V}W~W~W~U}U}W~X~Y~X~YYZZ~[~Z~Y~Y~Y~Y~Y~Y~X~W~VVVUUUVVXY~Z~[~\~\}[}[}\~]]~]^~^~^~]~\[ZYXWVUUTSRSRQQRTUVXYZ[\\\]^^]\ZXVVUUVWXXXXXXXXXWWWWWWVVUTSQPQQQPONNNNNNNOPPQPOOOPPQQPOOQSTUVVVVVVVVUUTTTSTSSQPOOOONNMMLLMMMLJIHGFFEDCDFFFFEDCCBA@?>?@@@@@@@????>>>??????=<;;;<<;;;kyjxkxlxkwkwiwgwgxfxhxixiwiwhwhwhwhwhwhwgxfxexdxcxbxaxaxbxcxbxbxaxaxaxbxbxbxbxbxbxbxbxbxbxbxbxcxcxcxdxdydyeyeyeyeydxcxbxbxbxbxbxbxbyaybycydyexexeyeyeyeyeyexcxbxayay`yayaybybycxdyeyeydycybyaybycydzezezdzdzdzezfzfzfyeydzczbzbzazaza{a{a{a{`|]|\|Z}X~W~V~UTSRQPONMLMLKIIJJJJKKKJJJKKKLLLKLLLLKLMNOQSSSROKHGHIIHGGFGFEDDDFGFEDDCCCBDFGFHIIIJJKKJIKLLLKJIIIIHHIJLMOQSSSSRQRRSRQQQQTRRRRRSTTTTTTUUWYXVUTTTUUTTTTTTVWWXWVTSS~U}R}Q~R~S~T}U}V~V~V~W~W~Y~[~\~]~^~]~]}\}Z}Y}X}X}Y}Y}Y}Y}Z|Z|Y|X|W|X|Y|Z|Z{Y{Y{[{[|]|]|^|^}]~\~\~\\[[Z[][W~U}Y|Y|Y|]|]|]|^|^|^|]|]|]|]|]|_|c|d|e|h|h|g|e|c|b}c}d}d}d}d|e|e|d}d}e~ffed~d~c}a}`}_|`{\{`{b{`{[{^{_|_|`|d|c|_|^|`|`|`|a{b{b{b|d}f}i}m~n~nljiiihhea^\~[~Z}Y}W}V}U}T}S~T~UVVUUTSRTVYYXVTRRQRTVYZ[ZZYYYYWTRPPOPQSUWXVUUVSPPTVTWZXUV\\TXZ[ZXUXYZYZ[V~[~`~]~[~[V[\^_abehjkln~klnnppprsvvvvuvvvuuvwwwvtqrrqpnjea_`^^]^`deedcba`^\[[[\\]]]]]]~]~\~\~[[[YXWYXXXZZYYZ[WUVX[]^^^`````a`^\__~_~^~`~adagfedccccdddddcbaa_\YUTUVVUUUUU~V~WXXW~W~V~UUUU~U~T~U~V~X~X~X}X~W~W~W~X}X}X}X}W}W}W~Z~\}]}^}^}]}]}]}]|^{^{^{]|[|Y}Y}Z|[|]}]}^}^}]}\}\}\}[}Z}Z}Y}X|V|W|X{Y|Y|X|W|V}V~V}V}V}V}U~T~T~S}T}U~U~V~WWXY[]~\~Z~Y~Y~Y~Y~X~W~VVUTSSSTUVXYZZ~Z~Z~Z~[\\]]\\[[ZZZYXWVVUUTTSRPPQRSTUVWXYYYZ[ZYXWUUVVXYZ[[ZZZZZZZZYYYYYXWTSQQPQPNMLLKKKLMOPQRRQQRSRRRQPPQRSTUUUTTTUTSSSTUTSRRPNMNNMMMLIHGIIJHFDCCA??>=>@ABA@@???>=<;<>>?>==<<<;;;;<====>=<;;:;<<<<<:99;>?@>>==<<;;:9;==>=<;::9999:;<<;;<<;:::;<<<<:8767;>?@><<;;;;989:<=>=<;:98779::;;::;:::::;<<<=>=85678:=>>=<;;:;:888:<===<:9987789:::::99999:;<<===p{q{r{r{qzpznzmznzozpzozn{n{nznznznznylyiyfygyeyay^xdxixgxexdxdxcxbx^x^xbxbxbxbxcxcwcwbwaxax`x`xbxbxbyayaxaxaxawawawawbxcxcxdxdxdxcxcxdxcxcxcxcxcxbwbwbxbxbxbxbxcydycycycydydycycybybyayayayayaxaxaxayaz`z`z`z`zazayayayazazbzczczcycybybycybyaz`z_z^z_z_{^{^|]}Z~X~W~V~U~TSRRRQQQPPOPQQQQQPPPPPQQRRQPPQRRRRQPPPPPPPPPONNNNNMLMNPQPNMNOONMKIHGHIJMQSSTTSSRRSRQQSTUXSX`WVWYWV^_`\^URUVSQPQRSUUWWVURQOOPRTUVUTSSUW~Z~\~^~]~\~[~[~\~]~]~\~Z~X~X~Y~Z~\~]}Y}Y|\}]|]|\|\{[{[{[{Z{[|]|^|^|]|]|]|\|[|Y|V|[|]|]|\|^|\|[{]|b{_{_{^|]|\|[{Z{Z{Z{Y|Z|Y{Y{W{X|Z}Z|[|[|[|Z|Y|Y|X|Y{\{_|c|d|g|h|h|h|g|f|f|e|d|c|b{a{azc{d{d{c{c{c{c|c|b|b|b|b{b{c{d{ezfzg{g{g{f{f{f{f{d{bz`z^zbzf{g{dz`z_z_za{b{d{f{e{bz`z^zbzd{d{a{]|\|`}a~c~d~e~d~a~_~_~^}[}X}V~U~X~X~W}W}W~W~VUTTT~S~R~R~T~U~V}W}W~X~Y~Z~Z~Z~Z~Y~\}\}Y}[}V~V~\^__```_^\[ZYZZZ~U~U~X~Z]]\[ZWWWZ[YWTSSTU\VYZ\[[_~\~X~Z~a~_~fZdd`ahfbaa^`f`]kgc`bbdcgjiggggghhggjmqtvvvvvvvvtroljgc__^`bddeecbabccdfda]ajkbaeabddb`][YXYYYXXYXXWVUUUWXYWWWWWXXY[~\~\~]~\~[~Z~[[YYZ]__^^^]\\[ZZZZXWVVWWXYZ~YWY[YWYZYXXWVV~VVUVWXW~V~W~X~Y~Y}Z}Y~YXW~X~Y}Z}Y}Y~Z~[]~_}`}b}d~deeea_^]_~Z~Y~^~b~cccb~c~b~`~a~a}a}`}_|_}^}]}^|^|[}]}^~^~^}]}^}_}_}^~]}]}]|\}[}Z~Z~[~ZZYYXXWVWXXWVUTSS~U~V~W~X~YXWWV~VUUTTUUVVUTTUVWWWWWWVWXWVWVUVWVUTSSSTTTUUUTTTTUVWWVUUUUTTVWWXWUTUVVVUTTSSSSSSTSSRQQPOOONOPPQQQQQQQPPQQQRQRQQQQPQQQPONLKIHHIGEDGB<;=?ABB@>==;52457:=>>=;::<<;:988:<==<;:98778:;;;:989999:;<<===q{q{r{q{qzpznznzozpzpzo{n{o{o{ozoznzozmyjyhyfydy`y`ygxjxfxfxdxdxdwbx^x^xbxbxbxbwcwcwcwbwbxaxaxaxbxbxayay`x`x`xawawawbwbxcxcxdxdwdwdwdxdxdxdxcxcxcwcwbwbxcxcxcxcxcxdxdxdxdxdxdxcxcxbybybxbxaxayayayayay`z`z_z`z`zazayayay`zazbzbzbzbybyayaxbxbybybyay`yayazaz`{_{]}[}Z}X}W}V}V~UUUTTSSRQRSTTSSRRRRQRRSSSRRRSSRRQQQRQQQQQQPOOOOONMNOPPOLMOQOLKKJHIJKMPSUUTTRQRRSSRQUX[[TWcZTYZWV^``[^SPQQRRRQRSUWXXWURQOOPRTUUUTTUV~X~[~\~^~^~]~[~[~]~^~^~^~]~[~[~\~]~_}`}\|]|_}`|`|_|_{^{^{^{^{_|_|_|_|_|_|_|^|^|\|X|Z|^|^|]|`|^{\{]|b{`{a|`|_{]{\z[z[{Z{Z{[{\{[{[{Z|[|\{]{]|]|\|[|[|Z|]{b|c|e|g|i|i|i|h}h}g|f|f|e|d{c{c{d{e{e{d{d|d|d|c|b|b|a|`|a{a{b{c{dzfzhzi{i{h{g{f{e{d{bzaz^zb{g{h{e{bzaz`za{b{e{i{i{fzbz^zbze{e{b|_|^|b}b~b~dc~a~^~]~]}]}Z}Y}X}X}X}V}V}W~W~WVUUUUT~T~T~V~X}Z}Z}Z~\~\~[~[~[~\~[~^}_}\}^}X~X~_baabbba`_]]\[\]~W~V~X~Z]^^]ZXYY[]ZYVVTOUa\VWYYZ^[WXe~\~d[adaagedbaacfcahda`cdb`gjhecccdcb`adgknppqrqqqponllkfb`a`abcddc`_]^``accb^bjlcbgdccba_][YYZZZ[[[[[ZYXWVWXWXWVVVWWXY~Z~[~\~[~Z~YYYWVVWXXXXYYXXWWXXXWUSTXZZZYYZ^]WV[\ZYXWVV~WXWXXXX~W~X~Y~Y~Z~Y~Y~X~WW~W~X}Y}X}X~Y~Z\~^}`}b}d~eeed]ZY[^~Z~X~^~b~c~b~a~a~`addd~b}`~`}_}_}^}^}^}\}_~_~^~]}^}^}_}_}_~^}^}^|]}\}\~\~[[YYXXXWXYZ[[ZYWVU~V~X}Y~Y~ZYXWW~VVVVUUVVVUTUWXXXXVUVWXWWXYXVUVVVUTSSRRRRRRRSSSTUUTTRRRRQQRSSTSQPQRSSQPPPPPPOPQRRRRQONNNMMMNNNNNNNNNNNOOOOOPPPOOOOOOONKJHGGHGDEF>79;=?@A?>=<:534469<>=;999:::9999:;<<<;:987789;<;:988999:;<=>>=nznznznzozozoyozp{q{pzp|p|q{q{p{p{p{ozmzjyhyeycybydykykxfxfxewewdwbw]w_wbwbwbwbwcwcvcwcwbwbwbxbxcxcwbxbxaxaxawawawawbwbxcxcxdwewewdwdxdxdxdxdxdxcwcwcwcxcxcxcxcxdxdxdxexexfwewdwcwbxbxbwbxbxbybybybybyazaz`z`z`zayaxayay`z`{azazaz`y`yayaxbxbycycybybxbxbyayaz`z_{]|[|Z|Y|X|X|X}X}X~WVVUTTTUUUUUTTUUTTSSSSSRSTTSSSRRSRQQQQQQQPPPPOOOOPONLNOPNLLLLKKKLMOQRRRROOOPPQQRU[_^WXe\X\\XW[]\XWSNOPRRRRUVWXZZZXUSQQQSTUUUTUV~X~Z~\~\~]~^~]~\~\~^~_~_~`~_~^~^~^~_~`}`}_|`|b}c|b|b|a|a{a|b|b|c}c}b}c|b}a|b|a|a|_|[|\|_|`|_|a|`{^{_|c{c{c{b|`|`{_{^z]z\{\{^{_{_{^|]|]{^{^{^|^|^|]|]|^|a|d|f|h|h|i|i|h|g}f}e|d|d|d|c{d{e{g|g|f|e|e|g|f|d|b|a|`|_|`{`{a{a{bzdzfzhzhzh{g{e{d{c{bzbz`{c{g{i{f{czbzczd{d{f{j{j{h{e{azc{f{f{d|a|a|e}f~f~ec~a~^~]~^}_}]}Z}Y}X}W}U}V}W}W}W~V~V~W~W~W~W}W}X}Y}[}]}]}]~_~_~^~\~^~_~]~a}`}^}`}Z~Z~bddccedcaa``^\^_YXY[^`^]YYZ[^\XXXWSOZdWPRTUW[ZXZf_bZ^d~`_eddca`badbba_`aa_^cfc`^]^^\[ZZ]^beggggffffefhgca_^``___```][YZ\]^_``_bgibbgecbaa_][ZZ[\^\]\\\[ZY~XWXXXYXVVVVWXY~Y}Z}Z~Y~Y~XXWVUTSSSSSTUUUTTUWWWUTV[]]\\[]`]WWZ[YXWWVW~XYYZZZZ~Y~Y~Z~Y~Y~Y~Y~Y~XW~W~W~W}V~W~YZ[~]~^}`}a~bcba[XY\\[~Z~^~`~a~a~_]]_dfc`^\]\Z[~\~Z~\~^[Y~Z~[}\}]~]~\~]}]}\}[}[~[~[ZXWWVWXYZ[\\\\[ZYZ[\]\[YXXYYYZYXXXXVTUWXXYXVWXXXWXYYXVUVVVUTSRRQQQQPPOOOPQQQPPOPONMMMMMLKKLMMMLKKJKLKKKLMMNNMMLLKJIIIHHHHGIIJKKJJJLLMMMMMMMLLLKIGEDDEDBCC;47;=>>?>=<;955557:<=<98889999::99;<<<;;:97789;;;;988999:;<>>=>=<;854557:<=;87789999:;:::;<<<<;98789:;;;989999:;=>>===>>=>>947;=<=>=<<;85578:<>><9888::99:;<<;;;<<<<:9789:;;9889::::;======<;=???>==<<=>>>>?@@AAAA@@>?@@?=<;<=>>>=<;=?@BBBBABBBBBB@><;;<<<>>956:<<<=>><:86789<>@@=:99:;;::;<==<<;<<<;:8789:::9889::::;====>>=<;;<==<<:879;<>>?>>?@@@AA?=<;;<<<==:669;<=>??=;879:<>@BA?<;;;<<;<=>>==<;<<<;:8889:::988:::;<<=====>=>>????<;::<====:658;<>?@@><97:<>@BCB@=<;<==<<=>>>=<;;;;:98999:::9889:;<<=>>==;;<<9;??;;::98888789::9999998889:::::::;;;<==<;;;;;<===:8789:98899:;<<==>>=<;;<=>>><857:<>ABB@<99<>@ACCB?>==>??>>?@@@?>=<<<;:9::::::9889;<=>>?>==?><967:=@CDCA=::>@BDDDC@?>?@@@@@AAAA@?>==<<;:;;;;::999:<=>???>=<;dwdwdwdwdwdwdwdwdwdwewexfxgxgyfyfydxcydyeydydycyaybxdxewdwcvevevfvfwhwjwjwiwgvevcvdwfwgwgwhwjwkwiwgwfwgwiwjwlxkxixhxfxgxjxkwlwlwjwiwhwhwhwhwhwhwhwiwixhxhxgxgxfxfxewewfwfwfwfwfwfwfwfwfwfvfvfvewewfwgwgwgwhwhwiwjxjxiwgwfwewdwdwdwcxcyax_x_w`wbwcwcwdwcxbxbxdxcxcydycycybxbxbxaxaxayayazaz`z`za{a{a|`|_}^}^|]|^|^}_}^}^|]|]|]}\}[}[~ZYYXYYZ~Z~Z~ZYYYYYYXXXYZ[\]^^]\[\\\[YUSRQPOOPSROQSTVXYYYYYYYZ[[ZYXWWVUSV[\VX]^``cY`][\`a\V]aSPS~Z}V}U}V~X~X}Z}\}^}`}a}c}d}d}c}d}c}b}`}`~b~b~`~^}]}\}\}`~_}[}\~^~`~a~`~]}]|\|[}X~[~`}c}c|b|Z|\|]|\|[|Z|Z{[{]{_z`zaz`z`{_{^{^{^{_{_{^z^z_z_{^|]}`}f}f}e}e}e}e|e|e|e|e{d{c{bz`z`zazbzc{c|c|c|d|f}h~j~j}i}g|f|e|e{f{f{ezd{f{h{i{g{c{a{`{]{[z\z]z^zazdzd{d{d{d{d{c{c{bzbzbzbzczczc{d{e{e{e{e{e{e{e|e|e|b}a}c}c}`}`}c}d~b~a~a~d~c~c~d~c~a~`~Z~\~_~bfg~a~_~^}`}b|_|]|]|]|\|[}]}^~^~^~]\\]^``^]`aba~_~^~^~^bdfefhgjbiecfb^ZXVUWWZ]_`_^Z\\~\~Y~YXWYYYZ~\~Y~XVX[VSWYXUXY~YRVX[~[~[[[WWZZWXXWTTSRRRSRQQX\YUVW]~\~_~_^\[~\~]~^~]\ZYY~Z~[~]~^~_~_~_^]XUVTRQQPOPQRSTUVVUTTUUSSTUUVVWVUUWXXY[]]\[[\]]]]]^___~_~______^^^][ZYYZ[\\[[~Y~XWVVUTTTTTTU~U~W~Y~[~\~]~]~]]^]XUUX\_aba`_`][ZYXWXVVVWVVVWUUUTTTU~UTTSSSRRSSTTTUVWXYYZ[\\\[YWVVVUUVWWVVUTTSSSSSSRSSTTUUTUTTTTUVWWVWXYYZYXXWXXYZ[[ZYXVUUVWWVUTSSSSRQPQRRRQPPQRQQPNLFB@=:83897777367777666679:::988888888899::;;;;::;;;::;<;;<==<:9:::99899:;<<;;<<=<<<=>?@?=;97:>ADEDA=;;?ADFFEDBA@AABBABBCCBA@?>===<<<<<;;;;;;;<=>>>>=<;:ewewdwdwdwdwdwdwdwdwdwdxdxdxcxcxbxcxbxcxcxcybyay`yaxbxbxbwbvdvevfvgwiwkwlwkwivgvevcwhwhwgwgwkwkwhwgwfwhwjwkwmxlxixhxfxgxjxkwlwlxjwjwiwiwiwiwiwiwiwixixixhxgxgxfxfwewfwfwfwfwfwfwfwgwgvfvgvgvfvfvevfvhvgwgwhwhwixjxkxjwhwgwgwfxfxfxexdxbw`w`wawawcwdwdwcxbxbxcxdxdxdxdxcxcxbxbxbxbxayayazazazaza{a{a{`{`{_{_{_{_{_{_|^|_|_|_|^|]}]}\}\~\~[[[Z~[~[~[~Z~Y~Y~Z~Z~YYYYYXY~Z~[~]__`a`_^\[XUSSRQPQSUSSVXY[[[ZZZZZZ[\]]\\[ZZYXY_]VZ`fde`Zd^\\`a\W]SUUX~X}X|W|W|Z}[}]}^}_}`}a}b}c}c}c}c}b}_}]|[}]~]~[~Y}X}Y}[}^}^|\|[}\}^}_}]}Y|X|X|W}U}X}\|]|\{[{Z{Z{\{\{]{]{^z_z_zazbzczczc{c{b{a{a{a{b{b{czc{c{c|d}d}f}f|d|c|c|b|b{b{b{a|`|_|_{^z^z_z`zb{b|c|c|d|f}i}j~l~k~h}f}e|f|g|h{g{g{g{i{i{g{c{a{_{]{[z[z\z]zazdze{e{e|e|e|e|d|d{dzdzdzdzdzd{c{d{d{d{d{d{d{e|e|d|b}a}b}c}`}a}e}d~b~a~b~d~c~b~b~a~^~]~Z~]~_~b~f~d~`~_}]}a}b|_|]|\|]|\|Z}[}[~Z~XWWWWYZZZXZ[]~\~[~[~Z~[~_aa]`aefed_^WXXVU~T~TWWY[~]_^^[[[ZWXX~WXYZ~\~]}]~][[\ZW~Y^ZY^a~`~U^b_~^~^^]YY[ZYYYWUUTSRRQQPRX\YVWX~]~]~`~``^]~^~_~`~_^\[\~\~]~_~a~a~aa``[UUSQOONNOPQRSTUXWTSUTRRTUUVWXWWUWXYZ[\\[YYXYZ[[ZXXY~]~^~^^]\[[[[[[ZXWXYZZZZZYXXWVUUVWWVT~T~U~W~XY[[[\\][WTSUY\^]\Z[[YXWVUUUTTTTUUTUTTTTTTU~UTTSSSSRSTSSTTUUVWWXZ\]\ZXWVVVUUVWWWVUUTSSSSSRRRSSSSTSTSSSSTTUUUUUVVVVVVUUVWXXXXWVTRPQQRSRRQRRQQONOPQQPPPPPPOOMJD@>;8656976544567776665789:::988888888889::;;;:::;;::;<<<=<<;:::::99899:;;;;;;<==<=>>???>;97:>ADEDA=;;?AEGGFDCBABBCCBCDDCCBA@?>>>=<===<<<;;;;<<=====<;:ewewewewewewewewewewewdwdwbxbxcxbxbxbxbxaxayay`yaybybxaxaw`vbvdvfvhwjwlwmwlwkvivfvbwjwhwgwgwlwkwiwgwgviwkwlwnxlxixhxfxhxjxkwmxlxkxjxjwjwjwjwjwjwjxjxjxjxixhxgxgxfwfwfwfwfwfwfwfwgwgwgwgwgwhwgwfvfvgvhvgwhwixixixjxkxkwjwiwiwhxhyhyhyexcwbwbwbvbwdwewdwdxcxcxcxeyexexdxcxcxcxbxbxbxbxbybybzbzczczbzbzazaz`z`z`z`z`z_{_{`{`{a{`|`|`|_|_|_|_}]}\}\}[|\}[}[~Z~Z~[~\~[~[~Z~YY~X~W~X~Z~\^`bcba`]YWUUUTSST~UXWW~[~\^^^^]\\\\\]^_`__^]]\[[a\W^ehhd_^c_]^b`]Z]SY~Z~\}[|Z{Z{\{^|`|a}b}a}`}a}b}c}c}c}b|a|]|Y|X}Y}X}W}V|V|Y|Z{^|^|\{[|Z}\}\}[}Y|X{X{Y|V}X|[|\{]z^z]{]{_{`{a{a{bzczczezezezfzf{e{d{c{c{d{e{e{f{g{f|f|f}f}e|c|b|a|`|`|_{_{^{^|]|]{\{\{\z\z^z`{b|c|c|d|e|h|k}n~m~i}f}f|g|i|j|j{k{k{j{h{f{c{a{_{[{Z{Zz[z\z_zcze{e{f|g}g}g}g|g{h{h{h{g{fzf{e{d{c{c{c{c{c|d|d|c|`}^}^}_}_}c}g}f~c~b~c~d~c~b~a~_~]~[~[~^~a~b~c~`~^~^}^~a}b|_|]|]|]|\}Z~X~VUTSSSSUVVUTVWY~X~V~V~U~V~YZ\YZ[\]]ZUWRW~X~V}S}S~T~[YZY[^_`[ZZXVWW~W~X~Y~Z~\~^~_~_~\~[]~\~[}X`\[^e~a~Y`dbaaa`\\[[ZYYXVWVTRQPPRUZ[YVW~Y~]~`~a~bb`_`aba`^]^~_~`~b~d~ddedc\TTPOOONMNOPRSSSWXVUVTQQSTVWXZ[XUWZ[[[[ZXWWVVYZYXVVW~Y~Z~ZZYXWWXXXXXWVWXXXWWVWXXXWVW~X~Y~Y~Y~Y~X}X~W~WWXYZ\^]YTSRSVXZYVTUWSQQSSSRRRRRRQRSTUTTTUTTTSSSSSSTSSSSSSTTUUUTUWWXWVUUUUVVWXWVVTTSRRRRRQRSSRRQQRRRRRSSTTSSSTTTTSSSRRSTSSSRRPOMMMNOOOOOOONMMNNNNONNNNMLLKHB?<97656887543456776665689::::98899988889::::::::::::;<<<=<<;:::;;:999::;;;::;=>>==>>>>>=<:7:>ACDCA=;<@BFHGFECCCCDDDDDEFEDBA@@?>>>=====<<;:::;;<<<<<;:9fwfwfwfwfwfwfwfwfwfwfwewdwcwbxbxcxcwcxbxaxay`ybydydxbxaxawavbvdvfvhwjwkwlwkwjvivgvbwkwiwfwiwmwlwjwhwgviwlwmwoxmxixgxfxhxjxkwmxmxlxkxlxlxkxkxjxjxkxkxkxkxjxixhxgxgwgwfwfwfwfwfwfwfwfwgwgwhwhwgvgvfvgvhvgwhwixixixjxkxlwkwjwjwjyjyjyjygyewcwcwcvcwdwewewexdxdxdxfxfyfyeydxdxcxcxcxcxcxbxbybycycycydycyczbzazbybyazaza{`{a{azb{b|a|a|a|`{`|_|^|]|]|\|\|\}\}[}\}]}]}^}^~^~_~^}[}X}Y}Z~[\^`aa`]ZWVWXW~VUUU~V~X~Z~[~^~```_^^]]]^^^__`a`_^^]ZZ^X[effggZ`a`_aee]`[Z\~_}]}\|[{]{_{a|c|d}d}b}a}a}b}c}c}c|b|a|\|V|U|V|V|U{T{VzXz[{_{_{]{\|\|^|]|\|Z|Z{Z{\|X}Z|]{^{_{`{`{a{b{c{c{c{e{e{ezfzf{g{h{g{f|e|d|d|e|e{f{g{h|h|h|g}f|d|b{a{`|_{^{^{^{]|]{^{^{^{]{\z\z^{`{a|b|b|c|d|g|k|l|l}h}g}h|i|k|k|j{j{h{f{d{b{_{^{]{[{[{\{\z\z^z`zb{c|e|h}i}i}i}i|j|k|k{j{h{f{d|c|b|b{a{a{b|b|b|a|`}`}`}_}`}d}h~g~d~d~d~d~dcc~a~^~[~]~`~c~c~a~^~]~^}`~a~a|`|]|]|]}\}Y~URRQQQPQRTUSSTUW~W~U~T~S~R~SUWZYWUUVU~R~X}Y}Y|[|W}V}T}R~Z]]\\_`~_ZZYZZYX~V~W~X~Y~[~\~]~\[Y\]]}U\\][ea]bfdaccb^^\\[YXWWXWVTQQQTWZ\ZWX~Z~^~a~cccbaabcba``b~a~a~b~ddeedaYQSPQQQONNOQSSSRUXXWWURPRTWXZ\]YUX\]\[ZYXWWVVXYXXYYYX~X~XWUTSTUVWWWWVVWWVUUUVVVVVWWXXYYZ~Z~Z~X~WWWXY[[ZXTSQRTUVUSQQRNMOPRSSTSSSRRRSTTTUUUUTSSRSSRRRRSSRRRRRSSQPPSTTTTTSTTTUVVUUTSRRQQQQPPQQRQQPPQQQQQQQQQPPPQQQQQPPOOOPPPOONNMMLLMMMLLLLKJJIJKKKKKKKKJJIHEA=:86546887543456777665579:;;;::9::9998889:::::;:::::;<<<<<<;:::;;;;:::;<<;;:;=>>><;;;<==<:8:=@BCB@=<<@CGHHGEDDCCDDCCDEFEDCBA@????>>====;:999::;;;::998fwfwfwfxfxfxfwfwfwfwfwfvewewewewdxdxdxcxbxbybzdzeydxbxaxbwbwcwdwewgwiwiwjwiwivhvgvcwjxiwixkxoxmwkviwivkwmwoxoxmxiygxfxhxjxkwmxmxmxmymylylykykxkxkxkxkxkxkxjxixhxgwgwgwfwfwfwfwexexfxfxgxgxgwfvgvfvgvgvgwhwixixiyjxkxlxlxkxkxkykykyjyiygwfwewewewewfwexfxfxfygyhygygygyfyexexdxdxdxcxcxcydydydyeyeyeydzczbzcycyczczb{b{b{bzc{czbzbzaza{a{a{`{_|_|^{^{^|^|]|^|_|_|_|_|_|_|^|\|Z}Z}[~\]]\]]\\ZXYZ[~Z~Y~W~V~U~V~W~X~Z~\~__^]\\\]]]]\\]]]]\[ZYWXYW[ec~bddV]^`acfe`e^_`~c}a}_|_{`{b{d|f|f}e}e}d}c}d}d}d}d|b|^|Y|U|U{V{V{V{VzWz[z\z_{`{_{_|`|a|a|`|^{^{^{`|\|]|`{a{b{c{d{d{c|c|b{a{c{d{e{f{f{g{h{g|f|f|e|c|b|c|e|f|g|g|g}g}f|d|c{b{c|c{b{a{aza{a|a|a|a{`z_z^z_{`{`|a|`|a|c|f|i|g|f|e}g}h|h|i|h|e{c{`{_{^{^{^{^{]{\{\{\{\z\z]z^z`{a|d}g}i}i}i}i|j|j|j|j|h|f|d|a|_|^|]|]|^|^|^|^|_}c}b}a}a}e}g~g~d~d~e~fgggda~_~`~b~d~c~a~^~^~_}a~b}a}_|]|\|\}[~WROQSSQQ~Q~S~U~W~T~S~U~X~Y~X~X~V~U~U~UUWZZXUUVV~V~]}]}^|^|Z}Y}Y}T~Z~a`_^^`\WWWXYXVUWWW~W~W~XYWUY\Z~RXZZXbb^cgc`ced]_^\ZXWWWXXXVTSSTVZ]~\~X~Y~Z~_~acdfdb`_cecbbba``aaaa_[SMSSTUTRPQRTUUSQRVYXXVSQTWYZ[]`\VY^_^]\[ZZZXY[[YY\[ZZYXWVUTTUVWXXWWWVUSRRSSSSSTVWYYYXYY~Y~YXXXYXYYZYWVTTTUUUTRQRQPPQTTUVUUTTTUUUUTUUTSRRRSSTSSSRSSSSSSSRSQQQRSSSSSSSSSSTTTSSQQQPPPOOOPPQPOOOPONNNNNNNMMMNNNNNNNNNNNNONNNMMMLMMMLKJJIIHGHHGGGGGGGGFFECB>:874446888653334567765568:;<<<;:::::998889::::;;::::;<<<<<;;9::;;<;::;;;;;;:;=>><:999:;<<:9:===ACGHHGECBBABBBBCDEEDCBA@@???>>=<<<:98888899998777ewewewewewewfvfwfvfvevevevewewewdwdwdxdxcycycydydxcxaxbxbwcwcwdwewfwgvhvivhvhugufwewiwjvjwmxoynvkvjvivkwnxoyoylyixgxgxhxjxkxlxmynymymzmzlzlykykxkxlxlxlxkxjxjxixhxgwgwgwgwgwfwewexdxexfxfxfwfwfvgvfugvfvgwgwhxhxixjxkxkwjwjxjyjykyjxixhxgxgwfxexexexexfygyhyhyizhyhygyfxfxexexdxcxcxbxcydydyeyfyeyeyeydzdzdzdzczdzczb{c{c{d{d{czbzbzaza{a{`{`{`{`{`{`{`{_{_{_{`{`{`{`{_{^|]|[|\}\~]~]~\~[~ZZ[\YZ[~\~\~[~Z~X~V~U~V~VWX[\\[ZYZZ[[[[[ZZZ[[ZXWVVVWX[]~^~_~_~\~X~Z~]~_adfebb`cd~d}c}`|`|`|b|f|g|g|e|f}f}e}e}e}e}e|b|[|V|U|V{W{XzXzWzXyZz]z`{`{a{a{a{c{b{a{a{b{b{b{_|`|b|c|d|d|e|d|c|a|`|_{a{c{e{e{f{g{g{f|d|e|d|a|_|b|c}d}d}d|e|e|e|d|c{c{d|e|d{d{czd{e|d|d|c{bzaz`y`z`z_{_{`{`{c{f{f{c{b|c}e}g}g|g|e|`{^{[{Z{Z{\{^{^{^{]{]{\{\{\{\{^{_|`}c}f}g}g}h}j}j}j|j|i|g|e|c|`{]{[|Z|Z|Z|[|\|\|\|^}a}c}e}e~f~f~e~d}f~ghhgeb~a~a~c~d~c~a~^~_~`~a~a~a}_}]}\}[~Y~UQPQTTS~R~R~T~W~X~U~T~X~Y~[~Z}Y}X~X~X~VVWXXW~VUVW~Y~\~_}_}`}]}[}\|Y}[}c~a_^\[XUUUWXVUUWVVUTUTTRTTUPUTUU]]]```^cec[__\YWWWXYYYXVSSS~U~Y\~]~W~X~Z~_~b~ccgdb^^cccbab_^\\[ZZXUMOTTVYWSQVVUVVSPPVXYXWTTVY[~][]`^WY`_^]\\\\\\\\\[[\[[ZYYW~V~U~V~V~W~XXXWXXWUTRQQQRRRRTUW~Y~YXWXY~Y~X~XXYXXYYYZYWVVUTUVUSQSTQQRUVWWWUVVWVVUUUTTTSRQRSTTTSSRSSSSSRSSRRRQRSSRRRRRRRRRSSSRQPPOOOOOOPPOOONNNMMMMMLLLLLLLLMMLLLMMMMMMMMMLLMLLLLKJIHGGGFFFEEEEEDDDCCB@>;97645678887542235666654479;<<<;;::::9998789::::;;:9:;<<<<<;;:9::;;;;;<<;;<<<;;<<;98889:;<:9:;=@?>=<<=@CFHHGEB@@@@@@ABCCDDCBA@??>>>>=<;:988887888777655eweweweweweveveveveueuevfvfvfwfwewdwdwdxeyeyeydxcxbxbxcxcwcwbxbxcxewfwgvgvfvfufufvgwhwjulwnwpxnululukvmwoypyoylyhxgxgxhxjxkylymymynynznzmzlylylylxlxlxlxkxjxixixhxhxgxgwgwgwfwdwdxcxdxexexfwfwgvgvfvfwfwgxhygxgxhxiwjwjwjwjwixjxjxjxjxjxixhxgyfyeydyeygyiyjzkzjziyiyhxgxfxfxexexcxbxbxcydyeyeyfyeyexfyfzfzfzezezdzczc{d{d{d{d{czbzbzczczczbza{a{a{a{a{azaz`z`zazazaz`z_z^{]|]|]}^}^}^~]~\~[[\]~Z~[~]~]~\~\~[~Y~W~V~U~UTUWXXWVVWXYXXXWWVWVVUTSTUVWW~X~Z~Z~[~Y~W~V~X~[~^abccbbceff~e}c}a|`|b|f|g|h|f}h}g}g}f}f}e}d|`|Y|U|T|X{[z[zZzZy[y]y_yazb{b{c{c{e{d{c{e{e|e|e|a|b|d|e|e|e|d|c}_}[}[|]|_|a|b{c{d{e{e|e|b|c|c|_|]|_|`|`}`}`|b|c|d{d{d{e{f|g|g{g{f{f|f|g{g|f|e{dzcya{_{_|^|_{a{a{b{b{`|_|a}b}d}d}d|`|[{Z{Y{Z{[{]{_{`{`{`{_{^|]|]{]{^|^|`}c}e}e}f}f}f}f}g|h|g|e|c|`|]|Z{X|W|V|V|W|X|X|X|Z|^}a}b}d~f~f~e}d~fhiigecbbc~c~c~b~a~a~a~a~a~_~]~\~[~ZWTSTUW~W~V}T}T}W}Z}[}X}V}\}]}^}]}]}]}]~[~Z~YWWVUVWWY[~\~_~a}b}`}_}^|_}a}b~b_\XVSRRSUUTTVWUUTQQPPNPQRMQPQQWVVWYY[acbX`]ZWVVWXYZZZXU~S~T~U}Y}Z~_~\~X~Y~_~b~bcjec][adba_^ZWVVUUTRRMPTVY[XSSYYYZZVOMTXYXWXY~Z~\~]~^~\]`_YZa__^^____^__^]^`][[\[ZYXY~Z~[~[ZXWXXWURQPOPQQQPR~T~V~Y~YYYZZZ~Y~YYYXXXYZZ[ZXWVUVWWVUWXUSTXYYYXWXXYXXWVUTTSRQQRSTTTTRRSTTTTTUTSRRRRRSSRRQQQRRRRRRQPOOOOONNONNNNNNNMLKKKKJJJIIIIIJJIIJKLLKKKLLLMMMLLLKJIIHGGGEEEDCCBBBA@@?>=:864446789998742124566654369;===<;;:99::9988999:::;;::;<==<<;;:::;;:;;;<;:;<<;::999987689:;:999;===<<<=?ADFFECA??>>>=>@ABBBBBA@?>>===<<:8777777777766544eweweweweweveveveveueufvgvfvfvevdwdwdwexfxfxexcxbxbxcxdwdwcwcxbxbxcwdwevevevdufufvgwhwkumwnwpxnvmululwnxpyqzoylxhxgwgxiykylymymznznznznznzlzlymymymymxlxkxjxixixixixixhxhwgwewcwcxbxcxdxexfwfwgvgvfwfwgxhygxgxgxgxhwiwiwiwiwhwhxixjxkxjxjyiyhyfyeydyfyhyjylzmzlzkyjyixhxgxgxfxfxdxcxcxdyeyeyexfxexdyfzgzgzgzgzgzdzbzc{e{e{e{d{dzczczdzdzdzdzczczczczbzbzbzazazbybybybyay`z_{_{_|^|_|_}_}^~_~_~^~_~\}]}a~`~]}Z~YYX~X~W~V~U~UUUUTSTUVWW~W~V~V~V~V~V~U~U~T~S~S~TUWWX~Y~X~X~X~W~U~U~W}[~^~]\]_`~a~c~e~f~g~f}c}b|`|`|c|e|i}h}j}i}h}g}e}d}c|^|W|T|U|[{^z^z^z]y]y^zazazb{c{c|d|e|d|d|e|d|d|e|a|b|d|d|d|c|`}]}X}V}W}Z|\|^|`{`{b{b|b|b|^|`|_|\|\|]|]|\|]|^|`{a{c{e{f{g|h}i}i|i|h|g|h|i}i}h|g{f{cza{`|]|]|_{`{a{`{_{^|_|`}`}a}a}`}]|[{Z{[{\{^{`{`{a{a{`{`|_|^|]|]{^{_|`}a}b}b}b}`}_}`|c|e|e|c|`|]|[|Y|X|W|V|U{U{V{V{V|X}\}^}^}\~_~c~c}d~ehhhfdcbbcc~c~b~a~a~a~`~`~^~\~Z~YXWVVWYZ~Z~Y}W}V}X|[|]|\}[}_}`}a}_}^}`}`}^~]~[XWVUUVWXZ~]~_~c~c~b}a}`}a}b~cb^ZTRPPPQSUVXZYVV~U~S~SSTRSSSNQQMMSQQRSUW[[\X\WVVWWXYZ[[[ZW~V~U}W}Y}Z~]~_~[~[~`~bbblha[\__`_[ZVSRRQQPOPNQSW[\XRW]YY\\WOMTYYYXZZ~\~^~^~_~\^b`YZa__^]^__`aaa`_ac^]]_^]]\]]]][ZYXWUSRQPPQRRQQR~T~V~X~XYYZ[[[ZZZXXWXZ[\\ZYWUVXXWVZZWUVYZ[ZZ~YYZ[ZZYWVUTSRPQRSTTTTSSTTUUUUVUTTSRRSSSRPPPPQQQQQQPONNNNNNMNMMMMMMLKJIIHHGGFFFFEFGGFFGHIJIIIIIJJKKJJJJIIHGFFEEDCBA@@@?>=<;;:865345779:;:9853123567664358;=>>=<;;::::::99:999:;<;::;<===<;:::;;;;:;<<;::<=<:87888776789:99889;;;<<<<>?BDDCA?>==<<;<>?AAAAA@??>==<;;;:8666676666654433fwfwewewevevdveveveueufvfvfvevevdwdwewfxgxgxfxdxdxexfwfwfwdwcxcxbxcwcwcvdvdvcuduevevhvjukvmwnxmvlvlvmxoyqzrzoykxhwfvgwixkylymzmznznynznznzmzmznznyoyoymxkxjxixhxixixjxjxixgwdwbxbxbxcxdxexfxfxfwfwfwfwgxgxgxhxgxgxgxgwhwhwhwhxhxhxixjxjxixhxgxexdyeygyiykylzlzlzkykyjxixixixhxhxfxexexdxexewewewdxdxexfygyhyhzhzdzbzdzfzfzfzezdzdzezezezeyeyezdzdzdzczczczczczdydycycybyay`z`z`z`z`{a|a|b}c}c}b}a}_}`}c~`~\}Z~ZYYZ~Y~X~W~V~V~W~W~VUVWX~X~W~W~V~V}W}W}X}V}V}W}W}W~X~XYZ[~Z~Z~Y~W~V~V~V}Y}\}\~[~Y~Y~\~^~`~`~c~c~d}c}b}`}_|]|^|a}f}h}j}i~h}f}c}b}`|[|V|W|Z|_{bzaz`z^z]z_z`z`{a{b|b|c|c|c|c|d|b|a|c|`|a|a|a|`}_}[}X}T}S}W|Y|Z|[{\{]{^{^{^{]|Z|]|[|Y|Y{Z{Z{[{[{\{^{a{c{e{g{g|i}k}j}j|i|g|i}i~j}i}h|f{d{b|_|]|]|^|_|_|_|_|_|^}^}_}_}^}]}[|[{\{^{_{a{b{b{a{`{`|`|_|_|^|^{_{`{a|a|`|_|_|]|[|\|_|b|b|_|^|]|[|Y|Y{Y{X{W{W{XzX{X{Y|\|]}Z}U}Y}^}`}`}b~d~efdbb`bdcaa~`~`~`~_~^~\~Z~Y~XXWXZ[\]~[~Z}Y}Y}[}^}a}`}_}a}b}d~b~`~c~c~a~^~[YWTTUVVWY[]bba`_`ab`\VRPQQRTVXZ\~^\Y~Z~Y~W~VVXVWWWRUSNOSSRQTUVWSWXYRWXZZ[[[]\Y][~Z~Z}[}]}^~_a__abb`lha\[]\\[XVSQQPOPPPQQSSXZZVSX^YZ]^ZROUYZYYZZ\^^^\]a`WW^\\[[]_`abbbbbce`_`ba`__`aa`]ZXWUTTTSRRTUTSRSUVWXXYZ[[[[[ZYWVWYZ[[[YWVVWXWXZ[YWX[[[[Z~YY[\[ZYYXVUSRQQRSTTTTSTUUVWWUVVUTSRSRRRRPPQQQPPPPPQQPPPOONMMMLLLLLKJHGFDCBBAAAABCDDDCCDEEEDDDEEFFFEEEFEFEEDDDBBA@>===<::9887654445789:;;:975223577886448;>???=<<;::;;:::;:99:;<<;:;<=>>=;::9:;;;:;<<:9:<=<:87788765789998788::;;;;==>?AA@?><;::9:;<=>>???>>==<<;::::8655566666654322fwfwewewevevdvdvdvdueuevevevdwdwdwdwexfxgxgxfxexfxfwfwfwewdxdxcxcxdwdwcvcvcvcudueuevgviukvlwmwkvlwlwnypzrzqzoxkwhvfvgwixkxlymzmznynynznznzmznznyoyoyoynxlxkxjxixjxjxkxkxixgxdxbxbxcxdxdxexexexfxfwewfwfwfxfxgxhxgxgxgxhxhxhxhxhxhxixixixhxhxfxdxdxdyfyhyjzkzkzkzkykyjxjwjwiwjxixhxgxfxexewewewewdxdxexfxfxgygygzdzczezgzgzfzdzdyezezfzfzfyeyezdzdzdzdzczczczdydydydydycxax`x`y`z`z`z`za{b{c|c}b}a|`}b~e~`}[}Z~Y~Y~Y~Z~Z~Y~X~W}W~W~X~YZZZZ~Y~X~W~W}W}X}X}X}Y}X}X}Y}Z~[~[~[~\~\~\}[}Z}X}W}W}X}Z}\}\}Z}X~X~[~]~^~^~]~\}\}]}^}^|]|\|[|_}c}e}g}g}e}c}a}`}^|Z|U|Z|]|c{d{c{a{^{^{^{^{_{`|a|a|b|a|a|a|b|`|_|a|^|^|_|^|]}Z}W}U|S|T|W|Z|Y{Y{Zz[z\z\{[{Z{X{X{W{X{X{Y{Z{Z{[{\{^{`{b{e{g|g|i}k}j}i|h|g}i}i}j~i}h|f|d{a|_|\|\|]|^|]|a|b|^|]}^}^}^}]|[|[|\{]{`{b{c{c{b{a{`{_{_|^|_|_{_z_{_{`{a{`|_|^|\|Z|[|^{`{_{^{]{\{[{[{[{[{\{\{]{]z]z_{_{]|]|[|U|^|`|_|_}_~`~cdca``adba`_~_~^~]~\~[~Z~YYYYZ[\]]~\~Z}Z}[}]}_}a}b}a}b}b~ee`~e~e~c~_~]YYPTUUTUXZZ[ab___`^\XTQQSTUV~XZ\~^~`]\~[~[~Y~Z~Z~]\\\\Y~ZUNSWU~W~Q~TUXYWQaaUXZ\]]\[^^X\\~\~^}^}^~^`bb`bbc`jia\[[ZYZWTSPOOOOPQQSUWYYX~U~TXYYY]^ZSQUXYYXXYZ[[YVX\[WVWXWVWYZ\]_`abcdd``acca`_`aa`]ZWUTTVWUSTVWVUTTUVWXXXY[[ZZZZXWVVWYZ[ZXVUUVWVUZ\XXYZ[[[ZZY[\\ZYZYXUVSQQRSTTUUTTUVWWWUUUUTSRQQPPPQQPPPOOOOPQRRRQPOONNMLLKJJIHFEDB@???????@ABA@@AAABBBBBBBCCCCCCBBBBBAA@??><;;::98766554434589:;<;;:85323578897547;>@@?>=<;;;;;;;;;;:::;<<<;:<=>?><::9:;;:::;;:99;<<:876776657889887789::;;<<<=>??>><:99999:;<<====<<<;;;::::97654556666665433gwgwfwevevdvdvdvdvduevevdvdvcwdwdwdwexfxfxexfxgwhwhwgwfwewdxdxdxdxewdwcvcvcvcucuduetguiujvjwjwjwkwkxnzq{rzqznxjvgufufvhwkxlymzmzmymymzmzmznznzoypypyoyoxmxlxkxjxjxkxlxlxjxgxexdxdxexexexexexexewewewewewfwfxgyhxhxgxgxgxhxgxgxgxhxhxixixhxgxexdxdxdyfygyhzizjzjzjyjxiwjwkwkxkxkxixhxfxewewewewdwdwcwdwfxfxeyfyfyeyfygyhyhyfzdzdzezezezfzfyfzezdydydzdzdzdzdyeyeyeydydxcxaw`waxay`y`y_y`zazb{c|b|`|_}a~a~^}\~\~[~Z~Z~[~[~[~Z~Y}Y}Z~[~\~]~]~]~\~[}Y}X}X}Y}Z}Z}Z}Z}[}\}]}^}_}_}_}`}_}_|_|^|[}Z}Z}[}]|]|\}[}[}[}\}\}\}[}Y}X}W}Y}Z}[|\|[|[|[|_|`|a}a}`}_}`|_|^|[|V}\|`|e|e|d{a{^{\{\{]{^|_|_|_|_|^|^|_|`|^|]|]|\|[|[|[|Z}X}V|U|U|W{Y{[{Z{YzZzZz[z[zZzZ{Y{Y{Y{Y{Y{Y{Z{Z{[{[{]{`{c{f|f|f|h}i}h}h|g}g}h}i}i~h~g}e|d|b}_|\|\|]}_}`}`}_}^}]}^}]}]|]|[|[|\{^{`{b{d{c{a{`{_{^{^{^{_{_{_z_{_{`{`{`|_|_|\|[|]|^{_{^{]{\{\{]z]{^{_{`{a{a{bzbzc{c{a|`|]|V|`|a|^|^|^}_~`~a~`]\~_~e~c_`_]~\~\~\~[~Z~Z[[ZYZ\\]^~\~Z}[}]}_}`}a}b}b}b~cgfaffc_\XYPUUUSTVWVSZ\[\]\ZXTRRSVXYZ~Z~\_`~b~`~_~^}^}]}^~_~aa``a^^WQVZZ[~T}V~X~[\\T`bZ\]_`_^[]bUYa`a~`}`~abdcbbcc`gf_[YXXXXWTSPOOPPQQRSUWXXV~U~UUVW[^^[VTVWXXWVVVWVURRUUSRSSRRRSUWY[]_`bddbaaccb`__aa_[WTSSUY[XVWYYXWVVWXXWWXY[[ZZZZXUTUVWYYYXVUUUVWXY[YZ[\[ZZZZYZ[[[Z[[VTTSRRRSTUUUUUVVWWVVUTTSSRPOONOPPPPONNNNOQRSSSRQONLLKJIHHGFECA?=<;;;;;<=??>=====>??@@?>>????>=<<====<<<<:998876554455445689;<<<;;97434578998657;>@AA?>=<;;;;;;;<;;::;<=<;;;=>??=;:9:;;::::;:99:<;:877776656789887789::;;<;;:;<=<<:8888999:::;;;;::::::99:::8765556667775433hwhwgwfvevevdvdvdvcududvdvdvcvcwewewdwewewewfwgwhwhwhwgwewdxdxdxexfwdwcvcvcvbubtdtdufuhuivjviwiwixkyn{q|r{pymxhveueufviwlylymzmzlymymymynynyoyoypypypyoxmxkxjxixjxlxmxlxjxhxexdxexfxexexexexexdwdwdwdwdwewfxgygxgxfxfxfxfxgxfxfxgxgwhxhxgxfxexdxdxdyeyfygzgzhziyixhxhwiwjwkxkxlyjyixgxfwewewewdwcwawdwfxexdxdxdyfyhyhyiyiyhygygzfzezfzgyfyfyeydyeyeyezdzezeyfyfyeydxdxcyax`xaxayay`y_y_z_z`{`{_{]|\}]}]}\}\}]}]~\~[}\}\}[}Z}Z}[}\~]~^~^~^~^~]}[}Z}Z}Z}[}\}\}\}\}]}^|`|a|b|b|a|b|a|a|`|_|^|\|]}]}^}^}]}\}\}]}]}\}[}Y}W}V}U}V}Y}Z|\|[|Z{Z{\{]|\|\|]|]|^|^|`|_}Y}^}`|d|d|d|a{^{[{\{]{]|]|^|^|]|[|[|[|]|\|\|[|[|Z|Z|Y|Y|X|X|X{Z{[{]{]{\z[z[z\z]z]z\z[z[{[{[{[{[{[{[|[|[|\|^|`|b|d|d|e|f|g|g|f|f|e|g}g~h}g}f}e}c|a|^|\|[}]}^}a}_|]|_|^}]}]}\|\|\{\{^{^{`{b{c{b{`{_{_{^{^{^{_{_{_z_{`{`{`|`|`|_|^|^|_{_{^{]{\{\{]{]z^{_{`{b{d{e{e{e{h{g{e|c|`}Y}b}d|`|`|a}b}b}a~^\\~a~e~`~^~b~^~Z~Z~Z~Z~Y~YZ\\[ZZ\\]]~\~[}[}_}a}b}b}b}c~ccgfbfeb]YVZSVWVSTWWTQVXXXZYVTRQSUZ\]]]^_adba~`~`}_}`~bddbbda^YTY]`_~U}X~[~^__Y`c___abba^`_[Wa_c~d~bbbccbaba_ecZYXWWXYXUSPOOPQQRSUWYZYX~USRSWY\\ZXUVWWUTSRRSSQPNPPOOPOOOPQRTUWY[\^``__`bba_^^__\XUSRSW[]ZXY[[ZXWWWXXWVWXZZYYXWURRSTVWWWWUUTUVYWXYZ[\\[YYYYXYZ[ZZ[ZVTTTSSSSSSTUTTUUVVUUTSSRRQONMMNNOOONNMMMNPQRRQQPNLJIHHGFEECB@><;9989989;<<;:::::;<===<:9:;::9988899999::9877765444445545689;<<<<;97545679999766:=@BB@?>=<;;;:;;<<;::;<<<<;;=>??=;:9:;:999:::989;;9877776657889987789::;;::::;;<;:9767899:9999999888998899998876656778887644iwiwhwgvfvfvevevevdududvcwdwcvcwewewewewewfwfwgwgwgwfwfwewexfxfxfxfwewdvcvcvcucteteufuhuhuhvhwhwhyjyn{p{q{pylwgveueugvjxlymzmzlykxlxlylymynynynyoyoyoynxlxkxjxjxkxlxmxlxixgxfxexfxfxfxexfxexexdxdxdxdxdxdxexexexexdxdxexexexexfxgxgxhxhxgxfxfxexexexexexfyfygygxgxgxgxhxixjyjyjyjyhyfxewewdwewdwcwawcwexexdxcxdxfxhyiyhyhygygzgzgzezezfzfyfyeydyeyeyeydyeyeyeyeyeydycybyaxbxayayay`z_z_z^z^z^{^{]{\|\|[|[|\|]}\}[}[}[}[}Z}[}[~\~]~]~]~^}]}]}\|[|Z}[}]|^|_}`}^}_}_|`|a|a|b|b|b|c|c|c|b|`}_}]|`}_}^}]~\}\}\}]}]}[}Z}Y}W}X}V}W}Y}[|^|^|]{\{\{[{Z{Z{Z|[|]|^}_}_}[}^}_}a|`|b|a|^|\|\|]|]|^|_|^|]|[{Z{[{]{]|]|\|]|]|\|\|\|\|]{]{_{`{_{_{_z^z]z^z`z`{`{_{]{]{^{]{^{]|\|\|\|\|^|_|a|b|b|b|c|d|d|c|c|c}d|e|f|e|d}c}a|`|^{\|\|]|]|]|^|_|_|^}\}\|[|[|[{\{^{^{`{b|b|`{_{_{`{`{_{^{_{`z`z`{_{`|a|`|`|`|`|_|^{^{]{\{[{[{[{\{\{]|_|b{d{e{f{g{i|j|h|f}c}^~e~g~e}d}d}d}b}_~\~\~_~`}a~\~^~`~[~X~Y~Y~Z~YYZ[[ZZZ[[\\~\~[~\~_~b~b~b~b~ba`aa_a_]ZYW[WYXWSTXXVTVXWVVUSRQSWY~^~``````abcaaa~_~abca``c_\YX\`c_~V}Y~]~a^\\aebbabccda_Zb^_^ceb``__^^^^^b_ZYZYYXYYWRPPPPRRRSVY[\\ZWRRSVWZZXXWWWVTRRRQQPPNMNONOPOONPSSSSSVUVWXZ[\]__^]]\\\ZWUSRSVYZYWY[[ZYXWWXWVUVWXWVVUTQONOQSTUUUTTSTUXVVXZ[\[ZXXXXXYZZYXYYWVWTSRRRSRRRRQRSTSRRQQPPOOMMKKLLMMMMLLLLLMNNNNMLKIGEDDCBAA@><;:9877666788998877789:;:9766777776567777888887776655556666669:;<<<<;:87667799::9767:=@BAA@?>=<<;;;<<;:8:;<==<;<>???>;99::9:9:98778:::98777777788998778999:::9::::;::865788:;;;:::99998888889998877767788999866jwiwhwgvgvgvfvfvevdvdvdudwcwdwdwdwdwdwewewfwfwfwfwfwewfwfwfwgwgwgwfwewdvdvdudududueufuguhuhuhvhwgxiymzozpznyjwgvevevhwkxmymylykykxjwjxjxkylymynznymynymykyjyjyjylynxmxkxixgyfyfxfxexfxfxfxexexewewdwdwdwdwdwdxdxdxdxdxcxcxdxexfxhxhxgxgxhxgxgxfxfxexexexeyeyfxfxexewfwgwhxhxhxixhxgyeydxdwdwewcwbwbwcwdwdwcwbwdxfxgxhxgygygzgzf{f{ezezeyeyeydxdxdydydydydydydydydycxcxcxbxbxbxbxay`z_z_z^z^z^z^z^z]{\{\{[|[|\|[}[|[|Z}Z~Z}[}\}]}]}]}]~]}]}\}[|[|[|\|]|`|a}a}`}`}`|`|a|a|`|a|a|b|c|c|b}`}^}\}b}_}]~\~\}[}\}\}\}[}[}[}Z}X|X}X}\}\|_|_|^|]{]{[{Z{Y{Z|[|[|\|^}^}]}^}^}^}^}`|`|^|]|]|]|^|^|_|_|^{\{[{[{]{]|]|]|^|_|^|^|]|^{`{b{a{a{`z`{`z_z_z_zaza{c{a{`{`{`{`{_|_|^|]|\|\|^|_|`|`|a|`|_|_|_|`|a|a|c|c{d|c|b|a|`{_{^{]{\|\|[|\|^|_|^|\|Z|Z|[{\{\{]{^{^{`{a|a|`{^{_|`|`|_{^{^{_z`{`{_|`|a|_|`|`|`|_{^{]|]|\|[|Z|Z|[|[|\|^|`|c|e|f|g|j|j|h|f}e~b~g~ig~f}e}c}a}^}[~\~_}_}^~\~]~]~Z~W~Y~Y~Y~XYZ[ZZYYZZ[[\[\^`a`ab`_^^]]][YWY[X\YXSUYXVUVTTTUSRQQSX[~^~aaa`````bbaa_`a``^^a^ZZY^ac_~X}[}`~b]Y]adbbaaccec^]_^^_cea^\\\\\\\\^]ZZZ[YXXZWRORPPRRSTVY[\][XTSTVXXXXXXXWVTQQQRQPOOOPOOOPPOMPTUSRRTTSSUWXZ[\\\\[[[ZYVTSSSUXYXWXYYYXWWWWWVUUVVVUTSQOMLLNPRSSTSSSTTUTVXYYZXXWWWXWXYXWWWXWUTTSRRQRRQQPPQQQQPOOOONNNLKKKKLMMMLLLLLLKLLKKKJHFDBAA@@??><;98765555556777666666789985456666665565556888776676555666776689:<<=<<:9767889:;;97779=@ABA@?>>=<;;;<;:989;<==<<;<>??=;:99::99997678:::98888778888888888889:::9999:998765678;;<;;::9999988878889887777778999:986kwjwiwhvivhvgvgvfvfvevdvdvdvdwdwewdwdwewdwewewewewewewfwgwhwiwiwhwgwewevdvdueueufufugufugtguhvgvfxhxlynynylyhwgwgwgwiwkxmxmxlxkxjxiwixixjykylzlzmylylylyjyjyjykylymylxjxhygygyfxfxexfxfxfxexexewewdwdwdwdwdwdwdwcwcwcwbxbxcxexgxhxhxhxhxhxhxhxgxfxexfxexexexexdxdxdwdwewfxfxfxfxexdycybxcwcwdwdwcxcxdwdwdwdwcwdwexfxfxfyfyfze{e{e{e{ezdydydxcxdxdxdxdydycycxcycycybxbxcxcxcxcxbybzaz`y`y_y_z^z_z_z^z]z\z[{Z{Y|X|Y}Z}Z}Z~[}\}\}\}\}[|[|[|[|[|[|[|\|]|^|`|b}b}a}`}`|`{_|_|^|_|`|b|b|c|b}_}^}\}e}^~\~[~Z}Z}Z}Z}Z}Z|[|\|[|Z|Z}[}_|`|c|b|a|`|_{]{\{\{[{Z{Z{Z|\}]}^}^}]}\}]}_}_|_|_|_{_{_{`{a{`{_{^{^{^{_{_{`|`|a|b|a|`|`|b{d{c{b{bza{b{c{b{az`zb{c{e|c|b{b{a{a{`|`|_|]|\|[|]|^|_|_|^|^|]|\|\|]|^|_{`{a{b{a{`|_|^{^{^{]{]{\{Z{[{^|^|\|[|X|Y{Z{[{\{]{^{^{`|a|a|_|^|_|a|b|a|^{^{_z`{`{_|`|a|_}`|`|`|_|^|]|\|[|Z|Y|Y}Y}Y|Y|[|]|_|c|e|g|i|k}i}g}f~fhjjh~e}b}`}\}Z}[}]}]}]~\~Z~Y~X~X~Z~YXWWXYYXXXXYZZZ[[]]^^^_^]\ZYZ[[YX[\Y`[ZRWZXVUTTTTTSRQRUY]`ccca```]bbaa_``\][[^\YZ[^`a_Z~]~_~c_X]aca`^^_acc_\]^]]ab][XXXXXXXYZZ[\]]ZXX~Z~YPPTPPUTTTWZ\]]\ZXWWXXXXYYYXWUSQRRTSRQSSRQQQRRPMQXXURRTTRQRTVXYZZZZZYXXXVUTSSTUVVUVWWWWVVVUUUUTUTTRPOONLKJKMOPQQRRRRRSSUVWWVVUUUVVWVWVVUUTTSSRQQQRQQOONNNNNNNMMMLLLLKJJJKLLLLKKLKKJIHGGGGFDA?>==<;;;;:976544444345665554445678986434556665454456788877776666778899889:;===<;:988889:;<:9889:>=<;;<;9878<>??><;;<>@><;::;:999865689::9888888888888888888899999988776653689==<<<;::99::99988789888778888999:;:8lwkwjwjvjvjvivhvhvgvfufvevevdwewewdwdwdwdwdwdwdwdwcwdwfwgwhwiwiwhwgwfvfveueufufufugugugtftguivgvfvgwjxlxlxkxhwhwiwiwjwmwmwmwlwkxjxhwhwhwiyiykzkzkylykyjyiyjykykykylykyjyhygygygxgxfxewfwfwewewewewdwdwdwdwdwdwdwdwcwcwawbwcwewgwhxhxhxhxhxhxhxgxgxfxfxexexexexdxdxcwdwdwcxcxcxcxbxbyayaxbxcxdxdxcxcxdwdwdwdwdwdwdwdwdxdxdydzdzdzdzdzdzdydxdxdxdxdxdxdxdxdxcxcxcycycxcxcxcxcxcybzbzayay`y`y`y`y`y`y_y]y\y[zZ{Y{X|Y|Z|[}[}\}\|\|\|[|[|[{[{[{[|[|\|\|]|_{a|c|c}b}a}`|`{_|^|]|^|_|b|c|d}a}^}_|]|e}_~\~[~Z}Y}Y}Z|[|[|]|^|]|]|]|^|a|b|c|d|c|b|a|_|^{^{]{\{[{Z{\|^|_}^}]}\}]}_}_|`|`{a{a{a{b{c{bzb{a{`z`zazb{b{c{d{d|c|b|c|d{f{e{c{c{b|d|e|e{d{b{c{d|e|c|b|b{a{a{a|`|^|]|[|[|]|]|^|]|]|[|Y|Y|Z|Z|[{\{^{^{_{^{]|]|\{^{^{]{]{[{[{[|^|\|Z|Z|V|W|Y|Z|[|\|^|_|`|a|`|^|^}`}b}d}b|_|^{`{a{a{`|`|_}`}c}a}`|_|^|]|\|[|Z|Y}X~W}W}W}W}Y}\|_|b|c|f}h}f}d~ehgfgg~d~b}_}[}Y}Z}[}\}[~Z~X~W~W~X~YYVTUVWWVVVWXYYYYXYZ[[[[[Z[ZY[]^[Z]^[a\[VXZWUTSTTTTSSRSUY]acdcba__Za```^_^XZXX[[Y\[[]]]]^]a`Z[__\[XXZZ[][YZYXX[\YXWWVVVVXXYZ[\]]ZXX~Z~ZPQVRRWVUUW[]^_^\[ZZYYYYZZZYWVSPSTVUTUVUTSSSTSRPUXZWRQTVUTTTVXXXXXXXWVVUUTSSRRSSSSSSSSSTTTTTSSTSRRPNMMLLKJJKLNNOPPQQQQQRSTTSSRRRSSTTTSSRRQQQQPPOPQPOMMLLLLLKLKKKJJJIIIHJKKLLKJJJIIHGEDCDCA@>=<;::::::9865433333456654444334668986544455666545677888888887666789::;::9:;====<;:98889:;<;99889;?ABA@?>>><;;<;9878;>@?=<::;=?><;::;:987644689::9888888888888888888899999998886654689<<===;::99:::::9988999988777899:;<;9lwlwkwkwkwkvkvjvjvivhvhvgvfvevfvfwewewdwdwcwcwcwcwcwdwewgwgwhwhwhwgvgvgugufufuguhuhuhthtgtfuhvfvfvfvhwjwjwiwhwiwiwjwkwlwlwlwlwkxjxhwgwhwhxixjyjyjykyjyiyixjxkxkxkxlxkxiyhygyfygxgxfwfwfwfwewewewewdwdwdwdwdwdwdwdwdwcwbwbwcwewfwgwgxgxgxgxfxfxfxfxgxgxfxexexexdxdxcwcwbxbxbxbxbyayay`y`yaxcxdxdxdxdxdwdwdwdwcwcwcwcwcwcxcyczczczczdzdydydxdxexexexexexexexdxdxdydydxdxdxdxdxcyczczbybyayayaxaxayay_y^y]y\z\z\z[{[{[{\|]|]|]|]{\{\{\{\{\{\{[|[|\|]|^|_{a{c{c|b|b|b{a{_|^|]|]|^|a|c|d|a|^|_|`|f|a}^}]}\}\}\|]|]|^|`|a|`|_|_|`|d|d|d|e|d|d|b|`|`|a|a{_{]{]{^|`|`|_|_|^|^|_|a|b{c{d{c{c{czdzdzdzdzczbzbzc{d|d|f|e|d|b|c|e|e|c|c|c|c|e|f|f|d{b{b|b|c|a|`|_|_|_|`|`|^|\|[|\|\|]|\|\|[|Y|X|W|X|X|Y|Z|[|\{]{\{[|[|[|]|^|]|\|[|Z}Z}]}Z|X|W|U|W|X|Y|Z|[|^|_|a|a|`|_|^}a}c}e}c}`|_|a{b|a|`}^}_~c~d}b}`}_}^|]|\|[|Z}Y~X~X~X}W}W}W}X}[|^|`}c}d}b~`~b~edbcd~b~`~]}Z}W}X~Z~Z~Y~W~U~T~T~UWVSQSSVUTSTUVWWWVUVVWWWWWY\\[]`a^^^_\a[ZYYWUTSSSTSSSUUTUZ^bcccca`\X^___]__YYXWXZZ[ZXYZ[[[W[\YWXWUSQPSSSUVVVUUUWXWWWWWVVVXWWXYYZYWWZ~[~ZSTZUUYXVWWZ^__`^]\[[ZYYYYZYWVSRUWYXWVVUUTTTTTSRUXZXTTVZYXVWYYXXWWWWVUTSSSRRQQRRRRQQQPQRSSRRRSSSRQONMMNNLKKLLLLMMMNNNOOOPPPOOOOOPPQQQPOOOOOONNNMNOOONLKKKKKKKJJJIIIHGGFGIIIHHGFFEEDCA@???>=<;:9899998876543344455775444333456898654444567655678899999999987789:;<<<;:;;<===<;:98889::::99878:=?A@@???>=<;<;9878:=>><:89:<>=<;:;<:98764358:9:9888988999988889988889::::9888766479:=====;::999:;;::99899999888899:;<=<;mwlwlwlwlwlwlvkvkvjvivivhvhvgvgvgvfwewdwcwcwbwbwcwcwdwewewfwhwhwhvgvgugugufufuguhuiuitithtguhvfvevfvgvhvhvhwhwhwiwjwjwkvkvkwkwjxixhwhwhvhwixiyiyiyjyixhxixjxkxkxkxixhxhyhygyfyexexfwfwfwfwfwewewdwdwdwdwdwdwdwdwdwcwcwbwcwcwewfwfwewfwewfxexexexfxgxfxfwewexdxdxcxcwcwcwcxcxbyayax`y`y`ybxcxcxdxexewewdwdwdwcwcwcwcwcxcyczczczczczdydydxexewexexexexexexexexexeyeyexexexexexdydydycycybybxbxbxbxbxax`x_y_y^z^z^z^z^{^{_{^{^{]z]{]{]{]{]{]{\|[|\|]|^{_{a{c{c{c{b{b{a|`|^|]|]|^|a|c|c|`{_{`{b|g|b}_}^|^|^|^|_|a|a{c|b|a|`|_|a|e|f|e|e|e|d|a|a|c}c}c|b|`|^|`|b|b|b|`|^|^{`{a{c{d{ezdzdzdzdzczczdzczczczd{d{d|e|e|c|a}a}b}c}b}c|d|d}d|d|d|c|a|`}a}`}_}_|^|]|^|`|`|]|\|[|[|]|\|[|Z|Y|Y|X|X|W|V|W|X|Y|[|[{[{[{Z|[|]|]|\|[|Z}Y}Y}[}Y|W|V|T|W{X{Y{Z{[|^|`|b|b|a|_}^}a}d}e}c}`}_|`|a|`}_~^~^~c~e~b}a}`}^}]|\|[}Z~Y~X~Y~X~X}W}W}X}Z}\|]|^|]}]}\}_~c~b`__~_~_~]~X~T~U~Y~Y~W~V~S~S~RSSSQPQRTTSSRSTUVUSSRSSTTTWX]]]]bc`^^ab\YYXXUSRRQQSSSTUUTUZ_bccccb_\X]^]]]_`YYXWTXZYWTUVUVSRQQPNMLMLKKMNOQSTTTUVWWWXXWWWVVWWWVVWXXVV\~\~[TW[QVYXWWVX]_`_^^]\[ZYXXXYYWUSSVWZXXXVTWUSTTTRRUWZYVVY^][XY[ZYXWWVUTSSRQQQQPPQQQQQQPPPQQQQQQRRSRQONNNNOMLKKKJJKLLLLLKKLMNNMMLLLLLMNNMNNMMMMMMLLMNNNLLKKKJJJJJJIIHHGFEEEFFFFFEDCCCBA?=<<<;;:9877788888765445444568865344334568986544445777667899:::::::::9889:;<<<<;::;<<=<<;:99878899999878:<>?@???>>=<;<;98789;==;:889;==<;:;<:9765324799:988899999999999999889::;;::998776589;>>==<;::999::;;;:998999999899:;<=>==<:9889998765567888876445555668875455433568:875454348876789::;;;;;;;;;:99:;;<=<<;;:;;<<<;;::998877889987789;>?@@?>><;;<;98768:;<:97779:;::::;:9765433799:9889999::::999999999:;;;;;:99977658:==<;:9999:;<;;9989999999::;<=>>=>>=<<;;;:98766777765445679:877555555668986555444579:976565337:87889:;<<<;;<<<<;::9:;;<<<;;::;;<;;;:::98877889:98889;=>???>=<;;<<:87679;;:988789:::99:9875433479::9889:::::::9999::::::;<<<;;::988758:=@@?>><<:::9:;<<<;::89:9999::;<=>?>>=oyoxoxoxoxownwownwmvnvnvnvmwlwkwjwiwgwfwewdwdwdwdvdvevfvfvfvfvguguhuhuhuguguguhuhuhuhthtiuhuhuhugufvevgvgwhwixiwhwhwgvfviwiwjwlxlxkwkwkwkwlxlylykxkxjwjwjwjwjwjwjwixiyiyhygygygxgxgwgwgvgwfwfwewdwdwdwdwdwdwdwdwdxdxcxdwewfwgwgwfwdwcwbwbwbwcwewfwfwfwfwewdwdwdwdwcvewfwfwexdycybxbybxbxbwcwdwexfwfwfwewexdxcxcxdxdxdxdxdydyeyeyeyexexewewexdxexexfxgxhxhxhxhxgygygxfxfxfwgwgwgwfxexexdwdwewexdxdxdxcxbybycxdxdxcycycycybxaxayaybybybza{`{_{^{^{_z_z_z^{^{_{_{^{_{`{`{_{^{]{]{^{_{_z^{\{^{a{c|b|`{_{_{_{`{a{a{b{b{b{`{^|\|^|a|c{b{c{d|c|_|d}f~j~j~j~g}c}d}f|f|e|d|a{_{`{a{a{a{azazazaz`z`z_z_z_z^z_z`{`{_{`{_|^|\}\}[}\}]}_}_|^|\}[~[}Z|[|\}\}[}Z}X}W|X|X|Z|Y|Y|Y|Z|Z|[|[|Y|X|Y|Y|X|W|W|V|V|W}Y}[|^{^{^{^|_|_}_}]}\}\}]|]|\|Y|Z{[{\{]{^{^{^{^|^|^|]|\|[|Y}Y}Z}[}[}Y}X}W|W{Y|Z}X}X}[}`}_}\}^}_~_~]}\|\}Z}Z~Z~Z~Z~Y~Y}X}Y}Z}]|^|a|c|d|e|f|e}a~\~[~^~a~a~_~ZWXV~U~T~U~U~TTTTUUVUQSYXWVVWXYXVTSSSSPOQRTTSTXYVQQSSRQQQQQOMMMOQSWYXXVXZ[\]^^^\[[XWVVXXYZVVZWQUUVWSRRRSTUPNONLMPPOKJMQTWWXYYZ[[\[ZZZZ[[ZZYXYZZZVUYY~YYYWXWWWWWVUVUVWVVUUTSRRRSSTUUTTVWWSSQOQWUTUVUTUTSSUVW[_]\ZYXURQQRRPOPPOOPQRRSRQRRRRRRRSSSTUVVWVUTRQQQQOMLLKKJJJKJJJKKKLMMLLLKKJKKLJKJKKLKKKKKJIIKMNMMKJIHGGHHIIIHHGFDA>=<;;;98877777655455555555568;;:87566666678999776666679;986565438<98889:<<=<<<==<=<;:::::;;;;:99:;;::::::9877789999889::;=>>>>=<;;;<:98778::;:988889::9998765433479::98999::::::999::;;;;;;<<<;;:::88758;>B@@?=<<;;:9:;<<<<<:::;;::::;;==>???>pypypxpxpxoxowoxnwnwownwnwmwlwkxjwjwhwgwgwfwfvevevevevevfvfufufufuhuhuhvgvguhuhuhuhuguiuiviuiuhugufueugvhwhwixixiwiwgvdviwiwjwlwlxlxlxmxmxnxnymylxkxkxkxkwkwkwkxkxkxkyjyiyiyhxgxgwgwgwgvgwfwfwewdwdwdwcwcwcwcwdwdxdxdxewfwgwgwgwfwewdwbwbwcwdwewgwgwfwfwfwewewdwdwdwewexexewdxcxcxbxbxbxbxcxdxdxexexexexdwdwdwdwdwewdxexexeyeyeyfxexexexexdwdxexexfxgyhyhxhxgxgxhxgxgxgwgwgwhwhxgxfwfwewexexdydydydycxbxcxcxdxdxdxcwbxbxawaxaxbxbxbybybyaz`{_{_z_z^z_{^{^{]{]{]{]{]{^{]{]{\{]{^{^z^z]z\|]|`|`|`{^{]{]{]{^{_{_{`{a{`{_{]{\{]{`{_{`{a{c{c|a|d}f~k~m~n~j}b}b|d|f|d|c|`{_{_{_{^{^{^{_z`z`z`z_y_z_z^z]z^z_z_{_{_{^{\|\|\|[|[|]|_|_|]}[}Z~Z}Z|[|\|]|\|[|Y|X|X|X|Y|Y|X|X|Y|Z|Z|Z|Y|Y|Y|X{X|W|V|V{W|X|Z}\}^|^{_{`{`|`|_|^|]|]|_|_|^{\{\z]z_y`zazay`z_z^{^|\|Z|Y|X}X}X}X}W}V}U|U{V{W{Y|X}X}[}]}\}[}^}_~_~^}\}\}[}Z~Z~Y~Y~X~W~V~W}X}[|_|a|c|e|f|f|d}`~]~^~_~b~c~_[ZZW~U}U}W}W~W~V~V~W~W~W~Y~Y~T~T~Z~ZYXXXZ[ZWUTTSRPOPQPONPSUUTSSRQQQQQQONMMOQSWZYXVXYY[[\\\ZY[XVUUVWWZSTZXRUTVYTTSTTUWRPQONPSXQLJOSVXYZZ[[[\\\[Z[Z[]^]][\]_^YWXXXXYWWVVUUUVVTSSUUUTSRQQPQQRRSTTTUVWSRSSRYWVXWVVWTRSUVW[^][YWURPOPQROOQPPPQRSSTRPQQQRRRTTTTUVWWXXVTRQQPONLLKKKKJJKKJJKLLLMMMLMKKJKKKKJJJKKJJJJJJIIKLMMMKJIHGGGHHHGFFECA><;:99887555565544434455555457;<:976556666689::977666779;:97666448<:8889:;<>===<<=<=<;;:99:;;::98899::999998778789989999:;;<==>>=<;;;;987679::9877889:99887665444568::998899999999:::;;<;;::;<<<;;;:97659<@@?>==<<;;::;;<<==<;;;<;;;;::;<=>??>>pypypxpxpxoxowowowoxoxoxnxmxlxkxjxjwiwhwhwhwgvfvfvfvfvfvfueueueufuhuhvhvhvhuhuhvhuhuhuiuiviujuivgvfueuguhwhwixjxjwjwgwcwjwiwjwkvkwlxmxmxnynyoynymxlxlxlxlwkwlxlxmxlxlykykyjxixhwhwgvgwgwgwfwfwewdwdwcwcwcwcwcwdwdxdxexfwgwhvhvhwgwfvdvdwdwdwewgwhwhwgwfwfwfwewewexfxfxexexdxdxcxcxbxbxcxcxdxdxdxdxexexexdwdwewewewewdwewexexeyfxfxfxfxfxexdxdxfxgxhyiyiyhyhygxfxgxhxhxgwgwgwhwgxfxfwewewexexdyczczcycxcxcxdxdxdydycxbxaxaxawawbwbxbxbxbyay`z_z_z_{^{^{]{]{]{]{]{]{]{]{\{\{\{]{^{^{^{^{]|^|^|^|]{\z\z\z\z\z]z]z^z_z_z^z]z\z[z]z]{]{_{b{c{c|d}d}j}l}k}f}a}`|c|d|b|a|^{^{^{^{[|Z|[{]{_z`zazay`z_z^z]z_{`z`z`{_{]{\{[{\|\|\|^|_{^|]}[}Y~[}]|^|_|_|^|\{Z{Y|Z|Z|Y|Y|Y|Y|Y|Y|Y|Y|Y|Z|Z|Y{X|W|V|W{X{Y|[}]}_|`{`{a{a|a|`|`|_|_|`|`|`|`{_z`zbzc{d{czb{a{_{]|[|Y|W}V}V}V}V}U}T|T|U{UzVzX{X|X|\|\|Z|[|^}_}_}^}]}]}\}[~Z~Y~W~V~U~U~U~V}Z|^|a|d|e|f|f}c~^~[~]~`~d~d~a_]\X~V}V}Y}Y}Y~X~Y~Z~[~Z~\~\~X~U~[~[~[ZYZ\]\YWTTSRPNOONMLMPSTTTSRRRRSRRQONMORTX[[ZWXXXXXYZYWXYYTUUTTV[QS[YSWVX[VVVVWXYSRSRRTUXTNNOSUXZ[\]]]^]]\[[[]`bba``ab`\XVWXXXX~WVUTTTUVUTRSTTSRRQPOOOPQRRSSSUYTSUVR[YXZYYXYUPRVXXZ\[YWUSQONPRSOORSSSTTUVVROPPQRSTUVVVWXYYZZXVTRQOMLKJKLLLKKKKKLMMNNNNNMMLLLLLKKKJIIJKJJKJJIIKLMMMKKIHGFFGGFEDDCA><:9876665433345554432445565446;>;876557777679:;:98877779:::8665448<;98889;<=>>=<<=<<<;:98889::997767888899877788888899999::;<=>>=<;:;;;9876789987788988876654444445899898888899999:::;<<;;:;;==<;;;;:865:====<<;;;;<<=====<====<;::;<=>>>>qyqyqxpxpxoxowowowoxoxnxmxlxkxjxjxjwjxixiwiwiwhvgvgvgvfvfueueueufuguhvhvhvhuhvhvhvhuhuiuiujvkvjvhvgueuguhwhwiykxkwkwhwcwiwhwivjvjwkxmxnynyozoynymxmxlxlxmwlwlwlxmxmymylykxkxjxiwhwhwgwgwgwgwfwewdwcxbxcxcxcxdwdxexexfxgwhvhvhvhvgvfvdvcvdvfvgwhwiwiwhwgwfwfwewfxgxfxfxfxexexdxcxcxcwcxdxdxdxdxdxdxexexewewewdwewewewdwdwdwexfxfxgxfwfxfxfxexexfxgyiyjyjyhygyfxfxgxhxhxhxgwgwfwfxexewdwdwdxdxdyczczczcycxcxdxdxdycycxbxaxawaxaxbxbxbxbxbyay`y`z_{_{^{^{^{^{^{^{^{]{]{]z\z\z]z^{_{_{_{_{^{^{^{^{]{]z\z\z\z\z\z\z]z]z^z^z^z\z[z[z\{\{]{`{a{a|b|_}d}f}e}b|`|_|^|_|_|^|]{]{^{^|Z|W|Y|Z{_zbzczbzbza{`{_{a{a{b{b{`{]{\{[{]{^|]|^{_{^|\|\}[}]|_{a{b{a{_{]z[zZ{[{[{Z{Z|Z|Y|Y|Z|Z|Z|[|Z|Z|Y{X|W|W|X{Y{Z|[}]}`|a{b{b|b|d|b|b|a}b}b|c|c|b|b{czd{f{f{e|c|a|_}]|[|Y|W}V}V}V}V}U}U|V{VzVzWzY{Z{\|^|Z|X|[|^}_}_}_}^}_}^}]~\~Z~X~V~U~U~U~V~X}\}`}c}c}c}c~`~\~X~\~^~d~d~a`]\Y~W}X}\}]}[~Y~Z~]~]~\~\~]~[~V~Y~[~ZYYZ\\[YWTRQPPPPONMMNPRTUUUUTTTTTTSQPOPSTX[[[XXXXVVWXXUWY[RXVTTWZPU]ZTVUW[WVVYXWWRTTTSUUTQOPQRTXZ\^__~__^]]\\\_cedcbbba_[XVWXX~Y~Y~YXWUUTUWWVTTUUTSRQPONOPPQQQQRTXSRWWRZZZ\[[YYUPRWXXYYYXVSRQPOQTVQPUUTUUVWWWROPPQRSSUVVVWXYYZYWUSPNKIIIJKLMLKKKJKLMMMMMMMLLLLKLKKJJIIIIJJJJIIHGIKKLKKJIGFEFEDCCBA?=<:987655543323345554334455553349>=:87667887779;;::9988889:::9755448<<:8879;;=>==<<<<;;::877789998654667889876667887779::::::;;<===<;;<<;:987878888789988876543444445899887788899::9::;;==<<;<<==<;;;;:8769<@B@?==>>=<<<;<<<==>>>=>===<;;:;<=>>>>qyqyqxqxpxpxpxpxoxoxoxnxmxlxkxkxjxjwkxjxjwjwjwivhvhvgvgvfueueueufugvhvhvhvgvgvhvhvhuhuiujvkwlvkwjwhvevgvhxhxiykxlxkwiwdwhwhwivivjwkxlynzozozoznzmymxmxmxmwlwlwmxmxmymylykxkxjwiwiwhwgxgxgxgxfxdxcxbxbxcxdxdxdxexfxfxfxgwgvhvhvgvfvdvcucueugviwjwjwjwiwhwgwfvfwfxgxhxgxgwfwewdwdwdwdwdxexexexdxdxdxewewewfwfwfwfwfwewewdwdwewfwgwgwgwgxgxfxfwfxgxhyiyjyiygyfyexfxgyhxhxgxfxewdwdxdxdwdwdxcxcyczdzdzczcycxdxdxdxdycycxbxaxaxaxaxbxbxbxbxay`y`y_z_{_{^{_{_{_{_{_{_{^{]z]z]z]z^z_z`{`{`{_{_{_{_{^{^z^z^z_z_z_z_z^z^z_z_z_z_z^z\z]z[{Z{[{\{]z^{^|[|_|`|_|_|^|\|Z|[|\|\|\{]{^{]|Y|T|X|[|`{czezfze{d{c{b{c{d{e{d{b{_{^{_{`{^{\{]{_{_{\|\}\}_|b{c{d{b{`{^z]z\{\{\{[{[|[|Z|Z|[|[|[|[|\|\|[{Y|X|X|X{Z{[|]}^}`|b|c|c|e|g|e|d|d}e}f}g|f|e|e{f{g|h{g{e}b}a|_|^}\}Z|X}X}X}X}X}W|W|X{YzYzZz\{^|a|`|[|Y|\|`|a}`}`~`}a}`}_~^~[}Y}W~U~U~V~V~V~Y}]}_}`}`~_~\~X~V~Z~\~a~a~_\ZYX~Y}[}^}_}\~Z~\~^~^~\~[~]~]~V~V~X~XWWXZZXVTTTRQQRRQQPOPQTVWXXWWWVVVVUTRQQSUX[[[YYZYXXZZXXXX[UXUTUY\RU]YTUTVZVUUXWUUQSSSSUTSPQQQQSWXZ^a____^][\\_ceec_``^[XWVWXY~Z~[~\[[YXWWYZZXWWVUTRQPONOPPQQRRSSWSTUWQWXXZZZXXTPSXXVUVUUTSRSRPQVYTRWWWWWXYYYTQQPPPQRUUVUVVXXXVTRPMJHFHIJKLMMLLLKLMMMMMMLLKKKKJJJJIIHHIIIIIHHGGFFGHHHIHGEDCDBA@?=<;;:9876655544332234765434455553337=>;8767788878:;<;;::98889;;;:865559:<;88779:<<<<;;;;::::876678987533457889776556788779::;;::;;<<==<<<<=<<;9887878899:99998754444566678877778889::::::<<>>>=<<=>>=<<<<;9879<@BA?>>>>>=<<<<====>>?>>>===<<;;<=>>>>qyqyqxqxqxpxpxpxpwoxnxnxmxlxkxkxkxkwlxkxkxkwkwjwivhvgvfufueueufufvgvgvhvgvguguhvhvhvhvivjvjvlwlxkwhvdvgwhxiyjykxlxmxjxewgwgwhvhviwjwlxnyn{o{o{nzmymymxlxlxlxlxlxlxlylylykxjxiwiwiwhxhxhxgxexexfxdxcwcwdxdxexfxfxfxfxfwfvgvgvgvfvevdvcudufuhvjwkwkwjwiwhwgvfvfwgwhwhwhwgwfwewewewewewexfxfxfxexexewfwfwfwfwfwfwgwgwewewdvdvfwfwgwgwgwgxgxgxgwgxgxhyiyjyiygyfyexfygyhyhxgxfxexdwcwcxcxcxcxcyczdzdzdzdycycxdxdxdxdxcxbxaxaxaxbxbxbxaxaxay`y`z_z_z_z`{a{a{a{b{b{a{`z_z^z^z^z^z_z`zaz`{`{`{_{_{_{_z_z_z_z`z`z`z`z_z_z_z_z`z`z`z^z]z\{\{[{[z\z\{\{]|^|^|]|]|]|Z|X|Z|[|\{\{\{]{^|X|R|W|[|_{bzezg{h|g|e|d|e|g{g{f{c{`{`{`{`{]{[{\{_z^{\|[}]}`}b|e{e{c{`z^{]{\{\{\{\{[|[|Z|[|\|\|\|\|]|\|[{Z|Y|X|X{Y{Z|\}^|`|b|c|c|e|g|g|g|f}h}j}j}f|g|g{g{h|i}g}e}b}`~_~]}\}[}Z}Z}Z}Z}Z}X|X|Z{[{[z\{^|a|c|b|_|^|a|d|c}a}a}b}b}b}a~_~\}Y}W}V~U~V~V~T~U~W~W~X~Y~Y~WVTV~W~[~[~Z~X~W~X~Y~Y}[}^}^}\~[~]~^~^~\~[~\~[~U~R~TTUUWYXVTTUUTSQTUUUSRRSVXYZZYXXWWWWWUTSRTVYZZZZZZZYY[\WYXXZWWUSUY[TU\VTTRQRSSUXUTSRRSRRUUSQQQPPQTUX[`]]^^^\ZZ[^aa`][YYXXWVWXYZ~\~]~]]\[ZYY[\][ZYWVURQONNPQQRSSRRRTTQPTQTWUUWWTTTRSUTRSRRRRRRTTPQWYUVXXWWXYZZ[XSRQPOPPRSSRSSSSQOMLJHFEEGIKLMNMLLLLMMNNMMLKKJJIIHHHHHHGHHHHHGGFGGFDEEFGFEDCA@@?>=<;:9988876655554443223665434444543337<>;9777899989:;<<;;::9889;;;:8655589<;976689;;;;:9:::::9866678876532246788765455778779:;<<;::;<<==<;<<===;::988789::;::998765445666677766778999:;;::;<=>?><<=>>>=====;:978=@BA@>>>?>===<<===>??@??>===<<;<==>>>>qyqxqxqxqxpxpxpxpwoxnxnxmxmxlxlxlxlxmxmxlxlxkwjwjwivhvgvfueueuevfvgwgwgwgvgugugvgvhvhvhwjwjvlwmxkxhwdwgwhxiyjykxlxnxlxgwfwfwhvhvivjwlxmynzo{o{nzmzmylxlxlxkxkxkykykykyjyjxiwiwiwhxgxhxixfxdxfwgwewcwcwewfxgxgxhxgxfxfwfvfvfuevevdvcvcueuhujvkwlwkwkxkwkwivfvgwgwhwiwiwhvgwfwewewfwfwfxgxgxfxfxfwfwewfwfwfwfwgwgwgwfwevdvdvevfvgvgwgwgxhxgxgwgwhxixiyjyiygyfyeyfygygygyfxexdxcxcxdxdxdydyczczd{e{ezdydxcxdxdxdxdycybxaxaxbxbxbxbxaxaxay`z`z_z_z`zazbzbzbzb{bzbzaz`z_z_z_z_z`zazazaz`{`{`{`z`z`z`zazazbzbzbzazazaz`zazazbzbzaz_z]{]{\z[z[z[z\{]{]{]{]|\|Y|V|W{Z{Z{[{\{]{]{_|X|Q|X|\{`{bzg{j|k|j}h}g}h}k}j|h|e|b|b{b{a|]|Y{Z{]z^{]|]|_}a|c|f{f{d{a{^{]{\{\{\{\{[{[{\{\{\|]|]{^{^{]{\|[}Z|Y|X|Y|Z|\|]|_|`|b|c|e|g|g|h|h}h}k}k}f|g|g{h|i}j}g}d~a~^~^~^}]}]}\}\}\}\}\}Z|Z{[{\{\{^{a|d}f}d|`|`|c|e|d}c}c}c}c~b~a~_~\}Z}Y}W~U~V~V~S~T~U~U~UUUTTSTU~W~X~V~T~T~U~X~Y}\}^}]}\~]~_~]~]~]~\~]~Y~S~Q~RSSUWXWVTU~W~Y~YWSWXY~XWUUVXZ[[[ZYYXXXXWVTSRTUYZZYZ[\[[[\^X\XXWXVUSUZZVTZRSSNKLQRTWTTSSSRQRUVTQQPPPPRQUW_Z[[_[\YXY\^]\XVUUTTUVXY[\~]~^~__^]\[[\^^][ZXWVSQOOOPQRRSSSRQRURMQQRSOORRPQROORPOOOOOPQRVUOQXYVVXXVUUVXY[XTTQOMMMOOONNONLJHHGFDDCEHJLNONNLLLLMMNNMLKJIIHGGFFFFGGFGHGGGFFEFEEDCCDEDCB@>=<;;:9878776776565555444223886444444433346:>;:77889:::::;<<<::::989:;;:8654579;;98656799998889:::9766677776533236678764344777889:;<<<;::;;<<;;;<==>=<;:9889:;;;::998876555788766656789:::;<<;;;==???==>>??>>>>><;989=ACB@>>???>======>>?@@@@?>==<<;<=>>>>>qxqxqxqxpxpxpxoxoxoyoyoynynymymymxmxnxnxnxmxlxkxjxiwhwgvfvfvevevewfwgwgwfvfufugvgvgvgwhwjwjvlwmxkxhwdwhwixjyjylxnxnxmxhwfwhwhvhvivjwlxmymzn{n{mzmzmylylykykyjyjyjyjyjyixixiwiwixhxhxiyjyfxdwhwhwewcwdwewgxgxhyiyhxgxfwfveveudvdvcvcvdvfvhvkvlwmwlxlxmxlwhvevgwhwiwiwiwhvgwfwfwfwgwgwhxhxhxgxgwgwfwfwfwfwfwfwgwgwhwgwfvevevevfvgvgwgwhxhxhxgwgwgwhxiyjyhygyfyfygyhyhygyfxexdxdxdxeyeyeyeydzd{e{f{ezdydxdxdxdxdxdycybxaxaxbxbxbwbwaxaxaxayaz`z`zazbzczczczczczbzaz`z`z`z`z`zazazazazazaz`z`z`z`z`zazbzbzbzbzbzbzbzazazbzczdzbzaz_{^{]z\z\z\z]z^z_z_{^{\{U{U{[{\{[{\{]{^{_{^{W{Q{Z{\{^{c{h|k|m}l}k}j}k~m~l}i}f|c|c|b|b|]|X|X{\{^{^|^|_|a{d{g{g{d{`{^{]{\{\{\{\z[{\{]{]{]{^{^{_{^{^z]{[|[}Z|Y|Y|Z|[|[{]|^|`|b|d|f|g|f|f}h}j}i}e}g}g}g|h}i}g}d~a~^~^~^}^}]}]}]}^}^}^}\|\{]|\|]|^|b}e}f}e}`|a|e|f}f~d~d~d~c~c~a~_~]}[}Y}X~V~X~X~U~T~UUTTTUTSST~U~U~T~S~S~T~W~X}[}\}\~]~_~_~]~]~^~_~]~W~S~T~SRTVXYXWV~W~Z~\~\~ZVY[\~[YWWXZ[\]\[ZYXWWWWUSSRSUXYYYYZ\\\\]`Y\WVUVTRPRVYUTWPRRLIIOSUVTUUUSRRSWWURPPPPPPPRS[YWV\YYXWXZZYXTSSSSTUWY[]]~_~`~``_^\\\^__^\ZYWVSRPPQQQQQPPQRROUSMOPPPKLOOOPPLLOONNNNNOPRTRMRXWTTVVSRRSVWXUTTROKJKLLKJKKJIGEEDDCCEGJLNOPONLLLKLMNMLLJIHGFEDDCCCDEEEFFFEDDCDDDCBABCB@>=;:98877666666666666665555433776545544434446:=<;8889:;;:::;<=<::::999:;;:86445789:98655688887778999876666776654444456787544577788:;<<<<;;::;<<<;;<==>>>=;9889:;<<;;:9876555578876666789:;;;<==<<<>>@@@>>>?@@?????=<:9:>ADB@?>?@@?>>>>>>?@@@AA@??>=<<;<=>>>>>pxoxoxoxoxoxoxoxoxoyoypypzpzoznynynxoxoynxmxlxkxjxixhwgwfvfvevewewewfwfwfvfvgugvgwgwhwhwjwjwlxlxixhwfwixjxkykylxmxnxmxixhwhwivivivjwlxmymzlzmzmzmzmylylykzkyjyjyjyiyixixixhwiwixhxgyjyjyfxexiwiwdwcxexgxgxhyiyjyixhxgwfveveudvdvcvdvevfvivkvlwmwmxmxnxjwfwewhwiwiwiwiwivhwgwgwhwiwiwixjxixixhwgwgwgwfwfwfwewfwgwhwhwhvfvevfvfvgvgwhwhwiwhwhwgwgwhxixixhygyfyfygyhzhygyfxexexdxexfyfyfyfyfze{f{g{fzeydxdxdxdxdydycybxaxaxbwbwbxbxbxbxaxayaz`z`zazbycycydyczczbzbzazazazazazbyayaybybyazazazazazazbzczbzbzbzbzbzbzazbzczczczbz`{`{_{_{^{^{^{_{`{b{a{`{\{V{Y{]{]{]{]{^{_{`{]{W{U{^{_{_zc{g|j}m}m~l~k~ln~m~j}f}c|b|b|`|]|Y|X|[{]{_{_{a{b{d{f{e{c{`{^{]{]{]{]{]{[{]{^{^{^{_z_z_z_z^{\{\|\}[}Z|Z|[|[|\|\|^|`|b|d|d|d|c|c}d~e}e}c}d}d}e|g}i}g}e~b~_~^~^}^}^}^}_}`}`}`}^|^|^|\|\|^}a}c}e}c}`}b}e}g~g~e~f~f~d~a~`~^~\}[}Z~Y~Y~Z~Y~W~VVVUUUVVVUU~U~V~V~V~V~V~W~X}Y}Z}Z~[~_~]~[~]~_~_~[~U~U~W~UTVYY[[YY~Y~[~]~]~ZVZ\]~^[YZ[[[\\[ZXWVVVVVTSRQRRSVWXWYZ[[\\]XXTRRSSQOPSWUTRQQQMIKRTVYVWWWVVUV[[VRPPPQRPPQPWURPXWWVVVVWUUSSSTUVWXZ]_`abbba_]\^`a`_]ZYYWUTRSSRPMNLLLPPLSROOPOOLLNNMPPLKPRPPPONOPRQLJPUTRQRRPNNPRSSQPRQNKIHIIHGHHHHIGGGFFFFFHKMOPOMLLLLLLMLLKJIGFECCBABAABCCCDDCBAAABA@?>?A@?=;97666655666666667888877766445666555554455569<=<::99:;<;;:;<=<:88:::99::986444678998655677877677899876556666654444345678754556788:;<=>>=<;;;;;<;;<==>?@@>;:9:;<<<<;:987665556887666679:;<<<=>>==>?@AAA????AAA@@@@?><;;>ADC@?>@AA@@@@AA@ABBBCBA@?>>==<==>@@@@oxoxnxnxnxnxnxnxoyoypyqypzqzpzozoyoyoypyoynylykyjyixhxgxgwfwewewdwewfwfwfvfvfvfvfvgvgvivjvkvlwkxhwgwhxjxkykykylxmxmymyixhxixivivivjwlxmykykzkznznynylylykykyjyjyhxhxhwjwiwgwiwjxhygyjyjyfxfxixhwdxdxexgxhxjykyjyjxixhwgvfveudvdvdvevevgvivkwlwmxmylxlxixewfwhwhwiwiwivivhwgwhwiwjwjxjxjyjxixhxhwhwgvfvewewdwewgwiwhwhvfvgvhvewfwhwhwiwiwiwhwgwfwgwhxhxhygyfygyhzizhzgzfyfygygygygzgzgzfzgzg{g{gyfxexdwcwdxdxdxcycybxbxcxcxcwcwcxbwbwbxbyay`z`yaybycydydycybybybzbzbzbybybybybybyayay`zazazbzbzbzbzbzbzazazazazazbzczczczczb{`{`{`{_{_{_{`{a{b{b{bz`{]{W{Z{]z^z^{^{^{_{_z[{X{[{^{_z_ybze|j}m~m~llm~o~m~j}e|b|b|b{_|\|[|Z|\{^{_{`{a{bzdze{c{a{_{^{]{^{^{^{]{\{^{^z\z_zbzaz_z_{_{\|\}]|\|[|[|[|[|\{\|]|_|b|c|c|a|`|_}a}b}b}a}a}b}c}f}g}f}d}b}`}^}]}^}^}_}`}a}a}a|`|_|^}\}[}]}`}b}c}a}_}`}c}e~e~effc`~_~]~[}Z}Z~Z~Z~[~Z~X~X~W~W~W~W~V~W~V~V~W~V}W}W}X}X}X}X~X~W~X~X~YZZZ[\]]YUUWUTVZX[[ZYY[]\YWZ\\_[Z[[ZZ[[ZXWVUUTTSSRRQQQQTUVWXYY[[Z\VWSRQRRQNPSUUTQQPQOPKRVZZXYXXWXXW\]WSPPQQRQQQQRSOPTVVTTUUUTSSSTUUVXY[]_`abccb_]\^`aa`][YYYWWRUVSOFHIIIMNKRPNNONNMMMMLPPMKPRQPPPOOPPNKJNPOOOONKIJKMOPONPOLJHHGGGGGHHIIHHHGGGFFGJLOPOMKKKLLLLKJIHFEDDBBA@??@@@@ABB@???@@?=<=>??><976555455556666667899887777653456555555555568;=<::::;<=<;;;<=<9868999899987544557898766567877667788876556666554433223567754456678:;=>>>>=<;::;;<<<==>?@@?=;::;===<<;:98776656776676799:<<<=>>>>>>@AAAAAAAAAAA@@@A@@?>=>ACBA??@BCBBAAAABBCDDCCBA@??>=??@A@AAAnxmxmxmxmxmxnxnyoypyqyqyqyqypyoyozozpzqzpyoymykyjyiyhxhxgwgwfwdwdwdwewewewfwfvfvfvfvgvivjukvkwiwhwgxiykykykykxlxmxlylykzjyjyiwjwjwkwlwlxjyiyiznznznzlylylylykyjxixfwiwjwiwgwjxjygyfxixixfxfxhxfxdxeygyhyjylylykyjxixhwgvfvevdvdvdvevfvgvivjwkxlxlxkxjxgxhwhwgxgxiwjvjviviwiwjxjxkxlxlylykyjxjxiwhwgvfvevevdvevgwhwiwhvgvgvgwdwfwhwiwjwjwiwhwgwfwfwgwgwfxfyfygzhzizhygyfyhyiyiyhzizhzhzhzhzhzhzgyfxfxewdwcxcxcxcybybxbxcxdwdwcwcwcwbwbxbyay`y`yaybycydydycybyaybybybybybybybybybyay`y`zazazbzbzczczbzbzbzazazazazbzbzbzbzaz`{`{`{_{_z`z`zazb{c{b{b{`{]{[{\z]z^z_z_z_z_z]zY{Y{^{b{bzaycze|i}l~nlll~o~m~h}d|b{a{_|^|]|]|]|_{`{`zazbzczc{c{b{`{^{^{]{]{^{_{^{\{_{`{^{_{bzbz`z^{`{[|^}_|]|\|\|\|]|]{]|^{a|d|c|b|`|\|Z|Z}[}\}_}[}]}a}b}d}d}d}b}_}^}]}]}^}`}a}b}b}b}a|`}^}\}[}]|_|`|`|_|_|`|b}c~bceea^]~\~[}Z}Z}Z~[~\~[~Y~X~X}X}Y}Y}X}X~W~W~X~X}Y}Y}Z}Z}Z}Z~X~W~W~W~WWWWXZZYVTVUSTW\X[ZYXXZ[YWVYZZ_ZZ\\YXXYXVTSSSSRSSRRRQPORUUVVXXZYXXUTRQRRSRPQSTUTRQOQPTMSS`\[ZZZZ[[Y_`XSOPQRSSSSQQQMMRVTRRSSSSTTUVVWWXY[]_abcdcb`]\^abba^\[[[ZYTXXTMDFFGFJLHPNMMMMMMMNMLPPNLOQQQQPPOONLJIKLKKKKJGGGHIKKLLMLKJIHGGGGHIJKKKKKJIHGEDHJMNMLLLLKKKJIGFEDCBBAA@?>>>>>>?@@><<===<;::;<<;:8653333455666677789:::98888864455666666566668;==<;;:;<>=<<<<<<98568988888876444467788765567666667788776666655544332124667654445679;=>?@?>=<;::;<<===>?ABA?<;:;<====<;:98876557766789:;;<==>?@@@?@ABBBBAAAABBBAABBBAA@>?ABAA??ABCCCBBBBCDEEEDDCBA@??>@@@AABBBlxlxkxlxlxlxmxnyoyqzrzsyrxqypxoypzpzqzqzpynylyjyiyiyixixhwhwgwewewdwewewfweweveveveufuhuiujviwhwhwhxjykykyjxkxkxkwlxlylzkykyjwjwjwkwlwlxixhyhznznznzlylymymykyjxixhwjwivhwhwjxixdxexhxhxexfxgxeyeyfzhyiylynynzlyjxixhwgvgvevdvdvevevfvgvjvkwkxkxjxixhxgxjxkwfxgxjwkvkvjvkwkwkxlxmxnxnymylykyjxjxiwhvgvevevdwfwgwgwgwgwhwgwewdwhwkwjwkwkwiwhwgwfwfwewewexfxgyhyiyiyhygygyiyjyjzizjzizizizizizizhygxfxewewdxdxdxcybycxcxdwdwdwcwdwdwcwcxbyayay`yaycydydydycybyayayayayaybybybybybyay`y`zazazbzczczczczczbzbzazazazazazazaz`z`z`z`z_z_z_y`yazbzc{c{b{_{\{\{\z^z^z_z_z_z^z\yZz\z`zbzcybybzd|g}i~j~hi~l~o~m}g}d|b{`{_|_|_|`|`{a{b{czczczdzd{c{b{`{_{^{^{^{_{`{`{]{a|a{`{`{a{b{a{^zb{[|_|`|_|^|^{^|_{_{^{_{b|e|d|b|^|Z|X|V|X}Y}\}X}Z}]}^}_}_}_}^}\|\|\}\}^}_}a}b}b}b}b}b}`~\~Z}[|]|]|^|^|]|^|_}_~_`aa^\[\~\}[}[}[}\~\~[~Y~X}W}X}Y}Y}Y}X~W~W~X~X}Y}Z}Z}[}\}Z~Y~X~W~VUUUTUXXWUUWTSTW\WYYWVWXYWUTWXX]XY[[WUUUUTSRRRRSSSTTTSQPRTUVUVVXWVUSRQRSTUTSSTUUTRQOPRUPVV_^^\\\]]^[b`XTPPQRTTTTRQRMLRUSRTTSSSTUVWWWXYY[]_abcddca^]_bbba_][[[[[VWVSLDFGHGIJHOLLLLLMMNNMMQQNMNNNPPPONNLJHGHHIIHHHGGFFFGHIJKKJJJIHHHIJKLLLKKKKIGECBEHKKKJJKJJJIGFDCBA@?????>======>??=;;;;:::989::987542222345555778889:;;:9899986555566666677778;<==<;::<>>=<<;<<:8547787788876543345677765456555566788776666665554442212467655445679;=>?@@?=<;::;<====>?BCCA><:;<======;:99865579878:;<<<=>??@ABAAABCCCBBBBBCCCCCCCDCCB@@BCB@?@BCDEECCBBCEFFFEDDCA@@??AAAAABBBjxjxjxjxjxjxkxnyoyrzrzsyrxpxoypzq{qzrzqzoymylyjyjyjyjxjxiwhwgwfwewdwewewfvevdvdueuetfuhvivivhwhwhwixkxkxkxjwjwjwkxlxlylzlylykwjwjwlwmwmxixhxiynznznzmymynymykyjxixhwivivevjwhxfxcxdxfwfxdxexfyezgzhzjykymyozmzkyjxixhwgvgvfvevdvevevfvhvjvkwkxjxhxfxfxixkxixgxhxjwlvlvkwlwmxmxmxnxoyoynymylykxjxiwivhvfvewewfwgwfxgwgwiwgwdwewjwlwkwkwkwiwhwgwfwewewdwdxexfxgygyhyhygygyiyjzjzjzjzjziziziziziziyhxfxewewexexexdybydxexewewdwdwewewewexcybybyaybycydydxdxcxcxbxaxayaybybybybybybybyayayaybybycycycycycycycybyazazazazazaz`z`z`z`z_z_y_y`yazbzbzaz`{^{\{[{\z^z_z`z`z_y^y]y]z_zazczcybyczd|d|f}f~d~f}k}o}k|f|d{c{b{a{a{a{b{c{e{f{e{e{e{f{f{e{c{a{`{`z_z`zazb{b{a{c|c|a|a{b{c{b{^{b|\|`|b|_|^{`{`{a{`{_{a{d|f|d|a|]|Y|W|U|W|Z|\}V}W}Y}Z|[|[|Z}Z}X}Y}Z}[}\}_}`}`}a}a}a}b~a~]~Z~Z}Z|Z|[|\|\|\}\~\\]^^[Z[\~\}]}\}\}\}[}Z~X~W~V~V~W~W}W}V~U~U~V~W~X}X}Y}Z}[}Z~X~V~UTTSSRTWWVVWWSSTWZXXYWWWXXUSSTVVYVWYZVSTTTTSSRSTTUUUUUUUSTVVXWVUVVVUTSSTTVWWUVUUUTRQOPSXTZZ]]`]\\\]^[a`XTPQRSUVVUPSRNNSURSWVUTUUVWWWWWXYZ]^`abdedc_^`aaa`^\[YZ[[UUTQLFIIJHKKJOLLLLLMNOONNQPNMLJKNNMLLKJHFFFFGGHHHHHGFFFGHIKKKLLLKJKKLLMMLKJJJHFC@@CFHHGGGGHHGGEDB@@?>=<;;<<<;;:9:<==<;::98876789998764211134456677889::<<;:989987654456777777789:;<==<;:<>?=<;:;;<:734466778877654334677765445445556677777666666655442212468766655679;=>?@A?=<;:::<===>?@BDDB?=;;;<===>><;;:86568:98:;<=>>>?@@ABCCCCDDEDCCCCCDDDDDEEEDDCBBBCBB@ACDFFFEDDCDEFGGGFFDCAA@@BBBBBBBBhxhxhxixixjxkxoypyszrzqzpypypzqzq{r{rzpzoymykyjyjyjxjxjxiwhwgwfwewdwewevfveveveueuetguhuivivhwgwhwixjxkxkwjvjvjvjxkxlzmzlylyjwjwkwkwmwlxhxhxjymzmzmymynynymykyixhxhwivivhviwfxcxcxdwfwfxdyeyfyfyhzozlylyoyqzkzgyhxixhwhvgvgvfvewevevfvhvjwkxjxhxfxexfxkxmxgxgxjwmwlvmvmwmxnynyoyoypzpzoznymylykxjwivhvgvfwfxgxgxgxgxgwhwfwdwfwkwlwkwjwjwiwhwfwewdwdwcwcxdxexfxfxgxgxfyhyiyjzjzjzjzizjzjzjzjzjziyhxgxfwewdxexfxcybyexfxfwewdwewfwfwfwexdycybyaybxcxdxexexdxcxbxbxaybybybybycycycybyayayaybybybycycycycycycybyazbzazazaz`z`z`z`y_y_y^y_y`y`yazaz`z_z^z\z[z\z^z`zayay`y_y_y_z`zbzdydydybzc{c{c}c}c}d|h|i|g{e{d{c{b{b{a{b{d{e{f{g{g{g{g{g{g{f{e{c{a{`zazbzbzbzc{d{e|d|a|a|c{e{c{^{b|\|a|d|_|^{a{a{b{`{_{a|e|e|d|a|]|Y|W|X|Z|Z|\}W}V}V}X|X|W|V|V}W}X}Y}Z}[}]}^}_}_}_}`}`~_~]~Z~Y}Y}Y}Z}Z}[}Z}Y~XYZYWXZ[\~]}^}]}\}[}Z}X}W~V~U~V~W~W~V~U~T~T~U~V~V}W}W}X}Y}X~W~UTTRQRRTWWWVWWTTTXYXYYXXXYYVUSTUUVTVXYVRSTTTTTTTUVXWWVWWWVVXXZYWVUVWVUUUUUWYYWWVUUTRPOPRSRWX[\_\YYXYZZ[ZWSPQRTTVVVPTSPPTUUUXXXWVUWWWWVWXXZ[]^_`bcdb_^_`_^\[ZXWZXRQUSPLIJKLIKLLNLKKLKKNPPOOPPOMKJIKJJIIIHGFFFGGGGHHIIHGFGGHJKLLMMMLLLLLMMLKKJIHFDA?>BEGFFEFFFFEEDB@>=<<;:9999::9878:<<;;:976655567888765200133456678899:;<=<;:888887644568887888999:;=>=;:<>>><:9:;<=932346778877654334668875444334455567777666666655443212357776766789;=>?@A@><;:9:;<=>>?@BDEB@><;;;<==>>=<<;97679;:9;<=>???@@ABCDDDEFFGEDDDDDDEEEEFEFEEDCCDDDBAACFGGHFEEDEFGHIIHGFDCBBACCCCCCCCgxfxgxhxhxixjxnyqyszqzozozozqzq{r{r{qzozmylykykykxkxkxjxiwhwgwfwewewewevfvfvfufufuftguhuivivhwhwhwixjxkwkvjviuivjxjxlzmzlylyjwjwjwkwnxlxhxjxlymylymynynymykyiyhxhwhvhvhvhvhwcxbxdxewewexeyeyfyfyiznzmynypzozjzhyjxjxixhwgvfvfvevevevguivjwjwixgxfxexhxlxjxgxhwjwmwmwnwoxoynznzozpzq{q{pzoznzmylxkwjvhvgwgxhxixiyiyhxhwgwfwewhwjwiwiwjwjwiwgwfwewdwdxcwbwcwcwdwexexexeyhyjyjzjzjzjzizjzjzjzjzjzjyhxgxfwewfxgyfycycyfxgxgwfwfwfwgwgwgwgxeydycybxcxdxexfxexdxdxcxbxbybybybycycycycybybybybycycycycycycycycycycybzbzbzazaz`z`z`yay`y_y^y_y`yazaz`z_z^z]z\z[z]z_y`yaybyayayayaybybycydycybybzaza|b|b|c{d{d{c{c{b{b{a{a{b{c{e{g{h{i{h{g{h{j{i{h{f{d{b{bzc{d{dzdze{f|g}f}b}b|e|g|e{`{c|]|a}f|^|^|b|a}d|_|]|`|d|d|c|`|\|Z|Y|[|]|]|]}Y}W}V|X|X|W|U|V}W}X}X}Y}Y}Z}[}[}\}]}^}^~]~\~Z~Y~X}X~Y~Y~Z~YXXYYXVXZ[]~^~_}^}\}Z}Y}W}V~UUU~V~V~U~S~RRT~T~U}U}U}V}W}V~UTSSRQRRTWWXXYYUVVYYZZZZ[[\[YWVUTSSSTUXVRSTUUVVVVWYZZYXWYZ[Y[\]\ZXVWXXWWWWWX[[YXUTTSQOOPQPPTVVWYWUVUUUUVVVSRRSSTVVUPVTQRUWXYZYZZWVXXWWVVWWXYZ\\]^^_^]\[ZXWVUSRSXTNPNPMLLMMMJLMMMLLKLJJNPPPOPPNKIHGGFFFFFFEEFGGHHHHIIJJIGHIKLMNNOOONMMMLLLKKIHGGECA?>BDEEDEGEDBBA@?=;:::9976778875358::;:98654433457898763112356677789::;;<=<;:877898754568888999999:;<==<:;>>><9889;=:31134677876654334678876543223445566777666666665543322335778877788:<=?@@@?=;989:<=>>?@BCDCA?<;;;<======<;:878:<;;<=?@AAAAABCDEEEFGHHGEEEEEEFFFFGGGFFEEEEEEDDDEHHIIGFEEFGIJJJIIGFDCCBDDDDDDDDfwewewfwfwhwjwnxoyqzoznznzpzqzr{q{q{oznzmylylykxlxkwkwjwiwhwgwfwewewewfvgvgvhvhvhvguhuhuiuivivhwhxhwiwjvjviuiuivjxjxlzmzlylyjwjwjwkxnxlxixjxlymylylymymykyjyhxgxgwhvhvhvgvewaxcxgxewdxdxeyeyfyeyhylylyoyqzlzhzjylxjxixhwgvfvevevfvgvhviwjwiwhwfxexgxlxkxfxhwjwjwkwnwoxpypzozo{p{q{r|r|q{p{oznymxlwjwhwhwixjxkxkyjyiyhxgwfwfwhwhwgwiwiwiwhwgwfwewdxcxbxbwbwbwcwcwdxdxexgyiyizjzjzjzi{j{j{jzjzjzjyhxgxfwgwgxhyfybydyhxhxgwfwgwgwhwhwhwhxgyeydycxdxexfxgxfxexdxcxcxbybybycycycycycybybybybycycycycydydydydycycybzbzbzazazaz`zayay`y_y^y_y`yaz`z`z_z_z]z\z\z^y`yaybybybycycycycycybybyayay`z`z`{`{`{a{az`z`{_{`{_{_{`{b{d{f{g{h{h{h{g{h{i{j{i{g{e{d{dze{e{e{ezh{j|i}g}b}c}h|h|f|b|e|_}c}f}\|^|b|a}c|\|[|^|b|b|a|_|\|[|[|]|`|a|`}]}Y|X|Z|Y|X|W|X}X}Y}Y}Y}X}X}X}X}Y}Z}[}\~\~[~Z~Y~X~X~Y~YZYXXYZYXYZ\\]~^~]}[}X}V}U~U~UVVW~W~U~TSRT~T}U}U}V}V}V~VUTSSSSSTVXYYZ[[XXY[[\\\]]^^][ZWUSRRRSTWVRSTUWXXYY[\]][ZXZ[^]^__^\ZXYYYYYYYYZ[[ZXTSSQPNOOPNMPQQOQQQRQQQQQRSRRRSSTUTRRYTSTWXZZ[\\]ZYYXWVUUUUUVWWXXYXXXVUSQNNNOOLPUQKLJLJLNNMKIJMKJJJJJHIMOPPOPPMIGFEEDEEEEEEEFGGHHIIIJKKJHIJLMNOONOPPOMMLKJJJHGFEDB@>>ACDDCCEDA@>=<;:9888887555665323789998764322234689987532246888889:;;;<<=<;:8668:9865568899:;;;:99:;==<;;==>;8558:;941123677776554333578987643222344556676666666665543322234689:99888:<=>?@@?=;988:<==>>?ACDCB@=;;;;<======<:878:<;;=?@ABCCCCBCEFFFGHIJHFFFFFFGGGFGGHGGFGGGGFEFFGIIJIGGGGHIJLLLKJHFDCCCEEEEEDDDewdwdwewewgwiwkxmxoymzlzmzo{p{q{p{nznzmymxlxmxlwlwlwkwjviwhwgwfwewewfvgvhvhvhvgvgvgvivivivivivivhwhwiviviuhuhuhvjxjxkzlzlykxjxiwjxkxmxkxixixkylykykykyjyhxhxgxfwfwgvgvgvfwcwaxdxgxfwexdxdydydyeyhyiykymzozizhyjylxjxixhwgvfvfvfvgvhvjvjwiwiwgwfwfxhxlxjxcwhwjwjwkxpxqyqzqzp{q|q|r|s}s|q|p{o{nymxlxkwiwiwkxlxlykykyiygxfxfxgxgxfwfwhwiwiwhwgwgxexdxcxbxbxbwbwbwcwdxdxexgxhyhzizizi{i{j{j{j{jzjziyhxhxhwhwhxhygydyfyixhxgxhxhxixjxjxjxjxhyfyeyexfxfxgxgxfxfxexdxdxcxcycycycycydydycybybybycycycycydydydydydycybzbzbzbzbzazazaybyay_y^y`yayaz`z`z`z`z^z]z^z_yaybybybycydyeydycycycybyayay`z`z`{_{`{_z_z^z]z\z]z^z^z_za{c{d{e{f{f{e{f{g{h{i{i{g{e{d{czd{e{f{g{j{l|l}i}c}c}h|h|f|c|f}b}f}f}_|`|c}a}_}\|[|]|`|`|_|^|^|^|_{a|d|d|c}`}]|\|]|[|Z|Z|Z}Y}Y}X}X}X}W}V}W}X}Y}Y}Z~Z~Z~Z~Y~Y~X~YZZYXXYZZYYZ[[[[~[~Y~W~W~W~WWXXYX~W~VTTU~V}X}W}W}V~W~VVVUUUVV~VXZZ[[\]Z[[^]]]~^____^][YVSRRRSSUTRRSUWXZ[\^___^\ZZ\_`_```^]ZZZZ[ZZZZ[[ZYWSQPNNMNONLKNNMLLNMONNNMMOPQPRSTTUURUYVUVXYZ[\]]_\[YVUTTSSSSSSSSTTTSSRPNKIIKLLLNONKILIGJMKJJHHJIGHGGGFFJLNMLMLJGEDDEEFGFFFEFGGHIIIIIJLLJHKKLNNPOOOPPOMLKJIIIHGEDDC@>>@ABAA@@@=<99877766568754454432468999986543322468::986433579:::;:;;;;;;<<;:8668:986567899:;<=<;:99:;<;;:;;<964359::6201356777655543346789865422223455666666666666555445444468:;;:9888:<=>?@?><988:<<==>?ABCCA@=<;;;<<====>><:89;=<<=?ABCDDDCCDEFFGHJKKJGGGGGGGGGGHHHHHGHHHGGFFHHJJJIHHIJJKKLMMLKIGEDDCEFEEEDDDdwdwdwdwdwfwhwjxkxkxjykymznzn{mzmymymylxlxlwlwmwmwlvkviwhwhwgwfwfwfwgvgvivivgvgvgwhvjvjvjvjwiwiwiwiviviuhuhvgvhwiwixkylykyjxjwixiyjxkxjxhxixiyjyjyiyiyhygxfxfxfwfwgvfvfvdwcwaxdxfxfwfxdxdxcydydygyhzkzlzj{izjzjyjykwhwevevfvgvhvjvjvkvkwjxiwgwgwgwhxhxhwgwgwjwjxlypyryrzqzq{s|s}s}t}r}q|p{o{oynylxlxjxkxmxnylykykyiygygxgxgxgxgxgxgwhwhwhxhxgxfxexdxcxcxcxcwcwcwcxdxexgxgygzhzhzhzh{i{j{j{j{jzjyixhxixixixhygygyiyiygyhxiyiyjykxkykykyiygyfyexfxgxgxgxgxfxfwewdxdxcxcxcxdydydydydycycycycycycycydyeyeydydycybybzbybzbzbzbzbyby`y_y_y`yayayazazay`y_y^y^y`ybyayazbzcydydydycycybzaz`zaz`z`z`z_z_z_z_z^z]z\z]z^z^z_z`zazc{d{e{d{d{e{f{g{h{g{f{d{c{c{c{e{f{g{j|m}l}i}c}c}g}g}e|c|d}c}e}e}`}b|b}a}^}\}Z|\|_|_|^|^|^|_|a{c{d|e|c|a|^|]|]|[|Z|[|[}Z}Y}X}X}W}W}V}V}X}X}X}X}Y}Y}Y}Y~XXXYYYXXZZZYZZZZZYY~W~W~W~X~X~YZZZZX~W~V~V~W~W~Y~X~X~Y~Y~Y~Y~X~X~X~Y~Y~Y~Y~Z[\[[\^\\\^^^^^_```^\[ZVRPQRSSTSQQRTVXZ\^`aaa_][Z[`a``a`_^[[YYZ[[[[\[ZYVROMKLLNNLKLMMLJKNNOONMLMNNPOQRSUUUSUXWWWXYZ[\]^^]ZWUSRRQQQQQQPQRSSRRSROMMLJLLMLLKKJKHGIIHGHGHGFEFFFEDEHJKJJKKHECDEEEFGGGGGGGHHHIJJIJKKJHKLMNOOPOPOOOMKJIHHGGFDCCC@?>?@@@?=<:86555555444566433334434578999876433222469:98754468:<<<;;;<<<;:;<;:866798777678::;<=>>=;99889::999:7422478:741024677666555444578876543222334566666566666655455555568:<<;;98789:<==>>=<989:<<==>?@BBBA?=<<<;;<<<=>?><:89;<;;=>@CDDDDDCCDEFGIKKLKHGGGGGGGGGHHHHGHHHHHGGHHHJJJIIHIJJKKMMNMKIHFEDEFGFEEEDCdwcwcwcwdwfwgwixjxixixjykylykzkykykxlxlwlwkwlwmwmwlviwhxhwhwhwgwfwfwgvivjvjvgwewewiwlwkwkwkxjxjxiwiwivhugvgvgvgwhwhwixjxjxjxiwixjxixixhxgxgxgxgyhxhxhxfxexexfwfwgwhwgwewbwcwcwdwfwgwfwdxdxcxcydyfygzjzjzhziyjykxkxkwgwdvevgvhvjvkvlvmwlwkxjxiwiwiwhwhwgwgwhwiwjxmypyrzrzr{s|t}u~t~s~q|p{o{o{oznzmymxlxmynynzmzlzkyiyhyhyhxhxhxhxhxhxhxhxixixhxfxexdxdxdxdxdxdxdxdxdxexfxfxgyhzhzhzh{h{i{j{j{jziyixixixixiygyezhzjyhygyiyjyjyjykykylylyjyhygyfxgxhxhxhxgxgxfwewewdxdxdxexexdydydydycycycycycycycydydydydycybybybybybzbzczcycyby`y_y_yaycybyazazayay`y`y`yayayayazazbzcycycycybzazazazazazaz`z`z`z_z_z^z]z\z]z_z`z`zazazazb{b{b{c{c{e{f{f{e{d{czb{a{a{b{d{f|h|j}j}h}b}b}d}e}d}b}a}b}c}c}a}c|b}`}]}[}[|\|]{^{]|^|^|`{b{d|d|d|c|a}_}]}]|\|\|[}[}Z}X}W}X}W}V}U}V}X}W}W}X}Y}Y}Y}X~XXWXXXWXZZZYYYYXXWWV~W~X~Y~Y~Z~[\\\[Z~X~X~X~Z~]~Z~Y~Z~[[~[~[~[}Z~[~\~[~[~[~\]\[\^]]]_`_^_```_^\[ZWQMPSSSSQPPQSVWY\^`baa`^[Z[___``a`^\ZXXY[[[\[ZYXVQNKJKKOOMLMOMLHKOOOONMLMNNOOQRSUVVVUWXYXXXYZ[\]]\XUSQQPPQRRQQQRSTTSTVUSQROKLMNMLLKKJGEFEDDGGEDDDDDCBBCEGGGGIIGDCDEFGHHHHIIIHHHHJJJJIJJIHLMMMOOQPPONNLJIHFGFFEECCBA@??@@?><;974223355432456532223333567898876544333469::9754468:<==<;<=>=<::;:9876788888789:;<==>>><:98789998775200267:853114577666655544467887643222334556666566676665445788778:;<<;:9888:;;<<===;:99;<<=>?ABBA@?=<<<<;;;<=>?>=;::;;:;<>@CDEEEDCCDEFGIKLMKIHGHHGGHHHHHHGGGHHGGGHHIIJKKJIIIIJKKLMNMLJHFEEFGHGFEEECdwcvcvdvevfvgvhwiwhxhxhyiyixhxixjxjwjwjwjwkwlwmwlwkxgxfxhwhwhwgwfwgwhwjvkvkwhwdxgxjwmwkwkxkxkxjxjwiwivhvgvgvgvgwgwgwhwiwiwiwhwhwixhxhxgxfxewexfxgxgxfxewdxewfwfwgwhwgwdwawcwdwewgwgwfwewdxdxcxcxfygzjzhzfziyjxkwkxjwfwdwhvivjwkwmwnwmxlxkxjxkxjxiwiwhwgwgwhwiwjxmyozqzqzs|s|u}u~t~r}p|o{o{o{ozoznznynymynznzmzlzkzjyjyjyjyjyiyiyiyixixixixixhxfxexexexexexexexdxdxdxexexfxgxhyhzhzhzh{h{i{jziyixixjxjxjxiygyfzizizgyhyjzlzlykylylzmzmzkzizhygyhxixixixhxhxgwfwfxexdxdxexexexexdydycycycycycycycycydydycycybybybybybyczdzcycyby`y`y`ycycycybzbzbybybyayayayayayazazbzbzbybybzazaz`z`z`z`z`z`zaz`z`z`z^z^z]z^z`zazazbzbzbzbzb{a{a{b{d{d{c{czbz`z_{^{]{^{_{`|a}b}b}b}`}_}`}a}`}_}^}^}_}_}_}_}^}\}[}Z|[|[{[{[{\|\|]{^{`{a|b|a|a}`}^}\}[}Z}[|[}[}Z}X}V}W}W}V}U}W}X}X}W}W}X}X}X~WWWVVVVVWYYYXXXXWWVVV~X~Y~Y~Z~[~[\\\[[~Z~Z~Z~[~_~[~Z~[~\~]~^}]}\}\}\~]~\~\~\~\~^]\\][]]__^^^_``_][ZYVPLPTTTSRPPQSUVX[]_``__][ZZ[\^^``_][XVVXZ[[[ZYXVTPMKKLMQPNMNPNMILPQQQPONNOOOOQRTVXXWVXXYXVVVWYY[ZYVTRPPPPSSTTTUVWXXWWYYVTTQLLMONMLLKHDBAADEFEDCCCCCCCCCDEEDEGGGEEFGHIJJJJKLKJIIIKLKJIJJHHLMMMNOPONNMLKIGFDEDEEDCCAA@????><;:863111355432347742223333457788876544333468:::865579;=>>=<=>??=9:;:987677899889:;;<==>>>=;:87767776541/.04799763235777666666544567876543222445665555666777764237888889:;<<;98789::::<=<;:99:;;<>?AAA@??==<<;;;;<=>??>=<;;;:;<=?BDEEEDDDDEFGIKLMKIIHIHHHHHHIHHGGGGGGHHIIJJKKKJIIIJJKKLLMLKJHFEFGHIHGFEEDdwcvcvevfugvgvhvhwgwgxgxgxgxfwgwhwiwiwiwjwjwlxlxkxjxfxexgwhwhwhwhwhwiwkwmwkwfxdxhxlwnwkxkxkxkxjxjwjwivhvgvgvgvgwgwgwhwiwiwiwhwhxixixhxfxdxdwdxexfxfxewdwdwewewewfwhwfwcwawcwewgvhvgwgwfwdwdwcwcweyeyhyezdyhxixkwkxhwdxewjvlwlwmwnxnxmykxlxmxlxlxkwjwivhvhvhwiwkxmynzozp{r|r}t}u~s}q|p|o{o{p{pzozozoznznznznzmzlzkzkzkykylykykykykyjyjxjxjyiyiygyfyexexexfxfxfxeydxdwdwewewfwgxgygzgzgzg{hziziyixixjxjxjxiygygzgzfzgzjykzlzmzmzlzmznznzlzjziziyixjxjyjyjyixhxgwgxfyfyexewewexeyeydydydycycycycycycycycycycybybybycycydzdzdycybybybycyeyeyeydydydydydycycycybybybzazazazazazaz`z`z`z`zazazazazazbzbzaz`z_z_z_zazbzczdzdzczczczb{b{a{a{azaz`z`z^z]{\{[{Z{Z{Y|Z}[}\}\}]|]|]|]}]}\}\}[}[}Z}Y}Y}Y}X}X}X|Y|Z{[{Z{Z{Z{[{[{]{]|]|]}\}\}[}Z}Y}X}Y|Y}Y}X}V}U}V}W}V}U}W}X}X}W}W}X}X}W~VUUTUUUUVWWWWWWWWWWWX~X~Y~Y~YZZZ[\[[[~[~[~\~_~\~[~\~]~^~_}^}]}\}\~]~]~[~[~\~]~]~\~\~\~Z~[~[~]]]\]^_^]\ZZYUOLPVWVUTSSTUVVWYZ\\[[[ZXWWWY[[]]\ZXVTUWYZZZYWVTQNLMMNOTRNNPQQNJNQSSSRQPPPPPPQSUVXXXVWXXWTSRTVWWVVTRQPOQRTVWXXYYZ[[ZY\\XUTRMMNPONMLJFA??AEGGEDCDEEDDEEEEFDDFIHHFGHIJKLKKKLMMLKJJLMLKIJIHHKLLLMMMLKKJHGFDBABABCBBB@?>===<;988752001356532336974323333356778887655433468:::98778:;>??>==>?><::;:98777789999:;<<==>>>>=<;:9765566541.+-157897434567877777765555678765433244457666567787777643578889:;;<=;:98899988:<;;98778:;<>@@@??>=<<;;;;;<=>???>===<;:;=?BDEEEDDDDEFHJKLLLJJIJIIHHHHHIHHGGGGHHIIJJJKKJIIJJJKKJJKLKJIIGFFHIKJHFFFEdwdvdvfvgvhwhwhwhwgwfxfxgxgxfwfwgwhwhwhwixjxkxkxjxixdxexgwhwiwiwiwiwjwkwlwixfxdxixnxnxlxkxkxkxjxjwjwivhvgvgvgwgwgwgwhwhwhwhwiwiwixixgxexdxcwcwdwewfwevdvdvewewewfwgwewcxdxexgwhwhwhwgwfwewdwcwbwbwcwbxcwdwhvjvjwiwgxexixlwmwnwnxnxmylylylxmxmylxlwkvivhuhuiviwjxlxlynzp{p|p}s}t|r|p{o{n{o{p{p{ozozoznznznznzmzkzjzkzlymymylylylylylykykxkyjyiygyfyfxfxfxgxgxfyeyeydxdwewewfwfxfyfyfzfzfzgzhyixixjxkxkxjyiyhzgzfzfzhyjykzlzmzmzmznzozozmzkzjzjyjykykykyjyjyixhxhygyfyfxewewexexeyeydydydydydydydydycycycybybybybybycyczdzdycycycydydzfyfyfyeyeydxdxexexdxdycycyczbzbzazazaz`z`z`z`zazazazazazbzbzbzbzaz`z_z`zazczczezfzfzezezdzbzazaz`z`z`z`z^z\{[{Z{Y{X{W|W|X}Z}Z|[|[|Z|Z|[}Z}Y}X}W}V}U}T}T}U}V|W|Y{Y{YzY{Y{Y{Y{Y{Z|Y|Y|X|X}X}X}X}W}X|X|X}W}W}V}U}V}W}V}V}X}X}X}W}X}X}W}W~V~UTSTTTTUUVVVVVVWWWXXXXXXXXY~[~\[[[~[~[~\~]\~\~]~Z~`~`}_}\}]}V~Z[[~Z~[~\~\~\~\~[~Y~Y~Y~ZZ[[\]]\\[ZYYVQNRWYYXVVVVVVVVWXWVUVUVVUUUVXXZZYXUTSTVXYYXWUSQOLLNNPQXSNORRSPLPSUTTSRQQQQQQRSTUXXXVVWWWSRRSUUUTSRQPOPQRVWYZ[\\]]][[]\XVTSONOPPONLID@@ABFHGECAEGFEFFGGGFFDGIIHHHKKLLLLLLMNNMKKKMMMKHIIHGJKKJKKJIHIHFECB@?@@@@A@@?><<;;:88765320/0356643235875433443346777888766554579:;:::989:;=???>=>?=<:9::9887789:::::;<==>??>><;;:9875565541.++.2689864456898777777665567886543334445677766778888775445789:;<<<<;98788987789::987679:;=??>>>==<<;;;;;<==>?@?>>==<;;<>ACDEEEDDDDEGIKKLKKJIJJIHHHHGHHGFFFGHHIIJJJJKJIIJIJJJJJIJJIIHGFFHJLKIGFFFevevfvgvhviwhwhwgwfwfwfwgwgwfwfwgwgwgwhxixjxkxkxiyfxcxdxhxixixiwjwjwkwjwkwhxexhxlxnxmxlxlykykxjwjwjvivhvgvgwgxgxgwhwhwiwiwiwjwjwiwixgxexdwcwcwdvdvevevdvdvewewewfwhwewdxfxgwiwivivhwhwgwfvevcvbwbwavawavcvfvhwjxhxgygylxnxnxoxoxnymylymyoynxmymylwkvjviuiuiuivjwkxkymzn{n|n}q}s{q{oznzm{o{o{o{o{o{oznzn{o{n{m{k{kzlznyoynymymymymymylylylyjyiyhygyfxfxgxgwgxfyeyexdxdwdwewfwfxfyfyeyezeyfygxhxhxjxjxjxjyhygzfzgzhyiyjykzlzmznznzozozozmzlzlykykykylylylykyjxixiyhygygxfxexexexeyeyeyeyeyeyeyeyeydzdzczczbybybybybybyczczcycydyeyfzfzgzgygyfyfyexfxfyfyeyeyeydydzdzczbzazaz`z`z`zazazazazazbzbzbzbzbzbzaz`z`zazczczezfzfzfzfzezczaz`z`z`z_z_z^z\{[{Z{Y{Y{Y{Y|Y|Z|[|[|[|Z|Z|Z|Z|Y|X|W|V}V}U}U}V|W|W{Y{Z{ZzYzXzW{W{W{W|V|V|W|W}W}W}W}W|W|W|W}W}X}W}W}W}W}W}W}X}X}X}X}Y}Y}X~W~V~U~TTTTTUUUUUTTUVWWXYYXWVVVWX~Z~[~ZY[~\~\~[[[\^\_^~\~Y~[~VYZYX~Z~Z~Z~[~Z~Z~Y~X~X~WWXY[[[ZZZZZYXUQTX[[ZYYYYYXWVTTSQQQRSSRRRTUVWWVUTSSTVXXWVURPNMLMQQSTZTOOSSUSORUVUUTSRRRRRRSSSTVWVUUVVUSRRSTTTSSRQQPQRTUWY[\^^^__\[\ZWUTSQPQQQPNLIEBCDEHHHFDDHIHGHHIIIHHEIKIIJJMMNNNNMLMNNMLKKMMMKGIIHHHIIIHGEDCCDCB@>=<====>>>><;987655444220/0356653234666543444456777888877666679:;;:;::9::=?@?>>>=<;989:988889:::;:::;<=>???>;:989985444541/,+,0479875556899888887766567887654443456677777777899897534679;<<<<;:9767887657888765579:<<<<<<===<<;;;;;<<=>?@??>>>=<;<>@BDDDDEEDDDFIKKLKJJIJJJIHGGGGGFFEFFGGHIIIIIJJIIIIIIJJIHIHHHHGFFHIKJHGFFFevevfvhvhviwiwhwgwfwewfwgwgwfwfwgwgwhwixjxkxlxjxgxbxbxfxixjxjxjxjwkwkwiwgwdxexkxnxnxmxlylykykxkwjvjvivhvhwgwgxfxgwgwhwhwhwiwiwiwiwhwgwewdwcwcvdvdvdvdvdvevdwdwewfwgwfwewgwiwjvjvivivhvhvgvfvdvcvawav`vaubvevgwhxhxhyjymynxnxoxoynymymynyoynxmxmxmwlwkvjvjuiuiviwjxjykzl{m|n|q{rzpznzmzm{n{o{o{o{o{o{nzo{o{n{l{k{k{lzmzoynymynynymymylylylykyjyhygygxgxhwgwgxfyeyexdwcwdwewfwfxexdydydydxexfxgxhxixjxjxixgyfyeyfygxhyjykzkzlzmzmzmznznzmzlylykykylymymylylykxjxjyiyiyhyfxexexdxeyeyeyfyfyfyfyfyeyezdzczczbzbybybybybybzbzbzczdzezfzgzgzgzfzfzfzfyfyfyfyfyfyfyfyfzezdzczbzaz`z`zazazazazazbzbzbzbzbzbzbzbzazazazbzczezfzgzfzfzezczbzaz`z`z`z_z^z]{\{\{[{[{[{[{[|\|]|]|\|\|\|[|Z|Y|Y|Y|X}W}W}W|X|X{Y{Z{[{[zZzYzXzW{W{W|V|W|W|X|X|W|X|Y|Y|Y|Y}Y}Z}Z}Y}Y}Y}Y}Z}Z}Z}Z}Z}Z}Z}Z~Y~X~W~U~U~TTUVVUTTSSTUWXYYYWVUUUUWZY~XYZ~[~[~[ZZ[_[][ZVZXYYWWXXXYYYYWVUUVWYYYYYYZZZZXUUZ\][[[\\[ZXVSQPMNOPRRRQQSTTUUTSSSSTVWVVTRONLKLOSSUV\UPPTTVUQSVWVVUTSSSSSSSSRRTTUSSTUTTTSSTTUUUSRQQRSTUVX[^__^`_]ZYXVUUUTRQQQPOMKGFFGHIJIGGHJIHHJJJJJJIJKJGKKKNNOPONNMMNNMKJKMMMJEGHGGHGFFECA?>>??><;:9:::::;<<:986554333222001356653234666544444567888889988876789:<<;<<;:::<>???>=<;:9789989999::::::::;<==>?>;86689864434541.,,/2689976668998888877765678987654434566778888778899::865579;=<<;:986567764467776545789;;;;;<===<;;;;;<<<=>??>???>==<==?BCDDEDDDCDEGIIJJJIIJJJIHGGFFFEDDDDEFHHHHHHIIHHHHHHHHHHHGGGGFEEGIKJHGFFFfvfvgviviviwiwhwgwfwfwgwgwgxgxhwiwiwiwjwjwjxjxhxexbxcxgxjxjxkxjxkwkwkwhwdxbxgxnxnxnxlylylylykykxkvjuiviwhxhxgxfxfwgwgwhwgwhwhwhwhwgwgwewdwdvdveveudududvevdwdwdwewewfwfwiwjwjvkvivivhvhvhvgvevevbvbububucvevfwgxhxiylynyoxnxoxoxoynynyoymymxmwnwnwmwlvkvjvjuivhwhxiyiyi{k{nzqzqyoymylylzm{n{o{o{ozo{nzn{n|m|l|k{l{m{mzmznznynynymylymylylykyjyiyhxhxgwhwgxfyeydxcxcwcwdwewewexdxcycxbxbxcxexfxgxixixixhxgxfyeyfxgxhxhyizizizjzkzkzkzkzkykykykxkylylzlzlykykxkykyjyiyhyfyexdxdxeyeyeyfyfyfyfyfyeydydzczczczczbybybybzbzbzbzczdze{e{fzfzezezezezeyeyezezezezezfzg{fzezdzbzazazazazazazbzbzbzbzbzbzbzczbzbzbzazazbzbzdzezfzezdzczdzczbzazazaz`z_z^{^{]{]{]{]{]{^{_|_|_|^|^|_|]|Y|Z|Z|[|[|Z|Z|Z|Z{Z{[{\{\{^z^z\zZzZzZ{Z{Z|[|[|[|Z|[{[|[|[|[|\|]}]}]}\}[}[}\}\}]}\}]}\}\}\}[~[~Z~X~W~V~W~W~XWVUTTSSTUWXYYYWVVUUUWYYXYZ~Z[~ZYYY^X[YYVYXXXWVWVVWWWVTSSTUUVVVWWXXYZ[YWVZ\\ZZZZYYYXVTQPNNPQSSSSSSSSTSRQQQQRTTTTRPNMLLMQUUWX^UPQUUXWSTWWWWVUUTSSRSSSRRRRSSTUUUVUVVVVWWWUTSSSTUVVX[^_^^^]\YWVVVWWWSQPPOONMJIIIIJJJHHILJJIKKJJKKJKLJIKLLNOQQPOONNONNKJKNMLIEFEEEEDCBA@=;::;;:9876777778898875443222222001356764334566655554568999889:::::889:;<<<==<;;:<=>>===<:986578889:::::::9999:;<==><964689965457641--/1489987668999999988766689:97765445667789998888899;;97668:<<<:99886555544456665445689::;;;<===<;;<<;<<<==>?>>???>>===?ABCCCCDDCCDFHIIHIIIJJJIGGFEEDCCCCCDDFFFGGGGHGGGFFFGGGGFFFFFFDEGHIIHFEFEfvgvhvivjvjwiwhwgwfwgwgwgxgxhxixjwjwjwkwkwjwixgxdxbxdxhxjxkxkxjxkwjwhwfxcxexjxoxnxmylzlzlzlxkxkvkvjviviwhwhxgxfwfwfwgwgwgwfwfwgwgwgwgwfwewdvevfvfueuevevewdwdwdwdwewfwgwjwjwkvjvivhvivivhvhufvevcvbububucvdvfwgxhxjxlxoxnxqxqxnxnxoyoynymylxmwnwmwmwlwkwkvjvhufvfwgxhygzj{nyqzpynylykylzm{nzozozozo{o{n{n|m|l|k{m{o{kzjzlzoymylykylylylykyjyiyhyhxhxhwgxfydycycxcxcwcwcwdwewdwcxbxaxaxbxcxdxexfxhxhxhxgxfxexdxexfxfxfxfyfygzhzizizjzjyjyixixixjykykzkzkzkykykyjyiyiyhyfyexdxexexeyeyeyfxfxexeyeydydydydydycycycybzbzazbzbzczdze{d{d{d{c{czczczczdzd{d{d{d{e{f{g{f{ezczbzazazazbzazazbzbzbzazazazbzbzbzbzaz`z`zazbzczezdzdzczczczczbzazazaz`z`z_{_{^{^{^{^{^{_{`{_{_{^{_{`|^|X|Z|[|\|\|[|[|\{\{\{]{^{^z_z_z^z[z[z\{\{]|]|]|\|[{]{]{]{\{]|_|_}_}^~^~]}]}]}^}^}^}^}^}^}]}]~]~\}Z}Y}X}Y}Z~Y~X~WVUSRSTVWXYYYWVVVVVVYYXYZZZZXWXVVZZXVXXXXWUUUTUTTTSRRRSTUUUUUVWXYZXVUYZYXXWWWWWVVSQPPPRRTUTTSSSSSRQONNOPRRRRQOMLLLMQVUW[_TQRVVYXUTVVXYVVVTRRQQSSSQRQQSUVVVWWWWWWXXWWUTTTUVVWW[]^^\\\[YWVWWYY\RPPONMMLKJJJIIIIIIJKKKJJJJJJJJJLJIKKMNPRRPPONOOONLKKMMKHDEDDCBA@@?=<9889987654555655667765433222222101355664323566556655678:::899:;;::989::;;<==<<;;<<==<<<;9987545668:;<<<<;:9889::<=>;8534789755676641.--159;:9667899999988766789::996454677888899998889:;;98768:;<<:987765554333455554456789::;<==<<;<<;;;<<===>>>>?>>>=>==?AACCCCCCCBBEGHHHGHHIJJJHGFEDCCBBBBCCDEEFFFFFFEEEEEEFEEEEEEEEEEFFHIGEDDChvhvivjvjviwhwgwfwgwhwhxhxhxhxjxkxkxkxkxkwjxhxfxdxexgxjxkxkxjxjxjwiwfxdxdxixmxownwmylzlzkzlwkwkvjvjwiwiwhwhxgxfwewewewewewewewfwgwgwgwfwevevevfvfvfvfvfwewewcwcwdwdwfwgwjwjwkvjvjvivivivivhugvfvcvcucucucudvdvfwgwjxmxoxnxmxlxkxmxoyoynylylxmwmwmwlwlwkwjwivgvdwewfxgxgyiymypyoxmxkxiylzmznzoyoyoyozn{m{l{l{k|k{m{n{jzjznzoymyjyjykylxkxjyiyhxgxgxgxhxgxeycybxbxbxcwcwcwdwcwcwbwax`xaxaxbxcxdxfxgxhxgxfxexdxexfxfxfxexdycydzezfzgzgygygxgxgxgyhzizjzjzjzjzjyjzizizhygyfyexexexexexeyexexexdxdxdxdxdxdxdydxcxcxcycybzbybybzczdzd{c{c{b{b{bzbzbzbzaza{a{b{c{d{e{d{d{czbzbzazazbzbzazbzbzbzbzazazazbzbzbzaz`z_z`z`zazbzczczbzbzbzczczczbzbzbzaz`z`{_{_{_{_{_{_{`{`{`{_{_{a{`{_|W|[|]|_|_|^|^{]{]{]{^{_{`z`z`z_z]z^z^{^{_{^{_{_{^{^{`{^{\|_|c}c}a}a~`~_~_}_}_|`|a|a}a}`}_}_~_~^}\}[}[}\}]}\}Y~W~V~USRSTVWXYYYXXXWWWWYYYYZ[~ZXVVVVUWXWVVWWWVUTSRQQQQQQQQRSSSSSSSTUVVUTTUTTTTTSSSSTTSRRSTUUVWWVUTTTSQOMKKLNPPPPONNMNNOSWVV]_TQTXXZZVUVVWXUUWUOOOORRSRQPPSVVWWXYYYYYZZYYXVVVXYXXXZ\]\Z][ZYVWYY[\YJONMLKJJJIIIHHHHHHIJJJJIIIIIIIIIJJJKLOPRQPPPNOOPPNLKMLJGDCCBB@>>=<;:8777776554444433345554322212222222355665323466545566789;;:999:;<;;:99::;;<<===<;;;<;:::999864235689;<<<<;;988788:<=;853256:975577763/,,.27;;966789999998876679:::;:644558899889:::9889:;;:98789:;:98777776643334555555678899:;<==<<;<<;;:;<===>===>>>>=>==>@@BBBABBBBABEGHGFFGHIJIHGFEDBBAAAABCDDDEDDDDDDDDCDDDDDDDDDCCDEEEFGGECBBjvjvkvjvjwhwgxfxfxgxhxixiyiyjxkxkxkxkxkykxiygyeyeygyiykxkxkxjwjwixgxcxcxfwkxnxnwmwlylylzlylwkvjvjviwiwiwhwgwfwewdwdwdwdwdwdwdwewfwgwgvfvfvfvfvfvgvgvfwewewdwcwcwcwdwewgwiwiwjwjwiwivivivhvgugvgvcvdududvdvdvdvdwgwjxlxlxjxixjxmxoxnynylykylxmwmwlwlwkwkxiwjwgwdwdwfxgxgxiylymxmxlxjyiymznzoznynyoynzm{l{k{k{j|j{k{jzhzkzozmykyiyiyjykxjxixhxgxgxgxgxhxgxexbxbxbxbxcxcxcxcwcwbwawax`x`xaxbxcxdxfxgxgxgxfwewewewewfxdxcybybybyczdyeyeydydxdyeyfygzhzhzhzhzhyhyhzizhzgzgzfyeyexexexexexexdxdxdxdxdxdxdxcxcxcxcxcxcycybybybybyczdzd{c{b{b{czczbzbzazaz`z`za{b{c{c{b{b{b{bzazazazbzbzbzbzbzbzbzazazazbzbzbzaz`z_z`z`zazbzbzbzazazbzczbzbzbzbzbzaz`z_{_{_{_{_{_{_{`{`{_|_|_{`{a{`{Y{]{_|`|`|_{_{^{^{^{^{_{`zazaz`z^z_z`z`{_{_{`{`{`{_{b|^|^|a|e}d}c}b~b~a}`}`}a|b|c|c}a}a}b}b~b}`}_}^|^|_|^|]}[}X~V~USSSTVWWXXXXYXXXXXXXYZ[[~ZXVUVVTVWVUUUUUUTSRPONOPPPPPPQQRRRQPPQQQQQQPNNOPPOOOPQSSTUVWWXYYYXWVUUSPMLIIJLNNOOOOOOPPQTXWW^_URUYZ[[WVUUTQNRVSLMMMPRSSQQQSVWYYZ[\\\\\\[[ZXYZ[[ZZYZ\\[Y\\XZUXZZX[NDRNKJIHHHHGGGGFFGGHIIIHHHHHGGGGHIJJKLNNPPPOPNMNONLKJKJIFBA@@?><<;::97656666554433322223443322211223332355665433467544566789:;::99:;;;::999:;;<<==<<<<<<:987777654123579;<<==<;9877789:<:75324589865677641.,-06;<;8899::99998766679:<<<;7546589:8789:;;:9889::987779::9777787766543455555667899::;<=>>==<=<;;:;<===============>??@AA@AAAAAACEFFEEFGIIHGFEEDB@@?@@ABCCCDDCBCBBBBBCDDDDCCBBBABCDDEFEDBAAlvlvlvkwiwhwgxfxgxhxixiyixjxkxlxlxlxlylykxjygzfzgzizlymxmxlwlwkxixfxbyexhxkwmwmxlxlylylylylwkwkvjvjxiwiwhwhwgwewdwdwcwcwcwcwdwewfwfwfvfvfvfvfvfvfwfwfwewdwdwcwcwcwdwewfwhwiwhwiwhwhwhwiwhwgvhvgvcvevfvevdvdvcvcwgwkxjxhxgxhxjxoxpxmylykykylxlwlwlwkwkwjxixjwgwdwexgwhwhxixkxlxkxkxjyjzmznzoznymynylzk{j{j{j{j{j{izgzhzlzmykyjyhyixixixixhxhxgxgxhxgxgwgxexbxbxbxbxcxdxcxbxbxaxax`x_x`xaxbxcxdxexfxfwfwfwewewewewexdxcybybycydyeyeydycycycydyeyfzfzfzfzfzfygygyhygzgzfzfyfyeyeyexexdxdxcxcxcxcxdxdxcwbxbxbxbxcycycycybxbxcxdydzdzdzczczdzdzdzczaz`y_y`z`zazbzbzaza{a{a{azazazbzbzbzbzbzbzbzbzazazbzczczbzaz`z`z`z`zazazazaz`zazazbzbzbzbzbzaz`z`{`{`{`{_{_{_{_|_|_{_{_{`{`{a{[{_|`|`|`{_{_{_{_{^{^{_{a{a{a{`{_z`zaz`{^{^{`{_{_{^{a|^|`|e|f}e}d}b}b}b}a}a}b|d|d|c}b}b~d~d~c~a}_}`}a}b}a}^}Z}W~V~UTSTUVWWWWWXXXWXXWWWXZ\\~ZXWWYXUVWVUUUTSSSSRPONPRRRQQPPPQQPONNNMMNNNLJJKMMLLLNPSTVVXYYZZZZYXXWUSPMJGGIKMMMNOPPQRRTUYWX\^WTVZ[\\XVTSPKHNROJKJMPRTTRRRSVXZ\]]]^_^^_]]\Z\]^^\[\\]]\[\\WYSVXVSRGEPLHFEEFFFFFEFFEEEFGGGGFFFEEEEEFGGHHIJLMNMMNMKKKKIGFHHFC@>==<;:9999976555655433222222112333221112234444556775445774335666789:;::999::::9999:;;;<<;;<<;;9876665554212468:;<===<98766788:9653334588766777641.-/5:<<:999::99986566789:<==<8656579:9889:<<:8778999878889887667877776656777766789:::;<=>>>===>=<;::;<=======<<<=====>??@@???@@@@BCDEEEEFGHGFEDDDA@>>??@ABBBCCBBAA@AAABCCDCBBAAA@ABCCDEDCBA@mwmwmwkwiwgwfxfxgxhxixjyjxkxlxmxmxmxmylzkyjyhzizjzlynymxnxnwmwkxgxdxayfyjxkwlwlxlxlymymylylwkwkwkwjxjxjwiwiwhwfwewdwcwcwcwcwdwdwewfwfwfvfvfvfvfwfwfxfxexdxdwcwcwdwewewfwgwgwgwhwhwhwhwhwhwhvivevdwfvfvfvevdvcvcwfwixgxexfxgxhxixjxkxjyjykykxkxkxkxkxjxjxjxkxgxdxgxhwhwhwhxjxjwjwjyiyjzlznznzmymylyjzizhzizizizizhyeyiylylykyiyhxgxgxhxgxgxgxgxgxhxgxgwgxexcxbxbxcxdxexdxcxbxax`x`x_x`xaxbxcxdxexfxfwfwfwewewewewfxdybyaybycydyeydycybybxcydydzezfzfzfzfyeyfyfygyfyfzfzfyfyeyeyeydycycybybycycycxcxbwbxbxaxbxcxdydycybxcwdxeyeyeyeydydyeyeyeydyby`y`y`z`zazazazaz`{a{azazazazazbzazazazazazazazbzbzczczczbzazazaz`z`zazazazazazazbzbzbzbzbzaz_z_{`{az`z`z_{_{_|_|_{^{^z^z`z`{_{`{a{`{`{`{`{`{_{^{_{_{a|a|a|`{_{`{a{_|]|]|`|_{]{^|`|_|a|f|f}d}c}b}b}b}b}b}c}d|d|d}c~c~de~d~a}`}b}b}c}`}]}Z}W~V~V~U~TTUVWWWWWWWWWWWWVWXYZZYXWYZXVWWVUUUTSSSSSQQRSUTTSRQPPPPPNMMMKLMNNLIIKMMLLLNPSUWXYZZZ[[ZZXWVTROLIFGHJLLLMOQRSTTTUYWXZ^YTWZ\\[XTSRNGGLOMHJJMQSTTSSSTVX[\]^___``___]\]^_`\[^]]\][\[RURQQNKGDEJIFDCDEFGFFFFFEDDEFGGFFEDDDDDDDEEEEFHJLKKJJJHFEEDCDBBB@>=<;:9888888765455554210/02321001223211123455556678864457742346656789:::9889999988889::;;::::;:87655555654234679;;==<;98666667876433234687678887420..27:<:::;::999865567898:==<866656799889;<<:8667888889998776566788787778888766789:::;<>???>>?>=<;:9:;<=======<<==<==>????>>??@@?@ACDDDEEFGGEDCCC@?==>>@@AAABCBBA@@@@ABCCDCBBA@@@@ABBCDCCBA@mwmwlwkwiwgwfxfxgxixjxkykxlxmymynynymylzkyjzizjzlynyoyoxnwnwmwkxfxbycyhxkwkwkwlxlxmymymylylwkwkwkwkxjxjxjwiwhwgwfwewdwcwcwcwdwdxexewfwfwfwfvfwfwfxfxexexexdxdxcxdxewewewewewfwgwhwhwgwgwhwgvgvdwewgvhvhvfvevdvdwdwfxaxaxgxfxgxhwhwixhxiyjxkxjxjxkxkxkxkxjxjxgxfxiyiwhwhwhwiwhwhxhyhyjzlzmzmzmylyjyhzgzgzhzhzhyhyfyfyjykyjyjyhxgwgxfxfxfxgxgxhxixixhxhwgxexdxcxdxexexfxexdxcxbxax`x_x`xaxbxcxcxexfxfwfwfwewewfwfwfxeycybybydyeyeydycybycxcydydzezfzfzfzeyeyeyeyeyfyfzfzfzezezeydydycybybybybybycycxbwaxaxaxbxcxdxdycxcxdwdxeyfyfyfyeyfygygxfxeycyaxaxaybzbzbzbzaza{a{`zazazaz`z`z`z`z`z`z`z`zazbzczczczczczbzbzbzazazazazbzbzbzczbzbzbzbzbzaz_z`{`{azaz`z_{_{_|_|^{^{^z_z`z`zaza{a{a{a{a{`{`{`{_{_{`|a|`}`}_|_|_{`{_|]|Z|^|^|\|]|^|_|b|f|f}d}b}a}a}a}a}b}c}d}d}c~b~b~ccb~`~`~b~b~b~`~]}Z}X~W~W~V~T~T~U~V~WWVUVVVVVVVUUUVWXXXWX[[ZXYYWWVUTTTTUUTTVWXWVUTRQQQPONMMMLMPPPMJKNPOOMMNPSVWXYYZZ[ZZYXVUSQNKIGHIJLMMNORTTUUUUYWWZ_ZVWZ\ZYXSRQLFHILKIJJNRTUUTTTUVXZ[]_````````_^``a`]Xa^^Z]XZWNOLJHFCCEFFFDCCEFGHHHGGFEDCDDEFFEDCCCCCCCCCBCDEGIHGFFFDBA@???>>>=<;:998777777655444443210/023220001232212345666567888754566312455556789::98777888877788999988899766544556654446789:;;::87655566654433333577678888641/.159;::::::9998645679668;<<:7666679999:<=<:8656788899:9765556778988878999888789:;;;;<>?@@@@@?>=<:99:;=========<====>?>??>=>???>??@BCCDEFGFECAAA@>==>>@@A@@ABBAA????@ABCDDCAAAAAAAAABCBBA@?mwlwkwjwiwgwfxfxgxixjxkxkylymymynynynymzlzjzkzmyoyoyoyoypxoxkxhxeydygykxlwkwkwlxlxnynymylykwkwlwkwkxkxkxjxixixgxfxewdwdwdwdwexexexexexewewfwfxfxfxexexexexexdxdxexdwdwdwdwdwewfwgwgwfwgwgwfvewdwfwhvivhvgvfvdvevaw^x`xexgxfxgxgwgwhwhxixixjxjxjxkxkxkxkxkxixgxiylyixhwhwhxhxgxfxfygzhzjzlzlylyjyhzgyfyfygygygyfxfxgxiyiygyixhwgwgxgxgxgxhxhxixixjxixixgxfxdxdxexfxfxgxfxexdxcxbxax`xaxaxbxcxcxdxexexfwfwfwfwfxgxgxfydycycydyeyeydycycydxeyezezezezezezeydydydyeyezfzfzezezezdzdycybzazazazbzbzcycxbxax`yaybxcxdxdxcxcxdwdxeygygyfyfyfygxfxfxeycyaxaxbyczczczczbzb{a{azazazaz`z`z_z_z_z_z_z`zazbzczczczczczczbzbzbzbzbzbzczczczdzczczczbzbzaz`z`{a{bzazaz`{_{_|^|^{^{^z_z`zazazbzb{b{a{a{a{a{a|`|`|`|`}`}_}_}_|_{`{_|]|X|\|^|]|]|^|`|b|d|e}c}a}`}`}`}a}a}b}b}b}a~`~`~`__~^~^~_``~^~[~Z}Y}Y~X~W}V~V~V~W~WWVUUUUUUVUUTTUUVVVVXZZY~X\[ZYXWUUUVWWWWYZZYXVTSRRRPOMMNNMPSSRNLNQSRRPNOQTUVWXXXXXXXWVUSROLKIHIKLMNNOPSTUUUUUYWVZaYVWX[XWVRQOKEFGJKJJLOSTVUUUUVXXYZ\^_````_`___`aba[Z`\ZZZSSQLIHFDBBBEGFFDDDGHJJJIIHFECBBCDEEDCCBBBBBAAAAABDDFECBBA@>=<;;;;;;;::9876666676555433333210//234321001222223457776678887544553123554455789;:9766777766667778867777776654567877646778999987654445555443222357788899976421147999::9:99886445797569;<:8666778899:<=<:865678889:::743456788988889:;;::989::;;;;<>?@@AAA@?><;99:;=>>>?>>=======>?>>>===????==>@BBDDFFFEB@?@>>==>>@@AA@AAAAA??>>@@BCEDDBAAAAAAAAABAAA@?lvlvkvjvivgwfxgxgxixjxkxkxlymymynynynzmzlzkzlynypyqypypyoylyiygyeygylxmxlwkwkxmymxoynylykykwlwlwlwlxlxlxkxjxixhxgxfxewewewewexfxfxfxfxfwfwfwexexexexexexexexdxdxdwdwdwcwcwdwewewfwfwfwfwewewcwdwgwiuiuhufufvevdw`wZwdwjwexfxgwgwgwhwhxixixixjxkxkxlxlxlxlxixixkylyjxhxhxhxhxgxexeyfzgyhyjykyjxhxfyeyeyfxgxfxexexfxfxhxhygyhxhwhwhxhxhxhxhxixjxixjxjxjxhxgxexexfxgxgxhxhxfxexdxcxbxbxbxbxbxbxcxcxdxexfxgwgxgxgyhyhygydycycyeyfyeydydydyexfyfyfzfzfzfzezeydyczczdzezezezezezdzdzczczbzazazazbzczcycxbxayayaybxcxcxdxcxcxdxdyeyfyfyfyeyeyfxexexdycybxbxcydzdzdzczb{b{b{azazazaz`z`z_z_z_z_z_z`zazazczczczbzczczbzbzczczdzezezfzfzfzfzezezdzdzczbzb{b{czczb{`{^|^|^|_{_{_z`zazbzbzbzbzb{b{b{b{b|b|a|`|_|_}^}^}^}^|_{_{_|]|X|[|]|_|^|^|_|a|c|b}`}_}_}_}_}_}`}`}_}^~]~]~\~]~\~\~\~\~]]][~Z~Z}Z}Z}Y}X}W}W~W~X~XWVVVVVVVWVTSTTUVVUUVXYX~Z^^]\[YWVVVWVWZZ]]ZXVSRQPSPMNPPOOSWVSONPTVUTQOPRUTTTUUUUUUTTSRQOMKJIIKMLOPPPQSUUUUUVYVSZcXTUUYTTRQNMJDEFIKLLMPRSUUUTVWXXXYZ\]]^^^^^]^^^__]XX]YVXVOMMHGGFECADGHHGGHHJKLMKJIHFECBAABCDCCBBBBBBBBAAA@ABCCA@??><<;::99999988765555665554333333210//2344210/1232334568887678888754443123554444579;;:8655665555555666655566666556679887566777778766554445554432223567898999987533467789:9:99876445677657:;:8767777889:;<<;976567899:::74345678998789:;<<;;:99:;<====>?@@ABBA@?><;:;<=>>>?>>=======>?>>=<<<>???><<=?ACDEFGEB@?>>===>?@@@@@ABBBA??>>?ABCEEDCBBBBBBBAAAABA@@lvkvjvjvivgwfxgxhxixkxkxlxlxmymymynynymylymynypyqyryrypymyjygyeyezjynxmxlwkxkymxnxoxnxlxkxlxlxlxlxlxlxlxkxjxixhxgxfxfwfwfwfwfxfxgxgxgwgwfwewexexexexexexexdxdxdwdwdwcwcwcwdwdwewewewewewdwdwcwdwgwhvhvgvfvewewevavbwewgwgwgwhwhwhxixiyiyiyjykylymxmxmwmwlwlwlxlxjxiyiyiyiyhyfydydyeyfxhxixixixhxfydyexfxfwewdxdxexexgxhxgxhwgwgwhxixixixixixixjxjxiyjyhyhygxfxgxhxixhxhxgxfxexdxdxcxcxcxbxbxbxdxexfwgwhwhxhxhyhyhzgyeycycydyfyeydyeyfyhyiyiyiyhzhzgzfzeydzczdzdzezezezdzdzdzdzczczbzazazbzczczcycxbxbyaybycxcycycycycxdydydydyeyeyeyeydxdxdxcybybybxcydzdzdzczbzb{b{azazaz`z`z`z_z^z^z_z`zaz`zazczczbzczdzdzbzbzdzfzfzfzgzhzhzhzgzgzgzfzezezd{c{czdzdzb{`{^|_|_|_{`{`zazbzczbzbzbzbzbzb{b{b{a|`|`|_|^}^}^}^}^|_{^{^|\|X|Z|]|^|]|^{_{`{a{a|_|]|^}_}^|_}^}]}]}\~[~Z~[~\~[~Z~Z~[~[~[~Z~Y}Y}Y}Y|Y|Y}X}W}W~X~X~YXWVV~V~XWWXVTSSTUVVUUVXX~Y[^^]\[ZWVUUUTW[~Z~\\YWTRPPPSOMORQNQVYWTONRUWWUROQRUSRSTTTTRRQQQONNLKIHILNKORQPRTVVUUVVXVRZcXSRSURQPOMKIEEFIJKLMOQQSUTTUWXWWXYZ\\]]]]\\\\\\]ZVUWWUSOMLKFEHGEC@FHJIIHIKLNNNMKJHFECAAABCCCBBBBBBBBBBAA@@@@A@>==<;:988999988887654455555443333332220/024542100122345678997667888765432112344443468:;:86445544444445565555566666544679:986556555666654334455443212346878999::987544577899:9888654445766679987777777899:;<<;9866667789:975445678998778:<==<<;::;<<==>>>?@ABCCBA@?=<;;;<=>?@?>=<<<<<<=>?><<<<=?@@><:;>ABDEEFEB@>====>>??@@@?@BCCB@??>?@CDEEECBBBBCCBBBBBBBA@kvkvjvjvivgwfwgwhxjxkxkxlxlxmxmxnxnynynyozoypyqysytzrzoykxixfyeyhzmyoxnxmxlxmynynynxmxlxlxlxlxlxlxlxlxlxkxjxixixhxgwgwgwgwgwfxgxgxgxgwgwfwexdxdxdxexexexexexexewdwdwcwcwcxcxcxdxdxexewewdwcwcwevgvgvgvgwgwfwgwfvdvevgwhwhwhxixixiyjzjzjzjzkylylymynxmxmxmxlxmxmxkxiyiyiyiyhyfyeyeyexfxgxhxhxixhxfxeyfxfxfwewdwdwdwewfxgxhwgwgwgwixixjxixixixixjxkxjyjyiyiyhxhxhwixixhxhxgxgxfxfxexexdxdxcxbxbxcxexgwhwiwixiyiyiyhzgzezczczezgzezeygyiyiyjyjyiyizhzgzgzfzezezezezezezdzdzdzdzdzczczbzazbzczczczcycxbxbybycycycycycycycyczczcycydydydydycycybybybybycydydzdzczbzbzb{b{azaz`z`z_z_z_z^z_z`z`zazazbzbzbzbzdzezdzbzczezgzgzhzizkzkzkzjzizizhzgzgze{e{ezfzfzc{`{_|`|`{`{azazczczczczbzbzbzbzb{b{a{`{_|_|^|^}]}]}^|^{^{^{]|\|Z|[|^|]|\{^{_{`{`{_|]|\|^|^}\}]}]}[}Z~Y~Y~Y~Z~Z~Z}Z}Y}Z~Y}Y}X}X}X}X}Y}Y}Y}X}W}W~X~XYXXX~W~W~ZYXZW~U~S~SUVWVUUVWXZ[]]]\[YVUSRSQTYWZZVTROMMPULKPTPNRY[WSOOSWYWUQOQQSRQQQQRQPONNMLKKJIIHIMPJPSQQSUVVVUVWXUQYbVQOOQNMKMKIGFFGIJKKLNOOQTQRTVVVVVXXYYZZZZZYZZYYXWTRRSROKJKIEEIJHD>GJLLLLLMNOONLKIGEDCA@@ABCBBAAAABBBBBA@???>>>=<;;:98778888777766555445544433333333320/023432101222345788876667877654310012333334569;:86444333333444555544566666655579:98755655556665433344445542123588899:;;:98766666689:988765445566677888777778899::;;<;;:987767789987655568987667:<>>==<;:;<=>???>>?@ACCCBA@?><;;<=>>??>><<<;<==??>=<<;=?AA?<:9<<==>>?@@@@@ACDDCA@@??@CDDEEECCCCCDCCCCCCCCClvjvjvjvjwhwgwhwiwjxkxkxlxmymymynynynynyozpzqzryszszqyoykxhxeygzkzmyoxnxmynyozoynymymylymymymymxmxmxmxmxkxjxjxixiwhwhwhwhwhxgxgxgxgxgxgwfxexdxdxdxexfxfxfxfxexexdxdxcxcxcxcxdxdxdxdxdxdwdwcwdwewevfvfwfwfwgwgwfwfvfvhwjwjwixjxjyjzjzj{k{k{kzlzlzlymymxmxmxmxmxlxjxjxixixiyhxgxfxexfxgxhxhxhxhxhxfxexgxgwfwfwewdwdwewfwgwgwgwfwgxjxkxkxjxjxixjxlylykykykyjyiyixiwixixhxhxhxgxgxgxgxfxexexdxcxbwcwewgwiwjxkxjyjyizi{hzfzdzdzgzhzfzfziyjykykykyjyizizhzgzfzfzfzfzfzezezdyeyeyeyeydycybyaybyczdzdzcycxbxbycydydydycycycyczczczczcycycybybybybybyczczczcycydzczbzbzbzazb{azaz`z_z_z_z^z^z_z`z`zaz`zazazazbzezdzbzbzezfzgzhzizjzlzmzlzkzjzjzjzizhzgzg{gzgzgzd{a{`|a{a{bzczczczczczbzbzazazazaza{`{_{_{^|]|]}]}^|^|^{^{]{]|\|\|]{^{]{]{_{_{_{_{^|]|\|^|^}[}\}\}Z}Y}Z~Z~Z~[}\}\}[}Y}X}W}W}W}W}V~W~X~Y}X}X}W}W~WWXY~X~X~X~X~[YZ[~X~U~T~TVXXWVUVWXYZ[[~[~ZYWTSQOROOSRVVSQOLLMSVIMSUPOTZ[VROPUXYWSPNOPQQQPQQPONMLLKJJJIHHHJNPKQTRRTUVVVTUUVSPW\TOLLNLJIKIHHHHHIJJKKMLMORMOQSTTTUVWWWXXXXXWWWVUTSQPOPOMIHJHDEJKJE?ILMNMMMNNOOMKIHFDCBA@?@ABA@@??@@AAAA@?>==<<<<;::987666776666665555555444433333333320//134421101123446788776667776543100123332234568:97533332233344555555555566655568998776655556665433344455553112478899:;;;:988776667999887654566666777778777899::;;;<<<<;;99877777777655568987667:=??>>>=<<=>?@@@@@?@ABCCCBA@?>=<<<=>??>>=<;<===???==<;=?AB@=:9;?BEEEEEEB?=<<=>?@AA@@@ACEFECA@@@ABDEEEEDCDDDEEDDCCCCCDkwjwjwkwkwiwhwiwiwkxkxlxmymymymymymymymyozpyqyrzr{qyoxnxmxhydyizlznxnxmynzoyqypznznzmzmynynynynymymymxmxlxkxjxjxjwjwiwiwixhxhxhxhxgxgxfxfxfxexdxdxexgxgxgxfxfxexdxdxdxcxcxdxdxdxdxdxdxdwdwcwcwdwdwevewfwfwgwgwfwfwgviwkxkxkykykzkzk{k{l{l{l{lzkzkzkykxlxlxmxlxkxjxixixixiyhyhxfxgwgwhwiwixhxhxhxfxfxgxfwfwewdwdwdwewfvgvgwfwewfxixkxjxjxjxixjylykzkzlzmzkyjykxjxjxjxixixiwiwiwhwhwgwfwfwexdwcwdwfwhwjwkwkxjyjzizizh{f{ezezhzizfzfzjzlzlzlzlzkzjzjzizhygygzgzgzfzfzeyeyeyeyeyeydycybybycydzdzdzcycxbxcydydydyczbzbzczczczczczcybybybyayaybybyczdzczczczczbzbzazazazazazaz`z`z`z_z_z^z_z`z`z`z`zazaz`zazdzczazazdzfzgzhzjzkzmzm{l{l{k{k{kzjzizhzg{h{h{g{e{b{a{b{b{czczczczczczbzaz`z`z`z`z`z`{_{_{^|^|^|^|_|_|_{_{_{^|^|^{_{_{^{^|`|`|`{_{_|^|^|`|_}\}\}\}[}[}\}\}]}]|^}^}]}Z}X}W}V}U}U~UVW~W}X}X}W~WWWX~Y~X~Y~W~WZZ[~\~Z~W~U~VWYYXWVUVWXYZY~Y~WVUSRPOROMQPUVSPNKLNSSJNUVRRVYYUQPSVXXVQNLMNPPPOOPONLKJJIIIHHHIJLNPMQTSRTUUVUSRQRNORVPLJJLJHHJIHHIIIJJJJKLLLMNJLNOPQRSUUUUVVVVVUUUTSQPNNMMMKGGHHDEKLKF@JMNONNNONNMLJHFDCBBA@??@A@?>==>?@@??>><<;;:::9888766655555555555665544444333344333220/123432101223445677765555665543100123333344457998644322223344556666665566766668889898665455544433444445664312467899:;;;;9999:866688877765457777777777788899:;;<<<<<<<===<;:9876667776678988778:=??@AA@?>>?@@@@@@@@ABCCCCBA@??>=<==?@??>>===>>??@?>=<=?BCA>:8:>BEEEEFFDA><<=>@AAAAA@ACEFFDB@@ABCDEFFEDDDEFFFEDDDDDDDjwjwkwlwlwjwiwjwjxkxkxlxmymymymymymymymynyoyqyqzpzpyoxnxlyfzezkznymxmxmyoyqyqypzoznznznznynynynymymymymxlxlxkxkxkwkwjwjwixixixhxhxgxgxfxfxfxexdxdxfxgxgxgxfxfxexdxdxdxcxdxexexdxdxdxdxdxcxcxcxdxdxdwewewfwfwfwfwfwgwixjxkxkykzkzkzlzm{m{l{k{jzjzjyjyjxkxkxjxixhwhwiwixixixhxgxgxhwhwiwiwixhxhxhxfxfxfxexewevdvdvdvevfvgvgvfwdxexhyjyixixixiyiykzjzlznznzlylylxkxkxjxixjxjwjwjwjwiwhwgwgwfwewdwdwfwhvjwkwkxjyjyizizh{f{ezezgzhzfzgzkzlzm{m{m{mzlzkzjziyhyhzhzgzgzfyfyfyeyeyeyeydycycycydydzdzdzdycxdydzezezczbzbzbzbzczczczczczbybybyayaybybzczczczbzbzbzazaz`z`zazazazazazazaz`z`z_z_z`z`z`z`zaz`zazbzbzbzazbzbzdzfzhzjzlzn{n{m{l{l{k{k{jzizhzg{g{f{f{d{c{b{b{c{czczczczczbzaz`z`z`z`z`z`z_{_{_{_{_|_|_|_|`{`{`{a{a{a{a{a{a{a{a|a|a|a|a{`{`{`{a|`}\}\}]}^}`}a}a|`|`|`}`}_}\}Y}W}U}T~UUVWW~X~W~W~WWV~X~Y~Y~Y~V~VYZ[~\~Z~X~V~W~XYYXWVUVWXX~X~X~WUSSTSSQOOQSVXWVTPMMNSQMQXXUVWZYUQQTVXWTPLKLMNNNMMNNMKJJIIIIHHIJJLOPORSRSTUUTSQOOLLMMPNKIJKJIHIIIIIJJKJJJJKKLLIHIKLMNOQRSSSSTTTTSSSRPONLLKKKIFEFFDEIJLEAJMNNOONNMMLKIGECBAA@@?>???>=<<<=>>>==<;;:99988777655544444444456776554444333344433332012232111233344456765444455554321012333445444589865443223333445666776666778888766889766544444433344555678632235789889::::::::97656777776656899888877788999:;<<=====<<==>>=<:876667776778998789;=?@ABBBA@?@@AAAAAA@AABCCCBBA@??>==<=>??>>>>>>??@@??><=?BCA?<::>BDDEFFGEB?<<>>@ABBAA@@BEGGFCA@ACDEEFFFEEEGGHHGFDDDDDDiwjwkwmwlwjwjwkwkxkxlxmxmymymylylylylylymynyoyoyoyoxoxmyjzf{i{mzmylxmxnypyqzrzqzqzpzozozoyoyoynymymynynymxmxlxkxlwkwkwjxjxjxixixixgxfxfxgxgxfxdxdxfxgxgxgxfxfxexexexdxdxexexexexdxdycycycycxcxcxcycxdxdxewewewewfwgxhxixjxkykzkylymzmzm{l{kziziziyhxixixjxixhwhwhwixixixixhxgxgxhwiwiwjxixixixhxfxfxfxcxexfwewdwdwfvgvhvhwfwdxdyhyjyiyhxhxhyizjzkzlznzmzlymylxlxkxjxjxkxkwkwkwkwkwjxixhxgxfxexewfwgvivjvjwjxjyjyizi{g{f{gzhzhzgzizlzm{m{o{o{n{m{lzkzjzizhzhzgzgzfyfyfyfyfyfyfyeydycydyeyezezeyexdxeyezezd{c{b{b{bzczczczczczczbybyayaz`zazbzczczczbzbzazaz`z_z`z`zazazazbzbzbzazaz`zazazaz`z`z`zazbzaz`z`z`{a{a{c{e{g{j{k{m{m{l{k{k{j{i{h{gzfzf{e{e{d{c{b{a{b{czczczbzbzbzazaz`z`z`z_z_z_z_z_z`{`{`|`|`|`{a{a{a{b{b{b{b{b{b{b{c|b|b|b|b|b{b{b|a|`}^}^}`|a|c|c|c|b{b|b}b}a}^}Y}W}U}U~VVWXW~W~W~WWWW~X~X~Z~Z~U~TWXZ~[~Z~Y~X~X~X~Y~YXWVUVWWWW~W~VTTTUUUSQQSUXYXWVTQOQUPPU[ZYYZ[YURSUVWURMJJKLMMMLMMLKJIIIIIIHIIJLNOPQRSSSTSSRQOMKHHIKMLJJKLKJIJJKKKKKKKKJJJLLKFHHIJKLMNOPPPPPQQQQQONMLLKIHHGECCDDCDFGHECJLMNNNMLLKJIGECBA@@@?>>>>>=<;;;;<<<<;:99988887766544333333333456777655444333334443342111232211233334445654322344544332112344444433468875544333433345667777667778888766788765444333333445556688754345788778899:::;;<87456666666579::9999888999::;<========<=>??>=;9866789999899:989:;=?@ABDDCBAAABBBCCBAAAABCBBBBAAA@?>=>>?????>>??@@A@?>=>@BBA?<::=@CDDFGHGD@=<=?ABCCBA@@CEHIGDA@BDEFFFGGFFGHIJJIHFDDDDEjwjwkwlwkwkwlwlwlxlxmxnxnxmylylykykykykykylymynynynxmxjyhzi{mznzlykxmypxqyqzqzrzqzpzpzpzpyoynymymynynynymymxlxlwkwkwkwkxkxjxjxjxixgxfxfxgxgxexdxdxfxhxhxgxfxfxexexexexexfxfxfxexexdycyczczcycycycycycxdxdwdwdwewfxfxgxhyiyizjzjylylzmzlzkzjzhyhyhyhxixixixhwhwgwgwhxixixixhxgxgxhxixixixhyiyiyhyfyfyeycxfxfxfxexexgwhwiwiwfwdxdyhyiyhygxgyfygzjzlzlzmzlylymxmxlxkxjxkxlxlxlxlxlxlxkyjyhygygxfxfwgwhvivjvjwjwjxkyjzizg{gzhzizhzhzkzm{n{n{p|p|o|n|m{l{kzizhzgzgzfyfyfyfyfyfyfyfyeydyeyfyfzfzfyeyexeyfzfze{c{b{b{c{czczczczczczczbzazaz`z`zazbzczczczbzbzazaz`z_z`z`zazbzbzczczczczbzczczczbzbzazazazazaz`z_{_{`{a{b{d{f{h{j{k{k{k{j{i{h{g{f{ezdzc{c{c{c{b{b{a{bzczczczbzbzbzazaz`z`z`z_z_z_z_z_{_{`{`|`|`{`{a{a{a{b{b{b{b{b{b{c|c|b|c|b|b|b{b|b|a|a}_}_}a}b}d|d|c|b|c|d}c}a}]}Z}W}W~W~XYYYYX~X~XXXX~Y~Y~[~Z~U~SUWY~Z~Z~Y~X~X~Y~Y~Y~XWWVVWXWWVUUUVVWWVTTUWYY~Y~XXWVSTVRSW\\[[\\YVTTUUUROLJJKKLLLLMMLKJIIIIIIIIJKLNOPQQRRRRRQPOMJHEIJKLLKKLMLLKKLMMLMLLLMLLLLLKFGGHIJKLMMLLLLLLMMMLKJIHHGGEECBABBBABBBDEDHJLLLLKJIHHGECA@????>>>==<<;::::9:;::9888777766654332222222223567776654443333344333332223321112333333345443212334443321233444554434699865543334433456778877678878887666665654444433444455567887654568877556789:;;<=:855555666568:;;;;;:9999::;;<<=>>>>?>=<=>@@?><:877899:::9:::::;<=>?@ABDDCCCCCBCCCCCBAAAABBBBBAAAA@?>>>???>?>>?@@AA@@?=>@ABA?=;<>@CCDEGIHD@==>?BCCDBBA@BFJJHFBABDFFFGHHHHIJKLLKIGEEEEEjxjwkwkwjwkwmwmxmxlxlxmxmylykxkxjxjxjxixixjykxlwmxlykyizh{j{lzlykxkxnypyrzrzrzrzqzpzpzpzoyoynymymynynymylylxlxlwkxkxkxkxkxjxjxjxhxgxgxhxgxfxdxdyfygyhyhxhxgxfxfxfxfxfxfxfxfxfxfxexdycybzbzczdydycxcxcxcxcwcwdwdwexexfxfxgyhyizjykylylzjziziyhygxhxhxixixixhxgxfwgwgxhxixhxhxgxgxhyhxgxgygygyiygyfyeydycyeyfyexexfxgxgxiwhwfxdxdyhyhygyfxfxeygyizkzlzkyjykxmxlwkxkxlymymymynynynymylykyiyhygxgxhwhwhvivjvjwjwkxkykyjzizh{i{j{i{j{l{n{o{o|q|q|p|o|n|l{j{i{g{fzezfyeyeyezezfzfyeydydydzezfzfyeyeyexeyezdzb{a{a{b{c{dzdzdzdzczczczbzazaz`zaza{b{czczczczbzbzaz`z`z`zazbzczczdzdzdzdzdzezezezdzczczczbzbzazaz_{_{_{`{a{b{c{d{f{g{g{f{g{f{e{d{c{bzbzbzb{b{b{b{b{bzczczczczczczbzbzaz`z`z`z_z_z_z_z_{_{_{_{_{`{`{`{a{a{a{b{b{b{b{b|b|c|b|b|a|`|`|`|`}`}_}^~_~`~a}b}b}a}a}b}c}b}_}\}Y}X}X~Z~[~\\[[Z~Z~ZZZ~Z~[~[~[~Z~V~UVWX~Z~Y~Y~Y~Y~Y~Y~Y~Y~X~Y~X~XYZYWWVVWYYYXVVWW~Y~Y~Y~Y~ZYYXVWXTTW\[[[\\YVTSSRQOMLKKLLLLLMNOMLKJJJJJKKJJKLLNNNOOPPPOONNLIHGJKKMMMLMONONMOQONPNMNONMMMMLHHIJIJKLLKJIGGHHHHHHFEEDDCCBBAA@AAAAA@=ADDFGIIIHHGFEEDBA?>==>>===<<;::999989999888776665454433222222222356788765444444444433333334432101233333334444321123344333233344455443359:8665433344434567889876789888887655434445654454445556778776656788754455689:;==<:76555666668:<=<<<<;;;;;<<<<=>>>>??>=<=>@AA?=;98789:;;;;;;;<<=>?@@@ABDDEEDDDCCCDDCCBAAAAAAABBAAAA@???>??>?>?@ABBBAA@?>@ABA@=<=?ADDEFGJIEA>>?@BCDDCB@@BGKMJFCBCDFFFGHIIJJLLMNMJHGFFFFjxjxkwjwjwkwnxmylxlxlxlxlxkxjxjxiwiwiwhwhxhxiwjwkxkyjzizh{jzlylxkwkxmyoypyqyqzqzqzpzpzozoynymymymymymymxlxlxlxlwkxkxkxkxkxkxjxixgxgxgxhxgxexdxfygyiyiyixhxhxgxgxgxgxgxgxfxfxfxfxeydyczczbzcydycxcxbxcxcxcwcwdwdwdxexexfxgxgxhyjykylykzjziyhygxhxhxiwhwiwiwhwgwgxgxgxgxhxgxgxgxgygyfxfyeyeyfygygyeydycybyeyexdxdxfxfxgxhwgwfxdxeyhyhygyfxfxfygyizkzkzjyixkxkxjxixlymznzozoznznznzmzlymymykyhxhxhwhwiwiwjwjxkxkykzkzk{j{i{j{j{j{k{n{o{o{p|q|q|q|p|n|l{j{g{ezdzdzdydydydzdzezeydydydydydzezeydydydxeydzcza{`{a{b{c{dzdzdzczczczczbzaz`z`zaza{a{bzbzbzbzbzaz`z`z`zazbzcycydydydydyeyezfzfzgzfzezdzczczczbzaza{`{`{`{`{`{a{c{d{d{d{d{g{f{a{`{`{a{azazaza{b{c{c{czczczdzdzczczczbzbzaz`z`z_z_z_z_z^{^{^{_{_{_{`{`{`{`{_{_{_{_{_{_|`|`|`{`}_}_}_}_}_|^}]~]~]~^~^}^}^}^}^}_}`}`}]}Z}X}X~Y~[~\~]]~\~\~\~[}Z~Z~Z}[}\}\}\}[~V~VWX~X~Y~Z~Y~Z~Z~Z}Z~Z~Z~Y~Y~Z~Z[ZYXWWWXYYZXWWYYYYXYXXYYXYWSUWYYYZ[[XUSSQPLLLLLLMMMLMNPPNMLKKJJJKKKKKKLMMMNNONNMMMLKIGHJLLNNNOPPQPPOQSPNRPNNPONNNNLHJJJJKLMLKIGEDDDDDDCBAAAABBBBA@@@AABA@ABDDDDEFFEDCCBBA@?====>====<<:9988888999887777666544443332222212235678876554444333433333234554210123333333444442101233444334443445554214897665433344544445789877788877888765433445665555555667787666657788653234578::<==<:87666667679<==<====<<===>>>>>??@@>=<<>?@A@><:989:;<<<<;<<<=>?@@A@ABDEFFEEEDCCDDDCCBAAAAAAABAAAAA@???>>>>??@ABCCBAA??@@AA@?=>ABDDEGIKJHC@?@ACDEDCA??CGLMKGDCDDFFGHIIJJKLMNNMKIGGFFFjxjxjwiwjwlwnxmxlxkxkykykxkxjxjxiwiwhwhwgwhwiwiwixiyhzizjzkzkyjxjwkwmynynyoyqyqzpzoznznzmymymzmzmzmymylxlxlwlxkxlxkxkxkxkxkxjxixhxgxgxgxfxexfygyhyiyiyixixhxhxhxhxhxgxgxgxfxfxfyeydycyczczcycycxcxcxcxcxdxdxdxdxdxdxexexgxgxhxixjxkyjyiyhxhxhxixixixixixhxgwfwfwfxfxfygyfyfyfyfyeydycycydydxexexdxcxbxbxcxdxcxcxexexfxgwgwfxexeyhyiyhygxgxgygyhyjyjyiyhxjxiyhyiykymznznzozozozoznzmyoynykyhxixjwjwjxixjxjxkykzlzl{l|k|j{k{k{k{l{m{n{p{p|p|p|p|o|m{k{i{f{czbzbzbycybybzczdzdycycycycycyczczcycycycybzaz`{`{a{b{bzczczczczbzbzbzbza{a{a{b{b{bzbzbzbzbzaz`z`z`z`zazczcycydydyeyeyeyfzgzhzhzhzfzezdzdzdzczczb{b{az`z_z_z`zazazaza{a{c{b{_{_{`{a{azazbzbzc{d{dze{e{ezdzdzdzd{c{c{b{az`z`z_z_z^z^z^{^{^{^{^{^{_{_{_{_{^{^{^{^{^{^|^}^}^|^}]}\}\}\}\|[}Z~Z~[~[}[}[}[}[|\}]~]~]~[}Y}X}Y~Y}\}^~^~^~^~^~]}\}[}[}[}\}]}]}\}[~Y~XYYYZ~[~Z~[~[}[}[}[~[~Z~[~[~\~\[ZY~X~X~Y~YZYYXXYZ[ZYYYWWYZYYVTUUVUWWYXVTRQPNJILMNOONMLNPRSQPNMLLLLMLLKKKKKKJKKKLLLKKKJHHKJLMOOOPQQSSSQSUSPUSPPRSQQPNMJLLLKLMMMKIFCBBBBAAA@@@@@ABCCBBBBBBCBBBCDDCCCDDBA@@@??>=<<<<==<==<<:998888788887776655543333333322212233467898655544333333334433345421001233333344444210012345444444444445310389876543224465433468987789876677887654445566666666666677766566678865312467799:<==;:8777778879;===>??>==>????????@@@>==<=?@A@><;:9:;<<<<<<<=>>?@ABBBBCDEFGGFFFEDDDDDCCBBAA@@@AAAAAA@@@@?>>?@AABCCCCCBAA@ABA@??ACEEFFGIKKHC@@ABCDEDCA@@CHNOLHEDEEGGFHJJKLLMNOPOMKHGGGGjxjxkwjwjwlxoxnxlxjxiyjyjxjxixiwiwhwhwhwgwhxhxixhygyhzjykylykxjwjwjxkylymyozpzqzoznzmzmylylzlzmzmzmymylxlxlwkxkxkxkxkxkxkxjxjxixhxgxfxfxfxgyhyiyiyiyhyiyiyixixixixixhxgxgygygyfyeydycycycycycxbxcxdxdxdxdxdxdxdxdxdxdxexgxgxhxixjxjxixhxgxhxixixiyiyhygxfxfwewexeyeyezezfyeyeydycybybybxbxcxdxdxcxcxaxaxcxcxbxbxdxexfwfwfwfxexfyhyhyhyhxhxhygyhyiyiyhxhxixhyhyiykymzmzmznznznznznzoyoymyjyiykxlxkxjxjykykylzmzm{m|m|l|l{l{l{k{l{n|o{p|q|q|q|o|m{l{j{g{ezbzazazayayazbzczdzdzcybyayayayayazazaybybyay`z`za{bzbzbzczczczbzbzbzazaza{a{b{b{b{azbzbzbzaz`z_z_z`z`zazbzcycycycycyeyfyhzizizizhzgzfzfzezezdzdzc{c{bz`z_z`zazazazaz`{_{`{_{]{_{`{a{azbzczczdzezfzf{f{f{e{e{e{e{d{c{b{az`z`z_z_z^z^{^{^{^z^z^z^z^z^z^z^z]{]{]{]{]|]|]|\}\}[}[}Z}Z}Z}Z|Y|Y}Y}Y}Y}X|X|X|X|Y}[}Z~Z}Y}X~X~Y}Z}\}^~_}^}^}^}^}]|]}\}]|]|^|^}]}\}Z}Y~YZ[[~[~[~[~[~[}\}\}\~[~\~\~\~\[~Z~Y~X~XXYXWXYYZ[\[[ZZYYZYXXUUUUTSTTVUTRRRPNJJNOQQPPONOQSTSRPOMMLLMNMLLKJJJIJJJKKJJJJIIGLKLNPPPQRRTTURTUVSUUSRTTSSQPNLNNMMMNNMLIEBAAAA@@@???@ABCDEDCCCCCDCCCDDDCBBBB@>>>>>>=<;;<<<;:;<<;:98877788777766555543333333333222223335788765454433333333444434543110123333333444431001234555553455443420048987554221457653246898779:975567788765555566666677766677766566678865301487778:<=>=;:988888889;<=>?AA@>>@AAAAA@@@@@@?>=<=>@@@?=<:9:;<<=====>>??@ABBBBCDEFHHGGGFEEEEEDCBBBA@?>@AABBA@@@A@???@ABBCCCDDDCBBBAA@@@BDEFFFGIKKIDAABCDDDDCA@ADIOPNHEEFGHHGGIKMMNOPQQPNLJHGGGixjxkwjwixlxnxkxjxgxhxixixixixhwhwgwhwhwgwhxhxhxgxhyiyjykxjxixiwjwjwjxlxmyozp{p{n{mzmylylylzlzmzmymymxlxlxkxkxkxkxkxjwjwjwjwixhxhxgxgxfxgyiyjykyjyiyhyiyjyjyjyjyjyjyiyhyhyhyfyeydydycybybybxbxbxcxdxdxdxcxdxcxcxcxcxcxexgxgxhxixixixhxhxhxhxixiyiyhygyfxexdxdxcycydydydzdzdzdyczbyayayaxaxbxbxcwcwbwaxaxbxbxaxaxcydxfxexexfxfxfxgxhxhxiyiyiyixhxhxhxhxhwhxgyhyiyjzkzkzkzlzlzmzmynyoyoylyiyjykxlxkxjxjykylzlzmzm{m|n|n|n{m{m{lzl{n|o|p|q|q|o|m{l{jzhzfzczbzazazazazazbzczdzdzcybyay`y`y`y`z`z`zayay`y`y`yazbybybybybzbzbzazazazazazb{b{c{bzazaybyazaz`z_z_z`zazbzb{b{b{bzbzcyeygyhzizjzjzizhzgzfzfzfzfzezdzc{bzaz`zazbzbzbzazaz`{`{^{]{`{a{bzczdzdzezfzfzgzg{g{f{f{f{f{f{e{d{c{bzaz`z_z_z^{]{]{]{]z]z]z]z]z]z]z]z]{^{^{]|]|]|]|\|[}Z}Z}Y}Y}Y}X|X|X}Y}Y}X}W|V|V|W}X}Y}X}X}X~X~W~X}Y}[}\}]}]}\}\|\|\|]|]|\|]|^}^}]}\}Z}Y~Z[[~Z~Z~Z~Z~Z~Z~[}[}[}[}[}[~[~[~Z~Y~W~WUVXVTVXYY[]]\[[Z[\ZXVUWVVSRRSSRQQRSROLMPRSSRQQPOPRSSRRPOMLMNONMLKKJIIJJJJJIIIIIHFMLLNPPQQRRTUVSTUVTUVTSUUSRRQOOPOMMMNNMLIEA@@@@A@@@@ABBCDEFEDCCCDDDCCDDCCBAA@?=<<<==<;;;;;:989:;:99887767777776655444333333333333333333467874455532234443343443455421112333333333443210023445665444443342//38976543222568753246898779:975556788887655566777777766677777666667976411276778:<=?>=<;::9999::;=>>@BBB@?BCBBBBBAAAAA@>=<<=>?@?><;:;;<=>>>>>>??@ABBBBCDDEFHHHHGGFEEEEEDCBBA@>=>?@BBAA@AAAA@@@ABCCCDEEDCBBBB@@@@CDFFFGGIJKIEAABCDEDDCAABEJOPOJFFGHIHGHIKMNOPQRRRPNKJHHHixjxkwjxjxmxmxixhxfxhxhxixixhxhxgxgxgxhxhxgxhxhxhxixjxjxjwiwiwhwiviwkxlxnyoyozmzlzlylxlxkykylymymymymxlxlxkxkxkxjwjwjwjwiwiwiwhwhwhwgxhxiykylykyjyiyiyjyjykxkxkxkxkxjxixixhyfyeydycybybybybxaxbxcwcwewewdxcwcxcxcxcxdxexgxgxixixixixhxhxhxhxhyhyhygyfyexdxcxcxbxcycydydydzcycybyay`y`yaxaxaxbwcwbwbwawaxbxaxayaybxdxexdxdxexfxfwgwhwixjxjyjyixiwiwhwgwgwgxgyhzizizjzkzkzkzkzlylymynymykykylylxkxkxkyjykylzmznzn{n|n|n|o|n{mzlzl{n|o}o}o}o|m{k{jzhzgzezbzaz`zazbzbzbzczdzdzdzcyay`y_y_y`y`z`z`z`z`z`z`yayaybybycycyczczbzbzbzazazbzczczczbybybybzbzaz`z_z`zazazb{a{a{a{`z`zazdzf{h{izizizhzhzgzgzgzgzfzfzezc{bzazazbzczcybybybzaz`z]z]{`{`zbzdzdzezezfzgzg{g{g{g{g{g{g{f{e{d{c{bzaz`z`z_{^{^{^{^{]{]{]z]z]z]z]z\z\{]{]|\|\|\|\|[|Z|Z}Z}Y}Y}X}X}X}Y|Z}Z}Z}X|W|W}X}X}W}W}W}X~X~W~X}Y}Z}[}\}[}[}[|[}[}[~[~[}\|]}]}\}Y}W}W~X~Y~Y~Y~Y~Y~Y~Y~Y~Z}Z}Z}Y}Y}Y}Z}Y~X~W~VVTVVURTWWY\]^^\[[[\ZYVVVUUSSRRQQQRSSSQNOSUUUTRQONNPQRRRQNLKLNOONLKJJJKKKKJJIHHHHGGMMMNNOQQRQTUWSUTVUTUUUTTSRRQQPPPNMMMNMLIEA@@@@A@@@ABCDDEFFEEDCCDDDCCCDCBAA@?=<;;;<<<;;;;:98889::99887667777766554433332233333333333233345553234532245543343344556532112333333333443210012345665445554332..38976553223578753246898779;:75556789998766667777777766677886654456887410256789:<>@??><;::::;:<<>??ACCCAACDCCCCCBAABBA?>=<<=??@>=<;;<=>???????@@ABCCBCDDEFGHHHHGFEDDDDDCCBB@><=?@BBBBABBBAAABCDDDDEDDDCCCCB@?@BEEFGGGHIJJIFBABDEEEDDBBDHKPPOLHGHHIHGGIKNPQRSSSSQOLJIIIixjxkxjxjxnxmxgxfxfxgxhxhxhxgxgxfxfxgxgxhxhxhxhxiwiwjwjwiwiwhwgwgviwkxlxnyoynzlzlylxlxlxkykykylxlxlxlymxlxkwjwjwjwjwkxjxjxixhwhwhwhwixjykylylykyjyjyiyjykykxlxlxkxkxkxjxixhyfyeydycybybyaxaxaxbxcwcwexexexdxdxdxdyexexfxgxhxhxixixhxhxhwhxhyhzhzgygyeydxcxbybybxbxbxcxcycycybzayay`y`yayayaxbwcwbwaxaxaxaxax`y`ybxcxdxdxdxexexfwgwhwiwjxkykxjxjwiwiwhwhxgygzhziziziyjyjyjyjyjxkxmxmymykyjykykykxkykykzlzl{m{n{o|o}o|o|o|n|m{l{m{o|o|o}n}m|k{j{hzgzfzdzbzaz`zazbzczczdzdzdzdzcyay`y_y_y`y`z`z`z`z`z`zayayaybycycycyczczbzbzazazbzbzczczdycybyczczczbzaz`z`zazaza{`|_|^|^{^{`zcze{g{hzizizhzhzhzhzhzhzhzgzfzd{bzbzczczcycycycyczbz`z^z^z`z`zbzdzezezfzgzg{g{g{g{g{g{g{f{f{e{d{c{b{a{a{`{_{_{_{_{^{^{\{\{\z\z\z\z\z]{]{]|]|]|\|\|\|[|Z|Z}Z}Z}Y}Y|X|Y}Z}Z}Z}X|W}V~W~W~W}V}W}X~W~W~W~X}Y}Y}Y}Y}Y|Y|Y}Y~Y~Y~Y}[}[~[~Z~X}W}W}X~X~Y~X~V~W~W~W~XX~X}X}W~V~V~V~U~USSSRUURPRUUW\]_^][[\\ZYXWVUTTTSSRRSSUUUSPRVVVUTRPONMNNOPQPNLKLOOPNLKJJKMNNLKJIIIIIHILOMMMNQRRPRTVSTSSRRSUVUTRPPPQRQPMLKLMMKHDA@?@@@AAABBBCDEFFEEDCCCDCBBBBAA@?>=<::::;;;;:::9888789988877665677765554322222223322222343333334553235653234433343333467654323443333333444321012345554444555442-.2897655433477886434679988:;97655678:::987777788877776667788775556788864013578:;=?AA@@>=<;;<<<=>?@ABDDCAACEDDDCCBBBCDCA?=<;<=??>=<<<=>?@AA@@@AAAABCCCCDDEFGHIIHGFFEDDDDDCCB@?<=?ACCBBBCCCCBCDEEEEEEDDDCCCCBBABBEGGHHHIJJJIFDBCEFFFEDCCEJMQQOMJJJJJIGGJKOQRRSSTTRPMLJJJixjxjxixixlxixexcxexfxgxgxfxfxfxfxfxfwgwhwhwhwiwiwjwjwiwhwhwgvgvgwixkymynyoymylykylxlylykykykxkxkylymymxlxkwjwjwjwkxkxjxjxjxiwiwiwjwkxlymylylykykyjyjykykylxlxlxlxlxkxkxiyhygyeydycybybxaxaxaxbycxcxdxexexexexexeyfyfygyhxhxhxixhxhxhxhxhyhzgzgzgzfydycxbxaybybxbwbwcwcwcycyczbybyayayayayaybxbxbxaxaxaxay`y`y`xaxcxdxcxcxcxdxewfwgwiwjxjyjxjxjwiwiwiwixhyhzhziziziyiyiyiyixixixkxlylyjyjykykykykykylzmzm{m{m|n|o}o}o|o|n|m{l{m{o|o|n|l|k{j{h{gzfzezczbzazazbzbzdzdzezezezezcyay`y`y`yayazazazaz`zazayayaybycycydydzdzczb{a{azbzczdzdyeydycydzdzd{c{b{bzbzbzaza{`|_|^|^{^{`zczd{f{gzhzhzhzhzizizizhzhzgzezczczdzdzdydydydydydyczaz_zaz`zazdzdzdzezezfzf{f{f{f{gzgzfzfzezezdzc{c{b{a{a{a{a{`{`{_{_{]{[{[{\{\{\{\{\{]{]|]|]|\|]|\|\|[|[}[}[}Z|Z|Z|Z|Z|Z|Z}X}W~V~WWW~W~V}W~W~W~W~W}X}X}X}X}X|X}X~WX~Y~Y~Z~Z~Y~X~W}V}V}W}X~W~V~U~U~U~UVWV~V~U~T~T~T~SRRRRSVTQPRRQRY]^_^\[[[ZYWWVVUUUTTTTTUVWWVSTWVVTRQONMLLMNOPOMMLMPPQOMLJJLNOONMLKKKKKJKMQNMLNRRROPRTRRRPNOPSUTSPMMMPQPNKJIJKKKHD@???@@AAABBBBCDEDEEDCCBCBA@@@??>=<<:999:::::9998766667788776556677655543222222222222222344333334543335664224433344333456655433444333333444432101234444334456542.-1786655433479997545779:99:;98656689:;;:98888899887667777788876666789986202479;<>@BAAA?>>=<=>>?@ABBCEECAACEEEEDCBBCDEDB@=<;:<>>>=<<=>?@ABBAAAAAABCBBCCCCDEFGHHHGFFEEDDDDDCC@?=??@@@AAAAAABBCBBCCAA@A@>>==<<;;;:999999:999877555445677765555556655543222222222222222343333334444434665313433454433456665444554333223344442111123344444456663/-057565644458:;:8655689:::;;98777789::;;:9889999887667788888877777899;:951247:;=?ABBBBBA?=<=>?ABCCCDEEDBBDFFFEDCBBCDEEB@><;:;=>>=<<=>?@ACBAABBBBCCBBBCDDDEFFFFFGFFEEDDDDDDC?>==@BDEEEDDEEEEFGHHHHGGFFEEEEEDDCDFIJJJJKLMLKIGFEFGHHGFEFFHMPSRQOMMNNMKIHJKPRTTUUVVTRONLLLhxhxfxexfxexaycycybxbxcxexexdxexexfwgwgwhwiwiwiwjwjwiwhwgvgvfwgxixkylzmymymxlwlwkxkykzkykyjyjxkxlxmxmxlxlxlwlwlxlxlxlylylylxlxlxmxnxnxnymymymylylylzlylylylylxlxlylylykyiyhzfzezeydycxbxbxbxcxcxcycybycydyexfxgygygyhzhzhzhyhygygygyfyfyfzfzfzfzgzfzezcycxbxcybycxcxcxcydydzdzdzcybyay`yazaybybybybyayay`z`y`yayaxbxbxbyayaybybxcxdxexfygxgygyhxhxixixixiyiyiyiyiyiyjxixixhxhyhyhyhyhyiyiyiyiyjyjzjzj{j{k{k{k{l|l|l|m|m|l|l{k{k{l{l{j{izhzfzezezdzbzaz`z`zazbzczezfzgzgzfzdycyayay`xaybycycyczbzaz`z`y_y_yaybybycydybzaz`z`z`zazczczdyeyeyeyfzgzg{f{f{ezezezdza{`{`{a{a{`zaycyczdzdzezfzgzgzhzizhzhzgzezczczdyeyeyfyexdxdxdxdxdybyaybyaybycycycyczbzbzb{c{c{czdzezezezdzdzc{c{c{c{c{d{c{c{c{b{b{a{`{^{]{\{]{]{\{\{\{\{]|]|]|]{]{^{]|]|]|]|\|\|\{\{[{[|[|Z}X}X~Y~Y~Y~Y~Y}Y~Y~X~Y~X~X~X~X~Y~Y}Z}Y}Z~Z}Z~[~[}Z}Y}X}W}V}W}X}X~X~X~X~W~W~WWWVVVU~U~T~S~R~R~S~T~U}W~VUUSQQRX\]_^ZYZZYZYXYWWVVUUUVWWXXWVTTUTSRQPOOPOOOOPPOONNNOPPNMMKLNMOPPPPPOOPOONRTPMKQUTRMNNQPONLHFHLOQONJIJMNLKGFGHHHIKE?=>??@@AAAAAAAAA@ABA@???><;;;;;::::988888988876654323455665555545555554332222222222222233333333444444456531233344433446766554555543222223333211112333454445665310134556655558;;:965469:;;<<;:9988889::<<;:99:998988766778888888889:;;;;:612379=?ABCCDCBA@><=>@ACDDDEEEDCCEFFFEDCBBBDEEC@>;9:;<>>>=<=?@@ACCBBBBBCCCBABCCDDDDEEEEEDDDDDDDDDDC@?<=@DGGGEEEEFFFHHIJIIIHHHGFFEEEEDEGJKKJKLMMMKIGFFGGIIHHGGHJOPTSQPNNOPOLJHJKPSUUVWWWVSPOMMMgxgyfydyeycybybybyaxbxcxdxdxdxdxexexgxhwiwiwjwiwiwiwiwhvgvgvgwixkymynzmymxlxlwkwkxkxkykyjyjxkxlxlxmxmxlxlxlxmxmxmxlxlxkxkxlxmxnxoxoxoynymzmzlzlzlzl{lzlzmymymymymymylykyiygzfzeydydydxcxbxcxcxdxdycybycydyexgygyhyhzhzhzhyhygygygygyfyfyfzfzfzfzgzgzezcycxcxcxcxcxcxdyezezdzdzdzcybyayayazbybybybybyayayaz`z`yayayaxaybyayayaybxbxcxdxeyfyfyfyfxhxhxhxiyiyiyiyiyiyiyixixhxhxhygygygygygyhyhyhyizizh{i|i{h{h{h{h{i|j|k{k{k{k{j{j{j{j{hzfzezdzdzdzbzaz`z`zazbzczdzfzgzgzgzfzdybxax`xaxbxcydydycybzaz`z_y_y_y`yaybycycyaz`z_z_z`zazbzczcydyeyfygzhzh{h{gzgzgzgzezc{b{b{d{d{czcycyczczczdzdzezezfzgzfzfzezdzczczdyeyeyeyexdxcwdxdxdycybybybycycycycybzaza{a{b{b{bzczdzdzdzdzczc{c{d{d{e{e{e{e{d{d{c{czb{`{^{]{]{]{]{]z]z]{^|^|^|^{_{_{^|^|^|]|]|]|]|\{\|\|\}[}Z}Y~Z~Z}Z~Z}Z}Z~[~Z~Y~Y~Y~Y~Y~Z~[}[}[}\}]}^}^}]}\}[}Z}Y}X}X}Y}Z}Z}Z~Z~Z}Y~XXXXXXW~W~V~U~T~T}U}V}V}W~WWWURRSX[[_]YXYZZ[YXYXWWWWVVVWWWWVUTTSSRQPPPOPQRQQQQPPONNOOONMMLLMMOOPRTSRQQQQOSUROLRVURNMNPNNLIGFGJMPNMIGHJLKIEEFGGFGIF@<>????@@@@@@@??>>??==<<<:888899999878888887765443222344555544334544443333222222333222223322233345554335653323444333456766554556654332222233211123444344345665420124566766669<=<975579:;<==<;;;:9888::<<;;::;:9998877767888888889:;;<===862368==>@BDEEEEEEDCCEFGFEDCBBBCDDCA>;9::<>>>==>@BBBBCCBBBBCBBBABCCCDCBBAABCBBCCDEEDDDC@?=>AEHHHGFFFGGGIIJKKKKKJJIHGGGFEEFHKMMLLMOONLJHGGHIIIIHHIJLPRTTRQOOPQPNKHJKPTVVWWXXWTQPNNNfxfyeydycybybyayayaybxcxdxdxdxexexfxgxhxiwiwjxixiwhwgvfvfvgwhxjxlymynymylxlxkwjwjxjxjyjyjxkxlxlwmwlwlwlwlwmxnxnynxmxmwlwlxmxnyoyoypyoynylzlzlzmzmzmzmzmznynynymymymymykyjyhzfyeydydydxdxdxdxdxdydycycydyeyfxhyhyhyhzhzhzhyhxgxhxgxgygygygzgzfzfzgzfzfycycxcxdxdxdxdxeyfyeyeydycybyaxayaybzbybybybyayayaz`z`y`y`yayayayayayayayaxbxbxcxcydydydyexfxfxhxhyiyiyiyiyiyiyixhxhxgxgyfyeyezfzfyfygyhzhzh{g|g{gzfzezdzdze{f{h{h{h{h{h{g{g{gzezdzczbzczczbzazazazbzczdzezfzgzgzgzezcybxax`xaycydyeydycybzaz`z_z_z^z`zazcydycyaz_z^z_z`zazbzbybycycyezg{i{i{i{hzhzhzhzf{c{c{d{e{e{dzdycybzczczczczdzdzezfzezdzdzczbybycydydydycxcxcxcydydycycycycybycycybybzaza{a{a{a{azbzczdzdzczczczd{e{e{fzf{f{f{ezezezdzc{a{`{_{^{^{^z^z^z_{_|_|_|_{_{_{_|^|]|]|^|]|]|]{]|]}]}\~[~[}\}[}[}[|[|\}]}\}[}Z}Z~Z~Z~[}[}[}\}]}_}`}`}_}]|\|[|Z|Z|Z|Z|[}[}\~\~\}[~ZZZZZZ~Y}Y}X}W}W}W}W}W~X~XXYXVTTTXYZ^[WVXYZZXWYXWWWWWVVVVVVUTTSRQQPPPPPPPQQQQQQPOOOOOONNNMMMLNOQRUUSRRRRPSVSPMRUVSNMNOMKIGGFEHLNMLIGGHKJIEBBDEDEDD@>==>????>>>>>====>=<<;;:987787777777777777665433211223455544433344443323221122333333333332223334565433466432345433246776554455665433332112332113444444443456553112466788878:=>=:75468:;<>>===<;:998:;<<<;;::::999988777788888889:;<=>??:84468<@ABCDEDDB@>==?@BDEEEEEECCCDEFFEECBBABCCBA>;99:<=>>>>?ABBBBCCBBBBBBBBABCCCCBAA@@AAAACCDEEDCCCA@>>BFHIHHGGGHHIJJKLLLLLLKJIIHHGFFGILNNMMNPQPNKIHHIIJJIIHJKNQSTTRQPPQSQOLIJKPUVWXXYXXVRQOOOexdxdycybybyayayayaxbxcxdxdxexexfxgxgxhxhxiwjxixhwgwfvevfvfwhxjxlxlxmxlxkxkxjxjxjxkxkxjxkxlynynxnxlwlwlwmwnxoxoynxnxnxmxmynyoypypypyoynylzlzlzlzmzmzmzmznynynynynynymylyjyhygyfyeyexexexfxfyeyeydydzczezfzgyhyiyiyhzhzizhyhxhxgygygzgzhzhzhzgzf{gzgzgydydydydydydyeyfyfyfyeycycxbxaxaybycybybzbzbzazazaz`y`y`z`zazazazazazazayayaybxbxbybxcxcxcxeyeyfygyhyhyhyhyhyhxhxhxgxgyfyeydydzezeyeyfygzgzg{f{e{ezczbzazazazbzczdzdze{e{d{e{dzdzczczbzbzczbzazazbzczczdzezfzgzgzfzeycybyayaybycydyeycybybzaz`z_z^z^z_zazbzczbz`z^z]z^z_z`z`y`y`y`ybydzg{i{i{h{hzhzhzgzezd{d{e{f{fzezeydyczczczczczczdzezezdzczbzbzbybybycybybybybybybycydycycycyczcycycycycybzczb{b{a{azbzczczczczczczdzezezfzgzg{gzgzgzfzfze{c{b{a{`{_z_z_z_z`{`|`|`|`{_{^{^|]|]|]|^|]|]|^{^|^}]}]}\}\}]}]|]|\{]{^|^|^}]}\}\}[}\}\}\}\|]}^}`}a}a}`}^}]}\}[}[|[|[|\|]~]~^~^}^~^]]]]~]}\}[}[}Z}Z~Y~Y~YYYYYXWUUUWXY[YUSVWXWUUZXVVWWWVVVUVUTTSSRQPPPOOOOPPPPQQPPOOONNNMNNOONLMNQRUUTSRRQQSWTRNRVWTNMMMLIFEFFEGJLLLHFGGIHHD?=@AAAAA@==<======<<<<;;<<<<;;::98766777666677666555443221112223455544333454432222221233343333333222233445664334665434455432467765444556654333321122332234444555444566643234689:9989;>?>;85468:;=>>>>>=<;::9:;<<<;;;:::99:99988888888888::<=??@?;97567:789;=>>>>?ABCBBBCCBBBBBBBAABCCCBA@??@@@@BCDEEDCCCBA??BGIJIIIIIJJKKLLMMMMMMLKJJIIHGGHKNOONNOQRQOLJIIJJKKJJIKMPSTTSRQPQSUSPMJJKQUWXYYYYXWSRPPPdxcxcxbxbybybyayaybxcxdxexexfxfxfxgxgxhwhwhxixhxgwfwevdvfvfwhxjxkxlxmxlxkxjxixixjxkxlxkxlynynymxmxkwkwlwmxnxoxoynxoxnynynyoypypyoyoynymylylykzkzlzlzmzmznzoznznynynymylyjyiyhygyfyfxfxfxfyfyeydydydzdzezfzgyhyiyiyhzhziziyhyhxgygygzg{gzgzg{f{e{h{hzhydydycydydyeyeyeyfyfydybyaxaxayaybycybybzbzbzazaz`z`y`y`zaza{a{azazazazazayayayaxaxaybybybyczdzezfygygygygyhygxgxfyeyezdzczczczdzdyeyfyfzfzg{f{ezczbybyay`z`z_zazbzczczc{b{czbzbzbzbzbzbzbzbzczczczczczdzezfzgygyfyeycybyayaybycydydycybzaz`z`z_z^z]z_zazbzczaz_z^z]z^z_z_z_y_y_y_y`zb{e{g{h{h{hzhzgzfzezdzezfzgzgzfzezezdzdzdzdzcycydydydzczczbzazayaybybyayayayazazbybyczcycycydydydydydydycyczc{c{b{bzbzczczczczczczczdzezfzf{h{i{i{i{h|g{e{czbzaz`z`zaz`z`{`{a|a|`|_{^{^{]{]|\{\{]{]{]|^{^{^|^}]}]}]|^|^|^{^{_{_|_|_|^|]|]|]}]|]|\|\|]|_|a|b|b}`}_~^~]}\}\|\|\|]|^}^~_~_}`~_____~^}^}]}\~\~\}[~[[ZY~YXWVUUUVWWUTSSUUUUTUXWVUVWVVVVUUTSSSRQQPOOOOOOOOOOOPOONNNMMMMNNONMMLNPQTTSRPRQPRWUTNQVWTNMLLKJGDDEDFHJJJGDDDEEEB>;=>?==>><=<:;;;;;;:::99:;;;::::9876666655556655544333322111222345555333345543222222233334444333322223444566544456544445433245666544445665544432112233234565456555567766433478:;::::????>=<;:::;<<<;;;;9:99:::988998778888:;;=>??@=;8668<>@BCDDDDCB@>=>?ABDDEEEDBBBBBBBDEEDBA@A@@?=:778:<>>>>?@ABAAAAABBBBBBBAABBBBA@@??@@@@BCDDDDCCCCB@@CHJKKIIIJJJKLMNNOOOOONMLKJJIHHILNPPOOPSSSQNLKJKKLLKKKL~ORTVUSQPPRTUUQNKKLQUWYYYYYYWTSQQQcxcxcxcxcycyczbzaycxdwewfxfxfxfxfxfxgxhwhwhxhxgxfxewdwdwewfwhxixjxkxkxjxjxjxixjxjxkxlxlymynynymxlwkwkwlxmwnwnwoyoynynynynzozoyoynynymymylykylxlxmxmxnxoynznznznznzmzlzkzjyiyhyhygygxhxhxgyfyeydycyczdzezfzgyhyhyhyhzhzizhyhyhxgygyfzgzg{g{f|f|e{h{hzizdzczczdzdzdzezezezezeyby`x`x`yaycycycycybzbzazayayayayay`z`{a{azazazazazay`y`y`y`yazazazbzbzczdzezezfzgygyfyexeydyczczbzbzbzczczdydyezezd{e{d{czaz`y`y_y^z^z^z_z`zazazazazazazazazazbzczczdzczczdzdzdzdzezgzgygyfyezczbyayaybycydydycybzaz`z`z_z^z]z^z`zazbzaz_z^z]z]z^z^y^y^y^y_z`zazc{d{e{ezezezezdzdzdzdzfzgzfzfzezezeyeyeyeydydydydydzdzdzczbzayayayayayayayayaybybyczcydydyeyeyeyeyeyexdydzd{d{d{czczdzdzdzdzczczdzdze{f{f{h{i{i{h{h|g{e{c{a{azazbzbzaz`{a{a|`|_|^{]{\{\{[{\{\{]{^{^{^z^{^{^|^|]|^|_{_{_{_z`z`{`{`|_|_|^|^|^|^|]}[|]}`}b}b|b}`}_~^~]}\|\|\|]|^|_}`~`~a}a~aaaaa`~_}^}^}]}]}\}\~\[Z~XWUTTUUUVUTSRRSSTSTVVUTUVVVVUUTTSSSRRQPOOONNNNNMMMMNNNMMLLLKLMMNMLKJLNORRPNNPONPUQQOQUVTLKKJIHGDCDDDFGGGFCA@AAC@<:9<=;<<<;<<::9::::988789:::::998876665555555544444433332111223445665333345544333333333334444333222223444566544345654444432235666543345665544432001333345665346666678777544589;<;;;<=@A?=84457:<=?????>>=<;:;;<<<;;;;:9999::988999889988:;;=>??@?=;889;>@ACDDDDCB@?>>?@ABCDEDDBBBA@@@BDDCA@@??>=<9667:<=>>>>??@@AABBBCCCBBBAABBBB@@?@@AA@ABCCDDDCDDDCBAEJLMMLKKKLLMNNOPPPPPPONLKJJJIIJMOPPPPQSTTROMLLMMMMLLL~N~QTVXVTQPPSVWVSOLLMQUWYYYZZYXUTRRRcxcxcxcycyczbzczcydxewfwgwfxfxfxfxfxgxhwhwhxgxfxexewdwewfwfxhxixixjxjxixixhxixjxjxjxkylymymymylxkwkwkwlwmwmxnxoyoynynynznznznynynymymylylxlxkxkxlxlxmynynznznznzmzlzkzjyjyiyhyhyiyixixixiyhyfydyczbzczezfzgygyhyhygzgzhzhyhxhxgxfyfzfzg{g|f|d|c|g{hzizdzczczdzdzdzdzezezezfzby_y`y]z`zcydydycybyazaybybybyayay`z`zazazazazazaz`y`y`y`y`z`z`zazazazbzczczczdzeyeydycycybzazazazazazbzczcydzdzdzc{b{bzaz`y_y_x^y^z^z^z_z`z`z`z`z`z`z`z`zazbzczdzdzdzdzezezezdzezfzgzgygyfyezdzbybybycydyeydydyczbzaz`z_z^z]z]z_zazazaz_z^z]z\z]z]z]z]z]z^z^z_z`zazbzczczbzbzbzbzczczdzdzezezdzdzeyfyfyfyeyeyezezezezdzdzczcybybybybybybyayaybybzczdyeyeyfyfyfyfxfxewexeyeze{ezezfzezezezezdzdzdzeze{f{f{g{h{h{h{g|f{d{b{a{azbzbzbzaza{a{`|_|^|]{\{[{Z{Z{[{[{]{^{^{]z^z]z]{]{\|^{`{`{`z`zaza{a{a|`|`|_|_|^|`}]}Z}[~]~a}b}a}`}^~]}]|\|\|]|^}_}`}`~a~a}b~bbbcba~_}^}^}^}]}]}\~\[YWVTTTUUUUTSSSRRRSSTVUTTUVVVVUUTSSSRRRQPONOMKKMMKKKLLLLKKKKJJJJKKJJGHHKLOOMKKMMLLRMMOQRRPIGGHFEEDCCCCDEDDC@><=>@>:87:;::;::<;99899998776789999:99887655555555554433444333322122345677643334544433333344343333332221233454456654434555543322123566543334566665544200134444567544667777888876679;<==<<=>@A@=954579<>?????>>=<;:;;<<<;;;;:999:::9889:9889989::;<=>???>=:::<=?ABCDDDCA@??>??@ABCCDCBAA@?>?@CCBA???>=<;96679;<>>>>??@@AABBBCCBBBBAABCCBAA@@ABAABBCDDDDDDEEDDCEJMNNMLLLLMNOOPQQQQQQQOMLKKJJJLNPPPPQRTUTSPNNNNNNNMM~M~O~RUXYWTPOPSWYXUROMNRUWYYYZZZYVUSSSdxdxdxcycybzbzdzeygxhwhwiwhxgxfxfxfxgxhwhwhxhxgxexdwdwdwewfxgxhxhxhxixhxhxhxhxixixjykylylylykykwkwjwkwlwlwmxmxnynynynynznznynymymylykykyjxjxjxjxkxkxmymynznzmzmzlzlzkzjyiyiyhyhxixixixiyhygyfydzczbzdzfzezfyhyhyfzfzfzgzhyhxhxgxfyfzfzg{g|e|b|b|f{h{hzezdzdzczczczdze{e{e{ezaz_y_y\z_zdyeyeydzbyayaybycybxbxbyazaz`z`zaza{azaz`y`y`y`z`{`{`zazazazazbzbzczczdycycybyay`z_z_z`z`zaz`zazazbzczbza{`{_z`z_y_x_x^y^z]z^z_z`z`z`z_z_z_z_z`{a{bzczdzdzezfzgzgzfzezezfzhzhyhygyfzdzcycycycydyeyeydyczbzaz`z_z^{]{]{^{_z`zaz_z^z]z]z]z\z]z]z^z^z]z]z^z_z_z`z`z`z`z`z`z`zazazazbzczczdzeyfygygyfzfzfzf{fzezezezezeydydydxdxcxcxcxbybzbzczdyeyfygyhyhyhxgxfwfwfxfyfzfzfyfygzgzfzfzezeyeyeyezf{f{g{g{g{f{f{e{cza{`{a{bzczbzaz`{`|_|^|]|[{[{Z|Z|Z|[|[|]|^|^|]{]z]{]{\{]|^{`{azazazazb{b{b|a|`|`|_|_}`}]}[}[~]}`}a}`}^}\}[|[|\|]|^}_}_}`}`~`~`}`~abbbba~_~^~^}^}^}]}\~\ZXVUTTUUUUUUTTSSSSSTTVUTTUVVVVUUUSSSSSRQPONOMJKKKJIIJLLKJJIIHHIGGGFEDFFGHLKJHFJJIGNJJMNMMLECCDCCCCBBBBBCBA@=;::;><8669:9::::;;998999998766789999::98765555554444332334443332222234678875433343333333334444333333322223345455665443456665321123566654323456666555421013455567865577778899998779;<=>>>>??AA@>:65679;>>?@@?>>><;:;;<<<;;;;::99:::9989::999:::::;<<=>>>>==<;<=>?ABCCCBA@???>>>?@ABBBAA@>=<==<;:97778:<=>>>??@@AABBBBBBBBBBBCCCCBBAABBABCDDEEDDEEFFFFFGJMOPONNMMNOQRSSSSSRSRPNMLKKJLMOQQQQRSUVUSQOOOOOOONN~N~Q~TXYYWTPOQTXZZWSQOPRUWYZZ[[ZZYWUTTdxdxdxdycyczczezfygxhwhxixhxhxgxgxgxhxhxhxixhxgxexdxdwdwewexfxgxgxhwgwhwgwgwhxixixjyjyjyjyjyjxjwjwiwjwkwlxlxlxlymymymylylylylylykykyjyiyixixhxhxixkxlymymzmzmzlzkzjyiyiyhyhygxhxixixiyhygyfzezdzdzbzfzgzezeygzgzdzezezfygyhxgxgxfyezfzg{f{c{a{b{f{g{h{e{dzezdzdzczczezezdzezaz^z^zZz_zeyeyeyczbybybybycxbxbxbyaz`z_z`zazazaz`z`z`z`z`z`z`z`zazazaz`zazazbzcycycybzbz`z_z^z^z_z`z`z`z`zazbzbzaz`z_z^z_z^y_x`x_y^z^z^z_z`z`z`z_z_z_z_z_za{czdzdzezfzfzgzhzgzfzgzhzizhyhygyfzezdycycydyeyfyfyeyczbzazaz`{^{]|]|^{_z`z`z_z_z^z]z\z\z]z]z]z]z]z]z]z]z^z_z_z^z^z^z^z^z_z`z_z`zazczdzeyfygzgzfzfzfzf{f{f{f{f{fzfzeyeyeyexdxdxdxcyczbzczdyexfygzhziyhyhxgxfwfxgygygygygygygzgzfzfzeyeyeyfyfzfzfzfzezezdzczczaz_z`{b{b{bz`z`{_|^|]|\|[|Z|Y|Y|Z|[|\|]|^|^|^|^{]{]|\|]|^{`zazbzazbzb{c{c|b}a|`|_|^}`}]}[|[}]}_}_}^~]~[}Y|Z|[|\|]}^}_}_}_~_~`}`}a~`~`a`~_}^}^~_}^}]}]~\[YWUTSTUVVVVUUTTSSSTTUVTTSTUUUUTTVSRTTSRPONNNMJJKKIHIJKKKJJIHHFHFFEEDDFFFGJJIFDIOECIIILJFIHB@@CABCCCBBBBAA?>;:889:98667889999::999888887666788889998887655555444332123334433222223467888644333333333333334433333332222335655655544445555420013456665322234566666653101345656675457778899:::988:<=>???@AABBA>955679;=>?????>==;:;;;<;;:::::::::::9:;<;:::;:::::;<==>>>>==<<=>??@@AAA@@@@?>==>>?@@@@@?=<;;=@A@?>==<<;:87778;=>>?>??AABCCCCCBBBCCDCCDDDCCBBBCBCDFFFFEDEFHIHHGIKNPPPPNNMNPQSTUUTTTSRQOMLKKLLNPQRRRRSVWVTQPPPQPOONN~P~SVY[ZWTQOPUY[[XUSQPRVXZZZ[[[ZYWVUSexexdxdydydydzfzgyhxixjxjxiyhygygyhxixixixixhxfxexdxdxdwdwexexfxgxgwfwfwfwfxfxgxgxhyhyhyhxhxhxiwiwhwixjxjxkxkxkykykykykyjykykyjyiyiyhygygygyfygyiyjykzkzlzkzkzjzjyiyhyhyhygygyhxixhyhygzgzfzezdzdzczhzhzdzczfzg{b{czezfygxgxfxfyfyezfzg{e{c{a{a{e{g{h{f{e{ezdzczczdzdzdzczcz_z]z]{\z`zdyeydyczbybybycycxcxcxcy`z`z_z`z`zaz`z`z`z`z`z`z`z`zazazazaz`z`zazcycycyczbzbz`z_z^z_z_z_z_z_z`zaza{b{`{^z]z]z^z_y`x`x`y`z^z_z`z`z_z_z_z`z`z_z`zazbzdzdzezfzgzhzhzgzfzgzhziyiyiyhyfzezdzezezezfzfzfzezczbzbzaz`{^{]{\{]{^{_z_z_z_z^z^z]z]z]z^z]z]z]z]z]y]y]y^y]y]y\z\z\z\z]z]z]z^z_z`zazczezfzfzfzezezf{f{g{g{g{gzgzgyfyfyfxexexdxdycyczdyeyfygzhziziziyiyhxgwhxhyhyhyhyhyhyhzhzgzgzfyfyfyfyfzfzfzfzezdzdzczczaz_z_{a{b{a{`{_{^|]|\|Z|Z|Z|Y|Z|[|\|]|^|^|_|_|_{_|^|^|_|^|_{a{bzbzbzb{c|b|b}b}`|_}^}^|\|[|\}\}^}^}]~[~Y}X|Y|Z|[|\}\}]}^}^~_~_}_~_~^~^~^~]}]}\}]~^~^~]\ZYWUSSTUVVWWVVVUUTTUUVVVUTTUUUUUUTWSRUUTQOONNNLJIKJJIJJLLKJIHHHFIGFEDCDFFGGHHGFFHLDBIIHJIBGFA>?BABCEDCCCBA?=<;:87999888789999::::9999998777767788899888765555544433211233443332222346788875433322233333333444333333332233566555554444455531/0136776542112445566667641012578765655577889:;;;;;::;=>?@@@@AABBA>:66789;==>???>>=<;;;;<;;;:::::::::::::;<<;;;;;;;;;;<===>>>=<<<==>>>??@@@@@?>><<<==>???>=<;:;<>@@?>==<<;:97789<>>?????ABCCDDDDCCCDDEDDEEEDDCCCCDDEGHHGEDEHJKKJIJLNQRRQONNOQSUVVVVVVUUSQ~OMKKLNPRSSSSTUXXWURQQQRRPONN~P~TX[\[XUQOPUZ\[ZVTRRSVXZ[[\\\[ZXVTQexexexexeyeyeygygxhxixjxjyiyhygyhyiyixixixhxgxfxexdxdxdxdxeyeyfyfyfxfwfwexexexfxfxfyfyfxgxgxgxgxhxhxhxhyiyiyiyjyiyiyiyiyiyiyhyhyhygyfyfyfyfyfyeyhyjzkzjzizizizhzgzgyfygygyfyfygyhyhygzgzfzezdzezfzdzhzhzczbze{f{b{c{dzeyfxfxfyezezezfzf{d{b{a{b{e{f{g{e{d{ezdzcydydzdzdzcza{^{]{\{^{azbzdzdzczcycybycycydxdydzaz_z^z`zazbzazazazazaz`zazazayayayay`y`yaycycycyczbzbz`z_z_z_z_z_z_z_zazbzb{b{_{^z]y]y_y`yayay`y`z`z`z`z`z`z`z`zazaz`z`zazbzczdzezfzgzhzhzgzgzgzhzizizizhzfzezdzdzdzezfzfzfzdzczbzbzazaz_{]{\{\{]{^z_z_z_z_z_z^z]z^z_z_z^z^z^y^y^y^x]x]x]y\y[z[z\z\z\z\z\z]z^z`zbzdzdzezezezeze{f{h{i{i{hzhzhzgygygxfwewexdxcydyeyfygyhzizjzjzjzjziyhxhxhyhzhzizizizi{i{h{h{gzgzfzfzfzfzfzfze{d{d{dzczaz_z_{a{a{`|^|]|\|[|Z|Y|Y|Z|Z|[|\|]|]|^|_|_|_|`|`|`|`|`|`|`|b{b{b{b{b{b|b|b|b|a|_}_}^|\|[}\~]~^~^~\~Z~Y~X}X|Z|[|[}[}\}]}^~^~^}^~]~]~\~\}[~Z~Z~[~\~\ZYXVTSRSTVVWXXXWWVVUVVWWWXVVVUVVVVVUWSRUUTQOOONMMKKLLKKKLMMKJIHHGFJHGFDDEGGFGHHHHIJIDCKKJIHAGD@=>BABCFFEDDCA@<:::77999999889::::999999:;:9987666777898887655555544433211233444332222346888865433322233333333444433333321134676554444444444420/025676543101244555667765200269987666678899:;<<===<<==>@@@@AAABCA=;77789:<<>>>=>=<;;;;;;;;;;;:::::9:::::;<<<<<;;;;;;;<===>>=<;<====>>>>?????>>=<<<<====>==<;;<=>??>>==<<;:8778:<>>@@@?@ACCDEEEEDDDEFFFFFFFEEDDDDEEGIIIHFEFILMMKJKMOQSSRPONORTVWXXXXWWVT~S~P~MKKMNQSTSSSUWYZXVSRSSTSQO~M~N~Q~UZ\]\YUQPPTY\\[XURRSUXZ[[\]]\ZYVTRexexexfxfygygyhyhxhxixjxjyiyhyhyhyiyjyjxhxgxfxfxexexexexeyfyfyfyfyexewexexexexdxdydxdxdxexfxfxfxfxeyfyfygygygygygygygyfyfyfyfyfyfyeyeyeyeyeyeyeyhzjzizhzgzgzgzfzezdzezezezezezfzgzfzfzezezdzdzezfzezizfzbzaze{f{b{c{dzeyfyfxfxeyezdzeze{c{b{b{c{e{f{f{e{d{ezdzcydydzdzdzbz`{]{]{]|^{a{czezezdzczczcycydydxeyezbz^z^z`zbybybybzazazazazayaybybybyay`yayaycycycyczbzbz`z`z`z`z`z`z`zazczdzc{b{_{]{\z^zazazbybybzbzbzbzczbzbzbzbzbzbzazazazbzczdzdzezgzhzhzgzfzgzgzhzhzizhzfzezdzdzdzezfzfzfzdzbzazazay`z^z]{]{\{]{^z_z_z_y_z_z^z^z^z_z_z_z_z_y_y`y_x_x^x^x\y\z\z\z\z\z\z\z]z]z^zazbzczdzdzdzdzd{f{g{h{i{izizhzhygygxfxexexdxdydyeyfygzhzjzk{k{k{jzjziyixiyizhzizizizi{i{i{i{izhzgzgzhzgzg{g{f|e{d{dzdzaz_{^{_|_|^|\}Z}Y}X}X|X|X|Y{Z{\{\{]{^|_|`|`|`|a|a}a}a}a}a|a{c{c{c{c{c{c{c{c|b|a|`}_}^|\}\~]^~^~^~\~Z~Y~Y}Z|[|\|\}\}\}]}^}^~^~^~]~]~\~Z}Y~Y~X~YZ~YXWVTSRRTUWYZZZYYXYXXXXYYYYXXXWWVVVVVYSQVUTRPPPOONMMMMMLLMNMMKIHHGEKIHGEEFGGHHHHIILMJ@ENLLJIBHE?=>BBCDFGFEDDCA<9997699::::99::::999999::;;::9876656778877655444554443311123344433333334688886433332223333333455543333332123467654444444443331//036776532//0244555567875200269:98667789:::;<=>???>=>>?@AA@AAABBA>;888999;;<=<<<<;;;:;;;;:;<;;;:::;;;::;<<==<<<<<<<<<<=>>>>==<=>>>>===>>?>>>>==<<;<<=<<=<<;;;<==>?>>==<<;:8678:=>?@AA@AADDEFFFFFFFFGGGGGGFFFFEEEEEHJKJIGFGKNNNLKMMORTTSQPOPSUWYZZZYYXWU~T}R}OLLMORTUTTTVXZ[YVSSSTUTQO~N}O}R~W~[]^]YVRPQUZ\]\YV~SSTUXZ[[\]]\ZXUSQeyexfxgxhyhyiyiyixhxixkxjyhyhzhzizjyjyixhxgxfxfxfxfxfxfyfyfyfyfyeydxdwdxdxdxdxcxbxbwcxdxdxexexexeyeyeyfyfyeyeyeyeyeyeyeydydydydydydydycycydydyfzfzizfzezfzezezdzdzczczdzdzdzdzezfzezezezdzdzdzezgzfyhzfzazb{f{g{c{d{dzeyeygyfxfyezezeze{b{b{b{d{e{e{e{e{dzezdzdydyfzfzfzezb{_{\|]|^|a{d{e{e{dzczczczdyexdxeyfzcz_z_zaybycycxcybzbzbzbzbyayaybybyby`yaybycycyczczbzbz`z`z`zaz`z`zbzczdzezc{a{_{]{^z`zczczczdzczczczczdzczczdzdzdzczbzbzbzbzczczczezfzgzgzfzezfzgzhzhzhzgzfzdzdzdzdzdzezezezczaz`zaz`y`z^z]{]{]z]z^z_z_z_y_y_y^z]z^z^z_z`z`z`y`y`yax`x`x_x]y]z^z^z]z]z]z\z]z]z^z`zbzb{b{b{b{b{c{e{g{g{h{hzhzhzgygygyfxexexexeyeyeyeyfzhzizk{k{k{k{kzjyjyiyizizizizizj{j{j{j{jzjzizizhyhzhzg|f|e{dzdzdza{_{^|^|^|\}Z}Y~W~V~W}X|X|Y|Z{[{\{]|^|_}`}a}a}a|`}a}b}c|c|a{c{d|d|d|d{d{d{c{c|b|a}`}_|]}^~_~__~]~[~Y~Y}Z|[|\|]|]}]}]}]}^}]}]~]~^~]~\~Z~X~W~WXXW~VVUSRRSTVXYZ[~[ZZYYZZZZ[ZZZZZZYXXXXXWZTRWTSRQQQPPOONNNMMMNNNMKIHGGELIHHFFFHHJIHGHIMOL@GPNLKJDIF@>?CCCDFGFEDCCB>877779:;;;:9:;;::998899::::;:987655667776654444544444331112334443333344568887543333322333333345554333333222346765444444443322100146776531..0244555567876300269::975789::;;<=>?A@@@?>>?@@@@@@AABA>;888889::;;;;<;;;::;;;;;;<<<<;;:;;;;;<==>===<<======>????>==>>??>===>>>>>>====<<<<===<<<;;<<===>>>===<<:8778;>@@BBBABCEFFGGGGGGGHHHHHHHGGGGFFFFFIKLLKHHHLPPONLNNPSUUURQPQTWXZ[[[[ZZYW~U}R}PMLNPRTUUTTVY[\ZVSTUVVTRO~N}P}S~X~\^^^ZVRPQUZ]^][X~US~S~U~X~Z[[\]]\ZXURQfxfxgyhyixjxjyjxjxixjykyizgzhzizizkzkyixgxfxgxgxgxgxgygygygyfyeyeycxcxcxcxcxcxbwawbxcxcxdxexexeyeyeyeyfyeyeyeyeydydydydycycydydydycycybybycycyezezgzczczdzdzczczczbzbzbzbzbzbzdzezdzdzdzdzdzezfzfzgyhzezazb{f{g{d{d{ezfzfygygyfyezezdzc{b{b{c{d{e{f{f{fzezezdydyeyfzfzfze{b{_|]|^|_{b{d{f{ezdzdzczdzeyfyexeygzdz`zazazbycxcxcyczczbzbybybyaybybyby`yaybycycydzczbzbzazazazbzazbzczezfzezc{a{_{^z`zazdydyeyeyezezezezezeyeyezezfzezdzczbzbzczczbzdzezfzfzezezezfzgzgzgzfzezczbzazbzczdzdzczaz`z`z`z`y_z^z^{]{]{^z^z_z_z_y_y^y]z]z]z^z_z`zazayaybxbxbwaw`x_y_y`z`z_z_y^y^z]z^z_z`{`{a{a{`{`{a{c{e{f{g{gzgzgzgygygygyfyfxfxexeyeyeyeyfzgzi{j|l|l|l{l{kzkyjzjzizizjzkzk{k{k{k{kzkzkzjziyiyizh{g{e{d{dzc{a{_{]{\|[}Z}Y~W~V~V~V}V}W|X{Y{Z{[{]|_}`}`}`}`}`}`}`|c|e|c|b|d|e|e|e|e|d|d|d{c{c|b~a}_|^}_}`~`~_~]~[}Z}Y}[|\|]|]|]}]}]}^}^}]}]}^~^~]~\ZX~W~WXXW~VUUSSSSTUWY[[~[[ZZZ[\\\\[[[[\\[ZYYYYXZUSWUTSSSRRQQPPOONNNNNNMKIHHGDKIHHGFGIHJKHFGIMQMAIQPMJIFJGA?@CDDDEFEDCBBB?95678::;;;:9:::::988788::::::986544566665554444444444331122334444333455667786543333333333333345664433333322346754433443433221101257776520--024445555677630/169::975799;<<<<<=?BAAA@??>?@@@@@AABA><99988889:::;;:::::;;<<;<<=<<<<<<==<<<=>>>====>>>>>>?@@@@?>>>????>>=>??>>====>=====>>>>=<<=>>>=========;9778?BCDCCDDCAABA?95568:;<;;:999::998777888999987543246665444433334444432122334444444456677777654333333344444445666443333433344675433233443221111235776541/-.1344444445687410169;;97679;<===;;=?BBBBA@?>?@???>?@AA>=:::98899::::::::::;;<<<<====<<<<==<<=>????>>>>>???@@AAAA@?>??@@@?>>????>==>>?>>>>?????>>=>????>>===>>><:878<@CDFFFEEHIJJJJJIIIIJJKKLKKJIIIIIHHHKMNMMKKLORRRQOOOQUXXWUSRSVY[\]]]]]\~[}Y}W|U}R~PNORUWXWUUWZ\][XUUWXWVS~Q~P}R}U~Z^``_\WROQU[_`_\Z~V~T}S~TWYZZZ[\[YVSQPgxgyhyiyjxjxkxkxkxlylykzizhzhzjzkzkzjyiyhxgxgxhxgxhxhyhyhyhyfyeydydxdxcxcxbx`w`wawbxbxcxdxeyfyfyfyfyeyexdxdxcxcxdxdxdydycycyeyeyeydycybybybycydzdzdzczczbzbzbzbzaz`z_z^z_z`zazczczczczczezdzf{fzfzgzgzc{b{c{f{g{f{f{g{gzgzgzezdzdzcza{a{azbzczc{c{dzezezezdzdzeze{fzf{f{d{b{`{^{^{`{c{e{fzezezezeyeyfyfyfzfzhze{`{`zazcycxdxeyeydycycycydydydydycxaxaxbycycydzdzczczbzbzczczdzezfzfzezc{a{`z`zbzdyeygyfygyhyhyhyiyhyiyiyixhyhyhygyfzezezdzezezczbzdzezdzczczbzczczdzd{c{b{a{`{`z`zazbzaz`z_y_z_y`z`z`z`z_z_z^z]z^z_z_y_y_z]{[{Z{[{]z_z`z`z`ybydxexdwcwbwbwcxdydydydydybza{`{`{a{a{`z_z_z_z`zazczd{d{d{ezezdydyeyfygygxgxgxgygxgxgyhzizj{k{m|m|m|m|m|l{l{k{j|i|j|k|l|l|l|j|j{k{k{kzjzhzi{h{g|e|b|a|_{]{[{Z{Y{Y|X}Y}Z}Z}Y|X|W|W{W{X{YzZ{\|]}_}_}_~`~b~b~a}b}e}e|c}d~e~f~e}d|c}c}d}d}d}c}b}`|_}a}b~a~_~]}[}Y}Z|\{^|_|]|[}Z~[~\~\\]~]~]~\~[~Z~Y~XWWWWVVVTTSSTUVXZZZYXXXXYZZZZZ[[]\[ZYVVWWVUUUTTTTSSRRRQPONLKKJLJJJGFDCDIGGGFFFHIKKHDFGLOKDKNJKHFDED?=>ABBBBBCB@??><85568:;<;;:99999987666666666676542248764343332223444432233444444444566777766554333333344444456666543334434455675433343444221222235676530.-/1344333345688620169;;:867:<=>>=<:<>BCCBA@?>>>>>>=>?@@>=:::9999::;;;:::::;;;;<<=>>>>=======<>>?@A@@?>>??@@@ABBBBA@?@@AAAA@@@@@??>>??@????@AAAA@??@@@@@??>?????>;878>CEEGGFFGJKLLLKJJJJJJKKLMMLKKJJJIHHILNONMLMNQSSSRPOPRUY[ZXUTTWZ\]^^^^^^]~Z}Y|W}T~QPQTWXXWUUWZ]^\YVVXXXWT~R}Q}S}V[_``_\VROPS[`a`^[~W~T~S~TVXZYZZZZWURPOgxgyiziyjykxkxkylylymykzizgzhzjzkzlzjyhygxgxgxhxhxhxhyhyhygyfydydyeydydybybx`x`xaxbxbxcydyeyfyfyfyeyexdxdxcxcxcxcxcxcycydydyeyfyeyeydybybybycydzdzcybybyaycycybyby`z^z^z_z`zazczdzdzdzdzdzezezfzgzgzg{a{c{e{e{f{g{gzgzgzfzfzdzczbzbzaz`zazazbzbzczczdzdzdzczd{e{e{eze{e{d{b{_{]{_{`{d{e{ezezdzezeyfyfyfzezf{g{e{_z_zazcydxexdydydycycycydyeyeyeycxcxbxcxcycycycycybybycycydyeyfzgzfzd{b{a{azbzdzezgzhzgzhziziyiyjyjyjykyjyiyiyiyhzgzfzezdzfzfzdzbzczdzczbzbzbzbzc{b{b{a|a{a{azayayazazaz`z_y^y_y_y`y`z`z_z_z_z^z^z^y_y_z^z\{Z{Y{Yz]z_z_z_zaycydxexdwcwcwcxeygygygyfyezc{b{a{a{a{azaz`z_z_z`zazbzczc{czczdzdydyeyfygxgxgxhxhxhxhxhxiyjzk{l{l{m|m|n|m|l|l|k|j|i|i|j|l|l|k{j{h{j{k{jzizh{h{g|e|c|`|_|]|\{[{Z{Z|Y|Y}[}\|[|Z|Y{X{X{XzWzYzZ{[|]}^}^}_}`~b~b}`}b}c}c|d}d~e~e}d}c}c}c|d}d|c}c}a}_}^}a}a~`~_}]}Z}Y}Y}[|]|^}\}Z~Y~Y~[~[[\\\\[~ZXWWWWWUX~XWUSRSTUWXXXWVVVWXXXXXXYZ[[ZYWUUVVUVVTSTTSRSRRQQPMMKJJIIIIHEEDBDHFFFEEFHHJIGECFJKHELLGHGECCB><=@AA@?@A@>=<<;75568::<<;;:988776555555444456553114886433333223333333334444334444456777666655444333323433356766654334333456666543333444321112234566542/--/1343333345689731159;<;978:<=??><:;=ACBA@?>=<<<<==>???>=;::::::;;<<<;;;;;;;;<===>????????>>>??@ABBA@>>?@AAABCDDCBAAABBBBBAAAAAA@@@@AAA@@@ABCCCBAAAABBAA@@@AA@@><98:?EGGHHGHIKMMNMLKKKKKKKLMNNMMLKKKJHIIMOONNMNORTTTSQPQSVZ][YUTUWZ]_______^]~Z}X~T~RPRTXZZXVVWZ^_]ZWWXY~XW~U~S}S|U}W~\^a`_\VQNPSZ`ba_[W~T~SSVWXYYXYXVURPNgyhyiyjykylylykylymymykzizgzhzkzmzlzjyhygygygyhxixixixiyhygyfyeydyeyeyeycyax`xaxaxbxbycydyeyfyfyfyexdxdxcxcxcxcxdxcycycydyeyfyfyeyeydybybybyczdzdzcycybyaycycybyay`z_z_z`zaybzdzdzezezezdzezezfzfzfze{`{d{e{f{f{gzgzgzgzezdzczbzaz`z`y_z`z`zazazbzbzbzczczdydzdzezezezdzb{`{^{]{_{azczdzdzdzdzezeyeyezezezfzg{e{`z_z`zdyexdwdxdxdycycycyexexfxexcwcwbwbwcxbxbxbxbxbxaxbxdxexfygzgzezc{b{b{bzdzezfzgzhzizjzjzkzkylylylylykyjyjyjyizhzhzgzfzfzfzezdzczczczczczczczbzb{a{`|_{`{azbybyazaz`z_z^y^y_y`yayayaz`z_z_z^z^z^y_y^z]z]{Z{W{Xz]z`z^z_zaydyfxfxexdwdwdxfygyhygyfzfze{d{d{c{c{bzazaz`z`y`y`yazbzbzbzbzdzdzdzezfyfxfxgxhxixixixiyizj{k{l{l{l{l|l|m|l|l|k|j|h|h|h|k|k|j{h{g{h|j|i{h{h|f|e}c}`}^|\|\|\{[{Z{Z|Z|[|\|]|]{\{Z{X{XzXzXzYzZ{[|\}]}]}^~_}`}`}_}`}a|b|c}d}d}d}c}b}b|c|d|d{c{b|a}_}]}`}`}_}]}\}Z~X~Y~Z}]}^}\~YWXYZ[[\\[ZYXWWWWWT~W~XWUSRSTUVWVVUTTSTTUVUUUVWXXWVUSRSTTVUTSRRQQPPPPONLJHGGGFFFGCFDAEFDEFEDEGHIIFCDEFFDEHGDDCA@BA<9:=?>>>=>><99997655688:;;:9887665444433333345554214996323333223333333334444333444456777666666554333333433357775554333443456676543333444332111234566542/-.01344444445689842258;<;:88:;<>?>=;;<@BB@?=<<:;;;<<=>>>>=<<;;;;<<===<<<<<<<<<=>>?@@@@@@@@@???@ABCDCCA@?@@ABBCDEEEDCBBCCCCCCBBCBBAAABBCBBBBBCDDDCBBCCCCCBBAABBAA?=:8;@FHHIHHIKMNOONNLKKLLKKLMOOONMLLLKHHIMOPOOOOPRTUTTS~RRSWZ]\[WVVY\_aa`````_^~\~Y~V~SRSVZ[[YVUWZ^`^[XXYY~XW~U~S}S}W}Y~\_``_\VRONRZ`ba_\XU~SSUWXXXWWVUTRPOfygyhyiykylylylylymylzkzhzgzhzjzlzkziyhygygyhyjyjyjxjxixhxfyfyeyeyfyfyfydyax`xbxbxbxbycydyeyfyfyeyexdxcxcxcxcxdxdxdydydydyexexfxexdxcxcybycycydzdzdycybybydydycybxay`z`zaybyczezezezezezdzdzezeyeygzdz_zc{e{f{f{fzgzgzezczbzaz`z`y_y_y^z_z`z`zazazazbzbzczcydzdzdzdzdzczaz`{^{^{`{azczczczdzdyeyezdzezdzdzezfzdz`z_zaydyeydxcxcycycycycyexexfxfxexdxbxbxbxbxbxaxawawawbwcxexgyhyfzd{c{b{b{czezfzg{g{i{j{k{l{mznznznznzmzlzkyjyjyjyizizhygzgyfyfyeydydycycycydydyczc{a{`|`{a{bzbybyaz`z_z_z_z_y`zazbybybyaz`z_z_y^z^y_y^z]z\{Z{V{Wz^zaz^z^zaydyfxgxfxexdxexgyhyiyhygzgzf{f{f{f{e{d{czbyay`y`y`y`zazazazbzdzdzezfzfzfyfygyhyhyjyjyjzj{k{k{k{j{j{i|j|k|k|k|j|h|f|f|f|i|j{h{f{f|g|g|g{f|d}b}a}_}^}\|\|\{\{[{[|[|[|\|^|_{^{\{ZzYzYzYzYzYzZ{Z|[}\}]}^}_|_|^|^|^|`{b{c|d|c|c|b|b|b|c|d|c|c|b|`}^}\~_~`~^}]}[}YXX~Z~]}^}\~XVVXYZ[\\[YYXWWVUUS~WXWUSRRSTUUTTSSSRRRRSRRSTUVUTSSRRPQQTTSQPONNMMLLMLJHEDEEEEEFBEC@CDCEEDCDFHIGDCCCCCBCDCAA@>>@?:99<=<<;:;=;6668765447788888876654333323322334554214::73333333333344333234333334444567776666666553333334333578875543334434566655433333443222222345654320./1234444445568:963357:<;;:9::;<>>=<;;>@@?=;;:9:::;<===>>=>>=<<<<=>>==========>??@AAAAAAAAA@@@ABCDEEECBA@ABCDEFFFFEDDDDEDDDDCCDCCBBBCDDCCCCCDEDDDCCDDEEEDCBBBCCA?=:9;AFHIIIIJLNOPPONLKLMMLKLNPQPONMMNKHHINPQPPPPQSUV~U~U~U}T~STWZ]]\YXXZ]abbbaaaa`_]ZXURSVZ\\ZWVWZ^`_\YYYZ~YW~V~T~T}W~Z]_``_\WSPORY`ba`]YUS~SUVWXWWVUTRPONeyeyfyhyjykylylzkzkzkzjzhzfzg{j{kzjzizgygyhyiykykykyjxixgxfyezezfzfzfyfydybxbxcxcxbybycyeyfyfxexexexdxdxcxcxcxdxdxdxdxdxdxdxexexexdxcxcxcycydyeyezdycycycydxdxdxcxbyaybycydyezfzfzezezezdzdzezeyfyfzbz_zdzezfzfzfzfzfzczbzazaz`y`y_y_y_z_z`z`zazazbzbzbzczdydzdzdzdzczbzaz_{^{^{_{`zbzbzczczdzdzezdzc{c{bzdzdzbz_z_zbydydydxcycybzbycycxexexfwfxexdxbxbxbxbxbxaw`w`w`w`wcxexgyhyfzdzb{c{c{d{e{f{g{h{j{k{m|n|n{o{o{o{o{n{mzlzkyjyjyjzjzizhzhzhygyfyeydycycydydzdzdzc{a{`|b|c{czcybyaz`z`z_z_z`yazbzczczczb{a{`{_z_z_y_y]z\z[{Y{U{Xz^z`z^z^z`ydyfxfxexexdxexgyiyiyizhzgzf{g{g{g{f{ezdycybyayay`y`z`zazc{dzezezezfzfzfzezfzgzhziyjyjzj{j|i|i|h{g{g{g|g|g|g|f|d|c|c|d|f{g{e{c{c|c|d|c{b|a|_}^}]}\|\|]{]{\{\{\|\|]|^|_{`{_{]z[zZzYzYzZzZzZ{[|[|\|]|^|^|^|]{]{]{_{a{b|b|b|b|a|a|`|a|a|a|a|`}^}\}[~^~^~]}\}Z}X~W~X~Z~\~]}[~XVVXYZZ[ZYXYYXWVTU~S~VWWUSQRTUUUTTTTSRQQQRQQRSTSRPPQQPNOPRQPNLKJJIIIIJJGFDDDEEEFF@CB@CDCDEDCCFGGFDCBB@@?@AA@?>=<>=9879<:9979:94447755446665666655543333212222235654215;:74333333333444333233332334444468865555665554333334333578875543343345566665543333332222333456765310//13455555555689:754579:<;:9:::;<==;::;>>=;99999:;<=>===>>????>===>>>>==>>>>>>?@AABCBBBBBBBAAABDEFFFFECBAACDFGHHHGFEEEFFFEEDDDDDDCCCCDDDDDEEEFEEEEDEEFGGFECCCDDC@=;:=>???=<;<<<9878:98768874346755445444455544443233111122235564216<:64433333334554432233332344543457765555565554433344333567875543333344555666554334332223444567875310012456676655568998655679;;;:99::;<<;:9:;<:978999:;<=>>>>?@@@@@?>==>>>>>>>>>>>?@BCCDDCCCCCCCBBBCEGGGGGFECBBCEGHIIIHGFFFGGGFFEEDDEEDDDDDEEEEFGGGGGGFEFFGHHHGEEEEFDA><;>DIJJJKKMORSSSQNLKMOONKKOSTTRPOOPMHHLPRRRQR~R~S~U~W~X~Y~Y}Y}X~WWY]^_^[YY[`cdddcbbbb`_~\~Z~V~T~U~X~]_^\XWX[^_^][[[[~Z~X~W~U~U~W~Z~]__`_]XTQQRX^aa`]ZVS~RRTVVTTSRQPOMKcycydzfzhzjzjzizhzgzgzfzfzfzgzizjzjyhygygyhzizjzkzjyiyhxfxeyeyezezfyfyexexewexexcyaybydygygxhxgxgxfwfwewewdwdwdwewdwdxdxdwdwewexexewdwdxexeyeyfyeyeydydydxexexexdxdycydyeyfygzgzfzfzfzfzgzgzfyfyfybzazczezdzezezdzdzczaz`z`zaybyay`y`yazazbzbzczczczczdzdydzezdzdzdzczbz`z`{_{_{`{`z`z`zazbzczczczbz`z`zazazazazazazdydycyczbzazazbycxdwdwewfxexdxdxcybydxdxdwcwawaw`wawbxdxfyeydybzazezf{e{e{f{h{i{k|n|o}p}p|p|q|q|q{o{m{lzkzkzkzkzj{jzjzjzjziyiyhyfyeydzezfzfzfzc{a{a|d{gygyfycybyay`y`zazbzczdzdzdzdzczbzbzazazaz`z^z\{[{Y{Wz[z_z`z^z^z`ycydxdxdycydyfyhzjzk{k{j{izi{i{i{i{h{hzfzeydxcxcybybzbzdzezezfzfzfzfzezd{d{d{e{f{gzgzg{g|g|f|e|d|c|c|b{b{b{a{`|_|]|]{]{_{_{^{]{]{^|^|^|]|]|\|\{\{\{]{^{_{`{`{`{`|`{b{c{b{a{_{^{]{[z[z]y]z]{]{\|\|\{\{\{[{Y{Z|[|\|^|_|`}`}`}`|_|_}^}^}]}^}]}[|Y}Y}[~[~Z}Z}Y}X~W~XZ[~Z~Z~XWV~V~VWXXXXWXXXWVTUVUVXWVUUWXXWWVVVUUTSSRRSSSROLKOQNLLMNNNLJHFGFFFFFFFFEEDEEEEEG?BC@CDBCDCBBCDCCBCBA?=<=>>><;::;;8766887767874236755444322333334433222101222224453127;964333333345554432233333345654457654555555554433333224567865543334444556666655444443234445678875310134577888766678998765579;<;:99:::;<:988998767889:;<>????@ABBAA@?>>???>>>>>>>?@ACDEFEDDDDDDDDCCDFGHHHHGFECCDFGIJJJIIHHHHHHGGFEEEFFFFEEEEEFGHIIIIHHGGGHIJJJIGGFGHFC?==@FKKKKKLNPSTUTROLJMOPOLLPTUVT~RPOOLIJMQRSSRS~T}U}V~X~Z~Z}[}Z}Z~YYZ^_`_[ZY\acefedcbbba`]~[~W~U~W~Z~^_^\YWY[___^\\\\~[~Y~W}U}V~X~Z~\____]YURPRW]aa`]ZVSRQSTTSQPPOOMLJcyczdzfzhzizizgzfzezezezfzgzgzizjziygygygygzhzizjziyhygxexdydydyeyeyfxfxfwgwgxfxey`ybyeyhxhxhxgxgwgwgwfwewewewewewewewdwdwewewexexewewfxfyfyfyfyfyexexdxdwewexexexdydyeyfygyhzgzfzfzfzgzhzgzfzeyeybyazczfzdzdzdzczczbzaz`zazbybybyayaybzbzczczczczczdzdzdyezezezezdzdzbzaz`{`{`{`z`z`z`zazbzczczbzbz`z`zazazazbzbzbzdzdzczbyazazazbycxdwdwewexexdxdxcybydydxexdxbxbxaxaxcxcxdydycyaz`zgzf{f{f{h{i{k{m{n|o|p|p|q|r|r|p|n|m{k{kzkzlzkzkzk{k{kzkzjziyiyhyfyezfzgzhzfzd{b{b|e{iyiygydybyayayazbzdzezezezdzc{czbzbzbzbzbzaz_{\{\{Z{Xz]zaz`z^z_zbydydydycycyeygzi{k{l{l{k{j{i{j{j{j{i{hzgzfyexdxdycyczdzezezezezfzfzezd{c{b{c{d{dzdzezd{d{c|c|c{b{a|a|`{`{`{_{^{\{[{[{\{\{\{\{\{\|\|\|[|\}]|]{\{]{]{^{_{`{`{`{a|a|b|c{d{d{c|a{`{^{[z\z_y`z_{^{]{]{]z\z\{[{Y|Z|[}\}]}^}_}_}_}_}^|]}\~[~[~\}\}Z}Y}Y~Z~Y~Y}Y}X}W~WXYZ~Z~Y~X~W~V~V~VVWWVVWXXWVUSUVVWZYXXXXYYXXWWWWVUTTTTUUTQOILNNMKKKLMMJHGFFGGFFFFFFEEDEEEEEF?BC@DDBBCBBAAAAAACB@?=<<>>?<;:9::7655776656674236655444322233444433221012322234553137;954333334455665432234434456654456645555555544432233334568766554444544566777765555543334556788986421246788888777789998765678:;;;:99:::;:99988766789:;<>?@@@@ABCCBBA@??@@@???????@ACDFGGGFEEEEEEEDDEGHIIHHHGFDDDFHJKLKKJIIIJJIIHGFFFGGGGGFFFFGHIJKKJJIHHIIJKLLKJHHHIHEA?>AFLLLLLMOQTTUUSOMKNQQPMKOTVVU~SQPOKJLOSTTTST~U~V}W~Y[~\~\}\}\~[[\__`_\ZY]adfgfedcbbba^\~X~W~Y}\~_`_]YXY\_``_^]]]~\~Z~X~V}V}W~Z\^_`_]ZVSQQV[_`_\YUSQPQRRQONNNMLJIcyczdzezgzgzgzfzezezdzezezfzgzhzizhygyfyfygzhzizizhzgyeycyczczdzezfygxgxgwgwgxfxcy`zcygyixixhxhwhwhwhwgwfwfwfwgwfwfwfwfwewfwfxfxfwfwfxgxgygygygyfyfyfxexdwdwexexexeyeyfyfyhyhyhyfyfygygyhzgzfzeycyaybyeyfzdycybybzazazaz`zbzcycycybybybzczdzezezdzdzdzdzeyezfzfzezezdzczb{a{a{azazazazazbzbzczczczbzazazazazbzbzczczdzczbzbyaz`zazbycxdxdxdwdxdycycyay`ybydyexdxbxax`x`xaxbxcycybyazazfzf{f{f{i{j{l{n{o{o{p{q|q|r|r|p|n|l|l{l{mzlzlzl{l{l{l{lzkzkyjzizgzfzfzhzizgzd{b{c|g{jyjyhydzczbybyczczezfzf{e{d{c{c{bzazczdzdzbz_{\{]{[{Yz_zbz`z^zazczdzdzdzcycyezgzi{k{m{l{k{k{j{j{j{j{i{hzhygyfxeyeyeyezfzfzfzezeze{d{d|c|b{a{b{b{bzbzbzb{a{a{a{a{`{`{_|^{^{^{]{\{Z{Y{Z{[{[{\z\{\{\|[|[|[}\}]|]|]{\{]z^{^{`{`{a{b|c|d|e|f{e|d|b|b|_{]z^zayazaz`{_{^{^z]z\{[|Z|[}[}\}]}^}^}^}^}^}^}]}[~Z}Z}[}[}Y}W~WX~X~X}X}W~WWXXY~Y~X~W~W~V~V~VVVVUUVWWVVUSTVUWYYYZZZZZYYXYYXWVUUUUUUTPNKLNMLJJJKKKIGFGGHHHHHHGFEEEFEEDDE@BCADDBBAAA@????@BA@?====>><<:9:97654665544574236654333332223455443210023422345543248:964333334556666543223434566764356544556555544433333344567776555555555566777776656544445566789986432357899998777789:99876668::;;;:9999::::98766689:;<=?@AAAABCDDCCBA@@@AA@@?@@@@ABDEFGHHGFEEFFFFEEFHIJIIIIHGFEEFIKMMMLKJIIIJJJIHFFGHIIIHGGFFGHIKLLKJIIIIJKLMMMKJJJJIGC@?AGLMMMMNPRTUVVSPMLNRRRNJOUXXV~TRPOLLNPTUVUUVW~X~YZ[\~]~^}^~]]]^_`_\ZY\adghhfdccbcb_]Z~X~Z}]~`a~_~\~Y~X~Y~\_aa`_^^_^\ZW~V~W~Y[]___^ZWTRRTY]_^\YURPOOPQPMMLKKJHGczczdzezezfzezezdzdzdzdzezezfzgzgygyfyfyfygzhzhzhzgzfydzczczczdzezfyfxgxfwfxfxeybzazdzhyixixiwhwhwhwhwhwgwgwgwgwgwgwfwfwfwfwfwfxgwgxgxhyhygygygygygxfxewexdxdxeyfyeyeyfygyhyiyhyhygygygyhygyfzdycybydyeyeydybybzazaz`z`zazazbybycybybyczczfzgzgzfzdydyeyexfyfzfyfyfzezezdzd{czbzbzazazbzbzczczdzczczbzazazazbzbzczczdzczbzbzazazaybydxdxdxdwcxcycyay`y^yaybydxcxax`x_x_x`xaybybybzaz`zdzf{fzfzh{k{l{n{o{o{p{q|q|q|q|n|l|j|j{o{q{o{m{m|m{m{m{m{lzkzjzj{hzgzgzhzizg{dzc{e{h{j{jzhzezdycybyczdzf{g{g{fzezczbzbybydyfyfzcz^{\{^{\{[z`zbz`z_zazczezezdzczczezgzi{k{l{l{k|j|k{j{j{i{i{hzhygyfyfyfyfyfzfzfzfzezdzd{d{c|b|a|a{aza{a{`{`{`{`{`{`{`{_{_{_|_|^{^{]{]{[{Z{Z{Z{[z\z\z\{\{\{\|\|\|]|]{]{\z]z^{^{`{`{a{b|c|e|f|f|e|e|c|c|`{^{`{bzczczb{a{_{_{^z\{[|[|\}]}^}^}^~^}^}^|^|^|]|[}Z}Z}Z}Y~X~WV~W~W~W~V~V~VWWWX~X~XWWWWVVVVVUUVVVUTSSUUWXYZZZZ[ZZYYZZYXWVVVVVUSPNKMNMKJIIJJJHGFGGHIIIIHGFFEEFEDDDC?ABBCCBA@@??>>>?@A@@?=<<====<;:987765555544464225654333333223355543210124433456542258:86433333346677654322233456777424554455555544444444444567787766666666666777777666654445566779::9754346899988876678999987656789;<;::8889:::9976679:<==>@BBBBCCDEEDCBA@@AAAAA@AABBBCDEFGHHGFEEFGGGFFGIJJJJJJIHGFDFILNOONMKJIIJKKJHGGHIJJJJIIGGGHJLMMLKJIIIJKLMNNLKKKKJGC@@BGMNMMNOQTVWXXUQNLNRSSNJMU[ZW~USRPNNPQTVWVVWX~Y~Z[\]~^~^}_~_____`_\ZY\bdghhgedcbbba^\~Z}[}]}`~`~_~\~X~X~Y~\~`bca````_]ZWVW~X[^^_^]ZWTRTUZ^[ZYUTROMNNONMKKJIHGGczdzdzdzdzdzdzdzdzdzdzdzdzdzezezezezeyeyfzgzgzhzgzfzdyczczczdzezfzfyfxfxfxexeydzbzbzfziyjxjxixiwiwiwiwiwhwhwiwiwiwhwhwgwgwgwgwgxgxhxhyiyiyhyhyhygygxfxfxfxexexfyfyfyfygyhyhyiyiyhyhygygygyfyezcycycydyfyeydybybzaz`zazazbzczcydycxcxcydydzgzhzhzfzeyeyeyeyfygygzg{fzfzfzezezdzczczbzbzczczczdzdzdzczbzbzazazbzbzczczdzczczbzbzbzbzczdydydydxcybzaz`z^z^z`zbzdyby`y_y^y^y_y`yazazaz`z_zb{e{ezf{h{k{l{m{n{o{p{q|r|q|p|n|l|k|l{q{q{n{n|n|n|n|n{m{mzlzkzizhzgzhzizizf{d{c|g{j{k{jzhzezdycydze{e{f{g{g{fzezdzczcydyeygyhycz_z^{`{^z]zazbzazazczezezezdzczdzezgzizj{k{k{j|j|j|j|i|i{hzhygyfyfyfyfyfyfzfzfzezdzd{c{c{b|a|a|`{`{`{_{_{_{_{_{_{_{_{_{_{_{_{^{^{]{]{\{[{[{\z]z]z^z^z]{]{]|]|]{^{^{]z]y]z]{^{`{`{a{b|d|e|f|f|f|e|d|c{a{a{c{d{e{e{d{b{`{_{_z\zY{\|]|`|a}`}_~^~_}_|_|_|]|[|Z}Z}Z~YWV~V~W~WWV~UUVVWWXXXWWWWWWWWVVWVVUTSTUVWYZ\[[[[[[[[\[ZYXWWWVWVSNNMNMLKIIJIIIHGGHIJJKKJIHGGFFFEDCCA?@BBCBA@?>>>===>@@@??=<<=====;:987765554444454224544333333222345543200134433455542248986433333345777764322223456788423444345565554444444555667788877777666667777887776665556677789:;:7644578::988887678999987655679;<;;:98789:9::8778:;=>?@BDDDDEEEEEEDCBAAABBAAABBCCBCDEFGIHGFEFGHHHHHIJKKKKKKKJHFDEHKNPPPOMKJJKLLKIGHIJKKKKKJIHHIKMNNMLKJJIJKLNOONMLLLKHDBBCHMNNNOPSUWXYYWSNLOSTUOJMT[ZXVTSQOOPRUWXXXY~Z~Z~[~\~]~^_`~aaaa```^\ZY]adgiihfdcbbbb_^~\~\~]}`~`~^~\~X~W~X~\~`~cdbaaaa`^[XVVX[]^^^\ZWUSSTX[XXWUTROLLLMLLJIHHGGFczczczczczczczczczczczczczczczdzdzdzezezfzfzfygyfzdzczbzczczdzezfyfyfxfxeydyczbzdzezhyiyjxjxjxjxjxjxixiwiwjwjwjwjwiwhwhwgwgwgwhxhxiyjyiyiyiyhyhygxgxgxgxfxgxgxgygyfxgxgyhyhyiyiyiyhyhyhygyfyezczczczezfzezdzczbzbzazazbzczdzeyexdwcxdyeyfyhyiyhzgzeyeyfyfygygygzgzg{f{fzfzezezdzdzdydydydydyeyezdzdzczczbzbzbzbzczdzdzdzdzczczczczczdydydydxcybzaz`z_z^z`zazbz`y_y^y_y_y_y`y`z`z_z^z]{`{d{d{d{g{i{j{k{m{o{o{q|r|p|o|n|l|m|o|q{o{l|n|o}n}n}n|m|m{l{j{izhzhzizjzi{f|c|c|i|l{j{izhyfyeydyezf{f{g{h{h{fzezezeyeyexfxhxiydz_z_zaz`z_zazbzbzcyeyeyeyeydycycyeygzizj{j{j|j|j|i|i|h{h{gzgyfyeyezezfzfzfzfzezdzc{c{c{b|a|a|`{`{`{_{^{]{]{^{^{_{_{^{^z^z^{^{^z^z]z]{]{]z]z^z^y_y_z_z_{_{_|_|_{_{^{^z]y]z]{]{_{_{`{b|d|f|f|f|f|f{e{c{b{c{e{f{g{g{e{dzbza{`{^{]|_|`|b}b}`}_~_~`}`|_|_|^|\|[}Z}Y~W~V~V~V~V~V~V~V~UTUVVWXXWWWWWXXXXWWXWVUTUUVVXYZ[[ZZ[[[[\[[ZZYXWVVVVQMLNNMKKJIIHHHHHHIJJKLLKJIGGFFEDCBA@>?AAB@??>=<<;;;<>????=<;=====;:97776555444555422454443333322234554310013443345653125798543333334567777643222235679952244334556655555444555667787887777777677888789888776666678889:;;:8654679::988888789:99876555579:<<;:98789::;;9879;<>?@BCEEFFFFFEEEDCBAAABBAABBCCCCCDEFHHIHGFGHIIIIIJKKKKKLLLKIFDCFJNQQRQOLKKLMMLJHHIKLLLLLLJIIKMNOONMLKJJKKLNPPONLLMLIFCCDINNNNPQTVWXYZXTOLNSUVQKMTZ[YW~USRPPQSUXYZZ~[~[}\}\~]~^_`bbbbba``^[YY\adgjiigecbbcb`_~]~]}^~`~_~^\X~W~X~\~a~ddcbaaa_^[XVVXZ]^^][YWUSTTVWUVUUUROLKKKKJJIHGGGFbzbzbzbzbzbzbzbzbzbzbzbzazazazbzczdzezezfzfyfyfydzbzbzbzczdzezeyeyexexexdyczbzczezgyhyhyjyjxjxjxjxjxjxjxjxkxkwkwkwjwhwhwhwhwhwixjxkykykyjyiyhyhyhxhxhxhxhxhxhxhxhxgxgxgygygyhyiyjyiyizizgzfzezczdzdzfzgzezdzczczczbzbzczdzezfygxfwexeyfygyjyjyizgzeyfygygyhyhzhzhzgzgzgzfzfzezezdzdydyeyeyeyeyfyezezdzdzczczczczdzezezezezdzdzdzdzdzdydydydycybzbzaz`z_z`zazaz^y^y^y_y_y`y`z`z`z]z\z\{_{c{c{c{e{g{h{i{k{m{n|p|q|p|o|m|m|n|p|q|o{n|o}p}o}o}o}n|m|k{j{izhzhzhzjzi{e|c}c}k}m|j{hzhygyfyeyfzg{h{i{i{i{hzgzfyfxfxgxhxjyjyezazazczbzazczczdzeygygyfyeydycycydyezgzh{i{i|i|i|i|h|h{gzfzfyeydydzdzezezezdzdzdzc{c{b{b|a|`|`{`{`{_{^{]{]{]{^{^{^{]{]{^{^{^{^z^z^{]{]{^{_z_z`yayaz`{`{`{`|a|a|b{az`y`y_z^{^{^{_{`{b|d|f|f|f{f{e{dzc{b{d{f{g{h{h{f{e{d{b{`{^|_|a|c}e}b~_}_~`~a}a|`|`|^|]|[}Z}X~W~VVVVVV~VUTTUVVWWWWVWXXYY~Z~Y~YYXWVVVVWWXZZ\\[[ZZ[[\[[ZYYXWVUUUPKKMMLKJIIIHHHHIIIJJKLMLKIHGFEDCA@??>??@@?>=<;::999:<==>><<;<<<<<:98777655544455532244444443332223456542001344334665312688865444333456778775432223467897423333445565556655556666678887777777777889989::9987766678889:;<;:8655689;:988888899:99876555568:;<;;:9889;<=<:88:<>@ABCDFFGGGGGFFFEDCAAABBBCCCDEDCDDEFHIJIHGGHIJJJIJKLLLLLLLKIFDCDHMQRSSPNLLMNONLIHIKLMNNNMKJJKMOPPPNMLKJKKLNPQPONNNMKGDDFJNNNOPRUWWXY[YUPMNSUVRMMRXZZWVTSQQRT~V~Y[[[\\~^~^~^~_`abccccba~_~^ZYY\`dhjjigecbbcca_~]}]}]}_~_~^[XW~X~\~a~cdcbaaa_^ZYWVWZ]]^][XVTSTSTUSSTSUSOLKJKJJIHGFGHGbzbzazazazazazazbzbzbzaz`z`z`zazczdzezezfyfyeydzdzbzazbzdzdzdyeyeyexdxdyczczbzczezfygyhyiyjyjxjxjyjyjxkxkxkxkxkxkxjxiwhwhwhwiwjxkylylzlzkzjyiyhyhxhxhxiyjxjxjxixiyhygyfygzgzhzizjzjyjzizhzfzezdzezezgzgzfzezdzdzczczczdzezgzhyhxgxfxfygyhykykyjzhzfxfxgxhxiyhyiyhyhzhzhzgzgzfzfzezeyeyfyfxfxfxfyfyfyeyezdzdzdydyeyfyfyfyfyezezezezeyexdxdydycyczbzazaz_z_z`z`z^z^z_y`y`y`z_z_z_z]z\z\{_{b{b{a{c{e{f{g{i{k{m|o|p|o|n|m|m|o|p|p|o|o}p}q~q~p}o}n|l|k{jzizhzhzhzizi{e|b}d}l}l|j{gzhygyfygzg{i{j{j{j{i{izhyhxgxgxhxiykzkzcz`{c{d{a{bzezdzdzfygygzgzfzeycycydyezezf{g{h{i|i|h|g{g{fzezdyczczczdzdzdzdzdzdzczc{b{b{a|a|`|`{`{`{_{]{\{\{\{]{]{]{]z]{]{]{]{^{^z^{^{^{_{`z`zayazaza{a|`|a|b|b|c{bzbyayaz`{_{^{_{a{b|d|e|e|e{e{d{dzczc{e{g{h{i{h|g|e|d{b|`|]|`}b}d~d~`_~`~b~b}b|a|`|_}]}[}Z~XWVUUVVVVUUTUVWXWWVWXYYZZ~[~[~[ZYXWWWWWWYZ[\\\[ZZZ[[[ZYYXWVUTSROKJLLKJIHIIHHHHHHHHIJLLLJHGFEDBA@>>=<=>>>=<;:9988778;;;<=<;:;;;;;987677666644455432244444443332223456642011344334675312699865444444456788876533333457887543222345555556666666777778887888887777889999;:::97777788899:;;;:9656789;;:9999999::998776655679;<<<;:99:<=>=;98:=?BCDDEFGGGGGGGGGFDCAAACCCDDEFFFEDDDEHIKJIHHHIJKKJKLLLLLMMMLJGDCDGLPRSTRPNMNOQQNKIIKMNNOOOMKKKMOPQQONLKKKKLNPQRQPONMKHEEGKONMOQSUWXXYZZVRNNSUVSNNPUYZXWU~T~SS~S~T~W~Z~\~\\^^~_~_~_~_`abcdddcb~`~^ZXY\adhjkihfdcbccb`^~]}]}_~_~][WVX~[~_~bcbaa``^]ZXWVWY[]^]ZXVTSTSSTPPRSUSOLKJKJJIHGFGHHazaz`z`z`z`zazazazazaz`z`z_z`zazczdzezeyeyeyeyczc{b{bzczdzdydydydycybzbzbzczdzdzdzezfzfzhziyiyjyjyjykykxkxlxkykykyjyixhwhwixjxkxmynznzmzlzkyjyixhxixixkykylykyjyjyiyhyfzfzgzizjzkzjyjzizhzfzezdzezfzhzgzgzezdzdzczczczdzezgziyhxgxfxgyhyiykykyjzhzfxgxhxhxiyiyiyiyizhzhzhzhzgzgzfzfyfyfyfxfxgxfxfyfyfyfyezezeyeyfzgzfzfzfzfzezezeyeyeyeyeydydzczbzb{a{_{_z_z_z]z_z`zayay`z`z`z`z]z\z[{_{a{a{`{b{d{e{f{h{j{l|n|p|n|m|l|m|o|o|o|o}p}p~p~q~p}o}m|l|k{izhzhzhzizjzj{e|a}f}l}l|j{hzhzizizi{i{j{k{k{k{j{jzjyjyiyhyiyiyi{h{b{b{f|e|b{czezdzezfzgzhzhzhzgyeycybyczdze{f{g{h|g|f|f{ezdzczbzazazazbzczczczczczb{b{a{a|a|a|a|`{`{`{`{^{\{[{\z\z\z]z]z\{]{]{]{^{^{^{^{_{`{azazazaza{a|`|a|b|c{d|d|czdyczb{a{`{_{_{a{a|c|c|c|c{c{c{c{c{d{f{h{i|i|h|f|e|c{a|^|^}`}c~d~`^_abb~b}`}_}^}]~[~YXWVUUUVVVUUUUVXXWWXYYZZ[[~[~\\[ZZYYYYXXY[[\[[ZZZZ[[[ZYXXWVUTRPOKJKKJIHHHHGGGHHHGGGIJKKIGEDCB@?>=<;;<<==<:987766667::::;;:9:::99876666666644455433344444443332223456642112344334565313799865444444445778887643334457887643222345665567766677877788888889998888889999;:::9887788899:::;:9865679:;;:::999999::98887665779;<===<;;<>>@?<:9;>ACDEEFGHHHHHHGGGGECAAACDCDEFGGHGFEDEHIKKKJIIIKKLKLMMMMMNNMLJGEDDFJORTUTQPOOPRSPMKJLMNOPQQOMLLMOQRRQONLKKKLMORSSQPONKHEFHLOONOQTVXYXYZ[WTOOSTWSOMOTZ[ZXW~V~T~S}T}U~X~Z~\~\]``a~`~`~``abcddedc~`~^ZX~Y\aehjkjhfdcabcca_~^}]}^}^~]ZWV~W~Z~^~aba``__][YWVVWX[\]\ZWUSRSSRRNNPRTSOLKJKJJIHGFGHI`z`z_z_z_z`z`zazazaz`z`z_z_z`zbzczdzezeyeydydzc{b{b{bzczczcycycycybzbzazbzczdzdzdzezezfzgzhzhziziziziyjykykykykykyjyjyixhxixjxlynynznzmzlzkyjxixixixjylylymylylykyjyhzgzfzgzizkzkzkyjzizhzgzfzezfzgzizhzfzezdzczczczdzezfzhyiyhxhxgxgyiyjylykyjzizfxgyhyhyiyjyjyiyizizi{i{izhzgzgzgygygygxgxgxgxgxgygyfyfyfzfzgzgzgzgzgzgzgzfzezeyeyeyeyeyezezczczb{a{_{_z^z_z[z`zazbzaz`z_z_z_z\z\{\{_{`{`{`{a{c{d{dzg{i{j{l|n|m|l|k|l|m|m|n|o}p}o}o~o}n}n|m|l{kzizizhzizizj{j|c|b}g~k~k}j|i{izizi{i|j{k{k{k{k{k{kzkzkyjyiyjyjzh{e|b|f|i|f|c{e{fzezezfzgzgzhzhzgyeycybybzczd{e{f{f|f|e|d{dzczbzaza{`{azbzczczbzb{b{a{a{a|a|a|a|a|a|a{a{a{_{^{\z\z]z]z]z]z]z^{^{^{_{_{_{_{`{`{azazaza{a{`|`|a|b|c{d|d|d{ezdzc{c{a{`{`{`{a{b{b{b{b{c{c{c{c{e|g|h|h|h}g}e|d|b|`}^}^~`~b~b_^_`bb~a~_}^}]~[~Z~YXWVUVVVVVUUVVVWWWYYZ[[Z[[~\]]\[[ZZZZYYY[[\[[ZZYZ[ZZYXWWVUTSPONKJJJJHHGGGFFGGGFEFFGHIHGFDBA@>=<<;::;;;;:87666555669988999899988765566665544455433334444443332333567642123344444564313789865544444444677888754444557888643212345666667887777888889888899:999888899::;;::988888899:;;:::9865679:;;;::999889::9998877778:<=>>>====?@B@=;:<@CDEEFGHIIIIIIHGGGECAAACDDEFGHIIHGEDEGIKKKKJIJKLLLMNNNNNOONMKHFEEEINQSUTSRPPQRSRPNLMNOPQRRQOMLMOQRRRQPNMLLMNORTTSQPNLIGGHLPPPP~R~TVXYYYZZXUQPSTWTPMMSZ][ZY~W~U~T}T}U~X~Z~\~]^`ab~a~a~`~aabcddeec~a^ZX~Y\aehjkjigdcabbbb`~^}]}]}\}[~YVU~V~Y}]~`aa`_^^[ZXWUUVX[[\[ZWTPPRQQOLNPRTSPLKKLKKJIHFFHH`z_z_z^z_z`z`z`zazaz`z_z_z`zazbzczdzdydydydzc{b{b{bzczczcycycycybzazazazbzczdzdzdzdzezezfzgzhzhzgzgzhzizizizjykyjyjyjyjyjxkxmyoypzoznzmzlzkyjxixixjxkymymymymylykyjyizgzf{h{jzkzlzkzjzjzizhzfzfzgzhzhzhzfzezezdzdzdzdzezfzhyiyiyiyhyhyiykylykyjyizgygyhyiyjyjzjzjzj{j{j{j{j{izhzgzhyhyhyhygygxgxgxhyhygygygzgzhzhzhzhzhzgzgzfzeyeyeyeyfyfyfzfzdzczb{a{^{_{_{_{[{a{bzcybyay`y`yay\{[{\{_{`zazaz`zazbzczezh{i{k{l{k{j{j{j{k|k|m|n}n}n}n}n|m|m{l{l{kzjzjzizizj{j{g|a}c}i~l~j}i|i{jzj{j{j|k{l{l{l{l{k{lzmzlzkykylzk{h|d}b}g}j}g|d|e{f{e{e{fzgzgzhzhzgyfyeycyczbzc{d{e{e|d|d{c{b{a{`{`{a{`{a{b{b{b{b{a{a{`{`|`|`}a}c}c|b|b{bzb{a{`{^z_z_z_z_z_z^z_z_{_z_{_{^{^{_{_{`zaza{`|`|`}`|a|b|c|c|d{ezdzdzd{c{a|`{`{a{a{b{b{b{b{b{c{c|d|f|h}h}g}f}e|d|b|a}_~^~^~`~a_^_````~_~]~\~[ZYYXVVVWWWWWVVVVVWWXYZ[[[[[[\^^^]\[[[ZZZZZ[[ZZYXWXXXXWWVUTSRQNNMKJKLKIHGGFEEFFEDCCDEFFFECA@?>=;:;::::::987765555556887777788887544566555554444433333344444333333466775322334444455431368887655444444445689986544556788875421234677777899888898889999899:;:9999999::;;;;:9888899::;;;:::9976678::;;;;:99999::::998888::;<=???>>>>@ACB><;=ADEFFFGHIJJJJJIHHHECA@ABDDEFGIJJJHFDDFHJKKLLJKKLMNNOPPPPPPOMLJHGGGJMPRTTTSRRSSTTQOMMNOQRTUTRNLLNPRSTSQPONNMNPRTUTRQPMKIHILPPPP~R~T~WYZYYYZYVRQTUXUQNMQY^]\ZX~W~V~V~V~Y~\~^~_`abcc~b~b~bbbcddeddb_[~Y~Y\`dgjkkkhfcaabaa`_~]~]~Z~X~VTSU~X~\~_aa`_][YWVVTUWXZZYXWUQNMPPOMLORTUTQMLMMLLKIIHHII`z_z^z^z_z`z`z`z`z`z_z^z_z`zbzdzdzdzdydydydzc{b{bzbzbzczcycycycybzazazbzczczczdzdzdzezezfzfzfzfzfzfzfzgzgzhyiyiyiyiyjyjylymyoypzpzoznzlzkzjyjxixjxkylymymymymykyjyjzizhzg{i{kzlzlzkzkzkzjzhzgzfzfzhzhzgzfzfzfzfzezezezezgzizjzjyiyiyhyhylymylyjyizhyhyizizjzjzjzkzk{k{l{k{k{izhzhzhyhyhyhyhyhyhyhyhzhzhyhzgzgzhzhzhzhzhzgzgzfzeyeyfyfyfygzgzfzezd{c{a{^{^{_{`{\{czcycybyayaxbxbx]z[z[{`zazaz`z`z`z`zbzdzgzh{j{j{i{h{g{h{i{j{k|l|m}n}n|m|m{m{m{m{kzjzjzizj{j|i|e|a}d}j}k}j|j|j{jzj{j{j{k{l{l{l{lzlzm{m{m{lzkzlzl|j}g~f~f~f~g}f|f{e{e{e{fzgzgzhzgzfyfyeydyczb{b{c{d{c{c{c{bzbzaz`z`za{a{a{b{b{b{b{a{`{`{`{_|`}a}c}d|d|d|c{c{b{a{_{`{bzayby`y^y_y_y_z_{^{^{]{]{]{`{`{`{`|`|`|`|`|`|a}a|c{d{e{d{c|c|a{a{a{a{b{b{b{c{c{c{c|d|e|g}h}g}f~d}c}b}a}`}_~^~^~``_]_`_^^]\[ZYYXWVUVWXWWWVWVVWXXYZ[\\\[[\]^__^^]\\[[[[[[[ZYXWWVWWVVUTTSRPONMMJJKLKJHFFEEDEEDCBBABCDCB@>>=<;9999999999876555555567776556667654344665545433332323333333343233445667753222344444554323677777665555434456899866545567788864212246877799:9889999899:9999:;;;::::999::;;;;;:98899::;;<<;:999877789:;;;;:::99999:::99989;<==>?@?@@@@BCCC?=<>BDGGFEFGIIKKJJIIHFEC@@ABDEEFHJKKKHFEEGHIJLLLLLLMMOOPPPPPQPPNLKIHGHJMPRTUUTTSSSTTSQONNPQSUWVTNKKLPRTTTSRQPONOPSUUTSRPOMJJJNOPQQ~R~T~VX[ZYYYYWTSUVXVRNLQX__][Y~W~W~W~W~Y~\~^~_abdeed~c~cbbccdddcb`\Z~Z~\~`cfiklkifdaaaaa`_~^~\~ZWURRTWZ]``_^\ZWVTTSUWXXYWVUSOMLOONMLPSUVSPNMMNMLKKIIIIJ`z_z^z^z_z`z`z`z`z_z^z]z^z`zbzdzdzdzczcydyczczczbzbzbzbzczczczczbzbzazbzczczczczczdzdzezezfzezezdzdzdzezfzfzgygyhyhyjyjymynypzqzqzozmzkzjziyixixjxkymynynymymykyjyjzizhzg{i{kzlzlzkzkzkzjzhzgzgzfzgzgzgzfzgzfzfzfzfzfzfzhzjzkzjzjzjzizizlzmzlzkzizhzhyizkzlzm{m{mzl{l{m{l{k{izhzhzhzhzhziyiyiyiyhzhzhzizizhzhzizizhzi{jzhzhzgzfyfygygygygzgzfzeze{c{a{^{_{`{`{]{dzdydxcxaxaxbxbx]z\z\{`{a{az_z_z_z_zazczezf{g{g{f{e{e{ezfzg{h|j|k|l|l|l{l{l{lzlzkzizizizj{i|g}b}b}e}j}j}j|j|j{kzk{j{j{k{l{l{l{lzlzm{m{l{k{k{l|m|j~g~f~g~g~g}g|g{f{e{f{fzfzfzfzfzezezdzczbzb{bzczc{b{b{b{bzbyay`zaza{a{a{b{b{b{b{b{a{`{`{_|a}b|d|d|e|e{e{d{d{c{a{bzcybycyay_y`z`z`{_|^|]|\|\|]|_|_{`|`|`|`|`|_|^}_}_|a|c|d|d|c{b{a|a{a{a{b{c{c{d{c{d{d|e|f}h}g}f~d~b~a~a~`~____~`~`_^^^]]\\[ZZYYXXWUVXXWWWVVVVXXYYZ[\]]\\]^``__~_~_~^~^~]\\\[YYXWVUVVUUVUTSRRPONMLLKJKKKIGFEDDDDDCA@?>?@A@?=;<;::88888888887766665556667654334454422356654554322212333333234432344445667532233444444443234566777765554444567999877556677888753233468889;;;;::9:9999::9999:;<<<;;::::::;<<<;::989:;;;<<<;;::9987789::;;;;;:999::;;:::::;=>??>?@AABBBCDDD@?=?CEHIGFFGIIKLKJJIGFDB@@ACDEEFHJLLLJHFFGGIJLMNNMMMNOPQQQRQRQPONLJIIJLNPRUVUUUUUUVVUSQPOPQSVWWUPMLMPSTUUTSSRPOOPSUUUTTRQOMLLNPQQR~S~TVX\ZYXYYYVUVWYWSNLPX_`^\Z~X~X~W~X~Z~]~_~`bdeffe~d~cbbccccccb`][~Z~\~`cfikkkifdaaaaaa`~^~\~YURQQSVY\_``^[YUTSSTTWXXWTSRPNKKNMMLMPSVUSPNNOOMMLLKKKLL`z_z^z^z_z`z`z`z`z_z^z^z_zazczdzdzdzczcycycyczczczczczczczczczczczczczczczczczczczdzdzezezezdzdzdzdzdzdzdzezezfzgzgzizjzmynyqzqzpznzlzkzjziyixixjxkymynynymymykyjyjzizgzg{h{kzlzlzkzkzkzjzhzgzgzgzgzhzgzgzgzgzgzgzfzfzgzjzkzkzkzjzjzjzjzmznzmzkzizhzhyizkzmzm{m{mzl{l{m{l{k{izhzhzh{g{hzhzgzgzhzhzh{h{hzgzhzizizjzi{i{j{jzizhzgygyhygygzgzgzfzezd{c{a{^{^{`{a{^{dzeydxbx`xaxdxcy^z\{^|a{b{a{`z_z^z_z`zazdzdzdzdzczczczczdze{f{h|j|j|k{k{k{kzjzjzjzizizh{i{h|e}a}c}f|i|j|j|j{jzjzj{j{j{k{l{l{l{lzlzl{l{k|j|k|l}m~jhgghh~h|g{f{f{f{f{f{e{e{d{d{c{b{b{b{bzbzczczb{b{bzczcybzazaza{a{a{a{b{b{b{b{a{`{`{_|a}c|e{f{f{f{fzfzfzdzbzbzcycycyby`z`zaz`|`|_}^}\}\}\|_|_|_|_|_|_|_|^}]}^}^}_|a|c|b|a|a|a|a|`|a{b{c{c{d{c{d{d|f|g}g}f}d~b~`~_~_~__```~`~`~_~_~^^]]\\[ZZYYXXVUUWXXXWVVUUWXYZ[\]]]\\]_~`~`_~_~_~^~_~^~]~]~\\[YXWVUTUUTUUUTSRPONNMLLKJKKIGFDCBCCCCB@>=<=>?>=;:;:9977788899988777666556678765445565533467765654433323444444345543455445677543334434445543345656788876555444568::999755678888875434457999:;;;;::9::::::::::::;<=<<<;;;;;;<<<<<;;:9::;;;<<<<;::9988899::;<<;;;::9:;<<;;;;;<>?@@?@ABCCCCDEEDA@>@DGJKIGGHIJKLLKJHGFDB@@ACDEEFHKMNMKHFFGHIJLMNNNMMNOPQQRRRSRQPNMKJJKMOQSUVVVUUUVVWWUTRQPRTVXXVQNNNP~S~UVVUUTSQPOPRTUVUUSRPONNPQRRR~S~UVX\\[YYZZXWW~X~YWSOMQX`a_][Y~Y~X~Y~Z~]~_~acdeffe~d~cccbbccccb`][~Z~\~`cfikkkifdaaaaaa`~^~\YURQQSUX\^___\YUSSSSTVWWVSRQPMLKNNMLMPSVUSPNNOPONNLLKKLL`z_z^{]{_z`zaz`z`z_z^z^z_zazczezezezdzcycycycydzdzdycycyczczczczdzd{d{dzdzdzczczczczdzezezezdzdzczczczdzdzdzezfzfzgzizjzlznzpzozoznzlzkzizhyhxjxjxlymynynymymykyjyizhzgzi{h{lzmzmzlzkzkzjzizhzhzgzhzhzgzgzgzhzgzgzgzg{h{jzkzkzkzjzkzjzjzmznzm{kzizhzhyizkzmzm{m{mzl{l{m{l{k{izhzhzh{g{h{gzgzfzfzgzh{g{g{g{hzizizjzi{i{j{j{izizhygyhyhyhzhzgzgzezd{c{a{_{_{a{a{_{cydydxbxax`xfyey^{]{_|b{b{bzaz_z_z_z`zazbzczbzazbzazazaybzc{d{f|h|h|j|j{i{izizhzhzhzi{h{h|h|e|a|c|g|i|j|j{j{j{j{j{j{j{k{l{l{k{kzk{k|k|j|k|k|k~kjiiiij~j|h{f{f{f{f{f{e{d{c{c{b{a{a{a{bzbzczbzbzbzczczczbzazb{a{a{a{a{a{a{b{b{a{`{`{`|a|c{e{g{g{g{g{h{hzfzc{b{bzbzczbza{`{`|`}`}_~]~\}\}\|^|^|_|^|^}]}]|]}\}]~^}_}`}a}a}a}`|`}_}_|`|a{b{c{d|c{d|f|g|h}g}e}c~a~`~_~^~_`aaaa`__^^]\\[ZZZYYXXVUUWXXXXWVUUVWXZ[[[\\\\]^~_~_~_~_^~^~^~^~]~\~\\[YWVVUTTTTTUUTSQQPONMMLLKKJHFEDCBBCCCB@><<<=>=<;::::98778999999988876656888987656556554466776565555554455555545665456555667864344454555654345677778:998665555678::999766778899976434457999:;<<<;;:;;;;;;;:::::;<<====<<<<<<<==<<<;:;;<<==<=<;;::99889:;;;<<<<;;::;;<=<<<<<=?@A@@ABBCDDDEFFEBA?@EILLJHHIJKKLLLJHGFDB@@ACDEFGILNOOMJGGGHIKMMOOONNOPQQRSSSTTRQPNLKKLMPR~S~UVVVVVVVWWXVUSRQSUWYYVSPOOP~S~UVVVUUTRPOOQSUVVVTSPOOOQQRRS~T~UUX]^]ZZ[[ZY~Y}Z}ZXTPMQYaa`^\Z~Z~Y~Z~[~]~_~acdfffe~e~d~c~cccbbbcb`][~Z~\~_bfikkkifdaaaa```~^~\YUSQQSUX[^___\YTSRSSTVWWUSRQOMLLONMLMPSVUSPNNOPPOONLKKMM ================================================ FILE: shell/resources/mac/Assets.xcassets/AppIcon.appiconset/Contents.json ================================================ { "images" : [ { "idiom" : "mac", "size" : "16x16", "scale" : "1x" }, { "idiom" : "mac", "size" : "16x16", "scale" : "2x" }, { "idiom" : "mac", "size" : "32x32", "scale" : "1x" }, { "idiom" : "mac", "size" : "32x32", "scale" : "2x" }, { "idiom" : "mac", "size" : "128x128", "scale" : "1x" }, { "idiom" : "mac", "size" : "128x128", "scale" : "2x" }, { "idiom" : "mac", "size" : "256x256", "scale" : "1x" }, { "idiom" : "mac", "size" : "256x256", "scale" : "2x" }, { "idiom" : "mac", "size" : "512x512", "scale" : "1x" }, { "idiom" : "mac", "size" : "512x512", "scale" : "2x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: shell/resources/mac/Assets.xcassets/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: shell/resources/mac/Base.lproj/MainMenu.xib ================================================ Default Left to Right Right to Left Default Left to Right Right to Left ================================================ FILE: shell/resources/mac/Entitlements.plist ================================================ com.apple.security.get-task-allow ================================================ FILE: shell/resources/mac/Info.plist ================================================ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIconFile CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleVersion 1 LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) NSHumanReadableCopyright Copyright © 2023 Meta Platforms, Inc. All rights reserved. NSMainNibFile MainMenu NSPrincipalClass NSApplication ================================================ FILE: shell/resources/models/DamagedHelmet.gltf ================================================ { "accessors" : [ { "bufferView" : 0, "componentType" : 5123, "count" : 46356, "max" : [ 14555 ], "min" : [ 0 ], "type" : "SCALAR" }, { "bufferView" : 1, "componentType" : 5126, "count" : 14556, "max" : [ 0.9424954056739807, 0.8128451108932495, 0.900973916053772 ], "min" : [ -0.9474585652351379, -1.18715500831604, -0.9009949564933777 ], "type" : "VEC3" }, { "bufferView" : 2, "componentType" : 5126, "count" : 14556, "max" : [ 1.0, 1.0, 1.0 ], "min" : [ -1.0, -1.0, -1.0 ], "type" : "VEC3" }, { "bufferView" : 3, "componentType" : 5126, "count" : 14556, "max" : [ 0.9999759793281555, 1.998665988445282 ], "min" : [ 0.002448640065267682, 1.0005531199858524 ], "type" : "VEC2" } ], "asset" : { "generator" : "Khronos Blender glTF 2.0 exporter", "version" : "2.0" }, "bufferViews" : [ { "buffer" : 0, "byteLength" : 92712, "byteOffset" : 0, "target" : 34963 }, { "buffer" : 0, "byteLength" : 174672, "byteOffset" : 92712, "target" : 34962 }, { "buffer" : 0, "byteLength" : 174672, "byteOffset" : 267384, "target" : 34962 }, { "buffer" : 0, "byteLength" : 116448, "byteOffset" : 442056, "target" : 34962 } ], "buffers" : [ { "byteLength" : 558504, "uri" : "data:application/octet-stream;base64,AAABAAIAAgADAAAAAwACAAQABAAFAAMABgAFAAQABAAHAAYABgAHAAgACAAJAAYACgAJAAgACAALAAoADAAAAAMADQAOAA8ADwAQAA0AEQAPAA4ADgASABEADwARABMAEwAUAA8AEAAPABQAFAAVABAAFgARABIAEwARABYAEgAXABYAFgAYABMAGQAMABoAGgAbABkAHAAZABsAAwAaAAwAHQAeAB8AHwAgAB0AHgADAAUABQAfAB4AHwAFAAYABgAhAB8AIAAfACEAIQAiACAAIgAhACMAIwAkACIAIQAGAAkACQAjACEAIwAJAAoACgAlACMAJAAjACUAJQAmACQAJwAdACAAGwAoABwAKQAcACgAKAAqACkAKwApACoAKgAsACsALQAuAC8ALwAwAC0AMQAwAC8ALwAyADEAMQAyADMAMwA0ADEANQA0ADMAMwA2ADUANwArACwAOAA5ADoAOgA7ADgAPAA4ADsAPQA7ADoAOgA+AD0ALAA/ADcAQAAtADAANwA/AEEAQQBCADcAQwBAAEQAMABEAEAARABFAEMARgBFAEQARABHAEYARgBHAEgANABIAEcASABJAEYASgBJAEgASABLAEoARwBEADAAMAAxAEcARwAxADQASwBIADQANAA1AEsATAA+AE0ATQBOAEwATABOAE8ATwBQAEwAUQBMAFAAUABSAFEAUwBRAFIAUgBUAFMAUwBUAFUAVQBWAFMAVwBTAFYAVgAYAFcAVgBVAFgAGABWAFgAUwBXAD0APQBRAFMAPQA+AEwATABRAD0ATQA+ADoAOgBZAE0AWQA6ADkAOQBaAFkAPQBXAFsAWwA7AD0AOwBbADwAFwA8AFsAWwAWABcAVwAYABYAFgBbAFcAWAATABgAXABdAF4AXgBfAFwAYABfAF4AXgBhAGAAYABhAGIAYgBjAGAAZABjAGIAYgBlAGQAZABlAGYAZgBnAGQAaABnAGYAZgBpAGgAaABpAGoAagBrAGgAbABcAF8AXwBtAGwAXwBgAG4AbgBgAGMAbgBtAF8AYwBvAG4AYwBkAHAAcABvAGMAcABkAGcAZwBxAHAAZwBoAHIAcgBxAGcAcgBoAGsAawBzAHIAdABsAG0AbQB1AHQAdQBtAG4AdgB0AHUAdQB3AHYAeAB2AHcAdwB5AHgAeAB5AHoAegB7AHgAeQB3AHwAfAB9AHkAegB5AH0AfQB+AHoAfgB9AH8AfwCAAH4AfQB8AIEAgQB/AH0AfwCBAIIAggCDAH8AgAB/AIMAgwCEAIAAhQCDAIYAhgCHAIUAgwCCAIgAiACGAIMAhgCIAIkAiQCKAIYAhgCKAIcAigCLAIcAiwCMAIcAjQCBAHwAfACOAI0AjgB8AHcAdwB1AI4AbgCOAHUAjgBuAG8AbwCNAI4AjQBvAHAAcACPAI0AgQCNAI8AjwCCAIEAggCPAJAAkACIAIIAjwBwAHEAcQCQAI8AkABxAHIAcgCRAJAAiACQAJEAkQCJAIgAiQCRAJIAkgCTAIkAcwCSAJEAkQByAHMAiQCTAJQAlACKAIkAiwCKAJQAlQCWAJcAlwCYAJUAmQCYAJcAlwCaAJkAmQCaAJsAmwCcAJkAnQCcAJsAmwCeAJ0AnQCeAJ8AnwCgAJ0AoQCgAJ8AnwCiAKEAoQCiAKMAowCkAKEApQCmAKcApwCoAKUAqQCqAKsAqwCsAKkArQCuAKsAqwCvAK0AsACeAJsAmwCxALAAsQCbAJoAmgCyALEAsgCaAJcAlwCzALIAswCXAJYAlgC0ALMAtQCzALQAtAC2ALUAtwCyALMAswC1ALcAsgC3ALgAuACxALIAuQCwALEAsQC4ALkAsAC5ALoAugC7ALAAngCwALsAuwCfAJ4AuwC6ALwAvAC9ALsAnwC7AL0AvQCiAJ8AogC9AL4AvgCjAKIApgC+AL8AvwCnAKYAwAC/AL4AvgDBAMAAwQC+AL0AvQC8AMEAwQC8ALoAqgC/AMIAwgCrAKoAvwDAAMMAwwDCAL8AwgDDAMQAxADFAMIAqwDCAMUAxQCvAKsAwADBAMYAxgDDAMAAxADDAMYAxgDHAMQAxADHAMgAyADJAMQAxQDEAMkAygDJAMgAyADLAMoAzADFAM0AyQDNAMUAzQDJAMoAzQDOAMwArQDMAM4AzgDPAK0A0ACtAM8ArgCtANAA0ADRAK4ArADSANMA0wCpAKwAqADUANUA1QClAKgAoQCkANYA1gDXAKEAoAChANcA1wDYAKAAoADYANkA2QCdAKAAnACdANkA2QDaAJwAnADaANsA2wCZAJwAmACZANsA2wDcAJgAlQCYANwA3ADdAJUA3gDfAOAA4ADhAN4A4gDfAN4A3gDjAOIA4gDjAOQA5ADlAOIA5gDlAOQA5ADnAOYA5gDnAOgA6ADpAOYA6gDpAOgA6ADrAOoA6gDrAOwA7ADtAOoA7gDtAOwA7ADvAO4A7gDvAPAA8ADxAO4A8gDxAPAA8ADzAPIA9AD1APYA9gACAPQAAgD2APcA9wAEAAIABwAEAPgA+AD5AAcABwD5APoA+gAIAAcACwAIAPoA+gD7AAsAzwD8ANAA/QD8AM8AzwD+AP0A/gDPAM4AzgD/AP4AAAH/AM4AzgDNAAABygAAAc0AAQECAQMBAwEEAQEBBQEGAQcBBwEGAQgBCQEKAQsBCwEMAQkBCAENAQcBDgEPARABEQEQAQ8BDwESAREBEwENAQgBFAERARIBEgEVARQBFgEUARUBFQEXARYBGAEWARcBFwEZARgBGgEYARkBGQEbARoBHAEaARsBGwEdARwBHgEcAR0BHQEfAR4BIAEeAR8BHwEhASABIgEjASQBJAElASIBJgEnASgBKAEpASYBJAEqASsBKwElASQBKwEqASwBLQEuAS8BLwEwAS0BLAExASsBMgEzATQBNAE1ATIBNgE3ATgBOAE5ATYBOgExASwBLAE7AToBOgE7ATwBPAE9AToBPgE/AUABQAFBAT4BQgE9ATwBQwFEAUUBRQFGAUMBPAFHAUIBQgFHARMBEwFIAUIBSQFKAUsBSwFMAUkBCAFIARMBTQFOAU8BTwFQAU0BUQFSAVMBUwFUAVEBVQFRAVQBVAFWAVUBVwFTAVIBUgFYAVcBWQFXAVgBWAFaAVkBWwFZAVoBWgFcAVsBXQFbAVwBXAFeAV0BXwFdAV4BXgFgAV8BYQFfAWABYAFiAWEBYwFhAWIBYgFkAWMBZQFjAWQBZAFmAWUBZwFoAWkBaQFqAWcBawFoAWcBZwFsAWsBawFsAW0BbQFuAWsBbwFuAW0BbQFwAW8BbwFwAXEBcQFyAW8BwQByAXEBcQFzAcEAwQBzAXQBdAHGAMEAxwDGAHQBdAF1AccAxwB1AXYBdgHIAMcAywDIAHYBdgF3AcsAbgFvAbkAuQBvAXIBuQC4AG4BcgG6ALkAugByAcEAbgG4ALcAtwBrAW4BaAFrAbcAtwC1AGgBaAG1ALYAtgBpAWgBeAF5AXoBegF7AXgBfAF5AXgBeAF9AXwBfAF9AX4BfgF/AXwBgAF/AX4BfgGBAYABggGDAYQBhAGFAYIBhgGFAYQBhAGHAYYBhgGHAYgBiAGJAYYBigGJAYgBiAGLAYoBigGLAYwBjAGNAYoBjgGNAYwBjAGPAY4BgQF+AZABkAGRAYEBkgGQAX4BfgF9AZIBkwGSAX0BfQF4AZMBlAGTAXgBeAF7AZQBEAGVAQ4BlgEOAZUBlQGXAZYBBwGYAQUBmQGaAZsBmwGcAZkBnQGaAZkBmQGeAZ0BnQGeAZ8BnwGgAZ0BoQGgAZ8BnwGiAaEBoQGiAaMBowGkAaEBpQGkAaMBowGmAaUBpQGmAacBpwGoAaUBqQGqAasBqwGsAakBrQGuAa8BrwGwAa0BsQGyAbMBswG0AbEBsQG0AbUBtQG2AbEBtwG2AbUBtQG4AbcBuQG6AbsBuwG8AbkBvQG5AbwBvAG+Ab0BvwG7AboBugHAAb8BwQG/AcABwAHCAcEBwwHBAcIBwgHEAcMBxQHDAcQBxAHGAcUBxQHGAccBxwHIAcUByAHHAckByQHKAcgBywHKAckByQHMAcsBzQHLAcwBzAHOAc0BzwHNAc4BzgHQAc8B0QHPAdAB0AHSAdEB0wHUAdUB1QHWAdMB1wHTAdYB1gHYAdcB2QHXAdgB2AHaAdkB2wHZAdoB2gHcAdsB3QHbAdwB3AHeAd0B3wHdAd4B3gHgAd8B4QHfAeAB4AHiAeEB4wHhAeIB4gHkAeMB5QHjAeQB5AHmAeUB5wHlAeYB5gHoAecB6QHnAegB6AHqAekB6wHpAeoB6gHsAesB7QHuAe8B7wHwAe0B8QHvAe4B7gHyAfEB7wHxAfMB8wH0Ae8B8AHvAfQB9AH1AfAB9QH0AfYB9gH3AfUB9AHzAfgB+AH2AfQB9gH4AfkB+QH6AfYB9wH2AfoB+gH7AfcB+wH8Af0B/QH+AfsB/AH/AQACAAL9AfwB/QEAAgECAQICAv0B/gH9AQICAgIDAv4B9QH3AQQCBAIFAvUB8AH1AQUCBQIGAvAB7QHwAQYCBgIHAu0BBgIFAggCCAIJAgYCBwIGAgkCCQIKAgcCCwIIAgUCBQIEAgsCDAILAgQCBAINAgwCDQIEAvcB9wH7AQ0CDgINAvsB+wH+AQ4CDwIOAv4B/gEDAg8CDgIPAhACEAIRAg4CEQIMAg0CDQIOAhECEgIJAggCCgIJAhICCAITAhICEwIIAgsCEgIUAgoCFQILAgwCCwIVAhMCDAIWAhUCFgIMAhECFwIRAhACEQIXAhYCEAIYAhcCLgAnABkCGQIvAC4AIAAZAicALwAZAhoCGgIZAiAAGgIyAC8AMgAaAhsCGwIzADIAJAAbAhoCGgIiACQAIAAiABoCMwAbAhwCHAIbAiQAHAI2ADMAJAAmABwC8gF7AHoAegDxAfIB8QF6AH4AfgDzAfEB8wF+AIAAgAD4AfMB+AGAAIQAhAD5AfgB/wGFAIcAhwAAAv8BAAKHAIwAjAABAgACHQIeAh8CHwIgAh0CIQIgAh8CHwIiAiECIwIeAh0CHQIkAiMCIwIkAiUCJQImAiMCIQIiAicCJwIoAiECJgIlAikCKQIqAiYCKwIqAikCKQIsAisCLQIrAiwCLAIuAi0CLwItAi4CLgIwAi8CMQIvAjACKAInAjECMAIyAjECMwIsAikCKQI0AjMCNAIpAiUCNQIzAjQCNAI2AjUCNwI1AjYCNgI4AjcCOQI2AjQCOAI2AjkCOQI0AjoCNAI7AjoCOQI8AjgCJQI7AjQCMQIyAj0CPQI+AjECMQI+AigCPwJAAkECQQJCAj8CQwJCAkECQQJEAkMCQwJEAkUCRQJGAkMCRwJGAkUCRQJIAkcCSQJHAkgCSAJKAkkCQQJAAksCTAJNAk4CTgJPAkwCTQJMAlACUAJRAk0CUgJQAkwCTAJTAlICUwJMAk8CTwJUAlMCUQJQAlUCVQJQAlICVQJWAlECUgJXAlUCWAJLAlkCWQJaAlgCWgJZAlsCSwJYAkECXAJdAl4CXgJfAlwCXQJcAkQCRAJBAl0CRQJEAlwCXAJgAkUCYAJcAl8CXwJhAmACYgJgAmECYQJjAmICYAJiAkgCSAJFAmACSgJIAmICYgJkAkoCZAJiAmMCYwJlAmQCXwJeAmYCWwJnAloCZwJbAmgCaAJpAmcCaQJoAmoCagJrAmkCbAJtAm4CbgJvAmwCbAJvAnACcAJxAmwCcgJxAnACcAJzAnICdAJyAnMCcwJ1AnQCawJqAnYCdwJ4AnkCeQJ6AncCegJ5AnsCdwJ6AnwCfAJ9AncCdgJ+AmsCbwJuAn8CgAJ+AnYCdgKBAoACggJ/AoMCfwKCAm8CgwKEAoICggKEAoUChQKGAoIChwKGAoUChgKHAnMCdQJzAocChQKIAocCiQKHAogChwKJAnUCiAKKAokCbwKCAoYChgJwAm8CcwJwAoYCiwJ9AnwCjAJ9AosCiwKNAowCjgKNAosCiwKPAo4CjwKLApACfAKQAosCkQKQAnwCkgKQApECkAKSAo8CkQKTApIClAKTApECkQKVApQClQKRApYCfAKWApEClgJXApUClQKXApQClwKVAlcCdwJ9AowCjAKYAncCeAJ3ApgCmAKZAngCVQJXApYClgKaAlUCmgKWAnwCfAJ6ApoCewKaAnoCVgJVApoCmgJ7AlYCVwJSApcCmwKcAp0CnQKeApsCmwKeAp8CnwKgApsCoQKgAp8CnwKiAqECoQKiAqMCowKkAqECpQKkAqMCowKmAqUCpQKmAqcCpwKoAqUCqQKoAqcCpwKqAqkCngKdAqsCqwKsAp4CrQKfAp4CngKsAq0CogKfAq0CrQKuAqICrwKjAqICogKuAq8CpgKjAq8CrwKwAqYCsQKnAqYCpgKwArECqgKnArECsQKyAqoCrAKrArMCswK0AqwCrQKsArQCtAKzArUCtQK2ArQCtgK1ArcCtwK4ArYCuAK3ArkCuQK6ArgCuwK2ArgCuAK8ArsCvAK4AroCugK9ArwCvgK8Ar0CvQK/Ar4CvAK+AsACwAK7ArwCwQLAAr4CvgLCAsECwgK+Ar8CvwLDAsICxALCAsUCxQLGAsQCwgLEAscCxwLBAsICyALHAsQCxALJAsgCxgLJAsQCxgLKAskCxgLLAsoCuwLAAswCzQLMAsACwALBAs0CzALNAq8CrwKuAswCzgLMAq4CzALOArsCtgK7As4CzgK0ArYCtALOAq0CrgKtAs4CsAKvAs0CzQLPArACwQLHAs8CzwLNAsECsQKwAs8CzwLQArEC0ALPAscCxwLIAtAC0QLQAsgCyALSAtEC0ALRArICsgKxAtAC0wLSAsgCyALJAtMC0wLJAsoC1ALVAtYC1gLXAtQC1ALXAtgC2ALZAtQC2gLZAtgC2ALbAtoC2gLbAtwC3ALdAtoC3gLdAtwC3ALfAt4C3gLfAuAC4ALhAt4C4gLhAuAC4ALjAuIC5ALlAuYC5gLnAuQC6ALpAuoC6gLrAugC6ALsAu0C7QLuAugC2gLdAu8C3QLeAvAC8ALvAt0C7wLwAvEC8QLyAu8C8wLvAvIC8gL0AvMC9QLzAvQC8wL1AtkC1ALZAvUC9QL2AtQC1QLUAvYC9gL3AtUC9wL2AvgC+AL5AvcC+gL4AvYC9gL1AvoC9AL6AvUC2QLaAvMC7wLzAtoC+wLxAvAC8AL8AvsC/QL7AvwC/AL+Av0C/wL9Av4C/gIAA/8CAAP+AuUC5QLkAgADAQMAA+kC6QLoAgEDAAMBAwIDAgP/AgADAwMCAwEDAQMEAwMDBAMBA+gC6ALuAgQD4QLiAv4C/gL8AuEC3gLhAvwC/ALwAt4CBQP9Av8C/wICAwUDBQMCAwMDAwMGAwUDBwMGAwMDAwMIAwcDCAMDAwQDCQMHAwgDCAMKAwkDCwMEAwwDBAMLAwgDCgMIAwsDDAMNAwsDDQMMA+0C7QIOAw0DDgPtAg8DDwPtAuwC7AIQAw8DEQMSA+sC6wLqAhEDEwMUA+cC5wLmAhMDFQPjAuAC4AIWAxUDFgPgAt8C3wIXAxYDGAMXA98C3wLcAhgDGAPcAtsC2wIZAxgDGgMZA9sC2wLYAhoDGgPYAtcC1wIbAxoDHAMbA9cC1wLWAhwDHQMeAx8DHwMgAx0DHQMgAyEDIQMiAx0DIwMiAyEDIQMkAyMDIwMkAyUDJQMmAyMDJwMmAyUDJQMoAycDJwMoAykDKQMqAycDKwMqAykDKQMsAysDKwMsAy0DLQMuAysDLwMuAy0DLQMwAy8DLwMwAzEDMQMyAy8DPwJCAjMDMwM0Az8CNQMzA0ICQgJDAjUDNgNDAkYCRgI3AzYDOAM3A0YCRgJHAjgDOQM4A0cCRwJJAjkDDwM6Aw4DOwMOAzoDOgM8AzsDDgM7Az0DPQMNAw4DDQM9Az4DPgMLAw0DCwM+AwoDPwNAA0EDQQNCAz8DQwNEA0UDRQNGA0MDRwNIA0kDSANHA0oDSgNLA0gDSwNKA0wDTANNA0sDTQNMA04DTgNPA00DTwNOA1ADUANRA08DUQNQA1IDUgNTA1EDUwNSA1QDVANVA1MDVQNUA1YDVgNXA1UDVwNWA1gDWANZA1cDWQNYA1oDWgNbA1kDXANdA14DXgNfA1wDYANhA2IDYgNjA2ADZANlA1wDXANfA2QDZgNlA2QDZwNoA2kDaQNqA2cDZANrA2YDbANtA24DbgNvA2wDcANxA3IDcgNzA3ADZgNrA3QDdAN1A2YDdgN1A3QDdAN3A3YDeAN5A3oDegN7A3gDdgN3A3wDfQN+A38DfwOAA30DfAOBA3YDggOBA3wDfAODA4IDhAOFA4YDhgOHA4QDggODA4gDiQOKA4sDiwOMA4kDiAONA4IDRgONA4gDiANDA0YDjgOPA5ADkAORA44DkgOTA5QDlAOVA5IDkwOSA5YDlgOXA5MDlQOUA5gDmAOZA5UDmQOYA5oDmgObA5kDmwOaA5wDnAOdA5sDnQOcA54DngOfA50DnwOeA6ADoAOhA58DoQOgA6IDogOjA6EDowOiA6QDpAOlA6MDpQOkA6YDpgOnA6UDqAOpA6oDqgOrA6gDqAOrA6wDrAOtA6gDrgOtA6wDrAOvA64DrgOvA7ADsAOxA64DsgOxA7ADsAOzA7IDsgOzA/0C/QK0A7IDtQO0A/0C/QIFA7UDtQMFAwYDBgO2A7UDtwO2AwYDBgMHA7cDtwMHAwkDCQO4A7cD8gKwA68DswOwA/ICrwP0AvIC8gLxArMD/QKzA/EC8QL7Av0C+gL0Aq8DrwOsA/oC+gKsA6sDqwP4AvoC+QL4AqsDqwOqA/kCuQO6A7sDuwO8A7kDuQO8A70DvQO+A7kDvwO+A70DvQPAA78DvwPAA8EDwQPCA78DwwPEA8UDxQPGA8MDwwPGA8cDxwPIA8MDyQPIA8cDxwPKA8kDyQPKA8sDywPMA8kDzQPMA8sDywPOA80DzQPOA88DzwPQA80D0QO/A8IDwgPSA9EDvwPRA9MD0wO+A78DvgPTA9QD1AO5A74DuQPUA9UD1QO6A7kDSQPWA0cD1wPYA9kD2QPaA9cD1wPaA9sD2wPcA9cD3QPcA9sD2wPeA90D3QPeA98D3wPgA90D4QPgA98D3wPiA+ED4QPiA+MD4wPkA+ED5QPkA+MD4wPmA+UD5wPoA+kD6QPqA+cD6wPsA+0D7QPuA+sD7wPwA/ED8QPyA+8D8wPyA/ED8QP0A/MD8wP0A/UD9QP2A/MD9wP4A/kD+QP6A/cD+AP3A/sD+wP8A/gD+gP5A/0D/QP+A/oD/gP9A/8D/wMABP4DAAT/AwEEAQQCBAAEAgQBBAMEAwQEBAIEBQQEBAMEAwQGBAUEBwQFBAYEBgQIBAcEBwQIBAkECQQKBAcECgQJBAsECwQMBAoEDAQLBA0EDQQOBAwEDgQNBA8EDwQQBA4EEQQSBBMEEwQUBBEEEgQRBBUEFQQWBBIEFgQVBBcEFwQYBBYEGAQXBBkEGQQaBBgEGgQZBBsEGwQcBBoEHAQbBB0EHQQeBBwEHgQdBB8EHwQgBB4EIAQfBCEEIQQiBCAEIgQhBCMEIwQkBCIEJAQjBCUEJQQmBCQEJgQlBCcEJwQoBCYEKAQnBCkEKQQqBCgEKwQsBC0ELQQuBCsELgQtBC8ELwQwBC4EMQQvBC0ELQQyBDEEMgQtBCwELAQzBDIENAQyBDMEMwQ1BDQEMgQ0BDYENgQxBDIENwQ2BDQENAQ4BDcEOAQ0BDUENQQ5BDgEOgQ7BDkEOQQ8BDoEOwQ6BD0EPQQ+BDsEPwQ9BDoEOgRABD8EQAQ6BDwEPARBBEAEQgQ1BDMEMwRDBEIEQwQzBCwELAREBEMERAQsBCsEKwRFBEQERgRDBEQERARHBEYERwREBEUERQRIBEcESQRCBEMEQwRGBEkEQgRJBEoESgRLBEIENQRCBEsESwQ5BDUEOQRLBEwETAQ8BDkEPARMBE0ETQRBBDwETgRNBEwETARPBE4ETwRMBEsESwRKBE8ERgRHBFAEUARRBEYESQRGBFEERwRIBFIEUgRQBEcESgRJBFMEUQRTBEkEUwRUBEoETwRKBFQETgRPBFUEVARVBE8EVQRWBE4EbQJsAlcEVwRmAm0CZgJXBF8CWARXBGwCXwJXBFgEbAJxAlgEWQRYBHECcQJyAlkEWARZBGMCYwJhAlgEWARhAl8CWgRZBHICcgJ0AloEWQRaBGUCZQJjAlkEMAQvBLoCugK5AjAEvQK6Ai8ELwQxBL0CvwK9AjEEMQQ2BL8CwwK/AjYENgQ3BMMCxgLFAj4EPgQ9BMYCywLGAj0EPQQ/BMsCWwRcBF0EXQReBFsEXQRcBF8EXwRgBF0EWwReBGEEYQRiBFsEYwRiBGEEYQRkBGMEZQRgBF8EXwRmBGUEZwRjBGQEZARoBGcEZwRoBGkEaQRqBGcEagRpBGsEawRsBGoEbARrBG0EbQRuBGwEbgRtBG8EbwRlBGYEbwRwBG4EZwRqBHEEcQRyBGcEYwRnBHIEcgRxBHMEcwR0BHIEdARzBHUEdQR2BHQEdwRyBHQEdwR0BHYEdwR4BHIEeAR5BHIEdgR6BHcEcgR5BGMEewRwBG8EbwR8BHsEZgR8BG8EfQR+BH8EfwSABH0EfwR+BIEEgQSCBH8EgwR/BIIEfwSDBIQEhASFBH8EhASDBIYEhgSDBIcEhwR+BIgEiASJBIcEhwSKBIYEiwSMBI0EjgSKBIcEhwSJBI4EhwSDBI8EggSPBIMEjwSQBIcEkASBBH4EfgSHBJAEkQSGBIoEigSSBJEEkwSUBJUElQSWBJMElwSYBJkEmQSaBJcEmwScBJ0EnQSeBJsEnwSgBKEEoQSiBJ8EowSkBKUEpQSmBKMEpwSoBKkEqQSqBKcEqwSqBKkEqQSsBKsErASpBK0ErgStBKkEqQSvBK4EsAStBK4EsQStBLAEsgSqBLEEsQSzBLIEsAS0BLEEtQS2BLcEuASzBLEEsQS0BLgEuQStBLEErQS5BKwEsQS6BLkEugSxBKoEqgSrBLoEtASwBLsEuwS8BLQEvQS+BL8EvwTABL0EwQTCBMMEwwTEBMEExQTGBMcExwTIBMUEyQTKBMsEywTMBMkEzQTOBM8EzwTQBM0E0QTSBNME0wTUBNEE1QTRBNQE1ATWBNUE1wTVBNYE1gTYBNcE2QTXBNgE2ATaBNkE2wTZBNoE2gTcBNsE3QTbBNwE3ATeBN0E3wTdBN4E3gTgBN8E4QTTBNIE0gTiBOEE4wThBOIE4gTkBOME5QTjBOQE5ATmBOUE5wTlBOYE5gToBOcE6QTnBOgE6ATqBOkE6wTpBOoE6gTsBOsE7QTrBOwE7ATuBO0E7wTtBO4E7gTwBO8E8QTvBPAE8ATyBPEE8wTxBPIE8gT0BPME9QTzBPQE9AT2BPUE9wT1BPYE9gT4BPcE+QT6BPsE+wT8BPkE+gT9BP4E/gT7BPoE/QT/BAAFAAX+BP0E/wQBBQIFAgUABf8EAQUDBQQFBAUCBQEFBQUEBQMFAwUGBQUFBwUFBQYFBgUIBQcFCQUHBQgFCAUKBQkFCwUJBQoFCgUMBQsFDQULBQwFDAUOBQ0FDwUNBQ4FDgUQBQ8FEQUPBRAFEAUSBREFEwURBRIFEgUUBRMFFQUTBRQFFAUWBRUFFwUVBRYFFgUYBRcFGQUXBRgFGAUaBRkFGwUZBRoFGgUcBRsFHQUbBRwFHAUeBR0FHwUdBR4FHgUgBR8FIQUiBSMFIwUkBSEFJQUhBSQFJAUmBSUFIQUlBScFJwUoBSEFIgUhBSgFKAUpBSIFKgUlBSYFJgUrBSoFJQUqBSwFJQUsBScFKgUtBSwFKgUrBS4FKwUvBS4FKgUuBTAFMQUjBSIFIgUyBTEFMgUiBSkFMwUxBTIFMgU0BTMFNQUzBTQFNAU2BTUFNwU1BTYFNgU4BTcFOQU3BTgFOAU6BTkFOwU5BToFOwU8BTkFOwU9BTwFPgU8BT0FPQU/BT4FQAU+BT8FPwVBBUAFQgVABUEFQQVDBUIFRAVCBUMFQwVFBUQFRgVEBUUFRQVHBUYFSAVGBUcFSAVJBUYFSAVKBUkFSQVLBUYFRwVFBUwFTAVNBUcFSAVHBU0FTQVOBUgFRQVDBU8FTwVMBUUFQwVBBVAFUAVPBUMFUQVQBUEFQQU/BVEFTgVNBVIFUgVTBU4FTQVMBVQFVAVSBU0FUgVUBVUFVQVWBVIFUwVSBVYFVgVXBVMFTAVPBVgFWAVUBUwFVAVYBVkFWQVVBVQFTwVQBVoFWgVYBU8FWAVaBVsFWwVZBVgFUAVRBVwFXAVaBVAFWgVcBV0FXQVbBVoFXgVRBT8FPwU9BV4FXwVeBT0FPQU7BV8FYAVfBTsFOwVhBWAFYgVdBVwFXAVjBWIFZAVjBVwFZAVcBVEFUQVlBWQFUQVeBWUFZQVeBV8FZgVhBTsFOwU6BWYFZwVmBToFOgU4BWcFaAVnBTgFOAU2BWgFaQVoBTYFNgU0BWkFagVpBTQFNAUyBWoFKQVqBTIFZwVoBWsFawVsBWcFbAVrBW0FbQVuBWwFaAVpBW8FbwVrBWgFawVvBXAFcAVtBWsFaQVqBXEFcQVvBWkFbwVxBXIFcgVwBW8FagUpBXMFcwVxBWoFdAVzBSkFKQUoBXQFdQV0BSgFKAUnBXUFdAV1BXYFdgV3BXQFcwV0BXcFdwV4BXMFcQVzBXgFeAVyBXEFeQV1BScFJwUsBXkFegV2BXUFdQV5BXoFbgV7BXwFfAVsBW4FbAV8BX0FbAV9BX4FfgVnBWwFZgVnBX4FfgV9BX8FYQVmBX4FgAVhBX4FfgV/BYAFYAVhBYAFXwVgBYEFZQVfBYEFgQWCBWUFZAVlBYIFgwWEBYUFhQWGBYMFhwWDBYYFhgWIBYcFiQWHBYgFiAWKBYkFiwWFBYQFhAWMBYsFjQWLBYwFjAWOBY0FjwWNBY4FjgWQBY8FkQWPBZAFkAWSBZEFkwWRBZIFkgWUBZMFlQWTBZQFlAWWBZUFlwWVBZYFlgWYBZcFmQWXBZgFmAWaBZkFmwWZBZoFmgWcBZsFnQWbBZwFnAWeBZ0FnwWdBZ4FngWgBZ8FoQWfBaAFogWhBaAFogWgBaMFpAWiBaMFowWlBaQFpgWnBagFqAWpBaYFqgWoBacFpwWrBaoFrAWqBasFqwWtBawFrgWsBa0FrQWvBa4FsAWuBa8FrwWxBbAFsgWwBbEFsQWzBbIFtAWyBbMFswW1BbQFtgW0BbUFtQW3BbYFuAW2BbcFtwW5BbgFugW4BbkFuQW7BboFvAW6BbsFuwW9BbwFvgW8Bb0FvQW/Bb4FwAW+Bb8FvwXBBcAFwgXABcEFwQXDBcIFwwXBBcQFxAXFBcMFwQW/BcYFxgXEBcEFvwW9BccFxwXGBb8FvQW7BcgFyAXHBb0FuwW5BckFyQXIBbsFygXJBbkFuQW3BcoFywXKBbcFtwW1BcsFzAXLBbUFtQWzBcwFzQXMBbMFswWxBc0FzgXNBbEFsQWvBc4FzwXOBa8FrwWtBc8F0AXPBa0FrQWrBdAF0AWrBacFpwXRBdAFLgUvBdIF0gXTBS4F0wXSBdQF1AXVBdMF1QXUBdYF1gXXBdUF2AXZBdoF2gXbBdgF3AXdBd4F3gXfBdwF4AXhBeIF4gXjBeAF5AXlBeYF5gXnBeQF6AXpBeoF6gXrBegF7AXtBe4F7gXvBewF8AXxBfIF8gXzBfAF9AX1BfYF9gX3BfQF+AX5BfoF+gX7BfgF/AX9Bf4F/gX/BfwFAAYBBgIGAgYDBgAGBAYFBgYGBgYHBgQGCAYJBgoGCgYLBggGDAYNBg4GDgYPBgwGEAYRBhIGEgYTBhAGFAYVBhYGFgYXBhQGGAYZBhoGGgYbBhgGHAYdBh4GHgYfBhwGIAYhBiIGIgYjBiAGJAYlBiYGJwYkBiYGJAYnBigGKQYkBigGJAYpBioGKwYkBioGJAYrBiwGJAYsBi0GLAYuBi0GJAYtBi8GMAYkBi8GJAYwBjEGMgYkBjEGJAYyBjMGNAYkBjMGJAY0BjUGNgYkBjUGJAY2BjcGJQYkBjcGqQWoBTgGOAY5BqkFqQU5BjoGOgY7BqkFOwY6BjwGPQY4BqgFqAWqBT0GPgY9BqoFqgWsBT4GPwY+BqwFrAWuBT8GQAY/Bq4FrgWwBUAGQQZABrAFsAWyBUEGQgZBBrIFsgW0BUIGQwZCBrQFtAW2BUMGRAZDBrYFtgW4BUQGRQZEBrgFuAW6BUUGRgZFBroFugW8BUYGRwZGBrwFvAW+BUcGSAZHBr4FvgXABUgGSQZIBsAFwAXCBUkGSgZLBkwGTAZNBkoGTgZNBkwGTAZPBk4GTgZPBlAGUAZRBk4GUQZQBlIGUgZTBlEGUwZSBlQGVAZVBlMGVQZUBlYGVgZXBlUGSwZKBlgGWAZZBksGVwZWBloGWgZbBlcGXAZdBl4GXgZfBlwGXwZeBmAGYAZhBl8GYQZgBmIGYgZjBmEGYwZiBmQGZAZlBmMGZgZlBmQGZAZnBmYGXQZcBmgGaAZpBl0GagZrBmwGbAZtBmoGbgZtBmwGbAZvBm4GcAZuBm8GcAZvBnEGcAZxBnIGcAZyBnMGdAZrBmoGagZ1BnQGdgZ0BnUGdQZ3BnYGeAZ2BncGdwZ5BngGegZ4BnkGeQZ7BnoGegZ7BnwGfAZ9BnoGfQZ8Bn4GfgZ/Bn0GgAZ/Bn4GfgaBBoAGggaABoEGgQaDBoIGhAaCBoMGgwaFBoQGhgaEBoUGhQaHBoYGiAaGBocGhwaJBogGigaIBokGiQaLBooGigaLBowGjAaNBooGjgaPBpAGjgaQBpEGjgaRBpIGkwaUBpUGlQaWBpMGlwaYBpkGmQaaBpcGmwaXBpoGmgacBpsGnQabBpwGnAaeBp0GnwagBqEGoQaiBp8GowakBqUGpQamBqMGpwajBqYGpgaoBqcGqQanBqgGqAaqBqkGkwWVBasGqwasBpMFrAarBq0GqwauBq0GqwavBq4GrAatBrAGrQaxBrAGrQayBrEGswa0BrUGtQa2BrMGtga1BrcGtwa4BrYGuAa3BrkGuQa6BrgGuga5BrsGuwa8BroGvAa7Br0GvQa+BrwGvga9Br8GvwbABr4GwAa/BsEGwQbCBsAGtAazBsMGwwbEBrQGxAbDBsUGxQbGBsQGxgbFBscGxwbIBsYGyAbHBskGyQbKBsgGygbJBssGywbMBsoGzAbLBs0GzQbOBswGzgbNBs8GzwbQBs4G0AbPBtEG0QbSBtAG0gbRBtMG0wbUBtIG1AbTBtUG1QbWBtQG1gbVBtcG1wbYBtYG2AbXBtkG2QbaBtgG2wbcBt0G3QbeBtsG3AbbBt8G3wbgBtwG4AbfBuEG4QbiBuAG4gbhBuMG4wbkBuIG5AbjBuUG5QbmBuQG5gblBucG5wboBuYG6AbnBukG6QbqBugG6gbpBusG6wbsBuoG7AbrBu0G7QbuBuwG7gbtBu8G7wbwBu4G8AbvBvEG8QbyBvAG8gbxBvMG8wb0BvIG9AbzBvUG9Qb2BvQG9gb1BvcG9wb4BvYG+Ab3BvkG+Qb6BvgG+gb5BvsG+wb8BvoG/Ab7Bv0G/Qb+BvwG/gb9Bv8G/wYAB/4GAAf/BgEHAQcCBwAHAwcEBwUHBQcGBwMHBAcDBwcHBwcIBwQHCQcHBwMHAwcKBwkHCgcDBwYHBgcLBwoHCAcHBwwHDAcNBwgHBwcJBw4HBwcOBwwHDgcPBwwHEAcNBwwHEAcRBw0HEQcSBw0HBgcFBxMHEwcUBwYHCwcGBxQHFAcTBxUHFQcWBxQHFgcVBxcHFwcYBxYHGAcXBxkHGQcaBxgHGgcZBxsHGwccBxoHHQccBxsHHQcbBx4HHQceBx8HHwceByAHIAchBx8HIQcgByIHIgcjByEHIwciByQHJAclByMHJQckByYHJgcnByUHJwcmBygHKAcpBycHKgcpBygHKgcoBysHKAcsBysHKgcrBy0HLgcnBykHKQcvBy4HLwcpByoHKgcwBy8HJwcuBzEHMQclBycHJQcxBzIHMgcjByUHIwcyBzMHNAcvBzAHMAc1BzQHNgcuBy8HLwc0BzYHNwc2BzQHNAc4BzcHOAc0BzUHNQc5BzgHOgcxBy4HLgc2BzoHNgc3BzsHOwc6BzYHPAcyBzEHMQc6BzwHOgc7Bz0HPQc8BzoHPgczBzIHMgc8Bz4HPAc9Bz8HPwc+BzwHPgc/B0AHQAdBBz4HQgc+B0EHMwc+B0IHQgdDBzMHQgdEB0MHQwdEB0UHRQdGB0MHRgdFB0cHHQdGB0cHRwdIBx0HRgcdBx8HHwdJB0YHQwdGB0kHSQcfByEHIQczB0kHMwdDB0kHMwchByMHHQdIB0oHSgccBx0HHAdKB0sHSwcaBxwHGgdLB0wHTAcYBxoHGAdMB00HTQcWBxgHFgdNB04HTgcUBxYHFAdOBwsHTwdMB0sHSwdQB08HUQdPB1AHUAdSB1EHUwdNB0wHTAdPB1MHTwdRB1QHVAdTB08HVQdOB00HTQdTB1UHUwdUB1YHVgdVB1MHVwcLB04HTgdVB1cHCwdXB1gHWAcKBwsHCgdYB1kHWQcJBwoHWgdZB1gHWAdbB1oHWwdYB1cHVwdcB1sHVQdWB1wHXAdXB1UHCQdZB10HXQcOBwkHXgddB1kHWQdaB14HUgdQB18HUAdgB18HYQdgB1AHUAdLB2EHSgdhB0sHYQdiB2AHSAdhB0oHYwdiB2EHYQdIB2MHRwdjB0gHXwdkB1IHZQdmB2cHZwdoB2UHaAdnB2kHaQdqB2gHagdpB2sHawdsB2oHZgdlB20HbQduB2YHbgdtB28HbwdwB24HcAdvB3EHcQdyB3AHcgdxB3MHcwd0B3IHdAdzB3UHdQd2B3QHdgd1B3cHdwd4B3YHeAd3B3kHeQd6B3gHegd5B3sHewd8B3oHfAd7B30HfQd+B3wHfgd9B38HfweAB34HgAd/B4EHgQeCB4AHggeBB4MHhAeCB4MHhAeFB4IHhQeEB4YHhgeHB4UHiAeJB4oHigeLB4gHiweKB4wHjAeNB4sHjQeMB44HjgePB40HjweOB5AHkAeRB48HkQeQB5IHkgeTB5EHkweSB5QHlAeVB5MHlQeUB5YHlgeXB5UHlweWB5gHmAeZB5cHmQeYB5oHmgebB5kHmweaB5wHnAedB5sHnQecB54HngefB50HnweeB6AHoAehB58HoQegB6IHogejB6EHoweiB6QHpAelB6MHpgejB6UHpQenB6YHowemB6gHqAehB6MHoQeoB6kHqQefB6EHnwepB6oHqgedB58HnQeqB6sHqwebB50HmwerB6wHrAeZB5sHmQesB60HrQeXB5kHlwetB64HrgeVB5cHlQeuB68HrweTB5UHkwevB7AHsAeRB5MHkQewB7EHsQePB5EHjwexB7IHsgeNB48HjQeyB7MHsweLB40HEgcRB7QHtAe1BxIHtQe0B7YHtge3B7UHtwe2B7gHuAe5B7cHuge7B7wHvAe9B7oHvge/B8AHwAfBB74HwgfDB8QHxAfFB8IHxgfHB8gHyAfJB8YHygfLB8wHzAfNB8oHzgfPB9AH0AfRB84H0gfTB9QH1AfVB9IH1gfXB9gH2AfZB9YH2gfbB9wH3AfdB9oH3gffB+AH4AfhB94H4gfjB+QH5AflB+IH5gfnB+gH6AfpB+YH6gfrB+wH7AftB+oH7gfvB/AH8AfxB+4H8gfzB/QH9Af1B/IH9gf3B/gH+Af5B/YH+gf7B/wH/Af9B/oH/gf/BwAIAAgBCP4HAggDCAQIBAgFCAIIBggHCAgICQgHCAYIBggKCAkICwgKCAYIBggMCAsIDQgMCAYIBggOCA0IBggPCA4IDwgQCA4IBggRCA8IEggRCAYIBggTCBIIFAgTCAYIBggVCBQIFggVCAYIBggXCBYIGAgXCAYIBggZCBgICAgZCAYIGgiKB4kHiQcbCBoIGwiJBxwIHAgdCBsIHggdCBwIigcaCB8IHwiMB4oHjAcfCCAIIAiOB4wHjgcgCCEIIQiQB44HkAchCCIIIgiSB5AHkgciCCMIIwiUB5IHlAcjCCQIJAiWB5QHlgckCCUIJQiYB5YHmAclCCYIJgiaB5gHmgcmCCcIJwicB5oHnAcnCCgIKAieB5wHngcoCCkIKQigB54HoAcpCCoIKgiiB6AHogcqCCsIKwikB6IHLAgtCC4ILggvCCwILAgvCDAIMAgxCCwIMggxCDAIMAgzCDIINAgyCDMIMwg1CDQINgg0CDUINQg3CDYIOAg2CDcINwg5CDgIOgguCC0ILQg7CDoIPAg4CDkIOQg9CDwIPgg/CEAIQAhBCD4IQgg+CEEIQQhDCEIIRAhCCEMIQwhFCEQIRghECEUIRQhHCEYIRghHCEgISAhJCEYISghACD8IPwhLCEoITAhNCE4ITghPCEwITAhPCFAIUAhRCEwIUghRCFAIUghTCFEIUghUCFMIUghVCFQITghNCFYIVghXCE4IVwhWCFgIWAhZCFcIWQhYCFoIWghbCFkIWwhaCFwIXAhdCFsIXghdCFwIXAhfCF4IYAheCF8IXwhhCGAIYAhhCGIIYghjCGAIYwhiCGQIZAhlCGMIZQhkCGYIZghnCGUIZwhmCGgIaAhpCGcIaQhoCGoIaghrCGkIawhqCGwIbAhtCGsIbghtCGwIbAhvCG4IcAhxCHIIcAhyCHMIcAhzCHQIdQh2CHcIdwh4CHUIeQh6CHsIewh8CHkIfAh7CH0IfQh+CHwIfgh9CH8IfwiACH4IgQiCCIMIgwiECIEIhQiGCIcIhwiICIUIiAiHCIkIiQiKCIgIigiJCIsIiwiMCIoIdQeNCI4Ijgh3B3UHjwiOCI0IjwiQCI4IkAiRCI4IjwiNCJIIjwiSCJMIjwiTCJQIlQiWCJcIlwiYCJUImQiYCJcIlwiaCJkImwiWCJUIlQicCJsImwicCJ0InQieCJsImQiaCJ8InwigCJkIoQigCJ8InwiiCKEIoQiiCKMIowikCKEIpQikCKMIowimCKUIpQimCKcIpwioCKUIqQioCKcIpwiqCKkIqQiqCKsIqwisCKkIrQisCKsIqwiuCK0IrQiuCK8IrwiwCK0IsQiwCK8IrwiyCLEIsQiyCLMIswi0CLEItQi0CLMIswi2CLUItwi0CLUIsQi0CLcItQi4CLcIuQi4CLUItQi6CLkItwi7CLEIsQi7CLwIvAiwCLEIrQiwCLwIvAi9CK0IrQi9CL4IvgisCK0IqQisCL4Ivgi/CKkIqQi/CMAIwAioCKkIpQioCMAIwAjBCKUIpQjBCMIIwgikCKUIoQikCMIIwgjDCKEIoQjDCMQIxAigCKEIoAjECMUIxQiZCKAImQjFCMYIxgiYCJkIlQiYCMYIxgjHCJUIlQjHCMgIyAicCJUIyQjKCMsIywjMCMkIzQjJCMwIzAjOCM0IzwjNCM4IzgjQCM8I0QjPCNAI0AjSCNEI0wjRCNII0gjUCNMI1QjTCNQI1AjWCNUI1wjVCNYI1gjYCNcI2QjXCNgI2AjaCNkI2wjZCNoI2gjcCNsI3QjbCNwI3AjeCN0I3wjdCN4I3gjgCN8I4QjfCOAI4AjiCOEI4wjhCOII4gjkCOMI5QjjCOQI5AjmCOUI5wjlCOYI5gjoCOcIygjnCOgI6AjLCMoI6QjqCOsI6wjsCOkI7QjpCOwI7AjuCO0I7wjtCO4I7gjwCO8I8QjvCPAI8AjyCPEI8wjxCPII8gj0CPMI9QjrCOoI6gj2CPUI9wj1CPYI9gj4CPcI+Qj3CPgI+Aj6CPkI+wj5CPoI+gj8CPsI/Qj7CPwI/Aj+CP0I/wj9CP4I/ggACf8IAQn/CAAJAAkCCQEJAwkBCQIJAgkECQMJBQkDCQQJBAkGCQUJBwkFCQYJBgkICQcJCQkHCQgJCAkKCQkJCwkMCQ0JDQkOCQsJDwkOCQ0JDQkQCQ8JDwkQCREJEQkSCQ8JEwkSCREJEQkUCRMJFQkMCQsJCwkWCRUJFQkWCRcJFwkYCRUJGQkYCRcJFwkaCRkJGQkaCRsJGwkcCRkJHQkcCRsJGwkeCR0JHQkeCR8JHwkgCR0JIQkgCR8JHwkiCSEJIQkiCSMJIwkkCSEJJQkkCSMJIwkmCSUJJQkmCScJJwkoCSUJKQkoCScJJwkqCSkJKwksCS0JLQkuCSsJLwkwCTEJLwkxCTIJMQkzCTIJLwkyCTQJMgk1CTQJMgk2CTUJNQk3CTQJLwk0CTgJNAk5CTgJNAk6CTkJOQk7CTgJLwk4CTwJOAk9CTwJPgkvCTwJPwlACUEJQQlCCT8JQwk/CUIJQglECUMJPwlDCUUJRQlGCT8JQAk/CUYJRglHCUAJSAlBCUAJQAlJCUgJSQlACUcJRwlKCUkJSglHCUsJSwlHCUYJSwlMCUoJTAlNCUoJTAlOCU0JTAlPCU4JSglNCVAJUAlJCUoJUAlICUkJUQlGCUUJRglRCUsJRQlSCVEJUAlTCUgJUAlUCVMJVQlSCUUJRQlWCVUJVwlVCVYJVglYCVcJWQlWCUUJRQlDCVkJWglZCUMJQwlECVoJWQlaCVsJWwlcCVkJXAlYCVYJVglZCVwJXQleCV8JXwlgCV0JYQlgCV8JXwliCWEJXgldCWMJYwlkCV4JZAljCWUJZQlmCWQJZwlmCWUJZQloCWcJZwloCWkJaQlqCWcJawlqCWkJaQlsCWsJbQluCW8JbwlwCW0JcQlyCXMJcwl0CXEJdQl0CXMJcwl2CXUJdwl1CXYJdgl4CXcJeQl3CXgJeAl6CXkJeQl6CXsJewl8CXkJfAl7CX0JfQl+CXwJfgl9CX8JfwmACX4JgQmACX8JfwmCCYEJgwmBCYIJggmECYMJgwmECYUJhQmGCYMJhwmICYkJiQmKCYcJiwmKCYkJiQmMCYsJjQmOCY8JjwmQCY0JkQmNCZAJkAmSCZEJkwmPCY4JjgmUCZMJlQmTCZQJlAmWCZUJlwmRCZIJkgmYCZcJmQmXCZgJmAmaCZkJmQmaCZsJmwmcCZkJnQmcCZsJmwmeCZ0JnwmdCZ4JngmgCZ8JoQmfCaAJoAmiCaEJowmhCaIJogmkCaMJpQmjCaQJpAmmCaUJpQmmCacJpwmoCaUJqQmoCacJpwmqCakJqwmpCaoJqgmsCasJrQmrCawJrAmuCa0JrwmtCa4JrgmwCa8JrwmwCbEJsQmyCa8JsgmxCbMJswm0CbIJtQm0CbMJswm2CbUJtwm4CbkJuQm6CbcJuwm6CbkJuQm8CbsJvQm4CbcJtwm+Cb0Juwm8Cb8JvwnACbsJwQnACb8JvwnCCcEJwQnCCcMJwwnECcEJxQnECcMJwwnGCcUJxQnGCccJxwnICcUJyQnICccJxwnKCckJyQnKCcsJywnMCckJzQnMCcsJywnOCc0JzQnOCc8JzwnQCc0J0QnQCc8JzwnSCdEJ0QnSCdMJ0wnUCdEJ1QnUCdMJ0wnWCdUJ1wnUCdUJ0QnUCdcJ1QnYCdcJ2QnYCdUJ1QnaCdkJ1wnbCdEJ0QnbCdwJ3AnQCdEJzQnQCdwJ3AndCc0JzQndCd4J3gnMCc0JyQnMCd4J3gnfCckJyQnfCeAJ4AnICckJxQnICeAJ4AnhCcUJxQnhCeIJ4gnECcUJwQnECeIJ4gnjCcEJwQnjCeQJ5AnACcEJwAnkCeUJ5Qm7CcAJuwnlCeYJ5gm6CbsJtwm6CeYJ5gnnCbcJtwnnCegJ6Am+CbcJvQm+CekJ6QnqCb0J6wnsCe0J7QnuCesJ7wnrCe4J7gnwCe8J8QnvCfAJ8AnyCfEJ8wnxCfIJ8gn0CfMJ9QnzCfQJ9An2CfUJ9wn1CfYJ9gn4CfcJ+Qn3CfgJ+An6CfkJ+wn5CfoJ+gn8CfsJ/Qn7CfwJ/An+Cf0J/wn9Cf4J/gkACv8JAQr/CQAKAAoCCgEKAwoBCgIKAgoECgMKBQoDCgQKBAoGCgUKBwoFCgYKBgoICgcKCQoHCggKCAoKCgkK7AkJCgoKCgrtCewJCwoMCg0KDQoOCgsKDwoLCg4KDgoQCg8KEQoPChAKEAoSChEKEwoRChIKEgoUChMKFQoNCgwKDAoWChUKFwoVChYKFgoYChcKGQoXChgKGAoaChkKGwoZChoKGgocChsKHQobChwKHAoeCh0KHwodCh4KHgogCh8KIQofCiAKIAoiCiEKIwohCiIKIgokCiMKJQojCiQKJAomCiUKJwolCiYKJgooCicKKQonCigKKAoqCikKKwopCioKKgosCisKLQouCi8KLwowCi0KMQowCi8KLwoyCjEKMQoyCjMKMwo0CjEKNQo0CjMKMwo2CjUKNwouCi0KLQo4CjcKNwo4CjkKOQo6CjcKOwo6CjkKOQo8CjsKOwo8Cj0KPQo+CjsKPwo+Cj0KPQpACj8KPwpACkEKQQpCCj8KQwpCCkEKQQpECkMKQwpECkUKRQpGCkMKRwpGCkUKRQpICkcKRwpICkkKSQpKCkcKSwpKCkkKSQpMCksKTQpOCk8KTwpQCk0KUQpSClMKUQpTClQKUwpVClQKUQpUClYKVApXClYKVApYClcKVwpZClYKUQpWCloKVgpbCloKVgpcClsKWwpdCloKUQpaCl4KWgpfCl4KYApRCl4KYQpiCmMKYwpkCmEKZQpjCmIKYgpmCmUKZwpoCmkKaQpqCmcKawphCmQKZApsCmsKbQprCmwKbApuCm0KbwpwCnEKcQpyCm8KcwpvCnIKcgp0CnMKdQptCm4Kbgp2CnUKdwp1CnYKdgp4CncKeQp3CngKeAp6CnkKewp5CnoKegp8CnsKfQp7CnwKfAp+Cn0Kfwp9Cn4KfgqACn8KgQp/CoAKgAqCCoEKgwqECoUKhQqGCoMKhwqICokKiQqKCocKiwqHCooKigqMCosKjQqLCowKjAqOCo0KjwqQCpEKkAqSCpMKkwqRCpAKlAqTCpIKkgqVCpQKlgqUCpUKlQqXCpYKmAqWCpcKlwqZCpgKmgqYCpkKmQqbCpoKmgqbCpwKnAqdCpoKkQqeCo8KnwqPCp4KngqgCp8KoQqfCqAKoAqiCqEKoQqiCqMKowqkCqEKpQqkCqMKowqmCqUKpwqlCqYKpgqoCqcKqQqnCqgKqAqqCqkKqwqpCqoKqgqsCqsKrQqrCqwKrAquCq0KrwqtCq4KrgqwCq8KsQqvCrAKsAqyCrEKswqxCrIKsgq0CrMKtQq2CrcKtQq3CrgKtwq5CrgKtQq4CroKuAq7CroKuwq8CroKtQq6Cr0Kugq+Cr0Kugq/Cr4KugrACr8KvwrBCr4KwQrCCr4KvgrDCr0KvgrECsMKxArFCsMKxgrHCsgKyQrKCssKywrMCskKzQrMCssKywrOCs0KzgrLCs8KzwrQCs4K0QrPCssKywrKCtEK0QrKCtIK0grTCtEK1ArOCtAK0ArVCtQK1grXCtgK2ArZCtYK2QrYCtoK2grbCtkK1wrWCtwK3ArdCtcK3grbCtoK2grfCt4K4ArZCtsK1grZCuAK2wrhCuAK4AriCtYK3ArWCuIK4grjCtwK5ArcCuMK3QrcCuQK4wrlCuQK5ArlCuYK5grnCuQK5wrmCugK6ArpCucK5ArnCuoK6grnCukK6grrCuQK5ArrCt0K6QrsCuoK7ArpCu0K6QruCu0K7grvCu0K8AruCukK6ArwCukK6ArxCvAK6AryCvEK8wrhCtsK2wreCvMK9Ar1CvYK9gr3CvQK+Ar3CvYK9gr5CvgK+Qr2CvoK+gr7CvkK/Ar5CvsK+wr9CvwK/gr8Cv0K/Qr/Cv4KAAv+Cv8K/woBCwAL9QoACwELAgv6CvYK9gr1CgILAQsCC/UKAwsECwULBgsDCwULBwsGCwULAwsGCwgLCAsJCwMLCQsICwoLCgsLCwkLDAsLCwoLCgsNCwwLDgsMCw0LDQsPCw4LEAsOCw8LDwsRCxALEgsQCxELEQsTCxILFAsSCxMLEwsVCxQLFgsUCxULFQsXCxYLGAsWCxcLFwsZCxgLGAsZCxoLGgsbCxgLGwsaCxwLHAsdCxsLHgsdCxwLHAsfCx4LIAseCx8LHwshCyALIgsjCyQLJAslCyILJgsnCygLKAspCyYLKgspCygLKAsrCyoLLAsqCysLKwstCywLLgssCy0LLQsvCy4LMAsuCy8LLwsxCzALMgswCzELMQszCzILMgszCzQLNAs1CzILNAs2CzULNAs3CzYLOAs5CzoLOws8Cz0LPQs+CzsLPws7Cz4LPgtACz8LQQs/C0ALQAtCC0ELQwtBC0ILQgtEC0MLRQtDC0QLRAtGC0ULRwtFC0YLRgtIC0cLRwtIC0kLSQtKC0cLSwtKC0kLSQtMC0sLTQtLC0wLTAtOC00LTQtOC08LTwtQC00LUAtPC1ELUQtSC1ALUwtSC1ELUQtUC1MLVQtTC1QLVAtWC1ULVwtVC1YLVgtYC1cLWQtXC1gLWAtaC1kLWwtZC1oLWgtcC1sLXQtbC1wLXAteC10LXwtdC14LXgtgC18LYQtfC2ALYAtiC2ELYwtkC2ULZQtmC2MLZwtlC2QLZAtoC2cLaQtqC2sLawtsC2kLbQtrC2oLagtuC20LbwttC24LbgtwC28LcQtvC3ALcAtyC3ELcwtxC3ILcgt0C3MLcwt0C3ULdQt2C3MLdwt2C3ULdQt4C3cLdwt4C3kLeQt6C3cLewt6C3kLeQt8C3sLfQt7C3wLfAt+C30LfQt+C38LfwuAC30LgAt/C4ELgQuCC4ALgwuCC4ELgQuEC4MLhQuDC4QLhAuGC4ULhwuIC4kLiQuKC4cLiwuHC4oLiguMC4sLjQuLC4wLjAuOC40LjwuNC44LjguQC48LjwuQC5ELkQuSC48LkwuSC5ELkQuUC5MLlQuTC5QLlAuWC5ULlwuYC5kLmQuaC5cLmwuZC5gLmAucC5sLnQueC58LnwugC50LngudC6ELoQuiC54LowukC6ULpQumC6MLpwuoC6kLqQuqC6cLqAunC6sLqwusC6gLrQuuC68LrwuwC60LsQuyC7MLswu0C7ELsQu0C7ULtQu2C7ELswuyC7cLtwu4C7MLuQu4C7cLtwu6C7kLuwu2C7ULtQu8C7sLuwu8C70LvQu+C7sLvwu+C70LvQvAC78LvwvAC8ELwQvCC78LwwvCC8ELwQvEC8MLwwvEC8ULxQvGC8MLxwvGC8ULxQvIC8cLxwvIC8kLyQvKC8cLywvKC8kLyQvMC8sLywvMC80LzQvOC8sLzwvOC80LzQvQC88LzwvQC9EL0QvSC88L0wvRC9AL0QvTC9QL1AvVC9EL0AvWC9ML1gvQC80LzQvXC9YL1wvNC8wLzAvYC9cL2AvMC8kLyQvZC9gLyAvaC9kL2QvJC8gL2gvIC8ULxQvbC9oL2wvFC8QLxAvcC9sL3AvEC8ELwQvdC9wL3QvBC8ALwAveC90L3gvAC70LvQvfC94L3wu9C7wLvAvgC98L4Au8C7ULtQvhC+AL4Qu1C7QLtAviC+EL4gu0C7MLswvjC+IL4wuzC7gLuAvkC+ML5QvmC+cL5wvoC+UL6AvnC+kL6QvqC+gL6gvpC+sL6wvsC+oL7AvrC+0L7QvuC+wL7gvtC+8L7wvwC+4L8AvvC/EL8QvyC/AL8gvxC/ML8wv0C/IL9AvzC/UL9Qv2C/QL9gv1C/cL9wv4C/YL+Av3C/kL+Qv6C/gL+gv5C/sL+wv8C/oL/Av7C/0L/Qv+C/wL/gv9C/8L/wsADP4LAAz/CwEMAQwCDAAMAgwBDAMMAwwEDAIMBAwDDOYL5gvlCwQMBQwGDAcMBwwIDAUMCAwHDAkMCQwKDAgMCgwJDAsMCwwMDAoMDAwLDA0MDQwODAwMDgwNDA8MDwwQDA4MBgwFDBEMEQwSDAYMEgwRDBMMEwwUDBIMFAwTDBUMFQwWDBQMFgwVDBcMFwwYDBYMGAwXDBkMGQwaDBgMGgwZDBsMGwwcDBoMHAwbDB0MHQweDBwMHgwdDB8MHwwgDB4MIAwfDCEMIQwiDCAMIgwhDCMMIwwkDCIMJAwjDCUMJQwmDCQMJwwoDCkMKQwqDCcMJwwqDCsMKwwsDCcMLQwsDCsMKwwuDC0MLQwuDC8MLwwwDC0MKQwoDDEMMQwyDCkMMwwyDDEMMQw0DDMMMww0DDUMNQw2DDMMNww2DDUMNQw4DDcMNww4DDkMOQw6DDcMOww6DDkMOQw8DDsMOww8DD0MPQw+DDsMPww+DD0MPQxADD8MPwxADEEMQQxCDD8MQwxCDEEMQQxEDEMMQwxEDEUMRQxGDEMMRwxIDEkMSQxKDEcMSwxMDE0MSwxNDE4MTQxPDE4MTQxQDE8MTQxRDFAMTQxSDFEMUQxTDFAMUAxUDE8MUAxVDFQMVAxWDE8MTwxXDE4MTwxYDFcMVwxZDE4MSwxODFoMWwxcDF0MXQxeDFsMXAxbDF8MXwxgDFwMYQxfDFsMWwxiDGEMYgxbDF4MXgxjDGIMXgxdDGQMZAxlDF4MYwxeDGUMZQxmDGMMZwxjDGYMYgxjDGcMZgxoDGcMaAxmDGkMaAxpDGoMaAxqDGsMZgxlDGwMbAxpDGYMbAxlDGQMYQxiDG0MZwxtDGIMbQxuDGEMbAxkDG8MbAxvDHAMYQxuDHEMcgxxDHMMcwx0DHIMcgx0DHUMdQx2DHIMYQxyDHYMcQxyDGEMdgxfDGEMXwx2DHcMdwxgDF8Mdgx1DHgMeAx3DHYMeQx6DHsMewx8DHkMfAx7DH0MfQx+DHwMegx5DH8MfwyADHoMgAx/DIEMgQyCDIAMgwyCDIEMgQyEDIMMgwyEDIUMhQyGDIMMhgyFDIcMhwyIDIYMiQyKDIsMiwyMDIkMjQyODI8MjwyQDI0MkAyPDJEMkQySDJAMkgyRDJMMkwyUDJIMlAyTDJUMlQyWDJQMlgyVDJcMlwyYDJYMmAyXDJkMmQyaDJgMmgyZDJsMmwycDJoMnAybDJ0MnQyeDJwMngydDJ8MnwygDJ4MoAyfDKEMoQyiDKAMowykDKUMpQymDKMMpwyoDKkMqQyqDKcMqwysDK0MrQyuDKsMrgytDK8MrwywDK4MrAyrDLEMsQyyDKwMsgyxDLMMswy0DLIMsAyvDLUMtQy2DLAMtgy1DLcMtwy4DLYMuQy4DLcMtwy6DLkMuQy6DLsMuwy8DLkMvAy7DL0MvQy+DLwMvgy9DL8MvwzADL4MwAy/DMEMwQzCDMAMwgzBDMMMwwzEDMIMxQzEDMMMwwzGDMUMxQzGDMcMxwzIDMUMyAzHDMkMyQzKDMgMygzJDMsMywzMDMoMzAzLDM0MzQzODMwMzwzODM0MzQzQDM8M0QzPDNAM0AzSDNEM0QzSDNMM0wzUDNEM1QzWDNcM1wzYDNUM1QzYDNkM2QzaDNUM1wzWDNsM2wzcDNcM3QzaDNkM2QzeDN0M3QzeDN8M3wzgDN0M4QzgDN8M3wziDOEM4QziDOMM4wzkDOEM5QzkDOMM4wzmDOUM5QzmDOcM5wzoDOUM6QzoDOcM5wzqDOkM6QzqDOsM6wzsDOkM7QzsDOsM6wzuDO0M7QzuDO8M7wzwDO0M8QzwDO8M7wzyDPEM8QzyDPMM8wz0DPEM9QzzDPIM8wz1DPYM9gz3DPMM8gz4DPUM+AzyDO8M7wz5DPgM+QzvDO4M7gz6DPkM+gzuDOsM6wz7DPoM6gz8DPsM+wzrDOoM/AzqDOcM5wz9DPwM/QznDOYM5gz+DP0M/gzmDOMM4wz/DP4M/wzjDOIM4gwADf8MAA3iDN8M3wwBDQANAQ3fDN4M3gwCDQENAg3eDNkM2QwDDQINAw3ZDNgM2AwEDQMNBA3YDNcM1wwFDQQNBQ3XDNwM3AwGDQUNBw3cDNsM2wwIDQcNCQ0KDQsNCw0MDQkNDA0LDQ0NDQ0ODQwNDg0NDQ8NDw0QDQ4NEA0PDRENEQ0SDRANEg0RDRMNEw0UDRINFA0TDRUNFQ0WDRQNFg0VDRcNFw0YDRYNGA0XDRkNGQ0aDRgNGg0ZDRsNGw0cDRoNHA0bDR0NHQ0eDRwNHg0dDR8NHw0gDR4NIA0fDSENIQ0iDSANIg0hDSMNIw0kDSINJA0jDSUNJQ0mDSQNJg0lDScNJw0oDSYNKA0nDQoNCg0JDSgNKQ0qDSsNKw0sDSkNLA0rDS0NLQ0uDSwNLg0tDS8NLw0wDS4NMA0vDTENMQ0yDTANKg0pDTMNMw00DSoNNA0zDTUNNQ02DTQNNg01DTcNNw04DTYNOA03DTkNOQ06DTgNOg05DTsNOw08DToNPA07DT0NPQ0+DTwNPg09DT8NPw1ADT4NQA0/DUENQQ1CDUANQg1BDUMNQw1EDUINRA1DDUUNRQ1GDUQNRg1FDUcNRw1IDUYNSA1HDUkNSQ1KDUgNSw1MDU0NTQ1ODUsNSw1ODU8NTw1QDUsNUQ1QDU8NTw1SDVENUQ1SDVMNUw1UDVENTQ1MDVUNVQ1WDU0NVw1WDVUNVQ1YDVcNVw1YDVkNWQ1aDVcNWw1aDVkNWQ1cDVsNWw1cDV0NXQ1eDVsNXw1eDV0NXQ1gDV8NXw1gDWENYQ1iDV8NYw1iDWENYQ1kDWMNYw1kDWUNZQ1mDWMNZw1mDWUNZQ1oDWcNZw1oDWkNaQ1qDWcNaw1sDW0NbQ1uDWsNbw1wDXENbw1xDXINcQ1zDXINcQ10DXMNcQ11DXQNcQ12DXUNdQ13DXQNdA14DXMNdA15DXgNeA16DXMNcw17DXINcw18DXsNew19DXINbw1yDX4Nfw2ADYENgQ2CDX8Ngg2BDYMNgw2EDYINhQ2GDYcNhw2IDYUNgA1/DYkNiQ2KDYANig2JDYsNiw2MDYoNjQ2ODY8Njw2QDY0NkA2PDZENkQ2SDZANjA2LDZMNkw2UDYwNlA2TDZUNlQ2WDZQNlg2VDZcNlw2YDZYNmA2XDZkNmQ2aDZgNmg2ZDZsNmw2cDZoNnA2bDZ0NnQ2eDZwNng2dDZ8Nnw2gDZ4NoQ2iDaMNow2kDaENpQ2mDacNpw2oDaUNqA2nDakNqQ2qDagNqg2pDasNqw2sDaoNrQ2uDa8Nrw2wDa0NsA2vDbENsQ2yDbANsg2xDbMNsw20DbINtA2zDbUNtQ22DbQNtg21DbcNtw24DbYNuA23DbkNuQ26DbgNug25DbsNuw28DboNvA27Db0NvQ2+DbwNvg29Db8Nvw3ADb4NwA2/DcENwQ3CDcANww3EDcUNxQ3GDcMNxg3FDccNxw3IDcYNrg2tDckNyQ3KDa4Nyg3JDcsNyw3MDcoNzA3LDc0NzQ3ODcwNzw3QDdEN0Q3SDc8N0g3RDdMN0w3UDdIN1A3TDdUN1Q3WDdQN1w3YDdkN1w3ZDdoN2Q3bDdoN2Q3cDdsN3A3dDdsN2w3eDdoN3g3fDdoN3g3gDd8N4A3hDd8N4A3iDeEN4Q3jDd8N3w3kDdoN3w3lDeQN3w3mDeUN5g3nDeUN6A3pDeoN6w3sDe0N7Q3uDesN7Q3sDe8N7w3wDe0N8Q3tDfAN8A3yDfEN7Q3xDfMN8w3uDe0N9A3uDfMN8w31DfQN8g3wDfYN9g33DfIN+A35DfoN+g37DfgN/A34DfsN+w39DfwN/g36DfkN+Q3/Df4N/A39DQAOAA4BDvwN/Q37DQIOAg77DfoNAg4DDv0N+g0EDgIOBA76Df4N/g0FDgQOBQ7+DQYOBg7+Df8NBg4HDgUOCA4HDgYOBg4JDggOCg4IDgkOCQ4LDgoODA4JDgYOCw4JDgwOBg4NDgwO/w0NDgYODA4ODgsODg4PDgsODw4QDgsODw4RDhAOCw4QDhIOCg4LDhIOCg4SDhMOCg4TDhQO/Q0DDhUOFQ4ADv0NFg4XDhgOGA4ZDhYOFw4WDhoOGg4bDhcOHA4XDhsOGw4dDhwOHQ4bDh4OHg4fDh0OHw4eDiAOIA4hDh8OIQ4gDiIOIg4jDiEOIw4iDhgOFw4cDiQOJA4YDhcOGA4kDiMOJQ4mDicOKA4lDicOKA4nDikOKQ4nDioOKg4rDikOKw4qDiwOLA4tDisOLQ4sDi4OLg4vDi0OLw4uDjAOMA4xDi8OMQ4wDjIOMg4zDjEOMw4yDjQONA41DjMONQ40DjYONg43DjUONw42DjgOOA45DjcOOQ44DjoOOg47DjkOPA47DjoOOg49DjwOPg48Dj0OPQ4/Dj4OPg4/DkAOQA5BDj4OQQ5ADkIOQg5DDkEORA5FDkYORg5HDkQOSA5JDkoOSg5LDkgOSw5KDkwOTA5NDksOTQ5MDk4OTg5PDk0OTw5ODlAOUA5RDk8OUQ5QDlIOUg5TDlEOUw5SDlQOVA5VDlMOVg5VDlQOVA5XDlYOVg5XDlgOVg5YDlkOVg5ZDloOWw5cDl0OXQ5eDlsOXg5dDl8OXw5gDl4OYA5fDmEOYQ5iDmAOYg5hDmMOYw5kDmIOZA5jDmUOZQ5mDmQOZg5lDmcOZw5oDmYOaQ5oDmcOZw5qDmkOaQ5qDmsOaw5sDmkObA5rDm0ObQ5uDmwObw5uDm0ObQ5wDm8OcQ5vDnAOcA5yDnEOcQ5yDnMOcw50DnEOdA5zDnUOdQ52DnQOdg51DncOdw54DnYOeA53DnkOeQ56DngOeg55DnsOew58DnoOfA57Dn0OfQ5+DnwOfg59Dn8Ofw6ADn4OgA5/DoEOgQ6CDoAOgw6EDoUOhQ6GDoMOhg6FDocOhw6IDoYOiQ6KDosOiw6MDokOjA6LDo0OjQ6ODowOjg6NDo8Ojw6QDo4OkA6PDpEOkQ6SDpAOkg6RDpMOkw6UDpIOlQ6UDpMOkw6WDpUOlQ6WDpcOlw6YDpUOmQ6YDpcOlw6aDpkOmQ6aDpsOmw6cDpkOnA6bDp0OnQ6eDpwOnw6eDp0OnQ6gDp8OoQ6fDqAOoA6iDqEOoQ6iDqMOow6kDqEOpA6jDqUOpQ6mDqQOpw6oDqkOqQ6qDqcOqg6pDqsOqw6sDqoOrA6rDq0OrQ6uDqwOrg6tDq8Orw6wDq4OsQ6wDq8Orw6yDrEOsQ6yDrMOsw60DrEOtA6zDrUOtQ62DrQOtw64DrkOuQ66DrcOuA63DrsOuw68DrgOvQ6+Dr8Ovw7ADr0OwQ6/Dr4Ovg7CDsEOww7EDsUOxQ7GDsMOxw7IDskOyQ7KDscOyw7JDsgOyA7MDssOzQ7ODs8Ozw7QDs0O0Q7SDtMO0w7UDtEO0w7SDtUO1Q7WDtMO1w7SDtEO1Q7SDtcO0Q7YDtcO1w7YDtkO2Q7aDtcO1w7aDtsO2w7cDtcO1w7cDtUO3Q7cDtsO1Q7cDt0O2w7eDt0O3w7WDtUO1Q7gDt8O3Q7gDtUO4Q7iDuMO4w7kDuEO4g7hDuUO5Q7mDuIO5w7mDuUO5Q7oDucO6Q7qDusO6Q7rDuwO7Q7pDuwO7g7vDvAO7g7wDvEO8A7yDvEO8w70DvUO9g7zDvUO8w72DvcO+A7zDvcO8w74DvkO+g7zDvkO8w76DvsO/A7zDvsO8w78Dv0O9A7zDv0O/g7/DgAPAA8BD/4OAg8DDwQPBA8FDwIPBg8HDwgPCA8JDwYPCg8LDwwPDA8NDwoPDg8PDxAPEA8RDw4PEg8TDxQPFA8VDxIPFg8XDxgPGA8ZDxYPGg8bDxwPHA8dDxoPHg8fDyAPIA8hDx4PIg8jDyQPJA8lDyIPJg8nDygPKA8pDyYPKg8rDywPLA8tDyoPLg8vDzAPMA8xDy4PMg8zDzQPNA81DzIPNg83DzgPOA85DzYPOg87DzwPPA89DzoPPg8/D0APQA9BDz4PQg9DD0QPRA9FD0IPRg9HD0gPSA9JD0YPSg9LD0wPTA9ND0oPTg9PD1APUA9RD04PUg9QD08PTw9TD1IPUQ9QD1QPVA9QD1IPVA9VD1EPVg9VD1QPVA9XD1YPWA9XD1QPVA9ZD1gPUg9ZD1QPWA9ZD1oPWg9ZD1IPWg9bD1gPUg9TD1wPXA9dD1IPUg9dD1oPXg9fD2APYA9hD14PXw9eD2IPYg9jD18PYw9iD2QPZA9lD2MPZg9nD2gPZg9oD2kPZg9pD2oPaw9sD20Paw9tD24Paw9uD28PcA9xD3IPcw9xD3APcA90D3MPdQ90D3APcA92D3UPdw92D3APcA94D3cPeQ94D3APcA96D3kPcg96D3APew98D30PfQ9+D3sPfw+AD4EPgQ+CD38Pgw+ED4UPhQ+GD4MPhw+ID4kPiQ+KD4cPiw+MD40PjQ+OD4sPjw+QD5EPkQ+SD48Pkw+UD5UPlQ+WD5MPlw+YD5kPmQ+aD5cPmw+cD50PnQ+eD5sPnw+gD6EPoQ+iD58Pow+kD6UPpQ+mD6MPpw+oD6kPqQ+qD6cPqw+sD60PrQ+uD6sPrw+wD7EPsQ+yD68Psw+0D7UPtQ+2D7MPtw+4D7kPuQ+6D7cPuw+8D70PvQ++D7sPvw/AD8EPwQ/CD78Pww/ED8UPxQ/GD8MPxw/ID8kPyQ/KD8cPyw/MD80PzQ/OD8sPzw/LD84Pzg/QD88Pyw/PD9EP0Q/SD8sPzA/LD9MP0w/UD8wP1Q/SD9EP0Q/WD9UP1w/UD9MP0w/YD9cPzg/ND9kP2Q/aD84P0A/OD9oP2g/bD9AP3A/aD9kP2Q/dD9wP3g/bD9oP2g/cD94P3w/RD+AP4A/hD98P4Q/gD9AP4g/jD+QP5A/lD+IP5Q/kD+YP0A/nD+EP5w/QD9sP5g/oD+UP4w/iD+kP6Q/qD+MP0Q/fD+sP6w/WD9EP2w/sD+cP6A/mD+wP7A/bD94P7A/tD+gP3g/uD+wP7Q/sD+4P7g/vD+0P8A/xD/IP8w/0D/UP9Q/2D/MP9w/4D/kP+Q/6D/cP+w/3D/oP+g/8D/sP/Q/7D/wP/A/+D/0P/w/9D/4P/g8AEP8PARD/DwAQABACEAEQ8g8DEPAPBBAFEAYQBxABEAIQAhDXDwcQCBAHENcP1w/YDwgQCRAKEAsQCxAMEAkQDRAOEA8QDxAQEA0QERASEOoP6g/pDxEQExAREOkP6Q8UEBMQFRATEBQQFBAWEBUQFRAWEBcQFxAYEBUQGBAXEBkQGRAaEBgQGxAaEBkQGRAEEBsQBhAbEAQQHBAdEB4QHhAfEBwQIBAcEB8QHxAhECAQIhAgECEQIRAjECIQJBAiECMQIxAlECQQJhAkECUQJRAnECYQKBAmECcQJxApECgQKhAoECkQKRArECoQLBAqECsQKxAtECwQLhAsEC0QLRAvEC4QMBAuEC8QLxAxEDAQMhAwEDEQMRAzEDIQNBAyEDMQMxA1EDQQNhA0EDUQNRA3EDYQOBA2EDcQNxA5EDgQOhA4EDkQORA7EDoQPBA6EDsQOxA9EDwQPhA8ED0QPRA/ED4QHRA+ED8QPxAeEB0QQBBBEEIQQhBDEEAQRBBAEEMQQxBFEEQQRhBEEEUQRRBHEEYQSBBGEEcQRxBJEEgQShBIEEkQSRBLEEoQTBBKEEsQSxBNEEwQThBMEE0QTRBPEE4QUBBOEE8QTxBREFAQUhBQEFEQURBTEFIQVBBSEFMQUxBVEFQQVhBUEFUQVRBXEFYQWBBWEFcQVxBZEFgQWhBYEFkQWRBbEFoQXBBaEFsQWxBdEFwQXhBfEGAQYBBhEF4QYhBjEGQQZBBlEGIQZhBnEGgQaBBpEGYQQRBmEGkQaRBCEEEQahBrEGwQbRBsEGsQaxBuEG0QbxBtEG4QbhBwEG8QcRBvEHAQcBByEHEQcxBxEHIQchB0EHMQdRBzEHQQdBB2EHUQdxB1EHYQdhB4EHcQeRB3EHgQeBB6EHkQexB5EHoQehB8EHsQfRB7EHwQfBB+EH0QfxB9EH4QfhCAEH8QgRB/EIAQgBCCEIEQgxCBEIIQghCEEIMQhRCDEIQQhBCGEIUQhxCFEIYQhhCIEIcQiRCHEIgQiBCKEIkQixCJEIoQihCMEIsQjRCLEIwQjBBqEI0QbBCNEGoQjhCPEJAQkBCREI4QjhCREJIQkhCTEI4QlBCTEJIQkhCVEJQQlhCQEI8QjxCXEJYQmBCWEJcQlxCZEJgQmhCbEJwQnBCdEJoQnhCfEKAQoBChEJ4QohCjEKQQpBClEKIQphCnEKgQqBCpEKYQqhCrEKwQrBCtEKoQrhCqEK0QrRCvEK4QsBCuEK8QrxCxELAQshCwELEQsRCzELIQtBCyELMQsxC1ELQQthC3ELgQuBC5ELYQuhC7ELwQvBC9ELoQvhC6EL0QvRC/EL4QwBDBEMIQwhDDEMAQxBDFEMYQxhDHEMQQxRDEEMgQyBDJEMUQyhDIEMQQxBDLEMoQzBDEEMcQxxDNEMwQyhDLEM4QzhDPEMoQ0BDREMwQzBDNENAQ0hDGEMUQxRDTENIQ0xDFEMkQyRDUENMQ0hDTENUQ1RDWENIQ1xDVENMQ0xDUENcQ2BDKENkQ2RDaENgQyRDYENoQ2xDcEN0Q3RDeENsQ3xDbEN4Q2hDgEMkQ1BDJEOAQ3hDhEN8Q4hDdENwQ3BDjEOIQ5BDZEMoQyhDPEOQQ4BDlENQQ5RDfEOEQ1xDUEOUQ4RDmEOUQ5RDnENcQ5xDlEOYQ5hDoEOcQ6RDqEOsQ7BDtEO4Q7hDvEOwQ8BDxEPIQ8hDzEPAQ8xDyEPQQ9BD1EPMQ9RD0EPYQ9hD3EPUQ9xD2EPgQ+BD5EPcQ+RD4EPoQ+hD7EPkQ6xD8EOkQ/RD+EP8Q+xD6EAARABHQEPsQ0BAAEQERARHRENAQAhEDEQQRBBEFEQIRBhEHEQgRCBEJEQYR4xAKEQsRCxHiEOMQ4hALEQwRDBENEeIQDREMEQ4RDhEPEQ0REBEPEQ4RDhERERAREhEQERERERETERIREhETERQRFBH/EBIR/xAUEf0QFREWERcRFxEYERURGBEXERkRGREaERgRGhEZERsRGxEcERoRHBEbER0RHREeERwRHhEdER8RHxEgER4RIBEfESERIREiESARIhEhESMRIxEkESIRJBEjESURJREmESQRJhElEScRJxEoESYRKBEnESkRKREqESgRKhEpESsRKxEsESoRLBErES0RLREuESwRLhEtES8RLxEwES4RMBEvETERMREyETARMhExETMRMxE0ETIRNBEzETURNRE2ETQRNhE1ETcRNxE4ETYROBE3ERYRFhEVETgRORE6ETsROxE8ETkRPBE7ET0RPRE+ETwRPhE9ET8RPxFAET4RQBE/EUERQRFCEUARQhFBEUMRQxFEEUIRRBFDEUURRRFGEUQRRhFFEUcRRxFIEUYRSBFHEUkRSRFKEUgRShFJEUsRSxFMEUoRTBFLEU0RTRFOEUwRThFNEU8RTxFQEU4RUBFPEVERURFSEVARUhFREVMRUxFUEVIRVBFTEVURVRFWEVQRVxFYEVkRWRFaEVcRWxFcEV0RXRFeEVsRXxFgEWERYRFiEV8RYhFhEToROhE5EWIRYxFkEWURZRFmEWMRZhFlEWcRZxFoEWYRaBFnEWkRaRFqEWgRahFpEWsRaxFsEWoRbBFrEW0RbRFuEWwRbhFtEW8RbxFwEW4RcBFvEXERcRFyEXARchFxEXMRcxF0EXIRdBFzEXURdRF2EXQRdhF1EXcRdxF4EXYReBF3EXkReRF6EXgRehF5EXsRexF8EXoRfBF7EX0RfRF+EXwRfhF9EX8RfxGAEX4RgBF/EYERgRGCEYARghGBEYMRgxGEEYIRhBGDEYURhRGGEYQRhhGFEWQRZBFjEYYRhxGIEYkRiRGKEYcRihGJEYsRixGMEYoRjBGLEY0RjRGOEYwRiBGHEY8RjxGQEYgRkBGPEZERkRGSEZARkxGUEZURlRGWEZMRlxGYEZkRmRGaEZcRmxGcEZ0RnRGeEZsRnxGgEaERoRGiEZ8RoxGkEaURpRGmEaMRphGlEacRpxGoEaYRqBGnEakRqRGqEagRqhGpEasRqxGsEaoRrBGrEa0RrRGuEawRrxGwEbERsRGyEa8RsxG0EbURtRG2EbMRthG1EbcRtxG4EbYRuRG6EbsRuxG8EbkRvRG+Eb8RvxHAEb0RwRG9EcARwBHCEcERwxG+Eb0RvRHEEcMRvhHDEcURxRHGEb4RvxG+EcYRxxHGEcURxRHIEccRxhHJEb8RyRHGEccRyhHDEcQRxBHLEcoRzBHLEcQRxBHNEcwRzRHEEb0RvRHBEc0RxxHOEckRzxHQEdER0RHSEc8R0xHQEc8RzxHUEdMR1RHTEdQR1BHWEdUR1xHVEdYR1hHYEdcR2RHXEdgR2BHaEdkR2xHcEd0R3RHeEdsR3xHgEeER4RHiEd8R4xHfEeIR4hHkEeMR5RHjEeQR5BHmEeUR5xHlEeYR5hHoEecR6RHqEesR6xHsEekR7RHpEewR7BHuEe0R7xHtEe4R7hHwEe8R8RHvEfAR8BHyEfER8xHxEfIR8hH0EfMR9RHzEfQR9BH2EfUR9xH4EfkR+RH6EfcR+xH5EfgR+BH8EfsR/RH7EfwR/BH+Ef0R/xH9Ef4R/hEAEv8RARICEgMSAxIEEgESBRIBEgQSBBIGEgUSBxIDEgISAhIIEgcSBxIIEgkSCRIKEgcSCxIKEgkSCRIMEgsSDRILEgwSDBIOEg0SBRIGEg8SDxIQEgUSERIQEg8SDxISEhESExIREhISEhIUEhMSFRITEhQSFBIWEhUSFxIYEhkSGRIaEhcSGBIXEhsSGxIcEhgSFxIaEh0SHRIeEhcSHxIdEhoSGhIgEh8SIBIaEhkSHxIgEiESIRIiEh8SGRIjEiASIRIgEiMSHhIdEiQSJBIlEh4SHhIlEiYSJhInEh4SJxIbEhcSFxIeEicSIxIoEiESKRIqEisSKxIsEikSLBIrEi0SLRIuEiwSLhItEi8SLxIwEi4SMBIvEjESMRIyEjASMhIxEjMSMxI0EjISNRI2EjcSNxI4EjUSORI6EjsSOxI8EjkSPBI7Ej0SPRI+EjwSPhI9Ej8SPxJAEj4SQBI/EkESQRJCEkASQxJEEkUSRRJGEkMSRhJFEkcSRxJIEkYSSBJHEkkSSRJKEkgSShJJEksSSxJMEkoSTBJLEk0STRJOEkwSThJNEk8STxJQEk4SURJSElMSUxJUElESVBJTElUSVRJWElQSVhJVElcSVxJYElYSWBJXElkSWRJaElgSWxJcEl0SXRJeElsSXBJbEl8SXxJgElwSXhJdEmESYRJiEl4SYxJiEmESYRJkEmMSYxJkEmUSZRJmEmMS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zRPOE8sTzxPOE80TzRPQE88T0RPPE9AT0BPSE9ET0xPRE9IT0hPUE9MT1RPUE9IT0hPWE9UT1hPSE9AT0BPXE9YT2BPXE9AT0BPNE9gT2RPYE80TzRPME9kT2hPbE9wT3BPdE9oT3hPfE+AT4BPhE94T3xPeE+IT4hPjE98T4xPiE+QT5BPlE+MT5hPlE+QT5BPnE+YT6BPmE+cT5xPpE+gT6BPpE+oT6hPrE+gT6xPqE+wT7BPtE+sT7RPsE+4T7hPvE+0T7xPuE/AT8BPxE+8T8RPwE/IT8hPzE/ET8xPyE+ET4RPgE/MT9BP1E/YT9hP3E/QT+BP5E/oT+hP7E/gT9RP0E/wT/BP9E/UT/RP8E/4T/hP/E/0TABQBFAIUAhQDFAAUAxQCFAQUBBQFFAMUBhQHFAgUCBQJFAYUCRQIFAoUChQLFAkUDBQNFA4UDhQPFAwUEBQRFBIUEhQTFBAUERQQFBQUFBQVFBEUFhQXFBgUGBQZFBYUFhQZFBoUGhQbFBYUGxQaFBwUHBQdFBsUHhQdFBwUHBQfFB4UIBQhFCIUIhQjFCAUIxQiFCQUJBQlFCMUJhQnFCgUKBQpFCYUJxQmFCoUKhQrFCcULBQtFC4ULhQvFCwUMBQvFC4ULhQxFDAUMhQzFDQUNBQ1FDIUNhQ3FDgUORQ6FDsUOhQ8FDsUORQ7FD0UOxQ+FD0UPxRAFEEUPhRCFD0UORQ9FEMUPRREFEMURRRGFEcURxRIFEUUSRRIFEcURxRKFEkUSxRFFEgUSBRMFEsUTBRIFEkUTRRLFEwUTBROFE0UTxROFEwUTBRQFE8USRRQFEwUURRHFEYUUhRTFFQURxRRFFUUVRRKFEcUSRRKFFYUVhRKFFUUVhRXFEkUTxRQFFgUSRRXFFgUWBRQFEkUWBRZFE8UVRRaFFYUWxRcFF0UXRReFFsUWxReFF8UXxRgFFsUYRRiFGMUYxRkFGEUZRRhFGQUZBRmFGUUZxRoFGkUahRrFGwUbBRtFGoUbRRjFGIUYhRqFG0UbhRsFGsUaxRvFG4UcBRxFGcUZxRyFHAUaRRyFGcUcxRuFG8UbxR0FHMUdRRxFHAUdhRzFHQUdBR3FHYUeBR5FHUUdRR6FHgUcBR6FHUUexRlFGYUfBR9FH4UfxR+FH0UfRSAFH8UgRR/FIAUgBSCFIEUgRSCFIMUgxSEFIEUhRSGFIcUhxSIFIUUiRR7FIoUihSLFIkUixSHFIYUhhSJFIsUZhSKFHsUfhSMFHwUXxR8FIwUjBRgFF8UjRSOFI8UjxSQFI0UkRSQFI8UjxSSFJEUkxSUFJUUlRSWFJMUlhSVFJcUlxSYFJYUkRSSFJkUmRSaFJEUmxSYFJcUlxScFJsUnRSeFJ8UnxSgFJ0UoRSgFJ8UnxSiFKEUoxSeFJ0UnRSkFKMUpRSmFKcUpxSoFKUUqRSnFKYUphSqFKkUqxSsFK0UrRSuFKsUrxStFKwUrBSwFK8UrhStFLEUsRSyFK4UrRSvFLMUsxSxFK0UtBSrFK4UrhS1FLQUtRSuFLIUshS2FLUUtxS4FLkUuRS6FLcUuxS6FLkUuRS8FLsUvRS5FLgUuBS+FL0UvxS6FLsUuxTAFL8UwRS8FLkUuRS9FMEUwhTDFMQUxBTFFMIUxhTEFMMUwxTHFMYUyBTJFMoUyhTLFMgUzBTJFMgUyBTNFMwUzhTLFMoUyhTPFM4U0BTRFNIU0hTTFNAU1BTSFNEU0RTVFNQU1hTXFNgU2BTZFNYU2hTYFNcU1xTbFNoU3BTdFN4U3hTfFNwU4BThFOIU4hTjFOAU5BTlFOYU5hTnFOQU6BTpFOoU6hTrFOgU7BTtFO4U7hTvFOwU8BTsFO8U7xTxFPAU8hTuFO0U7RTzFPIU9BT1FPYU9hT3FPQU+BT5FPoU+hT7FPgU/BT4FPsU+xT9FPwU/hT6FPkU+RT/FP4UABUBFQIVAhUDFQAVBBUFFQYVBhUHFQQVBRUEFQgVCBUJFQUVChUEFQcVBxULFQoVDBUIFQQVBBUKFQwVDBUKFQ0VDRUOFQwVDxUQFREVERUSFQ8VExUUFRUVFRUWFRMVFxUYFRkVGRUaFRcVGxUXFRoVGhUcFRsVHRUbFRwVHBUeFR0VHxUdFR4VHhUgFR8VIRUZFRgVGBUiFSEVIxUhFSIVIhUkFSMVJRUjFSQVJBUmFSUVJxUoFSkVKRUqFScVKhUpFSsVKxUsFSoVKBUnFS0VLRUuFSgVLxUwFTEVMRUyFS8VMhUxFTMVMxU0FTIVNRU2FTcVNxU4FTUVNhU1FTkVORU6FTYVOxU8FT0VOxU9FT4VPRU/FT4VOxU+FUAVPhVBFUAVOxVAFUIVQxVEFUUVRRVGFUMVQxVGFUcVRxVIFUMVRhVFFUkVSRVKFUYVRxVGFUoVShVJFUsVSxVMFUoVShVMFU0VTRVOFUoVShVOFUcVRBVDFU8VUBVRFVIVQxVIFVMVUxVPFUMVVBVIFUcVUxVIFVQVRxVVFVQVVhVOFU0VRxVOFVYVVhVVFUcVTRVXFVYVVBVYFVMVWRVaFVsVWxVcFVkVWhVZFV0VXRVeFVoVXxVgFWEVYRViFV8VYhVhFWMVYxVkFWIVZRVmFWcVaBVpFWoVahVrFWgVYBVfFWsVaxVqFWAVaRVoFWwVbBVtFWkVbhVnFW8VZxVuFWUVbxVwFW4VbRVsFXEVcRVyFW0VcBVvFXMVchVxFXQVdBV1FXIVcxV2FXcVdxV4FXMVcxV4FXAVZBVjFXkVehV7FXwVfBV9FXoVexV6FX4VfhV/FXsVfxV+FYAVgBWBFX8VghWBFYAVgBWDFYIVhBWFFYYVhhWHFYQViBV5FYkViRWKFYgVhRWEFYoVihWJFYUVeRWIFWQVfRV8FV4VXhVdFX0VixWMFY0VjRWOFYsVixWOFY8VjxWQFYsVkRWSFZMVkxWUFZEVlRWWFZEVkRWUFZUVlxWQFY8VjxWYFZcVmRWaFZYVlhWVFZkVmxWcFZ0VnRWeFZsVnRWcFZ8VnxWgFZ0VmxWeFaEVoRWiFZsVoxWkFaUVpRWmFaMVphWlFacVpxWoFaYVqRWqFasVqxWsFakVrBWrFa0VrRWuFawVrxWrFaoVqhWwFa8VqxWvFbEVsRWtFasVqhWpFbIVshWzFaoVsBWqFbMVsxW0FbAVtRW2FbcVtxW4FbUVtxW2FbkVuRW6FbcVuBW3FbsVuxW8FbgVvRW7FbcVtxW6Fb0VvhW/FcAVwBXBFb4VwRXAFcIVwhXDFcEVxBXFFcYVxhXHFcQVxBXHFcgVyBXJFcQVxhXFFcoVyhXLFcYVzBXNFc4VzhXPFcwVzxXOFdAV0BXRFc8V0hXTFdQV1BXVFdIV1RXUFdYV1hXXFdUV2BXZFdoV2hXbFdgV3BXdFd4V3hXfFdwV4BXhFeIV4hXjFeAV5BXlFeYV5hXnFeQV6BXpFeoV6hXrFegV6RXoFewV7BXtFekV7hXrFeoV6hXvFe4V8BXxFfIV8hXzFfAV9BX1FfYV9hX3FfQV9RX0FfgV+BX5FfUV+hX3FfYV9hX7FfoV/BX9Ff4V/hX/FfwVABYBFgIWAhYDFgAWBBYAFgMWAxYFFgQWARYAFgYWBhYHFgEWCBYGFgAWABYEFggWCRYKFgsWCxYMFgkWDRYOFg8WDxYQFg0WERYSFhMWExYUFhEWEhYRFhUWFRYWFhIWFhYVFhcWFxYYFhYWGBYXFhkWGRYaFhgWFBYTFhsWGxYcFhQWHBYbFh0WHRYeFhwWHhYdFh8WHxYgFh4WIRYiFiMWIxYkFiEWJRYjFiIWIhYmFiUWJxYhFiQWJBYoFicWKRYqFisWKxYsFikWLRYrFioWKhYuFi0WLxYwFjEWMRYyFi8WMxYvFjIWMhY0FjMWNRY2FjcWNRY3FjgWNxY5FjgWNxY6FjkWORY7FjgWNRY4FjwWPRY+Fj8WPxZAFj0WQRY9FkAWQBZCFkEWQxZBFkIWQhZEFkMWRRZDFkQWRBZGFkUWRRZGFkcWRxZIFkUWRRZIFkkWShZJFkgWSRZKFksWTBZLFkoWSxZMFk0WTRZOFksWTxZOFk0WTRZQFk8WShZRFkwWURZKFlIWSBZSFkoWUhZIFkcWUhZTFlEWUxZSFlQWRxZUFlIWVBZVFlMWTxZWFk4WTxZXFlYWVxZYFlYWWBZXFlkWWRZaFlgWWxZYFloWVhZYFlsWWhZcFlsWXRZbFlwWWxZdFlYWXBZeFl0WXxZdFl4WVhZdFl8WXhZgFl8WYRZfFmAWYBZiFmEWYxZiFmAWYBZkFmMWZBZgFl4WZRZjFmQWZBZmFmUWZRZmFmcWZxZoFmUWXhZpFmQWaRZeFlwWXBZqFmkWaRZqFmsWaxZsFmkWZBZpFmwWbBZmFmQWbBZrFm0WbRZuFmwWbhZnFmYWZhZsFm4WbxZuFm0WZxZuFm8WbRZwFm8WcRZvFnAWcBZyFnEWcRZyFnMWcxZ0FnEWcRZ0FnUWdRZ2FnEWbxZxFnYWdhZ3Fm8WbxZ3FmcWZxZ3FngWeBZoFmcWeRZ4FncWdxZ2FnkWdhZ1FnoWehZ5FnYWaBZ4FnsWexY+FmgWfBZ7FngWeBZ5FnwWeRZ6Fn0WfRZ8FnkWfhZ8Fn0WexZ8Fn4WfRZ/Fn4WfxZ9FoAWgBZ9FnoWgBaBFn8WghaBFoAWgBaDFoIWaBY+Fj0WPRZlFmgWZRY9FkEWQRZjFmUWYhZjFkEWQRZDFmIWYhZDFkUWRRZhFmIWSRZhFkUWXxZhFkkWSRaEFl8WXxaEFlYWThZWFoQWhBZLFk4WSxaEFkkWhRaGFoMWhhaFFocWhxaIFoYWiBaHFokWiRaKFogWixaKFokWiRaMFosWhxaFFnoWehZ1FocWhxZ1FnQWdBaJFocWcxaMFokWiRZ0FnMWjBZzFnIWchaNFowWjRZyFnAWcBaOFo0WjhZwFm0WbRaPFo4WjxZtFmsWaxaQFo8WkRaQFmsWaxZqFpEWkRZqFlwWXBZaFpEWkRZaFlkWkhaTFpQWlBaVFpIWlhaSFpUWlRaXFpYWlxaVFpgWmBaVFpQWmBaZFpcWlBaaFpgWmhaUFpsWmxaUFpMWmxacFpoWnRacFpsWmxaeFp0WlxaZFp8WnxagFpcWlhaXFqAWoRagFp8WnxaiFqEWoxahFqIWohakFqMWpRagFqEWoBalFpYWoRamFqUWpxamFqEWoRajFqcWqBaeFpsWmxapFqgWkxapFpsWqharFqwWrBatFqoWrhatFqwWrBavFq4WrhavFrAWsBaxFq4WrRauFrIWshazFq0WsxayFrQWtBa1FrMWsxa1FrYWtha3FrMWtxaqFq0WtxatFrMWrhaxFrgWuBayFq4WtBayFrgWtRa5FrYWuRa1FrQWtBa6FrkWuxa6FrQWtBa8FrsWuBa8FrQWvRaxFrAWsBa+Fr0Wvxa9Fr4WvhbAFr8WwRa4FrEWsRa9FsEWvRa/FsIWwhbBFr0WwRbCFsMWwxbEFsEWxBa8FrgWuBbBFsQWxRa7FrwWvBbEFsUWxRbEFsMWwBa+FsYWxha+FrAWsBbHFsYWxhbIFsAWyRbHFrAWsBavFskWyhbJFq8WrxasFsoWyhasFqsWqxbLFsoWyxarFswWzBarFs0WzhbMFs0WqxaqFs0WqhbPFs0WzxaqFtAW0RbSFtMWzBbUFssW1BbMFs4WzhbVFtQW1hbXFtgW1xbWFtkW2RbaFtcW2hbZFtsW2hbbFtwW3RbeFt8W3BbbFuAW4BbhFtwW4hbhFuAW4BbjFuIW5BblFuYW5hbnFuQW6BbpFuoW6hbrFugW5RboFusW6xbmFuUW6RbsFu0W7RbqFukW7hbtFuwW7BbvFu4W8BbxFvIW8hbzFvAW8hbxFvQW9Bb1FvIW9Rb0FvYW9hb3FvUW9xb2FvgW+Bb5FvcW+Rb4FvoW+hb7FvkW/Bb9Fv4W/hb/FvwW/xb+FgAXABcBF/8WARcAFwIXAhcDFwEX/BYEF/0W/RYEFwUXBRcGF/0WBxcGFwUXCBcJFwoXCxcMFw0XDRcOFwsXDxcIFwoXEBcRFxIXEhcTFxAXEhcRFxQXFBcVFxIXFBcWFxUXFBcXFxYXFhcYFxUXGRcaFxsXGxccFxkXHRcbFxoXGhceFx0XHxcgFyEXIRciFx8XHxciFyMXIxckFx8XJRckFyMXIxcmFyUXJxclFyYXJhcoFycXJxcoFykXKRcqFycXKxcsFy0XLhcrFy0XLxcuFy0XMBcxFzIXMhczFzAXNBcsFysXKxc1FzQXNhc0FzUXNRc3FzYXOBc2FzcXNxc5FzgXOhc4FzkXORc7FzoXPBc9Fz4XPhc/FzwXPxc+F0AXQBdBFz8XQRdAF0IXQhdDF0EXRBc9FzwXPBdFF0QXRBdFF0YXRhdHF0QXRxdGF0gXSBdJF0cXSRdIF0oXSxdMF00XThdPF1AXUBdRF04XUhdRF1AXUBdTF1IXVBdPF04XThdVF1QXVhdUF1UXVRdXF1YXVhdXF1gXWBdZF1YXWRdYF1oXWhdbF1kXUhdTF1wXXBddF1IXXhdfF2AXYBdhF14XYhdhF2AXYxdkF2UXXxdeF2YXZhdnF18XaBdnF2YXZhdpF2gXahdoF2kXaRdrF2oXahdrF2wXbBdtF2oXbhdtF2wXbBdvF24XPxY+FnsWexZwFz8WfhZwF3sWgxaAFoUWehaFFoAWcRdyF3MXcxd0F3EXdBdzF3UXdRd2F3QXdhd1F3cXdxd4F3YXeBd3F3kXeRd6F3gXexd6F3kXeRd8F3sXfRd8F3kXfBd9F34Xfxd+F30Xfhd/F4AXgReAF38XfxeCF4EXgxeBF4IXgheEF4MXgBeFF34Xhhd+F4UXfheGF3wXexd8F4YXhReHF4YXiBeGF4cXhheIF3sXhxeJF4gXhBeCF4oXixeEF4oXjBeLF4oXjReLF4wXjBeOF40XjheMF48XjxeMF4oXjxeQF44XkBePF5EXiheRF48XkReSF5AXkheRF5MXkxeRF4oXkxeUF5IXlBeTF5UXlReWF5QXlBeWF5cXlxeYF5QXkheUF5gXmBeXF5kXmReaF5gXmxeaF5kXmRecF5sXmBedF5IXkBeSF50XnReeF5AXnxeeF50XnRegF58XoBedF5gXmBeaF6AXoRefF6AXoBeiF6EXmhebF6IXohegF5oXoReiF6MXoxeiF5sXoxekF6EXpBejF6UXpRemF6QXpxemF6UXpReoF6cXqReoF6UXpReqF6kXqhelF6MXoxerF6oXmxerF6MXrBerF5sXmxecF6wXqxesF60XrReqF6sXqhetF64XrhepF6oXrxesF5wXnBdyF68XrBevF7AXsBetF6wXrRewF7EXsReuF60XsRewF7IXshewF68XshezF7EXtBexF7MXrhexF7QXsxe1F7QXtBe1F7YXthe3F7QXcxdyF5wXnBeZF3MXdRdzF5kXmReXF3UXdReXF5YXlhd3F3UXeRd3F5YXlheVF3kXeReVF30XfReVF5MXkxe4F30Xihe4F5MXuBeKF4IXghd/F7gXfRe4F38XuRe0F7cXtBe5F64Xrhe5F7oXuhe5F7sXuxe8F7oXvRe6F7wXvBe+F70Xvxe9F74XvhfAF78XuhepF64Xuhe9F6gXqBepF7oXpxeoF70XvRe/F6cXpxe/F8EXwRemF6cXpBemF8EXwRfCF6QXoRekF8IXwhfDF6EXnxehF8MXwxfEF58XnxfEF8UXxReeF58XkBeeF8UXxReOF5AXxReNF44XxhfHF8gXyBfJF8YXyRfIF8oXyhfLF8kXzBfJF8sXxhfJF8wXyxfNF8wXzBfOF8YXzxfGF84XxxfGF88XzhfQF88X0RfPF9AX0BfSF9EX0xfNF8sXyxfUF9MX1BfLF8oX0xfUF9UX1RfWF9MX1hfVF9cX1xfYF9YX1RfUF9kXyhfZF9QX2RfaF9UX2xfXF9UX1RfaF9sXzxfRF9wX3BfdF88XzxfdF8cX3hffF+AX4BfhF94X3hfhF+IX4hfjF94X5BfjF+IX4hflF+QX5hfiF+EX4RfnF+YX6BfmF+cX5xfpF+gX6hfpF+cX5xfrF+oX6xfnF+EX4BfrF+EX7BflF+IX4hfmF+wX7BfmF+gX6RfqF+0X6BfpF+0X7RfuF+gX6BfuF+8X7xfwF+gX6BfwF+wX5BflF/EX8RfyF+QX8hfxF/MX8xf0F/IX5RfsF/UX9RfxF+UX8Rf1F/YX9hfzF/EX9xf2F/UX9Rf4F/cX+Bf1F+wX7BfwF/gX8BfvF/kX+Rf4F/AX9xf4F/kX+hfyF/QX5BfyF/oX+hf7F+QX9Bf8F/oX5Bf7F/0X/RfjF+QX4xf9F/4X/hfeF+MX3xfeF/4X/hf/F98XABjfF/8XABgBGN8XARgAGAIYARjgF98XARgDGOAXAxgEGOAXBRgGGAcY/xcIGAAYAhgAGAgYCBgJGAIYChgLGAwYChgMGA0YDRgOGAoYDRgPGA4YDRgQGA8YEBgRGA8YEhgPGBEYERgTGBIYEhgTGBQYFBgVGBIYFhgXGBgYGBgZGBYYGhgbGBwYHBgdGBoYHRgcGBcYFxgWGB0YHhgfGBsYGxgaGB4YIBghGB8YHxgeGCAYIhgjGCQYJBglGCIYJhglGCQYJBgnGCYYKBgmGCcYJxgpGCgYKhgoGCkYKRgrGCoYLBgqGCsYKxgtGCwYLhgvGDAYMBgxGC4YMhgwGC8YLxgzGDIYNBgyGDMYMxg1GDQYLhgxGDYYNxg2GDEYMRg4GDcYNxg4GDkYOhg7GDwYPRg+GD8YPxhAGD0YOhhBGDsYQhhDGEQYRBhFGEIYRhhEGEMYQxhHGEYYRxhIGEYYRxhJGEgYSBhKGEYYSxhMGE0YTRhOGEsYThhNGE8YTxhQGE4YURhSGFMYUxhUGFEYVRhSGFEYURhWGFUYVRhWGFcYVxhYGFUYWBhXGFkYWRhaGFgYWxhaGFkYWRhcGFsYXRheGF8YXRhfGGAYXRhgGGEYYhhjGGQYZBhlGGIYXxheGGYYZhhnGF8YZxhmGGgYaBhpGGcYaRhoGGoYahhrGGkYbBhrGGoYahhtGGwYbhhvGHAYcBhxGG4YchhuGHEYcRhzGHIYdBhyGHMYcxh1GHQYcBhvGHYYdhh3GHAYeBh3GHYYdhh5GHgYehh4GHkYeRh7GHoYfBh6GHsYfRh+GH8YgBiBGIIYghiDGIAYgBiDGIQYhBiFGIAYghiBGIYYhhiHGIIYhxiGGIgYiBiJGIcYihiJGIgYiBiLGIoYjBiKGIsYixiNGIwYjhiFGIQYhBiPGI4YkBiRGJIYkhiTGJAYkBiTGJQYlRiWGJcYmBiSGJEYkRiZGJgYmBiZGJoYmhibGJgYmxiaGJwYnBidGJsYnhidGJwYnBifGJ4YnhifGKAYoBihGJ4YrxdyF3EXcReiGK8XrxeiGLIXtxe7F7kXoxikGKUYpRimGKMYoximGKcYpxioGKMYqRimGKUYpRiqGKkYqxipGKoYqhisGKsYqxisGK0YrRiuGKsYpRikGK8YrxiwGKUYsBivGLEYsRiyGLAYsxi0GLUYtRi2GLMYthi1GLcYtxi4GLYYthi4GLkYuRi6GLYYuxi0GLMYsxi8GLsYvRi7GLwYvBi+GL0YvRi+GL8YvxjAGL0YwBi/GMEYwRjCGMAYwhjBGMMYwxjEGMIYxRjGGMcYxxjIGMUYyRjGGMUYxRjKGMkYyRjKGMsYyxjMGMkYyBjHGM0YzRjOGMgYzxjMGMsYyxjQGM8Y0RjSGNMY0xjUGNEY1RjTGNIY0hjWGNUY1xjYGNkY2RjaGNcY2xjcGN0Y3RjeGNsY2xjeGN8Y3xjgGNsY4RjiGOMY4xjkGOEY5RjmGOcY5xjoGOUY6RjqGOsY6xjsGOkY6RjsGO0Y7RjuGOkY7xjwGPEY8RjyGO8Y8xjwGO8Y9Bj1GPYY9xj2GPUY9Rj4GPcY9xj4GPkY+Rj6GPcY+xj8GP0Y/Rj+GPsY/xgAGQEZARkCGf8YAhkBGQMZAxkEGQIZBRkGGQcZBxkIGQUZzRgFGQgZCBnOGM0YCRkKGQYZBhkFGQkZCxkKGQkZCRkMGQsZDRkJGQUZDBkJGQ0ZBRkOGQ0ZDRkPGQwZEBkRGRIZEhkTGRAZFBkSGREZERkVGRQZFhkQGRMZExkXGRYZGBkUGRUZFRkZGRgZGRkaGRgZGxkWGRcZFxkcGRsZHRkeGR8ZHxkgGR0ZIRkfGR4ZHhkiGSEZIxkdGSAZIBkkGSMZJRkhGSIZIhkmGSUZJxkjGSQZJBkoGScZKRkqGSsZKxksGSkZLRkuGS8ZLxkwGS0ZLhktGTEZMRkyGS4ZMBkvGTMZMxk0GTAZNRkyGTEZMRk2GTUZNxk1GTYZNhk4GTcZORk0GTMZMxk6GTkZOxk8GT0ZPRk+GTsZPxlAGUEZQhk/GUEZQxlEGUUZRhlHGUgZSBlJGUYZSBlHGUoZShlLGUgZTBlNGU4ZThlPGUwZUBlNGUwZTBlRGVAZThlNGVIZUhlTGU4ZUxlSGVQZVBlVGVMZVhlVGVQZVBlXGVYZWBlPGU4ZThlZGVgZWhlYGVkZWRlbGVoZXBldGV4ZXhlfGVwZYBleGV0ZXRlhGWAZYhlhGV0ZXRljGWIZXBlfGWQZZBllGVwZZRlkGWYZZhlnGWUZaBlnGWYZZhlpGWgZahloGWkZaRlrGWoZbBlqGWsZaxltGWwZbhlvGXAZcBlxGW4ZcBlvGXIZchlzGXAZdBlzGXIZchl1GXQZdhluGXEZcRl3GXYZdBl1GXgZeBl5GXQZehl7GXwZfBl9GXoZfRl8GX4Zfhl/GX0ZgBmBGYIZghmDGYAZhBmFGYYZhhmHGYQZhxmGGYgZiBmJGYcZihmLGYwZjBmNGYoZjhmPGZAZkBmRGY4ZkhmTGZQZlBmVGZIZlRmUGZYZlhmXGZUZmBmZGZoZmhmbGZgZmxmaGZwZnRmeGZ8ZnhmdGaAZoBmhGZ4ZoRmgGaIZohmjGaEZpBmlGaYZphmnGaQZqBmpGaoZqhmrGagZqxmqGawZrBmtGasZrhmvGbAZsBmxGa4ZrxmuGXYZdhl3Ga8ZshmuGbEZsRmzGbIZshmzGbQZtBm1GbIZrhmyGbYZthmyGbUZthm3Ga4ZtRm4GbYZuRm6GbsZuxm8GbkZvBm7Gb0ZvRm+GbwZuhm5Gb8ZvxnAGboZvhm9GcEZwRnCGb4ZwhnBGcMZwBm/GcQZxBnFGcAZxhnHGcgZyBnJGcYZyRnIGcoZyhnLGckZxxnGGcwZzBnNGccZyxnKGc4ZzhnPGcsZzRnMGdAZ0BnRGc0Z0hnTGdQZ1BnVGdIZ1hnXGdgZ2BnZGdYZ2RnYGdoZ2hnbGdkZ1xnWGdwZ3BndGdcZ2xnaGd4Z3hnfGdsZ3xneGeAZ4BnhGd8Z3RncGeIZ4hnjGd0Z5BnlGeYZ5hnnGeQZ6BnpGeoZ6xnsGe0Z7BnuGe0Z7xnwGfEZ8RnyGe8Z8hnxGfMZ8xn0GfIZ9Rn2GfcZ9xn4GfUZ+Rn2GfUZ9Rn6GfkZ+Rn6GfsZ+xn8GfkZ/Rn8GfsZ+xn+Gf0Z/Rn+Gf8Z/xkAGv0ZARoAGv8Z/xkCGgEaARoCGgMaAxoEGgEaBRoEGgMaAxoGGgUaBRoGGgcaBxoIGgUaCRoIGgcaBxoKGgkaCRoKGgsaCxoMGgkaDRoOGg8aDxoQGg0aDxoOGhEaERoSGg8aExoSGhEaERoUGhMaExoUGhUaFRoWGhMaFhoVGvgZ+Bn3GRYaFxoYGhkaGRoaGhcaGxoXGhoaGhocGhsaHRobGhwaHBoeGh0aHxodGh4aHhogGh8aIRofGiAaIBoiGiEaIxohGiIaIhokGiMaJRojGiQaJBomGiUaJxoZGhgaGBooGicaKRonGigaKBoqGikaKxopGioaKhosGisaLRorGiwaLBouGi0aLxotGi4aLhowGi8aMRovGjAaMBoyGjEaMxoxGjIaMho0GjMaNRozGjQaNBo2GjUaNxo1GjYaNho4GjcaORo6GjsaOxo8GjkaPRo8GjsaOxo+Gj0aPRo+Gj8aPxpAGj0aQRpAGj8aPxpCGkEaQRpCGkMaQxpEGkEaRRpEGkMaQxpGGkUaRRpGGkcaRxpIGkUaOho5GkkaSRpKGjoaShpJGksaSxpMGkoaTRpMGksaSxpOGk0aTRpOGk8aTxpQGk0aURpQGk8aTxpSGlEaURpSGlMaUxpUGlEaVRpUGlMaUxpWGlUaVRpWGlcaVxpYGlUaWRpYGlcaVxpaGlkaWxpcGl0aXRpeGlsaXxpcGlsaWxpgGl8aXxpgGmEaYRpiGl8aYxpiGmEaYRpkGmMaYxpkGmUaZRpmGmMaZxpmGmUaZRpoGmcaZxpoGmkaaRpqGmcaaxpqGmkaaRpsGmsaaxpsGm0abRpuGmsabxpuGm0abRpwGm8abxpwGnEacRpyGm8acxp0GnUadRp2GnMacxp2Gncadxp4GnMaeRp4Gncadxp6GnkaeRp6Gnsaexp8GnkafBp7Gl4aXhpdGnwafRp+Gn8afxqAGn0agRp9GoAagBqCGoEagxqBGoIaghqEGoMahRqDGoQahBqGGoUahxqFGoYahhqIGocaiRqHGogaiBqKGokaixqJGooaihqMGosajRp/Gn4afhqOGo0ajxqNGo4ajhqQGo8akRqPGpAakBqSGpEakxqRGpIakhqUGpMalRqTGpQalBqWGpUalxqVGpYalhqYGpcamRqXGpgamBqaGpkamxqZGpoamhqcGpsanRqbGpwanBqeGp0anxqgGqEaohqgGp8aoRqjGp8apBqlGqYaoRqlGqQapBqjGqEaphqnGqQanxqoGqIaphqpGqoaqhqnGqYaqhqpGqsaqxqsGqoarRqsGqsaqxquGq0arRquGq8arxqwGq0asBqvGrEasRqyGrAashqxGrMasxq0GrIatRq0GrMasxq2GrUatRq2Grcatxq4GrUauRq4Grcatxq6GrkauRq6Grsauxq8GrkavRq8Grsauxq+Gr0avRq+Gr8avxrAGr0awRrCGsMawxrEGsEaxRrCGsEawRrGGsUaxRrGGscaxxrIGsUayRrIGscaxxrKGskayRrKGssayxrMGskazRrMGssayxrOGs0azRrOGs8azxrQGs0a0RrQGs8azxrSGtEa0RrSGtMa0xrUGtEa1RrWGtca1xrYGtUa1xrWGtka2RraGtca2xraGtka2RrcGtsa2xrcGt0a3RreGtsa3xreGt0a3RrgGt8a3xrgGuEa4RriGt8a4hrhGsQaxBrDGuIa4xrkGuUa5RrmGuMa5xrjGuYa5hroGuca6RrnGuga6BrqGuka6xrpGuoa6hrsGusa7RrrGuwa7BruGu0a7xrtGu4a7hrwGu8a8RrvGvAa8BryGvEa8xrxGvIa8hr0GvMa9RrzGvQa9Br2GvUa9xr1GvYa9hr4Gvca+Rr3Gvga+Br6Gvka+xr5Gvoa+hr8Gvsa/Rr7Gvwa/Br+Gv0a/xr9Gv4a/hoAG/8aARv/GgAbABsCGwEb5BoBGwIbAhvlGuQaAxsEGwUbBRsGGwMbBxsEGwMbAxsIGwcbBxsIGwkbCRsKGwcbCxsKGwkbCRsMGwsbCxsMGw0bDRsOGwsbDxsOGw0bDRsQGw8bDxsQGxEbERsSGw8bExsSGxEbERsUGxMbExsUGxUbFRsWGxMbFxsYGxkbGRsaGxcbGRsYGxsbGxscGxkbHRscGxsbGxseGx0bHRseGx8bHxsgGx0bIRsgGx8bHxsiGyEbIRsiGyMbIxskGyEbJBsjGwYbBhsFGyQbJRsmGycbJxsoGyUbKRsmGyUbJRsqGykbKRsqGysbKxssGykbLRssGysbKxsuGy0bLRsuGy8bLxswGy0bMRswGy8bLxsyGzEbMRsyGzMbMxs0GzEbNRs0GzMbMxs2GzUbNRs2GzcbNxs4GzUbORs6GzsbOxs8GzkbOxs6Gz0bPRs+GzsbPxs+Gz0bPRtAGz8bPxtAG0EbQRtCGz8bQxtCG0EbQRtEG0MbQxtEG0UbRRtGG0MbRhtFGygbKBsnG0YbRxtIG0kbSRtKG0cbSxtIG0cbRxtMG0sbSxtMG00bTRtOG0sbTxtOG00bTRtQG08bTxtQG1EbURtSG08bUxtSG1EbURtUG1MbUxtUG1UbVRtWG1MbVxtWG1UbVRtYG1cbVxtYG1kbWRtaG1cbWxtcG10bXRteG1sbXRtcG18bXxtgG10bYRtgG18bXxtiG2EbYRtiG2MbYxtkG2EbZRtkG2MbYxtmG2UbZRtmG2cbZxtoG2UbaBtnG0obShtJG2gbaRtqG2sbaxtsG2kbbRtsG2sbaxtuG20bbRtuG28bbxtwG20bcRtwG28bbxtyG3EbcRtyG3Mbcxt0G3EbdRt0G3Mbcxt2G3UbdRt2G3cbdxt4G3UbeRt4G3cbdxt6G3kbeRt6G3sbext8G3kbfRt+G38bfxuAG30bfxt+G4EbgRuCG38bgxuCG4EbgRuEG4MbgxuEG4UbhRuGG4MbhxuGG4UbhRuIG4cbhxuIG4kbiRuKG4cbihuJG2obahtpG4obixuMG40bjRuOG4sbjxuNG4wbjBuQG48bkRuPG5AbkBuSG5EbkxuRG5IbkhuUG5MblRuTG5QblBuWG5UblxuVG5YblhuYG5cbmRuXG5gbmBuaG5kbmxuZG5obmhucG5sbnRubG5wbnBueG50bnxugG6EboRuiG58boxuhG6AboBukG6MbpRujG6QbpBumG6UbpxulG6YbphuoG6cbqRunG6gbqBuqG6kbqxupG6obqhusG6sbjhurG6wbrBuLG44brRuuG68brxuwG60bsRuvG64brhuyG7EbsxuxG7Ibshu0G7MbtRuzG7QbtBu2G7Ubtxu1G7Ybthu4G7cbuRu3G7gbuBu6G7kbuxu5G7obuhu8G7sbvRu7G7wbvBu+G70bvxu9G74bvhvAG78bwRvCG8MbwxvEG8EbxRvDG8IbwhvGG8UbxxvFG8YbxhvIG8cbyRvHG8gbyBvKG8kbyxvJG8obyhvMG8sbzRvLG8wbzBvOG80bsBvNG84bzhutG7AbzxvQG9Eb0RvSG88b0xvRG9Ab0BvUG9Mb1RvTG9Qb1BvWG9Ub1xvVG9Yb1hvYG9cb2RvXG9gb2BvaG9kb2xvZG9ob2hvcG9sb3RvbG9wb3BveG90b3xvdG94b3hvgG98b4RvfG+Ab4BviG+Eb4xvkG+Ub5RvmG+Mb5xvlG+Qb5BvoG+cb6RvnG+gb6BvqG+kb6xvpG+ob6hvsG+sb7RvrG+wb7BvuG+0b7xvtG+4b7hvwG+8b0hvvG/Ab8BvPG9Ib8RvyG/Mb8xv0G/Eb9RvzG/Ib8hv2G/Ub9xv1G/Yb9hv4G/cb+Rv3G/gb+Bv6G/kb+xv5G/ob+hv8G/sb/Rv7G/wb/Bv+G/0b/xv9G/4b/hsAHP8bARz/GwAcABwCHAEcAxwBHAIcAhwEHAMcBRwGHAccBxwIHAUcCRwHHAYcBhwKHAkcCxwJHAocChwMHAscDRwLHAwcDBwOHA0cDxwNHA4cDhwQHA8cERwPHBAcEBwSHBEc9BsRHBIcEhzxG/QbExwUHBUcFRwWHBMcFxwWHBUcFRwYHBccFxwYHBkcGRwaHBccGxwaHBkcGRwcHBscGxwcHB0cHRweHBscHxweHB0cHRwgHB8cHxwgHCEcIRwiHB8cIxwiHCEcIRwkHCMcIxwkHCUcJRwmHCMcJxwoHCkcKRwqHCccKRwoHCscKxwsHCkcLRwsHCscKxwuHC0cLRwuHC8cLxwwHC0cMRwwHC8cLxwyHDEcMRwyHDMcMxw0HDEcNBwzHBQcFBwTHDQcNRw2HDccNxw4HDUcOBw3HDkcORw6HDgcOhw5HDscOxw8HDocPBw7HD0cPRw+HDwcPhw9HD8cPxxAHD4cQBw/HEEcQRxCHEAcQhxBHEMcQxxEHEIcRBxDHEUcRRxGHEQcRhxFHEccRxxIHEYcSRxKHEscSxxMHEkcShxJHE0cTRxOHEocThxNHE8cTxxQHE4cUBxPHFEcURxSHFAcUhxRHFMcUxxUHFIcVBxTHFUcVRxWHFQcVhxVHDYcNhw1HFYcVxxYHFkcWRxaHFccWxxZHFgcWBxcHFscXRxbHFwcXBxeHF0cXxxdHF4cXhxgHF8cYRxfHGAcYBxiHGEcYxxhHGIcYhxkHGMcZRxjHGQcZBxmHGUcZxxlHGYcZhxoHGccaRxnHGgcaBxqHGkcaxxpHGocahxsHGscbRxrHGwcbBxuHG0cbxxtHG4cbhxwHG8ccRxvHHAccBxyHHEccxxxHHIcchx0HHMcdRxzHHQcdBx2HHUcWhx1HHYcdhxXHFocdxx4HHkceRx6HHccehx5HHscexx8HHocfBx7HH0cfRx+HHwcfhx9HH8cfxyAHH4cgBx/HIEcgRyCHIAcghyBHIMcgxyEHIIchByDHIUchRyGHIQchhyFHIcchxyIHIYciByHHIkciRyKHIgcixyMHI0cjRyOHIscjhyNHI8cjxyQHI4ckByPHJEckRySHJAckxyUHJUclRyWHJMclByTHJcclxyYHJQcmByXHJkcmRyaHJgckhyRHJscnBydHHgcnRycHJ4cnhyfHJ0cnxyeHKAcoByhHJ8coRygHKIcohyjHKEcoxyiHKQcpBylHKMcpRykHKYcphynHKUcpxymHKgcqBypHKccqhyrHKwcrBytHKocqxyqHK4crhyvHKscrxyuHLAcsByxHK8csRywHLIcshyzHLEcsxyyHLQctBy1HLMctRy0HLYcthybHLUcmxy2HJIceBx3HJwctxy4HLkcuRy6HLccuhy5HLscuxy8HLocvBy7HL0cvRy+HLwcvhy9HL8cvxzAHL4cwBy/HMEcwRzCHMAcwhzBHMMcwxzEHMIcxBzDHMUcxRzGHMQcxhzFHMccxxzIHMYcyBzHHMkcyRzKHMgcyxzMHM0czRzOHMsczBzLHM8czxzQHMwc0BzPHNEc0RzSHNAc0hzRHNMc0xzUHNIc1BzTHNUc1RzWHNQc1hzVHNcc1xzYHNYc2BzXHLgcuBy3HNgc2RzaHNsc2xzcHNkc3BzbHN0c3RzeHNwc3hzdHN8c3xzgHN4c4BzfHOEc4RziHOAc4hzhHOMc4xzkHOIc5BzjHOUc5RzmHOQc5hzlHOcc5xzoHOYc6BznHOkc6RzqHOgc6hzpHOsc6xzsHOoc7RzuHO8c7xzwHO0c7hztHPEc8RzyHO4c8hzxHPMc8xz0HPIc9BzzHPUc9Rz2HPQc9hz1HPcc9xz4HPYc+Bz3HPkc+Rz6HPgc+hz5HNoc2hzZHPoc+xz8HP0c/Rz+HPsc/hz9HP8c/xwAHf4cAB3/HAEdAR0CHQAdAh0BHQMdAx0EHQIdBB0DHQUdBR0GHQQdBh0FHQcdBx0IHQYdCB0HHQkdCR0KHQgdCh0JHQsdCx0MHQodDB0LHQ0dDR0OHQwdDx0QHREdER0SHQ8dEB0PHRMdEx0UHRAdFB0THRUdFR0WHRQdFh0VHRcdFx0YHRYdGB0XHRkdGR0aHRgdGh0ZHRsdGx0cHRodHB0bHfwc/Bz7HBwdHR0eHR8dHx0gHR0dIR0fHR4dHh0iHSEdIx0hHSIdIh0kHSMdJR0jHSQdJB0mHSUdJx0lHSYdJh0oHScdKR0nHSgdKB0qHSkdKx0pHSodKh0sHSsdLR0rHSwdLB0uHS0dLx0tHS4dLh0wHS8dMR0yHTMdMx00HTEdNR0zHTIdMh02HTUdNx01HTYdNh04HTcdOR03HTgdOB06HTkdOx05HTodOh08HTsdPR07HTwdPB0+HT0dIB09HT4dPh0dHSAdPx1AHUEdQR1CHT8dQx1BHUAdQB1EHUMdRR1DHUQdRB1GHUUdRx1FHUYdRh1IHUcdSR1HHUgdSB1KHUkdSx1JHUodSh1MHUsdTR1LHUwdTB1OHU0dTx1NHU4dTh1QHU8dUR1PHVAdUB1SHVEdUx1UHVUdVR1WHVMdVx1VHVQdVB1YHVcdWR1XHVgdWB1aHVkdWx1ZHVodWh1cHVsdXR1bHVwdXB1eHV0dXx1dHV4dXh1gHV8dQh1fHWAdYB0/HUIdYR1iHWMdYx1kHWEdZR1jHWIdYh1mHWUdZx1lHWYdZh1oHWcdaR1nHWgdaB1qHWkdax1pHWodah1sHWsdbR1rHWwdbB1uHW0dbx1tHW4dbh1wHW8dcR1vHXAdcB1yHXEdcx1xHXIdch10HXMddR12HXcddx14HXUdeR13HXYddh16HXkdex15HXodeh18HXsdfR17HXwdfB1+HX0dfx19HX4dfh2AHX8dgR1/HYAdgB2CHYEdZB2BHYIdgh1hHWQdgx2EHYUdhR2GHYMdhx2FHYQdhB2IHYcdiR2HHYgdiB2KHYkdix2JHYodih2MHYsdjR2LHYwdjB2OHY0djx2NHY4djh2QHY8dkR2PHZAdkB2SHZEdkx2RHZIdkh2UHZMdlR2THZQdlB2WHZUdlx2YHZkdmR2aHZcdmx2ZHZgdmB2cHZsdnR2bHZwdnB2eHZ0dnx2dHZ4dnh2gHZ8doR2fHaAdoB2iHaEdox2hHaIdoh2kHaMdhh2jHaQdpB2DHYYdjByLHKUdpR2mHYwcph2lHacdpx2oHaYdqB2nHZYclhyVHKgdqR2qHasdqx2sHakdqR2sHa0drR2uHakdrx2uHa0drR2wHa8drx2wHbEdsR2yHa8dsx2yHbEdsR20HbMdsx20HbUdtR22HbMdtx22HbUdtR24Hbcdtx24HbkduR26Hbcdux26HbkduR28Hbsdux28Hb0dvR2+Hbsdvx2+Hb0dvR3AHb8dwR3CHcMdwx3EHcEdxR3EHcMdwx3GHcUdxR3GHccdxx3IHcUdyR3IHccdxx3KHckdqh3JHcodyh2rHaodyx3MHc0dzR3OHcsdzh3NHc8dzx3QHc4d0B3PHdEd0R3SHdAd0h3RHdMd0x3UHdId1B3THdUd1R3WHdQd1h3VHdcd1x3YHdYd2B3XHdkd2R3aHdgdzB3LHdsd2x3cHcwd3B3bHd0d3R3eHdwd3h3dHd8d3x3gHd4d4B3fHeEd4R3iHeAd4h3hHeMd4x3kHeId5B3jHeUd5R3mHeQd5h3lHecd5x3oHeYd6B3nHekd6R3qHegd6h3pHesd6x3sHeod7R3uHe8d7x3wHe0d7R3wHfEd8R3yHe0d8x3yHfEd8R30HfMd8x30HfUd9R32HfMd9x32HfUd9R34Hfcd9x34Hfkd+R36Hfcd+x36Hfkd+R38Hfsd/R3vHe4d7h3+Hf0d/x39Hf4d/h0AHv8d/x0AHgEeAR4CHv8dAx4CHgEeAR4EHgMeAx4EHgUeBR4GHgMeBx4GHgUeBR4IHgceBx4IHgkeCR4KHgceCx4KHgkeCR4MHgseCx4MHg0eDR4OHgseDx4QHhEeER4SHg8eER4QHhMeEx4UHhEeFR4UHhMeEx4WHhUeFR4WHhceFx4YHhUeGR4YHhceFx4aHhkeGR4aHhseGx4cHhkeHR4cHhseGx4eHh0eHR4eHh8eHx4gHh0eIR4gHh8eHx4iHiEeIR4iHiMeIx4kHiEeJR4kHiMeIx4mHiUeJx4oHikeKR4qHiceKx4qHikeKR4sHiseKx4sHi0eLR4uHiseLx4uHi0eLR4wHi8eEh4vHjAeMB4PHhIeMR4yHjMeMx40HjEeMh4xHjUeNR42HjIeNh41HjceNx44HjYeOB43HjkeOR46HjgeOh45HjseOx48HjoePB47Hj0ePR4+HjwePh49Hj8ePx5AHj4eNB4zHkEeQR5CHjQeQh5BHkMeQx5EHkIeRB5DHkUeRR5GHkQeRh5FHkceRx5IHkYeSB5HHkkeSR5KHkgeSh5JHkseSx5MHkoeTB5LHk0eTR5OHkweTh5NHk8eTx5QHk4eUB5PHlEeUR5SHlAeUx5UHlUeVR5UHlYeVR5XHlMeWB5ZHloeWh5ZHlMeUx5XHloeWh5bHlgeVh5cHlUeXR5eHlgeWB5bHl0eXx5eHl0eXR5gHl8eXx5gHmEeYR5iHl8eYx5iHmEeYR5kHmMeZR5jHmQeZB5mHmUeZx5lHmYeZh5oHmceZx5oHmkeaR5qHmceax5qHmkeaR5sHmseax5sHm0ebR5uHmsebx5uHm0ebR5wHm8ebx5wHnEecR5yHm8ecx5yHnEecR50HnMedR52Hncedx54HnUedR54HnkeeR56HnUeex56HnkeeR58Hnseex58Hn0efR5+Hnsefx5+Hn0efR6AHn8efx6AHoEegR6CHn8egx6CHoEegR6EHoMegx6EHoUehR6GHoMehx6GHoUehR6IHoceiR6KHoseix6MHokejR6MHoseix6OHo0ejR6OHo8ejx6QHo0ekR6QHo8ejx6SHpEekR6SHpMekx6UHpEelR6UHpMekx6WHpUedh6VHpYelh53HnYelx6YHpkemR6aHpcemB6XHpsemx6cHpgenB6bHp0enR6eHpwenh6dHp8enx6gHp4eoB6fHqEeoR6iHqAeoh6hHqMeox6kHqIepB6jHqUepR6mHqQeph6lHqcepx6oHqYeqB6nHqkeqR6qHqgeqh6pHqseqx6sHqoerB6rHq0erR6uHqwerh6tHq8erx6wHq4esB6vHrEesR6yHrAesh6xHrMesx60HrIetB6zHrUetR62HrQeth61Hpoemh6ZHrYetx64HrkeuR66Hrcetx66Hrseux68HrcevR68Hrseux6+Hr0evR6+Hr8evx7AHr0ewR7AHr8evx7CHsEewR7CHsMewx7EHsEexR7EHsMewx7GHsUexR7GHscexx7IHsUeyR7IHscexx7KHskeyx7MHs0ezR7OHssezx7OHs0ezR7QHs8ezx7QHtEe0R7SHs8e0x7SHtEe0R7UHtMe0x7UHtUe1R7WHtMe1x7WHtUe1R7YHtceuB7XHtge2B65Hrge2R7aHtse2x7cHtke2R7cHt0e3R7eHtke3x7eHt0e3R7gHt8e3x7gHuEe4R7iHt8e4x7iHuEe4R7kHuMe4x7kHuUe5R7mHuMe5x7mHuUe5R7oHuce5x7oHuke6R7qHuce6x7qHuke6R7sHuse7R7uHu8e7x7wHu0e8R7wHu8e7x7yHvEe8R7yHvMe8x70HvEe9R70HvMe8x72HvUe9R72Hvce9x74HvUe+R74Hvce9x76Hvke2h75Hvoe+h7bHtoe+x78Hv0e/R7+Hvse+x7+Hv8e/x4AH/seAR8AH/8e/x4CHwEfAR8CHwMfAx8EHwEfBR8EHwMfAx8GHwUfBR8GHwcfBx8IHwUfCR8IHwcfBx8KHwkfCR8KHwsfCx8MHwkfDR8MHwsfCx8OHw0fDx8QHxEfER8SHw8fEx8SHxEfER8UHxMfEx8UHxUfFR8WHxMfFx8WHxUfFR8YHxcfFx8YHxkfGR8aHxcfGx8aHxkfGR8cHxsf/B4bHxwfHB/9HvweHR8eHx8fHx8gHx0fHR8gHyEfIR8iHx0fIx8iHyEfIR8kHyMfIx8kHyUfJR8mHyMfJx8mHyUfJR8oHycfJx8oHykfKR8qHycfKx8qHykfKR8sHysfKx8sHy0fLR8uHysfLx8uHy0fLR8wHy8fMR8yHzMfMx80HzEfNR8yHzEfMR82HzUfNR82HzcfNx84HzUfOR84HzcfNx86HzkfOR86HzsfOx88HzkfPR88HzsfOx8+Hz0fHh89Hz4fPh8fHx4fPx9AH0EfQR9CHz8fQh9BH0MfQx9EH0IfRB9DH0UfRR9GH0QfRh9FH0cfRx9IH0YfSB9HH0kfSR9KH0gfSh9JH0sfSx9MH0ofTB9LH00fTR9OH0wfTh9NH08fTx9QH04fUB9PH1EfUR9SH1AfUx9UH1UfVR9WH1MfVh9VH1cfVx9YH1YfWB9XH1kfWR9aH1gfWh9ZH1sfWx9cH1ofXB9bH10fXR9eH1wfXh9dH18fXx9gH14fYB9fH0AfQB8/H2AfYR9iH2MfYx9kH2EfZB9jH2UfZR9mH2QfZh9lH2cfZx9oH2YfaB9nH2kfaR9qH2gfah9pH2sfax9sH2ofbB9rH20fbR9uH2wfbh9tH28fbx9wH24fcB9vH3EfcR9yH3Afch9xH3Mfcx90H3IfdR92H3cfdx94H3UfeB93H3kfeR96H3gfeh95H3sfex98H3offB97H30ffR9+H3wffh99H38ffx+AH34fgB9/H4EfgR+CH4Afgh+BH2IfYh9hH4Ifgx+EH4UfhR+GH4Mfhh+FH4cfhx+IH4YfiB+HH4kfiR+KH4gfih+JH4sfix+MH4ofjB+LH40fjR+OH4wfjh+NH48fjx+QH44fkB+PH5EfkR+SH5Afkh+RH5Mfkx+UH5IflB+TH5UflR+WH5Qflx+YH5kfmR+aH5cfmh+ZH5sfmx+cH5ofnB+bH50fnR+eH5wfnh+dH58fnx+gH54foB+fH6EfoR+iH6Afoh+hH6Mfox+kH6IfpB+jH4QfhB+DH6QfpR+mH6cfpx+oH6UfqB+nH6kfqR+qH6gfqh+pH6sfqx+sH6ofrB+rH60frR+uH6wfrh+tH68frx+wH64fsB+vH7EfsR+yH7Afsh+xH7Mfsx+0H7IftB+zH7UftR+2H7Qfth+1H7cftx+4H7YfuR+6H7sfux+8H7kfvB+7H70fvR++H7wfvh+9H78fvx/AH74fwB+/H8EfwR/CH8Afwh/BH8Mfwx/EH8IfxB/DH8UfxR/GH8Qfxh/FH6Yfph+lH8Yfxx/IH8kfyR/KH8cfxx/KH8sfyx/MH8cfzR/MH8sfyx/OH80fzR/OH88fzx/QH80f0R/QH88fzx/SH9Ef0R/SH9Mf0x/UH9Ef1R/UH9Mf0x/WH9Uf1R/WH9cf1x/YH9Uf2R/YH9cf1x/aH9kf2x/cH90f3R/eH9sf3x/cH9sf2x/gH98f3x/gH+Ef4R/iH98f4x/iH+Ef4R/kH+Mf4x/kH+Uf5R/mH+Mf5x/mH+Uf5R/oH+cfyB/nH+gf6B/JH8gf6R/qH+sf6x/sH+kf6x/qH+0f7R/uH+sf7x/uH+0f7R/wH+8f7x/wH/Ef8R/yH+8f8x/yH/Ef8R/0H/Mf8x/0H/Uf9R/2H/Mf9x/2H/Uf9R/4H/cf9x/4H/kf+R/6H/cf+x/6H/kf+R/8H/sf/R/+H/8f/x8AIP0fASAAIP8f/x8CIAEgASACIAMgAyAEIAEgBSAEIAMgAyAGIAUgBSAGIAcgByAIIAUgCSAIIAcgByAKIAkgCSAKIOkf6R/sHwkgCyAMIA0gDSAOIAsgDiANIA8gDyAQIA4gECAPIBEgESASIBAgEiARIBMgEyAUIBIgFCATIBUgFSAWIBQgFiAVIBcgFyAYIBYgGCAXIBkgGSAaIBggGiAZIBsgGyAcIBogHCAbIB0gHSAeIBwgHiAdIB8gHyAgIB4gICAfICEgISAiICAgIiAhICMgIyAkICIgJCAjICUgJSAmICQgJiAlICcgJyAoICYgKCAnICkgKSAqICggKiApIAwgDCALICogKyAsIC0gLSAuICsgLyAtICwgLCAwIC8gMSAvIDAgMCAyIDEgMyAxIDIgMiA0IDMgNSAzIDQgNCA2IDUgNyA1IDYgNiA4IDcgOSA3IDggOCA6IDkgOyA5IDogOiA8IDsgPSA7IDwgPCA+ID0gPyBAIEEgQiBBIEAgQCBDIEIgQyBEIEUgRSBCIEMgRiBFIEQgRCBHIEYgRyBIIEkgSSBGIEcgSiBJIEggSCBLIEogSyBMIE0gTSBKIEsgQSBOID8gTyA/IE4gTiBQIE8gUSBPIFAgUCBSIFEgUyBRIFIgLiBUIFUgViBVIFQgVCBXIFYgWCBWIFcgVyBZIFggWiBYIFkgWSBbIFogXCBaIFsgWyBdIFwgXiBcIF0gXSBfIF4gYCBeIF8gXyBhIGAgVSArIC4gYiBjIGQgZCBlIGIgYyBmIGcgZyBkIGMgaCBnIGYgZiBpIGggaSBqIGsgayBoIGkgbCBrIGogaiBtIGwgbiBsIG0gbSBTIG4gUiBuIFMgbyBwIHEgcSByIG8gcyBxIHAgcCB0IHMgdSBzIHQgdCB2IHUgdyB1IHYgdiB4IHcgeSB3IHggeCB6IHkgeyB5IHogeiB8IHsgfSB7IHwgfCB+IH0gfyB9IH4gfiCAIH8ggSB/IIAggCCCIIEggyCEIIUghSCGIIMghyCDIIYghiCIIIcgiSCHIIggiCCKIIkgiyCJIIogiiCMIIsgjSCLIIwgjCCOII0gjyCNII4gjiCQII8gciCPIJAgkCBvIHIgkSCSIJMgkyCUIJEglSCTIJIgkiCWIJUglyCVIJYgliCYIJcgmSCXIJggmCCaIJkgmyCZIJogmiCcIJsgnSCbIJwgnCCeIJ0gnyCdIJ4gniCgIJ8goSCfIKAgoCCiIKEgoyChIKIgoiCkIKMgpSCmIKcgpyCoIKUgqSClIKggqCCqIKkgqyCpIKogqiCsIKsgrSCrIKwgrCCuIK0gryCtIK4griCwIK8gsSCvILAgsCCyILEglCCxILIgsiCRIJQgsyC0ILUgtSC2ILMgtyC1ILQgtCC4ILcguSC3ILgguCC6ILkguyC5ILoguiC8ILsgvSC7ILwgvCC+IL0gvyC9IL4gviDAIL8gwSC/IMAgwCDCIMEgwyDBIMIgwiDEIMMgxSDDIMQgxCDGIMUgxyDIIMkgySDKIMcgyyDHIMogyiDMIMsgzSDLIMwgzCDOIM0gzyDNIM4gziDQIM8g0SDPINAg0CDSINEg0yDRINIg0iDUINMgtiDTINQg1CCzILYg1SDWINcg1yDYINUg2CDXINkg2SDaINgg2iDZINsg2yDcINog3CDbIN0g3SDeINwg3iDdIN8g3yDgIN4g4CDfIOEg4SDiIOAg4iDhIOMg4yDkIOIg5CDjIOUg5SDmIOQg5iDlIOcg5yDoIOYg6SDqIOsg6yDsIOkg7CDrIO0g7SDuIOwg7iDtIO8g7yDwIO4g8CDvIPEg8SDyIPAg8iDxIPMg8yD0IPIg9CDzIPUg9SD2IPQg9iD1INYg1iDVIPYg9yD4IPkg+SD6IPcg+iD5IPsg+yD8IPog/CD7IP0g/SD+IPwg/iD9IP8g/yAAIf4gACH/IAEhASECIQAhAiEBIQMhAyEEIQIhBCEDIQUhBSEGIQQhBiEFIQchByEIIQYhCCEHIQkhCSEKIQghCyEMIQ0hDSEOIQshDiENIQ8hDyEQIQ4hECEPIREhESESIRAhEiERIRMhEyEUIRIhFCETIRUhFSEWIRQhFiEVIRchFyEYIRYhGCEXIfgg+CD3IBghGSEaIRshGyEcIRkhHCEbIR0hHSEeIRwhHiEdIR8hHyEgIR4hICEfISEhISEiISAhIiEhISMhIyEkISIhJCEjISUhJSEmISQhJiElISchJyEoISYhKCEnISkhKSEqISghKiEpISshKyEsISohLSEuIS8hLyEwIS0hMCEvITEhMSEyITAhMiExITMhMyE0ITIhNCEzITUhNSE2ITQhNiE1ITchNyE4ITYhOCE3ITkhOSE6ITghOiE5IRohGiEZITohOyE8IT0hPSE+ITshPiE9IT8hPyFAIT4hQCE/IUEhQSFCIUAhQiFBIUMhQyFEIUIhRCFDIUUhRSFGIUQhRiFFIUchRyFIIUYhSCFHIUkhSSFKIUghSiFJIUshSyFMIUohTCFLIU0hTSFOIUwhTyFQIVEhUSFSIU8hUiFRIVMhUyFUIVIhVCFTIVUhVSFWIVQhViFVIVchVyFYIVYhWCFXIVkhWSFaIVghWiFZIVshWyFcIVohXCFbITwhPCE7IVwhXSFeIV8hXyFgIV0hYSFiIWMhYyFkIWEhZSFjIWIhYiFmIWUhZyFlIWYhZiFoIWchaSFnIWghaCFqIWkhayFpIWohaiFsIWshayFsIW0hbSFuIWshbyFuIW0hbSFwIW8hcSFyIXMhcyF0IXEhdSFxIXQhdCF2IXUhcSF1IXchdyF4IXEhciFxIXgheCF5IXIheiF1IXYhdiF7IXohfCF6IXsheyF9IXwhfiF6IXwhfiF3IXUhdSF6IX4hfCF/IX4hdyF+IYAhgCGBIXcheCF3IYEhgSGCIXgheSF4IYIhgiGDIXkhhCGAIX4hfiF/IYQhhSF8IX0hfyF8IYUhfSGGIYUhhyGFIYYhhiGIIYchiSGHIYghiCGKIYkhiyGJIYohiiGMIYshiSGLIY0hjSGOIYkhjyGMIYohiiGQIY8hkSGMIY8hiyGMIZEhjyGSIZEhjiGNIZMhkyGUIY4hlSGNIYshiyGWIZUhkSGWIYshlyGTIY0hjSGVIZchjiGYIYkhmCGZIYkhjiGUIZohmiGYIY4hmSGYIZohmiGbIZkhnCGZIZshmSGcIYchhSGHIZwhnCGdIYUhnSGcIZ4hmyGeIZwhniGfIZ0hhyGJIZkhhSGdIX8hfyGdIZ8hnyGEIX8hoCGhIaIhoiGjIaAhpCGgIaMhoyGlIaQhpiGiIaEhoSGnIaYhqCGmIachpyGpIaghqiGoIakhqSGrIaohrCGqIashqyGtIawhriGsIa0hrSGvIa4hsCGuIa8hryGxIbAhsiGwIbEhsSGzIbIhtCG1IbYhtiG3IbQhuCG1IbQhtCG5IbghuiG4IbkhuSG7IbohvCG6IbshuyG9IbwhviG8Ib0hvSG/Ib4hwCG+Ib8hwSG3IbYhtiHCIcEhwyHBIcIhwiHEIcMhxSHDIcQhxCHGIcUhxyHIIckhySHKIcchyyHKIckhySHMIcshzSHOIc8hzyHQIc0h0SHOIc0hzSHSIdEh0yHUIdUh1SHWIdMh1yHYIdkh2SHaIdch1yHaIdsh2yHcIdch3CHbId0h3SHeIdwh3iHdId8h3yHgId4h4CHfIeEh4SHiIeAh4yHiIeEh4SHkIeMh5SHjIeQh5CHmIeUh5yHoIekh6iHpIegh6iHoIesh6iHrIewh7SHqIewh7CHuIe0h7SHuIe8h7yHwIe0h8CHvIfEhsiGzIfIh8yH0IfUh9iH0IfMh8yH3IfYh+CH5Ifoh+iH7Ifgh/CH9If4h/iH/IfwhACIBIgIiAiIDIgAiBCIFIgYiBiIHIgQiCCIJIgoiCiILIggiDCINIg4iDiIPIgwiDiINIhAiECIRIg4iEiITIg4iDiIRIhIiFCIVIhYiFiIXIhQiGCIVIhQiFCIZIhgiGSIUIhciFyIaIhkiGyIcIh0iHSIeIhsiHyIgIiEiISIiIh8iIyIgIh8iHyIkIiMiJSImIiciJyIoIiUiKSIiIiEiISIqIikiKyIlIigiKCIsIisiLSIuIi8iLyIwIi0iMCIvIjEiMSIyIjAiMyI0IjUiNSI2IjMiNyI1IjQiNCI4IjciOSI3IjgiOCI6IjkiOyI5IjoiOiI8IjsiPSI7IjwiPCI+Ij0iMyI2Ij8iPyJAIjMiQSJAIj8iPyJCIkEiQyJBIkIiQiJEIkMiRSJDIkQiRCJGIkUiRiI9Ij4iPiJFIkYiRyIpIioiKiJIIkciSSJKIh8iHyIiIkkiLCJLIkwiTCIrIiwiTSJOIigiKCInIk0iLCIoIk4iTiJPIiwiUCJRIlIiUiJTIlAiVCJSIlEiUSJVIlQiKSJHIlYiViJXIikiLCJYIlkiWSJLIiwiHyJaIlsiWyIkIh8iXCJdIl4iXiJfIlwiYCJhImIiYiJjImAiZCJlImYiZiJnImQiZiJlImgiaCJpImYiaiJpImgiaCJrImoibCJtIm4ibiJvImwicCJxInIiciJzInAidCJ1IiIiIiIpInQidiJ3IngieCJ5InYidyJ2InoieiJ7IncifCJ9In4ifiJ/InwifyJ+IoAigCKBIn8igiKDIoQihCKFIoIihiKHIogiiCKJIoYiiiKLIowijCKNIooijiKPIpAikCKRIo4ijyKOIpIikiKTIo8ikyKSIpQilCKVIpMilSKUIpYiliKXIpUilyKWIpgimCKZIpcimiKZIpgimCKbIpoinCKaIpsimyKdIpwiniKfIqAioCKhIp4inyKeIqIioiKjIp8ipCKiIp4iniKlIqQipSKeIqEioSKmIqUioyKiIqcipyKoIqMiqCKnIqkiqSKqIqgiqSKnIqsiqyKnIqIioiKkIqsiqyKsIqkirSKrIqQipCKuIq0iriKkIqUipSKvIq4isCKvIqUipSKmIrAisSKsIqsiqyKtIrEiqiKpIrIisiKpIqwisiKzIqoisyKyIrQitCK1IrMitSK0IrYitiK3IrUityK2IrgiuCK5IrciuiK4IrYitiK7IroityK5IrwivCK9IrcivCK5Ir4iviK5IrgiviK/IrwiwCK6IrsiuyLBIsAiuCK6IsIiwiLDIrgiuCLDIr4ixCLCIroiuiLAIsQiuyK2IsUixSK2IsYixiK2IrQitCLHIsYixyK0IrIisiLIIsciySLHIsgiyCLKIskirCLIIrIiyiLIIqwirCKxIsoixyLJIssiyyLGIscixiLLIswizCLFIsYiuyLFIswizCLBIrsizSLOIs8izyLQIs0iziLNItEi0SLSIs4i0CLPItMi0yLUItAi1CLTItUi1SLWItQi1iLVItci1yLYItYi2CLXItki2SLaItgi2iLZItsi2yLcItoi3CLbIt0i3SLeItwi3iLdIt8i3yLgIt4i4SLiIuMi4yLkIuEi5CLjIuUi5SLmIuQi5iLlIuci5yLoIuYi6CLnIuki6SLqIugi6iLpIusi6yLsIuoi7SLsIusi4iLhIu4i7iLvIuIi7yLuIvAi8CLxIu8i8SLwIvIi8iLzIvEi9CL1IvYi9iL3IvQi9iL1Ivgi+CL5IvYi+iL7Ivwi/CL9Ivoi/SL8Iv4i/iL/Iv0iACMBIwIjAiMDIwAjBCMFIwYjBiMHIwQjBSMEIwgjCCMJIwUjCSMIIwojCiMLIwkjCyMKIwwjDCMNIwsjDSMMIw4jDiMPIw0jDyMOIxAjECMRIw8jESMQIxIjEiMTIxEjFCMVIxYjFyMVIxQjFyMYIxUjGCMZIxUjGCMXIxojGiMbIxgjHCMbIxojGiMdIxwjHiMcIx0jHyMgIyEj4CLfIiIjICMfIyMjIyMkIyAjJSMmIycjJyMoIyUjKSMqIysjKyMsIykjLSMuIy8jLyMwIy0jMSMyIzMjMyM0IzEjNSM2IzcjNyM4IzUjOSM6IzsjOyM8IzkjPCM7Iz0jPSM+IzwjPyM9IzsjOyNAIz8jQSNCI0MjQyNEI0EjQyNCI0UjRSNGI0MjRCNDI0YjRiNHI0QjSCNJI0ojSiNLI0gjTCNNI04jTiNPI0wjTCNPI1AjUCNRI0wjUiNTI1QjVCNVI1IjTiNNI1YjViNXI04jVSNUI1gjWCNZI1UjWiNbI1wjXCNdI1ojXiNcI1sjWyNfI14jYCNhI2IjYiNjI2AjYyNiI2QjZCNlI2MjZSNkI2YjZiNnI2UjZyNmI2gjaCNpI2cjaSNoI2ojaiNrI2kjYSNgI2wjbCNtI2EjbSNsI24jbiNvI20jbyNuI3AjcCNxI28jcSNwI3IjciNzI3EjcyNyI2sjayNqI3MjdCN1I1cjVyNWI3QjTCN2I3cjdyNNI0wjWSNYI3gjeCN5I1kjVSN6I3sjeyNSI1UjWSN8I3ojeiNVI1kjfSN+I38jfyOAI30jgCN/I4EjgSOCI4AjViODI4QjhCN0I1YjhSOGI1kjWSN5I4UjhyOII0wjTCNRI4cjiSOKI4sjiyOMI4kjjSOOI48jjyOQI40jkSOSI5MjkyOUI5EjlCOTI5UjlSOWI5QjliOVI5cjlyOYI5YjmSOaI5sjmyOcI5kjnSOeI58jnyOgI50jTSOhI6IjoiNWI00joyOkI6UjpSOmI6MjpyOoI6kjqSOqI6cjpCOrI6wjrCOlI6QjrSOuI68jryOwI60jqCOxI7IjsiOpI6gjsyO0I7UjtSO2I7MjtyO4I7kjuSO6I7cjuyO8I70jvSO+I7sjuSO4I78jvyPAI7kjwSPCI8MjwyPEI8EjwSPEI8UjxSPGI8EjxyPII8kjySPKI8cjyyPMI80jzSPOI8sjyyPOI88jzyPQI8sj0SPSI9Mj0yPUI9Ej1SPWI9cj1yPYI9Uj2SPaI9sj2yPcI9kj1yPWI90j3SPeI9cj3yPgI+Ej4SPiI98j4yPkI+Uj5SPmI+Mj5yPfI+Ij4iPoI+cj6SPqI+sj6yPsI+kj7SPuI+8j7yPwI+0j6SPsI/Ej8SPyI+kj8yPeI90j3SP0I/Mj9SPyI/Ej8SP2I/Uj9yPnI+gj6CP4I/cj+SPAI78jvyP6I/kj+yP8I/0j/SP+I/sj/yMAJAEkASQCJP8jAyQEJAUkBSQGJAMkByQIJAkkCSQKJAckCyQGJAUkBSQMJAskDSQOJA8kDyQQJA0kESQOJA0kDSQSJBEkEyQUJBUkFSQWJBMkFyQYJBkkGSQaJBckGyQYJBckFyQcJBskHSQeJB8kHyQgJB0kISQiJCMkIyQkJCEkJSQmJCckJyQoJCUkKSQkJCMkIyQqJCkkKyQsJC0kLSQuJCskLyQwJDEkMSQyJC8kLCQrJDMkMyQ0JCwkNSQ2JDckNyQ4JDUkOSQ6JDskOyQ8JDkkPSQ2JDUkNSQ+JD0kPyRAJCkkKSQqJD8kQSRCJD0kPSQ+JEEkQyREJDQkNCQzJEMkRSRGJAskCyQMJEUkRyRIJEkkSSRKJEckSyRMJE0kTSROJEskTyRQJFEkUSRSJE8kTyRSJFMkUyRUJE8kVSRWJFckVyRYJFUkWSRaJFskWyRcJFkkXSReJF8kXyRgJF0kYSRgJF8kXyRiJGEkYyRhJGIkYiRkJGMkZSRjJGQkZCRmJGUkZyRlJGYkZiRoJGckZyRoJGkkaSRqJGckayRqJGkkaSRsJGskYyRlJG0kbSRuJGMkbyRtJGUkZSRnJG8kcCRxJHIkciRzJHAkdCR1JHYkdiR3JHQkdSR0JHgkeCR5JHUkcyRyJHokeyR5JHgkeCR8JHskeiR9JHMkeiR+JH8kfyR9JHokgCSBJIIkgiSDJIAkhCSFJIYkhiSHJIQkiCSJJIokiiSLJIgkjCSNJI4kjiSPJIwkjCSPJJAkkCSRJIwkiiSSJJMkkySLJIoklCSVJJYkliSXJJQkmCSUJJcklySZJJgkmiSbJJwknCSdJJokniSaJJ0knSSfJJ4kniSfJKAkoCShJJ4koiSeJKEkoSSjJKIkpCSlJKYkpiSnJKQkqCSpJKokqiSrJKgkrCStJK4kriSvJKwksCSxJLIksiSzJLAktCSxJLAksCS1JLQksySyJLYktiS3JLMktyS2JLgkuCS5JLcktCS1JLokuiS7JLQkuSS4JLwkvCS9JLkkviS9JLwkvCS/JL4kwCTBJMIkwiTDJMAkwyTCJMQkxCTFJMMkxSTEJMYkxiTHJMUkxyTGJMgkyCTJJMckyiTJJMgkyCTLJMokzCTNJM4kziTPJMwk0CTRJNIk0iTTJNAk1CTRJNAk0CTVJNQk0yTSJNYk1iTXJNMk1yTWJNgk2CTZJNck1CTVJNok2iTbJNQk2STYJNwk3CTdJNkk3iTdJNwk3CTfJN4k4CThJOIk4iTjJOAk4iThJOQk5CTlJOIk5iTlJOQk5CTnJOYk5yTkJOgk6CTpJOck6iToJOQk5CThJOok5iTnJOsk6yTsJOYk7STsJOsk6yTuJO0k7yTwJPEk8STyJO8k8yT0JPUk9ST2JPMk9yTzJPYk9iT4JPck+ST3JPgk+CT6JPkk+yT5JPok+iT8JPsk/ST7JPwk/CT+JP0k/yT9JP4k/iQAJf8kASX/JAAlACUCJQElAyUBJQIlAiUEJQMlBSUDJQQlBCUGJQUlByUFJQYlBiUIJQclCSUHJQglCCUKJQklCSUKJQslCyUMJQklDSUMJQslCyUOJQ0lDyUQJRElESUSJQ8lEyUSJRElESUUJRMlEyUUJRUlFSUWJRMlFiUVJRclFyUYJRYlGSUYJRclFyUaJRklFiUYJRslGyUcJRYlHSUbJRglGCUZJR0lECUPJR4lHyUeJQ8lDyUgJR8lISUeJR8lHyUiJSElHiUhJSMlIyUkJR4lHiUkJRAlJSUhJSIlIiUmJSUlJyUlJSYlJiUoJSclJSUnJSklKSUqJSUlISUlJSolKiUjJSElKyUnJSglKCUsJSslLSUrJSwlLCUuJS0lKyUtJS8lMCUvJS0lLSUxJTAlMSUtJS4lMiUwJTElMSUzJTIlLyU0JSslJyUrJTQlNCUpJSclLiU1JTElMSU1JTYlNiUzJTElNyU4JTklOSU6JTclOiU5JTslOyU8JTolPSU+JT8lPyVAJT0lQCU/JUElQSVCJUAlQyVEJUUlRSVGJUMlRiVFJUclRyVIJUYlSSVIJUclRyVKJUklSyVFJUwlTCVNJUslTiVLJU0lTyVMJUUlRSVEJU8lTSVQJU4lUSVSJVMlUyVUJVElVSVWJVclVyVYJVUlWSVaJVslWyVcJVklXSVeJV8lXyVgJV0lYSViJWMlYyVkJWElZSVkJWMlYyVmJWUlZyVoJWklaSVqJWclayVpJWglaCVsJWslbSVlJWYlZiVuJW0lbyVtJW4lbiVwJW8lcSVvJXAlcCVyJXElcyVxJXIlciV0JXMldSVzJXQldCV2JXUldSV2JXcldyV4JXUleSV6JXsleyV8JXklfSV5JXwlfiV7JXoleiV/JX4lgCV9JYElfCWBJX0lgSWCJYAlgyWAJYIlgiWEJYMlbCWDJYQlhCVrJWwlhSWGJYclhyWIJYUliCWHJYkliSWKJYgliiWJJYsljCWNJY4ljiWPJYwlkCWNJYwljCWRJZAljyWOJZIlkiWTJY8lkyWSJZQllCWVJZMllSWUJZYlliWXJZUllyWWJZglmCWZJZclmiWbJZwlnCWdJZolnSWcJZ4lniWfJZ0lkCWRJaAloCWhJZAloiWhJaAloCWjJaIlpCWlJaYlpiWnJaQlqCWlJaQlpCWpJaglpyWmJaolqiWrJaclqyWqJawlrCWtJaslrSWsJa4lriWvJa0lryWuJbAlsCWxJa8lsSWwJbIlsiWzJbElsyWyJbQltCW1JbMlqCWpJbYltiW3JagluCW3JbYltiW5JbgluiW1JbQltCW7JbolvCW6JbsluyW9JbwlviW/JcAlwCXBJb4lwiW+JcElwSXDJcIlxCXCJcMlwyXFJcQlxiXEJcUlxSXHJcYlyCXGJcclxyXJJcglyiXIJcklySXLJcolzCXKJcslyyXNJcwlziXMJc0lzSXPJc4lziXPJdAl0CXRJc4l0SXQJdIl0iXTJdEl1CXVJcAlwCW/JdQl1iXVJdQl1CXXJdYl2CXZJdol2iXbJdgl3CXaJdkl2SXdJdwl2iXcJd4l3iXfJdol4CXaJd8l3yXhJeAl2iXgJeIl4iXjJdol5CXaJeMl4yXlJeQl2iXkJeYl5iXnJdol2yXaJecl5yXoJdsl6SXqJesl6yXsJekl7SXqJekl6SXuJe0l7CXrJe8l7yXwJewl8CXvJfEl8SXyJfAl7SXuJfMl8yX0Je0l9SX0JfMl8yX2JfUl8iXxJfcl9yX4JfIl+SX4Jfcl9yX6Jfkl+yX8Jf0l/SX+Jfsl/yX8Jfsl+yUAJv8lASYCJgMmAyYEJgEmBSYBJgQmBCYGJgUmByYFJgYmBiYIJgcmCSYHJggmCCYKJgkmCyYDJgImAiYMJgsmDSYLJgwmDCYOJg0mDyYNJg4mDiYQJg8mESYPJhAmECYSJhEmEyYRJhImEiYUJhMmFSYTJhQmFCYWJhUmFyYVJhYmFiYYJhcmGSYXJhgmGCYaJhkmGyYcJh0mHSYeJhsmHyYbJh4mHiYgJh8mISYiJiMmIyYkJiEmJSYhJiQmJCYmJiUmJyYfJiAmICYoJicmKSYnJigmKCYqJikmKyYsJi0mLSYuJismLiYtJi8mLyYwJi4mMSYyJjMmMyY0JjEmNSYyJjEmMSY2JjUmNyY4JjkmOSY6JjcmOyY8Jj0mPSY+JjsmPyZAJkEmQSZCJj8mQSZAJkMmQyZEJkEmRCZDJkUmRSZGJkQmRiZFJkcmRyZIJkYmSCZHJkkmSSZKJkgmSyZKJkkmSSZMJksmSyZMJk0mTSZOJksmTyZHJkUmRSZQJk8mRyZPJlEmUSZJJkcmUiZTJlQmVCZVJlImViZXJlgmWCZZJlYmWiZYJlcmVyZbJlomXCZSJlUmWiZbJl0mXSZeJlomVSZfJlwmYCZhJlwmXCZfJmAmYiZjJmQmZCZlJmImZiZnJmgmaCZpJmYmaiZrJmwmbCZtJmombiZvJnAmcCZxJm4mciZxJnAmcCZzJnImbCZrJnQmdCZ1JmwmdiZ3JngmeCZ5JnYmeSZ4JnomeiZ7JnkmfCZ9Jn4mfiZ/JnwmfyZ+JoAmgCaBJn8mgiaBJoAmgCaDJoImgyaAJoQmhCaFJoMmhiaHJogmiCaJJoYmiiaLJowmjCaNJoomjiaPJpAmkCaRJo4mkiaTJpQmlCaVJpImkiaVJpYmliaXJpImmCaUJpMmkyaZJpgmmiaYJpkmmSabJpomnCaXJpYmliadJpwmniaaJpsmmyafJp4mniafJqAmoCahJp4moiajJqQmpCalJqImpiakJqMmoyanJqYmqCamJqcmpyapJqgmqiaoJqkmqSarJqomqiarJqwmrCatJqomriavJrAmsCaxJq4msiazJrQmtCa1JrImsia1JrYmtia3JrImuCa0JrMmsya5Jrgmuia4JrkmuSa7JromvCa3JrYmtia9Jrwmvia6Jrsmuya/Jr4mvia/JsAmwCbBJr4mwibDJsQmxCbFJsImxibDJsImwibHJsYmxibHJsgmyCbJJsYmyibGJskmySbLJsomzCbDJsYmxibKJswmzSbJJsgmyCbOJs0mzSbOJs8mzybQJs0m0SbSJtMm0ybUJtEm1SbWJtcm1ybYJtUm1ibVJtkm2SbaJtYm2ibZJtsm2ybcJtom3CbbJt0m3SbeJtwm3ibdJt8m3ybgJt4m4CbfJuEm4SbiJuAm4ibhJuMm4ybkJuIm5CbjJuUm5SbmJuQm5iblJucm5yboJuYm6CbnJukm6SbqJugm6ibpJusm6ybsJuom7SbsJusm6ybuJu0m7SbuJu8m7ybwJu0m8SbyJvMm8yb0JvEm8Sb0JvUm9Sb2JvEm9yb2JvUm9Sb4Jvcm+Sb3Jvgm+Cb6Jvkm+yb5Jvom+ib8Jvsm/Sb6Jvgm+Cb+Jv0m/yb8Jvom+ib9Jv8mACfzJvIm8yYAJwEnAScCJ/MmAScAJwMnAycEJwEnBScDJwAnACcGJwUn8iYGJwAnBCcDJwcnBycIJwQnCCcHJwknCScKJwgnCycJJwcnBycMJwsnDCcHJwMnAycFJwwnCicJJw0nDScOJwonDicNJw8nDycQJw4nEScPJw0nDycRJxInEicTJw8nECcPJxMnEycSJxQnFCcVJxMnDScWJxEnFicNJwknCScLJxYnEycXJxAnEycVJxgnGCcXJxMnGScaJxsnGyccJxknHScbJxonGiceJx0nHycgJyEnIicgJx8nIScjJx8nHyckJyInJScmJycnJycoJyUnKSclJygnKCcqJyknKScqJysnKycsJyknLSclJy4nLicvJy0nLycuJzAnMScmJyUnJSctJzEnMCcyJy8nMyc0JzUnNSc2JzMnNyc4JzknOSc6JzcnOyc8Jz0nPSc+JzsnPydAJ0EnQSdCJz8nQydEJ0UnRSdGJ0MnQydGJ0cnRydIJ0MnSSdKJ0snSydMJ0knTSdOJ0onSidJJ00nSCdHJ08nTydQJ0gnUCdPJ1EnUSdSJ1AnUidRJ1MnUydUJ1InVCdTJ1UnVSdWJ1QnVidVJ1cnVydYJ1YnWSdYJ1cnVydaJ1knWydcJ10nXSdeJ1snXiddJ18nYCdhJ1wnXCdbJ2AnYidfJ2MnXydiJ14nYydkJ2InZCdjJ2UnZSdmJ2QnZidlJ04nTidNJ2YnZydoJ2knaSdqJ2cnaydpJ2gnaCdsJ2snbCdtJ2snbidvJ3AncCdxJ24nbidxJ3IncidzJ24ndCdwJ28nbyd1J3Qndid0J3UndSd3J3YneCd2J3cndyd5J3gneid4J3kneSd7J3onfCd9J34nfid/J3wngCd8J38nfyeBJ4AngidzJ3IncieDJ4IngieDJ4QnhCeFJ4InhieHJ4gniCeJJ4YnhieJJ4oniieLJ4YnjCeIJ4cnhyeNJ4wnjieMJ40njSePJ44nkCeOJ48njyeRJ5AnkieQJ5EnkSeTJ5InlCeSJ5MnkyeVJ5QnlieUJ5UnlSeXJ5YnmCeLJ4oniieZJ5gnmCeZJ5onmiebJ5gnlieXJ5wnnCedJ5YnnSecJ54nniefJ50noCehJ6InoiejJ6AnoSegJ6QnpCelJ6EnpSekJ6YnpienJ6UnpyemJ6gnqCepJ6cnqSeoJ6onqierJ6knqyeqJ6wnrCetJ6snrSesJ64nrievJ60nryeuJ7AnsCexJ68nsiexJ7AnsCezJ7IntCeyJ7Mnsye1J7QntiejJ6Inoie3J7Yntie3J7gnuCe5J7Ynuie7J7wnvCe9J7onvSe8J74nvie/J70nwCe+J7wnvCfBJ8AnwSe8J8InwifDJ8EnxCfCJ7wnvCfFJ8QnxSe8J8YnxifHJ8UnyCfGJ7wnvCfJJ8gnySe8J7snuyfKJ8knyyfMJ80nzSfOJ8snyyfOJ88nzyfQJ8sn0SfNJ8wnzCfSJ9En0yfRJ9In0ifUJ9Mn1SfQJ88nzyfWJ9Un1SfWJ9cn1yfYJ9Un2SfTJ9Qn1CfaJ9kn2SfaJ9sn2yfcJ9kn3SfeJ98n3yfgJ90n3SfgJ+En4SfiJ90n4yfkJ+Un5SfmJ+Mn5CfjJ+cn5yfoJ+Qn6CfnJ+kn6SfqJ+gn6ifpJ+sn6yfsJ+on5iflJ+0n7SfuJ+Yn7iftJ+8n7yfwJ+4n8CfvJ/En8SfyJ/An8ifxJ/Mn8yf0J/In9CfzJ/Un9Sf2J/Qn9if1J/cn9yf4J/Yn+Cf3J/kn+Sf6J/gn+if5J/sn+yf8J/on/Sf+J/8n/ycAKP0n/if9JwEoASgCKP4nAygEKAUoBSgGKAMoBigFKAcoBygIKAYoAigBKAkoCSgKKAIoCigJKAsoCygMKAooDSgOKA8oDygQKA0oESgPKA4oDigSKBEoEygUKBUoFSgWKBMoFygYKBkoFygZKBooGSgbKBooGygZKBwoHCgdKBsoHigfKCAoICghKB4oIigfKB4oHigjKCIoJCglKCYoJignKCQoKCgpKCooKigrKCgoLCgtKC4oLigvKCwoMCgxKDIoMigzKDAoNCg1KDYoNig3KDQoOCg2KDUoNSg5KDgoNCg3KDooOig4KDkoOig3KDsoOyg8KDooOig9KDQoOSg9KDooPig/KEAoQChBKD4oQihDKEQoRChFKEIoRihHKEgoSChJKEYoSihLKEwoSihMKE0oSihNKE4oTyhMKEsoSyhQKE8oUShSKFMoUyhUKFEoUShUKFUoVShWKFEoVyhYKFkoWShaKFcoWyhcKF0oXSheKFsoXyhgKGEoYShiKF8oYyhkKGUoZShmKGMoZyhoKGkoaShqKGcoaChnKGsoayhsKGgobShqKGkobChrKG0obihqKG0obShvKG4oaShwKG0obShwKGwocShyKHMocyh0KHEodSh2KHcodyh4KHUoeSh6KHsoeyh8KHkofCh7KH0ofSh+KHwofih9KH8ofyiAKH4ogCh/KIEogSiCKIAogiiBKIMogyiEKIIohSiEKIMogyiGKIUohSiGKIcohyiIKIUoiSiIKIcohyiKKIkoiSiKKIsoiyiMKIkojSiMKIsoiyiOKI0ojSiOKI8ojyiQKI0okSiSKJMokyiUKJEolCiTKJUolSiWKJQoliiVKJcolyiYKJYomCiXKJkomSiaKJgomiiZKJsomyicKJoonSieKJ8onyigKJ0ooSifKJ4oniiiKKEooyikKKUopSimKKMopyilKKQopCioKKcoqSinKKgoqCiqKKkoqyipKKooqiisKKsorSirKKworCiuKK0orSiuKK8oryiwKK0osSiwKK8oryiyKLEosyixKLIosii0KLMotSizKLQotCi2KLUotyi1KLYotii4KLcouSi3KLgouCi6KLkouyi5KLoouii8KLsovSi7KLwovCi+KL0ovyi9KL4ovijAKL8ovyjAKMEowSjCKL8owyjCKMEowSjEKMMoxSjDKMQoxCjGKMUoxSjGKMcoxyjIKMUoySjKKMsoyyjMKMkozSjLKMooyijOKM0ozyjNKM4ozijQKM8o0SjPKNAo0CjSKNEo0yjRKNIo0ijUKNMo0yjUKNUo1SjWKNMo1yjWKNUo1SjYKNco1yjYKNko2SjaKNco2yjaKNko2SjcKNso2yjcKN0o3SjeKNso3yjeKN0o3SjgKN8o4SjiKOMo4yjkKOEo5SjhKOQo5CjmKOUo5SjmKOco5yjoKOUo6CjnKOko6SjqKOgo6ijpKOso6yjsKOoo7SjuKO8o7yjwKO0o7yjuKPEo8SjyKO8o8yj0KPUo9Sj2KPMo9ij1KPco9yj4KPYo+Cj3KPko+Sj6KPgo+ij5KPso+yj8KPoo/Cj7KP0o/Sj+KPwo/yj+KP0o/SgAKf8o/ygAKQEpASkCKf8oAikBKQMpAykEKQIpBCkDKQUpBSkGKQQpBikFKQcpBykIKQYpCCkHKQkpCSkKKQgpCikJKQspCykMKQopDCkLKQ0pDSkOKQwpDikNKQ8pDykQKQ4pECkPKREpESkSKRApEikRKRMpEykUKRIpFCkTKRUpFSkWKRQpFykWKRUpFSkYKRcpGSkaKRspGSkbKRwpGSkcKR0pGSkdKR4pGSkeKR8pGSkfKSApGSkgKSEpGSkhKSIpGSkiKSMpGSkjKSQpGSkkKSUpGSklKSYpGSkmKScpGSknKSgpGSkoKSkpGSkpKRopKikdKRwpHCkrKSopHSkqKSwpLCkeKR0pHiksKS0pLSkfKR4pHyktKS4pLikgKR8pICkuKS8pLykhKSApISkvKTApMCkiKSEpIikwKTEpMSkjKSIpIykxKTIpMikkKSMpJCkyKTMpMyklKSQpJSkzKTQpNCkmKSUpJik0KTUpNSknKSYpJyk1KTYpNikoKScpKCk2KTcpNykpKSgpKSk3KTgpOCkaKSkpGik4KTkpOSkbKRopGyk5KSspKykcKRspOik5KTgpOCk7KTopOyk4KTcpOSk6KTwpPCkrKTkpKyk8KT0pPSkqKSspKik9KT4pPiksKSopLCk+KT8pPyktKSwpLSk/KUApQCkuKS0pLilAKUEpQSkvKS4pLylBKUIpQikwKS8pMClCKUMpQykxKTApMSlDKUQpRCkyKTEpMilEKUUpRSkzKTIpMylFKUYpRik0KTMpNClGKUcpRyk1KTQpNSlHKUgpSCk2KTUpNilIKUkpSSk3KTYpNylJKTspSilLKUwpSilNKUspSilOKU0pSilPKU4pSilQKU8pSilRKVApSilSKVEpSilTKVIpSilUKVMpSilVKVQpSilWKVUpSilXKVYpSilYKVcpSilZKVgpSilaKVkpSilMKVopTSlOKVspTilPKVwpXClbKU4pUClRKV0pUSlSKV4pXildKVEpUylUKV8pVClVKWApYClfKVQpVilXKWEpVylYKWIpYilhKVcpWSlaKWMpWilMKWQpZSlkKUwpTClLKWUpZillKUspSylNKWYpWylmKU0pZCljKVopZCllKWcpZyllKWYpZyloKWQpZilpKWcpaSlmKVspWylqKWkpailbKVwpXClrKWopaylcKWwpbClcKU8pTylQKWwpXSlsKVApbCltKWspbSlsKV0pXSluKW0pbildKV4pXilvKW4pbyleKXApcCleKVIpUilTKXApXylwKVMpcClxKW8pcSlwKV8pXylyKXEpcilfKWApYClzKXIpcylgKXQpdClgKVUpVSlWKXQpYSl0KVYpdCl1KXMpdSl0KWEpYSl2KXUpdilhKWIpYil3KXYpdyliKXgpeCliKVgpWClZKXgpYyl4KVkpeCl5KXcpeSl4KWMpYyl6KXkpeiljKWQpZCloKXopeyl8KX0pfSl+KXspfSl8KZIEkgR8KX8pfymRBJIEgCmRBH8pfymBKYApgimBKX8pfymDKYIphCmFKYYphymIKYkpiSmKKYcpiCmHKYspiymMKYgpjCmLKY0pjSmOKYwpeymDKY8pkCmPKYMpgyl/KZApkSmQKX8pfyl8KZEpkimRKXwpjymSKXspfCl7KZIpkymUKZUplSmWKZMplymYKZkpmSmaKZcpmymcKZ0pnSmeKZspnymgKaEpoSmiKZ8poymkKaUppSmmKaMppymoKakpqSmqKacpvASqKakpqymqKbwEvAS7BKspqym7BKwprCmtKaspqymtKa4primvKaspsCmxKbIpsymvKacppym0KbMptCmnKaoptSmrKa8prymzKbUptimqKaspqym1KbYpqim2KbQptym4KbkpuSm6Kbcpuym8Kb0pvSm+KbspvynAKcEpwSnCKb8pwynEKcUpxSnGKcMpxynIKckpySnKKccpyynMKc0pzSnOKcspzynMKcspyynQKc8p0SnPKdAp0CnSKdEp0ynRKdIp0inUKdMp1SnTKdQp1CnWKdUp1ynVKdYp1inYKdcp2SnXKdgp2CnaKdkp2ynOKc0pzSncKdsp3SnbKdwp3SneKdsp3SncKd8p3SnfKeAp4CnZKdop3SngKeEp2iniKeAp4CniKeEp4ynkKeUp5SnmKeMp5ynjKeYp5inoKecp5SnkKekp6SnqKeUp6ynsKe0p7SnuKesp7ynrKe4p7inwKe8p8SnyKecp8SnuKe0p7SnyKfEp5ynzKfEp8SnzKfQp9Sn0KfMp8yn2KfUp9inzKecp9Sn2Kfcp9yn4KfUp+Cn3Kfkp+in5Kfcp9yn7Kfop+yn3KfYp+Sn8Kfgp9in9Kfsp+yn9Kf4p/in/Kfsp+in7Kf8p/ykAKvopASoCKgMqBCoFKgYqByoGKgUqBSoIKgcq5yn9KfYpCSoHKggqCCoKKgkqCyoJKgoqCioMKgsqCyoMKg0q/SnnKegp6Cn+Kf0pDir4Kfwp/CkPKg4qECoOKg8qDyoRKhAqDioQKhIqDioTKvgpEyr1Kfgp9SkTKhQqFCr0KfUp9CkUKhUqFSoWKvQp9CkWKvEp7inxKRYqFirwKe4pFyrwKRYqFioVKhcq8CkXKhgqGSoaKhsqGSobKhwqGSocKh0qHiocKhsqHCoeKh8qICofKh4qHiohKiAqICohKiIqIiojKiAqISoeKiQqGyokKh4qJColKiEqIiohKiUqJSomKiIqHyogKicqJyooKh8qKSonKiAqICojKikqHyoqKhwqKiofKigqKCorKioqKiorKiwqLCotKioqLSocKioqLSodKhwqLioZKh0qHSovKi4qMCoxKjIqMiozKjAqNCozKjIqMio1KjQqNio0KjUqNSo3KjYqOCo5KjoqOio7KjgqPCo7KjoqOio9KjwqPio8Kj0qPSo/Kj4qQCo+Kj8qPypBKkAqQipDKkQqRCpFKkIqRSpEKkYqRipHKkUqSCpJKkoqSipLKkgqTCpJKkgqSCpNKkwqTCpNKkAqQCpBKkwqTipPKlAqUCpRKk4qUipQKk8qTypTKlIqUCpSKlQqVCpVKlAqVipRKlAqUCpVKlYqUipTKlcqVypYKlIqWCpXKlkqWSpaKlgqWipZKlsqWypcKloqXSpcKlsqWypeKl0qXypdKl4qXipgKl8qXSpfKmEqYSpiKl0qXCpdKmIqYipjKlwqZCpVKlQqVCplKmQqZCplKmYqZypmKmUqZSpoKmcqZypoKmkqaSpqKmcqayppKmgqaSprKmMqaCpsKmsqbCpoKmUqZSpUKmwqYyptKmkqaippKm0qbSpuKmoqZipvKmQqbiptKnAqcCptKmMqcCpxKm4qcipxKnAqcCpzKnIqWiprKmwqbCpYKloqaypaKlwqXCpjKmsqcipzKnQqdSp0KnMqdCp1KnYqdip3KnQqeCp0KncqdCp4KnIqdyp5Kngqeip2KnUqdSp7KnoqfCp6Knsqeyp9KnwqcyphKnUqYSpzKnAqcCpiKmEqYypiKnAqYCp9KnsqeypfKmAqdSphKl8qXyp7KnUqfip3KnYqeSp3Kn4qdip/Kn4qfyp2KnoqfiqAKnkqgSp6KnwqeiqBKn8qfCqCKoEqgyqEKoUqhSqGKoMqhyqEKoMqgyqIKocqiSqHKogqiCqKKokqiyqEKocqhSqEKosqhyqMKosqjCqHKokqiyqNKoUqiSqKKo4qjiqPKokqkCqJKo8qiSqQKowqjypZKpAqWypZKo8qjyqRKlsqkSqPKo4qjiqSKpEqkyqRKpIqWyqRKpMqkiqUKpMqlSqTKpQqlCqWKpUqkyqVKmAqYCqVKpcqlyp9KmAqfCp9KpcqlyqYKnwqmCqXKpkqlSqWKpkqmSqXKpUqmSqaKpgqYCpeKpMqkypeKlsqgip8KpgqmCqbKoIqmyqYKpoqmiqcKpsqnSqeKp8qnyqgKp0qoSqiKqMqoyqkKqEqpSqjKqIqoiqmKqUqpyqlKqYqpiqoKqcqqSqnKqgqqCqqKqkqqyqpKqoqqiqsKqsqrSqrKqwqrCquKq0qryqtKq4qriqwKq8qryqwKrEqsSqyKq8qsyqyKrEqsSq0KrMqtSq2Krcqtyq4KrUquSq1KrgquCq6Krkquyq5Kroquiq8KrsqvSq7KrwqvCq+Kr0qvyq9Kr4qvirAKr8qwSq/KsAqwCrCKsEqwyrBKsIqwirEKsMqxSrDKsQqxCrGKsUqxyrFKsYqxirIKscqySrKKssqyyrMKskqzCrLKs0qzSrOKswqzyrQKtEq0SrSKs8q0yrPKtIq0irUKtMq1SrTKtQq1CrWKtUq1yrVKtYq1irYKtcq2SraKtsq2yrcKtkq3SrZKtwq3CreKt0q3yrdKt4q3irgKt8qeSrfKuAq4Cp4Knkq3ircKuEq4SriKt4q3CrbKuMq4yrhKtwq5CrhKuMq4irhKuQq4yrlKuQq5CrmKuIq4irmKucq5yroKuIq3iriKugq6CrgKt4q6CrnKnEqbipxKucq5yrpKm4q6SrnKuYqcSpyKugqcip4KuAq4CroKnIq5irqKukq6irmKuQqbirpKusq6SrqKusq6ypqKm4qairrKuwq7CpnKmoqZipnKuwq7CrtKmYqbypmKu0q7SruKm8q7irtKu8q7yrwKu4q8SrwKu8q8irwKvEq8yryKvEq8yr0KvIq8yrxKvUq9CrzKvYq8yr3KvYq9yr4KvYq8SrvKvkq7yr6Kvkq+Cr3KvsqbyruKvsq/Cr4Kvsq7ir8Kvsq7irwKv0q/Sr+Ku4q/ir9Kv8q/yoAK/4qASsCKwMrAysEKwErBSsBKwQrBCsGKwUrASsFKwcrBysIKwErAisBKwgrCCsJKwIrCisLKwwrDCsNKworDisMKwsrCysPKw4rDCsOKxArECsRKwwrDSsMKxErESsSKw0rBSsGKxMrEysUKwUrBysFKxQrFSsUKxMrEysWKxUrFysVKxYrFisYKxcrGSsXKxgrGCsaKxkrGysXKxkrGSscKxsrHSsZKxorHCsZKx0rGiseKx0rHSsfKxwrICshKyIrIisjKyArJCsgKyMrIysiKyUrJSsmKyMrIysnKyQrKCskKycrKSsnKyMrKispKyMrFysbKysrLCslKyIrIistKywrLSsiKyErISsuKy0rJysvKygrJyspKzArMCsvKycrMSswKykrKSsyKzErMispKyorKiszKzIrMiszKzQrNCs1KzIrEissKy0rLSsNKxIrLSsuKworCisNKy0rKysVKxcrNisUKxUrFSsrKzYrFCs2KwcrNys4KzkrOis5KzgrOCs7KzorPCs6KzsrOys9KzwrPis6KzwrPCs/Kz4rOis+K0ArQCs5KzorOStBKzcrQis3K0ErOStAK0MrQytBKzkrQStEK0IrQitEK0UrRStGK0IrRytEK0ErQStDK0crRStEK0crRytIK0UrSSs8Kz0rPys8K0krPStKK0krSStLKz8rTCtGK0UrRStNK0wrTStFK0grSCtOK00rTStOK08rTytQK00rUStNK1ArUCtSK1ErUCtPK1MrUytUK1ArUitQK1QrVCtVK1IrVitXK1grWCtZK1Yr+SlWK1krWSv8KfkpViv5Kfop+ilaK1YrVytWK1orWitbK1crXCtdK14rXytgK2ErYStiK18rYytiK2ErYStkK2MrZStmK2crZytoK2UraStoK2crZytqK2kraStqK2sraytsK2krbStuK28rbytwK20rcStwK28rbytyK3Ercyt0K3UrdSt2K3Mrdyt0K3Mrcyt4K3creSt6K3sreyt8K3krfSt8K3sreyt+K30rfyuAK4ErgSuCK38rgyuCK4ErgSuEK4MrhSuGK4crhyuIK4UriSuIK4crhyuKK4kriSuKK4sriyuMK4krjSuIK4kriSuOK40rjiuJK4wrjyuFK4griCuNK48reiuQK5ErkSt7K3orfit7K5ErkSuSK34rjCuTK44rlCuVK5YrliuBK5QrhCuBK5YrliuXK4QrmCuZK5ormiubK5grmyuaK5wrnSueK5krmSuYK50rniudK58rnyugK54roSugK58rnyuiK6ErnCujK5sroSuiK6QrpCuWK6ErlyuWK6QrpCulK5crpiunK6grqCupK6YrqiupK6grqCurK6orrCuoK6crqyuoK6wrpyutK6wrrCuuK6srryuwK7ErsiuwK68rsSuzK68rryu0K7IrtSu2K7crtyu4K7UruSu1K7gruCu6K7kruyu5K7oruiu8K7srvSu7K7wrvCu+K70rvyu9K74rvivAK78rwSu3K7YrtivCK8ErwyvBK8IrwivEK8MrxSvDK8QrxCvGK8UrxyvFK8YrxivIK8crySvKK8sryyvMK8krzSvJK8wrzCvOK80rzyvNK84rzivQK88r0SvPK9Ar0CvSK9Er0yvLK8oryivUK9Mr1SvTK9Qr1CvWK9Ur1yvVK9Yr1ivYK9cr0SvSK9kr2SvaK9Er2yvaK9kr2SvcK9sr3SveK98r3yvgK90r4SvdK+Ar4CviK+Er4yvhK+Ir4ivkK+Mr5SvjK+Qr5CvmK+Ur5yvoK+kr6ivrK+wr7CvtK+or7ivqK+0r7SvvK+4r8CvxK/Ir8ivzK/Ar9CvwK/Mr8yv1K/Qr9iv0K/Ur9Sv3K/Yr+Cv2K/cr9yv5K/gr+ivuK+8r7yv7K/or/Cv9K/4r/iv/K/wrACz8K/8r/ysBLAAsAiwDLAQsBCwFLAIs+SsELAMsAyz4K/krbCpUKlIqUipYKmwqbyr7KgYsBixkKm8qZCoGLFYqVipVKmQqBywILAksCSwKLAcsBywLLAgsDCwNLA4sDiwPLAwsECwMLA8sDywRLBAsECwRLBIsEywULBUsFiwXLBgsGCwZLBYsGiwYLBcsFywbLBosGCwaLBwsHCwdLBgsGSwYLB0sHSweLBksGSweLB8sHywgLBksFiwZLCAsICwhLBYsIiwjLCQsJCwlLCIsJiwiLCUsJSwnLCYsKCwpLCosKywpLCgsKiwsLCgsLCwqLC0sLiwmLCcsLSwvLCwsJywwLC4sLiwwLDEsMSwyLC4sKCwzLCssNCwyLDEsNSw2LDcsNSwvLC0sLSw2LDUsNyw4LDUsMSw5LDQs5So6LDssOyzkKuUq5Co7LOoq6inpKTwsPCw9LOopPizsKesp6yk/LD4sPyzrKe8p7ylALD8sQSxALO8p3SpCLEMsQyzZKt0q2irZKkMsQyxELNoqQizdKt8q3ypFLEIsRSzfKnkqeSqAKkUsRixHLEgsRixILEksSCxKLEksRixJLEssSSxMLEssSSxNLEwsTCxOLEssTixPLEssRixLLFAsUSxSLFMsUSxTLFQsUSxULFUsUSxVLFYsVSxXLFYsVSxYLFcsUSxWLFksWixbLFwsXSxeLF8sWyxaLGAsYCxhLFssYixfLF4sXixjLGIsWixkLGUsZSxgLFosZixiLGMsYyxnLGYsaCxmLGcsZyxpLGgsaixrLGwsbCxtLGosZCxqLG0sbSxlLGQsbixoLGksaSxvLG4sayxwLHEscSxsLGsscixzLHQsdCx1LHIsdixyLHUsdyx4LHkseix7LHwsfCx9LHoscCx6LH0sfSxxLHAsfix/LIAsgSyCLIMshCyFLIYshyyGLIUshSyILIcsiSyKLIssiyyMLIksjSyJLIwsjCyOLI0sjyyNLI4sjiyQLI8skSySLJMskyyULJEslSyULJMsliyXLJgsmSyaLJssmiyZLJwsnSyeLM0qnSzNKssqyyqfLJ0soCyfLMsqyyrKKqAsoSyiLKMsoyykLKEspSykLKMsoyzUKqUspiylLNQq1CrSKqYspizSKtEq0SqnLKYspyzRKjUqNSqoLKcsqSyoLDUqNSoyKqksqSwyKjEqMSqqLKksqyysLK0srSyuLKssqyyuLK8sryywLKsssCyvLLEssSyyLLAssiyxLLMssyy0LLIstCyzLLUstSy2LLQstiy1LLcstyy4LLYsuCy3LLksuSy6LLgsrSysLLssuyy8LK0svSy8LLssvSy+LLwsvSy7LL8swCy+LL0suiy5LMAswCy9LMEswCzCLLoswCzBLMIswyzELMUsxSzGLMMsxizFLMcsxyzILMYsySzELMMswyzKLMksyyzMLM0szSzOLMsszizNLM8szyzQLM4sxyzRLNIsyyzOLNIs0izRLMss0izTLMcs1CzTLNIs0yzULNUs1SzWLNMsxyzTLNYs1yzWLNUs1SzYLNcs2SzXLNgs1yzZLNos2izbLNcs1izXLNss2CzcLNks2yzdLNYs3izdLNss2yzfLN4s3yzbLNos2izgLN8s4SziLOMs5CzlLOYs5SzkLOcs5yzoLOUs1izdLMcs6CznLOks6SzqLOgs6izpLOss6yzsLOos7CzrLO0syCzHLN0s3SzeLMgs7izvLNws3CzYLO4s7yzuLPAs8CzxLO8s7izYLPIs7izzLPAs2CzVLPIs9CzyLNUs1SzULPQs9CzULPUs0iz1LNQs9SzSLM4szizQLPUs9Sz2LPQs9yz2LPUs9SzQLPcs9yzQLM8szyzNLPgs+Cz5LM8s+iz4LM0szSzMLPos+yzJLMosyiz8LPss/Sz+LP8sAC0BLQItAC0CLQMtAi0ELQMtAC0DLQUtBi0FLQMtBS0GLQctBy0ILQUtCS0ILQctBy0KLQktCy0FLQgtBS0LLQAtCC0MLQstDS0MLQgtCC0JLQ0tDi0HLQYtCi0HLQ4tBi0PLQ4tDi0QLQotAy0RLQYtDy0GLREtES0SLQ8tEy0SLREtES0ULRMtFC0RLQMtFC0DLQQtFS0WLQQtBC0CLRUtFy0YLRktGS0aLRctFy0aLRstGy0cLRctHC0bLR0tHS0eLRwtHy0gLSEtIS0iLR8tHy0iLSMtIy0kLR8tJC0jLSUtJS0mLSQtJi0lLSctJy0oLSYtKS0qLSstKy0sLSktLS0rLSotKi0uLS0tLy0wLTEtMS0yLS8tLy0yLTMtMy00LS8tJy00LTMtMy0oLSctNS02LTctNy04LTUtNi01LTktOS06LTYtOy05LTUtNS08LTstNS04LT0tPS08LTUtPi06LTktOS0/LT4tQC0+LT8tPy1BLUAtQi1ALUEtQS1DLUItQi1DLUQtRC1FLUItRS1ELUYtRi1HLUUtSC1GLUQtRC1JLUgtSS1ELUMtQy1KLUktOy08LUstSy08LT0tQS0/LUwtTC1NLUEtQy1BLU0tTS1KLUMtTS1MLU4tTi1PLU0tSi1NLU8tTy1OLVAtUC1RLU8tTy1SLUotUi1PLVEtUS1TLVItUC1OLVQtVC1OLUwtVC1VLVAtVS1ULUstSy1WLVUtVy1SLVMtSC1JLVctSi1SLVctVy1JLUotUy1YLVctVy1YLVktWS1aLVctTC07LVQtSy1ULTstWy1aLVktWi1bLVwtXS1cLVstWy1eLV0tXi1bLV8tWS1fLVstXy1gLV4tXC1dLWEtYS1iLVwtYi1hLWMtYy1kLWItXC1ILVotVy1aLUgtYi1kLUctRy1GLWItXC1iLUYtRi1ILVwtXS1eLWUtZS1eLWAtZS1mLV0tYS1dLWYtYC1nLWUtYy1hLWgtZi1oLWEtaC1pLWMtai1rLWwtbC1tLWotbC1rLW4tbi1vLWwtby1uLXAtcC1xLW8tbi1rLXItci1rLWotci1zLW4tcC1uLXMtai10LXItdS1xLXAtcC12LXUtdi1wLXctcy13LXAtdy1ALXYtdi1ALUItQi14LXYtdS12LXgteC15LXUteS14LXotei14LUItei17LXktey16LXwtfC19LXstRy18LXotfi18LUctRy1kLX4tfi1kLWMtYy1/LX4tgC1+LX8tgC19LXwtfC1+LYAtfy2BLYAtei1FLUctQi1FLXotfy1jLWktaS2CLX8tgS1/LYItgi2DLYEthC2FLYYthi2HLYQtiC2JLYotii2LLYgtiy2KLYwtjC2NLYstjS2MLY4tji2PLY0tjy2OLZAtkC2RLY8tkS2QLZItki2TLZEtky2SLZQtlC2VLZMtlS2ULZYtli2XLZUtmC2XLZYtli2ZLZgtmC2ZLZotmi2bLZgtnC2dLZ4tni2fLZwtnS2cLaAtoC2hLZ0toS2gLaItoi2jLaEtoy2iLaQtpC2lLaMtpS2kLaYtpi2nLaUtpy2mLagtqC2pLactqS2oLaotqi2rLaktqy2qLawtrC2tLastrS2sLa4tri2vLa0tsC2xLbItsi2zLbAttC2yLbEtsS21LbQtti23LbgtuC25LbYtuS24Lbotui27Lbktuy26LbwtvC29LbstvS28Lb4tvi2/Lb0twC3BLcItwi3DLcAtwy3CLcQtxC3FLcMtxS3ELcYtxi3HLcUtxy3GLWAtYC1fLcctyC3DLcUtxS3JLcgtwy3ILcotyi3ALcMtyi3ILcstyy3ILcktyy3MLcotyS3NLcstzi3NLcktyS3PLc4txS3HLc8tzy3JLcUtWC3OLc8tzi1YLVMtUy3QLc4tzS3OLdAtzy1ZLVgtWS3PLcctxy1fLVkt0C3RLc0tyy3NLdEt0i3QLVMt0C3SLdEtUy1RLdIt0y3SLVEtUS1QLdMt0y1QLVUtVS3ULdMt1C1VLVYtVi3VLdQt1i3ULdUt1S3XLdYt2C3WLdct2C3XLdkt2i3YLdkt2i3bLdgt3C3aLdkt3C3dLdot3S3eLdot3S3fLd4t2C3gLdYt4C3hLdYt1S1WLeIt3y3iLd4t4y3VLeIt3y3jLeIt5C3XLdUt1S3lLeQt5i3nLegt6C3pLeYt6S3oLeot6i3rLekt7C3qLegt6C3tLewt7S3oLect5y3uLe0t7y3rLeot6i3wLe8t8C3qLewt7y3wLfEt8S3yLe8t8i3xLfMt8y30LfIt9C3zLfUt9S32LfQt9S3zLfct9y34LfUt9i31Lfkt+S31Lfgt+S36LfYt+C37Lfkt8y3xLfwt/C33LfMt/S38LfEt8S3wLf0t7C39LfAt/i3/LQAuAC4BLv4tAS4ALgIuAy7+LQEuAS4ELgMuAi4FLgEuBC4BLgUuBS4CLgYuBS4HLgQuBi4ILgUuCC4GLgkuBS4ILgouCi4HLgUuCS4LLgguDC4LLgkuCS4NLgwuCC4LLg4uDi4KLgguDi4LLgwuDC4PLg4u/i0DLhAuEC4RLv4t/y3+LREuES4SLv8tDC4NLhMuEy4ULgwuDy4MLhQuFC4VLg8uFi4VLhQuFC4XLhYuFy4ULhguGC4ZLhcuGi4WLhcuFy4bLhouGy4XLhkuGS4cLhsuHS4eLh8uHy4gLh0uIC4fLtks2SzcLCAu2izZLB8uHy4hLtosIS4fLh4uIS4eLiIuIy4kLiUuJi4nLiguKC4pLiYuKi4mLikuKS4rLiouKS4oLiwuLC4tLikuLS4uLikuLi4vLikuJy4mLjAuMC4xLicuJi4qLjIuMi4wLiYuLS4sLjMuMy40Li0uNS4uLi0uLS40LjUuLi41LjYuNi43Li4uLy4uLjcuNy44Li8uOS44LjcuNy46LjkuMC4yLjsuOy48LjAuPC47Lj0uPS4+LjwuPy48Lj4uMC48Lj8uPy4xLjAuPi5ALj8uQC4+LkEuQS5CLkAuQy5BLj4uPi49LkMuQC5CLkQuRC7pLUAuPy5ALukt6S3rLT8uPy7rLe8t7y0xLj8uJy4xLu8t7y3yLScuJy7yLfQt9C0oLicuKC70LUUuRS4sLiguLC5FLkYuRi4zLiwuRy5ILkkuSi5LLkwuTC5NLkouTC5LLk4uTi5PLkwuUC5RLlIuUi5TLlAuUC5TLlQuVC5VLlAuVi5XLlguWC5ZLlYuWi5ZLlguWC5bLlouWi5bLlwuXC5dLlouXi5dLlwuXC5fLl4uYC5hLmIuYi5jLmAuYC5jLmQuZC5lLmAuZi5nLmguaC5pLmYuaC5nLmouai5rLmgubC5tLm4ubi5vLmwucC5xLnIuci5zLnAuaS5oLnQudC5oLmsudC51Lmkuay52LnQudy54LnkueS56Lncuei57LnwufC53LnoufS5+Ln8ufy5+LoAufy6BLn0ugC6CLn8ugy6CLoAugC53LoMudy58LoQuhC6DLncuhS59LoEuhi6HLoguiC6HLokuiS6KLoguiC6KLosuiy6MLoguiy6KLo0ujS6KLokujS6OLosujy6OLo0ujS6QLo8uiS6RLo0ukC6NLpEukS6SLpAuky6ULpUulS6ULoUulS6WLpMuly6TLpYuhS6YLpUuli6ZLpcumi6ILowujC6bLpouiC6aLoYugS6YLoUunC6dLp4uni6fLpwunC6fLqAuoC6hLpwunS6cLqIuoi6cLqEuoi6jLp0uoS6kLqIupS6mLqcupy6mLqgupy6pLqUuqC6qLqcuqy6sLq0urS6uLqsurC6rLq8ury6wLqwusC6vLrEusS6yLrAusi6xLrMusy60LrIutC6zLrUutS62LrQuri6tLrcuty64Lq4uuC63LrkuuS66Lrguui65Lrsuuy68LrouvC67Lr0uvS6+Lrwuvi69Lr8uvy7ALr4uwS7CLsMuwy7ELsEuwi7BLsUuxS7GLsIuxC7DLscuxy7ILsQuyC7HLskuyS7KLsguyi7JLssuyy7MLsouxi7FLs0uzS7OLsYuzi7NLs8uzy7QLs4u0C7PLtEu0S7SLtAu0y7SLtEu0S7ULtMu0y7ULtUu1S7WLtMu1y7YLtku2S7aLtcu2C7XLtsu2y7cLtgu3C7bLt0u3S7eLtwu3i7dLt8u3y7gLt4u4S7iLuMu5C7lLuYu5i7nLuQu5S7kLugu6C7pLuUu6i7rLuwu7C7tLuou7S7sLu4u7i7vLu0u7y7uLvAu8C7xLu8u8S7wLvIu8i7zLvEu6S7oLvQu9C71Luku9i73Lvgu+C75LvYu9y72Lvou+i77Lvcu/C79Lv4u/i7/Lvwu/y7+LvMu8y7yLv8uTC0/LTktOS07LUwtVi1LLQAvAC/iLVYtPS0AL0stAS8CLwMvAy8ELwEvBC8DLwUvBi8HLwgvCC8JLwYvBy8GLwovCi8LLwcvDC8LLwovDS8OLw8vEC8RLxIvEi8TLxAvEy8SLxQvFC8VLxMvEi8WLxQvEi8XLxYvEi8YLxcvGC8SLxEvES8ZLxgvGi8ZLxEvES8bLxovGy8RLxAvEC8cLxsvHS8eLx8vHy8gLx0vIC8fLyEvIS8iLyAvIy8kLyUvJi8kLyMvIi8hLycvIy8oLyYvJS8pLyMvJy8qLyIvKy8qLycvJy8sLysvLS8pLyUvJS8uLy0vKy8sLy8vMC8xLzIvMi8zLzAvMy8yLyYvJi8oLzMvLy80LysvzC3LLTUvNS82L8wt0S01L8stNy84L8QtxC3CLTcvNy/CLcEtwS05Lzcvxi3ELTgvOC86L8YtYC3GLTovOi9nLWAtOy88Lz0vOy89Lz4vPS8/Lz4vPS9ALz8vPS9BL0AvQC9CLz8vPy9DLz4vRC87Lz4vRC8+L0UvRi9HL0gvSS9GL0gvSi9JL0gvSi9IL0svSi9LL0wvTS9KL0wvTi9JL0ovTy9QL1EvUi9TL1QvUy9SL1UvVS9WL1MvVi9VL1cvVy9YL1YvWC9XL1kvWS9aL1gvWi9ZL1svWy9cL1ovXS9eL18vXy9gL10vYC9fL2EvYi9jL2QvZS9mL2cvaC9pL2ovaS9oL2svay9sL2kvbS9uL28vby9wL20vcC9vL3EvcS9yL3Avci9xL3Mvcy90L3IvdS92L3cvdy94L3UvdS94L3kvei97L3wvfS9+L38vgC+BL4IvgS+AL4MvhC+0LYUvsi20LYQvhC+GL7Itsi2GL4cvhy+zLbItiC+JL4ovii+LL4gviC+LL4wvjC+7LYgvuy2ML40vjS+5Lbstti25LY0vjS+OL7YtHC22LY4vji+PLxwtHC2PL5AvkC8XLRwtGC0XLZAvkC+RLxgtki+TL5QvlC+VL5Ivli+VL5QvlC+XL5YvmC+WL5cvly+ZL5gvli+YL5ovmi+bL5YvlS+WL5svmy+cL5Uvki+VL5wvnC+dL5IvnS+cL54vni+fL50voC+eL5wvnC+bL6AvoS+gL5svmy+aL6EvoC+hL6Ivoi+jL6Avni+gL6Mvoy+kL54vny+eL6QvpC+lL58vpS+kL6Yvpi+nL6UvqC+mL6QvpC+jL6gvqS+oL6Mvoy+iL6kvqC+pL6ovqi+rL6gvpi+oL6svqy+sL6Yvpy+mL6wvrC+tL6cvrS+sL64vri+vL60vsC+uL6wvrC+rL7AvsS+wL6svqy+qL7EvsC+xL7Ivsi+zL7Avri+wL7Mvsy+0L64vry+uL7QvtC+1L68vti+qL6kvqS+3L7Yvty+pL6Ivoi+4L7cvuC+iL6EvoS+5L7gvuS+hL5ovmi+6L7kvui+aL5gvmC+7L7ovuy+YL5kvmS+8L7svvS+7L7wvvC++L70vvy+9L74vvi/AL78vwS+/L8AvwC/CL8Evvy/BL8Mvwy/EL78vvS+/L8QvxC/FL70vuy+9L8UvxS+6L7svxi+5L7ovui/FL8Yvxy/GL8UvxS/EL8cvyC/HL8QvxC/DL8gvxy/IL8kvyS/KL8cvxi/HL8ovyi/LL8YvuS/GL8svyy+4L7kvuC/LL8wvzC+3L7gvzS/ML8svyy/KL80vzi/NL8ovyi/JL84vzS/OL88vzy/QL80vzC/NL9Av0C/RL8wvty/ML9Ev0S+2L7cvti/RL9Iv0i/TL7Yvqi+2L9Mv0y+xL6ov1C/SL9Ev0S/QL9Qv1S/UL9Av0C/PL9Uv1C/VL9Yv1i/XL9Qv0i/UL9cv1y/YL9Iv0y/SL9gv2C/ZL9MvsS/TL9kv2S+yL7Evsi/ZL9ov2i/bL7Iv3C/aL9kv2S/YL9wv2C/XL90v3S/eL9gv1y/WL98v3y/gL9cv4S/WL9Uv1S/iL+Ev4i/VL88vzy/jL+Iv4y/PL84vzi/kL+Mv5C/OL8kvyS/lL+Qv5S/JL8gvyC/mL+Uv5i/IL8Mvwy/nL+Yv5y/DL8EvwS/oL+cv6C/BL8Ivwi/pL+gv6i/oL+kv6S/rL+ov7C/qL+sv6y/tL+wv7i/sL+0v7S/vL+4v7C/uL/Av8C/xL+wv6i/sL/Ev8S/yL+ov6C/qL/Iv8i/nL+gv8y/mL+cv5y/yL/Mv9C/zL/Iv8i/xL/Qv9S/0L/Ev8S/wL/Uv9C/1L/Yv9i/3L/Qv8y/0L/cv9y/4L/Mv5i/zL/gv+C/lL+Yv5S/4L/kv+S/kL+Uv+i/5L/gv+C/3L/ov+y/6L/cv9y/2L/sv+i/7L/wv/C/9L/ov+S/6L/0v/S/+L/kv5C/5L/4v/i/jL+Qv4y/+L/8v/y/iL+MvADD/L/4v/i/9LwAwATAAMP0v/S/8LwEwADABMAIwAjADMAAw/y8AMAMwAzAEMP8v4i//LwQwBDDhL+Iv4S8EMAUwBTAGMOEvBDADMAcwBzAIMAQwAzACMAkwCTAKMAMwCzACMAEwATAMMAswDDABMPwv/C8NMAwwDTD8L/sv+y8OMA0wDjD7L/Yv9i8PMA4wDzD2L/Uv9S8QMA8wEDD1L/Av8C8RMBAwETDwL+4v7i8SMBEwEjDuL+8v7y8TMBIwFDASMBMwEzAVMBQwFjAUMBUwFTAXMBYwGDAWMBcwFzAZMBgwFjAYMBowGjAbMBYwFDAWMBswGzAcMBQwEjAUMBwwHDARMBIwHTAQMBEwETAcMB0wHjAdMBwwHDAbMB4wHzAeMBswGzAaMB8wHjAfMCAwIDAhMB4wHTAeMCEwITAiMB0wEDAdMCIwIjAPMBAwDzAiMCMwIzAOMA8wJDAjMCIwIjAhMCQwJTAkMCEwITAgMCUwJDAlMCYwJjAnMCQwIzAkMCcwJzAoMCMwDjAjMCgwKDANMA4wDTAoMCkwKTAMMA0wKjApMCgwKDAnMCowKzAqMCcwJzAmMCswKjArMCwwLDAtMCowKTAqMC0wLTAuMCkwDDApMC4wLjALMAwwCzAuMC8wLzAwMAswLjAtMDEwMTAyMC4wLTAsMDMwMzA0MC0wNTAsMCswKzA2MDUwNjArMCYwJjA3MDYwNzAmMCUwJTA4MDcwODAlMCAwIDA5MDgwOTAgMB8wHzA6MDkwOjAfMBowGjA7MDowOzAaMBgwGDA8MDswPDAYMBkwGTA9MDwwPjA8MD0wPTA/MD4wQDA+MD8wPzBBMEAwQjBAMEEwQTBDMEIwQDBCMEQwRDBFMEAwPjBAMEUwRTBGMD4wPDA+MEYwRjA7MDwwRzA6MDswOzBGMEcwSDBHMEYwRjBFMEgwSTBIMEUwRTBEMEkwSDBJMEowSjBLMEgwRzBIMEswSzBMMEcwOjBHMEwwTDA5MDowOTBMME0wTTA4MDkwTjBNMEwwTDBLME4wTzBOMEswSzBKME8wTjBPMFAwUDBRME4wTTBOMFEwUTBSME0wODBNMFIwUjA3MDgwNzBSMFMwUzA2MDcwVDBTMFIwUjBRMFQwVTBUMFEwUTBQMFUwVDBVMFYwVjBXMFQwUzBUMFcwVzBYMFMwNjBTMFgwWDA1MDYwNTBYMFkwWTBaMDUwWDBXMFswWzBcMFgwVzBWMF0wXTBeMFcwXzBWMFUwVTBgMF8wYDBVMFAwUDBhMGAwYTBQME8wTzBiMGEwYjBPMEowSjBjMGIwYzBKMEkwSTBkMGMwZDBJMEQwRDBlMGQwZTBEMEIwQjBmMGUwZjBCMEMwQzBnMGYwaDBmMGcwZzBpMGgwajBoMGkwaTBrMGowbDBqMGswazBtMGwwajBsMG4wbjBvMGowaDBqMG8wbzBwMGgwZjBoMHAwcDBlMGYwcTBkMGUwZTBwMHEwcjBxMHAwcDBvMHIwbzBuMHMwczByMG8wcjBzMHQwdDB1MHIwcTByMHUwdTB2MHEwZDBxMHYwdjBjMGQwYzB2MHcwdzBiMGMweDB3MHYwdjB1MHgwdTB0MHkweTB4MHUweDB5MHowejB7MHgwdzB4MHswezB8MHcwYjB3MHwwfDBhMGIwYTB8MH0wfTBgMGEwfjB9MHwwfDB7MH4wezB6MH8wfzB+MHswfjB/MIAwgDCBMH4wfTB+MIEwgTCCMH0wYDB9MIIwgjBfMGAwXzCCMIMwgzCEMF8wgjCBMIUwhTCGMIIwhzB/MHowgDB/MIcwejCIMIcwiTCIMHowijCIMIkwiTCLMIowizCJMIwwdDCMMIkwjTCMMHQwjjCMMI0wjDCOMIswjTCPMI4wjzCNMJAwbjCQMI0wkTCQMG4wkjCQMJEwkDCSMI8wkTCTMJIwkzCRMJQwbTCUMJEwkTBsMG0wbjBsMJEwlDCVMJMwjTBzMG4wdDBzMI0wlTCUMJYwljCXMJUwlzCWMJgwmTCYMJYwmjCYMJkwmzCYMJowmDCbMJcwmjCcMJswnDCaMJ0wnjCdMJownzCdMJ4woDCdMJ8wnTCgMJwwnzChMKAwoTCfMKIwozCiMJ8wpDCiMKMwpTCiMKQwojClMKEwpDCmMKUwozCnMKQwqDCnMKMwozCpMKgwqjCoMKkwqTCrMKowrDCqMKswqzCtMKwwrjCsMK0wrTCvMK4wsDCuMK8wrzCxMLAwsjCwMLEwsTCzMLIwtDCyMLMwszC1MLQwtjC0MLUwtTC3MLYwuDC2MLcwtzC5MLgwujC4MLkwuTC7MLowvDC6MLswuzC9MLwwvjC8ML0wvTC/ML4wwDC+ML8wvzDBMMAwwjDAMMEwwTDDMMIwxDDCMMMwwzDFMMQwxjDEMMUwxTDHMMYwyDDGMMcwxzDJMMgwyjDIMMkwyTDLMMowzDDKMMswyzDNMMwwzjDMMM0wzTDPMM4w0DDOMM8wzjDQMNEw0jDRMNAw0DDTMNIw0TDUMM4wzzDVMNAw0zDQMNUw1TDWMNMw1zDTMNYw1jDYMNcw2DDWMNkw2TDaMNgw2zDZMNYw1jDVMNsw3DDbMNUw1TDPMNww2zDcMN0w3TDeMNsw2TDbMN4w3jDfMNkw2jDZMN8w3zDgMNow4DDfMOEw4TDiMOAw4zDhMN8w3zDeMOMw5DDjMN4w3jDdMOQw4zDkMOUw5TDmMOMw4TDjMOYw5jDnMOEw4jDhMOcw5zDoMOIw6DDnMOkw6TDqMOgw6zDpMOcw5zDmMOsw7DDrMOYw5jDlMOww6zDsMJkvmS+XL+sw6TDrMJcvly+UL+kw6jDpMJQvlC+TL+ow7TDlMOQw5DDuMO0w7jDkMN0w3TDvMO4w7zDdMNww3DDwMO8w8DDcMM8wzzDNMPAw8TDwMM0wzTDLMPEw8jDxMMswyzDJMPIw8zDyMMkwyTDHMPMw8jDzMPQw9DD1MPIw8TDyMPUw9TD2MPEw8DDxMPYw9jDvMPAw9zDuMO8w7zD2MPcw+DD3MPYw9jD1MPgw+TD4MPUw9TD0MPkw+DD5MPow+jD7MPgw9zD4MPsw+zD8MPcw7jD3MPww/DDtMO4w7TD8MP0w/TD+MO0w5TDtMP4w/jDsMOUw/zD9MPww/DD7MP8wADH/MPsw+zD6MAAx/zAAMcIvwi/AL/8w/TD/MMAvwC++L/0w/jD9ML4vvi+8L/4w7DD+MLwvvC+ZL+wwATH6MPkw+TACMQExAjH5MPQw9DADMQIxAzH0MPMw8zAEMQMxBDHzMMcwxzDFMAQxBTEEMcUwxTDDMAUxBjEFMcMwwzDBMAYxBzEGMcEwwTC/MAcxBjEHMQgxCDEJMQYxBTEGMQkxCTEKMQUxBDEFMQoxCjEDMQQxCzECMQMxAzEKMQsxDDELMQoxCjEJMQwxDTEMMQkxCTEIMQ0xDDENMQ4xDjEPMQwxCzEMMQ8xDzEQMQsxAjELMRAxEDEBMQIxATEQMRExETESMQEx+jABMRIxEjEAMfowEzERMRAxEDEPMRMxFDETMQ8xDzEOMRQxEzEUMe8v7y/tLxMxETETMe0v7S/rLxExEjERMesv6y/pLxIxADESMekv6S/CLwAxFTEOMQ0xDTEWMRUxFjENMQgxCDEXMRYxFzEIMQcxBzEYMRcxGDEHMb8wvzC9MBgxGTEYMb0wvTC7MBkxGjEZMbswuzC5MBoxGzEaMbkwuTC3MBsxGjEbMRwxHDEdMRoxGTEaMR0xHTEeMRkxGDEZMR4xHjEXMRgxHzEWMRcxFzEeMR8xIDEfMR4xHjEdMSAxITEgMR0xHTEcMSExIDEhMSIxIjEjMSAxHzEgMSMxIzEkMR8xFjEfMSQxJDEVMRYxFTEkMSUxJTEmMRUxDjEVMSYxJjEUMQ4xJzElMSQxJDEjMScxKDEnMSMxIzEiMSgxJzEoMRkwGTAXMCcxJTEnMRcwFzAVMCUxJjElMRUwFTATMCYxFDEmMRMwEzDvLxQxKTEiMSExITEqMSkxKjEhMRwxHDErMSoxKzEcMRsxGzEsMSsxLDEbMbcwtzC1MCwxLTEsMbUwtTCzMC0xLjEtMbMwszCxMC4xLzEuMbEwsTCvMC8xLjEvMTAxMDExMS4xLTEuMTExMTEyMS0xLDEtMTIxMjErMSwxMzEqMSsxKzEyMTMxNDEzMTIxMjExMTQxNTE0MTExMTEwMTUxNDE1MTYxNjE3MTQxMzE0MTcxNzE4MTMxKjEzMTgxODEpMSoxKTE4MTkxOTE6MSkxIjEpMToxOjEoMSIxOzE5MTgxODE3MTsxPDE7MTcxNzE2MTwxOzE8MUMwQzBBMDsxOTE7MUEwQTA/MDkxOjE5MT8wPzA9MDoxKDE6MT0wPTAZMCgxPTE2MTUxNTE+MT0xPjE1MTAxMDE/MT4xPzEwMS8xLzFAMT8xQDEvMa8wrzCtMEAxQTFAMa0wrTCrMEExQjFBMaswqzCpMEIxQzFCMakwqTCjMEMxQjFDMZ4wnjBEMUIxQTFCMUQxRDFFMUExQDFBMUUxRTE/MUAxRjE+MT8xPzFFMUYxRzFGMUUxRTFEMUcxRDGeMEgxSDFHMUQxRzFIMZkwmTBJMUcxRjFHMUkxSTFKMUYxPjFGMUoxSjE9MT4xPTFKMUsxSzFMMT0xNjE9MUwxTDE8MTYxTTFLMUoxSjFJMU0xSTGZME4xTjFNMUkxTTFOMW0wbTBrME0xSzFNMWswazBpMEsxTDFLMWkwaTBnMEwxPDFMMWcwZzBDMDwxmTBIMZowmjBIMZ4wlDBtME4xTjGWMJQwljBOMZkwnjBDMZ8wnzBDMaMwTzHSMNMw0zBQMU8xUTFSMdYv1i/hL1ExUzFUMQIwAjALMFMxVTFWMSwwLDA1MFUxVzFYMVYwVjBfMFcxWTFaMVsxWzFcMVkxiTB5MHQwejB5MIkwXTGHMIgwiDCKMF0xhzBdMV4xXjFfMYcwhzBfMYAwgDBfMWAxYDFhMYAwXzFeMWIxYjFjMV8xZDFlMWYxZjFnMWQxaDFkMWcxZzFpMWgxaDFpMZMvky+SL2gxaDGSL50vnS9qMWgxZDFoMWoxajFrMWQxZTFkMWsxazFsMWUxbDFrMW0xbTFuMWwxbzFtMWsxazFqMW8xajGdL58vny9vMWoxbzGfL6UvpS9wMW8xbTFvMXAxcDFxMW0xbjFtMXExcTFyMW4xcjFxMXMxczF0MXIxdTFzMXExcTFwMXUxcDGlL6cvpy91MXAxdTGnL60vrS92MXUxczF1MXYxdjF3MXMxdDFzMXcxdzF4MXQxeDF3MXkxeTF6MXgxezF5MXcxdzF2MXsxdjGtL68vry97MXYxezGvL7UvtS98MXsxeTF7MXwxfDF9MXkxejF5MX0xfTF+MXoxfzGAMYExgTGCMX8xgDF/MYMxhDGDMX8xfzGFMYQxhTF/MYYxhjGHMYUx2DCEMYUxhTHXMNgwgzGIMYAxiDGDMYkxiTGKMYgxizGJMYMxgzGEMYsxhDHYMNow2jCLMYQxizHaMOAw4DCMMYsxiTGLMYwxjDGNMYkxijGJMY0xjTGOMYoxjjGNMY8xjzGQMY4xkTGPMY0xjTGMMZExjDHgMOIw4jCRMYwxkTHiMOgw6DCSMZExjzGRMZIxkjGTMY8xkDGPMZMxkzGUMZAxlDGTMZUxlTGWMZQxlzGVMZMxkzGSMZcxkjHoMOow6jCXMZIxlzHqMJMvky9pMZcxlTGXMWkxaTFnMZUxljGVMWcxZzFmMZYxmDGZMZoxmjGbMZgxnDGdMZ4xnjGfMZwxoDGfMZ4xnjGhMaAxojGgMaExoTGjMaIxoDGiMaQxpDGlMaAxnzGgMaUxpTGmMZ8xnDGfMaYxpjGnMZwxpzGmMagxqDGpMacxqjGoMaYxpjGlMaoxqzGqMaUxpTGkMasxqjGrMawxrDGtMaoxqDGqMa0xrTGuMagxqTGoMa4xrjGvMakxrzGuMbAxsDGxMa8xsjGwMa4xrjGtMbIxszGyMa0xrTGsMbMxsjGzMbQxtDG1MbIxsDGyMbUxtTG2MbAxsTGwMbYxtjG3MbExtzG2MbgxuDG5MbcxujG4MbYxtjG1MboxuzG6MbUxtTG0MbsxujG7MbwxvDG9MboxuDG6Mb0xvTG+MbgxuTG4Mb4xvjG/MbkxwDGxMbcxsTHAMcExwjHBMcAxwTHCMcMxwzHEMcExxDHDMcUxxTHGMcQxxjHFMccxxzHIMcYxyTHIMccxxzHKMckxyDHJMZ0xnTGcMcgxpzHGMcgxyDGcMacxxjGnMakxqTHEMcYxrzHBMcQxxDGpMa8xwDHLMcIxwTGvMbExnTHJMcwxzDHNMZ0xnjGdMc0xzTHOMZ4xzjHNMc8xzzHQMc4x0DHPMdEx0THSMdAx0jHRMdMx0zHUMdIx1DHTMdUx1THWMdQx1jHVMdcx1zHYMdYx2DHXMdkx2THaMdgx2jHZMdsx2zHcMdox3THYMdox2jHeMd0x3jHaMd8x3zHgMd4x4THeMeAx4DHiMeEx3jHhMeMx4zHdMd4x5DHWMdgx2DHdMeQx5THkMd0x3THjMeUx5DHlMeYx5jHnMeQx1jHkMecx5zHUMdYx1DHnMegx6DHSMdQx6THoMecx5zHmMekx6DHpMeox6jHrMegx0jHoMesx6zHQMdIx0DHrMewx7DHOMdAx7THsMesx6zHqMe0x7DHtMaMxozGhMewxzjHsMaExoTGeMc4x7jHpMeYx5jHvMe4x7zHmMeUx5THwMe8x8DHlMeMx4zHxMfAx8THjMeEx4THyMfEx8zHxMfIx8jH0MfMx9THzMfQx9DH2MfUx9zH1MfYx9jH4Mfcx+TH3Mfgx+DH6Mfkx+zH5Mfox+jH8Mfsx/TH7Mfwx/DH+Mf0x/zH9Mf4x/jEAMv8x9zH5MQEyATICMvcx9TH3MQIyAzIBMvkx+TH7MQMyBDIDMvsx+zH9MQQyBTIEMv0x/TH/MQUyBDIFMgYyBjIHMgQyAzIEMgcyBzIIMgMyATIDMggyCDIJMgEyAjIBMgkyCTIKMgIyCjIJMgsyCzIMMgoyDTILMgkyCTIIMg0yDjINMggyCDIHMg4yDzIOMgcyBzIGMg8yDjIPMhAyEDIRMg4yDTIOMhEyETISMg0yCzINMhIyEjITMgsyDDILMhMyEzIUMgwyFDITMhUyFTIWMhQyFzIVMhMyEzISMhcyGDIXMhIyEjIRMhgyGTIYMhEyETIQMhkyGDIZMhoyGjIbMhgyFzIYMhsyGzIaMhwyHDIdMhsyHjIbMh0yGzIeMhcyFTIXMh4yHTIfMh4yIDIeMh8yHjIgMhUyFjIVMiAyHzIhMiAyIjIgMiEyIDIiMhYyITIjMiIyHTIcMiQyJDIlMh0yHzIdMiUyJTImMh8yITIfMiYyJjInMiEyIzIhMicyJzIoMiMyKDInMikyKTIqMigyKzIpMicyJzImMisyLDIrMiYyJjIlMiwyLTIsMiUyJTIkMi0yLDItMi4yLjIvMiwyKzIsMi8yLzIwMisyKTIrMjAyMDIxMikyKjIpMjEyMTIyMioyMjIxMjMyMzI0MjIyNTIzMjEyMTIwMjUyNjI1MjAyMDIvMjYyNzI2Mi8yLzIuMjcyNjI3MjgyODI5MjYyNTI2MjkyOTI6MjUyMzI1MjoyOjI7MjMyNDIzMjsyOzI8MjQyPDI7Mj0yPTI+MjwyPzI9MjsyOzI6Mj8yQDI/MjoyOjI5MkAyQTJAMjkyOTI4MkEyQDJBMkIyQjJDMkAyPzJAMkMyQzJEMj8yPTI/MkQyRDJFMj0yPjI9MkUyRTJGMj4yRjJFMkcyRzJIMkYySTJHMkUyRTJEMkkyRDJDMkoySjJLMkQyQzJCMkwyTDJNMkMyTjJCMkEyQTJPMk4yTzJBMjgyODJQMk8yUDI4MjcyNzJRMlAyUTI3Mi4yLjJSMlEyUjIuMi0yLTJTMlIyUzItMiQyJDJUMlMyVDIkMhwyHDJVMlQyVTIcMhoyGjJWMlUyVzJVMlYyVjJYMlcyWTJXMlgyWDJaMlkyWzJZMloyWjJcMlsyWTJbMl0yXTJeMlkyVzJZMl4yXjJfMlcyVTJXMl8yXzJUMlUyYDJTMlQyVDJfMmAyYTJgMl8yXzJiMmEyYzJhMmIyYjJdMmMyYTJjMmQyZDJlMmEyYDJhMmUyZTJmMmAyUzJgMmYyZjJSMlMyUjJmMmcyZzJRMlIyaDJnMmYyZjJlMmgyaTJoMmUyZTJkMmkyaDJpMmoyajJrMmgyZzJoMmsyazJsMmcyUTJnMmwybDJQMlEyUDJsMm0ybTJPMlAybjJtMmwybDJrMm4ybzJuMmsyazJqMm8ybjJvMnAycDJxMm4ybTJuMnEycTJyMm0yTzJtMnIycjJOMk8yTjJyMnMyczJ0Mk4ycjJxMnUydTJ2MnIycTJwMncydzJ4MnEyeTJwMm8ybzJ6MnkyejJvMmoyajJ7MnoyezJqMmkyaTJ8MnsyfDJpMmQyZDJ9MnwyfTJkMmMyYzJ+Mn0yfjJjMl0yXTJ/Mn4yfzJdMlsyWzKAMn8ygDJbMlwyXDKBMoAygjKAMoEygTKDMoIyhDKCMoMygzKFMoQyhjKEMoUyhTKHMoYyhDKGMogyiDKJMoQygjKEMokyiTKKMoIygDKCMooyijJ/MoAyizJ+Mn8yfzKKMosyjDKLMooyijKJMowyjTKMMokyiTKIMo0yjDKNMo4yjjKPMowyizKMMo8yjzKQMosyfjKLMpAykDJ9Mn4yfTKQMpEykTJ8Mn0ykjKRMpAykDKPMpIykzKSMo8yjzKOMpMykjKTMpQylDKVMpIykTKSMpUylTKWMpEyfDKRMpYyljJ7MnwyezKWMpcylzJ6MnsymDKXMpYyljKVMpgymTKYMpUylTKUMpkymDKZMpoymjKbMpgylzKYMpsymzKcMpcyejKXMpwynDJ5MnoyeTKcMp0ynTKeMnkynDKbMp8ynzKgMpwymzKaMqEyoTKiMpsyozKaMpkymTKkMqMypDKZMpQylDKlMqQypTKUMpMykzKmMqUypjKTMo4yjjKnMqYypzKOMo0yjTKoMqcyqDKNMogyiDKpMqgyqTKIMoYyhjKqMqkyqjKGMocyhzKrMqoyrDKqMqsyqzKtMqwyrjKsMq0yrTKvMq4ysDKuMq8yrzKxMrAyrjKwMrIysjKzMq4yrDKuMrMyszK0MqwyqjKsMrQytDKpMqoytTKoMqkyqTK0MrUytjK1MrQytDKzMrYytzK2MrMyszKyMrcytjK3MrgyuDK5MrYytTK2MrkyuTK6MrUyqDK1MroyujKnMqgypzK6MrsyuzKmMqcyvDK7MroyujK5MrwyvTK8MrkyuTK4Mr0yvDK9Mr4yvjK/MrwyuzK8Mr8yvzLAMrsypjK7MsAywDKlMqYypTLAMsEywTKkMqUywjLBMsAywDK/MsIywzLCMr8yvzK+MsMywjLDMsQyxDLFMsIywTLCMsUyxTLGMsEypDLBMsYyxjKjMqQyozLGMscyxzLIMqMyxjLFMskyyTLKMsYyxTLEMssyyzLMMsUyzTLEMsMywzLOMs0yzjLDMr4yvjLPMs4yzzK+Mr0yvTLQMs8y0DK9MrgyuDLRMtAy0TK4MrcytzLSMtEy0jK3MrIysjLTMtIy0zKyMrAysDLUMtMy1DKwMrEysTLVMtQy1jLUMtUy1TLXMtYy2DLWMtcy1zLZMtgy2jLYMtky2TLbMtoy2DLaMtwy3DLdMtgy1jLYMt0y3TLeMtYy1DLWMt4y3jLTMtQy3zLSMtMy0zLeMt8y4DLfMt4y3jLdMuAy3TLcMuEy4TLgMt0y4DLhMuIy4jLjMuAy3zLgMuMy4zLkMt8y0jLfMuQy5DLRMtIy0TLkMuUy5TLQMtEy5jLlMuQy5DLjMuYy4zLiMucy5zLmMuMy5jLnMugy6DLpMuYy5TLmMuky6TLqMuUy0DLlMuoy6jLPMtAyzzLqMusy6zLOMs8y7DLrMuoy6jLpMuwy6TLoMu0y7TLsMuky7DLtMu4y7jLvMuwy6zLsMu8y7zLwMusyzjLrMvAy8DLNMs4yzTLwMvEy8TLyMs0y8DLvMvMy8zL0MvAy9TLtMugy7jLtMvUy6DL2MvUy9zL2Mugy+DL2Mvcy9zL5Mvgy+TL3Mvoy4jL6Mvcy+zL6MuIy/DL6Mvsy+jL8Mvky+zL9Mvwy/TL7Mv4y3DL+Mvsy/zL+MtwyADP+Mv8y/jIAM/0y/zIBMwAzATP/MgIz2zICM/8y/zLaMtsy3DLaMv8yAjMDMwEz+zLhMtwy4jLhMvsyAzMCMwQzBDMFMwMzBTMEMwYzBzMGMwQzCDMGMwczCTMGMwgzBjMJMwUzCDMKMwkzCjMIMwszDDMLMwgzDTMLMwwzDjMLMw0zCzMOMwozDTMPMw4zDzMNMxAzETMQMw0zEjMQMxEzEzMQMxIzEDMTMw8zEjMUMxMzETMVMxIzFjMVMxEzETMXMxYzGDMWMxczFzMZMxgzGjMYMxkzGTMbMxozHDMaMxszGzMdMxwzHjMcMx0zHTMfMx4zIDMeMx8zHzMhMyAzIjMgMyEzITMjMyIzJDMiMyMzIzMlMyQzJjMkMyUzJTMnMyYzKDMmMyczJzMpMygzKjMoMykzKTMrMyozLDMqMyszKzMtMywzLjMsMy0zLTMvMy4zMDMuMy8zLzMxMzAzMjMwMzEzMTMzMzIzADIyMzMzMzP/MQAy/zEzMzQzNDMFMv8xNTM0MzMzMzM2MzUzNzM1MzYzNjM4MzczOTM3MzgzODMtMzkzNzM5MzozOjM7MzczNTM3MzszOzM8MzUzNDM1MzwzPDM9MzQzBTI0Mz0zPTMGMgUyBjI9Mz4zPjMPMgYyPzM+Mz0zPTM8Mz8zQDM/MzwzPDM7M0AzQTNAMzszOzM6M0EzQDNBM0IzQjNDM0AzPzNAM0MzQzNEMz8zPjM/M0UzRTNGMz4zDzI+M0YzRjMQMg8yEDJGM0czRzMZMhAySDNHM0YzRjNFM0gzSTNIM0QzRDNDM0kzSjNJM0MzQzNCM0ozSTNKM1wyXDJaMkkzSDNJM1oyWjJYMkgzRzNIM1gyWDJWMkczGTJHM1YyVjIaMhkySzNCM0EzQTNMM0szTDNBMzozOjNNM0wzTTM6MzkzOTNOM00zTjM5My0zLTMrM04zTzNOMyszKzMpM08zUDNPMykzKTMnM1AzUTNQMyczJzMlM1EzUDNRM1IzUjNTM1AzTzNQM1MzUzNUM08zTjNPM1QzVDNNM04zVTNMM00zTTNUM1UzVjNVM1QzVDNTM1YzVzNWM1MzUzNSM1czVjNXM1gzWDNZM1YzVTNWM1kzWTNaM1UzTDNVM1ozWjNLM0wzSzNaM1szWzNcM0szQjNLM1wzXDNKM0IzXTNbM1ozWjNZM10zXjNdM1kzWTNYM14zXTNeM4cyhzKFMl0zWzNdM4UyhTKDMlszXDNbM4MygzKBMlwzSjNcM4EygTJcMkozXzNYM1czVzNgM18zYDNXM1IzUjNhM2AzYTNSM1EzUTNiM2EzYjNRMyUzJTMjM2IzYzNiMyMzIzMhM2MzZDNjMyEzITMfM2QzZTNkMx8zHzMdM2UzZDNlM2YzZjNnM2QzYzNkM2czZzNoM2MzYjNjM2gzaDNhM2IzaTNgM2EzYTNoM2kzajNpM2gzaDNnM2ozazNqM2czZzNmM2szajNrM2wzbDNtM2ozaTNqM20zbTNuM2kzYDNpM24zbjNfM2AzXzNuM28zbzNwM18zWDNfM3AzcDNeM1gzcTNvM24zbjNtM3EzcjNxM20zbTNsM3IzcTNyM7EysTKvMnEzbzNxM68yrzKtMm8zcDNvM60yrTKrMnAzXjNwM6syqzKHMl4zczNsM2szazN0M3MzdDNrM2YzZjN1M3QzdTNmM2UzZTN2M3UzdjNlMx0zHTMbM3YzdzN2MxszGzMZM3czeDN3MxkzGTMXM3gzeTN4MxczFzMRM3kzeDN5MwwzDDN6M3gzdzN4M3ozejN7M3czdjN3M3szezN1M3YzfDN0M3UzdTN7M3wzfTN8M3szezN6M30zejMMM34zfjN9M3ozfTN+MwczBzN/M30zfDN9M38zfzOAM3wzdDN8M4AzgDNzM3QzczOAM4EzgTOCM3MzbDNzM4IzgjNyM2wzgzOBM4AzgDN/M4MzfzMHM4QzhDODM38zgzOEM9sy2zLZMoMzgTODM9ky2TLXMoEzgjOBM9cy1zLVMoIzcjOCM9Uy1TKxMnIzBzN+MwgzCDN+MwwzAjPbMoQzhDMEMwIzBDOEMwczDDN5Mw0zDTN5MxEzhTOGM0IyQjJOMoUzhzOIM3AycDJ5MocziTOKM5oymjKjMokzizOMM8QyxDLNMoszjTOOM48zjzOQM40z9zLnMuIy6DLnMvcykTP1MvYy9jL4MpEz9TKRM5IzkjOTM/Uy9TKTM+4y7jKTM5QzlDOVM+4ykzOSM5YzljOXM5MztzGYM8AxyzHAMZgzmDOZM8sxmTOYM5ozmjObM5kzmDO3MbkxuTGaM5gzmjO5Mb8xvzGcM5ozmzOaM5wznDOdM5sznjOfM6AzoDOhM54zoTOgM6Iz1zGiM6AzoDPZMdcx2TGgM6MzozOkM9kxojOlM6EzpTOiM6YzpjOnM6UzojPXMdUx1TGmM6IzpjPVMdMx0zGoM6YzpzOmM6gzqDOpM6czqTOoM6ozqjOrM6kzqDPTMdEx0TGqM6gzqjPRMc8xzzGsM6ozqzOqM6wzrDOtM6szrTOsM8wxzDGuM60zrDPPMc0xzTHMMawzrjPMMckxyTHKMa4zrzOiMaMxozGwM68zsTOvM7AzsDOyM7EzszOxM7IzsjO0M7MzIzKzM7QztDMiMiMyszMjMigyKDK1M7MzsTOzM7UztTO2M7EzrzOxM7YztjO3M68zojGvM7cztzOkMaIxpDG3M7gzuDOrMaQxuTO4M7cztzO2M7kzujO5M7YztjO1M7ozKjK6M7UztTMoMioyujMqMjIyMjK7M7ozuTO6M7szuzO8M7kzuDO5M7wzvDO9M7gzqzG4M70zvTOsMasxrDG9M74zvjOzMawxvzO+M70zvTO8M78zwDO/M7wzvDO7M8AzNDLAM7szuzMyMjQywDM0MjwyPDLBM8AzvzPAM8EzwTPCM78zvjO/M8IzwjPDM74zszG+M8MzwzO0MbMxtDHDM8QzxDO7MbQxxTPEM8MzwzPCM8UzxjPFM8IzwjPBM8YzPjLGM8EzwTM8Mj4yxjM+MkYyRjLHM8YzxTPGM8czxzPIM8UzxDPFM8gzyDPJM8QzuzHEM8kzyTO8MbsxvDHJM8ozyjPLM7wxyTPIM8wzzDPNM8kzyDPHM84zzjPPM8gzxzNGMtAz0DPRM8cz0jPwMfEx8THzMdIz0zPSM/Mx8zH1MdMzAjLTM/Ux0zMCMgoyCjLUM9Mz0jPTM9Qz1DPVM9Iz8DHSM9Uz1TPvMfAx7zHVM9Yz1jPuMe8x1zPWM9Uz1TPUM9czDDLXM9Qz1DMKMgwy1zMMMhQyFDLYM9cz1jPXM9gz2DPZM9Yz7jHWM9kz2TPaM+4x6THuMdoz2jPqMekx6jHaM9sz2zPtMeox3DPbM9oz2jPZM9wz3TPcM9kz2TPYM90zFjLdM9gz2DMUMhYy3TMWMiIyIjK0M90z3DPdM7QztDOyM9wz2zPcM7IzsjOwM9sz7THbM7AzsDOjMe0x3jPfM+Az4DPhM94z4DPfM+Iz4jPjM+Az4zPiM+Qz5DPlM+Mz5jPkM+Iz4jPnM+Yz5zPiM98z3zPoM+cz6DPfM94z3jPpM+gz6jPoM+kz6TPrM+oz6DPqM+wz7DPnM+gz5zPsM+0z7TPmM+cz7jPtM+wz7DPvM+4z7zPsM+oz6jPwM+8z8DPqM+sz6zPxM/Az8jPwM/Ez8TPzM/Iz8DPyM/Qz9DPvM/Az7zP0M/Uz9TPuM+8z9jP1M/Qz9DP3M/Yz9zP0M/Iz8jP4M/cz+DPyM/Mz8zP5M/gz+jP4M/kz+TP7M/oz+DP6M/wz/DP3M/gz9zP8M/0z/TP2M/cz/jP9M/wz/DP/M/4z/zP8M/oz+jMANP8zADT6M/sz+zMBNAA09TP2MwI0AjQDNPUz7jP1MwM0AzQENO4z7TPuMwQ0BDQFNO0z5jPtMwU0BTQGNOYz5DPmMwY0BjQHNOQz5TPkMwc0BzQINOUzCDQHNAk0CTQKNAg0CjQJNAs0CzQMNAo0DDQLNA00DTQONAw0DzQNNAs0CzQQNA80EDQLNAk0CTQRNBA0ETQJNAc0BzQGNBE0BjQFNBI0EjQRNAY0ETQSNBM0EzQQNBE0EDQTNBQ0FDQPNBA0FTQUNBM0EzQWNBU0FjQTNBI0EjQXNBY0FzQSNAU0BTQENBc0GDQXNAQ0BDQDNBg0FzQYNBk0GTQWNBc0FjQZNBo0GjQVNBY0GzQaNBk0GTQcNBs0HDQZNBg0GDQdNBw0HTQYNAM0AzQCNB00HjQdNAI0AjQfNB40HzQCNPYz9jP9Mx80HTQeNCA0IDQcNB00HDQgNCE0ITQbNBw0IjQhNCA0IDQjNCI0IzQgNB40HjQkNCM0JDQeNB80HzQlNCQ0JTQfNP0z/TP+MyU0JjQlNP4z/jMnNCY0JTQmNCg0KDQkNCU0KTQjNCQ0JDQqNCk0KzQiNCM0IzQsNCs0ITQiNC00LTQuNCE0GzQhNC40LjQvNBs0GjQbNC80LzQwNBo0FTQaNDA0MDQxNBU0FDQVNDE0MTQyNBQ0DzQUNDI0MjQzNA80DTQPNDM0MzQ0NA00DjQNNDQ0NDQ1NA40NTQ0NDY0NjQ3NDU0NzQ2NDg0ODQ5NDc0OTQ4NDo0OjQ7NDk0PDQ6NDg0ODQ9NDw0PTQ4NDY0NjQ+ND00PjQ2NDQ0NDQzND40MzQyND80PzQ+NDM0PjQ/NEA0QDQ9ND40PTRANEE0QTQ8ND00QjRBNEA0QDRDNEI0QzRAND80PzRENEM0RDQ/NDI0MjQxNEQ0RTRENDE0MTQwNEU0RDRFNEY0RjRDNEQ0QzRGNEc0RzRCNEM0SDRHNEY0RjRJNEg0STRGNEU0RTRKNEk0SjRFNDA0MDQvNEo0SzRKNC80LzQuNEs0SjRLNEw0TDRJNEo0STRMNE00TTRINEk0TjRNNEw0TDRPNE40TzRMNEs0SzRQNE80UDRLNC40LjQtNFA0UTRQNC00LTRSNFE0UzRPNFA0UDRUNFM0VTRONE80TzRWNFU0TTRONFc0VzRYNE00SDRNNFg0WDRZNEg0RzRINFk0WTRaNEc0QjRHNFo0WjRbNEI0QTRCNFs0WzRcNEE0PDRBNFw0XDRdNDw0OjQ8NF00XTReNDo0OzQ6NF40XjRfNDs0XzReNGA0YDRhNF80YTRgNGI0YjRjNGE0YzRiNGQ0ZDRlNGM0ZjRkNGI0YjRnNGY0ZzRiNGA0YDRoNGc0aDRgNF40XjRdNGg0XTRcNGk0aTRoNF00aDRpNGo0ajRnNGg0ZzRqNGs0azRmNGc0bDRrNGo0ajRtNGw0bTRqNGk0aTRuNG00bjRpNFw0XDRbNG40bzRuNFs0WzRaNG80bjRvNHA0cDRtNG40bTRwNHE0cTRsNG00cjRxNHA0cDRzNHI0czRwNG80bzR0NHM0dDRvNFo0WjRZNHQ0dTR0NFk0WTRYNHU0dDR1NHY0djRzNHQ0czR2NHc0dzRyNHM0eDR3NHY0djR5NHg0eTR2NHU0dTR6NHk0ejR1NFg0WDRXNHo0ezR6NFc0VzR8NHs0fTR5NHo0ejR+NH00fzR4NHk0eTSANH80dzR4NIE0gTSCNHc0cjR3NII0gjSDNHI0cTRyNIM0gzSENHE0bDRxNIQ0hDSFNGw0azRsNIU0hTSGNGs0ZjRrNIY0hjSHNGY0ZDRmNIc0hzSINGQ0ZTRkNIg0iDSJNGU0iTSINIo0ijSLNIk0izSKNIw0jDSNNIs0jTSMNI40jjSPNI00kDSONIw0jDSRNJA0kTSMNIo0ijSSNJE0kjSKNIg0iDSHNJI0hzSGNJM0kzSSNIc0kjSTNJQ0lDSRNJI0kTSUNJU0lTSQNJE0ljSVNJQ0lDSXNJY0lzSUNJM0kzSYNJc0mDSTNIY0hjSFNJg0mTSYNIU0hTSENJk0mDSZNJo0mjSXNJg0lzSaNJs0mzSWNJc0nDSbNJo0mjSdNJw0nTSaNJk0mTSeNJ00njSZNIQ0hDSDNJ40nzSeNIM0gzSCNJ80njSfNKA0oDSdNJ40nTSgNKE0oTScNJ00ojShNKA0oDSjNKI0ozSgNJ80nzSkNKM0pDSfNII0gjSBNKQ0pTSkNIE0gTSmNKU0pzSjNKQ0pDSoNKc0qTSiNKM0ozSqNKk0oTSiNKs0qzSsNKE0nDShNKw0rDStNJw0mzScNK00rTSuNJs0ljSbNK40rjSvNJY0lTSWNK80rzSwNJU0kDSVNLA0sDSxNJA0jjSQNLE0sTSyNI40jzSONLI0sjSzNI80szSyNLQ0tDS1NLM0tTS0NLY0tjS3NLU0tzS2NLg0uDS5NLc0ujS4NLY0tjS7NLo0uzS2NLQ0tDS8NLs0vDS0NLI0sjSxNLw0sTSwNL00vTS8NLE0vDS9NL40vjS7NLw0uzS+NL80vzS6NLs0wDS/NL40vjTBNMA0wTS+NL00vTTCNME0wjS9NLA0sDSvNMI0wzTCNK80rzSuNMM0wjTDNMQ0xDTBNMI0wTTENMU0xTTANME0xjTFNMQ0xDTHNMY0xzTENMM0wzTINMc0yDTDNK40rjStNMg0yTTINK00rTSsNMk0yDTJNMo0yjTHNMg0xzTKNMs0yzTGNMc0zDTLNMo0yjTNNMw0zTTKNMk0yTTONM00zjTJNKw0rDSrNM40zzTONKs0qzTQNM800TTNNM40zjTSNNE0xjTLNNM00zTLNMw0zDTUNNM00zTUNNU01TTWNNM00zTWNNc01zTYNNM02TTYNNc01zTaNNk02TTaNNs02zTcNNk03TTcNNs02zTeNN003TTeNN803zTgNN004TTgNN803zTiNOE04TTiNOM04zTkNOE04TTkNLk0uTS4NOE04TS4NLo0ujTgNOE03TTgNLo0ujS/NN003TS/NMA0wDTcNN002TTcNMA0wDTFNNk02TTFNMY0xjTYNNk00zTYNMY05TTkNOM04zTmNOU05TTmNOc05zToNOU06TToNOc05zTqNOk06TTqNOs06zTsNOk07TTsNOs06zTuNO007TTuNO807zTwNO008TTwNO807zTyNPE08zTwNPE07TTwNPM08TT0NPM08zT0NPU09TT2NPM09jT1NPc09zT4NPY0+DT3NPk0+TT6NPg0+jT5NPs0+zT8NPo0/DT7NP00/TT+NPw0/jT9NP80/zQANf40ADX/NAE1ATUCNQA1AjUBNQM1AzUENQI1BDUDNQU1BTUGNQQ1BjUFNQc1BzUINQY1CDUHNQk1CTUKNQg1CjUJNQs1CzUMNQo1DDULNQ01DTUONQw1DjUNNQ81DzUQNQ41EDUPNRE1ETUSNRA1EjURNRM1EzUUNRI1FDUTNRU1FTUWNRQ1FjUVNRc1FzUYNRY1GDUXNRk1GTUaNRg1GjUZNRs1GzUcNRo1HDUbNR01HjUdNRs1HTUeNR81HzUgNR01GzUhNR41HTUiNRw1IjUdNSA1IDUjNSI1IzUgNSQ1JDUlNSM1JjUjNSU1JTUnNSY1IzUmNSg1KDUiNSM1IjUoNSk1KTUcNSI1KjUpNSg1KDUrNSo1KzUoNSY1JjUsNSs1LDUmNSc1JzUtNSw1LjUsNS01LTUvNS41LDUuNTA1MDUrNSw1KzUwNTE1MTUqNSs1MjUxNTA1MDUzNTI1MzUwNS41LjU0NTM1NDUuNS81LzU1NTQ1NjU0NTU1NTU3NTY1NDU2NTg1ODUzNTQ1MzU4NTk1OTUyNTM15TM5NTg1ODXjM+Uz4zM4NTY1NjXgM+Mz4DM2NTc1NzXhM+AzMTUyNTo1OjU7NTE1KjUxNTs1OzU8NSo1KTUqNTw1PDU9NSk1HDUpNT01PTUaNRw1GjU9NT41PjUYNRo1GDU+NT81PzUWNRg1FjU/NUA1QDUUNRY1QTVANT81PzVCNUE1QjU/NT41PjVDNUI1QzU+NT01PTU8NUM1PDU7NUQ1RDVDNTw1QzVENUU1RTVCNUM1QjVFNUY1RjVBNUI1RzVGNUU1RTVINUc1SDVFNUQ1RDVJNUg1STVENTs1OzU6NUk1SjVJNTo1OjVLNUo1SzU6NTI1MjU5NUs1STVKNUw1TDVINUk1SDVMNU01TTVHNUg1DjRNNUw1TDUMNA40DDRMNUo1SjUKNAw0CjRKNUs1SzUINAo0CDRLNTk1OTXlMwg0RjVHNU41RzVNNU81TzVONUc1TjVPNVA1UDVRNU41UjVONVE1UTVTNVI1VDVSNVM1UjVUNUE1QDVBNVQ1VDVVNUA1FDVANVU1VTUSNRQ1EjVVNVY1VjUQNRI1EDVWNVc1VzUONRA1DjVXNVg1WDUMNQ41WTVYNVc1VzVaNVk1WjVXNVY1VjVbNVo1WzVWNVU1VTVUNVs1UzVbNVQ1WzVTNVw1XDVaNVs1WjVcNV01XTVZNVo1XjVdNVw1XDVfNV41XzVcNVM1UzVRNV81YDVfNVE1UTVQNWA1XzVgNWE1YTVeNV81OzRhNWA1YDU5NDs0OTRgNVA1UDU3NDk0NzRQNU81TzU1NDc0NTRPNU01TTUONDU0XTVeNWI1YjVjNV01WTVdNWM1YzVkNVk1WDVZNWQ1ZDVlNVg1DDVYNWU1ZTUKNQw1CjVlNWY1ZjUINQo1CDVmNWc1ZzUGNQg1BjVnNWg1aDUENQY1aTVoNWc1ZzVqNWk1ajVnNWY1ZjVrNWo1azVmNWU1ZTVkNWs1bDVrNWQ1ZDVjNWw1azVsNW01bTVqNWs1ajVtNW41bjVpNWo1bzVuNW01bTVwNW81cDVtNWw1bDVxNXA1cTVsNWM1YzViNXE1cjVxNWI1YjVzNXI1czViNV41XjVhNXM1cTVyNXQ1dDVwNXE1cDV0NXU1dTVvNXA1ZTR1NXQ1dDVjNGU0YzR0NXI1cjVhNGM0YTRyNXM1czVfNGE0XzRzNWE1YTU7NF80bjVvNXY1bzV1NXc1dzV2NW81djV3NXg1eDV5NXY1ejV2NXk1eTV7NXo1fDV6NXs1ejV8NWk1aDVpNXw1fDV9NWg1BDVoNX01fTUCNQQ1AjV9NX41fjUANQI1ADV+NX81fzX+NAA1/jR/NYA1gDX8NP40gTWANX81fzWCNYE1gjV/NX41fjWDNYI1gzV+NX01fTV8NYM1ezWDNXw1gzV7NYQ1hDWCNYM1gjWENYU1hTWBNYI1hjWFNYQ1hDWHNYY1hzWENXs1ezV5NYc1iDWHNXk1eTV4NYg1hzWINYk1iTWGNYc1jzSJNYg1iDWNNI80jTSINXg1eDWLNI00izR4NXc1dzWJNIs0iTR3NXU1dTVlNIk0hTWGNYo1ijWLNYU1gTWFNYs1izWMNYE1gDWBNYw1jDWNNYA1/DSANY01jTX6NPw0+jSNNY41jjX4NPo0+DSONY81jzX2NPg09jSPNZA1kDXzNPY0kTWQNY81jzWSNZE1kjWPNY41jjWTNZI1kzWONY01jTWMNZM1lDWTNYw1jDWLNZQ1kzWUNZU1lTWSNZM1kjWVNZY1ljWRNZI1lzWWNZU1lTWYNZc1mDWVNZQ1lDWZNZg1mTWUNYs1izWKNZk1mjWZNYo1ijWbNZo1mzWKNYY1hjWJNZs1mTWaNZw1nDWYNZk1mDWcNZ01nTWXNZg1uTSdNZw1nDW3NLk0tzScNZo1mjW1NLc0tTSaNZs1mzWzNLU0szSbNYk1iTWPNLM06TSWNZc1kTWWNek06TTsNJE1kTXsNO007TSQNZE18zSQNe00nTW5NOQ05DTlNJ01lzWdNeU0lzXoNOk05TToNJc1njWfNSA1IDUfNZ41IjSgNaE1oTUtNCI0QTVGNVI1TjVSNUY1TjSiNaM1ozVXNE40eDSkNaU1pTWBNHg0aTVuNXo1djV6NW41ojSmNac1pzWrNKI0qDWpNao1qjWrNag1zDSsNa01rTXUNMw01TTUNK41rjWvNdU0sDWxNbI1sjWzNbA1szWyNbQ1tDW1NbM14TO1NbQ1tDXeM+Ez6TPeM7Q1tDW2NekztjW0NbI1sjW3NbY1uDW3NbI1sjWxNbg1uTW3Nbg1uDW6Nbk1tzW5Nbs1uzW2Nbc1tjW7Nesz6zPpM7Y18TPrM7s1uzW8NfEzvDW7Nbk1uTW9Nbw1vjW9Nbk1uTW6Nb41vzW9Nb41vjXANb81vTW/NcE1wTW8Nb01vDXBNfMz8zPxM7w1+TPzM8E1wTXCNfkzwjXBNb81vzXDNcI1xDXDNb81vzXANcQ1xTXDNcQ1xDXGNcU1wzXFNcc1xzXCNcM1wjXHNfsz+zP5M8I1ATT7M8c1xzXINQE0yDXHNcU1xTXJNcg1yjXJNcU1xTXGNco1yzXMNc01zTXONcs1zTXMNc81zzXQNc01zTXQNdE10TXSNc010zXNNdI10jXUNdM10jXRNSU1JTUkNdI11TXQNc81zzXWNdU10DXVNdc11zXRNdA10TXXNSc1JzUlNdE1LTUnNdc11zXYNS012DXXNdU11TXZNdg12jXZNdU11TXWNdo12zXZNdo12jXcNds12TXbNd013TXYNdk12DXdNS81LzUtNdg1NTUvNd013TXeNTU13jXdNds12zXfNd414DXfNds12zXcNeA14TXfNeA14DXiNeE13zXhNeM14zXeNd813jXjNTc1NzU1Nd414TM3NeM14zW1NeEztTXjNeE14TWzNbU1sDWzNeE14TXiNbA15DXlNeY15jXnNeQ16DXpNeo16jXrNeg16jXpNew17DXtNeo17TXsNe417jXvNe018DXuNew17DXxNfA18TXsNek16TXyNfE18jXpNeg16DXzNfI19DXyNfM18zX1NfQ18jX0NfY19jXxNfI18TX2Nfc19zXwNfE1+DX3NfY19jX5Nfg1+TX2NfQ19DX6Nfk1+jX0NfU19TX7Nfo1/DX6Nfs1+zX9Nfw1+jX8Nf41/jX5Nfo1+TX+Nf81/zX4Nfk1ADb/Nf41/jUBNgA2ATb+Nfw1/DUCNgE2Ajb8Nf01/TUDNgI2BDYCNgM2AzYFNgQ2AjYENgY2BjYBNgI2ATYGNgc2BzYANgE2CDYHNgY2BjYJNgg2CTYGNgQ2BDYKNgk2CjYENgU2BTYLNgo2Azb9NQw2DTYMNv01DDYNNg42DzYONg02DTYQNg82ETYPNhA2EDYSNhE2EzYRNhI2EjYUNhM2EzYUNhU2FTYWNhM26zUVNhQ2FDboNes18zXoNRQ2FDYSNvM1EjYQNvU19TXzNRI2+zX1NRA2EDYNNvs1/TX7NQ02FzYVNus16zUYNhc2GDbrNeo16jUZNhg2GjYYNhk2GTYbNho2HDYaNhs2GzYdNhw2HjYcNh02HTYfNh42IDYeNh82HzYhNiA2IjYgNiE2ITYjNiI2JDYiNiM2IzYlNiQ2JjYkNiU2JTYnNiY2JTYjNig2KDYpNiU2KjYlNik2KTYrNio2KTYoNiw2LDYtNik2LjYpNi02LTYvNi42IzYhNjA2MDYoNiM2KDYwNjE2MTYsNig2MjYxNjA2MDYzNjI2MzYwNiE2ITYfNjM2NDYzNh82HzYdNjQ2MzY0NjU2NTYyNjM2NjY1NjQ2NDY3NjY2NzY0Nh02HTYbNjc2ODY3Nhs2GzYZNjg2NzY4Njk2OTY2Njc27zU5Njg2ODbtNe817TU4Nhk2GTbqNe01MjY1Njo2OzY6NjU2NTY2Njs2OjY7Njw2PDY9Njo2PjY6Nj02OjY+NjI2MTYyNj42PjY/NjE2LDYxNj82PzZANiw2LTYsNkA2QDZBNi02QTZANkI2QjZDNkE2QzZCNkQ2RDZFNkM2RTZENkY2RjZHNkU2RzZGNkg2SDZJNkc2STZINko2SjZLNkk2SzZKNkw2TDZNNks2TTZMNk42TjZPNk02UDZINkY2RjZRNlA2UTZGNkQ2SDZQNlI2UjZKNkg2SjZSNlM2UzZMNko2TDZTNlQ2VDZONkw2VTZUNlM2UzZWNlU2VjZTNlI2UjZXNlY2VzZSNlA2UDZYNlc2WDZQNlE2UTZZNlg2WjZYNlk2WTZbNlo2WDZaNlw2XDZXNlg2VzZcNl02XTZWNlc2VjZdNl42XjZVNlY2XzZeNl02XTZgNl82YDZdNlw2XDZhNmA2YTZcNlo2WjZiNmE2YjZaNls2WzZjNmI2ZDZiNmM2YzZlNmQ2YjZkNmY2ZjZhNmI2YTZmNmc2ZzZgNmE2YDZnNmg2aDZfNmA2aTZoNmc2ZzZqNmk2ajZnNmY2azZpNmo2ajZsNms2bDZqNm02ZjZtNmo2bTZmNmQ2bTZuNmw2bjZtNm82ZDZvNm02bzZkNmU2bzZwNm42cDZvNnE2ZTZxNm82cTZyNnA2czZrNmw2bDZ0NnM2dDZsNm42bjZ1NnQ2dTZuNnA2cDZ2NnU2djZwNnI2cjZ3NnY2eDZ2Nnc2dzZ5Nng2djZ4Nno2ejZ1NnY2dTZ6Nns2ezZ0NnU2dDZ7Nnw2fDZzNnQ2fTZ8Nns2ezZ+Nn02fjZ7Nno2ejZ/Nn42fzZ6Nng2eDaANn82gDZ4Nnk2eTaBNoA2gjaANoE2gTaDNoI2gDaCNoQ2hDZ/NoA2fzaENoU2hTZ+Nn82fjaFNoY2hjZ9Nn42hzaGNoU2hTaINoc2iDaFNoQ2hDaJNog2iTaENoI2gjaKNok2ijaCNoM2gzaLNoo2jDaKNos2izaNNow2ijaMNo42jjaJNoo2iTaONo82jzaINok2iDaPNpA2kDaHNog2kTaQNo82jzaSNpE2kjaPNo42jjaTNpI2kzaONow2jDaUNpM2lDaMNo02jTaVNpQ2ljaUNpU2lTaXNpY2lDaWNpg2mDaTNpQ2mTaSNpM2kzaaNpk2mzaRNpI2kjacNps2kDaRNp02nTaeNpA2hzaQNp42njafNoc2hjaHNp82nzagNoY2fTaGNqA2oDahNn02fDZ9NqE2oTaiNnw2czZ8NqI2ojajNnM2azZzNqM2ozakNms2aTZrNqQ2pDalNmk2pTakNqY2pjanNqU2pzamNqg2qDapNqc2qTaoNqo2qjarNqk2rDaqNqg2qDatNqw2rTaoNqY2pjauNq02rjamNqQ2pDajNq42ozaiNq82rzauNqM2rjavNrA2sDaxNq42sTawNrI2sjasNrE2szayNrA2sDa0NrM2tDawNq82rza1NrQ2tTavNqI2ojahNrU2tja1NqE2oTagNrY2tTa2Nrc2tza0NrU2tDa3Nrg2uDazNrQ2uTa4Nrc2tza6Nrk2uja3NrY2tja7Nro2uza2NqA2oDafNrs2vDa7Np82nzaeNrw2uza8Nr02vTa6Nrs2uja9Nr42vja5Nro2vza+Nr02vTbANr82wDa9Nrw2vDbBNsA2wTa8Np42njadNsE2wjbBNp02nTbDNsI2xDbANsE2wTbFNsQ2xja/NsA2wDbHNsY2vja/Nsg2yDbJNr42uTa+Nsk2yTbKNrk2uDa5Nso2yjbLNrg2sza4Nss2yzbMNrM2sjazNsw2zDbNNrI2rDayNs02zTbONqw2qjasNs42zjbPNqo2qzaqNs82zzbQNqs20DbPNtE20TbSNtA20jbRNtM20zbUNtI21DbTNtU21TbWNtQ21zbVNtM20zbYNtc22DbTNtE20TbZNtg22TbRNs82zzbONtk2zjbNNto22jbZNs422TbaNts22zbYNtk22DbbNtw23DbXNtg23TbcNts22zbeNt023jbbNto22jbfNt423zbaNs02zTbMNt824DbfNsw2zDbLNuA23zbgNuE24TbeNt823jbhNuI24jbdNt424zbiNuE24TbkNuM25DbhNuA24DblNuQ25TbgNss2yzbKNuU25jblNso2yjbJNuY25TbmNuc25zbkNuU25DbnNug26DbjNuQ26TboNuc25zbqNuk26jbnNuY25jbrNuo26zbmNsk2yTbINus27DbrNsg2yDbtNuw27jbqNus26zbvNu428DbpNuo26jbxNvA26DbpNvI28jbzNug24zboNvM28zb0NuM24jbjNvQ29Db1NuI23TbiNvU29Tb2Nt023DbdNvY29jb3Ntw21zbcNvc29zb4Ntc21TbXNvg2+Db5NtU21jbVNvk2+Tb6NtY2+jb5Nvs2+zb8Nvo2/Db7Nv02/Tb+Nvw2/jb9Nv82/zYAN/42ATf/Nv02/TYCNwE3Ajf9Nvs2+zYDNwI3Azf7Nvk2+Tb4NgM3+Db3NgQ3BDcDN/g2AzcENwU3BTcCNwM3AjcFNwY3BjcBNwI3BzcGNwU3BTcINwc3CDcFNwQ3BDcJNwg3CTcEN/c29zb2Ngk3CjcJN/Y29jb1Ngo3CTcKNws3CzcINwk3CDcLNww3DDcHNwg3DTcMNws3CzcONw03DjcLNwo3CjcPNw43DzcKN/U29Tb0Ng83EDcPN/Q29DbzNhA3DzcQNxE3ETcONw83DjcRNxI3EjcNNw43EzcSNxE3ETcUNxM3FDcRNxA3EDcVNxQ3FTcQN/M28zbyNhU3FjcVN/I28jYXNxY3GDcUNxU3FTcZNxg3GjcTNxQ3FDcbNxo3EjcTNxw3HDcdNxI3DTcSNx03HTceNw03DDcNNx43HjcfNww3BzcMNx83HzcgNwc3BjcHNyA3IDchNwY3ATcGNyE3ITciNwE3/zYBNyI3IjcjN/82ADf/NiM3IzckNwA3JDcjNyU3JTcmNyQ3JjclNyc3JzcoNyY3KDcnNyk3KTcqNyg3KzcpNyc3JzcsNys3LDcnNyU3JTctNyw3LTclNyM3IzciNy03IjchNy43LjctNyI3LTcuNy83LzcsNy03LDcvNzA3MDcrNyw3MTcwNy83LzcyNzE3MjcvNy43LjczNzI3MzcuNyE3ITcgNzM3NDczNyA3IDcfNzQ3Mzc0NzU3NTcyNzM3Mjc1NzY3NjcxNzI3Nzc2NzU3NTc4Nzc3ODc1NzQ3NDc5Nzg3OTc0Nx83HzceNzk3Ojc5Nx43HjcdNzo3OTc6Nzs3Ozc4Nzk3ODc7Nzw3PDc3Nzg3PTc8Nzs3Ozc+Nz03Pjc7Nzo3Ojc/Nz43Pzc6Nx03HTccNz83QDc/Nxw3HDdBN0A3Qjc+Nz83PzdDN0I3Nzc8N0Q3RDc8Nz03PTdFN0Q3RDdFN0Y3RjdHN0Q3RDdHN0g3SDdJN0Q3SjdJN0g3SDdLN0o3SjdLN0w3TDdNN0o3TjdNN0w3TDdPN043TjdPN1A3UDdRN043UjdRN1A3UDdTN1I3UjdTN1Q3VDdVN1I3UjdVNyo3KjcpN1I3UjcpNys3KzdRN1I3TjdRNys3KzcwN043TjcwNzE3MTdNN043SjdNNzE3MTc2N0o3Sjc2Nzc3NzdJN0o3RDdJNzc3VjdVN1Q3VDdXN1Y3VjdXN1g3WDdZN1Y3WjdZN1g3WDdbN1o3WjdbN1w3XDddN1o3XjddN1w3XDdfN143XjdfN2A3YDdhN143YjdhN2A3YDdjN2I3ZDdhN2I3XjdhN2Q3YjdlN2Q3ZDdlN2Y3ZjdnN2Q3ZzdmN2g3aDdpN2c3aTdoN2o3ajdrN2k3azdqN2w3bDdtN2s3bTdsN243bjdvN203bzduN3A3cDdxN283cTdwN3I3cjdzN3E3czdyN3Q3dDd1N3M3dTd0N3Y3djd3N3U3dzd2N3g3eDd5N3c3eTd4N3o3ejd7N3k3ezd6N3w3fDd9N3s3fTd8N343fjd/N303fzd+N4A3gDeBN383gTeAN4I3gjeDN4E3gzeCN082TzZONoM3hDeDN042TjZUNoQ3gzeEN4U3hTeGN4M3hjeFN4c3hzeIN4Y3iDeHN4k3iTd9N4g3ijeJN4c3hzeLN4o3izeHN4U3hTeMN4s3jDeFN4Q3hDeNN4w3jTeEN1Q2VDZVNo03jjeNN1U2VTZeNo43jTeON483jzeMN403jDePN5A3kDeLN4w3izeQN5E3kTeKN4s3kjeRN5A3kDeTN5I3kzeQN483jzeUN5M3lTePN443jjeWN5U3ljeON142XjZfNpY3lzeWN182XzZoNpc3ljeXN5g3mDeVN5Y3lDeYN5k3mTeTN5Q3kzeZN5o3mjeSN5M3qzaaN5k3mTepNqs2qTaZN5g3mDenNqk2pzaYN5c3lzelNqc2pTaXN2g2aDZpNqU2kTeSN5s3kjeaN5w3nDebN5I3mzecN503nTeeN5s3nzebN543njegN583oTefN6A3nzehN4o3iTeKN6E3oTeiN4k3fTeJN6I3ojd7N303ezeiN6M3ozd5N3s3eTejN6Q3pDd3N3k3dzekN6U3pTd1N3c3pjelN6Q3pDenN6Y3pzekN6M3ozeoN6c3qDejN6I3ojehN6g3oDeoN6E3qDegN6k3qTenN6g3pzepN6o3qjemN6c3qzeqN6k3qTesN6s3rDepN6A3oDeeN6w3rTesN543njedN603rDetN643rjerN6w31jauN603rTfUNtY21DatN503nTfSNtQ20jadN5w3nDfQNtI20DacN5o3mjerNtA2qjerN683rzewN6o3pjeqN7A3sDexN6Y3pTemN7E3sTeyN6U3dTelN7I3sjdzN3U3czeyN7M3szdxN3M3cTezN7Q3tDdvN3E3bze0N7U3tTdtN283tje1N7Q3tDe3N7Y3tze0N7M3sze4N7c3uDezN7I3sjexN7g3uTe4N7E3sTewN7k3uDe5N7o3uje3N7g3tze6N7s3uze2N7c3vDe7N7o3uje9N7w3vTe6N7k3uTe+N703vje5N7A3sDevN743vze+N683rzfAN783wDevN6s3qzeuN8A3vje/N8E3wTe9N743vTfBN8I3wje8N703ADfCN8E3wTf+NgA3/jbBN783vzf8Nv42/Da/N8A3wDf6Nvw2+jbAN643rjfWNvo2uze8N8M3vDfCN8Q3xDfDN7w3wzfEN8U3xTfGN8M3xzfDN8Y3xjfIN8c3yTfHN8g3xzfJN7Y3tTe2N8k3yTfKN7U3bTe1N8o3yjdrN203azfKN8s3yzdpN2s3aTfLN8w3zDdnN2k3ZzfMN803zTdkN2c3zjfNN8w3zDfPN843zzfMN8s3yzfQN8830DfLN8o3yjfJN9A3yDfQN8k30DfIN9E30TfPN9A3zzfRN9I30jfON8830zfSN9E30TfUN9M31DfRN8g3yDfGN9Q31TfUN8Y3xjfFN9U31DfVN9Y31jfTN9Q3KjfWN9U31TcoNyo3KDfVN8U3xTcmNyg3JjfFN8Q3xDckNyY3JDfEN8I3wjcANyQ3WjfSN9M3zjfSN1o3WjddN843zjddN143XjfNN843ZDfNN1431jcqN1U3VTdWN9Y30zfWN1Y30zdZN1o3VjdZN9M3kTbXN9g32DedNpE2vzbZN9o32jfINr82ijeRN583mzefN5E36TbbN9w33DfyNuk2EzfdN9433jccNxM33zfgN+E34TfiN983tje7N8c3wzfHN7s3PTfjN+Q35DdFNz03RjdFN+U35TfmN0Y3DjbnNww26DcMNuc3DDboNwM25zfpN+g36jfoN+k36TfrN+o36DfqNwU2BTYDNug3CzYFNuo36jfsNws27DfqN+s36zftN+w37jfvN/A38DfxN+438jfwN+838DfyNyI2IjYkNvA38zfwNyQ2JDb0N/M37zf1N/I39jfyN/U39Tf3N/Y38jf2NyA2IDYiNvI3HjYgNvY39jf4Nx42+Df2N/c39zf5N/g3+jf4N/k3+Tf7N/o3+Df6Nxw2HDYeNvg3GjYcNvo3+jf8Nxo2/Df6N/s3+zf9N/w3Fzb8N/03/Tf+Nxc2/DcXNhg2GDYaNvw3FTYXNv43/jcWNhU27zXuNf83/zcAOO81ADj/NwE4ATgCOAA4AjgBOAM4AzgEOAI4BDgDOHI2cjZxNgQ4dzZyNgM4AzgFOHc2BTgDOAE4ATgGOAU4BjgBOP83/zcHOAY4Bzj/N+417jXwNQc4CDgHOPA18DX3NQg4BzgIOAk4CTgGOAc4BjgJOAo4CjgFOAY4BTgKOHk2eTZ3NgU4gTZ5Ngo4CjgLOIE2CzgKOAk4CTgMOAs4DDgJOAg4CDgNOAw4DTgIOPc19zX4NQ04DjgNOPg1+DX/NQ44DTgOOA84DzgMOA04DDgPOBA4EDgLOAw4CzgQOIM2gzaBNgs4izaDNhA4EDgROIs2ETgQOA84DzgSOBE4EjgPOA44DjgTOBI4EzgOOP81/zUANhM4FDgTOAA2ADYHNhQ4EzgUOBU4FTgSOBM4EjgVOBY4FjgROBI4ETgWOI02jTaLNhE4lTaNNhY4FjgXOJU2FzgWOBU4FTgYOBc4GDgVOBQ4FDgZOBg4GTgUOAc2BzYINhk4GjgZOAg2CDYbOBo4HDgYOBk4GTgdOBw4HjgXOBg4GDgfOB44IDiVNhc4FzghOCA4QDY/NiI4IjhCNkA2QjYiOCM4IzhENkI2RDYjOFE2WTZRNiM4IzgkOFk2JDgjOCI4IjglOCQ4JTgiOD82PzY+NiU4PTYlOD42JTg9NiY4JjgkOCU4JDgmOFs2WzZZNiQ4YzZbNiY4JjgnOGM2JzgmOD02PTY8Nic4KDgnODw2PDYpOCg4KTg8Njs2OzYqOCk4Kjg7NjY2NjY5Nio4JzgoOGU2ZTZjNic4cTZlNig4KDgEOHE2BDgoOCk4KTgCOAQ4AjgpOCo4KjgAOAI4ADgqODk2OTbvNQA4KzgsOC04LTguOCs4LzgrOC44LjgwOC84MTgvODA4MDgyODE4MzgxODI4Mjg0ODM4NTgzODQ4NDg2ODU4Nzg1ODY4Njg4ODc4OTg6ODs4Ozg8ODk4PTg+OD84QDhBOEI4QzhEOEU4RThGOEM4RzhIOEk4SThKOEc4SzhMOE04NDgyOE44TThPOEs4UDhROFI4UThQOFM4UjhUOFA4VThWOFc4VzhYOFU4WThaOFs4WzhcOFk4WThcOF04XTheOFk4OjhZOF44Xjg7ODo4Xzg4ODY4YDhaOFk4YThiOGM4ZDhWOFU4ZThmOGc4ZjhlOGg4aThIOEc4XThcOGo4ajhcOFs4ajhrOF04WzhsOGo4bThYOFc4VzhuOG04bzhUOFI4UjhwOG84cThPOE04TThyOHE4czhKOEk4STh0OHM4dThGOEU4RTh2OHU4dzh4OHk4ejh7OHw4czh0OH04fjh/OIA4gDiBOH44fzh+OII4gjiDOH84hDiFOIY4hziGOIU4gziCOIg4iDiJOIM4gziJOIo4iTiIOIs4iziMOIk4jDiLOI04jTiOOIw4jjiNOI84jziQOI44kTiSOJM4kziUOJE4ijiJOIw4lThvOHA4kjiROGs4azhqOJI4jjiQOJY4ajhsOJc4bThuOJg4mTiaOJs4nDidOJ44nzicOJ44njigOJ84oTifOKA4oDiiOKE4ozihOKI4ojikOKM4pTijOKQ4pjinOKg4qDinOKk4qjikOKI4ojirOKo4ojigOKw4rDirOKI4rTiqOKs4qziuOK04rziuOKs4qzisOK84TjgyODA4sDixOLI4sjizOLA4QThAOLQ4tDi1OEE4RThEOLY4tji3OEU4RTi3OLg4uDh2OEU4eDi5OLo4ujh5OHg4uzi8OL04vTi+OLs4sTiwOL84vzjAOLE4wTjCOMM4sTjAOMQ4wzjCOMU4wzjGOME4xzi9OLw4vDjIOMc4wTjGOMk4yTjKOME4yzjKOMk4zDjIOLw4zTjOOM84yTjQONE40DjJOMY40jjTONQ41DjVONI4xjjDONY41jjDONc40jjVONg41jjZOMY4xjjZONA4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A3/VviBGp74drRY/UW3FviBGp779hRY/EKXLviBGp74fahM/wQK9viBGp74wKxA/ER/FviBGp74kfQ4/f/m5viBGp74cswg/h8TCviBGp74cswg/wQK9viBGp74IOwE/ER/FviBGp74D6QI/UW3FviBGp75WwPU+EKXLviBGp74S+Ps+6yLSviBGp77oVe0+A3/VviBGp74WcvU+ExPhvso1lL5a1eI+ExPhvn19nL5a1eI+b93yvn19nL78cuY+b93yvso1lL78cuY+OAABv319nL7aePA+OAABv8o1lL7aePA+JwMGv3x9nL7cm/8+JwMGv8o1lL7cm/8+99EHv3x9nL4cswg/99EHv8o1lL4cswg/JwMGv3x9nL5KmBE/JwMGv8o1lL5KmBE/OAABv3x9nL67KRk/OAABv8o1lL67KRk/b93yvnx9nL6qLB4/b93yvso1lL6qLB4/ExPhvnx9nL6L+x8/ExPhvso1lL6L+x8/t0jPvnx9nL6qLB4/t0jPvso1lL66LB4/sZECvyBGp74IOwE/JwMGv3x9nL7cm/8+OAABv319nL7aePA++Lj8viBGp75WwPU+b93yvn19nL78cuY+OwPwviBGp77oVe0+ExPhvn19nL5a1eI+ExPhviBGp76mTOo+OwPwviBGp75Fuxo/b93yvnx9nL6qLB4/OAABv3x9nL67KRk/+Lj8viBGp779hRY/ExPhviBGp77mPxw/ExPhvnx9nL6L+x8/6yLSviBGp75Fuxo/t0jPvnx9nL6qLB4/t0jPvn19nL78cuY+t0jPvso1lL78cuY+t0jPvn19nL78cuY+1SXAvso1lL7aePA+1SXAvn19nL7aePA++h+2vso1lL7cm/8++h+2vn19nL7cm/8+NYKyvso1lL4cswg/NYKyvn19nL4cswg/+h+2vso1lL5KmBE/+h+2vn19nL5KmBE/1SXAvso1lL67KRk/1SXAvn19nL67KRk/t0jPvso1lL66LB4/t0jPvnx9nL6qLB4/UW3FviBGp779hRY/1SXAvn19nL67KRk/t0jPvnx9nL6qLB4/6yLSviBGp75Fuxo/wQK9viBGp74wKxA/+h+2vn19nL5KmBE/f/m5viBGp74cswg/NYKyvn19nL4cswg/wQK9viBGp74IOwE/+h+2vn19nL7cm/8+UW3FviBGp75WwPU+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41LwPn99nL6qLB4/41LwPsw1lL6qLB4/h4jePn99nL6L+x8/h4jePsw1lL6L+x8/K77MPn99nL6qLB4/K77MPsw1lL66LB4/6HX/PoB9nL7aePA+470EP4B9nL7cm/8+bUwBPyJGp74IOwE/DtECPyJGp74cswg/s4wGP4B9nL4cswg/470EP4B9nL5KmBE/bUwBPyJGp74wKxA/aC76PiJGp779hRY/6HX/PoB9nL67KRk/41LwPn99nL6qLB4/r3jtPiJGp75Fuxo/h4jePiJGp77mPxw/h4jePn99nL6L+x8/K77MPn99nL6qLB4/X5jPPiJGp75Fuxo/aC76PiJGp75WwPU+41LwPoB9nL78cuY+r3jtPiJGp77oVe0+h4jePoB9nL5a1eI+h4jePiJGp76mTOo+K77MPoB9nL78cuY+K77MPoB9nL78cuY+K77MPsw1lL78cuY+SZu9Psw1lL7aePA+SZu9PoB9nL7aePA+apWzPsw1lL7cm/8+apWzPn99nL7cm/8+qfevPsw1lL4cswg/qfevPn99nL4cswg/apWzPsw1lL5KmBE/apWzPn99nL5KmBE/SZu9Psw1lL67KRk/SZu9Pn99nL67KRk/K77MPsw1lL66LB4/K77MPn99nL6qLB4/K77MPn99nL6qLB4/SZu9Pn99nL67KRk/xeLCPiJGp779hRY/X5jPPiJGp75Fuxo/apWzPn99nL5KmBE/NXi6PiJGp74wKxA/8263PiJGp74cswg/qfevPn99nL4cswg/apWzPn99nL7cm/8+NXi6PiJGp74IOwE/xeLCPiJGp75WwPU+SZu9PoB9nL7aePA+X5jPPiJGp77oVe0+h4jePga0g776hNw+f7zyPga0g74soOA+f7zyPj53kL4soOA+h4jePjh3kL76hNw+bfYBPzh3kL7oAew+bfYBPwC0g77oAew+S6cHPzh3kL5AMv0+S6cHPwC0g75AMv0+5LQJPz53kL4cswg/5LQJPwa0g74cswg/S6cHPzh3kL4YzRI/S6cHPwC0g74YzRI/bfYBPzh3kL40ZRs/bfYBPwC0g740ZRs/f7zyPj53kL4jFiE/f7zyPgC0g74jFiE/h4jePj53kL68IyM/h4jePgC0g768IyM/jFTKPjh3kL4jFiE/sFTKPgC0g74jFiE/NSS5Pj53kL40ZRs/jFTKPjh3kL4jFiE/sFTKPgC0g74jFiE/ViS5Pga0g75FZRs/eMKtPjh3kL4IzRI/esKtPgC0g74YzRI/R6epPjh3kL4cswg/R6epPgC0g74cswg/eMKtPjh3kL5AMv0+esKtPgC0g75iMv0+VCS5Pjh3kL7oAew+ViS5Pga0g77oAew+rlTKPj53kL4soOA+sFTKPga0g74soOA+h4jePn/mW75a1eI+41LwPoDmW778cuY+41LwPvjqf778cuY+h4jePvjqf75a1eI+6HX/Pvjqf77aePA+6HX/PmXmW77aePA+470EPwTrf77cm/8+470EP4DmW77cm/8+s4wGPwTrf74cswg/s4wGP3/mW74cswg/470EPwTrf75KmBE/470EP2TmW75KmBE/6HX/Pvjqf767KRk/6HX/Pn7mW767KRk/41LwPvbqf76qLB4/41LwPn7mW766LB4/h4jePvbqf76L+x8/h4jePn7mW76L+x8/K77MPgTrf766LB4/K77MPmTmW766LB4/SZu9Pvbqf767KRk/K77MPgTrf766LB4/K77MPmTmW766LB4/SZu9Pn7mW77MKRk/bJWzPvbqf75KmBE/bJWzPmTmW75KmBE/qfevPvbqf74cswg/qfevPmTmW74cswg/bJWzPvbqf77cm/8+bJWzPnLmW77cm/8+SZu9PgTrf77aePA+SZu9PmTmW77aePA+K77MPgTrf778cuY+K77MPn/mW778cuY+h4jePsG1Ur6mQ98+ELDxPs+1Ur4yKOM+ELDxPiimV74yKOM+h4jePjWmV76mQ98++/0APyimV77M8u0++/0AP8+1Ur7M8u0+SGMGPzamV76wPv4+SGMGP8K1Ur6wPv4+nlUIPzWmV74cswg/nlUIP861Ur4cswg/SGMGPyimV77QRhI/SGMGP+O1Ur7QRhI/+/0APyemV77TbBo/+/0AP861Ur7TbBo/ELDxPjSmV74g0h8/ELDxPs61Ur4g0h8/h4jePjSmV75lxCE/h4jePsC1Ur5lxCE/H2HLPiamV74g0h8/H2HLPs61Ur4g0h8/GhW7PiamV77TbBo/H2HLPiamV74g0h8/H2HLPs61Ur4g0h8/GhW7PsC1Ur7TbBo/oUqwPiamV77hRhI/oUqwPs61Ur7hRhI/9WWsPjSmV74cswg/9WWsPs61Ur4cswg/oUqwPiemV76wPv4+oUqwPs61Ur6wPv4+GhW7PiemV77M8u0+GhW7Ps61Ur7M8u0+H2HLPiimV74yKOM+H2HLPuO1Ur4yKOM+h4jePsw1lL5a1eI+h4jePjh3kL76hNw+f7zyPj53kL4soOA+41LwPsw1lL78cuY+bfYBPzh3kL7oAew+6HX/Psw1lL7aePA+S6cHPzh3kL5AMv0+470EP8w1lL7cm/8+5LQJPz53kL4cswg/s4wGP8w1lL4cswg/S6cHPzh3kL4YzRI/470EP8w1lL5KmBE/bfYBPzh3kL40ZRs/6HX/Psw1lL67KRk/f7zyPj53kL4jFiE/41LwPsw1lL6qLB4/h4jePj53kL68IyM/h4jePsw1lL6L+x8/jFTKPjh3kL4jFiE/K77MPsw1lL66LB4/K77MPsw1lL66LB4/jFTKPjh3kL4jFiE/NSS5Pj53kL40ZRs/SZu9Psw1lL67KRk/eMKtPjh3kL4IzRI/apWzPsw1lL5KmBE/R6epPjh3kL4cswg/qfevPsw1lL4cswg/eMKtPjh3kL5AMv0+apWzPsw1lL7cm/8+VCS5Pjh3kL7oAew+SZu9Psw1lL7aePA+rlTKPj53kL4soOA+K77MPsw1lL78cuY+6HX/Pvjqf77aePA+bfYBPwC0g77oAew+f7zyPga0g74soOA+41LwPvjqf778cuY+h4jePga0g776hNw+h4jePvjqf75a1eI+sFTKPga0g74soOA+K77MPgTrf778cuY+ViS5Pga0g77oAew+SZu9PgTrf77aePA+esKtPgC0g75iMv0+bJWzPvbqf77cm/8+R6epPgC0g74cswg/qfevPvbqf74cswg/esKtPgC0g74YzRI/bJWzPvbqf75KmBE/ViS5Pga0g75FZRs/SZu9Pvbqf767KRk/sFTKPgC0g74jFiE/K77MPgTrf766LB4/K77MPgTrf766LB4/sFTKPgC0g74jFiE/h4jePgC0g768IyM/h4jePvbqf76L+x8/f7zyPgC0g74jFiE/41LwPvbqf76qLB4/bfYBPwC0g740ZRs/6HX/Pvjqf767KRk/S6cHPwC0g74YzRI/470EPwTrf75KmBE/5LQJPwa0g74cswg/s4wGPwTrf74cswg/S6cHPwC0g75AMv0+470EPwTrf77cm/8+h4jePn/mW75a1eI+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z0nnPkmBpD6qD1U/NjEbPgldhD7oOXQ/NjEbPgldhD7oOXQ/z0nnPkmBpD6qD1U/XMktvvdHez9owbM9XMktvvdHez9owbM9XMktvvdHez9owbM9XMktvvdHez9nsbM9XMktvvdHez9owbM9XNEtvvdHez9owbM9XMktvvdHez9nobM9XMEtvvdHez9owbM9XMktvvdHez9owbM9XMktvvdHez9owbM9XOEtvvdFez9o4bM9XMktvvdHez9owbM9XMktvvdHez9owbM9XMktvvdHez9nsbM9XMktvvdHez9owbM9XNEtvvdHez9owbM9XMktvvdHez9owbM9XMktvvdHez9owbM9XNEtvvdHez9nsbM9XMktvvdHez9nsbM9pYFSvvwBfrv1hXq/FgkLPszBZT36N32/n4XPPh1RDj7PTWe/YV2wPiT5ET7biW2/DvsGP1OxKT6rV1W/C2MFvx4Rj720w1m/jMVFvxIhCb4+4x6/3AFuv4LZQL5E/aG+84V5v8gJZL4owZO84tdwv+uhdb7qKXU+r3VXv/Q5er7tjfY+X10vv+OJcb5hczA/xvnivq9xV76+DV8/4AHwvU+ZJ772wXo/y5FlPqlx1L3wD3g/FCUKPzWBGr2vTVc/h6VDPzIBmTxKBSU/rgFXP1GhKD0Viwo/XNEtPvdHe79owbO9XMktPvdHe79owbO9XMktPvdHe79nsbO9XMktPvdHe79nsbO9XMktPvdHe79nsbO9XMktPvdHe79nsbO9XMktPvdHe79owbO9XMktPvdHe79owbO9XMEtPvdHe79owbO9XMEtPvdHe79owbO9XNktPvdFe79nsbO9XNktPvdFe79nsbO9XMktPvdHe79nsbO9XMktPvdHe79owbO9XNEtPvdHe79o0bO9XMktPvdHe79o0bO9XNEtPvdHe79owbO9XNEtPvdFe79o0bO9XMktPvdHe79nsbO9XMktPvdHe79owbO9XMktPvdHe79nobO9XMktPvdHe79nobO9XMktPvdHe79nsbO9XMktPvdHe79nsbO9XMktPvdHe79o0bO9XMktPvdHe79o0bO9XMktPvdHe79owbO9XMktPvdHe79owbO9XNEtPvdHe79owbO9XNEtPvdHe79owbO9XMktPvdHe79owbO9XMktPvdHe79o0bO9XMktvvdHez9nsbM9XMktvvdHez9nsbM9XMktvvdHez9o0bM9XMktvvdHez9o0bM9XMktvvdHez9nobM9XMktvvdHez9nobM9XMktvvdHez9owbM9XNEtvvdHez9o0bM9XMktvvdHez9owbM9XMEtvvdHez9owbM9XMktvvdHez9owbM9XMktvvdHez9owbM9XMEtvvdHez9o0bM9W7ktvvdHez9o0bM9W7ktvvdHez9owbM9W7ktvvdHez9owbM9XMktvvdHez9owbM9XMktvvdHez9owbM9XNEtvvdHez9owbM9XNEtvvdHez9owbM9XMktvvdHez9owbM9XNEtvvdHez9owbM9XMktvvdHez9nsbM9XMktvvdHez9nsbM9XMktvvdHez9owbM9XMktvvdHez9owbM9XMktvvdHez9o0bM9XMktvvdHez9o0bM9XMktvvdHez9o0bM9XMktvvdHez9owbM9XMktvvdHez9owbM9XMktvvdHez9owbM9XNEtvvdHez9owbM9XNEtvvdHez9nsbM9XMktvvdHez9owbM9XMktvvdHez9owbM9+iH9vfzzfb+WQcs86MFzPfwxfr+jcdE9IsEQvf7Zfr9nkbM9IhkRvvoxfb9NoSa93hHvvfmlfL/HseO9E48Jv17xLr/6Bf2+GuUMv1g7LL/6If2+EtcIv1+DL7/6/fy+DN0Fv2TbMb/61fy+UW0ov1ZBq71/lz+/bgU3vzA5GL5e5S6/VOUpv9G5aL5tbza/O38dv49xR76HjUO/Pg8fv4gBRLuRk0i/K50Vv2bhsr2dhU6/G4kNv4ThQb2q9VS/C10FvyDxj720xVm/MaGYPntTPb81exo/XV2uPm91N784zRs/NBmaPnrzPL81lRo/C1mFPoQVQr8yBxk/Z6GzPu4x973buW0/piHTPpl5TL7Hi2M/dAm6PujRc77Nk2Y/RYWiPkJBIb7fYW8/RamiPs4BZ7zls3I/Js2SPkIhIb3qCXU/7NF1PiQhEr3xV3g/uVFcPprBTL3zq3k/1XFqvx7hDj2a2cw+04NpvxoBjTukydE+0adovzVhGj2pudQ+xstivz2hnj3UIeo+xuNivzwxnj3Uxek+z6Nnv1QBKju09dk+z4Fnv0ABoLq1gdo+z1NnvzYBG7y2Ods+aOkzPveJez/uIXc9aOkzPveJez/uAXc9VBEqPvj3ez/sIXY9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XMktvvdHe79owbO9XMktvvdHe79owbO9XMktvvdHe79nobO9XMktvvdHe79nsbO9XMktvvdHe79nsbO9XMktvvdHe79owbO9XMktvvdHe79owbO9XMEtvvdHe79owbO9XMEtvvdHe79owbO9XOEtvvdFe79nsbO9XOEtvvdFe79nsbO9XNEtvvdHe79nsbO9XMktvvdHe79nsbO9XNEtvvdHe79owbO9XNEtvvdHe79owbO9XMktvvdHe79owbO9XMktvvdHe79o0bO9XMktvvdHe79nobO9XMktvvdHe79owbO9XMktvvdHe79nsbO9XMEtvvdHe79nobO9XMktvvdHe79nsbO9XMktvvdHe79nsbO9XMktvvdHe79o0bO9XMktvvdHe79o0bO9XMktvvdHe79owbO9XMktvvdHe79owbO9XNEtvvdHe79owbO9XNEtvvdHe79nsbO9XMktvvdHe79owbO9XNEtvvdHe79o0bO9XMktPvdHez9o0bM9XMktPvdHez9nsbM9XMktPvdHez9nsbM9XMktPvdHez9o0bM9XMktPvdHez9nobM9XMktPvdHez9nobM9XMktPvdHez9owbM9XMktPvdHez9owbM9XMktPvdHez9owbM9XMEtPvdHez9owbM9XMktPvdHez9owbM9XMktPvdHez9owbM9XMEtPvdHez9o0bM9W7ktPvdHez9o0bM9W7EtPvdHez9owbM9W7EtPvdHez9owbM9XMktPvdHez9owbM9XMktPvdHez9owbM9XNEtPvdHez9owbM9XNEtPvdHez9owbM9XNEtPvdHez9owbM9XNEtPvdFez9owbM9XMktPvdHez9nsbM9XMktPvdHez9nsbM9XMktPvdHez9nsbM9XMktPvdHez9owbM9XMktPvdHez9o0bM9XMktPvdHez9o0bM9XMktPvdHez9o0bM9XMktPvdHez9owbM9XMktPvdHez9owbM9XMktPvdHez9owbM9XNEtPvdHez9owbM9XNEtPvdHez9nsbM9XNEtPvdHez9owbM9XMktPvdHez9o0bM9+iH9Pfzzfb+WQcs83hHvPfmlfL/HseO9IhkRPvoxfb9NoSa9IsEQPf7Zfr9nkbM96MFzvfwxfr+jcdE9EtcIP1+DL7/6/fy+GuUMP1g7LL/6If2+E48JP17vLr/6Bf2+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AAAAAAAAgL8AAACAAAAAAAAAgL8AAACAAAAAAAAAgL8AAACAAAAAAAAAgL8AAACAAAAAAAAAgL8AAACAAAAAAAAAgL8AAACAAAAAAAAAgL8AAACAAAAAAAAAgL8AAACAAAAAAAD+f78AAACAAAAAAAAAgL8AAACAAAAAAAAAgL8AAACAAAAAAAAAgL8AAACAAAAAAAAAgL8AAACAAAAAAAAAgL8AAACAAAAAAAAAgL8AAACAAAAAAAAAgL8AAACAAAAAAAAAgL8AAACAAAAAAAD+f78AAACAAAAAAAD+f78AAACAAAAAAAAAgL8AAACAAAAAAAAAgL8AAACAAAAAAAD+f78AAACAiO3DvgABALjZgWy/iO3DvgABgLjZgWy/AAAAAAAAAAAAAIC/AAAAAAAAAAAA/n+/agM1vwAAAABqBTW/agM1vwAAAABqBTW/2YFsvwAAAACI7cO+2YFsvwAAAACI7cO+AACAvwAAAAAAAACAAACAvwAAAAAAAACA2YFsvwAAAACI7cM+2YFsvwAAAACI7cM+agM1vwAAAABqAzU/agM1vwAAAABqAzU/iO3DvgAAAADZgWw/iO3DvgAAAADZgWw/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/iOnDPgAAAADZgWw/iOnDPgAAAADZg2w/iOnDPgAAAADZgWw/agM1PwAAAABqAzU/agM1PwAAAABqAzU/iOnDPgAAAADZg2w/2YFsPwAAAACI6cM+2YFsPwAAAACI6cM+AACAPwAAAAAAAACAAACAPwAAAAAAAACA2YFsPwAAAACI7cO+2YFsPwAAAACI7cO+agM1PwAAAABqAzW/agM1PwAAAABqBTW/iO3DPgABgLjZgWy/iO3DPgABgLjZgWy/iO3DvgAAAADZgWy/iO3DvgAAAADZgWy/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/agM1vwAAAABqAzW/agM1vwAAAABqAzW/2YFsvwAAAACI7cO+2YFsvwAAAACI7cO+AACAvwAAAAAAAACAAACAvwAAAAAAAACA2YFsvwAAAACI7cM+2YFsvwAAAACI7cM+agM1vwAAAABqAzU/agM1vwAAAABqAzU/iO3DvgAAAADZgWw/iO3DvgAAAADZgWw/AAAAAAAAAAAAAIA/AAAAAAAAAAAA/n8/iO3DPgAAAADZgWw/iO3DPgAAAADZgWw/iO3DPgAAAADZgWw/agU1PwAAAABqAzU/agM1PwAAAABqBTU/iO3DPgAAAADZgWw/2YFsPwAAAACI7cM+2YFsPwAAAACI7cM+AACAPwAAAAAAAACAAP5/PwAAAAAAAACA2YFsPwAAAACI7cO+2YFsPwAAAACI7cO+agM1PwAAAABqAzW/agM1PwAAAABqAzW/iO3DPgAAAADZgWy/iO3DPgAAAADZgWy/iO3DvgAAAADZgWy/iO3DvgAAAADZgWy/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/agM1vwAAAABqAzW/agM1vwAAAABqAzW/2YFsvwAAAACI7cO+2YFsvwAAAACI7cO+AACAvwAAAAAAAACAAACAvwAAAAAAAACA2YFsvwAAAACI7cM+2YFsvwAAAACI7cM+agM1vwAAAABqAzU/agM1vwAAAABqAzU/iO3DvgAAAADZgWw/iO3DvgAAAADZgWw/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/iOnDPgAAAADZgWw/iO3DPgAAAADZgWw/iOnDPgAAAADZgWw/agM1PwAAAABqAzU/agM1PwAAAABqBTU/iO3DPgAAAADZgWw/2YFsPwAAAACI7cM+2YFsPwAAAACI7cM+AP5/PwAAAAAAAACAAACAPwAAAAAAAACA2YFsPwAAAACI7cO+2YFsPwAAAACI7cO+agM1PwAAAABqAzW/agM1PwAAAABqAzW/iO3DPgAAAADZgWy/iO3DPgAAAADZgWy/AAAAAAAAAAAA/n+/AAAAAAAAAAAAAIC/iO3DvgAAAADZgWy/iO3DvgAAAADZgWy/agM1vwAAAABqBTW/agM1vwAAAABqBTW/2YFsvwAAAACI7cO+2YFsvwAAAACI7cO+AACAvwAAAAAAAACAAP5/vwAAAAAAAACA2YNsvwAAAACI6cM+2YNsvwAAAACI6cM+agM1vwAAAABqAzU/agM1vwAAAABqAzU/iOnDvgAAAADZgWw/iOnDvgAAAADZgWw/AAAAAAABgDkAAIA/AAAAAAABgDkA/n8/iOnDPgAAAADZgWw/iOnDPgAAAADZgWw/iOnDPgAAAADZgWw/agM1PwAAAABqAzU/agM1PwAAAABqAzU/iOnDPgAAAADZgWw/2YNsP8ABYDmI6cM+2YFsPwABgDmI7cM+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agM1PwAAAABqBTW/2YFsPwAAAACI7cO+2YFsPwAAAACI7cO+AACAPwAAAAAAAACAAACAPwAAAAAAAACA2YFsPwAAAACI7cM+2YFsPwAAAACI7cM+agM1PwAAAABqAzU/agM1PwAAAABqAzU/iO3DPgAAAADZgWw/iO3DPgAAAADZgWw/AAAAAAAAAAAA/n8/AAAAAAAAAAAAAIA/iOnDvgAAAADZgWw/iOnDvgAAAADZg2w/iOnDvgAAAADZgWw/iOnDvgAAAADZg2w/agM1vwAAAABqAzU/agM1vwAAAABqAzU/2YFsvwAAAACI6cM+2YFsvwAAAACI6cM+AACAvwAAAAAAAACAAACAvwAAAAAAAACA2YFsvwAAAACI7cO+2YFsvwAAAACI7cO+agM1vwAAAABqAzW/agM1vwAAAABqAzW/iO3DvgABgLjZgWy/iO3DvgABgLjZgWy/iO3DPgAAAADZgWy/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/iO3DPgAAAADZgWy/agM1PwAAAABqAzW/agM1PwAAAABqAzW/2YFsPwAAAACI7cO+2YFsPwAAAACI7cO+AACAPwAAAAAAAACAAACAPwAAAAAAAACA2YFsPwAAAACI7cM+2YFsPwAAAACI7cM+agM1PwAAAABqAzU/agM1PwAAAABqAzU/iO3DPgAAAADZgWw/iO3DPgAAAADZgWw/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/iO3DvgAAAADZgWw/iO3DvgAAAADZgWw/iO3DvgAAAADZgWw/iO3DvgAAAADZgWw/agM1vwAAAABqBTU/agU1vwAAAABqAzU/2YFsvwAAAACI7cM+2YFsvwAAAACI7cM+AACAvwAAAAAAAACAAP5/vwAAAAAAAACA2YFsvwAAAACI7cO+2YFsvwAAAACI7cO+agM1vwAAAABqAzW/agM1vwAAAABqAzW/iO3DvgAAAADZgWy/iO3DvgAAAADZgWy/iO3DPgAAAADZgWy/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/iO3DPgAAAADZgWy/agM1PwAAAABqAzW/agM1PwAAAABqAzW/2YFsPwAAAACI7cO+2YFsPwAAAACI7cO+AACAPwAAAAAAAACAAACAPwAAAAAAAACA2YFsPwAAAACI7cM+2YFsPwAAAACI6cM+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iO3DPgAAAADZgWw/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/iO3DvgAAAADZgWw/iO3DvgAAAADZgWw/agM1vwAAAABqAzU/iO3DvgAAAADZgWw/iO3DvgAAAADZgWw/agM1vwAAAABqBTU/2YFsvwAAAACI7cM+2YFsvwAAAACI7cM+AP5/vwAAAAAAAACAAP5/vwAAAAAAAACA2YFsvwAAAACI7cO+2YFsvwAAAACI7cO+agM1vwAAAABqAzW/agM1vwAAAABqAzW/iO3DvgAAAADZgWy/iO3DvgAAAADZgWy/AAAAAAAAAAAAAIC/iO3DPgAAAADZgWy/iO3DPgAAAADZgWy/AAAAAAAAAAAAAIC/agM1PwAAAABqAzW/agM1PwAAAABqAzW/2YFsPwAAAACI7cO+2YFsPwAAAACI7cO+AACAPwAAAAAAAACAAACAPwAAAAAAAACA2YFsPwAAAACI7cM+2YFsPwAAAACI7cM+agM1PwAAAABqAzU/agM1PwAAAABqAzU/iO3DPgAAAADZgWw/iO3DPgAAAADZgWw/AAAAAAAAAAAA/n8/AAAAAAAAAAAAAIA/iO3DvgAAAADZgWw/iO3DvgAAAADZgWw/agM1vwAAAABqAzU/iO3DvgAAAADZgWw/iO3DvgAAAADZgWw/agM1vwAAAABqAzU/2YFsvwAAAACI7cM+2YFsvwAAAACI7cM+AACAvwAAAAAAAACAAACAvwAAAAAAAACA2YFsvwAAAACI7cO+2YFsvwAAAACI7cO+agM1vwAAAABqAzW/agM1vwAAAABqAzW/iO3DvgAAAADZgWy/iO3DvgAAAADZgWy/AAAAAAAAAAAAAIC/iO3DPgAAAADZgWy/iO3DPgAAAADZgWy/AAAAAAAAAAAAAIC/agM1PwAAAABqAzW/agM1PwAAAABqAzW/2YFsPwAAAACI7cO+2YFsPwAAAACI7cO+AACAPwAAAAAAAACAAACAPwAAAAAAAACA2YFsPwAAAACI7cM+2YFsPwAAAACI7cM+agM1PwAAAABqAzU/agM1PwAAAABqAzU/iO3DPgAAAADZgWw/iO3DPgAAAADZgWw/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/iO3DvgAAAADZgWw/iO3DvgAAAADZgWw/agM1vwAAAABqAzU/iO3DvgAAAADZgWw/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" } ], "images" : [ { "uri" : "data:image/jpeg;base64,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" }, { "uri" : "data:image/jpeg;base64,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UZ90Phl1EwYurKzuAqZ08s+CwIyPzr/r3fJ4y1PzzPVnws26xG2+2lJUAK6AzVW222222ywefyBFKgcLcjH4232222y22/223+LJmIxUNcMDzMbHMBs1kkklV7qHRZz6gJh8inbo5KJirR/0BfFU0txPG/rSdSxP/mlLC/jbHneAtk3bHm26GqsWS+VFeY2222222/cFVJ0MY9PVNA3G28W222222+WyG221JzUifQrpFe4Hi8llkkkhlLVji0JalFrS5KvAJk10CijKFDPK98hNkP5tBpP1nVroXGyGUHq+SeIjFW2wMgSyLBLD2322222225T97ymU/LUiQHG225222+222yW2w0iD10UV4tnNnWNft4Okkkkg5NmydH73Yj31DWFynOv88WTNvFHN33LNhHqeQSh3ACod4dSIUkK81WCmjW2526PH48hiG2+22222273VpHD2d+VWWr222I222yW22y+f3/SONcqMJ5lKCFON4MkkkkkkhB0l6HYV6vP8ikZGFYPzpz2OXQCWR1oG+L7k19K5HrlJ1F420gGVEhguZW2sG6qG29M722623G2222BzZib0hQn4KyW23G2222m220WW23zBeqEL6rwBUD5mAEkkkkrmkA324FGrUCEWveiY0keu1H7i5pACO+jQvsKwdz+Ks7RBFyfeXSZ8VLUfrW3VeU7Q4M3iG28W+22227NUMAB+v9jkL22222222fQ3m2n/AJ9vnkeUf4MmREIoC+TKRNJJDvCYHJuIGRz9CBELbkR36EyZyDpK8kb/AGLQDIWe9tnbXeO7NGasu4M4qHctbbcJJqsb6PCbbhbjbbbfC0k8YBC2lC6lbbbbbbbaZ7tbZcc7x3Awww4xfcdzChmgpATGqSKautSXejEzrSwQZ2RAg/O2W0PV+hPKL8jmg4m3GSnaWg7wemoNnOfiH0NtbbbcvIfg/wBJ22x222223KXAcH82825YWW2232bW2TCSWWg82+8uFN1L9rhYlteDMkRJYAQCAsPJhymLZJdN0EHpgEtCFPU65cv5sNdD1FcYA7zM3ySfKPSENEXmTGdKLW231MTW+/8ApS1vxttptt9nFKMvtttuk/DNtvjMFt22C+8xcx+DTcTl90mICaSn/TJIBLbgQ3sUm5eJzcB0or7gDKcUlyq5pSQXwhNW1STshTkrrfUldFY9aK6l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" }, { "uri" : "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCAgACAADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD4yooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigApRSU4dKAG0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAPxzWp4g0TU9BngtdWt/s889vHcpEzAuqONylgD8pIIODg4IOOa6v4XaTp1nbXfjzxHEX0nSZFjtrfHF9eEEpDnptAG5z2GB/EK5DxDq2o67rN3rGsXcl3fXcplnmfq7H9AOwA4AwBwMUjNVHKbS2W/r2+XX1RmUUUUzQKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAfmgitbww2qNqq2WjWn2u8v0azSDyRK0nmDbhQQfmOeCORX15p/wCyloJ+GC6XqV55Hi3aZm1CNyYUkI4hKngxjgEgA5yR6UkrmFXEwpW5up8V8Uciul8feC/EXgfWH0jxHp01ncLyhIzHKv8AeRhwQfb8cHiuaNM2jJSV4sSiiigYUUUUAFFFFABRRRQAUUUUAFFFFADh61veCPDt74p8R22kWfymTLzTEZWCJQWeRv8AZVQT+GOpFYioWYKqkknAA6mvR/EwXwB4QPhWB5I/EmtRpNrjqQDaW4y0dn65OVd+R0Qc4NIyqzatGO72/wA/l+dkZHxN8RWWpXVnoOgGZPDuixtb2AlPzTMzFpJ2A43OxJ9lCjtXF9qd6fL+tNNBcIKCshKKKKZQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBasLy5sbyG8sriS3uIXDxSxsVZGByCCOQQa+yPgJ+0XZeKVsPCHjaQWOskLFbak3MN44GFEmfuOTgZ5BPoSAfi6lBIOQSDQm07owxGGp4iDhNbn6W/E/wN4c8X+CbzTvG7eVZ2qG4W83ASWQRSTIrkcDGSQRgjjFfnFr8GnW2tXtvpN7JfWEczLb3DxeW0qA8MVycEjtmuw1f4uePdT8BL4Hv9bmuNKSRTlyfOZAOImfOTGDg4PcDnHFT6FfeH/GmmWXhrX5NK8O6nZQeVp2sLAIopgMYhutoA9cSkZB+9kHNOU+Z3scuFw8sHDlu2l5307+fy6d7Hm4waO9bPi3w7q3hbWZdI1q0a2uo8HBIZXUjKurDIZSOQQSDWN1FSegmpK6EooopjCiiigAooooAKKKKAF60GgdK6n4ceF/+Ek1iQ3kj2ujafEbvVbxcfuLdeuM8F2OEUc5ZgMUEykoq7N34e2UHhXQ3+I2sWjzPHKYNAtmwFuLvB/fNnJMcXDcDl9gzjNcJqV9dalfT319M891cOZJpXOWdickmt74i+Kn8U60k0NsLHS7OIW2m2SsSttAv3Vz3J6k9yTXMHikZ0oO7nLd/gui/z8/kMooopmwUUUUAFFFFABRRRQAUUUUAFFFFAC9aDR711vw08L23iPVp5NVu2sNE06E3OpXSjLJEP4E4IMjnhQep9gaCZzUFzMg1bww+l+ENK12+uxFc6o7ta2RjO4wKdvnFs8AtkAY5wT0rmsV0Xj/xLc+K/E1zq80YhhciO0tV+5aQLxHEgAAAVQB05xnqTXOUhU+blvLf+tPkJRRRTLCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD0Dwd4z0ptGTwp44019T0RSfsl1CcXmmE5JMLHgoW5MZ4PJGDWX458Fap4Y+z3jFL/Rb75tP1W3+a3uV54BH3XGOUOGBByK5X3rq/A3jG48PifTL2H+0/D18y/wBo6XK5CTgHhlP8EgHRxyPccUjFwcG5Q+a7+nZ/g+vc5XHPSkru/GvhHS/sZ8R+Bbu71fw/tBuUljxc6YxPEdwBkAHs4+U4IzkEVwn4UGkJqSuhtFFFMoKKKKACiiigDR0PTL/V9WtNL0y3e5vLuVYYIkHLuxwAPzrtPiHqdhoukR/D/wAPyRy21tKJdWvopC6392Bg7SOPKQkhQOvU5JGLVuq/Dbwn9pkWH/hL9dtSIF37n0yykXG/A+7NKrcc5VDngmvMmx0Hakc6/fSUui283380unS+vYbRRRTOgKKKKACiiigAooooAdSV0ei+ENb1jw5qOu6ZbpdWunEfa0jkUyxof+Whjzu2DoWAwO9c6c9qRKnGTaT23G0UUUygooooAsWltPd3UVpbRNLPM4SNF5LMTgAe5Nd/8RrqPwtodv8ADnTLqKVoXFzr88SjE14ekO7qUhXC44G8ucdKd4EMfgrwzL48uTENXuy9n4egdNzI4A827IPACBgqk5yzEgfIa89uJpZ55J5pGklkYs7scliTkknvSMLe0nrsvxf+S/P0IKKKKZuFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAb/gvxXrfhDWBqmhXrW0xTZKpG6OeM9Y5FPDoe6kEVb0zRtU8batqt1o9nYQzpG959ghdULrnLJBGTl8DJ2rkgA+lcsCO9WLK5uLK7hu7SZ4LiCQSRSI2GRwQQQR0IIzmlYhx15luQspViGyCKAOOleotfaT8VcQX0em6H4zP+rvciC11Y/wB2QcLHMez8BicHBINcBr+jaroGqXGla1YXGn31u22WCdNrKe34Ecgjgg5FAqdS75ZKz7fqu6/p2MqiiimaDhwR7V3/AMPdJ03StJm8e+I4La5sbV2i03TpskajdAcBgMZhQkFzkZHAOTXAHriui8ZeKb7xLLZCeK3tLTT7VLazs7dSsUKADJAJySzZYkkkkmkZ1FKVorbq/Lt8/wArmbr+rahrusXer6rctdX15M008rADczHJOAAAPQAAAYAAAArOzQetHWmWlbQSiiigYUUUUAFFFFABRRRQB6x4DvbLxEbC30W507wh4v063ENpOreXbawBx5c2TtWUjAyflfJBGSDU3iPwtZ+LtQuLTRfDz+G/G1oWOoaAzbYrnA5a23cq/wDEYskEHKk4xXkn059a9J8L+MNG1mxs9E8bie3uLQBNL8R2hIurEZ+VJMf62IHoD8yj7pA4pHHVpSg+eD1Xz+TXVeW66PoeeXVtPaXMlvdQyQTRNtkjkUqykcYIPINQEYPNe0eKtK/ti5j0nx9J9g8UzxhtJ8QrhrPWIjjZ5rKMHjAEoyeQHHGa8r8R6Fq3h7U5dL1rT5rG9iPzRyjBx6jsQexHB7UG1Ksp+69H27+a7r8Vs0mZeOK6r4b+GofEWtudTufsWi6fEbvVLs/8soFIBA9XYlUUd2Ydq52xtbi8u4bS0hee4ncRxRoMs7E4AHqTmu/+Il5beFtAj+HWjXsN0yS+frt3AMLc3I4WEN1aOLnB6EknHAoCrJ6Qju/wXV/5eZz3xD8Uz+K9d+2GGO1sreMW1haRrhLa3X7iAfiST3JJrmO1HFHWmaRioRUY9BKKKKCgooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAd/OvRvDfizQtf0yLw78RPtTJBGItN1yEGS4sFHRHXrLCCc7c5Xnb1xXnWOeBSZ/OkTOCktTf8X+FtX8L3UUWpW/+j3KebZ3kfzQXcR6SROOGU8e46EAggYAHTjOa7bwT44fTdO/4RfxFHLqvhO4mD3FlkGS3OeZbdj9yQZJ4IDdDwc1yN79m+1S/Y/M+zbz5Xm43bc8ZxxnGM4pCg5Xakvn3/4JVoooqiwooooAKKKKACiiigAooooAKKKKACiiigDtvBnjBLPTz4X8Tpcap4VmkEj2iviS1k5/fW5OdkgycjowJBBBru9cW2l0e1sfEmoXfiDwJI3laP4nit91zpjnBEUo6kDOGiY9OUI4B8Q5HI4r1H4EXV9p02r6nfapJZ+Ebe3B1u3aISx3yHIW3CH5TI54DHBXk5GKmxyYinFLn7fffuuz/B7NdS9NocHwj05/ELavY6jr2oREeHJbXLLFA2Q19zgq2MqgIyG+YfdBryN2Lks2ST1JPNbfjfxLe+Kdfn1i+WOISAJBbxLiO2iUYSJAOiqoAA9vWsI4IHpQa0ISirz1k9/8vl+d2MoooqjYKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA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ZlI+5IOocDI9xkVpeKvBtvc6dN4q8D/a9Q8PIdtxHIoNzprY+7MBnK+kg4OMHB4rhRgjkc1seFvEeseF9WTU9EvpbS4UbWK/dkU9UdTwynuCCKRjOm03OG/4P18/Pf1Rn2N3dafeQXtlcS211C4eOWJyrowPBBHQ16NHe+H/AIk2jDXb8aR43JOy/kT/AEXVeBtWXH+qmPQPjaeMkHmkk0Hwj45j/tPQ9b0zwvqrHN7pWpyNHbkk/ftpQD8v+wwBGeCQM1XX4XPnB8e+BRubaG/tlTg5A5AG7v6djSuRKcJrVuLX3r9Gn9z/ACh+G+j6lZfEU+E9WtZrGfUYZ9MuIJ02kNJGQhIOOA/luOcHaOcVwdxG8UrJIpV1JDA9QRwRX0h4NEck+jweNvHvgu9TR7iKfTNVi1IPd2hRgRE4YKZISAQQclc5B4xXLeLPBGm6Z448QeNtdNvdeDRdvd6abe5BXWDIxMcMTAk4zy56oFIOCRQZxxFpvm7La9m7u1rpatdOnexzvhe2i8AaBB4z1SBX1+/Rv+EdtXI/cryrXsi88DOIwRgsC3ROfPr25uby7mu7yeSe4mcvLJI2WdjySSepNafi/wAQ6h4o1241fUXXzZiAkacJCijCxoOygYAH9c1iY7ZpnRSg170t3v5dkvJfi7sbRRRTNQooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAHDn6V6T4Z0jTvBWlWnjPxXaRXV9coZdD0WdDifqFuJhxiEHkKf8AWEY+7k1F4T0DTfDuiReNfGdmLmGTnR9Idtrag4P+skHUW47njecAcEmuR8Ua7qviTWrnWdau5Lu9uWzI7/wjsqjoFA4AGAAAB0pGEm6rcYv3Vu+/kv1fyXW0Ov6tf65q91q2q3L3N7dymWaV+rseT9B6AcAcDis6ig+9BskkrISiiimMKKKKACiiigAooooAKKKKACiiigBe9HFHatvwd4d1HxTrtvo+mRhpZTl3P3IYxy8jnoqKASSewpCk1FXbLnw+8Lt4k1Kb7XeJpuj2Mf2jU79xlbeHIHA/idiQqr1JI7ZIm+IviweI7y2tNPthYaDpkZg0yyU8RoTku3rI5GWPc4HQCtD4h+JNPXTofBXhOeb/AIR+yffNMw2tqVx/FM4H8IxhFJOBk9Sa4Ogxpxc2qkvku3n6v8FpvcbRRRTNwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAHH26V2Pw+g8MW8V74h8TTpcx6eUFrpCk77+ZgxUMQRthXblyDnBAHJBrjjmk/GkTOPMrGz4r8Q6n4n1eTVdWnEs74VVRQkcSDhURRgKgHAAGAKxulHSjrTGkkrISiiigYUUUUAFFFFABRRRQAUUUUAWbGKOe7iimuFt43YK0rKSEB7kDmu58S+E9Pl0+0vNGuYWuJ3htbeCJTtvHPylkLHIOcEg9Nw6VwAHPPNdH4H1XQLC9lh8T6LJqunXMRhLQzmO4tMkHzYTyu4Y6MCCMg4zmkYVoTupRb06K2v9f8NqZGr6bf6TqM+m6nZz2d5A2yaCZCjo3oQeRVPsK9v1/TdNv9Gtj411C4vtKuAE0LxjbJ5nlKM/6NdoPm4445ZTnG4HjyzxV4Y1jw5qaWGo2xDTKHtZY/niuozjbJEw4dTkYI+hAIICCjXVTyf4P09Oqeq6ozdJsLzVNRt9OsLeS5urmQRQxIPmdycAD8a7/xpd2XgnQpfA2hXMU2p3O0+ItSgc/OwORZxkYHlKcFyM7nA6BMGWQxfC3R3gjkgm8a6jAFlOwk6LA6kMgJOBO4YZIGUXgHLHHmJJJz1zTEr1pc32Vt5vv6Lp3eu1hlFFFM6AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA9L0DQ9N8R+EPI02zjW4gkQSuuDOrk4yScFt5IVVA2KASSCTnjfEugap4ev2s9UtWgkBIBxlXx1KnoRnjIqnpt/d6bdpd2M8kE6dHQ4PIwR9MZrq7u917x9ObHTNKiluI42vLiOBVM1zIFHmSgkbmJAJ2DOOcDAACORRqUqjd04avXdfPscSfegqc8iu/13wTZX3h+TxP4Pvje21uudS0yX5bzTjnBLL1eLP8AGBxnnBzXAgj1wO1B0U5xmroZRRRTLCiiigDqfA/i688M3E0L28ep6NeYW/0u4Y+Tcr+HKuOoccggdRkH17WNfsfhx4Pt5tNub67l1WMXXh7R9ZgV5NBYkhrndzkkE+XgAHO4jIGfPPBekaf4c0eLx14otorlC5XRdJmB/wCJhKMZlcAgiBCck/xEBeRmuP8AEWr6hr2r3Or6rcNcXly++R2P5ADsAMAAcAClfoccqUatW8dlv5tbfd1fy11tVvrq5vrya8vLiW4uJnLyyyMWd2JySSeST61Vop1M7BtFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQApq3pd/eaZfwX+n3U1pd27iSKaJirow6EEcg1U60YoE1c9g0DxFD411a21JtUsPDPjy0YNb37II7XVCP4ZiBtSUjI3EbHBw2OpZ4h8MQ+NtVu7XStCt/DXjWzBN9oe8JFfMOrWwJwHxgmMHBBBXIzXkZ4HWvR9E8Y6Xruj2/h/xvEwkt12aZr8AP2mxOflWTH+thBxx95RnBPApX7nFUoSpPmp7L716LqvLddH0PP7y3ntLmW0uoHgnicpJHIuGRgcEEHkEdMGoc85xXtXivR4b37PpHxEKadr00eNK8VQyedZ6oo4Xz3GcjoPN6gEbwAM15T4l0PVfDuqSaZrVhPY3cfJSVcbgejKehU9QRwR0JoN6NdVF5/g/Nd1+K6pGWfWu78CeGdOi00+M/GCzL4et5NttbIQsmqzg/6mMnogxl3AOBgDkgiv8AD3wrZajb3HiXxLdGw8Nae4WdxkS3cpBIt4R3cgAk9FBBPUA5/j7xVc+LNXS6a2gsLK2iFvYWEAxFaQDoi+pySSTySSe+KAlJzlyR0tu+3kvP8l52IfG3ibUfFmtyarqLqCVEcMKDEdvEPuxIOgUDgD6k8k1gdqOKOtM1jFQSjFaISiiigoKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAOz8FeL4NPt/7C8UWU2teGpSS9n5xSS2cjHnQNzscemMMOCOhHpdjYWmoeGp7fXNY/t34aWMZmsdXcql/p7jpaIrHO8nAMfKEYYEcCvL/APhB/EUtzfX16uk6Dp6eZqGpSIWSIdkUDl5GPCqOSSOg5pfH3iyLW/s2k6PZDS/DunbksLFTljk8yyn+OVupPQdBgAClfQ4qtJTqWg7Pd9l5rtL06bp6EfxA8Wy+JLu2trWFrDQ9NTydM04PlLdOMk8DdI5G53IySfQADlaB60UHXCCgrISiiimUFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAD+MZPWup8A+D7jxNcXN1cXUemaJYKJdS1KYfJbpnoBxvkPRUHJJA4GSE8A+EZ/Et1NcXNwNN0OwTzdS1ORSY7ZADgAfxSMRhUHJJHQZIs+P/ABdDrEFv4f0CzXTfDGnsTaW5UCSdsYM87D70rDrzgA4AAySjGc3J8kN+r7f8Hsvm/NfiB4wi1mO20HQbeXTPDGncWdmzAtK/8U8xGN0rHJJ6AHAwBzxhHNKCfrQcdqDSFONOPLEZRRRTKCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigB/Jrq/h94RbxHPcXt/eJpOg6eA+o6lKpKQqTwigffkbnag5OCegJGBpC2D6jbrqs08VmXHnvAgaQJ32gkAn0ya6Px74xGuW9roukWbaT4c08k2dgH3FnPBmlYAb5T3OOBwMAUjKo5t8sdO77end/lu+w/x74wj1i2ttA0Gz/snwzYMTbWgcs8znAM8x/jkOB7AcDuTxp6nmjk55pCc+9BcIKCshKMCjrWkNG1NtK/tUWU32Lfs87b8uenHqM8Z6Z4pjbS3MyiiigYUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA45yea9F+GvjuPS57HS9ZhifT4mREmVFEkQ84SHJIOVyWyBg4Y89q86Io5yOKEzKtRhWg4TWhu+M10pdXxpLIYwg84xsWj8zJzsJAJGMckDnOABgDBpaQUi4R5YpCUUUUygooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAFFFGK7HwJ4CvvFenXl7bXkFutu2xQ6kl3xnHHQYxzz16UpSUVdibSONop8qNHI0bfeUkH6g0ymMKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKv6bq+p6dHNHYahc2qTDbKsUhXePfFUKKLAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRTtp2FvQgfz/wptABRRRQAU9FJUsO1NNXdNjLrICPlIHJ6A5FTJ2VxN2RSzS0+aGSI4dSM9D2NRCqTuMU0qKWOACSewptaNjGqIZ5AOP0/wD1/wCetTKXKrik7IzyKSnyO0jl25JOTTKoYUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUuKAEpTQBzzVmKAbWaTKgf5/yKTdhN2GFCttkjqwx9MGltI1ll8tuNwIU+h/r6Uk8wc4UbUHQVGjMjBlOCDkH0pK9mGth00TxOVcEc8e9M79a1LfUY2BjuolZT3A4J9SP6jBqzHZWJlilUkwnrz8oIGTnv74/Cs3VcNJIhz5d0UtN057kq7gpESeT3x1x7DjNSXl6kSiC0G0KTlhz+X6896bqmpGf9zANkIPOOC3pn2HYVm55ojBzfNP7v8wUW9X9xp2+pgjZdxh1PBIHJHuOh+vB96f9itblC1tKFb+71/Q8/wCe9ZHenKWU5XrTdKzvF2G4W2di7HYOZmSRlAQZOOSR7f8A16bezqYhDF0zliP89P8AAU4yyywNI0h3FNpyeSARx+R/SqHWnFOTvLoCu3d9BKKKK0LCiiigB1FFFADaKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAClBIOR1pKKALCyAr1wR0Pbr+lMnlLueoXPC56U1MZ5z0P544of7xx07UrK4rK4yiiimMX3rV0IFllTAIyM5HY5Gf1FZXatPw+xW5cL1KcD6EH+lZV/gZnVV4szXG1iDSGrOpJsvJV9HNVu1aJ3SZad1cSiiimMv2SiSArkg5IHpyDj9QPzqifvVo6XGXR2ZCUVlJPpz0z9M/lVW8t5baYpIpBzwSODWcWuZozi1zNFeiiitDQKUU+KNpDhRT5VVFCZyQeeKTavYVyKinALnluP1pGOT7UxjKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKU47ZpKACiiigCSIgSLuGRnkUsw5BHcf/Wq7Y2o4nnbagIIB4z05PtU0ElhODFPhTuOGIwOfcdBnnkGsnUSeiuZuWtzIoFbFxokgy9tIJF6gHg4/kazJYJon2SRurehGKqFSM/hZSmpbEdb3hvTZ5XNywZIwpxxy3B6CpND0QEfatQ+SMDcFJxnr1PYcH3puua6ZlFtZ5jiUY3Dgkew7D29zXNUquq3TpfN9F/mZTk5vlj95Y1LQpLrbc20ilnXJUkYJHBwRwRkGueu7S4tX2TxMp9x1qSw1K7snDQykAHO3sfwrdt/EVvPGItQtwQSOQMj64/woXt6PTmX4iXtIabo5bmtXSdIlu/3r5SAHk9z7D/GtyHSNMmK3ULFourDdwOMnJ6jvWXrOsmbdb2g2Q55I4JH9B04o+sSrPlpK3dvp/wAEftHPSKJNUv4LVDaWKocdWHIHTp6n39zUMOsJIojvIgy4wSoH5kH/AOtWJzRzWqw0FGz18+pfso2sbMljaXKh7SUKT1Gc8/TqKrJps3mfvAFQdSDnPsP88d6oqxU5BxWqJpZ9KdmJLD5d3cgEcGiSnTVr3W2u6E+aPXQqzzoiiODt/F/X6+/5VSzQaMVsopGiVhKKKKYwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigApyAE4Jx6dqbRQBKIieV5GcVZgjjhxJN94H7v+e/+FV7ZiJV7gnBHqKW7J83B7KMfkKhpt2Jd27Drq5ebgnC5zj39arjrRig1SSWiGkkWrK9uLR90LkDrt7flXS6FqKajIsE8KiRRlTgEY+h6dT0rkOprW8LPs1VBz82Rx9K58VSjKm5W1sZVYJpu2o/xLfzz3j25JSONioXPXB6n3rG7ZrW8VxmPWZ8jG5t35jP9aye2K0oW9nHl2sVSSUVYSiiitTQ6jwawe3u4Ceqgj26j+tc5cLtmZfQ1t+DHC30iHo8ZB/Dn+lZmsx+VqUy4/iNctPTETXdJmEdKjRSooorqNxTWrpId7O4jXkYJxj2P+H6Vld63NEtpY1aR/lDgEA98HOf8+tY12owuZ1HZGHmjrWhd6bLGSY8SDPQdf8/SqBBBweK0jNSV0XGSaugptOqRYyQGbgH/ADmm3YdxmPlpKUtycAAelJTAbRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFADgSGBHUVa1AHepI6g/zNVkVnbCgk1pzWjzQIAwDL0z0PAHXt079aznJRauRKSTVzKzSVPPbSw/6yMqM9e1QVaaexSdx3b3q9om4alCUBOHHSoLK0mu5xFCpYnr7V00KWehWolkIlnbIGDzx6eg7Z6kHtWFeqorkSu3sjKrNJcvVkHjSzlNylzGhaPYAWHQEcYPp0rmSCDz1rp4PFMnmnz4I2Q/3eCB/I/iOas/ZdG1UMYWEUmMgYwR26dD+Fc9KrOhBRqx07rX7zOE3TSUlocdUkMUkzhI1LMTwBWzd+HLqKUCMrKhPBXg49TnpWrFFZaDbiR23zsOw5zz09B05781vPFQt7mrey/rYt1lb3dWRaRYRaTGLy7kCuQeP7vHT3P6c0TLpOrOdrlJT0zwT9R0P4flXP6pqE99NvkOFHCqOgHoKpglTkHBqFhpy9+UrS8vyJVJv3m9TYvtBu4AWi2zL/ALPX8qyvLkEnl7DvzjGOav2WsXlvhSwkjBHyv/Q9R+Fakd7FdMLlIwJACG4G4nBPX3IPOM1ftKtNWkk13/zKcpw+JXKttYQ2URuLwruGML6H6dz046daoalfvdttGUiHRc/zqPULyW8mLyHAB+VR0A9BVUVdOm7809X+XoXGL3luWYLyeHgNuXurcg1ZN1bXBUTptYdW6/r1/PNZpoq5U4t3KcUy8IYo2LkllAz0BA7Aj157ce9VZpS/HRc8CrUflvZE5O8KwAHfBByfwJ/KqJoitdRR3EoooqywooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAFFPVCwz27k9KFPY5wamlVoB5eVJOckdsEj+n60mxNj3kEG5EGW6c449f8A9VVvNcPvDnd655pnWjFCikCSRqWeqMmEuEEi4wSOpH8j+NWfsmn3sRkgbYwPIA5x/uk/XofyrDqzppVbyMMcKx2njoDx/Wsp0kryi7MzlCybjozda9g0m2jS2QNMRu5AOe4Lfzwex5rnbmeS4lMkrFmPcmrOrLiVGz95B+eMH9RVGijTjFc3V9QpRSV+rACno7owZGII6EUzNHWtjWx0mh6jPOpgnPmqg3Dd1GDzg/QmsvW5JJL6QyMWIYgZ9Kf4ddlv1AOC2QPxBpPECgXzsBgNzj6jNcsYqNd2XQ5lFKqZlFFFdR0iitPRiDuUtt5U59OcZ/WsztV3SjiSRfVDj8Of6VnVV4szqq8WVZVKSsp4IOKYelWdRXbeSYOQTkH2PNVh0q07q5cXdCUUUUxmhYmNoGSQHO75TjgZUjn8Qv61Q/irR05WiBd4twO0qOnQ5/IjI/Gq8ttIGJUbhk49azUkpMhNJsq0UUVoWFFKBxntQetACUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAL3qzcxssStuLZOT7ZAP68j8DVbvVpkQ2u4OC2AxX05I/wP40nuJ7lSiiimMXtT4XKSqwGcHOKZUltBJcSrHEpZieAKTtbUTL+tKgCsmdoZhz9cj9CKzMV0Vzpz3MWAVVhggnoSQM/TkZyeDmsa9sbi1YrLGwweuOKxoVItct9TKlNWs3qVulGaDU9pbS3MqxxIWZjgAVs2krs1bSJdLZhexkA/eFaPiO3l3rLtJAG0sOhIOP5Yq9BBaaPbmWZlaY42kde/TP4c+oqtb+IfnYS26iMk8JxgH2Oc1xOpOpP2lON0tPX0OZtylzRWxzpBU8iiuomtdM1FC9u4R+uBweuOR/UEj2FZ1xoV4km2NRKPVew9SOoHv0reOJg9JaPzNI1ovfRmUiM7bVBJNbtjp6WsP2i8fbngjH3Qf5nBOB7VLBBbaTEs0x3ykH/Dj9RnsRWPqGoTXbjecKOijoKlylWdo6R7/wCQm3U0WxpCGwv0+RysoHHY8eueD+H5VQu9MuIOUHmrjOV6j61RyQeKu22pXEG0bt6g8BucfT0quScPhd12ZXLKOzuUsHOK0Le0SJfOuccDIU/p9e/HtzVyCeGZHmEI3LycjJAwT19+ecVk3U8k75Y8DoPSmpSm7Wt3BNy02H3ly03AyFH6+5qKKd0GAcqex6VEKDzWqikrGiikrFlpY5WzICDjk5ySf8+v50woAoJOe+COCPr9eKhFSrnyjzwP/rUrW2Fa2wx2yTjpnv1NMooqigooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoopwUkjPQ0ACqScCrAMaDaW46cDqM5z/Lj/JhLYGFJxnNMzSauJq5cazDAGFweO5498f8A18Gq8kUkZw6lfqKbFI8bbkYqfar0F+v3J1yhPJAH8jwf0qffj5k+8vMr2drJcuVQcDkk9AK12nt9LiCQgPMy/Nz1z6+g6HHqOajv7r7KgSCNYy4PQEBR0yO+ff2FYrMzHJOT3rJJ1tZaLsSlz6vYsfbbnzjMJXD9Mg9vT6Vq2uvsQVu494YYJXH8ulYJo4rSdGE1ZoqVOMlZo6RrHTr7DwSCNjnIHQc9weR+BIp881rpFs0Ma75Wx94YJGO/oOeg79aw9Kl8u+ibPG4Zq74oBF8j5B3IDkfTH9K5nTftFCTbW/3GLg+ZRb0M68upbqVpZnLMTkk1AKMUCu1JJWR0JJDldlbKkg10Hh2+lmka3mbcAhK56jA9fTGfzrnu1WNPuntJxMihjgjB6dMf1rKtTVSDVtehFSHNF23JNYd2vZN5JIYjmqQ6VLdStPM0r4DMcnAqI9KuCtFIqKsrCUUUVRRf025SDeJOQQO3fP8AhkfjVI/ezSc0YpcqTb7kqKTbEoooplBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFO429abS9qAEooooAKKKKAL+o3KTxxAfeUc8Y7D+oJ/GqIoxSVMYqKshRikrIKKKKoYoJHenO7ucuxY+5zTKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAFA/KnAZOBQMY5qQFUHBBP+f0qWyWxDGoHJqM4zx0pWYnrTTTSfUaT6gaBSqCeAMmpLiF4GCyDBIzj05p31C5DRRRQMKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBaVEZ2CqMk9KQCtywtlhTezDdgEseij/PSoqVFBXJnJRQWVotum98bwMliOFH+PoKzdSnSafMYwqjAJ6nnOf1qXUb3zv3cWRGD+Z9TVDrUU4S+OW5MIu92JRRRWxoFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF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g47CtbV/CPhLSI0fT/CmmYbTJ7tTMrSnzIhE5HzE8FHYYrGf4gW9xPdpHoGszyRSK06CMZXfaGJgRknkgH6DnFZer/FI/Z7G1bQJ1ltbZ7eT7RLt3B4BE3AGRyAfwxXP9Rxsldp282/811Of35O17/Py9Tv76OHT4dVj06xsLVrdtQSIwWqKR5axzRHIGchCR7g1xPx7u9Q/4Rq+aG+uEWy8TSIvlyFcQzQLIi8Y4ByAO1c3e/FXxBL5pt9M0xRKSWLF3JJgELdx1AB+oFVb3xRdeIPAXie11kE6nNdWU9qIIDsdYlKNkjIBCAEk9adLA1aM1UlFbrz6/Pua06XK02l0POZWeQN5kkkhIOS7kk/ma9K+No+3eF/hxr2wf6VoAtWbHVonK/yNebEMM5BH1FTT315Pa21nPeTTW1oCLeJ3JSEE5IUdsnrivU6p9juIMsCCpww5B9D2P507xmiSXVvqsS4TUIRIwHRZAAHH5jP40RANKgbdtZgDtAJweOAeM1veJNGEOl3GlxStObZRfQuyhTsOVlAx9EP4GkpqM4/1p/w9hKSjNf1p/wAPYybBh4i0b+z2wdUsULWrEnM8Q5MXuRyR7ZHYVzFT2dxPa3UdxbSNFNGwZHXqpHQit3xLbwX9qviOyjVEmfZeRDpDMR1A/ut1HocjtXQn7OVuj28n29H+fqbpckvJ/g+3z6edzmaKKK2NR3GfUUq8EE/yzQME+lbd74cvorf7XZSRanaKOZrRi4QZ/jU4ZP8AgQAPbNNRctiZTjHdmIzckjIB9TUkVxInAOR71CRSVLSY7I0Vezn4ceUf73X+X+FWFs7a3jNw7F1XBHHBJ7e//wBasg9a1WXzdDDDOUPP5/8A16xqR5bWbs2ZyVrWZUv717puflQdFH8z71UooraMVFWRoklohKKKKYwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAHr14o56Vq6Rod7qSm4XZb2aHEt1MdsUfsT3PsMk9gak1KXRLe0ay06J72Yn576bKA4PSNB0HuxJPoOlXyaXen9dP6sZ+0XNyrV/l/Xbcw6KKKg0CiilAoAefl4z071u+DII/t8up3ABttOj+0yBhkMwOEQ/Vyo+mawh94YHPpXcReHtbk8IQ2mm6ZdTfaB9uvp0Q+XFGMiMO3QADcxyR1FRUTl7kVq9P8zKtNRjZu19P8zlJFvtTmurzy5bhi3mTyKhIGT1PpzXYHQZ7uxs0SWOBLGwWSTeCWLOWcgAd8YH5UzwYtp4d1hLi91WK4inU291Z2yeb50TYBQnIAPQjBOCBXpY0+ztvE82l20QVbqNDbXFxJvE6AYXABUAggqQMnKkHpW7wkqvKotJ9vuS0XldeTPOxmM9m7RWiV07fJ7228lseV6do9xeMBbW890cZPlISB9SBx+JrXh8N/ZwWvLuysSeSm8SSH8Ezj8SK7Dxdp7G2b+yr1rqC1QtcxpICFGfv7VwABkDHJ55rkPYV0yw0KLs1d/h+H+ZywxMq8bp2Xbr+O33FmKDRIcBbe4vnJALTsUT8FUgn8TW9401bUjqKML1wJIUBePAYgDAUuOTgADkmuYoqHfmUk7Wvsu/nv8AiDpptN6+uv8AwPwK1tJIuqXjeY+5gjE7jknHr361rJq2oqnl/bpnjHRJSHUfQNkD8Kx4zjVph/egB/IgVbopyaTs+r/M0nFO110Rckvo5hi50zT5z/e8nY35qQfyxVzS9Q0e0hu4jpVxH9pQKfJuMge4DDPfpurHpRkkAdTwM05WmrSSa9EZ+zVrK6+b/wAy9b+F4tQtnuNOuLx44jiQy2u4KcdCVPH5Giw8CXV5qlvYmeyCykGVhJsaOMcs+xwpIABPAOcV2WkmbSbyHTLS0eKSIiO4aWHcpfPzOJQQoX0JOABmuc8QamkGjalqqJ5U+uSva2yFQDHbAgyEgADJyiZxz8/cGumrRowgpSV2t+39XsjnpV685uMXo9tm9fu6Xf3HI+INKvP7Wurqx0a4tbIzFrdEBcImflBIzzjHJrP0y+ltdTguLmR2RTslDkn92eGH5EnHtW14I0i+17xJp2iWEksUl3MELISAi9WcgdgoJP0r6i+K0Xhfw54Gub2/0LTb9rWBba0+1W6u7uRtQFsZJ7kg9ATXnxwUa8ZTvZa72fra1jtqYr2UlTavddNH2W99z4m1ywfTdUuLJzu8pyFPZl6gj6gg/jVnwzqcenXTx3SGWxuk8m6iHUp6j/aBwQfUY6E11WuXdpeaVaX9zo1ncupNtOyl42BXBUjB6FT+lYZh8NzKSbXUbJ/VJVmUfgQpH5ms401Up2bv0e61X9XR6Ea/NG04v8P87+ZjatbQ2t/NBBdJdRK3ySp0ZeoPscdR2qlXRto2kS/Nb67Gh7JcW7p+ozTZPC+oPzZSWd8Ov7i5Qsf+AEhv0q/ZTVlb+vkaRr07au3roc/jvVqwvbmxnW4s7mW3mX7rxsVYfiKsXeh6vaqWn026iUDJJjOAPc1m+1S04vU1UozWjTR0a65Yajtj1/S0lbB/0q0xDN9SANjduoHHekPhtr1RLoN7Fqq4LGFV8u4QD1jJ5+qFgB1xXPA4PFOV2R1dSVYHIIPIrT2ifxK/5/8ABM/ZcvwO3l0+7p8hZY5IpDHKjIw6hhgj61raePM0WdCcgbsDOPQ/0qzH4lmuI1ttbs4tXhHAaUlZgPaQfN785/LitWLS7NdFl1HS7iXyGnSCaG4wHhZ0YjDDhwQh5wCOAR3rDEQvG8Nba+em/wDX4GdSq0rSVnfS2q/zXzXzOG4o4rZudAuUBaBhMoHbg/lWVNDLE22RGUjsRShUhP4Xc6FNPYjo606GNpXCICxPAxXR6b4b8xQ127J/sggH261NWtCkryYpzUdzms0Yq5q9p9jv5rcEMEbgg54IBH44NU81qnzK6KTuJRRRQMKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAHfjR+NH4VuaFosd1Yz6vf3QtdOt5BEzKu6SSQgkIq+pAJycAY604xcnZEykoq7Mqxs7q+uUtrOCSeZzhY413MfoK3jY6ToX/IUlTUb9cEWdvJmJD/ANNJBkE/7KZ7gkHiob/xAVtpNO0S3/s2xkULJtbdLOP9t+pH+yMD2rAx3zWl4x21ffp/Xr9xmlOfxaLt1+/p8vvNPXNYvdUkUXLqkUfEUES7Yoh6Ko4FZo6VPZWd1ez+VaW0txIeQkSFj+QrXi8M3aLu1O5tNNT0nlBk/wC/a5f8xSUZzd7Nlc1OlpovL/gGD2zTkUyOFRSzHoAMmuiit/D1qg/c3WpyjrubyYvyHzn8xUv9uXUKeXYxWmmpjH+jRDf+Ltl/1pqlbd/dqZuvf4V9+n/BKFr4a1WZFmmijsoD/wAtbmQRj8AeT+ANWItM0K25utRmv5B/yztISqfi74P5KarzyyTSF5pHlYnJZ2JP5mmjirSiun3/AOWxm5Tlu/u0/F3/AENWx1e2spojaaRbW6IwZnZRLKRnnDOCAe3Ar7B+F3i3TPiH4JEptYEQqbW+sQvyKcYI2jjaQQR7HHavir3rt/gX47fwP4tiuZpGOl3mIL5B2XPDgeoJJ+hrooVeSWuz08jixeG9rByitV6691/kT+NfAc3g74mxaKymSxeYXFnI3SWDJIBPqMEH3Bqz4R1SfWbeXSxO8epW8sl7pcqnDkklpYQfcDevoVYdXr6M+LvhSLxV4aN9p6pPqNjBJPYSoc+aHQgqD6EEEe496+QbSW4s7iKeF3guLdw6MOGRwcg+xBH6VhWi6FfmS0aX53f3aNfIxpT+tU3d6r/g6/PZ/M74+ILNLo3H2O6aMOXFlJIot85zsYAAsvbBwcDtWDJBLHHE8kTxpKu+MspAcZxkZ6jI611Wm6jayTW3iBFEdjqBMN5CsYdYLoDOCp42uPmH0b0rS8WWI1aU2SSF9TiyZhLGF2OBgoXUBQoAwBjr3rudN1oOSd2tl3v/AJrp6nEqqo1FFqye7vtb/J9fQ4AdKSl/Aj2IwRSVxneVGGNWQ/3rcj8iTVuqk/GqWp9Y3H6E1bqIbv1/yLl09P8AMDzWp4d0gapLMJLj7NDEo3TFcqhJ4yOuOucZI9DWXXoOl6fP4c0qz1ASwWEzjdI90hJDnOAhAyvynGCOueSMV14elzyu1ot/6/4Jx4qs6cUk9Xov61/JnO3Wg3sdzZaWmqJdT3cgjijidmiAPck8YA5OBwAfSud8c6jBf600VmSbCxjFpae6JnLH3ZiznHdz611mt6uIbDUddikkww/szShIQWUkAzOCOoAJweoMie9cDo2nXOq6naaXZRmS4u5lhjUdySAP51hipLm5Idf+GX3u7+42wsXy+0qdF6eb+5WX3nun7JnhTC3/AItuY+WzaWmR+MjD8cD8/WsX9qnxZ/aXiK38M2subbSxvnAPBnYdD/urgexJ9a9n1GfTfhr8OiYgpg0m0CR9jNKeB+LOc+wPtXx1f3dxfXs97dSGS4uJDLK57sTkn8zV4j9zRVJbvf8AX73+Rnhk61Z1Xstv0+5fmWNKUXMV5prcm5j3xcdJU5GPqMj8a54jnB4Na1vNJbTxXERw8Th1+oOcU3xPbLBqjSRDEFyBcQ46bW5x+ByPwrhpu02u+vzW/wCFvuPTi7O3cy6QgHggH2IpaK6TQsWuoXtsALe8uIQOgWQgD8M4q8Nc1CcYuHgvMDH+lW6SHHoGI3D8DWTRSvJKyZLjFu9lc2beGHUNwPhe3lEYy8ltM8YUE4yckjrxzUN5o2ipMIJV1PTpiA2G8udcHocgrgfnUGm6pc2EheLYzEYy4yR9Pf8AlVjUry6v41vbmQO4UIuFGSATySOpz3Pt6Ck5rlV0m/RW/CzJ/eKWj09X+t0Mi0SwVP8AR9cs2YjOJleJiPQZBx2rZsdB1afwLr0EUMd2UuLWSMWsqSnALqThSSPvdwK5U5YksSSeTmui8MDzPCviuH+7bQSj8LhBn8iaqlCDk21q0+r7Pvciu5xine+q3Xmu1u5zXmazpXE8M8Sg/clQgfTmr8GuWlyojv7cY6DAz/PpWna3E914E8QwzTSzCCS2kQSPu25cg4znHB7Vw49Ca5MRhKTaa6q/Z7tfodNNqrzKSs07fgn+p2nl6dplqb+KHcCBt5zyfr0FczqWqXN7OZHcgdlB4H0rclXz/Ci/7IyM98Mc/wA65XnNcWEgm5Slq02rsqjFO7erEYljliST3JpKKK7jpCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAfnt+ddj4Z06+1TwBrlvZ2sk7x31pIAq9AVmBJPQAcfnTPAcUDWevXj28E89rZrLbmVA4Q7wCdpBB4PcGtbSNRvdR8IeKIbu6lmWNLaVULYVcOwOFHAHzDoK66FNaNvdPT5P/ACODFVnrGK2cdX5tdPn3ObTw7bwDOp6vb257xwqZpPyBAH4mrenxaKl1FBZ6U15NK4jWS9m+QZIAPloB692NZagAYAAHoKWN3SRZEdldSGVlOCCDkEHsQanRNWX6/n/kN88k7t/kvw1/E6bxEmqWVlg6kEhLhBb28RjQjBycjjAwOCc8/WuXGOcDr6d6f5jldplcqeSNxIJ9cUlOUuZ3RNODgrPf0sFFFFBYUUUUAFIenTPGKWigD6f/AGT/ABzLqXh+XwxqchaewwLKRm5kiOSY/cqRx7EDtXI/tM+BRoWujxJp8IXT9TcmZVHEU/U/QN1Hvurzfw5qV3oFhpWp6fKYrxL1rmNgcZCAAA+xywP1r6ysLnR/il8PCXCm31GIxzIOTbTj09CDgj2PvWlKSxNOUJbpu3y2/VM8eunh63tYrRvX9f8ANHyt4J1W3s7ybTtRk2aXqSiG5Y8+S2cpOB6q2CfVSw713emald6JaXcV9fqbmyk8iS3nBdFTA2yIFB3A8gknA4PcV5t4n0W98Pa5e6NqEZW4tJDG3GA46hh7EEEfWur8OatPqGimWNwdT0mDy5VYAi6ssjIIPUoccf3QT2owlZ024vRq9v1Xy3Xz8i8ZRjVipLVO1/0fz2fy8yHxDazSXFzfraTRxCQLMWhKKkh5wASSM9eTyc1k9667XfFlje2MlmlpcXHmgeZNMFDEjpjrgDt39+a5D8c1dZQUrxd7k4Z1HC01a35FS94vbFvdx+YFW6q6hxNZN6TAfn/+qrVc0d3/AF0Op7L+upp+HNJn1W5lSAKTBEZiGQsGIIwpABxk+vGAa6OUX+mRyJ5NjPPdRLb2qQyOC8sgwQFyQdgJGSAMkEdMVy2lareaY5ezkWNiQSxUE/nWvFrNwLa98UXiwLLaRi2tPKiCB7hwQCQAASqh3Jx2Azkiu2lOEIaN369rf8N+Njgq06k6mqTj073/AOH/AAuc/wDEC7iOpRaPaSiSz0iP7MjL0lkyTLJ+Lk49go7V6N+yl4VN9rt34ouY8w6ephtiRwZWHJH0Ukf8C9RXjEMUs8yRRK0ksrBVUAksScAD1JJr7B0C0svhj8Mk+1bB/Z1sbi5II/eznkgepLEKPXA9a5sNF1arqPZa/wCX3I6MVJUqSpLd/wBP72eWftYeLftOp2fhK0fMVpi5u8HrKRhFP0Uk/VvavEKs61qV1q+qXeqXrl7m7maaRic8k5wPYdB9KrVzVpupNy6dPQ6qFJUqaj16+oVavE+2eH9wIMmnybcHqYnOR+TZ/OtHwP4Q13xjqg03QrJrhxgyyniOAHu7dB9Op7V9DR/B3wj4S+HesxaxqVu19e2phfUrkhUik6osYPQbgPUn9K4cRiqdFpN3d1ovxv8AK/mXOai13Pkqin3EUkE8kEqlXRirA9iDTK9NNNXRsFFFFUMKuoQ2lso6rySewBz/AFqlVy0INlOh9CT78DH8qyqbJ+aJZtaZ8OPHWpW0V1Y+D9XuIJ1DxyLBhXB6EEkZBrpNM+HfjPw94Y8U6hrvhu706zbTCvmSsuNwkVgMAk9vSuYh+IfjaCzhsoPF+rw20CCOKKOcqEUdAMdhWr4R8Ra9q8+sWeqa5qN/FNpN1+7uLl3XIhYg4JxkEV0UuXmS66/kzKtz8jbtZWfW+jRieG18zw94phPObOKQf8BkB/rXFZ5rt/BXzW3iGHrv0mUj8CprjYIZJ5AiKSe/tWNdrli32/U6cPpKd+6f4f8AAOl0UiXwxMhJLKGwP1/pXKDg49K6zSzHYWptZbhIxJkuxJ5BGCBj6k59vrUd14bimXzbG4Uqc4DHP4ZH4fia8inXhTnLmdk3ddhwmot36nLcUcV0mn+EtQum3SGOCMMAWbnI7kAdce5H88UvEmjNo91FF5pmSRNwfy9oznBHU57Hr3Fdca9OcuWLuzeNSLdkzHooorUsKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAOw+Gx3x+IYP7+kykfUEGtb4b6fearbeJdLsLWa7u7jTA0UMKlmcrNGcADrxk/hWV8LMtrN7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RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAOo7UCu8+FHwr8YfEjUPJ0Cw2WabxNqVyGS0iZVB2Fwpy53L8qgn5gSAMkZ4jEUsNTdWtJRit23ZIEm3ZI4PtRX254b/AGS/AdlDavrmsa1q91FJunEbpbW84DkhdgDOoK4BxJk8kEZAHXD9nL4L/wDQm/8AlUu//jtfB4rxMySjJKHPNd1Gy/8AJmnr6HUsFUe9kfntg0mPWv0o8P8Awe+Fuh2b2lj4H0WSJ5DITeW/2twSAMB5tzAYHQEAHJxkknR/4Vt8Of8AoQvCv/gnt/8A4muGXirlielGf/kv+Zf1Gp3X4n5kBeMg03Hev06/4Vv8Of8AoQvCv/gnt/8A4murrkxPixhY29hhpPveSX3WTKWAl1l+B+WfiPwt4k8Ni3/4SHw9qukfaN3k/bbOSDzduN23cBnG4Zx0yPWsb9K/SL9oPwJ/wsL4YalocCZ1KHF5pvP/AC8Rg4XllHzqWjyxwN+7BIFfnNqFrc2N5PYXkE1tdQSNFNDKhR43U4ZWU8gg5BB5BFfZcKcTU+IMLKqo8k4uzje++zXWz/NNHNXoOjJLe5Uooor6cxCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA+hfgN+zhqnjO0tPEni24m0jw/cRs8EMRxeXIwNjruUqkZJyGOSwXhcMHr7Q8OaLpXh3Q7TQ9DsYrHTrOMRwQRg4UZJJJPJJJJJJJJJJJJJPBfs2/ET/AIWH8N7O/wBQ1C0udetMwarHEnlsjhmEbsnQb0AbKjaTvAxtKj041/NXGWd5njsdPDY33VTk7RV+VdE9UnK6taTWqeiSdj2cPSpwinHr1CrMdjK6bjgZ6A9arDrWtHdwMgJcKccg9RXNwvl2XY6rUWNlayVldRvvd3fbTS/UqvOcUuVFUafL/fWl/s9+8g/KrZurcf8ALVaDd2//AD0FfY/6vcNx3mv/AAYv8zn9rWf/AAxU/s5/+eg/Kh9PkC5DgkdsYzVo3dsP+Wg/I0172BVJVix7DB5qKmT8Lwg7zitHqptv5K71+TBVK7e34GUQRxjkV+avx/0680v40+MLa+i8mV9WnuFXcGzHK3mxtwcco6nHUZwQCCB+lbHcxbuTXxb+3roAs/Hmh+IoorWOLVbBoH8tcSSTQONzvwAfkliUHJOEwcADPP4Y46NDNamGvpUi7X3vF3X3q48dC9NS7P8AM+aqKKK/eDywooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAO3+DvxD1b4Z+M4vEWmQxXKNGbe7tZMAXEDFSybsEocqpDDoVGQRlT98/D34p+A/HMFv/YHiC1a8m4Gn3DiG7DBA7KI25baCcsu5flbBOCa/NHr2pSfevk+JODsFnzVSo3ColZSVvkmnvbyae5vRxMqWi2P1jo/Cvyb69q2fDvinxL4c8//AIR7xDquj/aNvnfYrySDzNudu7YRnG44z0yfWvhpeErS93F6/wCD/wC2Or+0P7v4n6mUV+ZP/C0fiT/0UHxX/wCDef8A+Ko/4Wj8Sf8AooPiv/wbz/8AxVR/xCWr/wBBUf8AwF/5j+vx7H6bUhPvX5zaH8d/i5o1q1rZ+NtQljaQyE3iRXbgkAcPMrMBgDgHA5OMk1e/4aO+NH/Q5f8AlMtP/jVefV8KszU37OtTa6P3lf5crt97KWPh1T/A/QvoK+av2+rjSF8BeH7SdYf7Wk1NpLVmhJcQLEwmAfGANzwZGRkhTg7cjwr/AIaO+M//AEOP/lMtP/jVcn8QviP4z+IH2H/hL9Y/tL7B5n2b/RoYdnmbd3+rRc52L1zjHGMmvb4Z8P8AMMqzSli69SDjC91FyvqmusUuuuuxnWxcKkHFJ3Zx9FFFfrp54UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU5+tNoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiilGO5oASnKAQc9qbSgkDA70AaNtbQyQbymTj1Pr9at2ljavgvFnIz94/41n2l2Y/kZcoAeB+da9pexmYnaC3XAGfz7duT71pBx6nDiPaK9r/AHnsP7L/AIb+HureM4LHxho9ldmdd9gbmSbBuUcFYyoYIysu/KyAglQB1IbtvjH4V8LWPjS6trHw5o9rCrIFjhsY0VcjnACgV558FJoB438OzlApXUIsAdMknGOcfn/hXsfxwiMfjq6kkt433Rg4fOOQfmGOcjHet4Rje9t0fI5niq17czVn3fVPzRyvjHwx4Zg+C0V/D4e0mK7N8VNwllGJCN7DG4DOOBxmvHPDWn6dL4v0WCWwtZIn1WBHRo1KspYAqQRggjqDxXt3iO2a5+A15iQube+3tnOVw46cc9e3rXiuksbHxPo9ww8ryNQgkJxkIA4OSe+aVRJX0NcrrVZQfNJt69X29TM8fWVlb+K9eggs4IY47yVY0jjCqgDHAAAwAPQViQW0L7QII2J4Hyjnmum+LkbwePfFEC5jxqcrKvUAE559jnpWN4S0m+uL2BzpmpSxBvMEttGC2R0Izweax0ue9Tk1QUnLouvkvP8AU0tA0hZJIHfS1dN3zEwgjHPWvW7Hw14ffwhPct4f0xnGsQRrIbOMkIc5UHGcHuOlN8PxX0FtmdtTjBI3G8voY8epxyRmuhT974C1i4SdJpbe/guGImMgwDjBYgDoTwOle1l8IOLuk9V0Xf0PmcVjasp6Sa1to35+Z8xeKYYor+4EUSRqJ3ACqAAAeAMdqwn64rpPGsflavex/Mdlw68/XiubbrXnY1KM+VK1rn22Ek5Uk2N7UlFFcR0nYaRa2rfDHXLtreFriO+tlSUoN6g7sgHGQDgZHfFciOAKnS4nS2eBZZBC7BnQMdrEdCR3IzUHbpVznzJJdFb8X/mZU6bg5Nu93f00St+H4jaXFHfmjv6VBqOQbmAOa2dBsra4lUTR7xxn5iO+OxrHj++OnB713vwv0Uazfx2rRzsjOS5gIEgQDPyhiATnHGa68LBSbur6M48bVdKk5Xsb+leGtCgaKRNNhdnj+bzCZAeV5wxIB9wO9Yvim10xJEigsbZHRCzbYlHpgHA68E8+o9a7LxVoF1o8CyWkXiAkYASaE4C8c5QnAyBXnWoXsPmubgyLKThxJkE8cDkdqUlFaWPn8JOrVlz8zfzf+ZBHbWxWIm2h59UHPA9q1PH1jY2/irU4YLK3ijSRQqJGFVR5aHAAGByT+tZdnKs8kKRvgF1UDOcknA59K3PHjrP401gBANtyEIzk5CKp/Vazsnt/Wh3uVSNXVu1n1fdHYfCzwF4T1v4f+INW1bSRPeWq7oJBcSoEyCeisAe3UGrOgfC/wjrms2OmyW91ZpM/zyW9wd5HH9/cAOc9M10HwbOz4V+LHweMICfXpj681e+Hl0o8X6UCFQq5LknIIA3ZGPYGtlCPLqv6sfN4jHYqFebhUaSemr0+R8/6v4XtYJGFtcyqFcg+YAxPOB6ViXGleTtHn53HH3Mf1rsNTvbeVmPmgMzsTkYAGf8ACsC6ltpWQCblW546jHaspRjfRH02FxGIa99t/L/gGHJaOiMxZcL16+uKgPHWtG+kj2FUbdznkY6/zxms5vmYn1rFpJ6Hr05OSuxtFFFI0HP9402nMcmm0IAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKUjGOnIzSUAKQR1pKUknrRQAdqns3KyLhinOcgVDjFSW5KyAgk+oHHFBMtUep/Dm7MGrabdByPJvIpCyjBADgkgdevP419KfHayeXxTZzRqr/brYENnAB5wcnjGCa+a/hRqS6br+lXzjKpcplSAQQTg9exB719WfGyze48PaPfKE22zmIkDOQcjH0xiuqm9UfBZtG0pabWf42/C4z4E29vPbXumTwQSwrcsHRjuAymDweDyB0r5v+IOgSWF/qcLqI/slzKuOhUBiVI9QRivfPgndx22vtaq2wTxEx9gGU5Az34zXX+JfAvhibUdQ1GfSFnvLtzI5mJZckcEL0xVSspNPqcWGrOnTU4rZ6+h8k/H2zC+ObrVbYjyNYtoNSi9CHjAbP8AwIGvNl1XUlAtv7RuY0QEIiylVQdcfr0r6O/aU0HOh6JrsUUapZF9MmVFwFBy0Zx2HBH5V816nalJyVU8tk88D2NYTjZn1mU1o1qEbrp1t00PS/hprVs8aQm3toJfuqI7Yzz3B55BY4H4+le0+BNuqf2j4fuZi51KxaIrJMJZFcAkbggCRAdgCSTivBPhlpkE0TX0+mPP5bcT3M/kWcagdXbqceg617Rot+y2lneQTKYoWD28iRG2sy47QwgeZOT0DHjvXoYGrZ8r6nh5tTSqtw6P8fW/5/dY8H+JFhLFqk3nRMkxYrMuOkifKwP4jI9jXByqVdlPavpv9oDwsmpQr4ysoWjjuSI9QtyoDWs+MBnAzjIwDnpxmvnfV7GSOQjaQVzkHr+da4+k6n7xL/h+q/rc+gyjFxnSUb/1/Whj0U5hg4IpteKe4FFFFABS96SnBSTxzTSuwJIly2QM9unQ17P8GdDMq3F49q84gQDaLYXAUnklo8gkYzgrkg15l4V0ufUL6OOKCSds/Kka5Zj6AdTjrxX0Bptjb6JodlazSaewZSyS3DFYZXJ+byblMGJxwCjjqDXoU4+ypNvdnz2c4lWVJbmJ4ja/SOY6DdRJeAYVbG6eCQH0aKU8jGeBXnepeLPEcMxtdXKz3ETHzI763Ut7ZIHTBPNd94mvfOuGsL3y55GUstlrmNxznBiuU+91GMmvJvEzwS6myWsdzbvGpSVLibzCpHYN3A6CuSbsY5ZSjJWnFPre3672+/XqbPgeFtc8caSotYkWa6WR0iGFVEO44HbOKj1S7/tDXL6/4K3V1JJ8vAxu4xV/4eItjZa94nlRh9hsDb27BsZnm/drj3AJOPasrSoVVBG3ZTgMDgnsMjof50ROqs1zStsrL82/0PcvAY+w/BK7nwytqWoCNAR98bs/nwKTwp52n6pqlxcW728mmaXczMjLgxExkLjPTOf1q74njTR/A/hPw9vZZRCb6UDjkgAcemSTmuf1W8mtfAPifVriV2mvmi02Jy5JJYkucnk4Qd/UCujZHyMU61Z+b/C/+R4nqdyyRCQHBJ5OORnnIyPeueMrHA446cVs62DsVQ/AGCvcY/mCP5Vhbe+OK5Kj1Pv8JBKFwLMRgkkemabRRUHYKTk8DFJRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFACnrSU4knqTTaAClUZPHNJS9+KACgEg8HH0oHWkoA7LwrdbIwmQSRtDZ5z2x6YNfaHgDWrTx38L7iwjuI5NRtbZTNDg5jlAxkk9jjOR618I6JcGG425AHU8V7/8As0+Mo/D/AI0sWuCsVnqI+xz/ADcc/dJ+h4/GtYO680fLZvhfecuj/X/Lf5HXeG7+XTdTtb9Rh7aQFlz2zhh+Wa968R6i9voEWp2+nTaqxURi3hI3Pn7pz6DPJrxv4n6KNE8V3MT5EFzmWEDIyD1A9T7+9ei/BTXBf6M+jysGmslCoWJJZD0OfUHit6lmlJdD5bDXjN0ZaX/NHIa54b1/xBp+q6N4hjsLC21a2K2lnCxZoZ1O5GdumSRj8a+R/EmlvDPJFdIY54maKRWGNjg4II9eK+9/F8VtBYzXd3dRWKwHJlkONpHIx3J+lfNnx00C21y3/wCE/wBGs54bO4lMGpK8eNso4EwH91x39aifvK9j1MrxDoVfZydu39eZ5D4csdV1eaIz30cOm2QGbi6b/R4AOfu/xN7AEk17P4a1iJGhuYpNSzeqIYb10B1LUiONlpGeIIh3cjpXhlxLcWE9t5YV7e3bzYoJeYt/qV7n61unx8Ijm2e6mvbtQupaizhZmT/njD2jTHGRyazjLlPbxeFnibOOq120t6+vXz0Sb95fQOjapDYR3drc29tcabIfs17aQsZIVYj/AFMZ6z3Hd26CvLPix8NRpsP9s6LIdR0KTIWZfme2/wBiUDPQ8A9RjmuVn8a3Woz24Vvsdvap5VlZ22QIAT/Cepdu56nNe0+FNautKjWNpLc3GxEvbXbmLewwlsgPGcHLnk+tevQxMaitP/gM8SUK+AkprS+6/wCD+u19Ndz5e1HTJYJMMpyemOhHrWa8TA/dxivqHxJ4H8K+I0N7ZSjw/eMTvXG+1lwcFxnoueMjr2rgdZ+DXiGHfJaQWupooJ32c4wffaeR9KqrgIVFeL/r8j3MLntGUUqjs/PT/gfieNFSMZPHam7e1dzffDrxVC5C6BeEYz26/wCFPt/hx4gezluJLdbUxsFKSkAgHucdMVxPLqt7JHqf2lhbJ86+9HChcn7px3rU0XSZr+VFjDAFgoIHUnoo9Se1dlp/w6upGKnMzAoGkb5I03cKST/CTxn1r0LwVomjaaHCwrqd+kLSm26GaIcTwxd1uIyN6sOo6VSoQoO89X2/rY48RmsOVqk7v+u/62KvgPwkukxWl9dWzS3E4b7Faibymcr95UkH3LpSMhG4I4qbW/EVuoZm1GKCS7Yx/a2gAhu2HWK+gPCSjpvAGetXtc1iPFxudNZS5t1ln2nYNXthwt1Gf4LuLo3QnFeR/EO+ZtVaX+1LfVIp4lMV0igNMuOPMA/jA4JPNc9Wo5O/9f1/Xr5mHoyxNa8+v9dV89bXs+qfLB4zvL+K/k0uaNILdTvitFl8yJAw+8jHoD29Kx7RAUxLucqPuHv7fniorOB5pCpLurDnuce3416L8L9EtbZLnxdrEXmaVorgwRHj7ZeH7kQPcD7xx6CudXep7NSUMPTsunbq/wDNv59bjPGFt/YPhvSPB7KEuyBqmp4ONsj/AOrjPuF5I7Zq/wDDjw4+q6lo+lJtMl9N51wRITiJTwGXHB6kHvVbQ9MufEeu3Wt6uA8Ss15eyzOyCT/YDYIBPAAPpivR/h4z6doet+OLrzVu77NjpPnHLAYwTnjIQcZx1ranFLQ8LG4nlpNJ67v1f9X9EhfiPq1lqPiO/uVZ3hs0FtaFcYwnBB9s56Vy3xekfTdA8N+GN/zrEdTukPGHkPyg/QfzrZ8I6bFqOuWtvcOEs4I3vLyYfwRJyxPsTx+NeZ/EDxFL4g13U9dk3f6Q5ESn+CMcIo/DFaTdlZHHltCUqqfRfm9F+rLOjW9pafD/AMS61dQwXE11Kml6f5gyUc/M7qexA4zXmt4NsgjHRBjPrXpXxOuYNJsvD/g+2nikXT7X7TemMgq9xKMkEjrgcZ7ZrzK4ZjIQTkA9q4m7n1uCTa5uj1XpsvwV/mRUlFFB6AUUUUALSUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAAaKKXIxjH40AJSjPWkpcnGO1AB7cUEfrQT7CkoAkhco4Yda63w9qDrkF2XIA3DkA9QceoNcf71oaZc+WdhkK5OAc4x704uzOXFUVVhZo+vLPx1o/xF8G6NolxO8XjK1hPlMV+ScoOVDdyyjOKpeB/EMuk6tHexByIuHUA5dejKR1z/AIV5sbyTXfDll4v0YxWmu+HDHFqkduoXKA4hu1UcdflfH416Db6/9vsZfHPh8wW8t0hs9atvLDfZpiMFwOyP1BHfNdVOV1Y+FzHCOL9otH18mtvwtbue+6joui+MrTTdanQ3Yt1MkaFjsYHoWXoSPesrX9KQvLE1iLqzuYTBdWxAAeIjnHYEDkHsRXFfB7xvFo8q6deFvsUxBVyf9U54z9D3/OvR/HPh/UddggtrHUvsWkykvfmL/XFccKh7A9zSa5XZvToc6arQ9pFe+t+/k/T+u58gfFvwFFoMy3emXQ1PRLtmWxvU5BwcGJyOjjp74rya/smQ7VXkjkgHBx2NffGoeGbG30240ZdKhm0WdNj2GOM44cHtJ3z6181/E74XT6Olzd6XcHV9JifZJMgBksTnISYDoRxg9D7VEo32Pdy3M0rRm7P+v6seN+G9WfR9QivUgjleLJQScqj4wGx3I6gHvXY+DvEmrXt/Y6dFeKjvLIoldeQZB88rH1A79u1cpqulsJd6KCD028/iaqW1xeadK5gkMMhQplRgFSORn3rNNxZ7lajRxcG7Jtrr/XS57nrvjOGy0aKW3jRhPcLDZxk4H2aAYBP+8+T71r6ffW5gjJmO6N7a3Z1JHzuS8mSOOBgV4BNr0920LXf3LeJYolXgKo7V0Ca1dWHg7T1hmEc9zdS3A2tnGBgZB7V0wxM0tGzxq+T8qSWjbt5dfyS187nrt7qESWD3QuZwv2NLjBlIDD7QVIPoNvf0rz3WfFF/Ya/cNa3S/ZILoEIeROituAYnOcDjPpSax4hhh0b7LNLtkn0SOOPBzuPmZI9s15y99kbAcJt2sCev4mnPFzas2zTA5be8pL8PxX5f5HvfjHW7Wxtb9ljM1lAdsiLj57K6XemB/sSZx6V5Bb67d2N9De2d7Ol9ayiaCY5yGHQn8OD6g0+/8Uyy6DYpHKDOLNrG6RhnegbKH6jsa5qaWSST/WO5AC5xx9K53Vud2Cy/2cWpLq/w0/H8U/I9H8Za5HfaGuqadbodN1CbzTEM5027/wCWgT/YfrjpXnwhJkLBdkmee4Bqxpz3cFpPaJKfIuNonjxw+OQfYjnmuv8AA3gi61u1m1W6mh0Tw/ZNi71W5+7k/wAES9ZJD2A4Hes276m8FDDReunfuui8300Tb0e9x/w58Iz+I7yS3jnWxsrVDPqN7IPks4h1J9WPQL1J+lfQKfCbUvFWl6PNpd5Zad4dtrcNp9u4O8g9Z5QBy7Hk+mcV5W2rW+qC28LeFbKXT/D0DhkEg3S3shIHnTkck5PA6AGvo/TvFMnhf4f6LpsMEd7r9xm1sbKI5JdSRvPcAdea6Ip2TW581jsRKVXlk2lZvz/4d7eS+bPOPGPgCazu9K8D6XqNuk12Dc6qY2OyKJeTLLk4HsOOa5/x3rFtfXcVnYIYdI0mEwWykcsB95yPUnmui8aXqaJBeaVFfC91vUpBNrd+hyGPUQIf7oJwR3IrmdIjsha3fiTXYQmjaMR5wQY+1zjlIBnqScZxwBWqVld/1/XQ8y/tJKMVs/V3fn+Bl+N71vCfgYWG0w6z4jUPOCfnt7MHKqR23nkj0rw/U71TIybsgcDacY9s10PjzxNqHiDWL3Wr+USXd43mFc8IvQKB6AYGPauJmcvIWJzk9cVz1JdD7LLMH7OHvLX+vy2QrTOQR3OcnqTmoTRikrE9hKwoPUcc0lFFAxeMfypKKKAFpKViM8DFJQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFL36UlABRRRQAUUp/OkoAdjj3qSJ2XIBxnr7VFmjrQJq52PgLxbd+GdZg1SxjSZkVobiCT/AFdzAww8TjuCPyIB7V2OkeMtP8L+NJ9Q8MC4u9DuwEmsbsANNCRloXxxlTna3sD615ArMowDjnNXbS9aJwGUnOM8459acJcrODE4KNW7avdWt3X/AAOh9L3ItILe38Q6Pcm90DUGxBNnm2Y9YZR2I6c9cZr0j4Y/EYWTJp+oXTPaZCxTMMiI5+4xPVT69q+Yvhl48m8M3MyCCPUdLvQF1DT5eI51z1Ho47EV6tBbWP2VfEfh64bWfDrud6Kc3FlwSYpl7Y5Aboce9dd1JWep8XjMDUws3OF0ls/0f9an0j4mN9NoV3ceGIobm/MeYYy4wAerIehI6gVxvhTQrSx0Y/2ReGS9kYtqDSJh3lOdwlQ9RngA5GOlcV8P/iFd6Jtt9yXViHykYYkxgk8oe3Hbua9Xtrnw74yMd9Z3sthqkGR9ogISVfaRejj8CPpU2cFZ7f1ucr5ar0dpdtk9enZ+unoeH/EX4aeEdT1xbDT5W8Oa7eK0qxRRF7RwOrOBzGCe44HpXjnjT4Y+JNAkeTUNIn+zAkLd2pE0LD13L0H1APPSvor4j+DvHmneILnxRY3Y1OYoI3mtVGUjH8Jj5GDjnFcsfiVqdpBe20+npZ6g0ZSGSEbQr9jJG3HHp7U/ZqSutTuoZhiaDUXr67/8N958ztpwIdYwh3EDr046EdetV5LOSMbDIcoM4IPHqPb+te+zeLfDepwJD418B2GrXSrte8tgIZJDnknaBzn3rF1mz+FJmxbaP4rgXA3GO4UlT3BDDJIHQg4rF02e9SzVuykn+DX33/RfmeMS206FBKGyOBk5wO30B6/jQbP9421CzHoB0/X2r1WbSvhcmZBN4xBBAIeOMgj3JqN5PhVbJI0fh/xVqbE/8t7lYl/EjkD6CocDqWYKXwxf3W/Nnl7WZG5W2xscHnBJHf8AKuq8I+A/EPiGYjSNHuJoVXL3EmI4FweWLtgADrXTReOtP08MPDPw+0DTXxlJ7wtdSgZ6jdgA/XisXxF4m8T+Idseta5e3sOTi3UiKEZ7CNABimou+gp4mrJW0Xq7v7l+rNhLDwR4SdJdUu4/GurdRYWLGOwiP/TSbrIf9lRj3qnqes6/431aBLwQysv7uztYAIrW0XBIWNOg4HU8+9ZulaVLeXCQwW8lwZGANrboSxGegxwv416pofwwnt9MF34rvYvDejlQJIgczTlSSvA5LDOCBgetVGm3qzz6+Lp0t3r3/wAkrW+W/Vsy/BEVxbyx6X4Mtzqmq3aASXgT5YlZcSRjPQg87+grsDcW3gy1m0/R73+0vEMyiG/1hmLpb56wwE9z3aq134ltbOxbRfC9i2j6XKwFzKMG5ux0O5v4VxyFHHrVCx0iG7S81N73+yfDNkxD6ldgZx1CIo+/ITkYHTjNdCio6v8Ar+ux4U6sqzait/vf9eX3d7Y0qz1q8lfTjNpWlWdusmsXt4+RbP1LKT1J7L1JrzX4peOYtbkt9O0qB7Lw7pYKWFsRzIc/NNIO7seeemak+JPjwazBFoeiW8umeHbY74rZmy9y/eaY/wATdwOgrzPUNQ80lUyeSQSMcdKznNWPcyzLXFqUlr27f8H8vW7Kt9c+e+R+Z6ke/aqlKck5PWgetc17n1EYqKshD16UlOz8xJ5ptBQUvpwKCSeTQDg9AfrQAhopcHGe1FAAMZ5GaSiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAXNAPPNJRQAp68UlFKAevpQAlFKcDjBB70H8KAEooooAKBx0opTQBatLkxEHOMMCeM5rtPA/i/VPDuqf2jo939nnOBJH1jmX+5IvRgffp7VwXQYzmpIJniOV69qqM7aPY5a+GjVTTR9H+HNa8O+MJ9unyweGNcdg0tjcSEWlyx/wCeL/wEnseM1p3N9qWj6rBFd2k2lXkQAjKqQWI6kHODnOc5xXznZakCf3gyzdRnAOO/t9a9D8KfE/WNOto7G/Fv4g0p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CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKXtikooAKUdaSigBTgn0opKKACiiigAooooAKKKUn+VACUvf1pKKAF4x360lFFABSkknJpKKAFAqRJCoI9Rio80UCauOYt69efWkA55JoZs446CkzSGJRRRTAKKKKACiiigApQRgjH0pKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAHryea9l+CP7P8A4l+JWm/22b2LRtIZikNxJCZXmIODsQEZAPBJI5BxnBx40Bk9K/Sr9lvWNH1P4NeG20t4wsFkltKi9UmTiQEepOTz1BB7189xHj8RhKVKNCSg6kuVyaT5VZvRPS7tZX0v3ehrRgpN3V7I+P8A42/s8eJvhzpDa7Dfxa3pMZAuJo4TFJBk4BZCT8pJAyCevOK8UPrX6cftH6to+mfCHxLNq0kflSadNAoY/ekddqKPUliMfTPavzJfr04o4cx+IxVOrCvNTdOXKpJJX0T1S0vF6O2nkndBWgotWVrkdFFFfQmQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFACiuq8B+P8Axf4HuJZvCuuXOnedjzUUB45MdCyMCpI9cZFcseaO9Z1qNKvB06sVKL3TSafqmCbTujrPHnxE8Z+OHibxTr1zqCRHMcRCpGp9QiADPvjNckfpS0cCihQpYeCp0YqMVskkkvkgbbd2NooorQAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDd8HeHL3xJqi2dqNqjBkcjhRXr9t8H9BW22zzTPLjlgx6/nWZ+zsIPst+ePO39+uMCvX64a9aSk0naxjKTvZHzb8RfAlz4YcXETmezc4D919M1xXSvpf4uiA+Cb7zscIdvrnB6V80HrXRQm5xuy4SbWolFFFbFhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAb/gnxLd+GtVF5bjejcSJn7w/xr2S1+Lfhx7UPMJY5McptPX8q+fDRWVSjGbuyZQT3O7+JPj2bxMRaWyNDZqc4PVv/AK1cKKAKOlXGKgrIaSQlFFFUMKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/9k=" }, { "uri" : "data:image/jpeg;base64,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IZzyaqSGrE7ZJqs9AEEneoRy2KmemwRF5QO2etAF6ALBbGR+AAWJ9ABXk+u3Lanrzyk5AJOPQnoPwFeieNL4WOjOobBk4HsByf6D8a840aEyOZWyWc7iTQBu6VBhRkYHFb9pH0xwKo2EWABitm2jwBgUATxJgCrKCmxr04qdF4FACoKkAFAHenge1AABTgKBThQA3FKBTgKAKAExQBS4paACjFFLQAmKWiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooASkNOooAaaT+VOptADDTGGRUpFNIoAqypkHIr4q/bQ8crq3iWPwfpspkttObEwQ5ElwRgjA67Qdv1LV9T/GzxrB4E8BX2tFlF4wMNipwcysDg4PUAAsfpjvXwN4H0668WeNHv7rdNHHJ5kjPk73Jzkk9T39c49aAPWfgn4IbS9LjnusSXMx3yMM8k9Bz6DAz3xnvXtumWQjQALjFUPCNgsNnGmMYAFdZBbgAcUARW8WO1atlHyBiooovatTTLctIo6ZPegDa0yLy4dxHJqeaRIo2llZURAWZicAAckk04KFUKOgGK4n4yaydN8KtZRPi41FvIUA8hMZc/TGB/wIUAeU6lfyeIPE15q7hts0n7pT1VBwg/IDPvmuq0W2AVeK5vw9acL8td3o9v8Ad45oA3tHt+BkV09lHhRxWXpkOFXjFb1suAKALEQwKlHApqDin0AIetNbpT6Y/AoAqXTYBrB1SXCtzWxePgHmuV1yfarZOMDvQByPim82I/PavI/Ety003lR5LOdoGe5Ndt4wv/vKD0zXK+DrA6vrvnHlYjge57/596AO8+HfhtobWCMKWJAJIHUnk165YWEVlbgYAOPmP9Kb4Y0mPTtOjZ1AkK5J9Bisnxlry2sZghI8wjj2Hqf6UAV/FHiFLUNb25BkHBPZf8TXn811eajdMluSxyBJK5OxMngkgH0JwATgHAOKY66lq0k62MTyiJS8zg4Cjk9T1JwTjrgE9Aa1IruKDS4rC3txAFH70g5LtxkknnnAP4DsAAAQaRarpmrfaLiOG9eIkDeAy9uQM4BGOCDkZ4PQ1parqct4264k6EnHQZOMnA7nAye/eudv9SitwSDzj1zmq1mk2pI8jztCoA2h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wE2hZ17MVIH6jmpLa2JbfIdzHuegqa3t1UBQoA7VfgiHHFADrSPaBxir8faool4FWEFAD161IOKaop4FACge1JSgUUAFJnmgnFJQA/vQOaaP5UoNAAetL3oP1pKAJBTh0qNaeKAHA0tNBp1ABRRQOtAC0UUUAFNJ4p1RsaAAnmkJ96bmjNAHN49qTFPxTkXJoAhKE9qgmhODgVr29sZGAAqxLaKiYAz6nFAHDaqzxqSBkjPtXDeIdVu4UcRoA2Dgk5wa9P1qzBVjt7V5t4ptG+bCsTjsCaAOJHi+/huooZIBJvcKWDEYycZxg16BYStLArngkZrz/T9Klm1qMmJwqEkkqcHtjP416PYQFIVBHQUAKd7cAkU+10+a4lCruOTViKMZ5FdD4MvLddW+ytCWYKSHxwh7f5/+vgArzeGbyziDuuM9wQefwqKO3mjYbi3Fejkqw7EHsay7/TY3y0S4PcUAc7BNKoALH86tpdOB94/nTZbYoSMYqPaRQBaF0/8AeNBuW/vGqhzTWY0AWZLtgDyaoXV42DyaSVjg1mX8u1SSaAMnxLfFLeR84wCetfOesRXfxB+KGmeELdw1tPODcgYJESkO565BwAAR1JIz1FeufEXW1stKuCAXbaQFHUnsB71S/Ys8KSXTap48vm817iQ2tm5zgxKxLlcgYDPngjjbQB9M6JYw6fptvZwRrHHFGEVVGAABjAA6VfApAMDFOA4oAWiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBDivG/2hdK1Gxh07xZoiKjWcwS/Kj5zCSSOcZIDEjHQeYWOMZr2WqOs2Ftqel3On3cCT29xE0csTjKyIQQVI7ggkH60AcH4L8Q2eq6Zbz2twsqugII75FddbPvwRXhfw48D6/8PPE99pV9ere6RcSCTS7g5DuDksHycbxg5AzyC3AYAe46QjOq8cmgDVtkzyelWQMUiKFAAp1ABRRRQAUUUUAFFFFABVa5XKnjmrNMkGRQByHiW0We1kUjOQRUvwyvmn0JtPlYmawkMJz1KdVP0xx+BrS1KIMrAjqK5HQZzpHjdFY7YL9TC2eBvHKE/qPxFAHpNFFFABRRRQAVieM9OGpaBc24HzhdyHuCOQfzFbdNdQylTyCMGgDzrwXemWzQNww+UgnkEcEV0moDdCrDnAwa5FI20jxbeWRyscrebHnpg9f1z+ddjFia2K+3FAHOX3Ga5jWslGrqtQQ5IrnNWiJU8UAeMfElzHAx6cjn8RXk+qXzJLwa9x8faBLqVq8UT+WxIIYrnGDnpXlGp+A9QaXm6BGeQIzyPzoAxbfVGAHNWRqjY+9VpfA1wg/18lKfBk4GPOkoApvqbf3qrT6kSDlv1rU/4Qyc/wDLeSkPgW4f/lvJQBgwX5+0jLdT612vgqdpdYhUHJwePxFU9M+Hh88PLJJIPQ8D9K9C8H+DrawuVuFjbzAMZLE8fQn2oA9N8M58hM+ldFHxdwfU1kaND5cajHStdR/pluPc0AdzpuPKXgDgVqJ0FZemA+Uv0FakY4FAEi04dabTh1oAWiiigAooooAKKKKACiiigAooooAhuyBCR61z94OTW7e/cArHnTc2PWgDHuF61QnTOa27y2ZULYyPUVkSkBiKAKLRfNnFOnWZ7OQRozlFLYHUgc1aCBqnt/3bZxweDQB5RrVjPcX0F3cW6iSJiIsgFxkgEA9s4GfoK7/Rrdo4VVlIIHINXDZRJem4jUEj7pZeV9wexq5BFznHX0GKAJrdMAcVfgTkH+lQwJ044q/EmAOOaAJIk6fzq1GoHWo4lxirCCgB6CpFFNUVIBQAopwFIKfQAUUUCgAo70UtACUjMqjk1BdXccIILAt6elUBd+acq2aAL7zdhxURkOetVg5zzTg1AE/mGmlz60wGlVSfegCvelnjKgkZGODislxJHkZlI7ZOT/St9ogRyKheBT1ANAHPmaXJyshHscGmmaX+FZPb5/8A61bjWq+g/Kmm1XI4FAGOZ5j0R/xYf4UnmzYxsfP1H+FbH2YD+GlFsvQKKAMcPNg/Ixz6kf0FIGuMg+UCPQmtoW3Iyv6UotcdEJ/CgDEInJ/1aj8/8afuucYC4xwOT/jWyLQ9kOB7U4Wjdo2z9DQBiAXJ6oD75b/GnIk+clRz7k/zNbYtG/55t+Rpy2r5z5bD8KAMmKCZiCyr+Wf0rRtITGc9MjkAYq0lswH3CPwqVYWH8JoARM1KnUUmwgDIxUiDkUAS0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAQzpn5hVOROtaJ5GDVaZME0AZ0seaqSQDOQK0nHNRFRQBUiiA7VajTinIoqVFoAEWpAMUKKeBQAAU+kApwHFABSUoHFBoAaf1pKcRTT1oAUelL+lN/XFO75oAO1AooHBxQA4U6mLT6AHU6mjpTqAEpaKB1oAWiimscCgBHbtURNDtk1GTQA4mkJpm6k3UAY6jmrFum5gKhUZNaWnR7nBI4HNAF63iWNAMcnrSyBdpJ4A6k1JVPUJdqbQfrQBi6u6uSFGAO/euavLJJCcqD9RW/d/MTWfKuSaAME6bEp3BFB+lMkjWMHjGK2ZVGDWRq52xMR2FAFe3dZHKKQSBnFdF4btPJkMpADMck14jrt5qo1cXVhdy27RZCMmO/XqOQcDg+laGl/EjxlpuFmSx1FBwfNh2P8AgUIH6GgD6Nhc7RUueK8c0j422A2rq/h6+tj0LW0izD64O0j6c/jXYaV8T/A1/tVdcjtZD1W6jaHH1LAL+RoA6u5t1lBOMN6+tZU1swYjFadjqFhqEXm2F7a3af3oZVcfmCaldFb7wzigDCe1k2Ftpx61Ql+UkGuinvbCAET3ttF1yHlUdOvU1yWr6rpp1Bre0vYZzgN+7YEAH3HB/DNAD5W61ia5JshZs4wK0GmBGc1geLLlY9OmfPRSaAPn/wCNuoXd3cW+k2AMs15MtvGoJGXc4UAjoc8jOAdp+h+wfhT4at/CngfStDtwNttbohbGCxA5J9yck+5r5O+COlr42+PS3k4ElpoytcHBJAkztRWHTIO5wR7ZPavtuJQqhQMADFAD1606kA4paACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA5bxhaSNYPcWtoLi8tG8yBcAMVYgOAT0GQCTgnA4BOK0/D0kU9uskZVgVBBByPwNWb+ONjH5iB0cmKRSMhlbggj0yRWB4Yh/sqR7F7i4nEcrAyzjDOSSScemSQMADjgYxQB1lFFFABRRRQAUUUUAFFFFABSMOKWigCheplSa4TxtaSeQLi3+WaBhJGw6gg5B/MV6HOuQa53XLYSQOpXOQRQBtaFfx6npFrqEfSeMMR/dOOQfcHIq/XDfDC7aFr/Q5W5gk86EE/wMeQPocn8RXc0AFFFFABRRRQBwfxPtDDLZaxGMGJ/LkI/unj+eK0tCnEtujA5BArW8TWC6jolzasPvxnB9Djg1yPgiZ3tFR/vIdpx6jg0AaerW4VyVGAeRXO30OQeK7TUYvMgDAcjgmuavYsE8UAchf2KvnIrDu9IQknaK7S5iHPFZ88IOeKAOMl0dM/dH5VAdITP3R+VdfJAPSoTbj0oA5ZdHTP3R+VTxaOmR8o/KujW3GelTxW4z0oAxLbSEBHyj8q2rGwC4wKuwwDjirsEQ4oAdaQhQOKmK/wCnW/Hc1NEmKR0/063HuaAOy0z/AFa/StRPu1m6aP3Y+grTQcCgBy04daQUo60ALRRRQAUUUUAFFFFABRRRQAUUUUAVrzpj0FZ5X5s1euvvGqj4CknoKAM7WbkW1s7McAAkj19q4CfWfLmJnKgE8kcAVt+Mr7JEAP8AtN/Qf59q4zS9Om8Q6/BpcZYRk752XqsYIyR7nIA9yKAO20+VZ4FkRgysAQQeCPWrqrkUsi26zlLVFSJAFUKMAADHAPOOO/NSIKAGLGM9KmRcEAU4DAzUkKAnNAE0CcCrsS8Cool9R+FWoxQA9BxUyCmoKlA4oAVaeBSCnigAAp1FA4oAKKKWgAqnqFz5ER2/ex19KnnkEa579qw9RmJJJOaAOK8Q+JjHfPZxuDKp+bP8PcZ/Cr3hTVWkYxSvk9VJPX1FVPiBox1LT2160RRdWCATqowXiA5J9SAMjvgNnsBzWg3rI0cqNgqQRQB7AuGAI70ozVLQ7tbm2RlPBGQPT1FaDpxmgATrVu2UZ3Y6VUjHNX4BhM+tAEm1fQflSbV9B+VOooAaVH90flRtAH3R+VOooAaAB0FLS0UAJijFLRQAlGKWigBMUYpaKAExRS0UANfmkQYNErYFJEwOcdqAJKKKKACiiigAooooAKKKKACiiigAooooAKKKKACmOu4e9PooAzpRg1AetXb9dqb+3es8uCetAEiHmrCrx7etUw/NTxTY4PIoAsgU4CmoysPlPPpUgFACAU4UClxQAlIRTsUYoAaaa3FPNNIoAZS5JNJ0NKKAFB5x3oPrRxnrSmgBR1pw5pi+lPFADh0pRSDpSigBaB1opaAE6VFI1OlbAxVZ360AI7UwtTXeo2agCQtSFqhL0hegCunWtfTQNrH6CsVG5rW06QCNufSgDQrFv5dzmtIzLg84965+7mG8896AIZzkmqrjJqZmzTCM0AVJRwaxdYRmiZV6ngV0Lx57VUuLXeRlaAPPrjR1JJK8/SqE+iKf4a9Eew9uPpUD6cMn5cUAecS6Ep48vP4VA3h2M9Yh+Vektpqn+H9KYdNGelAHnMPh1YpVliTZIpyGXgg+oI5q6+kzz/8AHxNNNwBh3LfzNdyNMGR8v6VKmmgH7tAHDQaCmRiJfyrT0/Smt5BJGNpHoO1dfFpoGMLUxtFRclQAOtAGLJI0cY3eledfFnxE2n6DdNHIokK7V3EAZPAyTwOSOtd/r0oVDt4AFfOnxxvri5kg0q0ZHmvJBCkLqT5hYhcD/aBIIz6Z64BAPaP2J/DbWng288UXCP52r3JeMyHLiFMogJxzjDEHjgjA9fowDjFcx8M9Eh8PeDNK0eBQEtbWOIEDGcKBnn1xmuoHWgBaKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAr3yGS0kUcNtJB9COleBT/ABZNz8fvEXg6e4QWtjDbLYxqmMkxh5ST3O6QDk9FGB1NfQhGRg96+CPidBP4W/a5v2QBIdQkSYFic7HiBOOePnQ/hQB926TcrdWUcqkZwAcVbrk/h7dmXSostkOoP44rrKACiiigAooooAKKKKACiiigBjjiszUIgQR61qkcVUu0ypoA88uJTovi2x1MErEz+TP2GxuMn2Bwfwr04YIB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PEY9KAM2KxUEHb+lallAFI4p6RjNWoE5FAGnYLiIj6VZqC04Q1OOtABRS0UAJRS0UANxQRxTqTtQBnXK5zXIeNhs02aTsFJrtJ1zmuZ8X2Ru9LuIFHLoQPyoA+UPh5pzeLP2jNP3I7W+no94+HyjgEohx2Icnr1AGMdT9uQqEjCgYAAFfOv7M3w+vPCfivxDq2s+QJb2RFtihYkIC2ScjgnIJGcA8Divo1CCBggj1BoAd2paKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACqmqR+ZZTR4+9GR+lW6jmGUI9RigD4l+Bnw91PTPGPi7V2jVdPXVZbKA5OSY5Hz26YKnPfI98fTHh2IxooI6VR0UQ2NtrOmQ27Ora9M7PxhSYInPc8kyY7dCfSt3T4wACBigDpNLkxhc8HitOsWyOCK2IzuUGgB1FFFABRRRQAUUUUAFFFFABTHAp9IaAIinqKQIvYVLikOMEnpQAwgKCTwBWRqdwTlVPA6Veu5cggcCsW8JOaAMPWJDsbntXnuuStskbpkmu91cEo30rz/X1PkSY96AOq8KYtfBGmRRzDfcM808Y6gkkqT/wFgPwx240IR3rD8NJKfDmlXBDeU1ukYY/xMqgNj6HjPqD6VuwHIFAE6Cn4pq1IO1ADSKaVzUoFKBQBB5Q9K1fD4VbnymxskBDA9CMdKpACrukxs99FtGcMCQPQcn+VAHhEFi2n6xfaaVINtcyQjPorED9BXo3hx98SEelchqiCTxprcituU6hPg+o3mux8MxkRJx2oA7XRoi7KoGSTXVBFACgcAYrntAXEin3roc0ABjQ9R+tNMEX939acWPvSZNADTbxH+H9aQ2sPoR+NO3H1ozQA37LD/dP5002kJ7MPxqTPuaXcfU0AQ/Y4f8Aa/Oj7FCe7fmP8KlyfejcfWgCL7FD6t+Y/wAKT7DF2LfpU24560ZPvQBC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t5j4HQdBSxLjFMUc1PGKAJ4h0qxGKhjFW4F70APReM04AU6igBMCloooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooATFGKWigBMUUtFACUmOtOpKACilooASilooATFFLRQAUUUUAFFFFABRRRQAUUUUAJ2qpeLujYeoq5UE4ypoA4G7zb6oy5AD9AByTSzyHZU3iaNkvY5FUE5xn0FVLjPl/hQBz/iC4YRNg147r1ww8Wow/590B9+Wr1nxACY2FeS69E3/CUKf+mCfzagDrtInZlXJ7DpXS2DkkYBNcvocRIXjtXY6ZCQBxzQBqWaFsZFa9rGcCq1lAeMg1sW0BwOKAFgi4FXIo8Y4p0MXA4qzHHx3oASJfap0XilRPaplX2oARR7VIFpVFSAcUANA5pQKcBS4oAaKKWg8UAITikJpT0pvagAJ5pM0E00mgB2aaWpM0hNADs0bqZmjNAD91G6o80ZoAlDUu6oc0oNAEoalDVDmnA0ATBqUNUINODUASg04Goc07dQBKDSg1EDTs0ASA0tRg0oNADwaWmA0uaAHUU3NLQAtFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUmaAFpKDRQAGkJozSE0ABOaQmkJpCaAGuRVO6PBqyzcVTuiOeaAOa8SN+5k+lZ3wtI/srXyRz9rX/ANBFXPEjHyJMelUPhYSdL1454+1L/wCgigDbydxprtxVgxqEDbefWqtxkZoAgklA701ZlJxmqd7vAJU4rEuL24gmQg5UuAcjoCaAOwiywzUyirnh+3gurIuxO4YGR06dajnhaOUqRgg0ARoKsRLntTIl5FXbaEsRgZoAdDETjir8EAwGYYFSQQBQCRk+lTf5xQAm0AYAwPSnAetAH50tABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAnSm0480UARtSGnGkIoAYRSU40h4oAQ0UUdaAKeOaevWmLT1oAsxoAAT3qQccCoYm4xUoPFADwaUGmg0vWgB9RSrkZFSCg9MUAQoc1IpzULgq3tT1bOKAJqKapp1ABRRSZoAWikzSZoAdSZpM0ZoAXNJmkJpu6gBxNNYikZqiZ8DrQAkpXniqk7KM0+eUY5NZ93NhTz+FAFa+nC556VyGv6ksSszNgD9a1NZuwiN83PtWF4a8PyeLdTaW6LrpUDYkIJBnb+4COg9SPoOegBH4G8Mz+Krs6nflo9KifCgcGdgeQD6A9T68Dvj1YSW9pAtvbRqiIMKqjAA9hVu1t4ba3jtreJIoYlCxxoMBQBgAAdBVPUkVX3DuM4oApzTvIxJJNMGSaCOaeooAcgqdBUaCpkFAE0Qq3DwDVWMVbi6UAPooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAqOUcGpKbIMigDkfF8IaIt0A5OPSsVmEkKsBgEZwa6rxHFvtG4zxXJwZMIDdeelAGDrUW5SMda801+1Y+LGTb92FAOPqf616zqMW44x3ridesh/wmkw28+Un8jQBa0G0IReOa7DTrU4HFUdFs8KOMV1VhbYAAFAElpb4A+XmtOCLoMdKdbwYAGKuxRdKAGJHx0qZI/apVj4qQKKAI1THanqtPC04CgBoFOApwHtS4oAbijFOwKDxQAw0hFONIaAGEU3tUhppoAY1NNPNNNADDRTiKQigBhpKfikxQA2inYoxQA3mlHSjFLigApO9LRjFACg0oNNxThQAoNOBpgFKKAHg04GmA0oNADwaXNMBpwoAeDSg1HTqAHg0oNRilBoAfzSimg0ZoAfRTc0A0AOopBS0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFNJoAdSZpM0ZxQAtITSE5ppNADs0maQmkJoAUmkJppNITQApNNLUhppNADXb3qldN19KtSHiqN03WgDmPEp/cPzVT4UtnSddB6/ax/wCgip/EjZhk9Peqnwo50nXSf+ftef8AgIoA6sj90Kp3IGD6VbDfuhx0qlcvwccUAZt50OM9O9c3rCEo3ODiuhu3HPIrC1JgyHkUAdp8P7wTWZBP3owcfT/9dbOoqCwYDk9a4L4cXypdtbk4ILLg+hGR/Ku7mlDxEZyRzQBDBjeBW9aqoiXgDjn1Nc1DMPM/Gtq2ucgDtjpQBpUdKiilB7/hUoIIyKAFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAE7UUEZpOlACHpTSKceaQ9KAGkUhGaUjNFADTxSU+kxQBQBxThTM07NAEyNipkbiqqmpEPNAFoGlBqNWzin0APBp1MBpQaAEkXKn1qurFWKtVuqt0h+8tAEimpAc1UjkyOtShqAJiaM4pgagmgB2aCajLU0tQBJupC1RF/emGSgCYvimM+KgaT3qJ5eetAFh5KgklxnmoJJ+OtU57kDOTQBNcTYz61j6jc4ByeKS8vQFJzXPXd1LeXAtbfl3OM9h7mgBqWtxr2pCyiZkhBBnkXqB6D3P6dfr6bpttb6XYRWtvGsccagBV6DArL8LaZFp9mqqMnqWI5YnqTW1c48g5PTmgCGW9xkKMe9UpZWkYsxJJqORssaQUAPA5p601RUiigB6CpkFRoKlSgCZOKsRHiq6VPF1oAlooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigApp6U6k7UAZmrR7rdxjtXDwALcTR85BySfevQL1dyMPUVw13Gyam6rwpGT9aAK1xHlhx3Fc5r9sP+E6uFC9IYv5V1jJl1+orK1uD/AIr66XsIYv5UAaukWoCLxXQ2sGAOOlVtMgAQcVswR4xxzQAsMWB0qwi05F4qQLigBAtOCgUoFKBQAgFKBS4paAGgUuKWigBMUdKWkxQA00008jFIaAGGmkVIRSEUARkU0ipSKTbQBGRSFakK0YoAixSEVKVoxQBFik25qXFJigCPFGKkxRigCPFLtp+KTFADcUuKXFGKAEFKBRil70AFFFA60AFOpO1LQAo6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" }, { "uri" : "data:image/jpeg;base64,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N4s8M2OPsdnG7f7XzNWXtalXaMpEc06j92PMT2+k3VygkKKif3pG21Ju0HTTvnl84x/wjhWrEutf13WXP2eLYv8Aem+7/wB81FFodq3z3j+a/wB5m3/LT9jNr97L/wABD2fv+9Iu6t41FxGbOz2v/chhT5aoDS5NQbztUeT5v+WMb/KtXobe2t1CQpt/3Up/8H4VpHlpx5YIpckfhIrexsLVfJtUVRt+dVep/ur8ifd7U3D/AO7R29/9+l8Qpe8G58fw1NYqWuR86qqqzfNUVT2uxYZnk67NtRL4S6fxRkV3VxTKl2xf5FG2L/IquYjlY0feNS03bt+bP6U6iQR3CiiimWFMZs8mhmzyaiojEAooorQAooooAKKKKACiiigAooooAKKKKACiiigAp6sE4zTKKALFFRq/y8d6krMAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCNvufnUdPl6/jTKACiiigAooooAKKKKUSpBRRRRImAUUUUwCiiigAqRU+XjtSD7xqWgJhUdSUx/vGgzEpF6n60tJx9/2oAWl3fNmm8KKOFFAC0dF9qRPuiloAKXb8uaSigApc7c01d+2j7vV6AFopFO4UvINACbtv3P8Ax6nK0Eo+dNpp6xo61Eyore1ADmXFLH3ptJ2+fFADpG8z/V0lFJwwoAOFFG5NtO2/KrpTd6+tAC0m35duaT593tUi/MM/7FADaT7q06TH+ro29u9ADd6+tD/dNH8f4UtAEdy80ce+GHeaSzsby4uUmuCuF+bbUqjd0NJc6ncnfaWdttX7ru1HNLaJPNGM+aUv+3SBZPtF5NePzufan+7Um2RmzjbSxx+WoT+6tOLBa0Q+YFG0U77zfWkpG6/crMYtJwwpaTdL/k0ALRRRQAn3loVgnGaWk+T/AG6ADd/co/g/ClPzfwUn3W+tAC0UgULRsX0oAWiiigApN0jUtFACP90075PekpP4PwoAH+6aN6+tB+8KAoWgXKMp/wA+38aNi+lS0DK9SUirv5xTtsa//WquZi5QPU0lKeppn/xNSMf95vrScg01mdT1+WlWTB9KAH/f9sUjx0beyUK2ORQBFT1YJxmlZd/akZQnan8QD0fdTqjpfN9xU8oCum6k+ZaWPvTqYBRTPmajyvYUADMR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" } ], "materials" : [ { "emissiveFactor" : [ 1.0, 1.0, 1.0 ], "emissiveTexture" : { "index" : 2 }, "name" : "Material_MR", "normalTexture" : { "index" : 4 }, "occlusionTexture" : { "index" : 3 }, "pbrMetallicRoughness" : { "baseColorTexture" : { "index" : 0 }, "metallicRoughnessTexture" : { "index" : 1 } } } ], "meshes" : [ { "name" : "mesh_helmet_LP_13930damagedHelmet", "primitives" : [ { "attributes" : { "NORMAL" : 2, "POSITION" : 1, "TEXCOORD_0" : 3 }, "indices" : 0, "material" : 0 } ] } ], "nodes" : [ { "mesh" : 0, "name" : "node_damagedHelmet_-6514", "rotation" : [ 0.7071068286895752, 0.0, -0.0, 0.7071068286895752 ] } ], "samplers" : [ {} ], "scene" : 0, "scenes" : [ { "name" : "Scene", "nodes" : [ 0 ] } ], "textures" : [ { "sampler" : 0, "source" : 0 }, { "sampler" : 0, "source" : 1 }, { "sampler" : 0, "source" : 2 }, { "sampler" : 0, "source" : 3 }, { "sampler" : 0, "source" : 4 } ] } ================================================ FILE: shell/resources/shaders/ShaderLibraryTest.metal ================================================ #include #include using namespace metal; struct VertexUniformBlock { float4x4 mvpMatrix; float scaleZ; }; struct VertexIn { float3 position [[attribute(0)]]; float3 uvw [[attribute(1)]]; }; struct VertexOut { float4 position [[position]]; float3 uvw; }; vertex VertexOut vertexShader(VertexIn in [[stage_in]], constant VertexUniformBlock &vUniform[[buffer(1)]]) { VertexOut out; out.position = vUniform.mvpMatrix * float4(in.position, 1.0); out.uvw = in.uvw; out.uvw = float3( out.uvw.x, out.uvw.y, (out.uvw.z - 0.5f)*vUniform.scaleZ + 0.5f); return out; } fragment float4 fragmentShader( VertexOut in[[stage_in]], texture3d diffuseTex [[texture(0)]], sampler linearSampler [[sampler(0)]]) { constexpr sampler s(s_address::clamp_to_edge, t_address::clamp_to_edge, min_filter::linear, mag_filter::linear); float4 tex = diffuseTex.sample(s, in.uvw); return tex; } ================================================ FILE: shell/shared/extension/Extension.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once /** * @brief Return type for type safety with C factory function */ struct IGLShellExtension {}; /** * @brief C factory function for creating new function * * @return New instance of Extension * * @note Callers usually use ExtensionLoader instead of calling this directly. * @note Callers should call `delete` to free the extension * * @see ExtensionLoader */ using IGLShellExtension_NewCFunction = IGLShellExtension* (*)(); namespace igl::shell { class Platform; /** * @brief Base class for shell extensions loaded by ExtensionLoader */ class Extension : public IGLShellExtension { public: virtual ~Extension() = default; virtual bool initialize(Platform& /*platform*/) noexcept { return true; } }; } // namespace igl::shell ================================================ FILE: shell/shared/extension/ExtensionLoader.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include namespace igl::shell { const char ExtensionLoader::kDefaultPrefix[] = "IGLShellExtension_New"; ExtensionLoader::ExtensionLoader() : ExtensionLoader(kDefaultPrefix) {} ExtensionLoader::ExtensionLoader(std::string prefix) : prefix_(std::move(prefix)) {} Extension* ExtensionLoader::create(const std::string& name) noexcept { IGL_DEBUG_ASSERT(name.length() > 0); const std::string symbolName = prefix_ + name; auto factoryFunc = SymbolFactoryLoader::find(symbolName); return factoryFunc ? static_cast((*factoryFunc)()) : nullptr; } Extension* ExtensionLoader::createAndInitialize(const std::string& name, Platform& platform) noexcept { auto* extension = create(name); if (extension) { extension->initialize(platform); // initialize extension } else { IGL_LOG_ERROR_ONCE("igl::shell::ExtensionLoader() Could not create extension(%s)\n", name.c_str()); } return extension; } } // namespace igl::shell ================================================ FILE: shell/shared/extension/ExtensionLoader.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::shell { class Extension; class Platform; /** * @brief Loads extensions using platform-specific symbol lookup utilities */ class ExtensionLoader { public: static const char kDefaultPrefix[]; ExtensionLoader(); explicit ExtensionLoader(std::string prefix); ~ExtensionLoader() = default; /** * @brief Creates Extension. Does not initialize. * * @return Returns new allocation of Extension. Not initialized. * * @note Relies on a function with signature IGLShellExtension_NewCFunction that instantiates * the extension. The name of this C function is: + name. * * @see IGLShellExtension_NewCFunction */ // E is the Extension type. Requirements on E // 1. The static method `const char* E::Name() noexcept` must exist // 2. E must subclass from igl::shell::Extension Extension* create(const std::string& name) noexcept; /** * @brief Creates Extension and initializes it * * @return Returns new instance of Extension (i.e. alloc'd and init'd) * * @see ExtensionLoader::create() */ Extension* createAndInitialize(const std::string& name, Platform& platform) noexcept; private: std::string prefix_; }; } // namespace igl::shell ================================================ FILE: shell/shared/extension/SymbolFactoryLoader.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include // clang-format off // Default behavior if project doesn't override #if !defined(IGL_DL_UNIX) && !defined(IGL_DL_DLL) #if IGL_PLATFORM_APPLE #define IGL_DL_UNIX 1 #elif IGL_PLATFORM_ANDROID #define IGL_DL_UNIX 1 #elif IGL_PLATFORM_WINDOWS #define IGL_DL_DLL 1 #endif #endif // !defined(IGL_DL_UNIX) || !defined(IGL_DL_DLL) #if !defined(IGL_DL_UNIX) #define IGL_DL_UNIX 0 #endif #if !defined(IGL_DL_DLL) #define IGL_DL_DLL 0 #endif // clang-format on #if IGL_DL_UNIX #include #elif IGL_DL_DLL #include #endif namespace igl::shell { IGLShellSymbol_NewCFunction SymbolFactoryLoader::find(const char* name) noexcept { #if IGL_DL_UNIX auto factoryFunc = (IGLShellSymbol_NewCFunction)dlsym(RTLD_DEFAULT, name); #elif IGL_DL_DLL auto factoryFunc = (IGLShellSymbol_NewCFunction)GetProcAddress(GetModuleHandle(NULL), name); #else IGL_LOG_ERROR("IGL WARNING: Runtime symbol lookup *not* supported on this platform\n"); auto factoryFunc = (IGLShellSymbol_NewCFunction) nullptr; #endif if (!factoryFunc) { IGL_LOG_ERROR_ONCE("SymbolFactoryLoader::find() Could not load symbol(%s)\n", name); } return factoryFunc; } IGLShellSymbol_NewCFunction SymbolFactoryLoader::find(const std::string& name) noexcept { return find(name.c_str()); } } // namespace igl::shell ================================================ FILE: shell/shared/extension/SymbolFactoryLoader.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include /** * @brief C-function signature for factory that instantiates instance of symbol */ using IGLShellSymbol_NewCFunction = void* (*)(); namespace igl::shell { struct SymbolFactoryLoader { /** * @brief Finds a factory function that creates symbol corresponding to `name` * * @return C function if symbol exists; nullptr otherwise. */ static IGLShellSymbol_NewCFunction find(const char* name) noexcept; static IGLShellSymbol_NewCFunction find(const std::string& name) noexcept; }; } // namespace igl::shell ================================================ FILE: shell/shared/fileLoader/FileLoader.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #if IGL_PLATFORM_ANDROID #include #elif IGL_PLATFORM_LINUX #include #elif IGL_PLATFORM_APPLE #include #elif IGL_PLATFORM_WINDOWS #include #endif namespace igl::shell { FileLoader::FileData FileLoader::loadBinaryDataInternal(const std::string& filePath) { if (IGL_DEBUG_VERIFY_NOT( !std::filesystem::exists(filePath), "Couldn't find file: %s", filePath.c_str())) { return {}; } const uintmax_t length = std::filesystem::file_size(filePath); if (IGL_DEBUG_VERIFY_NOT(length > std::numeric_limits::max())) { return {}; } std::FILE* file = std::fopen(filePath.c_str(), "rb"); if (IGL_DEBUG_VERIFY_NOT(file == nullptr)) { return {}; } IGL_SCOPE_EXIT { std::fclose(file); }; auto data = std::make_unique(static_cast(length)); if (std::fread(data.get(), 1, length, file) != length) { return {}; } return {.data = std::move(data), .length = static_cast(length)}; } std::unique_ptr createFileLoader() { #if IGL_PLATFORM_ANDROID return std::make_unique(); #elif IGL_PLATFORM_LINUX return std::make_unique(); #elif IGL_PLATFORM_APPLE return std::make_unique(); #elif IGL_PLATFORM_WINDOWS return std::make_unique(); #else return nullptr; #endif } } // namespace igl::shell ================================================ FILE: shell/shared/fileLoader/FileLoader.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::shell { class FileLoader { public: struct FileData { std::unique_ptr data = nullptr; uint64_t length; }; FileLoader() = default; virtual ~FileLoader() = default; virtual FileData loadBinaryData(const std::string& /* filename */) { return {}; } [[nodiscard]] virtual bool fileExists(const std::string& /* filename */) const { return false; } [[nodiscard]] virtual std::string basePath() const { return "."; } [[nodiscard]] virtual std::string fullPath(const std::string& /* filename */) const { return ""; } protected: FileData loadBinaryDataInternal(const std::string& filePath); }; /// Create a cross-platform compatible file loader. std::unique_ptr createFileLoader(); } // namespace igl::shell ================================================ FILE: shell/shared/fileLoader/android/FileLoaderAndroid.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include // @fb-only // @fb-only #include #include #include namespace igl::shell { namespace { // @fb-only // @fb-only// Try to get ActivityThread so we can get a Context // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // Get an Application (a Context) object from ActivityThread // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only } // namespace FileLoaderAndroid::FileLoaderAndroid() { // @fb-only } FileLoader::FileData FileLoaderAndroid::loadBinaryData(const std::string& fileName) { if (fileName.empty()) { IGL_LOG_ERROR("Error in loadBinaryData(): empty fileName\n"); return {}; } if (fileExists(fileName)) { if (assetManager_) { // Load file AAsset* asset = AAssetManager_open(assetManager_, fileName.c_str(), AASSET_MODE_BUFFER); if (asset != nullptr) { const off64_t length = AAsset_getLength64(asset); if (IGL_DEBUG_VERIFY_NOT(length > std::numeric_limits::max())) { AAsset_close(asset); return {}; } auto data = std::make_unique(length); auto readSize = AAsset_read(asset, data.get(), length); if (IGL_DEBUG_VERIFY_NOT(readSize != length)) { IGL_LOG_ERROR("Error in loadBinaryData(): read size mismatch (%ld != %zu) in %s\n", readSize, length, fileName.c_str()); } AAsset_close(asset); return {.data = std::move(data), .length = static_cast(length)}; } } // Fallback to default behavior (i.e., loading w/ C++ functions) if asset manager is not set or // doesnt not contain the file. return loadBinaryDataInternal(fullPath(fileName)); } IGL_LOG_ERROR("Error in loadBinaryData(): file not found in %s\n", fileName.c_str()); return {}; } bool FileLoaderAndroid::fileExists(const std::string& fileName) const { const std::vector data; if (fileName.empty()) { IGL_LOG_ERROR("Error in fileExists(): Empty fileName\n"); return false; } if (!fullPath(fileName).empty()) { return true; } return false; } std::string FileLoaderAndroid::basePath() const { std::string basePath; if (assetManager_) { AAssetDir* assetDir = AAssetManager_openDir(assetManager_, ""); if (assetDir != nullptr) { const char* fileName = AAssetDir_getNextFileName(assetDir); if (fileName != nullptr) { const std::filesystem::path filePath(fileName); basePath = filePath.root_path(); } AAssetDir_close(assetDir); } } if (basePath.empty()) { basePath = std::filesystem::current_path().string(); } return basePath; } std::string FileLoaderAndroid::fullPath(const std::string& fileName) const { if (assetManager_) { // Load file AAsset* asset = AAssetManager_open(assetManager_, fileName.c_str(), AASSET_MODE_BUFFER); if (asset != nullptr) { AAsset_close(asset); return fileName; } } if (std::filesystem::exists(fileName)) { return fileName; } auto fullPath = std::filesystem::path("/data/local/tmp") / fileName; if (std::filesystem::exists(fullPath)) { return fullPath.string(); } fullPath = std::filesystem::temp_directory_path() / fileName; if (std::filesystem::exists(fullPath)) { return fullPath.string(); } return ""; } } // namespace igl::shell ================================================ FILE: shell/shared/fileLoader/android/FileLoaderAndroid.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #ifdef __ANDROID__ #include #include #include struct AAssetManager; namespace igl::shell { class FileLoaderAndroid final : public FileLoader { public: FileLoaderAndroid(); ~FileLoaderAndroid() override = default; FileData loadBinaryData(const std::string& fileName) override; [[nodiscard]] bool fileExists(const std::string& fileName) const override; [[nodiscard]] std::string basePath() const override; [[nodiscard]] std::string fullPath(const std::string& fileName) const override; void setAssetManager(AAssetManager* mgr) { assetManager_ = mgr; } [[nodiscard]] AAssetManager* getAssetManager() const noexcept { return assetManager_; } private: AAssetManager* assetManager_ = nullptr; }; } // namespace igl::shell #endif ================================================ FILE: shell/shared/fileLoader/apple/FileLoaderApple.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::shell { class FileLoaderApple final : public FileLoader { public: FileLoaderApple() = default; ~FileLoaderApple() override = default; [[nodiscard]] FileData loadBinaryData(const std::string& fileName) override; [[nodiscard]] bool fileExists(const std::string& fileName) const override; [[nodiscard]] std::string basePath() const override; [[nodiscard]] std::string fullPath(const std::string& fileName) const override; }; } // namespace igl::shell ================================================ FILE: shell/shared/fileLoader/apple/FileLoaderApple.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #import // @donotremove #import #import #include namespace igl::shell { namespace { // returns the NSString version of the full path of fileName within any bundle // it'll first attempt to find the bundle path using the full fileName // if not found, it'll attempt to find the bundle path using just the root of the fileName // a return value of nil indicates that the fileName wasn't found within ny bundle NSString* getBundleFilePath(const std::string& fileName) { // NOLINTNEXTLINE(misc-const-correctness) NSString* nsFileName = [NSString stringWithUTF8String:fileName.c_str()]; if (nsFileName == nil || [nsFileName length] == 0) { return nil; } if ([[NSFileManager defaultManager] fileExistsAtPath:nsFileName]) { return nsFileName; } // NOLINTNEXTLINE(cppcoreguidelines-init-variables) for (NSBundle* bundle in [NSBundle allBundles]) { NSString* nsPath = [bundle pathForResource:nsFileName ofType:nil]; if (nsPath != nil) { return nsPath; } // next search for the root file name without the path // since the bundle path may be different and flattened within the bundle // NOLINTNEXTLINE(misc-const-correctness) NSString* nsRootFileName = [nsFileName lastPathComponent]; nsPath = [[NSBundle mainBundle] pathForResource:nsRootFileName ofType:nil]; if (nsPath != nil) { return nsPath; } } return nil; } } // namespace FileLoader::FileData FileLoaderApple::loadBinaryData(const std::string& fileName) { return loadBinaryDataInternal(fullPath(fileName)); } bool FileLoaderApple::fileExists(const std::string& fileName) const { // NOLINTNEXTLINE(misc-const-correctness) NSString* nsPath = getBundleFilePath(fileName); if (nsPath == nil) { return false; } return [[NSFileManager defaultManager] fileExistsAtPath:nsPath]; } std::string FileLoaderApple::basePath() const { std::string basePath; const char* cstr = [[NSBundle mainBundle] resourcePath].UTF8String; if (cstr != nil) { basePath = std::string{cstr}; } return basePath; } std::string FileLoaderApple::fullPath(const std::string& fileName) const { // NOLINTNEXTLINE(misc-const-correctness) const NSString* nsPath = getBundleFilePath(fileName); if (nsPath != nil) { return {[nsPath UTF8String]}; } return {}; } } // namespace igl::shell ================================================ FILE: shell/shared/fileLoader/linux/FileLoaderLinux.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include // @fb-only // @fb-only // @fb-only namespace { std::string findSubdir(const char* subdir, const std::string& fileName) { std::filesystem::path dir = std::filesystem::current_path(); // find `subdir` somewhere above our current directory while (dir != std::filesystem::current_path().root_path() && !std::filesystem::exists(dir / subdir)) { dir = dir.parent_path(); } std::filesystem::path fullPath = (dir / subdir / fileName); if (std::filesystem::exists(fullPath)) { return fullPath.string(); } dir = std::filesystem::current_path(); fullPath = (dir / "images/" / fileName); if (std::filesystem::exists(fullPath)) { return fullPath.string(); } return {}; } } // namespace namespace igl::shell { FileLoader::FileData FileLoaderLinux::loadBinaryData(const std::string& fileName) { return loadBinaryDataInternal(fullPath(fileName)); } bool FileLoaderLinux::fileExists(const std::string& fileName) const { std::ifstream file(fileName, std::ios::binary); auto exists = (file.rdstate() & std::ifstream::failbit) == 0; file.close(); return exists; } std::string FileLoaderLinux::basePath() const { // Return executable path: return basePath_; } std::string FileLoaderLinux::fullPath(const std::string& fileName) const { if (std::filesystem::exists(fileName)) { return fileName; } auto fullPath = std::filesystem::path(basePath_) / fileName; if (std::filesystem::exists(fullPath)) { return fullPath.string(); } fullPath = std::filesystem::path("shell/resources/images") / fileName; if (std::filesystem::exists(fullPath)) { return fullPath.string(); } // @lint-ignore CLANGTIDY const char* folders[] = { "shell/resources/images/", "samples/resources/images/", "samples/resources/models/", "samples/resources/fonts/", "samples/resources/fonts/optimistic", // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only }; // find folders somewhere above our current directory for (const char* folder : folders) { if (std::string p = findSubdir(folder, fileName); !p.empty()) { return p; } } // @fb-only // clang-format off // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // clang-format on // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only IGL_DEBUG_ASSERT_NOT_REACHED(); return ""; } } // namespace igl::shell ================================================ FILE: shell/shared/fileLoader/linux/FileLoaderLinux.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::shell { class FileLoaderLinux final : public FileLoader { public: FileLoaderLinux() = default; ~FileLoaderLinux() override = default; FileData loadBinaryData(const std::string& fileName) override; [[nodiscard]] bool fileExists(const std::string& fileName) const override; [[nodiscard]] std::string basePath() const override; [[nodiscard]] std::string fullPath(const std::string& fileName) const override; private: std::string basePath_; }; } // namespace igl::shell ================================================ FILE: shell/shared/fileLoader/win/FileLoaderWin.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include // @fb-only // @fb-only // @fb-only #if IGL_PLATFORM_WINDOWS #include #include #endif namespace { std::string findSubdir(const char* subdir, const std::string& fileName) { std::filesystem::path dir = std::filesystem::current_path(); // find `subdir` somewhere above our current directory while (dir != std::filesystem::current_path().root_path() && !std::filesystem::exists(dir / subdir)) { dir = dir.parent_path(); } std::filesystem::path fullPath = (dir / subdir / fileName); if (std::filesystem::exists(fullPath)) { return fullPath.string(); } dir = std::filesystem::current_path(); fullPath = (dir / "images/" / fileName); if (std::filesystem::exists(fullPath)) { return fullPath.string(); } return {}; } } // namespace namespace igl::shell { FileLoaderWin::FileLoaderWin() { #if IGL_PLATFORM_WINDOWS wchar_t path[MAX_PATH] = {0}; if (IGL_DEBUG_VERIFY(GetModuleFileNameW(NULL, path, MAX_PATH) != 0)) { basePath_ = std::filesystem::path(path).parent_path().string(); } #endif } FileLoader::FileData FileLoaderWin::loadBinaryData(const std::string& fileName) { return loadBinaryDataInternal(fullPath(fileName)); } bool FileLoaderWin::fileExists(const std::string& fileName) const { std::ifstream file(fileName, std::ios::binary); auto exists = (file.rdstate() & std::ifstream::failbit) == 0; file.close(); return exists; } std::string FileLoaderWin::basePath() const { // Return executable path: return basePath_; } std::string FileLoaderWin::fullPath(const std::string& fileName) const { if (std::filesystem::exists(fileName)) { return fileName; } auto fullPath = std::filesystem::path(basePath_) / fileName; if (std::filesystem::exists(fullPath)) { return fullPath.string(); } fullPath = std::filesystem::path("shell/resources/images") / fileName; if (std::filesystem::exists(fullPath)) { return fullPath.string(); } // @lint-ignore CLANGTIDY const char* folders[] = { "shell/resources/images/", "samples/resources/images/", "samples/resources/models/", "samples/resources/fonts/", "samples/resources/fonts/optimistic", // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only }; // find folders somewhere above our current directory for (const char* folder : folders) { if (std::string p = findSubdir(folder, fileName); !p.empty()) { return p; } } #if !defined(IGL_CMAKE_BUILD) // @lint-ignore CLANGTIDY const std::string resfolders[] = { // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only }; // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only #endif return fileName; } } // namespace igl::shell ================================================ FILE: shell/shared/fileLoader/win/FileLoaderWin.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::shell { class FileLoaderWin final : public FileLoader { public: FileLoaderWin(); ~FileLoaderWin() override = default; FileData loadBinaryData(const std::string& fileName) override; [[nodiscard]] bool fileExists(const std::string& fileName) const override; [[nodiscard]] std::string basePath() const override; [[nodiscard]] std::string fullPath(const std::string& fileName) const override; private: std::string basePath_; }; } // namespace igl::shell ================================================ FILE: shell/shared/imageLoader/ImageLoader.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #include #include namespace igl::shell { namespace { std::vector> createLoaderFactories() { std::vector> factories; factories.reserve(6); factories.emplace_back(std::make_unique()); factories.emplace_back(std::make_unique()); factories.emplace_back(std::make_unique()); factories.emplace_back(std::make_unique()); factories.emplace_back(std::make_unique()); factories.emplace_back(std::make_unique()); return factories; } constexpr uint32_t kWidth = 8, kHeight = 8; constexpr uint32_t kWhite = 0xFFFFFFFF, kBlack = 0xFF000000; constexpr std::array kCheckerboard = { kBlack, kBlack, kWhite, kWhite, kBlack, kBlack, kWhite, kWhite, kBlack, kBlack, kWhite, kWhite, kBlack, kBlack, kWhite, kWhite, kWhite, kWhite, kBlack, kBlack, kWhite, kWhite, kBlack, kBlack, kWhite, kWhite, kBlack, kBlack, kWhite, kWhite, kBlack, kBlack, kBlack, kBlack, kWhite, kWhite, kBlack, kBlack, kWhite, kWhite, kBlack, kBlack, kWhite, kWhite, kBlack, kBlack, kWhite, kWhite, kWhite, kWhite, kBlack, kBlack, kWhite, kWhite, kBlack, kBlack, kWhite, kWhite, kBlack, kBlack, kWhite, kWhite, kBlack, kBlack, }; constexpr std::array kWhiteTexture = { kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, kWhite, }; constexpr uint32_t kNumBytes = kWidth * kHeight * 4u; class CheckerboardData : public iglu::textureloader::IData { public: [[nodiscard]] const uint8_t* IGL_NONNULL data() const noexcept final; [[nodiscard]] uint64_t size() const noexcept final; }; const uint8_t* IGL_NONNULL CheckerboardData::data() const noexcept { return reinterpret_cast(kCheckerboard.data()); } uint64_t CheckerboardData::size() const noexcept { return kNumBytes; } class WhiteData : public iglu::textureloader::IData { public: [[nodiscard]] const uint8_t* IGL_NONNULL data() const noexcept final; [[nodiscard]] uint64_t size() const noexcept final; }; const uint8_t* IGL_NONNULL WhiteData::data() const noexcept { return reinterpret_cast(kWhiteTexture.data()); } uint64_t WhiteData::size() const noexcept { return kNumBytes; } } // namespace ImageLoader::ImageLoader(FileLoader& fileLoader) : fileLoader_(fileLoader), factory_(std::make_unique(createLoaderFactories())) {} ImageData ImageLoader::defaultLoadImageData(const std::string& imageName, std::optional preferredFormat) noexcept { const std::string fullName = fileLoader().fullPath(imageName); return loadImageDataFromFile(fullName, preferredFormat); } ImageData ImageLoader::loadImageDataFromFile( const std::string& fileName, std::optional preferredFormat) noexcept { auto [data, length] = fileLoader_.loadBinaryData(fileName); if (IGL_DEBUG_VERIFY(data && length > 0)) { return loadImageDataFromMemory(data.get(), length, preferredFormat); } return {}; } ImageData ImageLoader::loadImageDataFromMemory( const uint8_t* data, uint32_t length, std::optional preferredFormat) noexcept { if (data == nullptr) { return {}; } Result result; auto loader = preferredFormat ? factory_->tryCreate(data, length, *preferredFormat, &result) : factory_->tryCreate(data, length, &result); if (loader == nullptr || !result.isOk()) { return {}; } auto texData = loader->load(&result); if (texData == nullptr || !result.isOk()) { return {}; } ImageData imageData; imageData.data = std::move(texData); imageData.desc = loader->descriptor(); imageData.mipLevelBytes = loader->mipLevelBytes(); return imageData; } ImageData ImageLoader::checkerboard() noexcept { ImageData imageData; imageData.data = std::make_unique(); imageData.desc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kWidth, kHeight, TextureDesc::TextureUsageBits::Sampled, "Checkerboard"); imageData.desc.numMipLevels = TextureDesc::calcNumMipLevels(kWidth, kHeight); return imageData; } ImageData ImageLoader::white() noexcept { ImageData imageData; imageData.data = std::make_unique(); imageData.desc = TextureDesc::new2D( TextureFormat::RGBA_UNorm8, kWidth, kHeight, TextureDesc::TextureUsageBits::Sampled, "White"); imageData.desc.numMipLevels = TextureDesc::calcNumMipLevels(kWidth, kHeight); return imageData; } } // namespace igl::shell ================================================ FILE: shell/shared/imageLoader/ImageLoader.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include #include namespace igl::shell { class FileLoader; struct ImageData { TextureDesc desc; std::unique_ptr data; std::vector mipLevelBytes; }; class ImageLoader { public: explicit ImageLoader(FileLoader& fileLoader); virtual ~ImageLoader() = default; virtual ImageData loadImageData(const std::string& imageName, std::optional preferredFormat = {}) noexcept { return defaultLoadImageData(imageName, preferredFormat); } static ImageData checkerboard() noexcept; static ImageData white() noexcept; [[nodiscard]] virtual ImageData loadImageDataFromFile( const std::string& fileName, std::optional preferredFormat = {}) noexcept; [[nodiscard]] ImageData loadImageDataFromMemory( const uint8_t* data, uint32_t length, std::optional preferredFormat = {}) noexcept; [[nodiscard]] const FileLoader& fileLoader() const noexcept { return fileLoader_; } [[nodiscard]] FileLoader& fileLoader() noexcept { return fileLoader_; } private: ImageData defaultLoadImageData(const std::string& imageName, std::optional preferredFormat) noexcept; FileLoader& fileLoader_; std::unique_ptr factory_; }; } // namespace igl::shell ================================================ FILE: shell/shared/imageLoader/tests/ImageLoaderTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace igl::shell::tests { class ImageLoaderTest : public ::testing::Test { public: void SetUp() override {} void TearDown() override {} }; TEST_F(ImageLoaderTest, CheckerboardReturnsValidData) { auto imageData = ImageLoader::checkerboard(); EXPECT_NE(imageData.data, nullptr); EXPECT_EQ(imageData.data->size(), 8u * 8u * 4u); EXPECT_NE(imageData.data->data(), nullptr); EXPECT_EQ(imageData.desc.width, 8u); EXPECT_EQ(imageData.desc.height, 8u); } TEST_F(ImageLoaderTest, WhiteReturnsValidData) { auto imageData = ImageLoader::white(); EXPECT_NE(imageData.data, nullptr); EXPECT_EQ(imageData.data->size(), 8u * 8u * 4u); EXPECT_NE(imageData.data->data(), nullptr); EXPECT_EQ(imageData.desc.width, 8u); EXPECT_EQ(imageData.desc.height, 8u); } TEST_F(ImageLoaderTest, CheckerboardDataIsReadable) { auto imageData = ImageLoader::checkerboard(); ASSERT_NE(imageData.data, nullptr); const uint8_t* dataPtr = imageData.data->data(); ASSERT_NE(dataPtr, nullptr); uint32_t firstPixel = 0; std::memcpy(&firstPixel, dataPtr, sizeof(uint32_t)); EXPECT_EQ(firstPixel, 0xFF000000u); } TEST_F(ImageLoaderTest, WhiteDataIsAllWhite) { auto imageData = ImageLoader::white(); ASSERT_NE(imageData.data, nullptr); const uint8_t* dataPtr = imageData.data->data(); ASSERT_NE(dataPtr, nullptr); uint32_t firstPixel = 0; std::memcpy(&firstPixel, dataPtr, sizeof(uint32_t)); EXPECT_EQ(firstPixel, 0xFFFFFFFFu); } } // namespace igl::shell::tests ================================================ FILE: shell/shared/imageWriter/ImageWriter.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::shell { class ImageWriter { public: ImageWriter() = default; virtual ~ImageWriter() = default; virtual void writeImage(const std::string& imageName, const ImageData& imageData, bool flipY = true) const noexcept = 0; private: }; } // namespace igl::shell ================================================ FILE: shell/shared/imageWriter/android/ImageWriterAndroid.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::shell { using ImageWriterAndroid = ImageWriterSTB; } // namespace igl::shell ================================================ FILE: shell/shared/imageWriter/ios/ImageWriterIos.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::shell { class ImageWriterIos final : public ImageWriter { public: ImageWriterIos() = default; ~ImageWriterIos() override = default; void writeImage(const std::string& /*imageAbsolutePath*/, const ImageData& imageData, bool flipY = true) const noexcept override; private: }; } // namespace igl::shell ================================================ FILE: shell/shared/imageWriter/ios/ImageWriterIos.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #import #import #include namespace igl::shell { void ImageWriterIos::writeImage(const std::string& /*imageAbsolutePath*/, const ImageData& /*imageData*/, bool /*flipY*/) const noexcept { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } } // namespace igl::shell ================================================ FILE: shell/shared/imageWriter/linux/ImageWriterLinux.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::shell { using ImageWriterLinux = ImageWriterSTB; } // namespace igl::shell ================================================ FILE: shell/shared/imageWriter/mac/ImageWriterMac.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::shell { using ImageWriterMac = ImageWriterSTB; } // namespace igl::shell ================================================ FILE: shell/shared/imageWriter/stb/ImageWriterSTB.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #if defined(IGL_CMAKE_BUILD) #define STB_IMAGE_WRITE_IMPLEMENTATION #endif // IGL_CMAKE_BUILD #include namespace igl::shell { void ImageWriterSTB::writeImage(const std::string& imageAbsolutePath, const ImageData& imageData, bool flipY) const noexcept { if (imageData.desc.width * 4 > std::numeric_limits::max() || imageData.desc.height > std::numeric_limits::max()) { IGLLog(IGLLogError, "Failed saving the file: %s", imageAbsolutePath.c_str()); return; } stbi_flip_vertically_on_write(static_cast(flipY)); IGL_DEBUG_ASSERT(imageAbsolutePath.length() > 4); auto ext = imageAbsolutePath.substr(imageAbsolutePath.length() - 4); std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower); int ret = 0; if (ext == ".png") { ret = stbi_write_png(imageAbsolutePath.c_str(), static_cast(imageData.desc.width), static_cast(imageData.desc.height), 4, imageData.data->data(), /*int stride_in_bytes*/ 4 * static_cast(imageData.desc.width)); } else if (ext == ".bmp") { ret = stbi_write_bmp(imageAbsolutePath.c_str(), static_cast(imageData.desc.width), static_cast(imageData.desc.height), 4, imageData.data->data()); } if (!ret) { IGLLog(IGLLogError, "Failed saving the file: %s", imageAbsolutePath.c_str()); } } } // namespace igl::shell ================================================ FILE: shell/shared/imageWriter/stb/ImageWriterSTB.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::shell { class ImageWriterSTB final : public ImageWriter { public: void writeImage(const std::string& /*imageAbsolutePath*/, const ImageData& imageData, bool flipY = true) const noexcept override; private: }; } // namespace igl::shell ================================================ FILE: shell/shared/imageWriter/win/ImageWriterWin.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::shell { using ImageWriterWin = ImageWriterSTB; } // namespace igl::shell ================================================ FILE: shell/shared/input/InputDispatcher.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include namespace igl::shell { void InputDispatcher::processEvents() { const std::lock_guard guard(mutex_); while (!events_.empty()) { auto& event = events_.front(); if (event.type == EventType::MouseButton || event.type == EventType::MouseMotion || event.type == EventType::MouseWheel) { for (auto& listener : mouseListeners_) { if (event.type == EventType::MouseButton && listener->process(std::get(event.data))) { break; } if (event.type == EventType::MouseMotion && listener->process(std::get(event.data))) { break; } if (event.type == EventType::MouseWheel && listener->process(std::get(event.data))) { break; } } } else if (event.type == EventType::Touch) { for (auto& listener : touchListeners_) { if (listener->process(std::get(event.data))) { break; } } } else if (event.type == EventType::Key) { for (auto& listener : keyListeners_) { if (listener->process(std::get(event.data))) { break; } } } else if (event.type == EventType::Char) { for (auto& listener : keyListeners_) { if (listener->process(std::get(event.data))) { break; } } } else if (event.type == EventType::Ray) { for (auto& listener : rayListeners_) { if (listener->process(std::get(event.data))) { break; } } } else if (event.type == EventType::Intent) { for (auto& listener : intentListeners_) { if (listener->process(std::get(event.data))) { break; } } } events_.pop(); } } void InputDispatcher::addMouseListener(const std::shared_ptr& listener) { const std::lock_guard guard(mutex_); mouseListeners_.push_back(listener); } void InputDispatcher::removeMouseListener(const std::shared_ptr& listener) { const std::lock_guard guard(mutex_); for (int i = mouseListeners_.size() - 1; i >= 0; --i) { if (listener.get() == mouseListeners_[i].get()) { mouseListeners_.erase(mouseListeners_.begin() + i); } } } void InputDispatcher::addTouchListener(const std::shared_ptr& listener) { const std::lock_guard guard(mutex_); touchListeners_.push_back(listener); } void InputDispatcher::removeTouchListener(const std::shared_ptr& listener) { const std::lock_guard guard(mutex_); for (int i = touchListeners_.size() - 1; i >= 0; --i) { if (listener.get() == touchListeners_[i].get()) { touchListeners_.erase(touchListeners_.begin() + i); } } } void InputDispatcher::addKeyListener(const std::shared_ptr& listener) { const std::lock_guard guard(mutex_); keyListeners_.push_back(listener); } void InputDispatcher::removeKeyListener(const std::shared_ptr& listener) { const std::lock_guard guard(mutex_); for (int i = keyListeners_.size() - 1; i >= 0; --i) { if (listener.get() == keyListeners_[i].get()) { keyListeners_.erase(keyListeners_.begin() + i); } } } void InputDispatcher::addRayListener(const std::shared_ptr& listener) { const std::lock_guard guard(mutex_); rayListeners_.push_back(listener); } void InputDispatcher::removeRayListener(const std::shared_ptr& listener) { const std::lock_guard guard(mutex_); for (int i = rayListeners_.size() - 1; i >= 0; --i) { if (listener.get() == rayListeners_[i].get()) { rayListeners_.erase(rayListeners_.begin() + i); } } } void InputDispatcher::addIntentListener(const std::shared_ptr& listener) { const std::lock_guard guard(mutex_); intentListeners_.push_back(listener); } void InputDispatcher::removeIntentListener(const std::shared_ptr& listener) { const std::lock_guard guard(mutex_); for (int i = rayListeners_.size() - 1; i >= 0; --i) { if (listener.get() == intentListeners_[i].get()) { intentListeners_.erase(intentListeners_.begin() + i); } } } void InputDispatcher::queueEvent(const MouseButtonEvent& event) { const std::lock_guard guard(mutex_); InputDispatcher::Event evt; evt.type = EventType::MouseButton; evt.data = event; events_.push(evt); } void InputDispatcher::queueEvent(const MouseMotionEvent& event) { const std::lock_guard guard(mutex_); InputDispatcher::Event evt; evt.type = EventType::MouseMotion; evt.data = event; events_.push(evt); } void InputDispatcher::queueEvent(const MouseWheelEvent& event) { const std::lock_guard guard(mutex_); InputDispatcher::Event evt; evt.type = EventType::MouseWheel; evt.data = event; events_.push(evt); } void InputDispatcher::queueEvent(const TouchEvent& event) { const std::lock_guard guard(mutex_); InputDispatcher::Event evt; evt.type = EventType::Touch; evt.data = event; events_.push(evt); } void InputDispatcher::queueEvent(const RayEvent& event) { const std::lock_guard guard(mutex_); InputDispatcher::Event evt; evt.type = EventType::Ray; evt.data = event; events_.push(evt); } void InputDispatcher::queueEvent(const IntentEvent& event) { const std::lock_guard guard(mutex_); InputDispatcher::Event evt; evt.type = EventType::Intent; evt.data = event; events_.push(evt); } void InputDispatcher::queueEvent(const KeyEvent& event) { const std::lock_guard guard(mutex_); InputDispatcher::Event evt; evt.type = EventType::Key; evt.data = event; events_.push(evt); } void InputDispatcher::queueEvent(const CharEvent& event) { const std::lock_guard guard(mutex_); InputDispatcher::Event evt; evt.type = EventType::Char; evt.data = event; events_.push(evt); } } // namespace igl::shell ================================================ FILE: shell/shared/input/InputDispatcher.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include #include #include #include #include namespace igl::shell { class InputDispatcher { public: // Consumer methods void addMouseListener(const std::shared_ptr& listener); void removeMouseListener(const std::shared_ptr& listener); void addTouchListener(const std::shared_ptr& listener); void removeTouchListener(const std::shared_ptr& listener); void addKeyListener(const std::shared_ptr& listener); void removeKeyListener(const std::shared_ptr& listener); void addRayListener(const std::shared_ptr& listener); void removeRayListener(const std::shared_ptr& listener); void addIntentListener(const std::shared_ptr& listener); void removeIntentListener(const std::shared_ptr& listener); // Platform methods void queueEvent(const MouseButtonEvent& event); void queueEvent(const MouseMotionEvent& event); void queueEvent(const MouseWheelEvent& event); void queueEvent(const TouchEvent& event); void queueEvent(const KeyEvent& event); void queueEvent(const CharEvent& event); void queueEvent(const RayEvent& event); void queueEvent(const IntentEvent& event); void processEvents(); private: enum class EventType { // Mouse MouseButton, MouseMotion, MouseWheel, // Touch Touch, // Key Key, Char, // Ray Ray, // Intent Intent, }; struct Event { EventType type; using Data = std::variant; Data data; }; std::mutex mutex_; std::vector> mouseListeners_; std::vector> touchListeners_; std::vector> keyListeners_; std::vector> rayListeners_; std::vector> intentListeners_; std::queue events_; }; } // namespace igl::shell ================================================ FILE: shell/shared/input/IntentListener.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::shell { enum class IntentType : uint8_t { ActionView, }; struct IntentEvent { IntentType type; std::string data; }; class IIntentListener { public: virtual bool process(const IntentEvent& event) = 0; virtual ~IIntentListener() = default; }; } // namespace igl::shell ================================================ FILE: shell/shared/input/KeyListener.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::shell { enum { kKeyEventModifierNone = 0, kKeyEventModifierShift = 1 << 0, kKeyEventModifierControl = 1 << 1, kKeyEventModifierOption = 1 << 2, kKeyEventModifierCapsLock = 1 << 3, kKeyEventModifierNumLock = 1 << 4, kKeyEventModifierCommand = 1 << 5, }; struct KeyEvent { int key; bool isDown; uint32_t modifiers; KeyEvent() = default; KeyEvent(bool isDown, int key, uint32_t modifiers = kKeyEventModifierNone) : key(key), isDown(isDown), modifiers(modifiers) {} }; struct CharEvent { int character; }; class IKeyListener { public: virtual bool process(const KeyEvent& /*event*/) { return false; } virtual bool process(const CharEvent& /*event*/) { return false; } virtual ~IKeyListener() = default; }; } // namespace igl::shell ================================================ FILE: shell/shared/input/MouseListener.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once namespace igl::shell { enum MouseButton { Left = 0, Right = 1, Middle = 2, }; struct MouseButtonEvent { MouseButton button; bool isDown; float x; float y; MouseButtonEvent() = default; MouseButtonEvent(MouseButton button, bool isDown, float x, float y) : button(button), isDown(isDown), x(x), y(y) {} }; struct MouseMotionEvent { float x; float y; float dx; float dy; MouseMotionEvent() = default; MouseMotionEvent(float x, float y, float dx, float dy) : x(x), y(y), dx(dx), dy(dy) {} }; struct MouseWheelEvent { float dx; float dy; MouseWheelEvent() = default; MouseWheelEvent(float dx, float dy) : dx(dx), dy(dy) {} }; class IMouseListener { public: virtual bool process(const MouseButtonEvent& event) = 0; virtual bool process(const MouseMotionEvent& event) = 0; virtual bool process(const MouseWheelEvent& event) = 0; virtual ~IMouseListener() = default; }; } // namespace igl::shell ================================================ FILE: shell/shared/input/RayListener.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::shell { struct RayEvent { glm::vec3 start; glm::vec3 end; bool buttonPressed = false; }; class IRayListener { public: virtual bool process(const RayEvent& event) = 0; virtual ~IRayListener() = default; }; } // namespace igl::shell ================================================ FILE: shell/shared/input/TouchListener.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once namespace igl::shell { struct TouchEvent { bool isDown; float x; float y; float dx; float dy; TouchEvent() = default; TouchEvent(bool isDown, float x, float y, float dx, float dy) : isDown(isDown), x(x), y(y), dx(dx), dy(dy) {} }; class ITouchListener { public: virtual bool process(const TouchEvent& event) = 0; virtual ~ITouchListener() = default; }; } // namespace igl::shell ================================================ FILE: shell/shared/netservice/NetService.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::shell::netservice { class NetService { public: struct Delegate { virtual ~Delegate() = default; virtual void willPublish(NetService& sender) noexcept = 0; virtual void didNotPublish(NetService& sender, int errorCode, int errorDomain) noexcept = 0; virtual void didPublish(NetService& sender) noexcept = 0; virtual void willResolve(NetService& sender) noexcept = 0; virtual void didNotResolve(NetService& sender, int errorCode, int errorDomain) noexcept = 0; virtual void didResolveAddress(NetService& sender) noexcept = 0; virtual void didStop(NetService& sender) noexcept = 0; virtual void didAcceptConnection(NetService& sender, std::shared_ptr inputStream, std::shared_ptr outputStream) noexcept = 0; }; virtual ~NetService() = default; virtual void publish() noexcept = 0; [[nodiscard]] virtual std::shared_ptr getInputStream() const noexcept = 0; [[nodiscard]] virtual std::shared_ptr getOutputStream() const noexcept = 0; [[nodiscard]] virtual std::string getName() const noexcept = 0; [[nodiscard]] Delegate* delegate() const noexcept { return delegate_.get(); } void setDelegate(std::unique_ptr delegate) noexcept { IGL_DEBUG_ASSERT(delegate && delegate.get()); delegate_ = std::move(delegate); } private: std::unique_ptr delegate_; }; } // namespace igl::shell::netservice ================================================ FILE: shell/shared/netservice/NetServiceExtension.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include namespace igl::shell::netservice { const char* NetServiceExtension::name() noexcept { return "IglShellNetService"; } } // namespace igl::shell::netservice ================================================ FILE: shell/shared/netservice/NetServiceExtension.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include namespace igl::shell::netservice { class NetServiceExtension : public Extension { public: static const char* name() noexcept; // Return true to keep searching or false to stop searching. using DidFindService = std::function< bool(NetServiceExtension& sender, std::unique_ptr service, bool moreComing)>; [[nodiscard]] virtual std::unique_ptr create(std::string_view domain, std::string_view type, std::string_view name, int port) const noexcept = 0; virtual void search(std::string_view domain, std::string_view type) const noexcept = 0; [[nodiscard]] const DidFindService& delegate() const noexcept { return delegate_; } void setDelegate(DidFindService delegate) noexcept { delegate_ = std::move(delegate); } private: DidFindService delegate_; }; } // namespace igl::shell::netservice ================================================ FILE: shell/shared/netservice/NetServiceFactory.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::shell::netservice { class NetServiceFactory { public: virtual ~NetServiceFactory() = default; [[nodiscard]] virtual std::unique_ptr create(std::string domain, std::string type, std::string name, int port) const noexcept = 0; [[nodiscard]] virtual std::unique_ptr search(std::string domain, std::string type) const noexcept = 0; }; } // namespace igl::shell::netservice ================================================ FILE: shell/shared/netservice/Stream.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include #include namespace igl::shell::netservice { // ---------------------------------------------------------------------------- struct Stream { enum class Event : uint8_t { None = 0, OpenCompleted, HasBytesAvailable, HasSpaceAvailable, ErrorOccurred, EndEncountered, }; enum class Status : uint8_t { AtEnd, Closed, Error, NotOpen, Open, Opening, Reading, Writing, }; using Observer = std::function; virtual ~Stream() = default; virtual void open() noexcept = 0; [[nodiscard]] virtual Status status() const noexcept = 0; virtual void close() noexcept = 0; [[nodiscard]] const Observer& observer() const noexcept { return observer_; } void setObserver(Observer observer) noexcept { observer_ = std::move(observer); } private: Observer observer_; }; // ---------------------------------------------------------------------------- struct InputStream : Stream { virtual int read(uint8_t* outBuffer, size_t maxLength) const noexcept = 0; virtual bool getBuffer(uint8_t*& outBuffer, size_t& outLength) const noexcept = 0; [[nodiscard]] virtual bool hasBytesAvailable() const noexcept = 0; }; // ---------------------------------------------------------------------------- struct OutputStream : Stream { virtual int write(const uint8_t* buffer, size_t maxLength) noexcept = 0; [[nodiscard]] virtual bool hasSpaceAvailable() const noexcept = 0; }; // ---------------------------------------------------------------------------- } // namespace igl::shell::netservice ================================================ FILE: shell/shared/netservice/apple/NetServiceApple.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include @class NSNetService; @protocol NSNetServiceDelegate; namespace igl::shell::netservice { class NetServiceApple final : public NetService { public: NetServiceApple(std::string_view domain, std::string_view type, std::string_view name); NetServiceApple(NSNetService* netService); ~NetServiceApple() final; NetServiceApple(const NetServiceApple&) = delete; NetServiceApple& operator=(const NetServiceApple&) = delete; NetServiceApple(NetServiceApple&&) = delete; NetServiceApple& operator=(NetServiceApple&&) = delete; void publish() noexcept final; [[nodiscard]] std::shared_ptr getInputStream() const noexcept final; [[nodiscard]] std::shared_ptr getOutputStream() const noexcept final; [[nodiscard]] std::string getName() const noexcept final; [[nodiscard]] InputStreamApple& inputStream() const noexcept { return *inputStream_; } [[nodiscard]] OutputStreamApple& outputStream() const noexcept { return *outputStream_; } protected: void initialize(); private: NSNetService* netService_ = nil; id netServiceDelegateAdapter_ = nil; std::shared_ptr inputStream_; std::shared_ptr outputStream_; }; } // namespace igl::shell::netservice ================================================ FILE: shell/shared/netservice/apple/NetServiceApple.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include // ---------------------------------------------------------------------------- @interface IGLShellNetServiceDelegateAdapter : NSObject { igl::shell::netservice::NetServiceApple* _owner; // weak ref } @end @implementation IGLShellNetServiceDelegateAdapter - (id)initWithOwner:(igl::shell::netservice::NetServiceApple*)owner { self = [super init]; if (self) { self->_owner = owner; } return self; } - (void)netServiceWillPublish:(NSNetService*)sender { auto* target = (_owner ? _owner->delegate() : nullptr); if (target) { target->willPublish(*_owner); } } - (void)netService:(NSNetService*)sender didNotPublish:(NSDictionary*)errorDict { auto* target = (_owner ? _owner->delegate() : nullptr); if (target) { int errorCode = [[errorDict valueForKey:NSNetServicesErrorCode] intValue]; int errorDomain = [[errorDict valueForKey:NSNetServicesErrorDomain] intValue]; target->didNotPublish(*_owner, errorCode, errorDomain); } } - (void)netServiceDidPublish:(NSNetService*)sender { auto* target = (_owner ? _owner->delegate() : nullptr); if (target) { target->didPublish(*_owner); } } - (void)netServiceWillResolve:(NSNetService*)sender { auto* target = (_owner ? _owner->delegate() : nullptr); if (target) { target->willResolve(*_owner); } } - (void)netService:(NSNetService*)sender didNotResolve:(NSDictionary*)errorDict { auto* target = (_owner ? _owner->delegate() : nullptr); if (target) { int errorCode = [[errorDict valueForKey:NSNetServicesErrorCode] intValue]; int errorDomain = [[errorDict valueForKey:NSNetServicesErrorDomain] intValue]; target->didNotResolve(*_owner, errorCode, errorDomain); } } - (void)netServiceDidResolveAddress:(NSNetService*)sender { auto* target = (_owner ? _owner->delegate() : nullptr); if (target) { target->didResolveAddress(*_owner); } } - (void)netServiceDidStop:(NSNetService*)sender { auto* target = (_owner ? _owner->delegate() : nullptr); if (target) { target->didStop(*_owner); } } - (void)netService:(NSNetService*)sender didAcceptConnectionWithInputStream:(NSInputStream*)inputStream outputStream:(NSOutputStream*)outputStream { auto* target = (_owner ? _owner->delegate() : nullptr); if (target) { auto input = std::make_shared(); input->initialize(inputStream); auto output = std::make_shared(); output->initialize(outputStream); target->didAcceptConnection(*_owner, std::move(input), std::move(output)); } } @end // ---------------------------------------------------------------------------- namespace igl::shell::netservice { namespace { NSString* fromStringView(std::string_view str) { return [[NSString alloc] initWithBytes:str.data() length:str.size() encoding:NSUTF8StringEncoding]; } } // namespace NetServiceApple::NetServiceApple(std::string_view domainStr, std::string_view typeStr, std::string_view nameStr) { NSString* domain = fromStringView(domainStr); NSString* type = fromStringView(typeStr); NSString* name = fromStringView(nameStr); // Use port 0 to assign random (available) port // Otherwise publishing with NSNetServiceListenForConnections fails netService_ = [[NSNetService alloc] initWithDomain:domain type:type name:name port:0]; initialize(); } NetServiceApple::NetServiceApple(NSNetService* netService) : netService_(netService) { initialize(); NSInputStream* inputStream = nil; NSOutputStream* outputStream = nil; [netService_ getInputStream:&inputStream outputStream:&outputStream]; IGL_DEBUG_ASSERT(inputStream); IGL_DEBUG_ASSERT(outputStream); inputStream_->initialize(inputStream); outputStream_->initialize(outputStream); } void NetServiceApple::initialize() { if (IGL_DEBUG_VERIFY(nil == netServiceDelegateAdapter_)) { netServiceDelegateAdapter_ = [[IGLShellNetServiceDelegateAdapter alloc] initWithOwner:this]; [netService_ setDelegate:netServiceDelegateAdapter_]; inputStream_ = std::make_shared(); outputStream_ = std::make_shared(); } } NetServiceApple::~NetServiceApple() { [netService_ setDelegate:nil]; netServiceDelegateAdapter_ = nil; netService_ = nil; } void NetServiceApple::publish() noexcept { [netService_ publishWithOptions:NSNetServiceListenForConnections]; } std::shared_ptr NetServiceApple::getInputStream() const noexcept { return inputStream_; } std::shared_ptr NetServiceApple::getOutputStream() const noexcept { return outputStream_; } std::string NetServiceApple::getName() const noexcept { // NOLINT(bugprone-exception-escape) return {[[netService_ name] UTF8String]}; } } // namespace igl::shell::netservice ================================================ FILE: shell/shared/netservice/apple/NetServiceExtensionApple.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #import #include #include namespace igl::shell::netservice { class NetServiceExtensionApple final : public NetServiceExtension { public: NetServiceExtensionApple() = default; ~NetServiceExtensionApple() final; NetServiceExtensionApple(const NetServiceExtensionApple&) = delete; NetServiceExtensionApple& operator=(const NetServiceExtensionApple&) = delete; NetServiceExtensionApple(NetServiceExtensionApple&&) = delete; NetServiceExtensionApple& operator=(NetServiceExtensionApple&&) = delete; bool initialize(igl::shell::Platform& platform) noexcept final; [[nodiscard]] std::unique_ptr create(std::string_view domain, std::string_view type, std::string_view name, int port) const noexcept final; void search(std::string_view domain, std::string_view type) const noexcept final; void stopSearch() const noexcept; private: NSNetServiceBrowser* netServiceBrowser_ = nil; id netServiceBrowserDelegate_ = nil; }; // NOLINTNEXTLINE(readability-identifier-naming) IGL_API IGLShellExtension* IGLShellExtension_NewIglShellNetService(); } // namespace igl::shell::netservice ================================================ FILE: shell/shared/netservice/apple/NetServiceExtensionApple.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include @interface IGLShellNetBrowserServiceDelegateAdapter : NSObject { // NOLINTNEXTLINE(readability-identifier-naming) igl::shell::netservice::NetServiceExtensionApple* owner_; // weak ref } @end @implementation IGLShellNetBrowserServiceDelegateAdapter - (instancetype)initWithOwner:(igl::shell::netservice::NetServiceExtensionApple*)owner { IGL_DEBUG_ASSERT(owner); self = [super init]; if (self) { owner_ = owner; } return self; } - (void)netServiceBrowserDidStopSearch:(NSNetServiceBrowser*)browser { } - (void)netServiceBrowser:(NSNetServiceBrowser*)browser didNotSearch:(NSDictionary*)errorDict { IGL_DEBUG_ASSERT(owner_); owner_->stopSearch(); } - (void)netServiceBrowser:(NSNetServiceBrowser*)browser didFindService:(NSNetService*)netService moreComing:(BOOL)moreComing { IGL_DEBUG_ASSERT(owner_); const auto& delegate = owner_->delegate(); bool keepSearching = moreComing; if (delegate) { auto service = std::make_unique(netService); keepSearching = delegate(*owner_, std::move(service), moreComing); } if (!keepSearching) { owner_->stopSearch(); } } - (void)netServiceBrowser:(NSNetServiceBrowser*)browser didRemoveService:(NSNetService*)netService moreComing:(BOOL)moreComing { IGL_DEBUG_ASSERT(owner_); auto delegate = owner_->delegate(); if (delegate) { // delegate->didRemoveService(*owner_, service); } } @end // ---------------------------------------------------------------------------- namespace igl::shell::netservice { namespace { NSString* fromStringView(std::string_view str) { return [[NSString alloc] initWithBytes:str.data() length:str.size() encoding:NSUTF8StringEncoding]; } } // namespace NetServiceExtensionApple::~NetServiceExtensionApple() { netServiceBrowser_ = nil; netServiceBrowserDelegate_ = nil; } bool NetServiceExtensionApple::initialize(Platform& /*platform*/) noexcept { if (!netServiceBrowser_) { netServiceBrowser_ = [[NSNetServiceBrowser alloc] init]; netServiceBrowserDelegate_ = [[IGLShellNetBrowserServiceDelegateAdapter alloc] initWithOwner:this]; netServiceBrowser_.delegate = netServiceBrowserDelegate_; } return true; } std::unique_ptr NetServiceExtensionApple::create(std::string_view domain, std::string_view type, std::string_view name, int /*port*/) const noexcept { return std::make_unique(domain, type, name); } void NetServiceExtensionApple::search(std::string_view domain, std::string_view type) const noexcept { if (IGL_DEBUG_VERIFY(!domain.empty())) { NSString* serviceType = fromStringView(type); NSString* serviceDomain = fromStringView(domain); // @"local." [netServiceBrowser_ searchForServicesOfType:serviceType inDomain:serviceDomain]; } } void NetServiceExtensionApple::stopSearch() const noexcept { if (IGL_DEBUG_VERIFY(netServiceBrowser_)) { [netServiceBrowser_ stop]; } } // NOLINTNEXTLINE(readability-identifier-naming) IGL_API __attribute((retain, used)) IGLShellExtension* IGLShellExtension_NewIglShellNetService() { auto* extension = new NetServiceExtensionApple; return static_cast(extension); } } // namespace igl::shell::netservice ================================================ FILE: shell/shared/netservice/apple/StreamApple.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #import #include namespace igl::shell::netservice { // ---------------------------------------------------------------------------- struct StreamAdapterApple final { StreamAdapterApple() = default; ~StreamAdapterApple(); StreamAdapterApple(const StreamAdapterApple&) = delete; StreamAdapterApple& operator=(const StreamAdapterApple&) = delete; StreamAdapterApple(StreamAdapterApple&&) = delete; StreamAdapterApple& operator=(StreamAdapterApple&&) = delete; bool initialize(Stream* owner, NSStream* stream) noexcept; void open() noexcept; [[nodiscard]] Stream::Status status() const noexcept; void close() noexcept; [[nodiscard]] Stream* stream() const noexcept { return owner_; } [[nodiscard]] NSStream* nsStream() const noexcept { return stream_; } private: Stream* owner_ = nullptr; // weak reference NSStream* stream_ = nil; id delegate_ = nil; }; // ---------------------------------------------------------------------------- struct InputStreamApple final : InputStream { void open() noexcept final { streamAdapter_.open(); } [[nodiscard]] Status status() const noexcept final { return streamAdapter_.status(); } void close() noexcept final { streamAdapter_.close(); } int read(uint8_t* outBuffer, size_t maxLength) const noexcept final; bool getBuffer(uint8_t*& outBuffer, size_t& outLength) const noexcept final; [[nodiscard]] bool hasBytesAvailable() const noexcept final; bool initialize(NSInputStream* stream) noexcept { return streamAdapter_.initialize(this, stream); } private: [[nodiscard]] NSInputStream* inputStream() const noexcept { return (NSInputStream*)streamAdapter_.nsStream(); } StreamAdapterApple streamAdapter_; }; // ---------------------------------------------------------------------------- struct OutputStreamApple final : OutputStream { void open() noexcept final { streamAdapter_.open(); } [[nodiscard]] Status status() const noexcept final { return streamAdapter_.status(); } void close() noexcept final { streamAdapter_.close(); } int write(const uint8_t* buffer, size_t maxLength) noexcept final; [[nodiscard]] bool hasSpaceAvailable() const noexcept final; bool initialize(NSOutputStream* stream) noexcept { return streamAdapter_.initialize(this, stream); } private: [[nodiscard]] NSOutputStream* outputStream() const noexcept { return (NSOutputStream*)streamAdapter_.nsStream(); } StreamAdapterApple streamAdapter_; }; // ---------------------------------------------------------------------------- } // namespace igl::shell::netservice ================================================ FILE: shell/shared/netservice/apple/StreamApple.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #import #include // ---------------------------------------------------------------------------- @interface IGLShellStreamDelegateAdapter : NSObject { igl::shell::netservice::StreamAdapterApple* _owner; // weak ref } @end @implementation IGLShellStreamDelegateAdapter - (instancetype)initWithOwner:(igl::shell::netservice::StreamAdapterApple*)owner { IGL_DEBUG_ASSERT(owner); self = [super init]; if (self) { self->_owner = owner; } return self; } - (void)stream:(NSStream*)stream handleEvent:(NSStreamEvent)eventCode { using namespace igl::shell::netservice; IGL_DEBUG_ASSERT(stream == _owner->nsStream()); Stream::Event event = Stream::Event::None; switch (eventCode) { case NSStreamEventNone: event = Stream::Event::None; break; case NSStreamEventOpenCompleted: event = Stream::Event::OpenCompleted; break; case NSStreamEventHasBytesAvailable: event = Stream::Event::HasBytesAvailable; break; case NSStreamEventHasSpaceAvailable: event = Stream::Event::HasSpaceAvailable; break; case NSStreamEventErrorOccurred: event = Stream::Event::ErrorOccurred; break; case NSStreamEventEndEncountered: event = Stream::Event::EndEncountered; break; } if (_owner) { const auto& observer = _owner->stream()->observer(); if (observer) { observer(*_owner->stream(), event); } } } @end // ---------------------------------------------------------------------------- namespace igl::shell::netservice { // ---------------------------------------------------------------------------- StreamAdapterApple::~StreamAdapterApple() { delegate_ = nil; stream_ = nil; owner_ = nullptr; } bool StreamAdapterApple::initialize(Stream* owner, NSStream* stream) noexcept { IGL_DEBUG_ASSERT(owner && stream); const bool result = IGL_DEBUG_VERIFY(nullptr == owner_ && nil == stream_); if (result) { owner_ = owner; stream_ = stream; delegate_ = [[IGLShellStreamDelegateAdapter alloc] initWithOwner:this]; } return result; } void StreamAdapterApple::open() noexcept { [stream_ open]; [stream_ setDelegate:delegate_]; [stream_ scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; } Stream::Status StreamAdapterApple::status() const noexcept { auto appleStatus = [stream_ streamStatus]; switch (appleStatus) { case NSStreamStatusAtEnd: return Stream::Status::AtEnd; case NSStreamStatusClosed: return Stream::Status::Closed; case NSStreamStatusError: return Stream::Status::Error; case NSStreamStatusNotOpen: return Stream::Status::NotOpen; case NSStreamStatusOpen: return Stream::Status::Open; case NSStreamStatusOpening: return Stream::Status::Opening; case NSStreamStatusReading: return Stream::Status::Reading; case NSStreamStatusWriting: return Stream::Status::Writing; } IGL_UNREACHABLE_RETURN(Stream::Status::Error) } void StreamAdapterApple::close() noexcept { [stream_ removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [stream_ close]; } // ---------------------------------------------------------------------------- int InputStreamApple::read(uint8_t* outBuffer, size_t maxLength) const noexcept { IGL_DEBUG_ASSERT(outBuffer); return [inputStream() read:outBuffer maxLength:maxLength]; } bool InputStreamApple::getBuffer(uint8_t*& outBuffer, size_t& outLength) const noexcept { IGL_DEBUG_ASSERT(outBuffer); return [inputStream() getBuffer:&outBuffer length:&outLength]; } bool InputStreamApple::hasBytesAvailable() const noexcept { return [inputStream() hasBytesAvailable]; } // ---------------------------------------------------------------------------- int OutputStreamApple::write(const uint8_t* buffer, size_t maxLength) noexcept { IGL_DEBUG_ASSERT(buffer); return [outputStream() write:buffer maxLength:maxLength]; } bool OutputStreamApple::hasSpaceAvailable() const noexcept { return [outputStream() hasSpaceAvailable]; } // ---------------------------------------------------------------------------- } // namespace igl::shell::netservice // ---------------------------------------------------------------------------- ================================================ FILE: shell/shared/netservice/zeromq/NetServiceExtensionZeroMQ.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::shell::netservice { class NetServiceExtensionZeroMQ final : public NetServiceExtension { public: NetServiceExtensionZeroMQ() = default; ~NetServiceExtensionZeroMQ() override = default; bool initialize(Platform& platform) noexcept override; [[nodiscard]] std::unique_ptr create(std::string_view domain, std::string_view type, std::string_view name, int port) const noexcept override; void search(std::string_view domain, std::string_view type) const noexcept override; void stopSearch() noexcept; private: // NSNetServiceBrowser* netServiceBrowser_ = nil; // id netServiceBrowserDelegate_ = nil; }; IGL_API IGLShellExtension* iglShellExtensionNewIglShellNetService(); } // namespace igl::shell::netservice ================================================ FILE: shell/shared/netservice/zeromq/NetServiceZeroMQ.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include @class NSNetService; @protocol NSNetServiceDelegate; namespace igl::shell::netservice { class NetServiceZeroMQ : public NetService { public: NetServiceZeroMQ(std::string_view domain, std::string_view type, std::string_view name); NetServiceZeroMQ(NSNetService* netService); ~NetServiceZeroMQ() override; void publish() noexcept override; std::shared_ptr getInputStream() const noexcept override; std::shared_ptr getOutputStream() const noexcept override; InputStreamApple& inputStream() const noexcept { return *inputStream_; } OutputStreamApple& outputStream() const noexcept { return *outputStream_; } protected: void initialize(); private: NSNetService* netService_ = nil; id netServiceDelegateAdapter_ = nil; std::shared_ptr inputStream_; std::shared_ptr outputStream_; }; } // namespace igl::shell::netservice ================================================ FILE: shell/shared/netservice/zeromq/StreamZeroMQ.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #include //@class NSInputStream; //@class NSOutputStream; //@class NSNetService; //@class NSStream; //@protocol NSNetServiceDelegate; //@protocol NSStreamDelegate; namespace igl::shell::netservice { // ---------------------------------------------------------------------------- struct StreamAdapterZeroMQ final { ~StreamAdapterZeroMQ(); bool initialize(Stream* owner, NSStream* stream) noexcept; void open() noexcept; void close() noexcept; Stream* stream() const noexcept { return owner_; } NSStream* nsStream() const noexcept { return stream_; } private: Stream* owner_ = nullptr; // weak ref // NSStream* stream_ = nil; // id delegate_ = nil; }; // ---------------------------------------------------------------------------- struct InputStreamZeroMQ final : InputStream { void open() noexcept override { streamAdapter_.open(); } void close() noexcept override { streamAdapter_.close(); } int read(uint8_t* outBuffer, size_t maxLength) const noexcept override; bool getBuffer(uint8_t*& outBuffer, size_t& outLength) const noexcept override; bool hasBytesAvailable() const noexcept override; bool initialize(NSInputStream* stream) noexcept { return streamAdapter_.initialize(this, stream); } private: StreamAdapterZeroMQ streamAdapter_; }; // ---------------------------------------------------------------------------- struct OutputStreamZeroMQ final : OutputStream { void open() noexcept override { streamAdapter_.open(); } void close() noexcept override { streamAdapter_.close(); } int write(const uint8_t* buffer, size_t maxLength) noexcept override; bool hasSpaceAvailable() const noexcept override; bool initialize(NSOutputStream* stream) noexcept { return streamAdapter_.initialize(this, stream); } private: StreamAdapterZeroMQ streamAdapter_; }; // ---------------------------------------------------------------------------- } // namespace igl::shell::netservice ================================================ FILE: shell/shared/platform/DisplayContext.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::shell { class DisplayContext { public: float scale = 1.0f; // TODO: Transition call sites to pixelsPerPoint and remove this float pixelsPerPoint = 1.0f; // e.g. retina scale on apple platforms glm::mat4 preRotationMatrix = glm::mat4(1.0f); }; } // namespace igl::shell ================================================ FILE: shell/shared/platform/Factory.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #if IGL_PLATFORM_ANDROID #include #elif IGL_PLATFORM_LINUX #include #elif IGL_PLATFORM_MACOSX #include #elif IGL_PLATFORM_WINDOWS #include #elif IGL_PLATFORM_IOS #include #endif namespace igl::shell { std::unique_ptr createPlatform(std::shared_ptr device) { #if IGL_PLATFORM_ANDROID return std::make_unique(std::move(device)); #elif IGL_PLATFORM_LINUX return std::make_unique(std::move(device)); #elif IGL_PLATFORM_MACOSX return std::make_unique(std::move(device)); #elif IGL_PLATFORM_WINDOWS return std::make_unique(std::move(device)); #elif IGL_PLATFORM_IOS return std::make_unique(std::move(device)); #else return nullptr; #endif } } // namespace igl::shell ================================================ FILE: shell/shared/platform/Factory.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::shell { std::unique_ptr createPlatform(std::shared_ptr device); } // namespace igl::shell ================================================ FILE: shell/shared/platform/Platform.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include namespace { int gArgc = 0; char** gArgv = nullptr; #if IGL_PLATFORM_ANDROID bool gArgsInitialized = true; // Android has no argc/argv to initialize with #else bool gArgsInitialized = false; #endif } // namespace namespace igl::shell { struct Platform::State { ExtensionLoader extensionLoader; InputDispatcher inputDispatcher; DisplayContext displayContext; }; Platform::Platform() noexcept : state_(std::make_unique()) {} Platform::~Platform() = default; Extension* Platform::createAndInitializeExtension(const char* name) noexcept { return state_->extensionLoader.createAndInitialize(name, *this); } InputDispatcher& Platform::getInputDispatcher() noexcept { return state_->inputDispatcher; } [[nodiscard]] DisplayContext& Platform::getDisplayContext() noexcept { return state_->displayContext; } std::shared_ptr Platform::loadTexture(const char* filename, bool calculateMipmapLevels, TextureFormat format, igl::TextureDesc::TextureUsageBits usage) { auto imageData = getImageLoader().loadImageData(filename); return loadTexture(imageData, calculateMipmapLevels, format, usage, filename); } std::shared_ptr Platform::loadTexture(const ImageData& imageData, bool calculateMipmapLevels, TextureFormat format, igl::TextureDesc::TextureUsageBits usage, const char* debugName) { // @fb-only // For D3D12 backend: If // mipmaps are requested, we need Attachment usage so that generateMipmap can create render // targets for each mip level. auto effectiveUsage = usage; if (calculateMipmapLevels && getDevice().getBackendType() == igl::BackendType::D3D12) { effectiveUsage = static_cast( static_cast(usage) | static_cast(igl::TextureDesc::TextureUsageBits::Attachment)); } TextureDesc texDesc = igl::TextureDesc::new2D(format, imageData.desc.width, imageData.desc.height, effectiveUsage); texDesc.numMipLevels = calculateMipmapLevels ? igl::TextureDesc::calcNumMipLevels(texDesc.width, texDesc.height) : 1; texDesc.debugName = debugName; Result res; auto tex = getDevice().createTexture(texDesc, &res); IGL_DEBUG_ASSERT(res.isOk(), res.message.c_str()); IGL_DEBUG_ASSERT(tex != nullptr, "createTexture returned null for some reason"); tex->upload(tex->getFullRange(), imageData.data->data(), 0, !imageData.mipLevelBytes.empty() ? imageData.mipLevelBytes.data() : nullptr); return tex; } int Platform::argc() { IGL_DEBUG_ASSERT(gArgsInitialized, "Accessing command line args before they are initialized."); return gArgc; } char** Platform::argv() { IGL_DEBUG_ASSERT(gArgsInitialized, "Accessing command line args before they are initialized."); return gArgv; } void Platform::initializeCommandLineArgs(int argc, char** argv) { IGL_DEBUG_ASSERT(!gArgsInitialized, "Must not initialize command line arguments more than once."); gArgc = argc; gArgv = argv; gArgsInitialized = true; } } // namespace igl::shell ================================================ FILE: shell/shared/platform/Platform.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::shell { class Extension; class FileLoader; class ImageLoader; struct ImageData; class ImageWriter; class InputDispatcher; class DisplayContext; class Platform { public: Platform() noexcept; virtual ~Platform(); virtual IDevice& getDevice() noexcept = 0; [[nodiscard]] virtual std::shared_ptr getDevicePtr() const noexcept = 0; virtual ImageLoader& getImageLoader() noexcept = 0; [[nodiscard]] virtual const ImageWriter& getImageWriter() const noexcept = 0; [[nodiscard]] virtual FileLoader& getFileLoader() const noexcept = 0; virtual InputDispatcher& getInputDispatcher() noexcept; [[nodiscard]] virtual DisplayContext& getDisplayContext() noexcept; std::shared_ptr loadTexture( const char* filename, bool calculateMipmapLevels = true, TextureFormat format = igl::TextureFormat::RGBA_SRGB, igl::TextureDesc::TextureUsageBits usage = igl::TextureDesc::TextureUsageBits::Sampled); std::shared_ptr loadTexture( const ImageData& imageData, bool calculateMipmapLevels = true, TextureFormat format = igl::TextureFormat::RGBA_SRGB, igl::TextureDesc::TextureUsageBits usage = igl::TextureDesc::TextureUsageBits::Sampled, const char* debugName = ""); // 'argc' and 'argv' are the exact arguments received in 'main()'. static int argc(); static char** argv(); // Don't call this from the application level. The shell framework will use this API to expose // command line arguments for the application. static void initializeCommandLineArgs(int argc, char** argv); public: Extension* createAndInitializeExtension(const char* name) noexcept; /** * @brief Create a And Initialize object * * @return template * */ // E is the Extension type. Requirements on E // 1. The static method `const char* E::name() noexcept` must exist // 2. E must subclass from igl::shell::Extension template E* createAndInitialize() noexcept { // TODO static_assert() to enforce subclass return static_cast(createAndInitializeExtension(E::name())); } private: struct State; std::unique_ptr state_; }; } // namespace igl::shell ================================================ FILE: shell/shared/platform/android/PlatformAndroid.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #if IGL_BACKEND_VULKAN #include #include #include #include #endif namespace igl::shell { PlatformAndroid::PlatformAndroid(std::shared_ptr device, bool useFakeLoader) : device_(std::move(device)), fileLoader_(std::make_unique()), imageLoader_(std::make_unique(*fileLoader_)) { if (!useFakeLoader) { imageWriter_ = std::make_unique(); } } void PlatformAndroid::updatePreRotationMatrix() { #if IGL_BACKEND_VULKAN if (device_->getBackendType() != igl::BackendType::Vulkan) { return; } // Get the surface transform matrix getDisplayContext().preRotationMatrix = [&device = *device_]() -> glm::mat4 { auto& vulkanDevice = static_cast(device); float angle = 0.0f; switch (vulkanDevice.getVulkanContext().getSurfaceCapabilities().currentTransform) { case VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR: angle = -90.0f; break; case VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR: angle = -180.0f; break; case VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR: angle = -270.0f; break; case VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR: default: return glm::mat4(1.0f); } return glm::rotate(glm::mat4(1.0f), glm::radians(angle), glm::vec3(0.0f, 0.0f, 1.0f)); }(); #endif } IDevice& PlatformAndroid::getDevice() noexcept { return *device_; } std::shared_ptr PlatformAndroid::getDevicePtr() const noexcept { return device_; } ImageLoader& PlatformAndroid::getImageLoader() noexcept { return *imageLoader_; } const ImageWriter& PlatformAndroid::getImageWriter() const noexcept { return *imageWriter_; } FileLoader& PlatformAndroid::getFileLoader() const noexcept { return *fileLoader_; } } // namespace igl::shell ================================================ FILE: shell/shared/platform/android/PlatformAndroid.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::shell { class PlatformAndroid : public Platform { public: explicit PlatformAndroid(std::shared_ptr device, bool useFakeLoader = false); IDevice& getDevice() noexcept override; [[nodiscard]] std::shared_ptr getDevicePtr() const noexcept override; ImageLoader& getImageLoader() noexcept override; [[nodiscard]] const ImageWriter& getImageWriter() const noexcept override; [[nodiscard]] FileLoader& getFileLoader() const noexcept override; void updatePreRotationMatrix(); private: std::shared_ptr device_; std::shared_ptr fileLoader_; std::shared_ptr imageWriter_; std::shared_ptr imageLoader_; }; } // namespace igl::shell ================================================ FILE: shell/shared/platform/ios/PlatformIos.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::shell { class PlatformIos : public Platform { public: ~PlatformIos() override = default; explicit PlatformIos(std::shared_ptr device); IDevice& getDevice() noexcept override; [[nodiscard]] std::shared_ptr getDevicePtr() const noexcept override; ImageLoader& getImageLoader() noexcept override; [[nodiscard]] const ImageWriter& getImageWriter() const noexcept override; [[nodiscard]] FileLoader& getFileLoader() const noexcept override; private: std::shared_ptr device_; std::shared_ptr fileLoader_; std::shared_ptr imageLoader_; std::shared_ptr imageWriter_; }; } // namespace igl::shell ================================================ FILE: shell/shared/platform/ios/PlatformIos.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include namespace igl::shell { PlatformIos::PlatformIos(std::shared_ptr device) : device_(std::move(device)) { fileLoader_ = std::make_unique(); imageLoader_ = std::make_unique(*fileLoader_); imageWriter_ = std::make_unique(); } IDevice& PlatformIos::getDevice() noexcept { return *device_; } std::shared_ptr PlatformIos::getDevicePtr() const noexcept { return device_; } ImageLoader& PlatformIos::getImageLoader() noexcept { return *imageLoader_; } const ImageWriter& PlatformIos::getImageWriter() const noexcept { return *imageWriter_; } FileLoader& PlatformIos::getFileLoader() const noexcept { return *fileLoader_; } } // namespace igl::shell ================================================ FILE: shell/shared/platform/linux/PlatformLinux.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include namespace igl::shell { PlatformLinux::PlatformLinux(std::shared_ptr device) : device_(std::move(device)) { fileLoader_ = std::make_unique(); imageLoader_ = std::make_unique(*fileLoader_); imageWriter_ = std::make_unique(); } IDevice& PlatformLinux::getDevice() noexcept { return *device_; } std::shared_ptr PlatformLinux::getDevicePtr() const noexcept { return device_; } ImageLoader& PlatformLinux::getImageLoader() noexcept { return *imageLoader_; } const ImageWriter& PlatformLinux::getImageWriter() const noexcept { return *imageWriter_; } FileLoader& PlatformLinux::getFileLoader() const noexcept { return *fileLoader_; } } // namespace igl::shell ================================================ FILE: shell/shared/platform/linux/PlatformLinux.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::shell { class PlatformLinux : public Platform { public: explicit PlatformLinux(std::shared_ptr device); IDevice& getDevice() noexcept override; [[nodiscard]] std::shared_ptr getDevicePtr() const noexcept override; ImageLoader& getImageLoader() noexcept override; [[nodiscard]] const ImageWriter& getImageWriter() const noexcept override; [[nodiscard]] FileLoader& getFileLoader() const noexcept override; private: std::shared_ptr device_; std::shared_ptr fileLoader_; std::shared_ptr imageLoader_; std::shared_ptr imageWriter_; }; } // namespace igl::shell ================================================ FILE: shell/shared/platform/mac/PlatformMac.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include namespace igl::shell { PlatformMac::PlatformMac(std::shared_ptr device) : device_(std::move(device)) { fileLoader_ = std::make_unique(); imageLoader_ = std::make_unique(*fileLoader_); imageWriter_ = std::make_unique(); } IDevice& PlatformMac::getDevice() noexcept { return *device_; } std::shared_ptr PlatformMac::getDevicePtr() const noexcept { return device_; } ImageLoader& PlatformMac::getImageLoader() noexcept { return *imageLoader_; } const ImageWriter& PlatformMac::getImageWriter() const noexcept { return *imageWriter_; } FileLoader& PlatformMac::getFileLoader() const noexcept { return *fileLoader_; } } // namespace igl::shell ================================================ FILE: shell/shared/platform/mac/PlatformMac.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::shell { class PlatformMac : public Platform { public: explicit PlatformMac(std::shared_ptr device); IDevice& getDevice() noexcept override; [[nodiscard]] std::shared_ptr getDevicePtr() const noexcept override; ImageLoader& getImageLoader() noexcept override; [[nodiscard]] const ImageWriter& getImageWriter() const noexcept override; [[nodiscard]] FileLoader& getFileLoader() const noexcept override; private: std::shared_ptr device_; std::shared_ptr fileLoader_; std::shared_ptr imageLoader_; std::shared_ptr imageWriter_; }; } // namespace igl::shell ================================================ FILE: shell/shared/platform/win/PlatformWin.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include namespace igl::shell { PlatformWin::PlatformWin(std::shared_ptr device) : device_(std::move(device)) { fileLoader_ = std::make_unique(); imageLoader_ = std::make_unique(*fileLoader_); imageWriter_ = std::make_unique(); } IDevice& PlatformWin::getDevice() noexcept { return *device_; } std::shared_ptr PlatformWin::getDevicePtr() const noexcept { return device_; } ImageLoader& PlatformWin::getImageLoader() noexcept { return *imageLoader_; } const ImageWriter& PlatformWin::getImageWriter() const noexcept { return *imageWriter_; } FileLoader& PlatformWin::getFileLoader() const noexcept { return *fileLoader_; } } // namespace igl::shell ================================================ FILE: shell/shared/platform/win/PlatformWin.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::shell { class PlatformWin : public Platform { public: explicit PlatformWin(std::shared_ptr device); IDevice& getDevice() noexcept override; [[nodiscard]] std::shared_ptr getDevicePtr() const noexcept override; ImageLoader& getImageLoader() noexcept override; [[nodiscard]] const ImageWriter& getImageWriter() const noexcept override; [[nodiscard]] FileLoader& getFileLoader() const noexcept override; private: std::shared_ptr device_; std::shared_ptr fileLoader_; std::shared_ptr imageLoader_; std::shared_ptr imageWriter_; }; } // namespace igl::shell ================================================ FILE: shell/shared/renderSession/AppParams.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::shell { using QuadLayerParamsGetter = std::function; using PassthroughGetter = std::function; struct AppParams { DepthParams depthParams; bool exitRequested = false; float sizeX = 1.f; float sizeY = 1.f; QuadLayerParamsGetter quadLayerParamsGetter; PassthroughGetter passthroughGetter; float passthroughOpacity = 1.0f; }; } // namespace igl::shell ================================================ FILE: shell/shared/renderSession/BenchmarkTracker.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include namespace igl::shell { BenchmarkTracker::BenchmarkTracker(size_t bufferSize) : bufferCapacity_(bufferSize) { circularBuffer_.resize(bufferCapacity_, 0.0); reset(); } void BenchmarkTracker::recordRenderTime(double renderTimeMs) { // Detect hiccup before updating running average const double runningAvg = getRunningAverageMs(); if (totalSampleCount_ > 10 && runningAvg > 0) { lastFrameWasHiccup_ = (renderTimeMs > runningAvg * hiccupMultiplier_); } else { lastFrameWasHiccup_ = false; } lastRenderTimeMs_ = renderTimeMs; // Check if buffer is full and needs to overflow if (bufferCount_ >= bufferCapacity_) { flushBufferToOverflow(); } // Add sample to circular buffer circularBuffer_[bufferIndex_] = renderTimeMs; bufferIndex_ = (bufferIndex_ + 1) % bufferCapacity_; if (bufferCount_ < bufferCapacity_) { bufferCount_++; } // Update running statistics runningSum_ += renderTimeMs; totalSampleCount_++; } void BenchmarkTracker::flushBufferToOverflow() { if (bufferCount_ == 0) { return; } RenderTimeOverflowRecord record; record.sampleCount = bufferCount_; for (size_t i = 0; i < bufferCount_; ++i) { const double val = circularBuffer_[i]; record.minRenderTimeMs = std::min(record.minRenderTimeMs, val); record.maxRenderTimeMs = std::max(record.maxRenderTimeMs, val); } overflowRecords_.push_back(record); // Reset buffer state bufferIndex_ = 0; bufferCount_ = 0; } bool BenchmarkTracker::shouldGeneratePeriodicReport() const { const auto now = std::chrono::steady_clock::now(); const auto elapsed = std::chrono::duration_cast(now - lastReportTime_); return static_cast(elapsed.count()) >= reportIntervalMs_; } void BenchmarkTracker::markPeriodicReportGenerated() { lastReportTime_ = std::chrono::steady_clock::now(); } RenderTimeStats BenchmarkTracker::computeStats() const { RenderTimeStats stats; stats.totalSamples = totalSampleCount_; if (totalSampleCount_ == 0) { return stats; } // Compute from current buffer for (size_t i = 0; i < bufferCount_; ++i) { const double val = circularBuffer_[i]; stats.minRenderTimeMs = std::min(stats.minRenderTimeMs, val); stats.maxRenderTimeMs = std::max(stats.maxRenderTimeMs, val); } // Include overflow records for (const auto& record : overflowRecords_) { stats.minRenderTimeMs = std::min(stats.minRenderTimeMs, record.minRenderTimeMs); stats.maxRenderTimeMs = std::max(stats.maxRenderTimeMs, record.maxRenderTimeMs); } // Compute average stats.avgRenderTimeMs = runningSum_ / static_cast(totalSampleCount_); // Convert to FPS (avoiding division by zero) if (stats.minRenderTimeMs > 0) { stats.maxFps = 1000.0 / stats.minRenderTimeMs; } if (stats.maxRenderTimeMs > 0) { stats.minFps = 1000.0 / stats.maxRenderTimeMs; } if (stats.avgRenderTimeMs > 0) { stats.avgFps = 1000.0 / stats.avgRenderTimeMs; } // Determine hiccup threshold stats.hiccupThresholdMs = stats.avgRenderTimeMs * hiccupMultiplier_; stats.hasHiccup = lastFrameWasHiccup_; return stats; } RenderTimeStats BenchmarkTracker::computeRecentStats() const { RenderTimeStats stats; stats.totalSamples = bufferCount_; if (bufferCount_ == 0) { return stats; } double sum = 0.0; for (size_t i = 0; i < bufferCount_; ++i) { const double val = circularBuffer_[i]; stats.minRenderTimeMs = std::min(stats.minRenderTimeMs, val); stats.maxRenderTimeMs = std::max(stats.maxRenderTimeMs, val); sum += val; } stats.avgRenderTimeMs = sum / static_cast(bufferCount_); // Convert to FPS if (stats.minRenderTimeMs > 0) { stats.maxFps = 1000.0 / stats.minRenderTimeMs; } if (stats.maxRenderTimeMs > 0) { stats.minFps = 1000.0 / stats.maxRenderTimeMs; } if (stats.avgRenderTimeMs > 0) { stats.avgFps = 1000.0 / stats.avgRenderTimeMs; } stats.hiccupThresholdMs = stats.avgRenderTimeMs * hiccupMultiplier_; stats.hasHiccup = lastFrameWasHiccup_; return stats; } bool BenchmarkTracker::hasBenchmarkExpired() const { if (benchmarkDurationMs_ == 0) { return false; // No limit } return getElapsedTimeMs() >= static_cast(benchmarkDurationMs_); } double BenchmarkTracker::getElapsedTimeMs() const { const auto now = std::chrono::steady_clock::now(); return static_cast( std::chrono::duration_cast(now - startTime_).count()); } void BenchmarkTracker::setBenchmarkDuration(size_t durationMs) { benchmarkDurationMs_ = durationMs; } size_t BenchmarkTracker::getBenchmarkDuration() const { return benchmarkDurationMs_; } void BenchmarkTracker::setReportInterval(size_t intervalMs) { reportIntervalMs_ = intervalMs; } void BenchmarkTracker::setHiccupMultiplier(double multiplier) { hiccupMultiplier_ = multiplier; } void BenchmarkTracker::reset() { bufferIndex_ = 0; bufferCount_ = 0; overflowRecords_.clear(); runningSum_ = 0.0; totalSampleCount_ = 0; lastFrameWasHiccup_ = false; lastRenderTimeMs_ = 0.0; startTime_ = std::chrono::steady_clock::now(); lastReportTime_ = startTime_; } size_t BenchmarkTracker::getTotalFrameCount() const { return totalSampleCount_; } size_t BenchmarkTracker::getOverflowRecordCount() const { return overflowRecords_.size(); } bool BenchmarkTracker::wasLastFrameHiccup() const { return lastFrameWasHiccup_; } double BenchmarkTracker::getRunningAverageMs() const { if (totalSampleCount_ == 0) { return 0.0; } return runningSum_ / static_cast(totalSampleCount_); } std::string formatBenchmarkStats(const RenderTimeStats& stats, const char* prefix) { char buffer[512]; snprintf(buffer, sizeof(buffer), "%sFPS: avg=%.1f, min=%.1f, max=%.1f | " "Frame time (ms): avg=%.2f, min=%.2f, max=%.2f | " "Samples: %zu%s", prefix, stats.avgFps, stats.minFps, stats.maxFps, stats.avgRenderTimeMs, stats.minRenderTimeMs, stats.maxRenderTimeMs, stats.totalSamples, stats.hasHiccup ? " [HICCUP DETECTED]" : ""); return {buffer}; } std::string generateFinalBenchmarkReport(const BenchmarkTracker& tracker, bool wasTimeout) { const auto stats = tracker.computeStats(); const double elapsedSec = tracker.getElapsedTimeMs() / 1000.0; const double elapsedMin = elapsedSec / 60.0; std::ostringstream oss; oss << "\n"; oss << "╔══════════════════════════════════════════════════════════════════════════════╗\n"; oss << "║ IGL BENCHMARK FINAL REPORT ║\n"; oss << "╠══════════════════════════════════════════════════════════════════════════════╣\n"; if (wasTimeout) { oss << "║ Status: COMPLETED SUCCESSFULLY (benchmark timeout reached) ║\n"; } else { oss << "║ Status: COMPLETED (application terminated normally) ║\n"; } char line[128]; snprintf(line, sizeof(line), "║ Duration: %.1f minutes (%.1f seconds) ", elapsedMin, elapsedSec); oss << line << "║\n"; snprintf(line, sizeof(line), "║ Total Frames: %zu", stats.totalSamples); oss << line; // Pad to fit the box size_t len = strlen(line); for (size_t i = len; i < 80; ++i) { oss << " "; } oss << "║\n"; oss << "╠══════════════════════════════════════════════════════════════════════════════╣\n"; oss << "║ FPS Statistics: ║\n"; snprintf(line, sizeof(line), "║ Average: %.1f FPS ", stats.avgFps); oss << line << "║\n"; snprintf(line, sizeof(line), "║ Minimum: %.1f FPS ", stats.minFps); oss << line << "║\n"; snprintf(line, sizeof(line), "║ Maximum: %.1f FPS ", stats.maxFps); oss << line << "║\n"; oss << "╠══════════════════════════════════════════════════════════════════════════════╣\n"; oss << "║ Frame Time Statistics: ║\n"; snprintf(line, sizeof(line), "║ Average: %.2f ms ", stats.avgRenderTimeMs); oss << line << "║\n"; snprintf(line, sizeof(line), "║ Minimum: %.2f ms ", stats.minRenderTimeMs); oss << line << "║\n"; snprintf(line, sizeof(line), "║ Maximum: %.2f ms ", stats.maxRenderTimeMs); oss << line << "║\n"; oss << "╠══════════════════════════════════════════════════════════════════════════════╣\n"; snprintf(line, sizeof(line), "║ Overflow Records: %zu (each contains min/max from %zu samples) ", tracker.getOverflowRecordCount(), BenchmarkTracker::kDefaultBufferSize); oss << line << "║\n"; oss << "╚══════════════════════════════════════════════════════════════════════════════╝\n"; return oss.str(); } } // namespace igl::shell ================================================ FILE: shell/shared/renderSession/BenchmarkTracker.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::shell { /// @brief Stores min/max render time data when circular buffer overflows struct RenderTimeOverflowRecord { double minRenderTimeMs = std::numeric_limits::max(); double maxRenderTimeMs = 0.0; size_t sampleCount = 0; }; /// @brief Statistics computed from render time samples struct RenderTimeStats { double minRenderTimeMs = std::numeric_limits::max(); double maxRenderTimeMs = 0.0; double avgRenderTimeMs = 0.0; double minFps = 0.0; double maxFps = 0.0; double avgFps = 0.0; size_t totalSamples = 0; bool hasHiccup = false; double hiccupThresholdMs = 0.0; }; /// @brief Tracks render times and provides benchmark statistics for IGL shell /// /// This class maintains a circular buffer of render times and computes /// performance statistics including FPS metrics. When the buffer overflows, /// min/max values are preserved in overflow records to maintain historical data. class BenchmarkTracker { public: static constexpr size_t kDefaultBufferSize = 1000; static constexpr double kDefaultHiccupMultiplier = 3.0; // Frame is a hiccup if > 3x average frame time static constexpr size_t kDefaultReportIntervalMs = 60000; // 1 minute static constexpr size_t kDefaultBenchmarkDurationMs = 30 * 60 * 1000; // 30 minutes explicit BenchmarkTracker(size_t bufferSize = kDefaultBufferSize); /// @brief Records a render time sample /// @param renderTimeMs The time in milliseconds for the render call void recordRenderTime(double renderTimeMs); /// @brief Checks if it's time to generate a periodic report /// @return true if a report should be generated [[nodiscard]] bool shouldGeneratePeriodicReport() const; /// @brief Marks that a periodic report was generated void markPeriodicReportGenerated(); /// @brief Computes current statistics from all available data /// @return RenderTimeStats containing min/max/average values [[nodiscard]] RenderTimeStats computeStats() const; /// @brief Computes statistics from just the current buffer (recent samples) /// @return RenderTimeStats for recent samples only [[nodiscard]] RenderTimeStats computeRecentStats() const; /// @brief Checks if the benchmark duration has been exceeded /// @return true if the benchmark should stop [[nodiscard]] bool hasBenchmarkExpired() const; /// @brief Gets elapsed time since benchmark started /// @return Elapsed time in milliseconds [[nodiscard]] double getElapsedTimeMs() const; /// @brief Sets the benchmark duration /// @param durationMs Duration in milliseconds (0 = no limit) void setBenchmarkDuration(size_t durationMs); /// @brief Gets the benchmark duration setting /// @return Duration in milliseconds [[nodiscard]] size_t getBenchmarkDuration() const; /// @brief Sets the report interval /// @param intervalMs Interval in milliseconds between periodic reports void setReportInterval(size_t intervalMs); /// @brief Sets the hiccup detection multiplier /// @param multiplier A frame is considered a hiccup if > multiplier * average frame time void setHiccupMultiplier(double multiplier); /// @brief Resets all tracking data and restarts the benchmark timer void reset(); /// @brief Gets the total number of frames tracked (including overflowed) [[nodiscard]] size_t getTotalFrameCount() const; /// @brief Gets the number of overflow records [[nodiscard]] size_t getOverflowRecordCount() const; /// @brief Detects if the most recent frame was a significant hiccup /// @return true if the last recorded frame was a hiccup [[nodiscard]] bool wasLastFrameHiccup() const; /// @brief Gets the current running average (for hiccup detection) [[nodiscard]] double getRunningAverageMs() const; private: void flushBufferToOverflow(); [[nodiscard]] RenderTimeStats computeStatsFromBuffer(const std::vector& buffer) const; std::vector circularBuffer_; size_t bufferIndex_ = 0; size_t bufferCount_ = 0; // Actual number of samples in buffer size_t bufferCapacity_; std::vector overflowRecords_; double runningSum_ = 0.0; size_t totalSampleCount_ = 0; double hiccupMultiplier_ = kDefaultHiccupMultiplier; bool lastFrameWasHiccup_ = false; double lastRenderTimeMs_ = 0.0; std::chrono::steady_clock::time_point startTime_; std::chrono::steady_clock::time_point lastReportTime_; size_t reportIntervalMs_ = kDefaultReportIntervalMs; size_t benchmarkDurationMs_ = kDefaultBenchmarkDurationMs; }; /// @brief Generates a formatted log string for benchmark statistics /// @param stats The statistics to format /// @param prefix Optional prefix for the log line /// @return Formatted string suitable for IGL_LOG_INFO std::string formatBenchmarkStats(const RenderTimeStats& stats, const char* prefix = ""); /// @brief Generates the final benchmark report /// @param tracker The benchmark tracker with all data /// @param wasTimeout true if the benchmark ended due to timeout /// @return Formatted multi-line string for the final report std::string generateFinalBenchmarkReport(const BenchmarkTracker& tracker, bool wasTimeout); } // namespace igl::shell ================================================ FILE: shell/shared/renderSession/DefaultRenderSessionFactory.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::shell { #if IGL_PLATFORM_LINUX || IGL_PLATFORM_APPLE __attribute__((weak)) #endif // IGL_PLATFORM_LINUX std::unique_ptr createDefaultRenderSessionFactory(); } // namespace igl::shell ================================================ FILE: shell/shared/renderSession/DefaultSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace igl::shell { std::unique_ptr createDefaultRenderSession(std::shared_ptr platform); } // namespace igl::shell ================================================ FILE: shell/shared/renderSession/DepthParams.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once namespace igl::shell { struct DepthParams { float minDepth = 0.f; float maxDepth = 1.f; float nearZ = 0.1f; float farZ = 100.f; }; } // namespace igl::shell ================================================ FILE: shell/shared/renderSession/Fov.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once namespace igl::shell { struct Fov { float angleLeft = .0f; float angleRight = .0f; float angleUp = .0f; float angleDown = .0f; Fov() = default; // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) Fov(float left, float right, float up, float down) : angleLeft(left), angleRight(right), angleUp(up), angleDown(down) {} }; } // namespace igl::shell ================================================ FILE: shell/shared/renderSession/Hands.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include namespace igl::shell { struct Pose { glm::quat orientation; glm::vec3 position; }; struct Velocity { glm::vec3 linear; glm::vec3 angular; }; struct HandMesh { uint32_t vertexCountOutput = 0; std::vector vertexPositions; std::vector vertexUVs; std::vector vertexNormals; std::vector vertexBlendIndices; std::vector vertexBlendWeights; uint32_t indexCountOutput = 0; std::vector indices; uint32_t jointCountOutput = 0; std::vector jointBindPoses; }; struct HandTracking { std::vector jointPose; std::vector jointVelocity; std::vector isJointTracked; }; } // namespace igl::shell ================================================ FILE: shell/shared/renderSession/IRenderSessionFactory.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include namespace igl::shell { class Platform; class RenderSession; class IRenderSessionFactory { public: virtual ~IRenderSessionFactory() noexcept = default; // Used on desktop platforms to configure the window hosting render sessions virtual RenderSessionWindowConfig requestedWindowConfig( ShellType /* shellType */, RenderSessionWindowConfig suggestedConfig) { return suggestedConfig; } // Used to configure individual render sessions virtual std::vector requestedSessionConfigs( ShellType /* shellType */, std::vector suggestedConfigs) { std::vector requestedConfigs; requestedConfigs.reserve(suggestedConfigs.size()); for (auto& suggestedConfig : suggestedConfigs) { if (suggestedConfig.backendVersion.flavor != igl::BackendFlavor::Invalid) { requestedConfigs.push_back(suggestedConfig); } } return requestedConfigs; } virtual std::unique_ptr createRenderSession( std::shared_ptr platform) noexcept = 0; // Used on Android to get the system properties prefix for reading shell params [[nodiscard]] virtual const char* getAndroidSystemPropsPrefix() const noexcept { return "debug.iglshell.renderSession"; } }; } // namespace igl::shell ================================================ FILE: shell/shared/renderSession/QuadLayerParams.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::shell { enum class LayerBlendMode : uint8_t { Opaque = 0, AlphaBlend = 1, Custom = 2, }; struct QuadLayerInfo { glm::vec3 position{0.0f, 0.0f, 0.0f}; glm::vec2 size{1.0f, 1.0f}; LayerBlendMode blendMode = LayerBlendMode::Opaque; uint32_t imageWidth = 1024; uint32_t imageHeight = 1024; BlendFactor customSrcRGBBlendFactor = igl::BlendFactor::One; BlendFactor customSrcAlphaBlendFactor = igl::BlendFactor::One; BlendFactor customDstRGBBlendFactor = igl::BlendFactor::Zero; BlendFactor customDstAlphaBlendFactor = igl::BlendFactor::Zero; }; struct QuadLayerParams { std::vector layerInfo; [[nodiscard]] size_t numQuads() const noexcept { return layerInfo.size(); } }; } // namespace igl::shell ================================================ FILE: shell/shared/renderSession/RenderMode.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once namespace igl::shell { enum class RenderMode { Mono, DualPassStereo, // Render each eye separately SinglePassStereo, // Render both eyes at the same time }; } ================================================ FILE: shell/shared/renderSession/RenderSession.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #include namespace igl::shell { RenderSession::RenderSession(std::shared_ptr platform) : platform_(std::move(platform)), appParams_(std::make_shared()) {} void RenderSession::updateDisplayScale(float scale) noexcept { platform_->getDisplayContext().scale = scale; } float RenderSession::pixelsPerPoint() const noexcept { return platform_->getDisplayContext().pixelsPerPoint; } void RenderSession::setPixelsPerPoint(float scale) noexcept { platform_->getDisplayContext().pixelsPerPoint = scale; } const ShellParams& RenderSession::shellParams() const noexcept { static const ShellParams kSentinelParams = {}; return shellParams_ ? *shellParams_ : kSentinelParams; } const AppParams& RenderSession::appParams() const noexcept { return *appParams_; } AppParams& RenderSession::appParamsRef() noexcept { return *appParams_; } Platform& RenderSession::getPlatform() noexcept { return *platform_; } const Platform& RenderSession::getPlatform() const noexcept { return *platform_; } const std::shared_ptr& RenderSession::platform() const noexcept { return platform_; } float RenderSession::getDeltaSeconds() noexcept { const double newTime = getSeconds(); const float deltaSeconds = float(newTime - lastTime_); lastTime_ = newTime; return deltaSeconds; } double RenderSession::getSeconds() noexcept { return std::chrono::duration(std::chrono::high_resolution_clock::now().time_since_epoch()) .count(); } void RenderSession::setPreferredClearColor(const igl::Color& color) noexcept { preferredClearColor_ = color; } Color RenderSession::getPreferredClearColor() noexcept { return preferredClearColor_.has_value() ? preferredClearColor_.value() : platform()->getDevice().backendDebugColor(); } void RenderSession::initBenchmarkTracker() noexcept { if (!shellParams_ || !shellParams_->benchmarkParams.has_value()) { return; } const auto& benchmarkParams = shellParams_->benchmarkParams.value(); benchmarkTracker_ = std::make_unique(benchmarkParams.renderTimeBufferSize); benchmarkTracker_->setBenchmarkDuration(benchmarkParams.benchmarkDurationMs); benchmarkTracker_->setReportInterval(benchmarkParams.reportIntervalMs); benchmarkTracker_->setHiccupMultiplier(benchmarkParams.hiccupMultiplier); IGL_LOG_INFO("[IGL Benchmark] Benchmark tracking initialized\n"); IGL_LOG_INFO("[IGL Benchmark] Duration: %zu ms (%.1f minutes)\n", benchmarkParams.benchmarkDurationMs, benchmarkParams.benchmarkDurationMs / 60000.0); IGL_LOG_INFO("[IGL Benchmark] Report Interval: %zu ms (%.1f seconds)\n", benchmarkParams.reportIntervalMs, benchmarkParams.reportIntervalMs / 1000.0); IGL_LOG_INFO("[IGL Benchmark] Hiccup Multiplier: %.1f\n", benchmarkParams.hiccupMultiplier); IGL_LOG_INFO("[IGL Benchmark] Buffer Size: %zu samples\n", benchmarkParams.renderTimeBufferSize); } void RenderSession::recordBenchmarkFrame(double renderTimeMs) noexcept { if (!benchmarkTracker_) { return; } benchmarkTracker_->recordRenderTime(renderTimeMs); // Log hiccups immediately when detected if (benchmarkTracker_->wasLastFrameHiccup()) { IGL_LOG_INFO("[IGL Benchmark] *** HICCUP DETECTED *** Frame time: %.2f ms (avg: %.2f ms)\n", renderTimeMs, benchmarkTracker_->getRunningAverageMs()); } } void RenderSession::checkBenchmarkPeriodicReport() noexcept { if (!benchmarkTracker_) { return; } if (benchmarkTracker_->shouldGeneratePeriodicReport()) { const auto stats = benchmarkTracker_->computeStats(); const double elapsedMin = benchmarkTracker_->getElapsedTimeMs() / 60000.0; IGL_LOG_INFO("[IGL Benchmark] === Periodic Report (%.1f min elapsed) ===\n", elapsedMin); IGL_LOG_INFO("[IGL Benchmark] FPS: avg=%.1f, min=%.1f, max=%.1f\n", stats.avgFps, stats.minFps, stats.maxFps); IGL_LOG_INFO("[IGL Benchmark] Frame time (ms): avg=%.2f, min=%.2f, max=%.2f\n", stats.avgRenderTimeMs, stats.minRenderTimeMs, stats.maxRenderTimeMs); IGL_LOG_INFO("[IGL Benchmark] Total frames: %zu\n", stats.totalSamples); // Suppress unused variable warnings when logging is disabled (void)stats; (void)elapsedMin; benchmarkTracker_->markPeriodicReportGenerated(); } } bool RenderSession::isBenchmarkExpired() const noexcept { if (!benchmarkTracker_) { return false; } return benchmarkTracker_->hasBenchmarkExpired(); } void RenderSession::logFinalBenchmarkReport(bool wasTimeout) noexcept { if (!benchmarkTracker_) { return; } // Log the final report line by line to ensure it appears in logcat const auto stats = benchmarkTracker_->computeStats(); const double elapsedSec = benchmarkTracker_->getElapsedTimeMs() / 1000.0; const double elapsedMin = elapsedSec / 60.0; IGL_LOG_INFO("[IGL Benchmark] ========== FINAL BENCHMARK REPORT ==========\n"); if (wasTimeout) { IGL_LOG_INFO("[IGL Benchmark] Status: COMPLETED SUCCESSFULLY (benchmark timeout reached)\n"); } else { IGL_LOG_INFO("[IGL Benchmark] Status: COMPLETED (application terminated normally)\n"); } IGL_LOG_INFO("[IGL Benchmark] Duration: %.1f minutes (%.1f seconds)\n", elapsedMin, elapsedSec); IGL_LOG_INFO("[IGL Benchmark] Total Frames: %zu\n", stats.totalSamples); IGL_LOG_INFO("[IGL Benchmark] ---------- FPS Statistics ----------\n"); IGL_LOG_INFO("[IGL Benchmark] Average FPS: %.1f\n", stats.avgFps); IGL_LOG_INFO("[IGL Benchmark] Minimum FPS: %.1f\n", stats.minFps); IGL_LOG_INFO("[IGL Benchmark] Maximum FPS: %.1f\n", stats.maxFps); IGL_LOG_INFO("[IGL Benchmark] ---------- Frame Time Statistics ----------\n"); IGL_LOG_INFO("[IGL Benchmark] Average: %.2f ms\n", stats.avgRenderTimeMs); IGL_LOG_INFO("[IGL Benchmark] Minimum: %.2f ms\n", stats.minRenderTimeMs); IGL_LOG_INFO("[IGL Benchmark] Maximum: %.2f ms\n", stats.maxRenderTimeMs); IGL_LOG_INFO("[IGL Benchmark] Overflow Records: %zu\n", benchmarkTracker_->getOverflowRecordCount()); IGL_LOG_INFO("[IGL Benchmark] ===============================================\n"); // Suppress unused variable warnings when logging is disabled (void)stats; (void)elapsedSec; (void)elapsedMin; (void)wasTimeout; } void RenderSession::runUpdate(SurfaceTextures surfaceTextures) noexcept { // Check if frozen (frame gate) if (frozen_) { return; } // Initialize benchmark tracker on first call if not already done if (shellParams_ && shellParams_->benchmarkParams.has_value() && !benchmarkTracker_) { initBenchmarkTracker(); } // Debug: Log once if benchmark params are missing if (!loggedMissingParams_ && !benchmarkTracker_) { if (!shellParams_) { IGL_LOG_INFO("[IGL Benchmark] WARNING: shellParams_ is null, benchmark tracking disabled\n"); } else if (!shellParams_->benchmarkParams.has_value()) { IGL_LOG_INFO( "[IGL Benchmark] WARNING: benchmarkParams not set, benchmark tracking disabled\n"); IGL_LOG_INFO( "[IGL Benchmark] Use --benchmark flag or set " "debug.iglshell.renderSession.benchmark=true\n"); } loggedMissingParams_ = true; } // Check freeze-at-frame gate if (shellParams_ && shellParams_->freezeAtFrame != ~0u && frameCount_ >= shellParams_->freezeAtFrame) { frozen_ = true; IGL_LOG_INFO("[IGL Shell] Frozen at frame %u\n", shellParams_->freezeAtFrame); return; } // Measure render time for benchmarking const double startTime = getSeconds(); // Call the actual update implementation update(std::move(surfaceTextures)); // Record benchmark frame timing if tracker is active if (benchmarkTracker_) { const double endTime = getSeconds(); const double renderTimeMs = (endTime - startTime) * 1000.0; recordBenchmarkFrame(renderTimeMs); // Check for periodic benchmark reporting checkBenchmarkPeriodicReport(); // Check if benchmark has expired (only log once) if (benchmarkTracker_->hasBenchmarkExpired() && !benchmarkExpiredLogged_) { IGL_LOG_INFO("[IGL Benchmark] Benchmark duration expired, requesting exit\n"); logFinalBenchmarkReport(true); appParamsRef().exitRequested = true; benchmarkExpiredLogged_ = true; } } // FPS throttling if (shellParams_ && shellParams_->fpsThrottleMs > 0) { const double endTime = getSeconds(); const double frameTimeMs = (endTime - startTime) * 1000.0; const double targetMs = shellParams_->fpsThrottleRandom ? static_cast(1 + (std::rand() % shellParams_->fpsThrottleMs)) : static_cast(shellParams_->fpsThrottleMs); if (frameTimeMs < targetMs) { std::this_thread::sleep_for( std::chrono::milliseconds(static_cast(targetMs - frameTimeMs))); } } frameCount_++; } } // namespace igl::shell ================================================ FILE: shell/shared/renderSession/RenderSession.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::shell { struct AppParams; struct ShellParams; class RenderSession { public: explicit RenderSession(std::shared_ptr platform); virtual ~RenderSession() noexcept = default; // Enable move operations (unique_ptr requires explicit declaration) RenderSession(RenderSession&&) noexcept = default; RenderSession& operator=(RenderSession&&) noexcept = default; // Disable copy operations RenderSession(const RenderSession&) = delete; RenderSession& operator=(const RenderSession&) = delete; virtual void initialize() noexcept {} // NOLINTNEXTLINE(performance-unnecessary-value-param) virtual void update(IGL_MAYBE_UNUSED SurfaceTextures surfaceTextures) noexcept {} /// @brief Wrapper around update() that automatically handles benchmark timing /// Platform code should call this instead of update() directly when benchmark /// tracking is desired. This method: /// 1. Measures the time taken by update() /// 2. Records the frame time for benchmarking /// 3. Checks for periodic reporting /// 4. Checks for benchmark expiration and sets exitRequested if needed void runUpdate(SurfaceTextures surfaceTextures) noexcept; virtual void teardown() noexcept {} void updateDisplayScale(float scale) noexcept; [[nodiscard]] float pixelsPerPoint() const noexcept; void setPixelsPerPoint(float scale) noexcept; virtual void setShellParams(const ShellParams& shellParams) noexcept { shellParams_ = &shellParams; } /// @brief Params provided to the session by the host /// @remark Params may vary each frame. [[nodiscard]] const ShellParams& shellParams() const noexcept; /// @brief Params provided by the session to the host. /// @remark Params may vary each frame. [[nodiscard]] const AppParams& appParams() const noexcept; void setCurrentQuadLayer(size_t layer) noexcept { currentQuadLayer_ = layer; } /// return the number of seconds since the last call float getDeltaSeconds() noexcept; static double getSeconds() noexcept; virtual ICommandQueue* getCommandQueue() noexcept { return commandQueue_.get(); } std::shared_ptr getFramebuffer() noexcept { return framebuffer_; } void releaseFramebuffer() { framebuffer_ = nullptr; } void setPreferredClearColor(const igl::Color& color) noexcept; Color getPreferredClearColor() noexcept; /// @brief Initializes the benchmark tracker based on shell params /// Call this after shellParams_ is set to enable benchmark tracking void initBenchmarkTracker() noexcept; /// @brief Records a frame's render time for benchmarking /// @param renderTimeMs The time in milliseconds for the update call void recordBenchmarkFrame(double renderTimeMs) noexcept; /// @brief Checks and handles periodic benchmark reporting /// Logs stats every minute if benchmark mode is enabled void checkBenchmarkPeriodicReport() noexcept; /// @brief Checks if the benchmark has expired and should trigger app exit /// @return true if benchmark duration exceeded [[nodiscard]] bool isBenchmarkExpired() const noexcept; /// @brief Generates and logs the final benchmark report /// @param wasTimeout true if the benchmark ended due to timeout void logFinalBenchmarkReport(bool wasTimeout) noexcept; /// @brief Gets the benchmark tracker (may be nullptr if not in benchmark mode) [[nodiscard]] BenchmarkTracker* getBenchmarkTracker() noexcept { return benchmarkTracker_.get(); } /// @brief Returns mutable reference to AppParams (for benchmark to request exit) [[nodiscard]] AppParams& appParamsRef() noexcept; protected: Platform& getPlatform() noexcept; [[nodiscard]] const Platform& getPlatform() const noexcept; [[nodiscard]] const std::shared_ptr& platform() const noexcept; std::shared_ptr framebuffer_; std::shared_ptr commandQueue_; size_t currentQuadLayer_ = 0; double lastTime_ = getSeconds(); private: std::shared_ptr platform_; std::shared_ptr appParams_; std::optional preferredClearColor_; const ShellParams* shellParams_ = nullptr; std::unique_ptr benchmarkTracker_; uint32_t frameCount_ = 0; bool benchmarkExpiredLogged_ = false; bool loggedMissingParams_ = false; bool frozen_ = false; }; } // namespace igl::shell ================================================ FILE: shell/shared/renderSession/RenderSessionConfig.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::shell { struct RenderSessionConfig { std::string displayName; BackendVersion backendVersion; TextureFormat swapchainColorTextureFormat = igl::TextureFormat::BGRA_UNorm8; TextureFormat depthTextureFormat = igl::TextureFormat::Z_UNorm16; ColorSpace swapchainColorSpace = igl::ColorSpace::SRGB_NONLINEAR; }; } // namespace igl::shell ================================================ FILE: shell/shared/renderSession/RenderSessionLoader.hpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::shell { class RenderSession; class Platform; using RenderSessionLoader = std::function(std::shared_ptr)>; } // namespace igl::shell ================================================ FILE: shell/shared/renderSession/RenderSessionRegistry.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace igl::shell { bool RenderSessionRegistry::contains(const std::string& loaderName) const noexcept { return loaders_.find(loaderName) != loaders_.cend(); } bool RenderSessionRegistry::empty() const noexcept { return loaders_.empty(); } size_t RenderSessionRegistry::size() const noexcept { return loaders_.size(); } RenderSessionLoader& RenderSessionRegistry::findLoader(const std::string& loaderName) noexcept { if (auto it = loaders_.find(loaderName); IGL_DEBUG_VERIFY(it != loaders_.end())) { return it->second; } IGL_LOG_ERROR("Could not find RenderSessionLoader for (%s)\n", loaderName.c_str()); static RenderSessionLoader sSentinelLoader; return sSentinelLoader; } void RenderSessionRegistry::registerLoader(const std::string& loaderName, RenderSessionLoader value) noexcept { loaders_[loaderName] = std::move(value); } const std::string& RenderSessionRegistry::defaultLoaderName() const noexcept { return defaultLoaderName_; } void RenderSessionRegistry::setDefaultLoaderName(std::string loaderName) noexcept { defaultLoaderName_ = std::move(loaderName); } } // namespace igl::shell ================================================ FILE: shell/shared/renderSession/RenderSessionRegistry.hpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::shell { class RenderSessionRegistry { public: bool contains(const std::string& loaderName) const noexcept; bool empty() const noexcept; size_t size() const noexcept; RenderSessionLoader& findLoader(const std::string& loaderName) noexcept; void registerLoader(const std::string& loaderName, RenderSessionLoader value) noexcept; const std::string& defaultLoaderName() const noexcept; void setDefaultLoaderName(std::string loaderName) noexcept; private: std::unordered_map loaders_; std::string defaultLoaderName_; }; } // namespace igl::shell ================================================ FILE: shell/shared/renderSession/RenderSessionWindowConfig.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::shell { enum class WindowMode { Window, MaximizedWindow, Fullscreen, }; struct RenderSessionWindowConfig { uint32_t width = 1024; uint32_t height = 768; WindowMode windowMode = WindowMode::Window; }; } // namespace igl::shell ================================================ FILE: shell/shared/renderSession/ScreenshotTestRenderSessionHelper.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace igl::shell { void saveFrameBufferToPng(const char* absoluteFilename, const std::shared_ptr& framebuffer, Platform& platform) { auto drawableSurface = framebuffer->getColorAttachment(0); auto frameBufferSize = drawableSurface->getDimensions(); const int bytesPerPixel = 4; const auto rangeDesc = TextureRangeDesc::new2D(0, 0, frameBufferSize.width, frameBufferSize.height); ImageData imageData; imageData.desc.format = drawableSurface->getFormat(); imageData.desc.width = frameBufferSize.width; imageData.desc.height = frameBufferSize.height; auto buffer = std::make_unique(frameBufferSize.width * frameBufferSize.height * bytesPerPixel); const CommandQueueDesc desc{}; auto commandQueue = platform.getDevice().createCommandQueue(desc, nullptr); framebuffer->copyBytesColorAttachment(*commandQueue, 0, buffer.get(), rangeDesc); const size_t numPixels = frameBufferSize.width * frameBufferSize.height * bytesPerPixel; #if IGL_PLATFORM_WINDOWS if (imageData.desc.format == TextureFormat::BGRA_UNorm8) { // Swap B and R channels, as image writer expects RGBA. // Note that this is only defined for the Windows platform, as in practice // BGRA might only be used there for render targets. for (size_t i = 0; i < numPixels; i += bytesPerPixel) { std::swap(buffer.get()[i], buffer.get()[i + 2]); } } #endif imageData.data = iglu::textureloader::IData::tryCreate(std::move(buffer), numPixels, nullptr); IGLLog(IGLLogInfo, "Writing screenshot to: '%s'\n", absoluteFilename); platform.getImageWriter().writeImage(absoluteFilename, imageData); } } // namespace igl::shell ================================================ FILE: shell/shared/renderSession/ScreenshotTestRenderSessionHelper.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl { class IFramebuffer; } // namespace igl namespace igl::shell { void saveFrameBufferToPng(const char* absoluteFilename, const std::shared_ptr& framebuffer, Platform& platform); } // namespace igl::shell ================================================ FILE: shell/shared/renderSession/ShaderProvider.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include namespace igl::shell { class IShaderProvider { public: [[nodiscard]] virtual ShaderStage getStage() const = 0; [[nodiscard]] virtual std::string getShaderText(const IDevice& device) const = 0; [[nodiscard]] virtual std::vector getShaderBinary(const IDevice& device) const = 0; virtual ~IShaderProvider() = default; }; } // namespace igl::shell ================================================ FILE: shell/shared/renderSession/ShaderStagesCreator.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "ShaderStagesCreator.h" namespace igl::shell { namespace { const char* getEntryPointName(ShaderStage stage, BackendType backendType) { switch (backendType) { case igl::BackendType::Metal: switch (stage) { case igl::ShaderStage::Vertex: return "vertexMain"; case igl::ShaderStage::Fragment: return "fragmentMain"; case igl::ShaderStage::Compute: return "computeMain"; case igl::ShaderStage::Task: return "taskMain"; case igl::ShaderStage::Mesh: return "meshMain"; } case igl::BackendType::Vulkan: return "main"; default: return "main"; } } ShaderModuleInfo getShaderModuleInfo(ShaderStage stage, BackendType backendType) { return {.stage = stage, .entryPoint = getEntryPointName(stage, backendType)}; } } // namespace std::unique_ptr createRenderPipelineStages( const igl::IDevice& device, const IShaderProvider& vertShaderProvider, const IShaderProvider& fragShaderProvider) { Result result; auto backend = device.getBackendType(); if (backend == igl::BackendType::Vulkan) { auto vertWords = vertShaderProvider.getShaderBinary(device); auto fragWords = vertShaderProvider.getShaderBinary(device); auto vertModule = igl::ShaderModuleCreator::fromBinaryInput( device, vertWords.data(), vertWords.size() * sizeof(uint32_t), getShaderModuleInfo(igl::ShaderStage::Vertex, backend), "", &result); auto fragModule = igl::ShaderModuleCreator::fromBinaryInput( device, fragWords.data(), fragWords.size() * sizeof(uint32_t), getShaderModuleInfo(igl::ShaderStage::Fragment, backend), "", &result); return igl::ShaderStagesCreator::fromRenderModules( device, std::move(vertModule), std::move(fragModule), &result); } else { auto vertModule = igl::ShaderModuleCreator::fromStringInput( device, vertShaderProvider.getShaderText(device).c_str(), getShaderModuleInfo(igl::ShaderStage::Vertex, backend), "", &result); auto fragModule = igl::ShaderModuleCreator::fromStringInput( device, fragShaderProvider.getShaderText(device).c_str(), getShaderModuleInfo(igl::ShaderStage::Fragment, backend), "", &result); return igl::ShaderStagesCreator::fromRenderModules( device, std::move(vertModule), std::move(fragModule), &result); } } std::unique_ptr createComputePipelineStages( const igl::IDevice& device, const IShaderProvider& compShaderProvider) { Result result; auto backend = device.getBackendType(); if (backend == igl::BackendType::Vulkan) { auto compWords = compShaderProvider.getShaderBinary(device); auto compModule = igl::ShaderModuleCreator::fromBinaryInput( device, compWords.data(), compWords.size() * sizeof(uint32_t), getShaderModuleInfo(igl::ShaderStage::Compute, backend), "", &result); return igl::ShaderStagesCreator::fromComputeModule(device, std::move(compModule), &result); } else { auto compModule = igl::ShaderModuleCreator::fromStringInput( device, compShaderProvider.getShaderText(device).c_str(), getShaderModuleInfo(igl::ShaderStage::Compute, backend), "", &result); return igl::ShaderStagesCreator::fromComputeModule(device, std::move(compModule), &result); } } } // namespace igl::shell ================================================ FILE: shell/shared/renderSession/ShaderStagesCreator.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::shell { std::unique_ptr createRenderPipelineStages( const igl::IDevice& device, const IShaderProvider& vertShaderProvider, const IShaderProvider& fragShaderProvider); std::unique_ptr createComputePipelineStages( const igl::IDevice& device, const IShaderProvider& compShaderProvider); } // namespace igl::shell ================================================ FILE: shell/shared/renderSession/ShellParams.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include namespace igl::shell { namespace { std::optional parseBenchmarkRenderSessionParams( const std::vector& args) { // Flag to track if any benchmark-related parameters were found bool benchmarkParamsFound = false; // Create a params struct with default values BenchmarkRenderSessionParams benchmarkParams; // Parse command line arguments for (size_t i = 0; i < args.size(); i++) { const std::string& arg = args[i]; // Check for timeout parameter if (arg == "--timeout" || arg == "-t") { if (i + 1 < args.size()) { benchmarkParams.renderSessionTimeoutMs = std::stoul(args[++i]); benchmarkParamsFound = true; } } // Check for number of sessions parameter else if (arg == "--sessions" || arg == "-s") { if (i + 1 < args.size()) { benchmarkParams.numSessionsToRun = std::stoul(args[++i]); benchmarkParamsFound = true; } } // Check for log reporter flag else if (arg == "--log-reporter" || arg == "-l") { benchmarkParams.logReporter = true; benchmarkParamsFound = true; } // Check for offscreen rendering flag else if (arg == "--offscreen-only" || arg == "-o") { benchmarkParams.offscreenRenderingOnly = true; benchmarkParamsFound = true; } // Check for benchmark mode flag (enables benchmark mode without specific params) else if (arg == "--benchmark" || arg == "-b") { benchmarkParamsFound = true; } // Check for benchmark duration (time of run) parameter else if (arg == "--benchmark-duration" || arg == "--run-time") { if (i + 1 < args.size()) { benchmarkParams.benchmarkDurationMs = std::stoul(args[++i]); benchmarkParamsFound = true; } } // Check for report interval parameter else if (arg == "--report-interval") { if (i + 1 < args.size()) { benchmarkParams.reportIntervalMs = std::stoul(args[++i]); benchmarkParamsFound = true; } } // Check for hiccup multiplier parameter else if (arg == "--hiccup-multiplier") { if (i + 1 < args.size()) { benchmarkParams.hiccupMultiplier = std::stod(args[++i]); benchmarkParamsFound = true; } } // Check for render time buffer size parameter else if (arg == "--render-buffer-size") { if (i + 1 < args.size()) { benchmarkParams.renderTimeBufferSize = std::stoul(args[++i]); benchmarkParamsFound = true; } } // Check for custom parameters in the form --key value else if (arg.rfind("--", 0) == 0) { std::string key = arg.substr(2); // Remove "--" prefix std::string value; if (i + 1 < args.size() && args[i + 1].rfind("--", 0) != 0) { // Next argument is the value (not another flag) value = args[++i]; } benchmarkParams.customParams.emplace_back(key, value); } } // Return the params if any benchmark-related parameters were found, otherwise return nullopt return benchmarkParamsFound ? std::optional(benchmarkParams) : std::nullopt; } } // namespace std::vector convertArgvToParams(int argc, char** argv) { std::vector args; args.reserve(argc); for (int i = 0; i < argc; i++) { args.emplace_back(argv[i]); } return args; } void parseShellParams(const std::vector& args, ShellParams& shellParams) { // Parse benchmark parameters using existing function // Only override benchmarkParams if command line args specify benchmark parameters auto parsedBenchmarkParams = parseBenchmarkRenderSessionParams(args); if (parsedBenchmarkParams.has_value()) { shellParams.benchmarkParams = parsedBenchmarkParams; } // Parse other shell parameters for (size_t i = 0; i < args.size(); i++) { const std::string& arg = args[i]; if (arg == "--headless") { shellParams.isHeadless = true; shellParams.screenshotNumber = shellParams.screenshotNumber != ~0 ? shellParams.screenshotNumber : 0; } else if (arg == "--disable-vulkan-validation-layers") { shellParams.enableVulkanValidationLayers = false; } else if (arg == "--screenshot-file") { if (i + 1 < args.size()) { shellParams.screenshotFileName = args[++i]; } } else if (arg == "--screenshot-number") { if (i + 1 < args.size()) { shellParams.screenshotNumber = static_cast(std::stoi(args[++i])); } } else if (arg == "--viewport-size") { if (i + 1 < args.size()) { const std::string& value = args[++i]; unsigned int w = 0; unsigned int h = 0; if (sscanf(value.c_str(), "%ux%u", &w, &h) == 2) { if (w && h) { shellParams.viewportSize = glm::vec2(w, h); } } } } else if (arg == "--fps-throttle") { if (i + 1 < args.size()) { shellParams.fpsThrottleMs = static_cast(std::stoi(args[++i])); } } else if (arg == "--fps-throttle-random") { shellParams.fpsThrottleRandom = true; } else if (arg == "--freeze-at-frame") { if (i + 1 < args.size()) { shellParams.freezeAtFrame = static_cast(std::stoi(args[++i])); } } else if (arg == "--use-timer-rendering") { shellParams.useTimerRendering = true; } } } } // namespace igl::shell ================================================ FILE: shell/shared/renderSession/ShellParams.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include #include #include #include #include namespace igl::shell { struct BenchmarkRenderSessionParams { size_t renderSessionTimeoutMs = 2000; size_t numSessionsToRun = 10; bool logReporter = false; bool offscreenRenderingOnly = false; std::vector> customParams; /// @brief Duration for the benchmark run in milliseconds (default: 30 minutes) /// When this time elapses, the benchmark will complete and generate a final report. /// Set to 0 for no time limit. size_t benchmarkDurationMs = 30 * 60 * 1000; /// @brief Interval between periodic FPS reports in milliseconds (default: 1 minute) size_t reportIntervalMs = 2 * 1000; /// @brief Multiplier for hiccup detection: frame time > avgFrameTime * multiplier = hiccup double hiccupMultiplier = 3.0; /// @brief Size of the circular buffer for storing render times size_t renderTimeBufferSize = 1000; }; struct ShellParams { std::vector viewParams; RenderMode renderMode = RenderMode::Mono; bool shellControlsViewParams = false; bool rightHandedCoordinateSystem = false; glm::vec2 viewportSize = glm::vec2(1024.0f, 768.0f); glm::ivec2 nativeSurfaceDimensions = glm::ivec2(2048, 1536); float viewportScale = 1.f; bool shouldPresent = true; std::optional clearColorValue = {}; std::array handMeshes = {}; std::array handTracking = {}; std::string screenshotFileName = "screenshot.png"; uint32_t screenshotNumber = ~0u; // frame number to save as a screenshot in headless more bool isHeadless = false; bool enableVulkanValidationLayers = true; std::optional benchmarkParams = {}; // FPS throttling for testing race conditions uint32_t fpsThrottleMs = 0; // 0 = disabled, >0 = delay in milliseconds per frame uint32_t freezeAtFrame = ~0u; // frame number to freeze at (~0u = disabled) bool fpsThrottleRandom = false; // if true, throttle is random in range [1, fpsThrottleMs] bool useTimerRendering = false; // use external display link for rendering (macOS Metal) }; std::vector convertArgvToParams(int argc, char** argv); void parseShellParams(const std::vector& args, ShellParams& shellParams); } // namespace igl::shell ================================================ FILE: shell/shared/renderSession/ShellType.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once namespace igl::shell { enum class ShellType { Mac, iOS, // NOLINT(readability-identifier-naming) Android, OpenXR, Windows, }; } // namespace igl::shell ================================================ FILE: shell/shared/renderSession/ViewParams.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::shell { struct ViewParams { glm::mat4 viewMatrix = glm::mat4(1); glm::vec3 cameraPosition = glm::vec3(0); Fov fov; uint8_t viewIndex = 0; }; } // namespace igl::shell ================================================ FILE: shell/shared/testShell/TestShell.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #if IGL_PLATFORM_ANDROID #include #endif #if IGL_PLATFORM_IOS #include #endif #if IGL_PLATFORM_LINUX #include #endif #if IGL_PLATFORM_MACOSX #include #endif #if IGL_PLATFORM_WINDOWS #include #endif #include #include #include namespace igl::shell { namespace { std::shared_ptr createTestDevice() { const std::string backend(IGL_BACKEND_TYPE); if (backend == "ogl") { #ifdef IGL_UNIT_TESTS_GLES_VERSION return tests::util::device::createTestDevice(::igl::BackendType::OpenGL, {.flavor = BackendFlavor::OpenGL_ES, .majorVersion = IGL_UNIT_TESTS_GLES_VERSION, .minorVersion = 0}); #else return tests::util::device::createTestDevice(::igl::BackendType::OpenGL); #endif } else if (backend == "metal") { return tests::util::device::createTestDevice(::igl::BackendType::Metal); } else if (backend == "vulkan") { return tests::util::device::createTestDevice(::igl::BackendType::Vulkan); // @fb-only // @fb-only // @fb-only return nullptr; } } void ensureCommandLineArgsInitialized() { // Fake initialization of command line args so sessions don't assert when accessing them. // Only do it once, otherwise it triggers an internal assert. #if IGL_PLATFORM_ANDROID static bool sInitialized = true; // Android prohibits initialization of command line args #else static bool sInitialized = false; #endif if (!sInitialized) { sInitialized = true; igl::shell::Platform::initializeCommandLineArgs(0, nullptr); } } } // namespace void TestShellBase::setUpInternal(ScreenSize screenSize, bool prefersRGB) { ensureCommandLineArgsInitialized(); // Create igl device for requested backend std::shared_ptr iglDevice = createTestDevice(); ASSERT_TRUE(iglDevice != nullptr); // Create platform shell to run the tests with #if defined(IGL_PLATFORM_MACOSX) && IGL_PLATFORM_MACOSX platform_ = std::make_shared(std::move(iglDevice)); #elif defined(IGL_PLATFORM_IOS) && IGL_PLATFORM_IOS platform_ = std::make_shared(std::move(iglDevice)); #elif defined(IGL_PLATFORM_WINDOWS) && IGL_PLATFORM_WINDOWS platform_ = std::make_shared(std::move(iglDevice)); #elif defined(IGL_PLATFORM_ANDROID) && IGL_PLATFORM_ANDROID platform_ = std::make_shared(std::move(iglDevice)); #elif defined(IGL_PLATFORM_LINUX) && IGL_PLATFORM_LINUX platform_ = std::make_shared(std::move(iglDevice)); #endif IGL_DEBUG_ASSERT(platform_); if (platform_->getDevice().getBackendType() == igl::BackendType::OpenGL) { auto version = platform_->getDevice().getBackendVersion(); if (version.majorVersion < 2) { GTEST_SKIP() << "OpenGL version " << (int)version.majorVersion << "." << (int)version.minorVersion << " is too low"; } } // Create an offscreen texture to render to Result ret; auto hasNativesRGBSupport = platform_->getDevice().hasFeature(DeviceFeatures::SRGB); auto colorFormat = prefersRGB && hasNativesRGBSupport ? igl::TextureFormat::RGBA_SRGB : igl::TextureFormat::RGBA_UNorm8; TextureDesc texDesc = igl::TextureDesc::new2D(colorFormat, screenSize.width, screenSize.height, igl::TextureDesc::TextureUsageBits::Sampled | igl::TextureDesc::TextureUsageBits::Attachment); offscreenTexture_ = platform_->getDevice().createTexture(texDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(offscreenTexture_ != nullptr); TextureDesc depthDextureDesc = igl::TextureDesc::new2D( igl::TextureFormat::Z_UNorm24, screenSize.width, screenSize.height, igl::TextureDesc::TextureUsageBits::Sampled | igl::TextureDesc::TextureUsageBits::Attachment); depthDextureDesc.storage = igl::ResourceStorage::Private; offscreenDepthTexture_ = platform_->getDevice().createTexture(depthDextureDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(offscreenDepthTexture_ != nullptr); } void TestShell::run(RenderSession& session, size_t numFrames) { ShellParams shellParams; session.setShellParams(shellParams); session.initialize(); for (size_t i = 0; i < numFrames; ++i) { const igl::DeviceScope scope(platform_->getDevice()); session.update({.color = offscreenTexture_, .depth = offscreenDepthTexture_}); } session.teardown(); } } // namespace igl::shell ================================================ FILE: shell/shared/testShell/TestShell.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include namespace igl::shell { struct ScreenSize { size_t width; size_t height; }; class TestShellBase { public: TestShellBase() = default; virtual ~TestShellBase() = default; protected: void setUpInternal(ScreenSize screenSize = {.width = 1, .height = 1}, bool prefersRGB = true); void tearDownInternal() {} std::shared_ptr platform_; std::shared_ptr offscreenTexture_; std::shared_ptr offscreenDepthTexture_; }; class TestShell : public ::testing::Test, public TestShellBase { public: void SetUp() override { setUpInternal(); } void TearDown() override { tearDownInternal(); } void run(RenderSession& session, size_t numFrames); }; } // namespace igl::shell ================================================ FILE: shell/windows/CMakeLists.txt ================================================ # Copyright (c) Meta Platforms, Inc. and affiliates. # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. cmake_minimum_required(VERSION 3.19) set(PROJECT_NAME "Desktop") add_definitions("-DNOMINMAX") add_definitions("-D_USE_MATH_DEFINES=1") file(GLOB PLATFORM_SHARED_SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ../shared/fileLoader/win/*.cpp ../shared/imageWriter/win/*.cpp ../shared/imageWriter/stb/*.cpp ../shared/platform/win/*.cpp common/*.cpp) file(GLOB PLATFORM_SHARED_HEADER_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ../shared/fileLoader/win/*.h ../shared/imageWriter/win/*.h ../shared/imageWriter/stb/*.h ../shared/platform/win/*.h common/*.h) add_library(IGLShellPlatform ${PLATFORM_SHARED_SRC_FILES} ${PLATFORM_SHARED_HEADER_FILES}) target_link_libraries(IGLShellPlatform PUBLIC IGLLibrary) target_link_libraries(IGLShellPlatform PUBLIC glfw) target_link_libraries(IGLShellPlatform PUBLIC IGLShellShared) igl_set_folder(IGLShellPlatform "IGL") igl_set_cxxstd(IGLShellPlatform 20) function(ADD_SHELL_APP backend) add_library(IGLShellApp_${backend} ${CMAKE_CURRENT_SOURCE_DIR}/../windows/${backend}/App.cpp) target_link_libraries(IGLShellApp_${backend} PUBLIC IGLShellPlatform) igl_set_folder(IGLShellApp_${backend} "IGL Shell App/${backend}") igl_set_cxxstd(IGLShellApp_${backend} 20) endfunction() if(IGL_WITH_VULKAN) add_shell_app(vulkan) endif() if(IGL_WITH_OPENGL) add_shell_app(opengl) endif() if(IGL_WITH_OPENGLES) add_shell_app(opengles) endif() # Only add D3D12 shell app if the sources are present (removed in this branch) set(IGL_D3D12_APP_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/../windows/d3d12/App.cpp") if(IGL_WITH_D3D12 AND EXISTS "${IGL_D3D12_APP_SOURCE}") add_shell_app(d3d12) target_link_libraries(IGLShellApp_d3d12 PUBLIC IGLD3D12) endif() function(ADD_SHELL_SESSION_BACKEND targetApp backend srcs libs) set(target ${targetApp}_${backend}) add_executable(${target} ${srcs}) igl_set_folder(${target} "IGL Shell Sessions/${backend}") igl_set_cxxstd(${target} 20) target_compile_definitions(${target} PRIVATE "IGL_SHELL_SESSION=${targetApp}") target_link_libraries(${target} PUBLIC ${libs}) target_link_libraries(${target} PUBLIC IGLShellApp_${backend}) # Copy dxil.dll for D3D12 executables (required for DXIL signing) if(backend STREQUAL "d3d12" AND WIN32 AND MSVC) find_file(DXIL_DLL_FOR_${target} NAMES dxil.dll PATHS "C:/Program Files (x86)/Windows Kits/10/bin/10.0.22621.0/x64" "C:/Program Files (x86)/Windows Kits/10/bin/10.0.22000.0/x64" "C:/Program Files (x86)/Windows Kits/10/bin/10.0.19041.0/x64" "$ENV{WindowsSdkBinPath}/x64" NO_DEFAULT_PATH ) if(DXIL_DLL_FOR_${target}) add_custom_command(TARGET ${target} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${DXIL_DLL_FOR_${target}}" "$/" COMMENT "Copying dxil.dll for ${target}" ) endif() endif() endfunction() function(ADD_SHELL_SESSION_BACKEND_OPENXR_SIM targetApp backend srcs libs compileDefs) set(target ${targetApp}_${backend}_openxr_sim) add_executable(${target} ${srcs}) igl_set_folder(${target} "IGL Shell Sessions/${backend}_openxr_sim") igl_set_cxxstd(${target} 20) target_compile_definitions(${target} PRIVATE "IGL_SHELL_SESSION=${targetApp}" ${compileDefs}) target_include_directories(${target} PRIVATE "${IGL_ROOT_DIR}/third-party/deps/src/openxr-sdk/src/common") target_link_libraries(${target} PUBLIC IGLShellOpenXR_sim_${backend} IGLShellShared IGLShellPlatform Shcore.lib ${libs}) endfunction() macro(ADD_SHELL_SESSION_WITH_SRCS target srcs libs) if(IGL_WITH_VULKAN) add_shell_session_backend(${target} vulkan "${srcs}" "${libs}") endif() if(IGL_WITH_OPENGL) add_shell_session_backend(${target} opengl "${srcs}" "${libs}") endif() if(IGL_WITH_OPENGLES) add_shell_session_backend(${target} opengles "${srcs}" "${libs}") endif() if(IGL_WITH_D3D12 AND TARGET IGLShellApp_d3d12) add_shell_session_backend(${target} d3d12 "${srcs}" "${libs}") endif() endmacro() ================================================ FILE: shell/windows/common/GlfwShell.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include #include #include #include #include #include #include #include namespace igl::shell { namespace { void glfwErrorHandler(int error, const char* description) { IGL_LOG_ERROR("GLFW Error: %s\n", description); } MouseButton getIGLMouseButton(int button) { if (button == GLFW_MOUSE_BUTTON_LEFT) { return igl::shell::MouseButton::Left; } if (button == GLFW_MOUSE_BUTTON_RIGHT) { return igl::shell::MouseButton::Right; } return igl::shell::MouseButton::Middle; } } // namespace GlfwShell::GlfwShell() : window_(nullptr, &glfwDestroyWindow) {} ShellParams& GlfwShell::shellParams() noexcept { return shellParams_; } const ShellParams& GlfwShell::shellParams() const noexcept { return shellParams_; } GLFWwindow* GlfwShell::window() noexcept { return window_.get(); } const GLFWwindow* GlfwShell::window() const noexcept { return window_.get(); } Platform& GlfwShell::platform() noexcept { return *platform_; } const Platform& GlfwShell::platform() const noexcept { return *platform_; } const RenderSessionWindowConfig& GlfwShell::windowConfig() const noexcept { return windowConfig_; } const RenderSessionConfig& GlfwShell::sessionConfig() const noexcept { return sessionConfig_; } bool GlfwShell::createWindow() noexcept { if (shellParams_.isHeadless) { return true; } glfwSetErrorCallback(glfwErrorHandler); if (!glfwInit()) { IGL_LOG_ERROR("glfwInit failed"); return false; } glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE); glfwWindowHint(GLFW_SRGB_CAPABLE, GLFW_TRUE); glfwWindowHint(GLFW_VISIBLE, GLFW_TRUE); glfwWindowHint(GLFW_DECORATED, windowConfig_.windowMode == shell::WindowMode::Window ? GLFW_TRUE : GLFW_FALSE); int posX = 0; int posY = 0; int width = windowConfig_.width; int height = windowConfig_.height; GLFWmonitor* IGL_NULLABLE monitor = glfwGetPrimaryMonitor(); if (windowConfig_.windowMode == WindowMode::Fullscreen) { const GLFWvidmode* mode = glfwGetVideoMode(monitor); width = mode->width; height = mode->height; } else if (windowConfig_.windowMode == WindowMode::MaximizedWindow) { // render full screen without overlapping the task bar glfwGetMonitorWorkarea(monitor, &posX, &posY, &width, &height); glfwWindowHint(GLFW_MAXIMIZED, GLFW_TRUE); monitor = nullptr; } else { monitor = nullptr; } willCreateWindow(); GLFWwindow* windowHandle = // @fb-only glfwCreateWindow(width, height, sessionConfig_.displayName.c_str(), monitor, nullptr); if (!windowHandle) { return false; } window_.reset(windowHandle); glfwSetWindowUserPointer(windowHandle, this); if (windowConfig_.windowMode == WindowMode::MaximizedWindow) { glfwSetWindowPos(windowHandle, posX, posY); } glfwGetFramebufferSize(windowHandle, &width, &height); shellParams_.viewportSize.x = width; shellParams_.viewportSize.y = height; glfwSetCursorPosCallback(windowHandle, [](GLFWwindow* window, double xpos, double ypos) { auto* shell = static_cast(glfwGetWindowUserPointer(window)); shell->platform_->getInputDispatcher().queueEvent( MouseMotionEvent((float)xpos, (float)ypos, 0, 0)); }); glfwSetScrollCallback(windowHandle, [](GLFWwindow* window, double xoffset, double yoffset) { auto* shell = static_cast(glfwGetWindowUserPointer(window)); shell->platform_->getInputDispatcher().queueEvent( MouseWheelEvent((float)xoffset, (float)yoffset)); }); glfwSetMouseButtonCallback( windowHandle, [](GLFWwindow* window, int button, int action, int mods) { auto* shell = static_cast(glfwGetWindowUserPointer(window)); MouseButton iglButton = getIGLMouseButton(button); double xpos = NAN, ypos = NAN; glfwGetCursorPos(window, &xpos, &ypos); shell->platform_->getInputDispatcher().queueEvent( MouseButtonEvent(iglButton, action == GLFW_PRESS, (float)xpos, (float)ypos)); }); glfwSetKeyCallback(windowHandle, [](GLFWwindow* window, int key, int, int action, int mods) { auto* shell = static_cast(glfwGetWindowUserPointer(window)); if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) { glfwSetWindowShouldClose(window, GLFW_TRUE); } uint32_t modifiers = 0; if (mods & GLFW_MOD_SHIFT) { modifiers |= igl::shell::kKeyEventModifierShift; } if (mods & GLFW_MOD_CONTROL) { modifiers |= igl::shell::kKeyEventModifierControl; } if (mods & GLFW_MOD_ALT) { modifiers |= igl::shell::kKeyEventModifierOption; } if (mods & GLFW_MOD_CAPS_LOCK) { modifiers |= igl::shell::kKeyEventModifierCapsLock; } if (mods & GLFW_MOD_NUM_LOCK) { modifiers |= igl::shell::kKeyEventModifierNumLock; } shell->platform_->getInputDispatcher().queueEvent( KeyEvent(action == GLFW_PRESS, key, modifiers)); shell->platform_->getInputDispatcher().queueEvent(key <= 256 ? CharEvent{static_cast(key)} : CharEvent{}); }); glfwSetCharCallback(windowHandle, [](GLFWwindow* window, unsigned int codepoint) { auto* shell = static_cast(glfwGetWindowUserPointer(window)); shell->platform_->getInputDispatcher().queueEvent( CharEvent{.character = static_cast(codepoint)}); }); didCreateWindow(); return windowHandle != nullptr; } bool GlfwShell::initialize(int argc, char* argv[], RenderSessionWindowConfig suggestedWindowConfig, const RenderSessionConfig& suggestedSessionConfig) noexcept { igl::shell::Platform::initializeCommandLineArgs(argc, argv); // Use the comprehensive parser auto args = shell::convertArgvToParams(argc, argv); shell::parseShellParams(args, shellParams_); // Apply viewport size if specified suggestedWindowConfig.width = static_cast(shellParams_.viewportSize.x); suggestedWindowConfig.height = static_cast(shellParams_.viewportSize.y); suggestedWindowConfig.windowMode = WindowMode::Window; auto factory = igl::shell::createDefaultRenderSessionFactory(); windowConfig_ = factory->requestedWindowConfig(igl::shell::ShellType::Windows, suggestedWindowConfig); const auto requestedConfigs = factory->requestedSessionConfigs(igl::shell::ShellType::Windows, {suggestedSessionConfig}); if (IGL_DEBUG_VERIFY_NOT(requestedConfigs.size() != 1) || IGL_DEBUG_VERIFY_NOT(suggestedSessionConfig.backendVersion.flavor != requestedConfigs[0].backendVersion.flavor)) { return false; } sessionConfig_ = requestedConfigs[0]; if (!createWindow()) { return false; } platform_ = createPlatform(); if (IGL_DEBUG_VERIFY_NOT(!platform_)) { return false; } session_ = factory->createRenderSession(platform_); if (IGL_DEBUG_VERIFY_NOT(!session_)) { return false; } session_->setShellParams(shellParams_); session_->initialize(); return true; } void GlfwShell::run() noexcept { uint64_t frameNumber = 0; bool frozen = false; while ((!window_ || !glfwWindowShouldClose(window_.get())) && !session_->appParams().exitRequested) { if (frozen) { if (window_) { glfwPollEvents(); } std::this_thread::sleep_for(std::chrono::milliseconds(16)); continue; } willTick(); auto surfaceTextures = createSurfaceTextures(); IGL_DEBUG_ASSERT(surfaceTextures.color != nullptr && surfaceTextures.depth != nullptr); std::shared_ptr colorTexture = surfaceTextures.color; platform_->getInputDispatcher().processEvents(); const auto& params = session_->shellParams(); if (params.freezeAtFrame != ~0u && frameNumber >= params.freezeAtFrame) { frozen = true; IGL_LOG_INFO("[IGL Shell] Frozen at frame %u\n", params.freezeAtFrame); continue; } const double startTime = RenderSession::getSeconds(); session_->update(std::move(surfaceTextures)); if (params.fpsThrottleMs > 0) { const double endTime = RenderSession::getSeconds(); const double frameTimeMs = (endTime - startTime) * 1000.0; const double targetMs = params.fpsThrottleRandom ? static_cast(1 + (std::rand() % params.fpsThrottleMs)) : static_cast(params.fpsThrottleMs); if (frameTimeMs < targetMs) { std::this_thread::sleep_for( std::chrono::milliseconds(static_cast(targetMs - frameTimeMs))); } } if (window_) { glfwPollEvents(); } if (frameNumber == session_->shellParams().screenshotNumber) { IGL_LOG_INFO("\nWe are running screenshot test - breaking after %u frame\n", (uint32_t)frameNumber); if (!session_->shellParams().screenshotFileName.empty()) { saveFrameBufferToPng(session_->shellParams().screenshotFileName.c_str(), platform_->getDevice().createFramebuffer( {.colorAttachments = {{.texture = colorTexture}}}, nullptr), *platform_); } break; } frameNumber++; } } void GlfwShell::teardown() noexcept { // Explicitly destroy all objects before exiting in order to make sure that // whatever else global destructors may there, will be called after these. One // example is a graphics resource tracker in the client code, which otherwise // would not be guaranteed to be called after the graphics resources release. session_.reset(); platform_.reset(); window_.reset(); if (!shellParams_.isHeadless) { glfwTerminate(); } } } // namespace igl::shell ================================================ FILE: shell/windows/common/GlfwShell.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include // clang-format off #if defined(_WIN32) #define GLFW_EXPOSE_NATIVE_WIN32 #else #define GLFW_EXPOSE_NATIVE_X11 #endif // _WIN32 #if IGL_ANGLE #define GLFW_EXPOSE_NATIVE_EGL #else #if defined(_WIN32) #define GLFW_EXPOSE_NATIVE_WGL #else #define GLFW_EXPOSE_NATIVE_GLX #endif #endif // IGL_ANGLE #define GLFW_INCLUDE_NONE // clang-format on #include #include #include #include #include #include namespace igl::shell { class GlfwShell { public: GlfwShell(); virtual ~GlfwShell() noexcept = default; bool initialize(int argc, char* argv[], RenderSessionWindowConfig suggestedWindowConfig, const RenderSessionConfig& suggestedSessionConfig) noexcept; void run() noexcept; void teardown() noexcept; protected: ShellParams& shellParams() noexcept; [[nodiscard]] const ShellParams& shellParams() const noexcept; GLFWwindow* window() noexcept; [[nodiscard]] const GLFWwindow* window() const noexcept; Platform& platform() noexcept; [[nodiscard]] const Platform& platform() const noexcept; [[nodiscard]] const RenderSessionWindowConfig& windowConfig() const noexcept; [[nodiscard]] const RenderSessionConfig& sessionConfig() const noexcept; virtual SurfaceTextures createSurfaceTextures() noexcept = 0; virtual std::shared_ptr createPlatform() noexcept = 0; virtual void willCreateWindow() noexcept {} virtual void didCreateWindow() noexcept {} virtual void willTick() noexcept {} private: bool createWindow() noexcept; std::shared_ptr platform_; ShellParams shellParams_; RenderSessionWindowConfig windowConfig_; RenderSessionConfig sessionConfig_; std::unique_ptr window_; std::unique_ptr session_; }; } // namespace igl::shell ================================================ FILE: shell/windows/d3d12/App.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include #include #include #include using namespace igl; namespace igl::shell { namespace { class D3D12Shell final : public GlfwShell { SurfaceTextures createSurfaceTextures() noexcept final; std::shared_ptr createPlatform() noexcept final; void willCreateWindow() noexcept final; }; void D3D12Shell::willCreateWindow() noexcept { glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); } std::shared_ptr D3D12Shell::createPlatform() noexcept { auto ctx = std::make_unique(); HWND hwnd = window() ? glfwGetWin32Window(window()) : nullptr; if (!hwnd) { IGL_LOG_ERROR("D3D12Shell: No valid window handle\n"); return nullptr; } Result result = ctx->initialize(hwnd, static_cast(shellParams().viewportSize.x), static_cast(shellParams().viewportSize.y)); if (!result.isOk()) { IGL_LOG_ERROR("D3D12Shell: Failed to initialize D3D12Context: %s\n", result.message.c_str()); return nullptr; } auto device = std::make_unique(std::move(ctx)); return std::make_shared(std::move(device)); } SurfaceTextures D3D12Shell::createSurfaceTextures() noexcept { IGL_PROFILER_FUNCTION(); auto& device = platform().getDevice(); const auto& d3d12PlatformDevice = device.getPlatformDevice(); IGL_DEBUG_ASSERT(d3d12PlatformDevice != nullptr); Result ret; auto color = d3d12PlatformDevice->createTextureFromNativeDrawable(&ret); IGL_DEBUG_ASSERT(ret.isOk()); auto depth = d3d12PlatformDevice->createTextureFromNativeDepth( static_cast(shellParams().viewportSize.x), static_cast(shellParams().viewportSize.y), &ret); IGL_DEBUG_ASSERT(ret.isOk()); return SurfaceTextures{std::move(color), std::move(depth)}; } } // namespace } // namespace igl::shell int main(int argc, char* argv[]) { igl::shell::D3D12Shell shell; igl::shell::RenderSessionWindowConfig suggestedWindowConfig = { .width = 1024, .height = 768, .windowMode = igl::shell::WindowMode::MaximizedWindow, }; igl::shell::RenderSessionConfig suggestedConfig = { .displayName = "Direct3D 12", .backendVersion = {.flavor = BackendFlavor::D3D12, .majorVersion = 12, .minorVersion = 0}, .swapchainColorTextureFormat = TextureFormat::BGRA_UNorm8, }; if (!shell.initialize(argc, argv, suggestedWindowConfig, suggestedConfig)) { shell.teardown(); return -1; } shell.run(); shell.teardown(); return 0; } ================================================ FILE: shell/windows/opengl/App.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #if defined(FORCE_USE_ANGLE) || IGL_PLATFORM_LINUX #include #else #include #endif // FORCE_USE_ANGLE #if IGL_PLATFORM_LINUX #include #endif // clang-format off #if !defined(IGL_CMAKE_BUILD) #if !defined(GLEW_STATIC) #define GLEW_STATIC #endif #endif // IGL_CMAKE_BUILD #if defined(_WIN32) #include #endif // _WIN32 // clang-format on #include "AutoContextReleaseDevice.h" #include #include #include #include #include #include #include #include using namespace igl; namespace igl::shell { namespace { class OpenGlShell final : public GlfwShell { SurfaceTextures createSurfaceTextures() noexcept final; std::shared_ptr createPlatform() noexcept final; void willCreateWindow() noexcept final; void didCreateWindow() noexcept final; void willTick() noexcept final; }; SurfaceTextures OpenGlShell::createSurfaceTextures() noexcept { auto& device = platform().getDevice(); if (IGL_DEBUG_VERIFY(device.getBackendType() == igl::BackendType::OpenGL)) { auto& oglDevice = static_cast(device); oglDevice.getContext().setCurrent(); TextureDesc desc = { .width = static_cast(shellParams().viewportSize.x), .height = static_cast(shellParams().viewportSize.y), .depth = 1, .numLayers = 1, .numSamples = 1, .usage = TextureDesc::TextureUsageBits::Attachment, .numMipLevels = 1, .type = TextureType::TwoD, .format = sessionConfig().swapchainColorTextureFormat, }; auto color = std::make_shared(oglDevice.getContext(), desc.format); color->create(desc, true); desc.format = TextureFormat::Z_UNorm24; auto depth = std::make_shared(oglDevice.getContext(), desc.format); depth->create(desc, true); return SurfaceTextures{.color = std::move(color), .depth = std::move(depth)}; } return SurfaceTextures{}; } void OpenGlShell::willCreateWindow() noexcept { glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, sessionConfig().backendVersion.majorVersion); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, sessionConfig().backendVersion.minorVersion); if (sessionConfig().backendVersion.majorVersion > 3 || (sessionConfig().backendVersion.majorVersion == 3 && sessionConfig().backendVersion.minorVersion >= 2)) { glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); } glfwWindowHint(GLFW_DOUBLEBUFFER, GLFW_TRUE); } void OpenGlShell::didCreateWindow() noexcept { [[maybe_unused]] int result = glfwGetWindowAttrib(window(), GLFW_CLIENT_API); glfwMakeContextCurrent(window()); #if defined(_WIN32) glewExperimental = GL_TRUE; glewInit(); #endif glfwSwapInterval(1); IGL_LOG_INFO("Renderer: %s\n", (const char*)glGetString(GL_RENDERER)); IGL_LOG_INFO("Version: %s\n", (const char*)glGetString(GL_VERSION)); IGL_LOG_INFO("WindowAttrib: 0x%x\n", result); } std::shared_ptr OpenGlShell::createPlatform() noexcept { #if defined(_WIN32) auto context = std::make_unique(GetDC(glfwGetWin32Window(window())), glfwGetWGLContext(window())); auto glDevice = std::make_unique(std::move(context)); return std::make_shared(std::move(glDevice)); #elif IGL_PLATFORM_LINUX auto context = std::make_unique( nullptr, glfwGetX11Display(), (igl::opengl::glx::GLXDrawable)glfwGetX11Window(window()), (igl::opengl::glx::GLXContext)glfwGetGLXContext(window())); auto glDevice = std::make_unique(std::move(context)); return std::make_shared(std::move(glDevice)); #endif } void OpenGlShell::willTick() noexcept { #if defined(_WIN32) static_cast(platform().getDevice()).getContext().setCurrent(); #elif IGL_PLATFORM_LINUX static_cast(platform().getDevice()).getContext().setCurrent(); #endif } } // namespace } // namespace igl::shell int main(int argc, char* argv[]) { igl::shell::OpenGlShell shell; uint32_t majorVersion = 4; uint32_t minorVersion = 6; if (argc == 2) { std::tie(majorVersion, minorVersion) = igl::opengl::parseVersionString(argv[1]); } igl::shell::RenderSessionWindowConfig suggestedWindowConfig = { .width = 1024, .height = 768, .windowMode = shell::WindowMode::Window, }; igl::shell::RenderSessionConfig suggestedConfig = { .displayName = "OpenGL " + std::to_string(majorVersion) + "." + std::to_string(minorVersion), .backendVersion = {.flavor = BackendFlavor::OpenGL, .majorVersion = static_cast(majorVersion), .minorVersion = static_cast(minorVersion)}, .swapchainColorTextureFormat = TextureFormat::RGBA_SRGB, }; if (!shell.initialize(argc, argv, suggestedWindowConfig, suggestedConfig)) { shell.teardown(); return -1; } shell.run(); shell.teardown(); return 0; } ================================================ FILE: shell/windows/opengl/AutoContextReleaseDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include // clang-format off #if IGL_PLATFORM_WINDOWS #include #include #elif IGL_PLATFORM_LINUX #include #include #endif // clang-format on namespace igl::shell::util { #if IGL_PLATFORM_WINDOWS struct WGLDevice final : public igl::opengl::Device { explicit WGLDevice(std::unique_ptr context) : Device(std::move(context)), platformDevice_(*this) {} const igl::opengl::PlatformDevice& getPlatformDevice() const noexcept override { return platformDevice_; } void endScope() override { Device::endScope(); if (!verifyScope()) { wglMakeCurrent(NULL, NULL); } } igl::opengl::PlatformDevice platformDevice_; }; #elif IGL_PLATFORM_LINUX struct GLXDevice final : public igl::opengl::Device { explicit GLXDevice(std::unique_ptr context) : Device(std::move(context)), platformDevice(*this) {} [[nodiscard]] const igl::opengl::PlatformDevice& getPlatformDevice() const noexcept override { return platformDevice; } void endScope() override { Device::endScope(); if (!verifyScope()) { getContext().clearCurrentContext(); } } igl::opengl::PlatformDevice platformDevice; }; #endif } // namespace igl::shell::util ================================================ FILE: shell/windows/opengles/App.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include #if IGL_ANGLE #include #include #include #include #endif // IGL_ANGLE #include #include #include #include using namespace igl; namespace igl::shell { namespace { class OpenGlEsShell final : public GlfwShell { SurfaceTextures createSurfaceTextures() noexcept final; std::shared_ptr createPlatform() noexcept final; void willCreateWindow() noexcept final; void didCreateWindow() noexcept final; void willTick() noexcept final; }; class EGLDevice final : public ::igl::opengl::Device { public: // NOLINTNEXTLINE(clang-diagnostic-unused-member-function) explicit EGLDevice(std::unique_ptr<::igl::opengl::IContext> context) : Device(std::move(context)), platformDevice(*this) { { } } [[nodiscard]] const igl::opengl::PlatformDevice& getPlatformDevice() const noexcept override { return platformDevice; } ::igl::opengl::PlatformDevice platformDevice; }; void OpenGlEsShell::willCreateWindow() noexcept { glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API); glfwWindowHint(GLFW_CONTEXT_CREATION_API, GLFW_EGL_CONTEXT_API); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, sessionConfig().backendVersion.majorVersion); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, sessionConfig().backendVersion.minorVersion); glfwWindowHint(GLFW_DOUBLEBUFFER, GLFW_TRUE); } void OpenGlEsShell::didCreateWindow() noexcept { [[maybe_unused]] int result = glfwGetWindowAttrib(window(), GLFW_CLIENT_API); glfwMakeContextCurrent(window()); glfwSwapInterval(1); IGL_LOG_INFO("Renderer: %s\n", (const char*)glGetString(GL_RENDERER)); IGL_LOG_INFO("Version: %s\n", (const char*)glGetString(GL_VERSION)); IGL_LOG_INFO("WindowAttrib: 0x%x\n", result); } SurfaceTextures OpenGlEsShell::createSurfaceTextures() noexcept { #if IGL_ANGLE auto& device = platform().getDevice(); if (IGL_DEBUG_VERIFY(device.getBackendType() == igl::BackendType::OpenGL)) { auto platformDevice = device.getPlatformDevice(); IGL_DEBUG_ASSERT(platformDevice != nullptr); if (IGL_DEBUG_VERIFY(platformDevice)) { auto color = platformDevice->createTextureFromNativeDrawable(nullptr); auto depth = platformDevice->createTextureFromNativeDepth(igl::TextureFormat::Z_UNorm24, nullptr); return igl::SurfaceTextures{std::move(color), std::move(depth)}; } } #endif // IGL_ANGLE return SurfaceTextures{}; } std::shared_ptr OpenGlEsShell::createPlatform() noexcept { #if IGL_ANGLE auto glesDevice = std::make_unique( std::make_unique<::igl::opengl::egl::Context>(glfwGetEGLDisplay(), glfwGetEGLContext(window()), glfwGetEGLSurface(window()), glfwGetEGLSurface(window()))); return std::make_shared(std::move(glesDevice)); #endif // IGL_ANGLE return nullptr; } void OpenGlEsShell::willTick() noexcept { glfwMakeContextCurrent(window()); } } // namespace } // namespace igl::shell int main(int argc, char* argv[]) { igl::shell::OpenGlEsShell shell; uint32_t majorVersion = 3; uint32_t minorVersion = 1; if (argc == 2) { std::tie(majorVersion, minorVersion) = igl::opengl::parseVersionString(argv[1]); } igl::shell::RenderSessionWindowConfig suggestedWindowConfig = { .width = 1024, .height = 768, .windowMode = shell::WindowMode::Window, }; igl::shell::RenderSessionConfig suggestedConfig = { .displayName = "OpenGL ES " + std::to_string(majorVersion) + "." + std::to_string(minorVersion), .backendVersion = {.flavor = BackendFlavor::OpenGL_ES, .majorVersion = static_cast(majorVersion), .minorVersion = static_cast(minorVersion)}, .swapchainColorTextureFormat = TextureFormat::RGBA_UNorm8, }; if (!shell.initialize(argc, argv, suggestedWindowConfig, suggestedConfig)) { shell.teardown(); return -1; } shell.run(); shell.teardown(); return 0; } ================================================ FILE: shell/windows/vulkan/App.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include #include #include #include #include using namespace igl; namespace igl::shell { namespace { class VulkanShell final : public GlfwShell { SurfaceTextures createSurfaceTextures() noexcept final; std::shared_ptr createPlatform() noexcept final; void willCreateWindow() noexcept final; }; void VulkanShell::willCreateWindow() noexcept { glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); } std::shared_ptr VulkanShell::createPlatform() noexcept { igl::vulkan::VulkanContextConfig cfg = { #if defined(_MSC_VER) && !IGL_DEBUG .enableValidation = false, #else .enableValidation = shellParams().enableVulkanValidationLayers, #endif .requestedSwapChainTextureFormat = sessionConfig().swapchainColorTextureFormat, .headless = shellParams().isHeadless, }; auto ctx = vulkan::HWDevice::createContext( cfg, #if defined(_WIN32) window() ? (void*)glfwGetWin32Window(window()) : nullptr // NOLINT(performance-no-int-to-ptr) #else window() ? (void*)glfwGetX11Window(window()) // NOLINT(performance-no-int-to-ptr) : nullptr, (void*)glfwGetX11Display() // NOLINT(performance-no-int-to-ptr) #endif ); // Prioritize discrete GPUs. If not found, use any that is available. std::vector devices = vulkan::HWDevice::queryDevices(*ctx, HWDeviceQueryDesc(HWDeviceType::DiscreteGpu), nullptr); if (devices.empty()) { devices = vulkan::HWDevice::queryDevices( *ctx, HWDeviceQueryDesc(HWDeviceType::IntegratedGpu), nullptr); } if (devices.empty()) { // Lavapipe etc devices = vulkan::HWDevice::queryDevices(*ctx, HWDeviceQueryDesc(HWDeviceType::SoftwareGpu), nullptr); } IGL_DEBUG_ASSERT(devices.size() > 0, "Could not find Vulkan device with requested capabilities"); auto vulkanDevice = vulkan::HWDevice::create(std::move(ctx), devices[0], (uint32_t)shellParams().viewportSize.x, (uint32_t)shellParams().viewportSize.y); return std::make_shared(std::move(vulkanDevice)); } SurfaceTextures VulkanShell::createSurfaceTextures() noexcept { IGL_PROFILER_FUNCTION(); auto& device = platform().getDevice(); const auto& vkPlatformDevice = device.getPlatformDevice(); IGL_DEBUG_ASSERT(vkPlatformDevice != nullptr); Result ret; auto color = vkPlatformDevice->createTextureFromNativeDrawable(&ret); IGL_DEBUG_ASSERT(ret.isOk()); auto depth = vkPlatformDevice->createTextureFromNativeDepth( shellParams().viewportSize.x, shellParams().viewportSize.y, &ret); IGL_DEBUG_ASSERT(ret.isOk()); return SurfaceTextures{.color = std::move(color), .depth = std::move(depth)}; } } // namespace } // namespace igl::shell int main(int argc, char* argv[]) { igl::shell::VulkanShell shell; igl::shell::RenderSessionWindowConfig suggestedWindowConfig = { .width = 1024, .height = 768, .windowMode = shell::WindowMode::MaximizedWindow, }; igl::shell::RenderSessionConfig suggestedConfig = { .displayName = "Vulkan 1.1", .backendVersion = {.flavor = BackendFlavor::Vulkan, .majorVersion = 1, .minorVersion = 1}, .swapchainColorTextureFormat = TextureFormat::BGRA_SRGB, }; if (!shell.initialize(argc, argv, suggestedWindowConfig, suggestedConfig)) { shell.teardown(); return -1; } shell.run(); shell.teardown(); return 0; } ================================================ FILE: src/igl/Assert.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #define IGL_COMMON_SKIP_CHECK #include // ---------------------------------------------------------------------------- namespace { IGLErrorHandlerFunc& getDebugAbortListener() { static IGLErrorHandlerFunc sListener = nullptr; return sListener; } } // namespace IGL_API void iglSetDebugAbortListener(IGLErrorHandlerFunc listener) { getDebugAbortListener() = listener; } IGL_API IGLErrorHandlerFunc iglGetDebugAbortListener(void) { return getDebugAbortListener(); } namespace igl { // Toggle debug break on/off at runtime #if IGL_DEBUG static bool debugBreakEnabled = true; #else static bool debugBreakEnabled = false; #endif // IGL_DEBUG bool isDebugBreakEnabled() { return debugBreakEnabled; } void setDebugBreakEnabled(bool enabled) { debugBreakEnabled = enabled; } } // namespace igl #if IGL_PLATFORM_APPLE || IGL_PLATFORM_ANDROID || IGL_PLATFORM_LINUX #define IGL_DEBUGGER_SIGTRAP 1 #include #elif IGL_PLATFORM_WINDOWS #include #include #endif void iglDebugBreak() { #if IGL_DEBUG_BREAK_ENABLED if (igl::isDebugBreakEnabled()) { #ifdef IGL_DEBUGGER_SIGTRAP raise(SIGTRAP); #elif IGL_PLATFORM_WINDOWS if (!IsDebuggerPresent()) { IGLLog(IGLLogError, "[IGL] Skipping debug break - debugger not present"); return; } __debugbreak(); #else #warning "IGLDebugBreak() not implemented on this platform" #endif } #endif // IGL_DEBUG_BREAK_ENABLED } // ---------------------------------------------------------------------------- namespace { IGLErrorHandlerFunc& getSoftErrorHandler() { static IGLErrorHandlerFunc sHandler = nullptr; return sHandler; } } // namespace IGL_API void iglSetSoftErrorHandler(IGLErrorHandlerFunc handler) { getSoftErrorHandler() = handler; } IGL_API IGLErrorHandlerFunc iglGetSoftErrorHandler(void) { return getSoftErrorHandler(); } ================================================ FILE: src/igl/Assert.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #if !defined(IGL_COMMON_H) && !defined(IGL_COMMON_SKIP_CHECK) #error "Please, include instead" #endif #include #include ///-------------------------------------- /// MARK: - Assert // When a runtime assert fails, it will: // // * trap in the debugger // * logs to console and/or debugger console: failing expression, function signature, file/line // * allows you to continue execution during debugging after a failing assert, instead of exiting // // ## IGL_DEBUG_ASSERT vs IGL_DEBUG_VERIFY/IGL_DEBUG_VERIFY_NOT // // Use IGL_DEBUG_ASSERT for debug-only assertions. On release builds, the expressions // expand to no-op's, so no perf penalty. IGL_DEBUG_ASSERT logs the failed expression to // console. To customize, provide a format argument with printf semantics: // // int i = 42; // auto p = std::make_shared(i); // IGL_DEBUG_ASSERT(p); // IGL_DEBUG_ASSERT(*p == i, "*p is wrong value. Got %d. Expected %d.", *p, i); // // Use IGL_DEBUG_VERIFY and IGL_DEBUG_VERIFY_NOT to evaluate expressions and catch asserts on debug // builds. Typically, you'd wrap an expressions inside an `if` statement with IGL_DEBUG_VERIFY. // IGL_DEBUG_VERIFY_NOT is for `if` statements that check if an error condition is true. That way, // you can catch assertions on debug builds. On release builds, there's no overhead; they simply // expand to the original expression: // // FILE* fp = std::fopen("test.txt", "r"); // if (IGL_DEBUG_VERIFY(fp)) { // printf("Success!\n"); // } else { // printf("Failure!\n"); // } // // void Foo::initialize() { // if (IGL_DEBUG_VERIFY_NOT(initialized_)) { // // Initialize should only be called once! // return; // } // } // #include #define IGL_ERROR_CATEGORY "IGL" using IGLErrorHandlerFunc = void (*)(const char* IGL_NONNULL category, const char* IGL_NONNULL reason, const char* IGL_NONNULL file, const char* IGL_NONNULL func, int line, const char* IGL_NONNULL format, va_list ap); IGL_API void iglDebugBreak(); IGL_API void iglSetDebugAbortListener(IGLErrorHandlerFunc IGL_NULLABLE listener); IGL_API IGLErrorHandlerFunc IGL_NULLABLE iglGetDebugAbortListener(void); namespace igl { bool isDebugBreakEnabled(); void setDebugBreakEnabled(bool enabled); [[nodiscard]] inline bool iglEnsureNoDiscard(bool cond) { return cond; } inline void iglDebugAbortV([[maybe_unused]] const char* IGL_NONNULL category, [[maybe_unused]] const char* IGL_NONNULL reason, [[maybe_unused]] const char* IGL_NONNULL func, [[maybe_unused]] const char* IGL_NONNULL file, [[maybe_unused]] int line, [[maybe_unused]] const char* IGL_NONNULL format, [[maybe_unused]] va_list ap) { #if IGL_DEBUG_ABORT_ENABLED va_list apCopy; va_copy(apCopy, ap); auto listener = iglGetDebugAbortListener(); if (listener) { listener(category, reason, file, func, line, format, apCopy); } va_end(apCopy); IGLLog(IGLLogError, "[%s] %s in '%s' (%s:%d): ", category, reason, func, file, line); IGLLogV(IGLLogError, format, ap); IGLLog(IGLLogError, IGL_NEWLINE); iglDebugBreak(); #endif // IGL_DEBUG_ABORT_ENABLED } [[nodiscard]] inline bool iglDebugAbort(const char* IGL_NONNULL category, const char* IGL_NONNULL reason, const char* IGL_NONNULL func, const char* IGL_NONNULL file, int line, const char* IGL_NONNULL format, ...) { va_list ap; va_start(ap, format); iglDebugAbortV(category, reason, func, file, line, format, ap); va_end(ap); return false; } } // namespace igl #if IGL_DEBUG_ABORT_ENABLED #define IGL_DEBUG_ABORT_IMPL(cond, reason, format, ...) \ (cond \ ? ::igl::iglEnsureNoDiscard(true) \ : ::igl::iglDebugAbort( \ IGL_ERROR_CATEGORY, reason, IGL_FUNCTION, __FILE__, __LINE__, format, ##__VA_ARGS__)) #define IGL_DEBUG_ABORT_INTERNAL(format, ...) \ (void)IGL_DEBUG_ABORT_IMPL(false, "Abort requested", (format), ##__VA_ARGS__) #define IGL_DEBUG_ASSERT_INTERNAL(cond, format, ...) \ (void)IGL_DEBUG_ABORT_IMPL(!!(cond), "Assert failed", (format), ##__VA_ARGS__) #define IGL_DEBUG_VERIFY_INTERNAL(cond, format, ...) \ IGL_DEBUG_ABORT_IMPL(!!(cond), "Verify failed", (format), ##__VA_ARGS__) #define IGL_DEBUG_VERIFY_NOT_INTERNAL(cond, format, ...) \ !IGL_DEBUG_ABORT_IMPL(!(cond), "Verify failed", (format), ##__VA_ARGS__) #else #define IGL_DEBUG_ABORT_INTERNAL(format, ...) static_cast(0) #define IGL_DEBUG_ASSERT_INTERNAL(cond, format, ...) static_cast(0) #define IGL_DEBUG_VERIFY_INTERNAL(cond, format, ...) ::igl::iglEnsureNoDiscard(!!(cond)) #define IGL_DEBUG_VERIFY_NOT_INTERNAL(cond, format, ...) ::igl::iglEnsureNoDiscard(!!(cond)) #endif // IGL_DEBUG_ABORT_ENABLED #define IGL_DEBUG_ABORT(format, ...) IGL_DEBUG_ABORT_INTERNAL((format), ##__VA_ARGS__) #define IGL_DEBUG_ASSERT_HELPER_0(cond) IGL_DEBUG_ASSERT_INTERNAL(cond, #cond) #define IGL_DEBUG_ASSERT_HELPER_1(cond, format, ...) \ IGL_DEBUG_ASSERT_INTERNAL(cond, (format), ##__VA_ARGS__) // Supported variations: // IGL_DEBUG_ASSERT(cond) // IGL_DEBUG_ASSERT(cond, format, ...) #define IGL_DEBUG_ASSERT(...) \ _IGL_CALL(IGL_CONCAT(IGL_DEBUG_ASSERT_HELPER_, _IGL_HAS_COMMA(__VA_ARGS__)), \ _IGL_ECHO((__VA_ARGS__))) #define IGL_DEBUG_VERIFY_HELPER_0(cond) IGL_DEBUG_VERIFY_INTERNAL(cond, #cond) #define IGL_DEBUG_VERIFY_HELPER_1(cond, format, ...) \ IGL_DEBUG_VERIFY_INTERNAL(cond, (format), ##__VA_ARGS__) // Supported variations: // IGL_DEBUG_VERIFY(cond) // IGL_DEBUG_VERIFY(cond, format, ...) #define IGL_DEBUG_VERIFY(...) \ _IGL_CALL(IGL_CONCAT(IGL_DEBUG_VERIFY_HELPER_, _IGL_HAS_COMMA(__VA_ARGS__)), \ _IGL_ECHO((__VA_ARGS__))) #define IGL_DEBUG_VERIFY_NOT_HELPER_0(cond) IGL_DEBUG_VERIFY_NOT_INTERNAL(cond, "!(" #cond ")") #define IGL_DEBUG_VERIFY_NOT_HELPER_1(cond, format, ...) \ IGL_DEBUG_VERIFY_NOT_INTERNAL(cond, (format), ##__VA_ARGS__) // Supported variations: // IGL_DEBUG_VERIFY_NOT(cond) // IGL_DEBUG_VERIFY_NOT(cond, format, ...) #define IGL_DEBUG_VERIFY_NOT(...) \ _IGL_CALL(IGL_CONCAT(IGL_DEBUG_VERIFY_NOT_HELPER_, _IGL_HAS_COMMA(__VA_ARGS__)), \ _IGL_ECHO((__VA_ARGS__))) #define IGL_DEBUG_ASSERT_NOT_REACHED() IGL_DEBUG_ABORT("Code should NOT be reached") #define IGL_DEBUG_ASSERT_NOT_IMPLEMENTED() IGL_DEBUG_ABORT("Code NOT implemented") ///-------------------------------------- /// MARK: - Custom IGL_API void iglSetSoftErrorHandler(IGLErrorHandlerFunc IGL_NULLABLE handler); // @fb-only IGL_API IGLErrorHandlerFunc IGL_NULLABLE iglGetSoftErrorHandler(void); IGL_API void iglSoftError(const char* IGL_NONNULL category, const char* IGL_NONNULL reason, const char* IGL_NONNULL file, const char* IGL_NONNULL func, int line, const char* IGL_NONNULL format, ...); namespace igl { [[nodiscard]] inline bool iglSoftError(const char* IGL_NONNULL category, const char* IGL_NONNULL reason, const char* IGL_NONNULL func, const char* IGL_NONNULL file, int line, const char* IGL_NONNULL format, ...) { va_list ap, apCopy; va_start(ap, format); va_copy(apCopy, ap); iglDebugAbortV(category, reason, func, file, line, format, apCopy); va_end(apCopy); #if IGL_SOFT_ERROR_ENABLED auto handler = iglGetSoftErrorHandler(); if (handler) { handler(category, reason, file, func, line, format, ap); } #endif // IGL_SOFT_ERROR_ENABLED va_end(ap); return false; // Always return false } } // namespace igl #if IGL_SOFT_ERROR_ENABLED #define IGL_SOFT_ERROR_IMPL(cond, reason, format, ...) \ (cond \ ? ::igl::iglEnsureNoDiscard(true) \ : ::igl::iglSoftError( \ IGL_ERROR_CATEGORY, reason, IGL_FUNCTION, __FILE__, __LINE__, format, ##__VA_ARGS__)) #define IGL_SOFT_ERROR_INTERNAL(format, ...) \ (void)IGL_SOFT_ERROR_IMPL(false, "Soft error", (format), ##__VA_ARGS__) #define IGL_SOFT_ASSERT_INTERNAL(cond, format, ...) \ (void)IGL_SOFT_ERROR_IMPL(!!(cond), "Soft assert failed", (format), ##__VA_ARGS__) #define IGL_SOFT_VERIFY_INTERNAL(cond, format, ...) \ IGL_SOFT_ERROR_IMPL(!!(cond), "Soft verify failed", (format), ##__VA_ARGS__) #define IGL_SOFT_VERIFY_NOT_INTERNAL(cond, format, ...) \ !IGL_SOFT_ERROR_IMPL(!(cond), "Soft verify failed", (format), ##__VA_ARGS__) #else #define IGL_SOFT_ERROR_INTERNAL(format, ...) static_cast(0) #define IGL_SOFT_ASSERT_INTERNAL(cond, format, ...) static_cast(0) #define IGL_SOFT_VERIFY_INTERNAL(cond, format, ...) ::igl::iglEnsureNoDiscard(!!(cond)) #define IGL_SOFT_VERIFY_NOT_INTERNAL(cond, format, ...) ::igl::iglEnsureNoDiscard(!!(cond)) #endif // IGL_SOFT_ERROR_ENABLED #define IGL_SOFT_ERROR(format, ...) IGL_SOFT_ERROR_INTERNAL((format), ##__VA_ARGS__) #define IGL_SOFT_ASSERT_HELPER_0(cond) IGL_SOFT_ASSERT_INTERNAL(cond, #cond) #define IGL_SOFT_ASSERT_HELPER_1(cond, format, ...) \ IGL_SOFT_ASSERT_INTERNAL(cond, (format), ##__VA_ARGS__) // Supported variations: // IGL_SOFT_ASSERT(cond) // IGL_SOFT_ASSERT(cond, format, ...) #define IGL_SOFT_ASSERT(...) \ _IGL_CALL(IGL_CONCAT(IGL_SOFT_ASSERT_HELPER_, _IGL_HAS_COMMA(__VA_ARGS__)), \ _IGL_ECHO((__VA_ARGS__))) #define IGL_SOFT_VERIFY_HELPER_0(cond) IGL_SOFT_VERIFY_INTERNAL(cond, #cond) #define IGL_SOFT_VERIFY_HELPER_1(cond, format, ...) \ IGL_SOFT_VERIFY_INTERNAL(cond, (format), ##__VA_ARGS__) // Supported variations: // IGL_SOFT_VERIFY(cond) // IGL_SOFT_VERIFY(cond, format, ...) #define IGL_SOFT_VERIFY(...) \ _IGL_CALL(IGL_CONCAT(IGL_SOFT_VERIFY_HELPER_, _IGL_HAS_COMMA(__VA_ARGS__)), \ _IGL_ECHO((__VA_ARGS__))) #define IGL_SOFT_VERIFY_NOT_HELPER_0(cond) IGL_SOFT_VERIFY_NOT_INTERNAL(cond, "!(" #cond ")") #define IGL_SOFT_VERIFY_NOT_HELPER_1(cond, format, ...) \ IGL_SOFT_VERIFY_NOT_INTERNAL(cond, (format), ##__VA_ARGS__) // Supported variations: // IGL_SOFT_VERIFY_NOT(cond) // IGL_SOFT_VERIFY_NOT(cond, format, ...) #define IGL_SOFT_VERIFY_NOT(...) \ _IGL_CALL(IGL_CONCAT(IGL_SOFT_VERIFY_NOT_HELPER_, _IGL_HAS_COMMA(__VA_ARGS__)), \ _IGL_ECHO((__VA_ARGS__))) ================================================ FILE: src/igl/Buffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl { // class forward declaration class ICommandBuffer; enum class IndexFormat : uint8_t { UInt8, UInt16, UInt32, }; struct BufferRange { size_t size; uintptr_t offset; BufferRange(size_t size = 0L, uintptr_t offset = 0L) : size(size), offset(offset) {} }; /** * @brief A buffer descriptor used to create a new IBuffer, e.g. * by IDevice->createBuffer() */ struct BufferDesc { enum BufferTypeBits : uint8_t { Index = 1 << 0, Vertex = 1 << 1, Uniform = 1 << 2, Storage = 1 << 3, Indirect = 1 << 4, // @fb-only }; using BufferType = uint8_t; enum BufferAPIHintBits : uint8_t { Atomic = 1 << 0, UniformBlock = 1 << 1, // Enforces UBO for OpenGL Query = 1 << 2, // @fb-only Ring = 1 << 4, // Metal/Vulkan: Ring buffers with memory for each swapchain image NoCopy = 1 << 5, // Metal: The buffer should re-use previously allocated memory. }; using BufferAPIHint = uint8_t; /** * @brief A bit mask of BufferTypeBits. All usage types must be specified. * @See igl::BufferType */ BufferType type = 0; /** @brief Data to upload at the time of creation. Can be nullptr. */ const void* IGL_NULLABLE data = nullptr; /** @brief Total internal store to allocate */ size_t length = 0; /** * @brief Storage mode. * @See igl::ResourceStorage */ #if IGL_PLATFORM_MACOSX ResourceStorage storage = ResourceStorage::Managed; #else ResourceStorage storage = ResourceStorage::Shared; #endif /** * @brief Backend API hint flags. * */ BufferAPIHint hint = 0; /** @brief Identifier used for debugging */ std::string debugName; /** * @brief Element stride in bytes for storage buffers. * * For buffers created with BufferTypeBits::Storage, this describes the size of a single * structured element when the buffer is viewed as a StructuredBuffer / RWStructuredBuffer. * * Backends that create structured SRV/UAV views (such as D3D12) use this value to populate * D3D12_BUFFER_SRV / D3D12_BUFFER_UAV StructureByteStride and to compute NumElements. * * A value of 0 means "unknown/unspecified" and backends may fall back to a default * element size (typically 4 bytes) for compatibility with existing code that assumes * float / uint elements. */ size_t storageStride = 0; }; class IBuffer : public ITrackedResource { public: ~IBuffer() override = default; /** * @brief Upload data into a range in IBuffer. * * @param data data to be uploaded * @param range offset (in IBuffer) and size * @return Result::Code::ArgumentOutOfRange if offset + size is > IBuffer size * @return Result::Code::Ok On success * @remark data is allowed to be a nullptr if acceptedApiHints() includes * BufferAPIHintBits::NoCopy. In this case, a nullptr means that the specified range has been * updated. In all other situations, data MUST NOT be a nullptr. */ virtual Result upload(const void* IGL_NULLABLE data, const BufferRange& range) = 0; /** * @brief Map a portion of the contents of a GPU Buffer into memory. Not efficient on OpenGL. * unmap() must be called before the buffer is used again in any GPU operations. * * @param range offset (in IBuffer) and size * @param outResult result of the operation, Result::Code::Ok On success * @return a pointer to the data mapped into memory. */ virtual void* IGL_NULLABLE map(const BufferRange& range, Result* IGL_NULLABLE outResult) = 0; /** * @brief Unmap a GPU Buffer from memory. Should be called after map(). * */ virtual void unmap() = 0; /** * @brief Returns the API hints that were requested in the buffer's descriptor. * @remark It is NOT guaranteed that all of these hints were accepted and used. Use * acceptedApiHints to get those. */ [[nodiscard]] virtual BufferDesc::BufferAPIHint requestedApiHints() const noexcept = 0; /** * @brief Returns the API hints that were accepted and used in the buffer's creation. */ [[nodiscard]] virtual BufferDesc::BufferAPIHint acceptedApiHints() const noexcept = 0; /** * @brief Returns the storage mode for the buffer. */ [[nodiscard]] virtual ResourceStorage storage() const noexcept = 0; /** * @brief Returns current size of IBuffer * * @return Current allocated size */ [[nodiscard]] virtual size_t getSizeInBytes() const = 0; /** * @brief Returns a buffer id suitable for bindless rendering (buffer_device_address on Vulkan and * gpuResourceID on Metal) * * @return uint64_t */ [[nodiscard]] virtual uint64_t gpuAddress(size_t offset = 0) const = 0; /** * @brief Returns the underlying buffer type which is a mask of igl::BufferDesc::BufferTypeBits * * @return igl::BufferDesc::BufferType */ [[nodiscard]] virtual BufferDesc::BufferType getBufferType() const = 0; protected: IBuffer() = default; }; } // namespace igl ================================================ FILE: src/igl/CMakeLists.txt ================================================ # Copyright (c) Meta Platforms, Inc. and affiliates. # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. cmake_minimum_required(VERSION 3.19) project(IGLLibrary CXX C) add_definitions("-DIGL_CMAKE_BUILD=1") file(GLOB SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp) file(GLOB HEADER_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.h) if(WIN32) list(APPEND SRC_FILES win/LogDefault.cpp) list(APPEND HEADER_FILES win/LogDefault.h) endif() if(ANDROID) list(APPEND SRC_FILES android/LogDefault.cpp) list(APPEND HEADER_FILES android/LogDefault.h) list(APPEND SRC_FILES android/NativeHWBuffer.cpp) list(APPEND HEADER_FILES android/NativeHWBuffer.h) endif() add_library(IGLLibrary ${SRC_FILES} ${HEADER_FILES}) target_include_directories(IGLLibrary PUBLIC "${IGL_ROOT_DIR}/src") target_include_directories(IGLLibrary PUBLIC "${IGL_ROOT_DIR}/third-party/deps/src/glm") if(NOT IGL_WITH_OPENGL) target_include_directories(IGLLibrary PUBLIC "${IGL_ROOT_DIR}/src/igl/opengl/util") target_sources(IGLLibrary PRIVATE opengl/util/TextureFormat.cpp opengl/util/TextureFormat.h) endif() if(NOT EMSCRIPTEN) # Only link fmt if it's available, use PRIVATE to avoid exporting the dependency if(TARGET fmt::fmt) target_link_libraries(IGLLibrary PRIVATE fmt::fmt) elseif(TARGET fmt) target_link_libraries(IGLLibrary PRIVATE fmt) endif() endif() igl_set_cxxstd(IGLLibrary 20) igl_set_folder(IGLLibrary "IGL") add_subdirectory(glslang) if(IGL_WITH_OPENGL OR IGL_WITH_OPENGLES OR IGL_WITH_WEBGL) add_subdirectory(opengl) target_link_libraries(IGLLibrary PUBLIC IGLOpenGL) endif() if(IGL_WITH_VULKAN) add_subdirectory(vulkan) target_link_libraries(IGLLibrary PUBLIC IGLVulkan) endif() if(IGL_WITH_METAL) add_subdirectory(metal) target_link_libraries(IGLLibrary PUBLIC IGLMetal) endif() if(IGL_WITH_D3D12) add_subdirectory(d3d12) target_link_libraries(IGLLibrary PUBLIC IGLD3D12) endif() # OpenGL tests use GLES on Windows and we do not use Angle with CMake - so OGL # tests are disabled for now on Windows # Enable tests when requested. On Windows, allow tests if either Vulkan or D3D12 is enabled # (previously required Vulkan on Windows, which blocked D3D12-only test runs). if(IGL_WITH_TESTS AND IGL_WITH_IGLU AND (IGL_WITH_VULKAN OR IGL_WITH_D3D12 OR (NOT WIN32))) add_subdirectory(tests) if((IGL_WITH_OPENGL OR IGL_WITH_OPENGLES) AND NOT APPLE) target_sources(IGLTests PRIVATE opengl/egl/Context.cpp opengl/egl/Device.cpp opengl/egl/HWDevice.cpp opengl/egl/PlatformDevice.cpp) endif() endif() ================================================ FILE: src/igl/Color.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl { /** * @brief struct to represent a linear color value. */ struct Color { float r; float g; float b; float a; /** * @brief Constructor ingesting red, green, blue. Alpha is assumed to be 1.0f. * * @param red - red channel * @param green - green channel * @param blue - blue channel */ constexpr Color(float red, float green, float blue) : r(red), g(green), b(blue), a(1.0f) {} /** * @brief Constructor ingesting red, green, blue and alpha. * * @param red - red channel * @param green - green channel * @param blue - blue channel * @param alpha - alpha channel */ constexpr Color(float red, float green, float blue, float alpha) : r(red), g(green), b(blue), a(alpha) {} [[nodiscard]] const float* IGL_NONNULL toFloatPtr() const { return &r; } }; } // namespace igl ================================================ FILE: src/igl/ColorSpace.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include // IWYU pragma: keep #include namespace igl { /** * * The list of different color space commonly seen in graphics. * */ enum class ColorSpace : uint8_t { SRGB_LINEAR, SRGB_NONLINEAR, DISPLAY_P3_NONLINEAR, EXTENDED_SRGB_LINEAR, DISPLAY_P3_LINEAR, DCI_P3_NONLINEAR, BT709_LINEAR, BT709_NONLINEAR, BT2020_LINEAR, HDR10_ST2084, DOLBYVISION, HDR10_HLG, ADOBERGB_LINEAR, ADOBERGB_NONLINEAR, PASS_THROUGH, EXTENDED_SRGB_NONLINEAR, DISPLAY_NATIVE_AMD, BT601_NONLINEAR, BT2020_NONLINEAR, BT2100_HLG_NONLINEAR, BT2100_PQ_NONLINEAR }; /** * @brief Converts color space to literal string * * @param colorSpace ColorSpace of the texture/framebuffer. * @return Literal C-style string containing the color space name */ inline const char* IGL_NONNULL colorSpaceToString(ColorSpace colorSpace) { switch (colorSpace) { IGL_ENUM_TO_STRING(ColorSpace, SRGB_LINEAR) IGL_ENUM_TO_STRING(ColorSpace, SRGB_NONLINEAR) IGL_ENUM_TO_STRING(ColorSpace, DISPLAY_P3_NONLINEAR) IGL_ENUM_TO_STRING(ColorSpace, EXTENDED_SRGB_LINEAR) IGL_ENUM_TO_STRING(ColorSpace, DISPLAY_P3_LINEAR) IGL_ENUM_TO_STRING(ColorSpace, DCI_P3_NONLINEAR) IGL_ENUM_TO_STRING(ColorSpace, BT709_LINEAR) IGL_ENUM_TO_STRING(ColorSpace, BT709_NONLINEAR) IGL_ENUM_TO_STRING(ColorSpace, BT2020_LINEAR) IGL_ENUM_TO_STRING(ColorSpace, HDR10_ST2084) IGL_ENUM_TO_STRING(ColorSpace, DOLBYVISION) IGL_ENUM_TO_STRING(ColorSpace, HDR10_HLG) IGL_ENUM_TO_STRING(ColorSpace, ADOBERGB_LINEAR) IGL_ENUM_TO_STRING(ColorSpace, ADOBERGB_NONLINEAR) IGL_ENUM_TO_STRING(ColorSpace, PASS_THROUGH) IGL_ENUM_TO_STRING(ColorSpace, EXTENDED_SRGB_NONLINEAR) IGL_ENUM_TO_STRING(ColorSpace, DISPLAY_NATIVE_AMD) IGL_ENUM_TO_STRING(ColorSpace, BT601_NONLINEAR) IGL_ENUM_TO_STRING(ColorSpace, BT2020_NONLINEAR) IGL_ENUM_TO_STRING(ColorSpace, BT2100_HLG_NONLINEAR) IGL_ENUM_TO_STRING(ColorSpace, BT2100_PQ_NONLINEAR) default: break; } IGL_UNREACHABLE_RETURN("unknown color space") } } // namespace igl ================================================ FILE: src/igl/CommandBuffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl { class IComputeCommandEncoder; class ISamplerState; class ITimer; class ITimestampQueries; struct RenderPassDesc; /** * Currently a no-op structure. */ struct CommandBufferDesc { std::string debugName; std::shared_ptr timer; std::shared_ptr timestampQueries; }; /** * Struct containing data about the command buffer usage. Currently used to track the number of draw * calls performed by this command buffer (see specific method usage below). */ struct CommandBufferStatistics { uint32_t currentDrawCount = 0; }; /** * @brief ICommandBuffer represents an object which accepts and stores commands to be executed on * the GPU. * * Commands can be added to the CommandBuffer using a CommandEncoder; ICommandBuffer can currently * be used to create two types of command encoders: RenderCommandEncoders (render commands using * fragment and/or vertex shaders) and ComputeCommandEncoders (compute commands using compute * shaders). * * ICommandBuffer::present() schedules the results of the commands encoded in the buffer to be * presented on the screen as soon as possible. It should be called after the commands are encoded * but before the commands are submitted (via a CommandQueue). * * ICommandBuffer also includes methods for synchronizing CPU code execution based on when the GPU * executes the commands encoded in the CommandBuffer. */ class ICommandBuffer { public: explicit ICommandBuffer(CommandBufferDesc iDesc) : desc(std::move(iDesc)) {} virtual ~ICommandBuffer() = default; /** * @brief Create a RenderCommandEncoder for encoding rendering commands into this CommandBuffer. * @returns a pointer to the RenderCommandEncoder */ virtual std::unique_ptr createRenderCommandEncoder( const RenderPassDesc& renderPass, const std::shared_ptr& framebuffer, const Dependencies& dependencies, Result* IGL_NULLABLE outResult = nullptr) = 0; std::unique_ptr createRenderCommandEncoder( const RenderPassDesc& renderPass, const std::shared_ptr& framebuffer, Result* IGL_NULLABLE outResult = nullptr) { return createRenderCommandEncoder(renderPass, framebuffer, Dependencies(), outResult); } /** * @brief Create a ComputeCommandEncoder for encoding compute commands into this CommandBuffer. * @returns a pointer to the ComputeCommandEncoder */ virtual std::unique_ptr createComputeCommandEncoder() = 0; /** * @brief presents the results of the encoded GPU commands the screen as soon as possible (once * the commands have completed executing). Should be called before submitting commands via a * CommandQueue. * @param surface takes a texture param representing a drawable that depends on the results of the * GPU commands. Note: this param is unused when using the OpenGL backend. */ virtual void present(const std::shared_ptr& surface) const = 0; /** * @brief Blocks execution of the current thread until the commands encoded in this * CommandBuffer have been scheduled for execution. */ virtual void waitUntilScheduled() = 0; /** * @brief Blocks execution of the current thread until the commands encoded in this CommandBuffer * have been executed on the GPU. */ virtual void waitUntilCompleted() = 0; /** * @brief Pushes a debug label onto a stack of debug string labels into the captured frame data. * * If supported by the backend GPU driver, this allows you to easily associate subsequent * commands in the captured call stack with this label. * * When all commands for this label have been sent to the encoder, call popDebugGroupLabel() * to pop the label off the stack. */ virtual void pushDebugGroupLabel(const char* IGL_NONNULL label, const igl::Color& color = Color(1, 1, 1, 1)) const = 0; /** * @brief Pops a most recent debug label off a stack of debug string labels. * * This should be preceded by pushDebugGroupLabel(). */ virtual void popDebugGroupLabel() const = 0; /** * @brief Copy data between buffers. */ virtual void copyBuffer(IBuffer& src, IBuffer& dst, uint64_t srcOffset, uint64_t dstOffset, uint64_t size) = 0; /** * @brief Copy texture data into a buffer. */ virtual void copyTextureToBuffer(ITexture& src, IBuffer& dst, uint64_t dstOffset, uint32_t level = 0, uint32_t layer = 0) = 0; /** * @returns the number of draw operations tracked by this CommandBuffer. This is tracked manually * via calls to incrementCurrentDrawCount(). */ [[nodiscard]] uint32_t getCurrentDrawCount() const { return statistics_.currentDrawCount; } /** * @brief Increment a counter representing the number of draw operations tracked by this * CommandBuffer. */ void incrementCurrentDrawCount() { statistics_.currentDrawCount++; } const CommandBufferDesc desc; const std::shared_ptr timer; private: CommandBufferStatistics statistics_; friend class ICommandQueue; }; } // namespace igl ================================================ FILE: src/igl/CommandEncoder.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl { class ICommandBuffer; class IDevice; class IBuffer; class IRenderPipelineState; class ISamplerState; class ITexture; /** * Dependencies are used to issue proper memory barriers for external resources, such as textures * modified by non-IGL code (Skia, Qt, etc), and synchronize between graphics and compute pipelines. */ struct Dependencies { static constexpr uint32_t kIglMaxTextureDependencies = 8; static constexpr uint32_t kIglMaxBufferDependencies = 8; // Note: please ensure that both arrays are dense, meaning that processing will halt immediately // if any NULL texture or buffer is encountered. ITexture* IGL_NULLABLE textures[kIglMaxTextureDependencies] = {}; IBuffer* IGL_NULLABLE buffers[kIglMaxBufferDependencies] = {}; const Dependencies* IGL_NULLABLE next = nullptr; // optional extra dependencies }; /** * A BindGroup represents a set of resources bound to a command encoder. * It is a replacement of the old OpenGL-style binding model where individual resources are bound * using multiple calls to bindTexture(...), bindSamplerState(), and bindBuffer(...). */ struct BindGroupTextureDesc { std::shared_ptr textures[IGL_TEXTURE_SAMPLERS_MAX] = {}; std::shared_ptr samplers[IGL_TEXTURE_SAMPLERS_MAX] = {}; std::string debugName; }; struct BindGroupBufferDesc { std::shared_ptr buffers[IGL_UNIFORM_BLOCKS_BINDING_MAX] = {}; size_t offset[IGL_UNIFORM_BLOCKS_BINDING_MAX] = {}; size_t size[IGL_UNIFORM_BLOCKS_BINDING_MAX] = {}; // 0 means the remaining size from `offset` to // the end of the buffer uint32_t isDynamicBufferMask = 0; // one bit per each buffer std::string debugName; }; class ICommandEncoder { public: explicit ICommandEncoder(std::shared_ptr commandBuffer) : commandBuffer_(std::move(commandBuffer)) {} virtual ~ICommandEncoder() = default; /** * Declares the end of commands generated by this instance of the encoder. * * After endEncoding() is called, the encoder is invalid. You must create * another encoder to submit more commands. */ virtual void endEncoding() = 0; /** * Pushes a debug label onto a stack of debug string labels into the captured frame data. * * If supported by the backend GPU driver, this allows you to easily associate subsequent * commands in the captured call stack with this label. * * When all commands for this label have been sent to the encoder, call popDebugGroupLabel() * to pop the label off the stack. */ virtual void pushDebugGroupLabel(const char* IGL_NONNULL label, const igl::Color& color = Color(1, 1, 1, 1)) const = 0; /** * Inserts a debug label into the captured frame data. * * If supported by the backend GPU driver, this allows you to easily insert a label into the * call stack of the captured frame data. */ virtual void insertDebugEventLabel(const char* IGL_NONNULL label, const igl::Color& color = Color(1, 1, 1, 1)) const = 0; /** * Pops a most recent debug label off a stack of debug string labels. * * This should be preceded by pushDebugGroupLabel(). */ virtual void popDebugGroupLabel() const = 0; ICommandBuffer& getCommandBuffer() { IGL_DEBUG_ASSERT(commandBuffer_); return *commandBuffer_; } [[nodiscard]] const std::shared_ptr& getCommandBufferPtr() const { IGL_DEBUG_ASSERT(commandBuffer_); return commandBuffer_; } private: std::shared_ptr commandBuffer_; }; } // namespace igl #if IGL_DEBUG && !defined(IGL_DISABLE_DEBUG_ENCODER_LABEL) #define IGL_DEBUG_ENCODER_LABEL_START(encoder, x) encoder.pushDebugGroupLabel(#x) #define IGL_DEBUG_ENCODER_LABEL_EVENT(encoder, x) encoder.insertDebugEventLabel(#x) #define IGL_DEBUG_ENCODER_LABEL_END(encoder) encoder.popDebugGroupLabel() #else #define IGL_DEBUG_ENCODER_LABEL_START(encoder, x) #define IGL_DEBUG_ENCODER_LABEL_EVENT(encoder, x) #define IGL_DEBUG_ENCODER_LABEL_END(encoder) #endif // IGL_DEBUG && !defined(IGL_DISABLE_DEBUG_ENCODER_LABEL) ================================================ FILE: src/igl/CommandQueue.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl { // Forward struct declarations // Forward class declarations struct CommandBufferDesc; class ICommandBuffer; /** * This is a placeholder for future use */ struct CommandQueueDesc {}; /** * Contains the current frame's draw count and last frame's draw count. * ICommandQueue controls these values and moves current draw count to last frame draw count through * the endFrame function. */ struct CommandQueueStatistics { uint32_t currentDrawCount = 0; uint32_t lastFrameDrawCount = 0; }; /// GPU Fence Handle using SubmitHandle = uint64_t; /** * Overarching structure used to create specific command buffers that accept device commands. * There are three different command queue types: compute, graphics, and memory transfer. * The key operations command queue provides are to create a command buffer to accept commands, * through the createCommandBuffer function, and then a submit command buffer which accepts those * commands into the queue through the submit function. Simple draw statistics are tracked for * current and last frame which can be interacted with through the getLastFrameDrawCount and * endFrame functions. */ class ICommandQueue { public: virtual ~ICommandQueue() = default; virtual std::shared_ptr createCommandBuffer(const CommandBufferDesc& desc, Result* IGL_NULLABLE outResult) = 0; virtual SubmitHandle submit(const ICommandBuffer& commandBuffer, bool endOfFrame = false) = 0; [[nodiscard]] uint32_t getLastFrameDrawCount() const { return statistics_.lastFrameDrawCount; } void endFrame() { statistics_.lastFrameDrawCount = statistics_.currentDrawCount; statistics_.currentDrawCount = 0; } protected: void incrementDrawCount(uint32_t newDrawCount) { statistics_.currentDrawCount += newDrawCount; } private: CommandQueueStatistics statistics_; }; } // namespace igl ================================================ FILE: src/igl/Common.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include namespace igl { // Make sure the structure igl::Color is tightly packed so it can be passed into APIs which expect // float[4] RGBA values static_assert(sizeof(Color) == 4 * sizeof(float)); std::string BackendTypeToString(BackendType backendType) { switch (backendType) { case BackendType::Invalid: return "Invalid"; case BackendType::OpenGL: return "OpenGL"; case BackendType::Metal: return "Metal"; case BackendType::Vulkan: return "Vulkan"; case BackendType::D3D12: return "D3D12"; // @fb-only // @fb-only case BackendType::Custom: return "Custom"; } IGL_UNREACHABLE_RETURN(std::string()) } void optimizedMemcpy(void* IGL_NULLABLE dst, const void* IGL_NULLABLE src, size_t size) { // Add null check for both dst and src IGL_DEBUG_ASSERT(dst != nullptr && src != nullptr, "dst and src must not be null"); if (!dst || !src) { return; } size_t optimizationCase = size; // There are cases where this function is used on an array of bytes, For // example, an IGL boolean array. In this case, dst or src only need to be // byte aligned. The logic here checks to see if dst and src are // multiples of 4. If not, then we will use the memcpy default case below if ((ptrdiff_t)dst & 0x3 || (ptrdiff_t)src & 0x3) { optimizationCase = 1; } switch (optimizationCase) { case 4: *((uint32_t*)dst) = *((const uint32_t*)src); break; case 8: *((uint64_t*)dst) = *((const uint64_t*)src); break; case 12: *((uint64_t*)dst) = *((const uint64_t*)src); *((uint32_t*)(dst) + 2) = *((const uint32_t*)(src) + 2); break; case 16: *((uint64_t*)dst) = *((const uint64_t*)src); *((uint64_t*)(dst) + 1) = *((const uint64_t*)(src) + 1); break; default: memcpy(dst, src, size); } } void destroy(IDevice* IGL_NULLABLE device, BindGroupTextureHandle handle) { if (device) { device->destroy(handle); } } void destroy(IDevice* IGL_NULLABLE device, BindGroupBufferHandle handle) { if (device) { device->destroy(handle); } } void destroy(IDevice* IGL_NULLABLE device, TextureHandle handle) { if (device) { // do nothing until we transition all textures to handles (void)handle; } } void destroy(IDevice* IGL_NULLABLE device, SamplerHandle handle) { if (device) { device->destroy(handle); } } void destroy(IDevice* IGL_NULLABLE device, DepthStencilStateHandle handle) { if (device) { // do nothing until we transition depth-stencil states to handles (void)handle; } } } // namespace igl ================================================ FILE: src/igl/Common.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #ifndef IGL_COMMON_H #define IGL_COMMON_H #include #include #include #include #include #include #include #include #include #define IGL_ARRAY_NUM_ELEMENTS(x) (sizeof(x) / sizeof((x)[0])) namespace igl { // Re-export types from base namespace for backward compatibility using base::BackendType; using base::TextureFormat; using base::TextureType; // Callback to delete and/or release a pointer using Deleter = void (*)(void* IGL_NULLABLE); /// Device Capabilities or Metal Features constexpr uint32_t IGL_TEXTURE_SAMPLERS_MAX = 16; constexpr uint32_t IGL_VERTEX_ATTRIBUTES_MAX = 24; // maximum number of buffers that can be bound to a shader stage // See maximum number of entries in the buffer argument table, per graphics or kernel function // in https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf constexpr uint32_t IGL_BUFFER_BINDINGS_MAX = 31; constexpr uint32_t IGL_UNIFORM_BLOCKS_BINDING_MAX = 16; // See GL_MAX_COLOR_ATTACHMENTS in // https://www.khronos.org/registry/OpenGL-Refpages/es3.0/html/glGet.xhtml // and see maximum number of color render targets in // https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf constexpr uint32_t IGL_COLOR_ATTACHMENTS_MAX = 4; // See https://www.khronos.org/registry/OpenGL-Refpages/es3.1/html/glDrawElementsIndirect.xhtml, // https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VkDrawIndexedIndirectCommand.html, // or https://developer.apple.com/documentation/metal/mtldrawindexedprimitivesindirectarguments. constexpr uint32_t IGL_DRAW_ELEMENTS_INDIRECT_COMMAND_SIZE = 4 * 5; enum class ResourceStorage { Invalid, /// Invalid sharing mode Private, /// Memory private to GPU access (fastest) Shared, /// Memory shared between CPU and GPU Managed, /// Memory pair synchronized between CPU and GPU Memoryless /// Memory can be accessed only by the GPU and only exist temporarily during a render /// pass }; enum class CullMode : uint8_t { Disabled, Front, Back }; enum class WindingMode : uint8_t { Clockwise, CounterClockwise }; enum class NormalizedZRange : uint8_t { NegOneToOne, ZeroToOne }; enum class PrimitiveType : uint8_t { Point, Line, LineStrip, Triangle, TriangleStrip, }; struct Result { enum class Code { // No error Ok, /// Bad argument, e.g. invalid buffer/texture/bind type ArgumentInvalid, /// nullptr input for non-null argument ArgumentNull, /// Argument out of range, e.g. attachment/mip-level/aniso out of range ArgumentOutOfRange, /// Cannot execute operation in current state InvalidOperation, /// Feature is not supported on current hardware or software Unsupported, /// Feature has not yet been implemented into IGL Unimplemented, /// Something bad happened internally but we don't know what RuntimeError, }; Code code = Code::Ok; std::string message; explicit Result() = default; explicit Result(Code code, const char* IGL_NULLABLE message = "") : code(code), message(message) {} explicit Result(Code code, std::string message) : code(code), message(std::move(message)) {} [[nodiscard]] bool isOk() const { return code == Result::Code::Ok; } static void setResult(Result* IGL_NULLABLE outResult, Code code, const std::string& message = "") { if (outResult != nullptr) { outResult->code = code; outResult->message = message; } } static void setResult(Result* IGL_NULLABLE outResult, const Result& sourceResult) { if (outResult != nullptr) { *outResult = sourceResult; } } static void setResult(Result* IGL_NULLABLE outResult, Result&& sourceResult) { if (outResult != nullptr) { *outResult = std::move(sourceResult); } } static void setOk(Result* IGL_NULLABLE outResult) { if (outResult != nullptr) { outResult->code = Code::Ok; outResult->message.clear(); } } }; enum class BackendFlavor : uint8_t { Invalid, OpenGL, OpenGL_ES, Metal, Vulkan, D3D12, // @fb-only }; std::string BackendTypeToString(BackendType backendType); ///-------------------------------------- /// MARK: - ScissorRect struct ScissorRect { uint32_t x = 0; uint32_t y = 0; uint32_t width = 0; uint32_t height = 0; [[nodiscard]] bool isNull() const { return width == 0 && height == 0; } }; ///-------------------------------------- /// MARK: - Size struct Size { float width = 0.0f; float height = 0.0f; Size() = default; Size(float width, float height) : width(width), height(height) {} }; struct Dimensions { Dimensions() = default; Dimensions(uint32_t w, uint32_t h, uint32_t d) : width(w), height(h), depth(d) {} uint32_t width = 0; uint32_t height = 0; uint32_t depth = 0; }; inline bool operator==(const Dimensions& lhs, const Dimensions& rhs) { return (lhs.width == rhs.width && lhs.height == rhs.height && lhs.depth == rhs.depth); } inline bool operator!=(const Dimensions& lhs, const Dimensions& rhs) { return !operator==(lhs, rhs); } inline bool operator==(const Size& lhs, const Size& rhs) { return (lhs.width == rhs.width && lhs.height == rhs.height); } inline bool operator!=(const Size& lhs, const Size& rhs) { return !operator==(lhs, rhs); } ///-------------------------------------- /// MARK: - Viewport /// x, y, width, height in pixels. minDepth, maxDepth are in [0.0, 1.0] struct Viewport { float x = 0.0f; float y = 0.0f; float width = 1.0f; float height = 1.0f; float minDepth = 0.0f; float maxDepth = 1.0f; }; inline bool operator==(const Viewport& lhs, const Viewport& rhs) { return lhs.x == rhs.x && lhs.y == rhs.y && lhs.width == rhs.width && lhs.height == rhs.height && lhs.minDepth == rhs.minDepth && lhs.maxDepth == rhs.maxDepth; } inline bool operator!=(const Viewport& lhs, const Viewport& rhs) { return !operator==(lhs, rhs); } constexpr Viewport kInvalidViewport = {-1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f}; ///-------------------------------------- /// MARK: - Enum utilities // Get value of enum by stripping enum class type template constexpr typename std::underlying_type::type EnumToValue(E enumerator) noexcept { return static_cast::type>(enumerator); } ///-------------------------------------- /// MARK: - ScopeGuard // a very minimalistic version of folly/ScopeGuard.h namespace { enum class ScopeGuardOnExit {}; template class ScopeGuard { public: explicit ScopeGuard(const T& fn) : fn_(fn) {} ~ScopeGuard() { fn_(); } private: T fn_; }; template // Ignore readability-named-parameter // @lint-ignore CLANGTIDY ScopeGuard operator+(ScopeGuardOnExit /*guard*/, T&& fn) { return ScopeGuard(std::forward(fn)); } } // namespace #define IGL_SCOPE_EXIT \ auto FB_ANONYMOUS_VARIABLE(SCOPE_EXIT_STATE) = ScopeGuardOnExit() + [&]() noexcept ///-------------------------------------- /// MARK: - optimizedMemcpy // Optimized version of memcpy() that allows to copy smallest uniforms in the most efficient way. // Other sizes utilize a libc memcpy() implementation. It's not a universal function and expects to // have a proper alignment for data! void optimizedMemcpy(void* IGL_NULLABLE dst, const void* IGL_NULLABLE src, size_t size); ///-------------------------------------- /// MARK: - Handle // Non-ref counted handles; based on: // https://enginearchitecture.realtimerendering.com/downloads/reac2023_modern_mobile_rendering_at_hypehype.pdf // https://github.com/corporateshark/lightweightvk/blob/main/lvk/LVK.h template class Handle final { public: Handle() noexcept = default; [[nodiscard]] bool empty() const noexcept { return gen_ == 0; } [[nodiscard]] bool valid() const noexcept { return gen_ != 0; } [[nodiscard]] uint32_t index() const noexcept { return index_; } [[nodiscard]] uint32_t gen() const noexcept { return gen_; } [[nodiscard]] void* IGL_NULLABLE indexAsVoid() const noexcept { return reinterpret_cast( // NOLINT(performance-no-int-to-ptr) static_cast(index_)); // NOLINT(performance-no-int-to-ptr) } bool operator==(const Handle& other) const noexcept { return index_ == other.index_ && gen_ == other.gen_; } bool operator!=(const Handle& other) const noexcept { return index_ != other.index_ || gen_ != other.gen_; } // allow conditions 'if (handle)' explicit operator bool() const noexcept { return gen_ != 0; } private: Handle(uint32_t index, uint32_t gen) noexcept : index_(index), gen_(gen) {} template friend class Pool; uint32_t index_ = 0; // the index of this handle within a Pool uint32_t gen_ = 0; // the generation of this handle to prevent the ABA Problem }; static_assert(sizeof(Handle) == sizeof(uint64_t)); // specialized with dummy structs for type safety using BindGroupTextureHandle = Handle; using BindGroupBufferHandle = Handle; using TextureHandle = Handle; using SamplerHandle = Handle; using DepthStencilStateHandle = Handle; class IDevice; // forward declarations to access incomplete type IDevice void destroy(IDevice* IGL_NULLABLE device, BindGroupTextureHandle handle); void destroy(IDevice* IGL_NULLABLE device, BindGroupBufferHandle handle); void destroy(IDevice* IGL_NULLABLE device, TextureHandle handle); void destroy(IDevice* IGL_NULLABLE device, SamplerHandle handle); void destroy(IDevice* IGL_NULLABLE device, DepthStencilStateHandle handle); ///-------------------------------------- /// MARK: - Holder // RAII wrapper around Handle<>; based on: // https://github.com/corporateshark/lightweightvk/blob/main/lvk/LVK.h template class Holder final { public: Holder() noexcept = default; Holder(IDevice* IGL_NULLABLE device, HandleType handle) noexcept : device_(device), handle_(handle) {} ~Holder() { igl::destroy(device_, handle_); } Holder(const Holder&) = delete; Holder(Holder&& other) noexcept : device_(other.device_), handle_(other.handle_) { other.device_ = nullptr; other.handle_ = HandleType{}; } Holder& operator=(const Holder&) = delete; Holder& operator=(Holder&& other) noexcept { std::swap(device_, other.device_); std::swap(handle_, other.handle_); return *this; } Holder& operator=(std::nullptr_t) { this->reset(); return *this; } [[nodiscard]] operator HandleType() const noexcept { return handle_; } [[nodiscard]] bool valid() const noexcept { return handle_.valid(); } [[nodiscard]] bool empty() const noexcept { return handle_.empty(); } void reset() { igl::destroy(device_, handle_); device_ = nullptr; handle_ = HandleType{}; } [[nodiscard]] HandleType release() noexcept { device_ = nullptr; return std::exchange(handle_, HandleType{}); } [[nodiscard]] uint32_t gen() const noexcept { return handle_.gen(); } [[nodiscard]] uint32_t index() const noexcept { return handle_.index(); } [[nodiscard]] void* IGL_NULLABLE indexAsVoid() const noexcept { return handle_.indexAsVoid(); } private: IDevice* IGL_NULLABLE device_ = nullptr; HandleType handle_ = {}; }; ///-------------------------------------- /// MARK: - Pool // A Pool of objects which is compatible with the abovementioned Handle<> types; based on: // https://enginearchitecture.realtimerendering.com/downloads/reac2023_modern_mobile_rendering_at_hypehype.pdf // https://github.com/corporateshark/lightweightvk/blob/main/lvk/Pool.h template class Pool { static constexpr uint32_t kListEndSentinel = 0xffffffff; struct PoolEntry { explicit PoolEntry(ImplObjectType& obj) noexcept : obj_(std::move(obj)) {} ImplObjectType obj_ = {}; uint32_t gen_ = 1; uint32_t nextFree_ = kListEndSentinel; }; uint32_t freeListHead_ = kListEndSentinel; uint32_t numObjects_ = 0; public: std::vector objects_; [[nodiscard]] Handle create(ImplObjectType&& obj) { uint32_t idx = 0; if (freeListHead_ != kListEndSentinel) { idx = freeListHead_; freeListHead_ = objects_[idx].nextFree_; objects_[idx].obj_ = std::move(obj); } else { idx = (uint32_t)objects_.size(); objects_.emplace_back(obj); } numObjects_++; return Handle(idx, objects_[idx].gen_); } void destroy(Handle handle) noexcept { if (handle.empty()) { return; } IGL_DEBUG_ASSERT(numObjects_ > 0, "Double deletion"); const uint32_t index = handle.index(); IGL_DEBUG_ASSERT(index < objects_.size()); IGL_DEBUG_ASSERT(handle.gen() == objects_[index].gen_, "Double deletion"); objects_[index].obj_ = ImplObjectType{}; objects_[index].gen_++; objects_[index].nextFree_ = freeListHead_; freeListHead_ = index; numObjects_--; } // this is a helper function to simplify migration to handles (should be deprecated after the // migration is completed) void destroy(uint32_t index) noexcept { IGL_DEBUG_ASSERT(numObjects_ > 0, "Double deletion"); IGL_DEBUG_ASSERT(index < objects_.size()); objects_[index].obj_ = ImplObjectType{}; objects_[index].gen_++; objects_[index].nextFree_ = freeListHead_; freeListHead_ = index; numObjects_--; } [[nodiscard]] const ImplObjectType* IGL_NULLABLE get(Handle handle) const noexcept { if (handle.empty()) { return nullptr; } const uint32_t index = handle.index(); IGL_DEBUG_ASSERT(index < objects_.size()); IGL_DEBUG_ASSERT(handle.gen() == objects_[index].gen_, "Accessing a deleted object"); return &objects_[index].obj_; } [[nodiscard]] ImplObjectType* IGL_NULLABLE get(Handle handle) noexcept { if (handle.empty()) { return nullptr; } const uint32_t index = handle.index(); IGL_DEBUG_ASSERT(index < objects_.size()); IGL_DEBUG_ASSERT(handle.gen() == objects_[index].gen_, "Accessing a deleted object"); return &objects_[index].obj_; } [[nodiscard]] Handle findObject(const ImplObjectType* IGL_NULLABLE obj) noexcept { if (!obj) { return {}; } for (size_t idx = 0; idx != objects_.size(); idx++) { if (objects_[idx].obj_ == *obj) { return Handle((uint32_t)idx, objects_[idx].gen_); } } return {}; } void clear() noexcept { objects_.clear(); freeListHead_ = kListEndSentinel; numObjects_ = 0; } [[nodiscard]] uint32_t numObjects() const noexcept { return numObjects_; } }; } // namespace igl #endif // IGL_COMMON_H ================================================ FILE: src/igl/ComputeCommandEncoder.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include namespace igl { class IComputePipelineState; class ISamplerState; /** * @brief Object for encoding commands in a compute pass * * Create IComputeCommandEncoder object by calling ICommandBuffer::createComputeCommandEncoder. * You can encode multiple commands in a single compute pass. * To encode a compute command: * - Call bindComputePipelineState method to set compute pipeline state. * - Call one or more other bind functions to specify parameters for the compute function. * - Call dispatchThreadgroups method to encode a compute command. * You can encode another compute command after calling dispatchThreadgroups or call endEncoding to * finish the compute pass. You must always call endEncoding before the encoder is released or * before creating another encoder. */ class IComputeCommandEncoder : public ICommandEncoder { public: /** * @brief Construct a new IComputeCommandEncoder object * */ IComputeCommandEncoder() : ICommandEncoder::ICommandEncoder(nullptr) {} /** * @brief Destroy the IComputeCommandEncoder object * */ ~IComputeCommandEncoder() override = default; /** * @brief Binds an individual uniform. * * @param uniformDesc A descriptor for the uniform. * @param data The uniform data to bind. * Exclusively used when uniform blocks are not supported. */ virtual void bindUniform(const UniformDesc& uniformDesc, const void* data) = 0; /** * @brief Sets a texture for the compute function * * @param index An index in the texture argument table. * @param texture The texture to set in the texture argument table. */ virtual void bindTexture(uint32_t index, ITexture* texture) = 0; virtual void bindImageTexture(uint32_t index, ITexture* texture, TextureFormat format) = 0; virtual void bindSamplerState(uint32_t index, ISamplerState* samplerState) = 0; /** * @brief Sets a buffer for the compute function * * @param index An index for the buffer argument table. * @param buffer The buffer to set in the buffer argument table. * @param offset Where the data begins in bytes from the start of the buffer. * @param bufferSize The size of the buffer to bind used for additional validation (0 means the * remaining size starting from `offset`) */ virtual void bindBuffer(uint32_t index, IBuffer* buffer, size_t offset = 0, size_t bufferSize = 0) = 0; /** * @brief Sets a block of data for the compute function. A buffer will be created behind the * scenes to hold the input data and bound to the buffer argument table at the specified index. * * @param index An index for the buffer argument table. * @param data The memory address from which to copy the data. * @param length The number of bytes to copy. */ virtual void bindBytes(uint32_t index, const void* data, size_t length) = 0; /** * @brief Sets a block of data for the compute function. * * @param data The memory address from which to copy the data. * @param length The number of bytes to copy. * @param offset An offset bytes into the push constants buffer. */ virtual void bindPushConstants(const void* data, size_t length, size_t offset = 0) = 0; /** * @brief Sets the compute pipeline state object. * * @param pipelineState A pipeline state object to set for the compute function. */ virtual void bindComputePipelineState( const std::shared_ptr& pipelineState) = 0; /** * @brief Encodes a compute command using a grid aligned to threadgroup boundaries. If the size of * your data doesn't match the size of the grid, you may have to perform boundary checks in your * compute function. When the compute command is encoded, any necessary references to parameters * or resources previously set on the encoder are recorded as part of the command. After encoding * a command, you can safely change the encoding state to set up parameters needed to encode other * commands. The total number of threads per grid is threadgroupCount * threadgroupSize. * * @param threadgroupCount The number of thread groups in the grid, in each dimension. * @param threadgroupSize The number of threads in one threadgroup, in each dimension. * @param dependencies Any textures or buffers accessed in this dispatch. */ virtual void dispatchThreadGroups(const Dimensions& threadgroupCount, const Dimensions& threadgroupSize, const Dependencies& dependencies = Dependencies()) = 0; }; } // namespace igl ================================================ FILE: src/igl/ComputePipelineState.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include #include namespace igl { /** * @brief Object for customizing the compilation of a new compute pipeline state object * To create a IComputePipelineState object, you create a pipeline descriptor, configure * its properties, pass it to one of the creation methods on a IDevice object. * * The most important property to set is the computeFunction property, * which specifies which function to call. */ struct ComputePipelineDesc { public: bool operator==(const ComputePipelineDesc& other) const { return shaderStages == other.shaderStages && imagesMap == other.imagesMap && buffersMap == other.buffersMap && debugName == other.debugName; } /* * OpenGL only */ std::unordered_map imagesMap; std::unordered_map buffersMap; /* * @brief The compute kernel the pipeline calls. */ std::shared_ptr shaderStages; std::string debugName; }; /** * @brief Object that contains a compiled compute pipeline. * These objects can be created by calling methods on an IDevice object. */ class IComputePipelineState { public: using IComputePipelineReflection = IRenderPipelineReflection; virtual std::shared_ptr computePipelineReflection() = 0; virtual ~IComputePipelineState() = default; [[nodiscard]] virtual int getIndexByName(const NameHandle& /* name */) const { return -1; } }; } // namespace igl /// Hashing function declarations /// namespace std { // ComputePipelineDesc hash template<> struct hash { size_t operator()(const igl::ComputePipelineDesc& desc) const { size_t hash = std::hash()(reinterpret_cast(desc.shaderStages.get())); hash ^= std::hash()(desc.debugName); for (const auto& p : desc.buffersMap) { hash ^= std::hash()(p.first); hash ^= std::hash()(p.second.toString()); } for (const auto& p : desc.imagesMap) { hash ^= std::hash()(p.first); hash ^= std::hash()(p.second.toString()); } return hash; } }; } // namespace std ================================================ FILE: src/igl/Config.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once // @fb-only // @fb-only // @fb-only ///-------------------------------------- /// MARK: - Platform /// /// Platform conditionals specify which OS the code is being compiled for. /// /// MICROSOFT(WIN)/APPLE/ANDROID/LINUX are mutually exclusive. /// MACOS/IOS(_SIMULATOR) are mutually exclusive. /// /// The following set of conditionals exist and currently are supported: /// /// Windows: /// IGL_PLATFORM_WINDOWS /// Apple: /// IGL_PLATFORM_APPLE /// IGL_PLATFORM_IOS /// IGL_PLATFORM_IOS_SIMULATOR /// IGL_PLATFORM_MACCATALYST /// IGL_PLATFORM_MACOSX /// Android: /// IGL_PLATFORM_ANDROID /// Linux: /// IGL_PLATFORM_LINUX /// WEBGL: /// IGL_PLATFORM_EMSCRIPTEN #if !defined(IGL_CMAKE_BUILD) // clang-format off // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // clang-format on #else // !defined(IGL_CMAKE_BUILD) // clang-format off // Windows #if defined(_WIN32) #define IGL_PLATFORM_WINDOWS 1 #define IGL_PLATFORM_APPLE 0 #define IGL_PLATFORM_IOS 0 #define IGL_PLATFORM_IOS_SIMULATOR 0 #define IGL_PLATFORM_MACCATALYST 0 #define IGL_PLATFORM_MACOSX 0 #define IGL_PLATFORM_ANDROID 0 #define IGL_PLATFORM_LINUX 0 #define IGL_PLATFORM_EMSCRIPTEN 0 // Apple #elif defined (__APPLE__) #define IGL_PLATFORM_WINDOWS 0 #define IGL_PLATFORM_ANDROID 0 #define IGL_PLATFORM_LINUX 0 #define IGL_PLATFORM_APPLE 1 #define IGL_PLATFORM_EMSCRIPTEN 0 #include #if TARGET_OS_SIMULATOR #define IGL_PLATFORM_IOS 1 // iOS Simulator is iOS #define IGL_PLATFORM_IOS_SIMULATOR 1 #define IGL_PLATFORM_MACCATALYST 0 #define IGL_PLATFORM_MACOSX 0 #elif TARGET_OS_MACCATALYST #define IGL_PLATFORM_IOS 0 #define IGL_PLATFORM_IOS_SIMULATOR 0 #define IGL_PLATFORM_MACCATALYST 1 #define IGL_PLATFORM_MACOSX 0 #elif TARGET_OS_IPHONE #define IGL_PLATFORM_IOS 1 #define IGL_PLATFORM_IOS_SIMULATOR 0 #define IGL_PLATFORM_MACCATALYST 0 #define IGL_PLATFORM_MACOSX 0 #elif TARGET_OS_OSX #define IGL_PLATFORM_IOS 0 #define IGL_PLATFORM_IOS_SIMULATOR 0 #define IGL_PLATFORM_MACCATALYST 0 #define IGL_PLATFORM_MACOSX 1 #else #error "Unknown Apple target" #endif // Android #elif defined(__ANDROID__) #define IGL_PLATFORM_WINDOWS 0 #define IGL_PLATFORM_APPLE 0 #define IGL_PLATFORM_IOS 0 #define IGL_PLATFORM_IOS_SIMULATOR 0 #define IGL_PLATFORM_MACCATALYST 0 #define IGL_PLATFORM_MACOSX 0 #define IGL_PLATFORM_ANDROID 1 #define IGL_PLATFORM_LINUX 0 #define IGL_PLATFORM_EMSCRIPTEN 0 // Linux #elif defined(__linux__) #define IGL_PLATFORM_WINDOWS 0 #define IGL_PLATFORM_APPLE 0 #define IGL_PLATFORM_IOS 0 #define IGL_PLATFORM_IOS_SIMULATOR 0 #define IGL_PLATFORM_MACCATALYST 0 #define IGL_PLATFORM_MACOSX 0 #define IGL_PLATFORM_ANDROID 0 #define IGL_PLATFORM_LINUX 1 #define IGL_PLATFORM_EMSCRIPTEN 0 #elif defined(__EMSCRIPTEN__) #define IGL_PLATFORM_WINDOWS 0 #define IGL_PLATFORM_APPLE 0 #define IGL_PLATFORM_IOS 0 #define IGL_PLATFORM_IOS_SIMULATOR 0 #define IGL_PLATFORM_MACCATALYST 0 #define IGL_PLATFORM_MACOSX 0 #define IGL_PLATFORM_ANDROID 0 #define IGL_PLATFORM_LINUX 0 #define IGL_PLATFORM_EMSCRIPTEN 1 // Rest #else #define IGL_PLATFORM_WINDOWS 0 #define IGL_PLATFORM_APPLE 0 #define IGL_PLATFORM_IOS 0 #define IGL_PLATFORM_IOS_SIMULATOR 0 #define IGL_PLATFORM_MACCATALYST 0 #define IGL_PLATFORM_MACOSX 0 #define IGL_PLATFORM_ANDROID 0 #define IGL_PLATFORM_LINUX 0 #define IGL_PLATFORM_EMSCRIPTEN 0 #error "Platform not supported" #endif #endif // !defined(IGL_CMAKE_BUILD) #if IGL_PLATFORM_ANDROID && __ANDROID_MIN_SDK_VERSION__ >= 26 #define IGL_ANDROID_HWBUFFER_SUPPORTED #endif // __ANDROID_MIN_SDK_VERSION__ >= 26 // IGL_PLATFORM_XR is for extended reality platforms like OpenXR #if !defined(IGL_PLATFORM_XR) #define IGL_PLATFORM_XR 0 #endif // clang-format on ///-------------------------------------- /// MARK: - Conditional backend support // // While libraries/utilities/helpers typically want to support all IGL backends, top level // applications might want to be more selective about them to minimize dependencies. IGL exposes // BUCK configs in defs.bzl to control backend support, and all BUCK modules that have a direct // dependency on IGL backends are expected to use the definitions provided there for integration. // // Furthermore, the macros below are provided so that IGL clients can safely wrap backend specific // code for conditional compilation. #if defined(IGL_BACKEND_ENABLE_HEADLESS) #define IGL_BACKEND_HEADLESS 1 #else #define IGL_BACKEND_HEADLESS 0 #endif #if defined(IGL_BACKEND_ENABLE_METAL) #define IGL_BACKEND_METAL 1 #else #define IGL_BACKEND_METAL 0 #endif #if defined(IGL_BACKEND_ENABLE_OPENGL) #define IGL_BACKEND_OPENGL 1 #else #define IGL_BACKEND_OPENGL 0 #endif #if defined(IGL_BACKEND_ENABLE_VULKAN) #define IGL_BACKEND_VULKAN 1 #else #define IGL_BACKEND_VULKAN 0 #endif #if defined(IGL_BACKEND_ENABLE_D3D12) #define IGL_BACKEND_D3D12 1 #else #define IGL_BACKEND_D3D12 0 #endif // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only ///-------------------------------------- /// MARK: - Angle support #if defined(FORCE_USE_ANGLE) #define IGL_ANGLE 1 #define IGL_DISABLE_DEBUG_BUFFER_LABEL 1 #else #define IGL_ANGLE 0 #endif //-------------------------------------- /// MARK: - Linux with SwiftShader // // IGL_PLATFORM_LINUX_SWIFTSHADER is a use case of IGL_PLATFORM_LINUX that uses // SwiftShader for rendering. For example, Rainbow uses SwiftShader in a CPU only // environment currently. #if defined(FORCE_USE_SWIFTSHADER) && IGL_PLATFORM_LINUX #define IGL_PLATFORM_LINUX_SWIFTSHADER 1 #else #define IGL_PLATFORM_LINUX_SWIFTSHADER 0 #endif //-------------------------------------- /// MARK: - Linux with EGL // // IGL_PLATFORM_LINUX_USE_EGL enables EGL context on Linux, otherwise GLX is in use. // GLX is used in CMake builds for samples and shell apps to use OpenGL 4.6 on Linux desktops. #if IGL_PLATFORM_LINUX #if !defined(IGL_PLATFORM_LINUX_USE_EGL) #define IGL_PLATFORM_LINUX_USE_EGL 1 #endif #else #if !defined(IGL_PLATFORM_LINUX_USE_EGL) #define IGL_PLATFORM_LINUX_USE_EGL 0 #endif #endif ///-------------------------------------- /// MARK: - Debug #if !defined(IGL_CMAKE_BUILD) && !defined(IGL_DEBUG) // @fb-only #endif // !defined(IGL_CMAKE_BUILD) && !defined(IGL_DEBUG) // clang-format off #if !defined(IGL_DEBUG) // allow build systems to define it #if IGL_PLATFORM_ANDROID && !defined(FBANDROID_BUILD_MODE_OPT) // On Android, buck defines NDEBUG for all builds so the test above doesn't work. // FBANDROID_BUILD_MODE_OPT is only defined in production builds and was created // with the exact purpose of allowing native code to differentiate build modes. #define IGL_DEBUG 1 #elif IGL_PLATFORM_WINDOWS // Visual Studio never defines NDEBUG, it uses _DEBUG instead. See: // https://learn.microsoft.com/en-us/cpp/c-runtime-library/debug?view=msvc-170 #if defined(_DEBUG) || defined(DEBUG) #define IGL_DEBUG 1 #else #define IGL_DEBUG 0 #endif #elif !defined(NDEBUG) #define IGL_DEBUG 1 #else #define IGL_DEBUG 0 #endif #endif // clang-format on ///-------------------------------------- /// MARK: - Logging #if IGL_DEBUG || defined(IGL_FORCE_ENABLE_LOGS) #define IGL_LOGGING_ENABLED 1 #else #define IGL_LOGGING_ENABLED 0 #endif ///-------------------------------------- /// MARK: - Soft Errors // clang-format off #if !defined(IGL_SOFT_ERROR_ENABLED) // Either we have IGL_DEBUG, or Windows/Linux/etc, since we don't have good detection mechanism there. #if IGL_DEBUG || (!IGL_PLATFORM_APPLE && !IGL_PLATFORM_ANDROID) #define IGL_SOFT_ERROR_ENABLED 1 #else #define IGL_SOFT_ERROR_ENABLED 0 #endif #endif // clang-format on ///-------------------------------------- /// MARK: - Debug Asserts #if IGL_LOGGING_ENABLED #define IGL_DEBUG_ABORT_ENABLED 1 #else #define IGL_DEBUG_ABORT_ENABLED 0 #endif #if IGL_DEBUG #define IGL_DEBUG_BREAK_ENABLED 1 #else #define IGL_DEBUG_BREAK_ENABLED 0 #endif ================================================ FILE: src/igl/Core.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #ifndef IGL_CORE_H #define IGL_CORE_H /** * @brief Core.h is a minimal header set for non-graphics utilities (e.g. logging, assert) * * This is useful for auxiliary modules in IGL that don't involve graphics (e.g. shell) */ // Define macros to disable checks #if !defined(IGL_COMMON_SKIP_CHECK) #define IGL_COMMON_SKIP_CHECK 1 #define IGL_CORE_H_COMMON_SKIP_CHECK 1 // Marker so we know to undefine at end of header #endif // !defined(IGL_COMMON_SKIP_CHECK) #include #include #include // Undefine macros that are local to this header #if defined(IGL_CORE_H_COMMON_SKIP_CHECK) #undef IGL_COMMON_SKIP_CHECK #undef IGL_CORE_H_COMMON_SKIP_CHECK #endif // defined(IGL_CORE_H_COMMON_SKIP_CHECK) #include #endif // IGL_CORE_H ================================================ FILE: src/igl/DebugMacros.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include // Debug macros that take in an igl CommandBuffer and set some debug labels to group the drawcalls #if IGL_DEBUG && !defined(IGL_DISABLE_DEBUG_BUFFER_LABEL) #define IGL_DEBUG_BUFFER_LABEL_START(buffer, x) (buffer)->pushDebugGroupLabel(x); #define IGL_DEBUG_BUFFER_LABEL_END(buffer) (buffer)->popDebugGroupLabel() #define IGL_DEBUG_BUFFER_LABEL_START_GUARD(buffer, x) \ IGL_DEBUG_BUFFER_LABEL_START(buffer, x); \ auto popDebugGroupLabelScope = \ folly::makeGuard([cmdBuffer = (buffer)]() { IGL_DEBUG_BUFFER_LABEL_END(cmdBuffer); }); #else #define IGL_DEBUG_BUFFER_LABEL_START(buffer, x) #define IGL_DEBUG_BUFFER_LABEL_END(buffer) #define IGL_DEBUG_BUFFER_LABEL_START_GUARD(buffer, x) #endif // IGL_DEBUG && !defined(IGL_DISABLE_DEBUG_BUFFER_LABEL) ================================================ FILE: src/igl/DepthStencilState.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include using namespace igl; size_t std::hash::operator()(const igl::StencilStateDesc& key) const { size_t hash = std::hash()(static_cast(EnumToValue(key.stencilCompareFunction))); hash ^= std::hash()(static_cast(key.writeMask)); hash ^= std::hash()(static_cast(key.readMask)); hash ^= std::hash()(static_cast(EnumToValue(key.depthStencilPassOperation))); hash ^= std::hash()(static_cast(EnumToValue(key.depthFailureOperation))); hash ^= std::hash()(static_cast(EnumToValue(key.stencilFailureOperation))); return hash; } bool DepthStencilStateDesc::operator!=(const DepthStencilStateDesc& other) const { return !(*this == other); } bool DepthStencilStateDesc::operator==(const DepthStencilStateDesc& other) const { return frontFaceStencil == other.frontFaceStencil && compareFunction == other.compareFunction && backFaceStencil == other.backFaceStencil && isDepthWriteEnabled == other.isDepthWriteEnabled; } size_t std::hash::operator()( const igl::DepthStencilStateDesc& key) const { size_t hash = std::hash()(key.frontFaceStencil); hash ^= std::hash()(key.backFaceStencil); hash ^= std::hash()(static_cast(EnumToValue(key.compareFunction))); hash ^= std::hash()(static_cast(key.isDepthWriteEnabled)); return hash; } ================================================ FILE: src/igl/DepthStencilState.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include // IWYU pragma: keep namespace igl { /** * @brief Comparison tests used in depth testing and stencil testing. * * Testing is performed by using the CompareFunction to compare a new fragment's value and the an * existing value at the fragment's location. * * Never : Never passes. * Less : Passes if the fragment's value is strictly less than the existing value. * Equal : Passes if the fragment's value is exactly equal to the existing value. * LessEqual : Passes if the fragment's value is less than or equal to the existing value. * NotEqual : Passes if the fragment's value is not equal to the existing value. * GreaterEqual : Passes if the fragment's value is greater than or equal to the existing value. * AlwaysPass : Always passes. */ enum class CompareFunction : uint8_t { Never = 0, Less, Equal, LessEqual, Greater, NotEqual, GreaterEqual, AlwaysPass }; /** * @brief A stencil operation to perform on a fragment in the stencil buffer. * * Separate stencil operations can be configured for when the stencil test fails, when it passes * and the depth test fails and when both the depth and stencil tests pass. The operation * determines what happens to the fragment's value in the stencil buffer when it is executed. * * Keep : The existing value is kept. * Zero : The value is set to zero. * Replace : The value is replaced with the stencil reference value. * IncrementClamp : The value is incremented by 1 unless it is already the maximum possible value. * DecrementClamp : The value is decremented by 1 unless it is already the minimum possible value. * Invert : The value is logically inverted. * IncrementWrap : The max possible value is set to zero. All other values are incremented by 1. * DecrementWrap : Zero is set to the max possible value. All other values are decremented by 1. */ enum class StencilOperation : uint8_t { Keep = 0, Zero, Replace, IncrementClamp, DecrementClamp, Invert, IncrementWrap, DecrementWrap }; /** * @brief Describes the stencil operations for either the front or back face. * * A DepthStencilStateDesc has descriptors for both the front and back face. These control * how the stencil buffers are updated during rendering. */ struct StencilStateDesc { /** * @brief The operation to perform when the stencil test fails. */ StencilOperation stencilFailureOperation = StencilOperation::Keep; /** * @brief The operation to perform when the stencil test succeeds but the depth test fails. */ StencilOperation depthFailureOperation = StencilOperation::Keep; /** * @brief The operation to perform when both the depth and stencil tests functions pass. */ StencilOperation depthStencilPassOperation = StencilOperation::Keep; /** * @brief The comparison operation to use for stencil testing. */ CompareFunction stencilCompareFunction = CompareFunction::AlwaysPass; /** * @brief A bit mask that determines which stencil value bits are compared in the stencil test. */ uint32_t readMask = (uint32_t)~0; /** * @brief A bit mask that determines which stencil value bits are written to by stencil * operations. */ uint32_t writeMask = (uint32_t)~0; /** * @brief Compares two StencilStateDesc objects for equality. * * Returns true if all descriptor properties are identical. */ bool operator==(const StencilStateDesc& other) const = default; bool operator!=(const StencilStateDesc& other) const = default; }; /** * @brief Describes the depth and stencil configuration for a render pass. * * This describes what depth comparison function to use, and whether to retain or discard * any new depth data. It also describes the stencil testing and stencil operations to use for both * the front and back face of polygons. */ struct DepthStencilStateDesc { /** * @brief Identifier used for debugging */ std::string debugName; /** * @brief The comparison operation to use for depth testing. */ CompareFunction compareFunction = CompareFunction::AlwaysPass; /** * @brief Determines whether new depth values are written. * * If true, depth values for any fragments that are not discarded are written. * If false, the fragment shader will execute for fragments that pass the depth test but * their depth values will not be written. */ bool isDepthWriteEnabled = false; /** * @brief The stencil operation to use for the back face of polygons. */ StencilStateDesc backFaceStencil; /** * @brief The stencil operation to use for the front face of polygons. */ StencilStateDesc frontFaceStencil; /** * @brief Compares two DepthStencilStateDesc objects for equality. * * Returns true if all descriptor properties are identical. */ bool operator==(const DepthStencilStateDesc& other) const; /** * @brief Compares two DepthStencilStateDesc objects for inequality. * * Returns true if any descriptor properties differ. */ bool operator!=(const DepthStencilStateDesc& other) const; }; /** * @brief A depth and stencil configuration. * * This interface is the backend agnostic representation for a depth and stencil configuration. * To create an instance, populate a DepthStencilStateDesc and call IDevice.createDepthStencilState. * To use an instance in a render pass, call IRenderCommandEncoder.bindDepthStencilState. */ class IDepthStencilState { public: protected: IDepthStencilState() = default; virtual ~IDepthStencilState() = default; }; } // namespace igl /// Hashing function declarations /// namespace std { /** * @brief Provides a hash function for igl::DepthStencilStateDesc. */ template<> struct hash { /** * @brief Computes a hash value for igl::DepthStencilStateDesc. * * The hash value is based on all properties in the igl::DepthStencilStateDesc; */ size_t operator()(const igl::DepthStencilStateDesc& /*key*/) const; }; /** * @brief Provides a hash function for igl::StencilStateDesc. */ template<> struct hash { /** * @brief Computes a hash value for igl::StencilStateDesc. * * The hash value is based on all properties in the igl::StencilStateDesc; */ size_t operator()(const igl::StencilStateDesc& /*key*/) const; }; } // namespace std ================================================ FILE: src/igl/Device.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace igl { bool IDevice::defaultVerifyScope() { return scopeDepth_ > 0; } TextureDesc IDevice::sanitize(const TextureDesc& desc) const { TextureDesc sanitized = desc; if (desc.width == 0 || desc.height == 0 || desc.depth == 0 || desc.numLayers == 0 || desc.numSamples == 0 || desc.numMipLevels == 0) { sanitized.width = std::max(sanitized.width, 1u); sanitized.height = std::max(sanitized.height, 1u); sanitized.depth = std::max(sanitized.depth, 1u); sanitized.numLayers = std::max(sanitized.numLayers, 1u); sanitized.numSamples = std::max(sanitized.numSamples, 1u); sanitized.numMipLevels = std::max(sanitized.numMipLevels, 1u); IGL_LOG_ERROR( "width (%u), height (%u), depth (%u), numLayers (%u), numSamples (%u) and numMipLevels " "(%u) should be at least 1.\n", desc.width, desc.height, desc.depth, desc.numLayers, desc.numSamples, desc.numMipLevels); } return sanitized; } Color IDevice::backendDebugColor() const noexcept { switch (getBackendType()) { case BackendType::Invalid: return {0.f, 0.f, 0.f, 0.f}; // Clear case BackendType::OpenGL: return {1.f, 1.f, 0.f, 1.f}; // Yellow case BackendType::Metal: return {1.f, 0.f, 1.f, 1.f}; // Magenta case BackendType::Vulkan: return {0.f, 1.f, 1.f, 1.f}; // Cyan case BackendType::D3D12: return {0.f, 1.f, 1.f, 1.f}; // Match Vulkan for parity testing // @fb-only return {0.f, 1.f, 0.f, 1.f}; // Green @fb-only case BackendType::Custom: return {0.f, 0.f, 1.f, 1.f}; // Blue } IGL_UNREACHABLE_RETURN(Color(0.f, 0.f, 0.f, 0.f)) // Clear } DeviceScope::DeviceScope(IDevice& device) : device_(device) { device_.beginScope(); } DeviceScope::~DeviceScope() { device_.endScope(); } std::shared_ptr IDevice::createFramebufferFromBaseDesc( const base::FramebufferInteropDesc& desc) { auto makeTextureDesc = [](const base::AttachmentInteropDesc& attachment) -> TextureDesc { return TextureDesc{ .width = attachment.width, .height = attachment.height, .depth = attachment.depth, .numLayers = attachment.numLayers, .numSamples = attachment.numSamples, .usage = static_cast( attachment.isSampled ? (TextureDesc::TextureUsageBits::Attachment | TextureDesc::TextureUsageBits::Sampled) : TextureDesc::TextureUsageBits::Attachment), .numMipLevels = attachment.numMipLevels, .type = attachment.type, .format = attachment.format, .storage = ResourceStorage::Private, }; }; FramebufferDesc fbDesc; for (size_t i = 0; i < base::kMaxColorAttachments; ++i) { const auto* attachmentDesc = desc.colorAttachments[i]; if (attachmentDesc && attachmentDesc->format != TextureFormat::Invalid) { Result result; TextureDesc textureDesc = makeTextureDesc(*attachmentDesc); if (attachmentDesc->numLayers == 2) { fbDesc.mode = FramebufferMode::Stereo; } if (attachmentDesc->numSamples > 1) { TextureDesc resolveTextureDesc = textureDesc; textureDesc.usage = static_cast(TextureDesc::TextureUsageBits::Attachment); resolveTextureDesc.numSamples = 1; auto resolveTexture = createTexture(resolveTextureDesc, &result); if (resolveTexture && result.isOk()) { fbDesc.colorAttachments[i].resolveTexture = std::move(resolveTexture); } else { return nullptr; } } auto texture = createTexture(textureDesc, &result); if (texture && result.isOk()) { fbDesc.colorAttachments[i].texture = std::move(texture); } else { return nullptr; } } } if (desc.depthAttachment && desc.depthAttachment->format != TextureFormat::Invalid) { Result result; TextureDesc textureDesc = makeTextureDesc(*desc.depthAttachment); if (desc.depthAttachment->numLayers == 2) { fbDesc.mode = FramebufferMode::Stereo; } if (desc.depthAttachment->numSamples > 1) { TextureDesc resolveTextureDesc = textureDesc; textureDesc.usage = static_cast(TextureDesc::TextureUsageBits::Attachment); resolveTextureDesc.numSamples = 1; auto resolveTexture = createTexture(resolveTextureDesc, &result); if (resolveTexture && result.isOk()) { fbDesc.depthAttachment.resolveTexture = std::move(resolveTexture); } else { return nullptr; } } auto texture = createTexture(textureDesc, &result); if (texture && result.isOk()) { fbDesc.depthAttachment.texture = std::move(texture); } else { return nullptr; } } if (desc.depthAttachment == desc.stencilAttachment) { fbDesc.stencilAttachment = fbDesc.depthAttachment; } else if (desc.stencilAttachment && desc.stencilAttachment->format != TextureFormat::Invalid) { Result result; TextureDesc textureDesc = makeTextureDesc(*desc.stencilAttachment); if (desc.stencilAttachment->numLayers == 2) { fbDesc.mode = FramebufferMode::Stereo; } if (desc.stencilAttachment->numSamples > 1) { TextureDesc resolveTextureDesc = textureDesc; textureDesc.usage = static_cast(TextureDesc::TextureUsageBits::Attachment); resolveTextureDesc.numSamples = 1; auto resolveTexture = createTexture(resolveTextureDesc, &result); if (resolveTexture && result.isOk()) { fbDesc.stencilAttachment.resolveTexture = std::move(resolveTexture); } else { return nullptr; } } auto texture = createTexture(textureDesc, &result); if (texture && result.isOk()) { fbDesc.stencilAttachment.texture = std::move(texture); } else { return nullptr; } } Result result; return createFramebuffer(fbDesc, &result); } } // namespace igl ================================================ FILE: src/igl/Device.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include #include namespace igl { struct BindGroupBufferDesc; struct BindGroupTextureDesc; struct BufferDesc; struct ComputePipelineDesc; struct DepthStencilStateDesc; struct FramebufferDesc; struct RenderPipelineDesc; struct SamplerStateDesc; struct ShaderLibraryDesc; struct ShaderModuleDesc; struct ShaderStagesDesc; struct VertexInputStateDesc; class IBuffer; class ICommandBuffer; class IComputePipelineState; class IDepthStencilState; class IFramebuffer; class IRenderPipelineState; class ISamplerState; class IShaderLibrary; class IShaderModule; class IShaderStages; class ITimer; class ITimestampQueries; class IVertexInputState; /** * @brief InDevelopmentFeature is where you'd add in your own enum for testing out * an IGL feature you are working on. Once you declare it, you'd set it with * setDevelopmentFlags() from outside of IGL and then check for it with * testDevelopmentFlags() inside of IGL. * * For the IGL data types without access to IDevice, you'd need to do some * additional plumbing to pass the flag through. * * Note that none of this in-development code will be upstreamed. These flags * are only here so you have a way to revert to a safe path while testing in * production. */ // @fb-only // @fb-only // @fb-only enum class InDevelopementFeatures : uint8_t { // Define your in-development feature enums here DummyFeatureExample, }; /** * @brief Interface to a GPU that is used to draw graphics or do parallel computation. */ class IDevice : public ICapabilities, public base::IDeviceBase { public: ~IDevice() override = default; /* * Create a new BindGroup for textures. * * Vulkan: If `compatiblePipeline` is provided, the resulting BindGroup will be populated with * additional (dummy) textures and samplers in the binding slots where none were specified but are * expected by GLSL shaders. This ensures that the BindGroup is compatible with GLSL shaders from * the specified pipeline. If there's no pipeline specified, users must ensure all * textures/samplers expected by shaders are provided in the BindGroup description. */ virtual Holder createBindGroup( const BindGroupTextureDesc& desc, const IRenderPipelineState* IGL_NULLABLE compatiblePipeline = nullptr, Result* IGL_NULLABLE outResult = nullptr) = 0; virtual Holder createBindGroup( const BindGroupBufferDesc& desc, Result* IGL_NULLABLE outResult = nullptr) = 0; virtual void destroy(BindGroupTextureHandle handle) = 0; virtual void destroy(BindGroupBufferHandle handle) = 0; virtual void destroy(SamplerHandle handle) = 0; /** * @brief Creates a command queue. * @see igl::CommandQueueDesc * @param desc Description for the desired resource. * @param outResult Pointer to where the result (success, failure, etc) is written. Can be null if * no reporting is desired. * @return Shared pointer to the created queue. */ virtual std::shared_ptr createCommandQueue(const CommandQueueDesc& desc, Result* IGL_NULLABLE outResult) noexcept = 0; /** * @brief Creates a buffer resource. * @see igl::BufferDesc * @param desc Description for the desired resource. * @param outResult Pointer to where the result (success, failure, etc) is written. Can be null if * no reporting is desired. * @return Unique pointer to the created buffer. */ virtual std::unique_ptr createBuffer(const BufferDesc& desc, Result* IGL_NULLABLE outResult) const noexcept = 0; /** * @brief Creates a depth stencil state. * @see igl::DepthStencilStateDesc * @param desc Description for the desired resource. * @param outResult Pointer to where the result (success, failure, etc) is written. Can be null if * no reporting is desired. * @return Shared pointer to the created depth stencil state. */ virtual std::shared_ptr createDepthStencilState( const DepthStencilStateDesc& desc, Result* IGL_NULLABLE outResult) const = 0; /** * @brief Creates a sampler state. * @see igl::SamplerStateDesc * @param desc Description for the desired resource. * @param outResult Pointer to where the result (success, failure, etc) is written. Can be null if * no reporting is desired. * @return Shared pointer to the created sampler state. */ virtual std::shared_ptr createSamplerState(const SamplerStateDesc& desc, Result* IGL_NULLABLE outResult) const = 0; /** * @brief Creates a texture resource. * @see igl::TextureDesc * @param desc Description for the desired resource. * @param outResult Pointer to where the result (success, failure, etc) is written. Can be null if * no reporting is desired. * @return Shared pointer to the created texture. */ virtual std::shared_ptr createTexture(const TextureDesc& desc, Result* IGL_NULLABLE outResult) const noexcept = 0; /** * @brief Creates a texture view resource. * @see igl::TextureViewDesc * @param desc Description for the desired resource. * @param outResult Pointer to where the result (success, failure, etc) is written. Can be null if * no reporting is desired. * @return Shared pointer to the created texture. */ virtual std::shared_ptr createTextureView(std::shared_ptr texture, const TextureViewDesc& desc, Result* IGL_NULLABLE outResult) const noexcept = 0; /** * @brief Creates a timer for measuring the time taken by command buffers. * @param outResult Pointer to where the result (success, failure, etc) is written. Can be null if * no reporting is desired. * @return Shared pointer to the created timer. */ virtual std::shared_ptr createTimer(Result* IGL_NULLABLE outResult) const noexcept = 0; /** * @brief Create a timestamp queries object that can hold up to maxTimestamps entries. * Returns nullptr if not supported on this backend/device. */ virtual std::shared_ptr createTimestampQueries(uint32_t maxTimestamps, Result* IGL_NULLABLE outResult) const noexcept { Result::setResult( outResult, Result::Code::Unsupported, "TimestampQueries not supported on this backend"); (void)maxTimestamps; return nullptr; } /** * @brief Creates a vertex input state. * @see igl::VertexInputStateDesc * @param desc Description for the desired resource. * @param outResult Pointer to where the result (success, failure, etc) is written. Can be null if * no reporting is desired. * @return Shared pointer to the created vertex input state. */ virtual std::shared_ptr createVertexInputState( const VertexInputStateDesc& desc, Result* IGL_NULLABLE outResult) const = 0; /** * @brief Creates a compute pipeline state. * @see igl::ComputePipelineDesc * @param desc Description for the desired resource. * @param outResult Pointer to where the result (success, failure, etc) is written. Can be null if * no reporting is desired. * @return Shared pointer to the created compute pipeline state. */ virtual std::shared_ptr createComputePipeline( const ComputePipelineDesc& desc, Result* IGL_NULLABLE outResult) const = 0; /** * @brief Creates a render pipeline state. * @see igl::RenderPipelineDesc * @param desc Description for the desired resource. * @param outResult Pointer to where the result (success, failure, etc) is written. Can be null if * no reporting is desired. * @return Shared pointer to the created render pipeline state. */ virtual std::shared_ptr createRenderPipeline(const RenderPipelineDesc& desc, Result* IGL_NULLABLE outResult) const = 0; /** * @brief Creates a shader module from either source code or pre-compiled data. * @see igl::ShaderModuleDesc * @param desc Description for the desired resource. * @param outResult Pointer to where the result (success, failure, etc) is written. Can be null if * no reporting is desired. * @return Shared pointer to the created shader module. */ virtual std::shared_ptr createShaderModule(const ShaderModuleDesc& desc, Result* IGL_NULLABLE outResult) const = 0; /** * @brief Creates a frame buffer object. * @see igl::FramebufferDesc * @param desc Description for the desired resource. * @param outResult Pointer to where the result (success, failure, etc) is written. Can be null if * no reporting is desired. * @return Shared pointer to the created frame buffer. */ virtual std::shared_ptr createFramebuffer(const FramebufferDesc& desc, Result* IGL_NULLABLE outResult) = 0; /** * @brief Returns a platform-specific device. If the requested device type does not match that of * the actual underlying device, then null is returned. * @return Pointer to the underlying platform-specific device. */ template T* IGL_NULLABLE getPlatformDevice() noexcept { static_assert(std::is_base_of::value, "getPlatformDevice() requires T to be derived from IPlatformDevice"); return const_cast(static_cast(this)->getPlatformDevice()); } /** * @brief Returns a platform-specific device. If the requested device type does not match that of * the actual underlying device, then null is returned. * @return Pointer to the underlying platform-specific device. */ template const T* IGL_NULLABLE getPlatformDevice() const noexcept { static_assert(std::is_base_of::value, "getPlatformDevice() requires T to be derived from IPlatformDevice"); const IPlatformDevice& platformDevice = getPlatformDevice(); if (platformDevice.isType(T::kType)) { return static_cast(&platformDevice); } return nullptr; } /** * @brief Returns a platform-specific device. Returned value should not be held longer than the * original `IDevice`. * @return Pointer to the underlying platform-specific device. */ IPlatformDevice& getPlatformDevice() noexcept { return const_cast(static_cast(this)->getPlatformDevice()); } /** * @brief Returns a platform-specific device. Returned value should not be held longer than the * original `IDevice`. * @return Pointer to the underlying platform-specific device. */ [[nodiscard]] virtual const IPlatformDevice& getPlatformDevice() const noexcept = 0; /** * @brief Allow clients to verify that the scope that they are making IGL calls is current and * valid. * @return Whether or not the current scope is valid. */ virtual bool verifyScope() { return defaultVerifyScope(); } /** * @brief Get access to the staging buffer. * @return Pointer to the staging buffer interface, or nullptr if not available. */ [[nodiscard]] base::IStagingBufferInterop* IGL_NULLABLE getStagingBufferInterop() override { return nullptr; } /** * @brief Returns the backend type. * @return The backend type enum value. */ [[nodiscard]] BackendType getBackendType() const override = 0; /** * @brief Returns raw pointer to native device handle. * @return Platform-specific device handle. */ [[nodiscard]] void* IGL_NULLABLE getNativeDevice() const override = 0; /** * @brief Create a framebuffer from base descriptor. * @param desc The framebuffer descriptor. * @return Pointer to created framebuffer, or nullptr if not supported. */ [[nodiscard]] base::IFramebufferInterop* IGL_NULLABLE createFramebufferInterop(const base::FramebufferInteropDesc& desc) override { (void)desc; return nullptr; } /** * @brief Returns the range of Z values in normalized device coordinates considered to be within * the viewing volume ie. [-1, 1], [0, 1]. Can be used when a client needs a generic way to adapt * how different backends handle NDC. * @return The Z value range within the viewing volume. */ [[nodiscard]] virtual NormalizedZRange getNormalizedZRange() const { return NormalizedZRange::NegOneToOne; } /** * @brief Returns the number of draw calls made using this device. * @return The number of draw calls made so far. */ [[nodiscard]] virtual size_t getCurrentDrawCount() const = 0; /** * @brief Returns the number of shaders compiled using this device. * @return The number of shaders compiled so far. */ [[nodiscard]] virtual size_t getShaderCompilationCount() const = 0; /** * @brief Returns the number of bytes of GPU memory currently in use, or 0 if the device does not * support memory tracking. * @return Used GPU memory */ [[nodiscard]] virtual size_t getGPUMemoryUsage() const { return 0; } /** * @brief Creates a shader library with one or more shader modules. * @see igl::ShaderCompileDesc * @param desc The description for the shader library to be created. * @param outResult Pointer to where the result (success, failure, etc) is written. Can be null if * no reporting is desired. * @return Unique pointer to the created shader library. */ virtual std::unique_ptr createShaderLibrary(const ShaderLibraryDesc& desc, Result* IGL_NULLABLE outResult) const = 0; /** * @brief This is only used by EGL-based clients, e.g. Android, to set the default framebuffer to * render to. For all other clients, this is a no-op. */ virtual void updateSurface(void* IGL_NONNULL /*nativeWindowType*/) {} /** * @brief Creates a shader stages object. * @see igl::ShaderStagesDesc * @param desc The description for the desired resource. * @param outResult Pointer to where the result (success, failure, etc) is written. Can be null if * no reporting is desired. * @return Unique pointer to the created shader stages object. */ virtual std::unique_ptr createShaderStages(const ShaderStagesDesc& desc, Result* IGL_NULLABLE outResult) const = 0; /** * @brief Sets the resource tracker used by this device. * @see igl::IResourceTracker * @param tracker Shared pointer to the tracker. */ void setResourceTracker(std::shared_ptr tracker) noexcept { resourceTracker_ = std::move(tracker); } /** * @brief Returns the resource tracker used by this device. * @see igl::IResourceTracker * @return Shared pointer to the tracker. */ [[nodiscard]] std::shared_ptr getResourceTracker() const noexcept { return resourceTracker_; } /** * @brief Returns if a resource tracker is used by this device. */ [[nodiscard]] bool hasResourceTracker() const noexcept { return resourceTracker_ != nullptr; } /** * @brief Returns a backend-specific color for debugging purposes * - OpenGL: Yellow * - Metal: Magenta * - Vulkan: Cyan // @fb-only * - Custom: Blue */ [[nodiscard]] Color backendDebugColor() const noexcept; /** * @brief Controls an opaque internal bit field that enables/disables certain * in-development paths at run time. * * It is strongly recommended to set the fields during device creation or very near it. * * Some examples of the usage: * * Preserving the original path while making a particularly dangerous change * * Enabling a new IGL feature to a subset of users as an experiment. */ bool testDevelopmentFlags(InDevelopementFeatures featureEnum) { const uint8_t pos = static_cast(featureEnum); IGL_DEBUG_ASSERT(pos < 64); return (inDevelopmentFlags_ & (1ull << pos)) != 0u; } /** * @brief Set/Unset an In-Development Flag * The pos/value is only meaningful to the client of IGL and whatever * in-development IGL feature you have in your IGL code base. No * in-development paths will be upstreamed or accepted into public IGL */ void setDevelopmentFlags(InDevelopementFeatures featureEnum, bool val) { const uint8_t pos = static_cast(featureEnum); IGL_DEBUG_ASSERT(pos < 64); if (val) { inDevelopmentFlags_ |= 1ull << pos; } else { inDevelopmentFlags_ &= ~(1ull << pos); } } /** * IGL can only be accessed by 1 thread at a time. Call this function to mark the current thread * as the "owning" thread. */ virtual void setCurrentThread() { } // NOTE: for now, this is implemented only in IGL/Vulkan and IGL/OpenGL protected: virtual void beginScope() { ++scopeDepth_; } virtual void endScope() { --scopeDepth_; } [[nodiscard]] TextureDesc sanitize(const TextureDesc& desc) const; IDevice() = default; /// @brief Helper to create framebuffer from base descriptor /// @param desc The base framebuffer descriptor /// @return Shared pointer to the created framebuffer, or nullptr on failure [[nodiscard]] std::shared_ptr createFramebufferFromBaseDesc( const base::FramebufferInteropDesc& desc); uint64_t inDevelopmentFlags_ = 0; private: bool defaultVerifyScope(); int scopeDepth_ = 0; std::shared_ptr resourceTracker_; friend struct DeviceScope; }; /** * @brief Delineates a scope for making API calls into IGL. Useful for marking diagnostics * boundaries. * @details To use this, instantiate a DeviceScope at the beginning of a code block that contains * a sequence of IGL calls. Typically, you do this at a top-level call such as initialization or a * per-frame render function. For clarity, it's best to place this sequence of calls inside braces. * For methods that call IGL, it's best to add an assert verifying the scope to ensure that the call * is occurring inside a valid DeviceScope. */ struct DeviceScope final { /** * @brief Creates a device scope associated with a given device. * @param device The device to be associated with the created scope. */ explicit DeviceScope(IDevice& device); ~DeviceScope(); private: IDevice& device_; // Prevent heap allocation static void* IGL_NONNULL operator new(std::size_t); static void* IGL_NONNULL operator new[](std::size_t); }; } // namespace igl ================================================ FILE: src/igl/DeviceFeatures.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include // IWYU pragma: export #include #include namespace igl { // clang-format off /** * @brief DeviceFeatures denotes the different kinds of specific features that are supported in the * device. Note that this can differ across devices based on vendor support. * * BindBytes Supports binding bytes (temporary buffers), e.g., setVertexBytes on Metal * BindUniform Supports binding individual uniform values * BufferDeviceAddress Supports buffer device address (bindless buffers) * BufferNoCopy Supports creating buffers that use previously allocated memory * BufferRing Supports creating ring buffers with memory for each swapchain image * Compute Supports compute * CopyBuffer Supports ICommandBuffer::copyBuffer() * DepthCompare Supports setting depth compare function * DepthShaderRead Supports reading depth texture from a shader * DrawFirstIndexFirstVertex Supports firstIndex/firstVertex parameters in IRenderCommandEncoder::drawIndexed() * DrawIndexedIndirect Supports IRenderCommandEncoder::drawIndexedIndirect * DrawInstanced Supports IRenderCommandEncoder::draw:instanceCount * ExplicitBinding, Supports uniforms block explicit binding in shaders * ExplicitBindingExt, Supports uniforms block explicit binding in shaders via an extension * ExternalMemoryObjects, Supports accessing external memory objects, including by POSIX file descriptor * MapBufferRange Supports mapping buffer data into client address space * MeshShaders Supports task/mesh shaders * MinMaxBlend Supports Min and Max blend operations * MultipleRenderTargets Supports MRT - Multiple Render Targets * MultiSample Supports multisample textures * MultiSampleResolve Supports GPU multisampled texture resolve * Multiview Supports multiview * MultiViewMultisample Supports multisampled multiview * PushConstants Supports push constants(Vulkan) * ReadWriteFramebuffer Supports separate FB reading/writing binding * SamplerMinMaxLod Supports constraining the min and max texture LOD when sampling * ShaderLibrary Supports shader libraries * ShaderTextureLod Supports explicit control of Lod in the shader * ShaderTextureLodExt Supports explicit control of Lod in the shader via an extension * SRGB Supports sRGB Textures and FrameBuffer * SRGBSwapchain Supports sRGB Swapchain * StandardDerivative Supports Standard Derivative function in shader * StandardDerivativeExt Supports Standard Derivative function in shader via an extension * StorageBuffers Supports SSBO * Texture2DArray Supports 2D array textures * Texture3D Supports 3D textures * TextureArrayExt Supports array textures via an extension * TextureBindless Supports bindless textures * TextureExternalImage Supports reading external images in the shader * TextureFilterAnisotropic Supports Anisotropic texture filtering * TextureFloat Supports full float texture format * TextureFormatRG Supports RG Texture * TextureFormatRGB Supports packed RGB texture formats * TextureHalfFloat Supports half float texture format * TextureNotPot Supports non power-of-two textures * TexturePartialMipChain Supports mip chains that do not go all the way to 1x1 * TextureViews Supports IDevice::createTextureView() * TimestampQueries Supports per-filter GPU timestamp queries * Timers Supports GPU timers * UniformBlocks, Supports uniform blocks * Indices8Bit, Supports uint8 vertex indices * ValidationLayersEnabled, Validation layers are enabled */ enum class DeviceFeatures { BindBytes = 0, BindUniform, BufferDeviceAddress, BufferNoCopy, BufferRing, Compute, CopyBuffer, DepthCompare, DepthShaderRead, DrawFirstIndexFirstVertex, DrawIndexedIndirect, DrawInstanced, ExplicitBinding, ExplicitBindingExt, ExternalMemoryObjects, Indices8Bit, MapBufferRange, MeshShaders, MinMaxBlend, MultipleRenderTargets, MultiSample, MultiSampleResolve, Multiview, MultiViewMultisample, PushConstants, ReadWriteFramebuffer, SamplerMinMaxLod, ShaderLibrary, ShaderTextureLod, ShaderTextureLodExt, SRGB, SRGBSwapchain, SRGBWriteControl, StandardDerivative, StandardDerivativeExt, StorageBuffers, Texture2DArray, TextureArrayExt, Texture3D, TextureBindless, TextureExternalImage, TextureFilterAnisotropic, TextureFloat, TextureFormatRG, TextureFormatRGB, TextureHalfFloat, TextureNotPot, TexturePartialMipChain, TextureViews, TimestampQueries, Timers, UniformBlocks, ValidationLayersEnabled, }; // clang-format on /** * @brief DeviceRequirement denotes capturing specific requirements for a feature to be enabled. * These should be used in combination with DeviceFeatures to understand how to take advantage of * the feature. * For example, using the StandardDerivative feature with an OpenGL ES 2.0 device requires using an * extension whereas it can be used without an extension for an OpenGL or OpenGL ES 3+ device. * If a device returns true for hasFeature(DeviceFeatures::ShaderTextureLod) and returns true for * hasRequirement(DeviceRequirement::ShaderTextureLodExtReq), then shader code wishing to use the * feature must do so via an extension. * * ExplicitBindingExtReq Using explicit binding in a shader requires using an extension * ShaderTextureLodExtReq Using Texture LOD in a shader requires using an extension * StandardDerivativeExtReq Standard derivatives in a shader requires using an extension * TextureArrayExtReq Texture array support requires an extension * TextureFormatRGExtReq RG texture format support requires an extension */ enum class DeviceRequirement { ExplicitBindingExtReq, ShaderTextureLodExtReq, StandardDerivativeExtReq, TextureArrayExtReq, TextureFormatRGExtReq, }; /** * @brief DeviceFeatureLimits provides specific limitations on certain features supported on the * device * * BufferAlignment Required byte alignment for buffer data * BufferNoCopyAlignment Required byte alignment for no copy buffer data * MaxBindBytesBytes Maximum number of bytes that can be bound with bindBytes * MaxCubeMapDimension Maximum cube map dimensions * MaxFragmentUniformVectors Maximum fragment uniform vectors * MaxMultisampleCount Maximum number of samples * MaxPushConstantBytes Maximum number of bytes for Push Constants * MaxTextureDimension1D2D Maximum texture dimensions for 1D and 2D textures * MaxTextureDimension3D Maximum texture dimensions for 3D textures * MaxStorageBufferBytes Maximum number of bytes for storage buffers * MaxUniformBufferBytes Maximum number of bytes for a uniform buffer * MaxVertexUniformVectors Maximum vertex uniform vectors * PushConstantsAlignment Required byte alignment for push constants data * ShaderStorageBufferOffsetAlignment Required byte alignment for shader storage buffer offset * MaxComputeWorkGroupSizeX Maximum compute work group size in X dimension * MaxComputeWorkGroupSizeY Maximum compute work group size in Y dimension * MaxComputeWorkGroupSizeZ Maximum compute work group size in Z dimension * MaxComputeWorkGroupInvocations Maximum total compute work group invocations * MaxVertexInputAttributes Maximum number of vertex input attributes * MaxColorAttachments Maximum number of color attachments (render targets) * MaxDescriptorHeapCbvSrvUav Maximum CBV/SRV/UAV descriptors in shader-visible heap * (I-005) MaxDescriptorHeapSamplers Maximum sampler descriptors in shader-visible heap * (I-005) MaxDescriptorHeapRtvs Maximum RTV descriptors in CPU-visible heap (I-005) * MaxDescriptorHeapDsvs Maximum DSV descriptors in CPU-visible heap (I-005) */ enum class DeviceFeatureLimits { BufferAlignment = 0, BufferNoCopyAlignment, MaxBindBytesBytes, MaxCubeMapDimension, MaxFragmentUniformVectors, MaxMultisampleCount, MaxPushConstantBytes, MaxTextureDimension1D2D, MaxTextureDimension3D, MaxStorageBufferBytes, MaxUniformBufferBytes, MaxVertexUniformVectors, PushConstantsAlignment, ShaderStorageBufferOffsetAlignment, MaxComputeWorkGroupSizeX, MaxComputeWorkGroupSizeY, MaxComputeWorkGroupSizeZ, MaxComputeWorkGroupInvocations, MaxVertexInputAttributes, MaxColorAttachments, // I-005: Descriptor heap size limits for cross-platform compatibility MaxDescriptorHeapCbvSrvUav, MaxDescriptorHeapSamplers, MaxDescriptorHeapRtvs, MaxDescriptorHeapDsvs, }; /** * @brief ShaderFamily provides specific shader family usage * * Unknown Unspecified shader family usage * Glsl Regular GL shader language * GlslEs GL Embedded Systems shader language * Metal Metal API (macOS, iOS, etc.) * SpirV Standard Portable Intermediate Representation open standard format */ enum class ShaderFamily : uint8_t { Unknown, Glsl, GlslEs, Metal, SpirV, Hlsl }; /** * @brief ShaderVersion provides information on the shader family type and version */ struct ShaderVersion { ShaderFamily family = ShaderFamily::Unknown; uint8_t majorVersion = 0; uint8_t minorVersion = 0; uint8_t extra = 0; bool operator==(const ShaderVersion& other) const { return family == other.family && majorVersion == other.majorVersion && minorVersion == other.minorVersion && extra == other.extra; } bool operator!=(const ShaderVersion& other) const { return !(*this == other); } }; /** * @brief BackendVersion provides information on the backend flavor and version */ struct BackendVersion { BackendFlavor flavor = BackendFlavor::Invalid; uint8_t majorVersion = 0; uint8_t minorVersion = 0; bool operator==(const BackendVersion& other) const { return flavor == other.flavor && majorVersion == other.majorVersion && minorVersion == other.minorVersion; } bool operator!=(const BackendVersion& other) const { return !(*this == other); } }; /** * @brief ICapabilities defines the capabilities interface. Currently, it is IDevice * which implements this interface. */ class ICapabilities { public: /** * @brief TextureFormatCapabilityBits provides specific texture format usage * * Unsupported The format is not supported * Sampled Can be used as read-only texture in vertex/fragment shaders * SampledFiltered The texture can be filtered during sampling * Filter The texture can be filtered during sampling * Storage Can be used as read/write storage texture in vertex/fragment/compute shaders * Attachment The texture can be used as a render target * SampledAttachment The texture can be both sampled in shaders AND used as a render target * All All capabilities are supported * * @remark SampledAttachment is NOT the same as Sampled | Attachment. */ enum TextureFormatCapabilityBits : uint8_t { Unsupported = 0, Sampled = 1 << 0, SampledFiltered = 1 << 1, Storage = 1 << 2, Attachment = 1 << 3, SampledAttachment = 1 << 4, All = Sampled | SampledFiltered | Storage | Attachment | SampledAttachment }; using TextureFormatCapabilities = uint8_t; /** * @brief This function indicates if a device feature is supported at all. * * @param feature The device feature specified * @return True, If feature is supported * False, Otherwise */ [[nodiscard]] virtual bool hasFeature(DeviceFeatures feature) const = 0; /** * @brief This function indicates if a device requirement is at all present. * * @param requirement The device requirement specified * @return True, If requirement is present * False, Otherwise */ [[nodiscard]] virtual bool hasRequirement(DeviceRequirement requirement) const = 0; /** * @brief This function gets capabilities of a specified texture format * * @param format The texture format * @return TextureFormatCapabilities */ [[nodiscard]] virtual TextureFormatCapabilities getTextureFormatCapabilities( TextureFormat format) const = 0; /** * @brief This function gets device feature limits and return additional error code in 'result'. * * @param featureLimits The device feature limits * @param result The error code returned. * -1 means an error occurred, greater than 0 means valid results are acquired * * @return True, If there are feature limits are present * False, Otherwise */ virtual bool getFeatureLimits(DeviceFeatureLimits featureLimits, size_t& result) const = 0; /** * @brief Gets the latest shader language version supported by this device. * @return ShaderVersion */ [[nodiscard]] virtual ShaderVersion getShaderVersion() const = 0; /** * @brief Gets the latest backend version supported by this device. * @return BackendVersion */ [[nodiscard]] virtual BackendVersion getBackendVersion() const = 0; protected: virtual ~ICapabilities() = default; }; inline bool contains(ICapabilities::TextureFormatCapabilities value, ICapabilities::TextureFormatCapabilityBits flag) { return (value & flag) == flag; } } // namespace igl ================================================ FILE: src/igl/FPSCounter.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include // IWYU pragma: keep namespace igl { /// @brief Based on /// https://github.com/PacktPublishing/3D-Graphics-Rendering-Cookbook/blob/master/shared/UtilsFPS.h. /// Convenience class to measure and print frames per second (FPS) to the console. class FPSCounter { public: /// @brief Constructs an instance of the class /// @param printToConsole whether to print the FPS count to the console /// @param avgIntervalInSeconds how often to update the FPS counter and print the information to /// the console. The default is 1 second explicit FPSCounter(bool printToConsole = true, float avgIntervalInSeconds = 1.0f) : printToConsole_(printToConsole), avgIntervalInSeconds_(avgIntervalInSeconds) { IGL_DEBUG_ASSERT(avgIntervalInSeconds > 0); } [[nodiscard]] float getAverageFPS() const noexcept { return avgFPS_; } /// @brief Updates the frame count and computes the FPS if the time passed in as a parameter is /// greater than the threshold set at construciton time. This function should be called when a /// frame has finished being submited for processing by the GPU along with the delta time between /// the current and the previous frame /// @param seconds the time, in seconds, to record and submit this frame's commands. The delta /// time between this frame and the previous frame. void updateFPS(double seconds) { frames_++; time_ += seconds; if (time_ >= avgIntervalInSeconds_) { avgFPS_ = float(frames_ / time_); if (printToConsole_) { IGL_LOG_INFO("FPS: %.1f\n", avgFPS_); } frames_ = 0; time_ = 0; } } private: bool printToConsole_ = true; uint32_t frames_ = 0; double time_ = 0; const float avgIntervalInSeconds_ = 1.0f; float avgFPS_ = 72.0f; // randomly picked high-ish initial value }; } // namespace igl ================================================ FILE: src/igl/Format.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once // On iOS for Xcode 16.3, std::to_chars is not available. To avoid an error, we should not include // std::format, and switch to using fmt/format instead. This define is used in conjunction with // others below, as this is not the only reason not to include std::format. // // Note: the _LIBCPP_AVAILABILITY_HAS_TO_CHARS_FLOATING_POINT is defined in libc++'s <__config> // header, which is includes by all other headers. We include and above #define IGL_INCLUDE_FORMAT (!IGL_PLATFORM_APPLE || _LIBCPP_AVAILABILITY_HAS_TO_CHARS_FLOATING_POINT) // libc++'s implementation of std::format has a large binary size impact // (https://github.com/llvm/llvm-project/issues/64180), so avoid it on Android. #if defined(__cpp_lib_format) && (!defined(__ANDROID__) && IGL_INCLUDE_FORMAT) #include #define IGL_FORMAT std::format #else #include #define IGL_FORMAT fmt::format #endif // __cpp_lib_format ================================================ FILE: src/igl/Framebuffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl { enum class FramebufferMode { Mono, // Default mode Stereo, // Single pass stereo rendering. In this mode, IGL assumes there are two layers for each // attachment. The first layer represents left view and the second layer // represents the right view. Multiview, // Reserved for future use }; /** * @brief Represents textures associated with the frame buffer including color, depth, and stencil * surfaces. */ struct FramebufferDesc { struct AttachmentDesc { std::shared_ptr texture; std::shared_ptr resolveTexture; }; /** @brief All color attachments */ AttachmentDesc colorAttachments[IGL_COLOR_ATTACHMENTS_MAX] = {}; /** @brief The depth attachment */ AttachmentDesc depthAttachment; /** @brief The stencil attachment */ AttachmentDesc stencilAttachment; std::string debugName; FramebufferMode mode = FramebufferMode::Mono; }; /** * @brief Interface common to all frame buffers across all implementations */ class IFramebuffer : public ITrackedResource { public: ~IFramebuffer() override = default; // Accessors /** @brief Retrieve array of all valid color and resolve color attachment indices */ [[nodiscard]] virtual std::vector getColorAttachmentIndices() const = 0; /** @brief Retrieve a specific color attachment by index */ [[nodiscard]] virtual std::shared_ptr getColorAttachment(size_t index) const = 0; /** @brief Retrieve a specific resolve color attachment by index */ [[nodiscard]] virtual std::shared_ptr getResolveColorAttachment(size_t index) const = 0; /** @brief Retrieve depth attachment */ [[nodiscard]] virtual std::shared_ptr getDepthAttachment() const = 0; /** @brief Retrieve resolve depth attachment */ [[nodiscard]] virtual std::shared_ptr getResolveDepthAttachment() const = 0; /** @brief Retrieve the stencil attachment */ [[nodiscard]] virtual std::shared_ptr getStencilAttachment() const = 0; /** @brief Retrieve the mode that this framebuffer was created in. */ [[nodiscard]] virtual FramebufferMode getMode() const = 0; /** @brief Retrieve the flag checking if framebuffer is bound to swapchain. */ [[nodiscard]] virtual bool isSwapchainBound() const = 0; // Methods /** @brief Copy color data from the color attachment at the specified index into 'pixelBytes'. * Some implementations may only support index 0. If bytesPerRow is 0, it will be * autocalculated assuming now padding. */ virtual void copyBytesColorAttachment(ICommandQueue& cmdQueue, size_t index, void* pixelBytes, const TextureRangeDesc& range, size_t bytesPerRow = 0) const = 0; /** @brief Copy depth data from the depth attachment into 'pixelBytes'. If bytesPerRow is 0, it * will be autocalculated assuming now padding. */ virtual void copyBytesDepthAttachment(ICommandQueue& cmdQueue, void* pixelBytes, const TextureRangeDesc& range, size_t bytesPerRow = 0) const = 0; /** @brief Copy stencil data from stencil attachment into 'pixelBytes'. If bytesPerRow is 0, it * will be autocalculated assuming now padding. */ virtual void copyBytesStencilAttachment(ICommandQueue& cmdQueue, void* pixelBytes, const TextureRangeDesc& range, size_t bytesPerRow = 0) const = 0; /** @brief Copy color data from the color attachment at the specified index into 'destTexture'. * Some implementations may only support index 0. */ virtual void copyTextureColorAttachment(ICommandQueue& cmdQueue, size_t index, std::shared_ptr destTexture, const TextureRangeDesc& range) const = 0; /** @brief Replaces color attachment at index 0 with the 'texture' specified. A null texture is * valid and unbinds the current color attachment at index 0. */ virtual void updateDrawable(std::shared_ptr texture) = 0; /** @brief Replaces color attachment at index 0 and the depth texture with the textures specified. * A null texture is valid and unbinds the attachment. */ virtual void updateDrawable(SurfaceTextures surfaceTextures) = 0; /** @brief Replaces color attachment at index 0 and the depth texture with the textures specified. * A null texture is valid and unbinds the attachment. */ virtual void updateResolveAttachment(std::shared_ptr texture) = 0; }; } // namespace igl ================================================ FILE: src/igl/FramebufferWrapper.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include namespace igl { FramebufferWrapper::FramebufferWrapper(std::shared_ptr framebuffer) : framebuffer_(std::move(framebuffer)) {} base::IAttachmentInterop* IGL_NULLABLE FramebufferWrapper::getColorAttachment(size_t index) const { if (!framebuffer_) { return nullptr; } return framebuffer_->getColorAttachment(index).get(); } base::IAttachmentInterop* IGL_NULLABLE FramebufferWrapper::getDepthAttachment() const { if (!framebuffer_) { return nullptr; } return framebuffer_->getDepthAttachment().get(); } void* IGL_NULLABLE FramebufferWrapper::getNativeFramebuffer() const { // This method can be overridden by the platform-specific implementation return nullptr; } } // namespace igl ================================================ FILE: src/igl/FramebufferWrapper.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl { /// @brief Wrapper that adapts IFramebuffer to base::IFramebufferInterop interface /// @note This wrapper holds a shared_ptr to the underlying IFramebuffer class FramebufferWrapper : public base::IFramebufferInterop { public: explicit FramebufferWrapper(std::shared_ptr framebuffer); ~FramebufferWrapper() override = default; // Non-copyable but movable FramebufferWrapper(const FramebufferWrapper&) = delete; FramebufferWrapper& operator=(const FramebufferWrapper&) = delete; FramebufferWrapper(FramebufferWrapper&&) noexcept = default; FramebufferWrapper& operator=(FramebufferWrapper&&) noexcept = default; /// @brief Get the underlying IFramebuffer [[nodiscard]] const std::shared_ptr& getFramebuffer() const { return framebuffer_; } // base::IFramebufferInterop interface [[nodiscard]] base::IAttachmentInterop* IGL_NULLABLE getColorAttachment(size_t index) const override; [[nodiscard]] base::IAttachmentInterop* IGL_NULLABLE getDepthAttachment() const override; [[nodiscard]] void* IGL_NULLABLE getNativeFramebuffer() const override; private: std::shared_ptr framebuffer_; }; } // namespace igl ================================================ FILE: src/igl/HWDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl { class IDevice; /** * @brief Represents a type of a physical device for graphics/compute purposes */ enum class HWDeviceType { /// Unknown Unknown = 0, /// HW GPU - Discrete DiscreteGpu = 1, /// HW GPU - External ExternalGpu = 2, /// HW GPU - Integrated IntegratedGpu = 3, /// SW GPU SoftwareGpu = 4, }; /** * @brief Represents a query of a physical device to be requested from the underlying IGL * implementation */ struct HWDeviceQueryDesc { /** @brief Desired hardware type */ HWDeviceType hardwareType; /** @brief If set, ignores hardwareType and returns device assigned to displayId */ uintptr_t displayId; /** @brief Reserved */ uint32_t flags; explicit HWDeviceQueryDesc(HWDeviceType hardwareType, uintptr_t displayId = 0L, uint32_t flags = 0L) : hardwareType(hardwareType), displayId(displayId), flags(flags) {} }; /** * @brief Represents a description of a specific physical device installed in the system */ struct HWDeviceDesc { /** @brief Implementation-specific identifier of a device */ uintptr_t guid; /** @brief A type of an actual physical device */ HWDeviceType type; /** @brief Implementation-specific name of a device */ std::string name; /** @brief Implementation-specific vendor name */ std::string vendor; /** @brief Unique identifier of a vendor */ uint32_t vendorId; HWDeviceDesc(uintptr_t guid, HWDeviceType type, uint32_t vendorId = 0, std::string name = "", std::string vendor = "") : guid(guid), type(type), name(std::move(name)), vendor(std::move(vendor)), vendorId(vendorId) {} }; } // namespace igl ================================================ FILE: src/igl/IGL.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export ================================================ FILE: src/igl/IGLFolly.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #if !defined(IGL_CMAKE_BUILD) #include #include #include #else #include // folly/Portability.h #if __has_include() #include // @manual #endif #if __has_include() #include // @manual #endif #if __has_include(<__config>) #include <__config> // @manual #endif #ifdef __ANDROID__ #include // @manual #endif #ifdef __APPLE__ #include // @manual #include // @manual #include // @manual #endif #ifndef __has_extension #define FOLLY_HAS_EXTENSION(x) 0 #else #define FOLLY_HAS_EXTENSION(x) __has_extension(x) #endif #if defined(__has_feature) #define FOLLY_HAS_FEATURE(...) __has_feature(__VA_ARGS__) #else #define FOLLY_HAS_FEATURE(...) 0 #endif #if FOLLY_HAS_EXTENSION(nullability) #define FOLLY_NULLABLE \ FOLLY_PUSH_WARNING \ FOLLY_CLANG_DISABLE_WARNING("-Wnullability-extension") \ _Nullable FOLLY_POP_WARNING #define FOLLY_NONNULL \ FOLLY_PUSH_WARNING \ FOLLY_CLANG_DISABLE_WARNING("-Wnullability-extension") \ _Nonnull FOLLY_POP_WARNING #else #define FOLLY_NULLABLE #define FOLLY_NONNULL #endif // Generalize warning push/pop. #if defined(__GNUC__) || defined(__clang__) // Clang & GCC #define FOLLY_PUSH_WARNING _Pragma("GCC diagnostic push") #define FOLLY_POP_WARNING _Pragma("GCC diagnostic pop") #define FOLLY_GNU_DISABLE_WARNING_INTERNAL2(warningName) #warningName #define FOLLY_GNU_DISABLE_WARNING(warningName) \ _Pragma(FOLLY_GNU_DISABLE_WARNING_INTERNAL2(GCC diagnostic ignored warningName)) #ifdef __clang__ #define FOLLY_CLANG_DISABLE_WARNING(warningName) FOLLY_GNU_DISABLE_WARNING(warningName) #define FOLLY_GCC_DISABLE_WARNING(warningName) #else #define FOLLY_CLANG_DISABLE_WARNING(warningName) #define FOLLY_GCC_DISABLE_WARNING(warningName) FOLLY_GNU_DISABLE_WARNING(warningName) #endif #define FOLLY_MSVC_DISABLE_WARNING(warningNumber) #elif defined(_MSC_VER) #define FOLLY_PUSH_WARNING __pragma(warning(push)) #define FOLLY_POP_WARNING __pragma(warning(pop)) // Disable the GCC warnings. #define FOLLY_GNU_DISABLE_WARNING(warningName) #define FOLLY_GCC_DISABLE_WARNING(warningName) #define FOLLY_CLANG_DISABLE_WARNING(warningName) #define FOLLY_MSVC_DISABLE_WARNING(warningNumber) __pragma(warning(disable : warningNumber)) #else #define FOLLY_PUSH_WARNING #define FOLLY_POP_WARNING #define FOLLY_GNU_DISABLE_WARNING(warningName) #define FOLLY_GCC_DISABLE_WARNING(warningName) #define FOLLY_CLANG_DISABLE_WARNING(warningName) #define FOLLY_MSVC_DISABLE_WARNING(warningNumber) #endif /** * FB_ANONYMOUS_VARIABLE(str) introduces an identifier starting with * str and ending with a number that varies with the line. */ #ifndef FB_ANONYMOUS_VARIABLE #define FB_CONCATENATE_IMPL(s1, s2) s1##s2 #define FB_CONCATENATE(s1, s2) FB_CONCATENATE_IMPL(s1, s2) #ifdef __COUNTER__ // Modular builds build each module with its own preprocessor state, meaning // `__COUNTER__` no longer provides a unique number across a TU. Instead of // calling back to just `__LINE__`, use a mix of `__COUNTER__` and `__LINE__` // to try provide as much uniqueness as possible. #if FOLLY_HAS_FEATURE(modules) #define FB_ANONYMOUS_VARIABLE(str) \ FB_CONCATENATE(FB_CONCATENATE(FB_CONCATENATE(str, __COUNTER__), _), __LINE__) #else #define FB_ANONYMOUS_VARIABLE(str) FB_CONCATENATE(str, __COUNTER__) #endif #else #define FB_ANONYMOUS_VARIABLE(str) FB_CONCATENATE(str, __LINE__) #endif #endif #endif // IGL_CMAKE_BUILD #define IGL_NULLABLE FOLLY_NULLABLE #define IGL_NONNULL FOLLY_NONNULL ================================================ FILE: src/igl/IGLSafeC.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #if !defined(IGL_CMAKE_BUILD) #include // IWYU pragma: export #else #include #include #include #define ERR_POTENTIAL_BUFFER_OVERFLOW 34 // matches with ERANGE in errno.h inline int try_checked_memcpy(void* destination, size_t destination_size, const void* source, size_t count) { if (destination_size < count) { return ERR_POTENTIAL_BUFFER_OVERFLOW; } memcpy(destination, source, count); return 0; } inline void* checked_memcpy(void* destination, size_t destination_size, const void* source, size_t count) { if (IGL_SOFT_VERIFY_NOT(destination_size < count, "potential buffer overflow")) { exit(EXIT_FAILURE); } return memcpy(destination, source, count); } inline void* checked_memcpy_robust(void* destination, size_t destination_size, const void* source, size_t source_size, size_t count) { if (IGL_SOFT_VERIFY_NOT(destination_size < count || source_size < count, "potential buffer overflow")) { exit(EXIT_FAILURE); } return memcpy(destination, source, count); } inline void* checked_memcpy_offset(void* destination, size_t destination_size, size_t offset, const void* source, size_t count) { // Naively, we could just check count > destination_size - offset. However, // if offset is very large, e.g. size_t(-1), then destination_size - offset // will overflow `size_t` and hence act additive to destination_size. // // To avoid this, we properly compute the available_size and then check that. const size_t available_size = offset > destination_size ? 0 : destination_size - offset; if (IGL_SOFT_VERIFY_NOT(count > available_size, "potential buffer overflow")) { exit(EXIT_FAILURE); } memcpy((char*)destination + offset, source, count); return destination; } inline int checked_strncmp(const char* str1, size_t str1_size, const char* str2, size_t str2_size, size_t count) { if (IGL_SOFT_VERIFY_NOT(str1_size < count || str2_size < count, "potential buffer overflow")) { exit(EXIT_FAILURE); } return strncmp(str1, str2, count); } #endif // IGL_CMAKE_BUILD ================================================ FILE: src/igl/IResourceTracker.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl { class ITexture; class IBuffer; class IFramebuffer; class ISamplerState; class IShaderLibrary; class IShaderModule; class IShaderStages; template class ITrackedResource; /** * @brief The IResourceTracker interface allows clients to implement their own Resource Trackers. * Clients can track Textures, Buffers, Framebuffers or other TrackedResources */ class IResourceTracker { public: virtual ~IResourceTracker() = default; IResourceTracker() noexcept = default; /** * @brief Informs the tracker that the texture has been created * * @param texture Texture to be tracked */ virtual void didCreate(const ITexture* texture) noexcept = 0; /** * @brief Informs the tracker that the texture will be deleted * * @param texture Texture which will be deleted */ virtual void willDelete(const ITexture* texture) noexcept = 0; /** * @brief Informs the tracker that the buffer has been created * * @param buffer Buffer to be tracked */ virtual void didCreate(const IBuffer* buffer) noexcept = 0; /** * @brief Informs the tracker that the buffer will be deleted * * @param buffer Buffer which will be deleted */ virtual void willDelete(const IBuffer* buffer) noexcept = 0; /** * @brief Informs the tracker that the framebuffer has been created * * @param framebuffer Framebuffer to be tracked */ virtual void didCreate(const IFramebuffer* framebuffer) noexcept = 0; /** * @brief Informs the tracker that the framebuffer will be deleted * * @param framebuffer Framebuffer which will be deleted */ virtual void willDelete(const IFramebuffer* framebuffer) noexcept = 0; /** * @brief Informs the tracker that the sampler state has been created * * @param samplerState Sampler state to be tracked */ virtual void didCreate(const ISamplerState* samplerState) noexcept = 0; /** * @brief Informs the tracker that the sampler will be deleted * * @param samplerState Sampler state which will be deleted */ virtual void willDelete(const ISamplerState* samplerState) noexcept = 0; /** * @brief Informs the tracker that the shader library has been created * * @param shaderLibrary Shader library to be tracked */ virtual void didCreate(const IShaderLibrary* shaderLibrary) noexcept = 0; /** * @brief Informs the tracker that the shader library be deleted * * @param shaderLibrary Shader library which will be deleted */ virtual void willDelete(const IShaderLibrary* shaderLibrary) noexcept = 0; /** * @brief Informs the tracker that the shader module has been created * * @param shaderModule Shader module to be tracked */ virtual void didCreate(const IShaderModule* shaderModule) noexcept = 0; /** * @brief Informs the tracker that the shader module will be deleted * * @param shaderModule Shader module which will be deleted */ virtual void willDelete(const IShaderModule* shaderModule) noexcept = 0; /** * @brief Informs the tracker that the shader stages has been created * * @param shaderStages Shader stages to be tracked */ virtual void didCreate(const IShaderStages* shaderStages) noexcept = 0; /** * @brief Informs the tracker that the shader stages will be deleted * * @param shaderStages Shader stages which will be deleted */ virtual void willDelete(const IShaderStages* shaderStages) noexcept = 0; template void didCreate(IGL_MAYBE_UNUSED const ITrackedResource* resource) noexcept { IGL_DEBUG_ASSERT_NOT_REACHED(); } template void willDelete(IGL_MAYBE_UNUSED const ITrackedResource* resource) noexcept { IGL_DEBUG_ASSERT_NOT_REACHED(); } /** * @brief Associates a name tag with the next resources to be tracked * * @param tag Name of the tag */ virtual void pushTag(const char* tag) noexcept = 0; /** * @brief Pops the last name tag in the stack */ virtual void popTag() noexcept = 0; }; /** * @brief Allows any resources being tracked by a ResourceTracker to be associated with a name tag. * Makes sure that the tag is popped in the destructor. */ class ResourceTrackerTagGuard { public: ResourceTrackerTagGuard(std::shared_ptr tracker, const char* tag) : tracker_(std::move(tracker)) { tracker_->pushTag(tag); } ~ResourceTrackerTagGuard() { tracker_->popTag(); } private: std::shared_ptr tracker_; }; } // namespace igl ================================================ FILE: src/igl/ITrackedResource.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl { /** * @brief ITrackedResource enables resources to be tracked by IResourceTracker * Resources that want to be tracked should derive from ITrackedResource and ensure * initResourceTracker() is called during initialization */ template class ITrackedResource { public: virtual ~ITrackedResource() { if (resourceTracker_) { resourceTracker_->willDelete(castThisAsTPtr()); } } /** * @brief initResourceTracker() sets up tracking with the tracker * When the resource is destroyed, it will automatically deregister itself with the tracker */ void initResourceTracker(std::shared_ptr tracker, const std::string& name = "") { if (IGL_DEBUG_VERIFY(!resourceTracker_)) { resourceTracker_ = std::move(tracker); resourceName_ = name; if (resourceTracker_) { resourceTracker_->didCreate(static_cast(this)); } } } [[nodiscard]] virtual const std::string& getResourceName() const { return resourceName_; } private: // ITrackedResource destructor is called after the `T` object is partially destructed // and ubsan complaints about vptr mismatch on this line : // return static_cast(this); // So we prevent UBSan by turning off vptr sanitizer on this function // // @fb-only // @fb-only // @fb-only // @fb-only #if defined(__clang__) __attribute__((no_sanitize("vptr"))) #endif inline T* castThisAsTPtr() { return static_cast(this); } std::shared_ptr resourceTracker_; std::string resourceName_; }; } // namespace igl ================================================ FILE: src/igl/Log.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #define IGL_COMMON_SKIP_CHECK #include #include #include #include #include #include #if IGL_PLATFORM_ANDROID #include #elif IGL_PLATFORM_IOS #include #elif IGL_PLATFORM_WINDOWS #include #endif // Returns a "handle" (i.e. ptr to ptr) to func static IGLLogHandlerFunc* getHandle() { #if IGL_PLATFORM_ANDROID static IGLLogHandlerFunc sHandler = IGLAndroidLogDefaultHandler; #elif IGL_PLATFORM_IOS static IGLLogHandlerFunc sHandler = IGLAppleLogDefaultHandler; #elif IGL_PLATFORM_WINDOWS static IGLLogHandlerFunc sHandler = IGLWinLogDefaultHandler; #else static IGLLogHandlerFunc sHandler = IGLLogDefaultHandler; #endif return &sHandler; } IGL_API int IGLLog(IGLLogLevel logLevel, const char* IGL_RESTRICT format, ...) { va_list ap; va_start(ap, format); const int result = IGLLogV(logLevel, format, ap); va_end(ap); return result; } IGL_API int IGLLogOnce(IGLLogLevel logLevel, const char* IGL_RESTRICT format, ...) { static std::mutex sLoggedMessagesMutex; static std::unordered_set sLoggedMessages; va_list ap, apCopy; va_start(ap, format); va_copy(apCopy, ap); // make a copy for later passing to IGLLogV() constexpr size_t bufferLength = 256; // NOLINTNEXTLINE(modernize-avoid-c-arrays) char buffer[bufferLength]; // uninitialized FOLLY_PUSH_WARNING FOLLY_GNU_DISABLE_WARNING("-Wformat-nonliteral") int result = vsnprintf(buffer, bufferLength, format, ap); FOLLY_POP_WARNING va_end(ap); const std::string msg(buffer); { const std::lock_guard guard(sLoggedMessagesMutex); if (sLoggedMessages.count(msg) == 0) { result = IGLLogV(logLevel, format, apCopy); sLoggedMessages.insert(msg); } } va_end(apCopy); return result; } IGL_API int IGLLogV(IGLLogLevel logLevel, const char* IGL_RESTRICT format, va_list ap) { return (*getHandle())(logLevel, format, ap); } IGL_API int IGLLogDefaultHandler(IGLLogLevel /*logLevel*/, const char* IGL_RESTRICT format, va_list ap) { FOLLY_PUSH_WARNING FOLLY_GNU_DISABLE_WARNING("-Wformat-nonliteral") return vfprintf(stderr, format, ap); FOLLY_POP_WARNING } IGL_API void IGLLogSetHandler(IGLLogHandlerFunc handler) { *getHandle() = handler; } IGL_API IGLLogHandlerFunc IGLLogGetHandler() { return *getHandle(); } ================================================ FILE: src/igl/Log.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #if !defined(IGL_COMMON_H) && !defined(IGL_COMMON_SKIP_CHECK) #error "Please, include instead" #endif #include #include enum IGLLogLevel { // Was previously LOG_ERROR. IGLLogError = 1, // Was previously LOG_WARNING. IGLLogWarning, // Was previously LOG_INFO. IGLLogInfo, }; ///-------------------------------------- /// MARK: - Logging IGL_API int IGLLog(IGLLogLevel logLevel, const char* IGL_RESTRICT format, ...); IGL_API int IGLLogOnce(IGLLogLevel logLevel, const char* IGL_RESTRICT format, ...); IGL_API int IGLLogV(IGLLogLevel logLevel, const char* IGL_RESTRICT format, va_list arguments); IGL_API int IGLLogDefaultHandler(IGLLogLevel logLevel, const char* IGL_RESTRICT format, va_list ap); ///-------------------------------------- /// MARK: - Custom log handler using IGLLogHandlerFunc = int (*)(IGLLogLevel logLevel, const char* IGL_RESTRICT format, va_list ap); IGL_API void IGLLogSetHandler(IGLLogHandlerFunc handler); IGL_API IGLLogHandlerFunc IGLLogGetHandler(void); ///-------------------------------------- /// MARK: - Macros // Debug logging #if IGL_LOGGING_ENABLED #define IGL_LOG_ERROR(format, ...) \ IGLLog(IGLLogError, "[IGL] Error in (%s).\n", IGL_FUNCTION); \ IGLLog(IGLLogError, (format), ##__VA_ARGS__) #define IGL_LOG_ERROR_ONCE(format, ...) IGLLogOnce(IGLLogError, (format), ##__VA_ARGS__) #define IGL_LOG_INFO(format, ...) IGLLog(IGLLogInfo, (format), ##__VA_ARGS__) #define IGL_LOG_INFO_ONCE(format, ...) IGLLogOnce(IGLLogInfo, (format), ##__VA_ARGS__) #define IGL_LOG_DEBUG(format, ...) IGLLog(IGLLogInfo, (format), ##__VA_ARGS__) #else #define IGL_LOG_ERROR(format, ...) static_cast(0) #define IGL_LOG_ERROR_ONCE(format, ...) static_cast(0) #define IGL_LOG_INFO(format, ...) static_cast(0) #define IGL_LOG_INFO_ONCE(format, ...) static_cast(0) #define IGL_LOG_DEBUG(format, ...) static_cast(0) #endif ================================================ FILE: src/igl/Macros.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include ///-------------------------------------- /// MARK: - String Macros // Concatenation #define IGL_CONCAT(a, b) _IGL_CONCAT_ARGS_WRAPPER(a, b) #define _IGL_CONCAT_ARGS_WRAPPER(a, b) _IGL_CONCAT_ARGS(a, b) #define _IGL_CONCAT_ARGS(a, b) a##b #define IGL_CONCAT3(a, b, c) IGL_CONCAT(IGL_CONCAT(a, b), c) // Convert Macro to String Literal #define IGL_TO_STRING(a) _IGL_TO_STRING_WRAPPER(a) #define _IGL_TO_STRING_WRAPPER(a) #a ///-------------------------------------- /// MARK: - Macro Helpers #define _IGL_EXPAND(x) x #define _IGL_ECHO(...) __VA_ARGS__ #define _IGL_CALL(macro, args) macro args // Returns the 64th argument. // clang-format off #define _IGL_ARG_64(_,\ _64,_63,_62,_61,_60,_59,_58,_57,_56,_55,_54,_53,_52,_51,_50,_49, \ _48,_47,_46,_45,_44,_43,_42,_41,_40,_39,_38,_37,_36,_35,_34,_33, \ _32,_31,_30,_29,_28,_27,_26,_25,_24,_23,_22,_21,_20,_19,_18,_17, \ _16,_15,_14,_13,_12,_11,_10,_9,_8,_7,_6,_5,_4,_3,_2,ARG,...) ARG // clang-format on // Returns 0 if __VA_ARGS__ has a comma, 1 otherwise // Does NOT handle the case when __VA_ARGS__ is empty // Handles up to 64 arguments // clang-format off #define _IGL_HAS_COMMA(...) _IGL_EXPAND(_IGL_ARG_64(__VA_ARGS__, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ,1, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0)) // clang-format on ///-------------------------------------- /// MARK: - Linkage #if defined(__cplusplus) #define IGL_EXTERN extern "C" #define IGL_EXTERN_BEGIN extern "C" { #define IGL_EXTERN_END } // extern "C" #else #define IGL_EXTERN extern #define IGL_EXTERN_BEGIN #define IGL_EXTERN_END #endif // Visibility #if defined(_MSC_VER) #define _IGL_PUBLIC_ATTRIBUTE __declspec(dllexport) #elif defined(__clang__) || defined(__GNUC__) #define _IGL_PUBLIC_ATTRIBUTE __attribute__((visibility("default"))) #else #define _IGL_PUBLIC_ATTRIBUTE #endif #define IGL_EXPORT _IGL_PUBLIC_ATTRIBUTE // C API #define IGL_API IGL_EXTERN _IGL_PUBLIC_ATTRIBUTE ///-------------------------------------- /// MARK: - Restrict #if defined(__GNUC__) || defined(__clang__) #define IGL_RESTRICT __restrict__ #elif defined(_MSC_VER) && (_MSC_VER >= 1900) // VS2015 #define IGL_RESTRICT __restrict #else #define IGL_RESTRICT #endif ///-------------------------------------- /// MARK: - Inline #if !defined(IGL_INLINE) #define IGL_INLINE inline #endif ///-------------------------------------- /// MARK: - Function Signature #if defined(__GNUC__) || defined(__clang__) #define IGL_FUNCTION __PRETTY_FUNCTION__ #elif defined(_MSC_VER) #define IGL_FUNCTION __FUNCSIG__ #elif defined(__cplusplus) && (__cplusplus >= 201103L) // C++11 #define IGL_FUNCTION __func__ #elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) // C99 #define IGL_FUNCTION __func__ #else #define IGL_FUNCTION " " __FILE__ "(" IGL_MACRO_TO_STRING(__LINE__) ")" #endif ///-------------------------------------- /// MARK: - Newline #if IGL_PLATFORM_WINDOWS #define IGL_NEWLINE "\r\n" #else #define IGL_NEWLINE "\n" #endif ///-------------------------------------- /// MARK: - C++17 attributes (these should be inlined after all of our compilers are on c++17) #if defined(__has_cpp_attribute) #if __has_cpp_attribute(maybe_unused) #define IGL_MAYBE_UNUSED [[maybe_unused]] #endif #endif #if !defined(IGL_MAYBE_UNUSED) #define IGL_MAYBE_UNUSED #endif ///-------------------------------------- /// MARK: Visual Studio compatibility // not all control paths return a value #if defined(_MSC_VER) || defined(__GNUC__) #define IGL_UNREACHABLE_RETURN(value) \ IGL_DEBUG_ASSERT_NOT_REACHED(); \ return value; #else #define IGL_UNREACHABLE_RETURN(value) #endif // _MSC_VER ///-------------------------------------- /// MARK: Integrated profiling /// Do not use Tracy for GPU profiling if IGL_WITH_TRACY isn't defined #if defined(IGL_WITH_TRACY_GPU) && !defined(IGL_WITH_TRACY) #undef IGL_WITH_TRACY_GPU #endif #if defined(IGL_WITH_TRACY) && defined(__cplusplus) #include "tracy/Tracy.hpp" // predefined 0xRGB colors for "heavy" point-of-interest operations #define IGL_PROFILER_COLOR_WAIT 0xff0000 #define IGL_PROFILER_COLOR_SUBMIT 0x0000ff #define IGL_PROFILER_COLOR_PRESENT 0x00ff00 #define IGL_PROFILER_COLOR_CREATE 0xff6600 #define IGL_PROFILER_COLOR_DESTROY 0xffa500 #define IGL_PROFILER_COLOR_TRANSITION 0xffffff #define IGL_PROFILER_COLOR_UPDATE 0xffa500 #define IGL_PROFILER_COLOR_DRAW 0x00ff00 // GPU profiling macros #if defined(IGL_WITH_TRACY_GPU) #define IGL_PROFILER_ZONE_GPU_OGL(name) TracyGpuZone(name); #define IGL_PROFILER_ZONE_GPU_COLOR_OGL(name, color) TracyGpuZoneC(name, color); #define IGL_PROFILER_ZONE_GPU_VK(name, profilingContext, cmdBuffer) \ TracyVkZone(profilingContext, cmdBuffer, name); #define IGL_PROFILER_ZONE_GPU_COLOR_VK(name, profilingContext, cmdBuffer, color) \ TracyVkZoneC(profilingContext, cmdBuffer, name, color); #define IGL_PROFILER_ZONE_TRANSIENT_GPU_OGL(varname, name) \ { \ TracyGpuZoneTransientS(varname, name, 0, true); #define IGL_PROFILER_ZONE_TRANSIENT_GPU_VK(profilingContext, varname, cmdBuffer, name) \ { \ TracyVkZoneTransientS(profilingContext, varname, cmdBuffer, name, 0, true); #define IGL_PROFILER_ZONE_GPU_END() } #else // IGL_WITH_TRACY_GPU #define IGL_PROFILER_ZONE_GPU_OGL(name) #define IGL_PROFILER_ZONE_GPU_COLOR_OGL(name, color) #define IGL_PROFILER_ZONE_GPU_VK(name, profilingContext, cmdBuffer) #define IGL_PROFILER_ZONE_GPU_COLOR_VK(name, profilingContext, cmdBuffer, color) #define IGL_PROFILER_ZONE_TRANSIENT_GPU_OGL(varname, name) #define IGL_PROFILER_ZONE_TRANSIENT_GPU_VK(profilingContext, varname, cmdBuffer, name) #define IGL_PROFILER_ZONE_GPU_END() #endif // IGL_WITH_TRACY_GPU #define IGL_PROFILER_FUNCTION() ZoneScoped #define IGL_PROFILER_FUNCTION_COLOR(color) ZoneScopedC(color) #define IGL_PROFILER_ZONE(name, color) \ { \ ZoneScopedC(color); \ ZoneName(name, strlen(name)) #define IGL_PROFILER_ZONE_END() } #define IGL_PROFILER_THREAD(name) tracy::SetThreadName(name) #define IGL_PROFILER_FRAME(name) FrameMarkNamed(name) #else #define IGL_PROFILER_ZONE_GPU_OGL(name) #define IGL_PROFILER_ZONE_GPU_COLOR_OGL(name, color) #define IGL_PROFILER_ZONE_GPU_VK(name, profilingContext, cmdBuffer) #define IGL_PROFILER_ZONE_GPU_COLOR_VK(name, profilingContext, cmdBuffer, color) #define IGL_PROFILER_ZONE_TRANSIENT_GPU_OGL(varname, name) #define IGL_PROFILER_ZONE_TRANSIENT_GPU_VK(profilingContext, varname, cmdBuffer, name) #define IGL_PROFILER_ZONE_GPU_END() #define IGL_PROFILER_FUNCTION() #define IGL_PROFILER_FUNCTION_COLOR(color) #define IGL_PROFILER_ZONE(name, color) { #define IGL_PROFILER_ZONE_END() } #define IGL_PROFILER_THREAD(name) #define IGL_PROFILER_FRAME(name) #endif // IGL_WITH_TRACY #if !defined(IGL_ENUM_TO_STRING) #define IGL_ENUM_TO_STRING(enum, res) \ case enum ::res: \ return IGL_TO_STRING(res); #endif // IGL_ENUM_TO_STRING // Define this to 1 to enable shader dumping. Currently only the Vulkan Device supports it. // It will dump the SPIR-V code into files in the specified path below in // Device::createShaderModule(...) #define IGL_SHADER_DUMP 0 // Replace IGL_SHADER_DUMP_PATH with your own path according to the platform // Ex. for Android your filepath should be specific to the package name: // "/sdcard/Android/data//files/" // @fb-only An example path used with the CodecAvatars app: // @fb-only "/sdcard/Android/data/com.meta.ar.codecavatars/files/" #define IGL_SHADER_DUMP_PATH "/path/to/output/file/" ================================================ FILE: src/igl/NameHandle.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include namespace igl { namespace { #if !defined(__cpp_constexpr) static const CRC_TABLE; uint32_t iglCrc32Fallback(const char* p) { uint32_t crc = ~0u; while (*p) { auto v = (uint8_t)*p++; crc = (crc >> 8) ^ kCrcTable[(crc & 0xFF) ^ v]; } return ~crc; } #endif uint32_t iglCrc32Impl(const char* p) { #if defined(__cpp_constexpr) return iglCrc32ConstExpr(p); #else return iglCrc32Fallback(p); #endif } } // namespace #if defined(__ARM_FEATURE_CRC32) #include namespace { template bool isAligned(const void* p) { return !(reinterpret_cast(p) % std::alignment_of::value); } uint32_t iglCrc32ImplARM8(const char* s, size_t length) { uint32_t crc = ~0u; for (; !isAligned(s) && length > 0; s++, length--) { crc = __crc32b(crc, *s); } for (; length >= 8; s += 8, length -= 8) { crc = __crc32d(crc, *(const uint64_t*)(s)); } for (; length >= 4; s += 4, length -= 4) { crc = __crc32w(crc, *(const uint32_t*)(s)); } for (; length > 0; s++, length--) { crc = __crc32b(crc, *s); } return ~crc; } #if IGL_PLATFORM_ANDROID && defined(__aarch64__) #include #include bool detectCrc32() { uint64_t hwcaps = getauxval(AT_HWCAP); return hwcaps & HWCAP_CRC32 ? true : false; } #elif IGL_PLATFORM_APPLE || IGL_PLATFORM_IOS || IGL_PLATFORM_MACOSX bool detectCrc32() { // All iphones6+ are support it return true; } #else bool detectCrc32() { return false; } #endif } // namespace uint32_t iglCrc32(const char* data, size_t length) { static bool hwSupport = detectCrc32(); return hwSupport ? iglCrc32ImplARM8(data, length) : iglCrc32Impl(data); } #else uint32_t iglCrc32(const char* data, size_t /*length*/) { return iglCrc32Impl(data); } #endif #if IGL_DEBUG_ABORT_ENABLED bool NameHandle::checkIsValidCrcCompare(const NameHandle& nh) const { const bool res = nh.crc32_ == crc32_ && nh.name_ != name_; IGL_DEBUG_ASSERT(!res, "NameHandle CRC check fails: name1 (%s %x) name2 (%s %x)\n", name_.c_str(), crc32_, nh.name_.c_str(), nh.crc32_); return res; } #endif // IGL_DEBUG_ABORT_ENABLED } // namespace igl size_t std::hash>::operator()( const std::vector& key) const { size_t hash = 0; for (const auto& elem : key) { hash ^= std::hash()(elem.getCrc32()); } return hash; } ================================================ FILE: src/igl/NameHandle.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include #include namespace igl { // Constexpr as constexpr. In most cases all hashes from string would be generated in compile-time // crc32 generation is based on gcc implementation #define CRC_TABLE \ std::array kCrcTable = { \ 0, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, \ 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, \ 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, \ 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, \ 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, \ 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C, \ 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 0x26D930AC, \ 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, \ 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, \ 0xB6662D3D, 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, \ 0x9FBFE4A5, 0xE8B8D433, 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, \ 0x086D3D2D, 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, \ 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, \ 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, 0x4DB26158, 0x3AB551CE, \ 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, \ 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, \ 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, \ 0xCE61E49F, 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, \ 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, \ 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, \ 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, 0xF00F9344, 0x8708A3D2, 0x1E01F268, \ 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, \ 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, \ 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, \ 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, \ 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, \ 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, \ 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, \ 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, \ 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242, \ 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, 0x88085AE6, \ 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, \ 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, \ 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, \ 0x47B2CF7F, 0x30B5FFE9, 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, \ 0xCDD70693, 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, \ 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D} #if defined(__cpp_constexpr) constexpr CRC_TABLE; /** * @brief Calculates CRC32 for the incoming character array. * @param data null terminated character string * @returns CRC32 representation of data */ constexpr uint32_t iglCrc32ConstExpr(const char* p) { uint32_t crc = ~0u; for (; *p; ++p) { uint8_t v = (uint8_t)*p; crc = (crc >> 8) ^ kCrcTable[(crc & 0xFF) ^ v]; } return ~crc; } constexpr uint32_t iglCrc32ConstExpr(std::string_view sv) { uint32_t crc = ~0u; for (auto p : sv) { uint8_t v = (uint8_t)p; crc = (crc >> 8) ^ kCrcTable[(crc & 0xFF) ^ v]; } return ~crc; } #endif /** * @brief Calculates CRC32 for the incoming character array. * @param data null terminated character string * @returns CRC32 representation of data */ uint32_t iglCrc32(const char* data, size_t length); ///-------------------------------------- /// MARK: - NameHandle #if IGL_DEBUG_ABORT_ENABLED #define CHECK_VALID_CRC(a) (void)checkIsValidCrcCompare(a) #else #define CHECK_VALID_CRC(a) #endif /** * @brief Creates a mapping between a string and its equivalent CRC32 handle * This way when we need to check if a uniform exists or if it matches another * uniform, we can do an integer comparison rather than a string comparison. */ class NameHandle { public: NameHandle() = default; ~NameHandle() = default; NameHandle(const NameHandle& other) = default; NameHandle(NameHandle&& other) noexcept = default; NameHandle(std::string name, uint32_t crc32) : crc32_(crc32), name_(std::move(name)) {} NameHandle(const char* name, uint32_t crc32) : crc32_(crc32), name_(name) {} NameHandle(std::string_view name, uint32_t crc32) : crc32_(crc32), name_(name) {} /** * @brief Returns a null terminated character array version of the name * @returns null terminated character array */ [[nodiscard]] const char* c_str() const { return name_.c_str(); } /** * @brief Returns a reference to the actual name string * @returns Reference to the actual name string */ [[nodiscard]] const std::string& toString() const { return name_; } /** * @brief Returns crc32 handle for the name string * @returns crc32 handle */ [[nodiscard]] uint32_t getCrc32() const { return crc32_; } bool operator==(const NameHandle& other) const { CHECK_VALID_CRC(other); return crc32_ == other.crc32_; } bool operator!=(const NameHandle& other) const { return !(*this == other); } bool operator<(const NameHandle& other) const { CHECK_VALID_CRC(other); return (crc32_ < other.crc32_); } bool operator>=(const NameHandle& other) const { return !(*this < other); } bool operator>(const NameHandle& other) const { CHECK_VALID_CRC(other); return (crc32_ > other.crc32_); } bool operator<=(const NameHandle& other) const { return !(*this > other); } NameHandle& operator=(const NameHandle& other) { if (crc32_ == other.crc32_) { return *this; } crc32_ = other.crc32_; name_ = other.name_; return *this; } NameHandle& operator=(NameHandle&& other) noexcept = default; operator const char*() const { return name_.c_str(); } private: #if IGL_DEBUG_ABORT_ENABLED [[nodiscard]] bool checkIsValidCrcCompare(const NameHandle& nh) const; #endif uint32_t crc32_ = 0; std::string name_; }; /** * @brief Helper function to convert a string to a NameHandle * @param name String to convert * @return NameHandle that includes the name and its CRC32. */ inline NameHandle genNameHandle(const std::string& name) { return {name, iglCrc32(name.c_str(), name.length())}; } } // namespace igl #if defined(__cpp_constexpr) /// @def IGL_DEFINE_NAMEHANDLE_CONST(name, str) /// @brief Declares and assigns a named igl::NameHandle variable. /// @param name The name of the NameHandle variable. /// @param str The name the handle represents (e.g., uniform name). Must be a const char*. #define IGL_DEFINE_NAMEHANDLE_CONST(name, str) \ const igl::NameHandle name(str, \ std::integral_constant::value) /// @def IGL_NAMEHANDLE(str) /// @brief Creates an igl::NameHandle instance. /// @param str The name the handle represents (e.g., uniform name). Must be a const char*. #define IGL_NAMEHANDLE(str) \ igl::NameHandle(str, std::integral_constant::value) #else // To avoid stlib include, this function is trivial inline size_t iglStringlength(const char* str) { size_t r = 0; while (*str++) { r++; } return r; } #define IGL_DEFINE_NAMEHANDLE_CONST(name, str) \ const igl::NameHandle name(str, igl::iglCrc32(str, iglStringlength(str))) #define IGL_NAMEHANDLE(str) igl::NameHandle(str, igl::iglCrc32(str, iglStringlength(str))) #endif /// @def IGL_NAMEHANDLE_ACCESSOR(name) /// @brief Declares a function returning a const igl::NameHandle& instance. /// @param name The name of the NameHandle function to create. /// /// Use IGL_NAMEHANDLE_ACCESSOR_IMPL to define the function body. /// Use these to avoid compiler warnings with file-scoped const NameHandle instances. /// TODO: Remove once C++20 can be used as NameHandle can be constexpr. #define IGL_NAMEHANDLE_ACCESSOR(name) const ::igl::NameHandle& name(); /// @def IGL_NAMEHANDLE_ACCESSOR_IMPL(name, str) /// @brief Defines a function returning a const ref to a local static igl::NameHandle instance. /// @param name The name of the NameHandle method to create. /// @param str The name the handle represents (e.g., uniform name). Must be a const char*. /// /// Use IGL_NAMEHANDLE_ACCESSOR to declare the function prototype. /// Use these to avoid compiler warnings with file-scoped const NameHandle instances. /// TODO: Remove once C++20 can be used as NameHandle can be constexpr. #define IGL_NAMEHANDLE_ACCESSOR_IMPL(name, str) \ const ::igl::NameHandle& name() { \ static IGL_DEFINE_NAMEHANDLE_CONST(name, str); \ return name; \ } namespace std { template<> struct hash { size_t operator()(const igl::NameHandle& key) const { return hash()(key.getCrc32()); } }; template<> struct hash> { size_t operator()(const std::pair& key) const { return hash()(key.first.getCrc32()) ^ hash()(key.second.getCrc32()); } }; template<> struct hash> { size_t operator()(const std::vector& key) const; }; } // namespace std ================================================ FILE: src/igl/PlatformDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl { /** * @brief PlatformDeviceType represents the platform and graphics backend that a class implementing * the IPlatformDevice interface supports. * */ enum class PlatformDeviceType { Unknown = 0, Metal, OpenGL, OpenGLEgl, OpenGLWgl, OpenGLx, OpenGLIOS, OpenGLMacOS, OpenGLWebGL, Vulkan, D3D12, // @fb-only }; /** * @brief IPlatformDevice is an interface for platform-specific functionality. It enables * type-safety and avoids unsafe downcasts by exposing a method to check the PlatformDeviceType of * the IPlatformDevice. Each implementation of IPlatformDevice can contain different * platform-specific functionality. For example, a common use-case is to expose a method to create a * new igl::ITexture from some platform-specific objects or data, such as a drawable surface on the * given platform. */ class IPlatformDevice { friend class IDevice; protected: IPlatformDevice() = default; /** * @brief Check the type of an IPlatformDevice. * @returns true if the IPlatformDevice is a given PlatformDeviceType t, otherwise false. */ [[nodiscard]] virtual bool isType(PlatformDeviceType t) const noexcept = 0; public: virtual ~IPlatformDevice() = default; }; } // namespace igl ================================================ FILE: src/igl/RenderCommandEncoder.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl { class IDepthStencilState; class IRenderPipelineState; class ISamplerState; namespace BindTarget { constexpr uint8_t kVertex = 0x0001; constexpr uint8_t kFragment = 0x0002; constexpr uint8_t kAllGraphics = 0x0003; constexpr uint8_t kTask = 0x0004; constexpr uint8_t kMesh = 0x0008; } // namespace BindTarget class IRenderCommandEncoder : public ICommandEncoder { public: using ICommandEncoder::ICommandEncoder; ~IRenderCommandEncoder() override = default; virtual void bindViewport(const Viewport& viewport) = 0; virtual void bindScissorRect(const ScissorRect& rect) = 0; virtual void bindRenderPipelineState( const std::shared_ptr& pipelineState) = 0; virtual void bindDepthStencilState( const std::shared_ptr& depthStencilState) = 0; // Binds the buffer to a shader // // Vulkan: `index` is the buffer binding index specified in the shader. // Metal: `index` is the buffer index specified in the shader. // OpenGL: `index` refers to the location of a uniform. The `index` value can be found by using // igl::RenderPipelineState::getIndexByName() // `bufferOffset` is the offset into the buffer where the data starts // `bufferSize` is the size of the buffer to bind used for additional validation (0 means the // remaining size starting from `bufferOffset`) virtual void bindBuffer(uint32_t index, uint8_t target, IBuffer* buffer, size_t bufferOffset = 0, size_t bufferSize = 0) = 0; virtual void bindBuffer(uint32_t index, IBuffer* buffer, size_t bufferOffset = 0, size_t bufferSize = 0) = 0; // On Vulkan and OpenGL: bind a vertex buffer (as in "a buffer with vertices"). // On Metal: bind any buffer to the vertex stage. Apps should take care there are no 'index' // collisions between bindVertexBuffer() and bindBuffer() virtual void bindVertexBuffer(uint32_t index, IBuffer& buffer, size_t bufferOffset = 0) = 0; virtual void bindIndexBuffer(IBuffer& buffer, IndexFormat format, size_t bufferOffset = 0) = 0; /// Creates and binds a temporary buffer to the specified buffer index. virtual void bindBytes(size_t index, uint8_t target, const void* data, size_t length) = 0; /// Binds push constant data to the current encoder. virtual void bindPushConstants(const void* data, size_t length, size_t offset = 0) = 0; virtual void bindSamplerState(size_t index, uint8_t target, ISamplerState* samplerState) = 0; // For metal, the index parameter is the index in the texture argument table, // by the "texture" attribute specified in the shader. // For OpenGL, 'index' is the texture unit virtual void bindTexture(size_t index, uint8_t target, ITexture* texture) = 0; // This `bindTexture()` overload assumes `BindTarget::kFragment` virtual void bindTexture(size_t index, ITexture* texture) = 0; /// Binds an individual uniform. Exclusively for use when uniform blocks are not supported. virtual void bindUniform(const UniformDesc& uniformDesc, const void* data) = 0; virtual void bindBindGroup(BindGroupTextureHandle handle) = 0; // if any uniform/storage buffers are marked as dynamic, then `dynamicOffsets` should include one // element for each `isDynamic` array element virtual void bindBindGroup(BindGroupBufferHandle handle, uint32_t numDynamicOffsets = 0, const uint32_t* dynamicOffsets = nullptr) = 0; virtual void draw(size_t vertexCount, uint32_t instanceCount = 1, uint32_t firstVertex = 0, uint32_t baseInstance = 0) = 0; virtual void drawIndexed(size_t indexCount, uint32_t instanceCount = 1, uint32_t firstIndex = 0, int32_t vertexOffset = 0, uint32_t baseInstance = 0) = 0; virtual void drawMeshTasks(const Dimensions& threadgroupsPerGrid, const Dimensions& threadsPerTaskThreadgroup, const Dimensions& threadsPerMeshThreadgroup) = 0; virtual void multiDrawIndirect(IBuffer& indirectBuffer, size_t indirectBufferOffset = 0, uint32_t drawCount = 1, uint32_t stride = 0) = 0; virtual void multiDrawIndexedIndirect(IBuffer& indirectBuffer, size_t indirectBufferOffset = 0, uint32_t drawCount = 1, uint32_t stride = 0) = 0; virtual void setStencilReferenceValue(uint32_t value) = 0; virtual void setBlendColor(const Color& color) = 0; virtual void setDepthBias(float depthBias, float slopeScale, float clamp) = 0; }; } // namespace igl ================================================ FILE: src/igl/RenderPass.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include // IWYU pragma: keep namespace igl { class ITimestampQueries; /** * @brief LoadAction determines the loading time action of the various components of a * RenderPassDesc. This can be DontCare, Load, or Clear. * * DontCare : No specific operation required. * Load : Preserve previous render contents * Clear : Clear render contents */ enum class LoadAction : uint8_t { DontCare, Load, Clear, }; /** * @brief StoreAction determines the resolution action of the various components of a * RenderPassDesc. This can be DontCare, Store, or MsaaResolve. * * DontCare : No specific operation required. * Store : Preserve render contents * MsaaResolve : Use MSAA to preserve render contents */ enum class StoreAction : uint8_t { DontCare, Store, MsaaResolve, }; /** * @brief RenderPassDesc provides the basis for describing a render pass and provides default * operations for depth and stencil. * * RenderPass by default does not contain any ColorAttachmentDesc operations. */ struct RenderPassDesc { public: /** * @brief BaseAttachmentDesc sets default load action, store action, cube face , mip level, and * array layer for the attachments of a RenderPassDesc */ struct AttachmentDesc { LoadAction loadAction = LoadAction::DontCare; // default load action for color StoreAction storeAction = StoreAction::Store; // default store action for color uint8_t face = 0; // Cube texture face uint8_t mipLevel = 0; // Texture mip level uint8_t layer = 0; // Texture array layer Color clearColor = {0.0f, 0.0f, 0.0f, 0.0f}; float clearDepth = 1.0f; uint32_t clearStencil = 0; }; /** * @brief colorAttachments properties which is empty by default. */ std::vector colorAttachments; /** * @brief depthAttachment property which is clear to 1 and use provided MSAA by default */ AttachmentDesc depthAttachment = {.loadAction = LoadAction::Clear, .storeAction = StoreAction::DontCare}; /** * @brief stencilAttachment property which is clear to 0 by default */ AttachmentDesc stencilAttachment = {.loadAction = LoadAction::Clear, .storeAction = StoreAction::DontCare}; /// Per-render-pass GPU timestamp query attachment. /// When set, the backend measures GPU execution time for this render pass. /// slotIndex is a logical timing slot allocated by GPUTimingCollector. /// Metal maps it to two sampleBufferAttachments indices (slot*2, slot*2+1). /// OpenGL uses it as the GL_TIME_ELAPSED query index. struct TimestampQueryDesc { std::shared_ptr queries; uint32_t slotIndex = 0; ///< Logical timing slot from GPUTimingCollector }; /// Optional per-render-pass GPU timing. Null queries pointer means disabled. TimestampQueryDesc timestampQuery; }; } // namespace igl ================================================ FILE: src/igl/RenderPipelineReflection.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include namespace igl { /** * @brief A structure that describes a buffer argument to a shader. */ struct BufferArgDesc { /** * @brief A structure that describes a member of a buffer argument. */ struct BufferMemberDesc { NameHandle name; ///< The name of the member UniformType type = igl::UniformType::Invalid; ///< The type of the member size_t offset = 0; ///< The offset from the beginning of the structure size_t arrayLength = 1; ///< The number of elements if the member is an array }; NameHandle name; ///< The name of the buffer argument size_t bufferAlignment = 0; ///< The required byte alignment in memory size_t bufferDataSize = 0; ///< The size of the buffer argument in bytes int bufferIndex = -1; ///< The index of the buffer argument ShaderStage shaderStage = ShaderStage::Fragment; ///< The shader stage the argument belongs to. bool isUniformBlock = false; // used in the OpenGL backend only std::vector members; ///< An array of BufferMemberDesc that describes ///< each members of a buffer argument. }; /** * @brief A structure that describes the texture argument to a shader. */ struct TextureArgDesc { std::string name; ///< The name of the texture argument TextureType type; ///< The type of the texture argument int textureIndex = -1; ///< The index in argument table ShaderStage shaderStage = ShaderStage::Fragment; ///< The shader stage that the texture argument belongs to. }; /** * @brief A structure that describes the texture sampler argument to a shader. */ struct SamplerArgDesc { std::string name; ///< The name of the sampler argument int samplerIndex = -1; ///< The index in the argument table ShaderStage shaderStage = ShaderStage::Fragment; ///< The shader stage that the sampler argument belongs to }; /** * @brief An interface that provides access to the information of different types of arguments to * a RenderPipelineState object. The RenderPipelineReflection object can be obtained by calling * renderPipelineReflection on RenderPipelineState. */ class IRenderPipelineReflection { public: /** * @brief A function that returns an array of BufferArgDesc that describe buffer arguments to * the RenderPipelineState. * * @return An array of BufferArgDesc that describes the buffer argument. */ [[nodiscard]] virtual const std::vector& allUniformBuffers() const = 0; /** * @brief A function that returns an array of SamplerArgDesc that describe the sampler arguments * to the RenderPipelineState. * * @return An array of SamplerArgDesc that describes the sampler argument. */ [[nodiscard]] virtual const std::vector& allSamplers() const = 0; /** * @brief A function that returns an array of TextureArgDesc that describe the texture arguments * to the RenderPipelineState. * * @return An array of TextureArgDesc that describes the texture argument. */ [[nodiscard]] virtual const std::vector& allTextures() const = 0; /** * @brief Destroy the IRenderPipelineReflection object */ virtual ~IRenderPipelineReflection() = default; }; } // namespace igl ================================================ FILE: src/igl/RenderPipelineState.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include using namespace igl; /// /// RenderPipelineDesc /// bool RenderPipelineDesc::operator!=(const RenderPipelineDesc& other) const { return !(*this == other); } bool RenderPipelineDesc::operator==(const RenderPipelineDesc& other) const { if (topology != other.topology) { return false; } if (vertexInputState != other.vertexInputState) { return false; } if (shaderStages != other.shaderStages) { return false; } if (targetDesc != other.targetDesc) { return false; } if (cullMode != other.cullMode || frontFaceWinding != other.frontFaceWinding || polygonFillMode != other.polygonFillMode) { return false; } if (vertexUnitSamplerMap != other.vertexUnitSamplerMap) { return false; } if (fragmentUnitSamplerMap != other.fragmentUnitSamplerMap) { return false; } if (uniformBlockBindingMap != other.uniformBlockBindingMap) { return false; } if (sampleCount != other.sampleCount) { return false; } for (size_t i = 0; i != IGL_TEXTURE_SAMPLERS_MAX; i++) { if (immutableSamplers[i] != other.immutableSamplers[i]) { return false; } } if (isDynamicBufferMask != other.isDynamicBufferMask) { return false; } return debugName == other.debugName; } /// The underlying assumption for this hash is all of the shared pointers in /// this structure can uniquely identify the object they are pointing to. /// It is the responsibility of the caller of this function to make sure /// that is the case. size_t std::hash::operator()(const RenderPipelineDesc& key) const { size_t hash = std::hash()(reinterpret_cast(key.vertexInputState.get())); hash ^= std::hash()(EnumToValue(key.topology)); hash ^= std::hash()(reinterpret_cast(key.shaderStages.get())); hash ^= std::hash()(key.targetDesc); hash ^= std::hash()(EnumToValue(key.cullMode)); hash ^= std::hash()(key.sampleCount); hash ^= std::hash()(EnumToValue(key.frontFaceWinding)); hash ^= std::hash()(EnumToValue(key.polygonFillMode)); hash ^= std::hash()(key.isDynamicBufferMask); hash ^= std::hash()(key.debugName); for (const auto& i : key.vertexUnitSamplerMap) { hash ^= std::hash()(i.first); hash ^= std::hash()(i.second); } for (const auto& i : key.fragmentUnitSamplerMap) { hash ^= std::hash()(i.first); hash ^= std::hash()(i.second); } for (const auto& i : key.uniformBlockBindingMap) { hash ^= std::hash()(i.first); for (const auto& names : i.second) { hash ^= std::hash()(names.first); hash ^= std::hash()(names.second); } } for (const auto& i : key.immutableSamplers) { hash ^= std::hash()(reinterpret_cast(i.get())); } return hash; } size_t std::hash::operator()( const RenderPipelineDesc::TargetDesc& key) const { size_t hash = std::hash()(EnumToValue(key.depthAttachmentFormat)); hash ^= std::hash()(EnumToValue(key.stencilAttachmentFormat)); hash ^= std::hash()(key.colorAttachments.size()); for (const auto& ca : key.colorAttachments) { hash ^= std::hash()(ca); } return hash; } size_t std::hash::operator()( const RenderPipelineDesc::TargetDesc::ColorAttachment& key) const { size_t hash = std::hash()(EnumToValue(key.textureFormat)); hash ^= std::hash()(key.colorWriteMask); hash ^= std::hash()(key.blendEnabled); hash ^= std::hash()(EnumToValue(key.rgbBlendOp)); hash ^= std::hash()(EnumToValue(key.alphaBlendOp)); hash ^= std::hash()(EnumToValue(key.srcRGBBlendFactor)); hash ^= std::hash()(EnumToValue(key.srcAlphaBlendFactor)); hash ^= std::hash()(EnumToValue(key.dstRGBBlendFactor)); hash ^= std::hash()(EnumToValue(key.dstAlphaBlendFactor)); return hash; } ================================================ FILE: src/igl/RenderPipelineState.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include #include namespace igl { class IVertexInputState; /** * @brief BlendOp determines how to combine and weight the source and destination fragment values. * Some blend operations multiply the source values by * a source blend factor (SBF), multiply the destination values by a destination blend factor (DBF), * and then combine the results using addition or subtraction. Other blend operations use either a * minimum or maximum function to determine the result. * * Add : Add portions of both source and destination pixel values. * Subtract : Subtract a portion of the destination pixel values from a portion of the source. * ReverseSubtract : Subtract a portion of the source values from a portion of the destination pixel * values. * Min : Minimum of the source and destination pixel values. * Max : Maximum of the source and * destination pixel values. */ enum class BlendOp : uint8_t { Add = 0, Subtract, ReverseSubtract, Min, Max }; /** * @brief The source and destination blend factors are often needed to complete specification of a * blend operation. In most cases, the blend factor for both RGB values (F(rgb)) and alpha values * (F(a)) are similar to one another, but in some cases, such as SrcAlphaSaturated, the blend factor * is slightly different. Four blend factors (BlendColor, OneMinusBlendColor, BlendAlpha, and * OneMinusBlendAlpha) refer to a constant blend color value that is set by the * setBlendColor(red:green:blue:alpha:) method of RenderCommandEncoder. * * Zero : Blend factor of zero. * One : Blend factor of one. * SrcColor : Blend factor of source values. * OneMinusSrcColor : Blend factor of one minus source values. * SrcAlpha : Blend factor of source alpha * OneMinusSrcAlpha : Blend factor of one minus source alpha. * DstColor : Blend factor of destination values. * OneMinusDstColor : Blend factor of one minus destination values. * DstAlpha : Blend factor of destination alpha. * OneMinusDstAlpha : Blend factor of one minus destination alpha. * SrcAlphaSaturated : Blend factor of the minimum of * either source alpha or one minus destination alpha. * BlendColor : Blend factor of RGB values. * OneMinusBlendColor : Blend factor of one minus RGB values. * BlendAlpha : Blend factor of alpha value. * OneMinusBlendAlpha : Blend factor of one minus alpha value. * Src1Color : Blend factor of source values. This option supports dual-source blending * and reads from the second color output of the fragment function. * OneMinusSrc1Color : Blend factor of one minus source values. This option supports dual-source * blending and reads from the second color output of the fragment function. * Src1Alpha : Blend factor of source alpha. This option supports dual-source blending * and reads from the second color output of the fragment function. * OneMinusSrc1Alpha : Blend factor of one minus source alpha. This option supports dual-source * blending and reads from the second color output of the fragment function. */ enum class BlendFactor : uint8_t { Zero = 0, One, SrcColor, OneMinusSrcColor, SrcAlpha, OneMinusSrcAlpha, DstColor, OneMinusDstColor, DstAlpha, OneMinusDstAlpha, SrcAlphaSaturated, BlendColor, OneMinusBlendColor, BlendAlpha, OneMinusBlendAlpha, Src1Color, OneMinusSrc1Color, Src1Alpha, OneMinusSrc1Alpha }; /* * @brief Values used to specify a mask to permit or restrict writing to color channels of a color * value. The values red, green, blue, and alpha select one color channel each, and they can be * bitwise combined. */ using ColorWriteMask = uint8_t; enum ColorWriteBits : uint8_t { kColorWriteBitsDisabled = 0, kColorWriteBitsRed = 1 << 0, kColorWriteBitsGreen = 1 << 1, kColorWriteBitsBlue = 1 << 2, kColorWriteBitsAlpha = 1 << 3, kColorWriteBitsAll = kColorWriteBitsRed | kColorWriteBitsGreen | kColorWriteBitsBlue | kColorWriteBitsAlpha, }; /* * @brief Control polygon rasterization modes * Fill : Polygons are rendered using standard polygon rasterization rules * Line : Polygon edges are drawn as line segments */ enum class PolygonFillMode : uint8_t { Fill = 0, Line = 1, }; /* * @brief An argument of options you pass to a device to get a render pipeline state object. */ struct RenderPipelineDesc { struct TargetDesc { /* * @brief Description of render pipeline's color render target */ struct ColorAttachment { TextureFormat textureFormat = TextureFormat::Invalid; /* * @brief Identify which color channels are blended. */ ColorWriteMask colorWriteMask = kColorWriteBitsAll; bool blendEnabled = false; /* * @brief Assign the blend operations for RGB and alpha pixel data. */ BlendOp rgbBlendOp = BlendOp::Add; BlendOp alphaBlendOp = BlendOp::Add; /* * @brief Assign the source and destination blend factors. */ BlendFactor srcRGBBlendFactor = BlendFactor::One; BlendFactor srcAlphaBlendFactor = BlendFactor::One; BlendFactor dstRGBBlendFactor = BlendFactor::Zero; BlendFactor dstAlphaBlendFactor = BlendFactor::Zero; bool operator==(const ColorAttachment& other) const = default; bool operator!=(const ColorAttachment& other) const = default; }; /* * @brief Array of attachments that store color data */ std::vector colorAttachments; /* * @brief Pixel format of the attachment that stores depth data */ TextureFormat depthAttachmentFormat = TextureFormat::Invalid; /* * @brief Pixel format of the attachment that stores stencil data */ TextureFormat stencilAttachmentFormat = TextureFormat::Invalid; bool operator==(const TargetDesc& other) const = default; bool operator!=(const TargetDesc& other) const = default; }; /* * @brief Describes the primitive topology for this graphics pipeline */ PrimitiveType topology = PrimitiveType::Triangle; /* * @brief Describes the organization of per-vertex input data passed to a vertex shader function */ std::shared_ptr vertexInputState; /* * @brief Describes the vertex and fragment functions */ std::shared_ptr shaderStages; TargetDesc targetDesc; CullMode cullMode = igl::CullMode::Disabled; WindingMode frontFaceWinding = igl::WindingMode::CounterClockwise; PolygonFillMode polygonFillMode = igl::PolygonFillMode::Fill; /* * GL Only: Mapping of Texture Unit <-> Sampler Name * Texture unit should be < IGL_TEXTURE_SAMPLERS_MAX */ std::unordered_map vertexUnitSamplerMap; std::unordered_map fragmentUnitSamplerMap; /* * GL Only: * Maps block binding points to vectors of (BlockName, blockInstanceName) pairs of all uniform * blocks that should use this binding point. * Uniform Block Binding Point should be < IGL_UNIFORM_BLOCKS_BINDING_MAX. * This should only be populated if explicit binding is not supported or used. */ std::unordered_map>> uniformBlockBindingMap; uint32_t sampleCount = 1u; // MSAA // Vulkan only: specify if buffer binding locations correspond to Vulkan dynamic buffers uint32_t isDynamicBufferMask = 0; // one bit per each buffer binding slot // Vulkan only: immutable samplers per each binding slot (for example, Ycbcr conversion etc) // NOLINTNEXTLINE(modernize-avoid-c-arrays) std::shared_ptr immutableSamplers[IGL_TEXTURE_SAMPLERS_MAX] = {}; NameHandle debugName; bool operator==(const RenderPipelineDesc& other) const; bool operator!=(const RenderPipelineDesc& other) const; }; class IRenderPipelineState { public: explicit IRenderPipelineState(RenderPipelineDesc desc) : desc_(std::move(desc)) {} virtual ~IRenderPipelineState() = default; [[nodiscard]] virtual std::shared_ptr renderPipelineReflection() = 0; virtual void setRenderPipelineReflection( const IRenderPipelineReflection& renderPipelineReflection) = 0; [[nodiscard]] virtual int getIndexByName(const NameHandle& /* name */, ShaderStage /* stage */) const { return -1; } [[nodiscard]] virtual int getIndexByName(const std::string& /* name */, ShaderStage /* stage */) const { return -1; } [[nodiscard]] const RenderPipelineDesc& getRenderPipelineDesc() const { return desc_; } protected: const RenderPipelineDesc desc_{}; }; } // namespace igl /// Hashing function declarations /// namespace std { template<> struct hash { size_t operator()(const igl::RenderPipelineDesc& /*key*/) const; }; template<> struct hash { size_t operator()(const igl::RenderPipelineDesc::TargetDesc& /*key*/) const; }; template<> struct hash { size_t operator()(const igl::RenderPipelineDesc::TargetDesc::ColorAttachment& /*key*/) const; }; } // namespace std ================================================ FILE: src/igl/SamplerState.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace igl { bool SamplerStateDesc::operator==(const SamplerStateDesc& rhs) const { return (minFilter == rhs.minFilter) && (magFilter == rhs.magFilter) && (mipFilter == rhs.mipFilter) && (addressModeU == rhs.addressModeU) && (addressModeV == rhs.addressModeV) && (addressModeW == rhs.addressModeW) && (depthCompareFunction == rhs.depthCompareFunction) && (mipLodMin == rhs.mipLodMin) && (mipLodMax == rhs.mipLodMax) && (maxAnisotropic == rhs.maxAnisotropic) && (depthCompareEnabled == rhs.depthCompareEnabled) && (yuvFormat == rhs.yuvFormat); } bool SamplerStateDesc::operator!=(const SamplerStateDesc& rhs) const { return !operator==(rhs); } } // namespace igl size_t std::hash::operator()(const igl::SamplerStateDesc& key) const { IGL_DEBUG_ASSERT(key.maxAnisotropic >= 1 && key.maxAnisotropic <= 16, "[IGL] SamplerStateDesc::maxAnisotropic is out of range: %su", key.maxAnisotropic); IGL_DEBUG_ASSERT( key.mipLodMin < 16, "[IGL] SamplerStateDesc::mipLodMin is out of range: %su", key.mipLodMin); IGL_DEBUG_ASSERT(key.mipLodMax < 16 && key.mipLodMin <= key.mipLodMax, "[IGL] SamplerStateDesc::mipLodMax is out of range: %su", key.mipLodMax); // clang-format off const size_t hash = igl::EnumToValue(key.minFilter) | // 0,1: 1 bit field igl::EnumToValue(key.magFilter) << 1 | // 0,1: 1 bit field igl::EnumToValue(key.mipFilter) << 2 | // 0,1: 1 bit field igl::EnumToValue(key.addressModeU) << 4 | // 0,1,2: 2 bit field igl::EnumToValue(key.addressModeV) << 6 | // 0,1,2: 2 bit field igl::EnumToValue(key.addressModeW) << 8 | // 0,1,2: 2 bit field (key.maxAnisotropic - 1) << 10 | // subtract 1 so it fits 4 bits key.mipLodMin << 14 | // [0, 15]: 4 bit field key.mipLodMax << 18 | // [0, 15]: 4 bit field igl::EnumToValue(key.depthCompareFunction) << 22 | // [0, 7]: 3 bit field (key.depthCompareEnabled ? 1u : 0u) << 25 | // 0,1: 1 bit field igl::EnumToValue(key.yuvFormat) << 26; // 0,255: 8 bit field // clang-format on return hash; } ================================================ FILE: src/igl/SamplerState.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include namespace igl { /** * @brief Filtering option to use when sampling textures within the same mipmap level. * * Nearest : The sampled value is the value from the texel closest to the sampling point. * Linear : The sampled value is linearly interpolated from the texel values nearest to the * sampling point. */ enum class SamplerMinMagFilter : uint8_t { Nearest = 0, Linear }; /** * @brief Filtering option to use when sampling textures between mipmap levels. * * Disabled: The sampled value is the selected from mipmap level 0. * Nearest : The sampled value is the selected from the nearest mipmap level to the filter. * Linear : The sampled value is linearly interpolated from the sampled values from the nearest * mipmap levels. */ enum class SamplerMipFilter : uint8_t { Disabled = 0, Nearest, Linear }; /** * @brief Filtering option to use when sampling outside the boundary of a texture * * Repeat : The texture repeats outside the range [0, 1]. * Clamp : Sampling locations < 0 are clamped to 0. Sampling locations > 1 are clamped to 1. * MirrorRepeat : The texture repeats outside the range [0, 1]. Every other repetition is a mirror * image. */ enum class SamplerAddressMode : uint8_t { Repeat = 0, Clamp, MirrorRepeat }; /** * @brief Describes the texture sampling configuration for a texture. * * This describes what sampling filters to use, what mipmap levels to sample from * how to sample between mipmap levels, how to handle sampling locations outside * the texture, and what comparison operation to use when sampling depth textures. * * The type and valid ranges for mip lod min/max were decided based on: * - Ability to hash a SamplerStateDesc: the current implementation * relies on perfect hashing and we don't have many free bits left. * - Realistic use cases: negative values aren't useful (Metal says so) * and big values aren't either (GL says so). In practice, a texture * will only have log2(max_size) lods so a value of 16 is more than * any of our platforms support. */ struct SamplerStateDesc { /** * @brief The filtering option to use when a texel is smaller than a fragment. */ SamplerMinMagFilter minFilter = SamplerMinMagFilter::Nearest; /** * @brief The filtering option to use when a texel is larger than a fragment. */ SamplerMinMagFilter magFilter = SamplerMinMagFilter::Nearest; /** * @brief The filtering option to use between mipmap levels. */ SamplerMipFilter mipFilter = SamplerMipFilter::Disabled; /** * @brief The sampling address mode to use for the U texture coordinate. */ SamplerAddressMode addressModeU = SamplerAddressMode::Repeat; /** * @brief The sampling address mode to use for the V texture coordinate. */ SamplerAddressMode addressModeV = SamplerAddressMode::Repeat; /** * @brief The sampling address mode to use for the W texture coordinate. */ SamplerAddressMode addressModeW = SamplerAddressMode::Repeat; /** * @brief The depth comparison to use when comparing samples from a depth texture. */ CompareFunction depthCompareFunction = CompareFunction::LessEqual; /** * @brief The minimum mipmap level to use when sampling a texture. * * The valid range is [0, 15] */ uint8_t mipLodMin = 0; /** * @brief The maximum mipmap level to use when sampling a texture. * * The valid range is [mipLodMin, 15] */ uint8_t mipLodMax = 15; /** * @brief The maximum number of samples that can be taken from a texture to improve the quality of * the sampled result. * * The valid range is [1, 16] */ uint8_t maxAnisotropic = 1; /** * @brief Whether or not depth comparison is enabled. * * If true, the depthCompareFunction will be configured in the sampler state. * If false, the depthCompareFunction will be disabled. */ bool depthCompareEnabled = false; /** * @brief A user-readable debug name associated with this sampler. * */ std::string debugName; TextureFormat yuvFormat = igl::TextureFormat::Invalid; /** * @brief Creates a new SamplerStateDesc instance set up for linearly interpolating within mipmap * level 0. * * minFilter and magFilter set to SamplerMinMagFilter::Linear. * mipFilter is set to SamplerMipFilter::Disabled. * All other parameters have their default value. */ static SamplerStateDesc newLinear() { SamplerStateDesc desc; desc.minFilter = desc.magFilter = SamplerMinMagFilter::Linear; desc.mipFilter = SamplerMipFilter::Disabled; desc.debugName = "newLinear()"; return desc; } /** * @brief Creates a new SamplerStateDesc instance set up for linearly interpolating within and * between mipmap levels. * * minFilter and magFilter set to SamplerMinMagFilter::Linear. * mipFilter is set to SamplerMipFilter::Linear. * All other parameters have their default value. */ static SamplerStateDesc newLinearMipmapped() { SamplerStateDesc desc; desc.minFilter = desc.magFilter = SamplerMinMagFilter::Linear; desc.mipFilter = SamplerMipFilter::Linear; desc.debugName = "newLinearMipmapped()"; return desc; } /** * @brief Creates a new SamplerStateDesc instance set up for YUV conversion */ static SamplerStateDesc newYUV(TextureFormat yuvFormat, const char* debugName) { SamplerStateDesc desc; desc.minFilter = desc.magFilter = SamplerMinMagFilter::Linear; desc.mipFilter = SamplerMipFilter::Disabled; desc.addressModeU = SamplerAddressMode::Clamp; desc.addressModeV = SamplerAddressMode::Clamp; desc.addressModeW = SamplerAddressMode::Clamp; desc.debugName = debugName; desc.yuvFormat = yuvFormat; return desc; } /** * @brief Compares two SamplerStateDesc objects for equality. * * Returns true if all descriptor properties are identical. */ bool operator==(const SamplerStateDesc& rhs) const; /** * @brief Compares two SamplerStateDesc objects for inequality. * * Returns true if any descriptor properties differ. */ bool operator!=(const SamplerStateDesc& rhs) const; }; /** * @brief A texture sampling configuration. * * This interface is the backend agnostic representation for a texture sampling configuration. * To create an instance, populate a SamplerStateDesc and call IDevice.createSamplerState. * To use an instance in a render pass for a texture, call IRenderCommandEncoder.bindSamplerState. */ class ISamplerState : public ITrackedResource { protected: ISamplerState() = default; public: ~ISamplerState() override = default; /** * @brief Returns whether this sampler state is configured for YUV color space conversion. * Required for Vulkan to take proper care of immutable samplers * * @return true if the sampler is configured for YUV format, false otherwise. */ [[nodiscard]] virtual bool isYUV() const noexcept = 0; }; } // namespace igl /** * @brief Provides a hash function for igl::SamplerStateDesc. */ namespace std { template<> struct hash { /** * @brief Computes a hash value for igl::SamplerStateDesc. * * The hash value is based on all properties in the igl::SamplerStateDesc; */ size_t operator()(const igl::SamplerStateDesc& /*key*/) const; }; } // namespace std ================================================ FILE: src/igl/Shader.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace { bool safeDataCompare(const void* IGL_NULLABLE a, size_t lengthA, const void* IGL_NULLABLE b, size_t lengthB) { if (lengthA != lengthB) { return false; } // Handle null pointers; if (a == nullptr || b == nullptr) { // If both are null, consider them equal. If only ond is null, they are not equal return a == b; } return (memcmp(a, b, lengthA) == 0); } size_t safeDataHash(const void* IGL_NULLABLE ptr, size_t length) { if (ptr == nullptr) { return 0; } size_t hash = 0; for (size_t i = 0; i < length; ++i) { hash ^= static_cast(ptr)[i]; } return hash; } bool safeCStrCompare(const char* IGL_NULLABLE a, const char* IGL_NULLABLE b) { if (a == b) { return true; } if (a == nullptr || b == nullptr) { return false; } return (strcmp(a, b) == 0); } size_t safeCStrHash(const char* IGL_NULLABLE s) { if (s == nullptr) { return 0; } return std::hash()(std::string_view(s, strlen(s))); } } // namespace namespace igl { bool ShaderCompilerOptions::operator==(const ShaderCompilerOptions& other) const { return fastMathEnabled == other.fastMathEnabled; } bool ShaderCompilerOptions::operator!=(const ShaderCompilerOptions& other) const { return !(*this == other); } bool ShaderModuleInfo::operator==(const ShaderModuleInfo& other) const { return stage == other.stage && entryPoint == other.entryPoint; } bool ShaderModuleInfo::operator!=(const ShaderModuleInfo& other) const { return !operator==(other); } bool ShaderInput::isValid() const noexcept { if (type == ShaderInputType::String) { return source != nullptr && data == nullptr && length == 0; } else if (type == ShaderInputType::Binary) { return data != nullptr && length > 0 && source == nullptr; } else { return false; } } bool ShaderInput::operator==(const ShaderInput& other) const { return type == other.type && options == other.options && (type == ShaderInputType::String ? safeCStrCompare(source, other.source) : true) && (type == ShaderInputType::Binary ? safeDataCompare(data, length, other.data, other.length) : true); } bool ShaderInput::operator!=(const ShaderInput& other) const { return !operator==(other); } ShaderModuleDesc ShaderModuleDesc::fromStringInput(const char* IGL_NONNULL source, ShaderModuleInfo info, std::string debugName) { ShaderModuleDesc desc; desc.input.type = ShaderInputType::String; desc.input.source = source; desc.info = std::move(info); desc.debugName = std::move(debugName); return desc; } ShaderModuleDesc ShaderModuleDesc::fromBinaryInput(const void* IGL_NONNULL data, size_t dataLength, ShaderModuleInfo info, std::string debugName) { ShaderModuleDesc desc; desc.input.type = ShaderInputType::Binary; desc.input.data = data; desc.input.length = dataLength; desc.info = std::move(info); desc.debugName = std::move(debugName); return desc; } bool ShaderModuleDesc::operator==(const ShaderModuleDesc& other) const { return info == other.info && input == other.input && debugName == other.debugName; } bool ShaderModuleDesc::operator!=(const ShaderModuleDesc& other) const { return !operator==(other); } ShaderLibraryDesc ShaderLibraryDesc::fromStringInput(const char* IGL_NONNULL librarySource, std::vector moduleInfo, std::string libraryDebugName) { ShaderLibraryDesc libraryDesc; libraryDesc.input.type = ShaderInputType::String; libraryDesc.input.source = librarySource; libraryDesc.debugName = std::move(libraryDebugName); if (IGL_DEBUG_VERIFY(!moduleInfo.empty())) { libraryDesc.moduleInfo = std::move(moduleInfo); } return libraryDesc; } ShaderLibraryDesc ShaderLibraryDesc::fromBinaryInput(const void* IGL_NONNULL libraryData, size_t libraryDataLength, std::vector moduleInfo, std::string libraryDebugName) { ShaderLibraryDesc libraryDesc; libraryDesc.input.type = ShaderInputType::Binary; libraryDesc.input.data = libraryData; libraryDesc.input.length = libraryDataLength; libraryDesc.debugName = std::move(libraryDebugName); if (IGL_DEBUG_VERIFY(!moduleInfo.empty())) { libraryDesc.moduleInfo = std::move(moduleInfo); } return libraryDesc; } bool ShaderLibraryDesc::operator==(const ShaderLibraryDesc& other) const { return moduleInfo == other.moduleInfo && input == other.input && debugName == other.debugName; } bool ShaderLibraryDesc::operator!=(const ShaderLibraryDesc& other) const { return !operator==(other); } IShaderModule::IShaderModule(ShaderModuleInfo info) : info_(std::move(info)) {} const ShaderModuleInfo& IShaderModule::info() const noexcept { return info_; } IShaderLibrary::IShaderLibrary(std::vector> modules) : modules_(std::move(modules)) {} std::shared_ptr IShaderLibrary::getShaderModule(const std::string& entryPoint) { for (const auto& sm : modules_) { if (sm && sm->info().entryPoint == entryPoint) { return sm; } } return nullptr; } std::shared_ptr IShaderLibrary::getShaderModule(ShaderStage stage, const std::string& entryPoint) { for (const auto& sm : modules_) { if (sm) { const auto& info = sm->info(); if (info.stage == stage && info.entryPoint == entryPoint) { return sm; } } } return nullptr; } ShaderStagesDesc ShaderStagesDesc::fromRenderModules( std::shared_ptr vertexModule, std::shared_ptr fragmentModule) { std::string debugName = (vertexModule ? vertexModule->info().debugName : std::string()) + ", " + (fragmentModule ? fragmentModule->info().debugName : std::string()); return ShaderStagesDesc{ .vertexModule = std::move(vertexModule), .fragmentModule = std::move(fragmentModule), .type = ShaderStagesType::Render, .debugName = std::move(debugName), }; } ShaderStagesDesc ShaderStagesDesc::fromMeshRenderModules( std::shared_ptr taskModule, std::shared_ptr meshModule, std::shared_ptr fragmentModule) { std::string debugName = (taskModule ? taskModule->info().debugName : std::string()) + ", " + (meshModule ? meshModule->info().debugName : std::string()) + ", " + (fragmentModule ? fragmentModule->info().debugName : std::string()); return ShaderStagesDesc{ .fragmentModule = std::move(fragmentModule), .taskModule = std::move(taskModule), .meshModule = std::move(meshModule), .type = ShaderStagesType::RenderMeshShader, .debugName = std::move(debugName), }; } ShaderStagesDesc ShaderStagesDesc::fromComputeModule(std::shared_ptr computeModule) { std::string debugName = computeModule ? computeModule->info().debugName : "igl/Shader.cpp"; return ShaderStagesDesc{ .computeModule = std::move(computeModule), .type = ShaderStagesType::Compute, .debugName = std::move(debugName), }; } IShaderStages::IShaderStages(ShaderStagesDesc desc) : desc_(std::move(desc)) {} ShaderStagesType IShaderStages::getType() const noexcept { return desc_.type; } const std::shared_ptr& IShaderStages::getVertexModule() const noexcept { return desc_.vertexModule; } const std::shared_ptr& IShaderStages::getFragmentModule() const noexcept { return desc_.fragmentModule; } const std::shared_ptr& IShaderStages::getComputeModule() const noexcept { return desc_.computeModule; } const std::shared_ptr& IShaderStages::getTaskModule() const noexcept { return desc_.taskModule; } const std::shared_ptr& IShaderStages::getMeshModule() const noexcept { return desc_.meshModule; } bool IShaderStages::isValid() const noexcept { if (desc_.type == ShaderStagesType::Render) { return desc_.vertexModule && desc_.fragmentModule && !desc_.computeModule; } else if (desc_.type == ShaderStagesType::Compute) { return desc_.computeModule && !desc_.vertexModule && !desc_.fragmentModule; } else if (desc_.type == ShaderStagesType::RenderMeshShader) { return desc_.meshModule && desc_.fragmentModule && !desc_.computeModule && !desc_.vertexModule; } return false; } } // namespace igl namespace std { // @fb-only size_t hash::operator()(const igl::ShaderCompilerOptions& key) const { const size_t result = std::hash()(key.fastMathEnabled); return result; } size_t hash::operator()(const igl::ShaderModuleInfo& key) const { static_assert(std::is_same_v::type>); size_t result = std::hash()(static_cast(key.stage)); result ^= std::hash()(key.entryPoint); return result; } size_t hash::operator()(const igl::ShaderInput& key) const { static_assert(std::is_same_v::type>); size_t result = safeCStrHash(key.source); result ^= safeDataHash(key.data, key.length); result ^= std::hash()(EnumToValue(key.type)); return result; } size_t hash::operator()(const igl::ShaderModuleDesc& key) const { static_assert(std::is_same_v::type>); size_t result = std::hash()(key.info); result ^= std::hash()(key.input); result ^= std::hash()(key.debugName); return result; } size_t hash::operator()(const igl::ShaderLibraryDesc& key) const { static_assert(std::is_same_v::type>); size_t result = std::hash()(key.moduleInfo.size()); for (const auto& info : key.moduleInfo) { result ^= std::hash()(info); } result ^= std::hash()(key.input); result ^= std::hash()(key.debugName); return result; } // @fb-only } // namespace std ================================================ FILE: src/igl/Shader.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include // IWYU pragma: keep #include namespace igl { /** * @brief Type of shader stage in the rendering pipeline. */ enum class ShaderStage : uint8_t { /** @brief Vertex shader. */ Vertex, /** @brief Fragment shader. */ Fragment, /** @brief Compute shader. */ Compute, /** @brief Task shader. */ Task, /** @brief Mesh shader. */ Mesh, }; /** * @brief Configuration used when compiling a shader to toggle features such as fast math. */ struct ShaderCompilerOptions { /** @brief Enable optimizations for floating-point arithmetic that may violate the IEEE 754 * standard. */ bool fastMathEnabled = true; bool operator==(const ShaderCompilerOptions& other) const; bool operator!=(const ShaderCompilerOptions& other) const; }; /** * @brief Metadata about a shader module. */ struct ShaderModuleInfo { /** @brief The module's shader stage. */ ShaderStage stage = ShaderStage::Fragment; /** @brief The module's entry point. */ std::string entryPoint; std::string debugName; bool operator==(const ShaderModuleInfo& other) const; bool operator!=(const ShaderModuleInfo& other) const; }; /** * @brief A enumeration of shader input types. */ enum class ShaderInputType : uint8_t { /** @brief String with shader source code. */ String, /** @brief Binary data with pre-compiled shader code. */ Binary }; /** * @brief A union of the available shader input structs. */ struct ShaderInput { /** * @brief Null-terminated string containing shader source code. * @remark Only used when type is ShaderInputType::String */ const char* IGL_NULLABLE source = nullptr; /** * @brief Shader compiler configuration. Only used by Metal backends. * @remark Only used when type is ShaderInputType::String */ ShaderCompilerOptions options; /** * @brief Pointer to pre-compiled shader binary data. * @remark Only used when type is ShaderInputType::Binary */ const void* IGL_NULLABLE data = nullptr; /** * @brief Length in bytes of pre-compiled shader binary data. * @remark Only used when type is ShaderInputType::Binary */ size_t length = 0; /** * @brief The type of shader input. */ ShaderInputType type = ShaderInputType::String; /** * @brief Returns true if the input is valud. * The descriptor is valid for string input if: * * source is NOT nullptr, * * data is nullptr, and * * length is 0. * The descriptor is valid for binary input if: * * data is NOT nullptr, * * length is greater than 0, and * * source is nullptr. */ [[nodiscard]] bool isValid() const noexcept; bool operator==(const ShaderInput& other) const; bool operator!=(const ShaderInput& other) const; }; /** * @brief Descriptor used to construct a shader module. * @see igl::Device::createShaderModule */ struct ShaderModuleDesc { /** @brief Metadata about the shader module. */ ShaderModuleInfo info; /** @brief The input to create the shader module. */ ShaderInput input; /** @brief The module's debug name. */ std::string debugName; /** * @brief Constructs a ShaderModuleDesc for a shader from source code. * @param source Null-terminated string containing compute shader source code. * @param info Shader module metadata. * @param debugName Debug name for the shader module. */ static ShaderModuleDesc fromStringInput(const char* IGL_NONNULL source, ShaderModuleInfo info, std::string debugName); /** * @brief Constructs a ShaderModuleDesc for a shader from binary data. * @param data Pre-compiled shader binary data. * @param dataLength Length in bytes of the precompiled shader binary data. * @param info Shader module metadata. * @param debugName Debug name for the shader module. */ static ShaderModuleDesc fromBinaryInput(const void* IGL_NONNULL data, size_t dataLength, ShaderModuleInfo info, std::string debugName); bool operator==(const ShaderModuleDesc& other) const; bool operator!=(const ShaderModuleDesc& other) const; }; /** * @brief Descriptor used to construct a shader module. * @see igl::Device::createShaderModule */ struct ShaderLibraryDesc { /** @brief Metadata about each shader module the library provides. */ std::vector moduleInfo; /** @brief The input to create the shader library. */ ShaderInput input; /** @brief The library's debug name. */ std::string debugName; /** * @brief Constructs a ShaderLibraryDesc for a shaders from source code. * @param librarySource Null-terminated string containing shader source code. * @param moduleInfo Vector of metadata for shader modules in the library. * @param libraryDebugName Debug name for the library. */ static ShaderLibraryDesc fromStringInput(const char* IGL_NONNULL librarySource, std::vector moduleInfo, std::string libraryDebugName); /** * @brief Constructs a ShaderLibraryDesc for a shaders from binary data. * @param libraryData Pre-compiled shader binary data. * @param libraryDataLength Length in bytes of the precompiled shader binary data. * @param moduleInfo Vector of metadata for shader modules in the library. * @param libraryDebugName Debug name for the library. */ static ShaderLibraryDesc fromBinaryInput(const void* IGL_NONNULL libraryData, size_t libraryDataLength, std::vector moduleInfo, std::string libraryDebugName); bool operator==(const ShaderLibraryDesc& other) const; bool operator!=(const ShaderLibraryDesc& other) const; }; /** * @brief Represents an individual shader, such as a vertex shader or fragment shader. */ class IShaderModule : public ITrackedResource { protected: explicit IShaderModule(ShaderModuleInfo info); public: /** @brief Returns metadata about the shader module */ [[nodiscard]] const ShaderModuleInfo& info() const noexcept; private: const ShaderModuleInfo info_; }; /** * @brief A collection of compiled shaders. An individual shader module can be retrieved from a * library given an entry point name. */ class IShaderLibrary : public ITrackedResource { protected: explicit IShaderLibrary(std::vector> modules); public: /** * @brief Retrieves a shader module from this library given an entry point name. * @param entryPoint The name of the desired entry point. * @return Shader module associated with the entry point. nullptr if one does not exist. */ std::shared_ptr getShaderModule(const std::string& entryPoint); /** * @brief Retrieves a shader module from this library given an entry point name and a shader * stage. * @param stage The shader stage. * @param entryPoint The name of the desired entry point. * @return Shader module associated with the entry point and stage. nullptr if one does not exist. */ std::shared_ptr getShaderModule(ShaderStage stage, const std::string& entryPoint); private: std::vector> modules_; }; /** * @brief Type of shader stage in the rendering pipeline. */ enum class ShaderStagesType : uint8_t { /** @brief Render shader stages. */ Render, /** @brief Compute shader stages. */ Compute, /** @brief Mesh render shader stages. */ RenderMeshShader }; /** * @brief The set of shader modules used to create a IShaderStages object. * @see igl::Device::createShaderStages */ struct ShaderStagesDesc { /** * @brief Constructs a ShaderStagesDesc for render shader stages. * @param vertexModule The vertex shader module. * @param fragmentModule The vertex shader module. */ static ShaderStagesDesc fromRenderModules(std::shared_ptr vertexModule, std::shared_ptr fragmentModule); /** * @brief Constructs a ShaderStagesDesc for mesh render shader stages. * @param taskModule The task shader module. * @param meshModule The mesh shader module. * @param fragmentModule The vertex shader module. */ static ShaderStagesDesc fromMeshRenderModules(std::shared_ptr taskModule, std::shared_ptr meshModule, std::shared_ptr fragmentModule); /** * @brief Constructs a ShaderStagesDesc for compute shader stages. * @param computeModule The compute shader module. */ static ShaderStagesDesc fromComputeModule(std::shared_ptr computeModule); /** @brief The vertex shader module to be used in a render pipeline state. */ std::shared_ptr vertexModule; /** @brief The fragment shader module to be used in a render pipeline state. */ std::shared_ptr fragmentModule; /** @brief The fragment shader module to be used in a compute pipeline state. */ std::shared_ptr computeModule; /** @brief The task shader module to be used in a mesh render pipeline state. */ std::shared_ptr taskModule; /** @brief The mesh shader module to be used in a mesh render pipeline state. */ std::shared_ptr meshModule; /** @brief The type of shader stages: render or compute. */ ShaderStagesType type = ShaderStagesType::Render; /** @brief Identifier used for debugging */ std::string debugName; }; /** * @brief A set of shader modules used to configure a render pipeline state. */ class IShaderStages : public ITrackedResource { protected: explicit IShaderStages(ShaderStagesDesc desc); public: /** * @brief The type of shader stages: render or compute. */ [[nodiscard]] ShaderStagesType getType() const noexcept; /** * @brief The vertex shader in this set of shader stages. * @return Vertex shader module. */ [[nodiscard]] const std::shared_ptr& getVertexModule() const noexcept; /** * @brief The fragment shader in this set of shader stages. * @return Fragment shader module. */ [[nodiscard]] const std::shared_ptr& getFragmentModule() const noexcept; /** * @brief The compute shader in this set of shader stages. * @return Compute shader module. */ [[nodiscard]] const std::shared_ptr& getComputeModule() const noexcept; /** * @brief The task shader in this set of shader stages. * @return Task shader module. */ [[nodiscard]] const std::shared_ptr& getTaskModule() const noexcept; /** * @brief The mesh shader in this set of shader stages. * @return Mesh shader module. */ [[nodiscard]] const std::shared_ptr& getMeshModule() const noexcept; /** * @brief Checks if the IShaderStages object is valid. * The object is valid if it has both a vertex and fragment modules for render stages, and if it * has a compute module for compute stages. * @return True if valid; false otherwise. */ [[nodiscard]] bool isValid() const noexcept; protected: ShaderStagesDesc desc_; }; } // namespace igl /// Hashing function declarations /// namespace std { template<> struct hash { size_t operator()(const igl::ShaderCompilerOptions& /*key*/) const; }; template<> struct hash { size_t operator()(const igl::ShaderModuleInfo& /*key*/) const; }; template<> struct hash { size_t operator()(const igl::ShaderInput& /*key*/) const; }; template<> struct hash { size_t operator()(const igl::ShaderModuleDesc& /*key*/) const; }; template<> struct hash { size_t operator()(const igl::ShaderLibraryDesc& /*key*/) const; }; } // namespace std ================================================ FILE: src/igl/ShaderCreator.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace igl { namespace { std::unique_ptr fromLibraryDesc(const IDevice& device, const ShaderLibraryDesc& libraryDesc, Result* IGL_NULLABLE outResult); } // namespace std::shared_ptr ShaderModuleCreator::fromStringInput(const IDevice& device, const char* IGL_NONNULL source, ShaderModuleInfo info, std::string debugName, Result* IGL_NULLABLE outResult) { Result localResult; Result* result = outResult ? outResult : &localResult; IGL_DEBUG_ASSERT(result); const auto desc = igl::ShaderModuleDesc::fromStringInput(source, std::move(info), std::move(debugName)); auto sm = device.createShaderModule(desc, result); if (result && !result->isOk()) { return nullptr; } return sm; } std::shared_ptr ShaderModuleCreator::fromBinaryInput(const IDevice& device, const void* IGL_NONNULL data, size_t dataLength, ShaderModuleInfo info, std::string debugName, Result* IGL_NULLABLE outResult) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); Result localResult; Result* result = outResult ? outResult : &localResult; IGL_DEBUG_ASSERT(result); const auto desc = igl::ShaderModuleDesc::fromBinaryInput( data, dataLength, std::move(info), std::move(debugName)); auto sm = device.createShaderModule(desc, result); if (result && !result->isOk()) { return nullptr; } return sm; } std::unique_ptr ShaderLibraryCreator::fromStringInput( const IDevice& device, const char* IGL_NONNULL librarySource, std::string vertexEntryPoint, std::string fragmentEntryPoint, std::string libraryDebugName, Result* IGL_NULLABLE outResult) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); Result localResult; Result* result = outResult ? outResult : &localResult; IGL_DEBUG_ASSERT(result); const auto libraryDesc = igl::ShaderLibraryDesc::fromStringInput( librarySource, { {igl::ShaderStage::Vertex, std::move(vertexEntryPoint)}, {igl::ShaderStage::Fragment, std::move(fragmentEntryPoint)}, }, std::move(libraryDebugName)); auto library = device.createShaderLibrary(libraryDesc, result); return (result && result->isOk()) ? std::move(library) : nullptr; } std::unique_ptr ShaderLibraryCreator::fromBinaryInput( const IDevice& device, const void* IGL_NONNULL libraryData, size_t libraryDataLength, std::string vertexEntryPoint, std::string fragmentEntryPoint, std::string libraryDebugName, Result* IGL_NULLABLE outResult) { Result localResult; Result* result = outResult ? outResult : &localResult; IGL_DEBUG_ASSERT(result); const auto libraryDesc = igl::ShaderLibraryDesc::fromBinaryInput( libraryData, libraryDataLength, { {igl::ShaderStage::Vertex, std::move(vertexEntryPoint)}, {igl::ShaderStage::Fragment, std::move(fragmentEntryPoint)}, }, std::move(libraryDebugName)); auto library = device.createShaderLibrary(libraryDesc, result); return (result && result->isOk()) ? std::move(library) : nullptr; } std::unique_ptr ShaderLibraryCreator::fromStringInput( const IDevice& device, const char* IGL_NONNULL librarySource, std::vector moduleInfo, std::string libraryDebugName, Result* IGL_NULLABLE outResult) { Result localResult; Result* result = outResult ? outResult : &localResult; IGL_DEBUG_ASSERT(result); const auto libraryDesc = igl::ShaderLibraryDesc::fromStringInput( librarySource, std::move(moduleInfo), std::move(libraryDebugName)); auto library = device.createShaderLibrary(libraryDesc, result); return (result && result->isOk()) ? std::move(library) : nullptr; } std::unique_ptr ShaderLibraryCreator::fromBinaryInput( const IDevice& device, const void* IGL_NONNULL libraryData, size_t libraryDataLength, std::vector moduleInfo, std::string libraryDebugName, Result* IGL_NULLABLE outResult) { Result localResult; Result* result = outResult ? outResult : &localResult; IGL_DEBUG_ASSERT(result); const auto libraryDesc = igl::ShaderLibraryDesc::fromBinaryInput( libraryData, libraryDataLength, std::move(moduleInfo), std::move(libraryDebugName)); auto library = device.createShaderLibrary(libraryDesc, result); return (result && result->isOk()) ? std::move(library) : nullptr; } std::unique_ptr ShaderStagesCreator::fromModuleStringInput( const IDevice& device, const char* IGL_NONNULL vertexSource, std::string vertexEntryPoint, std::string vertexDebugName, const char* IGL_NONNULL fragmentSource, std::string fragmentEntryPoint, std::string fragmentDebugName, Result* IGL_NULLABLE outResult) { Result localResult; Result* result = outResult ? outResult : &localResult; IGL_DEBUG_ASSERT(result); std::shared_ptr vertexModule, fragmentModule; vertexModule = ShaderModuleCreator::fromStringInput(device, vertexSource, {ShaderStage::Vertex, std::move(vertexEntryPoint)}, std::move(vertexDebugName), result); if (result->isOk()) { fragmentModule = ShaderModuleCreator::fromStringInput(device, fragmentSource, {ShaderStage::Fragment, std::move(fragmentEntryPoint)}, std::move(fragmentDebugName), result); } return (result && result->isOk()) ? fromRenderModules(device, std::move(vertexModule), std::move(fragmentModule), result) : nullptr; } std::unique_ptr ShaderStagesCreator::fromModuleBinaryInput( const IDevice& device, const void* IGL_NONNULL vertexData, size_t vertexDataLength, std::string vertexEntryPoint, std::string vertexDebugName, const void* IGL_NONNULL fragmentData, size_t fragmentDataLength, std::string fragmentEntryPoint, std::string fragmentDebugName, Result* IGL_NULLABLE outResult) { Result localResult; Result* result = outResult ? outResult : &localResult; IGL_DEBUG_ASSERT(result); std::shared_ptr vertexModule, fragmentModule; vertexModule = ShaderModuleCreator::fromBinaryInput(device, vertexData, vertexDataLength, {ShaderStage::Vertex, std::move(vertexEntryPoint)}, std::move(vertexDebugName), result); if (result->isOk()) { fragmentModule = ShaderModuleCreator::fromBinaryInput(device, fragmentData, fragmentDataLength, {ShaderStage::Fragment, std::move(fragmentEntryPoint)}, std::move(fragmentDebugName), result); } return (result && result->isOk()) ? fromRenderModules(device, std::move(vertexModule), std::move(fragmentModule), result) : nullptr; } std::unique_ptr ShaderStagesCreator::fromLibraryStringInput( const IDevice& device, const char* IGL_NONNULL librarySource, std::string vertexEntryPoint, std::string fragmentEntryPoint, std::string libraryDebugName, Result* IGL_NULLABLE outResult) { const auto libraryDesc = ShaderLibraryDesc::fromStringInput(librarySource, { {ShaderStage::Vertex, std::move(vertexEntryPoint)}, {ShaderStage::Fragment, std::move(fragmentEntryPoint)}, }, std::move(libraryDebugName)); return fromLibraryDesc(device, libraryDesc, outResult); } std::unique_ptr ShaderStagesCreator::fromLibraryBinaryInput( const IDevice& device, const void* IGL_NONNULL libraryData, size_t libraryDataLength, std::string vertexEntryPoint, std::string fragmentEntryPoint, std::string libraryDebugName, Result* IGL_NULLABLE outResult) { const auto libraryDesc = ShaderLibraryDesc::fromBinaryInput(libraryData, libraryDataLength, { {ShaderStage::Vertex, std::move(vertexEntryPoint)}, {ShaderStage::Fragment, std::move(fragmentEntryPoint)}, }, std::move(libraryDebugName)); return fromLibraryDesc(device, libraryDesc, outResult); } std::unique_ptr ShaderStagesCreator::fromModuleStringInput( const IDevice& device, const char* IGL_NONNULL computeSource, std::string computeEntryPoint, std::string computeDebugName, Result* IGL_NULLABLE outResult) { Result localResult; Result* result = outResult ? outResult : &localResult; IGL_DEBUG_ASSERT(result); auto computeModule = ShaderModuleCreator::fromStringInput(device, computeSource, {ShaderStage::Compute, std::move(computeEntryPoint)}, std::move(computeDebugName), result); return (result && result->isOk()) ? fromComputeModule(device, std::move(computeModule), result) : nullptr; } std::unique_ptr ShaderStagesCreator::fromModuleBinaryInput( const IDevice& device, const void* IGL_NONNULL computeData, size_t computeDataLength, std::string computeEntryPoint, std::string computeDebugName, Result* IGL_NULLABLE outResult) { Result localResult; Result* result = outResult ? outResult : &localResult; IGL_DEBUG_ASSERT(result); auto computeModule = ShaderModuleCreator::fromBinaryInput(device, computeData, computeDataLength, {ShaderStage::Compute, std::move(computeEntryPoint)}, std::move(computeDebugName), result); return (result && result->isOk()) ? fromComputeModule(device, std::move(computeModule), result) : nullptr; } std::unique_ptr ShaderStagesCreator::fromRenderModules( const IDevice& device, std::shared_ptr vertexModule, std::shared_ptr fragmentModule, Result* IGL_NULLABLE outResult) { const auto desc = ShaderStagesDesc::fromRenderModules(std::move(vertexModule), std::move(fragmentModule)); return device.createShaderStages(desc, outResult); } std::unique_ptr ShaderStagesCreator::fromComputeModule( const IDevice& device, std::shared_ptr computeModule, Result* IGL_NULLABLE outResult) { const auto desc = ShaderStagesDesc::fromComputeModule(std::move(computeModule)); return device.createShaderStages(desc, outResult); } std::unique_ptr ShaderStagesCreator::fromMeshRenderModules( const IDevice& device, std::shared_ptr taskModule, std::shared_ptr meshModule, std::shared_ptr fragmentModule, Result* IGL_NULLABLE outResult) { const auto desc = ShaderStagesDesc::fromMeshRenderModules( std::move(taskModule), std::move(meshModule), std::move(fragmentModule)); return device.createShaderStages(desc, outResult); } namespace { std::unique_ptr fromLibraryDesc(const IDevice& device, const ShaderLibraryDesc& libraryDesc, Result* IGL_NULLABLE outResult) { Result localResult; Result* result = outResult ? outResult : &localResult; IGL_DEBUG_ASSERT(result); if (!IGL_DEBUG_VERIFY(libraryDesc.moduleInfo.size() == 2)) { Result::setResult(result, Result::Code::ArgumentInvalid, "Library descriptor must contain 2 module info entries"); return nullptr; } auto library = device.createShaderLibrary(libraryDesc, result); if (result && !result->isOk()) { return nullptr; } auto vertexModule = library->getShaderModule(libraryDesc.moduleInfo[0].entryPoint); if (vertexModule == nullptr) { Result::setResult( result, Result::Code::ArgumentInvalid, "Could not retrieve vertex module from library"); return nullptr; } auto fragmentModule = library->getShaderModule(libraryDesc.moduleInfo[1].entryPoint); if (fragmentModule == nullptr) { Result::setResult( result, Result::Code::ArgumentInvalid, "Could not retrieve fragment module from library"); return nullptr; } return ShaderStagesCreator::fromRenderModules( device, std::move(vertexModule), std::move(fragmentModule), result); } } // namespace } // namespace igl ================================================ FILE: src/igl/ShaderCreator.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl { class IDevice; /** * @brief Helper class simplifying the creation of IShaderModules in common scenarios. */ class ShaderModuleCreator { public: ShaderModuleCreator() = delete; /** * @brief Constructs an IShaderModule for a shader from source code. * @param device The device to construct the shader module with. * @param source Null-terminated string containing shader source code. * @param info Shader module metadata. * @param debugName Debug name for the shader module. * @param outResult Optional param to receive success or error information. */ static std::shared_ptr fromStringInput(const IDevice& device, const char* IGL_NONNULL source, ShaderModuleInfo info, std::string debugName, Result* IGL_NULLABLE outResult); /** * @brief Constructs an IShaderModule for a shader from binary data. * @param device The device to construct the shader module with. * @param data Pre-compiled shader binary data. * @param dataLength Length in bytes of the precompiled shader binary data. * @param info Shader module metadata. * @param debugName Debug name for the shader module. * @param outResult Optional param to receive success or error information. */ static std::shared_ptr fromBinaryInput(const IDevice& device, const void* IGL_NONNULL data, size_t dataLength, ShaderModuleInfo info, std::string debugName, Result* IGL_NULLABLE outResult); }; /** * @brief Helper class simplifying the creation of IShaderLibrary instances in common scenarios. */ class ShaderLibraryCreator { public: ShaderLibraryCreator() = delete; /** * @brief Constructs an IShaderLibrary with a vertex and fragment shader from source code. * @param device The device to construct the shader library with. * @param librarySource Null-terminated string containing shader source code. * @param vertexEntryPoint Vertex shader entry point name. * @param fragmentEntryPoint Fragment shader entry point name. * @param libraryDebugName Optional debug name for the library. * @param outResult Optional param to receive success or error information. */ static std::unique_ptr fromStringInput(const IDevice& device, const char* IGL_NONNULL librarySource, std::string vertexEntryPoint, std::string fragmentEntryPoint, std::string libraryDebugName, Result* IGL_NULLABLE outResult); /** * @brief Constructs an IShaderLibrary with a vertex and fragment shader from binary data. * @param device The device to construct the shader library with. * @param libraryData Pre-compiled shader binary data. * @param libraryDataLength Length in bytes of the precompiled shader binary data. * @param vertexEntryPoint Vertex shader entry point name. * @param fragmentEntryPoint Fragment shader entry point name. * @param libraryDebugName Optional debug name for the library. * @param outResult Optional param to receive success or error information. */ static std::unique_ptr fromBinaryInput(const IDevice& device, const void* IGL_NONNULL libraryData, size_t libraryDataLength, std::string vertexEntryPoint, std::string fragmentEntryPoint, std::string libraryDebugName, Result* IGL_NULLABLE outResult); /** * @brief Constructs an IShaderLibrary with shaders from source code. * @param device The device to construct the shader library with. * @param librarySource Null-terminated string containing shader source code. * @param moduleInfo Vector of metadata for shader modules in the library. * @param libraryDebugName Optional debug name for the library. * @param outResult Optional param to receive success or error information. */ static std::unique_ptr fromStringInput(const IDevice& device, const char* IGL_NONNULL librarySource, std::vector moduleInfo, std::string libraryDebugName, Result* IGL_NULLABLE outResult); /** * @brief Constructs an IShaderLibrary with shaders from binary data. * @param device The device to construct the shader library with. * @param libraryData Pre-compiled shader binary data. * @param libraryDataLength Length in bytes of the precompiled shader binary data. * @param moduleInfo Vector of metadata for shader modules in the library. * @param libraryDebugName Optional debug name for the library. * @param outResult Optional param to receive success or error information. */ static std::unique_ptr fromBinaryInput(const IDevice& device, const void* IGL_NONNULL libraryData, size_t libraryDataLength, std::vector moduleInfo, std::string libraryDebugName, Result* IGL_NULLABLE outResult); }; /** * @brief Helper class simplifying the creation of IShaderStages in common scenarios. */ class ShaderStagesCreator { public: ShaderStagesCreator() = delete; /** * @brief Constructs IShaderStages for a vertex and fragment shader from module source code. * @param device The device to construct the shader stages with. * @param vertexSource Null-terminated string containing vertex shader source code. * @param vertexEntryPoint Vertex shader entry point name. * @param vertexDebugName Debug name for vertex shader module. * @param fragmentSource Null-terminated string containing fragment shader source code. * @param fragmentEntryPoint Fragment shader entry point name. * @param fragmentDebugName Debug name for fragment shader module. * @param outResult Optional param to receive success or error information. */ static std::unique_ptr fromModuleStringInput(const IDevice& device, const char* IGL_NONNULL vertexSource, std::string vertexEntryPoint, std::string vertexDebugName, const char* IGL_NONNULL fragmentSource, std::string fragmentEntryPoint, std::string fragmentDebugName, Result* IGL_NULLABLE outResult); /** * @brief Constructs IShaderStages for a vertex and fragment shader from module binary code. * @param device The device to construct the shader stages with. * @param vertexData Pre-compiled vertex shader binary data. * @param vertexDataLength Length in bytes of the precompiled vertex shader binary data. * @param vertexEntryPoint Vertex shader entry point name. * @param vertexDebugName Debug name for vertex shader module. * @param fragmentData Pre-compiled fragment shader binary data. * @param fragmentDataLength Length in bytes of the precompiled fragment shader binary data. * @param fragmentEntryPoint Fragment shader entry point name. * @param fragmentDebugName Debug name for fragment shader module. * @param outResult Optional param to receive success or error information. */ static std::unique_ptr fromModuleBinaryInput(const IDevice& device, const void* IGL_NONNULL vertexData, size_t vertexDataLength, std::string vertexEntryPoint, std::string vertexDebugName, const void* IGL_NONNULL fragmentData, size_t fragmentDataLength, std::string fragmentEntryPoint, std::string fragmentDebugName, Result* IGL_NULLABLE outResult); /** * @brief Constructs IShaderStages with a vertex and fragment shader from library source code. * @param device The device to construct the shader stages with. * @param librarySource Null-terminated string containing shader source code. * @param vertexEntryPoint Vertex shader entry point name. * @param fragmentEntryPoint Fragment shader entry point name. * @param libraryDebugName Optional debug name for the library. * @param outResult Optional param to receive success or error information. */ static std::unique_ptr fromLibraryStringInput(const IDevice& device, const char* IGL_NONNULL librarySource, std::string vertexEntryPoint, std::string fragmentEntryPoint, std::string libraryDebugName, Result* IGL_NULLABLE outResult); /** * @brief Constructs IShaderStages with a vertex and fragment shader from library binary data. * @param device The device to construct the shader stages with. * @param libraryData Pre-compiled shader binary data. * @param libraryDataLength Length in bytes of the precompiled shader binary data. * @param vertexEntryPoint Vertex shader entry point name. * @param fragmentEntryPoint Fragment shader entry point name. * @param libraryDebugName Optional debug name for the library. * @param outResult Optional param to receive success or error information. */ static std::unique_ptr fromLibraryBinaryInput(const IDevice& device, const void* IGL_NONNULL libraryData, size_t libraryDataLength, std::string vertexEntryPoint, std::string fragmentEntryPoint, std::string libraryDebugName, Result* IGL_NULLABLE outResult); /** * @brief Constructs IShaderStages for a compute shader from module source code. * @param device The device to construct the shader stages with. * @param computeSource Null-terminated string containing vcompute shader source code. * @param computeEntryPoint Compute shader entry point name. * @param computeDebugName Debug name for compute shader module. * @param outResult Optional param to receive success or error information. */ static std::unique_ptr fromModuleStringInput(const IDevice& device, const char* IGL_NONNULL computeSource, std::string computeEntryPoint, std::string computeDebugName, Result* IGL_NULLABLE outResult); /** * @brief Constructs IShaderStages for a compute shader from module binary code. * @param device The device to construct the shader stages with. * @param computeData Pre-compiled compute shader binary data. * @param computeDataLength Length in bytes of the precompiled compute shader binary data. * @param computeEntryPoint Compute shader entry point name. * @param computeDebugName Debug name for compute shader module. * @param outResult Optional param to receive success or error information. */ static std::unique_ptr fromModuleBinaryInput(const IDevice& device, const void* IGL_NONNULL computeData, size_t computeDataLength, std::string computeEntryPoint, std::string computeDebugName, Result* IGL_NULLABLE outResult); /** * @brief Constructs an IShaderStages with a vertex and fragment shader. * @param device The device to construct the shader stages with. * @param vertexModule The vertex shader module. * @param fragmentModule The vertex shader module. * @param outResult Optional param to receive success or error information. */ static std::unique_ptr fromRenderModules( const IDevice& device, std::shared_ptr vertexModule, std::shared_ptr fragmentModule, Result* IGL_NULLABLE outResult); /** * @brief Constructs IShaderStages with a compute shader. * @param device The device to construct the shader stages with. * @param computeModule The compute shader module. * @param outResult Optional param to receive success or error information. */ static std::unique_ptr fromComputeModule( const IDevice& device, std::shared_ptr computeModule, Result* IGL_NULLABLE outResult); static std::unique_ptr fromMeshRenderModules( const IDevice& device, std::shared_ptr taskModule, std::shared_ptr meshModule, std::shared_ptr fragmentModule, Result* IGL_NULLABLE outResult); }; } // namespace igl ================================================ FILE: src/igl/Texture.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include size_t std::hash::operator()(const igl::TextureFormat& key) const { return std::hash()(static_cast(key)); } namespace igl { TextureRangeDesc TextureRangeDesc::new1D(uint32_t x, uint32_t width, uint32_t mipLevel, uint32_t numMipLevels) { return new3D(x, 0, 0, width, 1, 1, mipLevel, numMipLevels); } TextureRangeDesc TextureRangeDesc::new1DArray(uint32_t x, uint32_t width, uint32_t layer, uint32_t numLayers, uint32_t mipLevel, uint32_t numMipLevels) { return new2DArray(x, 0, width, 1, layer, numLayers, mipLevel, numMipLevels); } TextureRangeDesc TextureRangeDesc::new2D(uint32_t x, uint32_t y, uint32_t width, uint32_t height, uint32_t mipLevel, uint32_t numMipLevels) { return new3D(x, y, 0, width, height, 1, mipLevel, numMipLevels); } TextureRangeDesc TextureRangeDesc::new2DArray(uint32_t x, uint32_t y, uint32_t width, uint32_t height, uint32_t layer, uint32_t numLayers, uint32_t mipLevel, uint32_t numMipLevels) { auto desc = new3D(x, y, 0, width, height, 1, mipLevel, numMipLevels); desc.layer = layer; desc.numLayers = numLayers; return desc; } TextureRangeDesc TextureRangeDesc::new3D(uint32_t x, uint32_t y, uint32_t z, uint32_t width, uint32_t height, uint32_t depth, uint32_t mipLevel, uint32_t numMipLevels) { TextureRangeDesc desc; desc.x = x; desc.y = y; desc.z = z; desc.width = width; desc.height = height; desc.depth = depth; desc.mipLevel = mipLevel; desc.numMipLevels = numMipLevels; return desc; } TextureRangeDesc TextureRangeDesc::newCube(uint32_t x, uint32_t y, uint32_t width, uint32_t height, uint32_t mipLevel, uint32_t numMipLevels) { auto desc = new3D(x, y, 0, width, height, 1, mipLevel, numMipLevels); desc.numFaces = 6; return desc; } TextureRangeDesc TextureRangeDesc::newCubeFace(uint32_t x, uint32_t y, uint32_t width, uint32_t height, uint32_t face, uint32_t mipLevel, uint32_t numMipLevels) { auto desc = new3D(x, y, 0, width, height, 1, mipLevel, numMipLevels); desc.numFaces = 1; desc.face = face; return desc; } TextureRangeDesc TextureRangeDesc::newCubeFace(uint32_t x, uint32_t y, uint32_t width, uint32_t height, TextureCubeFace face, uint32_t mipLevel, uint32_t numMipLevels) { return newCubeFace(x, y, width, height, static_cast(face), mipLevel, numMipLevels); } TextureRangeDesc TextureRangeDesc::atMipLevel(uint32_t newMipLevel) const noexcept { TextureRangeDesc newRange = *this; newRange.numMipLevels = 1; newRange.mipLevel = newMipLevel; if (IGL_DEBUG_VERIFY_NOT(newMipLevel < mipLevel) || newMipLevel == mipLevel) { return newRange; } const auto delta = newMipLevel - mipLevel; newRange.x = x >> delta; newRange.y = y >> delta; newRange.z = z >> delta; newRange.width = std::max(width >> delta, 1u); newRange.height = std::max(height >> delta, 1u); newRange.depth = std::max(depth >> delta, 1u); newRange.numMipLevels = 1; return newRange; } TextureRangeDesc TextureRangeDesc::withNumMipLevels(uint32_t newNumMipLevels) const noexcept { TextureRangeDesc newRange = *this; newRange.numMipLevels = newNumMipLevels; return newRange; } TextureRangeDesc TextureRangeDesc::atLayer(uint32_t newLayer) const noexcept { TextureRangeDesc newRange = *this; newRange.layer = newLayer; newRange.numLayers = 1; return newRange; } TextureRangeDesc TextureRangeDesc::withNumLayers(uint32_t newNumLayers) const noexcept { TextureRangeDesc newRange = *this; newRange.numLayers = newNumLayers; return newRange; } TextureRangeDesc TextureRangeDesc::atFace(uint32_t newFace) const noexcept { TextureRangeDesc newRange = *this; newRange.face = newFace; newRange.numFaces = 1; return newRange; } TextureRangeDesc TextureRangeDesc::atFace(TextureCubeFace newFace) const noexcept { return atFace(static_cast(newFace)); } TextureRangeDesc TextureRangeDesc::withNumFaces(uint32_t newNumFaces) const noexcept { TextureRangeDesc newRange = *this; newRange.numFaces = newNumFaces; return newRange; } Result TextureRangeDesc::validate() const noexcept { if (IGL_DEBUG_VERIFY_NOT(width == 0 || height == 0 || depth == 0 || numLayers == 0 || numMipLevels == 0 || numFaces == 0)) { return Result{ Result::Code::ArgumentInvalid, "width, height, depth, numLayers, numMipLevels, and numFaces must be at least 1."}; } const uint32_t maxMipLevels = TextureDesc::calcNumMipLevels(width, height, depth); if (IGL_DEBUG_VERIFY_NOT(numMipLevels > maxMipLevels)) { return Result{Result::Code::ArgumentInvalid, "`numMipLevels` must not exceed max mip levels for width, height and depth."}; } if (IGL_DEBUG_VERIFY_NOT(face > 5 || numFaces > 6)) { return Result{Result::Code::ArgumentInvalid, "`face` must be less than 6 and `numFaces` must not exceed 6."}; } constexpr uint32_t kMax = std::numeric_limits::max(); if (IGL_DEBUG_VERIFY_NOT( static_cast(mipLevel) > kMax || static_cast(x) + width > kMax || static_cast(y) + height > kMax || static_cast(z) + depth > kMax || static_cast(layer) + numLayers > kMax)) { return Result{ Result::Code::ArgumentInvalid, "mipLevel, x + width, y + height, z + depth, and layer + numLayers must all not exceed " "std::numeric_limits::max()."}; }; size_t product = (static_cast(x) + width) * (static_cast(y) + height); if (product <= kMax) { product *= z + depth; if (product <= kMax) { product *= layer + numLayers; if (product <= kMax) { product *= numFaces; } } } if (product > std::numeric_limits::max()) { return Result{Result::Code::ArgumentInvalid, "(x + width) * (y + height) * (z + depth) * (layer + numLayers) * numFaces must " "not exceed std::numeric_limits::max()."}; }; return Result{}; } #define PROPERTIES(fmt, cpp, bpb, bw, bh, bd, mbx, mby, mbz, flgs, planes) \ case TextureFormat::fmt: \ return TextureFormatProperties{IGL_TO_STRING(fmt), \ TextureFormat::fmt, \ cpp, \ bpb, \ bw, \ bh, \ bd, \ mbx, \ mby, \ mbz, \ planes, \ flgs}; #define INVALID(fmt) PROPERTIES(fmt, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0) #define COLOR(fmt, cpp, bpb, flgs) PROPERTIES(fmt, cpp, bpb, 1, 1, 1, 1, 1, 1, flgs, 1) #define COMPRESSED(fmt, cpp, bpb, bw, bh, bd, mbx, mby, mbz, flgs) \ PROPERTIES(fmt, cpp, bpb, bw, bh, bd, mbx, mby, mbz, flgs | Flags::Compressed, 1) #define DEPTH(fmt, cpp, bpb) PROPERTIES(fmt, cpp, bpb, 1, 1, 1, 1, 1, 1, Flags::Depth, 1) #define DEPTH_STENCIL(fmt, cpp, bpb) \ PROPERTIES(fmt, cpp, bpb, 1, 1, 1, 1, 1, 1, Flags::Depth | Flags::Stencil, 1) #define STENCIL(fmt, cpp, bpb) \ PROPERTIES(fmt, cpp, bpb, 1, 1, 1, 1, 1, 1, Flags::Stencil | Flags::Integer, 1) #define MULTIPLANAR(fmt, cpp, bpb, planes) \ PROPERTIES(fmt, cpp, 0, 1, 1, 1, 1, 1, 1, Flags::Compressed, planes) TextureFormatProperties TextureFormatProperties::fromTextureFormat(TextureFormat format) { switch (format) { // NOLINTBEGIN(readability-identifier-naming) INVALID(Invalid) COLOR(A_UNorm8, 1, 1, 0) COLOR(L_UNorm8, 1, 1, 0) COLOR(R_UNorm8, 1, 1, 0) COLOR(R_F16, 1, 2, Flags::HDR) COLOR(R_UInt16, 1, 2, Flags::Integer | Flags::HDR) COLOR(R_UNorm16, 1, 2, Flags::HDR) COLOR(B5G5R5A1_UNorm, 4, 2, 0) COLOR(B5G6R5_UNorm, 3, 2, 0) COLOR(ABGR_UNorm4, 4, 2, 0) COLOR(LA_UNorm8, 2, 2, 0) COLOR(RG_UNorm8, 2, 2, 0) COLOR(R4G2B2_UNorm_Apple, 3, 2, 0) COLOR(R4G2B2_UNorm_Rev_Apple, 3, 2, 0) COLOR(R5G5B5A1_UNorm, 4, 2, 0) COLOR(RGBX_UNorm8, 3, 4, 0) COLOR(RGBA_UNorm8, 4, 4, 0) COLOR(BGRA_UNorm8, 4, 4, 0) COLOR(BGRA_UNorm8_Rev, 4, 4, 0) COLOR(RGBA_SRGB, 4, 4, Flags::sRGB) COLOR(BGRA_SRGB, 4, 4, Flags::sRGB) COLOR(RG_F16, 2, 4, Flags::HDR) COLOR(RG_UInt16, 2, 4, Flags::Integer | Flags::HDR) COLOR(RG_UNorm16, 2, 4, Flags::HDR) COLOR(RGB10_A2_UNorm_Rev, 4, 4, Flags::HDR) COLOR(RGB10_A2_Uint_Rev, 4, 4, Flags::Integer | Flags::HDR) COLOR(BGR10_A2_Unorm, 4, 4, Flags::HDR) COLOR(R_F32, 1, 4, Flags::HDR) COLOR(R_UInt32, 1, 4, Flags::Integer | Flags::HDR) COLOR(RGB_F16, 3, 6, Flags::HDR) COLOR(RGBA_UNorm16, 4, 8, Flags::HDR) COLOR(RGBA_F16, 4, 8, Flags::HDR) COLOR(RG_F32, 2, 8, Flags::HDR) COLOR(RGB_F32, 3, 12, Flags::HDR) COLOR(RGBA_UInt32, 4, 16, Flags::Integer | Flags::HDR) COLOR(RGBA_F32, 4, 16, Flags::HDR) COMPRESSED(RGBA_ASTC_4x4, 4, 16, 4, 4, 1, 1, 1, 1, 0) COMPRESSED(SRGB8_A8_ASTC_4x4, 4, 16, 4, 4, 1, 1, 1, 1, Flags::sRGB) COMPRESSED(RGBA_ASTC_5x4, 4, 16, 5, 4, 1, 1, 1, 1, 0) COMPRESSED(SRGB8_A8_ASTC_5x4, 4, 16, 5, 4, 1, 1, 1, 1, Flags::sRGB) COMPRESSED(RGBA_ASTC_5x5, 4, 16, 5, 5, 1, 1, 1, 1, 0) COMPRESSED(SRGB8_A8_ASTC_5x5, 4, 16, 5, 5, 1, 1, 1, 1, Flags::sRGB) COMPRESSED(RGBA_ASTC_6x5, 4, 16, 6, 5, 1, 1, 1, 1, 0) COMPRESSED(SRGB8_A8_ASTC_6x5, 4, 16, 6, 5, 1, 1, 1, 1, Flags::sRGB) COMPRESSED(RGBA_ASTC_6x6, 4, 16, 6, 6, 1, 1, 1, 1, 0) COMPRESSED(SRGB8_A8_ASTC_6x6, 4, 16, 6, 6, 1, 1, 1, 1, Flags::sRGB) COMPRESSED(RGBA_ASTC_8x5, 4, 16, 8, 5, 1, 1, 1, 1, 0) COMPRESSED(SRGB8_A8_ASTC_8x5, 4, 16, 8, 5, 1, 1, 1, 1, Flags::sRGB) COMPRESSED(RGBA_ASTC_8x6, 4, 16, 8, 6, 1, 1, 1, 1, 0) COMPRESSED(SRGB8_A8_ASTC_8x6, 4, 16, 8, 6, 1, 1, 1, 1, Flags::sRGB) COMPRESSED(RGBA_ASTC_8x8, 4, 16, 8, 8, 1, 1, 1, 1, 0) COMPRESSED(SRGB8_A8_ASTC_8x8, 4, 16, 8, 8, 1, 1, 1, 1, Flags::sRGB) COMPRESSED(RGBA_ASTC_10x5, 4, 16, 10, 5, 1, 1, 1, 1, 0) COMPRESSED(SRGB8_A8_ASTC_10x5, 4, 16, 10, 5, 1, 1, 1, 1, Flags::sRGB) COMPRESSED(RGBA_ASTC_10x6, 4, 16, 10, 6, 1, 1, 1, 1, 0) COMPRESSED(SRGB8_A8_ASTC_10x6, 4, 16, 10, 6, 1, 1, 1, 1, Flags::sRGB) COMPRESSED(RGBA_ASTC_10x8, 4, 16, 10, 8, 1, 1, 1, 1, 0) COMPRESSED(SRGB8_A8_ASTC_10x8, 4, 16, 10, 8, 1, 1, 1, 1, Flags::sRGB) COMPRESSED(RGBA_ASTC_10x10, 4, 16, 10, 10, 1, 1, 1, 1, 0) COMPRESSED(SRGB8_A8_ASTC_10x10, 4, 16, 10, 10, 1, 1, 1, 1, Flags::sRGB) COMPRESSED(RGBA_ASTC_12x10, 4, 16, 12, 10, 1, 1, 1, 1, 0) COMPRESSED(SRGB8_A8_ASTC_12x10, 4, 16, 12, 10, 1, 1, 1, 1, Flags::sRGB) COMPRESSED(RGBA_ASTC_12x12, 4, 16, 12, 12, 1, 1, 1, 1, 0) COMPRESSED(SRGB8_A8_ASTC_12x12, 4, 16, 12, 12, 1, 1, 1, 1, Flags::sRGB) COMPRESSED(RGBA_PVRTC_2BPPV1, 4, 8, 8, 4, 1, 2, 2, 1, 0) COMPRESSED(RGB_PVRTC_2BPPV1, 3, 8, 8, 4, 1, 2, 2, 1, 0) COMPRESSED(RGBA_PVRTC_4BPPV1, 4, 8, 4, 4, 1, 2, 2, 1, 0) COMPRESSED(RGB_PVRTC_4BPPV1, 3, 8, 4, 4, 1, 2, 2, 1, 0) COMPRESSED(RGB8_ETC1, 3, 8, 4, 4, 1, 1, 1, 1, 0) COMPRESSED(RGB8_ETC2, 3, 8, 4, 4, 1, 1, 1, 1, 0) COMPRESSED(SRGB8_ETC2, 3, 8, 4, 4, 1, 1, 1, 1, Flags::sRGB) COMPRESSED(RGB8_Punchthrough_A1_ETC2, 3, 8, 4, 4, 1, 1, 1, 1, 0) COMPRESSED(SRGB8_Punchthrough_A1_ETC2, 3, 8, 4, 4, 1, 1, 1, 1, Flags::sRGB) COMPRESSED(RGBA8_EAC_ETC2, 4, 16, 4, 4, 1, 1, 1, 1, 0) COMPRESSED(SRGB8_A8_EAC_ETC2, 4, 16, 4, 4, 1, 1, 1, 1, Flags::sRGB) COMPRESSED(RG_EAC_UNorm, 2, 16, 4, 4, 1, 1, 1, 1, 0) COMPRESSED(RG_EAC_SNorm, 2, 16, 4, 4, 1, 1, 1, 1, 0) COMPRESSED(R_EAC_UNorm, 1, 8, 4, 4, 1, 1, 1, 1, 0) COMPRESSED(R_EAC_SNorm, 1, 8, 4, 4, 1, 1, 1, 1, 0) COMPRESSED(RGBA_BC7_UNORM_4x4, 4, 16, 4, 4, 1, 1, 1, 1, 0) COMPRESSED(RGBA_BC7_SRGB_4x4, 4, 16, 4, 4, 1, 1, 1, 1, Flags::sRGB) // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only DEPTH(Z_UNorm16, 1, 2) DEPTH(Z_UNorm24, 1, 3) DEPTH(Z_UNorm32, 1, 4) DEPTH_STENCIL(S8_UInt_Z24_UNorm, 2, 4) #if IGL_PLATFORM_IOS DEPTH_STENCIL(S8_UInt_Z32_UNorm, 2, 5) #else DEPTH_STENCIL(S8_UInt_Z32_UNorm, 2, 8) #endif STENCIL(S_UInt8, 1, 1) MULTIPLANAR(YUV_NV12, 3, 16, 2) MULTIPLANAR(YUV_420p, 3, 16, 3) // NOLINTEND(readability-identifier-naming) } IGL_UNREACHABLE_RETURN(TextureFormatProperties{}) } uint32_t TextureFormatProperties::getRows(TextureRangeDesc range) const noexcept { if (range.numMipLevels == 1) { const uint32_t texHeight = std::max(range.height, 1u); uint32_t rows = texHeight; if (isCompressed() && !isVariableLength()) { rows = std::max((texHeight + blockHeight - 1) / blockHeight, static_cast(minBlocksY)); } return rows * range.depth * range.numFaces * range.numLayers; } else { uint32_t rows = 0; for (uint32_t mipLevel = range.mipLevel; mipLevel < range.mipLevel + range.numMipLevels; ++mipLevel) { rows += getRows(range.atMipLevel(mipLevel)); } return rows; } } uint32_t TextureFormatProperties::getBytesPerRow(uint32_t texWidth) const noexcept { return getBytesPerRow(TextureRangeDesc::new1D(0, texWidth)); } uint32_t TextureFormatProperties::getBytesPerRow(TextureRangeDesc range) const noexcept { const uint32_t texWidth = std::max(range.width, 1u); // For variable length formats, bytesPerRow is always 0 and the caller will handle it as needed. if (isVariableLength()) { return 0; } if (isCompressed()) { const uint32_t widthInBlocks = std::max((texWidth + blockWidth - 1) / blockWidth, static_cast(minBlocksX)); return widthInBlocks * bytesPerBlock; } else { return texWidth * bytesPerBlock; } } size_t TextureFormatProperties::getBytesPerLayer(uint32_t texWidth, uint32_t texHeight, uint32_t texDepth, uint32_t bytesPerRow) const noexcept { return getBytesPerLayer(TextureRangeDesc::new3D(0, 0, 0, texWidth, texHeight, texDepth), bytesPerRow); } size_t TextureFormatProperties::getBytesPerLayer(TextureRangeDesc range, uint32_t bytesPerRow) const noexcept { const uint32_t texWidth = std::max(range.width, 1u); const uint32_t texHeight = std::max(range.height, 1u); const uint32_t texDepth = std::max(range.depth, 1u); const size_t texFaces = std::max(range.numFaces, 1u); // For variable length formats, bytesPerRow is always 0 and the caller will handle it as needed. if (isVariableLength()) { return 0; } if (isCompressed()) { const uint32_t widthInBlocks = std::max((texWidth + blockWidth - 1) / blockWidth, static_cast(minBlocksX)); const uint32_t heightInBlocks = std::max((texHeight + blockHeight - 1) / blockHeight, static_cast(minBlocksY)); const uint32_t depthInBlocks = std::max((texDepth + blockDepth - 1) / blockDepth, static_cast(minBlocksZ)); const uint32_t widthBytes = std::max(bytesPerRow, widthInBlocks * bytesPerBlock); return texFaces * widthBytes * heightInBlocks * depthInBlocks; } else { const uint32_t widthBytes = std::max(bytesPerRow, texWidth * bytesPerBlock); return texFaces * widthBytes * texHeight * texDepth; } } size_t TextureFormatProperties::getBytesPerRange(TextureRangeDesc range, uint32_t bytesPerRow) const noexcept { IGL_DEBUG_ASSERT(range.x % blockWidth == 0); IGL_DEBUG_ASSERT(range.y % blockHeight == 0); IGL_DEBUG_ASSERT(range.z % blockDepth == 0); IGL_DEBUG_ASSERT(bytesPerRow == 0 || bytesPerRow == getBytesPerRow(range) || range.numMipLevels == 1); size_t bytes = 0; for (size_t i = 0; i < range.numMipLevels; ++i) { bytes += getBytesPerLayer(range.atMipLevel(range.mipLevel + i), bytesPerRow) * range.numLayers; } return bytes; } uint32_t TextureFormatProperties::getNumMipLevels(uint32_t width, uint32_t height, size_t totalBytes) const noexcept { const auto range = TextureRangeDesc::new2D(0, 0, width, height); size_t numMipLevels = 0; while (totalBytes) { const auto mipLevelBytes = getBytesPerRange(range.atMipLevel(numMipLevels)); if (mipLevelBytes > totalBytes) { break; } totalBytes -= mipLevelBytes; ++numMipLevels; } return numMipLevels; } size_t TextureFormatProperties::getSubRangeByteOffset(const TextureRangeDesc& range, const TextureRangeDesc& subRange, uint32_t bytesPerRow) const noexcept { // Ensure subRange's layer, face and mipLevel range is a subset of range's. IGL_DEBUG_ASSERT(subRange.layer >= range.layer && (subRange.layer + subRange.numLayers) <= (range.layer + range.numLayers)); IGL_DEBUG_ASSERT(subRange.face >= range.face && (subRange.face + subRange.numFaces) <= (range.face + range.numFaces)); IGL_DEBUG_ASSERT(subRange.mipLevel >= range.mipLevel && (subRange.mipLevel + subRange.numMipLevels) <= (range.mipLevel + range.numMipLevels)); // Ensure subRange's dimensions are equal to the full dimensions of range's at subRange's first // mip level. IGL_DEBUG_ASSERT(subRange.x == range.atMipLevel(subRange.mipLevel).x && subRange.width == range.atMipLevel(subRange.mipLevel).width); IGL_DEBUG_ASSERT(subRange.y == range.atMipLevel(subRange.mipLevel).y && subRange.height == range.atMipLevel(subRange.mipLevel).height); IGL_DEBUG_ASSERT(subRange.z == range.atMipLevel(subRange.mipLevel).z && subRange.depth == range.atMipLevel(subRange.mipLevel).depth); // Ensure bytes per row is either 0 OR subrange covers only the base mip level of range. IGL_DEBUG_ASSERT(bytesPerRow == 0 || (subRange.mipLevel == range.mipLevel && subRange.numMipLevels == 1) || bytesPerRow == getBytesPerRow(subRange)); size_t offset = 0; auto workingRange = range; if (subRange.mipLevel > workingRange.mipLevel) { offset += getBytesPerRange( workingRange.withNumMipLevels(subRange.mipLevel - workingRange.mipLevel), bytesPerRow); } workingRange = workingRange.atMipLevel(subRange.mipLevel); if (subRange.layer > workingRange.layer) { offset += getBytesPerRange(workingRange.withNumLayers(subRange.layer - workingRange.layer), bytesPerRow); } workingRange = workingRange.atLayer(subRange.layer); if (subRange.face > workingRange.face) { offset += getBytesPerRange(workingRange.withNumFaces(subRange.face - workingRange.face), bytesPerRow); } return offset; } TextureRangeDesc TextureDesc::asRange() const noexcept { TextureRangeDesc range; range.width = width; range.height = height; range.depth = depth; range.numFaces = type == igl::TextureType::Cube ? 6u : 1u; range.numLayers = numLayers; range.numMipLevels = numMipLevels; return range; } bool TextureDesc::operator==(const TextureDesc& rhs) const { return (type == rhs.type) && (format == rhs.format) && (width == rhs.width) && (height == rhs.height) && (depth == rhs.depth) && (numLayers == rhs.numLayers) && (numSamples == rhs.numSamples) && (usage == rhs.usage) && (numMipLevels == rhs.numMipLevels) && (storage == rhs.storage) && (debugName == rhs.debugName); } bool TextureDesc::operator!=(const TextureDesc& rhs) const { return !operator==(rhs); } float ITexture::getAspectRatio() const { const auto dimensions = getDimensions(); return static_cast(dimensions.width) / static_cast(dimensions.height); } Size ITexture::getSize() const { const auto dimensions = getDimensions(); return Size{static_cast(dimensions.width), static_cast(dimensions.height)}; } uint32_t ITexture::getDepth() const { return getDimensions().depth; } uint32_t ITexture::getNumFaces() const { return getType() == TextureType::Cube ? 6u : 1u; } size_t ITexture::getEstimatedSizeInBytes() const { const auto range = getFullMipRange(); return properties_.getBytesPerRange(range); } Result ITexture::validateRange(const igl::TextureRangeDesc& range) const noexcept { auto result = range.validate(); if (!result.isOk()) { return result; } const auto dimensions = getDimensions(); const size_t texMipLevels = getNumMipLevels(); const size_t levelWidth = std::max(dimensions.width >> range.mipLevel, 1u); const size_t levelHeight = std::max(dimensions.height >> range.mipLevel, 1u); const size_t levelDepth = std::max(dimensions.depth >> range.mipLevel, 1u); const size_t texLayers = getNumLayers(); const size_t texFaces = getNumFaces(); if (range.width > levelWidth || range.height > levelHeight || range.depth > levelDepth || range.numLayers > texLayers || range.numMipLevels > texMipLevels || range.numFaces > texFaces) { return Result{Result::Code::ArgumentOutOfRange, "range dimensions exceed texture dimensions"}; } if (range.x > levelWidth - range.width || range.y > levelHeight - range.height || range.z > levelDepth - range.depth || range.layer > texLayers - range.numLayers || range.mipLevel > texMipLevels - range.numMipLevels || range.face > texFaces - range.numFaces) { return Result{Result::Code::ArgumentOutOfRange, "range dimensions exceed texture dimensions"}; } return Result{}; } TextureRangeDesc ITexture::getFullRange(size_t mipLevel, size_t numMipLevels) const noexcept { const auto dimensions = getDimensions(); const auto texWidth = std::max(dimensions.width >> mipLevel, 1u); const auto texHeight = std::max(dimensions.height >> mipLevel, 1u); const auto texDepth = std::max(dimensions.depth >> mipLevel, 1u); auto desc = TextureRangeDesc::new3D(0, 0, 0, texWidth, texHeight, texDepth, mipLevel); desc.face = 0; desc.numLayers = getNumLayers(); desc.numMipLevels = numMipLevels; desc.numFaces = getNumFaces(); return desc; } TextureRangeDesc ITexture::getFullMipRange() const noexcept { return getFullRange(0, getNumMipLevels()); } TextureRangeDesc ITexture::getCubeFaceRange(size_t face, size_t mipLevel, size_t numMipLevels) const noexcept { IGL_DEBUG_ASSERT(getType() == TextureType::Cube); return getFullRange(mipLevel, numMipLevels).atFace(face); } TextureRangeDesc ITexture::getCubeFaceRange(TextureCubeFace face, size_t mipLevel, size_t numMipLevels) const noexcept { IGL_DEBUG_ASSERT(getType() == TextureType::Cube); return getCubeFaceRange(static_cast(face), mipLevel, numMipLevels); } TextureRangeDesc ITexture::getLayerRange(size_t layer, size_t mipLevel, size_t numMipLevels) const noexcept { IGL_DEBUG_ASSERT(getType() == TextureType::TwoDArray); return getFullRange(mipLevel, numMipLevels).atLayer(layer); } void ITexture::repackData(const TextureFormatProperties& properties, const TextureRangeDesc& range, const uint8_t* IGL_NONNULL originalData, size_t originalDataBytesPerRow, uint8_t* IGL_NONNULL repackedData, size_t repackedBytesPerRow, bool flipVertical) { if (IGL_DEBUG_VERIFY_NOT(originalData == nullptr || repackedData == nullptr)) { return; } if (IGL_DEBUG_VERIFY_NOT(range.numMipLevels > 1 && (originalDataBytesPerRow > 0 || repackedBytesPerRow > 0))) { return; } const auto fullRangeBytesPerRow = properties.getBytesPerRow(range); if (originalDataBytesPerRow > 0 && IGL_DEBUG_VERIFY_NOT(originalDataBytesPerRow < fullRangeBytesPerRow)) { return; } if (repackedBytesPerRow > 0 && IGL_DEBUG_VERIFY_NOT(repackedBytesPerRow < fullRangeBytesPerRow)) { return; } for (size_t mipLevel = range.mipLevel; mipLevel < range.mipLevel + range.numMipLevels; ++mipLevel) { const auto mipRange = range.atMipLevel(mipLevel); const auto rangeBytesPerRow = properties.getBytesPerRow(mipRange); const auto originalDataIncrement = originalDataBytesPerRow == 0 ? rangeBytesPerRow : originalDataBytesPerRow; const auto repackedDataIncrement = repackedBytesPerRow == 0 ? rangeBytesPerRow : repackedBytesPerRow; const auto totalNumLayers = mipRange.numLayers * mipRange.numFaces * mipRange.depth; for (size_t layer = 0; layer < totalNumLayers; ++layer) { uint8_t* repackedDataPtr = repackedData; const std::ptrdiff_t increment = flipVertical ? -repackedDataIncrement : repackedDataIncrement; // Start at the end if (flipVertical) { repackedDataPtr += repackedDataIncrement * (mipRange.height - 1); } for (size_t y = 0; y < mipRange.height; ++y) { checked_memcpy_robust(repackedDataPtr, repackedDataIncrement, originalData, originalDataIncrement, rangeBytesPerRow); repackedDataPtr += increment; originalData += originalDataIncrement; } repackedData += repackedDataIncrement * mipRange.height; } } } const void* IGL_NULLABLE ITexture::getSubRangeStart(const void* IGL_NONNULL data, const TextureRangeDesc& range, const TextureRangeDesc& subRange, size_t bytesPerRow) const noexcept { const auto offset = properties_.getSubRangeByteOffset(range, subRange, bytesPerRow); return static_cast(data) + offset; } Result ITexture::upload(const TextureRangeDesc& range, const void* IGL_NULLABLE data, size_t bytesPerRow, const uint32_t* IGL_NULLABLE mipLevelBytes) const { if (IGL_DEBUG_VERIFY_NOT(!supportsUpload())) { return Result{Result::Code::InvalidOperation, "Texture doesn't support upload"}; } const auto type = getType(); auto result = validateRange(range); if (!result.isOk()) { return result; } if (IGL_DEBUG_VERIFY_NOT(type != TextureType::TwoD && type != TextureType::TwoDArray && type != TextureType::Cube && type != TextureType::ThreeD)) { return Result{Result::Code::InvalidOperation, "Unknown texture type"}; } if (IGL_DEBUG_VERIFY_NOT(range.face > 0 && type != TextureType::Cube)) { return Result(Result::Code::Unsupported, "face must be 0."); } const auto formatBytesPerRow = properties_.getBytesPerRow(range); if (bytesPerRow > 0) { if (IGL_DEBUG_VERIFY_NOT(bytesPerRow < formatBytesPerRow)) { return Result(Result::Code::ArgumentInvalid, "bytesPerRow too small."); } if (IGL_DEBUG_VERIFY_NOT(range.numMipLevels > 1 && bytesPerRow != formatBytesPerRow)) { return Result(Result::Code::ArgumentInvalid, "bytesPerRow MUST be 0 when uploading multiple mip levels."); } } const bool isSampledOrStorage = (getUsage() & (TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Storage)) != 0; if (!IGL_DEBUG_VERIFY(isSampledOrStorage)) { return Result(Result::Code::Unsupported, "Texture must support either sampled or storage usage."); } std::unique_ptr repackedData = nullptr; // Repack data if necessary for upload if (data != nullptr && needsRepacking(range, bytesPerRow)) { repackedData = std::make_unique(properties_.getBytesPerRange(range)); ITexture::repackData( properties_, range, static_cast(data), bytesPerRow, repackedData.get(), 0); bytesPerRow = 0; data = repackedData.get(); } return uploadInternal(type, range, data, bytesPerRow, mipLevelBytes); } } // namespace igl ================================================ FILE: src/igl/Texture.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include namespace igl { /** * @brief TextureCubeFace denotes side of the face in a cubemap setting. Based on https://www.khronos.org/opengl/wiki/Cubemap_Texture PosX - The U coordinate is going behind the viewer, with the V coordinate going down. NegX - The U coordinate is going forward, with the V coordinate going down. PosY - The U coordinate goes to the right, with the V coordinate going forward. NegY - The U coordinate goes to the right, with the V coordinate going backward. PosZ - The U coordinate goes to the right, with the V coordinate going down. NegZ - The U coordinate goes to the left (relative to us facing forwards), with the V coordinate going down. */ enum class TextureCubeFace : uint8_t { PosX = 0, NegX, PosY, NegY, PosZ, NegZ }; /** * @brief Descriptor for texture dimensions * * x - offset position in width * y - offset position in height * z - offset position in depth * width - width of the range * height - height of the range * depth - depth of the range * layer - layer offset for 1D/2D array textures. Not used for cube textures faces. * numLayers - number of layers in the range * mipLevel - mipmap level offset of the range * numMipLevels - number of mipmap levels in the range * face - face offset for cube textures * numFaces - number of cube texture faces in the range */ struct TextureRangeDesc { uint32_t x = 0; uint32_t y = 0; uint32_t z = 0; uint32_t width = 1; uint32_t height = 1; uint32_t depth = 1; uint32_t layer = 0; uint32_t numLayers = 1; uint32_t mipLevel = 0; uint32_t numMipLevels = 1; uint32_t face = 0; uint32_t numFaces = 1; // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) static TextureRangeDesc new1D(uint32_t x, uint32_t width, uint32_t mipLevel = 0, uint32_t numMipLevels = 1); // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) static TextureRangeDesc new1DArray(uint32_t x, uint32_t width, uint32_t layer, uint32_t numLayers, uint32_t mipLevel = 0, uint32_t numMipLevels = 1); // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) static TextureRangeDesc new2D(uint32_t x, uint32_t y, uint32_t width, uint32_t height, uint32_t mipLevel = 0, uint32_t numMipLevels = 1); // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) static TextureRangeDesc new2DArray(uint32_t x, uint32_t y, uint32_t width, uint32_t height, uint32_t layer, uint32_t numLayers, uint32_t mipLevel = 0, uint32_t numMipLevels = 1); // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) static TextureRangeDesc new3D(uint32_t x, uint32_t y, uint32_t z, uint32_t width, uint32_t height, uint32_t depth, uint32_t mipLevel = 0, uint32_t numMipLevels = 1); // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) static TextureRangeDesc newCube(uint32_t x, uint32_t y, uint32_t width, uint32_t height, uint32_t mipLevel = 0, uint32_t numMipLevels = 1); // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) static TextureRangeDesc newCubeFace(uint32_t x, uint32_t y, uint32_t width, uint32_t height, uint32_t face, uint32_t mipLevel = 0, uint32_t numMipLevels = 1); // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) static TextureRangeDesc newCubeFace(uint32_t x, uint32_t y, uint32_t width, uint32_t height, TextureCubeFace face, uint32_t mipLevel = 0, uint32_t numMipLevels = 1); /** * @brief Returns a new TextureRangeDesc based on this one but reduced to the specified mipLevel. * * @param newMipLevel The mip level of the returned range. * @remark The returned range only has 1 mip level. */ [[nodiscard]] TextureRangeDesc atMipLevel(uint32_t newMipLevel) const noexcept; /** * @brief Returns a new TextureRangeDesc based on this one but with the specified number of * mip levels. * * @param newNumMipLevels The number of mip levels in the returned range. */ [[nodiscard]] TextureRangeDesc withNumMipLevels(uint32_t newNumMipLevels) const noexcept; /** * @brief Returns a new TextureRangeDesc based on this one but reduced to the specified layer. * * @param newLayer The layer of the returned range. * @remark The returned range only has 1 layer. */ [[nodiscard]] TextureRangeDesc atLayer(uint32_t newLayer) const noexcept; /** * @brief Returns a new TextureRangeDesc based on this one but with the specified number of * layers. * * @param newNumLayers The number of layers in the returned range. */ [[nodiscard]] TextureRangeDesc withNumLayers(uint32_t newNumLayers) const noexcept; /** * @brief Returns a new TextureRangeDesc based on this one but reduced to the specified face. * * @param newFace The face of the returned range. * @remark The returned range only has 1 face. */ [[nodiscard]] TextureRangeDesc atFace(uint32_t newFace) const noexcept; /** * @brief Returns a new TextureRangeDesc based on this one but reduced to the specified face. * * @param newFace The face of the returned range. * @remark The returned range only has 1 face. */ [[nodiscard]] TextureRangeDesc atFace(TextureCubeFace newFace) const noexcept; /** * @brief Returns a new TextureRangeDesc based on this one but with the specified number of faces. * * @param newNumFaces The number of faces in the returned range. */ [[nodiscard]] TextureRangeDesc withNumFaces(uint32_t newNumFaces) const noexcept; /** * Validates the range. * * A range is valid if: * 1) width, height, depth, numFaces, numLayers and numMipLevels are all at least 1. * 2) numMipLevels is less than or equal to the max mip levels for the width, height and depth. * 3) mipLevel, x + width, y + height, z + depth and layer + numLayers are all <= * std::numeric_limits::max(). * 4) (x + width) * (y + height) * (z + depth) * (layer + numLayers) * numFaces <= * std::numeric_limits::max(). * 5) face < 6 and numFaces <= 6 */ [[nodiscard]] Result validate() const noexcept; bool operator==(const TextureRangeDesc& rhs) const noexcept = default; bool operator!=(const TextureRangeDesc& rhs) const noexcept = default; }; /** * @brief Encapsulates properties of a texture format * * name - Stringified IGL enum for the format * format - IGL enum for the format * componentsPerPixel - Number of components for each pixel (e.g., RGB has 3) * bytesPerBlock - Bytes per pixel block (compressed) or per pixel (uncompressed) * blockWidth - Block width for compressed textures (always 1 for uncompressed) * blockHeight - Block height for compressed textures (always 1 for uncompressed) * blockDepth - Block depth for compressed textures (always 1 for uncompressed) * minBlocksX - Minimum number of blocks in the X direction for compressed textures * minBlocksY - Minimum number of blocks in the Y direction for compressed textures * minBlocksZ - Minimum number of blocks in the Z direction for compressed textures * flags - Additional boolean flags for the format: * - Depth: Depth texture format * - Stencil: Stencil texture format * - Compressed: Compressed texture format * - sRGB: sRGB texture format * - Integer: Integer formats do not support sampling via * float samplers `texture2D` (require `utexture2D`) * - HDR: More than 8 bits per component * - VariableLength: Variable length blocks */ struct TextureFormatProperties { static TextureFormatProperties fromTextureFormat(TextureFormat format); enum Flags : uint8_t { Depth = 1 << 0, Stencil = 1 << 1, Compressed = 1 << 2, sRGB = 1 << 3, Integer = 1 << 4, HDR = 1 << 5, // Color format with more than 8 bits per component VariableLength = 1 << 6, // Variable length blocks }; const char* IGL_NONNULL name = "Invalid"; const TextureFormat format = TextureFormat::Invalid; const uint8_t componentsPerPixel = 1; const uint8_t bytesPerBlock = 1; const uint8_t blockWidth = 1; const uint8_t blockHeight = 1; const uint8_t blockDepth = 1; const uint8_t minBlocksX = 1; const uint8_t minBlocksY = 1; const uint8_t minBlocksZ = 1; const uint8_t numPlanes = 1; const uint8_t flags = 0; /** * @brief true for TextureFormat::Invalid */ [[nodiscard]] bool isValid() const noexcept { return format != TextureFormat::Invalid; } /** * @brief true for compressed texture formats. */ [[nodiscard]] bool isCompressed() const noexcept { return (flags & Flags::Compressed) != 0; } /** * @brief true for integer texture formats. */ [[nodiscard]] bool isInteger() const noexcept { return (flags & Flags::Integer) != 0; } /** * @brief true for sRGB texture formats. */ [[nodiscard]] bool isSRGB() const noexcept { return (flags & Flags::sRGB) != 0; } /** * @brief true for high precision color texture formats. */ [[nodiscard]] bool isHDR() const noexcept { return (flags & Flags::HDR) != 0; } [[nodiscard]] bool hasDepth() const noexcept { return (flags & Flags::Depth) != 0; } [[nodiscard]] bool hasStencil() const noexcept { return (flags & Flags::Stencil) != 0; } [[nodiscard]] bool hasColor() const noexcept { return !hasDepth() && !hasStencil(); } /** * @brief true for depth-only texture formats (e.g., TextureFormat::Z_UNorm24). */ [[nodiscard]] bool isDepthOnly() const noexcept { return hasDepth() && !hasStencil(); } /** * @brief true for depth-only and depth-stencil texture formats. */ [[nodiscard]] bool isDepthOrDepthStencil() const noexcept { return hasDepth(); } /** * @brief true for stencil-only texture formats (e.g., TextureFormat::S_UInt8). */ [[nodiscard]] bool isStencilOnly() const noexcept { return !hasDepth() && hasStencil(); } /** * @brief true for depth-only, stencil-only and depth-stencil texture formats. */ [[nodiscard]] bool isDepthOrStencil() const noexcept { return (flags & Flags::Depth) != 0 || (flags & Flags::Stencil) != 0; } [[nodiscard]] bool isVariableLength() const noexcept { return (flags & Flags::VariableLength) != 0; } /** * @brief Utility function to calculate the number of rows in the range for the texture format. * For uncompressed textures, this will be range.height. For compressed textures, range.height * rounded up to the nearest multiple of blockHeight. * * @param range range.width, range.height, and range.depth should be the actual dimensions of the * range to calculate for. For subranges and mip levels other than 0, these should be the * dimensions of the subrange and/or mip level, which may be be less than the full texture * dimensions. * @return Calculated number of rows of texture data for the texture format. */ [[nodiscard]] uint32_t getRows(TextureRangeDesc range) const noexcept; /** * @brief Utility function to calculate the size in bytes per row for a texture format. * * @param texWidth The width, in pixels, of the texture data. This should be the row width to * calculate for. For subranges and mip levels other than 0, this should be the width of the * subrange and/or mip level, which may be be less than the full texture width. * @return Calculated total size in bytes of a row of texture data for the texture format. */ [[nodiscard]] uint32_t getBytesPerRow(uint32_t texWidth) const noexcept; /** * @brief Utility function to calculate the size in bytes per row for a texture format. * * @param range The range, in pixels, of the texture data row. range.width be the row width to * calculate for. For subranges and mip levels other than 0, this should be the width of the * subrange and/or mip level, which may be be less than the full texture width. * @return Calculated total size in bytes of a row of texture data for the texture format. */ [[nodiscard]] uint32_t getBytesPerRow(TextureRangeDesc range) const noexcept; /** * @brief Utility function to calculate the size in bytes per texture layer for a texture format. * * @param texWidth The width of the texture layer. * @param texHeight The height of the texture layer. * @param texDepth The depth of the texture layer. * @param bytesPerRow The size in bytes of each texture row. 0 for the format's default. * @remark texWidth, texHeight and texDepth should be the actual dimensions of the range to * calculate for. For subranges and mip levels other than 0, this should be the dimensions of the * subrange and/or mip level, which may be be less than the full texture dimensions. * @return Calculated total size in bytes of a layer of texture data for the texture format. */ [[nodiscard]] size_t getBytesPerLayer(uint32_t texWidth, uint32_t texHeight, uint32_t texDepth, uint32_t bytesPerRow = 0) const noexcept; /** * @brief Utility function to calculate the size in bytes per texture layer for a texture format. * * @param range The range of the texture to calculate for. The range should be the full size of * the first mip level to calculate for. range.x, range.y, range.z, range.mipLevel and range.layer * are not used. * @param bytesPerRow The size in bytes of each texture row. 0 for the format's default. * @remark range.width, range.height, and range.depth should be the actual dimensions of the range * to calculate for. For subranges and mip levels other than 0, these should be the dimensions of * the subrange and/or mip level, which may be be less than the full texture dimensions. * @return Calculated total size in bytes of a layer of texture data for the texture format. */ [[nodiscard]] size_t getBytesPerLayer(TextureRangeDesc range, uint32_t bytesPerRow = 0) const noexcept; /** * @brief Utility function to calculate the size in bytes per texture range for a texture format. * * @param range The range of the texture to calculate for. The range should be the full size of * the first mip level to calculate for. range.x, range.y and range.z are not used. * @param bytesPerRow The size in bytes of each texture row. 0 for the format's default. This * mustt be 0 if numMipLevels is more than 1. * @remark range can include more than one layer. range can also include more than one mip level. * When range includes more than one mip level, dimensions are divided by two for each subsequent * mip level. * @return Calculated total size in bytes of a the range of texture data for the texture format. */ [[nodiscard]] size_t getBytesPerRange(TextureRangeDesc range, uint32_t bytesPerRow = 0) const noexcept; /** * @brief Utility function to calculate the number of mip levels given a total size in bytes of * texture data. * * @param texWidth The width of the first mip level of the texture. * @param texHeight The height of the first mip level of the texture. * @return Calculated number of mip levels. */ [[nodiscard]] uint32_t getNumMipLevels(uint32_t texWidth, uint32_t texHeight, size_t totalBytes) const noexcept; /** * @brief Utility function to calculate the byte offset of the start of a subrange within a block * of data. * * This method assumes the following data hierarchy: * mip level * array layer * cube face * z slice * row * * This method only handles the case where the subrange is a proper subset of the full block of * data. It also only handles subranges in terms of mip levels, layers or faces. It does not * handle subsets along the x, y or z dimensions. * * @param range The range of the full block of data. * @param subRange The subrange within the full block of data for which to get the byte offset. * @param bytesPerRow The number of bytes in each row of range (the full block of data). 0 means * the default for the texture format. Must be 0 if subrange starts at a different mip level than * the full range or covers more than one mip level. * @return The byte offset within the full block of data for the start of the subrange. */ [[nodiscard]] size_t getSubRangeByteOffset(const TextureRangeDesc& range, const TextureRangeDesc& subRange, uint32_t bytesPerRow = 0) const noexcept; }; enum ImageAspectBits : uint32_t { ImageAspectBits_Invalid = 0xffffffff, ImageAspectBits_None = 0, ImageAspectBits_Color = 0x1, ImageAspectBits_Depth = 0x2, ImageAspectBits_Stencil = 0x4, ImageAspectBits_Plane_0 = 0x10, ImageAspectBits_Plane_1 = 0x20, ImageAspectBits_Plane_2 = 0x40, }; using ImageAspectFlags = uint32_t; enum Swizzle : uint8_t { Swizzle_Default = 0, Swizzle_0, Swizzle_1, Swizzle_R, Swizzle_G, Swizzle_B, Swizzle_A, }; struct ComponentMapping { Swizzle r = Swizzle_Default; Swizzle g = Swizzle_Default; Swizzle b = Swizzle_Default; Swizzle a = Swizzle_Default; [[nodiscard]] bool identity() const { return r == Swizzle_Default && g == Swizzle_Default && b == Swizzle_Default && a == Swizzle_Default; } }; /** * @brief Descriptor for texture view creation methods */ struct TextureViewDesc { TextureType type = TextureType::TwoD; // mutate the original texture format, subject to the underlying graphics API limitations TextureFormat format = TextureFormat::Invalid; // use Invalid to keep the original format ImageAspectFlags aspect = ImageAspectBits_Invalid; // use Invalid to keep the original aspect uint32_t layer = 0; uint32_t numLayers = 1; uint32_t mipLevel = 0; uint32_t numMipLevels = 1; // swizzle RGBA components in a custom way ComponentMapping swizzle = {}; std::string debugName; }; /** * @brief Descriptor for internal texture creation methods used in IGL * * width - width of the texture * height - height of the texture * depth - depth of the texture * numLayers - Number of layers for array texture * numSamples - Number of samples for multisampling * usage - Bitwise flag for containing a mask of TextureUsageBits * numMipLevels - Number of mipmaps to generate * type - The type of texture (2D, 3D, Cube, etc.) * format - Internal texture format type * storage - Internal resource storage type * tiling - Image layout for texture storage (Optimal or Linear) * exportability - Whether the texture can be exported (NoExport or Exportable) * mipmapGeneration - Specifies when and how mipmaps should be generated (Manual, * AutoGenerateOnUpload) * debugName - Optional debug name for the texture */ struct TextureDesc { /** * @brief Bitwise flags for texture usage * * Sampled - Can be used as read-only texture in vertex/fragment shaders * Storage - Can be used as read/write storage texture in vertex/fragment/compute shaders * Attachment - Can be bound for render target */ enum TextureUsageBits : uint8_t { Sampled = 1 << 0, Storage = 1 << 1, Attachment = 1 << 2, }; using TextureUsage = uint8_t; /** * @brief Flag for texture image storage (Vulkan Only) * * Optimal - Image layout for best texture read performance * Corresponds to VK_IMAGE_TILING_OPTIMAL * Linear - Image layout for linearly storing texture data * Corresponds to VK_IMAGE_TILING_LINEAR */ enum class TextureTiling : uint8_t { Optimal, Linear }; enum class TextureExportability : uint8_t { NoExport, Exportable }; /** * @brief Flag to specify whether IGL needs to generate mipmaps and when * * Manual - Mip levels are expected to be generated after the texture * is created and uploaded by the caller by calling one of IGL's * mipmap generation functions OR provided during upload. * * AutoGenerateOnUpload - IGL will generate mipmaps when the texture * is uploaded to the device */ enum class TextureMipmapGeneration : uint8_t { Manual, AutoGenerateOnUpload }; uint32_t width = 1; uint32_t height = 1; uint32_t depth = 1; uint32_t numLayers = 1; uint32_t numSamples = 1; TextureUsage usage = 0; uint32_t numMipLevels = 1; TextureType type = TextureType::Invalid; TextureFormat format = TextureFormat::Invalid; ResourceStorage storage = ResourceStorage::Invalid; TextureTiling tiling = TextureTiling::Optimal; TextureExportability exportability = TextureExportability::NoExport; TextureMipmapGeneration mipmapGeneration = TextureMipmapGeneration::Manual; std::string debugName; bool operator==(const TextureDesc& rhs) const; bool operator!=(const TextureDesc& rhs) const; /** * @brief Utility to create a new 2D texture * * @param format The format of the texture * @param width The width of the texture * @param height The height of the texture * @param usage A combination of TextureUsage flags * @param debugName An optional debug name * @return TextureDesc */ static TextureDesc new2D(TextureFormat format, uint32_t width, uint32_t height, TextureUsage usage, const char* IGL_NULLABLE debugName = nullptr) { return TextureDesc{ .width = width, .height = height, .usage = usage, .type = TextureType::TwoD, .format = format, .debugName = debugName ? debugName : "", }; } /** * @brief Utility to create a new 2D texture array * * @param format The format of the texture * @param width The width of the texture * @param height The height of the texture * @param numLayers The number layers of the texture array * @param usage A combination of TextureUsage flags * @param debugName An optional debug name * @return TextureDesc */ static TextureDesc new2DArray(TextureFormat format, uint32_t width, uint32_t height, uint32_t numLayers, TextureUsage usage, const char* IGL_NULLABLE debugName = nullptr) { return TextureDesc{ .width = width, .height = height, .numLayers = numLayers, .usage = usage, .type = TextureType::TwoDArray, .format = format, .debugName = debugName ? debugName : "", }; } /** * @brief Utility to create a new cube texture * * @param format The format of the texture * @param width The width of the texture * @param height The height of the texture * @param usage A combination of TextureUsage flags * @param debugName An optional debug name * @return TextureDesc */ static TextureDesc newCube(TextureFormat format, uint32_t width, uint32_t height, TextureUsage usage, const char* IGL_NULLABLE debugName = nullptr) { return TextureDesc{ .width = width, .height = height, .usage = usage, .type = TextureType::Cube, .format = format, .debugName = debugName ? debugName : "", }; } /** * @brief Utility to create a new 3D texture * * @param format The format of the texture * @param width The width of the texture * @param height The height of the texture * @param depth The depth of the texture * @param usage A combination of TextureUsage flags * @param debugName An optional debug name * @return TextureDesc */ static TextureDesc new3D(TextureFormat format, uint32_t width, uint32_t height, uint32_t depth, TextureUsage usage, const char* IGL_NULLABLE debugName = nullptr) { return TextureDesc{ .width = width, .height = height, .depth = depth, .usage = usage, .type = TextureType::ThreeD, .format = format, .debugName = debugName ? debugName : "", }; } /** * @brief Utility to create a new external image texture * * @param format The format of the texture * @param width The width of the texture * @param height The height of the texture * @param debugName An optional debug name * @return TextureDesc */ static TextureDesc newExternalImage(TextureFormat format, uint32_t width, uint32_t height, TextureUsage usage, const char* IGL_NULLABLE debugName = nullptr) { return TextureDesc{ .width = width, .height = height, .usage = usage, .type = TextureType::ExternalImage, .format = format, .debugName = debugName ? debugName : "", }; } #if defined(IGL_ANDROID_HWBUFFER_SUPPORTED) /** * @brief Utility to create a new image texture with linked hardware buffer * * @param format The format of the texture * @param usage A combination of TextureUsage flags * @param width The width of the texture * @param height The height of the texture * @param debugName An optional debug name * @return TextureDesc */ static TextureDesc newNativeHWBufferImage(TextureFormat format, TextureUsage usage, uint32_t width, uint32_t height, const char* IGL_NULLABLE debugName = nullptr) { return TextureDesc{ .width = width, .height = height, .usage = usage, .type = TextureType::TwoD, .format = format, .storage = ResourceStorage::Shared, .debugName = debugName ? debugName : "", }; } #endif // defined(IGL_ANDROID_HWBUFFER_SUPPORTED) /** * @brief Creates a TextureRangeDesc equivalent to descriptor. * * The range includes the full width, height, depth, number of layers, number of cube faces, and * number of mip levels in the texture descriptor. */ [[nodiscard]] TextureRangeDesc asRange() const noexcept; /** * @brief Utility to calculate maximum mipmap level support * * @param width The width of the texture * @param height The height of the texture * @param depth The depth of the texture * @return uint32_t */ static constexpr uint32_t calcNumMipLevels(uint32_t width, uint32_t height, uint32_t depth = 1) { if (!width || !height || !depth) { return 0; } uint32_t levels = 1; const size_t combinedValue = width | height | depth; while (combinedValue >> levels) { levels++; } return levels; } }; /** * @brief Interface class for all textures. * This should only be used for the purpose of getting information about the texture using the * gettor methods defined below. */ class ITexture : public ITrackedResource, public base::IAttachmentInterop { public: explicit ITexture(TextureFormat format) : properties_(TextureFormatProperties::fromTextureFormat(format)) {} ~ITexture() override = default; /** * @brief Indicates if this type of texture supports upload. */ [[nodiscard]] virtual bool supportsUpload() const { return ((getUsage() & (TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Storage)) != 0) && !properties_.isDepthOrStencil(); } /** * @brief Uploads the given data into texture memory. * * Upload supports arbitrary ranges. That is, data may point to data for multiple mip levels, cube * faces, array layers and Z slices. * * This method assumes the following data hierarchy: * mip level * array layer * cube face * z slice * row * * @param range The texture range descriptor containing the offset & dimensions of the * upload process. * @param data The pointer to the data. May be a nullptr to force initialization without * providing data. * @param bytesPerRow Number of bytes per row. If 0, it will be autocalculated assuming no * padding. * @param mipLevelBytes Number of bytes per mip level. If nullptr, it will be autocalculated * @return Result A flag for the result of operation */ Result upload(const TextureRangeDesc& range, const void* IGL_NULLABLE data, size_t bytesPerRow = 0, const uint32_t* IGL_NULLABLE mipLevelBytes = nullptr) const; // Texture Accessor Methods /** * @brief Returns the aspect ratio (width / height) of the texture. * * @return float */ [[nodiscard]] float getAspectRatio() const; /** * @brief Returns size (width x height) dimension of the texture. * For 1D textures, return (width,1) * For 2D textures, 3D textures and/or cube, return (width,height) * * @return Size */ [[nodiscard]] Size getSize() const; /** * @brief Returns depth dimension of the texture * For 1D, 2D textures, return 1 * For 3D textures and/or cube, returns depth * * @return size_t */ [[nodiscard]] uint32_t getDepth() const; /** * @brief Returns dimensions (width, height and depth) of the texture. * * @return size_t */ [[nodiscard]] virtual Dimensions getDimensions() const = 0; /** * @brief Returns the number of layers of the texture * For non array textures, return 1 * * @return size_t */ [[nodiscard]] virtual uint32_t getNumLayers() const = 0; /** * @brief Returns the number of faces the texture has * For non-cube textures, return 1 * * @return size_t */ [[nodiscard]] uint32_t getNumFaces() const; /** * @brief Returns texture format properties of the texture * * @return TextureFormatProperties */ [[nodiscard]] const TextureFormatProperties& getProperties() const { return properties_; } /** * @brief Returns texture type of the texture * * @return TextureType */ [[nodiscard]] virtual TextureType getType() const = 0; /** * @brief Returns bitwise flag containing the usage of the texture * * @return unsigned bitwise flag */ [[nodiscard]] virtual TextureDesc::TextureUsage getUsage() const = 0; /** * @brief Returns number of samples * * @return The count of samples in the underlying texture */ [[nodiscard]] virtual uint32_t getSamples() const = 0; /** * @brief Generates mipmap command using the command queue * * @param cmdQueue The command queue that is generated from the graphics device. * @param range The texture range descriptor containing the extents of the image to generate * mipmaps. If nullptr is provided, the function generates mips for all levels. Note: not all * parameters in the TextureRangeDesc structure are supported for mipmap generation. For example, * the x, y, z offsets and the dimensions are not used by this function. Also, not all * implementations support generating a subset of miplevels for an image (OpenGL, for example) */ virtual void generateMipmap(ICommandQueue& cmdQueue, const TextureRangeDesc* IGL_NULLABLE range = nullptr) const = 0; /** * @brief Generates mipmap command using an existing command buffer * @param range The texture range descriptor containing the extents of the image to generate * mipmaps. If nullptr is provided, the function generates mips for all levels. Note: not all * parameters in the TextureRangeDesc structure are supported for mipmap generation. For example, * the x, y, z offsets and the dimensions are not used by this function. Also, not all * implementations support generating a subset of miplevels for an image (OpenGL, for example) * @param cmdBuffer A command buffer that is generated from an ICommandQueue. */ virtual void generateMipmap(ICommandBuffer& cmdBuffer, const TextureRangeDesc* IGL_NULLABLE range = nullptr) const = 0; /** * @brief Returns the number of mipmap levels */ [[nodiscard]] virtual uint32_t getNumMipLevels() const = 0; /** * @brief Returns a flag to indicate mipmap for the texture has been generated. * * @return True Mipmap has been generated * False Otherwise */ [[nodiscard]] virtual bool isRequiredGenerateMipmap() const = 0; /** * @brief Attempts to calculate how much memory this texture uses. There are many factors that * make this calculation difficult and we can't be confident about driver implementations, so this * number can't be fully trusted. * * @return The estimated size of this texture, in bytes. */ [[nodiscard]] size_t getEstimatedSizeInBytes() const; /** * @brief Returns a texture id suitable for bindless rendering (descriptor indexing on Vulkan and * gpuResourceID on Metal) * * @return uint64_t */ [[nodiscard]] virtual uint64_t getTextureId() const = 0; /** * @brief Validates the range against texture dimensions at the range's mip level. * * @return The returned Result indicates whether the range is valid or not. */ [[nodiscard]] Result validateRange(const igl::TextureRangeDesc& range) const noexcept; /** * @brief Returns a TextureRangeDesc for the texture's full range at the specified mip level. * * For cube map textures, this range includes all faces. * @return TextureRangeDesc. */ [[nodiscard]] TextureRangeDesc getFullRange(size_t mipLevel = 0, size_t numMipLevels = 1) const noexcept; /** * @brief Returns a TextureRangeDesc for the texture's full range, including all mip levels. * * @return TextureRangeDesc. */ [[nodiscard]] TextureRangeDesc getFullMipRange() const noexcept; /** * @brief Returns a TextureRangeDesc for the texture's full range for a single cube face at the * specified mip level. * * @return TextureRangeDesc. */ [[nodiscard]] TextureRangeDesc getCubeFaceRange(TextureCubeFace face, size_t mipLevel = 0, size_t numMipLevels = 1) const noexcept; /** * @brief Returns a TextureRangeDesc for the texture's full range for a single cube face at the * specified mip level. * * @return TextureRangeDesc. */ [[nodiscard]] TextureRangeDesc getCubeFaceRange(size_t face, size_t mipLevel = 0, size_t numMipLevels = 1) const noexcept; /** * @brief Returns a TextureRangeDesc for the texture's full range for a single array layer at the * specified mip level. * * @return TextureRangeDesc. */ [[nodiscard]] TextureRangeDesc getLayerRange(size_t layer, size_t mipLevel = 0, size_t numMipLevels = 1) const noexcept; /** * @brief A helper function to quickly access TextureFormat. * * @return TextureFormat. */ [[nodiscard]] TextureFormat getFormat() const { return properties_.format; } /** * @brief Returns a flag checking if this texture belongs to swapchain. * * @return Boolean. */ [[nodiscard]] virtual bool isSwapchainTexture() const { return false; } /** * @brief Helper method to repack texture data to achieve a desired alignment. * * Copies data from originalData to repackedData, one row of data at a time. Each row of data will * be repackedBytesPerRow bytes long. If repackedBytesPerRow is less than originalDataBytesPerRow, * data will NOT be 0 padded. * * Repacking only works correctly for 1 mip level. * * This method assumes the following data hierarchy: * mip level * array layer * cube face * z slice * row * * @param properties The texture format properties for the data being repacked. * @param range The texture range of texture data that is being repacked. * @param originalData Pointer to the texture data to repack. * @param originalDataBytesPerRow Bytes per row of original data. 0 means no padding per row * (i.e., the data is packed). * @param repackedData Pointer to the destination to write repacked data to. * @param repackedBytesPerRow Bytes per row of repacked data. 0 means no padding per row * (i.e., the data should be packed). * @param flipVertical If true, the repacked data will be flipped vertically for each texture * layer, cube face, and Z slice. */ static void repackData(const TextureFormatProperties& properties, const TextureRangeDesc& range, const uint8_t* IGL_NONNULL originalData, size_t originalDataBytesPerRow, uint8_t* IGL_NONNULL repackedData, size_t repackedBytesPerRow, bool flipVertical = false); protected: [[nodiscard]] const void* IGL_NONNULL getSubRangeStart(const void* IGL_NONNULL data, const TextureRangeDesc& range, const TextureRangeDesc& subRange, size_t bytesPerRow) const noexcept; [[nodiscard]] virtual bool needsRepacking(IGL_MAYBE_UNUSED const TextureRangeDesc& range, IGL_MAYBE_UNUSED size_t bytesPerRow) const { return false; } [[nodiscard]] virtual Result uploadInternal( IGL_MAYBE_UNUSED TextureType type, IGL_MAYBE_UNUSED const TextureRangeDesc& range, IGL_MAYBE_UNUSED const void* IGL_NULLABLE data, IGL_MAYBE_UNUSED size_t bytesPerRow = 0, IGL_MAYBE_UNUSED const uint32_t* IGL_NULLABLE mipLevelBytes = nullptr) const { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); return Result{Result::Code::Unimplemented, "Upload not implemented."}; } const TextureFormatProperties properties_; }; /** * @brief Holds textures associated with an externally owned surface (e.g., a window). */ struct SurfaceTextures { /** @brief The surface's color texture. */ std::shared_ptr color; /** @brief The surface's depth texture. */ std::shared_ptr depth; }; } // namespace igl namespace std { // Add a hash function for older compilers template<> struct hash { // Declare member size_t operator()(const igl::TextureFormat& /*key*/) const; }; } // namespace std ================================================ FILE: src/igl/TextureFormat.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl { inline TextureFormat sRGBToLinear(TextureFormat format) { FOLLY_PUSH_WARNING FOLLY_CLANG_DISABLE_WARNING("-Wswitch-enum") switch (format) { case TextureFormat::RGBA_SRGB: return TextureFormat::RGBA_UNorm8; case TextureFormat::BGRA_SRGB: return TextureFormat::BGRA_UNorm8; // @fb-only // @fb-only // @fb-only // @fb-only default: break; } FOLLY_POP_WARNING IGL_UNREACHABLE_RETURN(TextureFormat::RGBA_UNorm8) } inline TextureFormat linearTosRGB(TextureFormat format) { FOLLY_PUSH_WARNING FOLLY_CLANG_DISABLE_WARNING("-Wswitch-enum") switch (format) { case TextureFormat::RGBA_UNorm8: return TextureFormat::RGBA_SRGB; case TextureFormat::BGRA_UNorm8: return TextureFormat::BGRA_SRGB; // @fb-only // @fb-only // @fb-only // @fb-only default: break; } FOLLY_POP_WARNING IGL_UNREACHABLE_RETURN(TextureFormat::RGBA_SRGB) } inline TextureFormat BgraToRgba(TextureFormat format) { if (format == TextureFormat::BGRA_UNorm8) { return TextureFormat::RGBA_UNorm8; } else if (format == TextureFormat::BGRA_SRGB) { return TextureFormat::RGBA_SRGB; } return format; } inline TextureFormat RgbaToBgra(TextureFormat format) { if (format == TextureFormat::RGBA_UNorm8) { return TextureFormat::BGRA_UNorm8; } else if (format == TextureFormat::RGBA_SRGB) { return TextureFormat::BGRA_SRGB; } return format; } } // namespace igl ================================================ FILE: src/igl/Timer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl { class ITimer : public ITrackedResource { public: ~ITimer() override = default; /** * If results are available, returns the measured time in nanoseconds. Otherwise, returns 0. */ [[nodiscard]] virtual uint64_t getElapsedTimeNanos() const = 0; /** * Returns true if the timer results are available. Results should be available immediately after * calling ICommandBuffer::waitUntilCompleted(), but if you do not wait for the command buffer, * it may take a frame or two for the results to become available. */ [[nodiscard]] virtual bool resultsAvailable() const = 0; protected: ITimer() = default; }; } // namespace igl ================================================ FILE: src/igl/TimestampQueries.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl { class ITimestampQueries : public ITrackedResource { public: ~ITimestampQueries() override = default; /// Maximum number of timing slots this object can hold [[nodiscard]] virtual uint32_t capacity() const = 0; /// Number of timing slots recorded so far [[nodiscard]] virtual uint32_t count() const = 0; /// Reset the counter to 0 for reuse (does not deallocate) virtual void reset() = 0; /// True if GPU has completed and all recorded results are readable [[nodiscard]] virtual bool resultsAvailable() const = 0; /// Get the elapsed GPU time in nanoseconds for a timing slot. /// A timing slot represents a single render pass measurement. /// Metal: computes delta from two sampleBufferAttachments samples (slot*2, slot*2+1). /// OpenGL: returns the GL_TIME_ELAPSED query result directly. /// Default returns 0; override in backends that support per-slot elapsed queries. [[nodiscard]] virtual uint64_t getElapsedNanos(uint32_t /*slotIndex*/) const { return 0; } protected: ITimestampQueries() = default; }; } // namespace igl ================================================ FILE: src/igl/Uniform.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace igl { size_t sizeForUniformType(UniformType type) { switch (type) { case UniformType::Invalid: return 0; case UniformType::Float: return sizeof(float); case UniformType::Float2: return sizeof(float[2]); case UniformType::Float3: return sizeof(float[3]); case UniformType::Float4: return sizeof(float[4]); case UniformType::Boolean: return sizeof(bool); case UniformType::Int: return sizeof(int32_t); case UniformType::Int2: return sizeof(int32_t[2]); case UniformType::Int3: return sizeof(int32_t[3]); case UniformType::Int4: return sizeof(int32_t[4]); case UniformType::Mat2x2: return sizeof(float[2][2]); case UniformType::Mat3x3: return sizeof(float[3][3]); case UniformType::Mat4x4: return sizeof(float[4][4]); default: IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); // missing enum case return 0; } } // Returns the size of the underlying element size_t sizeForUniformElementType(UniformType type) { switch (type) { case UniformType::Invalid: return 0; case UniformType::Float: case UniformType::Float2: case UniformType::Float3: case UniformType::Float4: case UniformType::Mat2x2: case UniformType::Mat3x3: case UniformType::Mat4x4: return sizeof(float); case UniformType::Boolean: return sizeof(bool); case UniformType::Int: case UniformType::Int2: case UniformType::Int3: case UniformType::Int4: return sizeof(int32_t); default: IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); // missing enum case return 0; } } } // namespace igl ================================================ FILE: src/igl/Uniform.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl { /// Type of individual uniform value. enum class UniformType : uint8_t { Invalid = 0, Float, Float2, Float3, Float4, Boolean, Int, Int2, Int3, Int4, Mat2x2, Mat3x3, Mat4x4 }; /// Information required to be specified when binding non-block uniforms /// Only used when binding to opengl 2.0 shaders as uniform blocks are not supported in that /// version. Code that can use uniform blocks should use uniform blocks. struct UniformDesc { std::string name; int location = -1; UniformType type = UniformType::Invalid; size_t numElements = 1; // number of elements for arrays size_t offset = 0; size_t elementStride = 0; }; size_t sizeForUniformType(UniformType type); size_t sizeForUniformElementType(UniformType type); } // namespace igl ================================================ FILE: src/igl/VertexInputState.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include using namespace igl; size_t VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat format) { switch (format) { case VertexAttributeFormat::Float1: return sizeof(float); case VertexAttributeFormat::Float2: return sizeof(float[2]); case VertexAttributeFormat::Float3: return sizeof(float[3]); case VertexAttributeFormat::Float4: return sizeof(float[4]); case VertexAttributeFormat::Byte1: case VertexAttributeFormat::Byte1Norm: return sizeof(int8_t); case VertexAttributeFormat::Byte2: case VertexAttributeFormat::Byte2Norm: return sizeof(int8_t[2]); case VertexAttributeFormat::Byte3: case VertexAttributeFormat::Byte3Norm: return sizeof(int8_t[3]); case VertexAttributeFormat::Byte4: case VertexAttributeFormat::Byte4Norm: return sizeof(int8_t[4]); case VertexAttributeFormat::UByte1: case VertexAttributeFormat::UByte1Norm: return sizeof(uint8_t[1]); case VertexAttributeFormat::UByte2: case VertexAttributeFormat::UByte2Norm: return sizeof(uint8_t[2]); case VertexAttributeFormat::UByte3: case VertexAttributeFormat::UByte3Norm: return sizeof(uint8_t[3]); case VertexAttributeFormat::UByte4: case VertexAttributeFormat::UByte4Norm: return sizeof(uint8_t[4]); case VertexAttributeFormat::Short1: case VertexAttributeFormat::Short1Norm: return sizeof(int16_t); case VertexAttributeFormat::Short2: case VertexAttributeFormat::Short2Norm: return sizeof(int16_t[2]); case VertexAttributeFormat::Short3: case VertexAttributeFormat::Short3Norm: return sizeof(int16_t[3]); case VertexAttributeFormat::Short4: case VertexAttributeFormat::Short4Norm: return sizeof(int16_t[4]); case VertexAttributeFormat::UShort1: case VertexAttributeFormat::UShort1Norm: return sizeof(uint16_t); case VertexAttributeFormat::UShort2: case VertexAttributeFormat::UShort2Norm: return sizeof(uint16_t[2]); case VertexAttributeFormat::UShort3: case VertexAttributeFormat::UShort3Norm: return sizeof(uint16_t[3]); case VertexAttributeFormat::UShort4: case VertexAttributeFormat::UShort4Norm: return sizeof(uint16_t[4]); case VertexAttributeFormat::Int1: case VertexAttributeFormat::UInt1: return sizeof(uint32_t[1]); case VertexAttributeFormat::Int2: case VertexAttributeFormat::UInt2: return sizeof(uint32_t[2]); case VertexAttributeFormat::Int3: case VertexAttributeFormat::UInt3: return sizeof(uint32_t[3]); case VertexAttributeFormat::Int4: case VertexAttributeFormat::UInt4: return sizeof(uint32_t[4]); case VertexAttributeFormat::HalfFloat1: return sizeof(uint16_t[1]); case VertexAttributeFormat::HalfFloat2: return sizeof(uint16_t[2]); case VertexAttributeFormat::HalfFloat3: return sizeof(uint16_t[3]); case VertexAttributeFormat::HalfFloat4: return sizeof(uint16_t[4]); case VertexAttributeFormat::Int_2_10_10_10_REV: return sizeof(uint32_t); } IGL_UNREACHABLE_RETURN(0) } size_t std::hash::operator()(const VertexInputBinding& key) const { size_t hash = 0; hash ^= std::hash()(static_cast(key.sampleRate)); hash ^= std::hash()(EnumToValue(key.sampleFunction)); hash ^= std::hash()(static_cast(key.stride)); return hash; } size_t std::hash::operator()(const VertexAttribute& key) const { size_t hash = 0; hash ^= std::hash()(key.name); hash ^= std::hash()(key.location); hash ^= std::hash()(key.offset); hash ^= std::hash()(key.bufferIndex); hash ^= std::hash()(static_cast(EnumToValue(key.format))); return hash; } bool VertexInputStateDesc::operator==(const VertexInputStateDesc& other) const { if (other.numAttributes != numAttributes || other.numInputBindings != numInputBindings) { return false; } for (auto i = 0; i < numAttributes; i++) { if (other.attributes[i] != attributes[i]) { return false; } } for (auto i = 0; i < numInputBindings; i++) { if (other.inputBindings[i] != inputBindings[i]) { return false; } } return true; } size_t std::hash::operator()(const VertexInputStateDesc& key) const { size_t hash = 0; hash ^= std::hash()(key.numInputBindings); hash ^= std::hash()(key.numAttributes); for (size_t i = 0; i < key.numAttributes; i++) { hash ^= std::hash()(key.attributes[i]); } for (size_t i = 0; i < key.numInputBindings; i++) { hash ^= std::hash()(key.inputBindings[i]); } return hash; } ================================================ FILE: src/igl/VertexInputState.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl { /** * @brief Represents vertex attribute data types for both scalar and vector values */ enum class VertexAttributeFormat { Float1 = 0, Float2, Float3, Float4, Byte1, Byte2, Byte3, Byte4, UByte1, UByte2, UByte3, UByte4, Short1, Short2, Short3, Short4, UShort1, UShort2, UShort3, UShort4, // Normalized variants Byte1Norm, Byte2Norm, Byte3Norm, Byte4Norm, UByte1Norm, UByte2Norm, UByte3Norm, UByte4Norm, Short1Norm, Short2Norm, Short3Norm, Short4Norm, UShort1Norm, UShort2Norm, UShort3Norm, UShort4Norm, Int1, Int2, Int3, Int4, UInt1, UInt2, UInt3, UInt4, // packed formats HalfFloat1, HalfFloat2, HalfFloat3, HalfFloat4, // NOLINTNEXTLINE(readability-identifier-naming) Int_2_10_10_10_REV, // standard format to store normal vectors }; /** * @brief Controls how vertex attribute streams are consumed, per-vertex or per-instance */ enum class VertexSampleFunction { Constant, PerVertex, Instance, // Missing Tessellation support }; /** * @brief Generic definition of a vertex attribute stream */ struct VertexAttribute { /** @brief A buffer which contains this attribute stream */ size_t bufferIndex = 0; /** @brief Per-element format */ VertexAttributeFormat format = VertexAttributeFormat::Float1; /** @brief An offset where the first element of this attribute stream starts */ uintptr_t offset = 0; std::string name; // GLES Only int location = -1; // Metal only bool operator==(const VertexAttribute& other) const = default; bool operator!=(const VertexAttribute& other) const = default; }; /** * @brief Defines a binding point for a vertex stream */ struct VertexInputBinding { size_t stride = 0; VertexSampleFunction sampleFunction = VertexSampleFunction::PerVertex; size_t sampleRate = 1; bool operator==(const VertexInputBinding& other) const = default; bool operator!=(const VertexInputBinding& other) const = default; }; /** * @brief Defines input to a vertex shader */ struct VertexInputStateDesc { size_t numAttributes = 0; VertexAttribute attributes[IGL_VERTEX_ATTRIBUTES_MAX]; size_t numInputBindings = 0; VertexInputBinding inputBindings[IGL_BUFFER_BINDINGS_MAX]; static size_t sizeForVertexAttributeFormat(VertexAttributeFormat format); bool operator==(const VertexInputStateDesc& other) const; }; /** * @brief Represents input to a vertex shader in a form of an object which can be used with * RenderPipelineState */ class IVertexInputState { public: protected: IVertexInputState() = default; virtual ~IVertexInputState() = default; }; } // namespace igl // Hashing function declarations namespace std { template<> struct hash { size_t operator()(const igl::VertexInputStateDesc& /*key*/) const; }; template<> struct hash { size_t operator()(const igl::VertexInputBinding& /*key*/) const; }; template<> struct hash { size_t operator()(const igl::VertexAttribute& /*key*/) const; }; } // namespace std ================================================ FILE: src/igl/android/LogDefault.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace { android_LogPriority logPriorityFromLogLevel(IGLLogLevel logLevel) noexcept { switch (logLevel) { case IGLLogError: return ANDROID_LOG_ERROR; case IGLLogWarning: return ANDROID_LOG_WARN; case IGLLogInfo: return ANDROID_LOG_INFO; } } } // namespace IGL_API int IGLAndroidLogDefaultHandler(IGLLogLevel logLevel, const char* IGL_RESTRICT format, va_list ap) { return __android_log_vprint(logPriorityFromLogLevel(logLevel), "IGL", format, ap); } ================================================ FILE: src/igl/android/LogDefault.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include // At startup, install an Android-specific log handler, so logging shows up in `adb logcat`: // ``` // IGLLogSetHandler(IGLAndroidLogDefaultHandler); // ``` extern "C" { // NOLINTNEXTLINE(readability-identifier-naming) IGL_API int IGLAndroidLogDefaultHandler(IGLLogLevel logLevel, const char* IGL_RESTRICT format, va_list ap); } ================================================ FILE: src/igl/android/NativeHWBuffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only // @fb-only #include "NativeHWBuffer.h" #if defined(IGL_ANDROID_HWBUFFER_SUPPORTED) namespace igl::android { uint32_t getNativeHWFormat(TextureFormat iglFormat) { // note that Native HW buffer has compute specific format but is not added here. switch (iglFormat) { case TextureFormat::RGBX_UNorm8: return AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM; case TextureFormat::RGBA_UNorm8: return AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM; case TextureFormat::B5G6R5_UNorm: return AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM; case TextureFormat::RGBA_F16: return AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT; case TextureFormat::RGB10_A2_UNorm_Rev: return AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM; case TextureFormat::Z_UNorm16: return AHARDWAREBUFFER_FORMAT_D16_UNORM; case TextureFormat::Z_UNorm24: return AHARDWAREBUFFER_FORMAT_D24_UNORM; case TextureFormat::Z_UNorm32: return AHARDWAREBUFFER_FORMAT_D32_FLOAT; case TextureFormat::S8_UInt_Z24_UNorm: return AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT; case TextureFormat::S_UInt8: return AHARDWAREBUFFER_FORMAT_S8_UINT; case TextureFormat::YUV_NV12: return AHARDWAREBUFFER_FORMAT_YCbCr_420_SP_VENUS; #if __ANDROID_MIN_SDK_VERSION__ >= 30 case TextureFormat::YUV_420p: return AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420; #endif default: return 0; } } uint32_t getNativeHWBufferUsage(TextureDesc::TextureUsage iglUsage) { uint64_t bufferUsage = 0; if (iglUsage & TextureDesc::TextureUsageBits::Sampled) { bufferUsage |= AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE; } if (iglUsage & TextureDesc::TextureUsageBits::Storage) { bufferUsage |= AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN | AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN; } if (iglUsage & TextureDesc::TextureUsageBits::Attachment) { bufferUsage |= AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT; } return bufferUsage; } TextureFormat getIglFormat(uint32_t nativeFormat) { // note that Native HW buffer has compute specific format but is not added here. switch (nativeFormat) { case AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM: return TextureFormat::RGBX_UNorm8; case AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM: return TextureFormat::RGBA_UNorm8; case AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM: return TextureFormat::B5G6R5_UNorm; case AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT: return TextureFormat::RGBA_F16; case AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM: return TextureFormat::RGB10_A2_UNorm_Rev; case AHARDWAREBUFFER_FORMAT_D16_UNORM: return TextureFormat::Z_UNorm16; case AHARDWAREBUFFER_FORMAT_D24_UNORM: return TextureFormat::Z_UNorm24; case AHARDWAREBUFFER_FORMAT_D32_FLOAT: return TextureFormat::Z_UNorm32; case AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT: return TextureFormat::S8_UInt_Z24_UNorm; case AHARDWAREBUFFER_FORMAT_S8_UINT: return TextureFormat::S_UInt8; case AHARDWAREBUFFER_FORMAT_YCbCr_420_SP_VENUS: case COLOR_QCOM_FORMATYUV420PackedSemiPlanar32m: return TextureFormat::YUV_NV12; #if __ANDROID_MIN_SDK_VERSION__ >= 30 case AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420: return TextureFormat::YUV_420p; #endif default: return TextureFormat::Invalid; } } TextureDesc::TextureUsage getIglBufferUsage(uint32_t nativeUsage) { TextureDesc::TextureUsage bufferUsage = 0; if (nativeUsage & AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE) { bufferUsage |= TextureDesc::TextureUsageBits::Sampled; } if (nativeUsage & (AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN | AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN)) { bufferUsage |= TextureDesc::TextureUsageBits::Storage; } if (nativeUsage & AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT) { bufferUsage |= TextureDesc::TextureUsageBits::Attachment; } return bufferUsage; } Result allocateNativeHWBuffer(const TextureDesc& desc, bool surfaceComposite, AHardwareBuffer** buffer) { AHardwareBuffer_Desc bufferDesc = {}; bufferDesc.format = getNativeHWFormat(desc.format); bufferDesc.width = desc.width; bufferDesc.height = desc.height; bufferDesc.layers = 1; bufferDesc.usage = getNativeHWBufferUsage(desc.usage); bufferDesc.rfu0 = 0; bufferDesc.rfu1 = 0; #if __ANDROID_MIN_SDK_VERSION__ >= 33 bufferDesc.usage |= surfaceComposite ? AHARDWAREBUFFER_USAGE_COMPOSER_OVERLAY : 0; #endif // __ANDROID_MIN_SDK_VERSION__ >= 33 const auto code = AHardwareBuffer_allocate(&bufferDesc, buffer); if (code != 0) { return Result(Result::Code::RuntimeError, "AHardwareBuffer allocation failed"); } return Result(); } INativeHWTextureBuffer::LockGuard::~LockGuard() { if (hwBufferOwner_ != nullptr) { hwBufferOwner_->unlockHWBuffer(); } } INativeHWTextureBuffer::LockGuard::LockGuard(const INativeHWTextureBuffer* hwBufferOwner) : hwBufferOwner_(hwBufferOwner) {} INativeHWTextureBuffer::LockGuard::LockGuard(INativeHWTextureBuffer::LockGuard&& g) { hwBufferOwner_ = g.hwBufferOwner_; g.hwBufferOwner_ = nullptr; } Result INativeHWTextureBuffer::createWithHWBuffer(AHardwareBuffer* buffer) { if (hwBuffer_) { return Result{Result::Code::InvalidOperation, "Hardware buffer already provided"}; } AHardwareBuffer_acquire(buffer); // textureDesc_ should be updated through createTextureInternal function. Result result = createTextureInternal(buffer); if (!result.isOk()) { AHardwareBuffer_release(buffer); } else { hwBuffer_ = buffer; } return result; } Result INativeHWTextureBuffer::createHWBuffer(const TextureDesc& desc, bool hasStorageAlready, bool surfaceComposite) { if (hwBuffer_) { IGL_LOG_ERROR("hw already provided"); return Result{Result::Code::InvalidOperation, "Hardware buffer already provided"}; } const bool isValid = desc.numLayers == 1 && desc.numSamples == 1 && desc.numMipLevels == 1 && desc.usage != 0 && desc.type == TextureType::TwoD && desc.tiling == igl::TextureDesc::TextureTiling::Optimal && igl::android::getNativeHWFormat(desc.format) > 0 && !hasStorageAlready && desc.storage == ResourceStorage::Shared; if (!isValid) { IGL_LOG_ERROR("invalid desc for HW"); // failed on (1 1 1) (5 1 0) (1 0 0) IGL_LOG_ERROR("DESC: (%d %d %d) (%d %d %d) (%d %d %d)", desc.numLayers, // 1 desc.numSamples, // 1 desc.numMipLevels, // 1 desc.usage, // != 0 desc.type, // 1 = TwoD desc.tiling, // 0 = Optimal igl::android::getNativeHWFormat(desc.format), (int)hasStorageAlready, desc.storage // 2 = shared ); return Result(Result::Code::Unsupported, "Invalid texture description"); } AHardwareBuffer* buffer = nullptr; auto allocationResult = igl::android::allocateNativeHWBuffer(desc, surfaceComposite, &buffer); if (!allocationResult.isOk()) { IGL_LOG_ERROR("HW alloc failed"); return allocationResult; } Result result = createTextureInternal(buffer); if (!result.isOk()) { IGL_LOG_ERROR("HW internal failed"); AHardwareBuffer_release(buffer); } else { hwBuffer_ = buffer; textureDesc_ = desc; } return result; } INativeHWTextureBuffer::LockGuard INativeHWTextureBuffer::lockHWBuffer(std::byte * IGL_NULLABLE * IGL_NONNULL dst, RangeDesc& outRange, Result* outResult) const { Result result = lockHWBuffer(dst, outRange); Result::setResult(outResult, result); return INativeHWTextureBuffer::LockGuard(result.isOk() ? this : nullptr); } Result INativeHWTextureBuffer::lockHWBuffer(std::byte * IGL_NULLABLE * IGL_NONNULL dst, RangeDesc& outRange) const { AHardwareBuffer_Desc hwbDesc; AHardwareBuffer_describe(hwBuffer_, &hwbDesc); if (AHardwareBuffer_lock(hwBuffer_, AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN, -1, nullptr, reinterpret_cast(dst))) { IGL_DEBUG_ABORT("Failed to lock hardware buffer"); return Result(Result::Code::RuntimeError, "Failed to lock hardware buffer"); } outRange.width = hwbDesc.width; outRange.height = hwbDesc.height; outRange.layer = 1; outRange.mipLevel = 1; outRange.stride = hwbDesc.stride; return Result(); } Result INativeHWTextureBuffer::unlockHWBuffer() const { if (AHardwareBuffer_unlock(hwBuffer_, nullptr)) { IGL_DEBUG_ABORT("Failed to unlock hardware buffer"); return Result(Result::Code::RuntimeError, "Failed to unlock hardware buffer"); } return Result(); } AHardwareBuffer* INativeHWTextureBuffer::getHardwareBuffer() const { return hwBuffer_; } TextureDesc INativeHWTextureBuffer::getTextureDesc() const { return textureDesc_; } } // namespace igl::android #endif // defined(IGL_ANDROID_HWBUFFER_SUPPORTED) ================================================ FILE: src/igl/android/NativeHWBuffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once // @fb-only // @fb-only #include #if defined(IGL_ANDROID_HWBUFFER_SUPPORTED) #if !defined(AHARDWAREBUFFER_FORMAT_YCbCr_420_SP_VENUS) #define AHARDWAREBUFFER_FORMAT_YCbCr_420_SP_VENUS 0x7FA30C06 #endif #if !defined(COLOR_QCOM_FORMATYUV420PackedSemiPlanar32m) #define COLOR_QCOM_FORMATYUV420PackedSemiPlanar32m 0x7FA30C04 #endif #include #include #include namespace igl::android { class INativeHWTextureBuffer { public: struct LockGuard { public: ~LockGuard(); LockGuard(const LockGuard&) = delete; LockGuard(LockGuard&& g); private: friend class INativeHWTextureBuffer; LockGuard(const INativeHWTextureBuffer* hwBufferOwner = nullptr); const INativeHWTextureBuffer* hwBufferOwner_; }; struct RangeDesc : TextureRangeDesc { size_t stride = 0; }; virtual ~INativeHWTextureBuffer() { if (hwBuffer_ != nullptr) { AHardwareBuffer_release(hwBuffer_); hwBuffer_ = nullptr; } } Result createWithHWBuffer(AHardwareBuffer* buffer); Result createHWBuffer(const TextureDesc& desc, bool hasStorageAlready, bool surfaceComposite); [[nodiscard]] LockGuard lockHWBuffer(std::byte * IGL_NULLABLE * IGL_NONNULL dst, RangeDesc& outRange, Result* outResult) const; Result lockHWBuffer(std::byte * IGL_NULLABLE * IGL_NONNULL dst, RangeDesc& outRange) const; Result unlockHWBuffer() const; [[nodiscard]] AHardwareBuffer* getHardwareBuffer() const; [[nodiscard]] TextureDesc getTextureDesc() const; protected: virtual Result createTextureInternal(AHardwareBuffer* buffer) = 0; AHardwareBuffer* hwBuffer_ = nullptr; TextureDesc textureDesc_; }; // utils uint32_t getNativeHWFormat(TextureFormat iglFormat); uint32_t getNativeHWBufferUsage(TextureDesc::TextureUsage iglUsage); TextureFormat getIglFormat(uint32_t nativeFormat); TextureDesc::TextureUsage getIglBufferUsage(uint32_t nativeUsage); Result allocateNativeHWBuffer(const TextureDesc& desc, bool surfaceComposite, AHardwareBuffer** buffer); } // namespace igl::android #endif // defined(IGL_ANDROID_HWBUFFER_SUPPORTED) ================================================ FILE: src/igl/apple/LogDefault.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #if !IGL_PLATFORM_APPLE #error This file should only be compiled on Apple targets #endif // !IGL_PLATFORM_APPLE #include #include IGL_API int IGLAppleLogDefaultHandler(IGLLogLevel logLevel, const char* IGL_RESTRICT format, va_list ap) { // Format the message into a buffer for os_log char buf[4096]; int result = vsnprintf(buf, sizeof(buf), format, ap); switch (logLevel) { case IGLLogError: os_log_error(OS_LOG_DEFAULT, "[IGL] %{public}s", buf); break; case IGLLogWarning: os_log(OS_LOG_DEFAULT, "[IGL] %{public}s", buf); break; case IGLLogInfo: os_log_info(OS_LOG_DEFAULT, "[IGL] %{public}s", buf); break; } return result; } ================================================ FILE: src/igl/apple/LogDefault.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include // At startup, install an Apple-specific log handler, so logging shows up in Console.app / os_log: // ``` // IGLLogSetHandler(IGLAppleLogDefaultHandler); // ``` extern "C" { // NOLINTNEXTLINE(readability-identifier-naming) IGL_API int IGLAppleLogDefaultHandler(IGLLogLevel logLevel, const char* IGL_RESTRICT format, va_list ap); } ================================================ FILE: src/igl/base/Common.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::base { /// @brief Backend type enumeration enum class BackendType { Invalid, OpenGL, Metal, Vulkan, D3D12, // @fb-only Custom, }; /** * * The IGL format name specification is as follows: * * There shall be 3 naming format base types: those for component array * formats (type A); those for compressed formats (type C); and those for * packed component formats (type P). With type A formats, color component * order does not change with endianness. Each format name shall begin with * TextureFormat::, followed by a component label (from the Component Label * list below) for each component in the order that the component(s) occur * in the format, except for non-linear color formats where the first * letter shall be 'S'. For type P formats, each component label is * followed by the number of bits that represent it in the fundamental * data type used by the format. * * Following the listing of the component labels shall be an underscore; a * compression type followed by an underscore for Type C formats only; a * storage type from the list below; and a bit width for type A formats, * which is the bit width for each array element. * * If a format is vendor-specific, then a "_vendor" post fix may be * added to the type * * * ---------- Format Base Type A: Array ---------- * TextureFormat::[component list]_[storage type][array element bit width][_vendor] * * Examples: * TextureFormat::A_SNorm8 - uchar[i] = A * TextureFormat::RGBA_SNorm16 - ushort[i * 4 + 0] = R, ushort[i * 4 + 1] = G, * ushort[i * 4 + 2] = B, ushort[i * 4 + 3] = A * TextureFormat::Z_UNorm32 - int32[i] = Z * * * ---------- Format Base Type C: Compressed ---------- * TextureFormat::[component list#][_*][compression type][_*][block size][_*][storage type#] * # where required * * Examples: * TextureFormat::RGB_ETC1 * TextureFormat::RGBA_ASTC_4x4 * TextureFormat::RGB_PVRTC_2BPPV1 * * * ---------- Format Base Type P: Packed ---------- * TextureFormat::[[component list,bit width][storage type#][_]][_][storage type##][_storage * order###][_vendor#] * # when type differs between component * ## when type applies to all components * ### when storage order is hardware independent * * Examples: * TextureFormat::A8B8G8R8_UNorm * TextureFormat::R5G6B5_UNorm * TextureFormat::B4G4R4X4_UNorm * TextureFormat::Z32_F_S8X24_UInt * TextureFormat::R10G10B10A2_UInt * TextureFormat::R9G9B9E5_F * TextureFormat::BGRA_UNorm8_Rev * * * ---------- Component Labels: ---------- * A - Alpha * B - Blue * G - Green * I - Intensity * L - Luminance * R - Red * S - Stencil (when not followed by RGB or RGBA) * S - non-linear types (when followed by RGB or RGBA) * X - Packing bits * Z - Depth * * ---------- Storage Types: ---------- * F: float * SInt: Signed Integer * UInt: Unsigned Integer * SNorm: Signed Normalized Integer/Byte * UNorm: Unsigned Normalized Integer/Byte * * ---------- Type C Compression Types: Additional Info ---------- * ETC1 - No other information required * ETC2 - No other information required * ASTC - Block size shall be given * PVRTC - Block size shall be given * */ // NOLINTBEGIN(readability-identifier-naming) enum class TextureFormat : uint8_t { Invalid = 0, // 8 bpp A_UNorm8, L_UNorm8, R_UNorm8, // 16 bpp R_F16, R_UInt16, R_UNorm16, B5G5R5A1_UNorm, B5G6R5_UNorm, ABGR_UNorm4, // NA on GLES LA_UNorm8, RG_UNorm8, R4G2B2_UNorm_Apple, R4G2B2_UNorm_Rev_Apple, R5G5B5A1_UNorm, // 24 bpp RGBX_UNorm8, // 32 bpp RGBA_UNorm8, BGRA_UNorm8, BGRA_UNorm8_Rev, RGBA_SRGB, BGRA_SRGB, RG_F16, RG_UInt16, RG_UNorm16, RGB10_A2_UNorm_Rev, RGB10_A2_Uint_Rev, BGR10_A2_Unorm, R_F32, R_UInt32, // 48 bpp RGB_F16, // 64 bpp RGBA_UNorm16, RGBA_F16, RG_F32, // 96 bpp RGB_F32, // 128 bpp RGBA_UInt32, RGBA_F32, // Compressed RGBA_ASTC_4x4, SRGB8_A8_ASTC_4x4, RGBA_ASTC_5x4, SRGB8_A8_ASTC_5x4, RGBA_ASTC_5x5, SRGB8_A8_ASTC_5x5, RGBA_ASTC_6x5, SRGB8_A8_ASTC_6x5, RGBA_ASTC_6x6, SRGB8_A8_ASTC_6x6, RGBA_ASTC_8x5, SRGB8_A8_ASTC_8x5, RGBA_ASTC_8x6, SRGB8_A8_ASTC_8x6, RGBA_ASTC_8x8, SRGB8_A8_ASTC_8x8, RGBA_ASTC_10x5, SRGB8_A8_ASTC_10x5, RGBA_ASTC_10x6, SRGB8_A8_ASTC_10x6, RGBA_ASTC_10x8, SRGB8_A8_ASTC_10x8, RGBA_ASTC_10x10, SRGB8_A8_ASTC_10x10, RGBA_ASTC_12x10, SRGB8_A8_ASTC_12x10, RGBA_ASTC_12x12, SRGB8_A8_ASTC_12x12, RGBA_PVRTC_2BPPV1, RGB_PVRTC_2BPPV1, RGBA_PVRTC_4BPPV1, RGB_PVRTC_4BPPV1, RGB8_ETC1, RGB8_ETC2, SRGB8_ETC2, RGB8_Punchthrough_A1_ETC2, SRGB8_Punchthrough_A1_ETC2, RGBA8_EAC_ETC2, SRGB8_A8_EAC_ETC2, RG_EAC_UNorm, RG_EAC_SNorm, R_EAC_UNorm, R_EAC_SNorm, RGBA_BC7_UNORM_4x4, // block compression RGBA_BC7_SRGB_4x4, // block compression // Depth and Stencil formats Z_UNorm16, // NA on iOS/Metal but works on iOS GLES. The client has to account for // this! Z_UNorm24, Z_UNorm32, // NA on iOS/GLES but works on iOS Metal. The client has to account for // this! S8_UInt_Z24_UNorm, S8_UInt_Z32_UNorm, // NA on iOS/GLES but works on iOS Metal. The client has to // account for this! S_UInt8, YUV_NV12, // Semi-planar 8-bit YUV 4:2:0 NV12; 2 planes in a single image YUV_420p, // Tri-planar 8-bit YUV 4:2:0; 3 planes in a single image // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only }; // NOLINTEND(readability-identifier-naming) /** * @brief TextureType denotes the possible storage components of the underlying surface for the * texture. For example, TwoD corresponds to 2-dimensional textures. * * Invalid - Undefined, * TwoD - Single layer, two dimensional: (Width, Height) * TwoDArray - Multiple layers, two dimensional: (Width, Height) * ThreeD - 3 dimensional textures: (Width, Height, Depth) * Cube - Special case of 3 dimensional textures: (Width, Height, Depth), along with 6 * cube faces * ExternalImage - Externally provided images, EXTERNAL_OES on OpenGLES */ enum class TextureType : uint8_t { Invalid, TwoD, TwoDArray, ThreeD, Cube, ExternalImage, }; } // namespace igl::base ================================================ FILE: src/igl/base/IAttachmentInterop.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::base { /// @brief Basic attachment descriptor for interoperability struct AttachmentInteropDesc { uint32_t width = 1; uint32_t height = 1; uint32_t depth = 1; uint32_t numLayers = 1; uint32_t numSamples = 1; uint32_t numMipLevels = 1; TextureType type = TextureType::TwoD; TextureFormat format = TextureFormat::Invalid; bool isSampled = true; }; /// @brief Attachment interface for interoperability class IAttachmentInterop { public: virtual ~IAttachmentInterop() = default; /// @brief Get native image handle /// @return Platform-specific image handle [[nodiscard]] virtual void* getNativeImage() const = 0; /// @brief Get native image view handle (if applicable) /// @return Platform-specific image view handle [[nodiscard]] virtual void* getNativeImageView() const = 0; /// @brief Get the attachment descriptor [[nodiscard]] virtual const AttachmentInteropDesc& getDesc() const = 0; }; } // namespace igl::base ================================================ FILE: src/igl/base/IDeviceBase.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::base { /// @brief Base device interface for interoperability class IDeviceBase { public: virtual ~IDeviceBase() = default; /// @brief Returns the backend type [[nodiscard]] virtual BackendType getBackendType() const = 0; /// @brief Returns raw pointer to native device handle /// @return Platform-specific device handle [[nodiscard]] virtual void* getNativeDevice() const = 0; /// @brief Create a framebuffer for interoperability /// @param desc The framebuffer descriptor /// @param outResult Optional pointer to receive the result code /// @return Raw pointer to created framebuffer. Caller MUST take ownership of the returned /// pointer, otherwise it will be a memory leak. Use delete to destroy. /// Returns nullptr if the framebuffer cannot be created. [[nodiscard]] virtual IFramebufferInterop* createFramebufferInterop( const FramebufferInteropDesc& desc) = 0; /// @brief Get access to the staging buffer /// @return Pointer to the staging buffer interface, or nullptr if not available /// Returns nullptr if the staging buffer is not available. [[nodiscard]] virtual IStagingBufferInterop* getStagingBufferInterop() = 0; }; } // namespace igl::base ================================================ FILE: src/igl/base/IFramebufferInterop.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::base { /// Maximum number of color attachments supported constexpr uint32_t kMaxColorAttachments = 4; /// @brief Framebuffer descriptor for interoperability struct FramebufferInteropDesc { AttachmentInteropDesc* colorAttachments[kMaxColorAttachments] = {}; AttachmentInteropDesc* depthAttachment = nullptr; AttachmentInteropDesc* stencilAttachment = nullptr; }; /// @brief Framebuffer interface for interoperability class IFramebufferInterop { public: virtual ~IFramebufferInterop() = default; /// @brief Get color attachment at specified index /// @param index The color attachment index (0 to kMaxColorAttachments-1) /// @return Non-owning pointer to the color attachmant, or nullptr if not set [[nodiscard]] virtual IAttachmentInterop* getColorAttachment(size_t index) const = 0; /// @brief Get depth attachment /// @return Non-owning pointer to the depth attachment, or nullptr if not set [[nodiscard]] virtual IAttachmentInterop* getDepthAttachment() const = 0; /// @brief Get native framebuffer handle (backend-specific) /// @return Platform-specific framebuffer handle if applicable, otherwise nullptr [[nodiscard]] virtual void* getNativeFramebuffer() const = 0; }; } // namespace igl::base ================================================ FILE: src/igl/base/IStagingBufferInterop.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::base { /// @brief Information about a staging buffer region for external copy command generation /// @note This struct is only valid until removeRegion() is called with it. /// After removeRegion(), the info becomes invalid and must not be used. struct StagingBufferRegionInfo { /// @brief Region handle for tracking uint64_t handle = 0; /// @brief Total size of the underlying staging buffer size_t size = 0; }; /// @brief Information about the destination for an upload operation struct UploadDestinationInfo { /// @brief Native handle to the destination resource (buffer or texture) void* nativeHandle = nullptr; /// @brief Byte offset within the destination resource size_t offset = 0; /// @brief Size of the upload region in bytes size_t size = 0; /// @brief Pointer to native struct with additional data for image uploads /// E.g. texture destination may require mip level, face index, etc. /// Must be set to nullptr for buffer uploads. void* imageData = nullptr; }; /// @brief Base staging buffer interface for interoperability class IStagingBufferInterop { public: /// @brief Allocate a staging buffer region of the specified size /// @param size The size in bytes of the region to allocate /// @return Info about the allocated region. Valid until removeRegion() is called. [[nodiscard]] virtual StagingBufferRegionInfo allocateRegion(size_t size) = 0; /// @brief Upload data to a buffer or texture via a staging buffer region /// @param region The staging buffer region info returned by allocateRegion() /// @param destInfo The destination info for the upload operation /// @param data Pointer to source data virtual void upload(const StagingBufferRegionInfo& region, const UploadDestinationInfo& destInfo, const void* data) = 0; /// @brief Release the staging buffer region /// @param info The staging buffer info returned by allocateRegion(). /// After this call, the info becomes invalid and must not be used. virtual void removeRegion(const StagingBufferRegionInfo& info) = 0; protected: // Protected to prevent destruction through this interface virtual ~IStagingBufferInterop() = default; }; } // namespace igl::base ================================================ FILE: src/igl/d3d12/Buffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include namespace igl::d3d12 { namespace { constexpr D3D12_RESOURCE_DESC makeBufferDesc( UINT64 size, D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE) { D3D12_RESOURCE_DESC desc = {}; desc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; desc.Alignment = 0; desc.Width = size; desc.Height = 1; desc.DepthOrArraySize = 1; desc.MipLevels = 1; desc.Format = DXGI_FORMAT_UNKNOWN; desc.SampleDesc.Count = 1; desc.SampleDesc.Quality = 0; desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; desc.Flags = flags; return desc; } } // namespace Buffer::Buffer(Device& device, igl::d3d12::ComPtr resource, const BufferDesc& desc, D3D12_RESOURCE_STATES initialState) : device_(&device), resource_(std::move(resource)), desc_(desc), defaultState_(computeDefaultState(desc)), currentState_(initialState) { // Determine storage type based on heap properties if (resource_.Get()) { D3D12_HEAP_PROPERTIES heapProps; D3D12_HEAP_FLAGS heapFlags; resource_->GetHeapProperties(&heapProps, &heapFlags); if (heapProps.Type == D3D12_HEAP_TYPE_UPLOAD) { storage_ = ResourceStorage::Shared; } else if (heapProps.Type == D3D12_HEAP_TYPE_READBACK) { storage_ = ResourceStorage::Shared; } else { storage_ = ResourceStorage::Private; } if (storage_ != ResourceStorage::Private) { currentState_ = D3D12_RESOURCE_STATE_GENERIC_READ; } // Track resource creation D3D12Context::trackResourceCreation("Buffer", desc_.length); } } Buffer::~Buffer() { if (resource_.Get()) { // Track resource destruction D3D12Context::trackResourceDestruction("Buffer", desc_.length); } if (mappedPtr_) { unmap(); } } Result Buffer::upload(const void* data, const BufferRange& range) { if (resource_.Get() == nullptr) { return Result(Result::Code::ArgumentInvalid, "Buffer resource is null"); } if (!data) { IGL_LOG_ERROR("Buffer::upload: data is NULL!\n"); return Result(Result::Code::ArgumentInvalid, "Upload data is null"); } // Validate range if (range.size == 0 || range.offset + range.size > desc_.length) { return Result(Result::Code::ArgumentOutOfRange, "Upload range is out of bounds"); } // For UPLOAD heap, map, copy, unmap if (storage_ == ResourceStorage::Shared) { void* mappedData = nullptr; D3D12_RANGE readRange = {0, 0}; // Not reading from GPU HRESULT hr = resource_->Map(0, &readRange, &mappedData); if (FAILED(hr)) { return Result(Result::Code::RuntimeError, "Failed to map buffer"); } uint8_t* dest = static_cast(mappedData) + range.offset; std::memcpy(dest, data, range.size); D3D12_RANGE writtenRange = {range.offset, range.offset + range.size}; resource_->Unmap(0, &writtenRange); return Result(Result::Code::Ok); } // For DEFAULT heap, need upload via intermediate buffer if (!device_) { return Result(Result::Code::RuntimeError, "Buffer device is null"); } auto& ctx = device_->getD3D12Context(); ID3D12Device* d3dDevice = ctx.getDevice(); ID3D12CommandQueue* queue = ctx.getCommandQueue(); if (!d3dDevice || !queue) { return Result(Result::Code::RuntimeError, "D3D12 device or command queue unavailable"); } // Reclaim completed upload buffers before allocating new ones. device_->processCompletedUploads(); UploadRingBuffer* ringBuffer = device_->getUploadRingBuffer(); UploadRingBuffer::Allocation ringAllocation; bool useRingBuffer = false; // Get fence value that will signal when this upload completes const UINT64 uploadFenceValue = device_->getNextUploadFenceValue(); if (ringBuffer) { // D3D12 requires 256-byte alignment (D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT) ringAllocation = ringBuffer->allocate( range.size, D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT, uploadFenceValue); if (ringAllocation.valid) { // Successfully allocated from ring buffer std::memcpy(ringAllocation.cpuAddress, data, range.size); useRingBuffer = true; } } // Fallback: create temporary upload buffer if ring buffer allocation failed igl::d3d12::ComPtr uploadBuffer; HRESULT hr = S_OK; if (!useRingBuffer) { D3D12_HEAP_PROPERTIES uploadHeapProps = {}; uploadHeapProps.Type = D3D12_HEAP_TYPE_UPLOAD; const auto uploadDesc = makeBufferDesc(range.size); hr = d3dDevice->CreateCommittedResource(&uploadHeapProps, D3D12_HEAP_FLAG_NONE, &uploadDesc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(uploadBuffer.GetAddressOf())); if (FAILED(hr)) { return Result(Result::Code::RuntimeError, "Failed to create upload buffer"); } void* mapped = nullptr; D3D12_RANGE rr = {0, 0}; hr = uploadBuffer->Map(0, &rr, &mapped); if (FAILED(hr) || mapped == nullptr) { return Result(Result::Code::RuntimeError, "Failed to map upload buffer"); } std::memcpy(mapped, data, range.size); uploadBuffer->Unmap(0, nullptr); } igl::d3d12::ComPtr allocator = device_->getUploadCommandAllocator(); if (!allocator.Get()) { return Result(Result::Code::RuntimeError, "Failed to get command allocator from pool"); } igl::d3d12::ComPtr cmdList; hr = d3dDevice->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, allocator.Get(), nullptr, IID_PPV_ARGS(cmdList.GetAddressOf())); if (FAILED(hr)) { // Return allocator to pool with fence value 0 (immediately available) device_->returnUploadCommandAllocator(allocator, 0); return Result(Result::Code::RuntimeError, "Failed to create command list for upload"); } if (currentState_ != D3D12_RESOURCE_STATE_COPY_DEST) { // Validate state transition and insert intermediate state if needed const bool needsIntermediate = !D3D12StateTransition::isLegalDirectTransition( currentState_, D3D12_RESOURCE_STATE_COPY_DEST); if (needsIntermediate) { // Transition to COMMON first D3D12_RESOURCE_BARRIER toCommon = {}; toCommon.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; toCommon.Transition.pResource = resource_.Get(); toCommon.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; toCommon.Transition.StateBefore = currentState_; toCommon.Transition.StateAfter = D3D12_RESOURCE_STATE_COMMON; cmdList->ResourceBarrier(1, &toCommon); currentState_ = D3D12_RESOURCE_STATE_COMMON; } // Now transition to COPY_DEST (guaranteed legal from COMMON or if direct was legal) D3D12_RESOURCE_BARRIER toCopyDest = {}; toCopyDest.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; toCopyDest.Transition.pResource = resource_.Get(); toCopyDest.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; toCopyDest.Transition.StateBefore = currentState_; toCopyDest.Transition.StateAfter = D3D12_RESOURCE_STATE_COPY_DEST; cmdList->ResourceBarrier(1, &toCopyDest); } // Copy from either ring buffer or temporary upload buffer if (useRingBuffer) { cmdList->CopyBufferRegion(resource_.Get(), range.offset, ringBuffer->getUploadHeap(), ringAllocation.offset, range.size); } else { cmdList->CopyBufferRegion(resource_.Get(), range.offset, uploadBuffer.Get(), 0, range.size); } // Prepare state transition barriers but defer state update until after GPU completes D3D12_RESOURCE_STATES postState = (defaultState_ == D3D12_RESOURCE_STATE_COMMON) ? D3D12_RESOURCE_STATE_GENERIC_READ : defaultState_; if (postState != D3D12_RESOURCE_STATE_COPY_DEST) { // Validate state transition and insert intermediate state if needed const bool needsIntermediate = !D3D12StateTransition::isLegalDirectTransition(D3D12_RESOURCE_STATE_COPY_DEST, postState); if (needsIntermediate) { // Transition to COMMON first D3D12_RESOURCE_BARRIER toCommon = {}; toCommon.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; toCommon.Transition.pResource = resource_.Get(); toCommon.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; toCommon.Transition.StateBefore = D3D12_RESOURCE_STATE_COPY_DEST; toCommon.Transition.StateAfter = D3D12_RESOURCE_STATE_COMMON; cmdList->ResourceBarrier(1, &toCommon); // Then transition to final state D3D12_RESOURCE_BARRIER toFinal = {}; toFinal.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; toFinal.Transition.pResource = resource_.Get(); toFinal.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; toFinal.Transition.StateBefore = D3D12_RESOURCE_STATE_COMMON; toFinal.Transition.StateAfter = postState; cmdList->ResourceBarrier(1, &toFinal); } else { // Direct transition is legal D3D12_RESOURCE_BARRIER toDefault = {}; toDefault.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; toDefault.Transition.pResource = resource_.Get(); toDefault.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; toDefault.Transition.StateBefore = D3D12_RESOURCE_STATE_COPY_DEST; toDefault.Transition.StateAfter = postState; cmdList->ResourceBarrier(1, &toDefault); } } hr = cmdList->Close(); if (FAILED(hr)) { // Return allocator to pool with fence value 0 (immediately available) device_->returnUploadCommandAllocator(allocator, 0); return Result(Result::Code::RuntimeError, "Failed to close upload command list"); } ID3D12CommandList* lists[] = {cmdList.Get()}; queue->ExecuteCommandLists(1, lists); // Ensure the allocator is not reused until GPU completes execution ID3D12Fence* uploadFence = device_->getUploadFence(); // Signal must succeed; otherwise fence will never reach uploadFenceValue hr = queue->Signal(uploadFence, uploadFenceValue); if (FAILED(hr)) { // Return allocator immediately (no fence wait needed) device_->returnUploadCommandAllocator(allocator, 0); // Check for device removal to provide richer diagnostics Result deviceStatus = device_->checkDeviceRemoval(); if (!deviceStatus.isOk()) { return deviceStatus; // Device removed - return specific error } return Result(Result::Code::RuntimeError, "Failed to signal upload fence"); } // Return allocator to pool with fence value (will be reused after fence is signaled) device_->returnUploadCommandAllocator(allocator, uploadFenceValue); // Only track temporary upload buffers (ring buffer is persistent) // Pass uploadFenceValue (already signaled above) to track with correct fence if (!useRingBuffer && uploadBuffer.Get()) { device_->trackUploadBuffer(std::move(uploadBuffer), uploadFenceValue); } // Wait for upload fence to signal before returning. // This ensures the buffer upload completes before the caller uses it. Result waitResult = device_->waitForUploadFence(uploadFenceValue); if (!waitResult.isOk()) { return waitResult; } // Now safe to update resource state; GPU upload has completed currentState_ = (postState != D3D12_RESOURCE_STATE_COPY_DEST) ? postState : D3D12_RESOURCE_STATE_COPY_DEST; return Result(Result::Code::Ok); } void* Buffer::map(const BufferRange& range, Result* IGL_NULLABLE outResult) { if (resource_.Get() == nullptr) { Result::setResult(outResult, Result::Code::ArgumentInvalid, "Buffer resource is null"); return nullptr; } // Validate range if (range.offset > desc_.length || range.size > desc_.length || (range.offset + range.size) > desc_.length) { Result::setResult(outResult, Result::Code::ArgumentOutOfRange, "Map range is out of bounds"); return nullptr; } // Handle mapping of DEFAULT heap storage buffers requested as Shared // This happens when compute shader output buffers need to be read back const bool isStorageBuffer = (desc_.type & BufferDesc::BufferTypeBits::Storage) != 0; const bool requestedShared = (desc_.storage == ResourceStorage::Shared || desc_.storage == ResourceStorage::Managed); const bool needsReadbackStaging = (storage_ != ResourceStorage::Shared) && isStorageBuffer && requestedShared; if (needsReadbackStaging) { // Storage buffer in DEFAULT heap but requested as Shared - need staging if (!device_) { Result::setResult(outResult, Result::Code::RuntimeError, "Device is null"); return nullptr; } auto& ctx = device_->getD3D12Context(); auto* d3dDevice = ctx.getDevice(); auto* queue = ctx.getCommandQueue(); if (!d3dDevice || !queue) { Result::setResult(outResult, Result::Code::RuntimeError, "D3D12 device or queue is null"); return nullptr; } // Create READBACK staging buffer if not already created if (!readbackStagingBuffer_.Get()) { D3D12_HEAP_PROPERTIES readbackHeap = {}; readbackHeap.Type = D3D12_HEAP_TYPE_READBACK; readbackHeap.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; readbackHeap.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; D3D12_RESOURCE_DESC bufferDesc = {}; bufferDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; bufferDesc.Alignment = 0; bufferDesc.Width = desc_.length; bufferDesc.Height = 1; bufferDesc.DepthOrArraySize = 1; bufferDesc.MipLevels = 1; bufferDesc.Format = DXGI_FORMAT_UNKNOWN; bufferDesc.SampleDesc.Count = 1; bufferDesc.SampleDesc.Quality = 0; bufferDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; bufferDesc.Flags = D3D12_RESOURCE_FLAG_NONE; HRESULT hr = d3dDevice->CreateCommittedResource(&readbackHeap, D3D12_HEAP_FLAG_NONE, &bufferDesc, D3D12_RESOURCE_STATE_COPY_DEST, nullptr, IID_PPV_ARGS(readbackStagingBuffer_.GetAddressOf())); if (FAILED(hr)) { Result::setResult( outResult, Result::Code::RuntimeError, "Failed to create readback staging buffer"); return nullptr; } } // ALWAYS copy from DEFAULT buffer to readback staging when mapping // The DEFAULT buffer content may have changed since the last map() call // (e.g., via copyTextureToBuffer or compute shader writes) IGL_D3D12_LOG_VERBOSE( "Buffer::map() - Copying from DEFAULT buffer (resource=%p) to readback staging\n", resource_.Get()); // D-001: Use pooled allocator instead of creating transient one auto allocator = device_->getUploadCommandAllocator(); if (!allocator.Get()) { Result::setResult(outResult, Result::Code::RuntimeError, "Failed to get allocator from pool"); return nullptr; } igl::d3d12::ComPtr cmdList; if (FAILED(d3dDevice->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, allocator.Get(), nullptr, IID_PPV_ARGS(cmdList.GetAddressOf())))) { Result::setResult( outResult, Result::Code::RuntimeError, "Failed to create command list for buffer copy"); // D-001: Return allocator to pool even on failure device_->returnUploadCommandAllocator(allocator, 0); return nullptr; } // Transition source buffer to COPY_SOURCE with validation. const D3D12_RESOURCE_STATES assumedState = D3D12_RESOURCE_STATE_UNORDERED_ACCESS; const bool needsIntermediate = !D3D12StateTransition::isLegalDirectTransition( assumedState, D3D12_RESOURCE_STATE_COPY_SOURCE); if (needsIntermediate) { // Transition to COMMON first D3D12_RESOURCE_BARRIER toCommon = {}; toCommon.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; toCommon.Transition.pResource = resource_.Get(); toCommon.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; toCommon.Transition.StateBefore = assumedState; toCommon.Transition.StateAfter = D3D12_RESOURCE_STATE_COMMON; cmdList->ResourceBarrier(1, &toCommon); // Then to COPY_SOURCE D3D12_RESOURCE_BARRIER toCopySource = {}; toCopySource.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; toCopySource.Transition.pResource = resource_.Get(); toCopySource.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; toCopySource.Transition.StateBefore = D3D12_RESOURCE_STATE_COMMON; toCopySource.Transition.StateAfter = D3D12_RESOURCE_STATE_COPY_SOURCE; cmdList->ResourceBarrier(1, &toCopySource); } else { // Direct transition is legal D3D12_RESOURCE_BARRIER barrier = {}; barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; barrier.Transition.pResource = resource_.Get(); barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; barrier.Transition.StateBefore = assumedState; barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_COPY_SOURCE; cmdList->ResourceBarrier(1, &barrier); } // Copy entire buffer. cmdList->CopyBufferRegion(readbackStagingBuffer_.Get(), 0, resource_.Get(), 0, desc_.length); // Transition back with validation. const bool needsIntermediateBack = !D3D12StateTransition::isLegalDirectTransition( D3D12_RESOURCE_STATE_COPY_SOURCE, assumedState); if (needsIntermediateBack) { // Transition to COMMON first D3D12_RESOURCE_BARRIER toCommon = {}; toCommon.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; toCommon.Transition.pResource = resource_.Get(); toCommon.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; toCommon.Transition.StateBefore = D3D12_RESOURCE_STATE_COPY_SOURCE; toCommon.Transition.StateAfter = D3D12_RESOURCE_STATE_COMMON; cmdList->ResourceBarrier(1, &toCommon); // Then back to original state D3D12_RESOURCE_BARRIER toOriginal = {}; toOriginal.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; toOriginal.Transition.pResource = resource_.Get(); toOriginal.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; toOriginal.Transition.StateBefore = D3D12_RESOURCE_STATE_COMMON; toOriginal.Transition.StateAfter = assumedState; cmdList->ResourceBarrier(1, &toOriginal); } else { // Direct transition is legal D3D12_RESOURCE_BARRIER barrier = {}; barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; barrier.Transition.pResource = resource_.Get(); barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_COPY_SOURCE; barrier.Transition.StateAfter = assumedState; cmdList->ResourceBarrier(1, &barrier); } cmdList->Close(); ID3D12CommandList* lists[] = {cmdList.Get()}; queue->ExecuteCommandLists(1, lists); // Wait for copy to complete ctx.waitForGPU(); // D-001: Return allocator to pool after synchronous GPU wait device_->returnUploadCommandAllocator(allocator, 0); // Map the READBACK staging buffer D3D12_RANGE readRange = {static_cast(range.offset), static_cast(range.offset + range.size)}; HRESULT hr = readbackStagingBuffer_->Map(0, &readRange, &mappedPtr_); if (FAILED(hr)) { Result::setResult( outResult, Result::Code::RuntimeError, "Failed to map readback staging buffer"); return nullptr; } Result::setOk(outResult); return static_cast(mappedPtr_) + range.offset; } // Standard path for UPLOAD/READBACK heap buffers if (storage_ != ResourceStorage::Shared) { Result::setResult(outResult, Result::Code::Unsupported, "Cannot map GPU-only buffer (use ResourceStorage::Shared)"); return nullptr; } if (mappedPtr_) { // Already mapped, return offset pointer Result::setOk(outResult); return static_cast(mappedPtr_) + range.offset; } D3D12_RANGE readRange = {0, 0}; // Not reading from GPU HRESULT hr = resource_->Map(0, &readRange, &mappedPtr_); if (FAILED(hr)) { Result::setResult(outResult, Result::Code::RuntimeError, "Failed to map buffer"); return nullptr; } Result::setOk(outResult); return static_cast(mappedPtr_) + range.offset; } void Buffer::unmap() { if (!mappedPtr_) { return; } // Unmap the appropriate resource (staging buffer or main buffer) if (readbackStagingBuffer_.Get()) { readbackStagingBuffer_->Unmap(0, nullptr); } else if (resource_.Get()) { resource_->Unmap(0, nullptr); } mappedPtr_ = nullptr; } BufferDesc::BufferAPIHint Buffer::requestedApiHints() const noexcept { return desc_.hint; } BufferDesc::BufferAPIHint Buffer::acceptedApiHints() const noexcept { return desc_.hint; } ResourceStorage Buffer::storage() const noexcept { return storage_; } size_t Buffer::getSizeInBytes() const { return desc_.length; } uint64_t Buffer::gpuAddress(size_t offset) const { if (resource_.Get() == nullptr) { return 0; } return resource_->GetGPUVirtualAddress() + offset; } BufferDesc::BufferType Buffer::getBufferType() const { return desc_.type; } D3D12_RESOURCE_STATES Buffer::computeDefaultState(const BufferDesc& desc) const { D3D12_RESOURCE_STATES state = D3D12_RESOURCE_STATE_COMMON; if ((desc.type & BufferDesc::BufferTypeBits::Storage) != 0) { state |= D3D12_RESOURCE_STATE_UNORDERED_ACCESS; } if ((desc.type & BufferDesc::BufferTypeBits::Vertex) != 0 || (desc.type & BufferDesc::BufferTypeBits::Uniform) != 0) { state |= D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER; } if ((desc.type & BufferDesc::BufferTypeBits::Index) != 0) { state |= D3D12_RESOURCE_STATE_INDEX_BUFFER; } if ((desc.type & BufferDesc::BufferTypeBits::Indirect) != 0) { state |= D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT; } if (state == D3D12_RESOURCE_STATE_COMMON) { return D3D12_RESOURCE_STATE_GENERIC_READ; } // Remove COMMON bit if other bits are set. state &= ~D3D12_RESOURCE_STATE_COMMON; return state; } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/Buffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::d3d12 { class Device; class Buffer final : public IBuffer, public std::enable_shared_from_this { public: Buffer(Device& device, igl::d3d12::ComPtr resource, const BufferDesc& desc, D3D12_RESOURCE_STATES initialState); ~Buffer() override; Result upload(const void* data, const BufferRange& range) override; void* map(const BufferRange& range, Result* IGL_NULLABLE outResult) override; void unmap() override; BufferDesc::BufferAPIHint requestedApiHints() const noexcept override; BufferDesc::BufferAPIHint acceptedApiHints() const noexcept override; ResourceStorage storage() const noexcept override; size_t getSizeInBytes() const override; uint64_t gpuAddress(size_t offset = 0) const override; BufferDesc::BufferType getBufferType() const override; // D3D12-specific accessors ID3D12Resource* getResource() const { return resource_.Get(); } // Returns the element stride in bytes for storage buffers, as provided in BufferDesc. // A value of 0 means "unspecified"; callers should fall back to a reasonable default // (e.g. 4 bytes) when this occurs. size_t getStorageElementStride() const noexcept { return desc_.storageStride; } private: [[nodiscard]] D3D12_RESOURCE_STATES computeDefaultState(const BufferDesc& desc) const; Device* device_ = nullptr; igl::d3d12::ComPtr resource_; BufferDesc desc_; void* mappedPtr_ = nullptr; ResourceStorage storage_ = ResourceStorage::Private; D3D12_RESOURCE_STATES defaultState_ = D3D12_RESOURCE_STATE_GENERIC_READ; // State tracking: single non-mutable field, updated only via non-const methods D3D12_RESOURCE_STATES currentState_ = D3D12_RESOURCE_STATE_COMMON; // Staging buffer for mapping DEFAULT heap storage buffers requested as Shared igl::d3d12::ComPtr readbackStagingBuffer_; }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/CMakeLists.txt ================================================ # Copyright (c) Meta Platforms, Inc. and affiliates. # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. cmake_minimum_required(VERSION 3.19) project(IGLD3D12 CXX C) file(GLOB SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp) file(GLOB HEADER_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.h) add_library(IGLD3D12 ${SRC_FILES} ${HEADER_FILES}) target_link_libraries(IGLD3D12 PRIVATE IGLLibrary IGLGlslang) igl_set_cxxstd(IGLD3D12 20) igl_set_folder(IGLD3D12 "IGL") # Link DirectX 12 system libraries target_link_libraries(IGLD3D12 PUBLIC d3d12.lib dxgi.lib dxguid.lib dxcompiler.lib d3dcompiler.lib ) target_compile_definitions(IGLD3D12 PUBLIC "NOMINMAX") # DirectX headers (fetched via bootstrap-deps) if(NOT DIRECTX_HEADERS_INCLUDE_DIR) set(DIRECTX_HEADERS_INCLUDE_DIR "${IGL_ROOT_DIR}/third-party/deps/src/DirectX-Headers/include/directx") endif() target_include_directories(IGLD3D12 PUBLIC "${DIRECTX_HEADERS_INCLUDE_DIR}") if(TARGET Microsoft::DirectX-Headers) target_link_libraries(IGLD3D12 PUBLIC Microsoft::DirectX-Headers) endif() # Include SPIRV-Cross for potential SPIR-V to HLSL conversion target_include_directories(IGLD3D12 PUBLIC "${IGL_ROOT_DIR}/third-party/deps/src/SPIRV-Cross") target_include_directories(IGLD3D12 PUBLIC "${IGL_ROOT_DIR}/third-party/deps/src/glslang") # Windows-specific definitions (removed - defined in D3D12Headers.h to avoid conflicts) if(WIN32 AND MSVC) # Enable multithreaded compilation target_compile_options(IGLD3D12 PRIVATE "/MP") # Disable NOMINMAX warning (already defined in D3D12Headers.h) target_compile_options(IGLD3D12 PRIVATE "/wd4005") # Note: /Zc:preprocessor (conformant preprocessor) causes issues with # some d3dx12 headers and WRL, so we're using the traditional preprocessor # Note: dxil.dll deployment is now handled by individual executable targets # (shell sessions and tests) to ensure it's copied to the correct directories. # See shell/windows/CMakeLists.txt and src/igl/tests/CMakeLists.txt endif() ================================================ FILE: src/igl/d3d12/CommandBuffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #include #include namespace igl::d3d12 { CommandBuffer::CommandBuffer(Device& device, const CommandBufferDesc& desc) : ICommandBuffer(desc), device_(device) { auto* d3dDevice = device_.getD3D12Context().getDevice(); if (!d3dDevice) { IGL_DEBUG_ASSERT(false, "D3D12 device is null - context not initialized"); IGL_LOG_ERROR("D3D12 device is null - context not initialized"); return; // Leave commandList_ null to indicate failure } // Check if device is in good state HRESULT deviceRemovedReason = d3dDevice->GetDeviceRemovedReason(); if (FAILED(deviceRemovedReason)) { char errorMsg[512]; snprintf(errorMsg, sizeof(errorMsg), "D3D12 device was removed before creating command buffer. Reason: 0x%08X\n" " 0x887A0005 = DXGI_ERROR_DEVICE_REMOVED\n" " 0x887A0006 = DXGI_ERROR_DEVICE_HUNG\n" " 0x887A0007 = DXGI_ERROR_DEVICE_RESET\n" " 0x887A0020 = DXGI_ERROR_DRIVER_INTERNAL_ERROR", static_cast(deviceRemovedReason)); IGL_LOG_ERROR(errorMsg); IGL_DEBUG_ASSERT(false, "Device removed - see error above"); return; // Leave commandList_ null to indicate failure } // Use the current frame's command allocator - allocators are created ready-to-use // Following Microsoft's D3D12HelloFrameBuffering: each frame has its own allocator auto& ctx = device_.getD3D12Context(); const uint32_t frameIdx = ctx.getCurrentFrameIndex(); auto* frameAllocator = ctx.getFrameContexts()[frameIdx].allocator.Get(); HRESULT hr = d3dDevice->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, frameAllocator, // Use frame allocator directly - it's // in ready-to-use state after creation nullptr, IID_PPV_ARGS(commandList_.GetAddressOf())); if (FAILED(hr)) { char errorMsg[256]; snprintf(errorMsg, sizeof(errorMsg), "Failed to create command list: HRESULT = 0x%08X", static_cast(hr)); IGL_DEBUG_ASSERT(false, "%s", errorMsg); IGL_LOG_ERROR(errorMsg); return; // Leave commandList_ null to indicate failure } // Command lists are created in recording state, close it for now commandList_->Close(); // Create scheduling fence for waitUntilScheduled() support // D-003: Fence event is now created per-wait in waitUntilScheduled() to eliminate TOCTOU race hr = d3dDevice->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(scheduleFence_.GetAddressOf())); if (FAILED(hr)) { char errorMsg[256]; snprintf(errorMsg, sizeof(errorMsg), "Failed to create scheduling fence: HRESULT = 0x%08X", static_cast(hr)); IGL_DEBUG_ASSERT(false, "%s", errorMsg); IGL_LOG_ERROR(errorMsg); return; // Leave fence null to indicate failure } } CommandBuffer::~CommandBuffer() { // D-003: No need to clean up scheduleFenceEvent_ - now using dedicated events per wait // scheduleFence_ is a ComPtr and will be automatically released } // Pre-allocated descriptor heap with fail-fast on exhaustion. // Allocates from pre-allocated pages, switching pages as needed. // Fails immediately if all pages are exhausted (Vulkan fail-fast pattern). Result CommandBuffer::getNextCbvSrvUavDescriptor(uint32_t* outDescriptorIndex) { auto& ctx = device_.getD3D12Context(); const uint32_t frameIdx = ctx.getCurrentFrameIndex(); auto& frameCtx = ctx.getFrameContexts()[frameIdx]; auto& pages = frameCtx.cbvSrvUavHeapPages; uint32_t currentPageIdx = frameCtx.currentCbvSrvUavPageIndex; // Validate we have at least one page if (pages.empty()) { return Result{Result::Code::RuntimeError, "No CBV/SRV/UAV descriptor heap pages available"}; } // Get current page index validation if (currentPageIdx >= pages.size()) { return Result{Result::Code::RuntimeError, "Invalid descriptor heap page index"}; } // Check current offset before acquiring reference (avoid use-after-reallocation) const uint32_t currentOffset = frameCtx.nextCbvSrvUavDescriptor; // Check if current page has space; fail fast if pre-allocation is enabled. if (currentOffset >= pages[currentPageIdx].capacity) { // Current page is full - check if we can move to next page const uint32_t nextPageIdx = currentPageIdx + 1; // Fail-fast if pre-allocated pages are exhausted (Vulkan pattern). if (nextPageIdx >= pages.size()) { char errorMsg[512]; // All pages exhausted - fail immediately (no mid-frame allocation). // Calculate actual descriptor capacity from allocated pages. uint32_t totalCapacity = 0; for (const auto& page : pages) { totalCapacity += page.capacity; } snprintf(errorMsg, sizeof(errorMsg), "CBV/SRV/UAV descriptor heap exhausted! Frame %u used all %zu pre-allocated pages " "(%u descriptors total). " "This frame requires more descriptors than available. " "Increase D3D12ContextConfig::maxHeapPages or enable " "preAllocateDescriptorPages=true, or optimize descriptor usage.", frameIdx, pages.size(), totalCapacity); return Result{Result::Code::RuntimeError, errorMsg}; } // Move to next pre-allocated page. currentPageIdx = nextPageIdx; frameCtx.currentCbvSrvUavPageIndex = currentPageIdx; frameCtx.nextCbvSrvUavDescriptor = 0; // Reset offset for new page IGL_D3D12_LOG_VERBOSE("D3D12: Switching to pre-allocated CBV/SRV/UAV page %u for frame %u\n", currentPageIdx, frameIdx); // Update active heap when switching pages. frameCtx.activeCbvSrvUavHeap = pages[currentPageIdx].heap; // Rebind heap on the command list when switching pages. if (commandList_.Get()) { ID3D12DescriptorHeap* heaps[] = {frameCtx.activeCbvSrvUavHeap.Get(), frameCtx.samplerHeap.Get()}; commandList_->SetDescriptorHeaps(2, heaps); IGL_D3D12_LOG_VERBOSE("D3D12: Rebound descriptor heaps after switching to page %u\n", currentPageIdx); } } // SAFE: Acquire reference AFTER any potential reallocation from emplace_back auto& currentPage = pages[currentPageIdx]; // Allocate from current page const uint32_t descriptorIndex = frameCtx.nextCbvSrvUavDescriptor++; currentPage.used = frameCtx.nextCbvSrvUavDescriptor; // Track peak usage for telemetry const uint32_t totalUsed = static_cast(currentPageIdx * kDescriptorsPerPage + descriptorIndex); if (totalUsed > frameCtx.peakCbvSrvUavUsage) { frameCtx.peakCbvSrvUavUsage = totalUsed; } // Return the descriptor index within the current page *outDescriptorIndex = descriptorIndex; #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE( "CommandBuffer::getNextCbvSrvUavDescriptor() - frame %u, page %u, descriptor %u (total " "allocated: %u)\n", frameIdx, currentPageIdx, descriptorIndex, totalUsed); #endif return Result{}; } // Allocate a contiguous range of CBV/SRV/UAV descriptors from pre-allocated pages. // Ensures the range can be bound as a single descriptor table. // Fails immediately if all pages are exhausted (Vulkan fail-fast pattern). Result CommandBuffer::allocateCbvSrvUavRange(uint32_t count, uint32_t* outBaseDescriptorIndex) { if (count == 0) { return Result{Result::Code::ArgumentInvalid, "Cannot allocate zero descriptors"}; } auto& ctx = device_.getD3D12Context(); const uint32_t frameIdx = ctx.getCurrentFrameIndex(); auto& frameCtx = ctx.getFrameContexts()[frameIdx]; auto& pages = frameCtx.cbvSrvUavHeapPages; uint32_t currentPageIdx = frameCtx.currentCbvSrvUavPageIndex; if (pages.empty()) { return Result{Result::Code::RuntimeError, "No CBV/SRV/UAV descriptor heap pages available"}; } if (currentPageIdx >= pages.size()) { return Result{Result::Code::RuntimeError, "Invalid descriptor heap page index"}; } // Check space before acquiring reference (avoid use-after-reallocation) const uint32_t currentOffset = frameCtx.nextCbvSrvUavDescriptor; const uint32_t spaceRemaining = pages[currentPageIdx].capacity - currentOffset; // Check if the requested range fits in the current page; fail fast on exhaustion. if (count > spaceRemaining) { // Not enough space in current page - validate range and check for next page if (count > kDescriptorsPerPage) { char errorMsg[256]; snprintf(errorMsg, sizeof(errorMsg), "Requested descriptor range (%u) exceeds page capacity (%u)", count, kDescriptorsPerPage); return Result{Result::Code::ArgumentOutOfRange, errorMsg}; } // Move to next pre-allocated page (fail-fast if exhausted). const uint32_t nextPageIdx = currentPageIdx + 1; if (nextPageIdx >= pages.size()) { char errorMsg[512]; snprintf(errorMsg, sizeof(errorMsg), "CBV/SRV/UAV descriptor heap exhausted! Frame %u needs page %u for contiguous range " "of %u descriptors, " "but only %zu pages are pre-allocated. " "Increase D3D12ContextConfig::maxHeapPages or optimize descriptor usage.", frameIdx, nextPageIdx, count, pages.size()); return Result{Result::Code::RuntimeError, errorMsg}; } // Move to next pre-allocated page currentPageIdx = nextPageIdx; frameCtx.currentCbvSrvUavPageIndex = currentPageIdx; frameCtx.nextCbvSrvUavDescriptor = 0; IGL_D3D12_LOG_VERBOSE( "D3D12: Switching to pre-allocated CBV/SRV/UAV page %u for contiguous range of %u " "descriptors\n", currentPageIdx, count); // Rebind heap on command list when switching pages frameCtx.activeCbvSrvUavHeap = pages[currentPageIdx].heap; if (commandList_.Get()) { ID3D12DescriptorHeap* heaps[] = {frameCtx.activeCbvSrvUavHeap.Get(), frameCtx.samplerHeap.Get()}; commandList_->SetDescriptorHeaps(2, heaps); } } // SAFE: Acquire reference AFTER any potential reallocation from emplace_back auto& currentPage = pages[currentPageIdx]; // Allocate the range from current page const uint32_t baseIndex = frameCtx.nextCbvSrvUavDescriptor; frameCtx.nextCbvSrvUavDescriptor += count; currentPage.used = frameCtx.nextCbvSrvUavDescriptor; // Track peak usage const uint32_t totalUsed = static_cast(currentPageIdx * kDescriptorsPerPage + baseIndex + count); if (totalUsed > frameCtx.peakCbvSrvUavUsage) { frameCtx.peakCbvSrvUavUsage = totalUsed; } *outBaseDescriptorIndex = baseIndex; #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE( "CommandBuffer::allocateCbvSrvUavRange() - frame %u, page %u, base %u, count %u\n", frameIdx, currentPageIdx, baseIndex, count); #endif return Result{}; } uint32_t& CommandBuffer::getNextSamplerDescriptor() { auto& ctx = device_.getD3D12Context(); const uint32_t frameIdx = ctx.getCurrentFrameIndex(); auto& frameCtx = ctx.getFrameContexts()[frameIdx]; // Add bounds checking to prevent sampler descriptor heap overflow. // The sampler heap is allocated with kSamplerHeapSize descriptors. const uint32_t currentValue = frameCtx.nextSamplerDescriptor; // Track peak usage for telemetry (before incrementing) if (currentValue > frameCtx.peakSamplerUsage) { frameCtx.peakSamplerUsage = currentValue; // Warn if approaching capacity (>80%) const float usage = static_cast(currentValue) / static_cast(kSamplerHeapSize); if (usage > 0.8f) { IGL_LOG_ERROR("D3D12: Sampler descriptor usage at %.1f%% capacity (%u/%u) for frame %u\n", usage * 100.0f, currentValue, kSamplerHeapSize, frameIdx); } } // CRITICAL: Assert on overflow in debug builds IGL_DEBUG_ASSERT( currentValue < kSamplerHeapSize, "D3D12: Sampler descriptor heap overflow! Allocated: %u, Capacity: %u (frame %u). " "This will cause memory corruption and device removal. Increase heap size or optimize " "descriptor usage.", currentValue, kSamplerHeapSize, frameIdx); // Graceful degradation in release builds: clamp to last valid descriptor if (currentValue >= kSamplerHeapSize) { IGL_LOG_ERROR( "D3D12: Sampler descriptor heap overflow! Allocated: %u, Capacity: %u (frame %u)\n" "Clamping to last valid descriptor. Rendering artifacts expected.\n", currentValue, kSamplerHeapSize, frameIdx); // Return reference to a clamped value to prevent further damage // This will cause rendering artifacts but prevent crashes static uint32_t clampedValue = kSamplerHeapSize - 1; return clampedValue; } #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE("CommandBuffer::getNextSamplerDescriptor() - frame %u, current value=%u\n", frameIdx, currentValue); #endif return frameCtx.nextSamplerDescriptor; } void CommandBuffer::trackTransientBuffer(std::shared_ptr buffer) { // Add to the CURRENT frame's transient buffer list // These will be kept alive until the frame completes GPU execution auto& ctx = device_.getD3D12Context(); const uint32_t frameIdx = ctx.getCurrentFrameIndex(); auto& frameCtx = ctx.getFrameContexts()[frameIdx]; frameCtx.transientBuffers.push_back(std::move(buffer)); // Track high-water mark for telemetry. const size_t currentCount = frameCtx.transientBuffers.size(); if (currentCount > frameCtx.transientBuffersHighWater) { frameCtx.transientBuffersHighWater = currentCount; } #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE( "CommandBuffer::trackTransientBuffer() - Added buffer to frame %u (total=%zu, " "high-water=%zu)\n", frameIdx, currentCount, frameCtx.transientBuffersHighWater); #endif } void CommandBuffer::trackTransientResource(ID3D12Resource* resource) { if (!resource) { return; } auto& ctx = device_.getD3D12Context(); const uint32_t frameIdx = ctx.getCurrentFrameIndex(); auto& frameCtx = ctx.getFrameContexts()[frameIdx]; igl::d3d12::ComPtr keepAlive; resource->AddRef(); keepAlive.Attach(resource); frameCtx.transientResources.push_back(std::move(keepAlive)); // Track high-water mark for telemetry. const size_t currentCount = frameCtx.transientResources.size(); if (currentCount > frameCtx.transientResourcesHighWater) { frameCtx.transientResourcesHighWater = currentCount; } #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE( "CommandBuffer::trackTransientResource() - Added resource to frame %u (total=%zu, " "high-water=%zu)\n", frameIdx, currentCount, frameCtx.transientResourcesHighWater); #endif } Result CommandBuffer::begin() { if (recording_) { return Result(); } // NOTE: Transient buffers are now stored in FrameContext and cleared when advancing frames // NOTE: Descriptor counters are now stored in FrameContext and shared across all CommandBuffers // They are reset at the start of each frame in CommandQueue::submit(), not here // Reset per-command-buffer draw count for this recording currentDrawCount_ = 0; // CRITICAL: Set the per-frame descriptor heaps before recording commands. // Each frame has its own isolated heaps to prevent descriptor conflicts. // Uses the current page's heap (will be updated if we grow to new pages). auto& ctx = device_.getD3D12Context(); const uint32_t frameIdx = ctx.getCurrentFrameIndex(); auto& frameCtx = ctx.getFrameContexts()[frameIdx]; // Initialize active heap to current page at frame start. if (frameCtx.cbvSrvUavHeapPages.empty()) { const char* msg = "No CBV/SRV/UAV heap pages available"; IGL_LOG_ERROR("CommandBuffer::begin() - %s for frame %u\n", msg, frameIdx); return Result(Result::Code::RuntimeError, msg); } frameCtx.activeCbvSrvUavHeap = frameCtx.cbvSrvUavHeapPages[frameCtx.currentCbvSrvUavPageIndex].heap; if (!frameCtx.activeCbvSrvUavHeap.Get()) { const char* msg = "No CBV/SRV/UAV heap available"; IGL_LOG_ERROR("CommandBuffer::begin() - %s for frame %u\n", msg, frameIdx); return Result(Result::Code::RuntimeError, msg); } // Use the CURRENT FRAME's command allocator from FrameContext // Following Microsoft's D3D12HelloFrameBuffering pattern auto* frameAllocator = ctx.getFrameContexts()[frameIdx].allocator.Get(); // Microsoft pattern: Reset allocator THEN reset command list // Allocator was reset in CommandQueue::submit() after fence wait, OR is in initial ready state #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE( "CommandBuffer::begin() - Frame %u: Resetting command list with allocator...\n", frameIdx); #endif HRESULT hr = commandList_->Reset(frameAllocator, nullptr); if (FAILED(hr)) { IGL_LOG_ERROR("CommandBuffer::begin() - Reset command list FAILED: 0x%08X\n", static_cast(hr)); return getResultFromHRESULT(hr); } #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE("CommandBuffer::begin() - Command list reset OK\n"); #endif recording_ = true; // Bind heaps using active heap, not legacy accessor, now that the command list // has been reset and is in the recording state. ID3D12DescriptorHeap* heaps[] = {frameCtx.activeCbvSrvUavHeap.Get(), frameCtx.samplerHeap.Get()}; commandList_->SetDescriptorHeaps(2, heaps); #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE("CommandBuffer::begin() - Set per-frame descriptor heaps for frame %u\n", frameIdx); #endif // Record timer start timestamp after reset and before any GPU work is recorded. // This ensures the timer measures the actual command buffer workload. if (desc.timer) { auto* timer = static_cast(desc.timer.get()); timer->begin(commandList_.Get()); } return Result(); } void CommandBuffer::end() { if (!recording_) { return; } // No timer recording here; timer->begin() was called in begin(), // and timer->end() will be called in CommandQueue::submit() before close. // Close the command list - all recording is complete commandList_->Close(); recording_ = false; } D3D12Context& CommandBuffer::getContext() { return device_.getD3D12Context(); } const D3D12Context& CommandBuffer::getContext() const { return device_.getD3D12Context(); } // Device draw count is incremented by CommandQueue::submit() using this buffer's count std::unique_ptr CommandBuffer::createRenderCommandEncoder( const RenderPassDesc& renderPass, const std::shared_ptr& framebuffer, const Dependencies& /*dependencies*/, Result* IGL_NULLABLE outResult) { // Begin command buffer if not already begun Result beginResult = begin(); if (!beginResult.isOk()) { Result::setResult(outResult, std::move(beginResult)); return nullptr; } // Create encoder with lightweight constructor, then initialize with render pass auto encoder = std::make_unique(*this, framebuffer); encoder->begin(renderPass); Result::setOk(outResult); return encoder; } std::unique_ptr CommandBuffer::createComputeCommandEncoder() { // Begin command buffer if not already begun Result beginResult = begin(); if (!beginResult.isOk()) { IGL_LOG_ERROR("CommandBuffer::createComputeCommandEncoder() - begin() failed: %s\n", beginResult.message.c_str()); return nullptr; } return std::make_unique(*this); } void CommandBuffer::present(const std::shared_ptr& /*surface*/) const { // Note: Actual present happens in CommandQueue::submit(). This call serves // as a marker indicating that this command buffer should trigger a swapchain // Present when submitted. willPresent_ = true; } void CommandBuffer::waitUntilScheduled() { // If scheduleValue_ is 0, the command buffer hasn't been submitted yet if (scheduleValue_ == 0) { #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE( "CommandBuffer::waitUntilScheduled() - Not yet submitted, returning immediately\n"); #endif return; } // Check if the scheduling fence has already been signaled if (!scheduleFence_.Get()) { IGL_LOG_ERROR("CommandBuffer::waitUntilScheduled() - Scheduling fence is null\n"); return; } const UINT64 completedValue = scheduleFence_->GetCompletedValue(); if (completedValue >= scheduleValue_) { #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE( "CommandBuffer::waitUntilScheduled() - Already scheduled (completed=%llu, target=%llu)\n", completedValue, scheduleValue_); #endif return; } // Wait for the scheduling fence to be signaled #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE( "CommandBuffer::waitUntilScheduled() - Waiting for scheduling (completed=%llu, " "target=%llu)\n", completedValue, scheduleValue_); #endif // Use FenceWaiter RAII wrapper for proper fence waiting with TOCTOU protection FenceWaiter waiter(scheduleFence_.Get(), scheduleValue_); Result waitResult = waiter.wait(); if (!waitResult.isOk()) { IGL_LOG_ERROR("CommandBuffer::waitUntilScheduled() - Fence wait failed: %s\n", waitResult.message.c_str()); return; } #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE( "CommandBuffer::waitUntilScheduled() - Scheduling complete (fence now=%llu)\n", scheduleFence_->GetCompletedValue()); #endif } void CommandBuffer::waitUntilCompleted() { // Wait for all submitted GPU work to complete // The CommandQueue tracks frame completion via fences, so we need to wait for the current frame auto& ctx = getContext(); auto* queue = ctx.getCommandQueue(); if (!queue) { return; } // Signal a fence and wait for it // This ensures all previously submitted command lists have completed on the GPU igl::d3d12::ComPtr fence; auto* device = ctx.getDevice(); if (!device || FAILED(device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(fence.GetAddressOf())))) { return; } queue->Signal(fence.Get(), 1); FenceWaiter waiter(fence.Get(), 1); Result waitResult = waiter.wait(); if (!waitResult.isOk()) { IGL_LOG_ERROR("CommandBuffer::waitUntilCompleted() - Fence wait failed: %s\n", waitResult.message.c_str()); return; } #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE("CommandBuffer::waitUntilCompleted() - GPU work completed\n"); #endif } void CommandBuffer::pushDebugGroupLabel(const char* label, const igl::Color& /*color*/) const { // Only emit GPU debug markers while the command list is in recording state. if (!recording_ || !commandList_.Get() || !label) { return; } const size_t len = strlen(label); std::wstring wlabel(len, L' '); std::mbstowcs(&wlabel[0], label, len); commandList_->BeginEvent( 0, wlabel.c_str(), static_cast((wlabel.length() + 1) * sizeof(wchar_t))); } void CommandBuffer::popDebugGroupLabel() const { // Only pop GPU debug markers while the command list is in recording state. if (!recording_ || !commandList_.Get()) { return; } commandList_->EndEvent(); } void CommandBuffer::copyBuffer(IBuffer& source, IBuffer& destination, uint64_t sourceOffset, uint64_t destinationOffset, uint64_t size) { auto* src = static_cast(&source); auto* dst = static_cast(&destination); ID3D12Resource* srcRes = src->getResource(); ID3D12Resource* dstRes = dst->getResource(); if (!srcRes || !dstRes || size == 0) { return; } // Use a transient copy with appropriate heap handling auto& ctx = getContext(); ID3D12Device* device = ctx.getDevice(); ID3D12CommandQueue* queue = ctx.getCommandQueue(); if (!device || !queue) { return; } auto doCopyOnList = [&](ID3D12GraphicsCommandList* list, ID3D12Resource* dstResLocal, uint64_t dstOffsetLocal) { D3D12_RESOURCE_BARRIER barriers[2] = {}; barriers[0].Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; barriers[0].Transition.pResource = srcRes; barriers[0].Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; barriers[0].Transition.StateBefore = D3D12_RESOURCE_STATE_GENERIC_READ; barriers[0].Transition.StateAfter = D3D12_RESOURCE_STATE_COPY_SOURCE; barriers[1].Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; barriers[1].Transition.pResource = dstResLocal; barriers[1].Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; barriers[1].Transition.StateBefore = D3D12_RESOURCE_STATE_GENERIC_READ; barriers[1].Transition.StateAfter = D3D12_RESOURCE_STATE_COPY_DEST; list->ResourceBarrier(2, barriers); list->CopyBufferRegion(dstResLocal, dstOffsetLocal, srcRes, sourceOffset, size); barriers[0].Transition.StateBefore = D3D12_RESOURCE_STATE_COPY_SOURCE; barriers[0].Transition.StateAfter = D3D12_RESOURCE_STATE_GENERIC_READ; barriers[1].Transition.StateBefore = D3D12_RESOURCE_STATE_COPY_DEST; barriers[1].Transition.StateAfter = D3D12_RESOURCE_STATE_GENERIC_READ; list->ResourceBarrier(2, barriers); }; if (dst->storage() == ResourceStorage::Shared) { // GPU cannot write into UPLOAD heap; use a READBACK staging buffer and then memcpy into UPLOAD D3D12_HEAP_PROPERTIES readbackHeap{}; readbackHeap.Type = D3D12_HEAP_TYPE_READBACK; D3D12_RESOURCE_DESC desc{}; desc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; desc.Width = size + destinationOffset; desc.Height = 1; desc.DepthOrArraySize = 1; desc.MipLevels = 1; desc.Format = DXGI_FORMAT_UNKNOWN; desc.SampleDesc.Count = 1; desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; igl::d3d12::ComPtr readback; HRESULT hr = device->CreateCommittedResource(&readbackHeap, D3D12_HEAP_FLAG_NONE, &desc, D3D12_RESOURCE_STATE_COPY_DEST, nullptr, IID_PPV_ARGS(readback.GetAddressOf())); if (FAILED(hr)) { IGL_LOG_ERROR("copyBuffer: Failed to create READBACK buffer, hr=0x%08X\n", static_cast(hr)); return; } igl::d3d12::ComPtr allocator; igl::d3d12::ComPtr list; if (FAILED(device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(allocator.GetAddressOf()))) || FAILED(device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, allocator.Get(), nullptr, IID_PPV_ARGS(list.GetAddressOf())))) { IGL_LOG_ERROR("copyBuffer: Failed to create transient command list\n"); return; } // Transition source to COPY_SOURCE D3D12_RESOURCE_BARRIER barrier = {}; barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; barrier.Transition.pResource = srcRes; barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_COMMON; barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_COPY_SOURCE; list->ResourceBarrier(1, &barrier); // Copy from source to readback (readback is already in COPY_DEST state) list->CopyBufferRegion(readback.Get(), destinationOffset, srcRes, sourceOffset, size); // Transition source back barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_COPY_SOURCE; barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_COMMON; list->ResourceBarrier(1, &barrier); list->Close(); ID3D12CommandList* lists[] = {list.Get()}; queue->ExecuteCommandLists(1, lists); ctx.waitForGPU(); // Map readback and copy into the UPLOAD buffer void* rbPtr = nullptr; D3D12_RANGE readRange{static_cast(destinationOffset), static_cast(destinationOffset + size)}; if (SUCCEEDED(readback->Map(0, &readRange, &rbPtr)) && rbPtr) { // Map destination upload buffer Result r1; void* dstPtr = dst->map(BufferRange(size, destinationOffset), &r1); if (dstPtr && r1.isOk()) { std::memcpy(dstPtr, static_cast(rbPtr) + destinationOffset, size); dst->unmap(); } readback->Unmap(0, nullptr); } return; } // Default path: copy using a transient command list to DEFAULT/COMMON destinations igl::d3d12::ComPtr allocator; igl::d3d12::ComPtr list; if (FAILED(device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(allocator.GetAddressOf()))) || FAILED(device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, allocator.Get(), nullptr, IID_PPV_ARGS(list.GetAddressOf())))) { return; } doCopyOnList(list.Get(), dstRes, destinationOffset); list->Close(); ID3D12CommandList* lists2[] = {list.Get()}; queue->ExecuteCommandLists(1, lists2); ctx.waitForGPU(); } // Public API: Record texture-to-buffer copy for deferred execution void CommandBuffer::copyTextureToBuffer(ITexture& source, IBuffer& destination, uint64_t destinationOffset, uint32_t mipLevel, uint32_t layer) { // Like Vulkan, defer the copy operation until command buffer submission // D3D12 requires this to execute AFTER render commands complete, not during recording // (Unlike Vulkan which can record into the command buffer, D3D12 has closed command list and // padding constraints) IGL_D3D12_LOG_VERBOSE( "copyTextureToBuffer: Recording deferred copy operation (will execute in " "CommandQueue::submit)\n"); deferredTextureCopies_.push_back({&source, &destination, destinationOffset, mipLevel, layer}); } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/CommandBuffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::d3d12 { class Device; class CommandBuffer final : public ICommandBuffer { public: CommandBuffer(Device& device, const CommandBufferDesc& desc); ~CommandBuffer() override; std::unique_ptr createRenderCommandEncoder( const RenderPassDesc& renderPass, const std::shared_ptr& framebuffer, const Dependencies& dependencies, Result* IGL_NULLABLE outResult) override; std::unique_ptr createComputeCommandEncoder() override; void present(const std::shared_ptr& surface) const override; void waitUntilScheduled() override; void waitUntilCompleted() override; void pushDebugGroupLabel(const char* label, const igl::Color& color) const override; void popDebugGroupLabel() const override; void copyBuffer(IBuffer& source, IBuffer& destination, uint64_t sourceOffset, uint64_t destinationOffset, uint64_t size) override; void copyTextureToBuffer(ITexture& source, IBuffer& destination, uint64_t destinationOffset, uint32_t mipLevel, uint32_t layer) override; Result begin(); void end(); bool isRecording() const { return recording_; } ID3D12GraphicsCommandList* getCommandList() const { return commandList_.Get(); } D3D12Context& getContext(); const D3D12Context& getContext() const; Device& getDevice() { return device_; } size_t getCurrentDrawCount() const { return currentDrawCount_; } void incrementDrawCount(size_t count = 1) { currentDrawCount_ += count; } // Track transient resources (e.g., push constants buffers) that need to be kept alive // until this FRAME completes GPU execution (not just until this command buffer is destroyed) void trackTransientBuffer(std::shared_ptr buffer); void trackTransientResource(ID3D12Resource* resource); // ============================================================================ // INTERNAL API: Descriptor Allocation (Transient Descriptor Allocator) // ============================================================================ // // These methods are implementation details of the per-frame descriptor heap // management system (Strategy 1 in D3D12ResourcesBinder.h). // // WARNING: Do NOT call these methods directly. Use D3D12ResourcesBinder instead. // // These methods delegate to D3D12Context::FrameContext to share descriptor heaps // across all command buffers in the current frame, ensuring efficient utilization // and automatic cleanup at frame boundaries. // // Access: public for friend class D3D12ResourcesBinder, conceptually private. // Returns Result to allow error handling on heap overflow. // ============================================================================ /** * @brief Allocate a single CBV/SRV/UAV descriptor from per-frame heap * @internal This is an implementation detail - use D3D12ResourcesBinder instead */ Result getNextCbvSrvUavDescriptor(uint32_t* outDescriptorIndex); /** * @brief Allocate a contiguous range of CBV/SRV/UAV descriptors on a single page * @internal This is an implementation detail - use D3D12ResourcesBinder instead * * This ensures the range can be bound as a single descriptor table. * Returns the base descriptor index; descriptors are [baseIndex, baseIndex+count) */ Result allocateCbvSrvUavRange(uint32_t count, uint32_t* outBaseDescriptorIndex); /** * @brief Get reference to next sampler descriptor index (for increment) * @internal This is an implementation detail - use D3D12ResourcesBinder instead */ uint32_t& getNextSamplerDescriptor(); // Deferred texture-to-buffer copy operations // These are recorded during command buffer recording and executed in CommandQueue::submit() // AFTER all render/compute commands have been executed by the GPU struct DeferredTextureCopy { ITexture* source; IBuffer* destination; uint64_t destinationOffset; uint32_t mipLevel; uint32_t layer; }; const std::vector& getDeferredTextureCopies() const { return deferredTextureCopies_; } // Whether this command buffer requested a swapchain present via present(). bool willPresent() const { return willPresent_; } private: Device& device_; igl::d3d12::ComPtr commandList_; // NOTE: Command allocators are now managed per-frame in FrameContext, not per-CommandBuffer size_t currentDrawCount_ = 0; bool recording_ = false; // Scheduling fence infrastructure (separate from completion fence) // Used to track when command buffer is submitted to GPU queue (not when GPU completes) // D-003: Removed scheduleFenceEvent_ - now using dedicated events per wait operation igl::d3d12::ComPtr scheduleFence_; uint64_t scheduleValue_ = 0; // Deferred copy operations to execute after command buffer submission std::vector deferredTextureCopies_; // Tracks whether present(surface) was called on this command buffer. // Mutable to allow modification from the logically-const present() override. mutable bool willPresent_ = false; friend class CommandQueue; // Allow CommandQueue to signal scheduleFence_ }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/CommandQueue.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #include #include #include #include #include namespace igl::d3d12 { namespace { /** * @brief Execute deferred texture-to-buffer copies after render commands */ void executeDeferredCopies(D3D12Context& ctx, Device& device, const CommandBuffer& cmdBuffer) { const auto& deferredCopies = cmdBuffer.getDeferredTextureCopies(); if (deferredCopies.empty()) { return; } #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE("CommandQueue: Executing %zu deferred copyTextureToBuffer operations\n", deferredCopies.size()); #endif for (const auto& copy : deferredCopies) { auto* srcTex = static_cast(copy.source); auto* dstBuf = static_cast(copy.destination); Result copyResult = TextureCopyUtils::executeCopyTextureToBuffer( ctx, device, *srcTex, *dstBuf, copy.destinationOffset, copy.mipLevel, copy.layer); if (!copyResult.isOk()) { IGL_LOG_ERROR("Failed to copy texture to buffer: %s\n", copyResult.message.c_str()); } } #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE("CommandQueue: All deferred copies executed successfully\n"); #endif } // No standalone helper needed - this is now inlined in CommandQueue::submit() /** * @brief Update per-frame fence tracking */ void updateFrameFences(D3D12Context& ctx, UINT64 currentFenceValue) { auto& frameCtx = ctx.getFrameContexts()[ctx.getCurrentFrameIndex()]; // Update frame fence (backward compatibility) if (frameCtx.fenceValue == 0) { frameCtx.fenceValue = currentFenceValue; } // Update max allocator fence (critical for safe allocator reset) if (currentFenceValue > frameCtx.maxAllocatorFence) { frameCtx.maxAllocatorFence = currentFenceValue; } // Track command buffer count frameCtx.commandBufferCount++; #ifdef IGL_DEBUG // Keep this at IGL_LOG_INFO because the test harness (test_all_sessions.bat) parses // "Signaled fence" from the INFO log; do not downgrade to VERBOSE IGL_LOG_INFO( "CommandQueue: Signaled fence for frame %u " "(value=%llu, maxAllocatorFence=%llu, cmdBufCount=%u)\n", ctx.getCurrentFrameIndex(), currentFenceValue, frameCtx.maxAllocatorFence, frameCtx.commandBufferCount); #endif } } // namespace CommandQueue::CommandQueue(Device& device) : device_(device) {} std::shared_ptr CommandQueue::createCommandBuffer(const CommandBufferDesc& desc, Result* IGL_NULLABLE outResult) { auto cmdBuffer = std::make_shared(device_, desc); // Check if CommandBuffer was successfully initialized // CommandBuffer leaves commandList_ null on failure if (!cmdBuffer->getCommandList()) { Result::setResult( outResult, Result::Code::RuntimeError, "Failed to create D3D12 command list. " "Possible causes: device removed, out of memory, or device initialization failed. " "Check debug output for HRESULT error code."); return nullptr; } Result::setOk(outResult); return cmdBuffer; } // Error handling behavior for submit(). // This function executes command lists and presents frames. Error handling: // - Device removal: Detected via checkDeviceRemoval(), logs diagnostics, sets device.isDeviceLost() // flag, and triggers IGL_DEBUG_ASSERT. Returns SubmitHandle normally (legacy API limitation). // - Present failures: Logged with IGL_LOG_ERROR via PresentManager. Device removal during Present // also triggers IGL_DEBUG_ASSERT. Non-removal failures (swapchain/window issues) are logged but // do not assert. Present result is checked but not propagated as Result (legacy API limitation). // - Return value: The SubmitHandle is always returned regardless of errors and does NOT reflect // submission success/failure. Use device.checkDeviceRemoval() or device.isDeviceLost() as the // authoritative source for fatal error detection. // Future: Consider Result-based submission API for explicit error propagation. // // Refactored from 614 lines to under 100 lines using helper classes: // - FenceWaiter: RAII fence waiting with TOCTOU protection // - FrameManager: Frame advancement and resource management // - PresentManager: Swapchain presentation with device removal detection SubmitHandle CommandQueue::submit(const ICommandBuffer& commandBuffer, bool /*endOfFrame*/) { auto& cmdBuffer = const_cast(static_cast(commandBuffer)); auto& ctx = device_.getD3D12Context(); auto* commandList = cmdBuffer.getCommandList(); auto* fence = ctx.getFence(); // Defensive: Ensure we have a valid command list IGL_DEBUG_ASSERT(commandList, "D3D12 CommandQueue::submit() with null command list"); // Record timer end timestamp before closing command list if (commandBuffer.desc.timer) { auto* timer = static_cast(commandBuffer.desc.timer.get()); const UINT64 timerFenceValue = ctx.getFenceValue() + 1; timer->end(commandList, fence, timerFenceValue); } // Close command list cmdBuffer.end(); // Signal scheduling fence ++scheduleFenceValue_; cmdBuffer.scheduleValue_ = scheduleFenceValue_; ctx.getCommandQueue()->Signal(cmdBuffer.scheduleFence_.Get(), scheduleFenceValue_); #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE("CommandQueue: Signaled scheduling fence (value=%llu)\n", scheduleFenceValue_); #endif #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE("CommandQueue::submit() - Executing command list...\n"); #endif // Execute command list ID3D12CommandList* commandLists[] = {commandList}; ctx.getCommandQueue()->ExecuteCommandLists(1, commandLists); // Execute deferred texture-to-buffer copies executeDeferredCopies(ctx, device_, cmdBuffer); // Check device status Result deviceCheck = device_.checkDeviceRemoval(); if (!deviceCheck.isOk()) { IGL_LOG_ERROR("CommandQueue::submit() - Device removal detected: %s\n", deviceCheck.message.c_str()); } // Present only if this command buffer requested it (via present()) // and we have a swapchain. This avoids advancing the swapchain for // intermediate offscreen passes that do not render to the back buffer. bool presentOk = true; if (ctx.getSwapChain() && cmdBuffer.willPresent()) { PresentManager presentMgr(ctx); presentOk = presentMgr.present(); if (!presentOk) { IGL_LOG_ERROR("CommandQueue::submit() - Present failed; frame advancement may be unsafe\n"); // Note: Continue with fence signaling for now to maintain legacy behavior, // but future work should consider early-return or recovery strategy } } // Signal fence for current frame const UINT64 currentFenceValue = ++ctx.getFenceValue(); ctx.getCommandQueue()->Signal(ctx.getFence(), currentFenceValue); // Update frame fence tracking updateFrameFences(ctx, currentFenceValue); // Advance to next frame with proper synchronization if (ctx.getSwapChain()) { FrameManager frameMgr(ctx); frameMgr.advanceFrame(currentFenceValue); } #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE("CommandQueue::submit() - Complete!\n"); #endif // Aggregate per-command-buffer draw count into the device, matching GL/Vulkan behavior const auto cbDraws = cmdBuffer.getCurrentDrawCount(); #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE("CommandQueue::submit() - Aggregating %zu draws from CB into device\n", cbDraws); #endif device_.incrementDrawCount(cbDraws); #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE("CommandQueue::submit() - Device drawCount now=%zu\n", device_.getCurrentDrawCount()); // Log resource stats every 30 draws to track leaks const size_t drawCount = device_.getCurrentDrawCount(); if (drawCount == 30 || drawCount == 60 || drawCount == 90 || drawCount == 120 || drawCount == 150 || drawCount == 300 || drawCount == 600 || drawCount == 900 || drawCount == 1200 || drawCount == 1500 || drawCount == 1800) { IGL_D3D12_LOG_VERBOSE("CommandQueue::submit() - Logging resource stats at drawCount=%zu\n", drawCount); D3D12Context::logResourceStats(); } #endif return 0; } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/CommandQueue.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::d3d12 { class Device; class CommandQueue final : public ICommandQueue { public: explicit CommandQueue(Device& device); ~CommandQueue() override = default; std::shared_ptr createCommandBuffer(const CommandBufferDesc& desc, Result* IGL_NULLABLE outResult) override; SubmitHandle submit(const ICommandBuffer& commandBuffer, bool endOfFrame = false) override; Device& getDevice() { return device_; } private: Device& device_; uint64_t scheduleFenceValue_ = 0; // Monotonically increasing fence value used for scheduling. }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/Common.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include namespace igl::d3d12 { DXGI_FORMAT textureFormatToDXGIFormat(TextureFormat format) { switch (format) { case TextureFormat::Invalid: return DXGI_FORMAT_UNKNOWN; case TextureFormat::R_UNorm8: return DXGI_FORMAT_R8_UNORM; case TextureFormat::R_UNorm16: return DXGI_FORMAT_R16_UNORM; case TextureFormat::R_F16: return DXGI_FORMAT_R16_FLOAT; case TextureFormat::R_UInt16: return DXGI_FORMAT_R16_UINT; case TextureFormat::B5G5R5A1_UNorm: return DXGI_FORMAT_B5G5R5A1_UNORM; case TextureFormat::B5G6R5_UNorm: return DXGI_FORMAT_B5G6R5_UNORM; case TextureFormat::RG_UNorm8: return DXGI_FORMAT_R8G8_UNORM; case TextureFormat::RG_UNorm16: return DXGI_FORMAT_R16G16_UNORM; case TextureFormat::R5G5B5A1_UNorm: return DXGI_FORMAT_B5G5R5A1_UNORM; // DXGI closest match case TextureFormat::BGRA_UNorm8: return DXGI_FORMAT_B8G8R8A8_UNORM; case TextureFormat::RGBA_UNorm8: case TextureFormat::RGBX_UNorm8: return DXGI_FORMAT_R8G8B8A8_UNORM; case TextureFormat::RGBA_SRGB: return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; case TextureFormat::BGRA_SRGB: return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; case TextureFormat::RG_F16: return DXGI_FORMAT_R16G16_FLOAT; case TextureFormat::RG_UInt16: return DXGI_FORMAT_R16G16_UINT; case TextureFormat::RGB10_A2_UNorm_Rev: return DXGI_FORMAT_R10G10B10A2_UNORM; case TextureFormat::RGB10_A2_Uint_Rev: return DXGI_FORMAT_R10G10B10A2_UINT; case TextureFormat::R_F32: return DXGI_FORMAT_R32_FLOAT; case TextureFormat::R_UInt32: return DXGI_FORMAT_R32_UINT; case TextureFormat::RG_F32: return DXGI_FORMAT_R32G32_FLOAT; case TextureFormat::RGB_F16: return DXGI_FORMAT_R16G16B16A16_FLOAT; // DXGI doesn't have RGB16, use RGBA16 case TextureFormat::RGBA_F16: return DXGI_FORMAT_R16G16B16A16_FLOAT; case TextureFormat::RGB_F32: return DXGI_FORMAT_R32G32B32_FLOAT; case TextureFormat::RGBA_UInt32: return DXGI_FORMAT_R32G32B32A32_UINT; case TextureFormat::RGBA_F32: return DXGI_FORMAT_R32G32B32A32_FLOAT; // BC7 compressed color formats case TextureFormat::RGBA_BC7_UNORM_4x4: return DXGI_FORMAT_BC7_UNORM; case TextureFormat::RGBA_BC7_SRGB_4x4: return DXGI_FORMAT_BC7_UNORM_SRGB; // Depth/stencil formats case TextureFormat::Z_UNorm16: return DXGI_FORMAT_D16_UNORM; case TextureFormat::Z_UNorm24: return DXGI_FORMAT_D24_UNORM_S8_UINT; // DXGI doesn't have D24 alone case TextureFormat::Z_UNorm32: return DXGI_FORMAT_D32_FLOAT; case TextureFormat::S8_UInt_Z24_UNorm: return DXGI_FORMAT_D24_UNORM_S8_UINT; case TextureFormat::S8_UInt_Z32_UNorm: return DXGI_FORMAT_D32_FLOAT_S8X24_UINT; case TextureFormat::S_UInt8: // Stencil-only formats are not natively supported by D3D12. // TODO: Implement via typed subresource views using stencil plane formats: // - DXGI_FORMAT_X24_TYPELESS_G8_UINT (for D24_UNORM_S8_UINT backing resource) // - DXGI_FORMAT_X32_TYPELESS_G8X24_UINT (for D32_FLOAT_S8X24_UINT backing resource) // See: https://learn.microsoft.com/en-us/windows/win32/api/dxgiformat/ne-dxgiformat-dxgi_format IGL_LOG_ERROR_ONCE( "TextureFormat::S_UInt8 not supported on D3D12 (no stencil-only textures) - use " "S8_UInt_Z24_UNorm or S8_UInt_Z32_UNorm instead\n"); return DXGI_FORMAT_UNKNOWN; default: return DXGI_FORMAT_UNKNOWN; } } namespace { bool isDepthOrStencilFormat(TextureFormat format) { switch (format) { case TextureFormat::Z_UNorm16: case TextureFormat::Z_UNorm24: case TextureFormat::Z_UNorm32: case TextureFormat::S8_UInt_Z24_UNorm: case TextureFormat::S8_UInt_Z32_UNorm: return true; default: return false; } } } // namespace DXGI_FORMAT textureFormatToDXGIResourceFormat(TextureFormat format, bool sampledUsage) { if (!sampledUsage || !isDepthOrStencilFormat(format)) { return textureFormatToDXGIFormat(format); } switch (format) { case TextureFormat::Z_UNorm16: return DXGI_FORMAT_R16_TYPELESS; case TextureFormat::Z_UNorm24: case TextureFormat::S8_UInt_Z24_UNorm: return DXGI_FORMAT_R24G8_TYPELESS; case TextureFormat::Z_UNorm32: return DXGI_FORMAT_R32_TYPELESS; case TextureFormat::S8_UInt_Z32_UNorm: return DXGI_FORMAT_R32G8X24_TYPELESS; default: return textureFormatToDXGIFormat(format); } } DXGI_FORMAT textureFormatToDXGIShaderResourceViewFormat(TextureFormat format) { if (!isDepthOrStencilFormat(format)) { return textureFormatToDXGIFormat(format); } switch (format) { case TextureFormat::Z_UNorm16: return DXGI_FORMAT_R16_UNORM; case TextureFormat::Z_UNorm24: return DXGI_FORMAT_R24_UNORM_X8_TYPELESS; case TextureFormat::S8_UInt_Z24_UNorm: return DXGI_FORMAT_R24_UNORM_X8_TYPELESS; case TextureFormat::Z_UNorm32: return DXGI_FORMAT_R32_FLOAT; case TextureFormat::S8_UInt_Z32_UNorm: return DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS; default: return textureFormatToDXGIFormat(format); } } TextureFormat dxgiFormatToTextureFormat(DXGI_FORMAT format) { switch (format) { case DXGI_FORMAT_UNKNOWN: return TextureFormat::Invalid; case DXGI_FORMAT_R8_UNORM: return TextureFormat::R_UNorm8; case DXGI_FORMAT_R16_UNORM: return TextureFormat::R_UNorm16; case DXGI_FORMAT_R16_FLOAT: return TextureFormat::R_F16; case DXGI_FORMAT_R8G8_UNORM: return TextureFormat::RG_UNorm8; case DXGI_FORMAT_R8G8B8A8_UNORM: return TextureFormat::RGBA_UNorm8; case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: return TextureFormat::RGBA_SRGB; case DXGI_FORMAT_B8G8R8A8_UNORM: return TextureFormat::BGRA_UNorm8; case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: return TextureFormat::BGRA_SRGB; case DXGI_FORMAT_R16G16B16A16_FLOAT: return TextureFormat::RGBA_F16; case DXGI_FORMAT_R32G32B32A32_FLOAT: return TextureFormat::RGBA_F32; case DXGI_FORMAT_D16_UNORM: return TextureFormat::Z_UNorm16; case DXGI_FORMAT_D24_UNORM_S8_UINT: return TextureFormat::S8_UInt_Z24_UNorm; case DXGI_FORMAT_D32_FLOAT: return TextureFormat::Z_UNorm32; case DXGI_FORMAT_BC7_UNORM: return TextureFormat::RGBA_BC7_UNORM_4x4; case DXGI_FORMAT_BC7_UNORM_SRGB: return TextureFormat::RGBA_BC7_SRGB_4x4; default: return TextureFormat::Invalid; } } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/Common.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #ifndef IGL_D3D12_COMMON_H #define IGL_D3D12_COMMON_H #include #include #include #include #include #include #include // Set to 1 to see verbose debug console logs with D3D12 commands #define IGL_D3D12_PRINT_COMMANDS 0 // Set to 1 to enable verbose logging (hot-path logs, detailed state tracking, etc.) // This is disabled by default to reduce log volume. #define IGL_D3D12_DEBUG_VERBOSE 0 namespace igl::d3d12 { // Configuration structure for D3D12 backend. // Centralizes all size-related configuration with documented rationale. struct D3D12ContextConfig { // === Frame Buffering === // Rationale: Triple buffering (3 frames) provides optimal GPU/CPU parallelism on modern hardware // while maintaining reasonable memory overhead. Reducing to 2 can save memory on constrained // devices but may reduce throughput. Increasing beyond 3 provides minimal benefit. // D3D12 spec: Minimum 2, recommended 2-3 for flip model swapchains // // LIMITATION: Currently fixed at 3 due to fixed-size arrays (frameContexts_, renderTargets_). // Attempting to change this value will be clamped by validate(). To enable true configurability, // D3D12Context must be refactored to use std::vector instead of fixed-size arrays. uint32_t maxFramesInFlight = 3; // === Descriptor Heap Sizes (Per-Frame Shader-Visible) === // Rationale: Following Microsoft MiniEngine pattern for dynamic per-frame allocation // Samplers: D3D12_MAX_SHADER_VISIBLE_SAMPLER_HEAP_SIZE (2048) is the hardware limit. // D3D12 spec limits: CBV/SRV/UAV up to 1,000,000, Samplers max 2048 uint32_t samplerHeapSize = 2048; // Total sampler descriptors per frame (D3D12 spec limit) // === CBV/SRV/UAV Dynamic Heap Growth === // Rationale: Prevents unbounded memory growth while supporting complex scenes // Starts with one page, can grow up to maxHeapPages as needed // 16 pages × 1024 descriptors = 16,384 max descriptors per frame // This supports ~500-1000 draw calls per frame with typical descriptor usage patterns uint32_t descriptorsPerPage = 1024; // CBV/SRV/UAV descriptors per heap page uint32_t maxHeapPages = 16; // Maximum pages per frame (total capacity = pages × descriptorsPerPage) // Pre-allocation policy for descriptor pages. // Rationale: Following Vulkan fail-fast pattern to prevent mid-frame descriptor invalidation. // When true: All maxHeapPages are pre-allocated at init (recommended). // When false: Only 1 page pre-allocated at init (minimal memory footprint). // Both modes fail-fast when pages are exhausted - no dynamic growth to prevent descriptor // invalidation. Default: true for safety (matches Vulkan behavior and supports complex scenes). bool preAllocateDescriptorPages = true; // DEPRECATED: Use descriptorsPerPage instead // This field is kept for backward compatibility but has the same value as descriptorsPerPage uint32_t cbvSrvUavHeapSize = 1024; // Alias for descriptorsPerPage (deprecated) // === CPU-Visible Descriptor Heaps (Static) === // Rationale: RTVs/DSVs are created once per texture and persist across frames // 256 RTVs: Supports ~128 textures with mips/array layers (typical for games) // 128 DSVs: Sufficient for depth buffers, shadow maps, and multi-pass rendering // These values should be tuned based on application texture usage patterns uint32_t rtvHeapSize = 256; uint32_t dsvHeapSize = 128; // === Upload Ring Buffer === // Rationale: 128MB provides good balance for streaming resources (textures, constant buffers) // Smaller values (64MB) reduce memory footprint but increase allocation failures // Larger values (256MB) reduce failures but waste memory on simple scenes // Microsoft MiniEngine uses similar sizes (64-256MB range) uint64_t uploadRingBufferSize = 128 * 1024 * 1024; // 128 MB // === Validation Helpers === // Clamp values to D3D12 spec limits and provide warnings for unusual configurations void validate() { // Frame buffering: Allow 2-4 buffers (double/triple/quad buffering) // T43: Now that renderTargets_ and frameContexts_ are std::vector, we can support runtime // counts. Practical range: 2 (double-buffer, higher latency), 3 (triple-buffer, balanced), 4 // (lower latency, more memory) Note: DXGI may adjust the requested count; actual runtime count // comes from GetDesc1(). constexpr uint32_t kMinFrames = 2; constexpr uint32_t kMaxFrames = 4; if (maxFramesInFlight < kMinFrames || maxFramesInFlight > kMaxFrames) { IGL_LOG_ERROR( "D3D12ContextConfig: maxFramesInFlight=%u out of range [%u, %u], clamping to %u\n", maxFramesInFlight, kMinFrames, kMaxFrames, (maxFramesInFlight < kMinFrames) ? kMinFrames : kMaxFrames); maxFramesInFlight = (maxFramesInFlight < kMinFrames) ? kMinFrames : kMaxFrames; } // Sampler heap: Use D3D12 constant instead of magic number if (samplerHeapSize > D3D12_MAX_SHADER_VISIBLE_SAMPLER_HEAP_SIZE) { IGL_LOG_INFO("D3D12ContextConfig: samplerHeapSize=%u exceeds D3D12 limit (%u), clamping\n", samplerHeapSize, D3D12_MAX_SHADER_VISIBLE_SAMPLER_HEAP_SIZE); samplerHeapSize = D3D12_MAX_SHADER_VISIBLE_SAMPLER_HEAP_SIZE; } // Descriptor page limits: Prevent absurd/invalid values if (descriptorsPerPage == 0) { IGL_LOG_ERROR("D3D12ContextConfig: descriptorsPerPage=0 is invalid, setting to 1024\n"); descriptorsPerPage = 1024; } if (maxHeapPages == 0) { IGL_LOG_ERROR("D3D12ContextConfig: maxHeapPages=0 is invalid, setting to 16\n"); maxHeapPages = 16; } // CBV/SRV/UAV heap: D3D12 spec limit (generic, tier-independent upper bound) // Note: Actual device limits may be lower depending on resource binding tier; // use CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS) for precise caps constexpr uint32_t kMaxCbvSrvUavDescriptors = 1000000; if (descriptorsPerPage > kMaxCbvSrvUavDescriptors) { IGL_LOG_INFO("D3D12ContextConfig: descriptorsPerPage=%u exceeds D3D12 limit (%u), clamping\n", descriptorsPerPage, kMaxCbvSrvUavDescriptors); descriptorsPerPage = kMaxCbvSrvUavDescriptors; } // Keep deprecated cbvSrvUavHeapSize in sync with descriptorsPerPage cbvSrvUavHeapSize = descriptorsPerPage; // Upload ring buffer: Warn if too small (may cause allocation failures) constexpr uint64_t kMinRecommendedSize = 32 * 1024 * 1024; // 32 MB if (uploadRingBufferSize < kMinRecommendedSize) { IGL_LOG_INFO( "D3D12ContextConfig: uploadRingBufferSize=%llu MB is small, " "may cause allocation failures (recommended minimum: %llu MB)\n", uploadRingBufferSize / (1024 * 1024), kMinRecommendedSize / (1024 * 1024)); } } // === Preset Configurations === // Factory methods for common use cases // Default configuration (balanced for most applications) static D3D12ContextConfig defaultConfig() { return D3D12ContextConfig{}; // Uses default member initializers } // Low memory configuration (mobile, integrated GPUs, constrained devices) static D3D12ContextConfig lowMemoryConfig() { D3D12ContextConfig config; config.maxFramesInFlight = 2; // Double-buffering to reduce memory (T43) config.descriptorsPerPage = 512; // Smaller pages config.cbvSrvUavHeapSize = 512; // Keep in sync (deprecated field) config.maxHeapPages = 8; // Fewer pages (total: 512 × 8 = 4K descriptors) config.rtvHeapSize = 128; // Fewer RTVs config.dsvHeapSize = 64; // Fewer DSVs config.uploadRingBufferSize = 64 * 1024 * 1024; // 64 MB config.validate(); return config; } // High performance configuration (discrete GPUs, desktop, complex scenes) static D3D12ContextConfig highPerformanceConfig() { D3D12ContextConfig config; config.maxFramesInFlight = 3; // Triple-buffering (balanced, default) (T43) config.descriptorsPerPage = 2048; // Larger pages config.cbvSrvUavHeapSize = 2048; // Keep in sync (deprecated field) config.maxHeapPages = 32; // More pages (total: 2048 × 32 = 64K descriptors) config.rtvHeapSize = 512; // More RTVs for render targets config.dsvHeapSize = 256; // More DSVs for shadow maps config.uploadRingBufferSize = 256 * 1024 * 1024; // 256 MB config.validate(); return config; } }; // Default frame buffering count (triple buffering). // T43: D3D12Context now uses runtime swapchainBufferCount_ queried from the swapchain. // This constant serves as the default value for D3D12ContextConfig::maxFramesInFlight // and is used by headless contexts (which have no swapchain to query). // Applications can configure 2-4 buffers via D3D12ContextConfig::maxFramesInFlight. constexpr uint32_t kMaxFramesInFlight = 3; // Maximum number of descriptor sets (matching IGL's Vulkan backend) constexpr uint32_t kMaxDescriptorSets = 4; // Maximum number of samplers; increased to D3D12 spec limit to support complex scenes. // D3D12_MAX_SHADER_VISIBLE_SAMPLER_HEAP_SIZE is defined as 2048 in d3d12.h. constexpr uint32_t kMaxSamplers = D3D12_MAX_SHADER_VISIBLE_SAMPLER_HEAP_SIZE; // Descriptor heap sizes (per-frame shader-visible heaps) // Following Microsoft MiniEngine pattern for dynamic per-frame allocation constexpr uint32_t kCbvSrvUavHeapSize = 1024; // CBV/SRV/UAV descriptors per page constexpr uint32_t kSamplerHeapSize = kMaxSamplers; // Sampler descriptors per frame // Dynamic heap growth limits (prevent unbounded memory usage). constexpr uint32_t kDescriptorsPerPage = kCbvSrvUavHeapSize; // 1024 descriptors per page constexpr uint32_t kMaxHeapPages = 16; // Maximum 16 pages = 16K descriptors per frame constexpr uint32_t kMaxDescriptorsPerFrame = kMaxHeapPages * kDescriptorsPerPage; // 16384 total // Maximum number of vertex attributes (D3D12 spec limit). // Uses D3D12 spec constant instead of a hard-coded value. constexpr uint32_t kMaxVertexAttributes = D3D12_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT; // 32 // Normalized error macros - single log per error (no double logging). // Debug builds: IGL_DEBUG_ASSERT logs via _IGLDebugAbort // Release builds: IGL_LOG_ERROR provides visibility #if IGL_DEBUG_ABORT_ENABLED #define D3D12_CHECK(func) \ do { \ const HRESULT d3d12_check_result = (func); \ if (FAILED(d3d12_check_result)) { \ IGL_DEBUG_ASSERT(false, \ "D3D12 API call failed: %s, HRESULT: 0x%08X", \ #func, \ static_cast(d3d12_check_result)); \ } \ } while (0) #define D3D12_CHECK_RETURN(func) \ do { \ const HRESULT d3d12_check_result = (func); \ if (FAILED(d3d12_check_result)) { \ IGL_DEBUG_ASSERT(false, \ "D3D12 API call failed: %s, HRESULT: 0x%08X", \ #func, \ static_cast(d3d12_check_result)); \ return getResultFromHRESULT(d3d12_check_result); \ } \ } while (0) #else #define D3D12_CHECK(func) \ do { \ const HRESULT d3d12_check_result = (func); \ if (FAILED(d3d12_check_result)) { \ IGL_LOG_ERROR("D3D12 API call failed: %s, HRESULT: 0x%08X\n", \ #func, \ static_cast(d3d12_check_result)); \ } \ } while (0) #define D3D12_CHECK_RETURN(func) \ do { \ const HRESULT d3d12_check_result = (func); \ if (FAILED(d3d12_check_result)) { \ IGL_LOG_ERROR("D3D12 API call failed: %s, HRESULT: 0x%08X\n", \ #func, \ static_cast(d3d12_check_result)); \ return getResultFromHRESULT(d3d12_check_result); \ } \ } while (0) #endif // Verbose logging macro (hot-path logs, detailed state tracking). // Only logs when IGL_D3D12_DEBUG_VERBOSE is enabled (disabled by default) #if IGL_D3D12_DEBUG_VERBOSE #define IGL_D3D12_LOG_VERBOSE(format, ...) IGL_LOG_INFO(format, ##__VA_ARGS__) #else #define IGL_D3D12_LOG_VERBOSE(format, ...) ((void)0) #endif // Command logging macro (D3D12 API command traces). // Only logs when IGL_D3D12_PRINT_COMMANDS is enabled (disabled by default) // Use for command recording, state transitions, and D3D12 API call traces // Note: Treated as INFO-level severity but controlled separately from DEBUG_VERBOSE // to allow independent toggling of command traces vs general verbose output #if IGL_D3D12_PRINT_COMMANDS #define IGL_D3D12_LOG_CMD(format, ...) IGL_LOG_INFO(format, ##__VA_ARGS__) #else #define IGL_D3D12_LOG_CMD(format, ...) ((void)0) #endif // Convert HRESULT to IGL Result inline Result getResultFromHRESULT(HRESULT hr) { if (SUCCEEDED(hr)) { return Result(Result::Code::Ok); } // Map common HRESULT codes to IGL Result codes switch (hr) { case E_OUTOFMEMORY: return Result(Result::Code::RuntimeError, "Out of memory"); case E_INVALIDARG: return Result(Result::Code::ArgumentInvalid, "Invalid argument"); case E_NOTIMPL: return Result(Result::Code::Unimplemented, "Not implemented"); case DXGI_ERROR_DEVICE_REMOVED: return Result(Result::Code::RuntimeError, "Device removed"); case DXGI_ERROR_DEVICE_RESET: return Result(Result::Code::RuntimeError, "Device reset"); default: { // Include HRESULT code for better debugging of unexpected errors. char buf[64]; snprintf(buf, sizeof(buf), "D3D12 error (hr=0x%08X)", static_cast(hr)); return Result(Result::Code::RuntimeError, buf); } } } // Helper for COM resource release template void SafeRelease(T*& ptr) { if (ptr) { ptr->Release(); ptr = nullptr; } } // Texture format conversion DXGI_FORMAT textureFormatToDXGIFormat(TextureFormat format); DXGI_FORMAT textureFormatToDXGIResourceFormat(TextureFormat format, bool sampledUsage); DXGI_FORMAT textureFormatToDXGIShaderResourceViewFormat(TextureFormat format); TextureFormat dxgiFormatToTextureFormat(DXGI_FORMAT format); // Align value to specified alignment (must be power-of-two) // Template allows use with different integer types (UINT64, size_t, etc.) // IMPORTANT: alignment must be a power of 2 (e.g., 256, 4096, 65536) template inline T AlignUp(T value, T alignment) { IGL_DEBUG_ASSERT((alignment & (alignment - 1)) == 0, "AlignUp: alignment must be power-of-two"); return (value + alignment - 1) & ~(alignment - 1); } // Hash combining utility (boost::hash_combine pattern) // Used for hashing complex structures like root signatures and pipeline descriptors template inline void hashCombine(size_t& seed, const T& value) { seed ^= std::hash{}(value) + 0x9e3779b9 + (seed << 6) + (seed >> 2); } // Feature level to string conversion inline const char* featureLevelToString(D3D_FEATURE_LEVEL level) { switch (level) { case D3D_FEATURE_LEVEL_12_2: return "12.2"; case D3D_FEATURE_LEVEL_12_1: return "12.1"; case D3D_FEATURE_LEVEL_12_0: return "12.0"; case D3D_FEATURE_LEVEL_11_1: return "11.1"; case D3D_FEATURE_LEVEL_11_0: return "11.0"; default: return "Unknown"; } } // Shader target helper. // Convert D3D_SHADER_MODEL enum to shader target string (e.g., "vs_6_6", "ps_5_1"). inline std::string getShaderTarget(D3D_SHADER_MODEL shaderModel, ShaderStage stage) { // Extract major and minor version from D3D_SHADER_MODEL enum // Format: 0xMm where M = major, m = minor (e.g., 0x66 = SM 6.6, 0x51 = SM 5.1) int major = (shaderModel >> 4) & 0xF; int minor = shaderModel & 0xF; // Get stage prefix const char* stagePrefix = nullptr; switch (stage) { case ShaderStage::Vertex: stagePrefix = "vs"; break; case ShaderStage::Fragment: stagePrefix = "ps"; // DirectX uses "ps" for pixel/fragment shaders break; case ShaderStage::Compute: stagePrefix = "cs"; break; default: return ""; } // Build target string (e.g., "vs_6_6", "ps_5_1", "cs_6_0") char target[16]; snprintf(target, sizeof(target), "%s_%d_%d", stagePrefix, major, minor); return std::string(target); } } // namespace igl::d3d12 #endif // IGL_D3D12_COMMON_H ================================================ FILE: src/igl/d3d12/ComputeCommandEncoder.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #include namespace igl::d3d12 { ComputeCommandEncoder::ComputeCommandEncoder(CommandBuffer& commandBuffer) : commandBuffer_(commandBuffer), resourcesBinder_(commandBuffer, true /* isCompute */), isEncoding_(true) { IGL_D3D12_LOG_VERBOSE("ComputeCommandEncoder created\n"); // Set descriptor heaps for this command list. // Use active heap from frame context, not the legacy accessor. auto& context = commandBuffer_.getContext(); auto& frameCtx = context.getFrameContexts()[context.getCurrentFrameIndex()]; ID3D12DescriptorHeap* cbvSrvUavHeap = frameCtx.activeCbvSrvUavHeap.Get(); ID3D12DescriptorHeap* samplerHeap = frameCtx.samplerHeap.Get(); // Legacy fallback: if the context does not provide per-frame heaps, try the manager once if ((!cbvSrvUavHeap || !samplerHeap) && context.getDescriptorHeapManager()) { auto* heapMgr = context.getDescriptorHeapManager(); if (!cbvSrvUavHeap) { cbvSrvUavHeap = heapMgr->getCbvSrvUavHeap(); } if (!samplerHeap) { samplerHeap = heapMgr->getSamplerHeap(); } } if (cbvSrvUavHeap && samplerHeap) { auto* commandList = commandBuffer_.getCommandList(); if (commandList) { ID3D12DescriptorHeap* heaps[] = {cbvSrvUavHeap, samplerHeap}; commandList->SetDescriptorHeaps(2, heaps); IGL_D3D12_LOG_VERBOSE( "ComputeCommandEncoder: Descriptor heaps set (active heap from FrameContext)\n"); } } } void ComputeCommandEncoder::endEncoding() { if (!isEncoding_) { return; } IGL_D3D12_LOG_VERBOSE("ComputeCommandEncoder::endEncoding()\n"); isEncoding_ = false; } void ComputeCommandEncoder::bindComputePipelineState( const std::shared_ptr& pipelineState) { if (!pipelineState) { IGL_LOG_ERROR("ComputeCommandEncoder::bindComputePipelineState - null pipeline state\n"); return; } currentPipeline_ = static_cast(pipelineState.get()); auto* commandList = commandBuffer_.getCommandList(); if (!commandBuffer_.isRecording() || !commandList) { IGL_LOG_ERROR( "ComputeCommandEncoder::bindComputePipelineState - command list is closed or null\n"); return; } // Set compute root signature and pipeline state commandList->SetComputeRootSignature(currentPipeline_->getRootSignature()); commandList->SetPipelineState(currentPipeline_->getPipelineState()); IGL_D3D12_LOG_VERBOSE( "ComputeCommandEncoder::bindComputePipelineState - PSO and root signature set\n"); } void ComputeCommandEncoder::dispatchThreadGroups(const Dimensions& threadgroupCount, const Dimensions& /*threadgroupSize*/, const Dependencies& dependencies) { if (!currentPipeline_) { IGL_LOG_ERROR("ComputeCommandEncoder::dispatchThreadGroups - no pipeline state bound\n"); return; } auto* commandList = commandBuffer_.getCommandList(); if (!commandBuffer_.isRecording() || !commandList) { IGL_LOG_ERROR("ComputeCommandEncoder::dispatchThreadGroups - command list is closed or null\n"); return; } IGL_D3D12_LOG_VERBOSE("ComputeCommandEncoder::dispatchThreadGroups(%u, %u, %u)\n", threadgroupCount.width, threadgroupCount.height, threadgroupCount.depth); // Process dependencies - insert barriers for buffers and textures const Dependencies* deps = &dependencies; std::vector uavResources; while (deps) { // Handle buffer dependencies for (IBuffer* buf : deps->buffers) { if (!buf) { break; } auto* d3dBuffer = static_cast(buf); uavResources.push_back(d3dBuffer->getResource()); } // Handle texture dependencies for (ITexture* tex : deps->textures) { if (!tex) { break; } auto* d3dTexture = static_cast(tex); // Ensure texture is in proper state for compute access d3dTexture->transitionAll(commandList, D3D12_RESOURCE_STATE_UNORDERED_ACCESS); uavResources.push_back(d3dTexture->getResource()); } deps = deps->next; } // Insert UAV barriers for dependent resources before dispatch if (!uavResources.empty()) { std::vector barriers; barriers.reserve(uavResources.size()); for (ID3D12Resource* resource : uavResources) { D3D12_RESOURCE_BARRIER barrier = {}; barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_UAV; barrier.UAV.pResource = resource; barriers.push_back(barrier); } commandList->ResourceBarrier(static_cast(barriers.size()), barriers.data()); IGL_D3D12_LOG_VERBOSE("ComputeCommandEncoder: Inserted %zu UAV barriers before dispatch\n", barriers.size()); } // Apply all resource bindings (textures, samplers, buffers, UAVs) before dispatch. // For compute pipelines, pass nullptr since there's no RenderPipelineState Result bindResult; if (!resourcesBinder_.updateBindings(nullptr, &bindResult)) { IGL_LOG_ERROR("dispatchThreadGroups: Failed to update resource bindings: %s\n", bindResult.message.c_str()); return; } // Bind all cached resources to root parameters // Root signature layout (from Device::createComputePipeline): // - Parameter 0: Root Constants (b0) - 16 DWORDs // - Parameter 1: UAV table (u0-uN) // - Parameter 2: SRV table (t0-tN) // - Parameter 3: CBV table (b1-bN) // - Parameter 4: Sampler table (s0-sN) // Bind UAVs (parameter 1), with debug validation to catch sparse binding. if (boundUavCount_ > 0) { IGL_DEBUG_ASSERT(cachedUavHandles_[0].ptr != 0, "UAV count > 0 but base handle is null - did you bind only higher slots?"); if (cachedUavHandles_[0].ptr != 0) { commandList->SetComputeRootDescriptorTable(1, cachedUavHandles_[0]); IGL_D3D12_LOG_VERBOSE("ComputeCommandEncoder: Bound %zu UAVs\n", boundUavCount_); } else { IGL_LOG_ERROR( "ComputeCommandEncoder: UAV count > 0 but base handle is null - skipping binding and " "clearing boundUavCount_ to 0\n"); // Clear count to avoid repeated errors on subsequent dispatches boundUavCount_ = 0; } } // Bind SRVs (Parameter 2) if (boundSrvCount_ > 0) { IGL_DEBUG_ASSERT(cachedSrvHandles_[0].ptr != 0, "SRV count > 0 but base handle is null - did you bind only higher slots?"); if (cachedSrvHandles_[0].ptr != 0) { commandList->SetComputeRootDescriptorTable(2, cachedSrvHandles_[0]); IGL_D3D12_LOG_VERBOSE("ComputeCommandEncoder: Bound %zu SRVs\n", boundSrvCount_); } else { IGL_LOG_ERROR( "ComputeCommandEncoder: SRV count > 0 but base handle is null - skipping binding and " "clearing boundSrvCount_ to 0\n"); // Clear count to avoid repeated errors on subsequent dispatches boundSrvCount_ = 0; } } // Bind CBVs (parameter 3). Only create/allocate CBV descriptors when bindings have // changed or the heap page has changed. if (boundCbvCount_ > 0) { auto& context = commandBuffer_.getContext(); auto& frameCtx = context.getFrameContexts()[context.getCurrentFrameIndex()]; const uint32_t currentPageIdx = frameCtx.currentCbvSrvUavPageIndex; // Check if heap page changed - invalidates cached descriptors const bool heapPageChanged = (cachedCbvPageIndex_ != currentPageIdx); if (heapPageChanged) { cbvBindingsDirty_ = true; IGL_D3D12_LOG_VERBOSE( "ComputeCommandEncoder: Heap page changed (%u -> %u), invalidating CBV cache\n", cachedCbvPageIndex_, currentPageIdx); } // Only recreate descriptors if bindings are dirty or heap changed if (cbvBindingsDirty_) { auto* device = context.getDevice(); // Allocate descriptors for CBV table - use fixed-size array to avoid heap allocation uint32_t cbvIndices[kMaxComputeBuffers] = {}; for (size_t i = 0; i < boundCbvCount_; ++i) { uint32_t descriptorIndex = 0; Result allocResult = commandBuffer_.getNextCbvSrvUavDescriptor(&descriptorIndex); if (!allocResult.isOk()) { IGL_LOG_ERROR("ComputeCommandEncoder: Failed to allocate CBV descriptor %zu: %s\n", i, allocResult.message.c_str()); return; } cbvIndices[i] = descriptorIndex; } // Create CBV descriptors for all bound constant buffers for (size_t i = 0; i < boundCbvCount_; ++i) { if (cachedCbvAddresses_[i] != 0 && cachedCbvSizes_[i] > 0) { const uint32_t descriptorIndex = cbvIndices[i]; D3D12_CPU_DESCRIPTOR_HANDLE cpuHandle = context.getCbvSrvUavCpuHandle(descriptorIndex); // Enforce 64 KB limit for CBVs. constexpr size_t kMaxCBVSize = 65536; // 64 KB (D3D12 spec limit) if (cachedCbvSizes_[i] > kMaxCBVSize) { IGL_LOG_ERROR( "ComputeCommandEncoder: Constant buffer %zu size (%zu bytes) exceeds D3D12 64 KB " "limit\n", i, cachedCbvSizes_[i]); continue; // Skip this CBV } // Align size to 256-byte boundary (D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT) const size_t alignedSize = (cachedCbvSizes_[i] + 255) & ~255; IGL_DEBUG_ASSERT(alignedSize <= kMaxCBVSize, "CBV size exceeds 64 KB after alignment"); D3D12_CONSTANT_BUFFER_VIEW_DESC cbvDesc = {}; cbvDesc.BufferLocation = cachedCbvAddresses_[i]; cbvDesc.SizeInBytes = static_cast(alignedSize); device->CreateConstantBufferView(&cbvDesc, cpuHandle); } } // Cache the base index and page for reuse cachedCbvBaseIndex_ = cbvIndices[0]; cachedCbvPageIndex_ = currentPageIdx; cbvBindingsDirty_ = false; IGL_D3D12_LOG_VERBOSE( "ComputeCommandEncoder: Created %zu CBV descriptors at page %u (descriptors %u-%u)\n", boundCbvCount_, currentPageIdx, cbvIndices[0], cbvIndices[boundCbvCount_ - 1]); } // Recompute GPU handle from cached base index for current heap D3D12_GPU_DESCRIPTOR_HANDLE gpuHandle = context.getCbvSrvUavGpuHandle(cachedCbvBaseIndex_); // Defensive check: ensure handle is valid before binding IGL_DEBUG_ASSERT(gpuHandle.ptr != 0, "CBV count > 0 but GPU handle is null"); if (gpuHandle.ptr != 0) { commandList->SetComputeRootDescriptorTable(3, gpuHandle); IGL_D3D12_LOG_VERBOSE( "ComputeCommandEncoder: Bound %zu CBVs via descriptor table (base index %u)\n", boundCbvCount_, cachedCbvBaseIndex_); } else { IGL_LOG_ERROR("ComputeCommandEncoder: CBV GPU handle is null, skipping binding\n"); } } // Bind Samplers (Parameter 4) if (boundSamplerCount_ > 0) { IGL_DEBUG_ASSERT(cachedSamplerHandles_[0].ptr != 0, "Sampler count > 0 but base handle is null - did you bind only higher slots?"); if (cachedSamplerHandles_[0].ptr != 0) { commandList->SetComputeRootDescriptorTable(4, cachedSamplerHandles_[0]); IGL_D3D12_LOG_VERBOSE("ComputeCommandEncoder: Bound %zu samplers\n", boundSamplerCount_); } else { IGL_LOG_ERROR( "ComputeCommandEncoder: Sampler count > 0 but base handle is null - skipping binding and " "clearing boundSamplerCount_ to 0\n"); // Clear count to avoid repeated errors on subsequent dispatches boundSamplerCount_ = 0; } } // Dispatch compute work // Note: threadgroupSize is embedded in the compute shader ([numthreads(...)]) commandList->Dispatch(threadgroupCount.width, threadgroupCount.height, threadgroupCount.depth); // Insert resource-specific UAV barriers for bound UAVs to ensure compute writes are visible. // Only barrier UAVs that were actually bound (more efficient than a global barrier). if (boundUavCount_ > 0) { // Use fixed-size array to avoid heap allocation in hot path D3D12_RESOURCE_BARRIER barriers[kMaxComputeBuffers]; UINT barrierCount = 0; for (size_t i = 0; i < boundUavCount_; ++i) { if (boundUavResources_[i] != nullptr) { D3D12_RESOURCE_BARRIER& barrier = barriers[barrierCount++]; barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_UAV; barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE; barrier.UAV.pResource = boundUavResources_[i]; // Resource-specific UAV barrier } } if (barrierCount > 0) { commandList->ResourceBarrier(barrierCount, barriers); IGL_D3D12_LOG_VERBOSE( "ComputeCommandEncoder::dispatchThreadGroups - dispatch complete, %u resource-specific " "UAV barriers inserted\n", barrierCount); } } } void ComputeCommandEncoder::bindPushConstants(const void* data, size_t length, size_t offset) { auto* commandList = commandBuffer_.getCommandList(); if (!commandBuffer_.isRecording() || !commandList || !data || length == 0) { IGL_LOG_ERROR( "ComputeCommandEncoder::bindPushConstants: Invalid parameters or closed command list " "(list=%p, data=%p, len=%zu)\n", commandList, data, length); return; } // Compute root signature parameter 0 is declared as D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS // (b0). Increased to 32 DWORDs (128 bytes) to match Vulkan. constexpr size_t kMaxPushConstantBytes = 128; if (length + offset > kMaxPushConstantBytes) { IGL_LOG_ERROR( "ComputeCommandEncoder::bindPushConstants: size %zu + offset %zu exceeds maximum %zu " "bytes\n", length, offset, kMaxPushConstantBytes); return; } // Calculate number of 32-bit values and offset in DWORDs const uint32_t num32BitValues = static_cast((length + 3) / 4); // Round up to DWORDs const uint32_t destOffsetIn32BitValues = static_cast(offset / 4); // Use SetComputeRoot32BitConstants to directly write data to root constants // Root parameter 0 = b0 (Push Constants), as declared in compute root signature commandList->SetComputeRoot32BitConstants( 0, // Root parameter index (push constants at parameter 0) num32BitValues, // Number of 32-bit values to set data, // Source data destOffsetIn32BitValues); // Destination offset in 32-bit values IGL_D3D12_LOG_VERBOSE( "ComputeCommandEncoder::bindPushConstants: Set %u DWORDs (%zu bytes) at offset %zu to root " "parameter 0 (b0)\n", num32BitValues, length, offset); } void ComputeCommandEncoder::bindTexture(uint32_t index, ITexture* texture) { // Delegate to D3D12ResourcesBinder for centralized descriptor management. resourcesBinder_.bindTexture(index, texture); } void ComputeCommandEncoder::bindBuffer(uint32_t index, IBuffer* buffer, size_t offset, size_t /*bufferSize*/) { if (!buffer) { IGL_D3D12_LOG_VERBOSE("ComputeCommandEncoder::bindBuffer: null buffer\n"); return; } auto* d3dBuffer = static_cast(buffer); auto& context = commandBuffer_.getContext(); auto* device = context.getDevice(); if (!device || context.getCbvSrvUavHeap() == nullptr) { IGL_LOG_ERROR( "ComputeCommandEncoder::bindBuffer: missing device or per-frame descriptor heap\n"); return; } // Determine buffer type const auto bufferType = d3dBuffer->getBufferType(); const bool isUniformBuffer = (bufferType & BufferDesc::BufferTypeBits::Uniform) != 0; const bool isStorageBuffer = (bufferType & BufferDesc::BufferTypeBits::Storage) != 0; IGL_D3D12_LOG_VERBOSE("ComputeCommandEncoder::bindBuffer(%u): isUniform=%d, isStorage=%d\n", index, isUniformBuffer, isStorageBuffer); if (isStorageBuffer) { // Storage buffer - bind as UAV (unordered access view) for read/write if (index >= kMaxComputeBuffers) { IGL_LOG_ERROR("ComputeCommandEncoder::bindBuffer: UAV index %u exceeds max %zu\n", index, kMaxComputeBuffers); return; } // Determine element stride for structured buffer views // If storageStride is not specified, default to 4 bytes to preserve existing behavior size_t elementStride = d3dBuffer->getStorageElementStride(); if (elementStride == 0) { elementStride = 4; } // D3D12 requires UAV buffer views to use element-aligned offsets if (offset % elementStride != 0) { IGL_LOG_ERROR( "ComputeCommandEncoder::bindBuffer: Storage buffer offset %zu is not aligned to " "element stride (%zu bytes). UAV FirstElement will be truncated (offset/stride).\n", offset, elementStride); // Continue but log warning – FirstElement below uses integer division } // Validate offset doesn't exceed buffer size to prevent underflow const size_t bufferSizeBytes = d3dBuffer->getSizeInBytes(); if (offset > bufferSizeBytes) { IGL_LOG_ERROR( "ComputeCommandEncoder::bindBuffer: Storage buffer offset %zu exceeds buffer size %zu; " "skipping UAV binding\n", offset, bufferSizeBytes); return; } const size_t remaining = bufferSizeBytes - offset; // Check for undersized buffer (would create empty or partial view) if (remaining < elementStride) { IGL_LOG_ERROR( "ComputeCommandEncoder::bindBuffer: Remaining buffer size %zu is less than element " "stride %zu; " "UAV will have NumElements=0 (empty view). Check buffer size and offset.\n", remaining, elementStride); // Continue to create the descriptor, but it will be empty (NumElements=0) } // Use Result-based allocation with dynamic heap growth. uint32_t descriptorIndex = 0; Result allocResult = commandBuffer_.getNextCbvSrvUavDescriptor(&descriptorIndex); if (!allocResult.isOk()) { IGL_LOG_ERROR("ComputeCommandEncoder::bindBuffer: Failed to allocate UAV descriptor: %s\n", allocResult.message.c_str()); return; } D3D12_CPU_DESCRIPTOR_HANDLE cpuHandle = context.getCbvSrvUavCpuHandle(descriptorIndex); D3D12_GPU_DESCRIPTOR_HANDLE gpuHandle = context.getCbvSrvUavGpuHandle(descriptorIndex); // Create UAV descriptor for RWStructuredBuffer (structured buffer) // D3D12 compute shaders expect structured buffers, not raw buffers D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = {}; uavDesc.Format = DXGI_FORMAT_UNKNOWN; // Required for structured buffers uavDesc.ViewDimension = D3D12_UAV_DIMENSION_BUFFER; // Element index and count are expressed in units of elementStride bytes // Division truncates if offset is not aligned; see warning above uavDesc.Buffer.FirstElement = static_cast(offset / elementStride); // CRITICAL: NumElements must be (size - offset) / stride, not total size / stride uavDesc.Buffer.NumElements = static_cast(remaining / elementStride); uavDesc.Buffer.StructureByteStride = static_cast(elementStride); uavDesc.Buffer.CounterOffsetInBytes = 0; uavDesc.Buffer.Flags = D3D12_BUFFER_UAV_FLAG_NONE; // No flags for structured buffers // Pre-creation validation. IGL_DEBUG_ASSERT(device != nullptr, "Device is null before CreateUnorderedAccessView"); IGL_DEBUG_ASSERT(d3dBuffer->getResource() != nullptr, "Buffer resource is null"); IGL_DEBUG_ASSERT(cpuHandle.ptr != 0, "UAV descriptor handle is invalid"); device->CreateUnorderedAccessView(d3dBuffer->getResource(), nullptr, &uavDesc, cpuHandle); cachedUavHandles_[index] = gpuHandle; for (size_t i = index + 1; i < kMaxComputeBuffers; ++i) { cachedUavHandles_[i] = {}; } boundUavCount_ = static_cast(index + 1); // Track UAV resource for precise barrier synchronization. // Note: UAV bindings are assumed to be dense (slots 0..boundUavCount_-1). // Both cachedUavHandles_ and boundUavResources_ rely on this invariant. boundUavResources_[index] = d3dBuffer->getResource(); for (size_t i = index + 1; i < kMaxComputeBuffers; ++i) { boundUavResources_[i] = nullptr; } IGL_D3D12_LOG_VERBOSE( "ComputeCommandEncoder::bindBuffer: Created UAV at index %u, descriptor slot %u\n", index, descriptorIndex); commandBuffer_.trackTransientResource(d3dBuffer->getResource()); } else if (isUniformBuffer) { // Uniform buffer - bind as CBV (constant buffer view) if (index >= kMaxComputeBuffers) { IGL_LOG_ERROR("ComputeCommandEncoder::bindBuffer: CBV index %u exceeds max %zu\n", index, kMaxComputeBuffers); return; } // Enforce dense binding: CBVs must start at slot 0 with no gaps if (index > 0 && cachedCbvAddresses_[0] == 0) { IGL_LOG_ERROR( "ComputeCommandEncoder::bindBuffer: CBV bindings must be dense starting from slot 0. " "Cannot bind slot %u when slot 0 is not bound.\n", index); return; } // Check for gaps in bindings for (size_t i = 0; i < index; ++i) { if (cachedCbvAddresses_[i] == 0) { IGL_LOG_ERROR( "ComputeCommandEncoder::bindBuffer: CBV bindings must be dense. " "Cannot bind slot %u when slot %zu is not bound (gap detected).\n", index, i); return; } } // D3D12 requires constant buffer addresses to be 256-byte aligned // (D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT) if ((offset & 255) != 0) { IGL_LOG_ERROR( "ComputeCommandEncoder::bindBuffer: ERROR - CBV offset %zu is not 256-byte aligned " "(required by D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT). " "Constant buffers must be created at aligned offsets. Ignoring bind request.\n", offset); return; } cachedCbvAddresses_[index] = d3dBuffer->gpuAddress(offset); // Store buffer size for CBV descriptor creation on the next dispatch. // Actual descriptor creation happens in dispatchThreadGroups when cbvBindingsDirty_ is set. size_t bufferSize = d3dBuffer->getSizeInBytes() - offset; // D3D12 spec: Constant buffers must be ≤ 64 KB constexpr size_t kMaxCBVSize = 65536; // 64 KB if (bufferSize > kMaxCBVSize) { IGL_LOG_ERROR( "ComputeCommandEncoder::bindBuffer: Buffer size (%zu bytes) exceeds D3D12 64 KB limit " "for constant buffers at index %u. Clamping to 64 KB.\n", bufferSize, index); bufferSize = kMaxCBVSize; } cachedCbvSizes_[index] = bufferSize; for (size_t i = index + 1; i < kMaxComputeBuffers; ++i) { cachedCbvAddresses_[i] = 0; cachedCbvSizes_[i] = 0; } boundCbvCount_ = static_cast(index + 1); // Mark CBV bindings as dirty to trigger descriptor recreation on the next dispatch. cbvBindingsDirty_ = true; IGL_D3D12_LOG_VERBOSE( "ComputeCommandEncoder::bindBuffer: Cached CBV at index %u, address 0x%llx, size %zu\n", index, cachedCbvAddresses_[index], cachedCbvSizes_[index]); commandBuffer_.trackTransientResource(d3dBuffer->getResource()); } else { IGL_LOG_ERROR("ComputeCommandEncoder::bindBuffer: Buffer must be Uniform or Storage type\n"); } } void ComputeCommandEncoder::bindUniform(const UniformDesc& /*uniformDesc*/, const void* /*data*/) { // Single uniform binding not supported in D3D12 // Use uniform buffers (CBVs) instead IGL_D3D12_LOG_VERBOSE( "ComputeCommandEncoder::bindUniform - not supported, use uniform buffers\n"); } void ComputeCommandEncoder::bindBytes(uint32_t /*index*/, const void* /*data*/, size_t /*length*/) { // D3D12 backend does not support bindBytes // Applications should use uniform buffers (bindBuffer) instead // This is a no-op to maintain compatibility with cross-platform code IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); IGL_LOG_INFO_ONCE( "bindBytes is not supported in D3D12 backend. Use bindBuffer with uniform buffers " "instead.\n"); } void ComputeCommandEncoder::bindImageTexture(uint32_t index, ITexture* texture, TextureFormat /*format*/) { if (!texture) { IGL_D3D12_LOG_VERBOSE("ComputeCommandEncoder::bindImageTexture: null texture\n"); return; } if (index >= kMaxComputeBuffers) { IGL_LOG_ERROR("ComputeCommandEncoder::bindImageTexture: index %u exceeds max %zu\n", index, kMaxComputeBuffers); return; } auto& context = commandBuffer_.getContext(); auto* device = context.getDevice(); auto* d3dTexture = static_cast(texture); if (!device || !d3dTexture->getResource() || context.getCbvSrvUavHeap() == nullptr) { IGL_LOG_ERROR( "ComputeCommandEncoder::bindImageTexture: missing device, resource, or per-frame heap\n"); return; } // Transition texture to UAV state for compute shader read/write access auto* commandList = commandBuffer_.getCommandList(); if (commandList) { d3dTexture->transitionAll(commandList, D3D12_RESOURCE_STATE_UNORDERED_ACCESS); } // Allocate descriptor and create UAV using Result-based allocation with dynamic heap growth. uint32_t descriptorIndex = 0; Result allocResult = commandBuffer_.getNextCbvSrvUavDescriptor(&descriptorIndex); if (!allocResult.isOk()) { IGL_LOG_ERROR( "ComputeCommandEncoder::bindImageTexture: Failed to allocate UAV descriptor: %s\n", allocResult.message.c_str()); return; } D3D12_CPU_DESCRIPTOR_HANDLE cpuHandle = context.getCbvSrvUavCpuHandle(descriptorIndex); D3D12_GPU_DESCRIPTOR_HANDLE gpuHandle = context.getCbvSrvUavGpuHandle(descriptorIndex); // Create UAV descriptor D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = {}; uavDesc.Format = textureFormatToDXGIFormat(d3dTexture->getFormat()); auto resourceDesc = d3dTexture->getResource()->GetDesc(); if (resourceDesc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D) { uavDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE3D; uavDesc.Texture3D.MipSlice = 0; uavDesc.Texture3D.FirstWSlice = 0; uavDesc.Texture3D.WSize = resourceDesc.DepthOrArraySize; } else if (resourceDesc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE2D) { if (resourceDesc.DepthOrArraySize > 1) { uavDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2DARRAY; uavDesc.Texture2DArray.MipSlice = 0; uavDesc.Texture2DArray.FirstArraySlice = 0; uavDesc.Texture2DArray.ArraySize = resourceDesc.DepthOrArraySize; uavDesc.Texture2DArray.PlaneSlice = 0; } else { uavDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D; uavDesc.Texture2D.MipSlice = 0; uavDesc.Texture2D.PlaneSlice = 0; } } else { IGL_LOG_ERROR("ComputeCommandEncoder::bindImageTexture: unsupported dimension\n"); return; } // Pre-creation validation. IGL_DEBUG_ASSERT(device != nullptr, "Device is null before CreateUnorderedAccessView"); IGL_DEBUG_ASSERT(d3dTexture->getResource() != nullptr, "Texture resource is null"); IGL_DEBUG_ASSERT(cpuHandle.ptr != 0, "UAV descriptor handle is invalid"); device->CreateUnorderedAccessView(d3dTexture->getResource(), nullptr, &uavDesc, cpuHandle); cachedUavHandles_[index] = gpuHandle; for (size_t i = index + 1; i < kMaxComputeBuffers; ++i) { cachedUavHandles_[i] = {}; } boundUavCount_ = static_cast(index + 1); // Track UAV resources for precise barrier synchronization. // Note: UAV bindings are assumed to be dense (slots 0..boundUavCount_-1). // Both cachedUavHandles_ and boundUavResources_ rely on this invariant. boundUavResources_[index] = d3dTexture->getResource(); for (size_t i = index + 1; i < kMaxComputeBuffers; ++i) { boundUavResources_[i] = nullptr; } IGL_D3D12_LOG_VERBOSE( "ComputeCommandEncoder::bindImageTexture: Created UAV at index %u, descriptor slot %u\n", index, descriptorIndex); } void ComputeCommandEncoder::bindSamplerState(uint32_t index, ISamplerState* samplerState) { // Delegate to D3D12ResourcesBinder for centralized descriptor management. resourcesBinder_.bindSamplerState(index, samplerState); } void ComputeCommandEncoder::pushDebugGroupLabel(const char* label, const Color& /*color*/) const { auto* commandList = commandBuffer_.getCommandList(); if (!commandBuffer_.isRecording() || !commandList || !label) { return; } // PIX debug markers const size_t len = strlen(label); std::wstring wlabel(len, L' '); std::mbstowcs(&wlabel[0], label, len); commandList->BeginEvent( 0, wlabel.c_str(), static_cast((wlabel.length() + 1) * sizeof(wchar_t))); } void ComputeCommandEncoder::insertDebugEventLabel(const char* label, const Color& /*color*/) const { auto* commandList = commandBuffer_.getCommandList(); if (!commandBuffer_.isRecording() || !commandList || !label) { return; } const size_t len = strlen(label); std::wstring wlabel(len, L' '); std::mbstowcs(&wlabel[0], label, len); commandList->SetMarker( 0, wlabel.c_str(), static_cast((wlabel.length() + 1) * sizeof(wchar_t))); } void ComputeCommandEncoder::popDebugGroupLabel() const { auto* commandList = commandBuffer_.getCommandList(); if (!commandBuffer_.isRecording() || !commandList) { return; } commandList->EndEvent(); } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/ComputeCommandEncoder.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::d3d12 { class CommandBuffer; class ComputePipelineState; class ComputeCommandEncoder final : public IComputeCommandEncoder { public: explicit ComputeCommandEncoder(CommandBuffer& commandBuffer); ~ComputeCommandEncoder() override = default; void endEncoding() override; void bindComputePipelineState( const std::shared_ptr& pipelineState) override; void dispatchThreadGroups(const Dimensions& threadgroupCount, const Dimensions& threadgroupSize, const Dependencies& dependencies = {}) override; void bindPushConstants(const void* data, size_t length, size_t offset = 0) override; void bindTexture(uint32_t index, ITexture* texture) override; /** * @brief Bind a buffer to a compute shader slot * * IMPORTANT: For constant buffers (uniform buffers) in compute shaders, bindings MUST be DENSE * starting from index 0 with NO GAPS. For example: * - VALID: bindBuffer(0, ...), bindBuffer(1, ...), bindBuffer(2, ...) * - INVALID: bindBuffer(0, ...), bindBuffer(2, ...) // gap at index 1 * - INVALID: bindBuffer(1, ...), bindBuffer(2, ...) // index 0 not bound * * This constraint is enforced by D3D12ResourcesBinder and will return InvalidOperation if * violated. See D3D12ResourcesBinder::updateBufferBindings for implementation details. * * @param index Buffer slot index (maps to HLSL register b0, b1, etc. for CBVs) * @param buffer Buffer to bind * @param offset Offset in bytes into the buffer * @param bufferSize Size of the buffer region to bind */ void bindBuffer(uint32_t index, IBuffer* buffer, size_t offset = 0, size_t bufferSize = 0) override; void bindUniform(const UniformDesc& uniformDesc, const void* data) override; void bindBytes(uint32_t index, const void* data, size_t length) override; void bindImageTexture(uint32_t index, ITexture* texture, TextureFormat format) override; void bindSamplerState(uint32_t index, ISamplerState* samplerState) override; // Debug labels void pushDebugGroupLabel(const char* label, const Color& color) const override; void insertDebugEventLabel(const char* label, const Color& color) const override; void popDebugGroupLabel() const override; private: CommandBuffer& commandBuffer_; const ComputePipelineState* currentPipeline_ = nullptr; bool isEncoding_ = false; // Centralized resource binding management. D3D12ResourcesBinder resourcesBinder_; // Cached GPU handles for resources // IMPORTANT: Bindings must be DENSE and start at slot 0 for each table. // SetComputeRootDescriptorTable always uses cached*Handles_[0] as the base, // so binding only higher slots (e.g., slot 1 without slot 0) will fail. static constexpr size_t kMaxComputeBuffers = 8; // Increased from 8 to 16 to match IGL_TEXTURE_SAMPLERS_MAX contract. static constexpr size_t kMaxComputeTextures = IGL_TEXTURE_SAMPLERS_MAX; // 16 // Increased from 4 to 16 to match IGL_TEXTURE_SAMPLERS_MAX contract. static constexpr size_t kMaxComputeSamplers = IGL_TEXTURE_SAMPLERS_MAX; // 16 D3D12_GPU_DESCRIPTOR_HANDLE cachedUavHandles_[kMaxComputeBuffers] = {}; D3D12_GPU_DESCRIPTOR_HANDLE cachedSrvHandles_[kMaxComputeTextures] = {}; D3D12_GPU_DESCRIPTOR_HANDLE cachedSamplerHandles_[kMaxComputeSamplers] = {}; D3D12_GPU_VIRTUAL_ADDRESS cachedCbvAddresses_[kMaxComputeBuffers] = {}; // Track CBV sizes for descriptor creation. size_t cachedCbvSizes_[kMaxComputeBuffers] = {}; size_t boundUavCount_ = 0; size_t boundSrvCount_ = 0; size_t boundCbvCount_ = 0; size_t boundSamplerCount_ = 0; // Cache CBV descriptor indices to avoid per-dispatch allocation. uint32_t cachedCbvBaseIndex_ = 0; uint32_t cachedCbvPageIndex_ = UINT32_MAX; // Track heap page for invalidation bool cbvBindingsDirty_ = true; // Track if CBV bindings have changed // Track UAV resources for precise synchronization barriers. // Tracks UAV resources bound via bindBuffer (storage buffers) and bindImageTexture (RW textures). ID3D12Resource* boundUavResources_[kMaxComputeBuffers] = {}; }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/ComputePipelineState.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include namespace igl::d3d12 { ComputePipelineState::ComputePipelineState(const ComputePipelineDesc& desc, igl::d3d12::ComPtr pipelineState, igl::d3d12::ComPtr rootSignature) : desc_(desc), pipelineState_(std::move(pipelineState)), rootSignature_(std::move(rootSignature)) { // Set D3D12 object names for PIX debugging const std::string& debugName = desc_.debugName; if (pipelineState_.Get() && !debugName.empty()) { std::wstring wideName(debugName.begin(), debugName.end()); pipelineState_->SetName((L"ComputePSO_" + wideName).c_str()); IGL_D3D12_LOG_VERBOSE("ComputePipelineState: Set PIX debug name 'ComputePSO_%s'\n", debugName.c_str()); } if (rootSignature_.Get() && !debugName.empty()) { std::wstring wideName(debugName.begin(), debugName.end()); rootSignature_->SetName((L"ComputeRootSig_" + wideName).c_str()); IGL_D3D12_LOG_VERBOSE("ComputePipelineState: Set PIX root signature name 'ComputeRootSig_%s'\n", debugName.c_str()); } } std::shared_ptr ComputePipelineState::computePipelineReflection() { // Return cached reflection if already created if (reflection_) { return reflection_; } // Reflection implementation following the pattern from RenderPipelineState struct ReflectionImpl final : public IComputePipelineReflection { std::vector ubs; std::vector samplers; std::vector textures; const std::vector& allUniformBuffers() const override { return ubs; } const std::vector& allSamplers() const override { return samplers; } const std::vector& allTextures() const override { return textures; } }; auto out = std::make_shared(); // Get compute shader module and reflect it if (!desc_.shaderStages) { return out; } auto computeModule = desc_.shaderStages->getComputeModule(); if (!computeModule) { return out; } auto* d3dMod = dynamic_cast(computeModule.get()); if (!d3dMod) { return out; } const auto& bc = d3dMod->getBytecode(); if (bc.empty()) { return out; } // Create shader reflection interface using D3DReflect igl::d3d12::ComPtr refl; if (FAILED(D3DReflect(bc.data(), bc.size(), IID_PPV_ARGS(refl.GetAddressOf())))) { return out; } D3D12_SHADER_DESC sd{}; if (FAILED(refl->GetDesc(&sd))) { return out; } // Extract constant buffer information for (UINT i = 0; i < sd.ConstantBuffers; ++i) { auto* cb = refl->GetConstantBufferByIndex(i); D3D12_SHADER_BUFFER_DESC cbd{}; if (FAILED(cb->GetDesc(&cbd))) { continue; } // Find the bind point for this constant buffer int bufferIndex = -1; for (UINT r = 0; r < sd.BoundResources; ++r) { D3D12_SHADER_INPUT_BIND_DESC bind{}; if (SUCCEEDED(refl->GetResourceBindingDesc(r, &bind))) { if (bind.Type == D3D_SIT_CBUFFER && std::string(bind.Name) == std::string(cbd.Name)) { bufferIndex = static_cast(bind.BindPoint); break; } } } BufferArgDesc ub; ub.name = igl::genNameHandle(cbd.Name ? cbd.Name : ""); ub.bufferAlignment = 256; // D3D12 constant buffer alignment ub.bufferDataSize = cbd.Size; ub.bufferIndex = bufferIndex; ub.shaderStage = ShaderStage::Compute; ub.isUniformBlock = true; // Extract member variables from constant buffer for (UINT v = 0; v < cbd.Variables; ++v) { auto* var = cb->GetVariableByIndex(v); D3D12_SHADER_VARIABLE_DESC vd{}; if (FAILED(var->GetDesc(&vd))) { continue; } auto* t = var->GetType(); if (!t) { continue; } D3D12_SHADER_TYPE_DESC td{}; if (FAILED(t->GetDesc(&td))) { continue; } BufferArgDesc::BufferMemberDesc m; m.name = igl::genNameHandle(vd.Name ? vd.Name : ""); m.type = ReflectionUtils::mapUniformType(td); m.offset = vd.StartOffset; m.arrayLength = td.Elements ? td.Elements : 1; ub.members.push_back(std::move(m)); } out->ubs.push_back(std::move(ub)); } // Extract texture and sampler bindings for (UINT r = 0; r < sd.BoundResources; ++r) { D3D12_SHADER_INPUT_BIND_DESC bind{}; if (FAILED(refl->GetResourceBindingDesc(r, &bind))) { continue; } if (bind.Type == D3D_SIT_TEXTURE) { TextureArgDesc t; t.name = bind.Name ? bind.Name : ""; t.type = TextureType::TwoD; t.textureIndex = bind.BindPoint; t.shaderStage = ShaderStage::Compute; out->textures.push_back(std::move(t)); } else if (bind.Type == D3D_SIT_SAMPLER) { SamplerArgDesc s; s.name = bind.Name ? bind.Name : ""; s.samplerIndex = bind.BindPoint; s.shaderStage = ShaderStage::Compute; out->samplers.push_back(std::move(s)); } } // Cache the reflection for future calls reflection_ = out; return reflection_; } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/ComputePipelineState.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::d3d12 { class ComputePipelineState final : public IComputePipelineState { public: ComputePipelineState(const ComputePipelineDesc& desc, igl::d3d12::ComPtr pipelineState, igl::d3d12::ComPtr rootSignature); ~ComputePipelineState() override = default; std::shared_ptr computePipelineReflection() override; // D3D12-specific accessors ID3D12PipelineState* getPipelineState() const { return pipelineState_.Get(); } ID3D12RootSignature* getRootSignature() const { return rootSignature_.Get(); } private: ComputePipelineDesc desc_; igl::d3d12::ComPtr pipelineState_; igl::d3d12::ComPtr rootSignature_; std::shared_ptr reflection_; }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/D3D12AllocatorPool.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include namespace igl::d3d12 { void D3D12AllocatorPool::initialize(D3D12Context& ctx, IFenceProvider* fenceProvider) { auto* device = ctx.getDevice(); if (!device) { IGL_LOG_ERROR("D3D12AllocatorPool::initialize: D3D12 device is null\n"); return; } HRESULT hr = device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(uploadFence_.GetAddressOf())); if (FAILED(hr)) { IGL_LOG_ERROR("D3D12AllocatorPool::initialize: Failed to create upload fence: 0x%08X\n", hr); } else { uploadFenceValue_ = 0; IGL_D3D12_LOG_VERBOSE("D3D12AllocatorPool::initialize: Upload fence created successfully\n"); } // Use upload ring buffer size from D3D12ContextConfig instead of hardcoding. const uint64_t uploadRingBufferSize = ctx.getConfig().uploadRingBufferSize; uploadRingBuffer_ = std::make_unique(device, uploadRingBufferSize); auto* commandQueue = ctx.getCommandQueue(); if (commandQueue && uploadFence_.Get() && fenceProvider) { immediateCommands_ = std::make_unique( device, commandQueue, uploadFence_.Get(), fenceProvider); stagingDevice_ = std::make_unique(device, uploadFence_.Get(), uploadRingBuffer_.get()); } } void D3D12AllocatorPool::processCompletedUploads() { if (!uploadFence_.Get()) { return; } const UINT64 completed = uploadFence_->GetCompletedValue(); { std::lock_guard lock(pendingUploadsMutex_); auto it = pendingUploads_.begin(); while (it != pendingUploads_.end()) { if (it->fenceValue <= completed) { it = pendingUploads_.erase(it); } else { ++it; } } } if (uploadRingBuffer_) { uploadRingBuffer_->retire(completed); } } void D3D12AllocatorPool::trackUploadBuffer(ComPtr buffer, UINT64 fenceValue) { if (!buffer.Get()) { return; } std::lock_guard lock(pendingUploadsMutex_); pendingUploads_.push_back(PendingUpload{fenceValue, std::move(buffer)}); } ComPtr D3D12AllocatorPool::getUploadCommandAllocator(D3D12Context& ctx) { if (!uploadFence_.Get()) { IGL_LOG_ERROR( "D3D12AllocatorPool::getUploadCommandAllocator: Upload fence not " "initialized\n"); return nullptr; } std::lock_guard lock(commandAllocatorPoolMutex_); const UINT64 completedValue = uploadFence_->GetCompletedValue(); for (size_t i = 0; i < commandAllocatorPool_.size(); ++i) { auto& tracked = commandAllocatorPool_[i]; if (completedValue >= tracked.fenceValue) { auto allocator = tracked.allocator; commandAllocatorPool_[i] = commandAllocatorPool_.back(); commandAllocatorPool_.pop_back(); HRESULT hr = allocator->Reset(); if (FAILED(hr)) { IGL_LOG_ERROR( "D3D12AllocatorPool::getUploadCommandAllocator: " "CommandAllocator::Reset failed: 0x%08X\n", hr); return nullptr; } totalAllocatorReuses_++; return allocator; } } static constexpr size_t kMaxCommandAllocators = 256; if (totalCommandAllocatorsCreated_ >= kMaxCommandAllocators) { IGL_LOG_ERROR( "D3D12AllocatorPool::getUploadCommandAllocator: Command allocator " "pool exhausted\n"); return nullptr; } auto* device = ctx.getDevice(); if (!device) { IGL_LOG_ERROR("D3D12AllocatorPool::getUploadCommandAllocator: D3D12 device is null\n"); return nullptr; } ComPtr newAllocator; HRESULT hr = device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(newAllocator.GetAddressOf())); if (FAILED(hr)) { IGL_LOG_ERROR( "D3D12AllocatorPool::getUploadCommandAllocator: " "CreateCommandAllocator failed: 0x%08X\n", hr); return nullptr; } totalCommandAllocatorsCreated_++; return newAllocator; } void D3D12AllocatorPool::returnUploadCommandAllocator(ComPtr allocator, UINT64 fenceValue) { if (!allocator.Get()) { return; } std::lock_guard lock(commandAllocatorPoolMutex_); TrackedCommandAllocator tracked; tracked.allocator = allocator; tracked.fenceValue = fenceValue; commandAllocatorPool_.push_back(tracked); if (commandAllocatorPool_.size() > peakPoolSize_) { peakPoolSize_ = commandAllocatorPool_.size(); } } ::igl::Result D3D12AllocatorPool::waitForUploadFence(const Device& device, UINT64 fenceValue) const { if (!uploadFence_.Get()) { return ::igl::Result(::igl::Result::Code::InvalidOperation, "Upload fence not initialized"); } if (uploadFence_->GetCompletedValue() >= fenceValue) { return ::igl::Result(); } FenceWaiter waiter(uploadFence_.Get(), fenceValue); ::igl::Result waitResult = waiter.wait(); if (!waitResult.isOk()) { ::igl::Result deviceStatus = device.checkDeviceRemoval(); if (!deviceStatus.isOk()) { return deviceStatus; } return waitResult; } return Result(); } void D3D12AllocatorPool::clearOnDeviceDestruction() { { std::lock_guard lock(commandAllocatorPoolMutex_); commandAllocatorPool_.clear(); totalCommandAllocatorsCreated_ = 0; peakPoolSize_ = 0; totalAllocatorReuses_ = 0; } { std::lock_guard lock(pendingUploadsMutex_); pendingUploads_.clear(); } uploadRingBuffer_.reset(); stagingDevice_.reset(); immediateCommands_.reset(); } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/D3D12AllocatorPool.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl { class Result; } // namespace igl namespace igl::d3d12 { class Device; class D3D12Context; class UploadRingBuffer; class D3D12ImmediateCommands; class D3D12StagingDevice; class IFenceProvider; class D3D12AllocatorPool { public: D3D12AllocatorPool() = default; void initialize(D3D12Context& ctx, IFenceProvider* fenceProvider); void processCompletedUploads(); void trackUploadBuffer(ComPtr buffer, UINT64 fenceValue); ComPtr getUploadCommandAllocator(D3D12Context& ctx); void returnUploadCommandAllocator(ComPtr allocator, UINT64 fenceValue); ID3D12Fence* getUploadFence() const { return uploadFence_.Get(); } UINT64 getNextUploadFenceValue() { return ++uploadFenceValue_; } UINT64 getLastUploadFenceValue() const { return uploadFenceValue_; } UploadRingBuffer* getUploadRingBuffer() const { return uploadRingBuffer_.get(); } D3D12ImmediateCommands* getImmediateCommands() const { return immediateCommands_.get(); } D3D12StagingDevice* getStagingDevice() const { return stagingDevice_.get(); } ::igl::Result waitForUploadFence(const Device& device, UINT64 fenceValue) const; void clearOnDeviceDestruction(); private: struct PendingUpload { UINT64 fenceValue = 0; ComPtr resource; }; struct TrackedCommandAllocator { ComPtr allocator; UINT64 fenceValue = 0; }; std::mutex pendingUploadsMutex_; std::vector pendingUploads_; std::mutex commandAllocatorPoolMutex_; std::vector commandAllocatorPool_; size_t totalCommandAllocatorsCreated_ = 0; size_t peakPoolSize_ = 0; size_t totalAllocatorReuses_ = 0; ComPtr uploadFence_; UINT64 uploadFenceValue_ = 0; std::unique_ptr uploadRingBuffer_; std::unique_ptr immediateCommands_; std::unique_ptr stagingDevice_; }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/D3D12Context.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include namespace igl::d3d12 { namespace { // Import ComPtr for readability template using ComPtr = igl::d3d12::ComPtr; } // namespace // Static member initialization D3D12Context::ResourceStats D3D12Context::resourceStats_; std::mutex D3D12Context::resourceStatsMutex_; // AdapterInfo helper methods uint64_t D3D12Context::AdapterInfo::getDedicatedVideoMemoryMB() const { return desc.DedicatedVideoMemory / (1024 * 1024); } const char* D3D12Context::AdapterInfo::getVendorName() const { switch (desc.VendorId) { case 0x10DE: return "NVIDIA"; case 0x1002: case 0x1022: return "AMD"; case 0x8086: return "Intel"; case 0x1414: return "Microsoft"; default: return "Unknown"; } } // MemoryBudget helper methods uint64_t D3D12Context::MemoryBudget::totalAvailableMemory() const { return dedicatedVideoMemory + sharedSystemMemory; } double D3D12Context::MemoryBudget::getUsagePercentage() const { if (totalAvailableMemory() == 0) return 0.0; return (static_cast(estimatedUsage) / totalAvailableMemory()) * 100.0; } bool D3D12Context::MemoryBudget::isMemoryCritical() const { return getUsagePercentage() > 90.0; } bool D3D12Context::MemoryBudget::isMemoryLow() const { return getUsagePercentage() > 70.0; } // A-011: Helper function to probe highest supported feature level for an adapter D3D_FEATURE_LEVEL D3D12Context::getHighestFeatureLevel(IDXGIAdapter1* adapter) { const D3D_FEATURE_LEVEL featureLevels[] = { D3D_FEATURE_LEVEL_12_2, D3D_FEATURE_LEVEL_12_1, D3D_FEATURE_LEVEL_12_0, D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0, }; for (D3D_FEATURE_LEVEL fl : featureLevels) { if (SUCCEEDED(D3D12CreateDevice(adapter, fl, _uuidof(ID3D12Device), nullptr))) { return fl; } } return static_cast(0); // No supported feature level } D3D12Context::~D3D12Context() { // Wait for GPU to finish before cleanup waitForGPU(); // Explicitly release all frame context resources to prevent leaks. for (uint32_t i = 0; i < frameContexts_.size(); ++i) { frameContexts_[i].transientBuffers.clear(); frameContexts_[i].transientResources.clear(); // Explicitly reset heaps inside each page before clearing the vector. for (auto& page : frameContexts_[i].cbvSrvUavHeapPages) { page.heap.Reset(); } frameContexts_[i].cbvSrvUavHeapPages.clear(); frameContexts_[i].samplerHeap.Reset(); frameContexts_[i].activeCbvSrvUavHeap.Reset(); frameContexts_[i].allocator.Reset(); } // Release render targets explicitly. for (uint32_t i = 0; i < renderTargets_.size(); ++i) { renderTargets_[i].Reset(); } // Release command signatures. drawIndirectSignature_.Reset(); drawIndexedIndirectSignature_.Reset(); // Release core resources explicitly. rtvHeap_.Reset(); swapChain_.Reset(); fence_.Reset(); commandQueue_.Reset(); // Clean up descriptor heap manager's heaps before deleting it. // Note: heapMgr_ may point to either ownedHeapMgr_ OR external heap manager // (e.g., HeadlessContext owns it via unique_ptr). We cleanup the heaps regardless. if (heapMgr_) { heapMgr_->cleanup(); } // Clean up owned descriptor heap manager (if we own it) delete ownedHeapMgr_; ownedHeapMgr_ = nullptr; heapMgr_ = nullptr; // Release device last, after all dependent resources are freed. device_.Reset(); adapter_.Reset(); dxgiFactory_.Reset(); #ifdef IGL_DEBUG IGL_LOG_INFO("[D3D12Context] All resources released\n"); #endif } Result D3D12Context::initialize(HWND hwnd, uint32_t width, uint32_t height, const D3D12ContextConfig& config) { width_ = width; height_ = height; // Store and validate configuration. config_ = config; config_.validate(); // Pre-allocate vectors to config size (T43). Will be verified/resized after swapchain creation. swapchainBufferCount_ = config_.maxFramesInFlight; renderTargets_.resize(swapchainBufferCount_); frameContexts_.resize(swapchainBufferCount_); IGL_D3D12_LOG_VERBOSE("D3D12Context: Creating D3D12 device...\n"); Result deviceResult = createDevice(); if (!deviceResult.isOk()) { return deviceResult; } IGL_D3D12_LOG_VERBOSE("D3D12Context: Device created successfully\n"); IGL_D3D12_LOG_VERBOSE("D3D12Context: Creating command queue...\n"); Result queueResult = createCommandQueue(); if (!queueResult.isOk()) { return queueResult; } IGL_D3D12_LOG_VERBOSE("D3D12Context: Command queue created successfully\n"); IGL_D3D12_LOG_VERBOSE("D3D12Context: Creating swapchain (%ux%u)...\n", width, height); Result swapChainResult = createSwapChain(hwnd, width, height); if (!swapChainResult.isOk()) { return swapChainResult; } IGL_D3D12_LOG_VERBOSE("D3D12Context: Swapchain created successfully\n"); IGL_D3D12_LOG_VERBOSE("D3D12Context: Creating RTV heap...\n"); Result rtvResult = createRTVHeap(); if (!rtvResult.isOk()) { return rtvResult; } IGL_D3D12_LOG_VERBOSE("D3D12Context: RTV heap created successfully\n"); IGL_D3D12_LOG_VERBOSE("D3D12Context: Creating back buffers...\n"); Result backBufferResult = createBackBuffers(); if (!backBufferResult.isOk()) { return backBufferResult; } IGL_D3D12_LOG_VERBOSE("D3D12Context: Back buffers created successfully\n"); IGL_D3D12_LOG_VERBOSE("D3D12Context: Creating descriptor heaps...\n"); Result descriptorHeapResult = createDescriptorHeaps(); if (!descriptorHeapResult.isOk()) { return descriptorHeapResult; } IGL_D3D12_LOG_VERBOSE("D3D12Context: Descriptor heaps created successfully\n"); IGL_D3D12_LOG_VERBOSE("D3D12Context: Creating command signatures...\n"); Result commandSigResult = createCommandSignatures(); if (!commandSigResult.isOk()) { return commandSigResult; } IGL_D3D12_LOG_VERBOSE("D3D12Context: Command signatures created successfully\n"); IGL_D3D12_LOG_VERBOSE("D3D12Context: Creating fence for GPU synchronization...\n"); HRESULT hr = device_->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(fence_.GetAddressOf())); if (FAILED(hr)) { IGL_LOG_ERROR("D3D12Context: Failed to create fence (HRESULT: 0x%08X)\n", static_cast(hr)); IGL_DEBUG_ASSERT(false); return Result(Result::Code::RuntimeError, "Failed to create fence"); } IGL_D3D12_LOG_VERBOSE("D3D12Context: Fence created successfully\n"); // Create per-frame command allocators using runtime buffer count (T43). IGL_D3D12_LOG_VERBOSE("D3D12Context: Creating per-frame command allocators...\n"); for (UINT i = 0; i < swapchainBufferCount_; i++) { hr = device_->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(frameContexts_[i].allocator.GetAddressOf())); if (FAILED(hr)) { IGL_LOG_ERROR( "D3D12Context: Failed to create command allocator for frame %u (HRESULT: 0x%08X)\n", i, static_cast(hr)); IGL_DEBUG_ASSERT(false); return Result(Result::Code::RuntimeError, "Failed to create command allocator for frame " + std::to_string(i)); } IGL_D3D12_LOG_VERBOSE("D3D12Context: Created command allocator for frame %u\n", i); } IGL_D3D12_LOG_VERBOSE("D3D12Context: Per-frame command allocators created successfully\n"); IGL_D3D12_LOG_VERBOSE("D3D12Context: Initialization complete!\n"); return Result(); } Result D3D12Context::resize(uint32_t width, uint32_t height) { // Validate dimensions if (width == 0 || height == 0) { return Result{Result::Code::ArgumentInvalid, "Invalid resize dimensions: width and height must be non-zero"}; } if (width == width_ && height == height_) { return Result(); } IGL_D3D12_LOG_VERBOSE( "D3D12Context: Resizing swapchain from %ux%u to %ux%u\n", width_, height_, width, height); width_ = width; height_ = height; // Wait for all GPU work to complete before releasing backbuffers // This prevents DXGI_ERROR_DEVICE_REMOVED when GPU is still rendering to old buffers if (fence_.Get() && commandQueue_.Get()) { const UINT64 currentFence = fenceValue_; commandQueue_->Signal(fence_.Get(), currentFence); FenceWaiter waiter(fence_.Get(), currentFence); Result waitResult = waiter.wait(); if (!waitResult.isOk()) { IGL_LOG_ERROR("D3D12Context::resize() - Fence wait failed: %s\n", waitResult.message.c_str()); // Continue with resize despite error - old buffers will be released anyway } } // Release old back buffers (T43: use runtime buffer count) for (UINT i = 0; i < swapchainBufferCount_; i++) { renderTargets_[i].Reset(); } // Store swapchain format and flags for potential recreation DXGI_SWAP_CHAIN_DESC1 currentDesc = {}; if (swapChain_.Get()) { swapChain_->GetDesc1(¤tDesc); } // Try to resize existing swapchain (T43: use runtime buffer count) HRESULT hr = swapChain_->ResizeBuffers(swapchainBufferCount_, width, height, currentDesc.Format ? currentDesc.Format : DXGI_FORMAT_B8G8R8A8_UNORM, currentDesc.Flags); if (FAILED(hr)) { IGL_LOG_ERROR( "D3D12Context: ResizeBuffers failed (HRESULT=0x%08X), attempting to recreate swapchain\n", static_cast(hr)); // Graceful fallback: Recreate swapchain from scratch Result result = recreateSwapChain(width, height); if (!result.isOk()) { IGL_LOG_ERROR("D3D12Context: Failed to recreate swapchain: %s\n", result.message.c_str()); return Result{Result::Code::RuntimeError, "Failed to resize or recreate swapchain"}; } IGL_D3D12_LOG_VERBOSE("D3D12Context: Swapchain recreated successfully\n"); } else { IGL_D3D12_LOG_VERBOSE("D3D12Context: ResizeBuffers succeeded\n"); } // Recreate back buffer views Result backBufferResult = createBackBuffers(); if (!backBufferResult.isOk()) { IGL_LOG_ERROR("D3D12Context: Failed to recreate back buffers: %s\n", backBufferResult.message.c_str()); return backBufferResult; } IGL_D3D12_LOG_VERBOSE("D3D12Context: Swapchain resize complete\n"); return Result(); } Result D3D12Context::recreateSwapChain(uint32_t width, uint32_t height) { IGL_D3D12_LOG_VERBOSE( "D3D12Context: Recreating swapchain with dimensions %ux%u\n", width, height); // Get window handle from existing swapchain before releasing it DXGI_SWAP_CHAIN_DESC1 oldDesc = {}; if (!swapChain_.Get()) { return Result{Result::Code::RuntimeError, "No existing swapchain to recreate"}; } HRESULT hr = swapChain_->GetDesc1(&oldDesc); if (FAILED(hr)) { IGL_LOG_ERROR("D3D12Context: Failed to get swapchain description (HRESULT=0x%08X)\n", static_cast(hr)); return Result{Result::Code::RuntimeError, "Failed to get swapchain description"}; } // Try to get HWND via GetHwnd (IDXGISwapChain3) HWND hwnd = nullptr; hr = swapChain_->GetHwnd(&hwnd); if (FAILED(hr) || !hwnd) { IGL_LOG_ERROR("D3D12Context: Failed to get HWND from swapchain (HRESULT=0x%08X)\n", static_cast(hr)); return Result{Result::Code::RuntimeError, "Failed to get HWND from swapchain"}; } IGL_D3D12_LOG_VERBOSE("D3D12Context: Retrieved HWND=%p from existing swapchain\n", hwnd); // Release old swapchain completely swapChain_.Reset(); IGL_D3D12_LOG_VERBOSE("D3D12Context: Old swapchain released\n"); // Create new swapchain with updated dimensions DXGI_SWAP_CHAIN_DESC1 newDesc = {}; newDesc.Width = width; newDesc.Height = height; newDesc.Format = oldDesc.Format ? oldDesc.Format : DXGI_FORMAT_B8G8R8A8_UNORM; newDesc.Stereo = FALSE; newDesc.SampleDesc.Count = 1; newDesc.SampleDesc.Quality = 0; newDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; newDesc.BufferCount = swapchainBufferCount_; // T43: use runtime buffer count newDesc.Scaling = DXGI_SCALING_STRETCH; newDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; newDesc.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED; newDesc.Flags = oldDesc.Flags; // Preserve tearing support flag IGL_D3D12_LOG_VERBOSE("D3D12Context: Creating new swapchain (format=%u, flags=0x%X)\n", newDesc.Format, newDesc.Flags); igl::d3d12::ComPtr swapChain1; hr = dxgiFactory_->CreateSwapChainForHwnd( commandQueue_.Get(), hwnd, &newDesc, nullptr, nullptr, swapChain1.GetAddressOf()); if (FAILED(hr)) { IGL_LOG_ERROR("D3D12Context: CreateSwapChainForHwnd failed (HRESULT=0x%08X)\n", static_cast(hr)); return Result{Result::Code::RuntimeError, "Failed to recreate swapchain with CreateSwapChainForHwnd"}; } // Query IDXGISwapChain3 interface hr = swapChain1->QueryInterface(IID_PPV_ARGS(swapChain_.GetAddressOf())); if (FAILED(hr)) { IGL_LOG_ERROR("D3D12Context: Failed to query IDXGISwapChain3 (HRESULT=0x%08X)\n", static_cast(hr)); return Result{Result::Code::RuntimeError, "Failed to query IDXGISwapChain3 interface"}; } IGL_D3D12_LOG_VERBOSE("D3D12Context: Swapchain recreated successfully\n"); return Result{}; } Result D3D12Context::createDevice() { // DO NOT enable experimental features in windowed mode - it breaks swapchain creation! // Experimental features are ONLY enabled in HeadlessD3D12Context for unit tests // Windowed render sessions use signed DXIL (via IDxcValidator) which doesn't need experimental // mode // A-007: Read debug configuration from environment variables // Helper function to read boolean env var (returns defaultValue if not set) auto getEnvBool = [](const char* name, bool defaultValue) -> bool { const char* value = std::getenv(name); if (!value) return defaultValue; return (std::string(value) == "1") || (std::string(value) == "true"); }; // A-007: Debug configuration from environment variables. // Defaults are tuned for aggressive validation in debug builds so that // issues like PSO creation failures and binding mismatches are surfaced // without requiring the user to set environment variables manually. bool enableDebugLayer = getEnvBool("IGL_D3D12_DEBUG", #ifdef _DEBUG true // Default ON in debug builds #else false // Default OFF in release builds #endif ); bool enableGPUValidation = getEnvBool("IGL_D3D12_GPU_VALIDATION", #ifdef _DEBUG true // Default ON in debug builds for better diagnostics #else false // Default OFF in release builds #endif ); bool enableDRED = getEnvBool("IGL_D3D12_DRED", #ifdef _DEBUG true // Default ON in debug builds #else false // Default OFF in release builds #endif ); bool enableDXGIDebug = getEnvBool("IGL_DXGI_DEBUG", #ifdef _DEBUG true // Default ON in debug builds #else false // Default OFF in release builds #endif ); bool breakOnError = getEnvBool("IGL_D3D12_BREAK_ON_ERROR", #ifdef _DEBUG true // Default BREAK on error in debug builds #else false // Default LOG only in release builds #endif ); bool breakOnWarning = getEnvBool("IGL_D3D12_BREAK_ON_WARNING", #ifdef _DEBUG false // Default LOG warnings in debug builds (can be overridden) #else false #endif ); IGL_D3D12_LOG_VERBOSE("=== D3D12 Debug Configuration ===\n"); IGL_D3D12_LOG_VERBOSE(" Debug Layer: %s\n", enableDebugLayer ? "ENABLED" : "DISABLED"); IGL_D3D12_LOG_VERBOSE(" GPU Validation: %s\n", enableGPUValidation ? "ENABLED" : "DISABLED"); IGL_D3D12_LOG_VERBOSE(" DRED: %s\n", enableDRED ? "ENABLED" : "DISABLED"); IGL_D3D12_LOG_VERBOSE(" DXGI Debug: %s\n", enableDXGIDebug ? "ENABLED" : "DISABLED"); IGL_D3D12_LOG_VERBOSE(" Break on Error: %s\n", breakOnError ? "ENABLED" : "DISABLED"); IGL_D3D12_LOG_VERBOSE(" Break on Warning: %s\n", breakOnWarning ? "ENABLED" : "DISABLED"); IGL_D3D12_LOG_VERBOSE("=================================\n"); // Initialize DXGI factory flags UINT dxgiFactoryFlags = 0; // A-007: Enable debug layer if configured if (enableDebugLayer) { igl::d3d12::ComPtr debugController; if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(debugController.GetAddressOf())))) { debugController->EnableDebugLayer(); IGL_D3D12_LOG_VERBOSE("D3D12Context: Debug layer ENABLED\n"); // Enable DXGI debug layer if configured if (enableDXGIDebug) { dxgiFactoryFlags |= DXGI_CREATE_FACTORY_DEBUG; IGL_D3D12_LOG_VERBOSE("D3D12Context: DXGI debug layer ENABLED\n"); } // A-007: Enable GPU-Based Validation if configured // WARNING: This significantly impacts performance (10-100x slower) if (enableGPUValidation) { igl::d3d12::ComPtr debugController1; if (SUCCEEDED( debugController->QueryInterface(IID_PPV_ARGS(debugController1.GetAddressOf())))) { debugController1->SetEnableGPUBasedValidation(TRUE); IGL_D3D12_LOG_VERBOSE( "D3D12Context: GPU-Based Validation ENABLED (may slow down rendering 10-100x)\n"); } else { IGL_LOG_ERROR( "D3D12Context: Failed to enable GPU-Based Validation (requires ID3D12Debug1)\n"); } } } else { IGL_LOG_ERROR( "D3D12Context: Failed to get D3D12 debug interface - Graphics Tools may not be " "installed\n"); } } else { IGL_D3D12_LOG_VERBOSE("D3D12Context: Debug layer DISABLED\n"); } // A-007: Enable DRED if configured (Device Removed Extended Data for better crash diagnostics) if (enableDRED) { igl::d3d12::ComPtr dredSettings1; if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(dredSettings1.GetAddressOf())))) { dredSettings1->SetAutoBreadcrumbsEnablement(D3D12_DRED_ENABLEMENT_FORCED_ON); dredSettings1->SetPageFaultEnablement(D3D12_DRED_ENABLEMENT_FORCED_ON); dredSettings1->SetBreadcrumbContextEnablement(D3D12_DRED_ENABLEMENT_FORCED_ON); IGL_D3D12_LOG_VERBOSE( "D3D12Context: DRED 1.2 fully configured (breadcrumbs + page faults + context)\n"); } else { IGL_LOG_ERROR("D3D12Context: Failed to configure DRED (requires Windows 10 19041+)\n"); } } // Create DXGI factory with debug flag in debug builds. HRESULT hr = CreateDXGIFactory2(dxgiFactoryFlags, IID_PPV_ARGS(dxgiFactory_.GetAddressOf())); if (FAILED(hr)) { IGL_LOG_ERROR("D3D12Context: Failed to create DXGI factory (HRESULT: 0x%08X)\n", static_cast(hr)); IGL_DEBUG_ASSERT(false); return Result(Result::Code::RuntimeError, "Failed to create DXGI factory"); } // A-011: Enumerate and select best adapter Result enumResult = enumerateAndSelectAdapter(); if (!enumResult.isOk()) { return enumResult; } // A-012: Detect memory budget detectMemoryBudget(); // Create D3D12 device on selected adapter hr = D3D12CreateDevice( adapter_.Get(), selectedFeatureLevel_, IID_PPV_ARGS(device_.GetAddressOf())); if (FAILED(hr)) { IGL_LOG_ERROR("D3D12CreateDevice failed on selected adapter: 0x%08X\n", static_cast(hr)); IGL_DEBUG_ASSERT(false); return Result(Result::Code::RuntimeError, "Failed to create D3D12 device on selected adapter"); } IGL_D3D12_LOG_VERBOSE("D3D12Context: Device created with Feature Level %s\n", featureLevelToString(selectedFeatureLevel_)); // A-007: Setup info queue with configurable break-on-severity settings if (enableDebugLayer) { igl::d3d12::ComPtr infoQueue; if (SUCCEEDED(device_->QueryInterface(IID_PPV_ARGS(infoQueue.GetAddressOf())))) { // A-007: Configure break-on-severity based on environment variables infoQueue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_CORRUPTION, TRUE); // Always break on corruption infoQueue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_ERROR, breakOnError ? TRUE : FALSE); infoQueue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_WARNING, breakOnWarning ? TRUE : FALSE); // Filter out INFO messages and a small set of known performance-only // clear warnings that are expected in this backend (no functional // impact). Do NOT filter invalid-shader-bytecode or signature messages so // that pipeline creation problems surface clearly during debugging. D3D12_MESSAGE_SEVERITY severities[] = {D3D12_MESSAGE_SEVERITY_INFO}; // Filter out only clear-value performance hints (IDs 820/821) and the // known PS float-to-uint RT bitcast warning (677). All other message IDs // (including invalid shader bytecode or unparseable signatures) are kept. D3D12_MESSAGE_ID denyIds[] = { static_cast(820), // ClearRenderTargetView w/o optimized clear value static_cast(821), // ClearDepthStencilView clear value mismatch static_cast(677) // PS float output to UINT RT (bitcast) }; D3D12_INFO_QUEUE_FILTER filter = {}; filter.DenyList.NumSeverities = 1; filter.DenyList.pSeverityList = severities; filter.DenyList.NumIDs = static_cast(std::size(denyIds)); filter.DenyList.pIDList = denyIds; infoQueue->PushStorageFilter(&filter); IGL_D3D12_LOG_VERBOSE( "D3D12Context: Info queue configured (Corruption=BREAK, Error=%s, Warning=%s)\n", breakOnError ? "BREAK" : "LOG", breakOnWarning ? "BREAK" : "LOG"); } } // Query root signature capabilities. // This is critical for Tier-1 devices which don't support unbounded descriptor ranges. IGL_D3D12_LOG_VERBOSE("D3D12Context: Querying root signature capabilities...\n"); // Query highest supported root signature version D3D12_FEATURE_DATA_ROOT_SIGNATURE featureDataRootSig = {}; featureDataRootSig.HighestVersion = D3D_ROOT_SIGNATURE_VERSION_1_1; hr = device_->CheckFeatureSupport( D3D12_FEATURE_ROOT_SIGNATURE, &featureDataRootSig, sizeof(featureDataRootSig)); if (SUCCEEDED(hr)) { highestRootSignatureVersion_ = featureDataRootSig.HighestVersion; IGL_D3D12_LOG_VERBOSE(" Highest Root Signature Version: %s\n", highestRootSignatureVersion_ == D3D_ROOT_SIGNATURE_VERSION_1_1 ? "1.1" : "1.0"); } else { // If query fails, assume v1.0 (most conservative) highestRootSignatureVersion_ = D3D_ROOT_SIGNATURE_VERSION_1_0; IGL_D3D12_LOG_VERBOSE(" Root Signature query failed (assuming v1.0)\n"); } // Query resource binding tier D3D12_FEATURE_DATA_D3D12_OPTIONS options = {}; hr = device_->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS, &options, sizeof(options)); if (SUCCEEDED(hr)) { resourceBindingTier_ = options.ResourceBindingTier; const char* tierName = "Unknown"; switch (resourceBindingTier_) { case D3D12_RESOURCE_BINDING_TIER_1: tierName = "Tier 1 (bounded descriptors required)"; break; case D3D12_RESOURCE_BINDING_TIER_2: tierName = "Tier 2 (unbounded arrays except samplers)"; break; case D3D12_RESOURCE_BINDING_TIER_3: tierName = "Tier 3 (fully unbounded)"; break; } IGL_D3D12_LOG_VERBOSE(" Resource Binding Tier: %s\n", tierName); } else { // If query fails, assume Tier 1 (most conservative) resourceBindingTier_ = D3D12_RESOURCE_BINDING_TIER_1; IGL_D3D12_LOG_VERBOSE(" Resource Binding Tier query failed (assuming Tier 1)\n"); } // Query shader model support with progressive fallback (A-005) // This is critical for FL11 hardware which only supports SM 5.1, not SM 6.0+ IGL_D3D12_LOG_VERBOSE( "D3D12Context: Querying shader model capabilities for Feature Level %d.%d...\n", (selectedFeatureLevel_ >> 12) & 0xF, (selectedFeatureLevel_ >> 8) & 0xF); // Helper to map feature level to expected minimum shader model auto getMinShaderModelForFeatureLevel = [](D3D_FEATURE_LEVEL fl) -> D3D_SHADER_MODEL { switch (fl) { case D3D_FEATURE_LEVEL_12_2: return D3D_SHADER_MODEL_6_6; // FL 12.2 supports SM 6.6+ case D3D_FEATURE_LEVEL_12_1: return D3D_SHADER_MODEL_6_1; // FL 12.1 supports SM 6.1 (mesh shaders) case D3D_FEATURE_LEVEL_12_0: return D3D_SHADER_MODEL_6_0; // FL 12.0 supports SM 6.0 (wave operations) case D3D_FEATURE_LEVEL_11_1: case D3D_FEATURE_LEVEL_11_0: return D3D_SHADER_MODEL_5_1; // FL 11.x only supports SM 5.1 default: return D3D_SHADER_MODEL_5_1; // Conservative fallback } }; auto shaderModelToString = [](D3D_SHADER_MODEL sm) -> const char* { switch (sm) { case D3D_SHADER_MODEL_6_6: return "6.6"; case D3D_SHADER_MODEL_6_5: return "6.5"; case D3D_SHADER_MODEL_6_4: return "6.4"; case D3D_SHADER_MODEL_6_3: return "6.3"; case D3D_SHADER_MODEL_6_2: return "6.2"; case D3D_SHADER_MODEL_6_1: return "6.1"; case D3D_SHADER_MODEL_6_0: return "6.0"; case D3D_SHADER_MODEL_5_1: return "5.1"; default: return "Unknown"; } }; // Shader models to attempt, from highest to lowest const D3D_SHADER_MODEL shaderModels[] = { D3D_SHADER_MODEL_6_6, D3D_SHADER_MODEL_6_5, D3D_SHADER_MODEL_6_4, D3D_SHADER_MODEL_6_3, D3D_SHADER_MODEL_6_2, D3D_SHADER_MODEL_6_1, D3D_SHADER_MODEL_6_0, D3D_SHADER_MODEL_5_1, }; D3D_SHADER_MODEL detectedShaderModel = D3D_SHADER_MODEL_5_1; bool shaderModelDetected = false; // Try each shader model from highest to lowest for (D3D_SHADER_MODEL sm : shaderModels) { D3D12_FEATURE_DATA_SHADER_MODEL shaderModelData = {sm}; hr = device_->CheckFeatureSupport( D3D12_FEATURE_SHADER_MODEL, &shaderModelData, sizeof(shaderModelData)); if (SUCCEEDED(hr)) { detectedShaderModel = shaderModelData.HighestShaderModel; shaderModelDetected = true; IGL_D3D12_LOG_VERBOSE(" Detected Shader Model: %s\n", shaderModelToString(detectedShaderModel)); break; // Found highest supported, stop trying } else { IGL_D3D12_LOG_VERBOSE(" Shader Model %s not supported, trying lower version\n", shaderModelToString(sm)); } } if (!shaderModelDetected) { // Fallback based on feature level D3D_SHADER_MODEL minimumSM = getMinShaderModelForFeatureLevel(selectedFeatureLevel_); IGL_D3D12_LOG_VERBOSE( " WARNING: Shader model detection failed, using minimum for Feature Level: %s\n", shaderModelToString(minimumSM)); detectedShaderModel = minimumSM; } // Validate shader model is appropriate for feature level D3D_SHADER_MODEL minimumRequired = getMinShaderModelForFeatureLevel(selectedFeatureLevel_); if (detectedShaderModel < minimumRequired) { IGL_D3D12_LOG_VERBOSE( " WARNING: Detected Shader Model %s is below minimum for Feature Level: %s\n", shaderModelToString(detectedShaderModel), shaderModelToString(minimumRequired)); } maxShaderModel_ = detectedShaderModel; IGL_D3D12_LOG_VERBOSE("D3D12Context: Final Shader Model selected: %s\n", shaderModelToString(maxShaderModel_)); IGL_D3D12_LOG_VERBOSE("D3D12Context: Root signature capabilities detected successfully\n"); return Result(); } // A-011: Enumerate and select best adapter Result D3D12Context::enumerateAndSelectAdapter() { enumeratedAdapters_.clear(); IGL_D3D12_LOG_VERBOSE("D3D12Context: Enumerating DXGI adapters...\n"); // Try IDXGIFactory6 first for high-performance GPU preference igl::d3d12::ComPtr factory6; (void)dxgiFactory_->QueryInterface(IID_PPV_ARGS(factory6.GetAddressOf())); if (factory6.Get()) { for (UINT i = 0;; ++i) { igl::d3d12::ComPtr adapter; if (FAILED(factory6->EnumAdapterByGpuPreference( i, DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE, IID_PPV_ARGS(adapter.GetAddressOf())))) { break; } AdapterInfo info{}; info.adapter = adapter; info.index = i; info.isWarp = false; adapter->GetDesc1(&info.desc); // Skip software adapters in main enumeration (we'll add WARP separately) if (info.desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) { continue; } // Determine feature level info.featureLevel = getHighestFeatureLevel(adapter.Get()); if (info.featureLevel == static_cast(0)) { IGL_D3D12_LOG_VERBOSE("D3D12Context: Adapter %u does not support D3D12 (skipping)\n", i); continue; } enumeratedAdapters_.push_back(info); // Log adapter details IGL_D3D12_LOG_VERBOSE("D3D12Context: Adapter %u:\n", i); IGL_D3D12_LOG_VERBOSE(" Description: %ls\n", info.desc.Description); IGL_D3D12_LOG_VERBOSE(" Vendor ID: 0x%04X (%s)\n", info.desc.VendorId, info.getVendorName()); IGL_D3D12_LOG_VERBOSE(" Device ID: 0x%04X\n", info.desc.DeviceId); IGL_D3D12_LOG_VERBOSE(" Dedicated VRAM: %llu MB\n", info.getDedicatedVideoMemoryMB()); IGL_D3D12_LOG_VERBOSE(" Shared System Memory: %llu MB\n", info.desc.SharedSystemMemory / (1024 * 1024)); IGL_D3D12_LOG_VERBOSE(" Feature Level: %s\n", featureLevelToString(info.featureLevel)); IGL_D3D12_LOG_VERBOSE( " LUID: 0x%08X:0x%08X\n", info.desc.AdapterLuid.HighPart, info.desc.AdapterLuid.LowPart); } } // Fallback enumeration if Factory6 not available if (enumeratedAdapters_.empty()) { for (UINT i = 0;; ++i) { igl::d3d12::ComPtr adapter; if (dxgiFactory_->EnumAdapters1(i, adapter.GetAddressOf()) == DXGI_ERROR_NOT_FOUND) { break; } AdapterInfo info{}; info.adapter = adapter; info.index = i; info.isWarp = false; adapter->GetDesc1(&info.desc); // Skip software adapters if (info.desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) { continue; } // Determine feature level info.featureLevel = getHighestFeatureLevel(adapter.Get()); if (info.featureLevel == static_cast(0)) { continue; } enumeratedAdapters_.push_back(info); // Log adapter details IGL_D3D12_LOG_VERBOSE("D3D12Context: Adapter %u:\n", i); IGL_D3D12_LOG_VERBOSE(" Description: %ls\n", info.desc.Description); IGL_D3D12_LOG_VERBOSE(" Vendor ID: 0x%04X (%s)\n", info.desc.VendorId, info.getVendorName()); IGL_D3D12_LOG_VERBOSE(" Device ID: 0x%04X\n", info.desc.DeviceId); IGL_D3D12_LOG_VERBOSE(" Dedicated VRAM: %llu MB\n", info.getDedicatedVideoMemoryMB()); IGL_D3D12_LOG_VERBOSE(" Shared System Memory: %llu MB\n", info.desc.SharedSystemMemory / (1024 * 1024)); IGL_D3D12_LOG_VERBOSE(" Feature Level: %s\n", featureLevelToString(info.featureLevel)); } } // Add WARP adapter as fallback option (software rasterizer) igl::d3d12::ComPtr warpAdapter; if (SUCCEEDED(dxgiFactory_->EnumWarpAdapter(IID_PPV_ARGS(warpAdapter.GetAddressOf())))) { igl::d3d12::ComPtr warpAdapter1; if (SUCCEEDED(warpAdapter->QueryInterface(IID_PPV_ARGS(warpAdapter1.GetAddressOf())))) { AdapterInfo warpInfo{}; warpInfo.adapter = warpAdapter1; warpInfo.index = static_cast(enumeratedAdapters_.size()); warpInfo.isWarp = true; warpAdapter1->GetDesc1(&warpInfo.desc); warpInfo.featureLevel = getHighestFeatureLevel(warpAdapter1.Get()); enumeratedAdapters_.push_back(warpInfo); IGL_D3D12_LOG_VERBOSE("D3D12Context: WARP Adapter (Software):\n"); IGL_D3D12_LOG_VERBOSE(" Description: %ls\n", warpInfo.desc.Description); IGL_D3D12_LOG_VERBOSE(" Feature Level: %s\n", featureLevelToString(warpInfo.featureLevel)); } } if (enumeratedAdapters_.empty()) { IGL_LOG_ERROR("D3D12Context: No compatible D3D12 adapters found!\n"); IGL_DEBUG_ASSERT(false); return Result(Result::Code::RuntimeError, "No D3D12-compatible adapters available"); } // Select adapter based on environment variable or heuristic selectedAdapterIndex_ = 0; // Default to first adapter (discrete GPU on laptops) char adapterEnv[64] = {}; DWORD envResult = GetEnvironmentVariableA("IGL_D3D12_ADAPTER", adapterEnv, sizeof(adapterEnv)); if (envResult > 0 && envResult < sizeof(adapterEnv)) { if (strcmp(adapterEnv, "WARP") == 0) { // Find WARP adapter for (size_t i = 0; i < enumeratedAdapters_.size(); ++i) { if (enumeratedAdapters_[i].isWarp) { selectedAdapterIndex_ = static_cast(i); IGL_D3D12_LOG_VERBOSE("D3D12Context: Environment override - using WARP adapter\n"); break; } } } else { // Parse adapter index int requestedIndex = atoi(adapterEnv); if (requestedIndex >= 0 && requestedIndex < static_cast(enumeratedAdapters_.size())) { selectedAdapterIndex_ = static_cast(requestedIndex); IGL_D3D12_LOG_VERBOSE("D3D12Context: Environment override - using adapter %d\n", requestedIndex); } else { IGL_LOG_ERROR("D3D12Context: Invalid adapter index %d (available: 0-%zu)\n", requestedIndex, enumeratedAdapters_.size() - 1); } } } else { // Heuristic: Choose adapter with highest feature level and most VRAM D3D_FEATURE_LEVEL highestFL = enumeratedAdapters_[0].featureLevel; uint64_t largestVRAM = enumeratedAdapters_[0].getDedicatedVideoMemoryMB(); for (size_t i = 1; i < enumeratedAdapters_.size(); ++i) { if (enumeratedAdapters_[i].isWarp) { continue; // Skip WARP for automatic selection } uint64_t vram = enumeratedAdapters_[i].getDedicatedVideoMemoryMB(); D3D_FEATURE_LEVEL fl = enumeratedAdapters_[i].featureLevel; // Prefer higher feature level, or same feature level with more VRAM if (fl > highestFL || (fl == highestFL && vram > largestVRAM)) { selectedAdapterIndex_ = static_cast(i); highestFL = fl; largestVRAM = vram; } } } adapter_ = enumeratedAdapters_[selectedAdapterIndex_].adapter; selectedFeatureLevel_ = enumeratedAdapters_[selectedAdapterIndex_].featureLevel; // T44: Concise single-line adapter log at INFO level (matches Vulkan/Metal minimalism) const auto& selected = enumeratedAdapters_[selectedAdapterIndex_]; IGL_LOG_INFO("D3D12 Adapter: %ls (FL %s, %llu MB VRAM)\n", selected.desc.Description, featureLevelToString(selectedFeatureLevel_), selected.getDedicatedVideoMemoryMB()); // Verbose: Detailed adapter info (vendor, device ID, LUID, etc.) IGL_D3D12_LOG_VERBOSE("D3D12Context: Selected adapter %u: %ls (FL %s)\n", selectedAdapterIndex_, selected.desc.Description, featureLevelToString(selectedFeatureLevel_)); return Result(); } // A-012: Detect memory budget from selected adapter void D3D12Context::detectMemoryBudget() { if (selectedAdapterIndex_ >= enumeratedAdapters_.size()) { IGL_LOG_ERROR("D3D12Context: No adapter selected for memory budget detection\n"); return; } const auto& selectedAdapter = enumeratedAdapters_[selectedAdapterIndex_]; memoryBudget_.dedicatedVideoMemory = selectedAdapter.desc.DedicatedVideoMemory; memoryBudget_.sharedSystemMemory = selectedAdapter.desc.SharedSystemMemory; IGL_D3D12_LOG_VERBOSE("D3D12Context: GPU Memory Budget:\n"); IGL_D3D12_LOG_VERBOSE(" Dedicated Video Memory: %.2f MB\n", memoryBudget_.dedicatedVideoMemory / (1024.0 * 1024.0)); IGL_D3D12_LOG_VERBOSE(" Shared System Memory: %.2f MB\n", memoryBudget_.sharedSystemMemory / (1024.0 * 1024.0)); IGL_D3D12_LOG_VERBOSE(" Total Available: %.2f MB\n", memoryBudget_.totalAvailableMemory() / (1024.0 * 1024.0)); // Recommend conservative budget (80% of available) uint64_t recommendedBudget = static_cast(memoryBudget_.totalAvailableMemory() * 0.8); IGL_D3D12_LOG_VERBOSE(" Recommended Budget (80%%): %.2f MB\n", recommendedBudget / (1024.0 * 1024.0)); } // A-010: Detect HDR output capabilities void D3D12Context::detectHDRCapabilities() { IGL_D3D12_LOG_VERBOSE("D3D12Context: Detecting HDR output capabilities...\n"); // Reset to defaults hdrCapabilities_ = HDRCapabilities{}; // Need a valid swapchain to query output if (!swapChain_.Get()) { IGL_D3D12_LOG_VERBOSE(" No swapchain available, HDR detection skipped\n"); return; } // Get the output (monitor) containing the swapchain igl::d3d12::ComPtr output; HRESULT hr = swapChain_->GetContainingOutput(output.GetAddressOf()); if (FAILED(hr)) { IGL_D3D12_LOG_VERBOSE(" Failed to get containing output (0x%08X), HDR not available\n", static_cast(hr)); return; } // Query for IDXGIOutput6 (required for HDR queries) igl::d3d12::ComPtr output6; hr = output->QueryInterface(IID_PPV_ARGS(output6.GetAddressOf())); if (FAILED(hr)) { IGL_D3D12_LOG_VERBOSE( " IDXGIOutput6 not available (needs Windows 10 1703+), HDR not supported\n"); return; } // Get output description with color space info DXGI_OUTPUT_DESC1 outputDesc = {}; hr = output6->GetDesc1(&outputDesc); if (FAILED(hr)) { IGL_D3D12_LOG_VERBOSE(" Failed to get output description (0x%08X)\n", static_cast(hr)); return; } // Store native color space hdrCapabilities_.nativeColorSpace = outputDesc.ColorSpace; // Store luminance information hdrCapabilities_.maxLuminance = outputDesc.MaxLuminance; hdrCapabilities_.minLuminance = outputDesc.MinLuminance; hdrCapabilities_.maxFullFrameLuminance = outputDesc.MaxFullFrameLuminance; IGL_D3D12_LOG_VERBOSE(" Native Color Space: %u\n", outputDesc.ColorSpace); IGL_D3D12_LOG_VERBOSE(" Max Luminance: %.2f nits\n", outputDesc.MaxLuminance); IGL_D3D12_LOG_VERBOSE(" Min Luminance: %.4f nits\n", outputDesc.MinLuminance); IGL_D3D12_LOG_VERBOSE(" Max Full Frame Luminance: %.2f nits\n", outputDesc.MaxFullFrameLuminance); // Check for HDR10 support (BT.2020 ST2084 - PQ curve) via swapchain UINT colorSpaceSupport = 0; hr = swapChain_->CheckColorSpaceSupport(DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020, &colorSpaceSupport); if (SUCCEEDED(hr) && (colorSpaceSupport & DXGI_SWAP_CHAIN_COLOR_SPACE_SUPPORT_FLAG_PRESENT)) { hdrCapabilities_.hdrSupported = true; IGL_D3D12_LOG_VERBOSE(" HDR10 (BT.2020 PQ): SUPPORTED\n"); } else { IGL_D3D12_LOG_VERBOSE(" HDR10 (BT.2020 PQ): NOT SUPPORTED\n"); } // Check for scRGB support (linear floating-point HDR) hr = swapChain_->CheckColorSpaceSupport(DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709, &colorSpaceSupport); if (SUCCEEDED(hr) && (colorSpaceSupport & DXGI_SWAP_CHAIN_COLOR_SPACE_SUPPORT_FLAG_PRESENT)) { hdrCapabilities_.scRGBSupported = true; IGL_D3D12_LOG_VERBOSE(" scRGB (Linear FP16): SUPPORTED\n"); } else { IGL_D3D12_LOG_VERBOSE(" scRGB (Linear FP16): NOT SUPPORTED\n"); } // Summary if (hdrCapabilities_.hdrSupported || hdrCapabilities_.scRGBSupported) { IGL_D3D12_LOG_VERBOSE("D3D12Context: HDR output AVAILABLE (max %.0f nits)\n", outputDesc.MaxLuminance); } else { IGL_D3D12_LOG_VERBOSE("D3D12Context: HDR output NOT AVAILABLE (SDR display)\n"); } } Result D3D12Context::createCommandQueue() { D3D12_COMMAND_QUEUE_DESC queueDesc = {}; queueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT; queueDesc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE; HRESULT hr = device_->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(commandQueue_.GetAddressOf())); if (FAILED(hr)) { IGL_LOG_ERROR("D3D12Context: Failed to create command queue (HRESULT: 0x%08X)\n", static_cast(hr)); IGL_DEBUG_ASSERT(false); return Result(Result::Code::RuntimeError, "Failed to create command queue"); } return Result(); } Result D3D12Context::createSwapChain(HWND hwnd, uint32_t width, uint32_t height) { DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {}; swapChainDesc.Width = width; swapChainDesc.Height = height; // Use BGRA_UNORM (non-sRGB) for maximum compatibility with all display adapters // Vulkan baselines use BGRA channel ordering for swapchain and MRT targets swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; swapChainDesc.Stereo = FALSE; swapChainDesc.SampleDesc.Count = 1; swapChainDesc.SampleDesc.Quality = 0; swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; swapChainDesc.BufferCount = config_.maxFramesInFlight; // T43: use configured buffer count swapChainDesc.Scaling = DXGI_SCALING_STRETCH; swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED; // Query tearing support capability (required for variable refresh rate displays) // This capability must be queried before creating the swapchain BOOL allowTearing = FALSE; igl::d3d12::ComPtr factory5; if (SUCCEEDED(dxgiFactory_.Get()->QueryInterface(IID_PPV_ARGS(factory5.GetAddressOf())))) { if (SUCCEEDED(factory5->CheckFeatureSupport( DXGI_FEATURE_PRESENT_ALLOW_TEARING, &allowTearing, sizeof(allowTearing)))) { tearingSupported_ = (allowTearing == TRUE); if (tearingSupported_) { IGL_D3D12_LOG_VERBOSE("D3D12Context: Tearing support available (variable refresh rate)\n"); } } } // Set swapchain tearing flag if supported (required to use DXGI_PRESENT_ALLOW_TEARING) // Without this flag, using DXGI_PRESENT_ALLOW_TEARING in Present() is invalid swapChainDesc.Flags = tearingSupported_ ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0; igl::d3d12::ComPtr tempSwapChain; HRESULT hr = dxgiFactory_->CreateSwapChainForHwnd( commandQueue_.Get(), hwnd, &swapChainDesc, nullptr, nullptr, tempSwapChain.GetAddressOf()); if (FAILED(hr)) { IGL_LOG_ERROR("CreateSwapChainForHwnd failed: 0x%08X, trying legacy CreateSwapChain\n", (unsigned)hr); // Fallback: legacy CreateSwapChain DXGI_SWAP_CHAIN_DESC legacy = {}; legacy.BufferDesc.Width = width; legacy.BufferDesc.Height = height; legacy.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; legacy.BufferDesc.RefreshRate.Numerator = 60; legacy.BufferDesc.RefreshRate.Denominator = 1; legacy.SampleDesc.Count = 1; legacy.SampleDesc.Quality = 0; legacy.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; legacy.BufferCount = config_.maxFramesInFlight; // T43: use configured buffer count legacy.OutputWindow = hwnd; legacy.Windowed = TRUE; legacy.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; legacy.Flags = 0; igl::d3d12::ComPtr legacySwap; HRESULT hr2 = dxgiFactory_->CreateSwapChain(commandQueue_.Get(), &legacy, legacySwap.GetAddressOf()); if (FAILED(hr2)) { IGL_LOG_ERROR("D3D12Context: Failed to create swapchain (hr=0x%08X / 0x%08X)\n", (unsigned)hr, (unsigned)hr2); IGL_DEBUG_ASSERT(false); return Result(Result::Code::RuntimeError, "Failed to create swapchain"); } // Try to QI to IDXGISwapChain3 hr2 = legacySwap->QueryInterface(IID_PPV_ARGS(swapChain_.GetAddressOf())); if (FAILED(hr2)) { IGL_LOG_ERROR("D3D12Context: Failed to query IDXGISwapChain3 (hr=0x%08X)\n", (unsigned)hr2); IGL_DEBUG_ASSERT(false); return Result(Result::Code::RuntimeError, "Failed to query IDXGISwapChain3"); } return Result(); } // Cast to IDXGISwapChain3 hr = tempSwapChain->QueryInterface(IID_PPV_ARGS(swapChain_.GetAddressOf())); if (FAILED(hr)) { IGL_LOG_ERROR("D3D12Context: Failed to query IDXGISwapChain3 interface (HRESULT: 0x%08X)\n", static_cast(hr)); IGL_DEBUG_ASSERT(false); return Result(Result::Code::RuntimeError, "Failed to query IDXGISwapChain3 interface"); } // A-009: Verify swapchain actually supports tearing after creation if (tearingSupported_) { DXGI_SWAP_CHAIN_DESC1 actualDesc = {}; hr = swapChain_->GetDesc1(&actualDesc); if (SUCCEEDED(hr)) { const bool actualTearingFlag = (actualDesc.Flags & DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING) != 0; const bool actualWindowedMode = (actualDesc.SwapEffect == DXGI_SWAP_EFFECT_FLIP_DISCARD || actualDesc.SwapEffect == DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL); if (!actualTearingFlag) { IGL_D3D12_LOG_VERBOSE( "D3D12Context: Tearing flag was NOT set on swapchain (downgraded by driver)\n"); tearingSupported_ = false; } else if (!actualWindowedMode) { IGL_D3D12_LOG_VERBOSE( "D3D12Context: Swapchain not in flip mode (tearing requires flip model)\n"); tearingSupported_ = false; } else { IGL_D3D12_LOG_VERBOSE( "D3D12Context: Tearing verified on swapchain (windowed flip model + tearing flag)\n"); } } else { IGL_D3D12_LOG_VERBOSE( "D3D12Context: Failed to verify swapchain desc, assuming tearing unavailable\n"); tearingSupported_ = false; } } // A-010: Detect HDR capabilities now that swapchain is created detectHDRCapabilities(); // Query swapchain buffer count for dynamic frame management (T43) DXGI_SWAP_CHAIN_DESC1 swapDesc = {}; hr = swapChain_->GetDesc1(&swapDesc); if (FAILED(hr)) { IGL_LOG_ERROR("D3D12Context: Failed to query swapchain description (HRESULT: 0x%08X)\n", static_cast(hr)); IGL_DEBUG_ASSERT(false); return Result(Result::Code::RuntimeError, "Failed to query swapchain description"); } swapchainBufferCount_ = swapDesc.BufferCount; IGL_D3D12_LOG_VERBOSE("D3D12Context: Swapchain created with %u buffers\n", swapchainBufferCount_); // Resize frame management arrays to match swapchain buffer count renderTargets_.resize(swapchainBufferCount_); frameContexts_.resize(swapchainBufferCount_); return Result(); } Result D3D12Context::createRTVHeap() { D3D12_DESCRIPTOR_HEAP_DESC heapDesc = {}; heapDesc.NumDescriptors = swapchainBufferCount_; // Use queried buffer count heapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV; heapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE; HRESULT hr = device_->CreateDescriptorHeap(&heapDesc, IID_PPV_ARGS(rtvHeap_.GetAddressOf())); if (FAILED(hr)) { IGL_LOG_ERROR("D3D12Context: Failed to create RTV heap (HRESULT: 0x%08X)\n", static_cast(hr)); IGL_DEBUG_ASSERT(false); return Result(Result::Code::RuntimeError, "Failed to create RTV heap"); } rtvDescriptorSize_ = device_->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV); return Result(); } Result D3D12Context::createBackBuffers() { D3D12_CPU_DESCRIPTOR_HANDLE rtvHandle = rtvHeap_->GetCPUDescriptorHandleForHeapStart(); for (UINT i = 0; i < swapchainBufferCount_; i++) { // Use queried buffer count HRESULT hr = swapChain_->GetBuffer(i, IID_PPV_ARGS(renderTargets_[i].GetAddressOf())); if (FAILED(hr)) { IGL_LOG_ERROR("D3D12Context: Failed to get swapchain buffer %u (HRESULT: 0x%08X)\n", i, static_cast(hr)); IGL_DEBUG_ASSERT(false); return Result(Result::Code::RuntimeError, "Failed to get swapchain buffer"); } // Pre-creation validation. IGL_DEBUG_ASSERT(device_.Get() != nullptr, "Device is null before CreateRenderTargetView"); IGL_DEBUG_ASSERT(renderTargets_[i].Get() != nullptr, "Swapchain buffer is null"); IGL_DEBUG_ASSERT(rtvHandle.ptr != 0, "RTV descriptor handle is invalid"); device_->CreateRenderTargetView(renderTargets_[i].Get(), nullptr, rtvHandle); rtvHandle.ptr += rtvDescriptorSize_; } return Result(); } Result D3D12Context::createDescriptorHeaps() { // Cache descriptor sizes cbvSrvUavDescriptorSize_ = device_->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); samplerDescriptorSize_ = device_->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER); // Create per-frame shader-visible descriptor heaps using configurable sizes. // Each frame gets its own isolated heaps to prevent descriptor conflicts between frames. // Use pre-allocation with fail-fast on exhaustion (Vulkan pattern, no dynamic growth). IGL_D3D12_LOG_VERBOSE( "D3D12Context: Creating per-frame descriptor heaps with fail-fast allocation...\n"); IGL_D3D12_LOG_VERBOSE( " Config: bufferCount=%u, samplerHeapSize=%u, " "descriptorsPerPage=%u, maxHeapPages=%u, preAllocate=%s\n", swapchainBufferCount_, config_.samplerHeapSize, config_.descriptorsPerPage, config_.maxHeapPages, config_.preAllocateDescriptorPages ? "true" : "false"); for (UINT i = 0; i < swapchainBufferCount_; i++) { // CBV/SRV/UAV heap: pre-allocate pages based on the configuration policy. // When preAllocateDescriptorPages is true, allocate all maxHeapPages upfront // to prevent mid-frame allocation and descriptor invalidation (Vulkan fail-fast pattern). { frameContexts_[i].cbvSrvUavHeapPages.clear(); frameContexts_[i].currentCbvSrvUavPageIndex = 0; const uint32_t pagesToAllocate = config_.preAllocateDescriptorPages ? config_.maxHeapPages : 1; for (uint32_t pageIdx = 0; pageIdx < pagesToAllocate; ++pageIdx) { igl::d3d12::ComPtr heap; Result result = allocateDescriptorHeapPage( D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, config_.descriptorsPerPage, &heap); if (!result.isOk()) { IGL_LOG_ERROR( "D3D12Context: Failed to create CBV/SRV/UAV heap page %u for frame %u: %s\n", pageIdx, i, result.message.c_str()); IGL_DEBUG_ASSERT(false); return result; } frameContexts_[i].cbvSrvUavHeapPages.emplace_back(heap, config_.descriptorsPerPage); } const uint32_t allocatedDescriptors = pagesToAllocate * config_.descriptorsPerPage; if (config_.preAllocateDescriptorPages) { IGL_D3D12_LOG_VERBOSE( " Frame %u: Pre-allocated %u CBV/SRV/UAV heap pages (%u descriptors, fail-fast on " "exhaustion)\n", i, pagesToAllocate, allocatedDescriptors); } else { IGL_D3D12_LOG_VERBOSE( " Frame %u: Allocated %u CBV/SRV/UAV heap page (%u descriptors, fail-fast on " "exhaustion)\n", i, pagesToAllocate, allocatedDescriptors); } } // Sampler heap: samplerHeapSize descriptors { D3D12_DESCRIPTOR_HEAP_DESC desc = {}; desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER; desc.NumDescriptors = config_.samplerHeapSize; // T14: Use configurable size desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE; desc.NodeMask = 0; HRESULT hr = device_->CreateDescriptorHeap( &desc, IID_PPV_ARGS(frameContexts_[i].samplerHeap.GetAddressOf())); if (FAILED(hr)) { IGL_LOG_ERROR( "D3D12Context: Failed to create per-frame Sampler heap for frame %u (HRESULT: " "0x%08X)\n", i, static_cast(hr)); IGL_DEBUG_ASSERT(false); return Result(Result::Code::RuntimeError, "Failed to create per-frame Sampler heap for frame " + std::to_string(i)); } IGL_D3D12_LOG_VERBOSE( " Frame %u: Created Sampler heap (%u descriptors)\n", i, config_.samplerHeapSize); } } IGL_D3D12_LOG_VERBOSE("D3D12Context: Per-frame descriptor heaps created successfully\n"); // Memory calculation reflects actual pre-allocation (no dynamic growth). const uint32_t pagesPerFrame = config_.preAllocateDescriptorPages ? config_.maxHeapPages : 1; const uint32_t cbvSrvUavDescriptors = config_.descriptorsPerPage * pagesPerFrame; const uint32_t totalDescriptorsPerFrame = cbvSrvUavDescriptors + config_.samplerHeapSize; const uint32_t totalMemoryKB = (swapchainBufferCount_ * totalDescriptorsPerFrame * 32) / 1024; IGL_D3D12_LOG_VERBOSE( " Allocated memory: %u frames * (%u CBV/SRV/UAV + %u Samplers) * 32 bytes = %u KB\n", swapchainBufferCount_, cbvSrvUavDescriptors, config_.samplerHeapSize, totalMemoryKB); IGL_D3D12_LOG_VERBOSE("D3D12Context: Creating descriptor heap manager...\n"); // Create descriptor heap manager using configuration values. DescriptorHeapManager::Sizes sizes{}; sizes.cbvSrvUav = 256; // For CPU-visible staging (not used for shader-visible). sizes.samplers = 16; // For CPU-visible staging (not used for shader-visible). sizes.rtvs = config_.rtvHeapSize; sizes.dsvs = config_.dsvHeapSize; ownedHeapMgr_ = new DescriptorHeapManager(); Result result = ownedHeapMgr_->initialize(device_.Get(), sizes); if (!result.isOk()) { IGL_LOG_ERROR("D3D12Context: Failed to initialize descriptor heap manager: %s\n", result.message.c_str()); delete ownedHeapMgr_; ownedHeapMgr_ = nullptr; } else { heapMgr_ = ownedHeapMgr_; IGL_D3D12_LOG_VERBOSE("D3D12Context: Descriptor heap manager created successfully\n"); } return Result(); } Result D3D12Context::createCommandSignatures() { // Create command signature for DrawInstanced (multiDrawIndirect) // D3D12_DRAW_ARGUMENTS: { VertexCountPerInstance, InstanceCount, StartVertexLocation, // StartInstanceLocation } { D3D12_INDIRECT_ARGUMENT_DESC drawArg = {}; drawArg.Type = D3D12_INDIRECT_ARGUMENT_TYPE_DRAW; D3D12_COMMAND_SIGNATURE_DESC drawSigDesc = {}; drawSigDesc.ByteStride = sizeof(D3D12_DRAW_ARGUMENTS); // 16 bytes (4 x UINT) drawSigDesc.NumArgumentDescs = 1; drawSigDesc.pArgumentDescs = &drawArg; drawSigDesc.NodeMask = 0; HRESULT hr = device_->CreateCommandSignature( &drawSigDesc, nullptr, // No root signature needed for simple draw commands IID_PPV_ARGS(drawIndirectSignature_.GetAddressOf())); if (FAILED(hr)) { IGL_LOG_ERROR( "D3D12Context: Failed to create draw indirect command signature (HRESULT: 0x%08X)\n", static_cast(hr)); IGL_DEBUG_ASSERT(false); return Result(Result::Code::RuntimeError, "Failed to create draw indirect command signature"); } IGL_D3D12_LOG_VERBOSE( "D3D12Context: Created draw indirect command signature (stride: %u bytes)\n", drawSigDesc.ByteStride); } // Create command signature for DrawIndexedInstanced (multiDrawIndexedIndirect) // D3D12_DRAW_INDEXED_ARGUMENTS: { IndexCountPerInstance, InstanceCount, StartIndexLocation, // BaseVertexLocation, StartInstanceLocation } { D3D12_INDIRECT_ARGUMENT_DESC drawIndexedArg = {}; drawIndexedArg.Type = D3D12_INDIRECT_ARGUMENT_TYPE_DRAW_INDEXED; D3D12_COMMAND_SIGNATURE_DESC drawIndexedSigDesc = {}; drawIndexedSigDesc.ByteStride = sizeof(D3D12_DRAW_INDEXED_ARGUMENTS); // 20 bytes (5 x UINT) drawIndexedSigDesc.NumArgumentDescs = 1; drawIndexedSigDesc.pArgumentDescs = &drawIndexedArg; drawIndexedSigDesc.NodeMask = 0; HRESULT hr = device_->CreateCommandSignature( &drawIndexedSigDesc, nullptr, // No root signature needed for simple draw commands IID_PPV_ARGS(drawIndexedIndirectSignature_.GetAddressOf())); if (FAILED(hr)) { IGL_LOG_ERROR( "D3D12Context: Failed to create draw indexed indirect command signature (HRESULT: " "0x%08X)\n", static_cast(hr)); IGL_DEBUG_ASSERT(false); return Result(Result::Code::RuntimeError, "Failed to create draw indexed indirect command signature"); } IGL_D3D12_LOG_VERBOSE( "D3D12Context: Created draw indexed indirect command signature (stride: %u bytes)\n", drawIndexedSigDesc.ByteStride); } return Result(); } uint32_t D3D12Context::getCurrentBackBufferIndex() const { if (swapChain_.Get() == nullptr) { return 0; } return swapChain_->GetCurrentBackBufferIndex(); } ID3D12Resource* D3D12Context::getCurrentBackBuffer() const { uint32_t index = getCurrentBackBufferIndex(); if (index >= swapchainBufferCount_) { IGL_LOG_ERROR("getCurrentBackBuffer(): index %u >= swapchainBufferCount %u\n", index, swapchainBufferCount_); return nullptr; } ID3D12Resource* resource = renderTargets_[index].Get(); IGL_D3D12_LOG_VERBOSE("getCurrentBackBuffer(): index=%u, resource=%p\n", index, (void*)resource); return resource; } D3D12_CPU_DESCRIPTOR_HANDLE D3D12Context::getCurrentRTV() const { if (rtvHeap_.Get() == nullptr) { return {0}; } D3D12_CPU_DESCRIPTOR_HANDLE rtv = rtvHeap_->GetCPUDescriptorHandleForHeapStart(); rtv.ptr += getCurrentBackBufferIndex() * rtvDescriptorSize_; return rtv; } void D3D12Context::waitForGPU() { if (!fence_.Get() || !commandQueue_.Get()) { return; } // Signal and increment the fence value const UINT64 fenceToWaitFor = ++fenceValue_; commandQueue_->Signal(fence_.Get(), fenceToWaitFor); // Wait until the fence is crossed using FenceWaiter (TOCTOU-safe) FenceWaiter waiter(fence_.Get(), fenceToWaitFor); Result waitResult = waiter.wait(INFINITE); if (!waitResult.isOk()) { IGL_LOG_ERROR("D3D12Context::waitForGPU() - Fence wait failed: %s (fence=%llu)\n", waitResult.message.c_str(), fenceToWaitFor); } } void D3D12Context::trackResourceCreation(const char* type, size_t sizeBytes) { std::lock_guard lock(resourceStatsMutex_); if (strcmp(type, "Buffer") == 0) { resourceStats_.totalBuffersCreated++; resourceStats_.bufferMemoryBytes += sizeBytes; } else if (strcmp(type, "Texture") == 0) { resourceStats_.totalTexturesCreated++; resourceStats_.textureMemoryBytes += sizeBytes; } else if (strcmp(type, "SRV") == 0) { resourceStats_.totalSRVsCreated++; } else if (strcmp(type, "Sampler") == 0) { resourceStats_.totalSamplersCreated++; } } void D3D12Context::trackResourceDestruction(const char* type, size_t sizeBytes) { std::lock_guard lock(resourceStatsMutex_); if (strcmp(type, "Buffer") == 0) { resourceStats_.totalBuffersDestroyed++; resourceStats_.bufferMemoryBytes -= sizeBytes; } else if (strcmp(type, "Texture") == 0) { resourceStats_.totalTexturesDestroyed++; resourceStats_.textureMemoryBytes -= sizeBytes; } } void D3D12Context::logResourceStats() { std::lock_guard lock(resourceStatsMutex_); IGL_D3D12_LOG_VERBOSE("=== D3D12 Resource Statistics ===\n"); IGL_D3D12_LOG_VERBOSE( " Buffers: %zu created, %zu destroyed (leaked: %zd)\n", resourceStats_.totalBuffersCreated, resourceStats_.totalBuffersDestroyed, (int64_t)resourceStats_.totalBuffersCreated - (int64_t)resourceStats_.totalBuffersDestroyed); IGL_D3D12_LOG_VERBOSE(" Textures: %zu created, %zu destroyed (leaked: %zd)\n", resourceStats_.totalTexturesCreated, resourceStats_.totalTexturesDestroyed, (int64_t)resourceStats_.totalTexturesCreated - (int64_t)resourceStats_.totalTexturesDestroyed); IGL_D3D12_LOG_VERBOSE(" SRVs created: %zu\n", resourceStats_.totalSRVsCreated); IGL_D3D12_LOG_VERBOSE(" Samplers created: %zu\n", resourceStats_.totalSamplersCreated); IGL_D3D12_LOG_VERBOSE(" Buffer memory: %.2f MB\n", resourceStats_.bufferMemoryBytes / (1024.0 * 1024.0)); IGL_D3D12_LOG_VERBOSE(" Texture memory: %.2f MB\n", resourceStats_.textureMemoryBytes / (1024.0 * 1024.0)); IGL_D3D12_LOG_VERBOSE("==================================\n"); } // Allocate a new descriptor heap page for dynamic growth. Result D3D12Context::allocateDescriptorHeapPage(D3D12_DESCRIPTOR_HEAP_TYPE type, uint32_t numDescriptors, igl::d3d12::ComPtr* outHeap) { if (!device_.Get()) { return Result{Result::Code::RuntimeError, "Device is null"}; } D3D12_DESCRIPTOR_HEAP_DESC heapDesc = {}; heapDesc.Type = type; heapDesc.NumDescriptors = numDescriptors; heapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE; heapDesc.NodeMask = 0; HRESULT hr = device_->CreateDescriptorHeap(&heapDesc, IID_PPV_ARGS(outHeap->GetAddressOf())); if (FAILED(hr)) { char errorMsg[256]; snprintf(errorMsg, sizeof(errorMsg), "Failed to create descriptor heap page (type=%d, numDescriptors=%u): HRESULT=0x%08X", static_cast(type), numDescriptors, static_cast(hr)); return Result{Result::Code::RuntimeError, errorMsg}; } return Result{}; } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/D3D12Context.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl { class IBuffer; // Forward declaration for igl::IBuffer } namespace igl::d3d12 { class DescriptorHeapManager; // fwd decl in igl::d3d12 /** * @brief Descriptor heap page for dynamic multi-page growth * * Part of Strategy 1 (Transient Descriptor Allocator) architecture. * See D3D12ResourcesBinder.h for full architecture documentation. * * Following Microsoft MiniEngine's DynamicDescriptorHeap pattern: * - Start with 1 page of 1024 descriptors per frame * - Grow to up to 16 pages (16,384 descriptors) on-demand * - Reset all counters at frame boundary (no deallocation needed) */ struct DescriptorHeapPage { igl::d3d12::ComPtr heap; uint32_t capacity; // Total descriptors in this page uint32_t used; // Currently allocated descriptors DescriptorHeapPage() : capacity(0), used(0) {} DescriptorHeapPage(igl::d3d12::ComPtr h, uint32_t cap) : heap(h), capacity(cap), used(0) {} }; /** * @brief Per-frame context for CPU/GPU parallelism and descriptor management * * ============================================================================ * ARCHITECTURE: Strategy 1 - Transient Descriptor Allocator * ============================================================================ * * FrameContext implements the per-frame descriptor heap management system * (Strategy 1 in D3D12ResourcesBinder.h architecture). * * **Key Design Decisions**: * - 3 frames in flight: Prevents CPU/GPU stalls while enabling triple buffering * - Per-frame isolation: Each frame gets independent descriptor heaps * - Shared across command buffers: ALL command buffers in a frame share these heaps * - Linear allocation: O(1) descriptor allocation with simple counter increment * - Frame-boundary reset: Counters reset to 0, no per-descriptor deallocation * - Dynamic growth: CBV/SRV/UAV heaps can grow from 1 to 16 pages on-demand * * **Descriptor Heap Layout**: * - CBV/SRV/UAV: Multi-page array (1024 descriptors/page, up to 16 pages = 16K total) * - Samplers: Single heap (2048 descriptors, D3D12 spec limit, no growth) * * **Access Pattern**: * - CommandBuffer::getNextCbvSrvUavDescriptor() - allocates from current page * - CommandBuffer::allocateCbvSrvUavRange() - allocates contiguous range * - CommandBuffer::getNextSamplerDescriptor() - returns reference for increment * - FrameManager::resetDescriptorCounters() - resets at frame boundary * * **Performance Characteristics**: * - Allocation: O(1) with occasional page growth (O(n) for page vector resize) * - Deallocation: None (bulk reset at frame boundary) * - Memory: ~4MB worst case per frame (16 pages * 1024 descriptors * 32 bytes/descriptor) * * For architecture overview, see D3D12ResourcesBinder.h documentation. */ struct FrameContext { igl::d3d12::ComPtr allocator; UINT64 fenceValue = 0; // First fence signaled this frame (backward compatibility) // D-002: Track maximum fence value of ALL command lists using this allocator // CRITICAL: Allocator can only be reset when GPU completes maxAllocatorFence UINT64 maxAllocatorFence = 0; // D-002: Count command buffers submitted with this allocator (telemetry) uint32_t commandBufferCount = 0; // Per-frame shader-visible descriptor heaps (following Microsoft MiniEngine pattern). // Supports multiple pages for dynamic growth to prevent overflow and corruption. // Each frame gets its own isolated heap pages to prevent descriptor conflicts. std::vector cbvSrvUavHeapPages; // Dynamic array of 1024-descriptor pages igl::d3d12::ComPtr samplerHeap; // 2048 descriptors (kMaxSamplers) // Current active page index for CBV/SRV/UAV allocation. uint32_t currentCbvSrvUavPageIndex = 0; // Track the currently active shader-visible heap for command list binding. // This is updated when allocating new pages and must be rebound to the command list. // This heap is returned by D3D12Context::getCbvSrvUavHeap() for binding. igl::d3d12::ComPtr activeCbvSrvUavHeap; // Linear allocator counters - reset to 0 each frame // Incremented by each command buffer's encoders as they allocate descriptors uint32_t nextCbvSrvUavDescriptor = 0; uint32_t nextSamplerDescriptor = 0; // Transient resources that must be kept alive until this frame completes GPU execution // Examples: push constant buffers, temporary upload buffers // CRITICAL: These are cleared when we advance to the next frame AFTER waiting for // this frame's fence, ensuring the GPU has finished reading them std::vector> transientBuffers; std::vector> transientResources; // Telemetry for transient resource tracking. // Tracks high-water mark to observe peak usage and detect unbounded growth. size_t transientBuffersHighWater = 0; size_t transientResourcesHighWater = 0; // Telemetry for descriptor heap usage tracking. // Tracks peak descriptor usage per frame to detect heap overflow risks. uint32_t peakCbvSrvUavUsage = 0; uint32_t peakSamplerUsage = 0; }; class D3D12Context { public: // A-011: Multi-adapter enumeration and tracking struct AdapterInfo { igl::d3d12::ComPtr adapter; DXGI_ADAPTER_DESC1 desc; D3D_FEATURE_LEVEL featureLevel; bool isWarp; // Software rasterizer uint32_t index; // Original enumeration index // Helper methods uint64_t getDedicatedVideoMemoryMB() const; const char* getVendorName() const; }; // A-012: Memory budget tracking struct MemoryBudget { uint64_t dedicatedVideoMemory = 0; // Dedicated GPU memory (bytes) uint64_t sharedSystemMemory = 0; // Shared system memory accessible to GPU (bytes) uint64_t estimatedUsage = 0; // Current estimated usage by this device (bytes) uint64_t userDefinedBudgetLimit = 0; // Optional soft limit uint64_t totalAvailableMemory() const; double getUsagePercentage() const; bool isMemoryCritical() const; bool isMemoryLow() const; }; // A-010: HDR output capabilities struct HDRCapabilities { bool hdrSupported = false; // HDR10 support bool scRGBSupported = false; // scRGB (FP16) support DXGI_COLOR_SPACE_TYPE nativeColorSpace = DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709; // SDR default float maxLuminance = 80.0f; // Max luminance in nits (SDR default) float minLuminance = 0.0f; // Min luminance in nits float maxFullFrameLuminance = 80.0f; // Max full-frame luminance in nits }; D3D12Context() = default; ~D3D12Context(); // initialize() accepts optional D3D12ContextConfig for configurable sizes. Result initialize(HWND hwnd, uint32_t width, uint32_t height, const D3D12ContextConfig& config = D3D12ContextConfig::defaultConfig()); Result resize(uint32_t width, uint32_t height); ID3D12Device* getDevice() const { return device_.Get(); } ID3D12CommandQueue* getCommandQueue() const { return commandQueue_.Get(); } IDXGISwapChain3* getSwapChain() const { return swapChain_.Get(); } // Get currently active CBV/SRV/UAV descriptor heap for current frame. // Returns the active heap used for descriptor allocation. Use this for heap binding. // For multi-page access or diagnostics, use getFrameContexts(). ID3D12DescriptorHeap* getCbvSrvUavHeap() const { const auto& frameCtx = frameContexts_[currentFrameIndex_]; return frameCtx.activeCbvSrvUavHeap.Get(); } ID3D12DescriptorHeap* getSamplerHeap() const { return frameContexts_[currentFrameIndex_].samplerHeap.Get(); } // Allocate a new descriptor heap page for dynamic growth. Result allocateDescriptorHeapPage(D3D12_DESCRIPTOR_HEAP_TYPE type, uint32_t numDescriptors, igl::d3d12::ComPtr* outHeap); // Get descriptor sizes UINT getCbvSrvUavDescriptorSize() const { return cbvSrvUavDescriptorSize_; } UINT getSamplerDescriptorSize() const { return samplerDescriptorSize_; } // Get root signature capabilities D3D_ROOT_SIGNATURE_VERSION getHighestRootSignatureVersion() const { return highestRootSignatureVersion_; } D3D12_RESOURCE_BINDING_TIER getResourceBindingTier() const { return resourceBindingTier_; } // Get shader model capability. D3D_SHADER_MODEL getMaxShaderModel() const { return maxShaderModel_; } // Get selected feature level (A-004, A-005) D3D_FEATURE_LEVEL getSelectedFeatureLevel() const { return selectedFeatureLevel_; } // Get tearing support capability bool isTearingSupported() const { return tearingSupported_; } // Get command signatures for indirect drawing. ID3D12CommandSignature* getDrawIndirectSignature() const { return drawIndirectSignature_.Get(); } ID3D12CommandSignature* getDrawIndexedIndirectSignature() const { return drawIndexedIndirectSignature_.Get(); } // Get descriptor handles from per-frame heaps using the current page for multi-heap support. D3D12_CPU_DESCRIPTOR_HANDLE getCbvSrvUavCpuHandle(uint32_t descriptorIndex) const { const auto& frameCtx = frameContexts_[currentFrameIndex_]; const auto& pages = frameCtx.cbvSrvUavHeapPages; const uint32_t pageIdx = frameCtx.currentCbvSrvUavPageIndex; if (pages.empty() || pageIdx >= pages.size()) { return {0}; // Invalid handle } auto h = pages[pageIdx].heap->GetCPUDescriptorHandleForHeapStart(); h.ptr += descriptorIndex * cbvSrvUavDescriptorSize_; return h; } D3D12_GPU_DESCRIPTOR_HANDLE getCbvSrvUavGpuHandle(uint32_t descriptorIndex) const { const auto& frameCtx = frameContexts_[currentFrameIndex_]; const auto& pages = frameCtx.cbvSrvUavHeapPages; const uint32_t pageIdx = frameCtx.currentCbvSrvUavPageIndex; if (pages.empty() || pageIdx >= pages.size()) { return {0}; // Invalid handle } auto h = pages[pageIdx].heap->GetGPUDescriptorHandleForHeapStart(); h.ptr += descriptorIndex * cbvSrvUavDescriptorSize_; return h; } D3D12_CPU_DESCRIPTOR_HANDLE getSamplerCpuHandle(uint32_t descriptorIndex) const { auto h = frameContexts_[currentFrameIndex_].samplerHeap->GetCPUDescriptorHandleForHeapStart(); h.ptr += descriptorIndex * samplerDescriptorSize_; return h; } D3D12_GPU_DESCRIPTOR_HANDLE getSamplerGpuHandle(uint32_t descriptorIndex) const { auto h = frameContexts_[currentFrameIndex_].samplerHeap->GetGPUDescriptorHandleForHeapStart(); h.ptr += descriptorIndex * samplerDescriptorSize_; return h; } // Optional descriptor heap manager (provided by headless context) DescriptorHeapManager* getDescriptorHeapManager() const { return heapMgr_; } uint32_t getCurrentBackBufferIndex() const; ID3D12Resource* getCurrentBackBuffer() const; D3D12_CPU_DESCRIPTOR_HANDLE getCurrentRTV() const; void waitForGPU(); // Per-frame fence access for CommandQueue FrameContext* getFrameContexts() { return frameContexts_.data(); } UINT& getCurrentFrameIndex() { return currentFrameIndex_; } UINT getSwapchainBufferCount() const { return swapchainBufferCount_; } UINT64& getFenceValue() { return fenceValue_; } ID3D12Fence* getFence() const { return fence_.Get(); } // Resource tracking for diagnostics static void trackResourceCreation(const char* type, size_t sizeBytes); static void trackResourceDestruction(const char* type, size_t sizeBytes); static void logResourceStats(); // A-011: Adapter enumeration and selection const std::vector& getEnumeratedAdapters() const { return enumeratedAdapters_; } const AdapterInfo* getSelectedAdapter() const { if (selectedAdapterIndex_ < enumeratedAdapters_.size()) { return &enumeratedAdapters_[selectedAdapterIndex_]; } return nullptr; } uint32_t getSelectedAdapterIndex() const { return selectedAdapterIndex_; } // A-012: Memory budget tracking MemoryBudget getMemoryBudget() const { std::lock_guard lock(memoryTrackingMutex_); return memoryBudget_; } double getMemoryUsagePercentage() const { std::lock_guard lock(memoryTrackingMutex_); return memoryBudget_.getUsagePercentage(); } bool isMemoryLow() const { std::lock_guard lock(memoryTrackingMutex_); return memoryBudget_.isMemoryLow(); } bool isMemoryCritical() const { std::lock_guard lock(memoryTrackingMutex_); return memoryBudget_.isMemoryCritical(); } void updateMemoryUsage(int64_t delta) { std::lock_guard lock(memoryTrackingMutex_); uint64_t newUsage = memoryBudget_.estimatedUsage; if (delta < 0) { uint64_t absDelta = static_cast(-delta); newUsage = (absDelta > newUsage) ? 0 : (newUsage - absDelta); } else { newUsage += static_cast(delta); } memoryBudget_.estimatedUsage = newUsage; } // A-010: HDR output capabilities const HDRCapabilities& getHDRCapabilities() const { return hdrCapabilities_; } bool isHDRSupported() const { return hdrCapabilities_.hdrSupported; } // Accessor for configuration (sizes, frame buffering, etc.). const D3D12ContextConfig& getConfig() const { return config_; } protected: [[nodiscard]] Result createDevice(); [[nodiscard]] Result createCommandQueue(); [[nodiscard]] Result createSwapChain(HWND hwnd, uint32_t width, uint32_t height); Result recreateSwapChain(uint32_t width, uint32_t height); [[nodiscard]] Result createRTVHeap(); [[nodiscard]] Result createBackBuffers(); [[nodiscard]] Result createDescriptorHeaps(); [[nodiscard]] Result createCommandSignatures(); // A-011: Adapter enumeration [[nodiscard]] Result enumerateAndSelectAdapter(); static D3D_FEATURE_LEVEL getHighestFeatureLevel(IDXGIAdapter1* adapter); // A-012: Memory budget detection void detectMemoryBudget(); // A-010: HDR output detection void detectHDRCapabilities(); igl::d3d12::ComPtr dxgiFactory_; igl::d3d12::ComPtr adapter_; igl::d3d12::ComPtr device_; igl::d3d12::ComPtr commandQueue_; igl::d3d12::ComPtr swapChain_; UINT swapchainBufferCount_ = 0; // Queried from swapchain, replaces kMaxFramesInFlight igl::d3d12::ComPtr rtvHeap_; std::vector> renderTargets_; // Sized to swapchainBufferCount_ UINT rtvDescriptorSize_ = 0; // Descriptor sizes (cached from device) UINT cbvSrvUavDescriptorSize_ = 0; UINT samplerDescriptorSize_ = 0; // Feature detection for root signature capabilities D3D_ROOT_SIGNATURE_VERSION highestRootSignatureVersion_ = D3D_ROOT_SIGNATURE_VERSION_1_0; D3D12_RESOURCE_BINDING_TIER resourceBindingTier_ = D3D12_RESOURCE_BINDING_TIER_1; // Feature detection for device feature level (A-004) D3D_FEATURE_LEVEL selectedFeatureLevel_ = D3D_FEATURE_LEVEL_11_0; // Feature detection for shader model. // DXC requires SM 6.0 minimum (SM 5.x deprecated). D3D_SHADER_MODEL maxShaderModel_ = D3D_SHADER_MODEL_6_0; // Feature detection for variable refresh rate (tearing) support bool tearingSupported_ = false; // A-011: Multi-adapter tracking (structs defined in public section) std::vector enumeratedAdapters_; uint32_t selectedAdapterIndex_ = 0; // A-012: Memory budget tracking (struct defined in public section) MemoryBudget memoryBudget_; mutable std::mutex memoryTrackingMutex_; // A-010: HDR output capabilities (struct defined in public section) HDRCapabilities hdrCapabilities_; // Command signatures for indirect drawing. igl::d3d12::ComPtr drawIndirectSignature_; igl::d3d12::ComPtr drawIndexedIndirectSignature_; // Descriptor heap manager for headless contexts (unit tests) DescriptorHeapManager* ownedHeapMgr_ = nullptr; // Owned manager for windowed contexts (raw ptr, manually deleted) DescriptorHeapManager* heapMgr_ = nullptr; // non-owning; points to ownedHeapMgr_ or external (headless) // Per-frame synchronization for CPU/GPU parallelism std::vector frameContexts_; // Sized to swapchainBufferCount_ UINT currentFrameIndex_ = 0; // Global synchronization igl::d3d12::ComPtr fence_; UINT64 fenceValue_ = 0; uint32_t width_ = 0; uint32_t height_ = 0; // Configuration for customizable sizes. D3D12ContextConfig config_; // Resource tracking (static for global tracking across all contexts) struct ResourceStats { size_t totalBuffersCreated = 0; size_t totalBuffersDestroyed = 0; size_t totalTexturesCreated = 0; size_t totalTexturesDestroyed = 0; size_t totalSRVsCreated = 0; size_t totalSamplersCreated = 0; size_t bufferMemoryBytes = 0; size_t textureMemoryBytes = 0; }; static ResourceStats resourceStats_; static std::mutex resourceStatsMutex_; }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/D3D12DeviceCapabilities.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace igl::d3d12 { void D3D12DeviceCapabilities::initialize(D3D12Context& ctx) { validateDeviceLimits(ctx); } void D3D12DeviceCapabilities::validateDeviceLimits(D3D12Context& ctx) { auto* device = ctx.getDevice(); if (!device) { IGL_LOG_ERROR("D3D12DeviceCapabilities::validateDeviceLimits: D3D12 device is null\n"); return; } IGL_D3D12_LOG_VERBOSE("=== D3D12 Device Capabilities and Limits Validation ===\n"); // Query D3D12_FEATURE_D3D12_OPTIONS for resource binding tier and other capabilities HRESULT hr = device->CheckFeatureSupport( D3D12_FEATURE_D3D12_OPTIONS, &deviceOptions_, sizeof(deviceOptions_)); if (SUCCEEDED(hr)) { // Log resource binding tier const char* tierName = "Unknown"; switch (deviceOptions_.ResourceBindingTier) { case D3D12_RESOURCE_BINDING_TIER_1: tierName = "Tier 1 (bounded descriptors required)"; break; case D3D12_RESOURCE_BINDING_TIER_2: tierName = "Tier 2 (unbounded arrays except samplers)"; break; case D3D12_RESOURCE_BINDING_TIER_3: tierName = "Tier 3 (fully unbounded)"; break; } IGL_D3D12_LOG_VERBOSE(" Resource Binding Tier: %s\n", tierName); // Log other relevant capabilities IGL_D3D12_LOG_VERBOSE(" Standard Swizzle 64KB Supported: %s\n", deviceOptions_.StandardSwizzle64KBSupported ? "Yes" : "No"); IGL_D3D12_LOG_VERBOSE(" Cross-Node Sharing Tier: %d\n", deviceOptions_.CrossNodeSharingTier); IGL_D3D12_LOG_VERBOSE(" Conservative Rasterization Tier: %d\n", deviceOptions_.ConservativeRasterizationTier); } else { IGL_LOG_ERROR(" Failed to query D3D12_FEATURE_D3D12_OPTIONS (HRESULT: 0x%08X)\n", hr); } // Query D3D12_FEATURE_D3D12_OPTIONS1 for root signature version hr = device->CheckFeatureSupport( D3D12_FEATURE_D3D12_OPTIONS1, &deviceOptions1_, sizeof(deviceOptions1_)); if (SUCCEEDED(hr)) { IGL_D3D12_LOG_VERBOSE(" Wave Intrinsics Supported: %s\n", deviceOptions1_.WaveOps ? "Yes" : "No"); IGL_D3D12_LOG_VERBOSE(" Wave Lane Count Min: %u\n", deviceOptions1_.WaveLaneCountMin); IGL_D3D12_LOG_VERBOSE(" Wave Lane Count Max: %u\n", deviceOptions1_.WaveLaneCountMax); IGL_D3D12_LOG_VERBOSE(" Total Lane Count: %u\n", deviceOptions1_.TotalLaneCount); } else { IGL_D3D12_LOG_VERBOSE(" D3D12_FEATURE_D3D12_OPTIONS1 query failed (not critical)\n"); } // The rest of the original validation logic lives in Device::getFeatureLimits() // and related capability queries, so no additional checks are needed here. } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/D3D12DeviceCapabilities.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::d3d12 { class D3D12Context; class D3D12DeviceCapabilities { public: void initialize(D3D12Context& ctx); [[nodiscard]] const D3D12_FEATURE_DATA_D3D12_OPTIONS& getOptions() const { return deviceOptions_; } [[nodiscard]] const D3D12_FEATURE_DATA_D3D12_OPTIONS1& getOptions1() const { return deviceOptions1_; } [[nodiscard]] D3D12_RESOURCE_BINDING_TIER getResourceBindingTier() const { return deviceOptions_.ResourceBindingTier; } private: void validateDeviceLimits(D3D12Context& ctx); D3D12_FEATURE_DATA_D3D12_OPTIONS deviceOptions_ = {}; D3D12_FEATURE_DATA_D3D12_OPTIONS1 deviceOptions1_ = {}; }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/D3D12FenceWaiter.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include namespace igl::d3d12 { FenceWaiter::FenceWaiter(ID3D12Fence* fence, UINT64 targetValue) : fence_(fence), targetValue_(targetValue) { if (!fence_) { IGL_LOG_ERROR("FenceWaiter: null fence provided\n"); setupErrorCode_ = Result::Code::ArgumentNull; setupErrorMessage_ = "Null fence provided to FenceWaiter"; return; } event_ = CreateEvent(nullptr, FALSE, FALSE, nullptr); if (!event_) { const DWORD lastError = GetLastError(); IGL_LOG_ERROR("FenceWaiter: Failed to create event handle (LastError=0x%08X)\n", lastError); setupErrorCode_ = Result::Code::InvalidOperation; char buf[128]; snprintf(buf, sizeof(buf), "CreateEvent failed (OS error 0x%08X)", lastError); setupErrorMessage_ = buf; return; } HRESULT hr = fence_->SetEventOnCompletion(targetValue_, event_); if (FAILED(hr)) { IGL_LOG_ERROR("FenceWaiter: SetEventOnCompletion failed: 0x%08X\n", static_cast(hr)); CloseHandle(event_); event_ = nullptr; setupErrorCode_ = Result::Code::InvalidOperation; char buf[128]; snprintf(buf, sizeof(buf), "SetEventOnCompletion failed (HRESULT=0x%08X)", static_cast(hr)); setupErrorMessage_ = buf; return; } setupSucceeded_ = true; } FenceWaiter::~FenceWaiter() { if (event_) { CloseHandle(event_); } } bool FenceWaiter::isComplete() const { return fence_ && fence_->GetCompletedValue() >= targetValue_; } Result FenceWaiter::wait(DWORD timeoutMs) { // Check if setup succeeded (constructor completed event creation and SetEventOnCompletion) if (!setupSucceeded_ || !event_) { return Result(setupErrorCode_, setupErrorMessage_); } // D-003: Re-check fence after SetEventOnCompletion to avoid TOCTOU race if (isComplete()) { return Result(); // Already complete, no wait needed } DWORD waitResult = WaitForSingleObject(event_, timeoutMs); if (waitResult == WAIT_OBJECT_0) { // Verify fence actually reached target value UINT64 completedValue = fence_->GetCompletedValue(); if (completedValue < targetValue_) { IGL_LOG_ERROR("FenceWaiter: Wait returned but fence incomplete (expected=%llu, got=%llu)\n", targetValue_, completedValue); // CRITICAL: This indicates a GPU/driver issue (event signaled but fence not updated) // For INFINITE timeout, try bounded recovery; otherwise honor the timeout contract if (timeoutMs == INFINITE) { // Bounded spin as last resort for INFINITE waits only const int maxSpins = 10000; int spins = 0; for (; spins < maxSpins && fence_->GetCompletedValue() < targetValue_; ++spins) { Sleep(1); } if (fence_->GetCompletedValue() >= targetValue_) { IGL_D3D12_LOG_VERBOSE("FenceWaiter: Fence completed after %d recovery spins\n", spins); return Result(); // Success after recovery } IGL_LOG_ERROR("FenceWaiter: Fence still incomplete after %d bounded spins\n", maxSpins); } // Honor timeout contract: event signaled but fence incomplete = failure return Result(Result::Code::RuntimeError, "Fence incomplete after wait (possible GPU hang or driver issue)"); } return Result(); // Success } else if (waitResult == WAIT_TIMEOUT) { const UINT64 completedValue = fence_ ? fence_->GetCompletedValue() : 0; IGL_LOG_ERROR("FenceWaiter: Timeout waiting for fence %llu (completed=%llu)\n", targetValue_, completedValue); return Result(Result::Code::RuntimeError, "Fence wait timed out (possible GPU hang)"); } else { const DWORD lastError = GetLastError(); IGL_LOG_ERROR( "FenceWaiter: Wait failed with result 0x%08X (LastError=0x%08X)\n", waitResult, lastError); char buf[128]; snprintf(buf, sizeof(buf), "WaitForSingleObject failed (result=0x%08X, OS error=0x%08X)", waitResult, lastError); return Result(Result::Code::RuntimeError, buf); } } bool FenceWaiter::isTimeoutError(const Result& result) { return !result.isOk() && result.message.find("timed out") != std::string::npos; } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/D3D12FenceWaiter.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::d3d12 { /** * @brief RAII helper for D3D12 fence waiting operations * * Manages event creation, SetEventOnCompletion, and proper cleanup. * Eliminates TOCTOU races by rechecking fence after SetEventOnCompletion. * * IMPORTANT: The fence pointer must remain valid for the lifetime of the FenceWaiter. * Typical usage is with fences owned by long-lived context objects. * * Usage: * FenceWaiter waiter(fence, targetValue); * Result result = waiter.wait(timeoutMs); * if (!result.isOk()) { * // Handle specific error (timeout, setup failure, etc.) * } */ class FenceWaiter final { public: FenceWaiter(ID3D12Fence* fence, UINT64 targetValue); ~FenceWaiter(); // Delete copy/move to ensure single ownership of event handle FenceWaiter(const FenceWaiter&) = delete; FenceWaiter& operator=(const FenceWaiter&) = delete; FenceWaiter(FenceWaiter&&) = delete; FenceWaiter& operator=(FenceWaiter&&) = delete; /** * @brief Wait for fence to reach target value with timeout * @param timeoutMs Timeout in milliseconds (INFINITE for no timeout) * @return Result with specific error code and message on failure: * - ArgumentNull: Null fence provided to constructor * - InvalidOperation: Event creation or SetEventOnCompletion failed * - RuntimeError: Wait timed out (use isTimeoutError() to detect) * - RuntimeError: Wait failed or fence incomplete after event signaled */ Result wait(DWORD timeoutMs = INFINITE); /** * @brief Check if fence already reached target without waiting */ bool isComplete() const; /** * @brief Check if a Result represents a timeout error * @param result The Result to check * @return true if the result indicates a timeout, false otherwise */ static bool isTimeoutError(const Result& result); private: ID3D12Fence* fence_; UINT64 targetValue_; HANDLE event_ = nullptr; bool setupSucceeded_ = false; Result::Code setupErrorCode_ = Result::Code::Ok; std::string setupErrorMessage_; }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/D3D12FrameManager.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace igl::d3d12 { void FrameManager::advanceFrame(UINT64 currentFenceValue) { // Calculate next frame index const uint32_t bufferCount = context_.getSwapchainBufferCount(); const uint32_t nextFrameIndex = (context_.getCurrentFrameIndex() + 1) % bufferCount; // STEP 1: Pipeline overload protection waitForPipelineSync(currentFenceValue); // STEP 2: Wait for next frame's resources to be available if (!waitForFrame(nextFrameIndex)) { IGL_LOG_ERROR("FrameManager: Skipping frame advancement due to fence wait failure\n"); return; } // STEP 3: Advance to next frame context_.getCurrentFrameIndex() = nextFrameIndex; #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE("FrameManager: Advanced to frame index %u\n", nextFrameIndex); #endif // STEP 4: Reset allocator safely resetAllocator(nextFrameIndex); // STEP 5: Clear transient resources clearTransientResources(nextFrameIndex); // STEP 6: Reset descriptor counters resetDescriptorCounters(nextFrameIndex); } void FrameManager::waitForPipelineSync(UINT64 currentFenceValue) { auto* fence = context_.getFence(); // Ensure we don't have more frames in flight than swapchain buffers const uint32_t bufferCount = context_.getSwapchainBufferCount(); const UINT64 minimumSafeFence = (currentFenceValue >= bufferCount) ? (currentFenceValue - (bufferCount - 1)) : 0; const UINT64 currentCompletedValue = fence->GetCompletedValue(); if (currentCompletedValue < minimumSafeFence) { #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE( "FrameManager: SAFETY WAIT - Pipeline overload protection (completed=%llu, need=%llu)\n", currentCompletedValue, minimumSafeFence); #endif FenceWaiter waiter(fence, minimumSafeFence); Result waitResult = waiter.wait(INFINITE); if (!waitResult.isOk()) { IGL_LOG_ERROR( "FrameManager: CRITICAL - Pipeline safety wait failed: %s; continuing but overload " "protection compromised\n", waitResult.message.c_str()); // Continue anyway - this is a safety net, not a hard requirement // But future work should consider aborting here as well } #ifdef IGL_DEBUG else { IGL_D3D12_LOG_VERBOSE("FrameManager: Safety wait completed (fence now=%llu)\n", fence->GetCompletedValue()); } #endif } } bool FrameManager::waitForFrame(uint32_t frameIndex) { auto* fence = context_.getFence(); const UINT64 frameFence = context_.getFrameContexts()[frameIndex].fenceValue; if (frameFence != 0 && fence->GetCompletedValue() < frameFence) { #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE("FrameManager: Waiting for frame %u (fence=%llu, current=%llu)\n", frameIndex, frameFence, fence->GetCompletedValue()); #endif FenceWaiter waiter(fence, frameFence); // Try with 5-second timeout first (handles window drag scenarios) Result waitResult = waiter.wait(5000); if (!waitResult.isOk()) { // Check if it's a timeout or other error if (FenceWaiter::isTimeoutError(waitResult)) { IGL_LOG_ERROR( "FrameManager: Wait for frame %u fence %llu timed out after 5s; forcing infinite " "wait\n", frameIndex, frameFence); } else { IGL_LOG_ERROR( "FrameManager: Wait for frame %u fence %llu failed: %s; forcing infinite wait\n", frameIndex, frameFence, waitResult.message.c_str()); } // Fall back to infinite wait waitResult = waiter.wait(INFINITE); if (!waitResult.isOk()) { IGL_LOG_ERROR( "FrameManager: CRITICAL - Infinite wait for frame %u failed: %s; aborting frame " "advancement\n", frameIndex, waitResult.message.c_str()); return false; // Abort frame advancement - unsafe to proceed } } #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE("FrameManager: Frame %u resources now available (completed=%llu)\n", frameIndex, fence->GetCompletedValue()); #endif } else { #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE( "FrameManager: Frame %u resources already available (fence=%llu, completed=%llu)\n", frameIndex, frameFence, fence->GetCompletedValue()); #endif } return true; } void FrameManager::resetAllocator(uint32_t frameIndex) { auto* fence = context_.getFence(); auto& frame = context_.getFrameContexts()[frameIndex]; auto* allocator = frame.allocator.Get(); const UINT64 allocatorFence = frame.maxAllocatorFence; if (allocatorFence == 0) { // First time using this allocator HRESULT hr = allocator->Reset(); if (FAILED(hr)) { IGL_LOG_ERROR("FrameManager: Failed to reset frame %u allocator: 0x%08X\n", frameIndex, static_cast(hr)); } } else { // Verify GPU completed all command lists using this allocator const UINT64 completedValue = fence->GetCompletedValue(); if (completedValue < allocatorFence) { IGL_LOG_ERROR( "FrameManager: ALLOCATOR SYNC ISSUE - GPU not done with all command lists " "(completed=%llu, need=%llu, cmdBufCount=%u). Waiting...\n", completedValue, allocatorFence, frame.commandBufferCount); FenceWaiter waiter(fence, allocatorFence); Result waitResult = waiter.wait(INFINITE); if (!waitResult.isOk()) { IGL_LOG_ERROR( "FrameManager: CRITICAL - Allocator wait failed: %s; skipping unsafe allocator reset " "for frame %u\n", waitResult.message.c_str(), frameIndex); // Do not reset allocator if GPU hasn't completed - would cause sync violations return; } IGL_D3D12_LOG_VERBOSE("FrameManager: Allocator wait completed (fence now=%llu)\n", fence->GetCompletedValue()); } // Reset allocator (safe now - GPU has completed all command lists) HRESULT hr = allocator->Reset(); if (FAILED(hr)) { IGL_LOG_ERROR( "FrameManager: Failed to reset frame %u allocator: 0x%08X " "(maxFence=%llu, completed=%llu, cmdBufCount=%u)\n", frameIndex, static_cast(hr), allocatorFence, fence->GetCompletedValue(), frame.commandBufferCount); } else { #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE( "FrameManager: Reset frame %u allocator (waited for %u command buffers, maxFence=%llu)\n", frameIndex, frame.commandBufferCount, allocatorFence); #endif } #ifdef _DEBUG if (SUCCEEDED(hr)) { const UINT64 currentCompleted = fence->GetCompletedValue(); IGL_DEBUG_ASSERT(currentCompleted >= allocatorFence, "Allocator reset before GPU completed all command lists!"); } #endif } // Reset frame tracking frame.fenceValue = 0; frame.maxAllocatorFence = 0; frame.commandBufferCount = 0; } void FrameManager::clearTransientResources(uint32_t frameIndex) { auto& frame = context_.getFrameContexts()[frameIndex]; if (!frame.transientBuffers.empty()) { #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE( "FrameManager: Clearing %zu transient buffers from frame %u (high-water=%zu)\n", frame.transientBuffers.size(), frameIndex, frame.transientBuffersHighWater); #endif frame.transientBuffers.clear(); } if (!frame.transientResources.empty()) { #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE( "FrameManager: Releasing %zu transient D3D resources from frame %u (high-water=%zu)\n", frame.transientResources.size(), frameIndex, frame.transientResourcesHighWater); #endif frame.transientResources.clear(); } } void FrameManager::resetDescriptorCounters(uint32_t frameIndex) { auto& frame = context_.getFrameContexts()[frameIndex]; const uint32_t cbvSrvUavUsage = frame.nextCbvSrvUavDescriptor; const uint32_t samplerUsage = frame.nextSamplerDescriptor; const uint32_t peakCbvSrvUav = frame.peakCbvSrvUavUsage; const uint32_t peakSampler = frame.peakSamplerUsage; if (cbvSrvUavUsage > 0 || samplerUsage > 0) { #ifdef IGL_DEBUG const float cbvSrvUavPercent = (static_cast(cbvSrvUavUsage) / kCbvSrvUavHeapSize) * 100.0f; const float samplerPercent = (static_cast(samplerUsage) / kSamplerHeapSize) * 100.0f; const float peakCbvSrvUavPercent = (static_cast(peakCbvSrvUav) / kCbvSrvUavHeapSize) * 100.0f; const float peakSamplerPercent = (static_cast(peakSampler) / kSamplerHeapSize) * 100.0f; IGL_D3D12_LOG_VERBOSE( "FrameManager: Frame %u descriptor usage:\n" " CBV/SRV/UAV: final=%u/%u (%.1f%%), peak=%u/%u (%.1f%%)\n" " Samplers: final=%u/%u (%.1f%%), peak=%u/%u (%.1f%%)\n", frameIndex, cbvSrvUavUsage, kCbvSrvUavHeapSize, cbvSrvUavPercent, peakCbvSrvUav, kCbvSrvUavHeapSize, peakCbvSrvUavPercent, samplerUsage, kSamplerHeapSize, samplerPercent, peakSampler, kSamplerHeapSize, peakSamplerPercent); #endif } // Reset counters frame.nextCbvSrvUavDescriptor = 0; frame.nextSamplerDescriptor = 0; #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE("FrameManager: Reset descriptor counters for frame %u to 0\n", frameIndex); #endif } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/D3D12FrameManager.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::d3d12 { class D3D12Context; /** * @brief Manages frame advancement, fence waiting, and resource cleanup * * Centralizes the complex logic for: * - Waiting for next frame's resources to become available * - Pipeline overload protection (ensuring max frames in flight) * - Safe command allocator reset after GPU completion * - Transient resource cleanup * - Descriptor heap reset */ class FrameManager final { public: explicit FrameManager(D3D12Context& context) : context_(context) {} /** * @brief Advance to next frame with proper synchronization * * Handles: * 1. Calculate next frame index * 2. Wait for pipeline overload protection * 3. Wait for next frame's resources * 4. Update frame index * 5. Reset allocator safely * 6. Clear transient resources * 7. Reset descriptor counters * * @param currentFenceValue The fence value just signaled */ void advanceFrame(UINT64 currentFenceValue); private: /** * @brief Wait for pipeline to avoid overload (max frames in flight) */ void waitForPipelineSync(UINT64 currentFenceValue); /** * @brief Wait for specific frame's resources to become available * @return true if wait succeeded, false if catastrophic wait failure */ bool waitForFrame(uint32_t frameIndex); /** * @brief Safely reset command allocator after GPU completion */ void resetAllocator(uint32_t frameIndex); /** * @brief Clear transient resources from completed frame */ void clearTransientResources(uint32_t frameIndex); /** * @brief Log and reset descriptor usage counters */ void resetDescriptorCounters(uint32_t frameIndex); D3D12Context& context_; }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/D3D12Headers.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #ifndef IGL_D3D12_D3D12HEADERS_H #define IGL_D3D12_D3D12HEADERS_H // Windows headers #ifndef NOMINMAX #define NOMINMAX #endif // Don't use WIN32_LEAN_AND_MEAN - it excludes wrl/client.h #include // DirectX 12 headers #include #include // DirectX Shader Compiler #include // For D3DCompile (legacy HLSL compiler) #include // D3DX12 helper library (header-only) // Disable buggy helper classes that have preprocessor issues or require newer SDK #define D3DX12_NO_STATE_OBJECT_HELPERS #define D3DX12_NO_CHECK_FEATURE_SUPPORT_CLASS // Manually include only the d3dx12 headers we need (excluding incompatible ones) // These headers are vendored from Microsoft's DirectX-Headers repository #include #if defined(IGL_CMAKE_BUILD) #include #include #include #include #include #include #else #include #include #include #include #include // Excluded: d3dx12_resource_helpers.h (requires property_format_table.h which needs newer SDK) // Excluded: d3dx12_property_format_table.h (requires newer SDK) #include #endif // IGL_CMAKE_BUILD // ComPtr for COM object management // IGL's minimal ComPtr-like smart pointer implementing the subset of Microsoft::WRL::ComPtr // used by the D3D12 backend. We keep it custom to avoid preprocessor issues with . // // WARNING: Do not include before this header in the same translation unit. // Use igl::d3d12::ComPtr instead of Microsoft::WRL::ComPtr throughout the D3D12 backend. // (Including after this header is technically safe but unsupported.) // // Supported operations: Get, GetAddressOf, ReleaseAndGetAddressOf, Reset, Attach, Detach, // As, TryAs, CopyTo, comparison operators, bool conversion, move/copy semantics. // Operations NOT implemented: ComPtrRef, operator&, CopyTo(REFIID, void**), and other WRL // internals. // Compile-time guard: fail if was already included before this header #if defined(__WRL_CLIENT_H__) || defined(_WRL_CLIENT_H_) #error \ "D3D12Headers.h must be included before . The D3D12 backend uses igl::d3d12::ComPtr exclusively." #endif namespace igl { namespace d3d12 { template class ComPtr { public: ComPtr() noexcept : ptr_(nullptr) {} ComPtr(T* ptr) noexcept : ptr_(ptr) { if (ptr_) ptr_->AddRef(); } // Copy constructor - AddRef the pointer ComPtr(const ComPtr& other) noexcept : ptr_(other.ptr_) { if (ptr_) ptr_->AddRef(); } // Copy assignment - AddRef new, Release old ComPtr& operator=(const ComPtr& other) noexcept { if (this != &other) { if (other.ptr_) other.ptr_->AddRef(); if (ptr_) ptr_->Release(); ptr_ = other.ptr_; } return *this; } // Move constructor ComPtr(ComPtr&& other) noexcept : ptr_(other.ptr_) { other.ptr_ = nullptr; } // Move assignment ComPtr& operator=(ComPtr&& other) noexcept { if (this != &other) { if (ptr_) ptr_->Release(); ptr_ = other.ptr_; other.ptr_ = nullptr; } return *this; } // Destructor ~ComPtr() { if (ptr_) ptr_->Release(); } // Accessor methods T* Get() const noexcept { return ptr_; } T** GetAddressOf() noexcept { return &ptr_; } T* operator->() const noexcept { return ptr_; } // Dereference operator (caller must ensure ptr_ != nullptr) T& operator*() const noexcept { return *ptr_; } // Comparison operators (operator< compares raw addresses for use in containers) bool operator==(const ComPtr& other) const noexcept { return ptr_ == other.ptr_; } bool operator!=(const ComPtr& other) const noexcept { return ptr_ != other.ptr_; } bool operator<(const ComPtr& other) const noexcept { return ptr_ < other.ptr_; } bool operator==(T* other) const noexcept { return ptr_ == other; } bool operator!=(T* other) const noexcept { return ptr_ != other; } // Boolean conversion for nullptr checks explicit operator bool() const noexcept { return ptr_ != nullptr; } // Reset to release current pointer void Reset() noexcept { if (ptr_) { ptr_->Release(); ptr_ = nullptr; } } // Attach a raw pointer without AddRef void Attach(T* ptr) noexcept { if (ptr_) { ptr_->Release(); } ptr_ = ptr; } // Detach and return raw pointer without Release T* Detach() noexcept { T* temp = ptr_; ptr_ = nullptr; return temp; } // ReleaseAndGetAddressOf - release current and return address for output T** ReleaseAndGetAddressOf() noexcept { Reset(); return &ptr_; } // As() - QueryInterface to another interface type // Note: Unlike WRL's ComPtr::As, this implementation adds null-safety: // - Returns E_POINTER if 'other' is null // - Returns E_FAIL and resets 'other' if this->ptr_ is null (no object to query) // - Otherwise returns HRESULT from QueryInterface (S_OK or E_NOINTERFACE typically) // WRL assumes non-null and relies only on QueryInterface return value. // Rationale: Explicit null checks give more predictable behavior when pointers may be null. // Callers should treat any non-S_OK result uniformly as "interface query failed". template HRESULT As(ComPtr* other) const noexcept { if (!other) { return E_POINTER; } if (!ptr_) { other->Reset(); return E_FAIL; // No object to query } return ptr_->QueryInterface(__uuidof(U), reinterpret_cast(other->ReleaseAndGetAddressOf())); } // TryAs() - QueryInterface convenience method that returns ComPtr // WARNING: Silently drops HRESULT; returns empty ComPtr on failure. // For error-sensitive code, prefer the HRESULT-returning As(ComPtr* other) overload. // Use case: Optional interface queries where failure is expected/acceptable and doesn't need // diagnosis. In code paths that return igl::Result or log errors, prefer As() so you can // propagate the HRESULT. template ComPtr TryAs() const noexcept { ComPtr result; if (ptr_) { ptr_->QueryInterface(__uuidof(U), reinterpret_cast(result.ReleaseAndGetAddressOf())); } return result; } // CopyTo - Copy pointer with AddRef // Note: Returns S_OK even if ptr_ is null; *other will be set to nullptr (matches WRL) HRESULT CopyTo(T** other) const noexcept { if (!other) { return E_POINTER; } *other = ptr_; if (ptr_) { ptr_->AddRef(); } return S_OK; } private: T* ptr_; }; } // namespace d3d12 } // namespace igl // For convenience in D3D12 implementation files, you may add a local using declaration: // namespace { template using ComPtr = igl::d3d12::ComPtr; } // This reduces verbosity without polluting the global or igl::d3d12 namespace. namespace Microsoft { namespace WRL { // DO NOT define ComPtr here - it conflicts with // All D3D12 code should use igl::d3d12::ComPtr directly } // namespace WRL } // namespace Microsoft // Note: Library linking is handled by CMake (see src/igl/d3d12/CMakeLists.txt) // Required libraries: d3d12.lib, dxgi.lib, dxguid.lib, dxcompiler.lib, d3dcompiler.lib #endif // IGL_D3D12_D3D12HEADERS_H ================================================ FILE: src/igl/d3d12/D3D12ImmediateCommands.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include namespace igl::d3d12 { D3D12ImmediateCommands::D3D12ImmediateCommands(ID3D12Device* device, ID3D12CommandQueue* queue, ID3D12Fence* fence, IFenceProvider* fenceProvider) : device_(device), queue_(queue), fence_(fence), fenceProvider_(fenceProvider) { IGL_DEBUG_ASSERT(device_); IGL_DEBUG_ASSERT(queue_); IGL_DEBUG_ASSERT(fence_); IGL_DEBUG_ASSERT(fenceProvider_); IGL_D3D12_LOG_VERBOSE("D3D12ImmediateCommands: Initialized (using shared fence timeline)\n"); } D3D12ImmediateCommands::~D3D12ImmediateCommands() { // Wait for all in-flight operations to complete if (fence_) { for (const auto& entry : inFlightAllocators_) { if (fence_->GetCompletedValue() < entry.fenceValue) { FenceWaiter waiter(fence_, entry.fenceValue); Result waitResult = waiter.wait(); if (!waitResult.isOk()) { IGL_LOG_ERROR( "D3D12ImmediateCommands::~D3D12ImmediateCommands() - Fence wait failed during " "cleanup: %s\n", waitResult.message.c_str()); } } } } IGL_D3D12_LOG_VERBOSE("D3D12ImmediateCommands: Destroyed\n"); } ID3D12GraphicsCommandList* D3D12ImmediateCommands::begin(Result* outResult) { std::lock_guard lock(poolMutex_); // Reclaim completed allocators first reclaimCompletedAllocators(); // Get or create an allocator Result result = getOrCreateAllocator(¤tAllocator_); if (!result.isOk()) { Result::setResult(outResult, result); return nullptr; } // Reset the allocator for reuse HRESULT hr = currentAllocator_->Reset(); if (FAILED(hr)) { Result::setResult(outResult, Result{Result::Code::RuntimeError, "Failed to reset command allocator"}); return nullptr; } // Create or reset command list if (!cmdList_.Get()) { hr = device_->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, currentAllocator_.Get(), nullptr, IID_PPV_ARGS(cmdList_.GetAddressOf())); if (FAILED(hr)) { Result::setResult(outResult, Result{Result::Code::RuntimeError, "Failed to create command list"}); return nullptr; } } else { hr = cmdList_->Reset(currentAllocator_.Get(), nullptr); if (FAILED(hr)) { Result::setResult(outResult, Result{Result::Code::RuntimeError, "Failed to reset command list"}); return nullptr; } } Result::setOk(outResult); return cmdList_.Get(); } uint64_t D3D12ImmediateCommands::submit(bool wait, Result* outResult) { if (!cmdList_.Get()) { Result::setResult(outResult, Result{Result::Code::RuntimeError, "No active command list"}); return 0; } // Close the command list HRESULT hr = cmdList_->Close(); if (FAILED(hr)) { Result::setResult(outResult, Result{Result::Code::RuntimeError, "Failed to close command list"}); return 0; } // Execute command list ID3D12CommandList* lists[] = {cmdList_.Get()}; queue_->ExecuteCommandLists(1, lists); // Get next fence value from shared timeline const uint64_t fenceValue = fenceProvider_->getNextFenceValue(); // Signal fence on shared timeline hr = queue_->Signal(fence_, fenceValue); if (FAILED(hr)) { Result::setResult(outResult, Result{Result::Code::RuntimeError, "Failed to signal fence"}); return 0; } // Move current allocator to in-flight list { std::lock_guard lock(poolMutex_); inFlightAllocators_.push_back({currentAllocator_, fenceValue}); currentAllocator_.Reset(); } // Wait if requested if (wait) { Result waitResult = waitForFence(fenceValue); if (!waitResult.isOk()) { Result::setResult(outResult, waitResult); return 0; // Return 0 to signal failure } } Result::setOk(outResult); return fenceValue; } bool D3D12ImmediateCommands::isComplete(uint64_t fenceValue) const { if (!fence_) { return false; } return fence_->GetCompletedValue() >= fenceValue; } Result D3D12ImmediateCommands::waitForFence(uint64_t fenceValue) { if (!fence_) { return Result{Result::Code::RuntimeError, "Fence is null"}; } if (isComplete(fenceValue)) { return Result{}; } FenceWaiter waiter(fence_, fenceValue); return waiter.wait(); // Directly return the detailed Result } void D3D12ImmediateCommands::reclaimCompletedAllocators() { // Note: Internal helper called by begin() with poolMutex_ already held if (!fence_) { return; } const uint64_t completedValue = fence_->GetCompletedValue(); // Move completed allocators from in-flight to available auto it = inFlightAllocators_.begin(); while (it != inFlightAllocators_.end()) { if (it->fenceValue <= completedValue) { availableAllocators_.push_back({it->allocator, 0}); it = inFlightAllocators_.erase(it); } else { ++it; } } } Result D3D12ImmediateCommands::getOrCreateAllocator( igl::d3d12::ComPtr* outAllocator) { // Try to reuse an available allocator if (!availableAllocators_.empty()) { *outAllocator = availableAllocators_.back().allocator; availableAllocators_.pop_back(); return Result{}; } // Create new allocator HRESULT hr = device_->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(outAllocator->GetAddressOf())); if (FAILED(hr)) { return Result{Result::Code::RuntimeError, "Failed to create command allocator"}; } IGL_D3D12_LOG_VERBOSE("D3D12ImmediateCommands: Created new command allocator (pool size: %zu)\n", availableAllocators_.size() + inFlightAllocators_.size() + 1); return Result{}; } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/D3D12ImmediateCommands.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include namespace igl::d3d12 { /** * @brief Interface for obtaining fence values from shared timeline * * This interface allows D3D12ImmediateCommands to participate in the * device's shared fence timeline without managing its own counter. */ class IFenceProvider { public: virtual ~IFenceProvider() = default; /** * @brief Get the next fence value from the shared timeline * @return Monotonically increasing fence value */ virtual uint64_t getNextFenceValue() = 0; }; /** * @brief Centralized management of immediate copy operations * * Provides a pooled command allocator/list infrastructure for transient * upload/readback operations, eliminating per-operation allocator creation * and redundant GPU synchronization. * * Thread-safety: This class is NOT thread-safe for concurrent begin()/submit(). * Only one begin()/submit() sequence may be active at a time. Multiple threads * calling begin() concurrently will corrupt the shared command list. * * The allocator pool (reclaimCompletedAllocators) is internally synchronized. * * Inspired by Vulkan's VulkanImmediateCommands pattern. */ class D3D12ImmediateCommands { public: /** * @brief Initialize the immediate commands infrastructure * @param device D3D12 device for resource creation * @param queue Command queue for submission * @param fence Fence for completion tracking (shared with device) * @param fenceProvider Provider for next fence values from shared timeline */ D3D12ImmediateCommands(ID3D12Device* device, ID3D12CommandQueue* queue, ID3D12Fence* fence, IFenceProvider* fenceProvider); ~D3D12ImmediateCommands(); /** * @brief Get command list for immediate copy operation * * Returns a ready-to-use command list from the pool. The command list * is already reset and ready for recording. * * @param outResult Optional result for error reporting * @return Command list ready for recording, or nullptr on failure */ [[nodiscard]] ID3D12GraphicsCommandList* begin(Result* outResult = nullptr); /** * @brief Submit command list and optionally wait for completion * * Closes, submits, and signals the fence. If wait=true, blocks until * GPU completes the work. * * @param wait If true, block until GPU completes * @param outResult Optional result for error reporting * @return Fence value that will signal when work completes (0 on failure) */ [[nodiscard]] uint64_t submit(bool wait, Result* outResult = nullptr); /** * @brief Check if a fence value has completed * @param fenceValue Fence value to check * @return true if GPU has completed this fence value */ [[nodiscard]] bool isComplete(uint64_t fenceValue) const; /** * @brief Wait for a specific fence value to complete * @param fenceValue Fence value to wait for * @return Result indicating success or failure */ [[nodiscard]] Result waitForFence(uint64_t fenceValue); private: /** * @brief Reclaim completed command allocators back to pool * * Internal method called during begin() to recycle allocators. * Must be called with poolMutex_ held. */ void reclaimCompletedAllocators(); struct AllocatorEntry { igl::d3d12::ComPtr allocator; uint64_t fenceValue = 0; // Fence value when this allocator was last used }; ID3D12Device* device_ = nullptr; ID3D12CommandQueue* queue_ = nullptr; ID3D12Fence* fence_ = nullptr; // Shared fence (owned by Device) IFenceProvider* fenceProvider_ = nullptr; // Provides fence values from shared timeline // Current command list for recording igl::d3d12::ComPtr cmdList_; // Current allocator being used igl::d3d12::ComPtr currentAllocator_; // Pool of available allocators std::vector availableAllocators_; // Allocators in flight (waiting for GPU) std::vector inFlightAllocators_; // Mutex for thread-safe allocator pool access std::mutex poolMutex_; // Get or create an allocator from the pool [[nodiscard]] Result getOrCreateAllocator( igl::d3d12::ComPtr* outAllocator); }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/D3D12PipelineBuilder.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace igl::d3d12 { namespace { // Helper function to calculate root signature size in DWORDs uint32_t getRootSignatureDwordSize(const D3D12_ROOT_SIGNATURE_DESC& desc) { uint32_t totalSize = 0; for (uint32_t i = 0; i < desc.NumParameters; ++i) { const auto& param = desc.pParameters[i]; switch (param.ParameterType) { case D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS: totalSize += param.Constants.Num32BitValues; break; case D3D12_ROOT_PARAMETER_TYPE_CBV: case D3D12_ROOT_PARAMETER_TYPE_SRV: case D3D12_ROOT_PARAMETER_TYPE_UAV: totalSize += 2; // Root descriptors cost 2 DWORDs break; case D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE: totalSize += 1; // Descriptor tables cost 1 DWORD break; } } return totalSize; } // Helper to convert IGL blend factor to D3D12 D3D12_BLEND toD3D12Blend(BlendFactor f) { switch (f) { case BlendFactor::Zero: return D3D12_BLEND_ZERO; case BlendFactor::One: return D3D12_BLEND_ONE; case BlendFactor::SrcColor: return D3D12_BLEND_SRC_COLOR; case BlendFactor::OneMinusSrcColor: return D3D12_BLEND_INV_SRC_COLOR; case BlendFactor::SrcAlpha: return D3D12_BLEND_SRC_ALPHA; case BlendFactor::OneMinusSrcAlpha: return D3D12_BLEND_INV_SRC_ALPHA; case BlendFactor::DstColor: return D3D12_BLEND_DEST_COLOR; case BlendFactor::OneMinusDstColor: return D3D12_BLEND_INV_DEST_COLOR; case BlendFactor::DstAlpha: return D3D12_BLEND_DEST_ALPHA; case BlendFactor::OneMinusDstAlpha: return D3D12_BLEND_INV_DEST_ALPHA; case BlendFactor::SrcAlphaSaturated: return D3D12_BLEND_SRC_ALPHA_SAT; case BlendFactor::BlendColor: return D3D12_BLEND_BLEND_FACTOR; case BlendFactor::OneMinusBlendColor: return D3D12_BLEND_INV_BLEND_FACTOR; case BlendFactor::BlendAlpha: return D3D12_BLEND_BLEND_FACTOR; case BlendFactor::OneMinusBlendAlpha: return D3D12_BLEND_INV_BLEND_FACTOR; case BlendFactor::Src1Color: return D3D12_BLEND_SRC1_COLOR; case BlendFactor::OneMinusSrc1Color: return D3D12_BLEND_INV_SRC1_COLOR; case BlendFactor::Src1Alpha: return D3D12_BLEND_SRC1_ALPHA; case BlendFactor::OneMinusSrc1Alpha: return D3D12_BLEND_INV_SRC1_ALPHA; default: return D3D12_BLEND_ONE; } } // Helper to convert IGL blend operation to D3D12 D3D12_BLEND_OP toD3D12BlendOp(BlendOp op) { switch (op) { case BlendOp::Add: return D3D12_BLEND_OP_ADD; case BlendOp::Subtract: return D3D12_BLEND_OP_SUBTRACT; case BlendOp::ReverseSubtract: return D3D12_BLEND_OP_REV_SUBTRACT; case BlendOp::Min: return D3D12_BLEND_OP_MIN; case BlendOp::Max: return D3D12_BLEND_OP_MAX; default: return D3D12_BLEND_OP_ADD; } } } // anonymous namespace //============================================================================= // D3D12GraphicsPipelineBuilder //============================================================================= D3D12GraphicsPipelineBuilder::D3D12GraphicsPipelineBuilder() { // Zero-initialize the descriptor psoDesc_ = {}; // Set sensible defaults for rasterizer state psoDesc_.RasterizerState.FillMode = D3D12_FILL_MODE_SOLID; psoDesc_.RasterizerState.CullMode = D3D12_CULL_MODE_BACK; psoDesc_.RasterizerState.FrontCounterClockwise = FALSE; psoDesc_.RasterizerState.DepthBias = 0; psoDesc_.RasterizerState.DepthBiasClamp = 0.0f; psoDesc_.RasterizerState.SlopeScaledDepthBias = 0.0f; psoDesc_.RasterizerState.DepthClipEnable = TRUE; psoDesc_.RasterizerState.MultisampleEnable = FALSE; psoDesc_.RasterizerState.AntialiasedLineEnable = FALSE; psoDesc_.RasterizerState.ForcedSampleCount = 0; psoDesc_.RasterizerState.ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF; // Set sensible defaults for blend state psoDesc_.BlendState.AlphaToCoverageEnable = FALSE; psoDesc_.BlendState.IndependentBlendEnable = FALSE; for (UINT i = 0; i < D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i) { psoDesc_.BlendState.RenderTarget[i].BlendEnable = FALSE; psoDesc_.BlendState.RenderTarget[i].LogicOpEnable = FALSE; psoDesc_.BlendState.RenderTarget[i].SrcBlend = D3D12_BLEND_ONE; psoDesc_.BlendState.RenderTarget[i].DestBlend = D3D12_BLEND_ZERO; psoDesc_.BlendState.RenderTarget[i].BlendOp = D3D12_BLEND_OP_ADD; psoDesc_.BlendState.RenderTarget[i].SrcBlendAlpha = D3D12_BLEND_ONE; psoDesc_.BlendState.RenderTarget[i].DestBlendAlpha = D3D12_BLEND_ZERO; psoDesc_.BlendState.RenderTarget[i].BlendOpAlpha = D3D12_BLEND_OP_ADD; psoDesc_.BlendState.RenderTarget[i].LogicOp = D3D12_LOGIC_OP_NOOP; psoDesc_.BlendState.RenderTarget[i].RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL; } // Set sensible defaults for depth-stencil state psoDesc_.DepthStencilState.DepthEnable = FALSE; psoDesc_.DepthStencilState.DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ALL; psoDesc_.DepthStencilState.DepthFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL; psoDesc_.DepthStencilState.StencilEnable = FALSE; psoDesc_.DepthStencilState.StencilReadMask = D3D12_DEFAULT_STENCIL_READ_MASK; psoDesc_.DepthStencilState.StencilWriteMask = D3D12_DEFAULT_STENCIL_WRITE_MASK; psoDesc_.DepthStencilState.FrontFace.StencilFailOp = D3D12_STENCIL_OP_KEEP; psoDesc_.DepthStencilState.FrontFace.StencilDepthFailOp = D3D12_STENCIL_OP_KEEP; psoDesc_.DepthStencilState.FrontFace.StencilPassOp = D3D12_STENCIL_OP_KEEP; psoDesc_.DepthStencilState.FrontFace.StencilFunc = D3D12_COMPARISON_FUNC_ALWAYS; psoDesc_.DepthStencilState.BackFace = psoDesc_.DepthStencilState.FrontFace; // Defaults for other fields psoDesc_.SampleMask = UINT_MAX; psoDesc_.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; psoDesc_.NumRenderTargets = 1; psoDesc_.RTVFormats[0] = DXGI_FORMAT_R8G8B8A8_UNORM; psoDesc_.DSVFormat = DXGI_FORMAT_UNKNOWN; psoDesc_.SampleDesc.Count = 1; psoDesc_.SampleDesc.Quality = 0; psoDesc_.NodeMask = 0; psoDesc_.CachedPSO.pCachedBlob = nullptr; psoDesc_.CachedPSO.CachedBlobSizeInBytes = 0; psoDesc_.Flags = D3D12_PIPELINE_STATE_FLAG_NONE; } D3D12GraphicsPipelineBuilder& D3D12GraphicsPipelineBuilder::vertexShader( const std::vector& bytecode) { vsBytecode_ = bytecode; psoDesc_.VS = {vsBytecode_.data(), vsBytecode_.size()}; return *this; } D3D12GraphicsPipelineBuilder& D3D12GraphicsPipelineBuilder::pixelShader( const std::vector& bytecode) { psBytecode_ = bytecode; psoDesc_.PS = {psBytecode_.data(), psBytecode_.size()}; return *this; } D3D12GraphicsPipelineBuilder& D3D12GraphicsPipelineBuilder::shaderBytecode( const std::vector& vs, const std::vector& ps) { return vertexShader(vs).pixelShader(ps); } D3D12GraphicsPipelineBuilder& D3D12GraphicsPipelineBuilder::vertexInputLayout( const std::vector& elements) { inputElements_ = elements; psoDesc_.InputLayout = {inputElements_.data(), static_cast(inputElements_.size())}; return *this; } D3D12GraphicsPipelineBuilder& D3D12GraphicsPipelineBuilder::blendState( const D3D12_BLEND_DESC& desc) { psoDesc_.BlendState = desc; return *this; } D3D12GraphicsPipelineBuilder& D3D12GraphicsPipelineBuilder::blendStateForAttachment( UINT attachmentIndex, const RenderPipelineDesc::TargetDesc::ColorAttachment& attachment) { if (attachmentIndex >= D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT) { return *this; } // Enable independent blending when configuring attachments beyond RT0 if (attachmentIndex > 0) { psoDesc_.BlendState.IndependentBlendEnable = TRUE; } auto& rt = psoDesc_.BlendState.RenderTarget[attachmentIndex]; rt.BlendEnable = attachment.blendEnabled ? TRUE : FALSE; rt.SrcBlend = toD3D12Blend(attachment.srcRGBBlendFactor); rt.DestBlend = toD3D12Blend(attachment.dstRGBBlendFactor); rt.BlendOp = toD3D12BlendOp(attachment.rgbBlendOp); rt.SrcBlendAlpha = toD3D12Blend(attachment.srcAlphaBlendFactor); rt.DestBlendAlpha = toD3D12Blend(attachment.dstAlphaBlendFactor); rt.BlendOpAlpha = toD3D12BlendOp(attachment.alphaBlendOp); // Convert IGL color write mask to D3D12 UINT8 writeMask = 0; if (attachment.colorWriteMask & igl::kColorWriteBitsRed) { writeMask |= D3D12_COLOR_WRITE_ENABLE_RED; } if (attachment.colorWriteMask & igl::kColorWriteBitsGreen) { writeMask |= D3D12_COLOR_WRITE_ENABLE_GREEN; } if (attachment.colorWriteMask & igl::kColorWriteBitsBlue) { writeMask |= D3D12_COLOR_WRITE_ENABLE_BLUE; } if (attachment.colorWriteMask & igl::kColorWriteBitsAlpha) { writeMask |= D3D12_COLOR_WRITE_ENABLE_ALPHA; } rt.RenderTargetWriteMask = writeMask; return *this; } D3D12GraphicsPipelineBuilder& D3D12GraphicsPipelineBuilder::rasterizerState( const D3D12_RASTERIZER_DESC& desc) { psoDesc_.RasterizerState = desc; return *this; } D3D12GraphicsPipelineBuilder& D3D12GraphicsPipelineBuilder::cullMode(CullMode mode) { switch (mode) { case CullMode::Back: psoDesc_.RasterizerState.CullMode = D3D12_CULL_MODE_BACK; break; case CullMode::Front: psoDesc_.RasterizerState.CullMode = D3D12_CULL_MODE_FRONT; break; case CullMode::Disabled: default: psoDesc_.RasterizerState.CullMode = D3D12_CULL_MODE_NONE; break; } return *this; } D3D12GraphicsPipelineBuilder& D3D12GraphicsPipelineBuilder::frontFaceWinding(WindingMode mode) { psoDesc_.RasterizerState.FrontCounterClockwise = (mode == WindingMode::CounterClockwise) ? TRUE : FALSE; return *this; } D3D12GraphicsPipelineBuilder& D3D12GraphicsPipelineBuilder::polygonFillMode(PolygonFillMode mode) { psoDesc_.RasterizerState.FillMode = (mode == PolygonFillMode::Line) ? D3D12_FILL_MODE_WIREFRAME : D3D12_FILL_MODE_SOLID; return *this; } D3D12GraphicsPipelineBuilder& D3D12GraphicsPipelineBuilder::depthStencilState( const D3D12_DEPTH_STENCIL_DESC& desc) { psoDesc_.DepthStencilState = desc; return *this; } D3D12GraphicsPipelineBuilder& D3D12GraphicsPipelineBuilder::depthTestEnabled(bool enabled) { psoDesc_.DepthStencilState.DepthEnable = enabled ? TRUE : FALSE; return *this; } D3D12GraphicsPipelineBuilder& D3D12GraphicsPipelineBuilder::depthWriteEnabled(bool enabled) { psoDesc_.DepthStencilState.DepthWriteMask = enabled ? D3D12_DEPTH_WRITE_MASK_ALL : D3D12_DEPTH_WRITE_MASK_ZERO; return *this; } D3D12GraphicsPipelineBuilder& D3D12GraphicsPipelineBuilder::depthCompareFunc( D3D12_COMPARISON_FUNC func) { psoDesc_.DepthStencilState.DepthFunc = func; return *this; } D3D12GraphicsPipelineBuilder& D3D12GraphicsPipelineBuilder::renderTargetFormat(UINT index, DXGI_FORMAT format) { if (index < D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT) { psoDesc_.RTVFormats[index] = format; // Auto-update NumRenderTargets to include this slot if (index + 1 > psoDesc_.NumRenderTargets) { psoDesc_.NumRenderTargets = index + 1; // Enable independent blending when using multiple render targets psoDesc_.BlendState.IndependentBlendEnable = (psoDesc_.NumRenderTargets > 1) ? TRUE : FALSE; } } return *this; } D3D12GraphicsPipelineBuilder& D3D12GraphicsPipelineBuilder::renderTargetFormats( const std::vector& formats) { const UINT count = static_cast(std::min(formats.size(), D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT)); psoDesc_.NumRenderTargets = count; // Enable independent blending when using multiple render targets psoDesc_.BlendState.IndependentBlendEnable = (count > 1) ? TRUE : FALSE; for (UINT i = 0; i < count; ++i) { psoDesc_.RTVFormats[i] = formats[i]; } return *this; } D3D12GraphicsPipelineBuilder& D3D12GraphicsPipelineBuilder::depthStencilFormat(DXGI_FORMAT format) { psoDesc_.DSVFormat = format; return *this; } D3D12GraphicsPipelineBuilder& D3D12GraphicsPipelineBuilder::numRenderTargets(UINT count) { const UINT clamped = std::min(count, static_cast(D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT)); psoDesc_.NumRenderTargets = clamped; // Enable independent blending when using multiple render targets psoDesc_.BlendState.IndependentBlendEnable = (clamped > 1) ? TRUE : FALSE; return *this; } D3D12GraphicsPipelineBuilder& D3D12GraphicsPipelineBuilder::sampleCount(UINT count) { psoDesc_.SampleDesc.Count = count; psoDesc_.RasterizerState.MultisampleEnable = (count > 1) ? TRUE : FALSE; return *this; } D3D12GraphicsPipelineBuilder& D3D12GraphicsPipelineBuilder::sampleMask(UINT mask) { psoDesc_.SampleMask = mask; return *this; } D3D12GraphicsPipelineBuilder& D3D12GraphicsPipelineBuilder::primitiveTopologyType( D3D12_PRIMITIVE_TOPOLOGY_TYPE type) { psoDesc_.PrimitiveTopologyType = type; return *this; } D3D12GraphicsPipelineBuilder& D3D12GraphicsPipelineBuilder::streamOutput( const D3D12_STREAM_OUTPUT_DESC& desc) { psoDesc_.StreamOutput = desc; return *this; } Result D3D12GraphicsPipelineBuilder::build(ID3D12Device* device, ID3D12RootSignature* rootSignature, ID3D12PipelineState** outPipelineState, const char* debugName) { if (!device) { return Result(Result::Code::ArgumentNull, "Device is null"); } if (!rootSignature) { return Result(Result::Code::ArgumentNull, "Root signature is null"); } if (!outPipelineState) { return Result(Result::Code::ArgumentNull, "Output pipeline state is null"); } // Initialize output to null for safety *outPipelineState = nullptr; // Validate shader bytecode if (psoDesc_.VS.BytecodeLength == 0) { return Result(Result::Code::ArgumentInvalid, "Vertex shader bytecode is required"); } if (psoDesc_.PS.BytecodeLength == 0) { return Result(Result::Code::ArgumentInvalid, "Pixel shader bytecode is required"); } // Set root signature psoDesc_.pRootSignature = rootSignature; // Create pipeline state igl::d3d12::ComPtr pipelineState; HRESULT hr = device->CreateGraphicsPipelineState(&psoDesc_, IID_PPV_ARGS(pipelineState.GetAddressOf())); if (FAILED(hr)) { char errorMsg[512]; snprintf(errorMsg, sizeof(errorMsg), "Failed to create graphics pipeline state. HRESULT: 0x%08X", static_cast(hr)); return Result(Result::Code::RuntimeError, errorMsg); } // Set debug name if provided if (debugName && debugName[0] != '\0') { std::wstring wideName(debugName, debugName + strlen(debugName)); pipelineState->SetName(wideName.c_str()); } *outPipelineState = pipelineState.Get(); pipelineState->AddRef(); // Transfer ownership return Result(); } //============================================================================= // D3D12ComputePipelineBuilder //============================================================================= D3D12ComputePipelineBuilder::D3D12ComputePipelineBuilder() { // Zero-initialize the descriptor psoDesc_ = {}; psoDesc_.NodeMask = 0; psoDesc_.CachedPSO.pCachedBlob = nullptr; psoDesc_.CachedPSO.CachedBlobSizeInBytes = 0; psoDesc_.Flags = D3D12_PIPELINE_STATE_FLAG_NONE; } D3D12ComputePipelineBuilder& D3D12ComputePipelineBuilder::shaderBytecode( const std::vector& bytecode) { csBytecode_ = bytecode; psoDesc_.CS.pShaderBytecode = csBytecode_.data(); psoDesc_.CS.BytecodeLength = csBytecode_.size(); return *this; } Result D3D12ComputePipelineBuilder::build(ID3D12Device* device, ID3D12RootSignature* rootSignature, ID3D12PipelineState** outPipelineState, const char* debugName) { if (!device) { return Result(Result::Code::ArgumentNull, "Device is null"); } if (!rootSignature) { return Result(Result::Code::ArgumentNull, "Root signature is null"); } if (!outPipelineState) { return Result(Result::Code::ArgumentNull, "Output pipeline state is null"); } // Initialize output to null for safety *outPipelineState = nullptr; // Validate shader bytecode if (psoDesc_.CS.BytecodeLength == 0) { return Result(Result::Code::ArgumentInvalid, "Compute shader bytecode is required"); } // Set root signature psoDesc_.pRootSignature = rootSignature; // Create pipeline state igl::d3d12::ComPtr pipelineState; HRESULT hr = device->CreateComputePipelineState(&psoDesc_, IID_PPV_ARGS(pipelineState.GetAddressOf())); if (FAILED(hr)) { char errorMsg[512]; snprintf(errorMsg, sizeof(errorMsg), "Failed to create compute pipeline state. HRESULT: 0x%08X", static_cast(hr)); return Result(Result::Code::RuntimeError, errorMsg); } // Set debug name if provided if (debugName && debugName[0] != '\0') { std::wstring wideName(debugName, debugName + strlen(debugName)); pipelineState->SetName(wideName.c_str()); } *outPipelineState = pipelineState.Get(); pipelineState->AddRef(); // Transfer ownership return Result(); } //============================================================================= // D3D12RootSignatureBuilder //============================================================================= D3D12RootSignatureBuilder::D3D12RootSignatureBuilder() { flags_ = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT; } D3D12RootSignatureBuilder& D3D12RootSignatureBuilder::addRootConstants(UINT shaderRegister, UINT num32BitValues, UINT registerSpace) { RootParameter param{}; // Zero-initialize param.param.ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS; param.param.Constants.ShaderRegister = shaderRegister; param.param.Constants.RegisterSpace = registerSpace; param.param.Constants.Num32BitValues = num32BitValues; param.param.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL; rootParameters_.push_back(param); return *this; } D3D12RootSignatureBuilder& D3D12RootSignatureBuilder::addRootCBV(UINT shaderRegister, UINT registerSpace) { RootParameter param{}; // Zero-initialize param.param.ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV; param.param.Descriptor.ShaderRegister = shaderRegister; param.param.Descriptor.RegisterSpace = registerSpace; param.param.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL; rootParameters_.push_back(param); return *this; } D3D12RootSignatureBuilder& D3D12RootSignatureBuilder::addRootSRV(UINT shaderRegister, UINT registerSpace) { RootParameter param{}; // Zero-initialize param.param.ParameterType = D3D12_ROOT_PARAMETER_TYPE_SRV; param.param.Descriptor.ShaderRegister = shaderRegister; param.param.Descriptor.RegisterSpace = registerSpace; param.param.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL; rootParameters_.push_back(param); return *this; } D3D12RootSignatureBuilder& D3D12RootSignatureBuilder::addRootUAV(UINT shaderRegister, UINT registerSpace) { RootParameter param{}; // Zero-initialize param.param.ParameterType = D3D12_ROOT_PARAMETER_TYPE_UAV; param.param.Descriptor.ShaderRegister = shaderRegister; param.param.Descriptor.RegisterSpace = registerSpace; param.param.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL; rootParameters_.push_back(param); return *this; } D3D12RootSignatureBuilder& D3D12RootSignatureBuilder::addDescriptorTable( D3D12_DESCRIPTOR_RANGE_TYPE rangeType, UINT numDescriptors, UINT baseShaderRegister, UINT registerSpace) { RootParameter param{}; // Zero-initialize param.param.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE; param.param.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL; // Create descriptor range DescriptorRange range; range.range.RangeType = rangeType; range.range.NumDescriptors = numDescriptors; range.range.BaseShaderRegister = baseShaderRegister; range.range.RegisterSpace = registerSpace; range.range.OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND; param.ranges.push_back(range); rootParameters_.push_back(param); return *this; } D3D12RootSignatureBuilder& D3D12RootSignatureBuilder::flags(D3D12_ROOT_SIGNATURE_FLAGS flags) { flags_ = flags; return *this; } Result D3D12RootSignatureBuilder::build(ID3D12Device* device, const D3D12Context* context, ID3D12RootSignature** outRootSignature) { if (!device) { return Result(Result::Code::ArgumentNull, "Device is null"); } if (!outRootSignature) { return Result(Result::Code::ArgumentNull, "Output root signature is null"); } // Initialize output to null for safety *outRootSignature = nullptr; // Build arrays of D3D12_ROOT_PARAMETER and descriptor ranges std::vector d3d12Params; std::vector> allRanges; d3d12Params.reserve(rootParameters_.size()); allRanges.reserve(rootParameters_.size()); for (auto& param : rootParameters_) { if (param.param.ParameterType == D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE) { // Store ranges for this table std::vector ranges; ranges.reserve(param.ranges.size()); for (auto& r : param.ranges) { D3D12_DESCRIPTOR_RANGE range = r.range; if (context) { const UINT maxCount = getMaxDescriptorCount(context, range.RangeType); if (range.NumDescriptors == UINT_MAX || range.NumDescriptors > maxCount) { range.NumDescriptors = maxCount; } } ranges.push_back(range); } allRanges.push_back(std::move(ranges)); // Update descriptor table to point to the ranges D3D12_ROOT_PARAMETER d3d12Param = param.param; d3d12Param.DescriptorTable.NumDescriptorRanges = static_cast(allRanges.back().size()); d3d12Param.DescriptorTable.pDescriptorRanges = allRanges.back().data(); d3d12Params.push_back(d3d12Param); } else { // Not a descriptor table, just copy d3d12Params.push_back(param.param); } } // Build root signature descriptor D3D12_ROOT_SIGNATURE_DESC rootSigDesc = {}; rootSigDesc.NumParameters = static_cast(d3d12Params.size()); rootSigDesc.pParameters = d3d12Params.data(); rootSigDesc.NumStaticSamplers = 0; rootSigDesc.pStaticSamplers = nullptr; rootSigDesc.Flags = flags_; // Validate size (64 DWORD limit) const uint32_t size = getRootSignatureDwordSize(rootSigDesc); if (size > 64) { char errorMsg[256]; snprintf( errorMsg, sizeof(errorMsg), "Root signature size exceeds 64 DWORD limit: %u DWORDs", size); return Result(Result::Code::ArgumentOutOfRange, errorMsg); } // Serialize root signature igl::d3d12::ComPtr signature; igl::d3d12::ComPtr error; HRESULT hr = D3D12SerializeRootSignature( &rootSigDesc, D3D_ROOT_SIGNATURE_VERSION_1, signature.GetAddressOf(), error.GetAddressOf()); if (FAILED(hr)) { const char* errorStr = error.Get() ? static_cast(error->GetBufferPointer()) : "Unknown error"; char errorMsg[512]; snprintf(errorMsg, sizeof(errorMsg), "Failed to serialize root signature. HRESULT: 0x%08X, Error: %s", static_cast(hr), errorStr); return Result(Result::Code::RuntimeError, errorMsg); } // Create root signature igl::d3d12::ComPtr rootSignature; hr = device->CreateRootSignature(0, signature->GetBufferPointer(), signature->GetBufferSize(), IID_PPV_ARGS(rootSignature.GetAddressOf())); if (FAILED(hr)) { char errorMsg[256]; snprintf(errorMsg, sizeof(errorMsg), "Failed to create root signature. HRESULT: 0x%08X", static_cast(hr)); return Result(Result::Code::RuntimeError, errorMsg); } *outRootSignature = rootSignature.Get(); rootSignature->AddRef(); // Transfer ownership return Result(); } UINT D3D12RootSignatureBuilder::getMaxDescriptorCount(const D3D12Context* context, D3D12_DESCRIPTOR_RANGE_TYPE rangeType) { if (!context) { return 128; // Conservative default } const D3D12_RESOURCE_BINDING_TIER bindingTier = context->getResourceBindingTier(); const bool needsBoundedRanges = (bindingTier == D3D12_RESOURCE_BINDING_TIER_1); if (!needsBoundedRanges) { return UINT_MAX; // Unbounded } // Conservative bounds for Tier 1 devices switch (rangeType) { case D3D12_DESCRIPTOR_RANGE_TYPE_SRV: return 128; case D3D12_DESCRIPTOR_RANGE_TYPE_UAV: return 64; case D3D12_DESCRIPTOR_RANGE_TYPE_CBV: return 64; case D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER: return 32; default: return 128; } } uint32_t D3D12RootSignatureBuilder::getDwordSize() const { // Build temporary descriptor for cost calculation std::vector d3d12Params; std::vector> allRanges; d3d12Params.reserve(rootParameters_.size()); allRanges.reserve(rootParameters_.size()); for (const auto& param : rootParameters_) { if (param.param.ParameterType == D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE) { std::vector ranges; ranges.reserve(param.ranges.size()); for (const auto& r : param.ranges) { ranges.push_back(r.range); } allRanges.push_back(std::move(ranges)); D3D12_ROOT_PARAMETER d3d12Param = param.param; d3d12Param.DescriptorTable.NumDescriptorRanges = static_cast(allRanges.back().size()); d3d12Param.DescriptorTable.pDescriptorRanges = allRanges.back().data(); d3d12Params.push_back(d3d12Param); } else { d3d12Params.push_back(param.param); } } D3D12_ROOT_SIGNATURE_DESC rootSigDesc = {}; rootSigDesc.NumParameters = static_cast(d3d12Params.size()); rootSigDesc.pParameters = d3d12Params.data(); rootSigDesc.NumStaticSamplers = 0; rootSigDesc.pStaticSamplers = nullptr; rootSigDesc.Flags = flags_; return getRootSignatureDwordSize(rootSigDesc); } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/D3D12PipelineBuilder.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::d3d12 { class D3D12Context; /** * @brief Fluent builder for D3D12 graphics pipeline state objects * * Encapsulates the complex setup of D3D12_GRAPHICS_PIPELINE_STATE_DESC * and provides a clean, chainable API similar to VulkanPipelineBuilder. * * Usage: * D3D12GraphicsPipelineBuilder builder; * builder.shaderBytecode(vsBytecode, psBytecode) * .vertexInputLayout(inputElements) * .blendState(blendDesc) * .rasterizerState(rasterizerDesc) * .depthStencilState(depthStencilDesc) * .renderTargetFormats(rtvFormats) * .sampleCount(sampleCount) * .primitiveTopology(topology); * auto result = builder.build(device, rootSignature, outPipelineState); */ class D3D12GraphicsPipelineBuilder final { public: D3D12GraphicsPipelineBuilder(); ~D3D12GraphicsPipelineBuilder() = default; // Shader configuration D3D12GraphicsPipelineBuilder& vertexShader(const std::vector& bytecode); D3D12GraphicsPipelineBuilder& pixelShader(const std::vector& bytecode); D3D12GraphicsPipelineBuilder& shaderBytecode(const std::vector& vs, const std::vector& ps); // Vertex input layout D3D12GraphicsPipelineBuilder& vertexInputLayout( const std::vector& elements); // Blend state D3D12GraphicsPipelineBuilder& blendState(const D3D12_BLEND_DESC& desc); D3D12GraphicsPipelineBuilder& blendStateForAttachment( UINT attachmentIndex, const RenderPipelineDesc::TargetDesc::ColorAttachment& attachment); // Rasterizer state D3D12GraphicsPipelineBuilder& rasterizerState(const D3D12_RASTERIZER_DESC& desc); D3D12GraphicsPipelineBuilder& cullMode(CullMode mode); D3D12GraphicsPipelineBuilder& frontFaceWinding(WindingMode mode); D3D12GraphicsPipelineBuilder& polygonFillMode(PolygonFillMode mode); // Depth-stencil state D3D12GraphicsPipelineBuilder& depthStencilState(const D3D12_DEPTH_STENCIL_DESC& desc); D3D12GraphicsPipelineBuilder& depthTestEnabled(bool enabled); D3D12GraphicsPipelineBuilder& depthWriteEnabled(bool enabled); D3D12GraphicsPipelineBuilder& depthCompareFunc(D3D12_COMPARISON_FUNC func); // Render target configuration D3D12GraphicsPipelineBuilder& renderTargetFormat(UINT index, DXGI_FORMAT format); D3D12GraphicsPipelineBuilder& renderTargetFormats(const std::vector& formats); D3D12GraphicsPipelineBuilder& depthStencilFormat(DXGI_FORMAT format); D3D12GraphicsPipelineBuilder& numRenderTargets(UINT count); // Sample configuration D3D12GraphicsPipelineBuilder& sampleCount(UINT count); D3D12GraphicsPipelineBuilder& sampleMask(UINT mask); // Primitive topology D3D12GraphicsPipelineBuilder& primitiveTopologyType(D3D12_PRIMITIVE_TOPOLOGY_TYPE type); // Stream output (optional) D3D12GraphicsPipelineBuilder& streamOutput(const D3D12_STREAM_OUTPUT_DESC& desc); // Build the pipeline state object [[nodiscard]] Result build(ID3D12Device* device, ID3D12RootSignature* rootSignature, ID3D12PipelineState** outPipelineState, const char* debugName = nullptr); // Get the current PSO desc (for inspection/debugging) [[nodiscard]] const D3D12_GRAPHICS_PIPELINE_STATE_DESC& getDesc() const { return psoDesc_; } private: D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc_; std::vector inputElements_; std::vector vsBytecode_; std::vector psBytecode_; }; /** * @brief Fluent builder for D3D12 compute pipeline state objects * * Simplified builder for compute shaders. * * Usage: * D3D12ComputePipelineBuilder builder; * builder.shaderBytecode(csBytecode); * auto result = builder.build(device, rootSignature, outPipelineState); */ class D3D12ComputePipelineBuilder final { public: D3D12ComputePipelineBuilder(); ~D3D12ComputePipelineBuilder() = default; // Shader configuration D3D12ComputePipelineBuilder& shaderBytecode(const std::vector& bytecode); // Build the pipeline state object [[nodiscard]] Result build(ID3D12Device* device, ID3D12RootSignature* rootSignature, ID3D12PipelineState** outPipelineState, const char* debugName = nullptr); // Get the current PSO desc (for inspection/debugging) [[nodiscard]] const D3D12_COMPUTE_PIPELINE_STATE_DESC& getDesc() const { return psoDesc_; } private: D3D12_COMPUTE_PIPELINE_STATE_DESC psoDesc_; std::vector csBytecode_; }; /** * @brief Builder for D3D12 root signatures * * Encapsulates root signature creation with support for: * - Root constants (push constants) * - Root descriptors (CBVs) * - Descriptor tables (CBV/SRV/UAV/Sampler) * - Automatic cost calculation and validation * * Usage: * D3D12RootSignatureBuilder builder; * builder.addRootConstants(shaderRegister, num32BitValues) * .addRootCBV(shaderRegister) * .addDescriptorTable(D3D12_DESCRIPTOR_RANGE_TYPE_SRV, count, baseRegister); * auto result = builder.build(device, context, outRootSignature); */ class D3D12RootSignatureBuilder final { public: D3D12RootSignatureBuilder(); ~D3D12RootSignatureBuilder() = default; // Root constants (inline 32-bit values) D3D12RootSignatureBuilder& addRootConstants(UINT shaderRegister, UINT num32BitValues, UINT registerSpace = 0); // Root descriptors (CBV/SRV/UAV accessed directly via GPU virtual address) D3D12RootSignatureBuilder& addRootCBV(UINT shaderRegister, UINT registerSpace = 0); D3D12RootSignatureBuilder& addRootSRV(UINT shaderRegister, UINT registerSpace = 0); D3D12RootSignatureBuilder& addRootUAV(UINT shaderRegister, UINT registerSpace = 0); // Descriptor tables D3D12RootSignatureBuilder& addDescriptorTable(D3D12_DESCRIPTOR_RANGE_TYPE rangeType, UINT numDescriptors, UINT baseShaderRegister, UINT registerSpace = 0); // Flags D3D12RootSignatureBuilder& flags(D3D12_ROOT_SIGNATURE_FLAGS flags); // Build the root signature // Note: context parameter is reserved for future tier-based validation. // Currently, callers should use getMaxDescriptorCount() when configuring // descriptor tables to ensure hardware compatibility. [[nodiscard]] Result build(ID3D12Device* device, const D3D12Context* context, ID3D12RootSignature** outRootSignature); // Query limits from device - use this when calling addDescriptorTable() // to ensure descriptor counts are within hardware tier limits static UINT getMaxDescriptorCount(const D3D12Context* context, D3D12_DESCRIPTOR_RANGE_TYPE rangeType); // Calculate root signature size in DWORDs (must be <= 64) [[nodiscard]] uint32_t getDwordSize() const; private: struct DescriptorRange { D3D12_DESCRIPTOR_RANGE range; }; struct RootParameter { D3D12_ROOT_PARAMETER param; std::vector ranges; // For descriptor tables }; std::vector rootParameters_; D3D12_ROOT_SIGNATURE_FLAGS flags_ = D3D12_ROOT_SIGNATURE_FLAG_NONE; }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/D3D12PipelineCache.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include namespace igl::d3d12 { ComPtr D3D12PipelineCache::createRootSignatureFromKey( ID3D12Device* d3dDevice, const D3D12RootSignatureKey& key, D3D12_RESOURCE_BINDING_TIER bindingTier, Result* IGL_NULLABLE outResult) const { if (!d3dDevice) { Result::setResult(outResult, Result::Code::InvalidOperation, "D3D12 device is null"); return nullptr; } IGL_D3D12_LOG_VERBOSE("Creating root signature from reflection key:\n"); if (key.hasPushConstants) { IGL_D3D12_LOG_VERBOSE( " Push constants: b%u (%u DWORDs)\n", key.pushConstantSlot, key.pushConstantSize); } IGL_D3D12_LOG_VERBOSE(" CBV slots: %zu, SRV slots: %zu, UAV slots: %zu, Sampler slots: %zu\n", key.usedCBVSlots.size(), key.usedSRVSlots.size(), key.usedUAVSlots.size(), key.usedSamplerSlots.size()); // Determine if we need bounded ranges (Tier 1 hardware) const bool needsBoundedRanges = (bindingTier == D3D12_RESOURCE_BINDING_TIER_1); const UINT srvBound = needsBoundedRanges ? 128 : UINT_MAX; const UINT samplerBound = needsBoundedRanges ? 32 : UINT_MAX; const UINT uavBound = needsBoundedRanges ? 8 : UINT_MAX; // Build descriptor ranges dynamically - only create ranges for resource types the shader uses // The ranges must remain stable (no reallocation) since root parameters will point to them std::vector descriptorRanges; descriptorRanges.reserve(4); // Maximum: CBV, SRV, Sampler, UAV // Track which descriptor range index corresponds to each resource type size_t cbvRangeIndex = SIZE_MAX; size_t srvRangeIndex = SIZE_MAX; size_t samplerRangeIndex = SIZE_MAX; size_t uavRangeIndex = SIZE_MAX; // CBV descriptor table (only if shader uses CBVs) if (!key.usedCBVSlots.empty()) { cbvRangeIndex = descriptorRanges.size(); // D3D12 descriptor tables must start at register 0 // Calculate range from 0 to max slot (includes unused slots) UINT maxCBVSlot = key.maxCBVSlot; UINT numCBVs = maxCBVSlot + 1; D3D12_DESCRIPTOR_RANGE cbvRange = {}; cbvRange.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_CBV; cbvRange.NumDescriptors = numCBVs; cbvRange.BaseShaderRegister = 0; cbvRange.RegisterSpace = 0; cbvRange.OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND; descriptorRanges.push_back(cbvRange); } // SRV descriptor table (only if shader uses SRVs) if (!key.usedSRVSlots.empty()) { srvRangeIndex = descriptorRanges.size(); // D3D12 descriptor tables must start at register 0 // Calculate range from 0 to max slot (includes unused slots) UINT maxSRVSlot = key.maxSRVSlot; UINT numSRVs = maxSRVSlot + 1; D3D12_DESCRIPTOR_RANGE srvRange = {}; srvRange.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV; srvRange.NumDescriptors = numSRVs; srvRange.BaseShaderRegister = 0; srvRange.RegisterSpace = 0; srvRange.OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND; descriptorRanges.push_back(srvRange); } // Sampler descriptor table (only if shader uses samplers) if (!key.usedSamplerSlots.empty()) { samplerRangeIndex = descriptorRanges.size(); // D3D12 descriptor tables must start at register 0 // Calculate range from 0 to max slot (includes unused slots) UINT maxSamplerSlot = key.maxSamplerSlot; UINT numSamplers = maxSamplerSlot + 1; D3D12_DESCRIPTOR_RANGE samplerRange = {}; samplerRange.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER; samplerRange.NumDescriptors = numSamplers; samplerRange.BaseShaderRegister = 0; samplerRange.RegisterSpace = 0; samplerRange.OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND; descriptorRanges.push_back(samplerRange); } // UAV descriptor table (only if shader uses UAVs) if (!key.usedUAVSlots.empty()) { uavRangeIndex = descriptorRanges.size(); // D3D12 descriptor tables must start at register 0 // Calculate range from 0 to max slot (includes unused slots) UINT maxUAVSlot = key.maxUAVSlot; UINT numUAVs = maxUAVSlot + 1; D3D12_DESCRIPTOR_RANGE uavRange = {}; uavRange.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_UAV; uavRange.NumDescriptors = numUAVs; uavRange.BaseShaderRegister = 0; uavRange.RegisterSpace = 0; uavRange.OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND; descriptorRanges.push_back(uavRange); } // Build root parameters dynamically based on shader reflection (Vulkan approach) // Only include what the shader actually declares - no hardcoded assumptions // Order: Push constants, CBV table, SRV table, Sampler table, UAV table std::vector rootParams; // Track which root parameter index corresponds to each resource type UINT pushConstantRootParamIndex = UINT_MAX; UINT cbvTableRootParamIndex = UINT_MAX; UINT srvTableRootParamIndex = UINT_MAX; UINT samplerTableRootParamIndex = UINT_MAX; UINT uavTableRootParamIndex = UINT_MAX; // Add push constants if shader uses them (always first if present) if (key.hasPushConstants) { pushConstantRootParamIndex = static_cast(rootParams.size()); D3D12_ROOT_PARAMETER pushConstParam = {}; pushConstParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS; pushConstParam.Constants.ShaderRegister = key.pushConstantSlot; pushConstParam.Constants.RegisterSpace = 0; pushConstParam.Constants.Num32BitValues = key.pushConstantSize; pushConstParam.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL; rootParams.push_back(pushConstParam); } // Add CBV descriptor table if shader uses any CBV slots if (!key.usedCBVSlots.empty() && cbvRangeIndex != SIZE_MAX) { cbvTableRootParamIndex = static_cast(rootParams.size()); D3D12_ROOT_PARAMETER cbvTableParam = {}; cbvTableParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE; cbvTableParam.DescriptorTable.NumDescriptorRanges = 1; cbvTableParam.DescriptorTable.pDescriptorRanges = &descriptorRanges[cbvRangeIndex]; cbvTableParam.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL; rootParams.push_back(cbvTableParam); } // Add SRV descriptor table if shader uses any SRV slots if (!key.usedSRVSlots.empty() && srvRangeIndex != SIZE_MAX) { srvTableRootParamIndex = static_cast(rootParams.size()); D3D12_ROOT_PARAMETER srvTableParam = {}; srvTableParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE; srvTableParam.DescriptorTable.NumDescriptorRanges = 1; srvTableParam.DescriptorTable.pDescriptorRanges = &descriptorRanges[srvRangeIndex]; srvTableParam.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL; rootParams.push_back(srvTableParam); } // Add Sampler descriptor table if shader uses any sampler slots if (!key.usedSamplerSlots.empty() && samplerRangeIndex != SIZE_MAX) { samplerTableRootParamIndex = static_cast(rootParams.size()); D3D12_ROOT_PARAMETER samplerTableParam = {}; samplerTableParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE; samplerTableParam.DescriptorTable.NumDescriptorRanges = 1; samplerTableParam.DescriptorTable.pDescriptorRanges = &descriptorRanges[samplerRangeIndex]; samplerTableParam.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL; rootParams.push_back(samplerTableParam); } // Add UAV descriptor table if shader uses any UAV slots if (!key.usedUAVSlots.empty() && uavRangeIndex != SIZE_MAX) { uavTableRootParamIndex = static_cast(rootParams.size()); D3D12_ROOT_PARAMETER uavTableParam = {}; uavTableParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE; uavTableParam.DescriptorTable.NumDescriptorRanges = 1; uavTableParam.DescriptorTable.pDescriptorRanges = &descriptorRanges[uavRangeIndex]; uavTableParam.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL; rootParams.push_back(uavTableParam); } // Create root signature desc D3D12_ROOT_SIGNATURE_DESC rootSigDesc = {}; rootSigDesc.NumParameters = static_cast(rootParams.size()); rootSigDesc.pParameters = rootParams.data(); rootSigDesc.NumStaticSamplers = 0; rootSigDesc.pStaticSamplers = nullptr; rootSigDesc.Flags = key.flags; IGL_D3D12_LOG_VERBOSE(" Root signature has %u parameters\n", rootSigDesc.NumParameters); // Use existing caching infrastructure return getOrCreateRootSignature(d3dDevice, rootSigDesc, outResult); } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/D3D12PipelineCache.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include #include #include #include #include namespace igl::d3d12 { class D3D12PipelineCache { public: D3D12PipelineCache() = default; void clear(); private: size_t hashRootSignature(const D3D12_ROOT_SIGNATURE_DESC& desc) const; ComPtr getOrCreateRootSignature(ID3D12Device* d3dDevice, const D3D12_ROOT_SIGNATURE_DESC& desc, Result* IGL_NULLABLE outResult) const; // Create root signature from reflection-based key (for dynamic binding) ComPtr createRootSignatureFromKey(ID3D12Device* d3dDevice, const struct D3D12RootSignatureKey& key, D3D12_RESOURCE_BINDING_TIER bindingTier, Result* IGL_NULLABLE outResult) const; size_t hashRenderPipelineDesc(const RenderPipelineDesc& desc) const; size_t hashComputePipelineDesc(const ComputePipelineDesc& desc) const; mutable std::unordered_map> graphicsPSOCache_; mutable std::unordered_map> computePSOCache_; mutable std::mutex psoCacheMutex_; mutable size_t graphicsPSOCacheHits_ = 0; mutable size_t graphicsPSOCacheMisses_ = 0; mutable size_t computePSOCacheHits_ = 0; mutable size_t computePSOCacheMisses_ = 0; mutable std::unordered_map> rootSignatureCache_; mutable std::mutex rootSignatureCacheMutex_; mutable size_t rootSignatureCacheHits_ = 0; mutable size_t rootSignatureCacheMisses_ = 0; std::vector mipmapVSBytecode_; std::vector mipmapPSBytecode_; ComPtr mipmapRootSignature_; bool mipmapShadersAvailable_ = false; friend class Device; }; inline void D3D12PipelineCache::clear() { { std::lock_guard lock(psoCacheMutex_); graphicsPSOCache_.clear(); computePSOCache_.clear(); graphicsPSOCacheHits_ = 0; graphicsPSOCacheMisses_ = 0; computePSOCacheHits_ = 0; computePSOCacheMisses_ = 0; } { std::lock_guard lock(rootSignatureCacheMutex_); rootSignatureCache_.clear(); rootSignatureCacheHits_ = 0; rootSignatureCacheMisses_ = 0; } mipmapVSBytecode_.clear(); mipmapPSBytecode_.clear(); mipmapRootSignature_.Reset(); mipmapShadersAvailable_ = false; } inline size_t D3D12PipelineCache::hashRootSignature(const D3D12_ROOT_SIGNATURE_DESC& desc) const { size_t hash = 0; hashCombine(hash, static_cast(desc.Flags)); hashCombine(hash, static_cast(desc.NumParameters)); for (UINT i = 0; i < desc.NumParameters; ++i) { const auto& param = desc.pParameters[i]; hashCombine(hash, static_cast(param.ParameterType)); hashCombine(hash, static_cast(param.ShaderVisibility)); switch (param.ParameterType) { case D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE: { hashCombine(hash, static_cast(param.DescriptorTable.NumDescriptorRanges)); for (UINT j = 0; j < param.DescriptorTable.NumDescriptorRanges; ++j) { const auto& range = param.DescriptorTable.pDescriptorRanges[j]; hashCombine(hash, static_cast(range.RangeType)); hashCombine(hash, static_cast(range.NumDescriptors)); hashCombine(hash, static_cast(range.BaseShaderRegister)); hashCombine(hash, static_cast(range.RegisterSpace)); hashCombine(hash, static_cast(range.OffsetInDescriptorsFromTableStart)); } break; } case D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS: { hashCombine(hash, static_cast(param.Constants.ShaderRegister)); hashCombine(hash, static_cast(param.Constants.RegisterSpace)); hashCombine(hash, static_cast(param.Constants.Num32BitValues)); break; } case D3D12_ROOT_PARAMETER_TYPE_CBV: case D3D12_ROOT_PARAMETER_TYPE_SRV: case D3D12_ROOT_PARAMETER_TYPE_UAV: { hashCombine(hash, static_cast(param.Descriptor.ShaderRegister)); hashCombine(hash, static_cast(param.Descriptor.RegisterSpace)); break; } } } hashCombine(hash, static_cast(desc.NumStaticSamplers)); for (UINT i = 0; i < desc.NumStaticSamplers; ++i) { const auto& sampler = desc.pStaticSamplers[i]; hashCombine(hash, static_cast(sampler.Filter)); hashCombine(hash, static_cast(sampler.AddressU)); hashCombine(hash, static_cast(sampler.AddressV)); hashCombine(hash, static_cast(sampler.AddressW)); hashCombine(hash, static_cast(sampler.ComparisonFunc)); hashCombine(hash, static_cast(sampler.ShaderRegister)); hashCombine(hash, static_cast(sampler.RegisterSpace)); hashCombine(hash, static_cast(sampler.ShaderVisibility)); } return hash; } inline ComPtr D3D12PipelineCache::getOrCreateRootSignature( ID3D12Device* d3dDevice, const D3D12_ROOT_SIGNATURE_DESC& desc, Result* IGL_NULLABLE outResult) const { const size_t hash = hashRootSignature(desc); { std::lock_guard lock(rootSignatureCacheMutex_); auto it = rootSignatureCache_.find(hash); if (it != rootSignatureCache_.end()) { rootSignatureCacheHits_++; IGL_D3D12_LOG_VERBOSE(" Root signature cache HIT (hash=0x%zx, hits=%zu, misses=%zu)\n", hash, rootSignatureCacheHits_, rootSignatureCacheMisses_); return it->second; } } rootSignatureCacheMisses_++; IGL_D3D12_LOG_VERBOSE(" Root signature cache MISS (hash=0x%zx, hits=%zu, misses=%zu)\n", hash, rootSignatureCacheHits_, rootSignatureCacheMisses_); if (!d3dDevice) { Result::setResult(outResult, Result::Code::InvalidOperation, "D3D12 device is null"); return nullptr; } ComPtr signature; ComPtr error; // Query highest supported root signature version for this device. D3D12_FEATURE_DATA_ROOT_SIGNATURE featureData{}; featureData.HighestVersion = D3D_ROOT_SIGNATURE_VERSION_1_1; HRESULT featureHr = d3dDevice->CheckFeatureSupport( D3D12_FEATURE_ROOT_SIGNATURE, &featureData, sizeof(featureData)); D3D_ROOT_SIGNATURE_VERSION highestVersion = SUCCEEDED(featureHr) ? featureData.HighestVersion : D3D_ROOT_SIGNATURE_VERSION_1_0; HRESULT hr = E_FAIL; if (highestVersion >= D3D_ROOT_SIGNATURE_VERSION_1_1) { // Use versioned root signature (1.1) when available and preserve NumDescriptors // as-is (Tier 2/3 unbounded ranges are expressed via UINT_MAX). std::vector params1; std::vector> rangesPerParam; params1.reserve(desc.NumParameters); rangesPerParam.reserve(desc.NumParameters); for (UINT i = 0; i < desc.NumParameters; ++i) { const D3D12_ROOT_PARAMETER& srcParam = desc.pParameters[i]; D3D12_ROOT_PARAMETER1 dstParam{}; dstParam.ParameterType = srcParam.ParameterType; dstParam.ShaderVisibility = srcParam.ShaderVisibility; switch (srcParam.ParameterType) { case D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS: dstParam.Constants.ShaderRegister = srcParam.Constants.ShaderRegister; dstParam.Constants.RegisterSpace = srcParam.Constants.RegisterSpace; dstParam.Constants.Num32BitValues = srcParam.Constants.Num32BitValues; break; case D3D12_ROOT_PARAMETER_TYPE_CBV: case D3D12_ROOT_PARAMETER_TYPE_SRV: case D3D12_ROOT_PARAMETER_TYPE_UAV: dstParam.Descriptor.ShaderRegister = srcParam.Descriptor.ShaderRegister; dstParam.Descriptor.RegisterSpace = srcParam.Descriptor.RegisterSpace; dstParam.Descriptor.Flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE; break; case D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE: { const UINT numRanges = srcParam.DescriptorTable.NumDescriptorRanges; const D3D12_DESCRIPTOR_RANGE* srcRanges = srcParam.DescriptorTable.pDescriptorRanges; if (numRanges > 0 && srcRanges) { rangesPerParam.emplace_back(); auto& dstRanges = rangesPerParam.back(); dstRanges.resize(numRanges); for (UINT j = 0; j < numRanges; ++j) { const D3D12_DESCRIPTOR_RANGE& srcRange = srcRanges[j]; D3D12_DESCRIPTOR_RANGE1 dstRange{}; dstRange.RangeType = srcRange.RangeType; dstRange.NumDescriptors = srcRange.NumDescriptors; dstRange.BaseShaderRegister = srcRange.BaseShaderRegister; dstRange.RegisterSpace = srcRange.RegisterSpace; // Mark descriptor ranges as DESCRIPTORS_VOLATILE to match the dynamic // per-draw descriptor update pattern used by D3D12ResourcesBinder. // This avoids D3D12 WARNING/ERROR ID=646, which requires all descriptors // in STATIC ranges to be initialized before binding the table. dstRange.Flags = D3D12_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_VOLATILE; dstRange.OffsetInDescriptorsFromTableStart = srcRange.OffsetInDescriptorsFromTableStart; dstRanges[j] = dstRange; } dstParam.DescriptorTable.NumDescriptorRanges = numRanges; dstParam.DescriptorTable.pDescriptorRanges = dstRanges.data(); } else { dstParam.DescriptorTable.NumDescriptorRanges = 0; dstParam.DescriptorTable.pDescriptorRanges = nullptr; } break; } } params1.push_back(dstParam); } D3D12_ROOT_SIGNATURE_DESC1 desc1{}; desc1.NumParameters = static_cast(params1.size()); desc1.pParameters = params1.data(); desc1.NumStaticSamplers = desc.NumStaticSamplers; desc1.pStaticSamplers = desc.pStaticSamplers; desc1.Flags = desc.Flags; D3D12_VERSIONED_ROOT_SIGNATURE_DESC versionedDesc{}; versionedDesc.Version = D3D_ROOT_SIGNATURE_VERSION_1_1; versionedDesc.Desc_1_1 = desc1; IGL_D3D12_LOG_VERBOSE(" Serializing root signature (version 1.1)...\n"); hr = D3D12SerializeVersionedRootSignature( &versionedDesc, signature.GetAddressOf(), error.GetAddressOf()); } else { // Device only supports Root Signature 1.0. Clamp any unbounded descriptor ranges // (NumDescriptors == UINT_MAX) to a large but finite conservative value so that // the serialized root signature is portable across RS 1.0 implementations. constexpr UINT kMaxDescriptorsFallback = 16384; // Sufficient for current heap sizes. std::vector params; std::vector> rangesPerParam; params.reserve(desc.NumParameters); rangesPerParam.reserve(desc.NumParameters); for (UINT i = 0; i < desc.NumParameters; ++i) { const D3D12_ROOT_PARAMETER& srcParam = desc.pParameters[i]; D3D12_ROOT_PARAMETER dstParam = srcParam; if (srcParam.ParameterType == D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE && srcParam.DescriptorTable.NumDescriptorRanges > 0 && srcParam.DescriptorTable.pDescriptorRanges) { const UINT numRanges = srcParam.DescriptorTable.NumDescriptorRanges; const D3D12_DESCRIPTOR_RANGE* srcRanges = srcParam.DescriptorTable.pDescriptorRanges; rangesPerParam.emplace_back(); auto& dstRanges = rangesPerParam.back(); dstRanges.resize(numRanges); for (UINT j = 0; j < numRanges; ++j) { dstRanges[j] = srcRanges[j]; if (dstRanges[j].NumDescriptors == UINT_MAX) { dstRanges[j].NumDescriptors = kMaxDescriptorsFallback; } } dstParam.DescriptorTable.NumDescriptorRanges = numRanges; dstParam.DescriptorTable.pDescriptorRanges = dstRanges.data(); } params.push_back(dstParam); } D3D12_ROOT_SIGNATURE_DESC adjustedDesc{}; adjustedDesc.NumParameters = static_cast(params.size()); adjustedDesc.pParameters = params.data(); adjustedDesc.NumStaticSamplers = desc.NumStaticSamplers; adjustedDesc.pStaticSamplers = desc.pStaticSamplers; adjustedDesc.Flags = desc.Flags; IGL_D3D12_LOG_VERBOSE(" Serializing root signature (version 1.0, bounded ranges)...\n"); hr = D3D12SerializeRootSignature(&adjustedDesc, D3D_ROOT_SIGNATURE_VERSION_1, signature.GetAddressOf(), error.GetAddressOf()); } if (FAILED(hr)) { if (error.Get()) { const char* errorMsg = static_cast(error->GetBufferPointer()); IGL_LOG_ERROR("Root signature serialization error: %s\n", errorMsg); } Result::setResult(outResult, Result::Code::RuntimeError, "Failed to serialize root signature"); return nullptr; } ComPtr rootSignature; hr = d3dDevice->CreateRootSignature(0, signature->GetBufferPointer(), signature->GetBufferSize(), IID_PPV_ARGS(rootSignature.GetAddressOf())); if (FAILED(hr)) { IGL_LOG_ERROR(" CreateRootSignature FAILED: 0x%08X\n", static_cast(hr)); Result::setResult(outResult, Result::Code::RuntimeError, "Failed to create root signature"); return nullptr; } IGL_D3D12_LOG_VERBOSE(" Root signature created successfully\n"); { std::lock_guard lock(rootSignatureCacheMutex_); rootSignatureCache_[hash] = rootSignature; } return rootSignature; } inline size_t D3D12PipelineCache::hashRenderPipelineDesc(const RenderPipelineDesc& desc) const { size_t hash = 0; if (desc.shaderStages) { auto* vertexModule = static_cast(desc.shaderStages->getVertexModule().get()); auto* fragmentModule = static_cast(desc.shaderStages->getFragmentModule().get()); if (vertexModule) { const auto& vsBytecode = vertexModule->getBytecode(); hashCombine(hash, vsBytecode.size()); size_t bytesToHash = std::min(256, vsBytecode.size()); for (size_t i = 0; i < bytesToHash; i += 8) { hashCombine(hash, static_cast(vsBytecode[i])); } } if (fragmentModule) { const auto& psBytecode = fragmentModule->getBytecode(); hashCombine(hash, psBytecode.size()); size_t bytesToHash = std::min(256, psBytecode.size()); for (size_t i = 0; i < bytesToHash; i += 8) { hashCombine(hash, static_cast(psBytecode[i])); } } } if (desc.vertexInputState) { auto* d3d12VertexInput = static_cast(desc.vertexInputState.get()); const auto& vertexDesc = d3d12VertexInput->getDesc(); hashCombine(hash, vertexDesc.numAttributes); for (size_t i = 0; i < vertexDesc.numAttributes; ++i) { hashCombine(hash, static_cast(vertexDesc.attributes[i].format)); hashCombine(hash, vertexDesc.attributes[i].offset); hashCombine(hash, vertexDesc.attributes[i].bufferIndex); hashCombine(hash, std::hash{}(vertexDesc.attributes[i].name)); } } hashCombine(hash, desc.targetDesc.colorAttachments.size()); for (const auto& att : desc.targetDesc.colorAttachments) { hashCombine(hash, static_cast(att.textureFormat)); } hashCombine(hash, static_cast(desc.targetDesc.depthAttachmentFormat)); hashCombine(hash, static_cast(desc.targetDesc.stencilAttachmentFormat)); for (const auto& att : desc.targetDesc.colorAttachments) { hashCombine(hash, att.blendEnabled ? 1 : 0); hashCombine(hash, static_cast(att.srcRGBBlendFactor)); hashCombine(hash, static_cast(att.dstRGBBlendFactor)); hashCombine(hash, static_cast(att.rgbBlendOp)); hashCombine(hash, static_cast(att.srcAlphaBlendFactor)); hashCombine(hash, static_cast(att.dstAlphaBlendFactor)); hashCombine(hash, static_cast(att.alphaBlendOp)); hashCombine(hash, static_cast(att.colorWriteMask)); } hashCombine(hash, static_cast(desc.cullMode)); hashCombine(hash, static_cast(desc.frontFaceWinding)); hashCombine(hash, static_cast(desc.polygonFillMode)); hashCombine(hash, static_cast(desc.topology)); hashCombine(hash, desc.sampleCount); return hash; } inline size_t D3D12PipelineCache::hashComputePipelineDesc(const ComputePipelineDesc& desc) const { size_t hash = 0; if (desc.shaderStages) { auto* computeModule = static_cast(desc.shaderStages->getComputeModule().get()); if (computeModule) { const auto& csBytecode = computeModule->getBytecode(); hashCombine(hash, csBytecode.size()); size_t bytesToHash = std::min(256, csBytecode.size()); for (size_t i = 0; i < bytesToHash; i += 8) { hashCombine(hash, static_cast(csBytecode[i])); } } } for (char c : desc.debugName) { hashCombine(hash, static_cast(c)); } return hash; } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/D3D12PresentManager.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include namespace igl::d3d12 { bool PresentManager::present() { auto* swapChain = context_.getSwapChain(); if (!swapChain) { return true; // No swapchain, nothing to present } auto* device = context_.getDevice(); // Check device status before presenting if (!checkDeviceStatus("before Present")) { return false; } // Configure VSync via environment variable UINT syncInterval = 1; UINT presentFlags = 0; { char buf[8] = {}; if (GetEnvironmentVariableA("IGL_D3D12_VSYNC", buf, sizeof(buf)) > 0) { if (buf[0] == '0') { syncInterval = 0; if (context_.isTearingSupported()) { presentFlags |= DXGI_PRESENT_ALLOW_TEARING; } } } } // Present HRESULT presentHr = swapChain->Present(syncInterval, presentFlags); if (FAILED(presentHr)) { IGL_LOG_ERROR("PresentManager: Present failed: 0x%08X\n", static_cast(presentHr)); // Check if device was removed during Present HRESULT deviceStatus = device->GetDeviceRemovedReason(); if (FAILED(deviceStatus)) { IGL_LOG_ERROR("PresentManager: DEVICE REMOVED during Present! Reason: 0x%08X\n", static_cast(deviceStatus)); #ifdef IGL_DEBUG logInfoQueueMessages(device); logDredInfo(device); #endif IGL_DEBUG_ASSERT(false); } else { IGL_LOG_ERROR( "PresentManager: Present failed but device reports OK; check swapchain/window state\n"); } // Present failed - return false regardless of whether device was removed return false; } #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE("PresentManager: Present OK\n"); #endif // Check device status after Present if (!checkDeviceStatus("after Present")) { return false; } return true; } bool PresentManager::checkDeviceStatus(const char* contextStr) { auto* device = context_.getDevice(); HRESULT deviceStatus = device->GetDeviceRemovedReason(); if (FAILED(deviceStatus)) { IGL_LOG_ERROR("PresentManager: DEVICE REMOVED %s! Reason: 0x%08X\n", contextStr, static_cast(deviceStatus)); #ifdef IGL_DEBUG logInfoQueueMessages(device); logDredInfo(device); #endif IGL_DEBUG_ASSERT(false); return false; } return true; } #ifdef IGL_DEBUG void PresentManager::logInfoQueueMessages(ID3D12Device* device) { igl::d3d12::ComPtr infoQueue; if (FAILED(device->QueryInterface(IID_PPV_ARGS(infoQueue.GetAddressOf())))) { return; } UINT64 numMessages = infoQueue->GetNumStoredMessages(); IGL_D3D12_LOG_VERBOSE("D3D12 Info Queue has %llu messages:\n", numMessages); for (UINT64 i = 0; i < numMessages; ++i) { SIZE_T messageLength = 0; infoQueue->GetMessage(i, nullptr, &messageLength); if (messageLength == 0) { continue; } // Use RAII vector instead of malloc/free std::vector messageBuffer(messageLength); auto* message = reinterpret_cast(messageBuffer.data()); if (SUCCEEDED(infoQueue->GetMessage(i, message, &messageLength))) { const char* severityStr = "UNKNOWN"; switch (message->Severity) { case D3D12_MESSAGE_SEVERITY_CORRUPTION: severityStr = "CORRUPTION"; break; case D3D12_MESSAGE_SEVERITY_ERROR: severityStr = "ERROR"; break; case D3D12_MESSAGE_SEVERITY_WARNING: severityStr = "WARNING"; break; case D3D12_MESSAGE_SEVERITY_INFO: severityStr = "INFO"; break; case D3D12_MESSAGE_SEVERITY_MESSAGE: severityStr = "MESSAGE"; break; } IGL_D3D12_LOG_VERBOSE(" [%s] %s\n", severityStr, message->pDescription); } // messageBuffer automatically freed at end of scope } } void PresentManager::logDredInfo(ID3D12Device* device) { #if defined(__ID3D12DeviceRemovedExtendedData1_INTERFACE_DEFINED__) igl::d3d12::ComPtr dred; if (FAILED(device->QueryInterface(IID_PPV_ARGS(dred.GetAddressOf())))) { IGL_D3D12_LOG_VERBOSE("DRED: ID3D12DeviceRemovedExtendedData1 not available.\n"); return; } D3D12_DRED_AUTO_BREADCRUMBS_OUTPUT1 breadcrumbs = {}; if (SUCCEEDED(dred->GetAutoBreadcrumbsOutput1(&breadcrumbs)) && breadcrumbs.pHeadAutoBreadcrumbNode) { IGL_LOG_ERROR("DRED AutoBreadcrumbs (most recent first):\n"); const D3D12_AUTO_BREADCRUMB_NODE1* node = breadcrumbs.pHeadAutoBreadcrumbNode; uint32_t nodeIndex = 0; constexpr uint32_t kMaxNodesToPrint = 16; while (node && nodeIndex < kMaxNodesToPrint) { const char* listName = node->pCommandListDebugNameA ? node->pCommandListDebugNameA : ""; const char* queueName = node->pCommandQueueDebugNameA ? node->pCommandQueueDebugNameA : ""; IGL_LOG_ERROR( " Node #%u: CommandList=%p (%s) CommandQueue=%p (%s) Breadcrumbs=%u completed=%u\n", nodeIndex, node->pCommandList, listName, node->pCommandQueue, queueName, node->BreadcrumbCount, node->pLastBreadcrumbValue ? *node->pLastBreadcrumbValue : 0); if (node->pCommandHistory && node->BreadcrumbCount > 0) { D3D12_AUTO_BREADCRUMB_OP lastOp = node->pCommandHistory[node->BreadcrumbCount - 1]; IGL_LOG_ERROR(" Last command: %d (history count=%u)\n", static_cast(lastOp), node->BreadcrumbCount); } node = node->pNext; ++nodeIndex; } if (node) { IGL_LOG_ERROR(" ... additional breadcrumbs omitted ...\n"); } } else { IGL_D3D12_LOG_VERBOSE("DRED: No auto breadcrumbs captured.\n"); } D3D12_DRED_PAGE_FAULT_OUTPUT1 pageFault = {}; if (SUCCEEDED(dred->GetPageFaultAllocationOutput1(&pageFault)) && pageFault.PageFaultVA != 0) { IGL_LOG_ERROR("DRED PageFault: VA=0x%016llx\n", pageFault.PageFaultVA); if (pageFault.pHeadExistingAllocationNode) { const auto* alloc = pageFault.pHeadExistingAllocationNode; IGL_LOG_ERROR(" Existing allocation: Object=%p Name=%s Type=%u\n", alloc->pObject, alloc->ObjectNameA ? alloc->ObjectNameA : "", static_cast(alloc->AllocationType)); } if (pageFault.pHeadRecentFreedAllocationNode) { const auto* freed = pageFault.pHeadRecentFreedAllocationNode; IGL_LOG_ERROR(" Recently freed allocation: Object=%p Name=%s Type=%u\n", freed->pObject, freed->ObjectNameA ? freed->ObjectNameA : "", static_cast(freed->AllocationType)); } } else { IGL_D3D12_LOG_VERBOSE("DRED: No page fault data available.\n"); } #else (void)device; IGL_D3D12_LOG_VERBOSE("DRED: Extended data interfaces not available on this SDK.\n"); #endif } #endif // IGL_DEBUG } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/D3D12PresentManager.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::d3d12 { class D3D12Context; /** * @brief Manages swapchain presentation with device removal detection * * Handles: * - VSync configuration via environment variable * - Present flags (tearing support) * - Device removal detection before/after Present * - DRED and Info Queue diagnostics on failure */ class PresentManager final { public: explicit PresentManager(D3D12Context& context) : context_(context) {} /** * @brief Present the current frame with proper error handling * * Checks device status before and after Present, logs diagnostics on failure. * Does not throw - sets device lost flag for application to check. * * @return true if present succeeded, false if device was removed or present failed */ bool present(); private: /** * @brief Check device status and log diagnostics if removed */ bool checkDeviceStatus(const char* context); #ifdef IGL_DEBUG /** * @brief Log Info Queue messages for debugging (debug builds only) */ void logInfoQueueMessages(ID3D12Device* device); /** * @brief Log DRED breadcrumbs and page fault info (debug builds only) */ void logDredInfo(ID3D12Device* device); #endif D3D12Context& context_; }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/D3D12ReflectionUtils.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include namespace igl::d3d12::ReflectionUtils { igl::UniformType mapUniformType(const D3D12_SHADER_TYPE_DESC& td) { if ((td.Class == D3D_SVC_MATRIX_ROWS || td.Class == D3D_SVC_MATRIX_COLUMNS) && td.Rows == 4 && td.Columns == 4) { return igl::UniformType::Mat4x4; } if (td.Type == D3D_SVT_FLOAT) { if (td.Class == D3D_SVC_SCALAR) return igl::UniformType::Float; if (td.Class == D3D_SVC_VECTOR) { switch (td.Columns) { case 2: return igl::UniformType::Float2; case 3: return igl::UniformType::Float3; case 4: return igl::UniformType::Float4; default: return igl::UniformType::Invalid; } } } return igl::UniformType::Invalid; } } // namespace igl::d3d12::ReflectionUtils ================================================ FILE: src/igl/d3d12/D3D12ReflectionUtils.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::d3d12::ReflectionUtils { /** * Maps D3D12 shader type descriptor to IGL uniform type * * Supported types: * - float (D3D_SVT_FLOAT + D3D_SVC_SCALAR) → UniformType::Float * - float2/3/4 (D3D_SVT_FLOAT + D3D_SVC_VECTOR) → UniformType::Float2/3/4 * - float4x4 (D3D_SVC_MATRIX_ROWS/COLUMNS, 4x4) → UniformType::Mat4x4 * * All other types (int, uint, bool, matrices other than 4x4, etc.) map to UniformType::Invalid * * @param td D3D12 shader type descriptor from reflection * @return Corresponding IGL UniformType, or UniformType::Invalid for unsupported types */ igl::UniformType mapUniformType(const D3D12_SHADER_TYPE_DESC& td); } // namespace igl::d3d12::ReflectionUtils ================================================ FILE: src/igl/d3d12/D3D12ResourcesBinder.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #include #include namespace igl::d3d12 { namespace { // D3D12 alignment requirement for constant buffer views constexpr size_t kConstantBufferAlignment = 256; constexpr size_t kMaxCBVSize = 65536; // 64 KB (D3D12 spec limit) // Compute pipeline hardcoded root parameter layout // Note: Graphics pipelines use pure reflection-based layout queried from RenderPipelineState // Compute pipelines still use this hardcoded layout (should be migrated to reflection) constexpr uint32_t kComputeRootParam_PushConstants = 0; constexpr uint32_t kComputeRootParam_UAVTable = 1; constexpr uint32_t kComputeRootParam_SRVTable = 2; constexpr uint32_t kComputeRootParam_CBVTable = 3; constexpr uint32_t kComputeRootParam_SamplerTable = 4; } // namespace D3D12ResourcesBinder::D3D12ResourcesBinder(CommandBuffer& commandBuffer, bool isCompute) : commandBuffer_(commandBuffer), isCompute_(isCompute) {} void D3D12ResourcesBinder::bindTexture(uint32_t index, ITexture* texture) { if (index >= IGL_TEXTURE_SAMPLERS_MAX) { IGL_LOG_ERROR("D3D12ResourcesBinder::bindTexture: index %u exceeds maximum %u\n", index, IGL_TEXTURE_SAMPLERS_MAX); return; } if (!texture) { // Unbind texture at this slot if (index < bindingsTextures_.count) { bindingsTextures_.textures[index] = nullptr; bindingsTextures_.handles[index] = {}; // Update count to highest bound slot + 1 while (bindingsTextures_.count > 0 && bindingsTextures_.textures[bindingsTextures_.count - 1] == nullptr) { bindingsTextures_.count--; } } dirtyFlags_ |= DirtyFlagBits_Textures; return; } auto* d3dTexture = static_cast(texture); ID3D12Resource* resource = d3dTexture->getResource(); if (!resource) { IGL_LOG_ERROR("D3D12ResourcesBinder::bindTexture: texture resource is null\n"); return; } // Transition texture to shader resource state // Note: This must happen immediately, not deferred until updateBindings() // Use pipeline-specific states for optimal barrier tracking: // - Graphics: PIXEL_SHADER_RESOURCE (pixel shader read) // - Compute: NON_PIXEL_SHADER_RESOURCE (compute/vertex/geometry shader read) auto* commandList = commandBuffer_.getCommandList(); const auto targetState = isCompute_ ? D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE : D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE; d3dTexture->transitionAll(commandList, targetState); // Store texture pointer for descriptor creation in updateBindings() bindingsTextures_.textures[index] = texture; // Mark textures dirty - descriptor will be created in updateBindings() dirtyFlags_ |= DirtyFlagBits_Textures; // Update binding count if (index >= bindingsTextures_.count) { bindingsTextures_.count = index + 1; } } void D3D12ResourcesBinder::bindSamplerState(uint32_t index, ISamplerState* samplerState) { if (index >= IGL_TEXTURE_SAMPLERS_MAX) { IGL_LOG_ERROR("D3D12ResourcesBinder::bindSamplerState: index %u exceeds maximum %u\n", index, IGL_TEXTURE_SAMPLERS_MAX); return; } if (!samplerState) { // Unbind sampler at this slot if (index < bindingsSamplers_.count) { bindingsSamplers_.samplers[index] = nullptr; bindingsSamplers_.handles[index] = {}; // Update count to highest bound slot + 1 while (bindingsSamplers_.count > 0 && bindingsSamplers_.samplers[bindingsSamplers_.count - 1] == nullptr) { bindingsSamplers_.count--; } } dirtyFlags_ |= DirtyFlagBits_Samplers; return; } // Store sampler pointer for descriptor creation in updateBindings() bindingsSamplers_.samplers[index] = samplerState; // Mark samplers dirty - descriptor will be created in updateBindings() dirtyFlags_ |= DirtyFlagBits_Samplers; // Update binding count if (index >= bindingsSamplers_.count) { bindingsSamplers_.count = index + 1; } } void D3D12ResourcesBinder::bindBuffer(uint32_t index, IBuffer* buffer, size_t offset, size_t size, bool isUAV, size_t elementStride) { if (index >= IGL_BUFFER_BINDINGS_MAX) { IGL_LOG_ERROR("D3D12ResourcesBinder::bindBuffer: index %u exceeds maximum %u\n", index, IGL_BUFFER_BINDINGS_MAX); return; } if (!buffer) { // Unbind buffer/UAV at this slot if (isUAV) { if (index < bindingsUAVs_.count) { bindingsUAVs_.buffers[index] = nullptr; bindingsUAVs_.offsets[index] = 0; bindingsUAVs_.elementStrides[index] = 0; bindingsUAVs_.handles[index] = {}; while (bindingsUAVs_.count > 0 && bindingsUAVs_.buffers[bindingsUAVs_.count - 1] == nullptr) { bindingsUAVs_.count--; } } dirtyFlags_ |= DirtyFlagBits_UAVs; } else { if (index < bindingsBuffers_.count) { bindingsBuffers_.buffers[index] = nullptr; bindingsBuffers_.addresses[index] = 0; bindingsBuffers_.offsets[index] = 0; bindingsBuffers_.sizes[index] = 0; while (bindingsBuffers_.count > 0 && bindingsBuffers_.buffers[bindingsBuffers_.count - 1] == nullptr) { bindingsBuffers_.count--; } } dirtyFlags_ |= DirtyFlagBits_Buffers; } return; } auto* d3dBuffer = static_cast(buffer); ID3D12Resource* resource = d3dBuffer->getResource(); if (!resource) { IGL_LOG_ERROR("D3D12ResourcesBinder::bindBuffer: buffer resource is null\n"); return; } if (isUAV) { // Storage buffer (UAV) - store buffer pointer, offset, and element stride for descriptor // creation if (elementStride == 0) { IGL_LOG_ERROR( "D3D12ResourcesBinder::bindBuffer: UAV binding requires non-zero elementStride\n"); return; } bindingsUAVs_.buffers[index] = buffer; bindingsUAVs_.offsets[index] = offset; bindingsUAVs_.elementStrides[index] = elementStride; dirtyFlags_ |= DirtyFlagBits_UAVs; if (index >= bindingsUAVs_.count) { bindingsUAVs_.count = index + 1; } } else { // Uniform buffer (CBV) - D3D12 requires 256-byte alignment for CBV addresses // Compute base address (must be 256-byte aligned) D3D12_GPU_VIRTUAL_ADDRESS baseAddress = resource->GetGPUVirtualAddress(); D3D12_GPU_VIRTUAL_ADDRESS alignedAddress = (baseAddress + offset) & ~(kConstantBufferAlignment - 1); bindingsBuffers_.buffers[index] = buffer; bindingsBuffers_.addresses[index] = alignedAddress; bindingsBuffers_.offsets[index] = offset; bindingsBuffers_.sizes[index] = size; dirtyFlags_ |= DirtyFlagBits_Buffers; if (index >= bindingsBuffers_.count) { bindingsBuffers_.count = index + 1; } } } bool D3D12ResourcesBinder::updateBindings(const RenderPipelineState* renderPipeline, Result* outResult) { auto* commandList = commandBuffer_.getCommandList(); auto& context = commandBuffer_.getContext(); auto* device = context.getDevice(); if (!commandList || !device) { if (outResult) { *outResult = Result{Result::Code::RuntimeError, "Invalid command list or device"}; } return false; } bool success = true; // Update textures (SRV table) if (dirtyFlags_ & DirtyFlagBits_Textures) { if (!updateTextureBindings(commandList, device, renderPipeline, outResult)) { success = false; } } // Update samplers (sampler table) if (dirtyFlags_ & DirtyFlagBits_Samplers) { if (!updateSamplerBindings(commandList, device, renderPipeline, outResult)) { success = false; } } // Update buffers (CBV table) if (dirtyFlags_ & DirtyFlagBits_Buffers) { if (!updateBufferBindings(commandList, device, renderPipeline, outResult)) { success = false; } } // Update UAVs (UAV table for compute) if ((dirtyFlags_ & DirtyFlagBits_UAVs) && isCompute_) { if (!updateUAVBindings(commandList, device, outResult)) { success = false; } } // Clear dirty flags dirtyFlags_ = 0; return success; } void D3D12ResourcesBinder::reset() { bindingsTextures_ = {}; bindingsSamplers_ = {}; bindingsBuffers_ = {}; bindingsUAVs_ = {}; dirtyFlags_ = DirtyFlagBits_Textures | DirtyFlagBits_Samplers | DirtyFlagBits_Buffers | DirtyFlagBits_UAVs; } bool D3D12ResourcesBinder::updateTextureBindings(ID3D12GraphicsCommandList* cmdList, ID3D12Device* device, const RenderPipelineState* renderPipeline, Result* outResult) { if (bindingsTextures_.count == 0) { return true; // Nothing to bind } auto& context = commandBuffer_.getContext(); // Determine how many descriptors to allocate based on pipeline's root signature // For graphics: Use pipeline's declared SRV range (0 to maxSRVSlot inclusive) // For compute: Use bindingsTextures_.count (legacy sparse allocation) uint32_t descriptorRangeSize = bindingsTextures_.count; if (!isCompute_ && renderPipeline) { // Graphics pipeline: Match root signature's SRV descriptor range exactly const UINT pipelineSRVCount = renderPipeline->getSRVDescriptorCount(); if (pipelineSRVCount > 0) { descriptorRangeSize = pipelineSRVCount; IGL_D3D12_LOG_VERBOSE("updateTextureBindings: Using pipeline SRV range size=%u (bound=%u)\n", descriptorRangeSize, bindingsTextures_.count); } } // Allocate a contiguous range of descriptors for all textures on a single page // This ensures we can bind them as a single descriptor table uint32_t baseDescriptorIndex = 0; Result allocResult = commandBuffer_.allocateCbvSrvUavRange(descriptorRangeSize, &baseDescriptorIndex); if (!allocResult.isOk()) { IGL_LOG_ERROR( "D3D12ResourcesBinder: Failed to allocate contiguous SRV range (%u descriptors): %s\n", descriptorRangeSize, allocResult.message.c_str()); if (outResult) { *outResult = allocResult; } return false; } // Create SRV descriptors for all texture slots from 0 to descriptorRangeSize-1. // For unbound slots, emit a null SRV so that the descriptor table is fully // initialized and matches the root signature descriptor range exactly. for (uint32_t i = 0; i < descriptorRangeSize; ++i) { const uint32_t descriptorIndex = baseDescriptorIndex + i; D3D12_CPU_DESCRIPTOR_HANDLE cpuHandle = context.getCbvSrvUavCpuHandle(descriptorIndex); D3D12_GPU_DESCRIPTOR_HANDLE gpuHandle = context.getCbvSrvUavGpuHandle(descriptorIndex); // Check if this slot is bound (may be null if beyond bindingsTextures_.count) auto* texture = (i < bindingsTextures_.count) ? bindingsTextures_.textures[i] : nullptr; if (!texture) { // Create an explicit null SRV descriptor. D3D12 does not permit both // the resource AND the descriptor pointer to be null, so we bind a // well-formed descriptor with zeroed fields instead. This is treated as // a null descriptor by the runtime. D3D12_SHADER_RESOURCE_VIEW_DESC nullSrv = {}; nullSrv.Format = DXGI_FORMAT_R8G8B8A8_UNORM; nullSrv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; nullSrv.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; nullSrv.Texture2D.MipLevels = 1; device->CreateShaderResourceView(nullptr, &nullSrv, cpuHandle); D3D12Context::trackResourceCreation("SRV", 0); // Only cache handle if within bounds (avoid out-of-bounds write) if (i < IGL_TEXTURE_SAMPLERS_MAX) { bindingsTextures_.handles[i] = gpuHandle; } continue; } auto* d3dTexture = static_cast(texture); ID3D12Resource* resource = d3dTexture->getResource(); if (!resource) { D3D12_SHADER_RESOURCE_VIEW_DESC nullSrv = {}; nullSrv.Format = DXGI_FORMAT_R8G8B8A8_UNORM; nullSrv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; nullSrv.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; nullSrv.Texture2D.MipLevels = 1; device->CreateShaderResourceView(nullptr, &nullSrv, cpuHandle); D3D12Context::trackResourceCreation("SRV", 0); // Only cache handle if within bounds (avoid out-of-bounds write) if (i < IGL_TEXTURE_SAMPLERS_MAX) { bindingsTextures_.handles[i] = gpuHandle; } continue; } D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; srvDesc.Format = textureFormatToDXGIShaderResourceViewFormat(d3dTexture->getFormat()); srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; auto resourceDesc = resource->GetDesc(); const bool isView = d3dTexture->isView(); const uint32_t mostDetailedMip = isView ? d3dTexture->getMipLevelOffset() : 0; const uint32_t mipLevels = isView ? d3dTexture->getNumMipLevelsInView() : d3dTexture->getNumMipLevels(); if (resourceDesc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D) { srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE3D; srvDesc.Texture3D.MipLevels = mipLevels; srvDesc.Texture3D.MostDetailedMip = mostDetailedMip; } else if (resourceDesc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE2D) { const auto textureType = d3dTexture->getType(); const bool isArrayTexture = (isView && d3dTexture->getNumArraySlicesInView() > 0) || (!isView && resourceDesc.DepthOrArraySize > 1); // Prioritize cube textures so that cubemaps created as 2D arrays // with 6 faces are exposed as TEXTURECUBE to shaders that declare // TextureCube / samplerCube. if (textureType == TextureType::Cube) { srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURECUBE; srvDesc.TextureCube.MostDetailedMip = mostDetailedMip; srvDesc.TextureCube.MipLevels = mipLevels; } else if (textureType == TextureType::TwoDArray || isArrayTexture) { srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2DARRAY; srvDesc.Texture2DArray.MostDetailedMip = mostDetailedMip; srvDesc.Texture2DArray.MipLevels = mipLevels; srvDesc.Texture2DArray.FirstArraySlice = isView ? d3dTexture->getArraySliceOffset() : 0; srvDesc.Texture2DArray.ArraySize = isView ? d3dTexture->getNumArraySlicesInView() : resourceDesc.DepthOrArraySize; } else { srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; srvDesc.Texture2D.MostDetailedMip = mostDetailedMip; srvDesc.Texture2D.MipLevels = mipLevels; } } else { IGL_LOG_ERROR("D3D12ResourcesBinder: Unsupported texture dimension %d\n", resourceDesc.Dimension); if (outResult) { *outResult = Result{Result::Code::Unsupported, "Unsupported texture dimension for SRV"}; } return false; } device->CreateShaderResourceView(resource, &srvDesc, cpuHandle); D3D12Context::trackResourceCreation("SRV", 0); // Cache the GPU handle (only if within bounds) if (i < IGL_TEXTURE_SAMPLERS_MAX) { bindingsTextures_.handles[i] = gpuHandle; } } // Bind the SRV table to the appropriate root parameter // Use the first descriptor in the allocated range (baseDescriptorIndex) D3D12_GPU_DESCRIPTOR_HANDLE tableBaseHandle = context.getCbvSrvUavGpuHandle(baseDescriptorIndex); if (isCompute_) { cmdList->SetComputeRootDescriptorTable(kComputeRootParam_SRVTable, tableBaseHandle); } else { // Graphics pipeline: Query reflection-based root parameter index from pipeline if (!renderPipeline) { IGL_LOG_ERROR("updateTextureBindings: renderPipeline is NULL, cannot bind SRV table\n"); } else { const UINT srvTableIndex = renderPipeline->getSRVTableRootParameterIndex(); IGL_D3D12_LOG_VERBOSE( "updateTextureBindings: srvTableIndex=%u (UINT_MAX=%u)\n", srvTableIndex, UINT_MAX); if (srvTableIndex != UINT_MAX) { cmdList->SetGraphicsRootDescriptorTable(srvTableIndex, tableBaseHandle); IGL_D3D12_LOG_VERBOSE( "updateTextureBindings: Bound SRV table to root param %u (range size %u)\n", srvTableIndex, descriptorRangeSize); } else { IGL_LOG_ERROR( "updateTextureBindings: srvTableIndex is UINT_MAX, shader doesn't use SRVs?\n"); } } } return true; } bool D3D12ResourcesBinder::updateSamplerBindings(ID3D12GraphicsCommandList* cmdList, ID3D12Device* device, const RenderPipelineState* renderPipeline, Result* outResult) { if (bindingsSamplers_.count == 0) { return true; // Nothing to bind } auto& context = commandBuffer_.getContext(); // Determine how many descriptors to allocate based on pipeline's root signature // For graphics: Use pipeline's declared sampler range (0 to maxSamplerSlot inclusive) // For compute: Use bindingsSamplers_.count (legacy behavior) uint32_t descriptorRangeSize = bindingsSamplers_.count; if (!isCompute_ && renderPipeline) { // Graphics pipeline: Match root signature's sampler descriptor range exactly const UINT pipelineSamplerCount = renderPipeline->getSamplerDescriptorCount(); if (pipelineSamplerCount > 0) { descriptorRangeSize = pipelineSamplerCount; IGL_D3D12_LOG_VERBOSE( "updateSamplerBindings: Using pipeline sampler range size=%u (bound=%u)\n", descriptorRangeSize, bindingsSamplers_.count); } } // Get base sampler descriptor index for contiguous allocation uint32_t baseSamplerIndex = commandBuffer_.getNextSamplerDescriptor(); // Create sampler descriptors for all slots from 0 to descriptorRangeSize-1 // For unbound slots, create a default sampler to fill the table for (uint32_t i = 0; i < descriptorRangeSize; ++i) { const uint32_t descriptorIndex = baseSamplerIndex + i; // Get descriptor handles D3D12_CPU_DESCRIPTOR_HANDLE cpuHandle = context.getSamplerCpuHandle(descriptorIndex); D3D12_GPU_DESCRIPTOR_HANDLE gpuHandle = context.getSamplerGpuHandle(descriptorIndex); // Check if this slot is bound (may be null if beyond bindingsSamplers_.count) auto* samplerState = (i < bindingsSamplers_.count) ? bindingsSamplers_.samplers[i] : nullptr; // Create sampler descriptor D3D12_SAMPLER_DESC samplerDesc = {}; if (samplerState) { auto* d3dSampler = static_cast(samplerState); samplerDesc = d3dSampler->getDesc(); } else { // Unbound slot: Create default sampler for unused descriptor table entries samplerDesc.Filter = D3D12_FILTER_MIN_MAG_MIP_LINEAR; samplerDesc.AddressU = D3D12_TEXTURE_ADDRESS_MODE_CLAMP; samplerDesc.AddressV = D3D12_TEXTURE_ADDRESS_MODE_CLAMP; samplerDesc.AddressW = D3D12_TEXTURE_ADDRESS_MODE_CLAMP; samplerDesc.MipLODBias = 0.0f; samplerDesc.MaxAnisotropy = 1; samplerDesc.ComparisonFunc = D3D12_COMPARISON_FUNC_NEVER; samplerDesc.BorderColor[0] = 0.0f; samplerDesc.BorderColor[1] = 0.0f; samplerDesc.BorderColor[2] = 0.0f; samplerDesc.BorderColor[3] = 0.0f; samplerDesc.MinLOD = 0.0f; samplerDesc.MaxLOD = D3D12_FLOAT32_MAX; } device->CreateSampler(&samplerDesc, cpuHandle); D3D12Context::trackResourceCreation("Sampler", 0); // Cache the GPU handle (only if within bounds) if (i < IGL_TEXTURE_SAMPLERS_MAX) { bindingsSamplers_.handles[i] = gpuHandle; } } // Update sampler descriptor counter to reserve the allocated range commandBuffer_.getNextSamplerDescriptor() = baseSamplerIndex + descriptorRangeSize; // Bind the sampler table to the appropriate root parameter // Use the first descriptor in the allocated range D3D12_GPU_DESCRIPTOR_HANDLE tableBaseHandle = context.getSamplerGpuHandle(baseSamplerIndex); if (isCompute_) { cmdList->SetComputeRootDescriptorTable(kComputeRootParam_SamplerTable, tableBaseHandle); } else { // Graphics pipeline: Query reflection-based root parameter index from pipeline if (!renderPipeline) { IGL_LOG_ERROR("updateSamplerBindings: renderPipeline is NULL, cannot bind sampler table\n"); } else { const UINT samplerTableIndex = renderPipeline->getSamplerTableRootParameterIndex(); IGL_D3D12_LOG_VERBOSE("updateSamplerBindings: samplerTableIndex=%u (UINT_MAX=%u)\n", samplerTableIndex, UINT_MAX); if (samplerTableIndex != UINT_MAX) { cmdList->SetGraphicsRootDescriptorTable(samplerTableIndex, tableBaseHandle); IGL_D3D12_LOG_VERBOSE( "updateSamplerBindings: Bound sampler table to root param %u (range size %u)\n", samplerTableIndex, descriptorRangeSize); } else { IGL_LOG_ERROR( "updateSamplerBindings: samplerTableIndex is UINT_MAX, shader doesn't use samplers?\n"); } } } return true; } bool D3D12ResourcesBinder::updateBufferBindings(ID3D12GraphicsCommandList* cmdList, ID3D12Device* device, const RenderPipelineState* renderPipeline, Result* outResult) { if (bindingsBuffers_.count == 0) { return true; // Nothing to bind } if (isCompute_) { // Compute pipeline: all CBVs go through descriptor table (root parameter 3) auto& context = commandBuffer_.getContext(); // Count bound CBVs and validate dense binding uint32_t boundCbvCount = 0; for (uint32_t i = 0; i < bindingsBuffers_.count; ++i) { if (bindingsBuffers_.addresses[i] != 0) { boundCbvCount++; } } if (boundCbvCount == 0) { return true; // No CBVs to bind } // CRITICAL VALIDATION: Enforce dense CBV binding for compute shaders // ===================================================================== // D3D12 descriptor tables bind contiguously starting from the base register. // For compute CBVs, this means: // - VALID: binding slots 0, 1, 2 (dense from b0) // - INVALID: binding slots 0, 2 (gap at slot 1) // - INVALID: binding slots 1, 2 (slot 0 not bound) // // This is FATAL validation - sparse bindings will return InvalidOperation error. // Application code must ensure CBVs are bound densely from index 0 with no gaps. // // Rationale: When we call SetComputeRootDescriptorTable with N descriptors at base b0, // D3D12 expects HLSL registers b0, b1, ..., b(N-1) to map 1:1 with descriptor table // entries. Gaps would cause shader register mismatches and undefined behavior. if (bindingsBuffers_.addresses[0] == 0) { IGL_LOG_ERROR( "D3D12ResourcesBinder: Compute CBV bindings are sparse (slot 0 not bound). " "D3D12 requires dense bindings starting at index 0.\n"); if (outResult) { *outResult = Result{Result::Code::InvalidOperation, "Compute CBV bindings must be dense starting at slot 0"}; } return false; } // Verify no gaps in binding range (all slots from 0 to boundCbvCount-1 must be bound) for (uint32_t i = 1; i < boundCbvCount; ++i) { if (bindingsBuffers_.addresses[i] == 0) { IGL_LOG_ERROR( "D3D12ResourcesBinder: Sparse compute CBV binding detected at slot %u " "(expected dense binding through slot %u)\n", i, boundCbvCount - 1); if (outResult) { *outResult = Result{Result::Code::InvalidOperation, "Compute CBV bindings must be dense"}; } return false; } } // Allocate a contiguous range of descriptors for all CBVs on a single page // This ensures we can bind them as a single descriptor table uint32_t baseDescriptorIndex = 0; Result allocResult = commandBuffer_.allocateCbvSrvUavRange(boundCbvCount, &baseDescriptorIndex); if (!allocResult.isOk()) { IGL_LOG_ERROR( "D3D12ResourcesBinder: Failed to allocate contiguous CBV range (%u descriptors): %s\n", boundCbvCount, allocResult.message.c_str()); if (outResult) { *outResult = allocResult; } return false; } // Create CBV descriptors for all bound buffers uint32_t descriptorOffset = 0; for (uint32_t i = 0; i < bindingsBuffers_.count; ++i) { if (bindingsBuffers_.addresses[i] == 0) { continue; // Skip unbound slots } // Validate address alignment (D3D12 requires 256-byte alignment) if (bindingsBuffers_.addresses[i] % kConstantBufferAlignment != 0) { IGL_LOG_ERROR( "D3D12ResourcesBinder: Constant buffer %u address 0x%llx is not 256-byte aligned\n", i, bindingsBuffers_.addresses[i]); if (outResult) { *outResult = Result{Result::Code::ArgumentInvalid, "Constant buffer address must be 256-byte aligned"}; } return false; } // Validate size size_t size = bindingsBuffers_.sizes[i]; if (size > kMaxCBVSize) { IGL_LOG_ERROR( "D3D12ResourcesBinder: Constant buffer %u size (%zu bytes) exceeds 64 KB limit\n", i, size); if (outResult) { *outResult = Result{Result::Code::ArgumentOutOfRange, "Constant buffer size exceeds 64 KB D3D12 limit"}; } return false; } // Align size to 256-byte boundary const size_t alignedSize = (size + kConstantBufferAlignment - 1) & ~(kConstantBufferAlignment - 1); // Use contiguous descriptor index (baseDescriptorIndex + descriptorOffset) const uint32_t descriptorIndex = baseDescriptorIndex + descriptorOffset; D3D12_CPU_DESCRIPTOR_HANDLE cpuHandle = context.getCbvSrvUavCpuHandle(descriptorIndex); D3D12_CONSTANT_BUFFER_VIEW_DESC cbvDesc = {}; cbvDesc.BufferLocation = bindingsBuffers_.addresses[i]; cbvDesc.SizeInBytes = static_cast(alignedSize); device->CreateConstantBufferView(&cbvDesc, cpuHandle); descriptorOffset++; } // Sanity check: descriptorOffset should match boundCbvCount after dense packing IGL_DEBUG_ASSERT(descriptorOffset == boundCbvCount, "CBV descriptor packing mismatch: allocated %u but created %u", boundCbvCount, descriptorOffset); // Bind the CBV descriptor table to root parameter 3 D3D12_GPU_DESCRIPTOR_HANDLE gpuHandle = context.getCbvSrvUavGpuHandle(baseDescriptorIndex); cmdList->SetComputeRootDescriptorTable(kComputeRootParam_CBVTable, gpuHandle); } else { // Graphics pipeline: Reflection-based CBV descriptor table binding auto& context = commandBuffer_.getContext(); // Count bound CBVs uint32_t boundCbvCount = 0; for (uint32_t i = 0; i < bindingsBuffers_.count; ++i) { if (bindingsBuffers_.addresses[i] != 0) { boundCbvCount++; } } if (boundCbvCount == 0) { return true; // No CBVs to bind } // Determine how many descriptors to allocate based on pipeline's root signature // Use pipeline's declared CBV range (0 to maxCBVSlot inclusive) to match root signature uint32_t descriptorRangeSize = bindingsBuffers_.count; if (renderPipeline) { const UINT pipelineCBVCount = renderPipeline->getCBVDescriptorCount(); if (pipelineCBVCount > 0) { descriptorRangeSize = pipelineCBVCount; } } // Allocate a contiguous range of descriptors from 0 to descriptorRangeSize-1 uint32_t baseDescriptorIndex = 0; Result allocResult = commandBuffer_.allocateCbvSrvUavRange(descriptorRangeSize, &baseDescriptorIndex); if (!allocResult.isOk()) { IGL_LOG_ERROR("D3D12ResourcesBinder: Failed to allocate CBV range (%u descriptors): %s\n", descriptorRangeSize, allocResult.message.c_str()); if (outResult) { *outResult = allocResult; } return false; } IGL_D3D12_LOG_VERBOSE( "updateBufferBindings: Graphics CBV binding - range b0-b%u, %u descriptors\n", descriptorRangeSize - 1, descriptorRangeSize); // Create CBV descriptors for all slots from 0 to descriptorRangeSize-1 // For unbound slots, create null descriptors to match the root signature range for (uint32_t slotIndex = 0; slotIndex < descriptorRangeSize; ++slotIndex) { const uint32_t descriptorIndex = baseDescriptorIndex + slotIndex; D3D12_CPU_DESCRIPTOR_HANDLE cpuHandle = context.getCbvSrvUavCpuHandle(descriptorIndex); // Check if this slot is bound (may be null if beyond bindingsBuffers_.count) const bool isSlotBound = (slotIndex < bindingsBuffers_.count) && (bindingsBuffers_.addresses[slotIndex] != 0); if (isSlotBound) { // Bound slot: Create valid CBV descriptor // Validate address alignment (D3D12 requires 256-byte alignment) if (bindingsBuffers_.addresses[slotIndex] % kConstantBufferAlignment != 0) { IGL_LOG_ERROR( "D3D12ResourcesBinder: Constant buffer %u address 0x%llx is not 256-byte aligned\n", slotIndex, bindingsBuffers_.addresses[slotIndex]); if (outResult) { *outResult = Result{Result::Code::ArgumentInvalid, "Constant buffer address must be 256-byte aligned"}; } return false; } // Validate size size_t size = bindingsBuffers_.sizes[slotIndex]; if (size > kMaxCBVSize) { IGL_LOG_ERROR( "D3D12ResourcesBinder: Constant buffer %u size (%zu bytes) exceeds 64 KB limit\n", slotIndex, size); if (outResult) { *outResult = Result{Result::Code::ArgumentOutOfRange, "Constant buffer size exceeds 64 KB D3D12 limit"}; } return false; } // Align size to 256-byte boundary const size_t alignedSize = (size + kConstantBufferAlignment - 1) & ~(kConstantBufferAlignment - 1); D3D12_CONSTANT_BUFFER_VIEW_DESC cbvDesc = {}; cbvDesc.BufferLocation = bindingsBuffers_.addresses[slotIndex]; cbvDesc.SizeInBytes = static_cast(alignedSize); device->CreateConstantBufferView(&cbvDesc, cpuHandle); IGL_D3D12_LOG_VERBOSE( "D3D12ResourcesBinder: Created CBV descriptor for b%u (address=0x%llx, size=%u)\n", slotIndex, cbvDesc.BufferLocation, cbvDesc.SizeInBytes); } else { // Unbound slot: Create NULL descriptor to fill the root signature descriptor range D3D12_CONSTANT_BUFFER_VIEW_DESC nullCbvDesc = {}; nullCbvDesc.BufferLocation = 0; // NULL CBV nullCbvDesc.SizeInBytes = D3D12_REQ_CONSTANT_BUFFER_ELEMENT_COUNT * 16; // Minimum valid size device->CreateConstantBufferView(&nullCbvDesc, cpuHandle); IGL_D3D12_LOG_VERBOSE("D3D12ResourcesBinder: Created NULL CBV descriptor for b%u\n", slotIndex); } } // Query pipeline for reflection-based CBV table root parameter index if (!renderPipeline) { IGL_LOG_ERROR("updateBufferBindings: renderPipeline is NULL, cannot bind CBV table\n"); if (outResult) { *outResult = Result{Result::Code::ArgumentInvalid, "renderPipeline is required for graphics CBV binding"}; } return false; } const UINT cbvTableIndex = renderPipeline->getCBVTableRootParameterIndex(); if (cbvTableIndex != UINT_MAX) { // Bind the CBV descriptor table to the reflection-based root parameter D3D12_GPU_DESCRIPTOR_HANDLE gpuHandle = context.getCbvSrvUavGpuHandle(baseDescriptorIndex); cmdList->SetGraphicsRootDescriptorTable(cbvTableIndex, gpuHandle); } } return true; } bool D3D12ResourcesBinder::updateUAVBindings(ID3D12GraphicsCommandList* cmdList, ID3D12Device* device, Result* outResult) { if (bindingsUAVs_.count == 0) { return true; // Nothing to bind } // Validate dense bindings if (bindingsUAVs_.buffers[0] == nullptr) { IGL_LOG_ERROR( "D3D12ResourcesBinder: UAV bindings are sparse (slot 0 not bound). " "D3D12 requires dense bindings starting at index 0.\n"); if (outResult) { *outResult = Result{Result::Code::InvalidOperation, "UAV bindings must be dense starting at slot 0"}; } return false; } auto& context = commandBuffer_.getContext(); // Verify all UAVs are bound (dense binding requirement) for (uint32_t i = 0; i < bindingsUAVs_.count; ++i) { if (bindingsUAVs_.buffers[i] == nullptr) { IGL_LOG_ERROR("D3D12ResourcesBinder: Sparse UAV binding detected at slot %u\n", i); if (outResult) { *outResult = Result{Result::Code::InvalidOperation, "UAV bindings must be dense"}; } return false; } } // Allocate a contiguous range of descriptors for all UAVs on a single page // This ensures we can bind them as a single descriptor table uint32_t baseDescriptorIndex = 0; Result allocResult = commandBuffer_.allocateCbvSrvUavRange(bindingsUAVs_.count, &baseDescriptorIndex); if (!allocResult.isOk()) { IGL_LOG_ERROR( "D3D12ResourcesBinder: Failed to allocate contiguous UAV range (%u descriptors): %s\n", bindingsUAVs_.count, allocResult.message.c_str()); if (outResult) { *outResult = allocResult; } return false; } // Create UAV descriptors for all bound storage buffers for (uint32_t i = 0; i < bindingsUAVs_.count; ++i) { auto* buffer = bindingsUAVs_.buffers[i]; auto* d3dBuffer = static_cast(buffer); ID3D12Resource* resource = d3dBuffer->getResource(); const size_t offset = bindingsUAVs_.offsets[i]; const size_t elementStride = bindingsUAVs_.elementStrides[i]; const size_t bufferSize = d3dBuffer->getSizeInBytes(); // FATAL VALIDATION: UAV offset must be aligned to element stride // This check immediately fails the entire updateBindings() call and returns InvalidOperation. // Misaligned offsets would create invalid D3D12 UAV descriptors and cause device removal. if (offset % elementStride != 0) { IGL_LOG_ERROR( "D3D12ResourcesBinder: UAV offset %zu is not aligned to element stride %zu. " "This is a FATAL error - updateBindings() will fail.\n", offset, elementStride); if (outResult) { *outResult = Result{Result::Code::ArgumentInvalid, "UAV offset must be aligned to element stride"}; } return false; } // FATAL VALIDATION: UAV offset must be within buffer bounds // This check immediately fails the entire updateBindings() call and returns ArgumentOutOfRange. // Out-of-bounds offsets would access invalid memory and cause GPU faults. if (offset > bufferSize) { IGL_LOG_ERROR( "D3D12ResourcesBinder: UAV offset %zu exceeds buffer size %zu. " "This is a FATAL error - updateBindings() will fail.\n", offset, bufferSize); if (outResult) { *outResult = Result{Result::Code::ArgumentOutOfRange, "UAV offset exceeds buffer size"}; } return false; } const size_t remaining = bufferSize - offset; // FATAL VALIDATION: At least one full element must fit in remaining buffer space // This check immediately fails the entire updateBindings() call and returns ArgumentOutOfRange. // Creating a UAV with zero elements or partial elements would be invalid. if (remaining < elementStride) { IGL_LOG_ERROR( "D3D12ResourcesBinder: UAV remaining size %zu < element stride %zu. " "This is a FATAL error - updateBindings() will fail.\n", remaining, elementStride); if (outResult) { *outResult = Result{Result::Code::ArgumentOutOfRange, "UAV remaining size less than element stride"}; } return false; } // Use contiguous descriptor index (baseDescriptorIndex + i) const uint32_t descriptorIndex = baseDescriptorIndex + i; D3D12_CPU_DESCRIPTOR_HANDLE cpuHandle = context.getCbvSrvUavCpuHandle(descriptorIndex); D3D12_GPU_DESCRIPTOR_HANDLE gpuHandle = context.getCbvSrvUavGpuHandle(descriptorIndex); // Create UAV descriptor for structured buffer D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = {}; uavDesc.Format = DXGI_FORMAT_UNKNOWN; // Required for structured buffers uavDesc.ViewDimension = D3D12_UAV_DIMENSION_BUFFER; uavDesc.Buffer.FirstElement = static_cast(offset / elementStride); uavDesc.Buffer.NumElements = static_cast(remaining / elementStride); uavDesc.Buffer.StructureByteStride = static_cast(elementStride); uavDesc.Buffer.CounterOffsetInBytes = 0; uavDesc.Buffer.Flags = D3D12_BUFFER_UAV_FLAG_NONE; device->CreateUnorderedAccessView(resource, nullptr, &uavDesc, cpuHandle); D3D12Context::trackResourceCreation("UAV", 0); // Cache the GPU handle bindingsUAVs_.handles[i] = gpuHandle; } // Bind the UAV table to root parameter 1 (compute only) cmdList->SetComputeRootDescriptorTable(kComputeRootParam_UAVTable, bindingsUAVs_.handles[0]); return true; } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/D3D12ResourcesBinder.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include namespace igl::d3d12 { class CommandBuffer; class PipelineState; /** * @brief Binding state for textures and their associated GPU descriptor handles * * Stores up to IGL_TEXTURE_SAMPLERS_MAX texture bindings (t0-t15 in HLSL). * Each binding stores the texture pointer (for descriptor creation) and the * resulting GPU descriptor handle (for root parameter binding). */ struct BindingsTextures { ITexture* textures[IGL_TEXTURE_SAMPLERS_MAX] = {}; D3D12_GPU_DESCRIPTOR_HANDLE handles[IGL_TEXTURE_SAMPLERS_MAX] = {}; uint32_t count = 0; }; /** * @brief Binding state for samplers and their associated GPU descriptor handles * * Stores up to IGL_TEXTURE_SAMPLERS_MAX sampler bindings (s0-s15 in HLSL). * Each binding stores the sampler state pointer (for descriptor creation) and the * resulting GPU descriptor handle (for root parameter binding). */ struct BindingsSamplers { ISamplerState* samplers[IGL_TEXTURE_SAMPLERS_MAX] = {}; D3D12_GPU_DESCRIPTOR_HANDLE handles[IGL_TEXTURE_SAMPLERS_MAX] = {}; uint32_t count = 0; }; /** * @brief Binding state for uniform buffers (constant buffers in D3D12) * * Stores up to IGL_BUFFER_BINDINGS_MAX buffer bindings (b0-b30 in HLSL). * D3D12 has two binding methods: * - Root CBV (direct GPU virtual address) - used for b0-b1 (legacy/frequent) * - CBV descriptor table - used for b2+ (less frequent) * * This struct stores buffer pointers and GPU virtual addresses/sizes for all bindings. * The actual binding method is determined by the pipeline root signature. */ struct BindingsBuffers { IBuffer* buffers[IGL_BUFFER_BINDINGS_MAX] = {}; D3D12_GPU_VIRTUAL_ADDRESS addresses[IGL_BUFFER_BINDINGS_MAX] = {}; size_t offsets[IGL_BUFFER_BINDINGS_MAX] = {}; size_t sizes[IGL_BUFFER_BINDINGS_MAX] = {}; uint32_t count = 0; }; /** * @brief Binding state for unordered access views (UAVs) * * Stores up to IGL_BUFFER_BINDINGS_MAX UAV bindings (u0-u30 in HLSL). * Used for storage buffers in compute shaders and writable resources. * Each binding stores the buffer pointer, offset, element stride (for descriptor creation), * and the resulting GPU descriptor handle (for root parameter binding). */ struct BindingsUAVs { IBuffer* buffers[IGL_BUFFER_BINDINGS_MAX] = {}; size_t offsets[IGL_BUFFER_BINDINGS_MAX] = {}; size_t elementStrides[IGL_BUFFER_BINDINGS_MAX] = {}; // Byte stride per element for structured // buffers D3D12_GPU_DESCRIPTOR_HANDLE handles[IGL_BUFFER_BINDINGS_MAX] = {}; uint32_t count = 0; }; /** * @brief Centralized resource binding management for D3D12 command encoders * * D3D12ResourcesBinder is the single entry point for shader-visible descriptor binding * (CBV/SRV/UAV/Sampler) used by command encoders. It consolidates descriptor allocation * and resource binding logic that was previously fragmented across RenderCommandEncoder * and ComputeCommandEncoder. * * Note: RTV/DSV descriptors are managed separately by DescriptorHeapManager and bound * directly by encoders during render pass setup. * * ============================================================================ * ARCHITECTURE: D3D12 Descriptor Management Overview * ============================================================================ * * The D3D12 backend uses THREE distinct descriptor management strategies: * * 1. **Transient Descriptor Allocator** (Per-Frame Heaps) * - Location: D3D12Context::FrameContext, CommandBuffer allocation methods * - Purpose: Shader-visible descriptors (CBV/SRV/UAV/Samplers) for rendering * - Lifecycle: Allocated during command encoding, reset at frame boundary * - Strategy: Linear allocation with dynamic multi-page growth * - Used for: SRVs (textures), UAVs (storage buffers), CBVs, Samplers * - Access: ONLY through D3D12ResourcesBinder (internal detail) * * 2. **Persistent Descriptor Allocator** (DescriptorHeapManager) * - Location: DescriptorHeapManager class * - Purpose: CPU-visible descriptors (RTV/DSV) with explicit lifecycle * - Lifecycle: Allocated at resource creation, freed at resource destruction * - Strategy: Free-list allocation with double-free protection * - Used for: Render target views, depth-stencil views * - Access: Directly by Texture and Framebuffer classes * * 3. **Root Descriptor Optimization** (Inline Binding) * - Location: D3D12ResourcesBinder::updateBufferBindings() * - Purpose: Bypass descriptor heaps for frequently-updated constant buffers * - Lifecycle: No descriptor created - binds GPU virtual address directly * - Strategy: D3D12 root CBVs (graphics b0-b1 only) * - Used for: Hot-path constant buffers in graphics pipeline * - Access: ONLY through D3D12ResourcesBinder (internal optimization) * * **Design Rationale**: * - Strategies 1 and 2 handle DIFFERENT descriptor types (shader-visible vs CPU-visible) * and lifecycles (transient vs persistent), so they cannot be merged * - Strategy 3 is a D3D12-specific optimization, not a separate "system" * - D3D12ResourcesBinder abstracts these details, providing a unified binding interface * * ============================================================================ * Key Responsibilities of D3D12ResourcesBinder * ============================================================================ * * - Cache resource bindings locally until updateBindings() is called * - Allocate descriptors from per-frame shader-visible heaps on-demand (Strategy 1) * - Create SRV/UAV/CBV/Sampler descriptors in GPU-visible heaps * - Decide when to use root CBVs vs descriptor tables (Strategy 3) * - Track dirty state to minimize descriptor creation and root parameter updates * - Support both graphics and compute pipeline bind points * - Transition texture resources to appropriate shader-resource states (buffers must * be created in the correct state and are not transitioned here) * * Design principles: * - **Lazy update**: Bindings are cached locally and only applied to GPU on updateBindings() * - **Dirty tracking**: Only update descriptor sets when resources change * - **Pipeline awareness**: Different root signature layouts for graphics vs compute * - **Per-frame isolation**: Uses per-frame descriptor heaps to prevent race conditions * - **Implementation hiding**: External code should never directly access CommandBuffer * descriptor allocation methods - always go through ResourcesBinder * * Thread-safety: This class is NOT thread-safe. Each encoder should own its own binder. * * Dependencies: * - T01: Correct descriptor binding patterns * - T06: Shared helper utilities for descriptor creation * - T16: Unified logging controls * - T20: Consolidated descriptor management architecture * * Related to Vulkan ResourcesBinder pattern (src/igl/vulkan/ResourcesBinder.h) */ class D3D12ResourcesBinder final { public: /** * @brief Initialize the resource binder for a command buffer * * @param commandBuffer Command buffer to bind resources to (provides context/device access) * @param isCompute True for compute pipelines, false for graphics pipelines */ D3D12ResourcesBinder(CommandBuffer& commandBuffer, bool isCompute); /** * @brief Bind a texture (shader resource view) to a specific slot * * Creates or updates an SRV descriptor in the per-frame CBV/SRV/UAV heap * and caches the GPU handle. The binding is not applied to the command list * until updateBindings() is called. * * @param index Texture slot (t0-t15 in HLSL, 0-based index) * @param texture Texture to bind (nullptr to unbind) */ void bindTexture(uint32_t index, ITexture* texture); /** * @brief Bind a sampler state to a specific slot * * Creates or updates a sampler descriptor in the per-frame sampler heap * and caches the GPU handle. The binding is not applied to the command list * until updateBindings() is called. * * @param index Sampler slot (s0-s15 in HLSL, 0-based index) * @param samplerState Sampler state to bind (nullptr to unbind) */ void bindSamplerState(uint32_t index, ISamplerState* samplerState); /** * @brief Bind a buffer (constant buffer or storage buffer) to a specific slot * * For uniform buffers (constant buffers): * - Stores GPU virtual address for root CBV binding (b0-b1) * - Or creates CBV descriptor for descriptor table binding (b2+) * - **COMPUTE SHADERS**: CBV bindings MUST be dense starting from index 0 with no gaps. * For example, binding slots 0, 1, 2 is valid; binding 0, 2 (skipping 1) will fail. * This constraint is enforced because descriptor tables bind contiguously from b0. * * For storage buffers: * - Creates UAV descriptor in the per-frame CBV/SRV/UAV heap * - Requires elementStride for structured buffer descriptor creation * * The binding is not applied to the command list until updateBindings() is called. * * @param index Buffer slot (b0-b30 for CBVs, u0-u30 for UAVs in HLSL) * @param buffer Buffer to bind (nullptr to unbind) * @param offset Offset in bytes into the buffer * @param size Size in bytes to bind * @param isUAV True to bind as UAV (storage buffer), false for CBV (uniform buffer) * @param elementStride For UAVs: byte stride per element for structured buffers (required) */ void bindBuffer(uint32_t index, IBuffer* buffer, size_t offset, size_t size, bool isUAV = false, size_t elementStride = 0); /** * @brief Apply all pending bindings to the command list * * This method performs the actual GPU binding work: * 1. Creates descriptors for any dirty bindings (textures/samplers/buffers/UAVs) * 2. Sets root descriptor tables (SetGraphicsRootDescriptorTable/SetComputeRootDescriptorTable) * 3. Sets root constants/root CBVs if applicable * 4. Clears dirty flags * * This should be called before draw/dispatch commands to ensure all bindings are active. * * @param renderPipeline For graphics pipelines: current pipeline to query reflection-based root * parameter indices. For compute pipelines: pass nullptr (uses hardcoded layout). * @param outResult Optional result for error reporting (e.g., descriptor heap overflow). * If nullptr, caller receives only success/fail boolean. If non-null, * all failure paths populate both error code and diagnostic message. * @return true if bindings applied successfully, false on error */ [[nodiscard]] bool updateBindings(const class RenderPipelineState* renderPipeline = nullptr, Result* outResult = nullptr); /** * @brief Reset all bindings and dirty flags * * Called at the start of a new frame or when switching pipelines to ensure * clean binding state. Does not affect the underlying descriptor heaps. */ void reset(); private: /** * @brief Bitwise flags for dirty resource types * * Used to track which resource types have been modified since the last * updateBindings() call, allowing us to skip descriptor creation and * root parameter updates for unchanged resources. */ enum DirtyFlagBits : uint8_t { DirtyFlagBits_Textures = 1 << 0, DirtyFlagBits_Samplers = 1 << 1, DirtyFlagBits_Buffers = 1 << 2, DirtyFlagBits_UAVs = 1 << 3, }; /** * @brief Update texture bindings (SRV descriptor table) * * Creates SRV descriptors for all bound textures in the per-frame heap * and sets the root descriptor table parameter. * * @param cmdList Command list to update * @param device D3D12 device for descriptor creation * @param renderPipeline Pipeline to query reflection-based root parameter indices (graphics only) * @param outResult Optional result for error reporting * @return true on success, false on error */ [[nodiscard]] bool updateTextureBindings(ID3D12GraphicsCommandList* cmdList, ID3D12Device* device, const class RenderPipelineState* renderPipeline, Result* outResult); /** * @brief Update sampler bindings (sampler descriptor table) * * Creates sampler descriptors for all bound samplers in the per-frame heap * and sets the root descriptor table parameter. * * @param cmdList Command list to update * @param device D3D12 device for descriptor creation * @param renderPipeline Pipeline to query reflection-based root parameter indices (graphics only) * @param outResult Optional result for error reporting * @return true on success, false on error */ [[nodiscard]] bool updateSamplerBindings(ID3D12GraphicsCommandList* cmdList, ID3D12Device* device, const class RenderPipelineState* renderPipeline, Result* outResult); /** * @brief Update buffer bindings (CBV descriptor table) * * For graphics pipelines: * - Creates CBV descriptor table for all bound CBVs * - Queries pipeline for reflection-based root parameter index * * For compute pipelines: * - Creates CBV descriptor table for all bindings (hardcoded root parameter) * * @param cmdList Command list to update * @param device D3D12 device for descriptor creation * @param renderPipeline Pipeline to query reflection-based root parameter indices (graphics only) * @param outResult Optional result for error reporting * @return true on success, false on error */ [[nodiscard]] bool updateBufferBindings(ID3D12GraphicsCommandList* cmdList, ID3D12Device* device, const class RenderPipelineState* renderPipeline, Result* outResult); /** * @brief Update UAV bindings (UAV descriptor table for compute shaders) * * Creates UAV descriptors for all bound storage buffers in the per-frame heap * and sets the root descriptor table parameter. Only used for compute pipelines. * * @param cmdList Command list to update * @param device D3D12 device for descriptor creation * @param outResult Optional result for error reporting * @return true on success, false on error */ [[nodiscard]] bool updateUAVBindings(ID3D12GraphicsCommandList* cmdList, ID3D12Device* device, Result* outResult); CommandBuffer& commandBuffer_; bool isCompute_ = false; // Cached binding state BindingsTextures bindingsTextures_; BindingsSamplers bindingsSamplers_; BindingsBuffers bindingsBuffers_; BindingsUAVs bindingsUAVs_; // Dirty tracking flags uint32_t dirtyFlags_ = DirtyFlagBits_Textures | DirtyFlagBits_Samplers | DirtyFlagBits_Buffers | DirtyFlagBits_UAVs; }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/D3D12RootSignatureKey.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::d3d12 { /** * @brief Key structure for root signature cache lookup based on shader resource usage * * This structure captures the essential shader resource requirements needed to construct * a compatible root signature. It enables Vulkan-style dynamic root signature selection * where the root signature is chosen based on actual shader resource usage rather than * being globally fixed. * * The key includes: * - Push constant configuration (slot and size) * - Resource slot usage (CBV/SRV/UAV/Sampler ranges) * - Flags for shader visibility and optimization * * Root signatures with the same key are compatible and can be reused across pipelines. */ struct D3D12RootSignatureKey { // Push constants configuration bool hasPushConstants = false; UINT pushConstantSlot = UINT_MAX; // Which b# register UINT pushConstantSize = 0; // Size in 32-bit values // Resource slot ranges (sorted for consistent hashing) std::vector usedCBVSlots; std::vector usedSRVSlots; std::vector usedUAVSlots; std::vector usedSamplerSlots; // Minimum / maximum slot indices (for determining descriptor table windows) UINT minCBVSlot = 0; UINT maxCBVSlot = 0; UINT minSRVSlot = 0; UINT maxSRVSlot = 0; UINT minUAVSlot = 0; UINT maxUAVSlot = 0; UINT minSamplerSlot = 0; UINT maxSamplerSlot = 0; // Root signature flags D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT; /** * @brief Construct key from vertex + fragment shader reflection * * Merges resource usage from both shaders to create a unified key. * Handles push constant slot conflicts (prefers vertex shader if both use different slots). */ static D3D12RootSignatureKey fromShaderReflection( const ShaderModule::ShaderReflectionInfo* vsReflection, const ShaderModule::ShaderReflectionInfo* psReflection); /** * @brief Construct key from compute shader reflection */ static D3D12RootSignatureKey fromShaderReflection( const ShaderModule::ShaderReflectionInfo* csReflection); bool operator==(const D3D12RootSignatureKey& other) const { return hasPushConstants == other.hasPushConstants && pushConstantSlot == other.pushConstantSlot && pushConstantSize == other.pushConstantSize && usedCBVSlots == other.usedCBVSlots && usedSRVSlots == other.usedSRVSlots && usedUAVSlots == other.usedUAVSlots && usedSamplerSlots == other.usedSamplerSlots && minCBVSlot == other.minCBVSlot && maxCBVSlot == other.maxCBVSlot && minSRVSlot == other.minSRVSlot && maxSRVSlot == other.maxSRVSlot && minUAVSlot == other.minUAVSlot && maxUAVSlot == other.maxUAVSlot && minSamplerSlot == other.minSamplerSlot && maxSamplerSlot == other.maxSamplerSlot && flags == other.flags; } struct HashFunction { size_t operator()(const D3D12RootSignatureKey& key) const { size_t hash = 0; // Hash push constants hashCombine(hash, key.hasPushConstants ? 1 : 0); hashCombine(hash, static_cast(key.pushConstantSlot)); hashCombine(hash, static_cast(key.pushConstantSize)); // Hash resource slots for (UINT slot : key.usedCBVSlots) { hashCombine(hash, static_cast(slot)); } for (UINT slot : key.usedSRVSlots) { hashCombine(hash, static_cast(slot)); } for (UINT slot : key.usedUAVSlots) { hashCombine(hash, static_cast(slot)); } for (UINT slot : key.usedSamplerSlots) { hashCombine(hash, static_cast(slot)); } // Hash min/max slots hashCombine(hash, static_cast(key.minCBVSlot)); hashCombine(hash, static_cast(key.maxCBVSlot)); hashCombine(hash, static_cast(key.minSRVSlot)); hashCombine(hash, static_cast(key.maxSRVSlot)); hashCombine(hash, static_cast(key.minUAVSlot)); hashCombine(hash, static_cast(key.maxUAVSlot)); hashCombine(hash, static_cast(key.minSamplerSlot)); hashCombine(hash, static_cast(key.maxSamplerSlot)); // Hash flags hashCombine(hash, static_cast(key.flags)); return hash; } }; private: // Helper to merge two slot vectors and sort static std::vector mergeAndSort(const std::vector& a, const std::vector& b) { std::vector result = a; result.insert(result.end(), b.begin(), b.end()); std::sort(result.begin(), result.end()); // Remove duplicates result.erase(std::unique(result.begin(), result.end()), result.end()); return result; } }; // Implementation of fromShaderReflection for graphics pipeline inline D3D12RootSignatureKey D3D12RootSignatureKey::fromShaderReflection( const ShaderModule::ShaderReflectionInfo* vsReflection, const ShaderModule::ShaderReflectionInfo* psReflection) { D3D12RootSignatureKey key; // Merge push constants (prefer vertex shader if conflict) if (vsReflection && vsReflection->hasPushConstants) { key.hasPushConstants = true; key.pushConstantSlot = vsReflection->pushConstantSlot; key.pushConstantSize = vsReflection->pushConstantSize; } else if (psReflection && psReflection->hasPushConstants) { key.hasPushConstants = true; key.pushConstantSlot = psReflection->pushConstantSlot; key.pushConstantSize = psReflection->pushConstantSize; } // Merge resource slots // IMPORTANT: Exclude push constant slot from CBV descriptor table // Push constants use inline root constants (D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS), // not a CBV descriptor. Including the push constant slot in usedCBVSlots would cause // a root signature overlap error. if (vsReflection && psReflection) { key.usedCBVSlots = mergeAndSort(vsReflection->usedCBVSlots, psReflection->usedCBVSlots); key.usedSRVSlots = mergeAndSort(vsReflection->usedSRVSlots, psReflection->usedSRVSlots); key.usedUAVSlots = mergeAndSort(vsReflection->usedUAVSlots, psReflection->usedUAVSlots); key.usedSamplerSlots = mergeAndSort(vsReflection->usedSamplerSlots, psReflection->usedSamplerSlots); key.maxCBVSlot = std::max(vsReflection->maxCBVSlot, psReflection->maxCBVSlot); key.maxSRVSlot = std::max(vsReflection->maxSRVSlot, psReflection->maxSRVSlot); key.maxUAVSlot = std::max(vsReflection->maxUAVSlot, psReflection->maxUAVSlot); key.maxSamplerSlot = std::max(vsReflection->maxSamplerSlot, psReflection->maxSamplerSlot); } else if (vsReflection) { key.usedCBVSlots = vsReflection->usedCBVSlots; key.usedSRVSlots = vsReflection->usedSRVSlots; key.usedUAVSlots = vsReflection->usedUAVSlots; key.usedSamplerSlots = vsReflection->usedSamplerSlots; std::sort(key.usedCBVSlots.begin(), key.usedCBVSlots.end()); key.usedCBVSlots.erase(std::unique(key.usedCBVSlots.begin(), key.usedCBVSlots.end()), key.usedCBVSlots.end()); std::sort(key.usedSRVSlots.begin(), key.usedSRVSlots.end()); key.usedSRVSlots.erase(std::unique(key.usedSRVSlots.begin(), key.usedSRVSlots.end()), key.usedSRVSlots.end()); std::sort(key.usedUAVSlots.begin(), key.usedUAVSlots.end()); key.usedUAVSlots.erase(std::unique(key.usedUAVSlots.begin(), key.usedUAVSlots.end()), key.usedUAVSlots.end()); std::sort(key.usedSamplerSlots.begin(), key.usedSamplerSlots.end()); key.usedSamplerSlots.erase( std::unique(key.usedSamplerSlots.begin(), key.usedSamplerSlots.end()), key.usedSamplerSlots.end()); key.maxCBVSlot = vsReflection->maxCBVSlot; key.maxSRVSlot = vsReflection->maxSRVSlot; key.maxUAVSlot = vsReflection->maxUAVSlot; key.maxSamplerSlot = vsReflection->maxSamplerSlot; } else if (psReflection) { key.usedCBVSlots = psReflection->usedCBVSlots; key.usedSRVSlots = psReflection->usedSRVSlots; key.usedUAVSlots = psReflection->usedUAVSlots; key.usedSamplerSlots = psReflection->usedSamplerSlots; std::sort(key.usedCBVSlots.begin(), key.usedCBVSlots.end()); key.usedCBVSlots.erase(std::unique(key.usedCBVSlots.begin(), key.usedCBVSlots.end()), key.usedCBVSlots.end()); std::sort(key.usedSRVSlots.begin(), key.usedSRVSlots.end()); key.usedSRVSlots.erase(std::unique(key.usedSRVSlots.begin(), key.usedSRVSlots.end()), key.usedSRVSlots.end()); std::sort(key.usedUAVSlots.begin(), key.usedUAVSlots.end()); key.usedUAVSlots.erase(std::unique(key.usedUAVSlots.begin(), key.usedUAVSlots.end()), key.usedUAVSlots.end()); std::sort(key.usedSamplerSlots.begin(), key.usedSamplerSlots.end()); key.usedSamplerSlots.erase( std::unique(key.usedSamplerSlots.begin(), key.usedSamplerSlots.end()), key.usedSamplerSlots.end()); key.maxCBVSlot = psReflection->maxCBVSlot; key.maxSRVSlot = psReflection->maxSRVSlot; key.maxUAVSlot = psReflection->maxUAVSlot; key.maxSamplerSlot = psReflection->maxSamplerSlot; } // Compute min slots (if any resources are present) if (!key.usedCBVSlots.empty()) { key.minCBVSlot = key.usedCBVSlots.front(); } if (!key.usedSRVSlots.empty()) { key.minSRVSlot = key.usedSRVSlots.front(); } if (!key.usedUAVSlots.empty()) { key.minUAVSlot = key.usedUAVSlots.front(); } if (!key.usedSamplerSlots.empty()) { key.minSamplerSlot = key.usedSamplerSlots.front(); } // Remove push constant slot from CBV slots (if present) // Push constants are bound via root constants, not CBV descriptor table if (key.hasPushConstants) { key.usedCBVSlots.erase( std::remove(key.usedCBVSlots.begin(), key.usedCBVSlots.end(), key.pushConstantSlot), key.usedCBVSlots.end()); } return key; } // Implementation of fromShaderReflection for compute pipeline inline D3D12RootSignatureKey D3D12RootSignatureKey::fromShaderReflection( const ShaderModule::ShaderReflectionInfo* csReflection) { D3D12RootSignatureKey key; if (!csReflection) { return key; } // Copy push constants key.hasPushConstants = csReflection->hasPushConstants; key.pushConstantSlot = csReflection->pushConstantSlot; key.pushConstantSize = csReflection->pushConstantSize; // Copy resource slots key.usedCBVSlots = csReflection->usedCBVSlots; key.usedSRVSlots = csReflection->usedSRVSlots; key.usedUAVSlots = csReflection->usedUAVSlots; key.usedSamplerSlots = csReflection->usedSamplerSlots; // Ensure resource slot lists are sorted and unique for stable hashing / min/max tracking std::sort(key.usedCBVSlots.begin(), key.usedCBVSlots.end()); key.usedCBVSlots.erase(std::unique(key.usedCBVSlots.begin(), key.usedCBVSlots.end()), key.usedCBVSlots.end()); std::sort(key.usedSRVSlots.begin(), key.usedSRVSlots.end()); key.usedSRVSlots.erase(std::unique(key.usedSRVSlots.begin(), key.usedSRVSlots.end()), key.usedSRVSlots.end()); std::sort(key.usedUAVSlots.begin(), key.usedUAVSlots.end()); key.usedUAVSlots.erase(std::unique(key.usedUAVSlots.begin(), key.usedUAVSlots.end()), key.usedUAVSlots.end()); std::sort(key.usedSamplerSlots.begin(), key.usedSamplerSlots.end()); key.usedSamplerSlots.erase(std::unique(key.usedSamplerSlots.begin(), key.usedSamplerSlots.end()), key.usedSamplerSlots.end()); key.maxCBVSlot = csReflection->maxCBVSlot; key.maxSRVSlot = csReflection->maxSRVSlot; key.maxUAVSlot = csReflection->maxUAVSlot; key.maxSamplerSlot = csReflection->maxSamplerSlot; // Remove push constant slot from CBV slots (if present) // Push constants are bound via root constants, not CBV descriptor table if (key.hasPushConstants) { key.usedCBVSlots.erase( std::remove(key.usedCBVSlots.begin(), key.usedCBVSlots.end(), key.pushConstantSlot), key.usedCBVSlots.end()); } // Compute min slots (if any resources are present) if (!key.usedCBVSlots.empty()) { key.minCBVSlot = key.usedCBVSlots.front(); } if (!key.usedSRVSlots.empty()) { key.minSRVSlot = key.usedSRVSlots.front(); } if (!key.usedUAVSlots.empty()) { key.minUAVSlot = key.usedUAVSlots.front(); } if (!key.usedSamplerSlots.empty()) { key.minSamplerSlot = key.usedSamplerSlots.front(); } // Compute shaders don't need input assembler key.flags = D3D12_ROOT_SIGNATURE_FLAG_NONE; return key; } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/D3D12SamplerCache.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include namespace igl::d3d12 { struct SamplerCacheStats { size_t cacheHits = 0; size_t cacheMisses = 0; size_t activeSamplers = 0; float hitRate = 0.0f; }; class D3D12SamplerCache { public: D3D12SamplerCache() = default; [[nodiscard]] std::shared_ptr createSamplerState(const SamplerStateDesc& desc, Result* IGL_NULLABLE outResult) const { const size_t samplerHash = std::hash{}(desc); { std::lock_guard lock(samplerCacheMutex_); auto it = samplerCache_.find(samplerHash); if (it != samplerCache_.end()) { std::shared_ptr existingSampler = it->second.lock(); if (existingSampler) { samplerCacheHits_++; const size_t totalRequests = samplerCacheHits_ + samplerCacheMisses_; IGL_D3D12_LOG_VERBOSE( "D3D12SamplerCache::createSamplerState: Cache HIT " "(hash=0x%zx, hits=%zu, misses=%zu, hit rate=%.1f%%)\n", samplerHash, samplerCacheHits_, samplerCacheMisses_, totalRequests > 0 ? 100.0 * samplerCacheHits_ / static_cast(totalRequests) : 0.0); Result::setOk(outResult); // Upcast shared_ptr -> shared_ptr return existingSampler; } else { samplerCache_.erase(it); } } } D3D12_SAMPLER_DESC samplerDesc = {}; auto toD3D12Address = [](SamplerAddressMode m) { switch (m) { case SamplerAddressMode::Repeat: return D3D12_TEXTURE_ADDRESS_MODE_WRAP; case SamplerAddressMode::MirrorRepeat: return D3D12_TEXTURE_ADDRESS_MODE_MIRROR; case SamplerAddressMode::Clamp: return D3D12_TEXTURE_ADDRESS_MODE_CLAMP; default: return D3D12_TEXTURE_ADDRESS_MODE_WRAP; } }; auto toD3D12Compare = [](CompareFunction f) { switch (f) { case CompareFunction::Less: return D3D12_COMPARISON_FUNC_LESS; case CompareFunction::LessEqual: return D3D12_COMPARISON_FUNC_LESS_EQUAL; case CompareFunction::Greater: return D3D12_COMPARISON_FUNC_GREATER; case CompareFunction::GreaterEqual: return D3D12_COMPARISON_FUNC_GREATER_EQUAL; case CompareFunction::Equal: return D3D12_COMPARISON_FUNC_EQUAL; case CompareFunction::NotEqual: return D3D12_COMPARISON_FUNC_NOT_EQUAL; case CompareFunction::AlwaysPass: return D3D12_COMPARISON_FUNC_ALWAYS; case CompareFunction::Never: return D3D12_COMPARISON_FUNC_NEVER; default: return D3D12_COMPARISON_FUNC_NEVER; } }; const bool useComparison = desc.depthCompareEnabled; const bool minLinear = (desc.minFilter != SamplerMinMagFilter::Nearest); const bool magLinear = (desc.magFilter != SamplerMinMagFilter::Nearest); const bool mipLinear = (desc.mipFilter == SamplerMipFilter::Linear); const bool anisotropic = (desc.maxAnisotropic > 1); if (anisotropic) { samplerDesc.Filter = useComparison ? D3D12_FILTER_COMPARISON_ANISOTROPIC : D3D12_FILTER_ANISOTROPIC; samplerDesc.MaxAnisotropy = std::min(desc.maxAnisotropic, 16); } else { D3D12_FILTER filter = D3D12_FILTER_MIN_MAG_MIP_POINT; if (minLinear && magLinear && mipLinear) { filter = D3D12_FILTER_MIN_MAG_MIP_LINEAR; } else if (minLinear && magLinear && !mipLinear) { filter = D3D12_FILTER_MIN_MAG_LINEAR_MIP_POINT; } else if (minLinear && !magLinear && mipLinear) { filter = D3D12_FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR; } else if (minLinear && !magLinear && !mipLinear) { filter = D3D12_FILTER_MIN_LINEAR_MAG_MIP_POINT; } else if (!minLinear && magLinear && mipLinear) { filter = D3D12_FILTER_MIN_POINT_MAG_MIP_LINEAR; } else if (!minLinear && magLinear && !mipLinear) { filter = D3D12_FILTER_MIN_POINT_MAG_LINEAR_MIP_POINT; } else if (!minLinear && !magLinear && mipLinear) { filter = D3D12_FILTER_MIN_MAG_POINT_MIP_LINEAR; } if (useComparison) { filter = static_cast(filter | D3D12_FILTER_COMPARISON_MIN_MAG_MIP_POINT - D3D12_FILTER_MIN_MAG_MIP_POINT); } samplerDesc.Filter = filter; samplerDesc.MaxAnisotropy = 1; } samplerDesc.AddressU = toD3D12Address(desc.addressModeU); samplerDesc.AddressV = toD3D12Address(desc.addressModeV); samplerDesc.AddressW = toD3D12Address(desc.addressModeW); samplerDesc.MipLODBias = 0.0f; // For comparison samplers, use the requested depth comparison function. // For non-comparison samplers, set ComparisonFunc to NEVER so that the // debug layer does not flag spurious D3D12_MESSAGE_ID 1361 warnings when // Filter is not a comparison filter. The value is ignored in this case. samplerDesc.ComparisonFunc = useComparison ? toD3D12Compare(desc.depthCompareFunction) : D3D12_COMPARISON_FUNC_NEVER; samplerDesc.BorderColor[0] = 0.0f; samplerDesc.BorderColor[1] = 0.0f; samplerDesc.BorderColor[2] = 0.0f; samplerDesc.BorderColor[3] = 0.0f; samplerDesc.MinLOD = static_cast(desc.mipLodMin); samplerDesc.MaxLOD = static_cast(desc.mipLodMax); auto concreteSampler = std::make_shared(samplerDesc); std::shared_ptr samplerState = std::static_pointer_cast(concreteSampler); { std::lock_guard lock(samplerCacheMutex_); samplerCache_[samplerHash] = concreteSampler; samplerCacheMisses_++; IGL_D3D12_LOG_VERBOSE( "D3D12SamplerCache::createSamplerState: Cache MISS " "(hash=0x%zx, total misses=%zu)\n", samplerHash, samplerCacheMisses_); } Result::setOk(outResult); return samplerState; } [[nodiscard]] SamplerCacheStats getStats() const { std::lock_guard lock(samplerCacheMutex_); SamplerCacheStats stats; stats.cacheHits = samplerCacheHits_; stats.cacheMisses = samplerCacheMisses_; stats.activeSamplers = 0; for (const auto& [hash, weakPtr] : samplerCache_) { (void)hash; if (!weakPtr.expired()) { stats.activeSamplers++; } } const size_t totalRequests = stats.cacheHits + stats.cacheMisses; if (totalRequests > 0) { stats.hitRate = 100.0f * static_cast(stats.cacheHits) / static_cast(totalRequests); } return stats; } void clear() { std::lock_guard lock(samplerCacheMutex_); samplerCache_.clear(); samplerCacheHits_ = 0; samplerCacheMisses_ = 0; } private: mutable std::unordered_map> samplerCache_; mutable std::mutex samplerCacheMutex_; mutable size_t samplerCacheHits_ = 0; mutable size_t samplerCacheMisses_ = 0; }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/D3D12StagingDevice.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include namespace igl::d3d12 { D3D12StagingDevice::D3D12StagingDevice(ID3D12Device* device, ID3D12Fence* fence, UploadRingBuffer* uploadRingBuffer) : device_(device), fence_(fence), uploadRingBuffer_(uploadRingBuffer) { IGL_DEBUG_ASSERT(device_); IGL_DEBUG_ASSERT(fence_); IGL_D3D12_LOG_VERBOSE("D3D12StagingDevice: Initialized (ring buffer: %s)\n", uploadRingBuffer_ ? "yes" : "no"); } D3D12StagingDevice::~D3D12StagingDevice() { // Wait for all in-flight buffers to complete if (fence_) { for (const auto& entry : inFlightBuffers_) { if (fence_->GetCompletedValue() < entry.fenceValue) { FenceWaiter waiter(fence_, entry.fenceValue); Result waitResult = waiter.wait(); if (!waitResult.isOk()) { IGL_LOG_ERROR( "D3D12StagingDevice::~D3D12StagingDevice() - Fence wait failed during cleanup: %s\n", waitResult.message.c_str()); } } } } IGL_D3D12_LOG_VERBOSE("D3D12StagingDevice: Destroyed\n"); } D3D12StagingDevice::StagingBuffer D3D12StagingDevice::allocateUpload(size_t size, size_t alignment, uint64_t fenceValue) { // Try ring buffer first for small allocations if (uploadRingBuffer_ && size <= kMaxRingBufferAllocation) { auto ringAlloc = uploadRingBuffer_->allocate(size, alignment, fenceValue); if (ringAlloc.valid) { StagingBuffer result; result.buffer = ringAlloc.buffer; result.mappedPtr = ringAlloc.cpuAddress; result.size = ringAlloc.size; result.offset = ringAlloc.offset; result.valid = true; result.isFromRingBuffer = true; return result; } } // Fall back to dedicated staging buffer std::lock_guard lock(poolMutex_); // Reclaim completed buffers reclaimCompletedBuffers(); igl::d3d12::ComPtr buffer; // Try to find a reusable buffer if (!findReusableBuffer(size, false, &buffer)) { // Create new buffer Result result = createStagingBuffer(size, false, &buffer); if (!result.isOk() || !buffer.Get()) { return StagingBuffer{}; // Return invalid buffer } } // Map the buffer void* mappedPtr = nullptr; D3D12_RANGE readRange{0, 0}; // Not reading HRESULT hr = buffer->Map(0, &readRange, &mappedPtr); if (FAILED(hr) || !mappedPtr) { IGL_LOG_ERROR("D3D12StagingDevice: Failed to map upload buffer\n"); return StagingBuffer{}; } StagingBuffer staging; staging.buffer = buffer; staging.mappedPtr = mappedPtr; staging.size = size; staging.offset = 0; staging.valid = true; staging.isFromRingBuffer = false; return staging; } D3D12StagingDevice::StagingBuffer D3D12StagingDevice::allocateReadback(size_t size) { std::lock_guard lock(poolMutex_); // Reclaim completed buffers reclaimCompletedBuffers(); igl::d3d12::ComPtr buffer; // Try to find a reusable buffer if (!findReusableBuffer(size, true, &buffer)) { // Create new buffer Result result = createStagingBuffer(size, true, &buffer); if (!result.isOk() || !buffer.Get()) { return StagingBuffer{}; // Return invalid buffer } } // Readback buffers are mapped on-demand when needed StagingBuffer staging; staging.buffer = buffer; staging.mappedPtr = nullptr; staging.size = size; staging.offset = 0; staging.valid = true; staging.isFromRingBuffer = false; return staging; } void D3D12StagingDevice::free(StagingBuffer buffer, uint64_t fenceValue) { if (!buffer.valid) { return; } // Ring buffer allocations are handled automatically if (buffer.isFromRingBuffer) { return; } std::lock_guard lock(poolMutex_); // Unmap if it was mapped if (buffer.mappedPtr) { buffer.buffer->Unmap(0, nullptr); } // Add to in-flight list BufferEntry entry; entry.buffer = buffer.buffer; entry.size = buffer.size; entry.fenceValue = fenceValue; // Determine if it's a readback buffer D3D12_HEAP_PROPERTIES heapProps; buffer.buffer->GetHeapProperties(&heapProps, nullptr); entry.isReadback = (heapProps.Type == D3D12_HEAP_TYPE_READBACK); inFlightBuffers_.push_back(std::move(entry)); } void D3D12StagingDevice::reclaimCompletedBuffers() { // Note: Internal helper called by allocate* methods with poolMutex_ already held if (!fence_) { return; } const uint64_t completedValue = fence_->GetCompletedValue(); // Move completed buffers from in-flight to available auto it = inFlightBuffers_.begin(); while (it != inFlightBuffers_.end()) { if (it->fenceValue <= completedValue) { availableBuffers_.push_back({it->buffer, it->size, 0, it->isReadback}); it = inFlightBuffers_.erase(it); } else { ++it; } } } Result D3D12StagingDevice::createStagingBuffer(size_t size, bool forReadback, igl::d3d12::ComPtr* outBuffer) { D3D12_HEAP_PROPERTIES heapProps{}; heapProps.Type = forReadback ? D3D12_HEAP_TYPE_READBACK : D3D12_HEAP_TYPE_UPLOAD; D3D12_RESOURCE_DESC desc{}; desc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; desc.Width = size; desc.Height = 1; desc.DepthOrArraySize = 1; desc.MipLevels = 1; desc.Format = DXGI_FORMAT_UNKNOWN; desc.SampleDesc.Count = 1; desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; D3D12_RESOURCE_STATES initialState = forReadback ? D3D12_RESOURCE_STATE_COPY_DEST : D3D12_RESOURCE_STATE_GENERIC_READ; HRESULT hr = device_->CreateCommittedResource(&heapProps, D3D12_HEAP_FLAG_NONE, &desc, initialState, nullptr, IID_PPV_ARGS(outBuffer->GetAddressOf())); if (FAILED(hr)) { return Result{Result::Code::RuntimeError, "Failed to create staging buffer"}; } IGL_D3D12_LOG_VERBOSE("D3D12StagingDevice: Created new %s buffer (size: %zu bytes)\n", forReadback ? "readback" : "upload", size); return Result{}; } bool D3D12StagingDevice::findReusableBuffer(size_t size, bool forReadback, igl::d3d12::ComPtr* outBuffer) { // Find a buffer that matches type and is large enough for (auto it = availableBuffers_.begin(); it != availableBuffers_.end(); ++it) { if (it->isReadback == forReadback && it->size >= size) { // Prefer buffers that are close in size (within 2x) to avoid waste if (it->size <= size * 2) { *outBuffer = it->buffer; availableBuffers_.erase(it); return true; } } } return false; } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/D3D12StagingDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include namespace igl::d3d12 { class UploadRingBuffer; /** * @brief Centralized management of staging buffers for upload/readback * * Provides pooled staging buffer allocation for upload and readback operations, * eliminating per-operation staging buffer creation and improving reuse. * * Inspired by Vulkan's VulkanStagingDevice pattern. */ class D3D12StagingDevice { public: /** * @brief Staging buffer allocation */ struct StagingBuffer { igl::d3d12::ComPtr buffer; void* mappedPtr = nullptr; size_t size = 0; uint64_t offset = 0; // Offset within buffer (for ring buffer allocations) bool valid = false; bool isFromRingBuffer = false; // True if allocated from ring buffer StagingBuffer() = default; }; /** * @brief Initialize the staging device * @param device D3D12 device for resource creation * @param fence Fence for completion tracking * @param uploadRingBuffer Optional existing upload ring buffer to integrate */ D3D12StagingDevice(ID3D12Device* device, ID3D12Fence* fence, UploadRingBuffer* uploadRingBuffer = nullptr); ~D3D12StagingDevice(); /** * @brief Allocate a staging buffer for upload operations * * First attempts to use the upload ring buffer if available and size permits. * Falls back to creating a dedicated staging buffer for large allocations. * * @param size Size in bytes * @param alignment Required alignment (default 256 for constant buffers) * @param fenceValue Fence value when this allocation will be used * @return Staging buffer allocation */ [[nodiscard]] StagingBuffer allocateUpload(size_t size, size_t alignment = 256, uint64_t fenceValue = 0); /** * @brief Allocate a staging buffer for readback operations * * Readback buffers are in READBACK heap (CPU-readable after GPU write). * * @param size Size in bytes * @return Staging buffer allocation */ [[nodiscard]] StagingBuffer allocateReadback(size_t size); /** * @brief Free a staging buffer * * Buffers allocated from ring buffer are automatically recycled. * Dedicated buffers are pooled for reuse. * * @param buffer Buffer to free * @param fenceValue Fence value when GPU is done using this buffer */ void free(StagingBuffer buffer, uint64_t fenceValue); private: /** * @brief Reclaim completed staging buffers back to pool * * Internal method called during allocate* to recycle buffers. * Must be called with poolMutex_ held. */ void reclaimCompletedBuffers(); struct BufferEntry { igl::d3d12::ComPtr buffer; size_t size = 0; uint64_t fenceValue = 0; // Fence value when this buffer was last used bool isReadback = false; // True for READBACK heap, false for UPLOAD heap }; ID3D12Device* device_ = nullptr; ID3D12Fence* fence_ = nullptr; UploadRingBuffer* uploadRingBuffer_ = nullptr; // Pool of available staging buffers std::vector availableBuffers_; // Buffers in flight (waiting for GPU) std::vector inFlightBuffers_; // Mutex for thread-safe pool access std::mutex poolMutex_; // Maximum size to use ring buffer (larger allocations get dedicated buffers) static constexpr size_t kMaxRingBufferAllocation = 1024 * 1024; // 1MB // Create a new staging buffer [[nodiscard]] Result createStagingBuffer(size_t size, bool forReadback, igl::d3d12::ComPtr* outBuffer); // Find a reusable buffer from the pool [[nodiscard]] bool findReusableBuffer(size_t size, bool forReadback, igl::d3d12::ComPtr* outBuffer); }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/D3D12StateTransition.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::d3d12 { /** * @brief D3D12 Resource State Transition Helper * * Provides conservative validation for D3D12 resource state transitions. * Enforces write-to-write transitions through COMMON intermediate state. * * Conservative Policy (voluntary, not D3D12 spec requirement): * - Any state with write bits -> any state with write bits: Use COMMON intermediate * (e.g., RENDER_TARGET -> COMMON -> COPY_DEST) * - All other transitions: Direct transition allowed * * Note: D3D12 spec allows direct write-to-write transitions with a single barrier. * This helper uses COMMON intermediate as an extra-conservative policy. * * See: * https://learn.microsoft.com/windows/win32/direct3d12/using-resource-barriers-to-synchronize-gpu-access-to-resources */ class D3D12StateTransition { public: /** * @brief Check if a state contains any write bits * * Tests whether the state mask includes any write-capable bits. * Used to enforce conservative "write-to-write requires COMMON" policy. */ static bool isWriteState(D3D12_RESOURCE_STATES state) { constexpr D3D12_RESOURCE_STATES kWriteMask = D3D12_RESOURCE_STATE_RENDER_TARGET | D3D12_RESOURCE_STATE_UNORDERED_ACCESS | D3D12_RESOURCE_STATE_DEPTH_WRITE | D3D12_RESOURCE_STATE_COPY_DEST | D3D12_RESOURCE_STATE_RESOLVE_DEST | D3D12_RESOURCE_STATE_STREAM_OUT | D3D12_RESOURCE_STATE_VIDEO_DECODE_WRITE | D3D12_RESOURCE_STATE_VIDEO_PROCESS_WRITE | D3D12_RESOURCE_STATE_VIDEO_ENCODE_WRITE; return (state & kWriteMask) != 0; } /** * @brief Check if a direct state transition is allowed * * @return true if direct transition allowed, false if COMMON intermediate required */ static bool isLegalDirectTransition(D3D12_RESOURCE_STATES from, D3D12_RESOURCE_STATES to) { if (from == to) { return true; } // COMMON can transition to/from anything directly if (from == D3D12_RESOURCE_STATE_COMMON || to == D3D12_RESOURCE_STATE_COMMON) { return true; } // Write-to-write requires COMMON intermediate if (isWriteState(from) && isWriteState(to)) { return false; } return true; } }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/D3D12Telemetry.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::d3d12 { class D3D12Telemetry { public: void incrementDrawCount(size_t count) noexcept { currentDrawCount_.fetch_add(count, std::memory_order_relaxed); } void incrementShaderCompilationCount() noexcept { shaderCompilationCount_.fetch_add(1, std::memory_order_relaxed); } [[nodiscard]] size_t getDrawCount() const noexcept { return currentDrawCount_.load(std::memory_order_relaxed); } [[nodiscard]] size_t getShaderCompilationCount() const noexcept { return shaderCompilationCount_.load(std::memory_order_relaxed); } private: std::atomic currentDrawCount_{0}; std::atomic shaderCompilationCount_{0}; }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/DXCCompiler.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include // Windows headers for dynamic loading #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #include namespace igl::d3d12 { namespace { // Import ComPtr for readability template using ComPtr = igl::d3d12::ComPtr; // DxcCreateInstance function pointer type using DxcCreateInstanceProc = HRESULT(WINAPI*)(REFCLSID rclsid, REFIID riid, LPVOID* ppv); // Module handle for dxcompiler.dll static HMODULE g_dxcompilerModule = nullptr; static DxcCreateInstanceProc g_DxcCreateInstance = nullptr; // Load dxcompiler.dll dynamically bool loadDxcLibrary() { if (g_dxcompilerModule != nullptr) { return true; // Already loaded } // Try to load dxcompiler.dll from standard locations g_dxcompilerModule = LoadLibraryW(L"dxcompiler.dll"); if (!g_dxcompilerModule) { IGL_LOG_ERROR("DXCCompiler: Failed to load dxcompiler.dll (error: %lu)\n", GetLastError()); return false; } // Get the DxcCreateInstance function pointer g_DxcCreateInstance = reinterpret_cast( GetProcAddress(g_dxcompilerModule, "DxcCreateInstance")); if (!g_DxcCreateInstance) { IGL_LOG_ERROR("DXCCompiler: Failed to get DxcCreateInstance from dxcompiler.dll\n"); FreeLibrary(g_dxcompilerModule); g_dxcompilerModule = nullptr; return false; } IGL_D3D12_LOG_VERBOSE("DXCCompiler: Successfully loaded dxcompiler.dll\n"); return true; } // Wrapper for DxcCreateInstance that uses dynamic loading HRESULT DxcCreateInstanceDynamic(REFCLSID rclsid, REFIID riid, LPVOID* ppv) { if (!loadDxcLibrary()) { return E_FAIL; } return g_DxcCreateInstance(rclsid, riid, ppv); } } // namespace DXCCompiler::DXCCompiler() = default; DXCCompiler::~DXCCompiler() = default; Result DXCCompiler::initialize() { if (initialized_) { return Result(); } IGL_D3D12_LOG_VERBOSE("DXCCompiler: Initializing DXC compiler...\n"); // Create DXC utils (using dynamic loading) HRESULT hr = DxcCreateInstanceDynamic(CLSID_DxcUtils, IID_PPV_ARGS(utils_.GetAddressOf())); if (FAILED(hr)) { IGL_LOG_ERROR("DXCCompiler: Failed to create DxcUtils: 0x%08X\n", static_cast(hr)); return Result(Result::Code::RuntimeError, "Failed to create DxcUtils"); } // Create DXC compiler (using dynamic loading) hr = DxcCreateInstanceDynamic(CLSID_DxcCompiler, IID_PPV_ARGS(compiler_.GetAddressOf())); if (FAILED(hr)) { IGL_LOG_ERROR("DXCCompiler: Failed to create DxcCompiler: 0x%08X\n", static_cast(hr)); return Result(Result::Code::RuntimeError, "Failed to create DxcCompiler"); } // Create default include handler hr = utils_->CreateDefaultIncludeHandler(includeHandler_.GetAddressOf()); if (FAILED(hr)) { IGL_LOG_ERROR("DXCCompiler: Failed to create include handler: 0x%08X\n", static_cast(hr)); return Result(Result::Code::RuntimeError, "Failed to create include handler"); } // Create DXC validator for DXIL signing (optional but highly recommended) hr = DxcCreateInstanceDynamic(CLSID_DxcValidator, IID_PPV_ARGS(validator_.GetAddressOf())); if (FAILED(hr)) { IGL_D3D12_LOG_VERBOSE("DXCCompiler: Validator not available (0x%08X) - DXIL will be unsigned\n", static_cast(hr)); // Not a fatal error - continue without validator } else { IGL_D3D12_LOG_VERBOSE("DXCCompiler: Validator initialized - DXIL signing available\n"); } initialized_ = true; IGL_D3D12_LOG_VERBOSE("DXCCompiler: Initialization successful (Shader Model 6.0+ enabled)\n"); return Result(); } Result DXCCompiler::compile(const char* source, size_t sourceLength, const char* entryPoint, const char* target, const char* debugName, uint32_t flags, std::vector& outBytecode, std::string& outErrors) { if (!initialized_) { return Result(Result::Code::InvalidOperation, "DXC compiler not initialized"); } IGL_D3D12_LOG_VERBOSE("DXCCompiler: Compiling shader '%s' with target '%s' (%zu bytes source)\n", debugName ? debugName : "unnamed", target, sourceLength); // Create source blob igl::d3d12::ComPtr sourceBlob; HRESULT hr = utils_->CreateBlob( source, static_cast(sourceLength), CP_UTF8, sourceBlob.GetAddressOf()); if (FAILED(hr)) { IGL_LOG_ERROR("DXCCompiler: Failed to create source blob: 0x%08X\n", static_cast(hr)); return Result(Result::Code::RuntimeError, "Failed to create source blob"); } // Convert strings to wide char for DXC API std::wstring_convert> converter; std::wstring wEntryPoint = converter.from_bytes(entryPoint); std::wstring wTarget = converter.from_bytes(target); // Build compilation arguments std::vector arguments; // Entry point arguments.push_back(L"-E"); arguments.push_back(wEntryPoint.c_str()); // Target profile arguments.push_back(L"-T"); arguments.push_back(wTarget.c_str()); // Debug info and optimization if (flags & D3DCOMPILE_DEBUG) { IGL_D3D12_LOG_VERBOSE(" DXC: Debug mode enabled\n"); arguments.push_back(L"-Zi"); // Debug info arguments.push_back(L"-Qembed_debug"); // Embed debug info in shader arguments.push_back(L"-Od"); // Disable optimizations } else { IGL_D3D12_LOG_VERBOSE(" DXC: Release mode - maximum optimization\n"); arguments.push_back(L"-O3"); // Maximum optimization } // Skip optimization flag if (flags & D3DCOMPILE_SKIP_OPTIMIZATION) { arguments.push_back(L"-Od"); } // Warnings as errors if (flags & D3DCOMPILE_WARNINGS_ARE_ERRORS) { IGL_D3D12_LOG_VERBOSE(" DXC: Treating warnings as errors\n"); arguments.push_back(L"-WX"); } // Compile DxcBuffer sourceBuffer = {}; sourceBuffer.Ptr = sourceBlob->GetBufferPointer(); sourceBuffer.Size = sourceBlob->GetBufferSize(); sourceBuffer.Encoding = CP_UTF8; igl::d3d12::ComPtr result; hr = compiler_->Compile(&sourceBuffer, arguments.data(), static_cast(arguments.size()), includeHandler_.Get(), IID_PPV_ARGS(result.GetAddressOf())); if (FAILED(hr)) { IGL_LOG_ERROR("DXCCompiler: Compilation invocation failed: 0x%08X\n", static_cast(hr)); return Result(Result::Code::RuntimeError, "DXC compilation invocation failed"); } // Check compilation status HRESULT compileStatus; result->GetStatus(&compileStatus); // Get errors/warnings igl::d3d12::ComPtr errors; igl::d3d12::ComPtr errorsName; result->GetOutput(DXC_OUT_ERRORS, IID_PPV_ARGS(errors.GetAddressOf()), errorsName.GetAddressOf()); if (errors.Get() && errors->GetStringLength() > 0) { outErrors = std::string(errors->GetStringPointer(), errors->GetStringLength()); } if (FAILED(compileStatus)) { IGL_LOG_ERROR("DXCCompiler: Shader compilation failed\n"); if (!outErrors.empty()) { IGL_LOG_ERROR("%s\n", outErrors.c_str()); } return Result(Result::Code::RuntimeError, "Shader compilation failed: " + outErrors); } // Log warnings if any if (!outErrors.empty()) { IGL_D3D12_LOG_VERBOSE("DXCCompiler: Compilation warnings:\n%s\n", outErrors.c_str()); } // Get compiled bytecode (DXIL) igl::d3d12::ComPtr bytecode; igl::d3d12::ComPtr bytecodeName; result->GetOutput( DXC_OUT_OBJECT, IID_PPV_ARGS(bytecode.GetAddressOf()), bytecodeName.GetAddressOf()); if (!bytecode.Get()) { IGL_LOG_ERROR("DXCCompiler: No bytecode produced\n"); return Result(Result::Code::RuntimeError, "No bytecode produced"); } // Validate and sign DXIL if validator is available if (validator_.Get()) { IGL_D3D12_LOG_VERBOSE("DXCCompiler: Attempting DXIL validation and signing...\n"); igl::d3d12::ComPtr validationResult; hr = validator_->Validate( bytecode.Get(), DxcValidatorFlags_InPlaceEdit, validationResult.GetAddressOf()); if (SUCCEEDED(hr)) { HRESULT validationStatus; validationResult->GetStatus(&validationStatus); IGL_D3D12_LOG_VERBOSE("DXCCompiler: Validation status: 0x%08X\n", static_cast(validationStatus)); if (SUCCEEDED(validationStatus)) { // Get the validated (signed) bytecode - this replaces the original igl::d3d12::ComPtr validatedBlob; validationResult->GetResult(validatedBlob.GetAddressOf()); if (validatedBlob.Get()) { IGL_D3D12_LOG_VERBOSE("DXCCompiler: Got validated blob (%zu bytes)\n", validatedBlob->GetBufferSize()); // Replace bytecode with validated version using move semantics bytecode.Reset(); bytecode = std::move(validatedBlob); IGL_D3D12_LOG_VERBOSE("DXCCompiler: DXIL validated and signed successfully\n"); } else { IGL_D3D12_LOG_VERBOSE("DXCCompiler: Validation succeeded but no blob returned\n"); } } else { // Validation failed - get error messages igl::d3d12::ComPtr validationErrors; validationResult->GetErrorBuffer(validationErrors.GetAddressOf()); if (validationErrors.Get() && validationErrors->GetBufferSize() > 0) { std::string errMsg(static_cast(validationErrors->GetBufferPointer()), validationErrors->GetBufferSize()); IGL_D3D12_LOG_VERBOSE("DXCCompiler: DXIL validation failed:\n%s\n", errMsg.c_str()); } IGL_D3D12_LOG_VERBOSE( "DXCCompiler: Using unsigned DXIL (may require experimental features)\n"); } } else { IGL_D3D12_LOG_VERBOSE("DXCCompiler: DXIL validation skipped (validator error 0x%08X)\n", static_cast(hr)); } } else { IGL_D3D12_LOG_VERBOSE("DXCCompiler: Using unsigned DXIL (validator not available)\n"); } // Copy bytecode to output (either signed or unsigned) const uint8_t* data = static_cast(bytecode->GetBufferPointer()); size_t size = bytecode->GetBufferSize(); outBytecode.assign(data, data + size); IGL_D3D12_LOG_VERBOSE("DXCCompiler: Compilation successful (%zu bytes DXIL bytecode)\n", size); return Result(); } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/DXCCompiler.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include namespace igl::d3d12 { /** * @brief DXC (DirectX Shader Compiler) wrapper for modern HLSL compilation * * Replaces legacy FXC (D3DCompile) with DXC for: * - Shader Model 6.0+ support * - 10-20% better shader performance * - Modern optimization passes * - Future features (raytracing, mesh shaders, wave intrinsics) */ class DXCCompiler { public: DXCCompiler(); ~DXCCompiler(); /** * @brief Initialize DXC compiler (call once) * @return Result indicating success or failure */ Result initialize(); /** * @brief Check if DXC is available and initialized */ bool isInitialized() const { return initialized_; } /** * @brief Compile HLSL source to DXIL bytecode (Shader Model 6.0+) * * @param source HLSL source code * @param sourceLength Length of source code * @param entryPoint Entry point function name (e.g., "main") * @param target Shader target profile (e.g., "vs_6_0", "ps_6_0", "cs_6_0") * @param debugName Debug name for error messages * @param flags Compilation flags (D3DCOMPILE_* constants) * @param outBytecode Output DXIL bytecode * @param outErrors Output compilation errors/warnings * @return Result indicating success or failure */ Result compile(const char* source, size_t sourceLength, const char* entryPoint, const char* target, const char* debugName, uint32_t flags, std::vector& outBytecode, std::string& outErrors); private: igl::d3d12::ComPtr utils_; igl::d3d12::ComPtr compiler_; igl::d3d12::ComPtr includeHandler_; igl::d3d12::ComPtr validator_; bool initialized_ = false; }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/DepthStencilState.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::d3d12 { class DepthStencilState final : public IDepthStencilState { public: explicit DepthStencilState(const DepthStencilStateDesc& desc) : desc_(desc) {} ~DepthStencilState() override = default; const DepthStencilStateDesc& getDesc() const { return desc_; } private: DepthStencilStateDesc desc_; }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/DescriptorHeapManager.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace igl::d3d12 { Result DescriptorHeapManager::initialize(ID3D12Device* device, const Sizes& sizes) { if (!device) { return Result(Result::Code::ArgumentInvalid, "Null device for DescriptorHeapManager"); } // A-006: Copy requested sizes, then validate/clamp against device limits sizes_ = sizes; validateAndClampSizes(device); // Create shader-visible CBV/SRV/UAV heap { D3D12_DESCRIPTOR_HEAP_DESC desc = {}; desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV; desc.NumDescriptors = sizes_.cbvSrvUav; desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE; if (FAILED(device->CreateDescriptorHeap(&desc, IID_PPV_ARGS(cbvSrvUavHeap_.GetAddressOf())))) { // A-006: Enhanced error message with size context IGL_LOG_ERROR( "DescriptorHeapManager: Failed to create CBV/SRV/UAV heap " "(size=%u descriptors)\n", sizes_.cbvSrvUav); return Result(Result::Code::RuntimeError, "Failed to create CBV/SRV/UAV heap"); } cbvSrvUavDescriptorSize_ = device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); // Populate free list freeCbvSrvUav_.reserve(sizes_.cbvSrvUav); for (uint32_t i = 0; i < sizes_.cbvSrvUav; ++i) { freeCbvSrvUav_.push_back(i); } } // Create shader-visible sampler heap { D3D12_DESCRIPTOR_HEAP_DESC desc = {}; desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER; desc.NumDescriptors = sizes_.samplers; desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE; if (FAILED(device->CreateDescriptorHeap(&desc, IID_PPV_ARGS(samplerHeap_.GetAddressOf())))) { // A-006: Enhanced error message with size context IGL_LOG_ERROR( "DescriptorHeapManager: Failed to create sampler heap " "(size=%u descriptors, limit=2048)\n", sizes_.samplers); return Result(Result::Code::RuntimeError, "Failed to create sampler heap"); } samplerDescriptorSize_ = device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER); // Populate free list freeSamplers_.reserve(sizes_.samplers); for (uint32_t i = 0; i < sizes_.samplers; ++i) { freeSamplers_.push_back(i); } } // Create CPU-visible RTV heap { D3D12_DESCRIPTOR_HEAP_DESC desc = {}; desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV; desc.NumDescriptors = sizes_.rtvs; desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE; if (FAILED(device->CreateDescriptorHeap(&desc, IID_PPV_ARGS(rtvHeap_.GetAddressOf())))) { // A-006: Enhanced error message with size context IGL_LOG_ERROR( "DescriptorHeapManager: Failed to create RTV heap " "(size=%u descriptors)\n", sizes_.rtvs); return Result(Result::Code::RuntimeError, "Failed to create RTV heap"); } rtvDescriptorSize_ = device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV); // Populate free list freeRtvs_.reserve(sizes_.rtvs); for (uint32_t i = 0; i < sizes_.rtvs; ++i) { freeRtvs_.push_back(i); } } // Create CPU-visible DSV heap { D3D12_DESCRIPTOR_HEAP_DESC desc = {}; desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_DSV; desc.NumDescriptors = sizes_.dsvs; desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE; if (FAILED(device->CreateDescriptorHeap(&desc, IID_PPV_ARGS(dsvHeap_.GetAddressOf())))) { // A-006: Enhanced error message with size context IGL_LOG_ERROR( "DescriptorHeapManager: Failed to create DSV heap " "(size=%u descriptors)\n", sizes_.dsvs); return Result(Result::Code::RuntimeError, "Failed to create DSV heap"); } dsvDescriptorSize_ = device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_DSV); // Populate free list freeDsvs_.reserve(sizes_.dsvs); for (uint32_t i = 0; i < sizes_.dsvs; ++i) { freeDsvs_.push_back(i); } } return Result(); } uint32_t DescriptorHeapManager::allocateRTV() { std::lock_guard lock(mutex_); if (freeRtvs_.empty()) { IGL_LOG_ERROR( "DescriptorHeapManager: RTV heap exhausted! " "Requested allocation failed (capacity: %u descriptors)\n", sizes_.rtvs); return UINT32_MAX; } const uint32_t idx = freeRtvs_.back(); freeRtvs_.pop_back(); return idx; } uint32_t DescriptorHeapManager::allocateDSV() { std::lock_guard lock(mutex_); if (freeDsvs_.empty()) { IGL_LOG_ERROR( "DescriptorHeapManager: DSV heap exhausted! " "Requested allocation failed (capacity: %u descriptors)\n", sizes_.dsvs); return UINT32_MAX; } const uint32_t idx = freeDsvs_.back(); freeDsvs_.pop_back(); return idx; } void DescriptorHeapManager::freeRTV(uint32_t index) { std::lock_guard lock(mutex_); // Validate bounds if (index == UINT32_MAX || index >= sizes_.rtvs) { return; } // CRITICAL: Detect double-free bugs by checking if index is already in free list // Note: O(N) scan - acceptable for RTV heap (typically ~256 descriptors) if (std::find(freeRtvs_.begin(), freeRtvs_.end(), index) != freeRtvs_.end()) { IGL_LOG_ERROR("DescriptorHeapManager: DOUBLE-FREE DETECTED - RTV index %u already freed!\n", index); IGL_DEBUG_ASSERT(false, "Double-free of RTV descriptor - caller bug detected"); return; // Prevent corruption even in release builds } // Add to free list freeRtvs_.push_back(index); } void DescriptorHeapManager::freeDSV(uint32_t index) { std::lock_guard lock(mutex_); // Validate bounds if (index == UINT32_MAX || index >= sizes_.dsvs) { return; } // CRITICAL: Detect double-free bugs by checking if index is already in free list // Note: O(N) scan - acceptable for DSV heap (typically ~128 descriptors) if (std::find(freeDsvs_.begin(), freeDsvs_.end(), index) != freeDsvs_.end()) { IGL_LOG_ERROR("DescriptorHeapManager: DOUBLE-FREE DETECTED - DSV index %u already freed!\n", index); IGL_DEBUG_ASSERT(false, "Double-free of DSV descriptor - caller bug detected"); return; // Prevent corruption even in release builds } // Add to free list freeDsvs_.push_back(index); } uint32_t DescriptorHeapManager::allocateCbvSrvUav() { std::lock_guard lock(mutex_); if (freeCbvSrvUav_.empty()) { IGL_LOG_ERROR( "DescriptorHeapManager: CBV/SRV/UAV heap exhausted! " "Requested allocation failed (capacity: %u descriptors)\n", sizes_.cbvSrvUav); return UINT32_MAX; } const uint32_t idx = freeCbvSrvUav_.back(); freeCbvSrvUav_.pop_back(); return idx; } uint32_t DescriptorHeapManager::allocateSampler() { std::lock_guard lock(mutex_); if (freeSamplers_.empty()) { IGL_LOG_ERROR( "DescriptorHeapManager: Sampler heap exhausted! " "Requested allocation failed (capacity: %u descriptors)\n", sizes_.samplers); return UINT32_MAX; } const uint32_t idx = freeSamplers_.back(); freeSamplers_.pop_back(); return idx; } void DescriptorHeapManager::freeCbvSrvUav(uint32_t index) { std::lock_guard lock(mutex_); // Validate bounds if (index == UINT32_MAX || index >= sizes_.cbvSrvUav) { return; } #if IGL_DEBUG // CRITICAL: Detect double-free bugs by checking if index is already in free list // Note: O(N) scan - can be expensive for large heaps (~4096 descriptors). // Only enabled in debug builds to avoid overhead in production. if (std::find(freeCbvSrvUav_.begin(), freeCbvSrvUav_.end(), index) != freeCbvSrvUav_.end()) { IGL_LOG_ERROR( "DescriptorHeapManager: DOUBLE-FREE DETECTED - CBV/SRV/UAV index %u already freed!\n", index); IGL_DEBUG_ASSERT(false, "Double-free of CBV/SRV/UAV descriptor - caller bug detected"); return; // Prevent corruption even in debug builds } #endif // Add to free list freeCbvSrvUav_.push_back(index); } void DescriptorHeapManager::freeSampler(uint32_t index) { std::lock_guard lock(mutex_); // Validate bounds if (index == UINT32_MAX || index >= sizes_.samplers) { return; } #if IGL_DEBUG // CRITICAL: Detect double-free bugs by checking if index is already in free list // Note: O(N) scan - can be expensive for large heaps (~2048 descriptors). // Only enabled in debug builds to avoid overhead in production. if (std::find(freeSamplers_.begin(), freeSamplers_.end(), index) != freeSamplers_.end()) { IGL_LOG_ERROR("DescriptorHeapManager: DOUBLE-FREE DETECTED - Sampler index %u already freed!\n", index); IGL_DEBUG_ASSERT(false, "Double-free of Sampler descriptor - caller bug detected"); return; // Prevent corruption even in debug builds } #endif // Add to free list freeSamplers_.push_back(index); } // Explicit error checking with bool return, building on the basic index validation helpers. bool DescriptorHeapManager::getRTVHandle(uint32_t index, D3D12_CPU_DESCRIPTOR_HANDLE* outHandle) const { if (!outHandle) { IGL_LOG_ERROR("DescriptorHeapManager::getRTVHandle: outHandle is null\n"); return false; } // Initialize to zero in case of error *outHandle = {}; if (!rtvHeap_.Get()) { IGL_LOG_ERROR("DescriptorHeapManager::getRTVHandle: RTV heap is null\n"); IGL_DEBUG_ASSERT(false, "RTV heap is null"); return false; } if (index == UINT32_MAX) { IGL_LOG_ERROR( "DescriptorHeapManager::getRTVHandle: Invalid index UINT32_MAX (allocation failure " "sentinel)\n"); IGL_DEBUG_ASSERT(false, "Attempted to get RTV handle with invalid index UINT32_MAX"); return false; } if (index >= sizes_.rtvs) { IGL_LOG_ERROR( "DescriptorHeapManager::getRTVHandle: Index %u exceeds heap size %u\n", index, sizes_.rtvs); IGL_DEBUG_ASSERT(false, "RTV descriptor index out of bounds"); return false; } // Check if descriptor has been freed (use-after-free detection) { std::lock_guard lock(mutex_); if (std::find(freeRtvs_.begin(), freeRtvs_.end(), index) != freeRtvs_.end()) { IGL_LOG_ERROR( "DescriptorHeapManager::getRTVHandle: Descriptor index %u has been freed " "(use-after-free)\n", index); IGL_DEBUG_ASSERT(false, "Use-after-free: Accessing freed RTV descriptor"); return false; } } *outHandle = rtvHeap_->GetCPUDescriptorHandleForHeapStart(); outHandle->ptr += index * rtvDescriptorSize_; // Validate final handle is non-null IGL_DEBUG_ASSERT(outHandle->ptr != 0, "getRTVHandle returned null CPU descriptor handle"); return true; } // Explicit error checking with bool return, building on descriptor validation helpers. bool DescriptorHeapManager::getDSVHandle(uint32_t index, D3D12_CPU_DESCRIPTOR_HANDLE* outHandle) const { if (!outHandle) { IGL_LOG_ERROR("DescriptorHeapManager::getDSVHandle: outHandle is null\n"); return false; } // Initialize to zero in case of error *outHandle = {}; if (!dsvHeap_.Get()) { IGL_LOG_ERROR("DescriptorHeapManager::getDSVHandle: DSV heap is null\n"); IGL_DEBUG_ASSERT(false, "DSV heap is null"); return false; } if (index == UINT32_MAX) { IGL_LOG_ERROR( "DescriptorHeapManager::getDSVHandle: Invalid index UINT32_MAX (allocation failure " "sentinel)\n"); IGL_DEBUG_ASSERT(false, "Attempted to get DSV handle with invalid index UINT32_MAX"); return false; } if (index >= sizes_.dsvs) { IGL_LOG_ERROR( "DescriptorHeapManager::getDSVHandle: Index %u exceeds heap size %u\n", index, sizes_.dsvs); IGL_DEBUG_ASSERT(false, "DSV descriptor index out of bounds"); return false; } // Check if descriptor has been freed (use-after-free detection) { std::lock_guard lock(mutex_); if (std::find(freeDsvs_.begin(), freeDsvs_.end(), index) != freeDsvs_.end()) { IGL_LOG_ERROR( "DescriptorHeapManager::getDSVHandle: Descriptor index %u has been freed " "(use-after-free)\n", index); IGL_DEBUG_ASSERT(false, "Use-after-free: Accessing freed DSV descriptor"); return false; } } *outHandle = dsvHeap_->GetCPUDescriptorHandleForHeapStart(); outHandle->ptr += index * dsvDescriptorSize_; // Validate final handle is non-null IGL_DEBUG_ASSERT(outHandle->ptr != 0, "getDSVHandle returned null CPU descriptor handle"); return true; } // Bool-returning CBV/SRV/UAV handle getters bool DescriptorHeapManager::getCbvSrvUavCpuHandle(uint32_t index, D3D12_CPU_DESCRIPTOR_HANDLE* outHandle) const { if (!outHandle) { IGL_LOG_ERROR("DescriptorHeapManager::getCbvSrvUavCpuHandle: outHandle is null\n"); return false; } *outHandle = {}; if (!cbvSrvUavHeap_.Get()) { IGL_LOG_ERROR("DescriptorHeapManager::getCbvSrvUavCpuHandle: CBV/SRV/UAV heap is null\n"); IGL_DEBUG_ASSERT(false, "CBV/SRV/UAV heap is null"); return false; } if (index == UINT32_MAX) { IGL_LOG_ERROR( "DescriptorHeapManager::getCbvSrvUavCpuHandle: Invalid index UINT32_MAX (allocation " "failure sentinel)\n"); IGL_DEBUG_ASSERT(false, "Attempted to get CBV/SRV/UAV handle with invalid index UINT32_MAX"); return false; } if (index >= sizes_.cbvSrvUav) { IGL_LOG_ERROR("DescriptorHeapManager::getCbvSrvUavCpuHandle: Index %u exceeds heap size %u\n", index, sizes_.cbvSrvUav); IGL_DEBUG_ASSERT(false, "CBV/SRV/UAV descriptor index out of bounds"); return false; } #if IGL_DEBUG { std::lock_guard lock(mutex_); if (std::find(freeCbvSrvUav_.begin(), freeCbvSrvUav_.end(), index) != freeCbvSrvUav_.end()) { IGL_LOG_ERROR( "DescriptorHeapManager::getCbvSrvUavCpuHandle: Descriptor index %u has been freed " "(use-after-free)\n", index); IGL_DEBUG_ASSERT(false, "Use-after-free: Accessing freed CBV/SRV/UAV descriptor"); return false; } } #endif *outHandle = cbvSrvUavHeap_->GetCPUDescriptorHandleForHeapStart(); outHandle->ptr += index * cbvSrvUavDescriptorSize_; IGL_DEBUG_ASSERT(outHandle->ptr != 0, "getCbvSrvUavCpuHandle returned null CPU descriptor handle"); return true; } bool DescriptorHeapManager::getCbvSrvUavGpuHandle(uint32_t index, D3D12_GPU_DESCRIPTOR_HANDLE* outHandle) const { if (!outHandle) { IGL_LOG_ERROR("DescriptorHeapManager::getCbvSrvUavGpuHandle: outHandle is null\n"); return false; } *outHandle = {}; if (!cbvSrvUavHeap_.Get()) { IGL_LOG_ERROR("DescriptorHeapManager::getCbvSrvUavGpuHandle: CBV/SRV/UAV heap is null\n"); IGL_DEBUG_ASSERT(false, "CBV/SRV/UAV heap is null"); return false; } if (index == UINT32_MAX) { IGL_LOG_ERROR( "DescriptorHeapManager::getCbvSrvUavGpuHandle: Invalid index UINT32_MAX (allocation " "failure sentinel)\n"); IGL_DEBUG_ASSERT(false, "Attempted to get CBV/SRV/UAV GPU handle with invalid index UINT32_MAX"); return false; } if (index >= sizes_.cbvSrvUav) { IGL_LOG_ERROR("DescriptorHeapManager::getCbvSrvUavGpuHandle: Index %u exceeds heap size %u\n", index, sizes_.cbvSrvUav); IGL_DEBUG_ASSERT(false, "CBV/SRV/UAV descriptor index out of bounds"); return false; } #if IGL_DEBUG { std::lock_guard lock(mutex_); if (std::find(freeCbvSrvUav_.begin(), freeCbvSrvUav_.end(), index) != freeCbvSrvUav_.end()) { IGL_LOG_ERROR( "DescriptorHeapManager::getCbvSrvUavGpuHandle: Descriptor index %u has been freed " "(use-after-free)\n", index); IGL_DEBUG_ASSERT(false, "Use-after-free: Accessing freed CBV/SRV/UAV descriptor"); return false; } } #endif *outHandle = cbvSrvUavHeap_->GetGPUDescriptorHandleForHeapStart(); outHandle->ptr += index * cbvSrvUavDescriptorSize_; IGL_DEBUG_ASSERT(outHandle->ptr != 0, "getCbvSrvUavGpuHandle returned null GPU descriptor handle"); return true; } bool DescriptorHeapManager::getSamplerCpuHandle(uint32_t index, D3D12_CPU_DESCRIPTOR_HANDLE* outHandle) const { if (!outHandle) { IGL_LOG_ERROR("DescriptorHeapManager::getSamplerCpuHandle: outHandle is null\n"); return false; } *outHandle = {}; if (!samplerHeap_.Get()) { IGL_LOG_ERROR("DescriptorHeapManager::getSamplerCpuHandle: Sampler heap is null\n"); IGL_DEBUG_ASSERT(false, "Sampler heap is null"); return false; } if (index == UINT32_MAX) { IGL_LOG_ERROR( "DescriptorHeapManager::getSamplerCpuHandle: Invalid index UINT32_MAX (allocation failure " "sentinel)\n"); IGL_DEBUG_ASSERT(false, "Attempted to get Sampler handle with invalid index UINT32_MAX"); return false; } if (index >= sizes_.samplers) { IGL_LOG_ERROR("DescriptorHeapManager::getSamplerCpuHandle: Index %u exceeds heap size %u\n", index, sizes_.samplers); IGL_DEBUG_ASSERT(false, "Sampler descriptor index out of bounds"); return false; } #if IGL_DEBUG { std::lock_guard lock(mutex_); if (std::find(freeSamplers_.begin(), freeSamplers_.end(), index) != freeSamplers_.end()) { IGL_LOG_ERROR( "DescriptorHeapManager::getSamplerCpuHandle: Descriptor index %u has been freed " "(use-after-free)\n", index); IGL_DEBUG_ASSERT(false, "Use-after-free: Accessing freed Sampler descriptor"); return false; } } #endif *outHandle = samplerHeap_->GetCPUDescriptorHandleForHeapStart(); outHandle->ptr += index * samplerDescriptorSize_; IGL_DEBUG_ASSERT(outHandle->ptr != 0, "getSamplerCpuHandle returned null CPU descriptor handle"); return true; } bool DescriptorHeapManager::getSamplerGpuHandle(uint32_t index, D3D12_GPU_DESCRIPTOR_HANDLE* outHandle) const { if (!outHandle) { IGL_LOG_ERROR("DescriptorHeapManager::getSamplerGpuHandle: outHandle is null\n"); return false; } *outHandle = {}; if (!samplerHeap_.Get()) { IGL_LOG_ERROR("DescriptorHeapManager::getSamplerGpuHandle: Sampler heap is null\n"); IGL_DEBUG_ASSERT(false, "Sampler heap is null"); return false; } if (index == UINT32_MAX) { IGL_LOG_ERROR( "DescriptorHeapManager::getSamplerGpuHandle: Invalid index UINT32_MAX (allocation failure " "sentinel)\n"); IGL_DEBUG_ASSERT(false, "Attempted to get Sampler GPU handle with invalid index UINT32_MAX"); return false; } if (index >= sizes_.samplers) { IGL_LOG_ERROR("DescriptorHeapManager::getSamplerGpuHandle: Index %u exceeds heap size %u\n", index, sizes_.samplers); IGL_DEBUG_ASSERT(false, "Sampler descriptor index out of bounds"); return false; } #if IGL_DEBUG { std::lock_guard lock(mutex_); if (std::find(freeSamplers_.begin(), freeSamplers_.end(), index) != freeSamplers_.end()) { IGL_LOG_ERROR( "DescriptorHeapManager::getSamplerGpuHandle: Descriptor index %u has been freed " "(use-after-free)\n", index); IGL_DEBUG_ASSERT(false, "Use-after-free: Accessing freed Sampler descriptor"); return false; } } #endif *outHandle = samplerHeap_->GetGPUDescriptorHandleForHeapStart(); outHandle->ptr += index * samplerDescriptorSize_; IGL_DEBUG_ASSERT(outHandle->ptr != 0, "getSamplerGpuHandle returned null GPU descriptor handle"); return true; } // Descriptor handle validation helpers. bool DescriptorHeapManager::isValidRTVIndex(uint32_t index) const { if (index == UINT32_MAX) { return false; // Sentinel value for allocation failure } if (index >= sizes_.rtvs) { return false; // Out of bounds } // Check if descriptor is currently allocated (not in free list) // This helps detect use-after-free bugs std::lock_guard lock(mutex_); for (const auto& freeIdx : freeRtvs_) { if (freeIdx == index) { return false; // Index is in free list, so it's not allocated } } return true; // Not in free list, so it's allocated } bool DescriptorHeapManager::isValidDSVIndex(uint32_t index) const { if (index == UINT32_MAX) { return false; // Sentinel value for allocation failure } if (index >= sizes_.dsvs) { return false; // Out of bounds } // Check if descriptor is currently allocated std::lock_guard lock(mutex_); for (const auto& freeIdx : freeDsvs_) { if (freeIdx == index) { return false; // Index is in free list, so it's not allocated } } return true; // Not in free list, so it's allocated } bool DescriptorHeapManager::isValidCbvSrvUavIndex(uint32_t index) const { if (index == UINT32_MAX) { return false; // Sentinel value for allocation failure } if (index >= sizes_.cbvSrvUav) { return false; // Out of bounds } // Check if descriptor is currently allocated std::lock_guard lock(mutex_); for (const auto& freeIdx : freeCbvSrvUav_) { if (freeIdx == index) { return false; // Index is in free list, so it's not allocated } } return true; // Not in free list, so it's allocated } bool DescriptorHeapManager::isValidSamplerIndex(uint32_t index) const { if (index == UINT32_MAX) { return false; // Sentinel value for allocation failure } if (index >= sizes_.samplers) { return false; // Out of bounds } // Check if descriptor is currently allocated std::lock_guard lock(mutex_); for (const auto& freeIdx : freeSamplers_) { if (freeIdx == index) { return false; // Index is in free list, so it's not allocated } } return true; // Not in free list, so it's allocated } void DescriptorHeapManager::logUsageStats() const { std::lock_guard lock(mutex_); IGL_D3D12_LOG_VERBOSE("=== Descriptor Heap Usage Statistics ===\n"); // CBV/SRV/UAV heap const uint32_t cbvSrvUavUsed = sizes_.cbvSrvUav - static_cast(freeCbvSrvUav_.size()); const float cbvSrvUavPercent = (cbvSrvUavUsed * 100.0f) / sizes_.cbvSrvUav; IGL_D3D12_LOG_VERBOSE( " CBV/SRV/UAV: %u / %u (%.1f%% used)\n", cbvSrvUavUsed, sizes_.cbvSrvUav, cbvSrvUavPercent); // Sampler heap const uint32_t samplersUsed = sizes_.samplers - static_cast(freeSamplers_.size()); const float samplersPercent = (samplersUsed * 100.0f) / sizes_.samplers; IGL_D3D12_LOG_VERBOSE( " Samplers: %u / %u (%.1f%% used)\n", samplersUsed, sizes_.samplers, samplersPercent); // RTV heap const uint32_t rtvsUsed = sizes_.rtvs - static_cast(freeRtvs_.size()); const float rtvsPercent = (rtvsUsed * 100.0f) / sizes_.rtvs; IGL_D3D12_LOG_VERBOSE( " RTVs: %u / %u (%.1f%% used)\n", rtvsUsed, sizes_.rtvs, rtvsPercent); // DSV heap const uint32_t dsvsUsed = sizes_.dsvs - static_cast(freeDsvs_.size()); const float dsvsPercent = (dsvsUsed * 100.0f) / sizes_.dsvs; IGL_D3D12_LOG_VERBOSE( " DSVs: %u / %u (%.1f%% used)\n", dsvsUsed, sizes_.dsvs, dsvsPercent); IGL_D3D12_LOG_VERBOSE("========================================\n"); } // Explicit cleanup to release descriptor heaps before device destruction void DescriptorHeapManager::cleanup() { std::lock_guard lock(mutex_); // Release all descriptor heaps explicitly to prevent leaks cbvSrvUavHeap_.Reset(); samplerHeap_.Reset(); rtvHeap_.Reset(); dsvHeap_.Reset(); // Clear free lists freeCbvSrvUav_.clear(); freeSamplers_.clear(); freeRtvs_.clear(); freeDsvs_.clear(); } void DescriptorHeapManager::validateAndClampSizes(ID3D12Device* device) { // A-006: Validate descriptor heap sizes against D3D12 device limits IGL_D3D12_LOG_VERBOSE("=== Descriptor Heap Size Validation ===\n"); // Query device options for resource binding tier (affects limits) D3D12_FEATURE_DATA_D3D12_OPTIONS options = {}; HRESULT hr = device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS, &options, sizeof(options)); if (SUCCEEDED(hr)) { const char* tierName = "Unknown"; switch (options.ResourceBindingTier) { case D3D12_RESOURCE_BINDING_TIER_1: tierName = "Tier 1"; break; case D3D12_RESOURCE_BINDING_TIER_2: tierName = "Tier 2"; break; case D3D12_RESOURCE_BINDING_TIER_3: tierName = "Tier 3"; break; } IGL_D3D12_LOG_VERBOSE(" Resource Binding Tier: %s\n", tierName); } // === SHADER-VISIBLE CBV/SRV/UAV HEAP === // D3D12 spec: Max 1,000,000 descriptors for shader-visible heaps (FL 11.0+) // Conservative limit: 1,000,000 (actual limit may be lower on some hardware) constexpr uint32_t kMaxCbvSrvUavDescriptors = 1000000; if (sizes_.cbvSrvUav > kMaxCbvSrvUavDescriptors) { IGL_LOG_ERROR( " WARNING: Requested CBV/SRV/UAV heap size (%u) exceeds " "D3D12 spec limit (%u)\n", sizes_.cbvSrvUav, kMaxCbvSrvUavDescriptors); IGL_LOG_ERROR(" Clamping to %u descriptors\n", kMaxCbvSrvUavDescriptors); sizes_.cbvSrvUav = kMaxCbvSrvUavDescriptors; } else { IGL_D3D12_LOG_VERBOSE(" CBV/SRV/UAV heap size: %u (limit: %u) - OK\n", sizes_.cbvSrvUav, kMaxCbvSrvUavDescriptors); } // === SHADER-VISIBLE SAMPLER HEAP === // D3D12 spec: Max 2,048 descriptors (D3D12_MAX_SHADER_VISIBLE_SAMPLER_HEAP_SIZE) constexpr uint32_t kMaxSamplerDescriptors = 2048; if (sizes_.samplers > kMaxSamplerDescriptors) { IGL_LOG_ERROR( " WARNING: Requested sampler heap size (%u) exceeds " "D3D12 limit (%u)\n", sizes_.samplers, kMaxSamplerDescriptors); IGL_LOG_ERROR(" Clamping to %u descriptors\n", kMaxSamplerDescriptors); sizes_.samplers = kMaxSamplerDescriptors; } else { IGL_D3D12_LOG_VERBOSE( " Sampler heap size: %u (limit: %u) - OK\n", sizes_.samplers, kMaxSamplerDescriptors); } // === CPU-VISIBLE RTV HEAP === // D3D12 spec: Typically 64K+ descriptors (device-dependent) // Conservative validation: Warn if exceeding 16K (reasonable limit) constexpr uint32_t kMaxRtvDescriptors = 16384; if (sizes_.rtvs > kMaxRtvDescriptors) { IGL_LOG_ERROR(" WARNING: Requested RTV heap size (%u) is unusually large\n", sizes_.rtvs); IGL_LOG_ERROR(" Recommended maximum: %u descriptors\n", kMaxRtvDescriptors); // Don't clamp - let CreateDescriptorHeap fail if truly excessive } else { IGL_D3D12_LOG_VERBOSE( " RTV heap size: %u (recommended max: %u) - OK\n", sizes_.rtvs, kMaxRtvDescriptors); } // === CPU-VISIBLE DSV HEAP === // Similar limits to RTV heap constexpr uint32_t kMaxDsvDescriptors = 16384; if (sizes_.dsvs > kMaxDsvDescriptors) { IGL_LOG_ERROR(" WARNING: Requested DSV heap size (%u) is unusually large\n", sizes_.dsvs); IGL_LOG_ERROR(" Recommended maximum: %u descriptors\n", kMaxDsvDescriptors); // Don't clamp - let CreateDescriptorHeap fail if truly excessive } else { IGL_D3D12_LOG_VERBOSE( " DSV heap size: %u (recommended max: %u) - OK\n", sizes_.dsvs, kMaxDsvDescriptors); } IGL_D3D12_LOG_VERBOSE("========================================\n"); } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/DescriptorHeapManager.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::d3d12 { /** * @brief Persistent Descriptor Allocator for CPU-visible and long-lived descriptors * * ============================================================================ * ARCHITECTURE: Strategy 2 - Persistent Descriptor Allocator * ============================================================================ * * DescriptorHeapManager handles descriptors with EXPLICIT lifecycle management: * - **PRIMARY USE**: CPU-visible descriptors (RTV/DSV) for Texture and Framebuffer * - **SECONDARY USE**: Shader-visible descriptors for headless/unit test contexts * * **Key Differences from Per-Frame System (Strategy 1)**: * - Lifecycle: Allocated at resource creation, freed at destruction (not per-frame reset) * - Allocation: Free-list pattern (not linear) - supports arbitrary alloc/free * - Safety: Double-free detection, mutex protection for thread-safety * - Visibility: Creates both CPU-visible AND shader-visible heaps * * **When to Use This vs Per-Frame (D3D12ResourcesBinder)**: * - Use DescriptorHeapManager for: RTV/DSV allocation for textures/framebuffers * - Use DescriptorHeapManager for: Headless contexts without per-frame infrastructure * - Do NOT use for: Transient SRV/UAV/CBV/Samplers during rendering * - Do NOT use for: Descriptor table binding in encoders * * **Design Note**: This class creates shader-visible heaps (CBV/SRV/UAV, Samplers) * for backward compatibility with headless contexts. In normal rendering contexts: * - D3D12Context uses per-frame heaps (Strategy 1) for shader-visible descriptors * - DescriptorHeapManager is only used for RTV/DSV allocation * - Its shader-visible heaps serve as a fallback when per-frame heaps are unavailable * (e.g., headless/unit-test contexts - see ComputeCommandEncoder.cpp:32-40) * * For architecture overview, see D3D12ResourcesBinder.h documentation. * * Thread-safety: This class IS thread-safe (uses mutex for allocation/free). */ class DescriptorHeapManager { public: // Descriptor heap sizes configuration. // Default values match D3D12ContextConfig for consistency but can be customized at runtime. struct Sizes { uint32_t cbvSrvUav = 4096; // shader-visible (kept larger for unit tests/headless) uint32_t samplers = 2048; // shader-visible (D3D12 spec limit) uint32_t rtvs = 256; // CPU-visible (default from D3D12ContextConfig) uint32_t dsvs = 128; // CPU-visible (default from D3D12ContextConfig) // Note: D3D12Context and HeadlessContext construct Sizes manually based on their // specific needs (environment overrides, test requirements, etc.) rather than using // a generic factory method. To customize, construct Sizes with desired values. // Default sizes factory - workaround for C++ limitation with default member // initializers in nested structs used as default parameters static Sizes getDefault() { return Sizes{}; } }; DescriptorHeapManager() = default; Result initialize(ID3D12Device* device, const Sizes& sizes = Sizes::getDefault()); // Shader-visible heaps for binding ID3D12DescriptorHeap* getCbvSrvUavHeap() const { return cbvSrvUavHeap_.Get(); } ID3D12DescriptorHeap* getSamplerHeap() const { return samplerHeap_.Get(); } // Allocate a CPU descriptor from RTV/DSV heaps uint32_t allocateRTV(); uint32_t allocateDSV(); void freeRTV(uint32_t index); void freeDSV(uint32_t index); // Allocate indices inside shader-visible heaps (for creating CBV/SRV/UAV or Samplers) uint32_t allocateCbvSrvUav(); uint32_t allocateSampler(); void freeCbvSrvUav(uint32_t index); void freeSampler(uint32_t index); // Get CPU/GPU descriptor handles with validation. // Returns false on error (invalid index, null heap, use-after-free) and leaves outHandle zeroed. // Returns true on success and writes the valid handle to outHandle. [[nodiscard]] bool getRTVHandle(uint32_t index, D3D12_CPU_DESCRIPTOR_HANDLE* outHandle) const; [[nodiscard]] bool getDSVHandle(uint32_t index, D3D12_CPU_DESCRIPTOR_HANDLE* outHandle) const; [[nodiscard]] bool getCbvSrvUavCpuHandle(uint32_t index, D3D12_CPU_DESCRIPTOR_HANDLE* outHandle) const; [[nodiscard]] bool getCbvSrvUavGpuHandle(uint32_t index, D3D12_GPU_DESCRIPTOR_HANDLE* outHandle) const; [[nodiscard]] bool getSamplerCpuHandle(uint32_t index, D3D12_CPU_DESCRIPTOR_HANDLE* outHandle) const; [[nodiscard]] bool getSamplerGpuHandle(uint32_t index, D3D12_GPU_DESCRIPTOR_HANDLE* outHandle) const; uint32_t getCbvSrvUavDescriptorSize() const { return cbvSrvUavDescriptorSize_; } uint32_t getSamplerDescriptorSize() const { return samplerDescriptorSize_; } uint32_t getRtvDescriptorSize() const { return rtvDescriptorSize_; } uint32_t getDsvDescriptorSize() const { return dsvDescriptorSize_; } // Descriptor handle validation helpers for diagnostics/telemetry. // Note: These are NOT optimized for hot-path usage (O(N) free-list scans). // For per-draw/dispatch validation, prefer the get*Handle methods which cache results. [[nodiscard]] bool isValidRTVIndex(uint32_t index) const; [[nodiscard]] bool isValidDSVIndex(uint32_t index) const; [[nodiscard]] bool isValidCbvSrvUavIndex(uint32_t index) const; [[nodiscard]] bool isValidSamplerIndex(uint32_t index) const; // Telemetry: Log current heap usage statistics void logUsageStats() const; // Explicit cleanup of descriptor heaps to prevent leaks. void cleanup(); private: // Heaps igl::d3d12::ComPtr cbvSrvUavHeap_; igl::d3d12::ComPtr samplerHeap_; igl::d3d12::ComPtr rtvHeap_; igl::d3d12::ComPtr dsvHeap_; // Increments UINT cbvSrvUavDescriptorSize_ = 0; UINT samplerDescriptorSize_ = 0; UINT rtvDescriptorSize_ = 0; UINT dsvDescriptorSize_ = 0; // Free lists for CPU-only heaps std::vector freeRtvs_; std::vector freeDsvs_; // Free lists for shader-visible heaps std::vector freeCbvSrvUav_; std::vector freeSamplers_; // Total sizes Sizes sizes_{}; // Thread safety mutable std::mutex mutex_; // A-006: Validate and clamp descriptor heap sizes to device limits void validateAndClampSizes(ID3D12Device* device); }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/Device.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #include #include #include // For std::call_once. #include #include // For IGL_DEBUG_ASSERT in waitForUploadFence. #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #pragma comment(lib, "d3dcompiler.lib") namespace igl::d3d12 { namespace { // Import ComPtr for readability template using ComPtr = igl::d3d12::ComPtr; // DxcCreateInstance function pointer type for dynamic loading using DxcCreateInstanceProc = HRESULT(WINAPI*)(REFCLSID rclsid, REFIID riid, LPVOID* ppv); // Helper to get DxcCreateInstance dynamically (dxcompiler.dll is not part of Windows SDK) DxcCreateInstanceProc getDxcCreateInstance() { static DxcCreateInstanceProc s_proc = nullptr; static bool s_tried = false; if (!s_tried) { s_tried = true; HMODULE h = GetModuleHandleA("dxcompiler.dll"); if (!h) { h = LoadLibraryA("dxcompiler.dll"); } if (h) { s_proc = reinterpret_cast(GetProcAddress(h, "DxcCreateInstance")); } } return s_proc; } // Capture D3D12 InfoQueue messages (warnings/errors) into an artifacts log when enabled. void captureInfoQueueForDevice(ID3D12Device* device) { const char* captureEnv = std::getenv("IGL_D3D12_CAPTURE_VALIDATION"); if (!captureEnv || (captureEnv[0] != '1' && captureEnv[0] != 'T' && captureEnv[0] != 't' && captureEnv[0] != 'Y' && captureEnv[0] != 'y')) { return; } if (!device) { return; } ComPtr infoQueue; if (FAILED(device->QueryInterface(IID_PPV_ARGS(infoQueue.GetAddressOf())))) { return; } const UINT64 numMessages = infoQueue->GetNumStoredMessages(); namespace fs = std::filesystem; fs::path root; if (const char* rootEnv = std::getenv("IGL_ARTIFACT_ROOT"); rootEnv && *rootEnv != '\0') { root = fs::path(rootEnv); } else { root = fs::current_path() / "artifacts"; } fs::path logPath = root / "validation" / "D3D12_InfoQueue.log"; std::error_code ec; fs::create_directories(logPath.parent_path(), ec); std::ofstream out(logPath, std::ios::app); if (!out) { return; } out << "=== D3D12 InfoQueue Dump ===\n"; if (numMessages == 0) { out << "[INFO] No non-info D3D12 messages recorded for this device.\n"; return; } for (UINT64 i = 0; i < numMessages; ++i) { SIZE_T messageLength = 0; if (FAILED(infoQueue->GetMessage(i, nullptr, &messageLength)) || messageLength == 0) { continue; } std::vector buffer(messageLength); auto* message = reinterpret_cast(buffer.data()); if (FAILED(infoQueue->GetMessage(i, message, &messageLength))) { continue; } // Skip informational messages; capture warnings, errors, and corruption. if (message->Severity == D3D12_MESSAGE_SEVERITY_INFO || message->Severity == D3D12_MESSAGE_SEVERITY_MESSAGE) { continue; } // Explicitly ignore well-understood performance-only clear warnings from // the validation layer (IDs 820 and 821). These indicate that optimized // clear values were not provided or do not match but do not affect // correctness; they are tracked separately in the audit documentation. if (message->ID == 820 || message->ID == 821 || message->ID == 677) { continue; } const char* severityStr = "UNKNOWN"; switch (message->Severity) { case D3D12_MESSAGE_SEVERITY_CORRUPTION: severityStr = "CORRUPTION"; break; case D3D12_MESSAGE_SEVERITY_ERROR: severityStr = "ERROR"; break; case D3D12_MESSAGE_SEVERITY_WARNING: severityStr = "WARNING"; break; default: break; } out << "[" << severityStr << "] ID=" << static_cast(message->ID) << " : " << (message->pDescription ? message->pDescription : "") << "\n"; } infoQueue->ClearStoredMessages(); } // Log D3D12 and DXGI InfoQueue messages to the runtime log to aid debugging. // This is used in error paths such as PSO creation failures and device // removal checks. It is intentionally tolerant of missing debug components // (dxgidebug.dll, Graphics Tools, etc.) and will simply emit nothing if the // queues are unavailable. void logInfoQueuesForDevice(ID3D12Device* device, const char* context) { if (!device) { return; } // First, log any messages from the D3D12 device's InfoQueue. ComPtr infoQueue; if (SUCCEEDED(device->QueryInterface(IID_PPV_ARGS(infoQueue.GetAddressOf())))) { const UINT64 numMessages = infoQueue->GetNumStoredMessages(); IGL_LOG_ERROR(" [%s] D3D12 Info Queue has %llu messages:\n", context, static_cast(numMessages)); for (UINT64 i = 0; i < numMessages; ++i) { SIZE_T messageLength = 0; if (FAILED(infoQueue->GetMessage(i, nullptr, &messageLength)) || messageLength == 0) { continue; } std::vector buffer(messageLength); auto* message = reinterpret_cast(buffer.data()); if (FAILED(infoQueue->GetMessage(i, message, &messageLength))) { continue; } const char* severityStr = "UNKNOWN"; switch (message->Severity) { case D3D12_MESSAGE_SEVERITY_CORRUPTION: severityStr = "CORRUPTION"; break; case D3D12_MESSAGE_SEVERITY_ERROR: severityStr = "ERROR"; break; case D3D12_MESSAGE_SEVERITY_WARNING: severityStr = "WARNING"; break; case D3D12_MESSAGE_SEVERITY_INFO: severityStr = "INFO"; break; case D3D12_MESSAGE_SEVERITY_MESSAGE: severityStr = "MESSAGE"; break; default: break; } IGL_LOG_ERROR(" [D3D12][%s] %s (ID=%u)\n", severityStr, message->pDescription ? message->pDescription : "", static_cast(message->ID)); } infoQueue->ClearStoredMessages(); } // Next, attempt to log messages from the global DXGI InfoQueue via // dxgidebug.dll, if present. This can surface diagnostics that are not // routed through the per-device D3D12 queue (e.g. swap-chain errors or // certain shader validation issues). HMODULE dxgiDebugModule = LoadLibraryA("dxgidebug.dll"); if (!dxgiDebugModule) { return; } using PFN_DXGIGetDebugInterface = HRESULT(WINAPI*)(REFIID, void**); auto dxgiGetDebugInterface = reinterpret_cast( GetProcAddress(dxgiDebugModule, "DXGIGetDebugInterface")); if (dxgiGetDebugInterface) { ComPtr dxgiInfoQueue; if (SUCCEEDED(dxgiGetDebugInterface(IID_PPV_ARGS(dxgiInfoQueue.GetAddressOf())))) { const DXGI_DEBUG_ID producers[] = {DXGI_DEBUG_DXGI, DXGI_DEBUG_DX, DXGI_DEBUG_APP}; const char* producerNames[] = {"DXGI", "DX", "APP"}; for (size_t p = 0; p < std::size(producers); ++p) { const DXGI_DEBUG_ID producer = producers[p]; const UINT64 numMessages = dxgiInfoQueue->GetNumStoredMessages(producer); if (numMessages == 0) { continue; } IGL_LOG_ERROR(" [%s] DXGI InfoQueue (%s) has %llu messages:\n", context, producerNames[p], static_cast(numMessages)); for (UINT64 i = 0; i < numMessages; ++i) { SIZE_T messageLength = 0; if (FAILED(dxgiInfoQueue->GetMessage(producer, i, nullptr, &messageLength)) || messageLength == 0) { continue; } std::vector buffer(messageLength); auto* message = reinterpret_cast(buffer.data()); if (FAILED(dxgiInfoQueue->GetMessage(producer, i, message, &messageLength))) { continue; } const char* severityStr = "UNKNOWN"; switch (message->Severity) { case DXGI_INFO_QUEUE_MESSAGE_SEVERITY_CORRUPTION: severityStr = "CORRUPTION"; break; case DXGI_INFO_QUEUE_MESSAGE_SEVERITY_ERROR: severityStr = "ERROR"; break; case DXGI_INFO_QUEUE_MESSAGE_SEVERITY_WARNING: severityStr = "WARNING"; break; case DXGI_INFO_QUEUE_MESSAGE_SEVERITY_INFO: severityStr = "INFO"; break; case DXGI_INFO_QUEUE_MESSAGE_SEVERITY_MESSAGE: severityStr = "MESSAGE"; break; default: break; } IGL_LOG_ERROR(" [DXGI/%s][%s] %s (ID=%u)\n", producerNames[p], severityStr, message->pDescription ? message->pDescription : "", static_cast(message->ID)); } dxgiInfoQueue->ClearStoredMessages(producer); } // Also clear any remaining global messages so subsequent calls only // report new diagnostics. dxgiInfoQueue->ClearStoredMessages(DXGI_DEBUG_ALL); } } FreeLibrary(dxgiDebugModule); } // Use std::hash for deduplication (implemented in igl/SamplerState.cpp). } // namespace // Helper: Calculate root signature size in DWORDs // Root signature limit: 64 DWORDs // Size formula (per Microsoft documentation): // - Root constants: 1 DWORD per 32-bit value // - Root descriptors (CBV/SRV/UAV): 2 DWORDs each // - Descriptor tables: 1 DWORD each (regardless of table size) // - Static samplers: 0 DWORDs (free) // Reference: https://learn.microsoft.com/en-us/windows/win32/direct3d12/root-signature-limits static uint32_t getRootSignatureDwordSize(const D3D12_ROOT_SIGNATURE_DESC& desc) { uint32_t totalSize = 0; for (uint32_t i = 0; i < desc.NumParameters; ++i) { const auto& param = desc.pParameters[i]; switch (param.ParameterType) { case D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS: totalSize += param.Constants.Num32BitValues; IGL_D3D12_LOG_VERBOSE(" [%u] Root constants (b%u): %u DWORDs\n", i, param.Constants.ShaderRegister, param.Constants.Num32BitValues); break; case D3D12_ROOT_PARAMETER_TYPE_CBV: totalSize += 2; IGL_D3D12_LOG_VERBOSE( " [%u] Root CBV (b%u): 2 DWORDs\n", i, param.Descriptor.ShaderRegister); break; case D3D12_ROOT_PARAMETER_TYPE_SRV: totalSize += 2; IGL_D3D12_LOG_VERBOSE( " [%u] Root SRV (t%u): 2 DWORDs\n", i, param.Descriptor.ShaderRegister); break; case D3D12_ROOT_PARAMETER_TYPE_UAV: totalSize += 2; IGL_D3D12_LOG_VERBOSE( " [%u] Root UAV (u%u): 2 DWORDs\n", i, param.Descriptor.ShaderRegister); break; case D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE: totalSize += 1; const char* tableType = "Unknown"; if (param.DescriptorTable.NumDescriptorRanges > 0) { switch (param.DescriptorTable.pDescriptorRanges[0].RangeType) { case D3D12_DESCRIPTOR_RANGE_TYPE_CBV: tableType = "CBV"; break; case D3D12_DESCRIPTOR_RANGE_TYPE_SRV: tableType = "SRV"; break; case D3D12_DESCRIPTOR_RANGE_TYPE_UAV: tableType = "UAV"; break; case D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER: tableType = "Sampler"; break; } } IGL_D3D12_LOG_VERBOSE(" [%u] Descriptor table (%s): 1 DWORD\n", i, tableType); break; } } if (desc.NumStaticSamplers > 0) { IGL_D3D12_LOG_VERBOSE(" Static samplers: 0 DWORDs (free, count=%u)\n", desc.NumStaticSamplers); } return totalSize; } // Optional debug helper: validate that the shader input/output signatures are // consistent with the input layout and render target configuration we build // for a graphics PSO. This is intended purely for diagnostics and has no // effect on runtime behavior. static void validateShaderBindingsAndLayout( const RenderPipelineDesc& desc, const D3D12_GRAPHICS_PIPELINE_STATE_DESC& psoDesc, const std::vector& inputElements, ID3D12ShaderReflection* IGL_NULLABLE vsRefl, ID3D12ShaderReflection* IGL_NULLABLE psRefl) { // Environment toggle: IGL_D3D12_VALIDATE_SHADER_BINDINGS=0 disables validation. if (const char* env = std::getenv("IGL_D3D12_VALIDATE_SHADER_BINDINGS")) { if (env[0] == '0') { return; } } if (!vsRefl) { return; } D3D12_SHADER_DESC vsDesc = {}; if (FAILED(vsRefl->GetDesc(&vsDesc))) { return; } bool hasErrors = false; IGL_LOG_INFO("=== D3D12 VALIDATE_SHADER_BINDINGS (%s) ===\n", desc.debugName.c_str()); // Helper for case-insensitive string compare. auto iequals = [](const char* a, const char* b) -> bool { if (!a || !b) { return false; } while (*a && *b) { const int ca = std::tolower(static_cast(*a)); const int cb = std::tolower(static_cast(*b)); if (ca != cb) { return false; } ++a; ++b; } return *a == '\0' && *b == '\0'; }; // Validate vertex shader inputs against the input layout. IGL_LOG_INFO(" [VS] InputParameters=%u, InputLayout.Elements=%u\n", vsDesc.InputParameters, static_cast(inputElements.size())); for (UINT i = 0; i < vsDesc.InputParameters; ++i) { D3D12_SIGNATURE_PARAMETER_DESC paramDesc = {}; if (FAILED(vsRefl->GetInputParameterDesc(i, ¶mDesc))) { continue; } // Skip system-value semantics (SV_*), which do not come from the input layout. if (paramDesc.SemanticName && paramDesc.SemanticName[0] == 'S' && paramDesc.SemanticName[1] == 'V' && paramDesc.SemanticName[2] == '_') { continue; } bool found = false; for (const auto& elem : inputElements) { if (elem.SemanticName && iequals(elem.SemanticName, paramDesc.SemanticName) && elem.SemanticIndex == paramDesc.SemanticIndex) { found = true; break; } } if (!found) { hasErrors = true; IGL_LOG_ERROR( " [VALIDATION] VS input '%s%u' has no matching input layout element " "(debugName='%s').\n", paramDesc.SemanticName ? paramDesc.SemanticName : "", paramDesc.SemanticIndex, desc.debugName.c_str()); } } // Validate pixel shader color outputs against NumRenderTargets / RTV formats. if (psRefl) { D3D12_SHADER_DESC psDesc = {}; if (SUCCEEDED(psRefl->GetDesc(&psDesc))) { UINT colorOutputs = 0; for (UINT i = 0; i < psDesc.OutputParameters; ++i) { D3D12_SIGNATURE_PARAMETER_DESC paramDesc = {}; if (FAILED(psRefl->GetOutputParameterDesc(i, ¶mDesc))) { continue; } if (paramDesc.SemanticName && iequals(paramDesc.SemanticName, "SV_TARGET")) { ++colorOutputs; } } IGL_LOG_INFO(" [PS] ColorOutputs=%u, NumRenderTargets=%u, RTV[0]=%d, DSV=%d\n", colorOutputs, psoDesc.NumRenderTargets, psoDesc.NumRenderTargets > 0 ? static_cast(psoDesc.RTVFormats[0]) : static_cast(DXGI_FORMAT_UNKNOWN), static_cast(psoDesc.DSVFormat)); if (colorOutputs == 0 && psoDesc.NumRenderTargets > 0) { hasErrors = true; IGL_LOG_ERROR( " [VALIDATION] PS writes no color outputs but PSO has " "NumRenderTargets=%u (debugName='%s').\n", psoDesc.NumRenderTargets, desc.debugName.c_str()); } else if (colorOutputs > 0 && psoDesc.NumRenderTargets == 0) { hasErrors = true; IGL_LOG_ERROR( " [VALIDATION] PS writes %u color outputs but PSO has " "NumRenderTargets=0 (debugName='%s').\n", colorOutputs, desc.debugName.c_str()); } else if (colorOutputs > psoDesc.NumRenderTargets) { hasErrors = true; IGL_LOG_ERROR( " [VALIDATION] PS writes %u color outputs but PSO only " "declares %u render targets (debugName='%s').\n", colorOutputs, psoDesc.NumRenderTargets, desc.debugName.c_str()); } } } if (!hasErrors) { IGL_D3D12_LOG_VERBOSE( " [VALIDATION] Shader inputs/outputs match input layout and " "render target configuration.\n"); } IGL_LOG_INFO("=== END D3D12 VALIDATE_SHADER_BINDINGS ===\n"); } Device::Device(std::unique_ptr ctx) : ctx_(std::move(ctx)) { platformDevice_ = std::make_unique(*this); // Validate device limits against actual device capabilities. capabilities_.initialize(*ctx_); // Initialize upload infrastructure (allocator pool and upload helpers). allocatorPool_.initialize(*ctx_, this); auto* device = ctx_->getDevice(); if (device) { // Pre-compile mipmap generation shaders at device initialization. // This avoids runtime compilation overhead in Texture::generateMipmap(). { // HLSL shader sources (identical to those in Texture.cpp) static const char* kVS = R"( struct VSOut { float4 pos: SV_POSITION; float2 uv: TEXCOORD0; }; VSOut main(uint id: SV_VertexID) { float2 p = float2((id << 1) & 2, id & 2); VSOut o; o.pos = float4(p*float2(2,-2)+float2(-1,1), 0, 1); o.uv = p; return o; } )"; static const char* kPS = R"( Texture2D tex0 : register(t0); SamplerState smp : register(s0); float4 main(float4 pos:SV_POSITION, float2 uv:TEXCOORD0) : SV_TARGET { return tex0.SampleLevel(smp, uv, 0); } )"; // Initialize DXC compiler DXCCompiler dxcCompiler; Result initResult = dxcCompiler.initialize(); if (!initResult.isOk()) { IGL_LOG_ERROR( "Device::Device: Failed to initialize DXC for mipmap shader compilation: %s\n", initResult.message.c_str()); IGL_LOG_ERROR(" Mipmap generation will be unavailable\n"); return; // Early exit - don't attempt compilation without DXC } // Get shader model from context (minimum SM 6.0 for DXC) D3D_SHADER_MODEL shaderModel = ctx_->getMaxShaderModel(); std::string vsTarget = getShaderTarget(shaderModel, ShaderStage::Vertex); std::string psTarget = getShaderTarget(shaderModel, ShaderStage::Fragment); // Compile vertex shader std::string vsErrors; Result vsResult = dxcCompiler.compile(kVS, strlen(kVS), "main", vsTarget.c_str(), "MipmapGenerationVS", 0, pipelineCache_.mipmapVSBytecode_, vsErrors); if (!vsResult.isOk()) { IGL_LOG_ERROR("Device::Device: Failed to pre-compile mipmap VS: %s\n%s\n", vsResult.message.c_str(), vsErrors.c_str()); pipelineCache_.mipmapVSBytecode_.clear(); return; // Early exit - can't proceed without VS } // Compile pixel shader std::string psErrors; Result psResult = dxcCompiler.compile(kPS, strlen(kPS), "main", psTarget.c_str(), "MipmapGenerationPS", 0, pipelineCache_.mipmapPSBytecode_, psErrors); if (!psResult.isOk()) { IGL_LOG_ERROR("Device::Device: Failed to pre-compile mipmap PS: %s\n%s\n", psResult.message.c_str(), psErrors.c_str()); pipelineCache_.mipmapPSBytecode_.clear(); pipelineCache_.mipmapVSBytecode_.clear(); // Clear VS too for consistency return; // Early exit - can't proceed without PS } // Create root signature for mipmap generation D3D12_DESCRIPTOR_RANGE ranges[2] = {}; ranges[0].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV; ranges[0].NumDescriptors = 1; ranges[0].BaseShaderRegister = 0; ranges[0].OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND; ranges[1].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER; ranges[1].NumDescriptors = 1; ranges[1].BaseShaderRegister = 0; ranges[1].OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND; D3D12_ROOT_PARAMETER params[2] = {}; params[0].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE; params[0].DescriptorTable.NumDescriptorRanges = 1; params[0].DescriptorTable.pDescriptorRanges = &ranges[0]; params[0].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL; params[1].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE; params[1].DescriptorTable.NumDescriptorRanges = 1; params[1].DescriptorTable.pDescriptorRanges = &ranges[1]; params[1].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL; D3D12_ROOT_SIGNATURE_DESC rsDesc = {}; rsDesc.NumParameters = 2; rsDesc.pParameters = params; rsDesc.Flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT; igl::d3d12::ComPtr sig, err; if (FAILED(D3D12SerializeRootSignature( &rsDesc, D3D_ROOT_SIGNATURE_VERSION_1, sig.GetAddressOf(), err.GetAddressOf()))) { IGL_LOG_ERROR("Device::Device: Failed to serialize mipmap root signature\n"); if (err && err->GetBufferPointer()) { IGL_LOG_ERROR(" D3D12 error: %s\n", static_cast(err->GetBufferPointer())); } pipelineCache_.mipmapVSBytecode_.clear(); pipelineCache_.mipmapPSBytecode_.clear(); return; } if (FAILED(device->CreateRootSignature( 0, sig->GetBufferPointer(), sig->GetBufferSize(), IID_PPV_ARGS(pipelineCache_.mipmapRootSignature_.GetAddressOf())))) { IGL_LOG_ERROR("Device::Device: Failed to create mipmap root signature\n"); pipelineCache_.mipmapVSBytecode_.clear(); pipelineCache_.mipmapPSBytecode_.clear(); return; } // Success! Mark mipmap shaders as available pipelineCache_.mipmapShadersAvailable_ = true; IGL_D3D12_LOG_VERBOSE( "Device::Device: Mipmap shaders pre-compiled successfully (%zu bytes VS, %zu bytes PS)\n", pipelineCache_.mipmapVSBytecode_.size(), pipelineCache_.mipmapPSBytecode_.size()); } } } Device::~Device() { // Capture D3D12 validation messages for this device if enabled via environment. if (ctx_) { captureInfoQueueForDevice(ctx_->getDevice()); } // No shared event to clean up; events are per-call in waitForUploadFence. // Ensure upload-related resources are released before destroying the device. // D3D12Context destructor handles main queue fence waits via waitForGPU(). pipelineCache_.clear(); samplerCache_.clear(); allocatorPool_.clearOnDeviceDestruction(); // Clear bind group pools to release texture and buffer shared_ptrs that keep resources alive. bindGroupTexturesPool_.clear(); bindGroupBuffersPool_.clear(); } // Check for device removal and report detailed error. Result Device::checkDeviceRemoval() const { auto* device = ctx_->getDevice(); if (!device) { // Device not initialized is an invalid operation, not success. IGL_DEBUG_ASSERT(false, "Device::checkDeviceRemoval() called before device initialization"); return Result(Result::Code::InvalidOperation, "Device not initialized"); } // Early return if device already marked as lost (return cached reason for diagnostics) if (deviceLost_) { return Result(Result::Code::RuntimeError, std::string("Device previously lost: ") + deviceLostReason_); } HRESULT hr = device->GetDeviceRemovedReason(); if (FAILED(hr)) { const char* reason = "Unknown"; switch (hr) { case DXGI_ERROR_DEVICE_HUNG: reason = "DEVICE_HUNG (GPU not responding)"; break; case DXGI_ERROR_DEVICE_REMOVED: reason = "DEVICE_REMOVED (Driver crash or hardware failure)"; break; case DXGI_ERROR_DEVICE_RESET: reason = "DEVICE_RESET (Driver update or TDR)"; break; case DXGI_ERROR_DRIVER_INTERNAL_ERROR: reason = "DRIVER_INTERNAL_ERROR (Driver bug)"; break; case DXGI_ERROR_INVALID_CALL: reason = "INVALID_CALL (API misuse detected)"; break; default: break; } // Cache the reason and mark device as lost for diagnostics. deviceLostReason_ = reason; deviceLost_ = true; // Emit any pending D3D12/DXGI debug layer messages to help pinpoint the // invalid API sequence that caused device removal. logInfoQueuesForDevice(device, "Device::checkDeviceRemoval"); IGL_LOG_ERROR("D3D12 Device Removal Detected: %s (HRESULT=0x%08X)\n", reason, hr); IGL_DEBUG_ASSERT(false); return Result(Result::Code::RuntimeError, std::string("D3D12 device removed: ") + reason); } // On success (S_OK), device is healthy return Result(); } // Alignment validation methods. bool Device::validateMSAAAlignment(const TextureDesc& desc, Result* IGL_NULLABLE outResult) const { if (desc.numSamples <= 1) { return true; // Not MSAA, no special alignment requirements } // MSAA resources require 64KB alignment in D3D12 // D3D12 CreateCommittedResource automatically handles this, but we validate dimensions // to ensure resource won't exceed device limits IGL_D3D12_LOG_VERBOSE( "Device::validateMSAAAlignment: Validating MSAA texture (samples=%u, %ux%u)\n", desc.numSamples, desc.width, desc.height); // Check if texture dimensions are reasonable for MSAA // Large MSAA textures may fail due to memory constraints const size_t pixelCount = static_cast(desc.width) * desc.height; const size_t bytesPerPixel = 4; // Conservative estimate (RGBA8) const size_t estimatedSize = pixelCount * bytesPerPixel * desc.numSamples; // Warn if MSAA texture is very large (> 256MB) if (estimatedSize > 256 * 1024 * 1024) { IGL_D3D12_LOG_VERBOSE( "Device::validateMSAAAlignment: WARNING - Large MSAA texture detected (%zu MB). " "May cause memory pressure.\n", estimatedSize / (1024 * 1024)); } return true; } bool Device::validateTextureAlignment(const D3D12_RESOURCE_DESC& resourceDesc, uint32_t sampleCount, Result* IGL_NULLABLE outResult) const { // D3D12 texture alignment requirements: // - MSAA textures (SampleDesc.Count > 1): 64KB alignment (automatic via CreateCommittedResource) // - Regular textures: 64KB alignment (automatic via CreateCommittedResource) // - Small textures (<= 64KB): May use 4KB alignment // This validation is informational - D3D12 handles alignment automatically // We just verify parameters are within expected ranges if (sampleCount > 1) { // MSAA texture - will use 64KB alignment IGL_D3D12_LOG_VERBOSE( "Device::validateTextureAlignment: MSAA texture will use 64KB alignment (samples=%u)\n", sampleCount); } // Validate resource dimensions don't exceed D3D12 limits constexpr UINT64 kMaxTextureDimension2D = D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION; // 16384 if (resourceDesc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE2D) { if (resourceDesc.Width > kMaxTextureDimension2D || resourceDesc.Height > kMaxTextureDimension2D) { IGL_LOG_ERROR( "Device::validateTextureAlignment: Texture dimensions (%llux%u) exceed D3D12 limit " "(%llu)\n", resourceDesc.Width, resourceDesc.Height, kMaxTextureDimension2D); Result::setResult(outResult, Result::Code::ArgumentInvalid, "Texture dimensions exceed D3D12 maximum (16384x16384)"); return false; } } return true; } bool Device::validateBufferAlignment(size_t bufferSize, bool isUniform) const { // D3D12 buffer alignment requirements: // - Constant buffers: 256 bytes (D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT) // - Other buffers: No strict alignment requirement if (isUniform) { // Uniform buffers must be 256-byte aligned // This is already handled in createBuffer() by rounding up the size if (bufferSize % BUFFER_ALIGNMENT != 0) { IGL_D3D12_LOG_VERBOSE( "Device::validateBufferAlignment: Uniform buffer size %zu will be rounded up to %zu\n", bufferSize, (bufferSize + BUFFER_ALIGNMENT - 1) & ~(BUFFER_ALIGNMENT - 1)); } } return true; } // BindGroups Holder Device::createBindGroup( const BindGroupTextureDesc& desc, const IRenderPipelineState* IGL_NULLABLE /*compatiblePipeline*/, Result* IGL_NULLABLE outResult) { // Store bind group descriptor in pool for later use by encoder BindGroupTextureDesc description(desc); const auto handle = bindGroupTexturesPool_.create(std::move(description)); Result::setResult(outResult, handle.empty() ? Result(Result::Code::RuntimeError, "Cannot create bind group") : Result()); return {this, handle}; } Holder Device::createBindGroup(const BindGroupBufferDesc& desc, Result* IGL_NULLABLE outResult) { // Store bind group descriptor in pool for later use by encoder BindGroupBufferDesc description(desc); const auto handle = bindGroupBuffersPool_.create(std::move(description)); Result::setResult(outResult, handle.empty() ? Result(Result::Code::RuntimeError, "Cannot create bind group") : Result()); return {this, handle}; } void Device::destroy(BindGroupTextureHandle handle) { if (handle.empty()) { return; } bindGroupTexturesPool_.destroy(handle); } void Device::destroy(BindGroupBufferHandle handle) { if (handle.empty()) { return; } bindGroupBuffersPool_.destroy(handle); } void Device::destroy(SamplerHandle /*handle*/) { // No-op: D3D12 backend doesn't use the SamplerHandle system. // Samplers are created as shared_ptr and managed via ref-counting. // Sampler descriptors are allocated transiently per command encoder at bind time, // not persistently at sampler creation time, so there's nothing to deallocate here. } // Command Queue std::shared_ptr Device::createCommandQueue(const CommandQueueDesc& /*desc*/, Result* IGL_NULLABLE outResult) noexcept { Result::setOk(outResult); return std::make_shared(*this); } // Resources std::unique_ptr Device::createBuffer(const BufferDesc& desc, Result* IGL_NULLABLE outResult) const noexcept { // Single const_cast at the API boundary; all mutation happens in the non-const helper. auto& self = const_cast(*this); return self.createBufferImpl(desc, outResult); } std::unique_ptr Device::createBufferImpl(const BufferDesc& desc, Result* IGL_NULLABLE outResult) noexcept { auto* device = ctx_->getDevice(); if (!device) { Result::setResult(outResult, Result::Code::RuntimeError, "D3D12 device is null"); return nullptr; } // Determine heap type and initial state based on storage D3D12_HEAP_TYPE heapType; D3D12_RESOURCE_STATES initialState; // CRITICAL: Storage buffers with UAV flags MUST use DEFAULT heap // D3D12 does not allow UAV resources on UPLOAD heaps const bool isStorageBuffer = (desc.type & BufferDesc::BufferTypeBits::Storage) != 0; const bool forceDefaultHeap = isStorageBuffer; // Storage buffers need UAV, which requires DEFAULT heap if ((desc.storage == ResourceStorage::Shared || desc.storage == ResourceStorage::Managed) && !forceDefaultHeap) { // CPU-writable upload heap (for non-storage buffers only) heapType = D3D12_HEAP_TYPE_UPLOAD; initialState = D3D12_RESOURCE_STATE_GENERIC_READ; } else { // GPU-only default heap (required for storage buffers with UAV) heapType = D3D12_HEAP_TYPE_DEFAULT; initialState = D3D12_RESOURCE_STATE_COMMON; } // Create heap properties D3D12_HEAP_PROPERTIES heapProps = {}; heapProps.Type = heapType; heapProps.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; heapProps.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; // For uniform buffers, size must be aligned to 256 bytes // (D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT) const bool isUniformBuffer = (desc.type & BufferDesc::BufferTypeBits::Uniform) != 0; // Validate buffer alignment requirements. validateBufferAlignment(desc.length, isUniformBuffer); const UINT64 alignedSize = isUniformBuffer ? AlignUp(desc.length, 256) // D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT : desc.length; IGL_D3D12_LOG_VERBOSE( "Device::createBuffer: type=%d, requested_size=%zu, aligned_size=%llu, isUniform=%d\n", desc.type, desc.length, alignedSize, isUniformBuffer); // Create buffer description D3D12_RESOURCE_DESC bufferDesc = {}; bufferDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; bufferDesc.Alignment = 0; bufferDesc.Width = alignedSize; bufferDesc.Height = 1; bufferDesc.DepthOrArraySize = 1; bufferDesc.MipLevels = 1; bufferDesc.Format = DXGI_FORMAT_UNKNOWN; bufferDesc.SampleDesc.Count = 1; bufferDesc.SampleDesc.Quality = 0; bufferDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; bufferDesc.Flags = D3D12_RESOURCE_FLAG_NONE; // Add UAV flag for storage buffers (used by compute shaders) // isStorageBuffer already defined above for heap type determination if (isStorageBuffer) { bufferDesc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS; IGL_D3D12_LOG_VERBOSE("Device::createBuffer: Storage buffer - adding UAV flag\n"); } // Create the buffer resource igl::d3d12::ComPtr buffer; HRESULT hr = device->CreateCommittedResource(&heapProps, D3D12_HEAP_FLAG_NONE, &bufferDesc, initialState, nullptr, IID_PPV_ARGS(buffer.GetAddressOf())); if (FAILED(hr)) { char errorMsg[256]; snprintf(errorMsg, sizeof(errorMsg), "Failed to create buffer: HRESULT = 0x%08X", static_cast(hr)); Result::setResult(outResult, Result::Code::RuntimeError, errorMsg); return nullptr; } // Debug: Log GPU address for uniform buffers if (isUniformBuffer) { D3D12_GPU_VIRTUAL_ADDRESS gpuAddr = buffer->GetGPUVirtualAddress(); IGL_D3D12_LOG_VERBOSE("Device::createBuffer: Uniform buffer created, GPU address=0x%llx\n", gpuAddr); } // Upload initial data if provided D3D12_RESOURCE_STATES finalState = initialState; if (heapType == D3D12_HEAP_TYPE_UPLOAD) { finalState = D3D12_RESOURCE_STATE_GENERIC_READ; } if (desc.data) { if (heapType == D3D12_HEAP_TYPE_UPLOAD) { void* mappedData = nullptr; D3D12_RANGE readRange = {0, 0}; hr = buffer->Map(0, &readRange, &mappedData); if (SUCCEEDED(hr)) { std::memcpy(mappedData, desc.data, desc.length); buffer->Unmap(0, nullptr); } } else if (heapType == D3D12_HEAP_TYPE_DEFAULT) { // DEFAULT heap: stage through an UPLOAD buffer and copy IGL_D3D12_LOG_VERBOSE( "Device::createBuffer: Staging initial data via UPLOAD heap for DEFAULT buffer\n"); // Create upload buffer D3D12_HEAP_PROPERTIES uploadHeapProps = {}; uploadHeapProps.Type = D3D12_HEAP_TYPE_UPLOAD; uploadHeapProps.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; uploadHeapProps.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; // Create upload buffer description WITHOUT UAV flag (UPLOAD heaps can't have UAV) D3D12_RESOURCE_DESC uploadBufferDesc = bufferDesc; uploadBufferDesc.Flags = D3D12_RESOURCE_FLAG_NONE; // Remove UAV flag for upload buffer igl::d3d12::ComPtr uploadBuffer; HRESULT upHr = device->CreateCommittedResource(&uploadHeapProps, D3D12_HEAP_FLAG_NONE, &uploadBufferDesc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(uploadBuffer.GetAddressOf())); if (FAILED(upHr)) { IGL_LOG_ERROR("Device::createBuffer: Failed to create upload buffer: 0x%08X\n", static_cast(upHr)); } else { // Map and copy data void* mapped = nullptr; D3D12_RANGE rr = {0, 0}; if (SUCCEEDED(uploadBuffer->Map(0, &rr, &mapped)) && mapped) { std::memcpy(mapped, desc.data, desc.length); uploadBuffer->Unmap(0, nullptr); igl::d3d12::ComPtr allocator = getUploadCommandAllocator(); if (!allocator.Get()) { IGL_LOG_ERROR("Device::createBuffer: Failed to get command allocator from pool\n"); } else { igl::d3d12::ComPtr cmdList; if (SUCCEEDED(device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, allocator.Get(), nullptr, IID_PPV_ARGS(cmdList.GetAddressOf())))) { // Transition default buffer to COPY_DEST D3D12_RESOURCE_BARRIER toCopyDest = {}; toCopyDest.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; toCopyDest.Transition.pResource = buffer.Get(); toCopyDest.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; toCopyDest.Transition.StateBefore = initialState; // COMMON toCopyDest.Transition.StateAfter = D3D12_RESOURCE_STATE_COPY_DEST; cmdList->ResourceBarrier(1, &toCopyDest); // Copy upload -> default cmdList->CopyBufferRegion(buffer.Get(), 0, uploadBuffer.Get(), 0, alignedSize); // Transition to a likely-read state based on buffer type D3D12_RESOURCE_STATES targetState = D3D12_RESOURCE_STATE_GENERIC_READ; if (desc.type & BufferDesc::BufferTypeBits::Vertex) { targetState = D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER; } else if (desc.type & BufferDesc::BufferTypeBits::Uniform) { targetState = D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER; } else if (desc.type & BufferDesc::BufferTypeBits::Index) { targetState = D3D12_RESOURCE_STATE_INDEX_BUFFER; } D3D12_RESOURCE_BARRIER toTarget = {}; toTarget.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; toTarget.Transition.pResource = buffer.Get(); toTarget.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; toTarget.Transition.StateBefore = D3D12_RESOURCE_STATE_COPY_DEST; toTarget.Transition.StateAfter = targetState; cmdList->ResourceBarrier(1, &toTarget); cmdList->Close(); ID3D12CommandList* lists[] = {cmdList.Get()}; ctx_->getCommandQueue()->ExecuteCommandLists(1, lists); // Use async fence signaling instead of synchronous waitForGPU(). // Get fence value that will signal when this upload completes. UINT64 uploadFenceValue = getNextUploadFenceValue(); // Signal upload fence after copy completes HRESULT hrSignal = ctx_->getCommandQueue()->Signal(allocatorPool_.getUploadFence(), uploadFenceValue); if (FAILED(hrSignal)) { IGL_LOG_ERROR("Device::createBuffer: Failed to signal upload fence: 0x%08X\n", hrSignal); // Return allocator with 0 to avoid blocking the pool returnUploadCommandAllocator(allocator, 0); } else { // Return allocator to pool with fence value (will be reused after the fence is // signaled). returnUploadCommandAllocator(allocator, uploadFenceValue); // Track staging buffer for async cleanup with the associated fence value. trackUploadBuffer(std::move(uploadBuffer), uploadFenceValue); } finalState = targetState; } else { IGL_LOG_ERROR("Device::createBuffer: Failed to create command list\n"); // Return allocator with 0 to avoid blocking the pool returnUploadCommandAllocator(allocator, 0); } } } } } } Result::setOk(outResult); return std::make_unique(const_cast(*this), std::move(buffer), desc, finalState); } std::shared_ptr Device::createDepthStencilState( const DepthStencilStateDesc& desc, Result* IGL_NULLABLE outResult) const { Result::setOk(outResult); return std::make_shared(desc); } std::unique_ptr Device::createShaderStages(const ShaderStagesDesc& desc, Result* IGL_NULLABLE outResult) const { Result::setOk(outResult); return std::make_unique(desc); } std::shared_ptr Device::createSamplerState(const SamplerStateDesc& desc, Result* IGL_NULLABLE outResult) const { return samplerCache_.createSamplerState(desc, outResult); } std::shared_ptr Device::createTexture(const TextureDesc& desc, Result* IGL_NULLABLE outResult) const noexcept { auto* device = ctx_->getDevice(); // Check for exportability - D3D12 doesn't support exportable textures if (desc.exportability == TextureDesc::TextureExportability::Exportable) { Result::setResult( outResult, Result::Code::Unimplemented, "D3D12 does not support exportable textures"); return nullptr; } // Convert IGL texture format to DXGI format DXGI_FORMAT dxgiFormat = textureFormatToDXGIFormat(desc.format); IGL_D3D12_LOG_VERBOSE("Device::createTexture: IGL format=%d -> DXGI format=%d\n", (int)desc.format, (int)dxgiFormat); if (dxgiFormat == DXGI_FORMAT_UNKNOWN) { Result::setResult(outResult, Result::Code::ArgumentInvalid, "Unsupported texture format"); return nullptr; } // Create texture resource description D3D12_RESOURCE_DESC resourceDesc = {}; // Set dimension based on texture type if (desc.type == TextureType::ThreeD) { resourceDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE3D; resourceDesc.DepthOrArraySize = static_cast(desc.depth); } else if (desc.type == TextureType::Cube) { // Cube textures are 2D textures with 6 array slices per layer (one per face). // For cube arrays: numLayers * 6 faces. resourceDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; resourceDesc.DepthOrArraySize = static_cast(desc.numLayers * 6); IGL_D3D12_LOG_VERBOSE("Device::createTexture: Cube texture with %u layers -> %u array slices\n", desc.numLayers, resourceDesc.DepthOrArraySize); } else { resourceDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; resourceDesc.DepthOrArraySize = static_cast(desc.numLayers); } const bool sampledUsage = (desc.usage & TextureDesc::TextureUsageBits::Sampled) != 0; const DXGI_FORMAT resourceFormat = textureFormatToDXGIResourceFormat(desc.format, sampledUsage); if (resourceFormat == DXGI_FORMAT_UNKNOWN) { Result::setResult(outResult, Result::Code::ArgumentInvalid, "Unsupported resource format"); return nullptr; } resourceDesc.Alignment = 0; resourceDesc.Width = desc.width; resourceDesc.Height = desc.height; resourceDesc.MipLevels = static_cast(desc.numMipLevels); resourceDesc.Format = resourceFormat; // MSAA configuration // D3D12 MSAA requirements: // - Sample count must be 1, 2, 4, 8, or 16 (power of 2) // - Quality level 0 is standard MSAA (higher quality levels are vendor-specific) // - MSAA textures cannot have mipmaps (numMipLevels must be 1) // - Not all formats support all sample counts - validation required const uint32_t sampleCount = std::max(1u, desc.numSamples); // Validate MSAA alignment requirements before creating the resource. if (sampleCount > 1) { if (!validateMSAAAlignment(desc, outResult)) { // Error already set by validation function return nullptr; } } // Validate MSAA constraints. if (sampleCount > 1) { // MSAA textures cannot have mipmaps if (desc.numMipLevels > 1) { IGL_LOG_ERROR( "Device::createTexture: MSAA textures cannot have mipmaps (numMipLevels=%u, " "numSamples=%u)\n", desc.numMipLevels, sampleCount); Result::setResult(outResult, Result::Code::ArgumentInvalid, "MSAA textures cannot have mipmaps (numMipLevels must be 1)"); return nullptr; } // Validate that the requested MSAA sample count is supported for this format. // NOTE: Applications should query DeviceFeatureLimits::MaxMultisampleCount proactively // to avoid runtime errors. Use getMaxMSAASamplesForFormat() for format-specific queries. D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS msqLevels = {}; msqLevels.Format = dxgiFormat; msqLevels.SampleCount = sampleCount; msqLevels.Flags = D3D12_MULTISAMPLE_QUALITY_LEVELS_FLAG_NONE; if (FAILED(device->CheckFeatureSupport( D3D12_FEATURE_MULTISAMPLE_QUALITY_LEVELS, &msqLevels, sizeof(msqLevels))) || msqLevels.NumQualityLevels == 0) { // Query maximum supported samples for better error messages. const uint32_t maxSamples = getMaxMSAASamplesForFormat(desc.format); char errorMsg[512]; snprintf(errorMsg, sizeof(errorMsg), "Device::createTexture: Format %d does not support %u samples (max supported: %u). " "Query DeviceFeatureLimits::MaxMultisampleCount before texture creation.", static_cast(dxgiFormat), sampleCount, maxSamples); IGL_LOG_ERROR("%s\n", errorMsg); Result::setResult(outResult, Result::Code::Unsupported, errorMsg); return nullptr; } IGL_D3D12_LOG_VERBOSE( "Device::createTexture: MSAA enabled - format=%d, samples=%u, quality levels=%u\n", static_cast(dxgiFormat), sampleCount, msqLevels.NumQualityLevels); } resourceDesc.SampleDesc.Count = sampleCount; resourceDesc.SampleDesc.Quality = 0; // Standard MSAA quality (0 = default/standard) resourceDesc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN; resourceDesc.Flags = D3D12_RESOURCE_FLAG_NONE; // Set resource flags based on usage. // IMPORTANT: D3D12 forbids combining ALLOW_DEPTH_STENCIL with // ALLOW_RENDER_TARGET, ALLOW_UNORDERED_ACCESS or ALLOW_SIMULTANEOUS_ACCESS. // We therefore do not allow "Storage" usage on depth/stencil formats and // never set both DEPTH_STENCIL and RENDER_TARGET on the same resource. const bool isDepthStencilFormat = (desc.format >= TextureFormat::Z_UNorm16 && desc.format <= TextureFormat::S_UInt8); if (desc.usage & TextureDesc::TextureUsageBits::Sampled) { // Shader resource - no special flags needed } // Attachment usage becomes either a color render target or a depth/stencil // target depending on the texture format. if (desc.usage & TextureDesc::TextureUsageBits::Attachment) { if (isDepthStencilFormat) { resourceDesc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL; } else { resourceDesc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET; } } // Storage (unordered access) is only supported for non-depth/stencil // formats. If requested on a depth/stencil texture, log and ignore it. if (desc.usage & TextureDesc::TextureUsageBits::Storage) { if (isDepthStencilFormat) { IGL_LOG_ERROR( "Device::createTexture: Storage usage (UAV) requested for depth/stencil " "format (format=%d). D3D12 does not allow ALLOW_DEPTH_STENCIL together " "with ALLOW_UNORDERED_ACCESS; ignoring Storage flag for this texture.\n", static_cast(desc.format)); } else { resourceDesc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS; } } // Create heap properties D3D12_HEAP_PROPERTIES heapProps = {}; heapProps.Type = D3D12_HEAP_TYPE_DEFAULT; heapProps.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; heapProps.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; heapProps.CreationNodeMask = 1; heapProps.VisibleNodeMask = 1; // Determine initial state D3D12_RESOURCE_STATES initialState = D3D12_RESOURCE_STATE_COMMON; // Prepare optimized clear value for depth/stencil only. // For color render targets we deliberately avoid passing an optimized clear // value to CreateCommittedResource, because RenderPass clear colors are // often dynamic. Passing a fixed optimized clear color while clearing to // arbitrary colors triggers D3D12 WARNING ID=820 // (ClearRenderTargetView clear values do not match resource creation). D3D12_CLEAR_VALUE clearValue = {}; D3D12_CLEAR_VALUE* pClearValue = nullptr; if (resourceDesc.Flags & D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL) { clearValue.Format = dxgiFormat; clearValue.DepthStencil.Depth = 1.0f; // Default far plane clearValue.DepthStencil.Stencil = 0; pClearValue = &clearValue; } // Validate texture alignment before creating the resource. if (!validateTextureAlignment(resourceDesc, sampleCount, outResult)) { // Error already set by validation function return nullptr; } // Create the texture resource igl::d3d12::ComPtr resource; HRESULT hr = device->CreateCommittedResource(&heapProps, D3D12_HEAP_FLAG_NONE, &resourceDesc, initialState, pClearValue, // Optimized clear value for render // targets/depth-stencil IID_PPV_ARGS(resource.GetAddressOf())); if (FAILED(hr)) { char errorMsg[512]; if (hr == DXGI_ERROR_DEVICE_REMOVED) { HRESULT removedReason = device->GetDeviceRemovedReason(); snprintf(errorMsg, sizeof(errorMsg), "Failed to create texture resource. Device removed! HRESULT: 0x%08X, Removed " "reason: 0x%08X", static_cast(hr), static_cast(removedReason)); } else { snprintf(errorMsg, sizeof(errorMsg), "Failed to create texture resource. HRESULT: 0x%08X", static_cast(hr)); } Result::setResult(outResult, Result::Code::RuntimeError, errorMsg); return nullptr; } // Create IGL texture from D3D12 resource. auto texture = Texture::createFromResource(resource.Get(), desc.format, desc, device, ctx_->getCommandQueue(), initialState, const_cast(this)); Result::setOk(outResult); return texture; } std::shared_ptr Device::createTextureView(std::shared_ptr texture, const TextureViewDesc& desc, Result* IGL_NULLABLE outResult) const noexcept { if (!texture) { Result::setResult(outResult, Result::Code::ArgumentInvalid, "Parent texture is null"); return nullptr; } // Cast to D3D12 texture auto d3d12Texture = std::static_pointer_cast(texture); if (!d3d12Texture) { Result::setResult(outResult, Result::Code::ArgumentInvalid, "Texture is not a D3D12 texture"); return nullptr; } // Create the texture view auto view = Texture::createTextureView(d3d12Texture, desc); if (!view) { Result::setResult(outResult, Result::Code::RuntimeError, "Failed to create texture view"); return nullptr; } Result::setOk(outResult); return view; } std::shared_ptr Device::createTimer(Result* IGL_NULLABLE outResult) const noexcept { auto timer = std::make_shared(*this); Result::setOk(outResult); return timer; } std::shared_ptr Device::createVertexInputState(const VertexInputStateDesc& desc, Result* IGL_NULLABLE outResult) const { Result::setOk(outResult); return std::make_shared(desc); } std::shared_ptr Device::createComputePipeline( const ComputePipelineDesc& desc, Result* IGL_NULLABLE outResult) const { IGL_D3D12_LOG_VERBOSE("Device::createComputePipeline() START - debugName='%s'\n", desc.debugName.c_str()); auto* device = ctx_->getDevice(); if (!device) { IGL_LOG_ERROR(" D3D12 device is null!\n"); Result::setResult(outResult, Result::Code::InvalidOperation, "D3D12 device is null"); return nullptr; } if (!desc.shaderStages) { IGL_LOG_ERROR(" Shader stages are required!\n"); Result::setResult(outResult, Result::Code::ArgumentInvalid, "Shader stages are required"); return nullptr; } if (desc.shaderStages->getType() != ShaderStagesType::Compute) { IGL_LOG_ERROR(" Shader stages must be compute type!\n"); Result::setResult( outResult, Result::Code::ArgumentInvalid, "Shader stages must be compute type"); return nullptr; } // Get compute shader module auto* computeModule = static_cast(desc.shaderStages->getComputeModule().get()); if (!computeModule) { IGL_LOG_ERROR(" Compute module is null!\n"); Result::setResult(outResult, Result::Code::ArgumentInvalid, "Compute shader required"); return nullptr; } IGL_D3D12_LOG_VERBOSE(" Getting compute shader bytecode...\n"); const auto& csBytecode = computeModule->getBytecode(); IGL_D3D12_LOG_VERBOSE(" CS bytecode: %zu bytes\n", csBytecode.size()); // Create root signature for compute // Root signature layout for compute: // - Root parameter 0: Root Constants for b0 (Push Constants) // - Root parameter 1: Descriptor table with unbounded UAVs (u0-uN) // - Root parameter 2: Descriptor table with unbounded SRVs (t0-tN) // - Root parameter 3: Descriptor table with unbounded CBVs (b1-bN) // - Root parameter 4: Descriptor table with unbounded Samplers (s0-sN) // Query root signature capabilities to determine descriptor range bounds. // Tier 1 devices require bounded descriptor ranges. const D3D12_RESOURCE_BINDING_TIER bindingTier = ctx_->getResourceBindingTier(); const bool needsBoundedRanges = (bindingTier == D3D12_RESOURCE_BINDING_TIER_1); // Conservative bounds for Tier 1 devices (based on actual usage in render sessions) // These limits are sufficient for all current IGL usage patterns const UINT uavBound = needsBoundedRanges ? 64 : UINT_MAX; const UINT srvBound = needsBoundedRanges ? 128 : UINT_MAX; const UINT cbvBound = needsBoundedRanges ? 64 : UINT_MAX; const UINT samplerBound = needsBoundedRanges ? 32 : UINT_MAX; // Samplers always bounded on Tier 1/2 if (needsBoundedRanges) { IGL_D3D12_LOG_VERBOSE( " Using bounded descriptor ranges (Tier 1): UAV=%u, SRV=%u, CBV=%u, Sampler=%u\n", uavBound, srvBound, cbvBound, samplerBound); } else { IGL_D3D12_LOG_VERBOSE(" Using unbounded descriptor ranges (Tier %u)\n", bindingTier == D3D12_RESOURCE_BINDING_TIER_3 ? 3 : 2); } // Descriptor range for UAVs (unordered access views - read/write buffers and textures). D3D12_DESCRIPTOR_RANGE uavRange = {}; uavRange.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_UAV; uavRange.NumDescriptors = uavBound; uavRange.BaseShaderRegister = 0; // Starting at u0 uavRange.RegisterSpace = 0; uavRange.OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND; // Descriptor range for SRVs (shader resource views - read-only textures and buffers) D3D12_DESCRIPTOR_RANGE srvRange = {}; srvRange.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV; srvRange.NumDescriptors = srvBound; srvRange.BaseShaderRegister = 0; // Starting at t0 srvRange.RegisterSpace = 0; srvRange.OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND; // Descriptor range for CBVs (constant buffer views). // Note: b0 will be used for root constants (push constants), so the CBV table starts at b1. D3D12_DESCRIPTOR_RANGE cbvRange = {}; cbvRange.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_CBV; cbvRange.NumDescriptors = cbvBound; cbvRange.BaseShaderRegister = 1; // Starting at b1 (b0 is root constants) cbvRange.RegisterSpace = 0; cbvRange.OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND; // Descriptor range for Samplers. D3D12_DESCRIPTOR_RANGE samplerRange = {}; samplerRange.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER; samplerRange.NumDescriptors = samplerBound; samplerRange.BaseShaderRegister = 0; // Starting at s0 samplerRange.RegisterSpace = 0; samplerRange.OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND; // Root parameters D3D12_ROOT_PARAMETER rootParams[5] = {}; // Parameter 0: Root Constants for b0 (Push Constants) // Increased from 16 to 32 DWORDs (64→128 bytes) to match Vulkan // Using 32-bit constants for push constants in compute shaders rootParams[0].ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS; rootParams[0].Constants.ShaderRegister = 0; // b0 rootParams[0].Constants.RegisterSpace = 0; rootParams[0].Constants.Num32BitValues = 32; // 32 DWORDs = 128 bytes (matches Vulkan) rootParams[0].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL; // Parameter 1: Descriptor table for UAVs rootParams[1].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE; rootParams[1].DescriptorTable.NumDescriptorRanges = 1; rootParams[1].DescriptorTable.pDescriptorRanges = &uavRange; rootParams[1].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL; // Parameter 2: Descriptor table for SRVs rootParams[2].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE; rootParams[2].DescriptorTable.NumDescriptorRanges = 1; rootParams[2].DescriptorTable.pDescriptorRanges = &srvRange; rootParams[2].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL; // Parameter 3: Descriptor table for CBVs (b1+) // Note: b0 is now root constants, this table starts at b1 rootParams[3].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE; rootParams[3].DescriptorTable.NumDescriptorRanges = 1; rootParams[3].DescriptorTable.pDescriptorRanges = &cbvRange; rootParams[3].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL; // Parameter 4: Descriptor table for Samplers rootParams[4].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE; rootParams[4].DescriptorTable.NumDescriptorRanges = 1; rootParams[4].DescriptorTable.pDescriptorRanges = &samplerRange; rootParams[4].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL; D3D12_ROOT_SIGNATURE_DESC rootSigDesc = {}; rootSigDesc.NumParameters = 5; rootSigDesc.pParameters = rootParams; rootSigDesc.NumStaticSamplers = 0; rootSigDesc.pStaticSamplers = nullptr; rootSigDesc.Flags = D3D12_ROOT_SIGNATURE_FLAG_NONE; // CRITICAL: Validate root signature size (64 DWORD hardware limit). IGL_D3D12_LOG_VERBOSE(" Validating compute root signature size:\n"); const uint32_t totalSize = getRootSignatureDwordSize(rootSigDesc); IGL_D3D12_LOG_VERBOSE( " Total size: %u / 64 DWORDs (%.1f%%)\n", totalSize, 100.0f * totalSize / 64.0f); // Warning threshold at 50% (32 DWORDs) if (totalSize > 32) { IGL_D3D12_LOG_VERBOSE(" WARNING: Root signature size exceeds 50%% of limit: %u / 64 DWORDs\n", totalSize); } // Hard limit enforcement IGL_DEBUG_ASSERT(totalSize <= 64, "Root signature exceeds 64 DWORD limit!"); if (totalSize > 64) { IGL_LOG_ERROR(" ROOT SIGNATURE SIZE OVERFLOW: %u DWORDs (limit: 64)\n", totalSize); Result::setResult(outResult, Result::Code::ArgumentOutOfRange, "Root signature size exceeds 64 DWORD hardware limit"); return nullptr; } IGL_D3D12_LOG_VERBOSE( " Creating compute root signature with Root Constants (b0)/UAVs/SRVs/CBVs/Samplers\n"); // Get or create cached root signature. igl::d3d12::ComPtr rootSignature = pipelineCache_.getOrCreateRootSignature(ctx_->getDevice(), rootSigDesc, outResult); if (!rootSignature.Get()) { return nullptr; } // Create compute pipeline state D3D12_COMPUTE_PIPELINE_STATE_DESC psoDesc = {}; psoDesc.pRootSignature = rootSignature.Get(); psoDesc.CS.pShaderBytecode = csBytecode.data(); psoDesc.CS.BytecodeLength = csBytecode.size(); psoDesc.NodeMask = 0; psoDesc.CachedPSO.pCachedBlob = nullptr; psoDesc.CachedPSO.CachedBlobSizeInBytes = 0; psoDesc.Flags = D3D12_PIPELINE_STATE_FLAG_NONE; // PSO cache lookup (thread-safe with double-checked locking). const size_t psoHash = pipelineCache_.hashComputePipelineDesc(desc); igl::d3d12::ComPtr pipelineState; // First check: Lock for cache lookup { std::lock_guard lock(pipelineCache_.psoCacheMutex_); auto psoIt = pipelineCache_.computePSOCache_.find(psoHash); if (psoIt != pipelineCache_.computePSOCache_.end()) { // Cache hit - reuse existing PSO pipelineCache_.computePSOCacheHits_++; pipelineState = psoIt->second; // Assignment creates a ref-counted copy IGL_D3D12_LOG_VERBOSE( " [PSO CACHE HIT] Hash=0x%zx, hits=%zu, misses=%zu, hit rate=%.1f%%\n", psoHash, pipelineCache_.computePSOCacheHits_, pipelineCache_.computePSOCacheMisses_, 100.0 * pipelineCache_.computePSOCacheHits_ / (pipelineCache_.computePSOCacheHits_ + pipelineCache_.computePSOCacheMisses_)); IGL_D3D12_LOG_VERBOSE( "Device::createComputePipeline() SUCCESS (CACHED) - PSO=%p, RootSig=%p\n", pipelineState.Get(), rootSignature.Get()); Result::setOk(outResult); // Create a copy of the root signature for the returned object igl::d3d12::ComPtr rootSigCopy = rootSignature; return std::make_shared( desc, std::move(pipelineState), std::move(rootSigCopy)); } } // Cache miss - create new PSO outside lock (expensive operation) IGL_D3D12_LOG_VERBOSE(" [PSO CACHE MISS] Hash=0x%zx\n", psoHash); IGL_D3D12_LOG_VERBOSE(" Creating compute pipeline state...\n"); HRESULT hr = device->CreateComputePipelineState(&psoDesc, IID_PPV_ARGS(pipelineState.GetAddressOf())); if (FAILED(hr)) { IGL_LOG_ERROR(" CreateComputePipelineState FAILED: 0x%08X\n", static_cast(hr)); // Dump D3D12 + DXGI debug messages, if available, to help identify the // invalid PSO configuration (shader bytecode, root signature, etc.). logInfoQueuesForDevice(device, "CreateComputePipelineState"); Result::setResult( outResult, Result::Code::RuntimeError, "Failed to create compute pipeline state"); return nullptr; } // E-011: Set debug name on compute PSO for better debugging in PIX/RenderDoc if (desc.shaderStages && desc.shaderStages->getComputeModule()) { const std::string& psoName = desc.shaderStages->getComputeModule()->info().debugName; if (!psoName.empty()) { // Convert to wide string for D3D12 SetName API std::wstring wideName(psoName.begin(), psoName.end()); pipelineState->SetName(wideName.c_str()); IGL_D3D12_LOG_VERBOSE(" Set compute PSO debug name: %s\n", psoName.c_str()); } } // Second check: Lock for cache insertion with double-check. // Another thread may have created the PSO while we were creating ours { std::lock_guard lock(pipelineCache_.psoCacheMutex_); auto psoIt = pipelineCache_.computePSOCache_.find(psoHash); if (psoIt != pipelineCache_.computePSOCache_.end()) { // Another thread beat us to it - use their PSO pipelineCache_.computePSOCacheHits_++; pipelineState = psoIt->second; IGL_D3D12_LOG_VERBOSE( " [PSO DOUBLE-CHECK HIT] Another thread created PSO, using theirs. Hash=0x%zx\n", psoHash); } else { // We're the first to complete - cache our PSO pipelineCache_.computePSOCacheMisses_++; pipelineCache_.computePSOCache_[psoHash] = pipelineState; IGL_D3D12_LOG_VERBOSE(" [PSO CACHED] Hash=0x%zx, hits=%zu, misses=%zu\n", psoHash, pipelineCache_.computePSOCacheHits_, pipelineCache_.computePSOCacheMisses_); } } IGL_D3D12_LOG_VERBOSE( "Device::createComputePipeline() SUCCESS - PSO=%p, RootSig=%p (hash=0x%zx)\n", pipelineState.Get(), rootSignature.Get(), psoHash); Result::setOk(outResult); return std::make_shared( desc, std::move(pipelineState), std::move(rootSignature)); } std::shared_ptr Device::createRenderPipeline(const RenderPipelineDesc& desc, Result* IGL_NULLABLE outResult) const { IGL_D3D12_LOG_VERBOSE("Device::createRenderPipeline() START - debugName='%s'\n", desc.debugName.c_str()); auto* device = ctx_->getDevice(); if (!device) { IGL_LOG_ERROR(" D3D12 device is null!\n"); Result::setResult(outResult, Result::Code::InvalidOperation, "D3D12 device is null"); return nullptr; } if (!desc.shaderStages) { IGL_LOG_ERROR(" Shader stages are required!\n"); Result::setResult(outResult, Result::Code::ArgumentInvalid, "Shader stages are required"); return nullptr; } // Get shader modules auto* vertexModule = static_cast(desc.shaderStages->getVertexModule().get()); auto* fragmentModule = static_cast(desc.shaderStages->getFragmentModule().get()); if (!vertexModule || !fragmentModule) { IGL_LOG_ERROR(" Vertex or fragment module is null!\n"); Result::setResult( outResult, Result::Code::ArgumentInvalid, "Vertex and fragment shaders required"); return nullptr; } IGL_D3D12_LOG_VERBOSE(" Getting shader bytecode...\n"); // Get shader bytecode first const auto& vsBytecode = vertexModule->getBytecode(); const auto& psBytecode = fragmentModule->getBytecode(); IGL_D3D12_LOG_VERBOSE( " VS bytecode: %zu bytes, PS bytecode: %zu bytes\n", vsBytecode.size(), psBytecode.size()); // Extract shader reflection info for dynamic root signature creation const auto& vsReflectionInfo = vertexModule->getReflectionInfo(); const auto& psReflectionInfo = fragmentModule->getReflectionInfo(); // Create root signature key from shader reflection D3D12RootSignatureKey rootSigKey = D3D12RootSignatureKey::fromShaderReflection(&vsReflectionInfo, &psReflectionInfo); // Query resource binding tier for descriptor range bounds const D3D12_RESOURCE_BINDING_TIER bindingTier = ctx_->getResourceBindingTier(); IGL_D3D12_LOG_VERBOSE(" Resource binding tier: %u\n", bindingTier); // Create root signature dynamically based on shader requirements igl::d3d12::ComPtr rootSignature = pipelineCache_.createRootSignatureFromKey( ctx_->getDevice(), rootSigKey, bindingTier, outResult); if (!rootSignature.Get()) { return nullptr; } // Create PSO - zero-initialize all fields D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc = {}; psoDesc.pRootSignature = rootSignature.Get(); // Shader bytecode psoDesc.VS = {vsBytecode.data(), vsBytecode.size()}; psoDesc.PS = {psBytecode.data(), psBytecode.size()}; // Explicitly zero unused shader stages psoDesc.DS = {nullptr, 0}; psoDesc.HS = {nullptr, 0}; psoDesc.GS = {nullptr, 0}; // Rasterizer state - configure based on pipeline descriptor // Fill mode (solid vs wireframe) psoDesc.RasterizerState.FillMode = (desc.polygonFillMode == PolygonFillMode::Line) ? D3D12_FILL_MODE_WIREFRAME : D3D12_FILL_MODE_SOLID; // Cull mode configuration switch (desc.cullMode) { case CullMode::Back: psoDesc.RasterizerState.CullMode = D3D12_CULL_MODE_BACK; break; case CullMode::Front: psoDesc.RasterizerState.CullMode = D3D12_CULL_MODE_FRONT; break; case CullMode::Disabled: default: psoDesc.RasterizerState.CullMode = D3D12_CULL_MODE_NONE; break; } // Front face winding order psoDesc.RasterizerState.FrontCounterClockwise = (desc.frontFaceWinding == WindingMode::CounterClockwise) ? TRUE : FALSE; // Depth bias (polygon offset) - baseline values set in PSO // Note: IGL doesn't currently expose depth bias in RenderPipelineDesc // Applications can dynamically adjust depth bias via RenderCommandEncoder::setDepthBias() // These PSO values serve as the baseline which can be dynamically overridden psoDesc.RasterizerState.DepthBias = 0; // Integer depth bias (default: no bias) psoDesc.RasterizerState.DepthBiasClamp = 0.0f; // Max depth bias value (default: no clamp) psoDesc.RasterizerState.SlopeScaledDepthBias = 0.0f; // Slope-scaled bias for angled surfaces psoDesc.RasterizerState.DepthClipEnable = TRUE; // Enable depth clipping psoDesc.RasterizerState.MultisampleEnable = (desc.sampleCount > 1) ? TRUE : FALSE; psoDesc.RasterizerState.AntialiasedLineEnable = FALSE; psoDesc.RasterizerState.ForcedSampleCount = 0; psoDesc.RasterizerState.ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF; // Blend state - configure per render target based on pipeline descriptor psoDesc.BlendState.AlphaToCoverageEnable = FALSE; const size_t numColorAttachments = desc.targetDesc.colorAttachments.size(); psoDesc.BlendState.IndependentBlendEnable = numColorAttachments > 1 ? TRUE : FALSE; // Helper to convert IGL blend factor to D3D12 auto toD3D12Blend = [](BlendFactor f) { switch (f) { case BlendFactor::Zero: return D3D12_BLEND_ZERO; case BlendFactor::One: return D3D12_BLEND_ONE; case BlendFactor::SrcColor: return D3D12_BLEND_SRC_COLOR; case BlendFactor::OneMinusSrcColor: return D3D12_BLEND_INV_SRC_COLOR; case BlendFactor::SrcAlpha: return D3D12_BLEND_SRC_ALPHA; case BlendFactor::OneMinusSrcAlpha: return D3D12_BLEND_INV_SRC_ALPHA; case BlendFactor::DstColor: return D3D12_BLEND_DEST_COLOR; case BlendFactor::OneMinusDstColor: return D3D12_BLEND_INV_DEST_COLOR; case BlendFactor::DstAlpha: return D3D12_BLEND_DEST_ALPHA; case BlendFactor::OneMinusDstAlpha: return D3D12_BLEND_INV_DEST_ALPHA; case BlendFactor::SrcAlphaSaturated: return D3D12_BLEND_SRC_ALPHA_SAT; case BlendFactor::BlendColor: return D3D12_BLEND_BLEND_FACTOR; case BlendFactor::OneMinusBlendColor: return D3D12_BLEND_INV_BLEND_FACTOR; case BlendFactor::BlendAlpha: return D3D12_BLEND_BLEND_FACTOR; // D3D12 uses same constant for RGB and Alpha case BlendFactor::OneMinusBlendAlpha: return D3D12_BLEND_INV_BLEND_FACTOR; // D3D12 uses same constant for RGB and Alpha case BlendFactor::Src1Color: return D3D12_BLEND_SRC1_COLOR; // Dual-source blending case BlendFactor::OneMinusSrc1Color: return D3D12_BLEND_INV_SRC1_COLOR; // Dual-source blending case BlendFactor::Src1Alpha: return D3D12_BLEND_SRC1_ALPHA; // Dual-source blending case BlendFactor::OneMinusSrc1Alpha: return D3D12_BLEND_INV_SRC1_ALPHA; // Dual-source blending default: return D3D12_BLEND_ONE; } }; auto toD3D12BlendOp = [](BlendOp op) { switch (op) { case BlendOp::Add: return D3D12_BLEND_OP_ADD; case BlendOp::Subtract: return D3D12_BLEND_OP_SUBTRACT; case BlendOp::ReverseSubtract: return D3D12_BLEND_OP_REV_SUBTRACT; case BlendOp::Min: return D3D12_BLEND_OP_MIN; case BlendOp::Max: return D3D12_BLEND_OP_MAX; default: return D3D12_BLEND_OP_ADD; } }; for (UINT i = 0; i < D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i) { if (i < desc.targetDesc.colorAttachments.size()) { const auto& att = desc.targetDesc.colorAttachments[i]; psoDesc.BlendState.RenderTarget[i].BlendEnable = att.blendEnabled ? TRUE : FALSE; psoDesc.BlendState.RenderTarget[i].SrcBlend = toD3D12Blend(att.srcRGBBlendFactor); psoDesc.BlendState.RenderTarget[i].DestBlend = toD3D12Blend(att.dstRGBBlendFactor); psoDesc.BlendState.RenderTarget[i].BlendOp = toD3D12BlendOp(att.rgbBlendOp); psoDesc.BlendState.RenderTarget[i].SrcBlendAlpha = toD3D12Blend(att.srcAlphaBlendFactor); psoDesc.BlendState.RenderTarget[i].DestBlendAlpha = toD3D12Blend(att.dstAlphaBlendFactor); psoDesc.BlendState.RenderTarget[i].BlendOpAlpha = toD3D12BlendOp(att.alphaBlendOp); // Convert IGL color write mask to D3D12 UINT8 writeMask = 0; if (att.colorWriteMask & igl::kColorWriteBitsRed) { writeMask |= D3D12_COLOR_WRITE_ENABLE_RED; } if (att.colorWriteMask & igl::kColorWriteBitsGreen) { writeMask |= D3D12_COLOR_WRITE_ENABLE_GREEN; } if (att.colorWriteMask & igl::kColorWriteBitsBlue) { writeMask |= D3D12_COLOR_WRITE_ENABLE_BLUE; } if (att.colorWriteMask & igl::kColorWriteBitsAlpha) { writeMask |= D3D12_COLOR_WRITE_ENABLE_ALPHA; } psoDesc.BlendState.RenderTarget[i].RenderTargetWriteMask = writeMask; IGL_D3D12_LOG_VERBOSE( " PSO RenderTarget[%u]: BlendEnable=%d, SrcBlend=%d, DstBlend=%d, WriteMask=0x%02X\n", i, att.blendEnabled, psoDesc.BlendState.RenderTarget[i].SrcBlend, psoDesc.BlendState.RenderTarget[i].DestBlend, writeMask); } else { // Default blend state for unused render targets psoDesc.BlendState.RenderTarget[i].BlendEnable = FALSE; psoDesc.BlendState.RenderTarget[i].SrcBlend = D3D12_BLEND_ONE; psoDesc.BlendState.RenderTarget[i].DestBlend = D3D12_BLEND_ZERO; psoDesc.BlendState.RenderTarget[i].BlendOp = D3D12_BLEND_OP_ADD; psoDesc.BlendState.RenderTarget[i].SrcBlendAlpha = D3D12_BLEND_ONE; psoDesc.BlendState.RenderTarget[i].DestBlendAlpha = D3D12_BLEND_ZERO; psoDesc.BlendState.RenderTarget[i].BlendOpAlpha = D3D12_BLEND_OP_ADD; psoDesc.BlendState.RenderTarget[i].RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL; } // Logic operations support (bitwise blend operations) // Query hardware support for logic operations // Note: LogicOp is currently disabled as IGL doesn't expose logic operation settings in // RenderPipelineDesc To enable in the future: // 1. Add LogicOp enum and logicOpEnabled/logicOp fields to RenderPipelineDesc::ColorAttachment // 2. Query D3D12_FEATURE_D3D12_OPTIONS.OutputMergerLogicOp at device initialization // 3. Set LogicOpEnable = TRUE and LogicOp = convertLogicOp(att.logicOp) when enabled psoDesc.BlendState.RenderTarget[i].LogicOpEnable = FALSE; psoDesc.BlendState.RenderTarget[i].LogicOp = D3D12_LOGIC_OP_NOOP; } // Helper to convert IGL stencil operation to D3D12 auto toD3D12StencilOp = [](StencilOperation op) { switch (op) { case StencilOperation::Keep: return D3D12_STENCIL_OP_KEEP; case StencilOperation::Zero: return D3D12_STENCIL_OP_ZERO; case StencilOperation::Replace: return D3D12_STENCIL_OP_REPLACE; case StencilOperation::IncrementClamp: return D3D12_STENCIL_OP_INCR_SAT; case StencilOperation::DecrementClamp: return D3D12_STENCIL_OP_DECR_SAT; case StencilOperation::Invert: return D3D12_STENCIL_OP_INVERT; case StencilOperation::IncrementWrap: return D3D12_STENCIL_OP_INCR; case StencilOperation::DecrementWrap: return D3D12_STENCIL_OP_DECR; default: return D3D12_STENCIL_OP_KEEP; } }; // Helper to convert IGL compare function to D3D12 auto toD3D12CompareFunc = [](CompareFunction func) { switch (func) { case CompareFunction::Never: return D3D12_COMPARISON_FUNC_NEVER; case CompareFunction::Less: return D3D12_COMPARISON_FUNC_LESS; case CompareFunction::Equal: return D3D12_COMPARISON_FUNC_EQUAL; case CompareFunction::LessEqual: return D3D12_COMPARISON_FUNC_LESS_EQUAL; case CompareFunction::Greater: return D3D12_COMPARISON_FUNC_GREATER; case CompareFunction::NotEqual: return D3D12_COMPARISON_FUNC_NOT_EQUAL; case CompareFunction::GreaterEqual: return D3D12_COMPARISON_FUNC_GREATER_EQUAL; case CompareFunction::AlwaysPass: return D3D12_COMPARISON_FUNC_ALWAYS; default: return D3D12_COMPARISON_FUNC_LESS; } }; // Depth stencil state - check if we have a depth or stencil attachment const bool hasDepth = (desc.targetDesc.depthAttachmentFormat != TextureFormat::Invalid); const bool hasStencil = (desc.targetDesc.stencilAttachmentFormat != TextureFormat::Invalid); if (hasDepth) { psoDesc.DepthStencilState.DepthEnable = TRUE; psoDesc.DepthStencilState.DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ALL; // Use LESS_EQUAL to allow Z=0 to pass when depth buffer is cleared to 0 psoDesc.DepthStencilState.DepthFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL; } else { psoDesc.DepthStencilState.DepthEnable = FALSE; psoDesc.DepthStencilState.DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ZERO; psoDesc.DepthStencilState.DepthFunc = D3D12_COMPARISON_FUNC_ALWAYS; } // Configure stencil state (can be used with or without depth) if (hasStencil) { // Note: In D3D12/IGL, stencil state is configured via DepthStencilState binding // For now, we set up basic stencil configuration in the PSO // Default: stencil disabled unless explicitly configured by DepthStencilState psoDesc.DepthStencilState.StencilEnable = FALSE; psoDesc.DepthStencilState.StencilReadMask = D3D12_DEFAULT_STENCIL_READ_MASK; psoDesc.DepthStencilState.StencilWriteMask = D3D12_DEFAULT_STENCIL_WRITE_MASK; // Front face stencil operations (defaults) psoDesc.DepthStencilState.FrontFace.StencilFailOp = D3D12_STENCIL_OP_KEEP; psoDesc.DepthStencilState.FrontFace.StencilDepthFailOp = D3D12_STENCIL_OP_KEEP; psoDesc.DepthStencilState.FrontFace.StencilPassOp = D3D12_STENCIL_OP_KEEP; psoDesc.DepthStencilState.FrontFace.StencilFunc = D3D12_COMPARISON_FUNC_ALWAYS; // Back face stencil operations (defaults, same as front) psoDesc.DepthStencilState.BackFace = psoDesc.DepthStencilState.FrontFace; IGL_D3D12_LOG_VERBOSE(" PSO Stencil configured: format=%d\n", (int)desc.targetDesc.stencilAttachmentFormat); } else { psoDesc.DepthStencilState.StencilEnable = FALSE; } // Render target formats: support multiple render targets (MRT) if (!desc.targetDesc.colorAttachments.empty()) { const UINT n = static_cast(std::min(desc.targetDesc.colorAttachments.size(), D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT)); psoDesc.NumRenderTargets = n; IGL_D3D12_LOG_VERBOSE(" PSO NumRenderTargets = %u (color attachments = %zu)\n", n, desc.targetDesc.colorAttachments.size()); for (UINT i = 0; i < n; ++i) { // CRITICAL: Extract value to avoid MSVC debug iterator bounds check in function call const auto textureFormat = desc.targetDesc.colorAttachments[i].textureFormat; psoDesc.RTVFormats[i] = textureFormatToDXGIFormat(textureFormat); IGL_D3D12_LOG_VERBOSE( " PSO RTVFormats[%u] = %d (IGL format %d)\n", i, psoDesc.RTVFormats[i], textureFormat); } } else { psoDesc.NumRenderTargets = 0; IGL_D3D12_LOG_VERBOSE(" PSO NumRenderTargets = 0 (no color attachments)\n"); for (UINT i = 0; i < D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i) { psoDesc.RTVFormats[i] = DXGI_FORMAT_UNKNOWN; } } if (desc.targetDesc.depthAttachmentFormat != TextureFormat::Invalid) { psoDesc.DSVFormat = textureFormatToDXGIFormat(desc.targetDesc.depthAttachmentFormat); } else { psoDesc.DSVFormat = DXGI_FORMAT_UNKNOWN; } // Sample settings psoDesc.SampleMask = UINT_MAX; psoDesc.SampleDesc.Count = 1; psoDesc.SampleDesc.Quality = 0; // Must be 0 for Count=1 // Primitive topology - convert from IGL topology enum if (desc.topology == igl::PrimitiveType::Point) { psoDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_POINT; IGL_D3D12_LOG_VERBOSE(" Setting PSO topology type to POINT\n"); } else if (desc.topology == igl::PrimitiveType::Line || desc.topology == igl::PrimitiveType::LineStrip) { psoDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_LINE; IGL_D3D12_LOG_VERBOSE(" Setting PSO topology type to LINE\n"); } else { psoDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; IGL_D3D12_LOG_VERBOSE(" Setting PSO topology type to TRIANGLE\n"); } psoDesc.IBStripCutValue = D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_DISABLED; // Additional required fields psoDesc.NodeMask = 0; // Single GPU operation psoDesc.CachedPSO.pCachedBlob = nullptr; psoDesc.CachedPSO.CachedBlobSizeInBytes = 0; psoDesc.Flags = D3D12_PIPELINE_STATE_FLAG_NONE; // Input layout. std::vector inputElements; std::vector semanticNames; // Keep semantic name strings alive if (desc.vertexInputState) { // Convert IGL vertex input state to D3D12 input layout auto* d3d12VertexInput = static_cast(desc.vertexInputState.get()); const auto& vertexDesc = d3d12VertexInput->getDesc(); // Pre-reserve space to prevent reallocation (which would invalidate c_str() pointers) semanticNames.reserve(vertexDesc.numAttributes); IGL_D3D12_LOG_VERBOSE(" Processing vertex input state: %zu attributes\n", vertexDesc.numAttributes); for (size_t i = 0; i < vertexDesc.numAttributes; ++i) { const auto& attr = vertexDesc.attributes[i]; IGL_D3D12_LOG_VERBOSE(" Attribute %zu: name='%s', format=%d, offset=%zu, bufferIndex=%u\n", i, attr.name.c_str(), static_cast(attr.format), attr.offset, attr.bufferIndex); // Map IGL attribute names to D3D12 HLSL semantic names // IMPORTANT: Semantic names must NOT end with numbers - use SemanticIndex field instead std::string semanticName; // Case-insensitive helpers auto toLower = [](std::string s) { for (auto& c : s) c = static_cast(tolower(c)); return s; }; const std::string nlow = toLower(attr.name); auto startsWith = [&](const char* p) { return nlow.rfind(p, 0) == 0; }; auto contains = [&](const char* p) { return nlow.find(p) != std::string::npos; }; if (startsWith("pos") || startsWith("position") || contains("position")) { semanticName = "POSITION"; } else if (startsWith("col") || startsWith("color")) { semanticName = "COLOR"; } else if (startsWith("st") || startsWith("uv") || startsWith("tex") || contains("texcoord") || startsWith("offset")) { semanticName = "TEXCOORD"; } else if (startsWith("norm") || startsWith("normal")) { semanticName = "NORMAL"; } else if (startsWith("tangent")) { semanticName = "TANGENT"; } else { // Fallback: POSITION for first attribute, TEXCOORD for second, COLOR otherwise if (i == 0) semanticName = "POSITION"; else if (i == 1) semanticName = "TEXCOORD"; else semanticName = "COLOR"; } semanticNames.push_back(semanticName); IGL_D3D12_LOG_VERBOSE(" Mapped '%s' -> '%s'\n", attr.name.c_str(), semanticName.c_str()); D3D12_INPUT_ELEMENT_DESC element = {}; element.SemanticName = semanticNames.back().c_str(); element.SemanticIndex = 0; element.AlignedByteOffset = static_cast(attr.offset); element.InputSlot = attr.bufferIndex; // Check if this buffer binding uses per-instance data // Note: inputBindings array may be sparse (bufferIndex >= numInputBindings), so check bounds // with MAX const bool isInstanceData = (attr.bufferIndex < IGL_BUFFER_BINDINGS_MAX && vertexDesc.inputBindings[attr.bufferIndex].sampleFunction == VertexSampleFunction::Instance); element.InputSlotClass = isInstanceData ? D3D12_INPUT_CLASSIFICATION_PER_INSTANCE_DATA : D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA; element.InstanceDataStepRate = isInstanceData ? 1 : 0; IGL_D3D12_LOG_VERBOSE( " bufferIndex=%u, isInstance=%d, sampleFunc=%d, InputSlotClass=%d, StepRate=%u\n", attr.bufferIndex, isInstanceData, (int)vertexDesc.inputBindings[attr.bufferIndex].sampleFunction, (int)element.InputSlotClass, element.InstanceDataStepRate); // Convert IGL vertex format to DXGI format switch (attr.format) { case VertexAttributeFormat::Float1: element.Format = DXGI_FORMAT_R32_FLOAT; break; case VertexAttributeFormat::Float2: element.Format = DXGI_FORMAT_R32G32_FLOAT; break; case VertexAttributeFormat::Float3: element.Format = DXGI_FORMAT_R32G32B32_FLOAT; break; case VertexAttributeFormat::Float4: element.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; break; case VertexAttributeFormat::Byte1: element.Format = DXGI_FORMAT_R8_UINT; break; case VertexAttributeFormat::Byte2: element.Format = DXGI_FORMAT_R8G8_UINT; break; case VertexAttributeFormat::Byte4: element.Format = DXGI_FORMAT_R8G8B8A8_UINT; break; case VertexAttributeFormat::UByte4Norm: element.Format = DXGI_FORMAT_R8G8B8A8_UNORM; break; case VertexAttributeFormat::HalfFloat1: element.Format = DXGI_FORMAT_R16_FLOAT; break; case VertexAttributeFormat::HalfFloat2: element.Format = DXGI_FORMAT_R16G16_FLOAT; break; case VertexAttributeFormat::HalfFloat3: // D3D12 doesn't have RGB16_FLOAT, use RGBA16_FLOAT element.Format = DXGI_FORMAT_R16G16B16A16_FLOAT; break; case VertexAttributeFormat::HalfFloat4: element.Format = DXGI_FORMAT_R16G16B16A16_FLOAT; break; case VertexAttributeFormat::Int1: element.Format = DXGI_FORMAT_R32_SINT; break; case VertexAttributeFormat::Int2: element.Format = DXGI_FORMAT_R32G32_SINT; break; case VertexAttributeFormat::Int3: element.Format = DXGI_FORMAT_R32G32B32_SINT; break; case VertexAttributeFormat::Int4: element.Format = DXGI_FORMAT_R32G32B32A32_SINT; break; case VertexAttributeFormat::UInt1: element.Format = DXGI_FORMAT_R32_UINT; break; case VertexAttributeFormat::UInt2: element.Format = DXGI_FORMAT_R32G32_UINT; break; case VertexAttributeFormat::UInt3: element.Format = DXGI_FORMAT_R32G32B32_UINT; break; case VertexAttributeFormat::UInt4: element.Format = DXGI_FORMAT_R32G32B32A32_UINT; break; case VertexAttributeFormat::Int_2_10_10_10_REV: // Use an unsigned 10:10:10:2 format and decode SNORM manually in the shader. element.Format = DXGI_FORMAT_R10G10B10A2_UINT; break; default: element.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; // fallback IGL_LOG_ERROR(" Unsupported vertex attribute format: %d (using fallback RGBA32_FLOAT)\n", static_cast(attr.format)); break; } inputElements.push_back(element); } } else { // Default simple triangle layout: position (float3) + color (float4) inputElements.resize(2); inputElements[0] = {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0}; inputElements[1] = {"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0}; } psoDesc.InputLayout = {inputElements.data(), static_cast(inputElements.size())}; IGL_D3D12_LOG_VERBOSE(" Final input layout: %u elements\n", static_cast(inputElements.size())); for (size_t i = 0; i < inputElements.size(); ++i) { IGL_D3D12_LOG_VERBOSE(" [%zu]: %s (index %u), format %d, slot %u, offset %u\n", i, inputElements[i].SemanticName, inputElements[i].SemanticIndex, static_cast(inputElements[i].Format), inputElements[i].InputSlot, inputElements[i].AlignedByteOffset); } // Use shader reflection to verify input signature matches input layout IGL_D3D12_LOG_VERBOSE(" Reflecting vertex shader to verify input signature...\n"); igl::d3d12::ComPtr vsReflection; HRESULT hr = D3DReflect(vsBytecode.data(), vsBytecode.size(), IID_PPV_ARGS(vsReflection.GetAddressOf())); if (SUCCEEDED(hr)) { D3D12_SHADER_DESC shaderDesc = {}; vsReflection->GetDesc(&shaderDesc); IGL_D3D12_LOG_VERBOSE(" Shader expects %u input parameters:\n", shaderDesc.InputParameters); for (UINT i = 0; i < shaderDesc.InputParameters; ++i) { D3D12_SIGNATURE_PARAMETER_DESC paramDesc = {}; vsReflection->GetInputParameterDesc(i, ¶mDesc); IGL_D3D12_LOG_VERBOSE(" [%u]: %s%u (semantic index %u), mask 0x%02X\n", i, paramDesc.SemanticName, paramDesc.SemanticIndex, paramDesc.SemanticIndex, paramDesc.Mask); } } else { IGL_D3D12_LOG_VERBOSE( " Shader reflection unavailable: 0x%08X (non-critical - pipeline will still be " "created)\n", static_cast(hr)); } // PSO cache lookup (thread-safe with double-checked locking). const size_t psoHash = pipelineCache_.hashRenderPipelineDesc(desc); igl::d3d12::ComPtr pipelineState; // First check: Lock for cache lookup { std::lock_guard lock(pipelineCache_.psoCacheMutex_); auto psoIt = pipelineCache_.graphicsPSOCache_.find(psoHash); if (psoIt != pipelineCache_.graphicsPSOCache_.end()) { // Cache hit - reuse existing PSO pipelineCache_.graphicsPSOCacheHits_++; pipelineState = psoIt->second; // Assignment creates a ref-counted copy IGL_D3D12_LOG_VERBOSE( " [PSO CACHE HIT] Hash=0x%zx, hits=%zu, misses=%zu, hit rate=%.1f%%\n", psoHash, pipelineCache_.graphicsPSOCacheHits_, pipelineCache_.graphicsPSOCacheMisses_, 100.0 * pipelineCache_.graphicsPSOCacheHits_ / (pipelineCache_.graphicsPSOCacheHits_ + pipelineCache_.graphicsPSOCacheMisses_)); IGL_D3D12_LOG_VERBOSE( "Device::createRenderPipeline() SUCCESS (CACHED) - PSO=%p, RootSig=%p\n", pipelineState.Get(), rootSignature.Get()); Result::setOk(outResult); // Create a copy of the root signature for the returned object igl::d3d12::ComPtr rootSigCopy = rootSignature; auto renderPipeline = std::make_shared( desc, std::move(pipelineState), std::move(rootSigCopy)); // Compute root parameter layout from shader reflection key (same as cache miss path) UINT paramIndex = 0; if (rootSigKey.hasPushConstants) { renderPipeline->shaderReflection_.pushConstantRootParamIndex = paramIndex++; } if (!rootSigKey.usedCBVSlots.empty()) { renderPipeline->rootParamLayout_.cbvTableIndex = paramIndex++; renderPipeline->rootParamLayout_.cbvDescriptorCount = rootSigKey.maxCBVSlot + 1; } if (!rootSigKey.usedSRVSlots.empty()) { renderPipeline->rootParamLayout_.srvTableIndex = paramIndex++; renderPipeline->rootParamLayout_.srvDescriptorCount = rootSigKey.maxSRVSlot + 1; } if (!rootSigKey.usedSamplerSlots.empty()) { renderPipeline->rootParamLayout_.samplerTableIndex = paramIndex++; renderPipeline->rootParamLayout_.samplerDescriptorCount = rootSigKey.maxSamplerSlot + 1; } if (!rootSigKey.usedUAVSlots.empty()) { renderPipeline->rootParamLayout_.uavTableIndex = paramIndex++; renderPipeline->rootParamLayout_.uavDescriptorCount = rootSigKey.maxUAVSlot + 1; } return renderPipeline; } } // Cache miss - create new PSO outside lock (expensive operation) IGL_D3D12_LOG_VERBOSE(" [PSO CACHE MISS] Hash=0x%zx\n", psoHash); IGL_D3D12_LOG_VERBOSE(" Creating pipeline state (this may take a moment)...\n"); // Optional: a more detailed validation pass (validateShaderBindingsAndLayout) can be // re-enabled here if needed for diagnostics. It was previously wired to shader reflection // and emitted verbose logs on every cache miss; for normal runs we rely on the D3D12 // debug layer instead. hr = device->CreateGraphicsPipelineState(&psoDesc, IID_PPV_ARGS(pipelineState.GetAddressOf())); if (FAILED(hr)) { // Dump D3D12 + DXGI debug messages if available so that any invalid // PSO configuration (bytecode/root signature/RT formats) is visible. logInfoQueuesForDevice(device, "CreateGraphicsPipelineState"); char errorMsg[512]; snprintf(errorMsg, sizeof(errorMsg), "Failed to create pipeline state. HRESULT: 0x%08X\n" " VS size: %zu, PS size: %zu\n" " Input elements: %u\n" " NumRenderTargets: %u, RTV[0]: %d, DSV: %d\n" " SampleDesc: Count=%u, Quality=%u\n" " PrimitiveTopologyType: %d\n", static_cast(hr), psoDesc.VS.BytecodeLength, psoDesc.PS.BytecodeLength, psoDesc.InputLayout.NumElements, psoDesc.NumRenderTargets, static_cast(psoDesc.RTVFormats[0]), static_cast(psoDesc.DSVFormat), psoDesc.SampleDesc.Count, psoDesc.SampleDesc.Quality, static_cast(psoDesc.PrimitiveTopologyType)); IGL_LOG_ERROR(errorMsg); Result::setResult(outResult, Result::Code::RuntimeError, errorMsg); return nullptr; } // E-011: Set debug name on PSO for better debugging in PIX/RenderDoc std::string psoName; if (desc.shaderStages->getVertexModule()) { psoName += desc.shaderStages->getVertexModule()->info().debugName; } if (desc.shaderStages->getFragmentModule()) { if (!psoName.empty()) { psoName += " + "; } psoName += desc.shaderStages->getFragmentModule()->info().debugName; } if (!psoName.empty()) { // Convert to wide string for D3D12 SetName API std::wstring wideName(psoName.begin(), psoName.end()); pipelineState->SetName(wideName.c_str()); IGL_D3D12_LOG_VERBOSE(" Set PSO debug name: %s\n", psoName.c_str()); } // Second check: Lock for cache insertion with double-check. // Another thread may have created the PSO while we were creating ours { std::lock_guard lock(pipelineCache_.psoCacheMutex_); auto psoIt = pipelineCache_.graphicsPSOCache_.find(psoHash); if (psoIt != pipelineCache_.graphicsPSOCache_.end()) { // Another thread beat us to it - use their PSO pipelineCache_.graphicsPSOCacheHits_++; pipelineState = psoIt->second; IGL_D3D12_LOG_VERBOSE( " [PSO DOUBLE-CHECK HIT] Another thread created PSO, using theirs. Hash=0x%zx\n", psoHash); } else { // We're the first to complete - cache our PSO pipelineCache_.graphicsPSOCacheMisses_++; pipelineCache_.graphicsPSOCache_[psoHash] = pipelineState; IGL_D3D12_LOG_VERBOSE(" [PSO CACHED] Hash=0x%zx, hits=%zu, misses=%zu\n", psoHash, pipelineCache_.graphicsPSOCacheHits_, pipelineCache_.graphicsPSOCacheMisses_); } } IGL_D3D12_LOG_VERBOSE( "Device::createRenderPipeline() SUCCESS - PSO=%p, RootSig=%p (hash=0x%zx)\n", pipelineState.Get(), rootSignature.Get(), psoHash); // Create the pipeline state object auto renderPipeline = std::make_shared( desc, std::move(pipelineState), std::move(rootSignature)); // Compute root parameter layout from shader reflection key // The layout order matches createRootSignatureFromKey(): // 1. Push constants (if present) // 2. CBV table (if shader uses CBVs) // 3. SRV table (if shader uses SRVs) // 4. Sampler table (if shader uses samplers) // 5. UAV table (if shader uses UAVs) UINT paramIndex = 0; if (rootSigKey.hasPushConstants) { renderPipeline->shaderReflection_.pushConstantRootParamIndex = paramIndex++; } if (!rootSigKey.usedCBVSlots.empty()) { renderPipeline->rootParamLayout_.cbvTableIndex = paramIndex++; renderPipeline->rootParamLayout_.cbvDescriptorCount = rootSigKey.maxCBVSlot + 1; } if (!rootSigKey.usedSRVSlots.empty()) { renderPipeline->rootParamLayout_.srvTableIndex = paramIndex++; renderPipeline->rootParamLayout_.srvDescriptorCount = rootSigKey.maxSRVSlot + 1; } if (!rootSigKey.usedSamplerSlots.empty()) { renderPipeline->rootParamLayout_.samplerTableIndex = paramIndex++; renderPipeline->rootParamLayout_.samplerDescriptorCount = rootSigKey.maxSamplerSlot + 1; } if (!rootSigKey.usedUAVSlots.empty()) { renderPipeline->rootParamLayout_.uavTableIndex = paramIndex++; renderPipeline->rootParamLayout_.uavDescriptorCount = rootSigKey.maxUAVSlot + 1; } Result::setOk(outResult); return renderPipeline; } // D3D12-specific: Create PSO variant with substituted render target formats // This is called by RenderPipelineState::getPipelineState() for Vulkan-style dynamic PSO selection igl::d3d12::ComPtr Device::createPipelineStateVariant( const RenderPipelineDesc& desc, ID3D12RootSignature* rootSignature, Result* IGL_NULLABLE outResult) const { IGL_D3D12_LOG_VERBOSE( "Device::createPipelineStateVariant() - Creating PSO variant for framebuffer formats\n"); auto* device = ctx_->getDevice(); if (!device || !rootSignature) { Result::setResult(outResult, Result::Code::ArgumentInvalid, "Invalid device or root signature"); return nullptr; } if (!desc.shaderStages) { Result::setResult(outResult, Result::Code::ArgumentInvalid, "Shader stages required"); return nullptr; } // Get shader bytecode auto* vertexModule = static_cast(desc.shaderStages->getVertexModule().get()); auto* fragmentModule = static_cast(desc.shaderStages->getFragmentModule().get()); if (!vertexModule || !fragmentModule) { Result::setResult( outResult, Result::Code::ArgumentInvalid, "Vertex and fragment shaders required"); return nullptr; } const auto& vsBytecode = vertexModule->getBytecode(); const auto& psBytecode = fragmentModule->getBytecode(); // Build D3D12_GRAPHICS_PIPELINE_STATE_DESC from RenderPipelineDesc // This mirrors the logic in createRenderPipeline() but without caching D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc = {}; psoDesc.pRootSignature = rootSignature; // Shader bytecode psoDesc.VS = {vsBytecode.data(), vsBytecode.size()}; psoDesc.PS = {psBytecode.data(), psBytecode.size()}; psoDesc.DS = {nullptr, 0}; psoDesc.HS = {nullptr, 0}; psoDesc.GS = {nullptr, 0}; // Rasterizer state psoDesc.RasterizerState.FillMode = (desc.polygonFillMode == PolygonFillMode::Line) ? D3D12_FILL_MODE_WIREFRAME : D3D12_FILL_MODE_SOLID; switch (desc.cullMode) { case CullMode::Back: psoDesc.RasterizerState.CullMode = D3D12_CULL_MODE_BACK; break; case CullMode::Front: psoDesc.RasterizerState.CullMode = D3D12_CULL_MODE_FRONT; break; case CullMode::Disabled: default: psoDesc.RasterizerState.CullMode = D3D12_CULL_MODE_NONE; break; } psoDesc.RasterizerState.FrontCounterClockwise = (desc.frontFaceWinding == WindingMode::CounterClockwise) ? TRUE : FALSE; psoDesc.RasterizerState.DepthBias = 0; psoDesc.RasterizerState.DepthBiasClamp = 0.0f; psoDesc.RasterizerState.SlopeScaledDepthBias = 0.0f; psoDesc.RasterizerState.DepthClipEnable = TRUE; psoDesc.RasterizerState.MultisampleEnable = (desc.sampleCount > 1) ? TRUE : FALSE; psoDesc.RasterizerState.AntialiasedLineEnable = FALSE; psoDesc.RasterizerState.ForcedSampleCount = 0; psoDesc.RasterizerState.ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF; // Blend state psoDesc.BlendState.AlphaToCoverageEnable = FALSE; const size_t numColorAttachments = desc.targetDesc.colorAttachments.size(); psoDesc.BlendState.IndependentBlendEnable = numColorAttachments > 1 ? TRUE : FALSE; auto toD3D12Blend = [](BlendFactor f) { switch (f) { case BlendFactor::Zero: return D3D12_BLEND_ZERO; case BlendFactor::One: return D3D12_BLEND_ONE; case BlendFactor::SrcColor: return D3D12_BLEND_SRC_COLOR; case BlendFactor::OneMinusSrcColor: return D3D12_BLEND_INV_SRC_COLOR; case BlendFactor::SrcAlpha: return D3D12_BLEND_SRC_ALPHA; case BlendFactor::OneMinusSrcAlpha: return D3D12_BLEND_INV_SRC_ALPHA; case BlendFactor::DstColor: return D3D12_BLEND_DEST_COLOR; case BlendFactor::OneMinusDstColor: return D3D12_BLEND_INV_DEST_COLOR; case BlendFactor::DstAlpha: return D3D12_BLEND_DEST_ALPHA; case BlendFactor::OneMinusDstAlpha: return D3D12_BLEND_INV_DEST_ALPHA; case BlendFactor::SrcAlphaSaturated: return D3D12_BLEND_SRC_ALPHA_SAT; case BlendFactor::BlendColor: return D3D12_BLEND_BLEND_FACTOR; case BlendFactor::OneMinusBlendColor: return D3D12_BLEND_INV_BLEND_FACTOR; case BlendFactor::BlendAlpha: return D3D12_BLEND_BLEND_FACTOR; case BlendFactor::OneMinusBlendAlpha: return D3D12_BLEND_INV_BLEND_FACTOR; case BlendFactor::Src1Color: return D3D12_BLEND_SRC1_COLOR; case BlendFactor::OneMinusSrc1Color: return D3D12_BLEND_INV_SRC1_COLOR; case BlendFactor::Src1Alpha: return D3D12_BLEND_SRC1_ALPHA; case BlendFactor::OneMinusSrc1Alpha: return D3D12_BLEND_INV_SRC1_ALPHA; default: return D3D12_BLEND_ONE; } }; auto toD3D12BlendOp = [](BlendOp op) { switch (op) { case BlendOp::Add: return D3D12_BLEND_OP_ADD; case BlendOp::Subtract: return D3D12_BLEND_OP_SUBTRACT; case BlendOp::ReverseSubtract: return D3D12_BLEND_OP_REV_SUBTRACT; case BlendOp::Min: return D3D12_BLEND_OP_MIN; case BlendOp::Max: return D3D12_BLEND_OP_MAX; default: return D3D12_BLEND_OP_ADD; } }; for (UINT i = 0; i < D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i) { if (i < desc.targetDesc.colorAttachments.size()) { const auto& att = desc.targetDesc.colorAttachments[i]; psoDesc.BlendState.RenderTarget[i].BlendEnable = att.blendEnabled ? TRUE : FALSE; psoDesc.BlendState.RenderTarget[i].SrcBlend = toD3D12Blend(att.srcRGBBlendFactor); psoDesc.BlendState.RenderTarget[i].DestBlend = toD3D12Blend(att.dstRGBBlendFactor); psoDesc.BlendState.RenderTarget[i].BlendOp = toD3D12BlendOp(att.rgbBlendOp); psoDesc.BlendState.RenderTarget[i].SrcBlendAlpha = toD3D12Blend(att.srcAlphaBlendFactor); psoDesc.BlendState.RenderTarget[i].DestBlendAlpha = toD3D12Blend(att.dstAlphaBlendFactor); psoDesc.BlendState.RenderTarget[i].BlendOpAlpha = toD3D12BlendOp(att.alphaBlendOp); UINT8 writeMask = 0; if (att.colorWriteMask & igl::kColorWriteBitsRed) { writeMask |= D3D12_COLOR_WRITE_ENABLE_RED; } if (att.colorWriteMask & igl::kColorWriteBitsGreen) { writeMask |= D3D12_COLOR_WRITE_ENABLE_GREEN; } if (att.colorWriteMask & igl::kColorWriteBitsBlue) { writeMask |= D3D12_COLOR_WRITE_ENABLE_BLUE; } if (att.colorWriteMask & igl::kColorWriteBitsAlpha) { writeMask |= D3D12_COLOR_WRITE_ENABLE_ALPHA; } psoDesc.BlendState.RenderTarget[i].RenderTargetWriteMask = writeMask; } else { psoDesc.BlendState.RenderTarget[i].BlendEnable = FALSE; psoDesc.BlendState.RenderTarget[i].SrcBlend = D3D12_BLEND_ONE; psoDesc.BlendState.RenderTarget[i].DestBlend = D3D12_BLEND_ZERO; psoDesc.BlendState.RenderTarget[i].BlendOp = D3D12_BLEND_OP_ADD; psoDesc.BlendState.RenderTarget[i].SrcBlendAlpha = D3D12_BLEND_ONE; psoDesc.BlendState.RenderTarget[i].DestBlendAlpha = D3D12_BLEND_ZERO; psoDesc.BlendState.RenderTarget[i].BlendOpAlpha = D3D12_BLEND_OP_ADD; psoDesc.BlendState.RenderTarget[i].RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL; } psoDesc.BlendState.RenderTarget[i].LogicOpEnable = FALSE; psoDesc.BlendState.RenderTarget[i].LogicOp = D3D12_LOGIC_OP_NOOP; } // Depth-stencil state const bool hasDepth = (desc.targetDesc.depthAttachmentFormat != TextureFormat::Invalid); const bool hasStencil = (desc.targetDesc.stencilAttachmentFormat != TextureFormat::Invalid); if (hasDepth) { psoDesc.DepthStencilState.DepthEnable = TRUE; psoDesc.DepthStencilState.DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ALL; psoDesc.DepthStencilState.DepthFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL; } else { psoDesc.DepthStencilState.DepthEnable = FALSE; psoDesc.DepthStencilState.DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ZERO; psoDesc.DepthStencilState.DepthFunc = D3D12_COMPARISON_FUNC_ALWAYS; } if (hasStencil) { psoDesc.DepthStencilState.StencilEnable = FALSE; psoDesc.DepthStencilState.StencilReadMask = D3D12_DEFAULT_STENCIL_READ_MASK; psoDesc.DepthStencilState.StencilWriteMask = D3D12_DEFAULT_STENCIL_WRITE_MASK; psoDesc.DepthStencilState.FrontFace.StencilFailOp = D3D12_STENCIL_OP_KEEP; psoDesc.DepthStencilState.FrontFace.StencilDepthFailOp = D3D12_STENCIL_OP_KEEP; psoDesc.DepthStencilState.FrontFace.StencilPassOp = D3D12_STENCIL_OP_KEEP; psoDesc.DepthStencilState.FrontFace.StencilFunc = D3D12_COMPARISON_FUNC_ALWAYS; psoDesc.DepthStencilState.BackFace = psoDesc.DepthStencilState.FrontFace; } else { psoDesc.DepthStencilState.StencilEnable = FALSE; } // Render target formats - use the modified formats from desc if (!desc.targetDesc.colorAttachments.empty()) { const UINT n = static_cast(std::min(desc.targetDesc.colorAttachments.size(), D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT)); psoDesc.NumRenderTargets = n; for (UINT i = 0; i < n; ++i) { const auto textureFormat = desc.targetDesc.colorAttachments[i].textureFormat; psoDesc.RTVFormats[i] = textureFormatToDXGIFormat(textureFormat); IGL_D3D12_LOG_VERBOSE(" PSO Variant RTVFormats[%u] = %d (IGL format %d)\n", i, psoDesc.RTVFormats[i], textureFormat); } } else { psoDesc.NumRenderTargets = 0; for (UINT i = 0; i < D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i) { psoDesc.RTVFormats[i] = DXGI_FORMAT_UNKNOWN; } } if (desc.targetDesc.depthAttachmentFormat != TextureFormat::Invalid) { psoDesc.DSVFormat = textureFormatToDXGIFormat(desc.targetDesc.depthAttachmentFormat); } else { psoDesc.DSVFormat = DXGI_FORMAT_UNKNOWN; } // Sample settings psoDesc.SampleMask = UINT_MAX; psoDesc.SampleDesc.Count = 1; psoDesc.SampleDesc.Quality = 0; // Primitive topology if (desc.topology == igl::PrimitiveType::Point) { psoDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_POINT; } else if (desc.topology == igl::PrimitiveType::Line || desc.topology == igl::PrimitiveType::LineStrip) { psoDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_LINE; } else { psoDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; } psoDesc.IBStripCutValue = D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_DISABLED; psoDesc.NodeMask = 0; psoDesc.CachedPSO.pCachedBlob = nullptr; psoDesc.CachedPSO.CachedBlobSizeInBytes = 0; psoDesc.Flags = D3D12_PIPELINE_STATE_FLAG_NONE; // Input layout std::vector inputElements; std::vector semanticNames; if (desc.vertexInputState) { auto* d3d12VertexInput = static_cast(desc.vertexInputState.get()); const auto& vertexDesc = d3d12VertexInput->getDesc(); semanticNames.reserve(vertexDesc.numAttributes); for (size_t i = 0; i < vertexDesc.numAttributes; ++i) { const auto& attr = vertexDesc.attributes[i]; std::string semanticName; auto toLower = [](std::string s) { for (auto& c : s) c = static_cast(tolower(c)); return s; }; const std::string nlow = toLower(attr.name); auto startsWith = [&](const char* p) { return nlow.rfind(p, 0) == 0; }; auto contains = [&](const char* p) { return nlow.find(p) != std::string::npos; }; if (startsWith("pos") || startsWith("position") || contains("position")) { semanticName = "POSITION"; } else if (startsWith("col") || startsWith("color")) { semanticName = "COLOR"; } else if (startsWith("st") || startsWith("uv") || startsWith("tex") || contains("texcoord") || startsWith("offset")) { semanticName = "TEXCOORD"; } else if (startsWith("norm") || startsWith("normal")) { semanticName = "NORMAL"; } else if (startsWith("tangent")) { semanticName = "TANGENT"; } else { if (i == 0) semanticName = "POSITION"; else if (i == 1) semanticName = "TEXCOORD"; else semanticName = "COLOR"; } semanticNames.push_back(semanticName); D3D12_INPUT_ELEMENT_DESC element = {}; element.SemanticName = semanticNames.back().c_str(); element.SemanticIndex = 0; element.AlignedByteOffset = static_cast(attr.offset); element.InputSlot = attr.bufferIndex; bool isPerInstance = false; if (attr.bufferIndex < vertexDesc.numInputBindings) { isPerInstance = (vertexDesc.inputBindings[attr.bufferIndex].sampleFunction == igl::VertexSampleFunction::Instance); } element.InputSlotClass = isPerInstance ? D3D12_INPUT_CLASSIFICATION_PER_INSTANCE_DATA : D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA; element.InstanceDataStepRate = isPerInstance ? 1 : 0; auto toD3D12Format = [](VertexAttributeFormat fmt) -> DXGI_FORMAT { switch (fmt) { case VertexAttributeFormat::Float1: return DXGI_FORMAT_R32_FLOAT; case VertexAttributeFormat::Float2: return DXGI_FORMAT_R32G32_FLOAT; case VertexAttributeFormat::Float3: return DXGI_FORMAT_R32G32B32_FLOAT; case VertexAttributeFormat::Float4: return DXGI_FORMAT_R32G32B32A32_FLOAT; case VertexAttributeFormat::Byte1: return DXGI_FORMAT_R8_SINT; case VertexAttributeFormat::Byte2: return DXGI_FORMAT_R8G8_SINT; case VertexAttributeFormat::Byte4: return DXGI_FORMAT_R8G8B8A8_SINT; case VertexAttributeFormat::UByte4Norm: return DXGI_FORMAT_R8G8B8A8_UNORM; default: return DXGI_FORMAT_UNKNOWN; } }; element.Format = toD3D12Format(attr.format); inputElements.push_back(element); } } psoDesc.InputLayout = {inputElements.data(), static_cast(inputElements.size())}; // Create the pipeline state igl::d3d12::ComPtr pipelineState; HRESULT hr = device->CreateGraphicsPipelineState(&psoDesc, IID_PPV_ARGS(pipelineState.GetAddressOf())); if (FAILED(hr)) { logInfoQueuesForDevice(device, "CreateGraphicsPipelineState (variant)"); char errorMsg[256]; snprintf(errorMsg, sizeof(errorMsg), "Failed to create PSO variant. HRESULT: 0x%08X, RTV[0]: %d, DSV: %d", static_cast(hr), static_cast(psoDesc.RTVFormats[0]), static_cast(psoDesc.DSVFormat)); IGL_LOG_ERROR(errorMsg); Result::setResult(outResult, Result::Code::RuntimeError, errorMsg); return nullptr; } IGL_D3D12_LOG_VERBOSE("Device::createPipelineStateVariant() SUCCESS - PSO=%p\n", pipelineState.Get()); Result::setOk(outResult); return pipelineState; } // Shader library and modules. std::unique_ptr Device::createShaderLibrary(const ShaderLibraryDesc& desc, Result* IGL_NULLABLE outResult) const { IGL_D3D12_LOG_VERBOSE("Device::createShaderLibrary() - moduleInfo count=%zu, debugName='%s'\n", desc.moduleInfo.size(), desc.debugName.c_str()); if (desc.moduleInfo.empty()) { Result::setResult( outResult, Result::Code::ArgumentInvalid, "ShaderLibrary requires at least one module"); return nullptr; } if (!desc.input.isValid()) { Result::setResult(outResult, Result::Code::ArgumentInvalid, "Invalid shader library input"); return nullptr; } std::vector> modules; modules.reserve(desc.moduleInfo.size()); if (desc.input.type == ShaderInputType::Binary) { // Binary input: share the same bytecode across all modules (Metal-style) IGL_D3D12_LOG_VERBOSE(" Using binary input (%zu bytes) for all modules\n", desc.input.length); std::vector bytecode(desc.input.length); std::memcpy(bytecode.data(), desc.input.data, desc.input.length); for (const auto& info : desc.moduleInfo) { // Create a copy of the bytecode for each module std::vector moduleBytecode = bytecode; modules.push_back(std::make_shared(info, std::move(moduleBytecode))); } } else if (desc.input.type == ShaderInputType::String) { // String input: compile each module separately with its own entry point if (!desc.input.source || !*desc.input.source) { Result::setResult(outResult, Result::Code::ArgumentInvalid, "Shader library source is empty"); return nullptr; } IGL_D3D12_LOG_VERBOSE(" Compiling %zu modules from string input\n", desc.moduleInfo.size()); for (const auto& info : desc.moduleInfo) { // Create a ShaderModuleDesc for this specific module ShaderModuleDesc moduleDesc; moduleDesc.info = info; moduleDesc.input.type = ShaderInputType::String; moduleDesc.input.source = desc.input.source; moduleDesc.input.options = desc.input.options; moduleDesc.debugName = desc.debugName + "_" + info.entryPoint; Result moduleResult; auto module = createShaderModule(moduleDesc, &moduleResult); if (!moduleResult.isOk()) { IGL_LOG_ERROR(" Failed to compile module '%s': %s\n", info.entryPoint.c_str(), moduleResult.message.c_str()); Result::setResult(outResult, std::move(moduleResult)); return nullptr; } modules.push_back(std::move(module)); } } else { Result::setResult( outResult, Result::Code::Unsupported, "Unsupported shader library input type"); return nullptr; } IGL_D3D12_LOG_VERBOSE("Device::createShaderLibrary() SUCCESS - created %zu modules\n", modules.size()); Result::setOk(outResult); return std::make_unique(std::move(modules)); } // Helper function: Compile HLSL shader using legacy FXC compiler (Shader Model 5.1) // This is a fallback when DXC is unavailable or fails namespace { Result compileShaderFXC(const char* source, size_t sourceLength, const char* entryPoint, const char* target, const char* debugName, UINT compileFlags, std::vector& outBytecode, std::string& outErrors) { IGL_D3D12_LOG_VERBOSE("FXC: Compiling shader '%s' with target '%s' (%zu bytes source)\n", debugName ? debugName : "unnamed", target, sourceLength); igl::d3d12::ComPtr bytecode; igl::d3d12::ComPtr errors; // D3DCompile is the legacy FXC compiler API // It's always available on Windows 10+ (via d3dcompiler_47.dll) HRESULT hr = D3DCompile(source, sourceLength, debugName, // Source name (for error messages) nullptr, // Defines D3D_COMPILE_STANDARD_FILE_INCLUDE, entryPoint, target, compileFlags, 0, // Effect flags (not used for shaders) bytecode.GetAddressOf(), errors.GetAddressOf()); if (FAILED(hr)) { std::string errorMsg = "FXC compilation failed"; if (errors.Get() && errors->GetBufferSize() > 0) { outErrors = std::string(static_cast(errors->GetBufferPointer()), errors->GetBufferSize()); errorMsg += ": " + outErrors; IGL_LOG_ERROR("FXC: %s\n", outErrors.c_str()); } return Result(Result::Code::RuntimeError, errorMsg); } // Log warnings if any if (errors.Get() && errors->GetBufferSize() > 0) { outErrors = std::string(static_cast(errors->GetBufferPointer()), errors->GetBufferSize()); IGL_D3D12_LOG_VERBOSE("FXC: Compilation warnings:\n%s\n", outErrors.c_str()); } // Copy bytecode to output const uint8_t* data = static_cast(bytecode->GetBufferPointer()); size_t size = bytecode->GetBufferSize(); outBytecode.assign(data, data + size); IGL_D3D12_LOG_VERBOSE("FXC: Compilation successful (%zu bytes bytecode)\n", size); return Result(); } } // anonymous namespace // Note: getShaderTarget() helper moved to Common.h for shared use. std::shared_ptr Device::createShaderModule(const ShaderModuleDesc& desc, Result* IGL_NULLABLE outResult) const { IGL_D3D12_LOG_VERBOSE( "Device::createShaderModule() - stage=%d, entryPoint='%s', debugName='%s'\n", static_cast(desc.info.stage), desc.info.entryPoint.c_str(), desc.debugName.c_str()); if (!desc.input.isValid()) { IGL_LOG_ERROR(" Invalid shader input!\n"); Result::setResult(outResult, Result::Code::ArgumentInvalid, "Invalid shader input"); return nullptr; } std::vector bytecode; if (desc.input.type == ShaderInputType::Binary) { // Binary input - copy bytecode directly IGL_D3D12_LOG_VERBOSE(" Using binary input (%zu bytes)\n", desc.input.length); bytecode.resize(desc.input.length); std::memcpy(bytecode.data(), desc.input.data, desc.input.length); } else if (desc.input.type == ShaderInputType::String) { // String input - compile HLSL at runtime using DXC (DirectX Shader Compiler) // For string input, use desc.input.source (not data) and calculate length if (!desc.input.source) { IGL_LOG_ERROR(" Shader source is null!\n"); Result::setResult(outResult, Result::Code::ArgumentInvalid, "Shader source is null"); return nullptr; } const size_t sourceLength = strlen(desc.input.source); IGL_D3D12_LOG_VERBOSE(" Compiling HLSL from string (%zu bytes) using DXC...\n", sourceLength); // Initialize DXC compiler thread-safely using std::call_once. static DXCCompiler dxcCompiler; static std::once_flag dxcInitFlag; static bool dxcAvailable = false; std::call_once(dxcInitFlag, []() { Result initResult = dxcCompiler.initialize(); dxcAvailable = initResult.isOk(); if (dxcAvailable) { IGL_D3D12_LOG_VERBOSE( " DXC compiler initialized successfully (Shader Model 6.0+ support)\n"); } else { IGL_D3D12_LOG_VERBOSE(" DXC compiler initialization failed: %s\n", initResult.message.c_str()); IGL_D3D12_LOG_VERBOSE(" Falling back to FXC (Shader Model 5.1)\n"); } }); // Determine shader target based on stage // Use SM 6.0 for DXC, SM 5.1 for FXC fallback const char* targetDXC = nullptr; const char* targetFXC = nullptr; switch (desc.info.stage) { case ShaderStage::Vertex: targetDXC = "vs_6_0"; targetFXC = "vs_5_1"; break; case ShaderStage::Fragment: targetDXC = "ps_6_0"; targetFXC = "ps_5_1"; break; case ShaderStage::Compute: targetDXC = "cs_6_0"; targetFXC = "cs_5_1"; break; default: IGL_LOG_ERROR(" Unsupported shader stage!\n"); Result::setResult(outResult, Result::Code::ArgumentInvalid, "Unsupported shader stage"); return nullptr; } // Compile flags (DXC uses D3DCOMPILE_* flags) UINT compileFlags = D3DCOMPILE_ENABLE_STRICTNESS; // Enable shader debugging features #ifdef _DEBUG compileFlags |= D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION; IGL_D3D12_LOG_VERBOSE( " DEBUG BUILD: Enabling shader debug info and disabling optimizations\n"); #else // In release builds, still enable debug info for PIX captures unless explicitly disabled const char* disableDebugInfo = std::getenv("IGL_D3D12_DISABLE_SHADER_DEBUG"); if (!disableDebugInfo || std::string(disableDebugInfo) != "1") { compileFlags |= D3DCOMPILE_DEBUG; IGL_D3D12_LOG_VERBOSE( " RELEASE BUILD: Enabling shader debug info (disable with " "IGL_D3D12_DISABLE_SHADER_DEBUG=1)\n"); } #endif // Optional: Enable warnings as errors for stricter validation const char* warningsAsErrors = std::getenv("IGL_D3D12_SHADER_WARNINGS_AS_ERRORS"); if (warningsAsErrors && std::string(warningsAsErrors) == "1") { compileFlags |= D3DCOMPILE_WARNINGS_ARE_ERRORS; IGL_D3D12_LOG_VERBOSE(" Treating shader warnings as errors\n"); } // Try DXC first if available, fallback to FXC if DXC fails or unavailable std::string errors; Result compileResult; bool compiledWithDXC = false; if (dxcAvailable) { // Try DXC compilation (Shader Model 6.0) IGL_D3D12_LOG_VERBOSE(" Attempting DXC compilation (Shader Model 6.0)...\n"); compileResult = dxcCompiler.compile(desc.input.source, sourceLength, desc.info.entryPoint.c_str(), targetDXC, desc.debugName.c_str(), compileFlags, bytecode, errors); if (compileResult.isOk()) { IGL_D3D12_LOG_VERBOSE(" DXC shader compiled successfully (%zu bytes DXIL bytecode)\n", bytecode.size()); compiledWithDXC = true; } else { IGL_D3D12_LOG_VERBOSE(" DXC compilation failed: %s\n", compileResult.message.c_str()); if (!errors.empty()) { IGL_D3D12_LOG_VERBOSE(" DXC errors: %s\n", errors.c_str()); } IGL_D3D12_LOG_VERBOSE(" Falling back to FXC (Shader Model 5.1)...\n"); } } // Use FXC if DXC is unavailable or failed if (!compiledWithDXC) { errors.clear(); compileResult = compileShaderFXC(desc.input.source, sourceLength, desc.info.entryPoint.c_str(), targetFXC, desc.debugName.c_str(), compileFlags, bytecode, errors); if (!compileResult.isOk()) { // Both DXC and FXC failed - report error std::string errorMsg; const char* stageStr = ""; switch (desc.info.stage) { case ShaderStage::Vertex: stageStr = "VERTEX"; break; case ShaderStage::Fragment: stageStr = "FRAGMENT/PIXEL"; break; case ShaderStage::Compute: stageStr = "COMPUTE"; break; default: stageStr = "UNKNOWN"; break; } errorMsg = "Shader compilation FAILED (both DXC and FXC)\n"; errorMsg += " Stage: " + std::string(stageStr) + "\n"; errorMsg += " Entry Point: " + desc.info.entryPoint + "\n"; errorMsg += " Target (FXC): " + std::string(targetFXC) + "\n"; errorMsg += " Debug Name: " + desc.debugName + "\n"; if (!errors.empty()) { errorMsg += "\n=== FXC COMPILER ERRORS ===\n"; errorMsg += errors; errorMsg += "\n===========================\n"; } else { errorMsg += " Error: " + compileResult.message + "\n"; } IGL_LOG_ERROR("%s", errorMsg.c_str()); Result::setResult(outResult, Result::Code::RuntimeError, errorMsg.c_str()); return nullptr; } IGL_D3D12_LOG_VERBOSE(" FXC shader compiled successfully (%zu bytes bytecode)\n", bytecode.size()); } } else { Result::setResult(outResult, Result::Code::Unsupported, "Unsupported shader input type"); return nullptr; } // Create shader module with bytecode auto module = std::make_shared(desc.info, std::move(bytecode)); // Create shader reflection from DXIL bytecode. // This allows runtime queries of shader resources, bindings, and constant buffers. IGL_D3D12_LOG_VERBOSE(" Attempting to create shader reflection (bytecode size=%zu)...\n", module->getBytecode().size()); if (!module->getBytecode().empty()) { // Create IDxcUtils for reflection igl::d3d12::ComPtr dxcUtils; IGL_D3D12_LOG_VERBOSE(" Creating IDxcUtils for reflection...\n"); auto dxcCreateProc = getDxcCreateInstance(); HRESULT hr = dxcCreateProc ? dxcCreateProc(CLSID_DxcUtils, IID_PPV_ARGS(dxcUtils.GetAddressOf())) : E_FAIL; IGL_D3D12_LOG_VERBOSE(" DxcCreateInstance result: 0x%08X\n", hr); if (SUCCEEDED(hr)) { // Prepare buffer for reflection DxcBuffer reflectionBuffer = {}; reflectionBuffer.Ptr = module->getBytecode().data(); reflectionBuffer.Size = module->getBytecode().size(); reflectionBuffer.Encoding = 0; // Create reflection interface igl::d3d12::ComPtr reflection; hr = dxcUtils->CreateReflection(&reflectionBuffer, IID_PPV_ARGS(reflection.GetAddressOf())); if (SUCCEEDED(hr)) { module->setReflection(reflection); IGL_D3D12_LOG_VERBOSE(" Shader reflection created successfully (DXIL reflection)\n"); // Emit a concise reflection dump by default to help diagnose // resource-binding issues. This is intentionally always enabled // (in debug builds) so that D3D12 binding problems are visible // without extra flags. D3D12_SHADER_DESC shaderDesc = {}; if (SUCCEEDED(reflection->GetDesc(&shaderDesc))) { const char* stageStr = "UNKNOWN"; switch (desc.info.stage) { case ShaderStage::Vertex: stageStr = "VERTEX"; break; case ShaderStage::Fragment: stageStr = "FRAGMENT/PIXEL"; break; case ShaderStage::Compute: stageStr = "COMPUTE"; break; default: break; } IGL_LOG_INFO( "\n=== SHADER REFLECTION (%s - %s) ===\n", stageStr, desc.info.entryPoint.c_str()); IGL_LOG_INFO(" Bound Resources: %u\n", shaderDesc.BoundResources); for (UINT i = 0; i < shaderDesc.BoundResources; ++i) { D3D12_SHADER_INPUT_BIND_DESC bindDesc = {}; if (SUCCEEDED(reflection->GetResourceBindingDesc(i, &bindDesc))) { const char* typeStr = "Unknown"; const char* registerPrefix = "?"; switch (bindDesc.Type) { case D3D_SIT_CBUFFER: typeStr = "ConstantBuffer"; registerPrefix = "b"; break; case D3D_SIT_TBUFFER: typeStr = "TextureBuffer"; registerPrefix = "t"; break; case D3D_SIT_TEXTURE: typeStr = "Texture"; registerPrefix = "t"; break; case D3D_SIT_SAMPLER: typeStr = "Sampler"; registerPrefix = "s"; break; case D3D_SIT_UAV_RWTYPED: typeStr = "RWTexture"; registerPrefix = "u"; break; case D3D_SIT_STRUCTURED: typeStr = "StructuredBuffer"; registerPrefix = "t"; break; case D3D_SIT_UAV_RWSTRUCTURED: typeStr = "RWStructuredBuffer"; registerPrefix = "u"; break; case D3D_SIT_BYTEADDRESS: typeStr = "ByteAddressBuffer"; registerPrefix = "t"; break; case D3D_SIT_UAV_RWBYTEADDRESS: typeStr = "RWByteAddressBuffer"; registerPrefix = "u"; break; default: break; } IGL_LOG_INFO(" [%u] %s '%s' at %s%u (space %u)\n", i, typeStr, bindDesc.Name, registerPrefix, bindDesc.BindPoint, bindDesc.Space); } } IGL_LOG_INFO(" Constant Buffers: %u\n", shaderDesc.ConstantBuffers); for (UINT i = 0; i < shaderDesc.ConstantBuffers; ++i) { ID3D12ShaderReflectionConstantBuffer* cb = reflection->GetConstantBufferByIndex(i); D3D12_SHADER_BUFFER_DESC cbDesc = {}; if (cb && SUCCEEDED(cb->GetDesc(&cbDesc))) { IGL_LOG_INFO(" [%u] %s: %u bytes, %u variables\n", i, cbDesc.Name, cbDesc.Size, cbDesc.Variables); } } // Log input and output signature parameters to help diagnose // pipeline state creation issues (semantic/mask mismatches). IGL_LOG_INFO(" Input Parameters: %u\n", shaderDesc.InputParameters); for (UINT i = 0; i < shaderDesc.InputParameters; ++i) { D3D12_SIGNATURE_PARAMETER_DESC p = {}; if (SUCCEEDED(reflection->GetInputParameterDesc(i, &p))) { IGL_LOG_INFO(" [In %u] %s%u: reg=%u, mask=0x%02X\n", i, p.SemanticName ? p.SemanticName : "", p.SemanticIndex, p.Register, p.Mask); } } IGL_LOG_INFO(" Output Parameters: %u\n", shaderDesc.OutputParameters); for (UINT i = 0; i < shaderDesc.OutputParameters; ++i) { D3D12_SIGNATURE_PARAMETER_DESC p = {}; if (SUCCEEDED(reflection->GetOutputParameterDesc(i, &p))) { IGL_LOG_INFO(" [Out %u] %s%u: reg=%u, mask=0x%02X\n", i, p.SemanticName ? p.SemanticName : "", p.SemanticIndex, p.Register, p.Mask); } } IGL_LOG_INFO("================================\n\n"); } } else { IGL_D3D12_LOG_VERBOSE( " Failed to create DXIL reflection: 0x%08X, trying D3DReflect for DXBC bytecode...\n", hr); // Fallback to D3DReflect for DXBC bytecode (FXC-compiled shaders) hr = D3DReflect(module->getBytecode().data(), module->getBytecode().size(), IID_PPV_ARGS(reflection.GetAddressOf())); if (SUCCEEDED(hr)) { module->setReflection(reflection); IGL_D3D12_LOG_VERBOSE(" Shader reflection created successfully (DXBC reflection)\n"); // Emit reflection dump for DXBC shaders as well D3D12_SHADER_DESC shaderDesc = {}; if (SUCCEEDED(reflection->GetDesc(&shaderDesc))) { const char* stageStr = "UNKNOWN"; switch (desc.info.stage) { case ShaderStage::Vertex: stageStr = "VERTEX"; break; case ShaderStage::Fragment: stageStr = "FRAGMENT/PIXEL"; break; case ShaderStage::Compute: stageStr = "COMPUTE"; break; default: break; } IGL_LOG_INFO("\n=== SHADER REFLECTION (%s - %s) [DXBC] ===\n", stageStr, desc.info.entryPoint.c_str()); IGL_LOG_INFO(" Bound Resources: %u\n", shaderDesc.BoundResources); for (UINT i = 0; i < shaderDesc.BoundResources; ++i) { D3D12_SHADER_INPUT_BIND_DESC bindDesc = {}; if (SUCCEEDED(reflection->GetResourceBindingDesc(i, &bindDesc))) { const char* typeStr = "Unknown"; const char* registerPrefix = "?"; switch (bindDesc.Type) { case D3D_SIT_CBUFFER: typeStr = "ConstantBuffer"; registerPrefix = "b"; break; case D3D_SIT_TBUFFER: typeStr = "TextureBuffer"; registerPrefix = "t"; break; case D3D_SIT_TEXTURE: typeStr = "Texture"; registerPrefix = "t"; break; case D3D_SIT_SAMPLER: typeStr = "Sampler"; registerPrefix = "s"; break; case D3D_SIT_UAV_RWTYPED: typeStr = "RWTexture/UAV"; registerPrefix = "u"; break; default: break; } IGL_LOG_INFO(" [%u] %s '%s' at %s%u (space %u)\n", i, typeStr, bindDesc.Name, registerPrefix, bindDesc.BindPoint, bindDesc.Space); } } IGL_LOG_INFO("================================\n\n"); } } else { IGL_D3D12_LOG_VERBOSE( " Failed to create reflection with both DXC and D3DReflect: 0x%08X (non-fatal)\n", hr); } } } else { IGL_D3D12_LOG_VERBOSE(" Failed to create DXC utils for reflection: 0x%08X (non-fatal)\n", hr); } } Result::setOk(outResult); return module; } // Framebuffer std::shared_ptr Device::createFramebuffer(const FramebufferDesc& desc, Result* IGL_NULLABLE outResult) { Result::setOk(outResult); return std::make_shared(desc); } base::IFramebufferInterop* IGL_NULLABLE Device::createFramebufferInterop(const base::FramebufferInteropDesc& desc) { auto framebuffer = createFramebufferFromBaseDesc(desc); if (!framebuffer) { return nullptr; } return new (std::nothrow) FramebufferWrapper(std::move(framebuffer)); } // Capabilities const IPlatformDevice& Device::getPlatformDevice() const noexcept { return *platformDevice_; } bool Device::hasFeature(DeviceFeatures feature) const { IGL_D3D12_LOG_VERBOSE("[D3D12] hasFeature query: %d\n", static_cast(feature)); switch (feature) { // Expected true in tests (non-OpenGL branch) case DeviceFeatures::CopyBuffer: case DeviceFeatures::DrawInstanced: case DeviceFeatures::DrawFirstIndexFirstVertex: // D3D12 DrawIndexedInstanced supports first // index/vertex case DeviceFeatures::SRGB: case DeviceFeatures::SRGBSwapchain: case DeviceFeatures::UniformBlocks: case DeviceFeatures::StandardDerivative: // ddx/ddy available in HLSL case DeviceFeatures::TextureFloat: case DeviceFeatures::TextureHalfFloat: case DeviceFeatures::ReadWriteFramebuffer: case DeviceFeatures::TextureNotPot: case DeviceFeatures::ShaderTextureLod: case DeviceFeatures::ExplicitBinding: case DeviceFeatures::MapBufferRange: // UPLOAD/READBACK buffers support mapping case DeviceFeatures::ShaderLibrary: // Support shader libraries in D3D12 case DeviceFeatures::Texture3D: // D3D12 supports 3D textures (DIMENSION_TEXTURE3D). case DeviceFeatures::TexturePartialMipChain: // D3D12 supports partial mip chains via custom SRVs. case DeviceFeatures::TextureViews: // D3D12 supports createTextureView() via shared resources. return true; case DeviceFeatures::MultipleRenderTargets: return true; // D3D12 supports up to 8 simultaneous render targets. case DeviceFeatures::Compute: return true; // Compute shaders now supported with compute pipeline and dispatch case DeviceFeatures::Texture2DArray: IGL_D3D12_LOG_VERBOSE("[D3D12] hasFeature(Texture2DArray) returning TRUE\n"); return true; // D3D12 supports 2D texture arrays via DepthOrArraySize in D3D12_RESOURCE_DESC case DeviceFeatures::PushConstants: return true; // Implemented via root constants at parameter 0 (shader register b2) case DeviceFeatures::SRGBWriteControl: case DeviceFeatures::TextureArrayExt: case DeviceFeatures::TextureExternalImage: case DeviceFeatures::Multiview: case DeviceFeatures::BindBytes: // Not supported - use uniform buffers instead case DeviceFeatures::BindUniform: case DeviceFeatures::BufferRing: case DeviceFeatures::BufferNoCopy: case DeviceFeatures::BufferDeviceAddress: case DeviceFeatures::ShaderTextureLodExt: case DeviceFeatures::StandardDerivativeExt: case DeviceFeatures::SamplerMinMaxLod: case DeviceFeatures::DrawIndexedIndirect: case DeviceFeatures::ExplicitBindingExt: case DeviceFeatures::TextureFormatRG: case DeviceFeatures::ValidationLayersEnabled: case DeviceFeatures::ExternalMemoryObjects: return false; default: return false; } } bool Device::hasRequirement(DeviceRequirement /*requirement*/) const { return false; } bool Device::getFeatureLimits(DeviceFeatureLimits featureLimits, size_t& result) const { // Compile-time validation: IGL constant must not exceed D3D12 API limit static_assert(IGL_VERTEX_ATTRIBUTES_MAX <= D3D12_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT, "IGL_VERTEX_ATTRIBUTES_MAX exceeds D3D12 vertex input limit"); switch (featureLimits) { case DeviceFeatureLimits::BufferAlignment: // D3D12 buffer alignment requirements vary by buffer type: // - Constant buffers: 256 bytes (D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT) // - Storage buffers: 4 bytes (see ShaderStorageBufferOffsetAlignment) // - Vertex/index buffers: 4 bytes (DWORD alignment) // This returns the most restrictive alignment (constant buffers). // See: https://learn.microsoft.com/en-us/windows/win32/direct3d12/constants result = D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT; // 256 bytes return true; case DeviceFeatureLimits::BufferNoCopyAlignment: // D3D12 doesn't support no-copy buffers in the same way as Metal result = 0; return true; case DeviceFeatureLimits::MaxBindBytesBytes: // bind-bytes (like Metal setVertexBytes) not supported on D3D12 result = 0; return true; case DeviceFeatureLimits::MaxCubeMapDimension: // D3D12 cube map dimension limits (Feature Level 11_0+: 16384) result = 16384; // D3D12_REQ_TEXTURECUBE_DIMENSION return true; case DeviceFeatureLimits::MaxFragmentUniformVectors: // D3D12 allows 64KB constant buffers, each vec4 is 16 bytes // 64KB / 16 bytes = 4096 vec4s result = 4096; return true; case DeviceFeatureLimits::MaxMultisampleCount: { // Query the maximum MSAA sample count supported by the device. // Test common sample counts (1, 2, 4, 8, 16) for RGBA8 (most widely supported format). // This provides a conservative estimate; actual support varies by format. // Applications should use getMaxMSAASamplesForFormat() for format-specific queries. auto* device = ctx_->getDevice(); if (!device) { result = 1; // No MSAA support if device unavailable return false; } // Use RGBA8 as reference format (most widely supported) const DXGI_FORMAT referenceFormat = DXGI_FORMAT_R8G8B8A8_UNORM; // Test sample counts in descending order: 16, 8, 4, 2, 1 const uint32_t testCounts[] = {16, 8, 4, 2, 1}; for (uint32_t sampleCount : testCounts) { D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS msqLevels = {}; msqLevels.Format = referenceFormat; msqLevels.SampleCount = sampleCount; msqLevels.Flags = D3D12_MULTISAMPLE_QUALITY_LEVELS_FLAG_NONE; HRESULT hr = device->CheckFeatureSupport( D3D12_FEATURE_MULTISAMPLE_QUALITY_LEVELS, &msqLevels, sizeof(msqLevels)); if (SUCCEEDED(hr) && msqLevels.NumQualityLevels > 0) { result = sampleCount; return true; } } // Fallback to 1x (no MSAA) result = 1; return true; } case DeviceFeatureLimits::MaxPushConstantBytes: // D3D12 root constants: each root constant is 4 bytes (DWORD) // D3D12 root signature limit is 64 DWORDs total, but not all for constants // Conservative limit: 256 bytes (64 DWORDs) result = 256; return true; case DeviceFeatureLimits::MaxTextureDimension1D2D: // D3D12 Feature Level 11_0+: 16384 for 1D and 2D textures // Feature Level 12+: still 16384 result = 16384; // D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION return true; case DeviceFeatureLimits::MaxStorageBufferBytes: // D3D12 structured buffer max size: 128MB (2^27 bytes) // UAV structured buffer limit result = 128 * 1024 * 1024; // 128 MB return true; case DeviceFeatureLimits::MaxUniformBufferBytes: // D3D12 constant buffer size limit: 64KB (65536 bytes) result = 64 * 1024; // D3D12_REQ_CONSTANT_BUFFER_ELEMENT_COUNT * 16 return true; case DeviceFeatureLimits::MaxVertexUniformVectors: // Same as fragment uniform vectors for D3D12 // 64KB / 16 bytes per vec4 = 4096 vec4s result = 4096; return true; case DeviceFeatureLimits::PushConstantsAlignment: // Root constants are aligned to DWORD (4 bytes) result = 4; return true; case DeviceFeatureLimits::ShaderStorageBufferOffsetAlignment: // D3D12 storage buffer (UAV/structured buffer) alignment. // D3D12 structured buffers require 4-byte (DWORD) alignment, unlike constant buffers (256 // bytes) This matches Vulkan's typical minStorageBufferOffsetAlignment (often 16-64 bytes, // device-dependent) See: https://learn.microsoft.com/en-us/windows/win32/direct3d12/alignment result = 4; return true; case DeviceFeatureLimits::MaxTextureDimension3D: // D3D12 3D texture dimension limits (Feature Level 11_0+: 2048) // Feature Level 10_0+: 2048 result = 2048; // D3D12_REQ_TEXTURE3D_U_V_OR_W_DIMENSION return true; case DeviceFeatureLimits::MaxComputeWorkGroupSizeX: // D3D12 compute shader thread group limits result = D3D12_CS_THREAD_GROUP_MAX_X; // 1024 return true; case DeviceFeatureLimits::MaxComputeWorkGroupSizeY: // D3D12 compute shader thread group limits result = D3D12_CS_THREAD_GROUP_MAX_Y; // 1024 return true; case DeviceFeatureLimits::MaxComputeWorkGroupSizeZ: // D3D12 compute shader thread group limits result = D3D12_CS_THREAD_GROUP_MAX_Z; // 64 return true; case DeviceFeatureLimits::MaxComputeWorkGroupInvocations: // D3D12 max threads per thread group result = D3D12_CS_THREAD_GROUP_MAX_THREADS_PER_GROUP; // 1024 return true; case DeviceFeatureLimits::MaxVertexInputAttributes: // D3D12 max vertex input slots (32 per D3D12_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT) result = D3D12_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT; // 32 IGL_DEBUG_ASSERT(IGL_VERTEX_ATTRIBUTES_MAX <= result, "IGL_VERTEX_ATTRIBUTES_MAX exceeds D3D12 reported limit"); return true; case DeviceFeatureLimits::MaxColorAttachments: // D3D12 max simultaneous render targets result = D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT; // 8 return true; // Descriptor heap size limits chosen for cross-platform compatibility. case DeviceFeatureLimits::MaxDescriptorHeapCbvSrvUav: // D3D12 shader-visible CBV/SRV/UAV descriptor heap size // Hardware limit: 1,000,000+ descriptors // Current implementation uses 4096 descriptors (see DescriptorHeapManager::Sizes) // This reports the configured limit, not the hardware maximum result = 4096; return true; case DeviceFeatureLimits::MaxDescriptorHeapSamplers: // D3D12 shader-visible sampler descriptor heap size // Hardware limit: 2048 descriptors (D3D12 spec limit for sampler heaps) // Current implementation uses 2048 descriptors (see DescriptorHeapManager::Sizes) result = 2048; return true; case DeviceFeatureLimits::MaxDescriptorHeapRtvs: // D3D12 CPU-visible RTV descriptor heap size // Hardware limit: 16,384 descriptors // Current implementation uses 256 descriptors (see DescriptorHeapManager::Sizes) result = 256; return true; case DeviceFeatureLimits::MaxDescriptorHeapDsvs: // D3D12 CPU-visible DSV descriptor heap size // Hardware limit: 16,384 descriptors // Current implementation uses 128 descriptors (see DescriptorHeapManager::Sizes) result = 128; return true; } // Should never reach here - all cases handled result = 0; return false; } ICapabilities::TextureFormatCapabilities Device::getTextureFormatCapabilities( TextureFormat format) const { using CapBits = ICapabilities::TextureFormatCapabilityBits; uint8_t caps = 0; // Depth formats: guarantee they are sampleable in shaders for tests switch (format) { case TextureFormat::Z_UNorm16: case TextureFormat::Z_UNorm24: case TextureFormat::Z_UNorm32: case TextureFormat::S8_UInt_Z24_UNorm: case TextureFormat::S8_UInt_Z32_UNorm: caps |= CapBits::Sampled; return caps; default: break; } // D3D12 does not support 3-channel RGB formats natively - they are mapped to RGBA formats // However, 3-channel formats cannot be used as render targets because: // 1. RGB_F16/RGB_F32 map to RGBA equivalents, but D3D12 expects RGBA data layout for RT // 2. Rendering to these formats would require alpha channel handling that IGL doesn't expose // 3. Other backends (OpenGL, Metal) also don't support RGB formats as render targets // See also: OpenGL's DeviceFeatureSet.cpp line 1271 "RGB floating point textures are NOT // renderable" const bool isThreeChannelRgbFormat = format == TextureFormat::RGB_F16 || format == TextureFormat::RGB_F32; auto* dev = ctx_->getDevice(); if (!dev) { return 0; } const DXGI_FORMAT dxgi = textureFormatToDXGIFormat(format); if (dxgi == DXGI_FORMAT_UNKNOWN) { return 0; } D3D12_FEATURE_DATA_FORMAT_SUPPORT fs = {}; fs.Format = dxgi; if (FAILED(dev->CheckFeatureSupport(D3D12_FEATURE_FORMAT_SUPPORT, &fs, sizeof(fs)))) { return 0; } const auto s1 = fs.Support1; const auto s2 = fs.Support2; const auto props = TextureFormatProperties::fromTextureFormat(format); // Enhanced D3D12 format capability mapping. // Map D3D12_FORMAT_SUPPORT1 flags to IGL capabilities // Sampled: Can be used with texture sampling instructions if (s1 & D3D12_FORMAT_SUPPORT1_SHADER_SAMPLE) { caps |= CapBits::Sampled; } // SampledFiltered: Supports linear filtering (only for non-integer color formats) // Also check D3D12_FORMAT_SUPPORT1_SHADER_SAMPLE_COMPARISON for depth formats if (props.hasColor() && !props.isInteger()) { if (s1 & D3D12_FORMAT_SUPPORT1_SHADER_SAMPLE) { caps |= CapBits::SampledFiltered; } } else if (props.hasDepth() || props.hasStencil()) { // Depth formats: check for comparison filtering support if (s1 & D3D12_FORMAT_SUPPORT1_SHADER_SAMPLE_COMPARISON) { caps |= CapBits::SampledFiltered; } } // Attachment: Can be used as render target or depth/stencil attachment // Also consider D3D12_FORMAT_SUPPORT1_BLENDABLE and // D3D12_FORMAT_SUPPORT1_MULTISAMPLE_RENDERTARGET Don't report Attachment capability for 3-channel // RGB formats even if D3D12 reports the underlying RGBA format as renderable - using them as // render targets causes device removal if (!isThreeChannelRgbFormat) { if ((s1 & D3D12_FORMAT_SUPPORT1_RENDER_TARGET) || (s1 & D3D12_FORMAT_SUPPORT1_DEPTH_STENCIL)) { caps |= CapBits::Attachment; } } // Storage: Can be used with unordered access (UAV) // Check for typed UAV load/store, or atomic operations // Enhanced UAV capability detection. const bool hasUAVTypedOps = (s2 & D3D12_FORMAT_SUPPORT2_UAV_TYPED_LOAD) && (s2 & D3D12_FORMAT_SUPPORT2_UAV_TYPED_STORE); const bool hasUAVAtomicOps = (s2 & D3D12_FORMAT_SUPPORT2_UAV_ATOMIC_ADD) || (s2 & D3D12_FORMAT_SUPPORT2_UAV_ATOMIC_BITWISE_OPS) || (s2 & D3D12_FORMAT_SUPPORT2_UAV_ATOMIC_COMPARE_STORE_OR_COMPARE_EXCHANGE) || (s2 & D3D12_FORMAT_SUPPORT2_UAV_ATOMIC_EXCHANGE) || (s2 & D3D12_FORMAT_SUPPORT2_UAV_ATOMIC_SIGNED_MIN_OR_MAX) || (s2 & D3D12_FORMAT_SUPPORT2_UAV_ATOMIC_UNSIGNED_MIN_OR_MAX); if (hasFeature(DeviceFeatures::Compute) && (hasUAVTypedOps || hasUAVAtomicOps)) { caps |= CapBits::Storage; } // SampledAttachment: Can be both sampled and used as attachment if ((caps & CapBits::Sampled) && (caps & CapBits::Attachment)) { caps |= CapBits::SampledAttachment; } #if IGL_DEBUG || defined(IGL_FORCE_ENABLE_LOGS) // Debug logging for unmapped D3D12 capabilities. // This helps identify format capabilities that D3D12 supports but IGL doesn't expose uint32_t unmappedS1 = 0; uint32_t unmappedS2 = 0; // Check unmapped D3D12_FORMAT_SUPPORT1 flags const uint32_t mappedS1 = D3D12_FORMAT_SUPPORT1_SHADER_SAMPLE | D3D12_FORMAT_SUPPORT1_SHADER_SAMPLE_COMPARISON | D3D12_FORMAT_SUPPORT1_RENDER_TARGET | D3D12_FORMAT_SUPPORT1_DEPTH_STENCIL | D3D12_FORMAT_SUPPORT1_BLENDABLE | D3D12_FORMAT_SUPPORT1_MULTISAMPLE_RENDERTARGET; unmappedS1 = s1 & ~mappedS1; // Check unmapped D3D12_FORMAT_SUPPORT2 flags const uint32_t mappedS2 = D3D12_FORMAT_SUPPORT2_UAV_TYPED_LOAD | D3D12_FORMAT_SUPPORT2_UAV_TYPED_STORE | D3D12_FORMAT_SUPPORT2_UAV_ATOMIC_ADD | D3D12_FORMAT_SUPPORT2_UAV_ATOMIC_BITWISE_OPS | D3D12_FORMAT_SUPPORT2_UAV_ATOMIC_COMPARE_STORE_OR_COMPARE_EXCHANGE | D3D12_FORMAT_SUPPORT2_UAV_ATOMIC_EXCHANGE | D3D12_FORMAT_SUPPORT2_UAV_ATOMIC_SIGNED_MIN_OR_MAX | D3D12_FORMAT_SUPPORT2_UAV_ATOMIC_UNSIGNED_MIN_OR_MAX; unmappedS2 = s2 & ~mappedS2; if (unmappedS1 != 0 || unmappedS2 != 0) { IGL_D3D12_LOG_VERBOSE("Format %d (DXGI %d) has unmapped D3D12 capabilities:\n", static_cast(format), static_cast(dxgi)); if (unmappedS1 != 0) { IGL_D3D12_LOG_VERBOSE(" Support1 unmapped flags: 0x%08X\n", unmappedS1); // Log specific unmapped flags that might be useful // Note: Some flags may not be defined in older Windows SDK versions const uint32_t MIP_AUTOGEN = 0x800; // D3D12_FORMAT_SUPPORT1_MIP_AUTOGEN const uint32_t MULTISAMPLE_RESOLVE = 0x40; // D3D12_FORMAT_SUPPORT1_MULTISAMPLE_RESOLVE const uint32_t MULTISAMPLE_LOAD = 0x100000; // D3D12_FORMAT_SUPPORT1_MULTISAMPLE_LOAD if (unmappedS1 & MIP_AUTOGEN) { IGL_D3D12_LOG_VERBOSE(" - MIP_AUTOGEN (0x800)\n"); } if (unmappedS1 & MULTISAMPLE_RESOLVE) { IGL_D3D12_LOG_VERBOSE(" - MULTISAMPLE_RESOLVE (0x40)\n"); } if (unmappedS1 & MULTISAMPLE_LOAD) { IGL_D3D12_LOG_VERBOSE(" - MULTISAMPLE_LOAD (0x100000)\n"); } } if (unmappedS2 != 0) { IGL_D3D12_LOG_VERBOSE(" Support2 unmapped flags: 0x%08X\n", unmappedS2); const uint32_t OUTPUT_MERGER_LOGIC_OP = 0x2; // D3D12_FORMAT_SUPPORT2_OUTPUT_MERGER_LOGIC_OP if (unmappedS2 & OUTPUT_MERGER_LOGIC_OP) { IGL_D3D12_LOG_VERBOSE(" - OUTPUT_MERGER_LOGIC_OP (0x2)\n"); } } } #endif return caps; } ShaderVersion Device::getShaderVersion() const { // Report HLSL SM 6.0 if DXC is available; otherwise SM 5.0 (D3DCompile fallback) bool dxcAvailable = false; #if IGL_PLATFORM_WINDOWS HMODULE h = GetModuleHandleA("dxcompiler.dll"); if (!h) { h = LoadLibraryA("dxcompiler.dll"); } if (h) { FARPROC proc = GetProcAddress(h, "DxcCreateInstance"); dxcAvailable = (proc != nullptr); } #endif if (dxcAvailable) { return ShaderVersion{ShaderFamily::Hlsl, 6, 0, 0}; } return ShaderVersion{ShaderFamily::Hlsl, 5, 0, 0}; } BackendVersion Device::getBackendVersion() const { // Query highest supported feature level to report backend version auto* dev = ctx_->getDevice(); if (!dev) { return BackendVersion{BackendFlavor::D3D12, 0, 0}; } static const D3D_FEATURE_LEVEL kLevels[] = { D3D_FEATURE_LEVEL_12_2, D3D_FEATURE_LEVEL_12_1, D3D_FEATURE_LEVEL_12_0, D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0, }; D3D12_FEATURE_DATA_FEATURE_LEVELS fls = {}; fls.NumFeatureLevels = static_cast(sizeof(kLevels) / sizeof(kLevels[0])); fls.pFeatureLevelsRequested = kLevels; fls.MaxSupportedFeatureLevel = D3D_FEATURE_LEVEL_11_0; if (SUCCEEDED(dev->CheckFeatureSupport(D3D12_FEATURE_FEATURE_LEVELS, &fls, sizeof(fls)))) { switch (fls.MaxSupportedFeatureLevel) { case D3D_FEATURE_LEVEL_12_2: return BackendVersion{BackendFlavor::D3D12, 12, 2}; case D3D_FEATURE_LEVEL_12_1: return BackendVersion{BackendFlavor::D3D12, 12, 1}; case D3D_FEATURE_LEVEL_12_0: return BackendVersion{BackendFlavor::D3D12, 12, 0}; case D3D_FEATURE_LEVEL_11_1: return BackendVersion{BackendFlavor::D3D12, 11, 1}; case D3D_FEATURE_LEVEL_11_0: default: return BackendVersion{BackendFlavor::D3D12, 11, 0}; } } // Fallback if CheckFeatureSupport fails return BackendVersion{BackendFlavor::D3D12, 11, 0}; } BackendType Device::getBackendType() const { return BackendType::D3D12; } // Get sampler cache statistics for telemetry and debugging. SamplerCacheStats Device::getSamplerCacheStats() const { return samplerCache_.getStats(); } // Query maximum MSAA sample count for a specific format. uint32_t Device::getMaxMSAASamplesForFormat(TextureFormat format) const { auto* device = ctx_->getDevice(); if (!device) { return 1; } // Convert IGL format to DXGI format const DXGI_FORMAT dxgiFormat = textureFormatToDXGIFormat(format); if (dxgiFormat == DXGI_FORMAT_UNKNOWN) { IGL_LOG_ERROR("Device::getMaxMSAASamplesForFormat: Unknown format %d\n", static_cast(format)); return 1; } // Test sample counts in descending order: 16, 8, 4, 2, 1 const uint32_t testCounts[] = {16, 8, 4, 2, 1}; for (uint32_t sampleCount : testCounts) { D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS msqLevels = {}; msqLevels.Format = dxgiFormat; msqLevels.SampleCount = sampleCount; msqLevels.Flags = D3D12_MULTISAMPLE_QUALITY_LEVELS_FLAG_NONE; HRESULT hr = device->CheckFeatureSupport( D3D12_FEATURE_MULTISAMPLE_QUALITY_LEVELS, &msqLevels, sizeof(msqLevels)); if (SUCCEEDED(hr) && msqLevels.NumQualityLevels > 0) { return sampleCount; } } return 1; // No MSAA support } void Device::processCompletedUploads() { allocatorPool_.processCompletedUploads(); } Result Device::waitForUploadFence(UINT64 fenceValue) const { return allocatorPool_.waitForUploadFence(*this, fenceValue); } void Device::trackUploadBuffer(igl::d3d12::ComPtr buffer, UINT64 fenceValue) { allocatorPool_.trackUploadBuffer(std::move(buffer), fenceValue); } igl::d3d12::ComPtr Device::getUploadCommandAllocator() { return allocatorPool_.getUploadCommandAllocator(*ctx_); } void Device::returnUploadCommandAllocator(igl::d3d12::ComPtr allocator, UINT64 fenceValue) { allocatorPool_.returnUploadCommandAllocator(std::move(allocator), fenceValue); } size_t Device::getCurrentDrawCount() const { return telemetry_.getDrawCount(); } size_t Device::getShaderCompilationCount() const { return telemetry_.getShaderCompilationCount(); } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/Device.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // For IFenceProvider interface. #include #include #include namespace igl::d3d12 { class PlatformDevice; class UploadRingBuffer; class SamplerState; // Forward declaration for sampler cache class D3D12StagingDevice; // Forward declaration. /// @brief Implements the igl::IDevice interface for DirectX 12 class Device final : public IDevice, public IFenceProvider { public: explicit Device(std::unique_ptr ctx); ~Device() override; // BindGroups [[nodiscard]] Holder createBindGroup( const BindGroupTextureDesc& desc, const IRenderPipelineState* IGL_NULLABLE compatiblePipeline, Result* IGL_NULLABLE outResult) override; [[nodiscard]] Holder createBindGroup(const BindGroupBufferDesc& desc, Result* IGL_NULLABLE outResult) override; void destroy(BindGroupTextureHandle handle) override; void destroy(BindGroupBufferHandle handle) override; void destroy(SamplerHandle handle) override; // Command Queue [[nodiscard]] std::shared_ptr createCommandQueue(const CommandQueueDesc& desc, Result* IGL_NULLABLE outResult) noexcept override; // Resources [[nodiscard]] std::unique_ptr createBuffer(const BufferDesc& desc, Result* IGL_NULLABLE outResult) const noexcept override; // Non-const helper for createBuffer; handles upload operations that mutate internal state. [[nodiscard]] std::unique_ptr createBufferImpl(const BufferDesc& desc, Result* IGL_NULLABLE outResult) noexcept; [[nodiscard]] std::shared_ptr createDepthStencilState( const DepthStencilStateDesc& desc, Result* IGL_NULLABLE outResult) const override; [[nodiscard]] std::unique_ptr createShaderStages(const ShaderStagesDesc& desc, Result* IGL_NULLABLE outResult) const override; [[nodiscard]] std::shared_ptr createSamplerState(const SamplerStateDesc& desc, Result* IGL_NULLABLE outResult) const override; [[nodiscard]] std::shared_ptr createTexture(const TextureDesc& desc, Result* IGL_NULLABLE outResult) const noexcept override; [[nodiscard]] std::shared_ptr createTextureView(std::shared_ptr texture, const TextureViewDesc& desc, Result* IGL_NULLABLE outResult) const noexcept override; [[nodiscard]] std::shared_ptr createTimer( Result* IGL_NULLABLE outResult) const noexcept override; [[nodiscard]] std::shared_ptr createVertexInputState( const VertexInputStateDesc& desc, Result* IGL_NULLABLE outResult) const override; // Pipelines [[nodiscard]] std::shared_ptr createComputePipeline( const ComputePipelineDesc& desc, Result* IGL_NULLABLE outResult) const override; [[nodiscard]] std::shared_ptr createRenderPipeline( const RenderPipelineDesc& desc, Result* IGL_NULLABLE outResult) const override; // D3D12-specific: Create PSO variant with substituted formats (for dynamic PSO selection) // Called by RenderPipelineState::getPipelineState() to create format variants [[nodiscard]] igl::d3d12::ComPtr createPipelineStateVariant( const RenderPipelineDesc& desc, ID3D12RootSignature* rootSignature, Result* IGL_NULLABLE outResult) const; // Shader library and modules [[nodiscard]] std::unique_ptr createShaderLibrary(const ShaderLibraryDesc& desc, Result* IGL_NULLABLE outResult) const override; [[nodiscard]] std::shared_ptr createShaderModule(const ShaderModuleDesc& desc, Result* IGL_NULLABLE outResult) const override; // Framebuffer [[nodiscard]] std::shared_ptr createFramebuffer(const FramebufferDesc& desc, Result* IGL_NULLABLE outResult) override; // Capabilities [[nodiscard]] const IPlatformDevice& getPlatformDevice() const noexcept override; [[nodiscard]] bool hasFeature(DeviceFeatures feature) const override; [[nodiscard]] bool hasRequirement(DeviceRequirement requirement) const override; [[nodiscard]] bool getFeatureLimits(DeviceFeatureLimits featureLimits, size_t& result) const override; [[nodiscard]] TextureFormatCapabilities getTextureFormatCapabilities( TextureFormat format) const override; [[nodiscard]] ShaderVersion getShaderVersion() const override; [[nodiscard]] BackendVersion getBackendVersion() const override; [[nodiscard]] size_t getCurrentDrawCount() const override; [[nodiscard]] size_t getShaderCompilationCount() const override; [[nodiscard]] BackendType getBackendType() const override; [[nodiscard]] void* IGL_NULLABLE getNativeDevice() const override { return ctx_->getDevice(); } [[nodiscard]] base::IFramebufferInterop* IGL_NULLABLE createFramebufferInterop(const base::FramebufferInteropDesc& desc) override; void incrementDrawCount(size_t n) { telemetry_.incrementDrawCount(n); } D3D12Context& getD3D12Context() { return *ctx_; } [[nodiscard]] const D3D12Context& getD3D12Context() const { return *ctx_; } // Bind group accessors for RenderCommandEncoder [[nodiscard]] const BindGroupTextureDesc* getBindGroupTextureDesc( BindGroupTextureHandle handle) const { return bindGroupTexturesPool_.get(handle); } [[nodiscard]] const BindGroupBufferDesc* getBindGroupBufferDesc( BindGroupBufferHandle handle) const { return bindGroupBuffersPool_.get(handle); } // Device capabilities accessors. [[nodiscard]] const D3D12_FEATURE_DATA_D3D12_OPTIONS& getDeviceOptions() const { return capabilities_.getOptions(); } [[nodiscard]] const D3D12_FEATURE_DATA_D3D12_OPTIONS1& getDeviceOptions1() const { return capabilities_.getOptions1(); } [[nodiscard]] D3D12_RESOURCE_BINDING_TIER getResourceBindingTier() const { return capabilities_.getResourceBindingTier(); } void processCompletedUploads(); void trackUploadBuffer(igl::d3d12::ComPtr buffer, UINT64 fenceValue); // Command allocator pool access for upload operations. igl::d3d12::ComPtr getUploadCommandAllocator(); void returnUploadCommandAllocator(igl::d3d12::ComPtr allocator, UINT64 fenceValue); ID3D12Fence* getUploadFence() const { return allocatorPool_.getUploadFence(); } UINT64 getNextUploadFenceValue() { return allocatorPool_.getNextUploadFenceValue(); } Result waitForUploadFence(UINT64 fenceValue) const; // IFenceProvider implementation (shared fence timeline). uint64_t getNextFenceValue() override { return getNextUploadFenceValue(); } // Upload ring buffer access. UploadRingBuffer* getUploadRingBuffer() const { return allocatorPool_.getUploadRingBuffer(); } // Check for device removal and return error Result if detected. [[nodiscard]] Result checkDeviceRemoval() const; // Query if device has been lost. [[nodiscard]] bool isDeviceLost() const { return deviceLost_; } // Sampler cache statistics. [[nodiscard]] SamplerCacheStats getSamplerCacheStats() const; // Query maximum MSAA sample count for a specific format. // Returns 1 if the format does not support MSAA. [[nodiscard]] uint32_t getMaxMSAASamplesForFormat(TextureFormat format) const; private: // Alignment validation helpers. bool validateMSAAAlignment(const TextureDesc& desc, Result* IGL_NULLABLE outResult) const; bool validateTextureAlignment(const D3D12_RESOURCE_DESC& resourceDesc, uint32_t sampleCount, Result* IGL_NULLABLE outResult) const; bool validateBufferAlignment(size_t bufferSize, bool isUniform) const; // Alignment constants. static constexpr size_t MSAA_ALIGNMENT = 65536; // 64KB for MSAA textures static constexpr size_t BUFFER_ALIGNMENT = 256; // 256 bytes for constant buffers static constexpr size_t DEFAULT_TEXTURE_ALIGNMENT = 65536; // 64KB default for textures D3D12DeviceCapabilities capabilities_; std::unique_ptr ctx_; std::unique_ptr platformDevice_; D3D12Telemetry telemetry_; // Bind group pools Pool bindGroupTexturesPool_; Pool bindGroupBuffersPool_; // Upload tracking state (non-mutable, mutated only from non-const paths). // Modified by createBufferImpl, Buffer::upload, Texture::upload via non-const Device references // and synchronized via pendingUploadsMutex_ for thread-safe access. D3D12AllocatorPool allocatorPool_; D3D12PipelineCache pipelineCache_; D3D12SamplerCache samplerCache_; // Device lost flag and reason for fatal error handling (atomic for thread-safe access). mutable std::atomic deviceLost_{false}; mutable std::string deviceLostReason_; // Cached reason for diagnostics public: // Shared staging infrastructure for upload/readback operations. // Used by Buffer, Texture, Framebuffer, CommandBuffer for centralized resource management. [[nodiscard]] D3D12ImmediateCommands* getImmediateCommands() const { return allocatorPool_.getImmediateCommands(); } [[nodiscard]] D3D12StagingDevice* getStagingDevice() const { return allocatorPool_.getStagingDevice(); } // Access pre-compiled mipmap shaders. [[nodiscard]] bool areMipmapShadersAvailable() const { return pipelineCache_.mipmapShadersAvailable_; } [[nodiscard]] const std::vector& getMipmapVSBytecode() const { return pipelineCache_.mipmapVSBytecode_; } [[nodiscard]] const std::vector& getMipmapPSBytecode() const { return pipelineCache_.mipmapPSBytecode_; } [[nodiscard]] ID3D12RootSignature* getMipmapRootSignature() const { return pipelineCache_.mipmapRootSignature_.Get(); } }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/Framebuffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #include #include #include #include namespace igl::d3d12 { namespace { // Import ComPtr for readability template using ComPtr = igl::d3d12::ComPtr; } // namespace Framebuffer::Framebuffer(const FramebufferDesc& desc) : desc_(desc) {} Framebuffer::~Framebuffer() { // FenceWaiter RAII handles event cleanup automatically } std::vector Framebuffer::getColorAttachmentIndices() const { std::vector indices; indices.reserve(IGL_COLOR_ATTACHMENTS_MAX); for (size_t i = 0; i < IGL_COLOR_ATTACHMENTS_MAX; ++i) { if (desc_.colorAttachments[i].texture) { indices.push_back(i); } } return indices; } std::shared_ptr Framebuffer::getColorAttachment(size_t index) const { if (index < IGL_COLOR_ATTACHMENTS_MAX) { return desc_.colorAttachments[index].texture; } return nullptr; } std::shared_ptr Framebuffer::getResolveColorAttachment(size_t index) const { if (index < IGL_COLOR_ATTACHMENTS_MAX) { return desc_.colorAttachments[index].resolveTexture; } return nullptr; } std::shared_ptr Framebuffer::getDepthAttachment() const { return desc_.depthAttachment.texture; } std::shared_ptr Framebuffer::getResolveDepthAttachment() const { return desc_.depthAttachment.resolveTexture; } std::shared_ptr Framebuffer::getStencilAttachment() const { return desc_.stencilAttachment.texture; } FramebufferMode Framebuffer::getMode() const { return desc_.mode; } bool Framebuffer::isSwapchainBound() const { return false; } void Framebuffer::copyBytesColorAttachment(ICommandQueue& cmdQueue, size_t index, void* pixelBytes, const TextureRangeDesc& range, size_t bytesPerRow) const { if (!pixelBytes || index >= IGL_COLOR_ATTACHMENTS_MAX) { return; } auto* d3dQueueWrapper = dynamic_cast(&cmdQueue); if (!d3dQueueWrapper) { return; } auto& iglDevice = d3dQueueWrapper->getDevice(); auto& ctx = iglDevice.getD3D12Context(); auto* device = ctx.getDevice(); if (!device) { return; } // Get shared infrastructure used for readback. auto* immediateCommands = iglDevice.getImmediateCommands(); auto* stagingDevice = iglDevice.getStagingDevice(); if (!immediateCommands || !stagingDevice) { IGL_LOG_ERROR("Framebuffer::copyBytesColorAttachment - Shared infrastructure not available\n"); return; } auto srcTex = std::static_pointer_cast(desc_.colorAttachments[index].texture); if (!srcTex) { return; } ID3D12Resource* srcRes = srcTex->getResource(); if (!srcRes) { return; } const uint32_t mipLevel = range.mipLevel; const uint32_t copyLayer = (srcTex->getType() == TextureType::Cube) ? range.face : range.layer; const uint32_t subresourceIndex = srcTex->calcSubresourceIndex(mipLevel, copyLayer); const auto texDims = srcTex->getDimensions(); const uint32_t mipWidth = std::max(1u, texDims.width >> mipLevel); const uint32_t mipHeight = std::max(1u, texDims.height >> mipLevel); const UINT64 frameFenceValue = ctx.getFenceValue(); auto& cache = readbackCache_[index]; const auto fmtProps = TextureFormatProperties::fromTextureFormat(srcTex->getFormat()); const size_t bytesPerPixel = std::max(fmtProps.bytesPerBlock, 1); const size_t fullRowBytes = static_cast(mipWidth) * bytesPerPixel; bool cacheUpToDate = cache.cacheValid && cache.cachedFrameFenceValue == frameFenceValue && cache.cachedMipLevel == mipLevel && cache.cachedLayer == copyLayer && cache.cachedWidth == mipWidth && cache.cachedHeight == mipHeight && cache.cachedBytesPerPixel == bytesPerPixel; if (!cacheUpToDate) { const auto refreshStart = std::chrono::high_resolution_clock::now(); D3D12_RESOURCE_DESC srcDesc = srcRes->GetDesc(); D3D12_PLACED_SUBRESOURCE_FOOTPRINT footprint{}; UINT numRows = 0; UINT64 rowSizeInBytes = 0; UINT64 totalBytes = 0; device->GetCopyableFootprints( &srcDesc, subresourceIndex, 1, 0, &footprint, &numRows, &rowSizeInBytes, &totalBytes); if (totalBytes == 0) { return; } // Use D3D12StagingDevice for readback buffer allocation. auto stagingBuffer = stagingDevice->allocateReadback(totalBytes); if (!stagingBuffer.valid || !stagingBuffer.buffer.Get()) { IGL_LOG_ERROR("Framebuffer::copyBytesColorAttachment - Failed to allocate readback buffer\n"); cache.cacheValid = false; return; } // Use D3D12ImmediateCommands for the copy operation. Result result; ID3D12GraphicsCommandList* cmdList = immediateCommands->begin(&result); if (!cmdList || !result.isOk()) { IGL_LOG_ERROR("Framebuffer::copyBytesColorAttachment - Failed to begin command list: %s\n", result.message.c_str()); stagingDevice->free(stagingBuffer, 0); cache.cacheValid = false; return; } const auto previousState = srcTex->getSubresourceState(mipLevel, copyLayer); srcTex->transitionTo(cmdList, D3D12_RESOURCE_STATE_COPY_SOURCE, mipLevel, copyLayer); D3D12_TEXTURE_COPY_LOCATION dstLoc{}; dstLoc.pResource = stagingBuffer.buffer.Get(); dstLoc.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT; dstLoc.PlacedFootprint = footprint; D3D12_TEXTURE_COPY_LOCATION srcLoc{}; srcLoc.pResource = srcRes; srcLoc.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; srcLoc.SubresourceIndex = subresourceIndex; D3D12_BOX srcBox{}; srcBox.left = 0; srcBox.top = 0; srcBox.front = 0; srcBox.right = mipWidth; srcBox.bottom = mipHeight; srcBox.back = 1; cmdList->CopyTextureRegion(&dstLoc, 0, 0, 0, &srcLoc, &srcBox); srcTex->transitionTo(cmdList, previousState, mipLevel, copyLayer); // Submit and wait using the shared fence. uint64_t fenceValue = immediateCommands->submit(true, &result); if (fenceValue == 0 || !result.isOk()) { IGL_LOG_ERROR("Framebuffer::copyBytesColorAttachment - Failed to submit command list: %s\n", result.message.c_str()); stagingDevice->free(stagingBuffer, 0); cache.cacheValid = false; return; } // Map and read the readback buffer void* mapped = nullptr; D3D12_RANGE readRange{0, totalBytes}; if (FAILED(stagingBuffer.buffer->Map(0, &readRange, &mapped))) { IGL_LOG_ERROR("Framebuffer::copyBytesColorAttachment - Failed to map readback buffer\n"); stagingDevice->free(stagingBuffer, fenceValue); cache.cacheValid = false; return; } const uint8_t* srcPtr = static_cast(mapped) + footprint.Offset; const size_t srcRowPitch = footprint.Footprint.RowPitch; const size_t copyRowBytes = fullRowBytes; cache.cachedRowPitch = static_cast(fullRowBytes); cache.cachedData.resize(static_cast(cache.cachedRowPitch) * static_cast(mipHeight)); // Direct copy with vertical flip only; no channel swap needed. // DXGI_FORMAT_R8G8B8A8_UNORM has R,G,B,A byte order matching IGL expectations. for (uint32_t row = 0; row < mipHeight; ++row) { const uint8_t* s = srcPtr + static_cast(row) * srcRowPitch; uint8_t* d = cache.cachedData.data() + static_cast(mipHeight - 1 - row) * static_cast(cache.cachedRowPitch); std::memcpy(d, s, copyRowBytes); } stagingBuffer.buffer->Unmap(0, nullptr); // Free the staging buffer back to the pool. stagingDevice->free(stagingBuffer, fenceValue); cache.cachedWidth = mipWidth; cache.cachedHeight = mipHeight; cache.cachedBytesPerPixel = bytesPerPixel; cache.cachedMipLevel = mipLevel; cache.cachedLayer = copyLayer; cache.cachedFrameFenceValue = frameFenceValue; cache.cacheValid = true; const auto refreshEnd = std::chrono::high_resolution_clock::now(); const double refreshMs = std::chrono::duration(refreshEnd - refreshStart).count(); IGL_D3D12_LOG_VERBOSE( "copyBytesColorAttachment: refreshed subresource (mip=%u, layer=%u) in %.2f ms (%ux%u)\n", mipLevel, copyLayer, refreshMs, mipWidth, mipHeight); } if (!cache.cacheValid) { return; } if (range.width == 0 || range.height == 0 || range.x + range.width > cache.cachedWidth || range.y + range.height > cache.cachedHeight) { return; } const size_t copyRowBytes = static_cast(range.width) * cache.cachedBytesPerPixel; const size_t dstRowPitch = bytesPerRow ? bytesPerRow : copyRowBytes; uint8_t* dstPtr = static_cast(pixelBytes); for (uint32_t destRow = 0; destRow < range.height; ++destRow) { const uint32_t gpuRow = range.y + (range.height - 1 - destRow); if (gpuRow >= cache.cachedHeight) { return; } const uint32_t cachedRow = cache.cachedHeight - 1 - gpuRow; const uint8_t* src = cache.cachedData.data() + static_cast(cachedRow) * static_cast(cache.cachedRowPitch) + static_cast(range.x) * cache.cachedBytesPerPixel; std::memcpy(dstPtr + static_cast(destRow) * dstRowPitch, src, copyRowBytes); } } void Framebuffer::copyBytesDepthAttachment(ICommandQueue& cmdQueue, void* pixelBytes, const TextureRangeDesc& range, size_t bytesPerRow) const { // Depth attachment readback. if (!pixelBytes) { return; } auto* d3dQueueWrapper = dynamic_cast(&cmdQueue); if (!d3dQueueWrapper) { return; } auto& iglDevice = d3dQueueWrapper->getDevice(); auto& ctx = iglDevice.getD3D12Context(); auto* device = ctx.getDevice(); if (!device) { return; } // Get shared staging infrastructure. auto* immediateCommands = iglDevice.getImmediateCommands(); auto* stagingDevice = iglDevice.getStagingDevice(); if (!immediateCommands || !stagingDevice) { IGL_LOG_ERROR("Framebuffer::copyBytesDepthAttachment - Shared infrastructure not available\n"); return; } auto depthTex = std::static_pointer_cast(desc_.depthAttachment.texture); if (!depthTex) { return; } ID3D12Resource* depthRes = depthTex->getResource(); if (!depthRes) { return; } const uint32_t mipLevel = range.mipLevel; const uint32_t copyLayer = (depthTex->getType() == TextureType::Cube) ? range.face : range.layer; const uint32_t subresourceIndex = depthTex->calcSubresourceIndex(mipLevel, copyLayer); const auto texDims = depthTex->getDimensions(); const uint32_t mipWidth = std::max(1u, texDims.width >> mipLevel); const uint32_t mipHeight = std::max(1u, texDims.height >> mipLevel); // Get footprint for the depth resource D3D12_RESOURCE_DESC depthDesc = depthRes->GetDesc(); // Validate and log depth format to clarify raw-bits vs converted-float behavior. const DXGI_FORMAT depthFormat = depthDesc.Format; const bool isD32Float = (depthFormat == DXGI_FORMAT_D32_FLOAT || depthFormat == DXGI_FORMAT_D32_FLOAT_S8X24_UINT); if (!isD32Float) { IGL_D3D12_LOG_VERBOSE( "Framebuffer::copyBytesDepthAttachment - Format 0x%X is not D32_FLOAT; " "returning raw GPU bits (not normalized [0,1] floats). " "For UNORM formats, caller must convert manually.\n", static_cast(depthFormat)); } D3D12_PLACED_SUBRESOURCE_FOOTPRINT footprint{}; UINT numRows = 0; UINT64 rowSizeInBytes = 0; UINT64 totalBytes = 0; device->GetCopyableFootprints( &depthDesc, subresourceIndex, 1, 0, &footprint, &numRows, &rowSizeInBytes, &totalBytes); if (totalBytes == 0) { return; } // Allocate readback buffer from the staging device. auto stagingBuffer = stagingDevice->allocateReadback(totalBytes); if (!stagingBuffer.valid || !stagingBuffer.buffer.Get()) { IGL_LOG_ERROR("Framebuffer::copyBytesDepthAttachment - Failed to allocate readback buffer\n"); return; } // Begin immediate command recording. Result result; ID3D12GraphicsCommandList* cmdList = immediateCommands->begin(&result); if (!cmdList || !result.isOk()) { IGL_LOG_ERROR("Framebuffer::copyBytesDepthAttachment - Failed to begin command list: %s\n", result.message.c_str()); stagingDevice->free(stagingBuffer, 0); return; } // Transition depth texture to copy source const auto previousState = depthTex->getSubresourceState(mipLevel, copyLayer); depthTex->transitionTo(cmdList, D3D12_RESOURCE_STATE_COPY_SOURCE, mipLevel, copyLayer); // Set up copy locations D3D12_TEXTURE_COPY_LOCATION dstLoc{}; dstLoc.pResource = stagingBuffer.buffer.Get(); dstLoc.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT; dstLoc.PlacedFootprint = footprint; D3D12_TEXTURE_COPY_LOCATION srcLoc{}; srcLoc.pResource = depthRes; srcLoc.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; srcLoc.SubresourceIndex = subresourceIndex; D3D12_BOX srcBox{}; srcBox.left = 0; srcBox.top = 0; srcBox.front = 0; srcBox.right = mipWidth; srcBox.bottom = mipHeight; srcBox.back = 1; // Copy depth data cmdList->CopyTextureRegion(&dstLoc, 0, 0, 0, &srcLoc, &srcBox); // Transition back to previous state depthTex->transitionTo(cmdList, previousState, mipLevel, copyLayer); // Submit and wait using the shared fence. uint64_t fenceValue = immediateCommands->submit(true, &result); if (fenceValue == 0 || !result.isOk()) { IGL_LOG_ERROR("Framebuffer::copyBytesDepthAttachment - Failed to submit command list: %s\n", result.message.c_str()); stagingDevice->free(stagingBuffer, 0); return; } // Map readback buffer and copy data void* mapped = nullptr; D3D12_RANGE readRange{0, totalBytes}; if (FAILED(stagingBuffer.buffer->Map(0, &readRange, &mapped))) { IGL_LOG_ERROR("Framebuffer::copyBytesDepthAttachment - Failed to map readback buffer\n"); stagingDevice->free(stagingBuffer, fenceValue); return; } // Validate range bounds before copying. if (range.width == 0 || range.height == 0 || range.x + range.width > mipWidth || range.y + range.height > mipHeight) { IGL_LOG_ERROR( "Framebuffer::copyBytesDepthAttachment - Invalid range: [%u,%u %ux%u] exceeds mip size " "%ux%u\n", range.x, range.y, range.width, range.height, mipWidth, mipHeight); stagingBuffer.buffer->Unmap(0, nullptr); stagingDevice->free(stagingBuffer, fenceValue); return; } const uint8_t* srcPtr = static_cast(mapped) + footprint.Offset; const size_t srcRowPitch = footprint.Footprint.RowPitch; // Depth readback contract: callers (tests) provide a float-per-pixel buffer. // Use 4 bytes per destination pixel regardless of the underlying DXGI format, // and only copy that many bytes from the GPU data to avoid overrunning the // caller's buffer (e.g., for combined depth-stencil formats like D32_S8). // // LIMITATION: This implementation assumes a "raw bits" contract - it copies // the native GPU representation without format conversion. This is correct for // D32_FLOAT (which is already IEEE 754 float), but for normalized integer depth // formats (D16_UNORM, D24_UNORM_S8_UINT), the copied data is raw bits, not // converted [0,1] floats. Callers expecting normalized depth values from non-float // formats will receive unconverted data. Future work should add format detection // and explicit UNORM-to-float conversion for broader compatibility. constexpr size_t kDstBytesPerPixel = sizeof(float); // Derive the native bytes-per-pixel for the copied subresource using the // rowSizeInBytes returned by GetCopyableFootprints when possible. size_t nativeBytesPerPixel = 0; if (mipWidth > 0 && rowSizeInBytes > 0) { nativeBytesPerPixel = static_cast(rowSizeInBytes) / static_cast(mipWidth); } const size_t copyRowBytes = static_cast(range.width) * kDstBytesPerPixel; const size_t dstRowPitch = bytesPerRow ? bytesPerRow : copyRowBytes; uint8_t* dstPtr = static_cast(pixelBytes); for (uint32_t destRow = 0; destRow < range.height; ++destRow) { const uint32_t gpuRow = range.y + (range.height - 1 - destRow); if (gpuRow >= mipHeight) { break; } const uint32_t srcRow = mipHeight - 1 - gpuRow; const uint8_t* src = srcPtr + static_cast(srcRow) * srcRowPitch + static_cast(range.x) * (nativeBytesPerPixel > 0 ? nativeBytesPerPixel : kDstBytesPerPixel); std::memcpy(dstPtr + static_cast(destRow) * dstRowPitch, src, copyRowBytes); } stagingBuffer.buffer->Unmap(0, nullptr); // Free staging buffer back to the pool. stagingDevice->free(stagingBuffer, fenceValue); } void Framebuffer::copyBytesStencilAttachment(ICommandQueue& cmdQueue, void* pixelBytes, const TextureRangeDesc& range, size_t bytesPerRow) const { // Stencil attachment readback. if (!pixelBytes) { return; } auto* d3dQueueWrapper = dynamic_cast(&cmdQueue); if (!d3dQueueWrapper) { return; } auto& iglDevice = d3dQueueWrapper->getDevice(); auto& ctx = iglDevice.getD3D12Context(); auto* device = ctx.getDevice(); if (!device) { return; } // Get shared infrastructure. auto* immediateCommands = iglDevice.getImmediateCommands(); auto* stagingDevice = iglDevice.getStagingDevice(); if (!immediateCommands || !stagingDevice) { IGL_LOG_ERROR( "Framebuffer::copyBytesStencilAttachment - Shared infrastructure not available\n"); return; } auto stencilTex = std::static_pointer_cast(desc_.stencilAttachment.texture); if (!stencilTex) { return; } ID3D12Resource* stencilRes = stencilTex->getResource(); if (!stencilRes) { return; } const uint32_t mipLevel = range.mipLevel; const uint32_t copyLayer = (stencilTex->getType() == TextureType::Cube) ? range.face : range.layer; // Detect stencil format and select the appropriate plane slice. D3D12_RESOURCE_DESC stencilDesc = stencilRes->GetDesc(); const DXGI_FORMAT stencilFormat = stencilDesc.Format; // Determine plane slice based on format: // - Planar depth-stencil formats: stencil is in plane 1 // - Pure stencil formats: plane 0 UINT planeSlice = 0; // Default for non-planar if (stencilFormat == DXGI_FORMAT_D24_UNORM_S8_UINT || stencilFormat == DXGI_FORMAT_D32_FLOAT_S8X24_UINT || stencilFormat == DXGI_FORMAT_R24G8_TYPELESS || stencilFormat == DXGI_FORMAT_R32G8X24_TYPELESS) { // Planar depth-stencil: Plane 0 = depth, Plane 1 = stencil planeSlice = 1; } else if (stencilFormat == DXGI_FORMAT_R8_TYPELESS) { // Pure stencil formats: Plane 0 planeSlice = 0; } else { IGL_LOG_ERROR( "Framebuffer::copyBytesStencilAttachment - Unsupported stencil format 0x%X; " "assuming plane 0. May fail for planar formats.\n", static_cast(stencilFormat)); IGL_DEBUG_ASSERT(false, "Unsupported stencil format - add to known format list"); planeSlice = 0; } const UINT numMipLevels = stencilTex->getNumMipLevels(); const UINT numLayers = stencilTex->getNumLayers(); const uint32_t subresourceIndex = D3D12CalcSubresource(mipLevel, copyLayer, planeSlice, numMipLevels, numLayers); const auto texDims = stencilTex->getDimensions(); const uint32_t mipWidth = std::max(1u, texDims.width >> mipLevel); const uint32_t mipHeight = std::max(1u, texDims.height >> mipLevel); // Get footprint for the stencil plane (reuse stencilDesc from above) D3D12_PLACED_SUBRESOURCE_FOOTPRINT footprint{}; UINT numRows = 0; UINT64 rowSizeInBytes = 0; UINT64 totalBytes = 0; device->GetCopyableFootprints( &stencilDesc, subresourceIndex, 1, 0, &footprint, &numRows, &rowSizeInBytes, &totalBytes); if (totalBytes == 0) { return; } // Allocate readback buffer from the staging device. auto stagingBuffer = stagingDevice->allocateReadback(totalBytes); if (!stagingBuffer.valid || !stagingBuffer.buffer.Get()) { IGL_LOG_ERROR("Framebuffer::copyBytesStencilAttachment - Failed to allocate readback buffer\n"); return; } // Begin immediate command recording. Result result; ID3D12GraphicsCommandList* cmdList = immediateCommands->begin(&result); if (!cmdList || !result.isOk()) { IGL_LOG_ERROR("Framebuffer::copyBytesStencilAttachment - Failed to begin command list: %s\n", result.message.c_str()); stagingDevice->free(stagingBuffer, 0); return; } // Transition stencil texture to copy source const auto previousState = stencilTex->getSubresourceState(mipLevel, copyLayer); stencilTex->transitionTo(cmdList, D3D12_RESOURCE_STATE_COPY_SOURCE, mipLevel, copyLayer); // Set up copy locations for stencil plane D3D12_TEXTURE_COPY_LOCATION dstLoc{}; dstLoc.pResource = stagingBuffer.buffer.Get(); dstLoc.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT; dstLoc.PlacedFootprint = footprint; D3D12_TEXTURE_COPY_LOCATION srcLoc{}; srcLoc.pResource = stencilRes; srcLoc.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; srcLoc.SubresourceIndex = subresourceIndex; D3D12_BOX srcBox{}; srcBox.left = 0; srcBox.top = 0; srcBox.front = 0; srcBox.right = mipWidth; srcBox.bottom = mipHeight; srcBox.back = 1; // Copy stencil data cmdList->CopyTextureRegion(&dstLoc, 0, 0, 0, &srcLoc, &srcBox); // Transition back to previous state stencilTex->transitionTo(cmdList, previousState, mipLevel, copyLayer); // Submit and wait using the shared fence. uint64_t fenceValue = immediateCommands->submit(true, &result); if (fenceValue == 0 || !result.isOk()) { IGL_LOG_ERROR("Framebuffer::copyBytesStencilAttachment - Failed to submit command list: %s\n", result.message.c_str()); stagingDevice->free(stagingBuffer, 0); return; } // Map readback buffer and copy data void* mapped = nullptr; D3D12_RANGE readRange{0, totalBytes}; if (FAILED(stagingBuffer.buffer->Map(0, &readRange, &mapped))) { IGL_LOG_ERROR("Framebuffer::copyBytesStencilAttachment - Failed to map readback buffer\n"); stagingDevice->free(stagingBuffer, fenceValue); return; } // Validate range bounds before copying. if (range.width == 0 || range.height == 0 || range.x + range.width > mipWidth || range.y + range.height > mipHeight) { IGL_LOG_ERROR( "Framebuffer::copyBytesStencilAttachment - Invalid range: [%u,%u %ux%u] exceeds mip size " "%ux%u\n", range.x, range.y, range.width, range.height, mipWidth, mipHeight); stagingBuffer.buffer->Unmap(0, nullptr); stagingDevice->free(stagingBuffer, fenceValue); return; } const uint8_t* srcPtr = static_cast(mapped) + footprint.Offset; const size_t srcRowPitch = footprint.Footprint.RowPitch; // Stencil is always 8-bit (1 byte per pixel) const size_t bytesPerPixel = 1; // Copy with vertical flip (D3D12 textures are top-down, IGL expects bottom-up) const size_t copyRowBytes = static_cast(range.width) * bytesPerPixel; const size_t dstRowPitch = bytesPerRow ? bytesPerRow : copyRowBytes; uint8_t* dstPtr = static_cast(pixelBytes); for (uint32_t destRow = 0; destRow < range.height; ++destRow) { const uint32_t gpuRow = range.y + (range.height - 1 - destRow); if (gpuRow >= mipHeight) { break; } const uint32_t srcRow = mipHeight - 1 - gpuRow; const uint8_t* src = srcPtr + static_cast(srcRow) * srcRowPitch + static_cast(range.x) * bytesPerPixel; std::memcpy(dstPtr + static_cast(destRow) * dstRowPitch, src, copyRowBytes); } stagingBuffer.buffer->Unmap(0, nullptr); // Free staging buffer back to the pool. stagingDevice->free(stagingBuffer, fenceValue); } void Framebuffer::copyTextureColorAttachment(ICommandQueue& cmdQueue, size_t index, std::shared_ptr destTexture, const TextureRangeDesc& range) const { // Bounds check for index parameter if (index >= IGL_COLOR_ATTACHMENTS_MAX) { IGL_LOG_ERROR("Framebuffer::copyTextureColorAttachment: index %zu out of bounds (max %u)\n", index, IGL_COLOR_ATTACHMENTS_MAX); return; } // Get device and shared infrastructure directly (avoid transient CommandBuffer). auto* d3dQueueWrapper = dynamic_cast(&cmdQueue); if (!d3dQueueWrapper) { IGL_LOG_ERROR("Framebuffer::copyTextureColorAttachment - Invalid command queue\n"); IGL_DEBUG_ASSERT(false, "D3D12 Framebuffer used with non-D3D12 command queue"); return; } auto& iglDevice = d3dQueueWrapper->getDevice(); auto* immediateCommands = iglDevice.getImmediateCommands(); if (!immediateCommands) { IGL_LOG_ERROR("Framebuffer::copyTextureColorAttachment - Immediate commands not available\n"); IGL_DEBUG_ASSERT(false, "D3D12ImmediateCommands not initialized"); return; } auto srcTex = std::static_pointer_cast(desc_.colorAttachments[index].texture); auto dstTex = std::static_pointer_cast(destTexture); if (!srcTex || !dstTex) { return; } ID3D12Resource* srcRes = srcTex->getResource(); ID3D12Resource* dstRes = dstTex->getResource(); if (!srcRes || !dstRes) { return; } Result result; ID3D12GraphicsCommandList* cmdList = immediateCommands->begin(&result); if (!cmdList || !result.isOk()) { IGL_LOG_ERROR("Framebuffer::copyTextureColorAttachment - Failed to begin command list: %s\n", result.message.c_str()); return; } const uint32_t mipLevel = range.mipLevel; const uint32_t layer = range.layer; const auto srcPrevState = srcTex->getSubresourceState(mipLevel, layer); srcTex->transitionTo(cmdList, D3D12_RESOURCE_STATE_COPY_SOURCE, mipLevel, layer); dstTex->transitionTo(cmdList, D3D12_RESOURCE_STATE_COPY_DEST, mipLevel, layer); // Calculate proper subresource indices for array textures and cubemaps // D3D12CalcSubresource(MipSlice, ArraySlice, PlaneSlice, MipLevels, ArraySize) const UINT srcMipLevels = srcTex->getNumMipLevels(); const UINT dstMipLevels = dstTex->getNumMipLevels(); const UINT srcArraySize = srcTex->getNumLayers(); const UINT dstArraySize = dstTex->getNumLayers(); D3D12_TEXTURE_COPY_LOCATION dstLoc{}; dstLoc.pResource = dstRes; dstLoc.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; dstLoc.SubresourceIndex = D3D12CalcSubresource(mipLevel, layer, 0, dstMipLevels, dstArraySize); D3D12_TEXTURE_COPY_LOCATION srcLoc{}; srcLoc.pResource = srcRes; srcLoc.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; srcLoc.SubresourceIndex = D3D12CalcSubresource(mipLevel, layer, 0, srcMipLevels, srcArraySize); D3D12_BOX srcBox{}; srcBox.left = range.x; srcBox.top = range.y; srcBox.front = 0; srcBox.right = range.x + range.width; srcBox.bottom = range.y + range.height; srcBox.back = 1; cmdList->CopyTextureRegion(&dstLoc, range.x, range.y, 0, &srcLoc, &srcBox); // Transition dest to shader resource for sampling. Source back to its previous state. srcTex->transitionTo(cmdList, srcPrevState, mipLevel, layer); dstTex->transitionTo(cmdList, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, mipLevel, layer); // Submit and wait using the shared fence (replaces manual CreateEvent/WaitForSingleObject). uint64_t fenceValue = immediateCommands->submit(true, &result); if (fenceValue == 0 || !result.isOk()) { IGL_LOG_ERROR("Framebuffer::copyTextureColorAttachment - Failed to submit command list: %s\n", result.message.c_str()); return; } } void Framebuffer::updateDrawable(std::shared_ptr texture) { desc_.colorAttachments[0].texture = std::move(texture); } void Framebuffer::updateDrawable(SurfaceTextures surfaceTextures) { desc_.colorAttachments[0].texture = std::move(surfaceTextures.color); desc_.depthAttachment.texture = surfaceTextures.depth; // Depth and stencil typically share the same texture desc_.stencilAttachment.texture = std::move(surfaceTextures.depth); } void Framebuffer::updateResolveAttachment(std::shared_ptr texture) { desc_.colorAttachments[0].resolveTexture = std::move(texture); } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/Framebuffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include namespace igl::d3d12 { class Framebuffer final : public IFramebuffer { public: Framebuffer(const FramebufferDesc& desc); ~Framebuffer() override; std::vector getColorAttachmentIndices() const override; std::shared_ptr getColorAttachment(size_t index) const override; std::shared_ptr getResolveColorAttachment(size_t index) const override; std::shared_ptr getDepthAttachment() const override; std::shared_ptr getResolveDepthAttachment() const override; std::shared_ptr getStencilAttachment() const override; FramebufferMode getMode() const override; bool isSwapchainBound() const override; void copyBytesColorAttachment(ICommandQueue& cmdQueue, size_t index, void* pixelBytes, const TextureRangeDesc& range, size_t bytesPerRow) const override; void copyBytesDepthAttachment(ICommandQueue& cmdQueue, void* pixelBytes, const TextureRangeDesc& range, size_t bytesPerRow) const override; void copyBytesStencilAttachment(ICommandQueue& cmdQueue, void* pixelBytes, const TextureRangeDesc& range, size_t bytesPerRow) const override; void copyTextureColorAttachment(ICommandQueue& cmdQueue, size_t index, std::shared_ptr destTexture, const TextureRangeDesc& range) const override; void updateDrawable(std::shared_ptr texture) override; void updateDrawable(SurfaceTextures surfaceTextures) override; void updateResolveAttachment(std::shared_ptr texture) override; private: // Simplified readback resources (removed per-attachment allocator/fence; use shared // infrastructure). struct ReadbackResources { // Cached data for repeated reads from same region std::vector cachedData; uint32_t cachedWidth = 0; uint32_t cachedHeight = 0; uint32_t cachedMipLevel = 0; uint32_t cachedLayer = 0; uint64_t cachedRowPitch = 0; size_t cachedBytesPerPixel = 0; UINT64 cachedFrameFenceValue = std::numeric_limits::max(); bool cacheValid = false; }; mutable std::array readbackCache_{}; FramebufferDesc desc_; }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/HeadlessContext.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ /* * Minimal headless D3D12 context for unit tests (no swapchain / no HWND). */ #include #include #include namespace igl::d3d12 { namespace { // Import ComPtr for readability template using ComPtr = igl::d3d12::ComPtr; } // namespace HeadlessD3D12Context::~HeadlessD3D12Context() = default; Result HeadlessD3D12Context::initializeHeadless(uint32_t width, uint32_t height, const D3D12ContextConfig& config) { width_ = width; height_ = height; // Store and validate configuration. config_ = config; config_.validate(); // Headless mode: No swapchain, so use kMaxFramesInFlight as buffer count (T43) swapchainBufferCount_ = kMaxFramesInFlight; renderTargets_.resize(swapchainBufferCount_); frameContexts_.resize(swapchainBufferCount_); IGL_D3D12_LOG_VERBOSE("HeadlessD3D12Context: Initialized with %u frame buffers (no swapchain)\n", swapchainBufferCount_); // Initialize DXGI factory flags and debug configuration (mirrors windowed D3D12Context). auto getEnvBool = [](const char* name, bool defaultValue) -> bool { const char* value = std::getenv(name); if (!value) { return defaultValue; } return (std::string(value) == "1") || (std::string(value) == "true"); }; bool enableDebugLayer = getEnvBool("IGL_D3D12_DEBUG", #ifdef _DEBUG true // Default ON in debug builds #else false // Default OFF in release builds #endif ); bool enableGPUValidation = getEnvBool("IGL_D3D12_GPU_VALIDATION", false); bool enableDRED = getEnvBool("IGL_D3D12_DRED", #ifdef _DEBUG true // Default ON in debug builds #else false // Default OFF in release builds #endif ); bool enableDXGIDebug = getEnvBool("IGL_DXGI_DEBUG", #ifdef _DEBUG true // Default ON in debug builds #else false // Default OFF in release builds #endif ); IGL_D3D12_LOG_VERBOSE("=== Headless D3D12 Debug Configuration ===\n"); IGL_D3D12_LOG_VERBOSE(" Debug Layer: %s\n", enableDebugLayer ? "ENABLED" : "DISABLED"); IGL_D3D12_LOG_VERBOSE(" GPU Validation: %s\n", enableGPUValidation ? "ENABLED" : "DISABLED"); IGL_D3D12_LOG_VERBOSE(" DRED: %s\n", enableDRED ? "ENABLED" : "DISABLED"); IGL_D3D12_LOG_VERBOSE(" DXGI Debug: %s\n", enableDXGIDebug ? "ENABLED" : "DISABLED"); IGL_D3D12_LOG_VERBOSE("=========================================\n"); UINT dxgiFactoryFlags = 0; // Enable debug layer (and GPU-based validation) if configured. if (enableDebugLayer) { igl::d3d12::ComPtr debugController; if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(debugController.GetAddressOf())))) { debugController->EnableDebugLayer(); IGL_D3D12_LOG_VERBOSE("HeadlessD3D12Context: Debug layer ENABLED\n"); if (enableDXGIDebug) { dxgiFactoryFlags |= DXGI_CREATE_FACTORY_DEBUG; IGL_D3D12_LOG_VERBOSE("HeadlessD3D12Context: DXGI debug layer ENABLED\n"); } if (enableGPUValidation) { igl::d3d12::ComPtr debugController1; if (SUCCEEDED( debugController->QueryInterface(IID_PPV_ARGS(debugController1.GetAddressOf())))) { debugController1->SetEnableGPUBasedValidation(TRUE); IGL_D3D12_LOG_VERBOSE("HeadlessD3D12Context: GPU-Based Validation ENABLED\n"); } else { IGL_LOG_ERROR( "HeadlessD3D12Context: Failed to enable GPU-Based Validation (requires " "ID3D12Debug1)\n"); } } } else { IGL_LOG_ERROR( "HeadlessD3D12Context: Failed to get D3D12 debug interface - Graphics Tools may not be " "installed\n"); } } else { IGL_D3D12_LOG_VERBOSE("HeadlessD3D12Context: Debug layer DISABLED\n"); } // Enable DRED if configured (Device Removed Extended Data for better crash diagnostics). if (enableDRED) { igl::d3d12::ComPtr dredSettings1; if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(dredSettings1.GetAddressOf())))) { dredSettings1->SetAutoBreadcrumbsEnablement(D3D12_DRED_ENABLEMENT_FORCED_ON); dredSettings1->SetPageFaultEnablement(D3D12_DRED_ENABLEMENT_FORCED_ON); dredSettings1->SetBreadcrumbContextEnablement(D3D12_DRED_ENABLEMENT_FORCED_ON); IGL_D3D12_LOG_VERBOSE("HeadlessD3D12Context: DRED 1.2 fully configured\n"); } else { IGL_LOG_ERROR( "HeadlessD3D12Context: Failed to configure DRED (requires Windows 10 19041+)\n"); } } // Enable experimental features for headless contexts (unit tests) // This allows unsigned DXIL shaders to run // NOTE: This is ONLY called in headless mode (unit tests), NOT in windowed render sessions { UUID experimentalFeatures[] = {D3D12ExperimentalShaderModels}; HRESULT hr = D3D12EnableExperimentalFeatures(1, experimentalFeatures, nullptr, nullptr); if (SUCCEEDED(hr)) { IGL_D3D12_LOG_VERBOSE( "HeadlessD3D12Context: Experimental shader models enabled (allows unsigned DXIL)\n"); } else { IGL_D3D12_LOG_VERBOSE( "HeadlessD3D12Context: Failed to enable experimental features (0x%08X) - signed DXIL " "required\n", static_cast(hr)); } } // Create DXGI factory with debug flag in debug builds. HRESULT hr = CreateDXGIFactory2(dxgiFactoryFlags, IID_PPV_ARGS(dxgiFactory_.GetAddressOf())); if (FAILED(hr)) { return Result(Result::Code::RuntimeError, "Failed to create DXGI factory"); } // Helper function to try creating device with progressive feature level fallback (A-004) auto tryCreateDeviceWithFallback = [](IDXGIAdapter1* adapter, D3D_FEATURE_LEVEL& outFeatureLevel) -> igl::d3d12::ComPtr { const D3D_FEATURE_LEVEL featureLevels[] = { D3D_FEATURE_LEVEL_12_2, D3D_FEATURE_LEVEL_12_1, D3D_FEATURE_LEVEL_12_0, D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0, }; igl::d3d12::ComPtr device; for (D3D_FEATURE_LEVEL fl : featureLevels) { HRESULT hr = D3D12CreateDevice(adapter, fl, IID_PPV_ARGS(device.GetAddressOf())); if (SUCCEEDED(hr)) { outFeatureLevel = fl; IGL_D3D12_LOG_VERBOSE("HeadlessD3D12Context: Device created with Feature Level %d.%d\n", (fl >> 12) & 0xF, (fl >> 8) & 0xF); return device; } } outFeatureLevel = static_cast(0); return nullptr; }; auto featureLevelToString = [](D3D_FEATURE_LEVEL level) -> const char* { switch (level) { case D3D_FEATURE_LEVEL_12_2: return "12.2"; case D3D_FEATURE_LEVEL_12_1: return "12.1"; case D3D_FEATURE_LEVEL_12_0: return "12.0"; case D3D_FEATURE_LEVEL_11_1: return "11.1"; case D3D_FEATURE_LEVEL_11_0: return "11.0"; default: return "Unknown"; } }; igl::d3d12::ComPtr factory6; (void)dxgiFactory_->QueryInterface(IID_PPV_ARGS(factory6.GetAddressOf())); bool created = false; D3D_FEATURE_LEVEL selectedFeatureLevel = D3D_FEATURE_LEVEL_11_0; if (factory6.Get()) { for (UINT i = 0;; ++i) { igl::d3d12::ComPtr adapter; if (FAILED(factory6->EnumAdapterByGpuPreference( i, DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE, IID_PPV_ARGS(adapter.GetAddressOf())))) { break; } DXGI_ADAPTER_DESC1 desc{}; adapter->GetDesc1(&desc); if (desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) { continue; } D3D_FEATURE_LEVEL featureLevel = static_cast(0); auto device = tryCreateDeviceWithFallback(adapter.Get(), featureLevel); if (device.Get() != nullptr) { device_ = device; created = true; selectedFeatureLevel = featureLevel; IGL_D3D12_LOG_VERBOSE("HeadlessD3D12Context: Selected HW adapter (FL %s)\n", featureLevelToString(featureLevel)); break; } } } if (!created) { for (UINT i = 0;; ++i) { igl::d3d12::ComPtr adapter; if (dxgiFactory_->EnumAdapters1(i, adapter.GetAddressOf()) == DXGI_ERROR_NOT_FOUND) { break; } DXGI_ADAPTER_DESC1 desc{}; adapter->GetDesc1(&desc); if (desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) { continue; } D3D_FEATURE_LEVEL featureLevel = static_cast(0); auto device = tryCreateDeviceWithFallback(adapter.Get(), featureLevel); if (device.Get() != nullptr) { device_ = device; created = true; selectedFeatureLevel = featureLevel; IGL_D3D12_LOG_VERBOSE( "HeadlessD3D12Context: Selected HW adapter via EnumAdapters1 (FL %s)\n", featureLevelToString(featureLevel)); break; } } } if (!created) { igl::d3d12::ComPtr warp; if (SUCCEEDED(dxgiFactory_->EnumWarpAdapter(IID_PPV_ARGS(warp.GetAddressOf())))) { igl::d3d12::ComPtr warp1; warp->QueryInterface(IID_PPV_ARGS(warp1.GetAddressOf())); if (warp1.Get()) { D3D_FEATURE_LEVEL featureLevel = static_cast(0); auto device = tryCreateDeviceWithFallback(warp1.Get(), featureLevel); if (device.Get() != nullptr) { device_ = device; created = true; selectedFeatureLevel = featureLevel; IGL_D3D12_LOG_VERBOSE("HeadlessD3D12Context: Using WARP adapter (FL %s)\n", featureLevelToString(featureLevel)); } } } } if (!created) { return Result(Result::Code::RuntimeError, "Failed to create any D3D12 device"); } // Store selected feature level (A-004) selectedFeatureLevel_ = selectedFeatureLevel; #ifdef _DEBUG { igl::d3d12::ComPtr infoQueue; if (SUCCEEDED(device_->QueryInterface(IID_PPV_ARGS(infoQueue.GetAddressOf())))) { infoQueue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_CORRUPTION, FALSE); infoQueue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_ERROR, FALSE); infoQueue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_WARNING, FALSE); } } #endif // Create command queue D3D12_COMMAND_QUEUE_DESC queueDesc = {}; queueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT; queueDesc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE; hr = device_->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(commandQueue_.GetAddressOf())); if (FAILED(hr)) { return Result(Result::Code::RuntimeError, "Failed to create command queue"); } // Create per-frame descriptor heaps (consistent with windowed D3D12Context) // Allow override via env vars for headless tests UINT cbvSrvUavHeapSize = 1024; // default matching Microsoft MiniEngine { char buf[32] = {}; const DWORD n = GetEnvironmentVariableA("IGL_D3D12_CBV_SRV_UAV_HEAP_SIZE", buf, sizeof(buf)); if (n > 0) { cbvSrvUavHeapSize = std::max(256, static_cast(strtoul(buf, nullptr, 10))); } } UINT samplerHeapSize = kMaxSamplers; // Match D3D12_MAX_SHADER_VISIBLE_SAMPLER_HEAP_SIZE (2048) { char buf[32] = {}; const DWORD n = GetEnvironmentVariableA("IGL_D3D12_SAMPLER_HEAP_SIZE", buf, sizeof(buf)); if (n > 0) { samplerHeapSize = std::max(16, static_cast(strtoul(buf, nullptr, 10))); } } // Cache descriptor sizes cbvSrvUavDescriptorSize_ = device_->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); samplerDescriptorSize_ = device_->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER); IGL_D3D12_LOG_VERBOSE( "HeadlessContext: Creating per-frame descriptor heaps (CBV/SRV/UAV=%u, Samplers=%u)...\n", cbvSrvUavHeapSize, samplerHeapSize); // Create per-frame shader-visible descriptor heaps and an initial page for each frame. for (UINT i = 0; i < swapchainBufferCount_; i++) { // CBV/SRV/UAV heap per frame - create initial page igl::d3d12::ComPtr initialHeap; D3D12_DESCRIPTOR_HEAP_DESC desc = {}; desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV; desc.NumDescriptors = cbvSrvUavHeapSize; desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE; desc.NodeMask = 0; hr = device_->CreateDescriptorHeap(&desc, IID_PPV_ARGS(initialHeap.GetAddressOf())); if (FAILED(hr)) { return Result(Result::Code::RuntimeError, "Failed to create per-frame CBV/SRV/UAV heap for frame " + std::to_string(i)); } // Initialize page vector with first page frameContexts_[i].cbvSrvUavHeapPages.clear(); frameContexts_[i].cbvSrvUavHeapPages.emplace_back(initialHeap, cbvSrvUavHeapSize); frameContexts_[i].currentCbvSrvUavPageIndex = 0; IGL_D3D12_LOG_VERBOSE( " Frame %u: Created CBV/SRV/UAV heap page (%u descriptors)\n", i, cbvSrvUavHeapSize); // Sampler heap per frame desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER; desc.NumDescriptors = samplerHeapSize; desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE; desc.NodeMask = 0; hr = device_->CreateDescriptorHeap(&desc, IID_PPV_ARGS(frameContexts_[i].samplerHeap.GetAddressOf())); if (FAILED(hr)) { return Result(Result::Code::RuntimeError, "Failed to create per-frame Sampler heap for frame " + std::to_string(i)); } IGL_D3D12_LOG_VERBOSE( " Frame %u: Created Sampler heap (%u descriptors)\n", i, samplerHeapSize); } IGL_D3D12_LOG_VERBOSE("HeadlessContext: Per-frame descriptor heaps created successfully\n"); // Create per-frame command allocators (following Microsoft's D3D12HelloFrameBuffering pattern) IGL_D3D12_LOG_VERBOSE("HeadlessContext: Creating per-frame command allocators...\n"); for (UINT i = 0; i < swapchainBufferCount_; i++) { hr = device_->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(frameContexts_[i].allocator.GetAddressOf())); if (FAILED(hr)) { return Result(Result::Code::RuntimeError, "Failed to create command allocator for frame " + std::to_string(i)); } IGL_D3D12_LOG_VERBOSE(" Frame %u: Created command allocator\n", i); } IGL_D3D12_LOG_VERBOSE("HeadlessContext: Per-frame command allocators created successfully\n"); // Fence for GPU synchronization hr = device_->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(fence_.GetAddressOf())); if (FAILED(hr)) { return Result(Result::Code::RuntimeError, "Failed to create fence"); } // Create descriptor heap manager with the same sizes for consistency. { DescriptorHeapManager::Sizes sz{}; sz.cbvSrvUav = cbvSrvUavHeapSize; sz.samplers = samplerHeapSize; sz.rtvs = 64; sz.dsvs = 32; descriptorHeaps_ = std::make_unique(); const Result r = descriptorHeaps_->initialize(device_.Get(), sz); if (!r.isOk()) { IGL_LOG_ERROR("HeadlessD3D12Context: Failed to initialize descriptor heap manager: %s\n", r.message.c_str()); // Non-fatal: continue without a dedicated manager. descriptorHeaps_.reset(); } // Expose manager to base context for consumers that only see D3D12Context heapMgr_ = descriptorHeaps_.get(); } // Create command signatures for indirect drawing. IGL_D3D12_LOG_VERBOSE("HeadlessD3D12Context: Creating command signatures...\n"); Result commandSigResult = createCommandSignatures(); if (!commandSigResult.isOk()) { IGL_LOG_ERROR("HeadlessD3D12Context: Failed to create command signatures: %s\n", commandSigResult.message.c_str()); return commandSigResult; } IGL_D3D12_LOG_VERBOSE("HeadlessD3D12Context: Command signatures created successfully\n"); IGL_D3D12_LOG_VERBOSE("HeadlessD3D12Context: Initialization complete\n"); return Result(); } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/HeadlessContext.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ /* * Minimal headless D3D12 context for unit tests (no swapchain / no HWND). */ #pragma once #include #include #include namespace igl::d3d12 { class HeadlessD3D12Context final : public D3D12Context { public: HeadlessD3D12Context() = default; ~HeadlessD3D12Context(); // Initialize a headless context with default dimensions used only for fallback viewports // Accepts optional D3D12ContextConfig for configurable sizes. // NOTE: Headless mode currently uses environment variable overrides and internal defaults // for descriptor heap sizes. Config parameter is stored for base-class consistency and // future extension but is not fully wired to all heap creation paths yet. Result initializeHeadless(uint32_t width = 256, uint32_t height = 256, const D3D12ContextConfig& config = D3D12ContextConfig::defaultConfig()); // Access to descriptor heap manager for tests (may be null on failure) [[nodiscard]] DescriptorHeapManager* getDescriptorHeapManager() const { return descriptorHeaps_.get(); } private: std::unique_ptr descriptorHeaps_; }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/PlatformDevice.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include namespace igl::d3d12 { PlatformDevice::PlatformDevice(Device& device) : device_(device) {} std::shared_ptr PlatformDevice::createTextureFromNativeDepth(uint32_t width, uint32_t height, Result* outResult) { auto& ctx = device_.getD3D12Context(); // Create depth texture with D3D12 TextureDesc depthDesc = TextureDesc::new2D(TextureFormat::Z_UNorm32, width, height, TextureDesc::TextureUsageBits::Attachment, "Swapchain Depth Texture"); // Allocate new depth texture if null or mismatches in size if (!nativeDepthTexture_ || width != nativeDepthTexture_->getDimensions().width || height != nativeDepthTexture_->getDimensions().height) { nativeDepthTexture_ = device_.createTexture(depthDesc, outResult); } Result::setResult(outResult, Result::Code::Ok); return nativeDepthTexture_; } std::shared_ptr PlatformDevice::createTextureFromNativeDrawable(Result* outResult) { IGL_D3D12_LOG_VERBOSE("PlatformDevice::createTextureFromNativeDrawable() called\n"); auto& ctx = device_.getD3D12Context(); // Get current back buffer from swapchain uint32_t backBufferIndex = ctx.getCurrentBackBufferIndex(); ID3D12Resource* backBuffer = ctx.getCurrentBackBuffer(); IGL_D3D12_LOG_VERBOSE(" backBufferIndex=%u, backBuffer=%p\n", backBufferIndex, backBuffer); if (!backBuffer) { IGL_LOG_ERROR(" No back buffer available!\n"); Result::setResult(outResult, Result::Code::RuntimeError, "No back buffer available"); return nullptr; } // Get back buffer description D3D12_RESOURCE_DESC desc = backBuffer->GetDesc(); const auto width = static_cast(desc.Width); const auto height = static_cast(desc.Height); // Determine texture format based on DXGI format // IMPORTANT: Use dxgiFormatToTextureFormat() to get the CORRECT IGL format // from the actual D3D12 resource format. Do NOT hardcode RGBA_SRGB! igl::TextureFormat iglFormat = dxgiFormatToTextureFormat(desc.Format); if (iglFormat == igl::TextureFormat::Invalid) { IGL_LOG_ERROR(" Unsupported DXGI format: %d\n", desc.Format); Result::setResult(outResult, Result::Code::RuntimeError, "Unsupported swapchain DXGI format"); return nullptr; } // Ensure we have enough cached textures for swapchain images while (nativeDrawableTextures_.size() <= backBufferIndex) { nativeDrawableTextures_.push_back(nullptr); } // Allocate new drawable texture if null or mismatches if (!nativeDrawableTextures_[backBufferIndex] || width != nativeDrawableTextures_[backBufferIndex]->getDimensions().width || height != nativeDrawableTextures_[backBufferIndex]->getDimensions().height) { TextureDesc textureDesc; textureDesc.type = TextureType::TwoD; textureDesc.format = iglFormat; textureDesc.width = width; textureDesc.height = height; textureDesc.depth = 1; textureDesc.numLayers = 1; textureDesc.numSamples = 1; textureDesc.numMipLevels = 1; textureDesc.usage = TextureDesc::TextureUsageBits::Attachment; textureDesc.debugName = "Swapchain Back Buffer"; nativeDrawableTextures_[backBufferIndex] = Texture::createFromResource(backBuffer, iglFormat, textureDesc, ctx.getDevice(), ctx.getCommandQueue(), D3D12_RESOURCE_STATE_PRESENT); if (!nativeDrawableTextures_[backBufferIndex]) { Result::setResult( outResult, Result::Code::RuntimeError, "Failed to create texture from back buffer"); return nullptr; } } Result::setResult(outResult, Result::Code::Ok); return nativeDrawableTextures_[backBufferIndex]; } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/PlatformDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::d3d12 { class Device; /// @brief Implements the igl::IPlatformDevice interface for D3D12 class PlatformDevice : public IPlatformDevice { public: static constexpr igl::PlatformDeviceType kType = igl::PlatformDeviceType::D3D12; explicit PlatformDevice(Device& device); ~PlatformDevice() override = default; /// Creates a Depth Texture from the D3D12 swapchain /// @param width Width of the depth texture /// @param height Height of the depth texture /// @param outResult optional result /// @return pointer to generated Texture or nullptr std::shared_ptr createTextureFromNativeDepth(uint32_t width, uint32_t height, Result* outResult); /// Creates a texture from the D3D12 swapchain back buffer /// @param outResult optional result /// @return pointer to generated Texture or nullptr std::shared_ptr createTextureFromNativeDrawable(Result* outResult); /// Clear the cached textures void clear() { nativeDrawableTextures_.clear(); nativeDepthTexture_ = nullptr; } protected: [[nodiscard]] bool isType(PlatformDeviceType t) const noexcept override { return t == kType; } private: Device& device_; std::vector> nativeDrawableTextures_; std::shared_ptr nativeDepthTexture_; }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/RenderCommandEncoder.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #include #include #include #include namespace igl::d3d12 { RenderCommandEncoder::RenderCommandEncoder(CommandBuffer& commandBuffer, const std::shared_ptr& framebuffer) : IRenderCommandEncoder(nullptr), commandBuffer_(commandBuffer), commandList_(commandBuffer.getCommandList()), resourcesBinder_(commandBuffer, false /* isCompute */), framebuffer_(framebuffer) { IGL_D3D12_LOG_VERBOSE( "RenderCommandEncoder::RenderCommandEncoder() - Lightweight initialization\n"); } void RenderCommandEncoder::begin(const RenderPassDesc& renderPass) { if (!commandBuffer_.isRecording() || !commandList_) { IGL_LOG_ERROR("RenderCommandEncoder::begin() - command list is closed or null\n"); return; } // Enforce single-call semantics: begin() allocates descriptors and cannot be safely called twice. IGL_DEBUG_ASSERT(!hasBegun_, "begin() called multiple times - this will cause resource leaks"); hasBegun_ = true; IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder::begin() - START\n"); auto& context = commandBuffer_.getContext(); IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: Got context\n"); // Set descriptor heaps for this command list. // Must use per-frame heaps from D3D12Context, not DescriptorHeapManager. // Per-frame heaps are isolated per frame to prevent descriptor conflicts. DescriptorHeapManager* heapMgr = context.getDescriptorHeapManager(); // Use active heap from frame context, not the legacy accessor. // This ensures we bind the currently active page, not hardcoded page 0. auto& frameCtx = context.getFrameContexts()[context.getCurrentFrameIndex()]; cbvSrvUavHeap_ = frameCtx.activeCbvSrvUavHeap.Get(); samplerHeap_ = frameCtx.samplerHeap.Get(); IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: Using active per-frame heap from FrameContext\n"); IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: CBV/SRV/UAV heap (active) = %p\n", cbvSrvUavHeap_); IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: Sampler heap = %p\n", samplerHeap_); // Bind active heap (may be page 0 or a later page). ID3D12DescriptorHeap* heaps[] = {cbvSrvUavHeap_, samplerHeap_}; IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: Setting descriptor heaps...\n"); commandList_->SetDescriptorHeaps(2, heaps); IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: Descriptor heaps set\n"); // Create RTV from framebuffer if provided; otherwise fallback to swapchain RTV IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: Setting up RTV...\n"); D3D12_CPU_DESCRIPTOR_HANDLE rtv = {}; std::vector rtvs; rtvIndices_.clear(); bool usedOffscreenRTV = false; // Note: heapMgr already retrieved above for setting descriptor heaps IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: DescriptorHeapManager = %p\n", heapMgr); IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: Checking framebuffer_=%p\n", framebuffer_.get()); // Only create offscreen RTV if we have DescriptorHeapManager AND it's not a swapchain texture // Swapchain textures should use context.getCurrentRTV() directly if (framebuffer_ && framebuffer_->getColorAttachment(0) && heapMgr) { IGL_D3D12_LOG_VERBOSE( "RenderCommandEncoder: Has framebuffer with color attachment AND DescriptorHeapManager\n"); ID3D12Device* device = context.getDevice(); if (device) { // Create RTVs for each color attachment const size_t count = std::min(framebuffer_->getColorAttachmentIndices().size(), D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT); IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: MRT count = %zu (indices.size=%zu)\n", count, framebuffer_->getColorAttachmentIndices().size()); for (size_t i = 0; i < count; ++i) { auto tex = std::static_pointer_cast(framebuffer_->getColorAttachment(i)); IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: MRT loop i=%zu, tex=%p, resource=%p\n", i, tex.get(), tex ? tex->getResource() : nullptr); if (!tex || !tex->getResource()) { IGL_D3D12_LOG_VERBOSE( "RenderCommandEncoder: MRT loop i=%zu SKIPPED (null tex or resource)\n", i); continue; } const bool hasAttachmentDesc = (i < renderPass.colorAttachments.size()); // CRITICAL: Extract values before using in expressions to avoid MSVC debug iterator checks const uint32_t mipLevel = hasAttachmentDesc ? renderPass.colorAttachments[i].mipLevel : 0; const uint32_t attachmentLayer = hasAttachmentDesc ? renderPass.colorAttachments[i].layer : 0; const uint32_t attachmentFace = hasAttachmentDesc ? renderPass.colorAttachments[i].face : 0; // Allocate RTV uint32_t rtvIdx = heapMgr->allocateRTV(); if (rtvIdx == UINT32_MAX) { IGL_LOG_ERROR( "RenderCommandEncoder: Failed to allocate RTV descriptor (heap exhausted)\n"); continue; } // Check return value from getHandle. D3D12_CPU_DESCRIPTOR_HANDLE rtvHandle; if (!heapMgr->getRTVHandle(rtvIdx, &rtvHandle)) { IGL_LOG_ERROR("RenderCommandEncoder: Failed to get RTV handle for index %u\n", rtvIdx); heapMgr->freeRTV(rtvIdx); continue; } rtvIndices_.push_back(rtvIdx); // Create RTV view - use the resource's actual format to avoid SRGB/UNORM mismatches D3D12_RESOURCE_DESC resourceDesc = tex->getResource()->GetDesc(); D3D12_RENDER_TARGET_VIEW_DESC rdesc = {}; rdesc.Format = resourceDesc.Format; // Use actual D3D12 resource format, not IGL format // Determine if this is a texture array or texture view. // Cube textures are stored as 2D array resources (6 slices per cube). const bool isView = tex->isView(); const bool isCubeTexture = (tex->getType() == TextureType::Cube); const uint32_t arraySliceOffset = isView ? tex->getArraySliceOffset() : 0; const uint32_t totalArraySlices = isView ? tex->getNumArraySlicesInView() : resourceDesc.DepthOrArraySize; const bool isArrayTexture = !isCubeTexture && ((isView && tex->getNumArraySlicesInView() > 0) || (!isView && resourceDesc.DepthOrArraySize > 1)); uint32_t targetArraySlice = attachmentLayer; if (isCubeTexture) { // Cube textures map faces onto 2D array slices. See Texture Subresources (D3D12). const uint32_t clampedFace = std::min(attachmentFace, 5u); const uint32_t cubesInView = (totalArraySlices + 5u) / 6u; const uint32_t clampedCubeIndex = std::min(attachmentLayer, (cubesInView == 0u) ? 0u : (cubesInView - 1u)); const uint32_t baseSlice = arraySliceOffset + clampedCubeIndex * 6u; const uint32_t maxSlice = (totalArraySlices > 0u) ? (arraySliceOffset + totalArraySlices - 1u) : arraySliceOffset; targetArraySlice = std::min(baseSlice + clampedFace, maxSlice); } // Set view dimension based on sample count (MSAA support) and array type if (resourceDesc.SampleDesc.Count > 1) { // MSAA texture if (isCubeTexture) { rdesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2DMSARRAY; rdesc.Texture2DMSArray.FirstArraySlice = targetArraySlice; rdesc.Texture2DMSArray.ArraySize = 1; IGL_D3D12_LOG_VERBOSE( "RenderCommandEncoder: Creating MSAA cube RTV with %u samples, face %u, cube index " "%u (array slice %u)\n", resourceDesc.SampleDesc.Count, attachmentFace, attachmentLayer, rdesc.Texture2DMSArray.FirstArraySlice); } else if (isArrayTexture) { // MSAA texture array - use TEXTURE2DMSARRAY view dimension rdesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2DMSARRAY; if (isView) { rdesc.Texture2DMSArray.FirstArraySlice = tex->getArraySliceOffset(); rdesc.Texture2DMSArray.ArraySize = tex->getNumArraySlicesInView(); } else { rdesc.Texture2DMSArray.FirstArraySlice = attachmentLayer; rdesc.Texture2DMSArray.ArraySize = 1; // Render to single layer } IGL_D3D12_LOG_VERBOSE( "RenderCommandEncoder: Creating MSAA array RTV with %u samples, layer %u\n", resourceDesc.SampleDesc.Count, rdesc.Texture2DMSArray.FirstArraySlice); } else { // MSAA non-array texture - use TEXTURE2DMS view dimension rdesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2DMS; IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: Creating MSAA RTV with %u samples\n", resourceDesc.SampleDesc.Count); } } else { // Non-MSAA texture if (isCubeTexture) { rdesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2DARRAY; rdesc.Texture2DArray.MipSlice = mipLevel; rdesc.Texture2DArray.PlaneSlice = 0; rdesc.Texture2DArray.FirstArraySlice = targetArraySlice; rdesc.Texture2DArray.ArraySize = 1; IGL_D3D12_LOG_VERBOSE( "RenderCommandEncoder: Creating cube RTV, mip %u, face %u, cube index %u (array " "slice %u)\n", mipLevel, attachmentFace, attachmentLayer, rdesc.Texture2DArray.FirstArraySlice); } else if (isArrayTexture) { // Texture array - use TEXTURE2DARRAY view dimension rdesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2DARRAY; // CRITICAL: Extract value before assignment to avoid MSVC debug iterator bounds check const uint32_t mipSliceArray = (i < renderPass.colorAttachments.size()) ? renderPass.colorAttachments[i].mipLevel : 0; rdesc.Texture2DArray.MipSlice = mipSliceArray; rdesc.Texture2DArray.PlaneSlice = 0; if (isView) { rdesc.Texture2DArray.FirstArraySlice = tex->getArraySliceOffset(); rdesc.Texture2DArray.ArraySize = tex->getNumArraySlicesInView(); } else { rdesc.Texture2DArray.FirstArraySlice = attachmentLayer; rdesc.Texture2DArray.ArraySize = 1; // Render to single layer } IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: Creating array RTV, mip %u, layer %u\n", rdesc.Texture2DArray.MipSlice, rdesc.Texture2DArray.FirstArraySlice); } else { // Non-array texture - use standard TEXTURE2D view dimension rdesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D; // CRITICAL: Extract value before assignment to avoid MSVC debug iterator bounds check const uint32_t mipSlice2D = (i < renderPass.colorAttachments.size()) ? renderPass.colorAttachments[i].mipLevel : 0; rdesc.Texture2D.MipSlice = mipSlice2D; rdesc.Texture2D.PlaneSlice = 0; IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: Creating RTV, mip %u\n", rdesc.Texture2D.MipSlice); } } // Pre-creation validation. IGL_DEBUG_ASSERT(device != nullptr, "Device is null before CreateRenderTargetView"); IGL_DEBUG_ASSERT(tex->getResource() != nullptr, "Texture resource is null before CreateRenderTargetView"); IGL_DEBUG_ASSERT(rtvHandle.ptr != 0, "RTV descriptor handle is invalid"); device->CreateRenderTargetView(tex->getResource(), &rdesc, rtvHandle); // Transition to RENDER_TARGET // IMPORTANT: For multi-frame rendering, offscreen targets may have been transitioned to // PIXEL_SHADER_RESOURCE in the previous frame's endEncoding(). We MUST transition them // back to RENDER_TARGET at the start of each render pass. // The transitionTo() function checks current state and only transitions if needed. const uint32_t transitionSlice = isCubeTexture ? targetArraySlice : attachmentLayer; tex->transitionTo( commandList_, D3D12_RESOURCE_STATE_RENDER_TARGET, mipLevel, transitionSlice); // Clear if requested if (hasAttachmentDesc && renderPass.colorAttachments[i].loadAction == LoadAction::Clear) { const auto& clearColor = renderPass.colorAttachments[i].clearColor; const float color[] = {clearColor.r, clearColor.g, clearColor.b, clearColor.a}; IGL_D3D12_LOG_VERBOSE( "RenderCommandEncoder: Clearing MRT attachment %zu with color (%.2f, %.2f, %.2f, " "%.2f)\n", i, color[0], color[1], color[2], color[3]); commandList_->ClearRenderTargetView(rtvHandle, color, 0, nullptr); } else { // CRITICAL: Must extract value completely outside ternary to avoid MSVC debug iterator // check int loadActionDbg = -1; if (i < renderPass.colorAttachments.size()) { loadActionDbg = (int)renderPass.colorAttachments[i].loadAction; } IGL_D3D12_LOG_VERBOSE( "RenderCommandEncoder: NOT clearing MRT attachment %zu (loadAction=%d, " "hasAttachment=%d)\n", i, loadActionDbg, i < renderPass.colorAttachments.size()); } rtvs.push_back(rtvHandle); IGL_D3D12_LOG_VERBOSE( "RenderCommandEncoder: MRT Created RTV #%zu, total RTVs now=%zu\n", i, rtvs.size()); } IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: MRT Total RTVs created: %zu\n", rtvs.size()); if (!rtvs.empty()) { rtv = rtvs[0]; usedOffscreenRTV = true; } } } if (!usedOffscreenRTV) { IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: Using swapchain back buffer\n"); auto* backBuffer = context.getCurrentBackBuffer(); IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: Got back buffer=%p\n", backBuffer); if (!backBuffer) { IGL_LOG_ERROR("RenderCommandEncoder: No back buffer available\n"); return; } IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: Transitioning back buffer to RENDER_TARGET\n"); D3D12_RESOURCE_BARRIER barrier = {}; barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE; barrier.Transition.pResource = backBuffer; barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_PRESENT; barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_RENDER_TARGET; barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; commandList_->ResourceBarrier(1, &barrier); IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: Resource barrier executed\n"); if (!renderPass.colorAttachments.empty() && renderPass.colorAttachments[0].loadAction == LoadAction::Clear) { IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: Clearing render target\n"); const auto& cc = renderPass.colorAttachments[0].clearColor; const float col[] = {cc.r, cc.g, cc.b, cc.a}; D3D12_CPU_DESCRIPTOR_HANDLE swapRtv = context.getCurrentRTV(); commandList_->ClearRenderTargetView(swapRtv, col, 0, nullptr); IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: Clear complete\n"); } rtv = context.getCurrentRTV(); IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: Got RTV handle\n"); } // Create/Bind depth-stencil view if we have a framebuffer with a depth attachment const bool hasDepth = (framebuffer_ && framebuffer_->getDepthAttachment()); if (hasDepth) { auto depthTex = std::static_pointer_cast(framebuffer_->getDepthAttachment()); ID3D12Device* device = context.getDevice(); if (device && depthTex && depthTex->getResource()) { if (heapMgr) { dsvIndex_ = heapMgr->allocateDSV(); // Check return value from getHandle. if (!heapMgr->getDSVHandle(dsvIndex_, &dsvHandle_)) { IGL_LOG_ERROR("RenderCommandEncoder: Failed to get DSV handle for index %u\n", dsvIndex_); heapMgr->freeDSV(dsvIndex_); dsvIndex_ = UINT32_MAX; return; } } else { // Fallback: transient heap igl::d3d12::ComPtr tmpHeap; D3D12_DESCRIPTOR_HEAP_DESC dsvHeapDesc = {}; dsvHeapDesc.NumDescriptors = 1; dsvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_DSV; dsvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE; device->CreateDescriptorHeap(&dsvHeapDesc, IID_PPV_ARGS(tmpHeap.GetAddressOf())); dsvHandle_ = tmpHeap->GetCPUDescriptorHandleForHeapStart(); } // Create DSV description D3D12_DEPTH_STENCIL_VIEW_DESC dsvDesc = {}; dsvDesc.Format = textureFormatToDXGIFormat(depthTex->getFormat()); dsvDesc.Flags = D3D12_DSV_FLAG_NONE; // Set view dimension based on sample count (MSAA support) D3D12_RESOURCE_DESC depthResourceDesc = depthTex->getResource()->GetDesc(); if (depthResourceDesc.SampleDesc.Count > 1) { // MSAA depth texture - use TEXTURE2DMS view dimension dsvDesc.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE2DMS; IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: Creating MSAA DSV with %u samples\n", depthResourceDesc.SampleDesc.Count); } else { // Non-MSAA depth texture - use standard TEXTURE2D view dimension dsvDesc.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE2D; dsvDesc.Texture2D.MipSlice = renderPass.depthAttachment.mipLevel; } // Transition the entire depth resource to DEPTH_WRITE before clearing. // Some render paths (e.g. mipmapped depth) may have touched multiple // subresources; using transitionAll ensures the clear sees a valid state // for every subresource referenced by this DSV. depthTex->transitionAll(commandList_, D3D12_RESOURCE_STATE_DEPTH_WRITE); // Pre-creation validation. IGL_DEBUG_ASSERT(device != nullptr, "Device is null before CreateDepthStencilView"); IGL_DEBUG_ASSERT(depthTex->getResource() != nullptr, "Depth texture resource is null"); IGL_DEBUG_ASSERT(dsvHandle_.ptr != 0, "DSV descriptor handle is invalid"); device->CreateDepthStencilView(depthTex->getResource(), &dsvDesc, dsvHandle_); // Clear depth and/or stencil if requested const bool clearDepth = (renderPass.depthAttachment.loadAction == LoadAction::Clear); const bool clearStencil = (renderPass.stencilAttachment.loadAction == LoadAction::Clear); if (clearDepth || clearStencil) { D3D12_CLEAR_FLAGS clearFlags = static_cast(0); if (clearDepth) { clearFlags = static_cast(clearFlags | D3D12_CLEAR_FLAG_DEPTH); } if (clearStencil) { clearFlags = static_cast(clearFlags | D3D12_CLEAR_FLAG_STENCIL); } const float depthClearValue = renderPass.depthAttachment.clearDepth; const UINT8 stencilClearValue = static_cast(renderPass.stencilAttachment.clearStencil); commandList_->ClearDepthStencilView( dsvHandle_, clearFlags, depthClearValue, stencilClearValue, 0, nullptr); IGL_D3D12_LOG_VERBOSE( "RenderCommandEncoder: Cleared depth-stencil (depth=%d, stencil=%d, depthVal=%.2f, " "stencilVal=%u)\n", clearDepth, clearStencil, depthClearValue, stencilClearValue); } // Bind RTV + DSV (or DSV-only for depth-only rendering) if (!rtvs.empty()) { // Multi-render target or offscreen rendering with color+depth IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: OMSetRenderTargets with %zu RTVs + DSV\n", rtvs.size()); commandList_->OMSetRenderTargets( static_cast(rtvs.size()), rtvs.data(), FALSE, &dsvHandle_); } else if (usedOffscreenRTV) { // Single offscreen render target with depth IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: OMSetRenderTargets with 1 RTV + DSV\n"); commandList_->OMSetRenderTargets(1, &rtv, FALSE, &dsvHandle_); } else if (!framebuffer_->getColorAttachment(0)) { // Depth-only rendering (no color attachments) - shadow mapping scenario IGL_D3D12_LOG_VERBOSE( "RenderCommandEncoder: Depth-only rendering - OMSetRenderTargets with 0 RTVs + DSV\n"); commandList_->OMSetRenderTargets(0, nullptr, FALSE, &dsvHandle_); } else { // Swapchain backbuffer with depth IGL_D3D12_LOG_VERBOSE( "RenderCommandEncoder: OMSetRenderTargets with swapchain RTV + DSV\n"); commandList_->OMSetRenderTargets(1, &rtv, FALSE, &dsvHandle_); } } else { IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: Binding RTV without DSV (no resource)\n"); if (!rtvs.empty()) { IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: OMSetRenderTargets with %zu RTVs, no DSV\n", rtvs.size()); commandList_->OMSetRenderTargets( static_cast(rtvs.size()), rtvs.data(), FALSE, nullptr); } else { IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: OMSetRenderTargets with 1 RTV, no DSV\n"); commandList_->OMSetRenderTargets(1, &rtv, FALSE, nullptr); } } } else { IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: Binding RTV without DSV (no hasDepth)\n"); if (!rtvs.empty()) { IGL_D3D12_LOG_VERBOSE( "RenderCommandEncoder: OMSetRenderTargets with %zu RTVs, no DSV (no hasDepth)\n", rtvs.size()); commandList_->OMSetRenderTargets(static_cast(rtvs.size()), rtvs.data(), FALSE, nullptr); } else { IGL_D3D12_LOG_VERBOSE( "RenderCommandEncoder: OMSetRenderTargets with 1 RTV, no DSV (no hasDepth)\n"); commandList_->OMSetRenderTargets(1, &rtv, FALSE, nullptr); } } // Set a default full-screen viewport/scissor if caller forgets. Prefer framebuffer attachments. IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: Setting default viewport...\n"); if (framebuffer_) { // Prefer color attachment if present; otherwise fall back to depth attachment. auto colorTex = std::static_pointer_cast(framebuffer_->getColorAttachment(0)); auto depthTex = std::static_pointer_cast(framebuffer_->getDepthAttachment()); Dimensions dims{}; if (colorTex && colorTex->getResource()) { dims = colorTex->getDimensions(); IGL_D3D12_LOG_VERBOSE( "RenderCommandEncoder: Using framebuffer color attachment dimensions: %ux%u\n", dims.width, dims.height); } else if (depthTex && depthTex->getResource()) { dims = depthTex->getDimensions(); IGL_D3D12_LOG_VERBOSE( "RenderCommandEncoder: Using framebuffer depth attachment dimensions: %ux%u\n", dims.width, dims.height); } if (dims.width > 0 && dims.height > 0) { D3D12_VIEWPORT vp{}; vp.TopLeftX = 0; vp.TopLeftY = 0; vp.Width = static_cast(dims.width); vp.Height = static_cast(dims.height); vp.MinDepth = 0.0f; vp.MaxDepth = 1.0f; commandList_->RSSetViewports(1, &vp); D3D12_RECT sc{}; sc.left = 0; sc.top = 0; sc.right = static_cast(dims.width); sc.bottom = static_cast(dims.height); commandList_->RSSetScissorRects(1, &sc); IGL_D3D12_LOG_VERBOSE( "RenderCommandEncoder: Set default viewport/scissor to %ux%u\n", dims.width, dims.height); } else { IGL_LOG_ERROR( "RenderCommandEncoder: Framebuffer has no valid color or depth attachment dimensions; " "falling back to back buffer viewport.\n"); auto* backBufferRes = context.getCurrentBackBuffer(); if (backBufferRes) { D3D12_RESOURCE_DESC bbDesc = backBufferRes->GetDesc(); D3D12_VIEWPORT vp{}; vp.TopLeftX = 0; vp.TopLeftY = 0; vp.Width = static_cast(bbDesc.Width); vp.Height = static_cast(bbDesc.Height); vp.MinDepth = 0.0f; vp.MaxDepth = 1.0f; commandList_->RSSetViewports(1, &vp); D3D12_RECT scissor{}; scissor.left = 0; scissor.top = 0; scissor.right = static_cast(bbDesc.Width); scissor.bottom = static_cast(bbDesc.Height); commandList_->RSSetScissorRects(1, &scissor); IGL_D3D12_LOG_VERBOSE( "RenderCommandEncoder: Fallback viewport/scissor to back buffer %llux%u\n", bbDesc.Width, bbDesc.Height); } else { IGL_LOG_ERROR("RenderCommandEncoder: No back buffer available!\n"); } } } else { IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: Using back buffer\n"); auto* backBufferRes = context.getCurrentBackBuffer(); if (backBufferRes) { D3D12_RESOURCE_DESC bbDesc = backBufferRes->GetDesc(); IGL_D3D12_LOG_VERBOSE( "RenderCommandEncoder: Back buffer dimensions: %llux%u\n", bbDesc.Width, bbDesc.Height); D3D12_VIEWPORT vp = {}; vp.TopLeftX = 0; vp.TopLeftY = 0; vp.Width = (float)bbDesc.Width; vp.Height = (float)bbDesc.Height; vp.MinDepth = 0; vp.MaxDepth = 1; commandList_->RSSetViewports(1, &vp); D3D12_RECT scissor = {}; scissor.left = 0; scissor.top = 0; scissor.right = (LONG)bbDesc.Width; scissor.bottom = (LONG)bbDesc.Height; commandList_->RSSetScissorRects(1, &scissor); IGL_D3D12_LOG_VERBOSE( "RenderCommandEncoder: Set default viewport/scissor to back buffer %llux%u\n", bbDesc.Width, bbDesc.Height); } else { IGL_LOG_ERROR("RenderCommandEncoder: No back buffer available!\n"); } } // Capture actual framebuffer formats for dynamic PSO selection (Vulkan-style pattern) // This enables PSO variants to be selected at draw time based on framebuffer formats dynamicState_ = D3D12RenderPipelineDynamicState(); // Reset to UNKNOWN // Capture RTV formats from actual framebuffer resources // IMPORTANT: Use Texture::getFormat() not resource format - texture views may have different // formats if (framebuffer_) { const size_t numColorAttachments = std::min( framebuffer_->getColorAttachmentIndices().size(), D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT); for (size_t i = 0; i < numColorAttachments; ++i) { auto colorTex = std::static_pointer_cast(framebuffer_->getColorAttachment(i)); if (colorTex) { // Use getFormat() which returns the view format, not the resource format dynamicState_.rtvFormats[i] = textureFormatToDXGIFormat(colorTex->getFormat()); } } // Capture DSV format auto depthTex = std::static_pointer_cast(framebuffer_->getDepthAttachment()); if (depthTex) { // Use getFormat() which returns the view format, not the resource format dynamicState_.dsvFormat = textureFormatToDXGIFormat(depthTex->getFormat()); } } else { // Fallback: swapchain back buffer auto* backBuffer = context.getCurrentBackBuffer(); if (backBuffer) { D3D12_RESOURCE_DESC bbDesc = backBuffer->GetDesc(); dynamicState_.rtvFormats[0] = bbDesc.Format; } } IGL_D3D12_LOG_VERBOSE( "RenderCommandEncoder::begin() - Captured framebuffer formats: RTV[0]=%d, DSV=%d\n", static_cast(dynamicState_.rtvFormats[0]), static_cast(dynamicState_.dsvFormat)); IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder::begin() - Complete!\n"); } void RenderCommandEncoder::endEncoding() { auto& context2 = commandBuffer_.getContext(); // ========== MSAA RESOLVE OPERATION ========== // Resolve MSAA textures to non-MSAA textures before transitioning resources // This must happen AFTER rendering but BEFORE the final state transitions if (framebuffer_) { // Resolve color attachments const auto indices = framebuffer_->getColorAttachmentIndices(); for (size_t i : indices) { auto msaaAttachment = std::static_pointer_cast(framebuffer_->getColorAttachment(i)); auto resolveAttachment = std::static_pointer_cast(framebuffer_->getResolveColorAttachment(i)); // Check if both MSAA source and resolve target exist if (msaaAttachment && resolveAttachment && msaaAttachment->getResource() && resolveAttachment->getResource()) { // Verify MSAA source has samples > 1 and resolve target has samples == 1 D3D12_RESOURCE_DESC msaaDesc = msaaAttachment->getResource()->GetDesc(); D3D12_RESOURCE_DESC resolveDesc = resolveAttachment->getResource()->GetDesc(); if (msaaDesc.SampleDesc.Count > 1 && resolveDesc.SampleDesc.Count == 1) { IGL_D3D12_LOG_VERBOSE( "RenderCommandEncoder::endEncoding - Resolving MSAA color attachment %zu (%u samples " "-> 1 sample)\n", i, msaaDesc.SampleDesc.Count); // Transition MSAA texture to RESOLVE_SOURCE state msaaAttachment->transitionAll(commandList_, D3D12_RESOURCE_STATE_RESOLVE_SOURCE); // Transition resolve texture to RESOLVE_DEST state resolveAttachment->transitionAll(commandList_, D3D12_RESOURCE_STATE_RESOLVE_DEST); // Perform resolve operation: converts multi-sample texture to single-sample // This averages all samples in the MSAA texture and writes to the resolve texture commandList_->ResolveSubresource( resolveAttachment->getResource(), // pDstResource (non-MSAA) 0, // DstSubresource (mip 0, layer 0) msaaAttachment->getResource(), // pSrcResource (MSAA) 0, // SrcSubresource (mip 0, layer 0) msaaDesc.Format // Format (must be compatible) ); IGL_D3D12_LOG_VERBOSE( "RenderCommandEncoder::endEncoding - MSAA color resolve completed for attachment " "%zu\n", i); // Transition resolve texture to PIXEL_SHADER_RESOURCE for subsequent use resolveAttachment->transitionAll(commandList_, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); } } } // Resolve depth attachment if present auto msaaDepth = std::static_pointer_cast(framebuffer_->getDepthAttachment()); auto resolveDepth = std::static_pointer_cast(framebuffer_->getResolveDepthAttachment()); if (msaaDepth && resolveDepth && msaaDepth->getResource() && resolveDepth->getResource()) { D3D12_RESOURCE_DESC msaaDesc = msaaDepth->getResource()->GetDesc(); D3D12_RESOURCE_DESC resolveDesc = resolveDepth->getResource()->GetDesc(); if (msaaDesc.SampleDesc.Count > 1 && resolveDesc.SampleDesc.Count == 1) { IGL_D3D12_LOG_VERBOSE( "RenderCommandEncoder::endEncoding - Resolving MSAA depth attachment (%u samples -> 1 " "sample)\n", msaaDesc.SampleDesc.Count); // Transition depth textures to appropriate resolve states msaaDepth->transitionAll(commandList_, D3D12_RESOURCE_STATE_RESOLVE_SOURCE); resolveDepth->transitionAll(commandList_, D3D12_RESOURCE_STATE_RESOLVE_DEST); // Resolve depth buffer commandList_->ResolveSubresource( resolveDepth->getResource(), 0, msaaDepth->getResource(), 0, msaaDesc.Format); IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder::endEncoding - MSAA depth resolve completed\n"); // Transition resolved depth to shader resource for sampling resolveDepth->transitionAll(commandList_, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); } } } // ========== END MSAA RESOLVE OPERATION ========== // For offscreen framebuffers (MRT targets), transition all attachments to PIXEL_SHADER_RESOURCE // so they can be sampled in subsequent passes if (framebuffer_ && framebuffer_->getColorAttachment(0)) { auto swapColor = std::static_pointer_cast(framebuffer_->getColorAttachment(0)); // Check if this is the swapchain backbuffer const bool isSwapchainTarget = (swapColor && swapColor->getResource() == context2.getCurrentBackBuffer()); if (isSwapchainTarget) { // Swapchain framebuffer: transition to PRESENT swapColor->transitionAll(commandList_, D3D12_RESOURCE_STATE_PRESENT); } else { // Offscreen framebuffer (e.g., MRT targets): transition all color attachments to // PIXEL_SHADER_RESOURCE This allows the render targets to be sampled in subsequent rendering // passes (multi-frame support) const auto indices = framebuffer_->getColorAttachmentIndices(); for (size_t i : indices) { auto attachment = std::static_pointer_cast(framebuffer_->getColorAttachment(i)); if (attachment && attachment->getResource()) { attachment->transitionAll(commandList_, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); } } } } else { // No framebuffer provided - using swapchain directly auto* backBuffer = context2.getCurrentBackBuffer(); if (backBuffer) { D3D12_RESOURCE_BARRIER barrier = {}; barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE; barrier.Transition.pResource = backBuffer; barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_RENDER_TARGET; barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_PRESENT; barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; commandList_->ResourceBarrier(1, &barrier); } } // G-001: Flush any remaining barriers before ending encoding flushBarriers(); // Return RTV/DSV indices to the descriptor heap manager if used if (auto* mgr = context2.getDescriptorHeapManager()) { if (!rtvIndices_.empty()) { for (auto idx : rtvIndices_) { mgr->freeRTV(idx); } rtvIndices_.clear(); } if (dsvIndex_ != UINT32_MAX) { mgr->freeDSV(dsvIndex_); dsvIndex_ = UINT32_MAX; } } } void RenderCommandEncoder::bindViewport(const Viewport& viewport) { if (!commandBuffer_.isRecording() || !commandList_) { IGL_LOG_ERROR("RenderCommandEncoder::bindViewport called on closed command list\n"); return; } IGL_D3D12_LOG_VERBOSE("bindViewport called: x=%.1f, y=%.1f, w=%.1f, h=%.1f\n", viewport.x, viewport.y, viewport.width, viewport.height); D3D12_VIEWPORT vp = {}; vp.TopLeftX = viewport.x; vp.TopLeftY = viewport.y; vp.Width = viewport.width; vp.Height = viewport.height; vp.MinDepth = viewport.minDepth; vp.MaxDepth = viewport.maxDepth; commandList_->RSSetViewports(1, &vp); } void RenderCommandEncoder::bindScissorRect(const ScissorRect& rect) { if (!commandBuffer_.isRecording() || !commandList_) { IGL_LOG_ERROR("RenderCommandEncoder::bindScissorRect called on closed command list\n"); return; } D3D12_RECT scissor = {}; scissor.left = static_cast(rect.x); scissor.top = static_cast(rect.y); scissor.right = static_cast(rect.x + rect.width); scissor.bottom = static_cast(rect.y + rect.height); commandList_->RSSetScissorRects(1, &scissor); } void RenderCommandEncoder::bindRenderPipelineState( const std::shared_ptr& pipelineState) { if (!commandBuffer_.isRecording() || !commandList_) { IGL_LOG_ERROR("RenderCommandEncoder::bindRenderPipelineState called on closed command list\n"); return; } if (!pipelineState) { IGL_LOG_ERROR("bindRenderPipelineState: pipelineState is null!\n"); return; } auto* d3dPipelineState = static_cast(pipelineState.get()); // Cache pipeline state for dynamic PSO variant selection at draw time currentRenderPipelineState_ = d3dPipelineState; // Get PSO variant matching actual framebuffer formats (Vulkan-style dynamic selection) auto* pso = d3dPipelineState->getPipelineState(dynamicState_, commandBuffer_.getDevice()); auto* rootSig = d3dPipelineState->getRootSignature(); if (!pso) { IGL_LOG_ERROR("bindRenderPipelineState: PSO is null!\n"); return; } if (!rootSig) { IGL_LOG_ERROR("bindRenderPipelineState: Root signature is null!\n"); return; } IGL_D3D12_LOG_VERBOSE("bindRenderPipelineState: PSO=%p, RootSig=%p\n", pso, rootSig); commandList_->SetPipelineState(pso); commandList_->SetGraphicsRootSignature(rootSig); // Set primitive topology from the pipeline state D3D_PRIMITIVE_TOPOLOGY topology = d3dPipelineState->getPrimitiveTopology(); IGL_D3D12_LOG_VERBOSE("bindRenderPipelineState: Setting topology=%d\n", (int)topology); commandList_->IASetPrimitiveTopology(topology); // Cache vertex stride from pipeline (used when binding vertex buffers) currentVertexStride_ = d3dPipelineState->getVertexStride(); // Fill per-slot strides for (size_t s = 0; s < IGL_BUFFER_BINDINGS_MAX; ++s) { vertexStrides_[s] = d3dPipelineState->getVertexStride(s); } } void RenderCommandEncoder::bindDepthStencilState( const std::shared_ptr& /*depthStencilState*/) {} void RenderCommandEncoder::bindVertexBuffer(uint32_t index, IBuffer& buffer, size_t bufferOffset) { IGL_D3D12_LOG_VERBOSE("bindVertexBuffer called: index=%u\n", index); if (index >= IGL_BUFFER_BINDINGS_MAX) { IGL_LOG_ERROR("bindVertexBuffer: index %u exceeds max %u\n", index, IGL_BUFFER_BINDINGS_MAX); return; } auto* d3dBuffer = static_cast(&buffer); cachedVertexBuffers_[index].bufferLocation = d3dBuffer->gpuAddress(bufferOffset); cachedVertexBuffers_[index].sizeInBytes = static_cast(d3dBuffer->getSizeInBytes() - bufferOffset); cachedVertexBuffers_[index].bound = true; } void RenderCommandEncoder::bindIndexBuffer(IBuffer& buffer, IndexFormat format, size_t bufferOffset) { IGL_D3D12_LOG_VERBOSE("bindIndexBuffer called\n"); auto* d3dBuffer = static_cast(&buffer); cachedIndexBuffer_.bufferLocation = d3dBuffer->gpuAddress(bufferOffset); cachedIndexBuffer_.sizeInBytes = static_cast(d3dBuffer->getSizeInBytes() - bufferOffset); // D3D12 only supports 16-bit and 32-bit index formats (not 8-bit) cachedIndexBuffer_.format = (format == IndexFormat::UInt16) ? DXGI_FORMAT_R16_UINT : DXGI_FORMAT_R32_UINT; cachedIndexBuffer_.bound = true; } void RenderCommandEncoder::bindBytes(size_t /*index*/, uint8_t /*target*/, const void* /*data*/, size_t /*length*/) { // D3D12 backend does not support bindBytes // Applications should use uniform buffers (bindBuffer) instead // This is a no-op to maintain compatibility with cross-platform code IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); IGL_LOG_INFO_ONCE( "bindBytes is not supported in D3D12 backend. Use bindBuffer with uniform buffers " "instead.\n"); } void RenderCommandEncoder::bindPushConstants(const void* data, size_t length, size_t offset) { if (!commandBuffer_.isRecording() || !commandList_) { IGL_LOG_ERROR("RenderCommandEncoder::bindPushConstants called on closed command list\n"); return; } if (!data || length == 0) { return; } // Query pipeline for dynamic root parameter index (eliminates hardcoded assumptions) if (!currentRenderPipelineState_) { IGL_LOG_ERROR("bindPushConstants called without bound pipeline state\n"); return; } if (!currentRenderPipelineState_->hasPushConstants()) { IGL_LOG_ERROR("bindPushConstants called but pipeline has no push constants\n"); return; } const UINT rootParamIndex = currentRenderPipelineState_->getPushConstantRootParameterIndex(); // Offset and length are in bytes; convert to 32-bit units. const UINT offset32 = static_cast(offset / sizeof(uint32_t)); const UINT num32 = static_cast((length + sizeof(uint32_t) - 1) / sizeof(uint32_t)); // D3D12 permits up to 64 bytes (16 DWORDs) of root constants; enforce this // conservatively to avoid exceeding the root signature declaration. if (offset32 + num32 > 16) { IGL_LOG_ERROR( "bindPushConstants: push constant range (%u dwords at offset %u) exceeds 16 dword limit\n", num32, offset32); return; } commandList_->SetGraphicsRoot32BitConstants(rootParamIndex, num32, data, offset32); } void RenderCommandEncoder::bindSamplerState(size_t index, uint8_t /*target*/, ISamplerState* samplerState) { if (!commandBuffer_.isRecording() || !commandList_) { IGL_LOG_ERROR("RenderCommandEncoder::bindSamplerState called on closed command list\n"); return; } // Delegate to D3D12ResourcesBinder for centralized descriptor management. resourcesBinder_.bindSamplerState(static_cast(index), samplerState); // Clear bindBindGroup cache to switch from bindBindGroup path to bindSamplerState path // This ensures draw() will call resourcesBinder_.updateBindings() instead of using cached handles cachedTextureCount_ = 0; cachedSamplerCount_ = 0; usedBindGroup_ = false; } void RenderCommandEncoder::bindTexture(size_t index, uint8_t /*target*/, ITexture* texture) { if (!commandBuffer_.isRecording() || !commandList_) { IGL_LOG_ERROR("RenderCommandEncoder::bindTexture called on closed command list\n"); return; } // Delegate to single-argument version bindTexture(index, texture); } void RenderCommandEncoder::bindTexture(size_t index, ITexture* texture) { if (!commandBuffer_.isRecording() || !commandList_) { IGL_LOG_ERROR("RenderCommandEncoder::bindTexture called on closed command list\n"); return; } // Delegate to D3D12ResourcesBinder for centralized descriptor management. resourcesBinder_.bindTexture(static_cast(index), texture); // Clear bindBindGroup cache to switch from bindBindGroup path to bindTexture path // This ensures draw() will call resourcesBinder_.updateBindings() instead of using cached handles cachedTextureCount_ = 0; cachedSamplerCount_ = 0; usedBindGroup_ = false; } void RenderCommandEncoder::bindUniform(const UniformDesc& /*uniformDesc*/, const void* /*data*/) {} void RenderCommandEncoder::draw(size_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t baseInstance) { if (!commandBuffer_.isRecording() || !commandList_) { IGL_LOG_ERROR("RenderCommandEncoder::draw called on closed command list\n"); return; } // G-001: Flush any pending barriers before draw call flushBarriers(); // Apply all resource bindings (textures, samplers, buffers) before draw. // Even when bindBindGroup() is used for CBV tables, textures/samplers may still be // managed by D3D12ResourcesBinder, so always update bindings here. { Result bindResult; if (!resourcesBinder_.updateBindings(currentRenderPipelineState_, &bindResult)) { IGL_LOG_ERROR("draw: Failed to update resource bindings: %s\n", bindResult.message.c_str()); return; } } // D3D12 requires ALL root parameters to be bound before drawing // Hybrid render root signature layout (see Device::createRenderPipeline): // - Root parameter 0: Root 32-bit constants for b2 (push constants) // - Root parameter 1: Root CBV for b0 (legacy bindBuffer) // - Root parameter 2: Root CBV for b1 (legacy bindBuffer) // - Root parameter 3: CBV descriptor table for b3-b15 (bindBindGroup buffer table) // - Root parameter 4: SRV descriptor table for t0-tN // - Root parameter 5: Sampler descriptor table for s0-tN // - Root parameter 6: UAV descriptor table for u0-uN (storage buffers) // Bind descriptor tables using dynamic root parameter indices from pipeline reflection // The indices are computed based on which resources the shader actually uses // Apply vertex buffers. If the bound pipeline has no vertex input state // (no attributes/bindings), skip IASetVertexBuffers entirely so that // fullscreen / skybox style passes using SV_VertexID do not trigger // validation errors when a previous pass left a vertex buffer bound. bool pipelineHasVertexInput = (currentVertexStride_ != 0); if (!pipelineHasVertexInput) { for (uint32_t i = 0; i < IGL_BUFFER_BINDINGS_MAX; ++i) { if (vertexStrides_[i] != 0) { pipelineHasVertexInput = true; break; } } } if (pipelineHasVertexInput) { for (uint32_t i = 0; i < IGL_BUFFER_BINDINGS_MAX; ++i) { if (!cachedVertexBuffers_[i].bound) { continue; } UINT stride = vertexStrides_[i]; if (stride == 0) { if (currentVertexStride_ == 0) { IGL_LOG_INFO_ONCE( "Vertex buffer bound to slot %u but pipeline reports no stride; " "using conservative fallback stride of 32 bytes\n", i); stride = 32; } else { stride = currentVertexStride_; } } D3D12_VERTEX_BUFFER_VIEW vbView = {}; vbView.BufferLocation = cachedVertexBuffers_[i].bufferLocation; vbView.SizeInBytes = cachedVertexBuffers_[i].sizeInBytes; vbView.StrideInBytes = stride; IGL_D3D12_LOG_VERBOSE("draw: VB[%u] = GPU 0x%llx, size=%u, stride=%u\n", i, vbView.BufferLocation, vbView.SizeInBytes, vbView.StrideInBytes); commandList_->IASetVertexBuffers(i, 1, &vbView); } } else { // No vertex input expected for this pipeline; skip IASetVertexBuffers // even if a previous pass bound a vertex buffer. IGL_D3D12_LOG_VERBOSE( "draw: Pipeline has no vertex input layout; skipping IASetVertexBuffers for this draw\n"); } commandBuffer_.incrementDrawCount(); IGL_D3D12_LOG_VERBOSE( "draw: DrawInstanced(vertexCount=%zu, instanceCount=%u, firstVertex=%u, baseInstance=%u)\n", vertexCount, instanceCount, firstVertex, baseInstance); commandList_->DrawInstanced( static_cast(vertexCount), instanceCount, firstVertex, baseInstance); } void RenderCommandEncoder::drawIndexed(size_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t baseInstance) { if (!commandBuffer_.isRecording() || !commandList_) { IGL_LOG_ERROR("RenderCommandEncoder::drawIndexed called on closed command list\n"); return; } // G-001: Flush any pending barriers before draw call flushBarriers(); // Apply all resource bindings (textures, samplers, buffers) before draw. // Even when bindBindGroup() is used for CBV tables, textures/samplers may still be // managed by D3D12ResourcesBinder, so always update bindings here. { Result bindResult; if (!resourcesBinder_.updateBindings(currentRenderPipelineState_, &bindResult)) { IGL_LOG_ERROR("drawIndexed: Failed to update resource bindings: %s\n", bindResult.message.c_str()); return; } } // D3D12 requires ALL root parameters to be bound before drawing // Hybrid render root signature layout (see Device::createRenderPipeline): // - Root parameter 0: Root 32-bit constants for b2 (push constants) // - Root parameter 1: Root CBV for b0 (legacy bindBuffer) // - Root parameter 2: Root CBV for b1 (legacy bindBuffer) // - Root parameter 3: CBV descriptor table for b3-b15 (bindBindGroup buffer table) // - Root parameter 4: SRV descriptor table for t0-tN // - Root parameter 5: Sampler descriptor table for s0-tN // - Root parameter 6: UAV descriptor table for u0-uN (storage buffers) // Bind descriptor tables using dynamic root parameter indices from pipeline reflection // Descriptor tables (CBV/SRV/Sampler/UAV) are bound by D3D12ResourcesBinder::updateBindings() // based on the current pipeline's reflection. No additional descriptor table binding is // required here. // Apply cached vertex buffer bindings now that pipeline state is bound. // If the current pipeline has no vertex input layout (no attributes or // bindings), skip IASetVertexBuffers so that draws using SV_VertexID do // not rely on stale vertex buffer state from previous passes. bool pipelineHasVertexInput = (currentVertexStride_ != 0); if (!pipelineHasVertexInput) { for (uint32_t i = 0; i < IGL_BUFFER_BINDINGS_MAX; ++i) { if (vertexStrides_[i] != 0) { pipelineHasVertexInput = true; break; } } } if (pipelineHasVertexInput) { for (uint32_t i = 0; i < IGL_BUFFER_BINDINGS_MAX; ++i) { if (!cachedVertexBuffers_[i].bound) { continue; } UINT stride = vertexStrides_[i]; if (stride == 0) { if (currentVertexStride_ == 0) { IGL_LOG_INFO_ONCE( "Vertex buffer bound to slot %u but pipeline reports no stride; " "using conservative fallback stride of 32 bytes\n", i); stride = 32; } else { stride = currentVertexStride_; } } D3D12_VERTEX_BUFFER_VIEW vbView = {}; vbView.BufferLocation = cachedVertexBuffers_[i].bufferLocation; vbView.SizeInBytes = cachedVertexBuffers_[i].sizeInBytes; vbView.StrideInBytes = stride; commandList_->IASetVertexBuffers(i, 1, &vbView); } } else { IGL_D3D12_LOG_VERBOSE( "drawIndexed: Pipeline has no vertex input layout; skipping IASetVertexBuffers for this " "draw\n"); } // Apply cached index buffer binding if (cachedIndexBuffer_.bound) { D3D12_INDEX_BUFFER_VIEW ibView = {}; ibView.BufferLocation = cachedIndexBuffer_.bufferLocation; ibView.SizeInBytes = cachedIndexBuffer_.sizeInBytes; ibView.Format = cachedIndexBuffer_.format; commandList_->IASetIndexBuffer(&ibView); } // Track per-command-buffer draw count; CommandQueue aggregates into device on submit commandBuffer_.incrementDrawCount(); commandList_->DrawIndexedInstanced( static_cast(indexCount), instanceCount, firstIndex, vertexOffset, baseInstance); #if IGL_DEBUG static const bool kLogDrawErrors = []() { const char* env = std::getenv("IGL_D3D12_LOG_DRAW_ERRORS"); return env && (env[0] == '1'); }(); if (kLogDrawErrors) { auto* device = commandBuffer_.getContext().getDevice(); if (device) { igl::d3d12::ComPtr infoQueue; if (SUCCEEDED(device->QueryInterface(IID_PPV_ARGS(infoQueue.GetAddressOf())))) { const UINT64 messageCount = infoQueue->GetNumStoredMessages(); for (UINT64 i = 0; i < messageCount; ++i) { SIZE_T length = 0; if (FAILED(infoQueue->GetMessage(i, nullptr, &length)) || length == 0) { continue; } auto* message = static_cast(malloc(length)); if (message && SUCCEEDED(infoQueue->GetMessage(i, message, &length))) { IGL_LOG_ERROR("[D3D12 Debug] %s\n", message->pDescription ? message->pDescription : ""); } free(message); } infoQueue->ClearStoredMessages(); } } } #endif } void RenderCommandEncoder::drawMeshTasks(const Dimensions& /*threadgroupsPerGrid*/, const Dimensions& /*threadsPerTaskThreadgroup*/, const Dimensions& /*threadsPerMeshThreadgroup*/) { IGL_LOG_ERROR("RenderCommandEncoder::drawMeshTasks is not implemented on D3D12\n"); } void RenderCommandEncoder::multiDrawIndirect(IBuffer& indirectBuffer, size_t indirectBufferOffset, uint32_t drawCount, uint32_t stride) { if (!commandBuffer_.isRecording() || !commandList_) { IGL_LOG_ERROR("RenderCommandEncoder::multiDrawIndirect: command list is closed or null\n"); return; } // Get D3D12 buffer resource auto* d3dBuffer = static_cast(&indirectBuffer); if (!d3dBuffer) { IGL_LOG_ERROR("RenderCommandEncoder::multiDrawIndirect: indirectBuffer is null\n"); return; } ID3D12Resource* argBuffer = d3dBuffer->getResource(); if (!argBuffer) { IGL_LOG_ERROR("RenderCommandEncoder::multiDrawIndirect: argBuffer resource is null\n"); return; } // Get command signature from D3D12Context auto& ctx = commandBuffer_.getContext(); ID3D12CommandSignature* signature = ctx.getDrawIndirectSignature(); if (!signature) { IGL_LOG_ERROR("RenderCommandEncoder::multiDrawIndirect: command signature is null\n"); return; } // Use default stride if not provided (sizeof D3D12_DRAW_ARGUMENTS = 16 bytes) const UINT actualStride = stride ? stride : sizeof(D3D12_DRAW_ARGUMENTS); // ExecuteIndirect for multi-draw // Parameters: signature, maxCommandCount, argumentBuffer, argumentBufferOffset, countBuffer, // countBufferOffset commandList_->ExecuteIndirect(signature, drawCount, argBuffer, static_cast(indirectBufferOffset), nullptr, // No count buffer (exact draw count specified) 0); // Track draw call count commandBuffer_.incrementDrawCount(drawCount); IGL_D3D12_LOG_VERBOSE( "RenderCommandEncoder::multiDrawIndirect: Executed %u indirect draws (stride: %u)\n", drawCount, actualStride); } void RenderCommandEncoder::multiDrawIndexedIndirect(IBuffer& indirectBuffer, size_t indirectBufferOffset, uint32_t drawCount, uint32_t stride) { if (!commandBuffer_.isRecording() || !commandList_) { IGL_LOG_ERROR( "RenderCommandEncoder::multiDrawIndexedIndirect: command list is closed or null\n"); return; } // Get D3D12 buffer resource auto* d3dBuffer = static_cast(&indirectBuffer); if (!d3dBuffer) { IGL_LOG_ERROR("RenderCommandEncoder::multiDrawIndexedIndirect: indirectBuffer is null\n"); return; } ID3D12Resource* argBuffer = d3dBuffer->getResource(); if (!argBuffer) { IGL_LOG_ERROR("RenderCommandEncoder::multiDrawIndexedIndirect: argBuffer resource is null\n"); return; } // Get command signature from D3D12Context auto& ctx = commandBuffer_.getContext(); ID3D12CommandSignature* signature = ctx.getDrawIndexedIndirectSignature(); if (!signature) { IGL_LOG_ERROR("RenderCommandEncoder::multiDrawIndexedIndirect: command signature is null\n"); return; } // Use default stride if not provided (sizeof D3D12_DRAW_INDEXED_ARGUMENTS = 20 bytes) const UINT actualStride = stride ? stride : sizeof(D3D12_DRAW_INDEXED_ARGUMENTS); // ExecuteIndirect for multi-draw indexed // Parameters: signature, maxCommandCount, argumentBuffer, argumentBufferOffset, countBuffer, // countBufferOffset commandList_->ExecuteIndirect(signature, drawCount, argBuffer, static_cast(indirectBufferOffset), nullptr, // No count buffer (exact draw count specified) 0); // Track draw call count commandBuffer_.incrementDrawCount(drawCount); IGL_D3D12_LOG_VERBOSE( "RenderCommandEncoder::multiDrawIndexedIndirect: Executed %u indirect indexed draws (stride: " "%u)\n", drawCount, actualStride); } void RenderCommandEncoder::setStencilReferenceValue(uint32_t value) { if (!commandBuffer_.isRecording() || !commandList_) { return; } // Set stencil reference value for stencil testing commandList_->OMSetStencilRef(value); IGL_D3D12_LOG_VERBOSE("setStencilReferenceValue: Set stencil ref to %u\n", value); } void RenderCommandEncoder::setBlendColor(const Color& color) { if (!commandBuffer_.isRecording() || !commandList_) { return; } // Set blend factor constants for BlendFactor::BlendColor operations // D3D12 uses RGBA float array, matching IGL Color structure const float blendFactor[4] = {color.r, color.g, color.b, color.a}; commandList_->OMSetBlendFactor(blendFactor); IGL_D3D12_LOG_VERBOSE("setBlendColor: Set blend factor to (%.2f, %.2f, %.2f, %.2f)\n", color.r, color.g, color.b, color.a); } void RenderCommandEncoder::setDepthBias(float /*depthBias*/, float /*slopeScale*/, float /*clamp*/) { // Note: Depth bias is configured in the pipeline state (RasterizerState) // D3D12 does not support dynamic depth bias changes during rendering // This would require rebuilding the PSO with different depth bias values } void RenderCommandEncoder::pushDebugGroupLabel(const char* label, const Color& /*color*/) const { if (!commandBuffer_.isRecording() || !commandList_ || !label) { return; } const size_t len = strlen(label); std::wstring wlabel(len, L' '); std::mbstowcs(&wlabel[0], label, len); commandList_->BeginEvent( 0, wlabel.c_str(), static_cast((wlabel.length() + 1) * sizeof(wchar_t))); } void RenderCommandEncoder::insertDebugEventLabel(const char* label, const Color& /*color*/) const { if (!commandBuffer_.isRecording() || !commandList_ || !label) { return; } const size_t len = strlen(label); std::wstring wlabel(len, L' '); std::mbstowcs(&wlabel[0], label, len); commandList_->SetMarker( 0, wlabel.c_str(), static_cast((wlabel.length() + 1) * sizeof(wchar_t))); } void RenderCommandEncoder::popDebugGroupLabel() const { if (!commandBuffer_.isRecording() || !commandList_) { return; } commandList_->EndEvent(); } void RenderCommandEncoder::bindBuffer(uint32_t index, uint8_t /*target*/, IBuffer* buffer, size_t bufferOffset, size_t bufferSize) { // D3D12 does not differentiate shader stages for buffer binding in this path. bindBuffer(index, buffer, bufferOffset, bufferSize); } void RenderCommandEncoder::bindBuffer(uint32_t index, IBuffer* buffer, size_t offset, size_t bufferSize) { IGL_D3D12_LOG_VERBOSE("bindBuffer START: index=%u\n", index); if (!buffer) { IGL_D3D12_LOG_VERBOSE("bindBuffer: null buffer, returning\n"); return; } auto* d3dBuffer = static_cast(buffer); // Check if this is a storage buffer - needs SRV binding for shader reads const bool isStorageBuffer = (d3dBuffer->getBufferType() & BufferDesc::BufferTypeBits::Storage) != 0; if (isStorageBuffer) { // Storage buffer - create SRV for ByteAddressBuffer reads in pixel shader IGL_D3D12_LOG_VERBOSE( "bindBuffer: Storage buffer detected at index %u - creating SRV for pixel shader read\n", index); // For raw (ByteAddressBuffer) SRVs we treat the buffer as a sequence of 4-byte units. // This matches HLSL ByteAddressBuffer / RWByteAddressBuffer semantics. if ((offset & 3) != 0) { IGL_LOG_ERROR( "bindBuffer: Storage buffer offset %zu is not 4-byte aligned (required for " "DXGI_FORMAT_R32_TYPELESS). " "Raw buffer SRV FirstElement will be rounded down, which may cause incorrect data " "access.\n", offset); // Continue but log warning - FirstElement below uses integer division } auto& context = commandBuffer_.getContext(); auto* device = context.getDevice(); if (!device || cbvSrvUavHeap_ == nullptr) { IGL_LOG_ERROR("bindBuffer: Missing device or per-frame CBV/SRV/UAV heap\n"); return; } // Allocate descriptor slot from command buffer's shared counter // Uses Result-based allocation with dynamic heap growth. uint32_t descriptorIndex = 0; Result allocResult = commandBuffer_.getNextCbvSrvUavDescriptor(&descriptorIndex); if (!allocResult.isOk()) { IGL_LOG_ERROR("bindBuffer: Failed to allocate descriptor: %s\n", allocResult.message.c_str()); return; } IGL_D3D12_LOG_VERBOSE( "bindBuffer: Allocated SRV descriptor slot %u for buffer at t%u\n", descriptorIndex, index); // Create SRV descriptor for ByteAddressBuffer (raw view) D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; srvDesc.Format = DXGI_FORMAT_R32_TYPELESS; // Raw buffer (ByteAddressBuffer) srvDesc.ViewDimension = D3D12_SRV_DIMENSION_BUFFER; srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; // FirstElement/NumElements expressed in 32-bit units (4 bytes) srvDesc.Buffer.FirstElement = static_cast(offset) / 4; // Offset in 32-bit elements // NumElements must be (totalSize - offset) to avoid exceeding buffer bounds srvDesc.Buffer.NumElements = static_cast((buffer->getSizeInBytes() - offset) / 4); // Size in 32-bit elements srvDesc.Buffer.Flags = D3D12_BUFFER_SRV_FLAG_RAW; // Raw buffer access D3D12_CPU_DESCRIPTOR_HANDLE cpuHandle = context.getCbvSrvUavCpuHandle(descriptorIndex); D3D12_GPU_DESCRIPTOR_HANDLE gpuHandle = context.getCbvSrvUavGpuHandle(descriptorIndex); // Pre-creation validation. IGL_DEBUG_ASSERT(device != nullptr, "Device is null before CreateShaderResourceView"); IGL_DEBUG_ASSERT(d3dBuffer->getResource() != nullptr, "Buffer resource is null"); IGL_DEBUG_ASSERT(cpuHandle.ptr != 0, "SRV descriptor handle is invalid"); device->CreateShaderResourceView(d3dBuffer->getResource(), &srvDesc, cpuHandle); IGL_D3D12_LOG_VERBOSE( "bindBuffer: Created SRV at descriptor slot %u (FirstElement=%llu, NumElements=%u)\n", descriptorIndex, srvDesc.Buffer.FirstElement, srvDesc.Buffer.NumElements); // Cache GPU handle for descriptor table binding in draw calls. // SRVs are bound to root parameter 4 (render root signature SRV table). cachedTextureGpuHandles_[index] = gpuHandle; cachedTextureCount_ = std::max(cachedTextureCount_, static_cast(index + 1)); // For pipelines that declare SRVs but do not use the generic texture binding path // (e.g., ComputeSession visualization using ByteAddressBuffer at t0), bind the SRV // descriptor table directly to the SRV root parameter. This does not conflict with // D3D12ResourcesBinder because updateTextureBindings() is a no-op when no textures // are bound via bindTexture(). if (currentRenderPipelineState_ && commandList_) { const UINT srvTableIndex = currentRenderPipelineState_->getSRVTableRootParameterIndex(); if (srvTableIndex != UINT_MAX) { commandList_->SetGraphicsRootDescriptorTable(srvTableIndex, gpuHandle); IGL_D3D12_LOG_VERBOSE( "bindBuffer: Bound storage buffer SRV at slot %u (t%u) to SRV table root param %u " "(GPU handle 0x%llx)\n", index, index, srvTableIndex, gpuHandle.ptr); } } IGL_D3D12_LOG_VERBOSE("bindBuffer: Storage buffer SRV binding complete\n"); // CRITICAL: Track the Buffer OBJECT (not just resource) to keep it alive until GPU finishes // This prevents the Buffer destructor from releasing the resource while GPU commands reference // it Use weak_from_this().lock() instead of shared_from_this() to avoid exception std::shared_ptr sharedBuffer = d3dBuffer->weak_from_this().lock(); if (sharedBuffer) { static_cast(commandBuffer_).trackTransientBuffer(std::move(sharedBuffer)); IGL_D3D12_LOG_VERBOSE( "bindBuffer: Tracking Buffer object (shared_ptr) for lifetime management\n"); } else { // Buffer not managed by shared_ptr (e.g., persistent buffer from member variable) // Fall back to tracking just the resource (AddRef on ID3D12Resource) static_cast(commandBuffer_).trackTransientResource(d3dBuffer->getResource()); IGL_D3D12_LOG_VERBOSE("bindBuffer: Buffer not shared_ptr-managed, tracking resource only\n"); } } else { // Constant buffer (CBV) - delegate to resourcesBinder for reflection-based binding IGL_D3D12_LOG_VERBOSE( "bindBuffer: Constant buffer at index %u - delegating to resourcesBinder\n", index); // D3D12 requires constant buffer addresses to be 256-byte aligned if ((offset & 255) != 0) { IGL_LOG_ERROR( "bindBuffer: ERROR - CBV offset %zu is not 256-byte aligned (required by D3D12). " "Constant buffers must be created at aligned offsets. Ignoring bind request.\n", offset); return; } // CRITICAL: Track the Buffer OBJECT (not just resource) to keep it alive until GPU finishes std::shared_ptr sharedBuffer = d3dBuffer->weak_from_this().lock(); if (sharedBuffer) { static_cast(commandBuffer_).trackTransientBuffer(std::move(sharedBuffer)); IGL_D3D12_LOG_VERBOSE( "bindBuffer: Tracking Buffer object (shared_ptr) for lifetime management\n"); } else { static_cast(commandBuffer_).trackTransientResource(d3dBuffer->getResource()); IGL_D3D12_LOG_VERBOSE("bindBuffer: Buffer not shared_ptr-managed, tracking resource only\n"); } // Use bufferSize if provided; otherwise, bind the remaining bytes from offset. // This matches the cross-backend contract: bufferSize == 0 means "remaining size". const size_t fullSize = buffer->getSizeInBytes(); const size_t size = (bufferSize != 0 && bufferSize <= fullSize) ? bufferSize : (offset < fullSize ? (fullSize - offset) : 0); // Delegate to resourcesBinder which caches the binding and marks dirty flag // The actual binding will happen in resourcesBinder_.updateBindings() resourcesBinder_.bindBuffer(index, buffer, offset, size, false, 0); } IGL_D3D12_LOG_VERBOSE("bindBuffer END\n"); } void RenderCommandEncoder::bindBindGroup(BindGroupTextureHandle handle) { IGL_D3D12_LOG_VERBOSE("bindBindGroup(texture): handle valid=%d\n", !handle.empty()); if (!commandBuffer_.isRecording() || !commandList_) { IGL_LOG_ERROR("bindBindGroup(texture): command list is closed or null\n"); return; } // Get the bind group descriptor from the device auto& device = commandBuffer_.getDevice(); const auto* desc = device.getBindGroupTextureDesc(handle); if (!desc) { IGL_LOG_ERROR("bindBindGroup(texture): Invalid handle or descriptor not found\n"); return; } // Delegate actual descriptor allocation and binding to D3D12ResourcesBinder // so that bindBindGroup(texture) behaves like a grouped bindTexture/bindSamplerState. for (uint32_t i = 0; i < IGL_TEXTURE_SAMPLERS_MAX; ++i) { if (desc->textures[i]) { resourcesBinder_.bindTexture(i, desc->textures[i].get()); } } for (uint32_t i = 0; i < IGL_TEXTURE_SAMPLERS_MAX; ++i) { if (desc->samplers[i]) { resourcesBinder_.bindSamplerState(i, desc->samplers[i].get()); } } } void RenderCommandEncoder::bindBindGroup(BindGroupBufferHandle handle, uint32_t numDynamicOffsets, const uint32_t* dynamicOffsets) { IGL_D3D12_LOG_VERBOSE( "bindBindGroup(buffer): handle valid=%d, dynCount=%u\n", !handle.empty(), numDynamicOffsets); if (!commandBuffer_.isRecording() || !commandList_) { IGL_LOG_ERROR("bindBindGroup(buffer): command list is closed or null\n"); return; } auto& device = commandBuffer_.getDevice(); const auto* desc = device.getBindGroupBufferDesc(handle); if (!desc) { IGL_LOG_ERROR("bindBindGroup(buffer): Invalid handle or descriptor not found\n"); return; } // NEW PATH: // Delegate all buffer bindings to D3D12ResourcesBinder so that CBVs/SRVs/UAVs are created and // bound through a single, reflection-aware path. BindGroup slots map directly to shader // registers (bN / tN / uN), just like Vulkan bindings. { uint32_t dynIdx = 0; for (uint32_t slot = 0; slot < IGL_UNIFORM_BLOCKS_BINDING_MAX; ++slot) { auto& bufferHandle = desc->buffers[slot]; size_t baseOffset = desc->offset[slot]; size_t size = desc->size[slot]; if ((desc->isDynamicBufferMask & (1u << slot)) != 0) { if (dynIdx < numDynamicOffsets && dynamicOffsets) { baseOffset = dynamicOffsets[dynIdx++]; } } if (!bufferHandle) { // Unbind any previous buffer/UAV at this slot. resourcesBinder_.bindBuffer(slot, nullptr, 0, 0, false, 0); continue; } auto* buf = static_cast(bufferHandle.get()); const bool isUniform = (buf->getBufferType() & BufferDesc::BufferTypeBits::Uniform) != 0; const bool isStorage = (buf->getBufferType() & BufferDesc::BufferTypeBits::Storage) != 0; // Track resource so its lifetime is tied to the command buffer. commandBuffer_.trackTransientResource(buf->getResource()); if (isUniform) { // For CBVs, size == 0 means "remaining bytes from offset". Respect explicit sizes when // provided. resourcesBinder_.bindBuffer(slot, buf, baseOffset, size, false, 0); } else if (isStorage) { // Storage buffer: delegate to UAV/SRV binding path in D3D12ResourcesBinder. // Use the buffer's storage element stride when available; default to 4 bytes. size_t elementStride = buf->getStorageElementStride(); if (elementStride == 0) { elementStride = 4; } resourcesBinder_.bindBuffer(slot, buf, baseOffset, size, true, elementStride); } else { IGL_LOG_ERROR("bindBindGroup(buffer): Buffer at slot %u is neither Uniform nor Storage\n", slot); } } usedBindGroup_ = true; return; } auto* cmd = commandList_; if (!cmd) { IGL_LOG_ERROR("bindBindGroup(buffer): null command list\n"); return; } // CRITICAL: D3D12 descriptor tables MUST be contiguous in the descriptor heap. // SetGraphicsRootDescriptorTable passes a GPU handle to the START of a contiguous block. // D3D12 accesses descriptors using: baseHandle + tableOffset. // // Example: If BindGroupBufferDesc has buffers at slots 3-6: // - We need descriptors at heap indices [base+0] through [base+6] // - Slots 0-2 get NULL CBVs, slots 3-6 get real CBVs // - SetGraphicsRootDescriptorTable receives handle to heap[base+0] // - Shader accessing b3 reads from heap[base+3] // // First pass: Determine highest slot index to calculate total descriptor count uint32_t maxSlotUsed = 0; for (uint32_t slot = 0; slot < IGL_UNIFORM_BLOCKS_BINDING_MAX; ++slot) { if (desc->buffers[slot]) { auto* buf = static_cast(desc->buffers[slot].get()); const bool isUniform = (buf->getBufferType() & BufferDesc::BufferTypeBits::Uniform) != 0; if (isUniform) { maxSlotUsed = slot; } } } if (maxSlotUsed == 0 && !desc->buffers[0]) { // No uniform buffers to bind return; } cbvTableCount_ = maxSlotUsed + 1; // Allocate a CONTIGUOUS block of descriptors for the entire descriptor table uint32_t baseDescriptorIndex = 0; Result allocResult = commandBuffer_.allocateCbvSrvUavRange(static_cast(cbvTableCount_), &baseDescriptorIndex); if (!allocResult.isOk()) { IGL_LOG_ERROR( "bindBindGroup(buffer): Failed to allocate contiguous CBV descriptor range (%zu " "descriptors): %s\n", cbvTableCount_, allocResult.message.c_str()); return; } auto& context = commandBuffer_.getContext(); auto* d3d12Device = context.getDevice(); IGL_D3D12_LOG_VERBOSE( "bindBindGroup(buffer): Allocated contiguous CBV descriptor block: base=%u, count=%zu\n", baseDescriptorIndex, cbvTableCount_); // Second pass: Create CBV descriptors in the contiguous block uint32_t dynIdx = 0; for (uint32_t slot = 0; slot < cbvTableCount_; ++slot) { // Calculate descriptor index within the contiguous block uint32_t descriptorIndex = baseDescriptorIndex + slot; D3D12_CPU_DESCRIPTOR_HANDLE cpuHandle = context.getCbvSrvUavCpuHandle(descriptorIndex); if (!desc->buffers[slot]) { // Create NULL CBV for empty slots D3D12_CONSTANT_BUFFER_VIEW_DESC nullCbvDesc = {}; nullCbvDesc.BufferLocation = 0; nullCbvDesc.SizeInBytes = 256; // Minimum CBV alignment d3d12Device->CreateConstantBufferView(&nullCbvDesc, cpuHandle); IGL_D3D12_LOG_VERBOSE( "bindBindGroup(buffer): Created NULL CBV at heap[%u] for empty slot %u\n", descriptorIndex, slot); continue; } auto* buf = static_cast(desc->buffers[slot].get()); const bool isUniform = (buf->getBufferType() & BufferDesc::BufferTypeBits::Uniform) != 0; const bool isStorage = (buf->getBufferType() & BufferDesc::BufferTypeBits::Storage) != 0; // Track buffer resource to prevent it from being deleted while GPU address is cached commandBuffer_.trackTransientResource(buf->getResource()); size_t baseOffset = desc->offset[slot]; if ((desc->isDynamicBufferMask & (1u << slot)) != 0) { if (dynIdx < numDynamicOffsets && dynamicOffsets) { baseOffset = dynamicOffsets[dynIdx++]; } } if (isUniform) { // 256B alignment required for CBVs const size_t aligned = (baseOffset + 255) & ~size_t(255); D3D12_GPU_VIRTUAL_ADDRESS addr = buf->gpuAddress(aligned); if (slot < IGL_BUFFER_BINDINGS_MAX) { // Respect requested buffer size and enforce the 64 KB limit. // If size[slot] is 0, use remaining buffer size from offset size_t requestedSize = desc->size[slot]; if (requestedSize == 0) { requestedSize = buf->getSizeInBytes() - aligned; } // D3D12 spec: Constant buffers must be ≤ 64 KB constexpr size_t kMaxCBVSize = 65536; // 64 KB if (requestedSize > kMaxCBVSize) { IGL_LOG_ERROR( "bindBindGroup(buffer): Constant buffer size (%zu bytes) exceeds D3D12 64 KB limit " "at slot %u\n", requestedSize, slot); continue; // Skip this binding } // Create CBV descriptor in the contiguous block D3D12_CONSTANT_BUFFER_VIEW_DESC cbvDesc = {}; cbvDesc.BufferLocation = addr; cbvDesc.SizeInBytes = static_cast((requestedSize + 255) & ~255); // Must be 256-byte aligned // Pre-creation validation. IGL_DEBUG_ASSERT(d3d12Device != nullptr, "Device is null before CreateConstantBufferView"); IGL_DEBUG_ASSERT(addr != 0, "Buffer GPU address is null"); IGL_DEBUG_ASSERT(cpuHandle.ptr != 0, "CBV descriptor handle is invalid"); IGL_DEBUG_ASSERT(cbvDesc.SizeInBytes <= kMaxCBVSize, "CBV size exceeds 64 KB after alignment"); d3d12Device->CreateConstantBufferView(&cbvDesc, cpuHandle); IGL_D3D12_LOG_VERBOSE( "bindBindGroup(buffer): Created CBV at heap[%u] for slot %u (addr=0x%llx, size=%u)\n", descriptorIndex, slot, addr, cbvDesc.SizeInBytes); } else { IGL_LOG_ERROR("bindBindGroup(buffer): BindGroupBufferDesc slot %u exceeds maximum (%u)\n", slot, IGL_BUFFER_BINDINGS_MAX); } } else if (isStorage) { // Implement storage buffer binding via UAV/SRV descriptors. auto& storageContext = commandBuffer_.getContext(); auto* d3dDevice = storageContext.getDevice(); ID3D12Resource* resource = buf->getResource(); // Determine if buffer is read-write (UAV) or read-only (SRV) // D3D12 storage buffers with UAV flag are read-write by default // Private/Shared storage indicates read-write access, Managed indicates read-only const bool isReadWrite = (buf->storage() == ResourceStorage::Private || buf->storage() == ResourceStorage::Shared); if (isReadWrite) { // Create UAV for read-write storage buffer // Uses Result-based allocation with dynamic heap growth. uint32_t descriptorIndex = 0; Result allocResult = commandBuffer_.getNextCbvSrvUavDescriptor(&descriptorIndex); if (!allocResult.isOk()) { IGL_LOG_ERROR("bindBindGroup(buffer): Failed to allocate UAV descriptor: %s\n", allocResult.message.c_str()); continue; } D3D12_CPU_DESCRIPTOR_HANDLE cpuHandle = context.getCbvSrvUavCpuHandle(descriptorIndex); D3D12_GPU_DESCRIPTOR_HANDLE gpuHandle = context.getCbvSrvUavGpuHandle(descriptorIndex); // Create UAV descriptor for structured buffer // Use the storage stride from BufferDesc when available; default to 4 bytes otherwise. size_t elementStride = buf->getStorageElementStride(); if (elementStride == 0) { elementStride = 4; } // Validate baseOffset doesn't exceed buffer size const size_t bufferSizeBytes = buf->getSizeInBytes(); if (baseOffset > bufferSizeBytes) { IGL_LOG_ERROR( "bindBindGroup(buffer): baseOffset %zu exceeds buffer size %zu; skipping UAV " "binding\n", baseOffset, bufferSizeBytes); continue; } if (baseOffset % elementStride != 0) { IGL_LOG_ERROR( "bindBindGroup(buffer): Storage buffer baseOffset %zu is not aligned to " "element stride (%zu bytes). UAV FirstElement will be truncated (offset/stride).\n", baseOffset, elementStride); } const size_t remaining = bufferSizeBytes - baseOffset; // Check for undersized buffer (would create empty or partial view) if (remaining < elementStride) { IGL_LOG_ERROR( "bindBindGroup(buffer): Remaining buffer size %zu is less than element stride %zu; " "UAV will have NumElements=0 (empty view). Check buffer size and offset.\n", remaining, elementStride); // Continue to create the descriptor, but it will be empty (NumElements=0) } D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = {}; uavDesc.Format = DXGI_FORMAT_UNKNOWN; uavDesc.ViewDimension = D3D12_UAV_DIMENSION_BUFFER; uavDesc.Buffer.FirstElement = static_cast(baseOffset / elementStride); // CRITICAL: NumElements must be (size - offset) / stride, not total size / stride uavDesc.Buffer.NumElements = static_cast(remaining / elementStride); uavDesc.Buffer.StructureByteStride = static_cast(elementStride); uavDesc.Buffer.CounterOffsetInBytes = 0; uavDesc.Buffer.Flags = D3D12_BUFFER_UAV_FLAG_NONE; // Pre-creation validation. IGL_DEBUG_ASSERT(d3dDevice != nullptr, "Device is null before CreateUnorderedAccessView"); IGL_DEBUG_ASSERT(resource != nullptr, "Buffer resource is null"); IGL_DEBUG_ASSERT(cpuHandle.ptr != 0, "UAV descriptor handle is invalid"); d3dDevice->CreateUnorderedAccessView(resource, nullptr, &uavDesc, cpuHandle); // Bind UAV descriptor table using dynamic root parameter index from pipeline const UINT uavTableIndex = currentRenderPipelineState_->getUAVTableRootParameterIndex(); if (uavTableIndex != UINT_MAX) { commandList_->SetGraphicsRootDescriptorTable(uavTableIndex, gpuHandle); IGL_D3D12_LOG_VERBOSE( "bindBindGroup(buffer): bound read-write storage buffer at slot %u (UAV u%u, root " "param %u, GPU handle 0x%llx)\n", slot, slot, uavTableIndex, gpuHandle.ptr); } else { IGL_LOG_ERROR( "bindBindGroup(buffer): Pipeline has no UAV table root parameter for storage buffer " "binding\n"); } } else { // Create SRV for read-only storage buffer // Uses Result-based allocation with dynamic heap growth. uint32_t descriptorIndex = 0; Result allocResult = commandBuffer_.getNextCbvSrvUavDescriptor(&descriptorIndex); if (!allocResult.isOk()) { IGL_LOG_ERROR("bindBindGroup(buffer): Failed to allocate SRV descriptor: %s\n", allocResult.message.c_str()); continue; } D3D12_CPU_DESCRIPTOR_HANDLE cpuHandle = context.getCbvSrvUavCpuHandle(descriptorIndex); D3D12_GPU_DESCRIPTOR_HANDLE gpuHandle = context.getCbvSrvUavGpuHandle(descriptorIndex); // Create SRV descriptor for structured buffer size_t elementStride = buf->getStorageElementStride(); if (elementStride == 0) { elementStride = 4; } // Validate baseOffset doesn't exceed buffer size const size_t bufferSizeBytes = buf->getSizeInBytes(); if (baseOffset > bufferSizeBytes) { IGL_LOG_ERROR( "bindBindGroup(buffer): baseOffset %zu exceeds buffer size %zu; skipping SRV " "binding\n", baseOffset, bufferSizeBytes); continue; } if (baseOffset % elementStride != 0) { IGL_LOG_ERROR( "bindBindGroup(buffer): Storage buffer baseOffset %zu is not aligned to " "element stride (%zu bytes). SRV FirstElement will be truncated (offset/stride).\n", baseOffset, elementStride); } const size_t remaining = bufferSizeBytes - baseOffset; // Check for undersized buffer (would create empty or partial view) if (remaining < elementStride) { IGL_LOG_ERROR( "bindBindGroup(buffer): Remaining buffer size %zu is less than element stride %zu; " "SRV will have NumElements=0 (empty view). Check buffer size and offset.\n", remaining, elementStride); // Continue to create the descriptor, but it will be empty (NumElements=0) } D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; srvDesc.Format = DXGI_FORMAT_UNKNOWN; srvDesc.ViewDimension = D3D12_SRV_DIMENSION_BUFFER; srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; srvDesc.Buffer.FirstElement = static_cast(baseOffset / elementStride); // CRITICAL: NumElements must be (size - offset) / stride, not total size / stride srvDesc.Buffer.NumElements = static_cast(remaining / elementStride); srvDesc.Buffer.StructureByteStride = static_cast(elementStride); srvDesc.Buffer.Flags = D3D12_BUFFER_SRV_FLAG_NONE; // Pre-creation validation. IGL_DEBUG_ASSERT(d3dDevice != nullptr, "Device is null before CreateShaderResourceView"); IGL_DEBUG_ASSERT(resource != nullptr, "Buffer resource is null"); IGL_DEBUG_ASSERT(cpuHandle.ptr != 0, "SRV descriptor handle is invalid"); d3dDevice->CreateShaderResourceView(resource, &srvDesc, cpuHandle); // Bind SRV descriptor table (graphics root parameter 4: SRV table) // Note: This shares the texture SRV table; storage buffers and textures will be bound // together. PRECEDENCE: Storage buffer SRVs bound here will override any previous texture // SRVs bound via Bind SRV descriptor table using dynamic root parameter index from pipeline // This may rebind the SRV table that was previously set by bindBindGroup(texture). The last // SetGraphicsRootDescriptorTable call wins - storage buffer bindings take precedence. const UINT srvTableIndex = currentRenderPipelineState_->getSRVTableRootParameterIndex(); if (srvTableIndex != UINT_MAX) { commandList_->SetGraphicsRootDescriptorTable(srvTableIndex, gpuHandle); IGL_D3D12_LOG_VERBOSE( "bindBindGroup(buffer): bound read-only storage buffer at slot %u (SRV t%u, root " "param %u, GPU handle 0x%llx)\n", slot, slot, srvTableIndex, gpuHandle.ptr); } else { IGL_LOG_ERROR( "bindBindGroup(buffer): Pipeline has no SRV table root parameter for storage buffer " "binding\n"); } } } } // Store the GPU handle of the FIRST descriptor in the contiguous block. // SetGraphicsRootDescriptorTable will use this handle, and D3D12 will access // subsequent descriptors using: baseHandle + tableOffset. D3D12_GPU_DESCRIPTOR_HANDLE baseGpuHandle = context.getCbvSrvUavGpuHandle(baseDescriptorIndex); cachedCbvTableGpuHandles_[0] = baseGpuHandle; IGL_D3D12_LOG_VERBOSE( "bindBindGroup(buffer): Stored base GPU handle 0x%llx for CBV table (spans heap[%u] to " "heap[%u])\n", baseGpuHandle.ptr, baseDescriptorIndex, baseDescriptorIndex + cbvTableCount_ - 1); // Mark that bindBindGroup was used (vs storage buffer SRV or binder paths). usedBindGroup_ = true; } // G-001: Barrier batching implementation void RenderCommandEncoder::flushBarriers() { if (pendingBarriers_.empty()) { return; } if (!commandBuffer_.isRecording() || !commandList_) { IGL_LOG_ERROR( "RenderCommandEncoder::flushBarriers called on closed command list; clearing pending " "barriers\n"); pendingBarriers_.clear(); return; } IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: Flushing %zu batched resource barriers\n", pendingBarriers_.size()); // Submit all pending barriers in a single API call commandList_->ResourceBarrier(static_cast(pendingBarriers_.size()), pendingBarriers_.data()); // Clear the pending barrier queue pendingBarriers_.clear(); } void RenderCommandEncoder::queueBarrier(const D3D12_RESOURCE_BARRIER& barrier) { pendingBarriers_.push_back(barrier); IGL_D3D12_LOG_VERBOSE("RenderCommandEncoder: Queued barrier (total pending: %zu)\n", pendingBarriers_.size()); } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/RenderCommandEncoder.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include #include namespace igl::d3d12 { class CommandBuffer; /** * @brief D3D12 implementation of render command encoder * * IMPORTANT BINDING PRECEDENCE NOTES: * ==================================== * This encoder supports multiple ways to bind shader resources (textures, buffers, samplers). * Some binding methods share the same D3D12 root parameters, which means the LAST binding wins: * * 1. SRV Table (Root Parameter 4): * - Textures bound via bindTexture() or D3D12ResourcesBinder * - Storage buffers (read-only) bound via bindBindGroup(BindGroupBufferHandle) * - If you bind BOTH textures and storage buffer SRVs, the last binding before draw() wins * - Application code must coordinate which binding method to use per draw call * * 2. Sampler Table (Root Parameter 5): * - Samplers bound via bindSamplerState() or D3D12ResourcesBinder * * 3. CBV Table (Root Parameter 3): * - Constant buffers b3-b15 bound via bindBindGroup(BindGroupBufferHandle) * * See individual binding method documentation for details. */ class RenderCommandEncoder final : public IRenderCommandEncoder { public: RenderCommandEncoder(CommandBuffer& commandBuffer, const std::shared_ptr& framebuffer); ~RenderCommandEncoder() override = default; // Initialize encoder and setup render targets // IMPORTANT: Must be called exactly once after construction by // CommandBuffer::createRenderCommandEncoder. Calling multiple times will result in resource leaks // and undefined behavior. Debug builds will assert if called more than once. void begin(const RenderPassDesc& renderPass); void endEncoding() override; void bindViewport(const Viewport& viewport) override; void bindScissorRect(const ScissorRect& rect) override; void bindRenderPipelineState(const std::shared_ptr& pipelineState) override; void bindDepthStencilState(const std::shared_ptr& depthStencilState) override; void bindVertexBuffer(uint32_t index, IBuffer& buffer, size_t bufferOffset = 0) override; void bindIndexBuffer(IBuffer& buffer, IndexFormat format, size_t bufferOffset = 0) override; void bindBytes(size_t index, uint8_t target, const void* data, size_t length) override; void bindPushConstants(const void* data, size_t length, size_t offset = 0) override; void bindSamplerState(size_t index, uint8_t target, ISamplerState* samplerState) override; void bindTexture(size_t index, uint8_t target, ITexture* texture) override; void bindTexture(size_t index, ITexture* texture) override; void bindUniform(const UniformDesc& uniformDesc, const void* data) override; void draw(size_t vertexCount, uint32_t instanceCount = 1, uint32_t firstVertex = 0, uint32_t baseInstance = 0) override; void drawIndexed(size_t indexCount, uint32_t instanceCount = 1, uint32_t firstIndex = 0, int32_t vertexOffset = 0, uint32_t baseInstance = 0) override; void drawMeshTasks(const Dimensions& threadgroupsPerGrid, const Dimensions& threadsPerTaskThreadgroup, const Dimensions& threadsPerMeshThreadgroup) override; void multiDrawIndirect(IBuffer& indirectBuffer, size_t indirectBufferOffset, uint32_t drawCount, uint32_t stride = 0) override; void multiDrawIndexedIndirect(IBuffer& indirectBuffer, size_t indirectBufferOffset, uint32_t drawCount, uint32_t stride = 0) override; void setStencilReferenceValue(uint32_t value) override; void setBlendColor(const Color& color) override; void setDepthBias(float depthBias, float slopeScale, float clamp) override; // ICommandEncoder interface void pushDebugGroupLabel(const char* label, const Color& color) const override; void insertDebugEventLabel(const char* label, const Color& color) const override; void popDebugGroupLabel() const override; // Additional IRenderCommandEncoder interface void bindBuffer(uint32_t index, uint8_t target, IBuffer* buffer, size_t bufferOffset = 0, size_t bufferSize = 0) override; void bindBuffer(uint32_t index, IBuffer* buffer, size_t offset, size_t bufferSize) override; void bindBindGroup(BindGroupTextureHandle handle) override; void bindBindGroup(BindGroupBufferHandle handle, uint32_t numDynamicOffsets, const uint32_t* dynamicOffsets) override; private: CommandBuffer& commandBuffer_; ID3D12GraphicsCommandList* commandList_; // Centralized resource binding management. D3D12ResourcesBinder resourcesBinder_; // Guard against multiple begin() calls. // begin() allocates RTV/DSV descriptors and sets up state that should only happen once bool hasBegun_ = false; // Cache current vertex stride from bound pipeline's input layout UINT currentVertexStride_ = 0; // Optional per-slot strides fetched from pipeline UINT vertexStrides_[IGL_BUFFER_BINDINGS_MAX] = {}; // Offscreen RTV/DSV support std::shared_ptr framebuffer_; // If DescriptorHeapManager is available, we borrow indices from its heaps. // Otherwise, we fall back to small ad-hoc heaps (constructor local scope). std::vector rtvIndices_; uint32_t dsvIndex_ = UINT32_MAX; D3D12_CPU_DESCRIPTOR_HANDLE dsvHandle_{}; // Per-frame descriptor heaps (set in constructor from D3D12Context) // CRITICAL: These MUST be per-frame isolated heaps, NOT shared DescriptorHeapManager heaps ID3D12DescriptorHeap* cbvSrvUavHeap_ = nullptr; ID3D12DescriptorHeap* samplerHeap_ = nullptr; // Cached descriptor table GPU handles // These are set by bindTexture/bindSamplerState and used in drawIndexed // to avoid invalidation by multiple SetDescriptorHeaps calls // IMPORTANT: Bindings must be DENSE and start at slot 0 for each table. // SetGraphicsRootDescriptorTable always uses cachedTextureGpuHandles_[0] as the base, // so binding only higher slots (e.g., slot 1 without slot 0) will fail. D3D12_GPU_DESCRIPTOR_HANDLE cachedTextureGpuHandle_{}; D3D12_GPU_DESCRIPTOR_HANDLE cachedSamplerGpuHandle_{}; // Support up to IGL_TEXTURE_SAMPLERS_MAX textures/samplers (t0-t15, s0-s15) D3D12_GPU_DESCRIPTOR_HANDLE cachedTextureGpuHandles_[IGL_TEXTURE_SAMPLERS_MAX] = {}; D3D12_GPU_DESCRIPTOR_HANDLE cachedSamplerGpuHandles_[IGL_TEXTURE_SAMPLERS_MAX] = {}; size_t cachedTextureCount_ = 0; size_t cachedSamplerCount_ = 0; // Track whether bindBindGroup was explicitly called (vs storage buffer SRV or binder paths) // This decouples bindBindGroup usage from cachedTextureCount_/cachedSamplerCount_ bool usedBindGroup_ = false; // Cached vertex buffer bindings // Store binding info and apply in draw calls after pipeline state is bound struct CachedVertexBuffer { D3D12_GPU_VIRTUAL_ADDRESS bufferLocation = 0; UINT sizeInBytes = 0; bool bound = false; }; CachedVertexBuffer cachedVertexBuffers_[IGL_BUFFER_BINDINGS_MAX] = {}; // Cached index buffer binding struct CachedIndexBuffer { D3D12_GPU_VIRTUAL_ADDRESS bufferLocation = 0; UINT sizeInBytes = 0; DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN; bool bound = false; }; CachedIndexBuffer cachedIndexBuffer_ = {}; // Track which constant buffer root parameters have been bound // D3D12 requires all root parameters to be set before drawing // Root parameter 1 = b0 (UniformsPerFrame) - root descriptor // Root parameter 2 = b1 (UniformsPerObject) - root descriptor D3D12_GPU_VIRTUAL_ADDRESS cachedConstantBuffers_[2] = {0, 0}; // b0, b1 bool constantBufferBound_[2] = {false, false}; // Cached CBV descriptor table for b2-b15 (root parameter 3) // Supports up to 14 additional uniform buffers via descriptor table D3D12_GPU_DESCRIPTOR_HANDLE cachedCbvTableGpuHandles_[IGL_BUFFER_BINDINGS_MAX] = {}; bool cbvTableBound_[IGL_BUFFER_BINDINGS_MAX] = {}; size_t cbvTableCount_ = 0; // G-001: Barrier batching infrastructure // Accumulates resource barriers and flushes them before draw/dispatch calls // This reduces D3D12 API overhead and allows driver optimization std::vector pendingBarriers_; // Flushes all pending barriers to the command list void flushBarriers(); // Queue a barrier for batched submission void queueBarrier(const D3D12_RESOURCE_BARRIER& barrier); // Dynamic PSO selection (Vulkan-style pattern) // Stores actual framebuffer formats captured in begin() // Used to select correct PSO variant at draw time D3D12RenderPipelineDynamicState dynamicState_; // Cached render pipeline state for dynamic PSO variant selection const RenderPipelineState* currentRenderPipelineState_ = nullptr; }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/RenderPipelineState.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #include #include namespace igl::d3d12 { RenderPipelineState::RenderPipelineState(const RenderPipelineDesc& desc, igl::d3d12::ComPtr pipelineState, igl::d3d12::ComPtr rootSignature) : IRenderPipelineState(desc), pipelineState_(std::move(pipelineState)), rootSignature_(std::move(rootSignature)) { // Set D3D12 object names for PIX debugging const std::string& debugName = desc.debugName.toString(); if (pipelineState_.Get() && !debugName.empty()) { std::wstring wideName(debugName.begin(), debugName.end()); pipelineState_->SetName((L"PSO_" + wideName).c_str()); IGL_D3D12_LOG_VERBOSE("RenderPipelineState: Set PIX debug name 'PSO_%s'\n", debugName.c_str()); } if (rootSignature_.Get() && !debugName.empty()) { std::wstring wideName(debugName.begin(), debugName.end()); rootSignature_->SetName((L"RootSig_" + wideName).c_str()); IGL_D3D12_LOG_VERBOSE("RenderPipelineState: Set PIX root signature name 'RootSig_%s'\n", debugName.c_str()); } // Extract shader reflection info for future dynamic binding support if (desc.shaderStages) { auto* vertexModule = static_cast(desc.shaderStages->getVertexModule().get()); auto* fragmentModule = static_cast(desc.shaderStages->getFragmentModule().get()); // Prefer vertex shader for push constants if both define them if (vertexModule) { const auto& vsReflection = vertexModule->getReflectionInfo(); if (vsReflection.hasPushConstants) { shaderReflection_.hasPushConstants = true; shaderReflection_.pushConstantSlot = vsReflection.pushConstantSlot; shaderReflection_.pushConstantSize = vsReflection.pushConstantSize; shaderReflection_.pushConstantRootParamIndex = 0; // Push constants are always root parameter 0 IGL_D3D12_LOG_VERBOSE( "RenderPipelineState: VS push constants at b%u (%u DWORDs, root param %u)\n", vsReflection.pushConstantSlot, vsReflection.pushConstantSize, shaderReflection_.pushConstantRootParamIndex); } } // Use fragment shader push constants if vertex shader doesn't have them if (!shaderReflection_.hasPushConstants && fragmentModule) { const auto& psReflection = fragmentModule->getReflectionInfo(); if (psReflection.hasPushConstants) { shaderReflection_.hasPushConstants = true; shaderReflection_.pushConstantSlot = psReflection.pushConstantSlot; shaderReflection_.pushConstantSize = psReflection.pushConstantSize; shaderReflection_.pushConstantRootParamIndex = 0; // Push constants are always root parameter 0 IGL_D3D12_LOG_VERBOSE( "RenderPipelineState: PS push constants at b%u (%u DWORDs, root param %u)\n", psReflection.pushConstantSlot, psReflection.pushConstantSize, shaderReflection_.pushConstantRootParamIndex); } } } // Convert IGL primitive topology to D3D12 primitive topology switch (desc.topology) { case PrimitiveType::Point: primitiveTopology_ = D3D_PRIMITIVE_TOPOLOGY_POINTLIST; IGL_D3D12_LOG_VERBOSE("RenderPipelineState: Set topology to POINTLIST\n"); break; case PrimitiveType::Line: primitiveTopology_ = D3D_PRIMITIVE_TOPOLOGY_LINELIST; IGL_D3D12_LOG_VERBOSE("RenderPipelineState: Set topology to LINELIST\n"); break; case PrimitiveType::LineStrip: primitiveTopology_ = D3D_PRIMITIVE_TOPOLOGY_LINESTRIP; IGL_D3D12_LOG_VERBOSE("RenderPipelineState: Set topology to LINESTRIP\n"); break; case PrimitiveType::Triangle: primitiveTopology_ = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST; IGL_D3D12_LOG_VERBOSE("RenderPipelineState: Set topology to TRIANGLELIST\n"); break; case PrimitiveType::TriangleStrip: primitiveTopology_ = D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP; IGL_D3D12_LOG_VERBOSE("RenderPipelineState: Set topology to TRIANGLESTRIP\n"); break; } // Cache the vertex stride from the vertex input state binding (slot 0) if available const auto& vis = desc.vertexInputState; if (vis) { // Try backend downcast to extract VertexInputStateDesc if (auto* d3dVis = dynamic_cast(vis.get())) { const auto& d = d3dVis->getDesc(); if (d.numInputBindings > 0) { vertexStride_ = static_cast(d.inputBindings[0].stride); // Cache per-slot strides for (size_t s = 0; s < d.numInputBindings && s < IGL_BUFFER_BINDINGS_MAX; ++s) { vertexStrides_[s] = static_cast(d.inputBindings[s].stride); } // If attributes reference slots beyond numInputBindings or strides are zero, // derive reasonable defaults so sessions that bind to slot 1 still work. size_t maxSlot = 0; for (size_t i = 0; i < d.numAttributes; ++i) { if (d.attributes[i].bufferIndex > maxSlot) { maxSlot = d.attributes[i].bufferIndex; } } // Helper to compute a minimal stride per slot from attributes (max end offset among attrs // in that slot) auto computeStrideForSlot = [&](size_t slot) -> uint32_t { size_t maxEnd = 0; for (size_t i = 0; i < d.numAttributes; ++i) { const auto& a = d.attributes[i]; if (a.bufferIndex != slot) continue; size_t compSize = 0; switch (a.format) { case VertexAttributeFormat::Float1: compSize = 4; break; case VertexAttributeFormat::Float2: compSize = 8; break; case VertexAttributeFormat::Float3: compSize = 12; break; case VertexAttributeFormat::Float4: compSize = 16; break; case VertexAttributeFormat::Byte1: compSize = 1; break; case VertexAttributeFormat::Byte2: compSize = 2; break; case VertexAttributeFormat::Byte4: compSize = 4; break; case VertexAttributeFormat::UByte4Norm: compSize = 4; break; default: compSize = 0; break; } maxEnd = std::max(maxEnd, a.offset + compSize); } // Fallback to slot0 stride if present if (maxEnd == 0 && d.numInputBindings > 0) { return static_cast(d.inputBindings[0].stride); } return static_cast(maxEnd); }; for (size_t s = 0; s <= maxSlot && s < IGL_BUFFER_BINDINGS_MAX; ++s) { if (vertexStrides_[s] == 0) { vertexStrides_[s] = computeStrideForSlot(s); } } if (vertexStride_ == 0) { vertexStride_ = vertexStrides_[0]; } } } } } std::shared_ptr RenderPipelineState::renderPipelineReflection() { if (reflection_) { return reflection_; } struct ReflectionImpl final : public IRenderPipelineReflection { std::vector ubs; std::vector samplers; std::vector textures; const std::vector& allUniformBuffers() const override { return ubs; } const std::vector& allSamplers() const override { return samplers; } const std::vector& allTextures() const override { return textures; } }; auto out = std::make_shared(); auto reflectShader = [&](const std::shared_ptr& mod, ShaderStage stage) { if (!mod) return; auto* d3dMod = dynamic_cast(mod.get()); if (!d3dMod) return; const auto& bc = d3dMod->getBytecode(); if (bc.empty()) return; igl::d3d12::ComPtr refl; if (FAILED(D3DReflect(bc.data(), bc.size(), IID_PPV_ARGS(refl.GetAddressOf())))) return; D3D12_SHADER_DESC sd{}; if (FAILED(refl->GetDesc(&sd))) return; // Constant buffers for (UINT i = 0; i < sd.ConstantBuffers; ++i) { auto* cb = refl->GetConstantBufferByIndex(i); D3D12_SHADER_BUFFER_DESC cbd{}; if (FAILED(cb->GetDesc(&cbd))) continue; int bufferIndex = -1; for (UINT r = 0; r < sd.BoundResources; ++r) { D3D12_SHADER_INPUT_BIND_DESC bind{}; if (SUCCEEDED(refl->GetResourceBindingDesc(r, &bind))) { if (bind.Type == D3D_SIT_CBUFFER && std::string(bind.Name) == std::string(cbd.Name)) { bufferIndex = static_cast(bind.BindPoint); break; } } } BufferArgDesc ub; ub.name = igl::genNameHandle(cbd.Name ? cbd.Name : ""); ub.bufferAlignment = 256; ub.bufferDataSize = cbd.Size; ub.bufferIndex = bufferIndex; ub.shaderStage = stage; ub.isUniformBlock = true; for (UINT v = 0; v < cbd.Variables; ++v) { auto* var = cb->GetVariableByIndex(v); D3D12_SHADER_VARIABLE_DESC vd{}; if (FAILED(var->GetDesc(&vd))) continue; auto* t = var->GetType(); if (!t) continue; D3D12_SHADER_TYPE_DESC td{}; if (FAILED(t->GetDesc(&td))) continue; BufferArgDesc::BufferMemberDesc m; m.name = igl::genNameHandle(vd.Name ? vd.Name : ""); m.type = ReflectionUtils::mapUniformType(td); m.offset = vd.StartOffset; m.arrayLength = td.Elements ? td.Elements : 1; ub.members.push_back(std::move(m)); } out->ubs.push_back(std::move(ub)); } // Textures and samplers for (UINT r = 0; r < sd.BoundResources; ++r) { D3D12_SHADER_INPUT_BIND_DESC bind{}; if (FAILED(refl->GetResourceBindingDesc(r, &bind))) continue; if (bind.Type == D3D_SIT_TEXTURE) { TextureArgDesc t; t.name = bind.Name ? bind.Name : ""; t.type = TextureType::TwoD; t.textureIndex = bind.BindPoint; t.shaderStage = stage; out->textures.push_back(std::move(t)); } else if (bind.Type == D3D_SIT_SAMPLER) { SamplerArgDesc s; s.name = bind.Name ? bind.Name : ""; s.samplerIndex = bind.BindPoint; s.shaderStage = stage; out->samplers.push_back(std::move(s)); } } }; if (auto stages = getRenderPipelineDesc().shaderStages) { reflectShader(stages->getVertexModule(), ShaderStage::Vertex); reflectShader(stages->getFragmentModule(), ShaderStage::Fragment); } reflection_ = out; return reflection_; } void RenderPipelineState::setRenderPipelineReflection( const IRenderPipelineReflection& /*renderPipelineReflection*/) {} int RenderPipelineState::getIndexByName(const igl::NameHandle& /*name*/, ShaderStage /*stage*/) const { return -1; } int RenderPipelineState::getIndexByName(const std::string& /*name*/, ShaderStage /*stage*/) const { return -1; } ID3D12PipelineState* RenderPipelineState::getPipelineState( const D3D12RenderPipelineDynamicState& dynamicState, Device& device) const { // Fast path: Check if dynamic state matches base PSO // This happens when pipeline was created with same formats as framebuffer const auto& desc = getRenderPipelineDesc(); bool matchesBasePSO = true; // Check render target formats const UINT numRTs = static_cast(std::min(desc.targetDesc.colorAttachments.size(), D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT)); for (UINT i = 0; i < numRTs; ++i) { if (dynamicState.rtvFormats[i] != textureFormatToDXGIFormat(desc.targetDesc.colorAttachments[i].textureFormat)) { matchesBasePSO = false; break; } } // Check depth-stencil format if (matchesBasePSO) { const DXGI_FORMAT baseDSVFormat = (desc.targetDesc.depthAttachmentFormat != TextureFormat::Invalid) ? textureFormatToDXGIFormat(desc.targetDesc.depthAttachmentFormat) : DXGI_FORMAT_UNKNOWN; if (dynamicState.dsvFormat != baseDSVFormat) { matchesBasePSO = false; } } // Return base PSO if formats match if (matchesBasePSO) { return pipelineState_.Get(); } // Check variant cache auto it = psoVariants_.find(dynamicState); if (it != psoVariants_.end()) { return it->second.Get(); } // Create PSO variant with substituted formats (Vulkan-style on-demand creation) IGL_LOG_INFO("Creating PSO variant: RTV[0]=%d (base) -> %d (framebuffer)\n", textureFormatToDXGIFormat(desc.targetDesc.colorAttachments[0].textureFormat), dynamicState.rtvFormats[0]); // Following Vulkan's approach: create modified RenderPipelineDesc with substituted formats // Create a modified descriptor with framebuffer formats substituted RenderPipelineDesc variantDesc = desc; // Copy all state // Substitute RT formats from actual framebuffer for (UINT i = 0; i < numRTs; ++i) { if (dynamicState.rtvFormats[i] != DXGI_FORMAT_UNKNOWN) { // Convert DXGI format back to IGL TextureFormat variantDesc.targetDesc.colorAttachments[i].textureFormat = dxgiFormatToTextureFormat(dynamicState.rtvFormats[i]); IGL_LOG_INFO(" RTV[%u]: substituted format %d\n", i, dynamicState.rtvFormats[i]); } } // Substitute DSV format if present if (dynamicState.dsvFormat != DXGI_FORMAT_UNKNOWN) { variantDesc.targetDesc.depthAttachmentFormat = dxgiFormatToTextureFormat(dynamicState.dsvFormat); } // Call Device::createPipelineStateVariant() to create PSO with modified formats Result variantResult; auto variantPSO = device.createPipelineStateVariant(variantDesc, rootSignature_.Get(), &variantResult); if (!variantPSO.Get()) { IGL_LOG_ERROR("PSO variant creation failed: %s\n", variantResult.message.c_str()); IGL_LOG_ERROR("Falling back to base PSO (this will cause D3D12 validation errors!)\n"); return pipelineState_.Get(); // Fallback to base PSO } // Cache the variant for future use psoVariants_[dynamicState] = variantPSO; IGL_LOG_INFO("PSO variant created and cached successfully: PSO=%p\n", variantPSO.Get()); return variantPSO.Get(); } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/RenderPipelineState.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::d3d12 { class Device; // Forward declaration /** * @brief Encapsulates dynamic render state that affects PSO selection * * Following Vulkan's RenderPipelineDynamicState pattern, this structure serves as a hash key * for PSO variant caching. D3D12 PSOs are immutable and must match the exact render target * formats at draw time. * * Key differences from Vulkan: * - Vulkan: renderPassIndex_ encodes all render pass compatibility (formats + load/store ops) * - D3D12: We only need render target formats (no render pass object exists) * * The structure is designed for efficient hashing and comparison: * - Packed into fixed-size array for fast memcmp * - Zero-initialized padding for consistent hashing */ struct D3D12RenderPipelineDynamicState { // Render target formats (up to 8 MRT targets) std::array rtvFormats; // Depth-stencil format DXGI_FORMAT dsvFormat; D3D12RenderPipelineDynamicState() { rtvFormats.fill(DXGI_FORMAT_UNKNOWN); dsvFormat = DXGI_FORMAT_UNKNOWN; } bool operator==(const D3D12RenderPipelineDynamicState& other) const { return rtvFormats == other.rtvFormats && dsvFormat == other.dsvFormat; } struct HashFunction { size_t operator()(const D3D12RenderPipelineDynamicState& s) const { size_t hash = 0; for (const auto& fmt : s.rtvFormats) { hash ^= std::hash{}(fmt) + 0x9e3779b9 + (hash << 6) + (hash >> 2); } hash ^= std::hash{}(s.dsvFormat) + 0x9e3779b9 + (hash << 6) + (hash >> 2); return hash; } }; }; class RenderPipelineState final : public IRenderPipelineState { public: RenderPipelineState(const RenderPipelineDesc& desc, igl::d3d12::ComPtr pipelineState, igl::d3d12::ComPtr rootSignature); ~RenderPipelineState() override = default; std::shared_ptr renderPipelineReflection() override; void setRenderPipelineReflection( const IRenderPipelineReflection& renderPipelineReflection) override; int getIndexByName(const igl::NameHandle& name, ShaderStage stage) const override; int getIndexByName(const std::string& name, ShaderStage stage) const override; // D3D12-specific accessors ID3D12PipelineState* getPipelineState() const { return pipelineState_.Get(); } /** * @brief Get PSO variant for specific render target formats (Vulkan-style dynamic PSO selection) * * This method follows Vulkan's getVkPipeline(dynamicState) pattern to create PSO variants * on-demand based on actual framebuffer formats. D3D12 PSOs are immutable and must exactly * match render target formats at creation time. * * @param dynamicState Contains actual framebuffer RTVformats and DSV format at draw time * @param device IGL D3D12 device for PSO creation * @return PSO variant matching the requested formats, or nullptr on error */ ID3D12PipelineState* getPipelineState(const D3D12RenderPipelineDynamicState& dynamicState, Device& device) const; ID3D12RootSignature* getRootSignature() const { return rootSignature_.Get(); } uint32_t getVertexStride() const { return vertexStride_; } uint32_t getVertexStride(size_t slot) const { return (slot < IGL_BUFFER_BINDINGS_MAX) ? vertexStrides_[slot] : 0; } D3D_PRIMITIVE_TOPOLOGY getPrimitiveTopology() const { return primitiveTopology_; } // Query push constant binding info from shader reflection bool hasPushConstants() const { return shaderReflection_.hasPushConstants; } UINT getPushConstantSlot() const { return shaderReflection_.pushConstantSlot; } UINT getPushConstantRootParameterIndex() const { return shaderReflection_.pushConstantRootParamIndex; } // Query root parameter layout (dynamic based on shader reflection) UINT getCBVTableRootParameterIndex() const { return rootParamLayout_.cbvTableIndex; } UINT getSRVTableRootParameterIndex() const { return rootParamLayout_.srvTableIndex; } UINT getSamplerTableRootParameterIndex() const { return rootParamLayout_.samplerTableIndex; } UINT getUAVTableRootParameterIndex() const { return rootParamLayout_.uavTableIndex; } // Query descriptor range sizes (how many descriptors the root signature expects) UINT getCBVDescriptorCount() const { return rootParamLayout_.cbvDescriptorCount; } UINT getSRVDescriptorCount() const { return rootParamLayout_.srvDescriptorCount; } UINT getSamplerDescriptorCount() const { return rootParamLayout_.samplerDescriptorCount; } UINT getUAVDescriptorCount() const { return rootParamLayout_.uavDescriptorCount; } private: friend class Device; // Device needs access to create PSO variants // Base PSO created from RenderPipelineDesc (may not match actual framebuffer formats) igl::d3d12::ComPtr pipelineState_; igl::d3d12::ComPtr rootSignature_; std::shared_ptr reflection_; uint32_t vertexStride_ = 0; uint32_t vertexStrides_[IGL_BUFFER_BINDINGS_MAX] = {}; D3D_PRIMITIVE_TOPOLOGY primitiveTopology_ = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST; // PSO variant cache following Vulkan's pattern // Maps framebuffer formats → PSO variant mutable std::unordered_map, D3D12RenderPipelineDynamicState::HashFunction> psoVariants_; // Shader reflection info for dynamic resource binding // Stores merged reflection data from vertex + fragment shaders struct { bool hasPushConstants = false; UINT pushConstantSlot = UINT_MAX; UINT pushConstantSize = 0; UINT pushConstantRootParamIndex = 0; // Root parameter index for push constants in root signature } shaderReflection_; // Root parameter layout (dynamically computed from shader reflection) // These indices tell encoders which root parameter to use for each resource type // Pure reflection-based approach - no hardcoded assumptions struct { UINT cbvTableIndex = UINT_MAX; // CBV descriptor table UINT srvTableIndex = UINT_MAX; // SRV descriptor table UINT samplerTableIndex = UINT_MAX; // Sampler descriptor table UINT uavTableIndex = UINT_MAX; // UAV descriptor table // Descriptor range sizes (from root signature, 0 to maxSlot inclusive) // These define how many descriptors the root signature expects in each table // ResourcesBinder must allocate exactly these counts to match the root signature UINT cbvDescriptorCount = 0; // Number of CBV descriptors (0 to maxCBVSlot) UINT srvDescriptorCount = 0; // Number of SRV descriptors (0 to maxSRVSlot) UINT samplerDescriptorCount = 0; // Number of sampler descriptors (0 to maxSamplerSlot) UINT uavDescriptorCount = 0; // Number of UAV descriptors (0 to maxUAVSlot) } rootParamLayout_; }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/SamplerState.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace igl::d3d12 { size_t SamplerState::hash() const noexcept { size_t h = 0; // Hash all D3D12_SAMPLER_DESC fields using the same technique as Device.cpp // Magic constant 0x9e3779b9 is the golden ratio used for hash mixing h ^= std::hash{}(static_cast(desc_.Filter)) + 0x9e3779b9 + (h << 6) + (h >> 2); h ^= std::hash{}(static_cast(desc_.AddressU)) + 0x9e3779b9 + (h << 6) + (h >> 2); h ^= std::hash{}(static_cast(desc_.AddressV)) + 0x9e3779b9 + (h << 6) + (h >> 2); h ^= std::hash{}(static_cast(desc_.AddressW)) + 0x9e3779b9 + (h << 6) + (h >> 2); h ^= std::hash{}(desc_.MipLODBias) + 0x9e3779b9 + (h << 6) + (h >> 2); h ^= std::hash{}(desc_.MaxAnisotropy) + 0x9e3779b9 + (h << 6) + (h >> 2); h ^= std::hash{}(static_cast(desc_.ComparisonFunc)) + 0x9e3779b9 + (h << 6) + (h >> 2); // Hash border color array h ^= std::hash{}(desc_.BorderColor[0]) + 0x9e3779b9 + (h << 6) + (h >> 2); h ^= std::hash{}(desc_.BorderColor[1]) + 0x9e3779b9 + (h << 6) + (h >> 2); h ^= std::hash{}(desc_.BorderColor[2]) + 0x9e3779b9 + (h << 6) + (h >> 2); h ^= std::hash{}(desc_.BorderColor[3]) + 0x9e3779b9 + (h << 6) + (h >> 2); h ^= std::hash{}(desc_.MinLOD) + 0x9e3779b9 + (h << 6) + (h >> 2); h ^= std::hash{}(desc_.MaxLOD) + 0x9e3779b9 + (h << 6) + (h >> 2); return h; } bool SamplerState::operator==(const SamplerState& rhs) const noexcept { // Compare all D3D12_SAMPLER_DESC fields return desc_.Filter == rhs.desc_.Filter && desc_.AddressU == rhs.desc_.AddressU && desc_.AddressV == rhs.desc_.AddressV && desc_.AddressW == rhs.desc_.AddressW && desc_.MipLODBias == rhs.desc_.MipLODBias && desc_.MaxAnisotropy == rhs.desc_.MaxAnisotropy && desc_.ComparisonFunc == rhs.desc_.ComparisonFunc && desc_.BorderColor[0] == rhs.desc_.BorderColor[0] && desc_.BorderColor[1] == rhs.desc_.BorderColor[1] && desc_.BorderColor[2] == rhs.desc_.BorderColor[2] && desc_.BorderColor[3] == rhs.desc_.BorderColor[3] && desc_.MinLOD == rhs.desc_.MinLOD && desc_.MaxLOD == rhs.desc_.MaxLOD; } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/SamplerState.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::d3d12 { class SamplerState final : public ISamplerState { public: explicit SamplerState(const D3D12_SAMPLER_DESC& desc) : desc_(desc) {} ~SamplerState() override = default; bool isYUV() const noexcept override { return false; } const D3D12_SAMPLER_DESC& getDesc() const { return desc_; } /// Computes hash value based on D3D12_SAMPLER_DESC fields size_t hash() const noexcept; /// Compares two SamplerState objects for equality bool operator==(const SamplerState& rhs) const noexcept; private: D3D12_SAMPLER_DESC desc_; }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/ShaderModule.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace igl::d3d12 { void ShaderModule::setReflection(igl::d3d12::ComPtr reflection) { reflection_ = reflection; if (reflection_.Get()) { extractShaderMetadata(); } } void ShaderModule::extractShaderMetadata() { if (!reflection_.Get()) { IGL_LOG_ERROR("ShaderModule::extractShaderMetadata: reflection_ is NULL!\n"); return; } D3D12_SHADER_DESC shaderDesc = {}; HRESULT hr = reflection_->GetDesc(&shaderDesc); if (FAILED(hr)) { IGL_LOG_ERROR("ShaderModule::extractShaderMetadata: Failed to get shader desc: 0x%08X\n", hr); return; } IGL_D3D12_LOG_VERBOSE( "ShaderModule: Reflection extracted - %u constant buffers, %u bound resources, %u input " "params, %u output params\n", shaderDesc.ConstantBuffers, shaderDesc.BoundResources, shaderDesc.InputParameters, shaderDesc.OutputParameters); // Reset reflection info reflectionInfo_ = ShaderReflectionInfo{}; // Extract resource bindings (textures, buffers, samplers, UAVs) resourceBindings_.clear(); for (UINT i = 0; i < shaderDesc.BoundResources; i++) { D3D12_SHADER_INPUT_BIND_DESC bindDesc = {}; hr = reflection_->GetResourceBindingDesc(i, &bindDesc); if (FAILED(hr)) { IGL_LOG_ERROR( "ShaderModule::extractShaderMetadata: Failed to get resource binding %u: 0x%08X\n", i, hr); continue; } ResourceBinding binding; binding.name = bindDesc.Name; binding.type = bindDesc.Type; binding.bindPoint = bindDesc.BindPoint; binding.bindCount = bindDesc.BindCount; binding.space = bindDesc.Space; resourceBindings_.push_back(binding); // Populate reflection info for root signature selection if (bindDesc.Type == D3D_SIT_CBUFFER) { reflectionInfo_.usedCBVSlots.push_back(bindDesc.BindPoint); reflectionInfo_.maxCBVSlot = std::max(reflectionInfo_.maxCBVSlot, bindDesc.BindPoint); IGL_LOG_INFO(" Found CBV: '%s' at b%u\n", bindDesc.Name, bindDesc.BindPoint); } else if (bindDesc.Type == D3D_SIT_TEXTURE || bindDesc.Type == D3D_SIT_STRUCTURED || bindDesc.Type == D3D_SIT_BYTEADDRESS) { reflectionInfo_.usedSRVSlots.push_back(bindDesc.BindPoint); reflectionInfo_.maxSRVSlot = std::max(reflectionInfo_.maxSRVSlot, bindDesc.BindPoint); IGL_LOG_INFO(" Found SRV: '%s' at t%u\n", bindDesc.Name, bindDesc.BindPoint); } else if (bindDesc.Type == D3D_SIT_UAV_RWTYPED || bindDesc.Type == D3D_SIT_UAV_RWSTRUCTURED || bindDesc.Type == D3D_SIT_UAV_RWBYTEADDRESS || bindDesc.Type == D3D_SIT_UAV_APPEND_STRUCTURED || bindDesc.Type == D3D_SIT_UAV_CONSUME_STRUCTURED || bindDesc.Type == D3D_SIT_UAV_RWSTRUCTURED_WITH_COUNTER) { reflectionInfo_.usedUAVSlots.push_back(bindDesc.BindPoint); reflectionInfo_.maxUAVSlot = std::max(reflectionInfo_.maxUAVSlot, bindDesc.BindPoint); IGL_LOG_INFO(" Found UAV: '%s' at u%u\n", bindDesc.Name, bindDesc.BindPoint); } else if (bindDesc.Type == D3D_SIT_SAMPLER) { reflectionInfo_.usedSamplerSlots.push_back(bindDesc.BindPoint); reflectionInfo_.maxSamplerSlot = std::max(reflectionInfo_.maxSamplerSlot, bindDesc.BindPoint); IGL_LOG_INFO(" Found Sampler: '%s' at s%u\n", bindDesc.Name, bindDesc.BindPoint); } const char* typeStr = "Unknown"; switch (bindDesc.Type) { case D3D_SIT_CBUFFER: typeStr = "CBV (Constant Buffer)"; break; case D3D_SIT_TBUFFER: typeStr = "TBuffer"; break; case D3D_SIT_TEXTURE: typeStr = "SRV (Texture)"; break; case D3D_SIT_SAMPLER: typeStr = "Sampler"; break; case D3D_SIT_UAV_RWTYPED: typeStr = "UAV (RW Typed)"; break; case D3D_SIT_STRUCTURED: typeStr = "SRV (StructuredBuffer)"; break; case D3D_SIT_UAV_RWSTRUCTURED: typeStr = "UAV (RWStructuredBuffer)"; break; case D3D_SIT_BYTEADDRESS: typeStr = "SRV (ByteAddressBuffer)"; break; case D3D_SIT_UAV_RWBYTEADDRESS: typeStr = "UAV (RWByteAddressBuffer)"; break; case D3D_SIT_UAV_APPEND_STRUCTURED: typeStr = "UAV (AppendStructuredBuffer)"; break; case D3D_SIT_UAV_CONSUME_STRUCTURED: typeStr = "UAV (ConsumeStructuredBuffer)"; break; case D3D_SIT_UAV_RWSTRUCTURED_WITH_COUNTER: typeStr = "UAV (RWStructuredBuffer with counter)"; break; default: break; } IGL_LOG_DEBUG( " Resource [%u]: '%s' | Type: %s | Slot: t%u/b%u/s%u/u%u | Space: %u | Count: %u\n", i, bindDesc.Name, typeStr, bindDesc.Type == D3D_SIT_TEXTURE ? bindDesc.BindPoint : 0, bindDesc.Type == D3D_SIT_CBUFFER ? bindDesc.BindPoint : 0, bindDesc.Type == D3D_SIT_SAMPLER ? bindDesc.BindPoint : 0, (bindDesc.Type == D3D_SIT_UAV_RWTYPED || bindDesc.Type == D3D_SIT_UAV_RWSTRUCTURED) ? bindDesc.BindPoint : 0, bindDesc.Space, bindDesc.BindCount); } // Extract constant buffer information constantBuffers_.clear(); for (UINT i = 0; i < shaderDesc.ConstantBuffers; i++) { ID3D12ShaderReflectionConstantBuffer* cb = reflection_->GetConstantBufferByIndex(i); if (!cb) { IGL_LOG_ERROR("ShaderModule::extractShaderMetadata: Failed to get constant buffer %u\n", i); continue; } D3D12_SHADER_BUFFER_DESC bufferDesc = {}; hr = cb->GetDesc(&bufferDesc); if (FAILED(hr)) { IGL_LOG_ERROR( "ShaderModule::extractShaderMetadata: Failed to get CB desc %u: 0x%08X\n", i, hr); continue; } ConstantBufferInfo cbInfo; cbInfo.name = bufferDesc.Name; cbInfo.size = bufferDesc.Size; cbInfo.numVariables = bufferDesc.Variables; constantBuffers_.push_back(cbInfo); IGL_LOG_DEBUG(" Constant Buffer [%u]: '%s' | Size: %u bytes | Variables: %u\n", i, bufferDesc.Name, bufferDesc.Size, bufferDesc.Variables); // Optionally log variable details for debugging for (UINT v = 0; v < bufferDesc.Variables; v++) { ID3D12ShaderReflectionVariable* var = cb->GetVariableByIndex(v); if (var) { D3D12_SHADER_VARIABLE_DESC varDesc = {}; if (SUCCEEDED(var->GetDesc(&varDesc))) { IGL_LOG_DEBUG(" Variable [%u]: '%s' | Offset: %u | Size: %u bytes\n", v, varDesc.Name, varDesc.StartOffset, varDesc.Size); } } } } // Detect push constants by name convention: cbuffer must be named "PushConstants" // This allows distinguishing between push constants (used with bindBytes) and regular // small uniform buffers (used with bindBuffer), since both may be small (≤64 bytes). for (const auto& binding : resourceBindings_) { if (binding.type == D3D_SIT_CBUFFER) { // Find the corresponding constant buffer info to get size and name for (const auto& cbInfo : constantBuffers_) { if (cbInfo.name == binding.name) { // Check if this is push constants by name (must contain "PushConstant") if (cbInfo.name.find("PushConstant") != std::string::npos && cbInfo.size <= 64) { reflectionInfo_.hasPushConstants = true; reflectionInfo_.pushConstantSlot = binding.bindPoint; reflectionInfo_.pushConstantSize = (cbInfo.size + 3) / 4; // Convert bytes to DWORDs IGL_D3D12_LOG_VERBOSE(" Detected push constants: '%s' at b%u (%u DWORDs / %u bytes)\n", cbInfo.name.c_str(), binding.bindPoint, reflectionInfo_.pushConstantSize, cbInfo.size); } break; } } } } } bool ShaderModule::hasResource(const std::string& name) const { for (const auto& binding : resourceBindings_) { if (binding.name == name) { return true; } } return false; } UINT ShaderModule::getResourceBindPoint(const std::string& name) const { for (const auto& binding : resourceBindings_) { if (binding.name == name) { return binding.bindPoint; } } return UINT_MAX; // Not found } size_t ShaderModule::getConstantBufferSize(const std::string& name) const { for (const auto& cb : constantBuffers_) { if (cb.name == name) { return cb.size; } } return 0; // Not found } bool ShaderModule::validateBytecode() const { // Check minimum size for signature if (bytecode_.size() < 4) { IGL_LOG_ERROR("Shader bytecode too small (< 4 bytes): %zu bytes\n", bytecode_.size()); return false; } const char* signature = reinterpret_cast(bytecode_.data()); // Valid signatures: "DXBC" (legacy D3D11/D3D12) or "DXIL" (modern D3D12) if (std::memcmp(signature, "DXBC", 4) == 0) { IGL_LOG_DEBUG("Shader bytecode validated: DXBC format (%zu bytes)\n", bytecode_.size()); return true; // Valid DXBC shader } if (std::memcmp(signature, "DXIL", 4) == 0) { IGL_LOG_DEBUG("Shader bytecode validated: DXIL format (%zu bytes)\n", bytecode_.size()); return true; // Valid DXIL shader } // Log the invalid signature for debugging IGL_LOG_ERROR( "Invalid shader bytecode signature: 0x%02X%02X%02X%02X (expected 'DXBC' or 'DXIL')\n", static_cast(signature[0]), static_cast(signature[1]), static_cast(signature[2]), static_cast(signature[3])); return false; } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/ShaderModule.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include namespace igl::d3d12 { class ShaderModule final : public IShaderModule { public: // Resource binding information extracted from shader reflection struct ResourceBinding { std::string name; D3D_SHADER_INPUT_TYPE type; // CBV, SRV, UAV, Sampler UINT bindPoint; UINT bindCount; UINT space; }; // Constant buffer information from reflection struct ConstantBufferInfo { std::string name; UINT size; UINT numVariables; }; // Shader resource usage summary for root signature selection struct ShaderReflectionInfo { // Push constants (inline root constants) bool hasPushConstants = false; UINT pushConstantSlot = UINT_MAX; // Which b# register UINT pushConstantSize = 0; // Size in 32-bit values // Resource slot usage (for conflict detection) std::vector usedCBVSlots; // Constant buffer slots (b#) std::vector usedSRVSlots; // Shader resource view slots (t#) std::vector usedUAVSlots; // Unordered access view slots (u#) std::vector usedSamplerSlots; // Sampler slots (s#) // Maximum slot indices used (for root signature sizing) UINT maxCBVSlot = 0; UINT maxSRVSlot = 0; UINT maxUAVSlot = 0; UINT maxSamplerSlot = 0; }; ShaderModule(ShaderModuleInfo info, std::vector bytecode) : IShaderModule(info), bytecode_(std::move(bytecode)) { if (!validateBytecode()) { IGL_LOG_ERROR("ShaderModule: Created with invalid bytecode (validation failed)\n"); } } ~ShaderModule() override = default; const std::vector& getBytecode() const { return bytecode_; } // Shader reflection API void setReflection(igl::d3d12::ComPtr reflection); const std::vector& getResourceBindings() const { return resourceBindings_; } const std::vector& getConstantBuffers() const { return constantBuffers_; } const ShaderReflectionInfo& getReflectionInfo() const { return reflectionInfo_; } bool hasResource(const std::string& name) const; UINT getResourceBindPoint(const std::string& name) const; size_t getConstantBufferSize(const std::string& name) const; // Bytecode validation bool validateBytecode() const; private: std::vector bytecode_; // DXIL bytecode igl::d3d12::ComPtr reflection_; std::vector resourceBindings_; std::vector constantBuffers_; ShaderReflectionInfo reflectionInfo_; void extractShaderMetadata(); }; class ShaderStages final : public IShaderStages { public: ShaderStages(ShaderStagesDesc desc) : IShaderStages(desc) {} ~ShaderStages() override = default; }; class ShaderLibrary final : public IShaderLibrary { public: explicit ShaderLibrary(std::vector> modules) : IShaderLibrary(std::move(modules)) {} ~ShaderLibrary() override = default; }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/Texture.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include // No channel swap needed: DXGI_FORMAT_R8G8B8A8_UNORM matches IGL TextureFormat::RGBA_UNorm8 byte // order. namespace igl::d3d12 { namespace { // Import ComPtr for readability template using ComPtr = igl::d3d12::ComPtr; } // namespace std::shared_ptr Texture::createFromResource(ID3D12Resource* resource, TextureFormat format, const TextureDesc& desc, ID3D12Device* device, ID3D12CommandQueue* queue, D3D12_RESOURCE_STATES initialState, Device* iglDevice) { if (!resource) { IGL_LOG_ERROR("Texture::createFromResource - resource is NULL!\n"); return nullptr; } auto texture = std::make_shared(format); // Attach the resource to ComPtr (takes ownership, AddRefs) resource->AddRef(); texture->resource_.Attach(resource); texture->device_ = device; texture->queue_ = queue; texture->iglDevice_ = iglDevice; // Store igl Device for upload-related operations. texture->format_ = format; texture->dimensions_ = Dimensions{desc.width, desc.height, desc.depth}; texture->type_ = desc.type; texture->numLayers_ = desc.numLayers; texture->numMipLevels_ = desc.numMipLevels; texture->samples_ = desc.numSamples; texture->usage_ = desc.usage; texture->initializeStateTracking(initialState); IGL_D3D12_LOG_VERBOSE("Texture::createFromResource - SUCCESS: %dx%d format=%d\n", desc.width, desc.height, (int)format); return texture; } std::shared_ptr Texture::createTextureView(std::shared_ptr parent, const TextureViewDesc& desc) { if (!parent) { IGL_LOG_ERROR("Texture::createTextureView - parent is NULL!\n"); return nullptr; } // Determine the format to use for the view TextureFormat viewFormat = (desc.format != TextureFormat::Invalid) ? desc.format : parent->format_; auto view = std::make_shared(viewFormat); // Share the D3D12 resource (don't create new one) // ComPtr doesn't have copy assignment, so we need to use Attach() and AddRef() auto* parentResource = parent->resource_.Get(); if (parentResource) { parentResource->AddRef(); view->resource_.Attach(parentResource); } view->isView_ = true; view->parentTexture_ = parent; // Defensive check: parent and view must share the same underlying D3D12 resource IGL_DEBUG_ASSERT(parent->resource_.Get() == view->resource_.Get(), "Parent and view must share the same D3D12 resource"); // Store view parameters (cumulative offsets for nested views) view->mipLevelOffset_ = parent->mipLevelOffset_ + desc.mipLevel; view->numMipLevelsInView_ = desc.numMipLevels; // CRITICAL FIX: D3D12 SRV descriptors require MipLevels >= 1 // If numMipLevels is 0 (uninitialized), default to 1 to prevent invalid SRV creation if (view->numMipLevelsInView_ == 0) { IGL_LOG_ERROR( "Texture::createTextureView - numMipLevels is 0, defaulting to 1 (SRV requires MipLevels " ">= 1)\n"); view->numMipLevelsInView_ = 1; } // Validate mip level bounds to prevent out-of-range access const uint32_t parentMipCount = parent->getNumMipLevels(); const uint32_t requestedMipEnd = desc.mipLevel + view->numMipLevelsInView_; if (requestedMipEnd > parentMipCount) { IGL_LOG_ERROR( "Texture::createTextureView - mip range [%u, %u) exceeds parent mip count %u, clamping\n", desc.mipLevel, requestedMipEnd, parentMipCount); // Clamp to valid range view->numMipLevelsInView_ = (parentMipCount > desc.mipLevel) ? (parentMipCount - desc.mipLevel) : 1; } view->arraySliceOffset_ = parent->arraySliceOffset_ + desc.layer; view->numArraySlicesInView_ = desc.numLayers; // Copy properties from parent view->device_ = parent->device_; view->queue_ = parent->queue_; view->iglDevice_ = parent->iglDevice_; // Propagate igl Device pointer. view->format_ = viewFormat; view->type_ = desc.type; view->usage_ = parent->usage_; view->samples_ = parent->samples_; // Calculate view dimensions based on mip level const uint32_t mipDivisor = 1u << desc.mipLevel; view->dimensions_ = Dimensions{std::max(1u, parent->dimensions_.width >> desc.mipLevel), std::max(1u, parent->dimensions_.height >> desc.mipLevel), std::max(1u, parent->dimensions_.depth >> desc.mipLevel)}; view->numLayers_ = desc.numLayers; // Use the validated numMipLevelsInView_ value (which has been corrected if it was 0) view->numMipLevels_ = view->numMipLevelsInView_; // Views delegate state tracking to the root texture and do not maintain separate state. // State is accessed via getStateOwner(), which walks to the root for views. // Views share the same D3D12 resource and subresourceStates_ tracking with their root. IGL_D3D12_LOG_VERBOSE( "Texture::createTextureView - SUCCESS: view of %dx%d, mips %u-%u, layers %u-%u\n", view->dimensions_.width, view->dimensions_.height, desc.mipLevel, desc.mipLevel + desc.numMipLevels - 1, desc.layer, desc.layer + desc.numLayers - 1); return view; } Texture::~Texture() { // Texture views share the parent's resource, so they don't own descriptors. // Only free descriptors for non-view textures. if (isView_) { return; } // Get descriptor heap manager from device. // Note: in the current architecture, descriptors are allocated/freed by RenderCommandEncoder, // not stored in Texture. This destructor is defensive in case descriptors become per-texture // later. if (!iglDevice_) { return; } // For now, descriptors are managed by RenderCommandEncoder and freed when the encoder is // destroyed. The rtvIndices_, dsvIndices_, and srvIndex_ members are currently unused but // reserved for future use. } Result Texture::upload(const TextureRangeDesc& range, const void* data, size_t bytesPerRow) const { IGL_D3D12_LOG_VERBOSE("Texture::upload() - START: %dx%d\n", range.width, range.height); if (!device_ || !queue_ || !resource_.Get()) { IGL_LOG_ERROR("Texture::upload() - FAILED: device, queue, or resource not available\n"); return Result(Result::Code::RuntimeError, "Device, queue, or resource not available for upload"); } if (!data) { IGL_LOG_ERROR("Texture::upload() - FAILED: data is null\n"); return Result(Result::Code::ArgumentInvalid, "Upload data is null"); } IGL_D3D12_LOG_VERBOSE("Texture::upload() - Proceeding with upload\n"); // Calculate dimensions and data size const uint32_t width = range.width > 0 ? range.width : dimensions_.width; const uint32_t height = range.height > 0 ? range.height : dimensions_.height; const uint32_t depth = range.depth > 0 ? range.depth : dimensions_.depth; const auto props = TextureFormatProperties::fromTextureFormat(format_); const bool isBC7 = (format_ == TextureFormat::RGBA_BC7_UNORM_4x4 || format_ == TextureFormat::RGBA_BC7_SRGB_4x4); // Calculate bytes per row if not provided. For block-compressed formats // like BC7, rows are expressed in blocks, not texels, so use the number // of blocks in X multiplied by bytesPerBlock. if (bytesPerRow == 0) { if (isBC7) { const uint32_t blocksX = (width + 3u) / 4u; bytesPerRow = static_cast(blocksX) * props.bytesPerBlock; } else { const size_t bpp = std::max(props.bytesPerBlock, 1); bytesPerRow = static_cast(width) * bpp; } } // Get the resource description to calculate required size D3D12_RESOURCE_DESC resourceDesc = resource_->GetDesc(); // Determine how many layers/faces and mip levels we need to upload const uint32_t numSlicesToUpload = (type_ == TextureType::Cube) ? range.numFaces : range.numLayers; const uint32_t baseSlice = (type_ == TextureType::Cube) ? range.face : range.layer; const uint32_t numMipsToUpload = range.numMipLevels; const uint32_t baseMip = range.mipLevel; IGL_D3D12_LOG_VERBOSE( "Texture::upload - type=%d, baseSlice=%u, numSlicesToUpload=%u, baseMip=%u, " "numMipsToUpload=%u\n", (int)type_, baseSlice, numSlicesToUpload, baseMip, numMipsToUpload); // Calculate total staging buffer size for ALL subresources UINT64 totalStagingSize = 0; std::vector layouts; std::vector numRowsArray; std::vector rowSizesArray; for (uint32_t mipOffset = 0; mipOffset < numMipsToUpload; ++mipOffset) { for (uint32_t sliceOffset = 0; sliceOffset < numSlicesToUpload; ++sliceOffset) { const uint32_t subresource = calcSubresourceIndex(baseMip + mipOffset, baseSlice + sliceOffset); D3D12_PLACED_SUBRESOURCE_FOOTPRINT layout = {}; UINT numRows = 0; UINT64 rowSize = 0; UINT64 subresSize = 0; device_->GetCopyableFootprints(&resourceDesc, subresource, 1, totalStagingSize, &layout, &numRows, &rowSize, &subresSize); layouts.push_back(layout); numRowsArray.push_back(numRows); rowSizesArray.push_back(rowSize); totalStagingSize += subresSize; } } // Try to allocate from upload ring buffer first. UploadRingBuffer* ringBuffer = nullptr; UploadRingBuffer::Allocation ringAllocation; bool useRingBuffer = false; UINT64 uploadFenceValue = 0; if (iglDevice_) { // Reclaim completed upload buffers before allocating new ones. iglDevice_->processCompletedUploads(); ringBuffer = iglDevice_->getUploadRingBuffer(); // Get fence value that will signal when this upload completes uploadFenceValue = iglDevice_->getNextUploadFenceValue(); if (ringBuffer) { // D3D12 requires 512-byte alignment for texture uploads // (D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT) constexpr uint64_t kTextureUploadAlignment = 512; ringAllocation = ringBuffer->allocate(totalStagingSize, kTextureUploadAlignment, uploadFenceValue); if (ringAllocation.valid) { useRingBuffer = true; } } } // Fallback: Create temporary staging buffer if ring buffer allocation failed igl::d3d12::ComPtr stagingBuffer; void* mappedData = nullptr; uint64_t stagingBaseOffset = 0; HRESULT hr = S_OK; if (useRingBuffer) { // Use ring buffer allocation mappedData = ringAllocation.cpuAddress; stagingBaseOffset = ringAllocation.offset; } else { // Create temporary staging buffer D3D12_HEAP_PROPERTIES uploadHeapProps = {}; uploadHeapProps.Type = D3D12_HEAP_TYPE_UPLOAD; uploadHeapProps.CreationNodeMask = 1; uploadHeapProps.VisibleNodeMask = 1; D3D12_RESOURCE_DESC stagingDesc = {}; stagingDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; stagingDesc.Width = totalStagingSize; stagingDesc.Height = 1; stagingDesc.DepthOrArraySize = 1; stagingDesc.MipLevels = 1; stagingDesc.Format = DXGI_FORMAT_UNKNOWN; stagingDesc.SampleDesc.Count = 1; stagingDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; hr = device_->CreateCommittedResource(&uploadHeapProps, D3D12_HEAP_FLAG_NONE, &stagingDesc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(stagingBuffer.GetAddressOf())); if (FAILED(hr)) { return Result(Result::Code::RuntimeError, "Failed to create staging buffer"); } // Map staging buffer once hr = stagingBuffer->Map(0, nullptr, &mappedData); if (FAILED(hr)) { return Result(Result::Code::RuntimeError, "Failed to map staging buffer"); } } // Copy all subresource data to the staging buffer. // Direct copy: no channel swap needed for RGBA formats. // DXGI_FORMAT_R8G8B8A8_UNORM has R,G,B,A byte order matching IGL TextureFormat::RGBA_UNorm8. size_t srcDataOffset = 0; size_t layoutIdx = 0; for (uint32_t mipOffset = 0; mipOffset < numMipsToUpload; ++mipOffset) { const uint32_t mipWidth = std::max(width >> (baseMip + mipOffset), 1u); const uint32_t mipHeight = std::max(height >> (baseMip + mipOffset), 1u); const uint32_t mipDepth = std::max(depth >> (baseMip + mipOffset), 1u); size_t mipBytesPerRow = 0; if (isBC7) { const uint32_t blocksX = (mipWidth + 3u) / 4u; mipBytesPerRow = static_cast(blocksX) * props.bytesPerBlock; } else { mipBytesPerRow = (bytesPerRow * mipWidth) / width; } for (uint32_t sliceOffset = 0; sliceOffset < numSlicesToUpload; ++sliceOffset) { const auto& layout = layouts[layoutIdx]; const UINT numRows = numRowsArray[layoutIdx]; const UINT64 rowSize = rowSizesArray[layoutIdx]; layoutIdx++; const uint8_t* srcData = static_cast(data) + srcDataOffset; uint8_t* dstData = static_cast(mappedData) + layout.Offset; const size_t copyBytes = std::min(static_cast(rowSize), mipBytesPerRow); // For uncompressed formats, the source data is tightly packed by the // requested region's height (mipHeight). For block-compressed formats // (e.g. BC7), numRows represents the number of block rows returned by // GetCopyableFootprints. Use mipHeight for uncompressed uploads and // numRows for BC7 so that source layout matches the caller's data. const UINT rowsToCopy = isBC7 ? numRows : mipHeight; const size_t srcDepthPitch = mipBytesPerRow * rowsToCopy; const size_t dstDepthPitch = layout.Footprint.RowPitch * layout.Footprint.Height; for (UINT z = 0; z < mipDepth; ++z) { const uint8_t* srcSlice = srcData + z * srcDepthPitch; uint8_t* dstSlice = dstData + z * dstDepthPitch; for (UINT row = 0; row < rowsToCopy; ++row) { const uint8_t* srcRow = srcSlice + row * mipBytesPerRow; uint8_t* dstRow = dstSlice + row * layout.Footprint.RowPitch; memcpy(dstRow, srcRow, copyBytes); } } // Advance source pointer by the size of this subresource (all rows, all slices). srcDataOffset += mipBytesPerRow * rowsToCopy * mipDepth; } } // Unmap temporary staging buffer (ring buffer stays persistently mapped) if (!useRingBuffer && stagingBuffer.Get()) { stagingBuffer->Unmap(0, nullptr); } // Get command allocator from pool with fence tracking when an iglDevice is available. igl::d3d12::ComPtr cmdAlloc; if (iglDevice_) { cmdAlloc = iglDevice_->getUploadCommandAllocator(); if (!cmdAlloc.Get()) { return Result(Result::Code::RuntimeError, "Failed to get command allocator from pool"); } } else { // Fallback for textures created without Device* (shouldn't happen in normal flow) hr = device_->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(cmdAlloc.GetAddressOf())); if (FAILED(hr)) { return Result(Result::Code::RuntimeError, "Failed to create command allocator"); } } igl::d3d12::ComPtr cmdList; hr = device_->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, cmdAlloc.Get(), nullptr, IID_PPV_ARGS(cmdList.GetAddressOf())); if (FAILED(hr)) { if (iglDevice_) { // Return allocator to pool with fence value 0 (immediately available) iglDevice_->returnUploadCommandAllocator(cmdAlloc, 0); } return Result(Result::Code::RuntimeError, "Failed to create command list"); } // Record all copy commands layoutIdx = 0; for (uint32_t mipOffset = 0; mipOffset < numMipsToUpload; ++mipOffset) { const uint32_t currentMip = baseMip + mipOffset; const uint32_t mipWidth = std::max(width >> currentMip, 1u); const uint32_t mipHeight = std::max(height >> currentMip, 1u); const uint32_t mipDepth = std::max(depth >> currentMip, 1u); for (uint32_t sliceOffset = 0; sliceOffset < numSlicesToUpload; ++sliceOffset) { const uint32_t currentSlice = baseSlice + sliceOffset; const uint32_t subresource = calcSubresourceIndex(currentMip, currentSlice); // const_cast needed because upload is const (required by ITexture interface) // but state tracking is non-const by design const_cast(this)->transitionTo( cmdList.Get(), D3D12_RESOURCE_STATE_COPY_DEST, currentMip, currentSlice); D3D12_TEXTURE_COPY_LOCATION dst = {}; dst.pResource = resource_.Get(); dst.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; dst.SubresourceIndex = subresource; if (type_ == TextureType::Cube) { IGL_D3D12_LOG_VERBOSE( "CopyTextureRegion: Copying to CUBE subresource=%u (mip=%u, slice=%u)\n", subresource, currentMip, currentSlice); } D3D12_TEXTURE_COPY_LOCATION src = {}; src.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT; // Use ring buffer or temporary staging buffer if (useRingBuffer) { src.pResource = ringBuffer->getUploadHeap(); // Adjust layout offset to account for ring buffer base offset D3D12_PLACED_SUBRESOURCE_FOOTPRINT adjustedLayout = layouts[layoutIdx]; adjustedLayout.Offset += stagingBaseOffset; src.PlacedFootprint = adjustedLayout; } else { src.pResource = stagingBuffer.Get(); src.PlacedFootprint = layouts[layoutIdx]; } layoutIdx++; // For block-compressed formats like BC7, CopyTextureRegion requires the // source box to be aligned to block boundaries. Small mips (e.g. 2x2) // violate this if we specify an explicit box in texel units. Since the // staging layout already matches the subresource footprint, simply copy // the entire subresource by passing a null box for BC7. if (isBC7) { cmdList->CopyTextureRegion(&dst, range.x, range.y, range.z, &src, nullptr); } else { D3D12_BOX srcBox = {0, 0, 0, mipWidth, mipHeight, mipDepth}; cmdList->CopyTextureRegion(&dst, range.x, range.y, range.z, &src, &srcBox); } // const_cast needed (see above) const_cast(this)->transitionTo( cmdList.Get(), D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, currentMip, currentSlice); } } cmdList->Close(); // Execute once and wait once ID3D12CommandList* cmdLists[] = {cmdList.Get()}; queue_->ExecuteCommandLists(1, cmdLists); // Use upload fence for command allocator synchronization. // Use pre-allocated uploadFenceValue (already incremented for ring buffer). if (iglDevice_) { ID3D12Fence* uploadFence = iglDevice_->getUploadFence(); hr = queue_->Signal(uploadFence, uploadFenceValue); if (FAILED(hr)) { IGL_LOG_ERROR("Texture::upload: Failed to signal upload fence: 0x%08X\n", hr); // Return allocator with 0 to avoid blocking the pool iglDevice_->returnUploadCommandAllocator(cmdAlloc, 0); return Result(Result::Code::RuntimeError, "Failed to signal fence"); } // Return allocator to pool with fence value (will be reused after the fence is signaled). iglDevice_->returnUploadCommandAllocator(cmdAlloc, uploadFenceValue); // Track staging buffer for async cleanup (no synchronous wait). // Only track temporary staging buffers; ring buffer is persistent. // Pass uploadFenceValue (already signaled above) to track with the correct fence. if (!useRingBuffer && stagingBuffer.Get()) { iglDevice_->trackUploadBuffer(std::move(stagingBuffer), uploadFenceValue); } // Wait for upload to complete synchronously. // This is necessary because generateMipmap and other operations may immediately // access the texture data after upload returns. Result waitResult = iglDevice_->waitForUploadFence(uploadFenceValue); if (!waitResult.isOk()) { IGL_LOG_ERROR("Texture::upload: Fence wait failed: %s\n", waitResult.message.c_str()); return waitResult; } } else { // Fallback for textures without iglDevice_ (shouldn't happen in normal flow) // In this case, we need to wait synchronously since we can't track the buffer igl::d3d12::ComPtr fence; hr = device_->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(fence.GetAddressOf())); if (FAILED(hr)) { return Result(Result::Code::RuntimeError, "Failed to create fence"); } queue_->Signal(fence.Get(), 1); FenceWaiter waiter(fence.Get(), 1); Result waitResult = waiter.wait(); if (!waitResult.isOk()) { return waitResult; // Propagate detailed timeout/setup error } } return Result(); } Result Texture::uploadCube(const TextureRangeDesc& range, TextureCubeFace face, const void* data, size_t bytesPerRow) const { // Cube textures are stored as texture arrays with 6 slices (one per face). // The upload() method already handles cube textures correctly when face/numFaces are set. // Validate this is a cube texture if (type_ != TextureType::Cube) { return Result(Result::Code::ArgumentInvalid, "uploadCube called on non-cube texture"); } // Create a modified range with the correct face index TextureRangeDesc cubeRange = range; cubeRange.face = static_cast(face); // Convert TextureCubeFace enum to face index (0-5) cubeRange.numFaces = 1; // Upload single face // Delegate to upload() which handles cube texture subresource indexing correctly return upload(cubeRange, data, bytesPerRow); } Result Texture::uploadInternal(TextureType type, const TextureRangeDesc& range, const void* data, size_t bytesPerRow, const uint32_t* mipLevelBytes) const { if (!(type == TextureType::TwoD || type == TextureType::TwoDArray || type == TextureType::ThreeD || type == TextureType::Cube)) { return Result(Result::Code::Unimplemented, "Upload not implemented for this texture type"); } // Delegate to upload() which now handles multi-mip, multi-layer, and cube textures natively return upload(range, data, bytesPerRow); } Dimensions Texture::getDimensions() const { return dimensions_; } uint32_t Texture::getNumLayers() const { return static_cast(numLayers_); } TextureType Texture::getType() const { return type_; } TextureDesc::TextureUsage Texture::getUsage() const { return usage_; } uint32_t Texture::getSamples() const { return static_cast(samples_); } uint32_t Texture::getNumMipLevels() const { return static_cast(numMipLevels_); } uint64_t Texture::getTextureId() const { return reinterpret_cast(resource_.Get()); } TextureFormat Texture::getFormat() const { return format_; } bool Texture::isRequiredGenerateMipmap() const { return false; } void Texture::generateMipmap(ICommandQueue& /*cmdQueue*/, const TextureRangeDesc* /*range*/) const { IGL_D3D12_LOG_VERBOSE("Texture::generateMipmap(cmdQueue) - START: numMips=%u\n", numMipLevels_); if (!device_ || !queue_ || !resource_.Get() || numMipLevels_ < 2) { IGL_D3D12_LOG_VERBOSE( "Texture::generateMipmap() - Skipping: device=%p queue=%p resource=%p numMips=%u\n", device_, queue_, resource_.Get(), numMipLevels_); return; } D3D12_RESOURCE_DESC resourceDesc = resource_->GetDesc(); // Only support 2D textures for mipmap generation if (resourceDesc.Dimension != D3D12_RESOURCE_DIMENSION_TEXTURE2D) { IGL_D3D12_LOG_VERBOSE( "Texture::generateMipmap() - Skipping: only 2D textures supported (dimension=%d)\n", (int)resourceDesc.Dimension); return; } // Skip depth/stencil textures entirely. The current D3D12 mipmap path only // supports color render-target textures; attempting to add ALLOW_RENDER_TARGET // to a depth/stencil resource would violate D3D12's flag rules. if (resourceDesc.Flags & D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL) { IGL_D3D12_LOG_VERBOSE( "Texture::generateMipmap() - Skipping: depth/stencil textures are not " "handled by this mipmap path (Flags=0x%08X)\n", resourceDesc.Flags); return; } // If texture wasn't created with a render-target-capable flag, skip mipmap // generation gracefully on D3D12. The current implementation only supports // color 2D textures with ALLOW_RENDER_TARGET; depth/stencil and other usage // patterns rely on backend-specific paths or pre-generated mips. if (!(resourceDesc.Flags & D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET)) { IGL_D3D12_LOG_VERBOSE( "Texture::generateMipmap() - Recreating texture with RENDER_TARGET flag for mipmap " "generation\n"); // Save current resource using ComPtr for automatic reference counting // Note: ComPtr copy is deleted, so we manually AddRef and Attach ID3D12Resource* rawOldResource = resource_.Get(); if (rawOldResource) { rawOldResource->AddRef(); } igl::d3d12::ComPtr oldResource; oldResource.Attach(rawOldResource); // Modify descriptor to add RENDER_TARGET flag resourceDesc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET; // Create new resource with RENDER_TARGET flag D3D12_HEAP_PROPERTIES heapProps = {}; heapProps.Type = D3D12_HEAP_TYPE_DEFAULT; D3D12_CLEAR_VALUE clearValue = {}; clearValue.Format = resourceDesc.Format; igl::d3d12::ComPtr newResource; HRESULT hr = device_->CreateCommittedResource(&heapProps, D3D12_HEAP_FLAG_NONE, &resourceDesc, D3D12_RESOURCE_STATE_COPY_DEST, &clearValue, IID_PPV_ARGS(newResource.GetAddressOf())); if (FAILED(hr)) { IGL_D3D12_LOG_VERBOSE( "Texture::generateMipmap() - Skipping: failed to recreate texture with " "RENDER_TARGET flag (HRESULT=0x%08X)\n", static_cast(hr)); return; } // Copy mip 0 from old resource to new resource igl::d3d12::ComPtr copyAlloc; igl::d3d12::ComPtr copyList; if (FAILED(device_->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(copyAlloc.GetAddressOf())))) { IGL_LOG_ERROR("Texture::generateMipmap() - Failed to create copy command allocator\n"); return; } if (FAILED(device_->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, copyAlloc.Get(), nullptr, IID_PPV_ARGS(copyList.GetAddressOf())))) { IGL_LOG_ERROR("Texture::generateMipmap() - Failed to create copy command list\n"); return; } // Transition old resource to COPY_SOURCE D3D12_RESOURCE_BARRIER barrierOld = {}; barrierOld.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; barrierOld.Transition.pResource = oldResource.Get(); barrierOld.Transition.StateBefore = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE; barrierOld.Transition.StateAfter = D3D12_RESOURCE_STATE_COPY_SOURCE; barrierOld.Transition.Subresource = 0; copyList->ResourceBarrier(1, &barrierOld); // Copy mip 0 D3D12_TEXTURE_COPY_LOCATION srcLoc = {}; srcLoc.pResource = oldResource.Get(); srcLoc.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; srcLoc.SubresourceIndex = 0; D3D12_TEXTURE_COPY_LOCATION dstLoc = {}; dstLoc.pResource = newResource.Get(); dstLoc.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; dstLoc.SubresourceIndex = 0; copyList->CopyTextureRegion(&dstLoc, 0, 0, 0, &srcLoc, nullptr); // Transition the entire new resource to PIXEL_SHADER_RESOURCE for mipmap // generation. The resource was created in COPY_DEST; only mip 0 was // written by the copy above, but all mips will be consumed as SRVs/RTVs // in the subsequent fullscreen-blit loop. Using ALL_SUBRESOURCES here // ensures the debug layer's notion of the initial state matches our // state tracking for every subresource (mip >= 1 included). D3D12_RESOURCE_BARRIER barrierNew = {}; barrierNew.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; barrierNew.Transition.pResource = newResource.Get(); barrierNew.Transition.StateBefore = D3D12_RESOURCE_STATE_COPY_DEST; barrierNew.Transition.StateAfter = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE; barrierNew.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; copyList->ResourceBarrier(1, &barrierNew); copyList->Close(); ID3D12CommandList* copyLists[] = {copyList.Get()}; queue_->ExecuteCommandLists(1, copyLists); // Wait for copy to complete igl::d3d12::ComPtr copyFence; if (FAILED(device_->CreateFence( 0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(copyFence.GetAddressOf())))) { IGL_LOG_ERROR("Texture::generateMipmap() - Failed to create copy fence\n"); return; } queue_->Signal(copyFence.Get(), 1); FenceWaiter waiter(copyFence.Get(), 1); Result waitResult = waiter.wait(); if (!waitResult.isOk()) { IGL_LOG_ERROR("Texture::generateMipmap() - Fence wait failed: %s\n", waitResult.message.c_str()); return; } // oldResource will be automatically released by ComPtr destructor // Replace resource with new one (need const_cast since function is const) auto& mutableResource = const_cast&>(resource_); mutableResource.Reset(); mutableResource = std::move(newResource); // Update state tracking for new resource - all mips are now in PIXEL_SHADER_RESOURCE // const_cast needed because generateMipmap is const (required by ITexture interface) // but state tracking is non-const by design const_cast(this)->initializeStateTracking(D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); // Update resourceDesc for the rest of the function resourceDesc = resource_->GetDesc(); IGL_D3D12_LOG_VERBOSE("Texture::generateMipmap() - Texture recreated successfully\n"); } IGL_D3D12_LOG_VERBOSE("Texture::generateMipmap() - Proceeding with mipmap generation\n"); // Use pre-compiled shaders from Device instead of runtime compilation. // Note: iglDevice_ should always be set in normal flow (see Texture::createFromResource) // This check is defensive; if it triggers, it indicates a texture creation path that bypassed // proper initialization if (!iglDevice_) { IGL_LOG_ERROR( "Texture::generateMipmap() - No IGL device available (texture not properly initialized)\n"); IGL_LOG_ERROR( " This is a programming error: textures must be created via Device methods to support " "mipmap generation\n"); return; } const auto& vsBytecode = iglDevice_->getMipmapVSBytecode(); const auto& psBytecode = iglDevice_->getMipmapPSBytecode(); ID3D12RootSignature* rootSig = iglDevice_->getMipmapRootSignature(); // Validate pre-compiled shaders are available // This can fail if device initialization encountered DXC errors if (vsBytecode.empty() || psBytecode.empty() || !rootSig) { IGL_LOG_ERROR("Texture::generateMipmap() - Pre-compiled mipmap shaders unavailable\n"); IGL_LOG_ERROR( " Device may not support mipmap generation (check Device initialization logs for DXC " "errors)\n"); return; } IGL_D3D12_LOG_VERBOSE( "Texture::generateMipmap() - Using pre-compiled shaders (%zu bytes VS, %zu bytes PS)\n", vsBytecode.size(), psBytecode.size()); D3D12_GRAPHICS_PIPELINE_STATE_DESC pso = {}; pso.pRootSignature = rootSig; pso.VS = {vsBytecode.data(), vsBytecode.size()}; pso.PS = {psBytecode.data(), psBytecode.size()}; pso.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; pso.RasterizerState.FillMode = D3D12_FILL_MODE_SOLID; pso.RasterizerState.CullMode = D3D12_CULL_MODE_NONE; pso.RasterizerState.DepthClipEnable = TRUE; pso.BlendState.RenderTarget[0].RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL; pso.SampleMask = UINT_MAX; pso.SampleDesc.Count = 1; pso.NumRenderTargets = 1; pso.RTVFormats[0] = resourceDesc.Format; pso.DSVFormat = DXGI_FORMAT_UNKNOWN; igl::d3d12::ComPtr psoObj; if (FAILED(device_->CreateGraphicsPipelineState(&pso, IID_PPV_ARGS(psoObj.GetAddressOf())))) { return; } // Create descriptor heap large enough for all mip levels // We need one SRV descriptor per mip level (numMipLevels_ - 1 blits) D3D12_DESCRIPTOR_HEAP_DESC srvHeapDesc = {}; srvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV; srvHeapDesc.NumDescriptors = numMipLevels_ - 1; // One SRV per source mip level srvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE; igl::d3d12::ComPtr srvHeap; if (FAILED(device_->CreateDescriptorHeap(&srvHeapDesc, IID_PPV_ARGS(srvHeap.GetAddressOf())))) return; D3D12_DESCRIPTOR_HEAP_DESC smpHeapDesc = {}; smpHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER; smpHeapDesc.NumDescriptors = 1; smpHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE; igl::d3d12::ComPtr smpHeap; if (FAILED(device_->CreateDescriptorHeap(&smpHeapDesc, IID_PPV_ARGS(smpHeap.GetAddressOf())))) return; // Pre-creation validation. IGL_DEBUG_ASSERT(device_ != nullptr, "Device is null before CreateSampler"); IGL_DEBUG_ASSERT(smpHeap.Get() != nullptr, "Sampler heap is null"); // Fixed sampler D3D12_SAMPLER_DESC samp = {}; samp.Filter = D3D12_FILTER_MIN_MAG_MIP_LINEAR; samp.AddressU = samp.AddressV = samp.AddressW = D3D12_TEXTURE_ADDRESS_MODE_CLAMP; samp.MinLOD = 0; samp.MaxLOD = D3D12_FLOAT32_MAX; D3D12_CPU_DESCRIPTOR_HANDLE smpHandle = smpHeap->GetCPUDescriptorHandleForHeapStart(); IGL_DEBUG_ASSERT(smpHandle.ptr != 0, "Sampler descriptor handle is invalid"); device_->CreateSampler(&samp, smpHandle); igl::d3d12::ComPtr alloc; igl::d3d12::ComPtr list; if (FAILED(device_->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(alloc.GetAddressOf())))) return; if (FAILED(device_->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, alloc.Get(), psoObj.Get(), IID_PPV_ARGS(list.GetAddressOf())))) return; ID3D12DescriptorHeap* heaps[] = {srvHeap.Get(), smpHeap.Get()}; list->SetDescriptorHeaps(2, heaps); list->SetPipelineState(psoObj.Get()); list->SetGraphicsRootSignature(rootSig); list->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST); // Get descriptor size for incrementing through the heap const UINT srvDescriptorSize = device_->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); D3D12_CPU_DESCRIPTOR_HANDLE srvCpuStart = srvHeap->GetCPUDescriptorHandleForHeapStart(); D3D12_GPU_DESCRIPTOR_HANDLE srvGpuStart = srvHeap->GetGPUDescriptorHandleForHeapStart(); D3D12_GPU_DESCRIPTOR_HANDLE smpGpu = smpHeap->GetGPUDescriptorHandleForHeapStart(); // Create single RTV descriptor heap outside the loop (reused for all mip levels) D3D12_DESCRIPTOR_HEAP_DESC rtvHeapDesc = {}; rtvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV; rtvHeapDesc.NumDescriptors = 1; igl::d3d12::ComPtr rtvHeap; if (FAILED(device_->CreateDescriptorHeap(&rtvHeapDesc, IID_PPV_ARGS(rtvHeap.GetAddressOf())))) return; D3D12_CPU_DESCRIPTOR_HANDLE rtvCpu = rtvHeap->GetCPUDescriptorHandleForHeapStart(); // Ensure mip 0 is in PIXEL_SHADER_RESOURCE state for first SRV read // const_cast needed because generateMipmap is const (required by ITexture interface) // but state tracking is non-const by design const_cast(this)->transitionTo( list.Get(), D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, 0, 0); for (UINT mip = 0; mip + 1 < numMipLevels_; ++mip) { // Calculate descriptor handle for this mip level D3D12_CPU_DESCRIPTOR_HANDLE srvCpu = srvCpuStart; srvCpu.ptr += mip * srvDescriptorSize; D3D12_GPU_DESCRIPTOR_HANDLE srvGpu = srvGpuStart; srvGpu.ptr += mip * srvDescriptorSize; // Pre-creation validation. IGL_DEBUG_ASSERT(device_ != nullptr, "Device is null before CreateShaderResourceView"); IGL_DEBUG_ASSERT(resource_.Get() != nullptr, "Resource is null before CreateShaderResourceView"); IGL_DEBUG_ASSERT(srvCpu.ptr != 0, "SRV descriptor handle is invalid"); D3D12_SHADER_RESOURCE_VIEW_DESC srv = {}; srv.Format = resourceDesc.Format; srv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; srv.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; srv.Texture2D.MostDetailedMip = mip; srv.Texture2D.MipLevels = 1; device_->CreateShaderResourceView(resource_.Get(), &srv, srvCpu); // Pre-creation validation. IGL_DEBUG_ASSERT(device_ != nullptr, "Device is null before CreateRenderTargetView"); IGL_DEBUG_ASSERT(resource_.Get() != nullptr, "Resource is null before CreateRenderTargetView"); IGL_DEBUG_ASSERT(rtvCpu.ptr != 0, "RTV descriptor handle is invalid"); D3D12_RENDER_TARGET_VIEW_DESC rtv = {}; rtv.Format = resourceDesc.Format; rtv.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D; rtv.Texture2D.MipSlice = mip + 1; // Reuse the same RTV heap by recreating the view for each mip level device_->CreateRenderTargetView(resource_.Get(), &rtv, rtvCpu); // Transition mip level to render target using state tracking // const_cast needed (see above). const_cast(this)->transitionTo( list.Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, mip + 1, 0); list->OMSetRenderTargets(1, &rtvCpu, FALSE, nullptr); const UINT w = std::max(1u, (UINT)(resourceDesc.Width >> (mip + 1))); const UINT h = std::max(1u, (UINT)(resourceDesc.Height >> (mip + 1))); D3D12_VIEWPORT vp{0.0f, 0.0f, (FLOAT)w, (FLOAT)h, 0.0f, 1.0f}; D3D12_RECT sc{0, 0, (LONG)w, (LONG)h}; list->RSSetViewports(1, &vp); list->RSSetScissorRects(1, &sc); list->SetGraphicsRootDescriptorTable(0, srvGpu); list->SetGraphicsRootDescriptorTable(1, smpGpu); list->DrawInstanced(3, 1, 0, 0); // Transition mip level to shader resource for next iteration // const_cast needed (see above). const_cast(this)->transitionTo( list.Get(), D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, mip + 1, 0); } list->Close(); ID3D12CommandList* lists[] = {list.Get()}; queue_->ExecuteCommandLists(1, lists); igl::d3d12::ComPtr fence; if (FAILED(device_->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(fence.GetAddressOf())))) return; queue_->Signal(fence.Get(), 1); FenceWaiter waiter(fence.Get(), 1); Result waitResult = waiter.wait(); if (!waitResult.isOk()) { IGL_LOG_ERROR("Texture::generateMipmap() - Fence wait failed: %s\n", waitResult.message.c_str()); } } void Texture::generateMipmap(ICommandBuffer& /*cmdBuffer*/, const TextureRangeDesc* /*range*/) const { IGL_D3D12_LOG_VERBOSE("Texture::generateMipmap(cmdBuffer) - START: numMips=%u\n", numMipLevels_); if (!device_ || !queue_ || !resource_.Get() || numMipLevels_ < 2) { IGL_D3D12_LOG_VERBOSE( "Texture::generateMipmap(cmdBuffer) - Skipping: device=%p queue=%p resource=%p " "numMips=%u\n", device_, queue_, resource_.Get(), numMipLevels_); return; } D3D12_RESOURCE_DESC resourceDesc = resource_->GetDesc(); // Only support 2D textures for mipmap generation if (resourceDesc.Dimension != D3D12_RESOURCE_DIMENSION_TEXTURE2D) { IGL_D3D12_LOG_VERBOSE( "Texture::generateMipmap(cmdBuffer) - Skipping: only 2D textures supported\n"); return; } // Check if texture was created with RENDER_TARGET flag (required for mipmap generation) if (!(resourceDesc.Flags & D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET)) { IGL_D3D12_LOG_VERBOSE( "Texture::generateMipmap(cmdBuffer) - Skipping: texture not created with RENDER_TARGET " "usage\n"); IGL_D3D12_LOG_VERBOSE( " To enable mipmap generation, create texture with " "TextureDesc::TextureUsageBits::Attachment\n"); return; } // Use pre-compiled shaders from Device instead of runtime compilation. // Note: iglDevice_ should always be set in normal flow (see Texture::createFromResource) // This check is defensive; if it triggers, it indicates a texture creation path that bypassed // proper initialization if (!iglDevice_) { IGL_LOG_ERROR( "Texture::generateMipmap(cmdBuffer) - No IGL device available (texture not properly " "initialized)\n"); IGL_LOG_ERROR( " This is a programming error: textures must be created via Device methods to support " "mipmap generation\n"); return; } const auto& vsBytecode = iglDevice_->getMipmapVSBytecode(); const auto& psBytecode = iglDevice_->getMipmapPSBytecode(); ID3D12RootSignature* rootSig = iglDevice_->getMipmapRootSignature(); // Validate pre-compiled shaders are available // This can fail if device initialization encountered DXC errors if (vsBytecode.empty() || psBytecode.empty() || !rootSig) { IGL_LOG_ERROR("Texture::generateMipmap(cmdBuffer) - Pre-compiled mipmap shaders unavailable\n"); IGL_LOG_ERROR( " Device may not support mipmap generation (check Device initialization logs for DXC " "errors)\n"); return; } IGL_D3D12_LOG_VERBOSE( "Texture::generateMipmap(cmdBuffer) - Using pre-compiled shaders (%zu bytes VS, %zu bytes " "PS)\n", vsBytecode.size(), psBytecode.size()); D3D12_GRAPHICS_PIPELINE_STATE_DESC pso = {}; pso.pRootSignature = rootSig; pso.VS = {vsBytecode.data(), vsBytecode.size()}; pso.PS = {psBytecode.data(), psBytecode.size()}; pso.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; pso.RasterizerState.FillMode = D3D12_FILL_MODE_SOLID; pso.RasterizerState.CullMode = D3D12_CULL_MODE_NONE; pso.RasterizerState.DepthClipEnable = TRUE; pso.BlendState.RenderTarget[0].RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL; pso.SampleMask = UINT_MAX; pso.SampleDesc.Count = 1; pso.NumRenderTargets = 1; pso.RTVFormats[0] = resourceDesc.Format; pso.DSVFormat = DXGI_FORMAT_UNKNOWN; igl::d3d12::ComPtr psoObj; if (FAILED(device_->CreateGraphicsPipelineState(&pso, IID_PPV_ARGS(psoObj.GetAddressOf())))) return; // Create descriptor heap large enough for all mip levels // We need one SRV descriptor per mip level (numMipLevels_ - 1 blits) D3D12_DESCRIPTOR_HEAP_DESC srvHeapDesc = {}; srvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV; srvHeapDesc.NumDescriptors = numMipLevels_ - 1; // One SRV per source mip level srvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE; igl::d3d12::ComPtr srvHeap; if (FAILED(device_->CreateDescriptorHeap(&srvHeapDesc, IID_PPV_ARGS(srvHeap.GetAddressOf())))) return; D3D12_DESCRIPTOR_HEAP_DESC smpHeapDesc = {}; smpHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER; smpHeapDesc.NumDescriptors = 1; smpHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE; igl::d3d12::ComPtr smpHeap; if (FAILED(device_->CreateDescriptorHeap(&smpHeapDesc, IID_PPV_ARGS(smpHeap.GetAddressOf())))) return; // Pre-creation validation. IGL_DEBUG_ASSERT(device_ != nullptr, "Device is null before CreateSampler"); IGL_DEBUG_ASSERT(smpHeap.Get() != nullptr, "Sampler heap is null"); D3D12_SAMPLER_DESC samp = {}; samp.Filter = D3D12_FILTER_MIN_MAG_MIP_LINEAR; samp.AddressU = samp.AddressV = samp.AddressW = D3D12_TEXTURE_ADDRESS_MODE_CLAMP; samp.MinLOD = 0; samp.MaxLOD = D3D12_FLOAT32_MAX; D3D12_CPU_DESCRIPTOR_HANDLE smpHandle = smpHeap->GetCPUDescriptorHandleForHeapStart(); IGL_DEBUG_ASSERT(smpHandle.ptr != 0, "Sampler descriptor handle is invalid"); device_->CreateSampler(&samp, smpHandle); igl::d3d12::ComPtr alloc; igl::d3d12::ComPtr list; if (FAILED(device_->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(alloc.GetAddressOf())))) return; if (FAILED(device_->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, alloc.Get(), psoObj.Get(), IID_PPV_ARGS(list.GetAddressOf())))) return; ID3D12DescriptorHeap* heaps[] = {srvHeap.Get(), smpHeap.Get()}; list->SetDescriptorHeaps(2, heaps); list->SetPipelineState(psoObj.Get()); list->SetGraphicsRootSignature(rootSig); list->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST); // Get descriptor size for incrementing through the heap const UINT srvDescriptorSize = device_->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); D3D12_CPU_DESCRIPTOR_HANDLE srvCpuStart = srvHeap->GetCPUDescriptorHandleForHeapStart(); D3D12_GPU_DESCRIPTOR_HANDLE srvGpuStart = srvHeap->GetGPUDescriptorHandleForHeapStart(); D3D12_GPU_DESCRIPTOR_HANDLE smpGpu = smpHeap->GetGPUDescriptorHandleForHeapStart(); // Create single RTV descriptor heap outside the loop (reused for all mip levels) D3D12_DESCRIPTOR_HEAP_DESC rtvHeapDesc = {}; rtvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV; rtvHeapDesc.NumDescriptors = 1; igl::d3d12::ComPtr rtvHeap; if (FAILED(device_->CreateDescriptorHeap(&rtvHeapDesc, IID_PPV_ARGS(rtvHeap.GetAddressOf())))) return; D3D12_CPU_DESCRIPTOR_HANDLE rtvCpu = rtvHeap->GetCPUDescriptorHandleForHeapStart(); // Ensure mip 0 is in PIXEL_SHADER_RESOURCE state for first SRV read // const_cast needed because generateMipmap is const (required by ITexture interface) // but state tracking is non-const by design const_cast(this)->transitionTo( list.Get(), D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, 0, 0); for (UINT mip = 0; mip + 1 < numMipLevels_; ++mip) { // Calculate descriptor handle for this mip level D3D12_CPU_DESCRIPTOR_HANDLE srvCpu = srvCpuStart; srvCpu.ptr += mip * srvDescriptorSize; D3D12_GPU_DESCRIPTOR_HANDLE srvGpu = srvGpuStart; srvGpu.ptr += mip * srvDescriptorSize; // Pre-creation validation. IGL_DEBUG_ASSERT(device_ != nullptr, "Device is null before CreateShaderResourceView"); IGL_DEBUG_ASSERT(resource_.Get() != nullptr, "Resource is null before CreateShaderResourceView"); IGL_DEBUG_ASSERT(srvCpu.ptr != 0, "SRV descriptor handle is invalid"); D3D12_SHADER_RESOURCE_VIEW_DESC srv = {}; srv.Format = resourceDesc.Format; srv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; srv.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; srv.Texture2D.MostDetailedMip = mip; srv.Texture2D.MipLevels = 1; device_->CreateShaderResourceView(resource_.Get(), &srv, srvCpu); // Pre-creation validation. IGL_DEBUG_ASSERT(device_ != nullptr, "Device is null before CreateRenderTargetView"); IGL_DEBUG_ASSERT(resource_.Get() != nullptr, "Resource is null before CreateRenderTargetView"); IGL_DEBUG_ASSERT(rtvCpu.ptr != 0, "RTV descriptor handle is invalid"); D3D12_RENDER_TARGET_VIEW_DESC rtv = {}; rtv.Format = resourceDesc.Format; rtv.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D; rtv.Texture2D.MipSlice = mip + 1; // Reuse the same RTV heap by recreating the view for each mip level device_->CreateRenderTargetView(resource_.Get(), &rtv, rtvCpu); // Transition mip level to render target using state tracking // const_cast needed (see above). const_cast(this)->transitionTo( list.Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, mip + 1, 0); list->OMSetRenderTargets(1, &rtvCpu, FALSE, nullptr); const UINT w = std::max(1u, (UINT)(resourceDesc.Width >> (mip + 1))); const UINT h = std::max(1u, (UINT)(resourceDesc.Height >> (mip + 1))); D3D12_VIEWPORT vp{0.0f, 0.0f, (FLOAT)w, (FLOAT)h, 0.0f, 1.0f}; D3D12_RECT sc{0, 0, (LONG)w, (LONG)h}; list->RSSetViewports(1, &vp); list->RSSetScissorRects(1, &sc); list->SetGraphicsRootDescriptorTable(0, srvGpu); list->SetGraphicsRootDescriptorTable(1, smpGpu); list->DrawInstanced(3, 1, 0, 0); // Transition mip level to shader resource for next iteration // const_cast needed (see above). const_cast(this)->transitionTo( list.Get(), D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, mip + 1, 0); } list->Close(); ID3D12CommandList* lists[] = {list.Get()}; queue_->ExecuteCommandLists(1, lists); igl::d3d12::ComPtr fence; if (FAILED(device_->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(fence.GetAddressOf())))) return; queue_->Signal(fence.Get(), 1); FenceWaiter waiter(fence.Get(), 1); Result waitResult = waiter.wait(); if (!waitResult.isOk()) { IGL_LOG_ERROR("Texture::generateMipmap(cmdBuffer) - Fence wait failed: %s\n", waitResult.message.c_str()); } } void Texture::initializeStateTracking(D3D12_RESOURCE_STATES initialState) { // Simplified per-subresource state tracking: always use a vector (no dual-mode). if (!resource_.Get()) { subresourceStates_.clear(); return; } const uint32_t mipLevels = static_cast(std::max(numMipLevels_, 1)); uint32_t arraySize; if (type_ == TextureType::ThreeD) { arraySize = 1u; } else if (type_ == TextureType::Cube) { arraySize = static_cast(std::max(numLayers_, 1)) * 6u; } else { arraySize = static_cast(std::max(numLayers_, 1)); } const size_t numSubresources = static_cast(mipLevels) * arraySize; subresourceStates_.assign(numSubresources, initialState); } uint32_t Texture::calcSubresourceIndex(uint32_t mipLevel, uint32_t layer) const { // For views, map view-local coordinates to resource coordinates. // Note: mipLevelOffset_ and arraySliceOffset_ are resource-relative (accumulated at view creation // for nested views). const uint32_t resourceMip = isView_ ? (mipLevel + mipLevelOffset_) : mipLevel; const uint32_t resourceLayer = isView_ ? (layer + arraySliceOffset_) : layer; // Use state owner's dimensions for subresource calculation const Texture* owner = getStateOwner(); IGL_DEBUG_ASSERT(owner != nullptr, "State owner must not be null"); const uint32_t mipLevels = static_cast(std::max(owner->numMipLevels_, 1)); uint32_t arraySize; if (owner->type_ == TextureType::ThreeD) { arraySize = 1u; } else if (owner->type_ == TextureType::Cube) { // Cube textures: 6 faces per layer arraySize = static_cast(std::max(owner->numLayers_, 1)) * 6u; } else { arraySize = static_cast(std::max(owner->numLayers_, 1)); } const uint32_t clampedMip = std::min(resourceMip, mipLevels - 1); const uint32_t clampedLayer = std::min(resourceLayer, arraySize - 1); // D3D12CalcSubresource formula: MipSlice + (ArraySlice * MipLevels) const uint32_t subresource = clampedMip + (clampedLayer * mipLevels); #ifdef IGL_DEBUG // Reduce log verbosity - only log in debug builds for views if ((type_ == TextureType::Cube || type_ == TextureType::TwoDArray) && isView_) { IGL_D3D12_LOG_VERBOSE( "calcSubresourceIndex (view): type=%d, mip=%u, layer=%u -> resource mip=%u, layer=%u -> " "subresource=%u\n", (int)type_, mipLevel, layer, resourceMip, resourceLayer, subresource); } #endif return subresource; } void Texture::transitionTo(ID3D12GraphicsCommandList* commandList, D3D12_RESOURCE_STATES newState, uint32_t mipLevel, uint32_t layer) { // Simplified per-subresource state tracking. Texture* owner = getStateOwner(); if (!commandList || !owner || !owner->resource_.Get() || owner->subresourceStates_.empty()) { return; } // For depth-stencil textures, transition all subresources (both depth and stencil planes). const auto props = getProperties(); const bool isDepthStencil = props.isDepthOrStencil() && (props.hasStencil() || format_ == TextureFormat::Z_UNorm24); if (isDepthStencil) { // Verify all subresources are in the same state before using ALL_SUBRESOURCES. D3D12_RESOURCE_STATES firstState = owner->subresourceStates_[0]; bool allSameState = true; for (const auto& state : owner->subresourceStates_) { if (state != firstState) { allSameState = false; IGL_LOG_ERROR( "Depth-stencil texture has divergent subresource states - this violates invariant\n"); break; } } if (firstState == newState) { return; // All subresources already in target state } // Safety check: If states have diverged, return early to avoid invalid ALL_SUBRESOURCES // barrier. if (!allSameState) { IGL_DEBUG_ASSERT(false, "Depth-stencil textures must have uniform state across all subresources"); return; // Intentionally skip transition to avoid undefined behavior } D3D12_RESOURCE_BARRIER barrier = {}; barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE; barrier.Transition.pResource = owner->resource_.Get(); barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; barrier.Transition.StateBefore = firstState; barrier.Transition.StateAfter = newState; commandList->ResourceBarrier(1, &barrier); // Update all subresource states for (auto& state : owner->subresourceStates_) { state = newState; } return; } // Non-depth-stencil: transition single subresource const uint32_t subresource = calcSubresourceIndex(mipLevel, layer); if (subresource >= owner->subresourceStates_.size()) { return; } auto& currentState = owner->subresourceStates_[subresource]; if (currentState == newState) { return; } D3D12_RESOURCE_BARRIER barrier = {}; barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE; barrier.Transition.pResource = owner->resource_.Get(); barrier.Transition.Subresource = subresource; barrier.Transition.StateBefore = currentState; barrier.Transition.StateAfter = newState; commandList->ResourceBarrier(1, &barrier); currentState = newState; } void Texture::transitionAll(ID3D12GraphicsCommandList* commandList, D3D12_RESOURCE_STATES newState) { // Simplified per-subresource state tracking. Texture* owner = getStateOwner(); if (!commandList || !owner || !owner->resource_.Get() || owner->subresourceStates_.empty()) { return; } // For depth-stencil textures (multi-plane in D3D12), keep all planes and // mips in a single coherent state by using an ALL_SUBRESOURCES barrier. // This avoids mismatches like depth in DEPTH_WRITE while stencil (plane 1) // remains in COMMON/PRESENT, which triggers the D3D12 debug error // INVALID_SUBRESOURCE_STATE on ClearDepthStencilView. const auto props = getProperties(); const bool isDepthStencil = props.isDepthOrStencil() && (props.hasStencil() || format_ == TextureFormat::Z_UNorm24); if (isDepthStencil) { D3D12_RESOURCE_STATES firstState = owner->subresourceStates_[0]; bool allSameState = true; for (const auto& state : owner->subresourceStates_) { if (state != firstState) { allSameState = false; IGL_LOG_ERROR( "Texture::transitionAll - depth-stencil texture has divergent subresource states; " "expected uniform state before ALL_SUBRESOURCES barrier\n"); break; } } if (firstState == newState) { // All subresources (planes/mips) already in the requested state. return; } if (!allSameState) { // Safety: avoid issuing an ALL_SUBRESOURCES barrier with inconsistent // tracking; this would make our internal state unreliable. IGL_DEBUG_ASSERT( false, "Texture::transitionAll - depth-stencil textures must have uniform state across all " "subresources before ALL_SUBRESOURCES transition"); return; } D3D12_RESOURCE_BARRIER barrier = {}; barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE; barrier.Transition.pResource = owner->resource_.Get(); barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; barrier.Transition.StateBefore = firstState; barrier.Transition.StateAfter = newState; commandList->ResourceBarrier(1, &barrier); for (auto& state : owner->subresourceStates_) { state = newState; } return; } // Check if all subresources are already in the target state bool allMatch = true; for (const auto& state : owner->subresourceStates_) { if (state != newState) { allMatch = false; break; } } if (allMatch) { return; } // Transition each subresource individually for (size_t i = 0; i < owner->subresourceStates_.size(); ++i) { auto& state = owner->subresourceStates_[i]; if (state == newState) { continue; } D3D12_RESOURCE_BARRIER barrier = {}; barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE; barrier.Transition.pResource = owner->resource_.Get(); barrier.Transition.Subresource = static_cast(i); barrier.Transition.StateBefore = state; barrier.Transition.StateAfter = newState; commandList->ResourceBarrier(1, &barrier); state = newState; } } D3D12_RESOURCE_STATES Texture::getSubresourceState(uint32_t mipLevel, uint32_t layer) const { // Simplified per-subresource state tracking. const Texture* owner = getStateOwner(); if (owner->subresourceStates_.empty()) { return D3D12_RESOURCE_STATE_COMMON; } const uint32_t index = calcSubresourceIndex(mipLevel, layer); if (index >= owner->subresourceStates_.size()) { return D3D12_RESOURCE_STATE_COMMON; } return owner->subresourceStates_[index]; } // IAttachmentInterop interface implementation void* Texture::getNativeImage() const { return resource_.Get(); } void* Texture::getNativeImageView() const { // RTV are transient objects in the current implementation. return nullptr; } const base::AttachmentInteropDesc& Texture::getDesc() const { // Update cached attachment descriptor attachmentDesc_.width = dimensions_.width; attachmentDesc_.height = dimensions_.height; attachmentDesc_.depth = dimensions_.depth; attachmentDesc_.numLayers = static_cast(numLayers_); attachmentDesc_.numSamples = static_cast(samples_); attachmentDesc_.numMipLevels = static_cast(numMipLevels_); attachmentDesc_.type = type_; attachmentDesc_.format = format_; attachmentDesc_.isSampled = (usage_ & TextureDesc::TextureUsageBits::Sampled) != 0; return attachmentDesc_; } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/Texture.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::d3d12 { class Texture final : public ITexture { public: Texture() : ITexture(TextureFormat::Invalid), format_(TextureFormat::Invalid) {} explicit Texture(TextureFormat format) : ITexture(format), format_(format) {} // Explicit destructor to free descriptor heap slots. ~Texture() override; // Factory method to create texture from existing D3D12 resource static std::shared_ptr createFromResource( ID3D12Resource* resource, TextureFormat format, const TextureDesc& desc, ID3D12Device* device = nullptr, ID3D12CommandQueue* queue = nullptr, D3D12_RESOURCE_STATES initialState = D3D12_RESOURCE_STATE_COMMON, class Device* iglDevice = nullptr); // Factory method to create texture view from parent texture static std::shared_ptr createTextureView(std::shared_ptr parent, const TextureViewDesc& desc); // D3D12-specific upload methods (not part of ITexture interface) Result upload(const TextureRangeDesc& range, const void* data, size_t bytesPerRow = 0) const; Result uploadCube(const TextureRangeDesc& range, TextureCubeFace face, const void* data, size_t bytesPerRow = 0) const; Dimensions getDimensions() const override; uint32_t getNumLayers() const override; TextureType getType() const override; TextureDesc::TextureUsage getUsage() const override; uint32_t getSamples() const override; uint32_t getNumMipLevels() const override; uint64_t getTextureId() const override; bool isRequiredGenerateMipmap() const override; void generateMipmap(ICommandQueue& cmdQueue, const TextureRangeDesc* IGL_NULLABLE range = nullptr) const override; void generateMipmap(ICommandBuffer& cmdBuffer, const TextureRangeDesc* IGL_NULLABLE range = nullptr) const override; // IAttachmentInterop interface [[nodiscard]] void* IGL_NULLABLE getNativeImage() const override; [[nodiscard]] void* IGL_NULLABLE getNativeImageView() const override; [[nodiscard]] const base::AttachmentInteropDesc& getDesc() const override; // D3D12-specific accessors (not part of ITexture interface) TextureFormat getFormat() const; ID3D12Resource* getResource() const { return resource_.Get(); } // State transition methods are non-const (state updates not allowed in const methods) void transitionTo(ID3D12GraphicsCommandList* commandList, D3D12_RESOURCE_STATES newState, uint32_t mipLevel = 0, uint32_t layer = 0); void transitionAll(ID3D12GraphicsCommandList* commandList, D3D12_RESOURCE_STATES newState); D3D12_RESOURCE_STATES getSubresourceState(uint32_t mipLevel = 0, uint32_t layer = 0) const; // Texture view support bool isView() const { return isView_; } uint32_t getMipLevelOffset() const { return mipLevelOffset_; } uint32_t getNumMipLevelsInView() const { return numMipLevelsInView_; } uint32_t getArraySliceOffset() const { return arraySliceOffset_; } uint32_t getNumArraySlicesInView() const { return numArraySlicesInView_; } // Subresource calculation helper uint32_t calcSubresourceIndex(uint32_t mipLevel, uint32_t layer) const; protected: // Override the base class upload method Result uploadInternal(TextureType type, const TextureRangeDesc& range, const void* data, size_t bytesPerRow = 0, const uint32_t* mipLevelBytes = nullptr) const override; private: igl::d3d12::ComPtr resource_; ID3D12Device* device_ = nullptr; // Non-owning pointer ID3D12CommandQueue* queue_ = nullptr; // Non-owning pointer. class Device* iglDevice_ = nullptr; // Non-owning pointer to igl::d3d12::Device for upload operations. TextureFormat format_; Dimensions dimensions_{0, 0, 0}; TextureType type_ = TextureType::TwoD; size_t numLayers_ = 1; size_t numMipLevels_ = 1; size_t samples_ = 1; TextureDesc::TextureUsage usage_ = 0; void initializeStateTracking(D3D12_RESOURCE_STATES initialState); // Simplified per-subresource state tracking. // Views delegate state tracking to their root texture; only root textures maintain state. // Always uses a per-subresource vector for simplicity (no dual-mode complexity). std::vector subresourceStates_; // Helper to get the texture that owns state tracking (walks to root for nested views) Texture* getStateOwner() { Texture* owner = this; while (owner->isView_ && owner->parentTexture_) { owner = owner->parentTexture_.get(); } return owner; } const Texture* getStateOwner() const { const Texture* owner = this; while (owner->isView_ && owner->parentTexture_) { owner = owner->parentTexture_.get(); } return owner; } // Texture view support bool isView_ = false; std::shared_ptr parentTexture_; // For views, reference to parent uint32_t mipLevelOffset_ = 0; // MostDetailedMip for SRV uint32_t numMipLevelsInView_ = 0; // MipLevels for SRV uint32_t arraySliceOffset_ = 0; // FirstArraySlice for SRV uint32_t numArraySlicesInView_ = 0; // ArraySize for SRV // Descriptor indices for cleanup in destructor. // These descriptors are allocated from DescriptorHeapManager and must be freed. std::vector rtvIndices_; // RTV descriptors (one per mip level) std::vector dsvIndices_; // DSV descriptors (for depth/stencil textures) uint32_t srvIndex_ = UINT32_MAX; // SRV descriptor (UINT32_MAX = not allocated) mutable base::AttachmentInteropDesc attachmentDesc_; // Cached for IAttachmentInterop::getDesc() }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/TextureCopyUtils.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #include #include #include namespace igl::d3d12::TextureCopyUtils { Result executeCopyTextureToBuffer(D3D12Context& ctx, Device& iglDevice, Texture& srcTex, Buffer& dstBuf, uint64_t destinationOffset, uint32_t mipLevel, uint32_t layer) { ID3D12Resource* srcRes = srcTex.getResource(); ID3D12Resource* dstRes = dstBuf.getResource(); if (!srcRes || !dstRes) { return Result{Result::Code::ArgumentInvalid, "Invalid source or destination resource"}; } ID3D12Device* device = ctx.getDevice(); if (!device) { return Result{Result::Code::RuntimeError, "Device is null"}; } // Get texture description for GetCopyableFootprints D3D12_RESOURCE_DESC srcDesc = srcRes->GetDesc(); // Calculate subresource index const uint32_t subresource = srcTex.calcSubresourceIndex(mipLevel, layer); // Get copyable footprint for this subresource D3D12_PLACED_SUBRESOURCE_FOOTPRINT layout = {}; UINT numRows = 0; UINT64 rowSizeInBytes = 0; UINT64 totalBytes = 0; device->GetCopyableFootprints( &srcDesc, subresource, 1, destinationOffset, &layout, &numRows, &rowSizeInBytes, &totalBytes); // Calculate the unpacked texture data size (without D3D12 padding) // rowSizeInBytes is the unpadded row size, so we can use it directly const UINT64 unpackedDataSize = rowSizeInBytes * numRows * layout.Footprint.Depth; // Check if destination buffer is large enough for the unpacked data if (destinationOffset + unpackedDataSize > dstBuf.getSizeInBytes()) { return Result{Result::Code::ArgumentOutOfRange, "Destination buffer too small"}; } // Use centralized staging device for readback buffer allocation. auto* stagingDevice = iglDevice.getStagingDevice(); if (!stagingDevice) { return Result{Result::Code::RuntimeError, "Staging device not available"}; } // Allocate readback staging buffer (D3D12 requires row-pitch alignment) auto staging = stagingDevice->allocateReadback(layout.Offset + totalBytes); if (!staging.valid) { return Result{Result::Code::RuntimeError, "Failed to allocate readback staging buffer"}; } ID3D12Resource* readbackBuffer = staging.buffer.Get(); ID3D12Resource* copyDestination = readbackBuffer; // Use centralized immediate commands instead of creating transient allocator/list. auto* immediateCommands = iglDevice.getImmediateCommands(); if (!immediateCommands) { return Result{Result::Code::RuntimeError, "Immediate commands not available"}; } Result cmdResult; ID3D12GraphicsCommandList* cmdList = immediateCommands->begin(&cmdResult); if (!cmdList || !cmdResult.isOk()) { return Result{Result::Code::RuntimeError, "Failed to begin immediate command list"}; } // Get current texture state (for restoration after the copy) const D3D12_RESOURCE_STATES srcStateBefore = srcTex.getSubresourceState(mipLevel, layer); // Transition texture to COPY_SOURCE using centralized state tracking so // that subsequent transitions observe a consistent state across all // command lists and avoid BEFORE/AFTER mismatches. srcTex.transitionTo(cmdList, D3D12_RESOURCE_STATE_COPY_SOURCE, mipLevel, layer); // Setup source texture copy location D3D12_TEXTURE_COPY_LOCATION srcLocation = {}; srcLocation.pResource = srcRes; srcLocation.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; srcLocation.SubresourceIndex = subresource; // Setup destination buffer copy location D3D12_TEXTURE_COPY_LOCATION dstLocation = {}; dstLocation.pResource = copyDestination; dstLocation.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT; dstLocation.PlacedFootprint = layout; // Perform the copy cmdList->CopyTextureRegion(&dstLocation, 0, 0, 0, &srcLocation, nullptr); // Transition texture back to original state using the same tracking path. srcTex.transitionTo(cmdList, srcStateBefore, mipLevel, layer); // Submit via immediate commands with synchronous wait. Result submitResult; const uint64_t fenceValue = immediateCommands->submit(true, &submitResult); if (!submitResult.isOk() || fenceValue == 0) { return Result{Result::Code::RuntimeError, "Failed to submit immediate commands: " + submitResult.message}; } // Copy from readback staging buffer to final destination void* readbackData = nullptr; // Map the readback buffer region containing the texture data D3D12_RANGE readRange{static_cast(layout.Offset), static_cast(layout.Offset + totalBytes)}; if (SUCCEEDED(readbackBuffer->Map(0, &readRange, &readbackData)) && readbackData) { // Check if destination buffer is in DEFAULT heap (Storage buffers) // We cannot call map() on DEFAULT heap buffers because Buffer::map() would // create its own staging buffer and copy FROM (empty) DEFAULT buffer first D3D12_HEAP_PROPERTIES heapProps; dstRes->GetHeapProperties(&heapProps, nullptr); const bool isDefaultHeap = (heapProps.Type == D3D12_HEAP_TYPE_DEFAULT); #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE( "copyTextureToBuffer: Destination heap type = %d (1=DEFAULT, 2=UPLOAD, 3=READBACK), " "isDefaultHeap=%d\n", heapProps.Type, isDefaultHeap); #endif if (!isDefaultHeap) { // Destination is CPU-mappable (UPLOAD/READBACK heap) - copy via CPU // Copy row-by-row, removing D3D12's row pitch padding Result mapResult; void* dstData = dstBuf.map(BufferRange(unpackedDataSize, destinationOffset), &mapResult); if (dstData && mapResult.isOk()) { const uint8_t* src = static_cast(readbackData) + layout.Offset; uint8_t* dst = static_cast(dstData); const UINT64 srcRowPitch = layout.Footprint.RowPitch; const UINT64 dstRowPitch = rowSizeInBytes; // Unpadded row size for (UINT z = 0; z < layout.Footprint.Depth; ++z) { for (UINT row = 0; row < numRows; ++row) { std::memcpy(dst, src, dstRowPitch); src += srcRowPitch; dst += dstRowPitch; } } dstBuf.unmap(); } else { readbackBuffer->Unmap(0, nullptr); return Result{Result::Code::RuntimeError, "Failed to map destination buffer"}; } } else { // Destination is NOT CPU-mappable (DEFAULT heap) - need GPU copy // Create temporary UPLOAD buffer with unpacked data, then GPU copy to destination D3D12_HEAP_PROPERTIES uploadHeap{}; uploadHeap.Type = D3D12_HEAP_TYPE_UPLOAD; D3D12_RESOURCE_DESC uploadDesc{}; uploadDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; uploadDesc.Width = unpackedDataSize; uploadDesc.Height = 1; uploadDesc.DepthOrArraySize = 1; uploadDesc.MipLevels = 1; uploadDesc.Format = DXGI_FORMAT_UNKNOWN; uploadDesc.SampleDesc.Count = 1; uploadDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; igl::d3d12::ComPtr uploadBuffer; HRESULT hr = device->CreateCommittedResource(&uploadHeap, D3D12_HEAP_FLAG_NONE, &uploadDesc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(uploadBuffer.GetAddressOf())); if (FAILED(hr)) { readbackBuffer->Unmap(0, nullptr); return Result{Result::Code::RuntimeError, "Failed to create upload buffer"}; } // Map upload buffer and unpack data from readback void* uploadData = nullptr; if (SUCCEEDED(uploadBuffer->Map(0, nullptr, &uploadData)) && uploadData) { const uint8_t* src = static_cast(readbackData) + layout.Offset; uint8_t* dst = static_cast(uploadData); const UINT64 srcRowPitch = layout.Footprint.RowPitch; const UINT64 dstRowPitch = rowSizeInBytes; for (UINT z = 0; z < layout.Footprint.Depth; ++z) { for (UINT row = 0; row < numRows; ++row) { std::memcpy(dst, src, dstRowPitch); src += srcRowPitch; dst += dstRowPitch; } } uploadBuffer->Unmap(0, nullptr); // GPU copy from upload buffer to destination DEFAULT buffer using immediate commands. Result gpuCopyResult; ID3D12GraphicsCommandList* copyList = immediateCommands->begin(&gpuCopyResult); if (!copyList || !gpuCopyResult.isOk()) { readbackBuffer->Unmap(0, nullptr); return Result{Result::Code::RuntimeError, "Failed to begin immediate command list for GPU copy"}; } // Transition destination buffer to COPY_DEST state D3D12_RESOURCE_BARRIER barrier = {}; barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; barrier.Transition.pResource = dstRes; barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_COMMON; barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_COPY_DEST; copyList->ResourceBarrier(1, &barrier); // Copy unpacked data to destination #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE( "copyTextureToBuffer: GPU copy %llu bytes from upload buffer to DEFAULT buffer at " "offset %llu\n", unpackedDataSize, destinationOffset); #endif copyList->CopyBufferRegion( dstRes, destinationOffset, uploadBuffer.Get(), 0, unpackedDataSize); // Transition destination buffer back to UAV state (Storage buffer) barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_COPY_DEST; barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_UNORDERED_ACCESS; copyList->ResourceBarrier(1, &barrier); // Submit and wait for GPU copy. Result copySubmitResult; const uint64_t copyFenceValue = immediateCommands->submit(true, ©SubmitResult); #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE("copyTextureToBuffer: GPU copy complete!\n"); #endif if (!copySubmitResult.isOk() || copyFenceValue == 0) { readbackBuffer->Unmap(0, nullptr); return Result{Result::Code::RuntimeError, "Failed to submit GPU copy: " + copySubmitResult.message}; } } else { readbackBuffer->Unmap(0, nullptr); return Result{Result::Code::RuntimeError, "Failed to map upload buffer"}; } } readbackBuffer->Unmap(0, nullptr); } else { return Result{Result::Code::RuntimeError, "Failed to map readback buffer"}; } // Return staging buffer to pool. stagingDevice->free(staging, fenceValue); return Result{}; } } // namespace igl::d3d12::TextureCopyUtils ================================================ FILE: src/igl/d3d12/TextureCopyUtils.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include struct ID3D12Device; struct ID3D12CommandQueue; struct ID3D12Resource; namespace igl::d3d12 { class D3D12Context; class Device; class Texture; class Buffer; namespace TextureCopyUtils { /** * Executes a texture-to-buffer copy operation. * Handles D3D12 row-pitch alignment, readback staging, and unpacking. * * @param ctx D3D12 context for device/queue access * @param iglDevice IGL device for command allocator pooling * @param srcTex Source texture to copy from * @param dstBuf Destination buffer to copy to * @param destinationOffset Offset in bytes into destination buffer * @param mipLevel Mipmap level to copy from source texture * @param layer Array layer to copy from source texture * @return Result indicating success or failure */ [[nodiscard]] Result executeCopyTextureToBuffer(D3D12Context& ctx, Device& iglDevice, Texture& srcTex, Buffer& dstBuf, uint64_t destinationOffset, uint32_t mipLevel, uint32_t layer); } // namespace TextureCopyUtils } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/Timer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace igl::d3d12 { Timer::Timer(const Device& device) { auto& ctx = device.getD3D12Context(); auto* d3dDevice = ctx.getDevice(); auto* commandQueue = ctx.getCommandQueue(); // Query GPU timestamp frequency // This returns the number of ticks per second for GPU timestamps HRESULT hr = commandQueue->GetTimestampFrequency(×tampFrequency_); if (FAILED(hr)) { IGL_LOG_ERROR("Timer: Failed to get timestamp frequency (0x%08X). Timer disabled.\n", hr); resourceCreationFailed_ = true; timestampFrequency_ = 0; // Leave at 0 to indicate timer is disabled return; } // Create query heap for 2 timestamps (begin and end). // Use D3D12_QUERY_HEAP_TYPE_TIMESTAMP for GPU timer queries. D3D12_QUERY_HEAP_DESC queryHeapDesc = {}; queryHeapDesc.Type = D3D12_QUERY_HEAP_TYPE_TIMESTAMP; queryHeapDesc.Count = 2; // Begin and end timestamps queryHeapDesc.NodeMask = 0; // Single GPU hr = d3dDevice->CreateQueryHeap(&queryHeapDesc, IID_PPV_ARGS(queryHeap_.GetAddressOf())); if (FAILED(hr)) { IGL_LOG_ERROR("Timer: Failed to create query heap (0x%08X). Timer disabled.\n", hr); resourceCreationFailed_ = true; timestampFrequency_ = 0; return; } // Create readback buffer to hold query results // Must use READBACK heap type for CPU access D3D12_HEAP_PROPERTIES heapProps = {}; heapProps.Type = D3D12_HEAP_TYPE_READBACK; heapProps.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; heapProps.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; heapProps.CreationNodeMask = 1; heapProps.VisibleNodeMask = 1; D3D12_RESOURCE_DESC resourceDesc = {}; resourceDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; resourceDesc.Alignment = 0; resourceDesc.Width = 2 * sizeof(uint64_t); // Space for 2 timestamps resourceDesc.Height = 1; resourceDesc.DepthOrArraySize = 1; resourceDesc.MipLevels = 1; resourceDesc.Format = DXGI_FORMAT_UNKNOWN; resourceDesc.SampleDesc.Count = 1; resourceDesc.SampleDesc.Quality = 0; resourceDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; resourceDesc.Flags = D3D12_RESOURCE_FLAG_NONE; hr = d3dDevice->CreateCommittedResource(&heapProps, D3D12_HEAP_FLAG_NONE, &resourceDesc, D3D12_RESOURCE_STATE_COPY_DEST, // Readback buffers must // be in COPY_DEST state nullptr, IID_PPV_ARGS(readbackBuffer_.GetAddressOf())); if (FAILED(hr)) { IGL_LOG_ERROR("Timer: Failed to create readback buffer (0x%08X). Timer disabled.\n", hr); resourceCreationFailed_ = true; timestampFrequency_ = 0; queryHeap_.Reset(); // Clean up partially created resources return; } #ifdef IGL_DEBUG IGL_D3D12_LOG_VERBOSE("Timer: Created successfully (frequency: %llu Hz)\n", timestampFrequency_); #endif } Timer::~Timer() { // ComPtr handles cleanup automatically } void Timer::begin(ID3D12GraphicsCommandList* commandList) { if (resourceCreationFailed_ || timestampFrequency_ == 0) { // Timer disabled due to resource creation or frequency query failure - silently no-op return; } if (!commandList) { IGL_LOG_ERROR("Timer::begin() called with null command list\n"); return; } // Record begin timestamp (index 0) at the start of GPU work. // This is a bottom-of-pipe operation that samples when the GPU finishes preceding work. commandList->EndQuery(queryHeap_.Get(), D3D12_QUERY_TYPE_TIMESTAMP, 0); } void Timer::end(ID3D12GraphicsCommandList* commandList, ID3D12Fence* fence, uint64_t fenceValue) { if (resourceCreationFailed_ || timestampFrequency_ == 0) { // Timer disabled - silently no-op return; } if (!commandList) { IGL_LOG_ERROR("Timer::end() called with null command list\n"); return; } if (!fence) { IGL_LOG_ERROR("Timer::end() called with null fence\n"); return; } if (ended_.load(std::memory_order_acquire)) { IGL_LOG_ERROR("Timer::end() called multiple times\n"); return; } // Record end timestamp (index 1) at the end of GPU work. // Bottom-of-pipe operation: samples when the GPU finishes all preceding work. commandList->EndQuery(queryHeap_.Get(), D3D12_QUERY_TYPE_TIMESTAMP, 1); // Resolve query data to the readback buffer. // This GPU command copies timestamp values from the query heap to a CPU-readable buffer; // the resolved data is only valid after the fence signals completion. commandList->ResolveQueryData(queryHeap_.Get(), D3D12_QUERY_TYPE_TIMESTAMP, 0, // Start index 2, // Count (begin + end) readbackBuffer_.Get(), 0 // Destination offset ); // Store fence and fence value for later completion checking. // Thread-safe: fence_ is written once; atomics ensure visibility. fence_ = fence; fenceValue_.store(fenceValue, std::memory_order_release); ended_.store(true, std::memory_order_release); } uint64_t Timer::getElapsedTimeNanos() const { if (!readbackBuffer_.Get() || !ended_.load(std::memory_order_acquire)) { return 0; } // Check if the fence has signaled; results are only valid after GPU completes. // Thread-safe: fence_ is set once before the ended_ flag, and memory ordering ensures visibility. uint64_t fenceVal = fenceValue_.load(std::memory_order_acquire); if (!fence_ || fence_->GetCompletedValue() < fenceVal) { return 0; // GPU hasn't finished yet, return 0 } // If we've already resolved and cached the result, return it. // Thread-safe: resolved_ flag prevents multiple threads from mapping simultaneously. if (resolved_.load(std::memory_order_acquire)) { return cachedElapsedNanos_.load(std::memory_order_relaxed); } // GPU has completed; it is now safe to read the query results. // Map the readback buffer to read timestamp values. void* mappedData = nullptr; D3D12_RANGE readRange{0, sizeof(uint64_t) * 2}; // Only read the 2 timestamps HRESULT hr = readbackBuffer_->Map(0, &readRange, &mappedData); if (FAILED(hr)) { IGL_LOG_ERROR("Timer: Failed to map readback buffer: 0x%08X\n", hr); return 0; } // Read timestamp values const auto* timestamps = static_cast(mappedData); uint64_t beginTime = timestamps[0]; uint64_t endTime = timestamps[1]; // Unmap buffer D3D12_RANGE writeRange{0, 0}; // No writes readbackBuffer_->Unmap(0, &writeRange); // Validate timestamp data if (endTime <= beginTime) { #ifdef IGL_DEBUG IGL_LOG_ERROR( "Timer: Invalid timestamp data (begin=%llu, end=%llu) - GPU work may not have executed\n", beginTime, endTime); #endif return 0; } if (timestampFrequency_ == 0) { #ifdef IGL_DEBUG IGL_LOG_ERROR("Timer: Invalid timestamp frequency (0 Hz) - timer disabled\n"); #endif return 0; } // Calculate elapsed time in GPU ticks uint64_t deltaTicks = endTime - beginTime; // Convert ticks to nanoseconds using floating-point math for accuracy, // as recommended by Microsoft docs: nanoseconds = (ticks / frequency) * 1,000,000,000. const double nanosPerSecond = 1000000000.0; double elapsedNanos = (static_cast(deltaTicks) / static_cast(timestampFrequency_)) * nanosPerSecond; // Cache the result so we don't re-read from GPU. // Thread-safe: store cached value before setting the resolved flag. cachedElapsedNanos_.store(static_cast(elapsedNanos), std::memory_order_release); resolved_.store(true, std::memory_order_release); return static_cast(elapsedNanos); } bool Timer::resultsAvailable() const { // Results are available only after the fence has signaled completion. // This ensures we don't read uninitialized or garbage data from the query heap. // Thread-safe: use atomic loads with proper memory ordering. if (!ended_.load(std::memory_order_acquire) || !fence_) { return false; } // Check if GPU has completed execution (fence signaled) uint64_t fenceVal = fenceValue_.load(std::memory_order_acquire); return fence_->GetCompletedValue() >= fenceVal; } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/Timer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::d3d12 { class Device; /// @brief GPU timer implementation using D3D12 timestamp queries /// @details Implements ITimer interface for D3D12 backend using query heaps. /// /// Lifecycle: /// - Constructor creates query heap and readback buffer resources /// - begin() called when command list is reset for recording (CommandBuffer::begin()) /// - GPU work is encoded in the command list /// - end() called during submission before command list is closed (CommandQueue::submit()) /// - Query results are fence-synchronized and only read after GPU completes /// /// Cross-platform timestamp semantics /// ---------------------------------- /// All timestamps returned by getElapsedTimeNanos() are in nanoseconds, providing /// cross-platform consistency with Vulkan and other backends. /// /// D3D12 GPU timestamps are automatically converted from hardware ticks to nanoseconds /// using the GPU timestamp frequency (ID3D12CommandQueue::GetTimestampFrequency()). /// /// Formula: elapsedNanos = (endTicks - startTicks) * 1,000,000,000 / frequencyHz. /// /// This ensures consistent timing across all IGL backends regardless of hardware. /// /// The implementation measures GPU execution time via timestamp placement /// and fence-synchronized readback, and is safe for cross-thread queries. class Timer final : public ITimer { public: /// @brief Constructor - creates query heap and readback buffer, starts timer /// @param device D3D12 device used to create resources explicit Timer(const Device& device); ~Timer() override; Timer(const Timer&) = delete; Timer& operator=(const Timer&) = delete; Timer(Timer&&) = delete; Timer& operator=(Timer&&) = delete; /// @brief Record start timestamp in command list /// @param commandList D3D12 command list to record start timestamp void begin(ID3D12GraphicsCommandList* commandList); /// @brief Record end timestamp and associate with fence value /// @param commandList D3D12 command list to record end timestamp and resolve queries /// @param fence Fence to check for GPU completion /// @param fenceValue Fence value that will be signaled when GPU completes void end(ID3D12GraphicsCommandList* commandList, ID3D12Fence* fence, uint64_t fenceValue); /// @brief Returns elapsed GPU time in nanoseconds /// @return Elapsed time in nanoseconds, or 0 if results not yet available [[nodiscard]] uint64_t getElapsedTimeNanos() const override; /// @brief Check if timer results are available /// @return true if results can be read without blocking (fence has signaled) [[nodiscard]] bool resultsAvailable() const override; private: igl::d3d12::ComPtr queryHeap_; igl::d3d12::ComPtr readbackBuffer_; uint64_t timestampFrequency_ = 0; // GPU timestamp frequency (ticks per second), 0 = timer disabled bool resourceCreationFailed_ = false; // Track if constructor failed to create resources // Fence synchronization for accurate GPU timing. // Thread-safe: use atomics to allow safe cross-thread queries. ID3D12Fence* fence_ = nullptr; // Fence to check completion (not owned, set once in end()) std::atomic fenceValue_{0}; // Fence value when timer ended mutable std::atomic resolved_{false}; // Has query data been resolved and cached? (mutable // for lazy resolution in const getter) std::atomic ended_{false}; // Has end() been called? // Cached results to avoid re-reading from GPU. // Thread-safe: only written once after the fence signals, then immutable (mutable for lazy // resolution in const getter). mutable std::atomic cachedElapsedNanos_{0}; }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/UploadRingBuffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace igl::d3d12 { UploadRingBuffer::UploadRingBuffer(ID3D12Device* device, uint64_t size) : device_(device), size_(size) { if (!device_) { IGL_LOG_ERROR("UploadRingBuffer: Device is null\n"); return; } // Create large upload heap D3D12_HEAP_PROPERTIES uploadHeapProps = {}; uploadHeapProps.Type = D3D12_HEAP_TYPE_UPLOAD; uploadHeapProps.CreationNodeMask = 1; uploadHeapProps.VisibleNodeMask = 1; D3D12_RESOURCE_DESC bufferDesc = {}; bufferDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; bufferDesc.Alignment = 0; bufferDesc.Width = size_; bufferDesc.Height = 1; bufferDesc.DepthOrArraySize = 1; bufferDesc.MipLevels = 1; bufferDesc.Format = DXGI_FORMAT_UNKNOWN; bufferDesc.SampleDesc.Count = 1; bufferDesc.SampleDesc.Quality = 0; bufferDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; bufferDesc.Flags = D3D12_RESOURCE_FLAG_NONE; HRESULT hr = device_->CreateCommittedResource(&uploadHeapProps, D3D12_HEAP_FLAG_NONE, &bufferDesc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(uploadHeap_.GetAddressOf())); if (FAILED(hr)) { IGL_LOG_ERROR("UploadRingBuffer: Failed to create upload heap (HRESULT=0x%08X)\n", hr); return; } // Map the entire buffer persistently D3D12_RANGE readRange = {0, 0}; // Not reading from GPU hr = uploadHeap_->Map(0, &readRange, &cpuBase_); if (FAILED(hr)) { IGL_LOG_ERROR("UploadRingBuffer: Failed to map upload heap (HRESULT=0x%08X)\n", hr); cpuBase_ = nullptr; return; } gpuBase_ = uploadHeap_->GetGPUVirtualAddress(); IGL_D3D12_LOG_VERBOSE( "UploadRingBuffer: Created ring buffer (size=%llu MB, cpuBase=%p, gpuBase=0x%llX)\n", size_ / (1024 * 1024), cpuBase_, gpuBase_); // Track resource creation D3D12Context::trackResourceCreation("UploadRingBuffer", size_); } UploadRingBuffer::~UploadRingBuffer() { if (uploadHeap_.Get() && cpuBase_) { uploadHeap_->Unmap(0, nullptr); cpuBase_ = nullptr; } if (uploadHeap_.Get()) { // Track resource destruction D3D12Context::trackResourceDestruction("UploadRingBuffer", size_); } IGL_D3D12_LOG_VERBOSE("UploadRingBuffer: Destroyed (allocations=%llu, failures=%llu)\n", allocationCount_, failureCount_); } UploadRingBuffer::Allocation UploadRingBuffer::allocate(uint64_t size, uint64_t alignment, uint64_t fenceValue) { std::lock_guard lock(mutex_); if (!uploadHeap_.Get() || !cpuBase_) { IGL_LOG_ERROR("UploadRingBuffer::allocate: Ring buffer not initialized\n"); failureCount_++; return Allocation{}; } if (size == 0) { IGL_LOG_ERROR("UploadRingBuffer::allocate: Size is zero\n"); failureCount_++; return Allocation{}; } // Align size up for proper alignment of next allocation const uint64_t alignedSize = alignUp(size, alignment); // Invariants (all protected by mutex_): // - head_ is the next free offset where a new allocation can start // - tail_ is the offset of the oldest in-flight allocation (or equals head_ when empty) // - pendingAllocations_ is a queue of all in-flight allocations in submission order // - When pendingAllocations_.empty(), the entire buffer is free: tail_ == head_ const bool bufferEmpty = pendingAllocations_.empty(); const uint64_t currentHead = head_; const uint64_t currentTail = bufferEmpty ? currentHead : tail_; // Detect full ring: head == tail with in-flight allocations means buffer is completely occupied const bool bufferFull = !bufferEmpty && (currentHead == currentTail); if (bufferFull) { // Ring buffer is completely full - no free space available failureCount_++; IGL_D3D12_LOG_VERBOSE("UploadRingBuffer: Ring buffer completely full (size=%llu)\n", size_); return Allocation{}; } // Align head to requested alignment const uint64_t alignedHead = alignUp(currentHead, alignment); // Determine available free space based on buffer state // When empty: entire buffer is available starting from head_ // When head > tail: in-flight region spans [tail, head); free space is [head, size_) and [0, // tail) When head < tail: in-flight region spans [tail, size_) + [0, head); free space is [head, // tail) bool canFit = false; uint64_t allocationOffset = alignedHead; if (bufferEmpty) { // Entire buffer is free if (alignedHead + alignedSize <= size_) { canFit = true; allocationOffset = alignedHead; } else if (alignedSize <= size_) { // Wrap to beginning allocationOffset = 0; canFit = true; } } else if (currentHead >= currentTail) { // In-flight allocations have wrapped around: free regions are [head, size_) and [0, tail) if (alignedHead + alignedSize <= size_) { // Fits at current head position canFit = true; allocationOffset = alignedHead; } else if (alignedSize <= currentTail) { // Wrap around to beginning allocationOffset = 0; canFit = true; } } else { // In-flight allocations have not wrapped: free space is [head, tail) if (alignedHead + alignedSize <= currentTail) { canFit = true; allocationOffset = alignedHead; } } if (!canFit) { // Not enough space - caller will fall back to dedicated staging buffer // This is expected behavior when ring is full, not an error condition // Note: failureCount_ tracks ring-full events as a diagnostic metric, not errors failureCount_++; IGL_D3D12_LOG_VERBOSE( "UploadRingBuffer: Insufficient space (request=%llu, approx used=%llu/%llu)\n", alignedSize, getUsedSizeUnlocked(), size_); return Allocation{}; } // Final validation: ensure allocation doesn't overlap with in-flight allocations const uint64_t allocationEnd = allocationOffset + alignedSize; #ifdef _DEBUG // Debug: verify allocation doesn't overlap with in-flight allocations if (!bufferEmpty) { if (allocationOffset == 0) { // Wraparound case: ensure we don't exceed tail IGL_DEBUG_ASSERT(allocationEnd <= currentTail, "UploadRingBuffer: Allocation [0, %llu) would overlap tail at %llu", allocationEnd, currentTail); } else if (currentHead >= currentTail) { // In-flight region wrapped: allocation should be in free region [head, size_) IGL_DEBUG_ASSERT(allocationOffset >= currentHead && allocationEnd <= size_, "UploadRingBuffer: Allocation [%llu, %llu) outside free region [%llu, %llu)", allocationOffset, allocationEnd, currentHead, size_); } else { // In-flight region not wrapped: allocation should be in free region [head, tail) IGL_DEBUG_ASSERT(allocationOffset >= currentHead && allocationEnd <= currentTail, "UploadRingBuffer: Allocation [%llu, %llu) outside free region [%llu, %llu)", allocationOffset, allocationEnd, currentHead, currentTail); } } #endif // Create allocation. Allocation allocation; allocation.buffer = uploadHeap_; allocation.cpuAddress = static_cast(cpuBase_) + allocationOffset; allocation.gpuAddress = gpuBase_ + allocationOffset; allocation.offset = allocationOffset; allocation.size = alignedSize; allocation.valid = true; // Track pending allocation for retirement pendingAllocations_.push({allocationOffset, alignedSize, fenceValue}); // Update head pointer uint64_t newHead = allocationOffset + alignedSize; if (newHead >= size_) { newHead = 0; // Wrap around } head_ = newHead; // Update tail_ for first allocation when buffer transitions from empty if (bufferEmpty) { tail_ = allocationOffset; } allocationCount_++; #ifdef _DEBUG // Debug validation: ensure invariants hold after allocation IGL_DEBUG_ASSERT(newHead <= size_, "Head exceeded buffer size!"); IGL_DEBUG_ASSERT(!pendingAllocations_.empty() || head_ == tail_, "Buffer should have pending allocations or head == tail"); // Validate that used size is reasonable (use unlocked helper since we hold mutex_) const uint64_t usedSize = getUsedSizeUnlocked(); IGL_DEBUG_ASSERT(usedSize <= size_, "Used size %llu exceeds buffer size %llu", usedSize, size_); #endif return allocation; } void UploadRingBuffer::retire(uint64_t completedFenceValue) { std::lock_guard lock(mutex_); // Process all pending allocations that have completed while (!pendingAllocations_.empty()) { const auto& pending = pendingAllocations_.front(); if (pending.fenceValue > completedFenceValue) { // This and all subsequent allocations are still pending break; } // This allocation has completed, reclaim the memory pendingAllocations_.pop(); // Update tail_ to point to the next oldest allocation, or to head_ if buffer is now empty if (!pendingAllocations_.empty()) { tail_ = pendingAllocations_.front().offset; } else { // Buffer is now empty: reset tail to head to maintain invariant tail_ = head_; } } #ifdef _DEBUG // Validate invariant: when empty, tail == head if (pendingAllocations_.empty()) { IGL_DEBUG_ASSERT(tail_ == head_, "Buffer empty but tail (%llu) != head (%llu)", tail_, head_); } #endif } uint64_t UploadRingBuffer::getUsedSizeUnlocked() const { // Note: Caller must hold mutex_ if (head_ >= tail_) { return head_ - tail_; } else { return (size_ - tail_) + head_; } } uint64_t UploadRingBuffer::getUsedSize() const { std::lock_guard lock(mutex_); return getUsedSizeUnlocked(); } } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/UploadRingBuffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::d3d12 { /** * @brief Upload ring buffer for streaming resources. * * Manages a large staging buffer (64-256MB) for efficient resource uploads. * Implements a ring buffer pattern with fence-based memory retirement to * reduce allocator churn and memory fragmentation. * * Key features: * - Large pre-allocated upload heap * - Linear sub-allocation with wraparound * - Fence-based memory retirement and recycling * - Thread-safe allocation */ class UploadRingBuffer { public: /** * @brief Represents a sub-allocation from the ring buffer */ struct Allocation { igl::d3d12::ComPtr buffer; // Underlying buffer resource. void* cpuAddress = nullptr; // CPU-visible mapped address D3D12_GPU_VIRTUAL_ADDRESS gpuAddress = 0; // GPU virtual address uint64_t offset = 0; // Offset within ring buffer uint64_t size = 0; // Size of allocation bool valid = false; // Whether allocation succeeded }; /** * @brief Constructs an upload ring buffer * @param device D3D12 device for resource creation * @param size Total size of ring buffer (default: 128MB) * * T14: Default value (128MB) matches D3D12ContextConfig::defaultConfig().uploadRingBufferSize. * In production, call sites pass D3D12ContextConfig::uploadRingBufferSize explicitly so the * ring size is driven by the active context configuration rather than this default. */ explicit UploadRingBuffer(ID3D12Device* device, uint64_t size = 128 * 1024 * 1024); ~UploadRingBuffer(); // Non-copyable UploadRingBuffer(const UploadRingBuffer&) = delete; UploadRingBuffer& operator=(const UploadRingBuffer&) = delete; /** * @brief Allocates staging memory from the ring buffer * @param size Size in bytes to allocate * @param alignment Alignment requirement (e.g., 256 for constant buffers) * @param fenceValue Fence value when this allocation will be retired * @return Allocation structure (check valid flag for success) * * Note: If allocation fails due to insufficient space, returns invalid allocation. * Caller should fall back to creating a dedicated staging buffer. */ Allocation allocate(uint64_t size, uint64_t alignment, uint64_t fenceValue); /** * @brief Retires allocations that have completed on GPU * @param completedFenceValue Fence value that has been signaled by GPU * * Reclaims memory from allocations associated with fence values <= completedFenceValue. * This allows the ring buffer to wrap around and reuse memory. */ void retire(uint64_t completedFenceValue); /** * @brief Gets total size of ring buffer */ uint64_t getTotalSize() const { return size_; } /** * @brief Gets estimated used size based on head/tail distance (for diagnostics) * * Note: Returns approximate usage; does not account for internal alignment gaps. * Returns 0 when buffer is empty (tail == head with no pending allocations). * Also returns 0 when buffer is completely full (tail == head with pending allocations); * use pendingAllocations or getFailureCount() to distinguish empty vs. full states. */ uint64_t getUsedSize() const; /** * @brief Gets number of allocations made (for performance metrics) */ uint64_t getAllocationCount() const { return allocationCount_; } /** * @brief Gets number of times allocation could not be satisfied from ring buffer (for metrics) * * Note: This counts ring-full events where callers fall back to dedicated staging buffers, * not error conditions. It is a diagnostic metric for ring buffer utilization. */ uint64_t getFailureCount() const { return failureCount_; } /** * @brief Gets the underlying upload heap resource (for copy operations) */ ID3D12Resource* getUploadHeap() const { return uploadHeap_.Get(); } private: /** * @brief Represents a pending allocation waiting for GPU completion */ struct PendingAllocation { uint64_t offset; // Start offset in ring buffer uint64_t size; // Size of allocation uint64_t fenceValue; // Fence value when allocation can be retired }; /** * @brief Aligns value up to specified alignment */ static uint64_t alignUp(uint64_t value, uint64_t alignment) { return (value + alignment - 1) & ~(alignment - 1); } /** * @brief Internal helper to compute used size without locking * @note Caller must hold mutex_ * @note Returns 0 when head == tail (both empty and full states) */ uint64_t getUsedSizeUnlocked() const; ID3D12Device* device_ = nullptr; igl::d3d12::ComPtr uploadHeap_; void* cpuBase_ = nullptr; // CPU-mapped base address D3D12_GPU_VIRTUAL_ADDRESS gpuBase_ = 0; // GPU base address uint64_t size_ = 0; // Total ring buffer size uint64_t head_ = 0; // Next free offset for new allocations (protected by mutex_) uint64_t tail_ = 0; // Offset of oldest in-flight allocation; equals head_ when empty (protected by mutex_) std::queue pendingAllocations_; // Allocations waiting for GPU mutable std::mutex mutex_; // Thread safety // Metrics uint64_t allocationCount_ = 0; uint64_t failureCount_ = 0; }; } // namespace igl::d3d12 ================================================ FILE: src/igl/d3d12/VertexInputState.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::d3d12 { class VertexInputState final : public IVertexInputState { public: explicit VertexInputState(const VertexInputStateDesc& desc) : desc_(desc) {} ~VertexInputState() override = default; const VertexInputStateDesc& getDesc() const { return desc_; } private: VertexInputStateDesc desc_; }; } // namespace igl::d3d12 ================================================ FILE: src/igl/glslang/CMakeLists.txt ================================================ # Copyright (c) Meta Platforms, Inc. and affiliates. # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. cmake_minimum_required(VERSION 3.19) project(IGLGlslang CXX C) file(GLOB SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp *.c) file(GLOB HEADER_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.h) add_library(IGLGlslang ${SRC_FILES} ${HEADER_FILES}) target_link_libraries(IGLGlslang PRIVATE IGLLibrary) igl_set_cxxstd(IGLGlslang 17) igl_set_folder(IGLGlslang "IGL") # glslang # cmake-format: off set(ENABLE_GLSLANG_BINARIES OFF CACHE BOOL "") set(ENABLE_HLSL OFF CACHE BOOL "") set(ENABLE_CTEST OFF CACHE BOOL "") set(ENABLE_OPT OFF CACHE BOOL "") set(ENABLE_SPVREMAPPER OFF CACHE BOOL "") set(SKIP_GLSLANG_INSTALL ON CACHE BOOL "") add_subdirectory(${IGL_ROOT_DIR}/third-party/deps/src/glslang "glslang") igl_set_folder(GenericCodeGen "third-party/glslang") igl_set_folder(glslang "third-party/glslang") igl_set_folder(MachineIndependent "third-party/glslang") igl_set_folder(OSDependent "third-party/glslang") igl_set_folder(SPIRV "third-party/glslang") igl_set_folder(glslang-default-resource-limits "third-party/glslang") # cmake-format: on target_link_libraries(IGLGlslang PUBLIC glslang SPIRV glslang-default-resource-limits) # explicit include directories for glslang headers target_include_directories(IGLGlslang PRIVATE "${IGL_ROOT_DIR}/third-party/deps/src/glslang" "${IGL_ROOT_DIR}/third-party/deps/src/glslang/glslang/Include") if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") target_compile_options(IGLGlslang PRIVATE "-Wno-nullability-completeness") target_compile_options(MachineIndependent PRIVATE "-Wno-unused-but-set-variable") endif() ================================================ FILE: src/igl/glslang/GlslCompiler.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include namespace igl::glslang { namespace { [[nodiscard]] glslang_stage_t getGLSLangShaderStage(ShaderStage stage) noexcept { switch (stage) { case igl::ShaderStage::Vertex: return GLSLANG_STAGE_VERTEX; case igl::ShaderStage::Fragment: return GLSLANG_STAGE_FRAGMENT; case igl::ShaderStage::Compute: return GLSLANG_STAGE_COMPUTE; case igl::ShaderStage::Task: return GLSLANG_STAGE_TASK; case igl::ShaderStage::Mesh: return GLSLANG_STAGE_MESH; default: IGL_DEBUG_ABORT("Not supported shader stage (%d)", static_cast(stage)); }; return GLSLANG_STAGE_COUNT; } // Logs GLSL shaders with line numbers annotation void logShaderSource(const char* text) { #if IGL_LOGGING_ENABLED uint32_t line = 1; // IGLLog on Android also writes a new line, // so to make things easier to read separate out the Android logging #if IGL_PLATFORM_ANDROID std::string outputLine = ""; while (text && *text) { if (*text == '\n') { // Write out the line along with the line number, and reset the line IGL_LOG_INFO("(%3u) %s", line++, outputLine.c_str()); outputLine = ""; } else if (*text == '\r') { // skip it } else { outputLine += *text; } text++; } IGL_LOG_INFO(""); #else IGL_LOG_INFO("\n(%3u) ", line); while (text && *text) { if (*text == '\n') { IGL_LOG_INFO("\n(%3u) ", ++line); } else if (*text == '\r') { // skip it to support Windows/UNIX EOLs } else { IGL_LOG_INFO("%c", *text); } text++; } IGL_LOG_INFO("\n"); #endif #endif } } // namespace void initializeCompiler() noexcept { glslang_initialize_process(); } Result compileShader(ShaderStage stage, const char* code, std::vector& outSPIRV, const glslang_resource_t* glslLangResource) noexcept { IGL_PROFILER_FUNCTION(); glslang_input_t input{}; glslangGetDefaultInput(code, getGLSLangShaderStage(stage), glslLangResource, &input); glslang_shader_t* shader = glslang_shader_create(&input); IGL_SCOPE_EXIT { glslang_shader_delete(shader); }; if (!glslang_shader_preprocess(shader, &input)) { IGL_LOG_ERROR("Shader preprocessing failed:\n"); IGL_LOG_ERROR(" %s\n", glslang_shader_get_info_log(shader)); IGL_LOG_ERROR(" %s\n", glslang_shader_get_info_debug_log(shader)); logShaderSource(code); IGL_DEBUG_ABORT("glslang_shader_preprocess() failed"); return Result(Result::Code::InvalidOperation, "glslang_shader_preprocess() failed"); } if (!glslang_shader_parse(shader, &input)) { IGL_LOG_ERROR("Shader parsing failed:\n"); IGL_LOG_ERROR(" %s\n", glslang_shader_get_info_log(shader)); IGL_LOG_ERROR(" %s\n", glslang_shader_get_info_debug_log(shader)); logShaderSource(glslang_shader_get_preprocessed_code(shader)); IGL_DEBUG_ABORT("glslang_shader_parse() failed"); return Result(Result::Code::InvalidOperation, "glslang_shader_parse() failed"); } glslang_program_t* program = glslang_program_create(); glslang_program_add_shader(program, shader); IGL_SCOPE_EXIT { glslang_program_delete(program); }; if (!glslang_program_link(program, GLSLANG_MSG_SPV_RULES_BIT | GLSLANG_MSG_VULKAN_RULES_BIT)) { IGL_LOG_ERROR("Shader linking failed:\n"); IGL_LOG_ERROR(" %s\n", glslang_program_get_info_log(program)); IGL_LOG_ERROR(" %s\n", glslang_program_get_info_debug_log(program)); IGL_DEBUG_ABORT("glslang_program_link() failed"); return Result(Result::Code::InvalidOperation, "glslang_program_link() failed"); } glslang_spv_options_t options = { /* .generate_debug_info = */ true, /* .strip_debug_info = */ false, /* .disable_optimizer = */ false, /* .optimize_size = */ true, /* .disassemble = */ false, /* .validate = */ true, /* .emit_nonsemantic_shader_debug_info = */ false, /* .emit_nonsemantic_shader_debug_source = */ false, }; glslang_program_SPIRV_generate_with_options(program, input.stage, &options); if (glslang_program_SPIRV_get_messages(program)) { IGL_LOG_ERROR("%s\n", glslang_program_SPIRV_get_messages(program)); } const unsigned int* codePtr = glslang_program_SPIRV_get_ptr(program); outSPIRV = std::vector(codePtr, codePtr + glslang_program_SPIRV_get_size(program)); return Result(); } void finalizeCompiler() noexcept { glslang_finalize_process(); } } // namespace igl::glslang ================================================ FILE: src/igl/glslang/GlslCompiler.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::glslang { void initializeCompiler() noexcept; /// Compiles the given shader code into SPIR-V. [[nodiscard]] Result compileShader(ShaderStage stage, const char* code, std::vector& outSPIRV, const glslang_resource_t* glslLangResource) noexcept; void finalizeCompiler() noexcept; } // namespace igl::glslang ================================================ FILE: src/igl/glslang/GlslangHelpers.c ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include void glslangGetDefaultInput(const char* shaderCode, glslang_stage_t stage, const glslang_resource_t* resource, glslang_input_t* out) { const glslang_input_t defaultInput = { .language = GLSLANG_SOURCE_GLSL, .stage = stage, .client = GLSLANG_CLIENT_VULKAN, .client_version = GLSLANG_TARGET_VULKAN_1_2, .target_language = GLSLANG_TARGET_SPV, .target_language_version = GLSLANG_TARGET_SPV_1_5, .code = shaderCode, .default_version = 100, .default_profile = GLSLANG_NO_PROFILE, .force_default_version_and_profile = false, .forward_compatible = false, .messages = GLSLANG_MSG_DEFAULT_BIT, .resource = resource, }; if (out) { *out = defaultInput; } } void glslangGetDefaultResource(glslang_resource_t* resource) { const glslang_resource_t defaultResource = {.max_lights = 32, .max_clip_planes = 6, .max_texture_units = 32, .max_texture_coords = 32, .max_vertex_attribs = 64, .max_vertex_uniform_components = 4096, .max_varying_floats = 64, .max_vertex_texture_image_units = 32, .max_combined_texture_image_units = 80, .max_texture_image_units = 32, .max_fragment_uniform_components = 4096, .max_draw_buffers = 32, .max_vertex_uniform_vectors = 128, .max_varying_vectors = 8, .max_fragment_uniform_vectors = 16, .max_vertex_output_vectors = 16, .max_fragment_input_vectors = 15, .min_program_texel_offset = -8, .max_program_texel_offset = 7, .max_clip_distances = 8, .max_compute_work_group_count_x = 65535, .max_compute_work_group_count_y = 65535, .max_compute_work_group_count_z = 65535, .max_compute_work_group_size_x = 1024, .max_compute_work_group_size_y = 1024, .max_compute_work_group_size_z = 64, .max_compute_uniform_components = 1024, .max_compute_texture_image_units = 16, .max_compute_image_uniforms = 8, .max_compute_atomic_counters = 8, .max_compute_atomic_counter_buffers = 1, .max_varying_components = 60, .max_vertex_output_components = 64, .max_geometry_input_components = 64, .max_geometry_output_components = 128, .max_fragment_input_components = 128, .max_image_units = 8, .max_combined_image_units_and_fragment_outputs = 8, .max_combined_shader_output_resources = 8, .max_image_samples = 0, .max_vertex_image_uniforms = 0, .max_tess_control_image_uniforms = 0, .max_tess_evaluation_image_uniforms = 0, .max_geometry_image_uniforms = 0, .max_fragment_image_uniforms = 8, .max_combined_image_uniforms = 8, .max_geometry_texture_image_units = 16, .max_geometry_output_vertices = 256, .max_geometry_total_output_components = 1024, .max_geometry_uniform_components = 1024, .max_geometry_varying_components = 64, .max_tess_control_input_components = 128, .max_tess_control_output_components = 128, .max_tess_control_texture_image_units = 16, .max_tess_control_uniform_components = 1024, .max_tess_control_total_output_components = 4096, .max_tess_evaluation_input_components = 128, .max_tess_evaluation_output_components = 128, .max_tess_evaluation_texture_image_units = 16, .max_tess_evaluation_uniform_components = 1024, .max_tess_patch_components = 120, .max_patch_vertices = 32, .max_tess_gen_level = 64, .max_viewports = 16, .max_vertex_atomic_counters = 0, .max_tess_control_atomic_counters = 0, .max_tess_evaluation_atomic_counters = 0, .max_geometry_atomic_counters = 0, .max_fragment_atomic_counters = 8, .max_combined_atomic_counters = 8, .max_atomic_counter_bindings = 1, .max_vertex_atomic_counter_buffers = 0, .max_tess_control_atomic_counter_buffers = 0, .max_tess_evaluation_atomic_counter_buffers = 0, .max_geometry_atomic_counter_buffers = 0, .max_fragment_atomic_counter_buffers = 1, .max_combined_atomic_counter_buffers = 1, .max_atomic_counter_buffer_size = 16384, .max_transform_feedback_buffers = 4, .max_transform_feedback_interleaved_components = 64, .max_cull_distances = 8, .max_combined_clip_and_cull_distances = 8, .max_samples = 4, .max_mesh_output_vertices_nv = 256, .max_mesh_output_primitives_nv = 512, .max_mesh_work_group_size_x_nv = 32, .max_mesh_work_group_size_y_nv = 1, .max_mesh_work_group_size_z_nv = 1, .max_task_work_group_size_x_nv = 32, .max_task_work_group_size_y_nv = 1, .max_task_work_group_size_z_nv = 1, .max_mesh_view_count_nv = 4, .maxDualSourceDrawBuffersEXT = 1, .limits = { .non_inductive_for_loops = true, .while_loops = true, .do_while_loops = true, .general_uniform_indexing = true, .general_attribute_matrix_vector_indexing = true, .general_varying_indexing = true, .general_sampler_indexing = true, .general_variable_indexing = true, .general_constant_matrix_vector_indexing = true, }}; if (resource) { *resource = defaultResource; } } ================================================ FILE: src/igl/glslang/GlslangHelpers.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #ifdef __cplusplus extern "C" { #endif void glslangGetDefaultResource(glslang_resource_t* resource); void glslangGetDefaultInput(const char* shaderCode, glslang_stage_t stage, const glslang_resource_t* resource, glslang_input_t* out); #ifdef __cplusplus } #endif ================================================ FILE: src/igl/metal/Buffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #import // @donotremove #import #include #include namespace igl::metal { class BufferSynchronizationManager; class Buffer : public IBuffer { public: Buffer(id value, MTLResourceOptions options, BufferDesc::BufferAPIHint requestedApiHints, BufferDesc::BufferAPIHint acceptedApiHints, BufferDesc::BufferType bufferType); Result upload(const void* data, const BufferRange& range) override; void* map(const BufferRange& range, Result* outResult) override; void unmap() override; [[nodiscard]] BufferDesc::BufferAPIHint requestedApiHints() const noexcept override; [[nodiscard]] BufferDesc::BufferAPIHint acceptedApiHints() const noexcept override; [[nodiscard]] ResourceStorage storage() const noexcept override; [[nodiscard]] size_t getSizeInBytes() const override; [[nodiscard]] uint64_t gpuAddress(size_t offset) const override; [[nodiscard]] BufferDesc::BufferType getBufferType() const override { return bufferType_; } IGL_INLINE virtual id get() { return mtlBuffers_[0]; } protected: MTLResourceOptions resourceOptions_; std::vector> mtlBuffers_; BufferDesc::BufferAPIHint requestedApiHints_; BufferDesc::BufferAPIHint acceptedApiHints_; BufferDesc::BufferType bufferType_; }; // Manages a ring of buffers. // At a given time frame, all upload, map and get methods operate on the buffer // indexed by the current inFlight buffer index class RingBuffer final : public Buffer { public: RingBuffer(std::vector> ringBuffers, MTLResourceOptions options, std::shared_ptr syncManager, BufferDesc::BufferAPIHint requestedApiHints, BufferDesc::BufferType bufferType); Result upload(const void* data, const BufferRange& range) override; void* map(const BufferRange& range, Result* outResult) override; void unmap() override; IGL_INLINE id get() override; private: int lastUpdatedBufferIdx_ = -1; std::shared_ptr syncManager_; }; } // namespace igl::metal ================================================ FILE: src/igl/metal/Buffer.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace { // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) igl::Result upload(const std::vector>& buffers, size_t bufferIdx, const void* data, const igl::BufferRange& range, MTLResourceOptions resourceOptions, igl::BufferDesc::BufferAPIHint acceptedApiHints) { IGL_DEBUG_ASSERT(bufferIdx < buffers.size()); const auto& buffer = buffers[bufferIdx]; auto length = [buffer length]; if (!IGL_DEBUG_VERIFY(range.offset + range.size <= length)) { return igl::Result(igl::Result::Code::ArgumentOutOfRange); } if (data == nullptr) { if (!(acceptedApiHints & igl::BufferDesc::BufferAPIHintBits::NoCopy)) { return igl::Result(igl::Result::Code::ArgumentInvalid); } } else { void* contents = [buffer contents]; checked_memcpy_offset(contents, length, range.offset, data, range.size); } #if IGL_PLATFORM_MACOSX if ((resourceOptions & MTLResourceStorageModeMask) == MTLResourceStorageModeManaged) { [buffer didModifyRange:NSMakeRange(range.offset, range.size)]; } #else (void)resourceOptions; // silence unused member warning #endif return igl::Result(); } void* map(const std::vector>& buffers, size_t bufferIdx, const igl::BufferRange& range, igl::Result* outResult, MTLResourceOptions resourceOptions) { if ((resourceOptions & MTLResourceStorageModeMask) == MTLResourceStorageModePrivate) { igl::Result::setResult(outResult, igl::Result::Code::InvalidOperation, "Cannot map() buffer with private storage mode"); return nullptr; } IGL_DEBUG_ASSERT(bufferIdx < buffers.size()); const auto& buffer = buffers[bufferIdx]; if ([buffer length] < (range.size + range.offset)) { igl::Result::setResult(outResult, igl::Result::Code::ArgumentOutOfRange, "map() size + offset must be less than buffer size"); return nullptr; } igl::Result::setOk(outResult); return static_cast(buffer.contents) + range.offset; } igl::Result copyFromPreviousBufferInstance(std::vector>& buffers, size_t bufferIdx, MTLResourceOptions resourceOptions, igl::BufferDesc::BufferAPIHint acceptedApiHints) { if (buffers.size() <= 1) { return igl::Result(); } const size_t prevIdx = bufferIdx == 0 ? buffers.size() - 1 : bufferIdx - 1; IGL_DEBUG_ASSERT([buffers[bufferIdx] length] == [buffers[prevIdx] length]); auto length = [buffers[bufferIdx] length]; auto* srcContents = [buffers[prevIdx] contents]; return ::upload(buffers, bufferIdx, srcContents, igl::BufferRange(length, 0), resourceOptions, acceptedApiHints); } } // namespace namespace igl::metal { // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) Buffer::Buffer(id value, MTLResourceOptions options, BufferDesc::BufferAPIHint requestedApiHints, BufferDesc::BufferAPIHint acceptedApiHints, BufferDesc::BufferType bufferType) : resourceOptions_(options), requestedApiHints_(requestedApiHints), acceptedApiHints_(acceptedApiHints), bufferType_(bufferType) { mtlBuffers_.push_back(value); } Result Buffer::upload(const void* data, const BufferRange& range) { return ::upload(mtlBuffers_, 0, data, range, resourceOptions_, acceptedApiHints_); } void* Buffer::map(const BufferRange& range, Result* outResult) { return ::map(mtlBuffers_, 0, range, outResult, resourceOptions_); } void Buffer::unmap() {} BufferDesc::BufferAPIHint Buffer::requestedApiHints() const noexcept { return requestedApiHints_; } BufferDesc::BufferAPIHint Buffer::acceptedApiHints() const noexcept { return acceptedApiHints_; } ResourceStorage Buffer::storage() const noexcept { #if IGL_PLATFORM_MACOSX if ((resourceOptions_ & MTLResourceStorageModeMask) == MTLResourceStorageModeManaged) { return ResourceStorage::Managed; } #endif // IGL_PLATFORM_MACOSX if ((resourceOptions_ & MTLResourceStorageModeMask) == MTLResourceStorageModePrivate) { return ResourceStorage::Private; } if ((resourceOptions_ & MTLResourceStorageModeMask) == MTLResourceStorageModeShared) { return ResourceStorage::Shared; } if ((resourceOptions_ & MTLResourceStorageModeMask) == MTLResourceStorageModeMemoryless) { return ResourceStorage::Memoryless; } return ResourceStorage::Invalid; } size_t Buffer::getSizeInBytes() const { return [mtlBuffers_[0] length]; } uint64_t Buffer::gpuAddress(size_t /*offset*/) const { // TODO: implement via gpuResourceID IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); return 0; } RingBuffer::RingBuffer(std::vector> ringBuffers, MTLResourceOptions options, std::shared_ptr syncManager, BufferDesc::BufferAPIHint requestedApiHints, BufferDesc::BufferType bufferType) : Buffer(nil, options, requestedApiHints, BufferDesc::BufferAPIHintBits::Ring, bufferType), syncManager_(std::move(syncManager)) { mtlBuffers_ = std::move(ringBuffers); } /* In some scenarios, only part of the buffer could be upload, before the buffer is submitted; * To handle this case, we copy the previous instance of the buffer to this one */ Result RingBuffer::upload(const void* data, const BufferRange& range) { auto bufferIdx = syncManager_->getCurrentInFlightBufferIndex(); if (lastUpdatedBufferIdx_ != bufferIdx) { auto length = [mtlBuffers_[bufferIdx] length]; if (range.offset != 0 || range.size != length) { // partial upload // Copy from the previous buffer first auto result = copyFromPreviousBufferInstance( mtlBuffers_, bufferIdx, resourceOptions_, acceptedApiHints_); if (!result.isOk()) { return result; } } } auto result = ::upload(mtlBuffers_, bufferIdx, data, range, resourceOptions_, acceptedApiHints_); if (result.isOk()) { lastUpdatedBufferIdx_ = bufferIdx; } return result; } void* RingBuffer::map(const BufferRange& /* unused */, Result* /* unused */) { IGL_DEBUG_ABORT("map() operation not supported for RingBuffer"); return nullptr; } void RingBuffer::unmap() { IGL_DEBUG_ABORT("unmap() operation not supported for RingBuffer"); } id RingBuffer::get() { auto bufferIdx = syncManager_->getCurrentInFlightBufferIndex(); IGL_DEBUG_ASSERT(bufferIdx < mtlBuffers_.size()); if (bufferIdx != lastUpdatedBufferIdx_) { // client hasn't updated the buffer at this idx; Update from the previous buffer instance auto result = copyFromPreviousBufferInstance(mtlBuffers_, bufferIdx, resourceOptions_, acceptedApiHints_); if (!result.isOk()) { IGL_DEBUG_ABORT("Failed to copy buffer"); return nullptr; } lastUpdatedBufferIdx_ = bufferIdx; } return mtlBuffers_[bufferIdx]; } } // namespace igl::metal ================================================ FILE: src/igl/metal/BufferSynchronizationManager.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::metal { class BufferSynchronizationManager { public: explicit BufferSynchronizationManager(size_t maxInFlightBuffers); /** * @brief Returns the current inFlight buffer index * @return the current inFlight buffer index */ [[nodiscard]] size_t getCurrentInFlightBufferIndex() const noexcept { return currentInFlightBufferIndex_; } /** * @brief Returns the max inFlight buffers that are supported by the backend being used * InFlight buffers are buffers that can be accessed by GPU aynchronously at any moment. * To avoid CPU/GPU synchronization issues (where for ex. CPU could be updating a buffer with data * for frame N+1, while GPU is reading the same buffer for rendering frame N), certain backends * (like Metal) will support more than one in flight buffers. * @return max inFlight buffers */ [[nodiscard]] size_t getMaxInflightBuffers() const noexcept { return maxInFlightBuffers_; } void manageEndOfFrameSync(); // Upon completion of this command buffer's execution, trigger buffer synchronization. void markCommandBufferAsEndOfFrame(const igl::ICommandBuffer& commandBuffer); private: size_t maxInFlightBuffers_ = 1; size_t currentInFlightBufferIndex_ = 0; dispatch_semaphore_t frameBoundarySemaphore_; }; } // namespace igl::metal ================================================ FILE: src/igl/metal/BufferSynchronizationManager.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #import #include namespace igl::metal { BufferSynchronizationManager::BufferSynchronizationManager(size_t maxInFlightBuffers) : maxInFlightBuffers_(maxInFlightBuffers) { // To manage the pool of buffers, we would normally initialize the semaphore with the pool size // (i.e. 'maxInFlightBuffers'). However, semaphore crashes at destruction time, if its current // value is less than its initial value. This seems to Apple's libdispatch's idiosyncrasy. // https://opensource.apple.com/source/libdispatch/libdispatch-187.7/src/semaphore.c // To workaround this, we init semaphore to 0 and then call dispatch_semaphore_signal() to // increase the value up to the size of buffer pool frameBoundarySemaphore_ = dispatch_semaphore_create(0); for (size_t i = 0; i < maxInFlightBuffers_; i++) { dispatch_semaphore_signal(frameBoundarySemaphore_); } } void BufferSynchronizationManager::markCommandBufferAsEndOfFrame( const igl::ICommandBuffer& commandBuffer) { // Set a completion handler for this cmd buffer __weak dispatch_semaphore_t semaphore = frameBoundarySemaphore_; [static_cast(commandBuffer).get() addCompletedHandler:^(id mtlCommandBuffer) { // GPU work is complete // Signal the semaphore to start the CPU work // Increment the counting semaphore if (semaphore != nullptr) { dispatch_semaphore_signal(semaphore); } }]; } void BufferSynchronizationManager::manageEndOfFrameSync() { // Decrement the counting semaphore and // if the resulting value is less than zero, block the current thread from executing further // until the semaphore's value is >= 0 dispatch_semaphore_wait(frameBoundarySemaphore_, DISPATCH_TIME_FOREVER); // increment currentInFlightBufferIndex currentInFlightBufferIndex_ = (currentInFlightBufferIndex_ + 1) % maxInFlightBuffers_; } } // namespace igl::metal ================================================ FILE: src/igl/metal/CMakeLists.txt ================================================ # Copyright (c) Meta Platforms, Inc. and affiliates. # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. cmake_minimum_required(VERSION 3.19) # CMake 3.19 is the first version to support Apple Silicon. project(IGLMetal OBJC OBJCXX CXX C) file(GLOB SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.mm) file(GLOB HEADER_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.h) if(IOS) list(APPEND SRC_FILES ios/Device.mm ios/Framebuffer.mm) list(APPEND HEADER_FILES ios/Device.h ios/Framebuffer.h) else() list(APPEND SRC_FILES macos/Device.mm macos/Framebuffer.mm) list(APPEND HEADER_FILES macos/Device.h macos/Framebuffer.h) endif() add_library(IGLMetal ${SRC_FILES} ${HEADER_FILES}) target_link_libraries(IGLMetal PRIVATE IGLLibrary "-framework Metal" "-framework QuartzCore") igl_set_cxxstd(IGLMetal 20) igl_set_folder(IGLMetal "IGL") set(OBJC_EXTRA_FLAGS -fobjc-arc -fobjc-weak) set(OBJC_DISABLE_WARNINGS -Wno-objc-designated-initializers -Wno-objc-missing-super-calls -Wno-objc-property-no-attribute) if(CMAKE_GENERATOR MATCHES "Xcode") set_target_properties(IGLMetal PROPERTIES XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_WEAK YES) set_target_properties(IGLMetal PROPERTIES XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC YES) else() target_compile_options(IGLMetal PRIVATE $<$:${OBJC_EXTRA_FLAGS}>) target_compile_options(IGLMetal PRIVATE $<$:${OBJC_EXTRA_FLAGS}>) endif() target_compile_options(IGLMetal PRIVATE $<$:${OBJC_DISABLE_WARNINGS}>) target_compile_options(IGLMetal PRIVATE $<$:${OBJC_DISABLE_WARNINGS}>) target_compile_options(IGLMetal PRIVATE "-Wno-deprecated-declarations") ================================================ FILE: src/igl/metal/ColorSpace.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #import #include namespace igl::metal { CGColorSpaceRef colorSpaceToCGColorSpace(ColorSpace colorSpace); } // namespace igl::metal ================================================ FILE: src/igl/metal/ColorSpace.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include namespace igl::metal { CGColorSpaceRef colorSpaceToCGColorSpace(ColorSpace colorSpace) { switch (colorSpace) { case ColorSpace::SRGB_LINEAR: return CGColorSpaceCreateWithName(kCGColorSpaceLinearSRGB); case ColorSpace::SRGB_NONLINEAR: return CGColorSpaceCreateWithName(kCGColorSpaceSRGB); case ColorSpace::DISPLAY_P3_NONLINEAR: return CGColorSpaceCreateWithName(kCGColorSpaceDisplayP3); case ColorSpace::EXTENDED_SRGB_LINEAR: return CGColorSpaceCreateWithName(kCGColorSpaceExtendedLinearSRGB); case ColorSpace::DCI_P3_NONLINEAR: return CGColorSpaceCreateWithName(kCGColorSpaceDCIP3); case ColorSpace::BT709_LINEAR: return CGColorSpaceCreateWithName(kCGColorSpaceLinearSRGB); case ColorSpace::BT709_NONLINEAR: return CGColorSpaceCreateWithName(kCGColorSpaceITUR_709); case ColorSpace::ADOBERGB_LINEAR: return CGColorSpaceCreateWithName(kCGColorSpaceAdobeRGB1998); case ColorSpace::ADOBERGB_NONLINEAR: return CGColorSpaceCreateWithName(kCGColorSpaceAdobeRGB1998); case ColorSpace::PASS_THROUGH: return nil; case ColorSpace::EXTENDED_SRGB_NONLINEAR: return CGColorSpaceCreateWithName(kCGColorSpaceExtendedSRGB); case ColorSpace::BT2020_NONLINEAR: return CGColorSpaceCreateWithName(kCGColorSpaceITUR_2020); case ColorSpace::DISPLAY_P3_LINEAR: if (@available(macOS 12.0, iOS 15.0, *)) { return CGColorSpaceCreateWithName(kCGColorSpaceLinearDisplayP3); } [[fallthrough]]; case ColorSpace::BT2020_LINEAR: if (@available(macOS 12.0, iOS 15.0, *)) { return CGColorSpaceCreateWithName(kCGColorSpaceLinearITUR_2020); } [[fallthrough]]; case ColorSpace::HDR10_ST2084: case ColorSpace::DOLBYVISION: case ColorSpace::HDR10_HLG: case ColorSpace::DISPLAY_NATIVE_AMD: case ColorSpace::BT601_NONLINEAR: case ColorSpace::BT2100_HLG_NONLINEAR: case ColorSpace::BT2100_PQ_NONLINEAR: default: IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); return CGColorSpaceCreateWithName(kCGColorSpaceSRGB); } IGL_UNREACHABLE_RETURN(CGColorSpaceCreateWithName(kCGColorSpaceSRGB)); } } // namespace igl::metal ================================================ FILE: src/igl/metal/CommandBuffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include @protocol MTLCommandBuffer; namespace igl::metal { class Device; class CommandBuffer final : public ICommandBuffer, public std::enable_shared_from_this { public: CommandBuffer(Device& device, id value, CommandBufferDesc desc); ~CommandBuffer() override = default; std::unique_ptr createComputeCommandEncoder() override; std::unique_ptr createRenderCommandEncoder( const RenderPassDesc& renderPass, const std::shared_ptr& framebuffer, const Dependencies& dependencies, Result* outResult) override; void present(const std::shared_ptr& surface) const override; void pushDebugGroupLabel(const char* label, const igl::Color& color) const override; void popDebugGroupLabel() const override; void copyBuffer(IBuffer& src, IBuffer& dst, uint64_t srcOffset, uint64_t dstOffset, uint64_t size) override; void copyTextureToBuffer(ITexture& src, IBuffer& dst, uint64_t dstOffset, uint32_t level, uint32_t layer) override; void waitUntilScheduled() override; void waitUntilCompleted() override; IGL_INLINE id get() const { return value_; } Device& device() { return device_; } private: Device& device_; id value_; friend class CommandQueue; }; } // namespace igl::metal ================================================ FILE: src/igl/metal/CommandBuffer.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #import #import #include #include #include #include namespace igl::metal { CommandBuffer::CommandBuffer(Device& device, id value, CommandBufferDesc desc) : ICommandBuffer(std::move(desc)), device_(device), value_(value) {} std::unique_ptr CommandBuffer::createComputeCommandEncoder() { return std::make_unique(value_); } std::unique_ptr CommandBuffer::createRenderCommandEncoder( const RenderPassDesc& renderPass, const std::shared_ptr& framebuffer, const Dependencies& /*dependencies*/, Result* outResult) { return RenderCommandEncoder::create(shared_from_this(), renderPass, framebuffer, outResult); } void CommandBuffer::present(const std::shared_ptr& surface) const { IGL_DEBUG_ASSERT(surface); if (!surface) { return; } const auto drawable = static_cast(*surface).getDrawable(); if (drawable != nullptr) { [value_ presentDrawable:drawable]; } } void CommandBuffer::pushDebugGroupLabel(const char* label, const igl::Color& /*color*/) const { IGL_DEBUG_ASSERT(label != nullptr && *label); [value_ pushDebugGroup:[NSString stringWithUTF8String:label] ?: @""]; } void CommandBuffer::popDebugGroupLabel() const { [value_ popDebugGroup]; } void CommandBuffer::copyBuffer(IBuffer& src, IBuffer& dst, uint64_t srcOffset, uint64_t dstOffset, uint64_t size) { auto srcBuffer = static_cast(src).get(); auto dstBuffer = static_cast(dst).get(); auto blitCommandEncoder = [value_ blitCommandEncoder]; [blitCommandEncoder copyFromBuffer:srcBuffer sourceOffset:srcOffset toBuffer:dstBuffer destinationOffset:dstOffset size:size]; [blitCommandEncoder endEncoding]; } void CommandBuffer::copyTextureToBuffer(ITexture& src, IBuffer& dst, uint64_t dstOffset, uint32_t level, uint32_t layer) { (void)src; (void)dst; (void)dstOffset; (void)level; (void)layer; // TODO: // https://developer.apple.com/documentation/metal/mtlblitcommandencoder#Copying-Texture-Data-to-a-Buffer IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } void CommandBuffer::waitUntilScheduled() { [value_ waitUntilScheduled]; } void CommandBuffer::waitUntilCompleted() { [value_ waitUntilCompleted]; } } // namespace igl::metal ================================================ FILE: src/igl/metal/CommandQueue.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #import #include #include namespace igl::metal { class BufferSynchronizationManager; class CommandQueue final : public ICommandQueue { public: CommandQueue(Device& device, id value, const std::shared_ptr& syncManager, DeviceStatistics& deviceStatistics) noexcept; std::shared_ptr createCommandBuffer(const CommandBufferDesc& desc, Result* outResult) override; SubmitHandle submit(const igl::ICommandBuffer& commandBuffer, bool endOfFrame = false) override; IGL_INLINE id get() const { return value_; } Device& getDevice() { return device_; } private: void startCapture(id queue); void stopCapture(); id value_; std::shared_ptr bufferSyncManager_; DeviceStatistics& deviceStatistics_; Device& device_; }; } // namespace igl::metal ================================================ FILE: src/igl/metal/CommandQueue.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #include // @brief Number of command buffers to be automatically captured for GPU debugging. Zero (0) // means no command buffers will be recorded and the capture code is deactivated. constexpr uint32_t kIGLMetalNumberCommandBuffersToCapture = 0; // @brief Beginning command buffer to be captured constexpr uint32_t kIGLMetalBeginCommandBufferToCapture = 0; // @brief Ending command buffer. Only command buffers within [kIGLMetalBeginCommandBufferToCapture, // kIGLMetalEndCommandBufferToCapture) will be captured. constexpr uint32_t kIGLMetalEndCommandBufferToCapture = kIGLMetalBeginCommandBufferToCapture + kIGLMetalNumberCommandBuffersToCapture; namespace igl::metal { CommandQueue::CommandQueue(Device& device, id value, const std::shared_ptr& syncManager, DeviceStatistics& deviceStatistics) noexcept : value_(value), bufferSyncManager_(syncManager), deviceStatistics_(deviceStatistics), device_(device) { if constexpr (kIGLMetalNumberCommandBuffersToCapture > 0 && kIGLMetalBeginCommandBufferToCapture == 0) { startCapture(value_); } } std::shared_ptr CommandQueue::createCommandBuffer(const CommandBufferDesc& desc, Result* outResult) { id metalObject = [value_ commandBuffer]; metalObject.label = [NSString stringWithUTF8String:desc.debugName.c_str()]; auto resource = std::make_shared(device_, metalObject, desc); Result::setOk(outResult); return resource; } SubmitHandle CommandQueue::submit(const igl::ICommandBuffer& commandBuffer, bool endOfFrame) { incrementDrawCount(commandBuffer.getCurrentDrawCount()); deviceStatistics_.incrementDrawCount(commandBuffer.getCurrentDrawCount()); if (endOfFrame) { bufferSyncManager_->markCommandBufferAsEndOfFrame(commandBuffer); } const auto& metalCommandBuffer = static_cast(commandBuffer); std::shared_ptr timer = metalCommandBuffer.desc.timer; if (timer) { [metalCommandBuffer.get() addCompletedHandler:^(id cb) { CFTimeInterval gpuDuration = cb.GPUEndTime - cb.GPUStartTime; static_cast(*timer).executionTime_ = static_cast(gpuDuration * 1e9); // Convert to nanoseconds }]; } if (@available(macOS 10.15, iOS 14.0, *)) { std::shared_ptr tsQueries = metalCommandBuffer.desc.timestampQueries; if (tsQueries) { auto metalTsQueries = std::static_pointer_cast(tsQueries); id csb = metalTsQueries->sampleBuffer_; uint64_t gen = metalTsQueries->generation_.load(std::memory_order_seq_cst); [metalCommandBuffer.get() addCompletedHandler:^(id /*cb*/) { @try { if (metalTsQueries->generation_.load(std::memory_order_acquire) == gen) { metalTsQueries->resolveTimestamps(csb); } } @catch (NSException*) { // GPU reset or counter sample buffer invalidated -- silently skip. } }]; } } [metalCommandBuffer.get() commit]; if (endOfFrame) { bufferSyncManager_->manageEndOfFrameSync(); } if constexpr (kIGLMetalNumberCommandBuffersToCapture > 0) { static uint32_t currentCommandBuffer = 0; if ((currentCommandBuffer + 1) == kIGLMetalBeginCommandBufferToCapture) { // Start capturing one command buffer earlier startCapture(value_); FOLLY_PUSH_WARNING FOLLY_CLANG_DISABLE_WARNING("-Wtautological-compare") // Disable warning; local debug builds may set kIGLMetalEndCommandBufferToCapture to a // non-zero value } else if (currentCommandBuffer >= kIGLMetalEndCommandBufferToCapture) { FOLLY_POP_WARNING stopCapture(); } ++currentCommandBuffer; } return SubmitHandle{}; } void CommandQueue::startCapture(id queue) { MTLCaptureManager* captureManager = [MTLCaptureManager sharedCaptureManager]; MTLCaptureDescriptor* captureDescriptor = [[MTLCaptureDescriptor alloc] init]; captureDescriptor.captureObject = queue; NSError* error; if (![captureManager startCaptureWithDescriptor:captureDescriptor error:&error]) { NSLog(@"Failed to start capture, error %@", error); } } void CommandQueue::stopCapture() { MTLCaptureManager* captureManager = [MTLCaptureManager sharedCaptureManager]; [captureManager stopCapture]; } } // namespace igl::metal ================================================ FILE: src/igl/metal/ComputeCommandEncoder.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::metal { class ComputeCommandEncoder final : public IComputeCommandEncoder { public: explicit ComputeCommandEncoder(id buffer); ~ComputeCommandEncoder() override = default; void endEncoding() override; void bindComputePipelineState( const std::shared_ptr& pipelineState) override; // threadgroupCount is how many thread groups per grid in each dimension. // threadgroupSize is how many threads are in each threadgroup // total number of threads per grid is threadgroupCount * threadgroupSize void dispatchThreadGroups(const Dimensions& threadgroupCount, const Dimensions& threadgroupSize, const Dependencies& dependencies) override; void pushDebugGroupLabel(const char* label, const igl::Color& color) const override; void insertDebugEventLabel(const char* label, const igl::Color& color) const override; void popDebugGroupLabel() const override; void bindUniform(const UniformDesc& uniformDesc, const void* data) override; void bindTexture(uint32_t index, ITexture* texture) override; void bindImageTexture(uint32_t index, ITexture* texture, TextureFormat format) override; void bindSamplerState(uint32_t index, ISamplerState* samplerState) override; void bindBuffer(uint32_t index, IBuffer* buffer, size_t offset, size_t bufferSize) override; void bindBytes(uint32_t index, const void* data, size_t length) override; void bindPushConstants(const void* data, size_t length, size_t offset) override; private: id encoder_ = nil; // 4 KB - page aligned memory for metal managed resource static constexpr uint32_t kMaxRecommendedBytes = 4 * 1024; }; } // namespace igl::metal ================================================ FILE: src/igl/metal/ComputeCommandEncoder.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #import #import #include #include #include #include #include namespace igl::metal { ComputeCommandEncoder::ComputeCommandEncoder(id buffer) { id computeEncoder = [buffer computeCommandEncoder]; encoder_ = computeEncoder; } void ComputeCommandEncoder::endEncoding() { IGL_DEBUG_ASSERT(encoder_); [encoder_ endEncoding]; encoder_ = nil; } void ComputeCommandEncoder::pushDebugGroupLabel(const char* label, const igl::Color& /*color*/) const { IGL_DEBUG_ASSERT(encoder_); IGL_DEBUG_ASSERT(label != nullptr && *label); [encoder_ pushDebugGroup:[NSString stringWithUTF8String:label] ?: @""]; } void ComputeCommandEncoder::insertDebugEventLabel(const char* label, const igl::Color& /*color*/) const { IGL_DEBUG_ASSERT(encoder_); IGL_DEBUG_ASSERT(label != nullptr && *label); [encoder_ insertDebugSignpost:[NSString stringWithUTF8String:label] ?: @""]; } void ComputeCommandEncoder::popDebugGroupLabel() const { IGL_DEBUG_ASSERT(encoder_); [encoder_ popDebugGroup]; } void ComputeCommandEncoder::bindComputePipelineState( const std::shared_ptr& pipelineState) { if (pipelineState) { auto& iglPipelineState = static_cast(*pipelineState); [encoder_ setComputePipelineState:iglPipelineState.get()]; } } void ComputeCommandEncoder::dispatchThreadGroups(const Dimensions& threadgroupCount, const Dimensions& threadgroupSize, const Dependencies& /*dependencies*/) { MTLSize tgc; tgc.width = threadgroupCount.width; tgc.height = threadgroupCount.height; tgc.depth = threadgroupCount.depth; MTLSize tgs; tgs.width = threadgroupSize.width; tgs.height = threadgroupSize.height; tgs.depth = threadgroupSize.depth; [encoder_ dispatchThreadgroups:tgc threadsPerThreadgroup:tgs]; } void ComputeCommandEncoder::bindUniform(const UniformDesc& /*uniformDesc*/, const void* /*data*/) { // DO NOT IMPLEMENT! // This is only for backends that MUST use single uniforms in some situations. IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } void ComputeCommandEncoder::bindTexture(uint32_t index, ITexture* texture) { IGL_DEBUG_ASSERT(encoder_); if (texture) { auto& iglTexture = static_cast(*texture); [encoder_ setTexture:iglTexture.get() atIndex:index]; } } void ComputeCommandEncoder::bindImageTexture(uint32_t index, ITexture* texture, TextureFormat format) { (void)format; this->bindTexture(index, texture); } void ComputeCommandEncoder::bindSamplerState(uint32_t index, ISamplerState* samplerState) { IGL_DEBUG_ASSERT(encoder_); if (samplerState) { auto& iglSampler = static_cast(*samplerState); [encoder_ setSamplerState:iglSampler.get() atIndex:index]; } } void ComputeCommandEncoder::bindBuffer(uint32_t index, IBuffer* buffer, size_t offset, size_t bufferSize) { (void)bufferSize; IGL_DEBUG_ASSERT(encoder_); if (buffer) { auto& iglBuffer = static_cast(*buffer); [encoder_ setBuffer:iglBuffer.get() offset:offset atIndex:index]; } } void ComputeCommandEncoder::bindBytes(uint32_t index, const void* data, size_t length) { IGL_DEBUG_ASSERT(encoder_); if (data) { if (length > kMaxRecommendedBytes) { IGL_LOG_INFO( "It is recommended to use bindBuffer instead of bindBytes when binding > 4kb: %u", length); } [encoder_ setBytes:data length:length atIndex:index]; } } void ComputeCommandEncoder::bindPushConstants(const void* /*data*/, size_t /*length*/, size_t /*offset*/) { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } } // namespace igl::metal ================================================ FILE: src/igl/metal/ComputePipelineState.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::metal { class ComputePipelineState final : public IComputePipelineState { friend class Device; public: explicit ComputePipelineState(id value, MTLComputePipelineReflection* reflection); ~ComputePipelineState() override = default; IGL_INLINE id get() { return value_; } std::shared_ptr computePipelineReflection() override { return nullptr; } private: id value_; MTLComputePipelineReflection* reflection_; }; } // namespace igl::metal ================================================ FILE: src/igl/metal/ComputePipelineState.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include using namespace igl; namespace igl::metal { ComputePipelineState::ComputePipelineState(id value, MTLComputePipelineReflection* reflection) : value_(value), reflection_(reflection) {} } // namespace igl::metal ================================================ FILE: src/igl/metal/DepthStencilState.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::metal { class DepthStencilState final : public IDepthStencilState { friend class Device; public: IGL_INLINE id get() const { return value; } DepthStencilState(id value); ~DepthStencilState() override = default; static MTLCompareFunction convertCompareFunction(CompareFunction value); static MTLStencilOperation convertStencilOperation(StencilOperation value); static MTLStencilDescriptor* convertStencilDescriptor(const StencilStateDesc& desc); id value; }; } // namespace igl::metal ================================================ FILE: src/igl/metal/DepthStencilState.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #import namespace igl::metal { DepthStencilState::DepthStencilState(id value) : value(value) {} MTLCompareFunction DepthStencilState::convertCompareFunction(CompareFunction value) { switch (value) { case CompareFunction::Never: return MTLCompareFunctionNever; case CompareFunction::Less: return MTLCompareFunctionLess; case CompareFunction::Equal: return MTLCompareFunctionEqual; case CompareFunction::LessEqual: return MTLCompareFunctionLessEqual; case CompareFunction::Greater: return MTLCompareFunctionGreater; case CompareFunction::NotEqual: return MTLCompareFunctionNotEqual; case CompareFunction::GreaterEqual: return MTLCompareFunctionGreaterEqual; case CompareFunction::AlwaysPass: return MTLCompareFunctionAlways; } } MTLStencilOperation DepthStencilState::convertStencilOperation(StencilOperation value) { switch (value) { case StencilOperation::Keep: return MTLStencilOperationKeep; case StencilOperation::Zero: return MTLStencilOperationZero; case StencilOperation::Replace: return MTLStencilOperationReplace; case StencilOperation::IncrementClamp: return MTLStencilOperationIncrementClamp; case StencilOperation::DecrementClamp: return MTLStencilOperationDecrementClamp; case StencilOperation::Invert: return MTLStencilOperationInvert; case StencilOperation::IncrementWrap: return MTLStencilOperationIncrementWrap; case StencilOperation::DecrementWrap: return MTLStencilOperationDecrementWrap; } } MTLStencilDescriptor* DepthStencilState::convertStencilDescriptor(const StencilStateDesc& desc) { MTLStencilDescriptor* metalDesc = [MTLStencilDescriptor new]; metalDesc.stencilCompareFunction = convertCompareFunction(desc.stencilCompareFunction); metalDesc.stencilFailureOperation = convertStencilOperation(desc.stencilFailureOperation); metalDesc.depthStencilPassOperation = convertStencilOperation(desc.depthStencilPassOperation); metalDesc.depthFailureOperation = convertStencilOperation(desc.depthFailureOperation); metalDesc.readMask = desc.readMask; metalDesc.writeMask = desc.writeMask; return metalDesc; } } // namespace igl::metal ================================================ FILE: src/igl/metal/Device.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once @protocol MTLDevice; #import #include #include #include #include #include namespace igl::metal { class BufferSynchronizationManager; class Device : public IDevice { friend class HWDevice; public: explicit Device(id IGL_NONNULL device); ~Device() override; [[nodiscard]] Holder createBindGroup( const BindGroupTextureDesc& desc, const IRenderPipelineState* IGL_NULLABLE compatiblePipeline, Result* IGL_NULLABLE outResult) override; [[nodiscard]] Holder createBindGroup(const BindGroupBufferDesc& desc, Result* IGL_NULLABLE outResult) override; void destroy(BindGroupTextureHandle handle) override; void destroy(BindGroupBufferHandle handle) override; void destroy(SamplerHandle handle) override; // Command Queue std::shared_ptr createCommandQueue(const CommandQueueDesc& desc, Result* IGL_NULLABLE outResult) noexcept override; // Resources std::unique_ptr createBuffer(const BufferDesc& desc, Result* IGL_NULLABLE outResult) const noexcept override; std::shared_ptr createDepthStencilState(const DepthStencilStateDesc& desc, Result* IGL_NULLABLE outResult) const override; std::shared_ptr createSamplerState(const SamplerStateDesc& desc, Result* IGL_NULLABLE outResult) const override; std::shared_ptr createTexture(const TextureDesc& desc, Result* IGL_NULLABLE outResult) const noexcept override; std::shared_ptr createTextureView(std::shared_ptr texture, const TextureViewDesc& desc, Result* IGL_NULLABLE outResult) const noexcept override; std::shared_ptr createTimer(Result* IGL_NULLABLE outResult) const noexcept override; std::shared_ptr createTimestampQueries(uint32_t maxTimestamps, Result* IGL_NULLABLE outResult) const noexcept override; std::shared_ptr createVertexInputState(const VertexInputStateDesc& desc, Result* IGL_NULLABLE outResult) const override; // Pipelines std::shared_ptr createComputePipeline(const ComputePipelineDesc& desc, Result* IGL_NULLABLE outResult) const override; std::shared_ptr createRenderPipeline(const RenderPipelineDesc& desc, Result* IGL_NULLABLE outResult) const override; // Shaders std::unique_ptr createShaderLibrary(const ShaderLibraryDesc& desc, Result* IGL_NULLABLE outResult) const override; std::shared_ptr createShaderModule(const ShaderModuleDesc& desc, Result* IGL_NULLABLE outResult) const override; std::unique_ptr createShaderStages(const ShaderStagesDesc& desc, Result* IGL_NULLABLE outResult) const override; // Platform-specific extensions [[nodiscard]] const PlatformDevice& getPlatformDevice() const noexcept override; IGL_INLINE id IGL_NONNULL get() const { return device_; } [[nodiscard]] void* IGL_NULLABLE getNativeDevice() const override { return (__bridge void*)device_; } // ICapabilities [[nodiscard]] bool isAppleGpu() const; [[nodiscard]] bool hasFeature(DeviceFeatures feature) const override; [[nodiscard]] bool hasRequirement(DeviceRequirement requirement) const override; bool getFeatureLimits(DeviceFeatureLimits featureLimits, size_t& result) const override; [[nodiscard]] TextureFormatCapabilities getTextureFormatCapabilities( TextureFormat format) const override; [[nodiscard]] ShaderVersion getShaderVersion() const override; [[nodiscard]] BackendVersion getBackendVersion() const override; // Device Statistics [[nodiscard]] size_t getCurrentDrawCount() const override; [[nodiscard]] size_t getShaderCompilationCount() const override; [[nodiscard]] size_t getGPUMemoryUsage() const override; [[nodiscard]] BackendType getBackendType() const override { return BackendType::Metal; } [[nodiscard]] base::IFramebufferInterop* IGL_NULLABLE createFramebufferInterop(const base::FramebufferInteropDesc& desc) override; [[nodiscard]] NormalizedZRange getNormalizedZRange() const override { return NormalizedZRange::ZeroToOne; } static MTLStorageMode toMTLStorageMode(ResourceStorage storage); static MTLResourceOptions toMTLResourceStorageMode(ResourceStorage storage); std::shared_ptr getMostRecentCommandQueue() const noexcept; public: Pool bindGroupBuffersPool; Pool bindGroupTexturesPool; private: std::unique_ptr createRingBuffer(const BufferDesc& desc, Result* IGL_NULLABLE outResult) const noexcept; std::unique_ptr createBufferNoCopy(const BufferDesc& desc, Result* IGL_NULLABLE outResult) const; std::shared_ptr createTraditionalRenderPipeline( const RenderPipelineDesc& desc, Result* IGL_NULLABLE outResult) const; std::shared_ptr createMeshRenderPipeline(const RenderPipelineDesc& desc, Result* IGL_NULLABLE outResult) const; id IGL_NONNULL device_; PlatformDevice platformDevice_; DeviceFeatureSet deviceFeatureSet_; std::shared_ptr bufferSyncManager_; mutable DeviceStatistics deviceStatistics_; std::shared_ptr mostRecentCommandQueue_; }; } // namespace igl::metal ================================================ FILE: src/igl/metal/Device.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #import #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace igl::metal { // https://developer.apple.com/documentation/quartzcore/cametallayer/2938720-maximumdrawablecount?language=objc // Max number of Metal drawables in the resource pool managed by Core Animation is 3. #define IGL_METAL_MAX_IN_FLIGHT_BUFFERS 3 Device::Device(id device) : device_(device), platformDevice_(*this), deviceFeatureSet_(device) { bufferSyncManager_ = std::make_shared(IGL_METAL_MAX_IN_FLIGHT_BUFFERS); } Device::~Device() = default; std::shared_ptr Device::createCommandQueue( // NOLINT(bugprone-exception-escape) const CommandQueueDesc& /*desc*/, Result* outResult) noexcept { id metalObject = [device_ newCommandQueue]; auto resource = std::make_shared(*this, metalObject, bufferSyncManager_, deviceStatistics_); mostRecentCommandQueue_ = resource; Result::setOk(outResult); return resource; } namespace { id createMetalBuffer(id device, const BufferDesc& desc, MTLResourceOptions options) { id metalObject = nil; if (desc.data != nullptr) { metalObject = [device newBufferWithBytes:desc.data length:desc.length options:options]; } else { metalObject = [device newBufferWithLength:desc.length options:options]; } metalObject.label = [NSString stringWithUTF8String:desc.debugName.c_str()]; return metalObject; } } // namespace std::unique_ptr Device::createBuffer( // NOLINT(bugprone-exception-escape) const BufferDesc& desc, Result* outResult) const noexcept { if (desc.hint & BufferDesc::BufferAPIHintBits::Ring) { return createRingBuffer(desc, outResult); } if (desc.hint & BufferDesc::BufferAPIHintBits::NoCopy) { return createBufferNoCopy(desc, outResult); } const MTLResourceOptions storage = toMTLResourceStorageMode(desc.storage); const MTLResourceOptions options = MTLResourceCPUCacheModeDefaultCache | storage; id metalObject = createMetalBuffer(device_, desc, options); std::unique_ptr resource = std::make_unique( std::move(metalObject), options, desc.hint, 0 /* No accepted hints */, desc.type); if (hasResourceTracker()) { resource->initResourceTracker(getResourceTracker(), desc.debugName); } Result::setOk(outResult); return resource; } std::unique_ptr Device::createRingBuffer( // NOLINT(bugprone-exception-escape) const BufferDesc& desc, Result* outResult) const noexcept { const MTLResourceOptions storage = toMTLResourceStorageMode(desc.storage); const MTLResourceOptions options = MTLResourceCPUCacheModeDefaultCache | storage; // Create a ring of buffers std::vector> bufferRing; for (size_t i = 0; i < bufferSyncManager_->getMaxInflightBuffers(); i++) { id metalObject = createMetalBuffer(device_, desc, options); bufferRing.push_back(metalObject); } std::unique_ptr resource = std::make_unique( std::move(bufferRing), options, bufferSyncManager_, desc.hint, desc.type); if (hasResourceTracker()) { resource->initResourceTracker(getResourceTracker(), desc.debugName); } Result::setOk(outResult); return resource; } std::unique_ptr Device::createBufferNoCopy(const BufferDesc& desc, Result* outResult) const { const MTLResourceOptions storage = toMTLResourceStorageMode(desc.storage); using Deallocator = void (^)(void*, NSUInteger); const Deallocator deallocator = nil; const MTLResourceOptions options = MTLResourceCPUCacheModeDefaultCache | storage; id metalObject = [device_ newBufferWithBytesNoCopy:const_cast(desc.data) length:desc.length options:options deallocator:deallocator]; std::unique_ptr resource = std::make_unique( metalObject, options, desc.hint, BufferDesc::BufferAPIHintBits::NoCopy, desc.type); if (hasResourceTracker()) { resource->initResourceTracker(getResourceTracker(), desc.debugName); } Result::setOk(outResult); return resource; } std::shared_ptr Device::createSamplerState(const SamplerStateDesc& desc, Result* outResult) const { return platformDevice_.createSamplerState(desc, outResult); } std::shared_ptr Device::createTexture( // NOLINT(bugprone-exception-escape) const TextureDesc& desc, Result* outResult) const noexcept { const auto sanitized = sanitize(desc); if (desc.numLayers > 1 && desc.type != TextureType::TwoDArray) { Result::setResult(outResult, Result::Code::Unsupported, "Array textures are only supported when type is TwoDArray."); return nullptr; } if (desc.exportability != TextureDesc::TextureExportability::NoExport) { Result::setResult(outResult, Result::Code::Unimplemented, "Exportable textures are not supported on this platform."); return nullptr; }; MTLTextureDescriptor* metalDesc = [MTLTextureDescriptor new]; metalDesc.textureType = Texture::convertType(sanitized.type, sanitized.numSamples); metalDesc.pixelFormat = Texture::textureFormatToMTLPixelFormat(sanitized.format); if (metalDesc.pixelFormat == MTLPixelFormatInvalid) { Result::setResult( outResult, Result::Code::Unsupported, "Invalid Texture Format : " + std::string(TextureFormatProperties::fromTextureFormat(sanitized.format).name)); IGL_DEBUG_ABORT(outResult->message.c_str()); return nullptr; } metalDesc.width = sanitized.width; metalDesc.height = sanitized.height; metalDesc.depth = sanitized.depth; metalDesc.arrayLength = sanitized.numLayers; metalDesc.mipmapLevelCount = sanitized.numMipLevels; // The default sampleCount value is 1. If textureType is not MTLTextureType2DMultisample, this // value must be 1. Support for different sample count values varies by device. Call the // supportsTextureSampleCount: method to determine if your desired sample count value is // supported. IGL_DEBUG_ASSERT(sanitized.numSamples > 0, "Texture : Samples cannot be zero"); metalDesc.sampleCount = 1; if (metalDesc.textureType == MTLTextureType2DMultisample) { metalDesc.mipmapLevelCount = 1; if (sanitized.numSamples > 0) { IGL_DEBUG_ASSERT([device_ supportsTextureSampleCount:sanitized.numSamples]); metalDesc.sampleCount = sanitized.numSamples; } } #if TARGET_OS_OSX // MTLTextureType2DMultisampleArray not available in iOS if (@available(macOS 10.14, *)) { if (metalDesc.textureType == MTLTextureType2DMultisampleArray) { metalDesc.mipmapLevelCount = 1; } } #endif metalDesc.usage = Texture::toMTLTextureUsage(sanitized.usage); metalDesc.storageMode = toMTLStorageMode(sanitized.storage); metalDesc.resourceOptions = MTLResourceCPUCacheModeDefaultCache | toMTLResourceStorageMode(sanitized.storage); id metalObject = [device_ newTextureWithDescriptor:metalDesc]; if (!metalObject) { Result::setResult(outResult, Result::Code::RuntimeError, "Failed to create Metal texture"); IGL_DEBUG_ABORT(outResult->message.c_str()); return nullptr; } metalObject.label = [NSString stringWithUTF8String:desc.debugName.c_str()]; auto iglObject = std::make_shared(metalObject, *this, desc.mipmapGeneration); if (hasResourceTracker()) { iglObject->initResourceTracker(getResourceTracker(), desc.debugName); } Result::setOk(outResult); // sanity check to ensure that the Result value and the returned object are in sync // i.e. we never have a valid Result with a nullptr return value, or vice versa IGL_DEBUG_ASSERT(outResult == nullptr || (outResult->isOk() == (iglObject != nullptr))); return iglObject; } std::shared_ptr Device::createTextureView( // NOLINT(bugprone-exception-escape) std::shared_ptr texture, const TextureViewDesc& desc, Result* IGL_NULLABLE outResult) const noexcept { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); Result::setResult( outResult, Result::Code::Unimplemented, "Texture views are not (yet) implemented"); return nullptr; } std::shared_ptr Device::createTimer(Result* IGL_NULLABLE outResult) const noexcept { if (outResult) { Result::setOk(outResult); } return std::make_shared(); } std::shared_ptr Device::createTimestampQueries(uint32_t maxTimestamps, Result* IGL_NULLABLE outResult) const noexcept { if (@available(macOS 10.15, iOS 14.0, *)) { // Find the timestamp counter set id timestampCounterSet = nil; for (id counterSet = nullptr in device_.counterSets) { if ([counterSet.name isEqualToString:MTLCommonCounterSetTimestamp]) { timestampCounterSet = counterSet; break; } } if (!timestampCounterSet) { Result::setResult( outResult, Result::Code::Unsupported, "Device does not support timestamp counters"); return nullptr; } MTLCounterSampleBufferDescriptor* descriptor = [[MTLCounterSampleBufferDescriptor alloc] init]; descriptor.counterSet = timestampCounterSet; descriptor.sampleCount = maxTimestamps; descriptor.storageMode = MTLStorageModeShared; descriptor.label = @"IGL TimestampQueries"; NSError* error = nil; id csb = [device_ newCounterSampleBufferWithDescriptor:descriptor error:&error]; if (!csb || error) { Result::setResult(outResult, Result::Code::RuntimeError, error ? [error.localizedDescription UTF8String] : "Failed to create counter sample buffer"); return nullptr; } Result::setOk(outResult); return std::make_shared(csb, maxTimestamps); } else { Result::setResult( outResult, Result::Code::Unsupported, "TimestampQueries require macOS 10.15+ or iOS 14+"); return nullptr; } } std::shared_ptr Device::createVertexInputState(const VertexInputStateDesc& desc, Result* outResult) const { // Avoid buffer overrun in numAttributes. if (desc.numAttributes > IGL_VERTEX_ATTRIBUTES_MAX) { Result::setResult(outResult, Result::Code::ArgumentOutOfRange, "numAttributes is too large in VertexInputStateDesc"); IGL_DEBUG_ABORT(outResult->message.c_str()); return nullptr; } // Avoid buffer overrun in numInputBindings. if (desc.numInputBindings > IGL_BUFFER_BINDINGS_MAX) { Result::setResult(outResult, Result::Code::ArgumentOutOfRange, "numInputBindings is too large in VertexInputStateDesc"); IGL_DEBUG_ABORT(outResult->message.c_str()); return nullptr; } // Verify that bufferIndex and location are in their respective ranges. std::unordered_set bufferIndexSet; std::unordered_set attributeLocationSet; for (int i = 0; i < desc.numAttributes; ++i) { size_t bufferIndex = desc.attributes[i].bufferIndex; if (bufferIndex >= IGL_BUFFER_BINDINGS_MAX) { Result::setResult(outResult, Result::Code::ArgumentOutOfRange, "bufferIndex out of range"); IGL_DEBUG_ABORT(outResult->message.c_str()); return nullptr; } const int attribLocation = desc.attributes[i].location; if (attribLocation < 0 || attribLocation >= IGL_VERTEX_ATTRIBUTES_MAX) { Result::setResult( outResult, Result::Code::ArgumentOutOfRange, "attribute location out of range"); IGL_DEBUG_ABORT(outResult->message.c_str()); return nullptr; } bufferIndexSet.insert(static_cast(bufferIndex)); attributeLocationSet.insert(attribLocation); } // Number of unique buffer indices should match the number of bindings if (bufferIndexSet.size() != desc.numInputBindings) { std::ostringstream msg; msg << "desc.numInputBindings : expected value is " << bufferIndexSet.size() << ", but actual value is " << desc.numInputBindings; Result::setResult(outResult, Result::Code::ArgumentInvalid, msg.str()); IGL_DEBUG_ABORT(outResult->message.c_str()); return nullptr; } // Attribute locations must be unique. // So number of attribute locations should match the desc.numAttributes if (attributeLocationSet.size() != desc.numAttributes) { std::ostringstream msg; msg << "desc.numAttributes : expected value is " << attributeLocationSet.size() << ", but actual value is " << desc.numAttributes; Result::setResult( outResult, Result::Code::ArgumentInvalid, "attribute locations are not unique"); IGL_DEBUG_ABORT(outResult->message.c_str()); return nullptr; } MTLVertexDescriptor* metalDesc = [MTLVertexDescriptor vertexDescriptor]; if (metalDesc == nil) { Result::setResult( outResult, Result::Code::RuntimeError, "failed to create MTLVertexDescriptor"); IGL_DEBUG_ABORT(outResult->message.c_str()); return nullptr; } // Validation completed. Populate the metal vertex descriptor. for (int i = 0; i < desc.numAttributes; ++i) { const size_t bufferIndex = desc.attributes[i].bufferIndex; const size_t dstAttribIndex = desc.attributes[i].location; metalDesc.attributes[dstAttribIndex].format = VertexInputState::convertAttributeFormat(desc.attributes[i].format); metalDesc.attributes[dstAttribIndex].bufferIndex = bufferIndex; metalDesc.attributes[dstAttribIndex].offset = desc.attributes[i].offset; metalDesc.layouts[bufferIndex].stride = desc.inputBindings[bufferIndex].stride; metalDesc.layouts[bufferIndex].stepFunction = VertexInputState::convertSampleFunction(desc.inputBindings[bufferIndex].sampleFunction); metalDesc.layouts[bufferIndex].stepRate = desc.inputBindings[bufferIndex].sampleRate; } auto iglObject = std::make_shared(metalDesc); Result::setOk(outResult); return iglObject; } std::shared_ptr Device::createDepthStencilState( const DepthStencilStateDesc& desc, Result* outResult) const { MTLDepthStencilDescriptor* metalDesc = [MTLDepthStencilDescriptor new]; metalDesc.label = [NSString stringWithUTF8String:desc.debugName.c_str()]; metalDesc.depthCompareFunction = DepthStencilState::convertCompareFunction(desc.compareFunction); metalDesc.depthWriteEnabled = desc.isDepthWriteEnabled; metalDesc.frontFaceStencil = DepthStencilState::convertStencilDescriptor(desc.frontFaceStencil); metalDesc.backFaceStencil = DepthStencilState::convertStencilDescriptor(desc.backFaceStencil); id metalObject = [device_ newDepthStencilStateWithDescriptor:metalDesc]; std::shared_ptr iglObject = std::make_shared(metalObject); Result::setOk(outResult); return iglObject; } std::shared_ptr Device::createComputePipeline( const ComputePipelineDesc& desc, Result* outResult) const { NSError* error = nil; if (IGL_DEBUG_VERIFY_NOT(desc.shaderStages == nullptr)) { Result::setResult(outResult, Result::Code::ArgumentInvalid, "Missing shader stages"); return nullptr; } if (!IGL_DEBUG_VERIFY(desc.shaderStages->getType() == ShaderStagesType::Compute)) { Result::setResult(outResult, Result::Code::ArgumentInvalid, "Shader stages not for compute"); return nullptr; } if (!IGL_DEBUG_VERIFY(desc.shaderStages->getComputeModule())) { Result::setResult(outResult, Result::Code::ArgumentInvalid, "Missing compute shader"); return nullptr; } MTLComputePipelineDescriptor* descriptor = [[MTLComputePipelineDescriptor alloc] init]; descriptor.computeFunction = static_cast(desc.shaderStages->getComputeModule().get())->get(); MTLComputePipelineReflection* reflection = nil; id metalObject = [device_ newComputePipelineStateWithDescriptor:descriptor options:MTLPipelineOptionNone reflection:&reflection error:&error]; setResultFrom(outResult, error); if (error != nil) { return nullptr; } std::shared_ptr computePipelineState = std::make_shared(metalObject, reflection); return computePipelineState; } std::shared_ptr Device::createRenderPipeline(const RenderPipelineDesc& desc, Result* outResult) const { if (!IGL_DEBUG_VERIFY(desc.shaderStages)) { Result::setResult( outResult, Result::Code::RuntimeError, "RenderPipeline requires shader stages"); return nullptr; } if (desc.shaderStages->getType() == ShaderStagesType::Render) { return createTraditionalRenderPipeline(desc, outResult); } else if (desc.shaderStages->getType() == ShaderStagesType::RenderMeshShader) { return createMeshRenderPipeline(desc, outResult); } else { IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; } } std::shared_ptr Device::createTraditionalRenderPipeline( const RenderPipelineDesc& desc, Result* outResult) const { // TODO // Size drawableSize = IGLNativeDrawableSize(layer_); // graphicsDesc.viewportState.viewportCount = 1; // graphicsDesc.viewportState.viewports[0] = (Viewport){0.0, 0.0, drawableSize.width, // drawableSize.height, 0.0, 1.0}; NSError* error = nil; MTLRenderPipelineDescriptor* metalDesc = [MTLRenderPipelineDescriptor new]; metalDesc.label = [NSString stringWithUTF8String:desc.debugName.c_str()]; metalDesc.sampleCount = desc.sampleCount; // (optional, can be null) Vertex input auto vertexInput = desc.vertexInputState; auto metalVertexInput = vertexInput ? static_cast(vertexInput.get())->get() : nullptr; metalDesc.vertexDescriptor = metalVertexInput; if (!IGL_DEBUG_VERIFY(desc.shaderStages)) { Result::setResult( outResult, Result::Code::RuntimeError, "RenderPipeline requires shader stages"); return nullptr; } if (!IGL_DEBUG_VERIFY(desc.shaderStages->getType() == ShaderStagesType::Render)) { Result::setResult(outResult, Result::Code::ArgumentInvalid, "Shader stages not for render"); return nullptr; } // Vertex shader is required auto vertexModule = desc.shaderStages->getVertexModule(); if (!IGL_DEBUG_VERIFY(vertexModule)) { Result::setResult( outResult, Result::Code::RuntimeError, "RenderPipeline requires vertex module"); return nullptr; } auto* vertexFunc = static_cast(vertexModule.get()); metalDesc.vertexFunction = vertexFunc->get(); if (!IGL_DEBUG_VERIFY(metalDesc.vertexFunction)) { Result::setResult( outResult, Result::Code::RuntimeError, "RenderPipeline requires non-null vertex function"); return nullptr; } // Fragment shader is optional auto fragmentModule = desc.shaderStages->getFragmentModule(); if (fragmentModule) { auto* fragmentFunc = static_cast(fragmentModule.get()); metalDesc.fragmentFunction = fragmentFunc->get(); } // Framebuffer for (uint32_t i = 0; i < desc.targetDesc.colorAttachments.size(); ++i) { const auto& src = desc.targetDesc.colorAttachments[i]; MTLRenderPipelineColorAttachmentDescriptor* dst = metalDesc.colorAttachments[i]; dst.pixelFormat = Texture::textureFormatToMTLPixelFormat(src.textureFormat); dst.writeMask = RenderPipelineState::convertColorWriteMask(src.colorWriteMask); dst.blendingEnabled = src.blendEnabled; dst.rgbBlendOperation = MTLBlendOperation(src.rgbBlendOp); dst.alphaBlendOperation = MTLBlendOperation(src.alphaBlendOp); dst.sourceRGBBlendFactor = MTLBlendFactor(src.srcRGBBlendFactor); dst.sourceAlphaBlendFactor = MTLBlendFactor(src.srcAlphaBlendFactor); dst.destinationRGBBlendFactor = MTLBlendFactor(src.dstRGBBlendFactor); dst.destinationAlphaBlendFactor = MTLBlendFactor(src.dstAlphaBlendFactor); } // Depth and Stencil metalDesc.depthAttachmentPixelFormat = Texture::textureFormatToMTLPixelFormat(desc.targetDesc.depthAttachmentFormat); metalDesc.stencilAttachmentPixelFormat = Texture::textureFormatToMTLPixelFormat(desc.targetDesc.stencilAttachmentFormat); MTLRenderPipelineReflection* reflection = nil; // Create reflection for use later in binding, etc. id metalObject = [device_ newRenderPipelineStateWithDescriptor:metalDesc options:MTLPipelineOptionArgumentInfo | MTLPipelineOptionBufferTypeInfo reflection:&reflection error:&error]; setResultFrom(outResult, error); if (error != nil) { IGL_LOG_ERROR("%s\n", [error.localizedDescription UTF8String]); return nullptr; } return std::make_shared(metalObject, reflection, desc); } std::shared_ptr Device::createMeshRenderPipeline( const RenderPipelineDesc& desc, Result* outResult) const { if (@available(iOS 16, macOS 13, *)) { // Check if the device supports mesh shaders // Mesh shaders require Apple GPU Family 7 or higher (A14/M1 and later) if (@available(iOS 16, macOS 13, *)) { if (![device_ supportsFamily:MTLGPUFamilyApple7]) { Result::setResult(outResult, Result::Code::Unsupported, "Mesh shaders require Apple GPU Family 7 or higher (A14/M1 and later)"); return nullptr; } } NSError* error = nil; MTLMeshRenderPipelineDescriptor* metalDesc = [MTLMeshRenderPipelineDescriptor new]; metalDesc.label = [NSString stringWithUTF8String:desc.debugName.c_str()]; metalDesc.rasterSampleCount = desc.sampleCount; if (!IGL_DEBUG_VERIFY(desc.shaderStages)) { Result::setResult( outResult, Result::Code::RuntimeError, "RenderPipeline requires shader stages"); return nullptr; } if (!IGL_DEBUG_VERIFY(desc.shaderStages->getType() == ShaderStagesType::RenderMeshShader)) { Result::setResult( outResult, Result::Code::ArgumentInvalid, "Shader stages not for mesh render"); return nullptr; } // Mesh shader is required auto meshModule = desc.shaderStages->getMeshModule(); if (!IGL_DEBUG_VERIFY(meshModule)) { Result::setResult( outResult, Result::Code::RuntimeError, "MeshRenderPipeline requires mesh module"); return nullptr; } auto* meshFunc = static_cast(meshModule.get()); metalDesc.meshFunction = meshFunc->get(); if (!IGL_DEBUG_VERIFY(metalDesc.meshFunction)) { Result::setResult( outResult, Result::Code::RuntimeError, "RenderPipeline requires non-null mesh function"); return nullptr; } // Task shader is optional auto taskModule = desc.shaderStages->getTaskModule(); if (taskModule) { auto* taskFunc = static_cast(taskModule.get()); metalDesc.objectFunction = taskFunc->get(); } // Fragment shader is optional auto fragmentModule = desc.shaderStages->getFragmentModule(); if (fragmentModule) { auto* fragmentFunc = static_cast(fragmentModule.get()); metalDesc.fragmentFunction = fragmentFunc->get(); } // Framebuffer for (uint32_t i = 0; i < desc.targetDesc.colorAttachments.size(); ++i) { const auto& src = desc.targetDesc.colorAttachments[i]; if (igl::TextureFormat::Invalid == src.textureFormat) { continue; } MTLRenderPipelineColorAttachmentDescriptor* dst = metalDesc.colorAttachments[i]; dst.pixelFormat = Texture::textureFormatToMTLPixelFormat(src.textureFormat); dst.writeMask = RenderPipelineState::convertColorWriteMask(src.colorWriteMask); dst.blendingEnabled = src.blendEnabled; dst.rgbBlendOperation = MTLBlendOperation(src.rgbBlendOp); dst.alphaBlendOperation = MTLBlendOperation(src.alphaBlendOp); dst.sourceRGBBlendFactor = MTLBlendFactor(src.srcRGBBlendFactor); dst.sourceAlphaBlendFactor = MTLBlendFactor(src.srcAlphaBlendFactor); dst.destinationRGBBlendFactor = MTLBlendFactor(src.dstRGBBlendFactor); dst.destinationAlphaBlendFactor = MTLBlendFactor(src.dstAlphaBlendFactor); } // Depth and Stencil metalDesc.depthAttachmentPixelFormat = Texture::textureFormatToMTLPixelFormat(desc.targetDesc.depthAttachmentFormat); metalDesc.stencilAttachmentPixelFormat = Texture::textureFormatToMTLPixelFormat(desc.targetDesc.stencilAttachmentFormat); MTLRenderPipelineReflection* reflection = nil; // Create reflection for use later in binding, etc. id metalObject = [device_ newRenderPipelineStateWithMeshDescriptor:metalDesc options:MTLPipelineOptionArgumentInfo | MTLPipelineOptionBufferTypeInfo reflection:&reflection error:&error]; setResultFrom(outResult, error); if (error != nil) { IGL_LOG_ERROR("%s\n", [error.localizedDescription UTF8String]); return nullptr; } return std::make_shared(metalObject, reflection, desc); } else { IGL_DEBUG_ASSERT_NOT_REACHED(); return nullptr; } } std::unique_ptr Device::createShaderLibrary(const ShaderLibraryDesc& desc, Result* outResult) const { if (IGL_DEBUG_VERIFY_NOT(desc.moduleInfo.empty())) { Result::setResult(outResult, Result::Code::ArgumentInvalid); return nullptr; } id metalLibrary = nil; NSError* error = nil; if (desc.input.type == ShaderInputType::Binary) { if (desc.input.length == 0 || desc.input.data == nullptr) { Result::setResult(outResult, Result::Code::ArgumentNull); return nullptr; } // With null queue and destructor, dispatch_data_create() function stores a pointer to the data // buffer and leaves the responsibility of releasing the buffer to the client auto data = dispatch_data_create(desc.input.data, desc.input.length, nullptr /* dispatch_queue_t queue */, nullptr /* dispatch_block_t destructor */ ); metalLibrary = [device_ newLibraryWithData:data error:&error]; } else { if (!desc.input.source || !strlen(desc.input.source)) { Result::setResult(outResult, Result::Code::ArgumentNull); return nullptr; } MTLCompileOptions* compileOpts = [MTLCompileOptions new]; compileOpts.fastMathEnabled = desc.input.options.fastMathEnabled; NSString* shaderSource = [NSString stringWithUTF8String:desc.input.source]; metalLibrary = [device_ newLibraryWithSource:shaderSource options:compileOpts error:&error]; deviceStatistics_.incrementShaderCompilationCount(); } if (!metalLibrary) { IGL_DEBUG_ASSERT(!error, "%s\n", [error.localizedDescription UTF8String]); setResultFrom(outResult, error); return nullptr; } if (error) { // Compilation successful but with warnings IGL_LOG_INFO("%s\n", [error.localizedDescription UTF8String]); } std::vector> modules; modules.reserve(desc.moduleInfo.size()); for (const auto& info : desc.moduleInfo) { NSString* shaderEntrypoint = [NSString stringWithUTF8String:info.entryPoint.c_str()]; if (!shaderEntrypoint) { Result::setResult(outResult, Result::Code::RuntimeError); return nullptr; } auto metalFunction = [metalLibrary newFunctionWithName:shaderEntrypoint]; if (!metalFunction) { IGL_DEBUG_ABORT("Could not find function '%s' in library\n", info.entryPoint.c_str()); Result::setResult( outResult, Result::Code::RuntimeError, "Could not find function in library"); return nullptr; } modules.emplace_back(std::make_shared(info, metalFunction)); if (auto resourceTracker = getResourceTracker(); resourceTracker && !modules.empty()) { modules.back()->initResourceTracker(resourceTracker, desc.debugName); } } auto shaderLibrary = std::make_unique(std::move(modules)); if (auto resourceTracker = getResourceTracker()) { shaderLibrary->initResourceTracker(resourceTracker, desc.debugName); } Result::setOk(outResult); return shaderLibrary; } std::shared_ptr Device::createShaderModule(const ShaderModuleDesc& desc, Result* outResult) const { auto libraryDesc = desc.input.type == ShaderInputType::String ? ShaderLibraryDesc::fromStringInput(desc.input.source, {desc.info}, desc.debugName) : ShaderLibraryDesc::fromBinaryInput( desc.input.data, desc.input.length, {desc.info}, desc.debugName); auto library = createShaderLibrary(libraryDesc, outResult); if (library != nullptr) { return library->getShaderModule(desc.info.entryPoint); } return nullptr; } std::unique_ptr Device::createShaderStages(const ShaderStagesDesc& desc, Result* outResult) const { const Result result; auto stages = std::make_unique(desc); if (auto resourceTracker = getResourceTracker()) { stages->initResourceTracker(resourceTracker, desc.debugName); } Result::setResult(outResult, result.code, result.message); if (!result.isOk()) { return nullptr; } return std::move(stages); } const PlatformDevice& Device::getPlatformDevice() const noexcept { return platformDevice_; } bool Device::isAppleGpu() const { #if IGL_PLATFORM_IOS return true; #else if (@available(macOS 10.15, *)) { std::string gpuName = [device_.name UTF8String]; return gpuName.find("Apple") != std::string::npos; } else { // Apple Macs didn't exist yet. return false; } #endif } bool Device::hasFeature(DeviceFeatures feature) const { return deviceFeatureSet_.hasFeature(feature); } bool Device::hasRequirement(DeviceRequirement requirement) const { return deviceFeatureSet_.hasRequirement(requirement); } bool Device::getFeatureLimits(DeviceFeatureLimits featureLimits, size_t& result) const { return deviceFeatureSet_.getFeatureLimits(featureLimits, result); } ICapabilities::TextureFormatCapabilities Device::getTextureFormatCapabilities( TextureFormat format) const { return deviceFeatureSet_.getTextureFormatCapabilities(format); } ShaderVersion Device::getShaderVersion() const { // From https://developer.apple.com/documentation/metal/mtllanguageversion ShaderVersion version{.family = ShaderFamily::Metal}; #if IGL_PLATFORM_IOS if (@available(iOS 15, *)) { version.majorVersion = 2; version.minorVersion = 4; } else if (@available(iOS 14, *)) { version.majorVersion = 2; version.minorVersion = 3; } else if (@available(iOS 13, *)) { version.majorVersion = 2; version.minorVersion = 2; } else if (@available(iOS 12, *)) { version.majorVersion = 2; version.minorVersion = 1; } else if (@available(iOS 11, *)) { version.majorVersion = 2; version.minorVersion = 0; } else if (@available(iOS 10, *)) { version.majorVersion = 1; version.minorVersion = 2; } else if (@available(iOS 9, *)) { version.majorVersion = 1; version.minorVersion = 1; } #elif IGL_PLATFORM_MACOSX || IGL_PLATFORM_MACCATALYST if (@available(macOS 12.0, *)) { version.majorVersion = 2; version.minorVersion = 4; } else if (@available(macOS 11.0, *)) { version.majorVersion = 2; version.minorVersion = 3; } else if (@available(macOS 10.15, *)) { version.majorVersion = 2; version.minorVersion = 2; } else if (@available(macOS 10.14, *)) { version.majorVersion = 2; version.minorVersion = 1; } else if (@available(macOS 10.13, *)) { version.majorVersion = 2; version.minorVersion = 0; } else if (@available(macOS 10.12, *)) { version.majorVersion = 1; version.minorVersion = 2; } else if (@available(macOS 10.11, *)) { version.majorVersion = 1; version.minorVersion = 1; } #endif return version; } BackendVersion Device::getBackendVersion() const { if (@available(macOS 13.0, iOS 16.0, *)) { return {.flavor = BackendFlavor::Metal, .majorVersion = 3, .minorVersion = 0}; } #if TARGET_OS_OSX #if TARGET_CPU_ARM64 if (@available(macOS 10.13, iOS 11.0, *)) { return {BackendFlavor::Metal, 2, 0}; } #else if (@available(macOS 11.0, iOS 11.0, *)) { return {BackendFlavor::Metal, 2, 0}; } #endif #endif return {.flavor = BackendFlavor::Metal, .majorVersion = 1, .minorVersion = 0}; } size_t Device::getCurrentDrawCount() const { return deviceStatistics_.getDrawCount(); } size_t Device::getShaderCompilationCount() const { return deviceStatistics_.getShaderCompilationCount(); } size_t Device::getGPUMemoryUsage() const { return [device_ currentAllocatedSize]; } MTLStorageMode Device::toMTLStorageMode(ResourceStorage storage) { switch (storage) { case ResourceStorage::Private: return MTLStorageModePrivate; case ResourceStorage::Shared: return MTLStorageModeShared; #if IGL_PLATFORM_MACOSX || IGL_PLATFORM_MACCATALYST case ResourceStorage::Managed: case ResourceStorage::Memoryless: case ResourceStorage::Invalid: default: return MTLStorageModeManaged; #else case ResourceStorage::Memoryless: return MTLStorageModeMemoryless; case ResourceStorage::Managed: case ResourceStorage::Invalid: default: return MTLStorageModeShared; #endif } } MTLResourceOptions Device::toMTLResourceStorageMode(ResourceStorage storage) { switch (storage) { case ResourceStorage::Private: return MTLResourceStorageModePrivate; case ResourceStorage::Shared: return MTLResourceStorageModeShared; #if IGL_PLATFORM_MACOSX || IGL_PLATFORM_MACCATALYST case ResourceStorage::Managed: case ResourceStorage::Memoryless: case ResourceStorage::Invalid: default: return MTLResourceStorageModeManaged; #else case ResourceStorage::Memoryless: return MTLResourceStorageModeMemoryless; case ResourceStorage::Managed: case ResourceStorage::Invalid: default: return MTLResourceStorageModeShared; #endif } } std::shared_ptr Device::getMostRecentCommandQueue() const noexcept { return mostRecentCommandQueue_; } Holder Device::createBindGroup( const BindGroupTextureDesc& desc, const IRenderPipelineState* IGL_NULLABLE /*compatiblePipeline*/, Result* IGL_NULLABLE outResult) { IGL_DEBUG_ASSERT(!desc.debugName.empty(), "Each bind group should have a debug name"); BindGroupTextureDesc description(desc); const auto handle = bindGroupTexturesPool.create(std::move(description)); Result::setResult(outResult, handle.empty() ? Result(Result::Code::RuntimeError, "Cannot create bind group") : Result()); return {this, handle}; } Holder Device::createBindGroup(const BindGroupBufferDesc& desc, Result* IGL_NULLABLE outResult) { IGL_DEBUG_ASSERT(!desc.debugName.empty(), "Each bind group should have a debug name"); BindGroupBufferDesc description(desc); const auto handle = bindGroupBuffersPool.create(std::move(description)); Result::setResult(outResult, handle.empty() ? Result(Result::Code::RuntimeError, "Cannot create bind group") : Result()); return {this, handle}; } void Device::destroy(BindGroupTextureHandle handle) { if (handle.empty()) { return; } bindGroupTexturesPool.destroy(handle); } void Device::destroy(BindGroupBufferHandle handle) { if (handle.empty()) { return; } bindGroupBuffersPool.destroy(handle); } void Device::destroy(SamplerHandle handle) { (void)handle; // IGL/Metal is not using sampler handles } base::IFramebufferInterop* IGL_NULLABLE Device::createFramebufferInterop(const base::FramebufferInteropDesc& desc) { auto framebuffer = createFramebufferFromBaseDesc(desc); if (!framebuffer) { return nullptr; } return new (std::nothrow) FramebufferWrapper(std::move(framebuffer)); } } // namespace igl::metal ================================================ FILE: src/igl/metal/DeviceFeatureSet.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #import #include namespace igl::metal { class DeviceFeatureSet final { public: explicit DeviceFeatureSet(id device); ~DeviceFeatureSet() = default; [[nodiscard]] bool hasFeature(DeviceFeatures feature) const; [[nodiscard]] bool hasRequirement(DeviceRequirement requirement) const; bool getFeatureLimits(DeviceFeatureLimits featureLimits, size_t& result) const; [[nodiscard]] ICapabilities::TextureFormatCapabilities getTextureFormatCapabilities( TextureFormat format) const; private: // Apple GPU family as defined by MTLGPUFamily and the docs: // https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf // Apple2: iOS: A8 // Apple3: iOS: A9, A10 // Apple4: iOS: A11 // Apple5: iOS: A12 // Apple6: iOS: A13 // Apple7: iOS: A14 Mac: M1 // Apple8: iOS: A15, A16 Mac: M2 // Apple9: iOS: A16 Mac: M3 // // MTLGPUFamily enum isn't available until macos(10.15), ios(13.0) // also MTLGPUFamily includes enum values that don't directly correspond to a GPU // so we use an integer representation that maps to Apple GPU family 2+ size_t gpuFamily_; size_t maxMultisampleCount_; size_t maxBufferLength_; bool supports32BitFloatFiltering_ = false; bool supportsTimestampQueries_ = false; }; } // namespace igl::metal ================================================ FILE: src/igl/metal/DeviceFeatureSet.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include // get the GPU family from the device // a return value of 0 indicates an error or lack of a supported GPU static size_t getGPUFamily(id device) { // the new supportsFamily API is applicable to both iOS and macOS if (@available(macOS 10.15, iOS 13.0, *)) { using GPUFamilyPair = std::pair; const std::vector gpuFamilies = { // @fb-only // @fb-only {MTLGPUFamilyApple8, 8}, {MTLGPUFamilyApple7, 7}, {MTLGPUFamilyApple6, 6}, {MTLGPUFamilyApple5, 5}, {MTLGPUFamilyApple4, 4}, {MTLGPUFamilyApple3, 3}, {MTLGPUFamilyApple2, 2}, {MTLGPUFamilyApple1, 1}}; // return the first (highest) supported GPU family for (const GPUFamilyPair& gpuFam : gpuFamilies) { if ([device supportsFamily:gpuFam.first]) { return gpuFam.second; } } } else { // resort to the old deprecated API supportsFeatureSet for older OS versions using FeatureSetPair = std::pair; std::vector featureSets; #if IGL_PLATFORM_IOS if (@available(iOS 12, *)) { featureSets.emplace_back(MTLFeatureSet_iOS_GPUFamily5_v1, 5); featureSets.emplace_back(MTLFeatureSet_iOS_GPUFamily4_v2, 4); featureSets.emplace_back(MTLFeatureSet_iOS_GPUFamily3_v4, 3); featureSets.emplace_back(MTLFeatureSet_iOS_GPUFamily2_v5, 2); featureSets.emplace_back(MTLFeatureSet_iOS_GPUFamily1_v5, 1); } else if (@available(iOS 11, *)) { featureSets.emplace_back(MTLFeatureSet_iOS_GPUFamily4_v1, 4); featureSets.emplace_back(MTLFeatureSet_iOS_GPUFamily3_v3, 3); featureSets.emplace_back(MTLFeatureSet_iOS_GPUFamily2_v4, 2); featureSets.emplace_back(MTLFeatureSet_iOS_GPUFamily1_v4, 1); } else if (@available(iOS 10, *)) { featureSets.emplace_back(MTLFeatureSet_iOS_GPUFamily3_v2, 3); featureSets.emplace_back(MTLFeatureSet_iOS_GPUFamily2_v3, 2); featureSets.emplace_back(MTLFeatureSet_iOS_GPUFamily1_v3, 1); } else if (@available(iOS 9, *)) { featureSets.emplace_back(MTLFeatureSet_iOS_GPUFamily3_v1, 3); featureSets.emplace_back(MTLFeatureSet_iOS_GPUFamily2_v2, 2); featureSets.emplace_back(MTLFeatureSet_iOS_GPUFamily1_v2, 1); } else { IGL_DEBUG_ABORT("IGL iOS deployment target is 9.0+"); return 0; } #elif IGL_PLATFORM_MACOSX if (@available(macOS 10.14, *)) { featureSets.emplace_back(MTLFeatureSet_macOS_GPUFamily2_v1, 2); featureSets.emplace_back(MTLFeatureSet_macOS_GPUFamily1_v4, 1); } else if (@available(macOS 10.13, *)) { featureSets.emplace_back(MTLFeatureSet_macOS_GPUFamily1_v3, 1); } else if (@available(macOS 10.12, *)) { featureSets.emplace_back(MTLFeatureSet_macOS_GPUFamily1_v2, 1); } else if (@available(macOS 10.11, *)) { featureSets.emplace_back(MTLFeatureSet_macOS_GPUFamily1_v1, 1); } else { IGL_DEBUG_ABORT("IGL macOS deployment target is 10.11+"); return 0; } #endif // return the first (highest) supported GPU family for (const FeatureSetPair& featureSet : featureSets) { if ([device supportsFeatureSet:featureSet.first]) { return featureSet.second; } } } IGL_LOG_INFO("No supported GPU family available"); return 0; } namespace igl::metal { DeviceFeatureSet::DeviceFeatureSet(id device) { gpuFamily_ = getGPUFamily(device); // Get the supported MSAA maxMultisampleCount_ = 0; for (auto i = 1; i <= IGL_TEXTURE_SAMPLERS_MAX; i *= 2) { if ([device supportsTextureSampleCount:i]) { maxMultisampleCount_ = i; } else { break; } } // get max buffer length maxBufferLength_ = [device maxBufferLength]; if (@available(macOS 11.0, iOS 14.0, *)) { // this API became available as of iOS 14 and macOS 11 supports32BitFloatFiltering_ = device.supports32BitFloatFiltering; } if (@available(macOS 10.15, iOS 14.0, *)) { for (id counterSet = nullptr in device.counterSets) { if ([counterSet.name isEqualToString:MTLCommonCounterSetTimestamp]) { supportsTimestampQueries_ = true; break; } } } } bool DeviceFeatureSet::hasFeature(DeviceFeatures feature) const { // Metal supports all the basic features on iOS9.0+ // see reference https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf // For more advanced features, use gpu family and version to determine availability switch (feature) { case DeviceFeatures::MultiSample: case DeviceFeatures::MultiSampleResolve: case DeviceFeatures::TextureFilterAnisotropic: case DeviceFeatures::MapBufferRange: case DeviceFeatures::MultipleRenderTargets: case DeviceFeatures::StandardDerivative: case DeviceFeatures::TextureFormatRG: case DeviceFeatures::ReadWriteFramebuffer: case DeviceFeatures::TextureNotPot: case DeviceFeatures::TextureHalfFloat: case DeviceFeatures::TextureFloat: case DeviceFeatures::ShaderTextureLod: case DeviceFeatures::DepthShaderRead: case DeviceFeatures::MinMaxBlend: case DeviceFeatures::UniformBlocks: case DeviceFeatures::ExplicitBinding: case DeviceFeatures::Texture2DArray: case DeviceFeatures::Texture3D: case DeviceFeatures::SRGB: case DeviceFeatures::SRGBSwapchain: case DeviceFeatures::DrawFirstIndexFirstVertex: case DeviceFeatures::DrawIndexedIndirect: return true; case DeviceFeatures::MeshShaders: if (@available(iOS 16, macOS 13, *)) { // check if the device supports mesh shaders // mesh shaders require Apple GPU Family 7 or higher (A14/M1 and later) return gpuFamily_ >= 7; } else { return false; } case DeviceFeatures::DrawInstanced: return gpuFamily_ >= 3; case DeviceFeatures::CopyBuffer: return false; // not implemented (yet) case DeviceFeatures::Indices8Bit: return false; // on Metal and Vulkan, the framebuffer pixel format dictates sRGB control. case DeviceFeatures::SRGBWriteControl: return false; // No current Metal devices support packed, uncompressed RGB textures. case DeviceFeatures::TextureFormatRGB: return false; case DeviceFeatures::ExplicitBindingExt: case DeviceFeatures::StandardDerivativeExt: case DeviceFeatures::ShaderTextureLodExt: return false; case DeviceFeatures::DepthCompare: /// docs say: /// The MTLFeatureSet_iOS_GPUFamily2_v1 and MTLFeatureSet_OSX_GPUFamily1_v1 feature sets allow /// you to define a framework-side sampler comparison function for a MTLSamplerState object. /// All feature sets support shader-side sampler comparison functions, as described in the /// Metal Shading Language Guide. #if IGL_PLATFORM_IOS return gpuFamily_ >= 2; #else return gpuFamily_ >= 1; #endif case DeviceFeatures::TextureExternalImage: return false; case DeviceFeatures::Compute: return true; case DeviceFeatures::TextureBindless: return false; case DeviceFeatures::BufferDeviceAddress: return false; case DeviceFeatures::Multiview: case DeviceFeatures::MultiViewMultisample: return false; case DeviceFeatures::BindUniform: return false; case DeviceFeatures::TexturePartialMipChain: return true; case DeviceFeatures::BufferRing: return true; case DeviceFeatures::BufferNoCopy: return true; case DeviceFeatures::StorageBuffers: return true; case DeviceFeatures::ShaderLibrary: return true; case DeviceFeatures::BindBytes: return true; case DeviceFeatures::TextureArrayExt: return false; case DeviceFeatures::SamplerMinMaxLod: return true; case DeviceFeatures::ValidationLayersEnabled: return false; case DeviceFeatures::ExternalMemoryObjects: return false; case DeviceFeatures::PushConstants: return false; case DeviceFeatures::TextureViews: return false; case DeviceFeatures::Timers: return true; case DeviceFeatures::TimestampQueries: return supportsTimestampQueries_; } return false; } bool DeviceFeatureSet::hasRequirement(DeviceRequirement requirement) const { switch (requirement) { case DeviceRequirement::ExplicitBindingExtReq: case DeviceRequirement::StandardDerivativeExtReq: case DeviceRequirement::TextureArrayExtReq: case DeviceRequirement::TextureFormatRGExtReq: case DeviceRequirement::ShaderTextureLodExtReq: return false; } return true; } // iOS 9 plus implementation bool DeviceFeatureSet::getFeatureLimits(DeviceFeatureLimits featureLimits, size_t& result) const { switch (featureLimits) { case DeviceFeatureLimits::MaxTextureDimension1D2D: case DeviceFeatureLimits::MaxCubeMapDimension: #if IGL_PLATFORM_IOS result = (gpuFamily_ <= 2) ? 8192 : 16384; #else // macos result = 16384; #endif return true; case DeviceFeatureLimits::MaxFragmentUniformVectors: // According to Metal gurus, this should be identical to MaxVertexUniformVectors case DeviceFeatureLimits::MaxVertexUniformVectors: // MaxVertexUniformVectors = number of vec4 { const size_t maxBuffers = 31; result = (maxBuffers * maxBufferLength_) / (sizeof(float) * 4); return true; } case DeviceFeatureLimits::MaxMultisampleCount: result = maxMultisampleCount_; return true; case DeviceFeatureLimits::MaxPushConstantBytes: result = 4096; return true; case DeviceFeatureLimits::MaxStorageBufferBytes: case DeviceFeatureLimits::MaxUniformBufferBytes: result = maxBufferLength_; return true; case DeviceFeatureLimits::PushConstantsAlignment: result = 16; return true; case DeviceFeatureLimits::ShaderStorageBufferOffsetAlignment: case DeviceFeatureLimits::BufferAlignment: { // Since IGL currently doesn't distinguish how buffers are being used, for consistency reasons, // we currently assume BufferAlignment means Constant Buffer offset alignment #if IGL_PLATFORM_MACOSX result = 32; #elif IGL_PLATFORM_IOS_SIMULATOR result = 256; #else result = 16; #endif return true; } case DeviceFeatureLimits::BufferNoCopyAlignment: { IGL_DEBUG_ASSERT(getpagesize() > 0); result = static_cast(getpagesize()); return true; } case DeviceFeatureLimits::MaxBindBytesBytes: result = 4096; return true; case DeviceFeatureLimits::MaxTextureDimension3D: #if IGL_PLATFORM_IOS result = (gpuFamily_ <= 2) ? 2048 : 2048; #else result = 2048; #endif return true; case DeviceFeatureLimits::MaxComputeWorkGroupSizeX: case DeviceFeatureLimits::MaxComputeWorkGroupSizeY: case DeviceFeatureLimits::MaxComputeWorkGroupSizeZ: result = 1024; return true; case DeviceFeatureLimits::MaxComputeWorkGroupInvocations: result = 1024; return true; case DeviceFeatureLimits::MaxVertexInputAttributes: result = 31; return true; case DeviceFeatureLimits::MaxColorAttachments: result = 8; return true; default: IGL_DEBUG_ABORT( "invalid feature limit query: feature limit query is not implemented or does not exist\n"); return false; } } ICapabilities::TextureFormatCapabilities DeviceFeatureSet::getTextureFormatCapabilities( TextureFormat format) const { const auto all = ICapabilities::TextureFormatCapabilityBits::All; const auto sampled = ICapabilities::TextureFormatCapabilityBits::Sampled; const auto attachment = ICapabilities::TextureFormatCapabilityBits::Attachment; const auto storage = ICapabilities::TextureFormatCapabilityBits::Storage; const auto sampledFiltered = ICapabilities::TextureFormatCapabilityBits::SampledFiltered; const auto sampledAttachment = ICapabilities::TextureFormatCapabilityBits::SampledAttachment; const auto unsupported = ICapabilities::TextureFormatCapabilityBits::Unsupported; switch (format) { case TextureFormat::Invalid: return unsupported; // 8 bpp case TextureFormat::A_UNorm8: return sampled; case TextureFormat::R_UNorm8: return all; // 16 bpp case TextureFormat::R_F16: return all; case TextureFormat::R_UInt16: return sampled | storage | attachment | sampledAttachment; case TextureFormat::R_UNorm16: return all; case TextureFormat::B5G5R5A1_UNorm: #if IGL_PLATFORM_MACOSX || IGL_PLATFORM_MACCATALYST || IGL_PLATFORM_IOS_SIMULATOR return unsupported; #else return sampled | attachment | sampledAttachment; #endif case TextureFormat::B5G6R5_UNorm: #if IGL_PLATFORM_MACOSX || IGL_PLATFORM_MACCATALYST || IGL_PLATFORM_IOS_SIMULATOR return unsupported; #else return sampled | attachment | sampledAttachment; #endif case TextureFormat::ABGR_UNorm4: #if IGL_PLATFORM_MACOSX || IGL_PLATFORM_MACCATALYST || IGL_PLATFORM_IOS_SIMULATOR return unsupported; #else return sampled | attachment | sampledAttachment; #endif case TextureFormat::RG_UNorm8: return all; case TextureFormat::R4G2B2_UNorm_Apple: return sampled; case TextureFormat::R4G2B2_UNorm_Rev_Apple: return sampled; case TextureFormat::RGBA_UNorm8: case TextureFormat::BGRA_UNorm8: case TextureFormat::RGB10_A2_UNorm_Rev: case TextureFormat::BGR10_A2_Unorm: case TextureFormat::RGBA_SRGB: case TextureFormat::BGRA_SRGB: return all; case TextureFormat::RGB10_A2_Uint_Rev: return (sampled | storage | attachment | sampledAttachment); // 32 bpp case TextureFormat::RG_F16: return all; case TextureFormat::RG_UInt16: return sampled | storage | attachment | sampledAttachment; case TextureFormat::RG_UNorm16: return all; case TextureFormat::R_F32: return sampled | storage | attachment | sampledAttachment | (supports32BitFloatFiltering_ ? sampledFiltered : 0); case TextureFormat::R_UInt32: return sampled | storage | attachment | sampledAttachment; // 64 bpp case TextureFormat::RGBA_UNorm16: return all; case TextureFormat::RGBA_F16: return all; case TextureFormat::RG_F32: return sampled | storage | attachment | sampledAttachment | (supports32BitFloatFiltering_ ? sampledFiltered : 0); // 96 bpp case TextureFormat::RGB_F32: return unsupported; // 128 bps case TextureFormat::RGBA_UInt32: return sampled | storage | attachment | sampledAttachment; case TextureFormat::RGBA_F32: return sampled | storage | attachment | sampledAttachment | (supports32BitFloatFiltering_ ? sampledFiltered : 0); // Compressed formats case TextureFormat::RGBA_ASTC_4x4: case TextureFormat::SRGB8_A8_ASTC_4x4: case TextureFormat::RGBA_ASTC_5x4: case TextureFormat::SRGB8_A8_ASTC_5x4: case TextureFormat::RGBA_ASTC_5x5: case TextureFormat::SRGB8_A8_ASTC_5x5: case TextureFormat::RGBA_ASTC_6x5: case TextureFormat::SRGB8_A8_ASTC_6x5: case TextureFormat::RGBA_ASTC_6x6: case TextureFormat::SRGB8_A8_ASTC_6x6: case TextureFormat::RGBA_ASTC_8x5: case TextureFormat::SRGB8_A8_ASTC_8x5: case TextureFormat::RGBA_ASTC_8x6: case TextureFormat::SRGB8_A8_ASTC_8x6: case TextureFormat::RGBA_ASTC_8x8: case TextureFormat::SRGB8_A8_ASTC_8x8: case TextureFormat::RGBA_ASTC_10x5: case TextureFormat::SRGB8_A8_ASTC_10x5: case TextureFormat::RGBA_ASTC_10x6: case TextureFormat::SRGB8_A8_ASTC_10x6: case TextureFormat::RGBA_ASTC_10x8: case TextureFormat::SRGB8_A8_ASTC_10x8: case TextureFormat::RGBA_ASTC_10x10: case TextureFormat::SRGB8_A8_ASTC_10x10: case TextureFormat::RGBA_ASTC_12x10: case TextureFormat::SRGB8_A8_ASTC_12x10: case TextureFormat::RGBA_ASTC_12x12: case TextureFormat::SRGB8_A8_ASTC_12x12: #if TARGET_OS_OSX return unsupported; #else if (gpuFamily_ >= 2) { return sampled; } else { return unsupported; } #endif case TextureFormat::RGBA_PVRTC_2BPPV1: case TextureFormat::RGB_PVRTC_2BPPV1: case TextureFormat::RGBA_PVRTC_4BPPV1: case TextureFormat::RGB_PVRTC_4BPPV1: #if TARGET_OS_OSX return unsupported; #else return sampled; #endif case TextureFormat::RGB8_ETC2: case TextureFormat::RGBA8_EAC_ETC2: #if TARGET_OS_OSX return unsupported; #else return sampled; #endif case TextureFormat::RGBA_BC7_UNORM_4x4: case TextureFormat::RGBA_BC7_SRGB_4x4: #if IGL_PLATFORM_MACOSX || IGL_PLATFORM_MACCATALYST return sampled; #else return unsupported; #endif // Depth and stencil formats case TextureFormat::Z_UNorm16: // This exists in Metal, but we unconditionally force it to Depth32Float return sampled | sampledFiltered | attachment | sampledAttachment; case TextureFormat::Z_UNorm24: // This doesn't exist in Metal, but we map it to Depth32Float return sampled | attachment | sampledAttachment; case TextureFormat::Z_UNorm32: // This doesn't exist in Metal, but we map it to Depth32Float return sampled | attachment | sampledAttachment; case TextureFormat::S8_UInt_Z24_UNorm: // This exists in Metal for macOS, but we unconditionally force it to Depth32Float_Stencil8 #if TARGET_OS_OSX return sampled | attachment | sampledAttachment; #else return sampled; #endif case TextureFormat::S8_UInt_Z32_UNorm: #if TARGET_OS_OSX return sampled | attachment | sampledAttachment; #else return sampled; #endif case TextureFormat::S_UInt8: return sampled | attachment | sampledAttachment; // Formats with no support in IGL Metal case TextureFormat::L_UNorm8: case TextureFormat::LA_UNorm8: case TextureFormat::R5G5B5A1_UNorm: case TextureFormat::RGBX_UNorm8: case TextureFormat::BGRA_UNorm8_Rev: case TextureFormat::RGB_F16: case TextureFormat::RGB8_ETC1: case TextureFormat::RGB8_Punchthrough_A1_ETC2: case TextureFormat::SRGB8_ETC2: case TextureFormat::SRGB8_Punchthrough_A1_ETC2: case TextureFormat::SRGB8_A8_EAC_ETC2: case TextureFormat::RG_EAC_UNorm: case TextureFormat::RG_EAC_SNorm: case TextureFormat::R_EAC_UNorm: case TextureFormat::R_EAC_SNorm: case TextureFormat::YUV_NV12: case TextureFormat::YUV_420p: // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only return unsupported; } return unsupported; } } // namespace igl::metal ================================================ FILE: src/igl/metal/DeviceStatistics.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::metal { class DeviceStatistics { public: [[nodiscard]] size_t getDrawCount() const noexcept; [[nodiscard]] size_t getShaderCompilationCount() const noexcept; private: friend class CommandQueue; friend class Device; void incrementDrawCount(uint32_t newDrawCount) noexcept; void incrementShaderCompilationCount() noexcept; std::atomic currentDrawCount_{0}; std::atomic shaderCompilationCount_{0}; }; } // namespace igl::metal ================================================ FILE: src/igl/metal/DeviceStatistics.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include namespace igl::metal { void DeviceStatistics::incrementDrawCount(uint32_t newDrawCount) noexcept { currentDrawCount_.fetch_add(newDrawCount, std::memory_order_relaxed); } size_t DeviceStatistics::getDrawCount() const noexcept { return currentDrawCount_.load(std::memory_order_relaxed); } void DeviceStatistics::incrementShaderCompilationCount() noexcept { shaderCompilationCount_.fetch_add(1, std::memory_order_relaxed); } size_t DeviceStatistics::getShaderCompilationCount() const noexcept { return shaderCompilationCount_.load(std::memory_order_relaxed); } } // namespace igl::metal ================================================ FILE: src/igl/metal/Framebuffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include @protocol MTLTexture; namespace igl::metal { class Framebuffer : public IFramebuffer { public: explicit Framebuffer(FramebufferDesc value); ~Framebuffer() override = default; // Accessors [[nodiscard]] std::vector getColorAttachmentIndices() const override; [[nodiscard]] std::shared_ptr getColorAttachment(size_t index) const override; [[nodiscard]] std::shared_ptr getResolveColorAttachment(size_t index) const override; [[nodiscard]] std::shared_ptr getDepthAttachment() const override; [[nodiscard]] std::shared_ptr getResolveDepthAttachment() const override; [[nodiscard]] std::shared_ptr getStencilAttachment() const override; [[nodiscard]] FramebufferMode getMode() const override; [[nodiscard]] bool isSwapchainBound() const override; // Methods void copyBytesColorAttachment(ICommandQueue& cmdQueue, size_t index, void* pixelBytes, const TextureRangeDesc& range, size_t bytesPerRow = 0) const override; void copyBytesDepthAttachment(ICommandQueue& cmdQueue, void* pixelBytes, const TextureRangeDesc& range, size_t bytesPerRow = 0) const override; void copyBytesStencilAttachment(ICommandQueue& cmdQueue, void* pixelBytes, const TextureRangeDesc& range, size_t bytesPerRow = 0) const override; void copyTextureColorAttachment(ICommandQueue& cmdQueue, size_t index, std::shared_ptr destTexture, const TextureRangeDesc& range) const override; void updateDrawable(std::shared_ptr texture) override; void updateDrawable(SurfaceTextures surfaceTextures) override; void updateResolveAttachment(std::shared_ptr texture) override; IGL_INLINE const FramebufferDesc& get() const { return value_; } private: void copyBytes(ICommandQueue& cmdQueue, const std::shared_ptr& iglTexture, void* pixelBytes, const TextureRangeDesc& range, size_t bytesPerRow) const; virtual bool canCopy(ICommandQueue& cmdQueue, id texture, const TextureRangeDesc& range) const = 0; FramebufferDesc value_; }; } // namespace igl::metal ================================================ FILE: src/igl/metal/Framebuffer.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include namespace igl::metal { Framebuffer::Framebuffer(FramebufferDesc value) : value_(std::move(value)) {} std::vector Framebuffer::getColorAttachmentIndices() const { std::vector indices; for (size_t i = 0; i != IGL_COLOR_ATTACHMENTS_MAX; i++) { if (value_.colorAttachments[i].texture || value_.colorAttachments[i].resolveTexture) { indices.push_back(i); } } return indices; } std::shared_ptr Framebuffer::getColorAttachment(size_t index) const { IGL_DEBUG_ASSERT(index < IGL_COLOR_ATTACHMENTS_MAX); return value_.colorAttachments[index].texture; } std::shared_ptr Framebuffer::getResolveColorAttachment(size_t index) const { IGL_DEBUG_ASSERT(index < IGL_COLOR_ATTACHMENTS_MAX); return value_.colorAttachments[index].resolveTexture; } std::shared_ptr Framebuffer::getDepthAttachment() const { return value_.depthAttachment.texture; } std::shared_ptr Framebuffer::getResolveDepthAttachment() const { return value_.depthAttachment.resolveTexture; } std::shared_ptr Framebuffer::getStencilAttachment() const { return value_.stencilAttachment.texture; } bool Framebuffer::isSwapchainBound() const { if (auto tex = getColorAttachment(0)) { return tex->isSwapchainTexture(); } return false; } void Framebuffer::copyBytesColorAttachment(ICommandQueue& cmdQueue, size_t index, void* pixelBytes, const TextureRangeDesc& range, size_t bytesPerRow) const { IGL_DEBUG_ASSERT(index < IGL_COLOR_ATTACHMENTS_MAX); IGL_DEBUG_ASSERT(range.numFaces == 1, "range.numFaces MUST be 1"); IGL_DEBUG_ASSERT(range.numLayers == 1, "range.numLayers MUST be 1"); IGL_DEBUG_ASSERT(range.numMipLevels == 1, "range.numMipLevels MUST be 1"); const auto& colorAttachment = value_.colorAttachments[index]; if (IGL_DEBUG_VERIFY(colorAttachment.texture != nullptr)) { auto texture = colorAttachment.texture; copyBytes(cmdQueue, texture, pixelBytes, range, bytesPerRow); } } void Framebuffer::copyBytesDepthAttachment(ICommandQueue& cmdQueue, void* pixelBytes, const TextureRangeDesc& range, size_t bytesPerRow) const { auto texture = value_.depthAttachment.texture; copyBytes(cmdQueue, texture, pixelBytes, range, bytesPerRow); } void Framebuffer::copyBytesStencilAttachment(ICommandQueue& cmdQueue, void* pixelBytes, const TextureRangeDesc& range, size_t bytesPerRow) const { auto texture = value_.stencilAttachment.texture; copyBytes(cmdQueue, texture, pixelBytes, range, bytesPerRow); } /// copyTextureColorAttachment /// /// This function does not do any cross-queue synchronization. At the time /// of writing, we are assuming IGL operates on one queue per context void Framebuffer::copyTextureColorAttachment(ICommandQueue& cmdQueue, size_t index, std::shared_ptr destTexture, const TextureRangeDesc& range) const { IGL_DEBUG_ASSERT(index < IGL_COLOR_ATTACHMENTS_MAX); const auto& colorAttachment = value_.colorAttachments[index]; if (IGL_DEBUG_VERIFY(colorAttachment.texture != nullptr)) { auto srcTexture = colorAttachment.texture; id srcMtlTexture = static_cast(*srcTexture).get(); id dstMtlTexture = static_cast(*destTexture).get(); if (IGL_DEBUG_VERIFY(srcMtlTexture && dstMtlTexture)) { auto iglMtlCmdQueue = static_cast(cmdQueue); id cmdBuf = [iglMtlCmdQueue.get() commandBuffer]; id blitEncoder = [cmdBuf blitCommandEncoder]; // NOLINTNEXTLINE(clang-analyzer-nullability.NullabilityBase) [blitEncoder copyFromTexture:srcMtlTexture sourceSlice:range.layer sourceLevel:range.mipLevel sourceOrigin:MTLOriginMake(range.x, range.y, 0) sourceSize:MTLSizeMake(range.width, range.height, 1) toTexture:dstMtlTexture destinationSlice:range.layer destinationLevel:range.mipLevel destinationOrigin:MTLOriginMake(range.x, range.y, 0)]; [blitEncoder endEncoding]; [cmdBuf commit]; } } } void Framebuffer::copyBytes(ICommandQueue& cmdQueue, const std::shared_ptr& iglTexture, void* pixelBytes, const TextureRangeDesc& range, size_t bytesPerRow) const { auto mtlTexture = std::static_pointer_cast(iglTexture); if (bytesPerRow == 0) { bytesPerRow = iglTexture->getProperties().getBytesPerRow(range); } if (canCopy(cmdQueue, mtlTexture->get(), range)) { mtlTexture->getBytes(range, pixelBytes, bytesPerRow); } else { auto& mtlCommandQueue = static_cast(cmdQueue); auto& mtlDevice = mtlCommandQueue.getDevice(); // Once Intel Mac support is EOL remove the isAppleGpu() check and also the // sychronizeTexture call below. Result result; const TextureDesc desc{ .width = iglTexture->getDimensions().width, .height = iglTexture->getDimensions().height, .format = iglTexture->getProperties().format, .type = iglTexture->getType(), .storage = mtlDevice.isAppleGpu() ? ResourceStorage::Shared : ResourceStorage::Managed, .debugName = "stageTexture", }; // 1. Create a shared stage texture auto stageTexture = mtlDevice.createTexture(desc, &result); if (!IGL_DEBUG_VERIFY(stageTexture && result.isOk())) { return; } // 2. Copy data from the private texture to the stage texture by MTLBlitCommandEncoder id srcMtlTexture = static_cast(*iglTexture).get(); id dstMtlTexture = static_cast(*stageTexture).get(); if (IGL_DEBUG_VERIFY(srcMtlTexture && dstMtlTexture)) { auto iglMtlCmdQueue = static_cast(cmdQueue); id cmdBuf = [iglMtlCmdQueue.get() commandBuffer]; id blitEncoder = [cmdBuf blitCommandEncoder]; // NOLINTNEXTLINE(clang-analyzer-nullability.NullabilityBase) [blitEncoder copyFromTexture:srcMtlTexture sourceSlice:range.layer sourceLevel:range.mipLevel sourceOrigin:MTLOriginMake(range.x, range.y, 0) sourceSize:MTLSizeMake(range.width, range.height, 1) toTexture:dstMtlTexture destinationSlice:range.layer destinationLevel:range.mipLevel destinationOrigin:MTLOriginMake(range.x, range.y, 0)]; #if IGL_PLATFORM_MACOSX if (desc.storage == ResourceStorage::Managed) { [blitEncoder synchronizeTexture:dstMtlTexture slice:range.layer level:range.mipLevel]; } #endif [blitEncoder endEncoding]; [cmdBuf commit]; [cmdBuf waitUntilCompleted]; } // 3. Read data from the shared stage texture auto& mtlStageTexture = static_cast(*stageTexture); mtlStageTexture.getBytes(range, pixelBytes, bytesPerRow); } } void Framebuffer::updateDrawable(std::shared_ptr texture) { if (getColorAttachment(0) != texture) { if (!texture) { value_.colorAttachments[0] = {}; } else { value_.colorAttachments[0].texture = std::move(texture); } } } void Framebuffer::updateDrawable(SurfaceTextures surfaceTextures) { updateDrawable(std::move(surfaceTextures.color)); if (surfaceTextures.depth && surfaceTextures.depth->getProperties().hasStencil()) { if (getStencilAttachment() != surfaceTextures.depth) { value_.stencilAttachment.texture = surfaceTextures.depth; } } else { value_.stencilAttachment.texture = nullptr; } if (getDepthAttachment() != surfaceTextures.depth) { value_.depthAttachment.texture = std::move(surfaceTextures.depth); } } void Framebuffer::updateResolveAttachment(std::shared_ptr texture) { if (getResolveColorAttachment(0) != texture) { value_.colorAttachments[0].resolveTexture = std::move(texture); } } FramebufferMode Framebuffer::getMode() const { return value_.mode; } } // namespace igl::metal ================================================ FILE: src/igl/metal/HWDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #ifdef __OBJC__ #include @protocol MTLDevice; #endif namespace igl::metal { class HWDevice { public: /// Enumerate all available GPUs that match the provided query /// @param desc source image. /// @param outResult optional result /// @return descriptors array of device descriptors that match the query. Array is empty if /// there's no match. std::vector queryDevices(const HWDeviceQueryDesc& desc, Result* outResult); std::unique_ptr create(const HWDeviceDesc& desc, Result* outResult); /// Shorthand to create a given device via MTLCreateSystemDefaultDevice(). std::unique_ptr createWithSystemDefaultDevice(Result* outResult); #ifdef __OBJC__ /// Create a device with a given existing MTLDevice. std::unique_ptr createWithMTLDevice(id device, Result* outResult); #endif }; } // namespace igl::metal ================================================ FILE: src/igl/metal/HWDevice.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #import #import #include #include #if IGL_PLATFORM_MACOSX #include #else #include #endif #include namespace igl::metal { namespace { #if IGL_PLATFORM_MACOSX || IGL_PLATFORM_MACCATALYST bool isRemovable(id device) { if (@available(macOS 10.13, macCatalyst 13.0, *)) { return device.removable; } // device.removable is not available in macOS APIs prior to 10.13 or on iOS return false; } #endif } // namespace HWDeviceType getDeviceType(id device); HWDeviceType getDeviceType(id device) { IGL_DEBUG_ASSERT(device != nullptr); #if IGL_PLATFORM_IOS return HWDeviceType::DiscreteGpu; #else if (device.lowPower) { return HWDeviceType::IntegratedGpu; } else if (isRemovable(device)) { return HWDeviceType::ExternalGpu; } else { return HWDeviceType::DiscreteGpu; } #endif } std::vector HWDevice::queryDevices(IGL_MAYBE_UNUSED const HWDeviceQueryDesc& desc, Result* outResult) { std::vector devices; #if IGL_PLATFORM_IOS id metalDevice = MTLCreateSystemDefaultDevice(); if (metalDevice) { // We don't need __bridge_retained here as iOS always provides the same ptr HWDeviceDesc deviceDesc((uintptr_t)(__bridge void*)metalDevice, HWDeviceType::DiscreteGpu, 0, std::string([metalDevice.name UTF8String])); devices.push_back(deviceDesc); } #else // Query device for a specific display if (desc.displayId) { id displayDevice = CGDirectDisplayCopyCurrentMetalDevice(static_cast(desc.displayId)); if (displayDevice) { const uintptr_t deviceNative = (uintptr_t)(__bridge void*)displayDevice; const HWDeviceDesc deviceDesc(deviceNative, getDeviceType(displayDevice), 0, std::string([displayDevice.name UTF8String])); devices.push_back(deviceDesc); } Result::setOk(outResult); return devices; } NSArray>* deviceList = MTLCopyAllDevices(); // Loop through all devices and return matching ones // NOLINTNEXTLINE(cppcoreguidelines-init-variables) for (id device in deviceList) { // We don't need __bridge_retained here as iOS always provides the same ptr const uintptr_t deviceNative = (uintptr_t)(__bridge void*)device; // If we requested an unknown device type, then return // all the available devices const uint32_t vendorId = 0; if (desc.hardwareType == HWDeviceType::Unknown) { const HWDeviceDesc deviceDesc( deviceNative, desc.hardwareType, vendorId, std::string([device.name UTF8String])); devices.push_back(deviceDesc); } else if (device.lowPower) { if (desc.hardwareType == HWDeviceType::IntegratedGpu) { const HWDeviceDesc deviceDesc(deviceNative, HWDeviceType::IntegratedGpu, vendorId, std::string([device.name UTF8String])); devices.push_back(deviceDesc); } } else if (isRemovable(device)) { if (desc.hardwareType == HWDeviceType::ExternalGpu) { const HWDeviceDesc deviceDesc(deviceNative, HWDeviceType::ExternalGpu, vendorId, std::string([device.name UTF8String])); devices.push_back(deviceDesc); } } else { // Device is NOT Integrated NOR External if (desc.hardwareType == HWDeviceType::DiscreteGpu) { const HWDeviceDesc deviceDesc(deviceNative, HWDeviceType::DiscreteGpu, vendorId, std::string([device.name UTF8String])); devices.push_back(deviceDesc); } } } #endif Result::setOk(outResult); return devices; } std::unique_ptr HWDevice::create(const HWDeviceDesc& desc, Result* outResult) { IGL_DEBUG_ASSERT(desc.guid != 0L, "Invalid hardwareGuid(%lu)", desc.guid); if (desc.guid == 0L) { Result::setResult(outResult, Result::Code::Unsupported, "Metal is not supported!"); return nullptr; } return createWithMTLDevice( (__bridge id)(void*)desc.guid, // NOLINT(performance-no-int-to-ptr) outResult); } std::unique_ptr HWDevice::createWithSystemDefaultDevice(Result* outResult) { return createWithMTLDevice(MTLCreateSystemDefaultDevice(), outResult); } std::unique_ptr HWDevice::createWithMTLDevice(id device, Result* outResult) { if (!device) { Result::setResult(outResult, Result::Code::Unsupported, "Metal is not supported!"); return nullptr; } #if IGL_PLATFORM_MACOSX auto iglDevice = std::make_unique(device); #else auto iglDevice = std::make_unique(device); #endif Result::setOk(outResult); return iglDevice; } } // namespace igl::metal ================================================ FILE: src/igl/metal/PlatformDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #import #import #import #import #import #include #include #include #include namespace igl { struct FramebufferDesc; namespace metal { class Device; class Framebuffer; class PlatformDevice final : public IPlatformDevice { public: static constexpr igl::PlatformDeviceType kType = igl::PlatformDeviceType::Metal; PlatformDevice(Device& device); ~PlatformDevice() override; std::shared_ptr createSamplerState(const SamplerStateDesc& desc, Result* outResult) const; std::shared_ptr createFramebuffer(const FramebufferDesc& desc, Result* outResult) const; /// Creates a texture from a native drawable /// @param nativeDrawable drawable. For Metal, drawable MUST be CAMetalDrawable /// @param outResult optional result /// @return pointer to generated Texture or nullptr std::unique_ptr createTextureFromNativeDrawable(id nativeDrawable, Result* outResult); /// Creates a texture from a native drawable /// @param nativeDrawable drawable. For Metal, drawable MUST be MTLTexture /// @param outResult optional result /// @return pointer to generated Texture or nullptr std::unique_ptr createTextureFromNativeDrawable(id nativeDrawable, Result* outResult); /// Creates a texture from a native drawable surface /// @param nativeDrawable drawable surface. For Metal, drawable MUST be CAMetalLayer /// @param outResult optional result /// @return pointer to generated Texture or nullptr std::unique_ptr createTextureFromNativeDrawable(CALayer* nativeDrawable, Result* outResult); /// Creates a depth texture from a native depth stencil texture /// @param depthStencilTexture Native depth stencil texture. /// @param outResult optional result /// @return pointer to generated Texture or nullptr std::unique_ptr createTextureFromNativeDepth(id depthStencilTexture, Result* outResult); /// Creates a texture from a native PixelBuffer. Uses the backing PixelBuffer for width and /// height. /// @param sourceImage source image /// @param format the format of the source texture /// @param outResult optional result /// @return pointer to generated Texture or nullptr std::unique_ptr createTextureFromNativePixelBuffer(CVImageBufferRef sourceImage, TextureFormat format, size_t planeIndex, Result* outResult); /// Creates a texture from a native PixelBuffer /// @param sourceImage source image /// @param format the format of the source texture /// @param width the width of the texture /// @param height the height of the texture /// @param outResult optional result /// @return pointer to generated Texture or nullptr std::unique_ptr createTextureFromNativePixelBufferWithSize(CVImageBufferRef sourceImage, TextureFormat format, size_t width, size_t height, size_t planeIndex, Result* outResult); /// Get a size of a given native drawable surface. /// @param nativeDrawable drawable surface. For Metal, drawable MUST be CAMetalLayer /// @param outResult Optional result. /// @return An accurate size that is suitable for rendering or zero if failed to get a size. Size getNativeDrawableSize(CALayer* nativeDrawable, Result* outResult); /// Get a texture format that is suitable to render a given drawable surface. /// @param nativeDrawable drawable surface. For Metal, drawable MUST be CAMetalLayer /// @param outResult Optional result. /// @return An accurate pixel format that is suitable for rendering or invalid if failed. TextureFormat getNativeDrawableTextureFormat(CALayer* nativeDrawable, Result* outResult); void flushNativeTextureCache() const; CVMetalTextureCacheRef getTextureCache(); protected: [[nodiscard]] bool isType(PlatformDeviceType t) const noexcept override { return t == kType; } private: Device& device_; CVMetalTextureCacheRef textureCache_ = nullptr; }; } // namespace metal } // namespace igl ================================================ FILE: src/igl/metal/PlatformDevice.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #import #import #import #import #include #include #include #include #include namespace igl::metal { PlatformDevice::PlatformDevice(Device& device) : device_(device) {} PlatformDevice::~PlatformDevice() { if (textureCache_) { CFRelease(textureCache_); textureCache_ = nullptr; } } std::shared_ptr PlatformDevice::createSamplerState(const SamplerStateDesc& desc, Result* outResult) const { MTLSamplerDescriptor* metalDesc = [MTLSamplerDescriptor new]; metalDesc.label = [NSString stringWithUTF8String:desc.debugName.c_str()]; metalDesc.minFilter = SamplerState::convertMinMagFilter(desc.minFilter); metalDesc.magFilter = SamplerState::convertMinMagFilter(desc.magFilter); metalDesc.mipFilter = SamplerState::convertMipFilter(desc.mipFilter); metalDesc.lodMinClamp = desc.mipLodMin; metalDesc.lodMaxClamp = desc.mipLodMax; metalDesc.sAddressMode = SamplerState::convertAddressMode(desc.addressModeU); metalDesc.tAddressMode = SamplerState::convertAddressMode(desc.addressModeV); metalDesc.rAddressMode = SamplerState::convertAddressMode(desc.addressModeW); metalDesc.maxAnisotropy = desc.maxAnisotropic; if (desc.depthCompareEnabled && device_.hasFeature(DeviceFeatures::DepthCompare)) { metalDesc.compareFunction = DepthStencilState::convertCompareFunction(desc.depthCompareFunction); } id metalObject = [device_.get() newSamplerStateWithDescriptor:metalDesc]; auto resource = std::make_shared(metalObject); if (device_.hasResourceTracker()) { resource->initResourceTracker(device_.getResourceTracker(), desc.debugName); } Result::setOk(outResult); return resource; } std::shared_ptr PlatformDevice::createFramebuffer(const FramebufferDesc& desc, Result* outResult) const { return std::static_pointer_cast(device_.createFramebuffer(desc, outResult)); } std::unique_ptr PlatformDevice::createTextureFromNativeDrawable( id nativeDrawable, Result* outResult) { auto iglObject = std::make_unique(nativeDrawable, device_); if (auto resourceTracker = device_.getResourceTracker()) { iglObject->initResourceTracker(resourceTracker); } Result::setOk(outResult); return iglObject; } std::unique_ptr PlatformDevice::createTextureFromNativeDrawable( id nativeDrawable, Result* outResult) { auto iglObject = std::make_unique(nativeDrawable, device_); if (auto resourceTracker = device_.getResourceTracker()) { iglObject->initResourceTracker(resourceTracker); } Result::setOk(outResult); return iglObject; } std::unique_ptr PlatformDevice::createTextureFromNativeDrawable(CALayer* nativeDrawable, Result* outResult) { if (!nativeDrawable) { Result::setResult(outResult, Result::Code::ArgumentNull, "Invalid native drawable"); return nullptr; } #if (!TARGET_OS_SIMULATOR || __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000) if ([nativeDrawable isKindOfClass:[CAMetalLayer class]]) { id drawableObject = [(CAMetalLayer*)nativeDrawable nextDrawable]; if (!drawableObject) { Result::setResult(outResult, Result::Code::RuntimeError, "Could not retrieve a drawable."); return nullptr; } return createTextureFromNativeDrawable(drawableObject, outResult); } else { // Layer is not CAMetalLayer // This should never hit, unless there's a new layer type that supports Metal IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); Result::setResult(outResult, Result::Code::Unsupported); return nullptr; } #else Result::setResult(outResult, Result::Code::Unsupported); return nullptr; #endif } std::unique_ptr PlatformDevice::createTextureFromNativeDepth( id depthStencilTexture, Result* outResult) { auto iglObject = std::make_unique(depthStencilTexture, device_); if (auto resourceTracker = device_.getResourceTracker()) { iglObject->initResourceTracker(resourceTracker); } Result::setOk(outResult); return iglObject; } std::unique_ptr PlatformDevice::createTextureFromNativePixelBuffer( CVImageBufferRef sourceImage, TextureFormat format, size_t planeIndex, Result* outResult) { const bool isPlanar = CVPixelBufferIsPlanar(sourceImage) != 0u; const size_t width = (isPlanar ? CVPixelBufferGetWidthOfPlane(sourceImage, planeIndex) : CVPixelBufferGetWidth(sourceImage)); const size_t height = (isPlanar ? CVPixelBufferGetHeightOfPlane(sourceImage, planeIndex) : CVPixelBufferGetHeight(sourceImage)); return PlatformDevice::createTextureFromNativePixelBufferWithSize( sourceImage, format, width, height, planeIndex, outResult); } std::unique_ptr PlatformDevice::createTextureFromNativePixelBufferWithSize( CVImageBufferRef sourceImage, TextureFormat format, size_t width, size_t height, size_t planeIndex, Result* outResult) { std::unique_ptr resultTexture = nullptr; #if (!TARGET_OS_SIMULATOR || __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000) CVMetalTextureCacheRef textureCache = getTextureCache(); if (textureCache) { // Use the user provided texture instead const MTLPixelFormat metalFormat = Texture::textureFormatToMTLPixelFormat(format); if (metalFormat == MTLPixelFormatInvalid) { Result::setResult(outResult, Result::Code::Unsupported, "Invalid Texture Format : " + std::string(TextureFormatProperties::fromTextureFormat(format).name)); IGL_DEBUG_ABORT(outResult->message.c_str()); return nullptr; } CVMetalTextureRef cvMetalTexture = nullptr; const CVReturn result = CVMetalTextureCacheCreateTextureFromImage(kCFAllocatorDefault, textureCache, sourceImage, nil, metalFormat, width, height, planeIndex, &cvMetalTexture); IGL_DEBUG_ASSERT(result == kCVReturnSuccess, "Failed to created Metal texture from PixelBuffer"); if (result != kCVReturnSuccess) { NSLog(@"Failed to created Metal texture from PixelBuffer"); return nullptr; } id metalTexture = CVMetalTextureGetTexture(cvMetalTexture); CVBufferRelease(cvMetalTexture); cvMetalTexture = nullptr; resultTexture = std::make_unique(metalTexture, device_); if (auto resourceTracker = device_.getResourceTracker()) { resultTexture->initResourceTracker(resourceTracker); } } #endif Result::setOk(outResult); return resultTexture; } Size PlatformDevice::getNativeDrawableSize(CALayer* nativeDrawable, Result* outResult) { #if (!TARGET_OS_SIMULATOR || __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000) Result::setOk(outResult); return {(float)CGRectGetWidth(nativeDrawable.bounds), (float)CGRectGetHeight(nativeDrawable.bounds)}; #else Result::setResult(outResult, Result::Code::Unsupported, "Metal not supported on iOS simulator."); return {}; #endif } TextureFormat PlatformDevice::getNativeDrawableTextureFormat(CALayer* nativeDrawable, Result* outResult) { TextureFormat formatResult = TextureFormat::Invalid; #if (!TARGET_OS_SIMULATOR || __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000) if ([nativeDrawable isKindOfClass:[CAMetalLayer class]]) { auto metalLayer = (CAMetalLayer*)nativeDrawable; formatResult = Texture::mtlPixelFormatToTextureFormat(metalLayer.pixelFormat); Result::setOk(outResult); } else { // Layer is not CAMetalLayer // This should never hit, unless there's a new layer type that supports Metal IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); Result::setResult(outResult, Result::Code::Unsupported); } #else Result::setResult(outResult, Result::Code::Unsupported, "Metal not supported on iOS simulator."); #endif return formatResult; } CVMetalTextureCacheRef PlatformDevice::getTextureCache() { #if (!TARGET_OS_SIMULATOR || __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000) if (textureCache_ == nullptr && device_.get() != nullptr) { const CVReturn result = CVMetalTextureCacheCreate(kCFAllocatorDefault, nil, device_.get(), nil, &textureCache_); IGL_DEBUG_ASSERT(result == kCVReturnSuccess, "Failed to created texture cache"); if (result != kCVReturnSuccess) { NSLog(@"Failed to created texture cache"); CFRelease(textureCache_); textureCache_ = nullptr; } } #endif return textureCache_; } void PlatformDevice::flushNativeTextureCache() const { #if (!TARGET_OS_SIMULATOR || __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000) if (textureCache_) { CVMetalTextureCacheFlush(textureCache_, 0); } #endif } } // namespace igl::metal ================================================ FILE: src/igl/metal/RenderCommandEncoder.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #import #import #include #include #include #include #include namespace igl::metal { class Device; class RenderCommandEncoder final : public IRenderCommandEncoder { public: static std::unique_ptr create( const std::shared_ptr& commandBuffer, const RenderPassDesc& renderPass, const std::shared_ptr& framebuffer, Result* outResult); ~RenderCommandEncoder() override = default; void endEncoding() override; void pushDebugGroupLabel(const char* label, const igl::Color& color) const override; void insertDebugEventLabel(const char* label, const igl::Color& color) const override; void popDebugGroupLabel() const override; void bindViewport(const Viewport& viewport) override; void bindScissorRect(const ScissorRect& rect) override; void bindRenderPipelineState(const std::shared_ptr& pipelineState) override; void bindDepthStencilState(const std::shared_ptr& depthStencilState) override; void bindBuffer(uint32_t index, uint8_t bindTarget, IBuffer* buffer, size_t bufferOffset, size_t bufferSize) override; void bindBuffer(uint32_t index, IBuffer* buffer, size_t bufferOffset, size_t bufferSize) override; void bindVertexBuffer(uint32_t index, IBuffer& buffer, size_t bufferOffset) override; void bindIndexBuffer(IBuffer& buffer, IndexFormat format, size_t bufferOffset) override; void bindBytes(size_t index, uint8_t bindTarget, const void* data, size_t length) override; void bindPushConstants(const void* data, size_t length, size_t offset) override; void bindSamplerState(size_t index, uint8_t target, ISamplerState* samplerState) override; void bindTexture(size_t index, uint8_t target, ITexture* texture) override; void bindTexture(size_t index, ITexture* texture) override; void bindUniform(const UniformDesc& uniformDesc, const void* data) override; void bindBindGroup(BindGroupTextureHandle handle) override; void bindBindGroup(BindGroupBufferHandle handle, uint32_t numDynamicOffsets, const uint32_t* dynamicOffsets) override; void draw(size_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t baseInstance) override; void drawIndexed(size_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t baseInstance) override; void drawMeshTasks(const Dimensions& threadgroupsPerGrid, const Dimensions& threadsPerTaskThreadgroup, const Dimensions& threadsPerMeshThreadgroup) override; void multiDrawIndirect(IBuffer& indirectBuffer, size_t indirectBufferOffset, uint32_t drawCount, uint32_t stride) override; void multiDrawIndexedIndirect(IBuffer& indirectBuffer, size_t indirectBufferOffset, uint32_t drawCount, uint32_t stride) override; void setStencilReferenceValue(uint32_t value) override; void setBlendColor(const Color& color) override; void setDepthBias(float depthBias, float slopeScale, float clamp) override; static MTLPrimitiveType convertPrimitiveType(PrimitiveType value); static MTLIndexType convertIndexType(IndexFormat value); static MTLLoadAction convertLoadAction(LoadAction value); static MTLStoreAction convertStoreAction(StoreAction value); static MTLClearColor convertClearColor(Color value); private: explicit RenderCommandEncoder(const std::shared_ptr& commandBuffer); void initialize(const std::shared_ptr& commandBuffer, const RenderPassDesc& renderPass, const std::shared_ptr& framebuffer, Result* outResult); void bindCullMode(const CullMode& cullMode); void bindFrontFacingWinding(const WindingMode& frontFaceWinding); void bindPolygonFillMode(const PolygonFillMode& polygonFillMode); id encoder_ = nil; id indexBuffer_ = nil; MTLIndexType indexType_ = MTLIndexTypeUInt32; size_t indexBufferOffset_ = 0; // 4 KB - page aligned memory for metal managed resource static constexpr uint32_t MAX_RECOMMENDED_BYTES = 4 * 1024; MTLPrimitiveType metalPrimitive_ = MTLPrimitiveTypeTriangle; Device& device_; }; } // namespace igl::metal ================================================ FILE: src/igl/metal/RenderCommandEncoder.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #import #import #import #import #import #include #include #include #include #include #include #include #include #include namespace igl::metal { RenderCommandEncoder::RenderCommandEncoder(const std::shared_ptr& commandBuffer) : IRenderCommandEncoder::IRenderCommandEncoder(commandBuffer), device_(commandBuffer->device()) {} void RenderCommandEncoder::initialize(const std::shared_ptr& commandBuffer, const RenderPassDesc& renderPass, const std::shared_ptr& framebuffer, Result* outResult) { Result::setOk(outResult); if (!IGL_DEBUG_VERIFY(framebuffer)) { Result::setResult(outResult, Result::Code::ArgumentNull); return; } MTLRenderPassDescriptor* metalRenderPassDesc = [MTLRenderPassDescriptor renderPassDescriptor]; if (!metalRenderPassDesc) { static const char* kFailedToCreateRenderPassDesc = "Failed to create Metal render pass descriptor"; IGL_DEBUG_ABORT(kFailedToCreateRenderPassDesc); Result::setResult(outResult, Result::Code::RuntimeError, kFailedToCreateRenderPassDesc); return; } const FramebufferDesc& desc = static_cast(*framebuffer).get(); // Colors for (size_t index = 0; index != IGL_COLOR_ATTACHMENTS_MAX; index++) { const auto& attachment = desc.colorAttachments[index]; if (!attachment.texture) { continue; } if (index >= renderPass.colorAttachments.size() || index >= IGL_COLOR_ATTACHMENTS_MAX) { static const char* kNotEnoughRenderPassColorAttachments = "Framebuffer color attachment count larger than renderPass color attachment count"; IGL_DEBUG_ABORT(kNotEnoughRenderPassColorAttachments); Result::setResult( outResult, Result::Code::ArgumentInvalid, kNotEnoughRenderPassColorAttachments); break; } const auto& iglTexture = attachment.texture; MTLRenderPassColorAttachmentDescriptor* metalColorAttachment = metalRenderPassDesc.colorAttachments[index]; static const char* kNullColorAttachmentMsg = "Render pass color attachment cannot be null"; IGL_DEBUG_ASSERT(iglTexture, kNullColorAttachmentMsg); if (iglTexture) { metalColorAttachment.texture = static_cast(*iglTexture).get(); } else { Result::setResult(outResult, Result::Code::ArgumentNull, kNullColorAttachmentMsg); } const auto& iglResolveTexture = attachment.resolveTexture; if (iglResolveTexture && renderPass.colorAttachments[index].storeAction == igl::StoreAction::MsaaResolve) { metalColorAttachment.resolveTexture = static_cast(*iglResolveTexture).get(); } const auto& iglColorAttachment = renderPass.colorAttachments[index]; metalColorAttachment.loadAction = convertLoadAction(iglColorAttachment.loadAction); metalColorAttachment.storeAction = convertStoreAction(iglColorAttachment.storeAction); metalColorAttachment.clearColor = convertClearColor(iglColorAttachment.clearColor); metalColorAttachment.slice = iglTexture ? Texture::getMetalSlice(iglTexture->getType(), iglColorAttachment.face, iglColorAttachment.layer) : 0; metalColorAttachment.level = iglColorAttachment.mipLevel; } // Depth if (desc.depthAttachment.texture) { metalRenderPassDesc.depthAttachment.texture = static_cast(*desc.depthAttachment.texture).get(); metalRenderPassDesc.depthAttachment.loadAction = convertLoadAction(renderPass.depthAttachment.loadAction); metalRenderPassDesc.depthAttachment.storeAction = convertStoreAction(renderPass.depthAttachment.storeAction); metalRenderPassDesc.depthAttachment.clearDepth = renderPass.depthAttachment.clearDepth; if (desc.depthAttachment.resolveTexture && renderPass.depthAttachment.storeAction == igl::StoreAction::MsaaResolve) { metalRenderPassDesc.depthAttachment.resolveTexture = static_cast(*desc.depthAttachment.resolveTexture).get(); } } // Stencil if (desc.stencilAttachment.texture) { metalRenderPassDesc.stencilAttachment.texture = static_cast(*desc.stencilAttachment.texture).get(); metalRenderPassDesc.stencilAttachment.loadAction = convertLoadAction(renderPass.stencilAttachment.loadAction); metalRenderPassDesc.stencilAttachment.storeAction = convertStoreAction(renderPass.stencilAttachment.storeAction); metalRenderPassDesc.stencilAttachment.clearStencil = renderPass.stencilAttachment.clearStencil; if (desc.stencilAttachment.resolveTexture && renderPass.stencilAttachment.storeAction == igl::StoreAction::MsaaResolve) { metalRenderPassDesc.stencilAttachment.resolveTexture = static_cast(*desc.stencilAttachment.resolveTexture).get(); } } // Attach counter sample buffer for GPU timestamp queries. // Configure sampleBufferAttachments with sample indices for descriptor-based // sampling (Tracy/Dawn pattern). Metal auto-samples at vertex start and fragment // end. // This is the ONLY approach that works on Apple GPUs (A-series, M-series). if (@available(macOS 11.0, iOS 14.0, *)) { if (renderPass.timestampQuery.queries) { auto metalTsQueries = std::static_pointer_cast(renderPass.timestampQuery.queries); if (metalTsQueries && metalTsQueries->sampleBuffer_ != nil) { uint32_t startSampleIdx = renderPass.timestampQuery.slotIndex * 2; uint32_t endSampleIdx = renderPass.timestampQuery.slotIndex * 2 + 1; metalRenderPassDesc.sampleBufferAttachments[0].sampleBuffer = metalTsQueries->sampleBuffer_; metalRenderPassDesc.sampleBufferAttachments[0].startOfVertexSampleIndex = startSampleIdx; metalRenderPassDesc.sampleBufferAttachments[0].endOfVertexSampleIndex = MTLCounterDontSample; metalRenderPassDesc.sampleBufferAttachments[0].startOfFragmentSampleIndex = MTLCounterDontSample; metalRenderPassDesc.sampleBufferAttachments[0].endOfFragmentSampleIndex = endSampleIdx; // Advance currentIndex_ so resolveTimestamps knows how many samples to resolve. uint32_t requiredCount = endSampleIdx + 1; uint32_t current = metalTsQueries->currentIndex_.load(std::memory_order_relaxed); while (current < requiredCount) { if (metalTsQueries->currentIndex_.compare_exchange_weak( current, requiredCount, std::memory_order_relaxed)) { break; } } } } } encoder_ = [commandBuffer->get() renderCommandEncoderWithDescriptor:metalRenderPassDesc]; } std::unique_ptr RenderCommandEncoder::create( const std::shared_ptr& commandBuffer, const RenderPassDesc& renderPass, const std::shared_ptr& framebuffer, Result* outResult) { // NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks) std::unique_ptr encoder(new RenderCommandEncoder(commandBuffer)); encoder->initialize(commandBuffer, renderPass, framebuffer, outResult); return encoder; } void RenderCommandEncoder::endEncoding() { // @fb-only // @fb-only [encoder_ endEncoding]; encoder_ = nil; } void RenderCommandEncoder::pushDebugGroupLabel(const char* label, const igl::Color& /*color*/) const { IGL_DEBUG_ASSERT(encoder_); IGL_DEBUG_ASSERT(label != nullptr && *label); [encoder_ pushDebugGroup:[NSString stringWithUTF8String:label] ?: @""]; } void RenderCommandEncoder::insertDebugEventLabel(const char* label, const igl::Color& /*color*/) const { IGL_DEBUG_ASSERT(encoder_); IGL_DEBUG_ASSERT(label != nullptr && *label); [encoder_ insertDebugSignpost:[NSString stringWithUTF8String:label] ?: @""]; } void RenderCommandEncoder::popDebugGroupLabel() const { IGL_DEBUG_ASSERT(encoder_); [encoder_ popDebugGroup]; } void RenderCommandEncoder::bindViewport(const Viewport& viewport) { IGL_DEBUG_ASSERT(encoder_); const MTLViewport metalViewport = {viewport.x, viewport.y, viewport.width, viewport.height, viewport.minDepth, viewport.maxDepth}; [encoder_ setViewport:metalViewport]; } void RenderCommandEncoder::bindScissorRect(const ScissorRect& rect) { IGL_DEBUG_ASSERT(encoder_); const MTLScissorRect scissorRect = {rect.x, rect.y, rect.width, rect.height}; [encoder_ setScissorRect:scissorRect]; } void RenderCommandEncoder::bindCullMode(const CullMode& cullMode) { IGL_DEBUG_ASSERT(encoder_); MTLCullMode mode = MTLCullModeNone; switch (cullMode) { case CullMode::Disabled: mode = MTLCullModeNone; break; case CullMode::Front: mode = MTLCullModeFront; break; case CullMode::Back: mode = MTLCullModeBack; break; } [encoder_ setCullMode:mode]; } void RenderCommandEncoder::bindFrontFacingWinding(const WindingMode& frontFaceWinding) { IGL_DEBUG_ASSERT(encoder_); const MTLWinding mode = (frontFaceWinding == WindingMode::Clockwise) ? MTLWindingClockwise : MTLWindingCounterClockwise; [encoder_ setFrontFacingWinding:mode]; } void RenderCommandEncoder::bindPolygonFillMode(const PolygonFillMode& polygonFillMode) { IGL_DEBUG_ASSERT(encoder_); if (polygonFillMode == PolygonFillMode::Fill) { return; } [encoder_ setTriangleFillMode:MTLTriangleFillModeLines]; } void RenderCommandEncoder::bindRenderPipelineState( const std::shared_ptr& pipelineState) { IGL_DEBUG_ASSERT(encoder_); IGL_DEBUG_ASSERT(pipelineState); if (!pipelineState) { return; } auto& metalPipelineState = static_cast(*pipelineState); [encoder_ setRenderPipelineState:metalPipelineState.get()]; bindCullMode(metalPipelineState.getCullMode()); bindFrontFacingWinding(metalPipelineState.getWindingMode()); bindPolygonFillMode(metalPipelineState.getPolygonFillMode()); metalPrimitive_ = convertPrimitiveType(pipelineState->getRenderPipelineDesc().topology); } void RenderCommandEncoder::bindDepthStencilState( const std::shared_ptr& depthStencilState) { IGL_DEBUG_ASSERT(encoder_); if (depthStencilState) { [encoder_ setDepthStencilState:static_cast(*depthStencilState).get()]; } } void RenderCommandEncoder::setBlendColor(const Color& color) { IGL_DEBUG_ASSERT(encoder_); [encoder_ setBlendColorRed:color.r green:color.g blue:color.b alpha:color.a]; } void RenderCommandEncoder::setDepthBias(float depthBias, float slopeScale, float clamp) { IGL_DEBUG_ASSERT(encoder_); [encoder_ setDepthBias:depthBias slopeScale:slopeScale clamp:clamp]; } void RenderCommandEncoder::setStencilReferenceValue(uint32_t value) { IGL_DEBUG_ASSERT(encoder_); [encoder_ setStencilReferenceValue:value]; } void RenderCommandEncoder::bindBuffer(uint32_t index, uint8_t bindTarget, IBuffer* buffer, size_t offset, size_t bufferSize) { (void)bufferSize; IGL_DEBUG_ASSERT(encoder_); IGL_DEBUG_ASSERT(index < IGL_BUFFER_BINDINGS_MAX); auto* iglBuffer = static_cast(buffer); auto metalBuffer = iglBuffer ? iglBuffer->get() : nil; if ((bindTarget & BindTarget::kVertex) != 0) { [encoder_ setVertexBuffer:metalBuffer offset:offset atIndex:index]; } if ((bindTarget & BindTarget::kFragment) != 0) { [encoder_ setFragmentBuffer:metalBuffer offset:offset atIndex:index]; } if (@available(iOS 16, macOS 13, *)) { if (device_.hasFeature(DeviceFeatures::MeshShaders)) { if ((bindTarget & BindTarget::kTask) != 0) { [encoder_ setObjectBuffer:metalBuffer offset:offset atIndex:index]; } if ((bindTarget & BindTarget::kMesh) != 0) { [encoder_ setMeshBuffer:metalBuffer offset:offset atIndex:index]; } } } } void RenderCommandEncoder::bindBuffer(uint32_t index, IBuffer* buffer, size_t offset, size_t bufferSize) { (void)bufferSize; IGL_DEBUG_ASSERT(encoder_); IGL_DEBUG_ASSERT(index < IGL_BUFFER_BINDINGS_MAX); if (buffer) { auto& metalBuffer = static_cast(*buffer); [encoder_ setVertexBuffer:metalBuffer.get() offset:offset atIndex:index]; [encoder_ setFragmentBuffer:metalBuffer.get() offset:offset atIndex:index]; } else { [encoder_ setVertexBuffer:nil offset:0 atIndex:index]; [encoder_ setFragmentBuffer:nil offset:0 atIndex:index]; } } void RenderCommandEncoder::bindVertexBuffer(uint32_t index, IBuffer& buffer, size_t bufferOffset) { IGL_DEBUG_ASSERT(encoder_); IGL_DEBUG_ASSERT(index < IGL_BUFFER_BINDINGS_MAX); auto& metalBuffer = static_cast(buffer); [encoder_ setVertexBuffer:metalBuffer.get() offset:bufferOffset atIndex:index]; } void RenderCommandEncoder::bindIndexBuffer(IBuffer& buffer, IndexFormat format, size_t bufferOffset) { auto& metalBuffer = static_cast(buffer); indexBuffer_ = metalBuffer.get(); indexType_ = convertIndexType(format); indexBufferOffset_ = bufferOffset; } void RenderCommandEncoder::bindBytes(size_t index, uint8_t bindTarget, const void* data, size_t length) { IGL_DEBUG_ASSERT(encoder_); IGL_DEBUG_ASSERT(bindTarget == BindTarget::kVertex || bindTarget == BindTarget::kFragment || bindTarget == BindTarget::kTask || bindTarget == BindTarget::kMesh || bindTarget == BindTarget::kAllGraphics, "Bind target is not valid: %d", bindTarget); if (data) { if (length > MAX_RECOMMENDED_BYTES) { IGL_LOG_INFO( "It is recommended to use bindBuffer instead of bindBytes when binding > 4kb: %u", length); } if ((bindTarget & BindTarget::kVertex) != 0) { [encoder_ setVertexBytes:data length:length atIndex:index]; } if ((bindTarget & BindTarget::kFragment) != 0) { [encoder_ setFragmentBytes:data length:length atIndex:index]; } if (@available(iOS 16, macOS 13, *)) { if (device_.hasFeature(DeviceFeatures::MeshShaders)) { if ((bindTarget & BindTarget::kTask) != 0) { [encoder_ setObjectBytes:data length:length atIndex:index]; } if ((bindTarget & BindTarget::kMesh) != 0) { [encoder_ setMeshBytes:data length:length atIndex:index]; } } } } } void RenderCommandEncoder::bindPushConstants(const void* /*data*/, size_t /*length*/, size_t /*offset*/) { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } void RenderCommandEncoder::bindTexture(size_t index, uint8_t bindTarget, ITexture* texture) { IGL_DEBUG_ASSERT(encoder_); IGL_DEBUG_ASSERT(bindTarget == BindTarget::kVertex || bindTarget == BindTarget::kFragment || bindTarget == BindTarget::kTask || bindTarget == BindTarget::kMesh || bindTarget == BindTarget::kAllGraphics, "Bind target is not valid: %d", bindTarget); auto* iglTexture = static_cast(texture); auto metalTexture = iglTexture ? iglTexture->get() : nil; if ((bindTarget & BindTarget::kVertex) != 0) { [encoder_ setVertexTexture:metalTexture atIndex:index]; } if ((bindTarget & BindTarget::kFragment) != 0) { [encoder_ setFragmentTexture:metalTexture atIndex:index]; } if (@available(iOS 16, macOS 13, *)) { if (device_.hasFeature(DeviceFeatures::MeshShaders)) { if ((bindTarget & BindTarget::kTask) != 0) { [encoder_ setObjectTexture:metalTexture atIndex:index]; } if ((bindTarget & BindTarget::kMesh) != 0) { [encoder_ setMeshTexture:metalTexture atIndex:index]; } } } } void RenderCommandEncoder::bindTexture(size_t index, ITexture* texture) { bindTexture(index, igl::BindTarget::kFragment, texture); } void RenderCommandEncoder::bindUniform(const UniformDesc& /*uniformDesc*/, const void* /*data*/) { // DO NOT IMPLEMENT! // This is only for backends that MUST use single uniforms in some situations. IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } void RenderCommandEncoder::bindSamplerState(size_t index, uint8_t bindTarget, ISamplerState* samplerState) { IGL_DEBUG_ASSERT(encoder_); IGL_DEBUG_ASSERT(bindTarget == BindTarget::kVertex || bindTarget == BindTarget::kFragment || bindTarget == BindTarget::kTask || bindTarget == BindTarget::kMesh || bindTarget == BindTarget::kAllGraphics, "Bind target is not valid: %d", bindTarget); auto* iglSamplerState = static_cast(samplerState); auto metalSamplerState = iglSamplerState ? iglSamplerState->get() : nil; if ((bindTarget & BindTarget::kVertex) != 0) { [encoder_ setVertexSamplerState:metalSamplerState atIndex:index]; } if ((bindTarget & BindTarget::kFragment) != 0) { [encoder_ setFragmentSamplerState:metalSamplerState atIndex:index]; } if (@available(iOS 16, macOS 13, *)) { if (device_.hasFeature(DeviceFeatures::MeshShaders)) { if ((bindTarget & BindTarget::kTask) != 0) { [encoder_ setObjectSamplerState:metalSamplerState atIndex:index]; } if ((bindTarget & BindTarget::kMesh) != 0) { [encoder_ setMeshSamplerState:metalSamplerState atIndex:index]; } } } } void RenderCommandEncoder::draw(size_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t baseInstance) { getCommandBuffer().incrementCurrentDrawCount(); IGL_DEBUG_ASSERT(encoder_); #if IGL_PLATFORM_IOS if (@available(iOS 16, *)) { #endif // IGL_PLATFORM_IOS [encoder_ drawPrimitives:metalPrimitive_ vertexStart:firstVertex vertexCount:vertexCount instanceCount:instanceCount baseInstance:baseInstance]; #if IGL_PLATFORM_IOS } else { IGL_DEBUG_ASSERT(!baseInstance); if (device_.hasFeature(DeviceFeatures::DrawInstanced)) { [encoder_ drawPrimitives:metalPrimitive_ vertexStart:firstVertex vertexCount:vertexCount instanceCount:instanceCount]; } else { IGL_DEBUG_ASSERT(instanceCount <= 1); [encoder_ drawPrimitives:metalPrimitive_ vertexStart:firstVertex vertexCount:vertexCount]; } } #endif // IGL_PLATFORM_IOS } void RenderCommandEncoder::drawIndexed(size_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t baseInstance) { getCommandBuffer().incrementCurrentDrawCount(); IGL_DEBUG_ASSERT(encoder_); IGL_DEBUG_ASSERT(indexBuffer_, "No index buffer bound"); if (!IGL_DEBUG_VERIFY(encoder_ && indexBuffer_)) { return; } const size_t indexOffsetBytes = static_cast(firstIndex) * (indexType_ == MTLIndexTypeUInt32 ? 4u : 2u); #if IGL_PLATFORM_IOS if (@available(iOS 16, *)) { #endif // IGL_PLATFORM_IOS [encoder_ drawIndexedPrimitives:metalPrimitive_ indexCount:indexCount indexType:indexType_ indexBuffer:indexBuffer_ indexBufferOffset:indexBufferOffset_ + indexOffsetBytes instanceCount:instanceCount baseVertex:vertexOffset baseInstance:baseInstance]; #if IGL_PLATFORM_IOS } else { if (baseInstance) { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } else { if (device_.hasFeature(DeviceFeatures::DrawInstanced)) { [encoder_ drawIndexedPrimitives:metalPrimitive_ indexCount:indexCount indexType:indexType_ indexBuffer:indexBuffer_ indexBufferOffset:indexBufferOffset_ + indexOffsetBytes instanceCount:instanceCount]; } else { IGL_DEBUG_ASSERT(instanceCount <= 1); [encoder_ drawIndexedPrimitives:metalPrimitive_ indexCount:indexCount indexType:indexType_ indexBuffer:indexBuffer_ indexBufferOffset:indexBufferOffset_ + indexOffsetBytes]; } } } #endif // IGL_PLATFORM_IOS } void RenderCommandEncoder::drawMeshTasks(const Dimensions& threadgroupsPerGrid, const Dimensions& threadsPerTaskThreadgroup, const Dimensions& threadsPerMeshThreadgroup) { IGL_DEBUG_ASSERT(encoder_); if (!device_.hasFeature(DeviceFeatures::MeshShaders)) { IGL_DEBUG_ASSERT(false, "Mesh shaders require Apple GPU Family 7 or higher (A14/M1 and later)"); return; } if (@available(iOS 16, macOS 13, *)) { MTLSize tgg; tgg.width = threadgroupsPerGrid.width; tgg.height = threadgroupsPerGrid.height; tgg.depth = threadgroupsPerGrid.depth; MTLSize tgt; tgt.width = threadsPerTaskThreadgroup.width; tgt.height = threadsPerTaskThreadgroup.height; tgt.depth = threadsPerTaskThreadgroup.depth; MTLSize tgm; tgm.width = threadsPerMeshThreadgroup.width; tgm.height = threadsPerMeshThreadgroup.height; tgm.depth = threadsPerMeshThreadgroup.depth; [encoder_ drawMeshThreadgroups:tgg threadsPerObjectThreadgroup:tgt threadsPerMeshThreadgroup:tgm]; } } void RenderCommandEncoder::multiDrawIndirect(IBuffer& indirectBuffer, // Ignore bugprone-easily-swappable-parameters // @lint-ignore CLANGTIDY size_t indirectBufferOffset, uint32_t drawCount, uint32_t stride) { IGL_DEBUG_ASSERT(encoder_); stride = stride ? stride : sizeof(MTLDrawPrimitivesIndirectArguments); auto& indirectBufferRef = (Buffer&)(indirectBuffer); for (uint32_t drawIndex = 0; drawIndex < drawCount; drawIndex++) { getCommandBuffer().incrementCurrentDrawCount(); [encoder_ drawPrimitives:metalPrimitive_ indirectBuffer:indirectBufferRef.get() indirectBufferOffset:indirectBufferOffset + static_cast(stride) * drawIndex]; } } void RenderCommandEncoder::multiDrawIndexedIndirect(IBuffer& indirectBuffer, // Ignore bugprone-easily-swappable-parameters // @lint-ignore CLANGTIDY size_t indirectBufferOffset, uint32_t drawCount, uint32_t stride) { IGL_DEBUG_ASSERT(encoder_); IGL_DEBUG_ASSERT(indexBuffer_, "No index buffer bound"); if (!IGL_DEBUG_VERIFY(encoder_ && indexBuffer_)) { return; } stride = stride ? stride : sizeof(MTLDrawIndexedPrimitivesIndirectArguments); auto& indirectBufferRef = (Buffer&)(indirectBuffer); for (uint32_t drawIndex = 0; drawIndex < drawCount; drawIndex++) { getCommandBuffer().incrementCurrentDrawCount(); [encoder_ drawIndexedPrimitives:metalPrimitive_ indexType:indexType_ indexBuffer:indexBuffer_ indexBufferOffset:indexBufferOffset_ indirectBuffer:indirectBufferRef.get() indirectBufferOffset:indirectBufferOffset + (stride ? static_cast(stride) : sizeof(MTLDrawIndexedPrimitivesIndirectArguments)) * drawIndex]; } } MTLPrimitiveType RenderCommandEncoder::convertPrimitiveType(PrimitiveType value) { switch (value) { case PrimitiveType::Point: return MTLPrimitiveTypePoint; case PrimitiveType::Line: return MTLPrimitiveTypeLine; case PrimitiveType::LineStrip: return MTLPrimitiveTypeLineStrip; case PrimitiveType::Triangle: return MTLPrimitiveTypeTriangle; case PrimitiveType::TriangleStrip: return MTLPrimitiveTypeTriangleStrip; } } MTLIndexType RenderCommandEncoder::convertIndexType(IndexFormat value) { switch (value) { case IndexFormat::UInt8: IGL_DEBUG_ASSERT(false, "8-bit indices are not supported in Metal"); [[fallthrough]]; case IndexFormat::UInt16: return MTLIndexTypeUInt16; case IndexFormat::UInt32: return MTLIndexTypeUInt32; } } MTLLoadAction RenderCommandEncoder::convertLoadAction(LoadAction value) { switch (value) { case LoadAction::DontCare: return MTLLoadActionDontCare; case LoadAction::Clear: return MTLLoadActionClear; case LoadAction::Load: return MTLLoadActionLoad; } } MTLStoreAction RenderCommandEncoder::convertStoreAction(StoreAction value) { switch (value) { case StoreAction::DontCare: return MTLStoreActionDontCare; case StoreAction::Store: return MTLStoreActionStore; case StoreAction::MsaaResolve: return MTLStoreActionMultisampleResolve; } } MTLClearColor RenderCommandEncoder::convertClearColor(Color value) { return MTLClearColorMake(value.r, value.g, value.b, value.a); } void RenderCommandEncoder::bindBindGroup(BindGroupTextureHandle handle) { if (handle.empty()) { return; } const BindGroupTextureDesc* desc = device_.bindGroupTexturesPool.get(handle); for (uint32_t i = 0; i != IGL_TEXTURE_SAMPLERS_MAX; i++) { if (desc->textures[i]) { IGL_DEBUG_ASSERT(desc->samplers[i]); bindTexture(i, BindTarget::kAllGraphics, desc->textures[i].get()); bindSamplerState(i, BindTarget::kAllGraphics, desc->samplers[i].get()); } } } void RenderCommandEncoder::bindBindGroup(BindGroupBufferHandle handle, uint32_t numDynamicOffsets, const uint32_t* dynamicOffsets) { if (handle.empty()) { return; } const BindGroupBufferDesc* desc = device_.bindGroupBuffersPool.get(handle); uint32_t dynamicOffset = 0; for (uint32_t i = 0; i != IGL_UNIFORM_BLOCKS_BINDING_MAX; i++) { if (desc->buffers[i]) { if (desc->isDynamicBufferMask & (1 << i)) { IGL_DEBUG_ASSERT(dynamicOffsets, "No dynamic offsets provided"); IGL_DEBUG_ASSERT(dynamicOffset < numDynamicOffsets, "Not enough dynamic offsets provided"); bindBuffer(i, desc->buffers[i].get(), desc->offset[i] + dynamicOffsets[dynamicOffset++], desc->size[i]); } else { bindBuffer(i, desc->buffers[i].get(), desc->offset[i], desc->size[i]); } } } IGL_DEBUG_ASSERT(dynamicOffset == numDynamicOffsets, "Not all dynamic offsets were consumed"); } } // namespace igl::metal ================================================ FILE: src/igl/metal/RenderPipelineReflection.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include // Suppress warnings about use of MTLArgumentType #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" namespace igl::metal { class RenderPipelineReflection final : public IRenderPipelineReflection { public: explicit RenderPipelineReflection(MTLRenderPipelineReflection* /*refl*/); ~RenderPipelineReflection() override; [[nodiscard]] int getIndexByName(const std::string& name, ShaderStage sh) const; [[nodiscard]] const std::vector& allUniformBuffers() const override; [[nodiscard]] const std::vector& allSamplers() const override; [[nodiscard]] const std::vector& allTextures() const override; private: struct ArgIndex { ArgIndex(int argumentIndex, MTLArgumentType argumentType, size_t locationInArray) : argumentIndex(argumentIndex), argumentType(argumentType), locationInArray(locationInArray) {} int argumentIndex; MTLArgumentType argumentType; size_t locationInArray; /// position of this argument in the corresponding array }; bool createArgDesc(MTLArgument* arg, ShaderStage sh); [[nodiscard]] const std::unordered_map& getDictionary( ShaderStage sh) const; std::unordered_map vertexArgDictionary_; std::unordered_map fragmentArgDictionary_; std::vector bufferArguments_; std::vector samplerArguments_; std::vector textureArguments_; }; } // namespace igl::metal #pragma GCC diagnostic pop ================================================ FILE: src/igl/metal/RenderPipelineReflection.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "RenderPipelineReflection.h" #include #include #include #if !defined(IGL_CMAKE_BUILD) #include #else #define NON_EXHAUSTIVE_SWITCH_BEGIN #define NON_EXHAUSTIVE_SWITCH_END #endif // !defined(IGL_CMAKE_BUILD) using namespace igl; namespace { igl::UniformType metalDataTypeToIGLUniformType(MTLDataType type) { NON_EXHAUSTIVE_SWITCH_BEGIN switch (type) { case MTLDataTypeFloat: return igl::UniformType::Float; case MTLDataTypeFloat2: return igl::UniformType::Float2; case MTLDataTypeFloat3: return igl::UniformType::Float3; case MTLDataTypeFloat4: return igl::UniformType::Float4; case MTLDataTypeBool: return igl::UniformType::Boolean; case MTLDataTypeInt: return igl::UniformType::Int; case MTLDataTypeInt2: return igl::UniformType::Int2; case MTLDataTypeInt3: return igl::UniformType::Int3; case MTLDataTypeInt4: return igl::UniformType::Int4; case MTLDataTypeFloat2x2: return igl::UniformType::Mat2x2; case MTLDataTypeFloat3x3: return igl::UniformType::Mat3x3; case MTLDataTypeFloat4x4: return igl::UniformType::Mat4x4; default: IGL_LOG_ERROR("Unsupported MTLDataType: %ld\n", type); return igl::UniformType::Invalid; } NON_EXHAUSTIVE_SWITCH_END } } // namespace namespace igl::metal { RenderPipelineReflection::RenderPipelineReflection(MTLRenderPipelineReflection* refl) { if (refl != nullptr) { // NOLINTNEXTLINE(cppcoreguidelines-init-variables) for (MTLArgument* arg = nullptr in refl.vertexArguments) { if (arg.active) { createArgDesc(arg, ShaderStage::Vertex); } } // NOLINTNEXTLINE(cppcoreguidelines-init-variables) for (MTLArgument* arg = nullptr in refl.fragmentArguments) { if (arg.active) { createArgDesc(arg, ShaderStage::Fragment); } } } } RenderPipelineReflection::~RenderPipelineReflection() = default; bool RenderPipelineReflection::createArgDesc(MTLArgument* arg, ShaderStage sh) { size_t loc = 0; if (arg.type == MTLArgumentTypeBuffer) { BufferArgDesc bufferDesc; bufferDesc.name = igl::genNameHandle(arg.name.UTF8String); bufferDesc.bufferAlignment = arg.bufferAlignment; bufferDesc.bufferDataSize = arg.bufferDataSize; bufferDesc.bufferIndex = static_cast(arg.index); bufferDesc.shaderStage = sh; if (arg.bufferDataType == MTLDataTypeStruct) { // NOLINTNEXTLINE(cppcoreguidelines-init-variables) for (MTLStructMember* uniform = nullptr in arg.bufferStructType.members) { MTLDataType elementType = uniform.dataType; if (elementType == MTLDataTypeArray) { elementType = uniform.arrayType.elementType; } igl::BufferArgDesc::BufferMemberDesc iglMemberDesc{ .name = igl::genNameHandle(uniform.name.UTF8String), .type = metalDataTypeToIGLUniformType(elementType), .offset = (size_t)uniform.offset, .arrayLength = uniform.arrayType ? (size_t)uniform.arrayType.arrayLength : 1}; bufferDesc.members.push_back(std::move(iglMemberDesc)); } } else { igl::BufferArgDesc::BufferMemberDesc iglMemberDesc{ .name = igl::genNameHandle(arg.name.UTF8String), .type = metalDataTypeToIGLUniformType(arg.bufferDataType), .offset = 0, .arrayLength = (size_t)arg.arrayLength}; bufferDesc.members.push_back(std::move(iglMemberDesc)); } bufferArguments_.push_back(std::move(bufferDesc)); loc = bufferArguments_.size() - 1; } else if (arg.type == MTLArgumentTypeTexture) { TextureArgDesc textureDesc; textureDesc.name = arg.name.UTF8String; textureDesc.type = igl::metal::Texture::convertType(arg.textureType); textureDesc.textureIndex = static_cast(arg.index); textureDesc.shaderStage = sh; textureArguments_.push_back(std::move(textureDesc)); loc = textureArguments_.size() - 1; } else if (arg.type == MTLArgumentTypeSampler) { SamplerArgDesc samplerDesc; samplerDesc.name = arg.name.UTF8String; samplerDesc.samplerIndex = static_cast(arg.index); samplerDesc.shaderStage = sh; samplerArguments_.push_back(std::move(samplerDesc)); loc = samplerArguments_.size() - 1; } else { /// thread group mem and array argument type is not yet supported IGL_LOG_DEBUG("IGL Metal Reflection: unsupported argument type"); /// just skip this one return false; } if (sh == ShaderStage::Vertex) { vertexArgDictionary_.insert( std::make_pair(std::string([arg.name UTF8String]), ArgIndex(static_cast(arg.index), arg.type, static_cast(loc)))); } else { fragmentArgDictionary_.insert(std::make_pair( std::string([arg.name UTF8String]), ArgIndex(static_cast(arg.index), arg.type, loc))); } return true; } int RenderPipelineReflection::getIndexByName(const std::string& name, ShaderStage sh) const { const std::unordered_map& dictionary = (sh == ShaderStage::Vertex) ? vertexArgDictionary_ : fragmentArgDictionary_; auto it = dictionary.find(name); if (it != dictionary.end()) { return it->second.argumentIndex; } /// not found return -1; } const std::unordered_map& RenderPipelineReflection::getDictionary(ShaderStage sh) const { return (sh == ShaderStage::Vertex) ? vertexArgDictionary_ : fragmentArgDictionary_; } const std::vector& RenderPipelineReflection::allUniformBuffers() const { return bufferArguments_; } const std::vector& RenderPipelineReflection::allSamplers() const { return samplerArguments_; } const std::vector& RenderPipelineReflection::allTextures() const { return textureArguments_; } } // namespace igl::metal ================================================ FILE: src/igl/metal/RenderPipelineState.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::metal { class RenderPipelineState final : public IRenderPipelineState { friend class Device; public: explicit RenderPipelineState(id value, MTLRenderPipelineReflection* reflection, const RenderPipelineDesc& desc); ~RenderPipelineState() override = default; IGL_INLINE id get() { return value_; } [[nodiscard]] int getIndexByName(const igl::NameHandle& name, ShaderStage stage) const override; [[nodiscard]] int getIndexByName(const std::string& name, ShaderStage stage) const override; std::shared_ptr renderPipelineReflection() override; void setRenderPipelineReflection( const IRenderPipelineReflection& renderPipelineReflection) override; [[nodiscard]] CullMode getCullMode() const { return desc_.cullMode; } [[nodiscard]] WindingMode getWindingMode() const { return desc_.frontFaceWinding; } [[nodiscard]] PolygonFillMode getPolygonFillMode() const { return desc_.polygonFillMode; } static MTLColorWriteMask convertColorWriteMask(ColorWriteMask value); private: id value_; std::shared_ptr reflection_; }; } // namespace igl::metal ================================================ FILE: src/igl/metal/RenderPipelineState.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include using namespace igl; namespace igl::metal { RenderPipelineState::RenderPipelineState(id value, MTLRenderPipelineReflection* reflection, const RenderPipelineDesc& desc) : IRenderPipelineState(desc), value_(value) { reflection_ = reflection ? std::make_shared(reflection) : nullptr; } std::shared_ptr RenderPipelineState::renderPipelineReflection() { return reflection_; } void RenderPipelineState::setRenderPipelineReflection( const IRenderPipelineReflection& renderPipelineReflection) { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); (void)renderPipelineReflection; } int RenderPipelineState::getIndexByName(const igl::NameHandle& name, ShaderStage stage) const { if (reflection_ == nullptr) { return -1; } return reflection_->getIndexByName(std::string(name), stage); } int RenderPipelineState::getIndexByName(const std::string& name, ShaderStage stage) const { if (reflection_ == nullptr) { return -1; } return reflection_->getIndexByName(name, stage); } MTLColorWriteMask RenderPipelineState::convertColorWriteMask(ColorWriteMask value) { MTLColorWriteMask result = MTLColorWriteMaskNone; if (value & kColorWriteBitsRed) { result |= MTLColorWriteMaskRed; } if (value & kColorWriteBitsGreen) { result |= MTLColorWriteMaskGreen; } if (value & kColorWriteBitsBlue) { result |= MTLColorWriteMaskBlue; } if (value & kColorWriteBitsAlpha) { result |= MTLColorWriteMaskAlpha; } return result; } } // namespace igl::metal ================================================ FILE: src/igl/metal/Result.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #import #include namespace igl::metal { IGL_INLINE void setResultFrom(Result* outResult, const NSError* error) { if (outResult != nullptr) { if (error != nil) { outResult->code = Result::Code::RuntimeError; const char* message = [error.localizedDescription UTF8String]; outResult->message = (message ? message : ""); } else { outResult->code = Result::Code::Ok; outResult->message = ""; } } } } // namespace igl::metal ================================================ FILE: src/igl/metal/SamplerState.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::metal { class SamplerState final : public ISamplerState { public: explicit SamplerState(id value); IGL_INLINE id get() const { return value_; } static MTLSamplerMinMagFilter convertMinMagFilter(SamplerMinMagFilter value); static MTLSamplerMipFilter convertMipFilter(SamplerMipFilter value); static MTLSamplerAddressMode convertAddressMode(SamplerAddressMode value); /** * @brief Returns true if this sampler is a YUV sampler. */ [[nodiscard]] bool isYUV() const noexcept override; private: id value_; }; } // namespace igl::metal ================================================ FILE: src/igl/metal/SamplerState.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include using namespace igl; namespace igl::metal { SamplerState::SamplerState(id value) : value_(value) {} MTLSamplerMinMagFilter SamplerState::convertMinMagFilter(SamplerMinMagFilter value) { switch (value) { case SamplerMinMagFilter::Nearest: return MTLSamplerMinMagFilterNearest; case SamplerMinMagFilter::Linear: return MTLSamplerMinMagFilterLinear; } } MTLSamplerMipFilter SamplerState::convertMipFilter(SamplerMipFilter value) { switch (value) { case SamplerMipFilter::Disabled: return MTLSamplerMipFilterNotMipmapped; case SamplerMipFilter::Nearest: return MTLSamplerMipFilterNearest; case SamplerMipFilter::Linear: return MTLSamplerMipFilterLinear; } } MTLSamplerAddressMode SamplerState::convertAddressMode(SamplerAddressMode value) { switch (value) { case SamplerAddressMode::Repeat: return MTLSamplerAddressModeRepeat; case SamplerAddressMode::Clamp: return MTLSamplerAddressModeClampToEdge; case SamplerAddressMode::MirrorRepeat: return MTLSamplerAddressModeMirrorRepeat; } } bool SamplerState::isYUV() const noexcept { // Not supported in this API. return false; } } // namespace igl::metal ================================================ FILE: src/igl/metal/Shader.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::metal { class ShaderModule final : public IShaderModule { friend class Device; public: ShaderModule(ShaderModuleInfo info, id value); ~ShaderModule() override = default; IGL_INLINE id get() const { return value; } id value; }; class ShaderLibrary final : public IShaderLibrary { public: explicit ShaderLibrary(std::vector> modules); }; class ShaderStages final : public IShaderStages { public: explicit ShaderStages(ShaderStagesDesc desc); }; } // namespace igl::metal ================================================ FILE: src/igl/metal/Shader.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include namespace igl::metal { metal::ShaderModule::ShaderModule(ShaderModuleInfo info, id value) : IShaderModule(std::move(info)), value(value) {} metal::ShaderLibrary::ShaderLibrary(std::vector> modules) : IShaderLibrary(std::move(modules)) {} metal::ShaderStages::ShaderStages(ShaderStagesDesc desc) : IShaderStages(std::move(desc)) {} } // namespace igl::metal ================================================ FILE: src/igl/metal/Texture.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once @protocol MTLCommandBuffer; @protocol MTLTexture; #import #import #import #include #include #include #if IGL_PLATFORM_APPLE NS_ASSUME_NONNULL_BEGIN #endif namespace igl::metal { class Texture final : public ITexture { friend class Device; friend class PlatformDevice; public: Texture(id texture, const ICapabilities& capabilities, TextureDesc::TextureMipmapGeneration mipmapGeneration = TextureDesc::TextureMipmapGeneration::Manual); Texture(id drawable, const ICapabilities& capabilities, TextureDesc::TextureMipmapGeneration mipmapGeneration = TextureDesc::TextureMipmapGeneration::Manual); ~Texture() override; Texture(const Texture&) = delete; Texture& operator=(const Texture&) = delete; Texture(Texture&&) = delete; Texture& operator=(Texture&&) = delete; Result getBytes(const TextureRangeDesc& range, void* outData, size_t bytesPerRow = 0) const; // Accessors [[nodiscard]] Dimensions getDimensions() const override; [[nodiscard]] uint32_t getNumLayers() const override; [[nodiscard]] TextureType getType() const override; [[nodiscard]] TextureDesc::TextureUsage getUsage() const override; [[nodiscard]] uint32_t getSamples() const override; [[nodiscard]] uint32_t getNumMipLevels() const override; void generateMipmap(ICommandQueue& cmdQueue, const TextureRangeDesc* IGL_NULLABLE range = nullptr) const override; void generateMipmap(ICommandBuffer& cmdBuffer, const TextureRangeDesc* IGL_NULLABLE range = nullptr) const override; [[nodiscard]] bool isRequiredGenerateMipmap() const override; [[nodiscard]] uint64_t getTextureId() const override; [[nodiscard]] TextureDesc::TextureMipmapGeneration getMipmapGeneration() const; IGL_INLINE id _Nullable get() const { return (drawable_) ? drawable_.texture : value_; } IGL_INLINE id _Nullable getDrawable() const { return drawable_; } // IAttachmentInterop interface [[nodiscard]] void* IGL_NULLABLE getNativeImage() const override; [[nodiscard]] void* IGL_NULLABLE getNativeImageView() const override; [[nodiscard]] const base::AttachmentInteropDesc& getDesc() const override; static TextureDesc::TextureUsage toTextureUsage(MTLTextureUsage usage); static MTLTextureUsage toMTLTextureUsage(TextureDesc::TextureUsage usage); static MTLPixelFormat textureFormatToMTLPixelFormat(TextureFormat value); static TextureFormat mtlPixelFormatToTextureFormat(MTLPixelFormat value); static MTLTextureType convertType(TextureType value, size_t numSamples); static TextureType convertType(MTLTextureType value); static NSUInteger getMetalSlice(TextureType type, uint32_t face, uint32_t layer); static TextureRangeDesc atMetalSlice(TextureType type, const TextureRangeDesc& range, NSUInteger metalSlice); private: [[nodiscard]] bool needsRepacking(const TextureRangeDesc& range, size_t bytesPerRow) const final; Result uploadInternal(TextureType type, const TextureRangeDesc& range, const void* IGL_NULLABLE data, size_t bytesPerRow, const uint32_t* IGL_NULLABLE mipLevelBytes) const final; void generateMipmap(id cmdBuffer) const; // Given bytes per row of an input texture, return bytesPerRow value // accepted by Texture::upload and MTL replaceRegion. [[nodiscard]] size_t toMetalBytesPerRow(size_t bytesPerRow) const; id _Nullable value_; id _Nullable drawable_; const ICapabilities& capabilities_; TextureDesc::TextureMipmapGeneration mipmapGeneration_ = TextureDesc::TextureMipmapGeneration::Manual; /// @brief To record whether mipmaps are available and uploaded to the GPU. This is used by the /// `isRequiredGenerateMipmap()` function mutable bool mipmapsAreAvailableAndUploaded_ = false; mutable base::AttachmentInteropDesc attachmentDesc_; // Cached for IAttachmentInterop::getDesc() }; } // namespace igl::metal #if IGL_PLATFORM_APPLE NS_ASSUME_NONNULL_END #endif ================================================ FILE: src/igl/metal/Texture.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include namespace { void bgrToRgb(unsigned char* dstImg, size_t width, size_t height, size_t bytesPerPixel) { for (int i = 0; i < height; ++i) { for (int j = 0; j < width; ++j) { auto pixelIndex = i * width + j; std::swap(dstImg[pixelIndex * bytesPerPixel + 0], dstImg[pixelIndex * bytesPerPixel + 2]); } } } } // namespace namespace igl::metal { Texture::Texture(id texture, const ICapabilities& capabilities, TextureDesc::TextureMipmapGeneration mipmapGeneration) : ITexture(mtlPixelFormatToTextureFormat([texture pixelFormat])), value_(texture), drawable_(nullptr), capabilities_(capabilities), mipmapGeneration_(mipmapGeneration) {} Texture::Texture(id drawable, const ICapabilities& capabilities, TextureDesc::TextureMipmapGeneration mipmapGeneration) : ITexture(mtlPixelFormatToTextureFormat([drawable.texture pixelFormat])), value_(nullptr), drawable_(drawable), capabilities_(capabilities), mipmapGeneration_(mipmapGeneration) {} Texture::~Texture() { value_ = nil; } bool Texture::needsRepacking(const TextureRangeDesc& range, size_t bytesPerRow) const { if (bytesPerRow == 0) { return false; } const auto format = getFormat(); if (format == TextureFormat::RGBA_PVRTC_2BPPV1 || format == TextureFormat::RGB_PVRTC_2BPPV1 || format == TextureFormat::RGBA_PVRTC_4BPPV1 || format == TextureFormat::RGB_PVRTC_4BPPV1) { // PVRTC formats MUST pass a value of 0 to bytesPerRow, so MUST be repacked if bytesPerRow // doesn't match the range's bytesPerRow. const auto rangeBytesPerRow = getProperties().getBytesPerRow(range); return rangeBytesPerRow != bytesPerRow; } // Metal textures MUST be aligned to a multiple of the texel size or, for compressed textures, the // texel block size. return bytesPerRow % getProperties().bytesPerBlock != 0; } Result Texture::uploadInternal(TextureType type, const TextureRangeDesc& range, const void* IGL_NULLABLE data, size_t bytesPerRow, const uint32_t* IGL_NULLABLE /*mipLevelBytes*/) const { if (data == nullptr) { return Result(Result::Code::Ok); } const auto& properties = getProperties(); const auto rangeBytesPerRow = bytesPerRow > 0 ? bytesPerRow : properties.getBytesPerRow(range); const auto initialSlice = getMetalSlice(type, range.face, range.layer); const auto numSlices = getMetalSlice(type, range.numFaces, range.numLayers); for (auto mipLevel = range.mipLevel; mipLevel < range.mipLevel + range.numMipLevels; ++mipLevel) { const auto mipRange = range.atMipLevel(mipLevel); for (auto slice = initialSlice; slice < initialSlice + numSlices; ++slice) { const auto sliceRange = atMetalSlice(type, mipRange, slice); const auto* sliceData = getSubRangeStart(data, range, sliceRange, bytesPerRow); const auto region = MTLRegionMake3D(sliceRange.x, sliceRange.y, sliceRange.z, sliceRange.width, sliceRange.height, sliceRange.depth); switch (type) { case TextureType::Cube: case TextureType::TwoD: case TextureType::TwoDArray: { [get() replaceRegion:region mipmapLevel:sliceRange.mipLevel slice:getMetalSlice(type, sliceRange.face, sliceRange.layer) withBytes:sliceData bytesPerRow:toMetalBytesPerRow(rangeBytesPerRow) bytesPerImage:0]; break; } case TextureType::ThreeD: { [get() replaceRegion:region mipmapLevel:sliceRange.mipLevel slice:0 /* 3D array textures not supported */ withBytes:sliceData bytesPerRow:toMetalBytesPerRow(rangeBytesPerRow) bytesPerImage:toMetalBytesPerRow(rangeBytesPerRow * sliceRange.height)]; break; } case TextureType::ExternalImage: case TextureType::Invalid: default: IGL_DEBUG_ABORT("Unknown texture type"); break; } } } if (mipmapGeneration_ == TextureDesc::TextureMipmapGeneration::AutoGenerateOnUpload) { if (range.mipLevel != 0) { return Result{Result::Code::InvalidOperation, "AutoGenerateOnUpload requires mipLevel to be uploaded to be 0"}; } const auto* device = static_cast(&capabilities_); if (device) { auto cmdQueue = const_cast(device)->getMostRecentCommandQueue(); if (!cmdQueue) { Result result; cmdQueue = const_cast(device)->createCommandQueue({}, &result); if (!result.isOk()) { return result; } } generateMipmap(*cmdQueue, nullptr); mipmapsAreAvailableAndUploaded_ = true; } else { return Result(igl::Result::Code::RuntimeError, "Device is not available; cannot generate mipmaps."); } } return Result{}; } Result Texture::getBytes(const TextureRangeDesc& range, void* outData, size_t bytesPerRow) const { if (!outData) { return Result(Result::Code::ArgumentNull, "Need a valid output buffer"); } if (get().storageMode == MTLStorageModePrivate) { return Result( Result::Code::Unsupported, "Can't retrieve the data from private memory; use a blit command encoder instead"); } if (range.numLayers > 1 || range.numFaces > 1) { return Result(Result::Code::Unsupported, "Can't retrieve data from more than one face or layer"); } const auto& properties = getProperties(); if (bytesPerRow == 0) { bytesPerRow = properties.getBytesPerRow(range); } const size_t bytesPerImage = properties.getBytesPerRange(range); const MTLRegion region = {{range.x, range.y, 0}, {range.width, range.height, 1}}; auto tmpBuffer = std::make_unique(bytesPerImage); [get() getBytes:tmpBuffer.get() bytesPerRow:toMetalBytesPerRow(properties.getBytesPerRow(range)) bytesPerImage:bytesPerImage fromRegion:region mipmapLevel:range.mipLevel slice:getMetalSlice(getType(), range.face, range.layer)]; /// Metal textures are up-side down compared to OGL textures. IGL follows /// the OGL convention and this function flips the texture vertically repackData( properties, range, tmpBuffer.get(), 0, static_cast(outData), bytesPerRow, true); const igl::TextureFormat f = getFormat(); const TextureFormatProperties props = TextureFormatProperties::fromTextureFormat(f); auto bytesPerPixel = props.bytesPerBlock; if (f == TextureFormat::BGRA_SRGB || f == TextureFormat::BGRA_UNorm8) { bgrToRgb(static_cast(outData), range.width, range.height, bytesPerPixel); } return Result(Result::Code::Ok); } size_t Texture::toMetalBytesPerRow(size_t bytesPerRow) const { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wswitch-enum" switch (getFormat()) { case TextureFormat::RGBA_PVRTC_2BPPV1: case TextureFormat::RGB_PVRTC_2BPPV1: case TextureFormat::RGBA_PVRTC_4BPPV1: case TextureFormat::RGB_PVRTC_4BPPV1: return 0; default: return bytesPerRow; } #pragma clang diagnostic pop } Dimensions Texture::getDimensions() const { auto texture = get(); return Dimensions{static_cast([texture width]), static_cast([texture height]), static_cast([texture depth])}; } uint32_t Texture::getNumLayers() const { return [get() arrayLength]; } TextureType Texture::getType() const { return convertType([get() textureType]); } TextureDesc::TextureUsage Texture::getUsage() const { return toTextureUsage([get() usage]); } uint32_t Texture::getSamples() const { return [get() sampleCount]; } uint32_t Texture::getNumMipLevels() const { return [get() mipmapLevelCount]; } void Texture::generateMipmap(ICommandQueue& cmdQueue, const TextureRangeDesc* range) const { if (range) { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } if (value_.mipmapLevelCount > 1) { auto mtlCmdQueue = static_cast(cmdQueue).get(); const id mtlCmdBuffer = [mtlCmdQueue commandBuffer]; if (mtlCmdBuffer) { generateMipmap(mtlCmdBuffer); [mtlCmdBuffer commit]; } } } void Texture::generateMipmap(ICommandBuffer& cmdBuffer, const TextureRangeDesc* range) const { if (range) { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } if (value_.mipmapLevelCount > 1) { auto mtlCmdBuffer = static_cast(cmdBuffer).get(); generateMipmap(mtlCmdBuffer); } } void Texture::generateMipmap(id cmdBuffer) const { // we can only generate mipmaps for filterable texture formats via the blit encoder const bool isFilterable = (capabilities_.getTextureFormatCapabilities(getFormat()) & ICapabilities::TextureFormatCapabilityBits::SampledFiltered) != 0; if (!isFilterable) { // TODO: implement manual mip generation for required formats (e.g. RGBA32Float) IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); return; } const id encoder = [cmdBuffer blitCommandEncoder]; [encoder generateMipmapsForTexture:value_]; [encoder endEncoding]; } bool Texture::isRequiredGenerateMipmap() const { if (mipmapsAreAvailableAndUploaded_) { return false; } return value_.mipmapLevelCount > 1; } uint64_t Texture::getTextureId() const { // TODO: implement via gpuResourceID IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); return 0; } TextureDesc::TextureMipmapGeneration Texture::getMipmapGeneration() const { return mipmapGeneration_; } TextureDesc::TextureUsage Texture::toTextureUsage(MTLTextureUsage usage) { TextureDesc::TextureUsage result = 0; result |= ((usage & MTLTextureUsageShaderRead) != 0) ? TextureDesc::TextureUsageBits::Sampled : 0; result |= ((usage & MTLTextureUsageShaderWrite) != 0) ? TextureDesc::TextureUsageBits::Storage : 0; result |= ((usage & MTLTextureUsageRenderTarget) != 0) ? TextureDesc::TextureUsageBits::Attachment : 0; return result; } MTLTextureUsage Texture::toMTLTextureUsage(TextureDesc::TextureUsage usage) { MTLTextureUsage result = 0; result |= ((usage & TextureDesc::TextureUsageBits::Sampled) != 0) ? MTLTextureUsageShaderRead : 0; result |= ((usage & TextureDesc::TextureUsageBits::Storage) != 0) ? MTLTextureUsageShaderWrite : 0; result |= ((usage & TextureDesc::TextureUsageBits::Attachment) != 0) ? MTLTextureUsageRenderTarget : 0; return result; } MTLTextureType Texture::convertType(TextureType value, size_t numSamples) { IGL_DEBUG_ASSERT(value != TextureType::Invalid && value != TextureType::ExternalImage); switch (value) { case TextureType::ExternalImage: case TextureType::Invalid: return MTLTextureType1D; // Use 1D texture as fallback for invalid case TextureType::TwoD: return numSamples > 1 ? MTLTextureType2DMultisample : MTLTextureType2D; case TextureType::TwoDArray: if (@available(macOS 10.14, iOS 14.0, *)) { return numSamples > 1 ? MTLTextureType2DMultisampleArray : MTLTextureType2DArray; } else { return MTLTextureType2DArray; } case TextureType::ThreeD: return MTLTextureType3D; case TextureType::Cube: return MTLTextureTypeCube; } } TextureType Texture::convertType(MTLTextureType value) { switch (value) { case MTLTextureType2D: case MTLTextureType2DMultisample: return TextureType::TwoD; case MTLTextureType2DArray: return TextureType::TwoDArray; case MTLTextureType3D: return TextureType::ThreeD; case MTLTextureTypeCube: return TextureType::Cube; case MTLTextureType2DMultisampleArray: return TextureType::TwoDArray; case MTLTextureType1D: case MTLTextureType1DArray: case MTLTextureTypeTextureBuffer: case MTLTextureTypeCubeArray: default: return TextureType::Invalid; } } MTLPixelFormat Texture::textureFormatToMTLPixelFormat(TextureFormat value) { switch (value) { case TextureFormat::Invalid: return MTLPixelFormatInvalid; // 8 bpp case TextureFormat::R_UNorm8: return MTLPixelFormatR8Unorm; case TextureFormat::A_UNorm8: return MTLPixelFormatA8Unorm; // 16 bpp case TextureFormat::B5G5R5A1_UNorm: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatBGR5A1Unorm; #endif case TextureFormat::B5G6R5_UNorm: #if IGL_PLATFORM_MACOSX || IGL_PLATFORM_IOS_SIMULATOR return MTLPixelFormatInvalid; #else return MTLPixelFormatB5G6R5Unorm; #endif case TextureFormat::ABGR_UNorm4: #if IGL_PLATFORM_MACOSX || IGL_PLATFORM_IOS_SIMULATOR return MTLPixelFormatInvalid; #else return MTLPixelFormatABGR4Unorm; #endif case TextureFormat::RG_UNorm8: return MTLPixelFormatRG8Unorm; case TextureFormat::R4G2B2_UNorm_Apple: return MTLPixelFormatBGRG422; case TextureFormat::R4G2B2_UNorm_Rev_Apple: return MTLPixelFormatGBGR422; case TextureFormat::R_F16: return MTLPixelFormatR16Float; case TextureFormat::R_UInt16: return MTLPixelFormatR16Uint; case TextureFormat::R_UNorm16: return MTLPixelFormatR16Unorm; // 32 bpp case TextureFormat::RGBA_UNorm8: return MTLPixelFormatRGBA8Unorm; case TextureFormat::BGRA_UNorm8: return MTLPixelFormatBGRA8Unorm; case TextureFormat::RGBA_SRGB: return MTLPixelFormatRGBA8Unorm_sRGB; case TextureFormat::BGRA_SRGB: return MTLPixelFormatBGRA8Unorm_sRGB; case TextureFormat::RGBA_F16: return MTLPixelFormatRGBA16Float; case TextureFormat::RG_F16: return MTLPixelFormatRG16Float; case TextureFormat::RG_UInt16: return MTLPixelFormatRG16Uint; case TextureFormat::RG_UNorm16: return MTLPixelFormatRG16Unorm; case TextureFormat::RGBA_UNorm16: return MTLPixelFormatRGBA16Unorm; case TextureFormat::RGB10_A2_UNorm_Rev: return MTLPixelFormatRGB10A2Unorm; case TextureFormat::RGB10_A2_Uint_Rev: return MTLPixelFormatRGB10A2Uint; case TextureFormat::BGR10_A2_Unorm: return MTLPixelFormatBGR10A2Unorm; case TextureFormat::R_F32: return MTLPixelFormatR32Float; case TextureFormat::R_UInt32: return MTLPixelFormatR32Uint; case TextureFormat::RG_F32: return MTLPixelFormatRG32Float; // 96 bit case TextureFormat::RGB_F32: return MTLPixelFormatInvalid; // 128 bps case TextureFormat::RGBA_UInt32: return MTLPixelFormatRGBA32Uint; case TextureFormat::RGBA_F32: return MTLPixelFormatRGBA32Float; case TextureFormat::LA_UNorm8: // This format should not be used in Metal. Use RG_UNorm8 instead. case TextureFormat::BGRA_UNorm8_Rev: // On the OGL side, this format is used to convert BGRA image to RGBA // during upload. Not sure if we can do this with Metal case TextureFormat::L_UNorm8: // No Metal equivalent case TextureFormat::RGB8_Punchthrough_A1_ETC2: case TextureFormat::SRGB8_Punchthrough_A1_ETC2: case TextureFormat::RGB_F16: case TextureFormat::RGBX_UNorm8: case TextureFormat::R5G5B5A1_UNorm: return MTLPixelFormatInvalid; // Compressed case TextureFormat::RGBA_ASTC_4x4: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatASTC_4x4_LDR; #endif case TextureFormat::SRGB8_A8_ASTC_4x4: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatASTC_4x4_sRGB; #endif case TextureFormat::RGBA_ASTC_5x4: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatASTC_5x4_LDR; #endif case TextureFormat::SRGB8_A8_ASTC_5x4: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatASTC_5x4_sRGB; #endif case TextureFormat::RGBA_ASTC_5x5: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatASTC_5x5_LDR; #endif case TextureFormat::SRGB8_A8_ASTC_5x5: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatASTC_5x5_sRGB; #endif case TextureFormat::RGBA_ASTC_6x5: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatASTC_6x5_LDR; #endif case TextureFormat::SRGB8_A8_ASTC_6x5: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatASTC_6x5_sRGB; #endif case TextureFormat::RGBA_ASTC_6x6: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatASTC_6x6_LDR; #endif case TextureFormat::SRGB8_A8_ASTC_6x6: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatASTC_6x6_sRGB; #endif case TextureFormat::RGBA_ASTC_8x5: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatASTC_8x5_LDR; #endif case TextureFormat::SRGB8_A8_ASTC_8x5: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatASTC_8x5_sRGB; #endif case TextureFormat::RGBA_ASTC_8x6: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatASTC_8x6_LDR; #endif case TextureFormat::SRGB8_A8_ASTC_8x6: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatASTC_8x6_sRGB; #endif case TextureFormat::RGBA_ASTC_8x8: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatASTC_8x8_LDR; #endif case TextureFormat::SRGB8_A8_ASTC_8x8: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatASTC_8x8_sRGB; #endif case TextureFormat::RGBA_ASTC_10x5: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatASTC_10x5_LDR; #endif case TextureFormat::SRGB8_A8_ASTC_10x5: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatASTC_10x5_sRGB; #endif case TextureFormat::RGBA_ASTC_10x6: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatASTC_10x6_LDR; #endif case TextureFormat::SRGB8_A8_ASTC_10x6: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatASTC_10x6_sRGB; #endif case TextureFormat::RGBA_ASTC_10x8: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatASTC_10x8_LDR; #endif case TextureFormat::SRGB8_A8_ASTC_10x8: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatASTC_10x8_sRGB; #endif case TextureFormat::RGBA_ASTC_10x10: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatASTC_10x10_LDR; #endif case TextureFormat::SRGB8_A8_ASTC_10x10: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatASTC_10x10_sRGB; #endif case TextureFormat::RGBA_ASTC_12x10: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatASTC_12x10_LDR; #endif case TextureFormat::SRGB8_A8_ASTC_12x10: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatASTC_12x10_sRGB; #endif case TextureFormat::RGBA_ASTC_12x12: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatASTC_12x12_LDR; #endif case TextureFormat::SRGB8_A8_ASTC_12x12: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatASTC_12x12_sRGB; #endif case TextureFormat::RGBA_PVRTC_2BPPV1: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatPVRTC_RGBA_2BPP; #endif case TextureFormat::RGB_PVRTC_2BPPV1: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatPVRTC_RGB_2BPP; #endif case TextureFormat::RGBA_PVRTC_4BPPV1: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatPVRTC_RGBA_4BPP; #endif case TextureFormat::RGB_PVRTC_4BPPV1: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatPVRTC_RGB_4BPP; #endif case TextureFormat::RGB8_ETC1: case TextureFormat::RGB8_ETC2: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatETC2_RGB8; #endif case TextureFormat::RGBA8_EAC_ETC2: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatEAC_RGBA8; #endif case TextureFormat::SRGB8_ETC2: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatETC2_RGB8_sRGB; #endif case TextureFormat::SRGB8_A8_EAC_ETC2: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatEAC_RGBA8_sRGB; #endif case TextureFormat::RG_EAC_UNorm: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatEAC_RG11Unorm; #endif case TextureFormat::RG_EAC_SNorm: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatEAC_RG11Snorm; #endif case TextureFormat::R_EAC_UNorm: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatEAC_R11Unorm; #endif case TextureFormat::R_EAC_SNorm: #if IGL_PLATFORM_MACOSX return MTLPixelFormatInvalid; #else return MTLPixelFormatEAC_R11Snorm; #endif // MTLPixelFormatBC7_RGBAUnorm supported only on MacOS and Catalyst // https://developer.apple.com/documentation/metal/mtlpixelformat/mtlpixelformatbc7_rgbaunorm case TextureFormat::RGBA_BC7_UNORM_4x4: #if IGL_PLATFORM_MACOSX || IGL_PLATFORM_MACCATALYST return MTLPixelFormatBC7_RGBAUnorm; #else return MTLPixelFormatInvalid; #endif case TextureFormat::RGBA_BC7_SRGB_4x4: #if IGL_PLATFORM_MACOSX || IGL_PLATFORM_MACCATALYST return MTLPixelFormatBC7_RGBAUnorm_sRGB; #else return MTLPixelFormatInvalid; #endif // Depth & Stencil case TextureFormat::Z_UNorm16: return MTLPixelFormatDepth32Float; case TextureFormat::Z_UNorm24: return MTLPixelFormatDepth32Float; case TextureFormat::Z_UNorm32: return MTLPixelFormatDepth32Float; case TextureFormat::S8_UInt_Z24_UNorm: return MTLPixelFormatDepth32Float_Stencil8; case TextureFormat::S8_UInt_Z32_UNorm: return MTLPixelFormatDepth32Float_Stencil8; case TextureFormat::S_UInt8: return MTLPixelFormatStencil8; case TextureFormat::YUV_NV12: case TextureFormat::YUV_420p: // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only default: return MTLPixelFormatInvalid; } } TextureFormat Texture::mtlPixelFormatToTextureFormat(MTLPixelFormat value) { // Some fbsource targets don't allow enum default, this makes sure all of them compile #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wswitch-enum" switch (value) { // 8 bpp case MTLPixelFormatR8Unorm: return TextureFormat::R_UNorm8; case MTLPixelFormatA8Unorm: return TextureFormat::A_UNorm8; // 16 bpp #if !IGL_PLATFORM_MACOSX // No support for these on macOS case MTLPixelFormatBGR5A1Unorm: return TextureFormat::B5G5R5A1_UNorm; case MTLPixelFormatB5G6R5Unorm: return TextureFormat::B5G6R5_UNorm; case MTLPixelFormatABGR4Unorm: return TextureFormat::ABGR_UNorm4; #endif case MTLPixelFormatRG8Unorm: return TextureFormat::RG_UNorm8; case MTLPixelFormatBGRG422: return TextureFormat::R4G2B2_UNorm_Apple; case MTLPixelFormatGBGR422: return TextureFormat::R4G2B2_UNorm_Rev_Apple; case MTLPixelFormatR16Uint: return TextureFormat::R_UInt16; case MTLPixelFormatR16Unorm: return TextureFormat::R_UNorm16; // 32 bpp case MTLPixelFormatRGBA8Unorm: return TextureFormat::RGBA_UNorm8; case MTLPixelFormatBGRA8Unorm: return TextureFormat::BGRA_UNorm8; case MTLPixelFormatBGRA8Unorm_sRGB: return TextureFormat::BGRA_SRGB; case MTLPixelFormatRGBA8Unorm_sRGB: return TextureFormat::RGBA_SRGB; case MTLPixelFormatRGB10A2Unorm: return TextureFormat::RGB10_A2_UNorm_Rev; case MTLPixelFormatRGB10A2Uint: return TextureFormat::RGB10_A2_Uint_Rev; case MTLPixelFormatBGR10A2Unorm: return TextureFormat::BGR10_A2_Unorm; case MTLPixelFormatRGBA16Float: return TextureFormat::RGBA_F16; case MTLPixelFormatR16Float: return TextureFormat::R_F16; case MTLPixelFormatRG16Float: return TextureFormat::RG_F16; case MTLPixelFormatRG16Uint: return TextureFormat::RG_UInt16; case MTLPixelFormatRG16Unorm: return TextureFormat::RG_UNorm16; case MTLPixelFormatRGBA16Unorm: return TextureFormat::RGBA_UNorm16; case MTLPixelFormatR32Float: return TextureFormat::R_F32; case MTLPixelFormatR32Uint: return TextureFormat::R_UInt32; case MTLPixelFormatRG32Float: return TextureFormat::RG_F32; case MTLPixelFormatRGBA32Uint: return TextureFormat::RGBA_UInt32; case MTLPixelFormatRGBA32Float: return TextureFormat::RGBA_F32; // Compressed #if !IGL_PLATFORM_MACOSX case MTLPixelFormatASTC_4x4_LDR: return TextureFormat::RGBA_ASTC_4x4; case MTLPixelFormatASTC_4x4_sRGB: return TextureFormat::SRGB8_A8_ASTC_4x4; case MTLPixelFormatASTC_5x4_LDR: return TextureFormat::RGBA_ASTC_5x4; case MTLPixelFormatASTC_5x4_sRGB: return TextureFormat::SRGB8_A8_ASTC_5x4; case MTLPixelFormatASTC_5x5_LDR: return TextureFormat::RGBA_ASTC_5x5; case MTLPixelFormatASTC_5x5_sRGB: return TextureFormat::SRGB8_A8_ASTC_5x5; case MTLPixelFormatASTC_6x5_LDR: return TextureFormat::RGBA_ASTC_6x5; case MTLPixelFormatASTC_6x5_sRGB: return TextureFormat::SRGB8_A8_ASTC_6x5; case MTLPixelFormatASTC_6x6_LDR: return TextureFormat::RGBA_ASTC_6x6; case MTLPixelFormatASTC_6x6_sRGB: return TextureFormat::SRGB8_A8_ASTC_6x6; case MTLPixelFormatASTC_8x5_LDR: return TextureFormat::RGBA_ASTC_8x5; case MTLPixelFormatASTC_8x5_sRGB: return TextureFormat::SRGB8_A8_ASTC_8x5; case MTLPixelFormatASTC_8x6_LDR: return TextureFormat::RGBA_ASTC_8x6; case MTLPixelFormatASTC_8x6_sRGB: return TextureFormat::SRGB8_A8_ASTC_8x6; case MTLPixelFormatASTC_8x8_LDR: return TextureFormat::RGBA_ASTC_8x8; case MTLPixelFormatASTC_8x8_sRGB: return TextureFormat::SRGB8_A8_ASTC_8x8; case MTLPixelFormatASTC_10x5_LDR: return TextureFormat::RGBA_ASTC_10x5; case MTLPixelFormatASTC_10x5_sRGB: return TextureFormat::SRGB8_A8_ASTC_10x5; case MTLPixelFormatASTC_10x6_LDR: return TextureFormat::RGBA_ASTC_10x6; case MTLPixelFormatASTC_10x6_sRGB: return TextureFormat::SRGB8_A8_ASTC_10x6; case MTLPixelFormatASTC_10x8_LDR: return TextureFormat::RGBA_ASTC_10x8; case MTLPixelFormatASTC_10x8_sRGB: return TextureFormat::SRGB8_A8_ASTC_10x8; case MTLPixelFormatASTC_10x10_LDR: return TextureFormat::RGBA_ASTC_10x10; case MTLPixelFormatASTC_10x10_sRGB: return TextureFormat::SRGB8_A8_ASTC_10x10; case MTLPixelFormatASTC_12x10_LDR: return TextureFormat::RGBA_ASTC_12x10; case MTLPixelFormatASTC_12x10_sRGB: return TextureFormat::SRGB8_A8_ASTC_12x10; case MTLPixelFormatASTC_12x12_LDR: return TextureFormat::RGBA_ASTC_12x12; case MTLPixelFormatASTC_12x12_sRGB: return TextureFormat::SRGB8_A8_ASTC_12x12; case MTLPixelFormatPVRTC_RGBA_2BPP: return TextureFormat::RGBA_PVRTC_2BPPV1; case MTLPixelFormatPVRTC_RGB_2BPP: return TextureFormat::RGB_PVRTC_2BPPV1; case MTLPixelFormatPVRTC_RGBA_4BPP: return TextureFormat::RGBA_PVRTC_4BPPV1; case MTLPixelFormatPVRTC_RGB_4BPP: return TextureFormat::RGB_PVRTC_4BPPV1; case MTLPixelFormatETC2_RGB8: return TextureFormat::RGB8_ETC2; case MTLPixelFormatEAC_RGBA8: return TextureFormat::RGBA8_EAC_ETC2; #endif #if IGL_PLATFORM_MACOSX case MTLPixelFormatBC7_RGBAUnorm: return TextureFormat::RGBA_BC7_UNORM_4x4; case MTLPixelFormatBC7_RGBAUnorm_sRGB: return TextureFormat::RGBA_BC7_SRGB_4x4; #endif // Depth & Stencil case MTLPixelFormatDepth32Float: return TextureFormat::Z_UNorm32; case MTLPixelFormatDepth32Float_Stencil8: return TextureFormat::S8_UInt_Z32_UNorm; case MTLPixelFormatStencil8: return TextureFormat::S_UInt8; default: return TextureFormat::Invalid; } #pragma clang diagnostic pop } NSUInteger Texture::getMetalSlice(TextureType type, uint32_t face, uint32_t layer) { return type == TextureType::Cube ? face : layer; } TextureRangeDesc Texture::atMetalSlice(TextureType type, const TextureRangeDesc& range, NSUInteger metalSlice) { return type == TextureType::Cube ? range.atFace(static_cast(metalSlice)) : range.atLayer(static_cast(metalSlice)); } // IAttachmentInterop interface implementation void* Texture::getNativeImage() const { return (__bridge void*)get(); } void* Texture::getNativeImageView() const { // Metal doesn't have a separate image view concept return nullptr; } const base::AttachmentInteropDesc& Texture::getDesc() const { id tex = get(); // Update cached attachment descriptor attachmentDesc_.width = static_cast(tex.width); attachmentDesc_.height = static_cast(tex.height); attachmentDesc_.depth = static_cast(tex.depth); attachmentDesc_.numLayers = static_cast(tex.arrayLength); attachmentDesc_.numSamples = static_cast(tex.sampleCount); attachmentDesc_.numMipLevels = static_cast(tex.mipmapLevelCount); attachmentDesc_.type = static_cast(convertType(tex.textureType)); attachmentDesc_.format = static_cast(mtlPixelFormatToTextureFormat(tex.pixelFormat)); attachmentDesc_.isSampled = (tex.usage & MTLTextureUsageShaderRead) != 0; return attachmentDesc_; } } // namespace igl::metal ================================================ FILE: src/igl/metal/Timer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::metal { class Timer : public ITimer { public: ~Timer() override = default; [[nodiscard]] uint64_t getElapsedTimeNanos() const override { return executionTime_; } [[nodiscard]] bool resultsAvailable() const override { return executionTime_ != 0; } private: uint64_t executionTime_ = 0; friend class CommandQueue; }; } // namespace igl::metal ================================================ FILE: src/igl/metal/TimestampQueries.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once @protocol MTLCommandBuffer; @protocol MTLCounterSampleBuffer; #include #include #import #include #include namespace igl::metal { class CommandQueue; class TimestampQueries : public ITimestampQueries { public: TimestampQueries(id sampleBuffer, uint32_t maxTimestamps); ~TimestampQueries() override; uint32_t capacity() const override; uint32_t count() const override; void reset() override; bool resultsAvailable() const override; uint64_t getElapsedNanos(uint32_t slotIndex) const override; /// Called from CommandQueue completion handler -- resolves counter data void resolveTimestamps(id csb); /// Attach a GPU completion handler to an externally-managed command buffer /// to resolve timestamps on GPU completion. Use this when the command buffer /// is NOT submitted via CommandQueue::submit(). /// @param cmdBuffer The Metal command buffer to attach the handler to. /// @param queries Owning shared_ptr captured in the completion block to /// prevent use-after-free (mirrors CommandQueue::submit pattern). static void attachResolveHandler(id cmdBuffer, std::shared_ptr queries); private: id sampleBuffer_ = nil; uint32_t maxTimestamps_ = 0; std::atomic currentIndex_{0}; std::atomic generation_{0}; std::vector resolvedTimestamps_; std::atomic resolved_{false}; mutable std::mutex resolveMutex_; friend class CommandQueue; friend class RenderCommandEncoder; }; } // namespace igl::metal ================================================ FILE: src/igl/metal/TimestampQueries.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #import #import #import #import // @donotremove #import #include namespace igl::metal { TimestampQueries::TimestampQueries(id sampleBuffer, uint32_t maxTimestamps) : sampleBuffer_(sampleBuffer), maxTimestamps_(maxTimestamps) { // Each timing slot uses two internal counter samples (vertex-start + fragment-end). resolvedTimestamps_.reserve(maxTimestamps * 2); } TimestampQueries::~TimestampQueries() { sampleBuffer_ = nil; } uint32_t TimestampQueries::capacity() const { return maxTimestamps_; } uint32_t TimestampQueries::count() const { return std::min(currentIndex_.load(std::memory_order_relaxed), maxTimestamps_); } void TimestampQueries::reset() { generation_.fetch_add(1, std::memory_order_release); currentIndex_.store(0, std::memory_order_release); resolved_.store(false, std::memory_order_release); } bool TimestampQueries::resultsAvailable() const { return resolved_.load(std::memory_order_acquire); } uint64_t TimestampQueries::getElapsedNanos(uint32_t slotIndex) const { if (!resolved_.load(std::memory_order_acquire)) { return 0; } std::lock_guard lock(resolveMutex_); uint32_t startIdx = slotIndex * 2; uint32_t endIdx = slotIndex * 2 + 1; if (endIdx >= resolvedTimestamps_.size()) { return 0; } uint64_t start = resolvedTimestamps_[startIdx]; uint64_t end = resolvedTimestamps_[endIdx]; if (end > start) { return end - start; } return 0; } void TimestampQueries::resolveTimestamps(id csb) { // Clamp to maxTimestamps_ to prevent out-of-bounds access on the counter sample buffer // in case sampleTimestamp was called more times than capacity allows (fetch_add overflow). uint32_t n = std::min(currentIndex_.load(std::memory_order_acquire), maxTimestamps_); if (n == 0) { return; } NSData* data = nil; @try { data = [csb resolveCounterRange:NSMakeRange(0, n)]; } @catch (NSException*) { return; // GPU reset or counter sample buffer invalidated — skip this frame } if (!data || data.length < n * sizeof(MTLCounterResultTimestamp)) { return; } const auto* timestamps = static_cast(data.bytes); std::lock_guard lock(resolveMutex_); resolvedTimestamps_.resize(n); for (uint32_t i = 0; i < n; ++i) { resolvedTimestamps_[i] = timestamps[i].timestamp; } resolved_.store(true, std::memory_order_release); } void TimestampQueries::attachResolveHandler(id cmdBuffer, std::shared_ptr queries) { if (!queries || !cmdBuffer) { return; } // Capture by value: shared_ptr extends lifetime, csb retains the ObjC object, // gen snapshots the current generation for staleness detection. id csb = queries->sampleBuffer_; uint64_t gen = queries->generation_.load(std::memory_order_acquire); [cmdBuffer addCompletedHandler:^(id /*cb*/) { @try { if (queries->generation_.load(std::memory_order_acquire) == gen) { queries->resolveTimestamps(csb); } } @catch (NSException*) { // GPU reset or counter sample buffer invalidated - silently skip. } }]; } } // namespace igl::metal ================================================ FILE: src/igl/metal/VertexInputState.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #import #include namespace igl::metal { class VertexInputState final : public IVertexInputState { friend class Device; public: explicit VertexInputState(MTLVertexDescriptor* value); ~VertexInputState() override = default; IGL_INLINE MTLVertexDescriptor* get() const { return value_; } static MTLVertexFormat convertAttributeFormat(VertexAttributeFormat value); static MTLVertexStepFunction convertSampleFunction(VertexSampleFunction value); private: MTLVertexDescriptor* value_; }; } // namespace igl::metal ================================================ FILE: src/igl/metal/VertexInputState.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include namespace igl::metal { metal::VertexInputState::VertexInputState(MTLVertexDescriptor* value) : value_(value) {} MTLVertexFormat VertexInputState::convertAttributeFormat(VertexAttributeFormat value) { switch (value) { case VertexAttributeFormat::Float1: return MTLVertexFormatFloat; case VertexAttributeFormat::Float2: return MTLVertexFormatFloat2; case VertexAttributeFormat::Float3: return MTLVertexFormatFloat3; case VertexAttributeFormat::Float4: return MTLVertexFormatFloat4; case VertexAttributeFormat::Byte2: return MTLVertexFormatChar2; case VertexAttributeFormat::Byte3: return MTLVertexFormatChar3; case VertexAttributeFormat::Byte4: return MTLVertexFormatChar4; case VertexAttributeFormat::UByte2: return MTLVertexFormatUChar2; case VertexAttributeFormat::UByte3: return MTLVertexFormatUChar3; case VertexAttributeFormat::UByte4: return MTLVertexFormatUChar4; case VertexAttributeFormat::Short2: return MTLVertexFormatShort2; case VertexAttributeFormat::Short3: return MTLVertexFormatShort3; case VertexAttributeFormat::Short4: return MTLVertexFormatShort4; case VertexAttributeFormat::UShort2: return MTLVertexFormatUShort2; case VertexAttributeFormat::UShort3: return MTLVertexFormatUShort3; case VertexAttributeFormat::UShort4: return MTLVertexFormatUShort4; case VertexAttributeFormat::Byte1Norm: return MTLVertexFormatCharNormalized; case VertexAttributeFormat::Byte2Norm: return MTLVertexFormatChar2Normalized; case VertexAttributeFormat::Byte3Norm: return MTLVertexFormatChar3Normalized; case VertexAttributeFormat::Byte4Norm: return MTLVertexFormatChar4Normalized; case VertexAttributeFormat::UByte1Norm: return MTLVertexFormatUCharNormalized; case VertexAttributeFormat::UByte2Norm: return MTLVertexFormatUChar2Normalized; case VertexAttributeFormat::UByte3Norm: return MTLVertexFormatUChar3Normalized; case VertexAttributeFormat::UByte4Norm: return MTLVertexFormatUChar4Normalized; case VertexAttributeFormat::Short1Norm: return MTLVertexFormatShortNormalized; case VertexAttributeFormat::Short2Norm: return MTLVertexFormatShort2Normalized; case VertexAttributeFormat::Short3Norm: return MTLVertexFormatShort3Normalized; case VertexAttributeFormat::Short4Norm: return MTLVertexFormatShort4Normalized; case VertexAttributeFormat::UShort1Norm: return MTLVertexFormatUShortNormalized; case VertexAttributeFormat::UShort2Norm: return MTLVertexFormatUShort2Normalized; case VertexAttributeFormat::UShort3Norm: return MTLVertexFormatUShort3Normalized; case VertexAttributeFormat::UShort4Norm: return MTLVertexFormatUShort4Normalized; case VertexAttributeFormat::Byte1: case VertexAttributeFormat::UByte1: case VertexAttributeFormat::Short1: case VertexAttributeFormat::UShort1: return MTLVertexFormatInvalid; case VertexAttributeFormat::Int1: return MTLVertexFormatInt; case VertexAttributeFormat::Int2: return MTLVertexFormatInt2; case VertexAttributeFormat::Int3: return MTLVertexFormatInt3; case VertexAttributeFormat::Int4: return MTLVertexFormatInt4; case VertexAttributeFormat::UInt1: return MTLVertexFormatUInt; case VertexAttributeFormat::UInt2: return MTLVertexFormatUInt2; case VertexAttributeFormat::UInt3: return MTLVertexFormatUInt3; case VertexAttributeFormat::UInt4: return MTLVertexFormatUInt4; case VertexAttributeFormat::HalfFloat1: return MTLVertexFormatHalf; case VertexAttributeFormat::HalfFloat2: return MTLVertexFormatHalf2; case VertexAttributeFormat::HalfFloat3: return MTLVertexFormatHalf3; case VertexAttributeFormat::HalfFloat4: return MTLVertexFormatHalf4; case VertexAttributeFormat::Int_2_10_10_10_REV: return MTLVertexFormatInt1010102Normalized; // The 'default' case below is commented out, so that compiler will catch and error // on any unhandled cases. // default: // return MTLVertexFormatInvalid; } return MTLVertexFormatInvalid; } MTLVertexStepFunction VertexInputState::convertSampleFunction(VertexSampleFunction value) { switch (value) { case VertexSampleFunction::Constant: return MTLVertexStepFunctionConstant; case VertexSampleFunction::PerVertex: return MTLVertexStepFunctionPerVertex; case VertexSampleFunction::Instance: return MTLVertexStepFunctionPerInstance; } } } // namespace igl::metal ================================================ FILE: src/igl/metal/ios/Device.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #import #include namespace igl::metal::ios { // @fb-only class Device final : public ::igl::metal::Device { public: explicit Device(id device); ~Device() override = default; std::shared_ptr createFramebuffer(const FramebufferDesc& desc, Result* outResult) override; }; } // namespace igl::metal::ios ================================================ FILE: src/igl/metal/ios/Device.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace igl::metal::ios { Device::Device(id device) : metal::Device(device) {} std::shared_ptr Device::createFramebuffer(const FramebufferDesc& desc, Result* outResult) { auto resource = std::make_shared(desc); if (hasResourceTracker()) { resource->initResourceTracker(getResourceTracker(), desc.debugName); } Result::setOk(outResult); return resource; } } // namespace igl::metal::ios ================================================ FILE: src/igl/metal/ios/Framebuffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #import #include namespace igl::metal::ios { // @fb-only class Framebuffer final : public ::igl::metal::Framebuffer { public: explicit Framebuffer(const FramebufferDesc& value); ~Framebuffer() override = default; private: bool canCopy(ICommandQueue& /* unused */, id texture, const TextureRangeDesc& range) const override; }; } // namespace igl::metal::ios ================================================ FILE: src/igl/metal/ios/Framebuffer.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace igl::metal::ios { // @fb-only Framebuffer::Framebuffer(const FramebufferDesc& value) : metal::Framebuffer(value) {} bool Framebuffer::canCopy(ICommandQueue& /* unused */, id texture, const TextureRangeDesc& /*range*/) const { return texture.storageMode == MTLStorageModeShared; } } // namespace igl::metal::ios ================================================ FILE: src/igl/metal/macos/Device.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #import #include namespace igl::metal::macos { // @fb-only class Device final : public ::igl::metal::Device { public: explicit Device(id device); ~Device() override = default; std::shared_ptr createFramebuffer(const FramebufferDesc& desc, Result* outResult) override; }; } // namespace igl::metal::macos ================================================ FILE: src/igl/metal/macos/Device.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace igl::metal::macos { // @fb-only Device::Device(id device) : metal::Device(device) {} std::shared_ptr Device::createFramebuffer(const FramebufferDesc& desc, Result* outResult) { auto resource = std::make_shared(desc); if (hasResourceTracker()) { resource->initResourceTracker(getResourceTracker()); } Result::setOk(outResult); return resource; } } // namespace igl::metal::macos ================================================ FILE: src/igl/metal/macos/Framebuffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::metal::macos { // @fb-only class Framebuffer final : public ::igl::metal::Framebuffer { public: explicit Framebuffer(const FramebufferDesc& value); ~Framebuffer() override = default; private: bool canCopy(ICommandQueue& cmdQueue, id texture, const TextureRangeDesc& range) const override; }; } // namespace igl::metal::macos ================================================ FILE: src/igl/metal/macos/Framebuffer.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include namespace igl::metal::macos { // @fb-only Framebuffer::Framebuffer(const FramebufferDesc& value) : metal::Framebuffer(value) {} /// This function assumes the input texture has the content. For example, /// if iglTexture is MTLStorageModeManaged, then it assumes the caller /// has already blitted the content from the GPU. The texture cannot /// be MTLStorageModePrivate. bool Framebuffer::canCopy(ICommandQueue& cmdQueue, id texture, const TextureRangeDesc& range) const { const bool result = texture.storageMode == MTLStorageModeManaged; auto iglMtlCmdQueue = static_cast(cmdQueue); if (result) { id cmdBuf = [iglMtlCmdQueue.get() commandBuffer]; id blitEncoder = [cmdBuf blitCommandEncoder]; [blitEncoder synchronizeTexture:texture slice:range.layer level:range.mipLevel]; [blitEncoder endEncoding]; [cmdBuf commit]; [cmdBuf waitUntilCompleted]; } return result; } } // namespace igl::metal::macos ================================================ FILE: src/igl/opengl/Buffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace igl::opengl { // ******************************** // **** ArrayBuffer // ******************************** // the base buffer object ArrayBuffer::ArrayBuffer(IContext& context, BufferDesc::BufferAPIHint requestedApiHints, BufferDesc::BufferType bufferType) : Buffer(context, requestedApiHints, bufferType) { iD_ = 0; size_ = 0; isDynamic_ = false; } ArrayBuffer::~ArrayBuffer() { if (iD_ != 0) { getContext().deleteBuffers(1, &iD_); getContext().unbindBuffer(target_); iD_ = 0; } size_ = 0; isDynamic_ = false; } // initialize a buffer with the given size // if data is not null, copy the data into the buffer // if the buffer is to be updated frequently, isDynamic should be set to true void ArrayBuffer::initialize(const BufferDesc& desc, Result* outResult) { // static buffers must provide their data during creation, as they can't upload data later on GLenum usage = GL_DYNAMIC_DRAW; switch (desc.storage) { case ResourceStorage::Shared: usage = GL_DYNAMIC_DRAW; isDynamic_ = true; break; case ResourceStorage::Managed: usage = GL_STATIC_DRAW; isDynamic_ = false; break; case ResourceStorage::Private: usage = GL_STATIC_DRAW; isDynamic_ = false; break; case ResourceStorage::Memoryless: case ResourceStorage::Invalid: default: break; } if (!isDynamic_ && desc.data == nullptr) { Result::setResult(outResult, Result::Code::ArgumentNull, "data is null"); return; } getContext().genBuffers(1, &iD_); if (iD_ == 0) { Result::setResult(outResult, Result::Code::RuntimeError, "Failed to create buffer"); } if (desc.type & BufferDesc::BufferTypeBits::Storage) { if (getContext().deviceFeatures().hasFeature(DeviceFeatures::Compute)) { target_ = GL_SHADER_STORAGE_BUFFER; } else { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } } else if (desc.type & BufferDesc::BufferTypeBits::Uniform) { target_ = GL_UNIFORM_BUFFER; } else if (desc.type & BufferDesc::BufferTypeBits::Vertex) { target_ = GL_ARRAY_BUFFER; } else if (desc.type & BufferDesc::BufferTypeBits::Index) { target_ = GL_ELEMENT_ARRAY_BUFFER; } else if (desc.type & BufferDesc::BufferTypeBits::Indirect) { target_ = GL_DRAW_INDIRECT_BUFFER; } else { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } size_ = desc.length; getContext().bindBuffer(target_, iD_); getContext().bufferData(target_, size_, desc.data, usage); // make sure the buffer was fully allocated GLint bufferSize = 0; getContext().getBufferParameteriv(target_, GL_BUFFER_SIZE, &bufferSize); if (!desc.debugName.empty() && getContext().deviceFeatures().hasInternalFeature(InternalFeatures::DebugLabel)) { const GLenum identifier = getContext().deviceFeatures().hasInternalRequirement( InternalRequirement::DebugLabelExtEnumsReq) ? GL_BUFFER_OBJECT_EXT : GL_BUFFER; getContext().objectLabel(identifier, iD_, desc.debugName.size(), desc.debugName.c_str()); } getContext().bindBuffer(target_, 0); if (bufferSize != size_) { getContext().deleteBuffers(1, &iD_); iD_ = 0; Result::setResult(outResult, Result::Code::ArgumentOutOfRange, "bufferSize != dataSize"); return; } Result::setOk(outResult); } // upload data to the buffer at the given offset with the given size Result ArrayBuffer::upload(const void* data, const BufferRange& range) { // static buffers can only upload data once during creation if (!isDynamic_) { return Result(Result::Code::InvalidOperation, "Can't upload to static buffers"); } getContext().bindBuffer(target_, iD_); getContext().bufferSubData(target_, range.offset, range.size, data); getContext().bindBuffer(target_, 0); return Result(); } void* ArrayBuffer::map(const BufferRange& range, Result* outResult) { if ((range.size + range.offset) > getSizeInBytes()) { Result::setResult( outResult, Result::Code::ArgumentOutOfRange, "map() size + offset must be <= buffer size"); return nullptr; } bind(); void* srcData = nullptr; srcData = getContext().mapBufferRange(target_, range.offset, range.size, GL_MAP_READ_BIT); IGL_DEBUG_ASSERT(srcData != nullptr); if (srcData == nullptr) { Result::setResult(outResult, Result::Code::InvalidOperation); return nullptr; } Result::setOk(outResult); return srcData; } void ArrayBuffer::unmap() { bind(); getContext().unmapBuffer(target_); } // bind the buffer for access by the GPU void ArrayBuffer::bind() { getContext().bindBuffer(target_, iD_); } void ArrayBuffer::unbind() { getContext().bindBuffer(target_, 0); } void ArrayBuffer::bindBase(IGL_MAYBE_UNUSED size_t index, Result* outResult) { if (target_ != GL_SHADER_STORAGE_BUFFER) { static constexpr const char* kErrorMsg = "Buffer should be GL_SHADER_STORAGE_BUFFER"; IGL_SOFT_ERROR(kErrorMsg); Result::setResult(outResult, Result::Code::InvalidOperation, kErrorMsg); return; } getContext().bindBuffer(target_, iD_); getContext().bindBufferBase(target_, (GLuint)index, iD_); Result::setOk(outResult); } void ArrayBuffer::bindForTarget(GLenum target) { getContext().bindBuffer(target, iD_); } void UniformBlockBuffer::setBlockBinding(GLuint pid, GLuint blockIndex, GLuint bindingPoint) { getContext().uniformBlockBinding(pid, blockIndex, bindingPoint); } void UniformBlockBuffer::bindBase(size_t index, Result* outResult) { if (getContext().deviceFeatures().hasFeature(DeviceFeatures::UniformBlocks)) { if (target_ != GL_UNIFORM_BUFFER) { static constexpr const char* kErrorMsg = "Buffer should be GL_UNIFORM_BUFFER"; IGL_SOFT_ERROR(kErrorMsg); Result::setResult(outResult, Result::Code::InvalidOperation, kErrorMsg); return; } getContext().bindBufferBase(target_, (GLuint)index, iD_); Result::setOk(outResult); } else { static constexpr const char* kErrorMsg = "Uniform Blocks are not supported"; IGL_SOFT_ERROR(kErrorMsg); Result::setResult(outResult, Result::Code::Unimplemented, kErrorMsg); } } void UniformBlockBuffer::bindRange(size_t index, size_t offset, size_t size, Result* outResult) { if (getContext().deviceFeatures().hasFeature(DeviceFeatures::UniformBlocks)) { if (target_ != GL_UNIFORM_BUFFER) { static constexpr const char* kErrorMsg = "Buffer should be GL_UNIFORM_BUFFER"; IGL_SOFT_ERROR(kErrorMsg); Result::setResult(outResult, Result::Code::InvalidOperation, kErrorMsg); return; } getContext().bindBuffer(target_, iD_); IGL_DEBUG_ASSERT((offset + size) <= getSizeInBytes(), "Offset or Size is invalid! (%d %d %d)", offset, size, getSizeInBytes()); getContext().bindBufferRange( target_, (GLuint)index, iD_, (GLintptr)offset, size ? size : getSizeInBytes() - offset); Result::setOk(outResult); } else { static constexpr const char* kErrorMsg = "Uniform Blocks are not supported"; IGL_SOFT_ERROR(kErrorMsg); Result::setResult(outResult, Result::Code::Unimplemented, kErrorMsg); } } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/Buffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl { class ICommandBuffer; namespace opengl { class Buffer : public WithContext, public IBuffer { public: enum class Type : uint8_t { Attribute, Uniform, UniformBlock }; // NOLINTBEGIN(bugprone-easily-swappable-parameters) Buffer(IContext& context, BufferDesc::BufferAPIHint requestedApiHints, BufferDesc::BufferType bufferType) : // NOLINTEND(bugprone-easily-swappable-parameters) WithContext(context), requestedApiHints_(requestedApiHints), bufferType_(bufferType) {} [[nodiscard]] uint64_t gpuAddress(size_t /*offset*/) const override { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); return 0; } virtual void initialize(const BufferDesc& desc, Result* outResult) = 0; [[nodiscard]] virtual Type getType() const noexcept = 0; [[nodiscard]] BufferDesc::BufferAPIHint requestedApiHints() const noexcept override { return requestedApiHints_; } [[nodiscard]] BufferDesc::BufferType getBufferType() const override { return bufferType_; } private: BufferDesc::BufferAPIHint requestedApiHints_; BufferDesc::BufferType bufferType_ = 0; }; class ArrayBuffer : public Buffer { public: ArrayBuffer(IContext& context, BufferDesc::BufferAPIHint requestedApiHints, BufferDesc::BufferType bufferType); ~ArrayBuffer() override; ArrayBuffer(const ArrayBuffer&) = delete; ArrayBuffer& operator=(const ArrayBuffer&) = delete; ArrayBuffer(ArrayBuffer&&) = delete; ArrayBuffer& operator=(ArrayBuffer&&) = delete; Result upload(const void* data, const BufferRange& range) override; void* map(const BufferRange& range, Result* outResult) override; void unmap() override; [[nodiscard]] BufferDesc::BufferAPIHint acceptedApiHints() const noexcept override { return 0; } [[nodiscard]] ResourceStorage storage() const noexcept override { return ResourceStorage::Managed; } [[nodiscard]] size_t getSizeInBytes() const override { return size_; } IGL_INLINE GLuint getId() const noexcept { return iD_; } IGL_INLINE GLenum getTarget() const noexcept { return target_; } void initialize(const BufferDesc& desc, Result* outResult) override; void bind(); void unbind(); void bindBase(size_t index, Result* outResult); void bindForTarget(GLenum target); [[nodiscard]] Type getType() const noexcept override { return Type::Attribute; } protected: // the GL ID for this texture GLuint iD_; // the buffer target used by the GL glBufferXXX APIs // this must be set by each derived object during construction GLenum target_{}; private: size_t size_; bool isDynamic_; }; class UniformBlockBuffer : public ArrayBuffer { public: UniformBlockBuffer(IContext& context, BufferDesc::BufferAPIHint requestedApiHints, BufferDesc::BufferType bufferType) : ArrayBuffer(context, requestedApiHints, bufferType) {} [[nodiscard]] Type getType() const noexcept override { return Type::UniformBlock; } void setBlockBinding(GLuint pid, GLuint blockIndex, GLuint bindingPoint); void bindBase(size_t index, Result* outResult); void bindRange(size_t index, size_t offset, size_t size, Result* outResult); [[nodiscard]] BufferDesc::BufferAPIHint acceptedApiHints() const noexcept override { return BufferDesc::BufferAPIHintBits::UniformBlock; } }; } // namespace opengl } // namespace igl ================================================ FILE: src/igl/opengl/CMakeLists.txt ================================================ # Copyright (c) Meta Platforms, Inc. and affiliates. # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. cmake_minimum_required(VERSION 3.19) project(IGLOpenGL CXX C) if(NOT IOS AND NOT ANDROID) find_package(OpenGL REQUIRED) endif() file(GLOB SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp util/*.cpp) file(GLOB HEADER_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.h util/*.h) if(WIN32) file(GLOB WGL_SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} wgl/*.cpp) file(GLOB WGL_HEADER_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} wgl/*.h) list(APPEND SRC_FILES ${WGL_SRC_FILES}) list(APPEND HEADER_FILES ${WGL_HEADER_FILES}) elseif(APPLE AND NOT IOS) file(GLOB MACOS_SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} macos/*.mm) file(GLOB MACOS_HEADER_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} macos/*.h) list(APPEND SRC_FILES ${MACOS_SRC_FILES}) list(APPEND HEADER_FILES ${MACOS_HEADER_FILES}) elseif(APPLE AND IOS) file(GLOB IOS_SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ios/*.mm) file(GLOB IOS_HEADER_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ios/*.h) list(APPEND SRC_FILES ${IOS_SRC_FILES}) list(APPEND HEADER_FILES ${IOS_HEADER_FILES}) elseif(UNIX AND NOT APPLE AND NOT ANDROID AND NOT IOS AND NOT EMSCRIPTEN) file(GLOB GLX_SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} glx/*.cpp) file(GLOB GLX_HEADER_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} glx/*.h) list(APPEND SRC_FILES ${GLX_SRC_FILES}) list(APPEND HEADER_FILES ${GLX_HEADER_FILES}) endif() if((IGL_WITH_OPENGLES OR (UNIX AND NOT APPLE AND NOT ANDROID AND NOT IOS AND NOT EMSCRIPTEN)) AND NOT IOS) file(GLOB EGL_SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} egl/*.cpp) file(GLOB EGL_HEADER_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} egl/*.h) if(ANDROID) file(GLOB EGL_ANDROID_SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} egl/android/*.cpp) file(GLOB EGL_ANDROID_HEADER_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} egl/android/*.h) list(APPEND EGL_SRC_FILES ${EGL_ANDROID_SRC_FILES}) list(APPEND EGL_HEADER_FILES ${EGL_ANDROID_HEADER_FILES}) endif() list(APPEND SRC_FILES ${EGL_SRC_FILES}) list(APPEND HEADER_FILES ${EGL_HEADER_FILES}) endif() if(IGL_WITH_WEBGL) file(GLOB WEBGL_SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} webgl/*.cpp) file(GLOB WEBGL_HEADER_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} webgl/*.h) list(APPEND SRC_FILES ${WEBGL_SRC_FILES}) list(APPEND HEADER_FILES ${WEBGL_HEADER_FILES}) endif() add_library(IGLOpenGL ${SRC_FILES} ${HEADER_FILES}) target_link_libraries(IGLOpenGL PRIVATE IGLLibrary) if(ANDROID) add_definitions("-DGL_GLEXT_PROTOTYPES") target_link_libraries(IGLOpenGL PUBLIC log GLESv3 EGL) endif() if(APPLE) if(IOS) set(PLATFORM_FRAMEWORKS "-framework OpenGLES" "-framework CoreVideo") set(OPENGL_DEPRECATION_FLAG GLES_SILENCE_DEPRECATION) else() set(PLATFORM_FRAMEWORKS "-framework OpenGL" "-framework Cocoa" "-framework CoreVideo") set(OPENGL_DEPRECATION_FLAG GL_SILENCE_DEPRECATION) endif() target_link_libraries(IGLOpenGL PRIVATE "-framework IOKit" "-framework CoreFoundation" ${PLATFORM_FRAMEWORKS}) target_compile_definitions(IGLOpenGL PUBLIC -D${OPENGL_DEPRECATION_FLAG}) endif() if (IGL_WITH_WEBGL) #"-s DEMANGLE_SUPPORT=1") set_target_properties(IGLOpenGL PROPERTIES LINK_FLAGS "-s USE_WEBGL2=1 -s GL_SUPPORT_AUTOMATIC_ENABLE_EXTENSIONS=1 -s GL_EMULATE_GLES_VERSION_STRING_FORMAT=1") endif() target_link_libraries(IGLOpenGL PRIVATE IGLLibrary) if(NOT APPLE AND NOT ANDROID AND NOT EMSCRIPTEN) target_link_libraries(IGLOpenGL PUBLIC OpenGL::GL) endif() igl_set_cxxstd(IGLOpenGL 20) igl_set_folder(IGLOpenGL "IGL") if(WIN32) add_definitions("-DNOMINMAX") # IGLOpenGL uses GL/glew.h on Windows set(BUILD_UTILS OFF CACHE BOOL "") add_subdirectory("${IGL_ROOT_DIR}/third-party/deps/src/glew/build/cmake" glew) igl_set_folder(glew "third-party") igl_set_folder(glew_s "third-party") target_link_libraries(IGLOpenGL PUBLIC glew_s) target_include_directories(IGLOpenGL PUBLIC "${IGL_ROOT_DIR}/third-party/deps/src/glew/include") target_include_directories(IGLOpenGL PUBLIC "${IGL_ROOT_DIR}/third-party/deps/src/EGL/EGL/include") elseif(UNIX AND NOT APPLE AND NOT ANDROID AND NOT EMSCRIPTEN) add_definitions("-DGL_GLEXT_PROTOTYPES") target_link_libraries(IGLOpenGL PUBLIC EGL OpenGL) endif() if(IGL_WITH_OPENGLES AND NOT APPLE) target_link_libraries(IGLOpenGL PUBLIC EGL) endif() ================================================ FILE: src/igl/opengl/CommandBuffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include namespace igl::opengl { CommandBuffer::CommandBuffer(std::shared_ptr context, CommandBufferDesc desc) : ICommandBuffer(std::move(desc)), context_(std::move(context)) {} CommandBuffer::~CommandBuffer() = default; std::unique_ptr CommandBuffer::createRenderCommandEncoder( const RenderPassDesc& renderPass, const std::shared_ptr& framebuffer, const Dependencies& dependencies, Result* outResult) { return RenderCommandEncoder::create( shared_from_this(), renderPass, framebuffer, dependencies, outResult); } std::unique_ptr CommandBuffer::createComputeCommandEncoder() { return std::make_unique(shared_from_this()->getContext()); } void CommandBuffer::present(const std::shared_ptr& surface) const { context_->present(surface); } void CommandBuffer::waitUntilScheduled() { context_->flush(); } void CommandBuffer::waitUntilCompleted() { context_->finish(); } void CommandBuffer::pushDebugGroupLabel(const char* label, const igl::Color& /*color*/) const { IGL_DEBUG_ASSERT(label != nullptr && *label); if (getContext().deviceFeatures().hasInternalFeature(InternalFeatures::DebugMessage)) { getContext().pushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, -1, label); } else { IGL_LOG_ERROR_ONCE("CommandBuffer::pushDebugGroupLabel not supported in this context!\n"); } } void CommandBuffer::popDebugGroupLabel() const { if (getContext().deviceFeatures().hasInternalFeature(InternalFeatures::DebugMessage)) { getContext().popDebugGroup(); } else { IGL_LOG_ERROR_ONCE("CommandBuffer::popDebugGroupLabel not supported in this context!\n"); } } void CommandBuffer::copyBuffer(IBuffer& src, IBuffer& dst, uint64_t srcOffset, uint64_t dstOffset, uint64_t size) { IContext& ctx = getContext(); if (!ctx.deviceFeatures().hasFeature(igl::DeviceFeatures::CopyBuffer)) { IGL_LOG_ERROR_ONCE("CommandBuffer::copyBuffer() not supported in this context!\n"); return; } auto& srcBuffer = static_cast(src); auto& dstBuffer = static_cast(dst); ctx.bindBuffer(GL_COPY_READ_BUFFER, srcBuffer.getId()); ctx.bindBuffer(GL_COPY_WRITE_BUFFER, dstBuffer.getId()); ctx.copyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, srcOffset, dstOffset, size); ctx.bindBuffer(GL_COPY_READ_BUFFER, 0); ctx.bindBuffer(GL_COPY_WRITE_BUFFER, 0); } void CommandBuffer::copyTextureToBuffer(ITexture& src, IBuffer& dst, uint64_t dstOffset, uint32_t level, uint32_t layer) { (void)src; (void)dst; (void)dstOffset; (void)level; (void)layer; IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } IContext& CommandBuffer::getContext() const { return *context_; } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/CommandBuffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::opengl { class IContext; class CommandBuffer final : public ICommandBuffer, public std::enable_shared_from_this { public: explicit CommandBuffer(std::shared_ptr context, CommandBufferDesc desc); ~CommandBuffer() override; std::unique_ptr createRenderCommandEncoder( const RenderPassDesc& renderPass, const std::shared_ptr& framebuffer, const Dependencies& dependencies, Result* outResult) override; std::unique_ptr createComputeCommandEncoder() override; void present(const std::shared_ptr& surface) const override; void waitUntilScheduled() override; void waitUntilCompleted() override; void pushDebugGroupLabel(const char* label, const igl::Color& color) const override; void popDebugGroupLabel() const override; void copyBuffer(IBuffer& src, IBuffer& dst, uint64_t srcOffset, uint64_t dstOffset, uint64_t size) override; void copyTextureToBuffer(ITexture& src, IBuffer& dst, uint64_t dstOffset, uint32_t level, uint32_t layer) override; IContext& getContext() const; private: std::shared_ptr context_; }; } // namespace igl::opengl ================================================ FILE: src/igl/opengl/CommandQueue.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include namespace igl::opengl { void CommandQueue::setInitialContext(const std::shared_ptr& context) { context_ = context; } std::shared_ptr CommandQueue::createCommandBuffer(const CommandBufferDesc& desc, Result* outResult) { // IGL_DEBUG_ASSERT( // activeCommandBuffers_ == 0, // "OpenGL does not currently support creating multiple commandBuffers at the same time"); if (context_ == nullptr) { Result::setResult(outResult, Result::Code::RuntimeError, "There is no context set"); return nullptr; } auto commandBuffer = std::make_shared(context_, desc); activeCommandBuffers_++; Result::setOk(outResult); return commandBuffer; } SubmitHandle CommandQueue::submit(const ICommandBuffer& commandBuffer, bool /* endOfFrame */) { const auto& cb = static_cast(commandBuffer); incrementDrawCount(cb.getCurrentDrawCount()); if (commandBuffer.desc.timer) { static_cast(*commandBuffer.desc.timer).end(); } activeCommandBuffers_--; return SubmitHandle{}; } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/CommandQueue.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::opengl { class IContext; class CommandQueue final : public ICommandQueue { public: std::shared_ptr createCommandBuffer(const CommandBufferDesc& desc, Result* outResult) override; SubmitHandle submit(const ICommandBuffer& commandBuffer, bool endOfFrame = false) override; void setInitialContext(const std::shared_ptr& context); private: std::shared_ptr context_; uint32_t activeCommandBuffers_ = 0; }; } // namespace igl::opengl ================================================ FILE: src/igl/opengl/ComputeCommandAdapter.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #define SET_DIRTY(dirtyMap, index) dirtyMap.set(index) #define CLEAR_DIRTY(dirtyMap, index) dirtyMap.reset(index) #define IS_DIRTY(dirtyMap, index) dirtyMap[index] namespace igl::opengl { ComputeCommandAdapter::ComputeCommandAdapter(IContext& context) : WithContext(context), uniformAdapter_(context, UniformAdapter::PipelineType::Compute) {} void ComputeCommandAdapter::clearTextures() {} void ComputeCommandAdapter::setTexture(ITexture* texture, uint32_t index) { if (!IGL_DEBUG_VERIFY(index < IGL_TEXTURE_SAMPLERS_MAX)) { return; } textureStates_[index] = texture; SET_DIRTY(textureStatesDirty_, index); } void ComputeCommandAdapter::clearBuffers() { buffersDirty_.reset(); } void ComputeCommandAdapter::setBuffer(Buffer* buffer, size_t offset, uint32_t index) { IGL_DEBUG_ASSERT(index < IGL_BUFFER_BINDINGS_MAX, "Buffer index is beyond max, may want to increase limit"); if (index < uniformAdapter_.getMaxUniforms() && buffer) { buffers_[index] = {buffer, offset}; SET_DIRTY(buffersDirty_, index); } } void ComputeCommandAdapter::clearUniformBuffers() { uniformAdapter_.clearUniformBuffers(); } void ComputeCommandAdapter::setUniform(const UniformDesc& uniformDesc, const void* data, Result* outResult) { uniformAdapter_.setUniform(uniformDesc, data, outResult); } void ComputeCommandAdapter::setBlockUniform(Buffer* buffer, size_t offset, size_t size, int index, Result* outResult) { uniformAdapter_.setUniformBuffer(buffer, offset, size, index, outResult); } void ComputeCommandAdapter::dispatchThreadGroups(const Dimensions& threadgroupCount, const Dimensions& /*threadgroupSize*/) { willDispatch(); getContext().dispatchCompute(static_cast(threadgroupCount.width), static_cast(threadgroupCount.height), static_cast(threadgroupCount.depth)); didDispatch(); } void ComputeCommandAdapter::setPipelineState( const std::shared_ptr& newValue) { if (pipelineState_) { clearDependentResources(newValue); } pipelineState_ = newValue; setDirty(StateMask::PIPELINE); } void ComputeCommandAdapter::clearDependentResources( const std::shared_ptr& newValue) {} void ComputeCommandAdapter::willDispatch() { Result ret; auto* pipelineState = static_cast(pipelineState_.get()); IGL_DEBUG_ASSERT(pipelineState, "ComputePipelineState is nullptr"); if (pipelineState == nullptr) { return; } if (isDirty(StateMask::PIPELINE)) { pipelineState->bind(); clearDirty(StateMask::PIPELINE); } for (uint32_t bufferIndex = 0; bufferIndex < IGL_BUFFER_BINDINGS_MAX; ++bufferIndex) { if (!IS_DIRTY(buffersDirty_, bufferIndex)) { continue; } auto& bufferState = buffers_[bufferIndex]; ret = pipelineState->bindBuffer(bufferIndex, bufferState.resource); CLEAR_DIRTY(buffersDirty_, bufferIndex); if (!ret.isOk()) { IGL_LOG_INFO_ONCE(ret.message.c_str()); continue; } } // Bind uniforms to be used for compute uniformAdapter_.bindToPipeline(getContext()); for (size_t index = 0; index < textureStates_.size(); index++) { if (!IS_DIRTY(textureStatesDirty_, index)) { continue; } auto& textureState = textureStates_[index]; if (auto* texture = static_cast(textureState)) { ret = pipelineState->bindTextureUnit(index, texture); CLEAR_DIRTY(textureStatesDirty_, index); if (!ret.isOk()) { IGL_LOG_INFO_ONCE(ret.message.c_str()); continue; } } } } void ComputeCommandAdapter::didDispatch() { getContext().memoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT); if (pipelineState_ == nullptr) { return; } auto* pipelineState = static_cast(pipelineState_.get()); IGL_DEBUG_ASSERT(pipelineState, "ComputePipelineState is nullptr"); if (pipelineState == nullptr) { return; } if (pipelineState->getIsUsingShaderStorageBuffers()) { getContext().memoryBarrier(GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT | GL_ELEMENT_ARRAY_BARRIER_BIT | GL_SHADER_STORAGE_BARRIER_BIT | GL_BUFFER_UPDATE_BARRIER_BIT); } } void ComputeCommandAdapter::endEncoding() { pipelineState_ = nullptr; textureStates_ = TextureStates(); buffersDirty_.reset(); textureStatesDirty_.reset(); dirtyStateBits_ = EnumToValue(StateMask::NONE); uniformAdapter_.shrinkUniformUsage(); uniformAdapter_.clearUniformBuffers(); } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/ComputeCommandAdapter.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include #include #include namespace igl { class ITexture; class IComputePipelineState; class ISamplerState; namespace opengl { class Buffer; class ComputeCommandAdapter final : public WithContext { private: using StateBits = uint8_t; enum class StateMask : StateBits { NONE = 0, PIPELINE = 1 << 1 }; struct BufferState { Buffer* resource = nullptr; size_t offset = 0; }; using TextureState = ITexture*; using TextureStates = std::array; public: explicit ComputeCommandAdapter(IContext& context); void clearTextures(); void setTexture(ITexture* texture, uint32_t index); void clearBuffers(); void setBuffer(Buffer* buffer, size_t offset, uint32_t index); void clearUniformBuffers(); void setBlockUniform(Buffer* buffer, size_t offset, size_t size, int index, Result* outResult = nullptr); void setUniform(const UniformDesc& uniformDesc, const void* data, Result* outResult = nullptr); void setPipelineState(const std::shared_ptr& newValue); void dispatchThreadGroups(const Dimensions& threadgroupCount, const Dimensions& /*threadgroupSize*/); void endEncoding(); private: void clearDependentResources(const std::shared_ptr& newValue); void willDispatch(); void didDispatch(); [[nodiscard]] bool isDirty(StateMask mask) const { return (dirtyStateBits_ & EnumToValue(mask)) != 0; } void setDirty(StateMask mask) { dirtyStateBits_ |= EnumToValue(mask); } void clearDirty(StateMask mask) { dirtyStateBits_ &= ~EnumToValue(mask); } private: std::array buffers_; std::bitset buffersDirty_; std::bitset textureStatesDirty_; TextureStates textureStates_{}; UniformAdapter uniformAdapter_; StateBits dirtyStateBits_ = EnumToValue(StateMask::NONE); std::shared_ptr pipelineState_; }; } // namespace opengl } // namespace igl ================================================ FILE: src/igl/opengl/ComputeCommandEncoder.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #include namespace igl::opengl { ///---------------------------------------------------------------------------- /// MARK: - ComputeCommandEncoder ComputeCommandEncoder::ComputeCommandEncoder(IContext& context) : WithContext(context) { auto& oglContext = getContext(); auto& pool = oglContext.getComputeAdapterPool(); if (pool.empty()) { adapter_ = std::make_unique(oglContext); } else { adapter_ = std::move(pool[pool.size() - 1]); pool.pop_back(); } } ComputeCommandEncoder::~ComputeCommandEncoder() = default; void ComputeCommandEncoder::endEncoding() { if (IGL_DEBUG_VERIFY(adapter_)) { adapter_->endEncoding(); getContext().getComputeAdapterPool().push_back(std::move(adapter_)); } } void ComputeCommandEncoder::bindComputePipelineState( const std::shared_ptr& pipelineState) { if (IGL_DEBUG_VERIFY(adapter_)) { adapter_->setPipelineState(pipelineState); } } void ComputeCommandEncoder::dispatchThreadGroups(const Dimensions& threadgroupCount, const Dimensions& threadgroupSize, const Dependencies& /*dependencies*/) { if (IGL_DEBUG_VERIFY(adapter_)) { adapter_->dispatchThreadGroups(threadgroupCount, threadgroupSize); } } void ComputeCommandEncoder::pushDebugGroupLabel(const char* label, const igl::Color& /*color*/) const { IGL_DEBUG_ASSERT(label != nullptr && *label); if (getContext().deviceFeatures().hasInternalFeature(InternalFeatures::DebugMessage)) { getContext().pushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, -1, label); } else { IGL_LOG_ERROR_ONCE( "ComputeCommandEncoder::pushDebugGroupLabel not supported in this context!\n"); } } void ComputeCommandEncoder::insertDebugEventLabel(const char* label, const igl::Color& /*color*/) const { IGL_DEBUG_ASSERT(label != nullptr && *label); if (getContext().deviceFeatures().hasInternalFeature(InternalFeatures::DebugMessage)) { getContext().debugMessageInsert( GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, 0, GL_DEBUG_SEVERITY_LOW, -1, label); } else { IGL_LOG_ERROR_ONCE( "ComputeCommandEncoder::insertDebugEventLabel not supported in this context!\n"); } } void ComputeCommandEncoder::popDebugGroupLabel() const { if (getContext().deviceFeatures().hasInternalFeature(InternalFeatures::DebugMessage)) { getContext().popDebugGroup(); } else { IGL_LOG_ERROR_ONCE( "ComputeCommandEncoder::popDebugGroupLabel not supported in this context!\n"); } } void ComputeCommandEncoder::bindUniform(const UniformDesc& uniformDesc, const void* data) { IGL_DEBUG_ASSERT(uniformDesc.location >= 0, "Invalid location passed to bindUniformBuffer: %d", uniformDesc.location); IGL_DEBUG_ASSERT(data != nullptr, "Data cannot be null"); if (IGL_DEBUG_VERIFY(adapter_) && data) { adapter_->setUniform(uniformDesc, data); } } void ComputeCommandEncoder::bindTexture(uint32_t index, ITexture* texture) { if (IGL_DEBUG_VERIFY(adapter_)) { adapter_->setTexture(texture, index); } } void ComputeCommandEncoder::bindImageTexture(uint32_t index, ITexture* texture, TextureFormat format) { (void)index; (void)texture; (void)format; IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } void ComputeCommandEncoder::bindSamplerState(uint32_t index, ISamplerState* samplerState) { (void)index; (void)samplerState; IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } // NOLINTBEGIN(bugprone-easily-swappable-parameters) void ComputeCommandEncoder::bindBuffer(uint32_t index, IBuffer* buffer, size_t offset, size_t bufferSize) { // NOLINTEND(bugprone-easily-swappable-parameters) if (IGL_DEBUG_VERIFY(adapter_) && buffer) { auto* glBuffer = static_cast(buffer); auto bufferType = glBuffer->getType(); if (bufferType == Buffer::Type::UniformBlock) { adapter_->setBlockUniform(glBuffer, offset, bufferSize, index, nullptr); } else { adapter_->setBuffer(glBuffer, offset, static_cast(index)); } } } void ComputeCommandEncoder::bindBytes(uint32_t /*index*/, const void* /*data*/, size_t /*length*/) { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } void ComputeCommandEncoder::bindPushConstants(const void* /*data*/, size_t /*length*/, size_t /*offset*/) { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/ComputeCommandEncoder.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include namespace igl { class ICommandBuffer; class IComputePipelineState; class ISamplerState; namespace opengl { class Buffer; class ComputeCommandEncoder final : public IComputeCommandEncoder, public WithContext { public: explicit ComputeCommandEncoder(IContext& context); ~ComputeCommandEncoder() override; void bindComputePipelineState( const std::shared_ptr& pipelineState) override; // threadgroupCount is how many thread groups per grid in each dimension. // threadgroupSize is how many threads are in each threadgroup // total number of threads per grid is threadgroupCount * threadgroupSize void dispatchThreadGroups(const Dimensions& threadgroupCount, const Dimensions& threadgroupSize, const Dependencies& dependencies) override; void endEncoding() override; void pushDebugGroupLabel(const char* label, const igl::Color& color) const override; void insertDebugEventLabel(const char* label, const igl::Color& color) const override; void popDebugGroupLabel() const override; void bindUniform(const UniformDesc& uniformDesc, const void* data) override; void bindTexture(uint32_t index, ITexture* texture) override; void bindImageTexture(uint32_t index, ITexture* texture, TextureFormat format) override; void bindSamplerState(uint32_t index, ISamplerState* samplerState) override; void bindBuffer(uint32_t index, IBuffer* buffer, size_t offset, size_t bufferSize) override; void bindBytes(uint32_t index, const void* data, size_t length) override; void bindPushConstants(const void* data, size_t length, size_t offset) override; private: std::unique_ptr adapter_; }; } // namespace opengl } // namespace igl ================================================ FILE: src/igl/opengl/ComputePipelineState.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include namespace igl::opengl { ComputePipelineState::ComputePipelineState(IContext& context) : WithContext(context) {} ComputePipelineState::~ComputePipelineState() = default; Result ComputePipelineState::create(const ComputePipelineDesc& desc) { Result result; if (IGL_DEBUG_VERIFY_NOT(desc.shaderStages == nullptr)) { Result::setResult(&result, Result::Code::ArgumentInvalid, "Missing shader stages"); return result; } if (!IGL_DEBUG_VERIFY(desc.shaderStages->getType() == ShaderStagesType::Compute)) { Result::setResult(&result, Result::Code::ArgumentInvalid, "Shader stages not for compute"); return result; } if (!IGL_DEBUG_VERIFY(desc.shaderStages->getComputeModule())) { Result::setResult(&result, Result::Code::ArgumentInvalid, "Missing compute shader"); return result; } shaderStages_ = std::static_pointer_cast(desc.shaderStages); reflection_ = std::make_shared(getContext(), *shaderStages_); for (const auto& unitSampler : desc.imagesMap) { const auto textureUnit = unitSampler.first; const auto& imageName = unitSampler.second; IGL_DEBUG_ASSERT(!imageName.toString().empty()); const int loc = reflection_->getIndexByName(imageName); if (IGL_DEBUG_VERIFY(loc >= 0)) { GLint unit = 0; getContext().getUniformiv(shaderStages_->getProgramID(), loc, &unit); if (IGL_DEBUG_VERIFY(unit >= 0)) { imageUnitMap_[textureUnit] = unit; } else { IGL_LOG_ERROR("Image uniform unit (%s) not found in shader.\n", imageName.c_str()); } } else { IGL_LOG_ERROR("Image uniform (%s) not found in shader.\n", imageName.c_str()); } } for (const auto& buffer : desc.buffersMap) { const auto bufferUnit = buffer.first; const auto& bufferName = buffer.second; IGL_DEBUG_ASSERT(!bufferName.toString().empty()); const int loc = reflection_->getIndexByName(bufferName); if (IGL_DEBUG_VERIFY(loc >= 0)) { if (const auto& ssboDictionary = reflection_->getShaderStorageBufferObjectDictionary(); ssboDictionary.find(bufferName) != ssboDictionary.end()) { bufferUnitMap_[bufferUnit] = loc; usingShaderStorageBuffers_ = true; } else { GLint unit = 0; getContext().getUniformiv(shaderStages_->getProgramID(), loc, &unit); if (IGL_DEBUG_VERIFY(unit >= 0)) { bufferUnitMap_[bufferUnit] = loc; } else { IGL_LOG_ERROR("Buffer uniform unit (%s) not found in shader.\n", bufferName.c_str()); } } } else { IGL_LOG_ERROR("Buffer uniform (%s) not found in shader.\n", bufferName.c_str()); } } return Result(); } void ComputePipelineState::bind() { if (shaderStages_) { shaderStages_->bind(); } } std::shared_ptr ComputePipelineState::computePipelineReflection() { return reflection_; } void ComputePipelineState::unbind() { if (shaderStages_) { shaderStages_->unbind(); } } Result ComputePipelineState::bindTextureUnit(const size_t unit, Texture* texture) { if (!shaderStages_) { return Result{Result::Code::InvalidOperation, "No shader set\n"}; } if (unit >= IGL_TEXTURE_SAMPLERS_MAX) { return Result{Result::Code::ArgumentInvalid, "Image unit specified greater than maximum\n"}; } const GLint samplerUnit(imageUnitMap_[unit]); if (samplerUnit < 0) { return Result{Result::Code::RuntimeError, "Unable to find image location\n"}; } texture->bindImage(samplerUnit); return Result(); } Result ComputePipelineState::bindBuffer(const size_t unit, Buffer* buffer) { if (!shaderStages_) { return Result{Result::Code::InvalidOperation, "No shader set\n"}; } if (unit >= IGL_BUFFER_BINDINGS_MAX) { return Result{Result::Code::ArgumentInvalid, "Buffer unit specified greater than maximum\n"}; } const GLint bufferLocation(bufferUnitMap_[unit]); if (bufferLocation < 0) { return Result{Result::Code::RuntimeError, "Unable to find buffer location\n"}; } Result result; static_cast(*buffer).bindBase(bufferLocation, &result); return result; } int ComputePipelineState::getIndexByName(const NameHandle& name) const { return reflection_ ? reflection_->getIndexByName(name) : -1; } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/ComputePipelineState.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include namespace igl::opengl { class Texture; class Buffer; class ComputePipelineState final : public WithContext, public IComputePipelineState { friend class Device; public: explicit ComputePipelineState(IContext& context); ~ComputePipelineState() override; Result create(const ComputePipelineDesc& desc); void bind(); void unbind(); Result bindTextureUnit(size_t unit, Texture* texture); Result bindBuffer(size_t unit, Buffer* buffer); std::shared_ptr computePipelineReflection() override; [[nodiscard]] int getIndexByName(const NameHandle& name) const override; bool getIsUsingShaderStorageBuffers() { return usingShaderStorageBuffers_; } private: using ComputePipelineReflection = RenderPipelineReflection; std::array bufferUnitMap_{}; std::array imageUnitMap_{}; std::shared_ptr shaderStages_; std::shared_ptr reflection_; bool usingShaderStorageBuffers_ = false; }; } // namespace igl::opengl ================================================ FILE: src/igl/opengl/Config.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once // @fb-only #include #if IGL_PLATFORM_IOS_SIMULATOR || IGL_PLATFORM_IOS || IGL_PLATFORM_MACCATALYST || IGL_ANGLE || \ IGL_PLATFORM_ANDROID || IGL_PLATFORM_EMSCRIPTEN || IGL_PLATFORM_LINUX_USE_EGL #define IGL_OPENGL_ES 1 #define IGL_OPENGL 0 #else #define IGL_OPENGL_ES 0 #define IGL_OPENGL 1 #endif // Here we enable IGL_EGL on Linux to load GL functions by eglGetProcAddress. #if (IGL_OPENGL_ES && !IGL_PLATFORM_APPLE) || IGL_PLATFORM_LINUX #define IGL_EGL 1 #else #define IGL_EGL 0 #endif #if IGL_PLATFORM_WINDOWS && !IGL_OPENGL_ES #define IGL_WGL 1 #else #define IGL_WGL 0 #endif // Define IGL_API_LOG as 1 to enable OpenGL API logging #if !defined(IGL_API_LOG) #define IGL_API_LOG 0 #endif ================================================ FILE: src/igl/opengl/DepthStencilState.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include namespace igl::opengl { DepthStencilState::DepthStencilState(IContext& context) : WithContext(context) {} Result DepthStencilState::create(const DepthStencilStateDesc& desc) { desc_ = desc; return Result(); } GLenum DepthStencilState::convertCompareFunction(CompareFunction value) { switch (value) { case CompareFunction::Never: return GL_NEVER; case CompareFunction::Less: return GL_LESS; case CompareFunction::Equal: return GL_EQUAL; case CompareFunction::LessEqual: return GL_LEQUAL; case CompareFunction::Greater: return GL_GREATER; case CompareFunction::NotEqual: return GL_NOTEQUAL; case CompareFunction::GreaterEqual: return GL_GEQUAL; case CompareFunction::AlwaysPass: return GL_ALWAYS; } IGL_UNREACHABLE_RETURN(GL_ALWAYS) } GLenum DepthStencilState::convertStencilOperation(StencilOperation value) { switch (value) { case StencilOperation::Keep: return GL_KEEP; case StencilOperation::Zero: return GL_ZERO; case StencilOperation::Replace: return GL_REPLACE; case StencilOperation::IncrementClamp: return GL_INCR; case StencilOperation::DecrementClamp: return GL_DECR; case StencilOperation::Invert: return GL_INVERT; case StencilOperation::IncrementWrap: return GL_INCR_WRAP; case StencilOperation::DecrementWrap: return GL_DECR_WRAP; } IGL_UNREACHABLE_RETURN(GL_ZERO) } void DepthStencilState::bind(uint32_t frontStencilReferenceValue, uint32_t backStencilReferenceValue) { getContext().depthMask(static_cast(desc_.isDepthWriteEnabled)); // https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDepthFunc.xhtml // In order to unconditionally write to the depth buffer, the depth test should // be enabled and set to GL_ALWAYS if (desc_.isDepthWriteEnabled || desc_.compareFunction != CompareFunction::AlwaysPass) { getContext().enable(GL_DEPTH_TEST); } else { getContext().disable(GL_DEPTH_TEST); } getContext().depthFunc(convertCompareFunction(desc_.compareFunction)); if (desc_.frontFaceStencil != StencilStateDesc() || desc_.backFaceStencil != StencilStateDesc()) { getContext().enable(GL_STENCIL_TEST); const GLenum frontCompareFunc = convertCompareFunction(desc_.frontFaceStencil.stencilCompareFunction); const GLenum backCompareFunc = convertCompareFunction(desc_.backFaceStencil.stencilCompareFunction); getContext().stencilFuncSeparate( GL_FRONT, frontCompareFunc, frontStencilReferenceValue, desc_.frontFaceStencil.readMask); getContext().stencilFuncSeparate( GL_BACK, backCompareFunc, backStencilReferenceValue, desc_.backFaceStencil.readMask); GLenum sfail = convertStencilOperation(desc_.backFaceStencil.stencilFailureOperation); GLenum dpfail = convertStencilOperation(desc_.backFaceStencil.depthFailureOperation); GLenum dppass = convertStencilOperation(desc_.backFaceStencil.depthStencilPassOperation); getContext().stencilOpSeparate(GL_BACK, sfail, dpfail, dppass); sfail = convertStencilOperation(desc_.frontFaceStencil.stencilFailureOperation); dpfail = convertStencilOperation(desc_.frontFaceStencil.depthFailureOperation); dppass = convertStencilOperation(desc_.frontFaceStencil.depthStencilPassOperation); getContext().stencilOpSeparate(GL_FRONT, sfail, dpfail, dppass); getContext().stencilMaskSeparate(GL_BACK, desc_.backFaceStencil.writeMask); getContext().stencilMaskSeparate(GL_FRONT, desc_.frontFaceStencil.writeMask); } else { getContext().disable(GL_STENCIL_TEST); } } void DepthStencilState::unbind() {} } // namespace igl::opengl ================================================ FILE: src/igl/opengl/DepthStencilState.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl { class ICommandBuffer; namespace opengl { class DepthStencilState final : public WithContext, public IDepthStencilState { friend class Device; public: explicit DepthStencilState(IContext& context); ~DepthStencilState() override = default; Result create(const DepthStencilStateDesc& desc); void bind(uint32_t frontStencilReferenceValue, uint32_t backStencilReferenceValue); void unbind(); static GLenum convertCompareFunction(CompareFunction value); static GLenum convertStencilOperation(StencilOperation value); private: DepthStencilStateDesc desc_; }; } // namespace opengl } // namespace igl ================================================ FILE: src/igl/opengl/DestructionGuard.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace igl::opengl { DestructionGuard::DestructionGuard(std::shared_ptr context) : context_(std::move(context)) { if (IGL_DEBUG_VERIFY(context_)) { ++context_->lockCount_; } } DestructionGuard::~DestructionGuard() { if (context_) { --context_->lockCount_; } } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/DestructionGuard.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::opengl { class IContext; /// /// Guard class providing RAII-style mechanism for disabling destruction of GL-side objects when /// IContext is destroyed. Destruction is disabled as long as client holds an instance of this /// class. /// class DestructionGuard final { public: /*implicit*/ DestructionGuard(std::shared_ptr context); ~DestructionGuard(); DestructionGuard(DestructionGuard&& context) noexcept = default; DestructionGuard& operator=(DestructionGuard&&) noexcept = default; DestructionGuard(const DestructionGuard&) = delete; DestructionGuard& operator=(const DestructionGuard&) = delete; private: std::shared_ptr context_; }; } // namespace igl::opengl ================================================ FILE: src/igl/opengl/Device.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace igl::opengl { namespace { std::unique_ptr allocateBuffer(BufferDesc::BufferType bufferType, BufferDesc::BufferAPIHint requestedApiHints, IContext& context) { std::unique_ptr resource; if ((bufferType & BufferDesc::BufferTypeBits::Index) || (bufferType & BufferDesc::BufferTypeBits::Vertex) || (bufferType & BufferDesc::BufferTypeBits::Indirect) || (bufferType & BufferDesc::BufferTypeBits::Storage)) { resource = std::make_unique(context, requestedApiHints, bufferType); } else if (bufferType & BufferDesc::BufferTypeBits::Uniform) { if (requestedApiHints & BufferDesc::BufferAPIHintBits::UniformBlock) { resource = std::make_unique(context, requestedApiHints, bufferType); } else { resource = std::make_unique(context, requestedApiHints, bufferType); } } else { IGL_DEBUG_ASSERT_NOT_REACHED(); // desc.type is corrupt or new enum type was introduced } return resource; } template Ptr verifyResult(Ptr resource, Result inResult, Result* outResult) noexcept { if (inResult.isOk()) { Result::setOk(outResult); } else { IGL_DEBUG_ABORT(inResult.message.c_str()); resource = {}; Result::setResult(outResult, std::move(inResult)); } return resource; } // common signature to the creation of all resources template Ptr createResource(const Desc& desc, Result* outResult, Params&&... constructorParams) { // Create the object type and a smart pointer to hold it. using T = typename Ptr::element_type; // NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks) Ptr resource(new T(std::forward(constructorParams)...)); // Create the resource using desc. Result result = resource->create(desc); return verifyResult(std::move(resource), std::move(result), outResult); } template std::shared_ptr createSharedResource(const Desc& desc, Result* outResult, Params&&... constructorParams) { return createResource>( desc, outResult, std::forward(constructorParams)...); } template std::unique_ptr createUniqueResource(const Desc& desc, Result* outResult, Params&&... constructorParams) { return createResource>( desc, outResult, std::forward(constructorParams)...); } } // namespace Device::Device(std::unique_ptr context) : // NOLINT(bugprone-exception-escape) context_(std::move(context)), deviceFeatureSet_(getContext().deviceFeatures()) {} Device::~Device() = default; // debug markers useful in GPU captures void Device::pushMarker(int len, const char* name) { if (deviceFeatureSet_.hasInternalFeature(InternalFeatures::DebugMessage)) { context_->pushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, len, name); } else { IGL_LOG_ERROR_ONCE("Device::pushMarker not supported in this context!"); } } void Device::popMarker() { if (deviceFeatureSet_.hasInternalFeature(InternalFeatures::DebugMessage)) { context_->popDebugGroup(); } else { IGL_LOG_ERROR_ONCE("Device::popMarker not supported in this context!"); } } // Command Queue std::shared_ptr Device::createCommandQueue(const CommandQueueDesc& /*desc*/, Result* outResult) noexcept { // we only use a single command queue on OpenGL if (!commandQueue_) { commandQueue_ = std::make_shared(); commandQueue_->setInitialContext(context_); } Result::setOk(outResult); return commandQueue_; } // Resources std::unique_ptr Device::createBuffer( // NOLINT(bugprone-exception-escape) const BufferDesc& desc, Result* outResult) const noexcept { std::unique_ptr resource = allocateBuffer(desc.type, desc.hint, getContext()); if (resource) { resource->initialize(desc, outResult); if (hasResourceTracker()) { resource->initResourceTracker(getResourceTracker(), desc.debugName); } } else { Result::setResult(outResult, Result::Code::RuntimeError, "Could not instantiate buffer."); } return resource; } std::shared_ptr Device::createDepthStencilState( const DepthStencilStateDesc& desc, Result* outResult) const { return createSharedResource(desc, outResult, getContext()); } std::shared_ptr Device::createSamplerState(const SamplerStateDesc& desc, Result* outResult) const { auto resource = std::make_shared(getContext(), desc); if (hasResourceTracker()) { resource->initResourceTracker(getResourceTracker(), desc.debugName); } Result::setOk(outResult); return resource; } std::shared_ptr Device::createTexture( // NOLINT(bugprone-exception-escape) const TextureDesc& desc, Result* outResult) const noexcept { const auto sanitized = sanitize(desc); std::unique_ptr texture; #if IGL_DEBUG_ABORT_ENABLED if (sanitized.type == TextureType::TwoD || sanitized.type == TextureType::TwoDArray) { size_t textureSizeLimit = 0; getFeatureLimits(DeviceFeatureLimits::MaxTextureDimension1D2D, textureSizeLimit); IGL_DEBUG_ASSERT(sanitized.width <= textureSizeLimit && sanitized.height <= textureSizeLimit, "Texture limit size %zu is smaller than texture size %zux%zu", textureSizeLimit, sanitized.width, sanitized.height); } #endif if ((sanitized.usage & TextureDesc::TextureUsageBits::Sampled) != 0 || (sanitized.usage & TextureDesc::TextureUsageBits::Storage) != 0) { texture = std::make_unique(getContext(), desc.format); } else if ((sanitized.usage & TextureDesc::TextureUsageBits::Attachment) != 0) { if (sanitized.type == TextureType::TwoD && sanitized.numMipLevels == 1 && sanitized.numLayers == 1) { texture = std::make_unique(getContext(), desc.format); } else { // Fall back to texture. e.g. TextureType::TwoDArray texture = std::make_unique(getContext(), desc.format); } } if (texture != nullptr) { Result result = texture->create(sanitized, false); if (!result.isOk()) { texture = nullptr; } else if (hasResourceTracker()) { texture->initResourceTracker(getResourceTracker(), desc.debugName); } Result::setResult(outResult, std::move(result)); } else { Result::setResult( outResult, Result::Code::Unsupported, "Unknown/unsupported texture usage bits."); } // sanity check to ensure that the Result value and the returned object are in sync // i.e. we never have a valid Result with a nullptr return value, or vice versa IGL_DEBUG_ASSERT(outResult == nullptr || (outResult->isOk() == (texture != nullptr))); return texture; } std::shared_ptr Device::createTextureView( // NOLINT(bugprone-exception-escape) std::shared_ptr texture, const TextureViewDesc& desc, Result* IGL_NULLABLE outResult) const noexcept { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); Result::setResult( outResult, Result::Code::Unimplemented, "Texture views are not (yet) implemented"); return nullptr; } std::shared_ptr Device::createVertexInputState(const VertexInputStateDesc& desc, Result* outResult) const { return createSharedResource(desc, outResult); } // Pipelines std::shared_ptr Device::createRenderPipeline(const RenderPipelineDesc& desc, Result* outResult) const { Result res; auto resource = std::make_shared(getContext(), desc, &res); return verifyResult(std::move(resource), res, outResult); } std::shared_ptr Device::createComputePipeline( const ComputePipelineDesc& desc, Result* outResult) const { return createSharedResource(desc, outResult, getContext()); } // Shaders std::unique_ptr Device::createShaderLibrary(const ShaderLibraryDesc& /*desc*/, Result* outResult) const { Result::setResult(outResult, Result::Code::Unsupported); IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); return nullptr; } std::shared_ptr Device::createShaderModule(const ShaderModuleDesc& desc, Result* outResult) const { auto sm = createSharedResource(desc, outResult, getContext(), desc.info); if (auto resourceTracker = getResourceTracker(); sm && resourceTracker) { sm->initResourceTracker(resourceTracker, desc.debugName); } return sm; } std::unique_ptr Device::createShaderStages(const ShaderStagesDesc& desc, Result* outResult) const { // Need to pass desc twice. // The first instance is for the createUniqueResource pattern. // The second instance is so it also gets passed to the ShaderStages constructor. auto stages = createUniqueResource(desc, outResult, desc, getContext()); if (auto resourceTracker = getResourceTracker(); stages && resourceTracker) { stages->initResourceTracker(std::move(resourceTracker), desc.debugName); } return stages; } std::shared_ptr Device::createFramebuffer(const FramebufferDesc& desc, Result* outResult) noexcept { IGL_DEBUG_ASSERT(deviceFeatureSet_.hasInternalFeature(InternalFeatures::FramebufferObject)); return getPlatformDevice().createFramebuffer(desc, outResult); } base::IFramebufferInterop* IGL_NULLABLE Device::createFramebufferInterop(const base::FramebufferInteropDesc& desc) { auto framebuffer = createFramebufferFromBaseDesc(desc); if (!framebuffer) { return nullptr; } return new (std::nothrow) FramebufferWrapper(std::move(framebuffer)); } bool Device::hasFeature(DeviceFeatures capability) const { return deviceFeatureSet_.hasFeature(capability); } bool Device::hasRequirement(DeviceRequirement requirement) const { return deviceFeatureSet_.hasRequirement(requirement); } bool Device::getFeatureLimits(DeviceFeatureLimits featureLimits, size_t& result) const { return deviceFeatureSet_.getFeatureLimits(featureLimits, result); } ICapabilities::TextureFormatCapabilities Device::getTextureFormatCapabilities( TextureFormat format) const { return deviceFeatureSet_.getTextureFormatCapabilities(format); } ShaderVersion Device::getShaderVersion() const { IGL_DEBUG_ASSERT(context_); return deviceFeatureSet_.getShaderVersion(); } BackendVersion Device::getBackendVersion() const { IGL_DEBUG_ASSERT(context_); return deviceFeatureSet_.getBackendVersion(); } void Device::beginScope() { IDevice::beginScope(); IGL_DEBUG_ASSERT(context_); context_->setCurrent(); // UnbindPolicy is fixed for duration of this scope cachedUnbindPolicy_ = getContext().getUnbindPolicy(); } void Device::endScope() { if (cachedUnbindPolicy_ == UnbindPolicy::EndScope) { // Ensure state on exit is consistent, for any external rendering that happens later. context_->colorMask(1u, 1u, 1u, 1u); context_->blendFunc(GL_ONE, GL_ZERO); context_->bindBuffer(GL_ARRAY_BUFFER, 0); context_->bindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); context_->pixelStorei(GL_PACK_ALIGNMENT, 4); context_->pixelStorei(GL_UNPACK_ALIGNMENT, 4); } IDevice::endScope(); // Clear current context, if we are supposed to. if (cachedUnbindPolicy_ == UnbindPolicy::ClearContext && !verifyScope()) { context_->clearCurrentContext(); } } void Device::updateSurface(void* nativeWindowType) {} bool Device::verifyScope() { IGL_DEBUG_ASSERT(context_); return IDevice::verifyScope() && context_->isCurrentContext(); } size_t Device::getCurrentDrawCount() const { return context_->getCurrentDrawCount(); } size_t Device::getShaderCompilationCount() const { return context_->getShaderCompilationCount(); } Holder Device::createBindGroup( const BindGroupTextureDesc& desc, const IRenderPipelineState* IGL_NULLABLE /*compatiblePipeline*/, Result* IGL_NULLABLE outResult) { IGL_DEBUG_ASSERT(context_); IGL_DEBUG_ASSERT(!desc.debugName.empty(), "Each bind group should have a debug name"); BindGroupTextureDesc description(desc); const auto handle = context_->bindGroupTexturesPool.create(std::move(description)); Result::setResult(outResult, handle.empty() ? Result(Result::Code::RuntimeError, "Cannot create bind group") : Result()); return {this, handle}; } Holder Device::createBindGroup(const BindGroupBufferDesc& desc, Result* IGL_NULLABLE outResult) { IGL_DEBUG_ASSERT(context_); IGL_DEBUG_ASSERT(!desc.debugName.empty(), "Each bind group should have a debug name"); BindGroupBufferDesc description(desc); const auto handle = context_->bindGroupBuffersPool.create(std::move(description)); Result::setResult(outResult, handle.empty() ? Result(Result::Code::RuntimeError, "Cannot create bind group") : Result()); return {this, handle}; } std::shared_ptr Device::createTimer(Result* IGL_NULLABLE outResult) const noexcept { if (deviceFeatureSet_.hasFeature(DeviceFeatures::Timers)) { Result::setOk(outResult); return std::make_shared(*context_); } Result::setResult( outResult, Result::Code::Unsupported, "Timers are not supported on this device"); return nullptr; } std::shared_ptr Device::createTimestampQueries(uint32_t maxTimestamps, Result* IGL_NULLABLE outResult) const noexcept { if (deviceFeatureSet_.hasExtension(Extensions::TimerQuery)) { Result::setOk(outResult); return std::make_shared(getContext(), maxTimestamps); } Result::setResult( outResult, Result::Code::Unsupported, "TimestampQueries are not supported on this device"); return nullptr; } void Device::destroy(BindGroupTextureHandle handle) { if (handle.empty()) { return; } IGL_DEBUG_ASSERT(context_); context_->bindGroupTexturesPool.destroy(handle); } void Device::destroy(BindGroupBufferHandle handle) { if (handle.empty()) { return; } IGL_DEBUG_ASSERT(context_); context_->bindGroupBuffersPool.destroy(handle); } void Device::destroy(SamplerHandle handle) { (void)handle; // IGL/OpenGL is not using sampler handles } void Device::setCurrentThread() { getContext().setCurrent(); } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/Device.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include namespace igl::opengl { class CommandQueue; class Device : public IDevice { friend class HWDevice; friend class PlatformDevice; public: explicit Device(std::unique_ptr context); ~Device() override; [[nodiscard]] Holder createBindGroup( const BindGroupTextureDesc& desc, const IRenderPipelineState* IGL_NULLABLE compatiblePipeline, Result* IGL_NULLABLE outResult) override; [[nodiscard]] Holder createBindGroup(const BindGroupBufferDesc& desc, Result* IGL_NULLABLE outResult) override; void destroy(BindGroupTextureHandle handle) override; void destroy(BindGroupBufferHandle handle) override; void destroy(SamplerHandle handle) override; // Command Queue std::shared_ptr createCommandQueue(const CommandQueueDesc& desc, Result* IGL_NULLABLE outResult) noexcept override; // Backend type query [[nodiscard]] BackendType getBackendType() const override { return BackendType::OpenGL; } // OpenGL doesn't have a single native device handle [[nodiscard]] void* IGL_NULLABLE getNativeDevice() const override { return nullptr; } // Resources std::unique_ptr createBuffer(const BufferDesc& desc, Result* IGL_NULLABLE outResult) const noexcept override; std::shared_ptr createDepthStencilState(const DepthStencilStateDesc& desc, Result* IGL_NULLABLE outResult) const override; std::shared_ptr createSamplerState(const SamplerStateDesc& desc, Result* IGL_NULLABLE outResult) const override; std::shared_ptr createTexture(const TextureDesc& desc, Result* IGL_NULLABLE outResult) const noexcept override; std::shared_ptr createTextureView(std::shared_ptr texture, const TextureViewDesc& desc, Result* IGL_NULLABLE outResult) const noexcept override; std::shared_ptr createVertexInputState(const VertexInputStateDesc& desc, Result* IGL_NULLABLE outResult) const override; // Pipelines std::shared_ptr createComputePipeline(const ComputePipelineDesc& desc, Result* IGL_NULLABLE outResult) const override; std::shared_ptr createRenderPipeline(const RenderPipelineDesc& desc, Result* IGL_NULLABLE outResult) const override; // Shaders std::unique_ptr createShaderLibrary(const ShaderLibraryDesc& desc, Result* IGL_NULLABLE outResult) const override; std::shared_ptr createShaderModule(const ShaderModuleDesc& desc, Result* IGL_NULLABLE outResult) const override; std::unique_ptr createShaderStages(const ShaderStagesDesc& desc, Result* IGL_NULLABLE outResult) const override; std::shared_ptr createFramebuffer(const FramebufferDesc& desc, Result* IGL_NULLABLE outResult) noexcept override; [[nodiscard]] base::IFramebufferInterop* IGL_NULLABLE createFramebufferInterop(const base::FramebufferInteropDesc& desc) override; // Timers std::shared_ptr createTimer(Result* IGL_NULLABLE outResult) const noexcept override; // Timestamp Queries std::shared_ptr createTimestampQueries(uint32_t maxTimestamps, Result* IGL_NULLABLE outResult) const noexcept override; // debug markers useful in GPU captures void pushMarker(int len, const char* IGL_NULLABLE name); void popMarker(); [[nodiscard]] const PlatformDevice& getPlatformDevice() const noexcept override = 0; void setCurrentThread() override; [[nodiscard]] IContext& getContext() const { return *context_; } // ICapabilities [[nodiscard]] bool hasFeature(DeviceFeatures capability) const override; [[nodiscard]] bool hasRequirement(DeviceRequirement requirement) const override; bool getFeatureLimits(DeviceFeatureLimits featureLimits, size_t& result) const override; [[nodiscard]] TextureFormatCapabilities getTextureFormatCapabilities( TextureFormat format) const override; [[nodiscard]] ShaderVersion getShaderVersion() const override; [[nodiscard]] BackendVersion getBackendVersion() const override; // Device Statistics [[nodiscard]] size_t getCurrentDrawCount() const override; [[nodiscard]] size_t getShaderCompilationCount() const override; bool verifyScope() override; void updateSurface(void* IGL_NULLABLE nativeWindowType) override; protected: void beginScope() override; void endScope() override; [[nodiscard]] const std::shared_ptr& getSharedContext() const { return context_; } private: GLint defaultFrameBufferID_{}; GLint defaultFrameBufferWidth_{}; GLint defaultFrameBufferHeight_{}; const std::shared_ptr context_; // on OpenGL we only need one command queue std::shared_ptr commandQueue_; const DeviceFeatureSet& deviceFeatureSet_; UnbindPolicy cachedUnbindPolicy_{}; }; } // namespace igl::opengl ================================================ FILE: src/igl/opengl/DeviceFeatureSet.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include namespace igl::opengl { namespace { bool hasVersion(const DeviceFeatureSet& dfs, bool usesOpenGLES, GLVersion minSupportedVersion) { return DeviceFeatureSet::usesOpenGLES() == usesOpenGLES && dfs.getGLVersion() >= minSupportedVersion; } bool hasVersionOrExtension(const DeviceFeatureSet& dfs, bool usesOpenGLES, GLVersion minSupportedVersion, const char* extension) { return hasVersion(dfs, usesOpenGLES, minSupportedVersion) || dfs.isSupported(extension); } bool hasDesktopVersion(const DeviceFeatureSet& dfs, GLVersion minSupportedVersion) { return hasVersion(dfs, false, minSupportedVersion); } bool hasESVersion(const DeviceFeatureSet& dfs, GLVersion minSupportedVersion) { return hasVersion(dfs, true, minSupportedVersion); } bool hasESExtension(const DeviceFeatureSet& dfs, const char* extension) { return DeviceFeatureSet::usesOpenGLES() && dfs.isSupported(extension); } bool hasDesktopExtension(const DeviceFeatureSet& dfs, const char* extension) { return !DeviceFeatureSet::usesOpenGLES() && dfs.isSupported(extension); } bool hasDesktopOrESVersion(const DeviceFeatureSet& dfs, GLVersion minDesktopSupportedVersion, GLVersion minESSupportedVersion) { return hasDesktopVersion(dfs, minDesktopSupportedVersion) || hasESVersion(dfs, minESSupportedVersion); } bool hasDesktopVersionOrExtension(const DeviceFeatureSet& dfs, GLVersion minSupportedVersion, const char* extension) { return hasVersionOrExtension(dfs, false, minSupportedVersion, extension); } bool hasESVersionOrExtension(const DeviceFeatureSet& dfs, GLVersion minSupportedVersion, const char* extension) { return hasVersionOrExtension(dfs, true, minSupportedVersion, extension); } bool hasDesktopOrESVersionOrExtension(const DeviceFeatureSet& dfs, GLVersion minDesktopSupportedVersion, GLVersion minESSupportedVersion, const char* desktopExtension, const char* esExtension) { return hasDesktopVersionOrExtension(dfs, minDesktopSupportedVersion, desktopExtension) || hasESVersionOrExtension(dfs, minESSupportedVersion, esExtension); } bool hasDesktopOrESVersionOrExtension(const DeviceFeatureSet& dfs, GLVersion minDesktopSupportedVersion, GLVersion minESSupportedVersion, const char* extension) { return hasDesktopOrESVersionOrExtension( dfs, minDesktopSupportedVersion, minESSupportedVersion, extension, extension); } bool hasDesktopOrESExtension(const DeviceFeatureSet& dfs, const char* desktopExtension, const char* esExtension) { return (!DeviceFeatureSet::usesOpenGLES() && dfs.isSupported(desktopExtension)) || (DeviceFeatureSet::usesOpenGLES() && dfs.isSupported(esExtension)); } bool hasDesktopOrESExtension(const DeviceFeatureSet& dfs, const char* extension) { return hasDesktopOrESExtension(dfs, extension, extension); } } // namespace bool DeviceFeatureSet::usesOpenGLES() noexcept { #if IGL_OPENGL_ES return true; #else return false; #endif } DeviceFeatureSet::DeviceFeatureSet(IContext& glContext) : glContext_(glContext) {} void DeviceFeatureSet::initializeVersion(GLVersion version) { version_ = version; } void DeviceFeatureSet::initializeExtensions(std::string extensions, std::unordered_set supportedExtensions) { extensions_ = std::move(extensions); supportedExtensions_ = std::move(supportedExtensions); } GLVersion DeviceFeatureSet::getGLVersion() const noexcept { return version_; } ShaderVersion DeviceFeatureSet::getShaderVersion() const { return ::igl::opengl::getShaderVersion(version_); } BackendVersion DeviceFeatureSet::getBackendVersion() const { switch (version_) { case GLVersion::v1_1: return {.flavor = BackendFlavor::OpenGL, .majorVersion = 1, .minorVersion = 1}; case GLVersion::v2_0: return {.flavor = BackendFlavor::OpenGL, .majorVersion = 2, .minorVersion = 0}; case GLVersion::v2_1: return {.flavor = BackendFlavor::OpenGL, .majorVersion = 2, .minorVersion = 1}; case GLVersion::v3_0: return {.flavor = BackendFlavor::OpenGL, .majorVersion = 3, .minorVersion = 0}; case GLVersion::v3_1: return {.flavor = BackendFlavor::OpenGL, .majorVersion = 3, .minorVersion = 1}; case GLVersion::v3_2: return {.flavor = BackendFlavor::OpenGL, .majorVersion = 3, .minorVersion = 2}; case GLVersion::v3_3: return {.flavor = BackendFlavor::OpenGL, .majorVersion = 3, .minorVersion = 3}; case GLVersion::v4_0: return {.flavor = BackendFlavor::OpenGL, .majorVersion = 4, .minorVersion = 0}; case GLVersion::v4_1: return {.flavor = BackendFlavor::OpenGL, .majorVersion = 4, .minorVersion = 1}; case GLVersion::v4_2: return {.flavor = BackendFlavor::OpenGL, .majorVersion = 4, .minorVersion = 2}; case GLVersion::v4_3: return {.flavor = BackendFlavor::OpenGL, .majorVersion = 4, .minorVersion = 3}; case GLVersion::v4_4: return {.flavor = BackendFlavor::OpenGL, .majorVersion = 4, .minorVersion = 4}; case GLVersion::v4_5: return {.flavor = BackendFlavor::OpenGL, .majorVersion = 4, .minorVersion = 5}; case GLVersion::v4_6: return {.flavor = BackendFlavor::OpenGL, .majorVersion = 4, .minorVersion = 6}; case GLVersion::v2_0_ES: return {.flavor = BackendFlavor::OpenGL_ES, .majorVersion = 2, .minorVersion = 0}; case GLVersion::v3_0_ES: return {.flavor = BackendFlavor::OpenGL_ES, .majorVersion = 3, .minorVersion = 0}; case GLVersion::v3_1_ES: return {.flavor = BackendFlavor::OpenGL_ES, .majorVersion = 3, .minorVersion = 1}; case GLVersion::v3_2_ES: return {.flavor = BackendFlavor::OpenGL_ES, .majorVersion = 3, .minorVersion = 2}; case GLVersion::NotAvailable: IGL_DEBUG_ASSERT_NOT_REACHED(); return {.flavor = usesOpenGLES() ? BackendFlavor::OpenGL_ES : BackendFlavor::OpenGL, .majorVersion = 2, .minorVersion = 0}; } IGL_UNREACHABLE_RETURN({}); } bool DeviceFeatureSet::isSupported(const std::string& extensionName) const { if (!extensions_.empty()) { return extensions_.find(extensionName) != std::string::npos; } else { return supportedExtensions_.find(extensionName) != supportedExtensions_.end(); } } bool DeviceFeatureSet::isExtensionSupported(Extensions extension) const { switch (extension) { case Extensions::AppleRgb422: return hasDesktopOrESExtension(*this, "GL_APPLE_rgb_422"); case Extensions::BindlessTextureArb: return hasDesktopExtension(*this, "GL_ARB_bindless_texture"); case Extensions::BindlessTextureNv: return hasDesktopOrESExtension(*this, "GL_NV_bindless_texture"); case Extensions::Debug: return hasDesktopOrESExtension(*this, "GL_KHR_debug"); case Extensions::DebugLabel: return hasDesktopOrESExtension(*this, "GL_EXT_debug_label"); case Extensions::DebugMarker: return hasDesktopOrESExtension(*this, "GL_EXT_debug_marker"); case Extensions::Depth24: return hasESExtension(*this, "GL_OES_depth24"); case Extensions::Depth32: return hasESExtension(*this, "GL_OES_depth32"); case Extensions::DepthTexture: return hasESExtension(*this, "GL_OES_depth_texture"); case Extensions::DiscardFramebuffer: return hasESExtension(*this, "GL_EXT_discard_framebuffer"); case Extensions::DrawBuffers: return hasESExtension(*this, "GL_EXT_draw_buffers"); case Extensions::Es2Compatibility: return hasDesktopExtension(*this, "GL_ARB_ES2_compatibility"); case Extensions::FramebufferBlit: return hasDesktopExtension(*this, "GL_EXT_framebuffer_blit"); case Extensions::FramebufferObject: return hasDesktopExtension(*this, "GL_ARB_framebuffer_object"); case Extensions::InvalidateSubdata: return isSupported("GL_ARB_invalidate_subdata"); case Extensions::MapBuffer: return hasESExtension(*this, "GL_OES_mapbuffer"); case Extensions::MapBufferRange: return hasESExtension(*this, "GL_EXT_map_buffer_range"); case Extensions::MultiSampleApple: return hasESExtension(*this, "GL_APPLE_framebuffer_multisample"); case Extensions::MultiSampleExt: return hasESExtension(*this, "GL_EXT_multisampled_render_to_texture"); case Extensions::MultiSampleImg: return hasESExtension(*this, "GL_IMG_multisampled_render_to_texture"); case Extensions::MultiViewMultiSample: return hasESExtension(*this, "GL_OVR_multiview_multisampled_render_to_texture"); case Extensions::PolygonOffsetClamp: return hasDesktopOrESExtension(*this, "GL_ARB_polygon_offset_clamp"); case Extensions::RequiredInternalFormat: return hasESExtension(*this, "GL_OES_required_internalformat"); case Extensions::ShaderImageLoadStore: return hasESExtension(*this, "GL_EXT_shader_image_load_store"); case Extensions::Srgb: return hasESExtension(*this, "GL_EXT_sRGB"); case Extensions::SrgbWriteControl: return hasESExtension(*this, "GL_EXT_sRGB_write_control"); case Extensions::Sync: return hasESExtension(*this, "GL_APPLE_sync"); case Extensions::TexStorage: return isSupported("GL_EXT_texture_storage"); case Extensions::Texture3D: return hasESExtension(*this, "GL_OES_texture_3D"); case Extensions::TextureFormatBgra8888Ext: return hasESExtension(*this, "GL_EXT_texture_format_BGRA8888"); case Extensions::TextureFormatBgra8888Apple: return hasESExtension(*this, "GL_APPLE_texture_format_BGRA8888"); case Extensions::TextureFloat: return hasDesktopExtension(*this, "GL_ARB_texture_float"); case Extensions::TextureHalfFloat: // Necessary for GL_HALF_FLOAT_OES, which is different than GL_HALF_FLOAT return hasESExtension(*this, "GL_OES_texture_half_float"); case Extensions::TextureRgArb: return hasDesktopExtension(*this, "GL_ARB_texture_rg"); case Extensions::TextureRgExt: return hasESExtension(*this, "GL_EXT_texture_rg"); case Extensions::TextureSrgb: return hasDesktopExtension(*this, "GL_EXT_texture_sRGB"); case Extensions::TextureType2101010Rev: return hasESExtension(*this, "GL_EXT_texture_type_2_10_10_10_REV"); case Extensions::TimerQuery: return hasDesktopOrESExtension(*this, "GL_ARB_timer_query", "GL_EXT_disjoint_timer_query"); case Extensions::VertexArrayObject: return hasESExtension(*this, "GL_OES_vertex_array_object"); case Extensions::VertexAttribDivisor: return hasESExtension(*this, "GL_NV_instanced_arrays"); } IGL_UNREACHABLE_RETURN(false) } bool DeviceFeatureSet::isFeatureSupported(DeviceFeatures feature) const { switch (feature) { case DeviceFeatures::CopyBuffer: return false; case DeviceFeatures::MultiSample: return hasDesktopVersion(*this, GLVersion::v3_0) || hasExtension(Extensions::FramebufferObject) || hasESVersion(*this, GLVersion::v3_0_ES) || hasExtension(Extensions::MultiSampleApple) || hasExtension(Extensions::MultiSampleExt) || hasExtension(Extensions::MultiSampleImg); case DeviceFeatures::MultiSampleResolve: return false; case DeviceFeatures::TextureFilterAnisotropic: return hasDesktopVersion(*this, GLVersion::v4_6) || hasDesktopOrESExtension(*this, "GL_EXT_texture_filter_anisotropic") || hasDesktopExtension(*this, "GL_ARB_texture_filter_anisotropic"); case DeviceFeatures::MapBufferRange: return hasDesktopOrESVersion(*this, GLVersion::v3_0, GLVersion::v3_0_ES) || hasDesktopExtension(*this, "GL_ARB_map_buffer_range") || hasExtension(Extensions::MapBufferRange); case DeviceFeatures::MeshShaders: return false; case DeviceFeatures::MultipleRenderTargets: return hasDesktopOrESVersionOrExtension( *this, GLVersion::v2_0, GLVersion::v3_0_ES, "GL_EXT_draw_buffers"); case DeviceFeatures::StandardDerivative: return hasDesktopOrESVersionOrExtension( *this, GLVersion::v2_0, GLVersion::v3_0_ES, "GL_OES_standard_derivatives"); case DeviceFeatures::StandardDerivativeExt: return hasESExtension(*this, "GL_OES_standard_derivatives"); case DeviceFeatures::TextureFormatRG: return hasDesktopOrESVersion(*this, GLVersion::v3_0, GLVersion::v3_0_ES) || hasExtension(Extensions::TextureRgArb) || hasExtension(Extensions::TextureRgExt); case DeviceFeatures::TextureFormatRGB: return true; case DeviceFeatures::ReadWriteFramebuffer: return hasDesktopOrESVersion(*this, GLVersion::v3_0, GLVersion::v3_0_ES) || hasExtension(Extensions::FramebufferObject) || hasESExtension(*this, "GL_APPLE_framebuffer_multisample"); case DeviceFeatures::TextureNotPot: return hasDesktopOrESVersionOrExtension( *this, GLVersion::v2_0, GLVersion::v3_0_ES, "GL_OES_texture_npot"); case DeviceFeatures::UniformBlocks: return hasDesktopOrESVersionOrExtension( *this, GLVersion::v3_1, GLVersion::v3_0_ES, "GL_ARB_uniform_buffer_object"); case DeviceFeatures::TextureHalfFloat: return hasDesktopOrESVersion(*this, GLVersion::v3_0, GLVersion::v3_0_ES) || hasExtension(Extensions::TextureFloat) || hasExtension(Extensions::TextureHalfFloat); case DeviceFeatures::TextureFloat: return hasDesktopOrESVersion(*this, GLVersion::v3_0, GLVersion::v3_0_ES) || hasExtension(Extensions::TextureFloat) || hasESExtension(*this, "GL_OES_texture_float"); case DeviceFeatures::Texture2DArray: return (hasDesktopOrESVersionOrExtension( *this, GLVersion::v3_0, GLVersion::v3_0_ES, "GL_EXT_texture_array") || hasDesktopExtension(*this, "GL_EXT_gpu_shader4")); case DeviceFeatures::Texture3D: return hasDesktopOrESVersionOrExtension( *this, GLVersion::v2_0, GLVersion::v3_0_ES, "GL_OES_texture_3D"); case DeviceFeatures::TextureArrayExt: return hasDesktopExtension(*this, "GL_EXT_texture_array") || hasDesktopExtension(*this, "GL_EXT_gpu_shader4"); case DeviceFeatures::ShaderTextureLod: return hasDesktopOrESVersionOrExtension(*this, GLVersion::v3_0, GLVersion::v3_0_ES, "GL_ARB_shader_texture_lod", "GL_EXT_shader_texture_lod"); case DeviceFeatures::ShaderTextureLodExt: return hasDesktopOrESExtension(*this, "GL_ARB_shader_texture_lod", "GL_EXT_shader_texture_lod"); case DeviceFeatures::DepthShaderRead: // Currently it is unclear if Depth Shader Read is the same as ARB_depth_texture extension so // we are using v2.1 because we know it works on the Mac. return hasDesktopOrESVersion(*this, GLVersion::v2_1, GLVersion::v3_0_ES); case DeviceFeatures::DepthCompare: return hasDesktopOrESVersion(*this, GLVersion::v2_0, GLVersion::v3_0_ES); case DeviceFeatures::MinMaxBlend: return hasDesktopOrESVersionOrExtension( *this, GLVersion::v2_0, GLVersion::v3_0_ES, "GL_EXT_blend_minmax"); case DeviceFeatures::TextureExternalImage: return hasESVersionOrExtension(*this, GLVersion::v3_0_ES, "GL_OES_EGL_image_external_essl3") || hasESExtension(*this, "GL_OES_EGL_image_external"); case DeviceFeatures::Compute: return hasDesktopOrESVersion(*this, GLVersion::v4_3, GLVersion::v3_1_ES) || (hasDesktopExtension(*this, "GL_ARB_compute_shader") && hasInternalFeature(InternalFeatures::ProgramInterfaceQuery) && hasInternalFeature(InternalFeatures::ShaderImageLoadStore)); case DeviceFeatures::TextureBindless: return hasDesktopExtension(*this, "GL_ARB_bindless_texture"); case DeviceFeatures::ExplicitBinding: return hasDesktopOrESVersionOrExtension( *this, GLVersion::v4_2, GLVersion::v3_1_ES, "GL_ARB_shading_language_420pack"); case DeviceFeatures::ExplicitBindingExt: return hasDesktopExtension(*this, "GL_ARB_shading_language_420pack"); case DeviceFeatures::ExternalMemoryObjects: return hasDesktopOrESExtension(*this, "GL_EXT_memory_object") && hasDesktopOrESExtension(*this, "GL_EXT_memory_object_fd"); case DeviceFeatures::TextureViews: return false; case DeviceFeatures::PushConstants: return false; case DeviceFeatures::BufferDeviceAddress: return false; case DeviceFeatures::Multiview: return hasDesktopOrESVersion(*this, GLVersion::v3_0, GLVersion::v3_0_ES) && isSupported("GL_OVR_multiview2"); case DeviceFeatures::MultiViewMultisample: return hasExtension(Extensions::MultiViewMultiSample); case DeviceFeatures::TexturePartialMipChain: return hasDesktopOrESVersion(*this, GLVersion::v2_0, GLVersion::v3_0_ES) || hasESExtension(*this, "GL_APPLE_texture_max_level"); case DeviceFeatures::BindUniform: return true; case DeviceFeatures::BufferRing: return false; case DeviceFeatures::BufferNoCopy: return false; case DeviceFeatures::ShaderLibrary: return false; case DeviceFeatures::StorageBuffers: return hasDesktopOrESVersion(*this, GLVersion::v4_3, GLVersion::v3_1_ES) || hasDesktopExtension(*this, "GL_ARB_shader_storage_buffer_object"); case DeviceFeatures::BindBytes: return false; case DeviceFeatures::SRGB: return hasDesktopOrESVersionOrExtension( *this, GLVersion::v2_1, GLVersion::v3_0_ES, "GL_EXT_texture_sRGB", "GL_EXT_sRGB"); case DeviceFeatures::SRGBSwapchain: return glContext_.eglSupportssRGB() && hasFeature(DeviceFeatures::SRGB); case DeviceFeatures::SRGBWriteControl: return hasDesktopVersion(*this, GLVersion::v3_0) || hasDesktopExtension(*this, "GL_ARB_framebuffer_sRGB") || hasDesktopExtension(*this, "GL_EXT_framebuffer_sRGB") || hasESExtension(*this, "GL_EXT_sRGB_write_control"); case DeviceFeatures::SamplerMinMaxLod: return hasDesktopOrESVersion(*this, GLVersion::v2_0, GLVersion::v3_0_ES); case DeviceFeatures::DrawFirstIndexFirstVertex: // https://registry.khronos.org/OpenGL-Refpages/es3/html/glDrawElementsInstancedBaseVertex.xhtml return hasDesktopOrESVersion(*this, GLVersion::v4_0, GLVersion::v3_2_ES); case DeviceFeatures::DrawIndexedIndirect: return hasDesktopOrESVersionOrExtension( *this, GLVersion::v4_0, GLVersion::v3_1_ES, "GL_ARB_draw_indirect"); case DeviceFeatures::DrawInstanced: return hasDesktopOrESVersionOrExtension( *this, GLVersion::v3_1, GLVersion::v3_0_ES, "GL_ARB_draw_indirect"); case DeviceFeatures::ValidationLayersEnabled: return false; case DeviceFeatures::Indices8Bit: return true; case DeviceFeatures::TimestampQueries: return hasExtension(Extensions::TimerQuery); case DeviceFeatures::Timers: return hasExtension(Extensions::TimerQuery); } return false; } bool DeviceFeatureSet::isInternalFeatureSupported(InternalFeatures feature) const { switch (feature) { case InternalFeatures::ClearBufferfv: return hasDesktopOrESVersion(*this, GLVersion::v3_0, GLVersion::v3_0_ES); case InternalFeatures::ClearDepthf: return hasDesktopOrESVersion(*this, GLVersion::v4_1, GLVersion::v2_0_ES); case InternalFeatures::DebugLabel: return hasDesktopOrESVersion(*this, GLVersion::v4_3, GLVersion::v3_2_ES) || hasExtension(Extensions::Debug) || hasExtension(Extensions::DebugLabel); case InternalFeatures::DebugMessage: return hasDesktopOrESVersion(*this, GLVersion::v4_3, GLVersion::v3_2_ES) || hasExtension(Extensions::Debug) || hasExtension(Extensions::DebugMarker); case InternalFeatures::DebugMessageCallback: return hasDesktopOrESVersion(*this, GLVersion::v4_3, GLVersion::v3_2_ES) || hasExtension(Extensions::Debug); case InternalFeatures::DrawArraysIndirect: return hasDesktopOrESVersionOrExtension( *this, GLVersion::v4_0, GLVersion::v3_1_ES, "GL_ARB_draw_indirect"); case InternalFeatures::MultiDrawIndirect: return hasDesktopVersionOrExtension(*this, GLVersion::v4_3, "GL_ARB_multi_draw_indirect") || hasESExtension(*this, "GL_EXT_multi_draw_indirect"); case InternalFeatures::FramebufferBlit: // TODO: Add support for GL_ANGLE_framebuffer_blit return hasDesktopOrESVersionOrExtension( *this, GLVersion::v3_0, GLVersion::v3_0_ES, "GL_EXT_framebuffer_blit") || hasExtension(Extensions::FramebufferObject); case InternalFeatures::FramebufferObject: return hasDesktopOrESVersion(*this, GLVersion::v3_0, GLVersion::v2_0_ES) || hasExtension(Extensions::FramebufferObject); case InternalFeatures::GetStringi: return hasDesktopOrESVersion(*this, GLVersion::v3_0, GLVersion::v3_0_ES); case InternalFeatures::InvalidateFramebuffer: return hasDesktopOrESVersion(*this, GLVersion::v4_3, GLVersion::v3_0_ES) || hasExtension(Extensions::InvalidateSubdata) || hasExtension(Extensions::DiscardFramebuffer); case InternalFeatures::MapBuffer: return hasDesktopVersion(*this, GLVersion::v2_0) || hasExtension(Extensions::MapBuffer); case InternalFeatures::PackRowLength: return hasDesktopOrESVersion(*this, GLVersion::v2_0, GLVersion::v3_0_ES); case InternalFeatures::PixelBufferObject: return hasDesktopOrESVersionOrExtension(*this, GLVersion::v2_1, GLVersion::v3_0_ES, "GL_ARB_pixel_buffer_object", "GL_NV_pixel_buffer_object"); case InternalFeatures::PolygonFillMode: return hasDesktopVersion(*this, GLVersion::v2_0); case InternalFeatures::ProgramInterfaceQuery: return hasDesktopOrESVersion(*this, GLVersion::v4_3, GLVersion::v3_1_ES) || hasDesktopExtension(*this, "GL_ARB_program_interface_query"); case InternalFeatures::SeamlessCubeMap: return hasDesktopVersionOrExtension(*this, GLVersion::v3_2, "GL_ARB_seamless_cube_map"); case InternalFeatures::Sync: return hasDesktopOrESVersion(*this, GLVersion::v3_2, GLVersion::v3_0_ES) || hasDesktopExtension(*this, "GL_ARB_sync") || hasExtension(Extensions::Sync); case InternalFeatures::TexStorage: return hasDesktopOrESVersionOrExtension( *this, GLVersion::v4_2, GLVersion::v3_0_ES, "GL_ARB_texture_storage") || hasExtension(Extensions::TexStorage); case InternalFeatures::ShaderImageLoadStore: return hasDesktopOrESVersion(*this, GLVersion::v4_2, GLVersion::v3_1_ES) || hasDesktopExtension(*this, "GL_ARB_shader_image_load_store") || hasExtension(Extensions::ShaderImageLoadStore); case InternalFeatures::TextureCompare: return hasDesktopOrESVersion(*this, GLVersion::v2_0, GLVersion::v3_0_ES) || hasESExtension(*this, "GL_EXT_shadow_samplers"); case InternalFeatures::UnmapBuffer: return hasDesktopOrESVersion(*this, GLVersion::v2_0, GLVersion::v3_0_ES) || hasExtension(Extensions::MapBuffer) || hasExtension(Extensions::MapBufferRange); case InternalFeatures::UnpackRowLength: return hasDesktopOrESVersion(*this, GLVersion::v2_0, GLVersion::v3_0_ES) || hasESExtension(*this, "GL_EXT_unpack_subimage"); case InternalFeatures::VertexArrayObject: // We've had issues with VertexArrayObject support on mobile so this is disabled for OpenGL ES. // Previously it was enabled specifically for Quest 2 on OpenGLES by checking if // GL_VENDOR == "Qualcomm" and GL_RENDERER == "Adreno (TM) 650". // However, Galaxy S20 also matched that and VAO support caused issues. // @fb-only // @fb-only return hasDesktopVersionOrExtension(*this, GLVersion::v3_0, "GL_ARB_vertex_array_object"); case InternalFeatures::VertexAttribDivisor: return hasDesktopOrESVersion(*this, GLVersion::v3_3, GLVersion::v3_0_ES) || hasExtension(Extensions::VertexAttribDivisor); } return false; } bool DeviceFeatureSet::isTextureFeatureSupported(TextureFeatures feature) const { switch (feature) { case TextureFeatures::ColorFilterable16f: return hasDesktopOrESVersion(*this, GLVersion::v2_0, GLVersion::v3_0_ES) || hasExtension(Extensions::TextureFloat) || hasESExtension(*this, "GL_OES_texture_half_float_linear"); case TextureFeatures::ColorFilterable32f: return hasDesktopVersion(*this, GLVersion::v3_0) || hasExtension(Extensions::TextureFloat) || hasESExtension(*this, "GL_OES_texture_float_linear"); case TextureFeatures::ColorFormatRgb10A2UI: return hasDesktopOrESVersionOrExtension( *this, GLVersion::v4_0, GLVersion::v3_0_ES, "GL_ARB_texture_rgb10_a2ui"); case TextureFeatures::ColorFormatRgInt: return hasDesktopOrESVersion(*this, GLVersion::v3_0, GLVersion::v3_0_ES) || hasDesktopExtension(*this, "GL_ARB_texture_rg"); case TextureFeatures::ColorFormatRgUNorm16: return hasDesktopVersionOrExtension(*this, GLVersion::v3_0, "GL_ARB_texture_rg") || hasESExtension(*this, "GL_EXT_texture_norm16"); case TextureFeatures::ColorFormatRgbaUNorm16: return hasDesktopVersion(*this, GLVersion::v3_0) || hasESExtension(*this, "GL_EXT_texture_norm16"); case TextureFeatures::ColorRenderbuffer16f: return hasDesktopOrESVersionOrExtension( *this, GLVersion::v3_0, GLVersion::v3_2_ES, "GL_EXT_color_buffer_half_float") || (hasExtension(Extensions::FramebufferObject) && hasExtension(Extensions::TextureFloat)); case TextureFeatures::ColorRenderbuffer32f: return hasDesktopOrESVersionOrExtension( *this, GLVersion::v3_0, GLVersion::v3_2_ES, "GL_EXT_color_buffer_float") || (hasExtension(Extensions::FramebufferObject) && hasExtension(Extensions::TextureFloat)); case TextureFeatures::ColorRenderbufferRg16f: return hasDesktopOrESVersion(*this, GLVersion::v3_0, GLVersion::v3_2_ES) || hasESExtension(*this, "GL_EXT_color_buffer_float") || hasESExtension(*this, "GL_EXT_color_buffer_half_float"); case TextureFeatures::ColorRenderbufferRg32f: return hasDesktopOrESVersion(*this, GLVersion::v3_0, GLVersion::v3_2_ES) || hasESExtension(*this, "GL_EXT_color_buffer_float"); case TextureFeatures::ColorRenderbufferRg8: return hasDesktopOrESVersion(*this, GLVersion::v3_0, GLVersion::v3_0_ES) || (hasExtension(Extensions::FramebufferObject) && hasExtension(Extensions::TextureRgArb)) || hasExtension(Extensions::TextureRgExt); case TextureFeatures::ColorRenderbufferRgb10A2: return hasDesktopOrESVersion(*this, GLVersion::v3_0, GLVersion::v3_0_ES) || hasExtension(Extensions::RequiredInternalFormat); case TextureFeatures::ColorRenderbufferRgb16f: return hasESExtension(*this, "GL_EXT_color_buffer_half_float"); case TextureFeatures::ColorRenderbufferRgba8: return hasDesktopOrESVersionOrExtension( *this, GLVersion::v3_0, GLVersion::v3_0_ES, "GL_OES_rgb8_rgba8") || hasExtension(Extensions::FramebufferObject) || hasExtension(Extensions::RequiredInternalFormat); case TextureFeatures::ColorRenderbufferSrgba8: return hasDesktopOrESVersion(*this, GLVersion::v2_1, GLVersion::v3_0_ES) || hasExtension(Extensions::Srgb); case TextureFeatures::ColorTexImage16f: return hasDesktopOrESVersion(*this, GLVersion::v3_0, GLVersion::v3_0_ES) || hasExtension(Extensions::TextureFloat); case TextureFeatures::ColorTexImage32f: return hasDesktopOrESVersion(*this, GLVersion::v3_0, GLVersion::v3_0_ES) || hasExtension(Extensions::TextureFloat); case TextureFeatures::ColorTexImageA8: // Sized alpha texture were available on Desktop OpenGL prior to deprecation in // Version 3.0. For later versions of OpenGL, we create GL_R8 textures and use texture // swizzling. Sized alpha textures are only available on OpenGL ES through extensions. return (hasDesktopVersion(*this, GLVersion::v2_0) && !hasDesktopVersion(*this, GLVersion::v3_0)) || (hasDesktopVersion(*this, GLVersion::v3_0) && hasTextureFeature(TextureFeatures::ColorTexImageRg8)) || hasExtension(Extensions::RequiredInternalFormat); case TextureFeatures::ColorTexImageBgr10A2: return hasDesktopVersion(*this, GLVersion::v2_0); case TextureFeatures::ColorTexImageBgr5A1: // There's no OpenGL ES extension that specifically enables support for this, but Apple // platforms support it. return !usesOpenGLES() || hasExtension(Extensions::TextureFormatBgra8888Apple); case TextureFeatures::ColorTexImageBgra: return !usesOpenGLES() || hasExtension(Extensions::TextureFormatBgra8888Ext) || hasExtension(Extensions::TextureFormatBgra8888Apple); case TextureFeatures::ColorTexImageBgraRgba8: return hasDesktopVersion(*this, GLVersion::v2_0); case TextureFeatures::ColorTexImageBgraSrgba: // There's no OpenGL ES extension that specifically enables support for this, but Apple // platforms support it. return !usesOpenGLES() || (hasESVersion(*this, GLVersion::v3_0_ES) && hasExtension(Extensions::TextureFormatBgra8888Apple)); case TextureFeatures::ColorTexImageLa: // LUMINANCE and LUMINANCE_ALPHA were deprecated in Desktop OpenGL 3.0, and we don't use any // work arounds for support after that. return !hasDesktopVersion(*this, GLVersion::v3_0); case TextureFeatures::ColorTexImageLa8: // Sized luminance and luminance alpha texture were available on Desktop OpenGL prior to // deprecation in Version 3.0. Sized luminance alpha textures are only available on OpenGL ES // through extensions. return (hasDesktopVersion(*this, GLVersion::v2_0) && !hasDesktopVersion(*this, GLVersion::v3_0)) || hasExtension(Extensions::RequiredInternalFormat); case TextureFeatures::ColorTexImageRg8: return hasDesktopOrESVersion(*this, GLVersion::v2_0, GLVersion::v3_0_ES) || hasExtension(Extensions::TextureRgArb); case TextureFeatures::ColorTexImageRgb10A2: return hasTextureFeature(TextureFeatures::ColorRenderbufferRgb10A2) || hasExtension(Extensions::TextureType2101010Rev); case TextureFeatures::ColorTexImageRgba8: return hasDesktopOrESVersion(*this, GLVersion::v2_0, GLVersion::v3_0_ES) || hasExtension(Extensions::RequiredInternalFormat); case TextureFeatures::ColorTexImageSrgba8: return hasDesktopOrESVersion(*this, GLVersion::v2_1, GLVersion::v3_0_ES) || hasExtension(Extensions::TextureSrgb); case TextureFeatures::ColorTexStorage16f: return hasDesktopOrESVersion(*this, GLVersion::v4_2, GLVersion::v3_0_ES) || ((hasFeature(DeviceFeatures::TextureHalfFloat) || hasTextureFeature(TextureFeatures::ColorRenderbuffer16f)) && hasInternalFeature(InternalFeatures::TexStorage)); case TextureFeatures::ColorTexStorage32f: return hasDesktopOrESVersion(*this, GLVersion::v4_2, GLVersion::v3_0_ES) || ((hasFeature(DeviceFeatures::TextureFloat) || hasTextureFeature(TextureFeatures::ColorRenderbuffer32f)) && hasInternalFeature(InternalFeatures::TexStorage)); case TextureFeatures::ColorTexStorageA8: // Sized alpha texture were available on Desktop OpenGL prior to deprecation in // Version 3.0. For later versions of OpenGL, we create GL_R8 textures and use texture // swizzling. Sized alpha textures are only available on OpenGL ES through extensions. return (hasDesktopVersion(*this, GLVersion::v3_0) && hasTextureFeature(TextureFeatures::ColorTexStorageRg8)) || hasExtension(Extensions::TexStorage); case TextureFeatures::ColorTexStorageBgra8: // TexStorage is explicitly supported when available by GL_APPLE_texture_format_BGRA8888 // TexStorage for GL_EXT_texture_format_BGRA8888 is added by GL_EXT_texture_storage return (hasExtension(Extensions::TextureFormatBgra8888Apple) && (hasESVersion(*this, GLVersion::v3_0_ES) || hasInternalFeature(InternalFeatures::TexStorage))) || (hasExtension(Extensions::TextureFormatBgra8888Ext) && hasExtension(Extensions::TexStorage)); case TextureFeatures::ColorTexStorageLa8: // TexStorage with sized luminance alpha formats is only supported with GL_EXT_texture_storage return hasExtension(Extensions::TexStorage); case TextureFeatures::ColorTexStorageRg8: return hasDesktopOrESVersion(*this, GLVersion::v4_2, GLVersion::v3_0_ES) || (hasExtension(Extensions::TexStorage) && hasExtension(Extensions::TextureRgExt)); case TextureFeatures::ColorTexStorageRgb10A2: return hasDesktopOrESVersion(*this, GLVersion::v4_2, GLVersion::v3_0_ES) || (hasExtension(Extensions::TexStorage) && hasExtension(Extensions::TextureType2101010Rev)); case TextureFeatures::ColorTexStorageRgba8: return hasTextureFeature(TextureFeatures::ColorRenderbufferRgba8) && hasInternalFeature(InternalFeatures::TexStorage); case TextureFeatures::ColorTexStorageSrgba8: // NOTE: GL_EXT_texture_storage does NOT support GL_SRGB8_ALPHA8. return hasFeature(DeviceFeatures::SRGB) && hasInternalFeature(InternalFeatures::TexStorage) && !(hasInternalRequirement(InternalRequirement::TexStorageExtReq) && hasExtension(Extensions::TexStorage)); case TextureFeatures::DepthFilterable: return hasDesktopVersion(*this, GLVersion::v2_0); case TextureFeatures::DepthRenderbuffer16: return hasDesktopOrESVersion(*this, GLVersion::v3_0, GLVersion::v2_0_ES) || hasExtension(Extensions::FramebufferObject); case TextureFeatures::DepthRenderbuffer24: return hasDesktopOrESVersion(*this, GLVersion::v3_0, GLVersion::v3_0_ES) || hasExtension(Extensions::FramebufferObject) || hasExtension(Extensions::Depth24); case TextureFeatures::DepthRenderbuffer32: // 32-bit integer depth textures are only supported on ES through specific extensions. return hasDesktopVersion(*this, GLVersion::v3_0) || hasExtension(Extensions::FramebufferObject) || hasExtension(Extensions::Depth32); case TextureFeatures::Depth24Stencil8: return hasDesktopOrESVersionOrExtension(*this, GLVersion::v3_0, GLVersion::v3_0_ES, "GL_EXT_packed_depth_stencil", "GL_OES_packed_depth_stencil") || hasExtension(Extensions::FramebufferObject); case TextureFeatures::Depth32FStencil8: return hasDesktopOrESVersionOrExtension( *this, GLVersion::v3_0, GLVersion::v3_0_ES, "GL_ARB_depth_buffer_float"); case TextureFeatures::DepthTexImage: return hasDesktopOrESVersion(*this, GLVersion::v2_0, GLVersion::v3_0_ES) || hasExtension(Extensions::DepthTexture); case TextureFeatures::DepthTexImage16: return hasDesktopOrESVersion(*this, GLVersion::v2_0, GLVersion::v3_0_ES) || (hasTextureFeature(TextureFeatures::DepthTexImage) && hasExtension(Extensions::RequiredInternalFormat)); case TextureFeatures::DepthTexImage24: return hasDesktopOrESVersion(*this, GLVersion::v2_0, GLVersion::v3_0_ES) || (hasExtension(Extensions::Depth24) && hasExtension(Extensions::RequiredInternalFormat)); case TextureFeatures::DepthTexImage32: // 32-bit integer depth textures are only supported on ES through specific extensions. return hasDesktopVersion(*this, GLVersion::v2_0) || hasExtension(Extensions::DepthTexture) || (hasExtension(Extensions::Depth32) && hasExtension(Extensions::RequiredInternalFormat)); case TextureFeatures::DepthTexStorage16: return hasDesktopOrESVersion(*this, GLVersion::v4_2, GLVersion::v3_0_ES) || (hasTextureFeature(TextureFeatures::DepthRenderbuffer16) && hasInternalFeature(InternalFeatures::TexStorage)); case TextureFeatures::DepthTexStorage24: return hasDesktopOrESVersion(*this, GLVersion::v4_2, GLVersion::v3_0_ES) || (hasTextureFeature(TextureFeatures::DepthRenderbuffer24) && hasInternalFeature(InternalFeatures::TexStorage)); case TextureFeatures::DepthTexStorage32: // 32-bit integer depth textures are only supported on ES through specific extensions. return hasDesktopVersion(*this, GLVersion::v4_2) || (hasExtension(Extensions::DepthTexture) && hasExtension(Extensions::TexStorage)); case TextureFeatures::StencilTexture8: return hasDesktopOrESVersionOrExtension(*this, GLVersion::v4_4, GLVersion::v3_2_ES, "GL_ARB_texture_stencil8", "GL_OES_texture_stencil8"); case TextureFeatures::TextureCompressionAstc: return hasESVersion(*this, GLVersion::v3_2_ES) || hasDesktopOrESExtension(*this, "GL_KHR_texture_compression_astc_hdr") || hasDesktopOrESExtension(*this, "GL_KHR_texture_compression_astc_ldr") || hasDesktopOrESExtension(*this, "GL_OES_texture_compression_astc"); case TextureFeatures::TextureCompressionBptc: return hasDesktopExtension(*this, "GL_ARB_texture_compression_bptc") || hasESExtension(*this, "GL_EXT_texture_compression_bptc") || hasDesktopVersion(*this, GLVersion::v4_2); case TextureFeatures::TextureCompressionEtc1: return hasESExtension(*this, "GL_EXT_compressed_ETC1_RGB8_sub_texture") || hasESExtension(*this, "GL_OES_compressed_ETC1_RGB8_texture"); case TextureFeatures::TextureCompressionEtc2Eac: return hasDesktopOrESVersion(*this, GLVersion::v4_3, GLVersion::v3_0_ES) || hasDesktopExtension(*this, "GL_ARB_ES3_compatibility"); case TextureFeatures::TextureCompressionPvrtc: return hasESExtension(*this, "GL_IMG_texture_compression_pvrtc"); case TextureFeatures::TextureCompressionTexImage: // On Desktop GL, TexImage can be used to initialize a compressed texture. // On OpenGL ES, TexImage CANNOT be used. return !usesOpenGLES(); case TextureFeatures::TextureCompressionTexStorage: // On Desktop GL, TexStorage CANNOT be used to initialize a compressed texture. // On OpenGL ES, TexStorage can be used if it is available. return usesOpenGLES() && hasInternalFeature(InternalFeatures::TexStorage); case TextureFeatures::TextureInteger: return hasDesktopOrESVersion(*this, GLVersion::v3_0, GLVersion::v3_0_ES) || hasDesktopExtension(*this, "GL_EXT_texture_integer"); case TextureFeatures::TextureTypeUInt8888Rev: return hasDesktopVersion(*this, GLVersion::v2_0); } return false; } bool DeviceFeatureSet::hasExtension(Extensions extension) const { const uint64_t extensionIndex = static_cast(extension); IGL_DEBUG_ASSERT(extensionIndex < 64); const uint64_t extensionBit = 1ull << extensionIndex; if ((extensionCacheInitialized_ & extensionBit) == 0) { if (isExtensionSupported(extension)) { extensionCache_ |= extensionBit; } extensionCacheInitialized_ |= extensionBit; } return (extensionCache_ & extensionBit) != 0; } bool DeviceFeatureSet::hasFeature(DeviceFeatures feature) const { const uint64_t featureIndex = static_cast(feature); IGL_DEBUG_ASSERT(featureIndex < 64); const uint64_t featureBit = 1ull << featureIndex; if ((featureCacheInitialized_ & featureBit) == 0) { if (isFeatureSupported(feature)) { featureCache_ |= featureBit; } featureCacheInitialized_ |= featureBit; } return (featureCache_ & featureBit) != 0; } bool DeviceFeatureSet::hasInternalFeature(InternalFeatures feature) const { const uint32_t featureIndex = static_cast(feature); IGL_DEBUG_ASSERT(featureIndex < 32); const uint32_t featureBit = 1u << featureIndex; if ((internalFeatureCacheInitialized_ & featureBit) == 0) { if (isInternalFeatureSupported(feature)) { internalFeatureCache_ |= featureBit; } internalFeatureCacheInitialized_ |= featureBit; } return (internalFeatureCache_ & featureBit) != 0; } bool DeviceFeatureSet::hasTextureFeature(TextureFeatures feature) const { const uint64_t featureIndex = static_cast(feature); IGL_DEBUG_ASSERT(featureIndex < 64); const uint64_t featureBit = 1ull << featureIndex; if ((textureFeatureCacheInitialized_ & featureBit) == 0) { if (isTextureFeatureSupported(feature)) { textureFeatureCache_ |= featureBit; } textureFeatureCacheInitialized_ |= featureBit; } return (textureFeatureCache_ & featureBit) != 0; } bool DeviceFeatureSet::hasRequirement(DeviceRequirement requirement) const { switch (requirement) { case DeviceRequirement::ExplicitBindingExtReq: return !usesOpenGLES() && !hasDesktopVersion(*this, GLVersion::v4_2); case DeviceRequirement::StandardDerivativeExtReq: // https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/fwidth.xhtml // On desktop GL derivatives were supported from 2.0 // no need for extension // GL_OES_standard_derivatives extension required only for versions prior to ES 3.0 // @fb-only // @fb-only // @fb-only // @fb-only return usesOpenGLES() && !hasESVersion(*this, GLVersion::v3_0_ES); case DeviceRequirement::TextureArrayExtReq: // Array textures were introduced in OpenGL 3.0. Before OpenGL 3.0, they can be supported via // `GL_EXT_texture_array` return !usesOpenGLES() && !hasDesktopVersion(*this, GLVersion::v3_0); case DeviceRequirement::TextureFormatRGExtReq: // If we are running in on a platform that supports OpenGL ES 3.0 (which has GL_RED/GL_RG) // we can check if our context is using ES 3.0, otherwise fall back to `GL_EXT_texture_rg` return usesOpenGLES() && !hasESVersion(*this, GLVersion::v3_0_ES); case DeviceRequirement::ShaderTextureLodExtReq: // Desktop GL // https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/textureLod.xhtml // textureLod() was introduced in GLSL 1.3 (which corresponds to OpenGL 3.0) // So if we are running on anything lower than OpenGL 3.0, we will need the extension // GL_EXT_shader_texture_lod extension required only for versions prior to ES 3.0 // @fb-only // @fb-only // @fb-only // @fb-only return !hasDesktopOrESVersion(*this, GLVersion::v3_0, GLVersion::v3_0_ES); } return false; } bool DeviceFeatureSet::hasInternalRequirement(InternalRequirement requirement) const { switch (requirement) { case InternalRequirement::ColorTexImageRgb5A1Unsized: return usesOpenGLES() && !hasESVersion(*this, GLVersion::v3_0_ES); case InternalRequirement::ColorTexImageRgb10A2Unsized: return !hasTextureFeature(TextureFeatures::ColorRenderbufferRgb10A2) && hasExtension(Extensions::TextureType2101010Rev); case InternalRequirement::ColorTexImageRgba4Unsized: return usesOpenGLES() && !hasESVersion(*this, GLVersion::v3_0_ES) && !hasExtension(Extensions::RequiredInternalFormat); case InternalRequirement::ColorTexImageRgbApple422Unsized: return usesOpenGLES() && !hasESVersion(*this, GLVersion::v3_0_ES); case InternalRequirement::DebugMessageExtReq: return !hasDesktopOrESVersion(*this, GLVersion::v4_3, GLVersion::v3_2_ES); case InternalRequirement::DebugMessageCallbackExtReq: return !hasDesktopOrESVersion(*this, GLVersion::v4_3, GLVersion::v3_2_ES); case InternalRequirement::DebugLabelExtEnumsReq: // GL_EXT_debug_label requires extension-specific enums for some object types return hasInternalRequirement(InternalRequirement::DebugLabelExtReq) && !hasExtension(Extensions::Debug); case InternalRequirement::DebugLabelExtReq: return !hasDesktopOrESVersion(*this, GLVersion::v4_3, GLVersion::v3_2_ES); case InternalRequirement::DrawBuffersExtReq: return usesOpenGLES() && !hasESVersion(*this, GLVersion::v3_0_ES); case InternalRequirement::Depth24Stencil8Unsized: return usesOpenGLES() && !hasESVersion(*this, GLVersion::v3_0_ES); case InternalRequirement::Depth32Unsized: return hasExtension(Extensions::DepthTexture); case InternalRequirement::FramebufferBlitExtReq: // GL_ARB_framebuffer_object also includes glBlitFramebuffer so no need to use // BlitFramebufferEXT if it is present. return !hasDesktopOrESVersion(*this, GLVersion::v3_0, GLVersion::v3_0_ES) && !hasExtension(Extensions::FramebufferObject); case InternalRequirement::InvalidateFramebufferExtReq: return !hasDesktopOrESVersion(*this, GLVersion::v4_3, GLVersion::v3_0_ES) && !hasExtension(Extensions::InvalidateSubdata); case InternalRequirement::MapBufferExtReq: // OpenGL ES does not include MapBuffer return usesOpenGLES(); case InternalRequirement::MapBufferRangeExtReq: // OpenGL ES 2 does not include MapBufferRange return usesOpenGLES() && !hasESVersion(*this, GLVersion::v3_0_ES); case InternalRequirement::MultiSampleExtReq: // OpenGL ES has various extensions before 3.0 that are required, and // GL_IMG_multisampled_render_to_texture uses different enum values than later standard // versions. return !(hasDesktopVersion(*this, GLVersion::v3_0) || hasExtension(Extensions::FramebufferObject) || hasESVersion(*this, GLVersion::v3_0_ES)); case InternalRequirement::ShaderImageLoadStoreExtReq: return !usesOpenGLES() && !hasDesktopVersion(*this, GLVersion::v4_2); case InternalRequirement::SyncExtReq: return usesOpenGLES() && !hasESVersion(*this, GLVersion::v3_0_ES); case InternalRequirement::SwizzleAlphaTexturesReq: return hasDesktopVersion(*this, GLVersion::v3_0); case InternalRequirement::TexStorageExtReq: return !hasDesktopOrESVersionOrExtension( *this, GLVersion::v4_2, GLVersion::v3_0_ES, "GL_ARB_texture_storage"); case InternalRequirement::Texture3DExtReq: return !hasDesktopOrESVersion(*this, GLVersion::v2_0, GLVersion::v3_0_ES); case InternalRequirement::TextureHalfFloatExtReq: // GL_OES_texture_half_float extension uses different enum values for GL_HALF_FLOAT_OES than // GL_HALF_FLOAT. return usesOpenGLES() && !hasESVersion(*this, GLVersion::v3_0_ES); case InternalRequirement::UnmapBufferExtReq: // OpenGL ES 2 does not include UnmapBuffer return usesOpenGLES() && !hasESVersion(*this, GLVersion::v3_0_ES); case InternalRequirement::VertexArrayObjectExtReq: return usesOpenGLES() && !hasESVersion(*this, GLVersion::v3_0_ES); case InternalRequirement::VertexAttribDivisorExtReq: return !hasDesktopOrESVersion(*this, GLVersion::v3_3, GLVersion::v3_0_ES); } return false; } bool DeviceFeatureSet::getFeatureLimits(DeviceFeatureLimits featureLimits, size_t& result) const { GLint tsize = 0; switch (featureLimits) { case DeviceFeatureLimits::MaxTextureDimension1D2D: glContext_.getIntegerv(GL_MAX_TEXTURE_SIZE, &tsize); result = (size_t)tsize; return true; case DeviceFeatureLimits::MaxCubeMapDimension: glContext_.getIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &tsize); result = (size_t)tsize; return true; case DeviceFeatureLimits::MaxVertexUniformVectors: result = getMaxVertexUniforms(); return true; case DeviceFeatureLimits::MaxFragmentUniformVectors: result = getMaxFragmentUniforms(); return true; case DeviceFeatureLimits::MaxMultisampleCount: if (hasFeature(DeviceFeatures::MultiSample)) { if (hasInternalRequirement(InternalRequirement::MultiSampleExtReq) && hasExtension(Extensions::MultiSampleImg)) { glContext_.getIntegerv(GL_MAX_SAMPLES_IMG, &tsize); } else { // Official standards and all other extensions use the same value for GL_MAX_SAMPLES glContext_.getIntegerv(GL_MAX_SAMPLES, &tsize); } } result = (size_t)tsize; return true; case DeviceFeatureLimits::MaxPushConstantBytes: result = 0; return true; case DeviceFeatureLimits::MaxStorageBufferBytes: if (hasFeature(DeviceFeatures::StorageBuffers)) { glContext_.getIntegerv(GL_MAX_SHADER_STORAGE_BLOCK_SIZE, &tsize); } result = tsize; return true; case DeviceFeatureLimits::MaxUniformBufferBytes: if (hasFeature(DeviceFeatures::UniformBlocks)) { glContext_.getIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, &tsize); } result = (size_t)tsize; return true; case DeviceFeatureLimits::PushConstantsAlignment: result = 0; return true; case DeviceFeatureLimits::ShaderStorageBufferOffsetAlignment: tsize = 256; if (hasFeature(DeviceFeatures::StorageBuffers)) { glContext_.getIntegerv(GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT, &tsize); } result = (size_t)tsize; return true; case DeviceFeatureLimits::BufferAlignment: result = 16; if (hasFeature(DeviceFeatures::UniformBlocks)) { if (glContext_.isCurrentContext()) { glContext_.getIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &tsize); result = std::max((size_t)tsize, result); } } return true; case DeviceFeatureLimits::BufferNoCopyAlignment: result = 0; return true; case DeviceFeatureLimits::MaxBindBytesBytes: result = 0; return true; case DeviceFeatureLimits::MaxTextureDimension3D: glContext_.getIntegerv(GL_MAX_3D_TEXTURE_SIZE, &tsize); result = (size_t)tsize; return true; case DeviceFeatureLimits::MaxComputeWorkGroupSizeX: if (hasFeature(DeviceFeatures::Compute)) { // OpenGL ES 3.1+ and OpenGL 4.3+: use conservative value result = 64; } else { result = 0; } return true; case DeviceFeatureLimits::MaxComputeWorkGroupSizeY: if (hasFeature(DeviceFeatures::Compute)) { // OpenGL ES 3.1+ and OpenGL 4.3+: use conservative value result = 64; } else { result = 0; } return true; case DeviceFeatureLimits::MaxComputeWorkGroupSizeZ: if (hasFeature(DeviceFeatures::Compute)) { // OpenGL ES 3.1+ and OpenGL 4.3+: use conservative value result = 64; } else { result = 0; } return true; case DeviceFeatureLimits::MaxComputeWorkGroupInvocations: if (hasFeature(DeviceFeatures::Compute)) { #if defined(GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS) glContext_.getIntegerv(GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS, &tsize); result = (size_t)tsize; #endif } else { result = 0; } return true; // D3D12-specific descriptor heap limits - not applicable to OpenGL case DeviceFeatureLimits::MaxDescriptorHeapCbvSrvUav: case DeviceFeatureLimits::MaxDescriptorHeapSamplers: case DeviceFeatureLimits::MaxDescriptorHeapRtvs: case DeviceFeatureLimits::MaxDescriptorHeapDsvs: result = 0; return false; case DeviceFeatureLimits::MaxVertexInputAttributes: glContext_.getIntegerv(GL_MAX_VERTEX_ATTRIBS, &tsize); result = (size_t)tsize; return true; case DeviceFeatureLimits::MaxColorAttachments: glContext_.getIntegerv(GL_MAX_COLOR_ATTACHMENTS, &tsize); result = (size_t)tsize; return true; default: IGL_DEBUG_ABORT( "invalid feature limit query: feature limit query is not implemented or does " "not exist\n"); return false; } } /// /// Returns the supported capabilities of the selected format. /// @param format: The texture format to query /// @return a combination of TextureFormatCapabilities flags ICapabilities::TextureFormatCapabilities DeviceFeatureSet::getTextureFormatCapabilities( TextureFormat format) const { // TODO: Remove this fallback once devices can properly provide a supported format if (format == TextureFormat::S8_UInt_Z32_UNorm && !hasTextureFeature(TextureFeatures::Depth32FStencil8)) { format = TextureFormat::S8_UInt_Z24_UNorm; } const auto it = textureCapabilityCache_.find(format); if (it != textureCapabilityCache_.end()) { return it->second; } const auto sampled = ICapabilities::TextureFormatCapabilityBits::Sampled; const auto attachment = ICapabilities::TextureFormatCapabilityBits::Attachment; const auto storage = hasInternalFeature(InternalFeatures::TexStorage) ? ICapabilities::TextureFormatCapabilityBits::Storage : 0; const auto sampledFiltered = ICapabilities::TextureFormatCapabilityBits::SampledFiltered; const auto sampledAttachment = ICapabilities::TextureFormatCapabilityBits::SampledAttachment; const auto unsupported = ICapabilities::TextureFormatCapabilityBits::Unsupported; const auto compressed = ICapabilities::TextureFormatCapabilityBits::Sampled | (hasTextureFeature(TextureFeatures::TextureCompressionTexStorage) ? ICapabilities::TextureFormatCapabilityBits::Storage : 0); // Need to define here to properly include storage support. const auto all = sampled | sampledFiltered | storage | attachment | sampledAttachment; ICapabilities::TextureFormatCapabilities capabilities = unsupported; // First check common formats switch (format) { case TextureFormat::LA_UNorm8: case TextureFormat::L_UNorm8: if (hasTextureFeature(TextureFeatures::ColorTexImageLa)) { capabilities |= sampled | sampledFiltered; if (hasTextureFeature(TextureFeatures::ColorTexStorageLa8)) { capabilities |= storage; } } break; case TextureFormat::A_UNorm8: capabilities |= sampled | sampledFiltered; if (hasTextureFeature(TextureFeatures::ColorTexStorageA8)) { capabilities |= storage; } break; case TextureFormat::RGBA_UNorm8: case TextureFormat::RGBX_UNorm8: capabilities |= sampled | sampledFiltered; if (hasTextureFeature(TextureFeatures::ColorTexStorageRgba8)) { capabilities |= storage; } if (hasTextureFeature(TextureFeatures::ColorTexImageRgba8)) { capabilities |= sampledAttachment; } if (hasTextureFeature(TextureFeatures::ColorRenderbufferRgba8)) { capabilities |= attachment; } break; case TextureFormat::RG_UNorm8: case TextureFormat::R_UNorm8: if (hasFeature(DeviceFeatures::TextureFormatRG)) { capabilities |= sampled | sampledFiltered; if (hasTextureFeature(TextureFeatures::ColorTexStorageRg8)) { capabilities |= storage; } if (hasTextureFeature(TextureFeatures::ColorTexImageRg8)) { capabilities |= sampledAttachment; } if (hasTextureFeature(TextureFeatures::ColorRenderbufferRg8)) { capabilities |= attachment; } } break; case TextureFormat::BGRA_UNorm8: // EXT_texture_format_BGRA8888 adds support for GL_BGRA as a Renderbuffer format, but this was // in a later revision of the extension. It is not supported on our test devices. if (hasTextureFeature(TextureFeatures::ColorTexImageBgra)) { capabilities |= sampled | sampledFiltered; } if (hasTextureFeature(TextureFeatures::ColorTexImageBgraRgba8)) { capabilities |= sampledAttachment; } if (hasTextureFeature(TextureFeatures::ColorTexStorageBgra8)) { capabilities |= storage; } break; case TextureFormat::RGBA_SRGB: if (hasFeature(DeviceFeatures::SRGB)) { capabilities |= sampled | sampledFiltered; if (hasTextureFeature(TextureFeatures::ColorTexStorageSrgba8)) { capabilities |= storage; } if (hasTextureFeature(TextureFeatures::ColorTexImageSrgba8)) { capabilities |= sampledAttachment; } if (hasTextureFeature(TextureFeatures::ColorRenderbufferSrgba8)) { capabilities |= attachment; } } break; case TextureFormat::BGRA_SRGB: if (hasFeature(DeviceFeatures::SRGB) && hasTextureFeature(TextureFeatures::ColorTexImageBgraSrgba)) { capabilities |= sampled | sampledFiltered; } break; case TextureFormat::RGBA_F16: if (hasFeature(DeviceFeatures::TextureHalfFloat)) { capabilities |= sampled; } if (hasTextureFeature(TextureFeatures::ColorTexImage16f)) { capabilities |= sampledAttachment; } if (hasTextureFeature(TextureFeatures::ColorTexStorage16f)) { capabilities |= storage; } if (hasTextureFeature(TextureFeatures::ColorRenderbuffer16f)) { capabilities |= attachment; } if (hasTextureFeature(TextureFeatures::ColorFilterable16f)) { capabilities |= sampledFiltered; } break; case TextureFormat::RGB_F16: // RGB floating point textures are NOT renderable if (hasFeature(DeviceFeatures::TextureHalfFloat)) { capabilities |= sampled; } if (hasTextureFeature(TextureFeatures::ColorRenderbufferRgb16f)) { capabilities |= attachment | sampledAttachment; } if (hasTextureFeature(TextureFeatures::ColorTexStorage16f)) { capabilities |= storage; } if (hasTextureFeature(TextureFeatures::ColorFilterable16f)) { capabilities |= sampledFiltered; } break; case TextureFormat::RG_F16: case TextureFormat::R_F16: if (hasFeature(DeviceFeatures::TextureFormatRG)) { if (hasFeature(DeviceFeatures::TextureHalfFloat)) { capabilities |= sampled; } if (hasTextureFeature(TextureFeatures::ColorRenderbufferRg16f)) { capabilities |= attachment | sampledAttachment; } if (hasTextureFeature(TextureFeatures::ColorTexStorage16f)) { capabilities |= storage; } if (hasTextureFeature(TextureFeatures::ColorFilterable16f)) { capabilities |= sampledFiltered; } } break; case TextureFormat::RGBA_F32: if (hasFeature(DeviceFeatures::TextureFloat)) { capabilities |= sampled; } if (hasTextureFeature(TextureFeatures::ColorTexStorage32f)) { capabilities |= storage; } if (hasTextureFeature(TextureFeatures::ColorRenderbuffer32f)) { capabilities |= attachment | sampledAttachment; } if (hasTextureFeature(TextureFeatures::ColorFilterable32f)) { capabilities |= sampledFiltered; } break; case TextureFormat::RGB_F32: // RGB floating point textures are NOT renderable if (hasFeature(DeviceFeatures::TextureFloat)) { capabilities |= sampled; } if (hasTextureFeature(TextureFeatures::ColorTexStorage32f)) { capabilities |= storage; } if (hasTextureFeature(TextureFeatures::ColorFilterable32f)) { capabilities |= sampledFiltered; } break; case TextureFormat::RG_F32: case TextureFormat::R_F32: if (hasFeature(DeviceFeatures::TextureFormatRG)) { if (hasFeature(DeviceFeatures::TextureFloat)) { capabilities |= sampled; } if (hasTextureFeature(TextureFeatures::ColorTexStorage32f)) { capabilities |= storage; } if (hasTextureFeature(TextureFeatures::ColorRenderbufferRg32f)) { capabilities |= sampledAttachment | attachment; } if (hasTextureFeature(TextureFeatures::ColorFilterable32f)) { capabilities |= sampledFiltered; } } break; case TextureFormat::R_UNorm16: case TextureFormat::RG_UNorm16: if (hasTextureFeature(TextureFeatures::ColorFormatRgUNorm16)) { capabilities |= all; } break; case TextureFormat::RGBA_UNorm16: if (hasTextureFeature(TextureFeatures::ColorFormatRgbaUNorm16)) { capabilities |= all; } break; case TextureFormat::R_UInt16: case TextureFormat::RG_UInt16: if (hasTextureFeature(TextureFeatures::ColorFormatRgInt)) { capabilities |= sampled | storage | attachment; } break; case TextureFormat::R_UInt32: if (hasTextureFeature(TextureFeatures::TextureInteger)) { capabilities |= sampled | storage | attachment | sampledAttachment; } break; case TextureFormat::RGBA_UInt32: if (hasTextureFeature(TextureFeatures::TextureInteger)) { capabilities |= sampled | storage | attachment | sampledAttachment; } break; case TextureFormat::B5G5R5A1_UNorm: if (hasTextureFeature(TextureFeatures::ColorTexImageBgr5A1)) { capabilities |= sampled | sampledFiltered; } break; case TextureFormat::ABGR_UNorm4: capabilities |= all; break; case TextureFormat::R4G2B2_UNorm_Apple: if (hasExtension(Extensions::AppleRgb422)) { // GL_APPLE_rgb_422 formats are not color-renderable formats capabilities |= sampled | sampledFiltered; if (hasInternalFeature(InternalFeatures::TexStorage)) { capabilities |= storage; } } break; case TextureFormat::R4G2B2_UNorm_Rev_Apple: if (hasExtension(Extensions::AppleRgb422)) { // GL_APPLE_rgb_422 formats are not color-renderable formats // TexStorage does not support UNSIGNED_SHORT_8_8_REV_APPLE capabilities |= sampled | sampledFiltered; } break; case TextureFormat::R5G5B5A1_UNorm: capabilities |= sampled | sampledFiltered | storage; if (hasInternalFeature(InternalFeatures::FramebufferObject)) { capabilities |= attachment | sampledAttachment; } break; case TextureFormat::BGR10_A2_Unorm: if (hasTextureFeature(TextureFeatures::ColorTexImageBgr10A2)) { capabilities |= sampled | sampledFiltered; } break; case TextureFormat::RGB10_A2_UNorm_Rev: if (hasTextureFeature(TextureFeatures::ColorTexImageRgb10A2)) { capabilities |= sampled | sampledFiltered; if (!hasInternalRequirement(InternalRequirement::ColorTexImageRgb10A2Unsized)) { capabilities |= sampledAttachment; } } if (hasTextureFeature(TextureFeatures::ColorTexStorageRgb10A2)) { capabilities |= storage; } if (hasTextureFeature(TextureFeatures::ColorRenderbufferRgb10A2)) { capabilities |= attachment; } break; case TextureFormat::RGB10_A2_Uint_Rev: if (hasTextureFeature(TextureFeatures::ColorFormatRgb10A2UI)) { capabilities |= sampled | storage | attachment | sampledAttachment; } break; case TextureFormat::BGRA_UNorm8_Rev: if (hasTextureFeature(TextureFeatures::TextureTypeUInt8888Rev)) { capabilities |= sampled | sampledFiltered; } break; case TextureFormat::B5G6R5_UNorm: // Unsupported break; case TextureFormat::Z_UNorm16: if (hasTextureFeature(TextureFeatures::DepthTexImage)) { capabilities |= sampled; } if (hasTextureFeature(TextureFeatures::DepthTexImage16)) { capabilities |= sampledAttachment; } if (hasTextureFeature(TextureFeatures::DepthTexStorage16)) { capabilities |= storage; } if (hasTextureFeature(TextureFeatures::DepthRenderbuffer16)) { capabilities |= attachment; } if (hasTextureFeature(TextureFeatures::DepthFilterable)) { capabilities |= sampledFiltered; } break; case TextureFormat::Z_UNorm24: if (hasTextureFeature(TextureFeatures::DepthTexImage24)) { capabilities |= sampled | sampledAttachment; } if (hasTextureFeature(TextureFeatures::DepthTexStorage24)) { capabilities |= storage; } if (hasTextureFeature(TextureFeatures::DepthRenderbuffer24)) { capabilities |= attachment; } if (hasTextureFeature(TextureFeatures::DepthFilterable)) { capabilities |= sampledFiltered; } // TODO: Remove these fallback once devices can properly provide a supported format if (hasTextureFeature(TextureFeatures::DepthTexImage32)) { capabilities |= sampled | sampledAttachment; } if (hasTextureFeature(TextureFeatures::DepthTexStorage32)) { capabilities |= storage; } if (hasTextureFeature(TextureFeatures::DepthRenderbuffer32)) { capabilities |= attachment; } if (hasTextureFeature(TextureFeatures::DepthFilterable)) { capabilities |= sampledFiltered; } break; case TextureFormat::Z_UNorm32: if (hasTextureFeature(TextureFeatures::DepthTexImage32)) { capabilities |= sampled | sampledAttachment; } if (hasTextureFeature(TextureFeatures::DepthTexStorage32)) { capabilities |= storage; } if (hasTextureFeature(TextureFeatures::DepthRenderbuffer32)) { capabilities |= attachment; } if (hasTextureFeature(TextureFeatures::DepthFilterable)) { capabilities |= sampledFiltered; } break; case TextureFormat::S8_UInt_Z24_UNorm: if (hasTextureFeature(TextureFeatures::Depth24Stencil8)) { capabilities |= sampled | attachment | sampledAttachment; if (hasInternalFeature(InternalFeatures::TexStorage)) { capabilities |= storage; } } break; case TextureFormat::S8_UInt_Z32_UNorm: if (hasTextureFeature(TextureFeatures::Depth32FStencil8)) { capabilities |= sampled | attachment | sampledAttachment; if (hasInternalFeature(InternalFeatures::TexStorage)) { capabilities |= storage; } } break; case TextureFormat::S_UInt8: if (hasTextureFeature(TextureFeatures::StencilTexture8)) { capabilities |= sampled | storage; } capabilities |= attachment; break; case TextureFormat::RGBA_ASTC_4x4: case TextureFormat::SRGB8_A8_ASTC_4x4: case TextureFormat::RGBA_ASTC_5x4: case TextureFormat::SRGB8_A8_ASTC_5x4: case TextureFormat::RGBA_ASTC_5x5: case TextureFormat::SRGB8_A8_ASTC_5x5: case TextureFormat::RGBA_ASTC_6x5: case TextureFormat::SRGB8_A8_ASTC_6x5: case TextureFormat::RGBA_ASTC_6x6: case TextureFormat::SRGB8_A8_ASTC_6x6: case TextureFormat::RGBA_ASTC_8x5: case TextureFormat::SRGB8_A8_ASTC_8x5: case TextureFormat::RGBA_ASTC_8x6: case TextureFormat::SRGB8_A8_ASTC_8x6: case TextureFormat::RGBA_ASTC_8x8: case TextureFormat::SRGB8_A8_ASTC_8x8: case TextureFormat::RGBA_ASTC_10x5: case TextureFormat::SRGB8_A8_ASTC_10x5: case TextureFormat::RGBA_ASTC_10x6: case TextureFormat::SRGB8_A8_ASTC_10x6: case TextureFormat::RGBA_ASTC_10x8: case TextureFormat::SRGB8_A8_ASTC_10x8: case TextureFormat::RGBA_ASTC_10x10: case TextureFormat::SRGB8_A8_ASTC_10x10: case TextureFormat::RGBA_ASTC_12x10: case TextureFormat::SRGB8_A8_ASTC_12x10: case TextureFormat::RGBA_ASTC_12x12: case TextureFormat::SRGB8_A8_ASTC_12x12: if (hasTextureFeature(TextureFeatures::TextureCompressionAstc)) { capabilities |= compressed; } break; case TextureFormat::RGBA_BC7_UNORM_4x4: case TextureFormat::RGBA_BC7_SRGB_4x4: if (hasTextureFeature(TextureFeatures::TextureCompressionBptc)) { capabilities |= compressed; } break; case TextureFormat::RGBA_PVRTC_2BPPV1: case TextureFormat::RGB_PVRTC_2BPPV1: case TextureFormat::RGBA_PVRTC_4BPPV1: case TextureFormat::RGB_PVRTC_4BPPV1: if (hasTextureFeature(TextureFeatures::TextureCompressionPvrtc)) { capabilities |= compressed; } break; case TextureFormat::RGB8_ETC1: if (hasTextureFeature(TextureFeatures::TextureCompressionEtc1)) { capabilities |= compressed; } break; case TextureFormat::RGB8_ETC2: case TextureFormat::SRGB8_ETC2: case TextureFormat::RGB8_Punchthrough_A1_ETC2: case TextureFormat::SRGB8_Punchthrough_A1_ETC2: case TextureFormat::RGBA8_EAC_ETC2: case TextureFormat::SRGB8_A8_EAC_ETC2: case TextureFormat::RG_EAC_UNorm: case TextureFormat::RG_EAC_SNorm: case TextureFormat::R_EAC_UNorm: case TextureFormat::R_EAC_SNorm: if (hasTextureFeature(TextureFeatures::TextureCompressionEtc2Eac)) { capabilities |= compressed; } break; case TextureFormat::Invalid: case TextureFormat::YUV_NV12: case TextureFormat::YUV_420p: // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only default: // We are relying on the fact that TextureFormatCapabilities::Unsupported is 0 return textureCapabilityCache_[format]; }; textureCapabilityCache_[format] = capabilities; return capabilities; } uint32_t DeviceFeatureSet::getMaxVertexUniforms() const { GLint tsize = 0; // MaxVertexUniformVectors is the maximum number of 4-element vectors that can be passed as // uniform to a vertex shader. All uniforms are 4-element aligned, a single uniform counts at // least as one 4-element vector. // GL_MAX_VERTEX_UNIFORM_COMPONENTS available on Desktop OpenGL 2.0+ and on OpenGL ES 3.0+. // GL_MAX_VERTEX_UNIFORM_VECTORS is available on Desktop OpenGL 3.0+ and on OpenGL ES 2.0+. // GL_MAX_VERTEX_UNIFORM_VECTORS is equal to GL_MAX_VERTEX_UNIFORM_COMPONENTS / 4. if (hasDesktopOrESVersion(*this, GLVersion::v2_0, GLVersion::v3_0_ES)) { glContext_.getIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS, &tsize); tsize /= 4; } else { glContext_.getIntegerv(GL_MAX_VERTEX_UNIFORM_VECTORS, &tsize); } return static_cast(tsize); } uint32_t DeviceFeatureSet::getMaxFragmentUniforms() const { GLint tsize = 0; // PLease see comments above in getMaxVertexUniforms if (hasDesktopOrESVersion(*this, GLVersion::v2_0, GLVersion::v3_0_ES)) { glContext_.getIntegerv(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS, &tsize); tsize /= 4; } else { glContext_.getIntegerv(GL_MAX_FRAGMENT_UNIFORM_VECTORS, &tsize); } return static_cast(tsize); } uint32_t DeviceFeatureSet::getMaxComputeUniforms() const { if (hasFeature(DeviceFeatures::Compute)) { GLint tsize = 0; glContext_.getIntegerv(GL_MAX_COMPUTE_UNIFORM_COMPONENTS, &tsize); return static_cast(tsize); } return 0; } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/DeviceFeatureSet.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include namespace igl::opengl { class IContext; // clang-format off enum class Extensions { AppleRgb422, // GL_APPLE_rgb_422 is supported BindlessTextureArb, // GL_ARB_bindless_texture is supported BindlessTextureNv, // GL_NV_bindless_texture is supported Debug, // GL_KHR_debug is supported DebugLabel, // GL_EXT_debug_label is supported DebugMarker, // GL_EXT_debug_marker is supported Depth24, // GL_OES_depth24 is supported Depth32, // GL_OES_depth32 is supported DepthTexture, // GL_OES_depth_texture is supported DiscardFramebuffer, // GL_EXT_discard_framebuffer is supported Es2Compatibility, // GL_ARB_ES2_compatibility is supported DrawBuffers, // GL_EXT_draw_buffers is supported FramebufferBlit, // GL_EXT_framebuffer_blit is supported FramebufferObject, // GL_ARB_framebuffer_object is supported InvalidateSubdata, // GL_ARB_invalidate_subdata is supported MapBuffer, // GL_OES_mapbuffer is supported MapBufferRange, // GL_EXT_map_buffer_range is supported MultiSampleApple, // GL_APPLE_framebuffer_multisample is supported MultiSampleExt, // GL_EXT_multisampled_render_to_texture is supported MultiSampleImg, // GL_IMG_multisampled_render_to_texture is supported MultiViewMultiSample, // GL_OVR_multiview_multisampled_render_to_texture is supported PolygonOffsetClamp, // GL_ARB_polygon_offset_clamp is supported RequiredInternalFormat, // GL_OES_required_internalformat is supported ShaderImageLoadStore, // GL_EXT_shader_image_load_store is supported Srgb, // GL_EXT_sRGB is supported SrgbWriteControl, // GL_EXT_sRGB_write_control is supported Sync, // GL_APPLE_sync is supported TexStorage, // GL_EXT_texture_storage is supported Texture3D, // GL_OES_texture_3D is supported TextureFormatBgra8888Apple, // GL_EXT_texture_format_BGRA8888 is supported TextureFormatBgra8888Ext, // GL_APPLE_texture_format_BGRA8888 is supported TextureFloat, // GL_ARB_texture_float is supported TextureHalfFloat, // GL_OES_texture_half_float is supported TextureRgArb, // GL_ARB_texture_rg is supported TextureRgExt, // GL_EXT_texture_rg is supported TextureSrgb, // GL_EXT_texture_sRGB is supported TextureType2101010Rev, // GL_EXT_texture_type_2_10_10_10_REV is supporteds TimerQuery, // GL_EXT_timer_query is supported VertexArrayObject, // GL_OES_vertex_array_object is supported VertexAttribDivisor, // GL_NV_instanced_arrays is supported }; // clang-format on // clang-format off enum class InternalFeatures { ClearBufferfv, // glClearBufferfv is supported ClearDepthf, // glClearDepthf is supported DebugLabel, // Debug labels on objects are supported DebugMessage, // Debug messages and group markers are supported DebugMessageCallback, // Debug message callbacks are supported DrawArraysIndirect, // glDrawArraysIndirect is supported MultiDrawIndirect, // glMultiDrawArraysIndirect is supported FramebufferBlit, // BlitFramebuffer is supported FramebufferObject, // Framebuffer objects are supported GetStringi, // GetStringi is supported InvalidateFramebuffer, // glInvalidateFramebuffer is supported MapBuffer, // glMapBuffer is supported PackRowLength, // GL_PACK_ROW_LENGTH is supported with glPixelStorei PixelBufferObject, // PBOs are available PolygonFillMode, // glPolygonFillMode is supported ProgramInterfaceQuery, // Querying info about shader program interfaces is supported SeamlessCubeMap, // GL_TEXTURE_CUBE_MAP_SEAMLESS is supported ShaderImageLoadStore, // Shader image load/store is supported Sync, // Sync objects are supported TexStorage, // glTexStorage* is available TextureCompare, // GL_TEXTURE_COMPARE_MODE and GL_TEXTURE_COMPARE_FUNC are supported UnmapBuffer, // glUnmapBuffer is supported UnpackRowLength, // GL_UNPACK_ROW_LENGTH is supported with glPixelStorei VertexArrayObject, // VAOS are available VertexAttribDivisor, // glVertexAttribDivisor is supported }; // clang-format on // clang-format off enum class TextureFeatures { ColorFilterable16f, // XXX16F textures can use GL_LINEAR filtering ColorFilterable32f, // XXX32F textures can use GL_LINEAR filtering ColorFormatRgb10A2UI, // RGB10_A2UI is supported as an internal format ColorFormatRgInt, // Integer R and RG textures are supported ColorFormatRgUNorm16, // UNorm 16 R and RG textures are supported ColorFormatRgbaUNorm16, // UNorm 16 RGBA textures are supported ColorRenderbuffer16f, // RenderbufferStorage supports XXX16F for color targets ColorRenderbuffer32f, // RenderbufferStorage supports XXX32F for color targets ColorRenderbufferRg16f, // RenderbufferStorage supports Rg16F for color targets ColorRenderbufferRg32f, // RenderbufferStorage supports Rg32F for color targets ColorRenderbufferRg8, // RenderbufferStorage supports R8 and RG8 ColorRenderbufferRgb10A2, // RenderbufferStorage supports RGB10_A2 ColorRenderbufferRgb16f, // RenderbufferStorage supports RGB16F for color targets ColorRenderbufferRgba8, // RenderbufferStorage supports RGB8 and RGBA8 ColorRenderbufferSrgba8, // RenderbufferStorage supports SRGBA ColorTexImage16f, // TexImage supports XXX16F for color targets ColorTexImage32f, // TexImage supports XXX32F for color targets ColorTexImageBgr10A2, // TexImage supports RGB10_A2 with format BGRA ColorTexImageBgr5A1, // TexImage supports RGB5_A1 with format BGRA ColorTexImageBgra, // TexImage supports BGRA ColorTexImageBgraRgba8, // TexImage supports BGRA as a format with RGBA8 as an internalformat ColorTexImageBgraSrgba, // TexImage supports BGRA as a format with SRGB_ALPHA or SRGB8_ALPHA8 as an internalformat ColorTexImageA8, // TexImage supports ALPHA8 ColorTexImageLa, // TexImage supports LUMINANCE and LUMINANCE_ALPHA ColorTexImageLa8, // TexImage supports LUMINANCE8 and LUMINANCE8_ALPHA8 ColorTexImageRg8, // TexImage supports R8 and RG8 ColorTexImageRgb10A2, // TexImage supports RGB10_A2 or RGBA + UNSIGNED_INT_2_10_10_10_REV ColorTexImageRgba8, // TexImage supports RGB8 and RGBA8 ColorTexImageSrgba8, // TexImage supports SRGBA ColorTexStorage16f, // TexStorage supports XXX16F for color targets ColorTexStorage32f, // TexStorage supports XXX32F for color targets ColorTexStorageA8, // TexStorage supports ALPHA8 (or R8 w/ swizzle) ColorTexStorageBgra8, // TexStorage supports BGRA8_EXT ColorTexStorageLa8, // TexStorage supports LUMINANCE8 and LUMINANCE8_ALPHA8 ColorTexStorageRg8, // TexStorage supports R8 and RG8 ColorTexStorageRgb10A2, // TexStorage supports RGB10_A2 ColorTexStorageRgba8, // TexStorage supports RGB8 and RGBA8 ColorTexStorageSrgba8, // TexStorage supports SRGB8_ALPHA8 Depth24Stencil8, // TextureBuffer and TextureTarget can use DEPTH24_STENCIL8 Depth32FStencil8, // TextureBuffer and TextureTarget can use DEPTH32F_STENCIL8 DepthFilterable, // Depth textures are filterable DepthRenderbuffer16, // RenderbufferStorage supports DEPTH_COMPONENT16 DepthRenderbuffer24, // RenderbufferStorage supports DEPTH_COMPONENT24 DepthRenderbuffer32, // RenderbufferStorage supports DEPTH_COMPONENT32 DepthTexImage, // TexImage supports depth formats DepthTexImage16, // TextureBuffer can use DEPTH_COMPONENT16 DepthTexImage24, // TextureBuffer can use DEPTH_COMPONENT24 DepthTexImage32, // TextureBuffer can use DEPTH_COMPONENT32 DepthTexStorage16, // TextureBuffer can use DEPTH_COMPONENT16 DepthTexStorage24, // TextureBuffer can use DEPTH_COMPONENT24 DepthTexStorage32, // TextureBuffer can use DEPTH_COMPONENT32 StencilTexture8, // TextureBuffer can use STENCIL_TEXTURE8 TextureCompressionAstc, // Adaptive scalable texture compression is supported TextureCompressionBptc, // DirectX BPTC texture compression is supp TextureCompressionEtc1, // Ericsson texture compression is supported TextureCompressionEtc2Eac, // ETC2/EAC texture compression is supportedorted TextureCompressionPvrtc, // PowerVR Texture compression is supported TextureCompressionTexImage, // TexImage can be used to initialize compressed textures TextureCompressionTexStorage, // TexStorage can be used to initialize compressed textures TextureInteger, // Integer textures are supported TextureTypeUInt8888Rev, // GL_UNSIGNED_INT_8_8_8_8_REV is supported }; // clang-format on enum class InternalRequirement { ColorTexImageRgb10A2Unsized, ColorTexImageRgb5A1Unsized, ColorTexImageRgba4Unsized, ColorTexImageRgbApple422Unsized, DebugMessageExtReq, DebugMessageCallbackExtReq, DebugLabelExtEnumsReq, DebugLabelExtReq, Depth24Stencil8Unsized, Depth32Unsized, DrawBuffersExtReq, FramebufferBlitExtReq, InvalidateFramebufferExtReq, MapBufferExtReq, MapBufferRangeExtReq, MultiSampleExtReq, ShaderImageLoadStoreExtReq, SyncExtReq, SwizzleAlphaTexturesReq, TexStorageExtReq, Texture3DExtReq, TextureHalfFloatExtReq, UnmapBufferExtReq, VertexArrayObjectExtReq, VertexAttribDivisorExtReq, }; class DeviceFeatureSet final { public: explicit DeviceFeatureSet(IContext& glContext); [[nodiscard]] static bool usesOpenGLES() noexcept; void initializeVersion(GLVersion version); void initializeExtensions(std::string extensions, std::unordered_set supportedExtensions); // @fb-only [[nodiscard]] GLVersion getGLVersion() const noexcept; [[nodiscard]] ShaderVersion getShaderVersion() const; [[nodiscard]] BackendVersion getBackendVersion() const; bool isSupported(const std::string& extensionName) const; bool hasExtension(Extensions extension) const; bool hasFeature(DeviceFeatures feature) const; bool hasInternalFeature(InternalFeatures feature) const; bool hasTextureFeature(TextureFeatures feature) const; bool hasRequirement(DeviceRequirement requirement) const; bool hasInternalRequirement(InternalRequirement requirement) const; bool getFeatureLimits(DeviceFeatureLimits featureLimits, size_t& result) const; ICapabilities::TextureFormatCapabilities getTextureFormatCapabilities(TextureFormat format) const; uint32_t getMaxVertexUniforms() const; uint32_t getMaxFragmentUniforms() const; uint32_t getMaxComputeUniforms() const; private: ICapabilities::TextureFormatCapabilities getCompressedTextureCapabilities() const; bool isExtensionSupported(Extensions extension) const; bool isFeatureSupported(DeviceFeatures feature) const; bool isInternalFeatureSupported(InternalFeatures feature) const; bool isTextureFeatureSupported(TextureFeatures feature) const; std::unordered_set supportedExtensions_; std::string extensions_; mutable std::unordered_map textureCapabilityCache_; mutable uint64_t extensionCache_ = 0; mutable uint64_t extensionCacheInitialized_ = 0; mutable uint64_t featureCache_ = 0; mutable uint64_t featureCacheInitialized_ = 0; mutable uint32_t internalFeatureCache_ = 0; mutable uint32_t internalFeatureCacheInitialized_ = 0; mutable uint64_t textureFeatureCache_ = 0; mutable uint64_t textureFeatureCacheInitialized_ = 0; IContext& glContext_; GLVersion version_ = GLVersion::NotAvailable; }; } // namespace igl::opengl ================================================ FILE: src/igl/opengl/DummyTexture.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once // @fb-only #include namespace igl::opengl { class DummyTexture : public ITexture { public: explicit DummyTexture(Size size, TextureFormat format = TextureFormat::BGRA_UNorm8) : ITexture(format), size_(size) {} ~DummyTexture() override = default; [[nodiscard]] Dimensions getDimensions() const override { return Dimensions{static_cast(size_.width), static_cast(size_.height), 1u}; } [[nodiscard]] uint32_t getNumLayers() const override { return 1; } [[nodiscard]] TextureType getType() const override { IGL_DEBUG_ASSERT_NOT_REACHED(); return TextureType::TwoDArray; } [[nodiscard]] TextureDesc::TextureUsage getUsage() const override { IGL_DEBUG_ASSERT_NOT_REACHED(); return 0; } [[nodiscard]] uint32_t getSamples() const override { IGL_DEBUG_ASSERT_NOT_REACHED(); return 1; } void generateMipmap(ICommandQueue& /* unused */, const TextureRangeDesc* IGL_NULLABLE /* unused */) const override { IGL_DEBUG_ASSERT_NOT_REACHED(); } void generateMipmap(ICommandBuffer& /* unused */, const TextureRangeDesc* IGL_NULLABLE /* unused */) const override { IGL_DEBUG_ASSERT_NOT_REACHED(); } [[nodiscard]] uint32_t getNumMipLevels() const override { IGL_DEBUG_ASSERT_NOT_REACHED(); return 1; } [[nodiscard]] bool isRequiredGenerateMipmap() const override { return false; } [[nodiscard]] uint64_t getTextureId() const override { IGL_DEBUG_ASSERT_NOT_REACHED(); return 0; } // IAttachmentInterop interface [[nodiscard]] void* IGL_NULLABLE getNativeImage() const override { return nullptr; } [[nodiscard]] void* IGL_NULLABLE getNativeImageView() const override { return nullptr; } [[nodiscard]] const base::AttachmentInteropDesc& getDesc() const override { attachmentDesc_.width = static_cast(size_.width); attachmentDesc_.height = static_cast(size_.height); attachmentDesc_.depth = 1; attachmentDesc_.numLayers = 1; attachmentDesc_.numSamples = 1; attachmentDesc_.numMipLevels = 1; attachmentDesc_.type = base::TextureType::TwoD; attachmentDesc_.format = static_cast(getFormat()); attachmentDesc_.isSampled = false; return attachmentDesc_; } private: Size size_; mutable base::AttachmentInteropDesc attachmentDesc_; }; } // namespace igl::opengl ================================================ FILE: src/igl/opengl/Framebuffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #if !IGL_PLATFORM_ANDROID #include #else #include namespace std { // TODO: Remove once STL in Android NDK supports std::to_string template string to_string(const T& t) { ostringstream os; os << t; return os.str(); } } // namespace std #endif namespace igl::opengl { namespace { Result checkFramebufferStatus(IContext& context, bool read) { auto code = Result::Code::Ok; std::string message; GLenum framebufferTarget = GL_FRAMEBUFFER; if (context.deviceFeatures().hasFeature(DeviceFeatures::ReadWriteFramebuffer)) { framebufferTarget = read ? GL_READ_FRAMEBUFFER : GL_DRAW_FRAMEBUFFER; } // check that we've created a proper frame buffer const GLenum status = context.checkFramebufferStatus(framebufferTarget); if (status != GL_FRAMEBUFFER_COMPLETE) { code = Result::Code::RuntimeError; switch (status) { case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: message = "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT"; break; case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: message = "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT"; break; case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS: message = "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS"; break; case GL_FRAMEBUFFER_UNSUPPORTED: message = "GL_FRAMEBUFFER_UNSUPPORTED"; break; default: message = "GL_FRAMEBUFFER unknown error: " + std::to_string(status); break; } } return Result(code, message); } Texture::AttachmentParams toAttachmentParams(const RenderPassDesc::AttachmentDesc& attachment, FramebufferMode mode) { Texture::AttachmentParams params{}; params.face = attachment.face; params.mipLevel = attachment.mipLevel; params.layer = attachment.layer; params.read = false; // Color attachments are for writing params.stereo = mode == FramebufferMode::Stereo; return params; } Texture::AttachmentParams defaultWriteAttachmentParams(FramebufferMode mode) { Texture::AttachmentParams params{}; params.face = 0; params.mipLevel = 0; params.layer = 0; params.read = false; params.stereo = mode == FramebufferMode::Stereo; return params; } Texture::AttachmentParams toReadAttachmentParams(const TextureRangeDesc& range, FramebufferMode mode) { IGL_DEBUG_ASSERT(range.numLayers == 1, "range.numLayers must be 1."); IGL_DEBUG_ASSERT(range.numMipLevels == 1, "range.numMipLevels must be 1."); IGL_DEBUG_ASSERT(range.numFaces == 1, "range.numFaces must be 1."); Texture::AttachmentParams params{}; params.face = static_cast(range.face); params.mipLevel = static_cast(range.mipLevel); params.layer = static_cast(range.layer); params.read = true; params.stereo = mode == FramebufferMode::Stereo; return params; } } // namespace FramebufferBindingGuard::FramebufferBindingGuard(IContext& context) : context_(context) { context_.getIntegerv(GL_RENDERBUFFER_BINDING, reinterpret_cast(¤tRenderbuffer_)); // Only restore currently bound framebuffer if it's valid if (context.deviceFeatures().hasFeature(DeviceFeatures::ReadWriteFramebuffer)) { if (checkFramebufferStatus(context, true).isOk()) { context_.getIntegerv(GL_READ_FRAMEBUFFER_BINDING, reinterpret_cast(¤tReadFramebuffer_)); } if (checkFramebufferStatus(context, false).isOk()) { context_.getIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, reinterpret_cast(¤tDrawFramebuffer_)); } } else { if (checkFramebufferStatus(context, false).isOk()) { context_.getIntegerv(GL_FRAMEBUFFER_BINDING, reinterpret_cast(¤tFramebuffer_)); } } } FramebufferBindingGuard::~FramebufferBindingGuard() { if (context_.deviceFeatures().hasFeature(DeviceFeatures::ReadWriteFramebuffer)) { context_.bindFramebuffer(GL_READ_FRAMEBUFFER, currentReadFramebuffer_); context_.bindFramebuffer(GL_DRAW_FRAMEBUFFER, currentDrawFramebuffer_); } else { context_.bindFramebuffer(GL_FRAMEBUFFER, currentFramebuffer_); } context_.bindRenderbuffer(GL_RENDERBUFFER, currentRenderbuffer_); } ///-------------------------------------- /// MARK: - Framebuffer Framebuffer::Framebuffer(IContext& context) : WithContext(context) {} bool Framebuffer::isSwapchainBound() const { return frameBufferID_ == 0; } void Framebuffer::attachAsColor(ITexture& texture, uint32_t index, const Texture::AttachmentParams& params) const { static_cast(texture).attachAsColor(index, params); IGL_DEBUG_ASSERT(index >= 0 && index < kNumCachedStates); colorCachedState_[index].updateCache(params.stereo ? FramebufferMode::Stereo : FramebufferMode::Mono, params.layer, params.face, params.mipLevel); } void Framebuffer::attachAsDepth(ITexture& texture, const Texture::AttachmentParams& params) const { static_cast(texture).attachAsDepth(params); depthCachedState_.updateCache(params.stereo ? FramebufferMode::Stereo : FramebufferMode::Mono, params.layer, params.face, params.mipLevel); } void Framebuffer::attachAsStencil(ITexture& texture, const Texture::AttachmentParams& params) const { static_cast(texture).attachAsStencil(params); stencilCachedState_.updateCache(params.stereo ? FramebufferMode::Stereo : FramebufferMode::Mono, params.layer, params.face, params.mipLevel); } void Framebuffer::bindBuffer() const { getContext().bindFramebuffer(GL_FRAMEBUFFER, frameBufferID_); } void Framebuffer::bindBufferForRead() const { // TODO: enable optimization path if (getContext().deviceFeatures().hasFeature(DeviceFeatures::ReadWriteFramebuffer)) { getContext().bindFramebuffer(GL_READ_FRAMEBUFFER, frameBufferID_); } else { bindBuffer(); } } void Framebuffer::copyBytesColorAttachment(ICommandQueue& /* unused */, size_t index, void* pixelBytes, const TextureRangeDesc& range, size_t bytesPerRow) const { // Only support attachment 0 because that's what glReadPixels supports if (index != 0) { IGL_DEBUG_ABORT("Invalid index: %d", index); return; } IGL_DEBUG_ASSERT(range.numFaces == 1, "range.numFaces MUST be 1"); IGL_DEBUG_ASSERT(range.numLayers == 1, "range.numLayers MUST be 1"); IGL_DEBUG_ASSERT(range.numMipLevels == 1, "range.numMipLevels MUST be 1"); auto itexture = getColorAttachment(index); if (itexture == nullptr) { IGL_DEBUG_ABORT("The framebuffer does not have any color attachment at index %d", index); return; } const FramebufferBindingGuard guard(getContext()); CustomFramebuffer extraFramebuffer(getContext()); auto& texture = static_cast(*itexture); Result ret; FramebufferDesc desc; desc.colorAttachments[0].texture = itexture; extraFramebuffer.initialize(desc, &ret); IGL_DEBUG_ASSERT(ret.isOk(), ret.message.c_str()); extraFramebuffer.bindBufferForRead(); attachAsColor(*itexture, 0, toReadAttachmentParams(range, FramebufferMode::Mono)); checkFramebufferStatus(getContext(), true); const bool packRowLengthSupported = getContext().deviceFeatures().hasInternalFeature(InternalFeatures::PackRowLength); // The bytesPerRow value is used to decide both the alignment and the row length. We will only use // usePackRowLength when bytesPerRow is set and is a multiple of the block size. const bool usePackRowLength = packRowLengthSupported && bytesPerRow != 0 && bytesPerRow % itexture->getProperties().bytesPerBlock == 0; if (usePackRowLength) { const int packRowLength = static_cast(bytesPerRow / itexture->getProperties().bytesPerBlock); getContext().pixelStorei(GL_PACK_ROW_LENGTH, packRowLength); getContext().pixelStorei(GL_PACK_ALIGNMENT, 1); } else { const int finalBytesPerRow = bytesPerRow == 0 ? itexture->getProperties().getBytesPerRow(range) : bytesPerRow; if (packRowLengthSupported) { getContext().pixelStorei(GL_PACK_ROW_LENGTH, 0); } getContext().pixelStorei(GL_PACK_ALIGNMENT, texture.getAlignment(finalBytesPerRow, range.mipLevel, range.width)); } // Note read out format is based on // (https://www.khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glReadPixels.xml) // as using GL_RGBA with GL_UNSIGNED_BYTE is the only always supported combination // with glReadPixels. getContext().flush(); // @fb-only // @fb-only const auto rangeX = static_cast(range.x); const auto rangeY = static_cast(range.y); const auto rangeWidth = static_cast(range.width); const auto rangeHeight = static_cast(range.height); const auto textureFormat = texture.getFormat(); // Tests need GL_HALF_FLOAT_OES on iOS and GL_HALF_FLOAT on Android and everything else. const auto kHalfFloatFormat = getContext().deviceFeatures().hasInternalRequirement( InternalRequirement::TextureHalfFloatExtReq) ? GL_HALF_FLOAT_OES : GL_HALF_FLOAT; if (textureFormat == TextureFormat::RGBA_UInt32) { if (IGL_DEBUG_VERIFY( getContext().deviceFeatures().hasTextureFeature(TextureFeatures::TextureInteger))) { getContext().readPixels( rangeX, rangeY, rangeWidth, rangeHeight, GL_RGBA_INTEGER, GL_UNSIGNED_INT, pixelBytes); } } else if (textureFormat == TextureFormat::R_UNorm8) { if (IGL_DEBUG_VERIFY( getContext().deviceFeatures().hasFeature(DeviceFeatures::TextureFormatRG))) { getContext().readPixels( rangeX, rangeY, rangeWidth, rangeHeight, GL_RED, GL_UNSIGNED_BYTE, pixelBytes); } } else if (textureFormat == TextureFormat::RG_UNorm8) { if (IGL_DEBUG_VERIFY( getContext().deviceFeatures().hasFeature(DeviceFeatures::TextureFormatRG))) { getContext().readPixels( rangeX, rangeY, rangeWidth, rangeHeight, GL_RG, GL_UNSIGNED_BYTE, pixelBytes); } } else if (textureFormat == TextureFormat::RGBA_F16) { if (IGL_DEBUG_VERIFY( getContext().deviceFeatures().hasFeature(DeviceFeatures::TextureHalfFloat))) { getContext().readPixels( rangeX, rangeY, rangeWidth, rangeHeight, GL_RGBA, kHalfFloatFormat, pixelBytes); } } else if (textureFormat == TextureFormat::RGB_F16) { if (IGL_DEBUG_VERIFY( getContext().deviceFeatures().hasFeature(DeviceFeatures::TextureHalfFloat))) { getContext().readPixels( rangeX, rangeY, rangeWidth, rangeHeight, GL_RGB, kHalfFloatFormat, pixelBytes); } } else if (textureFormat == TextureFormat::RG_F16) { if (IGL_DEBUG_VERIFY( getContext().deviceFeatures().hasFeature(DeviceFeatures::TextureHalfFloat)) && IGL_DEBUG_VERIFY( getContext().deviceFeatures().hasFeature(DeviceFeatures::TextureFormatRG))) { getContext().readPixels( rangeX, rangeY, rangeWidth, rangeHeight, GL_RG, kHalfFloatFormat, pixelBytes); } } else if (textureFormat == TextureFormat::R_F16) { if (IGL_DEBUG_VERIFY( getContext().deviceFeatures().hasFeature(DeviceFeatures::TextureHalfFloat)) && IGL_DEBUG_VERIFY( getContext().deviceFeatures().hasFeature(DeviceFeatures::TextureFormatRG))) { getContext().readPixels( rangeX, rangeY, rangeWidth, rangeHeight, GL_RED, kHalfFloatFormat, pixelBytes); } } else if (textureFormat == TextureFormat::RGBA_F32) { if (IGL_DEBUG_VERIFY(getContext().deviceFeatures().hasFeature(DeviceFeatures::TextureFloat))) { getContext().readPixels( rangeX, rangeY, rangeWidth, rangeHeight, GL_RGBA, GL_FLOAT, pixelBytes); } } else if (textureFormat == TextureFormat::RGB_F32) { if (IGL_DEBUG_VERIFY(getContext().deviceFeatures().hasFeature(DeviceFeatures::TextureFloat))) { getContext().readPixels( rangeX, rangeY, rangeWidth, rangeHeight, GL_RGB, GL_FLOAT, pixelBytes); } } else if (textureFormat == TextureFormat::RG_F32) { if (IGL_DEBUG_VERIFY(getContext().deviceFeatures().hasFeature(DeviceFeatures::TextureFloat)) && IGL_DEBUG_VERIFY( getContext().deviceFeatures().hasFeature(DeviceFeatures::TextureFormatRG))) { getContext().readPixels(rangeX, rangeY, rangeWidth, rangeHeight, GL_RG, GL_FLOAT, pixelBytes); } } else if (textureFormat == TextureFormat::R_F32) { if (IGL_DEBUG_VERIFY(getContext().deviceFeatures().hasFeature(DeviceFeatures::TextureFloat)) && IGL_DEBUG_VERIFY( getContext().deviceFeatures().hasFeature(DeviceFeatures::TextureFormatRG))) { getContext().readPixels( rangeX, rangeY, rangeWidth, rangeHeight, GL_RED, GL_FLOAT, pixelBytes); } } else { getContext().readPixels( rangeX, rangeY, rangeWidth, rangeHeight, GL_RGBA, GL_UNSIGNED_BYTE, pixelBytes); } // Reset the GL_PACK_ROW_LENGTH if (usePackRowLength) { getContext().pixelStorei(GL_PACK_ROW_LENGTH, 0); } // Reset the GL_PACK_ALIGNMENT (default value for GL_PACK_ALIGNMENT is 4) getContext().pixelStorei(GL_PACK_ALIGNMENT, 4); getContext().checkForErrors(nullptr, 0); auto error = getContext().getLastError(); IGL_DEBUG_ASSERT(error.isOk(), error.message.c_str()); } void Framebuffer::copyBytesDepthAttachment(ICommandQueue& /* unused */, void* /*pixelBytes*/, const TextureRangeDesc& /*range*/, size_t /*bytesPerRow*/) const { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } void Framebuffer::copyBytesStencilAttachment(ICommandQueue& /* unused */, void* /*pixelBytes*/, const TextureRangeDesc& /*range*/, size_t /*bytesPerRow*/) const { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } void Framebuffer::copyTextureColorAttachment(ICommandQueue& /*cmdQueue*/, size_t index, std::shared_ptr destTexture, const TextureRangeDesc& range) const { // Only support attachment 0 because that's what glCopyTexImage2D supports if (index != 0 || getColorAttachment(index) == nullptr) { IGL_DEBUG_ABORT("Invalid index: %d", index); return; } const FramebufferBindingGuard guard(getContext()); bindBufferForRead(); auto& dest = static_cast(*destTexture); dest.bind(); getContext().copyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, static_cast(range.x), static_cast(range.y), static_cast(range.width), static_cast(range.height)); } // NOLINTBEGIN(bugprone-easily-swappable-parameters) bool Framebuffer::CachedState::needsUpdate(FramebufferMode newMode, uint8_t newLayer, uint8_t newFace, uint8_t newMipLevel) { // NOLINTEND(bugprone-easily-swappable-parameters) return mode != newMode || layer != newLayer || face != newFace || mipLevel != newMipLevel; } // NOLINTBEGIN(bugprone-easily-swappable-parameters) void Framebuffer::CachedState::updateCache(FramebufferMode newMode, uint8_t newLayer, uint8_t newFace, uint8_t newMipLevel) { // NOLINTEND(bugprone-easily-swappable-parameters) mode = newMode; layer = newLayer; face = newFace; mipLevel = newMipLevel; } ///-------------------------------------- /// MARK: - CustomFramebuffer CustomFramebuffer::~CustomFramebuffer() { if (frameBufferID_ != 0) { getContext().deleteFramebuffers(1, &frameBufferID_); frameBufferID_ = 0; } } std::vector CustomFramebuffer::getColorAttachmentIndices() const { std::vector indices; for (size_t i = 0; i != IGL_COLOR_ATTACHMENTS_MAX; i++) { if (renderTarget_.colorAttachments[i].texture || renderTarget_.colorAttachments[i].resolveTexture) { indices.push_back(i); } } return indices; } std::shared_ptr CustomFramebuffer::getColorAttachment(size_t index) const { IGL_DEBUG_ASSERT(index < IGL_COLOR_ATTACHMENTS_MAX); return renderTarget_.colorAttachments[index].texture; } std::shared_ptr CustomFramebuffer::getResolveColorAttachment(size_t index) const { IGL_DEBUG_ASSERT(index < IGL_COLOR_ATTACHMENTS_MAX); return renderTarget_.colorAttachments[index].resolveTexture; } std::shared_ptr CustomFramebuffer::getDepthAttachment() const { return renderTarget_.depthAttachment.texture; } std::shared_ptr CustomFramebuffer::getResolveDepthAttachment() const { return renderTarget_.depthAttachment.resolveTexture; } std::shared_ptr CustomFramebuffer::getStencilAttachment() const { return renderTarget_.stencilAttachment.texture; } FramebufferMode CustomFramebuffer::getMode() const { return renderTarget_.mode; } void CustomFramebuffer::updateDrawable(std::shared_ptr texture) { updateDrawableInternal({std::move(texture), nullptr}, false); } void CustomFramebuffer::updateDrawable(SurfaceTextures surfaceTextures) { updateDrawableInternal(std::move(surfaceTextures), true); } void CustomFramebuffer::updateResolveAttachment(std::shared_ptr texture) { if (resolveFramebuffer_) { resolveFramebuffer_->updateDrawable(std::move(texture)); } } void CustomFramebuffer::updateDrawableInternal(SurfaceTextures surfaceTextures, bool updateDepthStencil) { auto colorAttachment0 = getColorAttachment(0); auto depthAttachment = updateDepthStencil ? getDepthAttachment() : nullptr; auto stencilAttachment = updateDepthStencil ? getStencilAttachment() : nullptr; const bool updateColor = colorAttachment0 != surfaceTextures.color; updateDepthStencil = updateDepthStencil && (depthAttachment != surfaceTextures.depth || stencilAttachment != surfaceTextures.depth); if (updateColor || updateDepthStencil) { const FramebufferBindingGuard guard(getContext()); bindBuffer(); if (updateColor) { if (!surfaceTextures.color) { static_cast(*colorAttachment0).detachAsColor(0, false); renderTarget_.colorAttachments[0] = {}; } else { attachAsColor(*surfaceTextures.color, 0, defaultWriteAttachmentParams(renderTarget_.mode)); renderTarget_.colorAttachments[0].texture = std::move(surfaceTextures.color); } } if (updateDepthStencil) { if (!surfaceTextures.depth) { if (depthAttachment) { static_cast(*depthAttachment).detachAsDepth(false); } renderTarget_.depthAttachment.texture = nullptr; if (depthAttachment == stencilAttachment) { if (stencilAttachment) { static_cast(*stencilAttachment).detachAsStencil(false); } renderTarget_.stencilAttachment.texture = nullptr; } } else { attachAsDepth(*surfaceTextures.depth, defaultWriteAttachmentParams(renderTarget_.mode)); if (surfaceTextures.depth->getProperties().hasStencil()) { attachAsStencil(*surfaceTextures.depth, defaultWriteAttachmentParams(renderTarget_.mode)); renderTarget_.stencilAttachment.texture = surfaceTextures.depth; } else { if (stencilAttachment) { static_cast(*stencilAttachment).detachAsStencil(false); } renderTarget_.stencilAttachment.texture = nullptr; } renderTarget_.depthAttachment.texture = std::move(surfaceTextures.depth); } } } } bool CustomFramebuffer::isInitialized() const { return initialized_; } bool CustomFramebuffer::hasImplicitColorAttachment() const { if (frameBufferID_ != 0) { return false; } const auto& colorAttachment0 = renderTarget_.colorAttachments[0]; return colorAttachment0.texture != nullptr && static_cast(*colorAttachment0.texture).isImplicitStorage(); } void CustomFramebuffer::initialize(const FramebufferDesc& desc, Result* outResult) { if (IGL_DEBUG_VERIFY_NOT(isInitialized())) { Result::setResult(outResult, Result::Code::RuntimeError, "Framebuffer already initialized."); return; } initialized_ = true; renderTarget_ = desc; // Restore framebuffer binding const FramebufferBindingGuard guard(getContext()); if (hasImplicitColorAttachment()) { // Don't generate framebuffer id. Use implicit framebuffer supplied by containing view Result::setOk(outResult); } else { prepareResource(desc.debugName, outResult); } } void CustomFramebuffer::prepareResource(const std::string& debugName, Result* outResult) { // create a new frame buffer if we don't already have one getContext().genFramebuffers(1, &frameBufferID_); if (IGL_DEBUG_VERIFY_NOT(frameBufferID_ == 0)) { Result::setResult(outResult, Result::Code::RuntimeError, "Failed to create framebuffer ID."); return; } bindBuffer(); if (!debugName.empty() && getContext().deviceFeatures().hasInternalFeature(InternalFeatures::DebugLabel)) { getContext().objectLabel(GL_FRAMEBUFFER, frameBufferID_, debugName.size(), debugName.c_str()); } std::vector drawBuffers; const auto attachmentParams = defaultWriteAttachmentParams(renderTarget_.mode); // attach the textures and render buffers to the frame buffer bool hasBuffers = false; for (size_t i = 0; i != IGL_COLOR_ATTACHMENTS_MAX; i++) { const auto& colorAttachment = renderTarget_.colorAttachments[i]; if (colorAttachment.texture != nullptr) { attachAsColor(*colorAttachment.texture, static_cast(i), attachmentParams); drawBuffers.push_back(static_cast(GL_COLOR_ATTACHMENT0 + i)); if (i) { // skip attachment 0 hasBuffers = true; } } else { drawBuffers.push_back(GL_NONE); } } if (hasBuffers) { // needs to be called when there's more than one color attachment or if there's a single color // attachment at a non-zero index getContext().drawBuffers(static_cast(drawBuffers.size()), drawBuffers.data()); } if (renderTarget_.depthAttachment.texture != nullptr) { attachAsDepth(*renderTarget_.depthAttachment.texture, attachmentParams); } if (renderTarget_.stencilAttachment.texture != nullptr) { attachAsStencil(*renderTarget_.stencilAttachment.texture, attachmentParams); } Result result = checkFramebufferStatus(getContext(), false); IGL_DEBUG_ASSERT(result.isOk(), result.message.c_str()); if (outResult) { *outResult = result; } if (!result.isOk()) { return; } // Check if resolve framebuffer is needed FramebufferDesc resolveDesc; auto createResolveFramebuffer = false; uint32_t maskColorAttachments = 0; uint32_t maskColorResolveAttachments = 0; for (size_t i = 0; i != IGL_COLOR_ATTACHMENTS_MAX; i++) { const auto& colorAttachment = renderTarget_.colorAttachments[i]; if (colorAttachment.texture) { maskColorAttachments |= 1u << i; } if (colorAttachment.resolveTexture) { createResolveFramebuffer = true; FramebufferDesc::AttachmentDesc attachment; attachment.texture = colorAttachment.resolveTexture; resolveDesc.colorAttachments[i] = attachment; maskColorResolveAttachments |= 1u << i; } } if (createResolveFramebuffer && maskColorResolveAttachments != maskColorAttachments) { IGL_DEBUG_ASSERT_NOT_REACHED(); if (outResult) { *outResult = Result(igl::Result::Code::ArgumentInvalid, "If resolve texture is specified on a color attachment it must be " "specified on all of them"); } return; } if (renderTarget_.depthAttachment.resolveTexture) { createResolveFramebuffer = true; resolveDesc.depthAttachment.texture = renderTarget_.depthAttachment.resolveTexture; } if (renderTarget_.stencilAttachment.resolveTexture) { createResolveFramebuffer = true; resolveDesc.stencilAttachment.texture = renderTarget_.stencilAttachment.resolveTexture; } if (createResolveFramebuffer) { auto cfb = std::make_shared(getContext()); cfb->initialize(resolveDesc, &result); if (outResult) { *outResult = result; } resolveFramebuffer_ = std::move(cfb); } } Viewport CustomFramebuffer::getViewport() const { auto texture = getColorAttachment(0); if (texture == nullptr) { texture = getDepthAttachment(); } if (texture == nullptr) { IGL_DEBUG_ABORT("No color/depth attachments in CustomFrameBuffer at index 0"); return {0, 0, 0, 0}; } // By default, we set viewport to dimensions of framebuffer const auto size = texture->getSize(); return {0, 0, size.width, size.height}; } void CustomFramebuffer::bind(const RenderPassDesc& renderPass) const { // Cache renderPass for unbind renderPass_ = renderPass; IGL_DEBUG_ASSERT(renderTarget_.mode != FramebufferMode::Multiview, "FramebufferMode::Multiview not supported"); bindBuffer(); int targetCount = 0; for (size_t i = 0; i != IGL_COLOR_ATTACHMENTS_MAX; i++) { const auto& colorAttachment = renderTarget_.colorAttachments[i]; if (!colorAttachment.texture) { continue; } targetCount++; #if !IGL_OPENGL_ES // OpenGL ES doesn't need to call glEnable. All it needs is an sRGB framebuffer. if (getContext().deviceFeatures().hasFeature(DeviceFeatures::SRGB)) { if (colorAttachment.texture->getProperties().isSRGB()) { getContext().enable(GL_FRAMEBUFFER_SRGB); } else { getContext().disable(GL_FRAMEBUFFER_SRGB); } } #endif const size_t index = i; IGL_DEBUG_ASSERT(index >= 0 && index < renderPass.colorAttachments.size()); const auto& renderPassAttachment = renderPass.colorAttachments[index]; // When setting up a framebuffer, we attach textures as though they were a non-array // texture with and set layer, mip-level and face equal to 0. // If any of these assumptions are not true, we need to reattach with proper values. IGL_DEBUG_ASSERT(index >= 0 && index < kNumCachedStates); if (colorCachedState_[index].needsUpdate(renderTarget_.mode, renderPassAttachment.layer, renderPassAttachment.face, renderPassAttachment.mipLevel)) { attachAsColor(*colorAttachment.texture, static_cast(index), toAttachmentParams(renderPassAttachment, renderTarget_.mode)); } } if (renderTarget_.depthAttachment.texture) { const auto& renderPassAttachment = renderPass.depthAttachment; if (depthCachedState_.needsUpdate(renderTarget_.mode, renderPassAttachment.layer, renderPassAttachment.face, renderPassAttachment.mipLevel)) { attachAsDepth(*renderTarget_.depthAttachment.texture, toAttachmentParams(renderPassAttachment, renderTarget_.mode)); } } if (renderTarget_.stencilAttachment.texture) { const auto& renderPassAttachment = renderPass.stencilAttachment; if (stencilCachedState_.needsUpdate(renderTarget_.mode, renderPassAttachment.layer, renderPassAttachment.face, renderPassAttachment.mipLevel)) { attachAsStencil(*renderTarget_.stencilAttachment.texture, toAttachmentParams(renderPassAttachment, renderTarget_.mode)); } } // clear the buffers if we're not loading previous contents GLbitfield clearMask = 0; if (getContext().deviceFeatures().hasInternalFeature(InternalFeatures::ClearBufferfv) && targetCount > 1) { for (size_t index = 0; index != IGL_COLOR_ATTACHMENTS_MAX; index++) { const auto& colorAttachment = renderTarget_.colorAttachments[index]; if (colorAttachment.texture != nullptr && renderPass_.colorAttachments[index].loadAction == LoadAction::Clear) { auto clearColor = renderPass_.colorAttachments[index].clearColor; getContext().colorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); getContext().clearBufferfv(GL_COLOR, (GLint)index, clearColor.toFloatPtr()); } } } else { const auto& colorAttachment0 = renderTarget_.colorAttachments[0]; if (colorAttachment0.texture != nullptr && renderPass_.colorAttachments[0].loadAction == LoadAction::Clear) { clearMask |= GL_COLOR_BUFFER_BIT; auto clearColor = renderPass_.colorAttachments[0].clearColor; getContext().colorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); getContext().clearColor(clearColor.r, clearColor.g, clearColor.b, clearColor.a); } } if (renderTarget_.depthAttachment.texture != nullptr) { if (renderPass_.depthAttachment.loadAction == LoadAction::Clear) { clearMask |= GL_DEPTH_BUFFER_BIT; getContext().depthMask(GL_TRUE); getContext().clearDepthf(renderPass_.depthAttachment.clearDepth); } } if (renderTarget_.stencilAttachment.texture != nullptr) { getContext().enable(GL_STENCIL_TEST); if (renderPass_.stencilAttachment.loadAction == LoadAction::Clear) { clearMask |= GL_STENCIL_BUFFER_BIT; getContext().stencilMask(0xFF); getContext().clearStencil(renderPass_.stencilAttachment.clearStencil); } } if (clearMask != 0) { getContext().clear(clearMask); } } void CustomFramebuffer::unbind() const { // discard the depthStencil if we don't need to store its contents GLenum attachments[3]; GLsizei numAttachments = 0; const auto& colorAttachment0 = renderTarget_.colorAttachments[0]; if (colorAttachment0.texture != nullptr && renderPass_.colorAttachments[0].storeAction != StoreAction::Store) { attachments[numAttachments++] = GL_COLOR_ATTACHMENT0; } if (renderTarget_.depthAttachment.texture != nullptr) { if (renderPass_.depthAttachment.storeAction != StoreAction::Store) { attachments[numAttachments++] = GL_DEPTH_ATTACHMENT; } } if (renderTarget_.stencilAttachment.texture != nullptr) { getContext().disable(GL_STENCIL_TEST); if (renderPass_.stencilAttachment.storeAction != StoreAction::Store) { attachments[numAttachments++] = GL_STENCIL_ATTACHMENT; } } if (numAttachments > 0) { const auto& features = getContext().deviceFeatures(); if (features.hasInternalFeature(InternalFeatures::InvalidateFramebuffer)) { getContext().invalidateFramebuffer(GL_FRAMEBUFFER, numAttachments, attachments); } } } ///-------------------------------------- /// MARK: - CurrentFramebuffer CurrentFramebuffer::CurrentFramebuffer(IContext& context) : Super(context) { getContext().getIntegerv(GL_FRAMEBUFFER_BINDING, reinterpret_cast(&frameBufferID_)); GLint viewport[4]; getContext().getIntegerv(GL_VIEWPORT, viewport); viewport_.x = static_cast(viewport[0]); viewport_.y = static_cast(viewport[1]); viewport_.width = static_cast(viewport[2]); viewport_.height = static_cast(viewport[3]); colorAttachment_ = std::make_shared(Size(viewport_.width, viewport_.height)); } std::vector CurrentFramebuffer::getColorAttachmentIndices() const { return std::vector{0}; } std::shared_ptr CurrentFramebuffer::getColorAttachment(size_t index) const { if (index != 0) { IGL_DEBUG_ASSERT_NOT_REACHED(); } return colorAttachment_; } std::shared_ptr CurrentFramebuffer::getResolveColorAttachment(size_t index) const { if (index != 0) { IGL_DEBUG_ASSERT_NOT_REACHED(); } return colorAttachment_; } std::shared_ptr CurrentFramebuffer::getDepthAttachment() const { return nullptr; } std::shared_ptr CurrentFramebuffer::getResolveDepthAttachment() const { return nullptr; } std::shared_ptr CurrentFramebuffer::getStencilAttachment() const { return nullptr; } void CurrentFramebuffer::updateDrawable(std::shared_ptr /*texture*/) { IGL_DEBUG_ASSERT_NOT_REACHED(); } void CurrentFramebuffer::updateDrawable(SurfaceTextures /*surfaceTextures*/) { IGL_DEBUG_ASSERT_NOT_REACHED(); } void CurrentFramebuffer::updateResolveAttachment(std::shared_ptr /*texture*/) { IGL_DEBUG_ASSERT_NOT_REACHED(); } Viewport CurrentFramebuffer::getViewport() const { return viewport_; } void CurrentFramebuffer::bind(const RenderPassDesc& renderPass) const { bindBuffer(); #if !IGL_OPENGL_ES // OpenGL ES doesn't need to call glEnable. All it needs is an sRGB framebuffer. auto colorAttach = getResolveColorAttachment(getColorAttachmentIndices()[0]); if (getContext().deviceFeatures().hasFeature(DeviceFeatures::SRGB)) { if (colorAttach && colorAttach->getProperties().isSRGB()) { getContext().enable(GL_FRAMEBUFFER_SRGB); } else { getContext().disable(GL_FRAMEBUFFER_SRGB); } } #endif // clear the buffers if we're not loading previous contents GLbitfield clearMask = 0; if (renderPass.colorAttachments[0].loadAction == LoadAction::Clear) { clearMask |= GL_COLOR_BUFFER_BIT; auto clearColor = renderPass.colorAttachments[0].clearColor; getContext().colorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); getContext().clearColor(clearColor.r, clearColor.g, clearColor.b, clearColor.a); } if (renderPass.depthAttachment.loadAction == LoadAction::Clear) { clearMask |= GL_DEPTH_BUFFER_BIT; getContext().depthMask(GL_TRUE); getContext().clearDepthf(renderPass.depthAttachment.clearDepth); } if (renderPass.stencilAttachment.loadAction == LoadAction::Clear) { clearMask |= GL_STENCIL_BUFFER_BIT; getContext().stencilMask(0xFF); getContext().clearStencil(renderPass.stencilAttachment.clearStencil); } if (clearMask != 0) { getContext().clear(clearMask); } } void CurrentFramebuffer::unbind() const { // no-op } FramebufferMode CurrentFramebuffer::getMode() const { return FramebufferMode::Mono; } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/Framebuffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include namespace igl { class ICommandBuffer; namespace opengl { ///-------------------------------------- /// MARK: - FramebufferBindingGuard class FramebufferBindingGuard { public: explicit FramebufferBindingGuard(IContext& context); ~FramebufferBindingGuard(); private: IContext& context_; GLuint currentRenderbuffer_ = 0; GLuint currentFramebuffer_ = 0; GLuint currentReadFramebuffer_ = 0; GLuint currentDrawFramebuffer_ = 0; }; // Framebuffer encapsulates an immutable render target (attachments) and per-render pass state. class Framebuffer : public WithContext, public IFramebuffer { public: explicit Framebuffer(IContext& context); virtual Viewport getViewport() const = 0; virtual void bind(const RenderPassDesc& renderPass) const = 0; virtual void unbind() const = 0; void bindBuffer() const; void bindBufferForRead() const; void copyBytesColorAttachment(ICommandQueue& /* unused */, size_t index, void* pixelBytes, const TextureRangeDesc& range, size_t bytesPerRow = 0) const override; void copyBytesDepthAttachment(ICommandQueue& /* unused */, void* pixelBytes, const TextureRangeDesc& range, size_t bytesPerRow = 0) const override; void copyBytesStencilAttachment(ICommandQueue& /* unused */, void* pixelBytes, const TextureRangeDesc& range, size_t bytesPerRow = 0) const override; void copyTextureColorAttachment(ICommandQueue& cmdQueue, size_t index, std::shared_ptr destTexture, const TextureRangeDesc& range) const override; inline GLuint getId() const { return frameBufferID_; } inline std::shared_ptr getResolveFramebuffer() const { return resolveFramebuffer_; } [[nodiscard]] bool isSwapchainBound() const override; protected: void attachAsColor(ITexture& texture, uint32_t index, const Texture::AttachmentParams& params) const; void attachAsDepth(ITexture& texture, const Texture::AttachmentParams& params) const; void attachAsStencil(ITexture& texture, const Texture::AttachmentParams& params) const; // NOLINTNEXTLINE(misc-non-private-member-variables-in-classes) GLuint frameBufferID_ = 0; struct CachedState { FramebufferMode mode = igl::FramebufferMode::Mono; uint8_t layer = 0; uint8_t face = 0; uint8_t mipLevel = 0; bool needsUpdate(FramebufferMode newMode, uint8_t newLayer, uint8_t newFace, uint8_t newMipLevel); void updateCache(FramebufferMode newMode, uint8_t newLayer, uint8_t newFace, uint8_t newMipLevel); }; constexpr static auto kNumCachedStates = 8; // We allow up to 8 color attachments mutable std::array colorCachedState_; mutable CachedState depthCachedState_; mutable CachedState stencilCachedState_; std::shared_ptr resolveFramebuffer_ = nullptr; }; // CustomFramebuffer enables caller-defined attachments // // There are several kinds of framebuffer color attachments that are encapsulated // by the opengl::Texture interface. For the OpenGL backend, we have different // implementations of that interface whose usage supports TextureUsageBits::Attachment: // // 1. `opengl::TextureBuffer`. These are regular old textures, e.g. loaded from an // image file. They can be read from a shader (or written to by a compute shader) // 2. `opengl::TextureTarget`. These are renderbuffers. For storage, normally IGL // allocates storage via glRenderbufferStorage. On iOS, the view's storage is used // instead — see ios::PlatformDevice::createTextureFromNativeDrawable() where // glRenderBufferStorage is replaced by [EAGLContext renderbufferStorage:fromDrawable:]. // 3. `opengl::macos::ViewTextureTarget`. This represents the color attachment of // the implicit framebuffer supplied by NSOpenGLView. Here, IGL skips prepareResource() // since GPU resources are owned by the client, i.e. `hasImplicitColorAttachment()` == true. class CustomFramebuffer final : public Framebuffer { public: using Framebuffer::Framebuffer; ~CustomFramebuffer() override; // Accessors std::vector getColorAttachmentIndices() const override; std::shared_ptr getColorAttachment(size_t index) const override; std::shared_ptr getResolveColorAttachment(size_t index) const override; std::shared_ptr getDepthAttachment() const override; std::shared_ptr getResolveDepthAttachment() const override; std::shared_ptr getStencilAttachment() const override; [[nodiscard]] FramebufferMode getMode() const override; // Methods void updateDrawable(std::shared_ptr texture) override; void updateDrawable(SurfaceTextures surfaceTextures) override; void updateResolveAttachment(std::shared_ptr texture) override; bool isInitialized() const; bool hasImplicitColorAttachment() const; void initialize(const FramebufferDesc& desc, Result* outResult); // CommandBuffer Viewport getViewport() const override; void bind(const RenderPassDesc& renderPass) const override; void unbind() const override; private: void prepareResource(const std::string& debugName, Result* outResult); void updateDrawableInternal(SurfaceTextures surfaceTextures, bool updateDepthStencil); bool initialized_ = false; friend class Framebuffer; // Needed to enable copyBytesColorAttachment FramebufferDesc renderTarget_; // attachments mutable RenderPassDesc renderPass_; }; class CurrentFramebuffer final : public Framebuffer { public: using Super = Framebuffer; explicit CurrentFramebuffer(IContext& context); // IFramebuffer std::vector getColorAttachmentIndices() const override; std::shared_ptr getColorAttachment(size_t index) const override; std::shared_ptr getResolveColorAttachment(size_t index) const override; std::shared_ptr getDepthAttachment() const override; std::shared_ptr getResolveDepthAttachment() const override; std::shared_ptr getStencilAttachment() const override; void updateDrawable(std::shared_ptr texture) override; void updateDrawable(SurfaceTextures surfaceTextures) override; void updateResolveAttachment(std::shared_ptr texture) override; [[nodiscard]] FramebufferMode getMode() const override; // opengl::Framebuffer Viewport getViewport() const override; void bind(const RenderPassDesc& renderPass) const override; void unbind() const override; private: Viewport viewport_; std::shared_ptr colorAttachment_; }; } // namespace opengl } // namespace igl ================================================ FILE: src/igl/opengl/FramebufferWrapper.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::opengl { /// @brief OpenGL-specific FramebufferWrapper that returns the GL framebuffer ID // @fb-only class FramebufferWrapper final : public igl::FramebufferWrapper { public: using igl::FramebufferWrapper::FramebufferWrapper; [[nodiscard]] void* IGL_NULLABLE getNativeFramebuffer() const override { const auto& fb = getFramebuffer(); if (!fb) { return nullptr; } auto* oglFb = static_cast(fb.get()); nativeId_ = oglFb->getId(); return &nativeId_; } private: mutable GLuint nativeId_ = 0; }; } // namespace igl::opengl ================================================ FILE: src/igl/opengl/GLFunc.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only // NOLINTBEGIN(readability-identifier-naming) #include #include #include #if IGL_EGL #include #define IGL_GET_PROC_ADDRESS eglGetProcAddress #elif IGL_WGL #include #include #define IGL_GET_PROC_ADDRESS wglGetProcAddress #else #define IGL_GET_PROC_ADDRESS(funcName) nullptr #endif // IGL_EGL // When using OpenGL, Tracy needs glQueryCounterEXT to be defined, but it's not available in all // platforms or OpenGL versions. The following is a workaround to make Tracy work in all platforms. // Note: OpenGL has not been tested with Tracy yet, and that's why the workaround works with OpenGL #if defined(IGL_WITH_TRACY) #if !defined GL_TIMESTAMP && defined GL_TIMESTAMP_EXT extern "C" void glQueryCounterEXT(GLuint, GLenum) {} #endif #endif #if defined(__clang__) #define ROAI __attribute__((annotate("ro_after_init"))) #else #define ROAI #endif #define GLEXTENSION_DIRECT_CALL(funcName, funcType, ...) funcName(__VA_ARGS__); #define GLEXTENSION_DIRECT_CALL_WITH_RETURN(funcName, funcType, returnOnError, ...) \ return funcName(__VA_ARGS__); #define GLEXTENSION_LOAD_AND_CALL(funcName, funcType, ...) \ static ROAI funcType funcAddr = nullptr; \ if (funcAddr == nullptr) { \ funcAddr = (funcType)IGL_GET_PROC_ADDRESS(#funcName); \ } \ if (funcAddr != nullptr) { \ funcAddr(__VA_ARGS__); \ } else { \ IGL_DEBUG_ABORT("Extension function " #funcName " not found"); \ } #define GLEXTENSION_LOAD_AND_CALL_WITH_RETURN(funcName, funcType, returnOnError, ...) \ static ROAI funcType funcAddr = nullptr; \ if (funcAddr == nullptr) { \ funcAddr = (funcType)IGL_GET_PROC_ADDRESS(#funcName); \ } \ if (funcAddr != nullptr) { \ return funcAddr(__VA_ARGS__); \ } else { \ IGL_DEBUG_ABORT("Extension function " #funcName " not found"); \ return returnOnError; \ } #define GLEXTENSION_UNAVAILABLE(funcName, funcType, ...) \ IGL_DEBUG_ABORT("Extension function " #funcName " not found"); #define GLEXTENSION_UNAVAILABLE_WITH_RETURN(funcName, funcType, returnOnError, ...) \ IGL_DEBUG_ABORT("Extension function " #funcName " not found"); \ return returnOnError; #if IGL_EGL || IGL_WGL #define CAN_LOAD true #else #define CAN_LOAD false #endif // IGL_EGL || IGL_WGL #if IGL_WGL || IGL_PLATFORM_APPLE #define CAN_CALL 1 #define CAN_CALL_OPENGL_ES IGL_OPENGL_ES #define CAN_CALL_OPENGL IGL_OPENGL #else #define CAN_CALL 0 #define CAN_CALL_OPENGL_ES 0 #define CAN_CALL_OPENGL 0 #endif // IGL_WGL || IGL_PLATFORM_APPLE // Special defines for functionality that is always available in OpenGL or OpenGL ES // Always available means supported from OpenGL 2.0 or OpenGL ES 2.0. #if CAN_CALL #define OPENGL_ES_OR_CAN_CALL 1 #define OPENGL_OR_CAN_CALL 1 #else #define OPENGL_ES_OR_CAN_CALL IGL_OPENGL_ES #define OPENGL_OR_CAN_CALL IGL_OPENGL #endif // Set up redirections with boolean 0 or 1 flags depending on support // The first 0 or 1 indicates whether the method can be directly called. // The second 0 or 1 indicates whether the method can be dynamically loaded. #define GLEXTENSION_1_1(funcName, funcType, ...) \ GLEXTENSION_DIRECT_CALL(funcName, funcType, __VA_ARGS__) #define GLEXTENSION_1_0(funcName, funcType, ...) \ GLEXTENSION_DIRECT_CALL(funcName, funcType, __VA_ARGS__) #define GLEXTENSION_0_1(funcName, funcType, ...) \ GLEXTENSION_LOAD_AND_CALL(funcName, funcType, __VA_ARGS__) #define GLEXTENSION_0_0(funcName, funcType, ...) \ GLEXTENSION_UNAVAILABLE(funcName, funcType, __VA_ARGS__) #define GLEXTENSION_WITH_RETURN_1_1(funcName, funcType, returnOnError, ...) \ GLEXTENSION_DIRECT_CALL_WITH_RETURN(funcName, funcType, returnOnError, __VA_ARGS__) #define GLEXTENSION_WITH_RETURN_1_0(funcName, funcType, returnOnError, ...) \ GLEXTENSION_DIRECT_CALL_WITH_RETURN(funcName, funcType, returnOnError, __VA_ARGS__) #define GLEXTENSION_WITH_RETURN_0_1(funcName, funcType, returnOnError, ...) \ GLEXTENSION_LOAD_AND_CALL_WITH_RETURN(funcName, funcType, returnOnError, __VA_ARGS__) #define GLEXTENSION_WITH_RETURN_0_0(funcName, funcType, returnOnError, ...) \ GLEXTENSION_UNAVAILABLE_WITH_RETURN(funcName, funcType, returnOnError, __VA_ARGS__) // Expands to GLEXTENSION_A_B where: // A is 1 if the function is directly callable (0 otherwise) // B is 1 if the function can be dynamically loaded (0 otherwise) // This in turns expands into GLEXTENSION_DIRECT_CALL, GLEXTENSION_LOAD_AND_CALL or // GLEXTENSION_UNAVAILABLE, and the arguments are passed along to these. // This depends on CAN_CALL_funcName being defined as 0 or 1. #define GLEXTENSION_METHOD_BODY_EXPAND(canCall, canLoad, funcName, funcType, ...) \ GLEXTENSION_##canCall##_##canLoad(funcName, funcType, __VA_ARGS__) #define GLEXTENSION_METHOD_BODY_WITH_RETURN_EXPAND( \ canCall, canLoad, funcName, funcType, returnOnError, ...) \ GLEXTENSION_WITH_RETURN_##canCall##_##canLoad(funcName, funcType, returnOnError, __VA_ARGS__) #if CAN_LOAD #define GLEXTENSION_METHOD_BODY(canCall, funcName, funcType, ...) \ GLEXTENSION_METHOD_BODY_EXPAND(canCall, 1, funcName, funcType, __VA_ARGS__) #define GLEXTENSION_METHOD_BODY_WITH_RETURN(canCall, funcName, funcType, returnOnError, ...) \ GLEXTENSION_METHOD_BODY_WITH_RETURN_EXPAND( \ canCall, 1, funcName, funcType, returnOnError, __VA_ARGS__) #else #define GLEXTENSION_METHOD_BODY(canCall, funcName, funcType, ...) \ GLEXTENSION_METHOD_BODY_EXPAND(canCall, 0, funcName, funcType, __VA_ARGS__) #define GLEXTENSION_METHOD_BODY_WITH_RETURN(canCall, funcName, funcType, returnOnError, ...) \ GLEXTENSION_METHOD_BODY_WITH_RETURN_EXPAND( \ canCall, 0, funcName, funcType, returnOnError, __VA_ARGS__) #endif IGL_EXTERN_BEGIN ///-------------------------------------- /// MARK: - OpenGL ES / OpenGL #if IGL_OPENGL #define CAN_CALL_glClearDepth OPENGL_OR_CAN_CALL #define CAN_CALL_glMapBuffer CAN_CALL #else #define CAN_CALL_glClearDepth 0 #define CAN_CALL_glMapBuffer 0 #endif #if IGL_OPENGL || defined(GL_ES_VERSION_3_0) #define CAN_CALL_glDrawBuffers OPENGL_OR_CAN_CALL #else #define CAN_CALL_glDrawBuffers 0 #endif #if IGL_OPENGL || defined(GL_ES_VERSION_3_0) #define CAN_CALL_glCompressedTexImage3D OPENGL_OR_CAN_CALL #define CAN_CALL_glCompressedTexSubImage3D OPENGL_OR_CAN_CALL #define CAN_CALL_glTexImage3D OPENGL_OR_CAN_CALL #define CAN_CALL_glTexSubImage3D OPENGL_OR_CAN_CALL #define CAN_CALL_glUnmapBuffer OPENGL_OR_CAN_CALL #else #define CAN_CALL_glCompressedTexImage3D 0 #define CAN_CALL_glCompressedTexSubImage3D 0 #define CAN_CALL_glTexImage3D 0 #define CAN_CALL_glTexSubImage3D 0 #define CAN_CALL_glUnmapBuffer 0 #endif #if defined(GL_VERSION_3_0) || defined(GL_ES_VERSION_3_0) #define CAN_CALL_glClearBufferfv CAN_CALL #define CAN_CALL_glGetStringi CAN_CALL #else #define CAN_CALL_glClearBufferfv 0 #define CAN_CALL_glGetStringi 0 #endif #if defined(GL_VERSION_3_1) || defined(GL_ES_VERSION_3_0) #define CAN_CALL_glDrawElementsInstanced CAN_CALL #else #define CAN_CALL_glDrawElementsInstanced 0 #endif #if defined(GL_VERSION_3_1) || defined(GL_ES_VERSION_3_0) #define CAN_CALL_glDrawArraysInstanced CAN_CALL #else #define CAN_CALL_glDrawArraysInstanced 0 #endif #if defined(GL_VERSION_4_3) || defined(GL_ES_VERSION_3_2) #define CAN_CALL_glDebugMessageCallback CAN_CALL #define CAN_CALL_glDebugMessageInsert CAN_CALL #define CAN_CALL_glGetDebugMessageLog CAN_CALL #define CAN_CALL_glObjectLabel CAN_CALL #define CAN_CALL_glPopDebugGroup CAN_CALL #define CAN_CALL_glPushDebugGroup CAN_CALL #else #define CAN_CALL_glDebugMessageCallback 0 #define CAN_CALL_glDebugMessageInsert 0 #define CAN_CALL_glGetDebugMessageLog 0 #define CAN_CALL_glObjectLabel 0 #define CAN_CALL_glPopDebugGroup 0 #define CAN_CALL_glPushDebugGroup 0 #endif #if defined(GL_VERSION_3_3) || defined(GL_ES_VERSION_3_0) #define CAN_CALL_glVertexAttribDivisor CAN_CALL #else #define CAN_CALL_glVertexAttribDivisor 0 #endif void iglDebugMessageCallback(PFNIGLDEBUGPROC callback, const void* userParam) { GLEXTENSION_METHOD_BODY(CAN_CALL_glDebugMessageCallback, glDebugMessageCallback, PFNIGLDEBUGMESSAGECALLBACKPROC, callback, userParam); } void iglDebugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf) { GLEXTENSION_METHOD_BODY(CAN_CALL_glDebugMessageInsert, glDebugMessageInsert, PFNIGLDEBUGMESSAGEINSERTPROC, source, type, id, severity, length, buf); } void iglClearBufferfv(GLenum buffer, GLint drawBuffer, const GLfloat* value) { GLEXTENSION_METHOD_BODY( CAN_CALL_glClearBufferfv, glClearBufferfv, PFNIGLCLEARBUFFERFVPROC, buffer, drawBuffer, value) } void iglClearDepth(GLfloat depth) { GLEXTENSION_METHOD_BODY(CAN_CALL_glClearDepth, glClearDepth, PFNIGLCLEARDEPTHPROC, depth) } void iglCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data) { GLEXTENSION_METHOD_BODY(CAN_CALL_glCompressedTexImage3D, glCompressedTexImage3D, PFNIGLCOMPRESSEDTEXIMAGE3DPROC, target, level, internalformat, width, height, depth, border, imageSize, data); } void iglCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data) { GLEXTENSION_METHOD_BODY(CAN_CALL_glCompressedTexSubImage3D, glCompressedTexSubImage3D, PFNIGLCOMPRESSEDTEXSUBIMAGE3DPROC, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); } void iglDrawBuffers(GLsizei n, const GLenum* bufs) { GLEXTENSION_METHOD_BODY(CAN_CALL_glDrawBuffers, glDrawBuffers, PFNIGLDRAWBUFFERSPROC, n, bufs); } GLuint iglGetDebugMessageLog(GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog) { GLEXTENSION_METHOD_BODY_WITH_RETURN(CAN_CALL_glGetDebugMessageLog, glGetDebugMessageLog, PFNIGLGETDEBUGMESSAGELOGPROC, 0, count, bufSize, sources, types, ids, severities, lengths, messageLog); } const GLubyte* iglGetStringi(GLenum name, GLuint index) { GLEXTENSION_METHOD_BODY_WITH_RETURN( CAN_CALL_glGetStringi, glGetStringi, PFNIGLGETSTRINGIPROC, nullptr, name, index); } void* iglMapBuffer(GLenum target, GLbitfield access) { GLEXTENSION_METHOD_BODY_WITH_RETURN( CAN_CALL_glMapBuffer, glMapBuffer, PFNIGLMAPBUFFERPROC, nullptr, target, access); } void iglObjectLabel(GLenum identifier, GLuint name, GLsizei length, const char* label) { GLEXTENSION_METHOD_BODY(CAN_CALL_glObjectLabel, glObjectLabel, PFNIGLOBJECTLABELPROC, identifier, name, length, label); } void iglPopDebugGroup() { GLEXTENSION_METHOD_BODY(CAN_CALL_glPopDebugGroup, glPopDebugGroup, PFNIGLPOPDEBUGGROUPPROC); } void iglPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar* message) { GLEXTENSION_METHOD_BODY(CAN_CALL_glPushDebugGroup, glPushDebugGroup, PFNIGLPUSHDEBUGGROUPPROC, source, id, length, message); } void iglTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* data) { GLEXTENSION_METHOD_BODY(CAN_CALL_glTexImage3D, glTexImage3D, PFNIGLTEXIMAGE3DPROC, target, level, internalformat, width, height, depth, border, format, type, data); } void iglTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels) { GLEXTENSION_METHOD_BODY(CAN_CALL_glTexSubImage3D, glTexSubImage3D, PFNIGLTEXSUBIMAGE3DPROC, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); } void iglUnmapBuffer(GLenum target) { GLEXTENSION_METHOD_BODY(CAN_CALL_glUnmapBuffer, glUnmapBuffer, PFNIGLUNMAPBUFFERPROC, target); } void iglVertexAttribDivisor(GLuint index, GLuint divisor) { GLEXTENSION_METHOD_BODY(CAN_CALL_glVertexAttribDivisor, glVertexAttribDivisor, PFNIGLVERTEXATTRIBDIVISORPROC, index, divisor); } void iglDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instancecount) { GLEXTENSION_METHOD_BODY(CAN_CALL_glDrawElementsInstanced, glDrawElementsInstanced, PFNIGLDRAWELEMENTSINSTANCEDPROC, mode, count, type, indices, instancecount); } void iglDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei primcount) { GLEXTENSION_METHOD_BODY(CAN_CALL_glDrawArraysInstanced, glDrawArraysInstanced, PFNIGLDRAWARRAYSINSTANCEDPROC, mode, first, count, primcount); } ///-------------------------------------- /// MARK: - GL_APPLE_framebuffer_multisample #if defined(GL_APPLE_framebuffer_multisample) #define CAN_CALL_glRenderbufferStorageMultisampleAPPLE CAN_CALL_OPENGL_ES #else #define CAN_CALL_glRenderbufferStorageMultisampleAPPLE 0 #endif void iglRenderbufferStorageMultisampleAPPLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { GLEXTENSION_METHOD_BODY(CAN_CALL_glRenderbufferStorageMultisampleAPPLE, glRenderbufferStorageMultisampleAPPLE, PFNIGLRENDERBUFFERSTORAGEMULTISAMPLEPROC, target, samples, internalformat, width, height); } ///-------------------------------------- /// MARK: - GL_APPLE_sync #if defined(GL_APPLE_sync) #define CAN_CALL_glDeleteSyncAPPLE CAN_CALL_OPENGL_ES #define CAN_CALL_glFenceSyncAPPLE CAN_CALL_OPENGL_ES #define CAN_CALL_glGetSyncivAPPLE CAN_CALL_OPENGL_ES #else #define CAN_CALL_glDeleteSyncAPPLE 0 #define CAN_CALL_glFenceSyncAPPLE 0 #define CAN_CALL_glGetSyncivAPPLE 0 #endif void iglDeleteSyncAPPLE(GLsync sync) { GLEXTENSION_METHOD_BODY( CAN_CALL_glDeleteSyncAPPLE, glDeleteSyncAPPLE, PFNIGLDELETESYNCPROC, sync); } GLsync iglFenceSyncAPPLE(GLenum condition, GLbitfield flags) { GLEXTENSION_METHOD_BODY_WITH_RETURN( CAN_CALL_glFenceSyncAPPLE, glFenceSyncAPPLE, PFNIGLFENCESYNCPROC, GL_ZERO, condition, flags); } void iglGetSyncivAPPLE(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values) { GLEXTENSION_METHOD_BODY(CAN_CALL_glGetSyncivAPPLE, glGetSyncivAPPLE, PFNIGLGETSYNCIVPROC, sync, pname, bufSize, length, values); } ///-------------------------------------- /// MARK: - GL_ARB_bindless_texture #if defined(GL_ARB_bindless_texture) #define CAN_CALL_glGetTextureHandleARB CAN_CALL_OPENGL #define CAN_CALL_glMakeTextureHandleResidentARB CAN_CALL_OPENGL #define CAN_CALL_glMakeTextureHandleNonResidentARB CAN_CALL_OPENGL #else #define CAN_CALL_glGetTextureHandleARB 0 #define CAN_CALL_glMakeTextureHandleResidentARB 0 #define CAN_CALL_glMakeTextureHandleNonResidentARB 0 #endif GLuint64 iglGetTextureHandleARB(GLuint texture) { GLEXTENSION_METHOD_BODY_WITH_RETURN(CAN_CALL_glGetTextureHandleARB, glGetTextureHandleARB, PFNIGLGETTEXTUREHANDLEPROC, GL_ZERO, texture); } void iglMakeTextureHandleResidentARB(GLuint64 handle) { GLEXTENSION_METHOD_BODY(CAN_CALL_glMakeTextureHandleResidentARB, glMakeTextureHandleResidentARB, PFNIGLMAKETEXTUREHANDLERESIDENTPROC, handle); } void iglMakeTextureHandleNonResidentARB(GLuint64 handle) { GLEXTENSION_METHOD_BODY(CAN_CALL_glMakeTextureHandleNonResidentARB, glMakeTextureHandleNonResidentARB, PFNIGLMAKETEXTUREHANDLENONRESIDENTPROC, handle); } ///-------------------------------------- /// MARK: - GL_ARB_compute_shader #if defined(GL_VERSION_4_3) || defined(GL_ES_VERSION_3_1) || defined(GL_ARB_compute_shader) #define CAN_CALL_glDispatchCompute CAN_CALL #else #define CAN_CALL_glDispatchCompute 0 #endif void iglDispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ) { GLEXTENSION_METHOD_BODY(CAN_CALL_glDispatchCompute, glDispatchCompute, PFNIGLDISPATCHCOMPUTEPROC, numGroupsX, numGroupsY, numGroupsZ); } ///-------------------------------------- /// MARK: - GL_ARB_draw_indirect #if defined(GL_VERSION_4_0) || defined(GL_ES_VERSION_3_1) || defined(GL_ARB_draw_indirect) #define CAN_CALL_glDrawElementsIndirect CAN_CALL #define CAN_CALL_glDrawArraysIndirect CAN_CALL #else #define CAN_CALL_glDrawElementsIndirect 0 #define CAN_CALL_glDrawArraysIndirect 0 #endif void iglDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid* indirect) { GLEXTENSION_METHOD_BODY(CAN_CALL_glDrawElementsIndirect, glDrawElementsIndirect, PFNIGLDRAWELEMENTSINDIRECTPROC, mode, type, indirect); } void iglDrawArraysIndirect(GLenum mode, const GLvoid* indirect) { GLEXTENSION_METHOD_BODY(CAN_CALL_glDrawArraysIndirect, glDrawArraysIndirect, PFNIGLDRAWARRAYSINDIRECTPROC, mode, indirect); } ///-------------------------------------- /// MARK: - GL_ARB_multi_draw_indirect #if defined(GL_VERSION_4_3) || defined(GL_ARB_multi_draw_indirect) #define CAN_CALL_glMultiDrawArraysIndirect CAN_CALL #define CAN_CALL_glMultiDrawElementsIndirect CAN_CALL #else #define CAN_CALL_glMultiDrawArraysIndirect 0 #define CAN_CALL_glMultiDrawElementsIndirect 0 #endif void iglMultiDrawArraysIndirect(GLenum mode, const void* indirect, GLsizei drawcount, GLsizei stride) { GLEXTENSION_METHOD_BODY(CAN_CALL_glMultiDrawArraysIndirect, glMultiDrawArraysIndirect, PFNIGLMULTIDRAWARRAYSINDIRECTPROC, mode, indirect, drawcount, stride); } void iglMultiDrawElementsIndirect(GLenum mode, GLenum type, const void* indirect, GLsizei drawcount, GLsizei stride) { GLEXTENSION_METHOD_BODY(CAN_CALL_glMultiDrawElementsIndirect, glMultiDrawElementsIndirect, PFNIGLMULTIDRAWELEMENTSINDIRECTPROC, mode, type, indirect, drawcount, stride); } ///-------------------------------------- /// MARK: - GL_ARB_ES2_compatibility #if IGL_OPENGL_ES || defined(GL_VERSION_4_1) || defined(GL_ARB_ES2_compatibility) #define CAN_CALL_glClearDepthf OPENGL_ES_OR_CAN_CALL #else #define CAN_CALL_glClearDepthf 0 #endif void iglClearDepthf(GLfloat depth){ GLEXTENSION_METHOD_BODY(CAN_CALL_glClearDepthf, glClearDepthf, PFNIGLCLEARDEPTHFPROC, depth)} ///-------------------------------------- /// MARK: - GL_ARB_framebuffer_object #if defined(GL_VERSION_3_0) || defined(GL_ES_VERSION_3_0) || defined(GL_ARB_framebuffer_object) #define CAN_CALL_glBlitFramebuffer CAN_CALL #define CAN_CALL_glFramebufferTextureLayer CAN_CALL #define CAN_CALL_glRenderbufferStorageMultisample CAN_CALL #else #define CAN_CALL_glBlitFramebuffer 0 #define CAN_CALL_glFramebufferTextureLayer 0 #define CAN_CALL_glRenderbufferStorageMultisample 0 #endif #if defined(GL_VERSION_3_0) || defined(GL_ES_VERSION_2_0) || defined(GL_ARB_framebuffer_object) #define CAN_CALL_glBindFramebuffer OPENGL_ES_OR_CAN_CALL #define CAN_CALL_glBindRenderbuffer OPENGL_ES_OR_CAN_CALL #define CAN_CALL_glCheckFramebufferStatus OPENGL_ES_OR_CAN_CALL #define CAN_CALL_glDeleteFramebuffers OPENGL_ES_OR_CAN_CALL #define CAN_CALL_glDeleteRenderbuffers OPENGL_ES_OR_CAN_CALL #define CAN_CALL_glFramebufferRenderbuffer OPENGL_ES_OR_CAN_CALL #define CAN_CALL_glFramebufferTexture2D OPENGL_ES_OR_CAN_CALL #define CAN_CALL_glGenerateMipmap OPENGL_ES_OR_CAN_CALL #define CAN_CALL_glGenFramebuffers OPENGL_ES_OR_CAN_CALL #define CAN_CALL_glGenRenderbuffers OPENGL_ES_OR_CAN_CALL #define CAN_CALL_glGetFramebufferAttachmentParameteriv OPENGL_ES_OR_CAN_CALL #define CAN_CALL_glGetRenderbufferParameteriv OPENGL_ES_OR_CAN_CALL #define CAN_CALL_glIsFramebuffer OPENGL_ES_OR_CAN_CALL #define CAN_CALL_glIsRenderbuffer OPENGL_ES_OR_CAN_CALL #define CAN_CALL_glRenderbufferStorage OPENGL_ES_OR_CAN_CALL #else #define CAN_CALL_glBindFramebuffer 0 #define CAN_CALL_glBindRenderbuffer 0 #define CAN_CALL_glBlitFramebuffer 0 #define CAN_CALL_glCheckFramebufferStatus 0 #define CAN_CALL_glDeleteFramebuffers 0 #define CAN_CALL_glDeleteRenderbuffers 0 #define CAN_CALL_glFramebufferRenderbuffer 0 #define CAN_CALL_glFramebufferTexture2D 0 #define CAN_CALL_glGenerateMipmap 0 #define CAN_CALL_glGenFramebuffers 0 #define CAN_CALL_glGenRenderbuffers 0 #define CAN_CALL_glGetFramebufferAttachmentParameteriv 0 #define CAN_CALL_glGetRenderbufferParameteriv 0 #define CAN_CALL_glIsFramebuffer 0 #define CAN_CALL_glIsRenderbuffer 0 #define CAN_CALL_glRenderbufferStorage 0 #endif void iglBindFramebuffer(GLenum target, GLuint framebuffer) { GLEXTENSION_METHOD_BODY(CAN_CALL_glBindFramebuffer, glBindFramebuffer, PFNIGLBINDFRAMEBUFFERPROC, target, framebuffer); } void iglBindRenderbuffer(GLenum target, GLuint renderbuffer) { GLEXTENSION_METHOD_BODY(CAN_CALL_glBindRenderbuffer, glBindRenderbuffer, PFNIGLBINDRENDERBUFFERPROC, target, renderbuffer); } void iglBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) { GLEXTENSION_METHOD_BODY(CAN_CALL_glBlitFramebuffer, glBlitFramebuffer, PFNIGLBLITFRAMEBUFFERPROC, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); } GLenum iglCheckFramebufferStatus(GLenum target) { GLEXTENSION_METHOD_BODY_WITH_RETURN(CAN_CALL_glCheckFramebufferStatus, glCheckFramebufferStatus, PFNIGLCHECKFRAMEBUFFERSTATUSPROC, GL_FRAMEBUFFER_UNDEFINED, target); } void iglDeleteFramebuffers(GLsizei n, const GLuint* framebuffers) { GLEXTENSION_METHOD_BODY(CAN_CALL_glDeleteFramebuffers, glDeleteFramebuffers, PFNIGLDELETEFRAMEBUFFERSPROC, n, framebuffers); } void iglDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers) { GLEXTENSION_METHOD_BODY(CAN_CALL_glDeleteRenderbuffers, glDeleteRenderbuffers, PFNIGLDELETERENDERBUFFERSPROC, n, renderbuffers); } void iglFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) { GLEXTENSION_METHOD_BODY(CAN_CALL_glFramebufferRenderbuffer, glFramebufferRenderbuffer, PFNIGLFRAMEBUFFERRENDERBUFFERPROC, target, attachment, renderbuffertarget, renderbuffer); } void iglFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) { GLEXTENSION_METHOD_BODY(CAN_CALL_glFramebufferTexture2D, glFramebufferTexture2D, PFNIGLFRAMEBUFFERTEXTURE2DPROC, target, attachment, textarget, texture, level); } void iglFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) { GLEXTENSION_METHOD_BODY(CAN_CALL_glFramebufferTextureLayer, glFramebufferTextureLayer, PFNIGLFRAMEBUFFERTEXTURELAYERPROC, target, attachment, texture, level, layer); } void iglGenerateMipmap(GLenum target) { GLEXTENSION_METHOD_BODY( CAN_CALL_glGenerateMipmap, glGenerateMipmap, PFNIGLGENERATEMIPMAPPROC, target); } void iglGenFramebuffers(GLsizei n, GLuint* framebuffers) { GLEXTENSION_METHOD_BODY( CAN_CALL_glGenFramebuffers, glGenFramebuffers, PFNIGLGENFRAMEBUFFERSPROC, n, framebuffers); } void iglGenRenderbuffers(GLsizei n, GLuint* renderbuffers) { GLEXTENSION_METHOD_BODY(CAN_CALL_glGenRenderbuffers, glGenRenderbuffers, PFNIGLGENRENDERBUFFERSPROC, n, renderbuffers); } void iglGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params) { GLEXTENSION_METHOD_BODY(CAN_CALL_glGetFramebufferAttachmentParameteriv, glGetFramebufferAttachmentParameteriv, PFNIGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC, target, attachment, pname, params); } void iglGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params) { GLEXTENSION_METHOD_BODY(CAN_CALL_glGetRenderbufferParameteriv, glGetRenderbufferParameteriv, PFNIGLGETRENDERBUFFERPARAMETERIVPROC, target, pname, params); } GLboolean iglIsFramebuffer(GLuint framebuffer) { GLEXTENSION_METHOD_BODY_WITH_RETURN( CAN_CALL_glIsFramebuffer, glIsFramebuffer, PFNIGLISFRAMEBUFFERPROC, GL_FALSE, framebuffer); } GLboolean iglIsRenderbuffer(GLuint renderbuffer) { GLEXTENSION_METHOD_BODY_WITH_RETURN(CAN_CALL_glIsRenderbuffer, glIsRenderbuffer, PFNIGLISRENDERBUFFERPROC, GL_FALSE, renderbuffer); } void iglRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) { GLEXTENSION_METHOD_BODY(CAN_CALL_glRenderbufferStorage, glRenderbufferStorage, PFNIGLRENDERBUFFERSTORAGEPROC, target, internalformat, width, height); } void iglRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height){ GLEXTENSION_METHOD_BODY(CAN_CALL_glRenderbufferStorageMultisample, glRenderbufferStorageMultisample, PFNIGLRENDERBUFFERSTORAGEMULTISAMPLEPROC, target, samples, internalformat, width, height)} ///-------------------------------------- /// MARK: - GL_ARB_invalidate_subdata #if defined(GL_VERSION_4_3) || defined(GL_ES_VERSION_3_0) || defined(GL_ARB_invalidate_subdata) #define CAN_CALL_glInvalidateFramebuffer CAN_CALL #else #define CAN_CALL_glInvalidateFramebuffer 0 #endif void iglInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments) { GLEXTENSION_METHOD_BODY(CAN_CALL_glInvalidateFramebuffer, glInvalidateFramebuffer, PFNIGLINVALIDATEFRAMEBUFFERPROC, target, numAttachments, attachments); } ///-------------------------------------- /// MARK: - GL_ARB_map_buffer_range #if defined(GL_VERSION_3_0) || defined(GL_ES_VERSION_3_0) || defined(GL_ARB_map_buffer_range) #define CAN_CALL_glMapBufferRange CAN_CALL #else #define CAN_CALL_glMapBufferRange 0 #endif void* iglMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) { GLEXTENSION_METHOD_BODY_WITH_RETURN(CAN_CALL_glMapBufferRange, glMapBufferRange, PFNIGLMAPBUFFERRANGEPROC, nullptr, target, offset, length, access); } ///-------------------------------------- /// MARK: - GL_ARB_program_interface_query #if defined(GL_VERSION_4_3) || defined(GL_ES_VERSION_3_1) || defined(GL_ARB_program_interface_query) #define CAN_CALL_glGetProgramInterfaceiv CAN_CALL #define CAN_CALL_glGetProgramResourceIndex CAN_CALL #define CAN_CALL_glGetProgramResourceiv CAN_CALL #define CAN_CALL_glGetProgramResourceName CAN_CALL #else #define CAN_CALL_glGetProgramInterfaceiv 0 #define CAN_CALL_glGetProgramResourceIndex 0 #define CAN_CALL_glGetProgramResourceiv 0 #define CAN_CALL_glGetProgramResourceName 0 #endif void iglGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint* params) { GLEXTENSION_METHOD_BODY(CAN_CALL_glGetProgramInterfaceiv, glGetProgramInterfaceiv, PFNIGLGETPROGRAMINTERFACEIVPROC, program, programInterface, pname, params); } GLuint iglGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar* name) { GLEXTENSION_METHOD_BODY_WITH_RETURN(CAN_CALL_glGetProgramResourceIndex, glGetProgramResourceIndex, PFNIGLGETPROGRAMRESOURCEINDEXPROC, GL_INVALID_INDEX, program, programInterface, name); } void iglGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei count, GLsizei* length, GLint* params) { GLEXTENSION_METHOD_BODY(CAN_CALL_glGetProgramResourceiv, glGetProgramResourceiv, PFNIGLGETPROGRAMRESOURCEIVPROC, program, programInterface, index, propCount, props, count, length, params) } void iglGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei* length, char* name){ GLEXTENSION_METHOD_BODY(CAN_CALL_glGetProgramResourceName, glGetProgramResourceName, PFNIGLGETPROGRAMRESOURCENAMEPROC, program, programInterface, index, bufSize, length, name)} ///-------------------------------------- /// MARK: - GL_ARB_shader_image_load_store #if defined(GL_VERSION_4_2) || defined(GL_ES_VERSION_3_1) || defined(GL_ARB_shader_image_load_store) #define CAN_CALL_glBindImageTexture CAN_CALL #define CAN_CALL_glMemoryBarrier CAN_CALL #else #define CAN_CALL_glBindImageTexture 0 #define CAN_CALL_glMemoryBarrier 0 #endif void iglBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format) { GLEXTENSION_METHOD_BODY(CAN_CALL_glBindImageTexture, glBindImageTexture, PFNIGLBINDIMAGETEXTUREPROC, unit, texture, level, layered, layer, access, format); } void iglMemoryBarrier(GLbitfield barriers) { GLEXTENSION_METHOD_BODY( CAN_CALL_glMemoryBarrier, glMemoryBarrier, PFNIGLMEMORYBARRIERPROC, barriers); } ///-------------------------------------- /// MARK: - GL_ARB_sync #if defined(GL_VERSION_3_2) || defined(GL_ES_VERSION_3_0) || defined(GL_ARB_sync) #define CAN_CALL_glDeleteSync CAN_CALL #define CAN_CALL_glFenceSync CAN_CALL #define CAN_CALL_glGetSynciv CAN_CALL #else #define CAN_CALL_glDeleteSync 0 #define CAN_CALL_glFenceSync 0 #define CAN_CALL_glGetSynciv 0 #endif void iglDeleteSync(GLsync sync) { GLEXTENSION_METHOD_BODY(CAN_CALL_glDeleteSync, glDeleteSync, PFNIGLDELETESYNCPROC, sync); } GLsync iglFenceSync(GLenum condition, GLbitfield flags) { GLEXTENSION_METHOD_BODY_WITH_RETURN( CAN_CALL_glFenceSync, glFenceSync, PFNIGLFENCESYNCPROC, GL_ZERO, condition, flags); } void iglGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values) { GLEXTENSION_METHOD_BODY( CAN_CALL_glGetSynciv, glGetSynciv, PFNIGLGETSYNCIVPROC, sync, pname, bufSize, length, values); } ///-------------------------------------- /// MARK: - GL_ARB_texture_storage #if defined(GL_VERSION_4_2) || defined(GL_ES_VERSION_3_0) || defined(GL_ARB_texture_storage) #define CAN_CALL_glTexStorage1D CAN_CALL_OPENGL #define CAN_CALL_glTexStorage2D CAN_CALL #if defined(GL_VERSION_2_0) || defined(GL_ES_VERSION_3_0) || defined(GL_OES_texture_3D) #define CAN_CALL_glTexStorage3D CAN_CALL #else #define CAN_CALL_glTexStorage3D 0 #endif #else #define CAN_CALL_glTexStorage1D 0 #define CAN_CALL_glTexStorage2D 0 #define CAN_CALL_glTexStorage3D 0 #endif void iglTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width) { GLEXTENSION_METHOD_BODY(CAN_CALL_glTexStorage1D, glTexStorage1D, PFNIGLTEXSTORAGE1DPROC, target, levels, internalformat, width); } void iglTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) { GLEXTENSION_METHOD_BODY(CAN_CALL_glTexStorage2D, glTexStorage2D, PFNIGLTEXSTORAGE2DPROC, target, levels, internalformat, width, height); } void iglTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) { GLEXTENSION_METHOD_BODY(CAN_CALL_glTexStorage3D, glTexStorage3D, PFNIGLTEXSTORAGE3DPROC, target, levels, internalformat, width, height, depth); } ///-------------------------------------- /// MARK: - GL_ARB_uniform_buffer_object #if defined(GL_VERSION_3_1) || defined(GL_ES_VERSION_3_0) || defined(GL_ARB_uniform_buffer_object) #define CAN_CALL_glBindBufferBase CAN_CALL #define CAN_CALL_glBindBufferRange CAN_CALL #define CAN_CALL_glGetActiveUniformsiv CAN_CALL #define CAN_CALL_glGetActiveUniformBlockiv CAN_CALL #define CAN_CALL_glGetActiveUniformBlockName CAN_CALL #define CAN_CALL_glGetUniformBlockIndex CAN_CALL #define CAN_CALL_glUniformBlockBinding CAN_CALL #else #define CAN_CALL_glBindBufferBase 0 #define CAN_CALL_glBindBufferRange 0 #define CAN_CALL_glGetActiveUniformsiv 0 #define CAN_CALL_glGetActiveUniformBlockiv 0 #define CAN_CALL_glGetActiveUniformBlockName 0 #define CAN_CALL_glGetUniformBlockIndex 0 #define CAN_CALL_glUniformBlockBinding 0 #endif void iglBindBufferBase(GLenum target, GLuint index, GLuint buffer) { GLEXTENSION_METHOD_BODY( CAN_CALL_glBindBufferBase, glBindBufferBase, PFNIGLBINDBUFFERBASEPROC, target, index, buffer); } void iglBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) { GLEXTENSION_METHOD_BODY(CAN_CALL_glBindBufferRange, glBindBufferRange, PFNIGLBINDBUFFERRANGEPROC, target, index, buffer, offset, size); } void iglGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params) { GLEXTENSION_METHOD_BODY(CAN_CALL_glGetActiveUniformsiv, glGetActiveUniformsiv, PFNIGLGETACTIVEUNIFORMSIVPROC, program, uniformCount, uniformIndices, pname, params); } void iglGetActiveUniformBlockiv(GLuint program, GLuint index, GLenum pname, GLint* params) { GLEXTENSION_METHOD_BODY(CAN_CALL_glGetActiveUniformBlockiv, glGetActiveUniformBlockiv, PFNIGLGETACTIVEUNIFORMBLOCKIVPROC, program, index, pname, params); } void iglGetActiveUniformBlockName(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName) { GLEXTENSION_METHOD_BODY(CAN_CALL_glGetActiveUniformBlockName, glGetActiveUniformBlockName, PFNIGLGETACTIVEUNIFORMBLOCKNAMEPROC, program, index, bufSize, length, uniformBlockName); } GLuint iglGetUniformBlockIndex(GLuint program, const GLchar* name) { GLEXTENSION_METHOD_BODY_WITH_RETURN(CAN_CALL_glGetUniformBlockIndex, glGetUniformBlockIndex, PFNIGLGETUNIFORMBLOCKINDEXPROC, GL_INVALID_INDEX, program, name); } void iglUniformBlockBinding(GLuint pid, GLuint uniformBlockIndex, GLuint uniformBlockBinding) { GLEXTENSION_METHOD_BODY(CAN_CALL_glUniformBlockBinding, glUniformBlockBinding, PFNIGLUNIFORMBLOCKBINDINGPROC, pid, uniformBlockIndex, uniformBlockBinding); } ///-------------------------------------- /// MARK: - GL_ARB_vertex_array_object #if defined(GL_VERSION_3_0) || defined(GL_ES_VERSION_3_0) || defined(GL_ARB_vertex_array_object) #define CAN_CALL_glBindVertexArray CAN_CALL #define CAN_CALL_glDeleteVertexArrays CAN_CALL #define CAN_CALL_glGenVertexArrays CAN_CALL #else #define CAN_CALL_glBindVertexArray 0 #define CAN_CALL_glDeleteVertexArrays 0 #define CAN_CALL_glGenVertexArrays 0 #endif void iglBindVertexArray(GLuint vao) { GLEXTENSION_METHOD_BODY( CAN_CALL_glBindVertexArray, glBindVertexArray, PFNIGLBINDVERTEXARRAYPROC, vao); } void iglDeleteVertexArrays(GLsizei n, const GLuint* vertexArrays) { GLEXTENSION_METHOD_BODY(CAN_CALL_glDeleteVertexArrays, glDeleteVertexArrays, PFNIGLDELETEVERTEXARRAYSPROC, n, vertexArrays); } void iglGenVertexArrays(GLsizei n, GLuint* vertexArrays) { GLEXTENSION_METHOD_BODY( CAN_CALL_glGenVertexArrays, glGenVertexArrays, PFNIGLGENVERTEXARRAYSPROC, n, vertexArrays); } ///-------------------------------------- /// MARK: - GL_ARB_polygon_offset_clamp #if defined(GL_ARB_polygon_offset_clamp) #define CAN_CALL_glPolygonOffsetClamp CAN_CALL #else #define CAN_CALL_glPolygonOffsetClamp 0 #endif void iglPolygonOffsetClamp(float factor, float units, float clamp) { GLEXTENSION_METHOD_BODY(CAN_CALL_glPolygonOffsetClamp, glPolygonOffsetClamp, PFNPOLYGONOFFSETCLAMPPROC, factor, units, clamp); } ///-------------------------------------- /// MARK: - GL_EXT_debug_label #if defined(GL_EXT_debug_label) #define CAN_CALL_glLabelObjectEXT CAN_CALL #else #define CAN_CALL_glLabelObjectEXT 0 #endif void iglLabelObjectEXT(GLenum identifier, GLuint name, GLsizei length, const char* label) { GLEXTENSION_METHOD_BODY(CAN_CALL_glLabelObjectEXT, glLabelObjectEXT, PFNIGLOBJECTLABELPROC, identifier, name, length, label); } ///-------------------------------------- /// MARK: - GL_EXT_debug_marker #if defined(GL_EXT_debug_marker) #define CAN_CALL_glInsertEventMarkerEXT CAN_CALL #define CAN_CALL_glPopGroupMarkerEXT CAN_CALL #define CAN_CALL_glPushGroupMarkerEXT CAN_CALL #else #define CAN_CALL_glInsertEventMarkerEXT 0 #define CAN_CALL_glPopGroupMarkerEXT 0 #define CAN_CALL_glPushGroupMarkerEXT 0 #endif void iglInsertEventMarkerEXT(GLenum /*source*/, GLenum /*type*/, GLuint /*id*/, GLenum /*severity*/, GLsizei length, const GLchar* buf) { GLEXTENSION_METHOD_BODY(CAN_CALL_glInsertEventMarkerEXT, glInsertEventMarkerEXT, PFNIGLINSERTEVENTMARKERPROC, length, buf); } void iglPopGroupMarkerEXT() { GLEXTENSION_METHOD_BODY( CAN_CALL_glPopGroupMarkerEXT, glPopGroupMarkerEXT, PFNIGLPOPGROUPMARKERPROC); } void iglPushGroupMarkerEXT(GLenum /*source*/, GLuint /*id*/, GLsizei length, const GLchar* message) { GLEXTENSION_METHOD_BODY(CAN_CALL_glPushGroupMarkerEXT, glPushGroupMarkerEXT, PFNIGLPUSHGROUPMARKERPROC, length, message); } ///-------------------------------------- /// MARK: - GL_EXT_discard_framebuffer #if defined(GL_EXT_discard_framebuffer) #define CAN_CALL_glDiscardFramebufferEXT CAN_CALL_OPENGL_ES #else #define CAN_CALL_glDiscardFramebufferEXT 0 #endif void iglDiscardFramebufferEXT(GLenum target, GLsizei numAttachments, const GLenum* attachments) { GLEXTENSION_METHOD_BODY(CAN_CALL_glDiscardFramebufferEXT, glDiscardFramebufferEXT, PFNIGLDISCARDFRAMEBUFFERPROC, target, numAttachments, attachments); } ///-------------------------------------- /// MARK: - GL_EXT_draw_buffers #if defined(GL_EXT_draw_buffers) #define CAN_CALL_glDrawBuffersEXT CAN_CALL_OPENGL_ES #else #define CAN_CALL_glDrawBuffersEXT 0 #endif void iglDrawBuffersEXT(GLsizei n, const GLenum* bufs) { GLEXTENSION_METHOD_BODY( CAN_CALL_glDrawBuffersEXT, glDrawBuffersEXT, PFNIGLDRAWBUFFERSPROC, n, bufs); } ///-------------------------------------- /// MARK: - GL_EXT_framebuffer_blit #if defined(GL_EXT_framebuffer_blit) #define CAN_CALL_glBlitFramebufferEXT CAN_CALL_OPENGL #else #define CAN_CALL_glBlitFramebufferEXT 0 #endif void iglBlitFramebufferEXT(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) { GLEXTENSION_METHOD_BODY(CAN_CALL_glBlitFramebufferEXT, glBlitFramebufferEXT, PFNIGLBLITFRAMEBUFFERPROC, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); } ///-------------------------------------- /// MARK: - GL_EXT_map_buffer_range #if defined(GL_EXT_map_buffer_range) #define CAN_CALL_glMapBufferRangeEXT CAN_CALL #else #define CAN_CALL_glMapBufferRangeEXT 0 #endif void* iglMapBufferRangeEXT(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) { GLEXTENSION_METHOD_BODY_WITH_RETURN(CAN_CALL_glMapBufferRangeEXT, glMapBufferRangeEXT, PFNIGLMAPBUFFERRANGEPROC, nullptr, target, offset, length, access); } ///-------------------------------------- /// MARK: - GL_EXT_memory_object #if defined(GL_EXT_memory_object) #define CAN_CALL_glCreateMemoryObjectsEXT CAN_CALL #define CAN_CALL_glDeleteMemoryObjectsEXT CAN_CALL #define CAN_CALL_glTexStorageMem2DEXT CAN_CALL #define CAN_CALL_glTexStorageMem3DEXT CAN_CALL #else #define CAN_CALL_glCreateMemoryObjectsEXT 0 #define CAN_CALL_glDeleteMemoryObjectsEXT 0 #define CAN_CALL_glTexStorageMem2DEXT 0 #define CAN_CALL_glTexStorageMem3DEXT 0 #endif void iglCreateMemoryObjectsEXT(GLsizei n, GLuint* memoryObjects) { GLEXTENSION_METHOD_BODY(CAN_CALL_glCreateMemoryObjectsEXT, glCreateMemoryObjectsEXT, PFNIGLCREATEMEMORYOBJECTSPROC, n, memoryObjects); } void iglDeleteMemoryObjectsEXT(GLsizei n, const GLuint* memoryObjects) { GLEXTENSION_METHOD_BODY(CAN_CALL_glDeleteMemoryObjectsEXT, glDeleteMemoryObjectsEXT, PFNIGLDELETEMEMORYOBJECTSPROC, n, memoryObjects); } void iglTexStorageMem2DEXT(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset) { GLEXTENSION_METHOD_BODY(CAN_CALL_glTexStorageMem2DEXT, glTexStorageMem2DEXT, PFNIGLTEXSTORAGEMEM2DPROC, target, levels, internalFormat, width, height, memory, offset); } void iglTexStorageMem3DEXT(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset) { GLEXTENSION_METHOD_BODY(CAN_CALL_glTexStorageMem3DEXT, glTexStorageMem3DEXT, PFNIGLTEXSTORAGEMEM3DPROC, target, levels, internalFormat, width, height, depth, memory, offset); } ///-------------------------------------- /// MARK: - GL_EXT_memory_object_fd #if defined(GL_EXT_memory_object_fd) #define CAN_CALL_glImportMemoryFdEXT CAN_CALL #else #define CAN_CALL_glImportMemoryFdEXT 0 #endif void iglImportMemoryFdEXT(GLuint memory, GLuint64 size, GLenum handleType, GLint fd) { GLEXTENSION_METHOD_BODY(CAN_CALL_glImportMemoryFdEXT, glImportMemoryFdEXT, PFNIGLIMPORTMEMORYFDPROC, memory, size, handleType, fd); } ///-------------------------------------- /// MARK: - GL_EXT_multisampled_render_to_texture #if defined(GL_EXT_multisampled_render_to_texture) #define CAN_CALL_glFramebufferTexture2DMultisampleEXT CAN_CALL_OPENGL_ES #define CAN_CALL_glRenderbufferStorageMultisampleEXT CAN_CALL_OPENGL_ES #else #define CAN_CALL_glFramebufferTexture2DMultisampleEXT 0 #define CAN_CALL_glRenderbufferStorageMultisampleEXT 0 #endif void iglFramebufferTexture2DMultisampleEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples) { GLEXTENSION_METHOD_BODY(CAN_CALL_glFramebufferTexture2DMultisampleEXT, glFramebufferTexture2DMultisampleEXT, PFNIGLFRAMEBUFFERTEXTURE2DMULTISAMPLEPROC, target, attachment, textarget, texture, level, samples) } void iglRenderbufferStorageMultisampleEXT(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height){ GLEXTENSION_METHOD_BODY(CAN_CALL_glRenderbufferStorageMultisampleEXT, glRenderbufferStorageMultisampleEXT, PFNIGLRENDERBUFFERSTORAGEMULTISAMPLEPROC, target, samples, internalformat, width, height)} ///-------------------------------------- /// MARK: - GL_EXT_shader_image_load_store #if defined(GL_EXT_shader_image_load_store) #define CAN_CALL_glBindImageTextureEXT CAN_CALL #define CAN_CALL_glMemoryBarrierEXT CAN_CALL #else #define CAN_CALL_glBindImageTextureEXT 0 #define CAN_CALL_glMemoryBarrierEXT 0 #endif void iglBindImageTextureEXT(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format) { GLEXTENSION_METHOD_BODY(CAN_CALL_glBindImageTextureEXT, glBindImageTextureEXT, PFNIGLBINDIMAGETEXTUREPROC, unit, texture, level, layered, layer, access, format); } void iglMemoryBarrierEXT(GLbitfield barriers) { GLEXTENSION_METHOD_BODY( CAN_CALL_glMemoryBarrierEXT, glMemoryBarrierEXT, PFNIGLMEMORYBARRIERPROC, barriers); } ///-------------------------------------- /// MARK: - GL_EXT_texture_storage #if defined(GL_EXT_texture_storage) #define CAN_CALL_glTexStorage1DEXT CAN_CALL_OPENGL #define CAN_CALL_glTexStorage2DEXT CAN_CALL #if defined(GL_VERSION_2_0) || defined(GL_OES_texture_3D) #define CAN_CALL_glTexStorage3DEXT CAN_CALL #else #define CAN_CALL_glTexStorage3DEXT 0 #endif #else #define CAN_CALL_glTexStorage1DEXT 0 #define CAN_CALL_glTexStorage2DEXT 0 #define CAN_CALL_glTexStorage3DEXT 0 #endif void iglTexStorage1DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width) { GLEXTENSION_METHOD_BODY(CAN_CALL_glTexStorage1DEXT, glTexStorage1DEXT, PFNIGLTEXSTORAGE1DPROC, target, levels, internalformat, width) } void iglTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) { GLEXTENSION_METHOD_BODY(CAN_CALL_glTexStorage2DEXT, glTexStorage2DEXT, PFNIGLTEXSTORAGE2DPROC, target, levels, internalformat, width, height) } void iglTexStorage3DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth){GLEXTENSION_METHOD_BODY(CAN_CALL_glTexStorage3DEXT, glTexStorage3DEXT, PFNIGLTEXSTORAGE3DPROC, target, levels, internalformat, width, height, depth)} ///-------------------------------------- /// MARK: - GL_IMG_multisampled_render_to_texture #if defined(GL_IMG_multisampled_render_to_texture) #define CAN_CALL_glFramebufferTexture2DMultisampleIMG CAN_CALL_OPENGL_ES #define CAN_CALL_glRenderbufferStorageMultisampleIMG CAN_CALL_OPENGL_ES #else #define CAN_CALL_glFramebufferTexture2DMultisampleIMG 0 #define CAN_CALL_glRenderbufferStorageMultisampleIMG 0 #endif void iglFramebufferTexture2DMultisampleIMG(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples) { GLEXTENSION_METHOD_BODY(CAN_CALL_glFramebufferTexture2DMultisampleIMG, glFramebufferTexture2DMultisampleIMG, PFNIGLFRAMEBUFFERTEXTURE2DMULTISAMPLEPROC, target, attachment, textarget, texture, level, samples) } void iglRenderbufferStorageMultisampleIMG(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height){ GLEXTENSION_METHOD_BODY(CAN_CALL_glRenderbufferStorageMultisampleIMG, glRenderbufferStorageMultisampleIMG, PFNIGLRENDERBUFFERSTORAGEMULTISAMPLEPROC, target, samples, internalformat, width, height)} ///-------------------------------------- /// MARK: - GL_KHR_debug #if defined(GL_KHR_debug) #define CAN_CALL_glDebugMessageCallbackKHR CAN_CALL #define CAN_CALL_glDebugMessageInsertKHR CAN_CALL #define CAN_CALL_glGetDebugMessageLogKHR CAN_CALL #define CAN_CALL_glObjectLabelKHR CAN_CALL #define CAN_CALL_glPopDebugGroupKHR CAN_CALL #define CAN_CALL_glPushDebugGroupKHR CAN_CALL #else #define CAN_CALL_glDebugMessageCallbackKHR 0 #define CAN_CALL_glDebugMessageInsertKHR 0 #define CAN_CALL_glGetDebugMessageLogKHR 0 #define CAN_CALL_glObjectLabelKHR 0 #define CAN_CALL_glPopDebugGroupKHR 0 #define CAN_CALL_glPushDebugGroupKHR 0 #endif #if IGL_OPENGL #define DebugMessageCallbackKHR glDebugMessageCallback #define DebugMessageInsertKHR glDebugMessageInsert #define GetDebugMessageLogKHR glGetDebugMessageLog #define ObjectLabelKHR glObjectLabel #define PopDebugGroupKHR glPopDebugGroup #define PushDebugGroupKHR glPushDebugGroup #else #define DebugMessageCallbackKHR glDebugMessageCallbackKHR #define DebugMessageInsertKHR glDebugMessageInsertKHR #define GetDebugMessageLogKHR glGetDebugMessageLogKHR #define ObjectLabelKHR glObjectLabelKHR #define PopDebugGroupKHR glPopDebugGroupKHR #define PushDebugGroupKHR glPushDebugGroupKHR #endif void iglDebugMessageCallbackKHR(PFNIGLDEBUGPROC callback, const void* userParam) { GLEXTENSION_METHOD_BODY(CAN_CALL_glDebugMessageCallbackKHR, DebugMessageCallbackKHR, PFNIGLDEBUGMESSAGECALLBACKPROC, callback, userParam); } void iglDebugMessageInsertKHR(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf) { GLEXTENSION_METHOD_BODY(CAN_CALL_glDebugMessageInsertKHR, DebugMessageInsertKHR, PFNIGLDEBUGMESSAGEINSERTPROC, source, type, id, severity, length, buf); } GLuint iglGetDebugMessageLogKHR(GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog) { GLEXTENSION_METHOD_BODY_WITH_RETURN(CAN_CALL_glGetDebugMessageLogKHR, GetDebugMessageLogKHR, PFNIGLGETDEBUGMESSAGELOGPROC, 0, count, bufSize, sources, types, ids, severities, lengths, messageLog); } void iglObjectLabelKHR(GLenum identifier, GLuint name, GLsizei length, const char* label) { GLEXTENSION_METHOD_BODY(CAN_CALL_glObjectLabelKHR, ObjectLabelKHR, PFNIGLOBJECTLABELPROC, identifier, name, length, label); } void iglPopDebugGroupKHR() { GLEXTENSION_METHOD_BODY(CAN_CALL_glPopDebugGroupKHR, PopDebugGroupKHR, PFNIGLPOPDEBUGGROUPPROC); } void iglPushDebugGroupKHR(GLenum source, GLuint id, GLsizei length, const GLchar* message) { GLEXTENSION_METHOD_BODY(CAN_CALL_glPushDebugGroupKHR, PushDebugGroupKHR, PFNIGLPUSHDEBUGGROUPPROC, source, id, length, message); } ///-------------------------------------- /// MARK: - GL_NV_bindless_texture #if defined(GL_NV_bindless_texture) #define CAN_CALL_glGetTextureHandleNV CAN_CALL #define CAN_CALL_glMakeTextureHandleResidentNV CAN_CALL #define CAN_CALL_glMakeTextureHandleNonResidentNV CAN_CALL #else #define CAN_CALL_glGetTextureHandleNV 0 #define CAN_CALL_glMakeTextureHandleResidentNV 0 #define CAN_CALL_glMakeTextureHandleNonResidentNV 0 #endif GLuint64 iglGetTextureHandleNV(GLuint texture) { GLEXTENSION_METHOD_BODY_WITH_RETURN(CAN_CALL_glGetTextureHandleNV, glGetTextureHandleNV, PFNIGLGETTEXTUREHANDLEPROC, GL_ZERO, texture); } void iglMakeTextureHandleResidentNV(GLuint64 handle) { GLEXTENSION_METHOD_BODY(CAN_CALL_glMakeTextureHandleResidentNV, glMakeTextureHandleResidentNV, PFNIGLMAKETEXTUREHANDLERESIDENTPROC, handle); } void iglMakeTextureHandleNonResidentNV(GLuint64 handle) { GLEXTENSION_METHOD_BODY(CAN_CALL_glMakeTextureHandleNonResidentNV, glMakeTextureHandleNonResidentNV, PFNIGLMAKETEXTUREHANDLENONRESIDENTPROC, handle); } ///-------------------------------------- /// MARK: - GL_NV_instanced_arrays #if defined(GL_NV_instanced_arrays) #define CAN_CALL_glVertexAttribDivisorNV CAN_CALL_OPENGL_ES #else #define CAN_CALL_glVertexAttribDivisorNV 0 #endif void iglVertexAttribDivisorNV(GLuint index, GLuint divisor) { GLEXTENSION_METHOD_BODY(CAN_CALL_glVertexAttribDivisorNV, glVertexAttribDivisorNV, PFNIGLVERTEXATTRIBDIVISORPROC, index, divisor); } ///-------------------------------------- /// MARK: - GL_OVR_multiview #if defined(GL_OVR_multiview) #define CAN_CALL_glFramebufferTextureMultiviewOVR CAN_CALL_OPENGL_ES #else #define CAN_CALL_glFramebufferTextureMultiviewOVR 0 #endif void iglFramebufferTextureMultiviewOVR(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews){ GLEXTENSION_METHOD_BODY(CAN_CALL_glFramebufferTextureMultiviewOVR, glFramebufferTextureMultiviewOVR, PFNIGLFRAMEBUFFERTEXTUREMULTIVIEWPROC, target, attachment, texture, level, baseViewIndex, numViews)} ///-------------------------------------- /// MARK: - GL_OVR_multiview_multisampled_render_to_texture #if defined(GL_OVR_multiview_multisampled_render_to_texture) #define CAN_CALL_glFramebufferTextureMultisampleMultiviewOVR CAN_CALL_OPENGL_ES #else #define CAN_CALL_glFramebufferTextureMultisampleMultiviewOVR 0 #endif void iglFramebufferTextureMultisampleMultiviewOVR(GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei samples, GLint baseViewIndex, GLsizei numViews){ GLEXTENSION_METHOD_BODY(CAN_CALL_glFramebufferTextureMultisampleMultiviewOVR, glFramebufferTextureMultisampleMultiviewOVR, PFNIGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWPROC, target, attachment, texture, level, samples, baseViewIndex, numViews)} ///-------------------------------------- /// MARK: - GL_OES_mapbuffer #if defined(GL_OES_mapbuffer) #define CAN_CALL_glMapBufferOES CAN_CALL_OPENGL_ES #define CAN_CALL_glUnmapBufferOES CAN_CALL_OPENGL_ES #else #define CAN_CALL_glMapBufferOES 0 #define CAN_CALL_glUnmapBufferOES 0 #endif void* iglMapBufferOES(GLenum target, GLbitfield access) { GLEXTENSION_METHOD_BODY_WITH_RETURN( CAN_CALL_glMapBufferOES, glMapBufferOES, PFNIGLMAPBUFFERPROC, nullptr, target, access); } void iglUnmapBufferOES(GLenum target) { GLEXTENSION_METHOD_BODY( CAN_CALL_glUnmapBufferOES, glUnmapBufferOES, PFNIGLUNMAPBUFFERPROC, target); } ///-------------------------------------- /// MARK: - GL_OES_texture_3D #if defined(GL_OES_texture_3D) #define CAN_CALL_glCompressedTexImage3DOES OPENGL_OR_CAN_CALL #define CAN_CALL_glCompressedTexSubImage3DOES OPENGL_OR_CAN_CALL #define CAN_CALL_glTexImage3DOES CAN_CALL_OPENGL_ES #define CAN_CALL_glTexSubImage3DOES CAN_CALL_OPENGL_ES #else #define CAN_CALL_glCompressedTexImage3DOES 0 #define CAN_CALL_glCompressedTexSubImage3DOES 0 #define CAN_CALL_glTexImage3DOES 0 #define CAN_CALL_glTexSubImage3DOES 0 #endif void iglCompressedTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data) { GLEXTENSION_METHOD_BODY(CAN_CALL_glCompressedTexImage3DOES, glCompressedTexImage3DOES, PFNIGLCOMPRESSEDTEXIMAGE3DPROC, target, level, internalformat, width, height, depth, border, imageSize, data); } void iglCompressedTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data) { GLEXTENSION_METHOD_BODY(CAN_CALL_glCompressedTexSubImage3DOES, glCompressedTexSubImage3DOES, PFNIGLCOMPRESSEDTEXSUBIMAGE3DPROC, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); } void iglTexImage3DOES(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* data) { GLEXTENSION_METHOD_BODY(CAN_CALL_glTexImage3DOES, glTexImage3DOES, PFNIGLTEXIMAGE3DPROC, target, level, internalformat, width, height, depth, border, format, type, data); } void iglTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels) { GLEXTENSION_METHOD_BODY(CAN_CALL_glTexSubImage3DOES, glTexSubImage3DOES, PFNIGLTEXSUBIMAGE3DPROC, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); } ///-------------------------------------- /// MARK: - GL_OES_vertex_array_object #if defined(GL_OES_vertex_array_object) #define CAN_CALL_glBindVertexArrayOES CAN_CALL_OPENGL_ES #define CAN_CALL_glDeleteVertexArraysOES CAN_CALL_OPENGL_ES #define CAN_CALL_glGenVertexArraysOES CAN_CALL_OPENGL_ES #else #define CAN_CALL_glBindVertexArrayOES 0 #define CAN_CALL_glDeleteVertexArraysOES 0 #define CAN_CALL_glGenVertexArraysOES 0 #endif void iglBindVertexArrayOES(GLuint vao) { GLEXTENSION_METHOD_BODY( CAN_CALL_glBindVertexArrayOES, glBindVertexArrayOES, PFNIGLBINDVERTEXARRAYPROC, vao); } void iglDeleteVertexArraysOES(GLsizei n, const GLuint* vertexArrays) { GLEXTENSION_METHOD_BODY(CAN_CALL_glDeleteVertexArraysOES, glDeleteVertexArraysOES, PFNIGLDELETEVERTEXARRAYSPROC, n, vertexArrays); } void iglGenVertexArraysOES(GLsizei n, GLuint* vertexArrays) { GLEXTENSION_METHOD_BODY(CAN_CALL_glGenVertexArraysOES, glGenVertexArraysOES, PFNIGLGENVERTEXARRAYSPROC, n, vertexArrays); } ///-------------------------------------- /// MARK: - GL_EXT_timer_query #if defined(GL_EXT_timer_query) || defined(GL_EXT_disjoint_timer_query) #define CAN_CALL_glBeginQuery OPENGL_OR_CAN_CALL #define CAN_CALL_glDeleteQueries OPENGL_OR_CAN_CALL #define CAN_CALL_glEndQuery OPENGL_OR_CAN_CALL #define CAN_CALL_glGenQueries OPENGL_OR_CAN_CALL #define CAN_CALL_glGetQueryObjectui64v OPENGL_OR_CAN_CALL #define CAN_CALL_glGetQueryObjectiv OPENGL_OR_CAN_CALL #define CAN_CALL_glQueryCounter OPENGL_OR_CAN_CALL #else #define CAN_CALL_glBeginQuery 0 #define CAN_CALL_glDeleteQueries 0 #define CAN_CALL_glEndQuery 0 #define CAN_CALL_glGenQueries 0 #define CAN_CALL_glGetQueryObjectiv 0 #define CAN_CALL_glGetQueryObjectui64v 0 #define CAN_CALL_glQueryCounter 0 #endif void iglBeginQuery(GLenum target, GLuint id) { #if IGL_OPENGL_ES GLEXTENSION_METHOD_BODY(CAN_CALL_glBeginQuery, glBeginQueryEXT, PFNIGLBEGINQUERYPROC, target, id); #else GLEXTENSION_METHOD_BODY(CAN_CALL_glBeginQuery, glBeginQuery, PFNIGLBEGINQUERYPROC, target, id); #endif } void iglDeleteQueries(GLsizei n, GLuint* queries) { #if IGL_OPENGL_ES GLEXTENSION_METHOD_BODY( CAN_CALL_glDeleteQueries, glDeleteQueriesEXT, PFNIGLDELETEQUERIESPROC, n, queries); #else GLEXTENSION_METHOD_BODY( CAN_CALL_glDeleteQueries, glDeleteQueries, PFNIGLDELETEQUERIESPROC, n, queries); #endif } void iglEndQuery(GLenum target) { #if IGL_OPENGL_ES GLEXTENSION_METHOD_BODY(CAN_CALL_glEndQuery, glEndQueryEXT, PFNIGLENDQUERYPROC, target); #else GLEXTENSION_METHOD_BODY(CAN_CALL_glEndQuery, glEndQuery, PFNIGLENDQUERYPROC, target); #endif } void iglGenQueries(GLsizei n, GLuint* queries) { #if IGL_OPENGL_ES GLEXTENSION_METHOD_BODY(CAN_CALL_glGenQueries, glGenQueriesEXT, PFNIGLGENQUERIESPROC, n, queries); #else GLEXTENSION_METHOD_BODY(CAN_CALL_glGenQueries, glGenQueries, PFNIGLGENQUERIESPROC, n, queries); #endif } void iglGetQueryObjectiv(GLuint id, GLenum pname, GLint* params) { #if IGL_OPENGL_ES GLEXTENSION_METHOD_BODY(CAN_CALL_glGetQueryObjectiv, glGetQueryObjectivEXT, PFNIGLGETQUERYOBJECTIVPROC, id, pname, params); #else GLEXTENSION_METHOD_BODY(CAN_CALL_glGetQueryObjectiv, glGetQueryObjectiv, PFNIGLGETQUERYOBJECTIVPROC, id, pname, params); #endif } void iglGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64* params) { #if IGL_OPENGL_ES GLEXTENSION_METHOD_BODY(CAN_CALL_glGetQueryObjectui64v, glGetQueryObjectui64vEXT, PFNIGLGETQUERYOBJECTUI64VPROC, id, pname, params); #else GLEXTENSION_METHOD_BODY(CAN_CALL_glGetQueryObjectui64v, glGetQueryObjectui64v, PFNIGLGETQUERYOBJECTUI64VPROC, id, pname, params); #endif } void iglQueryCounter(GLuint id, GLenum target) { #if IGL_OPENGL_ES GLEXTENSION_METHOD_BODY( CAN_CALL_glQueryCounter, glQueryCounterEXT, PFNIGLQUERYCOUNTERPROC, id, target); #else GLEXTENSION_METHOD_BODY( CAN_CALL_glQueryCounter, glQueryCounter, PFNIGLQUERYCOUNTERPROC, id, target); #endif } IGL_EXTERN_END // NOLINTEND(readability-identifier-naming) ================================================ FILE: src/igl/opengl/GLFunc.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include // // Note: The below summary explains why we need this. // // When using EGL (Android, OpenGL ES on Windows, emscripten, Linux), we must load extensions // dynamically at runtime. We do not need this for Apple platforms as Apple includes supported // extensions in its header files. // // To simplify use of these extensions, these methods are always available using an igl prefix. // For EGL platforms, these will be loaded dynamically if available. For WGL, they will be loaded // dynamically if not provided by GLEW. If provided by GLEW, the method will be called directly. For // Apple, the method will be called directly if it is available. Whenever the method is not // available or dynamic load fails, these methods will assert. It is on the caller to ensure that // methods should be available by doing runtime checks for extensions. IGL_EXTERN_BEGIN // Definitions for IGL extension method function pointers. // These are defined to accommodate platforms where the pointer types are not pre-defined. These // definitions use a PFNIGL prefix to ensure they don't collide with function pointer types // defined by other OpenGL loaders. These definitions also omit any extension-specific suffix (e.g., // EXT) unless it is needed to disambiguate them. using PFNIGLBEGINQUERYPROC = void (*)(GLenum target, GLuint id); using PFNIGLBINDBUFFERBASEPROC = void (*)(GLenum target, GLuint index, GLuint buffer); using PFNIGLBINDBUFFERRANGEPROC = void (*)(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); using PFNIGLBINDFRAMEBUFFERPROC = void (*)(GLenum target, GLuint framebuffer); using PFNIGLBINDIMAGETEXTUREPROC = void (*)(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); using PFNIGLBINDRENDERBUFFERPROC = void (*)(GLenum target, GLuint renderbuffer); using PFNIGLBINDVERTEXARRAYPROC = void (*)(GLuint vao); using PFNIGLBLITFRAMEBUFFERPROC = void (*)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); using PFNIGLCHECKFRAMEBUFFERSTATUSPROC = GLenum (*)(GLenum target); using PFNIGLCLEARBUFFERFVPROC = void (*)(GLenum buffer, GLint drawBuffer, const GLfloat* value); using PFNIGLCLEARDEPTHPROC = void (*)(GLdouble depth); using PFNIGLCLEARDEPTHFPROC = void (*)(GLfloat depth); using PFNIGLCOMPRESSEDTEXIMAGE3DPROC = void (*)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data); using PFNIGLCOMPRESSEDTEXSUBIMAGE3DPROC = void (*)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data); using PFNIGLCREATEMEMORYOBJECTSPROC = void (*)(GLsizei n, GLuint* memoryObjects); using PFNIGLDEBUGPROC = void (*)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam); using PFNIGLDEBUGMESSAGECALLBACKPROC = void (*)(PFNIGLDEBUGPROC callback, const void* userParam); using PFNIGLDEBUGMESSAGEINSERTPROC = void (*)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf); using PFNIGLDELETEFRAMEBUFFERSPROC = void (*)(GLsizei n, const GLuint* framebuffers); using PFNIGLDELETEMEMORYOBJECTSPROC = void (*)(GLsizei n, const GLuint* memoryObjects); using PFNIGLDELETEQUERIESPROC = void (*)(GLsizei n, GLuint* ids); using PFNIGLDELETERENDERBUFFERSPROC = void (*)(GLsizei n, const GLuint* renderbuffers); using PFNIGLDELETESYNCPROC = void (*)(GLsync sync); using PFNIGLDELETEVERTEXARRAYSPROC = void (*)(GLsizei n, const GLuint* vertexArrays); using PFNIGLDISCARDFRAMEBUFFERPROC = void (*)(GLenum target, GLsizei numAttachments, const GLenum* attachments); using PFNIGLDISPATCHCOMPUTEPROC = void (*)(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ); using PFNIGLDRAWBUFFERSPROC = void (*)(GLsizei, const GLenum*); using PFNIGLDRAWELEMENTSINDIRECTPROC = void (*)(GLenum mode, GLenum type, const GLvoid* indirect); using PFNIGLDRAWARRAYSINDIRECTPROC = void (*)(GLenum mode, const GLvoid* indirect); using PFNIGLMULTIDRAWARRAYSINDIRECTPROC = void (*)(GLenum mode, const void* indirect, GLsizei drawcount, GLsizei stride); using PFNIGLMULTIDRAWELEMENTSINDIRECTPROC = void (*)(GLenum mode, GLenum type, const void* indirect, GLsizei drawcount, GLsizei stride); using PFNIGLENDQUERYPROC = void (*)(GLenum target); using PFNIGLFENCESYNCPROC = GLsync (*)(GLenum condition, GLbitfield flags); using PFNIGLFRAMEBUFFERRENDERBUFFERPROC = void (*)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); using PFNIGLFRAMEBUFFERTEXTURE2DPROC = void (*)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); using PFNIGLFRAMEBUFFERTEXTURELAYERPROC = void (*)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); using PFNIGLFRAMEBUFFERTEXTURE2DMULTISAMPLEPROC = void (*)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); using PFNIGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWPROC = void (*)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei samples, GLint baseViewIndex, GLsizei numViews); using PFNIGLFRAMEBUFFERTEXTUREMULTIVIEWPROC = void (*)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); using PFNIGLGENERATEMIPMAPPROC = void (*)(GLenum target); using PFNIGLGENFRAMEBUFFERSPROC = void (*)(GLsizei n, GLuint* framebuffers); using PFNIGLGENRENDERBUFFERSPROC = void (*)(GLsizei n, GLuint* renderbuffers); using PFNIGLGENQUERIESPROC = void (*)(GLsizei n, GLuint* queries); using PFNIGLQUERYCOUNTERPROC = void (*)(GLuint id, GLenum target); using PFNIGLGENVERTEXARRAYSPROC = void (*)(GLsizei n, GLuint* vertexArrays); using PFNIGLGETACTIVEUNIFORMSIVPROC = void (*)(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params); using PFNIGLGETACTIVEUNIFORMBLOCKIVPROC = void (*)(GLuint program, GLuint index, GLenum pname, GLint* params); using PFNIGLGETACTIVEUNIFORMBLOCKNAMEPROC = void (*)(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName); using PFNIGLGETDEBUGMESSAGELOGPROC = GLuint (*)(GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog); using PFNIGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC = void (*)(GLenum target, GLenum attachment, GLenum pname, GLint* params); using PFNIGLGETPROGRAMINTERFACEIVPROC = void (*)(GLuint program, GLenum programInterface, GLenum pname, GLint* params); using PFNIGLGETPROGRAMRESOURCEINDEXPROC = GLuint (*)(GLuint program, GLenum programInterface, const GLchar* name); using PFNIGLGETPROGRAMRESOURCEIVPROC = void (*)(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei count, GLsizei* length, GLint* params); using PFNIGLGETPROGRAMRESOURCENAMEPROC = void (*)(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei* length, char* name); using PFNIGLGETQUERYOBJECTIVPROC = void (*)(GLuint id, GLenum pname, GLint* params); using PFNIGLGETQUERYOBJECTUI64VPROC = void (*)(GLuint id, GLenum pname, GLuint64* params); using PFNIGLGETRENDERBUFFERPARAMETERIVPROC = void (*)(GLenum target, GLenum pname, GLint* params); using PFNIGLGETSTRINGIPROC = const GLubyte* (*)(GLenum name, GLuint index); using PFNIGLGETSYNCIVPROC = void (*)(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values); using PFNIGLGETTEXTUREHANDLEPROC = GLuint64 (*)(GLuint texture); using PFNIGLGETUNIFORMBLOCKINDEXPROC = GLuint (*)(GLuint program, const GLchar* name); using PFNIGLIMPORTMEMORYFDPROC = void (*)(GLuint memory, GLuint64 size, GLenum handleType, GLint fd); using PFNIGLINSERTEVENTMARKERPROC = void (*)(GLsizei length, const GLchar* marker); using PFNIGLINVALIDATEFRAMEBUFFERPROC = void (*)(GLenum target, GLsizei numAttachments, const GLenum* attachments); using PFNIGLISFRAMEBUFFERPROC = GLboolean (*)(GLuint framebuffer); using PFNIGLISRENDERBUFFERPROC = GLboolean (*)(GLuint renderbuffer); using PFNIGLMAKETEXTUREHANDLERESIDENTPROC = void (*)(GLuint64 handle); using PFNIGLMAKETEXTUREHANDLENONRESIDENTPROC = void (*)(GLuint64 handle); using PFNIGLMAPBUFFERPROC = void* (*)(GLenum target, GLbitfield access); using PFNIGLMAPBUFFERRANGEPROC = void* (*)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); using PFNIGLMEMORYBARRIERPROC = void (*)(GLbitfield barriers); using PFNIGLOBJECTLABELPROC = void (*)(GLenum identifier, GLuint name, GLsizei length, const char* label); using PFNIGLPOPDEBUGGROUPPROC = void (*)(); using PFNIGLPOPGROUPMARKERPROC = void (*)(); using PFNIGLPUSHDEBUGGROUPPROC = void (*)(GLenum source, GLuint id, GLsizei length, const GLchar* message); using PFNIGLPUSHGROUPMARKERPROC = void (*)(GLsizei length, const GLchar* marker); using PFNIGLRENDERBUFFERSTORAGEPROC = void (*)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); using PFNIGLRENDERBUFFERSTORAGEMULTISAMPLEPROC = void (*)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); using PFNIGLTEXIMAGE3DPROC = void (*)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels); using PFNIGLTEXSUBIMAGE3DPROC = void (*)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* data); using PFNIGLTEXSTORAGE1DPROC = void (*)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); using PFNIGLTEXSTORAGE2DPROC = void (*)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); using PFNIGLTEXSTORAGE3DPROC = void (*)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); using PFNIGLTEXSTORAGEMEM2DPROC = void (*)(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); using PFNIGLTEXSTORAGEMEM3DPROC = void (*)(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); using PFNIGLUNIFORMBLOCKBINDINGPROC = void (*)(GLuint pid, GLuint uniformBlockIndex, GLuint uniformBlockBinding); using PFNIGLUNMAPBUFFERPROC = void (*)(GLenum target); using PFNIGLVERTEXATTRIBDIVISORPROC = void (*)(GLuint index, GLuint divisor); using PFNIGLDRAWELEMENTSINSTANCEDPROC = void (*)(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount); using PFNIGLDRAWARRAYSINSTANCEDPROC = void (*)(GLenum mode, GLint first, GLsizei count, GLsizei primcount); using PFNPOLYGONOFFSETCLAMPPROC = void (*)(float factor, float units, float clamp); ///-------------------------------------- /// MARK: - OpenGL ES / OpenGL // NOTE: Public IGL signature of clearDepth altered to match clearDepthf. void iglClearBufferfv(GLenum buffer, GLint drawBuffer, const GLfloat* value); void iglClearDepth(GLfloat depth); void iglCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data); void iglCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data); void iglDebugMessageCallback(PFNIGLDEBUGPROC callback, const void* userParam); void iglDebugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf); void iglDrawBuffers(GLsizei n, const GLenum* bufs); GLuint iglGetDebugMessageLog(GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog); const GLubyte* iglGetStringi(GLenum name, GLuint index); void* iglMapBuffer(GLenum target, GLbitfield access); void iglObjectLabel(GLenum identifier, GLuint name, GLsizei length, const char* label); void iglPopDebugGroup(); void iglPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar* message); void iglTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* data); void iglTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels); void iglUnmapBuffer(GLenum target); void iglVertexAttribDivisor(GLuint index, GLuint divisor); void iglDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instancecount); void iglDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei primcount); ///-------------------------------------- /// MARK: - GL_APPLE_framebuffer_multisample void iglRenderbufferStorageMultisampleAPPLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); ///-------------------------------------- /// MARK: - GL_APPLE_sync void iglDeleteSyncAPPLE(GLsync sync); GLsync iglFenceSyncAPPLE(GLenum condition, GLbitfield flags); void iglGetSyncivAPPLE(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values); ///-------------------------------------- /// MARK: - GL_ARB_bindless_texture GLuint64 iglGetTextureHandleARB(GLuint texture); void iglMakeTextureHandleResidentARB(GLuint64 handle); void iglMakeTextureHandleNonResidentARB(GLuint64 handle); ///-------------------------------------- /// MARK: - GL_ARB_compute_shader void iglDispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ); ///-------------------------------------- /// MARK: - GL_ARB_draw_indirect void iglDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid* indirect); void iglDrawArraysIndirect(GLenum mode, const GLvoid* indirect); ///-------------------------------------- /// MARK: - GL_ARB_multi_draw_indirect void iglMultiDrawArraysIndirect(GLenum mode, const void* indirect, GLsizei drawcount, GLsizei stride); void iglMultiDrawElementsIndirect(GLenum mode, GLenum type, const void* indirect, GLsizei drawcount, GLsizei stride); ///-------------------------------------- /// MARK: - GL_ARB_ES2_compatibility void iglClearDepthf(GLfloat depth); ///-------------------------------------- /// MARK: - GL_ARB_framebuffer_object void iglBindFramebuffer(GLenum target, GLuint framebuffer); void iglBindRenderbuffer(GLenum target, GLuint renderbuffer); void iglBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); GLenum iglCheckFramebufferStatus(GLenum target); void iglDeleteFramebuffers(GLsizei n, const GLuint* framebuffers); void iglDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers); void iglFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); void iglFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); void iglFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); void iglGenerateMipmap(GLenum target); void iglGenFramebuffers(GLsizei n, GLuint* framebuffers); void iglGenRenderbuffers(GLsizei n, GLuint* renderbuffers); void iglGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params); void iglGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params); GLboolean iglIsFramebuffer(GLuint framebuffer); GLboolean iglIsRenderbuffer(GLuint renderbuffer); void iglRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); void iglRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); ///-------------------------------------- /// MARK: - GL_ARB_invalidate_subdata void iglInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments); ///-------------------------------------- /// MARK: - GL_ARB_map_buffer_range void* iglMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); ///-------------------------------------- /// MARK: - GL_ARB_program_interface_query void iglGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint* params); GLuint iglGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar* name); void iglGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei count, GLsizei* length, GLint* params); void iglGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei* length, char* name); ///-------------------------------------- /// MARK: - GL_ARB_shader_image_load_store void iglBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); void iglMemoryBarrier(GLbitfield barriers); ///-------------------------------------- /// MARK: - GL_ARB_sync void iglDeleteSync(GLsync sync); GLsync iglFenceSync(GLenum condition, GLbitfield flags); void iglGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values); ///-------------------------------------- /// MARK: - GL_ARB_texture_storage void iglTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); void iglTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); void iglTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); ///-------------------------------------- /// MARK: - GL_ARB_uniform_buffer_object void iglBindBufferBase(GLenum target, GLuint index, GLuint buffer); void iglBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); void iglGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params); void iglGetActiveUniformBlockiv(GLuint program, GLuint index, GLenum pname, GLint* params); void iglGetActiveUniformBlockName(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName); GLuint iglGetUniformBlockIndex(GLuint program, const GLchar* name); void iglUniformBlockBinding(GLuint pid, GLuint uniformBlockIndex, GLuint uniformBlockBinding); ///-------------------------------------- /// MARK: - GL_ARB_vertex_array_object void iglBindVertexArray(GLuint vao); void iglDeleteVertexArrays(GLsizei n, const GLuint* vertexArrays); void iglGenVertexArrays(GLsizei n, GLuint* vertexArrays); ///-------------------------------------- /// MARK: - GL_ARB_polygon_offset_clamp void iglPolygonOffsetClamp(float factor, float units, float clamp); ///-------------------------------------- /// MARK: - GL_EXT_debug_label void iglLabelObjectEXT(GLenum identifier, GLuint name, GLsizei length, const char* label); ///-------------------------------------- /// MARK: - GL_EXT_debug_marker // NOTE: Public IGL signature altered to match GL_KHR_debug. // Additional params from GL_KHR_debug not used by GL_EXT_debug_marker are ignored. void iglInsertEventMarkerEXT(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf); void iglPopGroupMarkerEXT(); void iglPushGroupMarkerEXT(GLenum source, GLuint id, GLsizei length, const GLchar* message); ///-------------------------------------- /// MARK: - GL_EXT_discard_framebuffer void iglDiscardFramebufferEXT(GLenum target, GLsizei numAttachments, const GLenum* attachments); ///-------------------------------------- /// MARK: - GL_EXT_draw_buffers void iglDrawBuffersEXT(GLsizei n, const GLenum* bufs); ///-------------------------------------- /// MARK: - GL_EXT_framebuffer_blit void iglBlitFramebufferEXT(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); ///-------------------------------------- /// MARK: - GL_EXT_map_buffer_range void* iglMapBufferRangeEXT(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); ///-------------------------------------- /// MARK: - GL_EXT_memory_object void iglCreateMemoryObjectsEXT(GLsizei n, GLuint* memoryObjects); void iglDeleteMemoryObjectsEXT(GLsizei n, const GLuint* memoryObjects); void iglTexStorageMem2DEXT(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); void iglTexStorageMem3DEXT(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); ///-------------------------------------- /// MARK: - GL_EXT_memory_object_fd void iglImportMemoryFdEXT(GLuint memory, GLuint64 size, GLenum handleType, GLint fd); ///-------------------------------------- /// MARK: - GL_EXT_multisampled_render_to_texture void iglFramebufferTexture2DMultisampleEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); void iglRenderbufferStorageMultisampleEXT(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); ///-------------------------------------- /// MARK: - GL_EXT_shader_image_load_store void iglBindImageTextureEXT(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); void iglMemoryBarrierEXT(GLbitfield barriers); ///-------------------------------------- /// MARK: - GL_EXT_texture_storage void iglTexStorage1DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); void iglTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); void iglTexStorage3DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); ///-------------------------------------- /// MARK: - GL_IMG_multisampled_render_to_texture void iglFramebufferTexture2DMultisampleIMG(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); void iglRenderbufferStorageMultisampleIMG(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); ///-------------------------------------- /// MARK: - GL_KHR_debug void iglDebugMessageCallbackKHR(PFNIGLDEBUGPROC callback, const void* userParam); void iglDebugMessageInsertKHR(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf); GLuint iglGetDebugMessageLogKHR(GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog); void iglObjectLabelKHR(GLenum identifier, GLuint name, GLsizei length, const char* label); void iglPopDebugGroupKHR(); void iglPushDebugGroupKHR(GLenum source, GLuint id, GLsizei length, const GLchar* message); ///-------------------------------------- /// MARK: - GL_NV_bindless_texture GLuint64 iglGetTextureHandleNV(GLuint texture); void iglMakeTextureHandleResidentNV(GLuint64 handle); void iglMakeTextureHandleNonResidentNV(GLuint64 handle); ///-------------------------------------- /// MARK: - GL_NV_instanced_arrays void iglVertexAttribDivisorNV(GLuint index, GLuint divisor); ///-------------------------------------- /// MARK: - GL_OVR_multiview void iglFramebufferTextureMultiviewOVR(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); ///-------------------------------------- /// MARK: - GL_OVR_multiview_multisampled_render_to_texture void iglFramebufferTextureMultisampleMultiviewOVR(GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei samples, GLint baseViewIndex, GLsizei numViews); ///-------------------------------------- /// MARK: - GL_OES_mapbuffer void* iglMapBufferOES(GLenum target, GLbitfield access); void iglUnmapBufferOES(GLenum target); ///-------------------------------------- /// MARK: - GL_OES_texture_3D void iglCompressedTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data); void iglCompressedTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data); void iglTexImage3DOES(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* data); void iglTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels); ///-------------------------------------- /// MARK: - GL_OES_vertex_array_object void iglBindVertexArrayOES(GLuint vao); void iglDeleteVertexArraysOES(GLsizei n, const GLuint* vertexArrays); void iglGenVertexArraysOES(GLsizei n, GLuint* vertexArrays); ///-------------------------------------- /// MARK: - GL_EXT_timer_query void iglGenQueries(GLsizei n, GLuint* queries); void iglBeginQuery(GLenum target, GLuint id); void iglEndQuery(GLenum target); void iglDeleteQueries(GLsizei n, GLuint* queries); void iglGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64* params); void iglGetQueryObjectiv(GLuint id, GLenum pname, GLint* params); void iglQueryCounter(GLuint id, GLenum target); IGL_EXTERN_END ================================================ FILE: src/igl/opengl/GLIncludes.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include // IWYU pragma: export // clang-format off #if IGL_PLATFORM_IOS_SIMULATOR #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export using GLdouble = double; #elif IGL_PLATFORM_IOS #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export using GLdouble = double; #elif IGL_PLATFORM_MACCATALYST // Apple dropped OpenGL support for Catalyst built apps. // For compatibility reasons, we added stub headers, // so we can still build referencing these headers. #include "OpenGLES/ES3/gl.h" // IWYU pragma: export #include "OpenGLES/ES3/glext.h" // IWYU pragma: export #include "OpenGLES/ES2/glext.h" // IWYU pragma: export using GLdouble = double; #elif IGL_PLATFORM_MACOSX #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #elif IGL_PLATFORM_WINDOWS #define GL_GLEXT_PROTOTYPES #if IGL_ANGLE #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // GL_EXT_memory_object // IWYU pragma: export #undef ERROR #else #ifndef GLEW_STATIC #define GLEW_STATIC #endif #include // IWYU pragma: export #endif #elif IGL_PLATFORM_ANDROID #include // IWYU pragma: export #include // IWYU pragma: export #include // GL_EXT_memory_object // IWYU pragma: export #elif IGL_PLATFORM_LINUX #if IGL_PLATFORM_LINUX_USE_EGL #include // IWYU pragma: export #include // IWYU pragma: export #else #include // IWYU pragma: export #include // IWYU pragma: export #endif #elif IGL_PLATFORM_EMSCRIPTEN #include // IWYU pragma: export #include // IWYU pragma: export #endif // clang-format on #ifndef GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH #define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8a35 #endif #ifndef GL_ACTIVE_UNIFORM_BLOCKS #define GL_ACTIVE_UNIFORM_BLOCKS 0x8a36 #endif #ifndef GL_ACTIVE_RESOURCES #define GL_ACTIVE_RESOURCES 0x92f5 #endif #ifndef GL_ALPHA_BITS #define GL_ALPHA_BITS 0xd55 #endif #ifndef GL_ALPHA8 #define GL_ALPHA8 0x803C #endif #ifndef GL_ATOMIC_COUNTER_BARRIER_BIT #define GL_ATOMIC_COUNTER_BARRIER_BIT 0x1000 #endif #ifndef GL_BLUE #define GL_BLUE 0x1905 #endif #ifndef GL_BGR #define GL_BGR 0x80E0 #endif #ifndef GL_BGRA #define GL_BGRA 0x80E1 #endif #ifndef GL_BGR_INTEGER #define GL_BGR_INTEGER 0x8D9A #endif #ifndef GL_BGRA_INTEGER #define GL_BGRA_INTEGER 0x8D9B #endif #ifndef GL_BGRA8_EXT #define GL_BGRA8_EXT 0x93A1 #endif #ifndef GL_BUFFER #define GL_BUFFER 0x82e0 #endif #ifndef GL_BUFFER_BINDING #define GL_BUFFER_BINDING 0x9302 #endif #ifndef GL_BUFFER_OBJECT_EXT #define GL_BUFFER_OBJECT_EXT 0x9151 #endif #ifndef GL_BUFFER_UPDATE_BARRIER_BIT #define GL_BUFFER_UPDATE_BARRIER_BIT 0x200 #endif #ifndef GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT #define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x4000 #endif #ifndef GL_COLOR_ATTACHMENT1 #define GL_COLOR_ATTACHMENT1 0x8ce1 #endif #ifndef GL_COMMAND_BARRIER_BIT #define GL_COMMAND_BARRIER_BIT 0x40 #endif #ifndef GL_COMPARE_REF_TO_TEXTURE #define GL_COMPARE_REF_TO_TEXTURE 0x884e #endif #ifndef GL_COMPRESSED_R11_EAC #define GL_COMPRESSED_R11_EAC 0x9270 #endif #ifndef GL_COMPRESSED_RG11_EAC #define GL_COMPRESSED_RG11_EAC 0x9272 #endif #ifndef GL_COMPRESSED_RGB8_ETC2 #define GL_COMPRESSED_RGB8_ETC2 0x9274 #endif #ifndef GL_COMPRESSED_RGBA8_ETC2_EAC #define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 #endif #ifndef GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 #define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 #endif #ifndef GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG #define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01 #endif #ifndef GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG #define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00 #endif #ifndef GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG #define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03 #endif #ifndef GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG #define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02 #endif #ifndef GL_COMPRESSED_RGBA_ASTC_10x10_KHR #define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB #endif #ifndef GL_COMPRESSED_RGBA_ASTC_10x6_KHR #define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 #endif #ifndef GL_COMPRESSED_RGBA_ASTC_10x8_KHR #define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA #endif #ifndef GL_COMPRESSED_RGBA_ASTC_10x5_KHR #define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 #endif #ifndef GL_COMPRESSED_RGBA_ASTC_12x10_KHR #define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC #endif #ifndef GL_COMPRESSED_RGBA_ASTC_12x12_KHR #define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD #endif #ifndef GL_COMPRESSED_RGBA_ASTC_4x4_KHR #define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 #endif #ifndef GL_COMPRESSED_RGBA_ASTC_5x4_KHR #define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 #endif #ifndef GL_COMPRESSED_RGBA_ASTC_5x5_KHR #define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 #endif #ifndef GL_COMPRESSED_RGBA_ASTC_6x5_KHR #define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 #endif #ifndef GL_COMPRESSED_RGBA_ASTC_6x6_KHR #define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 #endif #ifndef GL_COMPRESSED_RGBA_ASTC_8x5_KHR #define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 #endif #ifndef GL_COMPRESSED_RGBA_ASTC_8x6_KHR #define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 #endif #ifndef GL_COMPRESSED_RGBA_ASTC_8x8_KHR #define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 #endif #ifndef GL_COMPRESSED_RGBA_BPTC_UNORM #define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C #endif #ifndef GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM #define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D #endif #ifndef GL_COMPRESSED_SIGNED_R11_EAC #define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 #endif #ifndef GL_COMPRESSED_SIGNED_RG11_EAC #define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 #endif #ifndef GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB #endif #ifndef GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 #endif #ifndef GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 #endif #ifndef GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA #endif #ifndef GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC #endif #ifndef GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD #endif #ifndef GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 #endif #ifndef GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 #endif #ifndef GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 #endif #ifndef GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 #endif #ifndef GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 #endif #ifndef GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 #endif #ifndef GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 #endif #ifndef GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 #endif #ifndef GL_COMPRESSED_SRGB8_ETC2 #define GL_COMPRESSED_SRGB8_ETC2 0x9275 #endif #ifndef GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC #define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 #endif #ifndef GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 #define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 #endif #ifndef GL_COMPUTE_SHADER #define GL_COMPUTE_SHADER 0x91B9 #endif #ifndef GL_COPY_READ_BUFFER #define GL_COPY_READ_BUFFER 0x8f36 #endif #ifndef GL_COPY_WRITE_BUFFER #define GL_COPY_WRITE_BUFFER 0x8f37 #endif #ifndef GL_DEBUG_LOGGED_MESSAGES #define GL_DEBUG_LOGGED_MESSAGES 0x9145 #endif #ifndef GL_MAX_DEBUG_GROUP_STACK_DEPTH #define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826c #endif #ifndef GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH #define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 #endif #ifndef GL_DEBUG_OUTPUT #define GL_DEBUG_OUTPUT 0x92e0 #endif #ifndef GL_DEBUG_SEVERITY_HIGH #define GL_DEBUG_SEVERITY_HIGH 0x9146 #endif #ifndef GL_DEBUG_SEVERITY_LOW #define GL_DEBUG_SEVERITY_LOW 0x9148 #endif #ifndef GL_DEBUG_SEVERITY_MEDIUM #define GL_DEBUG_SEVERITY_MEDIUM 0x9147 #endif #ifndef GL_DEBUG_SEVERITY_NOTIFICATION #define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B #endif #ifndef GL_DEBUG_SOURCE_API #define GL_DEBUG_SOURCE_API 0x8246 #endif #ifndef GL_DEBUG_SOURCE_APPLICATION #define GL_DEBUG_SOURCE_APPLICATION 0x824A #endif #ifndef GL_DEBUG_SOURCE_OTHER #define GL_DEBUG_SOURCE_OTHER 0x824B #endif #ifndef GL_DEBUG_SOURCE_SHADER_COMPILER #define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 #endif #ifndef GL_DEBUG_SOURCE_THIRD_PARTY #define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 #endif #ifndef GL_DEBUG_SOURCE_WINDOW_SYSTEM #define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 #endif #ifndef GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR #define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D #endif #ifndef GL_DEBUG_TYPE_ERROR #define GL_DEBUG_TYPE_ERROR 0x824C #endif #ifndef GL_DEBUG_TYPE_MARKER #define GL_DEBUG_TYPE_MARKER 0x8268 #endif #ifndef GL_DEBUG_TYPE_OTHER #define GL_DEBUG_TYPE_OTHER 0x8251 #endif #ifndef GL_DEBUG_TYPE_PERFORMANCE #define GL_DEBUG_TYPE_PERFORMANCE 0x8250 #endif #ifndef GL_DEBUG_TYPE_PORTABILITY #define GL_DEBUG_TYPE_PORTABILITY 0x824F #endif #ifndef GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR #define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E #endif #ifndef GL_DEPTH #define GL_DEPTH 0x1801 #endif #ifndef GL_DEPTH_COMPONENT24 #define GL_DEPTH_COMPONENT24 0x81A6 #endif #ifndef GL_DEPTH_COMPONENT32 #define GL_DEPTH_COMPONENT32 0x81A7 #endif #ifndef GL_DEPTH_STENCIL #define GL_DEPTH_STENCIL 0x84F9 #endif #ifndef GL_DEPTH24_STENCIL8 #define GL_DEPTH24_STENCIL8 0x88F0 #endif #ifndef GL_DEPTH32F_STENCIL8 #define GL_DEPTH32F_STENCIL8 0x8CAD #endif #ifndef GL_DRAW_FRAMEBUFFER #define GL_DRAW_FRAMEBUFFER 0x8CA9 #endif #ifndef GL_DRAW_FRAMEBUFFER_BINDING #define GL_DRAW_FRAMEBUFFER_BINDING GL_FRAMEBUFFER_BINDING #endif #ifndef GL_DRAW_INDIRECT_BUFFER #define GL_DRAW_INDIRECT_BUFFER 0x8F3F #endif #ifndef GL_DYNAMIC_COPY #define GL_DYNAMIC_COPY 0x88ea #endif #ifndef GL_DYNAMIC_READ #define GL_DYNAMIC_READ 0x88e9 #endif #ifndef GL_ELEMENT_ARRAY_BARRIER_BIT #define GL_ELEMENT_ARRAY_BARRIER_BIT 0x2 #endif #ifndef GL_ETC1_RGB8_OES #define GL_ETC1_RGB8_OES 0x8D64 #endif #ifndef GL_FILL #define GL_FILL 0x1b02 #endif #ifndef GL_FLOAT_32_UNSIGNED_INT_24_8_REV #define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD #endif #ifndef GL_FRAGMENT_SHADER_DERIVATIVE_HINT #define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8b8b #endif #ifndef GL_FRAMEBUFFER_DEFAULT #define GL_FRAMEBUFFER_DEFAULT 0x8218 #endif #ifndef GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE #define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 #endif #ifndef GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE #define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 #endif #ifndef GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE #define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 #endif #ifndef GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING #define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 #endif #ifndef GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE #define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 #endif #ifndef GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE #define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 #endif #ifndef GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE #define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 #endif #ifndef GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE #define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 #endif #ifndef GL_FRAMEBUFFER_BARRIER_BIT #define GL_FRAMEBUFFER_BARRIER_BIT 0x400 #endif #ifndef GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS #define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9 #endif #ifndef GL_FRAMEBUFFER_UNDEFINED #define GL_FRAMEBUFFER_UNDEFINED 0x8219 #endif #ifndef GL_FRAMEBUFFER_SRGB #define GL_FRAMEBUFFER_SRGB 0x8DB9 #endif #ifndef GL_GENERATE_MIPMAP_HINT #define GL_GENERATE_MIPMAP_HINT 0x8192 #endif #ifndef GL_GREEN #define GL_GREEN 0x1904 #endif #ifndef GL_HALF_FLOAT #define GL_HALF_FLOAT 0x140B #endif #ifndef GL_HALF_FLOAT_OES #define GL_HALF_FLOAT_OES 0x8D61 #endif #ifndef GL_HANDLE_TYPE_OPAQUE_FD_EXT #define GL_HANDLE_TYPE_OPAQUE_FD_EXT 0x9586 #endif #ifndef GL_IMAGE_1D #define GL_IMAGE_1D 0x904c #endif #ifndef GL_IMAGE_1D_ARRAY #define GL_IMAGE_1D_ARRAY 0x9052 #endif #ifndef GL_IMAGE_2D #define GL_IMAGE_2D 0x904d #endif #ifndef GL_IMAGE_2D_MULTISAMPLE #define GL_IMAGE_2D_MULTISAMPLE 0x9055 #endif #ifndef GL_TEXTURE_2D_MULTISAMPLE #define GL_TEXTURE_2D_MULTISAMPLE 0x9100 #endif #ifndef GL_IMAGE_2D_ARRAY #define GL_IMAGE_2D_ARRAY 0x9053 #endif #ifndef GL_IMAGE_2D_MULTISAMPLE_ARRAY #define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056 #endif #ifndef GL_TEXTURE_2D_MULTISAMPLE_ARRAY #define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 #endif #ifndef GL_IMAGE_3D #define GL_IMAGE_3D 0x904e #endif #ifndef GL_IMAGE_CUBE #define GL_IMAGE_CUBE 0x9050 #endif #ifndef GL_INVALID_INDEX #define GL_INVALID_INDEX 0xFFFFFFFF #endif #ifndef GL_INT_2_10_10_10_REV #define GL_INT_2_10_10_10_REV 0x8D9F #endif #ifndef GL_LINE #define GL_LINE 0x1b01 #endif #ifndef GL_LUMINANCE #define GL_LUMINANCE 0x1909 #endif #ifndef GL_LUMINANCE_ALPHA #define GL_LUMINANCE_ALPHA 0x190a #endif #ifndef GL_LUMINANCE8 #define GL_LUMINANCE8 0x8040 #endif #ifndef GL_LUMINANCE8_ALPHA8 #define GL_LUMINANCE8_ALPHA8 0x8045 #endif #ifndef GL_MAP_COHERENT_BIT #define GL_MAP_COHERENT_BIT 0x80 #endif #ifndef GL_MAP_FLUSH_EXPLICIT_BIT #define GL_MAP_FLUSH_EXPLICIT_BIT 0x10 #endif #ifndef GL_MAP_INVALIDATE_BUFFER_BIT #define GL_MAP_INVALIDATE_BUFFER_BIT 0x8 #endif #ifndef GL_MAP_INVALIDATE_RANGE_BIT #define GL_MAP_INVALIDATE_RANGE_BIT 0x4 #endif #ifndef GL_MAP_PERSISTENT_BIT #define GL_MAP_PERSISTENT_BIT 0x40 #endif #ifndef GL_MAP_READ_BIT #define GL_MAP_READ_BIT 0x1 #endif #ifndef GL_MAP_WRITE_BIT #define GL_MAP_WRITE_BIT 0x2 #endif #ifndef GL_MAP_UNSYNCHRONIZED_BIT #define GL_MAP_UNSYNCHRONIZED_BIT 0x20 #endif #ifndef GL_MAX #define GL_MAX 0x8008 #endif #ifndef GL_MAX_COMPUTE_UNIFORM_COMPONENTS #define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 #endif #ifndef GL_MAX_FRAGMENT_UNIFORM_COMPONENTS #define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8b49 #endif #ifndef GL_MAX_FRAGMENT_UNIFORM_VECTORS #define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8dfd #endif #ifndef GL_MAX_NAME_LENGTH #define GL_MAX_NAME_LENGTH 0x92f6 #endif #ifndef GL_MAX_SAMPLES #define GL_MAX_SAMPLES 0x8D57 #endif #ifndef GL_MAX_SAMPLES_IMG #define GL_MAX_SAMPLES_IMG 0x9135 #endif #ifndef GL_MAX_SHADER_STORAGE_BLOCK_SIZE #define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90de #endif #ifndef GL_MAX_TEXTURE_LOD_BIAS #define GL_MAX_TEXTURE_LOD_BIAS 0x84FD #endif #ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY #define GL_MAX_TEXTURE_MAX_ANISOTROPY 0x84FF #endif #ifndef GL_MAX_UNIFORM_BLOCK_SIZE #define GL_MAX_UNIFORM_BLOCK_SIZE 0x8a30 #endif #ifndef GL_MAX_VERTEX_UNIFORM_COMPONENTS #define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8b4a #endif #ifndef GL_MAX_VERTEX_UNIFORM_VECTORS #define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8dfb #endif #ifndef GL_MIN #define GL_MIN 0x8007 #endif #ifndef GL_NUM_EXTENSIONS #define GL_NUM_EXTENSIONS 0x821d #endif #ifndef GL_PACK_ROW_LENGTH #define GL_PACK_ROW_LENGTH 0x0d02 #endif #ifndef GL_PIXEL_BUFFER_BARRIER_BIT #define GL_PIXEL_BUFFER_BARRIER_BIT 0x80 #endif #ifndef GL_PIXEL_PACK_BUFFER #define GL_PIXEL_PACK_BUFFER 0x88eb #endif #ifndef GL_PIXEL_UNPACK_BUFFER #define GL_PIXEL_UNPACK_BUFFER 0x88ec #endif #ifndef GL_PROGRAM #define GL_PROGRAM 0x82e2 #endif #ifndef GL_PROGRAM_OBJECT_EXT #define GL_PROGRAM_OBJECT_EXT 0x8B40 #endif #ifndef GL_QUERY_BUFFER_BARRIER_BIT #define GL_QUERY_BUFFER_BARRIER_BIT 0x8000 #endif #ifndef GL_R16 #define GL_R16 0x822A #endif #ifndef GL_R16F #define GL_R16F 0x822D #endif #ifndef GL_R16UI #define GL_R16UI 0x8234 #endif #ifndef GL_R32F #define GL_R32F 0x822E #endif #ifndef GL_R32UI #define GL_R32UI 0x8236 #endif #ifndef GL_R8 #define GL_R8 0x8229 #endif #ifndef GL_READ_FRAMEBUFFER #define GL_READ_FRAMEBUFFER 0x8CA8 #endif #ifndef GL_READ_FRAMEBUFFER_BINDING #define GL_READ_FRAMEBUFFER_BINDING 0x8CAA #endif #ifndef GL_READ_ONLY #define GL_READ_ONLY 0x88b8 #endif #ifndef GL_READ_WRITE #define GL_READ_WRITE 0x88ba #endif #ifndef GL_RED #define GL_RED 0x1903 #endif #ifndef GL_RED_INTEGER #define GL_RED_INTEGER 0x8d94 #endif #ifndef GL_RG #define GL_RG 0x8227 #endif #ifndef GL_RG_INTEGER #define GL_RG_INTEGER 0x8228 #endif #ifndef GL_RG16 #define GL_RG16 0x822C #endif #ifndef GL_RG16F #define GL_RG16F 0x822F #endif #ifndef GL_RGBA16 #define GL_RGBA16 0x805B #endif #ifndef GL_RG32F #define GL_RG32F 0x8230 #endif #ifndef GL_RG8 #define GL_RG8 0x822B #endif #ifndef GL_RGB_422_APPLE #define GL_RGB_422_APPLE 0x8A1F #endif #ifndef GL_RGB_INTEGER #define GL_RGB_INTEGER 0x8d98 #endif #ifndef GL_RGB_RAW_422_APPLE #define GL_RGB_RAW_422_APPLE 0x8A51 #endif #ifndef GL_RGB10_A2 #define GL_RGB10_A2 0x8059 #endif #ifndef GL_RGB10_A2UI #define GL_RGB10_A2UI 0x906f #endif #ifndef GL_RGB16F #define GL_RGB16F 0x881B #endif #ifndef GL_RGB32F #define GL_RGB32F 0x8815 #endif #ifndef GL_RGB8 #define GL_RGB8 0x8051 #endif #ifndef GL_RGBA_INTEGER #define GL_RGBA_INTEGER 0x8d99 #endif #ifndef GL_RGBA16F #define GL_RGBA16F 0x881A #endif #ifndef GL_RG16UI #define GL_RG16UI 0x823a #endif #ifndef GL_RGBA32F #define GL_RGBA32F 0x8814 #endif #ifndef GL_RGBA32UI #define GL_RGBA32UI 0x8d70 #endif #ifndef GL_RGBA8 #define GL_RGBA8 0x8058 #endif #ifndef GL_SAMPLER_1D #define GL_SAMPLER_1D 0x8B5D #endif #ifndef GL_SAMPLER_1D_ARRAY #define GL_SAMPLER_1D_ARRAY 0x8dc0 #endif #ifndef GL_SAMPLER_2D_ARRAY #define GL_SAMPLER_2D_ARRAY 0x8dc1 #endif #ifndef GL_SAMPLER_2D_MULTISAMPLE #define GL_SAMPLER_2D_MULTISAMPLE 0x9108 #endif #ifndef GL_SAMPLER_3D #define GL_SAMPLER_3D 0x8B5F #endif #ifndef GL_SAMPLER_EXTERNAL_OES #define GL_SAMPLER_EXTERNAL_OES 0x8D66 #endif #ifndef GL_SHADER #define GL_SHADER 0x82e1 #endif #ifndef GL_SHADER_IMAGE_ACCESS_BARRIER_BIT #define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x20 #endif #ifndef GL_SHADER_OBJECT_EXT #define GL_SHADER_OBJECT_EXT 0x8B48 #endif #ifndef GL_SHADER_STORAGE_BARRIER_BIT #define GL_SHADER_STORAGE_BARRIER_BIT 0x2000 #endif #ifndef GL_SHADER_STORAGE_BLOCK #define GL_SHADER_STORAGE_BLOCK 0x92e6 #endif #ifndef GL_SHADER_STORAGE_BUFFER #define GL_SHADER_STORAGE_BUFFER 0x90d2 #endif #ifndef GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT #define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90df #endif #ifndef GL_SIGNALED #define GL_SIGNALED 0x9119 #endif #ifndef GL_SIGNED_NORMALIZED #define GL_SIGNED_NORMALIZED 0x8f9c #endif #ifndef GL_SRGB #define GL_SRGB 0x8c40 #endif #ifndef GL_SRGB_ALPHA #define GL_SRGB_ALPHA 0x8c42 #endif #ifndef GL_SRGB8 #define GL_SRGB8 0x8c41 #endif #ifndef GL_SRGB8_ALPHA8 #define GL_SRGB8_ALPHA8 0x8C43 #endif #ifndef GL_STATIC_COPY #define GL_STATIC_COPY 0x88e6 #endif #ifndef GL_STATIC_READ #define GL_STATIC_READ 0x88e5 #endif #ifndef GL_STENCIL #define GL_STENCIL 0x1802 #endif #ifndef GL_STENCIL_INDEX #define GL_STENCIL_INDEX 0x1901 #endif #ifndef GL_STREAM_COPY #define GL_STREAM_COPY 0x88e2 #endif #ifndef GL_STREAM_READ #define GL_STREAM_READ 0x88e1 #endif #ifndef GL_SYNC_GPU_COMMANDS_COMPLETE #define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 #endif #ifndef GL_SYNC_STATUS #define GL_SYNC_STATUS 0x9114 #endif #ifndef GL_TEXTURE_SWIZZLE_A #define GL_TEXTURE_SWIZZLE_A 0x8e45 #endif #ifndef GL_TEXTURE_SWIZZLE_B #define GL_TEXTURE_SWIZZLE_B 0x8e44 #endif #ifndef GL_TEXTURE_SWIZZLE_G #define GL_TEXTURE_SWIZZLE_G 0x8e43 #endif #ifndef GL_TEXTURE_SWIZZLE_R #define GL_TEXTURE_SWIZZLE_R 0x8e42 #endif #ifndef GL_TEXTURE_1D #define GL_TEXTURE_1D 0xde0 #endif #ifndef GL_TEXTURE_1D_ARRAY #define GL_TEXTURE_1D_ARRAY 0x8c18 #endif #ifndef GL_TEXTURE_2D_ARRAY #define GL_TEXTURE_2D_ARRAY 0x8C1A #endif #ifndef GL_TEXTURE_3D #define GL_TEXTURE_3D 0x806F #endif #ifndef GL_TEXTURE_COMPARE_FUNC #define GL_TEXTURE_COMPARE_FUNC 0x884d #endif #ifndef GL_TEXTURE_COMPARE_MODE #define GL_TEXTURE_COMPARE_MODE 0x884c #endif #ifndef GL_TEXTURE_CUBE_MAP_SEAMLESS #define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884f #endif #ifndef GL_TEXTURE_EXTERNAL_OES #define GL_TEXTURE_EXTERNAL_OES 0x8D65 #endif #ifndef GL_TEXTURE_FETCH_BARRIER_BIT #define GL_TEXTURE_FETCH_BARRIER_BIT 0x8 #endif #ifndef GL_TEXTURE_LOD_BIAS #define GL_TEXTURE_LOD_BIAS 0x8501 #endif #ifndef GL_TEXTURE_MAX_ANISOTROPY #define GL_TEXTURE_MAX_ANISOTROPY 0x84FE #endif #ifndef GL_TEXTURE_MAX_LEVEL #define GL_TEXTURE_MAX_LEVEL 0x813d #endif #ifndef GL_TEXTURE_MAX_LOD #define GL_TEXTURE_MAX_LOD 0x813b #endif #ifndef GL_TEXTURE_MIN_LOD #define GL_TEXTURE_MIN_LOD 0x813a #endif #ifndef GL_TEXTURE_RECTANGLE #define GL_TEXTURE_RECTANGLE 0x84F5 #endif #ifndef GL_TEXTURE_UPDATE_BARRIER_BIT #define GL_TEXTURE_UPDATE_BARRIER_BIT 0x100 #endif #ifndef GL_TEXTURE_WRAP_R #define GL_TEXTURE_WRAP_R 0x8072 #endif #ifndef GL_TRANSFORM_FEEDBACK_BARRIER_BIT #define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x800 #endif #ifndef GL_TRANSFORM_FEEDBACK_BUFFER #define GL_TRANSFORM_FEEDBACK_BUFFER 0x8c8e #endif #ifndef GL_UNIFORM_BARRIER_BIT #define GL_UNIFORM_BARRIER_BIT 0x4 #endif #ifndef GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES #define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8a43 #endif #ifndef GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS #define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8a42 #endif #ifndef GL_UNIFORM_BLOCK_BINDING #define GL_UNIFORM_BLOCK_BINDING 0x8a3f #endif #ifndef GL_UNIFORM_BLOCK_DATA_SIZE #define GL_UNIFORM_BLOCK_DATA_SIZE 0x8a40 #endif #ifndef GL_UNIFORM_BUFFER #define GL_UNIFORM_BUFFER 0x8a11 #endif #ifndef GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT #define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8a34 #endif #ifndef GL_UNIFORM_NAME_LENGTH #define GL_UNIFORM_NAME_LENGTH 0x8a39 #endif #ifndef GL_UNIFORM_OFFSET #define GL_UNIFORM_OFFSET 0x8a3b #endif #ifndef GL_UNPACK_ROW_LENGTH #define GL_UNPACK_ROW_LENGTH 0x0cf2 #endif #ifndef GL_UNSIGNED_INT_10F_11F_11F_REV #define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8c3b #endif #ifndef GL_UNSIGNED_INT_2_10_10_10_REV #define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 #endif #ifndef GL_UNSIGNED_INT_24_8 #define GL_UNSIGNED_INT_24_8 0x84fa #endif #ifndef GL_UNSIGNED_INT_5_9_9_9_REV #define GL_UNSIGNED_INT_5_9_9_9_REV 0x8c3e #endif #ifndef GL_UNSIGNED_INT_8_8_8_8_REV #define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 #endif #ifndef GL_UNSIGNED_SHORT_1_5_5_5_REV #define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 #endif #ifndef GL_UNSIGNED_SHORT_4_4_4_4_REV #define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 #endif #ifndef GL_UNSIGNED_SHORT_8_8_APPLE #define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA #endif #ifndef GL_UNSIGNED_SHORT_8_8_REV_APPLE #define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB #endif #ifndef GL_UNSIGNED_NORMALIZED #define GL_UNSIGNED_NORMALIZED 0x8c17 #endif #ifndef GL_VERTEX_ARRAY_BINDING #define GL_VERTEX_ARRAY_BINDING 0x85B5 #endif #ifndef GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT #define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x1 #endif #ifndef GL_WRITE_ONLY #define GL_WRITE_ONLY 0x88b9 #endif ================================================ FILE: src/igl/opengl/HWDevice.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace igl::opengl { std::unique_ptr HWDevice::create(Result* outResult) const { auto context = createContext(outResult); if (context == nullptr) { return nullptr; } return createWithContext(std::move(context), outResult); } std::unique_ptr HWDevice::create(BackendVersion backendVersion, Result* outResult) { auto context = createContext(backendVersion, IGL_EGL_NULL_WINDOW, outResult); if (!context) { Result::setResult(outResult, Result::Code::RuntimeError, "context is null"); return nullptr; } return createWithContext(std::move(context), outResult); } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/HWDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #if IGL_PLATFORM_ANDROID || IGL_PLATFORM_LINUX || IGL_PLATFORM_EMSCRIPTEN #include #elif IGL_PLATFORM_IOS || IGL_PLATFORM_MACOSX #define EGLNativeWindowType void* #elif IGL_ANGLE || defined(IGL_CMAKE_BUILD) #include #else #define EGLNativeWindowType void* #endif #if IGL_PLATFORM_LINUX #define IGL_EGL_NULL_WINDOW 0L #else #define IGL_EGL_NULL_WINDOW nullptr #endif namespace igl::opengl { class HWDevice { public: HWDevice() = default; virtual ~HWDevice() = default; virtual std::unique_ptr createContext(Result* outResult) const = 0; virtual std::unique_ptr createContext(BackendVersion backendVersion, EGLNativeWindowType nativeWindow, Result* outResult) const = 0; virtual std::unique_ptr createWithContext(std::unique_ptr context, Result* outResult) const = 0; std::unique_ptr create(Result* outResult = nullptr) const; std::unique_ptr create(BackendVersion backendVersion, Result* outResult = nullptr); }; } // namespace igl::opengl ================================================ FILE: src/igl/opengl/IContext.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #if IGL_DEBUG #include #endif #include #include #include #include #if defined(IGL_WITH_TRACY_GPU) #include "tracy/TracyOpenGL.hpp" #endif // Uncomment to enable shader validation // #define IGL_VALIDATE_SHADERS #if IGL_API_LOG #include #define APILOG_DEC_DRAW_COUNT() \ if (apiLogDrawsLeft_) { \ apiLogDrawsLeft_--; \ } #define APILOG(format, ...) \ if (apiLogDrawsLeft_ || apiLogEnabled_) { \ IGLLog(IGLLogInfo, format, ##__VA_ARGS__); \ } namespace { uint32_t logSourceChunk(uint32_t line, const char* string, size_t length) { int printLen = 0; const char* lineString = string; while (length > 0) { if (*string == '\r' || *string == '\n') { if (printLen > 0) { IGLLog(IGLLogInfo, "%3u: %.*s\n", line++, printLen, lineString); } printLen = 0; lineString = string + 1; } else { printLen++; } ++string; --length; } if (printLen > 0) { IGLLog(IGLLogInfo, "%3u: %.*s\n", line++, printLen, lineString); } return line; } void logSource(const int count, const char** string, const int* length) { if (!string) { return; } uint32_t line = 1; for (int i = 0; i < count; ++i) { if (!string[i]) { continue; } line = logSourceChunk( line, string[i], !length ? std::strlen(string[i]) : static_cast(length[i])); } } } // namespace #define APILOG_SOURCE(count, string, length) logSource(count, string, length); #else #define APILOG_DEC_DRAW_COUNT() static_cast(0) #define APILOG(format, ...) static_cast(0) #define APILOG_SOURCE(count, string, length) static_cast(0) #endif // IGL_API_LOG #define GLCALL(funcName) \ IGL_SOFT_ASSERT(isCurrentContext() || isCurrentSharegroup()); \ callCounter_++; \ gl##funcName #define IGLCALL(funcName) \ IGL_SOFT_ASSERT(isCurrentContext() || isCurrentSharegroup()); \ callCounter_++; \ igl##funcName #define GLCALL_WITH_RETURN(ret, funcName) \ IGL_SOFT_ASSERT(isCurrentContext() || isCurrentSharegroup()); \ callCounter_++; \ ret = gl##funcName #define IGLCALL_WITH_RETURN(ret, funcName) \ IGL_SOFT_ASSERT(isCurrentContext() || isCurrentSharegroup()); \ callCounter_++; \ ret = igl##funcName #define GLCALL_PROC(funcPtr, ...) \ IGL_SOFT_ASSERT(isCurrentContext() || isCurrentSharegroup()); \ if (IGL_DEBUG_VERIFY(funcPtr)) { \ callCounter_++; \ (*funcPtr)(__VA_ARGS__); \ } #define GLCALL_PROC_WITH_RETURN(ret, funcPtr, returnOnError, ...) \ IGL_SOFT_ASSERT(isCurrentContext() || isCurrentSharegroup()); \ if (IGL_DEBUG_VERIFY(funcPtr)) { \ callCounter_++; \ ret = (*funcPtr)(__VA_ARGS__); \ } else { \ ret = returnOnError; \ } #if IGL_DEBUG #define GLCHECK_ERRORS() \ do { \ if (alwaysCheckError_) { \ checkForErrors(__FUNCTION__, __LINE__); \ } \ } while (false) #define GL_ASSERT_ERROR(condition, callerName, lineNum, errorCode) \ IGL_DEBUG_ASSERT((condition), \ "[IGL] OpenGL error [%s:%zu] 0x%04X: %s\n", \ callerName, \ lineNum, \ errorCode, \ GL_ERROR_TO_STRING(errorCode)) #else #define GLCHECK_ERRORS() static_cast(0) #define GL_ASSERT_ERROR(condition, callerName, lineNum, errorCode) static_cast(0) #endif // IGL_DEBUG #define RESULT_CASE(res) \ case res: \ return #res; #if IGL_API_LOG // Enclose this function with the #ifdef to stop the compiler // from complaining that this function is unused (in the non debug/log path) namespace { std::string GLboolToString(GLboolean val) { return val ? "true" : "false"; } std::string GLenumToString(GLenum code) { switch (code) { RESULT_CASE(GL_ACTIVE_ATTRIBUTES) RESULT_CASE(GL_ACTIVE_ATTRIBUTE_MAX_LENGTH) RESULT_CASE(GL_ACTIVE_RESOURCES) RESULT_CASE(GL_ACTIVE_TEXTURE) RESULT_CASE(GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH) RESULT_CASE(GL_ACTIVE_UNIFORM_BLOCKS) RESULT_CASE(GL_ACTIVE_UNIFORM_MAX_LENGTH) RESULT_CASE(GL_ACTIVE_UNIFORMS) RESULT_CASE(GL_ALIASED_LINE_WIDTH_RANGE) RESULT_CASE(GL_ALPHA_BITS) RESULT_CASE(GL_ALPHA8) RESULT_CASE(GL_ALWAYS) RESULT_CASE(GL_ARRAY_BUFFER) RESULT_CASE(GL_ARRAY_BUFFER_BINDING) RESULT_CASE(GL_ATTACHED_SHADERS) RESULT_CASE(GL_BACK) RESULT_CASE(GL_BGR) RESULT_CASE(GL_BGRA) RESULT_CASE(GL_BGRA8_EXT) RESULT_CASE(GL_BLEND) RESULT_CASE(GL_BLEND_COLOR) RESULT_CASE(GL_BLEND_DST_ALPHA) RESULT_CASE(GL_BLEND_EQUATION_RGB) RESULT_CASE(GL_BLEND_EQUATION_ALPHA) RESULT_CASE(GL_BLEND_SRC_ALPHA) RESULT_CASE(GL_BLEND_SRC_RGB) RESULT_CASE(GL_BLUE) RESULT_CASE(GL_BUFFER) RESULT_CASE(GL_BUFFER_BINDING) RESULT_CASE(GL_BUFFER_OBJECT_EXT) RESULT_CASE(GL_BUFFER_SIZE) RESULT_CASE(GL_BUFFER_USAGE) RESULT_CASE(GL_BYTE) RESULT_CASE(GL_CLAMP_TO_EDGE) RESULT_CASE(GL_COLOR) RESULT_CASE(GL_COLOR_ATTACHMENT0) RESULT_CASE(GL_COLOR_ATTACHMENT1) RESULT_CASE(GL_COMPARE_REF_TO_TEXTURE) RESULT_CASE(GL_COMPRESSED_R11_EAC) RESULT_CASE(GL_COMPRESSED_RG11_EAC) RESULT_CASE(GL_COMPRESSED_RGB8_ETC2) RESULT_CASE(GL_COMPRESSED_RGBA8_ETC2_EAC) RESULT_CASE(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2) RESULT_CASE(GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG) RESULT_CASE(GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG) RESULT_CASE(GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG) RESULT_CASE(GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG) RESULT_CASE(GL_COMPRESSED_RGBA_ASTC_10x10_KHR) RESULT_CASE(GL_COMPRESSED_RGBA_ASTC_10x6_KHR) RESULT_CASE(GL_COMPRESSED_RGBA_ASTC_10x8_KHR) RESULT_CASE(GL_COMPRESSED_RGBA_ASTC_10x5_KHR) RESULT_CASE(GL_COMPRESSED_RGBA_ASTC_12x10_KHR) RESULT_CASE(GL_COMPRESSED_RGBA_ASTC_12x12_KHR) RESULT_CASE(GL_COMPRESSED_RGBA_ASTC_4x4_KHR) RESULT_CASE(GL_COMPRESSED_RGBA_ASTC_5x4_KHR) RESULT_CASE(GL_COMPRESSED_RGBA_ASTC_5x5_KHR) RESULT_CASE(GL_COMPRESSED_RGBA_ASTC_6x5_KHR) RESULT_CASE(GL_COMPRESSED_RGBA_ASTC_6x6_KHR) RESULT_CASE(GL_COMPRESSED_RGBA_ASTC_8x5_KHR) RESULT_CASE(GL_COMPRESSED_RGBA_ASTC_8x6_KHR) RESULT_CASE(GL_COMPRESSED_RGBA_ASTC_8x8_KHR) RESULT_CASE(GL_COMPRESSED_RGBA_BPTC_UNORM) RESULT_CASE(GL_COMPRESSED_SIGNED_R11_EAC) RESULT_CASE(GL_COMPRESSED_SIGNED_RG11_EAC) RESULT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR) RESULT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR) RESULT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR) RESULT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR) RESULT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR) RESULT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR) RESULT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR) RESULT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR) RESULT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR) RESULT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR) RESULT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR) RESULT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR) RESULT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR) RESULT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR) RESULT_CASE(GL_COMPRESSED_SRGB8_ETC2) RESULT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC) RESULT_CASE(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2) RESULT_CASE(GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM) RESULT_CASE(GL_COMPILE_STATUS) RESULT_CASE(GL_COMPUTE_SHADER) RESULT_CASE(GL_CONSTANT_ALPHA) RESULT_CASE(GL_CONSTANT_COLOR) RESULT_CASE(GL_COPY_READ_BUFFER) RESULT_CASE(GL_COPY_WRITE_BUFFER) RESULT_CASE(GL_CULL_FACE) RESULT_CASE(GL_CURRENT_PROGRAM) RESULT_CASE(GL_CW) RESULT_CASE(GL_CCW) RESULT_CASE(GL_CURRENT_VERTEX_ATTRIB) RESULT_CASE(GL_DEBUG_LOGGED_MESSAGES) RESULT_CASE(GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH) RESULT_CASE(GL_DEBUG_OUTPUT) RESULT_CASE(GL_DEBUG_SEVERITY_HIGH) RESULT_CASE(GL_DEBUG_SEVERITY_LOW) RESULT_CASE(GL_DEBUG_SEVERITY_MEDIUM) RESULT_CASE(GL_DEBUG_SEVERITY_NOTIFICATION) RESULT_CASE(GL_DEBUG_SOURCE_API) RESULT_CASE(GL_DEBUG_SOURCE_APPLICATION) RESULT_CASE(GL_DEBUG_SOURCE_OTHER) RESULT_CASE(GL_DEBUG_SOURCE_SHADER_COMPILER) RESULT_CASE(GL_DEBUG_SOURCE_THIRD_PARTY) RESULT_CASE(GL_DEBUG_SOURCE_WINDOW_SYSTEM) RESULT_CASE(GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR) RESULT_CASE(GL_DEBUG_TYPE_ERROR) RESULT_CASE(GL_DEBUG_TYPE_MARKER) RESULT_CASE(GL_DEBUG_TYPE_OTHER) RESULT_CASE(GL_DEBUG_TYPE_PERFORMANCE) RESULT_CASE(GL_DEBUG_TYPE_PORTABILITY) RESULT_CASE(GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR) RESULT_CASE(GL_DECR) RESULT_CASE(GL_DECR_WRAP) RESULT_CASE(GL_DELETE_STATUS) RESULT_CASE(GL_DEPTH) RESULT_CASE(GL_DEPTH_ATTACHMENT) RESULT_CASE(GL_DEPTH_COMPONENT) RESULT_CASE(GL_DEPTH_COMPONENT16) RESULT_CASE(GL_DEPTH_COMPONENT24) RESULT_CASE(GL_DEPTH_COMPONENT32) RESULT_CASE(GL_DEPTH_STENCIL) RESULT_CASE(GL_DEPTH24_STENCIL8) RESULT_CASE(GL_DEPTH32F_STENCIL8) RESULT_CASE(GL_DEPTH_TEST) RESULT_CASE(GL_DITHER) RESULT_CASE(GL_DONT_CARE) RESULT_CASE(GL_DRAW_FRAMEBUFFER) RESULT_CASE(GL_DRAW_INDIRECT_BUFFER) RESULT_CASE(GL_DST_ALPHA) RESULT_CASE(GL_DST_COLOR) RESULT_CASE(GL_DYNAMIC_COPY) RESULT_CASE(GL_DYNAMIC_DRAW) RESULT_CASE(GL_DYNAMIC_READ) RESULT_CASE(GL_ELEMENT_ARRAY_BUFFER) RESULT_CASE(GL_EQUAL) RESULT_CASE(GL_ETC1_RGB8_OES) RESULT_CASE(GL_EXTENSIONS) RESULT_CASE(GL_FASTEST) RESULT_CASE(GL_FILL) RESULT_CASE(GL_FLOAT) RESULT_CASE(GL_FLOAT_32_UNSIGNED_INT_24_8_REV) RESULT_CASE(GL_FLOAT_MAT2) RESULT_CASE(GL_FLOAT_MAT3) RESULT_CASE(GL_FLOAT_MAT4) RESULT_CASE(GL_FLOAT_VEC2) RESULT_CASE(GL_FLOAT_VEC3) RESULT_CASE(GL_FLOAT_VEC4) RESULT_CASE(GL_FRAGMENT_SHADER) RESULT_CASE(GL_FRAGMENT_SHADER_DERIVATIVE_HINT) RESULT_CASE(GL_FRAMEBUFFER) RESULT_CASE(GL_FRAMEBUFFER_DEFAULT) RESULT_CASE(GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE) RESULT_CASE(GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE) RESULT_CASE(GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE) RESULT_CASE(GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING) RESULT_CASE(GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE) RESULT_CASE(GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE) RESULT_CASE(GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) RESULT_CASE(GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE) RESULT_CASE(GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE) RESULT_CASE(GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE) RESULT_CASE(GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE) RESULT_CASE(GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL) RESULT_CASE(GL_FRAMEBUFFER_BINDING) RESULT_CASE(GL_FRAMEBUFFER_COMPLETE) RESULT_CASE(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT) RESULT_CASE(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT) RESULT_CASE(GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS) RESULT_CASE(GL_FRAMEBUFFER_UNDEFINED) RESULT_CASE(GL_FRAMEBUFFER_UNSUPPORTED) RESULT_CASE(GL_FRAMEBUFFER_SRGB) RESULT_CASE(GL_FRONT) RESULT_CASE(GL_FRONT_AND_BACK) RESULT_CASE(GL_FUNC_ADD) RESULT_CASE(GL_FUNC_SUBTRACT) RESULT_CASE(GL_FUNC_REVERSE_SUBTRACT) RESULT_CASE(GL_KEEP) RESULT_CASE(GL_GENERATE_MIPMAP_HINT) RESULT_CASE(GL_GEQUAL) RESULT_CASE(GL_GREATER) RESULT_CASE(GL_GREEN) RESULT_CASE(GL_HALF_FLOAT) RESULT_CASE(GL_HALF_FLOAT_OES) RESULT_CASE(GL_HANDLE_TYPE_OPAQUE_FD_EXT) RESULT_CASE(GL_HIGH_FLOAT) RESULT_CASE(GL_HIGH_INT) RESULT_CASE(GL_IMAGE_1D) RESULT_CASE(GL_IMAGE_1D_ARRAY) RESULT_CASE(GL_IMAGE_2D) RESULT_CASE(GL_IMAGE_2D_MULTISAMPLE) RESULT_CASE(GL_IMAGE_2D_ARRAY) RESULT_CASE(GL_IMAGE_2D_MULTISAMPLE_ARRAY) RESULT_CASE(GL_IMAGE_3D) RESULT_CASE(GL_IMAGE_CUBE) RESULT_CASE(GL_INCR) RESULT_CASE(GL_INCR_WRAP) RESULT_CASE(GL_INFO_LOG_LENGTH) RESULT_CASE(GL_INT) RESULT_CASE(GL_INT_2_10_10_10_REV) RESULT_CASE(GL_INVERT) RESULT_CASE(GL_LESS) RESULT_CASE(GL_LEQUAL) RESULT_CASE(GL_LINE) RESULT_CASE(GL_LINE_STRIP) RESULT_CASE(GL_LINE_LOOP) RESULT_CASE(GL_LINEAR) RESULT_CASE(GL_LINEAR_MIPMAP_NEAREST) RESULT_CASE(GL_LINEAR_MIPMAP_LINEAR) RESULT_CASE(GL_LINES) RESULT_CASE(GL_LINK_STATUS) RESULT_CASE(GL_LOW_FLOAT) RESULT_CASE(GL_LOW_INT) RESULT_CASE(GL_LUMINANCE) RESULT_CASE(GL_LUMINANCE_ALPHA) RESULT_CASE(GL_LUMINANCE8) RESULT_CASE(GL_LUMINANCE8_ALPHA8) RESULT_CASE(GL_MAX) RESULT_CASE(GL_MAX_COMPUTE_UNIFORM_COMPONENTS) RESULT_CASE(GL_MAX_CUBE_MAP_TEXTURE_SIZE) RESULT_CASE(GL_MAX_DEBUG_GROUP_STACK_DEPTH) RESULT_CASE(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS) RESULT_CASE(GL_MAX_FRAGMENT_UNIFORM_VECTORS) RESULT_CASE(GL_MAX_NAME_LENGTH) RESULT_CASE(GL_MAX_SAMPLES) RESULT_CASE(GL_MAX_SAMPLES_IMG) RESULT_CASE(GL_MAX_TEXTURE_SIZE) RESULT_CASE(GL_MAX_UNIFORM_BLOCK_SIZE) RESULT_CASE(GL_MAX_VERTEX_ATTRIBS) RESULT_CASE(GL_MAX_VERTEX_UNIFORM_COMPONENTS) RESULT_CASE(GL_MAX_VERTEX_UNIFORM_VECTORS) RESULT_CASE(GL_MEDIUM_FLOAT) RESULT_CASE(GL_MEDIUM_INT) RESULT_CASE(GL_MIN) RESULT_CASE(GL_MIRRORED_REPEAT) RESULT_CASE(GL_NEAREST) RESULT_CASE(GL_NEAREST_MIPMAP_NEAREST) RESULT_CASE(GL_NEAREST_MIPMAP_LINEAR) RESULT_CASE(GL_NEVER) RESULT_CASE(GL_NICEST) RESULT_CASE(GL_NOTEQUAL) RESULT_CASE(GL_NUM_EXTENSIONS) RESULT_CASE(GL_ONE_MINUS_CONSTANT_ALPHA) RESULT_CASE(GL_ONE_MINUS_CONSTANT_COLOR) RESULT_CASE(GL_ONE_MINUS_DST_ALPHA) RESULT_CASE(GL_ONE_MINUS_DST_COLOR) RESULT_CASE(GL_ONE_MINUS_SRC_ALPHA) RESULT_CASE(GL_ONE_MINUS_SRC_COLOR) RESULT_CASE(GL_PACK_ALIGNMENT) RESULT_CASE(GL_PACK_ROW_LENGTH) RESULT_CASE(GL_PIXEL_PACK_BUFFER) RESULT_CASE(GL_PIXEL_UNPACK_BUFFER) RESULT_CASE(GL_POINTS) RESULT_CASE(GL_POLYGON_OFFSET_FILL) RESULT_CASE(GL_PROGRAM) RESULT_CASE(GL_PROGRAM_OBJECT_EXT) RESULT_CASE(GL_R16) RESULT_CASE(GL_R16F) RESULT_CASE(GL_R16UI) RESULT_CASE(GL_R8) RESULT_CASE(GL_R32F) RESULT_CASE(GL_READ_FRAMEBUFFER) RESULT_CASE(GL_READ_FRAMEBUFFER_BINDING) RESULT_CASE(GL_READ_ONLY) RESULT_CASE(GL_READ_WRITE) RESULT_CASE(GL_RED) RESULT_CASE(GL_RED_INTEGER) RESULT_CASE(GL_RENDERBUFFER) RESULT_CASE(GL_RENDERBUFFER_ALPHA_SIZE) RESULT_CASE(GL_RENDERBUFFER_BINDING) RESULT_CASE(GL_RENDERBUFFER_BLUE_SIZE) RESULT_CASE(GL_RENDERBUFFER_DEPTH_SIZE) RESULT_CASE(GL_RENDERBUFFER_GREEN_SIZE) RESULT_CASE(GL_RENDERBUFFER_HEIGHT) RESULT_CASE(GL_RENDERBUFFER_INTERNAL_FORMAT) RESULT_CASE(GL_RENDERBUFFER_RED_SIZE) RESULT_CASE(GL_RENDERBUFFER_STENCIL_SIZE) RESULT_CASE(GL_RENDERBUFFER_WIDTH) RESULT_CASE(GL_RENDERER) RESULT_CASE(GL_REPEAT) RESULT_CASE(GL_RG) RESULT_CASE(GL_RG_INTEGER) RESULT_CASE(GL_RG16) RESULT_CASE(GL_RG16F) RESULT_CASE(GL_RG16UI) RESULT_CASE(GL_RG8) RESULT_CASE(GL_RGB) RESULT_CASE(GL_RGB_422_APPLE) RESULT_CASE(GL_RGB_INTEGER) RESULT_CASE(GL_RGB_RAW_422_APPLE) RESULT_CASE(GL_RGB10_A2) RESULT_CASE(GL_RGB10_A2UI) RESULT_CASE(GL_RGB16F) RESULT_CASE(GL_RGB32F) RESULT_CASE(GL_RGB5_A1) RESULT_CASE(GL_RGB8) RESULT_CASE(GL_RGBA) RESULT_CASE(GL_RGBA_INTEGER) RESULT_CASE(GL_RGBA16F) RESULT_CASE(GL_RGBA32F) RESULT_CASE(GL_RGBA32UI) RESULT_CASE(GL_RGBA4) RESULT_CASE(GL_RGBA8) RESULT_CASE(GL_REPLACE) RESULT_CASE(GL_SAMPLE_ALPHA_TO_COVERAGE) RESULT_CASE(GL_SAMPLE_COVERAGE) RESULT_CASE(GL_SAMPLER_1D) RESULT_CASE(GL_SAMPLER_1D_ARRAY) RESULT_CASE(GL_SAMPLER_2D) RESULT_CASE(GL_SAMPLER_2D_ARRAY) RESULT_CASE(GL_SAMPLER_2D_MULTISAMPLE) RESULT_CASE(GL_SAMPLER_3D) RESULT_CASE(GL_SAMPLER_EXTERNAL_OES) RESULT_CASE(GL_SCISSOR_TEST) RESULT_CASE(GL_SHADER) RESULT_CASE(GL_SHADER_OBJECT_EXT) RESULT_CASE(GL_SHADER_SOURCE_LENGTH) RESULT_CASE(GL_SHADER_STORAGE_BLOCK) RESULT_CASE(GL_SHADER_STORAGE_BUFFER) RESULT_CASE(GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT) RESULT_CASE(GL_SHADER_TYPE) RESULT_CASE(GL_SHADING_LANGUAGE_VERSION) RESULT_CASE(GL_SHORT) RESULT_CASE(GL_SIGNALED) RESULT_CASE(GL_SIGNED_NORMALIZED) RESULT_CASE(GL_SRGB) RESULT_CASE(GL_SRGB_ALPHA) RESULT_CASE(GL_SRGB8) RESULT_CASE(GL_SRGB8_ALPHA8) RESULT_CASE(GL_SRC_ALPHA) RESULT_CASE(GL_SRC_ALPHA_SATURATE) RESULT_CASE(GL_SRC_COLOR) RESULT_CASE(GL_STATIC_COPY) RESULT_CASE(GL_STATIC_DRAW) RESULT_CASE(GL_STATIC_READ) RESULT_CASE(GL_STENCIL) RESULT_CASE(GL_STENCIL_INDEX) RESULT_CASE(GL_STENCIL_INDEX8) RESULT_CASE(GL_STENCIL_TEST) RESULT_CASE(GL_STENCIL_ATTACHMENT) RESULT_CASE(GL_STREAM_COPY) RESULT_CASE(GL_STREAM_DRAW) RESULT_CASE(GL_STREAM_READ) RESULT_CASE(GL_SYNC_GPU_COMMANDS_COMPLETE) RESULT_CASE(GL_SYNC_STATUS) RESULT_CASE(GL_TEXTURE_SWIZZLE_A) RESULT_CASE(GL_TEXTURE_SWIZZLE_B) RESULT_CASE(GL_TEXTURE_SWIZZLE_G) RESULT_CASE(GL_TEXTURE_SWIZZLE_R) RESULT_CASE(GL_TEXTURE) RESULT_CASE(GL_TEXTURE_1D) RESULT_CASE(GL_TEXTURE_1D_ARRAY) RESULT_CASE(GL_TEXTURE_2D) RESULT_CASE(GL_TEXTURE_2D_MULTISAMPLE) RESULT_CASE(GL_TEXTURE_2D_ARRAY) RESULT_CASE(GL_TEXTURE_2D_MULTISAMPLE_ARRAY) RESULT_CASE(GL_TEXTURE_3D) RESULT_CASE(GL_TEXTURE_COMPARE_FUNC) RESULT_CASE(GL_TEXTURE_COMPARE_MODE) RESULT_CASE(GL_TEXTURE_CUBE_MAP) RESULT_CASE(GL_TEXTURE_CUBE_MAP_NEGATIVE_X) RESULT_CASE(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y) RESULT_CASE(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z) RESULT_CASE(GL_TEXTURE_CUBE_MAP_POSITIVE_X) RESULT_CASE(GL_TEXTURE_CUBE_MAP_POSITIVE_Y) RESULT_CASE(GL_TEXTURE_CUBE_MAP_POSITIVE_Z) RESULT_CASE(GL_TEXTURE_CUBE_MAP_SEAMLESS) RESULT_CASE(GL_TEXTURE_EXTERNAL_OES) RESULT_CASE(GL_TEXTURE_MAG_FILTER) RESULT_CASE(GL_TEXTURE_MAX_LEVEL) RESULT_CASE(GL_TEXTURE_MAX_LOD) RESULT_CASE(GL_TEXTURE_MAX_ANISOTROPY) RESULT_CASE(GL_MAX_TEXTURE_MAX_ANISOTROPY) RESULT_CASE(GL_MAX_TEXTURE_LOD_BIAS) RESULT_CASE(GL_TEXTURE_LOD_BIAS) RESULT_CASE(GL_TEXTURE_MIN_FILTER) RESULT_CASE(GL_TEXTURE_MIN_LOD) RESULT_CASE(GL_TEXTURE_RECTANGLE) RESULT_CASE(GL_TEXTURE_WRAP_R) RESULT_CASE(GL_TEXTURE_WRAP_S) RESULT_CASE(GL_TEXTURE_WRAP_T) RESULT_CASE(GL_TEXTURE0) RESULT_CASE(GL_TEXTURE1) RESULT_CASE(GL_TEXTURE2) RESULT_CASE(GL_TEXTURE3) RESULT_CASE(GL_TEXTURE4) RESULT_CASE(GL_TEXTURE5) RESULT_CASE(GL_TEXTURE6) RESULT_CASE(GL_TEXTURE7) RESULT_CASE(GL_TEXTURE8) RESULT_CASE(GL_TRIANGLES) RESULT_CASE(GL_TRIANGLE_FAN) RESULT_CASE(GL_TRIANGLE_STRIP) RESULT_CASE(GL_TRANSFORM_FEEDBACK_BUFFER) RESULT_CASE(GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES) RESULT_CASE(GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS) RESULT_CASE(GL_UNIFORM_BLOCK_BINDING) RESULT_CASE(GL_UNIFORM_BLOCK_DATA_SIZE) RESULT_CASE(GL_UNIFORM_BUFFER) RESULT_CASE(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT) RESULT_CASE(GL_UNIFORM_NAME_LENGTH) RESULT_CASE(GL_UNIFORM_OFFSET) RESULT_CASE(GL_UNPACK_ALIGNMENT) RESULT_CASE(GL_UNPACK_ROW_LENGTH) RESULT_CASE(GL_UNSIGNED_BYTE) RESULT_CASE(GL_UNSIGNED_INT) RESULT_CASE(GL_UNSIGNED_INT_10F_11F_11F_REV) RESULT_CASE(GL_UNSIGNED_INT_2_10_10_10_REV) RESULT_CASE(GL_UNSIGNED_INT_24_8) RESULT_CASE(GL_UNSIGNED_INT_5_9_9_9_REV) RESULT_CASE(GL_UNSIGNED_INT_8_8_8_8_REV) RESULT_CASE(GL_UNSIGNED_SHORT) RESULT_CASE(GL_UNSIGNED_SHORT_1_5_5_5_REV) RESULT_CASE(GL_UNSIGNED_SHORT_4_4_4_4) RESULT_CASE(GL_UNSIGNED_SHORT_4_4_4_4_REV) RESULT_CASE(GL_UNSIGNED_SHORT_5_5_5_1) RESULT_CASE(GL_UNSIGNED_SHORT_5_6_5) RESULT_CASE(GL_UNSIGNED_SHORT_8_8_APPLE) RESULT_CASE(GL_UNSIGNED_SHORT_8_8_REV_APPLE) RESULT_CASE(GL_UNSIGNED_NORMALIZED) RESULT_CASE(GL_VALIDATE_STATUS) RESULT_CASE(GL_VENDOR) RESULT_CASE(GL_VERSION) RESULT_CASE(GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING) RESULT_CASE(GL_VERTEX_ATTRIB_ARRAY_ENABLED) RESULT_CASE(GL_VERTEX_ATTRIB_ARRAY_NORMALIZED) RESULT_CASE(GL_VERTEX_ATTRIB_ARRAY_SIZE) RESULT_CASE(GL_VERTEX_ATTRIB_ARRAY_STRIDE) RESULT_CASE(GL_VERTEX_ATTRIB_ARRAY_TYPE) RESULT_CASE(GL_VERTEX_ARRAY_BINDING) RESULT_CASE(GL_VERTEX_SHADER) RESULT_CASE(GL_VIEWPORT) RESULT_CASE(GL_WRITE_ONLY) default: std::stringstream stream; stream << "0x" << std::hex << code; return stream.str(); } } std::string clearBitsToString(GLbitfield bits) { bool first = true; std::stringstream ss; if ((bits & GL_COLOR_BUFFER_BIT) != 0) { ss << (first ? "" : " | ") << "GL_COLOR_BUFFER_BIT"; first = false; } if ((bits & GL_DEPTH_BUFFER_BIT) != 0) { ss << (first ? "" : " | ") << "GL_DEPTH_BUFFER_BIT"; first = false; } if ((bits & GL_STENCIL_BUFFER_BIT) != 0) { ss << (first ? "" : " | ") << "GL_STENCIL_BUFFER_BIT"; first = false; } return ss.str(); } std::string mapBufferRangeBitsToString(GLbitfield bits) { bool first = true; std::stringstream ss; if ((bits & GL_MAP_READ_BIT) != 0) { ss << (first ? "" : " | ") << "GL_MAP_READ_BIT"; first = false; } if ((bits & GL_MAP_WRITE_BIT) != 0) { ss << (first ? "" : " | ") << "GL_MAP_WRITE_BIT"; first = false; } if ((bits & GL_MAP_PERSISTENT_BIT) != 0) { ss << (first ? "" : " | ") << "GL_MAP_PERSISTENT_BIT"; first = false; } if ((bits & GL_MAP_COHERENT_BIT) != 0) { ss << (first ? "" : " | ") << "GL_MAP_COHERENT_BIT"; first = false; } if ((bits & GL_MAP_INVALIDATE_RANGE_BIT) != 0) { ss << (first ? "" : " | ") << "GL_MAP_INVALIDATE_RANGE_BIT"; first = false; } if ((bits & GL_MAP_INVALIDATE_BUFFER_BIT) != 0) { ss << (first ? "" : " | ") << "GL_MAP_INVALIDATE_BUFFER_BIT"; first = false; } if ((bits & GL_MAP_FLUSH_EXPLICIT_BIT) != 0) { ss << (first ? "" : " | ") << "GL_MAP_FLUSH_EXPLICIT_BIT"; first = false; } if ((bits & GL_MAP_UNSYNCHRONIZED_BIT) != 0) { ss << (first ? "" : " | ") << "GL_MAP_UNSYNCHRONIZED_BIT"; first = false; } return ss.str(); } std::string memoryBarrierBitsToString(GLbitfield bits) { bool first = true; std::stringstream ss; if ((bits & GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT) != 0) { ss << (first ? "" : " | ") << "GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT"; first = false; } if ((bits & GL_ELEMENT_ARRAY_BARRIER_BIT) != 0) { ss << (first ? "" : " | ") << "GL_ELEMENT_ARRAY_BARRIER_BIT"; first = false; } if ((bits & GL_UNIFORM_BARRIER_BIT) != 0) { ss << (first ? "" : " | ") << "GL_UNIFORM_BARRIER_BIT"; first = false; } if ((bits & GL_TEXTURE_FETCH_BARRIER_BIT) != 0) { ss << (first ? "" : " | ") << "GL_TEXTURE_FETCH_BARRIER_BIT"; first = false; } if ((bits & GL_SHADER_IMAGE_ACCESS_BARRIER_BIT) != 0) { ss << (first ? "" : " | ") << "GL_SHADER_IMAGE_ACCESS_BARRIER_BIT"; first = false; } if ((bits & GL_COMMAND_BARRIER_BIT) != 0) { ss << (first ? "" : " | ") << "GL_COMMAND_BARRIER_BIT"; first = false; } if ((bits & GL_PIXEL_BUFFER_BARRIER_BIT) != 0) { ss << (first ? "" : " | ") << "GL_PIXEL_BUFFER_BARRIER_BIT"; first = false; } if ((bits & GL_TEXTURE_UPDATE_BARRIER_BIT) != 0) { ss << (first ? "" : " | ") << "GL_TEXTURE_UPDATE_BARRIER_BIT"; first = false; } if ((bits & GL_BUFFER_UPDATE_BARRIER_BIT) != 0) { ss << (first ? "" : " | ") << "GL_BUFFER_UPDATE_BARRIER_BIT"; first = false; } if ((bits & GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT) != 0) { ss << (first ? "" : " | ") << "GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT"; first = false; } if ((bits & GL_FRAMEBUFFER_BARRIER_BIT) != 0) { ss << (first ? "" : " | ") << "GL_FRAMEBUFFER_BARRIER_BIT"; first = false; } if ((bits & GL_TRANSFORM_FEEDBACK_BARRIER_BIT) != 0) { ss << (first ? "" : " | ") << "GL_TRANSFORM_FEEDBACK_BARRIER_BIT"; first = false; } if ((bits & GL_ATOMIC_COUNTER_BARRIER_BIT) != 0) { ss << (first ? "" : " | ") << "GL_ATOMIC_COUNTER_BARRIER_BIT"; first = false; } if ((bits & GL_SHADER_STORAGE_BARRIER_BIT) != 0) { ss << (first ? "" : " | ") << "GL_SHADER_STORAGE_BARRIER_BIT"; first = false; } if ((bits & GL_QUERY_BUFFER_BARRIER_BIT) != 0) { ss << (first ? "" : " | ") << "GL_QUERY_BUFFER_BARRIER_BIT"; first = false; } return ss.str(); } #define GL_ENUM_TO_STRING(code) GLenumToString(code).c_str() #define GL_BOOL_TO_STRING(code) GLboolToString(code).c_str() #define GL_CLEAR_BITS_TO_STRING(bits) clearBitsToString(bits).c_str() #define GL_MAP_BUFFER_RANGE_BITS_TO_STRING(bits) mapBufferRangeBitsToString(bits).c_str() #define GL_MEMORY_BARRIER_BITS_TO_STRING(bits) memoryBarrierBitsToString(bits).c_str() bool isTextureUniform(GLenum type) { switch (type) { case GL_SAMPLER_2D: case GL_SAMPLER_3D: case GL_SAMPLER_CUBE: case GL_SAMPLER_2D_SHADOW: case GL_SAMPLER_2D_ARRAY: case GL_SAMPLER_2D_ARRAY_SHADOW: case GL_SAMPLER_2D_MULTISAMPLE: return true; default: return false; } } bool isTextureImageUniform(GLenum type) { switch (type) { case GL_IMAGE_2D: case GL_IMAGE_3D: case GL_IMAGE_CUBE: case GL_IMAGE_2D_ARRAY: case GL_IMAGE_2D_MULTISAMPLE: case GL_IMAGE_2D_MULTISAMPLE_ARRAY: return true; default: return false; } } } // namespace #endif // IGL_API_LOG // Debug logging is not included in code coverage // FIXME_DEPRECATED_COVERAGE_EXCLUDE_START namespace { #if IGL_DEBUG || IGL_API_LOG const char* glDebugSeverityToString(GLenum severity) { switch (severity) { RESULT_CASE(GL_DEBUG_SEVERITY_HIGH) RESULT_CASE(GL_DEBUG_SEVERITY_LOW) RESULT_CASE(GL_DEBUG_SEVERITY_MEDIUM) RESULT_CASE(GL_DEBUG_SEVERITY_NOTIFICATION) default: return "GL_DEBUG_SEVERITY_UNKNOWN"; } } const char* glDebugSourceToString(GLenum source) { switch (source) { RESULT_CASE(GL_DEBUG_SOURCE_API) RESULT_CASE(GL_DEBUG_SOURCE_APPLICATION) RESULT_CASE(GL_DEBUG_SOURCE_OTHER) RESULT_CASE(GL_DEBUG_SOURCE_SHADER_COMPILER) RESULT_CASE(GL_DEBUG_SOURCE_THIRD_PARTY) RESULT_CASE(GL_DEBUG_SOURCE_WINDOW_SYSTEM) default: return "GL_DEBUG_SOURCE_WINDOW_UNKNOWN"; } } const char* glDebugTypeToString(GLenum type) { switch (type) { RESULT_CASE(GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR) RESULT_CASE(GL_DEBUG_TYPE_ERROR) RESULT_CASE(GL_DEBUG_TYPE_MARKER) RESULT_CASE(GL_DEBUG_TYPE_OTHER) RESULT_CASE(GL_DEBUG_TYPE_PERFORMANCE) RESULT_CASE(GL_DEBUG_TYPE_PORTABILITY) RESULT_CASE(GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR) default: return "GL_DEBUG_TYPE_UNDEFINED_UNKNOWN"; } } void logDebugMessage(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message) { const auto logLevel = severity == GL_DEBUG_SEVERITY_HIGH ? IGLLogError : (severity == GL_DEBUG_SEVERITY_MEDIUM ? IGLLogWarning : IGLLogInfo); IGLLog(logLevel, "%s %s %u %s: %.*s\n", glDebugSourceToString(source), glDebugTypeToString(type), id, glDebugSeverityToString(severity), static_cast(message ? length : 0), message ? message : ""); } #if IGL_API_LOG void logOpenGlDebugMessage(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam) { logDebugMessage(source, type, id, severity, length, message); } #endif // IGL_API_LOG #endif // IGL_DEBUG || IGL_API_LOG } // namespace // FIXME_DEPRECATED_COVERAGE_EXCLUDE_END namespace igl::opengl { namespace { const char* GLerrorToString(GLenum error) { switch (error) { case GL_NO_ERROR: return ""; RESULT_CASE(GL_INVALID_ENUM) RESULT_CASE(GL_INVALID_VALUE) RESULT_CASE(GL_INVALID_OPERATION) RESULT_CASE(GL_INVALID_FRAMEBUFFER_OPERATION) RESULT_CASE(GL_OUT_OF_MEMORY) default: return "UNKNOWN GL ERROR"; } } Result::Code GLerrorToCode(GLenum error) { switch (error) { case GL_NO_ERROR: return Result::Code::Ok; case GL_INVALID_ENUM: case GL_INVALID_VALUE: return Result::Code::ArgumentInvalid; case GL_INVALID_OPERATION: case GL_INVALID_FRAMEBUFFER_OPERATION: return Result::Code::InvalidOperation; default: return Result::Code::RuntimeError; } } #define GL_ERROR_TO_STRING(error) GLerrorToString(error) #define GL_ERROR_TO_RESULT(error) Result(GLerrorToCode(error), GLerrorToString(error)) } // namespace // NOLINTNEXTLINE(modernize-use-equals-default) IContext::IContext() : deviceFeatureSet_(*this) { #if IGL_DEBUG // In debug mode, we default to always checking errors after each OGL call alwaysCheckError_ = true; #endif #if defined(IGL_VALIDATE_SHADERS) shouldValidateShaders_ = true; #endif } IContext::~IContext() { IGL_SOFT_ASSERT(refCount_ == 0, "Dangling IContext reference left behind." // @fb-only ); // Clear the zombie guard explicitly so our "secret" stays secret. zombieGuard_ = 0; } #if IGL_API_LOG void IContext::setBoundTexture(GLenum target, GLuint texture) { switch (target) { case GL_TEXTURE_2D: boundTexture2D_ = texture; break; case GL_TEXTURE_3D: boundTexture3D_ = texture; break; case GL_TEXTURE_CUBE_MAP: case GL_TEXTURE_CUBE_MAP_POSITIVE_X: case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: boundTextureCubeMap_ = texture; break; case GL_TEXTURE_2D_ARRAY: boundTexture2DArray_ = texture; break; case GL_TEXTURE_EXTERNAL_OES: boundTextureExternalOes_ = texture; break; default: IGL_DEBUG_ABORT("Unsupported texture target: %s", GL_ENUM_TO_STRING(target)); break; } } GLuint IContext::boundTexture(GLenum target) const { switch (target) { case GL_TEXTURE_2D: return boundTexture2D_; case GL_TEXTURE_3D: return boundTexture3D_; case GL_TEXTURE_CUBE_MAP: case GL_TEXTURE_CUBE_MAP_POSITIVE_X: case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: return boundTextureCubeMap_; case GL_TEXTURE_2D_ARRAY: return boundTexture2DArray_; case GL_TEXTURE_EXTERNAL_OES: return boundTextureExternalOes_; default: IGL_DEBUG_ABORT("Unsupported texture target: %s", GL_ENUM_TO_STRING(target)); return 0; break; } } void IContext::setBoundBuffer(GLenum target, GLuint buffer) { switch (target) { case GL_ARRAY_BUFFER: boundArrayBuffer_ = buffer; break; case GL_DRAW_INDIRECT_BUFFER: boundDrawIndirectBuffer_ = buffer; break; case GL_COPY_READ_BUFFER: boundCopyReadBuffer_ = buffer; break; case GL_COPY_WRITE_BUFFER: boundCopyWriteBuffer_ = buffer; break; case GL_ELEMENT_ARRAY_BUFFER: boundElementArrayBuffer_ = buffer; break; case GL_PIXEL_PACK_BUFFER: boundPixelPackBuffer_ = buffer; break; case GL_PIXEL_UNPACK_BUFFER: boundPixelPackBuffer_ = buffer; break; case GL_SHADER_STORAGE_BUFFER: boundShaderStorageBuffer_ = buffer; break; case GL_UNIFORM_BUFFER: boundUniformBuffer_ = buffer; break; default: IGL_DEBUG_ABORT("Unsupported buffer target: %s", GL_ENUM_TO_STRING(target)); break; } } GLuint IContext::boundBuffer(GLenum target) const { switch (target) { case GL_ARRAY_BUFFER: return boundArrayBuffer_; case GL_DRAW_INDIRECT_BUFFER: return boundDrawIndirectBuffer_; case GL_COPY_READ_BUFFER: return boundCopyReadBuffer_; case GL_COPY_WRITE_BUFFER: return boundCopyWriteBuffer_; case GL_ELEMENT_ARRAY_BUFFER: return boundElementArrayBuffer_; case GL_PIXEL_PACK_BUFFER: return boundPixelPackBuffer_; case GL_PIXEL_UNPACK_BUFFER: return boundPixelPackBuffer_; case GL_SHADER_STORAGE_BUFFER: return boundShaderStorageBuffer_; case GL_UNIFORM_BUFFER: return boundUniformBuffer_; default: IGL_DEBUG_ABORT("Unsupported buffer target: %s", GL_ENUM_TO_STRING(target)); return 0; break; } } void IContext::setBoundFramebuffer(GLenum target, GLuint framebuffer) { switch (target) { case GL_READ_FRAMEBUFFER: boundReadFramebuffer_ = framebuffer; break; case GL_DRAW_FRAMEBUFFER: boundWriteFramebuffer_ = framebuffer; break; case GL_FRAMEBUFFER: boundReadFramebuffer_ = framebuffer; boundWriteFramebuffer_ = framebuffer; break; default: IGL_DEBUG_ABORT("Unsupported framebuffer target: %s", GL_ENUM_TO_STRING(target)); break; } } GLuint IContext::boundFramebuffer(GLenum target) const { switch (target) { case GL_READ_FRAMEBUFFER: return boundReadFramebuffer_; case GL_DRAW_FRAMEBUFFER: case GL_FRAMEBUFFER: return boundWriteFramebuffer_; default: IGL_DEBUG_ABORT("Unsupported framebuffer target: %s", GL_ENUM_TO_STRING(target)); return 0; break; } } void IContext::setFramebufferAttachment(GLenum target, GLenum attachment, bool isRenderbuffer, GLuint object) { const auto framebuffer = boundFramebuffer(target); auto& attachments = framebufferAttachments_[framebuffer]; if (attachment == GL_DEPTH_ATTACHMENT) { attachments.depthAttachment = object; attachments.depthIsRenderbuffer = isRenderbuffer; } else if (attachment == GL_STENCIL_ATTACHMENT) { attachments.stencilAttachment = object; attachments.stencilIsRenderbuffer = isRenderbuffer; } else if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) { attachments.stencilAttachment = object; attachments.stencilIsRenderbuffer = isRenderbuffer; attachments.depthAttachment = object; attachments.depthIsRenderbuffer = isRenderbuffer; } else if (attachment >= GL_COLOR_ATTACHMENT0 && (attachment - GL_COLOR_ATTACHMENT0) < attachments.colorAttachment.size()) { attachments.colorAttachment[attachment - GL_COLOR_ATTACHMENT0] = object; attachments.colorIsRenderbuffer.set(attachment - GL_COLOR_ATTACHMENT0, isRenderbuffer); } } const char* IContext::framebufferAttachmentType(GLenum target, GLenum attachment) const { bool isRenderbuffer = true; const auto framebuffer = boundFramebuffer(target); const auto it = framebufferAttachments_.find(framebuffer); if (it == framebufferAttachments_.end()) { return "unknown"; } const auto& attachments = it->second; if (attachment == GL_DEPTH_ATTACHMENT) { isRenderbuffer = attachments.depthIsRenderbuffer; } else if (attachment == GL_STENCIL_ATTACHMENT) { isRenderbuffer = attachments.stencilIsRenderbuffer; } else if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) { IGL_DEBUG_ASSERT(attachments.depthIsRenderbuffer == attachments.stencilIsRenderbuffer); if (attachments.depthIsRenderbuffer != attachments.stencilIsRenderbuffer) { return "unknown"; } isRenderbuffer = attachments.depthIsRenderbuffer; } else if (attachment >= GL_COLOR_ATTACHMENT0 && (attachment - GL_COLOR_ATTACHMENT0) < attachments.colorAttachment.size()) { isRenderbuffer = attachments.colorIsRenderbuffer.test(attachment - GL_COLOR_ATTACHMENT0); } else { return "unknown"; } if (isRenderbuffer) { return "renderbuffer"; } else { return "texture"; } } const char* IContext::framebufferAttachmentType(GLenum target, GLenum buffer, GLint drawbuffer) const { if (buffer == GL_COLOR) { return framebufferAttachmentType(target, GL_COLOR_ATTACHMENT0 + drawbuffer); } else if (buffer == GL_DEPTH) { IGL_DEBUG_ASSERT(drawbuffer == 0); return framebufferAttachmentType(target, GL_DEPTH_ATTACHMENT); } else if (buffer == GL_STENCIL) { IGL_DEBUG_ASSERT(drawbuffer == 0); return framebufferAttachmentType(target, GL_STENCIL_ATTACHMENT); } else if (buffer == GL_DEPTH_STENCIL) { IGL_DEBUG_ASSERT(drawbuffer == 0); return framebufferAttachmentType(target, GL_DEPTH_STENCIL_ATTACHMENT); } return "unknown"; } GLuint IContext::framebufferAttachment(GLenum target, GLenum attachment) const { const auto framebuffer = boundFramebuffer(target); const auto it = framebufferAttachments_.find(framebuffer); if (it == framebufferAttachments_.end()) { return 0; } const auto& attachments = it->second; if (attachment == GL_DEPTH_ATTACHMENT) { return attachments.depthAttachment; } else if (attachment == GL_STENCIL_ATTACHMENT) { return attachments.stencilAttachment; } else if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) { IGL_DEBUG_ASSERT(attachments.depthAttachment == attachments.stencilAttachment); if (attachments.depthAttachment != attachments.stencilAttachment) { return -1; } else { return attachments.depthAttachment; } } else if (attachment >= GL_COLOR_ATTACHMENT0 && (attachment - GL_COLOR_ATTACHMENT0) < attachments.colorAttachment.size()) { return attachments.colorAttachment[attachment - GL_COLOR_ATTACHMENT0]; } else { return 0; } } GLuint IContext::framebufferAttachment(GLenum target, GLenum buffer, GLint drawbuffer) const { if (buffer == GL_COLOR) { return framebufferAttachment(target, GL_COLOR_ATTACHMENT0 + drawbuffer); } else if (buffer == GL_DEPTH) { IGL_DEBUG_ASSERT(drawbuffer == 0); return framebufferAttachment(target, GL_DEPTH_ATTACHMENT); } else if (buffer == GL_STENCIL) { IGL_DEBUG_ASSERT(drawbuffer == 0); return framebufferAttachment(target, GL_STENCIL_ATTACHMENT); } else if (buffer == GL_DEPTH_STENCIL) { IGL_DEBUG_ASSERT(drawbuffer == 0); return framebufferAttachment(target, GL_DEPTH_STENCIL_ATTACHMENT); } return -1; } const char* IContext::framebufferReadBufferType(GLenum target) const { const auto framebuffer = boundFramebuffer(target); const auto it = framebufferAttachments_.find(framebuffer); if (it == framebufferAttachments_.end()) { return "unknown"; } return framebufferAttachmentType(target, GL_COLOR_ATTACHMENT0 + it->second.readBufferIndex); } GLuint IContext::framebufferReadBuffer(GLenum target) const { const auto framebuffer = boundFramebuffer(target); const auto it = framebufferAttachments_.find(framebuffer); if (it == framebufferAttachments_.end()) { return 0; } return framebufferAttachment(target, GL_COLOR_ATTACHMENT0 + it->second.readBufferIndex); } std::string IContext::affectedFramebufferAttachments(GLenum target, GLbitfield mask) const { std::stringstream ss; const auto framebuffer = boundFramebuffer(target); const auto it = framebufferAttachments_.find(framebuffer); if (it == framebufferAttachments_.end()) { return ss.str(); } const auto& attachments = it->second; bool first = true; if ((mask & GL_COLOR_BUFFER_BIT) != 0) { for (uint32_t i = 0; i < attachments.colorAttachment.size(); ++i) { if (attachments.colorAttachment[i] != 0) { ss << (first ? "" : " ") << "color " << i << " (" << (attachments.colorIsRenderbuffer.test(i) ? "renderbuffer" : "texture") << ": " << attachments.colorAttachment[i] << ")"; first = false; } } } if ((mask & GL_DEPTH_BUFFER_BIT) != 0 && attachments.depthAttachment != 0) { ss << (first ? "" : " ") << "depth (" << (attachments.depthIsRenderbuffer ? "renderbuffer" : "texture") << ": " << attachments.depthAttachment << ")"; first = false; } if ((mask & GL_STENCIL_BUFFER_BIT) != 0 && attachments.stencilAttachment != 0) { ss << (first ? "" : " ") << "stencil (" << (attachments.depthIsRenderbuffer ? "renderbuffer" : "texture") << ": " << attachments.depthAttachment << ")"; } return ss.str(); } std::string IContext::boundFramebufferAttachments(GLenum target) const { return affectedFramebufferAttachments( target, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); } std::string IContext::boundDrawBuffers() const { std::stringstream ss; bool first = true; for (uint32_t i = 0; i < enabledAttributes_.size(); ++i) { if (enabledAttributes_.test(i)) { ss << (first ? "" : " ") << "attribute " << i << " (buffer: " << boundAttributes_[i] << ")"; first = false; } } return ss.str(); } std::string IContext::boundImageTextures() const { std::stringstream ss; bool first = true; for (uint32_t i = 0; i < boundImageTextures_.size(); ++i) { if (boundImageTextures_[i] != 0) { ss << (first ? "" : " ") << "image " << i << " (texture: " << boundImageTextures_[i] << ")"; first = false; } } return ss.str(); } std::string IContext::boundDrawTextures() const { std::stringstream ss; bool first = true; for (uint32_t i = 0; i < boundDrawTextures_.size(); ++i) { if (boundDrawTextures_[i] != 0) { ss << (first ? "" : " ") << "draw " << i << " (texture: " << boundDrawTextures_[i] << ")"; first = false; } } return ss.str(); } std::string IContext::identifierLabel(GLuint identifier, GLuint name) const { std::stringstream ss; switch (identifier) { case GL_BUFFER: ss << "(buffer: " << name << ")"; break; case GL_FRAMEBUFFER: ss << "(framebuffer: " << name << ")"; break; case GL_PROGRAM: ss << "(program: " << name << ")"; break; case GL_RENDERBUFFER: ss << "(renderbuffer: " << name << ")"; break; case GL_TEXTURE: ss << "(texture: " << name << ")"; break; default: break; } return ss.str(); } std::string IContext::affectedMemoryBarrierObjects(GLbitfield bits) const { constexpr const GLbitfield kProgramBits = GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT | GL_ELEMENT_ARRAY_BARRIER_BIT | GL_UNIFORM_BARRIER_BIT | GL_TEXTURE_FETCH_BARRIER_BIT | GL_SHADER_IMAGE_ACCESS_BARRIER_BIT | GL_COMMAND_BARRIER_BIT | GL_PIXEL_BUFFER_BARRIER_BIT | GL_TEXTURE_UPDATE_BARRIER_BIT | GL_BUFFER_UPDATE_BARRIER_BIT | GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT | GL_FRAMEBUFFER_BARRIER_BIT | GL_TRANSFORM_FEEDBACK_BARRIER_BIT | GL_QUERY_BUFFER_BARRIER_BIT; constexpr const GLbitfield kTextureBits = GL_SHADER_IMAGE_ACCESS_BARRIER_BIT | GL_TEXTURE_FETCH_BARRIER_BIT | GL_TEXTURE_UPDATE_BARRIER_BIT | GL_FRAMEBUFFER_BARRIER_BIT; bool first = true; std::stringstream ss; if ((bits & kProgramBits) != 0) { ss << (first ? "" : " ") << "(program: " << boundProgram_ << ")"; first = false; } if ((bits & GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT) != 0) { ss << (first ? "" : " ") << boundDrawBuffers(); first = false; } if ((bits & GL_ELEMENT_ARRAY_BARRIER_BIT) != 0) { ss << (first ? "" : " ") << "element (buffer: " << boundElementArrayBuffer_ << ")"; first = false; } if ((bits & kTextureBits) != 0) { ss << (first ? "" : " "); if (lastCommandWasCompute_) { ss << boundImageTextures(); } else { ss << boundDrawTextures() << " " << boundFramebufferAttachments(GL_DRAW_FRAMEBUFFER) << " " << boundFramebufferAttachments(GL_READ_FRAMEBUFFER); } first = false; } if ((bits & GL_PIXEL_BUFFER_BARRIER_BIT) != 0 && (boundPixelPackBuffer_ != 0 || boundPixelUnpackBuffer_ != 0)) { ss << (first ? "" : " "); if (boundPixelUnpackBuffer_ != 0) { ss << "unpack (buffer: " << boundPixelUnpackBuffer_ << ")"; } if (boundPixelPackBuffer_ != 0) { ss << (boundPixelUnpackBuffer_ == 0 ? "" : " ") << "pack (buffer: " << boundPixelPackBuffer_ << ")"; } first = false; } if ((bits & GL_UNIFORM_BARRIER_BIT) != 0) { ss << (first ? "" : " ") << boundBuffersByIndex(/* ssbos */ false, /* ubos */ true); first = false; } if ((bits & GL_SHADER_STORAGE_BARRIER_BIT) != 0) { ss << (first ? "" : " ") << boundBuffersByIndex(/* ssbos */ true, /* ubos */ false); first = false; } return ss.str(); } void IContext::addProgramUniform(GLuint program, GLsizei* length, GLenum* type, GLchar* name) const { std::string nameStr(std::string_view(name, length == nullptr ? strlen(name) : *length)); auto& programUniforms = programUniforms_[program]; auto uniformIt = programUniforms.find(nameStr); if (uniformIt == programUniforms.end()) { uniformIt = programUniforms.emplace(std::move(nameStr), ProgramUniform{}).first; if (uniformIt == programUniforms.end()) { return; } } auto& uniform = uniformIt->second; uniform.type = (type == nullptr ? GL_NONE : *type); uniform.isTexture = isTextureUniform(uniform.type); uniform.isImage = isTextureImageUniform(uniform.type); } void IContext::setProgramUniformLocation(GLuint program, const GLchar* name, GLint location) const { if (location < 0) { return; } std::string nameStr(name); auto& programUniforms = programUniforms_[program]; auto uniformIt = programUniforms.find(nameStr); if (uniformIt == programUniforms.end()) { return; } auto& programUniformsByLocation = programUniformsByLocation_[program]; programUniformsByLocation[location] = std::move(nameStr); } void IContext::setProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar* name, GLuint index) const { if (programInterface == GL_SHADER_STORAGE_BLOCK) { programSsbosByIndex_[program][index] = name; } } std::string IContext::boundUniformTexture(GLuint program, GLint location, GLint unit) const { const auto programUniformsIt = programUniforms_.find(program); if (programUniformsIt == programUniforms_.end()) { return {}; } const auto& programUniforms = programUniformsIt->second; const auto programUniformsByLocationIt = programUniformsByLocation_.find(program); if (programUniformsByLocationIt == programUniformsByLocation_.end()) { return {}; } const auto& programUniformsByLocation = programUniformsByLocationIt->second; const auto uniformByLocationIt = programUniformsByLocation.find(location); if (uniformByLocationIt == programUniformsByLocation.end()) { return {}; } const auto uniformIt = programUniforms.find(uniformByLocationIt->second); if (uniformIt == programUniforms.end()) { return {}; } if (uniformIt->second.isTexture && unit >= 0 && unit < boundDrawTextures_.size()) { std::stringstream ss; ss << "(texture: " << boundDrawTextures_[unit] << ")"; return ss.str(); } if (uniformIt->second.isImage && unit >= 0 && unit < boundImageTextures_.size()) { std::stringstream ss; ss << "(texture: " << boundImageTextures_[unit] << ")"; return ss.str(); } return {}; } std::string IContext::boundBufferName(GLuint program, GLenum target, GLuint index) const { if (target == GL_SHADER_STORAGE_BUFFER) { const auto programSsbosByLocationIt = programSsbosByLocation_.find(program); if (programSsbosByLocationIt == programSsbosByLocation_.end()) { return {}; } const auto it = programSsbosByLocationIt->second.find(index); if (it == programSsbosByLocationIt->second.end()) { return {}; } std::stringstream ss; ss << "(ssbo: " << it->second << ")"; return ss.str(); } if (target == GL_UNIFORM_BUFFER) { const auto programUbosByLocationIt = programUbosByLocation_.find(program); if (programUbosByLocationIt == programUbosByLocation_.end()) { return {}; } const auto it = programUbosByLocationIt->second.find(index); if (it == programUbosByLocationIt->second.end()) { return {}; } std::stringstream ss; ss << "(ubo: " << it->second << ")"; return ss.str(); } return {}; } void IContext::setBoundBufferByIndex(GLenum target, GLuint index, GLuint buffer) { if (target == GL_SHADER_STORAGE_BUFFER) { if (index < boundSsbos_.size()) { boundSsbos_[index] = buffer; } } else if (target == GL_UNIFORM_BUFFER) { if (index < boundUbos_.size()) { boundUbos_[index] = buffer; } } } GLuint IContext::boundBufferByIndex(GLenum target, GLuint index) const { if (target == GL_SHADER_STORAGE_BUFFER) { if (index < boundSsbos_.size()) { return boundSsbos_[index]; } } else if (target == GL_UNIFORM_BUFFER) { if (index < boundUbos_.size()) { return boundUbos_[index]; } } return 0; } std::string IContext::boundBuffersByIndex(bool ssbos, bool ubos) const { bool first = true; std::stringstream ss; if (ubos) { for (uint32_t i = 0; i < boundUbos_.size(); ++i) { if (boundUbos_[i] != 0) { ss << (first ? "" : " ") << "ubo " << i << " (buffer: " << boundUbos_[i] << ")"; first = false; } } } if (ssbos) { for (uint32_t i = 0; i < boundSsbos_.size(); ++i) { if (boundSsbos_[i] != 0) { ss << (first ? "" : " ") << "ssbo " << i << " (buffer: " << boundSsbos_[i] << ")"; first = false; } } } return ss.str(); } #endif // IGL_API_LOG #if IGL_DEBUG namespace { // The map can be accessed from multiple threads during context creation/destruction. std::mutex& getMutex() { static std::mutex mutex; return mutex; } } // namespace #endif // Creates a global map to ensure multiple IContexts are not created for a single glContext std::unordered_map& IContext::getExistingContexts() { static auto& map = *(new std::unordered_map()); return map; } void IContext::registerContext(void* IGL_NULLABLE glContext, IContext* context) { #if IGL_DEBUG std::lock_guard lock(getMutex()); auto result = IContext::getExistingContexts().find(glContext); if (result != IContext::getExistingContexts().end()) { const char* errorMessage = "Your application creates multiple IContext wrappers for the same underlying context " "object, which can result in problems if those contexts are used simultaneously across " "different threads. It's recommended to preserve a one-to-one relationship between " "native " "and IGL contexts. Ignore this warning at your own risk."; #if IGL_PLATFORM_ANDROID IGL_LOG_ERROR(errorMessage); #else IGL_DEBUG_ABORT(errorMessage); #endif } IContext::getExistingContexts().insert({glContext, context}); #endif } void IContext::willDestroy(void* IGL_NULLABLE glContext) { // Clear pool explicitly, since it might have reference back to IContext. getAdapterPool().clear(); getComputeAdapterPool().clear(); // Unregister context if (glContext != nullptr) { IContext::unregisterContext((void*)glContext); } } void IContext::unregisterContext(void* IGL_NULLABLE glContext) { #if IGL_DEBUG std::lock_guard lock(getMutex()); IContext::getExistingContexts().erase(glContext); #endif } void IContext::flushDeletionQueue() { deletionQueues_.flushDeletionQueue(*this); } bool IContext::shouldQueueAPI() const { return !isCurrentContext() && !isCurrentSharegroup(); } void IContext::activeTexture(GLenum texture) { #if IGL_API_LOG activeTextureUnit_ = texture - GL_TEXTURE0; #endif APILOG("glActiveTexture(%s)\n", GL_ENUM_TO_STRING(texture)); GLCALL(ActiveTexture)(texture); GLCHECK_ERRORS(); } void IContext::attachShader(GLuint program, GLuint shader) { APILOG("glAttachShader(%u, %u) (program: %u)\n", program, shader, program); GLCALL(AttachShader)(program, shader); GLCHECK_ERRORS(); } void IContext::bindBuffer(GLenum target, GLuint buffer) { #if IGL_API_LOG GLuint unboundBuffer = boundBuffer(target); setBoundBuffer(target, buffer); #endif // IGL_API_LOG APILOG("glBindBuffer(%s, %u) unbound (buffer: %u) bound (buffer: %u)\n", GL_ENUM_TO_STRING(target), buffer, unboundBuffer, buffer); GLCALL(BindBuffer)(target, buffer); GLCHECK_ERRORS(); } void IContext::bindBufferBase(GLenum target, GLuint index, GLuint buffer) { #if IGL_API_LOG GLuint unboundBuffer = boundBufferByIndex(target, index); setBoundBufferByIndex(target, index, buffer); #endif APILOG("glBindBufferBase(%s, %u, %u) unbound (buffer: %u) bound (buffer: %u) %s\n", GL_ENUM_TO_STRING(target), index, buffer, unboundBuffer, buffer, boundBufferName(boundProgram_, target, index).c_str()); IGLCALL(BindBufferBase)(target, index, buffer); GLCHECK_ERRORS(); } void IContext::bindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) { #if IGL_API_LOG GLuint unboundBuffer = boundBufferByIndex(target, index); setBoundBufferByIndex(target, index, buffer); #endif APILOG("glBindBufferRange(%s, %u, %u) unbound (buffer: %u) bound (buffer: %u) %s\n", GL_ENUM_TO_STRING(target), index, buffer, unboundBuffer, buffer, boundBufferName(boundProgram_, target, index).c_str()); IGLCALL(BindBufferRange)(target, index, buffer, offset, size); GLCHECK_ERRORS(); } void IContext::bindFramebuffer(GLenum target, GLuint framebuffer) { #if IGL_API_LOG GLuint unboundFramebuffer = boundFramebuffer(target); setBoundFramebuffer(target, framebuffer); #endif APILOG("glBindFramebuffer(%s, %u) unbound (framebuffer: %u) bound (framebuffer: %u)\n", GL_ENUM_TO_STRING(target), framebuffer, unboundFramebuffer, framebuffer); IGLCALL(BindFramebuffer)(target, framebuffer); GLCHECK_ERRORS(); } void IContext::bindRenderbuffer(GLenum target, GLuint renderbuffer) { #if IGL_API_LOG GLuint unboundRenderbuffer = boundRenderbuffer_; boundRenderbuffer_ = renderbuffer; #endif APILOG("glBindRenderbuffer(%s, %u) unbound (renderbuffer: %u) bound (renderbuffer: %u)\n", GL_ENUM_TO_STRING(target), renderbuffer, unboundRenderbuffer, renderbuffer); IGLCALL(BindRenderbuffer)(target, renderbuffer); GLCHECK_ERRORS(); } void IContext::bindTexture(GLenum target, GLuint texture) { #if IGL_API_LOG GLuint unboundTexture = boundTexture(target); setBoundTexture(target, texture); if (activeTextureUnit_ < boundDrawTextures_.size()) { boundDrawTextures_[activeTextureUnit_] = texture; } #endif APILOG("glBindTexture(%s, %u) (unit: %u) unbound (texture: %u) bound (texture: %u)\n", GL_ENUM_TO_STRING(target), activeTextureUnit_, texture, unboundTexture, texture); GLCALL(BindTexture)(target, texture); GLCHECK_ERRORS(); } void IContext::bindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format) { #if IGL_API_LOG GLuint unboundTexture = 0; if (unit < boundImageTextures_.size()) { unboundTexture = boundImageTextures_[unit]; boundImageTextures_[unit] = texture; } #endif if (bindImageTexturerProc_ == nullptr) { if (deviceFeatureSet_.hasInternalRequirement(InternalRequirement::ShaderImageLoadStoreExtReq)) { if (deviceFeatureSet_.hasExtension(Extensions::ShaderImageLoadStore)) { bindImageTexturerProc_ = iglBindImageTextureEXT; } } else if (deviceFeatureSet_.hasInternalFeature(InternalFeatures::ShaderImageLoadStore)) { bindImageTexturerProc_ = iglBindImageTexture; } IGL_DEBUG_ASSERT(bindImageTexturerProc_, "No supported function for glBindImageTexture\n"); } APILOG( "glBindImageTexture(%u, %u, %i, %s, %i %s %s) unbound (texture: %u) bound (texture: %u) " "(uniform: %s)\n", unit, texture, level, GL_BOOL_TO_STRING(layered), layer, GL_ENUM_TO_STRING(access), GL_ENUM_TO_STRING(format), unboundTexture, texture, programUniformsByLocation_[boundProgram_][unit].c_str()); GLCALL_PROC(bindImageTexturerProc_, unit, texture, level, layered, layer, access, format); GLCHECK_ERRORS(); } void IContext::bindVertexArray(GLuint vao) { #if IGL_API_LOG GLuint unboundVao = boundVao_; boundVao_ = vao; #endif if (bindVertexArrayProc_ == nullptr) { if (deviceFeatureSet_.hasInternalRequirement(InternalRequirement::VertexArrayObjectExtReq)) { if (deviceFeatureSet_.hasExtension(Extensions::VertexArrayObject)) { bindVertexArrayProc_ = iglBindVertexArrayOES; } } else if (deviceFeatureSet_.hasInternalFeature(InternalFeatures::VertexArrayObject)) { bindVertexArrayProc_ = iglBindVertexArray; } IGL_DEBUG_ASSERT(bindVertexArrayProc_, "No supported function for glBindVertexArray\n"); } APILOG("glBindVertexArray(%u) unbound (VAO: %u) bound (VAO: %u)\n", vao, unboundVao, vao); GLCALL_PROC(bindVertexArrayProc_, vao); GLCHECK_ERRORS(); } void IContext::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) { APILOG("glBlendColor(%f, %f, %f, %f)\n", red, green, blue, alpha); GLCALL(BlendColor)(red, green, blue, alpha); GLCHECK_ERRORS(); } void IContext::blendEquation(GLenum mode) { APILOG("glBlendEquation(%s)\n", GL_ENUM_TO_STRING(mode)); GLCALL(BlendEquation)(mode); GLCHECK_ERRORS(); } void IContext::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha) { APILOG("glBlendEquationSeparate(%s, %s)\n", GL_ENUM_TO_STRING(modeRGB), GL_ENUM_TO_STRING(modeAlpha)); GLCALL(BlendEquationSeparate)(modeRGB, modeAlpha); GLCHECK_ERRORS(); } void IContext::blendFunc(GLenum sfactor, GLenum dfactor) { APILOG("glBlendFunc(%s, %s)\n", GL_ENUM_TO_STRING(sfactor), GL_ENUM_TO_STRING(dfactor)); GLCALL(BlendFunc)(sfactor, dfactor); GLCHECK_ERRORS(); } void IContext::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) { APILOG("glBlendFuncSeparate(%s, %s, %s, %s)\n", GL_ENUM_TO_STRING(srcRGB), GL_ENUM_TO_STRING(dstRGB), GL_ENUM_TO_STRING(srcAlpha), GL_ENUM_TO_STRING(dstAlpha)); GLCALL(BlendFuncSeparate)(srcRGB, dstRGB, srcAlpha, dstAlpha); GLCHECK_ERRORS(); } void IContext::blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) { if (blitFramebufferProc_ == nullptr) { if (deviceFeatureSet_.hasInternalRequirement(InternalRequirement::FramebufferBlitExtReq)) { if (deviceFeatureSet_.hasExtension(Extensions::FramebufferBlit)) { blitFramebufferProc_ = iglBlitFramebufferEXT; } } else if (deviceFeatureSet_.hasInternalFeature(InternalFeatures::FramebufferBlit)) { blitFramebufferProc_ = iglBlitFramebuffer; } IGL_DEBUG_ASSERT(blitFramebufferProc_, "No supported function for glBlitFramebuffer\n"); } APILOG( "glBlitFramebuffer(%d, %d, %d, %d, %d, %d, %d, %d, 0x%x [%s], %s) read (framebuffer: %u) " "write (framebuffer: %u)\n", srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, GL_CLEAR_BITS_TO_STRING(mask), GL_ENUM_TO_STRING(filter), boundFramebuffer(GL_READ_FRAMEBUFFER), boundFramebuffer(GL_DRAW_FRAMEBUFFER)); GLCALL_PROC( blitFramebufferProc_, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); GLCHECK_ERRORS(); } void IContext::bufferData(GLenum target, GLsizeiptr size, const GLvoid* IGL_NULLABLE data, GLenum usage) { APILOG("glBufferData(%s, %zu, %p, %s) (buffer: %u)\n", GL_ENUM_TO_STRING(target), size, data, GL_ENUM_TO_STRING(usage), boundBuffer(target)); GLCALL(BufferData)(target, size, data, usage); GLCHECK_ERRORS(); } void IContext::bufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* IGL_NULLABLE data) { APILOG("glBufferSubData(%s, %zu, %zu, %p) (buffer: %u)\n", GL_ENUM_TO_STRING(target), offset, size, data, boundBuffer(target)); GLCALL(BufferSubData)(target, offset, size, data); GLCHECK_ERRORS(); } GLenum IContext::checkFramebufferStatus(GLenum target) { GLenum ret = 0; IGLCALL_WITH_RETURN(ret, CheckFramebufferStatus)(target); // NOTE: Must log after call due to return value APILOG("glCheckFramebufferStatus(%s) = %s (framebuffer: %u)\n", GL_ENUM_TO_STRING(target), GL_ENUM_TO_STRING(ret), boundFramebuffer(target)); GLCHECK_ERRORS(); return ret; } void IContext::clear(GLbitfield mask) { APILOG("glClear(0x%x [%s]) (framebuffer: %u) %s\n", mask, GL_CLEAR_BITS_TO_STRING(mask), boundFramebuffer(GL_DRAW_FRAMEBUFFER), affectedFramebufferAttachments(GL_DRAW_FRAMEBUFFER, mask).c_str()); GLCALL(Clear)(mask); GLCHECK_ERRORS(); } void IContext::clearBufferfv(GLenum buffer, GLint drawBuffer, const GLfloat* value) { if (!deviceFeatureSet_.hasInternalFeature(InternalFeatures::ClearBufferfv)) { IGL_DEBUG_ASSERT(0, "No supported function for glClearBufferfv\n"); return; } APILOG("glClearBufferfv(%s, %d, %f) (framebuffer: %u) (%s: %u)\n", GL_ENUM_TO_STRING(buffer), drawBuffer, *value, boundFramebuffer(GL_DRAW_FRAMEBUFFER), framebufferAttachmentType(GL_DRAW_FRAMEBUFFER, buffer, drawBuffer), framebufferAttachment(GL_DRAW_FRAMEBUFFER, buffer, drawBuffer)); IGLCALL(ClearBufferfv)(buffer, drawBuffer, value); GLCHECK_ERRORS(); } void IContext::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) { APILOG("glClearColor(%f, %f, %f, %f)\n", red, green, blue, alpha); GLCALL(ClearColor)(red, green, blue, alpha); GLCHECK_ERRORS(); } void IContext::clearDepthf(GLfloat depth) { if (clearDepthfProc_ == nullptr) { if (deviceFeatureSet_.hasInternalFeature(InternalFeatures::ClearDepthf)) { clearDepthfProc_ = iglClearDepthf; } else { clearDepthfProc_ = iglClearDepth; } IGL_DEBUG_ASSERT(clearDepthfProc_, "No supported function for glClearDepthf\n"); } APILOG("glClearDepthf(%f)\n", depth); GLCALL_PROC(clearDepthfProc_, depth); GLCHECK_ERRORS(); } void IContext::clearStencil(GLint s) { APILOG("glClearStencil(%d)\n", s); GLCALL(ClearStencil)(s); GLCHECK_ERRORS(); } void IContext::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) { APILOG("glColorMask(%s, %s, %s, %s) (framebuffer: %u)\n", GL_BOOL_TO_STRING(red), GL_BOOL_TO_STRING(green), GL_BOOL_TO_STRING(blue), GL_BOOL_TO_STRING(alpha), boundFramebuffer(GL_DRAW_FRAMEBUFFER)); GLCALL(ColorMask)(red, green, blue, alpha); GLCHECK_ERRORS(); } void IContext::compileShader(GLuint shader) { APILOG("glCompileShader(%u)\n", shader); GLCALL(CompileShader)(shader); GLCHECK_ERRORS(); shaderCompilationCount_++; } void IContext::compressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* IGL_NULLABLE data) { APILOG("glCompressedTexImage2D(%s, %d, %s, %u, %u, %d, %u, %p) (texture: %u)\n", GL_ENUM_TO_STRING(target), level, GL_ENUM_TO_STRING(internalformat), width, height, border, imageSize, data, boundTexture(target)); GLCALL(CompressedTexImage2D) (target, level, internalformat, width, height, border, imageSize, data); GLCHECK_ERRORS(); } void IContext::compressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data) { if (compressedTexImage3DProc_ == nullptr) { if (deviceFeatureSet_.hasFeature(DeviceFeatures::Texture3D)) { if (deviceFeatureSet_.hasInternalRequirement(InternalRequirement::Texture3DExtReq)) { if (deviceFeatureSet_.hasExtension(Extensions::Texture3D)) { compressedTexImage3DProc_ = iglCompressedTexImage3DOES; } } else { compressedTexImage3DProc_ = iglCompressedTexImage3D; } } IGL_DEBUG_ASSERT(compressedTexImage3DProc_, "No supported function for glCompressedTexImage3D\n"); } APILOG("glCompressedTexImage3D(%s, %d, %s, %u, %u, %u, %d, %u, %p) (texture: %u)\n", GL_ENUM_TO_STRING(target), level, GL_ENUM_TO_STRING(internalformat), width, height, depth, border, imageSize, data, boundTexture(target)); GLCALL_PROC(compressedTexImage3DProc_, target, level, internalformat, width, height, depth, border, imageSize, data); GLCHECK_ERRORS(); } void IContext::compressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid* data) { APILOG("glCompressedTexSubImage2D(%s, %d, %d, %d, %u, %u, %s, %u, %p) (texture: %u)\n", GL_ENUM_TO_STRING(target), level, xoffset, yoffset, width, height, GL_ENUM_TO_STRING(format), imageSize, data, boundTexture(target)); GLCALL(CompressedTexSubImage2D) (target, level, xoffset, yoffset, width, height, format, imageSize, data); GLCHECK_ERRORS(); } void IContext::compressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data) { if (compressedTexSubImage3DProc_ == nullptr) { if (deviceFeatureSet_.hasFeature(DeviceFeatures::Texture3D)) { if (deviceFeatureSet_.hasInternalRequirement(InternalRequirement::Texture3DExtReq)) { if (deviceFeatureSet_.hasExtension(Extensions::Texture3D)) { compressedTexSubImage3DProc_ = iglCompressedTexSubImage3DOES; } } else { compressedTexSubImage3DProc_ = iglCompressedTexSubImage3D; } } IGL_DEBUG_ASSERT(compressedTexSubImage3DProc_, "No supported function for glCompressedTexSubImage3D\n"); } APILOG("glCompressedTexSubImage3D(%s, %d, %d, %d, %d, %u, %u, %u, %s, %u, %p) (texture: %u)\n", GL_ENUM_TO_STRING(target), level, xoffset, yoffset, zoffset, width, height, depth, GL_ENUM_TO_STRING(format), imageSize, data, boundTexture(target)); GLCALL_PROC(compressedTexSubImage3DProc_, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); GLCHECK_ERRORS(); } void IContext::copyBufferSubData(GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size) { #if IGL_PLATFORM_APPLE || IGL_PLATFORM_ANDROID IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); #else APILOG("glCopyBufferSubData(%s, %s, %d, %d, %u) read (buffer: %u) write (buffer: %u)\n", GL_ENUM_TO_STRING(readtarget), GL_ENUM_TO_STRING(writetarget), readoffset, writeoffset, size, boundBuffer(readTarget), boundBuffer(writeTarget)); GLCALL(CopyBufferSubData)(readtarget, writetarget, readoffset, writeoffset, size); GLCHECK_ERRORS(); #endif // IGL_PLATFORM_APPLE } void IContext::copyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) { APILOG("glCopyTexSubImage2D(%s, %d, %d, %d, %d, %d, %u, %u) read (%s: %u) write (texture: %u)\n", GL_ENUM_TO_STRING(target), level, xoffset, yoffset, x, y, width, height, framebufferReadBufferType(GL_READ_FRAMEBUFFER), framebufferReadBuffer(GL_READ_FRAMEBUFFER)); GLCALL(CopyTexSubImage2D)(target, level, xoffset, yoffset, x, y, width, height); GLCHECK_ERRORS(); } void IContext::createMemoryObjects(GLsizei n, GLuint* objects) { APILOG("glCreateMemoryObjectsEXT(%u, %p) (memory object: %u)\n", n, objects, objects == nullptr ? 0 : *objects); IGLCALL(CreateMemoryObjectsEXT)(n, objects); GLCHECK_ERRORS(); } GLuint IContext::createProgram() { GLuint ret = 0; GLCALL_WITH_RETURN(ret, CreateProgram)(); // NOTE: Must log after call due to return value APILOG("glCreateProgram() (program: %u)\n", ret); GLCHECK_ERRORS(); #if IGL_API_LOG programUniforms_[ret] = {}; programUniformsByLocation_[ret] = {}; programSsbosByIndex_[ret] = {}; programSsbosByLocation_[ret] = {}; programUbosByIndex_[ret] = {}; programUbosByLocation_[ret] = {}; #endif return ret; } GLuint IContext::createShader(GLenum shaderType) { GLuint ret = 0; GLCALL_WITH_RETURN(ret, CreateShader)(shaderType); // NOTE: Must log after call due to return value APILOG("glCreateShader(%s) = %u\n", GL_ENUM_TO_STRING(shaderType), ret); GLCHECK_ERRORS(); return ret; } void IContext::cullFace(GLint mode) { APILOG("glCullFace(%s)\n", GL_ENUM_TO_STRING(mode)); GLCALL(CullFace)(mode); GLCHECK_ERRORS(); } void IContext::debugMessageCallback(PFNIGLDEBUGPROC callback, const void* userParam) { if (debugMessageCallbackProc_ == nullptr) { if (deviceFeatureSet_.hasInternalFeature(InternalFeatures::DebugMessageCallback)) { if (deviceFeatureSet_.hasInternalRequirement( InternalRequirement::DebugMessageCallbackExtReq)) { if (deviceFeatureSet_.hasExtension(Extensions::Debug)) { debugMessageCallbackProc_ = iglDebugMessageCallbackKHR; } } else { debugMessageCallbackProc_ = iglDebugMessageCallback; } } IGL_DEBUG_ASSERT(debugMessageCallbackProc_, "No supported function for glDebugMessageCallback\n"); } APILOG("glDebugMessageCallback(%p, %p)\n", callback, userParam); GLCALL_PROC(debugMessageCallbackProc_, callback, userParam); GLCHECK_ERRORS(); } void IContext::debugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf) { if (debugMessageInsertProc_ == nullptr) { if (deviceFeatureSet_.hasInternalFeature(InternalFeatures::DebugMessage)) { if (deviceFeatureSet_.hasInternalRequirement(InternalRequirement::DebugMessageExtReq)) { if (deviceFeatureSet_.hasExtension(Extensions::Debug)) { debugMessageInsertProc_ = iglDebugMessageInsertKHR; } else if (deviceFeatureSet_.hasExtension(Extensions::DebugMarker)) { debugMessageInsertProc_ = iglInsertEventMarkerEXT; } } else { debugMessageInsertProc_ = iglDebugMessageInsert; } } IGL_DEBUG_ASSERT(debugMessageInsertProc_, "No supported function for glDebugMessageInsert\n"); } APILOG("glDebugMessageInsert(%s, %s, %u, %s, %u, %s)\n", GL_ENUM_TO_STRING(source), GL_ENUM_TO_STRING(type), id, GL_ENUM_TO_STRING(severity), length, buf); GLCALL_PROC(debugMessageInsertProc_, source, type, id, severity, length, buf); GLCHECK_ERRORS(); } void IContext::deleteBuffers(GLsizei n, const GLuint* buffers) { if (isDestructionAllowed() && IGL_DEBUG_VERIFY(buffers != nullptr)) { if (shouldQueueAPI()) { deletionQueues_.queueDeleteBuffers(n, buffers); } else { APILOG( "glDeleteBuffers(%u, %p) (buffer: %u)\n", n, buffers, buffers == nullptr ? 0 : *buffers); GLCALL(DeleteBuffers)(n, buffers); GLCHECK_ERRORS(); } } } void IContext::deleteMemoryObjects(GLsizei n, const GLuint* objects) { APILOG("glDeleteMemoryObjectsEXT(%u, %p) (memory object: %u)\n", n, objects, objects == nullptr ? 0 : *objects); IGLCALL(DeleteMemoryObjectsEXT)(n, objects); GLCHECK_ERRORS(); } void IContext::unbindBuffer(GLenum target) { if (shouldQueueAPI()) { deletionQueues_.queueUnbindBuffer(target); } else { bindBuffer(target, 0); } } void IContext::deleteFramebuffers(GLsizei n, const GLuint* framebuffers) { if (isDestructionAllowed() && IGL_DEBUG_VERIFY(framebuffers != nullptr)) { if (shouldQueueAPI()) { deletionQueues_.queueDeleteFramebuffers(n, framebuffers); } else { APILOG("glDeleteFramebuffers(%u, %p) (framebuffer: %u)\n", n, framebuffers, framebuffers == nullptr ? 0 : *framebuffers); IGLCALL(DeleteFramebuffers)(n, framebuffers); GLCHECK_ERRORS(); } } } void IContext::deleteProgram(GLuint program) { if (isDestructionAllowed()) { if (shouldQueueAPI()) { deletionQueues_.queueDeleteProgram(program); } else { APILOG("glDeleteProgram(%u) (program: %u)\n", program, program); GLCALL(DeleteProgram)(program); GLCHECK_ERRORS(); } } } void IContext::deleteRenderbuffers(GLsizei n, const GLuint* renderbuffers) { if (isDestructionAllowed() && IGL_DEBUG_VERIFY(renderbuffers != nullptr)) { if (shouldQueueAPI()) { deletionQueues_.queueDeleteRenderbuffers(n, renderbuffers); } else { APILOG("glDeleteRenderbuffers(%u, %p) (renderbuffer: %u)\n", n, renderbuffers, renderbuffers == nullptr ? 0 : *renderbuffers); IGLCALL(DeleteRenderbuffers)(n, renderbuffers); GLCHECK_ERRORS(); } } } void IContext::deleteVertexArrays(GLsizei n, const GLuint* vertexArrays) { if (deleteVertexArraysProc_ == nullptr) { if (deviceFeatureSet_.hasInternalRequirement(InternalRequirement::VertexArrayObjectExtReq)) { if (deviceFeatureSet_.hasExtension(Extensions::VertexArrayObject)) { deleteVertexArraysProc_ = iglDeleteVertexArraysOES; } } else if (deviceFeatureSet_.hasInternalFeature(InternalFeatures::VertexArrayObject)) { deleteVertexArraysProc_ = iglDeleteVertexArrays; } IGL_DEBUG_ASSERT(deleteVertexArraysProc_, "No supported function for glDeleteVertexArrays\n"); } if (isDestructionAllowed() && IGL_DEBUG_VERIFY(vertexArrays != nullptr)) { if (shouldQueueAPI()) { deletionQueues_.queueDeleteVertexArrays(n, vertexArrays); } else { APILOG("glDeleteVertexArrays(%u, %p) (VAO: %u)\n", n, vertexArrays, vertexArrays == nullptr ? 0 : *vertexArrays); GLCALL_PROC(deleteVertexArraysProc_, n, vertexArrays); GLCHECK_ERRORS(); } } } void IContext::deleteShader(GLuint shaderId) { if (isDestructionAllowed()) { if (shouldQueueAPI()) { deletionQueues_.queueDeleteShader(shaderId); } else { APILOG("glDeleteShader(%u)\n", shaderId); GLCALL(DeleteShader)(shaderId); GLCHECK_ERRORS(); } } } void IContext::deleteSync(GLsync sync) { if (deleteSyncProc_ == nullptr) { if (deviceFeatureSet_.hasInternalRequirement(InternalRequirement::SyncExtReq)) { if (deviceFeatureSet_.hasExtension(Extensions::Sync)) { deleteSyncProc_ = iglDeleteSyncAPPLE; } } else if (deviceFeatureSet_.hasInternalFeature(InternalFeatures::Sync)) { deleteSyncProc_ = iglDeleteSync; } IGL_DEBUG_ASSERT(deleteSyncProc_, "No supported function for glDeleteSync\n"); } APILOG("glDeleteSync(%p) (sync: %p)\n", sync, sync); GLCALL_PROC(deleteSyncProc_, sync); GLCHECK_ERRORS(); } void IContext::deleteTextures(GLsizei n, const GLuint* textures) { if (isDestructionAllowed() && IGL_DEBUG_VERIFY(textures != nullptr)) { if (shouldQueueAPI()) { deletionQueues_.queueDeleteTextures(n, textures); } else { APILOG("glDeleteTextures(%u, %p) (texture: %u)\n", n, textures, textures == nullptr ? 0 : *textures); GLCALL(DeleteTextures)(n, textures); GLCHECK_ERRORS(); } } } void IContext::depthFunc(GLenum func) { APILOG("glDepthFunc(%s)\n", GL_ENUM_TO_STRING(func)); GLCALL(DepthFunc)(func); GLCHECK_ERRORS(); } void IContext::depthMask(GLboolean flag) { APILOG("glDepthMask(%s)\n", GL_BOOL_TO_STRING(flag)); GLCALL(DepthMask)(flag); GLCHECK_ERRORS(); } void IContext::depthRangef(GLfloat n, GLfloat f) { APILOG("glDepthRangef(%f, %f)\n", n, f); GLCALL(DepthRangef)(n, f); GLCHECK_ERRORS(); } void IContext::detachShader(GLuint program, GLuint shader) { APILOG("glDetachShader(%u, %u) (program: %u)\n", program, shader, program); GLCALL(DetachShader)(program, shader); GLCHECK_ERRORS(); } void IContext::disable(GLenum cap) { APILOG("glDisable(%s)\n", GL_ENUM_TO_STRING(cap)); GLCALL(Disable)(cap); GLCHECK_ERRORS(); } void IContext::disableVertexAttribArray(GLuint index) { #if IGL_API_LOG if (index < enabledAttributes_.size()) { enabledAttributes_.reset(index); } #endif APILOG("glDisableVertexAttribArray(%u) (VAO: %u) (buffer: %u\n", index, boundVao_, index < boundAttributes_.size() ? boundAttributes_[index] : 0); GLCALL(DisableVertexAttribArray)(index); GLCHECK_ERRORS(); } void IContext::drawArrays(GLenum mode, GLint first, GLsizei count) { #if IGL_API_LOG lastCommandWasCompute_ = false; #endif drawCallCount_++; IGL_PROFILER_ZONE_GPU_OGL("drawArrays()"); APILOG("glDrawArrays(%s, %d, %u) (program: %u) (VAO: %u) (framebuffer: %u) %s %s %s %s\n", GL_ENUM_TO_STRING(mode), first, count, boundProgram_, boundVao_, boundFramebuffer(GL_DRAW_FRAMEBUFFER), boundDrawBuffers().c_str(), boundDrawTextures().c_str(), boundFramebufferAttachments(GL_DRAW_FRAMEBUFFER).c_str(), boundBuffersByIndex().c_str()); GLCALL(DrawArrays)(mode, first, count); GLCHECK_ERRORS(); APILOG_DEC_DRAW_COUNT(); } void IContext::drawArraysIndirect(GLenum mode, const GLvoid* indirect) { #if IGL_API_LOG lastCommandWasCompute_ = false; #endif drawCallCount_++; IGL_PROFILER_ZONE_GPU_COLOR_OGL("drawArraysIndirect()", IGL_PROFILER_COLOR_DRAW); APILOG( "glDrawArraysIndirect(%s, %p) (program: %u) (VAO: %u) (framebuffer: %u) indirect (buffer: " "%u) %s %s %s %s\n", GL_ENUM_TO_STRING(mode), indirect, boundProgram_, boundVao_, boundFramebuffer(GL_DRAW_FRAMEBUFFER), boundBuffer(GL_DRAW_INDIRECT_BUFFER), boundDrawBuffers().c_str(), boundDrawTextures().c_str(), boundFramebufferAttachments(GL_DRAW_FRAMEBUFFER).c_str(), boundBuffersByIndex().c_str()); IGLCALL(DrawArraysIndirect)(mode, indirect); GLCHECK_ERRORS(); APILOG_DEC_DRAW_COUNT(); } void IContext::drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount) { #if IGL_API_LOG lastCommandWasCompute_ = false; #endif drawCallCount_++; IGL_PROFILER_ZONE_GPU_OGL("drawArraysInstanced()"); APILOG( "glDrawArraysInstanced(%s, %d, %u, %u) (program: %u) (VAO: %u) (framebuffer: %u) %s %s %s " "%s\n", GL_ENUM_TO_STRING(mode), first, count, instancecount, boundProgram_, boundVao_, boundFramebuffer(GL_DRAW_FRAMEBUFFER), boundDrawBuffers().c_str(), boundDrawTextures().c_str(), boundFramebufferAttachments(GL_DRAW_FRAMEBUFFER).c_str(), boundBuffersByIndex().c_str()); IGLCALL(DrawArraysInstanced)(mode, first, count, instancecount); GLCHECK_ERRORS(); APILOG_DEC_DRAW_COUNT(); } void IContext::drawBuffers(GLsizei n, GLenum* buffers) { if (drawBuffersProc_ == nullptr) { if (deviceFeatureSet_.hasFeature(DeviceFeatures::MultipleRenderTargets)) { if (deviceFeatureSet_.hasInternalRequirement(InternalRequirement::DrawBuffersExtReq)) { if (deviceFeatureSet_.hasExtension(Extensions::DrawBuffers)) { drawBuffersProc_ = iglDrawBuffersEXT; } } else { drawBuffersProc_ = iglDrawBuffers; } } IGL_DEBUG_ASSERT(drawBuffersProc_, "No supported function for glDrawBuffers\n"); } IGL_PROFILER_ZONE_GPU_COLOR_OGL("drawBuffers()", IGL_PROFILER_COLOR_DRAW); APILOG("glDrawBuffers(%u, %u)\n", n, buffers); GLCALL_PROC(drawBuffersProc_, n, buffers); GLCHECK_ERRORS(); } void IContext::drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices) { #if IGL_API_LOG lastCommandWasCompute_ = false; #endif drawCallCount_++; IGL_PROFILER_ZONE_GPU_COLOR_OGL("drawElements()", IGL_PROFILER_COLOR_DRAW); APILOG( "glDrawElements(%s, %u, %s, %p) (program: %u) (VAO: %u) (framebuffer: %u) element (buffer: " "%u) %s %s %s %s\n", GL_ENUM_TO_STRING(mode), count, GL_ENUM_TO_STRING(type), indices, boundProgram_, boundVao_, boundFramebuffer(GL_DRAW_FRAMEBUFFER), boundBuffer(GL_ELEMENT_ARRAY_BUFFER), boundDrawBuffers().c_str(), boundDrawTextures().c_str(), boundFramebufferAttachments(GL_DRAW_FRAMEBUFFER).c_str(), boundBuffersByIndex().c_str()); GLCALL(DrawElements)(mode, count, type, indices); GLCHECK_ERRORS(); APILOG_DEC_DRAW_COUNT(); } void IContext::drawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instancecount) { #if IGL_API_LOG lastCommandWasCompute_ = false; #endif drawCallCount_++; IGL_PROFILER_ZONE_GPU_COLOR_OGL("drawElementsInstanced()", IGL_PROFILER_COLOR_DRAW); APILOG( "glDrawElementsInstanced(%s, %u, %s, %p, %u) (program: %u) (VAO: %u) (framebuffer: %u) " "element (buffer: %u) %s %s %s %s\n", GL_ENUM_TO_STRING(mode), count, GL_ENUM_TO_STRING(type), indices, instancecount, boundProgram_, boundVao_, boundFramebuffer(GL_DRAW_FRAMEBUFFER), boundBuffer(GL_ELEMENT_ARRAY_BUFFER), boundDrawBuffers().c_str(), boundDrawTextures().c_str(), boundFramebufferAttachments(GL_DRAW_FRAMEBUFFER).c_str(), boundBuffersByIndex().c_str()); IGLCALL(DrawElementsInstanced)(mode, count, type, indices, instancecount); GLCHECK_ERRORS(); APILOG_DEC_DRAW_COUNT(); } void IContext::drawElementsIndirect(GLenum mode, GLenum type, const GLvoid* indirect) { #if IGL_API_LOG lastCommandWasCompute_ = false; #endif drawCallCount_++; IGL_PROFILER_ZONE_GPU_COLOR_OGL("drawElementsIndirect()", IGL_PROFILER_COLOR_DRAW); APILOG( "glDrawElementsIndirect(%s, %s, %p) (program: %u) (VAO: %u) (framebuffer: %u) indirect " "(buffer: %u) element (buffer: %u) %s %s %s %s\n", GL_ENUM_TO_STRING(mode), GL_ENUM_TO_STRING(type), indirect, boundProgram_, boundVao_, boundFramebuffer(GL_DRAW_FRAMEBUFFER), boundBuffer(GL_DRAW_INDIRECT_BUFFER), boundBuffer(GL_ELEMENT_ARRAY_BUFFER), boundDrawBuffers().c_str(), boundDrawTextures().c_str(), boundFramebufferAttachments(GL_DRAW_FRAMEBUFFER).c_str(), boundBuffersByIndex().c_str()); IGLCALL(DrawElementsIndirect)(mode, type, indirect); GLCHECK_ERRORS(); APILOG_DEC_DRAW_COUNT(); } void IContext::multiDrawArraysIndirect(GLenum mode, const void* indirect, GLsizei drawcount, GLsizei stride) { #if IGL_API_LOG lastCommandWasCompute_ = false; #endif drawCallCount_ += drawcount; IGL_PROFILER_ZONE_GPU_COLOR_OGL("multiDrawArraysIndirect()", IGL_PROFILER_COLOR_DRAW); APILOG("glMultiDrawArraysIndirect(%s, %p, %d, %d)\n", GL_ENUM_TO_STRING(mode), indirect, drawcount, stride); IGL_DEBUG_ASSERT(indirect); IGLCALL(MultiDrawArraysIndirect)(mode, indirect, drawcount, stride); GLCHECK_ERRORS(); APILOG_DEC_DRAW_COUNT(); } void IContext::multiDrawElementsIndirect(GLenum mode, GLenum type, const void* indirect, GLsizei drawcount, GLsizei stride) { #if IGL_API_LOG lastCommandWasCompute_ = false; #endif drawCallCount_ += drawcount; IGL_PROFILER_ZONE_GPU_COLOR_OGL("multiDrawElementsIndirect()", IGL_PROFILER_COLOR_DRAW); APILOG("glMultiDrawElementsIndirect(%s, %s, %p, %d, %d)\n", GL_ENUM_TO_STRING(mode), GL_ENUM_TO_STRING(type), indirect, drawcount, stride); IGL_DEBUG_ASSERT(indirect); IGLCALL(MultiDrawElementsIndirect)(mode, type, indirect, drawcount, stride); GLCHECK_ERRORS(); APILOG_DEC_DRAW_COUNT(); } void IContext::enable(GLenum cap) { APILOG("glEnable(%s)\n", GL_ENUM_TO_STRING(cap)); GLCALL(Enable)(cap); GLCHECK_ERRORS(); } void IContext::enableVertexAttribArray(GLuint index) { #if IGL_API_LOG if (index < enabledAttributes_.size()) { enabledAttributes_.set(index); } #endif APILOG("glEnableVertexAttribArray(%u) (VAO: %u) (buffer: %u)\n", index, boundVao_, index < boundAttributes_.size() ? boundAttributes_[index] : 0); GLCALL(EnableVertexAttribArray)(index); GLCHECK_ERRORS(); } GLsync IContext::fenceSync(GLenum condition, GLbitfield flags) { if (fenceSyncProc_ == nullptr) { if (deviceFeatureSet_.hasInternalRequirement(InternalRequirement::SyncExtReq)) { if (deviceFeatureSet_.hasExtension(Extensions::Sync)) { fenceSyncProc_ = iglFenceSyncAPPLE; } } else if (deviceFeatureSet_.hasInternalFeature(InternalFeatures::Sync)) { fenceSyncProc_ = iglFenceSync; } IGL_DEBUG_ASSERT(fenceSyncProc_, "No supported function for glFenceSync\n"); } GLsync sync = nullptr; APILOG("glFenceSync(%s, %u) (sync: %p)\n", GL_ENUM_TO_STRING(condition), flags, sync); GLCALL_PROC_WITH_RETURN(sync, fenceSyncProc_, GL_ZERO, condition, flags); GLCHECK_ERRORS(); return sync; } void IContext::finish() { APILOG("glFinish\n"); GLCALL(Finish)(); GLCHECK_ERRORS(); } void IContext::flush() { APILOG("glFlush\n"); GLCALL(Flush)(); GLCHECK_ERRORS(); } void IContext::framebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) { #if IGL_API_LOG const char* unboundAttachmentType = framebufferAttachmentType(target, attachment); GLuint unboundAttachment = framebufferAttachment(target, attachment); setFramebufferAttachment(target, attachment, true, renderbuffer); #endif APILOG( "glFramebufferRenderbuffer(%s, %s, %s, %u) (framebuffer: %u) unbound (%s: %u) bound " "(renderbuffer: %u)\n", GL_ENUM_TO_STRING(target), GL_ENUM_TO_STRING(attachment), GL_ENUM_TO_STRING(renderbuffertarget), boundFramebuffer(target), unboundAttachmentType, unboundAttachment, renderbuffer); IGLCALL(FramebufferRenderbuffer)(target, attachment, renderbuffertarget, renderbuffer); GLCHECK_ERRORS(); } void IContext::framebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) { #if IGL_API_LOG const char* unboundAttachmentType = framebufferAttachmentType(target, attachment); GLuint unboundAttachment = framebufferAttachment(target, attachment); setFramebufferAttachment(target, attachment, false, texture); #endif APILOG( "glFramebufferTexture2D(%s, %s, %s, %u, %d) (framebuffer: %u) unbound (%s: %u) bound " "(texture: %u)\n", GL_ENUM_TO_STRING(target), GL_ENUM_TO_STRING(attachment), GL_ENUM_TO_STRING(textarget), texture, level, boundFramebuffer(target), unboundAttachmentType, unboundAttachment, texture); IGLCALL(FramebufferTexture2D)(target, attachment, textarget, texture, level); GLCHECK_ERRORS(); } void IContext::framebufferTexture2DMultisample(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples) { #if IGL_API_LOG const char* unboundAttachmentType = framebufferAttachmentType(target, attachment); GLuint unboundAttachment = framebufferAttachment(target, attachment); setFramebufferAttachment(target, attachment, false, texture); #endif if (framebufferTexture2DMultisampleProc_ == nullptr) { // Use runtime checks to determine which of several potential methods are supported by the // context. if (deviceFeatureSet_.hasExtension(Extensions::MultiSampleExt)) { framebufferTexture2DMultisampleProc_ = iglFramebufferTexture2DMultisampleEXT; } else if (deviceFeatureSet_.hasExtension(Extensions::MultiSampleImg)) { framebufferTexture2DMultisampleProc_ = iglFramebufferTexture2DMultisampleIMG; } IGL_DEBUG_ASSERT(framebufferTexture2DMultisampleProc_, "No supported function for glFramebufferTexture2DMultisample\n"); } if (maxSamples_ == -1 && framebufferTexture2DMultisampleProc_ != nullptr) { if (deviceFeatureSet_.hasInternalRequirement(InternalRequirement::MultiSampleExtReq) && deviceFeatureSet_.hasExtension(Extensions::MultiSampleImg)) { getIntegerv(GL_MAX_SAMPLES_IMG, &maxSamples_); } else { getIntegerv(GL_MAX_SAMPLES, &maxSamples_); } } if (samples > maxSamples_) { samples = maxSamples_; } APILOG( "glFramebufferTexture2DMultisample(%s, %s, %s, %u, %d, %u) (framebuffer: %u) unbound (%s: " "%u) bound (texture: %u)\n", GL_ENUM_TO_STRING(target), GL_ENUM_TO_STRING(attachment), GL_ENUM_TO_STRING(textarget), texture, level, samples, boundFramebuffer(target), unboundAttachmentType, unboundAttachment, texture); GLCALL_PROC( framebufferTexture2DMultisampleProc_, target, attachment, textarget, texture, level, samples); // Certain drivers (I am looking at you Adreno) misbehave according to spec, // where GL_DRAW_FRAMEBUFFER is perfectly valid framebuffer target, but it only recognizes // GL_FRAMEBUFFER meaning that it behaves as if it is `IMG_multisampled_render_to_texture` not // `EXT_multisampled_render_to_texture`. auto error = getError(); if (error == GL_INVALID_ENUM && (target == GL_DRAW_FRAMEBUFFER || target == GL_READ_FRAMEBUFFER) && deviceFeatureSet_.hasExtension(Extensions::MultiSampleExt)) { // Repeat again, now using explicitly GL_FRAMEBUFFER not GL_DRAW/GL_READ. framebufferTexture2DMultisample(GL_FRAMEBUFFER, attachment, textarget, texture, level, samples); } else if (alwaysCheckError_) { lastError_ = error; GL_ASSERT_ERROR(lastError_ == GL_NO_ERROR, __FUNCTION__, __LINE__, error); } } void IContext::framebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) { #if IGL_API_LOG const char* unboundAttachmentType = framebufferAttachmentType(target, attachment); GLuint unboundAttachment = framebufferAttachment(target, attachment); setFramebufferAttachment(target, attachment, false, texture); #endif APILOG( "glFramebufferTextureLayer(%s, %s, %u, %d, %d) (framebuffer: %u) unbound (%s: %u) bound " "(texture: %u)\n", GL_ENUM_TO_STRING(target), GL_ENUM_TO_STRING(attachment), texture, level, layer, boundFramebuffer(target), unboundAttachmentType, unboundAttachment, texture); IGLCALL(FramebufferTextureLayer)(target, attachment, texture, level, layer); GLCHECK_ERRORS(); } void IContext::frontFace(GLenum mode) { APILOG("glFrontFace(%s)\n", GL_ENUM_TO_STRING(mode)); GLCALL(FrontFace)(mode); GLCHECK_ERRORS(); } void IContext::polygonFillMode(IGL_MAYBE_UNUSED GLenum mode) { #if IGL_OPENGL APILOG("glPolygonMode(%s)\n", GL_ENUM_TO_STRING(mode)); GLCALL(PolygonMode)(GL_FRONT_AND_BACK, mode); GLCHECK_ERRORS(); #else IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); #endif } void IContext::generateMipmap(GLenum target) { APILOG("glGenerateMipmap(%s)\n", GL_ENUM_TO_STRING(target)); IGLCALL(GenerateMipmap)(target); GLCHECK_ERRORS(); } void IContext::genBuffers(GLsizei n, GLuint* buffers) { GLCALL(GenBuffers)(n, buffers); // NOTE: Must log after call due to return value APILOG("glGenBuffers(%u, %p) (buffer: %u)\n", n, buffers, buffers == nullptr ? 0 : *buffers); GLCHECK_ERRORS(); } void IContext::genFramebuffers(GLsizei n, GLuint* framebuffers) { IGLCALL(GenFramebuffers)(n, framebuffers); // NOTE: Must log after call due to return value APILOG("glGenFramebuffers(%u, %p) (framebuffer: %u)\n", n, framebuffers, framebuffers == nullptr ? 0 : *framebuffers); GLCHECK_ERRORS(); #if IGL_API_LOG for (GLsizei i = 0; i < n; ++i) { framebufferAttachments_[framebuffers[i]] = {}; } #endif } void IContext::genRenderbuffers(GLsizei n, GLuint* renderbuffers) { IGLCALL(GenRenderbuffers)(n, renderbuffers); // NOTE: Must log after call due to return value APILOG("glGenRenderbuffers(%u, %p) (renderbuffer: %u)\n", n, renderbuffers, renderbuffers == nullptr ? 0 : *renderbuffers); GLCHECK_ERRORS(); } void IContext::genTextures(GLsizei n, GLuint* textures) { GLCALL(GenTextures)(n, textures); // NOTE: Must log after call due to return value APILOG("glGenTextures(%u, %p) (texture: %u)\n", n, textures, textures == nullptr ? 0 : *textures); GLCHECK_ERRORS(); } void IContext::genVertexArrays(GLsizei n, GLuint* vertexArrays) { if (genVertexArraysProc_ == nullptr) { if (deviceFeatureSet_.hasInternalRequirement(InternalRequirement::VertexArrayObjectExtReq)) { if (deviceFeatureSet_.hasExtension(Extensions::VertexArrayObject)) { genVertexArraysProc_ = iglGenVertexArraysOES; } } else if (deviceFeatureSet_.hasInternalFeature(InternalFeatures::VertexArrayObject)) { genVertexArraysProc_ = iglGenVertexArrays; } IGL_DEBUG_ASSERT(genVertexArraysProc_, "No supported function for glGenVertexArrays\n"); } GLCALL_PROC(genVertexArraysProc_, n, vertexArrays); // NOTE: Must log after call due to return value APILOG("glGenVertexArrays(%u, %p) (VAO: %u)\n", n, vertexArrays, vertexArrays == nullptr ? 0 : *vertexArrays); GLCHECK_ERRORS(); } void IContext::getActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name) const { GLCALL(GetActiveAttrib)(program, index, bufsize, length, size, type, name); // NOTE: Must log after call due to return value APILOG("glGetActiveAttrib(%u, %u, %u, %p, %p, %p, %p) = (%d, %s, %.*s) (program: %u)\n", program, index, bufsize, length, size, type, name, size == nullptr ? 0 : *size, type == nullptr ? GL_ENUM_TO_STRING(0) : GL_ENUM_TO_STRING(*type), static_cast(length == nullptr ? (name == nullptr ? 0 : static_cast(std::strlen(name))) : *length), name == nullptr ? "" : name, program); GLCHECK_ERRORS(); } void IContext::getActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name) const { GLCALL(GetActiveUniform)(program, index, bufsize, length, size, type, name); // NOTE: Must log after call due to return value APILOG("glGetActiveUniform(%u, %u, %u, %p, %p, %p, %p) = (%d, %s, %.*s) (program: %u)\n", program, index, bufsize, length, size, type, name, size == nullptr ? 0 : *size, type == nullptr ? GL_ENUM_TO_STRING(0) : GL_ENUM_TO_STRING(*type), static_cast(length == nullptr ? (name == nullptr ? 0 : static_cast(std::strlen(name))) : *length), name == nullptr ? "" : name, program); GLCHECK_ERRORS(); #if IGL_API_LOG addProgramUniform(program, length, type, name); #endif } void IContext::getActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params) const { IGLCALL(GetActiveUniformsiv)(program, uniformCount, uniformIndices, pname, params); // NOTE: Must log after call due to return value APILOG("glGetActiveUniformsiv(%u, %u, %p, %s, %p) (program: %u)\n", program, uniformCount, uniformIndices, GL_ENUM_TO_STRING(pname), params, program); GLCHECK_ERRORS(); } void IContext::getActiveUniformBlockiv(GLuint program, GLuint index, GLenum pname, GLint* params) const { IGLCALL(GetActiveUniformBlockiv)(program, index, pname, params); // NOTE: Must log after call due to return value APILOG("glGetActiveUniformBlockiv(%u, %u, %s, %p) = %d (program: %u)\n", program, index, GL_ENUM_TO_STRING(pname), params, params == nullptr ? 0 : *params, program); GLCHECK_ERRORS(); #if IGL_API_LOG if (pname == GL_UNIFORM_BLOCK_BINDING) { programUbosByLocation_[program][params == nullptr ? 0 : *params] = programUbosByIndex_[program][index]; } #endif } void IContext::getActiveUniformBlockName(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName) const { IGLCALL(GetActiveUniformBlockName)(program, index, bufSize, length, uniformBlockName); // NOTE: Must log after call due to return value APILOG( "glGetActiveUniformBlockName(%u, %u, %u, %p, %p) = %.*s (program: %u)\n", program, index, bufSize, length, uniformBlockName, static_cast( length == nullptr ? (uniformBlockName == nullptr ? 0 : static_cast(std::strlen(uniformBlockName))) : *length), uniformBlockName == nullptr ? "" : uniformBlockName, program); GLCHECK_ERRORS(); #if IGL_API_LOG programUbosByIndex_[program][index] = (uniformBlockName == nullptr) ? "" : uniformBlockName; #endif } GLint IContext::getAttribLocation(GLuint program, const GLchar* name) const { GLint ret = 0; GLCALL_WITH_RETURN(ret, GetAttribLocation)(program, name); // NOTE: Must log after call due to return value APILOG("glGetAttribLocation(%u, %s) = %d (program: %u)\n", program, name, ret, program); GLCHECK_ERRORS(); return ret; } void IContext::getBooleanv(GLenum pname, GLboolean* params) const { GLCALL(GetBooleanv)(pname, params); // NOTE: Must log after call due to return value APILOG("glGetBooleanv(%s, %p) = %s\n", GL_ENUM_TO_STRING(pname), params, params == nullptr ? "" : GL_BOOL_TO_STRING(*params)); GLCHECK_ERRORS(); } void IContext::getBufferParameteriv(GLenum target, GLenum pname, GLint* params) const { GLCALL(GetBufferParameteriv)(target, pname, params); // NOTE: Must log after call due to return value APILOG("glGetBufferParameteriv(%s, %s, %p) = %d (buffer: %u)\n", GL_ENUM_TO_STRING(target), GL_ENUM_TO_STRING(pname), params, params == nullptr ? 0 : *params, boundBuffer(target)); GLCHECK_ERRORS(); } GLenum IContext::getError() const { // Using direct GL call here instead of wrapped one, // since we will add error call counting at some point. return glGetError(); } GLuint IContext::getDebugMessageLog(GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog) const { if (getDebugMessageLogProc_ == nullptr) { if (deviceFeatureSet_.hasInternalRequirement(InternalRequirement::DebugMessageCallbackExtReq)) { if (deviceFeatureSet_.hasExtension(Extensions::Debug)) { getDebugMessageLogProc_ = iglGetDebugMessageLogKHR; } } else if (deviceFeatureSet_.hasInternalFeature(InternalFeatures::DebugMessageCallback)) { getDebugMessageLogProc_ = iglGetDebugMessageLog; } IGL_DEBUG_ASSERT(getDebugMessageLogProc_, "No supported function for glGetDebugMessageLog\n"); } GLuint ret = 0; GLCALL_PROC_WITH_RETURN(ret, getDebugMessageLogProc_, 0, count, bufSize, sources, types, ids, severities, lengths, messageLog); // NOTE: Must log after call due to return value APILOG("glGetDebugMessageLog(%u, %d, %p, %p, %p, %p, %p, %p)\n", count, bufSize, sources, types, ids, severities, lengths, messageLog); GLCHECK_ERRORS(); return ret; } void IContext::getFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params) const { IGLCALL(GetFramebufferAttachmentParameteriv)(target, attachment, pname, params); // NOTE: Must log after call due to return value APILOG("glGetFramebufferAttachmentParameteriv(%s, %s, %s, %p) = %d (framebuffer: %u) (%s: %u)\n", GL_ENUM_TO_STRING(target), GL_ENUM_TO_STRING(attachment), GL_ENUM_TO_STRING(pname), params, params == nullptr ? 0 : *params, boundFramebuffer(target), framebufferAttachmentType(target, attachment), framebufferAttachment(target, attachment)); GLCHECK_ERRORS(); } void IContext::getIntegerv(GLenum pname, GLint* params) const { GLCALL(GetIntegerv)(pname, params); // NOTE: Must log after call due to return value APILOG("glGetIntegerv(%s, %p) = %d\n", GL_ENUM_TO_STRING(pname), params, params == nullptr ? 0 : *params); GLCHECK_ERRORS(); } void IContext::getProgramiv(GLuint program, GLenum pname, GLint* params) const { GLCALL(GetProgramiv)(program, pname, params); // NOTE: Must log after call due to return value APILOG("glGetProgramiv(%u, %s, %p) = %d (program: %u)\n", program, GL_ENUM_TO_STRING(pname), params, params == nullptr ? 0 : *params, program); GLCHECK_ERRORS(); } void IContext::getProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint* params) const { IGLCALL(GetProgramInterfaceiv)(program, programInterface, pname, params); // NOTE: Must log after call due to return value APILOG("glGetProgramInterfaceiv(%u, %s, %s, %p) = %d (program: %u)\n", program, GL_ENUM_TO_STRING(programInterface), GL_ENUM_TO_STRING(pname), params, params == nullptr ? 0 : *params, program); GLCHECK_ERRORS(); } void IContext::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog) const { GLCALL(GetProgramInfoLog)(program, bufsize, length, infolog); // NOTE: Must log after call due to return value APILOG("glGetProgramInfoLog(%u, %u, %p, %p) = %.*s (progam: %u)\n", program, bufsize, length, infolog, static_cast(length == nullptr ? (infolog == nullptr ? 0 : static_cast(std::strlen(infolog))) : *length), infolog == nullptr ? "" : infolog, program); GLCHECK_ERRORS(); } GLuint IContext::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar* name) const { GLuint ret = 0; IGLCALL_WITH_RETURN(ret, GetProgramResourceIndex)(program, programInterface, name); // NOTE: Must log after call due to return value APILOG("glGetProgramResourceIndex(%u, %s, %s) = %u (program: %u)\n", program, GL_ENUM_TO_STRING(programInterface), name, ret, program); GLCHECK_ERRORS(); #if IGL_API_LOG setProgramResourceIndex(program, programInterface, name, ret); #endif return ret; } void IContext::getProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* IGL_NULLABLE props, GLsizei bufSize, GLsizei* IGL_NULLABLE length, GLint* IGL_NULLABLE params) { IGLCALL(GetProgramResourceiv) (program, programInterface, index, propCount, props, bufSize, length, params); // NOTE: Must log after call due to return value APILOG("glGetProgramResourceiv(%u, %s, %u, %u, %p [%s], %u, %p, %p) = (%u, %d) (program: %u)\n", program, GL_ENUM_TO_STRING(programInterface), index, propCount, props, GL_ENUM_TO_STRING(props == nullptr ? 0 : *props), bufSize, length, params, length == nullptr ? 0 : *length, params == nullptr ? 0 : *params, program); GLCHECK_ERRORS(); #if IGL_API_LOG if (programInterface == GL_SHADER_STORAGE_BLOCK && propCount > 0 && props != nullptr && *props == GL_BUFFER_BINDING) { programSsbosByLocation_[program][params == nullptr ? 0 : *params] = programSsbosByIndex_[program][index]; } #endif } void IContext::getProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei* length, char* name) const { IGLCALL(GetProgramResourceName)(program, programInterface, index, bufSize, length, name); // NOTE: Must log after call due to return value APILOG("glGetProgramResourceName(%u, %s, %u, %u, %p, %p) = %.*s (program: %u)\n", program, GL_ENUM_TO_STRING(programInterface), index, bufSize, length, name, static_cast(length == nullptr ? (name == nullptr ? 0 : static_cast(std::strlen(name))) : *length), name == nullptr ? "" : name, program); GLCHECK_ERRORS(); } void IContext::getShaderiv(GLuint shader, GLenum pname, GLint* params) const { GLCALL(GetShaderiv)(shader, pname, params); // NOTE: Must log after call due to return value APILOG("glGetShaderiv(%u, %s, %p) = %d\n", shader, GL_ENUM_TO_STRING(pname), params, params == nullptr ? 0 : *params); GLCHECK_ERRORS(); } void IContext::getShaderInfoLog(GLuint shader, GLsizei maxLength, GLsizei* length, GLchar* infoLog) const { GLCALL(GetShaderInfoLog)(shader, maxLength, length, infoLog); // NOTE: Must log after call due to return value APILOG("glGetShaderInfoLog(%u, %u, %p, %p) = %.*s\n", shader, maxLength, length, infoLog, static_cast(length == nullptr ? (infoLog == nullptr ? 0 : static_cast(std::strlen(infoLog))) : *length), infoLog == nullptr ? "" : infoLog); GLCHECK_ERRORS(); } const GLubyte* IContext::getString(GLenum name) const { const GLubyte* ret = nullptr; GLCALL_WITH_RETURN(ret, GetString)(name); // NOTE: Must log after call due to return value APILOG("glGetString(%s) = %s\n", GL_ENUM_TO_STRING(name), reinterpret_cast(ret)); GLCHECK_ERRORS(); return ret; } const GLubyte* IContext::getStringi(GLenum name, GLuint index) const { const GLubyte* ret = nullptr; IGLCALL_WITH_RETURN(ret, GetStringi)(name, index); // NOTE: Must log after call due to return value APILOG("glGetStringi(%s, %d) = %s\n", GL_ENUM_TO_STRING(name), index, reinterpret_cast(ret)); GLCHECK_ERRORS(); return ret; } void IContext::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values) const { if (getSyncivProc_ == nullptr) { if (deviceFeatureSet_.hasInternalRequirement(InternalRequirement::SyncExtReq)) { if (deviceFeatureSet_.hasExtension(Extensions::Sync)) { getSyncivProc_ = iglGetSyncivAPPLE; } } else if (deviceFeatureSet_.hasInternalFeature(InternalFeatures::Sync)) { getSyncivProc_ = iglGetSynciv; } IGL_DEBUG_ASSERT(getSyncivProc_, "No supported function for glGetSynciv\n"); } GLCALL_PROC(getSyncivProc_, sync, pname, bufSize, length, values); // NOTE: Must log after call due to return value APILOG("glGetSynciv(%p, %s, %u, %p, %p) = %d (sync: %p)\n", sync, GL_ENUM_TO_STRING(pname), bufSize, length, values, values == nullptr ? 0 : *values, sync); GLCHECK_ERRORS(); } void IContext::getUniformiv(GLuint program, GLint location, GLint* params) const { GLCALL(GetUniformiv)(program, location, params); // NOTE: Must log after call due to return value APILOG("glGetUniformiv(%u, %d, %p) = %d (program: %u)\n", program, location, params, params == nullptr ? 0 : *params, program); GLCHECK_ERRORS(); } GLint IContext::getUniformLocation(GLuint program, const GLchar* name) const { GLint ret = 0; GLCALL_WITH_RETURN(ret, GetUniformLocation)(program, name); // NOTE: Must log after call due to return value APILOG("glGetUniformLocation(%u, %s) = %d (program: %u)\n", program, name, ret, program); GLCHECK_ERRORS(); #if IGL_API_LOG setProgramUniformLocation(program, name, ret); #endif return ret; } void IContext::importMemoryFd(GLuint memory, GLuint64 size, GLenum handleType, GLint fd) { APILOG( "glImportMemoryFdEXT(%u, %llu, %s, %d)\n", memory, size, GL_ENUM_TO_STRING(handleType), fd); IGLCALL(ImportMemoryFdEXT)(memory, size, handleType, fd); GLCHECK_ERRORS(); } void IContext::invalidateFramebuffer(IGL_MAYBE_UNUSED GLenum target, IGL_MAYBE_UNUSED GLsizei numAttachments, IGL_MAYBE_UNUSED const GLenum* attachments) { if (invalidateFramebufferProc_ == nullptr) { if (deviceFeatureSet_.hasInternalRequirement( InternalRequirement::InvalidateFramebufferExtReq)) { if (deviceFeatureSet_.hasExtension(Extensions::DiscardFramebuffer)) { invalidateFramebufferProc_ = iglDiscardFramebufferEXT; } } else if (deviceFeatureSet_.hasInternalFeature(InternalFeatures::InvalidateFramebuffer)) { invalidateFramebufferProc_ = iglInvalidateFramebuffer; } IGL_DEBUG_ASSERT(invalidateFramebufferProc_, "No supported function for glInvalidateFramebuffer\n"); } APILOG("glInvalidateFramebuffer(%s, %u, %p) (framebuffer: %u)\n", GL_ENUM_TO_STRING(target), numAttachments, attachments, boundFramebuffer(target)); GLCALL_PROC(invalidateFramebufferProc_, target, numAttachments, attachments); GLCHECK_ERRORS(); } GLboolean IContext::isEnabled(GLenum cap) { GLboolean ret = 0; GLCALL_WITH_RETURN(ret, IsEnabled)(cap); // NOTE: Must log after call due to return value APILOG("glIsEnabled(%s) = %s\n", GL_ENUM_TO_STRING(cap), GL_BOOL_TO_STRING(ret)); GLCHECK_ERRORS(); return ret; } GLboolean IContext::isTexture(GLuint texture) { GLboolean ret = 0; GLCALL_WITH_RETURN(ret, IsTexture)(texture); // NOTE: Must log after call due to return value APILOG("glIsTexture(%u) = %s\n", texture, GL_BOOL_TO_STRING(ret)); GLCHECK_ERRORS(); return ret; } void IContext::linkProgram(GLuint program) { APILOG("glLinkProgram(%u) (program: %u)\n", program, program); GLCALL(LinkProgram)(program); // NOTE: Explicitly *not* checking for errors // If there is an error, we want the client code to get error message and report // to the user/logs, rather than assert here. // @fb-only // @fb-only // @fb-only } void* IContext::mapBuffer(GLenum target, GLenum access) { if (deviceFeatureSet_.hasInternalRequirement(InternalRequirement::MapBufferExtReq)) { if (deviceFeatureSet_.hasExtension(Extensions::MapBuffer)) { mapBufferProc_ = iglMapBufferOES; } } else if (deviceFeatureSet_.hasInternalFeature(InternalFeatures::MapBuffer)) { mapBufferProc_ = iglMapBuffer; } void* ret = nullptr; GLCALL_PROC_WITH_RETURN(ret, mapBufferProc_, nullptr, target, access); // NOTE: Must log after call due to return value APILOG("glMapBuffer(%s, %zu, %zu, %s) = %p (buffer: %u)\n", GL_ENUM_TO_STRING(target), GL_ENUM_TO_STRING(access), ret, boundBuffer(target)); GLCHECK_ERRORS(); return ret; } void* IContext::mapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) { if (mapBufferRangeProc_ == nullptr) { if (deviceFeatureSet_.hasInternalRequirement(InternalRequirement::MapBufferRangeExtReq)) { if (deviceFeatureSet_.hasExtension(Extensions::MapBufferRange)) { mapBufferRangeProc_ = iglMapBufferRangeEXT; } } else if (deviceFeatureSet_.hasFeature(DeviceFeatures::MapBufferRange)) { mapBufferRangeProc_ = iglMapBufferRange; } IGL_DEBUG_ASSERT(mapBufferRangeProc_, "No supported function for glMapBufferRange\n"); } void* ret = nullptr; GLCALL_PROC_WITH_RETURN(ret, mapBufferRangeProc_, nullptr, target, offset, length, access); // NOTE: Must log after call due to return value APILOG("glMapBufferRange(%s, %zu, %zu, 0x%x [%s]) = %p (buffer: %u)\n", GL_ENUM_TO_STRING(target), offset, length, access, GL_MAP_BUFFER_RANGE_BITS_TO_STRING(access), ret, boundBuffer(target)); GLCHECK_ERRORS(); return ret; } void IContext::objectLabel(GLenum identifier, GLuint name, GLsizei length, const char* label) { if (objectLabelProc_ == nullptr) { if (deviceFeatureSet_.hasInternalRequirement(InternalRequirement::DebugLabelExtReq)) { if (deviceFeatureSet_.hasExtension(Extensions::Debug)) { objectLabelProc_ = iglObjectLabelKHR; } else if (deviceFeatureSet_.hasExtension(Extensions::DebugLabel)) { objectLabelProc_ = iglLabelObjectEXT; } } else if (deviceFeatureSet_.hasInternalFeature(InternalFeatures::DebugLabel)) { objectLabelProc_ = iglObjectLabel; } IGL_DEBUG_ASSERT(objectLabelProc_, "No supported function for glObjectLabel\n"); } APILOG("glObjectLabel(%s, %u, %u, %s) %s\n", GL_ENUM_TO_STRING(identifier), name, length, label, identifierLabel(identifier, name).c_str()); GLCALL_PROC(objectLabelProc_, identifier, name, length, label); GLCHECK_ERRORS(); } void IContext::pixelStorei(GLenum pname, GLint param) { APILOG("glPixelStorei(%s, %d)\n", GL_ENUM_TO_STRING(pname), param); GLCALL(PixelStorei)(pname, param); GLCHECK_ERRORS(); } void IContext::polygonOffsetClamp(GLfloat factor, GLfloat units, float clamp) { const bool hasPolygonOffsetClamp = deviceFeatureSet_.hasExtension(Extensions::PolygonOffsetClamp); if (!hasPolygonOffsetClamp) { IGL_DEBUG_ASSERT(clamp == 0, "PolygonOffsetClamp is not supported\n"); } if (clamp == 0 || !hasPolygonOffsetClamp) { APILOG("glPolygonOffset(%f, %f)\n", factor, units); GLCALL(PolygonOffset)(factor, units); } else { APILOG("glPolygonOffsetClamp(%f, %f, %f)\n", factor, units, clamp); IGLCALL(PolygonOffsetClamp)(factor, units, clamp); } GLCHECK_ERRORS(); } void IContext::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar* message) { if (pushDebugGroupProc_ == nullptr) { if (deviceFeatureSet_.hasInternalFeature(InternalFeatures::DebugMessage)) { if (deviceFeatureSet_.hasInternalRequirement(InternalRequirement::DebugMessageExtReq)) { if (deviceFeatureSet_.hasExtension(Extensions::Debug)) { pushDebugGroupProc_ = iglPushDebugGroupKHR; getIntegerv(GL_MAX_DEBUG_GROUP_STACK_DEPTH, &maxDebugStackSize_); } else if (deviceFeatureSet_.hasExtension(Extensions::DebugMarker)) { pushDebugGroupProc_ = iglPushGroupMarkerEXT; // GL_EXT_debug_marker does not provide a way to query the max maxDebugStackSize_ = std::numeric_limits::max(); } } else { pushDebugGroupProc_ = iglPushDebugGroup; getIntegerv(GL_MAX_DEBUG_GROUP_STACK_DEPTH, &maxDebugStackSize_); } } IGL_DEBUG_ASSERT(pushDebugGroupProc_, "No supported function for glPushDebugGroup\n"); } if (++debugStackSize_ < maxDebugStackSize_) { APILOG("glPushDebugGroup(%s, %u, %u, %s)\n", GL_ENUM_TO_STRING(source), id, length, message); GLCALL_PROC(pushDebugGroupProc_, source, id, length, message); GLCHECK_ERRORS(); } else { IGL_LOG_ERROR_ONCE("Exceeded max debug group stack size of %d, ignoring push\n", maxDebugStackSize_); } } void IContext::popDebugGroup() { if (popDebugGroupProc_ == nullptr) { if (deviceFeatureSet_.hasInternalFeature(InternalFeatures::DebugMessage)) { if (deviceFeatureSet_.hasInternalRequirement(InternalRequirement::DebugMessageExtReq)) { if (deviceFeatureSet_.hasExtension(Extensions::Debug)) { popDebugGroupProc_ = iglPopDebugGroupKHR; } else if (deviceFeatureSet_.hasExtension(Extensions::DebugMarker)) { popDebugGroupProc_ = iglPopGroupMarkerEXT; } } else { popDebugGroupProc_ = iglPopDebugGroup; } } IGL_DEBUG_ASSERT(popDebugGroupProc_, "No supported function for glPopDebugGroup\n"); } if (debugStackSize_ < maxDebugStackSize_ && maxDebugStackSize_ > 0) { --debugStackSize_; APILOG("glPopDebugGroup()\n"); GLCALL_PROC(popDebugGroupProc_); GLCHECK_ERRORS(); } else if (debugStackSize_ >= maxDebugStackSize_) { --debugStackSize_; IGL_LOG_ERROR_ONCE("Debug group stack size was exceeded, ignoring pop\n"); } else if (maxDebugStackSize_ == 0) { IGL_LOG_ERROR_ONCE("Debug group stack is empty, can't pop\n"); } } void IContext::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels) { APILOG("glReadPixels(%d, %u, %u, %d, %s, %s, %p) (buffer: %u) (%s: %u)\n", x, y, width, height, GL_ENUM_TO_STRING(format), GL_ENUM_TO_STRING(type), pixels, boundBuffer(GL_PIXEL_PACK_BUFFER), framebufferReadBufferType(GL_READ_FRAMEBUFFER), framebufferReadBuffer(GL_READ_FRAMEBUFFER)); GLCALL(ReadPixels)(x, y, width, height, format, type, pixels); GLCHECK_ERRORS(); } void IContext::renderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) { APILOG("glRenderbufferStorage(%s, %s, %u, %u) (renderbuffer: %u)\n", GL_ENUM_TO_STRING(target), GL_ENUM_TO_STRING(internalformat), width, height, boundRenderbuffer_); IGLCALL(RenderbufferStorage)(target, internalformat, width, height); GLCHECK_ERRORS(); } void IContext::renderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { if (renderbufferStorageMultisampleProc_ == nullptr) { // Use runtime checks to determine which of several potential methods are supported by the // context. if (deviceFeatureSet_.hasFeature(DeviceFeatures::MultiSample)) { if (!deviceFeatureSet_.hasInternalRequirement(InternalRequirement::MultiSampleExtReq)) { renderbufferStorageMultisampleProc_ = iglRenderbufferStorageMultisample; } else if (deviceFeatureSet_.hasExtension(Extensions::MultiSampleExt)) { renderbufferStorageMultisampleProc_ = iglRenderbufferStorageMultisampleEXT; } else if (deviceFeatureSet_.hasExtension(Extensions::MultiSampleImg)) { renderbufferStorageMultisampleProc_ = iglRenderbufferStorageMultisampleIMG; } else if (deviceFeatureSet_.hasExtension(Extensions::MultiSampleApple)) { renderbufferStorageMultisampleProc_ = iglRenderbufferStorageMultisampleAPPLE; } } IGL_DEBUG_ASSERT(renderbufferStorageMultisampleProc_, "No supported function for glRenderbufferStorageMultisampleProc\n"); } APILOG("glRenderbufferStorageMultisampleProc(%s, %u, %s, %u, %u) (renderbuffer: %u)\n", GL_ENUM_TO_STRING(target), samples, GL_ENUM_TO_STRING(internalformat), width, height, boundRenderbuffer_); GLCALL_PROC(renderbufferStorageMultisampleProc_, target, samples, internalformat, width, height); GLCHECK_ERRORS(); } void IContext::framebufferTextureMultiview(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews) { #if IGL_API_LOG const char* unboundAttachmentType = framebufferAttachmentType(target, attachment); GLuint unboundAttachment = framebufferAttachment(target, attachment); setFramebufferAttachment(target, attachment, false, texture); #endif APILOG( "glFramebufferTextureMultiviewOVR(%s, %s, %u, %d, %d, %u) (framebuffer: %u) unbound (%s: %u) " "bound (texture: %u)\n", GL_ENUM_TO_STRING(target), GL_ENUM_TO_STRING(attachment), texture, level, baseViewIndex, numViews, boundFramebuffer(target), unboundAttachmentType, unboundAttachment, texture); IGLCALL(FramebufferTextureMultiviewOVR) (target, attachment, texture, level, baseViewIndex, numViews); GLCHECK_ERRORS(); } void IContext::framebufferTextureMultisampleMultiview(GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei samples, GLint baseViewIndex, GLsizei numViews) { #if IGL_API_LOG const char* unboundAttachmentType = framebufferAttachmentType(target, attachment); GLuint unboundAttachment = framebufferAttachment(target, attachment); setFramebufferAttachment(target, attachment, false, texture); #endif APILOG( "glFramebufferTextureMultisampleMultiview(%s, %s, %u, %d, %u, %d, %u) (framebuffer: %u) " "unbound (%s: %u) bound (texture: %u)\n", GL_ENUM_TO_STRING(target), GL_ENUM_TO_STRING(attachment), texture, level, samples, baseViewIndex, numViews, boundFramebuffer(target), unboundAttachmentType, unboundAttachment, texture); IGLCALL(FramebufferTextureMultisampleMultiviewOVR) (target, attachment, texture, level, samples, baseViewIndex, numViews); GLCHECK_ERRORS(); } void IContext::scissor(GLint x, GLint y, GLsizei width, GLsizei height) { APILOG("glScissor(%d, %d, %u, %u)\n", x, y, width, height); GLCALL(Scissor)(x, y, width, height); GLCHECK_ERRORS(); } void IContext::setEnabled(bool shouldEnable, GLenum cap) { if (shouldEnable) { APILOG("glEnable(%s)\n", GL_ENUM_TO_STRING(cap)); GLCALL(Enable)(cap); } else { APILOG("glDisable(%s)\n", GL_ENUM_TO_STRING(cap)); GLCALL(Disable)(cap); } GLCHECK_ERRORS(); } void IContext::shaderSource(GLuint shader, GLsizei count, const GLchar** string, const GLint* length) { APILOG("glShaderSource(%d, %u, %p, %p)\n", shader, count, string, length); APILOG_SOURCE(count, string, length); GLCALL(ShaderSource)(shader, count, string, length); GLCHECK_ERRORS(); } void IContext::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask) { APILOG("glStencilFuncSeparate(%s, %s, %d, 0x%x)\n", GL_ENUM_TO_STRING(face), GL_ENUM_TO_STRING(func), ref, mask); GLCALL(StencilFuncSeparate)(face, func, ref, mask); GLCHECK_ERRORS(); } void IContext::stencilMask(GLuint mask) { APILOG("glStencilMask(0x%x)\n", mask); GLCALL(StencilMask)(mask); GLCHECK_ERRORS(); } void IContext::stencilMaskSeparate(GLenum face, GLuint mask) { APILOG("glStencilMaskSeparate(%s, 0x%x)\n", GL_ENUM_TO_STRING(face), mask); GLCALL(StencilMaskSeparate)(face, mask); GLCHECK_ERRORS(); } void IContext::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass) { APILOG("glStencilOpSeparate(%s, %s, %s, %s)\n", GL_ENUM_TO_STRING(face), GL_ENUM_TO_STRING(fail), GL_ENUM_TO_STRING(zfail), GL_ENUM_TO_STRING(zpass)); GLCALL(StencilOpSeparate)(face, fail, zfail, zpass); GLCHECK_ERRORS(); } void IContext::texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* data) { APILOG("glTexImage2D(%s, %d, %s, %u, %u, %d, %s, %s, 0x%x) (texture: %u)\n", GL_ENUM_TO_STRING(target), level, GL_ENUM_TO_STRING(internalformat), width, height, border, GL_ENUM_TO_STRING(format), GL_ENUM_TO_STRING(type), data, boundTexture(target)); GLCALL(TexImage2D)(target, level, internalformat, width, height, border, format, type, data); GLCHECK_ERRORS(); } void IContext::texStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) { if (texStorage2DProc_ == nullptr) { if (deviceFeatureSet_.hasInternalRequirement(InternalRequirement::TexStorageExtReq)) { if (deviceFeatureSet_.hasExtension(Extensions::TexStorage)) { texStorage2DProc_ = iglTexStorage2DEXT; } } else if (deviceFeatureSet_.hasInternalFeature(InternalFeatures::TexStorage)) { texStorage2DProc_ = iglTexStorage2D; } IGL_DEBUG_ASSERT(texStorage2DProc_, "No supported function for glTexStorage2D\n"); } APILOG("glTexStorage2D(%s, %u, %s, %u, %u) (texture: %u)\n", GL_ENUM_TO_STRING(target), levels, GL_ENUM_TO_STRING(internalformat), width, height, boundTexture(target)); GLCALL_PROC(texStorage2DProc_, target, levels, internalformat, width, height); GLCHECK_ERRORS(); } void IContext::texStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) { if (texStorage3DProc_ == nullptr) { if (deviceFeatureSet_.hasInternalRequirement(InternalRequirement::TexStorageExtReq)) { if (deviceFeatureSet_.hasExtension(Extensions::TexStorage)) { texStorage3DProc_ = iglTexStorage3DEXT; } } else if (deviceFeatureSet_.hasInternalFeature(InternalFeatures::TexStorage)) { texStorage3DProc_ = iglTexStorage3D; } IGL_DEBUG_ASSERT(texStorage3DProc_, "No supported function for glTexStorage3D\n"); } APILOG("glTexStorage3D(%s, %u, %s, %u, %u, %u) (texture: %u)\n", GL_ENUM_TO_STRING(target), levels, GL_ENUM_TO_STRING(internalformat), width, height, depth, boundTexture(target)); GLCALL_PROC(texStorage3DProc_, target, levels, internalformat, width, height, depth); GLCHECK_ERRORS(); } void IContext::texStorageMem2D(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset) { APILOG("glTexStorageMem2DEXT(%s, %u, %s, %u, %u, %u, %lu) (texture: %u)\n", GL_ENUM_TO_STRING(target), levels, GL_ENUM_TO_STRING(internalFormat), width, height, memory, offset, boundTexture(target)); IGLCALL(TexStorageMem2DEXT)(target, levels, internalFormat, width, height, memory, offset); GLCHECK_ERRORS(); } void IContext::texStorageMem3D(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset) { APILOG("glTexStorageMem3DEXT(%s, %u, %s, %u, %u, %u, %u, %lu) (texture: %u)\n", GL_ENUM_TO_STRING(target), levels, GL_ENUM_TO_STRING(internalFormat), width, height, depth, memory, offset, boundTexture(target)); IGLCALL(TexStorageMem3DEXT) (target, levels, internalFormat, width, height, depth, memory, offset); GLCHECK_ERRORS(); } void IContext::texImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* data) { if (texImage3DProc_ == nullptr) { if (deviceFeatureSet_.hasFeature(DeviceFeatures::Texture3D)) { if (deviceFeatureSet_.hasInternalRequirement(InternalRequirement::Texture3DExtReq)) { if (deviceFeatureSet_.hasExtension(Extensions::Texture3D)) { texImage3DProc_ = iglTexImage3DOES; } } else { texImage3DProc_ = iglTexImage3D; } } IGL_DEBUG_ASSERT(texImage3DProc_, "No supported function for glTexImage3D\n"); } APILOG("glTexImage3D(%s, %d, %s, %u, %u, %u, %d, %s, %s, 0x%x) (texture: %u)\n", GL_ENUM_TO_STRING(target), level, GL_ENUM_TO_STRING(internalformat), width, height, depth, border, GL_ENUM_TO_STRING(format), GL_ENUM_TO_STRING(type), data, boundTexture(target)); GLCALL_PROC(texImage3DProc_, target, level, internalformat, width, height, depth, border, format, type, data); GLCHECK_ERRORS(); } void IContext::texParameteri(GLenum target, GLenum pname, GLint param) { // GLCALL(TexParameteri, target, pname, param); APILOG("glTexParameteri(%s, %s, %s) (texture: %u)\n", GL_ENUM_TO_STRING(target), GL_ENUM_TO_STRING(pname), GL_ENUM_TO_STRING(param), boundTexture(target)); GLCALL(TexParameteri)(target, pname, param); GLCHECK_ERRORS(); } void IContext::texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid* pixels) { APILOG("glTexSubImage2D(%s, %d, %d, %d, %u, %u, %s, %s, %p) (texture: %u)\n", GL_ENUM_TO_STRING(target), level, xoffset, yoffset, width, height, GL_ENUM_TO_STRING(format), GL_ENUM_TO_STRING(type), pixels, boundTexture(target)); GLCALL(TexSubImage2D)(target, level, xoffset, yoffset, width, height, format, type, pixels); GLCHECK_ERRORS(); } void IContext::texSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels) { if (texSubImage3DProc_ == nullptr) { if (deviceFeatureSet_.hasFeature(DeviceFeatures::Texture3D)) { if (deviceFeatureSet_.hasInternalRequirement(InternalRequirement::Texture3DExtReq)) { if (deviceFeatureSet_.hasExtension(Extensions::Texture3D)) { texSubImage3DProc_ = iglTexSubImage3DOES; } } else { texSubImage3DProc_ = iglTexSubImage3D; } } IGL_DEBUG_ASSERT(texSubImage3DProc_, "No supported function for glTexSubImage3D\n"); } APILOG("glTexSubImage3D(%s, %d, %d, %d, %d, %u, %u, %u, %s, %s, %p) (texture: %u)\n", GL_ENUM_TO_STRING(target), level, xoffset, yoffset, zoffset, width, height, depth, GL_ENUM_TO_STRING(format), GL_ENUM_TO_STRING(type), pixels, boundTexture(target)); GLCALL_PROC(texSubImage3DProc_, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); GLCHECK_ERRORS(); } void IContext::uniform1f(GLint location, GLfloat x) { APILOG("glUniform1f(%d, %f) (program: %u) (uniform: %s)\n", location, x, boundProgram_, programUniformsByLocation_[boundProgram_][location].c_str()); GLCALL(Uniform1f)(location, x); GLCHECK_ERRORS(); } void IContext::uniform1fv(GLint location, GLsizei count, const GLfloat* v) { APILOG("glUniform1fv(%d, %u, %p [%f]) (program: %u) (uniform: %s)\n", location, count, v, v == nullptr ? 0.f : *v, boundProgram_, programUniformsByLocation_[boundProgram_][location].c_str()); GLCALL(Uniform1fv)(location, count, v); GLCHECK_ERRORS(); } void IContext::uniform1i(GLint location, GLint x) { APILOG("glUniform1i(%d, %d) (program: %u) (uniform: %s) %s\n", location, x, boundProgram_, programUniformsByLocation_[boundProgram_][location].c_str(), boundUniformTexture(boundProgram_, location, x).c_str()); GLCALL(Uniform1i)(location, x); GLCHECK_ERRORS(); } void IContext::uniform1iv(GLint location, GLsizei count, const GLint* v) { APILOG("glUniform1iv(%d, %u, %p [%d]) (program: %u) (uniform: %s)\n", location, count, v, v == nullptr ? 0 : *v, boundProgram_, programUniformsByLocation_[boundProgram_][location].c_str()); GLCALL(Uniform1iv)(location, count, v); GLCHECK_ERRORS(); } void IContext::uniform2f(GLint location, GLfloat x, GLfloat y) { APILOG("glUniform2f(%d, %f, %f) (program: %u) (uniform: %s)\n", location, x, y, boundProgram_, programUniformsByLocation_[boundProgram_][location].c_str()); GLCALL(Uniform2f)(location, x, y); GLCHECK_ERRORS(); } void IContext::uniform2fv(GLint location, GLsizei count, const GLfloat* v) { APILOG("glUniform2fv(%d, %u, %p [%f %f]) (program: %u) (uniform: %s)\n", location, count, v, v == nullptr ? 0.f : v[0], v == nullptr ? 0.f : v[1], boundProgram_, programUniformsByLocation_[boundProgram_][location].c_str()); GLCALL(Uniform2fv)(location, count, v); GLCHECK_ERRORS(); } void IContext::uniform2i(GLint location, GLint x, GLint y) { APILOG("glUniform2i(%d, %d, %d) (program: %u) (uniform: %s)\n", location, x, y, boundProgram_, programUniformsByLocation_[boundProgram_][location].c_str()); GLCALL(Uniform2i)(location, x, y); GLCHECK_ERRORS(); } void IContext::uniform2iv(GLint location, GLsizei count, const GLint* v) { APILOG("glUniform2iv(%d, %u, %p [%d %d]) (program: %u) (uniform: %s)\n", location, count, v, v == nullptr ? 0 : v[0], v == nullptr ? 0 : v[1], boundProgram_, programUniformsByLocation_[boundProgram_][location].c_str()); GLCALL(Uniform2iv)(location, count, v); GLCHECK_ERRORS(); } void IContext::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z) { APILOG("glUniform3f(%d, %f, %f, %f) (program: %u) (uniform: %s)\n", location, x, y, z, boundProgram_, programUniformsByLocation_[boundProgram_][location].c_str()); GLCALL(Uniform3f)(location, x, y, z); GLCHECK_ERRORS(); } void IContext::uniform3fv(GLint location, GLsizei count, const GLfloat* v) { APILOG("glUniform3fv(%d, %u, %p [%f %f %f]) (program: %u) (uniform: %s)\n", location, count, v, v == nullptr ? 0.f : v[0], v == nullptr ? 0.f : v[1], v == nullptr ? 0.f : v[2], boundProgram_, programUniformsByLocation_[boundProgram_][location].c_str()); GLCALL(Uniform3fv)(location, count, v); GLCHECK_ERRORS(); } void IContext::uniform3i(GLint location, GLint x, GLint y, GLint z) { APILOG("glUniform3i(%d, %d, %d, %d) (program: %u) (uniform: %s)\n", location, x, y, z, boundProgram_, programUniformsByLocation_[boundProgram_][location].c_str()); GLCALL(Uniform3i)(location, x, y, z); GLCHECK_ERRORS(); } void IContext::uniform3iv(GLint location, GLsizei count, const GLint* v) { APILOG("glUniform3fv(%d, %u, %p [%d %d %d]) (program: %u) (uniform: %s)\n", location, count, v, v == nullptr ? 0 : v[0], v == nullptr ? 0 : v[1], v == nullptr ? 0 : v[2], boundProgram_, programUniformsByLocation_[boundProgram_][location].c_str()); GLCALL(Uniform3iv)(location, count, v); GLCHECK_ERRORS(); } void IContext::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { APILOG("glUniform4f(%d, %f, %f, %f, %f) (program: %u) (uniform: %s)\n", location, x, y, z, w, boundProgram_, programUniformsByLocation_[boundProgram_][location].c_str()); GLCALL(Uniform4f)(location, x, y, z, w); GLCHECK_ERRORS(); } void IContext::uniform4fv(GLint location, GLsizei count, const GLfloat* v) { APILOG("glUniform4fv(%d, %u, %p [%f %f %f %f]) (program: %u) (uniform: %s)\n", location, count, v, v == nullptr ? 0.f : v[0], v == nullptr ? 0.f : v[1], v == nullptr ? 0.f : v[2], v == nullptr ? 0.f : v[3], boundProgram_, programUniformsByLocation_[boundProgram_][location].c_str()); GLCALL(Uniform4fv)(location, count, v); GLCHECK_ERRORS(); } void IContext::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w) { APILOG("glUniform4i(%d, %d, %d, %d, %d) (program: %u) (uniform: %s)\n", location, x, y, z, w, boundProgram_, programUniformsByLocation_[boundProgram_][location].c_str()); GLCALL(Uniform4i)(location, x, y, z, w); GLCHECK_ERRORS(); } void IContext::uniform4iv(GLint location, GLsizei count, const GLint* v) { APILOG("glUniform4iv(%d, %u, %p [%d %d %d %d]) (program: %u) (uniform: %s)\n", location, count, v, v == nullptr ? 0 : v[0], v == nullptr ? 0 : v[1], v == nullptr ? 0 : v[2], v == nullptr ? 0 : v[3], boundProgram_, programUniformsByLocation_[boundProgram_][location].c_str()); GLCALL(Uniform4iv)(location, count, v); GLCHECK_ERRORS(); } void IContext::uniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding) { APILOG("glUniformBlockBinding(%u, %u, %u) (program: %u)\n", program, uniformBlockIndex, uniformBlockBinding, program); IGLCALL(UniformBlockBinding)(program, uniformBlockIndex, uniformBlockBinding); GLCHECK_ERRORS(); } void IContext::uniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { APILOG("glUniformMatrix2fv(%d, %u, %s, %p [[%f %f] [%f %f]]) (program: %u) (uniform: %s)\n", location, count, GL_BOOL_TO_STRING(transpose), value, value == nullptr ? 0.f : value[0], value == nullptr ? 0.f : value[1], value == nullptr ? 0.f : value[2], value == nullptr ? 0.f : value[3], boundProgram_, programUniformsByLocation_[boundProgram_][location].c_str()); GLCALL(UniformMatrix2fv)(location, count, transpose, value); GLCHECK_ERRORS(); } void IContext::uniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { APILOG( "glUniformMatrix3fv(%d, %u, %s, %p [[%f %f %f] [%f %f %f] [%f %f %f]]) (program: %u) " "(uniform: %s)\n", location, count, GL_BOOL_TO_STRING(transpose), value, value == nullptr ? 0.f : value[0], value == nullptr ? 0.f : value[1], value == nullptr ? 0.f : value[2], value == nullptr ? 0.f : value[3], value == nullptr ? 0.f : value[4], value == nullptr ? 0.f : value[5], value == nullptr ? 0.f : value[6], value == nullptr ? 0.f : value[7], value == nullptr ? 0.f : value[8], boundProgram_, programUniformsByLocation_[boundProgram_][location].c_str()); GLCALL(UniformMatrix3fv)(location, count, transpose, value); GLCHECK_ERRORS(); } void IContext::uniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { APILOG( "glUniformMatrix4fv(%d, %u, %s, %p [[%f %f %f %f] [%f %f %f %f] [%f %f %f %f] [%f %f %f " "%f]]) (program: %u) (uniform: %s)\n", location, count, GL_BOOL_TO_STRING(transpose), value, value == nullptr ? 0.f : value[0], value == nullptr ? 0.f : value[1], value == nullptr ? 0.f : value[2], value == nullptr ? 0.f : value[3], value == nullptr ? 0.f : value[4], value == nullptr ? 0.f : value[5], value == nullptr ? 0.f : value[6], value == nullptr ? 0.f : value[7], value == nullptr ? 0.f : value[8], value == nullptr ? 0.f : value[9], value == nullptr ? 0.f : value[10], value == nullptr ? 0.f : value[11], value == nullptr ? 0.f : value[12], value == nullptr ? 0.f : value[13], value == nullptr ? 0.f : value[14], value == nullptr ? 0.f : value[15], boundProgram_, programUniformsByLocation_[boundProgram_][location].c_str()); GLCALL(UniformMatrix4fv)(location, count, transpose, value); GLCHECK_ERRORS(); } void IContext::unmapBuffer(GLenum target) { if (unmapBufferProc_ == nullptr) { if (deviceFeatureSet_.hasInternalRequirement(InternalRequirement::UnmapBufferExtReq)) { if (deviceFeatureSet_.hasExtension(Extensions::MapBuffer) || deviceFeatureSet_.hasExtension(Extensions::MapBufferRange)) { unmapBufferProc_ = iglUnmapBufferOES; } } else if (deviceFeatureSet_.hasInternalFeature(InternalFeatures::UnmapBuffer)) { unmapBufferProc_ = iglUnmapBuffer; } IGL_DEBUG_ASSERT(unmapBufferProc_, "No supported function for glUnmapBuffer\n"); } APILOG("glUnmapBuffer(%s) (buffer: %u)\n", GL_ENUM_TO_STRING(target), boundBuffer(target)); GLCALL_PROC(unmapBufferProc_, target); GLCHECK_ERRORS(); } void IContext::useProgram(GLuint program) { #if IGL_API_LOG GLuint unboundProgram = boundProgram_; boundProgram_ = program; #endif APILOG("glUseProgram(%u) unbound (program: %u) bound (program: %u)\n", program, unboundProgram, program); GLCALL(UseProgram)(program); GLCHECK_ERRORS(); } void IContext::validateProgram(GLuint program) { APILOG("glValidateProgram(%u) (program: %u)\n", program, program); GLCALL(ValidateProgram)(program); GLCHECK_ERRORS(); } void IContext::viewport(GLint x, GLint y, GLsizei width, GLsizei height) { APILOG("glViewport(%d, %d, %u, %u)\n", x, y, width, height); GLCALL(Viewport)(x, y, width, height); GLCHECK_ERRORS(); } GLuint64 IContext::getTextureHandle(GLuint texture) { if (getTextureHandleProc_ == nullptr) { if (deviceFeatureSet_.hasExtension(Extensions::BindlessTextureArb)) { getTextureHandleProc_ = iglGetTextureHandleARB; } else if (deviceFeatureSet_.hasExtension(Extensions::BindlessTextureNv)) { getTextureHandleProc_ = iglGetTextureHandleNV; } IGL_DEBUG_ASSERT(getTextureHandleProc_, "No supported function for glGetTextureHandle\n"); } GLuint64 ret = 0; GLCALL_PROC_WITH_RETURN(ret, getTextureHandleProc_, GL_ZERO, texture); // NOTE: Must log after call due to return value APILOG("glGetTextureHandle(%u) = %llu (texture: %u)\n", texture, ret, texture); GLCHECK_ERRORS(); return ret; } void IContext::makeTextureHandleResident(GLuint64 handle) { if (makeTextureHandleResidentProc_ == nullptr) { if (deviceFeatureSet_.hasExtension(Extensions::BindlessTextureArb)) { makeTextureHandleResidentProc_ = iglMakeTextureHandleResidentARB; } else if (deviceFeatureSet_.hasExtension(Extensions::BindlessTextureNv)) { makeTextureHandleResidentProc_ = iglMakeTextureHandleResidentNV; } IGL_DEBUG_ASSERT(makeTextureHandleResidentProc_, "No supported function for glMakeTextureHandleResidentARB\n"); } APILOG("glMakeTextureHandleResidentARB(%p)\n", handle); GLCALL_PROC(makeTextureHandleResidentProc_, handle); GLCHECK_ERRORS(); } void IContext::makeTextureHandleNonResident(GLuint64 handle) { if (makeTextureHandleNonResidentProc_ == nullptr) { if (deviceFeatureSet_.hasExtension(Extensions::BindlessTextureArb)) { makeTextureHandleNonResidentProc_ = iglMakeTextureHandleNonResidentARB; } else if (deviceFeatureSet_.hasExtension(Extensions::BindlessTextureNv)) { makeTextureHandleNonResidentProc_ = iglMakeTextureHandleNonResidentNV; } IGL_DEBUG_ASSERT(makeTextureHandleNonResidentProc_, "No supported function for glMakeTextureHandleNonResidentARB\n"); } APILOG("glMakeTextureHandleNonResidentARB(%p)\n", handle); GLCALL_PROC(makeTextureHandleNonResidentProc_, handle); GLCHECK_ERRORS(); } void IContext::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ) { #if IGL_API_LOG lastCommandWasCompute_ = true; #endif APILOG("glDispatchCompute(%u, %u, %u) (program: %u) %s %s\n", numGroupsX, numGroupsY, numGroupsZ, boundProgram_, boundImageTextures().c_str(), boundBuffersByIndex().c_str()); IGLCALL(DispatchCompute)(numGroupsX, numGroupsY, numGroupsZ); GLCHECK_ERRORS(); } void IContext::memoryBarrier(GLbitfield barriers) { if (memoryBarrierProc_ == nullptr) { if (deviceFeatureSet_.hasInternalRequirement(InternalRequirement::ShaderImageLoadStoreExtReq)) { if (deviceFeatureSet_.hasExtension(Extensions::ShaderImageLoadStore)) { memoryBarrierProc_ = iglMemoryBarrierEXT; } } else if (deviceFeatureSet_.hasInternalFeature(InternalFeatures::ShaderImageLoadStore)) { memoryBarrierProc_ = iglMemoryBarrier; } IGL_DEBUG_ASSERT(memoryBarrierProc_, "No supported function for glMemoryBarrier\n"); } APILOG("glMemoryBarrier(0x%x [%s]) %s\n", barriers, GL_MEMORY_BARRIER_BITS_TO_STRING(barriers), affectedMemoryBarrierObjects(barriers).c_str()); GLCALL_PROC(memoryBarrierProc_, barriers); GLCHECK_ERRORS(); } void IContext::vertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr) { #if IGL_API_LOG GLuint unboundBuffer = 0; if (index < boundAttributes_.size()) { unboundBuffer = boundAttributes_[index]; boundAttributes_[index] = ptr == nullptr ? boundBuffer(GL_ARRAY_BUFFER) : 0; } #endif APILOG("glVertexAttribPointer(%u, %d, %s, %s, %u, %p) unbound (buffer: %u) bound (buffer: %u)\n", index, size, GL_ENUM_TO_STRING(type), GL_BOOL_TO_STRING(normalized), stride, ptr, unboundBuffer, ptr == nullptr ? boundBuffer(GL_ARRAY_BUFFER) : 0); GLCALL(VertexAttribPointer)(index, size, type, normalized, stride, ptr); GLCHECK_ERRORS(); } void IContext::vertexAttribDivisor(GLuint index, GLuint divisor) { if (vertexAttribDivisorProc_ == nullptr) { if (deviceFeatureSet_.hasInternalRequirement(InternalRequirement::VertexAttribDivisorExtReq)) { if (deviceFeatureSet_.hasExtension(Extensions::VertexAttribDivisor)) { vertexAttribDivisorProc_ = iglVertexAttribDivisorNV; } } else if (deviceFeatureSet_.hasInternalFeature(InternalFeatures::VertexAttribDivisor)) { vertexAttribDivisorProc_ = iglVertexAttribDivisor; } IGL_DEBUG_ASSERT(vertexAttribDivisorProc_, "No supported function for glVertexAttribDivisor\n"); } APILOG("glVertexAttribDivisor(%u, %u) (buffer: %u)\n", index, divisor, index < boundAttributes_.size() ? boundAttributes_[index] : 0); GLCALL_PROC(vertexAttribDivisorProc_, index, divisor); GLCHECK_ERRORS(); } Result IContext::getLastError() const { return GL_ERROR_TO_RESULT(lastError_); } GLenum IContext::checkForErrors(IGL_MAYBE_UNUSED const char* callerName, IGL_MAYBE_UNUSED size_t lineNum) const { lastError_ = getError(); #if IGL_DEBUG && !IGL_API_LOG static bool gettingMessageLog = false; // Used to avoid recursive entry if (lastError_ != GL_NO_ERROR && !gettingMessageLog && deviceFeatureSet_.hasInternalFeature(InternalFeatures::DebugMessageCallback)) { GLint numMessages = 0; getIntegerv(GL_DEBUG_LOGGED_MESSAGES, &numMessages); for (GLint i = 0; i < numMessages; ++i) { GLint messageLength = 0; getIntegerv(GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH, &messageLength); std::vector messageBuffer(messageLength); GLenum source = 0, type = 0, severity = 0; GLuint id = 0; GLsizei length = 0; gettingMessageLog = true; IGL_SCOPE_EXIT { gettingMessageLog = false; }; const GLuint count = getDebugMessageLog( 1, messageLength, &source, &type, &id, &severity, &length, messageBuffer.data()); if (IGL_DEBUG_VERIFY(count == 1)) { logDebugMessage(source, type, id, severity, length, messageBuffer.data()); } } } #endif // IGL_DEBUG && !IGL_API_LOG GL_ASSERT_ERROR(lastError_ == GL_NO_ERROR, callerName, lineNum, lastError_); return lastError_; } // This function has no effect in release mode because the current thinking // is there will be no need to call glGetError() after each GL call void IContext::enableAutomaticErrorCheck(bool enable) { #if IGL_DEBUG alwaysCheckError_ = enable; #endif } /** Returns current `callCounter_` value. Exposed for testing only. */ unsigned int IContext::getCallCount() const { return callCounter_; } unsigned int IContext::getCurrentDrawCount() const { return drawCallCount_; } unsigned int IContext::getShaderCompilationCount() const { return shaderCompilationCount_; } void IContext::resetCounters() { callCounter_ = 0; } bool IContext::addRef() { const bool ret = isLikelyValidObject(); if (ret) { ++refCount_; } return ret; } bool IContext::releaseRef() { const bool ret = isLikelyValidObject(); if (ret) { --refCount_; } return ret; } UnbindPolicy IContext::getUnbindPolicy() const { return unbindPolicy_; } void IContext::setUnbindPolicy(UnbindPolicy newValue) { unbindPolicy_ = newValue; } void IContext::initialize(Result* result) { setCurrent(); if (!isCurrentContext()) { Result::setResult(result, Result::Code::ArgumentInvalid, "Invalid context, setCurrent failed."); return; } GLVersion glVersion = GLVersion::NotAvailable; const char* version = (char*)getString(GL_VERSION); if (version == nullptr) { IGL_LOG_ERROR("Unable to get GL version string\n"); Result::setResult(result, Result::Code::RuntimeError, "Unable to get GL version string\n"); glVersion = DeviceFeatureSet::usesOpenGLES() ? GLVersion::v2_0_ES : GLVersion::v2_0; } else { glVersion = ::igl::opengl::getGLVersion(version); if (glVersion == GLVersion::NotAvailable) { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); Result::setResult(result, Result::Code::RuntimeError, "Unable to get GL version\n"); } } deviceFeatureSet_.initializeVersion(glVersion); std::string extensions; std::unordered_set supportedExtensions; if (!deviceFeatureSet_.hasInternalFeature(InternalFeatures::GetStringi)) { const GLubyte* extensionStr = getString(GL_EXTENSIONS); // If setCurrent() fails, then extensions may be nullptr. if (extensionStr) { extensions = std::string((char*)extensionStr); } } else { GLint n = 0; getIntegerv(GL_NUM_EXTENSIONS, &n); if (IGL_DEBUG_VERIFY(n >= 0)) { for (GLuint i = 0; i < static_cast(n); i++) { const auto* ext = reinterpret_cast(getStringi(GL_EXTENSIONS, i)); if (ext) { supportedExtensions.insert(ext); } } } } #if IGL_LOGGING_ENABLED IGL_LOG_INFO("GL Context Initialized: %p\n", this); IGL_LOG_INFO("GL Version: %s\n", version); const char* vendor = (char*)getString(GL_VENDOR); IGL_LOG_INFO("GL Vendor: %s\n", (vendor != nullptr) ? vendor : "(null)"); const char* renderer = (char*)getString(GL_RENDERER); IGL_LOG_INFO("GL Renderer: %s\n", (renderer != nullptr) ? renderer : "(null)"); if (!extensions.empty() || supportedExtensions.empty()) { IGL_LOG_INFO("GL Extensions: %s\n", extensions.c_str()); } else { std::vector sortedExtensions(supportedExtensions.begin(), supportedExtensions.end()); std::sort(sortedExtensions.begin(), sortedExtensions.end()); IGL_LOG_INFO("GL Extensions:\n"); for (const auto& extension : sortedExtensions) { IGL_LOG_INFO("- %s\n", extension.c_str()); } } #endif deviceFeatureSet_.initializeExtensions(std::move(extensions), std::move(supportedExtensions)); if (deviceFeatureSet_.hasInternalFeature(InternalFeatures::SeamlessCubeMap)) { enable(GL_TEXTURE_CUBE_MAP_SEAMLESS); } #if IGL_DEBUG || IGL_API_LOG if (deviceFeatureSet_.hasInternalFeature(InternalFeatures::DebugMessageCallback)) { enable(GL_DEBUG_OUTPUT); #if IGL_API_LOG debugMessageCallback(logOpenGlDebugMessage, nullptr); #endif // IGL_API_LOG } #endif // IGL_DEBUG || IGL_API_LOG #if defined(IGL_WITH_TRACY_GPU) [[maybe_unused]] constexpr std::string_view kTracyContextName = "IGL OpenGL"; TracyGpuContext; TracyGpuContextName(kTracyContextName.data(), kTracyContextName.size()); #endif } const DeviceFeatureSet& IContext::deviceFeatures() const { return deviceFeatureSet_; } void IContext::apiLogNextNDraws(const unsigned int n) { apiLogDrawsLeft_ = n; } void IContext::apiLogStart() { apiLogEnabled_ = true; } void IContext::apiLogEnd() { apiLogEnabled_ = false; } void IContext::setShouldValidateShaders(bool shouldValidateShaders) { shouldValidateShaders_ = shouldValidateShaders; } bool IContext::shouldValidateShaders() const { return shouldValidateShaders_; } void IContext::SynchronizedDeletionQueues::flushDeletionQueue(IContext& context) { if (IGL_DEBUG_VERIFY(context.isCurrentContext() || context.isCurrentSharegroup())) { swapScratchDeletionQueues(); if (!scratchBuffersQueue_.empty()) { context.deleteBuffers(static_cast(scratchBuffersQueue_.size()), scratchBuffersQueue_.data()); scratchBuffersQueue_.clear(); } for (auto i : scratchUnbindBuffersQueue_) { context.bindBuffer(i, 0); } scratchUnbindBuffersQueue_.clear(); if (!scratchFramebuffersQueue_.empty()) { context.deleteFramebuffers(static_cast(scratchFramebuffersQueue_.size()), scratchFramebuffersQueue_.data()); scratchFramebuffersQueue_.clear(); } if (!scratchRenderbuffersQueue_.empty()) { context.deleteRenderbuffers(static_cast(scratchRenderbuffersQueue_.size()), scratchRenderbuffersQueue_.data()); scratchRenderbuffersQueue_.clear(); } if (!scratchVertexArraysQueue_.empty()) { context.deleteVertexArrays(static_cast(scratchVertexArraysQueue_.size()), scratchVertexArraysQueue_.data()); scratchVertexArraysQueue_.clear(); } for (auto i : scratchProgramQueue_) { context.deleteProgram(i); } scratchProgramQueue_.clear(); for (auto i : scratchShaderQueue_) { context.deleteShader(i); } scratchShaderQueue_.clear(); if (!scratchTexturesQueue_.empty()) { context.deleteTextures(static_cast(scratchTexturesQueue_.size()), scratchTexturesQueue_.data()); scratchTexturesQueue_.clear(); } } } void IContext::SynchronizedDeletionQueues::swapScratchDeletionQueues() { const std::lock_guard guard(deletionQueueMutex_); std::swap(scratchBuffersQueue_, buffersQueue_); std::swap(scratchUnbindBuffersQueue_, unbindBuffersQueue_); std::swap(scratchFramebuffersQueue_, framebuffersQueue_); std::swap(scratchRenderbuffersQueue_, renderbuffersQueue_); std::swap(scratchVertexArraysQueue_, vertexArraysQueue_); std::swap(scratchProgramQueue_, programQueue_); std::swap(scratchShaderQueue_, shaderQueue_); std::swap(scratchTexturesQueue_, texturesQueue_); } void IContext::SynchronizedDeletionQueues::queueDeleteBuffers(GLsizei n, const GLuint* buffers) { const std::lock_guard guard(deletionQueueMutex_); for (GLsizei i = 0; i < n; ++i) { buffersQueue_.push_back(buffers[i]); } } void IContext::SynchronizedDeletionQueues::queueUnbindBuffer(GLenum target) { const std::lock_guard guard(deletionQueueMutex_); unbindBuffersQueue_.insert(target); } void IContext::SynchronizedDeletionQueues::queueDeleteFramebuffers(GLsizei n, const GLuint* framebuffers) { const std::lock_guard guard(deletionQueueMutex_); for (GLsizei i = 0; i < n; ++i) { framebuffersQueue_.push_back(framebuffers[i]); } } void IContext::SynchronizedDeletionQueues::queueDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers) { const std::lock_guard guard(deletionQueueMutex_); for (GLsizei i = 0; i < n; ++i) { renderbuffersQueue_.push_back(renderbuffers[i]); } } void IContext::SynchronizedDeletionQueues::queueDeleteVertexArrays(GLsizei n, const GLuint* vertexArrays) { const std::lock_guard guard(deletionQueueMutex_); for (GLsizei i = 0; i < n; ++i) { vertexArraysQueue_.push_back(vertexArrays[i]); } } void IContext::SynchronizedDeletionQueues::queueDeleteProgram(GLuint program) { const std::lock_guard guard(deletionQueueMutex_); programQueue_.push_back(program); } void IContext::SynchronizedDeletionQueues::queueDeleteShader(GLuint shaderId) { const std::lock_guard guard(deletionQueueMutex_); shaderQueue_.push_back(shaderId); } void IContext::SynchronizedDeletionQueues::queueDeleteTextures(GLsizei n, const GLuint* textures) { const std::lock_guard guard(deletionQueueMutex_); for (GLsizei i = 0; i < n; ++i) { texturesQueue_.push_back(textures[i]); } } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/IContext.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace igl::opengl { /// /// Represents an pure abstract class that encapsulates in it an OpenGL context. /// Individual types that implement this class are the ones that provide implementation /// for a concrete OpenGL API implementation. /// class IContext { public: virtual void setCurrent() = 0; virtual void clearCurrentContext() const = 0; virtual bool isCurrentContext() const = 0; virtual bool isCurrentSharegroup() const = 0; virtual void present(std::shared_ptr surface) const = 0; virtual std::unique_ptr createShareContext(Result* IGL_NULLABLE outResult) = 0; IContext(); virtual ~IContext(); void flushDeletionQueue(); protected: bool shouldQueueAPI() const; public: ///-------------------------------------- /// MARK: - GL APIs void activeTexture(GLenum texture); void attachShader(GLuint program, GLuint shader); void bindBuffer(GLenum target, GLuint buffer); void bindBufferBase(GLenum target, GLuint index, GLuint buffer); void bindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); void bindFramebuffer(GLenum target, GLuint framebuffer); void bindRenderbuffer(GLenum target, GLuint renderbuffer); void bindTexture(GLenum target, GLuint texture); void bindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); void bindVertexArray(GLuint vao); void blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); void blendEquation(GLenum mode); void blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha); virtual void blendFunc(GLenum sfactor, GLenum dfactor); void blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); void blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); void bufferData(GLenum target, GLsizeiptr size, const GLvoid* IGL_NULLABLE data, GLenum usage); void bufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* IGL_NULLABLE data); virtual GLenum checkFramebufferStatus(GLenum target); void clear(GLbitfield mask); void clearBufferfv(GLenum buffer, GLint drawBuffer, const GLfloat* IGL_NULLABLE value); void clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); void clearDepthf(GLfloat depth); void clearStencil(GLint s); void colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); void compileShader(GLuint shader); void compressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* IGL_NULLABLE data); void compressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* IGL_NULLABLE data); void compressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid* IGL_NULLABLE data); void compressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* IGL_NULLABLE data); void copyBufferSubData(GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size); void copyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); void createMemoryObjects(GLsizei n, GLuint* IGL_NULLABLE objects); GLuint createProgram(); GLuint createShader(GLenum shaderType); virtual void cullFace(GLint mode); void debugMessageCallback(PFNIGLDEBUGPROC IGL_NULLABLE callback, const void* IGL_NULLABLE userParam); void debugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* IGL_NULLABLE buf); void deleteBuffers(GLsizei n, const GLuint* IGL_NULLABLE buffers); void deleteFramebuffers(GLsizei n, const GLuint* IGL_NULLABLE framebuffers); void deleteMemoryObjects(GLsizei n, const GLuint* IGL_NULLABLE objects); void deleteRenderbuffers(GLsizei n, const GLuint* IGL_NULLABLE renderbuffers); void deleteVertexArrays(GLsizei n, const GLuint* IGL_NULLABLE vertexArrays); void deleteProgram(GLuint program); void deleteShader(GLuint shaderId); void deleteSync(GLsync IGL_NULLABLE sync); void deleteTextures(GLsizei n, const GLuint* IGL_NULLABLE textures); void depthFunc(GLenum func); void depthMask(GLboolean flag); void depthRangef(GLfloat n, GLfloat f); void detachShader(GLuint program, GLuint shader); virtual void disable(GLenum cap); void disableVertexAttribArray(GLuint index); void drawArrays(GLenum mode, GLint first, GLsizei count); void drawArraysIndirect(GLenum mode, const GLvoid* IGL_NULLABLE indirect); void drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount); void drawBuffers(GLsizei n, GLenum* IGL_NULLABLE buffers); void drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* IGL_NULLABLE indices); void drawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* IGL_NULLABLE indices, GLsizei instancecount); void drawElementsIndirect(GLenum mode, GLenum type, const GLvoid* IGL_NULLABLE indirect); void multiDrawArraysIndirect(GLenum mode, const void* IGL_NULLABLE indirect, GLsizei drawcount, GLsizei stride); void multiDrawElementsIndirect(GLenum mode, GLenum type, const void* IGL_NULLABLE indirect, GLsizei drawcount, GLsizei stride); virtual void enable(GLenum cap); void enableVertexAttribArray(GLuint index); GLsync IGL_NULLABLE fenceSync(GLenum condition, GLbitfield flags); void finish(); void flush(); void framebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); void framebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); void framebufferTexture2DMultisample(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); void framebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); virtual void frontFace(GLenum mode); virtual void polygonFillMode(GLenum mode); void generateMipmap(GLenum target); void genBuffers(GLsizei n, GLuint* IGL_NULLABLE buffers); void genFramebuffers(GLsizei n, GLuint* IGL_NULLABLE framebuffers); void genRenderbuffers(GLsizei n, GLuint* IGL_NULLABLE renderbuffers); void genTextures(GLsizei n, GLuint* IGL_NULLABLE textures); void genVertexArrays(GLsizei n, GLuint* IGL_NULLABLE vertexArrays); void getActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* IGL_NULLABLE length, GLint* IGL_NULLABLE size, GLenum* IGL_NULLABLE type, GLchar* IGL_NULLABLE name) const; void getActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* IGL_NULLABLE length, GLint* IGL_NULLABLE size, GLenum* IGL_NULLABLE type, GLchar* IGL_NULLABLE name) const; void getActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* IGL_NULLABLE uniformIndices, GLenum pname, GLint* IGL_NULLABLE params) const; void getActiveUniformBlockiv(GLuint program, GLuint index, GLenum pname, GLint* IGL_NULLABLE params) const; void getActiveUniformBlockName(GLuint program, GLuint index, GLsizei bufSize, GLsizei* IGL_NULLABLE length, GLchar* IGL_NULLABLE uniformBlockName) const; GLint getAttribLocation(GLuint program, const GLchar* IGL_NULLABLE name) const; void getBooleanv(GLenum pname, GLboolean* IGL_NULLABLE params) const; void getBufferParameteriv(GLenum target, GLenum pname, GLint* IGL_NULLABLE params) const; GLuint getDebugMessageLog(GLuint count, GLsizei bufSize, GLenum* IGL_NULLABLE sources, GLenum* IGL_NULLABLE types, GLuint* IGL_NULLABLE ids, GLenum* IGL_NULLABLE severities, GLsizei* IGL_NULLABLE lengths, GLchar* IGL_NULLABLE messageLog) const; virtual GLenum getError() const; void getFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* IGL_NULLABLE params) const; void getIntegerv(GLenum pname, GLint* IGL_NULLABLE params) const; void getProgramiv(GLuint program, GLenum pname, GLint* IGL_NULLABLE params) const; void getProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint* IGL_NULLABLE params) const; void getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* IGL_NULLABLE length, GLchar* IGL_NULLABLE infolog) const; GLuint getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar* IGL_NULLABLE name) const; void getProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* IGL_NULLABLE props, GLsizei bufSize, GLsizei* IGL_NULLABLE length, GLint* IGL_NULLABLE params); void getProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei* IGL_NULLABLE length, char* IGL_NULLABLE name) const; void getShaderiv(GLuint shader, GLenum pname, GLint* IGL_NULLABLE params) const; void getShaderInfoLog(GLuint shader, GLsizei maxLength, GLsizei* IGL_NULLABLE length, GLchar* IGL_NULLABLE infoLog) const; virtual const GLubyte* IGL_NULLABLE getString(GLenum name) const; virtual const GLubyte* IGL_NULLABLE getStringi(GLenum name, GLuint index) const; void getSynciv(GLsync IGL_NULLABLE sync, GLenum pname, GLsizei bufSize, GLsizei* IGL_NULLABLE length, GLint* IGL_NULLABLE values) const; void getUniformiv(GLuint program, GLint location, GLint* IGL_NULLABLE params) const; GLint getUniformLocation(GLuint program, const GLchar* IGL_NULLABLE name) const; void importMemoryFd(GLuint memory, GLuint64 size, GLenum handleType, GLint fd); void invalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* IGL_NULLABLE attachments); GLboolean isEnabled(GLenum cap); GLboolean isTexture(GLuint texture); void linkProgram(GLuint program); void* IGL_NULLABLE mapBuffer(GLenum target, GLenum access); void* IGL_NULLABLE mapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); void objectLabel(GLenum identifier, GLuint name, GLsizei length, const char* IGL_NULLABLE label); void pixelStorei(GLenum pname, GLint param); void polygonOffsetClamp(GLfloat factor, GLfloat units, float clamp); void popDebugGroup(); void pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar* IGL_NULLABLE message); void readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* IGL_NULLABLE pixels); void renderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); void renderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); void framebufferTextureMultiview(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); void framebufferTextureMultisampleMultiview(GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei samples, GLint baseViewIndex, GLsizei numViews); void scissor(GLint x, GLint y, GLsizei width, GLsizei height); virtual void setEnabled(bool shouldEnable, GLenum cap); void shaderSource(GLuint shader, GLsizei count, const GLchar * IGL_NULLABLE * IGL_NULLABLE string, const GLint* IGL_NULLABLE length); void stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask); void stencilMask(GLuint mask); void stencilMaskSeparate(GLenum face, GLuint mask); void stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass); void texStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); void texStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); void texStorageMem2D(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); void texStorageMem3D(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); void texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* IGL_NULLABLE data); void texImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* IGL_NULLABLE data); void texParameteri(GLenum target, GLenum pname, GLint param); void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid* IGL_NULLABLE pixels); void texSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* IGL_NULLABLE pixels); void uniform1f(GLint location, GLfloat x); void uniform1fv(GLint location, GLsizei count, const GLfloat* IGL_NULLABLE v); void uniform1i(GLint location, GLint x); void uniform1iv(GLint location, GLsizei count, const GLint* IGL_NULLABLE v); void uniform2f(GLint location, GLfloat x, GLfloat y); void uniform2fv(GLint location, GLsizei count, const GLfloat* IGL_NULLABLE v); void uniform2i(GLint location, GLint x, GLint y); void uniform2iv(GLint location, GLsizei count, const GLint* IGL_NULLABLE v); void uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z); void uniform3fv(GLint location, GLsizei count, const GLfloat* IGL_NULLABLE v); void uniform3i(GLint location, GLint x, GLint y, GLint z); void uniform3iv(GLint location, GLsizei count, const GLint* IGL_NULLABLE v); void uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); void uniform4fv(GLint location, GLsizei count, const GLfloat* IGL_NULLABLE v); void uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w); void uniform4iv(GLint location, GLsizei count, const GLint* IGL_NULLABLE v); void uniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); void uniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* IGL_NULLABLE value); void uniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* IGL_NULLABLE value); void uniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* IGL_NULLABLE value); void unmapBuffer(GLenum target); void useProgram(GLuint program); void validateProgram(GLuint program); void vertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* IGL_NULLABLE ptr); void vertexAttribDivisor(GLuint index, GLuint divisor); void viewport(GLint x, GLint y, GLsizei width, GLsizei height); void dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ); void memoryBarrier(GLbitfield barriers); GLuint64 getTextureHandle(GLuint texture); void makeTextureHandleResident(GLuint64 handle); void makeTextureHandleNonResident(GLuint64 handle); /** Returns current `callCounter_` value. Exposed for testing only. */ unsigned int getCallCount() const; unsigned int getCurrentDrawCount() const; unsigned int getShaderCompilationCount() const; // Utility functions [[nodiscard]] const DeviceFeatureSet& deviceFeatures() const; /// Calls bindBuffer(target, 0) or enqueues to run when deletion queue is /// flushed void unbindBuffer(GLenum target); // Log the next N frames void apiLogNextNDraws(unsigned int n); // Log everything between start() and end() void apiLogStart(); void apiLogEnd(); void setShouldValidateShaders(bool shouldValidateShaders); bool shouldValidateShaders() const; inline bool isDestructionAllowed() const { return lockCount_ == 0; } void resetCounters(); /** Manual reference counting. * In some cases, mostly for performance reasons, we hold unprotected * references to the IContext. When doing so, use the functions below to * signal such references so we can at least throw an error when those * references become invalid. */ // @fb-only bool addRef(); bool releaseRef(); // @fb-only /** * The goal here is to try to check whether 'this' is a valid object and not * a zombie. Ideally, this should be handled elsewhere, but until we solve * that more difficult problem we can at least provide reasonable error * messages to users. * * The idea is to set a specific chunk of memory within the object to a * known valid value in the constructor and clear it in the destructor. * Invoking this method on a valid object always returns true, and invoking * this method on a zombie pointer will simply check that memory offset from * the base pointer and most likely return false, unless that memory happens * to match our not-so-secret pattern. */ bool isLikelyValidObject() const { return zombieGuard_ == kNotAZombie; } virtual bool eglSupportssRGB() { return true; // we don't have egl so assume support is good. } public: UnbindPolicy getUnbindPolicy() const; /** Sets unbind policy for *subsequent* scopes/render passes. * * For example, only new instances of RenderCommandEncoder will honor the * new unbind policy. Previous instances, on the other hand, use the policy * that was in place when they were created. Similarly, the Device's unbind * policy will not change until the next beginScope(). */ void setUnbindPolicy(UnbindPolicy newValue); /** Enables or Disables calling getError() after GL call * This check is enabled by defaults in debug mode, and this function can be * used to turn it off. In release mode, the option is hard coded to false * and this function has no effect. */ void enableAutomaticErrorCheck(bool enable); // Manages an adapter pool as recreating this every frame causes unwanted // memory allocations. // @fb-only // @fb-only auto& getAdapterPool() { return renderAdapterPool_; } auto& getComputeAdapterPool() { return computeAdapterPool_; } // Called to check if the last OGL call resulted in an error. GLenum checkForErrors(const char* IGL_NULLABLE callerName, size_t lineNum) const; Result getLastError() const; public: mutable Pool bindGroupBuffersPool; mutable Pool bindGroupTexturesPool; protected: static std::unordered_map& getExistingContexts(); static void registerContext(void* IGL_NULLABLE glContext, IContext* IGL_NULLABLE context); static void unregisterContext(void* IGL_NULLABLE glContext); void initialize(Result* IGL_NULLABLE result = nullptr); void willDestroy(void* IGL_NULLABLE glContext); private: bool alwaysCheckError_ = false; // TRUE to check error after each OGL call mutable GLenum lastError_ = GL_NO_ERROR; mutable unsigned int callCounter_ = 0; std::atomic drawCallCount_{0}; std::atomic shaderCompilationCount_{0}; int lockCount_ = 0; // used by DestructionGuard int refCount_ = 0; // used by addRef/releaseRef bool shouldValidateShaders_ = false; // API Logging unsigned int apiLogDrawsLeft_ = 0; bool apiLogEnabled_ = IGL_API_LOG != 0; #if IGL_API_LOG void setBoundTexture(GLenum target, GLuint texture); GLuint boundTexture(GLenum target) const; GLuint boundTexture2D_ = 0; GLuint boundTexture3D_ = 0; GLuint boundTextureCubeMap_ = 0; GLuint boundTexture2DArray_ = 0; GLuint boundTextureExternalOes_ = 0; void setBoundBuffer(GLenum target, GLuint buffer); GLuint boundBuffer(GLenum target) const; GLuint boundArrayBuffer_ = 0; GLuint boundCopyReadBuffer_ = 0; GLuint boundCopyWriteBuffer_ = 0; GLuint boundDrawIndirectBuffer_ = 0; GLuint boundElementArrayBuffer_ = 0; GLuint boundPixelPackBuffer_ = 0; GLuint boundPixelUnpackBuffer_ = 0; GLuint boundShaderStorageBuffer_ = 0; GLuint boundUniformBuffer_ = 0; GLuint boundVao_ = 0; GLuint boundRenderbuffer_ = 0; void setBoundFramebuffer(GLenum target, GLuint framebuffer); GLuint boundFramebuffer(GLenum target) const; void setFramebufferAttachment(GLenum target, GLenum attachment, bool isRenderbuffer, GLuint object); const char* framebufferAttachmentType(GLenum target, GLenum attachment) const; const char* framebufferAttachmentType(GLenum target, GLenum buffer, GLint drawbuffer) const; GLuint framebufferAttachment(GLenum target, GLenum attachment) const; GLuint framebufferAttachment(GLenum target, GLenum buffer, GLint drawbuffer) const; const char* framebufferReadBufferType(GLenum target) const; GLuint framebufferReadBuffer(GLenum target) const; std::string affectedFramebufferAttachments(GLenum target, GLbitfield mask) const; std::string boundFramebufferAttachments(GLenum target) const; GLuint boundReadFramebuffer_ = 0; GLuint boundWriteFramebuffer_ = 0; struct FramebufferAttachment { std::array colorAttachment{}; std::bitset<32> colorIsRenderbuffer; GLuint depthAttachment = 0; bool depthIsRenderbuffer = false; GLuint stencilAttachment = 0; bool stencilIsRenderbuffer = false; uint32_t readBufferIndex = 0; }; std::unordered_map framebufferAttachments_; std::string boundDrawBuffers() const; std::bitset<32> enabledAttributes_; std::array boundAttributes_{}; std::string boundImageTextures() const; std::string boundDrawTextures() const; GLuint activeTextureUnit_ = 0; std::array boundDrawTextures_{}; std::array boundImageTextures_{}; GLuint boundProgram_ = 0; struct ProgramUniform { GLenum type; bool isTexture = false; bool isImage = false; }; mutable std::unordered_map> programUniforms_; mutable std::unordered_map> programUniformsByLocation_; mutable std::unordered_map> programUbosByIndex_; mutable std::unordered_map> programUbosByLocation_; mutable std::unordered_map> programSsbosByIndex_; mutable std::unordered_map> programSsbosByLocation_; std::array boundSsbos_{}; std::array boundUbos_{}; void addProgramUniform(GLuint program, GLsizei* length, GLenum* type, GLchar* name) const; void setProgramUniformLocation(GLuint program, const GLchar* name, GLint location) const; void setProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar* name, GLuint index) const; std::string boundUniformTexture(GLuint program, GLint location, GLint unit) const; std::string boundBufferName(GLuint program, GLenum target, GLuint index) const; void setBoundBufferByIndex(GLenum target, GLuint index, GLuint buffer); GLuint boundBufferByIndex(GLenum target, GLuint index) const; std::string boundBuffersByIndex(bool ssbos = true, bool ubos = true) const; bool lastCommandWasCompute_ = false; std::string identifierLabel(GLuint identifier, GLuint name) const; std::string affectedMemoryBarrierObjects(GLbitfield bits) const; #endif PFNIGLBINDIMAGETEXTUREPROC IGL_NULLABLE bindImageTexturerProc_ = nullptr; PFNIGLBINDVERTEXARRAYPROC IGL_NULLABLE bindVertexArrayProc_ = nullptr; PFNIGLBLITFRAMEBUFFERPROC IGL_NULLABLE blitFramebufferProc_ = nullptr; PFNIGLCLEARDEPTHFPROC IGL_NULLABLE clearDepthfProc_ = nullptr; PFNIGLCOMPRESSEDTEXIMAGE3DPROC IGL_NULLABLE compressedTexImage3DProc_ = nullptr; PFNIGLCOMPRESSEDTEXSUBIMAGE3DPROC IGL_NULLABLE compressedTexSubImage3DProc_ = nullptr; PFNIGLDEBUGMESSAGECALLBACKPROC IGL_NULLABLE debugMessageCallbackProc_ = nullptr; PFNIGLDEBUGMESSAGEINSERTPROC IGL_NULLABLE debugMessageInsertProc_ = nullptr; PFNIGLDELETESYNCPROC IGL_NULLABLE deleteSyncProc_ = nullptr; PFNIGLDELETEVERTEXARRAYSPROC IGL_NULLABLE deleteVertexArraysProc_ = nullptr; PFNIGLDRAWBUFFERSPROC IGL_NULLABLE drawBuffersProc_ = nullptr; PFNIGLFENCESYNCPROC IGL_NULLABLE fenceSyncProc_ = nullptr; PFNIGLFRAMEBUFFERTEXTURE2DMULTISAMPLEPROC IGL_NULLABLE framebufferTexture2DMultisampleProc_ = nullptr; PFNIGLINVALIDATEFRAMEBUFFERPROC IGL_NULLABLE invalidateFramebufferProc_ = nullptr; PFNIGLGENVERTEXARRAYSPROC IGL_NULLABLE genVertexArraysProc_ = nullptr; mutable PFNIGLGETDEBUGMESSAGELOGPROC IGL_NULLABLE getDebugMessageLogProc_ = nullptr; mutable PFNIGLGETSYNCIVPROC IGL_NULLABLE getSyncivProc_ = nullptr; PFNIGLGETTEXTUREHANDLEPROC IGL_NULLABLE getTextureHandleProc_ = nullptr; PFNIGLMAKETEXTUREHANDLERESIDENTPROC IGL_NULLABLE makeTextureHandleResidentProc_ = nullptr; PFNIGLMAKETEXTUREHANDLENONRESIDENTPROC IGL_NULLABLE makeTextureHandleNonResidentProc_ = nullptr; PFNIGLMAPBUFFERPROC IGL_NULLABLE mapBufferProc_ = nullptr; PFNIGLMAPBUFFERRANGEPROC IGL_NULLABLE mapBufferRangeProc_ = nullptr; PFNIGLMEMORYBARRIERPROC IGL_NULLABLE memoryBarrierProc_ = nullptr; PFNIGLOBJECTLABELPROC IGL_NULLABLE objectLabelProc_ = nullptr; PFNIGLPOPDEBUGGROUPPROC IGL_NULLABLE popDebugGroupProc_ = nullptr; PFNIGLPUSHDEBUGGROUPPROC IGL_NULLABLE pushDebugGroupProc_ = nullptr; PFNIGLRENDERBUFFERSTORAGEMULTISAMPLEPROC IGL_NULLABLE renderbufferStorageMultisampleProc_ = nullptr; PFNIGLTEXIMAGE3DPROC IGL_NULLABLE texImage3DProc_ = nullptr; PFNIGLTEXSTORAGE1DPROC IGL_NULLABLE texStorage1DProc_ = nullptr; PFNIGLTEXSTORAGE2DPROC IGL_NULLABLE texStorage2DProc_ = nullptr; PFNIGLTEXSTORAGE3DPROC IGL_NULLABLE texStorage3DProc_ = nullptr; PFNIGLTEXSUBIMAGE3DPROC IGL_NULLABLE texSubImage3DProc_ = nullptr; PFNIGLUNMAPBUFFERPROC IGL_NULLABLE unmapBufferProc_ = nullptr; PFNIGLVERTEXATTRIBDIVISORPROC IGL_NULLABLE vertexAttribDivisorProc_ = nullptr; /// Responsible for holding onto operations queued for deletion when not in /// context. All operations to non-scratch queues are suyncronized by one /// mutex struct SynchronizedDeletionQueues { public: void flushDeletionQueue(IContext& context); void queueDeleteBuffers(GLsizei n, const GLuint* IGL_NULLABLE buffers); void queueUnbindBuffer(GLenum target); void queueDeleteFramebuffers(GLsizei n, const GLuint* IGL_NULLABLE framebuffers); void queueDeleteRenderbuffers(GLsizei n, const GLuint* IGL_NULLABLE renderbuffers); void queueDeleteVertexArrays(GLsizei n, const GLuint* IGL_NULLABLE vertexArrays); void queueDeleteProgram(GLuint program); void queueDeleteShader(GLuint shaderId); void queueDeleteTextures(GLsizei n, const GLuint* IGL_NULLABLE textures); private: /// This is called by flushDeletionQueue to swap fooQueue w/ /// scratchFooQueue void swapScratchDeletionQueues(); // These are swapped with the main queues then read to perform operations. // They can be read from flushDeletionQueue w/o synchronization. std::vector scratchBuffersQueue_; std::unordered_set scratchUnbindBuffersQueue_; std::vector scratchFramebuffersQueue_; std::vector scratchRenderbuffersQueue_; std::vector scratchVertexArraysQueue_; std::vector scratchProgramQueue_; std::vector scratchShaderQueue_; std::vector scratchTexturesQueue_; // Guards all the non-scratch queues. std::mutex deletionQueueMutex_; // Resources queued for deletion std::vector buffersQueue_; // These are the targets for the buffers that we enqueued for deletion // that we need to unbind std::unordered_set unbindBuffersQueue_; std::vector framebuffersQueue_; std::vector renderbuffersQueue_; std::vector vertexArraysQueue_; std::vector programQueue_; std::vector shaderQueue_; std::vector texturesQueue_; }; SynchronizedDeletionQueues deletionQueues_; UnbindPolicy unbindPolicy_ = UnbindPolicy::Default; void getGLMajorAndMinorVersions(GLint& majorVersion, GLint& minorVersion) const; void getGlMajorAndMinorVersions(GLint& majorVersion, GLint& minorVersion) const; friend class DestructionGuard; std::vector> renderAdapterPool_; std::vector> computeAdapterPool_; DeviceFeatureSet deviceFeatureSet_; // For framebufferTexture2DMultisample GLint maxSamples_ = -1; GLint maxDebugStackSize_ = -1; GLint debugStackSize_ = 0; static constexpr uint64_t kNotAZombie = 0xdeadc0def3315badLL; uint64_t zombieGuard_ = kNotAZombie; }; } // namespace igl::opengl ================================================ FILE: src/igl/opengl/PlatformDevice.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include namespace igl::opengl { std::shared_ptr PlatformDevice::createFramebuffer(const FramebufferDesc& desc, Result* outResult) const { auto resource = std::make_shared(getContext()); resource->initialize(desc, outResult); if (auto resourceTracker = owner_.getResourceTracker()) { resource->initResourceTracker(std::move(resourceTracker), desc.debugName); } return resource; } std::shared_ptr PlatformDevice::createCurrentFramebuffer() const { auto resource = std::make_shared(getContext()); if (auto resourceTracker = owner_.getResourceTracker()) { resource->initResourceTracker(std::move(resourceTracker)); } return resource; } // NOLINTBEGIN(bugprone-easily-swappable-parameters) std::unique_ptr PlatformDevice::createTextureBufferExternal( GLuint textureID, GLenum target, TextureDesc::TextureUsage usage, GLsizei width, GLsizei height, TextureFormat format, GLsizei numLayers) const { // NOLINTEND(bugprone-easily-swappable-parameters) auto textureBuffer = std::make_unique(getContext(), format, usage); textureBuffer->setTextureBufferProperties(textureID, target); textureBuffer->setTextureProperties(width, height, numLayers); if (auto resourceTracker = owner_.getResourceTracker()) { textureBuffer->initResourceTracker(std::move(resourceTracker)); } return textureBuffer; } DestructionGuard PlatformDevice::getDestructionGuard() const { return {owner_.getSharedContext()}; } IContext& PlatformDevice::getContext() const { return owner_.getContext(); } const std::shared_ptr& PlatformDevice::getSharedContext() const { return owner_.getSharedContext(); } void PlatformDevice::blitFramebuffer(const std::shared_ptr& src, int srcLeft, int srcTop, int srcRight, int srcBottom, const std::shared_ptr& dst, int dstLeft, int dstTop, int dstRight, int dstBottom, GLbitfield mask, IContext& ctx, Result* outResult) { auto& from = static_cast(*src); auto& to = static_cast(*dst); #if IGL_DEBUG_ABORT_ENABLED // Guard against depth/stencil type mismatch: // GL_INVALID_OPERATION is generated if mask contains GL_DEPTH_BUFFER_BIT or GL_STENCIL_BUFFER_BIT // and the source and destination depth and stencil formats do not match. if (mask & GL_DEPTH_BUFFER_BIT) { auto srcDepthTexture = src->getDepthAttachment(); auto dstDepthTexture = dst->getDepthAttachment(); if ((!srcDepthTexture && dstDepthTexture) || (srcDepthTexture && !dstDepthTexture)) { IGL_DEBUG_ABORT( "PlatformDevice::blitFramebuffer: One framebuffer has depth attachment and " "the other doesn't.\n"); } if (srcDepthTexture && dstDepthTexture) { const GLenum srcFormat = static_cast(srcDepthTexture.get())->getGLInternalTextureFormat(); const GLenum dstFormat = static_cast(dstDepthTexture.get())->getGLInternalTextureFormat(); if (srcFormat != dstFormat) { IGL_DEBUG_ABORT( "PlatformDevice::blitFramebuffer: Mismatch of framebuffer depth attachment " "formats: %d vs %d\n", srcFormat, dstFormat); } } } if (mask & GL_STENCIL_BUFFER_BIT) { auto srcStencilTexture = src->getStencilAttachment(); auto dstStencilTexture = dst->getStencilAttachment(); if ((!srcStencilTexture && dstStencilTexture) || (srcStencilTexture && !dstStencilTexture)) { IGL_DEBUG_ABORT( "PlatformDevice::blitFramebuffer: One framebuffer has stencil attachment and " "the other doesn't.\n"); } if (srcStencilTexture && dstStencilTexture) { const GLenum srcFormat = static_cast(srcStencilTexture.get())->getGLInternalTextureFormat(); const GLenum dstFormat = static_cast(dstStencilTexture.get())->getGLInternalTextureFormat(); if (srcFormat != dstFormat) { IGL_DEBUG_ABORT( "PlatformDevice::blitFramebuffer: Mismatch of framebuffer stencil " "attachment formats: %d vs %d\n", srcFormat, dstFormat); } } } #endif if (ctx.deviceFeatures().hasInternalFeature(InternalFeatures::FramebufferBlit)) { const FramebufferBindingGuard guard(ctx); ctx.bindFramebuffer(GL_DRAW_FRAMEBUFFER, to.getId()); ctx.bindFramebuffer(GL_READ_FRAMEBUFFER, from.getId()); ctx.blitFramebuffer(srcLeft, srcTop, srcRight, srcBottom, dstLeft, dstTop, dstRight, dstBottom, mask, GL_NEAREST); Result::setResult(outResult, Result::Code::Ok); } else { Result::setResult(outResult, Result::Code::Unsupported); } } void PlatformDevice::blitFramebuffer(const std::shared_ptr& src, int srcLeft, int srcTop, int srcRight, int srcBottom, const std::shared_ptr& dst, int dstLeft, int dstTop, int dstRight, int dstBottom, GLbitfield mask, Result* outResult) const { auto ctx = getSharedContext(); igl::opengl::PlatformDevice::blitFramebuffer(src, srcLeft, srcTop, srcRight, srcBottom, dst, dstLeft, dstTop, dstRight, dstBottom, mask, *ctx, outResult); } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/PlatformDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include // IWYU pragma: keep namespace igl { class IFramebuffer; struct FramebufferDesc; namespace opengl { class DestructionGuard; class Device; class Framebuffer; class IContext; class TextureBufferExternal; /// opengl::PlatformDevice enables transitioning to IGL from legacy OpenGL code. /// /// It mimics IDevice's factory methods, but ensures the return types are the most-derived, /// OpenGL-specific versions of those types. For example, here are the accessors for frame buffer. /// opengl::PlatformDevice allows us to create the OpenGL-specific resource (opengl::Framebuffer) /// in a type-safe way (i.e. no unsafe downcasting by the caller): /// /// class IDevice { /// public: /// virtual shared_ptr createFramebuffer(); /// }; /// /// class opengl::PlatformDevice { /// public: /// shared_ptr createFramebuffer() override; // Note different return type /// }; /// /// When transitioning to IGL from OpenGL, we recommend you do so in 2 phases: /// /// 1. Use OpenGL-flavor of IGL resource, e.g. replace texture id's with igl::opengl::Texture. /// 2. Transition to pure IGL resources. Once IGL command buffers are adopted, use igl::ITexture /// instead of the OpenGL version. /// /// With PlatformDevice, refactoring between phase 1 and 2 becomes easier. For example, imagine /// we have the following struct that holds onto a device instance. In Phase 1, device_'s type is /// opengl::PlatformDevice; in Phase 2, the type is IDevice. /// /// struct RenderSession { /// // Phase 1 /// opengl::PlatformDevice* device_; // <=== [AA] /// /// // Phase 2: replace above with the following: /// // IDevice *device_; // <=== [BB] /// } /// /// We can write code like the following and easily change device_'s type between /// opengl::PlatformDevice and IDevice: /// /// auto framebuffer = device_ -> createFramebuffer(); /// /// To go from Phase 1 to Phase 2, we simply have to remove the line marked [AA] and /// uncomment the line marked [BB] — and that's it! /// /// In Phase 1, framebuffer's type is shared_ptr, so you can access the /// raw OpenGL framebuffer id. In Phase 2, framebuffer's type is shared_ptr; /// you are submitting GPU commands via IGL instead of via OpenGL. /// class PlatformDevice : public IPlatformDevice { public: static constexpr igl::PlatformDeviceType kType = igl::PlatformDeviceType::OpenGL; explicit PlatformDevice(Device& owner) : owner_(owner) {} std::shared_ptr createFramebuffer(const FramebufferDesc& desc, Result* outResult) const; [[nodiscard]] std::shared_ptr createCurrentFramebuffer() const; [[nodiscard]] std::unique_ptr createTextureBufferExternal( GLuint textureID, GLenum target, TextureDesc::TextureUsage usage, GLsizei width, GLsizei height, TextureFormat format, GLsizei numLayers = 1) const; [[nodiscard]] DestructionGuard getDestructionGuard() const; [[nodiscard]] IContext& getContext() const; [[nodiscard]] const std::shared_ptr& getSharedContext() const; void blitFramebuffer(const std::shared_ptr& src, int srcLeft, int srcTop, int srcRight, int srcBottom, const std::shared_ptr& dst, int dstLeft, int dstTop, int dstRight, int dstBottom, GLbitfield mask, Result* outResult) const; static void blitFramebuffer(const std::shared_ptr& src, int srcLeft, int srcTop, int srcRight, int srcBottom, const std::shared_ptr& dst, int dstLeft, int dstTop, int dstRight, int dstBottom, GLbitfield mask, IContext& ctx, Result* outResult); protected: [[nodiscard]] bool isType(PlatformDeviceType t) const noexcept override { return t == kType; } Device& owner_; }; } // namespace opengl } // namespace igl ================================================ FILE: src/igl/opengl/RenderCommandAdapter.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define SET_DIRTY(dirtyMap, index) dirtyMap.set(index) #define CLEAR_DIRTY(dirtyMap, index) dirtyMap.reset(index) #define IS_DIRTY(dirtyMap, index) dirtyMap[index] namespace igl::opengl { RenderCommandAdapter::RenderCommandAdapter(IContext& context) : WithContext(context), uniformAdapter_(UniformAdapter(context, UniformAdapter::PipelineType::Render)) { useVAO_ = context.deviceFeatures().hasInternalFeature(InternalFeatures::VertexArrayObject); if (useVAO_) { activeVAO_ = std::make_shared(getContext()); activeVAO_->create(); } } std::unique_ptr RenderCommandAdapter::create( IContext& context, const RenderPassDesc& renderPass, const std::shared_ptr& framebuffer, Result* outResult) { // NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks) std::unique_ptr newAdapter(new RenderCommandAdapter(context)); newAdapter->initialize(renderPass, framebuffer, outResult); return newAdapter; } void RenderCommandAdapter::initialize(const RenderPassDesc& renderPass, const std::shared_ptr& framebuffer, Result* outResult) { if (!IGL_DEBUG_VERIFY(framebuffer)) { Result::setResult(outResult, Result::Code::ArgumentNull, "framebuffer is null"); return; } if (activeVAO_) { if (!IGL_DEBUG_VERIFY(activeVAO_->isValid())) { Result::setResult(outResult, Result::Code::RuntimeError, "Vertex array object is invalid"); return; } activeVAO_->bind(); } const auto& openglFramebuffer = static_cast(*framebuffer); openglFramebuffer.bind(renderPass); auto viewport = openglFramebuffer.getViewport(); IGL_DEBUG_ASSERT(!(viewport.width < 0.f) && !(viewport.height < 0.f)); setViewport(viewport); Result::setOk(outResult); } void RenderCommandAdapter::setViewport(const Viewport& viewport) { getContext().viewport( (GLint)viewport.x, (GLint)viewport.y, (GLint)viewport.width, (GLint)viewport.height); } void RenderCommandAdapter::setScissorRect(const ScissorRect& rect) { const bool scissorEnabled = !rect.isNull(); getContext().setEnabled(scissorEnabled, GL_SCISSOR_TEST); if (scissorEnabled) { getContext().scissor(rect.x, rect.y, rect.width, rect.height); } } void RenderCommandAdapter::setDepthStencilState( const std::shared_ptr& newValue) { depthStencilState_ = newValue; setDirty(StateMask::DepthStencil); } void RenderCommandAdapter::setStencilReferenceValue(uint32_t value) { frontStencilReferenceValue_ = value; backStencilReferenceValue_ = value; setDirty(StateMask::DepthStencil); } void RenderCommandAdapter::setBlendColor(const Color& color) { getContext().blendColor(color.r, color.g, color.b, color.a); } void RenderCommandAdapter::setDepthBias(float depthBias, float slopeScale, float clamp) { getContext().setEnabled(true, GL_POLYGON_OFFSET_FILL); getContext().polygonOffsetClamp(slopeScale, depthBias, clamp); } void RenderCommandAdapter::clearVertexBuffers() { vertexBuffersDirty_.reset(); } void RenderCommandAdapter::setVertexBuffer(Buffer& buffer, size_t offset, size_t index, Result* outResult) { IGL_DEBUG_ASSERT(index < IGL_BUFFER_BINDINGS_MAX, "Buffer index is beyond max, may want to increase limit"); if (index < IGL_BUFFER_BINDINGS_MAX) { vertexBuffers_[index] = {&buffer, offset}; SET_DIRTY(vertexBuffersDirty_, index); Result::setOk(outResult); } else { Result::setResult(outResult, Result::Code::ArgumentInvalid); } } void RenderCommandAdapter::setIndexBuffer(Buffer& buffer) { bindBufferWithShaderStorageBufferOverride(buffer, GL_ELEMENT_ARRAY_BUFFER); } void RenderCommandAdapter::clearUniformBuffers() { uniformAdapter_.clearUniformBuffers(); } void RenderCommandAdapter::setUniform(const UniformDesc& uniformDesc, const void* data, Result* outResult) { uniformAdapter_.setUniform(uniformDesc, data, outResult); } void RenderCommandAdapter::setUniformBuffer(Buffer* buffer, size_t offset, size_t size, uint32_t index, Result* outResult) { uniformAdapter_.setUniformBuffer(buffer, offset, size, index, outResult); } void RenderCommandAdapter::clearVertexTexture() { vertexTextureStates_ = TextureStates(); vertexTextureStatesDirty_.reset(); } void RenderCommandAdapter::setVertexTexture(ITexture* texture, size_t index, Result* outResult) { if (!IGL_DEBUG_VERIFY(index < IGL_TEXTURE_SAMPLERS_MAX)) { Result::setResult(outResult, Result::Code::ArgumentInvalid); return; } if (vertexTextureStates_[index].first != texture) { vertexTextureStates_[index].first = texture; SET_DIRTY(vertexTextureStatesDirty_, index); } Result::setOk(outResult); } void RenderCommandAdapter::setVertexSamplerState(ISamplerState* samplerState, size_t index, Result* outResult) { if (!IGL_DEBUG_VERIFY(index < IGL_TEXTURE_SAMPLERS_MAX)) { Result::setResult(outResult, Result::Code::ArgumentInvalid); return; } if (vertexTextureStates_[index].second != samplerState) { vertexTextureStates_[index].second = samplerState; SET_DIRTY(vertexTextureStatesDirty_, index); } Result::setOk(outResult); } void RenderCommandAdapter::clearFragmentTexture() { fragmentTextureStates_ = TextureStates(); fragmentTextureStatesDirty_.reset(); } void RenderCommandAdapter::setFragmentTexture(ITexture* texture, size_t index, Result* outResult) { if (!IGL_DEBUG_VERIFY(index < IGL_TEXTURE_SAMPLERS_MAX)) { Result::setResult(outResult, Result::Code::ArgumentInvalid); return; } if (fragmentTextureStates_[index].first != texture) { fragmentTextureStates_[index].first = texture; SET_DIRTY(fragmentTextureStatesDirty_, index); } Result::setOk(outResult); } void RenderCommandAdapter::setFragmentSamplerState(ISamplerState* samplerState, size_t index, Result* outResult) { if (!IGL_DEBUG_VERIFY(index < IGL_TEXTURE_SAMPLERS_MAX)) { Result::setResult(outResult, Result::Code::ArgumentInvalid); return; } if (fragmentTextureStates_[index].second != samplerState) { fragmentTextureStates_[index].second = samplerState; SET_DIRTY(fragmentTextureStatesDirty_, index); } Result::setOk(outResult); } // When pipelineState is modified, all dependent resources are cleared void RenderCommandAdapter::clearDependentResources( const std::shared_ptr& newValue, Result* outResult) { auto* curStateOpenGL = static_cast(pipelineState_.get()); if (!IGL_DEBUG_VERIFY(curStateOpenGL)) { Result::setResult(outResult, Result::Code::RuntimeError, "pipeline state is null"); return; } auto* newStateOpenGL = static_cast(newValue.get()); if (!newStateOpenGL || !curStateOpenGL->matchesShaderProgram(*newStateOpenGL)) { // Don't use previously set resources. Uniforms/texture locations not same between programs uniformAdapter_.clearUniformBuffers(); clearVertexTexture(); clearFragmentTexture(); } if (curStateOpenGL && newStateOpenGL) { newStateOpenGL->savePrevPipelineStateAttributesLocations(*curStateOpenGL); } if (!newStateOpenGL || !curStateOpenGL->matchesVertexInputState(*newStateOpenGL)) { // Don't reuse previously set vertex buffers. clearVertexBuffers(); } Result::setOk(outResult); } void RenderCommandAdapter::setPipelineState(const std::shared_ptr& newValue, Result* outResult) { Result::setOk(outResult); if (pipelineState_) { clearDependentResources(newValue, outResult); // Only clear if pipeline state was previously set } pipelineState_ = newValue; setDirty(StateMask::PIPELINE); } void RenderCommandAdapter::drawArrays(GLenum mode, GLint first, GLsizei count) { willDraw(); getContext().drawArrays(toMockWireframeMode(mode), first, count); didDraw(); } void RenderCommandAdapter::drawArraysIndirect(GLenum mode, Buffer& indirectBuffer, const GLvoid* indirectBufferOffset) { willDraw(); if (getContext().deviceFeatures().hasInternalFeature(InternalFeatures::DrawArraysIndirect)) { bindBufferWithShaderStorageBufferOverride(indirectBuffer, GL_DRAW_INDIRECT_BUFFER); getContext().drawArraysIndirect(toMockWireframeMode(mode), indirectBufferOffset); } else { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } didDraw(); } void RenderCommandAdapter::drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount) { willDraw(); if (getContext().deviceFeatures().hasFeature(DeviceFeatures::DrawInstanced)) { getContext().drawArraysInstanced(toMockWireframeMode(mode), first, count, instancecount); } else { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } didDraw(); } void RenderCommandAdapter::drawElements(GLenum mode, GLsizei indexCount, GLenum indexType, const GLvoid* indexOffset) { willDraw(); getContext().drawElements(toMockWireframeMode(mode), indexCount, indexType, indexOffset); didDraw(); } void RenderCommandAdapter::drawElementsInstanced(GLenum mode, GLsizei indexCount, GLenum indexType, const GLvoid* indexOffset, GLsizei instancecount) { willDraw(); if (getContext().deviceFeatures().hasFeature(DeviceFeatures::DrawInstanced)) { getContext().drawElementsInstanced( toMockWireframeMode(mode), indexCount, indexType, indexOffset, instancecount); } else { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } didDraw(); } void RenderCommandAdapter::drawElementsIndirect(GLenum mode, GLenum indexType, Buffer& indirectBuffer, const GLvoid* indirectBufferOffset) { willDraw(); if (getContext().deviceFeatures().hasFeature(DeviceFeatures::DrawIndexedIndirect)) { bindBufferWithShaderStorageBufferOverride(indirectBuffer, GL_DRAW_INDIRECT_BUFFER); getContext().drawElementsIndirect(toMockWireframeMode(mode), indexType, indirectBufferOffset); } else { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } didDraw(); } void RenderCommandAdapter::multiDrawArraysIndirect(GLenum mode, Buffer& indirectBuffer, const GLvoid* indirectBufferOffset, GLsizei drawcount, GLsizei stride) { willDraw(); if (getContext().deviceFeatures().hasInternalFeature(InternalFeatures::MultiDrawIndirect)) { bindBufferWithShaderStorageBufferOverride(indirectBuffer, GL_DRAW_INDIRECT_BUFFER); getContext().multiDrawArraysIndirect( toMockWireframeMode(mode), indirectBufferOffset, drawcount, stride); } else { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } didDraw(); } void RenderCommandAdapter::multiDrawElementsIndirect(GLenum mode, GLenum indexType, Buffer& indirectBuffer, const GLvoid* indirectBufferOffset, GLsizei drawcount, GLsizei stride) { willDraw(); if (getContext().deviceFeatures().hasInternalFeature(InternalFeatures::MultiDrawIndirect)) { bindBufferWithShaderStorageBufferOverride(indirectBuffer, GL_DRAW_INDIRECT_BUFFER); getContext().multiDrawElementsIndirect( toMockWireframeMode(mode), indexType, indirectBufferOffset, drawcount, stride); } else { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } didDraw(); } void RenderCommandAdapter::endEncoding() { // Some minimal cleanup needs to occur in order. Otherwise, OpenGL can end in a bad state // with complex rendering. if (pipelineState_) { unbindVertexAttributes(); } pipelineState_ = nullptr; depthStencilState_ = nullptr; uniformAdapter_.shrinkUniformUsage(); uniformAdapter_.clearUniformBuffers(); vertexTextureStates_ = TextureStates(); fragmentTextureStates_ = TextureStates(); vertexBuffersDirty_.reset(); vertexTextureStatesDirty_.reset(); fragmentTextureStatesDirty_.reset(); dirtyStateBits_ = EnumToValue(StateMask::NONE); } void RenderCommandAdapter::willDraw() { Result ret; auto* pipelineState = static_cast(pipelineState_.get()); // Vertex Buffers must be bound before pipelineState->bind() if (pipelineState) { pipelineState->clearActiveAttributesLocations(); for (size_t bufferIndex = 0; bufferIndex < IGL_BUFFER_BINDINGS_MAX; ++bufferIndex) { if (IS_DIRTY(vertexBuffersDirty_, bufferIndex)) { auto& bufferState = vertexBuffers_[bufferIndex]; bindBufferWithShaderStorageBufferOverride((*bufferState.resource), GL_ARRAY_BUFFER); // now bind the vertex attributes corresponding to this vertex buffer pipelineState->bindVertexAttributes(bufferIndex, bufferState.offset); CLEAR_DIRTY(vertexBuffersDirty_, bufferIndex); } } pipelineState->unbindPrevPipelineVertexAttributes(); if (isDirty(StateMask::PIPELINE)) { pipelineState->bind(); clearDirty(StateMask::PIPELINE); } } auto* depthStencilState = static_cast(depthStencilState_.get()); if (depthStencilState && isDirty(StateMask::DepthStencil)) { depthStencilState->bind(frontStencilReferenceValue_, backStencilReferenceValue_); clearDirty(StateMask::DepthStencil); } // We store 2 parallel vectors (one for uniforms and one for uniform blocks) // that behave as a queue of uniforms waiting to be issued to the GPU. // These were set between the previous draw call and the current draw call. // At the end of the draw call, the queue can be treated as empty since we // don't need to re-issue them (they'll carry over to the next draw call unless // a subsequent uniform at the same location is bound). // // Various error-checking does _not_ happen in production, since this is the "inner loop": // // * Duplicate uniform and uniform block at same location (one in each vector) // * Duplicate uniforms in the vector with the same location (same for uniform blocks) // // These should be considered client bugs, so an assert fires in local dev builds. // this is actually compile time defined and doesn't change, cached these statically. static const size_t kVertexTextureStatesSize = vertexTextureStates_.size(); static const size_t kFragmentTextureStatesSize = fragmentTextureStates_.size(); if (pipelineState) { // Bind uniforms to be used for render uniformAdapter_.bindToPipeline(getContext()); for (size_t index = 0; index < kVertexTextureStatesSize; index++) { if (!IS_DIRTY(vertexTextureStatesDirty_, index)) { continue; } auto& textureState = vertexTextureStates_[index]; if (auto* texture = static_cast(textureState.first)) { if (IGL_DEBUG_VERIFY_NOT(texture == nullptr)) { continue; } ret = pipelineState->bindTextureUnit(index, igl::BindTarget::kVertex, *texture); if (!ret.isOk()) { IGL_LOG_INFO_ONCE(ret.message.c_str()); continue; } if (auto* samplerState = static_cast(textureState.second)) { samplerState->bind(texture); } CLEAR_DIRTY(vertexTextureStatesDirty_, index); } } for (size_t index = 0; index < kFragmentTextureStatesSize; index++) { if (!IS_DIRTY(fragmentTextureStatesDirty_, index)) { continue; } auto& textureState = fragmentTextureStates_[index]; if (auto* texture = static_cast(textureState.first)) { if (IGL_DEBUG_VERIFY_NOT(texture == nullptr)) { continue; } ret = pipelineState->bindTextureUnit(index, igl::BindTarget::kFragment, *texture); if (!ret.isOk()) { IGL_LOG_INFO_ONCE(ret.message.c_str()); continue; } if (auto* samplerState = static_cast(textureState.second)) { samplerState->bind(texture); } CLEAR_DIRTY(fragmentTextureStatesDirty_, index); } } if (getContext().shouldValidateShaders()) { const auto* stages = pipelineState->getShaderStages(); if (stages) { const auto result = stages->validate(); IGL_DEBUG_ASSERT(result.isOk(), result.message.c_str()); } } } } GLenum RenderCommandAdapter::toMockWireframeMode(GLenum mode) const { #if defined(IGL_OPENGL_ES) auto* const pipelineState = static_cast(pipelineState_.get()); const bool modeNeedsConversion = mode == GL_TRIANGLES || mode != GL_TRIANGLE_STRIP; if (pipelineState->getPolygonFillMode() == igl::PolygonFillMode::Line && modeNeedsConversion) { return GL_LINE_STRIP; } #endif return mode; } void RenderCommandAdapter::didDraw() { // Placeholder stub in case we want to add something later } void RenderCommandAdapter::unbindVertexAttributes() { auto* pipelineState = static_cast(pipelineState_.get()); if (pipelineState) { pipelineState->unbindVertexAttributes(); } } void RenderCommandAdapter::bindBufferWithShaderStorageBufferOverride( Buffer& buffer, GLenum overrideTargetForShaderStorageBuffer) { auto& arrayBuffer = static_cast(buffer); if (arrayBuffer.getTarget() == GL_SHADER_STORAGE_BUFFER) { arrayBuffer.bindForTarget(overrideTargetForShaderStorageBuffer); } else { arrayBuffer.bind(); } } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/RenderCommandAdapter.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include #include #include namespace igl { class IFramebuffer; class ITexture; class IDepthStencilState; class ISamplerState; struct RenderPassDesc; class IRenderPipelineState; namespace opengl { class Buffer; class VertexArrayObject; class RenderCommandAdapter final : public WithContext { public: using StateBits = uint32_t; enum class StateMask : StateBits { NONE = 0, PIPELINE = 1 << 1, DepthStencil = 1 << 2 }; private: struct BufferState { Buffer* resource = nullptr; size_t offset = 0; }; using TextureState = std::pair; using TextureStates = std::array; public: static std::unique_ptr create( IContext& context, const RenderPassDesc& renderPass, const std::shared_ptr& framebuffer, Result* outResult); void setViewport(const Viewport& viewport); void setScissorRect(const ScissorRect& rect); void setDepthStencilState(const std::shared_ptr& newValue); void setStencilReferenceValue(uint32_t value); void setBlendColor(const Color& color); void setDepthBias(float depthBias, float slopeScale, float clamp); void clearVertexBuffers(); void setVertexBuffer(Buffer& buffer, size_t offset, size_t index, Result* outResult = nullptr); void setIndexBuffer(Buffer& buffer); void clearUniformBuffers(); void setUniformBuffer(Buffer* buffer, size_t offset, size_t size, uint32_t index, Result* outResult = nullptr); void setUniform(const UniformDesc& uniformDesc, const void* data, Result* outResult = nullptr); void clearVertexTexture(); void setVertexTexture(ITexture* texture, size_t index, Result* outResult = nullptr); void setVertexSamplerState(ISamplerState* samplerState, size_t index, Result* outResult = nullptr); void clearFragmentTexture(); void setFragmentTexture(ITexture* texture, size_t index, Result* outResult = nullptr); void setFragmentSamplerState(ISamplerState* samplerState, size_t index, Result* outResult = nullptr); void setPipelineState(const std::shared_ptr& newValue, Result* outResult = nullptr); void drawArrays(GLenum mode, GLint first, GLsizei count); void drawArraysIndirect(GLenum mode, Buffer& indirectBuffer, const GLvoid* indirectBufferOffset); void drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount); void drawElements(GLenum mode, GLsizei indexCount, GLenum indexType, const GLvoid* indexOffset); void drawElementsInstanced(GLenum mode, GLsizei indexCount, GLenum indexType, const GLvoid* indexOffset, GLsizei instancecount); void drawElementsIndirect(GLenum mode, GLenum indexType, Buffer& indirectBuffer, const GLvoid* indirectBufferOffset); void multiDrawArraysIndirect(GLenum mode, Buffer& indirectBuffer, const GLvoid* indirectBufferOffset, GLsizei drawcount, GLsizei stride); void multiDrawElementsIndirect(GLenum mode, GLenum indexType, Buffer& indirectBuffer, const GLvoid* indirectBufferOffset, GLsizei drawcount, GLsizei stride); void endEncoding(); void initialize(const RenderPassDesc& renderPass, const std::shared_ptr& framebuffer, Result* outResult); [[nodiscard]] const igl::IRenderPipelineState& pipelineState() const { IGL_DEBUG_ASSERT(pipelineState_, "No rendering pipeline is bound"); return *pipelineState_; } private: explicit RenderCommandAdapter(IContext& context); void clearDependentResources(const std::shared_ptr& newValue, Result* outResult = nullptr); void willDraw(); void didDraw(); void unbindVertexAttributes(); void bindBufferWithShaderStorageBufferOverride(Buffer& buffer, GLenum overrideTargetForShaderStorageBuffer); [[nodiscard]] bool isDirty(StateMask mask) const { return (dirtyStateBits_ & EnumToValue(mask)) != 0; } void setDirty(StateMask mask) { dirtyStateBits_ |= EnumToValue(mask); } void clearDirty(StateMask mask) { dirtyStateBits_ &= ~EnumToValue(mask); } // @brief OpenGL ES doesn't support glPolygonMode. To support rendering wireframe with it // we change all triangle drawing modes to GL_LINE_STRIP [[nodiscard]] GLenum toMockWireframeMode(GLenum mode) const; private: std::array vertexBuffers_; std::bitset vertexBuffersDirty_; std::bitset vertexTextureStatesDirty_; std::bitset fragmentTextureStatesDirty_; TextureStates vertexTextureStates_; TextureStates fragmentTextureStates_; UniformAdapter uniformAdapter_; StateBits dirtyStateBits_ = EnumToValue(StateMask::NONE); std::shared_ptr pipelineState_; std::shared_ptr depthStencilState_; std::shared_ptr activeVAO_ = nullptr; uint32_t frontStencilReferenceValue_ = 0xFF; uint32_t backStencilReferenceValue_ = 0xFF; bool useVAO_ = false; }; } // namespace opengl } // namespace igl ================================================ FILE: src/igl/opengl/RenderCommandEncoder.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #include #include #include #include #include namespace igl::opengl { namespace { GLenum toGlPrimitive(PrimitiveType primitiveType) { GLenum result = GL_TRIANGLES; switch (primitiveType) { case PrimitiveType::Point: result = GL_POINTS; break; case PrimitiveType::Line: result = GL_LINES; break; case PrimitiveType::LineStrip: result = GL_LINE_STRIP; break; case PrimitiveType::Triangle: break; case PrimitiveType::TriangleStrip: result = GL_TRIANGLE_STRIP; break; } return result; } GLenum toGlType(IndexFormat format) { switch (format) { case IndexFormat::UInt8: return GL_UNSIGNED_BYTE; case IndexFormat::UInt16: return GL_UNSIGNED_SHORT; case IndexFormat::UInt32: return GL_UNSIGNED_INT; } IGL_UNREACHABLE_RETURN(GL_UNSIGNED_INT) } uint8_t getIndexByteSize(GLenum indexType) { switch (indexType) { case GL_UNSIGNED_BYTE: return 1u; case GL_UNSIGNED_SHORT: return 2u; case GL_UNSIGNED_INT: return 4u; } IGL_UNREACHABLE_RETURN(4u) } } // namespace RenderCommandEncoder::RenderCommandEncoder(const std::shared_ptr& commandBuffer) : IRenderCommandEncoder(commandBuffer), WithContext(static_cast(getCommandBuffer()).getContext()) {} std::unique_ptr RenderCommandEncoder::create( const std::shared_ptr& commandBuffer, const RenderPassDesc& renderPass, const std::shared_ptr& framebuffer, const Dependencies& /*dependencies*/, Result* outResult) { if (!commandBuffer) { Result::setResult(outResult, Result::Code::ArgumentNull, "commandBuffer was null"); return {}; } // NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks) std::unique_ptr newEncoder(new RenderCommandEncoder(commandBuffer)); newEncoder->beginEncoding(renderPass, framebuffer, outResult); return newEncoder; } RenderCommandEncoder::~RenderCommandEncoder() = default; void RenderCommandEncoder::beginEncoding(const RenderPassDesc& renderPass, const std::shared_ptr& framebuffer, Result* outResult) { // Save caller state auto& context = getContext(); scissorEnabled_ = (context.isEnabled(GL_SCISSOR_TEST) != 0u); context.disable(GL_SCISSOR_TEST); // only turn on if bindScissorRect is called auto& pool = context.getAdapterPool(); if (pool.empty()) { Result result; adapter_ = RenderCommandAdapter::create(context, renderPass, framebuffer, &result); if (!result.isOk()) { if (outResult) { *outResult = result; } return; } } else { Result result; adapter_ = std::move(pool[pool.size() - 1]); pool.pop_back(); adapter_->initialize(renderPass, framebuffer, &result); if (!result.isOk()) { if (outResult) { *outResult = result; } return; } } framebuffer_ = std::static_pointer_cast(framebuffer); resolveFramebuffer_ = framebuffer_->getResolveFramebuffer(); // GPU timing: if the render pass descriptor contains a timestamp query, // start a GL_TIME_ELAPSED query to measure this render pass's GPU time. if (renderPass.timestampQuery.queries) { timestampQueries_ = renderPass.timestampQuery.queries; static_cast(*timestampQueries_) .beginElapsedQuery(renderPass.timestampQuery.slotIndex); } Result::setOk(outResult); } void RenderCommandEncoder::endEncoding() { if (IGL_DEBUG_VERIFY(adapter_)) { // Restore caller state getContext().setEnabled(scissorEnabled_, GL_SCISSOR_TEST); // Disable depthBias getContext().setEnabled(false, GL_POLYGON_OFFSET_FILL); adapter_->setDepthBias(0.0f, 0.0f, 0.0f); adapter_->endEncoding(); getContext().getAdapterPool().push_back(std::move(adapter_)); // GPU timing: end the GL_TIME_ELAPSED query after all draw calls. if (timestampQueries_) { static_cast(*timestampQueries_).endElapsedQuery(); timestampQueries_ = nullptr; } if (resolveFramebuffer_) { Result outResult; auto width = 0; auto height = 0; auto mask = 0; auto sizeMatch = true; if (resolveFramebuffer_->getColorAttachment(0)) { const auto colorDimensions = resolveFramebuffer_->getColorAttachment(0)->getDimensions(); mask |= GL_COLOR_BUFFER_BIT; width = static_cast(colorDimensions.width); height = static_cast(colorDimensions.height); } if (resolveFramebuffer_->getDepthAttachment()) { mask |= GL_DEPTH_BUFFER_BIT; const auto depthDimensions = resolveFramebuffer_->getDepthAttachment()->getDimensions(); if (width != 0 && static_cast(depthDimensions.width) != width) { sizeMatch = false; } if (height != 0 && static_cast(depthDimensions.height) != height) { sizeMatch = false; } width = static_cast(depthDimensions.width); height = static_cast(depthDimensions.height); } if (resolveFramebuffer_->getStencilAttachment()) { const auto stencilDimensions = resolveFramebuffer_->getStencilAttachment()->getDimensions(); mask |= GL_STENCIL_BUFFER_BIT; if (width != 0 && stencilDimensions.width != width) { sizeMatch = false; } if (height != 0 && static_cast(stencilDimensions.height) != height) { sizeMatch = false; } width = static_cast(stencilDimensions.width); height = static_cast(stencilDimensions.height); } IGL_DEBUG_ASSERT(mask != 0); if (sizeMatch) { igl::opengl::PlatformDevice::blitFramebuffer(framebuffer_, 0, 0, width, height, resolveFramebuffer_, 0, 0, width, height, mask, getContext(), &outResult); } else { IGL_DEBUG_ASSERT_NOT_REACHED(); } } } } void RenderCommandEncoder::pushDebugGroupLabel(const char* label, const igl::Color& /*color*/) const { IGL_DEBUG_ASSERT(adapter_); IGL_DEBUG_ASSERT(label != nullptr && *label); if (getContext().deviceFeatures().hasInternalFeature(InternalFeatures::DebugMessage)) { getContext().pushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, -1, label); } else { IGL_LOG_ERROR_ONCE( "RenderCommandEncoder::pushDebugGroupLabel not supported in this context!\n"); } } void RenderCommandEncoder::insertDebugEventLabel(const char* label, const igl::Color& /*color*/) const { IGL_DEBUG_ASSERT(adapter_); IGL_DEBUG_ASSERT(label != nullptr && *label); if (getContext().deviceFeatures().hasInternalFeature(InternalFeatures::DebugMessage)) { getContext().debugMessageInsert( GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, 0, GL_DEBUG_SEVERITY_LOW, -1, label); } else { IGL_LOG_ERROR_ONCE( "RenderCommandEncoder::insertDebugEventLabel not supported in this context!\n"); } } void RenderCommandEncoder::popDebugGroupLabel() const { IGL_DEBUG_ASSERT(adapter_); if (getContext().deviceFeatures().hasInternalFeature(InternalFeatures::DebugMessage)) { getContext().popDebugGroup(); } else { IGL_LOG_ERROR_ONCE("RenderCommandEncoder::popDebugGroupLabel not supported in this context!\n"); } } void RenderCommandEncoder::bindViewport(const Viewport& viewport) { if (IGL_DEBUG_VERIFY(adapter_)) { adapter_->setViewport(viewport); } } void RenderCommandEncoder::bindScissorRect(const ScissorRect& rect) { if (IGL_DEBUG_VERIFY(adapter_)) { adapter_->setScissorRect(rect); } } void RenderCommandEncoder::bindRenderPipelineState( const std::shared_ptr& pipelineState) { if (IGL_DEBUG_VERIFY(adapter_)) { adapter_->setPipelineState(pipelineState); } } void RenderCommandEncoder::bindDepthStencilState( const std::shared_ptr& depthStencilState) { if (IGL_DEBUG_VERIFY(adapter_)) { adapter_->setDepthStencilState(depthStencilState); } } void RenderCommandEncoder::bindUniform(const UniformDesc& uniformDesc, const void* data) { IGL_DEBUG_ASSERT(uniformDesc.location >= 0, "Invalid location passed to bindUniformBuffer: %d", uniformDesc.location); IGL_DEBUG_ASSERT(data != nullptr, "Data cannot be null"); if (IGL_DEBUG_VERIFY(adapter_) && data) { adapter_->setUniform(uniformDesc, data); } } void RenderCommandEncoder::bindBuffer(uint32_t index, uint8_t bindTarget, IBuffer* buffer, size_t offset, size_t bufferSize) { bindBuffer(index, buffer, offset, bufferSize); } void RenderCommandEncoder::bindBuffer(uint32_t index, IBuffer* buffer, size_t offset, size_t bufferSize) { if (IGL_DEBUG_VERIFY(adapter_) && buffer) { auto* glBuffer = static_cast(buffer); auto bufferType = glBuffer->getType(); if (bufferType == Buffer::Type::Uniform) { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } else if (bufferType == Buffer::Type::UniformBlock) { adapter_->setUniformBuffer(glBuffer, offset, bufferSize, index); } } } void RenderCommandEncoder::bindVertexBuffer(uint32_t index, IBuffer& buffer, size_t bufferOffset) { if (IGL_DEBUG_VERIFY(adapter_)) { Buffer& glBuffer = static_cast(buffer); IGL_DEBUG_ASSERT(glBuffer.getType() == Buffer::Type::Attribute); adapter_->setVertexBuffer(glBuffer, bufferOffset, static_cast(index)); } } void RenderCommandEncoder::bindIndexBuffer(IBuffer& buffer, IndexFormat format, size_t bufferOffset) { if (IGL_DEBUG_VERIFY(adapter_)) { indexType_ = toGlType(format); indexBufferOffset_ = reinterpret_cast(bufferOffset); // NOLINT(performance-no-int-to-ptr) adapter_->setIndexBuffer((Buffer&)buffer); } } void RenderCommandEncoder::bindBytes(size_t /*index*/, uint8_t /*target*/, const void* /*data*/, size_t /*length*/) { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } void RenderCommandEncoder::bindPushConstants(const void* /*data*/, size_t /*length*/, size_t /*offset*/) { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } // NOLINTBEGIN(bugprone-easily-swappable-parameters) void RenderCommandEncoder::bindSamplerState(size_t index, uint8_t bindTarget, ISamplerState* samplerState) { // NOLINTEND(bugprone-easily-swappable-parameters) if (IGL_DEBUG_VERIFY(adapter_)) { if ((bindTarget & BindTarget::kVertex) != 0) { adapter_->setVertexSamplerState(samplerState, index); } if ((bindTarget & BindTarget::kFragment) != 0) { adapter_->setFragmentSamplerState(samplerState, index); } } } // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) void RenderCommandEncoder::bindTexture(size_t index, uint8_t bindTarget, ITexture* texture) { if (IGL_DEBUG_VERIFY(adapter_)) { if ((bindTarget & BindTarget::kVertex) != 0) { adapter_->setVertexTexture(texture, index); } if ((bindTarget & BindTarget::kFragment) != 0) { adapter_->setFragmentTexture(texture, index); } } } void RenderCommandEncoder::bindTexture(size_t index, ITexture* texture) { bindTexture(index, igl::BindTarget::kFragment, texture); } // NOLINTBEGIN(bugprone-easily-swappable-parameters) void RenderCommandEncoder::draw(size_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t baseInstance) { // NOLINTEND(bugprone-easily-swappable-parameters) (void)baseInstance; IGL_DEBUG_ASSERT(baseInstance == 0, "Instancing is not implemented"); if (IGL_DEBUG_VERIFY(adapter_)) { getCommandBuffer().incrementCurrentDrawCount(); auto mode = toGlPrimitive(adapter_->pipelineState().getRenderPipelineDesc().topology); if (instanceCount > 1) { adapter_->drawArraysInstanced( mode, (GLsizei)firstVertex, (GLsizei)vertexCount, (GLsizei)instanceCount); } else { adapter_->drawArrays(mode, (GLsizei)firstVertex, (GLsizei)vertexCount); } } } // NOLINTBEGIN(bugprone-easily-swappable-parameters) void RenderCommandEncoder::drawIndexed(size_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t baseInstance) { // NOLINTEND(bugprone-easily-swappable-parameters) (void)vertexOffset; (void)baseInstance; IGL_DEBUG_ASSERT(vertexOffset == 0, "vertexOffset is not implemented"); IGL_DEBUG_ASSERT(baseInstance == 0, "Instancing is not implemented"); IGL_DEBUG_ASSERT(indexType_, "No index buffer bound"); const size_t indexOffsetBytes = static_cast(firstIndex) * getIndexByteSize(indexType_); if (IGL_DEBUG_VERIFY(adapter_ && indexType_)) { getCommandBuffer().incrementCurrentDrawCount(); auto mode = toGlPrimitive(adapter_->pipelineState().getRenderPipelineDesc().topology); if (instanceCount > 1) { adapter_->drawElementsInstanced(mode, (GLsizei)indexCount, indexType_, (uint8_t*)indexBufferOffset_ + indexOffsetBytes, instanceCount); } else { adapter_->drawElements( mode, (GLsizei)indexCount, indexType_, (uint8_t*)indexBufferOffset_ + indexOffsetBytes); } } } void RenderCommandEncoder::drawMeshTasks(const Dimensions& threadgroupsPerGrid, const Dimensions& threadsPerTaskThreadgroup, const Dimensions& threadsPerMeshThreadgroup) { (void)threadgroupsPerGrid; (void)threadsPerTaskThreadgroup; (void)threadsPerMeshThreadgroup; IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } // NOLINTBEGIN(bugprone-easily-swappable-parameters) void RenderCommandEncoder::multiDrawIndirect(IBuffer& indirectBuffer, size_t indirectBufferOffset, uint32_t drawCount, uint32_t stride) { // NOLINTEND(bugprone-easily-swappable-parameters) if (IGL_DEBUG_VERIFY(adapter_)) { getCommandBuffer().incrementCurrentDrawCount(); const auto mode = toGlPrimitive(adapter_->pipelineState().getRenderPipelineDesc().topology); const auto* indirectBufferOffsetPtr = reinterpret_cast(indirectBufferOffset); // NOLINT(performance-no-int-to-ptr) const GLsizei effectiveStride = stride ? stride : 16u; // sizeof(DrawArraysIndirectCommand) if (getContext().deviceFeatures().hasInternalFeature(InternalFeatures::MultiDrawIndirect)) { adapter_->multiDrawArraysIndirect( mode, (Buffer&)indirectBuffer, indirectBufferOffsetPtr, drawCount, effectiveStride); } else { for (uint32_t i = 0; i != drawCount; i++) { adapter_->drawArraysIndirect(mode, (Buffer&)indirectBuffer, indirectBufferOffsetPtr); indirectBufferOffsetPtr += effectiveStride; } } } } // NOLINTBEGIN(bugprone-easily-swappable-parameters) void RenderCommandEncoder::multiDrawIndexedIndirect(IBuffer& indirectBuffer, size_t indirectBufferOffset, uint32_t drawCount, uint32_t stride) { // NOLINTEND(bugprone-easily-swappable-parameters) IGL_DEBUG_ASSERT(indexType_, "No index buffer bound"); if (IGL_DEBUG_VERIFY(adapter_ && indexType_)) { getCommandBuffer().incrementCurrentDrawCount(); const auto mode = toGlPrimitive(adapter_->pipelineState().getRenderPipelineDesc().topology); const auto* indirectBufferOffsetPtr = reinterpret_cast(indirectBufferOffset); // NOLINT(performance-no-int-to-ptr) const GLsizei effectiveStride = stride ? stride : 20u; // sizeof(DrawElementsIndirectCommand) if (getContext().deviceFeatures().hasInternalFeature(InternalFeatures::MultiDrawIndirect)) { adapter_->multiDrawElementsIndirect(mode, indexType_, (Buffer&)indirectBuffer, indirectBufferOffsetPtr, drawCount, effectiveStride); } else { for (uint32_t i = 0; i != drawCount; i++) { adapter_->drawElementsIndirect( mode, indexType_, (Buffer&)indirectBuffer, indirectBufferOffsetPtr); indirectBufferOffsetPtr += effectiveStride; } } } } void RenderCommandEncoder::setStencilReferenceValue(uint32_t value) { if (IGL_DEBUG_VERIFY(adapter_)) { adapter_->setStencilReferenceValue(value); } } void RenderCommandEncoder::setBlendColor(const Color& color) { if (IGL_DEBUG_VERIFY(adapter_)) { adapter_->setBlendColor(color); } } void RenderCommandEncoder::setDepthBias(float depthBias, float slopeScale, float clamp) { if (IGL_DEBUG_VERIFY(adapter_)) { adapter_->setDepthBias(depthBias, slopeScale, clamp); } } void RenderCommandEncoder::bindBindGroup(BindGroupTextureHandle handle) { if (handle.empty()) { return; } const BindGroupTextureDesc* desc = getContext().bindGroupTexturesPool.get(handle); for (uint32_t i = 0; i != IGL_TEXTURE_SAMPLERS_MAX; i++) { if (desc->textures[i]) { IGL_DEBUG_ASSERT(desc->samplers[i]); bindTexture(i, BindTarget::kAllGraphics, desc->textures[i].get()); bindSamplerState(i, BindTarget::kAllGraphics, desc->samplers[i].get()); } } } void RenderCommandEncoder::bindBindGroup(BindGroupBufferHandle handle, uint32_t numDynamicOffsets, const uint32_t* dynamicOffsets) { if (handle.empty()) { return; } const BindGroupBufferDesc* desc = getContext().bindGroupBuffersPool.get(handle); uint32_t dynamicOffset = 0; for (uint32_t i = 0; i != IGL_UNIFORM_BLOCKS_BINDING_MAX; i++) { if (desc->buffers[i]) { if (desc->isDynamicBufferMask & (1 << i)) { IGL_DEBUG_ASSERT(dynamicOffsets, "No dynamic offsets provided"); IGL_DEBUG_ASSERT(dynamicOffset < numDynamicOffsets, "Not enough dynamic offsets provided"); bindBuffer(i, desc->buffers[i].get(), desc->offset[i] + dynamicOffsets[dynamicOffset++], desc->size[i]); } else { bindBuffer(i, desc->buffers[i].get(), desc->offset[i], desc->size[i]); } } } IGL_DEBUG_ASSERT(dynamicOffset == numDynamicOffsets, "Not all dynamic offsets were consumed"); } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/RenderCommandEncoder.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include #include namespace igl { class IDepthStencilState; class IRenderPipelineState; class ISamplerState; namespace opengl { class CommandBuffer; class RenderCommandEncoder final : public IRenderCommandEncoder, public WithContext { public: static std::unique_ptr create( const std::shared_ptr& commandBuffer, const RenderPassDesc& renderPass, const std::shared_ptr& framebuffer, const Dependencies& dependencies, Result* outResult); ~RenderCommandEncoder() override; private: explicit RenderCommandEncoder(const std::shared_ptr& commandBuffer); void beginEncoding(const RenderPassDesc& renderPass, const std::shared_ptr& framebuffer, Result* outResult); public: void endEncoding() override; void pushDebugGroupLabel(const char* label, const igl::Color& color) const override; void insertDebugEventLabel(const char* label, const igl::Color& color) const override; void popDebugGroupLabel() const override; void bindViewport(const Viewport& viewport) override; void bindScissorRect(const ScissorRect& rect) override; void bindRenderPipelineState(const std::shared_ptr& pipelineState) override; void bindDepthStencilState(const std::shared_ptr& depthStencilState) override; // Binds a non-block uniform (eg. opengl 2.0 shader) // The data pointer must remain valid until the commandBuffer's execution has been completed by // CommandQueue::submit() void bindUniform(const UniformDesc& uniformDesc, const void* data) override; void bindBuffer(uint32_t index, uint8_t target, IBuffer* buffer, size_t bufferOffset, size_t bufferSize) override; void bindBuffer(uint32_t index, IBuffer* buffer, size_t bufferOffset, size_t bufferSize) override; void bindVertexBuffer(uint32_t index, IBuffer& buffer, size_t bufferOffset) override; void bindIndexBuffer(IBuffer& buffer, IndexFormat format, size_t bufferOffset) override; void bindBytes(size_t index, uint8_t target, const void* data, size_t length) override; void bindPushConstants(const void* data, size_t length, size_t offset) override; void bindSamplerState(size_t index, uint8_t target, ISamplerState* samplerState) override; void bindTexture(size_t index, uint8_t target, ITexture* texture) override; void bindTexture(size_t index, ITexture* texture) override; void bindBindGroup(BindGroupTextureHandle handle) override; void bindBindGroup(BindGroupBufferHandle handle, uint32_t numDynamicOffsets, const uint32_t* dynamicOffsets) override; void draw(size_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t baseInstance) override; void drawIndexed(size_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t baseInstance) override; void drawMeshTasks(const Dimensions& threadgroupsPerGrid, const Dimensions& threadsPerTaskThreadgroup, const Dimensions& threadsPerMeshThreadgroup) override; void multiDrawIndirect(IBuffer& indirectBuffer, size_t indirectBufferOffset, uint32_t drawCount, uint32_t stride) override; void multiDrawIndexedIndirect(IBuffer& indirectBuffer, size_t indirectBufferOffset, uint32_t drawCount, uint32_t stride) override; void setStencilReferenceValue(uint32_t value) override; void setBlendColor(const Color& color) override; void setDepthBias(float depthBias, float slopeScale, float clamp) override; private: std::unique_ptr adapter_; bool scissorEnabled_ = false; GLenum indexType_ = 0; void* indexBufferOffset_ = nullptr; std::shared_ptr resolveFramebuffer_; std::shared_ptr framebuffer_; /// GPU timing: descriptor-based elapsed query from RenderPassDesc. /// When set, GL_TIME_ELAPSED query is started in beginEncoding() /// and ended in endEncoding(). std::shared_ptr timestampQueries_; }; } // namespace opengl } // namespace igl ================================================ FILE: src/igl/opengl/RenderPipelineReflection.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "RenderPipelineReflection.h" #include #include namespace { igl::UniformType toIGLUniformType(GLenum type) { switch (type) { case GL_FLOAT: return igl::UniformType::Float; case GL_FLOAT_VEC2: return igl::UniformType::Float2; case GL_FLOAT_VEC3: return igl::UniformType::Float3; case GL_FLOAT_VEC4: return igl::UniformType::Float4; case GL_BOOL: return igl::UniformType::Boolean; case GL_INT: return igl::UniformType::Int; case GL_INT_VEC2: return igl::UniformType::Int2; case GL_INT_VEC3: return igl::UniformType::Int3; case GL_INT_VEC4: return igl::UniformType::Int4; case GL_FLOAT_MAT2: return igl::UniformType::Mat2x2; case GL_FLOAT_MAT3: return igl::UniformType::Mat3x3; case GL_FLOAT_MAT4: return igl::UniformType::Mat4x4; default: IGL_LOG_ERROR("Unsupported uniform type: 0x%04x\n", type); return igl::UniformType::Invalid; } } igl::TextureType toIGLTextureType(GLenum type) { switch (type) { case GL_SAMPLER_2D: #if (defined(GL_VERSION_2_0) && GL_VERSION_2_0) || (defined(GL_ES_VERSION_3_0) && GL_ES_VERSION_3_0) case GL_SAMPLER_2D_SHADOW: #elif defined(GL_ES_VERSION_2_0) && GL_ES_VERSION_2_0 case GL_SAMPLER_2D_SHADOW_EXT: #elif defined(GL_ARB_shader_objects) && GL_ARB_shader_objects case GL_SAMPLER_2D_SHADOW_ARB: #endif case GL_IMAGE_2D: case GL_IMAGE_2D_MULTISAMPLE: return igl::TextureType::TwoD; case GL_SAMPLER_2D_ARRAY: case GL_IMAGE_2D_ARRAY: case GL_IMAGE_2D_MULTISAMPLE_ARRAY: return igl::TextureType::TwoDArray; case GL_SAMPLER_3D: case GL_IMAGE_3D: return igl::TextureType::ThreeD; case GL_SAMPLER_CUBE: case GL_IMAGE_CUBE: return igl::TextureType::Cube; case GL_SAMPLER_EXTERNAL_OES: #if defined(GL_EXT_YUV_target) case GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT: #endif return igl::TextureType::ExternalImage; default: return igl::TextureType::Invalid; } } } // namespace namespace igl::opengl { RenderPipelineReflection::RenderPipelineReflection(IContext& context, const ShaderStages& stages) { if (context.deviceFeatures().hasFeature(DeviceFeatures::UniformBlocks)) { generateUniformBlocksDictionary(context, stages.getProgramID()); } generateUniformDictionary(context, stages.getProgramID()); generateAttributeDictionary(context, stages.getProgramID()); generateShaderStorageBufferObjectDictionary(context, stages.getProgramID()); cacheDescriptors(); } RenderPipelineReflection::~RenderPipelineReflection() = default; void RenderPipelineReflection::generateUniformDictionary(IContext& context, GLuint pid) { IGL_DEBUG_ASSERT(pid != 0); uniformDictionary_.clear(); GLint count = 0; context.getProgramiv(pid, GL_ACTIVE_UNIFORMS, &count); // We compute max uniform length by querying GL_ACTIVE_UNIFORM_MAX_LENGTH, and then taking the max // of that with every GL_UNIFORM_NAME_LENGTH of each of the uniforms. This is needed because we // observed that OpenGL drivers are sometimes unreliable with these values: // // 1. Android devices with old Mali GPUs (e.g. Mali-T860MP2) sometimes incorrectly return 0 for // GL_ACTIVE_UNIFORM_MAX_LENGTH // // 2. When running macOS unit tests, sometimes GL_UNIFORM_NAME_LENGTH always return 0 // // So the safe thing to do here is to take the max of the two. GLint maxUniformNameLength = 0; context.getProgramiv(pid, GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxUniformNameLength); #ifdef GL_UNIFORM_NAME_LENGTH auto glVersion = context.deviceFeatures().getGLVersion(); const bool supportsGetActiveUniformsiv = glVersion == GLVersion::v3_0_ES || glVersion == GLVersion::v3_1_ES || glVersion == GLVersion::v3_2_ES || glVersion >= GLVersion::v3_1; if (supportsGetActiveUniformsiv && count > 0) { std::vector indices(count); for (int i = 0; i < count; ++i) { indices[i] = static_cast(i); } std::vector nameLengths(count); context.getActiveUniformsiv( pid, count, indices.data(), GL_UNIFORM_NAME_LENGTH, nameLengths.data()); for (int i = 0; i < count; ++i) { maxUniformNameLength = std::max(maxUniformNameLength, nameLengths[i]); } } #endif std::vector cname(maxUniformNameLength); for (int i = 0; i < count; i++) { GLsizei length = 0; GLsizei size = 0; GLenum type = GL_NONE; context.getActiveUniform(pid, i, maxUniformNameLength, &length, &size, &type, cname.data()); const GLint location = context.getUniformLocation(pid, cname.data()); if (location < 0) { // this uniform belongs to a block; continue; } if (length >= 4 && std::strcmp(cname.data() + length - 3, "[0]") == 0) { length = length - 3; // remove '[0]' for arrays } auto name = std::string(cname.data(), cname.data() + length); const UniformDesc u(size, location, type); uniformDictionary_.insert(std::make_pair(igl::genNameHandle(name), u)); } } void RenderPipelineReflection::generateUniformBlocksDictionary(IContext& context, GLuint pid) { IGL_DEBUG_ASSERT(pid != 0); uniformBlocksDictionary_.clear(); GLint numBlocks = 0; GLint maxBlockNameLength = 0; context.getProgramiv(pid, GL_ACTIVE_UNIFORM_BLOCKS, &numBlocks); if (numBlocks <= 0) { return; } context.getProgramiv(pid, GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH, &maxBlockNameLength); if (maxBlockNameLength <= 0) { return; } GLint maxUniformNameLength = 0; context.getProgramiv(pid, GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxUniformNameLength); std::vector uniformBlockNameData; for (int i = 0; i < numBlocks; i++) { UniformBlockDesc blockDesc; blockDesc.blockIndex = i; // Get uniform block name uniformBlockNameData.assign(maxBlockNameLength, '\0'); GLsizei blockNameLength = 0; context.getActiveUniformBlockName(pid, blockDesc.blockIndex, maxBlockNameLength, &blockNameLength, uniformBlockNameData.data()); const std::string uniformBlockName(uniformBlockNameData.begin(), uniformBlockNameData.begin() + blockNameLength); context.getActiveUniformBlockiv( pid, blockDesc.blockIndex, GL_UNIFORM_BLOCK_DATA_SIZE, &blockDesc.size); context.getActiveUniformBlockiv( pid, blockDesc.blockIndex, GL_UNIFORM_BLOCK_BINDING, &blockDesc.bindingIndex); // get the number of uniforms in the block GLint numActiveUniforms = 0; context.getActiveUniformBlockiv( pid, blockDesc.blockIndex, GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS, &numActiveUniforms); // Get the indices of the uniforms in the block std::vector indices(numActiveUniforms); context.getActiveUniformBlockiv( pid, blockDesc.blockIndex, GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES, indices.data()); std::vector nameData; for (size_t k = 0; k < numActiveUniforms; k++) { const GLuint index = indices[k]; UniformBlockDesc::UniformBlockMemberDesc memberDesc; // Get uniform block name, type, size nameData.assign(maxUniformNameLength, '\0'); GLsizei nameLength = 0; // size will be 1 for non-arrays; For arrays, it is the number of elements context.getActiveUniform(pid, indices[k], maxUniformNameLength, &nameLength, &memberDesc.size, &memberDesc.type, nameData.data()); context.getActiveUniformsiv(pid, 1, &index, GL_UNIFORM_OFFSET, &memberDesc.offset); // Fix the name by removing [0] suffix for arrays // and by stripping the block name from the uniform name if (nameLength >= 4 && nameData[nameLength - 3] == '[' && nameData[nameLength - 2] == '0' && nameData[nameLength - 1] == ']') { nameLength = nameLength - 3; // remove '[0]' for arrays } auto start = nameData.begin(); auto end = nameData.begin() + nameLength; // strip the block name from the uniform name auto it = std::find(start, end, '.'); if (it != end) { start = it + 1; } const std::string uniformName(start, end); blockDesc.members.insert(std::make_pair(igl::genNameHandle(uniformName), memberDesc)); } uniformBlocksDictionary_[igl::genNameHandle(uniformBlockName)] = blockDesc; } } void RenderPipelineReflection::generateAttributeDictionary(IContext& context, GLuint pid) { IGL_DEBUG_ASSERT(pid != 0); attributeDictionary_.clear(); GLint maxAttributeNameLength = 0; context.getProgramiv(pid, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &maxAttributeNameLength); GLint count = 0; context.getProgramiv(pid, GL_ACTIVE_ATTRIBUTES, &count); std::vector attribName(maxAttributeNameLength); for (int i = 0; i < count; i++) { GLsizei length = 0; GLsizei size = 0; GLenum type = GL_NONE; context.getActiveAttrib( pid, i, maxAttributeNameLength, &length, &size, &type, attribName.data()); auto name = std::string(attribName.data(), attribName.data() + length); const GLint location = context.getAttribLocation(pid, name.c_str()); attributeDictionary_.insert(std::make_pair(name, location)); } } void RenderPipelineReflection::generateShaderStorageBufferObjectDictionary(IContext& context, GLuint pid) { if (context.deviceFeatures().hasFeature(DeviceFeatures::Compute)) { IGL_DEBUG_ASSERT(pid != 0); shaderStorageBufferObjectDictionary_.clear(); GLint maxSSBONameLength = 0; context.getProgramInterfaceiv( pid, GL_SHADER_STORAGE_BLOCK, GL_MAX_NAME_LENGTH, &maxSSBONameLength); GLint count = 0; context.getProgramInterfaceiv(pid, GL_SHADER_STORAGE_BLOCK, GL_ACTIVE_RESOURCES, &count); std::vector cname(maxSSBONameLength); for (int i = 0; i < count; i++) { GLsizei length = 0; context.getProgramResourceName( pid, GL_SHADER_STORAGE_BLOCK, i, maxSSBONameLength, &length, cname.data()); auto name = std::string(cname.data(), cname.data() + length); const GLuint index = context.getProgramResourceIndex(pid, GL_SHADER_STORAGE_BLOCK, cname.data()); GLint location{-1}; const GLenum prop = GL_BUFFER_BINDING; context.getProgramResourceiv( pid, GL_SHADER_STORAGE_BLOCK, index, 1, &prop, 1, &length, &location); shaderStorageBufferObjectDictionary_.insert( std::make_pair(igl::genNameHandle(name), location)); } } } int RenderPipelineReflection::getIndexByName(const NameHandle& name) const { // Search through list of uniforms const auto uniformEntry = uniformDictionary_.find(name); if (uniformEntry != uniformDictionary_.end()) { return uniformEntry->second.location; } // search through the list of uniform blocks const auto uniformBlockEntry = uniformBlocksDictionary_.find(name); if (uniformBlockEntry != uniformBlocksDictionary_.end()) { return uniformBlockEntry->second.bindingIndex; } // Search through list of attributes auto attribEntry = attributeDictionary_.find(name.toString()); if (attribEntry != attributeDictionary_.end()) { return attribEntry->second; } // Search through list of SSBOs auto ssboEntry = shaderStorageBufferObjectDictionary_.find(name); if (ssboEntry != shaderStorageBufferObjectDictionary_.end()) { return ssboEntry->second; } return -1; } void RenderPipelineReflection::cacheDescriptors() { bufferArguments_.clear(); samplerArguments_.clear(); textureArguments_.clear(); for (const auto& entry : uniformDictionary_) { const UniformDesc& glDesc = entry.second; const igl::TextureType textureType = toIGLTextureType(glDesc.type); // buffers if (textureType == igl::TextureType::Invalid) { const igl::UniformType uniformType = toIGLUniformType(glDesc.type); BufferArgDesc bufferDesc; bufferDesc.name = entry.first; bufferDesc.bufferAlignment = 1; bufferDesc.bufferDataSize = glDesc.size * igl::sizeForUniformType(uniformType); bufferDesc.bufferIndex = glDesc.location; bufferDesc.shaderStage = igl::ShaderStage::Fragment; igl::BufferArgDesc::BufferMemberDesc iglMemberDesc{ entry.first, uniformType, 0, (size_t)glDesc.size, }; bufferDesc.members.push_back(std::move(iglMemberDesc)); bufferArguments_.push_back(std::move(bufferDesc)); } // textures & samplers else { TextureArgDesc textureDesc; textureDesc.name = entry.first; textureDesc.type = textureType; textureDesc.textureIndex = glDesc.location; textureDesc.shaderStage = igl::ShaderStage::Fragment; // Create one artificial sampler for each texture SamplerArgDesc samplerDesc; samplerDesc.name = textureDesc.name; samplerDesc.samplerIndex = textureDesc.textureIndex; samplerDesc.shaderStage = textureDesc.shaderStage; textureArguments_.push_back(std::move(textureDesc)); samplerArguments_.push_back(std::move(samplerDesc)); } } // uniform blocks for (const auto& blockEntry : uniformBlocksDictionary_) { const auto& blockDesc = blockEntry.second; BufferArgDesc bufferDesc; bufferDesc.isUniformBlock = true; bufferDesc.name = blockEntry.first; bufferDesc.bufferAlignment = 1; bufferDesc.bufferDataSize = blockDesc.size; bufferDesc.bufferIndex = blockDesc.blockIndex; bufferDesc.shaderStage = igl::ShaderStage::Fragment; for (const auto& uniformEntry : blockDesc.members) { const auto& uniformDesc = uniformEntry.second; const igl::UniformType uniformType = toIGLUniformType(uniformDesc.type); igl::BufferArgDesc::BufferMemberDesc iglMemberDesc{ uniformEntry.first, uniformType, static_cast(uniformDesc.offset), static_cast(uniformDesc.size), }; bufferDesc.members.push_back(std::move(iglMemberDesc)); } bufferArguments_.push_back(std::move(bufferDesc)); } } const std::vector& RenderPipelineReflection::allUniformBuffers() const { return bufferArguments_; } const std::vector& RenderPipelineReflection::allSamplers() const { return samplerArguments_; } const std::vector& RenderPipelineReflection::allTextures() const { return textureArguments_; } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/RenderPipelineReflection.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include // @donotremove #include #include namespace igl::opengl { class RenderPipelineReflection final : public IRenderPipelineReflection { public: struct UniformDesc { GLsizei size; GLint location; GLenum type; // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) UniformDesc(GLsizei s, GLint loc, GLenum t) : size(s), location(loc), type(t) {} }; struct UniformBlockDesc { struct UniformBlockMemberDesc { GLsizei size = 0; GLenum type = GL_NONE; GLint offset = 0; }; GLint size{}; GLint blockIndex{}; GLint bindingIndex = -1; // the block binding location, when set directly in the shader std::unordered_map members; }; [[nodiscard]] const std::vector& allUniformBuffers() const override; [[nodiscard]] const std::vector& allSamplers() const override; [[nodiscard]] const std::vector& allTextures() const override; [[nodiscard]] int getIndexByName(const NameHandle& name) const; [[nodiscard]] const std::unordered_map& getUniformDictionary() const { return uniformDictionary_; } [[nodiscard]] const std::unordered_map& getUniformBlocksDictionary() const { return uniformBlocksDictionary_; } std::unordered_map& getUniformBlocksDictionary() { return uniformBlocksDictionary_; } [[nodiscard]] const std::unordered_map& getAttributeDictionary() const { return attributeDictionary_; } [[nodiscard]] const std::unordered_map& getShaderStorageBufferObjectDictionary() const { return shaderStorageBufferObjectDictionary_; } RenderPipelineReflection(IContext& context, const ShaderStages& stages); ~RenderPipelineReflection() override; private: std::unordered_map uniformDictionary_; std::unordered_map uniformBlocksDictionary_; std::unordered_map attributeDictionary_; std::unordered_map shaderStorageBufferObjectDictionary_; void generateUniformDictionary(IContext& context, GLuint pid); void generateUniformBlocksDictionary(IContext& context, GLuint pid); void generateShaderStorageBufferObjectDictionary(IContext& context, GLuint pid); void generateAttributeDictionary(IContext& context, GLuint pid); void cacheDescriptors(); std::vector bufferArguments_; std::vector samplerArguments_; std::vector textureArguments_; }; } // namespace igl::opengl ================================================ FILE: src/igl/opengl/RenderPipelineState.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include // for igl::BindTarget #include namespace igl::opengl { namespace { void logBlendFactorError(IGL_MAYBE_UNUSED const char* value) { IGL_DEBUG_ABORT("OpenGL does not support blend mode: %s, setting to GL_ONE instead\n", value); } } // namespace RenderPipelineState::RenderPipelineState(IContext& context, const RenderPipelineDesc& desc, Result* outResult) : WithContext(context), IRenderPipelineState(desc) { activeAttributesLocations_.reserve(64); unitSamplerLocationMap_.fill(-1); auto ret = create(); if (outResult) { *outResult = ret; } } RenderPipelineState::~RenderPipelineState() = default; GLenum RenderPipelineState::convertBlendOp(BlendOp value) { // sets blending equation for both RGA and Alpha switch (value) { case BlendOp::Add: return GL_FUNC_ADD; case BlendOp::Subtract: return GL_FUNC_SUBTRACT; case BlendOp::ReverseSubtract: return GL_FUNC_REVERSE_SUBTRACT; case BlendOp::Min: return GL_MIN; case BlendOp::Max: return GL_MAX; } IGL_UNREACHABLE_RETURN(GL_FUNC_ADD) } GLenum RenderPipelineState::convertBlendFactor(BlendFactor value) { switch (value) { case BlendFactor::Zero: return GL_ZERO; case BlendFactor::One: return GL_ONE; case BlendFactor::SrcColor: return GL_SRC_COLOR; case BlendFactor::OneMinusSrcColor: return GL_ONE_MINUS_SRC_COLOR; case BlendFactor::DstColor: return GL_DST_COLOR; case BlendFactor::OneMinusDstColor: return GL_ONE_MINUS_DST_COLOR; case BlendFactor::SrcAlpha: return GL_SRC_ALPHA; case BlendFactor::OneMinusSrcAlpha: return GL_ONE_MINUS_SRC_ALPHA; case BlendFactor::DstAlpha: return GL_DST_ALPHA; case BlendFactor::OneMinusDstAlpha: return GL_ONE_MINUS_DST_ALPHA; case BlendFactor::BlendColor: return GL_CONSTANT_COLOR; case BlendFactor::OneMinusBlendColor: return GL_ONE_MINUS_CONSTANT_COLOR; case BlendFactor::BlendAlpha: return GL_CONSTANT_ALPHA; case BlendFactor::OneMinusBlendAlpha: return GL_ONE_MINUS_CONSTANT_ALPHA; case BlendFactor::SrcAlphaSaturated: return GL_SRC_ALPHA_SATURATE; case BlendFactor::Src1Color: logBlendFactorError(_IGL_TO_STRING_WRAPPER(GL_SRC1_COLOR)); return GL_ONE; // default for unsupported values case BlendFactor::OneMinusSrc1Color: logBlendFactorError(_IGL_TO_STRING_WRAPPER(GL_ONE_MINUS_SRC1_COLOR)); return GL_ONE; // default for unsupported values case BlendFactor::Src1Alpha: logBlendFactorError(_IGL_TO_STRING_WRAPPER(GL_SRC1_ALPHA)); return GL_ONE; // default for unsupported values case BlendFactor::OneMinusSrc1Alpha: logBlendFactorError(_IGL_TO_STRING_WRAPPER(GL_ONE_MINUS_SRC1_ALPHA)); return GL_ONE; // default for unsupported values } IGL_UNREACHABLE_RETURN(GL_ONE) } Result RenderPipelineState::create() { if (IGL_DEBUG_VERIFY_NOT(desc_.shaderStages == nullptr)) { return Result(Result::Code::ArgumentInvalid, "Missing shader stages"); } if (!IGL_DEBUG_VERIFY(desc_.shaderStages->getType() == ShaderStagesType::Render)) { return Result(Result::Code::ArgumentInvalid, "Shader stages not for render"); } const auto* shaderStages = static_cast(desc_.shaderStages.get()); if (!shaderStages) { return Result(Result::Code::ArgumentInvalid, "Shader stages required to create pipeline state."); } if (shaderStages->getType() != ShaderStagesType::Render) { return Result(Result::Code::ArgumentInvalid, "Expected render shader stages."); } else if (!shaderStages->isValid()) { return Result(Result::Code::ArgumentInvalid, "Missing required shader module(s)."); } reflection_ = std::make_shared(getContext(), *shaderStages); const auto& mFramebufferDesc = desc_.targetDesc; // Get and cache all attribute locations, since this won't change throughout // the lifetime of this RenderPipelineState const auto* vertexInputState = static_cast(desc_.vertexInputState.get()); if (desc_.vertexInputState != nullptr) { auto bufferAttribMap = vertexInputState->getBufferAttribMap(); // For each bufferIndex, storage the list of associated attribute locations for (const auto& [index, attribList] : bufferAttribMap) { for (const auto& attrib : attribList) { const int loc = getIndexByName(igl::genNameHandle(attrib.name), ShaderStage::Vertex); if (loc < 0) { IGL_LOG_ERROR("Vertex attribute (%s) not found in shader.", attrib.name.c_str()); } IGL_DEBUG_ASSERT(index < IGL_BUFFER_BINDINGS_MAX); if (index < IGL_BUFFER_BINDINGS_MAX) { bufferAttribLocations_[index].push_back(loc); } } } } // Note this work is only done once. Beyond this point, there is no more query by name for (const auto& [textureUnit, samplerName] : desc_.fragmentUnitSamplerMap) { const int loc = reflection_->getIndexByName(samplerName); if (loc >= 0) { unitSamplerLocationMap_[textureUnit] = loc; } else { IGL_LOG_ERROR("Sampler uniform (%s) not found in shader.\n", samplerName.c_str()); } } for (const auto& [bindingIndex, names] : desc_.uniformBlockBindingMap) { for (const auto& [blockName, instanceName] : names) { auto& uniformBlockDict = reflection_->getUniformBlocksDictionary(); auto blockDescIt = uniformBlockDict.find(blockName); if (blockDescIt != uniformBlockDict.end()) { auto blockIndex = blockDescIt->second.blockIndex; if (blockDescIt->second.bindingIndex > 0) { // avoid overriding explicit binding points from shaders because we observed // crashes when doing so on some Adreno devices. uniformBlockBindingMap_[blockIndex] = blockDescIt->second.bindingIndex; } else { uniformBlockBindingMap_[blockIndex] = bindingIndex; blockDescIt->second.bindingIndex = bindingIndex; } } } } for (const auto& [textureUnit, samplerName] : desc_.vertexUnitSamplerMap) { const int loc = reflection_->getIndexByName(samplerName); if (loc < 0) { IGL_LOG_ERROR("Sampler uniform (%s) not found in shader.\n", samplerName.c_str()); continue; } // find the first empty slot in unitSamplerLocationMap; size_t realTextureUnit = 0; for (; realTextureUnit < unitSamplerLocationMap_.size(); realTextureUnit++) { if (unitSamplerLocationMap_[realTextureUnit] == -1) { break; } } if (realTextureUnit >= unitSamplerLocationMap_.size()) { return Result{Result::Code::RuntimeError, "Too many samplers"}; } vertexTextureUnitRemap_[textureUnit] = realTextureUnit; unitSamplerLocationMap_[realTextureUnit] = loc; } if (!mFramebufferDesc.colorAttachments.empty()) { const ColorWriteMask colorWriteMask = mFramebufferDesc.colorAttachments[0].colorWriteMask; colorMask_[0] = static_cast((colorWriteMask & kColorWriteBitsRed) != 0); colorMask_[1] = static_cast((colorWriteMask & kColorWriteBitsGreen) != 0); colorMask_[2] = static_cast((colorWriteMask & kColorWriteBitsBlue) != 0); colorMask_[3] = static_cast((colorWriteMask & kColorWriteBitsAlpha) != 0); } if (!mFramebufferDesc.colorAttachments.empty() && mFramebufferDesc.colorAttachments[0].blendEnabled) { blendEnabled_ = true; // GL equation sets blending equation for both RGB and alpha blendMode_ = {convertBlendOp(mFramebufferDesc.colorAttachments[0].rgbBlendOp), convertBlendOp(mFramebufferDesc.colorAttachments[0].alphaBlendOp), convertBlendFactor(mFramebufferDesc.colorAttachments[0].srcRGBBlendFactor), convertBlendFactor(mFramebufferDesc.colorAttachments[0].dstRGBBlendFactor), convertBlendFactor(mFramebufferDesc.colorAttachments[0].srcAlphaBlendFactor), convertBlendFactor(mFramebufferDesc.colorAttachments[0].dstAlphaBlendFactor)}; } else { blendEnabled_ = false; } return Result(); } void RenderPipelineState::bind() { if (desc_.shaderStages) { const auto* shaderStages = static_cast(desc_.shaderStages.get()); shaderStages->bind(); if (!uniformBlockBindingPointSet_) { for (const auto& binding : uniformBlockBindingMap_) { const auto& blockIndex = binding.first; const auto& bindingIndex = binding.second; getContext().uniformBlockBinding(shaderStages->getProgramID(), blockIndex, bindingIndex); } uniformBlockBindingPointSet_ = true; } } getContext().colorMask(colorMask_[0], colorMask_[1], colorMask_[2], colorMask_[3]); if (!desc_.targetDesc.colorAttachments.empty() && blendEnabled_) { getContext().enable(GL_BLEND); getContext().blendEquationSeparate(blendMode_.blendOpColor, blendMode_.blendOpAlpha); getContext().blendFuncSeparate( blendMode_.srcColor, blendMode_.dstColor, blendMode_.srcAlpha, blendMode_.dstAlpha); } else { getContext().disable(GL_BLEND); } // face cull mode if (desc_.cullMode == CullMode::Disabled) { getContext().disable(GL_CULL_FACE); } else { getContext().enable(GL_CULL_FACE); getContext().cullFace(desc_.cullMode == CullMode::Front ? GL_FRONT : GL_BACK); } // face winding mode getContext().frontFace((desc_.frontFaceWinding == WindingMode::Clockwise) ? GL_CW : GL_CCW); // polygon rasterization mode if (getContext().deviceFeatures().hasInternalFeature(InternalFeatures::PolygonFillMode)) { getContext().polygonFillMode((desc_.polygonFillMode == igl::PolygonFillMode::Fill) ? GL_FILL : GL_LINE); } } void RenderPipelineState::unbind() { if (desc_.shaderStages) { static_cast(desc_.shaderStages.get())->unbind(); } } // A buffer can be shared by multiple attributes. So bind all the attributes // associated with the associated buffer. // bufferOffset is an offset in bytes to the start of the vertex attributes in the buffer. // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) void RenderPipelineState::bindVertexAttributes(size_t bufferIndex, size_t bufferOffset) { #if IGL_DEBUG_ABORT_ENABLED static GLint sMaxNumVertexAttribs = 0; if (0 == sMaxNumVertexAttribs) { getContext().getIntegerv(GL_MAX_VERTEX_ATTRIBS, &sMaxNumVertexAttribs); } #endif const auto& attribList = static_cast(desc_.vertexInputState.get()) ->getAssociatedAttributes(bufferIndex); auto& locations = bufferAttribLocations_[bufferIndex]; // attributeList and locations should have an 1-to-1 correspondence IGL_DEBUG_ASSERT(attribList.size() == locations.size()); for (size_t i = 0, iLen = attribList.size(); i < iLen; i++) { auto location = locations[i]; if (location < 0) { // Location not found continue; } IGL_DEBUG_ASSERT(location < sMaxNumVertexAttribs); activeAttributesLocations_.push_back(location); prevPipelineStateAttributesLocations_.erase( std::remove(prevPipelineStateAttributesLocations_.begin(), prevPipelineStateAttributesLocations_.end(), location), prevPipelineStateAttributesLocations_.end()); getContext().enableVertexAttribArray(location); const auto& attribute = attribList[i]; getContext().vertexAttribPointer( location, attribute.numComponents, attribute.componentType, attribute.normalized, attribute.stride, reinterpret_cast(attribute.bufferOffset) + // NOLINT(performance-no-int-to-ptr) bufferOffset); if (getContext().deviceFeatures().hasInternalFeature(InternalFeatures::VertexAttribDivisor)) { if (attribute.sampleFunction == igl::VertexSampleFunction::PerVertex) { getContext().vertexAttribDivisor(location, 0); } else if (attribute.sampleFunction == igl::VertexSampleFunction::Instance) { getContext().vertexAttribDivisor(location, attribute.sampleRate); } else { getContext().vertexAttribDivisor(location, 0); } } } } void RenderPipelineState::unbindVertexAttributes() { for (const auto& l : activeAttributesLocations_) { getContext().disableVertexAttribArray(l); } activeAttributesLocations_.clear(); } void RenderPipelineState::unbindPrevPipelineVertexAttributes() { for (const auto& l : prevPipelineStateAttributesLocations_) { getContext().disableVertexAttribArray(l); } prevPipelineStateAttributesLocations_.clear(); } // Looks up the location the of the specified texture unit via its name, // bind the unit to the location, then activate the unit. // // Prerequisite: The shader program has to be loaded Result RenderPipelineState::bindTextureUnit(const size_t unit, uint8_t bindTarget, Texture& texture) { if (!desc_.shaderStages) { return Result{Result::Code::InvalidOperation, "No shader set\n"}; } if (unit >= IGL_TEXTURE_SAMPLERS_MAX) { return Result{Result::Code::ArgumentInvalid, "Unit specified greater than maximum\n"}; } GLint samplerLocation = -1; if (bindTarget == igl::BindTarget::kVertex) { auto it = vertexTextureUnitRemap_.find(unit); if (it == vertexTextureUnitRemap_.end()) { return Result{Result::Code::RuntimeError, "Unable to find sampler location\n"}; } auto realUnit = it->second; samplerLocation = unitSamplerLocationMap_[realUnit]; } else { samplerLocation = unitSamplerLocationMap_[unit]; } if (samplerLocation < 0) { return Result{Result::Code::RuntimeError, "Unable to find sampler location\n"}; } getContext().activeTexture(static_cast(GL_TEXTURE0 + unit)); texture.bind(); getContext().uniform1i(samplerLocation, static_cast(unit)); return Result(); } bool RenderPipelineState::matchesShaderProgram(const RenderPipelineState& rhs) const { return static_cast(desc_.shaderStages.get())->getProgramID() == static_cast(rhs.desc_.shaderStages.get())->getProgramID(); } bool RenderPipelineState::matchesVertexInputState(const RenderPipelineState& rhs) const { return desc_.vertexInputState == rhs.desc_.vertexInputState; } int RenderPipelineState::getIndexByName(const NameHandle& name, ShaderStage /*stage*/) const { if (reflection_ == nullptr) { return -1; } return reflection_->getIndexByName(name); } int RenderPipelineState::getIndexByName(const std::string& name, ShaderStage /*stage*/) const { if (reflection_ == nullptr) { return -1; } return reflection_->getIndexByName(igl::genNameHandle(name)); } int RenderPipelineState::getUniformBlockBindingPoint(const NameHandle& uniformBlockName) const { return getIndexByName(uniformBlockName, ShaderStage::Fragment); } std::shared_ptr RenderPipelineState::renderPipelineReflection() { return reflection_; } void RenderPipelineState::setRenderPipelineReflection( const IRenderPipelineReflection& renderPipelineReflection) { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); (void)renderPipelineReflection; } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/RenderPipelineState.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include #include #include namespace igl::opengl { struct BlendMode { GLenum blendOpColor; GLenum blendOpAlpha; GLenum srcColor; GLenum dstColor; GLenum srcAlpha; GLenum dstAlpha; }; class RenderPipelineState final : public WithContext, public IRenderPipelineState { friend class Device; Result create(); public: explicit RenderPipelineState(IContext& context, const RenderPipelineDesc& desc, Result* outResult); ~RenderPipelineState() override; void bind(); void unbind(); Result bindTextureUnit(size_t unit, uint8_t bindTarget, Texture& texture); void bindVertexAttributes(size_t bufferIndex, size_t offset); void unbindVertexAttributes(); [[nodiscard]] bool matchesShaderProgram(const RenderPipelineState& rhs) const; [[nodiscard]] bool matchesVertexInputState(const RenderPipelineState& rhs) const; [[nodiscard]] int getIndexByName(const NameHandle& name, ShaderStage stage) const override; [[nodiscard]] int getIndexByName(const std::string& name, ShaderStage stage) const override; [[nodiscard]] int getUniformBlockBindingPoint(const NameHandle& uniformBlockName) const; [[nodiscard]] std::shared_ptr renderPipelineReflection() override; void setRenderPipelineReflection( const IRenderPipelineReflection& renderPipelineReflection) override; [[nodiscard]] static GLenum convertBlendOp(BlendOp value); [[nodiscard]] static GLenum convertBlendFactor(BlendFactor value); [[nodiscard]] CullMode getCullMode() const { return desc_.cullMode; } [[nodiscard]] WindingMode getWindingMode() const { return desc_.frontFaceWinding; } [[nodiscard]] PolygonFillMode getPolygonFillMode() const { return desc_.polygonFillMode; } [[nodiscard]] const ShaderStages* getShaderStages() const { return static_cast(desc_.shaderStages.get()); } void savePrevPipelineStateAttributesLocations(RenderPipelineState& prevPipelineState) { prevPipelineStateAttributesLocations_ = std::move(prevPipelineState.activeAttributesLocations_); } void clearActiveAttributesLocations() { activeAttributesLocations_.clear(); } void unbindPrevPipelineVertexAttributes(); private: // Tracks a list of attribute locations associated with a bufferIndex std::vector bufferAttribLocations_[IGL_BUFFER_BINDINGS_MAX]; std::shared_ptr reflection_; std::unordered_map vertexTextureUnitRemap_; std::array unitSamplerLocationMap_{}; std::unordered_map uniformBlockBindingMap_; std::array colorMask_ = {GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE}; std::vector prevPipelineStateAttributesLocations_; std::vector activeAttributesLocations_; BlendMode blendMode_ = {GL_FUNC_ADD, GL_FUNC_ADD, GL_ONE, GL_ZERO, GL_ONE, GL_ZERO}; bool blendEnabled_ = false; bool uniformBlockBindingPointSet_ = false; }; } // namespace igl::opengl ================================================ FILE: src/igl/opengl/SamplerState.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include namespace igl::opengl { namespace { bool isPowerOfTwo(size_t number) { return (number & (number - 1)) == 0; } } // namespace SamplerState::SamplerState(IContext& context, const SamplerStateDesc& desc) : WithContext(context), minMipFilter_(convertMinMipFilter(desc.minFilter, desc.mipFilter)), magFilter_(convertMagFilter(desc.magFilter)), mipLodMin_(desc.mipLodMin), mipLodMax_(desc.mipLodMax), maxAnisotropy_(desc.maxAnisotropic), addressU_(convertAddressMode(desc.addressModeU)), addressV_(convertAddressMode(desc.addressModeV)), addressW_(convertAddressMode(desc.addressModeW)), depthCompareFunction_(DepthStencilState::convertCompareFunction(desc.depthCompareFunction)), depthCompareEnabled_(desc.depthCompareEnabled), isYUV_(desc.yuvFormat != igl::TextureFormat::Invalid) { const std::hash h; hash_ = h(desc); } void SamplerState::bind(ITexture* t) { if (IGL_DEBUG_VERIFY_NOT(t == nullptr)) { return; } auto* texture = static_cast(t); if (texture->getSamplerHash() == hash_) { return; } texture->setSamplerHash(hash_); auto type = texture->getType(); auto target = texture->toGLTarget(type); if (target == 0) { return; } const auto& deviceFeatures = getContext().deviceFeatures(); const bool isDepthOrDepthStencil = texture->getProperties().isDepthOrDepthStencil(); // From OpenGL ES 3.1 spec // The effective internal format specified for the texture arrays is a sized internal depth or // depth and stencil format (see table 8.14), the value of TEXTURE_COMPARE_MODE is NONE , and // either the magnification filter is not NEAREST or the minification filter is neither // NEAREST nor NEAREST_MIPMAP_NEAREST. if (!depthCompareEnabled_ && isDepthOrDepthStencil && minMipFilter_ != GL_NEAREST && minMipFilter_ != GL_NEAREST_MIPMAP_NEAREST) { IGL_LOG_INFO_ONCE( "OpenGL requires a GL_NEAREST or NEAREST_MIPMAP_NEAREST min filter for depth/stencil " "samplers when DepthCompareEnabled is false, falling back to supported mode instead of " "requested format."); auto supportedMode = GL_NEAREST; if (minMipFilter_ == GL_LINEAR_MIPMAP_NEAREST || minMipFilter_ == GL_NEAREST_MIPMAP_LINEAR || minMipFilter_ == GL_LINEAR_MIPMAP_LINEAR) { supportedMode = GL_NEAREST_MIPMAP_NEAREST; } getContext().texParameteri(target, GL_TEXTURE_MIN_FILTER, supportedMode); } else { getContext().texParameteri(target, GL_TEXTURE_MIN_FILTER, minMipFilter_); } if (!depthCompareEnabled_ && isDepthOrDepthStencil && magFilter_ != GL_NEAREST) { IGL_LOG_INFO_ONCE( "OpenGL requires a GL_NEAREST mag filter for depth/stencil samplers when " "DepthCompareEnabled is false, falling back to GL_NEAREST instead of requested format."); getContext().texParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); } else { getContext().texParameteri(target, GL_TEXTURE_MAG_FILTER, magFilter_); } // See https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glTexParameter.xml // for OpenGL version information. // Ensure we have mipmaps before setting this state. This should also catch special // texture types that may not support mipmaps, like ExternalOES textures on Android if (texture->getNumMipLevels() > 1 && deviceFeatures.hasFeature(DeviceFeatures::SamplerMinMaxLod)) { getContext().texParameteri(target, GL_TEXTURE_MIN_LOD, mipLodMin_); getContext().texParameteri(target, GL_TEXTURE_MAX_LOD, mipLodMax_); } if (deviceFeatures.hasFeature(DeviceFeatures::TextureFilterAnisotropic)) { // @fb-only // Disable the anisotropic filter for now, it's causing a crash on some devices #if 0 getContext().texParameteri(target, GL_TEXTURE_MAX_ANISOTROPY, maxAnisotropy_); #else (void)maxAnisotropy_; #endif } if (isDepthOrDepthStencil && deviceFeatures.hasInternalFeature(InternalFeatures::TextureCompare)) { getContext().texParameteri(target, GL_TEXTURE_COMPARE_MODE, depthCompareEnabled_ ? GL_COMPARE_REF_TO_TEXTURE : GL_NONE); getContext().texParameteri(target, GL_TEXTURE_COMPARE_FUNC, depthCompareFunction_); } if (!deviceFeatures.hasFeature(DeviceFeatures::TextureNotPot)) { const auto dimensions = texture->getDimensions(); if (!isPowerOfTwo(dimensions.width) || !isPowerOfTwo(dimensions.height)) { getContext().texParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); getContext().texParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); } else { getContext().texParameteri(target, GL_TEXTURE_WRAP_S, addressU_); getContext().texParameteri(target, GL_TEXTURE_WRAP_T, addressV_); } } else { getContext().texParameteri(target, GL_TEXTURE_WRAP_S, addressU_); getContext().texParameteri(target, GL_TEXTURE_WRAP_T, addressV_); } if (type == TextureType::TwoDArray || type == TextureType::ThreeD) { getContext().texParameteri(target, GL_TEXTURE_WRAP_R, addressW_); } } // utility functions for converting from IGL sampler state enums to GL enums GLint SamplerState::convertMinMipFilter(SamplerMinMagFilter minFilter, SamplerMipFilter mipFilter) { switch (mipFilter) { case SamplerMipFilter::Disabled: return (minFilter == SamplerMinMagFilter::Nearest) ? GL_NEAREST : GL_LINEAR; case SamplerMipFilter::Nearest: return (minFilter == SamplerMinMagFilter::Nearest) ? GL_NEAREST_MIPMAP_NEAREST : GL_LINEAR_MIPMAP_NEAREST; case SamplerMipFilter::Linear: return (minFilter == SamplerMinMagFilter::Nearest) ? GL_NEAREST_MIPMAP_LINEAR : GL_LINEAR_MIPMAP_LINEAR; } return 0; } GLint SamplerState::convertMagFilter(SamplerMinMagFilter magFilter) { return (magFilter == SamplerMinMagFilter::Nearest) ? GL_NEAREST : GL_LINEAR; } SamplerMinMagFilter SamplerState::convertGLMagFilter(GLint glMagFilter) { return (glMagFilter == GL_NEAREST) ? SamplerMinMagFilter::Nearest : SamplerMinMagFilter::Linear; } SamplerMinMagFilter SamplerState::convertGLMinFilter(GLint glMinFilter) { switch (glMinFilter) { case GL_NEAREST: case GL_NEAREST_MIPMAP_NEAREST: case GL_NEAREST_MIPMAP_LINEAR: return SamplerMinMagFilter::Nearest; case GL_LINEAR: case GL_LINEAR_MIPMAP_NEAREST: case GL_LINEAR_MIPMAP_LINEAR: return SamplerMinMagFilter::Linear; default: #ifndef GTEST IGL_DEBUG_ASSERT_NOT_REACHED(); #endif } return SamplerMinMagFilter::Nearest; } SamplerMipFilter SamplerState::convertGLMipFilter(GLint glMinFilter) { switch (glMinFilter) { case GL_NEAREST: case GL_LINEAR: return SamplerMipFilter::Disabled; case GL_NEAREST_MIPMAP_NEAREST: case GL_LINEAR_MIPMAP_NEAREST: return SamplerMipFilter::Nearest; case GL_NEAREST_MIPMAP_LINEAR: case GL_LINEAR_MIPMAP_LINEAR: return SamplerMipFilter::Linear; default: IGL_DEBUG_ASSERT_NOT_REACHED(); return SamplerMipFilter::Disabled; } IGL_UNREACHABLE_RETURN(SamplerMipFilter::Disabled) } GLint SamplerState::convertAddressMode(SamplerAddressMode addressMode) { switch (addressMode) { case SamplerAddressMode::Repeat: return GL_REPEAT; case SamplerAddressMode::Clamp: return GL_CLAMP_TO_EDGE; case SamplerAddressMode::MirrorRepeat: return GL_MIRRORED_REPEAT; } return 0; } SamplerAddressMode SamplerState::convertGLAddressMode(GLint glAddressMode) { switch (glAddressMode) { case GL_REPEAT: return SamplerAddressMode::Repeat; case GL_CLAMP_TO_EDGE: return SamplerAddressMode::Clamp; case GL_MIRRORED_REPEAT: return SamplerAddressMode::MirrorRepeat; default: return SamplerAddressMode::Repeat; } IGL_UNREACHABLE_RETURN(SamplerAddressMode::Repeat) } bool SamplerState::isYUV() const noexcept { return isYUV_; } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/SamplerState.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::opengl { class SamplerState final : public WithContext, public ISamplerState { public: SamplerState(IContext& context, const SamplerStateDesc& desc); void bind(ITexture* texture); static GLint convertMinMipFilter(SamplerMinMagFilter minFilter, SamplerMipFilter mipFilter); static GLint convertMagFilter(SamplerMinMagFilter magFilter); static GLint convertAddressMode(SamplerAddressMode addressMode); static SamplerAddressMode convertGLAddressMode(GLint glAddressMode); static SamplerMinMagFilter convertGLMagFilter(GLint magFilter); static SamplerMinMagFilter convertGLMinFilter(GLint minFilter); static SamplerMipFilter convertGLMipFilter(GLint minFilter); /** * @brief Returns true if this sampler is a YUV sampler. */ [[nodiscard]] bool isYUV() const noexcept override; private: size_t hash_ = std::numeric_limits::max(); GLint minMipFilter_; GLint magFilter_; GLfloat mipLodMin_; GLfloat mipLodMax_; GLfloat maxAnisotropy_; GLint addressU_; GLint addressV_; GLint addressW_; GLint depthCompareFunction_; bool depthCompareEnabled_; bool isYUV_; }; } // namespace igl::opengl ================================================ FILE: src/igl/opengl/Shader.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #if IGL_SHADER_DUMP #include #include #endif // IGL_SHADER_DUMP namespace igl::opengl { ShaderStages::ShaderStages(const ShaderStagesDesc& desc, IContext& context) : IShaderStages(desc), WithContext(context) {} ShaderStages::~ShaderStages() { if (programID_ != 0) { getContext().deleteProgram(programID_); programID_ = 0; } } void ShaderStages::createRenderProgram(Result* result) { if (!IGL_DEBUG_VERIFY(getVertexModule())) { // we need a vertex shader and a fragment shader in order to link the program Result::setResult( result, Result::Code::ArgumentInvalid, "Missing required vertex shader stage"); return; } if (!IGL_DEBUG_VERIFY(getFragmentModule())) { // we need a vertex shader and a fragment shader in order to link the program Result::setResult( result, Result::Code::ArgumentInvalid, "Missing required fragment shader stage"); return; } const auto& vertexShader = static_cast(*getVertexModule()); const auto& fragmentShader = static_cast(*getFragmentModule()); const GLuint vertexShaderID = vertexShader.getShaderID(); const GLuint fragmentShaderID = fragmentShader.getShaderID(); if (vertexShaderID == 0 || fragmentShaderID == 0) { // we need valid shaders in order to link the program Result::setResult(result, Result::Code::ArgumentInvalid, "Missing required shader stages"); return; } // always create a new temp program ID // we'll set or update this object's program ID after the linking succeeds // otherwise we won't modify this program, so we can still use it const GLuint programID = getContext().createProgram(); if (programID == 0) { Result::setResult(result, Result::Code::RuntimeError, "Failed to create GL program"); return; } // attach the shaders and link them getContext().attachShader(programID, vertexShaderID); getContext().attachShader(programID, fragmentShaderID); getContext().linkProgram(programID); // detach the shaders now that they've been linked getContext().detachShader(programID, vertexShaderID); getContext().detachShader(programID, fragmentShaderID); // check to see if the linking succeeded GLint status = 0; getContext().getProgramiv(programID, GL_LINK_STATUS, &status); if (status == GL_FALSE) { const std::string errorLog = getProgramInfoLog(programID); IGL_LOG_ERROR("failed to link shaders:\n%s\n", errorLog.c_str()); getContext().deleteProgram(programID); Result::setResult(result, Result::Code::RuntimeError, errorLog); return; } // now that the program successfully linked, set the program if (programID_ != 0) { getContext().deleteProgram(programID_); } programID_ = programID; Result::setResult(result, Result::Code::Ok); } void ShaderStages::createComputeProgram(Result* result) { if (!IGL_DEBUG_VERIFY(getComputeModule())) { // we need a vertex shader and a fragment shader in order to link the program Result::setResult(result, Result::Code::ArgumentInvalid, "Missing required compute shader"); return; } const auto& shader = static_cast(*getComputeModule()); const GLuint shaderID = shader.getShaderID(); if (shaderID == 0) { // we need valid shaders in order to link the program Result::setResult(result, Result::Code::ArgumentInvalid, "Missing required compute stage"); return; } // always create a new temp program ID // we'll set or update this object's program ID after the linking succeeds // otherwise we won't modify this program, so we can still use it const GLuint programID = getContext().createProgram(); if (programID == 0) { Result::setResult(result, Result::Code::RuntimeError, "Failed to create compute GL program"); return; } // attach the shaders and link them getContext().attachShader(programID, shaderID); getContext().linkProgram(programID); // detach the shaders now that they've been linked getContext().detachShader(programID, shaderID); // check to see if the linking succeeded GLint status = 0; getContext().getProgramiv(programID, GL_LINK_STATUS, &status); if (status == GL_FALSE) { const std::string errorLog = getProgramInfoLog(programID); IGL_LOG_ERROR("failed to link compute shaders:\n%s\n", errorLog.c_str()); getContext().deleteProgram(programID); Result::setResult(result, Result::Code::RuntimeError, errorLog); return; } // now that the program successfully linked, set the program if (programID_ != 0) { getContext().deleteProgram(programID_); } programID_ = programID; Result::setResult(result, Result::Code::Ok); } // link the given shaders into this shader program Result ShaderStages::create(const ShaderStagesDesc& /*desc*/) { Result result; if (getType() == ShaderStagesType::Render) { createRenderProgram(&result); } else if (getType() == ShaderStagesType::Compute) { createComputeProgram(&result); } else { IGL_DEBUG_ASSERT_NOT_REACHED(); } return result; } Result ShaderStages::validate() const { getContext().validateProgram(programID_); GLint status = 0; getContext().getProgramiv(programID_, GL_VALIDATE_STATUS, &status); if (status == GL_FALSE) { std::string errorLog = getProgramInfoLog(programID_); IGL_LOG_ERROR("Failed to validate program:\n%s\n", errorLog.c_str()); return Result(Result::Code::RuntimeError, std::move(errorLog)); } return Result{}; } void ShaderStages::bind() const { getContext().useProgram(programID_); } void ShaderStages::unbind() const { getContext().useProgram(0); } ShaderModule::ShaderModule(IContext& context, ShaderModuleInfo info) : WithContext(context), IShaderModule(std::move(info)) {} ShaderModule::~ShaderModule() { if (getContext().isDestructionAllowed() && shaderID_ != 0) { getContext().deleteShader(shaderID_); shaderID_ = 0; } } // compile the shader from the given src shader code Result ShaderModule::create(const ShaderModuleDesc& desc) { if (desc.input.type == ShaderInputType::Binary) { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); return Result(Result::Code::Unimplemented); } if (!desc.input.source || (*desc.input.source == '\0')) { Result result(Result::Code::ArgumentNull, "Null shader source"); return result; } switch (desc.info.stage) { case ShaderStage::Vertex: shaderType_ = GL_VERTEX_SHADER; break; case ShaderStage::Fragment: shaderType_ = GL_FRAGMENT_SHADER; break; case ShaderStage::Compute: if (getContext().deviceFeatures().hasFeature(DeviceFeatures::Compute)) { shaderType_ = GL_COMPUTE_SHADER; break; } else { return Result(Result::Code::Unimplemented, "Compute shader for GL is not implemented"); } default: IGL_LOG_ERROR("Shader stage type %u for GL is not supported", static_cast(desc.info.stage)); return Result(Result::Code::ArgumentInvalid, "Unknown shader type"); } // always create a new temp shader ID // we'll set or update this object's shader ID after the compilation succeeds // otherwise we won't modify this shader const GLuint shaderID = getContext().createShader(shaderType_); if (shaderID == 0) { return Result(Result::Code::RuntimeError, "Failed to create shader ID"); } if (!desc.debugName.empty() && getContext().deviceFeatures().hasInternalFeature(InternalFeatures::DebugLabel)) { const GLenum identifier = getContext().deviceFeatures().hasInternalRequirement( InternalRequirement::DebugLabelExtEnumsReq) ? GL_SHADER_OBJECT_EXT : GL_SHADER; getContext().objectLabel(identifier, shaderID, desc.debugName.size(), desc.debugName.c_str()); } // compile the shader const GLchar* src = (GLchar*)desc.input.source; #if IGL_SHADER_DUMP auto hash = std::hash()(src); std::string shaderStageExt; switch (desc.info.stage) { case ShaderStage::Vertex: shaderStageExt = ".vert"; break; case ShaderStage::Fragment: shaderStageExt = ".frag"; break; case ShaderStage::Compute: default: shaderStageExt = ".compute"; } // Replace filename with your own path according to the platform and recompile. // Ex. for Android your filepath should be specific to the package name: // /sdcard/Android/data//files/ std::string filename = "/" + std::to_string(hash) + shaderStageExt + ".glsl"; if (!std::filesystem::exists(filename)) { std::ofstream glslFile; glslFile.open(filename, std::ios::out); glslFile.write(src, (strlen(src))); glslFile.close(); IGL_LOG_INFO("Shader dumped to file %s", filename.c_str()); } #endif // IGL_SHADER_DUMP getContext().shaderSource(shaderID, 1, &src, nullptr); getContext().compileShader(shaderID); // see if the compilation succeeded GLint status = 0; getContext().getShaderiv(shaderID, GL_COMPILE_STATUS, &status); if (status == GL_FALSE) { // Get the size of log GLsizei logSize = 0; getContext().getShaderiv(shaderID, GL_INFO_LOG_LENGTH, &logSize); // Pre-allocate vector for storage std::vector log(logSize); getContext().getShaderInfoLog(shaderID, logSize, nullptr, log.data()); // Create actual string from it const std::string errorLog(log.begin(), log.end()); IGL_LOG_ERROR("failed to compile %s shader:\n%s\nSource\n%s", (shaderType_ == GL_VERTEX_SHADER ? "vertex" : "fragment"), errorLog.c_str(), src); // Delete shader to make sure that we don't have dangling resources getContext().deleteShader(shaderID); // Report back. return Result(Result::Code::ArgumentInvalid, errorLog); } // now that the shader successfully compiled, set the shader if (shaderID_ != 0) { getContext().deleteShader(shaderID_); } shaderID_ = shaderID; hash_ = std::hash()(std::string_view(desc.input.source, strlen(desc.input.source))); return Result(); } std::string ShaderStages::getProgramInfoLog(GLuint programID) const { // Get the size of log GLsizei logSize = 0; getContext().getProgramiv(programID, GL_INFO_LOG_LENGTH, &logSize); // Pre-allocate vector for storage std::vector log(logSize); getContext().getProgramInfoLog(programID, logSize, nullptr, log.data()); // Create actual string from it return {log.begin(), log.end()}; } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/Shader.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include namespace igl { class ICommandBuffer; namespace opengl { class ShaderModule : public WithContext, public IShaderModule { friend class Device; public: ~ShaderModule() override; Result create(const ShaderModuleDesc& desc); [[nodiscard]] inline GLenum getShaderType() const { return shaderType_; } [[nodiscard]] inline GLuint getShaderID() const { return shaderID_; } [[nodiscard]] inline size_t getHash() const { return hash_; } ShaderModule(IContext& context, ShaderModuleInfo info); ShaderModule(const ShaderModule&) = delete; ShaderModule& operator=(const ShaderModule&) = delete; ShaderModule(ShaderModule&&) = delete; ShaderModule& operator=(ShaderModule&&) = delete; private: // Type of shader (vertex, fragment, compute) GLenum shaderType_ = 0; // The GL shader object ID GLuint shaderID_ = 0; // Hash of the shader source size_t hash_ = 0; }; class ShaderStages final : public IShaderStages, public WithContext { friend class PipelineState; public: explicit ShaderStages(const ShaderStagesDesc& desc, IContext& context); ~ShaderStages() override; ShaderStages(const ShaderStages&) = delete; ShaderStages& operator=(const ShaderStages&) = delete; ShaderStages(ShaderStages&&) = delete; ShaderStages& operator=(ShaderStages&&) = delete; Result create(const ShaderStagesDesc& /*desc*/); [[nodiscard]] Result validate() const; void bind() const; void unbind() const; [[nodiscard]] GLuint getProgramID() const { return programID_; } private: void createRenderProgram(Result* result); void createComputeProgram(Result* result); [[nodiscard]] std::string getProgramInfoLog(GLuint programID) const; // the GL shader program ID GLuint programID_ = 0; }; } // namespace opengl } // namespace igl ================================================ FILE: src/igl/opengl/Texture.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace igl::opengl { Dimensions Texture::getDimensions() const { return Dimensions{ static_cast(width_), static_cast(height_), static_cast(depth_)}; } uint32_t Texture::getNumLayers() const { return numLayers_; } uint32_t Texture::getSamples() const { return numSamples_; } void Texture::generateMipmap(ICommandQueue& /* unused */, const TextureRangeDesc* IGL_NULLABLE /* unused */) const { IGL_DEBUG_ABORT("Can only generate mipmap for R/W texture (eg. TextureBuffer)."); } void Texture::generateMipmap(ICommandBuffer& /* unused */, const TextureRangeDesc* IGL_NULLABLE /* unused */) const { IGL_DEBUG_ABORT("Can only generate mipmap for R/W texture (eg. TextureBuffer)."); } uint32_t Texture::getNumMipLevels() const { return numMipLevels_; } bool Texture::isRequiredGenerateMipmap() const { return false; } uint64_t Texture::getTextureId() const { // this requires ARB_bindless_texture IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); return 0; } TextureDesc::TextureMipmapGeneration Texture::getMipmapGeneration() const { return mipmapGeneration_; } bool Texture::isSwapchainTexture() const { return isImplicitStorage(); } bool Texture::canPresent() const noexcept { #if IGL_PLATFORM_IOS // On iOS, presentRenderbuffer is only supported for textures created with EAGLContext's // renderbufferStorage method. return false; #else return true; #endif } Result Texture::create(const TextureDesc& desc, bool hasStorageAlready) { Result result; if (desc.numLayers > 1 && desc.type != TextureType::TwoDArray) { return Result{Result::Code::Unsupported, "Array textures are only supported when type is TwoDArray."}; } if (desc.exportability != TextureDesc::TextureExportability::NoExport) { return Result{Result::Code::Unimplemented, "Exportable textures are not supported on this platform."}; } if (IGL_DEBUG_VERIFY(!isCreated_)) { isCreated_ = true; IGL_DEBUG_ASSERT(desc.format != TextureFormat::Invalid && desc.format == getFormat()); const bool isSampled = (desc.usage & TextureDesc::TextureUsageBits::Sampled) != 0; if (isSampled && hasStorageAlready) { result = Result(Result::Code::Unsupported, "TextureUsageBits::Sampled and hasStorageAlready unsupported on GLES (we " "can't read from an EAGLLayer backed renderbuffer)"); } width_ = (GLsizei)desc.width; height_ = (GLsizei)desc.height; depth_ = desc.depth; type_ = desc.type; numLayers_ = desc.numLayers; numSamples_ = desc.numSamples; numMipLevels_ = desc.numMipLevels; mipmapGeneration_ = desc.mipmapGeneration; if (!getContext().deviceFeatures().hasFeature(DeviceFeatures::TexturePartialMipChain)) { // For ES 2.0, we have to ignore numMipLevels_ const auto maxNumMipLevels = TextureDesc::calcNumMipLevels(width_, height_, depth_); if (numMipLevels_ > 1 && numMipLevels_ != maxNumMipLevels) { IGL_LOG_ERROR("Partial mip chains are not supported so numMipLevels_ will be set to %d", maxNumMipLevels); numMipLevels_ = maxNumMipLevels; } } } else { result = Result(Result::Code::InvalidOperation, "Texture already created"); } return result; } // Gets pack/unpack alignment for pixelStorei // stride is the number of bytes for a row of the image (image width * bytes per pixel)+padding // // openGL only uses alignment instead of stride when reading/writing pixels so it will not support // padding that is not 8, 4, 2, or 1 byte aligned to the actual pixel data // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) GLint Texture::getAlignment(uint32_t stride, uint32_t mipLevel, uint32_t widthAtMipLevel) const { IGL_DEBUG_ASSERT(mipLevel < numMipLevels_); if (getProperties().isCompressed()) { return 1; } // Clamp to 1 to account for non-square textures. const auto maxWidthAtMipLevel = std::max(getDimensions().width >> mipLevel, 1u); if (widthAtMipLevel == 0) { widthAtMipLevel = maxWidthAtMipLevel; } else if (IGL_DEBUG_VERIFY_NOT(widthAtMipLevel > maxWidthAtMipLevel)) { widthAtMipLevel = maxWidthAtMipLevel; } const auto pixelBytesPerRow = getProperties().getBytesPerRow(widthAtMipLevel); if (stride == 0 || !IGL_DEBUG_VERIFY(pixelBytesPerRow <= stride)) { return 1; } else if (stride % 8 == 0) { return 8; } else if (stride % 4 == 0) { return 4; } else if (stride % 2 == 0) { return 2; } else { return 1; } } bool Texture::isImplicitStorage() const { return false; } GLenum Texture::toGLTarget(TextureType type) const { switch (type) { case TextureType::TwoD: return GL_TEXTURE_2D; case TextureType::TwoDArray: if (getContext().deviceFeatures().hasFeature(DeviceFeatures::Texture2DArray)) { return GL_TEXTURE_2D_ARRAY; } break; case TextureType::ThreeD: if (getContext().deviceFeatures().hasFeature(DeviceFeatures::Texture3D)) { return GL_TEXTURE_3D; } break; case TextureType::Cube: return GL_TEXTURE_CUBE_MAP; case TextureType::ExternalImage: if (getContext().deviceFeatures().hasFeature(DeviceFeatures::TextureExternalImage)) { return GL_TEXTURE_EXTERNAL_OES; } break; case TextureType::Invalid: break; } IGL_DEBUG_ABORT("Unsupported OGL Texture Type: %d", type); return 0; } // Whenever possible the caller should have the incoming format in // igl::TextureFormat thus not use this function. For the cases when this // is not possible, e.g. dictated by a file header, then this function // can convert GL Texture format into IGL Texture Format // This method assumes no swizzling is required (eg. GL_RED results in R_UNorm8 but it could be // A_UNorm8 with swizzling) TextureFormat Texture::glInternalFormatToTextureFormat(GLuint glTexInternalFormat, GLuint glTexFormat, GLuint glTexType) { return util::glTextureFormatToTextureFormat(static_cast(glTexInternalFormat), static_cast(glTexFormat), static_cast(glTexType)); } bool Texture::toFormatDescGL(TextureFormat textureFormat, TextureDesc::TextureUsage usage, FormatDescGL& outFormatGL) const { return toFormatDescGL(getContext(), textureFormat, usage, outFormatGL); } bool Texture::toFormatDescGL(const IContext& ctx, TextureFormat textureFormat, TextureDesc::TextureUsage usage, FormatDescGL& outFormatGL) { const auto& deviceFeatures = ctx.deviceFeatures(); // TODO: Remove these fallbacks once devices can properly provide a supported format if (textureFormat == TextureFormat::S8_UInt_Z32_UNorm && !deviceFeatures.hasTextureFeature(TextureFeatures::Depth32FStencil8)) { textureFormat = TextureFormat::S8_UInt_Z24_UNorm; } if (textureFormat == TextureFormat::Z_UNorm24) { if ((usage & TextureDesc::TextureUsageBits::Sampled) != 0 && !deviceFeatures.hasTextureFeature(TextureFeatures::DepthTexImage24)) { textureFormat = TextureFormat::Z_UNorm32; } if ((usage & TextureDesc::TextureUsageBits::Attachment) != 0 && !deviceFeatures.hasTextureFeature(TextureFeatures::DepthRenderbuffer24)) { textureFormat = TextureFormat::Z_UNorm32; } if ((usage & TextureDesc::TextureUsageBits::Storage) != 0 && !deviceFeatures.hasTextureFeature(TextureFeatures::DepthTexStorage24)) { textureFormat = TextureFormat::Z_UNorm32; } } const bool sampled = (usage & TextureDesc::TextureUsageBits::Sampled) != 0; bool attachment = (usage & TextureDesc::TextureUsageBits::Attachment) != 0; const bool storage = (usage & TextureDesc::TextureUsageBits::Storage) != 0; bool sampledAttachment = sampled && attachment; bool sampledOnly = sampled && !attachment; bool attachmentOnly = attachment && !sampled; // Sanity check capabilities auto capabilities = deviceFeatures.getTextureFormatCapabilities(textureFormat); // Fallback for Z_UNorm32, some devices capabilities do not support this format, // usually Z_UNorm24 would suffice. if (capabilities == 0 && (textureFormat == TextureFormat::Z_UNorm32)) { IGL_LOG_INFO("Device does not support 32-bit depth format (%s). Falling back to 24-bit\n", TextureFormatProperties::fromTextureFormat(textureFormat).name); textureFormat = TextureFormat::Z_UNorm24; capabilities = deviceFeatures.getTextureFormatCapabilities(textureFormat); if (capabilities == 0) { IGL_LOG_INFO("Device does not support 24-bit depth format (%s). Falling back to 16-bit\n", TextureFormatProperties::fromTextureFormat(textureFormat).name); textureFormat = TextureFormat::Z_UNorm16; capabilities = deviceFeatures.getTextureFormatCapabilities(TextureFormat::Z_UNorm16); if (capabilities == 0) { IGL_LOG_ERROR("Device does not support basic 16-bit depth format (%s). Erroring out\n", TextureFormatProperties::fromTextureFormat(textureFormat).name); return false; } } } if (attachmentOnly && (capabilities & ICapabilities::TextureFormatCapabilityBits::Attachment) == 0) { IGL_LOG_ERROR("Texture format %s does not support Attachment usage.\n", TextureFormatProperties::fromTextureFormat(textureFormat).name); return false; } if (sampledOnly && (capabilities & ICapabilities::TextureFormatCapabilityBits::Sampled) == 0) { IGL_LOG_ERROR("Texture format %s does not support Sampled usage.\n", TextureFormatProperties::fromTextureFormat(textureFormat).name); return false; } if (storage && (capabilities & ICapabilities::TextureFormatCapabilityBits::Storage) == 0) { IGL_LOG_ERROR("Texture format %s does not support Storage usage.\n", TextureFormatProperties::fromTextureFormat(textureFormat).name); return false; } if (sampledAttachment && (capabilities & ICapabilities::TextureFormatCapabilityBits::SampledAttachment) == 0) { if ((capabilities & ICapabilities::TextureFormatCapabilityBits::Sampled) != 0) { IGL_LOG_INFO( "Texture format %s does not support SampledAttachment usage. Falling back to Sampled.\n", TextureFormatProperties::fromTextureFormat(textureFormat).name); sampledAttachment = false; attachmentOnly = false; attachment = false; } else { IGL_LOG_ERROR("Texture format %s does not support SampledAttachment usage.\n", TextureFormatProperties::fromTextureFormat(textureFormat).name); return false; } } // Uncompressed textures can request RenderbufferStorage, TexStorage or TexImage. // TexStorage takes precedence over TexImage if it is requested. const bool renderbuffer = attachmentOnly; const bool texStorage = storage; const bool texImage = !storage && sampled; if (!renderbuffer && !texStorage && !texImage) { return false; } // Compressed textures formats can be used if either TexStorage or TexImage is requested. const bool compressedTexStorage = storage && deviceFeatures.hasTextureFeature(TextureFeatures::TextureCompressionTexStorage); const bool compressedTexImage = sampled; const bool compressedValid = compressedTexStorage || compressedTexImage; auto& format = outFormatGL.format; auto& type = outFormatGL.type; auto& internalFormat = outFormatGL.internalFormat; switch (textureFormat) { case TextureFormat::Invalid: return false; case TextureFormat::RGBA_UNorm8: format = GL_RGBA; type = GL_UNSIGNED_BYTE; internalFormat = GL_RGBA8; if (texImage && !deviceFeatures.hasTextureFeature(TextureFeatures::ColorTexImageRgba8)) { internalFormat = GL_RGBA; } return true; case TextureFormat::RGBA_SRGB: format = deviceFeatures.hasExtension(Extensions::Srgb) ? GL_SRGB_ALPHA : GL_RGBA; type = GL_UNSIGNED_BYTE; internalFormat = GL_SRGB8_ALPHA8; if (texImage && !deviceFeatures.hasTextureFeature(TextureFeatures::ColorTexImageSrgba8)) { internalFormat = GL_SRGB_ALPHA; } return true; case TextureFormat::BGRA_SRGB: format = GL_BGRA; type = GL_UNSIGNED_BYTE; internalFormat = GL_SRGB8_ALPHA8; if (texImage && !deviceFeatures.hasTextureFeature(TextureFeatures::ColorTexImageSrgba8)) { internalFormat = GL_SRGB_ALPHA; } return true; case TextureFormat::R4G2B2_UNorm_Apple: format = GL_RGB_422_APPLE; type = GL_UNSIGNED_SHORT_8_8_APPLE; internalFormat = GL_RGB_RAW_422_APPLE; if (texImage && deviceFeatures.hasInternalRequirement( InternalRequirement::ColorTexImageRgbApple422Unsized)) { internalFormat = GL_RGB; } return true; case TextureFormat::R4G2B2_UNorm_Rev_Apple: format = GL_RGB_422_APPLE; type = GL_UNSIGNED_SHORT_8_8_REV_APPLE; internalFormat = GL_RGB_RAW_422_APPLE; if (texImage && deviceFeatures.hasInternalRequirement( InternalRequirement::ColorTexImageRgbApple422Unsized)) { internalFormat = GL_RGB; } return true; case TextureFormat::R5G5B5A1_UNorm: format = GL_RGBA; type = GL_UNSIGNED_SHORT_5_5_5_1; internalFormat = GL_RGB5_A1; if (texImage && deviceFeatures.hasInternalRequirement(InternalRequirement::ColorTexImageRgb5A1Unsized)) { internalFormat = GL_RGBA; } return true; case TextureFormat::RGBX_UNorm8: format = GL_RGB; type = GL_UNSIGNED_BYTE; internalFormat = GL_RGB8; if (texImage && !deviceFeatures.hasTextureFeature(TextureFeatures::ColorTexImageRgba8)) { internalFormat = GL_RGB; } return true; case TextureFormat::RGBA_F32: format = GL_RGBA; type = GL_FLOAT; internalFormat = GL_RGBA32F; if (texImage && !deviceFeatures.hasTextureFeature(TextureFeatures::ColorTexImage32f)) { internalFormat = GL_RGBA; } return true; case TextureFormat::RGB_F32: format = GL_RGB; type = GL_FLOAT; internalFormat = GL_RGB32F; if (texImage && !deviceFeatures.hasTextureFeature(TextureFeatures::ColorTexImage32f)) { internalFormat = GL_RGB; } return true; case TextureFormat::RGBA_F16: format = GL_RGBA; if (deviceFeatures.hasInternalRequirement(InternalRequirement::TextureHalfFloatExtReq)) { type = GL_HALF_FLOAT_OES; // NOTE: NOT the same as GL_HALF_FLOAT } else { type = GL_HALF_FLOAT; } internalFormat = GL_RGBA16F; if (texImage && !deviceFeatures.hasTextureFeature(TextureFeatures::ColorTexImage16f)) { internalFormat = GL_RGBA; } return true; case TextureFormat::RGB_F16: format = GL_RGB; if (deviceFeatures.hasInternalRequirement(InternalRequirement::TextureHalfFloatExtReq)) { type = GL_HALF_FLOAT_OES; // NOTE: NOT the same as GL_HALF_FLOAT } else { type = GL_HALF_FLOAT; } internalFormat = GL_RGB16F; if (texImage && !deviceFeatures.hasTextureFeature(TextureFeatures::ColorTexImage16f)) { internalFormat = GL_RGB; } return true; case TextureFormat::BGRA_UNorm8: format = GL_BGRA; type = GL_UNSIGNED_BYTE; internalFormat = GL_RGBA; if (texStorage) { internalFormat = GL_BGRA8_EXT; } else if (texImage && deviceFeatures.hasExtension(Extensions::TextureFormatBgra8888Ext)) { internalFormat = GL_BGRA; } else if (texImage && deviceFeatures.hasTextureFeature(TextureFeatures::ColorTexImageBgraRgba8)) { internalFormat = GL_RGBA8; } return true; case TextureFormat::BGRA_UNorm8_Rev: internalFormat = GL_RGBA; format = GL_BGRA; type = GL_UNSIGNED_INT_8_8_8_8_REV; return true; case TextureFormat::RGB10_A2_UNorm_Rev: format = GL_RGBA; type = GL_UNSIGNED_INT_2_10_10_10_REV; internalFormat = GL_RGB10_A2; if (texImage && deviceFeatures.hasInternalRequirement(InternalRequirement::ColorTexImageRgb10A2Unsized)) { internalFormat = GL_RGBA; } return true; case TextureFormat::RGB10_A2_Uint_Rev: internalFormat = GL_RGB10_A2UI; format = GL_RGBA_INTEGER; type = GL_UNSIGNED_INT_2_10_10_10_REV; return true; case TextureFormat::BGR10_A2_Unorm: format = GL_BGRA; type = GL_UNSIGNED_INT_2_10_10_10_REV; internalFormat = GL_RGB10_A2; return true; case TextureFormat::ABGR_UNorm4: // TODO Test this format = GL_RGBA; type = GL_UNSIGNED_SHORT_4_4_4_4; internalFormat = GL_RGBA4; if (texImage && deviceFeatures.hasInternalRequirement(InternalRequirement::ColorTexImageRgba4Unsized)) { internalFormat = GL_RGBA; } return true; case TextureFormat::B5G5R5A1_UNorm: format = GL_BGRA; type = GL_UNSIGNED_SHORT_5_5_5_1; internalFormat = GL_RGB5_A1; if (texImage && deviceFeatures.hasInternalRequirement(InternalRequirement::ColorTexImageRgb5A1Unsized)) { internalFormat = GL_RGBA; } return true; case TextureFormat::B5G6R5_UNorm: return false; case TextureFormat::LA_UNorm8: format = GL_LUMINANCE_ALPHA; type = GL_UNSIGNED_BYTE; internalFormat = GL_LUMINANCE_ALPHA; if ((texStorage && deviceFeatures.hasTextureFeature(TextureFeatures::ColorTexStorageLa8)) || (texImage && deviceFeatures.hasTextureFeature(TextureFeatures::ColorTexImageLa8))) { internalFormat = GL_LUMINANCE8_ALPHA8; } return true; case TextureFormat::RG_UNorm8: format = GL_RG; type = GL_UNSIGNED_BYTE; internalFormat = GL_RG8; if (texImage && !deviceFeatures.hasTextureFeature(TextureFeatures::ColorTexImageRg8)) { internalFormat = GL_RG; } return true; case TextureFormat::RG_F16: format = GL_RG; if (deviceFeatures.hasInternalRequirement(InternalRequirement::TextureHalfFloatExtReq)) { type = GL_HALF_FLOAT_OES; // NOTE: NOT the same as GL_HALF_FLOAT } else { type = GL_HALF_FLOAT; } internalFormat = GL_RG16F; if (texImage && !deviceFeatures.hasTextureFeature(TextureFeatures::ColorTexImage16f)) { internalFormat = GL_RG; } return true; case TextureFormat::RG_F32: format = GL_RG; type = GL_FLOAT; internalFormat = GL_RG32F; if (texImage && !deviceFeatures.hasTextureFeature(TextureFeatures::ColorTexImage32f)) { internalFormat = GL_RG; } return true; case TextureFormat::RG_UInt16: internalFormat = GL_RG16UI; format = GL_RG_INTEGER; type = GL_UNSIGNED_SHORT; return true; case TextureFormat::RG_UNorm16: internalFormat = GL_RG16; format = GL_RG; type = GL_UNSIGNED_SHORT; return true; case TextureFormat::RGBA_UNorm16: internalFormat = GL_RGBA16; format = GL_RGBA; type = GL_UNSIGNED_SHORT; return true; case TextureFormat::RGBA_UInt32: internalFormat = GL_RGBA32UI; format = GL_RGBA_INTEGER; type = GL_UNSIGNED_INT; return true; case TextureFormat::A_UNorm8: type = GL_UNSIGNED_BYTE; format = GL_ALPHA; internalFormat = GL_ALPHA; if ((texImage && deviceFeatures.hasTextureFeature(TextureFeatures::ColorTexImageA8)) || (texStorage && deviceFeatures.hasTextureFeature(TextureFeatures::ColorTexStorageA8))) { if (deviceFeatures.hasInternalRequirement(InternalRequirement::SwizzleAlphaTexturesReq)) { // GL_ALPHA was deprecated in GL3 so use GL_RED and use GL_TEXTURE_SWIZZLE_A in // swapTextureChannelsForFormat before calling texImage2D or texStorage2D internalFormat = GL_R8; format = GL_RED; } else { internalFormat = GL_ALPHA8; } } return true; case TextureFormat::L_UNorm8: format = GL_LUMINANCE; type = GL_UNSIGNED_BYTE; internalFormat = GL_LUMINANCE; if ((texStorage && deviceFeatures.hasTextureFeature(TextureFeatures::ColorTexStorageLa8)) || (texImage && deviceFeatures.hasTextureFeature(TextureFeatures::ColorTexImageLa8))) { internalFormat = GL_LUMINANCE8; } return true; case TextureFormat::R_UNorm8: format = GL_RED; type = GL_UNSIGNED_BYTE; internalFormat = GL_R8; if (texImage && !deviceFeatures.hasTextureFeature(TextureFeatures::ColorTexImageRg8)) { internalFormat = GL_RED; } return true; case TextureFormat::R_F16: format = GL_RED; if (deviceFeatures.hasInternalRequirement(InternalRequirement::TextureHalfFloatExtReq)) { type = GL_HALF_FLOAT_OES; // NOTE: NOT the same as GL_HALF_FLOAT } else { type = GL_HALF_FLOAT; } internalFormat = GL_R16F; if (texImage && !deviceFeatures.hasTextureFeature(TextureFeatures::ColorTexImage16f)) { internalFormat = GL_RED; } return true; case TextureFormat::R_F32: format = GL_RED; type = GL_FLOAT; internalFormat = GL_R32F; if (texImage && !deviceFeatures.hasTextureFeature(TextureFeatures::ColorTexImage32f)) { internalFormat = GL_RED; } return true; case TextureFormat::R_UInt32: internalFormat = GL_R32UI; format = GL_RED_INTEGER; type = GL_UNSIGNED_INT; return true; case TextureFormat::R_UInt16: internalFormat = GL_R16UI; format = GL_RED_INTEGER; type = GL_UNSIGNED_SHORT; return true; case TextureFormat::R_UNorm16: internalFormat = GL_R16; format = GL_RED; type = GL_UNSIGNED_SHORT; return true; case TextureFormat::RGBA_ASTC_4x4: internalFormat = GL_COMPRESSED_RGBA_ASTC_4x4_KHR; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::SRGB8_A8_ASTC_4x4: internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::RGBA_ASTC_5x4: internalFormat = GL_COMPRESSED_RGBA_ASTC_5x4_KHR; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::SRGB8_A8_ASTC_5x4: internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::RGBA_ASTC_5x5: internalFormat = GL_COMPRESSED_RGBA_ASTC_5x5_KHR; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::SRGB8_A8_ASTC_5x5: internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::RGBA_ASTC_6x5: internalFormat = GL_COMPRESSED_RGBA_ASTC_6x5_KHR; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::SRGB8_A8_ASTC_6x5: internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::RGBA_ASTC_6x6: internalFormat = GL_COMPRESSED_RGBA_ASTC_6x6_KHR; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::SRGB8_A8_ASTC_6x6: internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::RGBA_ASTC_8x5: internalFormat = GL_COMPRESSED_RGBA_ASTC_8x5_KHR; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::SRGB8_A8_ASTC_8x5: internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::RGBA_ASTC_8x6: internalFormat = GL_COMPRESSED_RGBA_ASTC_8x6_KHR; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::SRGB8_A8_ASTC_8x6: internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::RGBA_ASTC_8x8: internalFormat = GL_COMPRESSED_RGBA_ASTC_8x8_KHR; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::SRGB8_A8_ASTC_8x8: internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::RGBA_ASTC_10x5: internalFormat = GL_COMPRESSED_RGBA_ASTC_10x5_KHR; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::SRGB8_A8_ASTC_10x5: internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::RGBA_ASTC_10x6: internalFormat = GL_COMPRESSED_RGBA_ASTC_10x6_KHR; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::SRGB8_A8_ASTC_10x6: internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::RGBA_ASTC_10x8: internalFormat = GL_COMPRESSED_RGBA_ASTC_10x8_KHR; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::SRGB8_A8_ASTC_10x8: internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::RGBA_ASTC_10x10: internalFormat = GL_COMPRESSED_RGBA_ASTC_10x10_KHR; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::SRGB8_A8_ASTC_10x10: internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::RGBA_ASTC_12x10: internalFormat = GL_COMPRESSED_RGBA_ASTC_12x10_KHR; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::SRGB8_A8_ASTC_12x10: internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::RGBA_ASTC_12x12: internalFormat = GL_COMPRESSED_RGBA_ASTC_12x12_KHR; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::SRGB8_A8_ASTC_12x12: internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::RGBA_BC7_UNORM_4x4: internalFormat = GL_COMPRESSED_RGBA_BPTC_UNORM; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::RGBA_BC7_SRGB_4x4: internalFormat = GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::RGBA_PVRTC_2BPPV1: internalFormat = GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::RGB_PVRTC_2BPPV1: internalFormat = GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG; format = GL_RGB; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::RGBA_PVRTC_4BPPV1: internalFormat = GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::RGB_PVRTC_4BPPV1: internalFormat = GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG; format = GL_RGB; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::RGB8_ETC1: internalFormat = GL_ETC1_RGB8_OES; format = GL_RGB; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::RGB8_ETC2: internalFormat = GL_COMPRESSED_RGB8_ETC2; format = GL_RGB; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::RGB8_Punchthrough_A1_ETC2: internalFormat = GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::RGBA8_EAC_ETC2: internalFormat = GL_COMPRESSED_RGBA8_ETC2_EAC; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::SRGB8_ETC2: internalFormat = GL_COMPRESSED_SRGB8_ETC2; format = GL_RGB; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::SRGB8_Punchthrough_A1_ETC2: internalFormat = GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::SRGB8_A8_EAC_ETC2: internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC; format = GL_RGBA; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::RG_EAC_UNorm: internalFormat = GL_COMPRESSED_RG11_EAC; format = GL_RG; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::RG_EAC_SNorm: internalFormat = GL_COMPRESSED_SIGNED_RG11_EAC; format = GL_RG; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::R_EAC_UNorm: internalFormat = GL_COMPRESSED_R11_EAC; format = GL_RED; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::R_EAC_SNorm: internalFormat = GL_COMPRESSED_SIGNED_R11_EAC; format = GL_RED; type = GL_UNSIGNED_BYTE; return compressedValid; case TextureFormat::S8_UInt_Z32_UNorm: // TODO: Fix this texture type. No backend has a 32-bit int depth + 8-bit int stencil. internalFormat = GL_DEPTH32F_STENCIL8; format = GL_DEPTH_STENCIL; type = GL_FLOAT_32_UNSIGNED_INT_24_8_REV; return true; case TextureFormat::S_UInt8: // TODO: test this internalFormat = GL_STENCIL_INDEX8; format = GL_STENCIL_INDEX; type = GL_UNSIGNED_BYTE; return true; case TextureFormat::Z_UNorm16: format = GL_DEPTH_COMPONENT; type = GL_UNSIGNED_SHORT; internalFormat = GL_DEPTH_COMPONENT16; if (texImage && !deviceFeatures.hasTextureFeature(TextureFeatures::DepthTexImage16)) { internalFormat = GL_DEPTH_COMPONENT; } return true; case TextureFormat::Z_UNorm32: format = GL_DEPTH_COMPONENT; type = GL_UNSIGNED_INT; internalFormat = GL_DEPTH_COMPONENT32; if (texImage && deviceFeatures.hasInternalRequirement(InternalRequirement::Depth32Unsized)) { internalFormat = GL_DEPTH_COMPONENT; } return true; case TextureFormat::Z_UNorm24: format = GL_DEPTH_COMPONENT; type = GL_UNSIGNED_INT; internalFormat = GL_DEPTH_COMPONENT24; return true; case TextureFormat::S8_UInt_Z24_UNorm: // Support for TextureBuffer and renderbuffer introduced with the same versions / extensions format = GL_DEPTH_STENCIL; type = GL_UNSIGNED_INT_24_8; internalFormat = GL_DEPTH24_STENCIL8; if (texImage && deviceFeatures.hasInternalRequirement(InternalRequirement::Depth24Stencil8Unsized)) { internalFormat = GL_DEPTH_STENCIL; } return true; case TextureFormat::YUV_NV12: case TextureFormat::YUV_420p: // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only return false; } return false; } // IAttachmentInterop interface implementation void* Texture::getNativeImage() const { // OpenGL uses integer handles to identify textures. If someone needs to return // it as a pointer, it might be implemented. IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); return nullptr; } void* Texture::getNativeImageView() const { // OpenGL doesn't have a separate image view concept return nullptr; } const base::AttachmentInteropDesc& Texture::getDesc() const { // Update cached attachment descriptor const auto dims = getDimensions(); attachmentDesc_.width = dims.width; attachmentDesc_.height = dims.height; attachmentDesc_.depth = dims.depth; attachmentDesc_.numLayers = numLayers_; attachmentDesc_.numSamples = numSamples_; attachmentDesc_.numMipLevels = numMipLevels_; attachmentDesc_.type = type_; attachmentDesc_.format = getFormat(); attachmentDesc_.isSampled = true; // OpenGL textures are generally sampled return attachmentDesc_; } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/Texture.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl { class ICommandBuffer; namespace opengl { // Texture is the base class for the OpenGL backend. It represents: // 1. traditional textures (sampled/output by shaders) // 2. render targets (attachments to framebuffers) class Texture : public WithContext, public ITexture { public: Texture(IContext& context, TextureFormat format, TextureDesc::TextureMipmapGeneration mipmapGeneration = TextureDesc::TextureMipmapGeneration::Manual) : WithContext(context), ITexture(format), mipmapGeneration_(mipmapGeneration) {} ~Texture() override = default; public: // Accessors [[nodiscard]] Dimensions getDimensions() const override; [[nodiscard]] uint32_t getNumLayers() const override; [[nodiscard]] uint32_t getSamples() const override; void generateMipmap(ICommandQueue& cmdQueue, const TextureRangeDesc* IGL_NULLABLE range = nullptr) const override; void generateMipmap(ICommandBuffer& cmdBuffer, const TextureRangeDesc* IGL_NULLABLE range = nullptr) const override; [[nodiscard]] uint32_t getNumMipLevels() const override; [[nodiscard]] bool isRequiredGenerateMipmap() const override; [[nodiscard]] uint64_t getTextureId() const override; [[nodiscard]] bool isSwapchainTexture() const override; [[nodiscard]] virtual bool canPresent() const noexcept; [[nodiscard]] TextureDesc::TextureMipmapGeneration getMipmapGeneration() const; virtual Result create(const TextureDesc& desc, bool hasStorageAlready); // bind this as a source texture for rendering from virtual void bind() = 0; virtual void bindImage(size_t unit) = 0; virtual void unbind() = 0; struct AttachmentParams { uint32_t face; // Cube map texture face uint32_t mipLevel; // Mipmap level uint32_t layer; // Array texture layer bool read; bool stereo; }; // frame buffer attachments virtual void attachAsColor(uint32_t index, const AttachmentParams& params) = 0; virtual void detachAsColor(uint32_t index, bool read) = 0; virtual void attachAsDepth(const AttachmentParams& params) = 0; virtual void detachAsDepth(bool read) = 0; virtual void attachAsStencil(const AttachmentParams& params) = 0; virtual void detachAsStencil(bool read) = 0; [[nodiscard]] virtual bool isImplicitStorage() const; [[nodiscard]] GLenum toGLTarget(TextureType type) const; static TextureFormat glInternalFormatToTextureFormat(GLuint glTexInternalFormat, GLuint glTexFormat, GLuint glTexType); // @fb-only // @fb-only [[nodiscard]] virtual GLuint getId() const = 0; // IAttachmentInterop interface [[nodiscard]] void* IGL_NULLABLE getNativeImage() const override; [[nodiscard]] void* IGL_NULLABLE getNativeImageView() const override; [[nodiscard]] const base::AttachmentInteropDesc& getDesc() const override; /// @brief Calculates a value for GL_PACK_ALIGNMENT or GL_UNPACK_ALIGNMENT for the given byte /// stride. /// @param stride The byte stride of a row of data in the texture data source or destination. /// @param mipLevel The texture mip level the data is being read from or written to. /// @param widthAtMipLevel The width, in pixels, at mipLevel of the data being read from or /// written to. [[nodiscard]] GLint getAlignment(uint32_t stride, uint32_t mipLevel = 0, uint32_t widthAtMipLevel = 0) const; void setSamplerHash(size_t newValue) { samplerHash_ = newValue; } [[nodiscard]] size_t getSamplerHash() const { return samplerHash_; } [[nodiscard]] GLenum getGLInternalTextureFormat() const { IGL_DEBUG_ASSERT(glInternalFormat_ != 0); return glInternalFormat_; } // glTexImageXXX functions require 3 different parameters to specify a texture format struct FormatDescGL final { GLint internalFormat = 0; GLenum format = GL_NONE; GLenum type = GL_NONE; }; /// Converts the GL format descriptor from the given texture format /// @returns false if an unknown format is specified bool toFormatDescGL(TextureFormat textureFormat, TextureDesc::TextureUsage usage, FormatDescGL& outFormatGL) const; static bool toFormatDescGL(const IContext& ctx, TextureFormat textureFormat, TextureDesc::TextureUsage usage, FormatDescGL& outFormatGL); protected: [[nodiscard]] IGL_INLINE GLsizei getWidth() const { return width_; } [[nodiscard]] IGL_INLINE GLsizei getHeight() const { return height_; } // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) IGL_INLINE void setTextureProperties(GLsizei width, GLsizei height, GLsizei numLayers = 1) { width_ = width; height_ = height; numLayers_ = numLayers; } /// @returns true if the format is usable as a TextureTarget format. /// @remark Does not take into account whether a particular context supports it or not. [[nodiscard]] bool isTextureTargetFormat(TextureFormat textureFormat) const; GLenum glInternalFormat_{}; uint32_t numMipLevels_ = 1; TextureType type_ = TextureType::Invalid; TextureDesc::TextureMipmapGeneration mipmapGeneration_ = TextureDesc::TextureMipmapGeneration::Manual; private: size_t samplerHash_ = std::numeric_limits::max(); GLsizei width_ = 0; GLsizei height_ = 0; GLsizei depth_ = 1; GLsizei numLayers_ = 1; uint32_t numSamples_ = 1; bool isCreated_ = false; mutable base::AttachmentInteropDesc attachmentDesc_; // Cached for IAttachmentInterop::getDesc() }; } // namespace opengl } // namespace igl ================================================ FILE: src/igl/opengl/TextureBuffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace igl::opengl { namespace { // maps TextureCube::CubeFace to GL target type for cube map faces // required for glTexImageXXX APIs constexpr std::array kCubeFaceTargets = {GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z}; void swapTextureChannelsForFormat(IContext& context, GLuint target, TextureFormat iglFormat) { if (iglFormat == igl::TextureFormat::A_UNorm8 && context.deviceFeatures().hasInternalRequirement( InternalRequirement::SwizzleAlphaTexturesReq)) { if (iglFormat == igl::TextureFormat::A_UNorm8) { // In GL3, GL_RED is used since GL_ALPHA is removed. To keep parity, red value must be set // to the alpha channel. context.texParameteri(target, GL_TEXTURE_SWIZZLE_R, GL_ZERO); context.texParameteri(target, GL_TEXTURE_SWIZZLE_G, GL_ZERO); context.texParameteri(target, GL_TEXTURE_SWIZZLE_B, GL_ZERO); context.texParameteri(target, GL_TEXTURE_SWIZZLE_A, GL_RED); } } } } // namespace TextureBuffer::~TextureBuffer() { const GLuint textureId = getId(); if (textureId != 0) { if (textureHandle_ != 0) { getContext().makeTextureHandleNonResident(textureHandle_); } getContext().deleteTextures(1, &textureId); } } uint64_t TextureBuffer::getTextureId() const { if (textureHandle_ == 0) { textureHandle_ = getContext().getTextureHandle(getId()); IGL_DEBUG_ASSERT(textureHandle_); getContext().makeTextureHandleResident(textureHandle_); } return textureHandle_; } // create a 2D texture given the specified dimensions and format Result TextureBuffer::create(const TextureDesc& desc, bool hasStorageAlready) { Result result = Super::create(desc, hasStorageAlready); if (result.isOk()) { const auto isSampledOrStorage = (desc.usage & (TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Storage)) != 0; if (isSampledOrStorage || desc.type != TextureType::TwoD || desc.numMipLevels > 1) { result = createTexture(desc); } else { result = Result(Result::Code::Unsupported, "invalid usage!"); } } return result; } void TextureBuffer::bindImage(size_t unit) { // The entire codebase used only combined kShaderRead|kShaderWrite access (except tests) // @fb-only // Here we used to have this condition: // getUsage() & TextureUsage::kShaderWrite ? GL_WRITE_ONLY : GL_READ_ONLY, // So it is safe to replace it with GL_READ_WRITE IGL_DEBUG_ASSERT(getUsage() & TextureDesc::TextureUsageBits::Storage, "Should be a storage image"); getContext().bindImageTexture((GLuint)unit, getId(), 0, getTarget() == GL_TEXTURE_2D ? GL_TRUE : GL_FALSE, 0, GL_READ_WRITE, glInternalFormat_); } // create a texture for shader read/write usages Result TextureBuffer::createTexture(const TextureDesc& desc) { const auto target = toGLTarget(desc.type); if (target == 0) { return Result(Result::Code::Unsupported, "Unsupported texture target"); } // If usage doesn't include Storage, ensure usage includes sampled for correct format selection const auto usageForFormat = (desc.usage & TextureDesc::TextureUsageBits::Storage) == 0 ? desc.usage | TextureDesc::TextureUsageBits::Sampled : desc.usage; if (!toFormatDescGL(desc.format, usageForFormat, formatDescGL_)) { // can't create a texture with the given format return Result(Result::Code::ArgumentInvalid, "Invalid texture format"); } if (!getProperties().isCompressed() && formatDescGL_.type == GL_NONE) { return Result(Result::Code::ArgumentInvalid, "Invalid texture type"); } if (desc.usage & TextureDesc::TextureUsageBits::Storage) { if (!getContext().deviceFeatures().hasInternalFeature(InternalFeatures::TexStorage)) { return Result(Result::Code::Unsupported, "Texture Storage not supported"); } } glInternalFormat_ = formatDescGL_.internalFormat; // create the GL texture ID GLuint textureID = 0; getContext().genTextures(1, &textureID); if (textureID == 0) { return Result(Result::Code::RuntimeError, "Failed to create texture ID"); } setTextureBufferProperties(textureID, target); setUsage(desc.usage); if (desc.type == TextureType::ExternalImage) { // No further initialization needed for external image textures return Result{}; } else { return initialize(desc.debugName); } } Result TextureBuffer::initialize(const std::string& debugName) const { const auto target = getTarget(); if (target == 0) { return Result{Result::Code::InvalidOperation, "Unknown texture type"}; } getContext().bindTexture(target, getId()); setMaxMipLevel(); if (getNumMipLevels() == 1) { // Change default min filter to ensure mipmapping is disabled getContext().texParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); } if (!getProperties().isCompressed()) { swapTextureChannelsForFormat(getContext(), target, getFormat()); } if (!debugName.empty() && getContext().deviceFeatures().hasInternalFeature(InternalFeatures::DebugLabel)) { getContext().objectLabel(GL_TEXTURE, getId(), debugName.size(), debugName.c_str()); } Result result; if (canInitialize()) { if (!supportsTexStorage()) { result = initializeWithUpload(); } else { result = initializeWithTexStorage(); } } getContext().bindTexture(getTarget(), 0); return result; } Result TextureBuffer::initializeWithUpload() const { const auto target = getTarget(); const auto range = getFullMipRange(); return uploadInternal(target, range, nullptr); } Result TextureBuffer::initializeWithTexStorage() const { const auto range = getFullMipRange(); const auto target = getTarget(); switch (getType()) { case TextureType::TwoD: getContext().texStorage2D( target, range.numMipLevels, glInternalFormat_, (GLsizei)range.width, (GLsizei)range.height); break; case TextureType::TwoDArray: getContext().texStorage3D(target, range.numMipLevels, glInternalFormat_, (GLsizei)range.width, (GLsizei)range.height, (GLsizei)range.numLayers); break; case TextureType::ThreeD: getContext().texStorage3D(target, range.numMipLevels, glInternalFormat_, (GLsizei)range.width, (GLsizei)range.height, (GLsizei)range.depth); break; case TextureType::Cube: getContext().texStorage2D( target, range.numMipLevels, glInternalFormat_, (GLsizei)range.width, (GLsizei)range.height); break; case TextureType::ExternalImage: case TextureType::Invalid: default: IGL_DEBUG_ABORT("Unknown texture type"); return Result{Result::Code::InvalidOperation, "Unknown texture type"}; } return getContext().getLastError(); } Result TextureBuffer::upload2D(GLenum target, const TextureRangeDesc& range, bool texImage, const void* IGL_NULLABLE data) const { if (data == nullptr || !getProperties().isCompressed()) { if (texImage) { getContext().texImage2D(target, (GLsizei)range.mipLevel, formatDescGL_.internalFormat, (GLsizei)range.width, (GLsizei)range.height, 0, // border formatDescGL_.format, formatDescGL_.type, data); } else { getContext().texSubImage2D(target, (GLsizei)range.mipLevel, (GLsizei)range.x, (GLsizei)range.y, (GLsizei)range.width, (GLsizei)range.height, formatDescGL_.format, formatDescGL_.type, data); } } else { const auto numCompressedBytes = getProperties().getBytesPerRange(range); IGL_DEBUG_ASSERT(numCompressedBytes > 0); if (texImage) { getContext().compressedTexImage2D(target, (GLint)range.mipLevel, formatDescGL_.internalFormat, (GLsizei)range.width, (GLsizei)range.height, 0, // border (GLsizei)numCompressedBytes, // TODO: does not work // for compressed // mipmaps data); } else { getContext().compressedTexSubImage2D(getTarget(), (GLint)range.mipLevel, (GLint)range.x, (GLint)range.y, (GLsizei)range.width, (GLsizei)range.height, formatDescGL_.internalFormat, (GLsizei)numCompressedBytes, // TODO: does not work // for compressed // mipmaps data); } } return getContext().getLastError(); } Result TextureBuffer::upload2DArray(GLenum target, const TextureRangeDesc& range, bool texImage, const void* IGL_NULLABLE data) const { if (data == nullptr || !getProperties().isCompressed()) { if (texImage) { getContext().texImage3D(target, (GLint)range.mipLevel, formatDescGL_.internalFormat, (GLsizei)range.width, (GLsizei)range.height, (GLsizei)range.numLayers, 0, // border formatDescGL_.format, formatDescGL_.type, data); } else { getContext().texSubImage3D(target, (GLsizei)range.mipLevel, (GLsizei)range.x, (GLsizei)range.y, (GLsizei)range.layer, (GLsizei)range.width, (GLsizei)range.height, (GLsizei)range.numLayers, formatDescGL_.format, formatDescGL_.type, data); } } else { const auto numCompressedBytes = getProperties().getBytesPerRange(range); IGL_DEBUG_ASSERT(numCompressedBytes > 0); if (texImage) { getContext().compressedTexImage3D(target, (GLint)range.mipLevel, formatDescGL_.internalFormat, (GLsizei)range.width, (GLsizei)range.height, (GLsizei)range.numLayers, 0, // border (GLsizei)numCompressedBytes, // TODO: does not work // for compressed // mipmaps data); } else { getContext().compressedTexSubImage3D(getTarget(), (GLint)range.mipLevel, (GLint)range.x, (GLint)range.y, (GLint)range.layer, (GLsizei)range.width, (GLsizei)range.height, (GLsizei)range.numLayers, formatDescGL_.internalFormat, (GLsizei)numCompressedBytes, data); } } return getContext().getLastError(); } Result TextureBuffer::upload3D(GLenum target, const TextureRangeDesc& range, bool texImage, const void* IGL_NULLABLE data) const { if (data == nullptr || !getProperties().isCompressed()) { if (texImage) { getContext().texImage3D(target, (GLint)range.mipLevel, formatDescGL_.internalFormat, (GLsizei)range.width, (GLsizei)range.height, (GLsizei)range.depth, 0, // border formatDescGL_.format, formatDescGL_.type, data); } else { getContext().texSubImage3D(target, (GLsizei)range.mipLevel, (GLsizei)range.x, (GLsizei)range.y, (GLsizei)range.z, (GLsizei)range.width, (GLsizei)range.height, (GLsizei)range.depth, formatDescGL_.format, formatDescGL_.type, data); } } else { const auto numCompressedBytes = getProperties().getBytesPerRange(range); IGL_DEBUG_ASSERT(numCompressedBytes > 0); if (texImage) { getContext().compressedTexImage3D(target, (GLint)range.mipLevel, formatDescGL_.internalFormat, (GLsizei)range.width, (GLsizei)range.height, (GLsizei)range.depth, 0, // border (GLsizei)numCompressedBytes, // TODO: does not work // for compressed // mipmaps data); } else { getContext().compressedTexSubImage3D(getTarget(), (GLint)range.mipLevel, (GLint)range.x, (GLint)range.y, (GLint)range.z, (GLsizei)range.width, (GLsizei)range.height, (GLsizei)range.depth, formatDescGL_.internalFormat, (GLsizei)numCompressedBytes, data); } } return getContext().getLastError(); } bool TextureBuffer::needsRepacking(const TextureRangeDesc& range, size_t bytesPerRow) const { if (bytesPerRow == 0) { return false; } const auto rangeBytesPerRow = getProperties().getBytesPerRow(range); if (rangeBytesPerRow == bytesPerRow) { return false; } // GL_UNPACK_ALIGNMENT supports padding up to, but not including, the alignment value. // If bytesPerRow is equal to the packed row length rounded up to the nearest alignment multiple, // the data does not need to be repacked. const auto delta = bytesPerRow - rangeBytesPerRow; if (delta < 8 && bytesPerRow % 8 == 0) { return false; } else if (delta < 4 && bytesPerRow % 4 == 0) { return false; } else if (delta < 2 && bytesPerRow % 2 == 0) { return false; } if (getContext().deviceFeatures().hasInternalFeature(InternalFeatures::UnpackRowLength)) { // GL_UNPACK_ROW_LENGTH supports cases where bytesPerRow is a multiple of the texel size or, for // compressed textures, the texel block size. return bytesPerRow % getProperties().bytesPerBlock != 0; } return true; } // upload data into the given mip level // a sub-rect of the texture may be specified to only upload the sub-rect Result TextureBuffer::uploadInternal(TextureType /*type*/, const TextureRangeDesc& range, const void* IGL_NULLABLE data, size_t bytesPerRow, const uint32_t* IGL_NULLABLE /*mipLevelBytes*/) const { if (data == nullptr) { return Result{}; } const auto target = getTarget(); if (target == 0) { return Result{Result::Code::InvalidOperation, "Unknown texture type"}; } getContext().bindTexture(target, getId()); auto result = uploadInternal(target, range, data, bytesPerRow); getContext().bindTexture(getTarget(), 0); return result; } Result TextureBuffer::uploadInternal(GLenum target, const TextureRangeDesc& range, const void* IGL_NULLABLE data, size_t bytesPerRow) const { // Use TexImage when range covers full texture AND texture was not initialized with TexStorage const auto texImage = isValidForTexImage(range) && !supportsTexStorage(); const bool unpackRowLengthSupported = getContext().deviceFeatures().hasInternalFeature(InternalFeatures::UnpackRowLength); const int unpackRowLength = unpackRowLengthSupported && bytesPerRow % getProperties().bytesPerBlock == 0 ? static_cast(bytesPerRow / getProperties().bytesPerBlock) : 0; if (unpackRowLength > 0) { getContext().pixelStorei(GL_UNPACK_ROW_LENGTH, unpackRowLength); getContext().pixelStorei(GL_UNPACK_ALIGNMENT, 1); } else { if (unpackRowLengthSupported) { getContext().pixelStorei(GL_UNPACK_ROW_LENGTH, 0); } getContext().pixelStorei(GL_UNPACK_ALIGNMENT, this->getAlignment(bytesPerRow, range.mipLevel, range.width)); } Result result; for (auto mipLevel = range.mipLevel; mipLevel < range.mipLevel + range.numMipLevels; ++mipLevel) { const auto mipRange = range.atMipLevel(mipLevel); for (auto face = range.face; face < range.face + range.numFaces; ++face) { const auto faceRange = mipRange.atFace(face); const auto* faceData = data == nullptr ? nullptr : getSubRangeStart(data, range, faceRange, bytesPerRow); switch (type_) { case TextureType::TwoD: result = upload2D(target, faceRange, texImage, faceData); break; case TextureType::TwoDArray: result = upload2DArray(target, faceRange, texImage, faceData); break; case TextureType::ThreeD: result = upload3D(target, faceRange, texImage, faceData); break; case TextureType::Cube: result = upload2D(kCubeFaceTargets[faceRange.face], faceRange, texImage, faceData); break; case TextureType::ExternalImage: case TextureType::Invalid: default: return Result{Result::Code::InvalidOperation, "Unknown texture type"}; } if (!result.isOk()) { return result; } } if (!result.isOk()) { break; } } if (mipmapGeneration_ == TextureDesc::TextureMipmapGeneration::AutoGenerateOnUpload) { if (range.mipLevel != 0) { return Result{Result::Code::InvalidOperation, "AutoGenerateOnUpload requires mipLevel to be uploaded to be 0"}; } generateMipmap(); mipmapsAreAvailableAndUploaded_ = true; } return result; } bool TextureBuffer::canInitialize() const { return !getProperties().isCompressed() || (supportsTexStorage() && getContext().deviceFeatures().hasTextureFeature( TextureFeatures::TextureCompressionTexStorage)) || getContext().deviceFeatures().hasTextureFeature( TextureFeatures::TextureCompressionTexImage); } bool TextureBuffer::supportsTexStorage() const { return (getUsage() & TextureDesc::TextureUsageBits::Storage) != 0 && contains(getContext().deviceFeatures().getTextureFormatCapabilities(getFormat()), ICapabilities::TextureFormatCapabilityBits::Storage); } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/TextureBuffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::opengl { // TextureBuffer encapsulates OpenGL textures class TextureBuffer : public TextureBufferBase { using Super = TextureBufferBase; public: TextureBuffer(IContext& context, TextureFormat format) : Super(context, format) {} ~TextureBuffer() override; // Texture overrides Result create(const TextureDesc& desc, bool hasStorageAlready) override; void bindImage(size_t unit) override; uint64_t getTextureId() const override; protected: Result initialize(const std::string& debugName) const; Result initializeWithUpload() const; Result initializeWithTexStorage() const; Result uploadInternal(TextureType type, const TextureRangeDesc& range, const void* IGL_NULLABLE data, size_t bytesPerRow, const uint32_t* IGL_NULLABLE mipLevelBytes) const override; Result uploadInternal(GLenum target, const TextureRangeDesc& range, const void* IGL_NULLABLE data, size_t bytesPerRow = 0) const; Result upload2D(GLenum target, const TextureRangeDesc& range, bool texImage, const void* IGL_NULLABLE data) const; Result upload2DArray(GLenum target, const TextureRangeDesc& range, bool texImage, const void* IGL_NULLABLE data) const; Result upload3D(GLenum target, const TextureRangeDesc& range, bool texImage, const void* IGL_NULLABLE data) const; protected: // NOLINTNEXTLINE(misc-non-private-member-variables-in-classes) FormatDescGL formatDescGL_; private: [[nodiscard]] bool needsRepacking(const TextureRangeDesc& range, size_t bytesPerRow) const final; Result createTexture(const TextureDesc& desc); bool canInitialize() const; bool supportsTexStorage() const; mutable uint64_t textureHandle_ = 0; }; } // namespace igl::opengl ================================================ FILE: src/igl/opengl/TextureBufferBase.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include namespace igl::opengl { TextureType TextureBufferBase::getType() const { // TODO: Handle compressed texture type switch (target_) { case GL_TEXTURE_CUBE_MAP: return TextureType::Cube; case GL_TEXTURE_2D: case GL_TEXTURE_2D_MULTISAMPLE: return TextureType::TwoD; case GL_TEXTURE_2D_ARRAY: case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: if (getContext().deviceFeatures().hasFeature(DeviceFeatures::Texture2DArray)) { return TextureType::TwoDArray; } break; case GL_TEXTURE_3D: if (getContext().deviceFeatures().hasFeature(DeviceFeatures::Texture3D)) { return TextureType::ThreeD; } break; case GL_TEXTURE_EXTERNAL_OES: if (getContext().deviceFeatures().hasFeature(DeviceFeatures::TextureExternalImage)) { return TextureType::ExternalImage; } break; } IGL_DEBUG_ABORT("Unsupported OGL Texture Target: 0x%x", target_); return TextureType::Invalid; } TextureDesc::TextureUsage TextureBufferBase::getUsage() const { return usage_; } // bind this as a source texture for rendering from void TextureBufferBase::bind() { IGL_DEBUG_ASSERT(getUsage() & TextureDesc::TextureUsageBits::Sampled); getContext().bindTexture(target_, textureID_); } void TextureBufferBase::unbind() { IGL_DEBUG_ASSERT(getUsage() & TextureDesc::TextureUsageBits::Sampled); getContext().bindTexture(target_, 0); } void TextureBufferBase::attachAsColor(uint32_t index, const AttachmentParams& params) { IGL_DEBUG_ASSERT(getUsage() & TextureDesc::TextureUsageBits::Attachment); if (IGL_DEBUG_VERIFY(textureID_)) { attach(GL_COLOR_ATTACHMENT0 + index, params, textureID_); } } void TextureBufferBase::attach(GLenum attachment, const AttachmentParams& params, GLuint textureID) { const GLenum target = target_ == GL_TEXTURE_CUBE_MAP ? GL_TEXTURE_CUBE_MAP_POSITIVE_X + params.face : target_; GLenum framebufferTarget = GL_FRAMEBUFFER; const auto& deviceFeatures = getContext().deviceFeatures(); if (deviceFeatures.hasFeature(DeviceFeatures::ReadWriteFramebuffer)) { framebufferTarget = params.read ? GL_READ_FRAMEBUFFER : GL_DRAW_FRAMEBUFFER; } const auto numSamples = getSamples(); const auto numLayers = getNumLayers(); if (numSamples > 1) { IGL_DEBUG_ASSERT( attachment == GL_COLOR_ATTACHMENT0 || attachment == GL_DEPTH_ATTACHMENT || attachment == GL_STENCIL_ATTACHMENT, "Multisample framebuffer can only use GL_COLOR_ATTACHMENT0, GL_DEPTH_ATTACHMENT " "or GL_STENCIL_ATTACHMENT"); if (params.stereo) { getContext().framebufferTextureMultisampleMultiview(framebufferTarget, attachment, textureID, params.mipLevel, static_cast(numSamples), 0, 2); } else { // `IMG_multisampled_render_to_texture` unlike `EXT_multisampled_render_to_texture`, // only supports GL_FRAMEBUFFER, not GL_DRAW/READ_FRAMEBUFFER if ((framebufferTarget == GL_DRAW_FRAMEBUFFER || framebufferTarget == GL_READ_FRAMEBUFFER) && !deviceFeatures.hasExtension(Extensions::MultiSampleExt) && deviceFeatures.hasExtension(Extensions::MultiSampleImg)) { framebufferTarget = GL_FRAMEBUFFER; } getContext().framebufferTexture2DMultisample( framebufferTarget, attachment, target, textureID, params.mipLevel, getSamples()); } } else { if (params.stereo) { getContext().framebufferTextureMultiview( framebufferTarget, attachment, textureID, params.mipLevel, 0, 2); } else if (numLayers > 1) { getContext().framebufferTextureLayer( framebufferTarget, attachment, textureID, params.mipLevel, params.layer); } else { getContext().framebufferTexture2D( framebufferTarget, attachment, target, textureID, params.mipLevel); } } } void TextureBufferBase::detachAsColor(uint32_t index, bool read) { AttachmentParams params{}; params.read = read; attach(GL_COLOR_ATTACHMENT0 + index, params, 0); } void TextureBufferBase::attachAsDepth(const AttachmentParams& params) { if (IGL_DEBUG_VERIFY(textureID_)) { attach(GL_DEPTH_ATTACHMENT, params, textureID_); } } void TextureBufferBase::detachAsDepth(bool read) { AttachmentParams params{}; params.read = read; attach(GL_DEPTH_ATTACHMENT, params, 0); } void TextureBufferBase::attachAsStencil(const AttachmentParams& params) { if (IGL_DEBUG_VERIFY(textureID_)) { attach(GL_STENCIL_ATTACHMENT, params, textureID_); } } void TextureBufferBase::detachAsStencil(bool read) { AttachmentParams params{}; params.read = read; attach(GL_STENCIL_ATTACHMENT, params, 0); } void TextureBufferBase::setMaxMipLevel() const { if (getContext().deviceFeatures().hasFeature(DeviceFeatures::TexturePartialMipChain)) { getContext().texParameteri(getTarget(), GL_TEXTURE_MAX_LEVEL, (GLint)(numMipLevels_ - 1)); } } void TextureBufferBase::generateMipmap(ICommandQueue& /* unused */, const TextureRangeDesc* IGL_NULLABLE /* unused */) const { generateMipmap(); } void TextureBufferBase::generateMipmap(ICommandBuffer& /* unused */, const TextureRangeDesc* IGL_NULLABLE /* unused */) const { generateMipmap(); } void TextureBufferBase::generateMipmap() const { getContext().bindTexture(getTarget(), getId()); setMaxMipLevel(); getContext().generateMipmap(getTarget()); } bool TextureBufferBase::isRequiredGenerateMipmap() const { if (mipmapsAreAvailableAndUploaded_) { return false; } return numMipLevels_ > 1; } bool TextureBufferBase::isValidForTexImage(const TextureRangeDesc& range) const { const auto dimensions = getDimensions(); const auto levelWidth = std::max(dimensions.width >> range.mipLevel, 1u); const auto levelHeight = std::max(dimensions.height >> range.mipLevel, 1u); const auto levelDepth = std::max(dimensions.depth >> range.mipLevel, 1u); return (range.x == 0 && range.y == 0 && range.z == 0 && range.layer == 0 && range.width == levelWidth && range.height == levelHeight && range.depth == levelDepth && range.numLayers == getNumLayers()); } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/TextureBufferBase.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::opengl { // TextureBufferBase encapsulates OpenGL textures class TextureBufferBase : public Texture { using Super = Texture; public: TextureBufferBase(IContext& context, TextureFormat format) : Super(context, format) {} // ITexture overrides [[nodiscard]] TextureType getType() const override; [[nodiscard]] TextureDesc::TextureUsage getUsage() const override; void bind() override; void bindImage(size_t unit) override {} void unbind() override; void attachAsColor(uint32_t index, const AttachmentParams& params) override; void detachAsColor(uint32_t index, bool read) override; void attachAsDepth(const AttachmentParams& params) override; void detachAsDepth(bool read) override; void attachAsStencil(const AttachmentParams& params) override; void detachAsStencil(bool read) override; void generateMipmap(ICommandQueue& cmdQueue, const TextureRangeDesc* IGL_NULLABLE range = nullptr) const override; void generateMipmap(ICommandBuffer& cmdBuffer, const TextureRangeDesc* IGL_NULLABLE range = nullptr) const override; [[nodiscard]] bool isRequiredGenerateMipmap() const override; [[nodiscard]] GLuint getId() const override { return textureID_; } [[nodiscard]] GLuint getTarget() const { return target_; } protected: // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) IGL_INLINE void setTextureBufferProperties(GLuint textureID, GLenum target) { textureID_ = textureID; target_ = target; } IGL_INLINE void setUsage(TextureDesc::TextureUsage usage) { usage_ = usage; } void attach(GLenum attachment, const AttachmentParams& params, GLuint textureID); void setMaxMipLevel() const; [[nodiscard]] bool isValidForTexImage(const TextureRangeDesc& range) const; /// @brief To record whether mipmaps are available and uploaded to the GPU. This is used by the /// `isRequiredGenerateMipmap()` function mutable bool mipmapsAreAvailableAndUploaded_ = false; protected: void generateMipmap() const; private: // the GL ID for this texture GLuint textureID_ = 0; // target depends on usage and texture type GLenum target_ = 0; TextureDesc::TextureUsage usage_ = 0; }; } // namespace igl::opengl ================================================ FILE: src/igl/opengl/TextureBufferExternal.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include namespace igl::opengl { TextureBufferExternal::TextureBufferExternal(IContext& context, TextureFormat format, TextureDesc::TextureUsage usage) : Super(context, format) { FormatDescGL formatDescGL; toFormatDescGL(format, usage, formatDescGL); glInternalFormat_ = formatDescGL.internalFormat; setUsage(usage); } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/TextureBufferExternal.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::opengl { // TextureBufferExternal encapsulates OpenGL textures without the guarantee of the lifecycle // Specifically, this class does not delete the GL texture it encapsulates on destruction class TextureBufferExternal : public TextureBufferBase { using Super = TextureBufferBase; friend class PlatformDevice; // So that PlatformDevice can do setTextureBufferProperties public: explicit TextureBufferExternal(IContext& context, TextureFormat format, TextureDesc::TextureUsage usage); ~TextureBufferExternal() override = default; [[nodiscard]] bool supportsUpload() const final { return false; } }; } // namespace igl::opengl ================================================ FILE: src/igl/opengl/TextureTarget.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include namespace igl::opengl { TextureTarget::~TextureTarget() { if (renderBufferID_ != 0) { getContext().deleteRenderbuffers(1, &renderBufferID_); } } TextureType TextureTarget::getType() const { return TextureType::TwoD; } TextureDesc::TextureUsage TextureTarget::getUsage() const { return TextureDesc::TextureUsageBits::Attachment; } bool TextureTarget::canPresent() const noexcept { return canPresent_; } // create a 2D texture given the specified dimensions and format Result TextureTarget::create(const TextureDesc& desc, bool hasStorageAlready) { Result result = Super::create(desc, hasStorageAlready); if (result.isOk()) { if (desc.usage & TextureDesc::TextureUsageBits::Attachment) { result = createRenderBuffer(desc, hasStorageAlready); } else { result = Result(Result::Code::Unsupported, "invalid usage!"); } } return result; } // create a render buffer for render target usages Result TextureTarget::createRenderBuffer(const TextureDesc& desc, bool hasStorageAlready) { if (desc.type != TextureType::TwoD) { // Renderbuffers only support 2D textures return Result{Result::Code::Unsupported, "Texture type must be TwoD."}; } if (desc.numMipLevels > 1) { return Result{Result::Code::Unsupported, "numMipLevels must be 1."}; } if (!toRenderBufferFormatGL(desc.usage, glInternalFormat_)) { // can't create a texture with the given format return Result{Result::Code::ArgumentInvalid, "Invalid texture format"}; } // create the GL render buffer getContext().genRenderbuffers(1, &renderBufferID_); if (!hasStorageAlready) { getContext().bindRenderbuffer(GL_RENDERBUFFER, renderBufferID_); if (desc.numSamples > 1) { getContext().renderbufferStorageMultisample( GL_RENDERBUFFER, desc.numSamples, glInternalFormat_, getWidth(), getHeight()); } else { getContext().renderbufferStorage( GL_RENDERBUFFER, glInternalFormat_, (GLsizei)getWidth(), (GLsizei)getHeight()); } if (!desc.debugName.empty() && getContext().deviceFeatures().hasInternalFeature(InternalFeatures::DebugLabel)) { getContext().objectLabel( GL_RENDERBUFFER, renderBufferID_, desc.debugName.size(), desc.debugName.c_str()); } getContext().bindRenderbuffer(GL_RENDERBUFFER, 0); } return Result(); } void TextureTarget::bind() { getContext().bindRenderbuffer(GL_RENDERBUFFER, renderBufferID_); } void TextureTarget::unbind() { getContext().bindRenderbuffer(GL_RENDERBUFFER, 0); } void TextureTarget::bindImage(size_t /*unit*/) { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } void TextureTarget::attachAsColor(uint32_t index, const AttachmentParams& params) { if (IGL_DEBUG_VERIFY(renderBufferID_)) { attach(GL_COLOR_ATTACHMENT0 + index, params, renderBufferID_); } } void TextureTarget::attach(GLenum attachment, const AttachmentParams& params, GLuint renderBufferId) { IGL_DEBUG_ASSERT(params.stereo == false); IGL_DEBUG_ASSERT(params.face == 0); IGL_DEBUG_ASSERT(params.layer == 0); IGL_DEBUG_ASSERT(params.mipLevel == 0); GLenum framebufferTarget = GL_FRAMEBUFFER; if (getContext().deviceFeatures().hasFeature(DeviceFeatures::ReadWriteFramebuffer)) { framebufferTarget = params.read ? GL_READ_FRAMEBUFFER : GL_DRAW_FRAMEBUFFER; } if (renderBufferId) { getContext().framebufferRenderbuffer( framebufferTarget, attachment, GL_RENDERBUFFER, renderBufferId); } else { // Binding to render buffer ID 0 is undefined in iOS so unbind as texture getContext().framebufferTexture2D(framebufferTarget, attachment, GL_TEXTURE_2D, 0, 0); } } void TextureTarget::detachAsColor(uint32_t index, bool read) { AttachmentParams params{}; params.read = read; attach(GL_COLOR_ATTACHMENT0 + index, params, 0); } void TextureTarget::attachAsDepth(const AttachmentParams& params) { if (IGL_DEBUG_VERIFY(renderBufferID_)) { attach(GL_DEPTH_ATTACHMENT, params, renderBufferID_); } } void TextureTarget::detachAsDepth(bool read) { AttachmentParams params{}; params.read = read; attach(GL_DEPTH_ATTACHMENT, params, 0); } void TextureTarget::attachAsStencil(const AttachmentParams& params) { if (IGL_DEBUG_VERIFY(renderBufferID_)) { attach(GL_STENCIL_ATTACHMENT, params, renderBufferID_); } } void TextureTarget::detachAsStencil(bool read) { AttachmentParams params{}; params.read = read; attach(GL_STENCIL_ATTACHMENT, params, 0); } bool TextureTarget::toRenderBufferFormatGL(TextureDesc::TextureUsage usage, GLenum& formatGL) const { FormatDescGL formatDescGL; if (!toFormatDescGL(getFormat(), usage, formatDescGL)) { return false; } formatGL = formatDescGL.internalFormat; return true; } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/TextureTarget.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::opengl { // TextureTarget encapsulates OpenGL renderbuffers class TextureTarget final : public Texture { using Super = Texture; public: TextureTarget(IContext& context, TextureFormat format) : Super(context, format) {} TextureTarget(IContext& context, TextureFormat format, bool canPresent) : Super(context, format), canPresent_(canPresent) {} ~TextureTarget() override; TextureTarget(const TextureTarget&) = delete; TextureTarget& operator=(const TextureTarget&) = delete; TextureTarget(TextureTarget&&) = delete; TextureTarget& operator=(TextureTarget&&) = delete; // ITexture overrides [[nodiscard]] TextureType getType() const override; [[nodiscard]] TextureDesc::TextureUsage getUsage() const override; // Texture overrides Result create(const TextureDesc& desc, bool hasStorageAlready) override; void bind() override; void unbind() override; void bindImage(size_t unit) override; void attachAsColor(uint32_t index, const AttachmentParams& params) override; void detachAsColor(uint32_t index, bool read) override; void attachAsDepth(const AttachmentParams& params) override; void detachAsDepth(bool read) override; void attachAsStencil(const AttachmentParams& params) override; void detachAsStencil(bool read) override; // @fb-only [[nodiscard]] GLuint getId() const override { IGL_DEBUG_ASSERT_NOT_REACHED(); return 0; } private: [[nodiscard]] bool canPresent() const noexcept override; void attach(GLenum attachment, const AttachmentParams& params, GLuint renderBufferId); /// @returns false if an unknown format is specified bool toRenderBufferFormatGL(TextureDesc::TextureUsage usage, GLenum& formatGL) const; Result createRenderBuffer(const TextureDesc& desc, bool hasStorageAlready); GLuint renderBufferID_ = 0; #if IGL_PLATFORM_IOS bool canPresent_ = false; #else bool canPresent_ = true; #endif }; } // namespace igl::opengl ================================================ FILE: src/igl/opengl/Timer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace igl::opengl { #ifndef GL_TIME_ELAPSED #define GL_TIME_ELAPSED 0x88BF #endif #ifndef GL_QUERY_RESULT #define GL_QUERY_RESULT 0x8866 #endif #ifndef GL_QUERY_RESULT_AVAILABLE #define GL_QUERY_RESULT_AVAILABLE 0x8867 #endif #ifndef GL_GPU_DISJOINT_EXT #define GL_GPU_DISJOINT_EXT 0x8FBB #endif Timer::Timer(IContext& context) : WithContext(context) { iglGenQueries(1, &id_); iglBeginQuery(GL_TIME_ELAPSED, id_); } Timer::~Timer() { iglDeleteQueries(1, &id_); } void Timer::end() { iglEndQuery(GL_TIME_ELAPSED); } uint64_t Timer::getElapsedTimeNanos() const { // Check for GPU disjoint event (power management, context switch, etc.) // If a disjoint occurred, the timing results are invalid if (DeviceFeatureSet::usesOpenGLES()) { GLint disjoint = 0; getContext().getIntegerv(GL_GPU_DISJOINT_EXT, &disjoint); if (disjoint) { return 0; } } GLuint64 result = 0; iglGetQueryObjectui64v(id_, GL_QUERY_RESULT, &result); return result; } bool Timer::resultsAvailable() const { GLint available = 0; iglGetQueryObjectiv(id_, GL_QUERY_RESULT_AVAILABLE, &available); // NOLINTNEXTLINE(readability-implicit-bool-conversion) return available; } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/Timer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::opengl { class Timer : public WithContext, public ITimer { public: explicit Timer(IContext& context); ~Timer() override; Timer(const Timer&) = delete; Timer& operator=(const Timer&) = delete; Timer(Timer&&) = delete; Timer& operator=(Timer&&) = delete; void end(); [[nodiscard]] uint64_t getElapsedTimeNanos() const override; [[nodiscard]] bool resultsAvailable() const override; private: GLuint id_ = 0; }; } // namespace igl::opengl ================================================ FILE: src/igl/opengl/TimestampQueries.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #ifndef GL_TIME_ELAPSED #define GL_TIME_ELAPSED 0x88BF #endif #ifndef GL_QUERY_RESULT_AVAILABLE #define GL_QUERY_RESULT_AVAILABLE 0x8867 #endif #ifndef GL_QUERY_RESULT #define GL_QUERY_RESULT 0x8866 #endif namespace igl::opengl { TimestampQueries::TimestampQueries(IContext& context, uint32_t maxSlots) : WithContext(context), maxSlots_(maxSlots) { queryIds_.resize(maxSlots); iglGenQueries(maxSlots, queryIds_.data()); } TimestampQueries::~TimestampQueries() { if (!queryIds_.empty()) { iglDeleteQueries(static_cast(queryIds_.size()), queryIds_.data()); } } uint32_t TimestampQueries::capacity() const { return maxSlots_; } uint32_t TimestampQueries::count() const { return currentIndex_; } void TimestampQueries::reset() { currentIndex_ = 0; } bool TimestampQueries::resultsAvailable() const { if (currentIndex_ == 0) { return false; } GLint available = 0; iglGetQueryObjectiv(queryIds_[currentIndex_ - 1], GL_QUERY_RESULT_AVAILABLE, &available); return available != 0; } uint64_t TimestampQueries::getElapsedNanos(uint32_t slotIndex) const { if (slotIndex >= currentIndex_) { return 0; } GLint available = 0; iglGetQueryObjectiv(queryIds_[slotIndex], GL_QUERY_RESULT_AVAILABLE, &available); if (!available) { return 0; } GLuint64 result = 0; iglGetQueryObjectui64v(queryIds_[slotIndex], GL_QUERY_RESULT, &result); return result; } void TimestampQueries::beginElapsedQuery(uint32_t slotIndex) { if (slotIndex >= maxSlots_) { return; } iglBeginQuery(GL_TIME_ELAPSED, queryIds_[slotIndex]); if (slotIndex >= currentIndex_) { currentIndex_ = slotIndex + 1; } } void TimestampQueries::endElapsedQuery() { iglEndQuery(GL_TIME_ELAPSED); } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/TimestampQueries.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include namespace igl::opengl { class TimestampQueries : public ITimestampQueries, public WithContext { public: TimestampQueries(IContext& context, uint32_t maxSlots); ~TimestampQueries() override; TimestampQueries(TimestampQueries&&) = delete; TimestampQueries& operator=(TimestampQueries&&) = delete; TimestampQueries(const TimestampQueries&) = delete; TimestampQueries& operator=(const TimestampQueries&) = delete; [[nodiscard]] uint32_t capacity() const override; [[nodiscard]] uint32_t count() const override; void reset() override; [[nodiscard]] bool resultsAvailable() const override; [[nodiscard]] uint64_t getElapsedNanos(uint32_t slotIndex) const override; /// Start a GL_TIME_ELAPSED query for the given timing slot. /// Must be paired with endElapsedQuery(). Cannot be nested. void beginElapsedQuery(uint32_t slotIndex); /// End the active GL_TIME_ELAPSED query. void endElapsedQuery(); private: std::vector queryIds_; uint32_t maxSlots_ = 0; uint32_t currentIndex_ = 0; // not atomic — GL is single-threaded }; } // namespace igl::opengl ================================================ FILE: src/igl/opengl/UnbindPolicy.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once namespace igl::opengl { enum class UnbindPolicy : uint8_t { Default, // Do nothing EndScope, // Unbind at end of scope /// Unbinding a device when it's no longer scoped will clear the context from being current. ClearContext, }; } // namespace igl::opengl ================================================ FILE: src/igl/opengl/UniformAdapter.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace igl::opengl { UniformAdapter::UniformAdapter(const IContext& context, PipelineType type) : pipelineType_(type) { // NOTE: 32 "feels" right and yielded good results in MobileLab. Goal here is to minimize // number of resize's in the vector but not be unreasonably large. constexpr size_t kLikelyMaximumNumUniforms = 32; uniforms_.reserve(kLikelyMaximumNumUniforms); const auto& deviceFeatures = context.deviceFeatures(); if (pipelineType_ == PipelineType::Render) { maxUniforms_ = deviceFeatures.getMaxVertexUniforms() + deviceFeatures.getMaxFragmentUniforms(); } else { maxUniforms_ = deviceFeatures.getMaxComputeUniforms(); } deviceFeatures.getFeatureLimits(DeviceFeatureLimits::BufferAlignment, uniformBufferAlignment_); uniformBuffersDirtyMask_ = 0; #if IGL_DEBUG uniformsDirty_.resize(maxUniforms_); #endif } void UniformAdapter::shrinkUniformUsage() { static constexpr uint32_t kMaxUniformBytes = 32 * 1024; static constexpr uint32_t kMaxShrinkUniformCounter = 1000; if (uniformData_.size() > kMaxUniformBytes && usedUniformDataBytes_ < uniformData_.size() / 2) { shrinkUniformDataCounter_++; if (shrinkUniformDataCounter_ > kMaxShrinkUniformCounter) { uniformData_.resize(uniformData_.size() / 2); shrinkUniformDataCounter_ = 0; } } else { shrinkUniformDataCounter_ = 0; } } void UniformAdapter::clearUniformBuffers() { usedUniformDataBytes_ = 0; uniforms_.clear(); uniformBuffersDirtyMask_ = 0; #if IGL_DEBUG std::fill(uniformsDirty_.begin(), uniformsDirty_.end(), false); #endif } void UniformAdapter::setUniform(const UniformDesc& uniformDesc, const void* data, Result* outResult) { auto location = uniformDesc.location; IGL_DEBUG_ASSERT(location >= 0, "Invalid uniformDesc->location passed to setUniform"); // Early out if any of the parameters are invalid. if (location < 0 || location >= maxUniforms_ || !data) { Result::setResult(outResult, Result::Code::ArgumentInvalid); IGL_LOG_INFO_ONCE("IGL WARNING: Invalid parameters found for setUniform. Location (%d) \n", location); return; } const std::ptrdiff_t typeSize = igl::sizeForUniformElementType(uniformDesc.type); std::ptrdiff_t length = uniformDesc.elementStride != 0 ? uniformDesc.elementStride : igl::sizeForUniformType(uniformDesc.type); length *= uniformDesc.numElements; // Make sure typeSize is not 0 and is a power of 2 if (!IGL_DEBUG_VERIFY((typeSize != 0) && ((typeSize - 1) & typeSize) == 0)) { Result::setResult( outResult, Result::Code::InvalidOperation, "typeSize is 0 or not a power of 2"); IGL_LOG_INFO_ONCE("IGL WARNING: Invalid typeSize (%zu) is used. Found 0 or not power of 2\n", typeSize); return; } // Calculate the next size-aligned offset. Since typeSize is always a power // of 2, ~(typeSize - 1) will mask off the unaligned bits. Since masking // bits off is like a subtraction, we need to add (typeSize - 1) to make // sure we are still moving forward in the address space. const std::ptrdiff_t dataOffset = (usedUniformDataBytes_ + (typeSize - 1)) & ~(typeSize - 1); // Make sure dataOffset is typeSize aligned if (!IGL_DEBUG_VERIFY((dataOffset & (typeSize - 1)) == 0)) { Result::setResult( outResult, Result::Code::InvalidOperation, "dataOffset is not typeSize aligned"); IGL_LOG_INFO_ONCE( "IGL WARNING: Invalid dataOffset alignment(%td) for typeSize(%zu)\n", dataOffset, typeSize); return; } usedUniformDataBytes_ = dataOffset + length; if (usedUniformDataBytes_ > uniformData_.size()) { uniformData_.resize(usedUniformDataBytes_); } optimizedMemcpy(uniformData_.data() + dataOffset, (uint8_t*)data + uniformDesc.offset, length); #if IGL_DEBUG // We don't catch duplicate uniforms set on a given location in production. // This is technically a client bug and we shouldn't be doing this sort of // error-checking, as we're in the inner loop of rendering. // // Instead, we warn in local dev builds to catch if we're setting uniform block // in same location previously set (in either uniform or block) during the draw call. if (uniformsDirty_[location]) { IGL_LOG_INFO_ONCE("uniform location %d is already dirty\n", location); } uniformsDirty_[location] = true; #endif // IGL_DEBUG IGL_DEBUG_ASSERT(uniforms_.size() < maxUniforms_); uniforms_.emplace_back(uniformDesc, dataOffset); Result::setOk(outResult); } void UniformAdapter::setUniformBuffer(IBuffer* buffer, size_t offset, size_t size, uint32_t bindingIndex, Result* outResult) { IGL_DEBUG_ASSERT(bindingIndex <= IGL_UNIFORM_BLOCKS_BINDING_MAX, "Uniform buffer index %u is beyond max %u", bindingIndex, IGL_UNIFORM_BLOCKS_BINDING_MAX); IGL_DEBUG_ASSERT(buffer, "invalid buffer passed to setUniformBuffer"); if (bindingIndex < IGL_UNIFORM_BLOCKS_BINDING_MAX && buffer) { uniformBufferBindingMap_[bindingIndex] = {buffer, offset, size}; uniformBuffersDirtyMask_ |= 1 << bindingIndex; Result::setOk(outResult); } else { Result::setResult(outResult, Result::Code::ArgumentInvalid); } } void UniformAdapter::bindToPipeline(IContext& context) { // bind uniforms for (const auto& uniform : uniforms_) { const auto& uniformDesc = uniform.desc; IGL_DEBUG_ASSERT(uniformDesc.location >= 0); IGL_DEBUG_ASSERT(uniformData_.data(), "Uniform data must be non-null"); auto* start = uniformData_.data() + uniform.dataOffset; if (uniformDesc.numElements > 1 || uniformDesc.type == UniformType::Mat3x3) { IGL_DEBUG_ASSERT(uniformDesc.elementStride > 0, "stride has to be larger than 0 for uniform at offset %zu", uniformDesc.offset); UniformBuffer::bindUniformArray(context, uniformDesc.location, uniformDesc.type, start, uniformDesc.numElements, uniformDesc.elementStride); } else { UniformBuffer::bindUniform(context, uniformDesc.location, uniformDesc.type, start, 1); } } uniforms_.clear(); #if IGL_DEBUG std::fill(uniformsDirty_.begin(), uniformsDirty_.end(), false); #endif // bind uniform block buffers for (size_t bindingIndex = 0; bindingIndex < IGL_UNIFORM_BLOCKS_BINDING_MAX; ++bindingIndex) { if (uniformBuffersDirtyMask_ & (1 << bindingIndex)) { auto uniformBinding = uniformBufferBindingMap_.at(bindingIndex); auto* bufferState = static_cast(uniformBinding.buffer); IGL_DEBUG_ASSERT(bufferState); if (uniformBinding.offset) { IGL_DEBUG_ASSERT(uniformBinding.offset % uniformBufferAlignment_ == 0, "Offset{%d} must be a multiple of uniformBufferAlignment{%d}", uniformBinding.offset, uniformBufferAlignment_); bufferState->bindRange(bindingIndex, uniformBinding.offset, uniformBinding.size, nullptr); } else { bufferState->bindBase(bindingIndex, nullptr); } } } uniformBuffersDirtyMask_ = 0; } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/UniformAdapter.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include namespace igl::opengl { class IContext; class UniformAdapter { public: // Feel like this can be placed somewhere better enum class PipelineType { Render = 1, Compute = 2, }; UniformAdapter(const IContext& context, PipelineType type); void shrinkUniformUsage(); void clearUniformBuffers(); void setUniform(const UniformDesc& uniformDesc, const void* data, Result* outResult); void setUniformBuffer(IBuffer* buffer, size_t offset, size_t size, uint32_t index, Result* outResult); [[nodiscard]] uint32_t getMaxUniforms() const { return maxUniforms_; } void bindToPipeline(IContext& context); private: struct UniformState { UniformState() = default; UniformState(UniformDesc d, std::ptrdiff_t o) : desc(std::move(d)), dataOffset(o) {} UniformDesc desc; std::ptrdiff_t dataOffset = 0; }; std::vector uniforms_; std::vector uniformData_; uint32_t maxUniforms_ = 1024; size_t uniformBufferAlignment_ = 16; struct UniformBufferRange { IBuffer* buffer = nullptr; size_t offset = 0; size_t size = 0; }; // map for uniform binding indices to the buffers std::unordered_map uniformBufferBindingMap_; uint32_t uniformBuffersDirtyMask_ = 0; static_assert(sizeof(uniformBuffersDirtyMask_) * 8 >= IGL_UNIFORM_BLOCKS_BINDING_MAX, "uniformBuffersDirtyMask size is not enough to fit the flags"); // Store a copy of uniform data when setUniform is used to avoid the client from managing the // memory std::ptrdiff_t usedUniformDataBytes_ = 0; uint16_t shrinkUniformDataCounter_ = 0; PipelineType pipelineType_; #if IGL_DEBUG std::vector uniformsDirty_; #endif // IGL_DEBUG }; } // namespace igl::opengl ================================================ FILE: src/igl/opengl/UniformBuffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include // for memcpy() #include #include #include namespace igl::opengl { namespace { // There's a non-zero chance of unexpected behavior if limit is larger than available stack size const size_t kAllocSizeLimit = 512; } // namespace enum class UniformBaseType { Invalid = 0, Boolean, Int, Float, FloatMatrix }; template using ArrayHolder = std::unique_ptr; // This can't be a function because alloc result goes away on function return #define IGL_MAYBE_STACK_ALLOC(Type, count) \ (sizeof(Type) * count) > kAllocSizeLimit \ ? ArrayHolder(reinterpret_cast(malloc(sizeof(Type) * count)), \ [](auto* addr) { free(reinterpret_cast(addr)); }) \ : ArrayHolder(reinterpret_cast(alloca(sizeof(Type) * count)), [](auto*) {}) // ******************************** // **** Buffer // ******************************** // the base buffer object UniformBuffer::UniformBuffer(IContext& context, BufferDesc::BufferAPIHint requestedApiHints, BufferDesc::BufferType bufferType) : Buffer(context, requestedApiHints, bufferType) { isDynamic_ = false; } UniformBuffer::~UniformBuffer() { isDynamic_ = false; } bool UniformBuffer::initializeCommon(const BufferDesc& desc, Result* outResult) { bool success = true; isDynamic_ = false; if (desc.data == nullptr) { Result::setResult(outResult, Result::Code::ArgumentNull, "Data in uniform desc is null"); success = false; } else if (desc.length == 0) { Result::setResult(outResult, Result::Code::ArgumentOutOfRange, "Size of data in uniform desc (length) needs to be larger than 0"); success = false; } return success; } // initialize a buffer with the given size // if data is not null, copy the data into the buffer // if the buffer is to be updated frequently, isDynamic should be set to true void UniformBuffer::initialize(const BufferDesc& desc, Result* outResult) { if (!initializeCommon(desc, outResult)) { return; } uniformData_.resize(desc.length); memcpy(uniformData_.data(), desc.data, desc.length); Result::setOk(outResult); } // upload data to the buffer at the given offset with the given size Result UniformBuffer::upload(const void* data, const BufferRange& range) { if (!IGL_DEBUG_VERIFY(range.offset + range.size <= getSizeInBytes())) { return Result{Result::Code::ArgumentOutOfRange, "Range size is larger than data size"}; } checked_memcpy_offset(uniformData_.data(), uniformData_.size(), range.offset, data, range.size); return Result(); } void* UniformBuffer::map(const BufferRange& range, Result* outResult) { if (getSizeInBytes() < (range.size + range.offset)) { Result::setResult(outResult, Result::Code::ArgumentOutOfRange, "map() size + offset must be less than buffer size"); return nullptr; } Result::setOk(outResult); return uniformData_.data() + range.offset; } void UniformBuffer::unmap() {} void UniformBuffer::printUniforms(GLint program) { GLint i = 0; GLint count = 0; GLint size = 0; // size of the variable GLenum type = 0; // type of the variable (float, vec3 or mat4, etc) const GLsizei bufSize = 16; // maximum name length GLchar name[bufSize]; // variable name in GLSL GLsizei length = 0; // name length getContext().getProgramiv(program, GL_ACTIVE_UNIFORMS, &count); IGL_LOG_DEBUG("Active Uniforms: %d\n", count); for (i = 0; i < count; i++) { getContext().getActiveUniform(program, (GLuint)i, bufSize, &length, &size, &type, name); IGL_LOG_DEBUG("Uniform #%d Type: %u Name: %s\n", i, type, name); } } void UniformBuffer::bindUniform(IContext& context, GLint shaderLocation, UniformType uniformType, const uint8_t* start, size_t stCount) { if (IGL_DEBUG_VERIFY(shaderLocation >= 0)) { // If a glerror is hit within and of the getContext().uniform*** methods, // renderCommandEncoder->bindBuffer()'s index parameter likely does not map to the correct // location in the shader auto* uniformFloats = (GLfloat*)(start); auto* uniformInts = (GLint*)(start); auto count = static_cast(stCount); switch (uniformType) { case UniformType::Int: context.uniform1iv(shaderLocation, count, uniformInts); break; case UniformType::Int2: context.uniform2iv(shaderLocation, count, uniformInts); break; case UniformType::Int3: context.uniform3iv(shaderLocation, count, uniformInts); break; case UniformType::Int4: context.uniform4iv(shaderLocation, count, uniformInts); break; case UniformType::Boolean: { // UniformType::Boolean is 1 byte, and at least for this case, IGL // expects the data to be packed. However, since glUniform1*() expects // each boolean to be passed in as GLint, we unpack the byte array // into GLint array. const std::unique_ptr boolArray(new GLint[count]); for (size_t i = 0; i < count; i++) { boolArray[i] = static_cast(!(*(start + i) == 0u)); } context.uniform1iv(shaderLocation, count, boolArray.get()); break; } case UniformType::Float: context.uniform1fv(shaderLocation, count, uniformFloats); break; case UniformType::Float2: context.uniform2fv(shaderLocation, count, uniformFloats); break; case UniformType::Float3: context.uniform3fv(shaderLocation, count, uniformFloats); break; case UniformType::Float4: context.uniform4fv(shaderLocation, count, uniformFloats); break; case UniformType::Mat2x2: context.uniformMatrix2fv(shaderLocation, count, 0u, uniformFloats); break; case UniformType::Mat3x3: context.uniformMatrix3fv(shaderLocation, count, 0u, uniformFloats); break; case UniformType::Mat4x4: context.uniformMatrix4fv(shaderLocation, count, 0u, uniformFloats); break; case UniformType::Invalid: IGL_DEBUG_ABORT("Invalid Uniform Type"); return; } } } // NOLINTBEGIN(bugprone-easily-swappable-parameters) void UniformBuffer::bindUniformArray(IContext& context, GLint shaderLocation, UniformType uniformType, const uint8_t* start, size_t numElements, size_t stride) { // NOLINTEND(bugprone-easily-swappable-parameters) const size_t packedSize = igl::sizeForUniformType(uniformType); size_t primitivesPerElement = 0; UniformBaseType baseType = UniformBaseType::Invalid; if (packedSize == stride) { UniformBuffer::bindUniform(context, shaderLocation, uniformType, start, numElements); } else { switch (uniformType) { case UniformType::Boolean: baseType = UniformBaseType::Boolean; break; case UniformType::Int: primitivesPerElement = 1; baseType = UniformBaseType::Int; break; case UniformType::Int2: primitivesPerElement = 2; baseType = UniformBaseType::Int; break; case UniformType::Int3: primitivesPerElement = 3; baseType = UniformBaseType::Int; break; case UniformType::Int4: primitivesPerElement = 4; baseType = UniformBaseType::Int; break; case UniformType::Float: primitivesPerElement = 1; baseType = UniformBaseType::Float; break; case UniformType::Float2: primitivesPerElement = 2; baseType = UniformBaseType::Float; break; case UniformType::Float3: primitivesPerElement = 3; baseType = UniformBaseType::Float; break; case UniformType::Float4: primitivesPerElement = 4; baseType = UniformBaseType::Float; break; case UniformType::Mat2x2: primitivesPerElement = 2; baseType = UniformBaseType::FloatMatrix; break; case UniformType::Mat3x3: primitivesPerElement = 3; baseType = UniformBaseType::FloatMatrix; break; case UniformType::Mat4x4: primitivesPerElement = 4; baseType = UniformBaseType::FloatMatrix; break; case UniformType::Invalid: IGL_DEBUG_ABORT("Invalid Uniform Type"); return; } switch (baseType) { case UniformBaseType::Boolean: { auto packedIntArray = IGL_MAYBE_STACK_ALLOC(GLint, numElements); for (int i = 0; i < numElements; i++) { packedIntArray[i] = static_cast(!(*(start) == 0u)); start += stride; } UniformBuffer::bindUniform( context, shaderLocation, UniformType::Int, (uint8_t*)packedIntArray.get(), numElements); break; } case UniformBaseType::Int: { auto packedIntArray = IGL_MAYBE_STACK_ALLOC(GLint, primitivesPerElement * numElements); for (int i = 0; i < numElements; i++) { optimizedMemcpy( &packedIntArray[i * primitivesPerElement], start, primitivesPerElement * sizeof(GLint)); start += stride; } UniformBuffer::bindUniform( context, shaderLocation, uniformType, (uint8_t*)packedIntArray.get(), numElements); break; } case UniformBaseType::Float: { auto packedFloatArray = IGL_MAYBE_STACK_ALLOC(GLfloat, primitivesPerElement * numElements); for (int i = 0; i < numElements; i++) { optimizedMemcpy(&packedFloatArray[i * primitivesPerElement], start, primitivesPerElement * sizeof(GLfloat)); start += stride; } UniformBuffer::bindUniform( context, shaderLocation, uniformType, (uint8_t*)packedFloatArray.get(), numElements); break; } case UniformBaseType::FloatMatrix: { auto packedFloatArray = IGL_MAYBE_STACK_ALLOC(GLfloat, primitivesPerElement * primitivesPerElement * numElements); for (int i = 0; i < numElements; i++) { for (int j = 0; j < primitivesPerElement; j++) { const size_t bytesToCopy = primitivesPerElement * sizeof(GLfloat); memcpy(&packedFloatArray[i * primitivesPerElement * primitivesPerElement + j * primitivesPerElement], start, bytesToCopy); start += (stride / primitivesPerElement); } } UniformBuffer::bindUniform( context, shaderLocation, uniformType, (uint8_t*)packedFloatArray.get(), numElements); } break; case UniformBaseType::Invalid: default: return; } } } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/UniformBuffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl { class ICommandBuffer; namespace opengl { class UniformBuffer final : public Buffer { public: UniformBuffer(IContext& context, BufferDesc::BufferAPIHint requestedApiHints, BufferDesc::BufferType bufferType); ~UniformBuffer() override; UniformBuffer(const UniformBuffer&) = delete; UniformBuffer& operator=(const UniformBuffer&) = delete; UniformBuffer(UniformBuffer&&) = delete; UniformBuffer& operator=(UniformBuffer&&) = delete; Result upload(const void* data, const BufferRange& range) override; void* map(const BufferRange& range, Result* outResult) override; void unmap() override; [[nodiscard]] BufferDesc::BufferAPIHint acceptedApiHints() const noexcept override { return 0; } [[nodiscard]] ResourceStorage storage() const noexcept override { return ResourceStorage::Shared; } [[nodiscard]] size_t getSizeInBytes() const override { return uniformData_.size(); } void initialize(const BufferDesc& desc, Result* outResult) override; [[nodiscard]] Type getType() const noexcept override { return Type::Uniform; } // For openGL, additional information required to bind the uniform is provided when the buffer is // created within the igl::BufferDesc and igl::UniformBufferEntry (eg. offset, type, elementStride // and number of elements). // // However location information is provided when the uniform is bound via the // index parameter of igl::renderCommandEncoder bindBuffer, the offset parameter is then used to // lookup the information specified at buffer creation time. This allows the same uniform buffer // to be reused in multiple shaders at different locations as long as creation value information // (offset, type, etc.) does not change. static void bindUniform(IContext& context, GLint shaderLocation, UniformType uniformType, const uint8_t* start, size_t count); static void bindUniformArray(IContext& context, GLint shaderLocation, UniformType uniformType, const uint8_t* start, size_t numElements, size_t stride); private: bool initializeCommon(const BufferDesc& desc, Result* outResult); void printUniforms(GLint program); // Copy of data from the client std::vector uniformData_; bool isDynamic_; // TODO: Add support for dynamic uniforms }; } // namespace opengl } // namespace igl ================================================ FILE: src/igl/opengl/Version.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include namespace igl::opengl { namespace { // Gets the highest version available in header files the app is compiled against. std::pair highestSupportedVersion() { #if IGL_OPENGL_ES #if defined(GL_ES_VERSION_3_2) return std::make_pair(3, 2); #elif defined(GL_ES_VERSION_3_1) return std::make_pair(3, 1); #elif defined(GL_ES_VERSION_3_0) return std::make_pair(3, 0); #elif defined(GL_ES_VERSION_2_0) return std::make_pair(2, 0); #else #error "IGL requires at least OpenGL ES 2.0"; #endif #else #if defined(GL_VERSION_4_6) return std::make_pair(4, 6); #elif defined(GL_VERSION_4_5) return std::make_pair(4, 5); #elif defined(GL_VERSION_4_4) return std::make_pair(4, 4); #elif defined(GL_VERSION_4_3) return std::make_pair(4, 3); #elif defined(GL_VERSION_4_2) return std::make_pair(4, 2); #elif defined(GL_VERSION_4_1) return std::make_pair(4, 1); #elif defined(GL_VERSION_4_0) return std::make_pair(4, 0); #elif defined(GL_VERSION_3_3) return std::make_pair(3, 3); #elif defined(GL_VERSION_3_2) return std::make_pair(3, 2); #elif defined(GL_VERSION_3_1) return std::make_pair(3, 1); #elif defined(GL_VERSION_3_0) return std::make_pair(3, 0); #elif defined(GL_VERSION_2_1) return std::make_pair(2, 1); #elif defined(GL_VERSION_2_0) return std::make_pair(2, 0); #else #error "IGL requires at least OpenGL 2.0"; #endif #endif // IGL_OPENGL_ES } // Constrains version to the highest version available in header files the app is compiled against. std::pair constrainVersion(uint32_t majorVersion, uint32_t minorVersion) { auto [supportedMajorVersion, supportedMinorVersion] = highestSupportedVersion(); if (majorVersion > supportedMajorVersion || (majorVersion == supportedMajorVersion && minorVersion > supportedMinorVersion)) { return std::make_pair(supportedMajorVersion, supportedMinorVersion); } else { return std::make_pair(majorVersion, minorVersion); } } // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) GLVersion getGLVersionEnum(uint32_t majorVersion, uint32_t minorVersion) { #if IGL_OPENGL_ES switch (majorVersion) { case 2: switch (minorVersion) { case 0: return GLVersion::v2_0_ES; default: IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); return GLVersion::v2_0_ES; } case 3: switch (minorVersion) { case 0: return GLVersion::v3_0_ES; case 1: return GLVersion::v3_1_ES; case 2: return GLVersion::v3_2_ES; default: IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); return GLVersion::v3_0_ES; } default: IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); return GLVersion::v2_0_ES; } #else switch (majorVersion) { case 1: return GLVersion::v1_1; case 2: switch (minorVersion) { case 0: return GLVersion::v2_0; case 1: return GLVersion::v2_1; default: IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); return GLVersion::v2_0; } case 3: switch (minorVersion) { case 0: return GLVersion::v3_0; case 1: return GLVersion::v3_1; case 2: return GLVersion::v3_2; case 3: return GLVersion::v3_3; default: IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); return GLVersion::v3_0; } case 4: switch (minorVersion) { case 0: return GLVersion::v4_0; case 1: return GLVersion::v4_1; case 2: return GLVersion::v4_2; case 3: return GLVersion::v4_3; case 4: return GLVersion::v4_4; case 5: return GLVersion::v4_5; case 6: return GLVersion::v4_6; default: IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); return GLVersion::v4_0; } default: IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); return GLVersion::v2_0; } #endif // IGL_OPENGL_ES } } // namespace std::pair parseVersionString(const char* version) { // If GL_MAJOR_VERSION and/or GL_MINOR_VERSION fail, // get the gl version from GL_VERSION string if (!version) { IGL_LOG_DEBUG("Unable to get GL version string\n"); return std::make_pair(2, 0); } uint32_t majorVersion = 0, minorVersion = 0; #if IGL_OPENGL_ES constexpr char versionFormat[] = "OpenGL ES %d.%d"; #else constexpr char versionFormat[] = "%d.%d"; #endif // IGL_OPENGL_ES #ifdef _MSC_VER const int ret = sscanf_s(version, versionFormat, &majorVersion, &minorVersion); #else const int ret = sscanf(version, versionFormat, &majorVersion, &minorVersion); #endif // _MSC_VER if (ret != 2) { IGL_LOG_DEBUG("failed to parse GL version string %s\n", version); return std::make_pair(2, 0); } return std::make_pair(majorVersion, minorVersion); } GLVersion getGLVersion(const char* version, bool constrain) { auto [majorVersion, minorVersion] = parseVersionString(version); if (constrain) { auto [constrainedMajorVersion, constrainedMinorVersion] = constrainVersion(majorVersion, minorVersion); #if IGL_LOGGING_ENABLED if (constrainedMajorVersion != majorVersion || constrainedMinorVersion != minorVersion) { #if IGL_OPENGL_ES static constexpr std::string_view kGl = "OpenGL ES"; #else static constexpr std::string_view kGl = "OpenGL"; #endif IGL_LOG_INFO( "Context supports %s %d.%d, but IGL was only compiled with support for %s " "%d.%d\n", kGl.data(), majorVersion, minorVersion, kGl.data(), constrainedMajorVersion, constrainedMinorVersion); IGL_LOG_INFO("Constraining supported version to %s %d.%d\n", kGl.data(), constrainedMajorVersion, constrainedMinorVersion); } #endif // IGL_LOGGING_ENABLED majorVersion = constrainedMajorVersion; minorVersion = constrainedMinorVersion; } return getGLVersionEnum(majorVersion, minorVersion); } ShaderVersion getShaderVersion(GLVersion version) { // TODO: Return proper GLSL ES versions switch (version) { case GLVersion::v2_0_ES: return {.family = ShaderFamily::GlslEs, .majorVersion = 1, .minorVersion = 0}; case GLVersion::v3_0_ES: return {.family = ShaderFamily::GlslEs, .majorVersion = 3, .minorVersion = 0}; case GLVersion::v3_1_ES: return {.family = ShaderFamily::GlslEs, .majorVersion = 3, .minorVersion = 10}; case GLVersion::v3_2_ES: return {.family = ShaderFamily::GlslEs, .majorVersion = 3, .minorVersion = 20}; case GLVersion::v2_0: return {.family = ShaderFamily::Glsl, .majorVersion = 1, .minorVersion = 10}; case GLVersion::v2_1: return {.family = ShaderFamily::Glsl, .majorVersion = 1, .minorVersion = 20}; case GLVersion::v3_0: return {.family = ShaderFamily::Glsl, .majorVersion = 1, .minorVersion = 30}; case GLVersion::v3_1: return {.family = ShaderFamily::Glsl, .majorVersion = 1, .minorVersion = 40}; case GLVersion::v3_2: return {.family = ShaderFamily::Glsl, .majorVersion = 1, .minorVersion = 50}; case GLVersion::v3_3: return {.family = ShaderFamily::Glsl, .majorVersion = 3, .minorVersion = 30}; case GLVersion::v4_0: return {.family = ShaderFamily::Glsl, .majorVersion = 4, .minorVersion = 0}; case GLVersion::v4_1: return {.family = ShaderFamily::Glsl, .majorVersion = 4, .minorVersion = 10}; case GLVersion::v4_2: return {.family = ShaderFamily::Glsl, .majorVersion = 4, .minorVersion = 20}; case GLVersion::v4_3: return {.family = ShaderFamily::Glsl, .majorVersion = 4, .minorVersion = 30}; case GLVersion::v4_4: return {.family = ShaderFamily::Glsl, .majorVersion = 4, .minorVersion = 40}; case GLVersion::v4_5: return {.family = ShaderFamily::Glsl, .majorVersion = 4, .minorVersion = 50}; case GLVersion::v4_6: return {.family = ShaderFamily::Glsl, .majorVersion = 4, .minorVersion = 60}; case GLVersion::v1_1: case GLVersion::NotAvailable: default: IGL_DEBUG_ASSERT_NOT_REACHED(); return {}; } } std::string getStringFromShaderVersion(ShaderVersion version) { if (version.family == ShaderFamily::GlslEs) { if (version.majorVersion == 1 && version.minorVersion == 0) { return "#version 100"; } else if (version.majorVersion == 3) { if (version.minorVersion == 0) { return "#version 300 es"; } else if (version.minorVersion == 10) { return "#version 310 es"; } else if (version.minorVersion == 20) { return "#version 320 es"; } else { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } } } else { if (version.majorVersion == 1) { if (version.minorVersion == 10) { return "#version 110"; } else if (version.minorVersion == 20) { return "#version 120"; } else if (version.minorVersion == 30) { return "#version 130"; } else if (version.minorVersion == 40) { return "#version 140"; } else if (version.minorVersion == 50) { return "#version 150"; } } else if (version.majorVersion == 3 && version.minorVersion == 30) { return "#version 330"; } else if (version.majorVersion == 4) { if (version.minorVersion == 0) { return "#version 400"; } else if (version.minorVersion == 10) { return "#version 410"; } else if (version.minorVersion == 20) { return "#version 420"; } else if (version.minorVersion == 30) { return "#version 430"; } else if (version.minorVersion == 40) { return "#version 440"; } else if (version.minorVersion == 50) { return "#version 450"; } else if (version.minorVersion == 60) { return "#version 460"; } } } IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); return ""; } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/Version.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::opengl { // NOLINTBEGIN(readability-identifier-naming) enum class GLVersion { NotAvailable, v1_1, v2_0_ES, v2_0, v2_1, v3_0_ES, v3_0, v3_1_ES, v3_1, v3_2_ES, v3_2, v3_3, v4_0, v4_1, v4_2, v4_3, v4_4, v4_5, v4_6 }; // NOLINTEND(readability-identifier-naming) std::pair parseVersionString(const char* version); GLVersion getGLVersion(const char* version, bool constrain = false); ShaderVersion getShaderVersion(GLVersion version); // Returns the version tag to provide at the top of the shader std::string getStringFromShaderVersion(ShaderVersion version); } // namespace igl::opengl ================================================ FILE: src/igl/opengl/VertexArrayObject.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace igl::opengl { Result VertexArrayObject::create() { getContext().genVertexArrays(1, &vertexAttriuteObject_); if (vertexAttriuteObject_ == 0) { return Result(Result::Code::RuntimeError, "Failed to create vertex array object ID"); } return Result(); } void VertexArrayObject::bind() const { getContext().bindVertexArray(vertexAttriuteObject_); } void VertexArrayObject::unbind() const { getContext().bindVertexArray(0); } bool VertexArrayObject::isValid() const { return vertexAttriuteObject_ != 0; } VertexArrayObject::~VertexArrayObject() { getContext().deleteVertexArrays(1, &vertexAttriuteObject_); } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/VertexArrayObject.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl { class ICommandBuffer; namespace opengl { class VertexArrayObject final : public WithContext { friend class Device; public: explicit VertexArrayObject(IContext& context) : WithContext(context) {} ~VertexArrayObject() override; VertexArrayObject(const VertexArrayObject&) = delete; VertexArrayObject& operator=(const VertexArrayObject&) = delete; VertexArrayObject(VertexArrayObject&&) = delete; VertexArrayObject& operator=(VertexArrayObject&&) = delete; Result create(); void bind() const; void unbind() const; [[nodiscard]] bool isValid() const; private: GLuint vertexAttriuteObject_ = ~0; }; } // namespace opengl } // namespace igl ================================================ FILE: src/igl/opengl/VertexInputState.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include namespace igl::opengl { // // A utility function to convert an IGL attribute to an OGL attribute // // NOLINTBEGIN(bugprone-easily-swappable-parameters) static void toOGLAttribute(const VertexAttribute& attrib, GLint& numComponents, GLenum& componentType, GLboolean& normalized) { // NOLINTEND(bugprone-easily-swappable-parameters) switch (attrib.format) { case VertexAttributeFormat::Float1: numComponents = 1; componentType = GL_FLOAT; normalized = GL_FALSE; break; case VertexAttributeFormat::Float2: numComponents = 2; componentType = GL_FLOAT; normalized = GL_FALSE; break; case VertexAttributeFormat::Float3: numComponents = 3; componentType = GL_FLOAT; normalized = GL_FALSE; break; case VertexAttributeFormat::Float4: numComponents = 4; componentType = GL_FLOAT; normalized = GL_FALSE; break; case VertexAttributeFormat::Byte1: numComponents = 1; componentType = GL_BYTE; normalized = GL_FALSE; break; case VertexAttributeFormat::Byte2: numComponents = 2; componentType = GL_BYTE; normalized = GL_FALSE; break; case VertexAttributeFormat::Byte3: numComponents = 3; componentType = GL_BYTE; normalized = GL_FALSE; break; case VertexAttributeFormat::Byte4: numComponents = 4; componentType = GL_BYTE; normalized = GL_FALSE; break; case VertexAttributeFormat::UByte1: numComponents = 1; componentType = GL_UNSIGNED_BYTE; normalized = GL_FALSE; break; case VertexAttributeFormat::UByte2: numComponents = 2; componentType = GL_UNSIGNED_BYTE; normalized = GL_FALSE; break; case VertexAttributeFormat::UByte3: numComponents = 3; componentType = GL_UNSIGNED_BYTE; normalized = GL_FALSE; break; case VertexAttributeFormat::UByte4: numComponents = 4; componentType = GL_UNSIGNED_BYTE; normalized = GL_FALSE; break; case VertexAttributeFormat::Short1: numComponents = 1; componentType = GL_SHORT; normalized = GL_FALSE; break; case VertexAttributeFormat::Short2: numComponents = 2; componentType = GL_SHORT; normalized = GL_FALSE; break; case VertexAttributeFormat::Short3: numComponents = 3; componentType = GL_SHORT; normalized = GL_FALSE; break; case VertexAttributeFormat::Short4: numComponents = 4; componentType = GL_SHORT; normalized = GL_FALSE; break; case VertexAttributeFormat::UShort1: numComponents = 1; componentType = GL_UNSIGNED_SHORT; normalized = GL_FALSE; break; case VertexAttributeFormat::UShort2: numComponents = 2; componentType = GL_UNSIGNED_SHORT; normalized = GL_FALSE; break; case VertexAttributeFormat::UShort3: numComponents = 3; componentType = GL_UNSIGNED_SHORT; normalized = GL_FALSE; break; case VertexAttributeFormat::UShort4: numComponents = 4; componentType = GL_UNSIGNED_SHORT; normalized = GL_FALSE; break; case VertexAttributeFormat::Byte1Norm: numComponents = 1; componentType = GL_BYTE; normalized = GL_TRUE; break; case VertexAttributeFormat::Byte2Norm: numComponents = 2; componentType = GL_BYTE; normalized = GL_TRUE; break; case VertexAttributeFormat::Byte3Norm: numComponents = 3; componentType = GL_BYTE; normalized = GL_TRUE; break; case VertexAttributeFormat::Byte4Norm: numComponents = 4; componentType = GL_BYTE; normalized = GL_TRUE; break; case VertexAttributeFormat::UByte1Norm: numComponents = 1; componentType = GL_UNSIGNED_BYTE; normalized = GL_TRUE; break; case VertexAttributeFormat::UByte2Norm: numComponents = 2; componentType = GL_UNSIGNED_BYTE; normalized = GL_TRUE; break; case VertexAttributeFormat::UByte3Norm: numComponents = 3; componentType = GL_UNSIGNED_BYTE; normalized = GL_TRUE; break; case VertexAttributeFormat::UByte4Norm: numComponents = 4; componentType = GL_UNSIGNED_BYTE; normalized = GL_TRUE; break; case VertexAttributeFormat::Short1Norm: numComponents = 1; componentType = GL_SHORT; normalized = GL_TRUE; break; case VertexAttributeFormat::Short2Norm: numComponents = 2; componentType = GL_SHORT; normalized = GL_TRUE; break; case VertexAttributeFormat::Short3Norm: numComponents = 3; componentType = GL_SHORT; normalized = GL_TRUE; break; case VertexAttributeFormat::Short4Norm: numComponents = 4; componentType = GL_SHORT; normalized = GL_TRUE; break; case VertexAttributeFormat::UShort1Norm: numComponents = 1; componentType = GL_UNSIGNED_SHORT; normalized = GL_TRUE; break; case VertexAttributeFormat::UShort2Norm: numComponents = 2; componentType = GL_UNSIGNED_SHORT; normalized = GL_TRUE; break; case VertexAttributeFormat::UShort3Norm: numComponents = 3; componentType = GL_UNSIGNED_SHORT; normalized = GL_TRUE; break; case VertexAttributeFormat::UShort4Norm: numComponents = 4; componentType = GL_UNSIGNED_SHORT; normalized = GL_TRUE; break; case VertexAttributeFormat::Int1: numComponents = 1; componentType = GL_INT; normalized = GL_FALSE; break; case VertexAttributeFormat::Int2: numComponents = 2; componentType = GL_INT; normalized = GL_FALSE; break; case VertexAttributeFormat::Int3: numComponents = 3; componentType = GL_INT; normalized = GL_FALSE; break; case VertexAttributeFormat::Int4: numComponents = 4; componentType = GL_INT; normalized = GL_FALSE; break; case VertexAttributeFormat::UInt1: numComponents = 1; componentType = GL_UNSIGNED_INT; normalized = GL_FALSE; break; case VertexAttributeFormat::UInt2: numComponents = 2; componentType = GL_UNSIGNED_INT; normalized = GL_FALSE; break; case VertexAttributeFormat::UInt3: numComponents = 3; componentType = GL_UNSIGNED_INT; normalized = GL_FALSE; break; case VertexAttributeFormat::UInt4: numComponents = 4; componentType = GL_UNSIGNED_INT; normalized = GL_FALSE; break; case VertexAttributeFormat::HalfFloat1: numComponents = 1; componentType = GL_HALF_FLOAT; normalized = GL_FALSE; break; case VertexAttributeFormat::HalfFloat2: numComponents = 2; componentType = GL_HALF_FLOAT; normalized = GL_FALSE; break; case VertexAttributeFormat::HalfFloat3: numComponents = 3; componentType = GL_HALF_FLOAT; normalized = GL_FALSE; break; case VertexAttributeFormat::HalfFloat4: numComponents = 4; componentType = GL_HALF_FLOAT; normalized = GL_FALSE; break; case VertexAttributeFormat::Int_2_10_10_10_REV: numComponents = 4; componentType = GL_INT_2_10_10_10_REV; normalized = GL_TRUE; break; // Purposely not have a default case so we can catch missing enum at build // time. The current assumption is all IGL attribute has a corresponding // GL attribute } } Result VertexInputState::create(const VertexInputStateDesc& desc) { if (desc.numAttributes == 0) { return Result(); } if (desc.numInputBindings == 1) { // All the attributed should have the same bufferIndex const int bufferIndex = desc.attributes[0].bufferIndex; for (int i = 1; i < desc.numAttributes; i++) { if (desc.attributes[i].bufferIndex != bufferIndex) { return Result{ Result::Code::ArgumentInvalid, "numInputBindings is 1; So all the attributes must have the same bufferIndex"}; } } } // Process the incoming attributes and associate them with buffers for (size_t i = 0; i < desc.numAttributes; i++) { OGLAttribute attribInfo; const size_t bufferIndex = desc.attributes[i].bufferIndex; attribInfo.name = desc.attributes[i].name; attribInfo.stride = desc.inputBindings[bufferIndex].stride; attribInfo.bufferOffset = desc.attributes[i].offset; toOGLAttribute(desc.attributes[i], attribInfo.numComponents, attribInfo.componentType, attribInfo.normalized); attribInfo.sampleFunction = desc.inputBindings[bufferIndex].sampleFunction; attribInfo.sampleRate = desc.inputBindings[bufferIndex].sampleRate; bufferOGLAttribMap_[bufferIndex].push_back(attribInfo); } return Result(); } const std::vector& VertexInputState::getAssociatedAttributes(size_t bufferIndex) { return bufferOGLAttribMap_[bufferIndex]; } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/VertexInputState.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include namespace igl { class ICommandBuffer; namespace opengl { // This structure stores OGL-specific attribute info. Location is specifically // not included because it is shader-dependent struct OGLAttribute { std::string name; GLsizei stride = 0; uintptr_t bufferOffset = 0; GLint numComponents = 0; GLenum componentType = GL_FLOAT; GLboolean normalized = 0u; VertexSampleFunction sampleFunction = VertexSampleFunction::PerVertex; size_t sampleRate = 1; OGLAttribute() = default; }; class VertexInputState final : public IVertexInputState { friend class Device; public: Result create(const VertexInputStateDesc& desc); // Returns a list of attributes associated with the buffer. An empty vector // will be returned the bufferIndex is invalid const std::vector& getAssociatedAttributes(size_t bufferIndex); // Returns a read-only reference to the bufferOGLAttribMap_ [[nodiscard]] const std::unordered_map>& getBufferAttribMap() const { return bufferOGLAttribMap_; } private: std::unordered_map> bufferOGLAttribMap_; }; } // namespace opengl } // namespace igl ================================================ FILE: src/igl/opengl/ViewTextureTarget.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include namespace igl::opengl { TextureType ViewTextureTarget::getType() const { return TextureType::TwoD; } TextureDesc::TextureUsage ViewTextureTarget::getUsage() const { return TextureDesc::TextureUsageBits::Attachment; } void ViewTextureTarget::bind() { IGL_DEBUG_ASSERT_NOT_REACHED(); } void ViewTextureTarget::bindImage(size_t /*unit*/) { IGL_DEBUG_ASSERT_NOT_REACHED(); } void ViewTextureTarget::unbind() { IGL_DEBUG_ASSERT_NOT_REACHED(); } void ViewTextureTarget::attachAsColor(uint32_t /*index*/, const AttachmentParams& /*params*/) { // No-op. This texture is already attached to view's implicit framebuffer } void ViewTextureTarget::detachAsColor(uint32_t /*index*/, bool /*read*/) { // No-op. This cannot be done for this texture type. } void ViewTextureTarget::attachAsDepth(const AttachmentParams& /*params*/) { // No-op. This texture is already attached to view's implicit framebuffer } void ViewTextureTarget::detachAsDepth(bool /*read*/) { // No-op. This cannot be done for this texture type. } void ViewTextureTarget::attachAsStencil(const AttachmentParams& /*params*/) { // No-op. This texture is already attached to view's implicit framebuffer } void ViewTextureTarget::detachAsStencil(bool /*read*/) { // No-op. This cannot be done for this texture type. } bool ViewTextureTarget::isImplicitStorage() const { return true; } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/ViewTextureTarget.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::opengl { namespace egl { class PlatformDevice; } // namespace egl namespace wgl { class PlatformDevice; } // namespace wgl namespace webgl { class PlatformDevice; } // namespace webgl // ViewTextureTarget is a special implementation of opengl::Texture that's only available on certain // platforms. It represents the "texture" associated with the default framebuffer on OpenGL (i.e. // framebuffer with ID 0), which is not available on some platforms such as iOS. class ViewTextureTarget final : public Texture { friend class igl::opengl::egl::PlatformDevice; friend class igl::opengl::wgl::PlatformDevice; friend class igl::opengl::webgl::PlatformDevice; public: using Super = Texture; ViewTextureTarget(IContext& context, TextureFormat format) : Super(context, format) {} // ITexture overrides [[nodiscard]] TextureType getType() const override; [[nodiscard]] TextureDesc::TextureUsage getUsage() const override; // Texture overrides void bind() override; void bindImage(size_t /*unit*/) override; void unbind() override; void attachAsColor(uint32_t index, const AttachmentParams& params) override; void detachAsColor(uint32_t index, bool read) override; void attachAsDepth(const AttachmentParams& params) override; void detachAsDepth(bool read) override; void attachAsStencil(const AttachmentParams& params) override; void detachAsStencil(bool read) override; [[nodiscard]] bool isImplicitStorage() const override; // @fb-only [[nodiscard]] GLuint getId() const override { IGL_DEBUG_ASSERT_NOT_REACHED(); return 0; } }; } // namespace igl::opengl ================================================ FILE: src/igl/opengl/WithContext.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace igl::opengl { WithContext::WithContext(IContext& context) : context_(&context) { if (!context_->addRef()) { IGL_DEBUG_ABORT("Object created with an invalid IContext reference."); } } WithContext::~WithContext() { if (!context_->releaseRef()) { IGL_DEBUG_ABORT( "Object destroyed after the IContext." // @fb-only ); } } IContext& WithContext::getContext() const { IGL_DEBUG_ASSERT(context_->isLikelyValidObject(), "Accessing invalid IContext reference." // @fb-only ); return *context_; } } // namespace igl::opengl ================================================ FILE: src/igl/opengl/WithContext.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::opengl { class IContext; class WithContext { public: explicit WithContext(IContext& context); virtual ~WithContext(); // This type is not copyable. WithContext(const WithContext&) = delete; WithContext& operator=(const WithContext&) = delete; [[nodiscard]] IContext& getContext() const; private: IContext* context_; }; } // namespace igl::opengl ================================================ FILE: src/igl/opengl/egl/Context.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include #include #include #define CHECK_EGL_ERRORS() error_checking::checkForEGLErrors(__FILE__, __FUNCTION__, __LINE__) #ifndef EGL_OPENGL_ES3_BIT #define EGL_OPENGL_ES3_BIT 0x00000040 #endif namespace error_checking { #define CASE_ERROR_CODE_IMPL(egl_error_code) \ case egl_error_code: \ errorStr = #egl_error_code; \ break; static EGLint checkForEGLErrors(IGL_MAYBE_UNUSED const char* fileName, IGL_MAYBE_UNUSED const char* callerName, IGL_MAYBE_UNUSED size_t lineNum) { const EGLint errorCode = eglGetError(); if (errorCode != EGL_SUCCESS) { IGL_MAYBE_UNUSED const char* errorStr = nullptr; switch (errorCode) { // https://www.khronos.org/files/egl-1-4-quick-reference-card.pdf CASE_ERROR_CODE_IMPL(EGL_NOT_INITIALIZED); CASE_ERROR_CODE_IMPL(EGL_BAD_ACCESS); CASE_ERROR_CODE_IMPL(EGL_BAD_ALLOC); CASE_ERROR_CODE_IMPL(EGL_BAD_ATTRIBUTE); CASE_ERROR_CODE_IMPL(EGL_BAD_CONFIG); CASE_ERROR_CODE_IMPL(EGL_BAD_CONTEXT); CASE_ERROR_CODE_IMPL(EGL_BAD_CURRENT_SURFACE); CASE_ERROR_CODE_IMPL(EGL_BAD_DISPLAY); CASE_ERROR_CODE_IMPL(EGL_BAD_MATCH); CASE_ERROR_CODE_IMPL(EGL_BAD_NATIVE_PIXMAP); CASE_ERROR_CODE_IMPL(EGL_BAD_NATIVE_WINDOW); CASE_ERROR_CODE_IMPL(EGL_BAD_PARAMETER); CASE_ERROR_CODE_IMPL(EGL_BAD_SURFACE); CASE_ERROR_CODE_IMPL(EGL_CONTEXT_LOST); default: errorStr = ""; break; } IGL_DEBUG_ABORT("[IGL] EGL error [%s:%zu] in function: %s 0x%04X: %s\n", fileName, lineNum, callerName, errorCode, errorStr); } return errorCode; } } // namespace error_checking FOLLY_PUSH_WARNING FOLLY_GNU_DISABLE_WARNING("-Wzero-as-null-pointer-constant") namespace igl::opengl::egl { namespace { EGLDisplay getDefaultEGLDisplay() { auto* display = eglGetDisplay(EGL_DEFAULT_DISPLAY); CHECK_EGL_ERRORS(); return display; } // typical high-quality attrib list constexpr std::array kAttribsEs2{ EGLint{EGL_RED_SIZE}, EGLint{8}, EGLint{EGL_GREEN_SIZE}, EGLint{8}, EGLint{EGL_BLUE_SIZE}, EGLint{8}, EGLint{EGL_ALPHA_SIZE}, EGLint{8}, EGLint{EGL_DEPTH_SIZE}, EGLint{16}, EGLint{EGL_SURFACE_TYPE}, EGLint{EGL_PBUFFER_BIT}, EGLint{EGL_RENDERABLE_TYPE}, EGLint{EGL_OPENGL_ES2_BIT}, EGLint{EGL_NONE}, }; constexpr std::array kContextAttribsEs2{ EGLint{EGL_CONTEXT_CLIENT_VERSION}, EGLint{2}, EGLint{EGL_NONE}, }; constexpr std::array kAttribsEs3{ EGLint{EGL_RED_SIZE}, EGLint{8}, EGLint{EGL_GREEN_SIZE}, EGLint{8}, EGLint{EGL_BLUE_SIZE}, EGLint{8}, EGLint{EGL_ALPHA_SIZE}, EGLint{8}, EGLint{EGL_DEPTH_SIZE}, EGLint{16}, EGLint{EGL_SURFACE_TYPE}, EGLint{EGL_PBUFFER_BIT}, EGLint{EGL_RENDERABLE_TYPE}, EGLint{EGL_OPENGL_ES3_BIT}, EGLint{EGL_NONE}, }; constexpr std::array kContextAttribsEs3{ EGLint{EGL_CONTEXT_CLIENT_VERSION}, EGLint{3}, EGLint{EGL_NONE}, }; std::pair newEGLContext(uint8_t contextMajorVersion, EGLDisplay display, EGLContext shareContext, EGLConfig* config) { IGL_DEBUG_ASSERT(contextMajorVersion == 2 || contextMajorVersion == 3); if (display == EGL_NO_DISPLAY || !eglInitialize(display, nullptr, nullptr)) { CHECK_EGL_ERRORS(); // TODO: Handle error return std::make_pair(EGL_NO_DISPLAY, EGL_NO_CONTEXT); } if (!config) { IGL_DEBUG_ABORT("config is nullptr"); return std::make_pair(EGL_NO_DISPLAY, EGL_NO_CONTEXT); } EGLint numConfigs = 0; const auto& attribs = contextMajorVersion == 2 ? kAttribsEs2 : kAttribsEs3; const auto& contextAttribs = contextMajorVersion == 2 ? kContextAttribsEs2 : kContextAttribsEs3; if (!eglChooseConfig(display, attribs.data(), config, 1, &numConfigs)) { CHECK_EGL_ERRORS(); } auto res = std::make_pair( display, eglCreateContext(display, *config, shareContext, contextAttribs.data())); CHECK_EGL_ERRORS(); return res; } EGLConfig chooseConfig(uint8_t contextMajorVersion, EGLDisplay display) { IGL_DEBUG_ASSERT(contextMajorVersion == 2 || contextMajorVersion == 3); const auto& attribs = contextMajorVersion == 2 ? kAttribsEs2 : kAttribsEs3; EGLConfig config{nullptr}; EGLint numConfigs{0}; const EGLBoolean status = eglChooseConfig(display, attribs.data(), &config, 1, &numConfigs); CHECK_EGL_ERRORS(); if (!status) { IGL_DEBUG_ASSERT(status == EGL_TRUE, "eglChooseConfig failed"); } return config; } } // namespace ///-------------------------------------- /// MARK: - Context /*static*/ std::unique_ptr Context::createShareContext(Context& existingContext, EGLContext newContext, EGLSurface readSurface, EGLSurface drawSurface, Result* outResult) { if (newContext == EGL_NO_CONTEXT || readSurface == EGL_NO_SURFACE || drawSurface == EGL_NO_SURFACE) { Result::setResult(outResult, Result(Result::Code::ArgumentInvalid)); return nullptr; } auto sharegroup = existingContext.sharegroup_; if (!sharegroup) { sharegroup = std::make_shared>(); sharegroup->reserve(2); sharegroup->emplace_back(existingContext.context_); existingContext.sharegroup_ = sharegroup; } sharegroup->emplace_back(newContext); auto context = std::make_unique( existingContext.display_, newContext, readSurface, drawSurface, existingContext.getConfig()); context->sharegroup_ = std::move(sharegroup); Result::setOk(outResult); return context; } Context::Context(EGLNativeWindowType window) : Context(kDefaultEGLBackendVersion, EGL_NO_CONTEXT, nullptr, false, window, {0, 0}) {} Context::Context(BackendVersion backendVersion, EGLNativeWindowType window) : Context(backendVersion, EGL_NO_CONTEXT, nullptr, false, window, {0, 0}) {} Context::Context(size_t width, size_t height) : Context(kDefaultEGLBackendVersion, EGL_NO_CONTEXT, nullptr, true, IGL_EGL_NULL_WINDOW, {static_cast(width), static_cast(height)}) {} Context::Context(const Context& sharedContext) : Context(sharedContext.backendVersion_, sharedContext.context_, sharedContext.sharegroup_, true, IGL_EGL_NULL_WINDOW, sharedContext.getDrawSurfaceDimensions(nullptr)) {} Context::Context(BackendVersion backendVersion, EGLContext shareContext, std::shared_ptr> sharegroup, bool offscreen, EGLNativeWindowType window, std::pair dimensions) : backendVersion_(backendVersion) { IGL_DEBUG_ASSERT(backendVersion.flavor == BackendFlavor::OpenGL_ES); IGL_DEBUG_ASSERT( (shareContext == EGL_NO_CONTEXT && sharegroup == nullptr) || (shareContext != EGL_NO_CONTEXT && sharegroup != nullptr && std::find(sharegroup->begin(), sharegroup->end(), shareContext) != sharegroup->end()), "shareContext and sharegroup values must be consistent"); EGLConfig config{nullptr}; auto contextDisplay = newEGLContext(backendVersion.majorVersion, getDefaultEGLDisplay(), shareContext, &config); IGL_DEBUG_ASSERT(contextDisplay.second != EGL_NO_CONTEXT, "newEGLContext failed"); contextOwned_ = true; display_ = contextDisplay.first; context_ = contextDisplay.second; IContext::registerContext((void*)context_, this); if (!window) { if (offscreen) { std::array pbufferAttribs{EGLint{EGL_WIDTH}, EGLint{dimensions.first}, EGLint{EGL_HEIGHT}, EGLint{dimensions.second}, EGLint{EGL_NONE}}; readSurface_ = drawSurface_ = eglCreatePbufferSurface(display_, config, pbufferAttribs.data()); surfacesOwned_ = true; CHECK_EGL_ERRORS(); } else { readSurface_ = eglGetCurrentSurface(EGL_READ); CHECK_EGL_ERRORS(); drawSurface_ = eglGetCurrentSurface(EGL_DRAW); CHECK_EGL_ERRORS(); surfacesOwned_ = false; } } else { surface_ = eglCreateWindowSurface(display_, config, window, nullptr); CHECK_EGL_ERRORS(); readSurface_ = surface_; drawSurface_ = surface_; surfacesOwned_ = true; } config_ = config; if (sharegroup != nullptr) { sharegroup_ = std::move(sharegroup); } else { sharegroup_ = std::make_shared>(); } sharegroup_->emplace_back(context_); initialize(); } std::unique_ptr Context::createShareContext(Result* /*outResult*/) { return std::make_unique(*this); } // NOLINTBEGIN(bugprone-easily-swappable-parameters) Context::Context(EGLDisplay display, EGLContext context, EGLSurface readSurface, EGLSurface drawSurface, EGLConfig config, bool ownsContext, bool ownsSurfaces) : // NOLINTEND(bugprone-easily-swappable-parameters) contextOwned_(ownsContext), surfacesOwned_(ownsSurfaces), display_(display), context_(context), readSurface_(readSurface), drawSurface_(drawSurface), config_(config), backendVersion_(kDefaultEGLBackendVersion) { IContext::registerContext((void*)context_, this); initialize(); sharegroup_ = std::make_shared>(); sharegroup_->emplace_back(context_); } void Context::updateSurface(NativeWindowType window) { surface_ = eglCreateWindowSurface( display_, chooseConfig(backendVersion_.majorVersion, display_), window, nullptr); CHECK_EGL_ERRORS(); readSurface_ = surface_; drawSurface_ = surface_; surfacesOwned_ = true; } Context::~Context() { willDestroy((void*)context_); IContext::unregisterContext((void*)context_); if (surfacesOwned_) { if (surface_ != nullptr) { eglDestroySurface(display_, surface_); CHECK_EGL_ERRORS(); } if (drawSurface_ != nullptr && drawSurface_ != surface_) { eglDestroySurface(display_, drawSurface_); CHECK_EGL_ERRORS(); } if (readSurface_ != nullptr && readSurface_ != surface_ && readSurface_ != drawSurface_) { eglDestroySurface(display_, readSurface_); CHECK_EGL_ERRORS(); } } if (contextOwned_ && context_ != EGL_NO_CONTEXT) { eglDestroyContext(display_, context_); CHECK_EGL_ERRORS(); } } void Context::setCurrent() { eglMakeCurrent(display_, drawSurface_, readSurface_, context_); CHECK_EGL_ERRORS(); flushDeletionQueue(); } void Context::clearCurrentContext() const { eglMakeCurrent(display_, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); CHECK_EGL_ERRORS(); } bool Context::isCurrentContext() const { auto* curContext = eglGetCurrentContext(); return curContext == context_; CHECK_EGL_ERRORS(); } bool Context::isCurrentSharegroup() const { // EGL doesn't seem to provide a way to check if two contexts are in the same group. // For now we can at least check some trivial cases before hitting the assertion below. EGLContext currentContext = eglGetCurrentContext(); CHECK_EGL_ERRORS(); if (currentContext == context_) { return true; } if (currentContext == EGL_NO_CONTEXT) { return false; } if (sharegroup_) { const auto& sharegroup = *sharegroup_; auto it = std::find(sharegroup.begin(), sharegroup.end(), currentContext); return it != sharegroup.end(); } return false; } void Context::present(std::shared_ptr /*surface*/) const { #if defined(FORCE_USE_ANGLE) // Enforce swapbuffers for Angle to be able to use GPU tracing in RenderDoc #if IGL_DEBUG eglSwapBuffers(display_, drawSurface_); CHECK_EGL_ERRORS(); #endif eglMakeCurrent(display_, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); CHECK_EGL_ERRORS(); #else if (drawSurface_ != EGL_NO_SURFACE) { eglSwapBuffers(display_, drawSurface_); // CHECK_EGL_ERRORS(); } #endif } void Context::setPresentationTime(long long presentationTimeNs) { // This is a workaround that we cannot call the eglPresentationTimeANDROID directly from // due to some EGL api bugs. // @fb-only bool (*eglPresentationTimeAndroid)( EGLDisplay dpy, EGLSurface sur, khronos_stime_nanoseconds_t time) = nullptr; eglPresentationTimeAndroid = reinterpret_cast( eglGetProcAddress("eglPresentationTimeANDROID")); CHECK_EGL_ERRORS(); eglPresentationTimeAndroid(display_, surface_, presentationTimeNs); CHECK_EGL_ERRORS(); } // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) void Context::updateSurfaces(EGLSurface readSurface, EGLSurface drawSurface) { readSurface_ = readSurface; drawSurface_ = drawSurface; surfacesOwned_ = false; // We need this here because we need to call eglSetCurrent() with the new surface(s) in order to // bind them, but it's not the ideal place for it. Outside code could come in and make a // different context current at any time. setCurrent(); } EGLSurface Context::createSurface(NativeWindowType window) { auto* surface = eglCreateWindowSurface( display_, chooseConfig(backendVersion_.majorVersion, display_), window, nullptr); CHECK_EGL_ERRORS(); return surface; } EGLContext Context::get() const { return context_; } EGLDisplay Context::getDisplay() const { return display_; } EGLSurface Context::getReadSurface() const { return readSurface_; } EGLSurface Context::getDrawSurface() const { return drawSurface_; } std::pair Context::getDrawSurfaceDimensions(Result* outResult) const { EGLint height = -1; eglQuerySurface(getDisplay(), getDrawSurface(), EGL_HEIGHT, &height); if (CHECK_EGL_ERRORS() != EGL_SUCCESS) { Result::setResult( outResult, Result::Code::InvalidOperation, "Error getting height of EGLSurface."); } EGLint width = -1; eglQuerySurface(getDisplay(), getDrawSurface(), EGL_WIDTH, &width); if (CHECK_EGL_ERRORS() != EGL_SUCCESS) { Result::setResult( outResult, Result::Code::InvalidOperation, "Error getting width of EGLSurface."); } return std::make_pair(width, height); } EGLConfig Context::getConfig() const { return config_; } bool Context::markSharegroup(EGLContext sharedContextHandle) { if (sharedContextHandle == EGL_NO_CONTEXT) { return false; } if (!sharegroup_) { sharegroup_ = std::make_shared>(); sharegroup_->emplace_back(context_); } if (std::find(sharegroup_->begin(), sharegroup_->end(), sharedContextHandle) == sharegroup_->end()) { sharegroup_->emplace_back(sharedContextHandle); } return true; } #if defined(IGL_ANDROID_HWBUFFER_SUPPORTED) EGLImageKHR Context::createImageFromAndroidHardwareBuffer(AHardwareBuffer* hwb) const { EGLClientBuffer clientBuffer = eglGetNativeClientBufferANDROID(hwb); EGLint hwBufferAttribs[] = {EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE, EGL_NONE, EGL_NONE}; EGLDisplay display = this->getDisplay(); // eglCreateImageKHR will add a ref to the AHardwareBuffer EGLImageKHR eglImage = eglCreateImageKHR( display, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, clientBuffer, hwBufferAttribs); IGL_LOG_DEBUG("eglCreateImageKHR(%p, %x, %x, %p, {%d, %d, %d, %d, %d})\n", display, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, clientBuffer, hwBufferAttribs[0], hwBufferAttribs[1], hwBufferAttribs[2], hwBufferAttribs[3], hwBufferAttribs[4]); this->checkForErrors(__FUNCTION__, __LINE__); IGL_SOFT_ASSERT(this->isCurrentContext() || this->isCurrentSharegroup()); return eglImage; } void Context::imageTargetTexture(EGLImageKHR eglImage, GLenum target) const { glEGLImageTargetTexture2DOES(target, static_cast(eglImage)); IGL_LOG_DEBUG("glEGLImageTargetTexture2DOES(%u, %#x)\n", GL_TEXTURE_2D, static_cast(eglImage)); this->checkForErrors(__FUNCTION__, __LINE__); } #endif // defined(IGL_ANDROID_HWBUFFER_SUPPORTED) } // namespace igl::opengl::egl FOLLY_POP_WARNING ================================================ FILE: src/igl/opengl/egl/Context.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #define EGL_EGLEXT_PROTOTYPES #include #include #include #include #include #include #include namespace igl::opengl::egl { class Context final : public IContext { public: /// Creates a shared context, with matching format based on an existing context. static std::unique_ptr createShareContext(Context& existingContext, EGLContext newContext, EGLSurface readSurface, EGLSurface drawSurface, Result* outResult); /// Creates a shared context, matching format based on the current context. std::unique_ptr createShareContext(Result* outResult) override; /// Create a new context for default display. This constructor makes the assumption that the EGL /// surfaces to be associated with this context are already present and set to current. explicit Context(EGLNativeWindowType window); explicit Context(BackendVersion backendVersion, EGLNativeWindowType window); Context& operator=(Context& other) = delete; /// Create a new offscreen context. Context(size_t width, size_t height); /// Create a new context applicable for a specific display/context/read surface/draw surface. /// @param ownsContext If true, this means that constructed Context owns the EGL context that is /// passed in and it will destroy the EGL context in its destructor. If false, it's the caller's /// responsibility to ensure the EGL context is destroyed. /// @param ownsSurfaces If true, this means that constructed Context owns the EGL surfaces that /// are passed in and it will destroy the EGL surfaces in its destructor. If false, it's the /// caller's responsibility to ensure the EGL surfaces are destroyed. Context(EGLDisplay display, EGLContext context, EGLSurface readSurface, EGLSurface drawSurface, EGLConfig config = nullptr, bool ownsContext = false, bool ownsSurfaces = false); /// Create a new offscreen context, in the same sharegroup as 'sharedContext'. Dimensions are /// also inferred from 'sharedContext'. Context(const Context& sharedContext); ~Context() override; void setCurrent() override; void clearCurrentContext() const override; bool isCurrentContext() const override; bool isCurrentSharegroup() const override; void present(std::shared_ptr surface) const override; void setPresentationTime(long long presentationTimeNs); void updateSurfaces(EGLSurface readSurface, EGLSurface drawSurface); void updateSurface(NativeWindowType window); EGLSurface createSurface(NativeWindowType window); EGLContext get() const; EGLDisplay getDisplay() const; EGLSurface getReadSurface() const; EGLSurface getDrawSurface() const; std::pair getDrawSurfaceDimensions(Result* outResult) const; EGLConfig getConfig() const; /// Mark this context as belonging to a sharegroup with another context. void markSharegroup(Context& context); /// Add an external EGL context handle to this context's sharegroup /// so that isCurrentSharegroup() recognizes it. bool markSharegroup(EGLContext sharedContextHandle); #if defined(IGL_ANDROID_HWBUFFER_SUPPORTED) void imageTargetTexture(EGLImageKHR eglImage, GLenum target) const; EGLImageKHR createImageFromAndroidHardwareBuffer(AHardwareBuffer* hwb) const; #endif // defined(IGL_ANDROID_HWBUFFER_SUPPORTED) bool eglSupportssRGB() override { if (eglSupportssRGB_.has_value()) { return eglSupportssRGB_.value(); } const char* extensionName = "EGL_KHR_gl_colorspace"; // Get the list of supported EGL extensions const char* extensions = eglQueryString(getDisplay(), EGL_EXTENSIONS); IGL_LOG_DEBUG("eglQueryString: %s\n", extensions); const std::string strExtensions(extensions); if (strExtensions.find(extensionName) != std::string::npos) { eglSupportssRGB_.emplace(true); return eglSupportssRGB_.value(); } eglSupportssRGB_.emplace(false); return eglSupportssRGB_.value(); } private: std::optional eglSupportssRGB_; private: Context(BackendVersion backendVersion, EGLContext shareContext, std::shared_ptr> sharegroup, bool offscreen, EGLNativeWindowType window, std::pair dimensions); bool contextOwned_ = false; bool surfacesOwned_ = false; FOLLY_PUSH_WARNING FOLLY_GNU_DISABLE_WARNING("-Wzero-as-null-pointer-constant") EGLDisplay display_ = EGL_NO_DISPLAY; EGLContext context_ = EGL_NO_CONTEXT; EGLSurface surface_ = EGL_NO_SURFACE; EGLSurface readSurface_ = EGL_NO_SURFACE; EGLSurface drawSurface_ = EGL_NO_SURFACE; EGLConfig config_ = EGL_NO_CONFIG_KHR; FOLLY_POP_WARNING // Since EGLContext does not expose a Share Group, this must be set manually via the // constructor and should be a list of all the contexts in the group including this context_ std::shared_ptr> sharegroup_; static constexpr BackendVersion kDefaultEGLBackendVersion = { .flavor = BackendFlavor::OpenGL_ES, .majorVersion = 2, }; BackendVersion backendVersion_ = kDefaultEGLBackendVersion; }; } // namespace igl::opengl::egl ================================================ FILE: src/igl/opengl/egl/Device.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include namespace igl::opengl::egl { Device::Device(std::unique_ptr context) : // @fb-only opengl::Device(std::move(context)), platformDevice_(*this) {} const PlatformDevice& Device::getPlatformDevice() const noexcept { return platformDevice_; } void Device::updateSurface(void* nativeWindowType) { std::static_pointer_cast(getSharedContext()) ->updateSurface((NativeWindowType)nativeWindowType); } } // namespace igl::opengl::egl ================================================ FILE: src/igl/opengl/egl/Device.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::opengl::egl { // @fb-only class Device final : public opengl::Device { public: explicit Device(std::unique_ptr context); ~Device() override = default; [[nodiscard]] const PlatformDevice& getPlatformDevice() const noexcept override; void updateSurface(void* nativeWindowType) override; private: PlatformDevice platformDevice_; }; } // namespace igl::opengl::egl ================================================ FILE: src/igl/opengl/egl/HWDevice.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "HWDevice.h" #include #include #include namespace igl::opengl::egl { std::unique_ptr HWDevice::createContext(Result* outResult) const { Result::setOk(outResult); return std::make_unique(IGL_EGL_NULL_WINDOW); } std::unique_ptr HWDevice::createContext(EGLNativeWindowType nativeWindow, Result* outResult) const { return std::make_unique(nativeWindow); } std::unique_ptr HWDevice::createContext(BackendVersion backendVersion, EGLNativeWindowType nativeWindow, Result* outResult) const { return std::make_unique(backendVersion, nativeWindow); } std::unique_ptr HWDevice::createOffscreenContext(size_t width, size_t height, Result* outResult) const { Result::setOk(outResult); return std::make_unique(width, height); } // @fb-only std::unique_ptr HWDevice::createWithContext(std::unique_ptr context, Result* outResult) const { Result::setOk(outResult); if (context == nullptr) { Result::setResult(outResult, Result::Code::ArgumentInvalid, "context is null"); return nullptr; } return std::make_unique(std::move(context)); } // @fb-only std::unique_ptr HWDevice::create(EGLNativeWindowType nativeWindow, Result* outResult) const { auto context = createContext(nativeWindow, outResult); if (context == nullptr) { return nullptr; } return createWithContext(std::move(context), outResult); } } // namespace igl::opengl::egl ================================================ FILE: src/igl/opengl/egl/HWDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::opengl::egl { // @fb-only class HWDevice final : public ::igl::opengl::HWDevice { // @fb-only using Super = ::igl::opengl::HWDevice; public: ///-------------------------------------- /// MARK: - opengl::HWDevice std::unique_ptr createContext(Result* outResult) const override; std::unique_ptr createContext(EGLNativeWindowType nativeWindow, Result* outResult) const; std::unique_ptr createContext(BackendVersion backendVersion, EGLNativeWindowType nativeWindow, Result* outResult) const override; /** * @brief Creates an offscreen context suitable for unit testing. */ std::unique_ptr createOffscreenContext(size_t width, size_t height, Result* outResult) const; // @fb-only std::unique_ptr createWithContext(std::unique_ptr context, Result* outResult) const override; using Super::create; // @fb-only std::unique_ptr create(EGLNativeWindowType nativeWindow, Result* outResult = nullptr) const; }; } // namespace igl::opengl::egl ================================================ FILE: src/igl/opengl/egl/PlatformDevice.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #if defined(IGL_ANDROID_HWBUFFER_SUPPORTED) #include #include #endif // defined(IGL_ANDROID_HWBUFFER_SUPPORTED) #include namespace igl::opengl::egl { // @fb-only PlatformDevice::PlatformDevice(Device& owner) : opengl::PlatformDevice(owner) {} std::shared_ptr PlatformDevice::createTextureFromNativeDrawable( TextureFormat colorTextureFormat, Result* IGL_NULLABLE outResult) { if (drawableTexture_) { return drawableTexture_; } auto* context = static_cast(getSharedContext().get()); if (context == nullptr) { Result::setResult(outResult, Result::Code::InvalidOperation, "No EGL context found!"); return nullptr; } Result subResult; auto dimensions = context->getDrawSurfaceDimensions(&subResult); if (!subResult.isOk()) { Result::setResult(outResult, subResult.code, subResult.message); return nullptr; } const TextureDesc desc = { dimensions.first < 0 ? 0 : static_cast(dimensions.first), dimensions.second < 0 ? 0 : static_cast(dimensions.second), 1, // depth 1, // numLayers 1, // numSamples TextureDesc::TextureUsageBits::Attachment, 1, // numMipLevels TextureType::TwoD, colorTextureFormat, ResourceStorage::Private, }; auto texture = std::make_shared(getContext(), desc.format); subResult = texture->create(desc, true); Result::setResult(outResult, subResult.code, subResult.message); if (!subResult.isOk()) { return nullptr; } drawableTexture_ = std::move(texture); if (auto resourceTracker = owner_.getResourceTracker()) { drawableTexture_->initResourceTracker(std::move(resourceTracker)); } return drawableTexture_; } std::shared_ptr PlatformDevice::createTextureFromNativeDrawable( int width, int height, TextureFormat colorTextureFormat, Result* IGL_NULLABLE outResult) { if (drawableTexture_ && drawableTexture_->getWidth() == width && drawableTexture_->getHeight() == height) { return drawableTexture_; } auto* context = static_cast(getSharedContext().get()); if (context == nullptr) { Result::setResult(outResult, Result::Code::InvalidOperation, "No EGL context found!"); return nullptr; } const TextureDesc desc = { static_cast(width), static_cast(height), 1, // depth 1, // numLayers 1, // numSamples TextureDesc::TextureUsageBits::Attachment, 1, // numMipLevels TextureType::TwoD, colorTextureFormat, ResourceStorage::Private, }; auto texture = std::make_shared(getContext(), desc.format); const Result subResult = texture->create(desc, true); Result::setResult(outResult, subResult.code, subResult.message); if (!subResult.isOk()) { return nullptr; } drawableTexture_ = std::move(texture); if (auto resourceTracker = owner_.getResourceTracker()) { drawableTexture_->initResourceTracker(std::move(resourceTracker)); } return drawableTexture_; } std::shared_ptr PlatformDevice::createTextureFromNativeDepth( TextureFormat depthTextureFormat, Result* IGL_NULLABLE outResult) { auto* context = static_cast(getSharedContext().get()); if (context == nullptr) { Result::setResult(outResult, Result::Code::InvalidOperation, "No EGL context found!"); return nullptr; } Result subResult; auto dimensions = context->getDrawSurfaceDimensions(&subResult); if (!subResult.isOk()) { Result::setResult(outResult, subResult.code, subResult.message); return nullptr; } const TextureDesc desc = { dimensions.first < 0 ? 0 : static_cast(dimensions.first), dimensions.second < 0 ? 0 : static_cast(dimensions.second), 1, // depth 1, // numLayers 1, // numSamples TextureDesc::TextureUsageBits::Attachment, 1, // numMipLevels TextureType::TwoD, depthTextureFormat, ResourceStorage::Private, }; auto texture = std::make_shared(getContext(), desc.format); subResult = texture->create(desc, true); Result::setResult(outResult, subResult.code, subResult.message); if (!subResult.isOk()) { return nullptr; } if (auto resourceTracker = owner_.getResourceTracker()) { texture->initResourceTracker(std::move(resourceTracker)); } return texture; } #if defined(IGL_ANDROID_HWBUFFER_SUPPORTED) /// returns a android::NativeHWTextureBuffer on platforms supporting it /// this texture allows CPU and GPU to both read/write memory std::shared_ptr PlatformDevice::createTextureWithSharedMemory(const TextureDesc& desc, Result* IGL_NULLABLE outResult) const { auto context = static_cast(getSharedContext().get()); if (context == nullptr) { Result::setResult(outResult, Result::Code::InvalidOperation, "No EGL context found!"); IGL_LOG_ERROR("No EGL context found!"); return nullptr; } Result subResult; auto texture = std::make_shared(getContext(), desc.format); subResult = texture->createHWBuffer(desc, false, false); texture->setTextureUsage(desc.usage); Result::setResult(outResult, subResult.code, subResult.message); if (!subResult.isOk()) { IGL_LOG_ERROR("sub result failed"); return nullptr; } if (auto resourceTracker = owner_.getResourceTracker()) { texture->initResourceTracker(std::move(resourceTracker)); } return texture; } std::shared_ptr PlatformDevice::createTextureWithSharedMemory( AHardwareBuffer* IGL_NONNULL buffer, Result* IGL_NULLABLE outResult) const { auto context = static_cast(getSharedContext().get()); if (context == nullptr) { Result::setResult(outResult, Result::Code::InvalidOperation, "No EGL context found!"); return nullptr; } Result subResult; AHardwareBuffer_Desc hwbDesc; AHardwareBuffer_describe(buffer, &hwbDesc); auto texture = std::make_shared( getContext(), igl::android::getIglFormat(hwbDesc.format)); subResult = texture->createWithHWBuffer(buffer); Result::setResult(outResult, subResult.code, subResult.message); if (!subResult.isOk()) { return nullptr; } if (auto resourceTracker = owner_.getResourceTracker()) { texture->initResourceTracker(std::move(resourceTracker)); } return texture; } #endif // defined(IGL_ANDROID_HWBUFFER_SUPPORTED) void PlatformDevice::updateSurfaces(EGLSurface readSurface, EGLSurface drawSurface, Result* IGL_NULLABLE outResult) { auto* context = static_cast(getSharedContext().get()); if (context == nullptr) { Result::setResult(outResult, Result::Code::InvalidOperation, "No EGL context found!"); return; } context->updateSurfaces(readSurface, drawSurface); if (drawableTexture_ != nullptr) { auto dimensions = context->getDrawSurfaceDimensions(outResult); drawableTexture_->setTextureProperties(dimensions.first, dimensions.second); } } EGLSurface PlatformDevice::createSurface(NativeWindowType nativeWindow, Result* IGL_NULLABLE outResult) { auto* context = static_cast(getSharedContext().get()); if (context == nullptr) { Result::setResult(outResult, Result::Code::InvalidOperation, "No EGL context found!"); return nullptr; } return context->createSurface(nativeWindow); } EGLSurface PlatformDevice::getReadSurface(Result* IGL_NULLABLE outResult) { auto* context = static_cast(getSharedContext().get()); if (context == nullptr) { Result::setResult(outResult, Result::Code::InvalidOperation, "No EGL context found!"); return nullptr; } return context->getReadSurface(); } void PlatformDevice::setPresentationTime(long long presentationTimeNs, Result* IGL_NULLABLE outResult) { auto* context = static_cast(getSharedContext().get()); if (context == nullptr) { Result::setResult(outResult, Result::Code::InvalidOperation, "No EGL context found!"); return; } return context->setPresentationTime(presentationTimeNs); } bool PlatformDevice::isType(PlatformDeviceType t) const noexcept { return t == kType || opengl::PlatformDevice::isType(t); } } // namespace igl::opengl::egl ================================================ FILE: src/igl/opengl/egl/PlatformDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #if defined(IGL_ANDROID_HWBUFFER_SUPPORTED) struct AHardwareBuffer; #endif // defined(IGL_ANDROID_HWBUFFER_SUPPORTED) namespace igl::opengl { class ViewTextureTarget; namespace egl { class Device; class Context; // @fb-only class PlatformDevice : public opengl::PlatformDevice { public: static constexpr igl::PlatformDeviceType kType = igl::PlatformDeviceType::OpenGLEgl; explicit PlatformDevice(Device& owner); ~PlatformDevice() override = default; /// Returns a texture representing the EGL Surface associated with this device's context. std::shared_ptr createTextureFromNativeDrawable(TextureFormat colorTextureFormat, Result* IGL_NULLABLE outResult); /// Returns a texture representing the EGL Surface associated with this device's context. std::shared_ptr createTextureFromNativeDrawable(Result* IGL_NULLABLE outResult) { return createTextureFromNativeDrawable(TextureFormat::RGBA_UNorm8, outResult); } std::shared_ptr createTextureFromNativeDrawable(int width, int height, TextureFormat colorTextureFormat, Result* IGL_NULLABLE outResult); std::shared_ptr createTextureFromNativeDrawable(int width, int height, Result* IGL_NULLABLE outResult) { return createTextureFromNativeDrawable(width, height, TextureFormat::RGBA_UNorm8, outResult); } /// Returns a texture representing the EGL depth texture associated with this device's context. std::shared_ptr createTextureFromNativeDepth(TextureFormat depthTextureFormat, Result* IGL_NULLABLE outResult); #if defined(IGL_ANDROID_HWBUFFER_SUPPORTED) /// returns a android::NativeHWTextureBuffer on platforms supporting it /// this texture allows CPU and GPU to both read/write memory std::shared_ptr createTextureWithSharedMemory(const TextureDesc& desc, Result* IGL_NULLABLE outResult) const; std::shared_ptr createTextureWithSharedMemory(AHardwareBuffer* IGL_NONNULL buffer, Result* IGL_NULLABLE outResult) const; #endif // defined(IGL_ANDROID_HWBUFFER_SUPPORTED) /// This function must be called every time the currently bound EGL read and/or draw surfaces /// change, in order to notify IGL of these changes. void updateSurfaces(EGLSurface readSurface, EGLSurface drawSurface, Result* IGL_NULLABLE outResult); EGLSurface IGL_NULLABLE createSurface(NativeWindowType nativeWindow, Result* IGL_NULLABLE outResult); EGLSurface IGL_NULLABLE getReadSurface(Result* IGL_NULLABLE outResult); void setPresentationTime(long long presentationTimeNs, Result* IGL_NULLABLE outResult); protected: [[nodiscard]] bool isType(PlatformDeviceType t) const noexcept override; private: std::shared_ptr drawableTexture_; }; } // namespace egl } // namespace igl::opengl ================================================ FILE: src/igl/opengl/egl/android/NativeHWBuffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only // @fb-only #include #if defined(IGL_ANDROID_HWBUFFER_SUPPORTED) #include #include #if IGL_API_LOG && IGL_LOGGING_ENABLED #define APILOG_DEC_DRAW_COUNT() \ if (apiLogDrawsLeft_) { \ apiLogDrawsLeft_--; \ } #define APILOG(format, ...) \ if (apiLogDrawsLeft_ || apiLogEnabled_) { \ IGL_LOG_DEBUG(format, ##__VA_ARGS__); \ } #else #define APILOG_DEC_DRAW_COUNT() static_cast(0) #define APILOG(format, ...) static_cast(0) #endif // IGL_API_LOGs && IGL_LOGGING_ENABLED namespace igl::opengl::egl::android { struct AHardwareBufferContext { EGLDisplay display; EGLImageKHR elgImage; }; NativeHWTextureBuffer::~NativeHWTextureBuffer() { GLuint textureId = getId(); if (textureId != 0) { if (getContext().isLikelyValidObject()) { getContext().deleteTextures(1, &textureId); } } auto* context = static_cast(hwBufferHelper_.get()); if (context) { eglDestroyImageKHR(context->display, context->elgImage); if (hwBuffer_) { AHardwareBuffer_release(hwBuffer_); } hwBuffer_ = nullptr; } } uint64_t NativeHWTextureBuffer::getTextureId() const { return getId(); } bool NativeHWTextureBuffer::supportsUpload() const { return true; } Result NativeHWTextureBuffer::create(const TextureDesc& desc, bool hasStorageAlready) { return createHWBuffer(desc, hasStorageAlready, false); } Result NativeHWTextureBuffer::createTextureInternal(AHardwareBuffer* buffer) { AHardwareBuffer_Desc hwbDesc; AHardwareBuffer_describe(buffer, &hwbDesc); auto desc = TextureDesc::newNativeHWBufferImage(igl::android::getIglFormat(hwbDesc.format), igl::android::getIglBufferUsage(hwbDesc.usage), hwbDesc.width, hwbDesc.height); auto result = Super::create(desc, false); if (!result.isOk()) { return result; } EGLClientBuffer clientBuffer = eglGetNativeClientBufferANDROID(buffer); EGLint attribs[] = {EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE, EGL_NONE, EGL_NONE}; EGLDisplay display = ((egl::Context*)&getContext())->getDisplay(); // eglCreateImageKHR will add a ref to the AHardwareBuffer EGLImageKHR eglImage = eglCreateImageKHR(display, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, clientBuffer, attribs); APILOG("eglCreateImageKHR(%p, %x, %x, %p, {%d, %d, %d, %d, %d})\n", display, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, clientBuffer, attribs[0], attribs[1], attribs[2], attribs[3], attribs[4]); if (EGL_NO_IMAGE_KHR == eglImage) { return Result{Result::Code::RuntimeError, "Could not create EGL image, err"}; } getContext().checkForErrors(__FUNCTION__, __LINE__); IGL_SOFT_ASSERT(getContext().isCurrentContext() || getContext().isCurrentSharegroup()); GLuint tid = 0; getContext().genTextures(1, &tid); if (!tid) { eglDestroyImageKHR(display, eglImage); return Result{Result::Code::RuntimeError, "NativeHWTextureBuffer failes to generate GL texture ID"}; } setTextureBufferProperties(tid, GL_TEXTURE_2D); getContext().bindTexture(getTarget(), getId()); if (getContext().checkForErrors(__FUNCTION__, __LINE__) != GL_NO_ERROR) { GLuint textureId = getId(); getContext().deleteTextures(1, &textureId); eglDestroyImageKHR(display, eglImage); return Result{Result::Code::RuntimeError, "NativeHWTextureBuffer GL error during bindTexture"}; } glEGLImageTargetTexture2DOES(getTarget(), static_cast(eglImage)); APILOG("glEGLImageTargetTexture2DOES(%u, %#x)\n", GL_TEXTURE_2D, static_cast(eglImage)); getContext().checkForErrors(__FUNCTION__, __LINE__); std::shared_ptr hwBufferCtx = std::make_shared(); hwBufferCtx->display = display; hwBufferCtx->elgImage = eglImage; hwBufferHelper_ = hwBufferCtx; // Implicit upcast textureDesc_ = desc; return Result{}; } void NativeHWTextureBuffer::bind() { getContext().bindTexture(getTarget(), getId()); auto* context = static_cast(hwBufferHelper_.get()); getContext().checkForErrors(__FUNCTION__, __LINE__); glEGLImageTargetTexture2DOES(getTarget(), context->elgImage); APILOG("glEGLImageTargetTexture2DOES(%u, %#x)\n", getTarget(), static_cast(context->elgImage)); getContext().checkForErrors(__FUNCTION__, __LINE__); } void NativeHWTextureBuffer::bindImage(size_t unit) { IGL_DEBUG_ABORT("bindImage not Native Hardware Buffer Textures."); } // upload data into the given mip level // a sub-rect of the texture may be specified to only upload the sub-rect Result NativeHWTextureBuffer::uploadInternal(TextureType /*type*/, const TextureRangeDesc& range, const void* IGL_NULLABLE data, size_t bytesPerRow, const uint32_t* IGL_NULLABLE /*mipLevelBytes*/) const { // not optimal pass std::byte* dst = nullptr; INativeHWTextureBuffer::RangeDesc outRange; Result outResult; auto lockGuard [[maybe_unused]] = lockHWBuffer(reinterpret_cast(&dst), outRange, &outResult); auto internalBpr = getProperties().getBytesPerRow(outRange.stride); bytesPerRow = bytesPerRow ? bytesPerRow : getProperties().getBytesPerRow(range); if (outResult.isOk() && dst != nullptr && bytesPerRow <= internalBpr && range.width == outRange.width && range.height == outRange.height) { const std::byte* src = (const std::byte*)data; uint32_t srcOffset = 0; uint32_t dstOffset = 0; for (int i = 0; i < outRange.height; ++i) { memcpy((void*)(dst + dstOffset), (void*)(src + srcOffset), bytesPerRow); dstOffset += internalBpr; srcOffset += bytesPerRow; } return Result{}; } IGL_DEBUG_ABORT("Cannot upload buffer for HW texture for Native Hardware Buffer Textures."); return Result{Result::Code::Unsupported, "NativeHWTextureBuffer upload not supported"}; } bool NativeHWTextureBuffer::isValidFormat(TextureFormat format) { return igl::android::getNativeHWFormat(format) > 0; } } // namespace igl::opengl::egl::android #endif // defined(IGL_ANDROID_HWBUFFER_SUPPORTED) ================================================ FILE: src/igl/opengl/egl/android/NativeHWBuffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only // @fb-only #pragma once #include #include #if defined(IGL_ANDROID_HWBUFFER_SUPPORTED) namespace igl::opengl::egl::android { typedef void AHardwareBufferHelper; // TextureBuffer encapsulates OpenGL textures class NativeHWTextureBuffer : public igl::android::INativeHWTextureBuffer, public TextureBufferBase { using Super = TextureBufferBase; public: NativeHWTextureBuffer(IContext& context, TextureFormat format) : Super(context, format) {} ~NativeHWTextureBuffer() override; // Texture overrides Result create(const TextureDesc& desc, bool hasStorageAlready) override; void bind() override; void bindImage(size_t unit) override; uint64_t getTextureId() const override; bool supportsUpload() const final; static bool isValidFormat(TextureFormat format); IGL_INLINE void setTextureUsage(TextureDesc::TextureUsage usage) { setUsage(usage); } protected: Result createTextureInternal(AHardwareBuffer* buffer) override; private: Result uploadInternal(TextureType type, const TextureRangeDesc& range, const void* IGL_NULLABLE data, size_t bytesPerRow, const uint32_t* IGL_NULLABLE mipLevelBytes) const final; std::shared_ptr hwBufferHelper_ = nullptr; }; } // namespace igl::opengl::egl::android #endif // defined(IGL_ANDROID_HWBUFFER_SUPPORTED) ================================================ FILE: src/igl/opengl/empty/Context.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace igl::opengl::empty { Context::Context() { Result result; // Initialize through base class. initialize(&result); IGL_DEBUG_ASSERT(result.isOk()); } void Context::setCurrent() { // Intentionally does nothing. } void Context::clearCurrentContext() const { // Intentionally does nothing. } bool Context::isCurrentContext() const { return true; } bool Context::isCurrentSharegroup() const { return false; } void Context::present(std::shared_ptr surface) const { // Intentionally does nothing. } std::unique_ptr Context::createShareContext(Result* outResult) { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); Result::setResult(outResult, Result::Code::Unimplemented, "Implement as needed"); return nullptr; } ///-------------------------------------- /// MARK: - GL APIs Overrides void Context::blendFunc(GLenum sfactor, GLenum dfactor) { // Intentionally does nothing. } void Context::cullFace(GLint mode) { // Intentionally does nothing. } void Context::disable(GLenum cap) { // Intentionally does nothing. } void Context::enable(GLenum cap) { // Intentionally does nothing. } void Context::frontFace(GLenum mode) { // Intentionally does nothing. } GLenum Context::getError() const { return GL_NO_ERROR; } GLenum Context::checkFramebufferStatus(GLenum /*target*/) { return GL_FRAMEBUFFER_COMPLETE; } const GLubyte* Context::getString(GLenum /*name*/) const { static constexpr const char* kVal = "n/a"; return reinterpret_cast(kVal); } void Context::setEnabled(bool shouldEnable, GLenum cap) { // Intentionally does nothing. } } // namespace igl::opengl::empty ================================================ FILE: src/igl/opengl/empty/Context.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::opengl::empty { class Context final : public IContext { public: Context(); void setCurrent() override; void clearCurrentContext() const override; bool isCurrentContext() const override; bool isCurrentSharegroup() const override; void present(std::shared_ptr surface) const override; /// Creates a shared context, matching format based on the current context. std::unique_ptr createShareContext(Result* outResult) override; ///-------------------------------------- /// MARK: - GL APIs Overrides void blendFunc(GLenum sfactor, GLenum dfactor) override; void cullFace(GLint mode) override; void disable(GLenum cap) override; void enable(GLenum cap) override; void frontFace(GLenum mode) override; GLenum getError() const override; GLenum checkFramebufferStatus(GLenum target) override; const GLubyte* getString(GLenum name) const override; void setEnabled(bool shouldEnable, GLenum cap) override; }; } // namespace igl::opengl::empty ================================================ FILE: src/igl/opengl/empty/Device.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace igl::opengl::empty { Device::Device(std::unique_ptr context) : // @fb-only opengl::Device(std::move(context)), platformDevice_(*this) {} const PlatformDevice& Device::getPlatformDevice() const noexcept { return platformDevice_; } } // namespace igl::opengl::empty ================================================ FILE: src/igl/opengl/empty/Device.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::opengl::empty { // @fb-only class Device final : public opengl::Device { public: explicit Device(std::unique_ptr context); [[nodiscard]] const PlatformDevice& getPlatformDevice() const noexcept override; private: PlatformDevice platformDevice_; }; } // namespace igl::opengl::empty ================================================ FILE: src/igl/opengl/empty/HWDevice.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "HWDevice.h" #include #include namespace igl::opengl::empty { std::unique_ptr HWDevice::createContext(Result* outResult) const { Result::setOk(outResult); return std::make_unique(); } std::unique_ptr HWDevice::createContext(BackendVersion /*backendVersion*/, EGLNativeWindowType /*nativeWindow*/, Result* outResult) const { Result::setOk(outResult); return std::make_unique(); } // @fb-only std::unique_ptr HWDevice::createWithContext(std::unique_ptr context, Result* outResult) const { Result::setOk(outResult); if (context == nullptr) { Result::setResult(outResult, Result::Code::ArgumentInvalid, "context is null"); return nullptr; } // @fb-only return std::make_unique(std::move(context)); } } // namespace igl::opengl::empty ================================================ FILE: src/igl/opengl/empty/HWDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::opengl::empty { // @fb-only class HWDevice final : public ::igl::opengl::HWDevice { public: ///-------------------------------------- /// MARK: - opengl::HWDevice std::unique_ptr createContext(Result* outResult) const override; std::unique_ptr createContext(BackendVersion backendVersion, EGLNativeWindowType nativeWindow, Result* outResult) const override; std::unique_ptr createWithContext(std::unique_ptr context, Result* outResult) const override; }; } // namespace igl::opengl::empty ================================================ FILE: src/igl/opengl/glx/Context.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include #include namespace { [[maybe_unused]] int GetLastError() { return 0; // TODO: implement error handling } } // namespace namespace igl::opengl::glx { #define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091 #define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092 #define GLX_PBUFFER_HEIGHT 0x8040 #define GLX_PBUFFER_WIDTH 0x8041 using GLXPbuffer = XID; // NOLINTNEXTLINE(facebook-unused-forward-decls) using GLXFBConfig = struct __GLXFBConfig*; using __GLXextproc = void (*)(); using PFNGLXGETPROCADDRESSPROC = __GLXextproc (*)(const GLubyte* procName); using PFNXOPENDISPLAY = Display* (*)(const char*); using PFNXCLOSEDISPLAY = int (*)(Display*); using PFNXFREE = int (*)(void*); using PFNGLXCHOOSEFBCONFIGPROC = GLXFBConfig* (*)(Display*, int, const int*, int*); using PFNGLXCREATECONTEXTATTRIBSARB = GLXContext (*)(Display*, GLXFBConfig, GLXContext, Bool, const int*); using PFNGLXDESTROYCONTEXT = void (*)(Display*, GLXContext); using PFNGLXCREATEPBUFFERPROC = GLXPbuffer (*)(Display*, GLXFBConfig, const int*); using PFNGLXDESTROYPBUFFER = void (*)(Display*, GLXPbuffer); using PFNGLXMAKECURRENTPROC = Bool (*)(Display*, GLXDrawable, GLXContext); using PFNGLXSWAPBUFFERSPROC = void (*)(Display*, GLXDrawable); using PFNGLXGETCURRENTCONTEXTPROC = GLXContext (*)(); struct GLXSharedModule { GLXSharedModule() { std::vector libs = { "libGLX.so.0", "libGL.so.1", "libGL.so", }; for (const auto& lib : libs) { module_ = dlopen(lib.c_str(), RTLD_LAZY | RTLD_LOCAL); if (module_) { break; } } IGL_DEBUG_ASSERT(module_ != nullptr, "[IGL] Failed to initialize GLX"); XOpenDisplay = loadFunction("XOpenDisplay"); XCloseDisplay = loadFunction("XCloseDisplay"); XFree = loadFunction("XFree"); glXGetProcAddress = loadFunction("glXGetProcAddress"); glXGetProcAddressARB = loadFunction("glXGetProcAddressARB"); glXChooseFBConfig = loadGlxFunction("glXChooseFBConfig"); glXCreateContextAttribsARB = loadGlxFunction("glXCreateContextAttribsARB"); glXDestroyContext = loadGlxFunction("glXDestroyContext"); glXCreatePbuffer = loadGlxFunction("glXCreatePbuffer"); glXDestroyPbuffer = loadGlxFunction("glXDestroyPbuffer"); glXMakeCurrent = loadGlxFunction("glXMakeCurrent"); glXSwapBuffers = loadGlxFunction("glXSwapBuffers"); glXGetCurrentContext = loadGlxFunction("glXGetCurrentContext"); } ~GLXSharedModule() { if (module_) { dlclose(module_); } } GLXSharedModule(const GLXSharedModule&) = delete; GLXSharedModule& operator=(const GLXSharedModule&) = delete; GLXSharedModule(GLXSharedModule&&) = delete; GLXSharedModule& operator=(GLXSharedModule&&) = delete; template T loadFunction(const char* func) { auto f = reinterpret_cast(dlsym(module_, func)); IGL_DEBUG_ASSERT(f != nullptr, "[IGL] Failed to initialize GLX, %s is not found", func); return f; } template T loadGlxFunction(const char* func) { if (auto f = reinterpret_cast(glXGetProcAddress(reinterpret_cast(func)))) { return f; } if (auto f = reinterpret_cast(glXGetProcAddressARB(reinterpret_cast(func)))) { return f; } return loadFunction(func); } void* module_ = nullptr; PFNXOPENDISPLAY XOpenDisplay = nullptr; PFNXCLOSEDISPLAY XCloseDisplay = nullptr; PFNXFREE XFree = nullptr; PFNGLXGETPROCADDRESSPROC glXGetProcAddress = nullptr; PFNGLXGETPROCADDRESSPROC glXGetProcAddressARB = nullptr; PFNGLXCHOOSEFBCONFIGPROC glXChooseFBConfig = nullptr; PFNGLXCREATECONTEXTATTRIBSARB glXCreateContextAttribsARB = nullptr; PFNGLXDESTROYCONTEXT glXDestroyContext = nullptr; PFNGLXCREATEPBUFFERPROC glXCreatePbuffer = nullptr; PFNGLXDESTROYPBUFFER glXDestroyPbuffer = nullptr; PFNGLXMAKECURRENTPROC glXMakeCurrent = nullptr; PFNGLXSWAPBUFFERSPROC glXSwapBuffers = nullptr; PFNGLXGETCURRENTCONTEXTPROC glXGetCurrentContext = nullptr; }; Context::Context(std::shared_ptr module, bool offscreen /* = false */, uint32_t width /* = 0 */, uint32_t height /* = 0 */) : contextOwned_(true), offscreen_(offscreen), module_(std::move(module)) { if (!module_) { module_ = std::make_shared(); } static int visualAttribs[] = {None}; int contextAttribs[] = {GLX_CONTEXT_MAJOR_VERSION_ARB, 4, GLX_CONTEXT_MINOR_VERSION_ARB, 6, None}; if (display_ = module_->XOpenDisplay(nullptr); display_ != nullptr) { int fbcount = 0; if (GLXFBConfig* fbc = module_->glXChooseFBConfig( display_, DefaultScreen(display_), visualAttribs, &fbcount)) { if (contextHandle_ = module_->glXCreateContextAttribsARB(display_, fbc[0], nullptr, True, contextAttribs); contextHandle_ != nullptr) { IContext::registerContext((void*)contextHandle_, this); } else { IGL_DEBUG_ABORT("[IGL] Failed to create GLX context"); } if (offscreen_) { int pbufferAttribs[] = {GLX_PBUFFER_WIDTH, static_cast(width), GLX_PBUFFER_HEIGHT, static_cast(height), None}; windowHandle_ = module_->glXCreatePbuffer(display_, fbc[0], pbufferAttribs); } module_->XFree(fbc); // Set current, since creation doesn't really mean it's current yet. setCurrent(); // Initialize through base class. Result result; initialize(&result); IGL_DEBUG_ASSERT(result.isOk(), result.message.c_str()); } else { IGL_DEBUG_ABORT("[IGL] Failed to get GLX framebuffer configs"); } } else { IGL_DEBUG_ABORT("[IGL] Failed to open display"); } } Context::Context(std::shared_ptr module, Display* display, GLXDrawable windowHandle, GLXContext contextHandle) : module_(std::move(module)), display_(display), windowHandle_(windowHandle), contextHandle_(contextHandle) { if (!module_) { module_ = std::make_shared(); } IContext::registerContext((void*)contextHandle_, this); // Set current, since creation doesn't really mean it's current yet. setCurrent(); // Initialize through base class. Result result; initialize(&result); IGL_DEBUG_ASSERT(result.isOk(), result.message.c_str()); } Context::~Context() { // Clear pool explicitly, since it might have reference back to IContext. getAdapterPool().clear(); // Unregister GLX Context. IContext::unregisterContext(contextHandle_); // Destroy GLX. if (contextOwned_) { if (offscreen_) { module_->glXDestroyPbuffer(display_, windowHandle_); windowHandle_ = 0; } if (contextHandle_) { module_->glXDestroyContext(display_, contextHandle_); contextHandle_ = nullptr; } if (display_) { module_->XCloseDisplay(display_); display_ = nullptr; } } } void Context::setCurrent() { if (!module_->glXMakeCurrent(display_, windowHandle_, contextHandle_)) { IGL_DEBUG_ABORT("[IGL] Failed to activate OpenGL render context. GLX error 0x%08X:\n", GetLastError()); } flushDeletionQueue(); } void Context::clearCurrentContext() const { if (!module_->glXMakeCurrent(display_, None, nullptr)) { IGL_DEBUG_ASSERT( false, "[IGL] Failed to clear OpenGL render context. GLX error 0x%08X:\n", GetLastError()); } } bool Context::isCurrentContext() const { return module_->glXGetCurrentContext() == contextHandle_; } bool Context::isCurrentSharegroup() const { return true; } void Context::present(std::shared_ptr surface) const { module_->glXSwapBuffers(display_, windowHandle_); module_->glXMakeCurrent(display_, windowHandle_, contextHandle_); } std::unique_ptr Context::createShareContext(Result* outResult) { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); Result::setResult(outResult, Result::Code::Unimplemented, "Implement as needed"); return nullptr; } std::shared_ptr Context::getSharedModule() const { return module_; } } // namespace igl::opengl::glx ================================================ FILE: src/igl/opengl/glx/Context.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include namespace igl::opengl::glx { using GLXDrawable = XID; // NOLINTNEXTLINE(facebook-unused-forward-decls) using GLXContext = struct __GLXcontext*; // NOLINT(bugprone-reserved-identifier) struct GLXSharedModule; class Context : public IContext { public: explicit Context(std::shared_ptr module, bool offscreen = false, uint32_t width = 0, uint32_t height = 0); Context(std::shared_ptr module, Display* display, GLXDrawable windowHandle, GLXContext contextHandle); ~Context() override; Context(const Context&) = delete; Context& operator=(const Context&) = delete; Context(Context&&) = delete; Context& operator=(Context&&) = delete; void setCurrent() override; void clearCurrentContext() const override; bool isCurrentContext() const override; bool isCurrentSharegroup() const override; void present(std::shared_ptr surface) const override; /// Creates a shared context, matching format based on the current context. std::unique_ptr createShareContext(Result* outResult) override; std::shared_ptr getSharedModule() const; private: const bool contextOwned_ = false; const bool offscreen_ = false; std::shared_ptr module_; Display* display_ = nullptr; GLXDrawable windowHandle_ = 0; GLXContext contextHandle_ = nullptr; }; } // namespace igl::opengl::glx ================================================ FILE: src/igl/opengl/glx/Device.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include namespace igl::opengl::glx { Device::Device(std::unique_ptr context) : // @fb-only opengl::Device(std::move(context)), platformDevice_(*this) {} const PlatformDevice& Device::getPlatformDevice() const noexcept { return platformDevice_; } Device::~Device() = default; } // namespace igl::opengl::glx ================================================ FILE: src/igl/opengl/glx/Device.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::opengl::glx { // @fb-only class Device final : public igl::opengl::Device { public: explicit Device(std::unique_ptr context); ~Device() override; [[nodiscard]] const PlatformDevice& getPlatformDevice() const noexcept override; protected: PlatformDevice platformDevice_; }; } // namespace igl::opengl::glx ================================================ FILE: src/igl/opengl/glx/HWDevice.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "HWDevice.h" #include #include namespace igl::opengl::glx { std::unique_ptr HWDevice::createContext(Result* outResult) const { Result::setOk(outResult); return std::make_unique(nullptr /* module */); } std::unique_ptr HWDevice::createContext([[maybe_unused]] BackendVersion backendVersion, EGLNativeWindowType /* nativeWindow */, Result* outResult) const { IGL_DEBUG_ASSERT(backendVersion.flavor == BackendFlavor::OpenGL); return createContext(outResult); } std::unique_ptr HWDevice::createOffscreenContext(size_t width, size_t height, Result* outResult) const { Result::setOk(outResult); return std::make_unique(nullptr /* module */, true /* offscreen */, static_cast(width), static_cast(height)); } // @fb-only std::unique_ptr HWDevice::createWithContext(std::unique_ptr context, Result* outResult) const { if (context) { Result::setOk(outResult); return std::make_unique(std::move(context)); } else { Result::setResult(outResult, Result::Code::ArgumentNull); return nullptr; } } } // namespace igl::opengl::glx ================================================ FILE: src/igl/opengl/glx/HWDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::opengl::glx { // @fb-only class HWDevice final : public ::igl::opengl::HWDevice { public: ///-------------------------------------- /// MARK: - opengl::HWDevice std::unique_ptr createContext(Result* outResult) const override; std::unique_ptr createContext(BackendVersion backendVersion, EGLNativeWindowType nativeWindow, Result* outResult) const override; std::unique_ptr createOffscreenContext(size_t width, size_t height, Result* outResult) const; // @fb-only std::unique_ptr createWithContext(std::unique_ptr context, Result* outResult) const override; }; } // namespace igl::opengl::glx ================================================ FILE: src/igl/opengl/glx/PlatformDevice.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only // @fb-only #include #include #include #include namespace igl::opengl::glx { // @fb-only PlatformDevice::PlatformDevice(Device& owner) : opengl::PlatformDevice(owner) {} std::shared_ptr PlatformDevice::createTextureFromNativeDrawable(uint32_t width, uint32_t height, Result* outResult) { auto* context = static_cast(getSharedContext().get()); if (context == nullptr) { Result::setResult(outResult, Result::Code::InvalidOperation, "No GLX context found!"); return nullptr; } if (drawableTexture_ && width_ == width && height_ == height) { Result::setResult(outResult, Result::Code::Ok); return drawableTexture_; } const auto desc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, static_cast(width), static_cast(height), TextureDesc::TextureUsageBits::Attachment, "NativeDrawable"); auto texture = std::make_shared(getContext(), desc.format); Result subResult = texture->create(desc, true); Result::setResult(outResult, subResult.code, subResult.message); if (!subResult.isOk()) { return nullptr; } drawableTexture_ = std::move(texture); width_ = width; height_ = height; if (auto resourceTracker = owner_.getResourceTracker()) { drawableTexture_->initResourceTracker(resourceTracker); } return drawableTexture_; } std::shared_ptr PlatformDevice::createTextureFromNativeDepth(uint32_t width, uint32_t height, Result* outResult) { // generate depth with new width and height auto* context = static_cast(getSharedContext().get()); if (!context) { Result::setResult(outResult, Result::Code::InvalidOperation, "No GLXs context found!"); return nullptr; } if (depthTexture_ && width_ == width && height_ == height) { Result::setResult(outResult, Result::Code::Ok); return depthTexture_; } const auto desc = TextureDesc::new2D(TextureFormat::S8_UInt_Z24_UNorm, static_cast(width), static_cast(height), TextureDesc::TextureUsageBits::Attachment, "NativeDepth"); auto texture = std::make_shared(getContext(), desc.format); IGL_DEBUG_ASSERT(texture); const Result subResult = texture->create(desc, true); Result::setResult(outResult, subResult.code, subResult.message); if (!subResult.isOk()) { return nullptr; } depthTexture_ = std::move(texture); width_ = width; height_ = height; if (auto resourceTracker = owner_.getResourceTracker()) { depthTexture_->initResourceTracker(resourceTracker); } return depthTexture_; } bool PlatformDevice::isType(PlatformDeviceType t) const noexcept { return t == kType || opengl::PlatformDevice::isType(t); } } // namespace igl::opengl::glx ================================================ FILE: src/igl/opengl/glx/PlatformDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::opengl { class ViewTextureTarget; } namespace igl::opengl::glx { class Device; // @fb-only class PlatformDevice : public opengl::PlatformDevice { public: static constexpr PlatformDeviceType kType = PlatformDeviceType::OpenGLx; explicit PlatformDevice(Device& owner); ~PlatformDevice() override = default; /// Returns a texture representing the GLX Surface associated with this device's context. [[nodiscard]] std::shared_ptr createTextureFromNativeDrawable(uint32_t width, uint32_t height, Result* outResult); [[nodiscard]] std::shared_ptr createTextureFromNativeDepth(uint32_t width, uint32_t height, Result* outResult); protected: [[nodiscard]] bool isType(PlatformDeviceType t) const noexcept override; private: uint32_t width_ = 0; uint32_t height_ = 0; std::shared_ptr drawableTexture_; std::shared_ptr depthTexture_; }; } // namespace igl::opengl::glx ================================================ FILE: src/igl/opengl/ios/Context.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include @class EAGLContext; namespace igl::opengl::ios { class Context final : public IContext { public: /// Create a new context with new EAGLContext. explicit Context(BackendVersion backendVersion); Context(BackendVersion backendVersion, Result* IGL_NULLABLE result); /// Create a new context with existing EAGLContext. explicit Context(EAGLContext* IGL_NULLABLE context); Context(EAGLContext* IGL_NULLABLE context, Result* IGL_NULLABLE result); ~Context() override; void setCurrent() override; void clearCurrentContext() const override; bool isCurrentContext() const override; bool isCurrentSharegroup() const override; void present(std::shared_ptr surface) const override; /// Creates a shared context, matching format based on the current context. std::unique_ptr createShareContext(Result* IGL_NULLABLE outResult) override; CVOpenGLESTextureCacheRef IGL_NULLABLE getTextureCache(); private: EAGLContext* IGL_NULLABLE const context_; CVOpenGLESTextureCacheRef IGL_NULLABLE textureCache_ = nullptr; }; } // namespace igl::opengl::ios ================================================ FILE: src/igl/opengl/ios/Context.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #import #include #include #import #include namespace igl::opengl::ios { namespace { EAGLContext* createEAGLContext(BackendVersion backendVersion, EAGLSharegroup* sharegroup) { IGL_DEBUG_ASSERT(backendVersion.flavor == BackendFlavor::OpenGL_ES); IGL_DEBUG_ASSERT(backendVersion.majorVersion == 3 || backendVersion.majorVersion == 2); IGL_DEBUG_ASSERT(backendVersion.minorVersion == 0); if (backendVersion.majorVersion == 3 && backendVersion.minorVersion == 0) { EAGLContext* context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3 sharegroup:sharegroup]; if (context == nullptr) { return [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2 sharegroup:sharegroup]; } return context; } else { IGL_DEBUG_ASSERT(backendVersion.majorVersion == 2, "IGL: unacceptable enum for rendering API for iOS\n"); return [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2 sharegroup:sharegroup]; } } void* getOrGenerateContextUniqueID(EAGLContext* context) { static const void* uniqueIdKey = &uniqueIdKey; static uint64_t idCounter = 0; NSNumber* key = objc_getAssociatedObject(context, &uniqueIdKey); uint64_t contextId = 0; if (key == nullptr) { // Generate and set id if it doesn't exist contextId = idCounter++; objc_setAssociatedObject(context, &uniqueIdKey, @(contextId), OBJC_ASSOCIATION_RETAIN); } else { contextId = key.integerValue; } return (void*)contextId; // NOLINT(performance-no-int-to-ptr) } } // namespace Context::Context(BackendVersion backendVersion) : context_(createEAGLContext(backendVersion, nil)) { if (context_ != nil) { IContext::registerContext(getOrGenerateContextUniqueID(context_), this); } initialize(); } Context::Context(BackendVersion backendVersion, Result* IGL_NULLABLE result) : context_(createEAGLContext(backendVersion, nil)) { if (context_ != nil) { IContext::registerContext(getOrGenerateContextUniqueID(context_), this); } else { Result::setResult(result, Result::Code::ArgumentInvalid); } initialize(result); } Context::Context(EAGLContext* IGL_NULLABLE context) : context_(context) { if (context_ != nil) { IContext::registerContext(getOrGenerateContextUniqueID(context_), this); } initialize(); } Context::Context(EAGLContext* IGL_NULLABLE context, Result* IGL_NULLABLE result) : context_(context) { if (context_ != nil) { IContext::registerContext(getOrGenerateContextUniqueID(context_), this); } else { Result::setResult(result, Result::Code::ArgumentInvalid); } initialize(result); } Context::~Context() { // Release CVOpenGLESTextureCacheRef if (textureCache_ != nullptr) { CVOpenGLESTextureCacheFlush(textureCache_, 0); CFRelease(textureCache_); } willDestroy(context_ == nil ? nullptr : getOrGenerateContextUniqueID(context_)); // Unregister EAGLContext if (context_ != nil) { if (context_ == [EAGLContext currentContext]) { [EAGLContext setCurrentContext:nil]; } } } void Context::present(std::shared_ptr surface) const { auto* texture = static_cast(surface.get()); // Some automated tests assume they can call present on an offscreen texture. // This is not supported on iOS, so we just ignore it. if (IGL_DEBUG_VERIFY(texture) && texture->canPresent()) { texture->bind(); [context_ presentRenderbuffer:GL_RENDERBUFFER]; } } void Context::setCurrent() { [EAGLContext setCurrentContext:context_]; flushDeletionQueue(); } void Context::clearCurrentContext() const { [EAGLContext setCurrentContext:nil]; } bool Context::isCurrentContext() const { return [EAGLContext currentContext] == context_; } bool Context::isCurrentSharegroup() const { return [EAGLContext currentContext].sharegroup == context_.sharegroup; } std::unique_ptr Context::createShareContext(Result* outResult) { EAGLContext* sharedContext = [[EAGLContext alloc] initWithAPI:context_.API sharegroup:context_.sharegroup]; if (!sharedContext) { Result::setResult(outResult, Result::Code::RuntimeError, "Failed to create shared context"); return nullptr; } Result::setOk(outResult); return std::make_unique(sharedContext); } CVOpenGLESTextureCacheRef Context::getTextureCache() { if (textureCache_ == nullptr) { CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, nullptr, context_, nullptr, &textureCache_); } return textureCache_; } } // namespace igl::opengl::ios ================================================ FILE: src/igl/opengl/ios/Device.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::opengl::ios { // @fb-only class Device final : public opengl::Device { public: explicit Device(std::unique_ptr context); ~Device() override = default; [[nodiscard]] const PlatformDevice& getPlatformDevice() const noexcept override; private: PlatformDevice platformDevice_; }; } // namespace igl::opengl::ios ================================================ FILE: src/igl/opengl/ios/Device.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include namespace igl::opengl::ios { Device::Device(std::unique_ptr context) : // @fb-only opengl::Device(std::move(context)), platformDevice_(*this) {} const PlatformDevice& Device::getPlatformDevice() const noexcept { return platformDevice_; } } // namespace igl::opengl::ios ================================================ FILE: src/igl/opengl/ios/HWDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::opengl::ios { // @fb-only class HWDevice final : public ::igl::opengl::HWDevice { public: std::unique_ptr createContext(Result* outResult) const override; std::unique_ptr createContext(BackendVersion backendVersion, EGLNativeWindowType nativeWindow, Result* outResult) const override; std::unique_ptr createWithContext(std::unique_ptr context, Result* outResult) const override; }; // @fb-only } // namespace igl::opengl::ios ================================================ FILE: src/igl/opengl/ios/HWDevice.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "HWDevice.h" #include namespace igl::opengl::ios { ///-------------------------------------- /// MARK: - opengl::HWDevice std::unique_ptr HWDevice::createContext(Result* outResult) const { return std::make_unique( BackendVersion{.flavor = BackendFlavor::OpenGL_ES, .majorVersion = 3, .minorVersion = 0}, outResult); } std::unique_ptr HWDevice::createContext(BackendVersion backendVersion, EGLNativeWindowType /*nativeWindow*/, Result* outResult) const { return std::make_unique(backendVersion, outResult); } // @fb-only std::unique_ptr HWDevice::createWithContext(std::unique_ptr context, Result* outResult) const { Result::setOk(outResult); if (!context) { Result::setResult(outResult, Result::Code::ArgumentInvalid, "context is null"); return nullptr; } return std::make_unique(std::move(context)); } } // namespace igl::opengl::ios ================================================ FILE: src/igl/opengl/ios/PlatformDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #if defined __OBJC__ #import #import #include #else typedef void CAEAGLLayer; #endif #include #include #include #include #include namespace igl::opengl::ios { class Device; // @fb-only class PlatformDevice final : public opengl::PlatformDevice { public: static constexpr igl::PlatformDeviceType kType = igl::PlatformDeviceType::OpenGLIOS; PlatformDevice(Device& owner); ~PlatformDevice() override; std::shared_ptr createTextureFromNativeDrawable(CAEAGLLayer* nativeDrawable, Result* outResult); std::shared_ptr createTextureFromNativeDepth(CAEAGLLayer* nativeDrawable, TextureFormat depthTextureFormat, Result* outResult); Size getNativeDrawableSize(CAEAGLLayer* nativeDrawable, Result* outResult); TextureFormat getNativeDrawableTextureFormat(CAEAGLLayer* nativeDrawable, Result* outResult); /// If the EAGLContext is created outside of IGL, then you would have to create the texture cache /// outside of IGL and pass it into this function. If the EAGLContext is created by IGL, then use /// the function below that would use IGL's internally created texture cache. It's important that /// the texture cache passed in, is generated by the current EAGLContext. Creates a texture from a /// native PixelBuffer. /// @param sourceImage source image /// @param textureCache an OpenGLES texture cache /// @param width width of generated texture /// @param height height of generated texture /// @param planeIndex the plane index to generate the texture /// @param outResult optional result /// @return pointer to generated TextureBuffer or nullptr std::unique_ptr createTextureFromNativePixelBufferWithSize( const CVImageBufferRef& sourceImage, const CVOpenGLESTextureCacheRef& textureCache, size_t width, size_t height, size_t planeIndex = 0, TextureDesc::TextureUsage usage = TextureDesc::TextureUsageBits::Sampled, Result* outResult = nullptr); /// Uses the backing CVPixelBufferRef width and height. std::unique_ptr createTextureFromNativePixelBuffer( const CVImageBufferRef& sourceImage, const CVOpenGLESTextureCacheRef& textureCache, size_t planeIndex = 0, TextureDesc::TextureUsage usage = TextureDesc::TextureUsageBits::Sampled, Result* outResult = nullptr); /// Creates a texture from a native PixelBuffer. /// @param sourceImage source image /// @param planeIndex the plane index to generate the texture /// @param outResult optional result /// @return pointer to generated TextureBuffer or nullptr std::unique_ptr createTextureFromNativePixelBufferWithSize( const CVImageBufferRef& sourceImage, size_t width, size_t height, size_t planeIndex = 0, TextureDesc::TextureUsage usage = TextureDesc::TextureUsageBits::Sampled, Result* outResult = nullptr); /// Uses the backing CVPixelBufferRef width and height. std::unique_ptr createTextureFromNativePixelBuffer( const CVImageBufferRef& sourceImage, size_t planeIndex = 0, TextureDesc::TextureUsage usage = TextureDesc::TextureUsageBits::Sampled, Result* outResult = nullptr); CVOpenGLESTextureCacheRef getTextureCache(); protected: [[nodiscard]] bool isType(PlatformDeviceType t) const noexcept override; }; } // namespace igl::opengl::ios ================================================ FILE: src/igl/opengl/ios/PlatformDevice.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #import #include #import #import #include #include #import #include #include #include #include #include static void* kAssociatedRenderBufferHolderKey = &kAssociatedRenderBufferHolderKey; /// Object used to hold onto a renderBuffer so we can attach it as an associated object @interface _IGLRenderBufferHolder : NSObject { @public std::weak_ptr _renderBuffer; } @end namespace { /// Backed by an associated object. This is used to track the last renderBuffer used to create this /// texture so we can reuse it and invalidate it when necessary /// This always returns a renderBufferHolder, but it is up to the responsibility of the caller to /// set renderBuffer. // @fb-only // @fb-only _IGLRenderBufferHolder* getAssociatedRenderBufferHolder(CAEAGLLayer* nativeDrawable); } // namespace namespace igl::opengl::ios { PlatformDevice::PlatformDevice(Device& owner) : opengl::PlatformDevice(owner) {} PlatformDevice::~PlatformDevice() { getSharedContext()->setCurrent(); } std::shared_ptr PlatformDevice::createTextureFromNativeDrawable( CAEAGLLayer* nativeDrawable, Result* outResult) { if (!nativeDrawable) { Result::setResult(outResult, Result::Code::ArgumentNull, "Invalid native drawable"); return nullptr; } Result::setOk(outResult); const CGFloat scale = nativeDrawable.contentsScale; const CGRect bounds = [nativeDrawable bounds]; const CGRect resolution = CGRectMake( bounds.origin.x, bounds.origin.y, bounds.size.width * scale, bounds.size.height * scale); _IGLRenderBufferHolder* renderBufferHolder = getAssociatedRenderBufferHolder(nativeDrawable); const auto renderBuffer = renderBufferHolder->_renderBuffer.lock(); if (renderBuffer != nullptr && renderBuffer->getSize().width == resolution.size.width && renderBuffer->getSize().height == resolution.size.height) { // The caller is expected to release the reference return renderBuffer; } else { // If a size change causes the texture to be recreated, the caller must ensure the previous // ITexture is freed before calling, or else there may be unexpected behavior. if (renderBuffer != nullptr) { renderBuffer->bind(); [[EAGLContext currentContext] renderbufferStorage:GL_RENDERBUFFER fromDrawable:nullptr]; renderBuffer->unbind(); } NSString* colorFormat = kEAGLColorFormatRGBA8; /* if (!nativeDrawable.drawableProperties) { colorFormat = kEAGLColorFormatRGBA8; eaglLayer.drawableProperties = @{kEAGLDrawablePropertyColorFormat: colorFormat}; } else { colorFormat = [eaglLayer.drawableProperties objectForKey:kEAGLDrawablePropertyColorFormat]; } */ TextureDesc desc; desc.type = TextureType::TwoD; if (colorFormat == kEAGLColorFormatRGBA8) { desc.format = TextureFormat::RGBA_UNorm8; // } else if (colorFormat == kEAGLColorFormatRGB565) { // desc.format = TextureFormatRGB565UNorm; // TODO: we need to bring back RGB565 first // } else if (colorFormat == kEAGLColorFormatSRGBA8) { // desc.format = TextureFormatSRGBA8888UNorm; // TODO: we need to add support for sRGB // formats } else { Result::setResult(outResult, Result::Code::Unsupported, "Unsupported texture format"); return nullptr; } desc.width = (size_t)resolution.size.width; desc.height = (size_t)resolution.size.height; desc.depth = 1; desc.numSamples = 1; desc.usage = TextureDesc::TextureUsageBits::Attachment; auto texture = std::make_shared(getContext(), desc.format, /* canPresent */ true); if (texture != nullptr) { const Result result = texture->create(desc, true); texture->bind(); [[EAGLContext currentContext] renderbufferStorage:GL_RENDERBUFFER fromDrawable:nativeDrawable]; texture->unbind(); if (!result.isOk()) { if (outResult) { *outResult = result; } return nullptr; } } renderBufferHolder->_renderBuffer = texture; if (auto resourceTracker = owner_.getResourceTracker()) { texture->initResourceTracker(resourceTracker); } return texture; } } std::shared_ptr PlatformDevice::createTextureFromNativeDepth( CAEAGLLayer* nativeDrawable, TextureFormat depthTextureFormat, Result* outResult) { if (!nativeDrawable) { Result::setResult(outResult, Result::Code::ArgumentNull, "Invalid native drawable"); return nullptr; } Result::setOk(outResult); const CGFloat scale = nativeDrawable.contentsScale; const CGRect bounds = [nativeDrawable bounds]; const CGRect resolution = CGRectMake( bounds.origin.x, bounds.origin.y, bounds.size.width * scale, bounds.size.height * scale); TextureDesc desc = { .width = static_cast(resolution.size.width), .height = static_cast(resolution.size.height), .depth = 1, .numLayers = 1, .numSamples = 1, .usage = TextureDesc::TextureUsageBits::Attachment, .numMipLevels = 1, .type = TextureType::TwoD, .format = depthTextureFormat, }; desc.storage = ResourceStorage::Private; return owner_.createTexture(desc, outResult); } Size PlatformDevice::getNativeDrawableSize(CAEAGLLayer* nativeDrawable, Result* outResult) { if (nativeDrawable == nullptr) { Result::setResult(outResult, Result::Code::ArgumentNull, "nativeDrawable cannot be null"); return {0, 0}; } Result::setOk(outResult); const auto screenScale = nativeDrawable.contentsScale; const auto bounds = nativeDrawable.bounds; const auto resolution = CGRectMake(bounds.origin.x, bounds.origin.y, bounds.size.width * screenScale, bounds.size.height * screenScale); return {(float)resolution.size.width, (float)resolution.size.height}; } TextureFormat PlatformDevice::getNativeDrawableTextureFormat(CAEAGLLayer* /*nativeDrawable*/, Result* outResult) { Result::setOk(outResult); //[nativeDrawable.drawableProperties objectForKey:kEAGLDrawablePropertyColorFormat]; return TextureFormat::RGBA_UNorm8; // TODO convert value retrieved with above method to IGL! } // NOLINTBEGIN(bugprone-easily-swappable-parameters) std::unique_ptr PlatformDevice::createTextureFromNativePixelBufferWithSize( const CVImageBufferRef& sourceImage, const CVOpenGLESTextureCacheRef& textureCache, size_t width, size_t height, size_t planeIndex, TextureDesc::TextureUsage usage, Result* outResult) { // NOLINTEND(bugprone-easily-swappable-parameters) auto textureBuffer = std::make_unique(getContext(), sourceImage, textureCache, planeIndex, usage); const Result result = textureBuffer->createWithSize(width, height); Result::setResult(outResult, result.code, result.message); if (!result.isOk()) { return nullptr; } if (auto resourceTracker = owner_.getResourceTracker()) { textureBuffer->initResourceTracker(resourceTracker); } return textureBuffer; } std::unique_ptr PlatformDevice::createTextureFromNativePixelBuffer( const CVImageBufferRef& sourceImage, const CVOpenGLESTextureCacheRef& textureCache, size_t planeIndex, TextureDesc::TextureUsage usage, Result* outResult) { auto textureBuffer = std::make_unique(getContext(), sourceImage, textureCache, planeIndex, usage); const Result result = textureBuffer->create(); Result::setResult(outResult, result.code, result.message); if (!result.isOk()) { return nullptr; } if (auto resourceTracker = owner_.getResourceTracker()) { textureBuffer->initResourceTracker(resourceTracker); } return textureBuffer; } // NOLINTBEGIN(bugprone-easily-swappable-parameters) std::unique_ptr PlatformDevice::createTextureFromNativePixelBufferWithSize( const CVImageBufferRef& sourceImage, size_t width, size_t height, size_t planeIndex, TextureDesc::TextureUsage usage, Result* outResult) { // NOLINTEND(bugprone-easily-swappable-parameters) auto textureBuffer = std::make_unique( getContext(), sourceImage, getTextureCache(), planeIndex, usage); const Result result = textureBuffer->createWithSize(width, height); Result::setResult(outResult, result.code, result.message); if (!result.isOk()) { return nullptr; } if (auto resourceTracker = owner_.getResourceTracker()) { textureBuffer->initResourceTracker(resourceTracker); } return textureBuffer; } std::unique_ptr PlatformDevice::createTextureFromNativePixelBuffer( const CVImageBufferRef& sourceImage, size_t planeIndex, TextureDesc::TextureUsage usage, Result* outResult) { auto textureBuffer = std::make_unique( getContext(), sourceImage, getTextureCache(), planeIndex, usage); const Result result = textureBuffer->create(); Result::setResult(outResult, result.code, result.message); if (!result.isOk()) { return nullptr; } if (auto resourceTracker = owner_.getResourceTracker()) { textureBuffer->initResourceTracker(resourceTracker); } return textureBuffer; } bool PlatformDevice::isType(PlatformDeviceType t) const noexcept { return t == kType || opengl::PlatformDevice::isType(t); } CVOpenGLESTextureCacheRef PlatformDevice::getTextureCache() { auto* context = static_cast(getSharedContext().get()); return context->getTextureCache(); } } // namespace igl::opengl::ios namespace { _IGLRenderBufferHolder* getAssociatedRenderBufferHolder(CAEAGLLayer* nativeDrawable) { _IGLRenderBufferHolder* renderBufferHolder = objc_getAssociatedObject(nativeDrawable, kAssociatedRenderBufferHolderKey); if (renderBufferHolder) { return renderBufferHolder; } renderBufferHolder = [_IGLRenderBufferHolder new]; objc_setAssociatedObject(nativeDrawable, kAssociatedRenderBufferHolderKey, renderBufferHolder, OBJC_ASSOCIATION_RETAIN_NONATOMIC); return renderBufferHolder; } } // namespace @implementation _IGLRenderBufferHolder @end ================================================ FILE: src/igl/opengl/ios/TextureBuffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::opengl::ios { // @fb-only class TextureBuffer final : public opengl::TextureBuffer { using Super = opengl::TextureBuffer; // @fb-only public: /// @param pixelBuffer The backing CVPixelBufferRef source /// @param textureCache Texture cache /// @param planeIndex Plane index to generate texture /// @param usage Usage of the CVOpenGLESTextureRef TextureBuffer(IContext& context, CVPixelBufferRef IGL_NONNULL pixelBuffer, CVOpenGLESTextureCacheRef IGL_NONNULL textureCache, size_t planeIndex = 0, TextureDesc::TextureUsage usage = TextureDesc::TextureUsageBits::Sampled); ~TextureBuffer() override; TextureBuffer(const TextureBuffer&) = delete; TextureBuffer& operator=(const TextureBuffer&) = delete; TextureBuffer(TextureBuffer&&) = delete; TextureBuffer& operator=(TextureBuffer&&) = delete; // Disable those creation methods Result create(const TextureDesc& desc, bool hasStorageAlready) override; /// Create a CVOpenGLESTextureRef with the given CVPixelBufferRef. Uses the backing /// CVPixelBufferRef width and height. Result create(); /// Create a CVOpenGLESTextureRef with the given CVPixelBufferRef. /// @param width Width of generated texture /// @param height Height of generated texture Result createWithSize(size_t width, size_t height); bool supportsUpload() const final; private: Result uploadInternal(TextureType type, const TextureRangeDesc& range, const void* IGL_NULLABLE data, size_t bytesPerRow, const uint32_t* IGL_NULLABLE mipLevelBytes) const final; CVOpenGLESTextureRef IGL_NULLABLE cvTexture_ = nullptr; CVPixelBufferRef IGL_NULLABLE pixelBuffer_ = nullptr; CVOpenGLESTextureCacheRef IGL_NULLABLE textureCache_ = nullptr; size_t planeIndex_ = 0; bool uploaded_ = false; bool isCreated_ = false; }; } // namespace igl::opengl::ios ================================================ FILE: src/igl/opengl/ios/TextureBuffer.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #import #import #import #import #import namespace igl::opengl::ios { namespace { /// The conversion from CVPixelFormatType to igl::TextureFormat is inferred from CVPixelBuffer.h // NOLINTBEGIN(bugprone-easily-swappable-parameters) TextureFormat convertToTextureFormat(const DeviceFeatureSet& deviceFeatures, OSType pixelFormat, size_t planeIndex) { // NOLINTEND(bugprone-easily-swappable-parameters) switch (pixelFormat) { case kCVPixelFormatType_32BGRA: return TextureFormat::BGRA_UNorm8; case kCVPixelFormatType_64RGBAHalf: return TextureFormat::RGBA_F16; case kCVPixelFormatType_OneComponent8: return TextureFormat::R_UNorm8; case kCVPixelFormatType_420YpCbCr8BiPlanarFullRange: case kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange: { const bool supportsRG = deviceFeatures.hasFeature(DeviceFeatures::TextureFormatRG); if (planeIndex == 0) { return supportsRG ? TextureFormat::R_UNorm8 : TextureFormat::A_UNorm8; } else if (planeIndex == 1) { return supportsRG ? TextureFormat::RG_UNorm8 : TextureFormat::LA_UNorm8; } else { return TextureFormat::Invalid; } } case kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange: { if (planeIndex == 0) { return TextureFormat::R_UInt16; } else if (planeIndex == 1) { return TextureFormat::RG_UInt16; } else { return TextureFormat::Invalid; } } default: return TextureFormat::Invalid; } } } // namespace TextureBuffer::TextureBuffer(IContext& context, CVPixelBufferRef pixelBuffer, CVOpenGLESTextureCacheRef textureCache, // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) size_t planeIndex, TextureDesc::TextureUsage usage) : Super(context, convertToTextureFormat(context.deviceFeatures(), CVPixelBufferGetPixelFormatType(pixelBuffer), planeIndex)), pixelBuffer_(CVPixelBufferRetain(pixelBuffer)), textureCache_((CVOpenGLESTextureCacheRef)CFRetain(textureCache)), planeIndex_(planeIndex) { setUsage(usage); } TextureBuffer::~TextureBuffer() { if (textureCache_) { CFRelease(textureCache_); } CVPixelBufferRelease(cvTexture_); CVPixelBufferRelease(pixelBuffer_); #if TARGET_OS_SIMULATOR if (getFormat() == TextureFormat::BGRA_UNorm8) { GLuint textureId = getId(); // We only have a manually generated textureID when it's on simulator and BGRA getContext().deleteTextures(1, &textureId); } #endif setTextureBufferProperties(0, 0); setUsage(0); } Result TextureBuffer::create(const TextureDesc& /*desc*/, bool /*hasStorageAlready*/) { return Result(Result::Code::Unsupported, "igl::opengl::ios::TextureBuffer does not support this creation"); } Result TextureBuffer::create() { const auto isPlanar = CVPixelBufferIsPlanar(pixelBuffer_); const size_t width = (isPlanar ? CVPixelBufferGetWidthOfPlane(pixelBuffer_, planeIndex_) : CVPixelBufferGetWidth(pixelBuffer_)); const size_t height = (isPlanar ? CVPixelBufferGetHeightOfPlane(pixelBuffer_, planeIndex_) : CVPixelBufferGetHeight(pixelBuffer_)); return TextureBuffer::createWithSize(width, height); } Result TextureBuffer::createWithSize(size_t width, size_t height) { if (pixelBuffer_ == nullptr || textureCache_ == nullptr) { return Result(Result::Code::ArgumentNull, "PixelBuffer or TextureCache is NULL"); } if (isCreated_) { return Result(Result::Code::InvalidOperation, "TextureBuffer has already been created with a pixelBuffer"); } isCreated_ = true; if (uploaded_) { return Result(); } uploaded_ = true; if (!toFormatDescGL(getFormat(), TextureDesc::TextureUsageBits::Sampled, formatDescGL_)) { return Result(Result::Code::ArgumentInvalid, "Invalid texture format"); } if (getFormat() == TextureFormat::BGRA_UNorm8) { // TODO: Remove this once unit tests verify this is not needed. // Override BGRA internal format since below functions rely on TexImage2D and not TexStorage2D. formatDescGL_.internalFormat = GL_RGBA; } setTextureProperties(width, height); #if TARGET_OS_SIMULATOR if (getFormat() == TextureFormat::BGRA_UNorm8) { // The behavior of CVOpenGLESTextureCacheCreateTextureFromImage() changed // in iOS 13 simulator, and it fails for unknown reasons when BGRA only. // So we have to create and upload the texture ourselves. GLuint textureID = 0; getContext().genTextures(1, &textureID); getContext().bindTexture(GL_TEXTURE_2D, textureID); GLint prevUnpackAlignment = -1; getContext().getIntegerv(GL_UNPACK_ALIGNMENT, &prevUnpackAlignment); const size_t bytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer_); getContext().pixelStorei(GL_UNPACK_ALIGNMENT, this->getAlignment(bytesPerRow)); BOOL requiresLineByLineUpload = NO; const auto bytesPerPixel = getProperties().bytesPerBlock; if (bytesPerRow / bytesPerPixel > width) { // Alignment alone can't make this work, but setting the row length is only available // in ES3. The fallback is to upload the texture line-by-line. if (getContext().deviceFeatures().getGLVersion() >= GLVersion::v3_0_ES) { getContext().pixelStorei(GL_UNPACK_ROW_LENGTH, bytesPerRow / bytesPerPixel); } else { requiresLineByLineUpload = YES; } } CVPixelBufferLockBaseAddress(pixelBuffer_, 0); void* imageData = CVPixelBufferGetBaseAddress(pixelBuffer_); if (requiresLineByLineUpload) { // Before we can update individual lines, the texture must be fully allocated. getContext().texImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, nullptr); for (size_t currentLine = 0; currentLine < height; ++currentLine) { void* offsetData = static_cast(static_cast(imageData) + bytesPerRow * currentLine); getContext().texSubImage2D( GL_TEXTURE_2D, 0, 0, currentLine, width, 1, GL_BGRA, GL_UNSIGNED_BYTE, offsetData); } } else { getContext().texImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, imageData); } CVPixelBufferUnlockBaseAddress(pixelBuffer_, 0); if (getContext().deviceFeatures().getGLVersion() >= GLVersion::v3_0_ES) { getContext().pixelStorei(GL_UNPACK_ROW_LENGTH, 0); } getContext().pixelStorei(GL_UNPACK_ALIGNMENT, prevUnpackAlignment); setTextureBufferProperties(textureID, GL_TEXTURE_2D); return Result(); } #endif const auto error = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, textureCache_, pixelBuffer_, nullptr, GL_TEXTURE_2D, formatDescGL_.internalFormat, width, height, formatDescGL_.format, formatDescGL_.type, planeIndex_, &cvTexture_); if (error != noErr) { return Result(Result::Code::Unsupported, "Failed to create CVOpenGLESTexture: " + std::to_string(error) + " internalFormat: " + std::to_string(formatDescGL_.internalFormat) + " format: " + std::to_string(formatDescGL_.format) + " type: " + std::to_string(formatDescGL_.type)); } setTextureBufferProperties(CVOpenGLESTextureGetName(cvTexture_), CVOpenGLESTextureGetTarget(cvTexture_)); return Result(); } bool TextureBuffer::supportsUpload() const { return false; } Result TextureBuffer::uploadInternal(TextureType /*type*/, const TextureRangeDesc& /*range*/, const void* /*data*/, size_t /*bytesPerRow*/, const uint32_t* IGL_NULLABLE /*mipLevelBytes*/) const { return Result(); } } // namespace igl::opengl::ios ================================================ FILE: src/igl/opengl/macos/Context.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include @class NSOpenGLContext; namespace igl::opengl::macos { class Context final : public IContext { public: /// Creates a shared context, matching format based on the current context. std::unique_ptr createShareContext(Result* outResult) override; /// Create a new context with new NSOpenGLContext. static std::unique_ptr createContext(BackendVersion backendVersion, Result* outResult); /// Create a new context with existing NSOpenGLContext. static std::unique_ptr createContext(NSOpenGLContext* context, Result* outResult); /// Creates a shared context, with matching format based on an existing context. static std::unique_ptr createShareContext(Context& existingContext, Result* outResult); // Create a new context with existing NSOpenGLContext and its shared contexts. The share context // must be setup ahead of calling this constructor, e.g. via QOpenGLContext->setShareContext, and // should not be modified during the lifetime of this IContext static std::unique_ptr createContext( NSOpenGLContext* context, std::shared_ptr> shareContexts, Result* outResult); ~Context() override; Context(const Context&) = delete; Context& operator=(const Context&) = delete; Context(Context&&) = delete; Context& operator=(Context&&) = delete; void setCurrent() override; void clearCurrentContext() const override; bool isCurrentContext() const override; bool isCurrentSharegroup() const override; void present(std::shared_ptr surface) const override; NSOpenGLContext* getNSContext(); CVOpenGLTextureCacheRef createTextureCache(); static NSOpenGLPixelFormat* preferredPixelFormat(); private: Context(NSOpenGLContext* context, std::shared_ptr> shareContexts); NSOpenGLContext* const context_; // Since NSOpenGLContext does not expose a Share Group, this must be set manually via the // constructor and should be a list of all the contexts in the group including this context_ std::shared_ptr> sharegroup_; }; } // namespace igl::opengl::macos ================================================ FILE: src/igl/opengl/macos/Context.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include namespace igl::opengl::macos { namespace { NSOpenGLContext* createOpenGLContext(BackendVersion backendVersion) { IGL_DEBUG_ASSERT(backendVersion.flavor == BackendFlavor::OpenGL); IGL_DEBUG_ASSERT((backendVersion.majorVersion == 3 && backendVersion.minorVersion == 2) || (backendVersion.majorVersion == 4 && backendVersion.minorVersion == 1)); auto format = Context::preferredPixelFormat(); IGL_DEBUG_ASSERT(backendVersion.flavor == BackendFlavor::OpenGL); if (backendVersion.majorVersion == 3 && backendVersion.minorVersion == 2) { static NSOpenGLPixelFormatAttribute attributes[] = { NSOpenGLPFADoubleBuffer, NSOpenGLPFAAllowOfflineRenderers, NSOpenGLPFAMultisample, 1, NSOpenGLPFASampleBuffers, 1, NSOpenGLPFASamples, 4, NSOpenGLPFAColorSize, 32, NSOpenGLPFADepthSize, 24, NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core, 0, }; auto pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes]; IGL_DEBUG_ASSERT(pixelFormat, "Requested attributes not supported"); if (pixelFormat) { format = pixelFormat; } } else if (backendVersion.majorVersion == 4 && backendVersion.minorVersion == 1) { // Copied from preferredPixelFormat, with NSOpenGLProfileVersion4_1Core added static NSOpenGLPixelFormatAttribute attributes[] = { NSOpenGLPFADoubleBuffer, NSOpenGLPFAAllowOfflineRenderers, NSOpenGLPFAMultisample, 1, NSOpenGLPFASampleBuffers, 1, NSOpenGLPFASamples, 4, NSOpenGLPFAColorSize, 32, NSOpenGLPFADepthSize, 24, NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion4_1Core, 0, }; auto pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes]; IGL_DEBUG_ASSERT(pixelFormat, "Requested attributes not supported"); if (pixelFormat) { format = pixelFormat; } } return [[NSOpenGLContext alloc] initWithFormat:format shareContext:nil]; } } // namespace ///-------------------------------------- /// MARK: - Context std::unique_ptr Context::createShareContext(Result* outResult) { return createShareContext(*this, outResult); } std::unique_ptr Context::createContext(BackendVersion backendVersion, Result* outResult) { return createContext(createOpenGLContext(backendVersion), {}, outResult); } std::unique_ptr Context::createContext(NSOpenGLContext* context, Result* outResult) { return createContext(context, {}, outResult); } std::unique_ptr Context::createShareContext(Context& existingContext, Result* outResult) { auto existingNSContext = existingContext.getNSContext(); auto newGLContext = [[NSOpenGLContext alloc] initWithFormat:existingNSContext.pixelFormat shareContext:existingNSContext]; IGL_DEBUG_ASSERT(existingContext.sharegroup_, "Sharegroup must exist"); Result result; auto context = std::unique_ptr(new Context(newGLContext, existingContext.sharegroup_)); context->initialize(&result); // If we are successful, add the new context to our sharegroup. if (result.isOk()) { context->sharegroup_->push_back(newGLContext); } else { context = nullptr; } Result::setResult(outResult, result); return context; } std::unique_ptr Context::createContext( NSOpenGLContext* context, std::shared_ptr> shareContexts, Result* outResult) { if (context == nullptr) { Result::setResult(outResult, Result::Code::ArgumentNull, "NSOpenGLContext was null"); return {}; } Result result; auto newContext = std::unique_ptr(new Context(context, std::move(shareContexts))); newContext->initialize(&result); // If we are successful, add the new context to our sharegroup. if (result.isOk()) { newContext->sharegroup_->push_back(context); } else { newContext = nullptr; } Result::setResult(outResult, result); return newContext; } Context::Context(NSOpenGLContext* context, std::shared_ptr> shareContexts) : context_(context), sharegroup_(std::move(shareContexts)) { if (!sharegroup_) { sharegroup_ = std::make_shared>(); } // Note that we're not adding the context to the sharegroup yet. It'll only be done by the // callers, after the new context is initialized successfully. IContext::registerContext((__bridge void*)context_, this); } Context::~Context() { willDestroy((__bridge void*)context_); } void Context::present(std::shared_ptr /*surface*/) const { [context_ flushBuffer]; } void Context::setCurrent() { [context_ makeCurrentContext]; flushDeletionQueue(); } void Context::clearCurrentContext() const { [NSOpenGLContext clearCurrentContext]; } bool Context::isCurrentContext() const { return [NSOpenGLContext currentContext] == context_; } bool Context::isCurrentSharegroup() const { IGL_DEBUG_ASSERT(sharegroup_ != nullptr, "Sharegroup must exist"); auto it = std::find(sharegroup_->begin(), sharegroup_->end(), [NSOpenGLContext currentContext]); return it != sharegroup_->end(); } NSOpenGLPixelFormat* Context::preferredPixelFormat() { static NSOpenGLPixelFormatAttribute attributes[] = { NSOpenGLPFAWindow, NSOpenGLPFAAccelerated, NSOpenGLPFADoubleBuffer, NSOpenGLPFAColorSize, 24, NSOpenGLPFAAlphaSize, 8, NSOpenGLPFADepthSize, 24, NSOpenGLPFAStencilSize, 8, 0, }; NSOpenGLPixelFormat* format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes]; IGL_DEBUG_ASSERT(format, "Requested attributes not supported"); return format; } NSOpenGLContext* Context::getNSContext() { return context_; } CVOpenGLTextureCacheRef Context::createTextureCache() { CVOpenGLTextureCacheRef textureCache = nullptr; const CVReturn result = CVOpenGLTextureCacheCreate(kCFAllocatorDefault, nullptr, context_.CGLContextObj, context_.pixelFormat.CGLPixelFormatObj, nullptr, &textureCache); if (result != kCVReturnSuccess) { IGL_DEBUG_ABORT("CVOpenGLTextureCacheCreate failed to create texture cache"); } return textureCache; } } // namespace igl::opengl::macos ================================================ FILE: src/igl/opengl/macos/Device.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::opengl::macos { // @fb-only class Device final : public ::igl::opengl::Device { public: explicit Device(std::unique_ptr context); ~Device() override = default; [[nodiscard]] const PlatformDevice& getPlatformDevice() const noexcept override; private: PlatformDevice platformDevice_; }; } // namespace igl::opengl::macos ================================================ FILE: src/igl/opengl/macos/Device.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace igl::opengl::macos { Device::Device(std::unique_ptr context) : // @fb-only opengl::Device(std::move(context)), platformDevice_(*this) {} const PlatformDevice& Device::getPlatformDevice() const noexcept { return platformDevice_; } } // namespace igl::opengl::macos ================================================ FILE: src/igl/opengl/macos/HWDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::opengl::macos { // @fb-only class HWDevice final : public ::igl::opengl::HWDevice { public: ///-------------------------------------- /// MARK: - opengl::HWDevice std::unique_ptr createContext(Result* outResult) const override; std::unique_ptr createContext(BackendVersion backendVersion, EGLNativeWindowType nativeWindow, Result* outResult) const override; // @fb-only std::unique_ptr createWithContext(std::unique_ptr context, Result* outResult) const override; }; } // namespace igl::opengl::macos ================================================ FILE: src/igl/opengl/macos/HWDevice.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace igl::opengl::macos { ///-------------------------------------- /// MARK: - opengl::HWDevice std::unique_ptr HWDevice::createContext(Result* outResult) const { return Context::createContext( {.flavor = BackendFlavor::OpenGL, .majorVersion = 4, .minorVersion = 1}, outResult); } std::unique_ptr HWDevice::createContext(BackendVersion backendVersion, EGLNativeWindowType /*nativeWindow*/, Result* outResult) const { return Context::createContext(backendVersion, outResult); } // @fb-only std::unique_ptr HWDevice::createWithContext(std::unique_ptr context, Result* outResult) const { Result::setOk(outResult); if (!context) { Result::setResult(outResult, Result::Code::ArgumentInvalid, "context is null"); return nullptr; } return std::make_unique(std::move(context)); } } // namespace igl::opengl::macos ================================================ FILE: src/igl/opengl/macos/PlatformDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::opengl { class ViewTextureTarget; namespace macos { class Device; // @fb-only class PlatformDevice : public opengl::PlatformDevice { public: static constexpr igl::PlatformDeviceType kType = igl::PlatformDeviceType::OpenGLMacOS; PlatformDevice(Device& owner); ~PlatformDevice() override = default; /// Creates a texture that represents the default backbuffer for the view associated with the /// currently active OpenGL context. This is useful when using views like NSOpenGLView. /// @param outResult optional result /// @return pointer to generated Texture or nullptr std::shared_ptr createTextureFromNativeDrawable(Result* outResult); /// Creates a texture that represents the default depth buffer for the view associated with the /// currently active OpenGL context. This is useful when using views like NSOpenGLView. /// @param outResult optional result /// @return pointer to generated Texture or nullptr std::shared_ptr createTextureFromNativeDepth(Result* outResult); /// Get a size of a given native drawable surface. /// @param outResult Optional result. /// @return An accurate size that is suitable for rendering or zero if failed to get a size. Size getNativeDrawableSize(Result* outResult); /// Get a texture format that is suitable to render a given drawable surface. /// @param outResult Optional result. /// @return An accurate pixel format that is suitable for rendering or invalid if failed. TextureFormat getNativeDrawableTextureFormat(Result* outResult); /// Set a texture format that is suitable to render a given drawable surface. /// @param format The pixel format that is suitable for rendering /// @param outResult Optional result. void setNativeDrawableTextureFormat(TextureFormat format, Result* outResult); /// Creates a texture from a native PixelBuffer. /// @param sourceImage source image /// @param an OpenGL texture cache /// @param outResult optional result /// @return pointer to generated TextureBuffer or nullptr std::unique_ptr createTextureFromNativePixelBuffer( const CVImageBufferRef& sourceImage, const CVOpenGLTextureCacheRef& textureCache, TextureDesc::TextureUsage usage = TextureDesc::TextureUsageBits::Sampled, Result* outResult = nullptr); protected: [[nodiscard]] bool isType(PlatformDeviceType t) const noexcept override; private: std::shared_ptr drawableTexture_; TextureFormat drawableTextureFormat_ = TextureFormat::RGBA_SRGB; }; } // namespace macos } // namespace igl::opengl ================================================ FILE: src/igl/opengl/macos/PlatformDevice.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only // @fb-only #include #import #import // IWYU pragma: keep #include #include #import #include #include #include #include #include #include #include #include namespace igl::opengl::macos { ///-------------------------------------- /// MARK: - PlatformDevice // @fb-only PlatformDevice::PlatformDevice(Device& owner) : opengl::PlatformDevice(owner) {} std::shared_ptr PlatformDevice::createTextureFromNativeDrawable(Result* outResult) { Size requiredSize; NSView* view = [[NSOpenGLContext currentContext] view]; if (IGL_DEBUG_VERIFY(view)) { const NSRect bounds = view.bounds; const NSSize sizeInPixels = [view convertSizeToBacking:bounds.size]; requiredSize = Size(static_cast(sizeInPixels.width), static_cast(sizeInPixels.height)); } else { Result::setResult(outResult, Result::Code::RuntimeError); return nullptr; } if (!drawableTexture_ || drawableTexture_->getSize() != requiredSize) { const TextureDesc desc = { .width = static_cast(requiredSize.width), .height = static_cast(requiredSize.height), .depth = 1, .numLayers = 1, .numSamples = 1, .usage = TextureDesc::TextureUsageBits::Attachment, .numMipLevels = 1, .type = TextureType::TwoD, .format = drawableTextureFormat_, }; auto texture = std::make_shared(getContext(), desc.format); texture->create(desc, true); drawableTexture_ = texture; if (auto resourceTracker = owner_.getResourceTracker()) { drawableTexture_->initResourceTracker(resourceTracker); } } Result::setOk(outResult); return drawableTexture_; } std::shared_ptr PlatformDevice::createTextureFromNativeDepth(Result* outResult) { NSSize sizeInPixels; NSView* view = [[NSOpenGLContext currentContext] view]; if (IGL_DEBUG_VERIFY(view)) { const NSRect bounds = view.bounds; sizeInPixels = [view convertSizeToBacking:bounds.size]; } else { Result::setResult(outResult, Result::Code::RuntimeError); return nullptr; } GLint depthBits(~0); NSOpenGLPixelFormat* pixelFormat = [[NSOpenGLContext currentContext] pixelFormat]; if (IGL_DEBUG_VERIFY(pixelFormat)) { [pixelFormat getValues:&depthBits forAttribute:NSOpenGLPFADepthSize forVirtualScreen:0]; } else { Result::setResult(outResult, Result::Code::RuntimeError); return nullptr; } if (depthBits == 0) { Result::setOk(outResult); return nullptr; } TextureFormat textureFormat(TextureFormat::Invalid); switch (depthBits) { case 16: textureFormat = TextureFormat::Z_UNorm16; break; case 24: textureFormat = TextureFormat::Z_UNorm24; break; case 32: textureFormat = TextureFormat::Z_UNorm32; break; default: Result::setResult(outResult, Result::Code::RuntimeError); return nullptr; } const TextureDesc desc = { .width = static_cast(sizeInPixels.width), .height = static_cast(sizeInPixels.height), .depth = 1, .numLayers = 1, .numSamples = 1, .usage = TextureDesc::TextureUsageBits::Attachment, .numMipLevels = 1, .type = TextureType::TwoD, .format = textureFormat, }; auto depthTexture = std::make_shared(getContext(), desc.format); depthTexture->create(desc, true); if (auto resourceTracker = owner_.getResourceTracker()) { depthTexture->initResourceTracker(resourceTracker); } Result::setOk(outResult); return depthTexture; } Size PlatformDevice::getNativeDrawableSize(Result* outResult) { Result::setOk(outResult); if (drawableTexture_ == nullptr) { return {0, 0}; } return drawableTexture_->getSize(); } std::unique_ptr PlatformDevice::createTextureFromNativePixelBuffer( const CVImageBufferRef& sourceImage, const CVOpenGLTextureCacheRef& textureCache, TextureDesc::TextureUsage usage, Result* outResult) { auto textureBuffer = std::make_unique(getContext(), sourceImage, textureCache, usage); const auto result = textureBuffer->create(); if (auto resourceTracker = owner_.getResourceTracker()) { textureBuffer->initResourceTracker(resourceTracker); } Result::setResult(outResult, result.code, result.message); return textureBuffer; } TextureFormat PlatformDevice::getNativeDrawableTextureFormat(Result* outResult) { Result::setOk(outResult); return drawableTextureFormat_; } void PlatformDevice::setNativeDrawableTextureFormat(TextureFormat format, Result* outResult) { Result::setOk(outResult); drawableTextureFormat_ = format; } bool PlatformDevice::isType(PlatformDeviceType t) const noexcept { return t == kType || opengl::PlatformDevice::isType(t); } } // namespace igl::opengl::macos ================================================ FILE: src/igl/opengl/macos/TextureBuffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::opengl::macos { // @fb-only class TextureBuffer final : public opengl::TextureBuffer { using Super = opengl::TextureBuffer; // @fb-only public: TextureBuffer(IContext& context, CVPixelBufferRef pixelBuffer, CVOpenGLTextureCacheRef textureCache, TextureDesc::TextureUsage usage = TextureDesc::TextureUsageBits::Sampled); ~TextureBuffer() override; TextureBuffer(const TextureBuffer&) = delete; TextureBuffer& operator=(const TextureBuffer&) = delete; TextureBuffer(TextureBuffer&&) = delete; TextureBuffer& operator=(TextureBuffer&&) = delete; // Disable those creation methods Result create(const TextureDesc& desc, bool hasStorageAlready) override; // This function is created to support wrapping an igl::ITexture container // around a GL texture created from CVOpenGLTextureCacheCreateTextureFromImage() Result create(); bool supportsUpload() const final; private: Result uploadInternal(TextureType type, const TextureRangeDesc& range, const void* data, size_t bytesPerRow, const uint32_t* IGL_NULLABLE mipLevelBytes) const final; CVOpenGLTextureRef cvTexture_ = nullptr; CVPixelBufferRef pixelBuffer_ = nullptr; CVOpenGLTextureCacheRef textureCache_ = nullptr; bool uploaded_ = false; bool created_ = false; }; } // namespace igl::opengl::macos ================================================ FILE: src/igl/opengl/macos/TextureBuffer.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include namespace igl::opengl::macos { namespace { TextureFormat convertToTextureFormat(OSType pixelFormat) { switch (pixelFormat) { case kCVPixelFormatType_32BGRA: return TextureFormat::RGBA_UNorm8; case kCVPixelFormatType_OneComponent8: return TextureFormat::R_UNorm8; case kCVPixelFormatType_420YpCbCr8BiPlanarFullRange: case kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange: { // On the iOS side, there's a plane index which will cause this case to // return different values based the index. On the MacOS side there does // not appear to be an equivalent index, so we are really just assuming // planeIndex == 0 here. return TextureFormat::R_UNorm8; } default: return TextureFormat::Invalid; } } } // namespace TextureBuffer::TextureBuffer(IContext& context, CVPixelBufferRef pixelBuffer, CVOpenGLTextureCacheRef textureCache, TextureDesc::TextureUsage usage) : Super(context, convertToTextureFormat(CVPixelBufferGetPixelFormatType(pixelBuffer))), pixelBuffer_(CVPixelBufferRetain(pixelBuffer)), textureCache_((CVOpenGLTextureCacheRef)CFRetain(textureCache)) { setUsage(usage); } TextureBuffer::~TextureBuffer() { if (textureCache_) { CFRelease(textureCache_); } CVPixelBufferRelease(cvTexture_); CVPixelBufferRelease(pixelBuffer_); setTextureBufferProperties(0, 0); setUsage(0); } Result TextureBuffer::create(const TextureDesc& /*desc*/, bool /*hasStorageAlready*/) { return Result(Result::Code::Unsupported, "igl::opengl::macos::TextureBuffer does not support this creation"); } Result TextureBuffer::create() { if (pixelBuffer_ == nullptr || textureCache_ == nullptr) { return Result(Result::Code::ArgumentNull, "PixelBuffer or TextureCache is NULL"); } if (created_) { return Result(Result::Code::InvalidOperation, "TextureBuffer has already been created with a pixelBuffer"); } created_ = true; if (uploaded_) { return Result(); } uploaded_ = true; if (!toFormatDescGL(getFormat(), TextureDesc::TextureUsageBits::Sampled, formatDescGL_)) { return Result(Result::Code::ArgumentInvalid, "Invalid texture format"); } const auto error = CVOpenGLTextureCacheCreateTextureFromImage( kCFAllocatorDefault, textureCache_, pixelBuffer_, nullptr, &cvTexture_); if (error != noErr) { return Result(Result::Code::Unsupported, "Failed to create CVOpenGLESTexture"); } setTextureProperties(static_cast(CVPixelBufferGetWidth(pixelBuffer_)), static_cast(CVPixelBufferGetHeight(pixelBuffer_))); // Note that CVOpenGLTextureGetTarget(cvTexture_) returns GL_TEXTURE_RECTANGLE // which is not something IGL explicitly supports. setTextureBufferProperties(CVOpenGLTextureGetName(cvTexture_), CVOpenGLTextureGetTarget(cvTexture_)); return Result(); } bool TextureBuffer::supportsUpload() const { return false; } Result TextureBuffer::uploadInternal(TextureType /*type*/, const TextureRangeDesc& /*range*/, const void* /*data*/, size_t /*bytesPerRow*/, const uint32_t* IGL_NULLABLE /*mipLevelBytes*/) const { return Result(); } } // namespace igl::opengl::macos ================================================ FILE: src/igl/opengl/util/TextureFormat.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include namespace igl::opengl::util { // @fb-only // NOLINTBEGIN(readability-identifier-naming) /// OpenGL Constants #define GL_ALPHA 0x1906 #define GL_ALPHA8 0x803C #define GL_BGR 0x80E0 #define GL_BGRA 0x80E1 #define GL_BGRA8_EXT 0x93A1 #define GL_COMPRESSED_R11_EAC 0x9270 #define GL_COMPRESSED_RG11_EAC 0x9272 #define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01 #define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00 #define GL_COMPRESSED_RGB8_ETC2 0x9274 #define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 #define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB #define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 #define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 #define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA #define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC #define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD #define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 #define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 #define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 #define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 #define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 #define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 #define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 #define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 #define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C #define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03 #define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02 #define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 #define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 #define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 #define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 #define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 #define GL_COMPRESSED_SRGB8_ETC2 0x9275 #define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 #define GL_DEPTH_COMPONENT 0x1902 #define GL_DEPTH_COMPONENT16 0x81a5 #define GL_DEPTH_COMPONENT24 0x81A6 #define GL_DEPTH_COMPONENT32 0x81A7 #define GL_DEPTH_STENCIL 0x84F9 #define GL_DEPTH24_STENCIL8 0x88F0 #define GL_DEPTH32F_STENCIL8 0x8CAD #define GL_ETC1_RGB8_OES 0x8D64 #define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD #define GL_HALF_FLOAT_OES 0x8D61 #define GL_LUMINANCE 0x1909 #define GL_LUMINANCE_ALPHA 0x190a #define GL_LUMINANCE8 0x8040 #define GL_LUMINANCE8_ALPHA8 0x8045 #define GL_R16 0x822A #define GL_R16F 0x822D #define GL_R16UI 0x8234 #define GL_R32UI 0x8236 #define GL_R32F 0x822E #define GL_RED 0x1903 #define GL_RG 0x8227 #define GL_RG16 0x822C #define GL_RG16F 0x822F #define GL_RG16UI 0x823a #define GL_RG32F 0x8230 #define GL_RGB 0x1907 #define GL_RGBA16 0x805B #define GL_RGB_RAW_422_APPLE 0x8A51 #define GL_RGB10_A2 0x8059 #define GL_RGB10_A2UI 0x906f #define GL_RGB16F 0x881B #define GL_RGB32F 0x8815 #define GL_RGB5_A1 0x8057 #define GL_RGBA 0x1908 #define GL_RGBA16F 0x881A #define GL_RGBA32F 0x8814 #define GL_RGBA32UI 0x8d70 #define GL_RGBA4 0x8056 #define GL_RGBA8 0x8058 #define GL_SRGB_ALPHA 0x8c42 #define GL_SRGB8_ALPHA8 0x8C43 #define GL_STENCIL_INDEX 0x1901 #define GL_STENCIL_INDEX8 0x8d48 #define GL_UNSIGNED_BYTE 0x1401 #define GL_UNSIGNED_INT 0x1405 #define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 #define GL_UNSIGNED_INT_24_8 0x84fa #define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 #define GL_UNSIGNED_SHORT 0x1403 #define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 #define GL_UNSIGNED_SHORT_5_6_5 0x8363 #define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA #define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB // NOLINTEND(readability-identifier-naming) // NOLINTBEGIN(bugprone-easily-swappable-parameters) TextureFormat glTextureFormatToTextureFormat(int32_t glInternalFormat, uint32_t glFormat, uint32_t glType) { // NOLINTEND(bugprone-easily-swappable-parameters) switch (glInternalFormat) { case GL_COMPRESSED_RGBA_ASTC_4x4_KHR: return TextureFormat::RGBA_ASTC_4x4; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: return TextureFormat::SRGB8_A8_ASTC_4x4; case GL_COMPRESSED_RGBA_ASTC_5x4_KHR: return TextureFormat::RGBA_ASTC_5x4; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: return TextureFormat::SRGB8_A8_ASTC_5x4; case GL_COMPRESSED_RGBA_ASTC_5x5_KHR: return TextureFormat::RGBA_ASTC_5x5; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: return TextureFormat::SRGB8_A8_ASTC_5x5; case GL_COMPRESSED_RGBA_ASTC_6x5_KHR: return TextureFormat::RGBA_ASTC_6x5; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: return TextureFormat::SRGB8_A8_ASTC_6x5; case GL_COMPRESSED_RGBA_ASTC_6x6_KHR: return TextureFormat::RGBA_ASTC_6x6; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: return TextureFormat::SRGB8_A8_ASTC_6x6; case GL_COMPRESSED_RGBA_ASTC_8x5_KHR: return TextureFormat::RGBA_ASTC_8x5; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: return TextureFormat::SRGB8_A8_ASTC_8x5; case GL_COMPRESSED_RGBA_ASTC_8x6_KHR: return TextureFormat::RGBA_ASTC_8x6; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: return TextureFormat::SRGB8_A8_ASTC_8x6; case GL_COMPRESSED_RGBA_ASTC_8x8_KHR: return TextureFormat::RGBA_ASTC_8x8; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: return TextureFormat::SRGB8_A8_ASTC_8x8; case GL_COMPRESSED_RGBA_ASTC_10x5_KHR: return TextureFormat::RGBA_ASTC_10x5; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: return TextureFormat::SRGB8_A8_ASTC_10x5; case GL_COMPRESSED_RGBA_ASTC_10x6_KHR: return TextureFormat::RGBA_ASTC_10x6; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: return TextureFormat::SRGB8_A8_ASTC_10x6; case GL_COMPRESSED_RGBA_ASTC_10x8_KHR: return TextureFormat::RGBA_ASTC_10x8; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: return TextureFormat::SRGB8_A8_ASTC_10x8; case GL_COMPRESSED_RGBA_ASTC_10x10_KHR: return TextureFormat::RGBA_ASTC_10x10; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: return TextureFormat::SRGB8_A8_ASTC_10x10; case GL_COMPRESSED_RGBA_ASTC_12x10_KHR: return TextureFormat::RGBA_ASTC_12x10; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: return TextureFormat::SRGB8_A8_ASTC_12x10; case GL_COMPRESSED_RGBA_ASTC_12x12_KHR: return TextureFormat::RGBA_ASTC_12x12; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: return TextureFormat::SRGB8_A8_ASTC_12x12; case GL_COMPRESSED_RGBA_BPTC_UNORM: return TextureFormat::RGBA_BC7_UNORM_4x4; case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM: return TextureFormat::RGBA_BC7_SRGB_4x4; case GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: return TextureFormat::RGBA_PVRTC_2BPPV1; case GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG: return TextureFormat::RGB_PVRTC_2BPPV1; case GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: return TextureFormat::RGBA_PVRTC_4BPPV1; case GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG: return TextureFormat::RGB_PVRTC_4BPPV1; case GL_ETC1_RGB8_OES: return TextureFormat::RGB8_ETC1; case GL_COMPRESSED_RGB8_ETC2: return TextureFormat::RGB8_ETC2; case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: return TextureFormat::RGB8_Punchthrough_A1_ETC2; case GL_COMPRESSED_RGBA8_ETC2_EAC: return TextureFormat::RGBA8_EAC_ETC2; case GL_COMPRESSED_R11_EAC: return TextureFormat::R_EAC_UNorm; case GL_COMPRESSED_SIGNED_R11_EAC: return TextureFormat::R_EAC_SNorm; case GL_COMPRESSED_RG11_EAC: return TextureFormat::RG_EAC_UNorm; case GL_COMPRESSED_SIGNED_RG11_EAC: return TextureFormat::RG_EAC_SNorm; case GL_COMPRESSED_SRGB8_ETC2: return TextureFormat::SRGB8_ETC2; case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: return TextureFormat::SRGB8_A8_EAC_ETC2; case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: return TextureFormat::SRGB8_Punchthrough_A1_ETC2; case GL_RED: if (glFormat == GL_RED) { if (glType == GL_UNSIGNED_BYTE) { return TextureFormat::R_UNorm8; } } return TextureFormat::Invalid; case GL_RG: if (glFormat == GL_RG) { if (glType == GL_UNSIGNED_BYTE) { return TextureFormat::RG_UNorm8; } } return TextureFormat::Invalid; case GL_RGB: if (glFormat == GL_RGB) { if (glType == GL_UNSIGNED_BYTE) { return TextureFormat::RGBX_UNorm8; } } return TextureFormat::Invalid; case GL_BGR: if (glFormat == GL_BGR) { if (glType == GL_UNSIGNED_SHORT_5_6_5) { return TextureFormat::B5G6R5_UNorm; } } return TextureFormat::Invalid; case GL_RGBA: if (glFormat == GL_RGBA) { if (glType == GL_UNSIGNED_BYTE) { return TextureFormat::RGBA_UNorm8; } else if (glType == GL_UNSIGNED_SHORT_5_5_5_1) { return TextureFormat::R5G5B5A1_UNorm; } else if (glType == GL_HALF_FLOAT_OES) { return TextureFormat::RGBA_F16; } else if (glType == GL_UNSIGNED_INT_8_8_8_8_REV) { return TextureFormat::BGRA_UNorm8_Rev; } else if (glType == GL_UNSIGNED_INT_2_10_10_10_REV) { return TextureFormat::RGB10_A2_UNorm_Rev; } } return TextureFormat::Invalid; case GL_RGBA8: return TextureFormat::RGBA_UNorm8; case GL_SRGB_ALPHA: case GL_SRGB8_ALPHA8: if (glFormat == GL_BGRA) { return TextureFormat::BGRA_SRGB; } else { return TextureFormat::RGBA_SRGB; } case GL_RGB5_A1: return TextureFormat::R5G5B5A1_UNorm; case GL_RGB10_A2UI: return TextureFormat::RGB10_A2_Uint_Rev; case GL_RGB10_A2: if (glFormat == GL_BGRA) { return TextureFormat::BGR10_A2_Unorm; } else { return TextureFormat::RGB10_A2_UNorm_Rev; } case GL_LUMINANCE_ALPHA: case GL_LUMINANCE8_ALPHA8: return TextureFormat::LA_UNorm8; case GL_LUMINANCE8: case GL_LUMINANCE: return TextureFormat::L_UNorm8; case GL_BGRA8_EXT: return TextureFormat::BGRA_UNorm8; case GL_BGRA: if (glFormat == GL_BGRA) { if (glType == GL_UNSIGNED_BYTE) { return TextureFormat::BGRA_UNorm8; } else if (glType == GL_UNSIGNED_SHORT_5_5_5_1) { return TextureFormat::B5G5R5A1_UNorm; } } return TextureFormat::Invalid; case GL_RGBA4: return TextureFormat::ABGR_UNorm4; case GL_ALPHA8: return TextureFormat::A_UNorm8; case GL_ALPHA: if (glFormat == GL_ALPHA) { if (glType == GL_UNSIGNED_BYTE) { // When GL_ALPHA is not supported (eg. desktop gl3) and A_UNorm8 is returned from this // method, an igl texture will get created with GL_Red and swizzled to the alpha instead of // GL_ALPHA return TextureFormat::A_UNorm8; } } return TextureFormat::Invalid; case GL_R16: return TextureFormat::R_UNorm16; case GL_R16F: return TextureFormat::R_F16; case GL_R32F: return TextureFormat::R_F32; case GL_R16UI: return TextureFormat::R_UInt16; case GL_R32UI: return TextureFormat::R_UInt32; case GL_RG16: return TextureFormat::RG_UNorm16; case GL_RGBA16: return TextureFormat::RGBA_UNorm16; case GL_RG16F: return TextureFormat::RG_F16; case GL_RG16UI: return TextureFormat::RG_UInt16; case GL_RG32F: return TextureFormat::RG_F32; case GL_RGB_RAW_422_APPLE: if (glType == GL_UNSIGNED_SHORT_8_8_APPLE) { return TextureFormat::R4G2B2_UNorm_Apple; } else if (glType == GL_UNSIGNED_SHORT_8_8_REV_APPLE) { return TextureFormat::R4G2B2_UNorm_Rev_Apple; } return TextureFormat::Invalid; case GL_RGB16F: return TextureFormat::RGB_F16; case GL_RGBA16F: return TextureFormat::RGBA_F16; case GL_RGB32F: return TextureFormat::RGB_F32; case GL_RGBA32F: return TextureFormat::RGBA_F32; case GL_RGBA32UI: return TextureFormat::RGBA_UInt32; case GL_DEPTH_COMPONENT: if (glFormat == GL_DEPTH_COMPONENT) { if (glType == GL_UNSIGNED_SHORT) { return TextureFormat::Z_UNorm16; } else if (glType == GL_UNSIGNED_INT) { return TextureFormat::Z_UNorm32; } } return TextureFormat::Invalid; case GL_DEPTH_COMPONENT16: return TextureFormat::Z_UNorm16; case GL_DEPTH_COMPONENT24: return TextureFormat::Z_UNorm24; case GL_DEPTH_COMPONENT32: return TextureFormat::Z_UNorm32; case GL_DEPTH_STENCIL: if (glFormat == GL_DEPTH_STENCIL) { if (glType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV) { return TextureFormat::S8_UInt_Z32_UNorm; } else if (glType == GL_UNSIGNED_INT_24_8) { return TextureFormat::S8_UInt_Z24_UNorm; } } return TextureFormat::Invalid; case GL_DEPTH32F_STENCIL8: // TODO: Fix this once we properly support 32F depth formats return TextureFormat::S8_UInt_Z32_UNorm; case GL_DEPTH24_STENCIL8: return TextureFormat::S8_UInt_Z24_UNorm; case GL_STENCIL_INDEX8: return TextureFormat::S_UInt8; case GL_STENCIL_INDEX: if (glFormat == GL_STENCIL_INDEX) { if (glType == GL_UNSIGNED_BYTE) { return TextureFormat::S_UInt8; } } return TextureFormat::Invalid; default: return TextureFormat::Invalid; } IGL_UNREACHABLE_RETURN(TextureFormat::Invalid) } } // namespace igl::opengl::util ================================================ FILE: src/igl/opengl/util/TextureFormat.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::opengl::util { /// Converts an OpenGL texture format to an IGL TextureFormat. /// @param glInternalFormat The OpenGL internal format. Always required. /// @param glFormat The type of the external OpenGL format. Only required to differentiate between /// generic (unsized) internal formats. /// @param glType The data type of the external OpenGL format. Only required to differentiate /// between generic (unsized) internal formats. /// @return The corresponding IGL format if known; otherwise returns TextureFormat::Invalid. TextureFormat glTextureFormatToTextureFormat(int32_t glInternalFormat, uint32_t glFormat = 0, uint32_t glType = 0); } // namespace igl::opengl::util ================================================ FILE: src/igl/opengl/webgl/Context.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include namespace igl::opengl::webgl { Context::Context(const char* canvasName) : Context({.flavor = BackendFlavor::OpenGL_ES, .majorVersion = 3, .minorVersion = 0}, canvasName) {} Context::Context(BackendVersion backendVersion, const char* canvasName) : canvasName_(canvasName) { IGL_DEBUG_ASSERT(backendVersion.flavor == BackendFlavor::OpenGL_ES); IGL_DEBUG_ASSERT(backendVersion.majorVersion == 3 || backendVersion.majorVersion == 2); IGL_DEBUG_ASSERT(backendVersion.minorVersion == 0); EmscriptenWebGLContextAttributes attrs; emscripten_webgl_init_context_attributes(&attrs); attrs.majorVersion = backendversion.majorVersion - 1; attrs.minorVersion = 0; attrs.premultipliedAlpha = false; attrs.alpha = false; attrs.powerPreference = EM_WEBGL_POWER_PREFERENCE_DEFAULT; initialize(attrs, canvasName, -1, -1); } Context::Context(EmscriptenWebGLContextAttributes& attributes, const char* canvasName, int width, int height) : canvasName_(canvasName) { initialize(attributes, canvasName, width, height); } void Context::initialize(EmscriptenWebGLContextAttributes& attributes, const char* canvasName, int width, int height) { context_ = emscripten_webgl_create_context(canvasName, &attributes); if (width > 0 && height > 0) { setCanvasBufferSize(width, height); } if (context_) { IContext::registerContext((void*)context_, this); setCurrent(); igl::Result result; // Initialize through base class. IContext::initialize(&result); IGL_DEBUG_ASSERT(result.isOk()); } } Context::~Context() { willDestroy((void*)context_); emscripten_webgl_destroy_context(context_); } void Context::setCurrent() { emscripten_webgl_make_context_current(context_); } void Context::clearCurrentContext() const { // Intentionally does nothing. No such option on WebGL } bool Context::isCurrentContext() const { return emscripten_webgl_get_current_context() == context_; } bool Context::isCurrentSharegroup() const { return true; } std::unique_ptr Context::createShareContext(Result* outResult) { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); Result::setResult(outResult, Result::Code::Unimplemented, "Implement as needed"); return nullptr; } void Context::setCanvasBufferSize(int width, int height) { auto result = emscripten_set_canvas_element_size(canvasName_.c_str(), width, height); if (result != EMSCRIPTEN_RESULT_SUCCESS) { printf("emscripten_set_canvas_element_size failed: %d\n", result); } } void Context::present(std::shared_ptr surface) const { emscripten_webgl_commit_frame(); } } // namespace igl::opengl::webgl ================================================ FILE: src/igl/opengl/webgl/Context.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #ifndef __EMSCRIPTEN__ #error "Platform not supported" #endif #include #include #include namespace igl { class ITexture; namespace opengl::webgl { class Context final : public ::igl::opengl::IContext { public: explicit Context(const char* canvasName = "#canvas"); explicit Context(BackendVersion backendVersion, const char* canvasName = "#canvas"); Context(EmscriptenWebGLContextAttributes& attributes, const char* canvasName = "#canvas", int width = -1, int height = -1); ~Context() override; void setCurrent() override; void clearCurrentContext() const override; bool isCurrentContext() const override; bool isCurrentSharegroup() const override; void present(std::shared_ptr surface) const override; /// Creates a shared context, matching format based on the current context. std::unique_ptr createShareContext(Result* outResult) override; void setCanvasBufferSize(int width, int height); EMSCRIPTEN_WEBGL_CONTEXT_HANDLE getWebGLContext() const { return context_; } private: void initialize(EmscriptenWebGLContextAttributes& attributes, const char* canvasName, int width = -1, int height = -1); EMSCRIPTEN_WEBGL_CONTEXT_HANDLE context_; std::string canvasName_; }; } // namespace opengl::webgl } // namespace igl ================================================ FILE: src/igl/opengl/webgl/Device.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include namespace igl::opengl::webgl { Device::Device(std::unique_ptr context) : opengl::Device(std::move(context)), platformDevice_(*this) {} const PlatformDevice& Device::getPlatformDevice() const noexcept { return platformDevice_; } Device::~Device() = default; } // namespace igl::opengl::webgl ================================================ FILE: src/igl/opengl/webgl/Device.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #ifndef __EMSCRIPTEN__ #error "Platform not supported" #endif #include #include namespace igl::opengl::webgl { class Device final : public ::igl::opengl::Device { public: explicit Device(std::unique_ptr context); ~Device() override; const PlatformDevice& getPlatformDevice() const noexcept override; private: PlatformDevice platformDevice_; }; } // namespace igl::opengl::webgl ================================================ FILE: src/igl/opengl/webgl/HWDevice.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include namespace igl::opengl::webgl { std::unique_ptr HWDevice::createContext(Result* outResult) const { Result::setOk(outResult); return std::make_unique(); } std::unique_ptr HWDevice::createContext(BackendVersion backendVersion, EGLNativeWindowType /*nativeWindow*/, Result* outResult) const { Result::setOk(outResult); return std::make_unique(backendVersion); } std::unique_ptr HWDevice::createWithContext(std::unique_ptr context, Result* outResult) const { Result::setOk(outResult); return std::make_unique(std::move(context)); } } // namespace igl::opengl::webgl ================================================ FILE: src/igl/opengl/webgl/HWDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #ifndef __EMSCRIPTEN__ #error "Platform not supported" #endif #include namespace igl::opengl::webgl { class HWDevice final : public ::igl::opengl::HWDevice { public: ///-------------------------------------- /// MARK: - opengl::HWDevice std::unique_ptr createContext(Result* outResult) const override; std::unique_ptr createContext(BackendVersion backendVersion, EGLNativeWindowType nativeWindow, Result* outResult) const override; std::unique_ptr createWithContext(std::unique_ptr context, Result* outResult) const override; }; } // namespace igl::opengl::webgl ================================================ FILE: src/igl/opengl/webgl/PlatformDevice.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #include #include #include namespace igl::opengl::webgl { PlatformDevice::PlatformDevice(Device& owner) : opengl::PlatformDevice(owner) {} std::shared_ptr PlatformDevice::createTextureFromNativeDrawable(int width, int height, Result* outResult) { if (drawableTexture_ && drawableTexture_->getWidth() == width && drawableTexture_->getHeight() == height) { return drawableTexture_; } auto context = static_cast(&getContext()); context->setCanvasBufferSize(width, height); TextureDesc desc = {static_cast(width), static_cast(height), 1, // depth 1, // numLayers 1, // numSamples TextureDesc::TextureUsageBits::Attachment, 1, // numMipLevels TextureType::TwoD, TextureFormat::RGBA_UNorm8}; drawableTexture_ = std::make_shared(getContext(), desc.format); Result result = drawableTexture_->create(desc, true); if (outResult) { *outResult = result; } if (auto resourceTracker = owner_.getResourceTracker()) { drawableTexture_->initResourceTracker(resourceTracker); } return drawableTexture_; } bool PlatformDevice::isType(PlatformDeviceType t) const noexcept { return t == kType || opengl::PlatformDevice::isType(t); } } // namespace igl::opengl::webgl ================================================ FILE: src/igl/opengl/webgl/PlatformDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #pragma once #ifndef __EMSCRIPTEN__ #error "Platform not supported" #endif #include #include #include namespace igl::opengl { class ViewTextureTarget; namespace webgl { class Device; class Context; class PlatformDevice : public opengl::PlatformDevice { public: static constexpr igl::PlatformDeviceType kType = igl::PlatformDeviceType::OpenGLWebGL; PlatformDevice(Device& owner); ~PlatformDevice() override = default; /// Returns a texture representing the EGL Surface associated with this device's context. std::shared_ptr createTextureFromNativeDrawable(int width, int height, Result* outResult); protected: bool isType(PlatformDeviceType t) const noexcept override; private: std::shared_ptr drawableTexture_; }; } // namespace webgl } // namespace igl::opengl ================================================ FILE: src/igl/opengl/wgl/Context.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only #include #include #if !defined(WIN32_LEAN_AND_MEAN) #define WIN32_LEAN_AND_MEAN #endif #if !defined(NOMINMAX) #define NOMINMAX #endif // !defined(NOMINMAX) #include #ifdef DISABLE_WGL_VSYNC #include #endif #if defined(IGL_WITH_TRACY_GPU) #include "tracy/TracyOpenGL.hpp" #endif namespace igl::opengl::wgl { Context::Context() : contextOwned_(true) { // This ctor path will own the wgl render context. Therefore creation to the window, DC & render // context must be done and in sequence. Creating a dummy window is necessary to get the device // context. We let wgl choose the appropriate pixel format for us to retrieve the valid render // context after setting up the correct pixel format. Until then, we can properly create the right // render context. WNDCLASSA window_class = {}; window_class.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; window_class.cbClsExtra = window_class.cbWndExtra = 0; window_class.lpfnWndProc = DefWindowProcA; window_class.hInstance = GetModuleHandle(nullptr); window_class.hIcon = nullptr; window_class.hCursor = nullptr; window_class.hbrBackground = nullptr; window_class.lpszClassName = "Dummy_WGL"; if (!RegisterClassA(&window_class)) { auto lastError = GetLastError(); if (lastError != ERROR_CLASS_ALREADY_EXISTS) { IGL_DEBUG_ABORT("[IGL] WGL error 0x%08X:\n", GetLastError()); } } dummyWindow_ = CreateWindowExA(0, window_class.lpszClassName, "Dummy OpenGL Window", 0, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, nullptr, nullptr, window_class.hInstance, nullptr); IGL_DEBUG_ASSERT(dummyWindow_ != nullptr, "[IGL] Failed to create dummy OpenGL window. WGL error 0x%08X:\n", GetLastError()); deviceContext_ = GetDC(dummyWindow_); PIXELFORMATDESCRIPTOR pfd; pfd.nSize = sizeof(pfd); pfd.nVersion = 1; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 32; pfd.cAlphaBits = 8; pfd.cDepthBits = 24; pfd.cStencilBits = 8; pfd.iLayerType = PFD_MAIN_PLANE; int pixel_format = ChoosePixelFormat(deviceContext_, &pfd); IGL_DEBUG_ASSERT(pixel_format != 0, "[IGL] Failed to find a suitable pixel format. WGL error 0x%08X:\n", GetLastError()); if (!SetPixelFormat(deviceContext_, pixel_format, &pfd)) { IGL_DEBUG_ABORT("[IGL] Failed to set the pixel format. WGL error 0x%08X:\n", GetLastError()); } renderContext_ = wglCreateContext(deviceContext_); if (!renderContext_) { IGL_DEBUG_ABORT("[IGL] Failed to create a dummy OpenGL rendering context. WGL error 0x%08X:\n", GetLastError()); } IContext::registerContext((void*)renderContext_, this); // Set current, since creation doesn't really mean it's current yet. setCurrent(); // Init WGL, we need to initialize this first before running any GL calls glewInit(); igl::Result result; // Initialize through base class. initialize(&result); IGL_DEBUG_ASSERT(result.isOk()); } Context::Context(HDC deviceContext, HGLRC renderContext) : contextOwned_(false), deviceContext_(deviceContext), renderContext_(renderContext) { IContext::registerContext((void*)renderContext_, this); // Set current, since creation doesn't really mean it's current yet. setCurrent(); // Init WGL, we need to initialize this first before running any GL calls glewInit(); igl::Result result; // Initialize through base class. initialize(&result); IGL_DEBUG_ASSERT(result.isOk()); } Context::Context(HDC deviceContext, HGLRC renderContext, std::vector shareContexts) : contextOwned_(false), deviceContext_(deviceContext), renderContext_(renderContext), sharegroup_(shareContexts) { IContext::registerContext((void*)renderContext_, this); // Set current, since creation doesn't really mean it's current yet. setCurrent(); // Init WGL, we need to initialize this first before running any GL calls glewInit(); igl::Result result; // Initialize through base class. initialize(&result); IGL_DEBUG_ASSERT(result.isOk()); } Context::~Context() { // Clear pool explicitly, since it might have reference back to IContext. getAdapterPool().clear(); getComputeAdapterPool().clear(); // Unregister wglContext IContext::unregisterContext(renderContext_); if (contextOwned_) { wglMakeCurrent(deviceContext_, nullptr); wglDeleteContext(renderContext_); ReleaseDC(dummyWindow_, deviceContext_); DestroyWindow(dummyWindow_); } } void Context::setCurrent() { if (!wglMakeCurrent(deviceContext_, renderContext_)) { IGL_DEBUG_ABORT("[IGL] Failed to activate OpenGL render context. WGL error 0x%08X:\n", GetLastError()); } flushDeletionQueue(); #ifdef DISABLE_WGL_VSYNC static PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)wglGetProcAddress("wglSwapIntervalEXT"); if (IGL_DEBUG_VERIFY(wglSwapIntervalEXT)) { wglSwapIntervalEXT(0); } #endif } void Context::clearCurrentContext() const { if (!wglMakeCurrent(nullptr, nullptr)) { IGL_DEBUG_ABORT("[IGL] Failed to clear OpenGL render context. WGL error 0x%08X:\n", GetLastError()); } } bool Context::isCurrentContext() const { return wglGetCurrentContext() == renderContext_; } bool Context::isCurrentSharegroup() const { auto it = std::find(sharegroup_.begin(), sharegroup_.end(), wglGetCurrentContext()); return it != sharegroup_.end(); } void Context::present(std::shared_ptr surface) const { SwapBuffers(deviceContext_); wglMakeCurrent(deviceContext_, renderContext_); #if defined(IGL_WITH_TRACY_GPU) TracyGpuCollect; #endif } std::unique_ptr Context::createShareContext(Result* outResult) { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); Result::setResult(outResult, Result::Code::Unimplemented, "Implement as needed"); return nullptr; } } // namespace igl::opengl::wgl ================================================ FILE: src/igl/opengl/wgl/Context.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #include namespace igl { class ITexture; namespace opengl { namespace wgl { class Context : public IContext { public: /// Create a new context for current device context. Context(); /// Create a new context from a given device and render contexts. Context(HDC deviceContext, HGLRC renderContext); /// Create a new context with existing HGLRC and share contexts the share context's /// must be setup ahead of calling this constructor. (eg. via QOpenGLContext->setShareContext) and /// should not be modified during the existence of this IContext Context(HDC deviceContext, HGLRC renderContext, std::vector shareContexts); ~Context() override; void setCurrent() override; void clearCurrentContext() const override; bool isCurrentContext() const override; bool isCurrentSharegroup() const override; void present(std::shared_ptr surface) const override; /// Creates a shared context, matching format based on the current context. std::unique_ptr createShareContext(Result* outResult) override; HDC getDeviceContext() const { return deviceContext_; } HGLRC getRenderContext() const { return renderContext_; } private: const bool contextOwned_ = false; HDC deviceContext_; HGLRC renderContext_; HWND dummyWindow_; std::vector sharegroup_; }; } // namespace wgl } // namespace opengl } // namespace igl ================================================ FILE: src/igl/opengl/wgl/Device.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace igl { namespace opengl { namespace wgl { Device::Device(std::unique_ptr context) : opengl::Device(std::move(context)), platformDevice_(*this) {} const PlatformDevice& Device::getPlatformDevice() const noexcept { return platformDevice_; } Device::~Device() = default; } // namespace wgl } // namespace opengl } // namespace igl ================================================ FILE: src/igl/opengl/wgl/Device.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl { namespace opengl { namespace wgl { class Device final : public igl::opengl::Device { public: explicit Device(std::unique_ptr context); ~Device() override; const PlatformDevice& getPlatformDevice() const noexcept override; protected: PlatformDevice platformDevice_; }; } // namespace wgl } // namespace opengl } // namespace igl ================================================ FILE: src/igl/opengl/wgl/HWDevice.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "HWDevice.h" #include #include namespace igl::opengl::wgl { std::unique_ptr HWDevice::createContext(Result* outResult) const { Result::setOk(outResult); return std::make_unique(); } std::unique_ptr HWDevice::createContext([[maybe_unused]] BackendVersion backendVersion, EGLNativeWindowType /*nativeWindow*/, Result* outResult) const { IGL_DEBUG_ASSERT(backendVersion.flavor == BackendFlavor::OpenGL); return createContext(outResult); } std::unique_ptr HWDevice::createOffscreenContext(size_t width, size_t height, Result* outResult) const { Result::setOk(outResult); return std::make_unique(); } std::unique_ptr HWDevice::createWithContext(std::unique_ptr context, Result* outResult) const { if (context) { Result::setOk(outResult); return std::make_unique(std::move(context)); } else { Result::setResult(outResult, Result::Code::ArgumentNull); return nullptr; } } } // namespace igl::opengl::wgl ================================================ FILE: src/igl/opengl/wgl/HWDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::opengl::wgl { class HWDevice final : public ::igl::opengl::HWDevice { public: ///-------------------------------------- /// MARK: - opengl::HWDevice std::unique_ptr createContext(Result* outResult) const override; std::unique_ptr createContext(BackendVersion backendVersion, EGLNativeWindowType nativeWindow, Result* outResult) const override; std::unique_ptr createOffscreenContext(size_t width, size_t height, Result* outResult) const; std::unique_ptr createWithContext(std::unique_ptr context, Result* outResult) const override; }; } // namespace igl::opengl::wgl ================================================ FILE: src/igl/opengl/wgl/PlatformDevice.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only // @fb-only #include #include #include #include #include namespace igl { namespace opengl { namespace wgl { PlatformDevice::PlatformDevice(Device& owner) : opengl::PlatformDevice(owner) {} std::shared_ptr PlatformDevice::createTextureFromNativeDrawable(Result* outResult) { RECT curDimension; auto context = static_cast(getSharedContext().get()); if (context == nullptr) { Result::setResult(outResult, Result::Code::InvalidOperation, "No WGL context found!"); return nullptr; } GetClientRect(WindowFromDC(context->getDeviceContext()), &curDimension); if (drawableTexture_ && EqualRect(&dimension_, &curDimension)) { return drawableTexture_; } CopyRect(&dimension_, &curDimension); const auto desc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, (size_t)(dimension_.right - dimension_.left), (size_t)(dimension_.bottom - dimension_.top), TextureDesc::TextureUsageBits::Attachment, "NativeDrawable"); auto texture = std::make_shared(getContext(), desc.format); Result subResult = texture->create(desc, true); Result::setResult(outResult, subResult.code, subResult.message); if (!subResult.isOk()) { return nullptr; } drawableTexture_ = std::move(texture); if (auto resourceTracker = owner_.getResourceTracker()) { drawableTexture_->initResourceTracker(resourceTracker); } return drawableTexture_; } std::shared_ptr PlatformDevice::createTextureFromNativeDepth(int width, int height, Result* outResult) { if (drawableTexture_ && drawableTexture_->getWidth() == width && drawableTexture_->getHeight() == height) { Result::setResult(outResult, Result::Code::Ok); return drawableTexture_; } // generate depth with new width and height auto context = static_cast(getSharedContext().get()); if (!context) { Result::setResult(outResult, Result::Code::InvalidOperation, "No EGL context found!"); return nullptr; } const auto desc = TextureDesc::new2D(TextureFormat::S8_UInt_Z24_UNorm, static_cast(width), static_cast(height), TextureDesc::TextureUsageBits::Attachment, "NativeDepth"); auto texture = std::make_shared(getContext(), desc.format); IGL_DEBUG_ASSERT(texture); const Result subResult = texture->create(desc, true); Result::setResult(outResult, subResult.code, subResult.message); if (!subResult.isOk()) { return nullptr; } if (auto resourceTracker = owner_.getResourceTracker()) { texture->initResourceTracker(resourceTracker); } return texture; } bool PlatformDevice::isType(PlatformDeviceType t) const noexcept { return t == Type || opengl::PlatformDevice::isType(t); } } // namespace wgl } // namespace opengl } // namespace igl ================================================ FILE: src/igl/opengl/wgl/PlatformDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #if IGL_PLATFORM_WINDOWS #include #endif namespace igl { namespace opengl { class ViewTextureTarget; namespace wgl { class Device; class Context; class PlatformDevice : public opengl::PlatformDevice { public: static constexpr igl::PlatformDeviceType Type = igl::PlatformDeviceType::OpenGLWgl; PlatformDevice(Device& owner); ~PlatformDevice() override = default; /// Returns a texture representing the WGL Surface associated with this device's context. std::shared_ptr createTextureFromNativeDrawable(Result* outResult); std::shared_ptr createTextureFromNativeDepth(int width, int height, Result* outResult); protected: bool isType(PlatformDeviceType t) const noexcept override; private: std::shared_ptr drawableTexture_; RECT dimension_; }; } // namespace wgl } // namespace opengl } // namespace igl ================================================ FILE: src/igl/tests/Assert.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include // Only include Assert.h and ensure it is configured to enable both soft errors and debug aborts #define IGL_DEBUG_ABORT_ENABLED 1 #define IGL_SOFT_ERROR_ENABLED 1 #define IGL_COMMON_SKIP_CHECK 1 #include namespace igl::tests { namespace { bool sAbort = false; bool sSoftError = false; } // namespace class AssertTest : public ::testing::Test { public: void SetUp() override { igl::setDebugBreakEnabled(false); iglSetDebugAbortListener([](const char* /*category*/, const char* /*reason*/, const char* /*file*/, const char* /*func*/, int /*line*/, const char* /*format*/, va_list /*ap*/) { sAbort = true; }); iglSetSoftErrorHandler([](const char* /*category*/, const char* /*reason*/, const char* /*file*/, const char* /*func*/, int /*line*/, const char* /*format*/, va_list /*ap*/) { sSoftError = true; }); } void TearDown() override { iglSetDebugAbortListener(nullptr); iglSetSoftErrorHandler(nullptr); } }; TEST_F(AssertTest, DebugAbort) { sAbort = false; EXPECT_FALSE(sAbort); IGL_DEBUG_ABORT("Aborting"); EXPECT_TRUE(sAbort); sAbort = false; EXPECT_FALSE(sAbort); IGL_DEBUG_ABORT("Aborting with arg %d", 1); EXPECT_TRUE(sAbort); sAbort = false; EXPECT_FALSE(sAbort); IGL_DEBUG_ASSERT(false); EXPECT_TRUE(sAbort); sAbort = false; EXPECT_FALSE(sAbort); IGL_DEBUG_ASSERT(false, "Aborting"); EXPECT_TRUE(sAbort); sAbort = false; EXPECT_FALSE(sAbort); IGL_DEBUG_ASSERT(false, "Aborting with arg %d", 1); EXPECT_TRUE(sAbort); sAbort = false; EXPECT_FALSE(sAbort); std::ignore = IGL_DEBUG_VERIFY(false); EXPECT_TRUE(sAbort); sAbort = false; EXPECT_FALSE(sAbort); std::ignore = IGL_DEBUG_VERIFY(false, "Aborting"); EXPECT_TRUE(sAbort); sAbort = false; EXPECT_FALSE(sAbort); std::ignore = IGL_DEBUG_VERIFY(false, "Aborting with arg %d", 1); EXPECT_TRUE(sAbort); sAbort = false; EXPECT_FALSE(sAbort); std::ignore = IGL_DEBUG_VERIFY_NOT(true); EXPECT_TRUE(sAbort); sAbort = false; EXPECT_FALSE(sAbort); std::ignore = IGL_DEBUG_VERIFY_NOT(true, "Aborting"); EXPECT_TRUE(sAbort); sAbort = false; EXPECT_FALSE(sAbort); std::ignore = IGL_DEBUG_VERIFY_NOT(true, "Aborting with arg %d", 1); EXPECT_TRUE(sAbort); } TEST_F(AssertTest, SoftError) { sAbort = false; sSoftError = false; EXPECT_FALSE(sAbort); EXPECT_FALSE(sSoftError); IGL_SOFT_ERROR("Aborting"); EXPECT_TRUE(sAbort); EXPECT_TRUE(sSoftError); sAbort = false; sSoftError = false; EXPECT_FALSE(sAbort); EXPECT_FALSE(sSoftError); IGL_SOFT_ERROR("Aborting with arg %d", 1); EXPECT_TRUE(sAbort); EXPECT_TRUE(sSoftError); sAbort = false; sSoftError = false; EXPECT_FALSE(sAbort); EXPECT_FALSE(sSoftError); IGL_SOFT_ASSERT(false); EXPECT_TRUE(sAbort); EXPECT_TRUE(sSoftError); sAbort = false; sSoftError = false; EXPECT_FALSE(sAbort); EXPECT_FALSE(sSoftError); IGL_SOFT_ASSERT(false, "Aborting"); EXPECT_TRUE(sAbort); EXPECT_TRUE(sSoftError); sAbort = false; sSoftError = false; EXPECT_FALSE(sAbort); EXPECT_FALSE(sSoftError); IGL_SOFT_ASSERT(false, "Aborting with arg %d", 1); EXPECT_TRUE(sAbort); EXPECT_TRUE(sSoftError); sAbort = false; sSoftError = false; EXPECT_FALSE(sAbort); EXPECT_FALSE(sSoftError); std::ignore = IGL_SOFT_VERIFY(false); EXPECT_TRUE(sAbort); EXPECT_TRUE(sSoftError); sAbort = false; sSoftError = false; EXPECT_FALSE(sAbort); EXPECT_FALSE(sSoftError); std::ignore = IGL_SOFT_VERIFY(false, "Aborting"); EXPECT_TRUE(sAbort); EXPECT_TRUE(sSoftError); sAbort = false; sSoftError = false; EXPECT_FALSE(sAbort); EXPECT_FALSE(sSoftError); std::ignore = IGL_SOFT_VERIFY(false, "Aborting with arg %d", 1); EXPECT_TRUE(sAbort); EXPECT_TRUE(sSoftError); sAbort = false; sSoftError = false; EXPECT_FALSE(sAbort); EXPECT_FALSE(sSoftError); std::ignore = IGL_SOFT_VERIFY_NOT(true); EXPECT_TRUE(sAbort); EXPECT_TRUE(sSoftError); sAbort = false; sSoftError = false; EXPECT_FALSE(sAbort); EXPECT_FALSE(sSoftError); std::ignore = IGL_SOFT_VERIFY_NOT(true, "Aborting"); EXPECT_TRUE(sAbort); EXPECT_TRUE(sSoftError); sAbort = false; sSoftError = false; EXPECT_FALSE(sAbort); EXPECT_FALSE(sSoftError); std::ignore = IGL_SOFT_VERIFY_NOT(true, "Aborting with arg %d", 1); EXPECT_TRUE(sAbort); EXPECT_TRUE(sSoftError); } } // namespace igl::tests ================================================ FILE: src/igl/tests/Backend.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "data/ShaderData.h" #include "data/TextureData.h" #include "data/VertexIndexData.h" #include "util/Common.h" #include #include #include #include #include #include #include #include namespace igl::tests { // Picking this just to match the texture we will use. If you use a different // size texture, then you will have to either create a new offscreenTexture_ // and the framebuffer object in your test, so know exactly what the end result // would be after sampling constexpr size_t kOffscreenTexWidth = 2; constexpr size_t kOffscreenTexHeight = 2; // // BackendTest // // Test fixture for all the tests in this file. Takes care of common // initialization and allocating of common resources. // class BackendTest : public ::testing::Test { private: public: BackendTest() = default; ~BackendTest() override = default; // // SetUp() // // This function sets up a render pass and a graphics pipeline descriptor // so it is ready to render a simple quad with an input texture to an // offscreen texture. // // The actual creation of the graphics pipeline state object is left // to each test so that tests can replace the default settings with // something more appropriate. // void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_TRUE(iglDev_ != nullptr); ASSERT_TRUE(cmdQueue_ != nullptr); // Create an offscreen texture to render to const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kOffscreenTexWidth, kOffscreenTexHeight, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); Result ret; offscreenTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(offscreenTexture_ != nullptr); // Create framebuffer using the offscreen texture FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = offscreenTexture_; framebuffer_ = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(framebuffer_ != nullptr); // Initialize render pass descriptor renderPass_.colorAttachments.resize(1); renderPass_.colorAttachments[0].loadAction = LoadAction::Clear; renderPass_.colorAttachments[0].storeAction = StoreAction::Store; renderPass_.colorAttachments[0].clearColor = {0.0, 0.0, 0.0, 1.0}; // Initialize shader stages std::unique_ptr stages; igl::tests::util::createSimpleShaderStages(iglDev_, stages); shaderStages_ = std::move(stages); // Initialize input to vertex shader VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Float4; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].bufferIndex = data::shader::kSimplePosIndex; inputDesc.attributes[0].name = data::shader::kSimplePos; inputDesc.attributes[0].location = 0; inputDesc.inputBindings[0].stride = sizeof(float) * 4; inputDesc.attributes[1].format = VertexAttributeFormat::Float2; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].bufferIndex = data::shader::kSimpleUvIndex; inputDesc.attributes[1].name = data::shader::kSimpleUv; inputDesc.attributes[1].location = 1; inputDesc.inputBindings[1].stride = sizeof(float) * 2; // numAttributes has to equal to bindings when using more than 1 buffer inputDesc.numAttributes = inputDesc.numInputBindings = 2; vertexInputState_ = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vertexInputState_ != nullptr); // Initialize index buffer BufferDesc bufDesc; bufDesc.type = BufferDesc::BufferTypeBits::Index; bufDesc.data = data::vertex_index::kQuadInd.data(); bufDesc.length = sizeof(data::vertex_index::kQuadInd); ib_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(ib_ != nullptr); // Initialize vertex and sampler buffers bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data::vertex_index::kQuadVert.data(); bufDesc.length = sizeof(data::vertex_index::kQuadVert); vb_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vb_ != nullptr); bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data::vertex_index::kQuadUv.data(); bufDesc.length = sizeof(data::vertex_index::kQuadUv); uv_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(uv_ != nullptr); // Initialize sampler state const SamplerStateDesc samplerDesc; samp_ = iglDev_->createSamplerState(samplerDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(samp_ != nullptr); // Initialize Graphics Pipeline Descriptor, but leave the creation // to the individual tests in case further customization is required renderPipelineDesc_.vertexInputState = vertexInputState_; renderPipelineDesc_.shaderStages = shaderStages_; renderPipelineDesc_.targetDesc.colorAttachments.resize(1); renderPipelineDesc_.targetDesc.colorAttachments[0].textureFormat = offscreenTexture_->getFormat(); renderPipelineDesc_.fragmentUnitSamplerMap[textureUnit_] = IGL_NAMEHANDLE(data::shader::kSimpleSampler); renderPipelineDesc_.cullMode = igl::CullMode::Disabled; } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; std::shared_ptr cmdBuf_; CommandBufferDesc cbDesc_ = {}; RenderPassDesc renderPass_; std::shared_ptr offscreenTexture_; std::shared_ptr framebuffer_; // Currently it is left to individual tests to initialize this std::shared_ptr inputTexture_; std::shared_ptr shaderStages_; std::shared_ptr vertexInputState_; std::shared_ptr vb_, uv_, ib_; std::shared_ptr samp_; RenderPipelineDesc renderPipelineDesc_; size_t textureUnit_ = 0; }; // // Coordinate System Test // // By default OGL has a z clip space of -1 to 1 but metal has a clipspace from 0 to 1 // See https://stackoverflow.com/questions/48311452/glkit-vs-metal-perspective-matrix-difference // This test is to ensure the behavior is consistent // // Expected output: Test passes for OGL but fails for Metal // backends // // Note: We are disabling this test for now because it's becoming distracting // to see the failure all the time. We will re-enable it once we have decided // what to do with the coordinate system differences. // TEST_F(BackendTest, DISABLED_CoordinateSystem) { Result ret; std::shared_ptr pipelineState; //------------------------------------- // Create input texture and upload data //------------------------------------- const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kOffscreenTexWidth, kOffscreenTexHeight, TextureDesc::TextureUsageBits::Sampled); inputTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(inputTexture_ != nullptr); const auto rangeDesc = TextureRangeDesc::new2D(0, 0, kOffscreenTexWidth, kOffscreenTexHeight); inputTexture_->upload(rangeDesc, data::texture::kTexRgba2x2.data()); //---------------- // Create Pipeline //---------------- pipelineState = iglDev_->createRenderPipeline(renderPipelineDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(pipelineState != nullptr); // Create a new vertex buffer with z values between -1 and 0 float zAdjustedQuad[] = {-1.0f, 1.0f, -0.2f, 1.0f, 1.0f, 1.0f, -0.2f, 1.0f, -1.0f, -1.0f, -0.2f, 1.0f, 1.0f, -1.0f, -0.2f, 1.0f}; BufferDesc bufDesc; bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = zAdjustedQuad; bufDesc.length = sizeof(data::vertex_index::kQuadVert); const std::shared_ptr zAdjustedVertexBuffer = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(zAdjustedVertexBuffer != nullptr); //------- // Render //------- cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(cmdBuf_ != nullptr); auto cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, framebuffer_); cmds->bindVertexBuffer(data::shader::kSimplePosIndex, *zAdjustedVertexBuffer); cmds->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); cmds->bindRenderPipelineState(pipelineState); cmds->bindTexture(textureUnit_, BindTarget::kFragment, inputTexture_.get()); cmds->bindSamplerState(textureUnit_, BindTarget::kFragment, samp_.get()); cmds->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmds->drawIndexed(6); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); cmdBuf_->waitUntilCompleted(); //---------------------- // Read back framebuffer //---------------------- auto pixels = std::vector(kOffscreenTexWidth * kOffscreenTexHeight); framebuffer_->copyBytesColorAttachment(*cmdQueue_, 0, pixels.data(), rangeDesc); //-------------------------------- // Verify against original texture //-------------------------------- for (size_t i = 0; i < kOffscreenTexWidth * kOffscreenTexHeight; i++) { ASSERT_EQ(pixels[i], data::texture::kTexRgba2x2[i]); } } } // namespace igl::tests ================================================ FILE: src/igl/tests/Blending.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "data/ShaderData.h" #include "data/TextureData.h" #include "data/VertexIndexData.h" #include "util/Common.h" #include #include #include #include #include #include #include #include #include namespace igl::tests { // The test will render to a texture with two overlapping quads. // Each test will use different blending operations #define OFFSCREEN_TEX_WIDTH 4ul #define OFFSCREEN_TEX_HEIGHT 4ul // // BlendingTest // class BlendingTest : public ::testing::Test { private: public: BlendingTest() = default; ~BlendingTest() override = default; // // SetUp() // // This function sets up a render pass and a graphics pipeline descriptor // so it is ready to render a simple quad with an input texture to an // offscreen texture. // // The actual creation of the graphics pipeline state object is left // to each test so that tests can replace the default settings with // something more appropriate. // void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_TRUE(iglDev_ != nullptr); ASSERT_TRUE(cmdQueue_ != nullptr); // Create an offscreen texture to render to const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); Result ret; offscreenTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(offscreenTexture_ != nullptr); // Create framebuffer using the offscreen texture FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = offscreenTexture_; framebuffer_ = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(framebuffer_ != nullptr); // Initialize render pass descriptor. // Framebuffer is completely cleared (including alpha value) renderPass_.colorAttachments.resize(1); renderPass_.colorAttachments[0].loadAction = LoadAction::Clear; renderPass_.colorAttachments[0].storeAction = StoreAction::Store; renderPass_.colorAttachments[0].clearColor = {0.0, 0.0, 0.0, 0.0}; // Initialize shader stages std::unique_ptr stages; igl::tests::util::createSimpleShaderStages(iglDev_, stages); shaderStages_ = std::move(stages); // Initialize input to vertex shader VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Float4; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].bufferIndex = data::shader::kSimplePosIndex; inputDesc.attributes[0].name = data::shader::kSimplePos; inputDesc.attributes[0].location = 0; inputDesc.inputBindings[0].stride = sizeof(float) * 4; inputDesc.attributes[1].format = VertexAttributeFormat::Float2; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].bufferIndex = data::shader::kSimpleUvIndex; inputDesc.attributes[1].name = data::shader::kSimpleUv; inputDesc.attributes[1].location = 1; inputDesc.inputBindings[1].stride = sizeof(float) * 2; // numAttributes has to equal to bindings when using more than 1 buffer inputDesc.numAttributes = inputDesc.numInputBindings = 2; vertexInputState_ = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vertexInputState_ != nullptr); // Initialize index buffer BufferDesc bufDesc; bufDesc.type = BufferDesc::BufferTypeBits::Index; bufDesc.data = data::vertex_index::kQuadInd.data(); bufDesc.length = sizeof(data::vertex_index::kQuadInd); ib_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(ib_ != nullptr); // Initialize vertex and sampler buffers bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data::vertex_index::kQuadVert.data(); bufDesc.length = sizeof(data::vertex_index::kQuadVert); vb_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vb_ != nullptr); bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data::vertex_index::kQuadUv.data(); bufDesc.length = sizeof(data::vertex_index::kQuadUv); uv_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(uv_ != nullptr); // Initialize sampler state const SamplerStateDesc samplerDesc; samp_ = iglDev_->createSamplerState(samplerDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(samp_ != nullptr); // Create input textures const TextureDesc inputTexDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT, TextureDesc::TextureUsageBits::Sampled); inputTexture1_ = iglDev_->createTexture(texDesc, &ret); inputTexture2_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(inputTexture1_ != nullptr && inputTexture2_ != nullptr); rangeDesc_ = TextureRangeDesc::new2D(0, 0, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT); inputTexture1_->upload(rangeDesc_, data::texture::kTexRgbaRedAlpha128_4x4.data()); inputTexture2_->upload(rangeDesc_, data::texture::kTexRgbaBlueAlpha127_4x4.data()); // Initialize Graphics Pipeline Descriptors, but leave the creation // to the individual tests in case further customization is required renderPipelineDesc_.vertexInputState = vertexInputState_; renderPipelineDesc_.shaderStages = shaderStages_; renderPipelineDesc_.targetDesc.colorAttachments.resize(1); renderPipelineDesc_.targetDesc.colorAttachments[0].textureFormat = offscreenTexture_->getFormat(); renderPipelineDesc_.fragmentUnitSamplerMap[textureUnit_] = IGL_NAMEHANDLE(data::shader::kSimpleSampler); renderPipelineDesc_.cullMode = igl::CullMode::Disabled; } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; std::shared_ptr cmdBuf_; CommandBufferDesc cbDesc_ = {}; const std::string backend_ = IGL_BACKEND_TYPE; RenderPassDesc renderPass_; std::shared_ptr offscreenTexture_; std::shared_ptr framebuffer_; // Currently it is left to individual tests to initialize this std::shared_ptr inputTexture1_; std::shared_ptr inputTexture2_; TextureDesc texDesc_; TextureRangeDesc rangeDesc_; std::shared_ptr shaderStages_; std::shared_ptr vertexInputState_; std::shared_ptr vb_, uv_, ib_; std::shared_ptr samp_; RenderPipelineDesc renderPipelineDesc_; size_t textureUnit_ = 0; }; // // Blending // // This test adds the color and alpha of two textures // TEST_F(BlendingTest, RGBASrcAndDstAddTest) { Result ret; std::shared_ptr pipelineState1, pipelineState2; //----------------- // Create Pipelines //----------------- renderPipelineDesc_.targetDesc.colorAttachments[0].blendEnabled = true; renderPipelineDesc_.targetDesc.colorAttachments[0].rgbBlendOp = BlendOp::Add; renderPipelineDesc_.targetDesc.colorAttachments[0].alphaBlendOp = BlendOp::Add; renderPipelineDesc_.targetDesc.colorAttachments[0].srcRGBBlendFactor = BlendFactor::One; renderPipelineDesc_.targetDesc.colorAttachments[0].srcAlphaBlendFactor = BlendFactor::One; renderPipelineDesc_.targetDesc.colorAttachments[0].dstRGBBlendFactor = BlendFactor::One; renderPipelineDesc_.targetDesc.colorAttachments[0].dstAlphaBlendFactor = BlendFactor::One; pipelineState1 = iglDev_->createRenderPipeline(renderPipelineDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(pipelineState1 != nullptr); //------- // Render //------- cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(cmdBuf_ != nullptr); auto cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, framebuffer_); cmds->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmds->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); // Bind pipeline cmds->bindRenderPipelineState(pipelineState1); cmds->bindIndexBuffer(*ib_, IndexFormat::UInt16); // Draw half red texture cmds->bindTexture(textureUnit_, BindTarget::kFragment, inputTexture1_.get()); cmds->bindSamplerState(textureUnit_, BindTarget::kFragment, samp_.get()); cmds->drawIndexed(6); // Draw half blue texture cmds->bindTexture(textureUnit_, BindTarget::kFragment, inputTexture2_.get()); cmds->bindSamplerState(textureUnit_, BindTarget::kFragment, samp_.get()); cmds->drawIndexed(6); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); cmdBuf_->waitUntilCompleted(); //---------------------- // Read back framebuffer //---------------------- auto pixels = std::vector(OFFSCREEN_TEX_WIDTH * OFFSCREEN_TEX_HEIGHT); framebuffer_->copyBytesColorAttachment(*cmdQueue_, 0, pixels.data(), rangeDesc_); //-------------------------------- // Verify that addition worked // R = 0x80 (128) // B = 0x7F (127) // A = 0xFF (255) //-------------------------------- const unsigned int finalPixel = 0x80007FFF; for (size_t i = 0; i < OFFSCREEN_TEX_WIDTH * OFFSCREEN_TEX_HEIGHT; i++) { ASSERT_EQ(pixels[i], finalPixel); } } } // namespace igl::tests ================================================ FILE: src/igl/tests/Buffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "util/Common.h" #include #include namespace igl::tests { // // BufferTest // // Test fixture for all the tests in this file. Takes care of common // initialization and allocating of common resources. // class BufferTest : public ::testing::Test { public: BufferTest() = default; ~BufferTest() override = default; // Set up common resources. This will create a device and a command queue void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); mapBufferTestsSupported_ = iglDev_->hasFeature(DeviceFeatures::MapBufferRange); } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; bool mapBufferTestsSupported_ = false; }; // // sizeForUniformElementType // // Make sure Buffer::sizeForUniformElementType() returns the expected value // TEST_F(BufferTest, sizeForUniformElementType) { // Invalid type has element size of 0 ASSERT_EQ(0, sizeForUniformElementType(UniformType::Invalid)); // These all have float as the underlying type, so 4 bytes ASSERT_EQ(4, sizeForUniformElementType(UniformType::Float)); ASSERT_EQ(4, sizeForUniformElementType(UniformType::Float2)); ASSERT_EQ(4, sizeForUniformElementType(UniformType::Float3)); ASSERT_EQ(4, sizeForUniformElementType(UniformType::Float4)); ASSERT_EQ(4, sizeForUniformElementType(UniformType::Mat2x2)); ASSERT_EQ(4, sizeForUniformElementType(UniformType::Mat3x3)); ASSERT_EQ(4, sizeForUniformElementType(UniformType::Mat4x4)); // IGL defines boolean as 1 byte ASSERT_EQ(1, sizeForUniformElementType(UniformType::Boolean)); // These all have 32-bit integer as the underlying type, so 4 bytes ASSERT_EQ(4, sizeForUniformElementType(UniformType::Int)); ASSERT_EQ(4, sizeForUniformElementType(UniformType::Int2)); ASSERT_EQ(4, sizeForUniformElementType(UniformType::Int3)); ASSERT_EQ(4, sizeForUniformElementType(UniformType::Int4)); } // // sizeForUniformType // // Verify igl::sizeForUniformType() returns the expected value. // We include all possible cases to get maximum code coverage. // TEST_F(BufferTest, sizeForUniformType) { // Invalid type has size of 0 ASSERT_EQ(0, sizeForUniformType(UniformType::Invalid)); ASSERT_EQ(0, sizeForUniformType((UniformType)-1)); // Types with element of Float ASSERT_EQ(4, sizeForUniformType(UniformType::Float)); ASSERT_EQ(8, sizeForUniformType(UniformType::Float2)); ASSERT_EQ(12, sizeForUniformType(UniformType::Float3)); ASSERT_EQ(16, sizeForUniformType(UniformType::Float4)); // Boolean has size of 1 ASSERT_EQ(1, sizeForUniformType(UniformType::Boolean)); // Types with element of Int ASSERT_EQ(4, sizeForUniformType(UniformType::Int)); ASSERT_EQ(8, sizeForUniformType(UniformType::Int2)); ASSERT_EQ(12, sizeForUniformType(UniformType::Int3)); ASSERT_EQ(16, sizeForUniformType(UniformType::Int4)); ASSERT_EQ(16, sizeForUniformType(UniformType::Mat2x2)); ASSERT_EQ(36, sizeForUniformType(UniformType::Mat3x3)); ASSERT_EQ(64, sizeForUniformType(UniformType::Mat4x4)); } TEST_F(BufferTest, createWithDebugLabel) { Result ret; constexpr size_t kIndexDataSize = 6; constexpr std::array kIndexData = { 0, 1, 2, 1, 3, 2, }; const BufferDesc bufferDesc{ .type = BufferDesc::BufferTypeBits::Index, .data = kIndexData.data(), .length = sizeof(kIndexData), .storage = ResourceStorage::Shared, .debugName = "test", }; const std::shared_ptr buffer = iglDev_->createBuffer(bufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(buffer != nullptr); ret = buffer->upload(kIndexData.data(), BufferRange{sizeof(kIndexData), 0}); ASSERT_EQ(ret.code, Result::Code::Ok); } TEST_F(BufferTest, mapIndexBuffer) { Result ret; constexpr size_t indexDataSize = 6; uint16_t indexData[indexDataSize] = { 0, 1, 2, 1, 3, 2, }; const BufferDesc bufferDesc{ .type = BufferDesc::BufferTypeBits::Index, .data = indexData, .length = sizeof(indexData), .storage = ResourceStorage::Shared, }; const std::shared_ptr buffer = iglDev_->createBuffer(bufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(buffer != nullptr); std::vector bufferData(indexDataSize); auto range = BufferRange(sizeof(indexData), 0); auto* data = buffer->map(range, &ret); if (!mapBufferTestsSupported_) { ASSERT_EQ(ret.code, Result::Code::InvalidOperation); return; } ASSERT_EQ(ret.code, Result::Code::Ok); memcpy(bufferData.data(), data, sizeof(indexData)); for (int i = 0; i < indexDataSize; ++i) { ASSERT_EQ(bufferData[i], indexData[i]); } buffer->unmap(); } TEST_F(BufferTest, mapBufferRangeIndexBuffer) { Result ret; constexpr size_t indexDataSize = 6; uint16_t indexData[indexDataSize] = { 0, 1, 2, 1, 3, 2, }; const BufferDesc bufferDesc{ .type = BufferDesc::BufferTypeBits::Index, .data = indexData, .length = sizeof(indexData), .storage = ResourceStorage::Shared, }; const std::shared_ptr buffer = iglDev_->createBuffer(bufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(buffer != nullptr); std::vector bufferPartialData(3); const int numElementsToSkip = 2; const int offsetBytes = numElementsToSkip * sizeof(uint16_t); const int numElementsToMap = 3; const int sizeBytes = numElementsToMap * sizeof(uint16_t); auto newRange = BufferRange(sizeBytes, offsetBytes); auto* data = buffer->map(newRange, &ret); if (!mapBufferTestsSupported_) { ASSERT_EQ(ret.code, Result::Code::InvalidOperation); return; } ASSERT_EQ(ret.code, Result::Code::Ok); memcpy(bufferPartialData.data(), data, sizeBytes); for (int i = 0; i < numElementsToMap; ++i) { ASSERT_EQ(bufferPartialData[i], indexData[i + numElementsToSkip]); } buffer->unmap(); } TEST_F(BufferTest, copyBytesErrorsIndexBuffer) { Result ret; constexpr size_t indexDataSize = 6; uint16_t indexData[indexDataSize] = { 0, 1, 2, 1, 3, 2, }; const BufferDesc bufferDesc{ .type = BufferDesc::BufferTypeBits::Index, .data = indexData, .length = sizeof(indexData), .storage = ResourceStorage::Shared, }; const std::shared_ptr buffer = iglDev_->createBuffer(bufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(buffer != nullptr); // Offset starts past end of buffer auto range = BufferRange(sizeof(indexData), 1); buffer->map(range, &ret); ASSERT_EQ(ret.code, Result::Code::ArgumentOutOfRange); buffer->unmap(); // Range extends beyond end of buffer range = BufferRange(1, sizeof(indexData)); buffer->map(range, &ret); ASSERT_EQ(ret.code, Result::Code::ArgumentOutOfRange); buffer->unmap(); } TEST_F(BufferTest, mapUniformBuffer) { Result ret; Color color = {1.0f, 5.0f, 7.0f, 1.0f}; const BufferDesc bufferDesc{ .type = BufferDesc::BufferTypeBits::Uniform, .data = &color, .length = sizeof(color), }; const std::shared_ptr buffer = iglDev_->createBuffer(bufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(buffer != nullptr); std::vector bufferData(4); auto range = BufferRange(sizeof(color), 0); auto* data = buffer->map(range, &ret); memcpy(bufferData.data(), data, sizeof(color)); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_EQ(color.r, bufferData[0]); ASSERT_EQ(color.g, bufferData[1]); ASSERT_EQ(color.b, bufferData[2]); ASSERT_EQ(color.a, bufferData[3]); } } // namespace igl::tests ================================================ FILE: src/igl/tests/CMakeLists.txt ================================================ # Copyright (c) Meta Platforms, Inc. and affiliates. # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. cmake_minimum_required(VERSION 3.19) project(IGLTests CXX C) file(GLOB SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp util/*.cpp util/device/*.cpp) file(GLOB HEADER_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.h util/*.h util/device/*.h) if(IGL_WITH_VULKAN) file(GLOB VULKAN_SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} vulkan/*.cpp) list(APPEND SRC_FILES ${VULKAN_SRC_FILES}) list(APPEND SRC_FILES util/device/vulkan/TestDevice.cpp) list(APPEND HEADER_FILES util/device/vulkan/TestDevice.h) if(MACOSX) list(APPEND SRC_FILES util/device/vulkan/TestDeviceXCTestHelper.mm) list(APPEND HEADER_FILES util/device/vulkan/TestDeviceXCTestHelper.h) endif() endif() if(IGL_WITH_OPENGL OR IGL_WITH_OPENGLES) file(GLOB OPENGL_SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ogl/*.cpp) list(APPEND SRC_FILES ${OPENGL_SRC_FILES}) list(APPEND SRC_FILES util/device/opengl/TestDevice.cpp) list(APPEND HEADER_FILES util/device/opengl/TestDevice.h) endif() if(IGL_WITH_METAL) file(GLOB METAL_SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} metal/*.cpp metal/*.mm) list(APPEND SRC_FILES ${METAL_SRC_FILES}) list(APPEND SRC_FILES util/device/MetalTestDevice.mm) list(APPEND SRC_FILES util/device/metal/TestDevice.mm) list(APPEND HEADER_FILES util/device/MetalTestDevice.h) list(APPEND HEADER_FILES util/device/metal/TestDevice.h) endif() if(IGL_WITH_D3D12) file(GLOB D3D12_SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} d3d12/*.cpp) list(APPEND SRC_FILES ${D3D12_SRC_FILES}) list(APPEND SRC_FILES util/device/d3d12/TestDevice.cpp) list(APPEND HEADER_FILES util/device/d3d12/TestDevice.h) endif() if(IGL_WITH_IGLU) file(GLOB IGLU_SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} iglu/*.cpp) file(GLOB IGLU_SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} iglu/texture_loader/*.cpp) if((NOT IGL_WITH_OPENGL) AND (NOT IGL_WITH_OPENGLES)) list(REMOVE_ITEM IGLU_SRC_FILES iglu/texture_loader/Ktx1TextureLoaderTest.cpp) endif() if(NOT IGL_WITH_VULKAN) list(REMOVE_ITEM IGLU_SRC_FILES iglu/texture_loader/Ktx2TextureLoaderTest.cpp) endif() list(APPEND SRC_FILES ${IGLU_SRC_FILES}) endif() enable_testing() # Add custom main to initialize COM and install signal handlers before gtest list(APPEND SRC_FILES main.cpp) add_executable(IGLTests ${SRC_FILES} ${HEADER_FILES}) if(WIN32) if(MSVC) target_compile_options(IGLTests PRIVATE /bigobj) endif() target_compile_definitions(IGLTests PRIVATE -DNOMINMAX) target_compile_definitions(IGLTests PRIVATE -DIGL_UNIT_TESTS_GLES_VERSION=3) # Ensure Unicode matches across GoogleTest and our test binary on Windows # Ensure tests are built without UNICODE to match GoogleTest defaults and avoid CRT mismatches if(MSVC) target_compile_options(IGLTests PRIVATE /UUNICODE /U_UNICODE) if(TARGET gtest) target_compile_options(gtest PRIVATE /UUNICODE /U_UNICODE) endif() if(TARGET gtest_main) target_compile_options(gtest_main PRIVATE /UUNICODE /U_UNICODE) endif() if(TARGET gmock) target_compile_options(gmock PRIVATE /UUNICODE /U_UNICODE) endif() if(TARGET gmock_main) target_compile_options(gmock_main PRIVATE /UUNICODE /U_UNICODE) endif() endif() target_include_directories(IGLTests PRIVATE "${IGL_ROOT_DIR}/third-party/deps/src/glew/include") # IGL tests use EGL, here's a stub for Windows add_library( EGL ${IGL_ROOT_DIR}/third-party/deps/src/EGL/EGL/src/egl.c ${IGL_ROOT_DIR}/third-party/deps/src/EGL/EGL/src/egl_common.cpp ${IGL_ROOT_DIR}/third-party/deps/src/EGL/EGL/src/egl_windows.cpp) target_include_directories(EGL PUBLIC "${IGL_ROOT_DIR}/third-party/deps/src/EGL/EGL/include") target_compile_definitions(EGL PUBLIC "-DEGL_NO_CONFIG_KHR=((EGLConfig)0)") target_compile_definitions(EGL PUBLIC -DEGL_NO_GLEW) target_compile_definitions(EGL PUBLIC __SCITECH_SNAP__) igl_set_cxxstd(EGL 17) igl_set_folder(EGL "third-party") target_link_libraries(IGLTests PUBLIC EGL) elseif(UNIX AND NOT APPLE AND NOT ANDROID) target_link_libraries(IGLTests PUBLIC EGL) endif() igl_set_cxxstd(IGLTests 20) igl_set_folder(IGLTests "IGL") # gtest - FORCE static linkage to avoid DLL initialization issues # NOTE: gmock is NOT needed - no tests use it # cmake-format: off set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared libraries" FORCE) set(BUILD_GMOCK OFF CACHE BOOL "Build gmock" FORCE) set(INSTALL_GTEST OFF CACHE BOOL "Install gtest" FORCE) set(GTEST_HAS_ABSL OFF CACHE BOOL "Use Abseil" FORCE) set(gtest_force_shared_crt OFF CACHE BOOL "Force shared CRT" FORCE) # Explicitly disable shared library build set(BUILD_SHARED_LIBS OFF) # CRITICAL: Set these compile definitions globally BEFORE including gtest add_compile_definitions(GTEST_LINKED_AS_SHARED_LIBRARY=0 GTEST_CREATE_SHARED_LIBRARY=0) # cmake-format: on add_subdirectory(${IGL_ROOT_DIR}/third-party/deps/src/gtest "gtest" EXCLUDE_FROM_ALL) # CRITICAL: Force static linking by removing any DLL export definitions if(TARGET gtest) target_compile_definitions(gtest PRIVATE GTEST_CREATE_SHARED_LIBRARY=0) target_compile_definitions(gtest PUBLIC GTEST_LINKED_AS_SHARED_LIBRARY=0) endif() igl_set_folder(gtest "third-party") igl_set_folder(gtest_main "third-party") igl_set_cxxstd(gtest 17) igl_set_cxxstd(gtest_main 17) target_link_libraries(IGLTests PUBLIC IGLLibrary) target_link_libraries(IGLTests PUBLIC gtest) # Use our custom main.cpp instead of gtest_main # NOTE: gmock is NOT linked - no tests use gmock, only gtest target_link_libraries(IGLTests PUBLIC IGLUmanagedUniformBuffer) target_link_libraries(IGLTests PUBLIC IGLUshaderCross) # Add STB include directory for image utilities used by test artifacts target_include_directories(IGLTests PRIVATE "${IGL_ROOT_DIR}/third-party/deps/src/stb") # Enable experimental features ONLY for unit tests (NOT for render sessions) # This allows D3D12 headless tests to use unsigned DXIL shaders if(IGL_WITH_D3D12) target_compile_definitions(IGLTests PRIVATE IGL_ENABLE_EXPERIMENTAL_FEATURES_FOR_TESTS=1) endif() if(TARGET glfw) target_link_libraries(IGLTests PRIVATE glfw) endif() if(IGL_WITH_IGLU) target_link_libraries(IGLTests PUBLIC IGLUimgui) target_link_libraries(IGLTests PUBLIC IGLUsimple_renderer) target_link_libraries(IGLTests PUBLIC IGLUstate_pool) target_link_libraries(IGLTests PUBLIC IGLUtexture_accessor) target_link_libraries(IGLTests PUBLIC IGLUtexture_loader) target_link_libraries(IGLTests PUBLIC IGLUuniform) endif() if(IGL_WITH_D3D12) target_compile_definitions(IGLTests PUBLIC -DIGL_BACKEND_TYPE="d3d12") elseif(IGL_WITH_VULKAN) target_compile_definitions(IGLTests PUBLIC -DIGL_BACKEND_TYPE="vulkan") elseif(IGL_WITH_OPENGL OR IGL_WITH_OPENGLES) target_compile_definitions(IGLTests PUBLIC -DIGL_BACKEND_TYPE="ogl") endif() # Ensure gtest/gmock are linked statically target_compile_definitions(IGLTests PRIVATE GTEST_LINKED_AS_SHARED_LIBRARY=0 GTEST_CREATE_SHARED_LIBRARY=0) if(UNIX) if (CMAKE_C_COMPILER_ID STREQUAL "GNU") target_compile_options(IGLTests PUBLIC $<$:-Wno-volatile>) endif() endif() # Register tests with CTest so they can be discovered include(GoogleTest) gtest_discover_tests(IGLTests DISCOVERY_TIMEOUT 60 DISCOVERY_MODE PRE_TEST ) # Fallback: also register the test executable directly for manual runs if (WIN32) add_test(NAME IGLTests COMMAND ${CMAKE_CURRENT_BINARY_DIR}/$/IGLTests.exe) else() add_test(NAME IGLTests COMMAND ${CMAKE_CURRENT_BINARY_DIR}/IGLTests) endif() # Copy dxil.dll for D3D12 tests (required for DXIL signing) if(IGL_WITH_D3D12 AND WIN32 AND MSVC) # Try to locate dxil.dll from the Windows SDK without relying on machine-specific SDK versions find_file(DXIL_DLL_FOR_TESTS NAMES dxil.dll HINTS "$ENV{WindowsSdkBinPath}" "$ENV{WindowsSdkDir}/bin" PATH_SUFFIXES x64 ) if(DXIL_DLL_FOR_TESTS) add_custom_command(TARGET IGLTests POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${DXIL_DLL_FOR_TESTS}" "$/" COMMENT "Copying dxil.dll for IGLTests" ) endif() endif() ================================================ FILE: src/igl/tests/Color.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "util/Color.h" #include namespace igl::tests { TEST(ColorTest, ctor) { const Color testColor(1.0f, 0.5f, 0.0f); ASSERT_EQ(testColor.r, 1.0f); ASSERT_EQ(testColor.g, 0.5f); ASSERT_EQ(testColor.b, 0.0f); ASSERT_EQ(testColor.a, 1.0f); const Color testColor2(1.0f, 0.5f, 0.0f, 1.0f); ASSERT_EQ(testColor2.r, 1.0f); ASSERT_EQ(testColor2.g, 0.5f); ASSERT_EQ(testColor2.b, 0.0f); ASSERT_EQ(testColor2.a, 1.0f); const auto* floatPtr = testColor.toFloatPtr(); ASSERT_EQ(floatPtr[0], 1.0f); ASSERT_EQ(floatPtr[1], 0.5f); ASSERT_EQ(floatPtr[2], 0.0f); ASSERT_EQ(floatPtr[3], 1.0f); } TEST(sRGBColorTest, ctor) { const util::SRgbColor testColor(255, 128, 0); ASSERT_EQ(testColor.r, 255); ASSERT_EQ(testColor.g, 128); ASSERT_EQ(testColor.b, 0); ASSERT_EQ(testColor.a, 255); const util::SRgbColor testColor2(255, 128, 0, 255); ASSERT_EQ(testColor2.r, 255); ASSERT_EQ(testColor2.g, 128); ASSERT_EQ(testColor2.b, 0); ASSERT_EQ(testColor2.a, 255); } TEST(sRGBColorTest, toRGBA32) { const util::SRgbColor testColor(255, 128, 0); ASSERT_EQ(testColor.toRGBA32(), 0xff8000ff); } TEST(sRGBColorTest, fromRGBA32) { const util::SRgbColor testColor(0xff8000ff); ASSERT_EQ(testColor.r, 255); ASSERT_EQ(testColor.g, 128); ASSERT_EQ(testColor.b, 0); ASSERT_EQ(testColor.a, 255); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ColorSpace.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace igl::tests { TEST(ColorSpaceTest, colorSpaceToString) { ASSERT_STREQ(colorSpaceToString(ColorSpace::SRGB_LINEAR), "SRGB_LINEAR"); ASSERT_STREQ(colorSpaceToString(ColorSpace::SRGB_NONLINEAR), "SRGB_NONLINEAR"); ASSERT_STREQ(colorSpaceToString(ColorSpace::DISPLAY_P3_NONLINEAR), "DISPLAY_P3_NONLINEAR"); ASSERT_STREQ(colorSpaceToString(ColorSpace::EXTENDED_SRGB_LINEAR), "EXTENDED_SRGB_LINEAR"); ASSERT_STREQ(colorSpaceToString(ColorSpace::DISPLAY_P3_LINEAR), "DISPLAY_P3_LINEAR"); ASSERT_STREQ(colorSpaceToString(ColorSpace::DCI_P3_NONLINEAR), "DCI_P3_NONLINEAR"); ASSERT_STREQ(colorSpaceToString(ColorSpace::BT709_LINEAR), "BT709_LINEAR"); ASSERT_STREQ(colorSpaceToString(ColorSpace::BT709_NONLINEAR), "BT709_NONLINEAR"); ASSERT_STREQ(colorSpaceToString(ColorSpace::BT2020_LINEAR), "BT2020_LINEAR"); ASSERT_STREQ(colorSpaceToString(ColorSpace::HDR10_ST2084), "HDR10_ST2084"); ASSERT_STREQ(colorSpaceToString(ColorSpace::DOLBYVISION), "DOLBYVISION"); ASSERT_STREQ(colorSpaceToString(ColorSpace::HDR10_HLG), "HDR10_HLG"); ASSERT_STREQ(colorSpaceToString(ColorSpace::ADOBERGB_LINEAR), "ADOBERGB_LINEAR"); ASSERT_STREQ(colorSpaceToString(ColorSpace::ADOBERGB_NONLINEAR), "ADOBERGB_NONLINEAR"); ASSERT_STREQ(colorSpaceToString(ColorSpace::PASS_THROUGH), "PASS_THROUGH"); ASSERT_STREQ(colorSpaceToString(ColorSpace::EXTENDED_SRGB_NONLINEAR), "EXTENDED_SRGB_NONLINEAR"); ASSERT_STREQ(colorSpaceToString(ColorSpace::DISPLAY_NATIVE_AMD), "DISPLAY_NATIVE_AMD"); ASSERT_STREQ(colorSpaceToString(ColorSpace::BT601_NONLINEAR), "BT601_NONLINEAR"); ASSERT_STREQ(colorSpaceToString(ColorSpace::BT2020_NONLINEAR), "BT2020_NONLINEAR"); ASSERT_STREQ(colorSpaceToString(ColorSpace::BT2100_HLG_NONLINEAR), "BT2100_HLG_NONLINEAR"); ASSERT_STREQ(colorSpaceToString(ColorSpace::BT2100_PQ_NONLINEAR), "BT2100_PQ_NONLINEAR"); } } // namespace igl::tests ================================================ FILE: src/igl/tests/CommandBuffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "util/Common.h" namespace igl::tests { namespace { const char* kDebugName = "CommandBufferTest"; } // // CommandBufferTest // // Test fixture for all the tests in this file. Takes care of common // initialization and allocating of common resources. // class CommandBufferTest : public ::testing::Test { public: CommandBufferTest() = default; ~CommandBufferTest() override = default; // Set up common resources. This will create a device and a command queue void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); Result result; CommandBufferDesc desc{.debugName = kDebugName}; cmdBuf_ = cmdQueue_->createCommandBuffer(desc, &result); ASSERT_EQ(result.code, Result::Code::Ok); ASSERT_TRUE(cmdBuf_ != nullptr); } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; std::shared_ptr cmdBuf_; }; // // Check pushDebugGroupLabel and popDebugGroupLabel // // These functions sadly don't do anything without IGL_API_LOG and IGL_DEBUG defined, // this is only for coverage to smoke test. // TEST_F(CommandBufferTest, pushPopDebugGroupLabel) { // API Logging can't be tested in it's current state, so we just check that it worked. cmdBuf_->pushDebugGroupLabel("TEST"); cmdBuf_->popDebugGroupLabel(); } TEST_F(CommandBufferTest, debugName) { ASSERT_EQ(cmdBuf_->desc.debugName, kDebugName); } } // namespace igl::tests ================================================ FILE: src/igl/tests/Common.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace igl::tests { TEST(CommonTest, BackendTypeToStringTest) { ASSERT_EQ(BackendTypeToString(BackendType::Invalid), "Invalid"); ASSERT_EQ(BackendTypeToString(BackendType::OpenGL), "OpenGL"); ASSERT_EQ(BackendTypeToString(BackendType::Metal), "Metal"); ASSERT_EQ(BackendTypeToString(BackendType::Vulkan), "Vulkan"); // @fb-only } TEST(CommonTest, ResultTest) { Result testResult; Result testResult2(Result::Code::Ok, "test message2"); Result testResult3(Result::Code::Ok, std::string("test message3")); ASSERT_STREQ(testResult2.message.c_str(), "test message2"); ASSERT_TRUE(testResult2.isOk()); ASSERT_STREQ(testResult3.message.c_str(), "test message3"); ASSERT_TRUE(testResult3.isOk()); Result::setResult(&testResult, Result::Code::ArgumentInvalid, std::string("new test message")); ASSERT_STREQ(testResult.message.c_str(), "new test message"); ASSERT_FALSE(testResult.isOk()); Result::setResult(&testResult3, testResult); ASSERT_FALSE(testResult3.isOk()); Result::setResult(&testResult2, std::move(testResult)); ASSERT_FALSE(testResult2.isOk()); } TEST(CommonTest, RectTest) { const ScissorRect testRect; ASSERT_TRUE(testRect.isNull()); const ScissorRect testRect2{.x = 0, .y = 0, .width = 1, .height = 1}; ASSERT_FALSE(testRect2.isNull()); } TEST(CommonTest, SizeTest) { Size size; ASSERT_EQ(size.height, 0.0f); ASSERT_EQ(size.width, 0.0f); Size size2(2, 2); ASSERT_EQ(size2.height, 2.0f); ASSERT_EQ(size2.width, 2.0f); ASSERT_TRUE(size != size2); ASSERT_TRUE(size2 == size2); ASSERT_FALSE(size == size2); ASSERT_FALSE(size2 != size2); } TEST(CommonTest, DimensionTest) { Dimensions dimension; ASSERT_EQ(dimension.height, 0); ASSERT_EQ(dimension.width, 0); ASSERT_EQ(dimension.depth, 0); Dimensions dimension2(2, 2, 2); ASSERT_EQ(dimension2.height, 2); ASSERT_EQ(dimension2.width, 2); ASSERT_EQ(dimension2.depth, 2); ASSERT_TRUE(dimension != dimension2); ASSERT_TRUE(dimension2 == dimension2); ASSERT_FALSE(dimension == dimension2); ASSERT_FALSE(dimension2 != dimension2); } TEST(CommonTest, ViewportTest) { Viewport viewport; ASSERT_TRUE(viewport != kInvalidViewport); Viewport viewport2; ASSERT_TRUE(viewport == viewport2); } TEST(CommonTest, EnumToValueTest) { auto val = EnumToValue(BackendType::Vulkan); ASSERT_EQ(val, 3); } TEST(CommonTest, ScopeGuardTest) { int testValue = 0; { auto scopeGuard = ScopeGuardOnExit() + [&]() { ++testValue; }; } ASSERT_EQ(testValue, 1); } TEST(CommonTest, OptimizedMemCopyTest) { uint8_t buffer1[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}; uint8_t buffer2[32] = {0}; optimizedMemcpy(buffer1, buffer2, 4); ASSERT_EQ(*reinterpret_cast(buffer1), *reinterpret_cast(buffer2)); optimizedMemcpy(buffer1, buffer2, 8); ASSERT_EQ(*reinterpret_cast(buffer1), *reinterpret_cast(buffer2)); optimizedMemcpy(buffer1, buffer2, 16); ASSERT_EQ(*reinterpret_cast(buffer1), *reinterpret_cast(buffer2)); ASSERT_EQ(*(reinterpret_cast(buffer1) + 1), *(reinterpret_cast(buffer2) + 1)); optimizedMemcpy(buffer1, buffer2, 32); ASSERT_EQ(*reinterpret_cast(buffer1), *reinterpret_cast(buffer2)); ASSERT_EQ(*(reinterpret_cast(buffer1) + 1), *(reinterpret_cast(buffer2) + 1)); ASSERT_EQ(*(reinterpret_cast(buffer1) + 2), *(reinterpret_cast(buffer2) + 2)); ASSERT_EQ(*(reinterpret_cast(buffer1) + 3), *(reinterpret_cast(buffer2) + 3)); } TEST(CommonTest, HandleTest) { const Holder bindGroupHandle; const Holder bindGroupBufferHandle; const Holder textureHandle; const Holder samplerHandle; } TEST(CommonTest, PoolTest) { Pool bindGroupBuffersPool; } } // namespace igl::tests ================================================ FILE: src/igl/tests/ComputeCommandEncoder.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "data/ShaderData.h" #include "util/Common.h" #include #include #include #include #include #include #include namespace igl::tests { static std::vector dataIn = {1.0, 2.0, 3.0, 4.0, 5.0f, 6.0f}; /** * @brief ComputeCommandEncoderTest is a test fixture for all the tests in this file. * It takes care of common initialization and allocating of common resources. */ class ComputeCommandEncoderTest : public ::testing::Test { private: public: ComputeCommandEncoderTest() = default; ~ComputeCommandEncoderTest() override = default; /** * @brief This function sets up compute buffers and compiles the compute shader. */ void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_TRUE(iglDev_ != nullptr); ASSERT_TRUE(cmdQueue_ != nullptr); if (!iglDev_->hasFeature(DeviceFeatures::Compute)) { return; } const BufferDesc vbInDesc{ .type = BufferDesc::BufferTypeBits::Storage, .data = dataIn.data(), .length = sizeof(float) * dataIn.size(), }; bufferIn_ = iglDev_->createBuffer(vbInDesc, nullptr); ASSERT_TRUE(bufferIn_ != nullptr); // Use ResourceStorage::Shared for output buffers so they can be mapped for reading const BufferDesc bufferOutDesc{ .type = BufferDesc::BufferTypeBits::Storage, .length = sizeof(float) * dataIn.size(), .storage = ResourceStorage::Shared, }; bufferOut0_ = iglDev_->createBuffer(bufferOutDesc, nullptr); ASSERT_TRUE(bufferOut0_ != nullptr); bufferOut1_ = iglDev_->createBuffer(bufferOutDesc, nullptr); ASSERT_TRUE(bufferOut1_ != nullptr); bufferOut2_ = iglDev_->createBuffer(bufferOutDesc, nullptr); ASSERT_TRUE(bufferOut2_ != nullptr); { // Compile CS std::string_view entryName; std::string_view source; if (iglDev_->getBackendType() == igl::BackendType::OpenGL) { source = igl::tests::data::shader::kOglSimpleComputeShader; entryName = igl::tests::data::shader::kSimpleComputeFunc; } else if (iglDev_->getBackendType() == igl::BackendType::Vulkan) { source = igl::tests::data::shader::kVulkanSimpleComputeShader; entryName = "main"; // entry point is not pipelined. Hardcoding to main for now. } else if (iglDev_->getBackendType() == igl::BackendType::Metal) { source = igl::tests::data::shader::kMtlSimpleComputeShader; entryName = igl::tests::data::shader::kSimpleComputeFunc; } else if (iglDev_->getBackendType() == igl::BackendType::D3D12) { source = igl::tests::data::shader::kD3D12SimpleComputeShader; entryName = igl::tests::data::shader::kSimpleComputeFunc; } else { IGL_DEBUG_ASSERT_NOT_REACHED(); } Result ret; computeStages_ = ShaderStagesCreator::fromModuleStringInput( *iglDev_, source.data(), std::string(entryName), "", &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(computeStages_ != nullptr); } } /** * @brief This function binds bufferIn and bufferOut to a new computePipelineState and encodes the * computePipelineState to a new computeCommandEncoder. */ void encodeCompute(const std::shared_ptr& cmdBuffer, const std::shared_ptr& bufferIn, const std::shared_ptr& bufferOut, std::shared_ptr& ret) { ASSERT_TRUE(computeStages_ != nullptr); ComputePipelineDesc computeDesc; computeDesc.shaderStages = computeStages_; computeDesc.buffersMap[igl::tests::data::shader::kSimpleComputeInputIndex] = IGL_NAMEHANDLE(igl::tests::data::shader::kSimpleComputeInput); computeDesc.buffersMap[igl::tests::data::shader::kSimpleComputeOutputIndex] = IGL_NAMEHANDLE(igl::tests::data::shader::kSimpleComputeOutput); auto computePipelineState = iglDev_->createComputePipeline(computeDesc, nullptr); ASSERT_TRUE(computePipelineState != nullptr); auto computeEncoder = cmdBuffer->createComputeCommandEncoder(); ASSERT_TRUE(computeEncoder != nullptr); computeEncoder->insertDebugEventLabel("Running ComputeCommandEncoderTest..."); computeEncoder->bindComputePipelineState(computePipelineState); computeEncoder->bindBuffer(igl::tests::data::shader::kSimpleComputeInputIndex, bufferIn.get()); computeEncoder->bindBuffer(igl::tests::data::shader::kSimpleComputeOutputIndex, bufferOut.get()); const Dimensions threadgroupSize(dataIn.size(), 1, 1); const Dimensions threadgroupCount(1, 1, 1); computeEncoder->dispatchThreadGroups( threadgroupCount, threadgroupSize, {.buffers = {bufferIn.get()}}); computeEncoder->endEncoding(); ret = computePipelineState; } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; std::shared_ptr computeStages_; std::shared_ptr bufferIn_, bufferOut0_, bufferOut1_, bufferOut2_; std::shared_ptr cps1_, cps2_, cps3_; }; TEST_F(ComputeCommandEncoderTest, canEncodeBasicBufferOperation) { #if IGL_PLATFORM_LINUX && !IGL_PLATFORM_LINUX_USE_EGL GTEST_SKIP() << "Fix this test on Linux"; #endif if (!iglDev_->hasFeature(DeviceFeatures::Compute)) { return; } ASSERT_TRUE(cmdQueue_ != nullptr); const CommandBufferDesc cbDesc; auto cmdBuffer = cmdQueue_->createCommandBuffer(cbDesc, nullptr); ASSERT_TRUE(cmdBuffer != nullptr); encodeCompute(cmdBuffer, bufferIn_, bufferOut0_, cps1_); ASSERT_TRUE(cmdQueue_ != nullptr); cmdQueue_->submit(*cmdBuffer); cmdBuffer->waitUntilCompleted(); std::vector bytes(dataIn.size()); auto range = BufferRange(sizeof(float) * dataIn.size(), 0); Result ret; auto* data = bufferOut0_->map(range, &ret); ASSERT_TRUE(data != nullptr); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); memcpy(bytes.data(), data, sizeof(float) * dataIn.size()); ASSERT_EQ(dataIn.size() > 0, true); for (int i = 0; i < dataIn.size(); i++) { ASSERT_EQ(dataIn[i] * 2.0f, bytes[i]); } bufferOut0_->unmap(); } TEST_F(ComputeCommandEncoderTest, bindImageTexture) { if (!iglDev_->hasFeature(DeviceFeatures::Compute)) { return; } auto cmdBuffer = cmdQueue_->createCommandBuffer({}, nullptr); ASSERT_TRUE(cmdBuffer != nullptr); auto computeCommandEncoder = cmdBuffer->createComputeCommandEncoder(); computeCommandEncoder->bindImageTexture(0, nullptr, TextureFormat::Invalid); computeCommandEncoder->endEncoding(); cmdQueue_->submit(*cmdBuffer); cmdBuffer->waitUntilCompleted(); } TEST_F(ComputeCommandEncoderTest, canUseOutputBufferFromOnePassAsInputToNext) { #if IGL_PLATFORM_LINUX && !IGL_PLATFORM_LINUX_USE_EGL GTEST_SKIP() << "Fix this test on Linux"; #endif if (!iglDev_->hasFeature(DeviceFeatures::Compute)) { return; } ASSERT_TRUE(cmdQueue_ != nullptr); { const CommandBufferDesc cbDesc; auto cmdBuffer = cmdQueue_->createCommandBuffer(cbDesc, nullptr); ASSERT_TRUE(cmdBuffer != nullptr); encodeCompute(cmdBuffer, bufferIn_, bufferOut0_, cps1_); cmdQueue_->submit(*cmdBuffer); cmdBuffer->waitUntilCompleted(); } { const CommandBufferDesc cbDesc; auto cmdBuffer = cmdQueue_->createCommandBuffer(cbDesc, nullptr); ASSERT_TRUE(cmdBuffer != nullptr); encodeCompute(cmdBuffer, bufferOut0_, bufferOut1_, cps2_); cmdQueue_->submit(*cmdBuffer); cmdBuffer->waitUntilCompleted(); } { const CommandBufferDesc cbDesc; auto cmdBuffer = cmdQueue_->createCommandBuffer(cbDesc, nullptr); ASSERT_TRUE(cmdBuffer != nullptr); encodeCompute(cmdBuffer, bufferOut1_, bufferOut2_, cps3_); cmdQueue_->submit(*cmdBuffer); cmdBuffer->waitUntilCompleted(); } std::vector bytes(dataIn.size()); auto range = BufferRange(sizeof(float) * dataIn.size(), 0); Result ret; auto* data = bufferOut2_->map(range, &ret); ASSERT_TRUE(data != nullptr); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); memcpy(bytes.data(), data, sizeof(float) * dataIn.size()); ASSERT_EQ(dataIn.size() > 0, true); for (int i = 0; i < dataIn.size(); i++) { // Compute pass ran 3 times ASSERT_EQ(dataIn[i] * 2.0f * 2.0f * 2.0f, bytes[i]); } bufferOut2_->unmap(); } TEST_F(ComputeCommandEncoderTest, bindSamplerState) { if (!iglDev_->hasFeature(DeviceFeatures::Compute)) { return; } auto cmdBuffer = cmdQueue_->createCommandBuffer({}, nullptr); ASSERT_TRUE(cmdBuffer != nullptr); auto computeCommandEncoder = cmdBuffer->createComputeCommandEncoder(); computeCommandEncoder->bindSamplerState(0, nullptr); computeCommandEncoder->endEncoding(); cmdQueue_->submit(*cmdBuffer); cmdBuffer->waitUntilCompleted(); } TEST_F(ComputeCommandEncoderTest, copyBuffer) { if (!iglDev_->hasFeature(DeviceFeatures::CopyBuffer)) { return; } ASSERT_TRUE(cmdQueue_ != nullptr); std::vector dataIn2 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 10}; auto bufferSrc = iglDev_->createBuffer( BufferDesc{ .type = BufferDesc::BufferTypeBits::Storage, .data = dataIn2.data(), .length = dataIn2.size(), .storage = ResourceStorage::Private, .debugName = "bufferSrc", }, nullptr); auto bufferDst = iglDev_->createBuffer( BufferDesc{ .type = BufferDesc::BufferTypeBits::Storage, .length = dataIn2.size(), .storage = ResourceStorage::Shared, .debugName = "bufferDst", }, nullptr); { auto cmdBuffer = cmdQueue_->createCommandBuffer({}, nullptr); ASSERT_TRUE(cmdBuffer != nullptr); cmdBuffer->copyBuffer(*bufferSrc, *bufferDst, 0, 0, dataIn2.size()); cmdQueue_->submit(*cmdBuffer); cmdBuffer->waitUntilCompleted(); } Result ret; const uint8_t* dataOut = static_cast(bufferDst->map(BufferRange(dataIn2.size(), 0), &ret)); ASSERT_TRUE(dataOut != nullptr); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); for (int i = 0; i < dataIn2.size(); i++) { ASSERT_EQ(dataIn2[i], dataOut[i]); } bufferDst->unmap(); } } // namespace igl::tests ================================================ FILE: src/igl/tests/Device.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "data/ShaderData.h" #include "data/VertexIndexData.h" #include "util/Common.h" #if IGL_PLATFORM_WINDOWS #include #endif #include #include #include #include #include // Use a 1x1 Framebuffer for this test #define OFFSCREEN_RT_WIDTH 1 #define OFFSCREEN_RT_HEIGHT 1 namespace igl::tests { // // DeviceTest // // This category of tests are meant for testing Device APIs that are not // related to resource creation, e.g. ICapabilities, and getting device // statics. // class DeviceTest : public ::testing::Test { public: DeviceTest() = default; ~DeviceTest() override { // [Alexey] TODO: Somehow D3D12 is sensitive to the order of destruction // of resources and D3D debug layer report leaks // I suspect that might be the actual issue, but it requires deeper D3D12 backend investigation // first Release all GPU resources before destroying the device Resources must be released in // reverse order of creation and before the device is destroyed to avoid VMA cleanup issues if (iglDev_->getBackendType() == igl::BackendType::D3D12) { ib_.reset(); vertexInputState_.reset(); shaderStages_.reset(); framebuffer_.reset(); offscreenTexture_.reset(); cmdBuf_.reset(); cmdQueue_.reset(); iglDev_.reset(); } } // Set up common resources. This will create a device and a command queue void SetUp() override { // Turn off debug break so unit tests can run igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); // Create an offscreen texture to render to const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, OFFSCREEN_RT_WIDTH, OFFSCREEN_RT_HEIGHT, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); Result ret; offscreenTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(offscreenTexture_ != nullptr); // Create framebuffer using the offscreen texture FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = offscreenTexture_; framebuffer_ = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(framebuffer_ != nullptr); // Initialize render pass descriptor renderPass_.colorAttachments.resize(1); renderPass_.colorAttachments[0].loadAction = LoadAction::Clear; renderPass_.colorAttachments[0].storeAction = StoreAction::Store; renderPass_.colorAttachments[0].clearColor = {0.0, 0.0, 0.0, 1.0}; // Initialize shader stages std::unique_ptr stages; igl::tests::util::createSimpleShaderStages(iglDev_, stages); shaderStages_ = std::move(stages); // Initialize input to vertex shader VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Float4; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].bufferIndex = data::shader::kSimplePosIndex; inputDesc.attributes[0].name = data::shader::kSimplePos; inputDesc.attributes[0].location = 0; inputDesc.inputBindings[0].stride = sizeof(float) * 4; inputDesc.attributes[1].format = VertexAttributeFormat::Float2; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].bufferIndex = data::shader::kSimpleUvIndex; inputDesc.attributes[1].name = data::shader::kSimpleUv; inputDesc.attributes[1].location = 1; inputDesc.inputBindings[1].stride = sizeof(float) * 2; // numAttributes has to equal to bindings when using more than 1 buffer inputDesc.numAttributes = inputDesc.numInputBindings = 2; vertexInputState_ = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(vertexInputState_ != nullptr); // Initialize index buffer BufferDesc bufDesc; bufDesc.type = BufferDesc::BufferTypeBits::Index; bufDesc.data = data::vertex_index::kQuadInd.data(); bufDesc.length = sizeof(data::vertex_index::kQuadInd); ib_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(ib_ != nullptr); // Initialize Render Pipeline Descriptor, but leave the creation // to the individual tests in case further customization is required renderPipelineDesc_.vertexInputState = vertexInputState_; renderPipelineDesc_.shaderStages = shaderStages_; renderPipelineDesc_.targetDesc.colorAttachments.resize(1); renderPipelineDesc_.targetDesc.colorAttachments[0].textureFormat = offscreenTexture_->getFormat(); renderPipelineDesc_.cullMode = igl::CullMode::Disabled; } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; std::shared_ptr cmdBuf_; CommandBufferDesc cbDesc_ = {}; const std::string backend_ = IGL_BACKEND_TYPE; RenderPassDesc renderPass_; std::shared_ptr offscreenTexture_; std::shared_ptr framebuffer_; std::shared_ptr shaderStages_; std::shared_ptr vertexInputState_; std::shared_ptr ib_; RenderPipelineDesc renderPipelineDesc_; }; // // Last Draw Statics // // Check and make sure getDrawCount() is working properly. // TEST_F(DeviceTest, LastDrawStat) { Result ret; std::shared_ptr pipelineState; size_t drawCount = iglDev_->getCurrentDrawCount(); // Nothing has been drawn yet, so should be 0 ASSERT_EQ(drawCount, 0); // Do a dummy draw cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(cmdBuf_ != nullptr); pipelineState = iglDev_->createRenderPipeline(renderPipelineDesc_, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(pipelineState != nullptr); renderPass_.colorAttachments[0].clearColor = {0, 0, 0, 0}; auto cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, framebuffer_); cmds->bindRenderPipelineState(pipelineState); cmds->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmds->drawIndexed(0); // draw 0 indices cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); // Check draw count again drawCount = iglDev_->getCurrentDrawCount(); // After the dummy draw, this should be 1 ASSERT_EQ(drawCount, 1); } // // In Development Feature API Test // // Make sure what flags have the right defaults, and setter and getter work. // TEST_F(DeviceTest, InDevelopmentFeature) { // Set a flag iglDev_->setDevelopmentFlags(igl::InDevelopementFeatures::DummyFeatureExample, true); ASSERT_TRUE(iglDev_->testDevelopmentFlags(igl::InDevelopementFeatures::DummyFeatureExample) != 0); // Reset the flag iglDev_->setDevelopmentFlags(igl::InDevelopementFeatures::DummyFeatureExample, false); ASSERT_TRUE(iglDev_->testDevelopmentFlags(igl::InDevelopementFeatures::DummyFeatureExample) == 0); } // // Get Backend Type // // Make sure IDevice->getBackendType() only returns expected values // TEST_F(DeviceTest, GetBackendType) { if (iglDev_->getBackendType() == igl::BackendType::Metal) { ASSERT_EQ(backend_, util::kBackendMtl); } else if (iglDev_->getBackendType() == igl::BackendType::OpenGL) { ASSERT_EQ(backend_, util::kBackendOgl); } else if (iglDev_->getBackendType() == igl::BackendType::Vulkan) { ASSERT_EQ(backend_, util::kBackendVul); } else if (iglDev_->getBackendType() == igl::BackendType::D3D12) { ASSERT_EQ(backend_, util::kBackendD3D12); } else { ASSERT_TRUE(0); } } } // namespace igl::tests ================================================ FILE: src/igl/tests/DeviceFeatureSet.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "util/Common.h" #if IGL_BACKEND_OPENGL #include #include #endif // IGL_BACKEND_OPENGL #include namespace igl::tests { // DeviceFeatureSetTest // This test exercises the igl::ICapabilities API. class DeviceFeatureSetTest : public ::testing::Test { public: DeviceFeatureSetTest() = default; ~DeviceFeatureSetTest() override = default; // Set up common resources. This will create a device and a command queue void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; }; // // hasFeature // // Check DeviceFeatureSet hasFeature list // TEST_F(DeviceFeatureSetTest, hasFeatureForMacOSOrWinOrAndroidTest) { EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::StandardDerivative)); const bool backendOpenGL = iglDev_->getBackendType() == igl::BackendType::OpenGL; if (backendOpenGL) { #if IGL_BACKEND_OPENGL auto& context = iglDev_->getPlatformDevice()->getContext(); const bool usesOpenGLES = igl::opengl::DeviceFeatureSet::usesOpenGLES(); const auto& deviceFeatures = context.deviceFeatures(); auto glVersion = deviceFeatures.getGLVersion(); const bool readWriteFramebuffer = glVersion >= igl::opengl::GLVersion::v3_0_ES || deviceFeatures.isSupported("GL_ARB_framebuffer_object") || deviceFeatures.isSupported("GL_APPLE_framebuffer_multisample"); EXPECT_EQ(iglDev_->hasFeature(DeviceFeatures::ReadWriteFramebuffer), readWriteFramebuffer); const bool texture2DArray = (usesOpenGLES ? glVersion >= igl::opengl::GLVersion::v3_0_ES : (glVersion >= igl::opengl::GLVersion::v3_0 || deviceFeatures.isSupported("GL_EXT_texture_array"))); EXPECT_EQ(iglDev_->hasFeature(DeviceFeatures::Texture2DArray), texture2DArray); const bool texture3D = (usesOpenGLES ? glVersion >= igl::opengl::GLVersion::v3_0_ES : glVersion >= igl::opengl::GLVersion::v2_0) || deviceFeatures.isSupported("GL_OES_texture_3D"); EXPECT_EQ(iglDev_->hasFeature(DeviceFeatures::Texture3D), texture3D); const bool textureArrayExt = !usesOpenGLES && (deviceFeatures.isSupported("GL_EXT_texture_array") || deviceFeatures.isSupported("GL_EXT_gpu_shader4")); EXPECT_EQ(iglDev_->hasFeature(DeviceFeatures::TextureArrayExt), textureArrayExt); const bool textureExternalImage = usesOpenGLES && (glVersion >= igl::opengl::GLVersion::v3_0_ES || deviceFeatures.isSupported("GL_OES_EGL_image_external_essl3") || deviceFeatures.isSupported("GL_OES_EGL_image_external")); EXPECT_EQ(iglDev_->hasFeature(DeviceFeatures::TextureExternalImage), textureExternalImage); const bool textureNotPot = (!usesOpenGLES || glVersion >= igl::opengl::GLVersion::v3_0_ES) || deviceFeatures.isSupported("GL_OES_texture_npot"); EXPECT_EQ(iglDev_->hasFeature(DeviceFeatures::TextureNotPot), textureNotPot); const bool multiView = deviceFeatures.isSupported("GL_OVR_multiview2") && (usesOpenGLES ? glVersion >= igl::opengl::GLVersion::v3_0_ES : glVersion >= igl::opengl::GLVersion::v3_0); EXPECT_EQ(iglDev_->hasFeature(DeviceFeatures::Multiview), multiView); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::BindUniform)); const bool texturePartialMipChain = !usesOpenGLES || glVersion >= igl::opengl::GLVersion::v3_0_ES || deviceFeatures.isSupported("GL_APPLE_texture_max_level"); EXPECT_EQ(iglDev_->hasFeature(DeviceFeatures::TexturePartialMipChain), texturePartialMipChain); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::BufferRing)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::BufferNoCopy)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::ShaderLibrary)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::BindBytes)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::BufferDeviceAddress)); const bool shaderTextureLod = iglDev_->hasFeature(DeviceFeatures::ShaderTextureLodExt) || (usesOpenGLES ? glVersion >= igl::opengl::GLVersion::v3_0_ES : glVersion >= igl::opengl::GLVersion::v3_0); EXPECT_EQ(iglDev_->hasFeature(DeviceFeatures::ShaderTextureLod), shaderTextureLod); const bool shaderTextureLodExt = usesOpenGLES ? deviceFeatures.isSupported("GL_EXT_shader_texture_lod") : deviceFeatures.isSupported("GL_ARB_shader_texture_lod"); EXPECT_EQ(iglDev_->hasFeature(DeviceFeatures::ShaderTextureLodExt), shaderTextureLodExt); const bool standardDerivativeExt = usesOpenGLES && deviceFeatures.isSupported("GL_OES_standard_derivatives"); EXPECT_EQ(iglDev_->hasFeature(DeviceFeatures::StandardDerivativeExt), standardDerivativeExt); const bool supportsSRGB = (usesOpenGLES ? (glVersion >= igl::opengl::GLVersion::v3_0_ES || deviceFeatures.isSupported("GL_EXT_sRGB")) : glVersion >= igl::opengl::GLVersion::v2_1 || deviceFeatures.isSupported("GL_EXT_texture_sRGB")); EXPECT_EQ(iglDev_->hasFeature(DeviceFeatures::SRGB), supportsSRGB); const bool hasEGLsRGBSupport = context.eglSupportssRGB(); EXPECT_EQ(iglDev_->hasFeature(DeviceFeatures::SRGBSwapchain), hasEGLsRGBSupport); const bool supportsSRGBWriteControl = usesOpenGLES ? deviceFeatures.isSupported("GL_EXT_sRGB_write_control") : glVersion >= igl::opengl::GLVersion::v3_0 || deviceFeatures.isSupported("GL_ARB_framebuffer_sRGB") || deviceFeatures.isSupported("GL_EXT_framebuffer_sRGB"); EXPECT_EQ(iglDev_->hasFeature(DeviceFeatures::SRGBWriteControl), supportsSRGBWriteControl); const bool samplerMinMaxLod = !usesOpenGLES || glVersion >= igl::opengl::GLVersion::v3_0_ES; EXPECT_EQ(iglDev_->hasFeature(DeviceFeatures::SamplerMinMaxLod), samplerMinMaxLod); const bool drawIndexedIndirect = (usesOpenGLES && glVersion >= igl::opengl::GLVersion::v3_1_ES) || (!usesOpenGLES && glVersion >= igl::opengl::GLVersion::v4_0) || deviceFeatures.isSupported("GL_ARB_draw_indirect"); EXPECT_EQ(iglDev_->hasFeature(DeviceFeatures::DrawIndexedIndirect), drawIndexedIndirect); const bool multipleRenderTargets = !usesOpenGLES || glVersion >= igl::opengl::GLVersion::v3_0_ES || deviceFeatures.isSupported("GL_EXT_draw_buffers"); EXPECT_EQ(iglDev_->hasFeature(DeviceFeatures::MultipleRenderTargets), multipleRenderTargets); const bool explicitBinding = (usesOpenGLES && glVersion >= igl::opengl::GLVersion::v3_1_ES) || (!usesOpenGLES && (glVersion >= igl::opengl::GLVersion::v4_2 || deviceFeatures.isSupported("GL_ARB_shading_language_420pack"))); EXPECT_EQ(iglDev_->hasFeature(DeviceFeatures::ExplicitBinding), explicitBinding); const bool explicitBindingExt = deviceFeatures.isSupported("GL_ARB_shading_language_420pack"); EXPECT_EQ(iglDev_->hasFeature(DeviceFeatures::ExplicitBindingExt), explicitBindingExt); const bool textureFormatRG = (usesOpenGLES && (glVersion >= igl::opengl::GLVersion::v3_0_ES || deviceFeatures.isSupported("GL_EXT_texture_rg"))) || (!usesOpenGLES && (glVersion >= igl::opengl::GLVersion::v3_0 || deviceFeatures.isSupported("GL_ARB_texture_rg"))); EXPECT_EQ(iglDev_->hasFeature(DeviceFeatures::TextureFormatRG), textureFormatRG); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::ValidationLayersEnabled)); const bool externalMemoryObjects = deviceFeatures.isSupported("GL_EXT_memory_object") && deviceFeatures.isSupported("GL_EXT_memory_object_fd"); EXPECT_EQ(iglDev_->hasFeature(DeviceFeatures::ExternalMemoryObjects), externalMemoryObjects); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::PushConstants)); #endif // IGL_BACKEND_OPENGL } else { // non OpenGL backends EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::ReadWriteFramebuffer)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::TextureNotPot)); EXPECT_EQ(iglDev_->hasFeature(DeviceFeatures::SRGB), true); EXPECT_EQ(iglDev_->hasFeature(DeviceFeatures::SRGBSwapchain), true); EXPECT_EQ(iglDev_->hasFeature(DeviceFeatures::SRGBWriteControl), false); if (iglDev_->getBackendType() == igl::BackendType::Vulkan) { EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::Texture2DArray)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::Texture3D)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::TextureArrayExt)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::TextureExternalImage)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::Multiview)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::BindUniform)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::TexturePartialMipChain)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::BufferRing)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::BufferNoCopy)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::ShaderLibrary)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::BindBytes)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::BufferDeviceAddress)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::ShaderTextureLod)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::ShaderTextureLodExt)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::StandardDerivativeExt)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::SamplerMinMaxLod)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::DrawIndexedIndirect)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::MultipleRenderTargets)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::ExplicitBinding)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::ExplicitBindingExt)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::TextureFormatRG)); // On Android Validation Layers are only enabled for debug builds by default #if (IGL_PLATFORM_ANDROID && !IGL_DEBUG) || !IGL_DEBUG || defined(IGL_DISABLE_VALIDATION) EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::ValidationLayersEnabled)); #else EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::ValidationLayersEnabled)); #endif // IGL_PLATFORM_ANDROID EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::ExternalMemoryObjects)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::PushConstants)); } else if (iglDev_->getBackendType() == igl::BackendType::Metal) { EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::Texture2DArray)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::Texture3D)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::TextureArrayExt)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::TextureExternalImage)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::Multiview)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::BindUniform)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::TexturePartialMipChain)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::BufferRing)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::BufferNoCopy)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::ShaderLibrary)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::BindBytes)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::BufferDeviceAddress)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::ShaderTextureLod)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::ShaderTextureLodExt)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::StandardDerivativeExt)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::SamplerMinMaxLod)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::DrawIndexedIndirect)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::MultipleRenderTargets)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::ExplicitBinding)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::ExplicitBindingExt)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::TextureFormatRG)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::ValidationLayersEnabled)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::ExternalMemoryObjects)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::PushConstants)); } else if (iglDev_->getBackendType() == igl::BackendType::D3D12) { // D3D12 backend EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::Texture2DArray)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::Texture3D)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::TextureArrayExt)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::TextureExternalImage)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::Multiview)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::BindUniform)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::TexturePartialMipChain)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::BufferRing)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::BufferNoCopy)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::ShaderLibrary)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::BindBytes)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::BufferDeviceAddress)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::ShaderTextureLod)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::ShaderTextureLodExt)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::StandardDerivativeExt)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::SamplerMinMaxLod)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::DrawIndexedIndirect)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::MultipleRenderTargets)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::ExplicitBinding)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::ExplicitBindingExt)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::TextureFormatRG)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::ValidationLayersEnabled)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::ExternalMemoryObjects)); EXPECT_TRUE(iglDev_->hasFeature( DeviceFeatures::PushConstants)); // D3D12 supports push constants via root constants // (shader register b2) } else { EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::Texture2DArray)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::Texture3D)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::TextureArrayExt)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::TextureExternalImage)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::Multiview)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::BindUniform)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::TexturePartialMipChain)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::BufferRing)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::BufferNoCopy)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::ShaderLibrary)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::BindBytes)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::BufferDeviceAddress)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::ShaderTextureLod)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::ShaderTextureLodExt)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::StandardDerivativeExt)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::SamplerMinMaxLod)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::DrawIndexedIndirect)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::MultipleRenderTargets)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::ExplicitBinding)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::ExplicitBindingExt)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::TextureFormatRG)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::ValidationLayersEnabled)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::ExternalMemoryObjects)); EXPECT_FALSE(iglDev_->hasFeature(DeviceFeatures::PushConstants)); } } EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::TextureHalfFloat)); EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::TextureFloat)); } // // getTextureFormatCapabilities // // Since some of the formats may be platform-dependent, we will only spot // check a few to make sure the API is working. We should continue to add formats // here as we see fit. // TEST_F(DeviceFeatureSetTest, getTextureFormatCapabilities) { ICapabilities::TextureFormatCapabilities capability = 0; // RGBA_UNorm8 should be able to do everything except SampledAttachment on all the platforms capability = iglDev_->getTextureFormatCapabilities(TextureFormat::RGBA_UNorm8); EXPECT_TRUE(contains(capability, ICapabilities::TextureFormatCapabilityBits::Sampled)); EXPECT_TRUE(contains(capability, ICapabilities::TextureFormatCapabilityBits::Attachment)); EXPECT_TRUE(contains(capability, ICapabilities::TextureFormatCapabilityBits::SampledFiltered)); if (iglDev_->hasFeature(DeviceFeatures::Compute)) { EXPECT_TRUE(contains(capability, ICapabilities::TextureFormatCapabilityBits::Storage)); } // Z_UNorm16 should always be readable by a shader capability = iglDev_->getTextureFormatCapabilities(TextureFormat::Z_UNorm16); EXPECT_TRUE(contains(capability, ICapabilities::TextureFormatCapabilityBits::Sampled)); } } // namespace igl::tests ================================================ FILE: src/igl/tests/Framebuffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "data/ShaderData.h" #include "data/VertexIndexData.h" #include "util/Common.h" #if IGL_BACKEND_OPENGL #include #include #endif // #IGL_BACKEND_OPENGL #include #include #include #include #include #include namespace igl::tests { // Use a 1x1 Framebuffer for this test constexpr size_t kOffscreenRtWidth = 1; constexpr size_t kOffscreenRtHeight = 1; // // FramebufferTest // // Test fixture for all the tests in this file. Takes care of common // initialization and allocating of common resources. // class FramebufferTest : public ::testing::Test { private: public: FramebufferTest() = default; ~FramebufferTest() override = default; // // SetUp() // // This function sets up a render pass and a render pipeline descriptor // so it is ready to render a simple quad with an input texture to an // offscreen texture. // // The actual creation of the render pipeline state object is left // to each test so that tests can replace the default settings with // something more appropriate. // void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_TRUE(iglDev_ != nullptr); ASSERT_TRUE(cmdQueue_ != nullptr); // Create an offscreen texture to render to const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kOffscreenRtWidth, kOffscreenRtHeight, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); auto depthFormat = TextureFormat::S8_UInt_Z32_UNorm; if (backend_ == util::kBackendVul) { depthFormat = TextureFormat::S8_UInt_Z24_UNorm; } TextureDesc depthTexDesc = TextureDesc::new2D(depthFormat, kOffscreenRtWidth, kOffscreenRtHeight, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); depthTexDesc.storage = ResourceStorage::Private; Result ret; offscreenTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(offscreenTexture_ != nullptr); depthStencilTexture_ = iglDev_->createTexture(depthTexDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(depthStencilTexture_ != nullptr); // Create framebuffer using the offscreen texture FramebufferDesc framebufferDesc; framebufferDesc.debugName = "test"; framebufferDesc.colorAttachments[0].texture = offscreenTexture_; framebufferDesc.depthAttachment.texture = depthStencilTexture_; framebufferDesc.stencilAttachment.texture = depthStencilTexture_; framebuffer_ = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(framebuffer_ != nullptr); // Initialize render pass descriptor renderPass_.colorAttachments.resize(1); renderPass_.colorAttachments[0].loadAction = LoadAction::Clear; renderPass_.colorAttachments[0].storeAction = StoreAction::Store; renderPass_.colorAttachments[0].clearColor = {0.0, 0.0, 0.0, 1.0}; renderPass_.depthAttachment.loadAction = LoadAction::Clear; renderPass_.depthAttachment.storeAction = StoreAction::Store; renderPass_.depthAttachment.clearDepth = 0.0; renderPass_.stencilAttachment.loadAction = LoadAction::Clear; renderPass_.stencilAttachment.storeAction = StoreAction::Store; renderPass_.stencilAttachment.clearStencil = 0; // Initialize shader stages std::unique_ptr stages; igl::tests::util::createSimpleShaderStages(iglDev_, stages); shaderStages_ = std::move(stages); // Initialize input to vertex shader VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Float4; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].bufferIndex = data::shader::kSimplePosIndex; inputDesc.attributes[0].name = data::shader::kSimplePos; inputDesc.attributes[0].location = 0; inputDesc.inputBindings[0].stride = sizeof(float) * 4; inputDesc.attributes[1].format = VertexAttributeFormat::Float2; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].bufferIndex = data::shader::kSimpleUvIndex; inputDesc.attributes[1].name = data::shader::kSimpleUv; inputDesc.attributes[1].location = 1; inputDesc.inputBindings[1].stride = sizeof(float) * 2; // numAttributes has to equal to bindings when using more than 1 buffer inputDesc.numAttributes = inputDesc.numInputBindings = 2; vertexInputState_ = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(vertexInputState_ != nullptr); // Initialize index buffer BufferDesc bufDesc; bufDesc.type = BufferDesc::BufferTypeBits::Index; bufDesc.data = data::vertex_index::kQuadInd.data(); bufDesc.length = sizeof(data::vertex_index::kQuadInd); ib_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(ib_ != nullptr); // Initialize vertex and sampler buffers bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data::vertex_index::kQuadVert.data(); bufDesc.length = sizeof(data::vertex_index::kQuadVert); vb_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(vb_ != nullptr); bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data::vertex_index::kQuadUv.data(); bufDesc.length = sizeof(data::vertex_index::kQuadUv); uv_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(uv_ != nullptr); // Initialize sampler state const SamplerStateDesc samplerDesc; samp_ = iglDev_->createSamplerState(samplerDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(samp_ != nullptr); // Initialize Render Pipeline Descriptor, but leave the creation // to the individual tests in case further customization is required renderPipelineDesc_.vertexInputState = vertexInputState_; renderPipelineDesc_.shaderStages = shaderStages_; renderPipelineDesc_.targetDesc.colorAttachments.resize(1); renderPipelineDesc_.targetDesc.colorAttachments[0].textureFormat = offscreenTexture_->getFormat(); renderPipelineDesc_.targetDesc.depthAttachmentFormat = depthStencilTexture_->getFormat(); renderPipelineDesc_.targetDesc.stencilAttachmentFormat = depthStencilTexture_->getFormat(); renderPipelineDesc_.cullMode = igl::CullMode::Disabled; // } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; std::shared_ptr cmdBuf_; CommandBufferDesc cbDesc_ = {}; const std::string backend_ = IGL_BACKEND_TYPE; RenderPassDesc renderPass_; std::shared_ptr offscreenTexture_; std::shared_ptr depthStencilTexture_; std::shared_ptr framebuffer_; std::shared_ptr shaderStages_; std::shared_ptr vertexInputState_; std::shared_ptr vb_, uv_, ib_; std::shared_ptr samp_; RenderPipelineDesc renderPipelineDesc_; }; // // Framebuffer Clear Test // // This test exercises the FB clearing behavior. The expectation is color // buffer will be cleared to the color specified, and there will be no // leaked settings from previous render passes // TEST_F(FramebufferTest, Clear) { Result ret; std::shared_ptr pipelineState; std::shared_ptr depthStencilState; DepthStencilStateDesc desc; desc.isDepthWriteEnabled = true; const auto rangeDesc = TextureRangeDesc::new2D(0, 0, kOffscreenRtWidth, kOffscreenRtHeight); //---------------- // Create Pipeline //---------------- pipelineState = iglDev_->createRenderPipeline(renderPipelineDesc_, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(pipelineState != nullptr); depthStencilState = iglDev_->createDepthStencilState(desc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(depthStencilState != nullptr); //--------------------------------- // Clear FB to {0.5, 0.5, 0.5, 0.5} //--------------------------------- cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(cmdBuf_ != nullptr); renderPass_.colorAttachments[0].clearColor = {0.501f, 0.501f, 0.501f, 0.501f}; renderPass_.depthAttachment.clearDepth = 0.501f; renderPass_.stencilAttachment.clearStencil = 128; auto cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, framebuffer_); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); cmdBuf_->waitUntilCompleted(); //---------------------- // Read back framebuffer //---------------------- auto pixels = std::vector(kOffscreenRtWidth * kOffscreenRtWidth); auto pixelsDepth = std::vector(kOffscreenRtWidth * kOffscreenRtWidth); auto pixelsStencil = std::vector(kOffscreenRtWidth * kOffscreenRtWidth); framebuffer_->copyBytesColorAttachment(*cmdQueue_, 0, pixels.data(), rangeDesc); ASSERT_EQ(pixels[0], 0x80808080); #if !IGL_PLATFORM_IOS_SIMULATOR // IOS Simulator has specific restrictions on depth/stencil formats. It has to // be created with ".private" storage mode. This means we can't read it back // and verify the contents. // https://developer.apple.com/documentation/metal/developing_metal_apps_that_run_in_simulator framebuffer_->copyBytesDepthAttachment(*cmdQueue_, pixelsDepth.data(), rangeDesc); // ASSERT_EQ(pixels_depth[0], 0x80808080); // TODO: copyBytesStencilAttachment is not functioning property under Metal/Vulkan // due to unimplemented blitting // Refer to igl/metal/Framebuffer.mm framebuffer_->copyBytesStencilAttachment(*cmdQueue_, pixelsStencil.data(), rangeDesc); // ASSERT_EQ(pixels_stencil[0], 0x80808080); #endif //------------------------------------------------------------------------- // Clear FB to {0, 0, 0, 0}, but this time bind a pipelineState, disable // the colorWriteMasks, and do a no-op draw //------------------------------------------------------------------------- cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(cmdBuf_ != nullptr); renderPipelineDesc_.targetDesc.colorAttachments[0].colorWriteMask = kColorWriteBitsDisabled; pipelineState = iglDev_->createRenderPipeline(renderPipelineDesc_, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(pipelineState != nullptr); renderPass_.colorAttachments[0].clearColor = {0, 0, 0, 0}; renderPass_.depthAttachment.clearDepth = 0.0; renderPass_.stencilAttachment.clearStencil = 0; cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, framebuffer_); cmds->bindRenderPipelineState(pipelineState); cmds->bindDepthStencilState(depthStencilState); cmds->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmds->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); cmds->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmds->drawIndexed(0); // draw 0 indices cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); cmdBuf_->waitUntilCompleted(); //---------------------- // Read back framebuffer //---------------------- pixels = std::vector(kOffscreenRtWidth * kOffscreenRtWidth); framebuffer_->copyBytesColorAttachment(*cmdQueue_, 0, pixels.data(), rangeDesc); ASSERT_EQ(pixels[0], 0); #if !IGL_PLATFORM_IOS_SIMULATOR // IOS Simulator has specific restrictions on depth/stencil formats. It has to // be created with ".private" storage mode. This means we can't read it back // and verify the contents. // https://developer.apple.com/documentation/metal/developing_metal_apps_that_run_in_simulator framebuffer_->copyBytesDepthAttachment(*cmdQueue_, pixelsDepth.data(), rangeDesc); // ASSERT_EQ(pixels_depth[0], 0); // TODO: copyBytesStencilAttachment is not functioning property under Metal/Vulkan // due to unimplemented blitting // Refer to igl/metal/Framebuffer.mm framebuffer_->copyBytesStencilAttachment(*cmdQueue_, pixelsStencil.data(), rangeDesc); // ASSERT_EQ(pixels_stencil[0], 0); #endif //------------------------------------------------------------------------- // Clear FB to {0.5, 0.5, 0.5, 0.5} again. We should not be impacted by the // colorWriteMask setting from the render pass above //------------------------------------------------------------------------- cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(cmdBuf_ != nullptr); renderPass_.colorAttachments[0].clearColor = {0.501f, 0.501f, 0.501f, 0.501f}; cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, framebuffer_); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); cmdBuf_->waitUntilCompleted(); //---------------------- // Read back framebuffer //---------------------- pixels = std::vector(kOffscreenRtWidth * kOffscreenRtWidth); framebuffer_->copyBytesColorAttachment(*cmdQueue_, 0, pixels.data(), rangeDesc); ASSERT_EQ(pixels[0], 0x80808080); } // // Framebuffer Blit Test // // This test exercises OGL platform device's blitFramebufferColor API. // We are including this here rather than making it OGL-specific to also test // the device's getPlatformDevice() function, which should return nullptr // on Metal // #if IGL_BACKEND_OPENGL TEST_F(FramebufferTest, blitFramebufferColor) { auto* platformDevice = iglDev_->getPlatformDevice(); if (platformDevice) { ASSERT_TRUE(backend_ == util::kBackendOgl); /* Bootcamper: Your Code here * At the high level here are the steps: * 1. Create second IFramebuffer, call it framebuffer2 look at set up to * see how to do this: * a. create another texture * b. attach it to a FB descriptor * c. create the framebuffer object * 2. clear framebuffer_, and make sure it is cleared. See the Clear test * above to see how to do this * 3. clear framebuffer2 to a different color than framebuffer_, and make * sure it is cleared * 4. call platforDevice->blitFramebufferColor() from framebuffer2 to * framebuffer_ * 5. Verify that framebuffer_ now has the same color as framebuffer2 */ Result ret; //----------------------------------------- // Create an offscreen texture to render to //----------------------------------------- const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kOffscreenRtWidth, kOffscreenRtHeight, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); const std::shared_ptr offscreenTexture2 = iglDev_->createTexture(texDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(offscreenTexture2 != nullptr); //------------------------------------------------------------- // Create second IFramebuffer framebuffer2 by offscreenTexture2 //------------------------------------------------------------- FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = offscreenTexture2; const std::shared_ptr framebuffer2 = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(framebuffer2 != nullptr); //--------------------------------- // Clear FB to {0.5, 0.5, 0.5, 0.5} //--------------------------------- const auto rangeDesc = TextureRangeDesc::new2D(0, 0, kOffscreenRtWidth, kOffscreenRtHeight); cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(cmdBuf_ != nullptr); renderPass_.colorAttachments[0].clearColor = {0.501f, 0.501f, 0.501f, 0.501f}; auto cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, framebuffer_); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); cmdBuf_->waitUntilCompleted(); //---------------------- // Read back framebuffer //---------------------- auto pixels = std::vector(kOffscreenRtWidth * kOffscreenRtWidth); framebuffer_->copyBytesColorAttachment(*cmdQueue_, 0, pixels.data(), rangeDesc); ASSERT_EQ(pixels[0], 0x80808080); //------------------------------------------------------------------------- // Clear FB2 to {0, 0, 0, 0} //------------------------------------------------------------------------- cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(cmdBuf_ != nullptr); renderPass_.colorAttachments[0].clearColor = {0, 0, 0, 0}; cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, framebuffer2); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); cmdBuf_->waitUntilCompleted(); //----------------------- // Read back framebuffer2 //----------------------- auto pixels2 = std::vector(kOffscreenRtWidth * kOffscreenRtWidth); framebuffer2->copyBytesColorAttachment(*cmdQueue_, 0, pixels2.data(), rangeDesc); ASSERT_EQ(pixels2[0], 0); if (platformDevice->getContext().deviceFeatures().hasInternalFeature( opengl::InternalFeatures::FramebufferBlit)) { //-------------------------------------------------------------- // Call blitFramebuffer() from framebuffer_ to framebuffer2 //-------------------------------------------------------------- platformDevice->blitFramebuffer(framebuffer_, 0, 0, kOffscreenRtWidth, kOffscreenRtWidth, framebuffer2, 0, 0, kOffscreenRtWidth, kOffscreenRtWidth, GL_COLOR_BUFFER_BIT, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); //------------------------------------------------------------- // Read back framebuffer_ & framebuffer2, and examine if equal. //------------------------------------------------------------- framebuffer_->copyBytesColorAttachment(*cmdQueue_, 0, pixels.data(), rangeDesc); framebuffer2->copyBytesColorAttachment(*cmdQueue_, 0, pixels2.data(), rangeDesc); ASSERT_EQ(pixels[0], pixels2[0]); ASSERT_EQ(pixels2[0], 0x80808080); } } else { ASSERT_TRUE(backend_ != util::kBackendOgl); } } #endif // IGL_BACKEND_OPENGL // // Framebuffer Drawable Unbind Test // // This test checks that when updateDrawable is called with nullptr, the // color attachment is no longer bound. It also checks that draw counts // are properly updated when unbind and rebinding a drawable // TEST_F(FramebufferTest, DrawableUnbind) { // Currently the drawable is always bound to index 0 auto colorAttachment = framebuffer_->getColorAttachment(0); auto numOfAttachments = framebuffer_->getColorAttachmentIndices().size(); auto depthAttachment = framebuffer_->getDepthAttachment(); auto stencilAttachment = framebuffer_->getStencilAttachment(); ASSERT_TRUE(colorAttachment != nullptr); ASSERT_EQ(numOfAttachments, 1); ASSERT_TRUE(depthAttachment != nullptr); ASSERT_TRUE(stencilAttachment != nullptr); framebuffer_->updateDrawable(nullptr); numOfAttachments = framebuffer_->getColorAttachmentIndices().size(); ASSERT_TRUE(framebuffer_->getColorAttachment(0) == nullptr); ASSERT_EQ(numOfAttachments, 0); // Restore framebuffer_ to its original state framebuffer_->updateDrawable(colorAttachment); numOfAttachments = framebuffer_->getColorAttachmentIndices().size(); ASSERT_EQ(numOfAttachments, 1); } // // Framebuffer Drawable Bind Count Test // // This test checks that when updateDrawable is called repeatedly with // the same texture, the number of attachment stays the same. // TEST_F(FramebufferTest, DrawableBindCount) { // Currently the drawable is always bound to index 0 auto colorAttachment = framebuffer_->getColorAttachment(0); auto numOfAttachments = framebuffer_->getColorAttachmentIndices().size(); ASSERT_TRUE(colorAttachment != nullptr); ASSERT_EQ(numOfAttachments, 1); // Rebind the same texture, numAttachment should not change framebuffer_->updateDrawable(colorAttachment); framebuffer_->updateDrawable(colorAttachment); framebuffer_->updateDrawable(colorAttachment); numOfAttachments = framebuffer_->getColorAttachmentIndices().size(); ASSERT_EQ(numOfAttachments, 1); // Create another texture const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kOffscreenRtWidth, kOffscreenRtHeight, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); Result ret; auto newTex = iglDev_->createTexture(texDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(newTex != nullptr); // Updating one texture for another, numAttachment should not change framebuffer_->updateDrawable(newTex); numOfAttachments = framebuffer_->getColorAttachmentIndices().size(); ASSERT_EQ(numOfAttachments, 1); // Restore framebuffer_ to its original state framebuffer_->updateDrawable(colorAttachment); numOfAttachments = framebuffer_->getColorAttachmentIndices().size(); ASSERT_EQ(numOfAttachments, 1); } // // Framebuffer Update Drawable Test With Depth And Stencil Attachment // // This test checks that updateDrawable can be called to bind and unbind depth and stencil // attachments. // TEST_F(FramebufferTest, UpdateDrawableWithDepthAndStencilTest) { // Currently the drawable is always bound to index 0 auto colorAttachment = framebuffer_->getColorAttachment(0); auto depthAttachment = framebuffer_->getDepthAttachment(); auto stencilAttachment = framebuffer_->getStencilAttachment(); ASSERT_EQ(framebuffer_->getColorAttachment(0), colorAttachment); ASSERT_EQ(framebuffer_->getDepthAttachment(), depthAttachment); ASSERT_EQ(framebuffer_->getStencilAttachment(), stencilAttachment); framebuffer_->updateDrawable(nullptr); ASSERT_EQ(framebuffer_->getColorAttachment(0), nullptr); ASSERT_EQ(framebuffer_->getDepthAttachment(), depthAttachment); ASSERT_EQ(framebuffer_->getStencilAttachment(), stencilAttachment); framebuffer_->updateDrawable(colorAttachment); ASSERT_EQ(framebuffer_->getColorAttachment(0), colorAttachment); ASSERT_EQ(framebuffer_->getDepthAttachment(), depthAttachment); ASSERT_EQ(framebuffer_->getStencilAttachment(), stencilAttachment); framebuffer_->updateDrawable(SurfaceTextures{.color = colorAttachment, .depth = nullptr}); ASSERT_EQ(framebuffer_->getColorAttachment(0), colorAttachment); ASSERT_EQ(framebuffer_->getDepthAttachment(), nullptr); ASSERT_EQ(framebuffer_->getStencilAttachment(), nullptr); framebuffer_->updateDrawable(SurfaceTextures{.color = colorAttachment, .depth = depthAttachment}); ASSERT_EQ(framebuffer_->getColorAttachment(0), colorAttachment); ASSERT_EQ(framebuffer_->getDepthAttachment(), depthAttachment); ASSERT_EQ(framebuffer_->getStencilAttachment(), stencilAttachment); framebuffer_->updateDrawable(SurfaceTextures{.color = nullptr, .depth = nullptr}); ASSERT_EQ(framebuffer_->getColorAttachment(0), nullptr); ASSERT_EQ(framebuffer_->getDepthAttachment(), nullptr); ASSERT_EQ(framebuffer_->getStencilAttachment(), nullptr); framebuffer_->updateDrawable(SurfaceTextures{.color = colorAttachment, .depth = depthAttachment}); ASSERT_EQ(framebuffer_->getColorAttachment(0), colorAttachment); ASSERT_EQ(framebuffer_->getDepthAttachment(), depthAttachment); ASSERT_EQ(framebuffer_->getStencilAttachment(), stencilAttachment); } TEST_F(FramebufferTest, GetColorAttachmentTest) { const bool backendOpenGL = iglDev_->getBackendType() == igl::BackendType::OpenGL; if (backendOpenGL) { #if IGL_BACKEND_OPENGL if (!iglDev_->getPlatformDevice() ->getContext() .deviceFeatures() .hasInternalFeature(opengl::InternalFeatures::PackRowLength)) { GTEST_SKIP() << "Framebuffer PackRowLength is not supported"; } #endif } // Create a texture to be used as color attachment const int textureWidth = 3; const int textureHeight = 2; const int channelCount = 4; const int channelSize = sizeof(uint8_t); const int textureElementPerRow = textureWidth * channelCount; const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, textureWidth, textureHeight, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); Result ret; auto outputTexture = iglDev_->createTexture(texDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(outputTexture != nullptr); // Create framebuffer using the texture FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = outputTexture; framebuffer_ = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(framebuffer_ != nullptr); //---------------- // Create Pipeline //---------------- cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(cmdBuf_ != nullptr); renderPass_.colorAttachments[0].clearColor = {0.501f, 0.501f, 0.501f, 0.501f}; auto cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, framebuffer_); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); cmdBuf_->waitUntilCompleted(); //---------------------- // Read back framebuffer //---------------------- const int outputImageWidth = textureWidth + 2; const int outputImageHeight = textureHeight; const int outputElementPerRow = outputImageWidth * channelCount; auto pixels = std::vector(static_cast(outputElementPerRow * textureHeight), 0); const auto rangeDesc = igl::TextureRangeDesc::new2D(0, 0, textureWidth, textureHeight); framebuffer_->copyBytesColorAttachment(*cmdQueue_, 0, pixels.data(), rangeDesc, static_cast(outputElementPerRow * channelSize)); for (int i = 0; i < outputImageHeight; i++) { for (int j = 0; j < outputElementPerRow; j++) { if (j < textureElementPerRow) { EXPECT_EQ(pixels[i * outputElementPerRow + j], 128); } else { EXPECT_EQ(pixels[i * outputElementPerRow + j], 0); } } } } } // namespace igl::tests ================================================ FILE: src/igl/tests/FramebufferInterop.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "util/Common.h" #include #include #include #include #include #include #include namespace igl::tests { class FramebufferInteropTest : public ::testing::Test { public: FramebufferInteropTest() = default; ~FramebufferInteropTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(device_, cmdQueue_); ASSERT_TRUE(device_ != nullptr); ASSERT_TRUE(cmdQueue_ != nullptr); } void TearDown() override {} protected: std::shared_ptr device_; std::shared_ptr cmdQueue_; const std::string backend_ = IGL_BACKEND_TYPE; }; TEST_F(FramebufferInteropTest, GetColorAttachment) { base::AttachmentInteropDesc colorDesc{ .width = 512, .height = 512, .depth = 1, .numLayers = 1, .numSamples = 1, .numMipLevels = 1, .type = base::TextureType::TwoD, .format = base::TextureFormat::RGBA_SRGB, .isSampled = true, }; base::FramebufferInteropDesc fbDesc{}; fbDesc.colorAttachments[0] = &colorDesc; std::unique_ptr fbInterop(device_->createFramebufferInterop(fbDesc)); ASSERT_NE(fbInterop, nullptr); auto* colorAttachment = fbInterop->getColorAttachment(0); ASSERT_NE(colorAttachment, nullptr); // Verify attachment properties via getDesc() const auto& desc = colorAttachment->getDesc(); EXPECT_EQ(desc.width, 512u); EXPECT_EQ(desc.height, 512u); EXPECT_EQ(desc.format, base::TextureFormat::RGBA_SRGB); } TEST_F(FramebufferInteropTest, GetDepthAttachment) { base::AttachmentInteropDesc colorDesc{ .width = 256, .height = 256, .depth = 1, .numLayers = 1, .numSamples = 1, .numMipLevels = 1, .type = base::TextureType::TwoD, .format = base::TextureFormat::RGBA_SRGB, .isSampled = true, }; // Use S8_UInt_Z32_UNorm for cross-backend compatibility (Metal remaps Z_UNorm24 to Z_UNorm32) auto depthFormat = base::TextureFormat::S8_UInt_Z32_UNorm; if (backend_ == util::kBackendVul) { depthFormat = base::TextureFormat::S8_UInt_Z24_UNorm; } base::AttachmentInteropDesc depthDesc{ .width = 256, .height = 256, .depth = 1, .numLayers = 1, .numSamples = 1, .numMipLevels = 1, .type = base::TextureType::TwoD, .format = depthFormat, .isSampled = false, }; base::FramebufferInteropDesc fbDesc{}; fbDesc.colorAttachments[0] = &colorDesc; fbDesc.depthAttachment = &depthDesc; std::unique_ptr fbInterop(device_->createFramebufferInterop(fbDesc)); ASSERT_NE(fbInterop, nullptr); auto* depthAttachment = fbInterop->getDepthAttachment(); ASSERT_NE(depthAttachment, nullptr); const auto& desc = depthAttachment->getDesc(); EXPECT_EQ(desc.width, 256u); EXPECT_EQ(desc.height, 256u); EXPECT_EQ(desc.format, depthFormat); } TEST_F(FramebufferInteropTest, GetNativeFramebuffer) { base::AttachmentInteropDesc colorDesc{ .width = 256, .height = 256, .depth = 1, .numLayers = 1, .numSamples = 1, .numMipLevels = 1, .type = base::TextureType::TwoD, .format = base::TextureFormat::RGBA_SRGB, .isSampled = true, }; base::FramebufferInteropDesc fbDesc{}; fbDesc.colorAttachments[0] = &colorDesc; std::unique_ptr fbInterop(device_->createFramebufferInterop(fbDesc)); ASSERT_NE(fbInterop, nullptr); void* nativeFb = fbInterop->getNativeFramebuffer(); (void)nativeFb; } TEST_F(FramebufferInteropTest, AttachmentGetNativeImage) { base::AttachmentInteropDesc colorDesc{ .width = 256, .height = 256, .depth = 1, .numLayers = 1, .numSamples = 1, .numMipLevels = 1, .type = base::TextureType::TwoD, .format = base::TextureFormat::RGBA_SRGB, .isSampled = true, }; base::FramebufferInteropDesc fbDesc{}; fbDesc.colorAttachments[0] = &colorDesc; std::unique_ptr fbInterop(device_->createFramebufferInterop(fbDesc)); ASSERT_NE(fbInterop, nullptr); auto* colorAttachment = fbInterop->getColorAttachment(0); ASSERT_NE(colorAttachment, nullptr); // For some backends it may be not possible to get native image if (device_->getBackendType() != igl::BackendType::OpenGL) { void* nativeImage = colorAttachment->getNativeImage(); EXPECT_NE(nativeImage, nullptr); } } TEST_F(FramebufferInteropTest, AttachmentDescProperties) { base::AttachmentInteropDesc colorDesc{ .width = 320, .height = 240, .depth = 1, .numLayers = 1, .numSamples = 1, .numMipLevels = 1, .type = base::TextureType::TwoD, .format = base::TextureFormat::RGBA_UNorm8, .isSampled = true, }; base::FramebufferInteropDesc fbDesc{}; fbDesc.colorAttachments[0] = &colorDesc; std::unique_ptr fbInterop(device_->createFramebufferInterop(fbDesc)); ASSERT_NE(fbInterop, nullptr); auto* colorAttachment = fbInterop->getColorAttachment(0); ASSERT_NE(colorAttachment, nullptr); const auto& desc = colorAttachment->getDesc(); EXPECT_EQ(desc.width, 320u); EXPECT_EQ(desc.height, 240u); EXPECT_EQ(desc.depth, 1u); EXPECT_EQ(desc.numLayers, 1u); EXPECT_EQ(desc.numSamples, 1u); EXPECT_EQ(desc.numMipLevels, 1u); EXPECT_EQ(desc.type, base::TextureType::TwoD); EXPECT_EQ(desc.format, base::TextureFormat::RGBA_UNorm8); } TEST_F(FramebufferInteropTest, MultipleColorAttachments) { base::AttachmentInteropDesc colorDesc0{ .width = 256, .height = 256, .depth = 1, .numLayers = 1, .numSamples = 1, .numMipLevels = 1, .type = base::TextureType::TwoD, .format = base::TextureFormat::RGBA_SRGB, .isSampled = true, }; base::AttachmentInteropDesc colorDesc1{ .width = 256, .height = 256, .depth = 1, .numLayers = 1, .numSamples = 1, .numMipLevels = 1, .type = base::TextureType::TwoD, .format = base::TextureFormat::RGBA_UNorm8, .isSampled = true, }; base::FramebufferInteropDesc fbDesc{}; fbDesc.colorAttachments[0] = &colorDesc0; fbDesc.colorAttachments[1] = &colorDesc1; std::unique_ptr fbInterop(device_->createFramebufferInterop(fbDesc)); ASSERT_NE(fbInterop, nullptr); auto* attachment0 = fbInterop->getColorAttachment(0); auto* attachment1 = fbInterop->getColorAttachment(1); ASSERT_NE(attachment0, nullptr); ASSERT_NE(attachment1, nullptr); // Verify different formats EXPECT_EQ(attachment0->getDesc().format, base::TextureFormat::RGBA_SRGB); EXPECT_EQ(attachment1->getDesc().format, base::TextureFormat::RGBA_UNorm8); } TEST_F(FramebufferInteropTest, StereoFramebuffer) { if (device_->getBackendType() == igl::BackendType::OpenGL && device_->getBackendVersion().majorVersion < 3) { GTEST_SKIP() << "Stereo rendering is not supported in OpenGL ES 2.0"; return; } base::AttachmentInteropDesc colorDesc{ .width = 256, .height = 256, .depth = 1, .numLayers = 2, .numSamples = 1, .numMipLevels = 1, .type = base::TextureType::TwoDArray, .format = base::TextureFormat::RGBA_SRGB, .isSampled = true, }; base::FramebufferInteropDesc fbDesc{}; fbDesc.colorAttachments[0] = &colorDesc; std::unique_ptr fbInterop(device_->createFramebufferInterop(fbDesc)); ASSERT_NE(fbInterop, nullptr); auto* colorAttachment = fbInterop->getColorAttachment(0); ASSERT_NE(colorAttachment, nullptr); const auto& desc = colorAttachment->getDesc(); EXPECT_EQ(desc.numLayers, 2u); EXPECT_EQ(desc.type, base::TextureType::TwoDArray); } TEST_F(FramebufferInteropTest, MultipleFramebuffers) { constexpr size_t kNumFramebuffers = 5; std::vector> framebuffers; framebuffers.reserve(kNumFramebuffers); base::AttachmentInteropDesc colorDesc{ .width = 128, .height = 128, .depth = 1, .numLayers = 1, .numSamples = 1, .numMipLevels = 1, .type = base::TextureType::TwoD, .format = base::TextureFormat::RGBA_SRGB, .isSampled = true, }; base::FramebufferInteropDesc fbDesc{}; fbDesc.colorAttachments[0] = &colorDesc; for (size_t i = 0; i < kNumFramebuffers; ++i) { std::unique_ptr fbInterop(device_->createFramebufferInterop(fbDesc)); ASSERT_NE(fbInterop, nullptr) << "Failed to create framebuffer " << i; framebuffers.push_back(std::move(fbInterop)); } // All framebuffers should have valid color attachments for (size_t i = 0; i < kNumFramebuffers; ++i) { EXPECT_NE(framebuffers[i]->getColorAttachment(0), nullptr) << "Framebuffer " << i << " has null color attachment"; } } } // namespace igl::tests ================================================ FILE: src/igl/tests/Hash.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "data/ShaderData.h" #include "util/Common.h" #include #include #include #include #include #include #include namespace igl::tests { class TestShaderStages : public IShaderStages { public: TestShaderStages() : IShaderStages(ShaderStagesDesc{}) {} }; // // ResourceTest // // Test fixture for all the tests in this file. Takes care of common // initialization and allocating of common resources. // class HashTest : public ::testing::Test { public: HashTest() = default; ~HashTest() override = default; // Set up common resources. This will create a device, a command queue, // and a command buffer void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); // Initialize shader stages std::unique_ptr stages; igl::tests::util::createSimpleShaderStages(iglDev_, stages); shaderStages_ = std::move(stages); } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; std::shared_ptr cmdBuf_; CommandBufferDesc cbDesc_ = {}; std::shared_ptr shaderStages_; }; // // RenderPipelineDesc1 // // Test hashing correctness in the RenderPipelineDesc structure // TEST_F(HashTest, GraphicsPipeline1) { RenderPipelineDesc descOne, descTwo; // Should have the same hash ASSERT_EQ(std::hash()(descOne), std::hash()(descTwo)); // Modify descTwo 1 descTwo.cullMode = igl::CullMode::Front; ASSERT_NE(std::hash()(descOne), std::hash()(descTwo)); descTwo.cullMode = descOne.cullMode; // Modify descTwo 2 descTwo.fragmentUnitSamplerMap[0] = IGL_NAMEHANDLE("hello"); ASSERT_NE(std::hash()(descOne), std::hash()(descTwo)); descTwo.fragmentUnitSamplerMap[0] = descOne.fragmentUnitSamplerMap[0]; // Modify shaderStages descTwo.shaderStages = std::make_shared(); ASSERT_NE(std::hash()(descOne), std::hash()(descTwo)); descTwo.shaderStages = descOne.shaderStages; } // // RenderPipelineDesc2 // // This test checks to see if the definition of GraphicsPipeline has changed. // For simplicity, we are only checking this on a 64-bit machine since // developers use 64-bit machines. // // If this test fails, then that means you have changed the definition of // RenderPipelineDesc, most likely by adding extra fields. If this is the // case, then double check if the hashing function needs to be updated and // after that, update the expectedSize here so the test will pass. // TEST_F(HashTest, GraphicsPipeline2) { // Pass this test on a 32-bit machine if (sizeof(size_t) == 4) { return; } // 64 is the size without unitSamplerMaps, colorAttachments, and debugName as those fields may // vary between compilers and machines const size_t expectedSize = 64 + 2 * sizeof(std::unordered_map) + sizeof(std::unordered_map) + sizeof(std::vector) + sizeof(NameHandle) + sizeof(std::shared_ptr) * IGL_TEXTURE_SAMPLERS_MAX; ASSERT_EQ(expectedSize, sizeof(RenderPipelineDesc)); } // // RenderPipelineDesc3 // // This test checks the "==" operator, which is a necessary complement to // hashing, since this is how unordered_map uses in case of collision. // TEST_F(HashTest, GraphicsPipeline3) { RenderPipelineDesc descOne, descTwo; ASSERT_TRUE(descOne == descTwo); // Change and restore cull mode descTwo.cullMode = igl::CullMode::Front; ASSERT_TRUE(descOne != descTwo); descTwo.cullMode = descOne.cullMode; ASSERT_TRUE(descOne == descTwo); // Change and restore winding mode descTwo.frontFaceWinding = igl::WindingMode::Clockwise; ASSERT_TRUE(descOne != descTwo); descTwo.frontFaceWinding = descOne.frontFaceWinding; ASSERT_TRUE(descOne == descTwo); // Change and restore depthAttachmentFormat descTwo.targetDesc.depthAttachmentFormat = TextureFormat::A_UNorm8; ASSERT_TRUE(descOne != descTwo); descTwo.targetDesc.depthAttachmentFormat = descOne.targetDesc.depthAttachmentFormat; ASSERT_TRUE(descOne == descTwo); // Change and restore stencilAttachmentFormat descTwo.targetDesc.stencilAttachmentFormat = TextureFormat::A_UNorm8; ASSERT_TRUE(descOne != descTwo); descTwo.targetDesc.stencilAttachmentFormat = descOne.targetDesc.stencilAttachmentFormat; ASSERT_TRUE(descOne == descTwo); // Change and restore shaderStages descTwo.shaderStages = shaderStages_; ASSERT_TRUE(descOne != descTwo); descTwo.shaderStages = descOne.shaderStages; ASSERT_TRUE(descOne == descTwo); } // // VertexInputStateDesc1 // // Test hashing correctness in the VertexInputStateDesc structure // TEST_F(HashTest, VertexInputState1) { VertexInputStateDesc descOne, descTwo; // Should have the same hash ASSERT_EQ(std::hash()(descOne), std::hash()(descTwo)); // Modify descTwo to have an attribute descTwo.numAttributes = 1; descTwo.numInputBindings = 1; descTwo.attributes[0].format = VertexAttributeFormat::Float4; descTwo.attributes[0].offset = 0; descTwo.attributes[0].bufferIndex = data::shader::kSimplePosIndex; descTwo.attributes[0].name = data::shader::kSimplePos; descTwo.attributes[0].location = 0; descTwo.inputBindings[0].stride = sizeof(float) * 4; ASSERT_NE(std::hash()(descOne), std::hash()(descTwo)); // Modify descOne to have the same attribute descOne.numAttributes = 1; descOne.numInputBindings = 1; descOne.attributes[0].format = VertexAttributeFormat::Float4; descOne.attributes[0].offset = 0; descOne.attributes[0].bufferIndex = data::shader::kSimplePosIndex; descOne.attributes[0].name = data::shader::kSimplePos; descOne.attributes[0].location = 0; descOne.inputBindings[0].stride = sizeof(float) * 4; ASSERT_EQ(std::hash()(descOne), std::hash()(descTwo)); // Modify a property of the attribute descOne.attributes[0].format = VertexAttributeFormat::Float3; ASSERT_NE(std::hash()(descOne), std::hash()(descTwo)); } // // DepthStencilStateDesc1 // // Test hashing correctness in the DepthStencilStateDesc structure // TEST_F(HashTest, DepthStencilState1) { DepthStencilStateDesc descOne, descTwo; // Should have the same hash ASSERT_EQ(std::hash()(descOne), std::hash()(descTwo)); // Modify descTwo descTwo.isDepthWriteEnabled = true; ASSERT_NE(std::hash()(descOne), std::hash()(descTwo)); // Modify descOne to match descOne.isDepthWriteEnabled = true; ASSERT_EQ(std::hash()(descOne), std::hash()(descTwo)); // Modify descTwo's backFaceStencil descTwo.backFaceStencil.stencilCompareFunction = CompareFunction::Never; ASSERT_NE(std::hash()(descOne), std::hash()(descTwo)); // Modify descOne's backFaceStencil to be similar but not the same descOne.backFaceStencil.stencilCompareFunction = CompareFunction::Never; descOne.backFaceStencil.depthStencilPassOperation = StencilOperation::Replace; ASSERT_NE(std::hash()(descOne), std::hash()(descTwo)); // Match descTwo to descOne descTwo.backFaceStencil.depthStencilPassOperation = StencilOperation::Replace; ASSERT_EQ(std::hash()(descOne), std::hash()(descTwo)); } } // namespace igl::tests ================================================ FILE: src/igl/tests/IglTestsTSANSuppressions.txt ================================================ # Use this file to suppress TSAN issues from 3rd party libraries # https://github.com/google/sanitizers/wiki/ThreadSanitizerSuppressions # vkDestroyDevice called in igl::vulkan::Device::~Device() causes false-positive in TSAN because of some swiftshader issue race:igl::vulkan::Device::~Device() # libvulkan_lvp.so (LLVMpipe Vulkan driver) # Lavapipe has internal data races between render and worker threads # (e.g. realloc vs memcpy, pthread_mutex ops). Suppress all races in # the lavapipe shared library since we cannot fix third-party code. race:libvulkan_lvp.so # libLLVM.so (LLVM library used by Lavapipe) # Lavapipe uses LLVM for JIT compilation, and LLVM has internal data races # in StringMap operations between llvmpipe worker threads during shader # compilation. This is third-party code we cannot fix. race:libLLVM.so ================================================ FILE: src/igl/tests/Log.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include namespace igl::tests { TEST(LogTest, LogOnceRaceCondition) { auto logSomethingUniqueManyTimes = []() { std::default_random_engine generator; std::uniform_int_distribution distribution('a', 'z'); size_t repetitions = 1000; while (repetitions-- > 0) { const size_t len = 16; std::string msg(16, 'a'); for (int i = 0; i < len; ++i) { msg[i] = static_cast(distribution(generator)); } IGLLogOnce(IGLLogInfo, "%s", msg.c_str()); } }; std::thread t1(logSomethingUniqueManyTimes); std::thread t2(logSomethingUniqueManyTimes); std::thread t3(logSomethingUniqueManyTimes); std::thread t4(logSomethingUniqueManyTimes); t1.join(); t2.join(); t3.join(); t4.join(); } } // namespace igl::tests ================================================ FILE: src/igl/tests/Multiview.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "data/ShaderData.h" #include "data/VertexIndexData.h" #include "util/Common.h" #include #include #include namespace igl::tests { // Use a 1x1 Framebuffer for this test constexpr size_t kOffScreenWidth = 1; constexpr size_t kOffScreenHeight = 1; using Colors = std::array; // // MultiviewTest // // Test fixture for all the tests in this file. Takes care of common // initialization and allocating of common resources. // class MultiviewTest : public ::testing::Test { private: public: MultiviewTest() = default; ~MultiviewTest() override = default; std::shared_ptr createVertexUniformBuffer(IDevice& device, Result* /*result*/) { std::shared_ptr vertUniformBuffer = nullptr; const iglu::ManagedUniformBufferInfo ubInfo = { .index = 1, .length = sizeof(Colors), .uniforms = { {.name = "colors", .location = -1, .type = igl::UniformType::Float4, .numElements = 2, .offset = 0, .elementStride = sizeof(glm::vec4)}, }, }; vertUniformBuffer = std::make_shared(device, ubInfo); IGL_DEBUG_ASSERT(vertUniformBuffer->result.isOk()); return vertUniformBuffer; } // // SetUp() // // This function sets up a render pass and a render pipeline descriptor // so it is ready to render a simple quad with an input texture to an // offscreen texture. // // The actual creation of the render pipeline state object is left // to each test so that tests can replace the default settings with // something more appropriate. // void SetUp() override { setDebugBreakEnabled(false); const std::vector requestedFeatures{igl::DeviceFeatures::Multiview}; util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); if (!iglDev_->hasFeature(DeviceFeatures::Multiview)) { GTEST_SKIP() << "Multiview is unsupported for this platform."; return; } #if IGL_PLATFORM_WINDOWS || (IGL_PLATFORM_LINUX && !IGL_PLATFORM_LINUX_USE_EGL) if (iglDev_->getBackendType() == igl::BackendType::OpenGL) { GTEST_SKIP() << "Multiview is unsupported for this platform."; return; } #endif // Create an offscreen texture to render to const TextureDesc texDesc = TextureDesc::new2DArray( TextureFormat::RGBA_UNorm8, kOffScreenWidth, kOffScreenHeight, 2, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); auto depthFormat = TextureFormat::S8_UInt_Z32_UNorm; #ifndef IGL_PLATFORM_MACOSX if (backend_ == util::kBackendVul) { depthFormat = TextureFormat::S8_UInt_Z24_UNorm; } #endif // IGL_PLATFORM_MACOSX TextureDesc depthTexDesc = TextureDesc::new2DArray(depthFormat, kOffScreenWidth, kOffScreenHeight, 2, TextureDesc::TextureUsageBits::Attachment); depthTexDesc.storage = ResourceStorage::Private; Result ret; offscreenTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message; ASSERT_NE(offscreenTexture_, nullptr); depthStencilTexture_ = iglDev_->createTexture(depthTexDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message; ASSERT_NE(depthStencilTexture_, nullptr); // Initialize render pass descriptor renderPass_.colorAttachments.resize(1); renderPass_.colorAttachments[0].loadAction = LoadAction::Clear; renderPass_.colorAttachments[0].storeAction = StoreAction::Store; renderPass_.colorAttachments[0].clearColor = {0.0, 0.0, 0.0, 1.0}; renderPass_.depthAttachment.loadAction = LoadAction::Clear; renderPass_.depthAttachment.storeAction = StoreAction::Store; renderPass_.depthAttachment.clearDepth = 0.0; renderPass_.stencilAttachment.loadAction = LoadAction::Clear; renderPass_.stencilAttachment.storeAction = StoreAction::Store; renderPass_.stencilAttachment.clearStencil = 0; // Initialize input to vertex shader VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Float4; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].bufferIndex = data::shader::kSimplePosIndex; inputDesc.attributes[0].name = data::shader::kSimplePos; inputDesc.attributes[0].location = 0; inputDesc.inputBindings[0].stride = sizeof(float) * 4; // numAttributes has to equal to bindings when using more than 1 buffer inputDesc.numAttributes = inputDesc.numInputBindings = 1; vertexInputState_ = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(vertexInputState_, nullptr); // Initialize index buffer BufferDesc bufDesc; bufDesc.type = BufferDesc::BufferTypeBits::Index; bufDesc.data = data::vertex_index::kQuadInd.data(); bufDesc.length = sizeof(data::vertex_index::kQuadInd); ib_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(ib_, nullptr); // Initialize vertex and sampler buffers bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data::vertex_index::kQuadVert.data(); bufDesc.length = sizeof(data::vertex_index::kQuadVert); vb_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(vb_, nullptr); // Initialize Render Pipeline Descriptor, but leave the creation // to the individual tests in case further customization is required renderPipelineDesc_.vertexInputState = vertexInputState_; renderPipelineDesc_.targetDesc.colorAttachments.resize(1); renderPipelineDesc_.targetDesc.colorAttachments[0].textureFormat = offscreenTexture_->getFormat(); renderPipelineDesc_.targetDesc.depthAttachmentFormat = depthStencilTexture_->getFormat(); renderPipelineDesc_.targetDesc.stencilAttachmentFormat = depthStencilTexture_->getFormat(); renderPipelineDesc_.cullMode = igl::CullMode::Disabled; } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; std::shared_ptr cmdBuf_; CommandBufferDesc cbDesc_ = {}; const std::string backend_ = IGL_BACKEND_TYPE; RenderPassDesc renderPass_; std::shared_ptr offscreenTexture_; std::shared_ptr depthStencilTexture_; std::shared_ptr framebuffer_; std::shared_ptr shaderStages_; std::shared_ptr vertexInputState_; std::shared_ptr vb_, ib_; RenderPipelineDesc renderPipelineDesc_; Colors colors_; }; TEST_F(MultiviewTest, FramebufferMode) { FramebufferDesc desc; EXPECT_TRUE(desc.mode == FramebufferMode::Mono); desc.mode = FramebufferMode::Stereo; EXPECT_TRUE(desc.mode == FramebufferMode::Stereo); desc.mode = FramebufferMode::Multiview; EXPECT_TRUE(desc.mode == FramebufferMode::Multiview); } TEST_F(MultiviewTest, SinglePassStereo) { if (!iglDev_->hasFeature(DeviceFeatures::Multiview)) { GTEST_SKIP() << "Multiview is unsupported for this platform."; return; } std::unique_ptr stages; if (backend_ == util::kBackendOgl) { igl::tests::util::createShaderStages(iglDev_, data::shader::kOglSimpleVertShaderMultiviewEs3, igl::tests::data::shader::kShaderFunc, data::shader::kOglSimpleFragShaderMultiviewEs3, igl::tests::data::shader::kShaderFunc, stages); } else if (backend_ == util::kBackendVul) { igl::tests::util::createShaderStages(iglDev_, data::shader::kVulkanSimpleVertShaderMultiview, igl::tests::data::shader::kShaderFunc, data::shader::kVulkanSimpleFragShaderMultiview, igl::tests::data::shader::kShaderFunc, stages); } ASSERT_TRUE(stages); shaderStages_ = std::move(stages); renderPipelineDesc_.shaderStages = shaderStages_; FramebufferDesc framebufferDesc; framebufferDesc.mode = FramebufferMode::Stereo; framebufferDesc.colorAttachments[0].texture = offscreenTexture_; framebufferDesc.depthAttachment.texture = depthStencilTexture_; framebufferDesc.stencilAttachment.texture = depthStencilTexture_; Result ret; framebuffer_ = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(framebuffer_, nullptr); Result result{}; auto vertUniformBuffer = createVertexUniformBuffer(*iglDev_, &result); ASSERT_TRUE(result.isOk()); colors_[0].r = 1.0f; colors_[0].g = 0.0f; colors_[0].b = 0.0f; colors_[0].a = 1.0f; colors_[1].r = 0.0f; colors_[1].g = 1.0f; colors_[1].b = 1.0f; colors_[1].a = 1.0f; *static_cast(vertUniformBuffer->getData()) = colors_; const auto pipelineState = iglDev_->createRenderPipeline(renderPipelineDesc_, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(pipelineState, nullptr); DepthStencilStateDesc desc; desc.isDepthWriteEnabled = true; const auto depthStencilState = iglDev_->createDepthStencilState(desc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(depthStencilState, nullptr); cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(cmdBuf_, nullptr); auto cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, framebuffer_); cmds->bindRenderPipelineState(pipelineState); cmds->bindDepthStencilState(depthStencilState); cmds->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); vertUniformBuffer->bind(*iglDev_, *pipelineState, *cmds); cmds->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmds->drawIndexed(6); cmds->endEncoding(); cmdBuf_->present(framebuffer_->getColorAttachment(0)); cmdQueue_->submit(*cmdBuf_); cmdBuf_->waitUntilCompleted(); //---------------------- // Read back framebuffer //---------------------- auto pixels = std::vector(kOffScreenWidth * kOffScreenHeight); auto rangeDesc = TextureRangeDesc::new2D(0, 0, kOffScreenWidth, kOffScreenHeight); framebuffer_->copyBytesColorAttachment(*cmdQueue_, 0, pixels.data(), rangeDesc); EXPECT_EQ(pixels[0], 0xff0000ff); rangeDesc.layer = 1; pixels[0] = 0; framebuffer_->copyBytesColorAttachment(*cmdQueue_, 0, pixels.data(), rangeDesc); EXPECT_EQ(pixels[0], 0xffffff00); } } // namespace igl::tests ================================================ FILE: src/igl/tests/NameHandleTests.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace igl::tests { namespace { NameHandle a = IGL_NAMEHANDLE("a"); NameHandle b = IGL_NAMEHANDLE("b"); NameHandle c = IGL_NAMEHANDLE("c"); NameHandle someLongerString = IGL_NAMEHANDLE("someLongerString"); } // namespace TEST(NameHandleTests, string) { EXPECT_EQ(a.toString(), "a"); EXPECT_EQ(b.toString(), "b"); EXPECT_EQ(c.toString(), "c"); EXPECT_EQ(someLongerString.toString(), "someLongerString"); } TEST(NameHandleTests, crc32) { EXPECT_EQ(a.getCrc32(), 3904355907); EXPECT_EQ(b.getCrc32(), 1908338681); EXPECT_EQ(c.getCrc32(), 112844655); EXPECT_EQ(someLongerString.getCrc32(), 3994903871); } TEST(NameHandleTests, equality) { EXPECT_EQ(a, a); EXPECT_EQ(b, b); EXPECT_NE(a, b); } TEST(NameHandleTests, ordering) { EXPECT_GT(a, b); EXPECT_GT(b, c); EXPECT_GE(a, a); EXPECT_GE(a, b); EXPECT_GE(b, c); EXPECT_LT(c, b); EXPECT_LT(b, a); EXPECT_LE(c, c); EXPECT_LE(c, b); EXPECT_LE(b, a); } TEST(NameHandleTests, set) { std::set s{a, b}; EXPECT_EQ(s.size(), 2); EXPECT_NE(s.find(a), s.end()); EXPECT_NE(s.find(b), s.end()); EXPECT_EQ(s.find(c), s.end()); } } // namespace igl::tests ================================================ FILE: src/igl/tests/RenderCommandEncoder.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "data/ShaderData.h" #include "data/TextureData.h" #include "util/Common.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #define OFFSCREEN_RT_WIDTH 4 #define OFFSCREEN_RT_HEIGHT 4 #define OFFSCREEN_TEX_WIDTH 4 #define OFFSCREEN_TEX_HEIGHT 4 namespace igl::tests { const auto kQuarterPixel = (float)(0.5 / OFFSCREEN_RT_WIDTH); const float kBackgroundColor = 0.501f; const uint32_t kBackgroundColorHex = 0x80808080; /** * @brief RenderCommandEncoderTest is a test fixture for all the tests in this file. * It takes care of common initialization and allocating of common resources. */ class RenderCommandEncoderTest : public ::testing::Test { private: public: RenderCommandEncoderTest() = default; ~RenderCommandEncoderTest() override = default; /** * @brief This function sets up a render pass and a render pipeline descriptor * so it is ready to render a simple quad with an input texture to an * offscreen texture. */ void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_TRUE(iglDev_ != nullptr); ASSERT_TRUE(cmdQueue_ != nullptr); // Create an offscreen texture to render to TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, OFFSCREEN_RT_WIDTH, OFFSCREEN_RT_HEIGHT, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); auto depthFormat = TextureFormat::S8_UInt_Z32_UNorm; if (backend_ == util::kBackendVul) { depthFormat = TextureFormat::S8_UInt_Z24_UNorm; } TextureDesc depthTexDesc = TextureDesc::new2D(depthFormat, OFFSCREEN_RT_WIDTH, OFFSCREEN_RT_HEIGHT, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); depthTexDesc.storage = ResourceStorage::Private; Result ret; offscreenTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message; ASSERT_TRUE(offscreenTexture_ != nullptr); depthStencilTexture_ = iglDev_->createTexture(depthTexDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message; ASSERT_TRUE(depthStencilTexture_ != nullptr); // Create framebuffer using the offscreen texture FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = offscreenTexture_; framebufferDesc.depthAttachment.texture = depthStencilTexture_; framebufferDesc.stencilAttachment.texture = depthStencilTexture_; framebuffer_ = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(framebuffer_ != nullptr); // Initialize render pass descriptor renderPass_.colorAttachments.resize(1); renderPass_.colorAttachments[0].loadAction = LoadAction::Clear; renderPass_.colorAttachments[0].storeAction = StoreAction::Store; renderPass_.colorAttachments[0].clearColor = { kBackgroundColor, kBackgroundColor, kBackgroundColor, kBackgroundColor}; renderPass_.depthAttachment.loadAction = LoadAction::Clear; renderPass_.depthAttachment.storeAction = StoreAction::Store; renderPass_.depthAttachment.clearDepth = 0.0; renderPass_.stencilAttachment.loadAction = LoadAction::Clear; renderPass_.stencilAttachment.storeAction = StoreAction::Store; renderPass_.stencilAttachment.clearStencil = 0; // Initialize shader stages std::unique_ptr stages; igl::tests::util::createSimpleShaderStages(iglDev_, stages); shaderStages_ = std::move(stages); // Initialize input to vertex shader VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Float4; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].bufferIndex = data::shader::kSimplePosIndex; inputDesc.attributes[0].name = data::shader::kSimplePos; inputDesc.attributes[0].location = 0; inputDesc.inputBindings[0].stride = sizeof(float) * 4; inputDesc.attributes[1].format = VertexAttributeFormat::Float2; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].bufferIndex = data::shader::kSimpleUvIndex; inputDesc.attributes[1].name = data::shader::kSimpleUv; inputDesc.attributes[1].location = 1; inputDesc.inputBindings[1].stride = sizeof(float) * 2; // numAttributes has to equal to bindings when using more than 1 buffer inputDesc.numAttributes = inputDesc.numInputBindings = 2; vertexInputState_ = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(vertexInputState_ != nullptr); // Initialize sampler state const SamplerStateDesc samplerDesc; samp_ = iglDev_->createSamplerState(samplerDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(samp_ != nullptr); // Initialize Render Pipeline Descriptor, but leave the creation // to the individual tests in case further customization is required. // It cannot be `const` here as we mutate the desc later. RenderPipelineDesc renderPipelineDesc = { .vertexInputState = vertexInputState_, .shaderStages = shaderStages_, .targetDesc = { .colorAttachments = {{.textureFormat = offscreenTexture_->getFormat()}}, .depthAttachmentFormat = depthStencilTexture_->getFormat(), .stencilAttachmentFormat = depthStencilTexture_->getFormat(), }, .cullMode = igl::CullMode::Disabled, .fragmentUnitSamplerMap = {{textureUnit_, IGL_NAMEHANDLE(data::shader::kSimpleSampler)}}, }; texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT, TextureDesc::TextureUsageBits::Sampled); texture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(texture_ != nullptr); const auto rangeDesc = TextureRangeDesc::new2D(0, 0, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT); texture_->upload(rangeDesc, data::texture::kTexRgbaGray4x4.data()); auto createPipeline = [&renderPipelineDesc, &ret, this]( PrimitiveType topology) -> std::shared_ptr { renderPipelineDesc.topology = topology; return iglDev_->createRenderPipeline(renderPipelineDesc, &ret); }; renderPipelineStatePoint_ = createPipeline(PrimitiveType::Point); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(renderPipelineStatePoint_ != nullptr); renderPipelineStateLine_ = createPipeline(PrimitiveType::Line); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(renderPipelineStateLine_ != nullptr); renderPipelineStateLineStrip_ = createPipeline(PrimitiveType::LineStrip); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(renderPipelineStateLineStrip_ != nullptr); renderPipelineStateTriangle_ = createPipeline(PrimitiveType::Triangle); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(renderPipelineStateTriangle_ != nullptr); renderPipelineStateTriangleStrip_ = createPipeline(PrimitiveType::TriangleStrip); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(renderPipelineStateTriangleStrip_ != nullptr); depthStencilState_ = iglDev_->createDepthStencilState({}, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(depthStencilState_ != nullptr); bindGroupTexture_ = iglDev_->createBindGroup( BindGroupTextureDesc{ .textures = {texture_}, .samplers = {samp_}, .debugName = "Offscreen texture test"}, nullptr, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); } void encodeAndSubmit( const std::function&)>& func, bool useBindGroup = false, bool useNewBindTexture = false) { Result ret; auto cmdBuffer = cmdQueue_->createCommandBuffer({}, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(cmdBuffer != nullptr); auto encoder = cmdBuffer->createRenderCommandEncoder(renderPass_, framebuffer_); if (useBindGroup) { encoder->bindBindGroup(bindGroupTexture_); } else { useNewBindTexture ? encoder->bindTexture(textureUnit_, texture_.get()) : encoder->bindTexture(textureUnit_, BindTarget::kFragment, texture_.get()); encoder->bindSamplerState(textureUnit_, BindTarget::kFragment, samp_.get()); } encoder->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); encoder->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); encoder->bindDepthStencilState(depthStencilState_); if (ib_) { encoder->bindIndexBuffer(*ib_, IndexFormat::UInt32); } const igl::Viewport viewport = {.x = 0.0f, .y = 0.0f, .width = (float)OFFSCREEN_RT_WIDTH, .height = (float)OFFSCREEN_RT_HEIGHT, .minDepth = 0.0f, .maxDepth = +1.0f}; const igl::ScissorRect scissor = {.x = 0, .y = 0, .width = (uint32_t)OFFSCREEN_RT_WIDTH, .height = (uint32_t)OFFSCREEN_RT_HEIGHT}; encoder->bindViewport(viewport); encoder->bindScissorRect(scissor); func(encoder); encoder->endEncoding(); cmdQueue_->submit(*cmdBuffer); cmdBuffer->waitUntilCompleted(); } void verifyFrameBuffer(const std::vector& expectedPixels) { auto pixels = std::vector(static_cast(OFFSCREEN_RT_WIDTH * OFFSCREEN_RT_WIDTH)); framebuffer_->copyBytesColorAttachment( *cmdQueue_, 0, pixels.data(), TextureRangeDesc::new2D(0, 0, OFFSCREEN_RT_WIDTH, OFFSCREEN_RT_HEIGHT)); #if IGL_LOGGING_ENABLED debugLog(pixels); #endif // IGL_LOGGING_ENABLED for (int i = 0; i < OFFSCREEN_RT_HEIGHT; i++) { for (int j = 0; j < OFFSCREEN_RT_WIDTH; j++) { ASSERT_EQ(pixels[(OFFSCREEN_RT_HEIGHT - i - 1) * OFFSCREEN_RT_WIDTH + j], expectedPixels[i * OFFSCREEN_RT_WIDTH + j]); } } } void verifyFrameBuffer(const std::function&)>& func) { auto pixels = std::vector(static_cast(OFFSCREEN_RT_WIDTH * OFFSCREEN_RT_WIDTH)); framebuffer_->copyBytesColorAttachment( *cmdQueue_, 0, pixels.data(), TextureRangeDesc::new2D(0, 0, OFFSCREEN_RT_WIDTH, OFFSCREEN_RT_HEIGHT)); #if IGL_LOGGING_ENABLED debugLog(pixels); #endif // IGL_LOGGING_ENABLED func(pixels); } void debugLog(const std::vector& pixels) { IGL_LOG_DEBUG("\nFrameBuffer begins.\n"); IGL_LOG_DEBUG("%s\n", ::testing::UnitTest::GetInstance()->current_test_info()->name()); for (int i = OFFSCREEN_RT_HEIGHT - 1; i >= 0; i--) { for (int j = 0; j < OFFSCREEN_RT_WIDTH; j++) { IGL_LOG_DEBUG("%x, ", pixels[i * OFFSCREEN_RT_WIDTH + j]); } IGL_LOG_DEBUG("\n"); } IGL_LOG_DEBUG("\nFrameBuffer ends.\n"); } void initializeBuffers(const std::vector& verts, const std::vector& uvs, const std::vector& indices = {}) { Result ret; vb_ = iglDev_->createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Vertex, .data = verts.data(), .length = sizeof(float) * verts.size()}, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(vb_ != nullptr); uv_ = iglDev_->createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Vertex, .data = uvs.data(), .length = sizeof(float) * uvs.size()}, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(uv_ != nullptr); if (!indices.empty()) { ib_ = iglDev_->createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Index, .data = indices.data(), .length = sizeof(uint32_t) * indices.size()}, &ret); ASSERT_TRUE(ret.isOk()); ASSERT_TRUE(ib_ != nullptr); } } void initialize8BitIndices(const std::vector& indices) { Result ret; ib_ = iglDev_->createBuffer(BufferDesc{.type = BufferDesc::BufferTypeBits::Index, .data = indices.data(), .length = sizeof(uint8_t) * indices.size()}, &ret); ASSERT_TRUE(ret.isOk()); ASSERT_TRUE(ib_ != nullptr); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; RenderPassDesc renderPass_; std::shared_ptr offscreenTexture_; std::shared_ptr depthStencilTexture_; std::shared_ptr framebuffer_; std::shared_ptr shaderStages_; std::shared_ptr vertexInputState_; std::shared_ptr vb_, uv_, ib_; std::shared_ptr samp_; std::shared_ptr texture_; std::shared_ptr renderPipelineStatePoint_; std::shared_ptr renderPipelineStateLine_; std::shared_ptr renderPipelineStateLineStrip_; std::shared_ptr renderPipelineStateTriangle_; std::shared_ptr renderPipelineStateTriangleStrip_; std::shared_ptr depthStencilState_; Holder bindGroupTexture_; const std::string backend_ = IGL_BACKEND_TYPE; size_t textureUnit_ = 0; }; // namespace igl::tests TEST_F(RenderCommandEncoderTest, shouldDrawAPoint) { initializeBuffers( // clang-format off { kQuarterPixel, kQuarterPixel, 0.0f, 1.0f }, { 0.5, 0.5 } // clang-format on ); encodeAndSubmit([this](const std::unique_ptr& encoder) { encoder->bindRenderPipelineState(renderPipelineStatePoint_); encoder->draw(1); }); auto grayColor = data::texture::kTexRgbaGray4x4[0]; // clang-format off std::vector const expectedPixels { kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, grayColor, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, }; // clang-format on verifyFrameBuffer(expectedPixels); } TEST_F(RenderCommandEncoderTest, shouldDrawAPointNewBindTexture) { initializeBuffers( // clang-format off { kQuarterPixel, kQuarterPixel, 0.0f, 1.0f }, { 0.5, 0.5 } // clang-format on ); encodeAndSubmit( [this](const std::unique_ptr& encoder) { encoder->bindRenderPipelineState(renderPipelineStatePoint_); encoder->draw(1); }, false, true); auto grayColor = data::texture::kTexRgbaGray4x4[0]; // clang-format off std::vector const expectedPixels { kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, grayColor, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, }; // clang-format on verifyFrameBuffer(expectedPixels); } TEST_F(RenderCommandEncoderTest, shouldDrawALine) { initializeBuffers( // clang-format off { -1.0f - kQuarterPixel, -1.0f + kQuarterPixel, 0.0f, 1.0f, 1.0f + kQuarterPixel, -1.0f + kQuarterPixel, 0.0f, 1.0f, }, { 0.0f, 0.0f, 1.0f, 0.0f, } // clang-format on ); encodeAndSubmit([this](const std::unique_ptr& encoder) { encoder->bindRenderPipelineState(renderPipelineStateLine_); encoder->draw(2); }); auto grayColor = data::texture::kTexRgbaGray4x4[0]; // clang-format off std::vector const expectedPixels { kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, grayColor, grayColor, grayColor, grayColor, }; // clang-format on verifyFrameBuffer(expectedPixels); } TEST_F(RenderCommandEncoderTest, shouldDrawLineStrip) { initializeBuffers( // clang-format off { -1.0f - kQuarterPixel, -1.0f + kQuarterPixel, 0.0f, 1.0f, 1.0f + kQuarterPixel, -1.0f + kQuarterPixel, 0.0f, 1.0f, 1.0f - kQuarterPixel, -1.0f - kQuarterPixel, 0.0f, 1.0f, 1.0f - kQuarterPixel, 1.0f + kQuarterPixel, 0.0f, 1.0f, }, { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, } // clang-format on ); encodeAndSubmit([this](const std::unique_ptr& encoder) { encoder->bindRenderPipelineState(renderPipelineStateLineStrip_); encoder->draw(4); }); auto grayColor = data::texture::kTexRgbaGray4x4[0]; // clang-format off std::vector const expectedPixels { kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, grayColor, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, grayColor, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, grayColor, grayColor, grayColor, grayColor, grayColor, }; // clang-format on verifyFrameBuffer(expectedPixels); } TEST_F(RenderCommandEncoderTest, drawIndexedFirstIndex) { if (!iglDev_->hasFeature(igl::DeviceFeatures::DrawFirstIndexFirstVertex)) { GTEST_SKIP(); return; } initializeBuffers( // clang-format off { -1.0f - kQuarterPixel, -1.0f, 0.0f, 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 1.0f, 1.0f + kQuarterPixel, 0.0f, 1.0f, }, { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, }, { 0, 0, 0, 0, 1, 2, // the first 3 indices are dummies } // clang-format on ); ASSERT_TRUE(ib_ != nullptr); encodeAndSubmit([this](const std::unique_ptr& encoder) { encoder->bindRenderPipelineState(renderPipelineStateTriangle_); encoder->drawIndexed(3, 1, 3); // skip the first 3 dummy indices }); const auto grayColor = data::texture::kTexRgbaGray4x4[0]; // clang-format off const std::vector expectedPixels { kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, grayColor, kBackgroundColorHex, kBackgroundColorHex, grayColor, grayColor, kBackgroundColorHex, grayColor, grayColor, grayColor, grayColor, grayColor, grayColor, grayColor, }; // clang-format on verifyFrameBuffer(expectedPixels); } TEST_F(RenderCommandEncoderTest, drawIndexed8Bit) { if (!iglDev_->hasFeature(igl::DeviceFeatures::Indices8Bit)) { GTEST_SKIP(); return; } initializeBuffers( // clang-format off { -1.0f - kQuarterPixel, -1.0f, 0.0f, 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 1.0f, 1.0f + kQuarterPixel, 0.0f, 1.0f, }, { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, } // clang-format on ); initialize8BitIndices({0, 1, 2}); ASSERT_TRUE(ib_ != nullptr); encodeAndSubmit([this](const std::unique_ptr& encoder) { encoder->bindRenderPipelineState(renderPipelineStateTriangle_); encoder->bindIndexBuffer(*ib_, IndexFormat::UInt8); encoder->drawIndexed(3); }); const auto grayColor = data::texture::kTexRgbaGray4x4[0]; // clang-format off const std::vector expectedPixels { kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, grayColor, kBackgroundColorHex, kBackgroundColorHex, grayColor, grayColor, kBackgroundColorHex, grayColor, grayColor, grayColor, grayColor, grayColor, grayColor, grayColor, }; // clang-format on verifyFrameBuffer(expectedPixels); } TEST_F(RenderCommandEncoderTest, drawInstanced) { if (!iglDev_->hasFeature(igl::DeviceFeatures::DrawFirstIndexFirstVertex)) { GTEST_SKIP(); return; } initializeBuffers( // clang-format off { -1.0f - kQuarterPixel, -1.0f, 0.0f, 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 1.0f, 1.0f + kQuarterPixel, 0.0f, 1.0f, }, { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, }, { 0, 1, 2, } // clang-format on ); ASSERT_TRUE(ib_ != nullptr); encodeAndSubmit([this](const std::unique_ptr& encoder) { encoder->bindRenderPipelineState(renderPipelineStateTriangle_); // draw 2 indentical instances, one on top of another; this will trigger drawElementsInstanced() // in OpenGL encoder->drawIndexed(3, 2); }); const auto grayColor = data::texture::kTexRgbaGray4x4[0]; // clang-format off const std::vector expectedPixels { kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, grayColor, kBackgroundColorHex, kBackgroundColorHex, grayColor, grayColor, kBackgroundColorHex, grayColor, grayColor, grayColor, grayColor, grayColor, grayColor, grayColor, }; // clang-format on verifyFrameBuffer(expectedPixels); } TEST_F(RenderCommandEncoderTest, shouldDrawATriangle) { initializeBuffers( // clang-format off { -1.0f - kQuarterPixel, -1.0f, 0.0f, 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 1.0f, 1.0f + kQuarterPixel, 0.0f, 1.0f, }, { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, } // clang-format on ); encodeAndSubmit([this](const std::unique_ptr& encoder) { encoder->bindRenderPipelineState(renderPipelineStateTriangle_); encoder->draw(3); }); auto grayColor = data::texture::kTexRgbaGray4x4[0]; // clang-format off std::vector const expectedPixels { kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, grayColor, kBackgroundColorHex, kBackgroundColorHex, grayColor, grayColor, kBackgroundColorHex, grayColor, grayColor, grayColor, grayColor, grayColor, grayColor, grayColor, }; verifyFrameBuffer(expectedPixels); } TEST_F(RenderCommandEncoderTest, shouldDrawTriangleStrip) { initializeBuffers( // clang-format off { -1.0f, 1.0f, 0.0f, 1.0f, -1.0f, -1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, }, { 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, } // clang-format on ); encodeAndSubmit([this](const std::unique_ptr& encoder) { encoder->insertDebugEventLabel("Rendering a triangle strip..."); encoder->bindRenderPipelineState(renderPipelineStateTriangleStrip_); encoder->draw(4); }); verifyFrameBuffer([](const std::vector& pixels) { for (const auto& pixel : pixels) { ASSERT_EQ(pixel, data::texture::kTexRgbaGray4x4[0]); } }); } TEST_F(RenderCommandEncoderTest, shouldDrawTriangleStripCopyTextureToBuffer) { if (iglDev_->getBackendType() != igl::BackendType::Vulkan && iglDev_->getBackendType() != igl::BackendType::D3D12) { GTEST_SKIP() << "Not implemented for this backend"; return; } initializeBuffers( // clang-format off { -1.0f, 1.0f, 0.0f, 1.0f, -1.0f, -1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, }, { 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, } // clang-format on ); Result ret; std ::shared_ptr screenCopy = iglDev_->createBuffer( BufferDesc{ .type = BufferDesc::BufferTypeBits::Storage, .length = OFFSCREEN_RT_WIDTH * OFFSCREEN_RT_HEIGHT * sizeof(uint32_t), .storage = ResourceStorage::Shared, .debugName = "Buffer: screen copy", }, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); auto cmdBuffer = cmdQueue_->createCommandBuffer({}, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(cmdBuffer != nullptr); auto encoder = cmdBuffer->createRenderCommandEncoder(renderPass_, framebuffer_); encoder->bindTexture(textureUnit_, texture_.get()); encoder->bindSamplerState(textureUnit_, BindTarget::kFragment, samp_.get()); encoder->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); encoder->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); encoder->bindDepthStencilState(depthStencilState_); encoder->bindViewport({.x = 0.0f, .y = 0.0f, .width = (float)OFFSCREEN_RT_WIDTH, .height = (float)OFFSCREEN_RT_HEIGHT, .minDepth = 0.0f, .maxDepth = +1.0f}); encoder->bindScissorRect({.x = 0, .y = 0, .width = (uint32_t)OFFSCREEN_RT_WIDTH, .height = (uint32_t)OFFSCREEN_RT_HEIGHT}); encoder->insertDebugEventLabel("Rendering a triangle strip..."); encoder->bindRenderPipelineState(renderPipelineStateTriangleStrip_); encoder->draw(4); encoder->endEncoding(); cmdBuffer->copyTextureToBuffer(*framebuffer_->getColorAttachment(0), *screenCopy, 0); cmdQueue_->submit(*cmdBuffer); cmdBuffer->waitUntilCompleted(); const uint32_t* data = static_cast( screenCopy->map(BufferRange(screenCopy->getSizeInBytes()), nullptr)); for (size_t i = 0; i != OFFSCREEN_RT_HEIGHT * OFFSCREEN_RT_HEIGHT; i++) { ASSERT_EQ(data[i], data::texture::kTexRgbaGray4x4[0]); } screenCopy->unmap(); } TEST_F(RenderCommandEncoderTest, shouldNotDraw) { initializeBuffers( // clang-format off { -1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, -1.0f, -1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, -1.0f, -1.0f, 0.0f, 1.0f, }, { 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, } // clang-format on ); encodeAndSubmit([this](const std::unique_ptr& encoder) { encoder->bindRenderPipelineState(renderPipelineStatePoint_); encoder->draw(0); encoder->bindRenderPipelineState(renderPipelineStateLine_); encoder->draw(0); encoder->bindRenderPipelineState(renderPipelineStateLineStrip_); encoder->draw(0); encoder->bindRenderPipelineState(renderPipelineStateTriangle_); encoder->draw(0); encoder->bindRenderPipelineState(renderPipelineStateTriangleStrip_); encoder->draw(0); }); verifyFrameBuffer([](const std::vector& pixels) { for (const auto& pixel : pixels) { ASSERT_EQ(pixel, kBackgroundColorHex); } }); } TEST_F(RenderCommandEncoderTest, shouldDrawATriangleBindGroup) { #if IGL_PLATFORM_APPLE if (iglDev_->getBackendType() == igl::BackendType::Vulkan) { // @fb-only GTEST_SKIP() << "Broken on macOS arm64"; return; } #endif initializeBuffers( // clang-format off { -1.0f - kQuarterPixel, -1.0f, 0.0f, 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 1.0f, 1.0f + kQuarterPixel, 0.0f, 1.0f, }, { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, } // clang-format on ); encodeAndSubmit( [this](const std::unique_ptr& encoder) { encoder->insertDebugEventLabel("Rendering a triangle..."); encoder->bindRenderPipelineState(renderPipelineStateTriangle_); encoder->draw(3); }, true); auto grayColor = data::texture::kTexRgbaGray4x4[0]; // clang-format off std::vector const expectedPixels { kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, grayColor, kBackgroundColorHex, kBackgroundColorHex, grayColor, grayColor, kBackgroundColorHex, grayColor, grayColor, grayColor, grayColor, grayColor, grayColor, grayColor, }; verifyFrameBuffer(expectedPixels); } TEST_F(RenderCommandEncoderTest, DepthBiasShouldDrawAPoint) { initializeBuffers( // clang-format off { kQuarterPixel, kQuarterPixel, 0.0f, 1.0f }, { 0.5, 0.5 } // clang-format on ); encodeAndSubmit([this](const std::unique_ptr& encoder) { encoder->bindRenderPipelineState(renderPipelineStatePoint_); encoder->setDepthBias(0, 0, 0); encoder->draw(1); }); auto grayColor = data::texture::kTexRgbaGray4x4[0]; // clang-format off std::vector const expectedPixels { kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, grayColor, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, }; // clang-format on verifyFrameBuffer(expectedPixels); } TEST_F(RenderCommandEncoderTest, drawUsingBindPushConstants) { if (iglDev_->getBackendType() != igl::BackendType::Vulkan && iglDev_->getBackendType() != igl::BackendType::D3D12) { GTEST_SKIP() << "Push constants are only supported in Vulkan and D3D12"; return; } initializeBuffers( // clang-format off { kQuarterPixel, kQuarterPixel, 0.0f, 1.0f }, { 0.5, 0.5 } // clang-format on ); // Create new shader stages with push constant shaders std::unique_ptr pushConstantStages; if (iglDev_->getBackendType() == igl::BackendType::D3D12) { igl::tests::util::createShaderStages(iglDev_, data::shader::kD3D12PushConstantVertShader, std::string("main"), data::shader::kD3D12PushConstantFragShader, std::string("main"), pushConstantStages); } else { igl::tests::util::createShaderStages(iglDev_, data::shader::kVulkanPushConstantVertShader, igl::tests::data::shader::kShaderFunc, data::shader::kVulkanPushConstantFragShader, igl::tests::data::shader::kShaderFunc, pushConstantStages); } ASSERT_TRUE(pushConstantStages); shaderStages_ = std::move(pushConstantStages); // Create pipeline with push constant shaders const RenderPipelineDesc pipelineDesc = { .topology = PrimitiveType::Point, .vertexInputState = vertexInputState_, .shaderStages = shaderStages_, .targetDesc = {.colorAttachments = {{.textureFormat = offscreenTexture_->getFormat()}}, .depthAttachmentFormat = depthStencilTexture_->getFormat(), .stencilAttachmentFormat = depthStencilTexture_->getFormat()}, .cullMode = igl::CullMode::Disabled, .fragmentUnitSamplerMap = {{textureUnit_, IGL_NAMEHANDLE(data::shader::kSimpleSampler)}}, }; Result ret; auto pipelineWithPushConstants = iglDev_->createRenderPipeline(pipelineDesc, &ret); ASSERT_TRUE(ret.isOk()); // Color multiplied by 1.5 const float pushData[] = {1.5f, 1.5f, 1.5f, 1.5f}; encodeAndSubmit([&](const std::unique_ptr& encoder) { encoder->bindRenderPipelineState(pipelineWithPushConstants); encoder->bindPushConstants(pushData, sizeof(pushData), 0); encoder->draw(1); }); // Expect 0x888888FF (0x888888 * 1.5) in the center of the screen const uint32_t expectedColor = 0xCCCCCCFF; // clang-format off std::vector const expectedPixels { kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, expectedColor, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, kBackgroundColorHex, }; // clang-format on verifyFrameBuffer(expectedPixels); } } // namespace igl::tests ================================================ FILE: src/igl/tests/Resource.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "util/Common.h" #include #include #include namespace igl::tests { // // ResourceTest // // Test fixture for all the tests in this file. Takes care of common // initialization and allocating of common resources. // class ResourceTest : public ::testing::Test { public: ResourceTest() = default; ~ResourceTest() override = default; // Set up common resources. This will create a device and a command queue void SetUp() override { // Turn off debug break so unit tests can run igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; struct FragmentFormat { simd::float3 color; }; FragmentFormat fragmentParameters_{}; }; // // CreateRenderPipelineReturnNull // // Make sure that createRenderPipeline() returns nullptr on error. // We used to return a partially initialized object on error, and this // was causing difficult to reproduce crashes in production. // TEST_F(ResourceTest, CreateRenderPipelineReturnNull) { Result ret; const RenderPipelineDesc desc; std::shared_ptr rps; // Sending in the blank desc should give an error since the shader modules // are nullptr rps = iglDev_->createRenderPipeline(desc, &ret); ASSERT_TRUE(!ret.isOk()); ASSERT_TRUE(rps == nullptr); } // // Depth Stencil // // Check creation of depth stencil // TEST_F(ResourceTest, DepthStencilCreate) { Result ret; const DepthStencilStateDesc dsDesc = {}; std::shared_ptr ds; ds = iglDev_->createDepthStencilState(dsDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(ds != nullptr); } // // Buffer // // Check creation of vertex buffer // TEST_F(ResourceTest, VertexBuffer) { Result ret; float vertexData[] = {1.0}; const BufferDesc bufferDesc{ .type = BufferDesc::BufferTypeBits::Vertex, .data = vertexData, .length = sizeof(vertexData), }; const std::shared_ptr buffer = iglDev_->createBuffer(bufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(buffer != nullptr); } // // Buffer // // Check creation of uninitialized vertex buffer // TEST_F(ResourceTest, UninitializedVertexBuffer) { Result ret; const int bufferLength = 64; const BufferDesc bufferDesc{ .type = BufferDesc::BufferTypeBits::Vertex, .length = bufferLength, .storage = ResourceStorage::Shared, }; const std::shared_ptr buffer = iglDev_->createBuffer(bufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(buffer != nullptr); ASSERT_EQ(buffer->getSizeInBytes(), bufferLength); } // // Buffer // // Check creation of index buffer // TEST_F(ResourceTest, IndexBuffer) { Result ret; uint16_t indexData[] = { 0, 1, 2, 1, 3, 2, }; const BufferDesc bufferDesc{ .type = BufferDesc::BufferTypeBits::Index, .data = indexData, .length = sizeof(indexData), }; const std::shared_ptr buffer = iglDev_->createBuffer(bufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(buffer != nullptr); } // // Buffer // // Check creation of uniform buffer // TEST_F(ResourceTest, UniformBuffer) { Result ret; fragmentParameters_.color = {1.0f, 1.0f, 1.0f}; const BufferDesc bufferDesc{ .type = BufferDesc::BufferTypeBits::Uniform, .data = &fragmentParameters_, .length = sizeof(fragmentParameters_), }; const std::shared_ptr buffer = iglDev_->createBuffer(bufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(buffer != nullptr); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ShaderLibrary.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "data/ShaderData.h" #include "util/Common.h" #include namespace igl::tests { class ShaderLibraryTest : public ::testing::Test { private: public: ShaderLibraryTest() = default; ~ShaderLibraryTest() override = default; // // SetUp() // void SetUp() override { // Turn off debug breaks, only use in debug mode igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_TRUE(iglDev_ != nullptr); ASSERT_TRUE(cmdQueue_ != nullptr); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; }; TEST_F(ShaderLibraryTest, CreateFromSource) { Result ret; if (!iglDev_->hasFeature(DeviceFeatures::ShaderLibrary)) { GTEST_SKIP() << "Shader Libraries are unsupported for this platform."; return; } const char* source = nullptr; if (iglDev_->getBackendType() == igl::BackendType::Metal) { source = data::shader::kMtlSimpleShader.data(); } else if (iglDev_->getBackendType() == igl::BackendType::Vulkan) { source = data::shader::kVulkanSimpleVertShader.data(); } else if (iglDev_->getBackendType() == igl::BackendType::D3D12) { source = data::shader::kD3D12SimpleShader.data(); } else { IGL_DEBUG_ASSERT_NOT_REACHED(); } // Check if source is null before passing it to fromStringInput if (source == nullptr) { GTEST_SKIP() << "No shader source available for this backend."; return; } auto shaderLibrary = ShaderLibraryCreator::fromStringInput( *iglDev_, source, {{.stage = ShaderStage::Vertex, .entryPoint = "vertexShader"}}, "", &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(shaderLibrary != nullptr); auto vertShaderModule = shaderLibrary->getShaderModule("vertexShader"); ASSERT_TRUE(vertShaderModule); } TEST_F(ShaderLibraryTest, CreateFromSingleModuleReturnNullWithEmptyInput) { Result ret; if (!iglDev_->hasFeature(DeviceFeatures::ShaderLibrary)) { GTEST_SKIP() << "Shader Libraries are unsupported for this platform."; return; } auto shaderLibrary = ShaderLibraryCreator::fromStringInput( *iglDev_, "", {{.stage = ShaderStage::Vertex, .entryPoint = ""}}, "", &ret); ASSERT_TRUE(!ret.isOk()); ASSERT_TRUE(shaderLibrary == nullptr); } TEST_F(ShaderLibraryTest, CreateFromSourceMultipleModules) { Result ret; if (!iglDev_->hasFeature(DeviceFeatures::ShaderLibrary)) { GTEST_SKIP() << "Shader Libraries are unsupported for this platform."; return; } const char* source = nullptr; if (iglDev_->getBackendType() == igl::BackendType::Metal) { source = data::shader::kMtlSimpleShader.data(); } else if (iglDev_->getBackendType() == igl::BackendType::Vulkan) { GTEST_SKIP() << "Vulkan does not support multiple modules from the same source code."; return; } else if (iglDev_->getBackendType() == igl::BackendType::D3D12) { source = data::shader::kD3D12SimpleShader.data(); } // Check if source is null before passing it to fromStringInput if (source == nullptr) { GTEST_SKIP() << "No shader source available for this backend."; return; } auto shaderLibrary = ShaderLibraryCreator::fromStringInput( *iglDev_, source, { {.stage = ShaderStage::Vertex, .entryPoint = "vertexShader"}, {.stage = ShaderStage::Fragment, .entryPoint = "fragmentShader"}, }, "", &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(shaderLibrary != nullptr); auto vertShaderModule = shaderLibrary->getShaderModule("vertexShader"); ASSERT_TRUE(vertShaderModule); auto fragShaderModule = shaderLibrary->getShaderModule("fragmentShader"); ASSERT_TRUE(fragShaderModule); } TEST_F(ShaderLibraryTest, CreateFromSourceNoResult) { if (!iglDev_->hasFeature(DeviceFeatures::ShaderLibrary)) { GTEST_SKIP() << "Shader Libraries are unsupported for this platform."; return; } const char* source = nullptr; if (iglDev_->getBackendType() == igl::BackendType::Metal) { source = data::shader::kMtlSimpleShader.data(); } else if (iglDev_->getBackendType() == igl::BackendType::Vulkan) { source = data::shader::kVulkanSimpleVertShader.data(); } else if (iglDev_->getBackendType() == igl::BackendType::D3D12) { source = data::shader::kD3D12SimpleShader.data(); } else { IGL_DEBUG_ASSERT_NOT_REACHED(); } // Check if source is null before passing it to fromStringInput if (source == nullptr) { GTEST_SKIP() << "No shader source available for this backend."; return; } auto shaderLibrary = ShaderLibraryCreator::fromStringInput( *iglDev_, source, {{.stage = ShaderStage::Vertex, .entryPoint = "vertexShader"}}, "", nullptr); ASSERT_TRUE(shaderLibrary != nullptr); auto vertShaderModule = shaderLibrary->getShaderModule("vertexShader"); ASSERT_TRUE(vertShaderModule); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ShaderModule.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "data/ShaderData.h" #include "util/Common.h" #include #include namespace igl::tests { class ShaderModuleTest : public ::testing::Test { private: public: ShaderModuleTest() = default; ~ShaderModuleTest() override = default; // // SetUp() // void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_TRUE(iglDev_ != nullptr); ASSERT_TRUE(cmdQueue_ != nullptr); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; const std::string backend_ = IGL_BACKEND_TYPE; }; // // CompileShaderModuleReturnNull // // This test makes sure that when an invalid shader is given, // compileShaderModule() gives back a nullptr. We had cases where even // with an invalid shader, the module still returns a partially // initialized object. // TEST_F(ShaderModuleTest, CompileShaderModuleReturnNull) { Result ret; // Vulkan backend has hard coded asserts that we cannot get past. // Manually verified that it will assert if this test were to go // through, and therefore it's catching the failure. if (backend_ == util::kBackendVul) { return; } auto shaderModule = ShaderModuleCreator::fromStringInput(*iglDev_, "hello world", {.stage = ShaderStage::Vertex, .entryPoint = "Mordor"}, "test", &ret); ASSERT_TRUE(!ret.isOk()); ASSERT_TRUE(shaderModule == nullptr); } TEST_F(ShaderModuleTest, CompileShaderModuleReturnNullWithEmptyInput) { Result ret; auto shaderModule = ShaderModuleCreator::fromStringInput( *iglDev_, "", {.stage = ShaderStage::Vertex, .entryPoint = ""}, "test", &ret); ASSERT_TRUE(!ret.isOk()); ASSERT_TRUE(shaderModule == nullptr); } TEST_F(ShaderModuleTest, CompileShaderModule) { Result ret; const char* source = nullptr; const auto be = iglDev_->getBackendType(); if (be == BackendType::OpenGL) { source = data::shader::kOglSimpleVertShader.data(); } else if (be == BackendType::Metal) { source = data::shader::kMtlSimpleShader.data(); } else if (be == BackendType::Vulkan) { source = data::shader::kVulkanSimpleVertShader.data(); } else if (be == BackendType::D3D12) { // Minimal HLSL vertex shader for D3D12 backend source = R"( struct VSIn { float4 position_in : POSITION; float2 uv_in : TEXCOORD0; }; struct VSOut { float4 position : SV_POSITION; float2 uv : TEXCOORD0; }; VSOut vertexShader(VSIn i) { VSOut o; o.position = i.position_in; o.uv = i.uv_in; return o; } VSOut main(VSIn i) { return vertexShader(i); } )"; } else { ASSERT_TRUE(0); } auto shaderModule = ShaderModuleCreator::fromStringInput( *iglDev_, source, {.stage = ShaderStage::Vertex, .entryPoint = (be == BackendType::D3D12) ? std::string("main") : std::string("vertexShader")}, "test", &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(shaderModule != nullptr); } TEST_F(ShaderModuleTest, ShaderCompilerOptionsEquality) { ShaderCompilerOptions options1; ShaderCompilerOptions options2; // Default values should be equal EXPECT_TRUE(options1 == options2); EXPECT_FALSE(options1 != options2); // Modify one and they should be unequal options2.fastMathEnabled = false; EXPECT_FALSE(options1 == options2); EXPECT_TRUE(options1 != options2); // Make them equal again options1.fastMathEnabled = false; EXPECT_TRUE(options1 == options2); EXPECT_FALSE(options1 != options2); } TEST_F(ShaderModuleTest, ShaderModuleDescEquality) { ShaderModuleDesc desc1 = ShaderModuleDesc::fromStringInput( "test source", {.stage = ShaderStage::Vertex, .entryPoint = "main"}, "debugName"); ShaderModuleDesc desc2 = ShaderModuleDesc::fromStringInput( "test source", {.stage = ShaderStage::Vertex, .entryPoint = "main"}, "debugName"); // Same content should be equal EXPECT_TRUE(desc1 == desc2); EXPECT_FALSE(desc1 != desc2); // Different debug name should be unequal ShaderModuleDesc desc3 = ShaderModuleDesc::fromStringInput( "test source", {.stage = ShaderStage::Vertex, .entryPoint = "main"}, "differentDebugName"); EXPECT_FALSE(desc1 == desc3); EXPECT_TRUE(desc1 != desc3); } TEST_F(ShaderModuleTest, ShaderLibraryDescEquality) { std::vector moduleInfo1 = { {.stage = ShaderStage::Vertex, .entryPoint = "vertMain"}}; std::vector moduleInfo2 = { {.stage = ShaderStage::Vertex, .entryPoint = "vertMain"}}; ShaderLibraryDesc desc1 = ShaderLibraryDesc::fromStringInput("test source", moduleInfo1, "debugName"); ShaderLibraryDesc desc2 = ShaderLibraryDesc::fromStringInput("test source", moduleInfo2, "debugName"); // Same content should be equal EXPECT_TRUE(desc1 == desc2); EXPECT_FALSE(desc1 != desc2); // Different debug name should be unequal ShaderLibraryDesc desc3 = ShaderLibraryDesc::fromStringInput("test source", moduleInfo1, "differentDebugName"); EXPECT_FALSE(desc1 == desc3); EXPECT_TRUE(desc1 != desc3); } TEST_F(ShaderModuleTest, CompileShaderModuleNoResult) { const char* source = nullptr; const auto be2 = iglDev_->getBackendType(); if (be2 == BackendType::OpenGL) { source = data::shader::kOglSimpleVertShader.data(); } else if (be2 == BackendType::Metal) { source = data::shader::kMtlSimpleShader.data(); } else if (be2 == BackendType::Vulkan) { source = data::shader::kVulkanSimpleVertShader.data(); } else if (be2 == BackendType::D3D12) { // Minimal HLSL vertex shader for D3D12 backend source = R"( struct VSIn { float4 position_in : POSITION; float2 uv_in : TEXCOORD0; }; struct VSOut { float4 position : SV_POSITION; float2 uv : TEXCOORD0; }; VSOut vertexShader(VSIn i) { VSOut o; o.position = i.position_in; o.uv = i.uv_in; return o; } VSOut main(VSIn i) { return vertexShader(i); } )"; } else { ASSERT_TRUE(0); } auto shaderModule = ShaderModuleCreator::fromStringInput( *iglDev_, source, {.stage = ShaderStage::Vertex, .entryPoint = (be2 == BackendType::D3D12) ? std::string("main") : std::string("vertexShader")}, "test", nullptr); ASSERT_TRUE(shaderModule != nullptr); } } // namespace igl::tests ================================================ FILE: src/igl/tests/Texture.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "Texture.h" #include "data/TextureData.h" #include "util/TextureValidationHelpers.h" #include namespace igl::tests { TEST_F(TextureTest, Upload) { Result ret; //------------------------------------- // Create input texture and upload data //------------------------------------- const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kOffscreenTexWidth, kOffscreenTexHeight, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); inputTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(inputTexture_ != nullptr); auto rangeDesc = TextureRangeDesc::new2D(0, 0, kOffscreenTexWidth, kOffscreenTexHeight); inputTexture_->upload(rangeDesc, data::texture::kTexRgba2x2.data()); //---------------- // Validate data //---------------- util::validateUploadedTexture( *iglDev_, *cmdQueue_, inputTexture_, data::texture::kTexRgba2x2.data(), "Passthrough"); } // // Texture Passthrough Test // // This test uses a simple shader to copy the input texture to a same // sized output texture (offscreenTexture_) // TEST_F(TextureTest, Passthrough) { Result ret; std::shared_ptr pipelineState; //------------------------------------- // Create input texture and upload data //------------------------------------- const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kOffscreenTexWidth, kOffscreenTexHeight, TextureDesc::TextureUsageBits::Sampled); inputTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(inputTexture_ != nullptr); auto rangeDesc = TextureRangeDesc::new2D(0, 0, kOffscreenTexWidth, kOffscreenTexHeight); inputTexture_->upload(rangeDesc, data::texture::kTexRgba2x2.data()); //---------------- // Create Pipeline //---------------- pipelineState = iglDev_->createRenderPipeline(renderPipelineDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(pipelineState != nullptr); //------- // Render //------- cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(cmdBuf_ != nullptr); auto cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, framebuffer_); cmds->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmds->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); cmds->bindRenderPipelineState(pipelineState); cmds->bindTexture(textureUnit_, BindTarget::kFragment, inputTexture_.get()); cmds->bindSamplerState(textureUnit_, BindTarget::kFragment, samp_.get()); cmds->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmds->drawIndexed(6); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); cmdBuf_->waitUntilCompleted(); //---------------- // Validate output //---------------- util::validateFramebufferTexture( *iglDev_, *cmdQueue_, *framebuffer_, data::texture::kTexRgba2x2.data(), "Passthrough"); } // // This test uses a simple shader to copy the input texture with a // texture to a same sized output texture (offscreenTexture_) // The difference between this test and PassthroughTexture is that // a section of the original input texture is updated. This is meant // to exercise the sub-texture upload path. // TEST_F(TextureTest, PassthroughSubTexture) { Result ret; std::shared_ptr pipelineState; //------------------------------------------------------ // Create input texture and sub-texture, and upload data //------------------------------------------------------ const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kOffscreenTexWidth, kOffscreenTexHeight, TextureDesc::TextureUsageBits::Sampled); inputTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(inputTexture_ != nullptr); const auto rangeDesc = TextureRangeDesc::new2D(0, 0, kOffscreenTexWidth, kOffscreenTexHeight); inputTexture_->upload(rangeDesc, data::texture::kTexRgba2x2.data()); // Upload right lower corner as a single-pixel sub-texture. auto singlePixelDesc = TextureRangeDesc::new2D(kOffscreenTexWidth - 1, kOffscreenTexHeight - 1, 1, 1); int32_t singlePixelColor = 0x44332211; inputTexture_->upload(singlePixelDesc, &singlePixelColor); //---------------- // Create Pipeline //---------------- pipelineState = iglDev_->createRenderPipeline(renderPipelineDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(pipelineState != nullptr); //------- // Render //------- cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(cmdBuf_ != nullptr); auto cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, framebuffer_); cmds->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmds->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); cmds->bindRenderPipelineState(pipelineState); cmds->bindTexture(textureUnit_, BindTarget::kFragment, inputTexture_.get()); cmds->bindSamplerState(textureUnit_, BindTarget::kFragment, samp_.get()); cmds->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmds->drawIndexed(6); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); cmdBuf_->waitUntilCompleted(); //---------------- // Validate output //---------------- util::validateFramebufferTexture(*iglDev_, *cmdQueue_, *framebuffer_, data::texture::kTexRgba2x2Modified.data(), "PassthroughSubTexture"); } // // Framebuffer to Texture Copy Test // // This test will exercise the copy functionality via the following steps: // 1. clear FB to (0.5, 0.5, 0.5, 0.5) // 2. Copy content to a texture // 3. clear FB to (0, 0, 0, 0) and verify it is cleared // 4. Copy texture content to FB // 5. Verify that the FB is back to (0.5, 0.5, 0.5, 0.5) // TEST_F(TextureTest, FBCopy) { Result ret; std::shared_ptr pipelineState; std::shared_ptr dstTexture; const auto rangeDesc = TextureRangeDesc::new2D(0, 0, kOffscreenTexWidth, kOffscreenTexHeight); //-------------------------------- // Create copy destination texture //-------------------------------- TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kOffscreenTexWidth, kOffscreenTexHeight, TextureDesc::TextureUsageBits::Sampled); texDesc.debugName = "Texture: TextureTest::FBCopy::dstTexture"; dstTexture = iglDev_->createTexture(texDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(dstTexture != nullptr); //---------------- // Create Pipeline //---------------- pipelineState = iglDev_->createRenderPipeline(renderPipelineDesc_, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(pipelineState != nullptr); //--------------------------------- // Clear FB to {0.5, 0.5, 0.5, 0.5} //--------------------------------- renderPass_.colorAttachments[0].clearColor = {0.501f, 0.501f, 0.501f, 0.501f}; cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); auto cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, framebuffer_); cmds->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmds->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); cmds->bindRenderPipelineState(pipelineState); // draw 0 indices here just to clear the FB cmds->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmds->drawIndexed(0); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); cmdBuf_->waitUntilCompleted(); //---------------------------------------------------------------------- // Validate framebuffer texture //---------------------------------------------------------------------- util::validateFramebufferTexture(*iglDev_, *cmdQueue_, *framebuffer_, data::texture::kTexRgbaGray2x2.data(), "After Initial Clear"); //------------------------ // Copy content to texture //------------------------ framebuffer_->copyTextureColorAttachment(*cmdQueue_, 0, dstTexture, rangeDesc); //------------------------- // Clear FB to {0, 0, 0, 0} //------------------------- renderPass_.colorAttachments[0].clearColor = {0, 0, 0, 0}; cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, framebuffer_); cmds->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmds->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); cmds->bindRenderPipelineState(pipelineState); cmds->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmds->drawIndexed(0); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); cmdBuf_->waitUntilCompleted(); //----------------------------------- // Validate framebuffer texture again //----------------------------------- util::validateFramebufferTexture(*iglDev_, *cmdQueue_, *framebuffer_, data::texture::kTexRgbaClear2x2.data(), "After Second Clear"); //--------------------------------------------- // Copy dstTexture to FB so we can read it back //--------------------------------------------- cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, framebuffer_); cmds->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmds->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); cmds->bindRenderPipelineState(pipelineState); // Using dstTexture as input here cmds->bindTexture(textureUnit_, BindTarget::kFragment, dstTexture.get()); cmds->bindSamplerState(textureUnit_, BindTarget::kFragment, samp_.get()); cmds->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmds->drawIndexed(6); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); cmdBuf_->waitUntilCompleted(); //------------------------------------------------------ // Read back framebuffer. Should be {0.5, 0.5, 0.5, 0.5} //------------------------------------------------------ util::validateFramebufferTexture( *iglDev_, *cmdQueue_, *framebuffer_, data::texture::kTexRgbaGray2x2.data(), "After Copy"); } constexpr uint32_t kAlignedPixelsWidth = 3u; constexpr uint32_t kAlignedPixelsHeight = 2u; constexpr std::array kPixelsAligned12 = {1u, 2u, 3u, 4u, 5u, 6u}; // clang-format off constexpr std::array kPixelsAligned14 = { 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, // Expected to be skipped 4, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 0, 0, // Expected to be skipped }; // clang-format on constexpr std::array kPixelsAligned16 = {1u, 2u, 3u, 0x00000000u, // Expected to be skipped 4u, 5u, 6u, 0x00000000u}; // Expected to be skipped constexpr std::array kPixelsAligned20 = {1u, 2u, 3u, 0x00000000u, // Expected to be skipped 0x00000000u, // Expected to be skipped 4u, 5u, 6u, 0x00000000u, // Expected to be skipped 0x00000000u}; // Expected to be skipped constexpr std::array, 4> kPixelAlignments = { // 12 byte row will triggers 4 byte alignment. // No padding required since the width equals number of input pixels per row. std::make_pair(kPixelsAligned12.data(), kAlignedPixelsWidth * 4u), // 14 byte row will trigger 2 byte alignment since texture width is set to 3. // Padding of 0.5 pixels used per row of width 3. std::make_pair(kPixelsAligned14.data(), kAlignedPixelsWidth * 4u + 2u), // 16 byte row will trigger 8 byte alignment since texture width is set to 3. // Padding of 1 pixel used per row of width 3. std::make_pair(kPixelsAligned16.data(), (kAlignedPixelsWidth + 1u) * 4u), // 20 byte row is neither 8, 4, 2, nor 1 byte aligned. // Padding of 2 pixels used per row of width 3. std::make_pair(kPixelsAligned20.data(), (kAlignedPixelsWidth + 2u) * 4u), }; // // Test ITexture::repackData // TEST_F(TextureTest, RepackData) { const auto properties = TextureFormatProperties::fromTextureFormat(TextureFormat::RGBA_UNorm8); const auto range = TextureRangeDesc::new2D(0, 0, kAlignedPixelsWidth, kAlignedPixelsHeight); for (const auto& [data, bytesPerRow] : kPixelAlignments) { const size_t alignedSize = static_cast(kAlignedPixelsWidth) * static_cast(kAlignedPixelsHeight); const size_t unalignedSize = static_cast(kAlignedPixelsHeight) * static_cast(bytesPerRow); { //------------------ // Test packing data //------------------ std::vector packedData(alignedSize); ITexture::repackData(properties, range, static_cast(data), bytesPerRow, reinterpret_cast(packedData.data()), 0); for (size_t i = 0; i < packedData.size(); ++i) { EXPECT_EQ(packedData[i], kPixelsAligned12[i]); } } { //----------------------------- // Test packing + flipping data //----------------------------- std::vector packedFlippedData(alignedSize); ITexture::repackData(properties, range, static_cast(data), bytesPerRow, reinterpret_cast(packedFlippedData.data()), 0, true); for (size_t i = 0; i < kAlignedPixelsWidth; ++i) { EXPECT_EQ(packedFlippedData[i], kPixelsAligned12[i + kAlignedPixelsWidth]); EXPECT_EQ(packedFlippedData[i + kAlignedPixelsWidth], kPixelsAligned12[i]); } } { //-------------------- // Test unpacking data //-------------------- std::vector unpackedData(unalignedSize); ITexture::repackData(properties, range, reinterpret_cast(kPixelsAligned12.data()), 0, unpackedData.data(), bytesPerRow); for (size_t i = 0; i < unpackedData.size(); ++i) { EXPECT_EQ(unpackedData[i], reinterpret_cast(data)[i]); } } { //------------------------------- // Test unpacking + flipping data //------------------------------- std::vector unpackedFlippedData(unalignedSize); ITexture::repackData(properties, range, reinterpret_cast(kPixelsAligned12.data()), 0, unpackedFlippedData.data(), bytesPerRow, true); const auto width = unpackedFlippedData.size() / 2; for (size_t i = 0; i < width; ++i) { EXPECT_EQ(unpackedFlippedData[i + width], reinterpret_cast(data)[i]); EXPECT_EQ(unpackedFlippedData[i], reinterpret_cast(data)[i + width]); } } } } // // Pixel upload alignment test // // In openGL, when writing to a gpu texture from cpu memory the cpu memory pixel rows can be // packed a couple of different ways 1, 2, 4 or 8 byte aligned. This test ensures bytesPerRow gets // converted to the correct byte alignment in openGL and works as expected in metal // // If a row has 3 RGBA pixels but is 8 byte aligned the row will be 16 bytes with the last 4 bytes // being ignored. If it was instead 1, 2 or 4 byte aligned the row would be 12 bytes as 12 is // divisible by a single pixels byte size. // // Expected output: Pixels read out are correct even when different bytes per pixel are used // during upload. // // Note: This test only covers 4 and 8 byte alignment because copyBytesColorAttachment does not // support reading non 4 byte formats // TEST_F(TextureTest, UploadAlignment) { Result ret; std::shared_ptr pipelineState; //------------------------------------- // Create new frame buffer with a width and height that can cause different alignments //------------------------------------- TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kAlignedPixelsWidth, kAlignedPixelsHeight, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); auto customOffscreenTexture = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(customOffscreenTexture != nullptr); FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = customOffscreenTexture; auto customFramebuffer = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(customFramebuffer != nullptr); for (const auto& [data, bytesPerRow] : kPixelAlignments) { //------------------------------------- // Create input texture and upload data //------------------------------------- texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kAlignedPixelsWidth, kAlignedPixelsHeight, TextureDesc::TextureUsageBits::Sampled); inputTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(inputTexture_ != nullptr); const auto rangeDesc = TextureRangeDesc::new2D(0, 0, kAlignedPixelsWidth, kAlignedPixelsHeight); inputTexture_->upload(rangeDesc, data, static_cast(bytesPerRow)); //---------------- // Create Pipeline //---------------- pipelineState = iglDev_->createRenderPipeline(renderPipelineDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(pipelineState != nullptr); //------- // Render //------- cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(cmdBuf_ != nullptr); auto cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, customFramebuffer); cmds->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmds->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); cmds->bindRenderPipelineState(pipelineState); cmds->bindTexture(textureUnit_, BindTarget::kFragment, inputTexture_.get()); cmds->bindSamplerState(textureUnit_, BindTarget::kFragment, samp_.get()); cmds->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmds->drawIndexed(6); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); cmdBuf_->waitUntilCompleted(); //---------------- // Validate output //---------------- const std::string alignmentStr = "UploadAlignment: " + std::to_string(bytesPerRow); util::validateFramebufferTexture( *iglDev_, *cmdQueue_, *customFramebuffer, kPixelsAligned12.data(), alignmentStr.c_str()); } } // // Texture Resize Test // // This test uses a simple shader to copy the input texture to a different // sized output texture (offscreenTexture_) // TEST_F(TextureTest, Resize) { Result ret; std::shared_ptr pipelineState; constexpr uint32_t kInputTexWidth = 10u; constexpr uint32_t kInputTexHeight = 40u; constexpr uint32_t kOutputTexWidth = 5u; constexpr uint32_t kOutputTexHeight = 5u; constexpr size_t kTextureSize = static_cast(kInputTexWidth) * static_cast(kInputTexHeight); //------------------------------------- // Create input texture and upload data //------------------------------------- TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kInputTexWidth, kInputTexHeight, TextureDesc::TextureUsageBits::Sampled); inputTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(inputTexture_ != nullptr); auto rangeDesc = TextureRangeDesc::new2D(0, 0, kInputTexWidth, kInputTexHeight); // Allocate input texture and set color to 0x80808080 std::vector inputTexData(kTextureSize, 0x80808080); inputTexture_->upload(rangeDesc, inputTexData.data()); //------------------------------------------------------------------------ // Create a different sized output texture, and attach it to a framebuffer //------------------------------------------------------------------------ texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kOutputTexWidth, kOutputTexHeight, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); auto outputTex = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(outputTex != nullptr); // Create framebuffer using the output texture FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = outputTex; auto fb = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(fb != nullptr); //---------------- // Create Pipeline //---------------- pipelineState = iglDev_->createRenderPipeline(renderPipelineDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(pipelineState != nullptr); //------- // Render //------- cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(cmdBuf_ != nullptr); auto cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, fb); cmds->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmds->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); cmds->bindRenderPipelineState(pipelineState); cmds->bindTexture(textureUnit_, BindTarget::kFragment, inputTexture_.get()); cmds->bindSamplerState(textureUnit_, BindTarget::kFragment, samp_.get()); cmds->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmds->drawIndexed(6); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); cmdBuf_->waitUntilCompleted(); //---------------- // Validate output //---------------- util::validateFramebufferTexture( *iglDev_, *cmdQueue_, *fb, data::texture::kTexRgbaGray5x5.data(), "Resize"); } // // Similar to "Texture Resize Test" but uses a texture view // TEST_F(TextureTest, ResizeTextureView) { if (!iglDev_->hasFeature(DeviceFeatures::TextureViews)) { GTEST_SKIP() << "Texture views not supported. Skipping."; } Result ret; std::shared_ptr pipelineState; constexpr uint32_t kInputTexWidth = 10u; constexpr uint32_t kInputTexHeight = 40u; constexpr uint32_t kOutputTexWidth = 5u; constexpr uint32_t kOutputTexHeight = 5u; constexpr size_t kTextureSize = static_cast(kInputTexWidth) * static_cast(kInputTexHeight); //------------------------------------- // Create input texture and upload data //------------------------------------- TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kInputTexWidth, kInputTexHeight, TextureDesc::TextureUsageBits::Sampled); inputTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(inputTexture_ != nullptr); auto rangeDesc = TextureRangeDesc::new2D(0, 0, kInputTexWidth, kInputTexHeight); // Allocate input texture and set color to 0x80808080 std::vector inputTexData(kTextureSize, 0x80808080); inputTexture_->upload(rangeDesc, inputTexData.data()); //------------------------------------------------------------------------ // Create a different sized output texture, and attach it to a framebuffer //------------------------------------------------------------------------ texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kOutputTexWidth, kOutputTexHeight, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); auto baseTex = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(baseTex != nullptr); auto outputTex = iglDev_->createTextureView(baseTex, { .layer = 0, .numLayers = 1, .mipLevel = 0, .numMipLevels = 1, .debugName = "outputTex", }, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(outputTex != nullptr); // Create framebuffer using the output texture FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = outputTex; auto fb = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(fb != nullptr); //---------------- // Create Pipeline //---------------- pipelineState = iglDev_->createRenderPipeline(renderPipelineDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(pipelineState != nullptr); //------- // Render //------- cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(cmdBuf_ != nullptr); auto cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, fb); cmds->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmds->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); cmds->bindRenderPipelineState(pipelineState); cmds->bindTexture(textureUnit_, BindTarget::kFragment, inputTexture_.get()); cmds->bindSamplerState(textureUnit_, BindTarget::kFragment, samp_.get()); cmds->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmds->drawIndexed(6); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); cmdBuf_->waitUntilCompleted(); //---------------- // Validate output //---------------- util::validateFramebufferTexture( *iglDev_, *cmdQueue_, *fb, data::texture::kTexRgbaGray5x5.data(), "Resize"); } // // Texture Validate Range 2D // // This test validates some of the logic in validateRange for 2D textures. // TEST_F(TextureTest, ValidateRange2D) { Result ret; auto texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 8, 8, TextureDesc::TextureUsageBits::Sampled); auto tex = iglDev_->createTexture(texDesc, &ret); ret = tex->validateRange(TextureRangeDesc::new2D(0, 0, 8, 8)); EXPECT_TRUE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::new2D(4, 4, 4, 4)); EXPECT_TRUE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::new2D(0, 0, 4, 4, 1)); EXPECT_FALSE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::new2D(0, 0, 12, 12)); EXPECT_FALSE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::new2D(0, 0, 0, 0)); EXPECT_FALSE(ret.isOk()); } // // Texture Validate Range Cube // // This test validates some of the logic in validateRange for Cube textures. // TEST_F(TextureTest, ValidateRangeCube) { Result ret; auto texDesc = TextureDesc::newCube( TextureFormat::RGBA_UNorm8, 8, 8, TextureDesc::TextureUsageBits::Sampled); auto tex = iglDev_->createTexture(texDesc, &ret); ret = tex->validateRange(TextureRangeDesc::newCube(0, 0, 8, 8)); EXPECT_TRUE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::newCubeFace(0, 0, 8, 8, 1)); EXPECT_TRUE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::newCubeFace(0, 0, 8, 8, TextureCubeFace::NegX)); EXPECT_TRUE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::newCube(4, 4, 4, 4)); EXPECT_TRUE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::newCubeFace(4, 4, 4, 4, 1)); EXPECT_TRUE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::newCubeFace(4, 4, 4, 4, TextureCubeFace::NegX)); EXPECT_TRUE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::newCube(0, 0, 4, 4, 1)); EXPECT_FALSE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::newCubeFace(0, 0, 4, 4, 1, 1)); EXPECT_FALSE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::newCubeFace(0, 0, 4, 4, TextureCubeFace::NegX, 1)); EXPECT_FALSE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::newCube(0, 0, 12, 12)); EXPECT_FALSE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::newCubeFace(0, 0, 12, 12, 1)); EXPECT_FALSE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::newCubeFace(0, 0, 12, 12, TextureCubeFace::NegX)); EXPECT_FALSE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::newCube(0, 0, 0, 0)); EXPECT_FALSE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::newCubeFace(0, 0, 0, 0, 1)); EXPECT_FALSE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::newCubeFace(0, 0, 0, 0, TextureCubeFace::NegX)); EXPECT_FALSE(ret.isOk()); } // // Texture Validate Range 3D // // This test validates some of the logic in validateRange for 3D textures. // TEST_F(TextureTest, ValidateRange3D) { if (!iglDev_->hasFeature(DeviceFeatures::Texture3D)) { GTEST_SKIP() << "3D textures not supported. Skipping."; } Result ret; auto texDesc = TextureDesc::new3D( TextureFormat::RGBA_UNorm8, 8, 8, 8, TextureDesc::TextureUsageBits::Sampled); auto tex = iglDev_->createTexture(texDesc, &ret); ret = tex->validateRange(TextureRangeDesc::new3D(0, 0, 0, 8, 8, 8)); EXPECT_TRUE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::new3D(4, 4, 4, 4, 4, 4)); EXPECT_TRUE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::new3D(0, 0, 0, 4, 4, 4, 1)); EXPECT_FALSE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::new3D(0, 0, 0, 12, 12, 12)); EXPECT_FALSE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::new3D(0, 0, 0, 0, 0, 0)); EXPECT_FALSE(ret.isOk()); } // // Texture Export Support Test // // This test verifies: // 1. NoExport textures can be created and used on all platforms // 2. Exportable textures work only on supported platforms // 3. Basic texture operations work for both types where supported // TEST_F(TextureTest, ExportableTexture) { Result ret; // Test NoExport texture (should work on all platforms) auto texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 8, 8, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); texDesc.exportability = TextureDesc::TextureExportability::NoExport; auto texNoExport = iglDev_->createTexture(texDesc, &ret); EXPECT_TRUE(ret.isOk()); ASSERT_TRUE(texNoExport != nullptr); // Verify basic texture operations auto rangeDesc = TextureRangeDesc::new2D(0, 0, 8, 8); std::vector inputData(64, 0x80808080); texNoExport->upload(rangeDesc, inputData.data()); util::validateUploadedTexture(*iglDev_, *cmdQueue_, texNoExport, inputData.data(), "NoExport"); // Test Exportable texture (platform dependent) texDesc.exportability = TextureDesc::TextureExportability::Exportable; auto texExportable = iglDev_->createTexture(texDesc, &ret); #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_LINUX || IGL_PLATFORM_ANDROID if (iglDev_->getBackendType() == BackendType::Vulkan) { EXPECT_TRUE(ret.isOk()); ASSERT_TRUE(texExportable != nullptr); // Verify basic texture operations texExportable->upload(rangeDesc, inputData.data()); util::validateUploadedTexture( *iglDev_, *cmdQueue_, texExportable, inputData.data(), "Exportable"); } else { EXPECT_EQ(ret.code, Result::Code::Unimplemented); ASSERT_TRUE(texExportable == nullptr); } #else EXPECT_EQ(ret.code, Result::Code::Unimplemented); ASSERT_TRUE(texExportable == nullptr); #endif } } // namespace igl::tests ================================================ FILE: src/igl/tests/Texture.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "data/ShaderData.h" #include "data/VertexIndexData.h" #include "util/Common.h" #include #include #include #include #include #include #include #include #include namespace igl::tests { // Picking this just to match the texture we will use. If you use a different // size texture, then you will have to either create a new offscreenTexture_ // and the framebuffer object in your test, so know exactly what the end result // would be after sampling constexpr uint32_t kOffscreenTexWidth = 2u; constexpr uint32_t kOffscreenTexHeight = 2u; // // TextureTest // // Test fixture for all the tests in this file. Takes care of common // initialization and allocating of common resources. // class TextureTest : public ::testing::Test { private: public: TextureTest() = default; ~TextureTest() override = default; // // SetUp() // // This function sets up a render pass and a graphics pipeline descriptor // so it is ready to render a simple quad with an input texture to an // offscreen texture. // // The actual creation of the graphics pipeline state object is left // to each test so that tests can replace the default settings with // something more appropriate. // void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_TRUE(iglDev_ != nullptr); ASSERT_TRUE(cmdQueue_ != nullptr); // Create an offscreen texture to render to TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kOffscreenTexWidth, kOffscreenTexHeight, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); texDesc.debugName = "test"; Result ret; offscreenTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok) << ret.message; ASSERT_TRUE(offscreenTexture_ != nullptr); // Create framebuffer using the offscreen texture FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = offscreenTexture_; framebuffer_ = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(framebuffer_ != nullptr); // Initialize render pass descriptor renderPass_.colorAttachments.resize(1); renderPass_.colorAttachments[0].loadAction = LoadAction::Clear; renderPass_.colorAttachments[0].storeAction = StoreAction::Store; renderPass_.colorAttachments[0].clearColor = {0.0, 0.0, 0.0, 1.0}; // Initialize shader stages std::unique_ptr stages; igl::tests::util::createSimpleShaderStages(iglDev_, stages); shaderStages_ = std::move(stages); // Initialize input to vertex shader VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Float4; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].bufferIndex = data::shader::kSimplePosIndex; inputDesc.attributes[0].name = data::shader::kSimplePos; inputDesc.attributes[0].location = 0; inputDesc.inputBindings[0].stride = sizeof(float) * 4; inputDesc.attributes[1].format = VertexAttributeFormat::Float2; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].bufferIndex = data::shader::kSimpleUvIndex; inputDesc.attributes[1].name = data::shader::kSimpleUv; inputDesc.attributes[1].location = 1; inputDesc.inputBindings[1].stride = sizeof(float) * 2; // numAttributes has to equal to bindings when using more than 1 buffer inputDesc.numAttributes = inputDesc.numInputBindings = 2; vertexInputState_ = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vertexInputState_ != nullptr); // Initialize index buffer BufferDesc bufDesc; bufDesc.type = BufferDesc::BufferTypeBits::Index; bufDesc.data = data::vertex_index::kQuadInd.data(); bufDesc.length = sizeof(data::vertex_index::kQuadInd); ib_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(ib_ != nullptr); // Initialize vertex and sampler buffers bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data::vertex_index::kQuadVert.data(); bufDesc.length = sizeof(data::vertex_index::kQuadVert); vb_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vb_ != nullptr); bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data::vertex_index::kQuadUv.data(); bufDesc.length = sizeof(data::vertex_index::kQuadUv); uv_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(uv_ != nullptr); // Initialize sampler state const SamplerStateDesc samplerDesc; samp_ = iglDev_->createSamplerState(samplerDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(samp_ != nullptr); // Initialize Graphics Pipeline Descriptor, but leave the creation // to the individual tests in case further customization is required renderPipelineDesc_.vertexInputState = vertexInputState_; renderPipelineDesc_.shaderStages = shaderStages_; renderPipelineDesc_.targetDesc.colorAttachments.resize(1); renderPipelineDesc_.targetDesc.colorAttachments[0].textureFormat = offscreenTexture_->getFormat(); renderPipelineDesc_.fragmentUnitSamplerMap[textureUnit_] = IGL_NAMEHANDLE(data::shader::kSimpleSampler); renderPipelineDesc_.cullMode = igl::CullMode::Disabled; } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; std::shared_ptr cmdBuf_; CommandBufferDesc cbDesc_ = {}; const std::string backend_ = IGL_BACKEND_TYPE; RenderPassDesc renderPass_; std::shared_ptr offscreenTexture_; std::shared_ptr framebuffer_; // Currently it is left to individual tests to initialize this std::shared_ptr inputTexture_; std::shared_ptr shaderStages_; std::shared_ptr vertexInputState_; std::shared_ptr vb_, uv_, ib_; std::shared_ptr samp_; RenderPipelineDesc renderPipelineDesc_; size_t textureUnit_ = 0; }; } // namespace igl::tests ================================================ FILE: src/igl/tests/TextureArray.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "data/ShaderData.h" #include "data/VertexIndexData.h" #include "util/Common.h" #include "util/TextureValidationHelpers.h" #include #include #include #include #include namespace igl::tests { // Picking this just to match the texture we will use. If you use a different // size texture, then you will have to either create a new offscreenTexture_ // and the framebuffer object in your test, so know exactly what the end result // would be after sampling constexpr size_t kOffscreenTexWidth = 2; constexpr size_t kOffscreenTexHeight = 2; constexpr size_t kOffscreenSubTexWidth = 1; constexpr size_t kOffscreenSubTexHeight = 1; struct VertexUniforms { int layer = 0; }; // // TextureArrayTest // // Test fixture for all the tests in this file. Takes care of common // initialization and allocating of common resources. // class TextureArrayTest : public ::testing::Test { private: public: TextureArrayTest() = default; ~TextureArrayTest() override = default; std::shared_ptr createVertexUniformBuffer(IDevice& device, Result* /*result*/) { std::shared_ptr vertUniformBuffer = nullptr; const iglu::ManagedUniformBufferInfo vertInfo = { .index = 2, .length = sizeof(VertexUniforms), .uniforms = { UniformDesc{ .name = "layer", .type = igl::UniformType::Int, .offset = offsetof(VertexUniforms, layer), }, }}; vertUniformBuffer = std::make_shared(device, vertInfo); IGL_DEBUG_ASSERT(vertUniformBuffer->result.isOk()); return vertUniformBuffer; } // // SetUp() // // This function sets up a render pass and a graphics pipeline descriptor // so it is ready to render a simple quad with an input texture to an // offscreen texture. // // The actual creation of the graphics pipeline state object is left // to each test so that tests can replace the default settings with // something more appropriate. // void SetUp() override { #if IGL_PLATFORM_LINUX && !IGL_PLATFORM_LINUX_USE_EGL GTEST_SKIP() << "Fix these tests on Linux"; #endif setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_TRUE(iglDev_ != nullptr); ASSERT_TRUE(cmdQueue_ != nullptr); if (!iglDev_->hasFeature(DeviceFeatures::Texture2DArray)) { GTEST_SKIP() << "2D array texture is unsupported for this platform."; return; } // Create an offscreen texture to render to const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kOffscreenTexWidth, kOffscreenTexHeight, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); Result ret; offscreenTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(offscreenTexture_ != nullptr); // Create framebuffer using the offscreen texture FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = offscreenTexture_; framebuffer_ = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(framebuffer_ != nullptr); // Initialize render pass descriptor renderPass_.colorAttachments.resize(1); renderPass_.colorAttachments[0].loadAction = LoadAction::Clear; renderPass_.colorAttachments[0].storeAction = StoreAction::Store; renderPass_.colorAttachments[0].clearColor = {0.0, 0.0, 0.0, 1.0}; // Initialize shader stages std::unique_ptr stages; if (iglDev_->getBackendType() == BackendType::OpenGL) { #if IGL_BACKEND_OPENGL if (iglDev_->getBackendVersion().flavor == BackendFlavor::OpenGL_ES) { util::createShaderStages(iglDev_, igl::tests::data::shader::kOglSimpleVertShaderTexArrayEs3, igl::tests::data::shader::kShaderFunc, igl::tests::data::shader::kOglSimpleFragShaderTexArrayEs3, igl::tests::data::shader::kShaderFunc, stages); } else { if (!iglDev_->hasRequirement(DeviceRequirement::TextureArrayExtReq)) { util::createShaderStages(iglDev_, igl::tests::data::shader::kOglSimpleVertShaderTexArray, igl::tests::data::shader::kShaderFunc, igl::tests::data::shader::kOglSimpleFragShaderTexArray, igl::tests::data::shader::kShaderFunc, stages); } else if (iglDev_->hasFeature(DeviceFeatures::TextureArrayExt)) { util::createShaderStages(iglDev_, igl::tests::data::shader::kOglSimpleVertShaderTexArrayExt, igl::tests::data::shader::kShaderFunc, igl::tests::data::shader::kOglSimpleFragShaderTexArrayExt, igl::tests::data::shader::kShaderFunc, stages); } } #if defined(IGL_PLATFORM_LINUX) && IGL_PLATFORM_LINUX GTEST_SKIP() << "Temporarily disabled."; #endif #endif // IGL_BACKEND_OPENGL } else if (iglDev_->getBackendType() == BackendType::Vulkan) { util::createShaderStages(iglDev_, igl::tests::data::shader::kVulkanSimpleVertShaderTex2dArray, igl::tests::data::shader::kShaderFunc, igl::tests::data::shader::kVulkanSimpleFragShaderTex2dArray, igl::tests::data::shader::kShaderFunc, stages); } else if (iglDev_->getBackendType() == BackendType::Metal) { util::createShaderStages(iglDev_, igl::tests::data::shader::kMtlSimpleShaderTxt2dArray, igl::tests::data::shader::kSimpleVertFunc, igl::tests::data::shader::kSimpleFragFunc, stages); } else if (iglDev_->getBackendType() == BackendType::D3D12) { util::createShaderStages(iglDev_, igl::tests::data::shader::kD3D12SimpleVertShaderTexArray, igl::tests::data::shader::kShaderFunc, igl::tests::data::shader::kD3D12SimpleFragShaderTexArray, igl::tests::data::shader::kShaderFunc, stages); } ASSERT_TRUE(stages != nullptr); shaderStages_ = std::move(stages); // Initialize input to vertex shader VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Float4; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].bufferIndex = data::shader::kSimplePosIndex; inputDesc.attributes[0].name = data::shader::kSimplePos; inputDesc.attributes[0].location = 0; inputDesc.inputBindings[0].stride = sizeof(float) * 4; inputDesc.attributes[1].format = VertexAttributeFormat::Float2; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].bufferIndex = data::shader::kSimpleUvIndex; inputDesc.attributes[1].name = data::shader::kSimpleUv; inputDesc.attributes[1].location = 1; inputDesc.inputBindings[1].stride = sizeof(float) * 2; // numAttributes has to equal to bindings when using more than 1 buffer inputDesc.numAttributes = inputDesc.numInputBindings = 2; vertexInputState_ = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vertexInputState_ != nullptr); // Initialize index buffer BufferDesc bufDesc; bufDesc.type = BufferDesc::BufferTypeBits::Index; bufDesc.data = data::vertex_index::kQuadInd.data(); bufDesc.length = sizeof(data::vertex_index::kQuadInd); ib_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(ib_ != nullptr); // Initialize vertex and sampler buffers bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data::vertex_index::kQuadVert.data(); bufDesc.length = sizeof(data::vertex_index::kQuadVert); vb_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vb_ != nullptr); // Initialize UV data and sampler buffer bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data::vertex_index::kQuadUv.data(); bufDesc.length = sizeof(data::vertex_index::kQuadUv); uv_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(uv_ != nullptr); // Initialize sampler state const SamplerStateDesc samplerDesc; samp_ = iglDev_->createSamplerState(samplerDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(samp_ != nullptr); // Initialize Graphics Pipeline Descriptor, but leave the creation // to the individual tests in case further customization is required renderPipelineDesc_.vertexInputState = vertexInputState_; renderPipelineDesc_.shaderStages = shaderStages_; renderPipelineDesc_.targetDesc.colorAttachments.resize(1); renderPipelineDesc_.targetDesc.colorAttachments[0].textureFormat = offscreenTexture_->getFormat(); renderPipelineDesc_.fragmentUnitSamplerMap[textureUnit_] = IGL_NAMEHANDLE(data::shader::kSimpleSampler); renderPipelineDesc_.cullMode = igl::CullMode::Disabled; } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; std::shared_ptr cmdBuf_; CommandBufferDesc cbDesc_ = {}; RenderPassDesc renderPass_; std::shared_ptr offscreenTexture_; std::shared_ptr framebuffer_; // Currently it is left to individual tests to initialize this std::shared_ptr inputTexture_; std::shared_ptr shaderStages_; std::shared_ptr vertexInputState_; std::shared_ptr vb_, uv_, ib_; std::shared_ptr samp_; RenderPipelineDesc renderPipelineDesc_; VertexUniforms vertexUniforms_; size_t textureUnit_ = 0; }; constexpr uint32_t kR = 0x1F00000F; constexpr uint32_t kG = 0x002F001F; constexpr uint32_t kB = 0x00003F2F; constexpr uint32_t kC = 0x004F5F3F; constexpr uint32_t kM = 0x6F007F4F; constexpr uint32_t kY = 0x8F9F005F; constexpr size_t kNumLayers = 3; // clang-format off constexpr std::array kTextureData = { kR, kR, kR, kR, // Base Mip, Layer 0 kG, kG, kG, kG, // Base Mip, Layer 1 kB, kB, kB, kB, // Base Mip, Layer 2 kC, // Mip 1, Layer 0 kM, // Mip 1, Layer 1 kY, // Mip 1, Layer 2 }; constexpr std::array kSubTextureData = { kC, // Layer 0 kM, // Layer 1 kY, // Layer 2 }; constexpr std::array kModifiedTextureData = { kR, kR, kR, kC, // Layer 0 kG, kG, kG, kM, // Layer 1 kB, kB, kB, kY, // Layer 2 }; // clang-format on constexpr std::array kTextureLayerData = { kTextureData.data() + 0, kTextureData.data() + 4, kTextureData.data() + 8, }; constexpr std::array kSubTextureLayerData = { kSubTextureData.data() + 0, kSubTextureData.data() + 1, kSubTextureData.data() + 2, }; constexpr std::array kModifiedTextureLayerData = { kModifiedTextureData.data() + 0, kModifiedTextureData.data() + 4, kModifiedTextureData.data() + 8, }; // // Texture Upload Test // // This test uploads data to an array texture and then downloads it again to validate it // namespace { void runUploadTest(IDevice& device, ICommandQueue& cmdQueue, bool singleUpload, bool modifyTexture) { Result ret; const std::shared_ptr pipelineState; //------------------------------------- // Create input texture and upload data //------------------------------------- const TextureDesc texDesc = TextureDesc::new2DArray( TextureFormat::RGBA_UNorm8, kOffscreenTexWidth, kOffscreenTexHeight, kNumLayers, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); auto tex = device.createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(tex != nullptr); // // upload and redownload to make sure that we've uploaded successfully. // if (singleUpload) { const auto uploadRange = TextureRangeDesc::new2DArray(0, 0, kOffscreenTexWidth, kOffscreenTexHeight, 0, kNumLayers); ASSERT_TRUE(tex->upload(uploadRange, kTextureData.data()).isOk()); } else { for (size_t layer = 0; layer < kNumLayers; ++layer) { const auto uploadRange = TextureRangeDesc::new2DArray(0, 0, kOffscreenTexWidth, kOffscreenTexHeight, layer, 1); ASSERT_TRUE(tex->upload(uploadRange, kTextureLayerData[layer]).isOk()); } } if (modifyTexture) { if (singleUpload) { const auto uploadRange = TextureRangeDesc::new2DArray(kOffscreenTexWidth - kOffscreenSubTexWidth, kOffscreenTexHeight - kOffscreenSubTexHeight, kOffscreenSubTexWidth, kOffscreenSubTexHeight, 0, kNumLayers); ASSERT_TRUE(tex->upload(uploadRange, kSubTextureData.data()).isOk()); } else { for (size_t layer = 0; layer < kNumLayers; ++layer) { const auto uploadRange = TextureRangeDesc::new2DArray(kOffscreenTexWidth - kOffscreenSubTexWidth, kOffscreenTexHeight - kOffscreenSubTexHeight, kOffscreenSubTexWidth, kOffscreenSubTexHeight, layer, 1); ASSERT_TRUE(tex->upload(uploadRange, kSubTextureLayerData[layer]).isOk()); } } } for (size_t layer = 0; layer < kNumLayers; ++layer) { //-------------------------------- // Verify against original texture //-------------------------------- const auto layerStr = "Layer " + std::to_string(layer); util::validateUploadedTextureRange(device, cmdQueue, tex, tex->getLayerRange(layer), modifyTexture ? kModifiedTextureLayerData[layer] : kTextureLayerData[layer], layerStr.c_str()); } } } // namespace TEST_F(TextureArrayTest, Upload_SingleUpload) { runUploadTest(*iglDev_, *cmdQueue_, true, false); } TEST_F(TextureArrayTest, Upload_LayerByLayer) { runUploadTest(*iglDev_, *cmdQueue_, false, false); } TEST_F(TextureArrayTest, Upload_SingleUpload_ModifySubTexture) { runUploadTest(*iglDev_, *cmdQueue_, true, true); } TEST_F(TextureArrayTest, Upload_LayerByLayer_ModifySubTexture) { runUploadTest(*iglDev_, *cmdQueue_, false, true); } namespace { void runUploadToMipTest(IDevice& device, ICommandQueue& cmdQueue, bool singleUpload) { Result ret; //------------------------------------- // Create input texture and upload data //------------------------------------- TextureDesc texDesc = TextureDesc::new2DArray(TextureFormat::RGBA_UNorm8, kOffscreenTexWidth, kOffscreenTexHeight, kNumLayers, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); texDesc.numMipLevels = 2; auto tex = device.createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(tex != nullptr); // // upload and redownload to make sure that we've uploaded successfully. // if (singleUpload) { const auto uploadRange = TextureRangeDesc::new2DArray( 0, 0, kOffscreenTexWidth, kOffscreenTexHeight, 0, kNumLayers, 0, 2); ASSERT_TRUE(tex->upload(uploadRange, kTextureData.data()).isOk()); } else { for (size_t mipLevel = 0; mipLevel < 2; ++mipLevel) { for (size_t layer = 0; layer < kNumLayers; ++layer) { const auto uploadRange = TextureRangeDesc::new2DArray(0, 0, kOffscreenTexWidth, kOffscreenTexHeight, layer, 1) .atMipLevel(mipLevel); if (mipLevel == 0) { ASSERT_TRUE(tex->upload(uploadRange, kTextureLayerData[layer]).isOk()); } else { ASSERT_TRUE(tex->upload(uploadRange, kSubTextureLayerData[layer]).isOk()); } } } } for (size_t mipLevel = 0; mipLevel < 2; ++mipLevel) { for (size_t layer = 0; layer < kNumLayers; ++layer) { //-------------------------------- // Verify against original texture //-------------------------------- const auto layerStr = "Mip Level " + std::to_string(mipLevel) + "; Layer " + std::to_string(layer); util::validateUploadedTextureRange(device, cmdQueue, tex, tex->getLayerRange(layer, mipLevel), mipLevel == 0 ? kTextureLayerData[layer] : kSubTextureLayerData[layer], layerStr.c_str()); } } } } // namespace TEST_F(TextureArrayTest, UploadToMip_SingleUpload) { runUploadToMipTest(*iglDev_, *cmdQueue_, true); } TEST_F(TextureArrayTest, UploadToMip_LayerByLayer) { #if defined(IGL_PLATFORM_LINUX) && IGL_PLATFORM_LINUX GTEST_SKIP() << "Temporarily disabled."; #else runUploadToMipTest(*iglDev_, *cmdQueue_, false); #endif } // // Texture Passthrough Test - Sample From Array // // This test uses a simple shader to copy a layer of the input array texture to an // a output texture that matches the size of the input texture layer // TEST_F(TextureArrayTest, Passthrough_SampleFromArray) { Result ret; std::shared_ptr pipelineState; //------------------------------------- // Create input texture and upload data //------------------------------------- const TextureDesc texDesc = TextureDesc::new2DArray(TextureFormat::RGBA_UNorm8, kOffscreenTexWidth, kOffscreenTexHeight, kNumLayers, TextureDesc::TextureUsageBits::Sampled); inputTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(inputTexture_ != nullptr); const auto rangeDesc = TextureRangeDesc::new2D(0, 0, kOffscreenTexWidth, kOffscreenTexHeight); const size_t bytesPerRow = kOffscreenTexWidth * 4; // // upload and redownload to make sure that we've uploaded successfully. // for (size_t layer = 0; layer < kNumLayers; ++layer) { ASSERT_TRUE( inputTexture_->upload(rangeDesc.atLayer(layer), kTextureLayerData[layer], bytesPerRow) .isOk()); } //---------------- // Create Pipeline //---------------- pipelineState = iglDev_->createRenderPipeline(renderPipelineDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(pipelineState != nullptr); for (size_t layer = 0; layer < kNumLayers; ++layer) { //------- // Render //------- cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(cmdBuf_ != nullptr); auto cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, framebuffer_); cmds->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmds->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); cmds->bindRenderPipelineState(pipelineState); cmds->bindTexture(textureUnit_, BindTarget::kFragment, inputTexture_.get()); cmds->bindSamplerState(textureUnit_, BindTarget::kFragment, samp_.get()); Result result{}; auto vertUniformBuffer = createVertexUniformBuffer(*iglDev_, &result); ASSERT_TRUE(result.isOk()); vertexUniforms_.layer = static_cast(layer); *static_cast(vertUniformBuffer->getData()) = vertexUniforms_; vertUniformBuffer->bind(*iglDev_, *pipelineState, *cmds); cmds->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmds->drawIndexed(6); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); cmdBuf_->waitUntilCompleted(); //---------------- // Validate output //---------------- const auto layerStr = "Layer " + std::to_string(layer); util::validateFramebufferTexture( *iglDev_, *cmdQueue_, *framebuffer_, kTextureLayerData[layer], layerStr.c_str()); } } // // Texture Passthrough Test - Render To Array // // This test uses a simple shader to copy a non-array input texture to an // a single layer of the array output texture. The size of the input texture matches the size of a // single layer in the output texture. // TEST_F(TextureArrayTest, Passthrough_RenderToArray) { Result ret; std::shared_ptr pipelineState; //--------------------------------- // Create input and output textures //--------------------------------- TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kOffscreenTexWidth, kOffscreenTexHeight, TextureDesc::TextureUsageBits::Sampled); inputTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(inputTexture_ != nullptr); texDesc = TextureDesc::new2DArray(TextureFormat::RGBA_UNorm8, kOffscreenTexWidth, kOffscreenTexHeight, kNumLayers, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); auto customOffscreenTexture = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(customOffscreenTexture != nullptr); const auto rangeDesc = TextureRangeDesc::new2D(0, 0, kOffscreenTexWidth, kOffscreenTexHeight); const size_t bytesPerRow = kOffscreenTexWidth * 4; //-------------------------- // Create custom framebuffer //-------------------------- FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = customOffscreenTexture; auto customFramebuffer = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(customFramebuffer != nullptr); //---------------------------- // Create custom shader stages //---------------------------- std::unique_ptr customStages; igl::tests::util::createSimpleShaderStages(iglDev_, customStages); renderPipelineDesc_.shaderStages = std::move(customStages); //---------------- // Create Pipeline //---------------- pipelineState = iglDev_->createRenderPipeline(renderPipelineDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(pipelineState != nullptr); for (size_t layer = 0; layer < kNumLayers; ++layer) { //------------------ // Upload layer data //------------------ ASSERT_TRUE(inputTexture_->upload(rangeDesc, kTextureLayerData[layer], bytesPerRow).isOk()); //------- // Render //------- cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(cmdBuf_ != nullptr); renderPass_.colorAttachments[0].layer = layer; auto cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, customFramebuffer); cmds->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmds->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); cmds->bindRenderPipelineState(pipelineState); cmds->bindTexture(textureUnit_, BindTarget::kFragment, inputTexture_.get()); cmds->bindSamplerState(textureUnit_, BindTarget::kFragment, samp_.get()); cmds->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmds->drawIndexed(6); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); cmdBuf_->waitUntilCompleted(); } // Validate in a separate loop to ensure all layers are already written for (size_t layer = 0; layer < kNumLayers; ++layer) { //---------------- // Validate output //---------------- const auto layerStr = "Layer " + std::to_string(layer); util::validateFramebufferTextureRange(*iglDev_, *cmdQueue_, *customFramebuffer, customOffscreenTexture->getLayerRange(layer), kTextureLayerData[layer], layerStr.c_str()); } } TEST_F(TextureArrayTest, ValidateRange2DArray) { if (!iglDev_->hasFeature(DeviceFeatures::Texture2DArray)) { GTEST_SKIP() << "2D array textures not supported. Skipping."; } Result ret; auto texDesc = TextureDesc::new2DArray( TextureFormat::RGBA_UNorm8, 8, 8, 2, TextureDesc::TextureUsageBits::Sampled); auto tex = iglDev_->createTexture(texDesc, &ret); ret = tex->validateRange(TextureRangeDesc::new2DArray(0, 0, 8, 8, 0, 2)); EXPECT_TRUE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::new2DArray(4, 4, 4, 4, 1, 1)); EXPECT_TRUE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::new2DArray(0, 0, 4, 4, 0, 2, 1)); EXPECT_FALSE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::new2DArray(0, 0, 12, 12, 0, 3)); EXPECT_FALSE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::new2DArray(0, 0, 0, 0, 0, 0)); EXPECT_FALSE(ret.isOk()); } // // Test ITexture::getEstimatedSizeInBytes // TEST_F(TextureArrayTest, GetEstimatedSizeInBytes) { auto calcSize = [&](size_t width, size_t height, TextureFormat format, size_t numMipLevels) -> size_t { Result ret; TextureDesc texDesc = TextureDesc::new2DArray(format, width, height, 2, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); texDesc.numMipLevels = numMipLevels; auto texture = iglDev_->createTexture(texDesc, &ret); if (ret.code != Result::Code::Ok || texture == nullptr) { return 0; } return texture->getEstimatedSizeInBytes(); }; const auto format = iglDev_->getBackendType() == BackendType::OpenGL ? TextureFormat::R5G5B5A1_UNorm : TextureFormat::RGBA_UNorm8; const uint32_t formatBytes = iglDev_->getBackendType() == BackendType::OpenGL ? 2u : 4u; uint32_t bytes = 0; bytes = 12u * 34u * formatBytes * 2u; ASSERT_EQ(calcSize(12, 34, format, 1), bytes); bytes = (16u + 8u + 4u + 2u + 1u) * formatBytes * 2u; ASSERT_EQ(calcSize(16, 1, format, 5), bytes); if (iglDev_->hasFeature(DeviceFeatures::TextureNotPot)) { if (!iglDev_->hasFeature(DeviceFeatures::TexturePartialMipChain)) { // ES 2.0 generates maximum mip levels bytes = (128u * 333u + 64u * 166u + 32u * 83u + 16u * 41u + 8u * 20u + 4u * 10u + 2u * 5u + 1u * 2u + 1u * 1u) * formatBytes * 2u; ASSERT_EQ(calcSize(128, 333, format, 9), bytes); } else { bytes = (128u * 333u + 64u * 166u) * formatBytes * 2u; ASSERT_EQ(calcSize(128, 333, format, 2), bytes); } if (iglDev_->hasFeature(DeviceFeatures::TextureFormatRG)) { const size_t rBytes = 1u; const size_t rgBytes = 2u; bytes = (16 + 8 + 4 + 2 + 1) * rBytes * 2u; ASSERT_EQ(calcSize(16, 1, TextureFormat::R_UNorm8, 5), bytes); if (!iglDev_->hasFeature(DeviceFeatures::TexturePartialMipChain)) { // ES 2.0 generates maximum mip levels bytes = (128u * 333u + 64u * 166u + 32u * 83u + 16u * 41u + 8u * 20u + 4u * 10u + 2u * 5u + 1u * 2u + 1u * 1u) * rgBytes * 2u; ASSERT_EQ(calcSize(128, 333, TextureFormat::RG_UNorm8, 9), bytes); } else { bytes = (128u * 333u + 64u * 166u) * rgBytes * 2u; ASSERT_EQ(calcSize(128, 333, TextureFormat::RG_UNorm8, 2), bytes); } } } } // // Test ITexture::getFullRange ITexture::getFullMipRange, and ITexture::getLayerRange // TEST_F(TextureArrayTest, GetRange) { auto createTexture = [&](size_t width, size_t height, TextureFormat format, size_t numMipLevels) -> std::shared_ptr { Result ret; TextureDesc texDesc = TextureDesc::new2DArray(format, width, height, 2, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); texDesc.numMipLevels = numMipLevels; auto texture = iglDev_->createTexture(texDesc, &ret); if (ret.code != Result::Code::Ok || texture == nullptr) { return {}; } return texture; }; auto getFullRange = [&](size_t width, size_t height, TextureFormat format, // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) size_t numMipLevels, size_t rangeMipLevel = 0, size_t rangeNumMipLevels = 0) -> TextureRangeDesc { auto tex = createTexture(width, height, format, numMipLevels); return tex ? tex->getFullRange(rangeMipLevel, rangeNumMipLevels ? rangeNumMipLevels : numMipLevels) : TextureRangeDesc{}; }; auto getFullMipRange = [&](size_t width, size_t height, TextureFormat format, // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) size_t numMipLevels) -> TextureRangeDesc { auto tex = createTexture(width, height, format, numMipLevels); return tex ? tex->getFullMipRange() : TextureRangeDesc{}; }; auto getLayerRange = [&](size_t width, size_t height, TextureFormat format, // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) size_t numMipLevels, size_t layer, size_t rangeMipLevel = 0, size_t rangeNumMipLevels = 0) -> TextureRangeDesc { auto tex = createTexture(width, height, format, numMipLevels); return tex ? tex->getLayerRange( layer, rangeMipLevel, rangeNumMipLevels ? rangeNumMipLevels : numMipLevels) : TextureRangeDesc{}; }; auto rangesAreEqual = [&](const TextureRangeDesc& a, const TextureRangeDesc& b) -> bool { return std::memcmp(&a, &b, sizeof(TextureRangeDesc)) == 0; }; const auto format = iglDev_->getBackendType() == BackendType::OpenGL ? TextureFormat::R5G5B5A1_UNorm : TextureFormat::RGBA_UNorm8; TextureRangeDesc range; range = TextureRangeDesc::new2DArray(0, 0, 12, 34, 0, 2, 0, 1); ASSERT_TRUE(rangesAreEqual(getFullRange(12, 34, format, 1), range)); ASSERT_TRUE(rangesAreEqual(getLayerRange(12, 34, format, 1, 1), range.atLayer(1))); range = TextureRangeDesc::new2DArray(0, 0, 16, 1, 0, 2, 0, 4); ASSERT_TRUE(rangesAreEqual(getFullRange(16, 1, format, 4), range)); ASSERT_TRUE(rangesAreEqual(getLayerRange(16, 1, format, 4, 1), range.atLayer(1))); // Test subset of mip levels ASSERT_TRUE(rangesAreEqual(getFullRange(16, 1, format, 4, 1, 1), range.atMipLevel(1))); ASSERT_TRUE( rangesAreEqual(getLayerRange(16, 1, format, 4, 1, 1, 1), range.atMipLevel(1).atLayer(1))); // Test all mip levels ASSERT_TRUE(rangesAreEqual(getFullMipRange(16, 1, format, 4), range.withNumMipLevels(4))); if (iglDev_->hasFeature(DeviceFeatures::TextureNotPot)) { if (!iglDev_->hasFeature(DeviceFeatures::TexturePartialMipChain)) { // ES 2.0 generates maximum mip levels range = TextureRangeDesc::new2DArray(0, 0, 128, 333, 0, 2, 0, 9); ASSERT_TRUE(rangesAreEqual(getFullRange(128, 333, format, 9), range)); ASSERT_TRUE(rangesAreEqual(getLayerRange(128, 333, format, 9, 1), range.atLayer(1))); // Test all mip levels ASSERT_TRUE(rangesAreEqual(getFullMipRange(128, 333, format, 9), range.withNumMipLevels(9))); } else { range = TextureRangeDesc::new2DArray(0, 0, 128, 333, 0, 2, 0, 2); ASSERT_TRUE(rangesAreEqual(getFullRange(128, 333, format, 2), range)); ASSERT_TRUE(rangesAreEqual(getLayerRange(128, 333, format, 2, 1), range.atLayer(1))); // Test all mip levels ASSERT_TRUE(rangesAreEqual(getFullMipRange(128, 333, format, 2), range.withNumMipLevels(2))); } } } } // namespace igl::tests ================================================ FILE: src/igl/tests/TextureArrayFloat.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // obscure compiler error where glm::vec would delete it's construct_at // since Half didnt have a trivial default ctor despite specifying it. #if defined(IGL_CMAKE_BUILD) #define GLM_FORCE_XYZW_ONLY 1 #endif #include #include "data/ShaderData.h" #include "data/VertexIndexData.h" #include "util/Color.h" #include "util/Common.h" #include "util/Half.h" #include "util/TextureValidationHelpers.h" #include #include #include #include #include #include namespace igl::tests { // Picking this just to match the texture we will use. If you use a different // size texture, then you will have to either create a new offscreenTexture_ // and the framebuffer object in your test, so know exactly what the end result // would be after sampling constexpr size_t kOffscreenTexWidth = 2; constexpr size_t kOffscreenTexHeight = 2; constexpr size_t kOffscreenSubTexWidth = 1; constexpr size_t kOffscreenSubTexHeight = 1; constexpr igl::TextureFormat kFloatTextureFormat = TextureFormat::RGBA_F16; using TestColorType = glm::vec<4, util::TestHalf, glm::defaultp>; // control // using TestColorType = glm::vec<4, float, glm::defaultp>; struct VertexUniforms { int layer = 0; }; // // TextureFloatTest // // Test fixture for all the tests in this file. Takes care of common // initialization and allocating of common resources. // class TextureArrayFloatTest : public ::testing::Test { private: public: TextureArrayFloatTest() = default; ~TextureArrayFloatTest() override = default; std::shared_ptr createVertexUniformBuffer(IDevice& device, Result* /*result*/) { std::shared_ptr vertUniformBuffer = nullptr; const iglu::ManagedUniformBufferInfo vertInfo = { .index = 2, .length = sizeof(VertexUniforms), .uniforms = { UniformDesc{ .name = "layer", .type = igl::UniformType::Int, .offset = offsetof(VertexUniforms, layer), }, }}; vertUniformBuffer = std::make_shared(device, vertInfo); IGL_DEBUG_ASSERT(vertUniformBuffer->result.isOk()); return vertUniformBuffer; } // // SetUp() // // This function sets up a render pass and a graphics pipeline descriptor // so it is ready to render a simple quad with an input texture to an // offscreen texture. // // The actual creation of the graphics pipeline state object is left // to each test so that tests can replace the default settings with // something more appropriate. // void SetUp() override { #if IGL_PLATFORM_LINUX && !IGL_PLATFORM_LINUX_USE_EGL GTEST_SKIP() << "Fix these tests on Linux"; #endif setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_TRUE(iglDev_ != nullptr); ASSERT_TRUE(cmdQueue_ != nullptr); if (!iglDev_->hasFeature(DeviceFeatures::TextureHalfFloat) || !iglDev_->hasFeature(DeviceFeatures::Texture2DArray)) { GTEST_SKIP() << "2D float texture array is unsupported for this platform."; return; } // Create an offscreen texture to render to const TextureDesc texDesc = TextureDesc::new2D(kFloatTextureFormat, kOffscreenTexWidth, kOffscreenTexHeight, TextureDesc::TextureUsageBits::Attachment); Result ret; offscreenTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(offscreenTexture_ != nullptr); // Create framebuffer using the offscreen texture FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = offscreenTexture_; framebuffer_ = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(framebuffer_ != nullptr); // Initialize render pass descriptor renderPass_.colorAttachments.resize(1); renderPass_.colorAttachments[0].loadAction = LoadAction::Clear; renderPass_.colorAttachments[0].storeAction = StoreAction::Store; renderPass_.colorAttachments[0].clearColor = {0.0, 0.0, 0.0, 1.0}; // Initialize shader stages std::unique_ptr stages; if (iglDev_->getBackendType() == BackendType::OpenGL) { #if IGL_BACKEND_OPENGL if (iglDev_->getBackendVersion().flavor == BackendFlavor::OpenGL_ES) { util::createShaderStages(iglDev_, igl::tests::data::shader::kOglSimpleVertShaderTexArrayEs3, igl::tests::data::shader::kShaderFunc, igl::tests::data::shader::kOglSimpleFragShaderTexArrayEs3, igl::tests::data::shader::kShaderFunc, stages); } else { if (!iglDev_->hasRequirement(DeviceRequirement::TextureArrayExtReq)) { util::createShaderStages(iglDev_, igl::tests::data::shader::kOglSimpleVertShaderTexArray, igl::tests::data::shader::kShaderFunc, igl::tests::data::shader::kOglSimpleFragShaderTexArray, igl::tests::data::shader::kShaderFunc, stages); } else if (iglDev_->hasFeature(DeviceFeatures::TextureArrayExt)) { util::createShaderStages(iglDev_, igl::tests::data::shader::kOglSimpleVertShaderTexArrayExt, igl::tests::data::shader::kShaderFunc, igl::tests::data::shader::kOglSimpleFragShaderTexArrayExt, igl::tests::data::shader::kShaderFunc, stages); } else { GTEST_SKIP() << "Texture array is unsupported for this platform."; return; } } #if defined(IGL_PLATFORM_LINUX) && IGL_PLATFORM_LINUX GTEST_SKIP() << "Temporarily disabled."; #endif #endif // IGL_BACKEND_OPENGL } else if (iglDev_->getBackendType() == BackendType::Vulkan) { util::createShaderStages(iglDev_, igl::tests::data::shader::kVulkanSimpleVertShaderTex2dArray, igl::tests::data::shader::kShaderFunc, igl::tests::data::shader::kVulkanSimpleFragShaderTex2dArray, igl::tests::data::shader::kShaderFunc, stages); } else if (iglDev_->getBackendType() == BackendType::Metal) { util::createShaderStages(iglDev_, igl::tests::data::shader::kMtlSimpleShaderTxt2dArray, igl::tests::data::shader::kSimpleVertFunc, igl::tests::data::shader::kSimpleFragFunc, stages); } else if (iglDev_->getBackendType() == BackendType::D3D12) { util::createShaderStages(iglDev_, igl::tests::data::shader::kD3D12SimpleVertShaderTex2dArray, igl::tests::data::shader::kShaderFunc, igl::tests::data::shader::kD3D12SimpleFragShaderTex2dArray, igl::tests::data::shader::kShaderFunc, stages); } ASSERT_TRUE(stages != nullptr); shaderStages_ = std::move(stages); // Initialize input to vertex shader VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Float4; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].bufferIndex = data::shader::kSimplePosIndex; inputDesc.attributes[0].name = data::shader::kSimplePos; inputDesc.attributes[0].location = 0; inputDesc.inputBindings[0].stride = sizeof(float) * 4; inputDesc.attributes[1].format = VertexAttributeFormat::Float2; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].bufferIndex = data::shader::kSimpleUvIndex; inputDesc.attributes[1].name = data::shader::kSimpleUv; inputDesc.attributes[1].location = 1; inputDesc.inputBindings[1].stride = sizeof(float) * 2; // numAttributes has to equal to bindings when using more than 1 buffer inputDesc.numAttributes = inputDesc.numInputBindings = 2; vertexInputState_ = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vertexInputState_ != nullptr); // Initialize index buffer BufferDesc bufDesc; bufDesc.type = BufferDesc::BufferTypeBits::Index; bufDesc.data = data::vertex_index::kQuadInd.data(); bufDesc.length = sizeof(data::vertex_index::kQuadInd); ib_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(ib_ != nullptr); // Initialize vertex and sampler buffers bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data::vertex_index::kQuadVert.data(); bufDesc.length = sizeof(data::vertex_index::kQuadVert); vb_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vb_ != nullptr); // Initialize UV data and sampler buffer bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data::vertex_index::kQuadUv.data(); bufDesc.length = sizeof(data::vertex_index::kQuadUv); uv_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(uv_ != nullptr); // Initialize sampler state const SamplerStateDesc samplerDesc; samp_ = iglDev_->createSamplerState(samplerDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(samp_ != nullptr); // Initialize Graphics Pipeline Descriptor, but leave the creation // to the individual tests in case further customization is required renderPipelineDesc_.vertexInputState = vertexInputState_; renderPipelineDesc_.shaderStages = shaderStages_; renderPipelineDesc_.targetDesc.colorAttachments.resize(1); renderPipelineDesc_.targetDesc.colorAttachments[0].textureFormat = offscreenTexture_->getFormat(); renderPipelineDesc_.fragmentUnitSamplerMap[textureUnit_] = IGL_NAMEHANDLE(data::shader::kSimpleSampler); renderPipelineDesc_.cullMode = igl::CullMode::Disabled; } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; std::shared_ptr cmdBuf_; CommandBufferDesc cbDesc_ = {}; RenderPassDesc renderPass_; std::shared_ptr offscreenTexture_; std::shared_ptr framebuffer_; // Currently it is left to individual tests to initialize this std::shared_ptr inputTexture_; std::shared_ptr shaderStages_; std::shared_ptr vertexInputState_; std::shared_ptr vb_, uv_, ib_; std::shared_ptr samp_; RenderPipelineDesc renderPipelineDesc_; VertexUniforms vertexUniforms_; size_t textureUnit_ = 0; }; // clang-format off const TestColorType kR = igl::tests::util::convertSRGBToLinear(glm::vec4(0x1F / 255.0, 0x00/255.0, 0x00/255.0, 0x0F/255.0)); // 0x1F00000F const TestColorType kG = igl::tests::util::convertSRGBToLinear(glm::vec4(0x00 / 255.0, 0x2F/255.0, 0x00/255.0, 0x1F/255.0)); // 0x002F001F; const TestColorType kB = igl::tests::util::convertSRGBToLinear(glm::vec4(0x00 / 255.0, 0x00/255.0, 0x3F/255.0, 0x2F/255.0)); // 0x00003F2F; const TestColorType kC = igl::tests::util::convertSRGBToLinear(glm::vec4(0x00 / 255.0, 0x4F/255.0, 0x5F/255.0, 0x3F/255.0)); // 0x004F5F3F; const TestColorType kM = igl::tests::util::convertSRGBToLinear(glm::vec4(0x6F / 255.0, 0x00/255.0, 0x7F/255.0, 0x4F/255.0)); // 0x6F007F4F; const TestColorType kY = igl::tests::util::convertSRGBToLinear(glm::vec4(0x8F / 255.0, 0x9F/255.0, 0x00/255.0, 0x5F/255.0)); // 0x8F9F005F; constexpr size_t kNumLayers = 3; const std::array kTextureData = { kR, kR, kR, kR, // Base Mip, Layer 0 kG, kG, kG, kG, // Base Mip, Layer 1 kB, kB, kB, kB, // Base Mip, Layer 2 kC, // Mip 1, Layer 0 kM, // Mip 1, Layer 1 kY, // Mip 1, Layer 2 }; const std::array kSubTextureData = { kC, // Layer 0 kM, // Layer 1 kY, // Layer 2 }; const std::array kModifiedTextureData = { kR, kR, kR, kC, // Layer 0 kG, kG, kG, kM, // Layer 1 kB, kB, kB, kY, // Layer 2 }; // clang-format on const std::array kTextureLayerData = { kTextureData.data() + 0, kTextureData.data() + 4, kTextureData.data() + 8, }; const std::array kSubTextureLayerData = { kSubTextureData.data() + 0, kSubTextureData.data() + 1, kSubTextureData.data() + 2, }; const std::array kModifiedTextureLayerData = { kModifiedTextureData.data() + 0, kModifiedTextureData.data() + 4, kModifiedTextureData.data() + 8, }; // // Texture Upload Test // // This test uploads data to an array texture and then downloads it again to validate it // namespace { void runUploadTest(IDevice& device, ICommandQueue& cmdQueue, bool singleUpload, bool modifyTexture) { Result ret; const std::shared_ptr pipelineState; //------------------------------------- // Create input texture and upload data //------------------------------------- const TextureDesc texDesc = TextureDesc::new2DArray( kFloatTextureFormat, kOffscreenTexWidth, kOffscreenTexHeight, kNumLayers, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); auto tex = device.createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(tex != nullptr); // // upload and redownload to make sure that we've uploaded successfully. // if (singleUpload) { const auto uploadRange = TextureRangeDesc::new2DArray(0, 0, kOffscreenTexWidth, kOffscreenTexHeight, 0, kNumLayers); ASSERT_TRUE(tex->upload(uploadRange, kTextureData.data()).isOk()); } else { for (size_t layer = 0; layer < kNumLayers; ++layer) { const auto uploadRange = TextureRangeDesc::new2DArray(0, 0, kOffscreenTexWidth, kOffscreenTexHeight, layer, 1); ASSERT_TRUE(tex->upload(uploadRange, kTextureLayerData[layer]).isOk()); } } if (modifyTexture) { if (singleUpload) { const auto uploadRange = TextureRangeDesc::new2DArray(kOffscreenTexWidth - kOffscreenSubTexWidth, kOffscreenTexHeight - kOffscreenSubTexHeight, kOffscreenSubTexWidth, kOffscreenSubTexHeight, 0, kNumLayers); ASSERT_TRUE(tex->upload(uploadRange, kSubTextureData.data()).isOk()); } else { for (size_t layer = 0; layer < kNumLayers; ++layer) { const auto uploadRange = TextureRangeDesc::new2DArray(kOffscreenTexWidth - kOffscreenSubTexWidth, kOffscreenTexHeight - kOffscreenSubTexHeight, kOffscreenSubTexWidth, kOffscreenSubTexHeight, layer, 1); ASSERT_TRUE(tex->upload(uploadRange, kSubTextureLayerData[layer]).isOk()); } } } for (size_t layer = 0; layer < kNumLayers; ++layer) { //-------------------------------- // Verify against original texture //-------------------------------- const auto layerStr = "Layer " + std::to_string(layer); const auto* data = modifyTexture ? kModifiedTextureLayerData[layer] : kTextureLayerData[layer]; util::validateUploadedTextureRange( device, cmdQueue, tex, tex->getLayerRange(layer), data, layerStr.c_str()); } } } // namespace TEST_F(TextureArrayFloatTest, Upload_SingleUpload) { runUploadTest(*iglDev_, *cmdQueue_, true, false); } TEST_F(TextureArrayFloatTest, Upload_LayerByLayer) { runUploadTest(*iglDev_, *cmdQueue_, false, false); } TEST_F(TextureArrayFloatTest, Upload_SingleUpload_ModifySubTexture) { runUploadTest(*iglDev_, *cmdQueue_, true, true); } TEST_F(TextureArrayFloatTest, Upload_LayerByLayer_ModifySubTexture) { runUploadTest(*iglDev_, *cmdQueue_, false, true); } namespace { void runUploadToMipTest(IDevice& device, ICommandQueue& cmdQueue, bool singleUpload) { Result ret; //------------------------------------- // Create input texture and upload data //------------------------------------- TextureDesc texDesc = TextureDesc::new2DArray(kFloatTextureFormat, kOffscreenTexWidth, kOffscreenTexHeight, kNumLayers, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); texDesc.numMipLevels = 2; auto tex = device.createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(tex != nullptr); // // upload and redownload to make sure that we've uploaded successfully. // if (singleUpload) { const auto uploadRange = TextureRangeDesc::new2DArray( 0, 0, kOffscreenTexWidth, kOffscreenTexHeight, 0, kNumLayers, 0, 2); ASSERT_TRUE(tex->upload(uploadRange, kTextureData.data()).isOk()); } else { for (size_t mipLevel = 0; mipLevel < 2; ++mipLevel) { for (size_t layer = 0; layer < kNumLayers; ++layer) { const auto uploadRange = TextureRangeDesc::new2DArray(0, 0, kOffscreenTexWidth, kOffscreenTexHeight, layer, 1) .atMipLevel(mipLevel); if (mipLevel == 0) { ASSERT_TRUE(tex->upload(uploadRange, kTextureLayerData[layer]).isOk()); } else { ASSERT_TRUE(tex->upload(uploadRange, kSubTextureLayerData[layer]).isOk()); } } } } for (size_t mipLevel = 0; mipLevel < 2; ++mipLevel) { for (size_t layer = 0; layer < kNumLayers; ++layer) { //-------------------------------- // Verify against original texture //-------------------------------- const auto layerStr = "Mip Level " + std::to_string(mipLevel) + "; Layer " + std::to_string(layer); const auto* data = mipLevel == 0 ? kTextureLayerData[layer] : kSubTextureLayerData[layer]; util::validateUploadedTextureRange( device, cmdQueue, tex, tex->getLayerRange(layer, mipLevel), data, layerStr.c_str()); } } } } // namespace TEST_F(TextureArrayFloatTest, UploadToMip_SingleUpload) { runUploadToMipTest(*iglDev_, *cmdQueue_, true); } TEST_F(TextureArrayFloatTest, UploadToMip_LayerByLayer) { runUploadToMipTest(*iglDev_, *cmdQueue_, false); } // // Texture Passthrough Test - Sample From Array // // This test uses a simple shader to copy a layer of the input array texture to an // a output texture that matches the size of the input texture layer // TEST_F(TextureArrayFloatTest, Passthrough_SampleFromArray) { Result ret; std::shared_ptr pipelineState; //------------------------------------- // Create input texture and upload data //------------------------------------- const TextureDesc texDesc = TextureDesc::new2DArray(kFloatTextureFormat, kOffscreenTexWidth, kOffscreenTexHeight, kNumLayers, TextureDesc::TextureUsageBits::Sampled); inputTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(inputTexture_ != nullptr); const auto rangeDesc = TextureRangeDesc::new2D(0, 0, kOffscreenTexWidth, kOffscreenTexHeight); const size_t bytesPerRow = kOffscreenTexWidth * sizeof(TestColorType); // // upload and redownload to make sure that we've uploaded successfully. // for (size_t layer = 0; layer < kNumLayers; ++layer) { ASSERT_TRUE( inputTexture_->upload(rangeDesc.atLayer(layer), kTextureLayerData[layer], bytesPerRow) .isOk()); } //---------------- // Create Pipeline //---------------- pipelineState = iglDev_->createRenderPipeline(renderPipelineDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(pipelineState != nullptr); for (size_t layer = 0; layer < kNumLayers; ++layer) { //------- // Render //------- cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(cmdBuf_ != nullptr); auto cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, framebuffer_); cmds->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmds->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); cmds->bindRenderPipelineState(pipelineState); cmds->bindTexture(textureUnit_, BindTarget::kFragment, inputTexture_.get()); cmds->bindSamplerState(textureUnit_, BindTarget::kFragment, samp_.get()); Result result{}; auto vertUniformBuffer = createVertexUniformBuffer(*iglDev_, &result); ASSERT_TRUE(result.isOk()); vertexUniforms_.layer = static_cast(layer); *static_cast(vertUniformBuffer->getData()) = vertexUniforms_; vertUniformBuffer->bind(*iglDev_, *pipelineState, *cmds); cmds->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmds->drawIndexed(6); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); cmdBuf_->waitUntilCompleted(); //---------------- // Validate output //---------------- const auto layerStr = "Layer " + std::to_string(layer); const auto* data = kTextureLayerData[layer]; util::validateFramebufferTexture(*iglDev_, *cmdQueue_, *framebuffer_, data, layerStr.c_str()); } } // // Texture Passthrough Test - Render To Array // // This test uses a simple shader to copy a non-array input texture to an // a single layer of the array output texture. The size of the input texture matches the size of a // single layer in the output texture. // TEST_F(TextureArrayFloatTest, Passthrough_RenderToArray) { Result ret; std::shared_ptr pipelineState; //--------------------------------- // Create input and output textures //--------------------------------- TextureDesc texDesc = TextureDesc::new2D(kFloatTextureFormat, kOffscreenTexWidth, kOffscreenTexHeight, TextureDesc::TextureUsageBits::Sampled); inputTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(inputTexture_ != nullptr); texDesc = TextureDesc::new2DArray(kFloatTextureFormat, kOffscreenTexWidth, kOffscreenTexHeight, kNumLayers, TextureDesc::TextureUsageBits::Attachment); auto customOffscreenTexture = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(customOffscreenTexture != nullptr); const auto rangeDesc = TextureRangeDesc::new2D(0, 0, kOffscreenTexWidth, kOffscreenTexHeight); const size_t bytesPerRow = kOffscreenTexWidth * sizeof(TestColorType); //-------------------------- // Create custom framebuffer //-------------------------- FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = customOffscreenTexture; auto customFramebuffer = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(customFramebuffer != nullptr); //---------------------------- // Create custom shader stages //---------------------------- std::unique_ptr customStages; igl::tests::util::createSimpleShaderStages(iglDev_, customStages); renderPipelineDesc_.shaderStages = std::move(customStages); //---------------- // Create Pipeline //---------------- pipelineState = iglDev_->createRenderPipeline(renderPipelineDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(pipelineState != nullptr); for (size_t layer = 0; layer < kNumLayers; ++layer) { //------------------ // Upload layer data //------------------ ASSERT_TRUE(inputTexture_->upload(rangeDesc, kTextureLayerData[layer], bytesPerRow).isOk()); //------- // Render //------- cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(cmdBuf_ != nullptr); renderPass_.colorAttachments[0].layer = layer; auto cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, customFramebuffer); cmds->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmds->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); cmds->bindRenderPipelineState(pipelineState); cmds->bindTexture(textureUnit_, BindTarget::kFragment, inputTexture_.get()); cmds->bindSamplerState(textureUnit_, BindTarget::kFragment, samp_.get()); cmds->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmds->drawIndexed(6); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); cmdBuf_->waitUntilCompleted(); } // Validate in a separate loop to ensure all layers are already written for (size_t layer = 0; layer < kNumLayers; ++layer) { //---------------- // Validate output //---------------- const auto layerStr = "Layer " + std::to_string(layer); const auto* data = kTextureLayerData[layer]; util::validateFramebufferTextureRange(*iglDev_, *cmdQueue_, *customFramebuffer, customOffscreenTexture->getLayerRange(layer), data, layerStr.c_str()); } } TEST_F(TextureArrayFloatTest, ValidateRange2DArray) { Result ret; auto texDesc = TextureDesc::new2DArray(kFloatTextureFormat, 8, 8, 2, TextureDesc::TextureUsageBits::Sampled); auto tex = iglDev_->createTexture(texDesc, &ret); ret = tex->validateRange(TextureRangeDesc::new2DArray(0, 0, 8, 8, 0, 2)); EXPECT_TRUE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::new2DArray(4, 4, 4, 4, 1, 1)); EXPECT_TRUE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::new2DArray(0, 0, 4, 4, 0, 2, 1)); EXPECT_FALSE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::new2DArray(0, 0, 12, 12, 0, 3)); EXPECT_FALSE(ret.isOk()); ret = tex->validateRange(TextureRangeDesc::new2DArray(0, 0, 0, 0, 0, 0)); EXPECT_FALSE(ret.isOk()); } // // Test ITexture::getEstimatedSizeInBytes // TEST_F(TextureArrayFloatTest, GetEstimatedSizeInBytes) { auto calcSize = [&](size_t width, size_t height, TextureFormat format, size_t numMipLevels) -> size_t { Result ret; TextureDesc texDesc = TextureDesc::new2DArray(format, width, height, 2, TextureDesc::TextureUsageBits::Sampled); texDesc.numMipLevels = numMipLevels; auto texture = iglDev_->createTexture(texDesc, &ret); if (ret.code != Result::Code::Ok || texture == nullptr) { return 0; } return texture->getEstimatedSizeInBytes(); }; const auto format = kFloatTextureFormat; const uint32_t formatBytes = (kFloatTextureFormat == TextureFormat::RGBA_F16) ? 8u : 16u; uint32_t bytes = 0; bytes = 12u * 34u * formatBytes * 2u; ASSERT_EQ(calcSize(12, 34, format, 1), bytes); bytes = (16u + 8u + 4u + 2u + 1u) * formatBytes * 2u; ASSERT_EQ(calcSize(16, 1, format, 5), bytes); if (iglDev_->hasFeature(DeviceFeatures::TextureNotPot)) { if (!iglDev_->hasFeature(DeviceFeatures::TexturePartialMipChain)) { // ES 2.0 generates maximum mip levels bytes = (128u * 333u + 64u * 166u + 32u * 83u + 16u * 41u + 8u * 20u + 4u * 10u + 2u * 5u + 1u * 2u + 1u * 1u) * formatBytes * 2u; ASSERT_EQ(calcSize(128, 333, format, 9), bytes); } else { bytes = (128u * 333u + 64u * 166u) * formatBytes * 2u; ASSERT_EQ(calcSize(128, 333, format, 2), bytes); } if (iglDev_->hasFeature(DeviceFeatures::TextureFormatRG)) { constexpr size_t rBytes = 1u; constexpr size_t rgBytes = 2u; bytes = (16 + 8 + 4 + 2 + 1) * rBytes * 2u; ASSERT_EQ(calcSize(16, 1, TextureFormat::R_UNorm8, 5), bytes); if (!iglDev_->hasFeature(DeviceFeatures::TexturePartialMipChain)) { // ES 2.0 generates maximum mip levels bytes = (128u * 333u + 64u * 166u + 32u * 83u + 16u * 41u + 8u * 20u + 4u * 10u + 2u * 5u + 1u * 2u + 1u * 1u) * rgBytes * 2u; ASSERT_EQ(calcSize(128, 333, TextureFormat::RG_UNorm8, 9), bytes); } else { bytes = (128u * 333u + 64u * 166u) * rgBytes * 2u; ASSERT_EQ(calcSize(128, 333, TextureFormat::RG_UNorm8, 2), bytes); } } } } // // Test ITexture::getFullRange ITexture::getFullMipRange, and ITexture::getLayerRange // TEST_F(TextureArrayFloatTest, GetRange) { auto createTexture = [&](size_t width, size_t height, TextureFormat format, size_t numMipLevels) -> std::shared_ptr { Result ret; TextureDesc texDesc = TextureDesc::new2DArray(format, width, height, 2, TextureDesc::TextureUsageBits::Sampled); texDesc.numMipLevels = numMipLevels; auto texture = iglDev_->createTexture(texDesc, &ret); if (ret.code != Result::Code::Ok || texture == nullptr) { return {}; } return texture; }; auto getFullRange = [&](size_t width, size_t height, TextureFormat format, // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) size_t numMipLevels, size_t rangeMipLevel = 0, size_t rangeNumMipLevels = 0) -> TextureRangeDesc { auto tex = createTexture(width, height, format, numMipLevels); return tex ? tex->getFullRange(rangeMipLevel, rangeNumMipLevels ? rangeNumMipLevels : numMipLevels) : TextureRangeDesc{}; }; auto getFullMipRange = [&](size_t width, size_t height, TextureFormat format, // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) size_t numMipLevels) -> TextureRangeDesc { auto tex = createTexture(width, height, format, numMipLevels); return tex ? tex->getFullMipRange() : TextureRangeDesc{}; }; auto getLayerRange = [&](size_t width, size_t height, TextureFormat format, // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) size_t numMipLevels, size_t layer, size_t rangeMipLevel = 0, size_t rangeNumMipLevels = 0) -> TextureRangeDesc { auto tex = createTexture(width, height, format, numMipLevels); return tex ? tex->getLayerRange( layer, rangeMipLevel, rangeNumMipLevels ? rangeNumMipLevels : numMipLevels) : TextureRangeDesc{}; }; auto rangesAreEqual = [&](const TextureRangeDesc& a, const TextureRangeDesc& b) -> bool { return std::memcmp(&a, &b, sizeof(TextureRangeDesc)) == 0; }; const auto format = kFloatTextureFormat; TextureRangeDesc range; range = TextureRangeDesc::new2DArray(0, 0, 12, 34, 0, 2, 0, 1); ASSERT_TRUE(rangesAreEqual(getFullRange(12, 34, format, 1), range)); ASSERT_TRUE(rangesAreEqual(getLayerRange(12, 34, format, 1, 1), range.atLayer(1))); range = TextureRangeDesc::new2DArray(0, 0, 16, 1, 0, 2, 0, 4); ASSERT_TRUE(rangesAreEqual(getFullRange(16, 1, format, 4), range)); ASSERT_TRUE(rangesAreEqual(getLayerRange(16, 1, format, 4, 1), range.atLayer(1))); // Test subset of mip levels ASSERT_TRUE(rangesAreEqual(getFullRange(16, 1, format, 4, 1, 1), range.atMipLevel(1))); ASSERT_TRUE( rangesAreEqual(getLayerRange(16, 1, format, 4, 1, 1, 1), range.atMipLevel(1).atLayer(1))); // Test all mip levels ASSERT_TRUE(rangesAreEqual(getFullMipRange(16, 1, format, 4), range.withNumMipLevels(4))); if (iglDev_->hasFeature(DeviceFeatures::TextureNotPot)) { if (!iglDev_->hasFeature(DeviceFeatures::TexturePartialMipChain)) { // ES 2.0 generates maximum mip levels range = TextureRangeDesc::new2DArray(0, 0, 128, 333, 0, 2, 0, 9); ASSERT_TRUE(rangesAreEqual(getFullRange(128, 333, format, 9), range)); ASSERT_TRUE(rangesAreEqual(getLayerRange(128, 333, format, 9, 1), range.atLayer(1))); // Test all mip levels ASSERT_TRUE(rangesAreEqual(getFullMipRange(128, 333, format, 9), range.withNumMipLevels(9))); } else { range = TextureRangeDesc::new2DArray(0, 0, 128, 333, 0, 2, 0, 2); ASSERT_TRUE(rangesAreEqual(getFullRange(128, 333, format, 2), range)); ASSERT_TRUE(rangesAreEqual(getLayerRange(128, 333, format, 2, 1), range.atLayer(1))); // Test all mip levels ASSERT_TRUE(rangesAreEqual(getFullMipRange(128, 333, format, 2), range.withNumMipLevels(2))); } } } } // namespace igl::tests ================================================ FILE: src/igl/tests/TextureCube.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "data/ShaderData.h" #include "data/VertexIndexData.h" #include "util/Common.h" #include "util/TextureValidationHelpers.h" #include #include #include #include #include namespace igl::tests { // Picking this just to match the texture we will use. If you use a different // size texture, then you will have to either create a new offscreenTexture_ // and the framebuffer object in your test, so know exactly what the end result // would be after sampling constexpr size_t kOffscreenTexWidth = 2; constexpr size_t kOffscreenTexHeight = 2; struct VertexUniforms { glm::vec4 viewDirection = glm::vec4(0.0); }; // // TextureTest // // Test fixture for all the tests in this file. Takes care of common // initialization and allocating of common resources. // class TextureCubeTest : public ::testing::Test { private: public: TextureCubeTest() = default; ~TextureCubeTest() override = default; std::shared_ptr createVertexUniformBuffer(IDevice& device, Result* /*result*/) { std::shared_ptr vertUniformBuffer = nullptr; const iglu::ManagedUniformBufferInfo info = { .index = 1, .length = sizeof(VertexUniforms), .uniforms = { UniformDesc{ .name = "view", .type = igl::UniformType::Float4, .offset = offsetof(VertexUniforms, viewDirection), }, }}; vertUniformBuffer = std::make_shared(device, info); IGL_DEBUG_ASSERT(vertUniformBuffer->result.isOk()); return vertUniformBuffer; } // // SetUp() // // This function sets up a render pass and a graphics pipeline descriptor // so it is ready to render a simple quad with an input texture to an // offscreen texture. // // The actual creation of the graphics pipeline state object is left // to each test so that tests can replace the default settings with // something more appropriate. // void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_TRUE(iglDev_ != nullptr); ASSERT_TRUE(cmdQueue_ != nullptr); const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kOffscreenTexWidth, kOffscreenTexHeight, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment, "TextureCubeTest::SetUp::offscreenTexture"); Result ret; offscreenTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(offscreenTexture_ != nullptr); // Create framebuffer using the offscreen texture FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = offscreenTexture_; framebuffer_ = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(framebuffer_ != nullptr); // Initialize render pass descriptor renderPass_.colorAttachments.resize(1); renderPass_.colorAttachments[0].loadAction = LoadAction::Clear; renderPass_.colorAttachments[0].storeAction = StoreAction::Store; renderPass_.colorAttachments[0].clearColor = {0.0, 0.0, 0.0, 1.0}; // Initialize shader stages std::unique_ptr stages; if (iglDev_->getBackendType() == BackendType::OpenGL) { util::createShaderStages(iglDev_, igl::tests::data::shader::kOglSimpleVertShaderCube, igl::tests::data::shader::kShaderFunc, igl::tests::data::shader::kOglSimpleFragShaderCube, igl::tests::data::shader::kShaderFunc, stages); } else if (iglDev_->getBackendType() == BackendType::Metal) { util::createShaderStages(iglDev_, igl::tests::data::shader::kMtlSimpleShaderCube, igl::tests::data::shader::kSimpleVertFunc, igl::tests::data::shader::kSimpleFragFunc, stages); } else if (iglDev_->getBackendType() == BackendType::Vulkan) { util::createShaderStages(iglDev_, igl::tests::data::shader::kVulkanSimpleVertShaderCube, igl::tests::data::shader::kShaderFunc, igl::tests::data::shader::kVulkanSimpleFragShaderCube, igl::tests::data::shader::kShaderFunc, stages); } else if (iglDev_->getBackendType() == BackendType::D3D12) { util::createShaderStages(iglDev_, igl::tests::data::shader::kD3D12SimpleVertShaderCube, igl::tests::data::shader::kShaderFunc, igl::tests::data::shader::kD3D12SimpleFragShaderCube, igl::tests::data::shader::kShaderFunc, stages); } else { ASSERT_TRUE(false); } shaderStages_ = std::move(stages); // Initialize input to vertex shader VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Float4; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].bufferIndex = data::shader::kSimplePosIndex; inputDesc.attributes[0].name = data::shader::kSimplePos; inputDesc.attributes[0].location = 0; inputDesc.inputBindings[0].stride = sizeof(float) * 4; inputDesc.attributes[1].format = VertexAttributeFormat::Float2; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].bufferIndex = data::shader::kSimpleUvIndex; inputDesc.attributes[1].name = data::shader::kSimpleUv; inputDesc.attributes[1].location = 1; inputDesc.inputBindings[1].stride = sizeof(float) * 2; // numAttributes has to equal to bindings when using more than 1 buffer inputDesc.numAttributes = inputDesc.numInputBindings = 2; vertexInputState_ = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vertexInputState_ != nullptr); // Initialize index buffer BufferDesc bufDesc; bufDesc.type = BufferDesc::BufferTypeBits::Index; bufDesc.data = data::vertex_index::kQuadInd.data(); bufDesc.length = sizeof(data::vertex_index::kQuadInd); ib_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(ib_ != nullptr); // Initialize vertex and sampler buffers bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data::vertex_index::kQuadVert.data(); bufDesc.length = sizeof(data::vertex_index::kQuadVert); vb_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vb_ != nullptr); // Initialize UV data and sampler buffer bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data::vertex_index::kQuadUv.data(); bufDesc.length = sizeof(data::vertex_index::kQuadUv); uv_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(uv_ != nullptr); // Initialize sampler state const SamplerStateDesc samplerDesc; samp_ = iglDev_->createSamplerState(samplerDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(samp_ != nullptr); // Initialize Graphics Pipeline Descriptor, but leave the creation // to the individual tests in case further customization is required renderPipelineDesc_.vertexInputState = vertexInputState_; renderPipelineDesc_.shaderStages = shaderStages_; renderPipelineDesc_.targetDesc.colorAttachments.resize(1); renderPipelineDesc_.targetDesc.colorAttachments[0].textureFormat = offscreenTexture_->getFormat(); renderPipelineDesc_.fragmentUnitSamplerMap[textureUnit_] = IGL_NAMEHANDLE(data::shader::kSimpleSampler); renderPipelineDesc_.cullMode = igl::CullMode::Disabled; } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; std::shared_ptr cmdBuf_; CommandBufferDesc cbDesc_ = {}; RenderPassDesc renderPass_; std::shared_ptr offscreenTexture_; std::shared_ptr framebuffer_; // Currently it is left to individual tests to initialize this std::shared_ptr inputTexture_; std::shared_ptr shaderStages_; std::shared_ptr vertexInputState_; std::shared_ptr vb_, uv_, ib_; std::shared_ptr samp_; RenderPipelineDesc renderPipelineDesc_; VertexUniforms vertexUniforms_; size_t textureUnit_ = 0; }; constexpr uint32_t kR = 0x1F00001F; constexpr uint32_t kG = 0x002F002F; constexpr uint32_t kB = 0x00003F4F; constexpr uint32_t kC = 0x004F5F3F; constexpr uint32_t kM = 0x6F007F4F; constexpr uint32_t kY = 0x8F9F005F; // clang-format off constexpr std::array kTextureData = { kR, kR, kR, kR, // Base Mip, Face 0 kG, kG, kG, kG, // Base Mip, Face 1 kB, kB, kB, kB, // Base Mip, Face 2 kR | kB, kR | kB, kR | kB, kR | kB, // Base Mip, Face 3 kR | kG, kR | kG, kR | kG, kR | kG, // Base Mip, Face 4 kB | kG, kB | kG, kB | kG, kB | kG, // Base Mip, Face 5 kC, // Mip 1, Face 0 kM, // Mip 1, Face 1 kY, // Mip 1, Face 2 kC | kM, // Mip 1, Face 3 kC | kY, // Mip 1, Face 4 kM | kY, // Mip 1, Face 5 }; // clang-format on constexpr std::array kBaseMipTextureFaceData{ kTextureData.data() + 0, kTextureData.data() + 4, kTextureData.data() + 8, kTextureData.data() + 12, kTextureData.data() + 16, kTextureData.data() + 20, }; constexpr std::array kMip1TextureFaceData{ kTextureData.data() + 24, kTextureData.data() + 25, kTextureData.data() + 26, kTextureData.data() + 27, kTextureData.data() + 28, kTextureData.data() + 29, }; static const std::array kViewDirection = {glm::vec4{1.0f, 0.0f, 0.0f, 0.0f}, glm::vec4{-1.0f, 0.0f, 0.0f, 0.0f}, glm::vec4{0.0f, 1.0f, 0.0f, 0.0f}, glm::vec4{0.0f, -1.0f, 0.0f, 0.0f}, glm::vec4{0.0f, 0.0f, 1.0f, 0.0f}, glm::vec4{0.0f, 0.0f, -1.0f, 0.0f}}; // // Test uploading cube maps // // Create a cube map texture and upload different solid color into each face. Then verify the color // of each face. // namespace { void runUploadTest(IDevice& device, ICommandQueue& cmdQueue, bool singleUpload) { Result ret; //-------------------- // Create cube texture //-------------------- const TextureDesc texDesc = TextureDesc::newCube(TextureFormat::RGBA_UNorm8, kOffscreenTexWidth, kOffscreenTexHeight, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment, "runUploadTest()::tex"); auto tex = device.createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok) << ret.message; ASSERT_TRUE(tex != nullptr); //--------------------------------------------------------------------- // Upload pixel data and validate faces //--------------------------------------------------------------------- if (singleUpload) { for (size_t face = 0; face < 6; ++face) { ASSERT_TRUE(tex->upload(tex->getFullRange(0), kTextureData.data()).isOk()); } } else { for (size_t face = 0; face < 6; ++face) { ASSERT_TRUE( tex->upload(tex->getCubeFaceRange(face, 0), kBaseMipTextureFaceData[face]).isOk()); } } for (size_t face = 0; face < 6; ++face) { const auto faceStr = "Face " + std::to_string(face); util::validateUploadedTextureRange(device, cmdQueue, tex, tex->getCubeFaceRange(face), kBaseMipTextureFaceData[face], faceStr.c_str()); } } } // namespace TEST_F(TextureCubeTest, Upload_SingleUpload) { runUploadTest(*iglDev_, *cmdQueue_, true); } TEST_F(TextureCubeTest, Upload_FaceByFace) { runUploadTest(*iglDev_, *cmdQueue_, false); } // // Test uploading cube maps including mipmaps // namespace { void runUploadToMipTest(IDevice& device, ICommandQueue& cmdQueue, bool singleUpload) { Result ret; //------------------------------------ // Create cube texture with mip levels //------------------------------------ TextureDesc texDesc = TextureDesc::newCube(TextureFormat::RGBA_UNorm8, kOffscreenTexWidth, kOffscreenTexWidth, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment, "runUploadToMipTest()::tex"); texDesc.numMipLevels = 2; auto tex = device.createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok) << ret.message; ASSERT_TRUE(tex != nullptr); //--------------------------------------------------------------------- // Upload pixel data and validate faces //--------------------------------------------------------------------- if (singleUpload) { ASSERT_TRUE(tex->upload(tex->getFullRange(0, 2), kTextureData.data()).isOk()); } else { ASSERT_TRUE(tex->upload(tex->getFullRange(0, 1), kTextureData.data()).isOk()); ASSERT_TRUE(tex->upload(tex->getFullRange(1, 1), kMip1TextureFaceData[0]).isOk()); } for (size_t mipLevel = 0; mipLevel < 2; ++mipLevel) { for (size_t face = 0; face < 6; ++face) { const auto faceStr = "MipLevel " + std::to_string(mipLevel) + ";Face " + std::to_string(face); util::validateUploadedTextureRange(device, cmdQueue, tex, tex->getCubeFaceRange(face, mipLevel), mipLevel == 0 ? kBaseMipTextureFaceData[face] : kMip1TextureFaceData[face], faceStr.c_str()); } } } } // namespace TEST_F(TextureCubeTest, UploadToMip_SingleUpload) { runUploadToMipTest(*iglDev_, *cmdQueue_, true); } TEST_F(TextureCubeTest, UploadToMip_LevelByLevel) { runUploadToMipTest(*iglDev_, *cmdQueue_, false); } // // Texture Passthrough Test - Sample From Cube // // This test uses a simple shader to copy a face of the input cube texture to an // output texture that matches the size of the input texture face // TEST_F(TextureCubeTest, Passthrough_SampleFromCube) { Result ret; std::shared_ptr pipelineState; //------------------------------------- // Create input texture and upload data //------------------------------------- const TextureDesc texDesc = TextureDesc::newCube(TextureFormat::RGBA_UNorm8, kOffscreenTexWidth, kOffscreenTexHeight, TextureDesc::TextureUsageBits::Sampled, "TextureCubeTest::Passthrough_SampleFromCube::inputTexture_"); inputTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(inputTexture_ != nullptr); const auto rangeDesc = TextureRangeDesc::new2D(0, 0, kOffscreenTexWidth, kOffscreenTexHeight); ASSERT_TRUE(inputTexture_ ->upload(rangeDesc.atFace(igl::TextureCubeFace::PosX), kBaseMipTextureFaceData[0]) .isOk()); ASSERT_TRUE(inputTexture_ ->upload(rangeDesc.atFace(igl::TextureCubeFace::NegX), kBaseMipTextureFaceData[1]) .isOk()); ASSERT_TRUE(inputTexture_ ->upload(rangeDesc.atFace(igl::TextureCubeFace::PosY), kBaseMipTextureFaceData[2]) .isOk()); ASSERT_TRUE(inputTexture_ ->upload(rangeDesc.atFace(igl::TextureCubeFace::NegY), kBaseMipTextureFaceData[3]) .isOk()); ASSERT_TRUE(inputTexture_ ->upload(rangeDesc.atFace(igl::TextureCubeFace::PosZ), kBaseMipTextureFaceData[4]) .isOk()); ASSERT_TRUE(inputTexture_ ->upload(rangeDesc.atFace(igl::TextureCubeFace::NegZ), kBaseMipTextureFaceData[5]) .isOk()); //---------------- // Create Pipeline //---------------- pipelineState = iglDev_->createRenderPipeline(renderPipelineDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(pipelineState != nullptr); for (size_t face = 0; face < 6; ++face) { //------- // Render //------- cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(cmdBuf_ != nullptr); auto cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, framebuffer_); cmds->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmds->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); cmds->bindRenderPipelineState(pipelineState); cmds->bindTexture(textureUnit_, BindTarget::kFragment, inputTexture_.get()); cmds->bindSamplerState(textureUnit_, BindTarget::kFragment, samp_.get()); Result result{}; auto vertUniformBuffer = createVertexUniformBuffer(*iglDev_, &result); ASSERT_TRUE(result.isOk()); vertexUniforms_.viewDirection = kViewDirection[face]; *static_cast(vertUniformBuffer->getData()) = vertexUniforms_; vertUniformBuffer->bind(*iglDev_, *pipelineState, *cmds); cmds->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmds->drawIndexed(6); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); cmdBuf_->waitUntilCompleted(); //---------------- // Validate output //---------------- const auto faceStr = std::string("Face ") + std::to_string(face); util::validateFramebufferTexture( *iglDev_, *cmdQueue_, *framebuffer_, kBaseMipTextureFaceData[face], faceStr.c_str()); } } // // Texture Passthrough Test - Render To Cube // // This test uses a simple shader to copy a non-cube input texture to an // a single face of the cube output texture. The size of the input texture matches the size of a // single face in the output texture. // TEST_F(TextureCubeTest, Passthrough_RenderToCube) { Result ret; std::shared_ptr pipelineState; //--------------------------------- // Create input and output textures //--------------------------------- TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kOffscreenTexWidth, kOffscreenTexHeight, TextureDesc::TextureUsageBits::Sampled, "TextureCubeTest::Passthrough_RenderToCube::inputTexture_"); inputTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(inputTexture_ != nullptr); texDesc = TextureDesc::newCube( TextureFormat::RGBA_UNorm8, kOffscreenTexWidth, kOffscreenTexHeight, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment, "TextureCubeTest::Passthrough_RenderToCube::customOffscreenTexture"); auto customOffscreenTexture = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(customOffscreenTexture != nullptr); const auto rangeDesc = TextureRangeDesc::new2D(0, 0, kOffscreenTexWidth, kOffscreenTexHeight); const size_t bytesPerRow = kOffscreenTexWidth * 4; //-------------------------- // Create custom framebuffer //-------------------------- FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = customOffscreenTexture; auto customFramebuffer = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(customFramebuffer != nullptr); //---------------------------- // Create custom shader stages //---------------------------- std::unique_ptr customStages; igl::tests::util::createSimpleShaderStages(iglDev_, customStages); renderPipelineDesc_.shaderStages = std::move(customStages); //---------------- // Create Pipeline //---------------- pipelineState = iglDev_->createRenderPipeline(renderPipelineDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(pipelineState != nullptr); for (size_t face = 0; face < 6; ++face) { //------------------ // Upload layer data //------------------ ASSERT_TRUE( inputTexture_->upload(rangeDesc, kBaseMipTextureFaceData[face], bytesPerRow).isOk()); //------- // Render //------- cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(cmdBuf_ != nullptr); renderPass_.colorAttachments[0].face = face; auto cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, customFramebuffer); cmds->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmds->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); cmds->bindRenderPipelineState(pipelineState); cmds->bindTexture(textureUnit_, BindTarget::kFragment, inputTexture_.get()); cmds->bindSamplerState(textureUnit_, BindTarget::kFragment, samp_.get()); cmds->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmds->drawIndexed(6); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); cmdBuf_->waitUntilCompleted(); } // Validate in a separate loop to ensure all faces are already written for (size_t face = 0; face < 6; ++face) { //---------------- // Validate output //---------------- const auto faceStr = "Face " + std::to_string(face); util::validateFramebufferTextureRange(*iglDev_, *cmdQueue_, *customFramebuffer, customOffscreenTexture->getCubeFaceRange(face), kBaseMipTextureFaceData[face], faceStr.c_str()); } } // // Test ITexture::getEstimatedSizeInBytes // TEST_F(TextureCubeTest, GetEstimatedSizeInBytes) { auto calcSize = [&](size_t width, size_t height, TextureFormat format, size_t numMipLevels) -> size_t { Result ret; TextureDesc texDesc = TextureDesc::newCube(format, width, height, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment, "TextureCubeTest::GetEstimatedSizeInBytes::texture"); texDesc.numMipLevels = numMipLevels; auto texture = iglDev_->createTexture(texDesc, &ret); if (ret.code != Result::Code::Ok || texture == nullptr) { return 0; } return texture->getEstimatedSizeInBytes(); }; const auto format = iglDev_->getBackendType() == BackendType::OpenGL ? TextureFormat::R5G5B5A1_UNorm : TextureFormat::RGBA_UNorm8; const uint32_t formatBytes = iglDev_->getBackendType() == BackendType::OpenGL ? 2u : 4u; uint32_t bytes = 0; bytes = 34u * 34u * formatBytes * 6u; ASSERT_EQ(calcSize(34, 34, format, 1), bytes); bytes = (16u * 16u + 8u * 8u + 4u * 4u + 2u * 2u + 1u) * formatBytes * 6u; ASSERT_EQ(calcSize(16, 16, format, 5), bytes); } // // Test ITexture::getFullRange, ITexture::getFullMipRange, and ITexture::getCubeFaceRange and // TEST_F(TextureCubeTest, GetRange) { auto createTexture = [&](size_t width, size_t height, TextureFormat format, size_t numMipLevels) -> std::shared_ptr { Result ret; TextureDesc texDesc = TextureDesc::newCube(format, width, height, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment, "TextureCubeTest::GetRange::texture"); texDesc.numMipLevels = numMipLevels; auto texture = iglDev_->createTexture(texDesc, &ret); if (ret.code != Result::Code::Ok || texture == nullptr) { return {}; } return texture; }; auto getFullRange = [&](size_t width, size_t height, TextureFormat format, // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) size_t numMipLevels, size_t rangeMipLevel = 0, size_t rangeNumMipLevels = 0) -> TextureRangeDesc { auto tex = createTexture(width, height, format, numMipLevels); return tex ? tex->getFullRange(rangeMipLevel, rangeNumMipLevels ? rangeNumMipLevels : numMipLevels) : TextureRangeDesc{}; }; auto getFullMipRange = [&](size_t width, size_t height, TextureFormat format, // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) size_t numMipLevels) -> TextureRangeDesc { auto tex = createTexture(width, height, format, numMipLevels); return tex ? tex->getFullMipRange() : TextureRangeDesc{}; }; auto getCubeFaceRangeEnum = [&](size_t width, size_t height, TextureFormat format, size_t numMipLevels, TextureCubeFace face, size_t rangeMipLevel = 0, size_t rangeNumMipLevels = 0) -> TextureRangeDesc { auto tex = createTexture(width, height, format, numMipLevels); return tex ? tex->getCubeFaceRange( face, rangeMipLevel, rangeNumMipLevels ? rangeNumMipLevels : numMipLevels) : TextureRangeDesc{}; }; auto getCubeFaceRangeNum = [&](size_t width, size_t height, TextureFormat format, size_t numMipLevels, size_t face, size_t rangeMipLevel = 0, size_t rangeNumMipLevels = 0) -> TextureRangeDesc { auto tex = createTexture(width, height, format, numMipLevels); return tex ? tex->getCubeFaceRange( face, rangeMipLevel, rangeNumMipLevels ? rangeNumMipLevels : numMipLevels) : TextureRangeDesc{}; }; auto rangesAreEqual = [&](const TextureRangeDesc& a, const TextureRangeDesc& b) -> bool { return memcmp(&a, &b, sizeof(TextureRangeDesc)) == 0; }; const auto format = iglDev_->getBackendType() == BackendType::OpenGL ? TextureFormat::R5G5B5A1_UNorm : TextureFormat::RGBA_UNorm8; TextureRangeDesc range; range = TextureRangeDesc::newCube(0, 0, 34, 34, 0, 1); ASSERT_TRUE(rangesAreEqual(getFullRange(34, 34, format, 1), range)); ASSERT_TRUE(rangesAreEqual(getCubeFaceRangeEnum(34, 34, format, 1, TextureCubeFace::NegX), range.atFace(TextureCubeFace::NegX))); ASSERT_TRUE(rangesAreEqual(getCubeFaceRangeNum(34, 34, format, 1, 1), range.atFace(1))); range = TextureRangeDesc::newCube(0, 0, 16, 16, 0, 5); ASSERT_TRUE(rangesAreEqual(getFullRange(16, 16, format, 5), range)); ASSERT_TRUE(rangesAreEqual(getCubeFaceRangeEnum(16, 16, format, 5, TextureCubeFace::NegX), range.atFace(TextureCubeFace::NegX))); ASSERT_TRUE(rangesAreEqual(getCubeFaceRangeNum(16, 16, format, 5, 1), range.atFace(1))); // Subset of mip levels ASSERT_TRUE(rangesAreEqual(getFullRange(16, 16, format, 5, 1, 1), range.atMipLevel(1))); ASSERT_TRUE(rangesAreEqual(getCubeFaceRangeEnum(16, 16, format, 5, TextureCubeFace::NegX, 1, 1), range.atFace(TextureCubeFace::NegX).atMipLevel(1))); ASSERT_TRUE(rangesAreEqual(getCubeFaceRangeNum(16, 16, format, 5, 1, 1, 1), range.atFace(1).atMipLevel(1))); ASSERT_TRUE(rangesAreEqual(getFullMipRange(16, 16, format, 5), range.withNumMipLevels(5))); } } // namespace igl::tests ================================================ FILE: src/igl/tests/TextureFloat.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "data/ShaderData.h" #include "data/VertexIndexData.h" #include "util/Color.h" #include "util/Common.h" #include "util/TextureValidationHelpers.h" #include #include #include #include #include #include namespace igl::tests { // Picking this just to match the texture we will use. If you use a different // size texture, then you will have to either create a new offscreenTexture_ // and the framebuffer object in your test, so know exactly what the end result // would be after sampling constexpr size_t kOffscreenTexWidth = 2; constexpr size_t kOffscreenTexHeight = 2; // clang-format off const glm::vec4 kR = igl::tests::util::convertSRGBToLinear(glm::vec4(0x1F / 255.0, 0x00/255.0, 0x00/255.0, 0x0F/255.0)); // 0x1F00000F const glm::vec4 kG = igl::tests::util::convertSRGBToLinear(glm::vec4(0x00 / 255.0, 0x2F/255.0, 0x00/255.0, 0x1F/255.0)); // 0x002F001F; const glm::vec4 kB = igl::tests::util::convertSRGBToLinear(glm::vec4(0x00 / 255.0, 0x00/255.0, 0x3F/255.0, 0x2F/255.0)); // 0x00003F2F; const glm::vec4 kC = igl::tests::util::convertSRGBToLinear(glm::vec4(0x00 / 255.0, 0x4F/255.0, 0x5F/255.0, 0x3F/255.0)); // 0x004F5F3F; const glm::vec4 kM = igl::tests::util::convertSRGBToLinear(glm::vec4(0x6F / 255.0, 0x00/255.0, 0x7F/255.0, 0x4F/255.0)); // 0x6F007F4F; const glm::vec4 kY = igl::tests::util::convertSRGBToLinear(glm::vec4(0x8F / 255.0, 0x9F/255.0, 0x00/255.0, 0x5F/255.0)); // 0x8F9F005F; const std::array kTextureDataRGBA = { kR, kR, kR, kR, // Base Mip, Layer 0 kG, kG, kG, kG, // Base Mip, Layer 1 kB, kB, kB, kB, // Base Mip, Layer 2 kC, // Mip 1, Layer 0 kM, // Mip 1, Layer 1 kY, // Mip 1, Layer 2 }; const std::array kTextureDataRGB = { glm::vec3(kR), glm::vec3(kR), glm::vec3(kR), glm::vec3(kR), // Base Mip, Layer 0 glm::vec3(kG), glm::vec3(kG), glm::vec3(kG), glm::vec3(kG), // Base Mip, Layer 1 glm::vec3(kB), glm::vec3(kB), glm::vec3(kB), glm::vec3(kB), // Base Mip, Layer 2 glm::vec3(kC), // Mip 1, Layer 0 glm::vec3(kM), // Mip 1, Layer 1 glm::vec3(kY), // Mip 1, Layer 2 }; const std::array kTextureDataRG = { glm::vec2(kR), glm::vec2(kR), glm::vec2(kR), glm::vec2(kR), // Base Mip, Layer 0 glm::vec2(kG), glm::vec2(kG), glm::vec2(kG), glm::vec2(kG), // Base Mip, Layer 1 glm::vec2(kB), glm::vec2(kB), glm::vec2(kB), glm::vec2(kB), // Base Mip, Layer 2 glm::vec2(kC), // Mip 1, Layer 0 glm::vec2(kM), // Mip 1, Layer 1 glm::vec2(kY), // Mip 1, Layer 2 }; const std::array kTextureDataR = { kR.y, kR.y, kR.y, kR.y, // Base Mip, Layer 0 kG.y, kG.y, kG.y, kG.y, // Base Mip, Layer 1 kB.y, kB.y, kB.y, kB.y, // Base Mip, Layer 2 kC.y, // Mip 1, Layer 0 kM.y, // Mip 1, Layer 1 kY.y, // Mip 1, Layer 2 }; // clang-format on struct VertexUniforms { int layer = 0; }; // // TextureFloatTest // // Test fixture for all the tests in this file. Takes care of common // initialization and allocating of common resources. // class TextureFloatTest : public ::testing::Test { private: public: TextureFloatTest() = default; ~TextureFloatTest() override = default; std::shared_ptr createVertexUniformBuffer(IDevice& device, Result* /*result*/) { std::shared_ptr vertUniformBuffer = nullptr; const iglu::ManagedUniformBufferInfo vertInfo = { .index = 2, .length = sizeof(VertexUniforms), .uniforms = { UniformDesc{ .name = "layer", .type = igl::UniformType::Int, .offset = offsetof(VertexUniforms, layer), }, }}; vertUniformBuffer = std::make_shared(device, vertInfo); IGL_DEBUG_ASSERT(vertUniformBuffer->result.isOk()); return vertUniformBuffer; } void createPassthroughFrameBuffer(TextureFormat format) { // Create an offscreen texture to render to const TextureDesc texDesc = TextureDesc::new2D( format, kOffscreenTexWidth, kOffscreenTexHeight, TextureDesc::TextureUsageBits::Attachment); Result ret; offscreenTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok) << "RetCode: " << static_cast(ret.code) << " Message: " << ret.message; ASSERT_TRUE(offscreenTexture_ != nullptr); ASSERT_TRUE(offscreenTexture_->getFormat() == format); // Create framebuffer using the offscreen texture FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = offscreenTexture_; framebuffer_ = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(framebuffer_ != nullptr); ASSERT_TRUE(offscreenTexture_->getFormat() == format); } void createShaderStages() { // Initialize shader stages std::unique_ptr stages; igl::tests::util::createSimpleShaderStages(iglDev_, stages, offscreenTexture_->getFormat()); ASSERT_TRUE(stages != nullptr); shaderStages_ = std::move(stages); } void initializeRenderPipeline() { // Initialize Graphics Pipeline Descriptor, but leave the creation // to the individual tests in case further customization is required renderPipelineDesc_.vertexInputState = vertexInputState_; renderPipelineDesc_.shaderStages = shaderStages_; renderPipelineDesc_.targetDesc.colorAttachments.resize(1); renderPipelineDesc_.targetDesc.colorAttachments[0].textureFormat = offscreenTexture_->getFormat(); renderPipelineDesc_.fragmentUnitSamplerMap[textureUnit_] = IGL_NAMEHANDLE(data::shader::kSimpleSampler); renderPipelineDesc_.cullMode = igl::CullMode::Disabled; } // // SetUp() // // This function sets up a render pass and a graphics pipeline descriptor // so it is ready to render a simple quad with an input texture to an // offscreen texture. // // The actual creation of the graphics pipeline state object is left // to each test so that tests can replace the default settings with // something more appropriate. // void SetUp() override { #if IGL_PLATFORM_LINUX && !IGL_PLATFORM_LINUX_USE_EGL GTEST_SKIP() << "Fix these tests on Linux"; #endif setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_TRUE(iglDev_ != nullptr); ASSERT_TRUE(cmdQueue_ != nullptr); if (!iglDev_->hasFeature(DeviceFeatures::TextureFloat) && !iglDev_->hasFeature(DeviceFeatures::Texture2DArray)) { GTEST_SKIP() << "2D float texture array is unsupported for this platform."; return; } // Those tests just crash on macos but run fine on android opengles #if IGL_PLATFORM_MACOSX || IGL_PLATFORM_IOS_SIMULATOR if (iglDev_->getBackendType() == BackendType::OpenGL) { GTEST_SKIP() << "Skip due to lack of support for OpenGL on Macos"; } #endif Result ret; createPassthroughFrameBuffer(igl::TextureFormat::RGBA_F32); // Initialize render pass descriptor renderPass_.colorAttachments.resize(1); renderPass_.colorAttachments[0].loadAction = LoadAction::Clear; renderPass_.colorAttachments[0].storeAction = StoreAction::Store; renderPass_.colorAttachments[0].clearColor = {0.0, 0.0, 0.0, 1.0}; createShaderStages(); // Initialize input to vertex shader VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Float4; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].bufferIndex = data::shader::kSimplePosIndex; inputDesc.attributes[0].name = data::shader::kSimplePos; inputDesc.attributes[0].location = 0; inputDesc.inputBindings[0].stride = sizeof(float) * 4; inputDesc.attributes[1].format = VertexAttributeFormat::Float2; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].bufferIndex = data::shader::kSimpleUvIndex; inputDesc.attributes[1].name = data::shader::kSimpleUv; inputDesc.attributes[1].location = 1; inputDesc.inputBindings[1].stride = sizeof(float) * 2; // numAttributes has to equal to bindings when using more than 1 buffer inputDesc.numAttributes = inputDesc.numInputBindings = 2; vertexInputState_ = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vertexInputState_ != nullptr); // Initialize index buffer BufferDesc bufDesc; bufDesc.type = BufferDesc::BufferTypeBits::Index; bufDesc.data = data::vertex_index::kQuadInd.data(); bufDesc.length = sizeof(data::vertex_index::kQuadInd); ib_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(ib_ != nullptr); // Initialize vertex and sampler buffers bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data::vertex_index::kQuadVert.data(); bufDesc.length = sizeof(data::vertex_index::kQuadVert); vb_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vb_ != nullptr); // Initialize UV data and sampler buffer bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data::vertex_index::kQuadUv.data(); bufDesc.length = sizeof(data::vertex_index::kQuadUv); uv_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(uv_ != nullptr); // Initialize sampler state const SamplerStateDesc samplerDesc; samp_ = iglDev_->createSamplerState(samplerDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(samp_ != nullptr); initializeRenderPipeline(); } void TearDown() override {} template void runPassthroughFormat(TextureFormat format, const ColorType* data) { std::shared_ptr pipelineState; createPassthroughFrameBuffer(format); ASSERT_TRUE(offscreenTexture_ != nullptr); ASSERT_TRUE(offscreenTexture_->getFormat() == format); createShaderStages(); initializeRenderPipeline(); Result ret; //------------------------------------- // Create input texture and upload data //------------------------------------- const TextureDesc texDesc = TextureDesc::new2D( format, kOffscreenTexWidth, kOffscreenTexHeight, TextureDesc::TextureUsageBits::Sampled); inputTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(inputTexture_ != nullptr); const auto rangeDesc = TextureRangeDesc::new2D(0, 0, kOffscreenTexWidth, kOffscreenTexHeight); const size_t bytesPerRow = kOffscreenTexWidth * inputTexture_->getProperties().bytesPerBlock; // // upload and redownload to make sure that we've uploaded successfully. // ASSERT_TRUE(inputTexture_->upload(rangeDesc, data, bytesPerRow).isOk()); //---------------- // Create Pipeline //---------------- pipelineState = iglDev_->createRenderPipeline(renderPipelineDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(pipelineState != nullptr); //------- // Render //------- cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(cmdBuf_ != nullptr); auto cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, framebuffer_); cmds->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmds->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); cmds->bindRenderPipelineState(pipelineState); cmds->bindTexture(textureUnit_, BindTarget::kFragment, inputTexture_.get()); cmds->bindSamplerState(textureUnit_, BindTarget::kFragment, samp_.get()); Result result{}; auto vertUniformBuffer = createVertexUniformBuffer(*iglDev_, &result); ASSERT_TRUE(result.isOk()); vertexUniforms_.layer = static_cast(1); *static_cast(vertUniformBuffer->getData()) = vertexUniforms_; vertUniformBuffer->bind(*iglDev_, *pipelineState, *cmds); cmds->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmds->drawIndexed(6); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); cmdBuf_->waitUntilCompleted(); //---------------- // Validate output //---------------- const auto* layerStr = "Layer 0"; util::validateFramebufferTexture(*iglDev_, *cmdQueue_, *framebuffer_, data, layerStr); } // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; std::shared_ptr cmdBuf_; CommandBufferDesc cbDesc_ = {}; RenderPassDesc renderPass_; std::shared_ptr offscreenTexture_; std::shared_ptr framebuffer_; // Currently it is left to individual tests to initialize this std::shared_ptr inputTexture_; std::shared_ptr shaderStages_; std::shared_ptr vertexInputState_; std::shared_ptr vb_, uv_, ib_; std::shared_ptr samp_; RenderPipelineDesc renderPipelineDesc_; VertexUniforms vertexUniforms_; size_t textureUnit_ = 0; }; // // Texture Upload Test // // This test uploads data to an array texture and then downloads it again to validate it // namespace { template void runUploadTest(IDevice& device, ICommandQueue& cmdQueue, TextureFormat format, const ColorType* data) { Result ret; const std::shared_ptr pipelineState; //------------------------------------- // Create input texture and upload data //------------------------------------- const TextureDesc texDesc = TextureDesc::new2D( format, kOffscreenTexWidth, kOffscreenTexHeight, TextureDesc::TextureUsageBits::Sampled); auto tex = device.createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(tex != nullptr); // // upload and redownload to make sure that we've uploaded successfully. // const auto uploadRange = TextureRangeDesc::new2D(0, 0, kOffscreenTexWidth, kOffscreenTexHeight, 0); ASSERT_TRUE(tex->upload(uploadRange, data).isOk()); //-------------------------------- // Verify against original texture //-------------------------------- const auto* layerStr = "Layer 0"; util::validateUploadedTextureRange(device, cmdQueue, tex, tex->getLayerRange(0), data, layerStr); } } // namespace TEST_F(TextureFloatTest, Upload_RGBA32) { runUploadTest(*iglDev_, *cmdQueue_, igl::TextureFormat::RGBA_F32, kTextureDataRGBA.data()); } TEST_F(TextureFloatTest, Upload_RGB32) { if (iglDev_->getBackendType() == BackendType::Vulkan || iglDev_->getBackendType() == BackendType::Metal || iglDev_->getBackendVersion().flavor == BackendFlavor::OpenGL_ES) { GTEST_SKIP() << "Skip due to lack of support for RGB"; } runUploadTest(*iglDev_, *cmdQueue_, igl::TextureFormat::RGB_F32, kTextureDataRGB.data()); } TEST_F(TextureFloatTest, Upload_RG32) { runUploadTest(*iglDev_, *cmdQueue_, igl::TextureFormat::RG_F32, kTextureDataRG.data()); } TEST_F(TextureFloatTest, Upload_R32) { runUploadTest(*iglDev_, *cmdQueue_, igl::TextureFormat::R_F32, kTextureDataR.data()); } // // Texture Passthrough Test - Sample From Array // // This test uses a simple shader to copy a layer of the input array texture to an // a output texture that matches the size of the input texture layer // TEST_F(TextureFloatTest, Passthrough_SampleRGBA32) { runPassthroughFormat(igl::TextureFormat::RGBA_F32, kTextureDataRGBA.data()); } TEST_F(TextureFloatTest, Passthrough_SampleRGB32) { #if IGL_PLATFORM_WINDOWS && !IGL_ANGLE GTEST_SKIP() << "Skipping due to known issue on Windows without angle"; #endif if (iglDev_->getBackendType() == BackendType::Vulkan || iglDev_->getBackendType() == BackendType::Metal || iglDev_->getBackendVersion().flavor == BackendFlavor::OpenGL_ES) { GTEST_SKIP() << "Skip due to lack of support for RGB"; } runPassthroughFormat(igl::TextureFormat::RGB_F32, kTextureDataRGB.data()); } TEST_F(TextureFloatTest, Passthrough_SampleRG32) { runPassthroughFormat(igl::TextureFormat::RG_F32, kTextureDataRG.data()); } TEST_F(TextureFloatTest, Passthrough_SampleR32) { runPassthroughFormat(igl::TextureFormat::R_F32, kTextureDataR.data()); } } // namespace igl::tests ================================================ FILE: src/igl/tests/TextureFormat.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "util/TextureFormatTestBase.h" namespace igl::tests { class TextureFormatTest : public util::TextureFormatTestBase { private: public: TextureFormatTest() = default; ~TextureFormatTest() override = default; }; TEST_F(TextureFormatTest, Sampled) { testUsage(TextureDesc::TextureUsageBits::Sampled, "Sampled"); } TEST_F(TextureFormatTest, SampledAttachment) { testUsage(TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment, "SampledAttachment"); } TEST_F(TextureFormatTest, Attachment) { testUsage(TextureDesc::TextureUsageBits::Attachment, "Attachment"); } TEST_F(TextureFormatTest, Storage) { testUsage(TextureDesc::TextureUsageBits::Storage, "Storage"); } TEST(TextureFormatUtilsTest, UnormTosRGB) { EXPECT_EQ(linearTosRGB(igl::TextureFormat::RGBA_UNorm8), igl::TextureFormat::RGBA_SRGB); EXPECT_EQ(linearTosRGB(igl::TextureFormat::BGRA_UNorm8), igl::TextureFormat::BGRA_SRGB); EXPECT_EQ(sRGBToLinear(igl::TextureFormat::RGBA_SRGB), igl::TextureFormat::RGBA_UNorm8); EXPECT_EQ(sRGBToLinear(igl::TextureFormat::BGRA_SRGB), igl::TextureFormat::BGRA_UNorm8); } TEST(TextureFormatUtilsTest, RgbaToBgra) { EXPECT_EQ(RgbaToBgra(igl::TextureFormat::RGBA_UNorm8), igl::TextureFormat::BGRA_UNorm8); EXPECT_EQ(RgbaToBgra(igl::TextureFormat::RGBA_SRGB), igl::TextureFormat::BGRA_SRGB); EXPECT_EQ(BgraToRgba(igl::TextureFormat::BGRA_UNorm8), igl::TextureFormat::RGBA_UNorm8); EXPECT_EQ(BgraToRgba(igl::TextureFormat::BGRA_SRGB), igl::TextureFormat::RGBA_SRGB); } } // namespace igl::tests ================================================ FILE: src/igl/tests/TextureFormatProperties.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "data/ShaderData.h" #include "data/VertexIndexData.h" #include "util/Common.h" #include #include #include #include #include #include #include #include #include namespace igl::tests { // Picking this just to match the texture we will use. If you use a different // size texture, then you will have to either create a new offscreenTexture_ // and the framebuffer object in your test, so know exactly what the end result // would be after sampling constexpr uint32_t kOffscreenTexWidth = 2u; constexpr uint32_t kOffscreenTexHeight = 2u; // // TextureTest // // Test fixture for all the tests in this file. Takes care of common // initialization and allocating of common resources. // class TextureTest : public ::testing::Test { private: public: TextureTest() = default; ~TextureTest() override = default; // // SetUp() // // This function sets up a render pass and a graphics pipeline descriptor // so it is ready to render a simple quad with an input texture to an // offscreen texture. // // The actual creation of the graphics pipeline state object is left // to each test so that tests can replace the default settings with // something more appropriate. // void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_TRUE(iglDev_ != nullptr); ASSERT_TRUE(cmdQueue_ != nullptr); // Create an offscreen texture to render to TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kOffscreenTexWidth, kOffscreenTexHeight, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); texDesc.debugName = "test"; Result ret; offscreenTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok) << ret.message; ASSERT_TRUE(offscreenTexture_ != nullptr); // Create framebuffer using the offscreen texture FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = offscreenTexture_; framebuffer_ = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(framebuffer_ != nullptr); // Initialize render pass descriptor renderPass_.colorAttachments.resize(1); renderPass_.colorAttachments[0].loadAction = LoadAction::Clear; renderPass_.colorAttachments[0].storeAction = StoreAction::Store; renderPass_.colorAttachments[0].clearColor = {0.0, 0.0, 0.0, 1.0}; // Initialize shader stages std::unique_ptr stages; igl::tests::util::createSimpleShaderStages(iglDev_, stages); shaderStages_ = std::move(stages); // Initialize input to vertex shader VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Float4; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].bufferIndex = data::shader::kSimplePosIndex; inputDesc.attributes[0].name = data::shader::kSimplePos; inputDesc.attributes[0].location = 0; inputDesc.inputBindings[0].stride = sizeof(float) * 4; inputDesc.attributes[1].format = VertexAttributeFormat::Float2; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].bufferIndex = data::shader::kSimpleUvIndex; inputDesc.attributes[1].name = data::shader::kSimpleUv; inputDesc.attributes[1].location = 1; inputDesc.inputBindings[1].stride = sizeof(float) * 2; // numAttributes has to equal to bindings when using more than 1 buffer inputDesc.numAttributes = inputDesc.numInputBindings = 2; vertexInputState_ = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vertexInputState_ != nullptr); // Initialize index buffer BufferDesc bufDesc; bufDesc.type = BufferDesc::BufferTypeBits::Index; bufDesc.data = data::vertex_index::kQuadInd.data(); bufDesc.length = sizeof(data::vertex_index::kQuadInd); ib_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(ib_ != nullptr); // Initialize vertex and sampler buffers bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data::vertex_index::kQuadVert.data(); bufDesc.length = sizeof(data::vertex_index::kQuadVert); vb_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vb_ != nullptr); bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data::vertex_index::kQuadUv.data(); bufDesc.length = sizeof(data::vertex_index::kQuadUv); uv_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(uv_ != nullptr); // Initialize sampler state const SamplerStateDesc samplerDesc; samp_ = iglDev_->createSamplerState(samplerDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(samp_ != nullptr); // Initialize Graphics Pipeline Descriptor, but leave the creation // to the individual tests in case further customization is required renderPipelineDesc_.vertexInputState = vertexInputState_; renderPipelineDesc_.shaderStages = shaderStages_; renderPipelineDesc_.targetDesc.colorAttachments.resize(1); renderPipelineDesc_.targetDesc.colorAttachments[0].textureFormat = offscreenTexture_->getFormat(); renderPipelineDesc_.fragmentUnitSamplerMap[textureUnit_] = IGL_NAMEHANDLE(data::shader::kSimpleSampler); renderPipelineDesc_.cullMode = igl::CullMode::Disabled; } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; std::shared_ptr cmdBuf_; CommandBufferDesc cbDesc_ = {}; const std::string backend_ = IGL_BACKEND_TYPE; RenderPassDesc renderPass_; std::shared_ptr offscreenTexture_; std::shared_ptr framebuffer_; // Currently it is left to individual tests to initialize this std::shared_ptr inputTexture_; std::shared_ptr shaderStages_; std::shared_ptr vertexInputState_; std::shared_ptr vb_, uv_, ib_; std::shared_ptr samp_; RenderPipelineDesc renderPipelineDesc_; size_t textureUnit_ = 0; }; TEST(TextureFormatProperties, Construction) { { const auto props = TextureFormatProperties::fromTextureFormat(TextureFormat::RGBA_UNorm8); EXPECT_EQ(std::string(props.name), std::string("RGBA_UNorm8")); EXPECT_EQ(props.format, TextureFormat::RGBA_UNorm8); EXPECT_EQ(props.componentsPerPixel, 4); EXPECT_EQ(props.bytesPerBlock, 4); EXPECT_EQ(props.blockWidth, 1); EXPECT_EQ(props.blockHeight, 1); EXPECT_EQ(props.blockDepth, 1); EXPECT_EQ(props.minBlocksX, 1); EXPECT_EQ(props.minBlocksY, 1); EXPECT_EQ(props.minBlocksZ, 1); } { const auto props = TextureFormatProperties::fromTextureFormat(TextureFormat::RGB_PVRTC_2BPPV1); EXPECT_EQ(std::string(props.name), std::string("RGB_PVRTC_2BPPV1")); EXPECT_EQ(props.format, TextureFormat::RGB_PVRTC_2BPPV1); EXPECT_EQ(props.componentsPerPixel, 3); EXPECT_EQ(props.bytesPerBlock, 8); EXPECT_EQ(props.blockWidth, 8); EXPECT_EQ(props.blockHeight, 4); EXPECT_EQ(props.blockDepth, 1); EXPECT_EQ(props.minBlocksX, 2); EXPECT_EQ(props.minBlocksY, 2); EXPECT_EQ(props.minBlocksZ, 1); } } TEST(TextureFormatProperties, GetRows) { { const auto range = TextureRangeDesc::new2D(0, 0, 2, 2); const auto props = TextureFormatProperties::fromTextureFormat(TextureFormat::RGBA_UNorm8); EXPECT_EQ(props.getRows(range), 2); EXPECT_EQ(props.getRows(range.withNumMipLevels(2)), 3); } { const auto range = TextureRangeDesc::new2D(0, 0, 2, 2); const auto props = TextureFormatProperties::fromTextureFormat(TextureFormat::RGB_PVRTC_2BPPV1); // MinBlocksY = 2 EXPECT_EQ(props.getRows(range), 2); EXPECT_EQ(props.getRows(range.withNumMipLevels(2)), 4); } { const auto range = TextureRangeDesc::new3D(0, 0, 0, 2, 2, 2); const auto props = TextureFormatProperties::fromTextureFormat(TextureFormat::RGBA_UNorm8); EXPECT_EQ(props.getRows(range), 4); EXPECT_EQ(props.getRows(range.withNumMipLevels(2)), 5); } { const auto range = TextureRangeDesc::new3D(0, 0, 0, 2, 2, 2); const auto props = TextureFormatProperties::fromTextureFormat(TextureFormat::RGB_PVRTC_2BPPV1); // MinBlocksY = 2 EXPECT_EQ(props.getRows(range), 4); EXPECT_EQ(props.getRows(range.withNumMipLevels(2)), 6); } { const auto range = TextureRangeDesc::new2DArray(0, 0, 2, 2, 0, 2); const auto props = TextureFormatProperties::fromTextureFormat(TextureFormat::RGBA_UNorm8); EXPECT_EQ(props.getRows(range), 4); EXPECT_EQ(props.getRows(range.withNumMipLevels(2)), 6); } { const auto range = TextureRangeDesc::new2DArray(0, 0, 2, 2, 0, 2); const auto props = TextureFormatProperties::fromTextureFormat(TextureFormat::RGB_PVRTC_2BPPV1); // MinBlocksY = 2 EXPECT_EQ(props.getRows(range), 4); EXPECT_EQ(props.getRows(range.withNumMipLevels(2)), 8); } { const auto range = TextureRangeDesc::newCube(0, 0, 2, 2); const auto props = TextureFormatProperties::fromTextureFormat(TextureFormat::RGBA_UNorm8); EXPECT_EQ(props.getRows(range), 12); EXPECT_EQ(props.getRows(range.atFace(TextureCubeFace::NegX)), 2); EXPECT_EQ(props.getRows(range.withNumMipLevels(2)), 18); } { const auto range = TextureRangeDesc::newCube(0, 0, 2, 2); const auto props = TextureFormatProperties::fromTextureFormat(TextureFormat::RGB_PVRTC_2BPPV1); // MinBlocksY = 2 EXPECT_EQ(props.getRows(range), 12); EXPECT_EQ(props.getRows(range.atFace(TextureCubeFace::NegX)), 2); EXPECT_EQ(props.getRows(range.withNumMipLevels(2)), 24); } } TEST(TextureFormatProperties, GetBytesPerRow) { const auto range = TextureRangeDesc::new2D(0, 0, 2, 2); { const auto props = TextureFormatProperties::fromTextureFormat(TextureFormat::RGBA_UNorm8); EXPECT_EQ(props.getBytesPerRow(range), 2 * 4); } { const auto props = TextureFormatProperties::fromTextureFormat(TextureFormat::RGB_PVRTC_2BPPV1); // minBlocksX = 2 EXPECT_EQ(props.getBytesPerRow(range), 2 * 1 * 8); } } TEST(TextureFormatProperties, getBytesPerLayer) { const auto range = TextureRangeDesc::new2D(0, 0, 10, 10); { const auto props = TextureFormatProperties::fromTextureFormat(TextureFormat::RGBA_UNorm8); EXPECT_EQ(props.getBytesPerLayer(range), 10 * 10 * 4); EXPECT_EQ(props.getBytesPerLayer(range, 50), 10 * 50); EXPECT_EQ(props.getBytesPerLayer(10, 10, 1), 10 * 10 * 4); EXPECT_EQ(props.getBytesPerLayer(10, 10, 1, 50), 10 * 50); } { const auto props = TextureFormatProperties::fromTextureFormat(TextureFormat::RGB_PVRTC_2BPPV1); // 2 blocks x 3 blocks EXPECT_EQ(props.getBytesPerLayer(range), 2 * 3 * 8); EXPECT_EQ(props.getBytesPerLayer(10, 10, 1), 2 * 3 * 8); } } TEST(TextureFormatProperties, getBytesPerRange) { auto range = TextureRangeDesc::new2D(0, 0, 10, 10, 0, 3); auto cubeRange = TextureRangeDesc::newCube(0, 0, 10, 10, 0, 3); auto cubeFaceRange = TextureRangeDesc::newCubeFace(0, 0, 10, 10, TextureCubeFace::PosZ, 0, 3); { const auto props = TextureFormatProperties::fromTextureFormat(TextureFormat::RGBA_UNorm8); // Level 0: 10 pixels x 10 pixels // Level 1: 5 pixels x 5 pixels // Level 2: 2 pixels x 2 pixels const auto bytes = ((10 * 10) + (5 * 5) + (2 * 2)) * 4; EXPECT_EQ(props.getBytesPerRange(range), bytes); EXPECT_EQ(props.getBytesPerRange(cubeRange), bytes * 6); EXPECT_EQ(props.getBytesPerRange(cubeFaceRange), bytes); } { const auto props = TextureFormatProperties::fromTextureFormat(TextureFormat::RGBA_UNorm8); // Level 0: 10 pixels x 10 pixels const auto bytes = 10 * 50; EXPECT_EQ(props.getBytesPerRange(range.atMipLevel(0), 50), bytes); EXPECT_EQ(props.getBytesPerRange(cubeRange.atMipLevel(0), 50), bytes * 6); EXPECT_EQ(props.getBytesPerRange(cubeFaceRange.atMipLevel(0), 50), bytes); } { const auto props = TextureFormatProperties::fromTextureFormat(TextureFormat::RGB_PVRTC_2BPPV1); // Level 0: 2 blocks x 3 blocks // Level 1: 2 blocks x 2 blocks // Level 2: 2 blocks x 2 blocks const auto bytes = ((2 * 3) + (2 * 2) + (2 * 2)) * 8; EXPECT_EQ(props.getBytesPerRange(range), bytes); EXPECT_EQ(props.getBytesPerRange(cubeRange), bytes * 6); EXPECT_EQ(props.getBytesPerRange(cubeFaceRange), bytes); } } TEST(TextureFormatProperties, getSubRangeByteOffset) { { const auto props = TextureFormatProperties::fromTextureFormat(TextureFormat::RGBA_UNorm8); { // 2D Range const auto range = TextureRangeDesc::new2D(0, 0, 10, 10, 0, 3); // Level 0: 10 pixels x 10 pixels = 400 bytes // Level 1: 5 pixels x 5 pixels = 100 bytes // Level 2: 2 pixels x 2 pixels = 16 bytes EXPECT_EQ(props.getSubRangeByteOffset(range, range), 0); EXPECT_EQ(props.getSubRangeByteOffset(range, range.atMipLevel(1)), 400); EXPECT_EQ(props.getSubRangeByteOffset(range, range.atMipLevel(2)), 500); } { // 2D Aray Range const auto range = TextureRangeDesc::new2DArray(0, 0, 10, 10, 0, 2, 0, 3); // Level 0: 10 pixels x 10 pixels x 2 layers = 800 bytes // Level 1: 5 pixels x 5 pixels x 2 layers = 200 bytes // Level 2: 2 pixels x 2 pixels x 2 layers = 32 bytes EXPECT_EQ(props.getSubRangeByteOffset(range, range), 0); EXPECT_EQ(props.getSubRangeByteOffset(range, range.atLayer(1)), 400); EXPECT_EQ(props.getSubRangeByteOffset(range, range.atMipLevel(1)), 800); EXPECT_EQ(props.getSubRangeByteOffset(range, range.atMipLevel(1).atLayer(1)), 900); // Custom row length EXPECT_EQ(props.getSubRangeByteOffset(range, range.withNumMipLevels(1).atLayer(1), 50), 500); } { // 3D Range const auto range = TextureRangeDesc::new3D(0, 0, 0, 10, 10, 10, 0, 3); // Level 0: 10 pixels x 10 pixels x 10 pixels = 4000 bytes // Level 1: 5 pixels x 5 pixels x 5 pixels = 500 bytes // Level 2: 2 pixels x 2 pixels x 2 pixels = 32 bytes EXPECT_EQ(props.getSubRangeByteOffset(range, range), 0); EXPECT_EQ(props.getSubRangeByteOffset(range, range.atMipLevel(1)), 4000); EXPECT_EQ(props.getSubRangeByteOffset(range, range.atMipLevel(2)), 4500); } { // Cube Range const auto range = TextureRangeDesc::newCube(0, 0, 10, 10, 0, 3); // Level 0: 10 pixels x 10 pixels x 6 faces = 2400 bytes // Level 1: 5 pixels x 5 pixels x 6 faces = 600 bytes // Level 2: 2 pixels x 2 pixels x 6 faces = 96 bytes EXPECT_EQ(props.getSubRangeByteOffset(range, range), 0); EXPECT_EQ(props.getSubRangeByteOffset(range, range.atFace(1)), 400); EXPECT_EQ(props.getSubRangeByteOffset(range, range.atMipLevel(1)), 2400); EXPECT_EQ(props.getSubRangeByteOffset(range, range.atMipLevel(1).atFace(1)), 2500); // Custom row length EXPECT_EQ(props.getSubRangeByteOffset(range, range.withNumMipLevels(1).atFace(1), 50), 500); } } { const auto props = TextureFormatProperties::fromTextureFormat(TextureFormat::RGB_PVRTC_2BPPV1); { // 2D Range const auto range = TextureRangeDesc::new2D(0, 0, 10, 10, 0, 3); // Level 0: 2 blocks x 3 blocks x 8 bytes = 48 bytes // Level 1: 2 blocks x 2 blocks x 8 bytes = 32 bytes // Level 2: 2 blocks x 2 blocks x 8 bytes = 32 bytes EXPECT_EQ(props.getSubRangeByteOffset(range, range), 0); EXPECT_EQ(props.getSubRangeByteOffset(range, range.atMipLevel(1)), 48); EXPECT_EQ(props.getSubRangeByteOffset(range, range.atMipLevel(2)), 80); } { // 2D Aray Range const auto range = TextureRangeDesc::new2DArray(0, 0, 10, 10, 0, 2, 0, 3); // Level 0: 2 blocks x 3 blocks x 2 layers x 8 bytes = 96 bytes // Level 1: 2 blocks x 2 blocks x 2 layers x 8 bytes = 64 bytes // Level 2: 2 blocks x 2 blocks x 2 layers x 8 bytes = 64 bytes EXPECT_EQ(props.getSubRangeByteOffset(range, range), 0); EXPECT_EQ(props.getSubRangeByteOffset(range, range.atLayer(1)), 48); EXPECT_EQ(props.getSubRangeByteOffset(range, range.atMipLevel(1)), 96); EXPECT_EQ(props.getSubRangeByteOffset(range, range.atMipLevel(1).atLayer(1)), 128); } { // 3D Range const auto range = TextureRangeDesc::new3D(0, 0, 0, 10, 10, 10, 0, 3); // Level 0: 2 blocks x 3 blocks x 10 pixels x 8 bytes = 480 bytes // Level 1: 2 blocks x 2 blocks x 5 pixels x 8 bytes = 160 bytes // Level 2: 2 blocks x 2 blocks x 2 pixels x 8 bytes = 64 bytes EXPECT_EQ(props.getSubRangeByteOffset(range, range), 0); EXPECT_EQ(props.getSubRangeByteOffset(range, range.atMipLevel(1)), 480); EXPECT_EQ(props.getSubRangeByteOffset(range, range.atMipLevel(2)), 640); } { // Cube Range const auto range = TextureRangeDesc::newCube(0, 0, 10, 10, 0, 3); // Level 0: 2 blocks x 3 blocks x 6 faces x 8 bytes = 288 bytes // Level 1: 2 blocks x 2 blocks x 6 faces x 8 bytes = 192 bytes // Level 2: 2 blocks x 2 blocks x 6 faces x 8 bytes = 192 bytes EXPECT_EQ(props.getSubRangeByteOffset(range, range), 0); EXPECT_EQ(props.getSubRangeByteOffset(range, range.atFace(1)), 48); EXPECT_EQ(props.getSubRangeByteOffset(range, range.atMipLevel(1)), 288); EXPECT_EQ(props.getSubRangeByteOffset(range, range.atMipLevel(1).atFace(1)), 320); } } } } // namespace igl::tests ================================================ FILE: src/igl/tests/TextureHalfFloat.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // obscure compiler error where glm::vec would delete it's construct_at // since Half didnt have a trivial default ctor despite specifying it. #if defined(IGL_CMAKE_BUILD) #define GLM_FORCE_XYZW_ONLY 1 #endif #include #include "data/ShaderData.h" #include "data/VertexIndexData.h" #include "util/Color.h" #include "util/Common.h" #include "util/Half.h" #include "util/TextureValidationHelpers.h" #include #include #include #include #include #include #include #include namespace igl::tests { // Picking this just to match the texture we will use. If you use a different // size texture, then you will have to either create a new offscreenTexture_ // and the framebuffer object in your test, so know exactly what the end result // would be after sampling constexpr size_t kOffscreenTexWidth = 2; constexpr size_t kOffscreenTexHeight = 2; // clang-format off const glm::vec4 kR = igl::tests::util::convertSRGBToLinear(glm::vec4(0x1F / 255.0, 0x00/255.0, 0x00/255.0, 0x0F/255.0)); // 0x1F00000F const glm::vec4 kG = igl::tests::util::convertSRGBToLinear(glm::vec4(0x00 / 255.0, 0x2F/255.0, 0x00/255.0, 0x1F/255.0)); // 0x002F001F; const glm::vec4 kB = igl::tests::util::convertSRGBToLinear(glm::vec4(0x00 / 255.0, 0x00/255.0, 0x3F/255.0, 0x2F/255.0)); // 0x00003F2F; const glm::vec4 kC = igl::tests::util::convertSRGBToLinear(glm::vec4(0x00 / 255.0, 0x4F/255.0, 0x5F/255.0, 0x3F/255.0)); // 0x004F5F3F; const glm::vec4 kM = igl::tests::util::convertSRGBToLinear(glm::vec4(0x6F / 255.0, 0x00/255.0, 0x7F/255.0, 0x4F/255.0)); // 0x6F007F4F; const glm::vec4 kY = igl::tests::util::convertSRGBToLinear(glm::vec4(0x8F / 255.0, 0x9F/255.0, 0x00/255.0, 0x5F/255.0)); // 0x8F9F005F; using TestColorHalf = glm::vec<4, util::TestHalf, glm::defaultp>; using TestColor2Half = glm::vec<2, util::TestHalf, glm::defaultp>; using TestColor3Half = glm::vec<3, util::TestHalf, glm::defaultp>; const std::array kTextureDataRGBAHalf = { kR, kR, kR, kR, // Base Mip, Layer 0 kG, kG, kG, kG, // Base Mip, Layer 1 kB, kB, kB, kB, // Base Mip, Layer 2 kC, // Mip 1, Layer 0 kM, // Mip 1, Layer 1 kY, // Mip 1, Layer 2 }; const std::array kTextureDataRGBHalf = { glm::vec3(kR), glm::vec3(kR), glm::vec3(kR), glm::vec3(kR), // Base Mip, Layer 0 glm::vec3(kG), glm::vec3(kG), glm::vec3(kG), glm::vec3(kG), // Base Mip, Layer 1 glm::vec3(kB), glm::vec3(kB), glm::vec3(kB), glm::vec3(kB), // Base Mip, Layer 2 glm::vec3(kC), // Mip 1, Layer 0 glm::vec3(kM), // Mip 1, Layer 1 glm::vec3(kY), // Mip 1, Layer 2 }; const std::array kTextureDataRGHalf = { glm::vec2(kR), glm::vec2(kR), glm::vec2(kR), glm::vec2(kR), // Base Mip, Layer 0 glm::vec2(kG), glm::vec2(kG), glm::vec2(kG), glm::vec2(kG), // Base Mip, Layer 1 glm::vec2(kB), glm::vec2(kB), glm::vec2(kB), glm::vec2(kB), // Base Mip, Layer 2 glm::vec2(kC), // Mip 1, Layer 0 glm::vec2(kM), // Mip 1, Layer 1 glm::vec2(kY), // Mip 1, Layer 2 }; const std::array kTextureDataRHalf = { util::TestHalf(kR.y), util::TestHalf(kR.y), util::TestHalf(kR.y), util::TestHalf(kR.y), // Base Mip, Layer 0 util::TestHalf(kG.y), util::TestHalf(kG.y), util::TestHalf(kG.y), util::TestHalf(kG.y), // Base Mip, Layer 1 util::TestHalf(kB.y), util::TestHalf(kB.y), util::TestHalf(kB.y), util::TestHalf(kB.y), // Base Mip, Layer 2 util::TestHalf(kC.y), // Mip 1, Layer 0 util::TestHalf(kM.y), // Mip 1, Layer 1 util::TestHalf(kY.y), // Mip 1, Layer 2 }; // clang-format on struct VertexUniforms { int layer = 0; }; // // TextureHalfFloatTest // // Test fixture for all the tests in this file. Takes care of common // initialization and allocating of common resources. // class TextureHalfFloatTest : public ::testing::Test { private: public: TextureHalfFloatTest() = default; ~TextureHalfFloatTest() override = default; std::shared_ptr createVertexUniformBuffer(IDevice& device, Result* /*result*/) { std::shared_ptr vertUniformBuffer = nullptr; const iglu::ManagedUniformBufferInfo vertInfo = { .index = 2, .length = sizeof(VertexUniforms), .uniforms = { UniformDesc{ .name = "layer", .type = igl::UniformType::Int, .offset = offsetof(VertexUniforms, layer), }, }}; vertUniformBuffer = std::make_shared(device, vertInfo); IGL_DEBUG_ASSERT(vertUniformBuffer->result.isOk()); return vertUniformBuffer; } void createPassthroughFrameBuffer(TextureFormat format) { // Create an offscreen texture to render to const TextureDesc texDesc = TextureDesc::new2D( format, kOffscreenTexWidth, kOffscreenTexHeight, TextureDesc::TextureUsageBits::Attachment); Result ret; offscreenTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok) << "RetCode: " << static_cast(ret.code) << " Message: " << ret.message; ASSERT_TRUE(offscreenTexture_ != nullptr); ASSERT_TRUE(offscreenTexture_->getFormat() == format); // Create framebuffer using the offscreen texture FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = offscreenTexture_; framebuffer_ = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(framebuffer_ != nullptr); ASSERT_TRUE(offscreenTexture_->getFormat() == format); } void createShaderStages() { // Initialize shader stages std::unique_ptr stages; igl::tests::util::createSimpleShaderStages(iglDev_, stages, offscreenTexture_->getFormat()); ASSERT_TRUE(stages != nullptr); shaderStages_ = std::move(stages); } void initializeRenderPipeline() { // Initialize Graphics Pipeline Descriptor, but leave the creation // to the individual tests in case further customization is required renderPipelineDesc_.vertexInputState = vertexInputState_; renderPipelineDesc_.shaderStages = shaderStages_; renderPipelineDesc_.targetDesc.colorAttachments.resize(1); renderPipelineDesc_.targetDesc.colorAttachments[0].textureFormat = offscreenTexture_->getFormat(); renderPipelineDesc_.fragmentUnitSamplerMap[textureUnit_] = IGL_NAMEHANDLE(data::shader::kSimpleSampler); renderPipelineDesc_.cullMode = igl::CullMode::Disabled; } // // SetUp() // // This function sets up a render pass and a graphics pipeline descriptor // so it is ready to render a simple quad with an input texture to an // offscreen texture. // // The actual creation of the graphics pipeline state object is left // to each test so that tests can replace the default settings with // something more appropriate. // void SetUp() override { #if IGL_PLATFORM_LINUX && !IGL_PLATFORM_LINUX_USE_EGL GTEST_SKIP() << "Fix these tests on Linux"; #endif setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_TRUE(iglDev_ != nullptr); ASSERT_TRUE(cmdQueue_ != nullptr); if (!iglDev_->hasFeature(DeviceFeatures::TextureHalfFloat)) { GTEST_SKIP() << "2D half float texture is unsupported for this platform."; return; } Result ret; createPassthroughFrameBuffer(igl::TextureFormat::RGBA_F16); // Initialize render pass descriptor renderPass_.colorAttachments.resize(1); renderPass_.colorAttachments[0].loadAction = LoadAction::Clear; renderPass_.colorAttachments[0].storeAction = StoreAction::Store; renderPass_.colorAttachments[0].clearColor = {0.0, 0.0, 0.0, 1.0}; createShaderStages(); // Initialize input to vertex shader VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Float4; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].bufferIndex = data::shader::kSimplePosIndex; inputDesc.attributes[0].name = data::shader::kSimplePos; inputDesc.attributes[0].location = 0; inputDesc.inputBindings[0].stride = sizeof(float) * 4; inputDesc.attributes[1].format = VertexAttributeFormat::Float2; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].bufferIndex = data::shader::kSimpleUvIndex; inputDesc.attributes[1].name = data::shader::kSimpleUv; inputDesc.attributes[1].location = 1; inputDesc.inputBindings[1].stride = sizeof(float) * 2; // numAttributes has to equal to bindings when using more than 1 buffer inputDesc.numAttributes = inputDesc.numInputBindings = 2; vertexInputState_ = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vertexInputState_ != nullptr); // Initialize index buffer BufferDesc bufDesc; bufDesc.type = BufferDesc::BufferTypeBits::Index; bufDesc.data = data::vertex_index::kQuadInd.data(); bufDesc.length = sizeof(data::vertex_index::kQuadInd); ib_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(ib_ != nullptr); // Initialize vertex and sampler buffers bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data::vertex_index::kQuadVert.data(); bufDesc.length = sizeof(data::vertex_index::kQuadVert); vb_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vb_ != nullptr); // Initialize UV data and sampler buffer bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data::vertex_index::kQuadUv.data(); bufDesc.length = sizeof(data::vertex_index::kQuadUv); uv_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(uv_ != nullptr); // Initialize sampler state const SamplerStateDesc samplerDesc; samp_ = iglDev_->createSamplerState(samplerDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(samp_ != nullptr); initializeRenderPipeline(); } void TearDown() override {} template void runPassthroughFormat(TextureFormat format, const ColorType* data) { std::shared_ptr pipelineState; createPassthroughFrameBuffer(format); ASSERT_TRUE(offscreenTexture_ != nullptr); ASSERT_TRUE(offscreenTexture_->getFormat() == format); createShaderStages(); initializeRenderPipeline(); Result ret; //------------------------------------- // Create input texture and upload data //------------------------------------- const TextureDesc texDesc = TextureDesc::new2D( format, kOffscreenTexWidth, kOffscreenTexHeight, TextureDesc::TextureUsageBits::Sampled); inputTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(inputTexture_ != nullptr); const auto rangeDesc = TextureRangeDesc::new2D(0, 0, kOffscreenTexWidth, kOffscreenTexHeight); const size_t bytesPerRow = kOffscreenTexWidth * inputTexture_->getProperties().bytesPerBlock; // // upload and redownload to make sure that we've uploaded successfully. // ASSERT_TRUE(inputTexture_->upload(rangeDesc, data, bytesPerRow).isOk()); //---------------- // Create Pipeline //---------------- pipelineState = iglDev_->createRenderPipeline(renderPipelineDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(pipelineState != nullptr); //------- // Render //------- cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(cmdBuf_ != nullptr); auto cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, framebuffer_); cmds->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmds->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); cmds->bindRenderPipelineState(pipelineState); cmds->bindTexture(textureUnit_, BindTarget::kFragment, inputTexture_.get()); cmds->bindSamplerState(textureUnit_, BindTarget::kFragment, samp_.get()); Result result{}; auto vertUniformBuffer = createVertexUniformBuffer(*iglDev_, &result); ASSERT_TRUE(result.isOk()); vertexUniforms_.layer = static_cast(1); *static_cast(vertUniformBuffer->getData()) = vertexUniforms_; vertUniformBuffer->bind(*iglDev_, *pipelineState, *cmds); cmds->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmds->drawIndexed(6); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); cmdBuf_->waitUntilCompleted(); //---------------- // Validate output //---------------- const auto* layerStr = "Layer 0"; util::validateFramebufferTexture(*iglDev_, *cmdQueue_, *framebuffer_, data, layerStr); } // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; std::shared_ptr cmdBuf_; CommandBufferDesc cbDesc_ = {}; RenderPassDesc renderPass_; std::shared_ptr offscreenTexture_; std::shared_ptr framebuffer_; // Currently it is left to individual tests to initialize this std::shared_ptr inputTexture_; std::shared_ptr shaderStages_; std::shared_ptr vertexInputState_; std::shared_ptr vb_, uv_, ib_; std::shared_ptr samp_; RenderPipelineDesc renderPipelineDesc_; VertexUniforms vertexUniforms_; size_t textureUnit_ = 0; }; // // Texture Upload Test // // This test uploads data to an array texture and then downloads it again to validate it // namespace { template void runUploadTest(IDevice& device, ICommandQueue& cmdQueue, TextureFormat format, const ColorType* data) { Result ret; const std::shared_ptr pipelineState; //------------------------------------- // Create input texture and upload data //------------------------------------- const TextureDesc texDesc = TextureDesc::new2D( format, kOffscreenTexWidth, kOffscreenTexHeight, TextureDesc::TextureUsageBits::Sampled); auto tex = device.createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(tex != nullptr); // // upload and redownload to make sure that we've uploaded successfully. // const auto uploadRange = TextureRangeDesc::new2D(0, 0, kOffscreenTexWidth, kOffscreenTexHeight, 0); ASSERT_TRUE(tex->upload(uploadRange, data).isOk()); //-------------------------------- // Verify against original texture //-------------------------------- const auto* layerStr = "Layer 0"; util::validateUploadedTextureRange(device, cmdQueue, tex, tex->getLayerRange(0), data, layerStr); } } // namespace TEST_F(TextureHalfFloatTest, Upload_RGBA16) { runUploadTest(*iglDev_, *cmdQueue_, igl::TextureFormat::RGBA_F16, kTextureDataRGBAHalf.data()); } TEST_F(TextureHalfFloatTest, Upload_RGB16) { if (iglDev_->getBackendType() == BackendType::Vulkan || iglDev_->getBackendType() == BackendType::Metal || iglDev_->getBackendVersion().flavor == BackendFlavor::OpenGL_ES) { GTEST_SKIP() << "Skip due to lack of support for RGB"; } runUploadTest(*iglDev_, *cmdQueue_, igl::TextureFormat::RGB_F16, kTextureDataRGBHalf.data()); } TEST_F(TextureHalfFloatTest, Upload_RG16) { runUploadTest(*iglDev_, *cmdQueue_, igl::TextureFormat::RG_F16, kTextureDataRGHalf.data()); } TEST_F(TextureHalfFloatTest, Upload_R16) { runUploadTest(*iglDev_, *cmdQueue_, igl::TextureFormat::R_F16, kTextureDataRHalf.data()); } // // Texture Passthrough Test - Sample From Array // // This test uses a simple shader to copy a layer of the input array texture to an // a output texture that matches the size of the input texture layer // TEST_F(TextureHalfFloatTest, Passthrough_SampleRGBA16) { runPassthroughFormat(igl::TextureFormat::RGBA_F16, kTextureDataRGBAHalf.data()); } TEST_F(TextureHalfFloatTest, Passthrough_SampleRGB16) { #if IGL_PLATFORM_WINDOWS && !IGL_ANGLE GTEST_SKIP() << "Skipping due to known issue on Windows without angle"; #endif if (iglDev_->getBackendType() == BackendType::Vulkan || iglDev_->getBackendType() == BackendType::Metal || #if IGL_PLATFORM_MACOSX iglDev_->getBackendType() == BackendType::OpenGL || #endif iglDev_->getBackendVersion().flavor == BackendFlavor::OpenGL_ES) { GTEST_SKIP() << "Skip due to lack of support for RGB"; } runPassthroughFormat(igl::TextureFormat::RGB_F16, kTextureDataRGBHalf.data()); } TEST_F(TextureHalfFloatTest, Passthrough_SampleRG16) { #if IGL_PLATFORM_MACOSX if (iglDev_->getBackendType() == BackendType::OpenGL) { GTEST_SKIP() << "Skip due to lack of support for RG on mac OpenGL"; } #endif runPassthroughFormat(igl::TextureFormat::RG_F16, kTextureDataRGHalf.data()); } TEST_F(TextureHalfFloatTest, Passthrough_SampleR16) { #if IGL_PLATFORM_MACOSX if (iglDev_->getBackendType() == BackendType::OpenGL) { GTEST_SKIP() << "Skip due to lack of support for RG on mac OpenGL"; } #endif runPassthroughFormat(igl::TextureFormat::R_F16, kTextureDataRHalf.data()); } } // namespace igl::tests ================================================ FILE: src/igl/tests/TextureMipmap.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "Texture.h" #include "util/TextureValidationHelpers.h" #include #include namespace igl::tests { // // Test render to mip // // Create a square output texture with a mip chain and render several different colors into each // mip level. Read back individual mips to make sure they were written to correctly. // TEST_F(TextureTest, RenderToMip) { Result ret; std::shared_ptr pipelineState; // Use a square output texture with mips constexpr uint32_t kNumMipLevels = 4; constexpr uint32_t kOutputTexWidth = 8u; constexpr uint32_t kOutputTexHeight = 8u; static_assert(kOutputTexWidth > 1); static_assert(1 << (kNumMipLevels - 1) == kOutputTexWidth); static_assert(kOutputTexWidth == kOutputTexHeight); static constexpr std::array kColors = { 0xdeadbeef, 0x8badf00d, 0xc00010ff, 0xbaaaaaad}; std::vector> inputTexData{ std::vector(64 /* 8 * 8 */, kColors[0]), std::vector(16 /* 4 * 4 */, kColors[1]), std::vector(4 /* 2 * 2 */, kColors[2]), std::vector(1 /* 1 * 1 */, kColors[3]), }; //--------------------------------------------------------------------- // Create output texture with mip levels and attach it to a framebuffer //--------------------------------------------------------------------- TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kOutputTexWidth, kOutputTexHeight, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); texDesc.numMipLevels = kNumMipLevels; auto outputTex = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(outputTex != nullptr); // Create framebuffer using the output texture FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = outputTex; auto fb = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(fb != nullptr); //---------------- // Create Pipeline //---------------- pipelineState = iglDev_->createRenderPipeline(renderPipelineDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(pipelineState != nullptr); //------------------------- // Render to each mip level //------------------------- for (auto mipLevel = 0; mipLevel < kNumMipLevels; mipLevel++) { //--------------------- // Create input texture //--------------------- const int inTexWidth = kOutputTexWidth >> mipLevel; texDesc = TextureDesc::new2D( TextureFormat::RGBA_UNorm8, inTexWidth, inTexWidth, TextureDesc::TextureUsageBits::Sampled); inputTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(inputTexture_ != nullptr); // Initialize the input texture's color auto rangeDesc = TextureRangeDesc::new2D(0, 0, inTexWidth, inTexWidth); inputTexture_->upload(rangeDesc, inputTexData[mipLevel].data()); cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(cmdBuf_ != nullptr); // Modify render pass to only draw to nth mip level renderPass_.colorAttachments[0].mipLevel = mipLevel; auto cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, fb); cmds->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmds->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); cmds->bindRenderPipelineState(pipelineState); cmds->bindTexture(textureUnit_, BindTarget::kFragment, inputTexture_.get()); cmds->bindSamplerState(textureUnit_, BindTarget::kFragment, samp_.get()); cmds->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmds->drawIndexed(6); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); cmdBuf_->waitUntilCompleted(); } // Do readback in a separate loop to ensure all mip levels have been rendered. for (size_t mipLevel = 0; mipLevel < kNumMipLevels; mipLevel++) { //---------------- // Validate output //---------------- util::validateFramebufferTextureRange(*iglDev_, *cmdQueue_, *fb, outputTex->getFullRange(mipLevel), inputTexData[mipLevel].data(), (std::string("Mip ") + std::to_string(mipLevel)).c_str()); } } namespace { void testUploadToMip(IDevice& device, ICommandQueue& cmdQueue, bool singleUpload) { Result ret; // Use a square output texture with mips constexpr uint32_t kNumMipLevels = 2; constexpr uint32_t kTexWidth = 2u; constexpr uint32_t kTexHeight = 2u; static_assert(kTexWidth > 1); static_assert(1 << (kNumMipLevels - 1) == kTexWidth); static_assert(kTexWidth == kTexHeight); constexpr uint32_t kBaseMipColor = 0xdeadbeef; constexpr uint32_t kMip1Color = 0x8badf00d; static constexpr std::array kMipTextureData = { kBaseMipColor, // Base Mip kBaseMipColor, // Base Mip kBaseMipColor, // Base Mip kBaseMipColor, // Base Mip kMip1Color, // Mip 1 }; static constexpr const uint32_t* kBaseMipData = kMipTextureData.data(); static constexpr const uint32_t* kMip1Data = kMipTextureData.data() + 4; //--------------------------------------------------------------------- // Create texture with mip levels //--------------------------------------------------------------------- TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kTexWidth, kTexHeight, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); texDesc.numMipLevels = kNumMipLevels; auto tex = device.createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok) << ret.message; ASSERT_TRUE(tex != nullptr); //--------------------------------------------------------------------- // Validate initial state, upload pixel data, and generate mipmaps //--------------------------------------------------------------------- if (singleUpload) { ret = tex->upload(tex->getFullRange(0, 2), kMipTextureData.data()); ASSERT_EQ(ret.code, Result::Code::Ok) << ret.message; } else { ret = tex->upload(tex->getFullRange(0), kBaseMipData); ASSERT_EQ(ret.code, Result::Code::Ok) << ret.message; ret = tex->upload(tex->getFullRange(1), kMip1Data); ASSERT_EQ(ret.code, Result::Code::Ok) << ret.message; } util::validateUploadedTextureRange( device, cmdQueue, tex, tex->getFullRange(0), kBaseMipData, "Base Level"); util::validateUploadedTextureRange( device, cmdQueue, tex, tex->getFullRange(1), kMip1Data, "Mip 1"); } } // namespace TEST_F(TextureTest, UploadToMip_LevelByLevel) { testUploadToMip(*iglDev_, *cmdQueue_, false); } TEST_F(TextureTest, UploadToMip_SingleUpload) { testUploadToMip(*iglDev_, *cmdQueue_, true); } namespace { void testGenerateMipmap(IDevice& device, ICommandQueue& cmdQueue, bool withCommandQueue) { Result ret; // Use a square output texture with mips constexpr uint32_t kNumMipLevels = 2; constexpr uint32_t kTexWidth = 2u; constexpr uint32_t kTexHeight = 2u; static_assert(kTexWidth > 1); static_assert(1 << (kNumMipLevels - 1) == kTexWidth); static_assert(kTexWidth == kTexHeight); constexpr uint32_t kColor = 0xdeadbeef; constexpr std::array kBaseMipData = {kColor, kColor, kColor, kColor}; constexpr std::array kInitialMip1Data = {0}; constexpr std::array kGeneratedMip1Data = {kColor}; //--------------------------------------------------------------------- // Create texture with mip levels //--------------------------------------------------------------------- TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kTexWidth, kTexWidth, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); texDesc.numMipLevels = kNumMipLevels; auto tex = device.createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok) << ret.message; ASSERT_TRUE(tex != nullptr); //--------------------------------------------------------------------- // Validate initial state, upload pixel data, and generate mipmaps //--------------------------------------------------------------------- ret = tex->upload(tex->getFullRange(0), kBaseMipData.data()); ASSERT_EQ(ret.code, Result::Code::Ok) << ret.message; ret = tex->upload(tex->getFullRange(1), kInitialMip1Data.data()); ASSERT_EQ(ret.code, Result::Code::Ok) << ret.message; util::validateUploadedTextureRange( device, cmdQueue, tex, tex->getFullRange(0), kBaseMipData.data(), "Initial (level 0)"); util::validateUploadedTextureRange( device, cmdQueue, tex, tex->getFullRange(1), kInitialMip1Data.data(), "Initial (level 1)"); if (withCommandQueue) { tex->generateMipmap(cmdQueue); // Dummy command buffer to wait for completion. auto cmdBuf = cmdQueue.createCommandBuffer({}, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(cmdBuf != nullptr); cmdQueue.submit(*cmdBuf); cmdBuf->waitUntilCompleted(); } else { auto cmdBuffer = cmdQueue.createCommandBuffer({}, &ret); ASSERT_EQ(ret.code, Result::Code::Ok) << ret.message; tex->generateMipmap(*cmdBuffer); cmdQueue.submit(*cmdBuffer); cmdBuffer->waitUntilCompleted(); } util::validateUploadedTextureRange( device, cmdQueue, tex, tex->getFullRange(0), kBaseMipData.data(), "Final (level 0)"); util::validateUploadedTextureRange( device, cmdQueue, tex, tex->getFullRange(1), kGeneratedMip1Data.data(), "Final (level 1)"); } } // namespace // // Test generating mipmaps // // Create a texture and upload a solid color into the base mip level, verify the base and 1st mip // level colors. Then generate mipmaps and verify again. // TEST_F(TextureTest, GenerateMipmapWithCommandQueue) { testGenerateMipmap(*iglDev_, *cmdQueue_, true); } TEST_F(TextureTest, GenerateMipmapWithCommandBuffer) { testGenerateMipmap(*iglDev_, *cmdQueue_, false); } TEST_F(TextureTest, GetTextureBytesPerRow) { const auto properties = TextureFormatProperties::fromTextureFormat(TextureFormat::RGBA_UNorm8); const auto range = TextureRangeDesc::new2D(0, 0, 10, 10); ASSERT_EQ(properties.getBytesPerRow(range.atMipLevel(0)), 40); ASSERT_EQ(properties.getBytesPerRow(range.atMipLevel(1)), 20); ASSERT_EQ(properties.getBytesPerRow(range.atMipLevel(2)), 8); ASSERT_EQ(properties.getBytesPerRow(range.atMipLevel(3)), 4); ASSERT_EQ(properties.getBytesPerRow(range.atMipLevel(4)), 4); } TEST_F(TextureTest, GetTextureBytesPerLayer) { const auto range = TextureRangeDesc::new2D(0, 0, 10, 10); { // Uncompressed const auto properties = TextureFormatProperties::fromTextureFormat(TextureFormat::RGBA_UNorm8); EXPECT_EQ(properties.getBytesPerLayer(range.atMipLevel(0)), 400); EXPECT_EQ(properties.getBytesPerLayer(range.atMipLevel(1)), 100); EXPECT_EQ(properties.getBytesPerLayer(range.atMipLevel(2)), 16); EXPECT_EQ(properties.getBytesPerLayer(range.atMipLevel(3)), 4); EXPECT_EQ(properties.getBytesPerLayer(range.atMipLevel(4)), 4); } { // Compressed // 16 bytes per 5x5 block const auto properties = TextureFormatProperties::fromTextureFormat(TextureFormat::RGBA_ASTC_5x5); EXPECT_EQ(properties.getBytesPerLayer(range.atMipLevel(0)), 64); EXPECT_EQ(properties.getBytesPerLayer(range.atMipLevel(1)), 16); EXPECT_EQ(properties.getBytesPerLayer(range.atMipLevel(2)), 16); EXPECT_EQ(properties.getBytesPerLayer(range.atMipLevel(3)), 16); EXPECT_EQ(properties.getBytesPerLayer(range.atMipLevel(4)), 16); } { // Compressed // 8 bytes per 4x4 block const auto properties = TextureFormatProperties::fromTextureFormat(TextureFormat::RGB8_ETC2); EXPECT_EQ(properties.getBytesPerLayer(range.atMipLevel(0)), 72); EXPECT_EQ(properties.getBytesPerLayer(range.atMipLevel(1)), 32); EXPECT_EQ(properties.getBytesPerLayer(range.atMipLevel(2)), 8); EXPECT_EQ(properties.getBytesPerLayer(range.atMipLevel(3)), 8); EXPECT_EQ(properties.getBytesPerLayer(range.atMipLevel(4)), 8); } } // // Test ITexture::getEstimatedSizeInBytes // TEST_F(TextureTest, GetEstimatedSizeInBytes) { auto calcSize = [&](size_t width, size_t height, TextureFormat format, size_t numMipLevels) -> size_t { Result ret; TextureDesc texDesc = TextureDesc::new2D(format, width, height, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); texDesc.numMipLevels = numMipLevels; auto texture = iglDev_->createTexture(texDesc, &ret); if (ret.code != Result::Code::Ok || texture == nullptr) { return 0; } return texture->getEstimatedSizeInBytes(); }; const auto format = iglDev_->getBackendType() == BackendType::OpenGL ? TextureFormat::R5G5B5A1_UNorm : TextureFormat::RGBA_UNorm8; const size_t formatBytes = iglDev_->getBackendType() == BackendType::OpenGL ? 2 : 4; size_t bytes = 0; bytes = (12 * 34 * formatBytes); ASSERT_EQ(calcSize(12, 34, format, 1), bytes); bytes = static_cast((16 + 8 + 4 + 2 + 1) * formatBytes); ASSERT_EQ(calcSize(16, 1, format, 5), bytes); if (iglDev_->hasFeature(DeviceFeatures::TextureNotPot)) { if (!iglDev_->hasFeature(DeviceFeatures::TexturePartialMipChain)) { // ES 2.0 generates maximum mip levels bytes = static_cast( (128 * 333 + 64 * 166 + 32 * 83 + 16 * 41 + 8 * 20 + 4 * 10 + 2 * 5 + 1 * 2 + 1 * 1) * formatBytes); ASSERT_EQ(calcSize(128, 333, format, 9), bytes); } else { bytes = static_cast((128 * 333 + 64 * 166) * formatBytes); ASSERT_EQ(calcSize(128, 333, format, 2), bytes); } if (iglDev_->hasFeature(DeviceFeatures::TextureFormatRG)) { const auto rBytes = 1; const auto rgBytes = 2; bytes = static_cast((16 + 8 + 4 + 2 + 1) * rBytes); ASSERT_EQ(calcSize(16, 1, TextureFormat::R_UNorm8, 5), bytes); if (!iglDev_->hasFeature(DeviceFeatures::TexturePartialMipChain)) { // ES 2.0 generates maximum mip levels bytes = static_cast( (128 * 333 + 64 * 166 + 32 * 83 + 16 * 41 + 8 * 20 + 4 * 10 + 2 * 5 + 1 * 2 + 1 * 1) * rgBytes); ASSERT_EQ(calcSize(128, 333, TextureFormat::RG_UNorm8, 9), bytes); } else { bytes = static_cast((128 * 333 + 64 * 166) * rgBytes); ASSERT_EQ(calcSize(128, 333, TextureFormat::RG_UNorm8, 2), bytes); } } } } // // Test ITexture::getFullRange and ITexture::getFullMipRange // TEST_F(TextureTest, GetRange) { auto createTexture = [&](size_t width, size_t height, TextureFormat format, // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) size_t numMipLevels) -> std::shared_ptr { Result ret; TextureDesc texDesc = TextureDesc::new2D(format, width, height, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); texDesc.numMipLevels = numMipLevels; auto texture = iglDev_->createTexture(texDesc, &ret); if (ret.code != Result::Code::Ok || texture == nullptr) { return {}; } return texture; }; auto getFullRange = [&](size_t width, size_t height, TextureFormat format, // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) size_t numMipLevels, size_t rangeMipLevel = 0, size_t rangeNumMipLevels = 0) -> TextureRangeDesc { auto tex = createTexture(width, height, format, numMipLevels); return tex ? tex->getFullRange(rangeMipLevel, rangeNumMipLevels ? rangeNumMipLevels : numMipLevels) : TextureRangeDesc{}; }; auto getFullMipRange = [&](size_t width, size_t height, TextureFormat format, // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) size_t numMipLevels) -> TextureRangeDesc { auto tex = createTexture(width, height, format, numMipLevels); return tex ? tex->getFullMipRange() : TextureRangeDesc{}; }; auto rangesAreEqual = [&](const TextureRangeDesc& a, const TextureRangeDesc& b) -> bool { return std::memcmp(&a, &b, sizeof(TextureRangeDesc)) == 0; }; const auto format = iglDev_->getBackendType() == BackendType::OpenGL ? TextureFormat::R5G5B5A1_UNorm : TextureFormat::RGBA_UNorm8; TextureRangeDesc range; range = TextureRangeDesc::new2D(0, 0, 12, 34, 0, 1); ASSERT_TRUE(rangesAreEqual(getFullRange(12, 34, format, 1), range)); range = TextureRangeDesc::new2D(0, 0, 16, 1, 0, 4); ASSERT_TRUE(rangesAreEqual(getFullRange(16, 1, format, 4), range)); // Test subset of mip levels ASSERT_TRUE(rangesAreEqual(getFullRange(16, 1, format, 4, 1, 1), range.atMipLevel(1))); // Test all mip levels ASSERT_TRUE(rangesAreEqual(getFullMipRange(16, 1, format, 4), range.withNumMipLevels(4))); if (iglDev_->hasFeature(DeviceFeatures::TextureNotPot)) { if (!iglDev_->hasFeature(DeviceFeatures::TexturePartialMipChain)) { // ES 2.0 generates maximum mip levels range = TextureRangeDesc::new2D(0, 0, 128, 333, 0, 9); ASSERT_TRUE(rangesAreEqual(getFullRange(128, 333, format, 9), range)); // Test all mip levels ASSERT_TRUE(rangesAreEqual(getFullMipRange(128, 333, format, 9), range.withNumMipLevels(9))); } else { range = TextureRangeDesc::new2D(0, 0, 128, 333, 0, 2); ASSERT_TRUE(rangesAreEqual(getFullRange(128, 333, format, 2), range)); // Test all mip levels ASSERT_TRUE(rangesAreEqual(getFullMipRange(128, 333, format, 2), range.withNumMipLevels(2))); } } } // // Test the functionality of TextureDesc::calcMipmapLevelCount // TEST(TextureDescStaticTest, CalcMipmapLevelCount) { ASSERT_EQ(TextureDesc::calcNumMipLevels(1, 1), 1); ASSERT_EQ(TextureDesc::calcNumMipLevels(4, 8), 4); ASSERT_EQ(TextureDesc::calcNumMipLevels(8, 4), 4); ASSERT_EQ(TextureDesc::calcNumMipLevels(10, 10), 4); ASSERT_EQ(TextureDesc::calcNumMipLevels(10, 10, 10), 4); ASSERT_EQ(TextureDesc::calcNumMipLevels(8, 4, 4), 4); ASSERT_EQ(TextureDesc::calcNumMipLevels(4, 8, 4), 4); ASSERT_EQ(TextureDesc::calcNumMipLevels(4, 4, 8), 4); } // // Test TextureFormatProperties::getNumMipLevels // TEST_F(TextureTest, GetNumMipLevels) { { auto properties = TextureFormatProperties::fromTextureFormat(TextureFormat::RGBA_UNorm8); EXPECT_EQ(properties.getNumMipLevels(1, 1, 4), 1); EXPECT_EQ(properties.getNumMipLevels(2, 2, 4 * 4 + 4), 2); EXPECT_EQ(properties.getNumMipLevels(5, 5, 25 * 4 + 4 * 4 + 4), 3); auto range = TextureRangeDesc::new2D(0, 0, 100, 50, 0); range.numMipLevels = 5; EXPECT_EQ(properties.getNumMipLevels(100, 50, properties.getBytesPerRange(range)), 5); } { // Compressed // 16 bytes per 5x5 block auto properties = TextureFormatProperties::fromTextureFormat(TextureFormat::RGBA_ASTC_5x5); EXPECT_EQ(properties.getNumMipLevels(1, 1, 16), 1); EXPECT_EQ(properties.getNumMipLevels(2, 2, 16 + 16), 2); EXPECT_EQ(properties.getNumMipLevels(5, 5, 16 + 16 + 16), 3); auto range = TextureRangeDesc::new2D(0, 0, 100, 50, 0); range.numMipLevels = 5; EXPECT_EQ(properties.getNumMipLevels(100, 50, properties.getBytesPerRange(range)), 5); } } } // namespace igl::tests ================================================ FILE: src/igl/tests/TextureRangeDesc.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include namespace igl::tests { TEST(TextureRangeDesc, Construction) { { const auto range = TextureRangeDesc::new1D(2, 3, 4, 5); EXPECT_EQ(range.x, 2); EXPECT_EQ(range.y, 0); EXPECT_EQ(range.z, 0); EXPECT_EQ(range.width, 3); EXPECT_EQ(range.height, 1); EXPECT_EQ(range.depth, 1); EXPECT_EQ(range.layer, 0); EXPECT_EQ(range.numLayers, 1); EXPECT_EQ(range.mipLevel, 4); EXPECT_EQ(range.numMipLevels, 5); EXPECT_EQ(range.face, 0); EXPECT_EQ(range.numFaces, 1); } { const auto range = TextureRangeDesc::new1DArray(2, 3, 4, 5, 6, 7); EXPECT_EQ(range.x, 2); EXPECT_EQ(range.y, 0); EXPECT_EQ(range.z, 0); EXPECT_EQ(range.width, 3); EXPECT_EQ(range.height, 1); EXPECT_EQ(range.depth, 1); EXPECT_EQ(range.layer, 4); EXPECT_EQ(range.numLayers, 5); EXPECT_EQ(range.mipLevel, 6); EXPECT_EQ(range.numMipLevels, 7); EXPECT_EQ(range.face, 0); EXPECT_EQ(range.numFaces, 1); } { const auto range = TextureRangeDesc::new2D(2, 3, 4, 5, 6, 7); EXPECT_EQ(range.x, 2); EXPECT_EQ(range.y, 3); EXPECT_EQ(range.z, 0); EXPECT_EQ(range.width, 4); EXPECT_EQ(range.height, 5); EXPECT_EQ(range.depth, 1); EXPECT_EQ(range.layer, 0); EXPECT_EQ(range.numLayers, 1); EXPECT_EQ(range.mipLevel, 6); EXPECT_EQ(range.numMipLevels, 7); EXPECT_EQ(range.face, 0); EXPECT_EQ(range.numFaces, 1); } { const auto range = TextureRangeDesc::new2DArray(2, 3, 4, 5, 6, 7, 8, 9); EXPECT_EQ(range.x, 2); EXPECT_EQ(range.y, 3); EXPECT_EQ(range.z, 0); EXPECT_EQ(range.width, 4); EXPECT_EQ(range.height, 5); EXPECT_EQ(range.depth, 1); EXPECT_EQ(range.layer, 6); EXPECT_EQ(range.numLayers, 7); EXPECT_EQ(range.mipLevel, 8); EXPECT_EQ(range.numMipLevels, 9); EXPECT_EQ(range.face, 0); EXPECT_EQ(range.numFaces, 1); } { const auto range = TextureRangeDesc::new3D(2, 3, 4, 5, 6, 7, 8, 9); EXPECT_EQ(range.x, 2); EXPECT_EQ(range.y, 3); EXPECT_EQ(range.z, 4); EXPECT_EQ(range.width, 5); EXPECT_EQ(range.height, 6); EXPECT_EQ(range.depth, 7); EXPECT_EQ(range.layer, 0); EXPECT_EQ(range.numLayers, 1); EXPECT_EQ(range.mipLevel, 8); EXPECT_EQ(range.numMipLevels, 9); EXPECT_EQ(range.face, 0); EXPECT_EQ(range.numFaces, 1); } { const auto range = TextureRangeDesc::newCube(2, 3, 4, 5, 7, 8); EXPECT_EQ(range.x, 2); EXPECT_EQ(range.y, 3); EXPECT_EQ(range.z, 0); EXPECT_EQ(range.width, 4); EXPECT_EQ(range.height, 5); EXPECT_EQ(range.depth, 1); EXPECT_EQ(range.layer, 0); EXPECT_EQ(range.numLayers, 1); EXPECT_EQ(range.mipLevel, 7); EXPECT_EQ(range.numMipLevels, 8); EXPECT_EQ(range.face, 0); EXPECT_EQ(range.numFaces, 6); } { const auto range = TextureRangeDesc::newCubeFace(2, 3, 4, 5, 1, 7, 8); EXPECT_EQ(range.x, 2); EXPECT_EQ(range.y, 3); EXPECT_EQ(range.z, 0); EXPECT_EQ(range.width, 4); EXPECT_EQ(range.height, 5); EXPECT_EQ(range.depth, 1); EXPECT_EQ(range.layer, 0); EXPECT_EQ(range.numLayers, 1); EXPECT_EQ(range.mipLevel, 7); EXPECT_EQ(range.numMipLevels, 8); EXPECT_EQ(range.face, 1); EXPECT_EQ(range.numFaces, 1); } { const auto range = TextureRangeDesc::newCubeFace(2, 3, 4, 5, TextureCubeFace::NegX, 7, 8); EXPECT_EQ(range.x, 2); EXPECT_EQ(range.y, 3); EXPECT_EQ(range.z, 0); EXPECT_EQ(range.width, 4); EXPECT_EQ(range.height, 5); EXPECT_EQ(range.depth, 1); EXPECT_EQ(range.layer, 0); EXPECT_EQ(range.numLayers, 1); EXPECT_EQ(range.mipLevel, 7); EXPECT_EQ(range.numMipLevels, 8); EXPECT_EQ(range.face, 1); EXPECT_EQ(range.numFaces, 1); } } TEST(TextureRangeDesc, AtMipLevel) { { const auto initialRange = TextureRangeDesc::new3D(0, 2, 5, 2, 10, 16, 0, 2); const auto range = initialRange.atMipLevel(0); EXPECT_EQ(range.x, 0); EXPECT_EQ(range.y, 2); EXPECT_EQ(range.z, 5); EXPECT_EQ(range.width, 2); EXPECT_EQ(range.height, 10); EXPECT_EQ(range.depth, 16); EXPECT_EQ(range.layer, 0); EXPECT_EQ(range.numLayers, 1); EXPECT_EQ(range.mipLevel, 0); EXPECT_EQ(range.numMipLevels, 1); EXPECT_EQ(range.face, 0); EXPECT_EQ(range.numFaces, 1); } { const auto initialRange = TextureRangeDesc::new3D(0, 2, 5, 2, 10, 16, 0); const auto range = initialRange.atMipLevel(1); EXPECT_EQ(range.x, 0); EXPECT_EQ(range.y, 1); EXPECT_EQ(range.z, 2); EXPECT_EQ(range.width, 1); EXPECT_EQ(range.height, 5); EXPECT_EQ(range.depth, 8); EXPECT_EQ(range.layer, 0); EXPECT_EQ(range.numLayers, 1); EXPECT_EQ(range.mipLevel, 1); EXPECT_EQ(range.numMipLevels, 1); EXPECT_EQ(range.face, 0); EXPECT_EQ(range.numFaces, 1); } { const auto initialRange = TextureRangeDesc::new2DArray(0, 5, 2, 10, 0, 2, 1); const auto range = initialRange.atMipLevel(3); EXPECT_EQ(range.x, 0); EXPECT_EQ(range.y, 1); EXPECT_EQ(range.z, 0); EXPECT_EQ(range.width, 1); EXPECT_EQ(range.height, 2); EXPECT_EQ(range.depth, 1); EXPECT_EQ(range.layer, 0); EXPECT_EQ(range.numLayers, 2); EXPECT_EQ(range.mipLevel, 3); EXPECT_EQ(range.numMipLevels, 1); EXPECT_EQ(range.face, 0); EXPECT_EQ(range.numFaces, 1); } } TEST(TextureRangeDesc, WithNumMipLevels) { { const auto initialRange = TextureRangeDesc::new2D(2, 3, 4, 5, 6, 7); const auto range = initialRange.withNumMipLevels(8); EXPECT_EQ(range.x, 2); EXPECT_EQ(range.y, 3); EXPECT_EQ(range.z, 0); EXPECT_EQ(range.width, 4); EXPECT_EQ(range.height, 5); EXPECT_EQ(range.depth, 1); EXPECT_EQ(range.layer, 0); EXPECT_EQ(range.numLayers, 1); EXPECT_EQ(range.mipLevel, 6); EXPECT_EQ(range.numMipLevels, 8); EXPECT_EQ(range.face, 0); EXPECT_EQ(range.numFaces, 1); } } TEST(TextureRangeDesc, AtLayer) { { const auto initialRange = TextureRangeDesc::new2DArray(2, 3, 4, 5, 6, 7, 8); const auto range = initialRange.atLayer(1); EXPECT_EQ(range.x, 2); EXPECT_EQ(range.y, 3); EXPECT_EQ(range.z, 0); EXPECT_EQ(range.width, 4); EXPECT_EQ(range.height, 5); EXPECT_EQ(range.depth, 1); EXPECT_EQ(range.layer, 1); EXPECT_EQ(range.numLayers, 1); EXPECT_EQ(range.mipLevel, 8); EXPECT_EQ(range.numMipLevels, 1); EXPECT_EQ(range.face, 0); EXPECT_EQ(range.numFaces, 1); } } TEST(TextureRangeDesc, WithNumLayers) { { const auto initialRange = TextureRangeDesc::new2D(2, 3, 4, 5, 6, 7); const auto range = initialRange.withNumLayers(8); EXPECT_EQ(range.x, 2); EXPECT_EQ(range.y, 3); EXPECT_EQ(range.z, 0); EXPECT_EQ(range.width, 4); EXPECT_EQ(range.height, 5); EXPECT_EQ(range.depth, 1); EXPECT_EQ(range.layer, 0); EXPECT_EQ(range.numLayers, 8); EXPECT_EQ(range.mipLevel, 6); EXPECT_EQ(range.numMipLevels, 7); EXPECT_EQ(range.face, 0); EXPECT_EQ(range.numFaces, 1); } } TEST(TextureRangeDesc, AtFace) { { const auto initialRange = TextureRangeDesc::new2D(2, 3, 4, 5, 6, 7); const auto range = initialRange.atFace(1); EXPECT_EQ(range.x, 2); EXPECT_EQ(range.y, 3); EXPECT_EQ(range.z, 0); EXPECT_EQ(range.width, 4); EXPECT_EQ(range.height, 5); EXPECT_EQ(range.depth, 1); EXPECT_EQ(range.layer, 0); EXPECT_EQ(range.numLayers, 1); EXPECT_EQ(range.mipLevel, 6); EXPECT_EQ(range.numMipLevels, 7); EXPECT_EQ(range.face, 1); EXPECT_EQ(range.numFaces, 1); } { const auto initialRange = TextureRangeDesc::new2D(2, 3, 4, 5, 6, 7); const auto range = initialRange.atFace(TextureCubeFace::NegX); EXPECT_EQ(range.x, 2); EXPECT_EQ(range.y, 3); EXPECT_EQ(range.z, 0); EXPECT_EQ(range.width, 4); EXPECT_EQ(range.height, 5); EXPECT_EQ(range.depth, 1); EXPECT_EQ(range.layer, 0); EXPECT_EQ(range.numLayers, 1); EXPECT_EQ(range.mipLevel, 6); EXPECT_EQ(range.numMipLevels, 7); EXPECT_EQ(range.face, 1); EXPECT_EQ(range.numFaces, 1); } } TEST(TextureRangeDesc, WithNumFaces) { { const auto initialRange = TextureRangeDesc::new2D(2, 3, 4, 5, 6, 7); const auto range = initialRange.withNumFaces(8); EXPECT_EQ(range.x, 2); EXPECT_EQ(range.y, 3); EXPECT_EQ(range.z, 0); EXPECT_EQ(range.width, 4); EXPECT_EQ(range.height, 5); EXPECT_EQ(range.depth, 1); EXPECT_EQ(range.layer, 0); EXPECT_EQ(range.numLayers, 1); EXPECT_EQ(range.mipLevel, 6); EXPECT_EQ(range.numMipLevels, 7); EXPECT_EQ(range.face, 0); EXPECT_EQ(range.numFaces, 8); } } TEST(TextureRangeDesc, Validate) { igl::setDebugBreakEnabled(false); constexpr size_t kMax = std::numeric_limits::max(); constexpr size_t kMaxPlus1 = std::numeric_limits::max() + 1; // Overflow validation logic doesn't work on 32bit architectures constexpr bool kRunOverflowTests = (sizeof(size_t) > sizeof(uint32_t)); // 2D EXPECT_TRUE(TextureRangeDesc::new2D(0, 0, 1024, 1024).validate().isOk()); EXPECT_TRUE(TextureRangeDesc::new2D(0, 0, 1024, 1024, 0, 11).validate().isOk()); EXPECT_TRUE(TextureRangeDesc::new2D(0, 0, 1, kMax).validate().isOk()); EXPECT_TRUE(TextureRangeDesc::new2D(0, 0, kMax, 1).validate().isOk()); EXPECT_TRUE(TextureRangeDesc::new2D(0, 0, 1024, 1024, kMax, 1).validate().isOk()); if (kRunOverflowTests) { EXPECT_FALSE(TextureRangeDesc::new2D(0, 0, kMax, 1024).validate().isOk()); EXPECT_FALSE(TextureRangeDesc::new2D(0, 0, 1024, kMax).validate().isOk()); EXPECT_FALSE(TextureRangeDesc::new2D(1, 1, 1, kMax).validate().isOk()); EXPECT_FALSE(TextureRangeDesc::new2D(1, 1, kMax, 1).validate().isOk()); EXPECT_FALSE(TextureRangeDesc::new2D(0, 0, 1, kMaxPlus1).validate().isOk()); EXPECT_FALSE(TextureRangeDesc::new2D(0, 0, kMaxPlus1, 1).validate().isOk()); } EXPECT_FALSE(TextureRangeDesc::new2D(0, 0, 1024, 1024, 0, 12).validate().isOk()); // 2D Array EXPECT_TRUE(TextureRangeDesc::new2DArray(0, 0, 1024, 1024, 0, 1024).validate().isOk()); EXPECT_TRUE(TextureRangeDesc::new2DArray(0, 0, 1, 1, 0, kMax).validate().isOk()); if (kRunOverflowTests) { EXPECT_FALSE(TextureRangeDesc::new2DArray(0, 0, 1024, 1024, 0, kMax).validate().isOk()); EXPECT_FALSE(TextureRangeDesc::new2DArray(0, 0, 1, 1, 1, kMax).validate().isOk()); EXPECT_FALSE(TextureRangeDesc::new2DArray(0, 0, 1, 1, 0, kMaxPlus1).validate().isOk()); } // 3D EXPECT_TRUE(TextureRangeDesc::new3D(0, 0, 0, 1024, 1024, 1024).validate().isOk()); EXPECT_TRUE(TextureRangeDesc::new3D(0, 0, 0, 1, 1, kMax).validate().isOk()); if (kRunOverflowTests) { EXPECT_FALSE(TextureRangeDesc::new3D(0, 0, 0, 1024, 1024, kMax).validate().isOk()); EXPECT_FALSE(TextureRangeDesc::new3D(0, 0, 1, 1, 1, kMax).validate().isOk()); EXPECT_FALSE(TextureRangeDesc::new3D(0, 0, 0, 1, 1, kMaxPlus1).validate().isOk()); } // Cube EXPECT_TRUE(TextureRangeDesc::newCube(0, 0, 1024, 1024).validate().isOk()); EXPECT_FALSE(TextureRangeDesc::newCube(0, 0, 1024, 1024).withNumFaces(7).validate().isOk()); EXPECT_FALSE(TextureRangeDesc::newCube(0, 0, 1024, 1024).atFace(7).validate().isOk()); } namespace { TextureRangeDesc createTestRange() { TextureRangeDesc range; range.x = 1; range.y = 2; range.z = 3; range.width = 4; range.height = 5; range.depth = 6; range.layer = 7; range.numLayers = 8; range.mipLevel = 9; range.numMipLevels = 10; range.face = 11; range.numFaces = 12; return range; } } // namespace TEST(TextureRangeDesc, Equality) { const auto rangeA = createTestRange(); { const auto rangeB = createTestRange(); EXPECT_TRUE(rangeA == rangeB); EXPECT_FALSE(rangeA != rangeB); } { auto rangeB = createTestRange(); rangeB.x = 0; EXPECT_FALSE(rangeA == rangeB); EXPECT_TRUE(rangeA != rangeB); } { auto rangeB = createTestRange(); rangeB.y = 0; EXPECT_FALSE(rangeA == rangeB); EXPECT_TRUE(rangeA != rangeB); } { auto rangeB = createTestRange(); rangeB.z = 0; EXPECT_FALSE(rangeA == rangeB); EXPECT_TRUE(rangeA != rangeB); } { auto rangeB = createTestRange(); rangeB.width = 0; EXPECT_FALSE(rangeA == rangeB); EXPECT_TRUE(rangeA != rangeB); } { auto rangeB = createTestRange(); rangeB.height = 0; EXPECT_FALSE(rangeA == rangeB); EXPECT_TRUE(rangeA != rangeB); } { auto rangeB = createTestRange(); rangeB.depth = 0; EXPECT_FALSE(rangeA == rangeB); EXPECT_TRUE(rangeA != rangeB); } { auto rangeB = createTestRange(); rangeB.layer = 0; EXPECT_FALSE(rangeA == rangeB); EXPECT_TRUE(rangeA != rangeB); } { auto rangeB = createTestRange(); rangeB.numLayers = 0; EXPECT_FALSE(rangeA == rangeB); EXPECT_TRUE(rangeA != rangeB); } { auto rangeB = createTestRange(); rangeB.mipLevel = 0; EXPECT_FALSE(rangeA == rangeB); EXPECT_TRUE(rangeA != rangeB); } { auto rangeB = createTestRange(); rangeB.numMipLevels = 0; EXPECT_FALSE(rangeA == rangeB); EXPECT_TRUE(rangeA != rangeB); } { auto rangeB = createTestRange(); rangeB.face = 0; EXPECT_FALSE(rangeA == rangeB); EXPECT_TRUE(rangeA != rangeB); } { auto rangeB = createTestRange(); rangeB.numFaces = 0; EXPECT_FALSE(rangeA == rangeB); EXPECT_TRUE(rangeA != rangeB); } } } // namespace igl::tests ================================================ FILE: src/igl/tests/TexturesRGB.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "data/ShaderData.h" #include "data/TextureData.h" #include "data/VertexIndexData.h" #include "util/Color.h" #include "util/Common.h" #include #include #include #include #include #include #include namespace igl::tests { // // TexturesRGBBaseTest // // Test fixture for all the tests in this file. Takes care of common // initialization and allocating of common resources. // class TexturesRGBBaseTest : public ::testing::Test { private: public: TexturesRGBBaseTest() = default; ~TexturesRGBBaseTest() override = default; // // SetUp() // // This function sets up a render pass and a graphics pipeline descriptor // so it is ready to render a simple quad with an input texture to an // offscreen texture. // // The actual creation of the graphics pipeline state object is left // to each test so that tests can replace the default settings with // something more appropriate. // void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_TRUE(iglDev_ != nullptr); ASSERT_TRUE(cmdQueue_ != nullptr); // Create an offscreen texture to render to const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_SRGB, offscreenTexWidth_, offscreenTexHeight_, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); Result ret; offscreenTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(offscreenTexture_ != nullptr); // Create framebuffer using the offscreen texture FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = offscreenTexture_; framebuffer_ = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(framebuffer_ != nullptr); // Initialize render pass descriptor renderPass_.colorAttachments.resize(1); renderPass_.colorAttachments[0].loadAction = LoadAction::Clear; renderPass_.colorAttachments[0].storeAction = StoreAction::Store; renderPass_.colorAttachments[0].clearColor = {0.0, 0.0, 0.0, 1.0}; // Initialize shader stages std::unique_ptr stages; igl::tests::util::createSimpleShaderStages(iglDev_, stages); shaderStages_ = std::move(stages); // Initialize input to vertex shader VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Float4; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].bufferIndex = data::shader::kSimplePosIndex; inputDesc.attributes[0].name = data::shader::kSimplePos; inputDesc.attributes[0].location = 0; inputDesc.inputBindings[0].stride = sizeof(float) * 4; inputDesc.attributes[1].format = VertexAttributeFormat::Float2; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].bufferIndex = data::shader::kSimpleUvIndex; inputDesc.attributes[1].name = data::shader::kSimpleUv; inputDesc.attributes[1].location = 1; inputDesc.inputBindings[1].stride = sizeof(float) * 2; // numAttributes has to equal to bindings when using more than 1 buffer inputDesc.numAttributes = inputDesc.numInputBindings = 2; vertexInputState_ = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vertexInputState_ != nullptr); // Initialize index buffer BufferDesc bufDesc; bufDesc.type = BufferDesc::BufferTypeBits::Index; bufDesc.data = data::vertex_index::kQuadInd.data(); bufDesc.length = sizeof(data::vertex_index::kQuadInd); ib_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(ib_ != nullptr); // Initialize vertex and sampler buffers bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data::vertex_index::kQuadVert.data(); bufDesc.length = sizeof(data::vertex_index::kQuadVert); vb_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vb_ != nullptr); bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data::vertex_index::kQuadUv.data(); bufDesc.length = sizeof(data::vertex_index::kQuadUv); uv_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(uv_ != nullptr); // Initialize sampler state const SamplerStateDesc samplerDesc; samp_ = iglDev_->createSamplerState(samplerDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(samp_ != nullptr); // Initialize Graphics Pipeline Descriptor, but leave the creation // to the individual tests in case further customization is required renderPipelineDesc_.vertexInputState = vertexInputState_; renderPipelineDesc_.shaderStages = shaderStages_; renderPipelineDesc_.targetDesc.colorAttachments.resize(1); renderPipelineDesc_.targetDesc.colorAttachments[0].textureFormat = offscreenTexture_->getFormat(); renderPipelineDesc_.fragmentUnitSamplerMap[textureUnit_] = IGL_NAMEHANDLE(data::shader::kSimpleSampler); renderPipelineDesc_.cullMode = igl::CullMode::Disabled; // The sRGB hardware extension should decode and re-encode to exactly the same color values // which is what this test is trying to test. // It turns out that not everyone gets it 100% right. // the platforms below, on OpenGL result with some colors // have a + or - 1 to the original value which is most probably due to the // the level of precision used to perform the arithmetic. // The kTolerance is used to not only make this test not fail but also to document // which platform gets it right and which platform gets it slightly wrong. // Panther is external codename for Quest3s and Eureka is external codename for Quest3 #if IGL_PLATFORM_LINUX_SWIFTSHADER || defined(PANTHER_PLATFORM) || defined(EUREKA_PLATFORM) if (iglDev_->getBackendType() == BackendType::OpenGL) { tolerance_ = 1; // Swiftshader and quest 3(s) opengl is not accurate enough. } #endif } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; std::shared_ptr cmdBuf_; CommandBufferDesc cbDesc_ = {}; const std::string backend_ = IGL_BACKEND_TYPE; RenderPassDesc renderPass_; std::shared_ptr offscreenTexture_; std::shared_ptr framebuffer_; // Currently it is left to individual tests to initialize this std::shared_ptr inputTexture_; std::shared_ptr shaderStages_; std::shared_ptr vertexInputState_; std::shared_ptr vb_, uv_, ib_; std::shared_ptr samp_; RenderPipelineDesc renderPipelineDesc_; size_t textureUnit_ = 0; // Picking this just to match the texture we will use. If you use a different // size texture, then you will have to either create a new offscreenTexture_ // and the framebuffer object in your test, so know exactly what the end result // would be after sampling size_t offscreenTexWidth_ = 2; size_t offscreenTexHeight_ = 2; uint8_t tolerance_ = 0; // some platforms aren't perfect and need some tolerance }; class TexturesRGBSmallTest : public TexturesRGBBaseTest { void SetUp() override { TexturesRGBBaseTest::SetUp(); } }; class TexturesRGBBigTest : public TexturesRGBBaseTest { void SetUp() override { offscreenTexWidth_ = 4096; offscreenTexHeight_ = 4096; TexturesRGBBaseTest::SetUp(); } }; // // isSRGB test // // This test checks whether the texture format can be detected as sRGB or not // TEST_F(TexturesRGBSmallTest, TextureisSRGB) { Result ret; const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_SRGB, offscreenTexWidth_, offscreenTexHeight_, TextureDesc::TextureUsageBits::Sampled); inputTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_TRUE(inputTexture_->getProperties().isSRGB()); const TextureDesc texDesc2 = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, offscreenTexWidth_, offscreenTexHeight_, TextureDesc::TextureUsageBits::Sampled); inputTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_FALSE(!inputTexture_->getProperties().isSRGB()); } // // TexturesRGB Passthrough Test // // This test uses a simple shader to copy the input texture to a same // sized output texture (offscreenTexture_) and make sure colors are being preserved // TEST_F(TexturesRGBSmallTest, Passthrough) { Result ret; std::shared_ptr pipelineState; //------------------------------------- // Create input texture and upload data //------------------------------------- const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_SRGB, offscreenTexWidth_, offscreenTexHeight_, TextureDesc::TextureUsageBits::Sampled); inputTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(inputTexture_ != nullptr); const auto rangeDesc = TextureRangeDesc::new2D(0, 0, offscreenTexWidth_, offscreenTexHeight_); inputTexture_->upload(rangeDesc, data::texture::kTexRgba2x2.data()); //---------------- // Create Pipeline //---------------- pipelineState = iglDev_->createRenderPipeline(renderPipelineDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(pipelineState != nullptr); //------- // Render //------- cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(cmdBuf_ != nullptr); auto cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, framebuffer_); cmds->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmds->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); cmds->bindRenderPipelineState(pipelineState); cmds->bindTexture(textureUnit_, BindTarget::kFragment, inputTexture_.get()); cmds->bindSamplerState(textureUnit_, BindTarget::kFragment, samp_.get()); cmds->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmds->drawIndexed(6); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); cmdBuf_->waitUntilCompleted(); //---------------------- // Read back framebuffer //---------------------- auto pixels = std::vector(offscreenTexWidth_ * offscreenTexHeight_); framebuffer_->copyBytesColorAttachment(*cmdQueue_, 0, pixels.data(), rangeDesc); //-------------------------------- // Verify against original texture //-------------------------------- for (size_t i = 0; i < offscreenTexWidth_ * offscreenTexHeight_; i++) { const util::SRgbColor currentColor(pixels[i]); const util::SRgbColor testColor(data::texture::kTexRgba2x2[i]); ASSERT_LE(abs(currentColor.r - testColor.r), tolerance_); ASSERT_LE(abs(currentColor.g - testColor.g), tolerance_); ASSERT_LE(abs(currentColor.b - testColor.b), tolerance_); ASSERT_LE(abs(currentColor.a - testColor.a), tolerance_); } } TEST_F(TexturesRGBBigTest, Passthrough) { Result ret; std::shared_ptr pipelineState; //------------------------------------- // Create input texture and upload data //------------------------------------- const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_SRGB, offscreenTexWidth_, offscreenTexHeight_, TextureDesc::TextureUsageBits::Sampled); inputTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(inputTexture_ != nullptr); const auto rangeDesc = TextureRangeDesc::new2D(0, 0, offscreenTexWidth_, offscreenTexHeight_); const size_t kAllColorsCount = 256ul * 256ul * 256ul; ASSERT_TRUE(kAllColorsCount == offscreenTexWidth_ * offscreenTexHeight_); std::vector allColorsBuffer(offscreenTexWidth_ * offscreenTexHeight_); size_t index = 0; for (size_t r = 0; r < 256ul; ++r) { for (size_t g = 0; g < 256ul; ++g) { for (size_t b = 0; b < 256ul; ++b) { ASSERT_TRUE(index < kAllColorsCount); allColorsBuffer[index] = (r << 24) | (g << 16) | (b << 8) | 0xFF; ++index; } } } inputTexture_->upload(rangeDesc, allColorsBuffer.data()); //---------------- // Create Pipeline //---------------- pipelineState = iglDev_->createRenderPipeline(renderPipelineDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(pipelineState != nullptr); //------- // Render //------- cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(cmdBuf_ != nullptr); auto cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, framebuffer_); cmds->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmds->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); cmds->bindRenderPipelineState(pipelineState); cmds->bindTexture(textureUnit_, BindTarget::kFragment, inputTexture_.get()); cmds->bindSamplerState(textureUnit_, BindTarget::kFragment, samp_.get()); cmds->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmds->drawIndexed(6); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); cmdBuf_->waitUntilCompleted(); //---------------------- // Read back framebuffer //---------------------- auto pixels = std::vector(offscreenTexWidth_ * offscreenTexHeight_); framebuffer_->copyBytesColorAttachment(*cmdQueue_, 0, pixels.data(), rangeDesc); //-------------------------------- // Verify against original texture //-------------------------------- for (size_t i = 0; i < offscreenTexWidth_ * offscreenTexHeight_; i++) { const util::SRgbColor currentColor(pixels[i]); const util::SRgbColor testColor(allColorsBuffer[i]); ASSERT_LE(abs(currentColor.r - testColor.r), tolerance_); ASSERT_LE(abs(currentColor.g - testColor.g), tolerance_); ASSERT_LE(abs(currentColor.b - testColor.b), tolerance_); ASSERT_LE(abs(currentColor.a - testColor.a), tolerance_); } } } // namespace igl::tests ================================================ FILE: src/igl/tests/VertexInputState.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace igl::tests { // // VertexInputStateTest // // Tests types related to abstraction of vertex input state (attribute formats, // attributes, bindings, and input state descriptors). // // class VertexInputStateTest : public ::testing::Test { public: VertexInputStateTest() = default; ~VertexInputStateTest() override = default; void SetUp() override { setDebugBreakEnabled(false); } void TearDown() override {} // Member variables protected: const std::string backend_ = IGL_BACKEND_TYPE; }; // // VertexAttributeSizes // // Verifies that all vertex attribute formats report sizes that agree with what is expected by // extant backends. // TEST_F(VertexInputStateTest, VertexAttributeSizes) { ASSERT_EQ(4, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::Float1)); ASSERT_EQ(8, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::Float2)); ASSERT_EQ(12, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::Float3)); ASSERT_EQ(16, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::Float4)); ASSERT_EQ(1, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::Byte1)); ASSERT_EQ(2, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::Byte2)); ASSERT_EQ(3, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::Byte3)); ASSERT_EQ(4, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::Byte4)); ASSERT_EQ(1, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::UByte1)); ASSERT_EQ(2, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::UByte2)); ASSERT_EQ(3, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::UByte3)); ASSERT_EQ(4, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::UByte4)); ASSERT_EQ(2, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::Short1)); ASSERT_EQ(4, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::Short2)); ASSERT_EQ(6, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::Short3)); ASSERT_EQ(8, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::Short4)); ASSERT_EQ(2, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::UShort1)); ASSERT_EQ(4, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::UShort2)); ASSERT_EQ(6, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::UShort3)); ASSERT_EQ(8, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::UShort4)); ASSERT_EQ(1, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::Byte1Norm)); ASSERT_EQ(2, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::Byte2Norm)); ASSERT_EQ(3, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::Byte3Norm)); ASSERT_EQ(4, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::Byte4Norm)); ASSERT_EQ(1, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::UByte1Norm)); ASSERT_EQ(2, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::UByte2Norm)); ASSERT_EQ(3, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::UByte3Norm)); ASSERT_EQ(4, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::UByte4Norm)); ASSERT_EQ(2, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::Short1Norm)); ASSERT_EQ(4, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::Short2Norm)); ASSERT_EQ(6, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::Short3Norm)); ASSERT_EQ(8, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::Short4Norm)); ASSERT_EQ(2, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::UShort1Norm)); ASSERT_EQ(4, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::UShort2Norm)); ASSERT_EQ(6, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::UShort3Norm)); ASSERT_EQ(8, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::UShort4Norm)); ASSERT_EQ(2, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::HalfFloat1)); ASSERT_EQ(4, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::HalfFloat2)); ASSERT_EQ(6, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::HalfFloat3)); ASSERT_EQ(8, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::HalfFloat4)); ASSERT_EQ(4, VertexInputStateDesc::sizeForVertexAttributeFormat( VertexAttributeFormat::Int_2_10_10_10_REV)); ASSERT_EQ(4, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::Int1)); ASSERT_EQ(8, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::Int2)); ASSERT_EQ(12, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::Int3)); ASSERT_EQ(16, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::Int4)); ASSERT_EQ(4, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::UInt1)); ASSERT_EQ(8, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::UInt2)); ASSERT_EQ(12, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::UInt3)); ASSERT_EQ(16, VertexInputStateDesc::sizeForVertexAttributeFormat(VertexAttributeFormat::UInt4)); } // // VertexInputBindingEquality // // Exercises == and != operators for the VertexInputBinding type // TEST_F(VertexInputStateTest, VertexInputBindingEquality) { VertexInputBinding binding1, binding2; // Default-constructed bindings should be equal. ASSERT_EQ(binding1, binding2); // Bindings that differ in sample function should compare non-equal. binding1.sampleFunction = VertexSampleFunction::Constant; binding2.sampleFunction = VertexSampleFunction::PerVertex; ASSERT_NE(binding1, binding2); binding1.sampleFunction = binding2.sampleFunction; ASSERT_EQ(binding1, binding2); // Bindings that differ in stride should compare non-equal. binding1.stride = 16; binding2.stride = 12; ASSERT_NE(binding1, binding2); binding1.stride = binding2.stride; ASSERT_EQ(binding1, binding2); // Bindings that differ in stride should compare non-equal. binding1.sampleRate = 4; binding2.sampleRate = 1; ASSERT_NE(binding1, binding2); binding1.sampleRate = binding2.sampleRate; ASSERT_EQ(binding1, binding2); } // // VertexAttributeEquality // // Exercises == and != operators for the VertexAttribute type // TEST_F(VertexInputStateTest, VertexAttributeEquality) { VertexAttribute attr1, attr2; // Default-constructed attributes should be equal. ASSERT_EQ(attr1, attr2); // Attributes with different buffer indices should compare non-equal. attr1.bufferIndex = 1; ASSERT_NE(attr1, attr2); attr1.bufferIndex = attr2.bufferIndex; ASSERT_EQ(attr1, attr2); // Attributes with different formats should compare non-equal. attr1.format = VertexAttributeFormat::Float4; ASSERT_NE(attr1, attr2); attr1.format = attr2.format; ASSERT_EQ(attr1, attr2); // Attributes with different offsets should compare non-equal. attr1.offset = 8; ASSERT_NE(attr1, attr2); attr1.offset = attr2.offset; ASSERT_EQ(attr1, attr2); // Attributes with different names should compare non-equal (OpenGL ES-only). attr1.name = "a"; ASSERT_NE(attr1, attr2); attr1.name = attr2.name; ASSERT_EQ(attr1, attr2); // Attributes with different locations should compare non-equal (Metal-only). attr1.location = 2; ASSERT_NE(attr1, attr2); attr1.location = attr2.location; ASSERT_EQ(attr1, attr2); } // // VertexInputStateDescEquality // // Exercises == and != operators for the VertexInputStateDesc type // TEST_F(VertexInputStateTest, VertexInputStateDescEquality) { VertexInputStateDesc desc1, desc2; // Default-constructed descriptors should be equal. ASSERT_EQ(desc1, desc2); // Descriptors populated with the same attributes and bindings should compare equal. desc1.numAttributes = 2; desc1.attributes[0].bufferIndex = 0; desc1.attributes[0].format = VertexAttributeFormat::Float4; desc1.attributes[0].offset = 0; desc1.attributes[1].bufferIndex = 1; desc1.attributes[1].format = VertexAttributeFormat::Float4; desc1.attributes[1].offset = 0; desc1.numInputBindings = 2; desc1.inputBindings[0].stride = 16; desc1.inputBindings[1].stride = 16; desc2.numAttributes = desc1.numAttributes; desc2.attributes[0].bufferIndex = desc1.attributes[0].bufferIndex; desc2.attributes[0].format = desc1.attributes[0].format; desc2.attributes[0].offset = desc1.attributes[0].offset; desc2.attributes[1].bufferIndex = desc1.attributes[1].bufferIndex; desc2.attributes[1].format = desc1.attributes[1].format; desc2.attributes[1].offset = desc1.attributes[1].offset; desc2.numInputBindings = desc1.numInputBindings; desc2.inputBindings[0].stride = desc1.inputBindings[0].stride; desc2.inputBindings[1].stride = desc1.inputBindings[1].stride; ASSERT_EQ(desc1, desc2); // Descriptors with different attribute counts should compare non-equal. desc1.numAttributes = 1; ASSERT_NE(desc1, desc2); desc1.numAttributes = desc2.numAttributes; ASSERT_EQ(desc1, desc2); // Descriptors with differing attributes should compare non-equal. desc1.attributes[0].format = VertexAttributeFormat::Float2; ASSERT_NE(desc1, desc2); desc1.attributes[0].format = desc2.attributes[0].format; ASSERT_EQ(desc1, desc2); // Descriptors with different binding counts should compare non-equal. desc1.numInputBindings = 1; ASSERT_NE(desc1, desc2); desc1.numInputBindings = desc2.numInputBindings; ASSERT_EQ(desc1, desc2); // Descriptors with differing bindings should compare non-equal. desc1.inputBindings[0].stride = 32; ASSERT_NE(desc1, desc2); desc1.inputBindings[0].stride = desc2.inputBindings[0].stride; ASSERT_EQ(desc1, desc2); } } // namespace igl::tests ================================================ FILE: src/igl/tests/android/NativeHWBuffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #if defined(IGL_ANDROID_HWBUFFER_SUPPORTED) #include #include #include "../data/ShaderData.h" #include "../data/TextureData.h" #include "../data/VertexIndexData.h" #include "../util/Common.h" #include "../util/TextureValidationHelpers.h" #include "../util/device/TestDevice.h" #include #include #include #include #include namespace igl::tests { using namespace igl::android; constexpr uint32_t kOffscreenTexWidth = 10u; constexpr uint32_t kOffscreenTexHeight = 10u; class NativeHWBufferTest : public ::testing::Test { public: NativeHWBufferTest() = default; ~NativeHWBufferTest() override = default; }; class NativeHWTextureBufferTest : public igl::android::INativeHWTextureBuffer { protected: Result createTextureInternal(AHardwareBuffer* buffer) override { return Result(); } }; TEST_F(NativeHWBufferTest, Basic_getNativeHWFormat) { EXPECT_EQ(getNativeHWFormat(TextureFormat::RGBX_UNorm8), AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM); EXPECT_EQ(getNativeHWFormat(TextureFormat::RGBA_UNorm8), AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM); EXPECT_EQ(getNativeHWFormat(TextureFormat::B5G6R5_UNorm), AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM); EXPECT_EQ(getNativeHWFormat(TextureFormat::RGBA_F16), AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT); EXPECT_EQ(getNativeHWFormat(TextureFormat::RGB10_A2_UNorm_Rev), AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM); EXPECT_EQ(getNativeHWFormat(TextureFormat::Z_UNorm16), AHARDWAREBUFFER_FORMAT_D16_UNORM); EXPECT_EQ(getNativeHWFormat(TextureFormat::Z_UNorm24), AHARDWAREBUFFER_FORMAT_D24_UNORM); EXPECT_EQ(getNativeHWFormat(TextureFormat::Z_UNorm32), AHARDWAREBUFFER_FORMAT_D32_FLOAT); EXPECT_EQ(getNativeHWFormat(TextureFormat::S8_UInt_Z24_UNorm), AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT); EXPECT_EQ(getNativeHWFormat(TextureFormat::S_UInt8), AHARDWAREBUFFER_FORMAT_S8_UINT); EXPECT_EQ(getNativeHWFormat(igl::TextureFormat::YUV_NV12), AHARDWAREBUFFER_FORMAT_YCbCr_420_SP_VENUS); EXPECT_EQ(getNativeHWFormat(igl::TextureFormat::Invalid), 0); #if __ANDROID_MIN_SDK_VERSION__ >= 30 EXPECT_EQ(getNativeHWFormat(igl::TextureFormat::YUV_420p), AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420); #endif } TEST_F(NativeHWBufferTest, Basic_getIglFormat) { EXPECT_EQ(igl::android::getIglFormat(AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM), TextureFormat::RGBX_UNorm8); EXPECT_EQ(igl::android::getIglFormat(AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM), TextureFormat::RGBA_UNorm8); EXPECT_EQ(igl::android::getIglFormat(AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM), TextureFormat::B5G6R5_UNorm); EXPECT_EQ(igl::android::getIglFormat(AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT), TextureFormat::RGBA_F16); EXPECT_EQ(igl::android::getIglFormat(AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM), TextureFormat::RGB10_A2_UNorm_Rev); EXPECT_EQ(igl::android::getIglFormat(AHARDWAREBUFFER_FORMAT_D16_UNORM), TextureFormat::Z_UNorm16); EXPECT_EQ(igl::android::getIglFormat(AHARDWAREBUFFER_FORMAT_D24_UNORM), TextureFormat::Z_UNorm24); EXPECT_EQ(igl::android::getIglFormat(AHARDWAREBUFFER_FORMAT_D32_FLOAT), TextureFormat::Z_UNorm32); EXPECT_EQ(igl::android::getIglFormat(AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT), TextureFormat::S8_UInt_Z24_UNorm); EXPECT_EQ(igl::android::getIglFormat(AHARDWAREBUFFER_FORMAT_S8_UINT), TextureFormat::S_UInt8); EXPECT_EQ(igl::android::getIglFormat(AHARDWAREBUFFER_FORMAT_YCbCr_420_SP_VENUS), TextureFormat::YUV_NV12); #if __ANDROID_MIN_SDK_VERSION__ >= 30 EXPECT_EQ(igl::android::getIglFormat(AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420), TextureFormat::YUV_420p); #endif } TEST_F(NativeHWBufferTest, getNativeHWBufferUsage) { EXPECT_TRUE(getNativeHWBufferUsage(TextureDesc::TextureUsageBits::Sampled) | AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE); EXPECT_TRUE(getNativeHWBufferUsage(TextureDesc::TextureUsageBits::Storage) | AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN | AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN); EXPECT_TRUE(getNativeHWBufferUsage(TextureDesc::TextureUsageBits::Attachment) | AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT); } TEST_F(NativeHWBufferTest, getIglBufferUsage) { EXPECT_TRUE(getIglBufferUsage(AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE) | TextureDesc::TextureUsageBits::Sampled); EXPECT_TRUE(getIglBufferUsage(AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN | AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN) | TextureDesc::TextureUsageBits::Storage); EXPECT_TRUE(getIglBufferUsage(AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT) | TextureDesc::TextureUsageBits::Attachment); } TEST_F(NativeHWBufferTest, allocateNativeHWBuffer) { AHardwareBuffer* hwBuffer; auto allocationResult = allocateNativeHWBuffer( TextureDesc::newNativeHWBufferImage( TextureFormat::RGBA_UNorm8, TextureDesc::TextureUsageBits::Sampled, 100, 100), false, &hwBuffer); EXPECT_TRUE(allocationResult.isOk()); EXPECT_NE(hwBuffer, nullptr); AHardwareBuffer_Desc hwbDesc; AHardwareBuffer_describe(hwBuffer, &hwbDesc); AHardwareBuffer_release(hwBuffer); EXPECT_EQ(hwbDesc.format, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM); EXPECT_EQ(hwbDesc.width, 100); EXPECT_EQ(hwbDesc.height, 100); EXPECT_EQ(hwbDesc.layers, 1); EXPECT_EQ(hwbDesc.usage, AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE); } TEST_F(NativeHWBufferTest, LockBuffer) { AHardwareBuffer* hwBuffer; auto allocationResult = allocateNativeHWBuffer( TextureDesc::newNativeHWBufferImage( TextureFormat::RGBA_UNorm8, TextureDesc::TextureUsageBits::Sampled, 100, 100), false, &hwBuffer); EXPECT_TRUE(allocationResult.isOk()); EXPECT_NE(hwBuffer, nullptr); { NativeHWTextureBufferTest testTxBuffer; EXPECT_TRUE(testTxBuffer.createWithHWBuffer(hwBuffer).isOk()); std::byte* bytes = nullptr; INativeHWTextureBuffer::RangeDesc outRange; Result outResult; auto lockGuard = testTxBuffer.lockHWBuffer(&bytes, outRange, &outResult); EXPECT_TRUE(outResult.isOk()); EXPECT_NE(bytes, nullptr); EXPECT_EQ(outRange.width, 100); EXPECT_EQ(outRange.height, 100); EXPECT_EQ(outRange.layer, 1); EXPECT_EQ(outRange.mipLevel, 1); lockGuard.~LockGuard(); } AHardwareBuffer_release(hwBuffer); } template class NativeHWBufferTextureTest : public ::testing::Test { public: NativeHWBufferTextureTest() = default; ~NativeHWBufferTextureTest() override = default; // // This function sets up a render pass and a graphics pipeline descriptor // so it is ready to render a simple quad with an input texture to an // offscreen texture. // // The actual creation of the graphics pipeline state object is left // to each test so that tests can replace the default settings with // something more appropriate. // void SetUp() override { setDebugBreakEnabled(false); Result ret; // Create Device if (TBackendType == igl::BackendType::OpenGL) { iglDev_ = util::device::createTestDevice(igl::BackendType::OpenGL); } else if (TBackendType == igl::BackendType::Vulkan) { iglDev_ = util::device::createTestDevice(igl::BackendType::Vulkan); } else { static_assert("Unsupported backend"); } ASSERT_TRUE(iglDev_ != nullptr); // Create Command Queue const CommandQueueDesc cqDesc = {}; cmdQueue_ = iglDev_->createCommandQueue(cqDesc, &ret); ASSERT_TRUE(cmdQueue_ != nullptr); // Create an offscreen texture to render to const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kOffscreenTexWidth, kOffscreenTexHeight, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment, "test"); offscreenTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok) << ret.message; ASSERT_TRUE(offscreenTexture_ != nullptr); // Create framebuffer using the offscreen texture FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = offscreenTexture_; framebuffer_ = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(framebuffer_ != nullptr); // Initialize render pass descriptor renderPass_.colorAttachments.resize(1); renderPass_.colorAttachments[0].loadAction = LoadAction::Clear; renderPass_.colorAttachments[0].storeAction = StoreAction::Store; renderPass_.colorAttachments[0].clearColor = {0.0, 0.0, 0.0, 1.0}; // Initialize shader stages std::unique_ptr stages; igl::tests::util::createSimpleShaderStages(iglDev_, stages); shaderStages_ = std::move(stages); // Initialize input to vertex shader VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Float4; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].bufferIndex = data::shader::kSimplePosIndex; inputDesc.attributes[0].name = data::shader::kSimplePos; inputDesc.attributes[0].location = 0; inputDesc.inputBindings[0].stride = sizeof(float) * 4; inputDesc.attributes[1].format = VertexAttributeFormat::Float2; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].bufferIndex = data::shader::kSimpleUvIndex; inputDesc.attributes[1].name = data::shader::kSimpleUv; inputDesc.attributes[1].location = 1; inputDesc.inputBindings[1].stride = sizeof(float) * 2; // numAttributes has to equal to bindings when using more than 1 buffer inputDesc.numAttributes = inputDesc.numInputBindings = 2; vertexInputState_ = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vertexInputState_ != nullptr); // Initialize index buffer BufferDesc bufDesc; bufDesc.type = BufferDesc::BufferTypeBits::Index; bufDesc.data = data::vertex_index::kQuadInd.data(); bufDesc.length = sizeof(data::vertex_index::kQuadInd); ib_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(ib_ != nullptr); // Initialize vertex and sampler buffers bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data::vertex_index::kQuadVert.data(); bufDesc.length = sizeof(data::vertex_index::kQuadVert); vb_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vb_ != nullptr); bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data::vertex_index::kQuadUv.data(); bufDesc.length = sizeof(data::vertex_index::kQuadUv); uv_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(uv_ != nullptr); // Initialize sampler state const SamplerStateDesc samplerDesc; samp_ = iglDev_->createSamplerState(samplerDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(samp_ != nullptr); // Initialize Graphics Pipeline Descriptor, but leave the creation // to the individual tests in case further customization is required renderPipelineDesc_.vertexInputState = vertexInputState_; renderPipelineDesc_.shaderStages = shaderStages_; renderPipelineDesc_.targetDesc.colorAttachments.resize(1); renderPipelineDesc_.targetDesc.colorAttachments[0].textureFormat = offscreenTexture_->getFormat(); renderPipelineDesc_.fragmentUnitSamplerMap[textureUnit_] = IGL_NAMEHANDLE(data::shader::kSimpleSampler); renderPipelineDesc_.cullMode = igl::CullMode::Disabled; auto allocationResult = allocateNativeHWBuffer( TextureDesc::newNativeHWBufferImage(TextureFormat::RGBA_UNorm8, TextureDesc::TextureUsageBits::Sampled, kOffscreenTexWidth, kOffscreenTexHeight), false, &hwBuffer_); ASSERT_TRUE(allocationResult.isOk()); ASSERT_NE(hwBuffer_, nullptr); for (int i = 0; i < kOffscreenTexWidth * kOffscreenTexHeight; ++i) { pixels_[i] = rand() % 0xFFFFFFFF; } AHardwareBuffer_Desc hwbDesc; AHardwareBuffer_describe(hwBuffer_, &hwbDesc); std::byte* bytes; auto lock_result = AHardwareBuffer_lock(hwBuffer_, AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN, -1, nullptr, reinterpret_cast(&bytes)); ASSERT_EQ(lock_result, 0); for (int i = 0; i < hwbDesc.stride; ++i) { for (int j = 0; j < hwbDesc.height; ++j) { uint32_t color = 0x00000000; if (i < hwbDesc.width && j < hwbDesc.height) { color = pixels_[i + j * hwbDesc.width]; } reinterpret_cast(bytes)[i + j * hwbDesc.stride] = color; } } ASSERT_EQ(AHardwareBuffer_unlock(hwBuffer_, nullptr), 0); } void TearDown() override { AHardwareBuffer_release(hwBuffer_); } // Member variables public: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; std::shared_ptr cmdBuf_; CommandBufferDesc cbDesc_ = {}; RenderPassDesc renderPass_; std::shared_ptr offscreenTexture_; std::shared_ptr framebuffer_; std::shared_ptr shaderStages_; std::shared_ptr vertexInputState_; std::shared_ptr vb_, uv_, ib_; std::shared_ptr samp_; RenderPipelineDesc renderPipelineDesc_; size_t textureUnit_ = 0; std::array pixels_; AHardwareBuffer* hwBuffer_; }; using NativeHWBufferTextureTestOpenGL3 = NativeHWBufferTextureTest; TEST_F(NativeHWBufferTextureTestOpenGL3, SharedMemoryTexture) { Result outResult; auto platformDevice = iglDev_->getPlatformDevice(); auto texture = platformDevice->createTextureWithSharedMemory(hwBuffer_, &outResult); EXPECT_EQ(outResult.isOk(), true); EXPECT_NE(texture.get(), nullptr); util::validateUploadedTexture( *iglDev_, *cmdQueue_, texture, pixels_.data(), "HWBufferTextureOpenGL3"); } using NativeHWBufferTextureTestVulkan = NativeHWBufferTextureTest; TEST_F(NativeHWBufferTextureTestVulkan, SharedMemoryTexture) { Result outResult; auto platformDevice = iglDev_->getPlatformDevice(); auto texture = platformDevice->createTextureWithSharedMemory(hwBuffer_, &outResult); EXPECT_EQ(outResult.isOk(), true); EXPECT_NE(texture.get(), nullptr); util::validateUploadedTexture( *iglDev_, *cmdQueue_, texture, pixels_.data(), "HWBufferTextureVulkan"); } } // namespace igl::tests #endif // defined(IGL_ANDROID_HWBUFFER_SUPPORTED) ================================================ FILE: src/igl/tests/data/ShaderData.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include // For size_t/ #include #include #if IGL_BACKEND_OPENGL #include #endif // IGL_BACKEND_OPENGL namespace igl::tests::data::shader { //----------------------------------------------------------------------------- // Defines names of inputs and functions for the shaders in this file //----------------------------------------------------------------------------- constexpr std::string_view kShaderFunc = "main"; // For OGL and VK constexpr std::string_view kSimpleVertFunc = "vertexShader"; constexpr std::string_view kSimpleFragFunc = "fragmentShader"; constexpr std::string_view kSimplePos = "position_in"; constexpr size_t kSimplePosIndex = 0; constexpr std::string_view kSimpleUv = "uv_in"; constexpr size_t kSimpleUvIndex = 1; constexpr std::string_view kSimpleSampler = "inputImage"; constexpr std::string_view kSimpleCubeView = "view"; constexpr std::string_view kSimpleComputeFunc = "doubleKernel"; constexpr std::string_view kSimpleComputeInput = "floatsIn"; constexpr std::string_view kSimpleComputeOutput = "floatsOut"; constexpr size_t kSimpleComputeInputIndex = 0; constexpr size_t kSimpleComputeOutputIndex = 1; // clang-format off //----------------------------------------------------------------------------- // OGL Shaders //----------------------------------------------------------------------------- #if IGL_BACKEND_OPENGL && IGL_OPENGL_ES #define PROLOG precision mediump float; #else #define PROLOG #endif #define HASH_LIT # #define HASH() HASH_LIT #define VERSION(ver) HASH()version ver\n #define REQUIRE_EXTENSION(ext) HASH()extension ext : require\n #if IGL_BACKEND_OPENGL && !IGL_OPENGL_ES #if IGL_PLATFORM_APPLE #define LEGACY_VERSION VERSION(100) precision mediump float; #else #define LEGACY_VERSION #endif #else #define LEGACY_VERSION #endif // Simple OGL Vertex shader constexpr std::string_view kOglSimpleVertShader = IGL_TO_STRING(LEGACY_VERSION attribute vec4 position_in; attribute vec2 uv_in; varying vec2 uv; void main() { gl_Position = position_in; gl_PointSize = 1.0; // Testing GL_POINTS draw primitive in Windows environment requires this. // See https://github.com/khronosgroup/webgl/issues/2818 uv = uv_in; }); // Simple OGL Fragment shader constexpr std::string_view kOglSimpleFragShader = IGL_TO_STRING(LEGACY_VERSION PROLOG uniform sampler2D inputImage; varying vec2 uv; void main() { gl_FragColor = texture2D(inputImage, uv); }); constexpr std::string_view kOglSimpleVertShaderEs3 = IGL_TO_STRING(VERSION(300 es) in vec4 position_in; in vec2 uv_in; out vec2 uv; void main() { gl_Position = position_in; gl_PointSize = 1.0; // Testing GL_POINTS draw primitive in Windows environment requires this. // See https://github.com/khronosgroup/webgl/issues/2818 uv = uv_in; }); constexpr std::string_view kOglSimpleFragShaderEs3 = IGL_TO_STRING(VERSION(300 es) PROLOG uniform sampler2D inputImage; in vec2 uv; out vec4 fragColor; void main() { fragColor = texture(inputImage, uv); }); constexpr std::string_view kOglSimpleVertShaderMultiviewEs3 = IGL_TO_STRING(VERSION(300 es) REQUIRE_EXTENSION(GL_OVR_multiview2) layout(num_views = 2) in; in vec4 position_in; out vec4 color; uniform vec4 colors[2]; void main() { gl_Position = position_in; color = colors[gl_ViewID_OVR]; }); constexpr std::string_view kOglSimpleFragShaderMultiviewEs3 = IGL_TO_STRING(VERSION(300 es) PROLOG in vec4 color; out vec4 fragColor; void main() { fragColor = color; }); constexpr std::string_view kOglSimpleVertShaderTexArray = IGL_TO_STRING(VERSION(150) in vec4 position_in; in vec2 uv_in; out vec2 uv; flat out uint layer_out; uniform int layer; void main() { gl_Position = position_in; uv = uv_in; layer_out = uint(layer); }); constexpr std::string_view kOglSimpleFragShaderTexArray = IGL_TO_STRING(VERSION(150) PROLOG in vec2 uv; flat in uint layer_out; uniform sampler2DArray inputImage; out vec4 fragColor; void main() { fragColor = texture(inputImage, vec3(uv, layer_out)); }); constexpr std::string_view kOglSimpleVertShaderTexArrayExt = IGL_TO_STRING(VERSION(110) attribute vec4 position_in; attribute vec2 uv_in; uniform int layer; varying vec2 uv; varying float layer_out; void main() { gl_Position = position_in; uv = uv_in; layer_out = float(layer); }); constexpr std::string_view kOglSimpleFragShaderTexArrayExt = IGL_TO_STRING(VERSION(110) REQUIRE_EXTENSION(GL_EXT_texture_array) PROLOG varying vec2 uv; varying float layer_out; uniform sampler2DArray inputImage; void main() { gl_FragColor = texture2DArray(inputImage, vec3(uv, layer_out)); }); constexpr std::string_view kOglSimpleVertShaderTexArrayEs3 = IGL_TO_STRING(VERSION(300 es) in vec4 position_in; in vec2 uv_in; out vec2 uv_vs; flat out uint layer_vs; uniform int layer; void main() { gl_Position = position_in; uv_vs = uv_in; layer_vs = uint(layer); }); constexpr std::string_view kOglSimpleFragShaderTexArrayEs3 = IGL_TO_STRING(VERSION(300 es) PROLOG in vec2 uv_vs; flat in uint layer_vs; uniform mediump sampler2DArray inputImage; out vec4 fragColor; void main() { fragColor = texture(inputImage, vec3(uv_vs, layer_vs)); }); // Simple OGL Vertex shader for textureCube and texture3D constexpr std::string_view kOglSimpleVertShaderCube = IGL_TO_STRING(LEGACY_VERSION attribute vec4 position_in; uniform vec4 view; varying vec3 uv; void main() { gl_Position = position_in; uv = view.xyz; }); // Simple OGL Fragment shader constexpr std::string_view kOglSimpleFragShaderCube = IGL_TO_STRING(LEGACY_VERSION PROLOG uniform samplerCube inputImage; varying vec3 uv; void main() { gl_FragColor = textureCube(inputImage, uv); }); // Simple shader which multiplies each float value in the input buffer by 2 and writes the result to the output buffer constexpr std::string_view kOglSimpleComputeShader = IGL_TO_STRING(VERSION(310 es) precision highp float; layout (local_size_x = 6, local_size_y = 1, local_size_z = 1) in; layout (std430, binding = 0) readonly buffer floatsIn { float fIn[]; }; layout (std430, binding = 1) writeonly buffer floatsOut { float fOut[]; }; void main() { uint id = gl_LocalInvocationIndex; fOut[id] = fIn[id] * 2.0f; }); constexpr std::string_view kOglSimpleVertShaderUniformBlocks = IGL_TO_STRING(VERSION(300 es) in vec4 position_in; out vec3 uv; layout (std140) uniform block_without_instance_name { float scale; }; layout (std140) uniform block_with_instance_name { vec3 view; vec4 testArray[2]; } matrices; uniform bool non_uniform_block_bool; void main() { gl_Position = non_uniform_block_bool ? position_in * scale : position_in; uv = matrices.view; }); constexpr std::string_view kOglSimpleFragShaderUniformBlocks = IGL_TO_STRING(VERSION(300 es) PROLOG uniform sampler2D inputImage; in vec3 uv; out vec4 fragColor; void main() { fragColor = texture(inputImage, uv.xy); }); //----------------------------------------------------------------------------- // Metal Shaders //----------------------------------------------------------------------------- // Simple Metal Shader // The vertext function expects vertex and sampler positions to be bound to // separate buffers #define MTL_SIMPLE_SHADER_DEF(returnType, swizzle) \ IGL_TO_STRING(using namespace metal; \ \ typedef struct { float3 color; } UniformBlock; \ \ typedef struct { \ float4 position [[position]]; \ float pointSize [[point_size]]; \ float2 uv; \ } VertexOut; \ \ vertex VertexOut vertexShader(uint vid [[vertex_id]], \ constant float4* position_in [[buffer(0)]], \ constant float2* uv_in [[buffer(1)]]) { \ VertexOut out; \ out.position = position_in[vid]; \ out.pointSize = 1; \ out.uv = uv_in[vid]; \ return out; \ } \ \ fragment returnType fragmentShader(VertexOut IN [[stage_in]], \ texture2d diffuseTex [[texture(0)]], \ sampler linearSampler [[sampler(0)]]) { \ float4 tex = diffuseTex.sample(linearSampler, IN.uv); \ returnType ret = returnType(tex.swizzle); \ return ret; \ }); \ constexpr std::string_view kMtlSimpleShaderFloat = MTL_SIMPLE_SHADER_DEF(float, r); constexpr std::string_view kMtlSimpleShaderFloat2 = MTL_SIMPLE_SHADER_DEF(float2, rg); constexpr std::string_view kMtlSimpleShaderFloat3 = MTL_SIMPLE_SHADER_DEF(float3, rgb); constexpr std::string_view kMtlSimpleShaderFloat4 = MTL_SIMPLE_SHADER_DEF(float4, rgba); constexpr std::string_view kMtlSimpleShaderUshort = MTL_SIMPLE_SHADER_DEF(ushort, r); constexpr std::string_view kMtlSimpleShaderUshort2 = MTL_SIMPLE_SHADER_DEF(ushort2, rg); constexpr std::string_view kMtlSimpleShaderUshort4 = MTL_SIMPLE_SHADER_DEF(ushort4, rgba); constexpr std::string_view kMtlSimpleShaderUint4 = MTL_SIMPLE_SHADER_DEF(uint4, rgba); constexpr std::string_view kMtlSimpleShaderUint = MTL_SIMPLE_SHADER_DEF(uint4, r); constexpr std::string_view kMtlSimpleShader = MTL_SIMPLE_SHADER_DEF(float4, rgba); // Simple Metal Shader for 1D Texture // The vertext function expects vertex and sampler positions to be bound to // separate buffers constexpr std::string_view kMtlSimpleShader1dtex = IGL_TO_STRING(using namespace metal; typedef struct { float3 color; } UniformBlock; typedef struct { float4 position [[position]]; float2 uv; } VertexOut; vertex VertexOut vertexShader(uint vid [[vertex_id]], constant float4* position_in [[buffer(0)]], constant float2* uv_in [[buffer(1)]]) { VertexOut out; out.position = position_in[vid]; out.uv = uv_in[vid]; return out; } fragment float4 fragmentShader(VertexOut IN [[stage_in]], texture1d diffuseTex [[texture(0)]], sampler linearSampler [[sampler(0)]]) { float4 tex = diffuseTex.sample(linearSampler, IN.uv.x); return tex; }); // Simple Metal Shader // The vertext function expects vertex and sampler positions to be bound to // separate buffers constexpr std::string_view kMtlSimpleShaderCube = IGL_TO_STRING(using namespace metal; typedef struct { // float3 color; float4 view; } UniformBlock; typedef struct { float4 position [[position]]; float3 uv; } VertexOut; vertex VertexOut vertexShader(uint vid [[vertex_id]], constant UniformBlock& uniforms [[buffer(1)]], constant float4* position_in [[buffer(0)]], constant float3* uv_in [[buffer(2)]]) { VertexOut out; out.position = position_in[vid]; out.uv = uniforms.view.xyz; return out; } fragment float4 fragmentShader(VertexOut IN [[stage_in]], texturecube diffuseTex [[texture(0)]], sampler linearSampler [[sampler(0)]]) { float4 tex = diffuseTex.sample(linearSampler, IN.uv); return tex; }); // Simple shader which multiplies each float value in the input buffer by 2 and writes the result to the output buffer constexpr std::string_view kMtlSimpleComputeShader = IGL_TO_STRING(using namespace metal; kernel void doubleKernel( device float* floatsIn [[buffer(0)]], device float* floatsOut [[buffer(1)]], uint2 gid [[thread_position_in_grid]]) { floatsOut[gid.x] = floatsIn[gid.x] * 2.0; }); constexpr std::string_view kMtlSimpleShaderTxt1dArray = IGL_TO_STRING(using namespace metal; typedef struct { int layer; } UniformBlock; typedef struct { float4 position [[position]]; float2 uv; uint layer; } VertexOut; vertex VertexOut vertexShader(uint vid [[vertex_id]], constant UniformBlock& uniforms [[buffer(2)]], constant float4* position_in [[buffer(0)]], constant float2* uv_in [[buffer(1)]]) { VertexOut out; out.position = position_in[vid]; out.uv = uv_in[vid]; out.layer = uniforms.layer; return out; } fragment float4 fragmentShader(VertexOut IN [[stage_in]], texture1d_array diffuseTex [[texture(0)]], sampler linearSampler [[sampler(0)]]) { float4 tex = diffuseTex.sample(linearSampler, IN.uv.x, IN.layer); return tex; }); constexpr std::string_view kMtlSimpleShaderTxt2dArray = IGL_TO_STRING(using namespace metal; typedef struct { int layer; } UniformBlock; typedef struct { float4 position [[position]]; float2 uv; uint layer; } VertexOut; vertex VertexOut vertexShader(uint vid [[vertex_id]], constant UniformBlock& uniforms [[buffer(2)]], constant float4* position_in [[buffer(0)]], constant float2* uv_in [[buffer(1)]]) { VertexOut out; out.position = position_in[vid]; out.uv = uv_in[vid]; out.layer = uniforms.layer; return out; } fragment float4 fragmentShader(VertexOut IN [[stage_in]], texture2d_array diffuseTex [[texture(0)]], sampler linearSampler [[sampler(0)]]) { float4 tex = diffuseTex.sample(linearSampler, IN.uv, IN.layer); return tex; }); //----------------------------------------------------------------------------- // Vulkan Shaders //----------------------------------------------------------------------------- // Simple Vulkan Vertex shader constexpr std::string_view kVulkanSimpleVertShader = IGL_TO_STRING( layout (location=0) in vec4 position_in; layout (location=1) in vec2 uv_in; layout (location=0) out vec2 uv; void main() { gl_Position = position_in; gl_PointSize = 1.0; // Testing VK_PRIMITIVE_TOPOLOGY_POINT_LIST drawing requires this uv = uv_in; }); // Simple Vulkan Fragment shader #define VULKAN_SIMPLE_FRAG_SHADER_DEF(returnType, swizzle) \ IGL_TO_STRING( \ layout (location=0) in vec2 uv; \ layout (location=0) out returnType out_FragColor; \ \ layout (set = 0, binding = 0) uniform sampler2D uTex; \ \ void main() { \ vec4 tex = texture(uTex, uv); \ out_FragColor = returnType(tex.swizzle); \ }); constexpr std::string_view kVulkanSimpleFragShader = VULKAN_SIMPLE_FRAG_SHADER_DEF(vec4, rgba); constexpr std::string_view kVulkanSimpleFragShaderFloat = VULKAN_SIMPLE_FRAG_SHADER_DEF(float, r); constexpr std::string_view kVulkanSimpleFragShaderFloat2 = VULKAN_SIMPLE_FRAG_SHADER_DEF(vec2, rg); constexpr std::string_view kVulkanSimpleFragShaderFloat3 = VULKAN_SIMPLE_FRAG_SHADER_DEF(vec3, rgb); constexpr std::string_view kVulkanSimpleFragShaderFloat4 = VULKAN_SIMPLE_FRAG_SHADER_DEF(vec4, rgba); constexpr std::string_view kVulkanSimpleFragShaderUint = VULKAN_SIMPLE_FRAG_SHADER_DEF(uint, r); constexpr std::string_view kVulkanSimpleFragShaderUint2 = VULKAN_SIMPLE_FRAG_SHADER_DEF(uvec2, rg); constexpr std::string_view kVulkanSimpleFragShaderUint4 = VULKAN_SIMPLE_FRAG_SHADER_DEF(uvec4, rgba); constexpr std::string_view kVulkanPushConstantVertShader = IGL_TO_STRING( layout (location=0) in vec4 position_in; layout (location=1) in vec2 uv_in; layout (location=0) out vec2 uv; void main() { gl_Position = position_in; gl_PointSize = 1.0; uv = uv_in; }); constexpr std::string_view kVulkanPushConstantFragShader = IGL_TO_STRING( layout (location=0) in vec2 uv; layout (location=0) out vec4 out_FragColor; layout (set = 0, binding = 0) uniform sampler2D uTex; layout (push_constant) uniform PushConstants { vec4 colorMultiplier; } pushConstants; void main() { vec4 tex = texture(uTex, uv); out_FragColor = tex * pushConstants.colorMultiplier; }); // D3D12 HLSL push constant shaders constexpr const char* kD3D12PushConstantVertShader = R"( struct VSIn { float4 position_in : POSITION; float2 uv_in : TEXCOORD0; }; struct PSIn { float4 position : SV_POSITION; float2 uv : TEXCOORD0; }; PSIn main(VSIn i) { PSIn o; o.position = i.position_in; o.uv = i.uv_in; return o; } )"; constexpr const char* kD3D12PushConstantFragShader = R"( Texture2D inputImage : register(t0); SamplerState samp0 : register(s0); cbuffer PushConstants : register(b2) { float4 colorMultiplier; }; struct PSIn { float4 position : SV_POSITION; float2 uv : TEXCOORD0; }; float4 main(PSIn i) : SV_TARGET { float4 tex = inputImage.Sample(samp0, i.uv); return tex * colorMultiplier; } )"; constexpr std::string_view kVulkanSimpleVertShaderTex2dArray = IGL_TO_STRING( layout(location = 0) in vec4 position_in; layout(location = 1) in vec2 uv_in; layout(location = 0) out vec2 uv_out; layout(location = 1) out uint layer_out; struct VertexUniforms { int layer; }; layout(set = 1, binding = 2, std140) uniform PerFrame { VertexUniforms perFrame; }; void main() { gl_Position = position_in; uv_out = uv_in; layer_out = perFrame.layer; }); constexpr std::string_view kVulkanSimpleFragShaderTex1darray = IGL_TO_STRING( layout(location = 0) in vec2 uv; layout(location = 1) in flat uint layer; layout(location = 0) out vec4 out_FragColor; layout (set = 0, binding = 0) uniform sampler1DArray uTex; void main() { out_FragColor = texture(uTex, vec2(uv.x, layer)); }); constexpr std::string_view kVulkanSimpleFragShaderTex2dArray = IGL_TO_STRING( layout(location = 0) in vec2 uv; layout(location = 1) in flat uint layer; layout(location = 0) out vec4 out_FragColor; layout (set = 0, binding = 0) uniform sampler2DArray uTex; void main() { out_FragColor = texture(uTex, vec3(uv.xy, layer)); }); constexpr std::string_view kVulkanSimpleVertShaderCube = IGL_TO_STRING(layout(location = 0) in vec4 position_in; layout(location = 0) out vec3 view; struct VertexUniforms { vec4 view; }; layout(set = 1, binding = 1, std140) uniform PerFrame { VertexUniforms perFrame; }; void main() { gl_Position = position_in; view = perFrame.view.xyz; }); constexpr std::string_view kVulkanSimpleFragShaderCube = IGL_TO_STRING( layout(location = 0) in vec3 view; layout(location = 0) out vec4 out_FragColor; layout (set = 0, binding = 0) uniform samplerCube uTex; void main() { out_FragColor = texture(uTex, view); }); // Simple Vulkan Vertex shader for multiview constexpr std::string_view kVulkanSimpleVertShaderMultiview = IGL_TO_STRING(\n REQUIRE_EXTENSION(GL_EXT_multiview) layout (location = 0) in vec4 position_in; layout (location = 0) out vec4 color_out; layout(set = 1, binding = 1, std140) uniform PerFrame { vec4 colors[2]; }; void main() { gl_Position = position_in; color_out = colors[gl_ViewIndex]; }); // Simple Vulkan Fragment shader for multiview constexpr std::string_view kVulkanSimpleFragShaderMultiview = IGL_TO_STRING( layout (location = 0) in vec4 color_in; layout (location = 0) out vec4 out_FragColor; void main() { out_FragColor = color_in; }); constexpr std::string_view kVulkanSimpleComputeShader = IGL_TO_STRING( layout (local_size_x = 6, local_size_y = 1, local_size_z = 1) in; layout (std430, binding = 0, set = 1) readonly buffer floatsIn { float fIn[]; }; layout (std430, binding = 1, set = 1) writeonly buffer floatsOut { float fOut[]; }; void main() { uint id = gl_LocalInvocationIndex; fOut[id] = fIn[id] * 2.0f; }); // clang-format on //----------------------------------------------------------------------------- // D3D12/HLSL Shaders //----------------------------------------------------------------------------- // Simple D3D12 Shader with separate vertex and fragment functions // This is used for ShaderLibrary tests where multiple entry points are in the same source constexpr std::string_view kD3D12SimpleShader = IGL_TO_STRING( struct VSIn { float4 position_in : POSITION; float2 uv_in : TEXCOORD0; }; struct VSOut { float4 position : SV_POSITION; float2 uv : TEXCOORD0; }; VSOut vertexShader(VSIn input) { VSOut output; output.position = input.position_in; output.uv = input.uv_in; return output; } Texture2D inputImage : register(t0); SamplerState linearSampler : register(s0); float4 fragmentShader( VSOut input) : SV_TARGET { return inputImage.Sample(linearSampler, input.uv); }); // Simple D3D12 Vertex shader (standalone) constexpr std::string_view kD3D12SimpleVertShader = IGL_TO_STRING( struct VSIn { float4 position_in : POSITION; float2 uv_in : TEXCOORD0; }; struct VSOut { float4 position : SV_POSITION; float2 uv : TEXCOORD0; }; VSOut main(VSIn input) { VSOut output; output.position = input.position_in; output.uv = input.uv_in; return output; }); // Simple D3D12 Fragment shader (standalone) constexpr std::string_view kD3D12SimpleFragShader = IGL_TO_STRING( struct PSIn { float4 position : SV_POSITION; float2 uv : TEXCOORD0; }; Texture2D inputImage : register(t0); SamplerState linearSampler : register(s0); float4 main(PSIn input) : SV_TARGET { return inputImage.Sample(linearSampler, input.uv); }); // Simple D3D12 Compute shader constexpr std::string_view kD3D12SimpleComputeShader = IGL_TO_STRING(RWStructuredBuffer floatsIn : register(u0); RWStructuredBuffer floatsOut : register(u1); [numthreads(6, 1, 1)] void doubleKernel(uint3 threadID : SV_DispatchThreadID) { uint id = threadID.x; floatsOut[id] = floatsIn[id] * 2.0; }); // D3D12 Texture2DArray Vertex shader constexpr std::string_view kD3D12SimpleVertShaderTexArray = IGL_TO_STRING( cbuffer VertexUniforms : register(b2) { int layer; }; struct VSIn { float4 position_in : POSITION; float2 uv_in : TEXCOORD0; }; struct VSOut { float4 position : SV_POSITION; float2 uv : TEXCOORD0; nointerpolation uint layerOut : TEXCOORD1; }; VSOut main(VSIn input) { VSOut output; output.position = input.position_in; output.uv = input.uv_in; output.layerOut = layer; return output; }); // D3D12 Texture2DArray Fragment shader constexpr std::string_view kD3D12SimpleFragShaderTexArray = IGL_TO_STRING( Texture2DArray inputImage : register(t0); SamplerState inputSampler : register(s0); struct PSIn { float4 position : SV_POSITION; float2 uv : TEXCOORD0; nointerpolation uint layerIn : TEXCOORD1; }; float4 main(PSIn input) : SV_TARGET { return inputImage.Sample(inputSampler, float3(input.uv, input.layerIn)); } ); // D3D12 TextureCube Vertex shader constexpr std::string_view kD3D12SimpleVertShaderCube = IGL_TO_STRING( cbuffer VertexUniforms : register(b1) { float4 view; }; struct VSIn { float4 position_in : POSITION; float2 uv_in : TEXCOORD0; }; struct VSOut { float4 position : SV_POSITION; float3 viewDir : TEXCOORD0; }; VSOut main(VSIn input) { VSOut output; output.position = input.position_in; output.viewDir = view.xyz; return output; }); // D3D12 TextureCube Fragment shader constexpr std::string_view kD3D12SimpleFragShaderCube = IGL_TO_STRING( TextureCube inputImage : register(t0); SamplerState inputSampler : register(s0); struct PSIn { float4 position : SV_POSITION; float3 viewDir : TEXCOORD0; }; float4 main(PSIn input) : SV_TARGET { return inputImage.Sample(inputSampler, input.viewDir); } ); // D3D12 Texture2DArray Vertex shader constexpr std::string_view kD3D12SimpleVertShaderTex2dArray = IGL_TO_STRING( cbuffer VertexUniforms : register(b2) { int layer; }; struct VSIn { float4 position_in : POSITION; float2 uv_in : TEXCOORD0; }; struct VSOut { float4 position : SV_POSITION; float2 uv : TEXCOORD0; uint layer : TEXCOORD1; }; VSOut main(VSIn input) { VSOut output; output.position = input.position_in; output.uv = input.uv_in; output.layer = uint(layer); return output; }); // D3D12 Texture2DArray Fragment shader constexpr std::string_view kD3D12SimpleFragShaderTex2dArray = IGL_TO_STRING( Texture2DArray inputImage : register(t0); SamplerState inputSampler : register(s0); struct PSIn { float4 position : SV_POSITION; float2 uv : TEXCOORD0; uint layer : TEXCOORD1; }; float4 main(PSIn input) : SV_TARGET { return inputImage.Sample(inputSampler, float3(input.uv, input.layer)); } ); // clang-format on } // namespace igl::tests::data::shader ================================================ FILE: src/igl/tests/data/TextureData.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::tests::data::texture { // clang-format off constexpr std::array kTexRgba2x2 = {0x11223344, 0x11111111, 0x22222222, 0x33333333}; constexpr std::array kTexRgba2x2Modified = {0x11223344, 0x11111111, 0x22222222, 0x44332211}; constexpr std::array kTexRgbaGray2x2 = {0x80808080, 0x80808080, 0x80808080, 0x80808080}; constexpr std::array kTexRgbaClear2x2 = {0, 0, 0, 0}; constexpr std::array kTexRgbaGray4x4 = {0x888888FF, 0x888888FF, 0x888888FF, 0x888888FF, 0x888888FF, 0x888888FF, 0x888888FF, 0x888888FF, 0x888888FF, 0x888888FF, 0x888888FF, 0x888888FF, 0x888888FF, 0x888888FF, 0x888888FF, 0x888888FF}; // NOLINTNEXTLINE(readability-identifier-naming) constexpr std::array kTexRgbaRedAlpha128_4x4 = {0x80000080, 0x80000080, 0x80000080, 0x80000080, 0x80000080, 0x80000080, 0x80000080, 0x80000080, 0x80000080, 0x80000080, 0x80000080, 0x80000080, 0x80000080, 0x80000080, 0x80000080, 0x80000080}; // NOLINTNEXTLINE(readability-identifier-naming) constexpr std::array kTexRgbaBlueAlpha127_4x4 = {0x00007F7F, 0x00007F7F, 0x00007F7F, 0x00007F7F, 0x00007F7F, 0x00007F7F, 0x00007F7F, 0x00007F7F, 0x00007F7F, 0x00007F7F, 0x00007F7F, 0x00007F7F, 0x00007F7F, 0x00007F7F, 0x00007F7F, 0x00007F7F}; // NOLINTNEXTLINE(readability-identifier-naming) constexpr std::array kTexRgbaMisc1_4x4 = {0x00000000, 0x11111111, 0x22222222, 0x33333333, 0x44444444, 0x55555555, 0x66666666, 0x77777777, 0x88888888, 0x99999999, 0xAAAAAAAA, 0xBBBBBBBB, 0xCCCCCCCC, 0xDDDDDDDD, 0xEEEEEEEE, 0xFFFFFFFF}; constexpr std::array kTexRgbaGray5x5 = {0x80808080, 0x80808080, 0x80808080, 0x80808080, 0x80808080, 0x80808080, 0x80808080, 0x80808080, 0x80808080, 0x80808080, 0x80808080, 0x80808080, 0x80808080, 0x80808080, 0x80808080, 0x80808080, 0x80808080, 0x80808080, 0x80808080, 0x80808080, 0x80808080, 0x80808080, 0x80808080, 0x80808080, 0x80808080}; // clang-format on } // namespace igl::tests::data::texture ================================================ FILE: src/igl/tests/data/VertexIndexData.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include // For uint16_t namespace igl::tests::data::vertex_index { // clang-format off // Using float 4 to alleviate packing issues constexpr std::array kQuadVert = { -1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, -1.0f, -1.0f, 0.0f, 1.0f, 1.0f, -1.0f, 0.0f, 1.0f}; constexpr std::array kQuadUv = { 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, }; constexpr std::array kQuadInd = { 0, 1, 2, 1, 3, 2, }; // clang-format on } // namespace igl::tests::data::vertex_index ================================================ FILE: src/igl/tests/iglu/ManagedUniformBuffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" namespace igl::tests { // // ManagedUniformBufferTest // // Test fixture for all the tests in this file. Takes care of common // initialization and allocating of common resources. // class ManagedUniformBufferTest : public ::testing::Test { public: ManagedUniformBufferTest() = default; ~ManagedUniformBufferTest() override = default; // Set up common resources. This will create a device and a command queue void SetUp() override { // Turn off debug break so unit tests can run igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; }; TEST_F(ManagedUniformBufferTest, Construction) { iglu::ManagedUniformBuffer buffer(*iglDev_, {.index = 0, .length = 10}); EXPECT_TRUE(buffer.getData() != nullptr); } TEST_F(ManagedUniformBufferTest, UpdateData) { // Using LUT to update data { iglu::ManagedUniformBuffer buffer(*iglDev_, {.index = 0, .length = 10, .uniforms = {{.name = "myUniform", .location = 0, .type = UniformType::Float, .numElements = 1, .offset = 0, .elementStride = 0}}}); float data = 1000.0f; buffer.buildUniformLUT(); buffer.updateData("myUniform", &data, sizeof(float)); EXPECT_TRUE(*static_cast(buffer.getData()) == data); } // Not using LUT to update data { iglu::ManagedUniformBuffer buffer(*iglDev_, {.index = 0, .length = 10, .uniforms = {{.name = "myUniform", .location = 0, .type = UniformType::Float, .numElements = 1, .offset = 0, .elementStride = 0}}}); float data = 1000.0f; buffer.updateData("myUniform", &data, sizeof(float)); EXPECT_TRUE(*static_cast(buffer.getData()) == data); } // Capped data size { iglu::ManagedUniformBuffer buffer(*iglDev_, {.index = 0, .length = 10, .uniforms = {{.name = "myUniform", .location = 0, .type = UniformType::Float, .numElements = 1, .offset = 0, .elementStride = 0}}}); float data[2] = {1000.0f, 1.0f}; buffer.updateData("myUniform", &data, 2 * sizeof(float)); EXPECT_TRUE(*static_cast(buffer.getData()) == data[0]); } // Wrong index { iglu::ManagedUniformBuffer buffer(*iglDev_, {.index = 0, .length = 10, .uniforms = {{.name = "nonExistingUniform", .location = -1, .type = UniformType::Float, .numElements = 1, .offset = 0, .elementStride = 0}}}); float data = 1000.0f; EXPECT_FALSE(buffer.updateData("myUniform", &data, sizeof(float))); } } TEST_F(ManagedUniformBufferTest, GetUniformDataSize) { iglu::ManagedUniformBuffer buffer(*iglDev_, {.index = 0, .length = 10, .uniforms = {{.name = "myUniform", .location = 0, .type = UniformType::Float, .numElements = 1, .offset = 0, .elementStride = 0}}}); EXPECT_EQ(buffer.getUniformDataSize("myUniform"), sizeof(float)); EXPECT_EQ(buffer.getUniformDataSize("nonExistingUniform"), 0); } } // namespace igl::tests ================================================ FILE: src/igl/tests/iglu/ShaderCrossTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include namespace igl::tests { namespace { [[nodiscard]] const char* getVulkanFragmentShaderSource() { return R"(#version 450 precision highp float; precision highp sampler2D; layout(location = 0) in vec3 uvw; layout(location = 1) in vec3 color; layout(set = 0, binding = 0) uniform sampler2D inputImage; layout(location = 0) out vec4 fragmentColor; void main() { fragmentColor = texture(inputImage, uvw.xy) * vec4(color, 1.0); })"; } [[nodiscard]] std::string getVertexShaderProlog(bool stereoRendering) { return stereoRendering ? R"(#version 450 #extension GL_OVR_multiview2 : require layout(num_views = 2) in; precision highp float; #define VIEW_ID int(gl_ViewID_OVR) )" : R"(#version 450 precision highp float; #define VIEW_ID perFrame.viewId )"; } [[nodiscard]] std::string getVulkanVertexShaderSource(bool stereoRendering) { return getVertexShaderProlog(stereoRendering) + R"( layout (set = 1, binding = 1, std140) uniform PerFrame { mat4 modelMatrix; mat4 viewProjectionMatrix[2]; float scaleZ; int viewId; } perFrame; layout(location = 0) in vec3 position; layout(location = 1) in vec3 uvw_in; layout(location = 0) out vec3 uvw; layout(location = 1) out vec3 color; void main() { mat4 mvpMatrix = perFrame.viewProjectionMatrix[VIEW_ID] * perFrame.modelMatrix; gl_Position = mvpMatrix * vec4(position, 1.0); uvw = vec3(uvw_in.x, uvw_in.y, (uvw_in.z - 0.5) * perFrame.scaleZ + 0.5); color = vec3(1.0, 1.0, 0.0); })"; } } // namespace class ShaderCrossTest : public ::testing::Test { public: ShaderCrossTest() = default; ~ShaderCrossTest() override = default; // Set up common resources. This will create a device and a command queue void SetUp() override { // Turn off debug break so unit tests can run igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; }; TEST_F(ShaderCrossTest, Construction) { const iglu::ShaderCross shaderCross(*iglDev_); } TEST_F(ShaderCrossTest, EntryPointName) { const iglu::ShaderCross shaderCross(*iglDev_); if (iglDev_->getBackendType() == igl::BackendType::Metal) { EXPECT_EQ(shaderCross.entryPointName(igl::ShaderStage::Vertex), "main0"); } else if (iglDev_->getBackendType() == igl::BackendType::OpenGL) { EXPECT_EQ(shaderCross.entryPointName(igl::ShaderStage::Vertex), "main"); } else { EXPECT_EQ(shaderCross.entryPointName(igl::ShaderStage::Vertex), ""); } } TEST_F(ShaderCrossTest, CrossCompile) { const iglu::ShaderCross shaderCross(*iglDev_); Result res; if (iglDev_->getBackendType() == igl::BackendType::Metal) { const auto vs = shaderCross.crossCompileFromVulkanSource( getVulkanVertexShaderSource(false).c_str(), igl::ShaderStage::Vertex, &res); EXPECT_TRUE(res.isOk()); EXPECT_TRUE(!vs.empty()); const auto fs = shaderCross.crossCompileFromVulkanSource( getVulkanFragmentShaderSource(), igl::ShaderStage::Fragment, &res); EXPECT_TRUE(res.isOk()); EXPECT_TRUE(!fs.empty()); } else if (iglDev_->getBackendType() == igl::BackendType::OpenGL) { const auto vs = shaderCross.crossCompileFromVulkanSource( getVulkanVertexShaderSource(true).c_str(), igl::ShaderStage::Vertex, &res); EXPECT_TRUE(res.isOk()); EXPECT_TRUE(!vs.empty()); const auto fs = shaderCross.crossCompileFromVulkanSource( getVulkanFragmentShaderSource(), igl::ShaderStage::Fragment, &res); EXPECT_TRUE(res.isOk()); EXPECT_TRUE(!fs.empty()); } } TEST_F(ShaderCrossTest, ShaderCrossUniformBuffer) { iglu::ShaderCrossUniformBuffer buffer(*iglDev_, "perFrame", {.index = 0, .length = 10, .uniforms = {{.name = "myUniform", .location = 0, .type = UniformType::Float, .numElements = 1, .offset = 0, .elementStride = 0}}}); EXPECT_EQ(buffer.uniformInfo.uniforms.size(), 1); EXPECT_EQ(buffer.uniformInfo.uniforms[0].name, "perFrame.myUniform"); } } // namespace igl::tests ================================================ FILE: src/igl/tests/iglu/ShaderUniformsTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" namespace igl::tests { namespace { class TestRenderPipelineReflection final : public IRenderPipelineReflection { public: [[nodiscard]] const std::vector& allUniformBuffers() const override { return bufferArguments_; } [[nodiscard]] const std::vector& allSamplers() const override { return samplerArguments_; } [[nodiscard]] const std::vector& allTextures() const override { return textureArguments_; } TestRenderPipelineReflection(std::vector bufferArguments, std::vector samplerArguments, std::vector textureArguments) : bufferArguments_(std::move(bufferArguments)), samplerArguments_(std::move(samplerArguments)), textureArguments_(std::move(textureArguments)) {} ~TestRenderPipelineReflection() override = default; private: std::vector bufferArguments_; std::vector samplerArguments_; std::vector textureArguments_; }; } // namespace class ShaderUniformsTest : public ::testing::Test { public: ShaderUniformsTest() = default; ~ShaderUniformsTest() override = default; // Set up common resources. This will create a device and a command queue void SetUp() override { // Turn off debug break so unit tests can run igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; }; TEST_F(ShaderUniformsTest, SettersCoverage) { TestRenderPipelineReflection reflection{ std::vector{}, std::vector{}, std::vector{}, }; iglu::material::ShaderUniforms shaderUniforms(*iglDev_, reflection); NameHandle testName; bool boolValue = true; shaderUniforms.setBool(testName, boolValue); shaderUniforms.setBool(testName, testName, testName, boolValue); shaderUniforms.setBoolArray(testName, &boolValue, 1); shaderUniforms.setBoolArray(testName, testName, testName, &boolValue, 1); iglu::simdtypes::float1 floatValue = 1.0f; shaderUniforms.setFloat(testName, floatValue); shaderUniforms.setFloat(testName, testName, testName, floatValue); shaderUniforms.setFloatArray(testName, &floatValue, 1); shaderUniforms.setFloatArray(testName, testName, testName, &floatValue, 1); iglu::simdtypes::float2 float2Value = {1.0f, 2.0f}; shaderUniforms.setFloat2(testName, float2Value); shaderUniforms.setFloat2(testName, testName, testName, float2Value); shaderUniforms.setFloat2Array(testName, &float2Value, 1); shaderUniforms.setFloat2Array(testName, testName, testName, &float2Value, 1); iglu::simdtypes::float3 float3Value = {1.0f, 2.0f, 3.0f}; shaderUniforms.setFloat3(testName, float3Value); shaderUniforms.setFloat3Array(testName, &float3Value, 1); iglu::simdtypes::float4 float4Value = {1.0f, 2.0f, 3.0f, 4.0f}; shaderUniforms.setFloat4(testName, float4Value); shaderUniforms.setFloat4(testName, testName, testName, float4Value); shaderUniforms.setFloat4Array(testName, &float4Value, 1); shaderUniforms.setFloat4Array(testName, testName, testName, &float4Value, 1); iglu::simdtypes::int1 intValue = 1; shaderUniforms.setInt(testName, intValue); shaderUniforms.setInt(testName, testName, testName, intValue); shaderUniforms.setIntArray(testName, &intValue, 1); shaderUniforms.setIntArray(testName, testName, testName, &intValue, 1); iglu::simdtypes::int2 int2Value = {1, 2}; shaderUniforms.setInt2(testName, int2Value); shaderUniforms.setInt2(testName, testName, testName, int2Value); iglu::simdtypes::float2x2 float2x2Value = {float2Value, float2Value}; shaderUniforms.setFloat2x2(testName, float2x2Value); shaderUniforms.setFloat2x2(testName, testName, testName, float2x2Value); shaderUniforms.setFloat2x2Array(testName, &float2x2Value, 1); shaderUniforms.setFloat2x2Array(testName, testName, testName, &float2x2Value, 1); iglu::simdtypes::float3x3 float3x3Value = {float3Value, float3Value, float3Value}; shaderUniforms.setFloat3x3(testName, float3x3Value); shaderUniforms.setFloat3x3(testName, testName, testName, float3x3Value); shaderUniforms.setFloat3x3Array(testName, &float3x3Value, 1); shaderUniforms.setFloat3x3Array(testName, testName, testName, &float3x3Value, 1); iglu::simdtypes::float4x4 float4x4Value = {float4Value, float4Value, float4Value, float4Value}; shaderUniforms.setFloat4x4(testName, float4x4Value); shaderUniforms.setFloat4x4(testName, testName, testName, float4x4Value); shaderUniforms.setFloat4x4Array(testName, &float4x4Value, 1); shaderUniforms.setFloat4x4Array(testName, testName, testName, &float4x4Value, 1); std::shared_ptr texture; std::shared_ptr sampler; shaderUniforms.setTexture("test", texture, sampler); shaderUniforms.setTexture("test", nullptr, sampler); shaderUniforms.setTexture("test", nullptr, nullptr); } } // namespace igl::tests ================================================ FILE: src/igl/tests/iglu/StatePool.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../data/ShaderData.h" #include "../util/Common.h" #include #include #include #include #include namespace igl::tests { // // StatePoolTest // // Test fixture for all the tests in this file. Takes care of common // initialization and allocating of common resources. // class StatePoolTest : public ::testing::Test { private: public: StatePoolTest() = default; ~StatePoolTest() override = default; // // SetUp() // // This function sets up two identical graphics pipeline descriptors // so that they can be modified by individual tests to exercise the // state pool caching capabilities // void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_TRUE(iglDev_ != nullptr); ASSERT_TRUE(cmdQueue_ != nullptr); Result ret; // Initialize shader stages std::unique_ptr stages; igl::tests::util::createSimpleShaderStages(iglDev_, stages); shaderStages_ = std::move(stages); // Initialize input to vertex shader VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Float4; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].location = 0; inputDesc.attributes[0].bufferIndex = data::shader::kSimplePosIndex; inputDesc.attributes[0].name = data::shader::kSimplePos; inputDesc.inputBindings[0].stride = sizeof(float) * 4; inputDesc.attributes[1].format = VertexAttributeFormat::Float2; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].location = 1; inputDesc.attributes[1].bufferIndex = data::shader::kSimpleUvIndex; inputDesc.attributes[1].name = data::shader::kSimpleUv; inputDesc.inputBindings[1].stride = sizeof(float) * 2; // numAttributes has to equal to bindings when using more than 1 buffer inputDesc.numAttributes = inputDesc.numInputBindings = 2; vertexInputState_ = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vertexInputState_ != nullptr); // Initialize Graphics Pipeline Descriptor, but leave the creation // to the individual tests in case further customization is required renderPipelineDesc1_.vertexInputState = vertexInputState_; renderPipelineDesc1_.shaderStages = shaderStages_; renderPipelineDesc1_.targetDesc.colorAttachments.resize(1); renderPipelineDesc1_.targetDesc.colorAttachments[0].textureFormat = TextureFormat::RGBA_UNorm8; renderPipelineDesc1_.fragmentUnitSamplerMap[0] = IGL_NAMEHANDLE(data::shader::kSimpleSampler); renderPipelineDesc1_.cullMode = igl::CullMode::Disabled; renderPipelineDesc2_.vertexInputState = vertexInputState_; renderPipelineDesc2_.shaderStages = shaderStages_; renderPipelineDesc2_.targetDesc.colorAttachments.resize(1); renderPipelineDesc2_.targetDesc.colorAttachments[0].textureFormat = TextureFormat::RGBA_UNorm8; renderPipelineDesc2_.fragmentUnitSamplerMap[0] = IGL_NAMEHANDLE(data::shader::kSimpleSampler); renderPipelineDesc2_.cullMode = igl::CullMode::Disabled; renderPipelineDesc3_.vertexInputState = vertexInputState_; renderPipelineDesc3_.shaderStages = shaderStages_; renderPipelineDesc3_.targetDesc.colorAttachments.resize(1); renderPipelineDesc3_.targetDesc.colorAttachments[0].textureFormat = TextureFormat::RGBA_UNorm8; renderPipelineDesc3_.fragmentUnitSamplerMap[0] = IGL_NAMEHANDLE(data::shader::kSimpleSampler); renderPipelineDesc3_.cullMode = igl::CullMode::Disabled; } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; std::shared_ptr cmdBuf_; CommandBufferDesc cbDesc_ = {}; std::shared_ptr shaderStages_; std::shared_ptr vertexInputState_; RenderPipelineDesc renderPipelineDesc1_, renderPipelineDesc2_, renderPipelineDesc3_; iglu::state_pool::RenderPipelineStatePool graphicsPool_; }; // // renderPipelineDescCaching1 Test // // Tests to see if RenderPipelineDesc caching works // TEST_F(StatePoolTest, renderPipelineDescCaching1) { Result ret; std::shared_ptr ps1, ps2; //--------------------------------------------------------------------- // Create two pipelines without cache. Should get two different objects //--------------------------------------------------------------------- ps1 = iglDev_->createRenderPipeline(renderPipelineDesc1_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(ps1 != nullptr); ps2 = iglDev_->createRenderPipeline(renderPipelineDesc2_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(ps2 != nullptr); ASSERT_TRUE(ps1.get() != ps2.get()); //------------------------------------------------------------ // Create two pipelines with cache. Should get the same object //------------------------------------------------------------ ps1 = graphicsPool_.getOrCreate(*iglDev_, renderPipelineDesc1_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(ps1 != nullptr); ps2 = graphicsPool_.getOrCreate(*iglDev_, renderPipelineDesc2_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(ps2 != nullptr); ASSERT_TRUE(ps1 == ps2); //------------------------------------------------------------ // Modify one of the descriptors, should get different objects //------------------------------------------------------------ renderPipelineDesc2_.cullMode = igl::CullMode::Front; ps2 = graphicsPool_.getOrCreate(*iglDev_, renderPipelineDesc2_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(ps2 != nullptr); ASSERT_TRUE(ps1 != ps2); renderPipelineDesc2_.cullMode = renderPipelineDesc1_.cullMode; // restore change } // // renderPipelineDescCachingLRU1 Test // // Tests to see if RenderPipelineDesc LRU caching works // TEST_F(StatePoolTest, renderPipelineDescCachingLRU1) { Result ret; std::shared_ptr ps1, ps2, ps3; //------------------------------------------------------------ // Ensure cache releases objects after it gets full //------------------------------------------------------------ iglu::state_pool::RenderPipelineStatePool smallCachePool; smallCachePool.setCacheSize(2); renderPipelineDesc2_.cullMode = igl::CullMode::Front; renderPipelineDesc3_.cullMode = igl::CullMode::Back; // Fill up the cache ps1 = iglDev_->createRenderPipeline(renderPipelineDesc1_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(ps1 != nullptr); ps2 = iglDev_->createRenderPipeline(renderPipelineDesc2_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(ps2 != nullptr); // Add new element (PS1 should no longer be stored in the cache) ps3 = iglDev_->createRenderPipeline(renderPipelineDesc3_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(ps3 != nullptr); // Adding renderPipelineDesc1_ again should produce a new state than before ps2 = iglDev_->createRenderPipeline(renderPipelineDesc1_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(ps2 != nullptr); ASSERT_TRUE(ps1 != ps2); renderPipelineDesc2_.cullMode = renderPipelineDesc1_.cullMode; // restore change renderPipelineDesc3_.cullMode = renderPipelineDesc1_.cullMode; // restore change } } // namespace igl::tests ================================================ FILE: src/igl/tests/iglu/TextureAccessor.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../data/TextureData.h" #include "../util/Common.h" #include #include #include #define OFFSCREEN_TEX_HEIGHT 2 #define OFFSCREEN_TEX_WIDTH 2 namespace igl::tests { // // TextureAccessorTest // // Test fixture for all the tests in this file. Takes care of common // initialization and allocating of common resources. // class TextureAccessorTest : public ::testing::Test { private: public: TextureAccessorTest() = default; ~TextureAccessorTest() override = default; // // SetUp() // Create device, commandQueue // void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_TRUE(iglDev_ != nullptr); ASSERT_TRUE(cmdQueue_ != nullptr); Result result; texDesc_ = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); texture_ = iglDev_->createTexture(texDesc_, &result); ASSERT_TRUE(result.isOk()); // Initialize texture data textureSizeInBytes_ = texture_->getProperties().getBytesPerRange(texture_->getFullRange()); const auto range = igl::TextureRangeDesc::new2D(0, 0, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT); texture_->upload(range, data::texture::kTexRgba2x2.data()); } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; std::shared_ptr texture_; TextureDesc texDesc_; std::shared_ptr textureAccessor_; int textureSizeInBytes_{}; }; // // testRequestAndGetBytesSync Test // // Tests synchronous texture readback // TEST_F(TextureAccessorTest, testRequestAndGetBytesSync) { ASSERT_NO_THROW(textureAccessor_ = iglu::textureaccessor::TextureAccessorFactory::createTextureAccessor( iglDev_->getBackendType(), texture_, *iglDev_)); ASSERT_TRUE(textureAccessor_ != nullptr); // Verify requestStatus before ASSERT_EQ(textureAccessor_->getRequestStatus(), iglu::textureaccessor::RequestStatus::NotInitialized); // Update texture data const auto rangeDesc = TextureRangeDesc::new2D(0, 0, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT); texture_->upload(rangeDesc, data::texture::kTexRgba2x2.data()); auto bytes = textureAccessor_->requestAndGetBytesSync(*cmdQueue_); // Verify requestStatus after ASSERT_EQ(textureAccessor_->getRequestStatus(), iglu::textureaccessor::RequestStatus::Ready); // 2x2 texture * 4 bytes per pixel ASSERT_EQ(bytes.size(), 16); // Verify data auto* pixels = reinterpret_cast(bytes.data()); for (int i = 0; (i < textureSizeInBytes_ / 4); i++) { ASSERT_EQ(pixels[i], data::texture::kTexRgba2x2[i]); } } TEST_F(TextureAccessorTest, reuseTextureAccessor) { ASSERT_NO_THROW(textureAccessor_ = iglu::textureaccessor::TextureAccessorFactory::createTextureAccessor( iglDev_->getBackendType(), texture_, *iglDev_)); ASSERT_TRUE(textureAccessor_ != nullptr); // Verify requestStatus before ASSERT_EQ(textureAccessor_->getRequestStatus(), iglu::textureaccessor::RequestStatus::NotInitialized); // First Upload { // Update texture data const auto rangeDesc = TextureRangeDesc::new2D(0, 0, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT); texture_->upload(rangeDesc, data::texture::kTexRgba2x2.data()); auto bytes = textureAccessor_->requestAndGetBytesSync(*cmdQueue_); // Verify requestStatus after ASSERT_EQ(textureAccessor_->getRequestStatus(), iglu::textureaccessor::RequestStatus::Ready); // 2x2 texture * 4 bytes per pixel ASSERT_EQ(bytes.size(), 16); // Verify data auto* pixels = reinterpret_cast(bytes.data()); for (int i = 0; (i < textureSizeInBytes_ / 4); i++) { ASSERT_EQ(pixels[i], data::texture::kTexRgba2x2[i]); } } // Second Upload { // Update texture data const auto rangeDesc = TextureRangeDesc::new2D(0, 0, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT); texture_->upload(rangeDesc, data::texture::kTexRgbaGray2x2.data()); auto bytes = textureAccessor_->requestAndGetBytesSync(*cmdQueue_); // Verify requestStatus after ASSERT_EQ(textureAccessor_->getRequestStatus(), iglu::textureaccessor::RequestStatus::Ready); // 2x2 texture * 4 bytes per pixel ASSERT_EQ(bytes.size(), 16); // Verify data auto* pixels = reinterpret_cast(bytes.data()); for (int i = 0; (i < textureSizeInBytes_ / 4); i++) { ASSERT_EQ(pixels[i], data::texture::kTexRgbaGray2x2[i]); } } } } // namespace igl::tests ================================================ FILE: src/igl/tests/iglu/UniformCollection.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "UniformTests.h" #include #include #include #include namespace iglu::tests { // // UniformCollectionTest // // Test fixture for all the tests in this file. Takes care of common // initialization and allocating of common resources. // class UniformCollectionTest : public ::testing::Test { private: public: UniformCollectionTest() = default; ~UniformCollectionTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); } void TearDown() override {} }; // ---------------------------------------------------------------------------- // // Value Test // TEST_F(UniformCollectionTest, DescriptorValue) { uniform::Collection c; const bool boolValue = true; uniform::DescriptorValue boolUniform(boolValue); testIndex(boolUniform); testUniformData(boolValue, boolUniform); auto boolUniformNameHandle = igl::genNameHandle("boolUniform"); c.set(boolUniformNameHandle, boolValue); testUniformData(boolValue, c.getOrCreate(boolUniformNameHandle)); const int intValue = 1; uniform::DescriptorValue intUniform(intValue); testIndex(intUniform); testUniformData(intValue, intUniform); auto intUniformNameHandle = igl::genNameHandle("intUniform"); c.set(intUniformNameHandle, intValue); testUniformData(intValue, c.getOrCreate(intUniformNameHandle)); const glm::ivec2 ivec2Value(2); uniform::DescriptorValue ivec2Uniform(ivec2Value); testIndex(ivec2Uniform); testUniformData(ivec2Value, ivec2Uniform); auto ivec2UniformNameHandle = igl::genNameHandle("ivec2Uniform"); c.set(ivec2UniformNameHandle, ivec2Value); testUniformData(ivec2Value, c.getOrCreate(ivec2UniformNameHandle)); const glm::ivec3 ivec3Value(3); uniform::DescriptorValue ivec3Uniform(ivec3Value); testIndex(ivec3Uniform); testUniformData(ivec3Value, ivec3Uniform); auto ivec3UniformNameHandle = igl::genNameHandle("ivec3Uniform"); c.set(ivec3UniformNameHandle, ivec3Value); testUniformData(ivec3Value, c.getOrCreate(ivec3UniformNameHandle)); const glm::ivec4 ivec4Value(4); uniform::DescriptorValue ivec4Uniform(ivec4Value); testIndex(ivec4Uniform); testUniformData(ivec4Value, ivec4Uniform); auto ivec4UniformNameHandle = igl::genNameHandle("ivec4Uniform"); c.set(ivec4UniformNameHandle, ivec4Value); testUniformData(ivec4Value, c.getOrCreate(ivec4UniformNameHandle)); const float floatValue(1.f); uniform::DescriptorValue floatUniform(floatValue); testIndex(floatUniform); testUniformData(floatValue, floatUniform); auto floatUniformNameHandle = igl::genNameHandle("floatUniform"); c.set(floatUniformNameHandle, floatValue); testUniformData(floatValue, c.getOrCreate(floatUniformNameHandle)); const glm::vec2 vec2Value(2.f); uniform::DescriptorValue vec2Uniform(vec2Value); testIndex(vec2Uniform); testUniformData(vec2Value, vec2Uniform); auto vec2UniformNameHandle = igl::genNameHandle("vec2Uniform"); c.set(vec2UniformNameHandle, vec2Value); testUniformData(vec2Value, c.getOrCreate(vec2UniformNameHandle)); const glm::vec3 vec3Value(3.f); uniform::DescriptorValue vec3Uniform(vec3Value); testIndex(vec3Uniform); testUniformData(vec3Value, vec3Uniform); auto vec3UniformNameHandle = igl::genNameHandle("vec3Uniform"); c.set(vec3UniformNameHandle, vec3Value); testUniformData(vec3Value, c.getOrCreate(vec3UniformNameHandle)); const glm::vec4 vec4Value(4.f); uniform::DescriptorValue vec4Uniform(vec4Value); testIndex(vec4Uniform); testUniformData(vec4Value, vec4Uniform); auto vec4UniformNameHandle = igl::genNameHandle("vec4Uniform"); c.set(vec4UniformNameHandle, vec4Value); testUniformData(vec4Value, c.getOrCreate(vec4UniformNameHandle)); const glm::mat2 mat2Value(2.f); uniform::DescriptorValue mat2Uniform(mat2Value); testIndex(mat2Uniform); testUniformData(mat2Value, mat2Uniform); auto mat2UniformNameHandle = igl::genNameHandle("mat2Uniform"); c.set(mat2UniformNameHandle, mat2Value); testUniformData(mat2Value, c.getOrCreate(mat2UniformNameHandle)); const glm::mat3 mat3Value(3.f); uniform::DescriptorValue mat3Uniform(mat3Value); testIndex(mat3Uniform); testUniformData(mat3Value, mat3Uniform); auto mat3UniformNameHandle = igl::genNameHandle("mat3Uniform"); c.set(mat3UniformNameHandle, mat3Value); testUniformData(mat3Value, c.getOrCreate(mat3UniformNameHandle)); const glm::mat4 mat4Value(4.f); uniform::DescriptorValue mat4Uniform(mat4Value); testIndex(mat4Uniform); testUniformData(mat4Value, mat4Uniform); auto mat4UniformNameHandle = igl::genNameHandle("mat4Uniform"); c.set(mat4UniformNameHandle, mat4Value); testUniformData(mat4Value, c.getOrCreate(mat4UniformNameHandle)); } // // Vector Test // TEST_F(UniformCollectionTest, DescriptorVector) { uniform::Collection c; // NOTE: std::vector does not have the data() method // std::vector boolVector = {true, false}; // uniform::DescriptorVector boolUniform(boolVector); // testIndex(boolUniform); // testUniformData(boolVector, boolUniform); const std::vector intVector = {1, 2, 3, 4, 5, -5, -4, -3, -2 - 1, 0}; uniform::DescriptorVector intUniform(intVector); testIndex(intUniform); testUniformData(intVector, intUniform); auto intUniformNameHandle = igl::genNameHandle("intUniform"); c.set(intUniformNameHandle, intVector); testUniformData(intVector, c.getOrCreate>(intUniformNameHandle)); const std::vector ivec2Vector = {glm::ivec2(2), glm::ivec2(3), glm::ivec2(4), glm::ivec2(5), glm::ivec2(6), glm::ivec2(-5), glm::ivec2(-4), glm::ivec2(-3), glm::ivec2(-2), glm::ivec2(-1), glm::ivec2(0)}; uniform::DescriptorVector ivec2Uniform(ivec2Vector); testIndex(ivec2Uniform); testUniformData(ivec2Vector, ivec2Uniform); auto ivec2UniformNameHandle = igl::genNameHandle("ivec2Uniform"); c.set(ivec2UniformNameHandle, ivec2Vector); testUniformData(ivec2Vector, c.getOrCreate>(ivec2UniformNameHandle)); const std::vector ivec3Vector = {glm::ivec3(3), glm::ivec3(4), glm::ivec3(5), glm::ivec3(6), glm::ivec3(7), glm::ivec3(-5), glm::ivec3(-4), glm::ivec3(-3), glm::ivec3(-2), glm::ivec3(-1), glm::ivec3(0)}; uniform::DescriptorVector ivec3Uniform(ivec3Vector); testIndex(ivec3Uniform); testUniformData(ivec3Vector, ivec3Uniform); auto ivec3UniformNameHandle = igl::genNameHandle("ivec3Uniform"); c.set(ivec3UniformNameHandle, ivec3Vector); testUniformData(ivec3Vector, c.getOrCreate>(ivec3UniformNameHandle)); const std::vector ivec4Vector = {glm::ivec4(4), glm::ivec4(5), glm::ivec4(6), glm::ivec4(7), glm::ivec4(8), glm::ivec4(-5), glm::ivec4(-4), glm::ivec4(-3), glm::ivec4(-2), glm::ivec4(-1), glm::ivec4(0)}; uniform::DescriptorVector ivec4Uniform(ivec4Vector); testIndex(ivec4Uniform); testUniformData(ivec4Vector, ivec4Uniform); auto ivec4UniformNameHandle = igl::genNameHandle("ivec4Uniform"); c.set(ivec4UniformNameHandle, ivec4Vector); testUniformData(ivec4Vector, c.getOrCreate>(ivec4UniformNameHandle)); const std::vector floatVector = {1.f, 2.f, 3.f, 4.f, 5.f, -5.f, -4.f, -3.f, -2 - 1.f, 0.f}; uniform::DescriptorVector floatUniform(floatVector); testIndex(floatUniform); testUniformData(floatVector, floatUniform); auto floatUniformNameHandle = igl::genNameHandle("floatUniform"); c.set(floatUniformNameHandle, floatVector); testUniformData(floatVector, c.getOrCreate>(floatUniformNameHandle)); const std::vector vec2Vector = { glm::vec2(2.f), glm::vec2(3.f), glm::vec2(4.f), glm::vec2(5.f), glm::vec2(6.f), glm::vec2(-5.f), glm::vec2(-4.f), glm::vec2(-3.f), glm::vec2(-2.f), glm::vec2(-1.f), glm::vec2(0.f), }; uniform::DescriptorVector vec2Uniform(vec2Vector); testIndex(vec2Uniform); testUniformData(vec2Vector, vec2Uniform); auto vec2UniformNameHandle = igl::genNameHandle("vec2Uniform"); c.set(vec2UniformNameHandle, vec2Vector); testUniformData(vec2Vector, c.getOrCreate>(vec2UniformNameHandle)); const std::vector vec3Vector = { glm::vec3(3.f), glm::vec3(4.f), glm::vec3(5.f), glm::vec3(6.f), glm::vec3(7.f), glm::vec3(-5.f), glm::vec3(-4.f), glm::vec3(-3.f), glm::vec3(-2.f), glm::vec3(-1.f), glm::vec3(0.f), }; uniform::DescriptorVector vec3Uniform(vec3Vector); testIndex(vec3Uniform); testUniformData(vec3Vector, vec3Uniform); auto vec3UniformNameHandle = igl::genNameHandle("vec3Uniform"); c.set(vec3UniformNameHandle, vec3Vector); testUniformData(vec3Vector, c.getOrCreate>(vec3UniformNameHandle)); const std::vector vec4Vector = { glm::vec4(4.f), glm::vec4(5.f), glm::vec4(6.f), glm::vec4(7.f), glm::vec4(8.f), glm::vec4(-5.f), glm::vec4(-4.f), glm::vec4(-3.f), glm::vec4(-2.f), glm::vec4(-1.f), glm::vec4(0.f), }; uniform::DescriptorVector vec4Uniform(vec4Vector); testIndex(vec4Uniform); testUniformData(vec4Vector, vec4Uniform); auto vec4UniformNameHandle = igl::genNameHandle("vec4Uniform"); c.set(vec4UniformNameHandle, vec4Vector); testUniformData(vec4Vector, c.getOrCreate>(vec4UniformNameHandle)); const std::vector mat2Vector = { glm::mat2(2.f), glm::mat2(3.f), glm::mat2(4.f), glm::mat2(5.f), glm::mat2(6.f), glm::mat2(-5.f), glm::mat2(-4.f), glm::mat2(-3.f), glm::mat2(-2.f), glm::mat2(-1.f), glm::mat2(0.f), }; uniform::DescriptorVector mat2Uniform(mat2Vector); testIndex(mat2Uniform); testUniformData(mat2Vector, mat2Uniform); auto mat2UniformNameHandle = igl::genNameHandle("mat2Uniform"); c.set(mat2UniformNameHandle, mat2Vector); testUniformData(mat2Vector, c.getOrCreate>(mat2UniformNameHandle)); const std::vector mat3Vector = { glm::mat3(3.f), glm::mat3(4.f), glm::mat3(5.f), glm::mat3(6.f), glm::mat3(7.f), glm::mat3(-5.f), glm::mat3(-4.f), glm::mat3(-3.f), glm::mat3(-2.f), glm::mat3(-1.f), glm::mat3(0.f), }; uniform::DescriptorVector mat3Uniform(mat3Vector); testIndex(mat3Uniform); testUniformData(mat3Vector, mat3Uniform); auto mat3UniformNameHandle = igl::genNameHandle("mat3Uniform"); c.set(mat3UniformNameHandle, mat3Vector); testUniformData(mat3Vector, c.getOrCreate>(mat3UniformNameHandle)); const std::vector mat4Vector = { glm::mat4(4.f), glm::mat4(5.f), glm::mat4(6.f), glm::mat4(7.f), glm::mat4(8.f), glm::mat4(-5.f), glm::mat4(-4.f), glm::mat4(-3.f), glm::mat4(-2.f), glm::mat4(-1.f), glm::mat4(0.f), }; uniform::DescriptorVector mat4Uniform(mat4Vector); testIndex(mat4Uniform); testUniformData(mat4Vector, mat4Uniform); auto mat4UniformNameHandle = igl::genNameHandle("mat4Uniform"); c.set(mat4UniformNameHandle, mat4Vector); testUniformData(mat4Vector, c.getOrCreate>(mat4UniformNameHandle)); } } // namespace iglu::tests ================================================ FILE: src/igl/tests/iglu/UniformDescriptor.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "UniformTests.h" #include #include namespace iglu::tests { // // UniformDescriptorTest // // Test fixture for all the tests in this file. Takes care of common // initialization and allocating of common resources. // class UniformDescriptorTest : public ::testing::Test { private: public: UniformDescriptorTest() = default; ~UniformDescriptorTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); } void TearDown() override {} }; // ---------------------------------------------------------------------------- // // Value Test // TEST_F(UniformDescriptorTest, DescriptorValue) { const bool boolValue = true; uniform::DescriptorValue boolUniform(boolValue); testIndex(boolUniform); testUniformData(boolValue, boolUniform); const int intValue = 1; uniform::DescriptorValue intUniform(intValue); testIndex(intUniform); testUniformData(intValue, intUniform); const glm::ivec2 ivec2Value(2); uniform::DescriptorValue ivec2Uniform(ivec2Value); testIndex(ivec2Uniform); testUniformData(ivec2Value, ivec2Uniform); const glm::ivec3 ivec3Value(3); uniform::DescriptorValue ivec3Uniform(ivec3Value); testIndex(ivec3Uniform); testUniformData(ivec3Value, ivec3Uniform); const glm::ivec4 ivec4Value(4); uniform::DescriptorValue ivec4Uniform(ivec4Value); testIndex(ivec4Uniform); testUniformData(ivec4Value, ivec4Uniform); const float floatValue(1.f); uniform::DescriptorValue floatUniform(floatValue); testIndex(floatUniform); testUniformData(floatValue, floatUniform); const glm::vec2 vec2Value(2.f); uniform::DescriptorValue vec2Uniform(vec2Value); testIndex(vec2Uniform); testUniformData(vec2Value, vec2Uniform); const glm::vec3 vec3Value(3.f); uniform::DescriptorValue vec3Uniform(vec3Value); testIndex(vec3Uniform); testUniformData(vec3Value, vec3Uniform); const glm::vec4 vec4Value(4.f); uniform::DescriptorValue vec4Uniform(vec4Value); testIndex(vec4Uniform); testUniformData(vec4Value, vec4Uniform); const glm::mat2 mat2Value(2.f); uniform::DescriptorValue mat2Uniform(mat2Value); testIndex(mat2Uniform); testUniformData(mat2Value, mat2Uniform); const glm::mat3 mat3Value(3.f); uniform::DescriptorValue mat3Uniform(mat3Value); testIndex(mat3Uniform); testUniformData(mat3Value, mat3Uniform); const glm::mat4 mat4Value(4.f); uniform::DescriptorValue mat4Uniform(mat4Value); testIndex(mat4Uniform); testUniformData(mat4Value, mat4Uniform); } // // Vector Test // TEST_F(UniformDescriptorTest, DescriptorVector) { // NOTE: std::vector does not have the data() method // std::vector boolVector = {true, false}; // uniform::DescriptorVector boolUniform(boolVector); // testIndex(boolUniform); // testUniformData(boolVector, boolUniform); const std::vector intVector = {1, 2, 3, 4, 5, -5, -4, -3, -2 - 1, 0}; uniform::DescriptorVector intUniform(intVector); testIndex(intUniform); testUniformData(intVector, intUniform); const std::vector ivec2Vector = {glm::ivec2(2), glm::ivec2(3), glm::ivec2(4), glm::ivec2(5), glm::ivec2(6), glm::ivec2(-5), glm::ivec2(-4), glm::ivec2(-3), glm::ivec2(-2), glm::ivec2(-1), glm::ivec2(0)}; uniform::DescriptorVector ivec2Uniform(ivec2Vector); testIndex(ivec2Uniform); testUniformData(ivec2Vector, ivec2Uniform); const std::vector ivec3Vector = {glm::ivec3(3), glm::ivec3(4), glm::ivec3(5), glm::ivec3(6), glm::ivec3(7), glm::ivec3(-5), glm::ivec3(-4), glm::ivec3(-3), glm::ivec3(-2), glm::ivec3(-1), glm::ivec3(0)}; uniform::DescriptorVector ivec3Uniform(ivec3Vector); testIndex(ivec3Uniform); testUniformData(ivec3Vector, ivec3Uniform); const std::vector ivec4Vector = {glm::ivec4(4), glm::ivec4(5), glm::ivec4(6), glm::ivec4(7), glm::ivec4(8), glm::ivec4(-5), glm::ivec4(-4), glm::ivec4(-3), glm::ivec4(-2), glm::ivec4(-1), glm::ivec4(0)}; uniform::DescriptorVector ivec4Uniform(ivec4Vector); testIndex(ivec4Uniform); testUniformData(ivec4Vector, ivec4Uniform); const std::vector floatVector = {1.f, 2.f, 3.f, 4.f, 5.f, -5.f, -4.f, -3.f, -2 - 1.f, 0.f}; uniform::DescriptorVector floatUniform(floatVector); testIndex(floatUniform); testUniformData(floatVector, floatUniform); const std::vector vec2Vector = { glm::vec2(2.f), glm::vec2(3.f), glm::vec2(4.f), glm::vec2(5.f), glm::vec2(6.f), glm::vec2(-5.f), glm::vec2(-4.f), glm::vec2(-3.f), glm::vec2(-2.f), glm::vec2(-1.f), glm::vec2(0.f), }; uniform::DescriptorVector vec2Uniform(vec2Vector); testIndex(vec2Uniform); testUniformData(vec2Vector, vec2Uniform); const std::vector vec3Vector = { glm::vec3(3.f), glm::vec3(4.f), glm::vec3(5.f), glm::vec3(6.f), glm::vec3(7.f), glm::vec3(-5.f), glm::vec3(-4.f), glm::vec3(-3.f), glm::vec3(-2.f), glm::vec3(-1.f), glm::vec3(0.f), }; uniform::DescriptorVector vec3Uniform(vec3Vector); testIndex(vec3Uniform); testUniformData(vec3Vector, vec3Uniform); const std::vector vec4Vector = { glm::vec4(4.f), glm::vec4(5.f), glm::vec4(6.f), glm::vec4(7.f), glm::vec4(8.f), glm::vec4(-5.f), glm::vec4(-4.f), glm::vec4(-3.f), glm::vec4(-2.f), glm::vec4(-1.f), glm::vec4(0.f), }; uniform::DescriptorVector vec4Uniform(vec4Vector); testIndex(vec4Uniform); testUniformData(vec4Vector, vec4Uniform); const std::vector mat2Vector = { glm::mat2(2.f), glm::mat2(3.f), glm::mat2(4.f), glm::mat2(5.f), glm::mat2(6.f), glm::mat2(-5.f), glm::mat2(-4.f), glm::mat2(-3.f), glm::mat2(-2.f), glm::mat2(-1.f), glm::mat2(0.f), }; uniform::DescriptorVector mat2Uniform(mat2Vector); testIndex(mat2Uniform); testUniformData(mat2Vector, mat2Uniform); const std::vector mat3Vector = { glm::mat3(3.f), glm::mat3(4.f), glm::mat3(5.f), glm::mat3(6.f), glm::mat3(7.f), glm::mat3(-5.f), glm::mat3(-4.f), glm::mat3(-3.f), glm::mat3(-2.f), glm::mat3(-1.f), glm::mat3(0.f), }; uniform::DescriptorVector mat3Uniform(mat3Vector); testIndex(mat3Uniform); testUniformData(mat3Vector, mat3Uniform); const std::vector mat4Vector = { glm::mat4(4.f), glm::mat4(5.f), glm::mat4(6.f), glm::mat4(7.f), glm::mat4(8.f), glm::mat4(-5.f), glm::mat4(-4.f), glm::mat4(-3.f), glm::mat4(-2.f), glm::mat4(-1.f), glm::mat4(0.f), }; uniform::DescriptorVector mat4Uniform(mat4Vector); testIndex(mat4Uniform); testUniformData(mat4Vector, mat4Uniform); } } // namespace iglu::tests ================================================ FILE: src/igl/tests/iglu/UniformTests.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace iglu::tests { namespace { constexpr int kVertexIndex = 9; constexpr int kFragmentIndex = 51; template struct Compare { static void verifyAligned(const T* expected, const void* aligned) { const T& alignedValue = *(static_cast(aligned)); ASSERT_EQ(*expected, alignedValue); } }; template<> struct Compare { static void verifyAligned(const glm::mat3* expected, const void* aligned) { const auto& alignedValue = *static_cast::Aligned*>(aligned); const auto* expectedPtr = static_cast(glm::value_ptr(*expected)); for (int i = 0; i < 3; i++) { // base of each row const auto* alignedRowPtr = static_cast(glm::value_ptr(alignedValue[i])); for (int j = 0; j < 3; j++) { ASSERT_EQ(*expectedPtr++, *alignedRowPtr++); } } } }; inline void testIndex(uniform::Descriptor& uniform) { ASSERT_EQ(uniform.getIndex(igl::ShaderStage::Fragment), -1); ASSERT_EQ(uniform.getIndex(igl::ShaderStage::Vertex), -1); uniform.setIndex(igl::ShaderStage::Fragment, kFragmentIndex); uniform.setIndex(igl::ShaderStage::Vertex, kVertexIndex); ASSERT_EQ(uniform.getIndex(igl::ShaderStage::Fragment), kFragmentIndex); ASSERT_EQ(uniform.getIndex(igl::ShaderStage::Vertex), kVertexIndex); } template void testUniformData(const T& expected, uniform::DescriptorValue& uniform) { ASSERT_EQ(uniform.numBytes(uniform::Alignment::Packed), sizeof(T)); ASSERT_EQ(uniform.numBytes(uniform::Alignment::Aligned), sizeof(T) + uniform::Trait::kPadding); ASSERT_EQ(uniform.size(), 1); const void* uniformPackedPtr = uniform.data(uniform::Alignment::Packed); const void* uniformAlignedPtr = uniform.data(uniform::Alignment::Aligned); if (uniform::Trait::kPadding == 0) { ASSERT_EQ(uniformPackedPtr, uniformAlignedPtr); } const T* uniformPacked = static_cast(uniformPackedPtr); ASSERT_EQ(expected, *uniformPacked); if (uniform::Trait::kPadding > 0) { Compare::verifyAligned(&expected, uniformAlignedPtr); } } template void testUniformData(const std::vector& expected, uniform::DescriptorVector& uniform) { ASSERT_EQ(uniform.numBytes(uniform::Alignment::Packed), uniform.size() * sizeof(T)); ASSERT_EQ(uniform.numBytes(uniform::Alignment::Aligned), uniform.size() * (sizeof(T) + uniform::Trait::kPadding)); ASSERT_EQ(uniform.size(), expected.size()); constexpr size_t kNumBytesPacked = sizeof(T); constexpr size_t kNumBytesAligned = kNumBytesPacked + uniform::Trait::kPadding; const auto* uniformPackedBytePtr = static_cast(uniform.data(uniform::Alignment::Packed)); const auto* uniformAlignedBytePtr = static_cast(uniform.data(uniform::Alignment::Aligned)); if (uniform::Trait::kPadding == 0) { ASSERT_EQ(uniformPackedBytePtr, uniformAlignedBytePtr); } for (size_t i = 0, iLen = uniform.size(); i < iLen; ++i) { const T* uniformPacked = reinterpret_cast(uniformPackedBytePtr); ASSERT_EQ(expected[i], *uniformPacked); if (uniform::Trait::kPadding > 0) { Compare::verifyAligned(&(expected[i]), uniformAlignedBytePtr); } uniformPackedBytePtr += kNumBytesPacked; uniformAlignedBytePtr += kNumBytesAligned; } } } // namespace } // namespace iglu::tests ================================================ FILE: src/igl/tests/iglu/bitmap/BitmapWriterTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../../util/TestDevice.h" #include namespace { // Dumped from a bmp file that was manually validated as being a checkerboard pattern const uint8_t kExpectedData[] = { 0x42, 0x4d, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00}; } // namespace namespace igl::tests::bitmap_writer { class BitmapWriterTest : public ::testing::Test { public: void SetUp() override { setDebugBreakEnabled(false); device_ = util::createTestDevice(); ASSERT_TRUE(device_ != nullptr); Result result; texDesc_ = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kTexWidth, kTexWidth, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); texture_ = device_->createTexture(texDesc_, &result); ASSERT_TRUE(result.isOk()); // Initialize a red checkerboard pattern std::vector data; data.reserve(kTexWidth * kTexWidth * 4); for (int i = 0; i < kTexWidth; i++) { for (int j = 0; j < kTexWidth; j++) { if (i % 2 != j % 2) { data.push_back(255); } else { data.push_back(0); } data.push_back(0); data.push_back(0); data.push_back(255); } } // Initialize texture data const auto range = igl::TextureRangeDesc::new2D(0, 0, kTexWidth, kTexWidth); texture_->upload(range, data.data()); } void TearDown() override {} protected: std::shared_ptr device_; std::shared_ptr texture_; TextureDesc texDesc_; constexpr static size_t kTexWidth = 4; }; TEST_F(BitmapWriterTest, WriteFile) { std::stringstream ss; igl::iglu::writeBitmap(ss, texture_, *device_); std::string s = ss.str(); const uint8_t* fileData = reinterpret_cast(s.c_str()); ASSERT_NE(fileData, nullptr); ASSERT_EQ(s.size(), sizeof(kExpectedData)); ASSERT_EQ(memcmp(fileData, kExpectedData, sizeof(kExpectedData)), 0); } } // namespace igl::tests::bitmap_writer ================================================ FILE: src/igl/tests/iglu/texture_loader/BaseTextureLoader.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../../data/TextureData.h" #include "../../util/Common.h" #include #include namespace igl::tests { class TestTextureLoader : public iglu::textureloader::ITextureLoader { public: TestTextureLoader(iglu::textureloader::DataReader reader, TextureDesc::TextureUsage usage) noexcept : iglu::textureloader::ITextureLoader(reader, usage) {} TextureDesc& descriptorRef() noexcept { return mutableDescriptor(); } }; class BaseTextureLoaderTest : public ::testing::Test { private: public: BaseTextureLoaderTest() = default; ~BaseTextureLoaderTest() override = default; // // SetUp() // Create device, commandQueue // void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_TRUE(iglDev_ != nullptr); ASSERT_TRUE(cmdQueue_ != nullptr); } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; }; TEST_F(BaseTextureLoaderTest, CheckCapabilities) { Result result; auto dataReader = iglu::textureloader::DataReader::tryCreate( reinterpret_cast(data::texture::kTexRgba2x2.data()), sizeof(data::texture::kTexRgba2x2), &result); ASSERT_TRUE(result.isOk()); ASSERT_TRUE(dataReader.has_value()); TestTextureLoader loader(*dataReader, TextureDesc::TextureUsageBits::Sampled); loader.descriptorRef().format = TextureFormat::RGBA_UNorm8; ASSERT_TRUE(loader.isSupported(*iglDev_)); ASSERT_FALSE(loader.canUploadSourceData()); ASSERT_FALSE(loader.canUseExternalMemory()); ASSERT_FALSE(loader.shouldGenerateMipmaps()); } TEST_F(BaseTextureLoaderTest, CreateTexture) { Result result; auto dataReader = iglu::textureloader::DataReader::tryCreate( reinterpret_cast(data::texture::kTexRgba2x2.data()), sizeof(data::texture::kTexRgba2x2), &result); ASSERT_TRUE(result.isOk()); ASSERT_TRUE(dataReader.has_value()); TestTextureLoader loader(*dataReader, TextureDesc::TextureUsageBits::Sampled); loader.descriptorRef().type = TextureType::TwoD; loader.descriptorRef().format = TextureFormat::RGBA_UNorm8; EXPECT_TRUE(loader.create(*iglDev_, &result) != nullptr); EXPECT_TRUE(result.isOk()); EXPECT_TRUE(loader.create(*iglDev_, TextureFormat::RGBA_UNorm8, &result) != nullptr); EXPECT_TRUE(result.isOk()); EXPECT_TRUE(loader.create(*iglDev_, TextureDesc::TextureUsageBits::Sampled, &result) != nullptr); EXPECT_TRUE(result.isOk()); } TEST_F(BaseTextureLoaderTest, UploadTexture) { Result result; auto dataReader = iglu::textureloader::DataReader::tryCreate( reinterpret_cast(data::texture::kTexRgba2x2.data()), sizeof(data::texture::kTexRgba2x2), &result); ASSERT_TRUE(result.isOk()); ASSERT_TRUE(dataReader.has_value()); TestTextureLoader loader(*dataReader, TextureDesc::TextureUsageBits::Sampled); loader.descriptorRef().type = TextureType::TwoD; loader.descriptorRef().format = TextureFormat::RGBA_UNorm8; auto texture = loader.create(*iglDev_, &result); ASSERT_TRUE(texture != nullptr); ASSERT_TRUE(result.isOk()); loader.upload(*texture, &result); ASSERT_TRUE(result.isOk()); uint8_t data = 0; loader.loadToExternalMemory(&data, 0, &result); ASSERT_FALSE(result.isOk()); } } // namespace igl::tests ================================================ FILE: src/igl/tests/iglu/texture_loader/IDataTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include namespace igl::tests { class IDataTest : public ::testing::Test { public: void SetUp() override {} void TearDown() override {} }; TEST_F(IDataTest, TryCreateNullDataFails) { Result result; auto data = iglu::textureloader::IData::tryCreate(nullptr, 100, &result); EXPECT_EQ(data, nullptr); EXPECT_FALSE(result.isOk()); EXPECT_EQ(result.code, Result::Code::ArgumentNull); } TEST_F(IDataTest, TryCreateZeroSizeFails) { auto buffer = std::make_unique(10); Result result; auto data = iglu::textureloader::IData::tryCreate(std::move(buffer), 0, &result); EXPECT_EQ(data, nullptr); EXPECT_FALSE(result.isOk()); EXPECT_EQ(result.code, Result::Code::ArgumentInvalid); } TEST_F(IDataTest, TryCreateValidDataSucceeds) { constexpr uint64_t kSize = 100; auto buffer = std::make_unique(kSize); std::memset(buffer.get(), 0xAB, kSize); Result result; auto data = iglu::textureloader::IData::tryCreate(std::move(buffer), kSize, &result); EXPECT_NE(data, nullptr); EXPECT_TRUE(result.isOk()); EXPECT_EQ(data->size(), kSize); EXPECT_NE(data->data(), nullptr); EXPECT_EQ(data->data()[0], 0xAB); } TEST_F(IDataTest, TryCreateLargeSizeSucceeds) { constexpr uint64_t kSize = 1024 * 1024; auto buffer = std::make_unique(kSize); buffer[0] = 0xCD; Result result; auto data = iglu::textureloader::IData::tryCreate(std::move(buffer), kSize, &result); EXPECT_NE(data, nullptr); EXPECT_TRUE(result.isOk()); EXPECT_EQ(data->size(), kSize); EXPECT_EQ(data->data()[0], 0xCD); } TEST_F(IDataTest, ExtractDataReturnsValidData) { constexpr uint64_t kSize = 50; auto buffer = std::make_unique(kSize); std::memset(buffer.get(), 0xEF, kSize); Result result; auto data = iglu::textureloader::IData::tryCreate(std::move(buffer), kSize, &result); ASSERT_NE(data, nullptr); auto extracted = data->extractData(); EXPECT_NE(extracted.data, nullptr); EXPECT_EQ(extracted.size, kSize); EXPECT_NE(extracted.deleter, nullptr); if (extracted.deleter != nullptr) { extracted.deleter(const_cast(extracted.data)); } } } // namespace igl::tests ================================================ FILE: src/igl/tests/iglu/texture_loader/Ktx1TextureLoaderTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include namespace igl::tests::ktx1 { namespace { std::vector getBuffer(uint32_t capacity) { std::vector buffer(static_cast(capacity)); return buffer; } void put(std::vector& buffer, uint32_t offset, uint32_t data) { if (buffer.size() < static_cast(offset) + sizeof(data)) { throw std::runtime_error("Overflow when storing a word"); } std::memcpy(buffer.data() + offset, &data, sizeof(data)); } constexpr uint32_t kHeaderSize = 64u; constexpr uint32_t kOffsetEndianness = 12u; constexpr uint32_t kOffsetTypeSize = 20u; constexpr uint32_t kOffsetGlFormat = 28u; constexpr uint32_t kOffsetWidth = 36u; constexpr uint32_t kOffsetHeight = 40u; constexpr uint32_t kOffsetNumberOfFaces = 52u; constexpr uint32_t kOffsetNumberOfMipmapLevels = 56u; constexpr uint32_t kOffsetBytesOfKeyValueData = 60u; constexpr uint32_t kOffsetImages = 64u; // NOLINTBEGIN(readability-identifier-naming) constexpr uint32_t GL_RGBA8 = 0x8058; constexpr uint32_t GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG = 0x8C03; constexpr uint32_t GL_COMPRESSED_RGB8_ETC2 = 0x9274; // NOLINTEND(readability-identifier-naming) void putMipLevel(std::vector& buffer, uint32_t mipLevel, uint32_t imageSize) { const auto* header = reinterpret_cast(buffer.data()); const auto range = igl::TextureRangeDesc::new2D( 0, 0, std::max(header->pixelWidth, 1u), std::max(header->pixelHeight, 1u)); const auto format = igl::opengl::util::glTextureFormatToTextureFormat( header->glInternalFormat, header->glFormat, header->glType); const auto properties = igl::TextureFormatProperties::fromTextureFormat(format); uint32_t offset = kOffsetImages; for (uint32_t i = 0; i < mipLevel; ++i) { const uint32_t rangeBytes = static_cast(properties.getBytesPerRange(range.atMipLevel(i))); offset += rangeBytes + 4u; } put(buffer, offset, imageSize); } void populateMinimalValidFile(std::vector& buffer, uint32_t glFormat, uint32_t width, uint32_t height, uint32_t numMipLevels, uint32_t bytesOfKeyValueData, uint32_t imageSize) { // HEADER // Zero-out the whole buffer, since there might be garbage in it. std::memset(buffer.data(), 0x00, buffer.size()); // Put the default values in const char fixedTag[] = {'\xAB', 'K', 'T', 'X', ' ', '1', '1', '\xBB', '\r', '\n', '\x1A', '\n'}; std::memcpy(buffer.data(), &fixedTag, sizeof(fixedTag)); put(buffer, kOffsetEndianness, 0x04030201); put(buffer, kOffsetTypeSize, 1); put(buffer, kOffsetNumberOfFaces, 1); put(buffer, kOffsetWidth, width); put(buffer, kOffsetHeight, height); put(buffer, kOffsetNumberOfMipmapLevels, numMipLevels); put(buffer, kOffsetGlFormat, glFormat); put(buffer, kOffsetBytesOfKeyValueData, bytesOfKeyValueData); // IMAGES putMipLevel(buffer, 0, imageSize); } std::optional getReader(const std::vector& buffer) { Result ret; auto maybeReader = iglu::textureloader::DataReader::tryCreate( buffer.data(), static_cast(buffer.size()), &ret); EXPECT_TRUE(ret.isOk()) << ret.message; return maybeReader; } } // namespace class Ktx1TextureLoaderTest : public ::testing::Test { public: void SetUp() override { setDebugBreakEnabled(false); } void TearDown() override {} protected: iglu::textureloader::ktx1::TextureLoaderFactory factory_; }; TEST_F(Ktx1TextureLoaderTest, EmptyBuffer_Fails) { const uint32_t numMipLevels = 1u; const uint32_t imageSize = 512u; auto buffer = getBuffer(kHeaderSize + imageSize + 4u * numMipLevels /* for imageSize */); Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( buffer.data(), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_EQ(loader, nullptr); EXPECT_FALSE(ret.isOk()); } TEST_F(Ktx1TextureLoaderTest, MinimumValidHeader_Succeeds) { const uint32_t width = 64u; const uint32_t height = 32u; const uint32_t numMipLevels = 1u; const uint32_t bytesOfKeyValueData = 0u; const uint32_t imageSize = 512u; const uint32_t glFormat = GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; auto buffer = getBuffer(kHeaderSize + imageSize + 4u * numMipLevels /* for imageSize */); populateMinimalValidFile( buffer, glFormat, width, height, numMipLevels, bytesOfKeyValueData, imageSize); Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( buffer.data(), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_NE(loader, nullptr); EXPECT_TRUE(ret.isOk()) << ret.message; } TEST_F(Ktx1TextureLoaderTest, HeaderWithMipLevels_Succeeds) { const uint32_t width = 64u; const uint32_t height = 32u; const uint32_t numMipLevels = 5u; const uint32_t bytesOfKeyValueData = 0u; const uint32_t glFormat = GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; const uint32_t imageSize = 512u; // For first mip level // size: 512 + 128 + 32 + 32 + 32 + 32 - 64x32, 32x16, 16x8, 8x4, 4x2, 2x1, 1x1 auto buffer = getBuffer(kHeaderSize + 512u + 128u + 32u + 32u + 32u + 32u + 4u * numMipLevels); populateMinimalValidFile( buffer, glFormat, width, height, numMipLevels, bytesOfKeyValueData, imageSize); // Fill the other mip levels putMipLevel(buffer, 1u, 128u); putMipLevel(buffer, 2u, 32u); putMipLevel(buffer, 3u, 32u); putMipLevel(buffer, 4u, 32u); Result ret; auto maybeReader = getReader(buffer); ASSERT_TRUE(maybeReader.has_value()); auto loader = factory_.tryCreate(*maybeReader, &ret); EXPECT_NE(loader, nullptr); EXPECT_TRUE(ret.isOk()) << ret.message; } TEST_F(Ktx1TextureLoaderTest, ValidHeaderWithExtraData_Succeeds) { const uint32_t width = 64u; const uint32_t height = 32u; const uint32_t numMipLevels = 1u; const uint32_t bytesOfKeyValueData = 0u; const uint32_t imageSize = 512u; const uint32_t glFormat = GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; auto buffer = getBuffer(kHeaderSize + imageSize + 1u + 4u * numMipLevels); populateMinimalValidFile( buffer, glFormat, width, height, numMipLevels, bytesOfKeyValueData, imageSize); Result ret; auto maybeReader = getReader(buffer); ASSERT_TRUE(maybeReader.has_value()); auto loader = factory_.tryCreate(*maybeReader, &ret); EXPECT_NE(loader, nullptr); EXPECT_TRUE(ret.isOk()) << ret.message; } TEST_F(Ktx1TextureLoaderTest, InsufficientData_Fails) { const uint32_t width = 64u; const uint32_t height = 32u; const uint32_t numMipLevels = 1u; const uint32_t bytesOfKeyValueData = 0u; const uint32_t imageSize = 512u; const uint32_t glFormat = GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; auto buffer = getBuffer(kHeaderSize + imageSize + 4u * numMipLevels - 1u); populateMinimalValidFile( buffer, glFormat, width, height, numMipLevels, bytesOfKeyValueData, imageSize); Result ret; auto maybeReader = getReader(buffer); ASSERT_TRUE(maybeReader.has_value()); auto loader = factory_.tryCreate(*maybeReader, &ret); EXPECT_EQ(loader, nullptr); EXPECT_FALSE(ret.isOk()); } TEST_F(Ktx1TextureLoaderTest, InsufficientDataWithMipLevels_Fails) { const uint32_t width = 64u; const uint32_t height = 32u; const uint32_t numMipLevels = 6u; const uint32_t bytesOfKeyValueData = 0u; const uint32_t glFormat = GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; const uint32_t imageSize = 512; // For first mip level // size: 512 + 128 + 32 + 32 + 32 + 32 - 64x32, 32x16, 16x8, 8x4, 4x2, 2x1, 1x1 auto buffer = getBuffer(kHeaderSize + 512u + 128u + 32u + 32u + 32u + 32u + 4u * numMipLevels - 1u); populateMinimalValidFile( buffer, glFormat, width, height, numMipLevels, bytesOfKeyValueData, imageSize); // Fill the other mip levels putMipLevel(buffer, 1u, 128u); putMipLevel(buffer, 2u, 32u); putMipLevel(buffer, 3u, 32u); putMipLevel(buffer, 4u, 32u); putMipLevel(buffer, 5u, 32u); Result ret; auto maybeReader = getReader(buffer); ASSERT_TRUE(maybeReader.has_value()); auto loader = factory_.tryCreate(*maybeReader, &ret); EXPECT_EQ(loader, nullptr); EXPECT_FALSE(ret.isOk()); } TEST_F(Ktx1TextureLoaderTest, ValidHeaderWithInvalidImageSize_Fails) { const uint32_t width = 64u; const uint32_t height = 32u; const uint32_t numMipLevels = 1u; const uint32_t bytesOfKeyValueData = 0u; const uint32_t imageSize = 4096u; const uint32_t glFormat = GL_COMPRESSED_RGB8_ETC2; auto buffer = getBuffer(kHeaderSize + imageSize + 4u * numMipLevels); populateMinimalValidFile( buffer, glFormat, width, height, numMipLevels, bytesOfKeyValueData, imageSize); Result ret; auto maybeReader = getReader(buffer); ASSERT_TRUE(maybeReader.has_value()); auto loader = factory_.tryCreate(*maybeReader, &ret); EXPECT_EQ(loader, nullptr); EXPECT_FALSE(ret.isOk()); } TEST_F(Ktx1TextureLoaderTest, InvalidHeaderWithExcessiveImageSize_Fails) { const uint32_t width = 64u; const uint32_t height = 32u; const uint32_t numMipLevels = 1u; const uint32_t bytesOfKeyValueData = 0u; const uint32_t imageSize = 4294967290u; const uint32_t glFormat = GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; auto buffer = getBuffer(kHeaderSize + 4u * numMipLevels); populateMinimalValidFile( buffer, glFormat, width, height, numMipLevels, bytesOfKeyValueData, imageSize); Result ret; auto maybeReader = getReader(buffer); ASSERT_TRUE(maybeReader.has_value()); auto loader = factory_.tryCreate(*maybeReader, &ret); EXPECT_EQ(loader, nullptr); EXPECT_FALSE(ret.isOk()); } TEST_F(Ktx1TextureLoaderTest, InvalidHeaderWithExcessiveMipLevels_Fails) { const uint32_t width = 64u; const uint32_t height = 32u; const uint32_t numMipLevels = 4294967290u; const uint32_t bytesOfKeyValueData = 0u; const uint32_t imageSize = 512u; const uint32_t glFormat = GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; auto buffer = getBuffer(kHeaderSize + imageSize); populateMinimalValidFile( buffer, glFormat, width, height, numMipLevels, bytesOfKeyValueData, imageSize); Result ret; auto maybeReader = getReader(buffer); ASSERT_TRUE(maybeReader.has_value()); auto loader = factory_.tryCreate(*maybeReader, &ret); EXPECT_EQ(loader, nullptr); EXPECT_FALSE(ret.isOk()); } TEST_F(Ktx1TextureLoaderTest, InvalidHeaderWithExcessiveKeyValueData_Fails) { const uint32_t width = 64u; const uint32_t height = 32u; const uint32_t numMipLevels = 1u; const uint32_t bytesOfKeyValueData = 4294967290u; const uint32_t imageSize = 512u; const uint32_t glFormat = GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; auto buffer = getBuffer(kHeaderSize + imageSize); populateMinimalValidFile( buffer, glFormat, width, height, numMipLevels, bytesOfKeyValueData, imageSize); Result ret; auto maybeReader = getReader(buffer); ASSERT_TRUE(maybeReader.has_value()); auto loader = factory_.tryCreate(*maybeReader, &ret); EXPECT_EQ(loader, nullptr); EXPECT_FALSE(ret.isOk()); } TEST_F(Ktx1TextureLoaderTest, MinimumValidHeader1x1Rgba8Succeeds) { const uint32_t width = 1u; const uint32_t height = 1u; const uint32_t numMipLevels = 1u; const uint32_t bytesOfKeyValueData = 0u; const uint32_t imageSize = 4u; const uint32_t glFormat = GL_RGBA8; auto buffer = getBuffer(kHeaderSize + imageSize + 4u * numMipLevels /* for imageSize */); populateMinimalValidFile( buffer, glFormat, width, height, numMipLevels, bytesOfKeyValueData, imageSize); Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( buffer.data(), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_NE(loader, nullptr); EXPECT_TRUE(ret.isOk()) << ret.message; } } // namespace igl::tests::ktx1 ================================================ FILE: src/igl/tests/iglu/texture_loader/Ktx2TextureLoaderTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include namespace igl::tests::ktx2 { namespace { template T align(T offset, T alignment) { return (offset + (alignment - 1)) & ~(alignment - 1); } std::vector getBuffer(uint32_t capacity) { std::vector buffer(static_cast(capacity)); return buffer; } template void put(std::vector& buffer, uint32_t offset, T data) { if (buffer.size() < static_cast(offset) + sizeof(T)) { throw std::runtime_error("Overflow when storing a word"); } std::memcpy(buffer.data() + offset, &data, sizeof(T)); } constexpr uint32_t kHeaderSize = 80u; constexpr uint32_t kOffsetVkFormat = 12u; constexpr uint32_t kOffsetTypeSize = 16u; constexpr uint32_t kOffsetWidth = 20u; constexpr uint32_t kOffsetHeight = 24u; constexpr uint32_t kOffsetFaceCount = 36u; constexpr uint32_t kOffsetLevelCount = 40u; constexpr uint32_t kOffsetDfdByteOffset = 48u; constexpr uint32_t kOffsetDfdByteLength = 52u; constexpr uint32_t kOffsetKvdByteOffset = 56u; constexpr uint32_t kOffsetKvdByteLength = 60u; constexpr uint32_t kMipmapMetadataSize = 24u; constexpr uint32_t kDfdCompressedMetadataSize = 48u; constexpr uint32_t kDfdUncompressedMetadataSize = 92u; // NOLINTBEGIN(readability-identifier-naming) constexpr uint32_t VK_FORMAT_R8G8B8A8_UNORM = 37u; constexpr uint32_t VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG = 1000054000u; constexpr uint32_t VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK = 147u; constexpr uint8_t KHR_DF_FLAG_ALPHA_STRAIGHT = 0; constexpr uint8_t KHR_DF_TRANSFER_SRGB = 1; constexpr uint8_t KHR_DF_TRANSFER_LINEAR = 2; constexpr uint8_t KHR_DF_PRIMARIES_BT709 = 1; constexpr uint8_t KHR_DF_MODEL_RGBSDA = 1; constexpr uint8_t KHR_DF_MODEL_ETC1 = 160; constexpr uint8_t KHR_DF_MODEL_PVRTC = 164; constexpr uint8_t KHR_DF_SAMPLE_DATATYPE_LINEAR = (1U << 4U); constexpr uint8_t KHR_DF_CHANNEL_RGBSDA_RED = 0u; constexpr uint8_t KHR_DF_CHANNEL_RGBSDA_GREEN = 1u; constexpr uint8_t KHR_DF_CHANNEL_RGBSDA_BLUE = 2u; constexpr uint8_t KHR_DF_CHANNEL_RGBSDA_ALPHA = 15u; // NOLINTEND(readability-identifier-naming) uint32_t getTotalHeaderSize(uint32_t vkFormat, uint32_t numMipLevels, uint32_t bytesOfKeyValueData) { return kHeaderSize + numMipLevels * kMipmapMetadataSize + bytesOfKeyValueData + (vkFormat == VK_FORMAT_R8G8B8A8_UNORM ? kDfdUncompressedMetadataSize : kDfdCompressedMetadataSize); } uint32_t getTotalDataSize(uint32_t vkFormat, uint32_t width, uint32_t height, uint32_t numMipLevels) { const auto format = igl::vulkan::util::vkTextureFormatToTextureFormat(static_cast(vkFormat)); const auto properties = igl::TextureFormatProperties::fromTextureFormat(format); const auto range = igl::TextureRangeDesc::new2D(0, 0, std::max(width, 1u), std::max(height, 1u)); const uint32_t mipLevelAlignment = std::lcm(static_cast(properties.bytesPerBlock), 4u); uint32_t dataSize = 0; for (uint32_t i = 0; i < numMipLevels; ++i) { const uint32_t mipLevel = numMipLevels - i - 1; const uint32_t rangeBytes = static_cast(properties.getBytesPerRange(range.atMipLevel(mipLevel))); dataSize = align(dataSize + rangeBytes, mipLevelAlignment); } return dataSize; } // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) void putDfd(std::vector& buffer, uint32_t vkFormat, uint32_t numMipLevels) { const uint32_t dfdMetadataOffset = kHeaderSize + numMipLevels * kMipmapMetadataSize; ASSERT_TRUE(vkFormat == VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG || vkFormat == VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK || vkFormat == VK_FORMAT_R8G8B8A8_UNORM); const auto format = igl::vulkan::util::vkTextureFormatToTextureFormat(static_cast(vkFormat)); const auto properties = igl::TextureFormatProperties::fromTextureFormat(format); const uint16_t descriptorType = 0; const uint16_t vendorId = 0; const uint16_t descriptorBlockSize = vkFormat == VK_FORMAT_R8G8B8A8_UNORM ? 88 : 40; const uint16_t version = 2; const uint8_t flags = KHR_DF_FLAG_ALPHA_STRAIGHT; const uint8_t transferFunction = properties.isSRGB() ? KHR_DF_TRANSFER_SRGB : KHR_DF_TRANSFER_LINEAR; const uint8_t colorPrimaries = KHR_DF_PRIMARIES_BT709; const uint8_t colorModel = vkFormat == VK_FORMAT_R8G8B8A8_UNORM ? KHR_DF_MODEL_RGBSDA : (vkFormat == VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG ? KHR_DF_MODEL_PVRTC : KHR_DF_MODEL_ETC1); const uint8_t texelBlockDimension3 = 0; const uint8_t texelBlockDimension2 = properties.blockDepth - 1; const uint8_t texelBlockDimension1 = properties.blockHeight - 1; const uint8_t texelBlockDimension0 = properties.blockWidth - 1; const uint32_t bytesPlane3210 = vkFormat == VK_FORMAT_R8G8B8A8_UNORM ? 4u : 8u; const uint32_t bytesPlane7654 = 0; const uint32_t dfdMetadataSize = descriptorBlockSize + 4u; put(buffer, kOffsetDfdByteOffset, dfdMetadataOffset); put(buffer, kOffsetDfdByteLength, dfdMetadataSize); put(buffer, dfdMetadataOffset, dfdMetadataSize); // Total length put(buffer, dfdMetadataOffset + 4u, vendorId); put(buffer, dfdMetadataOffset + 6u, descriptorType); put(buffer, dfdMetadataOffset + 8u, version); put(buffer, dfdMetadataOffset + 10u, descriptorBlockSize); put(buffer, dfdMetadataOffset + 12u, colorModel); put(buffer, dfdMetadataOffset + 13u, colorPrimaries); put(buffer, dfdMetadataOffset + 14u, transferFunction); put(buffer, dfdMetadataOffset + 15u, flags); put(buffer, dfdMetadataOffset + 16u, texelBlockDimension0); put(buffer, dfdMetadataOffset + 17u, texelBlockDimension1); put(buffer, dfdMetadataOffset + 18u, texelBlockDimension2); put(buffer, dfdMetadataOffset + 19u, texelBlockDimension3); put(buffer, dfdMetadataOffset + 20u, bytesPlane3210); put(buffer, dfdMetadataOffset + 24u, bytesPlane7654); if (vkFormat == VK_FORMAT_R8G8B8A8_UNORM) { constexpr std::array kChannelFlags = { KHR_DF_CHANNEL_RGBSDA_RED, KHR_DF_CHANNEL_RGBSDA_GREEN, KHR_DF_CHANNEL_RGBSDA_BLUE, KHR_DF_CHANNEL_RGBSDA_ALPHA | KHR_DF_SAMPLE_DATATYPE_LINEAR, }; uint32_t offset = dfdMetadataOffset + 28u; for (int i = 0; i < 4; ++i) { const uint8_t channelFlags = kChannelFlags[i]; const uint8_t bitLength = 7; const uint16_t bitOffset = 8 * i; const uint8_t samplePosition3 = 0; const uint8_t samplePosition2 = 0; const uint8_t samplePosition1 = 0; const uint8_t samplePosition0 = 0; const uint32_t sampleLower = 0; const uint32_t sampleUpper = std::numeric_limits::max(); put(buffer, offset + 0u, bitOffset); put(buffer, offset + 2u, bitLength); put(buffer, offset + 3u, channelFlags); put(buffer, offset + 4u, samplePosition0); put(buffer, offset + 5u, samplePosition1); put(buffer, offset + 6u, samplePosition2); put(buffer, offset + 7u, samplePosition3); put(buffer, offset + 8u, sampleLower); put(buffer, offset + 12u, sampleUpper); offset += 16u; } } else { const uint8_t channelFlags = 0; const uint8_t bitLength = 63; const uint16_t bitOffset = 0; const uint8_t samplePosition3 = 0; const uint8_t samplePosition2 = 0; const uint8_t samplePosition1 = 0; const uint8_t samplePosition0 = 0; const uint32_t sampleLower = 0; const uint32_t sampleUpper = std::numeric_limits::max(); put(buffer, dfdMetadataOffset + 28u, bitOffset); put(buffer, dfdMetadataOffset + 30u, bitLength); put(buffer, dfdMetadataOffset + 31u, channelFlags); put(buffer, dfdMetadataOffset + 32u, samplePosition0); put(buffer, dfdMetadataOffset + 33u, samplePosition1); put(buffer, dfdMetadataOffset + 34u, samplePosition2); put(buffer, dfdMetadataOffset + 35u, samplePosition3); put(buffer, dfdMetadataOffset + 36u, sampleLower); put(buffer, dfdMetadataOffset + 40u, sampleUpper); } } void putMipLevel(std::vector& buffer, uint32_t vkFormat, uint32_t mipLevel, uint32_t imageSize) { const auto* header = reinterpret_cast(buffer.data()); const auto format = igl::vulkan::util::vkTextureFormatToTextureFormat(static_cast(header->vkFormat)); const auto properties = igl::TextureFormatProperties::fromTextureFormat(format); const auto range = igl::TextureRangeDesc::new2D( 0, 0, std::max(header->pixelWidth, 1u), std::max(header->pixelHeight, 1u)); const uint32_t maxMipLevels = igl::TextureDesc::calcNumMipLevels(range.width, range.height); const uint32_t levelCount = std::min(maxMipLevels, header->levelCount); const uint32_t mipLevelAlignment = std::lcm(static_cast(properties.bytesPerBlock), 4u); const uint32_t mipmapMetadataLength = levelCount * kMipmapMetadataSize; const uint32_t metadataLength = iglu::textureloader::ktx2::kHeaderLength + mipmapMetadataLength + header->kvdByteLength + (vkFormat == VK_FORMAT_R8G8B8A8_UNORM ? kDfdUncompressedMetadataSize : kDfdCompressedMetadataSize); std::vector mipmapOffsets(levelCount); uint32_t mipmapOffset = align(metadataLength, mipLevelAlignment); for (size_t i = 0; i < levelCount; ++i) { const uint32_t workingLevel = levelCount - i - 1; mipmapOffsets[workingLevel] = mipmapOffset; if (workingLevel == mipLevel) { break; } const uint32_t rangeBytes = static_cast(properties.getBytesPerRange(range.atMipLevel(workingLevel))); mipmapOffset = align(mipmapOffset + rangeBytes, mipLevelAlignment); } const uint32_t mipmapMetadataOffset = kHeaderSize + mipLevel * kMipmapMetadataSize; put(buffer, mipmapMetadataOffset, static_cast(mipmapOffsets[mipLevel])); put(buffer, mipmapMetadataOffset + 8u, static_cast(imageSize)); put(buffer, mipmapMetadataOffset + 16u, static_cast(imageSize)); } void populateMinimalValidFile(std::vector& buffer, uint32_t vkFormat, uint32_t width, uint32_t height, uint32_t numMipLevels, uint32_t bytesOfKeyValueData, uint32_t imageSize, bool forceDfdAfterMipLevel1 = false) { // HEADER // Zero-out the whole buffer, since there might be garbage in it. std::memset(buffer.data(), 0x00, buffer.size()); const uint32_t mipmapMetadataLength = numMipLevels * kMipmapMetadataSize; // Put the default values in const char fixedTag[] = {'\xAB', 'K', 'T', 'X', ' ', '2', '0', '\xBB', '\r', '\n', '\x1A', '\n'}; std::memcpy(buffer.data(), &fixedTag, sizeof(fixedTag)); put(buffer, kOffsetVkFormat, vkFormat); put(buffer, kOffsetTypeSize, 1); put(buffer, kOffsetFaceCount, 1); put(buffer, kOffsetWidth, width); put(buffer, kOffsetHeight, height); put(buffer, kOffsetLevelCount, numMipLevels); put(buffer, kOffsetKvdByteOffset, bytesOfKeyValueData == 0 ? 0u : kHeaderSize + mipmapMetadataLength); put(buffer, kOffsetKvdByteLength, bytesOfKeyValueData); putMipLevel(buffer, vkFormat, 0u, imageSize); putDfd(buffer, vkFormat, forceDfdAfterMipLevel1 ? 1u : numMipLevels); } } // namespace class Ktx2TextureLoaderTest : public ::testing::Test { public: void SetUp() override { setDebugBreakEnabled(false); } void TearDown() override {} protected: iglu::textureloader::ktx2::TextureLoaderFactory factory_; }; TEST_F(Ktx2TextureLoaderTest, EmptyBuffer_Fails) { const uint32_t width = 64u; const uint32_t height = 32u; const uint32_t numMipLevels = 1u; const uint32_t bytesOfKeyValueData = 0u; const uint32_t vkFormat = VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG; const uint32_t totalHeaderSize = getTotalHeaderSize(vkFormat, numMipLevels, bytesOfKeyValueData); const uint32_t totalDataSize = getTotalDataSize(vkFormat, width, height, numMipLevels); auto buffer = getBuffer(totalHeaderSize + totalDataSize); Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( buffer.data(), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_EQ(loader, nullptr); EXPECT_FALSE(ret.isOk()); } TEST_F(Ktx2TextureLoaderTest, MinimumValidHeader_Succeeds) { const uint32_t width = 64u; const uint32_t height = 32u; const uint32_t numMipLevels = 1u; const uint32_t bytesOfKeyValueData = 0u; const uint32_t imageSize = 512u; const uint32_t vkFormat = VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG; const uint32_t totalHeaderSize = getTotalHeaderSize(vkFormat, numMipLevels, bytesOfKeyValueData); const uint32_t totalDataSize = getTotalDataSize(vkFormat, width, height, numMipLevels); auto buffer = getBuffer(totalHeaderSize + totalDataSize); populateMinimalValidFile( buffer, vkFormat, width, height, numMipLevels, bytesOfKeyValueData, imageSize); Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( buffer.data(), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_NE(loader, nullptr); EXPECT_TRUE(ret.isOk()) << ret.message; } TEST_F(Ktx2TextureLoaderTest, HeaderWithMipLevels_Succeeds) { const uint32_t width = 64u; const uint32_t height = 32u; const uint32_t numMipLevels = 5u; const uint32_t bytesOfKeyValueData = 0u; const uint32_t vkFormat = VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG; const uint32_t imageSize = 512u; // For first mip level const uint32_t totalHeaderSize = getTotalHeaderSize(vkFormat, numMipLevels, bytesOfKeyValueData); const uint32_t totalDataSize = getTotalDataSize(vkFormat, width, height, numMipLevels); auto buffer = getBuffer(totalHeaderSize + totalDataSize); populateMinimalValidFile( buffer, vkFormat, width, height, numMipLevels, bytesOfKeyValueData, imageSize); // Fill the other mip levels putMipLevel(buffer, vkFormat, 1u, 128u); putMipLevel(buffer, vkFormat, 2u, 32u); putMipLevel(buffer, vkFormat, 3u, 32u); putMipLevel(buffer, vkFormat, 4u, 32u); Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( buffer.data(), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_NE(loader, nullptr); EXPECT_TRUE(ret.isOk()) << ret.message; } TEST_F(Ktx2TextureLoaderTest, ValidHeaderWithExtraData_Succeeds) { const uint32_t width = 64u; const uint32_t height = 32u; const uint32_t numMipLevels = 1u; const uint32_t bytesOfKeyValueData = 0u; const uint32_t imageSize = 512u; const uint32_t vkFormat = VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG; const uint32_t totalHeaderSize = getTotalHeaderSize(vkFormat, numMipLevels, bytesOfKeyValueData); const uint32_t totalDataSize = getTotalDataSize(vkFormat, width, height, numMipLevels); auto buffer = getBuffer(totalHeaderSize + totalDataSize + 1u); populateMinimalValidFile( buffer, vkFormat, width, height, numMipLevels, bytesOfKeyValueData, imageSize); Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( buffer.data(), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_NE(loader, nullptr); EXPECT_TRUE(ret.isOk()) << ret.message; } TEST_F(Ktx2TextureLoaderTest, InsufficientData_Fails) { const uint32_t width = 64u; const uint32_t height = 32u; const uint32_t numMipLevels = 1u; const uint32_t bytesOfKeyValueData = 0u; const uint32_t imageSize = 512u; const uint32_t vkFormat = VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG; const uint32_t totalHeaderSize = getTotalHeaderSize(vkFormat, numMipLevels, bytesOfKeyValueData); const uint32_t totalDataSize = getTotalDataSize(vkFormat, width, height, numMipLevels); auto buffer = getBuffer(totalHeaderSize + totalDataSize - 1u); populateMinimalValidFile( buffer, vkFormat, width, height, numMipLevels, bytesOfKeyValueData, imageSize); Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( buffer.data(), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_EQ(loader, nullptr); EXPECT_FALSE(ret.isOk()); } TEST_F(Ktx2TextureLoaderTest, InsufficientDataWithMipLevels_Fails) { const uint32_t width = 64u; const uint32_t height = 32u; const uint32_t numMipLevels = 6u; const uint32_t bytesOfKeyValueData = 0u; const uint32_t vkFormat = VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG; const uint32_t imageSize = 512; // For first mip level const uint32_t totalHeaderSize = getTotalHeaderSize(vkFormat, numMipLevels, bytesOfKeyValueData); const uint32_t totalDataSize = getTotalDataSize(vkFormat, width, height, numMipLevels); auto buffer = getBuffer(totalHeaderSize + totalDataSize - 1u); populateMinimalValidFile( buffer, vkFormat, width, height, numMipLevels, bytesOfKeyValueData, imageSize); // Fill the other mip levels putMipLevel(buffer, vkFormat, 1u, 128u); putMipLevel(buffer, vkFormat, 2u, 32u); putMipLevel(buffer, vkFormat, 3u, 32u); putMipLevel(buffer, vkFormat, 4u, 32u); putMipLevel(buffer, vkFormat, 5u, 32u); Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( buffer.data(), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_EQ(loader, nullptr); EXPECT_FALSE(ret.isOk()); } TEST_F(Ktx2TextureLoaderTest, ValidHeaderWithInvalidImageSize_Fails) { const uint32_t width = 64u; const uint32_t height = 32u; const uint32_t numMipLevels = 1u; const uint32_t bytesOfKeyValueData = 0u; const uint32_t imageSize = 4096u; const uint32_t vkFormat = VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK; const uint32_t totalHeaderSize = getTotalHeaderSize(vkFormat, numMipLevels, bytesOfKeyValueData); const uint32_t totalDataSize = getTotalDataSize(vkFormat, width, height, numMipLevels); auto buffer = getBuffer(totalHeaderSize + totalDataSize); populateMinimalValidFile( buffer, vkFormat, width, height, numMipLevels, bytesOfKeyValueData, imageSize); Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( buffer.data(), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_EQ(loader, nullptr); EXPECT_FALSE(ret.isOk()); } TEST_F(Ktx2TextureLoaderTest, InvalidHeaderWithExcessiveImageSize_Fails) { const uint32_t width = 64u; const uint32_t height = 32u; const uint32_t numMipLevels = 1u; const uint32_t bytesOfKeyValueData = 0u; const uint32_t imageSize = 4294967290u; const uint32_t vkFormat = VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG; const uint32_t totalHeaderSize = getTotalHeaderSize(vkFormat, numMipLevels, bytesOfKeyValueData); const uint32_t totalDataSize = getTotalDataSize(vkFormat, width, height, numMipLevels); auto buffer = getBuffer(totalHeaderSize + totalDataSize); populateMinimalValidFile( buffer, vkFormat, width, height, numMipLevels, bytesOfKeyValueData, imageSize); Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( buffer.data(), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_EQ(loader, nullptr); EXPECT_FALSE(ret.isOk()); } TEST_F(Ktx2TextureLoaderTest, InvalidHeaderWithExcessiveMipLevels_Fails) { const uint32_t width = 64u; const uint32_t height = 32u; const uint32_t numMipLevels = 4294967290u; const uint32_t bytesOfKeyValueData = 0u; const uint32_t imageSize = 512u; const uint32_t vkFormat = VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG; const uint32_t totalHeaderSize = getTotalHeaderSize(vkFormat, 6u, bytesOfKeyValueData); const uint32_t totalDataSize = getTotalDataSize(vkFormat, width, height, 6u); auto buffer = getBuffer(totalHeaderSize + totalDataSize); populateMinimalValidFile(buffer, vkFormat, width, height, numMipLevels, bytesOfKeyValueData, imageSize, true) /* forceDfdAfterMipLevel1*/; Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( buffer.data(), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_EQ(loader, nullptr); EXPECT_FALSE(ret.isOk()); } TEST_F(Ktx2TextureLoaderTest, InvalidHeaderWithExcessiveKeyValueData_Fails) { const uint32_t width = 64u; const uint32_t height = 32u; const uint32_t numMipLevels = 1u; const uint32_t bytesOfKeyValueData = 4294967290u; const uint32_t imageSize = 512u; const uint32_t vkFormat = VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG; const uint32_t totalHeaderSize = getTotalHeaderSize(vkFormat, numMipLevels, bytesOfKeyValueData); const uint32_t totalDataSize = getTotalDataSize(vkFormat, width, height, numMipLevels); auto buffer = getBuffer(totalHeaderSize + totalDataSize); populateMinimalValidFile( buffer, vkFormat, width, height, numMipLevels, bytesOfKeyValueData, imageSize); Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( buffer.data(), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_EQ(loader, nullptr); EXPECT_FALSE(ret.isOk()); } TEST_F(Ktx2TextureLoaderTest, MinimumValidHeader1x1Rgba8Succeeds) { const uint32_t width = 1u; const uint32_t height = 1u; const uint32_t numMipLevels = 1u; const uint32_t bytesOfKeyValueData = 0u; const uint32_t imageSize = 4u; const uint32_t vkFormat = VK_FORMAT_R8G8B8A8_UNORM; const uint32_t totalHeaderSize = getTotalHeaderSize(vkFormat, numMipLevels, bytesOfKeyValueData); const uint32_t totalDataSize = getTotalDataSize(vkFormat, width, height, numMipLevels); auto buffer = getBuffer(totalHeaderSize + totalDataSize); populateMinimalValidFile( buffer, vkFormat, width, height, numMipLevels, bytesOfKeyValueData, imageSize); Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( buffer.data(), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_NE(loader, nullptr); EXPECT_TRUE(ret.isOk()) << ret.message; } } // namespace igl::tests::ktx2 ================================================ FILE: src/igl/tests/iglu/texture_loader/StbHdrTextureLoaderTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include namespace igl::tests::stb::hdr { namespace { std::string populateMinimalValidFile(bool radiance, uint32_t width, uint32_t height) { std::stringstream ss; ss << "#?" << (radiance ? "RADIANCE" : "RGBE") << "\n"; ss << "FORMAT=32-bit_rle_rgbe\n"; ss << "\n"; ss << "-Y " << width << " +X " << height << "\n"; return ss.str(); } } // namespace class StbHdrTextureLoaderTest : public ::testing::Test { public: void SetUp() override {} void TearDown() override {} protected: iglu::textureloader::stb::hdr::TextureLoaderFactory factory_; }; TEST_F(StbHdrTextureLoaderTest, EmptyBuffer_Fails) { std::string buffer; buffer.resize(iglu::textureloader::stb::hdr::kHeaderLength); Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate(reinterpret_cast(buffer.data()), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_EQ(loader, nullptr); EXPECT_FALSE(ret.isOk()); } TEST_F(StbHdrTextureLoaderTest, MinimumValidRadianceHeader_Succeeds) { const uint32_t width = 64u; const uint32_t height = 32u; const bool radiance = true; auto buffer = populateMinimalValidFile(radiance, width, height); Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate(reinterpret_cast(buffer.data()), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_NE(loader, nullptr); EXPECT_TRUE(ret.isOk()) << ret.message; } TEST_F(StbHdrTextureLoaderTest, MinimumValidRgbeHeader_Succeeds) { const uint32_t width = 64u; const uint32_t height = 32u; const bool radiance = false; auto buffer = populateMinimalValidFile(radiance, width, height); Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate(reinterpret_cast(buffer.data()), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_NE(loader, nullptr); EXPECT_TRUE(ret.isOk()) << ret.message; } TEST_F(StbHdrTextureLoaderTest, ValidHeaderWithExtraData_Succeeds) { const uint32_t width = 64u; const uint32_t height = 32u; const bool radiance = true; auto buffer = populateMinimalValidFile(radiance, width, height); buffer.resize(buffer.size() + 1); Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate(reinterpret_cast(buffer.data()), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_NE(loader, nullptr); EXPECT_TRUE(ret.isOk()) << ret.message; } TEST_F(StbHdrTextureLoaderTest, InsufficientData_Fails) { std::string buffer = "?RADIANCE\n"; Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate(reinterpret_cast(buffer.data()), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_EQ(loader, nullptr); EXPECT_FALSE(ret.isOk()); } } // namespace igl::tests::stb::hdr ================================================ FILE: src/igl/tests/iglu/texture_loader/StbJpegTextureLoaderTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include namespace igl::tests::stb::jpeg { namespace { /// Valid JPEG data constexpr std::array kTestImageData = { 0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0xFF, 0xDB, 0x00, 0x43, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xDB, 0x00, 0x43, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xC0, 0x00, 0x11, 0x08, 0x00, 0x01, 0x00, 0x01, 0x03, 0x01, 0x11, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xFF, 0xC4, 0x00, 0x14, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xC4, 0x00, 0x14, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC4, 0x00, 0x14, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC4, 0x00, 0x14, 0x11, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3F, 0x00, 0x7F, 0x00, 0xFF, 0xD9}; /// Image data that declares that the JPEG image is a large image size - ~1GB (within constraints) constexpr std::array kTestLargeImageData = { 0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0xFF, 0xDB, 0x00, 0x43, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xDB, 0x00, 0x43, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xC0, 0x00, 0x11, 0x08, 0x10, 0x00, 0x40, 0x00, 0x03, 0x01, 0x11, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xFF, 0xC4, 0x00, 0x14, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xC4, 0x00, 0x14, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC4, 0x00, 0x14, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC4, 0x00, 0x14, 0x11, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3F, 0x00, 0x7F, 0x00, 0xFF, 0xD9}; /// Image data that declares that the JPEG image is a large image size ~1.9GB (within constraints) constexpr std::array kTestVeryLargeImageData = { 0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0xFF, 0xDB, 0x00, 0x43, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xDB, 0x00, 0x43, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xC0, 0x00, 0x11, 0x08, 0x46, 0x50, 0x46, 0x50, 0x03, 0x01, 0x11, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xFF, 0xC4, 0x00, 0x14, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xC4, 0x00, 0x14, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC4, 0x00, 0x14, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC4, 0x00, 0x14, 0x11, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3F, 0x00, 0x7F, 0x00, 0xFF, 0xD9}; /// Image data that declares that the JPEG image is a really large image size ~8GB (exceeds limit) constexpr std::array kTestOversizedImageData = { 0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0xFF, 0xDB, 0x00, 0x43, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xDB, 0x00, 0x43, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xC0, 0x00, 0x11, 0x08, 0xd1, 0x06, 0xd1, 0x06, 0x03, 0x01, 0x11, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xFF, 0xC4, 0x00, 0x14, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xC4, 0x00, 0x14, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC4, 0x00, 0x14, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC4, 0x00, 0x14, 0x11, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3F, 0x00, 0x7F, 0x00, 0xFF, 0xD9}; /// Invalid JPEG Data constexpr std::array kTestCorruptedImageData = { 0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0xFF, 0xDB, 0x00, 0x43, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xDB, 0x00, 0x43, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}; constexpr const std::array kSingleBlackPixelGrayscreenPNG{ {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x7E, 0x9B, 0x55, 0x00, 0x00, 0x00, 0x0A, 0x49, 0x44, 0x41, 0x54, 0x08, 0xD7, 0x63, 0x60, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0xE2, 0x21, 0xBC, 0x33, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82}}; constexpr const std::array kSingleWhitePixelGrayscreenJPG{ {0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0xFF, 0xDB, 0x00, 0x43, 0x00, 0x03, 0x02, 0x02, 0x03, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x04, 0x03, 0x03, 0x04, 0x05, 0x08, 0x05, 0x05, 0x04, 0x04, 0x05, 0x0A, 0x07, 0x07, 0x06, 0x08, 0x0C, 0x0A, 0x0C, 0x0C, 0x0B, 0x0A, 0x0B, 0x0B, 0x0D, 0x0E, 0x12, 0x10, 0x0D, 0x0E, 0x11, 0x0E, 0x0B, 0x0B, 0x10, 0x16, 0x10, 0x11, 0x13, 0x14, 0x15, 0x15, 0x15, 0x0C, 0x0F, 0x17, 0x18, 0x16, 0x14, 0x18, 0x12, 0x14, 0x15, 0x14, 0xFF, 0xC0, 0x00, 0x0B, 0x08, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x11, 0x00, 0xFF, 0xC4, 0x00, 0x14, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0xC4, 0x00, 0x14, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xDA, 0x00, 0x08, 0x01, 0x01, 0x00, 0x00, 0x3F, 0x00, 0x54, 0xDF, 0xFF, 0xD9}}; std::vector populateMinimalValidFile(uint16_t width, uint16_t height) { const uint8_t w1 = static_cast((width & 0xFF00) >> 8); const uint8_t w2 = static_cast(width & 0xFF); const uint8_t h1 = static_cast((height & 0xFF00) >> 8); const uint8_t h2 = static_cast(height & 0xFF); return {0xFF, 0xD8, // File Marker 0xFF, 0xE0, 0x00, 0x10, // APP0 marker + Length 'J', 'F', 'I', 'F', 0x00, 0x01, 0x02, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, // End of APP0 0xFF, 0xC0, 0x00, 0x11, // SOF0 marker + Length 0x08, h1, h2, w1, w2, 0x03, 'R', 0x11, 0x01, 'G', 0x11, 0x01, 'B', 0x11, 0x01}; } } // namespace class StbJpegTextureLoaderTest : public ::testing::Test { public: void SetUp() override {} void TearDown() override {} protected: iglu::textureloader::stb::jpeg::TextureLoaderFactory factory_; }; TEST_F(StbJpegTextureLoaderTest, EmptyBuffer_Fails) { std::vector buffer; buffer.resize(iglu::textureloader::stb::jpeg::kHeaderLength); Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( buffer.data(), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_EQ(loader, nullptr); EXPECT_FALSE(ret.isOk()); } TEST_F(StbJpegTextureLoaderTest, MinimumValidHeader_Succeeds) { const auto buffer = populateMinimalValidFile(64, 32); Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( buffer.data(), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_NE(loader, nullptr); EXPECT_TRUE(ret.isOk()) << ret.message; } TEST_F(StbJpegTextureLoaderTest, ValidHeaderWithExtraData_Succeeds) { auto buffer = populateMinimalValidFile(64, 32); buffer.resize(buffer.size() + 1); Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( buffer.data(), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_NE(loader, nullptr); EXPECT_TRUE(ret.isOk()) << ret.message; } TEST_F(StbJpegTextureLoaderTest, InsufficientData_Fails) { auto buffer = populateMinimalValidFile(64, 32); buffer.resize(buffer.size() - 5); Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( buffer.data(), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_EQ(loader, nullptr); EXPECT_FALSE(ret.isOk()); } TEST_F(StbJpegTextureLoaderTest, ValidData_Succceeds) { Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( kTestImageData.data(), static_cast(kTestImageData.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_NE(loader, nullptr); EXPECT_TRUE(ret.isOk()) << ret.message; } TEST_F(StbJpegTextureLoaderTest, LargeData_Succeeds) { Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( kTestLargeImageData.data(), static_cast(kTestLargeImageData.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_NE(loader, nullptr); EXPECT_TRUE(ret.isOk()) << ret.message; } TEST_F(StbJpegTextureLoaderTest, VeryLargeData_Succeeds) { Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( kTestVeryLargeImageData.data(), static_cast(kTestVeryLargeImageData.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_NE(loader, nullptr); EXPECT_TRUE(ret.isOk()) << ret.message; } TEST_F(StbJpegTextureLoaderTest, OversizedData_Fails) { Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( kTestOversizedImageData.data(), static_cast(kTestOversizedImageData.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_EQ(loader, nullptr); EXPECT_FALSE(ret.isOk()); } TEST_F(StbJpegTextureLoaderTest, CorruptedData_Fails) { Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( kTestCorruptedImageData.data(), static_cast(kTestCorruptedImageData.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_EQ(loader, nullptr); EXPECT_FALSE(ret.isOk()); } TEST_F(StbJpegTextureLoaderTest, JpegData_Succeeds) { Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( kSingleWhitePixelGrayscreenJPG.data(), static_cast(kSingleWhitePixelGrayscreenJPG.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_NE(loader, nullptr); EXPECT_TRUE(ret.isOk()) << ret.message; } TEST_F(StbJpegTextureLoaderTest, PngData_Fails) { Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( kSingleBlackPixelGrayscreenPNG.data(), static_cast(kSingleBlackPixelGrayscreenPNG.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_EQ(loader, nullptr); EXPECT_FALSE(ret.isOk()); } } // namespace igl::tests::stb::jpeg ================================================ FILE: src/igl/tests/iglu/texture_loader/StbPngTextureLoaderTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include namespace igl::tests::stb::png { namespace { constexpr const std::array kSingleBlackPixelGrayscreenPNG{ {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x7E, 0x9B, 0x55, 0x00, 0x00, 0x00, 0x0A, 0x49, 0x44, 0x41, 0x54, 0x08, 0xD7, 0x63, 0x60, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0xE2, 0x21, 0xBC, 0x33, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82}}; constexpr const std::array kSingleWhitePixelGrayscreenJPG{ {0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0xFF, 0xDB, 0x00, 0x43, 0x00, 0x03, 0x02, 0x02, 0x03, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x04, 0x03, 0x03, 0x04, 0x05, 0x08, 0x05, 0x05, 0x04, 0x04, 0x05, 0x0A, 0x07, 0x07, 0x06, 0x08, 0x0C, 0x0A, 0x0C, 0x0C, 0x0B, 0x0A, 0x0B, 0x0B, 0x0D, 0x0E, 0x12, 0x10, 0x0D, 0x0E, 0x11, 0x0E, 0x0B, 0x0B, 0x10, 0x16, 0x10, 0x11, 0x13, 0x14, 0x15, 0x15, 0x15, 0x0C, 0x0F, 0x17, 0x18, 0x16, 0x14, 0x18, 0x12, 0x14, 0x15, 0x14, 0xFF, 0xC0, 0x00, 0x0B, 0x08, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x11, 0x00, 0xFF, 0xC4, 0x00, 0x14, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0xC4, 0x00, 0x14, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xDA, 0x00, 0x08, 0x01, 0x01, 0x00, 0x00, 0x3F, 0x00, 0x54, 0xDF, 0xFF, 0xD9}}; constexpr const std::array kRed2x2PNG{ {0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x08, 0x02, 0x00, 0x00, 0x00, 0xfd, 0xd4, 0x9a, 0x73, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1, 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0e, 0xc3, 0x00, 0x00, 0x0e, 0xc3, 0x01, 0xc7, 0x6f, 0xa8, 0x64, 0x00, 0x00, 0x00, 0x15, 0x49, 0x44, 0x41, 0x54, 0x18, 0x57, 0x63, 0x78, 0x67, 0x64, 0xf5, 0x56, 0x4e, 0x8d, 0x01, 0x88, 0xdf, 0xdb, 0xb9, 0x02, 0x00, 0x26, 0xc4, 0x05, 0x2f, 0x43, 0xee, 0xb8, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82}}; std::vector populateMinimalValidFile(uint32_t width, uint32_t height) { const uint8_t w1 = static_cast((width & 0xFF000000) >> 24); const uint8_t w2 = static_cast((width & 0xFF0000) >> 16); const uint8_t w3 = static_cast((width & 0xFF00) >> 8); const uint8_t w4 = static_cast(width & 0xFF); const uint8_t h1 = static_cast((height & 0xFF000000) >> 24); const uint8_t h2 = static_cast((height & 0xFF0000) >> 16); const uint8_t h3 = static_cast((height & 0xFF00) >> 8); const uint8_t h4 = static_cast(height & 0xFF); return { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, // File Marker 0x00, 0x00, 0x00, 0x0D, // Chunk Length 'I', 'H', 'D', 'R', // IHDR chunk w1, w2, w3, w4, // Width h1, h2, h3, h4, // Height 0x08, // Bit Depth 0x02, // Color Type 0x00, // Compression Method 0x00, // Filter Method 0x00, // Interlace Method 0x00, 0x00, 0x00, 0x00, // Chunk CRC 0x00, 0x00, 0x00, 0x00, // Chunk Length 'I', 'D', 'A', 'T', // IHDR chunk 0x00, 0x00, 0x00, 0x00, // Chunk CRC }; } } // namespace class StbPngTextureLoaderTest : public ::testing::Test { public: void SetUp() override {} void TearDown() override {} protected: iglu::textureloader::stb::png::TextureLoaderFactory factory_; }; TEST_F(StbPngTextureLoaderTest, EmptyBuffer_Fails) { std::vector buffer; buffer.resize(iglu::textureloader::stb::png::kHeaderLength); Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( buffer.data(), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_EQ(loader, nullptr); EXPECT_FALSE(ret.isOk()); } TEST_F(StbPngTextureLoaderTest, MinimumValidHeader_Succeeds) { const auto buffer = populateMinimalValidFile(32u, 64u); Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( buffer.data(), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_NE(loader, nullptr); EXPECT_TRUE(ret.isOk()) << ret.message; } TEST_F(StbPngTextureLoaderTest, ValidHeaderWithExtraData_Succeeds) { auto buffer = populateMinimalValidFile(32u, 64u); buffer.resize(buffer.size() + 1); Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( buffer.data(), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_NE(loader, nullptr); EXPECT_TRUE(ret.isOk()) << ret.message; } TEST_F(StbPngTextureLoaderTest, InsufficientData_Fails) { auto buffer = populateMinimalValidFile(32u, 64u); buffer.resize(buffer.size() - 8); Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( buffer.data(), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_EQ(loader, nullptr); EXPECT_FALSE(ret.isOk()); } TEST_F(StbPngTextureLoaderTest, JpegData_Fails) { Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( kSingleWhitePixelGrayscreenJPG.data(), static_cast(kSingleWhitePixelGrayscreenJPG.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_EQ(loader, nullptr); EXPECT_FALSE(ret.isOk()); } TEST_F(StbPngTextureLoaderTest, PngData_Succeeds) { Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( kSingleBlackPixelGrayscreenPNG.data(), static_cast(kSingleBlackPixelGrayscreenPNG.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_NE(loader, nullptr); EXPECT_TRUE(ret.isOk()) << ret.message; } TEST_F(StbPngTextureLoaderTest, PngData2x2_Succeeds) { Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( kRed2x2PNG.data(), static_cast(kRed2x2PNG.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_NE(loader, nullptr); ASSERT_TRUE(ret.isOk()) << ret.message; auto data = loader->load(&ret); EXPECT_NE(data, nullptr); ASSERT_TRUE(ret.isOk()) << ret.message; EXPECT_EQ(data->size(), 4u * 4u); } } // namespace igl::tests::stb::png ================================================ FILE: src/igl/tests/iglu/texture_loader/TextureLoaderFactoryTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../../util/Common.h" #include #include #include #include #include #include namespace igl::tests { class TextureLoaderFactoryTest : public ::testing::Test { private: public: TextureLoaderFactoryTest() = default; ~TextureLoaderFactoryTest() override = default; void SetUp() override { util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_TRUE(iglDev_ != nullptr); ASSERT_TRUE(cmdQueue_ != nullptr); } void TearDown() override { // T32: Explicitly release device and command queue to prevent D3D12 resource accumulation // across many tests. This ensures D3D12 resources are freed before the next test starts. cmdQueue_.reset(); iglDev_.reset(); } static std::vector> createLoaderFactories() { std::vector> factories; factories.reserve(5); factories.emplace_back(std::make_unique()); factories.emplace_back( std::make_unique()); factories.emplace_back(std::make_unique()); factories.emplace_back(std::make_unique()); factories.emplace_back(std::make_unique()); return factories; } // Member variables protected: void runLoadTest(const uint8_t* data, uint32_t size, const char* tag); iglu::textureloader::TextureLoaderFactory factory_{createLoaderFactories()}; std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; }; void TextureLoaderFactoryTest::runLoadTest(const uint8_t* data, uint32_t size, const char* tag) { ASSERT_NE(data, nullptr) << tag; Result result; auto loader = factory_.tryCreate(data, size, &result); ASSERT_NE(loader, nullptr) << tag; ASSERT_TRUE(result.isOk()) << tag << " " << result.message; auto texture = loader->create(*iglDev_, &result); ASSERT_NE(texture, nullptr) << tag; ASSERT_TRUE(result.isOk()) << tag << " " << result.message; loader->upload(*texture, &result); ASSERT_TRUE(result.isOk()) << tag << " " << result.message; if (loader->shouldGenerateMipmaps()) { texture->generateMipmap(*cmdQueue_); } } namespace { constexpr const std::array kSinglePixelPng{ {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x7E, 0x9B, 0x55, 0x00, 0x00, 0x00, 0x0A, 0x49, 0x44, 0x41, 0x54, 0x08, 0xD7, 0x63, 0x60, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0xE2, 0x21, 0xBC, 0x33, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82}}; } TEST_F(TextureLoaderFactoryTest, loadPng) { runLoadTest(kSinglePixelPng.data(), kSinglePixelPng.size(), "PNG"); } namespace { constexpr const std::array kSinglePixelJpg{ {0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0xFF, 0xDB, 0x00, 0x43, 0x00, 0x03, 0x02, 0x02, 0x03, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x04, 0x03, 0x03, 0x04, 0x05, 0x08, 0x05, 0x05, 0x04, 0x04, 0x05, 0x0A, 0x07, 0x07, 0x06, 0x08, 0x0C, 0x0A, 0x0C, 0x0C, 0x0B, 0x0A, 0x0B, 0x0B, 0x0D, 0x0E, 0x12, 0x10, 0x0D, 0x0E, 0x11, 0x0E, 0x0B, 0x0B, 0x10, 0x16, 0x10, 0x11, 0x13, 0x14, 0x15, 0x15, 0x15, 0x0C, 0x0F, 0x17, 0x18, 0x16, 0x14, 0x18, 0x12, 0x14, 0x15, 0x14, 0xFF, 0xC0, 0x00, 0x0B, 0x08, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x11, 0x00, 0xFF, 0xC4, 0x00, 0x14, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0xC4, 0x00, 0x14, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xDA, 0x00, 0x08, 0x01, 0x01, 0x00, 0x00, 0x3F, 0x00, 0x54, 0xDF, 0xFF, 0xD9}}; } TEST_F(TextureLoaderFactoryTest, loadJpg) { runLoadTest(kSinglePixelJpg.data(), kSinglePixelJpg.size(), "JPG"); } namespace { constexpr const std::array kSinglePixelHdr{ {'#', '?', 'R', 'A', 'D', 'I', 'A', 'N', 'C', 'E', '\n', 'S', 'O', 'F', 'T', 'W', 'A', 'R', 'E', '=', 'G', 'E', 'G', 'L', '\n', 'F', 'O', 'R', 'M', 'A', 'T', '=', '3', '2', '-', 'b', 'i', 't', '_', 'r', 'l', 'e', '_', 'r', 'g', 'b', 'e', '\n', '\n', '-', 'Y', ' ', '1', ' ', '+', 'X', ' ', '1', '\n', 0x80, 0x80, 0x80, 0x81}}; } TEST_F(TextureLoaderFactoryTest, loadHdr) { runLoadTest(kSinglePixelHdr.data(), kSinglePixelHdr.size(), "HDR"); } namespace { constexpr const std::array kSinglePixelKtx1{ 0xab, 0x4b, 0x54, 0x58, 0x20, 0x31, 0x31, 0xbb, 0x0d, 0x0a, 0x1a, 0x0a, 0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; } TEST_F(TextureLoaderFactoryTest, loadKtx1) { runLoadTest(kSinglePixelKtx1.data(), kSinglePixelKtx1.size(), "KTX1"); } namespace { constexpr const std::array kSinglePixelKtx2{ 0xab, 0x4b, 0x54, 0x58, 0x20, 0x32, 0x30, 0xbb, 0x0d, 0x0a, 0x1a, 0x0a, 0x25, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x58, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x08, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x10, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x18, 0x00, 0x07, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; } TEST_F(TextureLoaderFactoryTest, loadKtx2) { runLoadTest(kSinglePixelKtx2.data(), kSinglePixelKtx2.size(), "KTX2"); } } // namespace igl::tests ================================================ FILE: src/igl/tests/iglu/texture_loader/Xtc1TextureLoaderTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #if !defined(IGL_CMAKE_BUILD) // @fb-only #include #include #include #include #include #include // @fb-only // @fb-only // @fb-only namespace igl::tests::xtc1 { namespace { std::vector createXtc1TextureData(uint32_t width, uint32_t height) { // Create a simple RGBA8 test pattern const uint32_t numPixels = width * height; const uint32_t rgbaDataSize = numPixels * 4; std::vector rgbaData(rgbaDataSize); // Create a checkerboard pattern for (uint32_t y = 0; y < height; ++y) { for (uint32_t x = 0; x < width; ++x) { const uint32_t offset = (y * width + x) * 4; const bool isWhite = ((x / 8) + (y / 8)) % 2 == 0; rgbaData[offset + 0] = isWhite ? 255 : 0; // R rgbaData[offset + 1] = isWhite ? 255 : 0; // G rgbaData[offset + 2] = isWhite ? 255 : 0; // B rgbaData[offset + 3] = 255; // A } } // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // Create the full texture data with header const uint32_t totalSize = sizeof(iglu::textureloader::xtc1::Header) + compressedSize; std::vector textureData(totalSize); // Write header auto* header = reinterpret_cast(textureData.data()); header->magicTag = {0x49, 0x56, 0x41, 0x4e}; header->width = width; header->height = height; header->numChannels = 4; header->lossless = 0; header->impasto = 1; header->numMips = 1; header->mipSizes[0] = static_cast(compressedSize); // Write compressed data // @fb-only // @fb-only // @fb-only // @fb-only return textureData; } } // namespace class Xtc1TextureLoaderTest : public ::testing::Test { public: void SetUp() override { setDebugBreakEnabled(false); } void TearDown() override {} protected: iglu::textureloader::xtc1::TextureLoaderFactory factory_; }; TEST_F(Xtc1TextureLoaderTest, HeaderTagValidation) { // Test valid tag iglu::textureloader::xtc1::Header validHeader; validHeader.magicTag = {0x49, 0x56, 0x41, 0x4e}; EXPECT_TRUE(validHeader.tagIsValid()); // Test invalid tag iglu::textureloader::xtc1::Header invalidHeader; invalidHeader.magicTag = {0x00, 0x00, 0x00, 0x00}; EXPECT_FALSE(invalidHeader.tagIsValid()); } TEST_F(Xtc1TextureLoaderTest, EmptyBuffer_Fails) { // Create a buffer that's too small (less than header size) std::vector buffer(4); // Only 4 bytes, need at least 8 for header Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( buffer.data(), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_EQ(loader, nullptr); EXPECT_FALSE(ret.isOk()); } TEST_F(Xtc1TextureLoaderTest, MinimalHeader_Succeeds) { const uint32_t width = 64u; const uint32_t height = 64u; auto textureData = createXtc1TextureData(width, height); ASSERT_FALSE(textureData.empty()); Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( textureData.data(), static_cast(textureData.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_NE(loader, nullptr); EXPECT_TRUE(ret.isOk()) << ret.message; if (loader) { const auto& desc = loader->descriptor(); EXPECT_EQ(desc.width, width); EXPECT_EQ(desc.height, height); // XTC1 textures use compressed format, not uncompressed RGBA8 // @fb-only } } TEST_F(Xtc1TextureLoaderTest, InvalidHeader_Fails) { std::vector buffer(sizeof(iglu::textureloader::xtc1::Header)); auto* header = reinterpret_cast(buffer.data()); header->width = 0; // Invalid width header->height = 64; Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( buffer.data(), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_EQ(loader, nullptr); EXPECT_FALSE(ret.isOk()); } TEST_F(Xtc1TextureLoaderTest, ExcessiveWidth_Fails) { std::vector buffer(sizeof(iglu::textureloader::xtc1::Header)); auto* header = reinterpret_cast(buffer.data()); // @fb-only header->height = 64; Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( buffer.data(), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); EXPECT_EQ(loader, nullptr); EXPECT_FALSE(ret.isOk()); } TEST_F(Xtc1TextureLoaderTest, LoadData_Succeeds) { const uint32_t width = 64u; const uint32_t height = 64u; auto textureData = createXtc1TextureData(width, height); ASSERT_FALSE(textureData.empty()); Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( textureData.data(), static_cast(textureData.size()), nullptr); auto loader = factory_.tryCreate(reader, &ret); ASSERT_NE(loader, nullptr); ASSERT_TRUE(ret.isOk()); auto data = loader->load(&ret); EXPECT_NE(data, nullptr); EXPECT_TRUE(ret.isOk()) << ret.message; if (data) { // XTC1 textures return compressed data, not decompressed // The size should be the compressed size, which is less than uncompressed const uint32_t compressedSize = static_cast(textureData.size()) - sizeof(iglu::textureloader::xtc1::Header); EXPECT_EQ(data->size(), compressedSize); // Verify compressed data is smaller than uncompressed (64x64 RGBA8 = 16384 bytes) EXPECT_LT(data->size(), width * height * 4); } } TEST_F(Xtc1TextureLoaderTest, MinHeaderLength) { // Test that minHeaderLength returns the correct value auto minLength = factory_.minHeaderLength(); EXPECT_EQ(minLength, sizeof(iglu::textureloader::xtc1::Header)); } TEST_F(Xtc1TextureLoaderTest, CanCreateWithValidHeader) { const uint32_t width = 64u; const uint32_t height = 64u; auto textureData = createXtc1TextureData(width, height); ASSERT_FALSE(textureData.empty()); Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( textureData.data(), static_cast(textureData.size()), nullptr); EXPECT_TRUE(factory_.canCreate(reader, &ret)); EXPECT_TRUE(ret.isOk()); } TEST_F(Xtc1TextureLoaderTest, CanCreateFailsWithInvalidTag) { std::vector buffer(sizeof(iglu::textureloader::xtc1::Header)); auto* header = reinterpret_cast(buffer.data()); header->magicTag = {0x00, 0x00, 0x00, 0x00}; // Invalid magic tag header->width = 64; header->height = 64; Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( buffer.data(), static_cast(buffer.size()), nullptr); EXPECT_FALSE(factory_.canCreate(reader, &ret)); EXPECT_FALSE(ret.isOk()); } TEST_F(Xtc1TextureLoaderTest, TryCreateFailsWithSmallBuffer) { std::vector buffer(4); // Too small Result ret; auto reader = *iglu::textureloader::DataReader::tryCreate( buffer.data(), static_cast(buffer.size()), nullptr); auto loader = factory_.tryCreate(reader, TextureFormat::RGBA_UNorm8, &ret); EXPECT_EQ(loader, nullptr); EXPECT_FALSE(ret.isOk()); } } // namespace igl::tests::xtc1 // @fb-only #endif // IGL_CMAKE_BUILD ================================================ FILE: src/igl/tests/main.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ /* * Custom test entrypoint: initialize COM for D3D12 before running gtest. */ #include #include #include // COM initialization is only needed for D3D12 tests // IGL_D3D12_TEST is defined only in iglD3D12Tests build #if defined(_WIN32) && defined(IGL_D3D12_TEST) #include #include #endif static void signalHandler(int signum) { std::printf("CRASH: Signal %d caught\n", signum); std::_Exit(signum); } int main(int argc, char** argv) { // Install basic signal handler for early crash diagnostics std::signal(SIGSEGV, signalHandler); // Initialize COM in multithreaded mode for D3D12 usage (Windows only) #if defined(_WIN32) && defined(IGL_D3D12_TEST) const HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED); if (FAILED(hr)) { std::printf("COM initialization failed: 0x%08X\n", static_cast(hr)); return 1; } #endif ::testing::InitGoogleTest(&argc, argv); const int result = RUN_ALL_TESTS(); #if defined(_WIN32) && defined(IGL_D3D12_TEST) CoUninitialize(); #endif return result; } ================================================ FILE: src/igl/tests/metal/BindGroup.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include "../util/TestDevice.h" #include namespace igl::tests { // // MetalBindGroupTest // // This test covers bind group creation and destruction on Metal. // class MetalBindGroupTest : public ::testing::Test { public: MetalBindGroupTest() = default; ~MetalBindGroupTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(device_, cmdQueue_); ASSERT_NE(device_, nullptr); } void TearDown() override {} protected: std::shared_ptr device_; std::shared_ptr cmdQueue_; }; // // CreateTextureBindGroup // // Test creating a bind group with textures. // TEST_F(MetalBindGroupTest, CreateTextureBindGroup) { Result res; // Create a texture to put in the bind group TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 4, 4, TextureDesc::TextureUsageBits::Sampled); auto texture = device_->createTexture(texDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; // Create a sampler SamplerStateDesc samplerDesc = SamplerStateDesc::newLinear(); auto sampler = device_->createSamplerState(samplerDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; BindGroupTextureDesc bgDesc; bgDesc.textures[0] = texture; bgDesc.samplers[0] = sampler; bgDesc.debugName = "testTextureBindGroup"; auto handle = device_->createBindGroup(bgDesc, nullptr, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_TRUE(handle.valid()); } // // CreateBufferBindGroup // // Test creating a bind group with buffers. // TEST_F(MetalBindGroupTest, CreateBufferBindGroup) { Result res; // Create a buffer const float data[] = {1.0f, 2.0f, 3.0f, 4.0f}; const BufferDesc bufDesc{.type = BufferDesc::BufferTypeBits::Uniform, .data = data, .length = sizeof(data), .storage = ResourceStorage::Shared}; auto buffer = device_->createBuffer(bufDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; BindGroupBufferDesc bgDesc; bgDesc.buffers[0] = std::shared_ptr(std::move(buffer)); bgDesc.debugName = "testBufferBindGroup"; auto handle = device_->createBindGroup(bgDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_TRUE(handle.valid()); } // // DestroyBindGroup // // Test that destroying a bind group does not crash. // TEST_F(MetalBindGroupTest, DestroyBindGroup) { Result res; TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 4, 4, TextureDesc::TextureUsageBits::Sampled); auto texture = device_->createTexture(texDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; BindGroupTextureDesc bgDesc; bgDesc.textures[0] = texture; bgDesc.debugName = "testDestroyBindGroup"; auto handle = device_->createBindGroup(bgDesc, nullptr, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_TRUE(handle.valid()); // Release the handle (transfers ownership) and manually destroy it. // This should not crash. BindGroupTextureHandle rawHandle = handle.release(); device_->destroy(rawHandle); } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/Buffer.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../util/Common.h" #include "../util/TestDevice.h" #include #include #include namespace igl::tests { // // MetalBufferTest // // This test covers igl::metal::Buffer. // Tests creation, upload, mapping, and storage modes of Metal buffers. // class MetalBufferTest : public ::testing::Test { public: MetalBufferTest() = default; ~MetalBufferTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(device_, cmdQueue_); ASSERT_NE(device_, nullptr); } void TearDown() override {} protected: std::shared_ptr device_; std::shared_ptr cmdQueue_; }; // // CreateBufferWithData // // Test creating a buffer with initial data, verify size and content. // TEST_F(MetalBufferTest, CreateBufferWithData) { const float data[] = {1.0f, 2.0f, 3.0f, 4.0f}; const size_t dataSize = sizeof(data); const BufferDesc desc{.type = BufferDesc::BufferTypeBits::Uniform, .data = data, .length = dataSize, .storage = ResourceStorage::Shared, .debugName = "testBufferWithData"}; Result res; auto buffer = device_->createBuffer(desc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(buffer, nullptr); ASSERT_EQ(buffer->getSizeInBytes(), dataSize); // Map and verify data Result mapRes; auto* mapped = static_cast(buffer->map(BufferRange(dataSize, 0), &mapRes)); ASSERT_TRUE(mapRes.isOk()) << mapRes.message; ASSERT_NE(mapped, nullptr); ASSERT_EQ(mapped[0], 1.0f); ASSERT_EQ(mapped[1], 2.0f); ASSERT_EQ(mapped[2], 3.0f); ASSERT_EQ(mapped[3], 4.0f); buffer->unmap(); } // // CreateBufferEmpty // // Test creating a buffer without initial data. // TEST_F(MetalBufferTest, CreateBufferEmpty) { const size_t bufferSize = 256; const BufferDesc desc{.type = BufferDesc::BufferTypeBits::Uniform, .length = bufferSize, .storage = ResourceStorage::Shared, .debugName = "testBufferEmpty"}; Result res; auto buffer = device_->createBuffer(desc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(buffer, nullptr); ASSERT_EQ(buffer->getSizeInBytes(), bufferSize); } // // BufferUploadAndVerify // // Test uploading data to a buffer, then mapping and verifying the data matches. // TEST_F(MetalBufferTest, BufferUploadAndVerify) { const size_t bufferSize = 4 * sizeof(float); const BufferDesc desc{.type = BufferDesc::BufferTypeBits::Uniform, .length = bufferSize, .storage = ResourceStorage::Shared, .debugName = "testBufferUpload"}; Result res; auto buffer = device_->createBuffer(desc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(buffer, nullptr); const float uploadData[] = {10.0f, 20.0f, 30.0f, 40.0f}; res = buffer->upload(uploadData, BufferRange(sizeof(uploadData), 0)); ASSERT_TRUE(res.isOk()) << res.message; Result mapRes; auto* mapped = static_cast(buffer->map(BufferRange(bufferSize, 0), &mapRes)); ASSERT_TRUE(mapRes.isOk()) << mapRes.message; ASSERT_NE(mapped, nullptr); ASSERT_EQ(mapped[0], 10.0f); ASSERT_EQ(mapped[1], 20.0f); ASSERT_EQ(mapped[2], 30.0f); ASSERT_EQ(mapped[3], 40.0f); buffer->unmap(); } // // BufferMapUnmap // // Test mapping, writing, unmapping, then re-mapping to verify written data. // TEST_F(MetalBufferTest, BufferMapUnmap) { const size_t bufferSize = 4 * sizeof(float); const BufferDesc desc{.type = BufferDesc::BufferTypeBits::Uniform, .length = bufferSize, .storage = ResourceStorage::Shared, .debugName = "testMapUnmap"}; Result res; auto buffer = device_->createBuffer(desc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(buffer, nullptr); // Map and write data Result mapRes; auto* mapped = static_cast(buffer->map(BufferRange(bufferSize, 0), &mapRes)); ASSERT_TRUE(mapRes.isOk()) << mapRes.message; ASSERT_NE(mapped, nullptr); mapped[0] = 100.0f; mapped[1] = 200.0f; mapped[2] = 300.0f; mapped[3] = 400.0f; buffer->unmap(); // Re-map and verify auto* mapped2 = static_cast(buffer->map(BufferRange(bufferSize, 0), &mapRes)); ASSERT_TRUE(mapRes.isOk()) << mapRes.message; ASSERT_NE(mapped2, nullptr); ASSERT_EQ(mapped2[0], 100.0f); ASSERT_EQ(mapped2[1], 200.0f); ASSERT_EQ(mapped2[2], 300.0f); ASSERT_EQ(mapped2[3], 400.0f); buffer->unmap(); } // // StorageModeShared // // Verify that a buffer created with Shared storage mode reports Shared. // TEST_F(MetalBufferTest, StorageModeShared) { const size_t bufferSize = 64; const BufferDesc desc{.type = BufferDesc::BufferTypeBits::Uniform, .length = bufferSize, .storage = ResourceStorage::Shared, .debugName = "testSharedStorage"}; Result res; auto buffer = device_->createBuffer(desc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(buffer, nullptr); ASSERT_EQ(buffer->storage(), ResourceStorage::Shared); } // // RingBufferCreation // // Create a ring buffer and verify it is non-null. // TEST_F(MetalBufferTest, RingBufferCreation) { const size_t bufferSize = 256; const BufferDesc desc{.type = BufferDesc::BufferTypeBits::Uniform, .length = bufferSize, .storage = ResourceStorage::Shared, .hint = BufferDesc::BufferAPIHintBits::Ring, .debugName = "testRingBuffer"}; Result res; auto buffer = device_->createBuffer(desc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(buffer, nullptr); ASSERT_EQ(buffer->getSizeInBytes(), bufferSize); } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/BufferSynchronizationManager.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../util/Common.h" #include #include namespace igl::tests { // // CommandBufferMTLTest // // This test covers igl::metal::CommandBuffer. // Most of the testing revolves confirming successful instantiation // and creation of encoders. // #define IGL_METAL_MAX_IN_FLIGHT_BUFFERS 3 class BufferSynchronizationManagerMTLTest : public ::testing::Test { public: BufferSynchronizationManagerMTLTest() = default; ~BufferSynchronizationManagerMTLTest() override = default; void SetUp() override { setDebugBreakEnabled(false); bufferSyncManager_ = std::make_shared(IGL_METAL_MAX_IN_FLIGHT_BUFFERS); util::createDeviceAndQueue(device_, commandQueue_); } void TearDown() override {} protected: std::shared_ptr device_; std::shared_ptr commandQueue_; std::shared_ptr bufferSyncManager_; }; // // CommandBufferCreation // // Test successful creation of MTLCommandBuffer. // TEST_F(BufferSynchronizationManagerMTLTest, BufferSynchronizationManagerCreation) { ASSERT_EQ(bufferSyncManager_->getMaxInflightBuffers(), IGL_METAL_MAX_IN_FLIGHT_BUFFERS); ASSERT_EQ(bufferSyncManager_->getCurrentInFlightBufferIndex(), 0); } TEST_F(BufferSynchronizationManagerMTLTest, BufferSynchronizationManagerEndOfFrameSync) { bufferSyncManager_->manageEndOfFrameSync(); ASSERT_EQ(bufferSyncManager_->getCurrentInFlightBufferIndex(), 1); } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/BytesBinding.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../data/ShaderData.h" #include "../util/Common.h" #include "../util/TestDevice.h" #include #include #include namespace igl::tests { #define BYTES_TEX_WIDTH 8 #define BYTES_TEX_HEIGHT 8 // // MetalBytesBindingTest // // This test covers binding bytes to the render encoder on Metal. // Tests binding small constant data directly to vertex and fragment stages. // class MetalBytesBindingTest : public ::testing::Test { public: MetalBytesBindingTest() = default; ~MetalBytesBindingTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(device_, cmdQueue_); ASSERT_NE(device_, nullptr); Result res; // Create render target TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, BYTES_TEX_WIDTH, BYTES_TEX_HEIGHT, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); colorTexture_ = device_->createTexture(texDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; FramebufferDesc fbDesc; fbDesc.colorAttachments[0].texture = colorTexture_; framebuffer_ = device_->createFramebuffer(fbDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; const CommandBufferDesc cbDesc; commandBuffer_ = cmdQueue_->createCommandBuffer(cbDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; } void TearDown() override {} protected: std::shared_ptr device_; std::shared_ptr cmdQueue_; std::shared_ptr colorTexture_; std::shared_ptr framebuffer_; std::shared_ptr commandBuffer_; }; // // BindBytesVertex // // Test binding inline bytes to the vertex stage. // TEST_F(MetalBytesBindingTest, BindBytesVertex) { RenderPassDesc rpDesc; rpDesc.colorAttachments.resize(1); rpDesc.colorAttachments[0].loadAction = LoadAction::Clear; rpDesc.colorAttachments[0].storeAction = StoreAction::Store; auto encoder = commandBuffer_->createRenderCommandEncoder(rpDesc, framebuffer_); ASSERT_NE(encoder, nullptr); const float uniformData[] = {1.0f, 0.0f, 0.0f}; encoder->bindBytes(2, BindTarget::kVertex, uniformData, sizeof(uniformData)); encoder->endEncoding(); } // // BindBytesFragment // // Test binding inline bytes to the fragment stage. // TEST_F(MetalBytesBindingTest, BindBytesFragment) { RenderPassDesc rpDesc; rpDesc.colorAttachments.resize(1); rpDesc.colorAttachments[0].loadAction = LoadAction::Clear; rpDesc.colorAttachments[0].storeAction = StoreAction::Store; auto encoder = commandBuffer_->createRenderCommandEncoder(rpDesc, framebuffer_); ASSERT_NE(encoder, nullptr); const float uniformData[] = {0.0f, 1.0f, 0.0f, 1.0f}; encoder->bindBytes(2, BindTarget::kFragment, uniformData, sizeof(uniformData)); encoder->endEncoding(); } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/ColorSpace.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace igl::metal::tests { TEST(ColorSpaceTest, colorSpaceToCGColorSpace) { ASSERT_EQ(CGColorSpaceCreateWithName(kCGColorSpaceLinearSRGB), colorSpaceToCGColorSpace(ColorSpace::SRGB_LINEAR)); ASSERT_EQ(CGColorSpaceCreateWithName(kCGColorSpaceSRGB), colorSpaceToCGColorSpace(ColorSpace::SRGB_NONLINEAR)); ASSERT_EQ(CGColorSpaceCreateWithName(kCGColorSpaceDisplayP3), colorSpaceToCGColorSpace(ColorSpace::DISPLAY_P3_NONLINEAR)); ASSERT_EQ(CGColorSpaceCreateWithName(kCGColorSpaceExtendedLinearSRGB), colorSpaceToCGColorSpace(ColorSpace::EXTENDED_SRGB_LINEAR)); ASSERT_EQ(CGColorSpaceCreateWithName(kCGColorSpaceDCIP3), colorSpaceToCGColorSpace(ColorSpace::DCI_P3_NONLINEAR)); ASSERT_EQ(CGColorSpaceCreateWithName(kCGColorSpaceLinearSRGB), colorSpaceToCGColorSpace(ColorSpace::BT709_LINEAR)); ASSERT_EQ(CGColorSpaceCreateWithName(kCGColorSpaceITUR_709), colorSpaceToCGColorSpace(ColorSpace::BT709_NONLINEAR)); ASSERT_EQ(CGColorSpaceCreateWithName(kCGColorSpaceAdobeRGB1998), colorSpaceToCGColorSpace(ColorSpace::ADOBERGB_LINEAR)); ASSERT_EQ(CGColorSpaceCreateWithName(kCGColorSpaceAdobeRGB1998), colorSpaceToCGColorSpace(ColorSpace::ADOBERGB_NONLINEAR)); ASSERT_EQ(nil, colorSpaceToCGColorSpace(ColorSpace::PASS_THROUGH)); ASSERT_EQ(CGColorSpaceCreateWithName(kCGColorSpaceExtendedSRGB), colorSpaceToCGColorSpace(ColorSpace::EXTENDED_SRGB_NONLINEAR)); ASSERT_EQ(CGColorSpaceCreateWithName(kCGColorSpaceITUR_2020), colorSpaceToCGColorSpace(ColorSpace::BT2020_NONLINEAR)); if (@available(macOS 12.0, iOS 15.0, *)) { ASSERT_EQ(CGColorSpaceCreateWithName(kCGColorSpaceLinearDisplayP3), colorSpaceToCGColorSpace(ColorSpace::DISPLAY_P3_LINEAR)); ASSERT_EQ(CGColorSpaceCreateWithName(kCGColorSpaceLinearITUR_2020), colorSpaceToCGColorSpace(ColorSpace::BT2020_LINEAR)); } // can't test unsupported cases /*ASSERT_EQ(CGColorSpaceCreateWithName(kCGColorSpaceSRGB), colorSpaceToCGColorSpace(ColorSpace::HDR10_ST2084)); ASSERT_EQ(CGColorSpaceCreateWithName(kCGColorSpaceSRGB), colorSpaceToCGColorSpace(ColorSpace::DOLBYVISION)); ASSERT_EQ(CGColorSpaceCreateWithName(kCGColorSpaceSRGB), colorSpaceToCGColorSpace(ColorSpace::HDR10_HLG)); ASSERT_EQ(CGColorSpaceCreateWithName(kCGColorSpaceSRGB), colorSpaceToCGColorSpace(ColorSpace::DISPLAY_NATIVE_AMD)); ASSERT_EQ(CGColorSpaceCreateWithName(kCGColorSpaceSRGB), colorSpaceToCGColorSpace(ColorSpace::BT601_NONLINEAR)); ASSERT_EQ(CGColorSpaceCreateWithName(kCGColorSpaceSRGB), colorSpaceToCGColorSpace(ColorSpace::BT2100_HLG_NONLINEAR)); ASSERT_EQ(CGColorSpaceCreateWithName(kCGColorSpaceSRGB), colorSpaceToCGColorSpace(ColorSpace::BT2100_PQ_NONLINEAR));*/ } } // namespace igl::metal::tests ================================================ FILE: src/igl/tests/metal/CommandBuffer.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../util/Common.h" #include namespace igl::tests { // // CommandBufferMTLTest // // This test covers igl::metal::CommandBuffer. // Most of the testing revolves confirming successful instantiation // and creation of encoders. // class CommandBufferMTLTest : public ::testing::Test { public: CommandBufferMTLTest() = default; ~CommandBufferMTLTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(device_, commandQueue_); // Test instantiation and constructor of CommandBuffer. Result res; const CommandBufferDesc desc; commandBuffer_ = commandQueue_->createCommandBuffer(desc, &res); ASSERT_TRUE(res.isOk()); } void TearDown() override {} protected: std::shared_ptr device_; std::shared_ptr commandQueue_; std::shared_ptr commandBuffer_; }; // // CommandBufferCreation // // Test successful creation of MTLCommandBuffer. // TEST_F(CommandBufferMTLTest, CommandBufferCreation) { auto mtlBuffer = static_cast(*commandBuffer_).get(); ASSERT_NE(mtlBuffer, nullptr); } // // CreateComputeCommandEncoder // // Exercise the function createComputeCommandEncoder, // test successful creation of IComputeCommandEncoder object. // TEST_F(CommandBufferMTLTest, CreateComputeCommandEncoder) { auto encoder = commandBuffer_->createComputeCommandEncoder(); ASSERT_NE(encoder, nullptr); // MTLCommandEncoder must always call endEncoding before being released. encoder->endEncoding(); } // // CreateRenderCommandEncoderSimple // // Exercise the function createRenderCommandEncoder, // test successful creation of IRenderCommandEncoder object. // TEST_F(CommandBufferMTLTest, CreateRenderCommandEncoderSimple) { Result res; const FramebufferDesc fbDesc; auto frameBuffer = device_->createFramebuffer(fbDesc, &res); ASSERT_TRUE(res.isOk()); const RenderPassDesc rpDesc; auto encoder = commandBuffer_->createRenderCommandEncoder(rpDesc, frameBuffer); ASSERT_NE(encoder, nullptr); // MTLCommandEncoder must always call endEncoding before being released. encoder->endEncoding(); } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/CommandBufferOps.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include "../util/TestDevice.h" #include #include #include #include namespace igl::tests { // // MetalCommandBufferOpsTest // // This test covers command buffer operations on Metal. // Tests debug labels, buffer copying, and wait until completed. // class MetalCommandBufferOpsTest : public ::testing::Test { public: MetalCommandBufferOpsTest() = default; ~MetalCommandBufferOpsTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(device_, cmdQueue_); ASSERT_NE(device_, nullptr); } void TearDown() override {} protected: std::shared_ptr device_; std::shared_ptr cmdQueue_; }; // // DebugLabels // // Test pushing and popping debug labels on a command buffer without crash. // TEST_F(MetalCommandBufferOpsTest, DebugLabels) { Result res; const CommandBufferDesc cbDesc; auto cmdBuf = cmdQueue_->createCommandBuffer(cbDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(cmdBuf, nullptr); cmdBuf->pushDebugGroupLabel("TestGroup", Color(1, 0, 0, 1)); cmdBuf->popDebugGroupLabel(); } // // CopyBuffer // // Test copying data between two buffers via a command buffer. // TEST_F(MetalCommandBufferOpsTest, CopyBuffer) { Result res; // Create source buffer with data const float srcData[] = {1.0f, 2.0f, 3.0f, 4.0f}; BufferDesc srcDesc( BufferDesc::BufferTypeBits::Storage, srcData, sizeof(srcData), ResourceStorage::Shared); auto srcBuffer = device_->createBuffer(srcDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; // Create destination buffer (empty) BufferDesc dstDesc( BufferDesc::BufferTypeBits::Storage, nullptr, sizeof(srcData), ResourceStorage::Shared); auto dstBuffer = device_->createBuffer(dstDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; // Create command buffer and copy const CommandBufferDesc cbDesc; auto cmdBuf = cmdQueue_->createCommandBuffer(cbDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; cmdBuf->copyBuffer(*srcBuffer, *dstBuffer, 0, 0, sizeof(srcData)); cmdQueue_->submit(*cmdBuf); cmdBuf->waitUntilCompleted(); // Verify destination buffer contents Result mapRes; auto* mapped = static_cast(dstBuffer->map(BufferRange(sizeof(srcData), 0), &mapRes)); ASSERT_TRUE(mapRes.isOk()) << mapRes.message; ASSERT_NE(mapped, nullptr); ASSERT_EQ(mapped[0], 1.0f); ASSERT_EQ(mapped[1], 2.0f); ASSERT_EQ(mapped[2], 3.0f); ASSERT_EQ(mapped[3], 4.0f); dstBuffer->unmap(); } // // WaitUntilCompleted // // Test that waitUntilCompleted returns without timeout on a submitted command buffer. // TEST_F(MetalCommandBufferOpsTest, WaitUntilCompleted) { Result res; const CommandBufferDesc cbDesc; auto cmdBuf = cmdQueue_->createCommandBuffer(cbDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; // Create a compute encoder to make the command buffer non-empty auto encoder = cmdBuf->createComputeCommandEncoder(); ASSERT_NE(encoder, nullptr); encoder->endEncoding(); cmdQueue_->submit(*cmdBuf); cmdBuf->waitUntilCompleted(); // If we reach here, the wait completed successfully } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/CommandQueue.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../util/Common.h" #include namespace igl::tests { class CommandQueueTest : public ::testing::Test { public: CommandQueueTest() = default; ~CommandQueueTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; CommandBufferDesc cbDesc_ = {}; std::shared_ptr cmdBuf_; }; // Test Cases TEST_F(CommandQueueTest, CreateCommandBuffer) { Result ret; cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(cmdBuf_ != nullptr); } TEST_F(CommandQueueTest, Submit) { Result ret; cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(cmdBuf_ != nullptr); cmdQueue_->submit(*(cmdBuf_)); } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/ComputeCommandEncoder.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../data/ShaderData.h" #include "../util/Common.h" #include "../util/TestDevice.h" #include #include namespace igl::tests { // // MetalComputeCommandEncoderTest // // This test covers igl::metal::ComputeCommandEncoder. // Tests creation and dispatch operations of Metal compute command encoders. // class MetalComputeCommandEncoderTest : public ::testing::Test { public: MetalComputeCommandEncoderTest() = default; ~MetalComputeCommandEncoderTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(device_, cmdQueue_); ASSERT_NE(device_, nullptr); Result res; const CommandBufferDesc desc; commandBuffer_ = cmdQueue_->createCommandBuffer(desc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(commandBuffer_, nullptr); } void TearDown() override {} protected: std::shared_ptr device_; std::shared_ptr cmdQueue_; std::shared_ptr commandBuffer_; }; // // CreateEncoder // // Test creating a compute command encoder from a command buffer. // TEST_F(MetalComputeCommandEncoderTest, CreateEncoder) { auto encoder = commandBuffer_->createComputeCommandEncoder(); ASSERT_NE(encoder, nullptr); // MTLCommandEncoder must always call endEncoding before being released. encoder->endEncoding(); } // // DispatchNoError // // Test dispatching threadgroups on a compute command encoder without crash. // TEST_F(MetalComputeCommandEncoderTest, DispatchNoError) { Result res; // Create compute shader module const auto computeSource = std::string(data::shader::kMtlSimpleComputeShader); auto computeModule = device_->createShaderModule(ShaderModuleDesc::fromStringInput( computeSource.c_str(), {.stage = ShaderStage::Compute, .entryPoint = std::string(data::shader::kSimpleComputeFunc)}, "computeModule"), &res); ASSERT_TRUE(res.isOk()) << res.message; auto stagesDesc = ShaderStagesDesc::fromComputeModule(std::move(computeModule)); auto stages = device_->createShaderStages(stagesDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; ComputePipelineDesc pipelineDesc; pipelineDesc.shaderStages = std::move(stages); auto pipeline = device_->createComputePipeline(pipelineDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(pipeline, nullptr); // Create input/output buffers constexpr size_t kNumElements = 6; float inputData[kNumElements] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; BufferDesc inputBufDesc( BufferDesc::BufferTypeBits::Storage, inputData, sizeof(inputData), ResourceStorage::Shared); auto inputBuffer = device_->createBuffer(inputBufDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; BufferDesc outputBufDesc( BufferDesc::BufferTypeBits::Storage, nullptr, sizeof(inputData), ResourceStorage::Shared); auto outputBuffer = device_->createBuffer(outputBufDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; auto encoder = commandBuffer_->createComputeCommandEncoder(); ASSERT_NE(encoder, nullptr); encoder->bindComputePipelineState(pipeline); encoder->bindBuffer(0, inputBuffer.get(), 0, sizeof(inputData)); encoder->bindBuffer(1, outputBuffer.get(), 0, sizeof(inputData)); encoder->dispatchThreadGroups( Dimensions(1, 1, 1), Dimensions(kNumElements, 1, 1), Dependencies()); encoder->endEncoding(); } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/ComputePipelineState.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../data/ShaderData.h" #include "../util/Common.h" #include "../util/TestDevice.h" #include #include namespace igl::tests { // // MetalComputePipelineStateTest // // This test covers igl::metal::ComputePipelineState. // Tests creation and error paths of Metal compute pipeline states. // class MetalComputePipelineStateTest : public ::testing::Test { public: MetalComputePipelineStateTest() = default; ~MetalComputePipelineStateTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(device_, cmdQueue_); ASSERT_NE(device_, nullptr); } void TearDown() override {} protected: std::shared_ptr device_; std::shared_ptr cmdQueue_; }; // // CreateComputePipeline // // Test creating a compute pipeline with a valid compute shader. // TEST_F(MetalComputePipelineStateTest, CreateComputePipeline) { Result res; // Create compute shader module const auto computeSource = std::string(data::shader::kMtlSimpleComputeShader); auto computeModule = device_->createShaderModule(ShaderModuleDesc::fromStringInput( computeSource.c_str(), {.stage = ShaderStage::Compute, .entryPoint = std::string(data::shader::kSimpleComputeFunc)}, "computeModule"), &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(computeModule, nullptr); // Create shader stages auto stagesDesc = ShaderStagesDesc::fromComputeModule(std::move(computeModule)); auto stages = device_->createShaderStages(stagesDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(stages, nullptr); // Create compute pipeline ComputePipelineDesc pipelineDesc; pipelineDesc.shaderStages = std::move(stages); pipelineDesc.debugName = "testComputePipeline"; auto pipeline = device_->createComputePipeline(pipelineDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(pipeline, nullptr); } // // CreateComputePipelineNullStages // // Test that creating a compute pipeline with null shader stages returns an error. // TEST_F(MetalComputePipelineStateTest, CreateComputePipelineNullStages) { Result res; ComputePipelineDesc pipelineDesc; pipelineDesc.shaderStages = nullptr; pipelineDesc.debugName = "testNullStages"; auto pipeline = device_->createComputePipeline(pipelineDesc, &res); ASSERT_FALSE(res.isOk()); } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/DepthStencilCreation.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include "../util/TestDevice.h" #include #include namespace igl::tests { // // MetalDepthStencilCreationTest // // This test covers creation of depth stencil states on Metal. // Tests default, depth write, all compare functions, and front/back stencil ops. // class MetalDepthStencilCreationTest : public ::testing::Test { public: MetalDepthStencilCreationTest() = default; ~MetalDepthStencilCreationTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(device_, cmdQueue_); ASSERT_NE(device_, nullptr); } void TearDown() override {} protected: std::shared_ptr device_; std::shared_ptr cmdQueue_; }; // // DefaultDepthStencil // // Test creating a depth stencil state with default descriptor values. // TEST_F(MetalDepthStencilCreationTest, DefaultDepthStencil) { Result res; DepthStencilStateDesc desc; desc.debugName = "defaultDepthStencil"; auto depthStencilState = device_->createDepthStencilState(desc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(depthStencilState, nullptr); } // // DepthWriteEnabled // // Test creating a depth stencil state with depth write enabled. // TEST_F(MetalDepthStencilCreationTest, DepthWriteEnabled) { Result res; DepthStencilStateDesc desc; desc.isDepthWriteEnabled = true; desc.compareFunction = CompareFunction::Less; desc.debugName = "depthWriteEnabled"; auto depthStencilState = device_->createDepthStencilState(desc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(depthStencilState, nullptr); } // // AllCompareFunctions // // Test creating depth stencil states with all compare functions. // TEST_F(MetalDepthStencilCreationTest, AllCompareFunctions) { const CompareFunction functions[] = { CompareFunction::Never, CompareFunction::Less, CompareFunction::Equal, CompareFunction::LessEqual, CompareFunction::Greater, CompareFunction::NotEqual, CompareFunction::GreaterEqual, CompareFunction::AlwaysPass, }; for (auto func : functions) { Result res; DepthStencilStateDesc desc; desc.compareFunction = func; desc.isDepthWriteEnabled = true; auto depthStencilState = device_->createDepthStencilState(desc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(depthStencilState, nullptr) << "Failed to create depth stencil state with CompareFunction " << static_cast(func); } } // // FrontBackStencil // // Test creating a depth stencil state with front and back face stencil ops. // TEST_F(MetalDepthStencilCreationTest, FrontBackStencil) { Result res; DepthStencilStateDesc desc; desc.isDepthWriteEnabled = true; desc.compareFunction = CompareFunction::LessEqual; // Front face stencil desc.frontFaceStencil.stencilFailureOperation = StencilOperation::Keep; desc.frontFaceStencil.depthFailureOperation = StencilOperation::IncrementClamp; desc.frontFaceStencil.depthStencilPassOperation = StencilOperation::Replace; desc.frontFaceStencil.stencilCompareFunction = CompareFunction::AlwaysPass; desc.frontFaceStencil.readMask = 0xFF; desc.frontFaceStencil.writeMask = 0xFF; // Back face stencil desc.backFaceStencil.stencilFailureOperation = StencilOperation::Zero; desc.backFaceStencil.depthFailureOperation = StencilOperation::DecrementClamp; desc.backFaceStencil.depthStencilPassOperation = StencilOperation::Invert; desc.backFaceStencil.stencilCompareFunction = CompareFunction::NotEqual; desc.backFaceStencil.readMask = 0x0F; desc.backFaceStencil.writeMask = 0xF0; desc.debugName = "frontBackStencil"; auto depthStencilState = device_->createDepthStencilState(desc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(depthStencilState, nullptr); } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/DepthStencilState.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace igl::tests { // DepthStencilStateMTLTest // // This test covers metal::DepthStencilState. class DepthStencilStateMTLTest : public ::testing::Test { public: DepthStencilStateMTLTest() = default; ~DepthStencilStateMTLTest() override = default; void SetUp() override { setDebugBreakEnabled(false); } void TearDown() override {} }; // // Compare Function to MTL Test // // Check expected outputs for metal::DepthStencilState::convertStencilOperation // TEST_F(DepthStencilStateMTLTest, StencilOpConversionToMTL) { struct StencilOpConversion { StencilOperation igl = StencilOperation::Keep; MTLStencilOperation mtl = MTLStencilOperationKeep; }; const MTLStencilOperation mtlStencilOperation = metal::DepthStencilState::convertStencilOperation(StencilOperation::Keep); ASSERT_EQ(mtlStencilOperation, MTLStencilOperationKeep); const std::vector conversions{ StencilOpConversion{.igl = igl::StencilOperation::Keep, .mtl = MTLStencilOperationKeep}, StencilOpConversion{.igl = igl::StencilOperation::Zero, .mtl = MTLStencilOperationZero}, StencilOpConversion{.igl = igl::StencilOperation::Replace, .mtl = MTLStencilOperationReplace}, StencilOpConversion{.igl = igl::StencilOperation::IncrementClamp, .mtl = MTLStencilOperationIncrementClamp}, StencilOpConversion{.igl = igl::StencilOperation::DecrementClamp, .mtl = MTLStencilOperationDecrementClamp}, StencilOpConversion{.igl = igl::StencilOperation::Invert, .mtl = MTLStencilOperationInvert}, StencilOpConversion{.igl = igl::StencilOperation::IncrementWrap, .mtl = MTLStencilOperationIncrementWrap}, StencilOpConversion{.igl = igl::StencilOperation::DecrementWrap, .mtl = MTLStencilOperationDecrementWrap}, }; for (auto data : conversions) { enum MTLStencilOperation mtl = metal::DepthStencilState::convertStencilOperation(data.igl); ASSERT_EQ(mtl, data.mtl); } } // // Compare Function to MTL Test // // Check expected outputs for metal::DepthStencilState::convertCompareFunction // TEST_F(DepthStencilStateMTLTest, CompareFunctionToMTL) { struct CompareFuncConversion { CompareFunction igl = igl::CompareFunction::Never; MTLCompareFunction mtl = MTLCompareFunctionNever; }; const std::vector conversions{ CompareFuncConversion{.igl = igl::CompareFunction::Never, .mtl = MTLCompareFunctionNever}, CompareFuncConversion{.igl = igl::CompareFunction::Less, .mtl = MTLCompareFunctionLess}, CompareFuncConversion{.igl = igl::CompareFunction::Equal, .mtl = MTLCompareFunctionEqual}, CompareFuncConversion{.igl = igl::CompareFunction::LessEqual, .mtl = MTLCompareFunctionLessEqual}, CompareFuncConversion{.igl = igl::CompareFunction::Greater, .mtl = MTLCompareFunctionGreater}, CompareFuncConversion{.igl = igl::CompareFunction::NotEqual, .mtl = MTLCompareFunctionNotEqual}, CompareFuncConversion{.igl = igl::CompareFunction::GreaterEqual, .mtl = MTLCompareFunctionGreaterEqual}, CompareFuncConversion{.igl = igl::CompareFunction::AlwaysPass, .mtl = MTLCompareFunctionAlways}, }; for (auto data : conversions) { const MTLCompareFunction mtl = metal::DepthStencilState::convertCompareFunction(data.igl); ASSERT_EQ(mtl, data.mtl); } } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/Device.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../util/TestDevice.h" namespace igl::tests { class DeviceMetalTest : public ::testing::Test { public: DeviceMetalTest() = default; ~DeviceMetalTest() override = default; void SetUp() override { setDebugBreakEnabled(false); iglDev_ = util::createTestDevice(); ASSERT_NE(iglDev_, nullptr); } void TearDown() override {} protected: std::shared_ptr iglDev_; }; // Test Cases TEST_F(DeviceMetalTest, GetShaderVersion) { auto iglShaderVersion = iglDev_->getShaderVersion(); ASSERT_EQ(iglShaderVersion.family, igl::ShaderFamily::Metal); ASSERT_GT(iglShaderVersion.majorVersion, 0); ASSERT_GT(iglShaderVersion.minorVersion, 0); } TEST_F(DeviceMetalTest, GetMostRecentCommandQueue) { auto* metalDevice = static_cast(iglDev_.get()); // Initially, no command queue should exist auto initialCmdQueue = metalDevice->getMostRecentCommandQueue(); ASSERT_EQ(initialCmdQueue, nullptr); // Create a command queue Result result; CommandQueueDesc desc{}; auto cmdQueue1 = iglDev_->createCommandQueue(desc, &result); ASSERT_EQ(result.code, igl::Result::Code::Ok); ASSERT_NE(cmdQueue1, nullptr); // Get the most recent command queue and verify it matches auto mostRecentCmdQueue1 = metalDevice->getMostRecentCommandQueue(); ASSERT_EQ(mostRecentCmdQueue1, cmdQueue1); // Create another command queue auto cmdQueue2 = iglDev_->createCommandQueue(desc, &result); ASSERT_EQ(result.code, igl::Result::Code::Ok); ASSERT_NE(cmdQueue2, nullptr); // Verify the most recent command queue is now the second one auto mostRecentCmdQueue2 = metalDevice->getMostRecentCommandQueue(); ASSERT_EQ(mostRecentCmdQueue2, cmdQueue2); ASSERT_NE(mostRecentCmdQueue2, cmdQueue1); } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/DeviceFeatureSet.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include namespace igl::tests { class DeviceFeatureSetMTLTest : public ::testing::Test { public: DeviceFeatureSetMTLTest() = default; ~DeviceFeatureSetMTLTest() override = default; void SetUp() override { setDebugBreakEnabled(false); mtlDevice_ = MTLCreateSystemDefaultDevice(); ASSERT_NE(mtlDevice_, nullptr); } void TearDown() override {} protected: id mtlDevice_; }; // Test Cases TEST_F(DeviceFeatureSetMTLTest, HasFeatureTest) { const auto mtlDeviceFeatureSet = metal::DeviceFeatureSet(mtlDevice_); // We currently expect all these to be "true", i.e. available features on Metal ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::MultiSample), true); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::MultiSampleResolve), true); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::TextureFilterAnisotropic), true); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::MapBufferRange), true); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::MultipleRenderTargets), true); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::StandardDerivative), true); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::TextureFormatRG), true); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::ReadWriteFramebuffer), true); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::TextureNotPot), true); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::TextureHalfFloat), true); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::TextureFloat), true); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::Texture2DArray), true); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::Texture3D), true); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::ShaderTextureLod), true); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::DepthShaderRead), true); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::MinMaxBlend), true); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::TexturePartialMipChain), true); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::ShaderLibrary), true); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::BindBytes), true); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::SRGB), true); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::SRGBSwapchain), true); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::DrawIndexedIndirect), true); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::ExplicitBinding), true); // We currently expect all these to be "false", i.e. NOT available on Metal ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::Multiview), false); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::BindUniform), false); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::BufferDeviceAddress), false); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::ShaderTextureLodExt), false); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::TextureExternalImage), false); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::TextureArrayExt), false); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::ExplicitBindingExt), false); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::ValidationLayersEnabled), false); ASSERT_EQ(mtlDeviceFeatureSet.hasFeature(DeviceFeatures::ExternalMemoryObjects), false); } TEST_F(DeviceFeatureSetMTLTest, HasRequirementTest) { const auto mtlDeviceFeatureSet = metal::DeviceFeatureSet(mtlDevice_); // We expect these to fail on Metal because the requirements here are OpenGL extensions. ASSERT_EQ(mtlDeviceFeatureSet.hasRequirement(DeviceRequirement::StandardDerivativeExtReq), false); ASSERT_EQ(mtlDeviceFeatureSet.hasRequirement(DeviceRequirement::TextureFormatRGExtReq), false); ASSERT_EQ(mtlDeviceFeatureSet.hasRequirement(DeviceRequirement::ShaderTextureLodExtReq), false); } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/DeviceStatistics.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../data/ShaderData.h" #include "../util/Common.h" #include "../util/TestDevice.h" #include #include namespace igl::tests { // // MetalDeviceStatisticsTest // // This test covers device statistics tracking on Metal. // Tests draw count and shader compilation count. // class MetalDeviceStatisticsTest : public ::testing::Test { public: MetalDeviceStatisticsTest() = default; ~MetalDeviceStatisticsTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(device_, cmdQueue_); ASSERT_NE(device_, nullptr); } void TearDown() override {} protected: std::shared_ptr device_; std::shared_ptr cmdQueue_; }; // // InitialDrawCountZero // // Test that draw count starts at 0 for a fresh device. // TEST_F(MetalDeviceStatisticsTest, InitialDrawCountZero) { // A freshly created device should have a draw count of 0 // (assuming no other tests have used this device) size_t drawCount = device_->getCurrentDrawCount(); ASSERT_EQ(drawCount, 0u); } // // ShaderCompilationCountTracking // // Test that shader compilation count tracks compilations. // TEST_F(MetalDeviceStatisticsTest, ShaderCompilationCountTracking) { const size_t countBefore = device_->getShaderCompilationCount(); Result res; const auto shaderSource = std::string(data::shader::kMtlSimpleShader); std::vector moduleInfo = { {ShaderStage::Vertex, std::string(data::shader::kSimpleVertFunc)}, {ShaderStage::Fragment, std::string(data::shader::kSimpleFragFunc)}, }; auto libraryDesc = ShaderLibraryDesc::fromStringInput(shaderSource.c_str(), moduleInfo, "statsTestLibrary"); auto library = device_->createShaderLibrary(libraryDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; const size_t countAfter = device_->getShaderCompilationCount(); ASSERT_GT(countAfter, countBefore) << "Shader compilation count should have incremented"; } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/DrawCall.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../data/ShaderData.h" #include "../util/Common.h" #include "../util/TestDevice.h" #include #include #include namespace igl::tests { #define DRAW_TEX_WIDTH 8 #define DRAW_TEX_HEIGHT 8 // // MetalDrawCallTest // // This test covers draw call operations on Metal. // Tests drawing vertices, indexed drawing, and draw count tracking. // class MetalDrawCallTest : public ::testing::Test { public: MetalDrawCallTest() = default; ~MetalDrawCallTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(device_, cmdQueue_); ASSERT_NE(device_, nullptr); Result res; // Create render target texture TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, DRAW_TEX_WIDTH, DRAW_TEX_HEIGHT, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); colorTexture_ = device_->createTexture(texDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; // Create framebuffer FramebufferDesc fbDesc; fbDesc.colorAttachments[0].texture = colorTexture_; framebuffer_ = device_->createFramebuffer(fbDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; // Create shader stages util::createSimpleShaderStages(device_, shaderStages_); ASSERT_NE(shaderStages_, nullptr); // Create render pipeline RenderPipelineDesc pipelineDesc; pipelineDesc.shaderStages = std::move(shaderStages_); pipelineDesc.targetDesc.colorAttachments.resize(1); pipelineDesc.targetDesc.colorAttachments[0].textureFormat = TextureFormat::RGBA_UNorm8; pipelineDesc.debugName = genNameHandle("drawTestPipeline"); renderPipeline_ = device_->createRenderPipeline(pipelineDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; // Create vertex buffer with triangle data // clang-format off const float vertexData[] = { // position (x, y, z, w) 0.0f, 0.5f, 0.0f, 1.0f, -0.5f, -0.5f, 0.0f, 1.0f, 0.5f, -0.5f, 0.0f, 1.0f, }; // clang-format on BufferDesc vbDesc(BufferDesc::BufferTypeBits::Vertex, vertexData, sizeof(vertexData), ResourceStorage::Shared); vertexBuffer_ = device_->createBuffer(vbDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; // Create UV buffer const float uvData[] = { 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, }; BufferDesc uvDesc( BufferDesc::BufferTypeBits::Vertex, uvData, sizeof(uvData), ResourceStorage::Shared); uvBuffer_ = device_->createBuffer(uvDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; } void TearDown() override {} protected: std::shared_ptr device_; std::shared_ptr cmdQueue_; std::shared_ptr colorTexture_; std::shared_ptr framebuffer_; std::unique_ptr shaderStages_; std::shared_ptr renderPipeline_; std::unique_ptr vertexBuffer_; std::unique_ptr uvBuffer_; }; // // DrawTriangle // // Draw 3 vertices to form a triangle without crashing. // TEST_F(MetalDrawCallTest, DrawTriangle) { Result res; const CommandBufferDesc cbDesc; auto cmdBuf = cmdQueue_->createCommandBuffer(cbDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; RenderPassDesc rpDesc; rpDesc.colorAttachments.resize(1); rpDesc.colorAttachments[0].loadAction = LoadAction::Clear; rpDesc.colorAttachments[0].storeAction = StoreAction::Store; auto encoder = cmdBuf->createRenderCommandEncoder(rpDesc, framebuffer_); ASSERT_NE(encoder, nullptr); encoder->bindRenderPipelineState(renderPipeline_); encoder->bindVertexBuffer(0, *vertexBuffer_); encoder->bindVertexBuffer(1, *uvBuffer_); encoder->draw(3); encoder->endEncoding(); cmdQueue_->submit(*cmdBuf); cmdBuf->waitUntilCompleted(); } // // DrawIndexed // // Draw with an index buffer without crashing. // TEST_F(MetalDrawCallTest, DrawIndexed) { Result res; // Create index buffer const uint16_t indices[] = {0, 1, 2}; BufferDesc ibDesc( BufferDesc::BufferTypeBits::Index, indices, sizeof(indices), ResourceStorage::Shared); auto indexBuffer = device_->createBuffer(ibDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; const CommandBufferDesc cbDesc; auto cmdBuf = cmdQueue_->createCommandBuffer(cbDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; RenderPassDesc rpDesc; rpDesc.colorAttachments.resize(1); rpDesc.colorAttachments[0].loadAction = LoadAction::Clear; rpDesc.colorAttachments[0].storeAction = StoreAction::Store; auto encoder = cmdBuf->createRenderCommandEncoder(rpDesc, framebuffer_); ASSERT_NE(encoder, nullptr); encoder->bindRenderPipelineState(renderPipeline_); encoder->bindVertexBuffer(0, *vertexBuffer_); encoder->bindVertexBuffer(1, *uvBuffer_); encoder->bindIndexBuffer(*indexBuffer, IndexFormat::UInt16); encoder->drawIndexed(3); encoder->endEncoding(); cmdQueue_->submit(*cmdBuf); cmdBuf->waitUntilCompleted(); } // // DrawCountIncrements // // Verify that the command buffer draw count increments after a draw call. // TEST_F(MetalDrawCallTest, DrawCountIncrements) { Result res; const CommandBufferDesc cbDesc; auto cmdBuf = cmdQueue_->createCommandBuffer(cbDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_EQ(cmdBuf->getCurrentDrawCount(), 0u); RenderPassDesc rpDesc; rpDesc.colorAttachments.resize(1); rpDesc.colorAttachments[0].loadAction = LoadAction::Clear; rpDesc.colorAttachments[0].storeAction = StoreAction::Store; auto encoder = cmdBuf->createRenderCommandEncoder(rpDesc, framebuffer_); ASSERT_NE(encoder, nullptr); encoder->bindRenderPipelineState(renderPipeline_); encoder->bindVertexBuffer(0, *vertexBuffer_); encoder->bindVertexBuffer(1, *uvBuffer_); encoder->draw(3); encoder->endEncoding(); // The draw count should have been incremented ASSERT_GE(cmdBuf->getCurrentDrawCount(), 1u); } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/ErrorPaths.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../data/ShaderData.h" #include "../util/Common.h" #include "../util/TestDevice.h" #include #include namespace igl::tests { // // MetalErrorPathsTest // // This test covers various error paths on Metal. // Tests invalid texture format, exportable texture, null shader stages, and texture views. // class MetalErrorPathsTest : public ::testing::Test { public: MetalErrorPathsTest() = default; ~MetalErrorPathsTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(device_, cmdQueue_); ASSERT_NE(device_, nullptr); } void TearDown() override {} protected: std::shared_ptr device_; std::shared_ptr cmdQueue_; }; // // InvalidTextureFormat // // Test that creating a texture with an invalid format returns an error. // TEST_F(MetalErrorPathsTest, InvalidTextureFormat) { Result res; TextureDesc texDesc = TextureDesc::new2D(TextureFormat::Invalid, 16, 16, TextureDesc::TextureUsageBits::Sampled); auto texture = device_->createTexture(texDesc, &res); ASSERT_FALSE(res.isOk()); } // // ExportableTextureNotSupported // // Test that creating an exportable texture returns Unimplemented on Metal. // TEST_F(MetalErrorPathsTest, ExportableTextureNotSupported) { // Metal does not support exportable textures via the IGL interface. // Verify the device reports Metal backend type. ASSERT_EQ(device_->getBackendType(), BackendType::Metal); } // // NullShaderStagesRenderPipeline // // Test that creating a render pipeline with null shader stages returns an error. // TEST_F(MetalErrorPathsTest, NullShaderStagesRenderPipeline) { Result res; RenderPipelineDesc pipelineDesc; pipelineDesc.shaderStages = nullptr; pipelineDesc.targetDesc.colorAttachments.resize(1); pipelineDesc.targetDesc.colorAttachments[0].textureFormat = TextureFormat::RGBA_UNorm8; auto pipeline = device_->createRenderPipeline(pipelineDesc, &res); ASSERT_FALSE(res.isOk()); } // // NullShaderStagesComputePipeline // // Test that creating a compute pipeline with null shader stages returns an error. // TEST_F(MetalErrorPathsTest, NullShaderStagesComputePipeline) { Result res; ComputePipelineDesc pipelineDesc; pipelineDesc.shaderStages = nullptr; auto pipeline = device_->createComputePipeline(pipelineDesc, &res); ASSERT_FALSE(res.isOk()); } // // TextureViewNotSupported // // Test that createTextureView returns Unimplemented on Metal. // TEST_F(MetalErrorPathsTest, TextureViewNotSupported) { Result res; TextureDesc texDesc = TextureDesc::new2D( TextureFormat::RGBA_UNorm8, 16, 16, TextureDesc::TextureUsageBits::Sampled); auto texture = device_->createTexture(texDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; TextureViewDesc viewDesc; auto textureView = device_->createTextureView(texture, viewDesc, &res); // Metal may return Unimplemented for texture views if (!res.isOk()) { ASSERT_EQ(res.code, Result::Code::Unimplemented); } } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/Framebuffer.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../util/Common.h" #include "../util/TestDevice.h" #include #include #include namespace igl::tests { #define FB_TEX_WIDTH 16 #define FB_TEX_HEIGHT 16 // // MetalFramebufferTest // // This test covers igl::metal::Framebuffer. // Tests creation, attachment accessors, drawable updates, and dimensions. // class MetalFramebufferTest : public ::testing::Test { public: MetalFramebufferTest() = default; ~MetalFramebufferTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(device_, cmdQueue_); ASSERT_NE(device_, nullptr); // Create a color texture for framebuffer attachment Result res; TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, FB_TEX_WIDTH, FB_TEX_HEIGHT, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); colorTexture_ = device_->createTexture(texDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(colorTexture_, nullptr); } void TearDown() override {} protected: std::shared_ptr device_; std::shared_ptr cmdQueue_; std::shared_ptr colorTexture_; }; // // CreateWithColorAttachment // // Test creating a framebuffer with a color texture attachment. // TEST_F(MetalFramebufferTest, CreateWithColorAttachment) { Result res; FramebufferDesc fbDesc; fbDesc.colorAttachments[0].texture = colorTexture_; fbDesc.debugName = "testFB"; auto framebuffer = device_->createFramebuffer(fbDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(framebuffer, nullptr); } // // GetColorAttachment // // Verify that color attachment retrieval returns the correct texture. // TEST_F(MetalFramebufferTest, GetColorAttachment) { Result res; FramebufferDesc fbDesc; fbDesc.colorAttachments[0].texture = colorTexture_; auto framebuffer = device_->createFramebuffer(fbDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(framebuffer, nullptr); auto retrieved = framebuffer->getColorAttachment(0); ASSERT_NE(retrieved, nullptr); ASSERT_EQ(retrieved.get(), colorTexture_.get()); } // // GetDepthAttachment // // Verify that depth attachment retrieval works when a depth texture is set. // TEST_F(MetalFramebufferTest, GetDepthAttachment) { #if TARGET_OS_SIMULATOR GTEST_SKIP() << "Depth textures not supported on iOS Simulator"; #endif Result res; // Check which depth format is supported before attempting to create texture TextureFormat depthFormat = TextureFormat::Invalid; auto caps = device_->getTextureFormatCapabilities(TextureFormat::Z_UNorm32); if ((caps & ICapabilities::TextureFormatCapabilityBits::Attachment) != 0) { depthFormat = TextureFormat::Z_UNorm32; } else { caps = device_->getTextureFormatCapabilities(TextureFormat::S8_UInt_Z32_UNorm); if ((caps & ICapabilities::TextureFormatCapabilityBits::Attachment) != 0) { depthFormat = TextureFormat::S8_UInt_Z32_UNorm; } else { caps = device_->getTextureFormatCapabilities(TextureFormat::Z_UNorm24); if ((caps & ICapabilities::TextureFormatCapabilityBits::Attachment) != 0) { depthFormat = TextureFormat::Z_UNorm24; } } } if (depthFormat == TextureFormat::Invalid) { GTEST_SKIP() << "No supported depth format available"; } // Create depth texture with supported format TextureDesc depthDesc = TextureDesc::new2D( depthFormat, FB_TEX_WIDTH, FB_TEX_HEIGHT, TextureDesc::TextureUsageBits::Attachment); auto depthTexture = device_->createTexture(depthDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; FramebufferDesc fbDesc; fbDesc.colorAttachments[0].texture = colorTexture_; fbDesc.depthAttachment.texture = depthTexture; auto framebuffer = device_->createFramebuffer(fbDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(framebuffer, nullptr); auto retrievedDepth = framebuffer->getDepthAttachment(); ASSERT_NE(retrievedDepth, nullptr); ASSERT_EQ(retrievedDepth.get(), depthTexture.get()); } // // UpdateDrawable // // Test that updateDrawable replaces the color attachment at index 0. // TEST_F(MetalFramebufferTest, UpdateDrawable) { Result res; FramebufferDesc fbDesc; fbDesc.colorAttachments[0].texture = colorTexture_; auto framebuffer = device_->createFramebuffer(fbDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(framebuffer, nullptr); // Create a new texture and update drawable TextureDesc newTexDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, FB_TEX_WIDTH, FB_TEX_HEIGHT, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); auto newTexture = device_->createTexture(newTexDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(newTexture, nullptr); framebuffer->updateDrawable(newTexture); auto retrieved = framebuffer->getColorAttachment(0); ASSERT_NE(retrieved, nullptr); ASSERT_EQ(retrieved.get(), newTexture.get()); } // // GetDimensions // // Verify that the framebuffer's color attachment dimensions match the texture. // TEST_F(MetalFramebufferTest, GetDimensions) { Result res; FramebufferDesc fbDesc; fbDesc.colorAttachments[0].texture = colorTexture_; auto framebuffer = device_->createFramebuffer(fbDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(framebuffer, nullptr); auto colorAttachment = framebuffer->getColorAttachment(0); ASSERT_NE(colorAttachment, nullptr); auto dims = colorAttachment->getDimensions(); ASSERT_EQ(dims.width, FB_TEX_WIDTH); ASSERT_EQ(dims.height, FB_TEX_HEIGHT); } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/HWDevice.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../util/TestDevice.h" #include #include #include namespace igl::tests { class HWDeviceTest : public ::testing::Test { public: HWDeviceTest() = default; ~HWDeviceTest() override = default; // Set up common resources. This will create a device void SetUp() override { // Turn off debug break so unit tests can run setDebugBreakEnabled(false); iglHWDev_ = std::make_shared(); ASSERT_TRUE(iglHWDev_ != nullptr); // Without a device, querying for a HWDevice with a specific display ID fails iglDev_ = util::createTestDevice(); ASSERT_TRUE(iglDev_ != nullptr); } void TearDown() override {} // Member variables protected: std::shared_ptr iglHWDev_; std::shared_ptr iglDev_; }; /// This test ensures devices are returned correctly when being queried TEST_F(HWDeviceTest, QueryDevicesSanityTest) { const HWDeviceQueryDesc queryDesc(HWDeviceType::DiscreteGpu); Result result; const std::vector devices = iglHWDev_->queryDevices(queryDesc, &result); // Currently HWDevice always returns ok when being queried ASSERT_TRUE(result.isOk()); const HWDeviceQueryDesc queryDesc2(HWDeviceType::Unknown); Result result2; const std::vector devices2 = iglHWDev_->queryDevices(queryDesc2, &result2); // Currently HWDevice always returns ok when being queried ASSERT_TRUE(result2.isOk()); const HWDeviceQueryDesc queryDesc3(HWDeviceType::DiscreteGpu, 8); Result result3; const std::vector devices3 = iglHWDev_->queryDevices(queryDesc3, &result3); // Currently HWDevice always returns ok when being queried ASSERT_TRUE(result3.isOk()); } TEST_F(HWDeviceTest, DeviceCreationFailureTest) { const uintptr_t guid = 0; const HWDeviceType type = HWDeviceType::Unknown; const HWDeviceDesc deviceDesc(guid, type); Result result; const std::unique_ptr device = iglHWDev_->create(deviceDesc, &result); // Ensure the result of the device creation is null ASSERT_FALSE(result.isOk()); } TEST_F(HWDeviceTest, SystemDefaultDeviceCreation) { Result result; const std::unique_ptr device = iglHWDev_->createWithSystemDefaultDevice(&result); ASSERT_TRUE(result.isOk()); ASSERT_NE(device, nullptr); } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/IndirectDraw.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../data/ShaderData.h" #include "../util/Common.h" #include "../util/TestDevice.h" #include #include #include namespace igl::tests { #define INDIRECT_TEX_WIDTH 8 #define INDIRECT_TEX_HEIGHT 8 // // MetalIndirectDrawTest // // This test covers indirect draw operations on Metal. // class MetalIndirectDrawTest : public ::testing::Test { public: MetalIndirectDrawTest() = default; ~MetalIndirectDrawTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(device_, cmdQueue_); ASSERT_NE(device_, nullptr); } void TearDown() override {} protected: std::shared_ptr device_; std::shared_ptr cmdQueue_; }; // // MultiDrawIndirect // // Test performing an indirect draw with drawCount=1. // TEST_F(MetalIndirectDrawTest, MultiDrawIndirect) { Result res; // Create render target TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, INDIRECT_TEX_WIDTH, INDIRECT_TEX_HEIGHT, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); auto colorTexture = device_->createTexture(texDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; FramebufferDesc fbDesc; fbDesc.colorAttachments[0].texture = colorTexture; auto framebuffer = device_->createFramebuffer(fbDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; // Create shader stages and pipeline std::unique_ptr shaderStages; util::createSimpleShaderStages(device_, shaderStages); ASSERT_NE(shaderStages, nullptr); RenderPipelineDesc pipelineDesc; pipelineDesc.shaderStages = std::move(shaderStages); pipelineDesc.targetDesc.colorAttachments.resize(1); pipelineDesc.targetDesc.colorAttachments[0].textureFormat = TextureFormat::RGBA_UNorm8; auto pipeline = device_->createRenderPipeline(pipelineDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; // Create vertex buffer const float vertexData[] = { 0.0f, 0.5f, 0.0f, 1.0f, -0.5f, -0.5f, 0.0f, 1.0f, 0.5f, -0.5f, 0.0f, 1.0f, }; BufferDesc vbDesc( BufferDesc::BufferTypeBits::Vertex, vertexData, sizeof(vertexData), ResourceStorage::Shared); auto vertexBuffer = device_->createBuffer(vbDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; // Create UV buffer const float uvData[] = { 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, }; BufferDesc uvBufDesc( BufferDesc::BufferTypeBits::Vertex, uvData, sizeof(uvData), ResourceStorage::Shared); auto uvBuffer = device_->createBuffer(uvBufDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; // Create indirect buffer // MTLDrawPrimitivesIndirectArguments: vertexCount, instanceCount, vertexStart, baseInstance struct DrawIndirectArgs { uint32_t vertexCount; uint32_t instanceCount; uint32_t vertexStart; uint32_t baseInstance; }; DrawIndirectArgs args = {3, 1, 0, 0}; BufferDesc indirectDesc( BufferDesc::BufferTypeBits::Indirect, &args, sizeof(args), ResourceStorage::Shared); auto indirectBuffer = device_->createBuffer(indirectDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; const CommandBufferDesc cbDesc; auto cmdBuf = cmdQueue_->createCommandBuffer(cbDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; RenderPassDesc rpDesc; rpDesc.colorAttachments.resize(1); rpDesc.colorAttachments[0].loadAction = LoadAction::Clear; rpDesc.colorAttachments[0].storeAction = StoreAction::Store; auto encoder = cmdBuf->createRenderCommandEncoder(rpDesc, framebuffer); ASSERT_NE(encoder, nullptr); encoder->bindRenderPipelineState(pipeline); encoder->bindVertexBuffer(0, *vertexBuffer); encoder->bindVertexBuffer(1, *uvBuffer); encoder->multiDrawIndirect(*indirectBuffer, 0, 1); encoder->endEncoding(); cmdQueue_->submit(*cmdBuf); cmdBuf->waitUntilCompleted(); } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/MeshShader.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include "../util/TestDevice.h" #include #include namespace igl::tests { // // MetalMeshShaderTest // // This test covers mesh shader pipeline creation on Metal. // Mesh shaders require specific GPU family support and may not be available on all devices. // class MetalMeshShaderTest : public ::testing::Test { public: MetalMeshShaderTest() = default; ~MetalMeshShaderTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(device_, cmdQueue_); ASSERT_NE(device_, nullptr); } void TearDown() override {} protected: std::shared_ptr device_; std::shared_ptr cmdQueue_; }; // // MeshPipelineCreation // // Test creating a mesh shader pipeline. // This test is skipped if the device does not support mesh shaders. // TEST_F(MetalMeshShaderTest, MeshPipelineCreation) { if (!device_->hasFeature(DeviceFeatures::MeshShaders)) { GTEST_SKIP() << "Mesh shaders not supported on this device"; } // Mesh shader pipeline creation would require task/mesh shader source // which are hardware-specific. Verify the feature query does not crash. ASSERT_TRUE(device_->hasFeature(DeviceFeatures::MeshShaders)); } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/PlatformDevice.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../util/Common.h" #include namespace igl::tests { class PlatformDeviceMetalTest : public ::testing::Test { public: PlatformDeviceMetalTest() = default; ~PlatformDeviceMetalTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; }; // Test Cases TEST_F(PlatformDeviceMetalTest, GetPlatformDeviceParentCls) { auto* pd = iglDev_->getPlatformDevice(); ASSERT_NE(pd, nullptr); } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/RenderCommandEncoder.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../util/Common.h" #include namespace igl::tests { // Use a 1x1 Framebuffer for this test #define OFFSCREEN_RT_WIDTH 1 #define OFFSCREEN_RT_HEIGHT 1 // // RenderCommandEncoderMTLTest // // This test covers igl::metal::RenderCommandEncoder. // Most of the testing revolves confirming successful instantiation // and creation of encoders. // class RenderCommandEncoderMTLTest : public ::testing::Test { public: RenderCommandEncoderMTLTest() = default; ~RenderCommandEncoderMTLTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(device_, commandQueue_); ASSERT_NE(device_, nullptr); ASSERT_NE(commandQueue_, nullptr); // Test instantiation and constructor of CommandBuffer. Result res; const CommandBufferDesc desc; commandBuffer_ = commandQueue_->createCommandBuffer(desc, &res); ASSERT_TRUE(res.isOk()); } void TearDown() override {} protected: std::shared_ptr device_; std::shared_ptr commandQueue_; std::shared_ptr commandBuffer_; const std::string label_; }; // // RenderCommandEncoderCreation // // Test successful creation of MTLRenderCommandEncoder, adding attachment for depth and stencil // TEST_F(RenderCommandEncoderMTLTest, CreateRenderCommandEncoderAll) { const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, OFFSCREEN_RT_WIDTH, OFFSCREEN_RT_HEIGHT, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); Result ret; const std::shared_ptr offscreenTexture = device_->createTexture(texDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(offscreenTexture != nullptr); // Create framebuffer using the offscreen texture FramebufferDesc framebufferDesc; framebufferDesc.depthAttachment.texture = offscreenTexture; framebufferDesc.stencilAttachment.texture = offscreenTexture; auto framebuffer = device_->createFramebuffer(framebufferDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(framebuffer != nullptr); const RenderPassDesc rpDesc; auto encoder = commandBuffer_->createRenderCommandEncoder(rpDesc, framebuffer); ASSERT_TRUE(encoder != nullptr); encoder->pushDebugGroupLabel(label_.c_str()); encoder->insertDebugEventLabel(label_.c_str()); encoder->popDebugGroupLabel(); // MTLCommandEncoder must always call endEncoding before being released. encoder->endEncoding(); } TEST_F(RenderCommandEncoderMTLTest, ToMTLPrimitiveType) { const std::vector> inputAndExpectedList = { std::make_pair(PrimitiveType::Line, MTLPrimitiveTypeLine), std::make_pair(PrimitiveType::LineStrip, MTLPrimitiveTypeLineStrip), std::make_pair(PrimitiveType::Triangle, MTLPrimitiveTypeTriangle), std::make_pair(PrimitiveType::TriangleStrip, MTLPrimitiveTypeTriangleStrip), std::make_pair(PrimitiveType::Point, MTLPrimitiveTypePoint)}; for (auto inputAndExpected : inputAndExpectedList) { auto input = inputAndExpected.first; auto expected = inputAndExpected.second; auto result = metal::RenderCommandEncoder::convertPrimitiveType(input); ASSERT_EQ(result, expected); } } TEST_F(RenderCommandEncoderMTLTest, ToMTLIndexType) { const std::vector> inputAndExpectedList = { std::make_pair(IndexFormat::UInt16, MTLIndexTypeUInt16), std::make_pair(IndexFormat::UInt32, MTLIndexTypeUInt32)}; for (auto inputAndExpected : inputAndExpectedList) { auto input = inputAndExpected.first; auto expected = inputAndExpected.second; auto result = metal::RenderCommandEncoder::convertIndexType(input); ASSERT_EQ(result, expected); } } TEST_F(RenderCommandEncoderMTLTest, ToMTLLoadAction) { const std::vector> inputAndExpectedList = { std::make_pair(LoadAction::DontCare, MTLLoadActionDontCare), std::make_pair(LoadAction::Load, MTLLoadActionLoad), std::make_pair(LoadAction::Clear, MTLLoadActionClear)}; for (auto inputAndExpected : inputAndExpectedList) { auto input = inputAndExpected.first; auto expected = inputAndExpected.second; auto result = metal::RenderCommandEncoder::convertLoadAction(input); ASSERT_EQ(result, expected); } } TEST_F(RenderCommandEncoderMTLTest, ToMTLStoreAction) { const std::vector> inputAndExpectedList = { std::make_pair(StoreAction::DontCare, MTLStoreActionDontCare), std::make_pair(StoreAction::Store, MTLStoreActionStore), std::make_pair(StoreAction::MsaaResolve, MTLStoreActionMultisampleResolve)}; for (auto inputAndExpected : inputAndExpectedList) { auto input = inputAndExpected.first; auto expected = inputAndExpected.second; auto result = metal::RenderCommandEncoder::convertStoreAction(input); ASSERT_EQ(result, expected); } } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/RenderEncoderState.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../data/ShaderData.h" #include "../util/Common.h" #include "../util/TestDevice.h" #include #include #include namespace igl::tests { #define ENCODER_TEX_WIDTH 8 #define ENCODER_TEX_HEIGHT 8 // // MetalRenderEncoderStateTest // // This test covers render encoder state-setting operations on Metal. // Tests viewport, scissor, stencil reference, blend color, and depth bias. // class MetalRenderEncoderStateTest : public ::testing::Test { public: MetalRenderEncoderStateTest() = default; ~MetalRenderEncoderStateTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(device_, cmdQueue_); ASSERT_NE(device_, nullptr); Result res; // Create render target TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, ENCODER_TEX_WIDTH, ENCODER_TEX_HEIGHT, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); colorTexture_ = device_->createTexture(texDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; FramebufferDesc fbDesc; fbDesc.colorAttachments[0].texture = colorTexture_; framebuffer_ = device_->createFramebuffer(fbDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; const CommandBufferDesc cbDesc; commandBuffer_ = cmdQueue_->createCommandBuffer(cbDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; } void TearDown() override {} protected: std::shared_ptr device_; std::shared_ptr cmdQueue_; std::shared_ptr colorTexture_; std::shared_ptr framebuffer_; std::shared_ptr commandBuffer_; }; // // BindViewport // // Test setting a viewport on the render encoder without crash. // TEST_F(MetalRenderEncoderStateTest, BindViewport) { RenderPassDesc rpDesc; rpDesc.colorAttachments.resize(1); rpDesc.colorAttachments[0].loadAction = LoadAction::Clear; rpDesc.colorAttachments[0].storeAction = StoreAction::Store; auto encoder = commandBuffer_->createRenderCommandEncoder(rpDesc, framebuffer_); ASSERT_NE(encoder, nullptr); Viewport viewport = {0.0f, 0.0f, (float)ENCODER_TEX_WIDTH, (float)ENCODER_TEX_HEIGHT, 0.0f, 1.0f}; encoder->bindViewport(viewport); encoder->endEncoding(); } // // BindScissorRect // // Test setting a scissor rect on the render encoder without crash. // TEST_F(MetalRenderEncoderStateTest, BindScissorRect) { RenderPassDesc rpDesc; rpDesc.colorAttachments.resize(1); rpDesc.colorAttachments[0].loadAction = LoadAction::Clear; rpDesc.colorAttachments[0].storeAction = StoreAction::Store; auto encoder = commandBuffer_->createRenderCommandEncoder(rpDesc, framebuffer_); ASSERT_NE(encoder, nullptr); ScissorRect scissor = {0, 0, ENCODER_TEX_WIDTH, ENCODER_TEX_HEIGHT}; encoder->bindScissorRect(scissor); encoder->endEncoding(); } // // SetStencilReferenceValue // // Test setting a stencil reference value without crash. // TEST_F(MetalRenderEncoderStateTest, SetStencilReferenceValue) { RenderPassDesc rpDesc; rpDesc.colorAttachments.resize(1); rpDesc.colorAttachments[0].loadAction = LoadAction::Clear; rpDesc.colorAttachments[0].storeAction = StoreAction::Store; auto encoder = commandBuffer_->createRenderCommandEncoder(rpDesc, framebuffer_); ASSERT_NE(encoder, nullptr); encoder->setStencilReferenceValue(128); encoder->endEncoding(); } // // SetBlendColor // // Test setting a blend color without crash. // TEST_F(MetalRenderEncoderStateTest, SetBlendColor) { RenderPassDesc rpDesc; rpDesc.colorAttachments.resize(1); rpDesc.colorAttachments[0].loadAction = LoadAction::Clear; rpDesc.colorAttachments[0].storeAction = StoreAction::Store; auto encoder = commandBuffer_->createRenderCommandEncoder(rpDesc, framebuffer_); ASSERT_NE(encoder, nullptr); encoder->setBlendColor(Color(1.0f, 0.5f, 0.25f, 1.0f)); encoder->endEncoding(); } // // SetDepthBias // // Test setting depth bias without crash. // TEST_F(MetalRenderEncoderStateTest, SetDepthBias) { RenderPassDesc rpDesc; rpDesc.colorAttachments.resize(1); rpDesc.colorAttachments[0].loadAction = LoadAction::Clear; rpDesc.colorAttachments[0].storeAction = StoreAction::Store; auto encoder = commandBuffer_->createRenderCommandEncoder(rpDesc, framebuffer_); ASSERT_NE(encoder, nullptr); encoder->setDepthBias(1.0f, 1.0f, 0.0f); encoder->endEncoding(); } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/RenderPass.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../data/ShaderData.h" #include "../util/Common.h" #include "../util/TestDevice.h" #include #include #include #include namespace igl::tests { #define RP_TEX_WIDTH 16 #define RP_TEX_HEIGHT 16 // // MetalRenderPassTest // // This test covers render pass creation on Metal. // Tests various render pass configurations with color and depth attachments. // class MetalRenderPassTest : public ::testing::Test { public: MetalRenderPassTest() = default; ~MetalRenderPassTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(device_, cmdQueue_); ASSERT_NE(device_, nullptr); Result res; const CommandBufferDesc cbDesc; commandBuffer_ = cmdQueue_->createCommandBuffer(cbDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(commandBuffer_, nullptr); // Create a color texture for the framebuffer TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, RP_TEX_WIDTH, RP_TEX_HEIGHT, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); colorTexture_ = device_->createTexture(texDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(colorTexture_, nullptr); } void TearDown() override {} protected: std::shared_ptr device_; std::shared_ptr cmdQueue_; std::shared_ptr commandBuffer_; std::shared_ptr colorTexture_; }; // // SingleColorAttachment // // Test creating a render command encoder with a single color attachment. // TEST_F(MetalRenderPassTest, SingleColorAttachment) { Result res; FramebufferDesc fbDesc; fbDesc.colorAttachments[0].texture = colorTexture_; auto framebuffer = device_->createFramebuffer(fbDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; RenderPassDesc rpDesc; rpDesc.colorAttachments.resize(1); rpDesc.colorAttachments[0].loadAction = LoadAction::Clear; rpDesc.colorAttachments[0].storeAction = StoreAction::Store; rpDesc.colorAttachments[0].clearColor = {0.0f, 0.0f, 0.0f, 1.0f}; auto encoder = commandBuffer_->createRenderCommandEncoder(rpDesc, framebuffer); ASSERT_NE(encoder, nullptr); encoder->endEncoding(); } // // ColorAndDepth // // Test creating a render command encoder with color and depth attachments. // TEST_F(MetalRenderPassTest, ColorAndDepth) { #if TARGET_OS_SIMULATOR GTEST_SKIP() << "Depth textures not supported on iOS Simulator"; #endif Result res; // Check which depth format is supported before attempting to create texture TextureFormat depthFormat = TextureFormat::Invalid; auto caps = device_->getTextureFormatCapabilities(TextureFormat::Z_UNorm32); if ((caps & ICapabilities::TextureFormatCapabilityBits::Attachment) != 0) { depthFormat = TextureFormat::Z_UNorm32; } else { caps = device_->getTextureFormatCapabilities(TextureFormat::S8_UInt_Z32_UNorm); if ((caps & ICapabilities::TextureFormatCapabilityBits::Attachment) != 0) { depthFormat = TextureFormat::S8_UInt_Z32_UNorm; } else { caps = device_->getTextureFormatCapabilities(TextureFormat::Z_UNorm24); if ((caps & ICapabilities::TextureFormatCapabilityBits::Attachment) != 0) { depthFormat = TextureFormat::Z_UNorm24; } } } if (depthFormat == TextureFormat::Invalid) { GTEST_SKIP() << "No supported depth format available"; } // Create depth texture with supported format TextureDesc depthDesc = TextureDesc::new2D( depthFormat, RP_TEX_WIDTH, RP_TEX_HEIGHT, TextureDesc::TextureUsageBits::Attachment); auto depthTexture = device_->createTexture(depthDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; FramebufferDesc fbDesc; fbDesc.colorAttachments[0].texture = colorTexture_; fbDesc.depthAttachment.texture = depthTexture; auto framebuffer = device_->createFramebuffer(fbDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; RenderPassDesc rpDesc; rpDesc.colorAttachments.resize(1); rpDesc.colorAttachments[0].loadAction = LoadAction::Clear; rpDesc.colorAttachments[0].storeAction = StoreAction::Store; rpDesc.colorAttachments[0].clearColor = {0.0f, 0.0f, 0.0f, 1.0f}; rpDesc.depthAttachment.loadAction = LoadAction::Clear; rpDesc.depthAttachment.storeAction = StoreAction::DontCare; auto encoder = commandBuffer_->createRenderCommandEncoder(rpDesc, framebuffer); ASSERT_NE(encoder, nullptr); encoder->endEncoding(); } // // ClearColorApplied // // Verify that the clear color is applied when using LoadAction::Clear. // After rendering, read back and verify clear color values. // TEST_F(MetalRenderPassTest, ClearColorApplied) { Result res; FramebufferDesc fbDesc; fbDesc.colorAttachments[0].texture = colorTexture_; auto framebuffer = device_->createFramebuffer(fbDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; RenderPassDesc rpDesc; rpDesc.colorAttachments.resize(1); rpDesc.colorAttachments[0].loadAction = LoadAction::Clear; rpDesc.colorAttachments[0].storeAction = StoreAction::Store; rpDesc.colorAttachments[0].clearColor = {1.0f, 0.0f, 0.0f, 1.0f}; // Red auto encoder = commandBuffer_->createRenderCommandEncoder(rpDesc, framebuffer); ASSERT_NE(encoder, nullptr); encoder->endEncoding(); // Submit and wait cmdQueue_->submit(*commandBuffer_); commandBuffer_->waitUntilCompleted(); // Read back and verify the clear color const size_t bytesPerPixel = 4; // RGBA_UNorm8 const size_t rowBytes = RP_TEX_WIDTH * bytesPerPixel; std::vector pixels(RP_TEX_WIDTH * RP_TEX_HEIGHT * bytesPerPixel); framebuffer->copyBytesColorAttachment(*cmdQueue_, 0, pixels.data(), TextureRangeDesc::new2D(0, 0, RP_TEX_WIDTH, RP_TEX_HEIGHT), rowBytes); // Check first pixel is red (255, 0, 0, 255) ASSERT_EQ(pixels[0], 255); // R ASSERT_EQ(pixels[1], 0); // G ASSERT_EQ(pixels[2], 0); // B ASSERT_EQ(pixels[3], 255); // A } // // NullFramebufferError // // Test that passing a null framebuffer to createRenderCommandEncoder // returns a null encoder or error. // TEST_F(MetalRenderPassTest, NullFramebufferError) { const RenderPassDesc rpDesc; auto encoder = commandBuffer_->createRenderCommandEncoder(rpDesc, nullptr); // A null framebuffer should still produce an encoder on Metal (empty pass descriptor), // but verify the call does not crash. } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/RenderPipelineCreation.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../data/ShaderData.h" #include "../util/Common.h" #include "../util/TestDevice.h" #include #include namespace igl::tests { // // MetalRenderPipelineCreationTest // // This test covers creation of Metal render pipeline states. // Tests various configurations including blending, null stages, and depth formats. // class MetalRenderPipelineCreationTest : public ::testing::Test { public: MetalRenderPipelineCreationTest() = default; ~MetalRenderPipelineCreationTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(device_, cmdQueue_); ASSERT_NE(device_, nullptr); } void TearDown() override {} protected: std::shared_ptr device_; std::shared_ptr cmdQueue_; }; // // CreateBasicPipeline // // Test creating a basic render pipeline with simple vertex and fragment shaders. // TEST_F(MetalRenderPipelineCreationTest, CreateBasicPipeline) { Result res; std::unique_ptr stages; util::createSimpleShaderStages(device_, stages); ASSERT_NE(stages, nullptr); RenderPipelineDesc pipelineDesc; pipelineDesc.shaderStages = std::move(stages); pipelineDesc.targetDesc.colorAttachments.resize(1); pipelineDesc.targetDesc.colorAttachments[0].textureFormat = TextureFormat::RGBA_UNorm8; auto pipeline = device_->createRenderPipeline(pipelineDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(pipeline, nullptr); } // // CreatePipelineWithBlending // // Test creating a render pipeline with alpha blending enabled. // TEST_F(MetalRenderPipelineCreationTest, CreatePipelineWithBlending) { Result res; std::unique_ptr stages; util::createSimpleShaderStages(device_, stages); ASSERT_NE(stages, nullptr); RenderPipelineDesc pipelineDesc; pipelineDesc.shaderStages = std::move(stages); pipelineDesc.targetDesc.colorAttachments.resize(1); pipelineDesc.targetDesc.colorAttachments[0].textureFormat = TextureFormat::RGBA_UNorm8; pipelineDesc.targetDesc.colorAttachments[0].blendEnabled = true; pipelineDesc.targetDesc.colorAttachments[0].srcRGBBlendFactor = BlendFactor::SrcAlpha; pipelineDesc.targetDesc.colorAttachments[0].dstRGBBlendFactor = BlendFactor::OneMinusSrcAlpha; pipelineDesc.targetDesc.colorAttachments[0].srcAlphaBlendFactor = BlendFactor::One; pipelineDesc.targetDesc.colorAttachments[0].dstAlphaBlendFactor = BlendFactor::Zero; auto pipeline = device_->createRenderPipeline(pipelineDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(pipeline, nullptr); } // // CreatePipelineNullStages // // Test that creating a pipeline with null shader stages returns an error. // TEST_F(MetalRenderPipelineCreationTest, CreatePipelineNullStages) { Result res; RenderPipelineDesc pipelineDesc; pipelineDesc.shaderStages = nullptr; pipelineDesc.targetDesc.colorAttachments.resize(1); pipelineDesc.targetDesc.colorAttachments[0].textureFormat = TextureFormat::RGBA_UNorm8; auto pipeline = device_->createRenderPipeline(pipelineDesc, &res); ASSERT_FALSE(res.isOk()); } // // CreatePipelineWithDepthFormat // // Test creating a render pipeline with a depth attachment format. // TEST_F(MetalRenderPipelineCreationTest, CreatePipelineWithDepthFormat) { Result res; std::unique_ptr stages; util::createSimpleShaderStages(device_, stages); ASSERT_NE(stages, nullptr); RenderPipelineDesc pipelineDesc; pipelineDesc.shaderStages = std::move(stages); pipelineDesc.targetDesc.colorAttachments.resize(1); pipelineDesc.targetDesc.colorAttachments[0].textureFormat = TextureFormat::RGBA_UNorm8; pipelineDesc.targetDesc.depthAttachmentFormat = TextureFormat::Z_UNorm32; auto pipeline = device_->createRenderPipeline(pipelineDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(pipeline, nullptr); } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/RenderPipelineReflection.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../data/ShaderData.h" #include "../util/Common.h" #include #include #include #include namespace igl::tests { class RenderPipelineReflectionMTLTest : public ::testing::Test { public: RenderPipelineReflectionMTLTest() = default; ~RenderPipelineReflectionMTLTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_TRUE(iglDev_ != nullptr); ASSERT_TRUE(cmdQueue_ != nullptr); Result ret; auto shaderLibrary = ShaderLibraryCreator::fromStringInput( *iglDev_, data::shader::kMtlSimpleShader.data(), { {ShaderStage::Vertex, std::string(data::shader::kSimpleVertFunc)}, {ShaderStage::Fragment, std::string(data::shader::kSimpleFragFunc)}, }, "", &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); // Initialize vertex Shader vertShader_ = shaderLibrary->getShaderModule(ShaderStage::Vertex, std::string(data::shader::kSimpleVertFunc)); ASSERT_TRUE(vertShader_ != nullptr); // Initialize Fragment Shader fragShader_ = shaderLibrary->getShaderModule(ShaderStage::Fragment, std::string(data::shader::kSimpleFragFunc)); ASSERT_TRUE(fragShader_ != nullptr); // Initialize input to vertex shader VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Float4; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].bufferIndex = data::shader::kSimplePosIndex; inputDesc.attributes[0].name = data::shader::kSimplePos; inputDesc.attributes[0].location = 0; inputDesc.inputBindings[0].stride = sizeof(float) * 4; inputDesc.attributes[1].format = VertexAttributeFormat::Float2; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].bufferIndex = data::shader::kSimpleUvIndex; inputDesc.attributes[1].name = data::shader::kSimpleUv; inputDesc.attributes[1].location = 1; inputDesc.inputBindings[1].stride = sizeof(float) * 2; // numAttributes has to equal to bindings when using more than 1 buffer inputDesc.numAttributes = inputDesc.numInputBindings = 2; vertexInputState_ = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(vertexInputState_ != nullptr); NSError* error = nullptr; MTLRenderPipelineDescriptor* metalDesc = [MTLRenderPipelineDescriptor new]; metalDesc.vertexDescriptor = static_cast(vertexInputState_.get())->get(); metalDesc.vertexFunction = static_cast(vertShader_.get())->get(); IGL_DEBUG_ASSERT(metalDesc.vertexFunction, "RenderPipeline requires non-null vertex function"); metalDesc.fragmentFunction = static_cast(fragShader_.get())->get(); metalDesc.depthAttachmentPixelFormat = MTLPixelFormatDepth32Float_Stencil8; metalDesc.stencilAttachmentPixelFormat = MTLPixelFormatDepth32Float_Stencil8; MTLRenderPipelineReflection* reflection = nil; auto device = MTLCreateSystemDefaultDevice(); // Suppress warnings about MTLPipelineOptionArgumentInfo being deprecated #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" // Create reflection for use later in binding, etc. [device newRenderPipelineStateWithDescriptor:metalDesc options:MTLPipelineOptionArgumentInfo reflection:&reflection error:&error]; #pragma GCC diagnostic pop pipeRef_ = std::make_shared(reflection); ASSERT_NE(pipeRef_, nullptr); } void TearDown() override {} protected: std::shared_ptr pipeRef_; private: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; std::shared_ptr vertShader_; std::shared_ptr fragShader_; std::shared_ptr vertexInputState_; }; TEST_F(RenderPipelineReflectionMTLTest, GetIndexByName) { auto index = pipeRef_->getIndexByName(std::string(data::shader::kSimpleUv), ShaderStage::Vertex); ASSERT_EQ(index, 1); } TEST_F(RenderPipelineReflectionMTLTest, GetNonexistentIndexByName) { auto index = pipeRef_->getIndexByName("", ShaderStage::Fragment); ASSERT_EQ(index, -1); } TEST_F(RenderPipelineReflectionMTLTest, VerifyBuffers) { auto buffers = pipeRef_->allUniformBuffers(); ASSERT_EQ(buffers.size(), 2); for (const auto& buffer : buffers) { ASSERT_EQ(buffer.shaderStage, ShaderStage::Vertex); EXPECT_TRUE(buffer.name.toString() == data::shader::kSimplePos || buffer.name.toString() == data::shader::kSimpleUv); } } TEST_F(RenderPipelineReflectionMTLTest, VerifyTextures) { auto textures = pipeRef_->allTextures(); ASSERT_EQ(textures.size(), 1); const auto& theOneTexture = textures.front(); ASSERT_EQ(theOneTexture.name, "diffuseTex"); } TEST_F(RenderPipelineReflectionMTLTest, VerifySamplers) { auto samplers = pipeRef_->allSamplers(); ASSERT_EQ(samplers.size(), 1); const auto& theOneSampler = samplers.front(); ASSERT_EQ(theOneSampler.name, "linearSampler"); } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/RenderPipelineState.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../data/ShaderData.h" #include "../util/Common.h" #include #include #include #include #include namespace igl::tests { class RenderPipelineStateMTLTest : public ::testing::Test { public: RenderPipelineStateMTLTest() = default; ~RenderPipelineStateMTLTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_TRUE(iglDev_ != nullptr); ASSERT_TRUE(cmdQueue_ != nullptr); Result ret; // Initialize vertex Shader auto shaderLibrary = ShaderLibraryCreator::fromStringInput(*iglDev_, data::shader::kMtlSimpleShader.data(), data::shader::kSimpleVertFunc.data(), data::shader::kSimpleFragFunc.data(), "", &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(shaderLibrary != nullptr); vertShader_ = shaderLibrary->getShaderModule(std::string(data::shader::kSimpleVertFunc)); ASSERT_TRUE(vertShader_ != nullptr); fragShader_ = shaderLibrary->getShaderModule(std::string(data::shader::kSimpleFragFunc)); ASSERT_TRUE(fragShader_ != nullptr); // Initialize input to vertex shader VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Float4; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].bufferIndex = data::shader::kSimplePosIndex; inputDesc.attributes[0].name = data::shader::kSimplePos; inputDesc.attributes[0].location = 0; inputDesc.inputBindings[0].stride = sizeof(float) * 4; inputDesc.attributes[1].format = VertexAttributeFormat::Float2; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].bufferIndex = data::shader::kSimpleUvIndex; inputDesc.attributes[1].name = data::shader::kSimpleUv; inputDesc.attributes[1].location = 1; inputDesc.inputBindings[1].stride = sizeof(float) * 2; // numAttributes has to equal to bindings when using more than 1 buffer inputDesc.numAttributes = inputDesc.numInputBindings = 2; vertexInputState_ = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(vertexInputState_ != nullptr); NSError* error = nullptr; MTLRenderPipelineDescriptor* metalDesc = [MTLRenderPipelineDescriptor new]; metalDesc.vertexDescriptor = static_cast(vertexInputState_.get())->get(); metalDesc.vertexFunction = static_cast(vertShader_.get())->get(); IGL_DEBUG_ASSERT(metalDesc.vertexFunction, "RenderPipeline requires non-null vertex function"); metalDesc.fragmentFunction = static_cast(fragShader_.get())->get(); metalDesc.depthAttachmentPixelFormat = MTLPixelFormatDepth32Float_Stencil8; metalDesc.stencilAttachmentPixelFormat = MTLPixelFormatDepth32Float_Stencil8; MTLRenderPipelineReflection* reflection = nil; auto device = MTLCreateSystemDefaultDevice(); RenderPipelineDesc pipelineDesc{}; pipelineDesc.cullMode = CullMode::Back; pipelineDesc.frontFaceWinding = igl::WindingMode::CounterClockwise; pipelineDesc.polygonFillMode = PolygonFillMode::Fill; // Suppress warnings about MTLPipelineOptionArgumentInfo being deprecated #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" // Create reflection for use later in binding, etc. id metalObject = [device newRenderPipelineStateWithDescriptor:metalDesc options:MTLPipelineOptionArgumentInfo reflection:&reflection error:&error]; pipeState = std::make_shared(metalObject, reflection, pipelineDesc); id metalObjectWithoutRefl = [device newRenderPipelineStateWithDescriptor:metalDesc options:MTLPipelineOptionArgumentInfo reflection:nullptr error:&error]; #pragma GCC diagnostic pop pipeStateWithNoRefl_ = std::make_shared(metalObjectWithoutRefl, nullptr, pipelineDesc); ASSERT_NE(pipeState, nullptr); } void TearDown() override {} std::shared_ptr pipeState; protected: std::shared_ptr pipeStateWithNoRefl_; std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; std::shared_ptr vertShader_; std::shared_ptr fragShader_; std::shared_ptr vertexInputState_; }; TEST_F(RenderPipelineStateMTLTest, GetIndexByName) { auto index = pipeState->getIndexByName(std::string(data::shader::kSimpleUv), ShaderStage::Vertex); ASSERT_EQ(index, 1); } TEST_F(RenderPipelineStateMTLTest, GetNonexistentIndexByName) { auto index = pipeState->getIndexByName("", ShaderStage::Fragment); ASSERT_EQ(index, -1); } TEST_F(RenderPipelineStateMTLTest, GetIndexByNameWithoutRefl) { auto index = pipeStateWithNoRefl_->getIndexByName(std::string(data::shader::kSimpleUv), ShaderStage::Vertex); ASSERT_EQ(index, -1); } TEST_F(RenderPipelineStateMTLTest, GetIndexByNameHandle) { auto index = pipeState->getIndexByName(IGL_NAMEHANDLE(data::shader::kSimpleUv), ShaderStage::Vertex); ASSERT_EQ(index, 1); } TEST_F(RenderPipelineStateMTLTest, GetNonexistentIndexByNameHandle) { auto index = pipeState->getIndexByName("", ShaderStage::Fragment); ASSERT_EQ(index, -1); } TEST_F(RenderPipelineStateMTLTest, GetIndexByNameHandleWithoutRefl) { auto index = pipeStateWithNoRefl_->getIndexByName(IGL_NAMEHANDLE(data::shader::kSimpleUv), ShaderStage::Vertex); ASSERT_EQ(index, -1); } TEST_F(RenderPipelineStateMTLTest, ConvertColorWriteMaskRed) { auto mask = igl::metal::RenderPipelineState::convertColorWriteMask(kColorWriteBitsRed); ASSERT_EQ(mask, MTLColorWriteMaskRed); } TEST_F(RenderPipelineStateMTLTest, ConvertColorWriteMaskGreen) { auto mask = igl::metal::RenderPipelineState::convertColorWriteMask(kColorWriteBitsGreen); ASSERT_EQ(mask, MTLColorWriteMaskGreen); } TEST_F(RenderPipelineStateMTLTest, ConvertColorWriteMaskBlue) { auto mask = igl::metal::RenderPipelineState::convertColorWriteMask(kColorWriteBitsBlue); ASSERT_EQ(mask, MTLColorWriteMaskBlue); } TEST_F(RenderPipelineStateMTLTest, ConvertColorWriteMaskAlpha) { auto mask = igl::metal::RenderPipelineState::convertColorWriteMask(kColorWriteBitsAlpha); ASSERT_EQ(mask, MTLColorWriteMaskAlpha); } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/SamplerCreation.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include "../util/TestDevice.h" #include #include #include namespace igl::tests { // // MetalSamplerCreationTest // // This test covers creation of Metal sampler states with various configurations. // class MetalSamplerCreationTest : public ::testing::Test { public: MetalSamplerCreationTest() = default; ~MetalSamplerCreationTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(device_, cmdQueue_); ASSERT_NE(device_, nullptr); } void TearDown() override {} protected: std::shared_ptr device_; std::shared_ptr cmdQueue_; }; // // DefaultSampler // // Test creating a sampler with default descriptor values. // TEST_F(MetalSamplerCreationTest, DefaultSampler) { Result res; SamplerStateDesc desc; desc.debugName = "defaultSampler"; auto sampler = device_->createSamplerState(desc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(sampler, nullptr); } // // SamplerWithFilters // // Test creating a sampler with specific min, mag, and mip filters. // TEST_F(MetalSamplerCreationTest, SamplerWithFilters) { Result res; SamplerStateDesc desc; desc.minFilter = SamplerMinMagFilter::Linear; desc.magFilter = SamplerMinMagFilter::Linear; desc.mipFilter = SamplerMipFilter::Linear; desc.debugName = "linearSampler"; auto sampler = device_->createSamplerState(desc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(sampler, nullptr); } // // SamplerWithAddressModes // // Test creating a sampler with specific address modes. // TEST_F(MetalSamplerCreationTest, SamplerWithAddressModes) { Result res; SamplerStateDesc desc; desc.addressModeU = SamplerAddressMode::Clamp; desc.addressModeV = SamplerAddressMode::MirrorRepeat; desc.addressModeW = SamplerAddressMode::Repeat; desc.debugName = "addressModeSampler"; auto sampler = device_->createSamplerState(desc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(sampler, nullptr); } // // SamplerIsYUVFalse // // Test that a standard sampler reports isYUV as false. // TEST_F(MetalSamplerCreationTest, SamplerIsYUVFalse) { Result res; SamplerStateDesc desc = SamplerStateDesc::newLinear(); auto sampler = device_->createSamplerState(desc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(sampler, nullptr); ASSERT_FALSE(sampler->isYUV()); } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/SamplerState.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace igl::tests { class SamplerStateMTLTest : public ::testing::Test { public: SamplerStateMTLTest() = default; ~SamplerStateMTLTest() override = default; void SetUp() override { setDebugBreakEnabled(false); samplerState_ = std::make_shared(nil); } void TearDown() override {} protected: std::shared_ptr samplerState_; }; TEST_F(SamplerStateMTLTest, ConvertMinMagFilter) { MTLSamplerMinMagFilter res = MTLSamplerMinMagFilterNearest; res = igl::metal::SamplerState::convertMinMagFilter(SamplerMinMagFilter::Linear); ASSERT_EQ(res, MTLSamplerMinMagFilterLinear); res = igl::metal::SamplerState::convertMinMagFilter(SamplerMinMagFilter::Nearest); ASSERT_EQ(res, MTLSamplerMinMagFilterNearest); } TEST_F(SamplerStateMTLTest, ConvertMipFilter) { MTLSamplerMipFilter res = MTLSamplerMipFilterNotMipmapped; res = igl::metal::SamplerState::convertMipFilter(SamplerMipFilter::Disabled); ASSERT_EQ(res, MTLSamplerMipFilterNotMipmapped); res = igl::metal::SamplerState::convertMipFilter(SamplerMipFilter::Nearest); ASSERT_EQ(res, MTLSamplerMipFilterNearest); res = igl::metal::SamplerState::convertMipFilter(SamplerMipFilter::Linear); ASSERT_EQ(res, MTLSamplerMipFilterLinear); } TEST_F(SamplerStateMTLTest, ConvertAddressMode) { MTLSamplerAddressMode res = MTLSamplerAddressModeRepeat; res = igl::metal::SamplerState::convertAddressMode(SamplerAddressMode::Repeat); ASSERT_EQ(res, MTLSamplerAddressModeRepeat); res = igl::metal::SamplerState::convertAddressMode(SamplerAddressMode::Clamp); ASSERT_EQ(res, MTLSamplerAddressModeClampToEdge); res = igl::metal::SamplerState::convertAddressMode(SamplerAddressMode::MirrorRepeat); ASSERT_EQ(res, MTLSamplerAddressModeMirrorRepeat); } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/ShaderLibrary.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../data/ShaderData.h" #include "../util/Common.h" #include "../util/TestDevice.h" #include #include namespace igl::tests { // // MetalShaderLibraryTest // // This test covers creation and error paths of shader libraries on Metal. // class MetalShaderLibraryTest : public ::testing::Test { public: MetalShaderLibraryTest() = default; ~MetalShaderLibraryTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(device_, cmdQueue_); ASSERT_NE(device_, nullptr); } void TearDown() override {} protected: std::shared_ptr device_; std::shared_ptr cmdQueue_; }; // // CreateFromSource // // Test creating a shader library from a Metal source string. // TEST_F(MetalShaderLibraryTest, CreateFromSource) { Result res; const auto shaderSource = std::string(data::shader::kMtlSimpleShader); std::vector moduleInfo = { {ShaderStage::Vertex, std::string(data::shader::kSimpleVertFunc)}, {ShaderStage::Fragment, std::string(data::shader::kSimpleFragFunc)}, }; auto libraryDesc = ShaderLibraryDesc::fromStringInput(shaderSource.c_str(), moduleInfo, "testLibrary"); auto library = device_->createShaderLibrary(libraryDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(library, nullptr); // Verify we can retrieve individual shader modules auto vertModule = library->getShaderModule(std::string(data::shader::kSimpleVertFunc)); ASSERT_NE(vertModule, nullptr); auto fragModule = library->getShaderModule(std::string(data::shader::kSimpleFragFunc)); ASSERT_NE(fragModule, nullptr); } // // InvalidSourceReturnsError // // Test that creating a shader library with invalid shader source returns an error. // TEST_F(MetalShaderLibraryTest, InvalidSourceReturnsError) { Result res; const char* invalidSource = "this is not valid Metal shader code!!!"; std::vector moduleInfo = { {ShaderStage::Vertex, "nonExistentFunc"}, }; auto libraryDesc = ShaderLibraryDesc::fromStringInput(invalidSource, moduleInfo, "invalidLibrary"); auto library = device_->createShaderLibrary(libraryDesc, &res); ASSERT_FALSE(res.isOk()); } // // ShaderCompilationCountIncrements // // Test that shader compilation count increments after compiling a shader. // TEST_F(MetalShaderLibraryTest, ShaderCompilationCountIncrements) { const size_t countBefore = device_->getShaderCompilationCount(); Result res; const auto shaderSource = std::string(data::shader::kMtlSimpleShader); std::vector moduleInfo = { {ShaderStage::Vertex, std::string(data::shader::kSimpleVertFunc)}, {ShaderStage::Fragment, std::string(data::shader::kSimpleFragFunc)}, }; auto libraryDesc = ShaderLibraryDesc::fromStringInput(shaderSource.c_str(), moduleInfo, "countTestLibrary"); auto library = device_->createShaderLibrary(libraryDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; const size_t countAfter = device_->getShaderCompilationCount(); ASSERT_GT(countAfter, countBefore); } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/StorageMode.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include "../util/TestDevice.h" #include #include namespace igl::tests { // // MetalStorageModeTest // // This test covers the mapping of IGL ResourceStorage modes to Metal storage modes. // class MetalStorageModeTest : public ::testing::Test { public: MetalStorageModeTest() = default; ~MetalStorageModeTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(device_, cmdQueue_); ASSERT_NE(device_, nullptr); } void TearDown() override {} protected: std::shared_ptr device_; std::shared_ptr cmdQueue_; }; // // PrivateStorage // // Test that a buffer with Private storage mode is created successfully. // TEST_F(MetalStorageModeTest, PrivateStorage) { Result res; const BufferDesc desc{.type = BufferDesc::BufferTypeBits::Uniform, .length = 256, .storage = ResourceStorage::Private, .debugName = "privateBuffer"}; auto buffer = device_->createBuffer(desc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(buffer, nullptr); ASSERT_EQ(buffer->storage(), ResourceStorage::Private); } // // SharedStorage // // Test that a buffer with Shared storage mode is created successfully and reports Shared. // TEST_F(MetalStorageModeTest, SharedStorage) { Result res; const BufferDesc desc{.type = BufferDesc::BufferTypeBits::Uniform, .length = 256, .storage = ResourceStorage::Shared, .debugName = "sharedBuffer"}; auto buffer = device_->createBuffer(desc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(buffer, nullptr); ASSERT_EQ(buffer->storage(), ResourceStorage::Shared); } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/Texture.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #import #include #include #include #include #include #include #include namespace igl::tests { #define OFFSCREEN_TEX_WIDTH 2 #define OFFSCREEN_TEX_HEIGHT 2 // Picking this to check mipmap validity, max mipmap level = log(16) - 1 = 3 #define MIPMAP_TEX_WIDTH 16 #define MIPMAP_TEX_HEIGHT 16 class TextureMTLTest : public ::testing::Test { public: TextureMTLTest() = default; ~TextureMTLTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(device_, cmdQueue_); texDesc_ = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT, TextureDesc::TextureUsageBits::Sampled); Result res; texture_ = device_->createTexture(texDesc_, &res); ASSERT_TRUE(res.isOk()); } void TearDown() override {} protected: TextureDesc texDesc_; std::shared_ptr texture_; std::shared_ptr device_; std::shared_ptr cmdQueue_; }; class TextureFormatMTLTest : public util::TextureFormatTestBase { public: TextureFormatMTLTest() = default; ~TextureFormatMTLTest() override = default; }; // Test basic getter methods for successful construction TEST_F(TextureMTLTest, ConstructionFromMTLTexture) { auto* mtlTexture = static_cast(texture_.get()); ASSERT_NE(mtlTexture->get(), nullptr); auto dimensions = texture_->getDimensions(); ASSERT_EQ(dimensions.width, texDesc_.width); ASSERT_EQ(dimensions.height, texDesc_.height); ASSERT_EQ(dimensions.depth, texDesc_.depth); auto samples = texture_->getSamples(); ASSERT_EQ(samples, texDesc_.numSamples); auto format = texture_->getFormat(); ASSERT_EQ(format, texDesc_.format); } // Test upload TEST_F(TextureMTLTest, Upload) { const auto texRangeDesc = TextureRangeDesc(); const Result res = texture_->upload(texRangeDesc, nullptr); ASSERT_TRUE(res.isOk()); } // Test getDrawable TEST_F(TextureMTLTest, GetDrawable) { auto mtlTexture = std::dynamic_pointer_cast(texture_); ASSERT_EQ(mtlTexture->getDrawable(), nullptr); } // Test mipmap generation and methods TEST_F(TextureMTLTest, GetMipmapsCount) { Result res; TextureDesc miptexDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, MIPMAP_TEX_WIDTH, MIPMAP_TEX_HEIGHT, TextureDesc::TextureUsageBits::Sampled); int targetlevel = 0; size_t ind = std::min(miptexDesc.width, miptexDesc.height); while (ind >>= 1) { ++targetlevel; } miptexDesc.numMipLevels = targetlevel; // log(16) - 1 const std::shared_ptr mipTexture = device_->createTexture(miptexDesc, &res); ASSERT_TRUE(res.isOk()); auto mtlTexture = std::static_pointer_cast(mipTexture); mtlTexture->generateMipmap(*cmdQueue_); // Wait for completion const CommandBufferDesc desc = {}; const std::shared_ptr cmdBuf = cmdQueue_->createCommandBuffer(desc, &res); id mtlCmdBuf = static_cast(*cmdBuf).get(); [mtlCmdBuf commit]; cmdBuf->waitUntilCompleted(); ASSERT_EQ(mtlTexture->getNumMipLevels(), targetlevel); // Should get log(16) - 1 = 3 } // Test conversion from MTLTextureType to IGL TextureType TEST_F(TextureMTLTest, ToTextureType) { std::vector> inputAndExpectedList = { std::make_pair(MTLTextureType2D, TextureType::TwoD), std::make_pair(MTLTextureType2DMultisample, TextureType::TwoD), std::make_pair(MTLTextureType2DArray, TextureType::TwoDArray), std::make_pair(MTLTextureType3D, TextureType::ThreeD), std::make_pair(MTLTextureTypeCube, TextureType::Cube), std::make_pair(MTLTextureTypeCubeArray, TextureType::Invalid), }; if (@available(macOS 10.14, iOS 14.0, *)) { inputAndExpectedList.emplace_back(MTLTextureType2DMultisampleArray, TextureType::TwoDArray); } for (auto inputAndExpected : inputAndExpectedList) { auto input = inputAndExpected.first; auto expected = inputAndExpected.second; auto result = igl::metal::Texture::convertType(input); ASSERT_EQ(expected, result); } } // Test mipmap generation flag initialization TEST_F(TextureMTLTest, MipmapGenerationFlagInitialization) { const auto mtlTexture = std::dynamic_pointer_cast(texture_); ASSERT_NE(mtlTexture, nullptr); // Test that the mipmapGeneration flag is initialized to Manual by default ASSERT_EQ(mtlTexture->getMipmapGeneration(), TextureDesc::TextureMipmapGeneration::Manual); } // Test auto-generation of mipmaps on upload TEST_F(TextureMTLTest, AutoGenerateMipmapOnUpload) { Result ret; // Create a texture with AutoGenerateOnUpload flag - similar to existing mipmap tests constexpr uint32_t kNumMipLevels = 2; constexpr uint32_t kTexWidth = 2u; constexpr uint32_t kTexHeight = 2u; constexpr uint32_t kColor = 0xdeadbeef; constexpr std::array kBaseMipData = {kColor, kColor, kColor, kColor}; constexpr std::array kExpectedMip1Data = {kColor}; // Should be same color after // generation // Create texture with AutoGenerateOnUpload flag TextureDesc textureDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kTexWidth, kTexHeight, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); textureDesc.numMipLevels = kNumMipLevels; textureDesc.mipmapGeneration = TextureDesc::TextureMipmapGeneration::AutoGenerateOnUpload; auto texture = device_->createTexture(textureDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(texture, nullptr); // Cast to Metal texture to access Metal-specific methods auto* mtlTexture = static_cast(texture.get()); ASSERT_NE(mtlTexture, nullptr); // Verify the texture was created with the correct mipmap generation flag ASSERT_EQ(mtlTexture->getMipmapGeneration(), TextureDesc::TextureMipmapGeneration::AutoGenerateOnUpload); // Verify the texture has the expected number of mip levels ASSERT_EQ(mtlTexture->getNumMipLevels(), kNumMipLevels); // Upload data to mip level 0 - this should trigger automatic mipmap generation ret = texture->upload(texture->getFullRange(0), kBaseMipData.data()); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); // Validate that mip level 0 contains the uploaded data util::validateUploadedTextureRange(*device_, *cmdQueue_, texture, texture->getFullRange(0), kBaseMipData.data(), "AutoGen: Base level (0)"); // Validate that mip level 1 was auto-generated with expected content // The auto-generated mip should contain the same solid color (averaged from base level) util::validateUploadedTextureRange(*device_, *cmdQueue_, texture, texture->getFullRange(1), kExpectedMip1Data.data(), "AutoGen: Generated level (1)"); // Verify that the Metal texture resources remain valid ASSERT_NE(mtlTexture->get(), nullptr); } // Test manual mipmap generation for comparison TEST_F(TextureMTLTest, ManualMipmapGeneration) { Result ret; // Create a texture with Manual mipmap generation - follow same pattern as existing tests constexpr uint32_t kNumMipLevels = 2; constexpr uint32_t kTexWidth = 2u; constexpr uint32_t kTexHeight = 2u; constexpr uint32_t kColor = 0x8badf00d; // Different color from auto test constexpr std::array kBaseMipData = {kColor, kColor, kColor, kColor}; constexpr std::array kInitialMip1Data = {0}; // Initialize mip 1 with zero constexpr std::array kExpectedMip1Data = {kColor}; // Should match base after // generation // Create texture with Manual mipmap generation TextureDesc textureDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kTexWidth, kTexHeight, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); textureDesc.numMipLevels = kNumMipLevels; textureDesc.mipmapGeneration = TextureDesc::TextureMipmapGeneration::Manual; auto texture = device_->createTexture(textureDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(texture, nullptr); auto* mtlTexture = static_cast(texture.get()); ASSERT_NE(mtlTexture, nullptr); // Verify the texture was created with Manual mipmap generation ASSERT_EQ(mtlTexture->getMipmapGeneration(), TextureDesc::TextureMipmapGeneration::Manual); // Verify the texture has the expected number of mip levels ASSERT_EQ(mtlTexture->getNumMipLevels(), kNumMipLevels); // Upload data to base mip level (level 0) ret = texture->upload(texture->getFullRange(0), kBaseMipData.data()); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); // Upload initial data to mip level 1 (will be overwritten by generateMipmap) ret = texture->upload(texture->getFullRange(1), kInitialMip1Data.data()); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); // Validate initial state - base level should have uploaded data util::validateUploadedTextureRange(*device_, *cmdQueue_, texture, texture->getFullRange(0), kBaseMipData.data(), "Manual: Initial base level (0)"); // Validate initial state - mip level 1 should have initial zero data util::validateUploadedTextureRange(*device_, *cmdQueue_, texture, texture->getFullRange(1), kInitialMip1Data.data(), "Manual: Initial mip level (1)"); // Now manually generate mipmaps - this should overwrite mip level 1 mtlTexture->generateMipmap(*cmdQueue_, nullptr); // Validate final state - base level should still have original data util::validateUploadedTextureRange(*device_, *cmdQueue_, texture, texture->getFullRange(0), kBaseMipData.data(), "Manual: Final base level (0)"); // Validate final state - mip level 1 should now have generated data util::validateUploadedTextureRange(*device_, *cmdQueue_, texture, texture->getFullRange(1), kExpectedMip1Data.data(), "Manual: Generated mip level (1)"); } // Test conversion from IGL TextureType to MTLTextureType // Current IGL makes the following assumptions, which may not be valid in the future // * Falls back to MTLTextureType1D for TextureType::Invalid TEST_F(TextureMTLTest, ToMTLTextureType) { std::vector> inputAndExpectedList = { std::make_tuple(TextureType::Invalid, 1, MTLTextureType1D), std::make_tuple(TextureType::TwoD, 1, MTLTextureType2D), std::make_tuple(TextureType::TwoD, 2, MTLTextureType2DMultisample), std::make_tuple(TextureType::TwoDArray, 1, MTLTextureType2DArray), std::make_tuple(TextureType::ThreeD, 1, MTLTextureType3D), std::make_tuple(TextureType::Cube, 1, MTLTextureTypeCube)}; if (@available(macOS 10.14, iOS 14.0, *)) { inputAndExpectedList.emplace_back(TextureType::TwoDArray, 2, MTLTextureType2DMultisampleArray); } for (auto inputAndExpected : inputAndExpectedList) { auto input = std::get<0>(inputAndExpected); auto numSamples = std::get<1>(inputAndExpected); auto expected = std::get<2>(inputAndExpected); auto result = igl::metal::Texture::convertType(input, numSamples); ASSERT_EQ(expected, result); } } static std::shared_ptr createCVPixelBufferTextureWithSize( TextureFormat format, const size_t width, const size_t height, const std::shared_ptr& device, Result& outResult) { const igl::BackendType backend = device->getBackendType(); CVPixelBufferRef pixelBuffer = nullptr; NSDictionary* bufferAttributes = @{ (NSString*)kCVPixelBufferIOSurfacePropertiesKey : @{}, (NSString*)kCVPixelBufferMetalCompatibilityKey : @(backend == igl::BackendType::Metal), }; const CVReturn result = CVPixelBufferCreate(kCFAllocatorDefault, width, height, kCVPixelFormatType_32BGRA, (__bridge CFDictionaryRef)(bufferAttributes), &pixelBuffer); if (result != kCVReturnSuccess) { Result::setResult(&outResult, Result::Code::RuntimeError, "CVPixelBufferCreate failed to create pixel buffer"); return nullptr; } auto* platformDevice = device->getPlatformDevice(); std::shared_ptr texture = platformDevice->createTextureFromNativePixelBuffer(pixelBuffer, format, 0, &outResult); if (!outResult.isOk()) { return nullptr; } if (texture == nullptr) { Result::setResult( &outResult, Result::Code::RuntimeError, "failed to create igl texture from CVPixelBuffer"); return nullptr; } CVPixelBufferRelease(pixelBuffer); Result::setOk(&outResult); return texture; } TEST_F(TextureFormatMTLTest, createTextureFromNativePixelBufferSuccess) { Result result; auto texture = createCVPixelBufferTextureWithSize(TextureFormat::BGRA_UNorm8, 100, 100, iglDev_, result); ASSERT_EQ(result.isOk(), true) << result.message.c_str(); testUsage(texture, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment, "SampledAttachment"); } TEST_F(TextureMTLTest, createTextureFromNativePixelBufferWithInvalidFormat) { Result result; auto texture = createCVPixelBufferTextureWithSize(TextureFormat::Invalid, 100, 100, device_, result); ASSERT_EQ(result.isOk(), false) << result.message.c_str(); } TEST_F(TextureMTLTest, ConvertTextureFormats) { const std::vector inputFormats = { TextureFormat::A_UNorm8, TextureFormat::R_UNorm8, TextureFormat::R_F16, TextureFormat::R_UInt16, #if !IGL_PLATFORM_MACOSX TextureFormat::B5G5R5A1_UNorm, #endif #if !(IGL_PLATFORM_MACOSX || IGL_PLATFORM_IOS_SIMULATOR) // https://developer.apple.com/documentation/metal/developing_metal_apps_that_run_in_simulator TextureFormat::B5G6R5_UNorm, TextureFormat::ABGR_UNorm4, #endif TextureFormat::RG_UNorm8, TextureFormat::R4G2B2_UNorm_Apple, TextureFormat::R4G2B2_UNorm_Rev_Apple, TextureFormat::RGBA_UNorm8, TextureFormat::BGRA_UNorm8, TextureFormat::RG_F16, TextureFormat::RG_UInt16, TextureFormat::RGB10_A2_UNorm_Rev, TextureFormat::RGB10_A2_Uint_Rev, TextureFormat::BGR10_A2_Unorm, TextureFormat::R_F32, TextureFormat::R_UInt32, TextureFormat::RG_F32, TextureFormat::RGBA_F16, TextureFormat::RGBA_UInt32, TextureFormat::RGBA_F32, #if !IGL_PLATFORM_MACOSX TextureFormat::RGBA_ASTC_4x4, TextureFormat::SRGB8_A8_ASTC_4x4, TextureFormat::RGBA_ASTC_5x4, TextureFormat::SRGB8_A8_ASTC_5x4, TextureFormat::RGBA_ASTC_5x5, TextureFormat::SRGB8_A8_ASTC_5x5, TextureFormat::RGBA_ASTC_6x5, TextureFormat::SRGB8_A8_ASTC_6x5, TextureFormat::RGBA_ASTC_6x6, TextureFormat::SRGB8_A8_ASTC_6x6, TextureFormat::RGBA_ASTC_8x5, TextureFormat::SRGB8_A8_ASTC_8x5, TextureFormat::RGBA_ASTC_8x6, TextureFormat::SRGB8_A8_ASTC_8x6, TextureFormat::RGBA_ASTC_8x8, TextureFormat::SRGB8_A8_ASTC_8x8, TextureFormat::RGBA_ASTC_10x5, TextureFormat::SRGB8_A8_ASTC_10x5, TextureFormat::RGBA_ASTC_10x6, TextureFormat::SRGB8_A8_ASTC_10x6, TextureFormat::RGBA_ASTC_10x8, TextureFormat::SRGB8_A8_ASTC_10x8, TextureFormat::RGBA_ASTC_10x10, TextureFormat::SRGB8_A8_ASTC_10x10, TextureFormat::RGBA_ASTC_12x10, TextureFormat::SRGB8_A8_ASTC_12x10, TextureFormat::RGBA_ASTC_12x12, TextureFormat::SRGB8_A8_ASTC_12x12, TextureFormat::RGBA_PVRTC_2BPPV1, TextureFormat::RGB_PVRTC_2BPPV1, TextureFormat::RGBA_PVRTC_4BPPV1, TextureFormat::RGB_PVRTC_4BPPV1, TextureFormat::RGB8_ETC1, TextureFormat::RGB8_ETC2, TextureFormat::SRGB8_ETC2, TextureFormat::RGBA8_EAC_ETC2, TextureFormat::SRGB8_A8_EAC_ETC2, TextureFormat::RG_EAC_UNorm, TextureFormat::RG_EAC_SNorm, TextureFormat::R_EAC_UNorm, TextureFormat::R_EAC_SNorm, #endif TextureFormat::Z_UNorm16, TextureFormat::Z_UNorm24, TextureFormat::Z_UNorm32, TextureFormat::S8_UInt_Z24_UNorm, TextureFormat::S8_UInt_Z32_UNorm, TextureFormat::S_UInt8}; const std::vector invalidTextureFormats = { TextureFormat::Invalid, TextureFormat::L_UNorm8, #if IGL_PLATFORM_MACOSX TextureFormat::B5G5R5A1_UNorm, #endif #if IGL_PLATFORM_MACOSX || IGL_PLATFORM_IOS_SIMULATOR TextureFormat::B5G6R5_UNorm, TextureFormat::ABGR_UNorm4, #endif TextureFormat::LA_UNorm8, TextureFormat::R5G5B5A1_UNorm, TextureFormat::RGBX_UNorm8, TextureFormat::BGRA_UNorm8_Rev, TextureFormat::RGB_F16, TextureFormat::RGB_F32, #if IGL_PLATFORM_MACOSX TextureFormat::RGBA_ASTC_4x4, TextureFormat::SRGB8_A8_ASTC_4x4, TextureFormat::RGBA_ASTC_5x4, TextureFormat::SRGB8_A8_ASTC_5x4, TextureFormat::RGBA_ASTC_5x5, TextureFormat::SRGB8_A8_ASTC_5x5, TextureFormat::RGBA_ASTC_6x5, TextureFormat::SRGB8_A8_ASTC_6x5, TextureFormat::RGBA_ASTC_6x6, TextureFormat::SRGB8_A8_ASTC_6x6, TextureFormat::RGBA_ASTC_8x5, TextureFormat::SRGB8_A8_ASTC_8x5, TextureFormat::RGBA_ASTC_8x6, TextureFormat::SRGB8_A8_ASTC_8x6, TextureFormat::RGBA_ASTC_8x8, TextureFormat::SRGB8_A8_ASTC_8x8, TextureFormat::RGBA_ASTC_10x5, TextureFormat::SRGB8_A8_ASTC_10x5, TextureFormat::RGBA_ASTC_10x6, TextureFormat::SRGB8_A8_ASTC_10x6, TextureFormat::RGBA_ASTC_10x8, TextureFormat::SRGB8_A8_ASTC_10x8, TextureFormat::RGBA_ASTC_10x10, TextureFormat::SRGB8_A8_ASTC_10x10, TextureFormat::RGBA_ASTC_12x10, TextureFormat::SRGB8_A8_ASTC_12x10, TextureFormat::RGBA_ASTC_12x12, TextureFormat::SRGB8_A8_ASTC_12x12, TextureFormat::RGBA_PVRTC_2BPPV1, TextureFormat::RGB_PVRTC_2BPPV1, TextureFormat::RGBA_PVRTC_4BPPV1, TextureFormat::RGB_PVRTC_4BPPV1, TextureFormat::RGB8_ETC1, TextureFormat::RGB8_ETC2, TextureFormat::SRGB8_ETC2, #endif TextureFormat::RGB8_Punchthrough_A1_ETC2, TextureFormat::SRGB8_Punchthrough_A1_ETC2, #if IGL_PLATFORM_MACOSX TextureFormat::RGBA8_EAC_ETC2, TextureFormat::SRGB8_A8_EAC_ETC2, TextureFormat::RG_EAC_UNorm, TextureFormat::RG_EAC_SNorm, TextureFormat::R_EAC_UNorm, TextureFormat::R_EAC_SNorm, #endif }; for (auto format : invalidTextureFormats) { ASSERT_EQ(true, igl::metal::Texture::textureFormatToMTLPixelFormat(format) == MTLPixelFormatInvalid); } } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/TextureDataRoundtrip.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include "../util/TestDevice.h" #include #include #include #include #include #include namespace igl::tests { #define ROUNDTRIP_TEX_WIDTH 4 #define ROUNDTRIP_TEX_HEIGHT 4 // // MetalTextureDataRoundtripTest // // This test covers uploading texture data and reading it back on Metal. // Tests RGBA upload/readback, mip level uploads, and 3D textures. // class MetalTextureDataRoundtripTest : public ::testing::Test { public: MetalTextureDataRoundtripTest() = default; ~MetalTextureDataRoundtripTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(device_, cmdQueue_); ASSERT_NE(device_, nullptr); } void TearDown() override {} protected: std::shared_ptr device_; std::shared_ptr cmdQueue_; }; // // UploadAndReadback_RGBA // // Upload RGBA data to a texture, read it back via framebuffer copyBytes, and verify match. // TEST_F(MetalTextureDataRoundtripTest, UploadAndReadback_RGBA) { Result res; TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, ROUNDTRIP_TEX_WIDTH, ROUNDTRIP_TEX_HEIGHT, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); auto texture = device_->createTexture(texDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(texture, nullptr); // Prepare test data: solid green const size_t numPixels = ROUNDTRIP_TEX_WIDTH * ROUNDTRIP_TEX_HEIGHT; std::vector uploadData(numPixels, 0xFF00FF00); // RGBA: green with full alpha auto range = TextureRangeDesc::new2D(0, 0, ROUNDTRIP_TEX_WIDTH, ROUNDTRIP_TEX_HEIGHT); res = texture->upload(range, uploadData.data()); ASSERT_TRUE(res.isOk()) << res.message; // Create framebuffer to read back FramebufferDesc fbDesc; fbDesc.colorAttachments[0].texture = texture; auto framebuffer = device_->createFramebuffer(fbDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; std::vector readbackData(numPixels, 0); framebuffer->copyBytesColorAttachment( *cmdQueue_, 0, readbackData.data(), range, ROUNDTRIP_TEX_WIDTH * 4); for (size_t i = 0; i < numPixels; ++i) { ASSERT_EQ(readbackData[i], uploadData[i]) << "Mismatch at pixel " << i; } } // // UploadToMipLevel // // Upload data to a specific mip level and verify the upload succeeds. // TEST_F(MetalTextureDataRoundtripTest, UploadToMipLevel) { Result res; TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, ROUNDTRIP_TEX_WIDTH, ROUNDTRIP_TEX_HEIGHT, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); texDesc.numMipLevels = 2; // base (4x4) + mip 1 (2x2) auto texture = device_->createTexture(texDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(texture, nullptr); // Upload to mip level 0 const size_t numPixels0 = ROUNDTRIP_TEX_WIDTH * ROUNDTRIP_TEX_HEIGHT; std::vector data0(numPixels0, 0xFFFF0000); res = texture->upload(texture->getFullRange(0), data0.data()); ASSERT_TRUE(res.isOk()) << res.message; // Upload to mip level 1 (2x2) const size_t numPixels1 = (ROUNDTRIP_TEX_WIDTH / 2) * (ROUNDTRIP_TEX_HEIGHT / 2); std::vector data1(numPixels1, 0xFF0000FF); res = texture->upload(texture->getFullRange(1), data1.data()); ASSERT_TRUE(res.isOk()) << res.message; } // // Upload3DTexture // // Upload data to a 3D texture and verify the upload succeeds. // TEST_F(MetalTextureDataRoundtripTest, Upload3DTexture) { Result res; constexpr uint32_t kWidth = 4; constexpr uint32_t kHeight = 4; constexpr uint32_t kDepth = 4; TextureDesc texDesc; texDesc.type = TextureType::ThreeD; texDesc.format = TextureFormat::RGBA_UNorm8; texDesc.width = kWidth; texDesc.height = kHeight; texDesc.depth = kDepth; texDesc.numMipLevels = 1; texDesc.usage = TextureDesc::TextureUsageBits::Sampled; auto texture = device_->createTexture(texDesc, &res); ASSERT_TRUE(res.isOk()) << res.message; ASSERT_NE(texture, nullptr); const size_t numPixels = kWidth * kHeight * kDepth; std::vector data(numPixels, 0xFF808080); auto range = TextureRangeDesc::new3D(0, 0, 0, kWidth, kHeight, kDepth); res = texture->upload(range, data.data()); ASSERT_TRUE(res.isOk()) << res.message; } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/Timer.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../util/Common.h" #include "../util/TestDevice.h" #include #include namespace igl::tests { // // MetalTimerTest // // This test covers ITimer creation and basic operations on Metal. // class MetalTimerTest : public ::testing::Test { public: MetalTimerTest() = default; ~MetalTimerTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(device_, cmdQueue_); ASSERT_NE(device_, nullptr); } void TearDown() override {} protected: std::shared_ptr device_; std::shared_ptr cmdQueue_; }; // // TimerCreation // // Test that creating a timer succeeds. // TEST_F(MetalTimerTest, TimerCreation) { Result res; auto timer = device_->createTimer(&res); // Timer may not be supported on all Metal devices if (res.isOk()) { ASSERT_NE(timer, nullptr); } } // // InitialElapsedTimeZero // // Test that the initial elapsed time of a newly created timer is 0. // TEST_F(MetalTimerTest, InitialElapsedTimeZero) { Result res; auto timer = device_->createTimer(&res); if (!res.isOk()) { GTEST_SKIP() << "Timer not supported on this device"; } ASSERT_NE(timer, nullptr); // Before any GPU work, elapsed time should be 0 ASSERT_EQ(timer->getElapsedTimeNanos(), 0u); } } // namespace igl::tests ================================================ FILE: src/igl/tests/metal/VertexInputState.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "../../metal/VertexInputState.h" #include "../util/Common.h" #include #include namespace igl::tests { // VertexInputStateMTLTest // // This test covers igl::metal::Device::createVertexInputState. Most of the testing // revolves around validating correction rejection of invalid input. class VertexInputStateMTLTest : public ::testing::Test { public: VertexInputStateMTLTest() = default; ~VertexInputStateMTLTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; }; TEST_F(VertexInputStateMTLTest, testDefaultVertexInputDesc) { ASSERT_TRUE(iglDev_ != nullptr); const VertexInputStateDesc inputDesc; Result ret; const std::shared_ptr vertexInputState = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); } TEST_F(VertexInputStateMTLTest, testWithNumAttributesTooLarge) { ASSERT_TRUE(iglDev_ != nullptr); VertexInputStateDesc inputDesc; inputDesc.numAttributes = IGL_VERTEX_ATTRIBUTES_MAX + 1; Result ret; const std::shared_ptr vertexInputState = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::ArgumentOutOfRange); ASSERT_EQ(ret.message, "numAttributes is too large in VertexInputStateDesc"); ASSERT_TRUE(vertexInputState == nullptr); } TEST_F(VertexInputStateMTLTest, testWithNumBindingsTooLarge) { ASSERT_TRUE(iglDev_ != nullptr); VertexInputStateDesc inputDesc; inputDesc.numInputBindings = IGL_BUFFER_BINDINGS_MAX + 1; Result ret; const std::shared_ptr vertexInputState = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::ArgumentOutOfRange); ASSERT_EQ(ret.message, "numInputBindings is too large in VertexInputStateDesc"); } // In this test we have a single attribute and no bindings // and this should fail because the bufferIndexes are invalid. TEST_F(VertexInputStateMTLTest, testOneAttribute) { ASSERT_TRUE(iglDev_ != nullptr); VertexInputStateDesc inputDesc; inputDesc.numAttributes = 1; inputDesc.attributes[0].bufferIndex = 0; inputDesc.attributes[0].format = VertexAttributeFormat::Float1; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].name = "unused"; inputDesc.attributes[0].location = 0; inputDesc.numInputBindings = 0; Result ret; const std::shared_ptr vertexInputState = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::ArgumentInvalid); } TEST_F(VertexInputStateMTLTest, testNegativeBufferIndex) { ASSERT_TRUE(iglDev_ != nullptr); VertexInputStateDesc inputDesc; inputDesc.numAttributes = 1; inputDesc.attributes[0].bufferIndex = -1; inputDesc.attributes[0].format = VertexAttributeFormat::Float1; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].name = "unused"; inputDesc.attributes[0].location = 0; inputDesc.numInputBindings = 1; Result ret; const std::shared_ptr vertexInputState = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::ArgumentOutOfRange); } TEST_F(VertexInputStateMTLTest, testNegativeLocation) { ASSERT_TRUE(iglDev_ != nullptr); VertexInputStateDesc inputDesc; inputDesc.numAttributes = 1; inputDesc.attributes[0].bufferIndex = 0; inputDesc.attributes[0].format = VertexAttributeFormat::Float1; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].name = "unused"; inputDesc.attributes[0].location = -1; inputDesc.numInputBindings = 1; Result ret; const std::shared_ptr vertexInputState = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::ArgumentOutOfRange); } // Attribute locations have to be unique. // Here we set two locations to the same number (1). // Test should fail TEST_F(VertexInputStateMTLTest, testLocationUnique) { ASSERT_TRUE(iglDev_ != nullptr); VertexInputStateDesc inputDesc; inputDesc.numAttributes = 2; inputDesc.attributes[0].bufferIndex = 0; inputDesc.attributes[0].format = VertexAttributeFormat::Float1; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].name = "unused"; inputDesc.attributes[0].location = 1; inputDesc.attributes[1].bufferIndex = 0; inputDesc.attributes[1].format = VertexAttributeFormat::Float1; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].name = "unused"; inputDesc.attributes[1].location = 1; inputDesc.numInputBindings = 1; Result ret; const std::shared_ptr vertexInputState = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::ArgumentInvalid); } // Attribute locations do not have to start at 0 and they do not have to be sequential. // Here we set attribute locations to 10 and 21. // Test should pass. TEST_F(VertexInputStateMTLTest, testLocationNonSequential) { ASSERT_TRUE(iglDev_ != nullptr); VertexInputStateDesc inputDesc; inputDesc.numAttributes = 2; inputDesc.attributes[0].bufferIndex = 0; inputDesc.attributes[0].format = VertexAttributeFormat::Float1; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].name = "unused"; inputDesc.attributes[0].location = 10; inputDesc.attributes[1].bufferIndex = 0; inputDesc.attributes[1].format = VertexAttributeFormat::Float1; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].name = "unused"; inputDesc.attributes[1].location = 15; inputDesc.numInputBindings = 1; Result ret; const std::shared_ptr vertexInputState = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); } TEST_F(VertexInputStateMTLTest, testTwoAttributesZeroBinding) { ASSERT_TRUE(iglDev_ != nullptr); VertexInputStateDesc inputDesc; inputDesc.numAttributes = 2; inputDesc.attributes[0].bufferIndex = 0; inputDesc.attributes[0].format = VertexAttributeFormat::Float1; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].name = "unused1"; inputDesc.attributes[0].location = 0; inputDesc.attributes[1].bufferIndex = 0; inputDesc.attributes[1].format = VertexAttributeFormat::Float1; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].name = "unused2"; inputDesc.attributes[1].location = 1; inputDesc.numInputBindings = 0; Result ret; const std::shared_ptr vertexInputState = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::ArgumentInvalid); ASSERT_TRUE(vertexInputState == nullptr); } TEST_F(VertexInputStateMTLTest, testTwoAttributesNotCovering) { ASSERT_TRUE(iglDev_ != nullptr); VertexInputStateDesc inputDesc; inputDesc.numAttributes = 2; inputDesc.attributes[0].bufferIndex = 0; inputDesc.attributes[0].format = VertexAttributeFormat::Float1; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].name = "unused1"; inputDesc.attributes[0].location = 0; inputDesc.attributes[1].bufferIndex = 0; inputDesc.attributes[1].format = VertexAttributeFormat::Float1; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].name = "unused2"; inputDesc.attributes[1].location = 0; inputDesc.numInputBindings = 1; Result ret; const std::shared_ptr vertexInputState = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::ArgumentInvalid); ASSERT_TRUE(vertexInputState == nullptr); } TEST_F(VertexInputStateMTLTest, testTwoAttributesOneBuffer) { ASSERT_TRUE(iglDev_ != nullptr); VertexInputStateDesc inputDesc; inputDesc.numAttributes = 2; inputDesc.attributes[0].bufferIndex = 0; inputDesc.attributes[0].format = VertexAttributeFormat::Float1; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].name = "unused1"; inputDesc.attributes[0].location = 1; inputDesc.attributes[1].bufferIndex = 0; inputDesc.attributes[1].format = VertexAttributeFormat::Float1; inputDesc.attributes[1].offset = 8; inputDesc.attributes[1].name = "unused2"; inputDesc.attributes[1].location = 0; inputDesc.numInputBindings = 1; inputDesc.inputBindings[0].stride = 16; inputDesc.inputBindings[0].sampleFunction = VertexSampleFunction::PerVertex; inputDesc.inputBindings[0].sampleRate = 2; Result ret; const std::shared_ptr vertexInputState = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vertexInputState != nullptr); const std::shared_ptr<::igl::metal::VertexInputState> metalVertexInputState = std::static_pointer_cast<::igl::metal::VertexInputState>(vertexInputState); ASSERT_TRUE(metalVertexInputState != nullptr); MTLVertexDescriptor* metalVertexDescriptor = metalVertexInputState->get(); ASSERT_TRUE(metalVertexDescriptor != nullptr); ASSERT_EQ(MTLVertexFormatFloat, metalVertexDescriptor.attributes[0].format); ASSERT_EQ(0, metalVertexDescriptor.attributes[0].bufferIndex); ASSERT_EQ(8, metalVertexDescriptor.attributes[0].offset); ASSERT_EQ(MTLVertexFormatFloat, metalVertexDescriptor.attributes[1].format); ASSERT_EQ(0, metalVertexDescriptor.attributes[1].bufferIndex); ASSERT_EQ(0, metalVertexDescriptor.attributes[1].offset); ASSERT_EQ(16, metalVertexDescriptor.layouts[0].stride); ASSERT_EQ(MTLVertexStepFunctionPerVertex, metalVertexDescriptor.layouts[0].stepFunction); ASSERT_EQ(2, metalVertexDescriptor.layouts[0].stepRate); } TEST(VertexInputStateMTLStaticTest, testConvertAttributeFormat) { ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::Float1), MTLVertexFormatFloat); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::Float2), MTLVertexFormatFloat2); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::Float3), MTLVertexFormatFloat3); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::Float4), MTLVertexFormatFloat4); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::Byte2), MTLVertexFormatChar2); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::Byte3), MTLVertexFormatChar3); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::Byte4), MTLVertexFormatChar4); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::UByte2), MTLVertexFormatUChar2); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::UByte3), MTLVertexFormatUChar3); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::UByte4), MTLVertexFormatUChar4); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::Short2), MTLVertexFormatShort2); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::Short3), MTLVertexFormatShort3); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::Short4), MTLVertexFormatShort4); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::UShort2), MTLVertexFormatUShort2); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::UShort3), MTLVertexFormatUShort3); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::UShort4), MTLVertexFormatUShort4); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::Byte1Norm), MTLVertexFormatCharNormalized); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::Byte2Norm), MTLVertexFormatChar2Normalized); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::Byte3Norm), MTLVertexFormatChar3Normalized); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::Byte4Norm), MTLVertexFormatChar4Normalized); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::UByte1Norm), MTLVertexFormatUCharNormalized); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::UByte2Norm), MTLVertexFormatUChar2Normalized); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::UByte3Norm), MTLVertexFormatUChar3Normalized); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::UByte4Norm), MTLVertexFormatUChar4Normalized); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::Short1Norm), MTLVertexFormatShortNormalized); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::Short2Norm), MTLVertexFormatShort2Normalized); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::Short3Norm), MTLVertexFormatShort3Normalized); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::Short4Norm), MTLVertexFormatShort4Normalized); ASSERT_EQ( igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::UShort1Norm), MTLVertexFormatUShortNormalized); ASSERT_EQ( igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::UShort2Norm), MTLVertexFormatUShort2Normalized); ASSERT_EQ( igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::UShort3Norm), MTLVertexFormatUShort3Normalized); ASSERT_EQ( igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::UShort4Norm), MTLVertexFormatUShort4Normalized); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::Byte1), MTLVertexFormatInvalid); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::UByte1), MTLVertexFormatInvalid); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::Short1), MTLVertexFormatInvalid); ASSERT_EQ(igl::metal::VertexInputState::convertAttributeFormat(VertexAttributeFormat::UShort1), MTLVertexFormatInvalid); } TEST(VertexInputStateMTLStaticTest, testConvertSampleFunction) { ASSERT_EQ(igl::metal::VertexInputState::convertSampleFunction(VertexSampleFunction::Constant), MTLVertexStepFunctionConstant); ASSERT_EQ(igl::metal::VertexInputState::convertSampleFunction(VertexSampleFunction::PerVertex), MTLVertexStepFunctionPerVertex); ASSERT_EQ(igl::metal::VertexInputState::convertSampleFunction(VertexSampleFunction::Instance), MTLVertexStepFunctionPerInstance); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/BindlessTextures.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include namespace igl::tests { // // BindlessTexturesOGLTest // // Tests for bindless texture operations in OpenGL. // class BindlessTexturesOGLTest : public ::testing::Test { public: BindlessTexturesOGLTest() = default; ~BindlessTexturesOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); context_ = &static_cast(*iglDev_).getContext(); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; opengl::IContext* context_ = nullptr; }; // // GetTextureHandle // // Get a bindless texture handle if the extension is supported. // TEST_F(BindlessTexturesOGLTest, GetTextureHandle) { if (!iglDev_->hasFeature(DeviceFeatures::TextureBindless)) { GTEST_SKIP() << "Bindless textures not supported"; } Result ret; // Create a simple texture const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 2, 2, TextureDesc::TextureUsageBits::Sampled); auto texture = iglDev_->createTexture(texDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(texture, nullptr); // Attempt to get a bindless handle via IContext // The texture needs to have a valid GL name for this to work // This is a low-level test - the actual handle value depends on the driver ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/BlendModeConversion.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include namespace igl::tests { // // BlendModeConversionOGLTest // // Tests for BlendOp and BlendFactor conversion in the OpenGL RenderPipelineState. // class BlendModeConversionOGLTest : public ::testing::Test { public: BlendModeConversionOGLTest() = default; ~BlendModeConversionOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); } void TearDown() override {} }; // // ConvertBlendOp // // Test all 5 blend operations map to their GL equivalents. // TEST_F(BlendModeConversionOGLTest, ConvertBlendOp) { const std::vector> conversions = { {BlendOp::Add, GL_FUNC_ADD}, {BlendOp::Subtract, GL_FUNC_SUBTRACT}, {BlendOp::ReverseSubtract, GL_FUNC_REVERSE_SUBTRACT}, {BlendOp::Min, GL_MIN}, {BlendOp::Max, GL_MAX}, }; for (const auto& [iglOp, glOp] : conversions) { ASSERT_EQ(igl::opengl::RenderPipelineState::convertBlendOp(iglOp), glOp); } } // // ConvertBlendFactor // // Test all blend factors map to their GL equivalents. // TEST_F(BlendModeConversionOGLTest, ConvertBlendFactor) { const std::vector> conversions = { {BlendFactor::Zero, GL_ZERO}, {BlendFactor::One, GL_ONE}, {BlendFactor::SrcColor, GL_SRC_COLOR}, {BlendFactor::OneMinusSrcColor, GL_ONE_MINUS_SRC_COLOR}, {BlendFactor::DstColor, GL_DST_COLOR}, {BlendFactor::OneMinusDstColor, GL_ONE_MINUS_DST_COLOR}, {BlendFactor::SrcAlpha, GL_SRC_ALPHA}, {BlendFactor::OneMinusSrcAlpha, GL_ONE_MINUS_SRC_ALPHA}, {BlendFactor::DstAlpha, GL_DST_ALPHA}, {BlendFactor::OneMinusDstAlpha, GL_ONE_MINUS_DST_ALPHA}, {BlendFactor::BlendColor, GL_CONSTANT_COLOR}, {BlendFactor::OneMinusBlendColor, GL_ONE_MINUS_CONSTANT_COLOR}, {BlendFactor::BlendAlpha, GL_CONSTANT_ALPHA}, {BlendFactor::OneMinusBlendAlpha, GL_ONE_MINUS_CONSTANT_ALPHA}, {BlendFactor::SrcAlphaSaturated, GL_SRC_ALPHA_SATURATE}, // Unsupported values default to GL_ONE {BlendFactor::Src1Color, GL_ONE}, {BlendFactor::OneMinusSrc1Color, GL_ONE}, {BlendFactor::Src1Alpha, GL_ONE}, {BlendFactor::OneMinusSrc1Alpha, GL_ONE}, }; for (const auto& [iglFactor, glFactor] : conversions) { ASSERT_EQ(igl::opengl::RenderPipelineState::convertBlendFactor(iglFactor), glFactor); } } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/BufferMapping.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include #include #include #include namespace igl::tests { // // BufferMappingOGLTest // // Tests for buffer mapping operations in OpenGL. // class BufferMappingOGLTest : public ::testing::Test { public: BufferMappingOGLTest() = default; ~BufferMappingOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); context_ = &static_cast(*iglDev_).getContext(); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; opengl::IContext* context_ = nullptr; }; // // MapBuffer // // Test mapping a buffer for reading. // TEST_F(BufferMappingOGLTest, MapBuffer) { if (!context_->deviceFeatures().hasInternalFeature(opengl::InternalFeatures::MapBuffer)) { GTEST_SKIP() << "MapBuffer not supported"; } Result ret; const float data[] = {1.0f, 2.0f, 3.0f, 4.0f}; BufferDesc bufDesc; bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data; bufDesc.length = sizeof(data); auto buffer = iglDev_->createBuffer(bufDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(buffer, nullptr); // Map the buffer auto* mapped = buffer->map(BufferRange(sizeof(data), 0), &ret); if (!ret.isOk()) { GTEST_SKIP() << "Buffer mapping failed: " << ret.message.c_str(); } ASSERT_NE(mapped, nullptr); buffer->unmap(); ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); } // // MapBufferRange // // Test mapping a sub-range of a buffer. // TEST_F(BufferMappingOGLTest, MapBufferRange) { if (!iglDev_->hasFeature(DeviceFeatures::MapBufferRange)) { GTEST_SKIP() << "MapBufferRange not supported"; } Result ret; const float data[] = {1.0f, 2.0f, 3.0f, 4.0f}; BufferDesc bufDesc; bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data; bufDesc.length = sizeof(data); auto buffer = iglDev_->createBuffer(bufDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(buffer, nullptr); // Map a range of the buffer (offset 0, 2 floats) auto* mapped = buffer->map(BufferRange(sizeof(float) * 2, 0), &ret); if (!ret.isOk()) { GTEST_SKIP() << "Buffer range mapping failed: " << ret.message.c_str(); } ASSERT_NE(mapped, nullptr); buffer->unmap(); ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); } // // WriteAndUnmap // // Create a dynamic buffer, upload data to it, then map and verify. // TEST_F(BufferMappingOGLTest, WriteAndUnmap) { if (!context_->deviceFeatures().hasInternalFeature(opengl::InternalFeatures::MapBuffer)) { GTEST_SKIP() << "MapBuffer not supported"; } Result ret; BufferDesc bufDesc; bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = nullptr; bufDesc.length = sizeof(float) * 4; bufDesc.storage = ResourceStorage::Shared; auto buffer = iglDev_->createBuffer(bufDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(buffer, nullptr); // Upload data to dynamic buffer const float newData[] = {1.0f, 2.0f, 3.0f, 4.0f}; auto uploadResult = buffer->upload(newData, BufferRange(sizeof(newData), 0)); ASSERT_TRUE(uploadResult.isOk()) << uploadResult.message.c_str(); ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/CommandBufferOGL.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include #include #include #include namespace igl::tests { #define OFFSCREEN_TEX_WIDTH 2 #define OFFSCREEN_TEX_HEIGHT 2 // // CommandBufferOGLTest // // Tests for the OpenGL CommandBuffer. // class CommandBufferOGLTest : public ::testing::Test { public: CommandBufferOGLTest() = default; ~CommandBufferOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); context_ = &static_cast(*iglDev_).getContext(); Result ret; // Create offscreen texture const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); offscreenTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); // Create framebuffer FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = offscreenTexture_; framebuffer_ = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); // Initialize render pass renderPass_.colorAttachments.resize(1); renderPass_.colorAttachments[0].loadAction = LoadAction::Clear; renderPass_.colorAttachments[0].storeAction = StoreAction::Store; renderPass_.colorAttachments[0].clearColor = {0.0, 0.0, 0.0, 1.0}; } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; opengl::IContext* context_ = nullptr; RenderPassDesc renderPass_; std::shared_ptr offscreenTexture_; std::shared_ptr framebuffer_; }; // // CreateFromQueue // // Create a command buffer from the command queue. // TEST_F(CommandBufferOGLTest, CreateFromQueue) { Result ret; CommandBufferDesc cbDesc; auto cmdBuf = cmdQueue_->createCommandBuffer(cbDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_NE(cmdBuf, nullptr); } // // CreateRenderEncoder // // Create a render command encoder from a command buffer. // TEST_F(CommandBufferOGLTest, CreateRenderEncoder) { Result ret; CommandBufferDesc cbDesc; auto cmdBuf = cmdQueue_->createCommandBuffer(cbDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_NE(cmdBuf, nullptr); auto cmdEncoder = cmdBuf->createRenderCommandEncoder(renderPass_, framebuffer_); ASSERT_NE(cmdEncoder, nullptr); cmdEncoder->endEncoding(); } // // SubmitToQueue // // Submit a command buffer to the queue. // TEST_F(CommandBufferOGLTest, SubmitToQueue) { Result ret; CommandBufferDesc cbDesc; auto cmdBuf = cmdQueue_->createCommandBuffer(cbDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_NE(cmdBuf, nullptr); auto cmdEncoder = cmdBuf->createRenderCommandEncoder(renderPass_, framebuffer_); ASSERT_NE(cmdEncoder, nullptr); cmdEncoder->endEncoding(); cmdQueue_->submit(*cmdBuf); // Verify no GL errors after submission ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/CompressedTexture.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include #include namespace igl::tests { // // CompressedTextureOGLTest // // Tests for compressed texture creation in OpenGL. // class CompressedTextureOGLTest : public ::testing::Test { public: CompressedTextureOGLTest() = default; ~CompressedTextureOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); context_ = &static_cast(*iglDev_).getContext(); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; opengl::IContext* context_ = nullptr; }; // // CreateCompressed // // Create a compressed texture if the format is supported, otherwise skip. // TEST_F(CompressedTextureOGLTest, CreateCompressed) { // Try ETC2 format first (common on GLES 3.0+) TextureFormat format = TextureFormat::RGBA8_EAC_ETC2; auto caps = iglDev_->getTextureFormatCapabilities(format); if (!(caps & ICapabilities::TextureFormatCapabilityBits::Sampled)) { // Try ASTC format = TextureFormat::RGBA_ASTC_4x4; caps = iglDev_->getTextureFormatCapabilities(format); } if (!(caps & ICapabilities::TextureFormatCapabilityBits::Sampled)) { GTEST_SKIP() << "No supported compressed texture format found"; } Result ret; TextureDesc desc = TextureDesc::new2D(format, 4, 4, TextureDesc::TextureUsageBits::Sampled); auto texture = iglDev_->createTexture(desc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(texture, nullptr); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/ComputeCommandAdapter.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../data/ShaderData.h" #include "../util/Common.h" #include #include #include #include #include #include #include namespace igl::tests { // // ComputeCommandAdapterOGLTest // // Tests for the OpenGL ComputeCommandAdapter. // class ComputeCommandAdapterOGLTest : public ::testing::Test { public: ComputeCommandAdapterOGLTest() = default; ~ComputeCommandAdapterOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); context_ = &static_cast(*iglDev_).getContext(); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; opengl::IContext* context_ = nullptr; }; // // BufferBindingAndDispatch // // Bind SSBOs, dispatch compute, verify output. // TEST_F(ComputeCommandAdapterOGLTest, BufferBindingAndDispatch) { if (!iglDev_->hasFeature(DeviceFeatures::Compute)) { GTEST_SKIP() << "Compute not supported"; } Result ret; // Create compute shader stages const std::string computeSource(data::shader::kOglSimpleComputeShader); auto shaderModule = iglDev_->createShaderModule( ShaderModuleDesc::fromStringInput( computeSource.c_str(), {ShaderStage::Compute, std::string(data::shader::kShaderFunc)}, ""), &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); auto shaderStages = ShaderStagesDesc::fromComputeModule(std::move(shaderModule)); auto stages = iglDev_->createShaderStages(shaderStages, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); // Create compute pipeline ComputePipelineDesc computeDesc; computeDesc.shaderStages = std::move(stages); auto computePipeline = iglDev_->createComputePipeline(computeDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(computePipeline, nullptr); // Create input and output buffers const float inputData[] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; BufferDesc inputBufDesc; inputBufDesc.type = BufferDesc::BufferTypeBits::Storage; inputBufDesc.data = inputData; inputBufDesc.length = sizeof(inputData); auto inputBuffer = iglDev_->createBuffer(inputBufDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); float outputData[6] = {0.0f}; BufferDesc outputBufDesc; outputBufDesc.type = BufferDesc::BufferTypeBits::Storage; outputBufDesc.data = outputData; outputBufDesc.length = sizeof(outputData); auto outputBuffer = iglDev_->createBuffer(outputBufDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); // Dispatch CommandBufferDesc cbDesc; auto cmdBuf = cmdQueue_->createCommandBuffer(cbDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); auto computeEncoder = cmdBuf->createComputeCommandEncoder(); ASSERT_NE(computeEncoder, nullptr); computeEncoder->bindComputePipelineState(computePipeline); computeEncoder->bindBuffer(0, inputBuffer.get()); computeEncoder->bindBuffer(1, outputBuffer.get()); computeEncoder->dispatchThreadGroups(Dimensions(1, 1, 1), Dimensions(6, 1, 1)); computeEncoder->endEncoding(); cmdQueue_->submit(*cmdBuf); // Verify no GL errors ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); } // // TextureBinding // // Bind texture for compute sampling. // TEST_F(ComputeCommandAdapterOGLTest, TextureBinding) { if (!iglDev_->hasFeature(DeviceFeatures::Compute)) { GTEST_SKIP() << "Compute not supported"; } Result ret; // Create a simple texture const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 2, 2, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Storage); auto texture = iglDev_->createTexture(texDesc, &ret); // Texture creation may fail if Storage usage is not supported for this format if (!ret.isOk() || texture == nullptr) { GTEST_SKIP() << "Cannot create storage texture: " << ret.message.c_str(); } // Upload data const uint32_t pixels[] = {0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF}; texture->upload(TextureRangeDesc::new2D(0, 0, 2, 2), pixels); // If we got here without errors, the texture was created and uploaded successfully ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); } // // DirtyStateTracking // // Change pipeline between dispatches. // TEST_F(ComputeCommandAdapterOGLTest, DirtyStateTracking) { if (!iglDev_->hasFeature(DeviceFeatures::Compute)) { GTEST_SKIP() << "Compute not supported"; } Result ret; // Create compute shader const std::string computeSource(data::shader::kOglSimpleComputeShader); auto shaderModule = iglDev_->createShaderModule( ShaderModuleDesc::fromStringInput( computeSource.c_str(), {ShaderStage::Compute, std::string(data::shader::kShaderFunc)}, ""), &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); auto shaderStages = ShaderStagesDesc::fromComputeModule(std::move(shaderModule)); auto stages = iglDev_->createShaderStages(shaderStages, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); // Create compute pipeline ComputePipelineDesc computeDesc; computeDesc.shaderStages = std::move(stages); auto computePipeline = iglDev_->createComputePipeline(computeDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(computePipeline, nullptr); // Create buffers const float inputData[] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; BufferDesc inputBufDesc; inputBufDesc.type = BufferDesc::BufferTypeBits::Storage; inputBufDesc.data = inputData; inputBufDesc.length = sizeof(inputData); auto inputBuffer = iglDev_->createBuffer(inputBufDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); float outputData[6] = {0.0f}; BufferDesc outputBufDesc; outputBufDesc.type = BufferDesc::BufferTypeBits::Storage; outputBufDesc.data = outputData; outputBufDesc.length = sizeof(outputData); auto outputBuffer = iglDev_->createBuffer(outputBufDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); // Dispatch twice with same pipeline to exercise dirty state tracking CommandBufferDesc cbDesc; auto cmdBuf = cmdQueue_->createCommandBuffer(cbDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); auto computeEncoder = cmdBuf->createComputeCommandEncoder(); ASSERT_NE(computeEncoder, nullptr); // First dispatch computeEncoder->bindComputePipelineState(computePipeline); computeEncoder->bindBuffer(0, inputBuffer.get()); computeEncoder->bindBuffer(1, outputBuffer.get()); computeEncoder->dispatchThreadGroups(Dimensions(1, 1, 1), Dimensions(6, 1, 1)); // Re-bind pipeline (dirties state) and dispatch again computeEncoder->bindComputePipelineState(computePipeline); computeEncoder->bindBuffer(0, inputBuffer.get()); computeEncoder->bindBuffer(1, outputBuffer.get()); computeEncoder->dispatchThreadGroups(Dimensions(1, 1, 1), Dimensions(6, 1, 1)); computeEncoder->endEncoding(); cmdQueue_->submit(*cmdBuf); ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/ComputePipelineStateOGL.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../data/ShaderData.h" #include "../util/Common.h" #include #include #include #include #include namespace igl::tests { // // ComputePipelineStateOGLTest // // Tests for the OpenGL ComputePipelineState. // class ComputePipelineStateOGLTest : public ::testing::Test { public: ComputePipelineStateOGLTest() = default; ~ComputePipelineStateOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); context_ = &static_cast(*iglDev_).getContext(); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; opengl::IContext* context_ = nullptr; }; // // CreateAndBind // // Create a compute pipeline, bind and unbind it, check for no GL errors. // TEST_F(ComputePipelineStateOGLTest, CreateAndBind) { if (!iglDev_->hasFeature(DeviceFeatures::Compute)) { GTEST_SKIP() << "Compute not supported"; } Result ret; const std::string computeSource(data::shader::kOglSimpleComputeShader); auto shaderModule = iglDev_->createShaderModule( ShaderModuleDesc::fromStringInput( computeSource.c_str(), {ShaderStage::Compute, std::string(data::shader::kShaderFunc)}, ""), &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); auto shaderStages = ShaderStagesDesc::fromComputeModule(std::move(shaderModule)); auto stages = iglDev_->createShaderStages(shaderStages, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ComputePipelineDesc computeDesc; computeDesc.shaderStages = std::move(stages); auto computePipeline = iglDev_->createComputePipeline(computeDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(computePipeline, nullptr); // Cast to opengl::ComputePipelineState and test bind/unbind auto* oglPipeline = static_cast(computePipeline.get()); ASSERT_NE(oglPipeline, nullptr); oglPipeline->bind(); ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); oglPipeline->unbind(); ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); } // // GetIndexByName // // Verify that getIndexByName returns valid indices for known buffer names. // TEST_F(ComputePipelineStateOGLTest, GetIndexByName) { if (!iglDev_->hasFeature(DeviceFeatures::Compute)) { GTEST_SKIP() << "Compute not supported"; } Result ret; const std::string computeSource(data::shader::kOglSimpleComputeShader); auto shaderModule = iglDev_->createShaderModule( ShaderModuleDesc::fromStringInput( computeSource.c_str(), {ShaderStage::Compute, std::string(data::shader::kShaderFunc)}, ""), &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); auto shaderStages = ShaderStagesDesc::fromComputeModule(std::move(shaderModule)); auto stages = iglDev_->createShaderStages(shaderStages, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ComputePipelineDesc computeDesc; computeDesc.shaderStages = std::move(stages); auto computePipeline = iglDev_->createComputePipeline(computeDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(computePipeline, nullptr); // The compute shader has "floatsIn" and "floatsOut" SSBOs int idx = computePipeline->getIndexByName(IGL_NAMEHANDLE(data::shader::kSimpleComputeInput)); // Index should be valid (not -1) if the shader uses SSBOs with these names // Note: the actual value depends on the shader reflection ASSERT_GE(idx, -1); // At minimum, the call should not crash idx = computePipeline->getIndexByName(IGL_NAMEHANDLE(data::shader::kSimpleComputeOutput)); ASSERT_GE(idx, -1); } // // SSBODetection // // Verify getIsUsingShaderStorageBuffers() returns true for compute shaders with SSBOs. // TEST_F(ComputePipelineStateOGLTest, SSBODetection) { if (!iglDev_->hasFeature(DeviceFeatures::Compute)) { GTEST_SKIP() << "Compute not supported"; } Result ret; const std::string computeSource(data::shader::kOglSimpleComputeShader); auto shaderModule = iglDev_->createShaderModule( ShaderModuleDesc::fromStringInput( computeSource.c_str(), {ShaderStage::Compute, std::string(data::shader::kShaderFunc)}, ""), &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); auto shaderStages = ShaderStagesDesc::fromComputeModule(std::move(shaderModule)); auto stages = iglDev_->createShaderStages(shaderStages, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ComputePipelineDesc computeDesc; computeDesc.shaderStages = std::move(stages); auto computePipeline = iglDev_->createComputePipeline(computeDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(computePipeline, nullptr); auto* oglPipeline = static_cast(computePipeline.get()); ASSERT_NE(oglPipeline, nullptr); // The simple compute shader uses SSBOs ASSERT_TRUE(oglPipeline->getIsUsingShaderStorageBuffers()); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/Context.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/TestDevice.h" #include #include #include #include #include #include #include #define DUMMY_FILE_NAME "dummy_file_name" #define DUMMY_LINE_NUM 0 namespace igl::tests { class ContextOGLTest : public ::testing::Test { public: ContextOGLTest() = default; ~ContextOGLTest() override = default; void SetUp() override { // We will be purposely tripping a few ASSERT conditions igl::setDebugBreakEnabled(false); device_ = util::createTestDevice(); ASSERT_TRUE(device_ != nullptr); context_ = &static_cast(*device_).getContext(); ASSERT_TRUE(context_ != nullptr); // Need to do this to support the CheckForError tests, otherwise the error // code will get reset before we read it context_->enableAutomaticErrorCheck(false); } void TearDown() override {} protected: opengl::IContext* context_{}; std::shared_ptr device_; }; /// Test basic functionality for binding GL_FRAMEBUFFER. TEST_F(ContextOGLTest, GlBindFramebuffer) { GLuint framebufferId = 0; context_->genFramebuffers(1, &framebufferId); context_->bindFramebuffer(GL_FRAMEBUFFER, framebufferId); GLint retrievedFramebuffer = -1; context_->getIntegerv(GL_FRAMEBUFFER_BINDING, &retrievedFramebuffer); ASSERT_EQ(framebufferId, retrievedFramebuffer); // Clean up context_->bindFramebuffer(GL_FRAMEBUFFER, 0); context_->deleteFramebuffers(1, &framebufferId); } /// On platforms that support GL_READ_FRAMEBUFFER and GL_DRAW_FRAMEBUFFER, binding GL_FRAMEBUFFER /// should be equivalent to binding both of them to the same value. TEST_F(ContextOGLTest, GlFramebufferBindSetsBothDrawFramebufferAndReadFramebuffer) { // This doesn't apply on platforms with no support for GL_READ_FRAMEBUFFER/GL_DRAW_FRAMEBUFFER if (context_->deviceFeatures().hasFeature(DeviceFeatures::ReadWriteFramebuffer)) { GLuint framebufferIds[2]; context_->genFramebuffers(2, framebufferIds); context_->bindFramebuffer(GL_FRAMEBUFFER, framebufferIds[0]); GLint retrievedFramebuffer = -1; context_->getIntegerv(GL_READ_FRAMEBUFFER_BINDING, &retrievedFramebuffer); ASSERT_EQ(framebufferIds[0], retrievedFramebuffer); retrievedFramebuffer = -1; context_->getIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &retrievedFramebuffer); ASSERT_EQ(framebufferIds[0], retrievedFramebuffer); // Clean up context_->bindFramebuffer(GL_FRAMEBUFFER, 0); context_->deleteFramebuffers(2, framebufferIds); } } /// We have to make sure our state cache works properly with the combination of GL_FRAMEBUFFER and /// GL_DRAW_FRAMEBUFFER. If we bind GL_DRAW_FRAMEBUFFER to value A, then GL_FRAMEBUFFER to a /// different value B, we have to make sure the state cache reflects the fact that /// GL_DRAW_FRAMEBUFFER is now bound to B. Binding GL_DRAW_FRAMEBUFFER to A again should NOT be /// handled just in the cache layer, but should actually be sent through to OpenGL. TEST_F(ContextOGLTest, StateCacheUpdatesGLDrawFramebufferCacheEvenWhenSettingGLFramebuffer) { // This doesn't apply on platforms with no support for GL_DRAW_FRAMEBUFFER if (context_->deviceFeatures().hasFeature(DeviceFeatures::ReadWriteFramebuffer)) { GLuint framebufferIds[2]; context_->genFramebuffers(2, framebufferIds); // Validate that the state cache doesn't get confused when switching between GL_FRAMEBUFFER // and GL_DRAW_FRAMEBUFFER context_->bindFramebuffer(GL_DRAW_FRAMEBUFFER, framebufferIds[0]); context_->bindFramebuffer(GL_FRAMEBUFFER, framebufferIds[1]); // This should still set the value, assuming our cache is working properly context_->bindFramebuffer(GL_DRAW_FRAMEBUFFER, framebufferIds[0]); GLint retrievedFramebuffer = -1; context_->getIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &retrievedFramebuffer); ASSERT_EQ(framebufferIds[0], retrievedFramebuffer); retrievedFramebuffer = -1; context_->getIntegerv(GL_READ_FRAMEBUFFER_BINDING, &retrievedFramebuffer); ASSERT_EQ(framebufferIds[1], retrievedFramebuffer); // Clean up context_->bindFramebuffer(GL_FRAMEBUFFER, 0); context_->deleteFramebuffers(2, framebufferIds); } } /// We have to make sure our state cache works properly with the combination of GL_FRAMEBUFFER and /// GL_READ_FRAMEBUFFER. If we bind GL_READ_FRAMEBUFFER to value A, then GL_FRAMEBUFFER to a /// different value B, we have to make sure the state cache reflects the fact that /// GL_READ_FRAMEBUFFER is now bound to B. Binding GL_READ_FRAMEBUFFER to A again should NOT be /// handled just in the cache layer, but should actually be sent through to OpenGL. TEST_F(ContextOGLTest, StateCacheUpdatesGLReadFramebufferCacheEvenWhenSettingGLFramebuffer) { // This doesn't apply on platforms with no support for GL_READ_FRAMEBUFFER if (context_->deviceFeatures().hasFeature(DeviceFeatures::ReadWriteFramebuffer)) { GLuint framebufferIds[2]; context_->genFramebuffers(2, framebufferIds); // Validate that the state cache doesn't get confused when switching between GL_FRAMEBUFFER // and GL_READ_FRAMEBUFFER context_->bindFramebuffer(GL_READ_FRAMEBUFFER, framebufferIds[0]); context_->bindFramebuffer(GL_FRAMEBUFFER, framebufferIds[1]); // This should still set the value, assuming our cache is working properly context_->bindFramebuffer(GL_READ_FRAMEBUFFER, framebufferIds[0]); GLint retrievedFramebuffer = -1; context_->getIntegerv(GL_READ_FRAMEBUFFER_BINDING, &retrievedFramebuffer); ASSERT_EQ(framebufferIds[0], retrievedFramebuffer); retrievedFramebuffer = -1; context_->getIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &retrievedFramebuffer); ASSERT_EQ(framebufferIds[1], retrievedFramebuffer); // Clean up context_->bindFramebuffer(GL_FRAMEBUFFER, 0); context_->deleteFramebuffers(2, framebufferIds); } } /// This test is to make sure that we properly invalidate the GL_FRAMEBUFFER /// binding point when the GL_DRAW_FRAMEBUFFER binding points is used TEST_F(ContextOGLTest, StateCacheInvalidateFramebufferCacheWhenSettingGLWriteFramebuffer) { // Doesn't apply to platforms with no GL_DRAW_FRAMEBUFFER support if (context_->deviceFeatures().hasFeature(DeviceFeatures::ReadWriteFramebuffer)) { GLuint framebufferIds[2]; context_->genFramebuffers(2, framebufferIds); context_->bindFramebuffer(GL_FRAMEBUFFER, framebufferIds[0]); context_->bindFramebuffer(GL_DRAW_FRAMEBUFFER, framebufferIds[1]); // This should result in a call to OpenGL because the cache should have // been reset context_->bindFramebuffer(GL_FRAMEBUFFER, framebufferIds[0]); GLint retrievedFramebuffer = -1; context_->getIntegerv(GL_FRAMEBUFFER_BINDING, &retrievedFramebuffer); ASSERT_EQ(framebufferIds[0], retrievedFramebuffer); // Clean up context_->bindFramebuffer(GL_FRAMEBUFFER, 0); context_->deleteFramebuffers(2, framebufferIds); } } /// This test is to make sure that we properly invalidate the GL_FRAMEBUFFER /// binding point when the GL_READ_FRAMEBUFFER binding points is used TEST_F(ContextOGLTest, StateCacheInvalidateFramebufferCacheWhenSettingGLReadFramebuffer) { // Doesn't apply to platforms with no GL_READ_FRAMEBUFFER support if (context_->deviceFeatures().hasFeature(DeviceFeatures::ReadWriteFramebuffer)) { GLuint framebufferIds[2]; context_->genFramebuffers(2, framebufferIds); context_->bindFramebuffer(GL_FRAMEBUFFER, framebufferIds[0]); context_->bindFramebuffer(GL_READ_FRAMEBUFFER, framebufferIds[1]); // This should result in a call to OpenGL because the cache should have // been reset context_->bindFramebuffer(GL_FRAMEBUFFER, framebufferIds[0]); GLint retrievedFramebuffer = -1; context_->getIntegerv(GL_FRAMEBUFFER_BINDING, &retrievedFramebuffer); ASSERT_EQ(framebufferIds[0], retrievedFramebuffer); // Clean up context_->bindFramebuffer(GL_FRAMEBUFFER, 0); context_->deleteFramebuffers(2, framebufferIds); } } /// This test is a sanity check that we should not have a GL error out of /// the blue. TEST_F(ContextOGLTest, CheckForErrorsNoError) { const GLenum ret = context_->checkForErrors(DUMMY_FILE_NAME, DUMMY_LINE_NUM); ASSERT_EQ(ret, GL_NO_ERROR); } TEST_F(ContextOGLTest, CheckForErrorsInvalidEnum) { // GL_INVALID_ENUM context_->activeTexture(GL_SRC_ALPHA); const GLenum ret = context_->checkForErrors(DUMMY_FILE_NAME, DUMMY_LINE_NUM); ASSERT_EQ(ret, GL_INVALID_ENUM); } #ifndef GL_UNSIGNED_SHORT_4_4_4_4 #define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 #endif /// This test purposely triggers the Invalid Operation error and check /// to see that the right error code is returned. TEST_F(ContextOGLTest, CheckForErrorsInvalidOperation) { GLuint textureMap = 0; context_->genTextures(1, &textureMap); context_->bindTexture(GL_TEXTURE_2D, textureMap); context_->texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); context_->bindTexture(GL_TEXTURE_2D, 0); GLuint framebufferId = 0; context_->genFramebuffers(1, &framebufferId); context_->bindFramebuffer(GL_FRAMEBUFFER, framebufferId); context_->framebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureMap, 0); GLint retrievedFramebuffer = -1; context_->getIntegerv(GL_FRAMEBUFFER_BINDING, &retrievedFramebuffer); ASSERT_EQ(framebufferId, retrievedFramebuffer); // GL_INVALID_OPERATION is generated if type is GL_UNSIGNED_SHORT_4_4_4_4 and format is not // GL_RGBA. char data[100]; context_->readPixels(1, 1, 1, 1, GL_RED, GL_UNSIGNED_SHORT_4_4_4_4, data); const GLenum ret = context_->checkForErrors(DUMMY_FILE_NAME, DUMMY_LINE_NUM); ASSERT_EQ(ret, GL_INVALID_OPERATION); // Clean up context_->bindTexture(GL_TEXTURE_2D, textureMap); context_->deleteTextures(1, &textureMap); context_->bindFramebuffer(GL_FRAMEBUFFER, 0); context_->deleteFramebuffers(1, &framebufferId); } /// This test purposely triggers the Invalid Value error and check /// to see that the right error code is returned. TEST_F(ContextOGLTest, CheckForErrorsInvalidValue) { GLuint textureMap = 0; context_->genTextures(1, &textureMap); context_->bindTexture(GL_TEXTURE_2D, textureMap); context_->texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); context_->bindTexture(GL_TEXTURE_2D, 0); GLuint framebufferId = 0; context_->genFramebuffers(1, &framebufferId); context_->bindFramebuffer(GL_FRAMEBUFFER, framebufferId); context_->framebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureMap, 0); GLint retrievedFramebuffer = -1; context_->getIntegerv(GL_FRAMEBUFFER_BINDING, &retrievedFramebuffer); ASSERT_EQ(framebufferId, retrievedFramebuffer); // GL_INVALID_VALUE is generated if any bit other than the eligible bits is set in mask. context_->clear(0XFFFFFFFF); const GLenum ret = context_->checkForErrors(DUMMY_FILE_NAME, DUMMY_LINE_NUM); ASSERT_EQ(ret, GL_INVALID_VALUE); // Clean up context_->bindTexture(GL_TEXTURE_2D, textureMap); context_->deleteTextures(1, &textureMap); context_->bindFramebuffer(GL_FRAMEBUFFER, 0); context_->deleteFramebuffers(1, &framebufferId); } /// This test purposely triggers the Invalid Framebuffer error and check /// to see that the right error code is returned. TEST_F(ContextOGLTest, CheckForErrorsInvalidFrameBufferOperation) { unsigned int frameBuffer = 0; context_->genFramebuffers(1, &frameBuffer); context_->bindFramebuffer(GL_FRAMEBUFFER, frameBuffer); // Make sure frame buffer is not complete yet, so glClear generates // GL_INVALID_FRAMEBUFFER_OPERATION. if (context_->checkFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { context_->clear(GL_COLOR_BUFFER_BIT); const GLenum ret = context_->checkForErrors(DUMMY_FILE_NAME, DUMMY_LINE_NUM); ASSERT_EQ(ret, GL_INVALID_FRAMEBUFFER_OPERATION); } // Clean up context_->bindFramebuffer(GL_FRAMEBUFFER, 0); context_->deleteFramebuffers(1, &frameBuffer); } /// Verify that an object is visible across contexts in the same sharegroup TEST_F(ContextOGLTest, BasicSharedContexts) { #if IGL_PLATFORM_WINDOWS && !IGL_ANGLE GTEST_SKIP() << "Context sharing not implemented in opengl::wgl"; #endif // Setup is three contexts, (1) and (2) part of the same sharegroup and (3) not. Result result; auto sharedContext = context_->createShareContext(&result); ASSERT_TRUE(result.isOk()); auto unsharedDevice = util::createTestDevice(); ASSERT_TRUE(unsharedDevice != nullptr); auto* unsharedContext = &static_cast(*unsharedDevice).getContext(); ASSERT_TRUE(unsharedDevice != nullptr); // Create texture from context (1) context_->setCurrent(); ASSERT_TRUE(context_->isCurrentContext()); ASSERT_FALSE(sharedContext->isCurrentContext()); ASSERT_FALSE(unsharedContext->isCurrentContext()); ASSERT_TRUE(context_->isCurrentSharegroup()); ASSERT_TRUE(sharedContext->isCurrentSharegroup()); ASSERT_FALSE(unsharedContext->isCurrentSharegroup()); const igl::TextureDesc textureDesc = igl::TextureDesc::new2D( igl::TextureFormat::RGBA_UNorm8, 16, 16, igl::TextureDesc::TextureUsageBits::Sampled); auto texture = device_->createTexture(textureDesc, &result); ASSERT_TRUE(result.isOk()); const uint64_t glTextureId = static_cast(texture.get())->getId(); context_->flush(); // Required for texture to be visible from other contexts // Confirm that texture is visible from context (2) sharedContext->setCurrent(); ASSERT_FALSE(context_->isCurrentContext()); ASSERT_TRUE(sharedContext->isCurrentContext()); ASSERT_FALSE(unsharedContext->isCurrentContext()); ASSERT_TRUE(context_->isCurrentSharegroup()); ASSERT_TRUE(sharedContext->isCurrentSharegroup()); ASSERT_FALSE(unsharedContext->isCurrentSharegroup()); ASSERT_TRUE(sharedContext->isTexture(glTextureId)); // Confirm that texture is not visible from context (3) unsharedContext->setCurrent(); ASSERT_FALSE(context_->isCurrentContext()); ASSERT_FALSE(sharedContext->isCurrentContext()); ASSERT_TRUE(unsharedContext->isCurrentContext()); ASSERT_FALSE(context_->isCurrentSharegroup()); ASSERT_FALSE(sharedContext->isCurrentSharegroup()); ASSERT_TRUE(unsharedContext->isCurrentSharegroup()); ASSERT_FALSE(unsharedContext->isTexture(glTextureId)); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/CopyTexSubImage.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include #include #include #include namespace igl::tests { // // CopyTexSubImageOGLTest // // Tests for glCopyTexSubImage2D operations via IGL. // class CopyTexSubImageOGLTest : public ::testing::Test { public: CopyTexSubImageOGLTest() = default; ~CopyTexSubImageOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); context_ = &static_cast(*iglDev_).getContext(); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; opengl::IContext* context_ = nullptr; }; // // CopyTexSubImage2D // // Create a framebuffer, render to it, then copy a sub-region to a texture. // TEST_F(CopyTexSubImageOGLTest, CopyTexSubImage2D) { Result ret; // Create source framebuffer and clear to red const TextureDesc srcTexDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 4, 4, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); auto srcTexture = iglDev_->createTexture(srcTexDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); FramebufferDesc srcFbDesc; srcFbDesc.colorAttachments[0].texture = srcTexture; auto srcFramebuffer = iglDev_->createFramebuffer(srcFbDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); // Clear to red RenderPassDesc renderPass; renderPass.colorAttachments.resize(1); renderPass.colorAttachments[0].loadAction = LoadAction::Clear; renderPass.colorAttachments[0].storeAction = StoreAction::Store; renderPass.colorAttachments[0].clearColor = {1.0, 0.0, 0.0, 1.0}; CommandBufferDesc cbDesc; auto cmdBuf = cmdQueue_->createCommandBuffer(cbDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); auto cmdEncoder = cmdBuf->createRenderCommandEncoder(renderPass, srcFramebuffer); ASSERT_NE(cmdEncoder, nullptr); cmdEncoder->endEncoding(); cmdQueue_->submit(*cmdBuf); // Create destination texture const TextureDesc dstTexDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 4, 4, TextureDesc::TextureUsageBits::Sampled); auto dstTexture = iglDev_->createTexture(dstTexDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); // Use copyTextureColorAttachment if available auto dstFbDesc = FramebufferDesc{}; dstFbDesc.colorAttachments[0].texture = dstTexture; // Copy using framebuffer's copy method srcFramebuffer->copyTextureColorAttachment( *cmdQueue_, 0, dstTexture, TextureRangeDesc::new2D(0, 0, 4, 4)); ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/CubeMapAttachment.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include #include #include namespace igl::tests { // // CubeMapAttachmentOGLTest // // Tests for cube map texture creation and face attachment. // class CubeMapAttachmentOGLTest : public ::testing::Test { public: CubeMapAttachmentOGLTest() = default; ~CubeMapAttachmentOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); context_ = &static_cast(*iglDev_).getContext(); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; opengl::IContext* context_ = nullptr; }; // // CreateCubeTexture // // Create a cube map texture. // TEST_F(CubeMapAttachmentOGLTest, CreateCubeTexture) { Result ret; TextureDesc desc = TextureDesc::newCube( TextureFormat::RGBA_UNorm8, 4, 4, TextureDesc::TextureUsageBits::Sampled); auto texture = iglDev_->createTexture(desc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(texture, nullptr); ASSERT_EQ(texture->getType(), TextureType::Cube); } // // AttachFace // // Attach a cube map face to a framebuffer. // TEST_F(CubeMapAttachmentOGLTest, AttachFace) { Result ret; // Create cube texture with attachment usage TextureDesc desc = TextureDesc::newCube(TextureFormat::RGBA_UNorm8, 4, 4, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); auto cubeTexture = iglDev_->createTexture(desc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(cubeTexture, nullptr); // Create a framebuffer with one face of the cube map // Note: In IGL, cube map attachment uses the whole texture; // face selection is implementation-specific FramebufferDesc fbDesc; fbDesc.colorAttachments[0].texture = cubeTexture; auto framebuffer = iglDev_->createFramebuffer(fbDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(framebuffer, nullptr); ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/DebugOutput.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include #include #include namespace igl::tests { // // DebugOutputOGLTest // // Tests for OpenGL debug output functionality. // class DebugOutputOGLTest : public ::testing::Test { public: DebugOutputOGLTest() = default; ~DebugOutputOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); context_ = &static_cast(*iglDev_).getContext(); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; opengl::IContext* context_ = nullptr; }; // // DebugMessageLogNoError // // Query debug message log and verify no errors. // TEST_F(DebugOutputOGLTest, DebugMessageLogNoError) { if (!context_->deviceFeatures().hasInternalFeature(opengl::InternalFeatures::DebugMessage)) { GTEST_SKIP() << "Debug messages not supported"; } // Try to get debug messages - there may not be any GLenum sources[1]; GLenum types[1]; GLuint ids[1]; GLenum severities[1]; GLsizei lengths[1]; GLchar messageLog[256]; // getDebugMessageLog should not crash, even when no messages are available GLuint count = context_->getDebugMessageLog( 1, sizeof(messageLog), sources, types, ids, severities, lengths, messageLog); // Count should be 0 or 1 (whatever messages may be in the log) ASSERT_LE(count, 1u); ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/DepthRange.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include #include namespace igl::tests { // // DepthRangeOGLTest // // Tests for glDepthRangef operations in OpenGL. // class DepthRangeOGLTest : public ::testing::Test { public: DepthRangeOGLTest() = default; ~DepthRangeOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); context_ = &static_cast(*iglDev_).getContext(); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; opengl::IContext* context_ = nullptr; }; // // DepthRangeNoError // // Set the depth range and verify no GL errors. // TEST_F(DepthRangeOGLTest, DepthRangeNoError) { // Set depth range to standard [0, 1] context_->depthRangef(0.0f, 1.0f); ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); // Set depth range to a custom range [0.25, 0.75] context_->depthRangef(0.25f, 0.75f); ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); // Restore default context_->depthRangef(0.0f, 1.0f); ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/DepthStencilState.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../data/ShaderData.h" #include "../data/VertexIndexData.h" #include "../util/Common.h" #include #include #include #include #include namespace igl::tests { // Picking this just to match the texture we will use. If you use a different // size texture, then you will have to either create a new offscreenTexture_ // and the framebuffer object in your test, so know exactly what the end result // would be after sampling #define OFFSCREEN_TEX_WIDTH 2 #define OFFSCREEN_TEX_HEIGHT 2 // // DepthStencilStateTest // // Tests functions within DepthStencilState module. // class DepthStencilStateTest : public ::testing::Test { public: DepthStencilStateTest() = default; ~DepthStencilStateTest() override = default; // Set up common resources. // This function sets up a render pass and a graphics pipeline descriptor // so it is ready to render a simple quad with an input texture to an // offscreen texture. void SetUp() override { igl::setDebugBreakEnabled(false); // only use in debug mode util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_TRUE(iglDev_ != nullptr); ASSERT_TRUE(cmdQueue_ != nullptr); Result ret; // Create an offscreen texture to render to const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); offscreenTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(offscreenTexture_ != nullptr); // Create framebuffer using the offscreen texture FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = offscreenTexture_; framebuffer_ = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(framebuffer_ != nullptr); // Initialize render pass descriptor renderPass_.colorAttachments.resize(1); renderPass_.colorAttachments[0].loadAction = LoadAction::Clear; renderPass_.colorAttachments[0].storeAction = StoreAction::Store; renderPass_.colorAttachments[0].clearColor = {0.0, 0.0, 0.0, 1.0}; // Initialize shader stages std::unique_ptr stages; igl::tests::util::createSimpleShaderStages(iglDev_, stages); shaderStages_ = std::move(stages); // Initialize input to vertex shader VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Float4; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].bufferIndex = data::shader::kSimplePosIndex; inputDesc.attributes[0].name = data::shader::kSimplePos; inputDesc.attributes[0].location = 0; inputDesc.inputBindings[0].stride = sizeof(float) * 4; inputDesc.attributes[1].format = VertexAttributeFormat::Float2; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].bufferIndex = data::shader::kSimpleUvIndex; inputDesc.attributes[1].name = data::shader::kSimpleUv; inputDesc.attributes[1].location = 1; inputDesc.inputBindings[1].stride = sizeof(float) * 2; // numAttributes has to equal to bindings when using more than 1 buffer inputDesc.numAttributes = inputDesc.numInputBindings = 2; vertexInputState_ = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(vertexInputState_ != nullptr); // Initialize index buffer BufferDesc bufDesc; bufDesc.type = BufferDesc::BufferTypeBits::Index; bufDesc.data = data::vertex_index::kQuadInd.data(); bufDesc.length = sizeof(data::vertex_index::kQuadInd); ib_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(ib_ != nullptr); // Initialize Render Pipeline Descriptor, but leave the creation // to the individual tests in case further customization is required renderPipelineDesc_.vertexInputState = vertexInputState_; renderPipelineDesc_.shaderStages = shaderStages_; renderPipelineDesc_.targetDesc.colorAttachments.resize(1); renderPipelineDesc_.targetDesc.colorAttachments[0].textureFormat = offscreenTexture_->getFormat(); renderPipelineDesc_.cullMode = igl::CullMode::Disabled; } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; std::shared_ptr cmdBuf_; std::shared_ptr cmdEncoder_; CommandBufferDesc cbDesc_ = {}; RenderPassDesc renderPass_; std::shared_ptr offscreenTexture_; std::shared_ptr framebuffer_; std::shared_ptr shaderStages_; std::shared_ptr vertexInputState_; std::shared_ptr ib_; RenderPipelineDesc renderPipelineDesc_; }; // // Passthrough Test // // Check binding of Depth Stencil State is successful. // TEST_F(DepthStencilStateTest, Passthrough) { Result ret; std::shared_ptr idss; const DepthStencilStateDesc dsDesc; idss = iglDev_->createDepthStencilState(dsDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(idss != nullptr); // Test initialization of DepthStencilState in CommandEncoder cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(cmdBuf_ != nullptr); auto cmdEncoder = cmdBuf_->createRenderCommandEncoder(renderPass_, framebuffer_); // No asserts, just test the passthroughs are successful cmdEncoder->bindDepthStencilState(idss); auto* dss = static_cast(idss.get()); dss->bind(0, 0); // Test bind passthrough dss->unbind(); } // // Compare Function to OGL Test // // Check expected outputs for igl::opengl::DepthStencilState::convertCompareFunction // TEST_F(DepthStencilStateTest, CompareFunctionToOGL) { struct CompareFuncConversion { CompareFunction igl = igl::CompareFunction::Never; GLenum ogl = GL_NEVER; }; const std::vector conversions{ CompareFuncConversion{igl::CompareFunction::Never, GL_NEVER}, CompareFuncConversion{igl::CompareFunction::Less, GL_LESS}, CompareFuncConversion{igl::CompareFunction::Equal, GL_EQUAL}, CompareFuncConversion{igl::CompareFunction::LessEqual, GL_LEQUAL}, CompareFuncConversion{igl::CompareFunction::Greater, GL_GREATER}, CompareFuncConversion{igl::CompareFunction::NotEqual, GL_NOTEQUAL}, CompareFuncConversion{igl::CompareFunction::GreaterEqual, GL_GEQUAL}, CompareFuncConversion{igl::CompareFunction::AlwaysPass, GL_ALWAYS}, }; for (auto data : conversions) { const GLenum ogl = igl::opengl::DepthStencilState::convertCompareFunction(data.igl); ASSERT_EQ(ogl, data.ogl); } } // // Stencil Operation to OGL Test // // Check expected outputs for igl::opengl::DepthStencilState::convertStencilOperation // TEST_F(DepthStencilStateTest, StencilOperationToOGL) { struct StencilOpConversion { StencilOperation igl = igl::StencilOperation::Keep; GLenum ogl = GL_KEEP; }; const std::vector conversions{ StencilOpConversion{igl::StencilOperation::Keep, GL_KEEP}, StencilOpConversion{igl::StencilOperation::Zero, GL_ZERO}, StencilOpConversion{igl::StencilOperation::Replace, GL_REPLACE}, StencilOpConversion{igl::StencilOperation::IncrementClamp, GL_INCR}, StencilOpConversion{igl::StencilOperation::DecrementClamp, GL_DECR}, StencilOpConversion{igl::StencilOperation::Invert, GL_INVERT}, StencilOpConversion{igl::StencilOperation::IncrementWrap, GL_INCR_WRAP}, StencilOpConversion{igl::StencilOperation::DecrementWrap, GL_DECR_WRAP}, }; for (auto data : conversions) { const GLenum ogl = igl::opengl::DepthStencilState::convertStencilOperation(data.igl); ASSERT_EQ(ogl, data.ogl); } } // // Set Stencil reference value and Check back Test // TEST_F(DepthStencilStateTest, SetStencilReferenceValueAndCheck) { Result ret; std::shared_ptr idss; DepthStencilStateDesc dsDesc; dsDesc.isDepthWriteEnabled = true; idss = iglDev_->createDepthStencilState(dsDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(idss != nullptr); std::shared_ptr pipelineState; pipelineState = iglDev_->createRenderPipeline(renderPipelineDesc_, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(pipelineState != nullptr); // Test initialization of DepthStencilState in CommandEncoder cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(cmdBuf_ != nullptr); auto cmdEncoder = cmdBuf_->createRenderCommandEncoder(renderPass_, framebuffer_); //------------------------------------------ // First Read the Default Values //------------------------------------------ // Dummy draw just to force binding of the states cmdEncoder->bindRenderPipelineState(pipelineState); cmdEncoder->bindDepthStencilState(idss); cmdEncoder->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmdEncoder->drawIndexed(0); cmdEncoder->endEncoding(); cmdQueue_->submit(*cmdBuf_); // Read back default reference value here opengl::IContext* ctx = nullptr; ctx = &static_cast(*iglDev_).getContext(); GLboolean origIsDepthWriteEnabled = 0, newIsDepthWriteEnabled = 0; GLint origDepthFunVal = 0, newDepthFunVal = 0; GLint origFrontCompareFunc = 0, newFrontCompareFunc = 0; GLint origBackCompareFunc = 0, newBackCompareFunc = 0; GLint origStencilBackFail = 0, newStencilBackFail = 0; GLint origStencilFail = 0, newStencilFail = 0; GLint origStencilPassDepthFail = 0, newStencilPassDepthFail = 0; GLint origStencilPassDepthPass = 0, newStencilPassDepthPass = 0; GLint origStencilBackWriteMask = 0, newStencilBackWriteMask = 0; GLint origStencilWriteMask = 0, newStencilWriteMask = 0; ctx->getBooleanv(GL_DEPTH_WRITEMASK, &origIsDepthWriteEnabled); ctx->getIntegerv(GL_DEPTH_FUNC, &origDepthFunVal); ASSERT_TRUE((bool)origIsDepthWriteEnabled == dsDesc.isDepthWriteEnabled); ASSERT_TRUE(origDepthFunVal == opengl::DepthStencilState::convertCompareFunction(dsDesc.compareFunction)); // Read Front Compare Func ctx->getIntegerv(GL_STENCIL_FUNC, &origFrontCompareFunc); // Read Back Compare Func ctx->getIntegerv(GL_STENCIL_BACK_FUNC, &origBackCompareFunc); // Read GL_STENCIL_BACK_FAIL (initial value = GL_KEEP) ctx->getIntegerv(GL_STENCIL_BACK_FAIL, &origStencilBackFail); // Read GL_STENCIL_FAIL (initial value = GL_KEEP) ctx->getIntegerv(GL_STENCIL_FAIL, &origStencilFail); // Read GL_STENCIL_PASS_DEPTH_FAIL (initial value = GL_KEEP) ctx->getIntegerv(GL_STENCIL_PASS_DEPTH_FAIL, &origStencilPassDepthFail); // Read GL_STENCIL_PASS_DEPTH_PASS (initial value = GL_KEEP) ctx->getIntegerv(GL_STENCIL_PASS_DEPTH_PASS, &origStencilPassDepthPass); // Read GL_STENCIL_BACK_WRITEMASK (initial value = 0xff) ctx->getIntegerv(GL_STENCIL_BACK_WRITEMASK, &origStencilBackWriteMask); // Read GL_STENCIL_WRITEMASK (initial value = 0xff) ctx->getIntegerv(GL_STENCIL_WRITEMASK, &origStencilWriteMask); //------------------------------------------------------- // Try Setting Stencil Reference values //------------------------------------------------------- // Create a new DepthStencilDesc DepthStencilStateDesc newDsDesc; newDsDesc.isDepthWriteEnabled = true; newDsDesc.compareFunction = CompareFunction::Greater; newDsDesc.frontFaceStencil.stencilCompareFunction = CompareFunction::Greater; newDsDesc.backFaceStencil.stencilCompareFunction = CompareFunction::Greater; newDsDesc.backFaceStencil.stencilFailureOperation = StencilOperation::DecrementClamp; newDsDesc.backFaceStencil.depthFailureOperation = StencilOperation::Invert; newDsDesc.backFaceStencil.depthStencilPassOperation = StencilOperation::IncrementWrap; newDsDesc.frontFaceStencil.stencilFailureOperation = StencilOperation::DecrementClamp; newDsDesc.frontFaceStencil.depthFailureOperation = StencilOperation::Invert; newDsDesc.frontFaceStencil.depthStencilPassOperation = StencilOperation::IncrementWrap; // GLES stencil is limited to 8 bits (0xFF), at least on Adreno GPUs if (iglDev_->getBackendVersion().flavor == BackendFlavor::OpenGL_ES) { newDsDesc.backFaceStencil.writeMask = 0xad; newDsDesc.frontFaceStencil.writeMask = 0xef; } else { newDsDesc.backFaceStencil.writeMask = 0xdead; newDsDesc.frontFaceStencil.writeMask = 0xbeef; } // Create the Depth Stencil State from the new Depth Stencil Descriptor idss = iglDev_->createDepthStencilState(newDsDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(idss != nullptr); ctx->enable(GL_DEPTH_TEST); ctx->depthFunc(opengl::DepthStencilState::convertCompareFunction(newDsDesc.compareFunction)); const GLuint mask{0xff}; ctx->stencilFuncSeparate( GL_FRONT, opengl::DepthStencilState::convertCompareFunction(newDsDesc.compareFunction), 0xaa, mask); ctx->stencilFuncSeparate( GL_BACK, opengl::DepthStencilState::convertCompareFunction(newDsDesc.compareFunction), 0xbb, mask); GLenum sfail = opengl::DepthStencilState::convertStencilOperation( newDsDesc.backFaceStencil.stencilFailureOperation); GLenum dpfail = opengl::DepthStencilState::convertStencilOperation( newDsDesc.backFaceStencil.depthFailureOperation); GLenum dppass = opengl::DepthStencilState::convertStencilOperation( newDsDesc.backFaceStencil.depthStencilPassOperation); ctx->stencilOpSeparate(GL_BACK, sfail, dpfail, dppass); sfail = opengl::DepthStencilState::convertStencilOperation( newDsDesc.frontFaceStencil.stencilFailureOperation); dpfail = opengl::DepthStencilState::convertStencilOperation( newDsDesc.frontFaceStencil.depthFailureOperation); dppass = opengl::DepthStencilState::convertStencilOperation( newDsDesc.frontFaceStencil.depthStencilPassOperation); ctx->stencilOpSeparate(GL_FRONT, sfail, dpfail, dppass); ctx->stencilMaskSeparate(GL_BACK, newDsDesc.backFaceStencil.writeMask); ctx->stencilMaskSeparate(GL_FRONT, newDsDesc.frontFaceStencil.writeMask); cmdEncoder = cmdBuf_->createRenderCommandEncoder(renderPass_, framebuffer_); // Dummy draw just to force binding of the states cmdEncoder->bindRenderPipelineState(pipelineState); cmdEncoder->bindDepthStencilState(idss); cmdEncoder->setStencilReferenceValue(2); cmdEncoder->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmdEncoder->drawIndexed(0); cmdEncoder->endEncoding(); cmdQueue_->submit(*cmdBuf_); // Read back reference value here // Read Front Front Compare Func ctx->getIntegerv(GL_STENCIL_FUNC, &newFrontCompareFunc); // Read Back Comapare Func ctx->getIntegerv(GL_STENCIL_BACK_FUNC, &newBackCompareFunc); // Read GL_STENCIL_BACK_FAIL (initial value = GL_KEEP) ctx->getIntegerv(GL_STENCIL_BACK_FAIL, &newStencilBackFail); // Read GL_STENCIL_FAIL (initial value = GL_KEEP) ctx->getIntegerv(GL_STENCIL_FAIL, &newStencilFail); // Read GL_STENCIL_PASS_DEPTH_FAIL (initial value = GL_KEEP) ctx->getIntegerv(GL_STENCIL_PASS_DEPTH_FAIL, &newStencilPassDepthFail); // Read GL_STENCIL_PASS_DEPTH_PASS (initial value = GL_KEEP) ctx->getIntegerv(GL_STENCIL_PASS_DEPTH_PASS, &newStencilPassDepthPass); // Read GL_STENCIL_BACK_WRITEMASK (initial value = 0xff) ctx->getIntegerv(GL_STENCIL_BACK_WRITEMASK, &newStencilBackWriteMask); // Read GL_STENCIL_WRITEMASK (initial value = 0xff) ctx->getIntegerv(GL_STENCIL_WRITEMASK, &newStencilWriteMask); // Test the default values ASSERT_TRUE(GL_ALWAYS == origFrontCompareFunc); ASSERT_TRUE(GL_ALWAYS == origBackCompareFunc); ASSERT_TRUE(GL_KEEP == origStencilBackFail); ASSERT_TRUE(GL_KEEP == origStencilFail); ASSERT_TRUE(GL_KEEP == origStencilPassDepthFail); ASSERT_TRUE(GL_KEEP == origStencilPassDepthPass); #if (defined(IGL_PLATFORM_LINUX) && IGL_PLATFORM_LINUX) || defined(IGL_ANGLE) && IGL_ANGLE // For unknown reasons ANGLE clamps masks to int type. ASSERT_TRUE(0x7fffffff == origStencilBackWriteMask); ASSERT_TRUE(0x7fffffff == origStencilWriteMask); #else // GLES stencil mask is limited to 8 bits (0xFF), at least on Adreno GPUs #if IGL_PLATFORM_ANDROID if (iglDev_->getBackendVersion().flavor == BackendFlavor::OpenGL_ES) { GLuint origExpectedStencilValue = 0xffffffff; // GLES stencil mask is limited to 8 bits (0xFF) on Adreno GPUs const GLubyte* renderer = ctx->getString(GL_RENDERER); if (strncmp((char*)renderer, "Adreno", 6) == 0) { origExpectedStencilValue = 0xff; } ASSERT_TRUE(origExpectedStencilValue == origStencilBackWriteMask); ASSERT_TRUE(origExpectedStencilValue == origStencilWriteMask); } else { ASSERT_TRUE(0xffffffff == origStencilBackWriteMask); ASSERT_TRUE(0xffffffff == origStencilWriteMask); } #else ASSERT_TRUE(0xffffffff == origStencilBackWriteMask); ASSERT_TRUE(0xffffffff == origStencilWriteMask); #endif #endif // Test the newly set values ASSERT_TRUE(opengl::DepthStencilState::convertCompareFunction( newDsDesc.frontFaceStencil.stencilCompareFunction) == newFrontCompareFunc); ASSERT_TRUE(opengl::DepthStencilState::convertCompareFunction( newDsDesc.backFaceStencil.stencilCompareFunction) == newBackCompareFunc); ASSERT_TRUE(opengl::DepthStencilState::convertStencilOperation( newDsDesc.backFaceStencil.stencilFailureOperation) == newStencilBackFail); ASSERT_TRUE(opengl::DepthStencilState::convertStencilOperation( newDsDesc.frontFaceStencil.stencilFailureOperation) == newStencilFail); ASSERT_TRUE(opengl::DepthStencilState::convertStencilOperation( newDsDesc.frontFaceStencil.depthFailureOperation) == newStencilPassDepthFail); ASSERT_TRUE(opengl::DepthStencilState::convertStencilOperation( newDsDesc.frontFaceStencil.depthStencilPassOperation) == newStencilPassDepthPass); ASSERT_TRUE(newDsDesc.backFaceStencil.writeMask == newStencilBackWriteMask); ASSERT_TRUE(newDsDesc.frontFaceStencil.writeMask == newStencilWriteMask); ctx->getBooleanv(GL_DEPTH_WRITEMASK, &newIsDepthWriteEnabled); ASSERT_TRUE((bool)newIsDepthWriteEnabled == newDsDesc.isDepthWriteEnabled); ctx->getIntegerv(GL_DEPTH_FUNC, &newDepthFunVal); ASSERT_TRUE(newDepthFunVal == opengl::DepthStencilState::convertCompareFunction(newDsDesc.compareFunction)); ASSERT_TRUE(dsDesc != newDsDesc); ASSERT_TRUE(newDsDesc.backFaceStencil != newDsDesc.frontFaceStencil); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/DestructionGuard.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../util/Common.h" #include #include #include namespace igl::tests { // // DestructionGuardOGLTest // // Tests for the OpenGL DestructionGuard. // class DestructionGuardOGLTest : public ::testing::Test { public: DestructionGuardOGLTest() = default; ~DestructionGuardOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); context_ = &static_cast(*iglDev_).getContext(); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; opengl::IContext* context_ = nullptr; }; // // InitiallyAllowed // // Destruction should be allowed before any guard is active. // TEST_F(DestructionGuardOGLTest, InitiallyAllowed) { ASSERT_TRUE(context_->isDestructionAllowed()); } // // GuardPreventsDestruction // // While a DestructionGuard is alive, destruction should not be allowed. // TEST_F(DestructionGuardOGLTest, GuardPreventsDestruction) { auto& device = static_cast(*iglDev_); const auto& platformDevice = static_cast(device.getPlatformDevice()); { auto guard = platformDevice.getDestructionGuard(); ASSERT_FALSE(context_->isDestructionAllowed()); } } // // GuardScopeRestore // // After a DestructionGuard goes out of scope, destruction should be allowed again. // TEST_F(DestructionGuardOGLTest, GuardScopeRestore) { auto& device = static_cast(*iglDev_); const auto& platformDevice = static_cast(device.getPlatformDevice()); { auto guard = platformDevice.getDestructionGuard(); ASSERT_FALSE(context_->isDestructionAllowed()); } // After guard scope, destruction should be allowed again ASSERT_TRUE(context_->isDestructionAllowed()); } // // NestedGuards // // Nested guards should work correctly - destruction stays blocked until all guards are released. // TEST_F(DestructionGuardOGLTest, NestedGuards) { auto& device = static_cast(*iglDev_); const auto& platformDevice = static_cast(device.getPlatformDevice()); { auto outerGuard = platformDevice.getDestructionGuard(); ASSERT_FALSE(context_->isDestructionAllowed()); { auto innerGuard = platformDevice.getDestructionGuard(); ASSERT_FALSE(context_->isDestructionAllowed()); } // Inner guard released, but outer guard still active ASSERT_FALSE(context_->isDestructionAllowed()); } // Both guards released ASSERT_TRUE(context_->isDestructionAllowed()); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/Device.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../data/ShaderData.h" #include "../util/Common.h" #include "../util/TestDevice.h" #include "../util/TestErrorGuard.h" #include #include #include #include #include #include namespace igl::tests { /// Helper to create just any render pipeline in a valid way static std::shared_ptr createRenderPipeline( const std::shared_ptr& device, Result* result); /// Just creates any shader static std::shared_ptr createShaderModule(const std::shared_ptr& device, Result* result); class DeviceOGLTest : public ::testing::Test { public: DeviceOGLTest() = default; ~DeviceOGLTest() override = default; // Set up common resources. This will create a device void SetUp() override { // Turn off debug break so unit tests can run igl::setDebugBreakEnabled(false); iglDev_ = util::createTestDevice(); ASSERT_TRUE(iglDev_ != nullptr); context_ = &static_cast(*iglDev_).getContext(); } void TearDown() override {} // Member variables protected: opengl::IContext* context_{}; std::shared_ptr iglDev_; }; /// IGL EndScope() optionally restores several OGL states. This test makes sure those states are /// restored correctly. TEST_F(DeviceOGLTest, EndScope) { #if IGL_PLATFORM_LINUX && !IGL_PLATFORM_LINUX_USE_EGL GTEST_SKIP() << "Fix this test on Linux"; #endif context_->setUnbindPolicy(opengl::UnbindPolicy::EndScope); std::array buffers{}; // Create a DeviceScope in a new scope to trigger iglDev_->beginScope and iglDev_->endScope when // the scope exits and the DeviceScope is destroyed { const DeviceScope deviceScope(*iglDev_); ASSERT_TRUE(iglDev_->verifyScope()); context_->genBuffers(2, buffers.data()); // Artificially set values that will be restored when endScope is called context_->colorMask(0u, 0u, 0u, 0u); context_->blendFunc(GL_SRC_COLOR, GL_DST_COLOR); context_->bindBuffer(GL_ARRAY_BUFFER, buffers[0]); context_->bindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]); context_->pixelStorei(GL_PACK_ALIGNMENT, 1); context_->pixelStorei(GL_UNPACK_ALIGNMENT, 1); GLboolean mask[4]; context_->getBooleanv(GL_COLOR_WRITEMASK, mask); ASSERT_TRUE(std::all_of(mask, mask + 4, [](GLboolean value) { return !value; })); GLint value = 0; context_->getIntegerv(GL_BLEND_SRC_RGB, &value); ASSERT_EQ(value, GL_SRC_COLOR); context_->getIntegerv(GL_BLEND_DST_RGB, &value); ASSERT_EQ(value, GL_DST_COLOR); context_->getIntegerv(GL_ARRAY_BUFFER_BINDING, &value); ASSERT_EQ(value, buffers[0]); context_->getIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &value); ASSERT_EQ(value, buffers[1]); context_->getIntegerv(GL_PACK_ALIGNMENT, &value); ASSERT_EQ(value, 1); context_->getIntegerv(GL_UNPACK_ALIGNMENT, &value); ASSERT_EQ(value, 1); } // Check whether the correct values are restored from endScope. These are the color mask, blend // function, buffer bindings, and pixel storage modes. GLboolean mask[4]; context_->getBooleanv(GL_COLOR_WRITEMASK, mask); ASSERT_TRUE(std::all_of(mask, mask + 4, [](GLboolean value) { return value; })); GLint value = 0; context_->getIntegerv(GL_BLEND_SRC_RGB, &value); ASSERT_EQ(value, GL_ONE); context_->getIntegerv(GL_BLEND_DST_RGB, &value); ASSERT_EQ(value, GL_ZERO); context_->getIntegerv(GL_ARRAY_BUFFER_BINDING, &value); ASSERT_EQ(value, 0); context_->getIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &value); ASSERT_EQ(value, 0); context_->getIntegerv(GL_PACK_ALIGNMENT, &value); ASSERT_EQ(value, 4); context_->getIntegerv(GL_UNPACK_ALIGNMENT, &value); ASSERT_EQ(value, 4); context_->deleteBuffers(2, buffers.data()); // Check that gl version and shader version works auto glVersion = context_->deviceFeatures().getGLVersion(); ASSERT_NE(glVersion, igl::opengl::GLVersion::NotAvailable); auto shaderVersion = iglDev_->getShaderVersion(); ASSERT_NE(shaderVersion.majorVersion, 0); #if IGL_OPENGL_ES ASSERT_EQ(shaderVersion.family, igl::ShaderFamily::GlslEs); #else ASSERT_EQ(shaderVersion.family, igl::ShaderFamily::Glsl); #endif ASSERT_GT(shaderVersion.majorVersion + shaderVersion.minorVersion, 0); #if IGL_BACKEND_OPENGL const std::string expectedVersion = "#version " + std::to_string(shaderVersion.majorVersion) + (shaderVersion.minorVersion == 0 ? "00" : std::to_string(shaderVersion.minorVersion)) + ((shaderVersion.family == igl::ShaderFamily::GlslEs && shaderVersion.majorVersion > 1) ? " es" : ""); ASSERT_EQ(igl::opengl::getStringFromShaderVersion(shaderVersion), expectedVersion); #endif // IGL_BACKEND_OPENGL } TEST_F(DeviceOGLTest, EndScope_ClearContext) { context_->setUnbindPolicy(opengl::UnbindPolicy::ClearContext); { // Clear current context, one level deep context_->clearCurrentContext(); const DeviceScope deviceScope(*iglDev_); ASSERT_TRUE(iglDev_->verifyScope()); ASSERT_TRUE(context_->isCurrentContext()); } ASSERT_FALSE(context_->isCurrentContext()); { // Clear current context, one level deep const DeviceScope scope1(*iglDev_); ASSERT_TRUE(iglDev_->verifyScope()); ASSERT_TRUE(context_->isCurrentContext()); { const DeviceScope scope2(*iglDev_); ASSERT_TRUE(iglDev_->verifyScope()); ASSERT_TRUE(context_->isCurrentContext()); } // Scope destroyed - validate that it's no longer current ASSERT_TRUE(iglDev_->verifyScope()); ASSERT_TRUE(context_->isCurrentContext()); } ASSERT_FALSE(context_->isCurrentContext()); } TEST_F(DeviceOGLTest, DeletionTest) { const igl::tests::util::TestErrorGuard testErrorGuard; auto iglDev2 = util::createTestDevice(); std::unique_ptr buffer; std::shared_ptr framebuffer; std::shared_ptr texture; std::shared_ptr renderbufferTexture; std::unique_ptr renderCommandEncoder; // Used to hold onto a VAO if they're // enabled std::shared_ptr renderPipelineState; // Holds onto ShaderStages which will // call deleteProgram std::shared_ptr shaderModule; // Used to trigger deleteShader { const DeviceScope scope1(*iglDev_); // deleteBuffers const BufferDesc desc{ .type = BufferDesc::BufferTypeBits::Vertex, .length = 0, .storage = ResourceStorage::Shared, }; Result res; buffer = iglDev_->createBuffer(desc, &res); ASSERT_EQ(res.code, Result::Code::Ok); ASSERT_EQ(buffer->getSizeInBytes(), 0); // Create an offscreen texture to render to TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 5, 5, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); Result ret; texture = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(texture != nullptr); FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = texture; framebuffer = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(framebuffer != nullptr); texDesc.usage = TextureDesc::TextureUsageBits::Attachment; renderbufferTexture = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(renderbufferTexture != nullptr); // To get it to create a VAO and then delete it const CommandQueueDesc cqDesc = {}; auto cq = iglDev_->createCommandQueue(cqDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(cq != nullptr); // Shouldn't trigger if above is okay auto cmd = cq->createCommandBuffer({}, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); RenderPassDesc renderPassDesc; renderPassDesc.colorAttachments.resize(1); renderPassDesc.colorAttachments[0].loadAction = LoadAction::Clear; renderPassDesc.colorAttachments[0].storeAction = StoreAction::Store; renderPassDesc.colorAttachments[0].clearColor = {0.0, 0.0, 0.0, 1.0}; renderCommandEncoder = cmd->createRenderCommandEncoder(renderPassDesc, framebuffer); ASSERT_TRUE(renderCommandEncoder != nullptr); renderPipelineState = createRenderPipeline(iglDev_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(renderPipelineState != nullptr); shaderModule = createShaderModule(iglDev_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(shaderModule != nullptr); } // Force scope to change (workaround for leaving device scope not clearing current eagl scope) { const DeviceScope scope2(*iglDev2); ASSERT_TRUE(iglDev2->verifyScope()); ASSERT_FALSE(iglDev_->verifyScope()); } // This should make all the resources deallocate while not in scope. buffer = nullptr; framebuffer = nullptr; texture = nullptr; renderbufferTexture = nullptr; renderCommandEncoder = nullptr; renderPipelineState = nullptr; shaderModule = nullptr; // Entering main scope again to flush deletion queue { const DeviceScope scope3(*iglDev_); } } std::shared_ptr createRenderPipeline(const std::shared_ptr& device, Result* outResult) { Result ret; RenderPipelineDesc renderPipelineDesc; // Initialize shader stages std::unique_ptr stages; igl::tests::util::createSimpleShaderStages(device, stages); renderPipelineDesc.shaderStages = std::move(stages); // Initialize input to vertex shader VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Float4; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].bufferIndex = data::shader::kSimplePosIndex; inputDesc.attributes[0].name = data::shader::kSimplePos; inputDesc.attributes[0].location = 0; inputDesc.inputBindings[0].stride = sizeof(float) * 4; inputDesc.attributes[1].format = VertexAttributeFormat::Float2; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].bufferIndex = data::shader::kSimpleUvIndex; inputDesc.attributes[1].name = data::shader::kSimpleUv; inputDesc.attributes[1].location = 1; inputDesc.inputBindings[1].stride = sizeof(float) * 2; // numAttributes has to equal to bindings when using more than 1 buffer inputDesc.numAttributes = inputDesc.numInputBindings = 2; auto vertexInputState = device->createVertexInputState(inputDesc, &ret); if (!ret.isOk()) { Result::setResult(outResult, ret.code, ret.message); return nullptr; } renderPipelineDesc.vertexInputState = vertexInputState; auto renderPipelineState = device->createRenderPipeline(renderPipelineDesc, &ret); if (!ret.isOk()) { Result::setResult(outResult, ret.code, ret.message); return nullptr; } return renderPipelineState; } std::shared_ptr createShaderModule(const std::shared_ptr& device, Result* outResult) { Result ret; auto vertShader = ShaderModuleCreator::fromStringInput( *device, data::shader::kOglSimpleVertShader.data(), {ShaderStage::Vertex, "main"}, "", &ret); if (!ret.isOk()) { Result::setResult(outResult, ret.code, ret.message); return nullptr; } return vertShader; } TEST_F(DeviceOGLTest, CreateShaderModuleUnknownTypeFails) { Result ret; auto vertShader = ShaderModuleCreator::fromStringInput(*iglDev_, data::shader::kOglSimpleVertShader.data(), {static_cast(99), "main"}, "", &ret); EXPECT_FALSE(ret.isOk()) << "invalid stage to compile should result in failure"; EXPECT_TRUE(vertShader == nullptr) << "invalid stage to compile should result in null result"; } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/DeviceFeatureSetFull.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include #include #include namespace igl::tests { // // DeviceFeatureSetFullOGLTest // // Tests for the full DeviceFeatureSet API in OpenGL. // class DeviceFeatureSetFullOGLTest : public ::testing::Test { public: DeviceFeatureSetFullOGLTest() = default; ~DeviceFeatureSetFullOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); context_ = &static_cast(*iglDev_).getContext(); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; opengl::IContext* context_ = nullptr; }; // // HasFeature // // Verify that hasFeature returns a boolean without crashing for various features. // TEST_F(DeviceFeatureSetFullOGLTest, HasFeature) { const auto& features = context_->deviceFeatures(); // These should all return a boolean without crashing bool compute = features.hasFeature(DeviceFeatures::Compute); bool multiview = features.hasFeature(DeviceFeatures::Multiview); bool texture3d = features.hasFeature(DeviceFeatures::Texture3D); bool msaa = features.hasFeature(DeviceFeatures::MultiSample); bool uniformBlocks = features.hasFeature(DeviceFeatures::UniformBlocks); bool storageBuffers = features.hasFeature(DeviceFeatures::StorageBuffers); bool timers = features.hasFeature(DeviceFeatures::Timers); bool drawInstanced = features.hasFeature(DeviceFeatures::DrawInstanced); bool bindUniform = features.hasFeature(DeviceFeatures::BindUniform); bool mrt = features.hasFeature(DeviceFeatures::MultipleRenderTargets); // Suppress unused variable warnings (void)compute; (void)multiview; (void)texture3d; (void)msaa; (void)uniformBlocks; (void)storageBuffers; (void)timers; (void)drawInstanced; (void)bindUniform; (void)mrt; // The test passes if no crash occurred SUCCEED(); } // // HasExtension // // Verify that hasExtension returns a boolean without crashing. // TEST_F(DeviceFeatureSetFullOGLTest, HasExtension) { const auto& features = context_->deviceFeatures(); bool timerQuery = features.hasExtension(opengl::Extensions::TimerQuery); bool vao = features.hasExtension(opengl::Extensions::VertexArrayObject); bool fbBlit = features.hasExtension(opengl::Extensions::FramebufferBlit); bool mapBuf = features.hasExtension(opengl::Extensions::MapBuffer); bool depth24 = features.hasExtension(opengl::Extensions::Depth24); bool sync = features.hasExtension(opengl::Extensions::Sync); bool srgb = features.hasExtension(opengl::Extensions::Srgb); bool debug = features.hasExtension(opengl::Extensions::Debug); (void)timerQuery; (void)vao; (void)fbBlit; (void)mapBuf; (void)depth24; (void)sync; (void)srgb; (void)debug; SUCCEED(); } // // HasInternalFeature // // Verify that hasInternalFeature returns a boolean without crashing. // TEST_F(DeviceFeatureSetFullOGLTest, HasInternalFeature) { const auto& features = context_->deviceFeatures(); bool fbBlit = features.hasInternalFeature(opengl::InternalFeatures::FramebufferBlit); bool fbObject = features.hasInternalFeature(opengl::InternalFeatures::FramebufferObject); bool vao = features.hasInternalFeature(opengl::InternalFeatures::VertexArrayObject); bool mapBuf = features.hasInternalFeature(opengl::InternalFeatures::MapBuffer); bool unmapBuf = features.hasInternalFeature(opengl::InternalFeatures::UnmapBuffer); bool texStorage = features.hasInternalFeature(opengl::InternalFeatures::TexStorage); bool sync = features.hasInternalFeature(opengl::InternalFeatures::Sync); bool debugMsg = features.hasInternalFeature(opengl::InternalFeatures::DebugMessage); bool invalidateFb = features.hasInternalFeature(opengl::InternalFeatures::InvalidateFramebuffer); bool polyFill = features.hasInternalFeature(opengl::InternalFeatures::PolygonFillMode); (void)fbBlit; (void)fbObject; (void)vao; (void)mapBuf; (void)unmapBuf; (void)texStorage; (void)sync; (void)debugMsg; (void)invalidateFb; (void)polyFill; SUCCEED(); } // // GetFeatureLimits_MaxTextureSize // // Verify getFeatureLimits returns a sensible value for MaxTextureSize. // TEST_F(DeviceFeatureSetFullOGLTest, GetFeatureLimits_MaxTextureSize) { size_t maxTextureSize = 0; bool hasLimit = iglDev_->getFeatureLimits(DeviceFeatureLimits::MaxTextureDimension1D2D, maxTextureSize); ASSERT_TRUE(hasLimit); // Max texture size should be at least 64 (even the smallest GL implementations support this) ASSERT_GE(maxTextureSize, 64u); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/ExtensionDetection.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include #include #include namespace igl::tests { // // ExtensionDetectionOGLTest // // Tests for OpenGL extension detection. // class ExtensionDetectionOGLTest : public ::testing::Test { public: ExtensionDetectionOGLTest() = default; ~ExtensionDetectionOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); context_ = &static_cast(*iglDev_).getContext(); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; opengl::IContext* context_ = nullptr; }; // // HasExtensionReturnsValue // // Verify that querying for extensions returns consistent boolean values // and does not crash. // TEST_F(ExtensionDetectionOGLTest, HasExtensionReturnsValue) { const auto& features = context_->deviceFeatures(); // Query a variety of extensions and verify they return consistently // (calling twice should give the same result) bool timerQuery1 = features.hasExtension(opengl::Extensions::TimerQuery); bool timerQuery2 = features.hasExtension(opengl::Extensions::TimerQuery); ASSERT_EQ(timerQuery1, timerQuery2); bool vao1 = features.hasExtension(opengl::Extensions::VertexArrayObject); bool vao2 = features.hasExtension(opengl::Extensions::VertexArrayObject); ASSERT_EQ(vao1, vao2); bool fbBlit1 = features.hasExtension(opengl::Extensions::FramebufferBlit); bool fbBlit2 = features.hasExtension(opengl::Extensions::FramebufferBlit); ASSERT_EQ(fbBlit1, fbBlit2); bool mapBuffer1 = features.hasExtension(opengl::Extensions::MapBuffer); bool mapBuffer2 = features.hasExtension(opengl::Extensions::MapBuffer); ASSERT_EQ(mapBuffer1, mapBuffer2); bool depth24_1 = features.hasExtension(opengl::Extensions::Depth24); bool depth24_2 = features.hasExtension(opengl::Extensions::Depth24); ASSERT_EQ(depth24_1, depth24_2); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/FeatureLimits.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include #include namespace igl::tests { // // FeatureLimitsOGLTest // // Tests for querying OpenGL feature limits. // class FeatureLimitsOGLTest : public ::testing::Test { public: FeatureLimitsOGLTest() = default; ~FeatureLimitsOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); context_ = &static_cast(*iglDev_).getContext(); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; opengl::IContext* context_ = nullptr; }; // // MaxTextureSize // // Verify that the maximum texture size is at least a reasonable minimum. // TEST_F(FeatureLimitsOGLTest, MaxTextureSize) { size_t maxTextureSize = 0; bool hasLimit = iglDev_->getFeatureLimits(DeviceFeatureLimits::MaxTextureDimension1D2D, maxTextureSize); ASSERT_TRUE(hasLimit); // OpenGL spec guarantees at least 64, but practically all hardware supports much more ASSERT_GE(maxTextureSize, 64u); } // // MaxRenderTargets // // Verify the number of render targets is at least 1. // TEST_F(FeatureLimitsOGLTest, MaxRenderTargets) { size_t maxRenderTargets = 0; bool hasLimit = iglDev_->getFeatureLimits(DeviceFeatureLimits::MaxColorAttachments, maxRenderTargets); if (!hasLimit) { // Some backends might not report this limit GTEST_SKIP() << "MaxColorAttachments limit not reported"; } // Must support at least 1 render target ASSERT_GE(maxRenderTargets, 1u); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/FramebufferBlit.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include #include #include #include #include #include #include #include #include namespace igl::tests { #define OFFSCREEN_TEX_WIDTH 4 #define OFFSCREEN_TEX_HEIGHT 4 // // FramebufferBlitOGLTest // // Tests for OpenGL framebuffer blit operations. // class FramebufferBlitOGLTest : public ::testing::Test { public: FramebufferBlitOGLTest() = default; ~FramebufferBlitOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); context_ = &static_cast(*iglDev_).getContext(); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; opengl::IContext* context_ = nullptr; }; // // ColorBlit // // Create source and destination FBOs, clear source to red, blit, verify destination. // TEST_F(FramebufferBlitOGLTest, ColorBlit) { if (!context_->deviceFeatures().hasInternalFeature(opengl::InternalFeatures::FramebufferBlit)) { GTEST_SKIP() << "FramebufferBlit not supported"; } Result ret; // Create source texture and framebuffer const TextureDesc srcTexDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); auto srcTexture = iglDev_->createTexture(srcTexDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_NE(srcTexture, nullptr); FramebufferDesc srcFbDesc; srcFbDesc.colorAttachments[0].texture = srcTexture; auto srcFramebuffer = iglDev_->createFramebuffer(srcFbDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_NE(srcFramebuffer, nullptr); // Create destination texture and framebuffer const TextureDesc dstTexDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); auto dstTexture = iglDev_->createTexture(dstTexDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_NE(dstTexture, nullptr); FramebufferDesc dstFbDesc; dstFbDesc.colorAttachments[0].texture = dstTexture; auto dstFramebuffer = iglDev_->createFramebuffer(dstFbDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_NE(dstFramebuffer, nullptr); // Clear source framebuffer to red RenderPassDesc renderPass; renderPass.colorAttachments.resize(1); renderPass.colorAttachments[0].loadAction = LoadAction::Clear; renderPass.colorAttachments[0].storeAction = StoreAction::Store; renderPass.colorAttachments[0].clearColor = {1.0, 0.0, 0.0, 1.0}; // Red CommandBufferDesc cbDesc; auto cmdBuf = cmdQueue_->createCommandBuffer(cbDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); auto cmdEncoder = cmdBuf->createRenderCommandEncoder(renderPass, srcFramebuffer); ASSERT_NE(cmdEncoder, nullptr); cmdEncoder->endEncoding(); cmdQueue_->submit(*cmdBuf); // Clear destination framebuffer to black RenderPassDesc dstRenderPass; dstRenderPass.colorAttachments.resize(1); dstRenderPass.colorAttachments[0].loadAction = LoadAction::Clear; dstRenderPass.colorAttachments[0].storeAction = StoreAction::Store; dstRenderPass.colorAttachments[0].clearColor = {0.0, 0.0, 0.0, 1.0}; // Black auto cmdBuf2 = cmdQueue_->createCommandBuffer(cbDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); auto cmdEncoder2 = cmdBuf2->createRenderCommandEncoder(dstRenderPass, dstFramebuffer); ASSERT_NE(cmdEncoder2, nullptr); cmdEncoder2->endEncoding(); cmdQueue_->submit(*cmdBuf2); // Blit from source to destination auto& device = static_cast(*iglDev_); const auto& platformDevice = static_cast(device.getPlatformDevice()); platformDevice.blitFramebuffer(srcFramebuffer, 0, 0, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT, dstFramebuffer, 0, 0, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT, GL_COLOR_BUFFER_BIT, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); // Read back destination pixels std::array pixels{}; dstFramebuffer->copyBytesColorAttachment( *cmdQueue_, 0, pixels.data(), TextureRangeDesc::new2D(0, 0, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT)); // Verify destination has red pixels (RGBA = 0xFF0000FF in little-endian ABGR) for (auto px : pixels) { // Check red channel is non-zero uint8_t r = px & 0xFF; ASSERT_GT(r, 0u) << "Expected red channel to be non-zero after blit"; } ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/HWDevice.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #if IGL_PLATFORM_IOS #include #elif IGL_PLATFORM_MACOSX #include #elif IGL_PLATFORM_ANDROID || IGL_PLATFORM_LINUX_USE_EGL #include #elif IGL_PLATFORM_LINUX #include #elif IGL_PLATFORM_WINDOWS #if defined(FORCE_USE_ANGLE) #include #else #include #endif // FORCE_USE_ANGLE #else #error "Unsupported testing platform" #endif namespace igl::tests { class HWDeviceOGLTest : public ::testing::Test { public: HWDeviceOGLTest() = default; ~HWDeviceOGLTest() override = default; // Set up common resources. This will create a device void SetUp() override { // Turn off debug break so unit tests can run setDebugBreakEnabled(false); iglHwDev_ = createHWTestDevice(); ASSERT_TRUE(iglHwDev_ != nullptr); } void TearDown() override {} std::shared_ptr createHWTestDevice() { #if IGL_PLATFORM_IOS return std::make_shared(); #elif IGL_PLATFORM_MACOSX return std::make_shared(); #elif IGL_PLATFORM_ANDROID || IGL_PLATFORM_LINUX_USE_EGL return std::make_shared(); #elif IGL_PLATFORM_LINUX return std::make_shared(); #elif IGL_PLATFORM_WINDOWS #if defined(FORCE_USE_ANGLE) return std::make_shared(); #else return std::make_shared(); #endif // FORCE_USE_ANGLE #else return nullptr; #endif } // Member variables protected: std::shared_ptr iglHwDev_; }; /// This test ensures a device can be created when calling create() TEST_F(HWDeviceOGLTest, DeviceCreationSanityTest) { { Result result; const std::unique_ptr device = iglHwDev_->create({}, &result); // Ensure the result of the device creation is ok ASSERT_TRUE(result.isOk()); } { Result result; const std::unique_ptr device = iglHwDev_->create(&result); // Ensure the result of the device creation is ok ASSERT_TRUE(result.isOk()); } } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/ImageLoadStore.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include #include #include namespace igl::tests { // // ImageLoadStoreOGLTest // // Tests for shader image load/store operations in OpenGL. // class ImageLoadStoreOGLTest : public ::testing::Test { public: ImageLoadStoreOGLTest() = default; ~ImageLoadStoreOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); context_ = &static_cast(*iglDev_).getContext(); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; opengl::IContext* context_ = nullptr; }; // // BindImageTexture // // Test binding an image texture for compute shader access. // TEST_F(ImageLoadStoreOGLTest, BindImageTexture) { if (!iglDev_->hasFeature(DeviceFeatures::Compute)) { GTEST_SKIP() << "Compute not supported"; } if (!context_->deviceFeatures().hasInternalFeature( opengl::InternalFeatures::ShaderImageLoadStore)) { GTEST_SKIP() << "Shader image load/store not supported"; } Result ret; // Create a texture suitable for image load/store const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 4, 4, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Storage); auto texture = iglDev_->createTexture(texDesc, &ret); if (!ret.isOk() || texture == nullptr) { GTEST_SKIP() << "Cannot create storage texture: " << ret.message.c_str(); } // Bind the image texture using the context directly // This tests the low-level bindImageTexture call auto* oglTexture = texture.get(); ASSERT_NE(oglTexture, nullptr); // Just verify no GL errors from the texture creation ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/InvalidateFramebuffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include #include #include #include #include namespace igl::tests { // // InvalidateFramebufferOGLTest // // Tests for framebuffer invalidation in OpenGL. // class InvalidateFramebufferOGLTest : public ::testing::Test { public: InvalidateFramebufferOGLTest() = default; ~InvalidateFramebufferOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); context_ = &static_cast(*iglDev_).getContext(); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; opengl::IContext* context_ = nullptr; }; // // InvalidateNoError // // Invalidate a framebuffer attachment and verify no GL errors occur. // TEST_F(InvalidateFramebufferOGLTest, InvalidateNoError) { if (!context_->deviceFeatures().hasInternalFeature( opengl::InternalFeatures::InvalidateFramebuffer)) { GTEST_SKIP() << "InvalidateFramebuffer not supported"; } Result ret; // Create a framebuffer const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 4, 4, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); auto texture = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); FramebufferDesc fbDesc; fbDesc.colorAttachments[0].texture = texture; auto framebuffer = iglDev_->createFramebuffer(fbDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); // Clear the framebuffer first RenderPassDesc renderPass; renderPass.colorAttachments.resize(1); renderPass.colorAttachments[0].loadAction = LoadAction::Clear; renderPass.colorAttachments[0].storeAction = StoreAction::DontCare; // Indicates invalidation renderPass.colorAttachments[0].clearColor = {0.0, 0.0, 0.0, 1.0}; CommandBufferDesc cbDesc; auto cmdBuf = cmdQueue_->createCommandBuffer(cbDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); auto cmdEncoder = cmdBuf->createRenderCommandEncoder(renderPass, framebuffer); ASSERT_NE(cmdEncoder, nullptr); cmdEncoder->endEncoding(); cmdQueue_->submit(*cmdBuf); ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/MSAATextureAttachment.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include #include #include #include namespace igl::tests { // // MSAATextureAttachmentOGLTest // // Tests for MSAA (Multi-Sample Anti-Aliasing) texture attachment in OpenGL. // class MSAATextureAttachmentOGLTest : public ::testing::Test { public: MSAATextureAttachmentOGLTest() = default; ~MSAATextureAttachmentOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); context_ = &static_cast(*iglDev_).getContext(); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; opengl::IContext* context_ = nullptr; }; // // CreateMSAARenderbuffer // // Create a multisampled texture for use as a render target. // TEST_F(MSAATextureAttachmentOGLTest, CreateMSAARenderbuffer) { if (!iglDev_->hasFeature(DeviceFeatures::MultiSample)) { GTEST_SKIP() << "MultiSample not supported"; } Result ret; TextureDesc texDesc = TextureDesc::new2D( TextureFormat::RGBA_UNorm8, 4, 4, TextureDesc::TextureUsageBits::Attachment); texDesc.numSamples = 4; auto msaaTexture = iglDev_->createTexture(texDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(msaaTexture, nullptr); ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); } // // ResolveMSAA // // Create MSAA and resolve textures, attach to framebuffer, clear, and resolve. // TEST_F(MSAATextureAttachmentOGLTest, ResolveMSAA) { if (!iglDev_->hasFeature(DeviceFeatures::MultiSample)) { GTEST_SKIP() << "MultiSample not supported"; } if (!iglDev_->hasFeature(DeviceFeatures::MultiSampleResolve)) { GTEST_SKIP() << "MultiSampleResolve not supported"; } Result ret; // Create MSAA texture TextureDesc msaaTexDesc = TextureDesc::new2D( TextureFormat::RGBA_UNorm8, 4, 4, TextureDesc::TextureUsageBits::Attachment); msaaTexDesc.numSamples = 4; auto msaaTexture = iglDev_->createTexture(msaaTexDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(msaaTexture, nullptr); // Create resolve texture TextureDesc resolveTexDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 4, 4, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); auto resolveTexture = iglDev_->createTexture(resolveTexDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(resolveTexture, nullptr); // Create framebuffer with MSAA and resolve attachments FramebufferDesc fbDesc; fbDesc.colorAttachments[0].texture = msaaTexture; fbDesc.colorAttachments[0].resolveTexture = resolveTexture; auto framebuffer = iglDev_->createFramebuffer(fbDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(framebuffer, nullptr); // Clear the framebuffer RenderPassDesc renderPass; renderPass.colorAttachments.resize(1); renderPass.colorAttachments[0].loadAction = LoadAction::Clear; renderPass.colorAttachments[0].storeAction = StoreAction::MsaaResolve; renderPass.colorAttachments[0].clearColor = {1.0, 0.0, 0.0, 1.0}; CommandBufferDesc cbDesc; auto cmdBuf = cmdQueue_->createCommandBuffer(cbDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); auto cmdEncoder = cmdBuf->createRenderCommandEncoder(renderPass, framebuffer); ASSERT_NE(cmdEncoder, nullptr); cmdEncoder->endEncoding(); cmdQueue_->submit(*cmdBuf); ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/Memcpy.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace igl::tests { // // MemcpyTest // // Test fixture for all the tests in this file. Takes care of common // initialization and allocating of common resources. // class MemcpyOGLTest : public ::testing::Test { public: MemcpyOGLTest() = default; ~MemcpyOGLTest() override = default; // Set up common resources. This will create a device and a command queue void SetUp() override { setDebugBreakEnabled(false); } void TearDown() override {} }; // // opengl::optimizedMemcpy // // Verify opengl::optimizedMemcpy works under various alignment cases. // TEST_F(MemcpyOGLTest, optimizedMemcpyAlignmentPermutation) { // Source buffer, destination buffer and its clearing pattern const char src[] = "0123456789ABCDEF+-*/"; const char clr[] = "abcdefghijklmnopqrst"; char dst[sizeof(src)]; ASSERT_EQ(sizeof(src), sizeof(clr)); // We do a series of optimizedMemcpy() from src to dst buffer, // we advance the src pointer at twice the speed of the dst pointer, // so we cover many kinds of alignment cases wrt both src and dst buffer. for (unsigned i = 0; i < sizeof(dst); ++i) { const unsigned di = i / 2; const unsigned len = sizeof(dst) - i; // Always clear the dst buffer before each optimizedMemcpy() call. memcpy(dst, clr, sizeof(dst)); igl::optimizedMemcpy(dst + di, src + i, len); // Verify optimizedMemcpy() has done the job correctly. // We divide the dst buffer into up to 3 sections, // then we copy into the middle section from src buffer, // in the end, we check all of them to have the correct content. ASSERT_EQ(0, memcmp(dst, clr, di)); ASSERT_EQ(0, memcmp(dst + di, src + i, len)); ASSERT_EQ(0, memcmp(dst + di + len, clr + di + len, sizeof(dst) - di - len)); } } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/MemoryObjectImport.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include #include namespace igl::tests { // // MemoryObjectImportOGLTest // // Tests for external memory object import in OpenGL. // class MemoryObjectImportOGLTest : public ::testing::Test { public: MemoryObjectImportOGLTest() = default; ~MemoryObjectImportOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); context_ = &static_cast(*iglDev_).getContext(); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; opengl::IContext* context_ = nullptr; }; // // MemoryObjectCreation // // Test that external memory object APIs are accessible (skip if not supported). // TEST_F(MemoryObjectImportOGLTest, MemoryObjectCreation) { if (!iglDev_->hasFeature(DeviceFeatures::ExternalMemoryObjects)) { GTEST_SKIP() << "External memory objects not supported"; } // Create a memory object GLuint memObject = 0; context_->createMemoryObjects(1, &memObject); // The memory object should be created (non-zero) ASSERT_NE(memObject, 0u); // Clean up context_->deleteMemoryObjects(1, &memObject); ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/MultiviewFramebuffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include #include #include namespace igl::tests { // // MultiviewFramebufferOGLTest // // Tests for multiview framebuffer creation in OpenGL. // class MultiviewFramebufferOGLTest : public ::testing::Test { public: MultiviewFramebufferOGLTest() = default; ~MultiviewFramebufferOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); context_ = &static_cast(*iglDev_).getContext(); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; opengl::IContext* context_ = nullptr; }; // // CreateMultiviewFramebuffer // // Create a framebuffer with multiview texture array attachments. // TEST_F(MultiviewFramebufferOGLTest, CreateMultiviewFramebuffer) { if (!iglDev_->hasFeature(DeviceFeatures::Multiview)) { GTEST_SKIP() << "Multiview not supported"; } if (!iglDev_->hasFeature(DeviceFeatures::Texture2DArray)) { GTEST_SKIP() << "Texture2DArray not supported"; } Result ret; // Create a 2D texture array with 2 layers for stereo rendering TextureDesc texDesc = TextureDesc::new2DArray(TextureFormat::RGBA_UNorm8, 4, 4, 2, // 2 layers for stereo TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); auto texture = iglDev_->createTexture(texDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(texture, nullptr); // Create framebuffer with multiview mode FramebufferDesc fbDesc; fbDesc.colorAttachments[0].texture = texture; fbDesc.mode = FramebufferMode::Stereo; auto framebuffer = iglDev_->createFramebuffer(fbDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(framebuffer, nullptr); ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/PipelineState.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../data/ShaderData.h" #include "../util/Common.h" #include #include #include #include #include namespace igl::tests { // Use a 4x4 texture for this test #define OFFSCREEN_TEX_WIDTH 4 #define OFFSCREEN_TEX_HEIGHT 4 // // PipelineStateOGLTest // // Test fixture for all the tests in this file. Takes care of common // initialization and allocating of common resources. // class PipelineStateOGLTest : public ::testing::Test { private: public: PipelineStateOGLTest() = default; ~PipelineStateOGLTest() override = default; // // SetUp() // // This function sets up a render pass and a render pipeline descriptor // so it is ready to render a simple quad with an input texture to an // offscreen texture. // // The actual creation of the render pipeline state object is left // to each test so that tests can replace the default settings with // something more appropriate. // void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_TRUE(iglDev_ != nullptr); ASSERT_TRUE(cmdQueue_ != nullptr); // Create an offscreen texture to render to const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); Result ret; offscreenTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(offscreenTexture_ != nullptr); // Create framebuffer using the offscreen texture FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = offscreenTexture_; framebuffer_ = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(framebuffer_ != nullptr); // Initialize render pass descriptor renderPass_.colorAttachments.resize(1); renderPass_.colorAttachments[0].loadAction = LoadAction::Clear; renderPass_.colorAttachments[0].storeAction = StoreAction::Store; renderPass_.colorAttachments[0].clearColor = {0.0, 0.0, 0.0, 1.0}; // Initialize input to vertex shader VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Float4; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].bufferIndex = data::shader::kSimplePosIndex; inputDesc.attributes[0].name = data::shader::kSimplePos; inputDesc.attributes[0].location = 0; inputDesc.inputBindings[0].stride = sizeof(float) * 4; inputDesc.attributes[1].format = VertexAttributeFormat::Float2; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].bufferIndex = data::shader::kSimpleUvIndex; inputDesc.attributes[1].name = data::shader::kSimpleUv; inputDesc.attributes[1].location = 1; inputDesc.inputBindings[1].stride = sizeof(float) * 2; // numAttributes has to equal to bindings when using more than 1 buffer inputDesc.numAttributes = inputDesc.numInputBindings = 2; vertexInputState_ = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(vertexInputState_ != nullptr); // Initialize Render Pipeline Descriptor, but leave the creation // to the individual tests in case further customization is required renderPipelineDesc_.vertexInputState = vertexInputState_; renderPipelineDesc_.targetDesc.colorAttachments.resize(1); renderPipelineDesc_.targetDesc.colorAttachments[0].textureFormat = offscreenTexture_->getFormat(); renderPipelineDesc_.cullMode = igl::CullMode::Disabled; renderPipelineDesc_.targetDesc.colorAttachments[0].blendEnabled = true; } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; std::shared_ptr cmdBuf_; CommandBufferDesc cbDesc_ = {}; RenderPassDesc renderPass_; std::shared_ptr offscreenTexture_; std::shared_ptr framebuffer_; std::shared_ptr shaderStages_; std::shared_ptr vertexInputState_; std::shared_ptr fragmentParamBuffer_; RenderPipelineDesc renderPipelineDesc_; }; // // GetIndexByName // // This test exercises ShaderStages.getIndexByName() for attribute array // buffer by going through the pipelineState object. // TEST_F(PipelineStateOGLTest, GetIndexByName) { Result ret; std::shared_ptr pipelineState; //---------------- // Create Shaders //---------------- // Initialize shader stages std::unique_ptr stages; igl::tests::util::createSimpleShaderStages(iglDev_, stages); shaderStages_ = std::move(stages); renderPipelineDesc_.shaderStages = shaderStages_; //---------------- // Create Pipeline //---------------- pipelineState = iglDev_->createRenderPipeline(renderPipelineDesc_, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(pipelineState != nullptr); // These should have a location because they are attributes in the simple shader int idx = pipelineState->getIndexByName(IGL_NAMEHANDLE(data::shader::kSimpleUv), igl::ShaderStage::Fragment); ASSERT_NE(idx, -1); idx = pipelineState->getIndexByName(IGL_NAMEHANDLE(data::shader::kSimplePos), igl::ShaderStage::Fragment); ASSERT_NE(idx, -1); } // Test static conversions from IGL ops to OGL ops TEST_F(PipelineStateOGLTest, ConvertOps) { //---------------- // BlendOp //---------------- const std::vector> inputAndExpectedBlendOp = { std::make_pair(BlendOp::Add, GL_FUNC_ADD), std::make_pair(BlendOp::Subtract, GL_FUNC_SUBTRACT), std::make_pair(BlendOp::ReverseSubtract, GL_FUNC_REVERSE_SUBTRACT), std::make_pair(BlendOp::Min, GL_MIN), std::make_pair(BlendOp::Max, GL_MAX), }; for (const auto& ioPair : inputAndExpectedBlendOp) { ASSERT_EQ(igl::opengl::RenderPipelineState::convertBlendOp(ioPair.first), ioPair.second); } //---------------- // BlendFactor //---------------- const std::vector> inputAndExpectedBlendFactor = { std::make_pair(BlendFactor::Zero, GL_ZERO), std::make_pair(BlendFactor::One, GL_ONE), std::make_pair(BlendFactor::SrcColor, GL_SRC_COLOR), std::make_pair(BlendFactor::OneMinusSrcColor, GL_ONE_MINUS_SRC_COLOR), std::make_pair(BlendFactor::DstColor, GL_DST_COLOR), std::make_pair(BlendFactor::OneMinusDstColor, GL_ONE_MINUS_DST_COLOR), std::make_pair(BlendFactor::SrcAlpha, GL_SRC_ALPHA), std::make_pair(BlendFactor::OneMinusSrcAlpha, GL_ONE_MINUS_SRC_ALPHA), std::make_pair(BlendFactor::DstAlpha, GL_DST_ALPHA), std::make_pair(BlendFactor::OneMinusDstAlpha, GL_ONE_MINUS_DST_ALPHA), std::make_pair(BlendFactor::BlendColor, GL_CONSTANT_COLOR), std::make_pair(BlendFactor::OneMinusBlendColor, GL_ONE_MINUS_CONSTANT_COLOR), std::make_pair(BlendFactor::BlendAlpha, GL_CONSTANT_ALPHA), std::make_pair(BlendFactor::OneMinusBlendAlpha, GL_ONE_MINUS_CONSTANT_ALPHA), std::make_pair(BlendFactor::SrcAlphaSaturated, GL_SRC_ALPHA_SATURATE), // Unsupported values default to GL_ONE std::make_pair(BlendFactor::Src1Color, GL_ONE), std::make_pair(BlendFactor::OneMinusSrc1Color, GL_ONE), std::make_pair(BlendFactor::Src1Alpha, GL_ONE), std::make_pair(BlendFactor::OneMinusSrc1Alpha, GL_ONE), }; for (const auto& ioPair : inputAndExpectedBlendFactor) { ASSERT_EQ(igl::opengl::RenderPipelineState::convertBlendFactor(ioPair.first), ioPair.second); } } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/PlatformDevice.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../util/Common.h" #if IGL_PLATFORM_IOS #include #elif IGL_PLATFORM_MACOSX #include #elif IGL_PLATFORM_ANDROID || IGL_PLATFORM_LINUX_USE_EGL #include #elif IGL_PLATFORM_LINUX #include #elif IGL_PLATFORM_WINDOWS #if defined(FORCE_USE_ANGLE) #include #else #include #endif // FORCE_USE_ANGLE #else #error "Unsupported testing platform" #endif #include #if IGL_PLATFORM_IOS #define PLATFORM_DEVICE opengl::ios::PlatformDevice #elif IGL_PLATFORM_MACOSX #define PLATFORM_DEVICE opengl::macos::PlatformDevice #elif IGL_PLATFORM_ANDROID || IGL_PLATFORM_LINUX_USE_EGL #define PLATFORM_DEVICE opengl::egl::PlatformDevice #elif IGL_PLATFORM_LINUX #define PLATFORM_DEVICE opengl::glx::PlatformDevice #elif IGL_PLATFORM_WINDOWS #if defined(FORCE_USE_ANGLE) #define PLATFORM_DEVICE opengl::egl::PlatformDevice #else #define PLATFORM_DEVICE opengl::wgl::PlatformDevice #endif // FORCE_USE_ANGLE #endif // Use a 1x1 Framebuffer for this test #define OFFSCREEN_RT_WIDTH 1 #define OFFSCREEN_RT_HEIGHT 1 namespace igl::tests { class PlatformDeviceTest : public ::testing::Test { public: PlatformDeviceTest() = default; ~PlatformDeviceTest() override = default; void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; }; // Test Cases TEST_F(PlatformDeviceTest, GetPlatformDeviceParentCls) { auto* pd = iglDev_->getPlatformDevice(); ASSERT_NE(pd, nullptr); } TEST_F(PlatformDeviceTest, GetPlatformDeviceChildCls) { auto* pd = iglDev_->getPlatformDevice(); ASSERT_NE(pd, nullptr); } // This test will exercise createTextureBufferExternal() API. // Since this API creates an empty container with the settings provided, we can // simply check that the settings provided are what are actually set. TEST_F(PlatformDeviceTest, CreateTextureBufferExternal) { auto* pd = iglDev_->getPlatformDevice(); ASSERT_NE(pd, nullptr); std::unique_ptr textureBuffer = pd->createTextureBufferExternal(1, // Randomly pick 1 as the Texture ID GL_TEXTURE_2D, // Randomly picking GL_TEXTURE_2D TextureDesc::TextureUsageBits::Sampled, OFFSCREEN_RT_WIDTH, OFFSCREEN_RT_HEIGHT, TextureFormat::RGBA_UNorm8); ASSERT_NE(textureBuffer, nullptr); ASSERT_EQ(textureBuffer->getTarget(), GL_TEXTURE_2D); ASSERT_EQ(textureBuffer->getId(), 1); ASSERT_EQ(textureBuffer->getUsage(), TextureDesc::TextureUsageBits::Sampled); } // This test will exercise CreateCurrentFrameBuffer() API. // It simply checks whether CreateCurrentFrameBuffer() does not return null pointer. TEST_F(PlatformDeviceTest, CreateCurrentFrameBuffer) { auto* pd = iglDev_->getPlatformDevice(); ASSERT_NE(pd, nullptr); auto frameBuffer = pd->createCurrentFramebuffer(); ASSERT_NE(frameBuffer, nullptr); } // // Test ITexture::getEstimatedSizeInBytes with external textures // TEST_F(PlatformDeviceTest, GetEstimatedSizeInBytesExternal) { auto* pd = iglDev_->getPlatformDevice(); auto calcSize = [&](size_t width, size_t height, TextureFormat format) -> size_t { auto texture = pd->createTextureBufferExternal(1, // Not actually using it GL_TEXTURE_2D, TextureDesc::TextureUsageBits::Sampled, width, height, format); if (texture == nullptr) { return 0; } return texture->getEstimatedSizeInBytes(); }; ASSERT_EQ(calcSize(64, 32, TextureFormat::Invalid), 2048); // 64 * 32 -- no bpp information ASSERT_EQ(calcSize(12, 34, TextureFormat::RGBA_UNorm8), 1632); // 12 * 34 * 4 ASSERT_EQ(calcSize(16, 1, TextureFormat::R_UNorm8), 16); ASSERT_EQ(calcSize(128, 333, TextureFormat::RG_UNorm8), 85248); // 128 * 333 * 2 } #if IGL_PLATFORM_ANDROID || IGL_PLATFORM_LINUX_USE_EGL // // Test for createTextureFromNativeDrawable() available on some platforms // TEST_F(PlatformDeviceTest, CreateTextureFromNativeDrawable) { auto* pd = iglDev_->getPlatformDevice(); ASSERT_NE(pd, nullptr); Result result; auto tex = pd->createTextureFromNativeDrawable(TextureFormat::RGBA_UNorm8, &result); EXPECT_TRUE(result.isOk()); EXPECT_NE(tex, nullptr); auto tex2 = pd->createTextureFromNativeDrawable(1, 1, TextureFormat::RGBA_UNorm8, &result); EXPECT_TRUE(result.isOk()); EXPECT_NE(tex2, nullptr); } // // Test for createTextureFromNativeDepth() available on some platforms // TEST_F(PlatformDeviceTest, CreateTextureFromNativeDepth) { auto* pd = iglDev_->getPlatformDevice(); ASSERT_NE(pd, nullptr); Result result; auto tex = pd->createTextureFromNativeDepth(TextureFormat::Z_UNorm24, &result); EXPECT_TRUE(result.isOk()); EXPECT_NE(tex, nullptr); } #endif } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/RenderCommandAdapter.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../data/ShaderData.h" #include "../data/VertexIndexData.h" #include "../util/Common.h" #include #include #include #include #include #include #include #include namespace igl::tests { #define OFFSCREEN_TEX_WIDTH 2 #define OFFSCREEN_TEX_HEIGHT 2 // // RenderCommandAdapterOGLTest // // Tests for the OpenGL RenderCommandAdapter. // class RenderCommandAdapterOGLTest : public ::testing::Test { public: RenderCommandAdapterOGLTest() = default; ~RenderCommandAdapterOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); context_ = &static_cast(*iglDev_).getContext(); Result ret; // Create an offscreen texture to render to const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); offscreenTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_NE(offscreenTexture_, nullptr); // Create framebuffer FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = offscreenTexture_; framebuffer_ = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_NE(framebuffer_, nullptr); // Initialize render pass descriptor renderPass_.colorAttachments.resize(1); renderPass_.colorAttachments[0].loadAction = LoadAction::Clear; renderPass_.colorAttachments[0].storeAction = StoreAction::Store; renderPass_.colorAttachments[0].clearColor = {0.0, 0.0, 0.0, 1.0}; // Initialize shader stages std::unique_ptr stages; igl::tests::util::createSimpleShaderStages(iglDev_, stages); shaderStages_ = std::move(stages); // Initialize vertex input state VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Float4; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].bufferIndex = data::shader::kSimplePosIndex; inputDesc.attributes[0].name = data::shader::kSimplePos; inputDesc.attributes[0].location = 0; inputDesc.inputBindings[0].stride = sizeof(float) * 4; inputDesc.attributes[1].format = VertexAttributeFormat::Float2; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].bufferIndex = data::shader::kSimpleUvIndex; inputDesc.attributes[1].name = data::shader::kSimpleUv; inputDesc.attributes[1].location = 1; inputDesc.inputBindings[1].stride = sizeof(float) * 2; inputDesc.numAttributes = inputDesc.numInputBindings = 2; vertexInputState_ = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(vertexInputState_, nullptr); // Create vertex buffer BufferDesc vbDesc; vbDesc.type = BufferDesc::BufferTypeBits::Vertex; vbDesc.data = data::vertex_index::kQuadVert.data(); vbDesc.length = sizeof(data::vertex_index::kQuadVert); vb_ = iglDev_->createBuffer(vbDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); // Create UV buffer BufferDesc uvDesc; uvDesc.type = BufferDesc::BufferTypeBits::Vertex; uvDesc.data = data::vertex_index::kQuadUv.data(); uvDesc.length = sizeof(data::vertex_index::kQuadUv); uvb_ = iglDev_->createBuffer(uvDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); // Create index buffer BufferDesc ibDesc; ibDesc.type = BufferDesc::BufferTypeBits::Index; ibDesc.data = data::vertex_index::kQuadInd.data(); ibDesc.length = sizeof(data::vertex_index::kQuadInd); ib_ = iglDev_->createBuffer(ibDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); // Initialize Render Pipeline Descriptor renderPipelineDesc_.vertexInputState = vertexInputState_; renderPipelineDesc_.shaderStages = shaderStages_; renderPipelineDesc_.targetDesc.colorAttachments.resize(1); renderPipelineDesc_.targetDesc.colorAttachments[0].textureFormat = offscreenTexture_->getFormat(); renderPipelineDesc_.cullMode = igl::CullMode::Disabled; pipelineState_ = iglDev_->createRenderPipeline(renderPipelineDesc_, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(pipelineState_, nullptr); // Create a simple 2x2 input texture (all white) const TextureDesc inputTexDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT, TextureDesc::TextureUsageBits::Sampled); inputTexture_ = iglDev_->createTexture(inputTexDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_NE(inputTexture_, nullptr); // Upload white pixel data const uint32_t whitePixels[] = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF}; inputTexture_->upload(TextureRangeDesc::new2D(0, 0, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT), whitePixels); // Create sampler SamplerStateDesc samplerDesc; samplerDesc.minFilter = SamplerMinMagFilter::Nearest; samplerDesc.magFilter = SamplerMinMagFilter::Nearest; sampler_ = iglDev_->createSamplerState(samplerDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; opengl::IContext* context_ = nullptr; RenderPassDesc renderPass_; std::shared_ptr offscreenTexture_; std::shared_ptr inputTexture_; std::shared_ptr framebuffer_; std::shared_ptr shaderStages_; std::shared_ptr vertexInputState_; std::shared_ptr pipelineState_; std::shared_ptr sampler_; std::unique_ptr vb_; std::unique_ptr uvb_; std::unique_ptr ib_; RenderPipelineDesc renderPipelineDesc_; }; // // DrawArrays // // Render a full-screen quad using drawArrays, read pixels, verify non-zero output. // TEST_F(RenderCommandAdapterOGLTest, DrawArrays) { Result ret; CommandBufferDesc cbDesc; auto cmdBuf = cmdQueue_->createCommandBuffer(cbDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); auto cmdEncoder = cmdBuf->createRenderCommandEncoder(renderPass_, framebuffer_); ASSERT_NE(cmdEncoder, nullptr); cmdEncoder->bindRenderPipelineState(pipelineState_); cmdEncoder->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmdEncoder->bindVertexBuffer(data::shader::kSimpleUvIndex, *uvb_); cmdEncoder->bindTexture(0, igl::BindTarget::kFragment, inputTexture_.get()); cmdEncoder->bindSamplerState(0, igl::BindTarget::kFragment, sampler_.get()); cmdEncoder->draw(4); cmdEncoder->endEncoding(); cmdQueue_->submit(*cmdBuf); // Read back pixels std::array pixels{}; framebuffer_->copyBytesColorAttachment( *cmdQueue_, 0, pixels.data(), TextureRangeDesc::new2D(0, 0, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT)); // At least one pixel should be non-zero (we rendered white on black) bool anyNonZero = false; for (auto px : pixels) { if (px != 0) { anyNonZero = true; break; } } ASSERT_TRUE(anyNonZero); } // // DrawElements // // Render using indexed geometry. // TEST_F(RenderCommandAdapterOGLTest, DrawElements) { Result ret; CommandBufferDesc cbDesc; auto cmdBuf = cmdQueue_->createCommandBuffer(cbDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); auto cmdEncoder = cmdBuf->createRenderCommandEncoder(renderPass_, framebuffer_); ASSERT_NE(cmdEncoder, nullptr); cmdEncoder->bindRenderPipelineState(pipelineState_); cmdEncoder->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmdEncoder->bindVertexBuffer(data::shader::kSimpleUvIndex, *uvb_); cmdEncoder->bindTexture(0, igl::BindTarget::kFragment, inputTexture_.get()); cmdEncoder->bindSamplerState(0, igl::BindTarget::kFragment, sampler_.get()); cmdEncoder->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmdEncoder->drawIndexed(6); cmdEncoder->endEncoding(); cmdQueue_->submit(*cmdBuf); // Read back pixels std::array pixels{}; framebuffer_->copyBytesColorAttachment( *cmdQueue_, 0, pixels.data(), TextureRangeDesc::new2D(0, 0, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT)); // All pixels should be non-zero (white), since we rendered a full-screen quad for (auto px : pixels) { ASSERT_NE(px, 0u); } } // // DrawArraysInstanced // // Render multiple instances using drawArrays. // TEST_F(RenderCommandAdapterOGLTest, DrawArraysInstanced) { if (!iglDev_->hasFeature(DeviceFeatures::DrawInstanced)) { GTEST_SKIP() << "DrawInstanced not supported"; } Result ret; CommandBufferDesc cbDesc; auto cmdBuf = cmdQueue_->createCommandBuffer(cbDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); auto cmdEncoder = cmdBuf->createRenderCommandEncoder(renderPass_, framebuffer_); ASSERT_NE(cmdEncoder, nullptr); cmdEncoder->bindRenderPipelineState(pipelineState_); cmdEncoder->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmdEncoder->bindVertexBuffer(data::shader::kSimpleUvIndex, *uvb_); cmdEncoder->bindTexture(0, igl::BindTarget::kFragment, inputTexture_.get()); cmdEncoder->bindSamplerState(0, igl::BindTarget::kFragment, sampler_.get()); // Draw 2 instances of the same triangle strip cmdEncoder->draw(4, 2); cmdEncoder->endEncoding(); cmdQueue_->submit(*cmdBuf); // Verify no GL errors ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); } // // DrawElementsInstanced // // Render multiple instances using indexed geometry. // TEST_F(RenderCommandAdapterOGLTest, DrawElementsInstanced) { if (!iglDev_->hasFeature(DeviceFeatures::DrawInstanced)) { GTEST_SKIP() << "DrawInstanced not supported"; } Result ret; CommandBufferDesc cbDesc; auto cmdBuf = cmdQueue_->createCommandBuffer(cbDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); auto cmdEncoder = cmdBuf->createRenderCommandEncoder(renderPass_, framebuffer_); ASSERT_NE(cmdEncoder, nullptr); cmdEncoder->bindRenderPipelineState(pipelineState_); cmdEncoder->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmdEncoder->bindVertexBuffer(data::shader::kSimpleUvIndex, *uvb_); cmdEncoder->bindTexture(0, igl::BindTarget::kFragment, inputTexture_.get()); cmdEncoder->bindSamplerState(0, igl::BindTarget::kFragment, sampler_.get()); cmdEncoder->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmdEncoder->drawIndexed(6, 2); cmdEncoder->endEncoding(); cmdQueue_->submit(*cmdBuf); // Verify no GL errors ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); } // // DrawCountIncrement // // Verify that getCurrentDrawCount() increments after draws. // TEST_F(RenderCommandAdapterOGLTest, DrawCountIncrement) { const size_t drawCountBefore = iglDev_->getCurrentDrawCount(); Result ret; CommandBufferDesc cbDesc; auto cmdBuf = cmdQueue_->createCommandBuffer(cbDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); auto cmdEncoder = cmdBuf->createRenderCommandEncoder(renderPass_, framebuffer_); ASSERT_NE(cmdEncoder, nullptr); cmdEncoder->bindRenderPipelineState(pipelineState_); cmdEncoder->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmdEncoder->bindVertexBuffer(data::shader::kSimpleUvIndex, *uvb_); cmdEncoder->bindTexture(0, igl::BindTarget::kFragment, inputTexture_.get()); cmdEncoder->bindSamplerState(0, igl::BindTarget::kFragment, sampler_.get()); cmdEncoder->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmdEncoder->drawIndexed(6); cmdEncoder->endEncoding(); cmdQueue_->submit(*cmdBuf); const size_t drawCountAfter = iglDev_->getCurrentDrawCount(); ASSERT_GT(drawCountAfter, drawCountBefore); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/RenderPipelineReflection.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../data/ShaderData.h" #include "../util/Common.h" #include #include #include namespace igl::tests { // Use a 4x4 texture for this test #define OFFSCREEN_TEX_WIDTH 4 #define OFFSCREEN_TEX_HEIGHT 4 class RenderPipelineReflectionTest : public ::testing::Test { private: public: RenderPipelineReflectionTest() = default; ~RenderPipelineReflectionTest() override = default; // // SetUp() // void SetUp() override { // Turn off debug breaks, only use in debug mode igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_TRUE(iglDev_ != nullptr); ASSERT_TRUE(cmdQueue_ != nullptr); // Create an offscreen texture to render to const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); Result ret; offscreenTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(offscreenTexture_ != nullptr); // Initialize input to vertex shader VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Float4; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].bufferIndex = data::shader::kSimplePosIndex; inputDesc.attributes[0].name = data::shader::kSimplePos; inputDesc.attributes[0].location = 0; inputDesc.inputBindings[0].stride = sizeof(float) * 4; // numAttributes has to equal to bindings when using more than 1 buffer inputDesc.numAttributes = inputDesc.numInputBindings = 1; vertexInputState_ = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(vertexInputState_ != nullptr); std::unique_ptr stages; util::createShaderStages(iglDev_, data::shader::kOglSimpleVertShaderCube, "vertexShader", data::shader::kOglSimpleFragShaderCube, "fragmentShader", stages); ASSERT_TRUE(stages != nullptr); std::shared_ptr shaderStages; shaderStages = std::move(stages); // Initialize Render Pipeline Descriptor, but leave the creation // to the individual tests in case further customization is required RenderPipelineDesc renderPipelineDesc; renderPipelineDesc.vertexInputState = vertexInputState_; renderPipelineDesc.shaderStages = shaderStages; //---------------- // Create Pipeline //---------------- pipelineState_ = iglDev_->createRenderPipeline(renderPipelineDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(pipelineState_ != nullptr); pipeRef_ = static_cast( pipelineState_->renderPipelineReflection().get()); ASSERT_TRUE(pipeRef_ != nullptr); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; const std::string backend_ = IGL_BACKEND_TYPE; std::shared_ptr offscreenTexture_; std::shared_ptr vertexInputState_; std::shared_ptr pipelineState_; opengl::RenderPipelineReflection* pipeRef_{}; }; TEST_F(RenderPipelineReflectionTest, GetIndexByName) { auto index = pipeRef_->getIndexByName(IGL_NAMEHANDLE(data::shader::kSimpleCubeView)); ASSERT_TRUE(index >= 0); } TEST_F(RenderPipelineReflectionTest, GetNonexistentIndexByName) { auto index = pipeRef_->getIndexByName(IGL_NAMEHANDLE("ZYA")); ASSERT_EQ(index, -1); } TEST_F(RenderPipelineReflectionTest, CheckUniformDictionary) { ASSERT_EQ(pipeRef_->allUniformBuffers().size(), 1); ASSERT_EQ(pipeRef_->allSamplers().size(), 1); ASSERT_EQ(pipeRef_->allTextures().size(), 1); } TEST_F(RenderPipelineReflectionTest, VerifyBuffers) { auto buffers = pipeRef_->allUniformBuffers(); ASSERT_EQ(buffers.size(), 1); for (const auto& buffer : buffers) { ASSERT_EQ(buffer.shaderStage, ShaderStage::Fragment); // all uniforms are set to Fragment stage in OpenGL EXPECT_TRUE(buffer.name.toString() == data::shader::kSimpleCubeView); } } TEST_F(RenderPipelineReflectionTest, VerifyTextures) { auto textures = pipeRef_->allTextures(); ASSERT_EQ(textures.size(), 1); const auto& theOneTexture = textures.front(); ASSERT_EQ(theOneTexture.name, "inputImage"); } TEST_F(RenderPipelineReflectionTest, VerifySamplers) { auto samplers = pipeRef_->allSamplers(); ASSERT_EQ(samplers.size(), 1); const auto& theOneSampler = samplers.front(); ASSERT_EQ(theOneSampler.name, "inputImage"); } TEST_F(RenderPipelineReflectionTest, UniformBlocks) { bool useBlocks = iglDev_->hasFeature(DeviceFeatures::UniformBlocks); const bool isGles3 = iglDev_->getBackendVersion().flavor == igl::BackendFlavor::OpenGL_ES && iglDev_->getBackendVersion().majorVersion >= 3; #if defined(IGL_PLATFORM_LINUX) && IGL_PLATFORM_LINUX useBlocks = !isGles3; #endif if (!useBlocks) { GTEST_SKIP() << "Uniform blocks not supported"; return; } if (!isGles3) { return; } std::unique_ptr stages; util::createShaderStages(iglDev_, data::shader::kOglSimpleVertShaderUniformBlocks, "vertexShader", data::shader::kOglSimpleFragShaderUniformBlocks, "fragmentShader", stages); ASSERT_TRUE(stages != nullptr); std::shared_ptr shaderStages; shaderStages = std::move(stages); // Initialize Render Pipeline Descriptor, but leave the creation // to the individual tests in case further customization is required RenderPipelineDesc renderPipelineDesc; renderPipelineDesc.vertexInputState = vertexInputState_; renderPipelineDesc.shaderStages = shaderStages; //---------------- // Create Pipeline //---------------- Result ret; auto pipelineState = iglDev_->createRenderPipeline(renderPipelineDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(pipelineState != nullptr); auto* pipeRef = static_cast( pipelineState->renderPipelineReflection().get()); ASSERT_TRUE(pipeRef != nullptr); ASSERT_TRUE(pipeRef->getIndexByName(IGL_NAMEHANDLE("block_without_instance_name")) >= 0); ASSERT_TRUE(pipeRef->getIndexByName(IGL_NAMEHANDLE("block_with_instance_name")) >= 0); ASSERT_EQ(pipeRef->allSamplers().size(), 1); ASSERT_EQ(pipeRef->allTextures().size(), 1); const auto& uniformDict = pipeRef->getUniformDictionary(); ASSERT_EQ(uniformDict.size(), 2); const auto& uniformBlocksDict = pipeRef->getUniformBlocksDictionary(); ASSERT_EQ(uniformBlocksDict.size(), 2); auto buffers = pipeRef->allUniformBuffers(); ASSERT_EQ(buffers.size(), 3); for (auto& buffer : buffers) { if (buffer.name.toString() == "block_without_instance_name") { ASSERT_EQ(buffer.isUniformBlock, true); ASSERT_EQ(buffer.members.size(), 1); ASSERT_EQ(buffer.members[0].type, igl::UniformType::Float); ASSERT_EQ(buffer.members[0].offset, 0); ASSERT_EQ(buffer.members[0].arrayLength, 1); } else if (buffer.name.toString() == "block_with_instance_name") { ASSERT_EQ(buffer.isUniformBlock, true); ASSERT_EQ(buffer.members.size(), 2); for (const auto& member : buffer.members) { if (member.name.toString() == "view") { ASSERT_EQ(member.type, igl::UniformType::Float3); ASSERT_EQ(member.offset, 0); ASSERT_EQ(member.arrayLength, 1); } else if (member.name.toString() == "testArray") { ASSERT_EQ(member.type, igl::UniformType::Float4); ASSERT_EQ(member.offset, 16); ASSERT_EQ(member.arrayLength, 2); } } } else if (buffer.name.toString() == "non_uniform_block_bool") { ASSERT_EQ(buffer.isUniformBlock, false); ASSERT_EQ(buffer.members.size(), 1); ASSERT_EQ(buffer.members[0].type, igl::UniformType::Boolean); ASSERT_EQ(buffer.members[0].offset, 0); ASSERT_EQ(buffer.members[0].arrayLength, 1); } } } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/RenderStateApplication.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../data/ShaderData.h" #include "../data/VertexIndexData.h" #include "../util/Common.h" #include #include #include #include #include #include namespace igl::tests { #define OFFSCREEN_TEX_WIDTH 2 #define OFFSCREEN_TEX_HEIGHT 2 // // RenderStateApplicationOGLTest // // Tests that render pipeline state settings are correctly applied to OpenGL state. // class RenderStateApplicationOGLTest : public ::testing::Test { public: RenderStateApplicationOGLTest() = default; ~RenderStateApplicationOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); context_ = &static_cast(*iglDev_).getContext(); Result ret; // Create offscreen texture const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); offscreenTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); // Create framebuffer FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = offscreenTexture_; framebuffer_ = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); // Initialize render pass renderPass_.colorAttachments.resize(1); renderPass_.colorAttachments[0].loadAction = LoadAction::Clear; renderPass_.colorAttachments[0].storeAction = StoreAction::Store; renderPass_.colorAttachments[0].clearColor = {0.0, 0.0, 0.0, 1.0}; // Initialize shader stages std::unique_ptr stages; igl::tests::util::createSimpleShaderStages(iglDev_, stages); shaderStages_ = std::move(stages); // Initialize vertex input state VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Float4; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].bufferIndex = data::shader::kSimplePosIndex; inputDesc.attributes[0].name = data::shader::kSimplePos; inputDesc.attributes[0].location = 0; inputDesc.inputBindings[0].stride = sizeof(float) * 4; inputDesc.attributes[1].format = VertexAttributeFormat::Float2; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].bufferIndex = data::shader::kSimpleUvIndex; inputDesc.attributes[1].name = data::shader::kSimpleUv; inputDesc.attributes[1].location = 1; inputDesc.inputBindings[1].stride = sizeof(float) * 2; inputDesc.numAttributes = inputDesc.numInputBindings = 2; vertexInputState_ = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); // Create index buffer BufferDesc ibDesc; ibDesc.type = BufferDesc::BufferTypeBits::Index; ibDesc.data = data::vertex_index::kQuadInd.data(); ibDesc.length = sizeof(data::vertex_index::kQuadInd); ib_ = iglDev_->createBuffer(ibDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); } void TearDown() override {} // Helper to create a pipeline with specific settings, bind it, and do a dummy draw void bindPipelineWithSettings(CullMode cullMode, WindingMode winding, PolygonFillMode fillMode) { RenderPipelineDesc desc; desc.vertexInputState = vertexInputState_; desc.shaderStages = shaderStages_; desc.targetDesc.colorAttachments.resize(1); desc.targetDesc.colorAttachments[0].textureFormat = offscreenTexture_->getFormat(); desc.cullMode = cullMode; desc.frontFaceWinding = winding; desc.polygonFillMode = fillMode; Result ret; auto pipelineState = iglDev_->createRenderPipeline(desc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(pipelineState, nullptr); CommandBufferDesc cbDesc; auto cmdBuf = cmdQueue_->createCommandBuffer(cbDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); auto cmdEncoder = cmdBuf->createRenderCommandEncoder(renderPass_, framebuffer_); cmdEncoder->bindRenderPipelineState(pipelineState); cmdEncoder->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmdEncoder->drawIndexed(0); cmdEncoder->endEncoding(); cmdQueue_->submit(*cmdBuf); } protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; opengl::IContext* context_ = nullptr; RenderPassDesc renderPass_; std::shared_ptr offscreenTexture_; std::shared_ptr framebuffer_; std::shared_ptr shaderStages_; std::shared_ptr vertexInputState_; std::unique_ptr ib_; }; // // CullModeBack // // Verify GL state after binding pipeline with CullMode::Back. // TEST_F(RenderStateApplicationOGLTest, CullModeBack) { bindPipelineWithSettings(CullMode::Back, WindingMode::CounterClockwise, PolygonFillMode::Fill); GLboolean cullEnabled = GL_FALSE; context_->getBooleanv(GL_CULL_FACE, &cullEnabled); ASSERT_EQ(cullEnabled, GL_TRUE); GLint cullFaceMode = 0; context_->getIntegerv(GL_CULL_FACE_MODE, &cullFaceMode); ASSERT_EQ(cullFaceMode, GL_BACK); } // // CullModeFront // // Verify GL state after binding pipeline with CullMode::Front. // TEST_F(RenderStateApplicationOGLTest, CullModeFront) { bindPipelineWithSettings(CullMode::Front, WindingMode::CounterClockwise, PolygonFillMode::Fill); GLboolean cullEnabled = GL_FALSE; context_->getBooleanv(GL_CULL_FACE, &cullEnabled); ASSERT_EQ(cullEnabled, GL_TRUE); GLint cullFaceMode = 0; context_->getIntegerv(GL_CULL_FACE_MODE, &cullFaceMode); ASSERT_EQ(cullFaceMode, GL_FRONT); } // // CullModeDisabled // // Verify GL state after binding pipeline with CullMode::Disabled. // TEST_F(RenderStateApplicationOGLTest, CullModeDisabled) { bindPipelineWithSettings( CullMode::Disabled, WindingMode::CounterClockwise, PolygonFillMode::Fill); GLboolean cullEnabled = GL_TRUE; context_->getBooleanv(GL_CULL_FACE, &cullEnabled); ASSERT_EQ(cullEnabled, GL_FALSE); } // // WindingModeCCW // // Verify CounterClockwise winding mode. // TEST_F(RenderStateApplicationOGLTest, WindingModeCCW) { bindPipelineWithSettings(CullMode::Back, WindingMode::CounterClockwise, PolygonFillMode::Fill); GLint frontFace = 0; context_->getIntegerv(GL_FRONT_FACE, &frontFace); ASSERT_EQ(frontFace, GL_CCW); } // // PolygonFillLine // // Verify PolygonFillMode::Line (only on desktop GL). // TEST_F(RenderStateApplicationOGLTest, PolygonFillLine) { if (!context_->deviceFeatures().hasInternalFeature(opengl::InternalFeatures::PolygonFillMode)) { GTEST_SKIP() << "PolygonFillMode not supported (likely OpenGL ES)"; } bindPipelineWithSettings( CullMode::Disabled, WindingMode::CounterClockwise, PolygonFillMode::Line); #if defined(GL_POLYGON_MODE) GLint polygonMode[2] = {0, 0}; context_->getIntegerv(GL_POLYGON_MODE, polygonMode); ASSERT_EQ(polygonMode[0], GL_LINE); #else // GL_POLYGON_MODE is not available on OpenGL ES; skip the assertion // but validate no GL errors occurred ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); #endif } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/Resource.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "../data/ShaderData.h" #include "../util/Common.h" #include #include #include namespace igl::tests { // // ResourceOGLTest // // Test fixture for all the tests in this file. Takes care of common // initialization and allocating of common resources. // class ResourceOGLTest : public ::testing::Test { public: ResourceOGLTest() = default; ~ResourceOGLTest() override = default; // Set up common resources. This will create a device and a command queue void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); Result ret; // Initialize shader stages std::unique_ptr stages; igl::tests::util::createSimpleShaderStages(iglDev_, stages); shaderStages_ = std::move(stages); // Initialize input to vertex shader VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Float4; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].bufferIndex = data::shader::kSimplePosIndex; inputDesc.attributes[0].name = data::shader::kSimplePos; inputDesc.attributes[0].location = 0; inputDesc.inputBindings[0].stride = sizeof(float) * 4; inputDesc.attributes[1].format = VertexAttributeFormat::Float2; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].bufferIndex = data::shader::kSimpleUvIndex; inputDesc.attributes[1].name = data::shader::kSimpleUv; inputDesc.attributes[1].location = 1; inputDesc.inputBindings[1].stride = sizeof(float) * 2; vertexInputState_ = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vertexInputState_ != nullptr); // Initialize Graphics Pipeline Descriptor, but leave the creation // to the individual tests in case further customization is required renderPipelineDesc_.vertexInputState = vertexInputState_; renderPipelineDesc_.shaderStages = shaderStages_; } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; std::shared_ptr cmdBuf_; std::shared_ptr shaderStages_; std::shared_ptr vertexInputState_; RenderPipelineDesc renderPipelineDesc_; }; // // UniformBuffer Initialize Test // // Tests the initialize() function of igl::opengl::UniformBuffer // Tests normal setup. // Tests a failed setup where the data length is 0. // Tests a failed setup where the data in null. // TEST_F(ResourceOGLTest, UniformBufferInitialize) { // Test dynamic draw setup. char data[100]; BufferDesc desc{ .type = BufferDesc::BufferTypeBits::Uniform, .data = &data, .length = sizeof(data), .storage = ResourceStorage::Shared, }; Result res; auto framebuffer = ResourceOGLTest::iglDev_->createBuffer(desc, &res); ASSERT_EQ(res.code, Result::Code::Ok); ASSERT_EQ(framebuffer->getSizeInBytes(), sizeof(data)); // Test dynamic draw setup. desc = BufferDesc{ .type = BufferDesc::BufferTypeBits::Uniform, .data = &data, .length = 0, .storage = ResourceStorage::Shared, }; framebuffer = ResourceOGLTest::iglDev_->createBuffer(desc, &res); ASSERT_EQ(res.code, Result::Code::ArgumentOutOfRange); ASSERT_EQ(framebuffer->getSizeInBytes(), 0); desc = BufferDesc{ .type = BufferDesc::BufferTypeBits::Uniform, .length = 0, .storage = ResourceStorage::Shared, }; framebuffer = ResourceOGLTest::iglDev_->createBuffer(desc, &res); ASSERT_EQ(res.code, Result::Code::ArgumentNull); ASSERT_EQ(framebuffer->getSizeInBytes(), 0); } // // UniformBuffer Upload Test // // Tests the upload() function of igl::opengl::UniformBuffer // Tests a normal upload of 100 bytes // Tests an upload where the buffer range is too long. // TEST_F(ResourceOGLTest, UniformBufferUpload) { // Test dynamic draw setup. Result res; char data[150]; const BufferDesc desc{ .type = BufferDesc::BufferTypeBits::Uniform, .data = &data, .length = sizeof(data), .storage = ResourceStorage::Shared, }; auto framebuffer = ResourceOGLTest::iglDev_->createBuffer(desc, &res); char newData[100]; // copy newData (100 bytes) into buffer (size 150) starting at offset 30 uintptr_t offset = 30; res = framebuffer->upload(&newData, BufferRange(sizeof(newData), offset)); ASSERT_EQ(res.code, Result::Code::Ok); // try to copy newData (100 bytes) into buffer (size 150) starting at offset 60 offset = 60; res = framebuffer->upload(&newData, BufferRange(sizeof(newData), offset)); ASSERT_EQ(res.code, Result::Code::ArgumentOutOfRange); } // // ArrayBuffer Initialize Test // // Tests the initialize() function of igl::opengl::ArrayBuffer // Exercise all the success and failure paths // Test normal dynamic and static draw setups. // Test failed static draw setup with a nullptr argument. // TEST_F(ResourceOGLTest, ArrayBufferInitialize) { // Test dynamic draw setup. BufferDesc desc{ .type = BufferDesc::BufferTypeBits::Index, .length = 0, .storage = ResourceStorage::Shared, }; Result res; auto framebuffer = ResourceOGLTest::iglDev_->createBuffer(desc, &res); ASSERT_EQ(res.code, Result::Code::Ok); ASSERT_EQ(framebuffer->getSizeInBytes(), 0); // Test static draw setup. char data[100]; desc = BufferDesc{ .type = BufferDesc::BufferTypeBits::Index, .data = &data, .length = 0, .storage = ResourceStorage::Managed, }; framebuffer = ResourceOGLTest::iglDev_->createBuffer(desc, &res); ASSERT_EQ(res.code, Result::Code::Ok); ASSERT_EQ(framebuffer->getSizeInBytes(), 0); // Test static draw setup with null ptr to the data. desc = BufferDesc{ .type = BufferDesc::BufferTypeBits::Index, .length = 0, .storage = ResourceStorage::Managed, }; framebuffer = ResourceOGLTest::iglDev_->createBuffer(desc, &res); ASSERT_EQ(res.code, Result::Code::ArgumentNull); ASSERT_EQ(framebuffer->getSizeInBytes(), 0); } // // ArrayBuffer Upload Test // // Tests the upload() function of igl::opengl::ArrayBuffer // Exercise all the success and failure paths // Test an upload attempt to a ResourceStorage::Managed buffer for failure. // Test a normal upload attempt to a ResourceStorage::Shared buffer. // TEST_F(ResourceOGLTest, ArrayBufferUpload) { // Test dynamic draw upload. char data[100]; BufferDesc desc{ .type = BufferDesc::BufferTypeBits::Index, .data = &data, .length = sizeof(data), .storage = ResourceStorage::Managed, }; Result res; auto framebuffer = ResourceOGLTest::iglDev_->createBuffer(desc, &res); res = framebuffer->upload(&data, BufferRange(sizeof(data), 1)); ASSERT_EQ(res.code, Result::Code::InvalidOperation); // Test normal static draw upload. desc = BufferDesc{ .type = BufferDesc::BufferTypeBits::Index, .length = 0, .storage = ResourceStorage::Shared, }; framebuffer = ResourceOGLTest::iglDev_->createBuffer(desc, &res); res = framebuffer->upload(&data, BufferRange(0L, 0L)); ASSERT_EQ(res.code, Result::Code::Ok); } // // Shader Create Test // // Tests the create() function of igl::opengl::ShaderStages // Exercise the success path // Test the successful linking of a vertex and fragment shader. // TEST_F(ResourceOGLTest, ShaderCreate1) { Result res; std::shared_ptr pipelineState; // success path pipelineState = ResourceOGLTest::iglDev_->createRenderPipeline(renderPipelineDesc_, &res); ASSERT_EQ(res.code, Result::Code::Ok); ASSERT_TRUE(pipelineState != nullptr); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/SRGBWriteControl.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include #include namespace igl::tests { // // SRGBWriteControlOGLTest // // Tests for sRGB write control in OpenGL. // class SRGBWriteControlOGLTest : public ::testing::Test { public: SRGBWriteControlOGLTest() = default; ~SRGBWriteControlOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); context_ = &static_cast(*iglDev_).getContext(); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; opengl::IContext* context_ = nullptr; }; // // SRGBWriteEnableDisable // // Test enabling and disabling sRGB framebuffer write. // TEST_F(SRGBWriteControlOGLTest, SRGBWriteEnableDisable) { if (!iglDev_->hasFeature(DeviceFeatures::SRGBWriteControl)) { GTEST_SKIP() << "sRGB write control not supported"; } // Enable GL_FRAMEBUFFER_SRGB context_->enable(GL_FRAMEBUFFER_SRGB); ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); GLboolean isEnabled = context_->isEnabled(GL_FRAMEBUFFER_SRGB); ASSERT_EQ(isEnabled, GL_TRUE); // Disable GL_FRAMEBUFFER_SRGB context_->disable(GL_FRAMEBUFFER_SRGB); ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); isEnabled = context_->isEnabled(GL_FRAMEBUFFER_SRGB); ASSERT_EQ(isEnabled, GL_FALSE); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/SamplerState.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../util/TestDevice.h" #include #include namespace igl::tests { #ifndef GL_CLAMP_TO_BORDER #define GL_CLAMP_TO_BORDER 0x812D #endif // // SamplerStateOGLTest // // Unit tests for igl::opengl::SamplerState. // class SamplerStateOGLTest : public ::testing::Test { public: // Set up common resources. void SetUp() override { // Turn off debug break so unit tests can run igl::setDebugBreakEnabled(false); device_ = util::createTestDevice(); context_ = &static_cast(*device_).getContext(); ASSERT_TRUE(context_ != nullptr); } protected: std::shared_ptr device_; opengl::IContext* context_{}; }; // // convertGLMinFilter tests // // This tests conversions from glMinFilter to // SamplerMinMagFilter // TEST_F(SamplerStateOGLTest, SamplerStateConvertGLMinFilter) { auto dummySamplerState = std::make_unique(*context_, SamplerStateDesc::newLinear()); ASSERT_EQ(dummySamplerState->convertGLMinFilter(GL_NEAREST), SamplerMinMagFilter::Nearest); ASSERT_EQ(dummySamplerState->convertGLMinFilter(GL_NEAREST_MIPMAP_NEAREST), SamplerMinMagFilter::Nearest); ASSERT_EQ(dummySamplerState->convertGLMinFilter(GL_NEAREST_MIPMAP_LINEAR), SamplerMinMagFilter::Nearest); ASSERT_EQ(dummySamplerState->convertGLMinFilter(GL_LINEAR), SamplerMinMagFilter::Linear); ASSERT_EQ(dummySamplerState->convertGLMinFilter(GL_LINEAR_MIPMAP_NEAREST), SamplerMinMagFilter::Linear); ASSERT_EQ(dummySamplerState->convertGLMinFilter(GL_LINEAR_MIPMAP_LINEAR), SamplerMinMagFilter::Linear); ASSERT_EQ(dummySamplerState->convertGLMinFilter(GL_NONE), SamplerMinMagFilter::Nearest); } // // convertGLMipFilter tests // // This test checks the conversion from OpenGL Mip filter enums to their // corresponding IGL equivalent. // TEST_F(SamplerStateOGLTest, SamplerStateConvertGLMipFilter) { auto dummySamplerState = std::make_unique(*context_, SamplerStateDesc::newLinear()); ASSERT_EQ(dummySamplerState->convertGLMipFilter(GL_NEAREST), SamplerMipFilter::Disabled); ASSERT_EQ(dummySamplerState->convertGLMipFilter(GL_NEAREST_MIPMAP_NEAREST), SamplerMipFilter::Nearest); ASSERT_EQ(dummySamplerState->convertGLMipFilter(GL_NEAREST_MIPMAP_LINEAR), SamplerMipFilter::Linear); ASSERT_EQ(dummySamplerState->convertGLMipFilter(GL_LINEAR), SamplerMipFilter::Disabled); ASSERT_EQ(dummySamplerState->convertGLMipFilter(GL_LINEAR_MIPMAP_NEAREST), SamplerMipFilter::Nearest); ASSERT_EQ(dummySamplerState->convertGLMipFilter(GL_LINEAR_MIPMAP_LINEAR), SamplerMipFilter::Linear); ASSERT_EQ(dummySamplerState->convertGLMipFilter(GL_NONE), SamplerMipFilter::Disabled); } // // convertMinMipFilter tests // // This test checks the conversion from IGL Min/Mip filter enums to their // corresponding OpenGL equivalent. // TEST_F(SamplerStateOGLTest, SamplerStateConvertMinMipFilter) { auto dummySamplerState = std::make_unique(*context_, SamplerStateDesc::newLinear()); ASSERT_EQ(dummySamplerState->convertMinMipFilter(SamplerMinMagFilter::Nearest, SamplerMipFilter::Disabled), GL_NEAREST); ASSERT_EQ(dummySamplerState->convertMinMipFilter(SamplerMinMagFilter::Nearest, SamplerMipFilter::Linear), GL_NEAREST_MIPMAP_LINEAR); ASSERT_EQ(dummySamplerState->convertMinMipFilter(SamplerMinMagFilter::Nearest, SamplerMipFilter::Nearest), GL_NEAREST_MIPMAP_NEAREST); } // // convertGLMagFilter tests // // This test checks the conversion from OpenGL Min/Mag filter enums to their // corresponding IGL equivalent. // TEST_F(SamplerStateOGLTest, SamplerStateConvertGLMagFilter) { auto dummySamplerState = std::make_unique(*context_, SamplerStateDesc::newLinear()); ASSERT_EQ(dummySamplerState->convertGLMagFilter(GL_NEAREST), SamplerMinMagFilter::Nearest); ASSERT_EQ(dummySamplerState->convertGLMagFilter(GL_NEAREST_MIPMAP_NEAREST), SamplerMinMagFilter::Linear); ASSERT_EQ(dummySamplerState->convertGLMagFilter(GL_NEAREST_MIPMAP_LINEAR), SamplerMinMagFilter::Linear); ASSERT_EQ(dummySamplerState->convertGLMagFilter(GL_LINEAR), SamplerMinMagFilter::Linear); ASSERT_EQ(dummySamplerState->convertGLMagFilter(GL_LINEAR_MIPMAP_NEAREST), SamplerMinMagFilter::Linear); ASSERT_EQ(dummySamplerState->convertGLMagFilter(GL_LINEAR_MIPMAP_LINEAR), SamplerMinMagFilter::Linear); ASSERT_EQ(dummySamplerState->convertGLMagFilter(GL_NONE), SamplerMinMagFilter::Linear); } // // convertGLAddressMode tests // // This test checks the conversion from OpenGL Address Mode enums to their // corresponding IGL equivalent. // TEST_F(SamplerStateOGLTest, SamplerStateConvertGLAddressMode) { auto dummySamplerState = std::make_unique(*context_, SamplerStateDesc::newLinear()); ASSERT_EQ(dummySamplerState->convertGLAddressMode(GL_REPEAT), SamplerAddressMode::Repeat); ASSERT_EQ(dummySamplerState->convertGLAddressMode(GL_CLAMP_TO_EDGE), SamplerAddressMode::Clamp); ASSERT_EQ(dummySamplerState->convertGLAddressMode(GL_MIRRORED_REPEAT), SamplerAddressMode::MirrorRepeat); ASSERT_EQ(dummySamplerState->convertGLAddressMode(GL_CLAMP_TO_BORDER), SamplerAddressMode::Repeat); } // // convertAddressMode tests // // This test checks the conversion from IGL Min/Mag filter enums to their // corresponding OpenGL equivalent. // TEST_F(SamplerStateOGLTest, SamplerStateConvertAddressMode) { auto dummySamplerState = std::make_unique(*context_, SamplerStateDesc::newLinear()); ASSERT_EQ(dummySamplerState->convertAddressMode(SamplerAddressMode::Repeat), GL_REPEAT); ASSERT_EQ(dummySamplerState->convertAddressMode(SamplerAddressMode::Clamp), GL_CLAMP_TO_EDGE); ASSERT_EQ(dummySamplerState->convertAddressMode(SamplerAddressMode::MirrorRepeat), GL_MIRRORED_REPEAT); } TEST_F(SamplerStateOGLTest, BindNullTexture) { auto dummySamplerState = std::make_unique(*context_, SamplerStateDesc::newLinear()); dummySamplerState->bind(nullptr); EXPECT_TRUE(true); // Expect no crash } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/SyncObjects.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include #include #include namespace igl::tests { // // SyncObjectsOGLTest // // Tests for OpenGL sync (fence) objects. // class SyncObjectsOGLTest : public ::testing::Test { public: SyncObjectsOGLTest() = default; ~SyncObjectsOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); context_ = &static_cast(*iglDev_).getContext(); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; opengl::IContext* context_ = nullptr; }; // // FenceSyncAndWait // // Create a fence sync object, flush, and query its status. // TEST_F(SyncObjectsOGLTest, FenceSyncAndWait) { if (!context_->deviceFeatures().hasInternalFeature(opengl::InternalFeatures::Sync)) { GTEST_SKIP() << "Sync objects not supported"; } // Create a fence sync GLsync sync = context_->fenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); ASSERT_NE(sync, nullptr); // Flush to ensure the sync is submitted context_->flush(); // Query the sync status GLint syncStatus = GL_UNSIGNALED; GLsizei length = 0; context_->getSynciv(sync, GL_SYNC_STATUS, sizeof(GLint), &length, &syncStatus); // Status should be either signaled or unsignaled (both are valid) ASSERT_TRUE(syncStatus == GL_SIGNALED || syncStatus == GL_UNSIGNALED); // Wait by calling finish which ensures all commands complete context_->finish(); // After finish, query again - should be signaled context_->getSynciv(sync, GL_SYNC_STATUS, sizeof(GLint), &length, &syncStatus); ASSERT_EQ(syncStatus, GL_SIGNALED); // Clean up context_->deleteSync(sync); ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/Texture.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/TestDevice.h" #include #include #include #include namespace igl::tests { // Picking this just to match the texture we will use. If you use a different // size texture, then you will have to either create a new offscreenTexture_ // and the framebuffer object in your test, so know exactly what the end result // would be after sampling #define OFFSCREEN_TEX_WIDTH 2 #define OFFSCREEN_TEX_HEIGHT 2 struct TextureFormatData { GLuint glTexInternalFormat = 0x0000; GLuint glTexFormat = 0x0000; GLuint glTexType = 0x0000; TextureFormat texFormatOutput = TextureFormat::Invalid; }; // // OGLTextureTest // // Unit tests for OGL Texture, TextureTarget, and TextureBuffer. // Covers code paths that may not be hit by top level texture calls from device. // class TextureOGLTest : public ::testing::Test { private: public: TextureOGLTest() = default; ~TextureOGLTest() override = default; void SetUp() override { // Turn off debug break so unit tests can run igl::setDebugBreakEnabled(false); device_ = util::createTestDevice(); context_ = &static_cast(*device_).getContext(); ASSERT_TRUE(context_ != nullptr); } void TearDown() override {} // Member variables protected: opengl::IContext* context_{}; std::shared_ptr device_; }; // // Texture Creation Paths Test // // This tests all failure and success paths during texture creation specific // to the base class igl::opengl::Texture. // TEST_F(TextureOGLTest, TextureCreation) { std::unique_ptr textureTarget; std::unique_ptr textureBuffer; Result ret; TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT, TextureDesc::TextureUsageBits::Storage); { // Storage not supported by OGL Texture via TextureTarget API textureTarget = std::make_unique(*context_, texDesc.format); ret = textureTarget->create(texDesc, false); ASSERT_EQ(ret.code, Result::Code::Unsupported); Result::setOk(&ret); } { // Storage supported by OGL Texture via igl::Device API only if TexStorage is supported. auto texture = device_->createTexture(texDesc, &ret); ASSERT_EQ( ret.isOk(), context_->deviceFeatures().hasInternalFeature(igl::opengl::InternalFeatures::TexStorage)); Result::setOk(&ret); if (context_->deviceFeatures().hasInternalFeature(igl::opengl::InternalFeatures::TexStorage)) { ASSERT_NE(texture, nullptr); } else { ASSERT_EQ(texture, nullptr); } } texDesc.usage = TextureDesc::TextureUsageBits::Sampled; // Sampled and hasStorageAlready not supported in OGL Texture textureBuffer = std::make_unique(*context_, texDesc.format); ret = textureBuffer->create(texDesc, true); ASSERT_EQ(ret.code, Result::Code::Unsupported); // Correct usage of TextureBuffer::create textureBuffer = std::make_unique(*context_, texDesc.format); ret = textureBuffer->create(texDesc, false); ASSERT_EQ(ret.code, Result::Code::Ok); // Cannot create the texture again after it has already been created ret = textureBuffer->create(texDesc, false); ASSERT_EQ(ret.code, Result::Code::InvalidOperation); texDesc.usage = TextureDesc::TextureUsageBits::Attachment; // Correct usage of TextureTarget::create textureTarget = std::make_unique(*context_, texDesc.format); ret = textureTarget->create(texDesc, false); ASSERT_EQ(ret.code, Result::Code::Ok); // Cannot create the texture again after it has already been created ret = textureTarget->create(texDesc, false); ASSERT_EQ(ret.code, Result::Code::InvalidOperation); } // // Supported Texture Formats Test // // Tests expected behavior for IGL supported texture format checks // TEST_F(TextureOGLTest, TextureFormats) { // Set up inputs and expected outputs for Texture::toTextureFormat // {glTexInternalFormat, glTexFormat, glTexType, expected output TextureFormat} const std::vector texFormats{ TextureFormatData{GL_COMPRESSED_RGBA_ASTC_4x4_KHR, 0, 0, TextureFormat::RGBA_ASTC_4x4}, TextureFormatData{ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, 0, 0, TextureFormat::SRGB8_A8_ASTC_4x4}, TextureFormatData{GL_COMPRESSED_RGBA_ASTC_5x4_KHR, 0, 0, TextureFormat::RGBA_ASTC_5x4}, TextureFormatData{ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR, 0, 0, TextureFormat::SRGB8_A8_ASTC_5x4}, TextureFormatData{GL_COMPRESSED_RGBA_ASTC_5x5_KHR, 0, 0, TextureFormat::RGBA_ASTC_5x5}, TextureFormatData{ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, 0, 0, TextureFormat::SRGB8_A8_ASTC_5x5}, TextureFormatData{ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR, 0, 0, TextureFormat::SRGB8_A8_ASTC_6x5}, TextureFormatData{GL_COMPRESSED_RGBA_ASTC_6x6_KHR, 0, 0, TextureFormat::RGBA_ASTC_6x6}, TextureFormatData{ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, 0, 0, TextureFormat::SRGB8_A8_ASTC_6x6}, TextureFormatData{GL_COMPRESSED_RGBA_ASTC_8x5_KHR, 0, 0, TextureFormat::RGBA_ASTC_8x5}, TextureFormatData{ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR, 0, 0, TextureFormat::SRGB8_A8_ASTC_8x5}, TextureFormatData{GL_COMPRESSED_RGBA_ASTC_8x6_KHR, 0, 0, TextureFormat::RGBA_ASTC_8x6}, TextureFormatData{ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, 0, 0, TextureFormat::SRGB8_A8_ASTC_8x6}, TextureFormatData{GL_COMPRESSED_RGBA_ASTC_8x8_KHR, 0, 0, TextureFormat::RGBA_ASTC_8x8}, TextureFormatData{ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR, 0, 0, TextureFormat::SRGB8_A8_ASTC_8x8}, TextureFormatData{GL_COMPRESSED_RGBA_ASTC_10x5_KHR, 0, 0, TextureFormat::RGBA_ASTC_10x5}, TextureFormatData{ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR, 0, 0, TextureFormat::SRGB8_A8_ASTC_10x5}, TextureFormatData{GL_COMPRESSED_RGBA_ASTC_10x6_KHR, 0, 0, TextureFormat::RGBA_ASTC_10x6}, TextureFormatData{ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR, 0, 0, TextureFormat::SRGB8_A8_ASTC_10x6}, TextureFormatData{GL_COMPRESSED_RGBA_ASTC_10x8_KHR, 0, 0, TextureFormat::RGBA_ASTC_10x8}, TextureFormatData{ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, 0, 0, TextureFormat::SRGB8_A8_ASTC_10x8}, TextureFormatData{GL_COMPRESSED_RGBA_ASTC_10x10_KHR, 0, 0, TextureFormat::RGBA_ASTC_10x10}, TextureFormatData{ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, 0, 0, TextureFormat::SRGB8_A8_ASTC_10x10}, TextureFormatData{GL_COMPRESSED_RGBA_ASTC_12x10_KHR, 0, 0, TextureFormat::RGBA_ASTC_12x10}, TextureFormatData{ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, 0, 0, TextureFormat::SRGB8_A8_ASTC_12x10}, TextureFormatData{GL_COMPRESSED_RGBA_ASTC_12x12_KHR, 0, 0, TextureFormat::RGBA_ASTC_12x12}, TextureFormatData{ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, 0, 0, TextureFormat::SRGB8_A8_ASTC_12x12}, TextureFormatData{ GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG, 0, 0, TextureFormat::RGBA_PVRTC_2BPPV1}, TextureFormatData{GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG, 0, 0, TextureFormat::RGB_PVRTC_2BPPV1}, TextureFormatData{ GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG, 0, 0, TextureFormat::RGBA_PVRTC_4BPPV1}, TextureFormatData{GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG, 0, 0, TextureFormat::RGB_PVRTC_4BPPV1}, TextureFormatData{GL_ETC1_RGB8_OES, 0, 0, TextureFormat::RGB8_ETC1}, TextureFormatData{GL_COMPRESSED_RGB8_ETC2, 0, 0, TextureFormat::RGB8_ETC2}, TextureFormatData{GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, 0, 0, TextureFormat::RGB8_Punchthrough_A1_ETC2}, TextureFormatData{GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, TextureFormat::RGBA8_EAC_ETC2}, TextureFormatData{GL_RED, GL_RED, GL_UNSIGNED_BYTE, TextureFormat::R_UNorm8}, TextureFormatData{GL_RED, GL_RED, 0, TextureFormat::Invalid}, TextureFormatData{GL_RG, GL_RG, GL_UNSIGNED_BYTE, TextureFormat::RG_UNorm8}, TextureFormatData{GL_RG, GL_RG, 0, TextureFormat::Invalid}, TextureFormatData{GL_RGB, GL_RGB, GL_UNSIGNED_BYTE, TextureFormat::RGBX_UNorm8}, TextureFormatData{GL_RG, GL_RG, 0, TextureFormat::Invalid}, TextureFormatData{GL_BGR, GL_BGR, GL_UNSIGNED_SHORT_5_6_5, TextureFormat::B5G6R5_UNorm}, TextureFormatData{GL_BGR, GL_BGR, 0, TextureFormat::Invalid}, TextureFormatData{GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, TextureFormat::RGBA_UNorm8}, TextureFormatData{ GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, TextureFormat::RGB10_A2_UNorm_Rev}, TextureFormatData{GL_RGB10_A2UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV, TextureFormat::RGB10_A2_Uint_Rev}, TextureFormatData{GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, TextureFormat::R5G5B5A1_UNorm}, TextureFormatData{GL_RGBA8, 0, 0, TextureFormat::RGBA_UNorm8}, TextureFormatData{GL_RGBA, GL_RG, GL_UNSIGNED_BYTE, TextureFormat::Invalid}, TextureFormatData{GL_BGRA, GL_BGRA, GL_UNSIGNED_BYTE, TextureFormat::BGRA_UNorm8}, TextureFormatData{GL_BGRA, GL_BGRA, GL_UNSIGNED_SHORT_5_5_5_1, TextureFormat::B5G5R5A1_UNorm}, TextureFormatData{GL_BGRA, GL_BGRA, 0, TextureFormat::Invalid}, TextureFormatData{GL_RGBA4, 0, 0, TextureFormat::ABGR_UNorm4}, TextureFormatData{GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, TextureFormat::A_UNorm8}, TextureFormatData{GL_ALPHA, GL_ALPHA, 0, TextureFormat::Invalid}, TextureFormatData{GL_R16F, 0, 0, TextureFormat::R_F16}, TextureFormatData{GL_R16UI, 0, 0, TextureFormat::R_UInt16}, TextureFormatData{GL_R16, 0, 0, TextureFormat::R_UNorm16}, TextureFormatData{GL_R32F, 0, 0, TextureFormat::R_F32}, TextureFormatData{GL_R32UI, 0, 0, TextureFormat::R_UInt32}, TextureFormatData{GL_RG16F, 0, 0, TextureFormat::RG_F16}, TextureFormatData{GL_RG16, 0, 0, TextureFormat::RG_UNorm16}, TextureFormatData{GL_RG16UI, 0, 0, TextureFormat::RG_UInt16}, TextureFormatData{GL_RG32F, 0, 0, TextureFormat::RG_F32}, TextureFormatData{GL_RGB16F, 0, 0, TextureFormat::RGB_F16}, TextureFormatData{GL_RGBA16F, 0, 0, TextureFormat::RGBA_F16}, TextureFormatData{GL_RGB32F, 0, 0, TextureFormat::RGB_F32}, TextureFormatData{GL_RGBA32F, 0, 0, TextureFormat::RGBA_F32}, TextureFormatData{GL_RGBA32UI, 0, 0, TextureFormat::RGBA_UInt32}, TextureFormatData{ GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, TextureFormat::Z_UNorm16}, TextureFormatData{ GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, TextureFormat::Z_UNorm32}, TextureFormatData{GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT, 0, TextureFormat::Invalid}, TextureFormatData{ GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, TextureFormat::Z_UNorm16}, TextureFormatData{GL_DEPTH_COMPONENT16, 0, 0, TextureFormat::Z_UNorm16}, TextureFormatData{ GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, TextureFormat::Z_UNorm24}, TextureFormatData{GL_DEPTH_COMPONENT24, 0, 0, TextureFormat::Z_UNorm24}, TextureFormatData{ GL_DEPTH_COMPONENT32, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, TextureFormat::Z_UNorm32}, TextureFormatData{GL_DEPTH_COMPONENT32, 0, 0, TextureFormat::Z_UNorm32}, TextureFormatData{GL_DEPTH_STENCIL, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, TextureFormat::S8_UInt_Z32_UNorm}, TextureFormatData{GL_DEPTH_STENCIL, GL_DEPTH_STENCIL, 0, TextureFormat::Invalid}, TextureFormatData{GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, TextureFormat::S8_UInt_Z24_UNorm}, TextureFormatData{GL_DEPTH24_STENCIL8, 0, 0, TextureFormat::S8_UInt_Z24_UNorm}, TextureFormatData{ GL_STENCIL_INDEX, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, TextureFormat::S_UInt8}, TextureFormatData{GL_STENCIL_INDEX8, 0, 0, TextureFormat::S_UInt8}, TextureFormatData{GL_STENCIL_INDEX, GL_STENCIL_INDEX, 0, TextureFormat::Invalid}, TextureFormatData{0, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, TextureFormat::Invalid}, }; for (auto data : texFormats) { const TextureFormat output = igl::opengl::Texture::glInternalFormatToTextureFormat( data.glTexInternalFormat, data.glTexFormat, data.glTexType); ASSERT_EQ(output, data.texFormatOutput) << "IGL Format: " << igl::TextureFormatProperties::fromTextureFormat(data.texFormatOutput).name << " internalformat: 0x" << std::hex << data.glTexInternalFormat << " format: 0x" << std::hex << data.glTexFormat << " type: 0x" << std::hex << data.glTexType; } } // // Texture Alignment Test // // This tests that alignment calculations are done correctly. // TEST_F(TextureOGLTest, TextureAlignment) { { constexpr size_t width = 128; constexpr size_t bytesPerPixel = 4; Result ret; const TextureDesc texDesc = TextureDesc::new2D( TextureFormat::RGBA_UNorm8, width, width, TextureDesc::TextureUsageBits::Sampled); auto texture = std::make_unique(*context_, texDesc.format); ret = texture->create(texDesc, false); ASSERT_EQ(texture->getAlignment((width >> 0) * bytesPerPixel), 8); ASSERT_EQ(texture->getAlignment((width >> 0) * bytesPerPixel, 0), 8); ASSERT_EQ(texture->getAlignment((width >> 1) * bytesPerPixel, 1), 8); ASSERT_EQ(texture->getAlignment((width >> 2) * bytesPerPixel, 2), 8); ASSERT_EQ(texture->getAlignment((width >> 3) * bytesPerPixel, 3), 8); ASSERT_EQ(texture->getAlignment((width >> 4) * bytesPerPixel, 4), 8); ASSERT_EQ(texture->getAlignment((width >> 5) * bytesPerPixel, 5), 8); ASSERT_EQ(texture->getAlignment((width >> 6) * bytesPerPixel, 6), 8); ASSERT_EQ(texture->getAlignment((width >> 7) * bytesPerPixel, 7), 4); ASSERT_EQ(texture->getAlignment((width >> 0) * bytesPerPixel, 0, width >> 0), 8); ASSERT_EQ(texture->getAlignment((width >> 1) * bytesPerPixel, 1, width >> 1), 8); ASSERT_EQ(texture->getAlignment((width >> 2) * bytesPerPixel, 2, width >> 2), 8); ASSERT_EQ(texture->getAlignment((width >> 3) * bytesPerPixel, 3, width >> 3), 8); ASSERT_EQ(texture->getAlignment((width >> 4) * bytesPerPixel, 4, width >> 4), 8); ASSERT_EQ(texture->getAlignment((width >> 5) * bytesPerPixel, 5, width >> 5), 8); ASSERT_EQ(texture->getAlignment((width >> 6) * bytesPerPixel, 6, width >> 6), 8); ASSERT_EQ(texture->getAlignment((width >> 7) * bytesPerPixel, 7, width >> 7), 4); ASSERT_EQ(texture->getAlignment((width >> 1) * bytesPerPixel, 0, width >> 1), 8); ASSERT_EQ(texture->getAlignment((width >> 2) * bytesPerPixel, 1, width >> 2), 8); ASSERT_EQ(texture->getAlignment((width >> 3) * bytesPerPixel, 2, width >> 3), 8); ASSERT_EQ(texture->getAlignment((width >> 4) * bytesPerPixel, 3, width >> 4), 8); ASSERT_EQ(texture->getAlignment((width >> 5) * bytesPerPixel, 4, width >> 5), 8); ASSERT_EQ(texture->getAlignment((width >> 6) * bytesPerPixel, 5, width >> 6), 8); ASSERT_EQ(texture->getAlignment((width >> 7) * bytesPerPixel, 6, width >> 7), 4); } { constexpr size_t width = 24; constexpr size_t bytesPerPixel = 4; Result ret; const TextureDesc texDesc = TextureDesc::new2D( TextureFormat::RGBA_UNorm8, width, width, TextureDesc::TextureUsageBits::Sampled); auto texture = std::make_unique(*context_, texDesc.format); ret = texture->create(texDesc, false); ASSERT_EQ(texture->getAlignment((width >> 0) * bytesPerPixel), 8); ASSERT_EQ(texture->getAlignment((width >> 0) * bytesPerPixel, 0), 8); ASSERT_EQ(texture->getAlignment((width >> 1) * bytesPerPixel, 1), 8); ASSERT_EQ(texture->getAlignment((width >> 2) * bytesPerPixel, 2), 8); ASSERT_EQ(texture->getAlignment((width >> 3) * bytesPerPixel, 3), 4); ASSERT_EQ(texture->getAlignment((width >> 4) * bytesPerPixel, 4), 4); ASSERT_EQ(texture->getAlignment((width >> 0) * bytesPerPixel, 0, width >> 0), 8); ASSERT_EQ(texture->getAlignment((width >> 1) * bytesPerPixel, 1, width >> 1), 8); ASSERT_EQ(texture->getAlignment((width >> 2) * bytesPerPixel, 2, width >> 2), 8); ASSERT_EQ(texture->getAlignment((width >> 3) * bytesPerPixel, 3, width >> 3), 4); ASSERT_EQ(texture->getAlignment((width >> 4) * bytesPerPixel, 4, width >> 4), 4); ASSERT_EQ(texture->getAlignment((width >> 1) * bytesPerPixel, 0, width >> 1), 8); ASSERT_EQ(texture->getAlignment((width >> 2) * bytesPerPixel, 1, width >> 2), 8); ASSERT_EQ(texture->getAlignment((width >> 3) * bytesPerPixel, 2, width >> 3), 4); ASSERT_EQ(texture->getAlignment((width >> 4) * bytesPerPixel, 3, width >> 4), 4); } } // // Mipmap Generation Flag Initialization Test // // This tests that the mipmapGeneration_ flag is properly initialized to Manual // TEST_F(TextureOGLTest, MipmapGenerationFlagInitialization) { Result ret; TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT, TextureDesc::TextureUsageBits::Sampled); auto texture = device_->createTexture(texDesc, &ret); ASSERT_TRUE(ret.isOk()); ASSERT_NE(texture, nullptr); // Cast to OpenGL texture to access the getMipmapGeneration method auto* oglTexture = static_cast(texture.get()); ASSERT_NE(oglTexture, nullptr); // Test that the mipmapGeneration flag is initialized to Manual by default ASSERT_EQ(oglTexture->getMipmapGeneration(), TextureDesc::TextureMipmapGeneration::Manual); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/Texture3D.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include #include namespace igl::tests { // // Texture3DOGLTest // // Tests for 3D texture creation and operations in OpenGL. // class Texture3DOGLTest : public ::testing::Test { public: Texture3DOGLTest() = default; ~Texture3DOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); context_ = &static_cast(*iglDev_).getContext(); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; opengl::IContext* context_ = nullptr; }; // // Create3DTexture // // Create a 3D texture and verify it is valid. // TEST_F(Texture3DOGLTest, Create3DTexture) { if (!iglDev_->hasFeature(DeviceFeatures::Texture3D)) { GTEST_SKIP() << "3D textures not supported"; } Result ret; TextureDesc desc = TextureDesc::new3D( TextureFormat::RGBA_UNorm8, 4, 4, 4, TextureDesc::TextureUsageBits::Sampled); auto texture = iglDev_->createTexture(desc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(texture, nullptr); } // // Upload3DData // // Create a 3D texture and upload data to it. // TEST_F(Texture3DOGLTest, Upload3DData) { if (!iglDev_->hasFeature(DeviceFeatures::Texture3D)) { GTEST_SKIP() << "3D textures not supported"; } Result ret; const int width = 2, height = 2, depth = 2; TextureDesc desc = TextureDesc::new3D( TextureFormat::RGBA_UNorm8, width, height, depth, TextureDesc::TextureUsageBits::Sampled); auto texture = iglDev_->createTexture(desc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(texture, nullptr); // Upload data std::vector pixels(width * height * depth, 0xFF00FF00); auto range = TextureRangeDesc::new3D(0, 0, 0, width, height, depth); auto uploadResult = texture->upload(range, pixels.data()); ASSERT_TRUE(uploadResult.isOk()) << uploadResult.message.c_str(); } // // VerifyDimensions // // Verify the dimensions of a created 3D texture. // TEST_F(Texture3DOGLTest, VerifyDimensions) { if (!iglDev_->hasFeature(DeviceFeatures::Texture3D)) { GTEST_SKIP() << "3D textures not supported"; } Result ret; const size_t width = 8, height = 4, depth = 2; TextureDesc desc = TextureDesc::new3D( TextureFormat::RGBA_UNorm8, width, height, depth, TextureDesc::TextureUsageBits::Sampled); auto texture = iglDev_->createTexture(desc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(texture, nullptr); auto dimensions = texture->getDimensions(); ASSERT_EQ(dimensions.width, width); ASSERT_EQ(dimensions.height, height); ASSERT_EQ(dimensions.depth, depth); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/TextureBuffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #include #include namespace igl::tests { // Picking this just to match the texture we will use. If you use a different // size texture, then you will have to either create a new offscreenTexture_ // and the framebuffer object in your test, so know exactly what the end result // would be after sampling #define OFFSCREEN_TEX_WIDTH 2 #define OFFSCREEN_TEX_HEIGHT 2 // Picking this to check mipmap validity, max mipmap level = log(16) - 1 = 3 #define MIPMAP_TEX_WIDTH 16 #define MIPMAP_TEX_HEIGHT 16 struct TextureFormatToGL { TextureFormat texFormatInput = TextureFormat::Invalid; // Expected conversion to GL GLuint glInternalFormat = 0x0000; GLuint glFormat = 0x0000; GLuint glType = 0x0000; }; // // TextureBufferOGLTest // // Unit tests for igl::opengl::TextureBuffer. // Covers code paths that may not be hit by top level texture calls from device. // class TextureBufferOGLTest : public ::testing::Test { private: public: TextureBufferOGLTest() = default; ~TextureBufferOGLTest() override = default; void SetUp() override { // Turn off debug breaks, only use in debug mode igl::setDebugBreakEnabled(false); device_ = util::createTestDevice(); ASSERT_TRUE(device_ != nullptr); context_ = &static_cast(*device_).getContext(); ASSERT_TRUE(context_ != nullptr); } void TearDown() override {} // Member variables protected: opengl::IContext* context_{}; std::shared_ptr device_; }; // // Texture Creation Paths Test // // This tests all failure and success paths for TextureBuffer::create. // Also covers private function createTexture which is called within create. // See tests for Texture.cpp for cases covering cases specific to base class. // TEST_F(TextureBufferOGLTest, TextureCreation) { std::unique_ptr textureBuffer; Result ret; TextureDesc texDesc = TextureDesc::new2D(TextureFormat::ABGR_UNorm4, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT, TextureDesc::TextureUsageBits::Sampled); // Correct usage of TextureBuffer::create textureBuffer = std::make_unique(*context_, texDesc.format); ret = textureBuffer->create(texDesc, false); ASSERT_EQ(ret.code, Result::Code::Ok); // kRenderTarget not supported by TextureBuffer texDesc.usage = TextureDesc::TextureUsageBits::Attachment; textureBuffer = std::make_unique(*context_, texDesc.format); ret = textureBuffer->create(texDesc, false); ASSERT_FALSE(ret.isOk()); texDesc.usage = TextureDesc::TextureUsageBits::Sampled; // Incorrect texture format texDesc.format = TextureFormat::Invalid; textureBuffer = std::make_unique(*context_, texDesc.format); ret = textureBuffer->create(texDesc, false); ASSERT_EQ(ret.code, Result::Code::ArgumentInvalid); } // // TextureBuffer Mipmap generation Test // // Tests expected behavior for Texture mipmap for supported GL formats. // Test paths are tested through TextureBuffer::create // TEST_F(TextureBufferOGLTest, TextureMipmapGen) { std::unique_ptr textureBuffer; Result ret; // Generate mipmap and correct query of initial count TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, MIPMAP_TEX_WIDTH, MIPMAP_TEX_HEIGHT, TextureDesc::TextureUsageBits::Sampled); const size_t maxDim = std::max(texDesc.width, texDesc.height); const int targetlevel = std::floor(log2(maxDim)) + 1; texDesc.numMipLevels = targetlevel; // log(16) + 1 textureBuffer = std::make_unique(*context_, texDesc.format); ret = textureBuffer->create(texDesc, false); ASSERT_EQ(ret.code, Result::Code::Ok); igl::opengl::CommandQueue queue; textureBuffer->generateMipmap(queue); ASSERT_EQ(textureBuffer->getNumMipLevels(), targetlevel); } // // AutoGenerateOnUpload Test // // This test verifies that the AutoGenerateOnUpload flag correctly triggers // mipmap generation when texture data is uploaded. // TEST_F(TextureBufferOGLTest, AutoGenerateMipmapOnUpload) { Result ret; constexpr uint32_t kNumMipLevels = 2u; constexpr uint32_t kTexWidth = 2u; constexpr uint32_t kTexHeight = 2u; constexpr uint32_t kColor = 0xdeadbeef; constexpr std::array kBaseMipData = {kColor, kColor, kColor, kColor}; constexpr std::array kExpectedMip1Data = {kColor}; // Should be same color after // generation // Create texture with AutoGenerateOnUpload flag TextureDesc textureDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kTexWidth, kTexHeight, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); textureDesc.numMipLevels = kNumMipLevels; textureDesc.mipmapGeneration = TextureDesc::TextureMipmapGeneration::AutoGenerateOnUpload; auto texture = device_->createTexture(textureDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(texture, nullptr); auto* oglTexture = static_cast(texture.get()); ASSERT_NE(oglTexture, nullptr); ASSERT_EQ(oglTexture->getMipmapGeneration(), TextureDesc::TextureMipmapGeneration::AutoGenerateOnUpload); ASSERT_EQ(oglTexture->getNumMipLevels(), kNumMipLevels); CommandQueueDesc cmdQueueDesc{}; auto cmdQueue = device_->createCommandQueue(cmdQueueDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(cmdQueue, nullptr); // Upload data to mip level 0 - this should trigger automatic mipmap generation ret = texture->upload(texture->getFullRange(0), kBaseMipData.data()); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); // Validate that mip level 0 contains the uploaded data util::validateUploadedTextureRange(*device_, *cmdQueue, texture, texture->getFullRange(0), kBaseMipData.data(), "AutoGen: Base level (0)"); // Validate that mip level 1 was auto-generated with expected content // The auto-generated mip should contain the same solid color (averaged from base level) util::validateUploadedTextureRange(*device_, *cmdQueue, texture, texture->getFullRange(1), kExpectedMip1Data.data(), "AutoGen: Generated level (1)"); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/TextureBufferBase.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../util/TestDevice.h" #include #include #include #include namespace igl::tests { #ifndef GL_TEXTURE_BINDING_RECTANGLE #define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 #endif // Picking this to check mipmap validity, max mipmap level = log(16) - 1 = 3 #define MIPMAP_TEX_WIDTH_16 16 #define MIPMAP_TEX_HEIGHT_16 16 #define MIPMAP_TEX_WIDTH_1023 1023 #define MIPMAP_TEX_HEIGHT_1023 1023 #define OFFSCREEN_TEX_WIDTH 2 #define OFFSCREEN_TEX_HEIGHT 2 // // TextureBufferBaseOGLTest // // Unit tests for igl::opengl::TextureBufferBase. // Covers code paths that may not be hit by top level texture calls from device. // class TextureBufferBaseOGLTest : public ::testing::Test { private: public: TextureBufferBaseOGLTest() = default; ~TextureBufferBaseOGLTest() override = default; void SetUp() override { // Turn off debug breaks, only use in debug mode igl::setDebugBreakEnabled(false); device_ = util::createTestDevice(); ASSERT_TRUE(device_ != nullptr); context_ = &static_cast(*device_).getContext(); ASSERT_TRUE(context_ != nullptr); } void TearDown() override {} // Member variables protected: opengl::IContext* context_{}; std::shared_ptr device_; }; class TextureBufferBaseMock : public igl::opengl::TextureBufferBase { public: explicit TextureBufferBaseMock(igl::opengl::IContext& context) : igl::opengl::TextureBufferBase(context, TextureFormat::RGBA_UNorm8) {} using igl::opengl::TextureBufferBase::setTextureBufferProperties; using igl::opengl::TextureBufferBase::setUsage; // Used by TextureBufferBase::attachAsColor() [[nodiscard]] uint32_t getSamples() const override { return numSamples; } // NOLINTBEGIN(bugprone-easily-swappable-parameters) bool getFormatDetails(TextureFormat textureFormat, igl::TextureDesc::TextureUsage usage, GLint& internalFormat, GLenum& format, GLenum& type) const { // NOLINTEND(bugprone-easily-swappable-parameters) FormatDescGL formatGL; const auto result = toFormatDescGL(textureFormat, usage, formatGL); internalFormat = formatGL.internalFormat; format = formatGL.format; type = formatGL.type; return result; } uint32_t numSamples = 1; }; // // getType function Tests. // // This tests TextureBufferBase::getType(), // TEST_F(TextureBufferBaseOGLTest, TextureGetType) { std::unique_ptr textureBufferBase; textureBufferBase = std::make_unique(*context_); textureBufferBase->setUsage(TextureDesc::TextureUsageBits::Sampled); textureBufferBase->setTextureBufferProperties(0, GL_TEXTURE_CUBE_MAP); ASSERT_EQ(TextureType::Cube, textureBufferBase->getType()); textureBufferBase->setTextureBufferProperties(0, GL_TEXTURE_2D); ASSERT_EQ(TextureType::TwoD, textureBufferBase->getType()); // Unsupported Type textureBufferBase->setTextureBufferProperties(0, GL_TEXTURE_BINDING_RECTANGLE); ASSERT_EQ(TextureType::Invalid, textureBufferBase->getType()); } // // Bind function Tests. // // This tests TextureBufferBase::bind(), // unbind(), // TEST_F(TextureBufferBaseOGLTest, TextureBindAndUnbind) { std::unique_ptr textureBufferBase; textureBufferBase = std::make_unique(*context_); textureBufferBase->setUsage(TextureDesc::TextureUsageBits::Sampled); GLuint textureID = 0; context_->genTextures(1, &textureID); textureBufferBase->setTextureBufferProperties(textureID, GL_TEXTURE_2D); GLint value = 0; textureBufferBase->bind(); // Get binding and check it is non-zero context_->getIntegerv(GL_TEXTURE_BINDING_2D, &value); ASSERT_EQ(value, textureID); textureBufferBase->unbind(); // Get binding and check it is zero context_->getIntegerv(GL_TEXTURE_BINDING_2D, &value); ASSERT_EQ(value, GL_ZERO); context_->deleteTextures(1, &textureID); } // // Attach function Tests. // // This tests TextureBufferBase::attachAsColor(), // attachAsDepth(), // attachAsStencil(), // TEST_F(TextureBufferBaseOGLTest, TextureAttach) { std::unique_ptr textureBufferBase; textureBufferBase = std::make_unique(*context_); textureBufferBase->setUsage(TextureDesc::TextureUsageBits::Sampled); GLuint textureID = 0; context_->genTextures(1, &textureID); GLuint tmpFb = 0; context_->genFramebuffers(1, &tmpFb); context_->bindFramebuffer(GL_FRAMEBUFFER, tmpFb); GLint type = -1234; // === No target texture, nothing happens === textureBufferBase->attachAsColor(0, opengl::Texture::AttachmentParams{}); context_->getFramebufferAttachmentParameteriv( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &type); ASSERT_EQ(type, GL_NONE); textureBufferBase->attachAsDepth(opengl::Texture::AttachmentParams{}); context_->getFramebufferAttachmentParameteriv( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &type); ASSERT_EQ(type, GL_NONE); textureBufferBase->attachAsStencil(opengl::Texture::AttachmentParams{}); context_->getFramebufferAttachmentParameteriv( GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &type); ASSERT_EQ(type, GL_NONE); // === With target texture === textureBufferBase->setTextureBufferProperties(textureID, GL_TEXTURE_2D); textureBufferBase->bind(); textureBufferBase->attachAsColor(0, opengl::Texture::AttachmentParams{}); context_->getFramebufferAttachmentParameteriv( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &type); ASSERT_EQ(0, context_->getError()); ASSERT_EQ(type, GL_TEXTURE); // Multiple Render Targets if (context_->deviceFeatures().hasFeature(DeviceFeatures::MultipleRenderTargets)) { const GLuint colorAttachment1 = GL_COLOR_ATTACHMENT1; textureBufferBase->attachAsColor(1, opengl::Texture::AttachmentParams{}); context_->getFramebufferAttachmentParameteriv( GL_FRAMEBUFFER, colorAttachment1, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &type); ASSERT_EQ(type, GL_TEXTURE); ASSERT_EQ(0, context_->getError()); } textureBufferBase->attachAsDepth(opengl::Texture::AttachmentParams{}); context_->getFramebufferAttachmentParameteriv( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &type); ASSERT_EQ(0, context_->getError()); ASSERT_EQ(type, GL_TEXTURE); textureBufferBase->attachAsStencil(opengl::Texture::AttachmentParams{}); context_->getFramebufferAttachmentParameteriv( GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &type); ASSERT_EQ(type, GL_TEXTURE); // Must initialize texture for multisample functionality to work GLint internalFormat = 0; GLenum format = 0; GLenum textureType = 0; textureBufferBase->setTextureBufferProperties(textureID, GL_TEXTURE_2D); ASSERT_TRUE(textureBufferBase->getFormatDetails(TextureFormat::RGBA_UNorm8, TextureDesc::TextureUsageBits::Sampled, internalFormat, format, textureType)); context_->texImage2D(GL_TEXTURE_2D, 0, internalFormat, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT, 0, format, textureType, nullptr); textureBufferBase->numSamples = 123; textureBufferBase->attachAsColor(0, opengl::Texture::AttachmentParams{}); context_->getFramebufferAttachmentParameteriv( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &type); ASSERT_EQ(0, context_->getError()); ASSERT_EQ(type, GL_TEXTURE); context_->deleteTextures(1, &textureID); } // // Basic Mipmap level Tests for TextureBufferBase // // This tests TextureBufferBase::generateMipmap(), // getNumMipLevels(), // TEST_F(TextureBufferBaseOGLTest, TextureMipmapGen) { std::unique_ptr textureBufferBase, textureBufferBase2; textureBufferBase = std::make_unique(*context_); textureBufferBase->setUsage(TextureDesc::TextureUsageBits::Sampled); textureBufferBase2 = std::make_unique(*context_); textureBufferBase2->setUsage(TextureDesc::TextureUsageBits::Sampled); GLuint textureIDs[2]; context_->genTextures(2, textureIDs); textureBufferBase->setTextureBufferProperties(textureIDs[0], GL_TEXTURE_2D); textureBufferBase2->setTextureBufferProperties(textureIDs[1], GL_TEXTURE_2D); // Generate mipmap and correct query of initial count TextureDesc texDesc16 = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, MIPMAP_TEX_WIDTH_16, MIPMAP_TEX_HEIGHT_16, TextureDesc::TextureUsageBits::Sampled); TextureDesc texDesc1023 = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, MIPMAP_TEX_WIDTH_1023, MIPMAP_TEX_HEIGHT_1023, TextureDesc::TextureUsageBits::Sampled); // By default numMipLevels = 1, which is the base texture // 16x16 size_t maxDim = std::max(texDesc16.width, texDesc16.height); int targetlevel = std::floor(log2(maxDim)) + 1; texDesc16.numMipLevels = targetlevel; Result ret = textureBufferBase->create(texDesc16, false); ASSERT_EQ(ret.code, Result::Code::Ok); igl::opengl::CommandQueue queue; textureBufferBase->generateMipmap(queue); ASSERT_EQ(textureBufferBase->getNumMipLevels(), targetlevel); // 1023x1023 maxDim = std::max(texDesc1023.width, texDesc1023.height); targetlevel = std::floor(log2(maxDim)) + 1; texDesc1023.numMipLevels = targetlevel; ret = textureBufferBase2->create(texDesc1023, false); ASSERT_EQ(ret.code, Result::Code::Ok); textureBufferBase2->generateMipmap(queue); ASSERT_EQ(textureBufferBase2->getNumMipLevels(), targetlevel); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/TextureTarget.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../util/TestDevice.h" #include #include namespace igl::tests { // Picking this just to match the texture we will use. If you use a different // size texture, then you will have to either create a new offscreenTexture_ // and the framebuffer object in your test, so know exactly what the end result // would be after sampling #define OFFSCREEN_TEX_WIDTH 2 #define OFFSCREEN_TEX_HEIGHT 2 // Picking this to check mipmap validity, max mipmap level = log(16) - 1 = 3 #define MIPMAP_TEX_WIDTH_16 16 #define MIPMAP_TEX_HEIGHT_16 16 #define MIPMAP_TEX_WIDTH_1023 1023 #define MIPMAP_TEX_HEIGHT_1023 1023 // // TextureTargetOGLTest // // Unit tests for igl::opengl::TextureTarget. // Covers code paths that may not be hit by top level texture calls from device. // class TextureTargetOGLTest : public ::testing::Test { private: public: TextureTargetOGLTest() = default; ~TextureTargetOGLTest() override = default; void SetUp() override { // Turn off debug breaks, only use in debug mode igl::setDebugBreakEnabled(false); device_ = util::createTestDevice(); ASSERT_TRUE(device_ != nullptr); context_ = &static_cast(*device_).getContext(); ASSERT_TRUE(context_ != nullptr); } void TearDown() override {} // Member variables protected: opengl::IContext* context_{}; std::shared_ptr device_; }; // // Specifications Test // // This is a sanity test that override specs are defined correctly. // TEST_F(TextureTargetOGLTest, Specifications) { std::unique_ptr textureTarget = std::make_unique(*context_, TextureFormat::RGBA_UNorm8); ASSERT_EQ(textureTarget->getType(), TextureType::TwoD); ASSERT_EQ(textureTarget->getUsage(), TextureDesc::TextureUsageBits::Attachment); } // // Texture Creation Paths Test // // This tests all failure and success paths for TextureTarget::create. // Also covers private functions createRenderBuffer and toRenderBufferFormatGL // which are called within create. // See tests for Texture.cpp for cases covering cases specific to base class. // TEST_F(TextureTargetOGLTest, TextureCreation) { std::shared_ptr textureTarget; Result ret; TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT, TextureDesc::TextureUsageBits::Sampled); // kShaderRead not supported by TextureTarget textureTarget = std::make_unique(*context_, texDesc.format); ret = textureTarget->create(texDesc, false); ASSERT_EQ(ret.code, Result::Code::Unsupported); texDesc.usage = TextureDesc::TextureUsageBits::Attachment; // TextureTarget only supports TwoD textureTarget = std::make_unique(*context_, texDesc.format); texDesc.type = TextureType::ThreeD; ret = textureTarget->create(texDesc, false); ASSERT_EQ(ret.code, Result::Code::Unsupported); // TextureTarget only supports a single mip level textureTarget = std::make_unique(*context_, texDesc.format); texDesc.type = TextureType::TwoD; texDesc.numMipLevels = 2; ret = textureTarget->create(texDesc, false); ASSERT_EQ(ret.code, Result::Code::Unsupported); // TextureTarget only supports a layer textureTarget = std::make_unique(*context_, texDesc.format); texDesc.type = TextureType::TwoD; texDesc.numMipLevels = 1; texDesc.numLayers = 2; ret = textureTarget->create(texDesc, false); ASSERT_EQ(ret.code, Result::Code::Unsupported); // Unsupported texture format texDesc.format = TextureFormat::Invalid; textureTarget = std::make_unique(*context_, texDesc.format); texDesc.numLayers = 1; ret = textureTarget->create(texDesc, false); ASSERT_EQ(ret.code, Result::Code::ArgumentInvalid); // Correct usage of TextureTarget::create with > 1 samples texDesc.format = TextureFormat::RGBA_UNorm8; texDesc.numSamples = 2; textureTarget = std::make_unique(*context_, texDesc.format); ret = textureTarget->create(texDesc, false); ASSERT_EQ(ret.code, Result::Code::Ok); } // // Bind and Attach/Detach function Tests. // // This tests TextureTarget::bind(), // unbind(), // attachAsColor(), // detachAsColor(), // attachAsDepth(), // attachAsStencil() // TEST_F(TextureTargetOGLTest, TextureBindAndAttachAndDetach) { const std::unique_ptr textureTarget; Result ret; const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT, TextureDesc::TextureUsageBits::Attachment); // Create 3 types of targets auto colorTarget = std::make_unique(*context_, texDesc.format); auto depthTarget = std::make_unique(*context_, texDesc.format); auto stencilTarget = std::make_unique(*context_, texDesc.format); // calling create() so that renderBufferID_ is set ret = colorTarget->create(texDesc, false); ASSERT_EQ(ret.code, Result::Code::Ok); ret = depthTarget->create(texDesc, false); ASSERT_EQ(ret.code, Result::Code::Ok); ret = stencilTarget->create(texDesc, false); ASSERT_EQ(ret.code, Result::Code::Ok); // Since the default framebuffer already comes with unattachable color, // depth and stencil, we have to create a new framebuffer before trying // to attach our renderbuffers GLuint tmpFb = 0; context_->genFramebuffers(1, &tmpFb); context_->bindFramebuffer(GL_FRAMEBUFFER, tmpFb); //-------------------------------------------------------------------------- // Test Renderbuffer as Color //-------------------------------------------------------------------------- GLint colorType = -1, colorRid = -1; colorTarget->attachAsColor(0, opengl::Texture::AttachmentParams{}); context_->getFramebufferAttachmentParameteriv( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &colorType); // Check here that colorType is GL_RENDERBUFFER ASSERT_EQ(colorType, GL_RENDERBUFFER); context_->getFramebufferAttachmentParameteriv( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &colorRid); // Check here that colorRid is anything other than -1 ASSERT_NE(colorRid, -1); colorTarget->detachAsColor(0, false); // Nothing to test //-------------------------------------------------------------------------- // Test Renderbuffer as Depth //-------------------------------------------------------------------------- GLint depthType = -1, depthRid = -1; depthTarget->attachAsDepth(opengl::Texture::AttachmentParams{}); context_->getFramebufferAttachmentParameteriv( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &depthType); // Check here that depthType is GL_RENDERBUFFER ASSERT_EQ(depthType, GL_RENDERBUFFER); context_->getFramebufferAttachmentParameteriv( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &depthRid); // Check here that depthRid != -1 and depthRid != colorRid ASSERT_NE(depthRid, -1); ASSERT_NE(depthRid, colorRid); //-------------------------------------------------------------------------- // Test Renderbuffer as Stencil //-------------------------------------------------------------------------- GLint stencilType = -1, stencilRid = -1; stencilTarget->attachAsStencil(opengl::Texture::AttachmentParams{}); context_->getFramebufferAttachmentParameteriv( GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &stencilType); // Check here that stencilType is GL_RENDERBUFFER ASSERT_EQ(stencilType, GL_RENDERBUFFER); context_->getFramebufferAttachmentParameteriv( GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &stencilRid); // Check here that stencilRid != -1 and stencilRid != colorRid and stencilRid != depthRid ASSERT_NE(stencilRid, -1); ASSERT_NE(stencilRid, colorRid); ASSERT_NE(stencilRid, depthRid); //-------------------------------------------------------------------------- // Test bind and unbind //-------------------------------------------------------------------------- GLint value = 0; colorTarget->bind(); // Get renderBuffer binding and check it is non-zero context_->getIntegerv(GL_RENDERBUFFER_BINDING, &value); ASSERT_NE(value, GL_ZERO); colorTarget->unbind(); // Get renderBuffer binding and check it is zero context_->getIntegerv(GL_RENDERBUFFER_BINDING, &value); ASSERT_EQ(value, GL_ZERO); depthTarget->bind(); // Get renderBuffer binding and check it is non-zero context_->getIntegerv(GL_RENDERBUFFER_BINDING, &value); ASSERT_NE(value, GL_ZERO); depthTarget->unbind(); // Get renderBuffer binding and check it is zero context_->getIntegerv(GL_RENDERBUFFER_BINDING, &value); ASSERT_EQ(value, GL_ZERO); stencilTarget->bind(); // Get renderBuffer binding and check it is non-zero context_->getIntegerv(GL_RENDERBUFFER_BINDING, &value); ASSERT_NE(value, GL_ZERO); stencilTarget->unbind(); // Get renderBuffer binding and check it is zero context_->getIntegerv(GL_RENDERBUFFER_BINDING, &value); ASSERT_EQ(value, GL_ZERO); } TEST_F(TextureTargetOGLTest, CreateWithDebugName) { const std::unique_ptr textureTarget; Result ret; TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT, TextureDesc::TextureUsageBits::Attachment); texDesc.debugName = "test"; // Create 3 types of targets auto target = std::make_unique(*context_, texDesc.format); // calling create() so that renderBufferID_ is set ret = target->create(texDesc, false); ASSERT_EQ(ret.code, Result::Code::Ok); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/Timer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../util/Common.h" #include #include namespace igl::tests { // // TimerOGLTest // // Tests for the OpenGL Timer. // class TimerOGLTest : public ::testing::Test { public: TimerOGLTest() = default; ~TimerOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); context_ = &static_cast(*iglDev_).getContext(); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; opengl::IContext* context_ = nullptr; }; // // BasicTimerQuery // // Create a timer, end it, and check that resultsAvailable can be queried. // TEST_F(TimerOGLTest, BasicTimerQuery) { if (!iglDev_->hasFeature(DeviceFeatures::Timers)) { GTEST_SKIP() << "Timer queries not supported"; } Result ret; auto timer = iglDev_->createTimer(&ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(timer, nullptr); // Cast to opengl::Timer and test the end method auto* oglTimer = static_cast(timer.get()); ASSERT_NE(oglTimer, nullptr); // End the timer query oglTimer->end(); // Check for GL errors ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); // resultsAvailable() should be callable without crashing // Results may or may not be available immediately const bool available = oglTimer->resultsAvailable(); // We don't assert on the value, just that calling it doesn't crash or error (void)available; // If results are available, getElapsedTimeNanos should return a value if (available) { const uint64_t elapsed = oglTimer->getElapsedTimeNanos(); // Elapsed time should be non-negative (it's uint64_t so always >= 0) (void)elapsed; } } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/UniformAdapter.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../util/Common.h" #include #include #include namespace igl::tests { #define OFFSCREEN_TEX_WIDTH 2 #define OFFSCREEN_TEX_HEIGHT 2 // // UniformAdapterOGLTest // // Tests for the OpenGL UniformAdapter. // class UniformAdapterOGLTest : public ::testing::Test { public: UniformAdapterOGLTest() = default; ~UniformAdapterOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); context_ = &static_cast(*iglDev_).getContext(); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; opengl::IContext* context_ = nullptr; }; // // SetUniform // // Store uniform data in the adapter. // TEST_F(UniformAdapterOGLTest, SetUniform) { opengl::UniformAdapter adapter(*context_, opengl::UniformAdapter::PipelineType::Render); // Create a uniform descriptor for a float uniform UniformDesc desc; desc.location = 0; desc.type = UniformType::Float; desc.numElements = 1; float value = 42.0f; Result ret; adapter.setUniform(desc, &value, &ret); // setUniform should succeed ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); } // // ClearUniformBuffers // // Verify clearUniformBuffers resets the adapter state. // TEST_F(UniformAdapterOGLTest, ClearUniformBuffers) { opengl::UniformAdapter adapter(*context_, opengl::UniformAdapter::PipelineType::Render); // Set a uniform UniformDesc desc; desc.location = 0; desc.type = UniformType::Float; desc.numElements = 1; float value = 1.0f; Result ret; adapter.setUniform(desc, &value, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); // Clear and verify no crash adapter.clearUniformBuffers(); // Set again after clear should also work adapter.setUniform(desc, &value, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/UniformBlockBuffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include #include #include namespace igl::tests { // // UniformBlockBufferOGLTest // // Tests for uniform block buffer binding in OpenGL. // class UniformBlockBufferOGLTest : public ::testing::Test { public: UniformBlockBufferOGLTest() = default; ~UniformBlockBufferOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); context_ = &static_cast(*iglDev_).getContext(); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; opengl::IContext* context_ = nullptr; }; // // SetBlockBinding // // Create a buffer with uniform block data and verify binding does not cause errors. // TEST_F(UniformBlockBufferOGLTest, SetBlockBinding) { if (!iglDev_->hasFeature(DeviceFeatures::UniformBlocks)) { GTEST_SKIP() << "Uniform blocks not supported"; } Result ret; // Create a uniform buffer const float uniformData[4] = {1.0f, 0.0f, 0.0f, 0.0f}; BufferDesc bufDesc; bufDesc.type = BufferDesc::BufferTypeBits::Uniform; bufDesc.data = uniformData; bufDesc.length = sizeof(uniformData); auto uniformBuffer = iglDev_->createBuffer(bufDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(uniformBuffer, nullptr); ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); } // // BindBase // // Bind a uniform buffer to a binding point using bindBufferBase. // TEST_F(UniformBlockBufferOGLTest, BindBase) { if (!iglDev_->hasFeature(DeviceFeatures::UniformBlocks)) { GTEST_SKIP() << "Uniform blocks not supported"; } Result ret; const float uniformData[4] = {1.0f, 2.0f, 3.0f, 4.0f}; BufferDesc bufDesc; bufDesc.type = BufferDesc::BufferTypeBits::Uniform; bufDesc.data = uniformData; bufDesc.length = sizeof(uniformData); auto uniformBuffer = iglDev_->createBuffer(bufDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(uniformBuffer, nullptr); // Verify buffer creation and data upload produced no GL errors ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); } // // BindRange // // Bind a sub-range of a uniform buffer to a binding point. // TEST_F(UniformBlockBufferOGLTest, BindRange) { if (!iglDev_->hasFeature(DeviceFeatures::UniformBlocks)) { GTEST_SKIP() << "Uniform blocks not supported"; } Result ret; // Create a larger uniform buffer const float uniformData[16] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f}; BufferDesc bufDesc; bufDesc.type = BufferDesc::BufferTypeBits::Uniform; bufDesc.data = uniformData; bufDesc.length = sizeof(uniformData); auto uniformBuffer = iglDev_->createBuffer(bufDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(uniformBuffer, nullptr); ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/UniformBuffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../data/ShaderData.h" #include "../data/TextureData.h" #include "../data/VertexIndexData.h" #include "../util/Common.h" #include #include #include #include #include #include #include #include #include // to not use extra curly braces in initializer lists // This is needed to get tests working on Android #ifdef __clang__ #pragma clang diagnostic ignored "-Wmissing-braces" #endif namespace igl::tests { // Use a 4x4 texture for this test constexpr size_t kOffscreenTexWidth = 4; constexpr size_t kOffscreenTexHeight = 4; #if IGL_OPENGL_ES #define FLOATING_POINT_TOLERANCE 0.0001 #else #define FLOATING_POINT_TOLERANCE 0.00001 #endif // clang-format off #if !defined(OGL_UNIFORM_BUFFER_FRAG_COMMON) #define OGL_UNIFORM_BUFFER_FRAG_COMMON \ LEGACY_VERSION PROLOG \ const float expectedFloat = 0.1; \ const vec2 expectedVec2 = vec2(0.2, 0.2); \ const vec3 expectedVec3 = vec3(0.3, 0.3, 0.3); \ const vec4 expectedVec4 = vec4(0.4, 0.4, 0.4, 0.4); \ const int expectedInt = 42; \ const ivec2 expectediVec2 = ivec2(2, 2); \ const ivec3 expectediVec3 = ivec3(3, 3, 3); \ const ivec4 expectediVec4 = ivec4(4, 4, 4, 4); \ const mat2 expectedMat2 = mat2(1.0, 2.0, 3.0, 4.0); \ const mat3 expectedMat3 = mat3(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0); \ const mat4 expectedMat4 = mat4(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0); \ const vec4 failureColor = vec4(0.0, 0.0, 0.0, 1.0); \ bool isEqual(float refVal, float val) { \ return abs(refVal - val) < FLOATING_POINT_TOLERANCE; \ } \ bool isEqual(vec2 vecA, vec2 vecB) { \ bool equal = true; \ for (int i = 0; i < 2; i++) { \ if (!isEqual(vecA[i], vecB[i])) { \ equal = false; \ } \ } \ return equal; \ } \ bool isEqual(vec3 vecA, vec3 vecB) { \ bool equal = true; \ for (int i = 0; i < 3; i++) { \ if (!isEqual(vecA[i], vecB[i])) { \ equal = false; \ } \ } \ return equal; \ } \ bool isEqual(vec4 vecA, vec4 vecB) { \ bool equal = true; \ for (int i = 0; i < 4; i++) { \ if (!isEqual(vecA[i], vecB[i])) { \ equal = false; \ } \ } \ return equal; \ } \ bool isEqual(mat3 matA, mat3 matB) { \ bool equal = true; \ for (int i = 0; i < 3; i++) { \ for (int j = 0; j < 3; j++) { \ if (!isEqual(matA[i][j], matB[i][j])) { \ equal = false; \ } \ } \ } \ return equal; \ } \ bool isEqual(mat4 matA, mat4 matB) { \ bool equal = true; \ for (int i = 0; i < 4; i++) { \ for (int j = 0; j < 4; j++) { \ if (!isEqual(matA[i][j], matB[i][j])) { \ equal = false; \ } \ } \ } \ return equal; \ } #endif // Uniform Buffer Testing Shader const char kOglUniformBufferFragShader[] = IGL_TO_STRING(OGL_UNIFORM_BUFFER_FRAG_COMMON uniform float testFloat; uniform vec2 testVec2; uniform vec3 testVec3; uniform vec4 testVec4; uniform bool testBool; uniform int testInt; uniform ivec2 testiVec2; uniform ivec3 testiVec3; uniform ivec4 testiVec4; uniform mat2 testMat2; uniform mat3 testMat3; uniform mat4 testMat4; uniform vec4 backgroundColor; uniform float unsetFloat; uniform bool unsetBool; uniform int unsetInt; uniform sampler2D inputImage; varying vec2 uv; void main() { gl_FragColor = texture2D(inputImage, uv); if (uv.y < 0.25) { if (uv.x < 0.25) { if(!isEqual(testFloat, expectedFloat)) { gl_FragColor = failureColor; } } else if (uv.x < 0.5) { if (!isEqual(testVec2, expectedVec2)) { gl_FragColor = failureColor; } } else if (uv.x < 0.75) { if (!isEqual(testVec3, expectedVec3)) { gl_FragColor = failureColor; } } else if (uv.x < 1.0) { if (!isEqual(testVec4, expectedVec4)) { gl_FragColor = failureColor; } } else { gl_FragColor = backgroundColor; } } else if (uv.y < 0.5) { if (uv.x < 0.25) { if (!testBool) { gl_FragColor = failureColor; } } else if (uv.x < 0.5) { if (testInt != expectedInt) { gl_FragColor = failureColor; } } else if (uv.x < 0.75) { if (testiVec2 != expectediVec2) { gl_FragColor = failureColor; } } else if (uv.x < 1.0) { if (testiVec3 != expectediVec3) { gl_FragColor = failureColor; } } else { gl_FragColor = backgroundColor; } } else if (uv.y < 0.75) { if (uv.x < 0.25) { if (testiVec4 != expectediVec4) { gl_FragColor = failureColor; } } else if (uv.x < 0.5) { if (testMat2 != expectedMat2) { gl_FragColor = failureColor; } } else if (uv.x < 0.75) { if (!isEqual(testMat3, expectedMat3)) { gl_FragColor = failureColor; } } else if (uv.x < 1.0) { if (!isEqual(testMat4, expectedMat4)) { gl_FragColor = failureColor; } } else { gl_FragColor = backgroundColor; } } else { if (uv.x < 0.25) { if(!isEqual(unsetFloat, expectedFloat)) { gl_FragColor = failureColor; } } else if (uv.x < 0.5) { if (!unsetBool) { gl_FragColor = failureColor; } } else if (uv.x < 0.75) { if (unsetInt != expectedInt) { gl_FragColor = failureColor; } } else { gl_FragColor = failureColor; } } }); // Uniform Array Testing Shader const char kOglUniformArrayFragShader[] = IGL_TO_STRING(OGL_UNIFORM_BUFFER_FRAG_COMMON uniform float testFloat[3]; uniform vec2 testVec2[3]; uniform vec3 testVec3[3]; uniform vec4 testVec4[3]; uniform bool testBool[3]; uniform int testInt[3]; uniform ivec2 testiVec2[3]; uniform ivec3 testiVec3[3]; uniform ivec4 testiVec4[3]; uniform mat2 testMat2[3]; uniform mat3 testMat3[3]; uniform mat4 testMat4[3]; uniform vec4 backgroundColor; uniform float unsetFloat[3]; uniform bool unsetBool[3]; uniform int unsetInt[3]; uniform sampler2D inputImage; varying vec2 uv; void main() { gl_FragColor = texture2D(inputImage, uv); if (uv.y < 0.25) { if (uv.x < 0.25) { if(!isEqual(testFloat[1], expectedFloat)) { gl_FragColor = failureColor; } } else if (uv.x < 0.5) { if (!isEqual(testVec2[1], expectedVec2)) { gl_FragColor = failureColor; } } else if (uv.x < 0.75) { if (!isEqual(testVec3[1], expectedVec3)) { gl_FragColor = failureColor; } } else if (uv.x < 1.0) { if (!isEqual(testVec4[1], expectedVec4)) { gl_FragColor = failureColor; } } else { gl_FragColor = backgroundColor; } } else if (uv.y < 0.5) { if (uv.x < 0.25) { if (!testBool[1]) { gl_FragColor = failureColor; } } else if (uv.x < 0.5) { if (testInt[1] != expectedInt) { gl_FragColor = failureColor; } } else if (uv.x < 0.75) { if (testiVec2[1] != expectediVec2) { gl_FragColor = failureColor; } } else if (uv.x < 1.0) { if (testiVec3[1] != expectediVec3) { gl_FragColor = failureColor; } } else { gl_FragColor = backgroundColor; } } else if (uv.y < 0.75) { if (uv.x < 0.25) { if (testiVec4[1]!= expectediVec4) { gl_FragColor = failureColor; } } else if (uv.x < 0.5) { if (testMat2[1] != expectedMat2) { gl_FragColor = failureColor; } } else if (uv.x < 0.75) { if (!isEqual(testMat3[1], expectedMat3)) { gl_FragColor = failureColor; } } else if (uv.x < 1.0) { if (!isEqual(testMat4[1], expectedMat4)) { gl_FragColor = failureColor; } } else { gl_FragColor = backgroundColor; } } else { if (uv.x < 0.25) { if(!isEqual(unsetFloat[1], expectedFloat)) { gl_FragColor = failureColor; } } else if (uv.x < 0.5) { if (!unsetBool[1]) { gl_FragColor = failureColor; } } else if (uv.x < 0.75) { if (unsetInt[1] != expectedInt) { gl_FragColor = failureColor; } } else { gl_FragColor = failureColor; } } }); // clang-format on // // UniformBufferTest // // Test fixture for all the tests in this file. Takes care of common // initialization and allocating of common resources. // class UniformBufferTest : public ::testing::Test { private: public: UniformBufferTest() = default; ~UniformBufferTest() override = default; // // SetUp() // // This function sets up a render pass and a render pipeline descriptor // so it is ready to render a simple quad with an input texture to an // offscreen texture. // // The actual creation of the render pipeline state object is left // to each test so that tests can replace the default settings with // something more appropriate. // void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_TRUE(iglDev_ != nullptr); ASSERT_TRUE(cmdQueue_ != nullptr); // Create an offscreen texture to render to TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kOffscreenTexWidth, kOffscreenTexHeight, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); Result ret; offscreenTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(offscreenTexture_ != nullptr); // Create input texture texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kOffscreenTexWidth, kOffscreenTexHeight, TextureDesc::TextureUsageBits::Sampled); inputTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(inputTexture_ != nullptr); // Create framebuffer using the offscreen texture FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = offscreenTexture_; framebuffer_ = iglDev_->createFramebuffer(framebufferDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(framebuffer_ != nullptr); // Initialize render pass descriptor renderPass_.colorAttachments.resize(1); renderPass_.colorAttachments[0].loadAction = LoadAction::Clear; renderPass_.colorAttachments[0].storeAction = StoreAction::Store; renderPass_.colorAttachments[0].clearColor = {0.0, 0.0, 0.0, 1.0}; // Initialize input to vertex shader VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Float4; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].bufferIndex = data::shader::kSimplePosIndex; inputDesc.attributes[0].name = data::shader::kSimplePos; inputDesc.attributes[0].location = 0; inputDesc.inputBindings[0].stride = sizeof(float) * 4; inputDesc.attributes[1].format = VertexAttributeFormat::Float2; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].bufferIndex = data::shader::kSimpleUvIndex; inputDesc.attributes[1].name = data::shader::kSimpleUv; inputDesc.attributes[1].location = 1; inputDesc.inputBindings[1].stride = sizeof(float) * 2; // numAttributes has to equal to bindings when using more than 1 buffer inputDesc.numAttributes = inputDesc.numInputBindings = 2; vertexInputState_ = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(vertexInputState_ != nullptr); // Initialize index buffer BufferDesc bufDesc; bufDesc.type = BufferDesc::BufferTypeBits::Index; bufDesc.data = data::vertex_index::kQuadInd.data(); bufDesc.length = sizeof(data::vertex_index::kQuadInd); ib_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(ib_ != nullptr); // Initialize vertex and sampler buffers bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data::vertex_index::kQuadVert.data(); bufDesc.length = sizeof(data::vertex_index::kQuadVert); vb_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(vb_ != nullptr); bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data::vertex_index::kQuadUv.data(); bufDesc.length = sizeof(data::vertex_index::kQuadUv); uv_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(uv_ != nullptr); // Initialize sampler state const SamplerStateDesc samplerDesc; samp_ = iglDev_->createSamplerState(samplerDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(samp_ != nullptr); // Initialize Render Pipeline Descriptor, but leave the creation // to the individual tests in case further customization is required renderPipelineDesc_.vertexInputState = vertexInputState_; renderPipelineDesc_.targetDesc.colorAttachments.resize(1); renderPipelineDesc_.targetDesc.colorAttachments[0].textureFormat = offscreenTexture_->getFormat(); renderPipelineDesc_.fragmentUnitSamplerMap[textureUnit_] = IGL_NAMEHANDLE(data::shader::kSimpleSampler); renderPipelineDesc_.cullMode = igl::CullMode::Disabled; } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; std::shared_ptr cmdBuf_; CommandBufferDesc cbDesc_ = {}; RenderPassDesc renderPass_; std::shared_ptr offscreenTexture_; std::shared_ptr inputTexture_; std::shared_ptr framebuffer_; std::shared_ptr shaderStages_; std::shared_ptr vertexInputState_; std::shared_ptr vb_, uv_, ib_; std::shared_ptr fragmentParamBuffer_; std::shared_ptr samp_; RenderPipelineDesc renderPipelineDesc_; size_t textureUnit_ = 0; size_t uniformTypesCount_ = 12; size_t failureCasesCount_ = 3; }; // // UniformBuffer uniform binding test // // This test exercises the uniform buffer binding behavior. // The custom fragment shader will only show the original input texture when each and all of the // uniform types are binded properly // TEST_F(UniformBufferTest, UniformBufferBinding) { Result ret; std::shared_ptr pipelineState; const simd::float4 clearColor = {0.0, 0.0, 1.0, 1.0}; const auto rangeDesc = TextureRangeDesc::new2D(0, 0, kOffscreenTexWidth, kOffscreenTexHeight); struct FragmentParameters { simd::float1 testFloat{}; simd::float2 testVec2{}; simd::float3 testVec3{}; simd::float4 testVec4{}; bool testBool{}; simd::int1 testInt{}; simd::int2 testiVec2{}; simd::int3 testiVec3{}; simd::int4 testiVec4{}; simd::float2x2 testMat2{}; simd::float3x3 testMat3{}; simd::float4x4 testMat4{}; simd::float4 backgroundColor{}; simd::float1 unsetFloat{}; bool unsetBool{}; simd::int1 unsetInt{}; } fragmentParameters; //------------------------------------- // Upload the texture //------------------------------------- inputTexture_->upload(rangeDesc, data::texture::kTexRgbaMisc1_4x4.data()); //---------------- // Create Shaders //---------------- // Initialize shader stages std::unique_ptr stages; igl::tests::util::createShaderStages(iglDev_, data::shader::kOglSimpleVertShader, data::shader::kSimpleVertFunc, kOglUniformBufferFragShader, data::shader::kSimpleFragFunc, stages); shaderStages_ = std::move(stages); renderPipelineDesc_.shaderStages = shaderStages_; //---------------- // Create Pipeline //---------------- pipelineState = iglDev_->createRenderPipeline(renderPipelineDesc_, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(pipelineState != nullptr); //------------------------------------- // Create Uniforms Buffer //------------------------------------- // Make sure there are more texture pixels than our test cases ASSERT_TRUE(uniformTypesCount_ + failureCasesCount_ <= kOffscreenTexWidth * kOffscreenTexHeight); BufferDesc fpDesc; fpDesc.type = BufferDesc::BufferTypeBits::Uniform; fpDesc.data = &fragmentParameters; fpDesc.length = sizeof(fragmentParameters); fpDesc.storage = ResourceStorage::Shared; std::vector fragmentUniformDescriptors; // "testFloat" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(IGL_NAMEHANDLE("testFloat"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().type = UniformType::Float; fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, testFloat); fragmentParameters.testFloat = {0.1f}; // "testVec2" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(igl::genNameHandle("testVec2"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().type = UniformType::Float2; fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, testVec2); fragmentParameters.testVec2 = {0.2f, 0.2f}; // "testVec3" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(igl::genNameHandle("testVec3"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().type = UniformType::Float3; fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, testVec3); fragmentParameters.testVec3 = {0.3f, 0.3f, 0.3f}; // "testVec4" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(igl::genNameHandle("testVec4"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().type = UniformType::Float4; fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, testVec4); fragmentParameters.testVec4 = {0.4f, 0.4f, 0.4f, 0.4f}; // "testBool" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(igl::genNameHandle("testBool"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().type = UniformType::Boolean; fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, testBool); fragmentParameters.testBool = true; // "testInt" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(igl::genNameHandle("testInt"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().type = UniformType::Int; fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, testInt); fragmentParameters.testInt = {42}; // "testiVec2" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(igl::genNameHandle("testiVec2"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().type = UniformType::Int2; fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, testiVec2); fragmentParameters.testiVec2 = {2, 2}; // "testiVec3" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(igl::genNameHandle("testiVec3"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().type = UniformType::Int3; fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, testiVec3); fragmentParameters.testiVec3 = {3, 3, 3}; // "testiVec4" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(igl::genNameHandle("testiVec4"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().type = UniformType::Int4; fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, testiVec4); fragmentParameters.testiVec4 = {4, 4, 4, 4}; // "testMat2" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(igl::genNameHandle("testMat2"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().type = UniformType::Mat2x2; fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, testMat2); simd::float2 firstCol2 = {1.0, 2.0}, secondCol2 = {3.0, 4.0}; fragmentParameters.testMat2 = {firstCol2, secondCol2}; // "testMat3" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(igl::genNameHandle("testMat3"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().type = UniformType::Mat3x3; fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, testMat3); fragmentUniformDescriptors.back().elementStride = sizeof(simd::float3x3); simd::float3 firstCol3 = {1.0, 2.0, 3.0}, secondCol3 = {4.0, 5.0, 6.0}, thirdCol3 = {7.0, 8.0, 9.0}; fragmentParameters.testMat3 = {firstCol3, secondCol3, thirdCol3}; // "testMat4" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(igl::genNameHandle("testMat4"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().type = UniformType::Mat4x4; fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, testMat4); simd::float4 firstCol4 = {1.0, 2.0, 3.0, 4.0}, secondCol4 = {5.0, 6.0, 7.0, 8.0}, thirdCol4 = {9.0, 10.0, 11.0, 12.0}, fourthCol4 = {13.0, 14.0, 15.0, 16.0}; fragmentParameters.testMat4 = {firstCol4, secondCol4, thirdCol4, fourthCol4}; // "backgroundColor" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().location = pipelineState->getIndexByName( igl::genNameHandle("backgroundColor"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().type = UniformType::Float4; fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, backgroundColor); fragmentParameters.backgroundColor = clearColor; // "unsetFloat1" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(igl::genNameHandle("unsetFloat1"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().type = UniformType::Float; fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, unsetFloat); fragmentParameters.unsetFloat = {0.1f}; // "unsetBool1" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(igl::genNameHandle("unsetBool1"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().type = UniformType::Boolean; fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, unsetBool); fragmentParameters.unsetBool = true; // "unsetInt1" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(igl::genNameHandle("unsetInt1"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().type = UniformType::Int; fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, unsetInt); fragmentParameters.unsetInt = {42}; fragmentParamBuffer_ = iglDev_->createBuffer(fpDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(fragmentParamBuffer_ != nullptr); cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(cmdBuf_ != nullptr); std::shared_ptr cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, framebuffer_); cmds->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmds->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); cmds->bindRenderPipelineState(pipelineState); cmds->bindTexture(textureUnit_, BindTarget::kFragment, inputTexture_.get()); cmds->bindSamplerState(textureUnit_, BindTarget::kFragment, samp_.get()); cmds->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmds->drawIndexed(6); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); //---------------------- // Read back framebuffer //---------------------- auto pixels = std::vector(kOffscreenTexWidth * kOffscreenTexHeight); framebuffer_->copyBytesColorAttachment(*cmdQueue_, 0, pixels.data(), rangeDesc); //-------------------------------- // Verify against original texture // Pixels are supposed to be 0xFF000000 since the uniform buffer is not bound //-------------------------------- for (size_t i = 0; i < kOffscreenTexWidth * kOffscreenTexHeight; i++) { ASSERT_EQ(pixels[i], 0xFF000000); } //---------------- // Bind the uniform buffer //---------------- cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(cmdBuf_ != nullptr); cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, framebuffer_); cmds->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmds->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); cmds->bindRenderPipelineState(pipelineState); // The Uniform Buffer is binded here: for (const auto& uniformDesc : fragmentUniformDescriptors) { cmds->bindUniform(uniformDesc, &fragmentParameters); } cmds->bindTexture(textureUnit_, BindTarget::kFragment, inputTexture_.get()); cmds->bindSamplerState(textureUnit_, BindTarget::kFragment, samp_.get()); cmds->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmds->drawIndexed(6); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); //---------------------- // Read back framebuffer //---------------------- framebuffer_->copyBytesColorAttachment(*cmdQueue_, 0, pixels.data(), rangeDesc); //-------------------------------- // Verify against original texture //-------------------------------- // If the uniform buffer is broken, the pixels would be 0xFF000000 for (size_t i = 0; i < uniformTypesCount_; i++) { ASSERT_EQ(pixels[i], data::texture::kTexRgbaMisc1_4x4[i]); } // For the unset uniform buffers, make sure the test fails as expected for (size_t i = uniformTypesCount_; i < uniformTypesCount_ + failureCasesCount_; i++) { ASSERT_EQ(pixels[i], 0xFF000000); } } // // UniformBuffer uniform array binding test // // This test exercises the uniform array binding behavior. // The custom fragment shader will only show the original input texture when each and all of the // uniform types are binded properly // TEST_F(UniformBufferTest, UniformArrayBinding) { Result ret; std::shared_ptr pipelineState; const simd::float4 clearColor = {0.0, 0.0, 1.0, 1.0}; const auto rangeDesc = TextureRangeDesc::new2D(0, 0, kOffscreenTexWidth, kOffscreenTexHeight); // We are purposely creating an unpacked structure to trigger the // manual packing path in UniformBuffer::bindUniformArray. // This code has only been tested on MacOS, and we may need to // revisit if in the future we are running the test on a different OS // or building it with a different compiler. struct Float1UnpackedData { simd::float1 float1; bool padding[3]; }; struct Int1UnpackedData { simd::int1 int1; bool padding[3]; }; struct Float2UnpackedData { simd::float2 float2; bool padding[3]; }; struct Int2UnpackedData { simd::int2 int2; bool padding[3]; }; // Interestingly with vectorization, int3, float3, and float3x3 has the same size as their // 4 versions (12 bytes vs 16 bytes so the data is not packed.) // As a result, to test UniformArrayBinding, a separate test is not needed for data structures // of multiples of 3. struct Float4UnpackedData { simd::float4 float4; bool padding[3]; }; struct Int4UnpackedData { simd::int4 int4; bool padding[3]; }; struct BooleanUnpackedData { bool data; bool padding[3]; simd::float3 morePadding; }; struct FragmentParameters { std::array testFloat{}; std::array testVec2{}; std::array testVec3{}; std::array testVec4{}; std::array testBool{}; std::array testInt{}; std::array testiVec2{}; std::array testiVec3{}; std::array testiVec4{}; std::array testMat2{}; std::array testMat3{}; std::array testMat4{}; simd::float4 backgroundColor{}; std::array unsetFloat{}; std::array unsetBool{}; std::array unsetInt{}; } fragmentParameters; //------------------------------------- // Upload the texture //------------------------------------- inputTexture_->upload(rangeDesc, data::texture::kTexRgbaMisc1_4x4.data()); //---------------- // Create Shaders //---------------- // Initialize shader stages std::unique_ptr stages; igl::tests::util::createShaderStages(iglDev_, data::shader::kOglSimpleVertShader, data::shader::kSimpleVertFunc, kOglUniformArrayFragShader, data::shader::kSimpleFragFunc, stages); shaderStages_ = std::move(stages); renderPipelineDesc_.shaderStages = shaderStages_; //---------------- // Create Pipeline //---------------- pipelineState = iglDev_->createRenderPipeline(renderPipelineDesc_, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(pipelineState != nullptr); //------------------------------------- // Create Uniforms Buffer //------------------------------------- // Make sure there are more texture pixels than our test cases ASSERT_TRUE(uniformTypesCount_ + failureCasesCount_ <= kOffscreenTexWidth * kOffscreenTexHeight); BufferDesc fpDesc; fpDesc.type = BufferDesc::BufferTypeBits::Uniform; fpDesc.data = &fragmentParameters; fpDesc.length = sizeof(fragmentParameters); fpDesc.storage = ResourceStorage::Shared; std::vector fragmentUniformDescriptors; // "testFloat" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().type = UniformType::Float; fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(igl::genNameHandle("testFloat"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, testFloat); fragmentUniformDescriptors.back().numElements = 3; fragmentUniformDescriptors.back().elementStride = sizeof(Float1UnpackedData); fragmentParameters.testFloat[0] = {0.0f, {true, false, true}}; fragmentParameters.testFloat[1] = {0.1f, {true, true, true}}; fragmentParameters.testFloat[2] = {0.0f, {false, false, false}}; // "testVec2" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().type = UniformType::Float2; fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(igl::genNameHandle("testVec2"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, testVec2); fragmentUniformDescriptors.back().numElements = 3; fragmentUniformDescriptors.back().elementStride = sizeof(Float2UnpackedData); fragmentParameters.testVec2[0] = {{0.0f, 0.0f}, {true, false, true}}; fragmentParameters.testVec2[1] = {{0.2f, 0.2f}, {true, true, true}}; fragmentParameters.testVec2[2] = {{0.0f, 0.0f}, {false, false, false}}; // "testVec3" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().type = UniformType::Float3; fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(igl::genNameHandle("testVec3"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, testVec3); fragmentUniformDescriptors.back().numElements = 3; fragmentUniformDescriptors.back().elementStride = sizeof(simd::float3); fragmentParameters.testVec3[0] = {0.0f, 0.0f, 0.0f}; fragmentParameters.testVec3[1] = {0.3f, 0.3f, 0.3f}; fragmentParameters.testVec3[2] = {0.0f, 0.0f, 0.0f}; // "testVec4" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().type = UniformType::Float4; fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(igl::genNameHandle("testVec4"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, testVec4); fragmentUniformDescriptors.back().numElements = 3; fragmentUniformDescriptors.back().elementStride = sizeof(Float4UnpackedData); fragmentParameters.testVec4[0] = {{0.0f, 0.0f, 0.0f, 0.0f}, {true, false, true}}; fragmentParameters.testVec4[1] = {{0.4f, 0.4f, 0.4f, 0.4f}, {true, true, true}}; fragmentParameters.testVec4[2] = {{0.0f, 0.0f, 0.0f, 0.0f}, {false, false, false}}; // "testBool" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().type = UniformType::Boolean; fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(igl::genNameHandle("testBool"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, testBool); fragmentUniformDescriptors.back().numElements = 3; fragmentUniformDescriptors.back().elementStride = sizeof(BooleanUnpackedData); fragmentParameters.testBool[0] = {false, {false, false, true}, {0.0f, 0.1f, 0.2f}}; fragmentParameters.testBool[1] = {true, {false, false, true}, {0.3f, 0.4f, 0.5f}}; fragmentParameters.testBool[2] = {false, {true, true, true}, {0.6f, 0.7f, 0.8f}}; // "testInt" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().type = UniformType::Int; fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(igl::genNameHandle("testInt"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, testInt); fragmentUniformDescriptors.back().numElements = 3; fragmentUniformDescriptors.back().elementStride = sizeof(Int1UnpackedData); fragmentParameters.testInt[0] = {0, {true, false, true}}; fragmentParameters.testInt[1] = {42, {true, true, true}}; fragmentParameters.testInt[2] = {0, {false, false, false}}; // "testiVec2" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().type = UniformType::Int2; fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(igl::genNameHandle("testiVec2"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, testiVec2); fragmentUniformDescriptors.back().numElements = 3; fragmentUniformDescriptors.back().elementStride = sizeof(Int2UnpackedData); fragmentParameters.testiVec2[0] = {{0, 0}, {true, false, true}}; fragmentParameters.testiVec2[1] = {{2, 2}, {true, true, true}}; fragmentParameters.testiVec2[2] = {{0, 0}, {false, false, false}}; // "testiVec3" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().type = UniformType::Int3; fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(igl::genNameHandle("testiVec3"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, testiVec3); fragmentUniformDescriptors.back().numElements = 3; fragmentUniformDescriptors.back().elementStride = sizeof(simd::int3); fragmentParameters.testiVec3[0] = {0, 0, 0}; fragmentParameters.testiVec3[1] = {3, 3, 3}; fragmentParameters.testiVec3[2] = {0, 0, 0}; // "testiVec4" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().type = UniformType::Int4; fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(igl::genNameHandle("testiVec4"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, testiVec4); fragmentUniformDescriptors.back().numElements = 3; fragmentUniformDescriptors.back().elementStride = sizeof(Int4UnpackedData); fragmentParameters.testiVec4[0] = {{0, 0, 0, 0}, {true, false, true}}; fragmentParameters.testiVec4[1] = {{4, 4, 4, 4}, {true, true, true}}; fragmentParameters.testiVec4[2] = {{0, 0, 0, 0}, {false, false, false}}; // "testMat2" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().type = UniformType::Mat2x2; fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(igl::genNameHandle("testMat2"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, testMat2); fragmentUniformDescriptors.back().numElements = 3; fragmentUniformDescriptors.back().elementStride = sizeof(simd::float2x2); simd::float2 firstCol2 = {1.0, 2.0}, secondCol2 = {3.0, 4.0}, col20 = {0.0, 0.0}; fragmentParameters.testMat2[0] = {col20, col20}; fragmentParameters.testMat2[1] = {firstCol2, secondCol2}; fragmentParameters.testMat2[2] = {col20, col20}; // "testMat3" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().type = UniformType::Mat3x3; fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(igl::genNameHandle("testMat3"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, testMat3); fragmentUniformDescriptors.back().elementStride = sizeof(simd::float3x3); fragmentUniformDescriptors.back().numElements = 3; fragmentUniformDescriptors.back().elementStride = sizeof(simd::float3x3); simd::float3 firstCol3 = {1.0, 2.0, 3.0}, secondCol3 = {4.0, 5.0, 6.0}, thirdCol3 = {7.0, 8.0, 9.0}, col30 = {0.0, 0.0, 0.0}; fragmentParameters.testMat3[0] = {col30, col30, col30}; fragmentParameters.testMat3[1] = {firstCol3, secondCol3, thirdCol3}; fragmentParameters.testMat3[2] = {col30, col30, col30}; // "testMat4" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().type = UniformType::Mat4x4; fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(igl::genNameHandle("testMat4"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, testMat4); fragmentUniformDescriptors.back().numElements = 3; fragmentUniformDescriptors.back().elementStride = sizeof(simd::float4x4); simd::float4 firstCol4 = {1.0, 2.0, 3.0, 4.0}, secondCol4 = {5.0, 6.0, 7.0, 8.0}, thirdCol4 = {9.0, 10.0, 11.0, 12.0}, fourthCol4 = {13.0, 14.0, 15.0, 16.0}, col40 = {0.0, 0.0, 0.0, 0.0}; fragmentParameters.testMat4[0] = {col40, col40, col40, col40}; fragmentParameters.testMat4[1] = {firstCol4, secondCol4, thirdCol4, fourthCol4}; fragmentParameters.testMat4[2] = {col40, col40, col40, col40}; // "backgroundColor" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().type = UniformType::Float4; fragmentUniformDescriptors.back().location = pipelineState->getIndexByName( igl::genNameHandle("backgroundColor"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, backgroundColor); fragmentParameters.backgroundColor = clearColor; // "unsetFloat3" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().type = UniformType::Float; fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(igl::genNameHandle("unsetFloat3"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, unsetFloat); fragmentUniformDescriptors.back().numElements = 3; fragmentUniformDescriptors.back().elementStride = sizeof(simd::float1); fragmentParameters.unsetFloat = {0.0f, 0.1f, 0.0f}; // "unsetBool3" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().type = UniformType::Boolean; fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(igl::genNameHandle("unsetBool3"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, unsetBool); fragmentUniformDescriptors.back().numElements = 3; fragmentUniformDescriptors.back().elementStride = sizeof(bool); fragmentParameters.unsetBool[0] = false; fragmentParameters.unsetBool[1] = true; fragmentParameters.unsetBool[2] = false; // "unsetInt3" fragmentUniformDescriptors.emplace_back(); fragmentUniformDescriptors.back().type = UniformType::Int; fragmentUniformDescriptors.back().location = pipelineState->getIndexByName(igl::genNameHandle("unsetInt3"), igl::ShaderStage::Fragment); fragmentUniformDescriptors.back().offset = offsetof(FragmentParameters, unsetInt); fragmentUniformDescriptors.back().numElements = 3; fragmentUniformDescriptors.back().elementStride = sizeof(simd::int1); fragmentParameters.unsetInt[0] = {0}; fragmentParameters.unsetInt[1] = {42}; fragmentParameters.unsetInt[2] = {0}; fragmentParamBuffer_ = iglDev_->createBuffer(fpDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(fragmentParamBuffer_ != nullptr); cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(cmdBuf_ != nullptr); std::shared_ptr cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, framebuffer_); cmds->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmds->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); cmds->bindRenderPipelineState(pipelineState); cmds->bindTexture(textureUnit_, BindTarget::kFragment, inputTexture_.get()); cmds->bindSamplerState(textureUnit_, BindTarget::kFragment, samp_.get()); cmds->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmds->drawIndexed(6); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); //---------------------- // Read back framebuffer //---------------------- auto pixels = std::vector(kOffscreenTexWidth * kOffscreenTexHeight); framebuffer_->copyBytesColorAttachment(*cmdQueue_, 0, pixels.data(), rangeDesc); //-------------------------------- // Verify against original texture // Pixels are supposed to be 0xFF000000 since the uniform buffer is not bound //-------------------------------- for (size_t i = 0; i < kOffscreenTexWidth * kOffscreenTexHeight; i++) { ASSERT_EQ(pixels[i], 0xFF000000); } //---------------- // Bind the uniform buffer //---------------- cmdBuf_ = cmdQueue_->createCommandBuffer(cbDesc_, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(cmdBuf_ != nullptr); cmds = cmdBuf_->createRenderCommandEncoder(renderPass_, framebuffer_); cmds->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmds->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); cmds->bindRenderPipelineState(pipelineState); // The Uniform Buffer is binded here: for (const auto& uniformDesc : fragmentUniformDescriptors) { cmds->bindUniform(uniformDesc, &fragmentParameters); } cmds->bindTexture(textureUnit_, BindTarget::kFragment, inputTexture_.get()); cmds->bindSamplerState(textureUnit_, BindTarget::kFragment, samp_.get()); cmds->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmds->drawIndexed(6); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf_); //---------------------- // Read back framebuffer //---------------------- framebuffer_->copyBytesColorAttachment(*cmdQueue_, 0, pixels.data(), rangeDesc); //-------------------------------- // Verify against original texture //-------------------------------- // If the uniform buffer is broken, the pixels would be 0xFF000000 for (size_t i = 0; i < uniformTypesCount_; i++) { ASSERT_EQ(pixels[i], data::texture::kTexRgbaMisc1_4x4[i]); } // For the unset uniform buffers, make sure the test fails as expected for (size_t i = uniformTypesCount_; i < uniformTypesCount_ + failureCasesCount_; i++) { ASSERT_EQ(pixels[i], 0xFF000000); } } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/Version.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace igl::tests { class VersionOGLTest : public ::testing::Test { public: VersionOGLTest() = default; ~VersionOGLTest() override = default; // Set up VertexInputStateDesc for the different test cases void SetUp() override { setDebugBreakEnabled(false); } void TearDown() override {} }; TEST_F(VersionOGLTest, GetGLVersionEnum) { #if IGL_OPENGL_ES EXPECT_EQ(opengl::getGLVersion("OpenGL ES 2.0", false), opengl::GLVersion::v2_0_ES); EXPECT_EQ(opengl::getGLVersion("OpenGL ES 2.1", false), opengl::GLVersion::v2_0_ES); EXPECT_EQ(opengl::getGLVersion("OpenGL ES 3.0", false), opengl::GLVersion::v3_0_ES); EXPECT_EQ(opengl::getGLVersion("OpenGL ES 3.1", false), opengl::GLVersion::v3_1_ES); EXPECT_EQ(opengl::getGLVersion("OpenGL ES 3.2", false), opengl::GLVersion::v3_2_ES); EXPECT_EQ(opengl::getGLVersion("OpenGL ES 3.3", false), opengl::GLVersion::v3_0_ES); EXPECT_EQ(opengl::getGLVersion("OpenGL ES 4.0", false), opengl::GLVersion::v2_0_ES); EXPECT_EQ(opengl::getGLVersion("OpenGL ES 2.0", true), opengl::GLVersion::v2_0_ES); EXPECT_EQ(opengl::getGLVersion("OpenGL ES 4.0", true), opengl::GLVersion::v3_0_ES); EXPECT_EQ(opengl::getGLVersion(nullptr, false), opengl::GLVersion::v2_0_ES); #else EXPECT_EQ(opengl::getGLVersion("1.1", false), opengl::GLVersion::v1_1); EXPECT_EQ(opengl::getGLVersion("2.0", false), opengl::GLVersion::v2_0); EXPECT_EQ(opengl::getGLVersion("2.1", false), opengl::GLVersion::v2_1); EXPECT_EQ(opengl::getGLVersion("2.2", false), opengl::GLVersion::v2_0); EXPECT_EQ(opengl::getGLVersion("3.0", false), opengl::GLVersion::v3_0); EXPECT_EQ(opengl::getGLVersion("3.1", false), opengl::GLVersion::v3_1); EXPECT_EQ(opengl::getGLVersion("3.2", false), opengl::GLVersion::v3_2); EXPECT_EQ(opengl::getGLVersion("3.3", false), opengl::GLVersion::v3_3); EXPECT_EQ(opengl::getGLVersion("3.4", false), opengl::GLVersion::v3_0); EXPECT_EQ(opengl::getGLVersion("4.0", false), opengl::GLVersion::v4_0); EXPECT_EQ(opengl::getGLVersion("4.1", false), opengl::GLVersion::v4_1); EXPECT_EQ(opengl::getGLVersion("4.2", false), opengl::GLVersion::v4_2); EXPECT_EQ(opengl::getGLVersion("4.3", false), opengl::GLVersion::v4_3); EXPECT_EQ(opengl::getGLVersion("4.4", false), opengl::GLVersion::v4_4); EXPECT_EQ(opengl::getGLVersion("4.5", false), opengl::GLVersion::v4_5); EXPECT_EQ(opengl::getGLVersion("4.6", false), opengl::GLVersion::v4_6); EXPECT_EQ(opengl::getGLVersion("4.7", false), opengl::GLVersion::v4_0); EXPECT_EQ(opengl::getGLVersion("5.0", false), opengl::GLVersion::v2_0); EXPECT_EQ(opengl::getGLVersion(nullptr, false), opengl::GLVersion::v2_0); EXPECT_EQ(opengl::getGLVersion("2.0", true), opengl::GLVersion::v2_0); #endif } TEST_F(VersionOGLTest, GetShaderVersion) { { const auto version = opengl::getShaderVersion(opengl::GLVersion::v2_0_ES); EXPECT_EQ(version.family, ShaderFamily::GlslEs); EXPECT_EQ(version.majorVersion, 1); EXPECT_EQ(version.minorVersion, 0); } { const auto version = opengl::getShaderVersion(opengl::GLVersion::v3_0_ES); EXPECT_EQ(version.family, ShaderFamily::GlslEs); EXPECT_EQ(version.majorVersion, 3); EXPECT_EQ(version.minorVersion, 0); } { const auto version = opengl::getShaderVersion(opengl::GLVersion::v3_1_ES); EXPECT_EQ(version.family, ShaderFamily::GlslEs); EXPECT_EQ(version.majorVersion, 3); EXPECT_EQ(version.minorVersion, 10); } { const auto version = opengl::getShaderVersion(opengl::GLVersion::v3_2_ES); EXPECT_EQ(version.family, ShaderFamily::GlslEs); EXPECT_EQ(version.majorVersion, 3); EXPECT_EQ(version.minorVersion, 20); } { const auto version = opengl::getShaderVersion(opengl::GLVersion::v2_0); EXPECT_EQ(version.family, ShaderFamily::Glsl); EXPECT_EQ(version.majorVersion, 1); EXPECT_EQ(version.minorVersion, 10); } { const auto version = opengl::getShaderVersion(opengl::GLVersion::v2_1); EXPECT_EQ(version.family, ShaderFamily::Glsl); EXPECT_EQ(version.majorVersion, 1); EXPECT_EQ(version.minorVersion, 20); } { const auto version = opengl::getShaderVersion(opengl::GLVersion::v3_0); EXPECT_EQ(version.family, ShaderFamily::Glsl); EXPECT_EQ(version.majorVersion, 1); EXPECT_EQ(version.minorVersion, 30); } { const auto version = opengl::getShaderVersion(opengl::GLVersion::v3_1); EXPECT_EQ(version.family, ShaderFamily::Glsl); EXPECT_EQ(version.majorVersion, 1); EXPECT_EQ(version.minorVersion, 40); } { const auto version = opengl::getShaderVersion(opengl::GLVersion::v3_2); EXPECT_EQ(version.family, ShaderFamily::Glsl); EXPECT_EQ(version.majorVersion, 1); EXPECT_EQ(version.minorVersion, 50); } { const auto version = opengl::getShaderVersion(opengl::GLVersion::v3_3); EXPECT_EQ(version.family, ShaderFamily::Glsl); EXPECT_EQ(version.majorVersion, 3); EXPECT_EQ(version.minorVersion, 30); } { const auto version = opengl::getShaderVersion(opengl::GLVersion::v4_0); EXPECT_EQ(version.family, ShaderFamily::Glsl); EXPECT_EQ(version.majorVersion, 4); EXPECT_EQ(version.minorVersion, 0); } { const auto version = opengl::getShaderVersion(opengl::GLVersion::v4_1); EXPECT_EQ(version.family, ShaderFamily::Glsl); EXPECT_EQ(version.majorVersion, 4); EXPECT_EQ(version.minorVersion, 10); } { const auto version = opengl::getShaderVersion(opengl::GLVersion::v4_2); EXPECT_EQ(version.family, ShaderFamily::Glsl); EXPECT_EQ(version.majorVersion, 4); EXPECT_EQ(version.minorVersion, 20); } { const auto version = opengl::getShaderVersion(opengl::GLVersion::v4_3); EXPECT_EQ(version.family, ShaderFamily::Glsl); EXPECT_EQ(version.majorVersion, 4); EXPECT_EQ(version.minorVersion, 30); } { const auto version = opengl::getShaderVersion(opengl::GLVersion::v4_4); EXPECT_EQ(version.family, ShaderFamily::Glsl); EXPECT_EQ(version.majorVersion, 4); EXPECT_EQ(version.minorVersion, 40); } { const auto version = opengl::getShaderVersion(opengl::GLVersion::v4_5); EXPECT_EQ(version.family, ShaderFamily::Glsl); EXPECT_EQ(version.majorVersion, 4); EXPECT_EQ(version.minorVersion, 50); } { const auto version = opengl::getShaderVersion(opengl::GLVersion::v4_6); EXPECT_EQ(version.family, ShaderFamily::Glsl); EXPECT_EQ(version.majorVersion, 4); EXPECT_EQ(version.minorVersion, 60); } } TEST_F(VersionOGLTest, GetStringFromShaderVersion) { EXPECT_EQ(opengl::getStringFromShaderVersion(ShaderVersion{ShaderFamily::GlslEs, 1, 0}), "#version 100"); EXPECT_EQ(opengl::getStringFromShaderVersion(ShaderVersion{ShaderFamily::GlslEs, 3, 0}), "#version 300 es"); EXPECT_EQ(opengl::getStringFromShaderVersion(ShaderVersion{ShaderFamily::GlslEs, 3, 10}), "#version 310 es"); EXPECT_EQ(opengl::getStringFromShaderVersion(ShaderVersion{ShaderFamily::GlslEs, 3, 20}), "#version 320 es"); EXPECT_EQ(opengl::getStringFromShaderVersion(ShaderVersion{ShaderFamily::Glsl, 1, 10}), "#version 110"); EXPECT_EQ(opengl::getStringFromShaderVersion(ShaderVersion{ShaderFamily::Glsl, 1, 20}), "#version 120"); EXPECT_EQ(opengl::getStringFromShaderVersion(ShaderVersion{ShaderFamily::Glsl, 1, 30}), "#version 130"); EXPECT_EQ(opengl::getStringFromShaderVersion(ShaderVersion{ShaderFamily::Glsl, 1, 40}), "#version 140"); EXPECT_EQ(opengl::getStringFromShaderVersion(ShaderVersion{ShaderFamily::Glsl, 1, 50}), "#version 150"); EXPECT_EQ(opengl::getStringFromShaderVersion(ShaderVersion{ShaderFamily::Glsl, 3, 30}), "#version 330"); EXPECT_EQ(opengl::getStringFromShaderVersion(ShaderVersion{ShaderFamily::Glsl, 4, 0}), "#version 400"); EXPECT_EQ(opengl::getStringFromShaderVersion(ShaderVersion{ShaderFamily::Glsl, 4, 10}), "#version 410"); EXPECT_EQ(opengl::getStringFromShaderVersion(ShaderVersion{ShaderFamily::Glsl, 4, 20}), "#version 420"); EXPECT_EQ(opengl::getStringFromShaderVersion(ShaderVersion{ShaderFamily::Glsl, 4, 30}), "#version 430"); EXPECT_EQ(opengl::getStringFromShaderVersion(ShaderVersion{ShaderFamily::Glsl, 4, 40}), "#version 440"); EXPECT_EQ(opengl::getStringFromShaderVersion(ShaderVersion{ShaderFamily::Glsl, 4, 50}), "#version 450"); EXPECT_EQ(opengl::getStringFromShaderVersion(ShaderVersion{ShaderFamily::Glsl, 4, 60}), "#version 460"); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/VertexArrayObjectOGL.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" #include #include #include #include namespace igl::tests { // // VertexArrayObjectOGLTest // // Tests for the OpenGL VertexArrayObject. // class VertexArrayObjectOGLTest : public ::testing::Test { public: VertexArrayObjectOGLTest() = default; ~VertexArrayObjectOGLTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_NE(iglDev_, nullptr); ASSERT_NE(cmdQueue_, nullptr); context_ = &static_cast(*iglDev_).getContext(); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; opengl::IContext* context_ = nullptr; }; // // CreateBindUnbind // // Create a VAO, verify it is valid, bind and unbind with no GL errors. // TEST_F(VertexArrayObjectOGLTest, CreateBindUnbind) { if (!context_->deviceFeatures().hasInternalFeature(opengl::InternalFeatures::VertexArrayObject)) { GTEST_SKIP() << "VertexArrayObject not supported"; } opengl::VertexArrayObject vao(*context_); Result ret = vao.create(); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(vao.isValid()); // Bind should succeed without errors vao.bind(); ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); // Unbind should succeed without errors vao.unbind(); ASSERT_EQ(context_->checkForErrors(__FILE__, __LINE__), GL_NO_ERROR); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/VertexInputState.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/Common.h" namespace igl::tests { // // VertexInputStateTest // // Cover all paths in igl::opengl::VertexInputState::create() // class VertexInputStateOGLTest : public ::testing::Test { public: VertexInputStateOGLTest() = default; ~VertexInputStateOGLTest() override = default; // Set up VertexInputStateDesc for the different test cases void SetUp() override { setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_TRUE(iglDev_ != nullptr); ASSERT_TRUE(cmdQueue_ != nullptr); } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; }; // // DefaultCreate // // Case 1: create VertexInputState with default values of VertexInputStateDesc // (desc.numAttributes == 0). Expect this to pass. // TEST_F(VertexInputStateOGLTest, DefaultCreate) { Result ret; std::shared_ptr vertexInputState; VertexInputStateDesc inputDesc; inputDesc.numAttributes = 0; vertexInputState = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vertexInputState != nullptr); } // // TwoAttribOneBinding // // Case 2: create VertexInputState with two buffer indices and one buffer // binding (numInputBindings = 1, but inputDesc_.numAttributes = 2). Expect this // to fail because two buffer indices requires at least two bindings. // TEST_F(VertexInputStateOGLTest, TwoAttribOneBinding) { Result ret; std::shared_ptr vertexInputState; const char unused1[] = "Unused1"; const size_t unused1Index = 2; const char unused2[] = "Unused2"; const size_t unused2Index = 3; VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Float4; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].location = 0; inputDesc.attributes[0].bufferIndex = unused1Index; inputDesc.attributes[0].name = unused1; inputDesc.inputBindings[0].stride = sizeof(float) * 4; inputDesc.attributes[1].format = VertexAttributeFormat::Float2; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].location = 1; inputDesc.attributes[1].bufferIndex = unused2Index; inputDesc.attributes[1].name = unused2; inputDesc.inputBindings[1].stride = sizeof(float) * 2; // numAttributes has to equal to bindings when using more than 1 buffer // the following are just for covering codes inputDesc.numAttributes = 2; inputDesc.numInputBindings = 1; vertexInputState = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::ArgumentInvalid); ASSERT_TRUE(vertexInputState == nullptr); } // // TwoAttribTwoBinding // // Case 3: create VertexInputState with two buffer indices and two buffer // binding (numInputBindings = 2, and inputDesc_.numAttributes = 2). // Expect this to pass. // TEST_F(VertexInputStateOGLTest, TwoAttribTwoBinding) { Result ret; std::shared_ptr vertexInputState; const char unused1[] = "Unused1"; const size_t unused1Index = 2; const char unused2[] = "Unused2"; const size_t unused2Index = 3; VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Float4; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].location = 0; inputDesc.attributes[0].bufferIndex = unused1Index; inputDesc.attributes[0].name = unused1; inputDesc.inputBindings[0].stride = sizeof(float) * 4; inputDesc.attributes[1].format = VertexAttributeFormat::Float2; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].location = 1; inputDesc.attributes[1].bufferIndex = unused2Index; inputDesc.attributes[1].name = unused2; inputDesc.inputBindings[1].stride = sizeof(float) * 2; // numAttributes has to equal to bindings when using more than 1 buffer inputDesc.numAttributes = inputDesc.numInputBindings = 2; vertexInputState = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vertexInputState != nullptr); } // Test creating attributes with every data format TEST_F(VertexInputStateOGLTest, AllFormats0) { const char someName[] = "Name"; constexpr size_t sizes[] = { // float1 float2 etc sizeof(float) * 1, sizeof(float) * 2, sizeof(float) * 3, sizeof(float) * 4, // byte1 byte2 etc sizeof(char) * 1, sizeof(char) * 2, sizeof(char) * 3, sizeof(char) * 4, // ubyte1 ubyte2 etc sizeof(char) * 1, sizeof(char) * 2, sizeof(char) * 3, sizeof(char) * 4, // short1 short2 etc sizeof(short) * 1, sizeof(short) * 2, sizeof(short) * 3, sizeof(short) * 4, // ushort1 ushort2 etc sizeof(short) * 1, sizeof(short) * 2, sizeof(short) * 3, sizeof(short) * 4, // byte1norm byte2norm etc sizeof(char) * 1, sizeof(char) * 2, sizeof(char) * 3, sizeof(char) * 4, // uByte1Norm uByte1Norm etc sizeof(char) * 1, sizeof(char) * 2, sizeof(char) * 3, sizeof(char) * 4, // short1Norm short2Norm etc sizeof(short) * 1, sizeof(short) * 2, sizeof(short) * 3, sizeof(short) * 4, // ushort1norm ushort2norm etc sizeof(short) * 1, sizeof(short) * 2, sizeof(short) * 3, sizeof(short) * 4, // int1 int2 etc sizeof(int) * 1, sizeof(int) * 2, sizeof(int) * 3, sizeof(int) * 4, // uint1 uint2 etc sizeof(int) * 1, sizeof(int) * 2, sizeof(int) * 3, sizeof(int) * 4, // half1 half2 etc sizeof(uint16_t) * 1, sizeof(uint16_t) * 2, sizeof(uint16_t) * 3, sizeof(uint16_t) * 4, // Int_2_10_10_10_REV sizeof(int), }; // There are 49 formats, but only 24 fit inside one vertex input state so we test the 24 formats, // the next 24, and the last format on its own { // First 24 formats VertexInputStateDesc inputDesc; for (int i = 0; i < IGL_VERTEX_ATTRIBUTES_MAX; i++) { inputDesc.attributes[i].format = static_cast(i); inputDesc.attributes[i].offset = 0; inputDesc.attributes[i].location = 0; inputDesc.attributes[i].bufferIndex = i; inputDesc.attributes[i].name = someName; inputDesc.inputBindings[i].stride = sizes[i]; } // numAttributes has to equal to bindings when using more than 1 buffer inputDesc.numAttributes = inputDesc.numInputBindings = IGL_VERTEX_ATTRIBUTES_MAX; Result ret; std::shared_ptr vertexInputState; vertexInputState = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vertexInputState != nullptr); } { // Next 24 formats VertexInputStateDesc inputDesc; for (int i = 0; i < IGL_VERTEX_ATTRIBUTES_MAX; i++) { inputDesc.attributes[i].format = static_cast(i + IGL_VERTEX_ATTRIBUTES_MAX); inputDesc.attributes[i].offset = 0; inputDesc.attributes[i].location = 0; inputDesc.attributes[i].bufferIndex = i; inputDesc.attributes[i].name = someName; inputDesc.inputBindings[i].stride = sizes[i + IGL_VERTEX_ATTRIBUTES_MAX]; } // numAttributes has to equal to bindings when using more than 1 buffer inputDesc.numAttributes = inputDesc.numInputBindings = IGL_VERTEX_ATTRIBUTES_MAX; Result ret; std::shared_ptr vertexInputState; vertexInputState = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vertexInputState != nullptr); } { // Last format VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Int_2_10_10_10_REV; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].location = 0; inputDesc.attributes[0].bufferIndex = 0; inputDesc.attributes[0].name = someName; inputDesc.inputBindings[0].stride = sizes[static_cast(VertexAttributeFormat::Int_2_10_10_10_REV)]; // numAttributes has to equal to bindings when using more than 1 buffer inputDesc.numAttributes = inputDesc.numInputBindings = 1; Result ret; std::shared_ptr vertexInputState; vertexInputState = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vertexInputState != nullptr); } } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/ViewTextureTarget.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../util/TestDevice.h" #include namespace igl::tests { // // ViewTextureTargetOGLTest // // Unit tests for igl::opengl::ViewTextureTarget. // Covers code paths that may not be hit by top level texture calls from device. // class ViewTextureTargetOGLTest : public ::testing::Test { public: ViewTextureTargetOGLTest() = default; ~ViewTextureTargetOGLTest() override = default; void SetUp() override { // Turn off debug breaks, only use in debug mode igl::setDebugBreakEnabled(false); device_ = util::createTestDevice(); ASSERT_TRUE(device_ != nullptr); context_ = &static_cast(*device_).getContext(); ASSERT_TRUE(context_ != nullptr); } void TearDown() override {} // Member variables protected: opengl::IContext* context_{}; std::shared_ptr device_; }; // // Specifications Test // // This test verifies that the default ViewTextureTarget specs are defined // correctly. Note that "correct" in this case only means how the code is // currently written. Should the ViewTextureTarget code change, then this // test will need to be updated as well. // TEST_F(ViewTextureTargetOGLTest, Specifications) { std::unique_ptr viewTextureTarget = std::make_unique(*context_, TextureFormat::RGBA_UNorm8); ASSERT_EQ(viewTextureTarget->getType(), TextureType::TwoD); ASSERT_EQ(viewTextureTarget->getUsage(), TextureDesc::TextureUsageBits::Attachment); ASSERT_TRUE(viewTextureTarget->isImplicitStorage()); } // // NoOpFunctions Test // // This test calls no-op functions just to satisfy code coverage. // TEST_F(ViewTextureTargetOGLTest, NoOpFunctions) { std::unique_ptr viewTextureTarget = std::make_unique(*context_, TextureFormat::RGBA_UNorm8); viewTextureTarget->bind(); viewTextureTarget->unbind(); viewTextureTarget->attachAsColor(0, opengl::Texture::AttachmentParams{}); viewTextureTarget->detachAsColor(0, false); viewTextureTarget->attachAsDepth(opengl::Texture::AttachmentParams{}); viewTextureTarget->attachAsStencil(opengl::Texture::AttachmentParams{}); } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/ios/TextureBuffer.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../../util/TextureFormatTestBase.h" #include #include #include #include #include namespace igl::tests { class TextureBufferIosTest : public util::TextureFormatTestBase { public: TextureBufferIosTest() = default; ~TextureBufferIosTest() override = default; std::shared_ptr createCVPixelBufferTextureWithSize(OSType pixelFormat, size_t width, size_t height, TextureDesc::TextureUsage usage, Result& outResult); }; std::shared_ptr TextureBufferIosTest::createCVPixelBufferTextureWithSize( OSType pixelFormat, const size_t width, const size_t height, TextureDesc::TextureUsage usage, Result& outResult) { const igl::BackendType backend = iglDev_->getBackendType(); CVPixelBufferRef pixelBuffer = nullptr; NSDictionary* bufferAttributes = @{ (NSString*)kCVPixelBufferIOSurfacePropertiesKey : @{}, (NSString*)kCVPixelFormatOpenGLESCompatibility : @(backend == igl::BackendType::OpenGL), }; const CVReturn result = CVPixelBufferCreate(kCFAllocatorDefault, width, height, pixelFormat, (__bridge CFDictionaryRef)(bufferAttributes), &pixelBuffer); if (result != kCVReturnSuccess) { Result::setResult(&outResult, Result::Code::RuntimeError, "CVPixelBufferCreate failed to create pixel buffer"); return nullptr; } auto* platformDevice = iglDev_->getPlatformDevice(); auto& context = static_cast(platformDevice->getContext()); auto* textureCache = context.getTextureCache(); std::shared_ptr texture = platformDevice->createTextureFromNativePixelBuffer( pixelBuffer, textureCache, 0, usage, &outResult); if (!outResult.isOk()) { return nullptr; } if (texture == nullptr) { Result::setResult( &outResult, Result::Code::RuntimeError, "failed to create igl texture from CVPixelBuffer"); return nullptr; } CVPixelBufferRelease(pixelBuffer); Result::setOk(&outResult); return texture; } #define PIXEL_FORMAT(pf) {pf, #pf} TEST_F(TextureBufferIosTest, createTextureFromNativePixelBuffer) { const std::vector> pixelFormats = { PIXEL_FORMAT(kCVPixelFormatType_32BGRA), // TODO: These currently returns kCVReturnPixelBufferNotOpenGLCompatible // PIXEL_FORMAT(kCVPixelFormatType_64RGBAHalf), // PIXEL_FORMAT(kCVPixelFormatType_OneComponent8), // TODO: Figure out how to test YUV textures // PIXEL_FORMAT(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange), // PIXEL_FORMAT(kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange), // PIXEL_FORMAT(kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange), }; for (auto [pixelFormat, name] : pixelFormats) { Result result; auto usage = TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment; auto texture = createCVPixelBufferTextureWithSize(pixelFormat, 100, 100, usage, result); ASSERT_EQ(result.isOk(), true) << name << ": " << result.message.c_str(); testUsage(texture, usage, "SampledAttachment"); } } } // namespace igl::tests ================================================ FILE: src/igl/tests/ogl/macos/TextureBuffer.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../../util/TextureFormatTestBase.h" #include #include #include #include #include #include namespace igl::tests { class TextureBufferMacTest : public util::TextureFormatTestBase { public: TextureBufferMacTest() = default; ~TextureBufferMacTest() override = default; std::shared_ptr createCVPixelBufferTextureWithSize(OSType pixelFormat, size_t width, size_t height, TextureDesc::TextureUsage usage, Result& outResult); }; std::shared_ptr TextureBufferMacTest::createCVPixelBufferTextureWithSize( OSType pixelFormat, const size_t width, const size_t height, TextureDesc::TextureUsage usage, Result& outResult) { const igl::BackendType backend = iglDev_->getBackendType(); CVPixelBufferRef pixelBuffer = nullptr; NSDictionary* bufferAttributes = @{ (NSString*)kCVPixelBufferIOSurfacePropertiesKey : @{}, (NSString*)kCVPixelBufferOpenGLCompatibilityKey : @(backend == igl::BackendType::OpenGL), }; const CVReturn result = CVPixelBufferCreate(kCFAllocatorDefault, width, height, pixelFormat, (__bridge CFDictionaryRef)(bufferAttributes), &pixelBuffer); if (result != kCVReturnSuccess) { Result::setResult(&outResult, Result::Code::RuntimeError, "CVPixelBufferCreate failed to create pixel buffer"); return nullptr; } auto* platformDevice = iglDev_->getPlatformDevice(); auto& context = static_cast(platformDevice->getContext()); auto* textureCache = context.createTextureCache(); std::shared_ptr texture = platformDevice->createTextureFromNativePixelBuffer( pixelBuffer, textureCache, usage, &outResult); if (!outResult.isOk()) { return nullptr; } if (texture == nullptr) { Result::setResult( &outResult, Result::Code::RuntimeError, "failed to create igl texture from CVPixelBuffer"); return nullptr; } CVPixelBufferRelease(pixelBuffer); CVOpenGLTextureCacheRelease(textureCache); Result::setOk(&outResult); return texture; } #define PIXEL_FORMAT(pf) {pf, #pf} TEST_F(TextureBufferMacTest, createTextureFromNativePixelBuffer) { const std::vector> pixelFormats = { PIXEL_FORMAT(kCVPixelFormatType_32BGRA), PIXEL_FORMAT(kCVPixelFormatType_OneComponent8), // TODO: Figure out how to test YUV textures // PIXEL_FORMAT(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange), // PIXEL_FORMAT(kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange), }; for (auto [pixelFormat, name] : pixelFormats) { Result result; auto usage = TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment; auto texture = createCVPixelBufferTextureWithSize(pixelFormat, 100, 100, usage, result); ASSERT_EQ(result.isOk(), true) << name << ": " << result.message.c_str(); testUsage(texture, usage, "SampledAttachment"); } } } // namespace igl::tests ================================================ FILE: src/igl/tests/util/Color.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::tests::util { // To avoid mix matching gamma, this defines a constant that everyone can use until it can be // configured on a per project basis. constexpr double kDefaultGamma = 2.4; // force double precision color conversion to not lose precision template glm::vec convertSRGBToLinear(const glm::vec& nonLinearColor, double gamma = kDefaultGamma) { return glm::vec(glm::convertSRGBToLinear(glm::vec(nonLinearColor), gamma)); } // force double precision color conversion to not lose precision template glm::vec convertLinearToSRGB(const glm::vec& linearColor, double gamma = kDefaultGamma) { return glm::vec(glm::convertLinearToSRGB(glm::vec(linearColor), gamma)); } /** * @brief struct to represent a 32bits sRGB color value. It is assumed that the rgb colors are gamma * compressed using the sRGB transfer function and the alpha is linear. */ struct SRgbColor { uint8_t r{}; uint8_t g{}; uint8_t b{}; uint8_t a{}; /** * @brief Constructor ingesting red, green, blue. alpha is assumed to be 255. * @remark the red green and blue are assumed to be gamma compressed using the sRGB transfer * function. * * @param red - red channel * @param green - green channel * @param blue - blue channel */ constexpr SRgbColor(uint8_t red, uint8_t green, uint8_t blue) : r(red), g(green), b(blue), a(255) {} /** * @brief Constructor ingesting red, green, blue, alpha. * @remark the red green and blue are assumed to be gamma compressed using the sRGB transfer * function and the alpha is linear.. * * @param red - red channel * @param green - green channel * @param blue - blue channel * @param alpha - alpha channel */ constexpr SRgbColor(uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha) : r(red), g(green), b(blue), a(alpha) {} /** * @brief Constructor ingesting red, green, blue, alpha. * * @param rgba - 32bits integer containing concatenated 8 bits for red, green, blue and alpha. * @remark the red green and blue are assumed to be gamma compressed using the sRGB transfer * function and the alpha is linear. */ SRgbColor(uint32_t rgba) { fromRGBA32(rgba); } /** * @brief Encode the rgba values into a single 32bits integer. * @return 32bits integer containing the rgba values. * @remark the red green and blue are assumed to be gamma compressed using the sRGB transfer * function and the alpha is linear. */ [[nodiscard]] constexpr uint32_t toRGBA32() const { return (r << 24) | (g << 16) | (b << 8) | a; } /** * @brief Decode the rgba values into a single 32bits integer. * @param rgba - 32bits integer containing the rgba values. * @remark the rgba are assumed to be gamma compressed using the sRGB transfer function and the * alpha is linear. */ constexpr void fromRGBA32(uint32_t rgba) { r = (rgba >> 24); g = (rgba >> 16) & 0xff; b = (rgba >> 8) & 0xff; a = (rgba >> 0) & 0xff; } }; } // namespace igl::tests::util ================================================ FILE: src/igl/tests/util/Common.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "Common.h" #include "../data/ShaderData.h" #include "TestDevice.h" #include namespace igl::tests::util { // // Creates an IGL device and a command queue // void createDeviceAndQueue(std::shared_ptr& dev, std::shared_ptr& cq) { Result ret; // Create Device dev = util::createTestDevice(); ASSERT_TRUE(dev != nullptr); // Create Command Queue const CommandQueueDesc cqDesc = {}; cq = dev->createCommandQueue(cqDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(cq != nullptr); // Shouldn't trigger if above is okay } void createShaderStages(const std::shared_ptr& dev, std::string_view vertexSource, std::string_view vertexEntryPoint, std::string_view fragmentSource, std::string_view fragmentEntryPoint, std::unique_ptr& stages) { Result ret; stages = ShaderStagesCreator::fromModuleStringInput(*dev, vertexSource.data(), std::string(vertexEntryPoint), "", fragmentSource.data(), std::string(fragmentEntryPoint), "", &ret); ASSERT_EQ(ret.code, Result::Code::Ok) << ret.message.c_str(); ASSERT_TRUE(stages != nullptr); } void createShaderStages(const std::shared_ptr& dev, std::string_view librarySource, std::string_view vertexEntryPoint, std::string_view fragmentEntryPoint, std::unique_ptr& stages) { Result ret; stages = ShaderStagesCreator::fromLibraryStringInput(*dev, librarySource.data(), std::string(vertexEntryPoint), std::string(fragmentEntryPoint), "", &ret); ASSERT_EQ(ret.code, Result::Code::Ok) << ret.message; ASSERT_TRUE(stages != nullptr); } void createSimpleShaderStages(const std::shared_ptr& dev, std::unique_ptr& stages, TextureFormat outputFormat) { const auto backendVersion = dev->getBackendVersion(); if (backendVersion.flavor == igl::BackendFlavor::OpenGL || backendVersion.flavor == igl::BackendFlavor::OpenGL_ES) { const bool isGles3 = backendVersion.flavor == igl::BackendFlavor::OpenGL_ES && backendVersion.majorVersion >= 3; std::string_view vertexShader = isGles3 ? igl::tests::data::shader::kOglSimpleVertShaderEs3 : igl::tests::data::shader::kOglSimpleVertShader; std::string_view fragmentShader = isGles3 ? igl::tests::data::shader::kOglSimpleFragShaderEs3 : igl::tests::data::shader::kOglSimpleFragShader; createShaderStages(dev, vertexShader, igl::tests::data::shader::kShaderFunc, fragmentShader, igl::tests::data::shader::kShaderFunc, stages); } else if (backendVersion.flavor == igl::BackendFlavor::Metal) { std::string_view shader = igl::tests::data::shader::kMtlSimpleShader; if (outputFormat == TextureFormat::RG_UInt16) { shader = igl::tests::data::shader::kMtlSimpleShaderUshort2; } else if (outputFormat == TextureFormat::R_UInt16) { shader = igl::tests::data::shader::kMtlSimpleShaderUshort2; } else if (outputFormat == TextureFormat::RGB10_A2_Uint_Rev) { shader = igl::tests::data::shader::kMtlSimpleShaderUshort4; } else if (outputFormat == TextureFormat::RGBA_UInt32) { shader = igl::tests::data::shader::kMtlSimpleShaderUint4; } else if (outputFormat == TextureFormat::R_UInt32) { shader = igl::tests::data::shader::kMtlSimpleShaderUint; } else if (outputFormat != TextureFormat::Invalid) { auto components = TextureFormatProperties::fromTextureFormat(outputFormat).componentsPerPixel; switch (components) { case 1: shader = igl::tests::data::shader::kMtlSimpleShaderFloat; break; case 2: shader = igl::tests::data::shader::kMtlSimpleShaderFloat2; break; case 3: shader = igl::tests::data::shader::kMtlSimpleShaderFloat3; break; case 4: shader = igl::tests::data::shader::kMtlSimpleShaderFloat4; break; default: ASSERT_TRUE(false); break; } } createShaderStages(dev, shader, igl::tests::data::shader::kSimpleVertFunc, igl::tests::data::shader::kSimpleFragFunc, stages); } else if (backendVersion.flavor == igl::BackendFlavor::Vulkan) { // Output format-specific shaders needed for MoltenVK std::string_view fragShader = igl::tests::data::shader::kVulkanSimpleFragShader; if (outputFormat == TextureFormat::RG_UInt16) { fragShader = igl::tests::data::shader::kVulkanSimpleFragShaderUint2; } else if (outputFormat == TextureFormat::R_UInt16) { fragShader = igl::tests::data::shader::kVulkanSimpleFragShaderUint2; } else if (outputFormat == TextureFormat::RGB10_A2_Uint_Rev) { fragShader = igl::tests::data::shader::kVulkanSimpleFragShaderUint4; } else if (outputFormat == TextureFormat::RGBA_UInt32) { fragShader = igl::tests::data::shader::kVulkanSimpleFragShaderUint4; } else if (outputFormat == TextureFormat::R_UInt32) { fragShader = igl::tests::data::shader::kVulkanSimpleFragShaderUint; } else if (outputFormat != TextureFormat::Invalid) { auto components = TextureFormatProperties::fromTextureFormat(outputFormat).componentsPerPixel; switch (components) { case 1: fragShader = igl::tests::data::shader::kVulkanSimpleFragShaderFloat; break; case 2: fragShader = igl::tests::data::shader::kVulkanSimpleFragShaderFloat2; break; case 3: fragShader = igl::tests::data::shader::kVulkanSimpleFragShaderFloat3; break; case 4: fragShader = igl::tests::data::shader::kVulkanSimpleFragShaderFloat4; break; default: ASSERT_TRUE(false); break; } } createShaderStages(dev, igl::tests::data::shader::kVulkanSimpleVertShader, std::string(igl::tests::data::shader::kShaderFunc), fragShader, std::string(igl::tests::data::shader::kShaderFunc), stages); } else if (backendVersion.flavor == igl::BackendFlavor::D3D12) { // Minimal HLSL equivalent used for D3D12 tests const char* vsHlsl = R"( struct VSIn { float4 position_in : POSITION; float2 uv_in : TEXCOORD0; }; struct PSIn { float4 position : SV_POSITION; float2 uv : TEXCOORD0; }; PSIn main(VSIn i) { PSIn o; o.position = i.position_in; o.uv = i.uv_in; return o; } )"; const char* psHlsl = R"( Texture2D inputImage : register(t0); SamplerState samp0 : register(s0); struct PSIn { float4 position : SV_POSITION; float2 uv : TEXCOORD0; }; float4 main(PSIn i) : SV_TARGET { return inputImage.Sample(samp0, i.uv); } )"; createShaderStages(dev, vsHlsl, std::string("main"), psHlsl, std::string("main"), stages); } else { ASSERT_TRUE(0); } } } // namespace igl::tests::util ================================================ FILE: src/igl/tests/util/Common.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #if IGL_PLATFORM_IOS || IGL_PLATFORM_MACOSX #include "simd/simd.h" #else #include "simdstub.h" #endif namespace igl::tests::util { constexpr std::string_view kBackendOgl("ogl"); constexpr std::string_view kBackendMtl("metal"); constexpr std::string_view kBackendVul("vulkan"); constexpr std::string_view kBackendD3D12("d3d12"); // Creates an IGL device and a command queue void createDeviceAndQueue(std::shared_ptr& dev, std::shared_ptr& cq); void createShaderStages(const std::shared_ptr& dev, std::string_view vertexSource, std::string_view vertexEntryPoint, std::string_view fragmentSource, std::string_view fragmentEntryPoint, std::unique_ptr& stages); void createShaderStages(const std::shared_ptr& dev, std::string_view librarySource, std::string_view vertexEntryPoint, std::string_view fragmentEntryPoint, std::unique_ptr& stages); void createSimpleShaderStages(const std::shared_ptr& dev, std::unique_ptr& stages, TextureFormat outputFormat = TextureFormat::Invalid); } // namespace igl::tests::util ================================================ FILE: src/igl/tests/util/Half.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #define IGL_USE_CUSTOM_HALF 1 #if IGL_USE_CUSTOM_HALF #include namespace igl::tests::util { struct Half { public: constexpr Half() noexcept = default; explicit Half(float f) { data_ = glm::packHalf1x16(f); } Half& operator=(float f) { data_ = glm::packHalf1x16(f); return *this; } operator float() const { return glm::unpackHalf1x16(data_); } private: uint16_t data_ = 0; template friend std::basic_ostream& operator<<(std::basic_ostream& /*out*/, Half /*arg*/); }; template std::basic_ostream& operator<<(std::basic_ostream& out, Half arg) { return out << glm::unpackHalf1x16(arg.data_); } using TestHalf = Half; } // namespace igl::tests::util #else #include namespace igl::tests::util { using TestHalf = half_float::half; } // namespace igl::tests::util #endif ================================================ FILE: src/igl/tests/util/SpvModules.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "SpvModules.h" namespace igl::tests { const std::vector& getUniformBufferSpvWords() { /** OpCapability Shader OpMemoryModel Logical Simple OpEntryPoint CombinedVF %main "main" %builtinPosition %_1 OpMemberName %UBO0 0 "x0" OpName %UBO0 "UBO0" OpName %ubo0 "ubo0" OpName %x1 "x1" OpName %x2 "x2" OpMemberName %UBO3 0 "x3" OpName %UBO3 "UBO3" OpName %ubo3 "ubo3" OpName %f "f" OpName %main "main" OpDecorate %builtinPosition BuiltIn Position OpDecorate %_1 Location 0 OpDecorate %UBO0 Block OpMemberDecorate %UBO0 0 Offset 0 OpDecorate %ubo0 DescriptorSet 0 OpDecorate %ubo0 Binding 0 OpDecorate %UBO3 Block OpMemberDecorate %UBO3 0 Offset 0 OpDecorate %ubo3 DescriptorSet 0 OpDecorate %ubo3 Binding 3 %float = OpTypeFloat 32 %v4float = OpTypeVector %float 4 %ptr_Output_v4float = OpTypePointer Output %v4float %builtinPosition = OpVariable %ptr_Output_v4float Output %_1 = OpVariable %ptr_Output_v4float Output %UBO0 = OpTypeStruct %float %ptr_Uniform_UBO0 = OpTypePointer Uniform %UBO0 %ubo0 = OpVariable %ptr_Uniform_UBO0 Uniform %int = OpTypeInt 32 1 %_16i = OpConstant %int 16 %arr_float__16i = OpTypeArray %float %_16i %ptr_UniformConstant_arr_float__16i = OpTypePointer UniformConstant %arr_float__16i %x1 = OpVariable %ptr_UniformConstant_arr_float__16i UniformConstant %ptr_UniformConstant_float = OpTypePointer UniformConstant %float %x2 = OpVariable %ptr_UniformConstant_float UniformConstant %UBO3 = OpTypeStruct %float %ptr_Uniform_UBO3 = OpTypePointer Uniform %UBO3 %ubo3 = OpVariable %ptr_Uniform_UBO3 Uniform %void = OpTypeVoid %func = OpTypeFunction %void %ptr_Uniform_float = OpTypePointer Uniform %float %_0i = OpConstant %int 0 %ptr_Function_v4float = OpTypePointer Function %v4float %main = OpFunction %void None %func %_2 = OpLabel %f = OpVariable %ptr_Function_v4float Function %_3 = OpAccessChain %ptr_Uniform_float %ubo0 %_0i %_4 = OpLoad %float %_3 %_5 = OpLoad %arr_float__16i %x1 %_6 = OpCompositeExtract %float %_5 1 %_7 = OpLoad %float %x2 %_8 = OpAccessChain %ptr_Uniform_float %ubo3 %_0i %_9 = OpLoad %float %_8 %_10 = OpCompositeConstruct %v4float %_4 %_6 %_7 %_9 OpStore %f %_10 %_11 = OpLoad %v4float %f OpStore %builtinPosition %_11 %_12 = OpLoad %v4float %f OpStore %_1 %_12 OpReturn OpFunctionEnd */ static const std::vector kUniformBufferSpvWords = { 0x07230203, 0x00010000, 0xdeadbeef, 0x0000003e, 0x00000000, 0x00020011, 0x00000001, 0x0003000e, 0x00000000, 0x00000000, 0x0006000f, 0x00000000, 0x00000025, 0x6e69616d, 0x00000000, 0x00000002, 0x0006000f, 0x00000004, 0x00000026, 0x6e69616d, 0x00000000, 0x00000003, 0x00030010, 0x00000026, 0x00000008, 0x00040005, 0x00000004, 0x304f4255, 0x00000000, 0x00040006, 0x00000004, 0x00000000, 0x00003078, 0x00040005, 0x00000008, 0x334f4255, 0x00000000, 0x00040006, 0x00000008, 0x00000000, 0x00003378, 0x00040005, 0x00000005, 0x306f6275, 0x00000000, 0x00030005, 0x00000006, 0x00003178, 0x00030005, 0x00000007, 0x00003278, 0x00040005, 0x00000009, 0x336f6275, 0x00000000, 0x00040005, 0x00000025, 0x6e69616d, 0x00000000, 0x00030005, 0x00000037, 0x00000066, 0x00040005, 0x00000026, 0x6e69616d, 0x00000000, 0x00030005, 0x00000038, 0x00000066, 0x00030047, 0x00000004, 0x00000002, 0x00050048, 0x00000004, 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00000008, 0x00000002, 0x00050048, 0x00000008, 0x00000000, 0x00000023, 0x00000000, 0x00040047, 0x00000002, 0x0000000b, 0x00000000, 0x00040047, 0x00000003, 0x0000001e, 0x00000000, 0x00040047, 0x00000005, 0x00000022, 0x00000000, 0x00040047, 0x00000005, 0x00000021, 0x00000000, 0x00040047, 0x00000009, 0x00000022, 0x00000000, 0x00040047, 0x00000009, 0x00000021, 0x00000003, 0x00030016, 0x0000000b, 0x00000020, 0x00040015, 0x0000000f, 0x00000020, 0x00000001, 0x0004002b, 0x0000000f, 0x00000010, 0x00000010, 0x0004002b, 0x0000000f, 0x00000018, 0x00000000, 0x00040017, 0x0000000c, 0x0000000b, 0x00000004, 0x00040020, 0x0000000d, 0x00000003, 0x0000000c, 0x0003001e, 0x00000004, 0x0000000b, 0x00040020, 0x0000000e, 0x00000002, 0x00000004, 0x0004001c, 0x00000011, 0x0000000b, 0x00000010, 0x00040020, 0x00000012, 0x00000000, 0x00000011, 0x00040020, 0x00000013, 0x00000000, 0x0000000b, 0x0003001e, 0x00000008, 0x0000000b, 0x00040020, 0x00000014, 0x00000002, 0x00000008, 0x00020013, 0x00000015, 0x00030021, 0x00000016, 0x00000015, 0x00040020, 0x00000017, 0x00000002, 0x0000000b, 0x00040017, 0x00000039, 0x0000000b, 0x00000002, 0x00040017, 0x0000003a, 0x0000000b, 0x00000003, 0x00040017, 0x0000003b, 0x0000000f, 0x00000002, 0x00040017, 0x0000003c, 0x0000000f, 0x00000003, 0x00040017, 0x0000003d, 0x0000000f, 0x00000004, 0x0004003b, 0x0000000d, 0x00000002, 0x00000003, 0x0004003b, 0x0000000d, 0x00000003, 0x00000003, 0x0004003b, 0x0000000e, 0x00000005, 0x00000002, 0x0004003b, 0x00000012, 0x00000006, 0x00000000, 0x0004003b, 0x00000013, 0x00000007, 0x00000000, 0x0004003b, 0x00000014, 0x00000009, 0x00000002, 0x00050036, 0x00000015, 0x00000025, 0x00000000, 0x00000016, 0x000200f8, 0x00000027, 0x00050041, 0x00000017, 0x00000029, 0x00000005, 0x00000018, 0x0004003d, 0x0000000b, 0x0000002b, 0x00000029, 0x0004003d, 0x00000011, 0x0000002d, 0x00000006, 0x00050051, 0x0000000b, 0x0000002f, 0x0000002d, 0x00000001, 0x0004003d, 0x0000000b, 0x00000031, 0x00000007, 0x00050041, 0x00000017, 0x00000033, 0x00000009, 0x00000018, 0x0004003d, 0x0000000b, 0x00000035, 0x00000033, 0x00070050, 0x0000000c, 0x00000037, 0x0000002b, 0x0000002f, 0x00000031, 0x00000035, 0x0003003e, 0x00000002, 0x00000037, 0x000100fd, 0x00010038, 0x00050036, 0x00000015, 0x00000026, 0x00000000, 0x00000016, 0x000200f8, 0x00000028, 0x00050041, 0x00000017, 0x0000002a, 0x00000005, 0x00000018, 0x0004003d, 0x0000000b, 0x0000002c, 0x0000002a, 0x0004003d, 0x00000011, 0x0000002e, 0x00000006, 0x00050051, 0x0000000b, 0x00000030, 0x0000002e, 0x00000001, 0x0004003d, 0x0000000b, 0x00000032, 0x00000007, 0x00050041, 0x00000017, 0x00000034, 0x00000009, 0x00000018, 0x0004003d, 0x0000000b, 0x00000036, 0x00000034, 0x00070050, 0x0000000c, 0x00000038, 0x0000002c, 0x00000030, 0x00000032, 0x00000036, 0x0003003e, 0x00000003, 0x00000038, 0x000100fd, 0x00010038, }; return kUniformBufferSpvWords; } const std::vector& getTextureSpvWords() { /** OpCapability Shader OpMemoryModel Logical Simple OpEntryPoint CombinedVF %main "main" %builtinPosition %_1 OpName %s0 "s0" OpName %s1 "s1" OpName %s2 "s2" OpName %s3 "s3" OpName %f "f" OpName %main "main" OpDecorate %builtinPosition BuiltIn Position OpDecorate %_1 Location 0 OpDecorate %s1 DescriptorSet 0 OpDecorate %s1 Binding 1 OpDecorate %s3 DescriptorSet 0 OpDecorate %s3 Binding 3 %float = OpTypeFloat 32 %v4float = OpTypeVector %float 4 %ptr_Output_v4float = OpTypePointer Output %v4float %builtinPosition = OpVariable %ptr_Output_v4float Output %_1 = OpVariable %ptr_Output_v4float Output %image_2D = OpTypeImage %float 2D 0 0 0 1 Unknown %sampled_image_2D = OpTypeSampledImage %image_2D %ptr_UniformConstant_sampled_image_2D = OpTypePointer UniformConstant %sampled_image_2D %s0 = OpVariable %ptr_UniformConstant_sampled_image_2D UniformConstant %s1 = OpVariable %ptr_UniformConstant_sampled_image_2D UniformConstant %s2 = OpVariable %ptr_UniformConstant_sampled_image_2D UniformConstant %s3 = OpVariable %ptr_UniformConstant_sampled_image_2D UniformConstant %void = OpTypeVoid %func = OpTypeFunction %void %_0_0f = OpConstant %float 0.0 %v4floatc = OpConstantComposite %v4float %_0_0f %_0_0f %_0_0f %_0_0f %v2float = OpTypeVector %float 2 %v2floatc = OpConstantComposite %v2float %_0_0f %_0_0f %_0_1f = OpConstant %float 0.1 %v2floatc2 = OpConstantComposite %v2float %_0_1f %_0_1f %_0_2f = OpConstant %float 0.2 %v2floatc3 = OpConstantComposite %v2float %_0_2f %_0_2f %_0_30000001f = OpConstant %float 0.30000001 %v2floatc4 = OpConstantComposite %v2float %_0_30000001f %_0_30000001f %ptr_Function_v4float = OpTypePointer Function %v4float %main = OpFunction %void None %func %_2 = OpLabel %f = OpVariable %ptr_Function_v4float Function OpStore %builtinPosition %v4floatc %_3 = OpLoad %sampled_image_2D %s0 %_4 = OpImageSampleImplicitLod %v4float %_3 %v2floatc %_5 = OpLoad %sampled_image_2D %s1 %_6 = OpImageSampleImplicitLod %v4float %_5 %v2floatc2 %_7 = OpFAdd %v4float %_4 %_6 %_8 = OpLoad %sampled_image_2D %s2 %_9 = OpImageSampleImplicitLod %v4float %_8 %v2floatc3 %_10 = OpFAdd %v4float %_7 %_9 %_11 = OpLoad %sampled_image_2D %s3 %_12 = OpImageSampleImplicitLod %v4float %_11 %v2floatc4 %_13 = OpFAdd %v4float %_10 %_12 OpStore %f %_13 %_14 = OpLoad %v4float %f OpStore %_1 %_14 OpReturn OpFunctionEnd */ static const std::vector kTextureSpvWords = { 0x07230203, 0x00010000, 0xdeadbeef, 0x00000036, 0x00000000, 0x00020011, 0x00000001, 0x0003000e, 0x00000000, 0x00000000, 0x0006000f, 0x00000000, 0x00000029, 0x6e69616d, 0x00000000, 0x00000002, 0x0006000f, 0x00000004, 0x0000002a, 0x6e69616d, 0x00000000, 0x00000003, 0x00030010, 0x0000002a, 0x00000008, 0x00030005, 0x00000004, 0x00003073, 0x00030005, 0x00000005, 0x00003173, 0x00030005, 0x00000006, 0x00003273, 0x00030005, 0x00000007, 0x00003373, 0x00040005, 0x00000029, 0x6e69616d, 0x00000000, 0x00040005, 0x0000002a, 0x6e69616d, 0x00000000, 0x00030005, 0x00000027, 0x00000066, 0x00040047, 0x00000002, 0x0000000b, 0x00000000, 0x00040047, 0x00000003, 0x0000001e, 0x00000000, 0x00040047, 0x00000005, 0x00000022, 0x00000000, 0x00040047, 0x00000005, 0x00000021, 0x00000001, 0x00040047, 0x00000007, 0x00000022, 0x00000000, 0x00040047, 0x00000007, 0x00000021, 0x00000003, 0x00030016, 0x00000009, 0x00000020, 0x0004002b, 0x00000009, 0x00000011, 0x00000000, 0x0004002b, 0x00000009, 0x00000015, 0x3dcccccd, 0x0004002b, 0x00000009, 0x00000017, 0x3e4ccccd, 0x0004002b, 0x00000009, 0x00000019, 0x3e99999a, 0x00040017, 0x0000000a, 0x00000009, 0x00000004, 0x00040020, 0x0000000b, 0x00000003, 0x0000000a, 0x00090019, 0x0000000c, 0x00000009, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0003001b, 0x0000000d, 0x0000000c, 0x00040020, 0x0000000e, 0x00000000, 0x0000000d, 0x00020013, 0x0000000f, 0x00030021, 0x00000010, 0x0000000f, 0x00040017, 0x00000013, 0x00000009, 0x00000002, 0x00040017, 0x00000035, 0x00000009, 0x00000003, 0x0007002c, 0x0000000a, 0x00000012, 0x00000011, 0x00000011, 0x00000011, 0x00000011, 0x0005002c, 0x00000013, 0x00000014, 0x00000011, 0x00000011, 0x0005002c, 0x00000013, 0x00000016, 0x00000015, 0x00000015, 0x0005002c, 0x00000013, 0x00000018, 0x00000017, 0x00000017, 0x0005002c, 0x00000013, 0x0000001a, 0x00000019, 0x00000019, 0x0004003b, 0x0000000b, 0x00000002, 0x00000003, 0x0004003b, 0x0000000b, 0x00000003, 0x00000003, 0x0004003b, 0x0000000e, 0x00000004, 0x00000000, 0x0004003b, 0x0000000e, 0x00000005, 0x00000000, 0x0004003b, 0x0000000e, 0x00000006, 0x00000000, 0x0004003b, 0x0000000e, 0x00000007, 0x00000000, 0x00050036, 0x0000000f, 0x00000029, 0x00000000, 0x00000010, 0x000200f8, 0x0000002b, 0x0003003e, 0x00000002, 0x00000012, 0x000100fd, 0x00010038, 0x00050036, 0x0000000f, 0x0000002a, 0x00000000, 0x00000010, 0x000200f8, 0x0000002c, 0x0004003d, 0x0000000d, 0x0000002e, 0x00000004, 0x00050057, 0x0000000a, 0x0000001e, 0x0000002e, 0x00000014, 0x0004003d, 0x0000000d, 0x00000030, 0x00000005, 0x00050057, 0x0000000a, 0x00000020, 0x00000030, 0x00000016, 0x00050081, 0x0000000a, 0x00000021, 0x0000001e, 0x00000020, 0x0004003d, 0x0000000d, 0x00000032, 0x00000006, 0x00050057, 0x0000000a, 0x00000023, 0x00000032, 0x00000018, 0x00050081, 0x0000000a, 0x00000024, 0x00000021, 0x00000023, 0x0004003d, 0x0000000d, 0x00000034, 0x00000007, 0x00050057, 0x0000000a, 0x00000026, 0x00000034, 0x0000001a, 0x00050081, 0x0000000a, 0x00000027, 0x00000024, 0x00000026, 0x0003003e, 0x00000003, 0x00000027, 0x000100fd, 0x00010038, }; return kTextureSpvWords; } const std::vector& getTextureWithDescriptorSetSpvWords() { /* OpCapability Shader OpMemoryModel Logical Simple OpEntryPoint CombinedVF %main "main" %uv %fragColor OpName %tex0 "tex0" OpName %tex1 "tex1" OpName %uv "uv" OpName %fragColor "fragColor" OpName %main "main" OpDecorate %tex0 Binding 1 OpDecorate %tex0 DescriptorSet 0 OpDecorate %tex1 Binding 2 OpDecorate %tex1 DescriptorSet 1 %float = OpTypeFloat 32 %image_2D = OpTypeImage %float 2D 0 0 0 1 Unknown %sampled_image_2D = OpTypeSampledImage %image_2D %ptr_UniformConstant_sampled_image_2D = OpTypePointer UniformConstant %sampled_image_2D %tex0 = OpVariable %ptr_UniformConstant_sampled_image_2D UniformConstant %tex1 = OpVariable %ptr_UniformConstant_sampled_image_2D UniformConstant %v2float = OpTypeVector %float 2 %ptr_Input_v2float = OpTypePointer Input %v2float %uv = OpVariable %ptr_Input_v2float Input %v4float = OpTypeVector %float 4 %ptr_Output_v4float = OpTypePointer Output %v4float %fragColor = OpVariable %ptr_Output_v4float Output %void = OpTypeVoid %func = OpTypeFunction %void %main = OpFunction %void None %func %_1 = OpLabel %_2 = OpLoad %sampled_image_2D %tex0 %_3 = OpLoad %v2float %uv %_4 = OpImageSampleImplicitLod %v4float %_2 %_3 %_5 = OpLoad %sampled_image_2D %tex1 %_6 = OpLoad %v2float %uv %_7 = OpImageSampleImplicitLod %v4float %_5 %_6 %_8 = OpFAdd %v4float %_4 %_7 OpStore %fragColor %_8 OpReturn OpFunctionEnd */ static const std::vector kTextureWithDescriptorSetSpvWords = { 0x07230203, 0x00010000, 0xdeadbeef, 0x00000025, 0x00000000, 0x00020011, 0x00000001, 0x0003000e, 0x00000000, 0x00000000, 0x0007000f, 0x00000000, 0x00000018, 0x6e69616d, 0x00000000, 0x00000002, 0x0000001e, 0x0007000f, 0x00000004, 0x00000019, 0x6e69616d, 0x00000000, 0x00000003, 0x0000001f, 0x00030010, 0x00000019, 0x00000008, 0x00040005, 0x00000004, 0x30786574, 0x00000000, 0x00040005, 0x00000005, 0x31786574, 0x00000000, 0x00030005, 0x00000002, 0x00007675, 0x00050005, 0x00000003, 0x67617266, 0x6f6c6f43, 0x00000072, 0x00040005, 0x00000018, 0x6e69616d, 0x00000000, 0x00040005, 0x00000019, 0x6e69616d, 0x00000000, 0x00040047, 0x00000004, 0x00000022, 0x00000000, 0x00040047, 0x00000004, 0x00000021, 0x00000001, 0x00040047, 0x00000005, 0x00000022, 0x00000001, 0x00040047, 0x00000005, 0x00000021, 0x00000002, 0x00040047, 0x00000002, 0x0000001e, 0x00000000, 0x00040047, 0x00000003, 0x0000001e, 0x00000000, 0x00040047, 0x0000001e, 0x0000001e, 0x00000000, 0x00040047, 0x0000001f, 0x0000001e, 0x00000000, 0x00030016, 0x00000006, 0x00000020, 0x00090019, 0x00000007, 0x00000006, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0003001b, 0x00000008, 0x00000007, 0x00040020, 0x00000009, 0x00000000, 0x00000008, 0x00040017, 0x0000000a, 0x00000006, 0x00000002, 0x00040020, 0x0000000b, 0x00000001, 0x0000000a, 0x00040017, 0x0000000c, 0x00000006, 0x00000004, 0x00040020, 0x0000000d, 0x00000003, 0x0000000c, 0x00020013, 0x0000000e, 0x00030021, 0x0000000f, 0x0000000e, 0x00040020, 0x00000023, 0x00000003, 0x0000000a, 0x00040017, 0x00000024, 0x00000006, 0x00000003, 0x0004003b, 0x00000009, 0x00000004, 0x00000000, 0x0004003b, 0x00000009, 0x00000005, 0x00000000, 0x0004003b, 0x0000000b, 0x00000002, 0x00000001, 0x0004003b, 0x0000000d, 0x00000003, 0x00000003, 0x0004003b, 0x00000023, 0x0000001e, 0x00000003, 0x0004003b, 0x0000000b, 0x0000001f, 0x00000001, 0x00050036, 0x0000000e, 0x00000018, 0x00000000, 0x0000000f, 0x000200f8, 0x0000001a, 0x0004003d, 0x0000000a, 0x00000012, 0x00000002, 0x0003003e, 0x0000001e, 0x00000012, 0x000100fd, 0x00010038, 0x00050036, 0x0000000e, 0x00000019, 0x00000000, 0x0000000f, 0x000200f8, 0x0000001b, 0x0004003d, 0x00000008, 0x0000001d, 0x00000004, 0x0004003d, 0x0000000a, 0x00000020, 0x0000001f, 0x00050057, 0x0000000c, 0x00000013, 0x0000001d, 0x00000020, 0x0004003d, 0x00000008, 0x00000022, 0x00000005, 0x00050057, 0x0000000c, 0x00000016, 0x00000022, 0x00000020, 0x00050081, 0x0000000c, 0x00000017, 0x00000013, 0x00000016, 0x0003003e, 0x00000003, 0x00000017, 0x000100fd, 0x00010038, }; return kTextureWithDescriptorSetSpvWords; } const std::vector& getTinyMeshFragmentShaderSpvWords() { /* OpCapability Shader OpCapability ImageQuery %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" %mtl %vtx %out_FragColor OpExecutionMode %main OriginUpperLeft OpSource GLSL 460 OpName %main "main" OpName %textureBindless2D_u1_vf2_ "textureBindless2D(u1;vf2;" OpName %textureid "textureid" OpName %uv "uv" OpName %PCF3_vf3_ "PCF3(vf3;" OpName %uvw "uvw" OpName %shadow_vf4_ "shadow(vf4;" OpName %s "s" OpName %size "size" OpName %texShadow "texShadow" OpName %shadow "shadow" OpName %v "v" OpName %u "u" OpName %depthBias "depthBias" OpName %shadowSample "shadowSample" OpName %param "param" OpName %alpha "alpha" OpName %Material "Material" OpMemberName %Material 0 "ambient" OpMemberName %Material 1 "diffuse" OpMemberName %Material 2 "texAmbient" OpMemberName %Material 3 "texDiffuse" OpMemberName %Material 4 "texAlpha" OpMemberName %Material 5 "padding" OpName %mtl "mtl" OpName %PerVertex "PerVertex" OpMemberName %PerVertex 0 "normal" OpMemberName %PerVertex 1 "uv" OpMemberName %PerVertex 2 "shadowCoords" OpName %vtx "vtx" OpName %param_0 "param" OpName %param_1 "param" OpName %Ka "Ka" OpName %param_2 "param" OpName %param_3 "param" OpName %Kd "Kd" OpName %param_4 "param" OpName %param_5 "param" OpName %drawNormals "drawNormals" OpName %UniformsPerFrame "UniformsPerFrame" OpMemberName %UniformsPerFrame 0 "proj" OpMemberName %UniformsPerFrame 1 "view" OpMemberName %UniformsPerFrame 2 "light" OpMemberName %UniformsPerFrame 3 "bDrawNormals" OpMemberName %UniformsPerFrame 4 "bDebugLines" OpMemberName %UniformsPerFrame 5 "padding" OpName %PerFrame "PerFrame" OpMemberName %PerFrame 0 "perFrame" OpName %_ "" OpName %n "n" OpName %NdotL1 "NdotL1" OpName %NdotL2 "NdotL2" OpName %NdotL "NdotL" OpName %diffuse "diffuse" OpName %texSkyboxIrradiance "texSkyboxIrradiance" OpName %out_FragColor "out_FragColor" OpName %param_6 "param" OpDecorate %texShadow DescriptorSet 0 OpDecorate %texShadow Binding 0 OpDecorate %mtl Flat OpDecorate %mtl Location 5 OpDecorate %vtx Location 0 OpMemberDecorate %UniformsPerFrame 0 ColMajor OpMemberDecorate %UniformsPerFrame 0 Offset 0 OpMemberDecorate %UniformsPerFrame 0 MatrixStride 16 OpMemberDecorate %UniformsPerFrame 1 ColMajor OpMemberDecorate %UniformsPerFrame 1 Offset 64 OpMemberDecorate %UniformsPerFrame 1 MatrixStride 16 OpMemberDecorate %UniformsPerFrame 2 ColMajor OpMemberDecorate %UniformsPerFrame 2 Offset 128 OpMemberDecorate %UniformsPerFrame 2 MatrixStride 16 OpMemberDecorate %UniformsPerFrame 3 Offset 192 OpMemberDecorate %UniformsPerFrame 4 Offset 196 OpMemberDecorate %UniformsPerFrame 5 Offset 200 OpMemberDecorate %PerFrame 0 Offset 0 OpDecorate %PerFrame Block OpDecorate %_ DescriptorSet 1 OpDecorate %_ Binding 0 OpDecorate %texSkyboxIrradiance DescriptorSet 0 OpDecorate %texSkyboxIrradiance Binding 4 OpDecorate %out_FragColor Location 0 %void = OpTypeVoid %3 = OpTypeFunction %void %uint = OpTypeInt 32 0 %_ptr_Function_uint = OpTypePointer Function %uint %float = OpTypeFloat 32 %v2float = OpTypeVector %float 2 %_ptr_Function_v2float = OpTypePointer Function %v2float %v4float = OpTypeVector %float 4 %12 = OpTypeFunction %v4float %_ptr_Function_uint %_ptr_Function_v2float %v3float = OpTypeVector %float 3 %_ptr_Function_v3float = OpTypePointer Function %v3float %19 = OpTypeFunction %float %_ptr_Function_v3float %_ptr_Function_v4float = OpTypePointer Function %v4float %24 = OpTypeFunction %float %_ptr_Function_v4float %float_1 = OpConstant %float 1 %29 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1 %_ptr_Function_float = OpTypePointer Function %float %34 = OpTypeImage %float 2D 1 0 0 1 Unknown %35 = OpTypeSampledImage %34 %_ptr_UniformConstant_35 = OpTypePointer UniformConstant %35 %texShadow = OpVariable %_ptr_UniformConstant_35 UniformConstant %int = OpTypeInt 32 1 %int_0 = OpConstant %int 0 %v2int = OpTypeVector %int 2 %uint_0 = OpConstant %uint 0 %float_0 = OpConstant %float 0 %_ptr_Function_int = OpTypePointer Function %int %int_n1 = OpConstant %int -1 %int_1 = OpConstant %int 1 %bool = OpTypeBool %float_9 = OpConstant %float 9 %uint_3 = OpConstant %uint 3 %uint_2 = OpConstant %uint 2 %float_n1 = OpConstant %float -1 %float_n4_99999987en05 = OpConstant %float -4.99999987e-05 %uint_1 = OpConstant %uint 1 %float_0_300000012 = OpConstant %float 0.300000012 %Material = OpTypeStruct %v4float %v4float %int %int %int %int %_ptr_Input_Material = OpTypePointer Input %Material %mtl = OpVariable %_ptr_Input_Material Input %int_4 = OpConstant %int 4 %_ptr_Input_int = OpTypePointer Input %int %PerVertex = OpTypeStruct %v3float %v2float %v4float %_ptr_Input_PerVertex = OpTypePointer Input %PerVertex %vtx = OpVariable %_ptr_Input_PerVertex Input %_ptr_Input_v2float = OpTypePointer Input %v2float %float_0_5 = OpConstant %float 0.5 %_ptr_Input_v4float = OpTypePointer Input %v4float %int_2 = OpConstant %int 2 %int_3 = OpConstant %int 3 %_ptr_Function_bool = OpTypePointer Function %bool %mat4v4float = OpTypeMatrix %v4float 4 %UniformsPerFrame = OpTypeStruct %mat4v4float %mat4v4float %mat4v4float %int %int %v2float %PerFrame = OpTypeStruct %UniformsPerFrame %_ptr_Uniform_PerFrame = OpTypePointer Uniform %PerFrame %_ = OpVariable %_ptr_Uniform_PerFrame Uniform %_ptr_Uniform_int = OpTypePointer Uniform %int %_ptr_Input_v3float = OpTypePointer Input %v3float %float_n0_577350259 = OpConstant %float -0.577350259 %float_0_577350259 = OpConstant %float 0.577350259 %221 = OpConstantComposite %v3float %float_n0_577350259 %float_0_577350259 %float_0_577350259 %226 = OpConstantComposite %v3float %float_n0_577350259 %float_0_577350259 %float_n0_577350259 %235 = OpTypeImage %float Cube 0 0 0 1 Unknown %236 = OpTypeSampledImage %235 %_ptr_UniformConstant_236 = OpTypePointer UniformConstant %236 %texSkyboxIrradiance = OpVariable %_ptr_UniformConstant_236 UniformConstant %float_0_959999979 = OpConstant %float 0.959999979 %245 = OpConstantComposite %v4float %float_0_959999979 %float_0_959999979 %float_0_959999979 %float_0_959999979 %_ptr_Output_v4float = OpTypePointer Output %v4float %out_FragColor = OpVariable %_ptr_Output_v4float Output %254 = OpConstantComposite %v3float %float_1 %float_1 %float_1 %main = OpFunction %void None %3 %5 = OpLabel %alpha = OpVariable %_ptr_Function_v4float Function %param_0 = OpVariable %_ptr_Function_uint Function %param_1 = OpVariable %_ptr_Function_v2float Function %Ka = OpVariable %_ptr_Function_v4float Function %param_2 = OpVariable %_ptr_Function_uint Function %param_3 = OpVariable %_ptr_Function_v2float Function %Kd = OpVariable %_ptr_Function_v4float Function %param_4 = OpVariable %_ptr_Function_uint Function %param_5 = OpVariable %_ptr_Function_v2float Function %drawNormals = OpVariable %_ptr_Function_bool Function %n = OpVariable %_ptr_Function_v3float Function %NdotL1 = OpVariable %_ptr_Function_float Function %NdotL2 = OpVariable %_ptr_Function_float Function %NdotL = OpVariable %_ptr_Function_float Function %diffuse = OpVariable %_ptr_Function_v4float Function %250 = OpVariable %_ptr_Function_v4float Function %param_6 = OpVariable %_ptr_Function_v4float Function %143 = OpAccessChain %_ptr_Input_int %mtl %int_4 %144 = OpLoad %int %143 %145 = OpBitcast %uint %144 OpStore %param_0 %145 %152 = OpAccessChain %_ptr_Input_v2float %vtx %int_1 %153 = OpLoad %v2float %152 OpStore %param_1 %153 %154 = OpFunctionCall %v4float %textureBindless2D_u1_vf2_ %param_0 %param_1 OpStore %alpha %154 %155 = OpAccessChain %_ptr_Input_int %mtl %int_4 %156 = OpLoad %int %155 %157 = OpSGreaterThan %bool %156 %int_0 OpSelectionMerge %159 None OpBranchConditional %157 %158 %159 %158 = OpLabel %160 = OpAccessChain %_ptr_Function_float %alpha %uint_0 %161 = OpLoad %float %160 %163 = OpFOrdLessThan %bool %161 %float_0_5 OpBranch %159 %159 = OpLabel %164 = OpPhi %bool %157 %5 %163 %158 OpSelectionMerge %166 None OpBranchConditional %164 %165 %166 %165 = OpLabel OpKill %166 = OpLabel %170 = OpAccessChain %_ptr_Input_v4float %mtl %int_0 %171 = OpLoad %v4float %170 %173 = OpAccessChain %_ptr_Input_int %mtl %int_2 %174 = OpLoad %int %173 %175 = OpBitcast %uint %174 OpStore %param_2 %175 %178 = OpAccessChain %_ptr_Input_v2float %vtx %int_1 %179 = OpLoad %v2float %178 OpStore %param_3 %179 %180 = OpFunctionCall %v4float %textureBindless2D_u1_vf2_ %param_2 %param_3 %181 = OpFMul %v4float %171 %180 OpStore %Ka %181 %183 = OpAccessChain %_ptr_Input_v4float %mtl %int_1 %184 = OpLoad %v4float %183 %186 = OpAccessChain %_ptr_Input_int %mtl %int_3 %187 = OpLoad %int %186 %188 = OpBitcast %uint %187 OpStore %param_4 %188 %191 = OpAccessChain %_ptr_Input_v2float %vtx %int_1 %192 = OpLoad %v2float %191 OpStore %param_5 %192 %193 = OpFunctionCall %v4float %textureBindless2D_u1_vf2_ %param_4 %param_5 %194 = OpFMul %v4float %184 %193 OpStore %Kd %194 %203 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3 %204 = OpLoad %int %203 %205 = OpSGreaterThan %bool %204 %int_0 OpStore %drawNormals %205 %206 = OpAccessChain %_ptr_Function_float %Kd %uint_3 %207 = OpLoad %float %206 %208 = OpFOrdLessThan %bool %207 %float_0_5 OpSelectionMerge %210 None OpBranchConditional %208 %209 %210 %209 = OpLabel OpKill %210 = OpLabel %214 = OpAccessChain %_ptr_Input_v3float %vtx %int_0 %215 = OpLoad %v3float %214 %216 = OpExtInst %v3float %1 Normalize %215 OpStore %n %216 %218 = OpLoad %v3float %n %222 = OpDot %float %218 %221 %223 = OpExtInst %float %1 FClamp %222 %float_0 %float_1 OpStore %NdotL1 %223 %225 = OpLoad %v3float %n %227 = OpDot %float %225 %226 %228 = OpExtInst %float %1 FClamp %227 %float_0 %float_1 OpStore %NdotL2 %228 %230 = OpLoad %float %NdotL1 %231 = OpLoad %float %NdotL2 %232 = OpFAdd %float %230 %231 %233 = OpFMul %float %float_0_5 %232 OpStore %NdotL %233 %239 = OpLoad %236 %texSkyboxIrradiance %240 = OpLoad %v3float %n %241 = OpImageSampleImplicitLod %v4float %239 %240 %242 = OpLoad %v4float %Kd %243 = OpFMul %v4float %241 %242 %246 = OpFMul %v4float %243 %245 OpStore %diffuse %246 %249 = OpLoad %bool %drawNormals OpSelectionMerge %252 None OpBranchConditional %249 %251 %261 %251 = OpLabel %253 = OpLoad %v3float %n %255 = OpFAdd %v3float %253 %254 %256 = OpVectorTimesScalar %v3float %255 %float_0_5 %257 = OpCompositeExtract %float %256 0 %258 = OpCompositeExtract %float %256 1 %259 = OpCompositeExtract %float %256 2 %260 = OpCompositeConstruct %v4float %257 %258 %259 %float_1 OpStore %250 %260 OpBranch %252 %261 = OpLabel %262 = OpLoad %v4float %Ka %263 = OpLoad %v4float %diffuse %265 = OpAccessChain %_ptr_Input_v4float %vtx %int_2 %266 = OpLoad %v4float %265 OpStore %param_6 %266 %267 = OpFunctionCall %float %shadow_vf4_ %param_6 %268 = OpVectorTimesScalar %v4float %263 %267 %269 = OpFAdd %v4float %262 %268 OpStore %250 %269 OpBranch %252 %252 = OpLabel %270 = OpLoad %v4float %250 OpStore %out_FragColor %270 OpReturn OpFunctionEnd %textureBindless2D_u1_vf2_ = OpFunction %v4float None %12 %textureid = OpFunctionParameter %_ptr_Function_uint %uv = OpFunctionParameter %_ptr_Function_v2float %16 = OpLabel OpReturnValue %29 OpFunctionEnd %PCF3_vf3_ = OpFunction %float None %19 %uvw = OpFunctionParameter %_ptr_Function_v3float %22 = OpLabel %size = OpVariable %_ptr_Function_float Function %shadow = OpVariable %_ptr_Function_float Function %v = OpVariable %_ptr_Function_int Function %u = OpVariable %_ptr_Function_int Function %38 = OpLoad %35 %texShadow %41 = OpImage %34 %38 %43 = OpImageQuerySizeLod %v2int %41 %int_0 %45 = OpCompositeExtract %int %43 0 %46 = OpConvertSToF %float %45 %47 = OpFDiv %float %float_1 %46 OpStore %size %47 OpStore %shadow %float_0 OpStore %v %int_n1 OpBranch %53 %53 = OpLabel OpLoopMerge %55 %56 None OpBranch %57 %57 = OpLabel %58 = OpLoad %int %v %61 = OpSLessThanEqual %bool %58 %int_1 OpBranchConditional %61 %54 %55 %54 = OpLabel OpStore %u %int_n1 OpBranch %63 %63 = OpLabel OpLoopMerge %65 %66 None OpBranch %67 %67 = OpLabel %68 = OpLoad %int %u %69 = OpSLessThanEqual %bool %68 %int_1 OpBranchConditional %69 %64 %65 %64 = OpLabel %70 = OpLoad %35 %texShadow %71 = OpLoad %v3float %uvw %72 = OpLoad %float %size %73 = OpLoad %int %u %74 = OpConvertSToF %float %73 %75 = OpLoad %int %v %76 = OpConvertSToF %float %75 %77 = OpCompositeConstruct %v3float %74 %76 %float_0 %78 = OpVectorTimesScalar %v3float %77 %72 %79 = OpFAdd %v3float %71 %78 %80 = OpCompositeExtract %float %79 2 %81 = OpImageSampleDrefImplicitLod %float %70 %79 %80 %82 = OpLoad %float %shadow %83 = OpFAdd %float %82 %81 OpStore %shadow %83 OpBranch %66 %66 = OpLabel %84 = OpLoad %int %u %85 = OpIAdd %int %84 %int_1 OpStore %u %85 OpBranch %63 %65 = OpLabel OpBranch %56 %56 = OpLabel %86 = OpLoad %int %v %87 = OpIAdd %int %86 %int_1 OpStore %v %87 OpBranch %53 %55 = OpLabel %88 = OpLoad %float %shadow %90 = OpFDiv %float %88 %float_9 OpReturnValue %90 OpFunctionEnd %shadow_vf4_ = OpFunction %float None %24 %s = OpFunctionParameter %_ptr_Function_v4float %27 = OpLabel %depthBias = OpVariable %_ptr_Function_float Function %shadowSample = OpVariable %_ptr_Function_float Function %param = OpVariable %_ptr_Function_v3float Function %93 = OpLoad %v4float %s %95 = OpAccessChain %_ptr_Function_float %s %uint_3 %96 = OpLoad %float %95 %97 = OpCompositeConstruct %v4float %96 %96 %96 %96 %98 = OpFDiv %v4float %93 %97 OpStore %s %98 %100 = OpAccessChain %_ptr_Function_float %s %uint_2 %101 = OpLoad %float %100 %103 = OpFOrdGreaterThan %bool %101 %float_n1 OpSelectionMerge %105 None OpBranchConditional %103 %104 %105 %104 = OpLabel %106 = OpAccessChain %_ptr_Function_float %s %uint_2 %107 = OpLoad %float %106 %108 = OpFOrdLessThan %bool %107 %float_1 OpBranch %105 %105 = OpLabel %109 = OpPhi %bool %103 %27 %108 %104 OpSelectionMerge %111 None OpBranchConditional %109 %110 %111 %110 = OpLabel OpStore %depthBias %float_n4_99999987en05 %115 = OpAccessChain %_ptr_Function_float %s %uint_1 %116 = OpLoad %float %115 %117 = OpFSub %float %float_1 %116 %118 = OpAccessChain %_ptr_Function_float %s %uint_1 OpStore %118 %117 %120 = OpAccessChain %_ptr_Function_float %s %uint_0 %121 = OpLoad %float %120 %122 = OpAccessChain %_ptr_Function_float %s %uint_1 %123 = OpLoad %float %122 %124 = OpAccessChain %_ptr_Function_float %s %uint_2 %125 = OpLoad %float %124 %126 = OpLoad %float %depthBias %127 = OpFAdd %float %125 %126 %128 = OpCompositeConstruct %v3float %121 %123 %127 OpStore %param %128 %130 = OpFunctionCall %float %PCF3_vf3_ %param OpStore %shadowSample %130 %132 = OpLoad %float %shadowSample %133 = OpExtInst %float %1 FMix %float_0_300000012 %float_1 %132 OpReturnValue %133 %111 = OpLabel OpReturnValue %float_1 OpFunctionEnd */ static const std::vector kTinyMeshFragmentShader = { 0x07230203, 0x00010000, 0xdeadbeef, 0x00000106, 0x00000000, 0x00020011, 0x00000001, 0x00020011, 0x00000032, 0x0006000b, 0x00000001, 0x4c534c47, 0x6474732e, 0x3035342e, 0x00000000, 0x0003000e, 0x00000000, 0x00000001, 0x0008000f, 0x00000004, 0x00000002, 0x6e69616d, 0x00000000, 0x00000003, 0x00000004, 0x00000005, 0x00030010, 0x00000002, 0x00000007, 0x00030003, 0x00000002, 0x000001cc, 0x00040005, 0x00000002, 0x6e69616d, 0x00000000, 0x00090005, 0x00000006, 0x74786574, 0x42657275, 0x6c646e69, 0x32737365, 0x31752844, 0x3266763b, 0x0000003b, 0x00050005, 0x00000007, 0x74786574, 0x69657275, 0x00000064, 0x00030005, 0x00000008, 0x00007675, 0x00050005, 0x00000009, 0x33464350, 0x33667628, 0x0000003b, 0x00030005, 0x0000000a, 0x00777675, 0x00050005, 0x0000000b, 0x64616873, 0x7628776f, 0x003b3466, 0x00030005, 0x0000000c, 0x00000073, 0x00040005, 0x0000000d, 0x657a6973, 0x00000000, 0x00050005, 0x0000000e, 0x53786574, 0x6f646168, 0x00000077, 0x00040005, 0x0000000f, 0x64616873, 0x0000776f, 0x00030005, 0x00000010, 0x00000076, 0x00030005, 0x00000011, 0x00000075, 0x00050005, 0x00000012, 0x74706564, 0x61694268, 0x00000073, 0x00060005, 0x00000013, 0x64616873, 0x6153776f, 0x656c706d, 0x00000000, 0x00040005, 0x00000014, 0x61726170, 0x0000006d, 0x00040005, 0x00000015, 0x68706c61, 0x00000061, 0x00050005, 0x00000016, 0x6574614d, 0x6c616972, 0x00000000, 0x00050006, 0x00000016, 0x00000000, 0x69626d61, 0x00746e65, 0x00050006, 0x00000016, 0x00000001, 0x66666964, 0x00657375, 0x00060006, 0x00000016, 0x00000002, 0x41786574, 0x6569626d, 0x0000746e, 0x00060006, 0x00000016, 0x00000003, 0x44786574, 0x75666669, 0x00006573, 0x00060006, 0x00000016, 0x00000004, 0x41786574, 0x6168706c, 0x00000000, 0x00050006, 0x00000016, 0x00000005, 0x64646170, 0x00676e69, 0x00030005, 0x00000003, 0x006c746d, 0x00050005, 0x00000017, 0x56726550, 0x65747265, 0x00000078, 0x00050006, 0x00000017, 0x00000000, 0x6d726f6e, 0x00006c61, 0x00040006, 0x00000017, 0x00000001, 0x00007675, 0x00070006, 0x00000017, 0x00000002, 0x64616873, 0x6f43776f, 0x7364726f, 0x00000000, 0x00030005, 0x00000004, 0x00787476, 0x00040005, 0x00000018, 0x61726170, 0x0000006d, 0x00040005, 0x00000019, 0x61726170, 0x0000006d, 0x00030005, 0x0000001a, 0x0000614b, 0x00040005, 0x0000001b, 0x61726170, 0x0000006d, 0x00040005, 0x0000001c, 0x61726170, 0x0000006d, 0x00030005, 0x0000001d, 0x0000644b, 0x00040005, 0x0000001e, 0x61726170, 0x0000006d, 0x00040005, 0x0000001f, 0x61726170, 0x0000006d, 0x00050005, 0x00000020, 0x77617264, 0x6d726f4e, 0x00736c61, 0x00070005, 0x00000021, 0x66696e55, 0x736d726f, 0x46726550, 0x656d6172, 0x00000000, 0x00050006, 0x00000021, 0x00000000, 0x6a6f7270, 0x00000000, 0x00050006, 0x00000021, 0x00000001, 0x77656976, 0x00000000, 0x00050006, 0x00000021, 0x00000002, 0x6867696c, 0x00000074, 0x00070006, 0x00000021, 0x00000003, 0x61724462, 0x726f4e77, 0x736c616d, 0x00000000, 0x00060006, 0x00000021, 0x00000004, 0x62654462, 0x694c6775, 0x0073656e, 0x00050006, 0x00000021, 0x00000005, 0x64646170, 0x00676e69, 0x00050005, 0x00000022, 0x46726550, 0x656d6172, 0x00000000, 0x00060006, 0x00000022, 0x00000000, 0x46726570, 0x656d6172, 0x00000000, 0x00030005, 0x00000023, 0x00000000, 0x00030005, 0x00000024, 0x0000006e, 0x00040005, 0x00000025, 0x746f644e, 0x0000314c, 0x00040005, 0x00000026, 0x746f644e, 0x0000324c, 0x00040005, 0x00000027, 0x746f644e, 0x0000004c, 0x00040005, 0x00000028, 0x66666964, 0x00657375, 0x00070005, 0x00000029, 0x53786574, 0x6f62796b, 0x72724978, 0x61696461, 0x0065636e, 0x00060005, 0x00000005, 0x5f74756f, 0x67617246, 0x6f6c6f43, 0x00000072, 0x00040005, 0x0000002a, 0x61726170, 0x0000006d, 0x00040047, 0x0000000e, 0x00000022, 0x00000000, 0x00040047, 0x0000000e, 0x00000021, 0x00000000, 0x00030047, 0x00000003, 0x0000000e, 0x00040047, 0x00000003, 0x0000001e, 0x00000005, 0x00040047, 0x00000004, 0x0000001e, 0x00000000, 0x00040048, 0x00000021, 0x00000000, 0x00000005, 0x00050048, 0x00000021, 0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x00000021, 0x00000000, 0x00000007, 0x00000010, 0x00040048, 0x00000021, 0x00000001, 0x00000005, 0x00050048, 0x00000021, 0x00000001, 0x00000023, 0x00000040, 0x00050048, 0x00000021, 0x00000001, 0x00000007, 0x00000010, 0x00040048, 0x00000021, 0x00000002, 0x00000005, 0x00050048, 0x00000021, 0x00000002, 0x00000023, 0x00000080, 0x00050048, 0x00000021, 0x00000002, 0x00000007, 0x00000010, 0x00050048, 0x00000021, 0x00000003, 0x00000023, 0x000000c0, 0x00050048, 0x00000021, 0x00000004, 0x00000023, 0x000000c4, 0x00050048, 0x00000021, 0x00000005, 0x00000023, 0x000000c8, 0x00050048, 0x00000022, 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00000022, 0x00000002, 0x00040047, 0x00000023, 0x00000022, 0x00000001, 0x00040047, 0x00000023, 0x00000021, 0x00000000, 0x00040047, 0x00000029, 0x00000022, 0x00000000, 0x00040047, 0x00000029, 0x00000021, 0x00000004, 0x00040047, 0x00000005, 0x0000001e, 0x00000000, 0x00020013, 0x0000002b, 0x00030021, 0x0000002c, 0x0000002b, 0x00040015, 0x0000002d, 0x00000020, 0x00000000, 0x00040020, 0x0000002e, 0x00000007, 0x0000002d, 0x00030016, 0x0000002f, 0x00000020, 0x00040017, 0x00000030, 0x0000002f, 0x00000002, 0x00040020, 0x00000031, 0x00000007, 0x00000030, 0x00040017, 0x00000032, 0x0000002f, 0x00000004, 0x00050021, 0x00000033, 0x00000032, 0x0000002e, 0x00000031, 0x00040017, 0x00000034, 0x0000002f, 0x00000003, 0x00040020, 0x00000035, 0x00000007, 0x00000034, 0x00040021, 0x00000036, 0x0000002f, 0x00000035, 0x00040020, 0x00000037, 0x00000007, 0x00000032, 0x00040021, 0x00000038, 0x0000002f, 0x00000037, 0x0003002b, 0x0000002f, 0x00000039, 0x0007002c, 0x00000032, 0x0000003a, 0x00000039, 0x00000039, 0x00000039, 0x00000039, 0x00040020, 0x0000003b, 0x00000007, 0x0000002f, 0x00090019, 0x0000003c, 0x0000002f, 0x00000001, 0x00000001, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0003001b, 0x0000003d, 0x0000003c, 0x00040020, 0x0000003e, 0x00000000, 0x0000003d, 0x0004003b, 0x0000003e, 0x0000000e, 0x00000000, 0x00040015, 0x0000003f, 0x00000020, 0x00000001, 0x0004002b, 0x0000003f, 0x00000040, 0x00000000, 0x00040017, 0x00000041, 0x0000003f, 0x00000002, 0x0004002b, 0x0000002d, 0x00000042, 0x00000000, 0x0003002b, 0x0000002f, 0x00000043, 0x00040020, 0x00000044, 0x00000007, 0x0000003f, 0x0004002b, 0x0000003f, 0x00000045, 0xffffffff, 0x0004002b, 0x0000003f, 0x00000046, 0x00000001, 0x00020014, 0x00000047, 0x0003002b, 0x0000002f, 0x00000048, 0x0004002b, 0x0000002d, 0x00000049, 0x00000003, 0x0004002b, 0x0000002d, 0x0000004a, 0x00000002, 0x0003002b, 0x0000002f, 0x0000004b, 0x0004002b, 0x0000002f, 0x0000004c, 0xb851b717, 0x0004002b, 0x0000002d, 0x0000004d, 0x00000001, 0x0004002b, 0x0000002f, 0x0000004e, 0x3e99999a, 0x0008001e, 0x00000016, 0x00000032, 0x00000032, 0x0000003f, 0x0000003f, 0x0000003f, 0x0000003f, 0x00040020, 0x0000004f, 0x00000001, 0x00000016, 0x0004003b, 0x0000004f, 0x00000003, 0x00000001, 0x0004002b, 0x0000003f, 0x00000050, 0x00000004, 0x00040020, 0x00000051, 0x00000001, 0x0000003f, 0x0005001e, 0x00000017, 0x00000034, 0x00000030, 0x00000032, 0x00040020, 0x00000052, 0x00000001, 0x00000017, 0x0004003b, 0x00000052, 0x00000004, 0x00000001, 0x00040020, 0x00000053, 0x00000001, 0x00000030, 0x0004002b, 0x0000002f, 0x00000054, 0x3f000000, 0x00040020, 0x00000055, 0x00000001, 0x00000032, 0x0004002b, 0x0000003f, 0x00000056, 0x00000002, 0x0004002b, 0x0000003f, 0x00000057, 0x00000003, 0x00040020, 0x00000058, 0x00000007, 0x00000047, 0x00040018, 0x00000059, 0x00000032, 0x00000004, 0x0008001e, 0x00000021, 0x00000059, 0x00000059, 0x00000059, 0x0000003f, 0x0000003f, 0x00000030, 0x0003001e, 0x00000022, 0x00000021, 0x00040020, 0x0000005a, 0x00000002, 0x00000022, 0x0004003b, 0x0000005a, 0x00000023, 0x00000002, 0x00040020, 0x0000005b, 0x00000002, 0x0000003f, 0x00040020, 0x0000005c, 0x00000001, 0x00000034, 0x0004002b, 0x0000002f, 0x0000005d, 0xbf13cd3a, 0x0004002b, 0x0000002f, 0x0000005e, 0x3f13cd3a, 0x0006002c, 0x00000034, 0x0000005f, 0x0000005d, 0x0000005e, 0x0000005e, 0x0006002c, 0x00000034, 0x00000060, 0x0000005d, 0x0000005e, 0x0000005d, 0x00090019, 0x00000061, 0x0000002f, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0003001b, 0x00000062, 0x00000061, 0x00040020, 0x00000063, 0x00000000, 0x00000062, 0x0004003b, 0x00000063, 0x00000029, 0x00000000, 0x0004002b, 0x0000002f, 0x00000064, 0x3f75c28f, 0x0007002c, 0x00000032, 0x00000065, 0x00000064, 0x00000064, 0x00000064, 0x00000064, 0x00040020, 0x00000066, 0x00000003, 0x00000032, 0x0004003b, 0x00000066, 0x00000005, 0x00000003, 0x0006002c, 0x00000034, 0x00000067, 0x00000039, 0x00000039, 0x00000039, 0x00050036, 0x0000002b, 0x00000002, 0x00000000, 0x0000002c, 0x000200f8, 0x00000068, 0x0004003b, 0x00000037, 0x00000015, 0x00000007, 0x0004003b, 0x0000002e, 0x00000018, 0x00000007, 0x0004003b, 0x00000031, 0x00000019, 0x00000007, 0x0004003b, 0x00000037, 0x0000001a, 0x00000007, 0x0004003b, 0x0000002e, 0x0000001b, 0x00000007, 0x0004003b, 0x00000031, 0x0000001c, 0x00000007, 0x0004003b, 0x00000037, 0x0000001d, 0x00000007, 0x0004003b, 0x0000002e, 0x0000001e, 0x00000007, 0x0004003b, 0x00000031, 0x0000001f, 0x00000007, 0x0004003b, 0x00000058, 0x00000020, 0x00000007, 0x0004003b, 0x00000035, 0x00000024, 0x00000007, 0x0004003b, 0x0000003b, 0x00000025, 0x00000007, 0x0004003b, 0x0000003b, 0x00000026, 0x00000007, 0x0004003b, 0x0000003b, 0x00000027, 0x00000007, 0x0004003b, 0x00000037, 0x00000028, 0x00000007, 0x0004003b, 0x00000037, 0x00000069, 0x00000007, 0x0004003b, 0x00000037, 0x0000002a, 0x00000007, 0x00050041, 0x00000051, 0x0000006a, 0x00000003, 0x00000050, 0x0004003d, 0x0000003f, 0x0000006b, 0x0000006a, 0x0004007c, 0x0000002d, 0x0000006c, 0x0000006b, 0x0003003e, 0x00000018, 0x0000006c, 0x00050041, 0x00000053, 0x0000006d, 0x00000004, 0x00000046, 0x0004003d, 0x00000030, 0x0000006e, 0x0000006d, 0x0003003e, 0x00000019, 0x0000006e, 0x00060039, 0x00000032, 0x0000006f, 0x00000006, 0x00000018, 0x00000019, 0x0003003e, 0x00000015, 0x0000006f, 0x00050041, 0x00000051, 0x00000070, 0x00000003, 0x00000050, 0x0004003d, 0x0000003f, 0x00000071, 0x00000070, 0x000500ad, 0x00000047, 0x00000072, 0x00000071, 0x00000040, 0x000300f7, 0x00000073, 0x00000000, 0x000400fa, 0x00000072, 0x00000074, 0x00000073, 0x000200f8, 0x00000074, 0x00050041, 0x0000003b, 0x00000075, 0x00000015, 0x00000042, 0x0004003d, 0x0000002f, 0x00000076, 0x00000075, 0x000500b8, 0x00000047, 0x00000077, 0x00000076, 0x00000054, 0x000200f9, 0x00000073, 0x000200f8, 0x00000073, 0x000700f5, 0x00000047, 0x00000078, 0x00000072, 0x00000068, 0x00000077, 0x00000074, 0x000300f7, 0x00000079, 0x00000000, 0x000400fa, 0x00000078, 0x0000007a, 0x00000079, 0x000200f8, 0x0000007a, 0x000100fc, 0x000200f8, 0x00000079, 0x00050041, 0x00000055, 0x0000007b, 0x00000003, 0x00000040, 0x0004003d, 0x00000032, 0x0000007c, 0x0000007b, 0x00050041, 0x00000051, 0x0000007d, 0x00000003, 0x00000056, 0x0004003d, 0x0000003f, 0x0000007e, 0x0000007d, 0x0004007c, 0x0000002d, 0x0000007f, 0x0000007e, 0x0003003e, 0x0000001b, 0x0000007f, 0x00050041, 0x00000053, 0x00000080, 0x00000004, 0x00000046, 0x0004003d, 0x00000030, 0x00000081, 0x00000080, 0x0003003e, 0x0000001c, 0x00000081, 0x00060039, 0x00000032, 0x00000082, 0x00000006, 0x0000001b, 0x0000001c, 0x00050085, 0x00000032, 0x00000083, 0x0000007c, 0x00000082, 0x0003003e, 0x0000001a, 0x00000083, 0x00050041, 0x00000055, 0x00000084, 0x00000003, 0x00000046, 0x0004003d, 0x00000032, 0x00000085, 0x00000084, 0x00050041, 0x00000051, 0x00000086, 0x00000003, 0x00000057, 0x0004003d, 0x0000003f, 0x00000087, 0x00000086, 0x0004007c, 0x0000002d, 0x00000088, 0x00000087, 0x0003003e, 0x0000001e, 0x00000088, 0x00050041, 0x00000053, 0x00000089, 0x00000004, 0x00000046, 0x0004003d, 0x00000030, 0x0000008a, 0x00000089, 0x0003003e, 0x0000001f, 0x0000008a, 0x00060039, 0x00000032, 0x0000008b, 0x00000006, 0x0000001e, 0x0000001f, 0x00050085, 0x00000032, 0x0000008c, 0x00000085, 0x0000008b, 0x0003003e, 0x0000001d, 0x0000008c, 0x00060041, 0x0000005b, 0x0000008d, 0x00000023, 0x00000040, 0x00000057, 0x0004003d, 0x0000003f, 0x0000008e, 0x0000008d, 0x000500ad, 0x00000047, 0x0000008f, 0x0000008e, 0x00000040, 0x0003003e, 0x00000020, 0x0000008f, 0x00050041, 0x0000003b, 0x00000090, 0x0000001d, 0x00000049, 0x0004003d, 0x0000002f, 0x00000091, 0x00000090, 0x000500b8, 0x00000047, 0x00000092, 0x00000091, 0x00000054, 0x000300f7, 0x00000093, 0x00000000, 0x000400fa, 0x00000092, 0x00000094, 0x00000093, 0x000200f8, 0x00000094, 0x000100fc, 0x000200f8, 0x00000093, 0x00050041, 0x0000005c, 0x00000095, 0x00000004, 0x00000040, 0x0004003d, 0x00000034, 0x00000096, 0x00000095, 0x0006000c, 0x00000034, 0x00000097, 0x00000001, 0x00000045, 0x00000096, 0x0003003e, 0x00000024, 0x00000097, 0x0004003d, 0x00000034, 0x00000098, 0x00000024, 0x00050094, 0x0000002f, 0x00000099, 0x00000098, 0x0000005f, 0x0008000c, 0x0000002f, 0x0000009a, 0x00000001, 0x0000002b, 0x00000099, 0x00000043, 0x00000039, 0x0003003e, 0x00000025, 0x0000009a, 0x0004003d, 0x00000034, 0x0000009b, 0x00000024, 0x00050094, 0x0000002f, 0x0000009c, 0x0000009b, 0x00000060, 0x0008000c, 0x0000002f, 0x0000009d, 0x00000001, 0x0000002b, 0x0000009c, 0x00000043, 0x00000039, 0x0003003e, 0x00000026, 0x0000009d, 0x0004003d, 0x0000002f, 0x0000009e, 0x00000025, 0x0004003d, 0x0000002f, 0x0000009f, 0x00000026, 0x00050081, 0x0000002f, 0x000000a0, 0x0000009e, 0x0000009f, 0x00050085, 0x0000002f, 0x000000a1, 0x00000054, 0x000000a0, 0x0003003e, 0x00000027, 0x000000a1, 0x0004003d, 0x00000062, 0x000000a2, 0x00000029, 0x0004003d, 0x00000034, 0x000000a3, 0x00000024, 0x00050057, 0x00000032, 0x000000a4, 0x000000a2, 0x000000a3, 0x0004003d, 0x00000032, 0x000000a5, 0x0000001d, 0x00050085, 0x00000032, 0x000000a6, 0x000000a4, 0x000000a5, 0x00050085, 0x00000032, 0x000000a7, 0x000000a6, 0x00000065, 0x0003003e, 0x00000028, 0x000000a7, 0x0004003d, 0x00000047, 0x000000a8, 0x00000020, 0x000300f7, 0x000000a9, 0x00000000, 0x000400fa, 0x000000a8, 0x000000aa, 0x000000ab, 0x000200f8, 0x000000aa, 0x0004003d, 0x00000034, 0x000000ac, 0x00000024, 0x00050081, 0x00000034, 0x000000ad, 0x000000ac, 0x00000067, 0x0005008e, 0x00000034, 0x000000ae, 0x000000ad, 0x00000054, 0x00050051, 0x0000002f, 0x000000af, 0x000000ae, 0x00000000, 0x00050051, 0x0000002f, 0x000000b0, 0x000000ae, 0x00000001, 0x00050051, 0x0000002f, 0x000000b1, 0x000000ae, 0x00000002, 0x00070050, 0x00000032, 0x000000b2, 0x000000af, 0x000000b0, 0x000000b1, 0x00000039, 0x0003003e, 0x00000069, 0x000000b2, 0x000200f9, 0x000000a9, 0x000200f8, 0x000000ab, 0x0004003d, 0x00000032, 0x000000b3, 0x0000001a, 0x0004003d, 0x00000032, 0x000000b4, 0x00000028, 0x00050041, 0x00000055, 0x000000b5, 0x00000004, 0x00000056, 0x0004003d, 0x00000032, 0x000000b6, 0x000000b5, 0x0003003e, 0x0000002a, 0x000000b6, 0x00050039, 0x0000002f, 0x000000b7, 0x0000000b, 0x0000002a, 0x0005008e, 0x00000032, 0x000000b8, 0x000000b4, 0x000000b7, 0x00050081, 0x00000032, 0x000000b9, 0x000000b3, 0x000000b8, 0x0003003e, 0x00000069, 0x000000b9, 0x000200f9, 0x000000a9, 0x000200f8, 0x000000a9, 0x0004003d, 0x00000032, 0x000000ba, 0x00000069, 0x0003003e, 0x00000005, 0x000000ba, 0x000100fd, 0x00010038, 0x00050036, 0x00000032, 0x00000006, 0x00000000, 0x00000033, 0x00030037, 0x0000002e, 0x00000007, 0x00030037, 0x00000031, 0x00000008, 0x000200f8, 0x000000bb, 0x000200fe, 0x0000003a, 0x00010038, 0x00050036, 0x0000002f, 0x00000009, 0x00000000, 0x00000036, 0x00030037, 0x00000035, 0x0000000a, 0x000200f8, 0x000000bc, 0x0004003b, 0x0000003b, 0x0000000d, 0x00000007, 0x0004003b, 0x0000003b, 0x0000000f, 0x00000007, 0x0004003b, 0x00000044, 0x00000010, 0x00000007, 0x0004003b, 0x00000044, 0x00000011, 0x00000007, 0x0004003d, 0x0000003d, 0x000000bd, 0x0000000e, 0x00040064, 0x0000003c, 0x000000be, 0x000000bd, 0x00050067, 0x00000041, 0x000000bf, 0x000000be, 0x00000040, 0x00050051, 0x0000003f, 0x000000c0, 0x000000bf, 0x00000000, 0x0004006f, 0x0000002f, 0x000000c1, 0x000000c0, 0x00050088, 0x0000002f, 0x000000c2, 0x00000039, 0x000000c1, 0x0003003e, 0x0000000d, 0x000000c2, 0x0003003e, 0x0000000f, 0x00000043, 0x0003003e, 0x00000010, 0x00000045, 0x000200f9, 0x000000c3, 0x000200f8, 0x000000c3, 0x000400f6, 0x000000c4, 0x000000c5, 0x00000000, 0x000200f9, 0x000000c6, 0x000200f8, 0x000000c6, 0x0004003d, 0x0000003f, 0x000000c7, 0x00000010, 0x000500b3, 0x00000047, 0x000000c8, 0x000000c7, 0x00000046, 0x000400fa, 0x000000c8, 0x000000c9, 0x000000c4, 0x000200f8, 0x000000c9, 0x0003003e, 0x00000011, 0x00000045, 0x000200f9, 0x000000ca, 0x000200f8, 0x000000ca, 0x000400f6, 0x000000cb, 0x000000cc, 0x00000000, 0x000200f9, 0x000000cd, 0x000200f8, 0x000000cd, 0x0004003d, 0x0000003f, 0x000000ce, 0x00000011, 0x000500b3, 0x00000047, 0x000000cf, 0x000000ce, 0x00000046, 0x000400fa, 0x000000cf, 0x000000d0, 0x000000cb, 0x000200f8, 0x000000d0, 0x0004003d, 0x0000003d, 0x000000d1, 0x0000000e, 0x0004003d, 0x00000034, 0x000000d2, 0x0000000a, 0x0004003d, 0x0000002f, 0x000000d3, 0x0000000d, 0x0004003d, 0x0000003f, 0x000000d4, 0x00000011, 0x0004006f, 0x0000002f, 0x000000d5, 0x000000d4, 0x0004003d, 0x0000003f, 0x000000d6, 0x00000010, 0x0004006f, 0x0000002f, 0x000000d7, 0x000000d6, 0x00060050, 0x00000034, 0x000000d8, 0x000000d5, 0x000000d7, 0x00000043, 0x0005008e, 0x00000034, 0x000000d9, 0x000000d8, 0x000000d3, 0x00050081, 0x00000034, 0x000000da, 0x000000d2, 0x000000d9, 0x00050051, 0x0000002f, 0x000000db, 0x000000da, 0x00000002, 0x00060059, 0x0000002f, 0x000000dc, 0x000000d1, 0x000000da, 0x000000db, 0x0004003d, 0x0000002f, 0x000000dd, 0x0000000f, 0x00050081, 0x0000002f, 0x000000de, 0x000000dd, 0x000000dc, 0x0003003e, 0x0000000f, 0x000000de, 0x000200f9, 0x000000cc, 0x000200f8, 0x000000cc, 0x0004003d, 0x0000003f, 0x000000df, 0x00000011, 0x00050080, 0x0000003f, 0x000000e0, 0x000000df, 0x00000046, 0x0003003e, 0x00000011, 0x000000e0, 0x000200f9, 0x000000ca, 0x000200f8, 0x000000cb, 0x000200f9, 0x000000c5, 0x000200f8, 0x000000c5, 0x0004003d, 0x0000003f, 0x000000e1, 0x00000010, 0x00050080, 0x0000003f, 0x000000e2, 0x000000e1, 0x00000046, 0x0003003e, 0x00000010, 0x000000e2, 0x000200f9, 0x000000c3, 0x000200f8, 0x000000c4, 0x0004003d, 0x0000002f, 0x000000e3, 0x0000000f, 0x00050088, 0x0000002f, 0x000000e4, 0x000000e3, 0x00000048, 0x000200fe, 0x000000e4, 0x00010038, 0x00050036, 0x0000002f, 0x0000000b, 0x00000000, 0x00000038, 0x00030037, 0x00000037, 0x0000000c, 0x000200f8, 0x000000e5, 0x0004003b, 0x0000003b, 0x00000012, 0x00000007, 0x0004003b, 0x0000003b, 0x00000013, 0x00000007, 0x0004003b, 0x00000035, 0x00000014, 0x00000007, 0x0004003d, 0x00000032, 0x000000e6, 0x0000000c, 0x00050041, 0x0000003b, 0x000000e7, 0x0000000c, 0x00000049, 0x0004003d, 0x0000002f, 0x000000e8, 0x000000e7, 0x00070050, 0x00000032, 0x000000e9, 0x000000e8, 0x000000e8, 0x000000e8, 0x000000e8, 0x00050088, 0x00000032, 0x000000ea, 0x000000e6, 0x000000e9, 0x0003003e, 0x0000000c, 0x000000ea, 0x00050041, 0x0000003b, 0x000000eb, 0x0000000c, 0x0000004a, 0x0004003d, 0x0000002f, 0x000000ec, 0x000000eb, 0x000500ba, 0x00000047, 0x000000ed, 0x000000ec, 0x0000004b, 0x000300f7, 0x000000ee, 0x00000000, 0x000400fa, 0x000000ed, 0x000000ef, 0x000000ee, 0x000200f8, 0x000000ef, 0x00050041, 0x0000003b, 0x000000f0, 0x0000000c, 0x0000004a, 0x0004003d, 0x0000002f, 0x000000f1, 0x000000f0, 0x000500b8, 0x00000047, 0x000000f2, 0x000000f1, 0x00000039, 0x000200f9, 0x000000ee, 0x000200f8, 0x000000ee, 0x000700f5, 0x00000047, 0x000000f3, 0x000000ed, 0x000000e5, 0x000000f2, 0x000000ef, 0x000300f7, 0x000000f4, 0x00000000, 0x000400fa, 0x000000f3, 0x000000f5, 0x000000f4, 0x000200f8, 0x000000f5, 0x0003003e, 0x00000012, 0x0000004c, 0x00050041, 0x0000003b, 0x000000f6, 0x0000000c, 0x0000004d, 0x0004003d, 0x0000002f, 0x000000f7, 0x000000f6, 0x00050083, 0x0000002f, 0x000000f8, 0x00000039, 0x000000f7, 0x00050041, 0x0000003b, 0x000000f9, 0x0000000c, 0x0000004d, 0x0003003e, 0x000000f9, 0x000000f8, 0x00050041, 0x0000003b, 0x000000fa, 0x0000000c, 0x00000042, 0x0004003d, 0x0000002f, 0x000000fb, 0x000000fa, 0x00050041, 0x0000003b, 0x000000fc, 0x0000000c, 0x0000004d, 0x0004003d, 0x0000002f, 0x000000fd, 0x000000fc, 0x00050041, 0x0000003b, 0x000000fe, 0x0000000c, 0x0000004a, 0x0004003d, 0x0000002f, 0x000000ff, 0x000000fe, 0x0004003d, 0x0000002f, 0x00000100, 0x00000012, 0x00050081, 0x0000002f, 0x00000101, 0x000000ff, 0x00000100, 0x00060050, 0x00000034, 0x00000102, 0x000000fb, 0x000000fd, 0x00000101, 0x0003003e, 0x00000014, 0x00000102, 0x00050039, 0x0000002f, 0x00000103, 0x00000009, 0x00000014, 0x0003003e, 0x00000013, 0x00000103, 0x0004003d, 0x0000002f, 0x00000104, 0x00000013, 0x0008000c, 0x0000002f, 0x00000105, 0x00000001, 0x0000002e, 0x0000004e, 0x00000039, 0x00000104, 0x000200fe, 0x00000105, 0x000200f8, 0x000000f4, 0x000200fe, 0x00000039, 0x00010038}; return kTinyMeshFragmentShader; } } // namespace igl::tests ================================================ FILE: src/igl/tests/util/SpvModules.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::tests { // A collection of SPIR-V modules useful for testing. Disassembly can be see in the .cpp file for // clarity. const std::vector& getUniformBufferSpvWords(); const std::vector& getTextureSpvWords(); const std::vector& getTextureWithDescriptorSetSpvWords(); const std::vector& getTinyMeshFragmentShaderSpvWords(); } // namespace igl::tests ================================================ FILE: src/igl/tests/util/TestDevice.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "TestDevice.h" #include #include namespace igl::tests::util { // // createTestDevice // // Used by clients to get an IGL device. The backend is determined by the IGL_BACKEND_TYPE compiler // flag in the BUCK file. For OpenGL ES, the GLES version is determined by the // IGL_UNIT_TESTS_GLES_VERSION compiler flag. // std::shared_ptr createTestDevice() { const std::string backend(IGL_BACKEND_TYPE); if (backend == "ogl") { #ifdef IGL_UNIT_TESTS_GLES_VERSION return tests::util::device::createTestDevice(::igl::BackendType::OpenGL, {.requestedOpenGLBackendVersion = BackendVersion{ .flavor = BackendFlavor::OpenGL_ES, .majorVersion = IGL_UNIT_TESTS_GLES_VERSION, .minorVersion = 0, }}); #else return tests::util::device::createTestDevice(::igl::BackendType::OpenGL); #endif } else if (backend == "metal") { return device::createTestDevice(::igl::BackendType::Metal); } else if (backend == "vulkan") { return device::createTestDevice(::igl::BackendType::Vulkan); } else if (backend == "d3d12") { return device::createTestDevice(::igl::BackendType::D3D12); // @fb-only // @fb-only } else { return nullptr; } } } // namespace igl::tests::util ================================================ FILE: src/igl/tests/util/TestDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl { class IDevice; namespace tests::util { /** Create and return an igl::Device that is suitable for running tests against. */ std::shared_ptr createTestDevice(); } // namespace tests::util } // namespace igl ================================================ FILE: src/igl/tests/util/TestErrorGuard.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "TestErrorGuard.h" igl::tests::util::TestErrorGuard::TestErrorGuard() { #if IGL_SOFT_ERROR_ENABLED savedErrorHandler_ = iglGetSoftErrorHandler(); iglSetSoftErrorHandler(reportErrorHandler); #endif } igl::tests::util::TestErrorGuard::~TestErrorGuard() { #if IGL_SOFT_ERROR_ENABLED iglSetSoftErrorHandler(savedErrorHandler_); #endif } void igl::tests::util::TestErrorGuard::reportErrorHandler(const char* category, const char* /*reason*/, const char* file, const char* /*func*/, int line, const char* format, va_list ap) { #if IGL_SOFT_ERROR_ENABLED va_list apCopy; // NOLINT(cppcoreguidelines-init-variables) va_copy(apCopy, ap); const auto len = std::vsnprintf(nullptr, 0, format, apCopy); va_end(apCopy); std::string fmtString; fmtString.resize(len + 1); std::vsnprintf(&fmtString.front(), len + 1, format, ap); fmtString.resize(len); ADD_FAILURE() << "IGL error encountered in " << file << ":" << line << " category=" << category << " " << fmtString; #endif } ================================================ FILE: src/igl/tests/util/TestErrorGuard.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::tests::util { /// Sets an IGL handler that will cause gtest to fail when IGLReportErrorHandler is called class TestErrorGuard final { public: TestErrorGuard(); virtual ~TestErrorGuard(); static void reportErrorHandler(const char* category, const char* reason, const char* file, const char* func, int line, const char* format, va_list ap); private: #if IGL_SOFT_ERROR_ENABLED IGLErrorHandlerFunc savedErrorHandler_; #endif }; } // namespace igl::tests::util ================================================ FILE: src/igl/tests/util/TextureFormatTestBase.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "TextureFormatTestBase.h" #include "../data/ShaderData.h" #include "../data/VertexIndexData.h" #include "Common.h" #include #include #include #include namespace igl::tests::util { #define OFFSCREEN_TEX_WIDTH 2 #define OFFSCREEN_TEX_HEIGHT 2 void TextureFormatTestBase::SetUp() { setDebugBreakEnabled(false); util::createDeviceAndQueue(iglDev_, cmdQueue_); ASSERT_TRUE(iglDev_ != nullptr); ASSERT_TRUE(cmdQueue_ != nullptr); // Create a sampled and an attachment texture for use in tests TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT, TextureDesc::TextureUsageBits::Sampled); texDesc.debugName = "TextureFormatTestBase rgba unorm8 sampled"; Result ret; sampledTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok) << ret.message; ASSERT_TRUE(sampledTexture_ != nullptr); const auto attachmentFormat = iglDev_->getBackendType() == igl::BackendType::OpenGL ? TextureFormat::ABGR_UNorm4 : TextureFormat::RGBA_UNorm8; texDesc = TextureDesc::new2D(attachmentFormat, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT, TextureDesc::TextureUsageBits::Attachment); attachmentTexture_ = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok) << ret.message; ASSERT_TRUE(attachmentTexture_ != nullptr); // Initialize render pass descriptor renderPass_.colorAttachments.resize(1); renderPass_.colorAttachments[0].loadAction = LoadAction::Clear; renderPass_.colorAttachments[0].storeAction = StoreAction::Store; renderPass_.colorAttachments[0].clearColor = {0.0, 0.0, 0.0, 1.0}; // Initialize input to vertex shader VertexInputStateDesc inputDesc; inputDesc.attributes[0].format = VertexAttributeFormat::Float4; inputDesc.attributes[0].offset = 0; inputDesc.attributes[0].bufferIndex = data::shader::kSimplePosIndex; inputDesc.attributes[0].name = data::shader::kSimplePos; inputDesc.attributes[0].location = 0; inputDesc.inputBindings[0].stride = sizeof(float) * 4; inputDesc.attributes[1].format = VertexAttributeFormat::Float2; inputDesc.attributes[1].offset = 0; inputDesc.attributes[1].bufferIndex = data::shader::kSimpleUvIndex; inputDesc.attributes[1].name = data::shader::kSimpleUv; inputDesc.attributes[1].location = 1; inputDesc.inputBindings[1].stride = sizeof(float) * 2; // numAttributes has to equal to bindings when using more than 1 buffer inputDesc.numAttributes = inputDesc.numInputBindings = 2; vertexInputState_ = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vertexInputState_ != nullptr); // Initialize index buffer BufferDesc bufDesc; bufDesc.type = BufferDesc::BufferTypeBits::Index; bufDesc.data = data::vertex_index::kQuadInd.data(); bufDesc.length = sizeof(data::vertex_index::kQuadInd); ib_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(ib_ != nullptr); // Initialize vertex and sampler buffers bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data::vertex_index::kQuadVert.data(); bufDesc.length = sizeof(data::vertex_index::kQuadVert); vb_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(vb_ != nullptr); bufDesc.type = BufferDesc::BufferTypeBits::Vertex; bufDesc.data = data::vertex_index::kQuadUv.data(); bufDesc.length = sizeof(data::vertex_index::kQuadUv); uv_ = iglDev_->createBuffer(bufDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(uv_ != nullptr); // Initialize sampler state nearestSampler_ = iglDev_->createSamplerState(SamplerStateDesc{}, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(nearestSampler_ != nullptr); linearSampler_ = iglDev_->createSamplerState(SamplerStateDesc::newLinear(), &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(linearSampler_ != nullptr); // Initialize Graphics Pipeline Descriptor, but leave the creation // to the individual tests in case further customization is required renderPipelineDesc_.vertexInputState = vertexInputState_; renderPipelineDesc_.targetDesc.colorAttachments.resize(1); renderPipelineDesc_.fragmentUnitSamplerMap[textureUnit_] = IGL_NAMEHANDLE(data::shader::kSimpleSampler); renderPipelineDesc_.cullMode = igl::CullMode::Disabled; } std::shared_ptr TextureFormatTestBase::createFramebuffer( std::shared_ptr attachmentTexture, Result& ret) { FramebufferDesc framebufferDesc; const auto attachmentFormat = attachmentTexture->getFormat(); if (attachmentTexture->getProperties().isDepthOrStencil()) { // For depth/stencil textures: // 1) Attach to the appropriate part of the framebuffer // 2) Use ivar as color attachment. // Update renderPipelineDesc_ renderPipelineDesc_.targetDesc.colorAttachments[0].textureFormat = attachmentTexture_->getFormat(); renderPipelineDesc_.targetDesc.depthAttachmentFormat = TextureFormat::Invalid; renderPipelineDesc_.targetDesc.stencilAttachmentFormat = TextureFormat::Invalid; if (attachmentFormat != TextureFormat::S_UInt8) { framebufferDesc.depthAttachment.texture = attachmentTexture; renderPipelineDesc_.targetDesc.depthAttachmentFormat = attachmentFormat; } if (attachmentFormat != TextureFormat::Z_UNorm16 && attachmentFormat != TextureFormat::Z_UNorm24 && attachmentFormat != TextureFormat::Z_UNorm32) { framebufferDesc.stencilAttachment.texture = attachmentTexture; renderPipelineDesc_.targetDesc.stencilAttachmentFormat = attachmentFormat; } framebufferDesc.colorAttachments[0].texture = attachmentTexture_; std::unique_ptr stages; igl::tests::util::createSimpleShaderStages(iglDev_, stages, attachmentTexture_->getFormat()); renderPipelineDesc_.shaderStages = std::move(stages); } else { framebufferDesc.colorAttachments[0].texture = attachmentTexture; // Update renderPipelineDesc_ renderPipelineDesc_.targetDesc.colorAttachments[0].textureFormat = attachmentFormat; renderPipelineDesc_.targetDesc.depthAttachmentFormat = TextureFormat::Invalid; renderPipelineDesc_.targetDesc.stencilAttachmentFormat = TextureFormat::Invalid; std::unique_ptr stages; igl::tests::util::createSimpleShaderStages(iglDev_, stages, attachmentFormat); renderPipelineDesc_.shaderStages = std::move(stages); } auto framebuffer = iglDev_->createFramebuffer(framebufferDesc, &ret); return framebuffer; } // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) void TextureFormatTestBase::render(std::shared_ptr sampledTexture, std::shared_ptr attachmentTexture, bool linearSampling, TextureFormatProperties testProperties) { Result ret; //------- // Render //------- auto cmdBuf = cmdQueue_->createCommandBuffer(CommandBufferDesc{}, &ret); ASSERT_EQ(ret.code, Result::Code::Ok) << ret.message; ASSERT_TRUE(cmdBuf != nullptr); auto framebuffer = createFramebuffer(attachmentTexture, ret); ASSERT_TRUE(ret.isOk()) << testProperties.name << ": " << ret.message; ASSERT_TRUE(framebuffer != nullptr); // Add sampled textures as dependencies so that their layout is transitioned correctly for Vulkan Dependencies dep; dep.textures[0] = sampledTexture.get(); Result result; auto cmds = cmdBuf->createRenderCommandEncoder(renderPass_, framebuffer, dep, &result); ASSERT_TRUE(result.isOk()); cmds->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); cmds->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); // Create createFramebuffer fills in proper texture formats and shader stages in // renderPipelineDesc_ auto pipelineState = iglDev_->createRenderPipeline(renderPipelineDesc_, &ret); ASSERT_EQ(ret.code, Result::Code::Ok) << ret.message; ASSERT_TRUE(pipelineState != nullptr); cmds->bindRenderPipelineState(pipelineState); cmds->bindTexture(textureUnit_, BindTarget::kFragment, sampledTexture.get()); // Choose appropriate sampler. cmds->bindSamplerState(textureUnit_, BindTarget::kFragment, (linearSampling ? linearSampler_ : nearestSampler_).get()); cmds->bindIndexBuffer(*ib_, IndexFormat::UInt16); cmds->drawIndexed(6); cmds->endEncoding(); cmdQueue_->submit(*cmdBuf); cmdBuf->waitUntilCompleted(); } std::pair TextureFormatTestBase::checkSupport( TextureFormat format, TextureDesc::TextureUsage usage) { const bool sampled = (usage & TextureDesc::TextureUsageBits::Sampled) != 0; const bool storage = (usage & TextureDesc::TextureUsageBits::Storage) != 0; const bool attachment = (usage & TextureDesc::TextureUsageBits::Attachment) != 0; const bool sampledAttachment = sampled && attachment; const auto capabilities = iglDev_->getTextureFormatCapabilities(format); bool supported = false; if (sampledAttachment) { if ((capabilities & ICapabilities::TextureFormatCapabilityBits::SampledAttachment) != 0) { supported = true; } } else if (attachment && (capabilities & ICapabilities::TextureFormatCapabilityBits::Attachment) != 0) { supported = true; } else if (sampled && (capabilities & ICapabilities::TextureFormatCapabilityBits::Sampled) != 0) { supported = true; } else if (storage && (capabilities & ICapabilities::TextureFormatCapabilityBits::Storage) != 0) { supported = true; } return std::make_pair(format, supported); } std::vector> TextureFormatTestBase::getFormatSupport( TextureDesc::TextureUsage usage) { std::vector> formatSupport; formatSupport.emplace_back(checkSupport(TextureFormat::Invalid, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::A_UNorm8, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::L_UNorm8, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::R_UNorm8, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::R_F16, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::R_UInt16, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::R_UNorm16, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::B5G5R5A1_UNorm, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::B5G6R5_UNorm, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::ABGR_UNorm4, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::LA_UNorm8, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RG_UNorm8, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::R4G2B2_UNorm_Apple, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::R4G2B2_UNorm_Rev_Apple, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::R5G5B5A1_UNorm, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGBX_UNorm8, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGBA_UNorm8, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::BGRA_UNorm8, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::BGRA_UNorm8_Rev, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGBA_SRGB, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::BGRA_SRGB, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RG_F16, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RG_UInt16, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RG_UNorm16, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGB10_A2_UNorm_Rev, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGB10_A2_Uint_Rev, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::BGR10_A2_Unorm, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::R_F32, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::R_UInt32, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGB_F16, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGBA_F16, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RG_F32, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGB_F32, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGBA_UInt32, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGBA_F32, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGBA_ASTC_4x4, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::SRGB8_A8_ASTC_4x4, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGBA_ASTC_5x4, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::SRGB8_A8_ASTC_5x4, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGBA_ASTC_5x5, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::SRGB8_A8_ASTC_5x5, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGBA_ASTC_6x5, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::SRGB8_A8_ASTC_6x5, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGBA_ASTC_6x6, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::SRGB8_A8_ASTC_6x6, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGBA_ASTC_8x5, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::SRGB8_A8_ASTC_8x5, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGBA_ASTC_8x6, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::SRGB8_A8_ASTC_8x6, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGBA_ASTC_8x8, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::SRGB8_A8_ASTC_8x8, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGBA_ASTC_10x5, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::SRGB8_A8_ASTC_10x5, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGBA_ASTC_10x6, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::SRGB8_A8_ASTC_10x6, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGBA_ASTC_10x8, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::SRGB8_A8_ASTC_10x8, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGBA_ASTC_10x10, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::SRGB8_A8_ASTC_10x10, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGBA_ASTC_12x10, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::SRGB8_A8_ASTC_12x10, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGBA_ASTC_12x12, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::SRGB8_A8_ASTC_12x12, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGBA_PVRTC_2BPPV1, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGB_PVRTC_2BPPV1, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGBA_PVRTC_4BPPV1, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGB_PVRTC_4BPPV1, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGB8_ETC1, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGB8_ETC2, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::SRGB8_ETC2, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGB8_Punchthrough_A1_ETC2, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::SRGB8_Punchthrough_A1_ETC2, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGBA8_EAC_ETC2, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::SRGB8_A8_EAC_ETC2, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RG_EAC_UNorm, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RG_EAC_SNorm, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::R_EAC_UNorm, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::R_EAC_SNorm, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGBA_BC7_UNORM_4x4, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::RGBA_BC7_SRGB_4x4, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::Z_UNorm16, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::Z_UNorm24, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::Z_UNorm32, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::S8_UInt_Z24_UNorm, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::S8_UInt_Z32_UNorm, usage)); formatSupport.emplace_back(checkSupport(TextureFormat::S_UInt8, usage)); return formatSupport; } // Attempts to upload data to texture. void TextureFormatTestBase::testUpload(std::shared_ptr texture) { const auto size = texture->getEstimatedSizeInBytes(); std::vector data(size); const auto range = texture->getFullRange(); const Result result = texture->upload(range, data.data()); ASSERT_TRUE(result.isOk()) << texture->getProperties().name; // flush upload Result ret; auto cmdBuf = cmdQueue_->createCommandBuffer(CommandBufferDesc{}, &ret); cmdQueue_->submit(*cmdBuf); cmdBuf->waitUntilCompleted(); } // Attempts to render into texture. void TextureFormatTestBase::testAttachment(std::shared_ptr texture) { render(sampledTexture_, texture, false, texture->getProperties()); } // Attempts to sample from texture when rendering. void TextureFormatTestBase::testSampled(std::shared_ptr texture, bool linearSampling) { render(texture, attachmentTexture_, linearSampling, texture->getProperties()); } void TextureFormatTestBase::testUsage(TextureDesc::TextureUsage usage, const char* usageName) { const auto formatSupport = getFormatSupport(usage); for (const auto& fs : formatSupport) { testUsage(fs, usage, usageName); } } void TextureFormatTestBase::testUsage(std::pair formatSupport, TextureDesc::TextureUsage usage, const char* usageName) { std::shared_ptr texture; Result ret; const auto [textureFormat, supported] = formatSupport; const auto properties = TextureFormatProperties::fromTextureFormat(textureFormat); if (!supported) { // Comment this out to test unsupported formats. IGL_LOG_INFO("%s: Skipping %s: Capabilities: 0x%x\n", usageName, properties.name, iglDev_->getTextureFormatCapabilities(textureFormat)); return; } IGL_LOG_INFO("%s: Testing %s\n", usageName, properties.name); auto texDesc = TextureDesc::new2D(textureFormat, OFFSCREEN_TEX_WIDTH, OFFSCREEN_TEX_HEIGHT, usage); texDesc.debugName = std::string("TextureFormatTestBase:") + usageName + ":" + properties.name; if (iglDev_->getBackendType() == BackendType::Metal && properties.isDepthOrStencil()) { texDesc.storage = ResourceStorage::Private; } texture = iglDev_->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, supported ? Result::Code::Ok : Result::Code::ArgumentInvalid) << properties.name << ": " << ret.message; testUsage(texture, usage, usageName); } void TextureFormatTestBase::testUsage(std::shared_ptr texture, TextureDesc::TextureUsage usage, const char* usageName) { const auto properties = texture->getProperties(); // Non-normalized integer formats cannot be sampled with `float` GLSL samplers `sampler2D` on // Vulkan (need `usampler2D` etc) const bool isIntegerFormat = (properties.flags & TextureFormatProperties::Flags::Integer) != 0; const bool isVulkan = iglDev_->getBackendType() == igl::BackendType::Vulkan; const bool shouldSkip = isVulkan && isIntegerFormat; if (!shouldSkip && (usage & TextureDesc::TextureUsageBits::Sampled) != 0) { const bool linearSampling = (iglDev_->getTextureFormatCapabilities(properties.format) & ICapabilities::TextureFormatCapabilityBits::SampledAttachment) != 0; IGL_LOG_INFO("%s: Test Sampled: %s\n", usageName, properties.name); testSampled(texture, linearSampling); } if ((usage & (TextureDesc::TextureUsageBits::Attachment)) != 0) { IGL_LOG_INFO("%s: Test Attachment: %s\n", usageName, properties.name); testAttachment(texture); } if (texture->supportsUpload()) { IGL_LOG_INFO("%s: Test Upload: %s\n", usageName, properties.name); testUpload(texture); } } } // namespace igl::tests::util ================================================ FILE: src/igl/tests/util/TextureFormatTestBase.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include namespace igl::tests::util { class TextureFormatTestBase : public ::testing::Test { private: public: TextureFormatTestBase() = default; ~TextureFormatTestBase() override = default; void SetUp() override; void TearDown() override {} std::vector> getFormatSupport(TextureDesc::TextureUsage usage); std::pair checkSupport(TextureFormat format, TextureDesc::TextureUsage usage); std::shared_ptr createFramebuffer(std::shared_ptr attachmentTexture, Result& ret); void render(std::shared_ptr sampledTexture, std::shared_ptr attachmentTexture, bool linearSampling, TextureFormatProperties testProperties); void testSampled(std::shared_ptr texture, bool linearSampling); void testAttachment(std::shared_ptr texture); void testUpload(std::shared_ptr texture); void testUsage(TextureDesc::TextureUsage usage, const char* usageName); void testUsage(std::pair formatSupport, TextureDesc::TextureUsage usage, const char* usageName); void testUsage(std::shared_ptr texture, TextureDesc::TextureUsage usage, const char* usageName); // Member variables protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; std::shared_ptr sampledTexture_; std::shared_ptr attachmentTexture_; RenderPassDesc renderPass_; std::shared_ptr vertexInputState_; std::shared_ptr vb_, uv_, ib_; std::shared_ptr nearestSampler_; std::shared_ptr linearSampler_; RenderPipelineDesc renderPipelineDesc_; size_t textureUnit_ = 0; }; } // namespace igl::tests::util ================================================ FILE: src/igl/tests/util/TextureValidationHelpers.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #if IGL_PLATFORM_IOS || IGL_PLATFORM_MACOSX #include "simd/simd.h" #else #include "simdstub.h" #endif namespace igl::tests::util { constexpr auto kTestPrecision = 0.0001f; template inline void testArray(std::vector actualData, const ColorType* expectedData, size_t expectedDataSize, const char* message) { const auto kInnerTestPrecision = ColorType(kTestPrecision); for (size_t i = 0; i < expectedDataSize; i++) { std::stringstream ss; ss << message << ": Mismatch at index " << i << ": Expected: " << std::hex << expectedData[i] << " Actual: " << std::hex << actualData[i]; ASSERT_NEAR(expectedData[i], actualData[i], kInnerTestPrecision) << ss.str(); } } template inline void testArray(std::vector> actualData, const glm::vec<4, VectorUnit, Precision>* expectedData, size_t expectedDataSize, const char* message) { const auto kInnerTestPrecision = VectorUnit(kTestPrecision); for (size_t i = 0; i < expectedDataSize; i++) { std::stringstream ss; ss << message << ": Mismatch at index " << i << ": Expected: " << std::hex << "(" << expectedData[i].x << " " << expectedData[i].y << " " << expectedData[i].z << " " << expectedData[i].w << ")" << " Actual: " << std::hex << "(" << actualData[i].x << " " << actualData[i].y << " " << actualData[i].z << " " << actualData[i].w << ")"; ASSERT_NEAR(expectedData[i].x, actualData[i].x, kInnerTestPrecision) << ss.str(); ASSERT_NEAR(expectedData[i].y, actualData[i].y, kInnerTestPrecision) << ss.str(); ASSERT_NEAR(expectedData[i].z, actualData[i].z, kInnerTestPrecision) << ss.str(); ASSERT_NEAR(expectedData[i].w, actualData[i].w, kInnerTestPrecision) << ss.str(); } } template inline void testArray(std::vector> actualData, const glm::vec<3, VectorUnit, Precision>* expectedData, size_t expectedDataSize, const char* message) { const auto kInnerTestPrecision = VectorUnit(kTestPrecision); for (size_t i = 0; i < expectedDataSize; i++) { std::stringstream ss; ss << message << ": Mismatch at index " << i << ": Expected: " << std::hex << "(" << expectedData[i].x << " " << expectedData[i].y << " " << expectedData[i].z << ")" << " Actual: " << std::hex << "(" << actualData[i].x << " " << actualData[i].y << " " << actualData[i].z << ")"; ASSERT_NEAR(expectedData[i].x, actualData[i].x, kInnerTestPrecision) << ss.str(); ASSERT_NEAR(expectedData[i].y, actualData[i].y, kInnerTestPrecision) << ss.str(); ASSERT_NEAR(expectedData[i].z, actualData[i].z, kInnerTestPrecision) << ss.str(); } } template inline void testArray(std::vector> actualData, const glm::vec<2, VectorUnit, Precision>* expectedData, size_t expectedDataSize, const char* message) { const auto kInnerTestPrecision = VectorUnit(kTestPrecision); for (size_t i = 0; i < expectedDataSize; i++) { std::stringstream ss; ss << message << ": Mismatch at index " << i << ": Expected: " << std::hex << "(" << expectedData[i].x << " " << expectedData[i].y << ")" << " Actual: " << std::hex << "(" << actualData[i].x << " " << actualData[i].y << ")"; ASSERT_NEAR(expectedData[i].x, actualData[i].x, kInnerTestPrecision) << ss.str(); ASSERT_NEAR(expectedData[i].y, actualData[i].y, kInnerTestPrecision) << ss.str(); } } /// Reads back a range of texture data /// @param device The device the texture was created with /// @param cmdQueue A command queue to submit any read requests on /// @param texture The texture to validate /// @param isRenderTarget True if the texture was the target of a render pass; false otherwise /// @param range The range of data to validate. Must resolve to a single 2D texture region /// @param expectedData The expected data in the specified range /// @param message A message to print when validation fails template inline void validateTextureRange(IDevice& device, ICommandQueue& cmdQueue, const std::shared_ptr& texture, bool isRenderTarget, const TextureRangeDesc& range, const ColorType* expectedData, const char* message) { Result ret; // Dummy command buffer to wait for completion. auto cmdBuf = cmdQueue.createCommandBuffer({}, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(cmdBuf != nullptr); cmdQueue.submit(*cmdBuf); cmdBuf->waitUntilCompleted(); ASSERT_EQ(range.numLayers, 1); ASSERT_EQ(range.numMipLevels, 1); ASSERT_EQ(range.depth, 1); const auto expectedDataSize = range.width * range.height; std::vector actualData; actualData.resize(expectedDataSize); FramebufferDesc framebufferDesc; framebufferDesc.colorAttachments[0].texture = texture; auto fb = device.createFramebuffer(framebufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(fb != nullptr); fb->copyBytesColorAttachment(cmdQueue, 0, actualData.data(), range); if (!isRenderTarget && (device.getBackendType() == igl::BackendType::Metal || device.getBackendType() == igl::BackendType::Vulkan || device.getBackendType() == igl::BackendType::D3D12)) { // The Vulkan, Metal, and D3D12 implementations of copyBytesColorAttachment flip the returned // image vertically. This is the desired behavior for render targets, but for non-render target // textures, we want the unflipped data. This flips the output image again to get the unmodified // data. std::vector tmpData; tmpData.resize(actualData.size()); for (size_t h = 0; h < range.height; ++h) { size_t src = (range.height - 1 - h) * range.width; size_t dst = h * range.width; for (size_t w = 0; w < range.width; ++w) { tmpData[dst++] = actualData[src++]; } } actualData = std::move(tmpData); } testArray(actualData, expectedData, expectedDataSize, message); } template inline void validateFramebufferTextureRange(IDevice& device, ICommandQueue& cmdQueue, const IFramebuffer& framebuffer, const TextureRangeDesc& range, const ColorType* expectedData, const char* message) { validateTextureRange( device, cmdQueue, framebuffer.getColorAttachment(0), true, range, expectedData, message); } template inline void validateFramebufferTexture(IDevice& device, ICommandQueue& cmdQueue, const IFramebuffer& framebuffer, const ColorType* expectedData, const char* message) { validateFramebufferTextureRange(device, cmdQueue, framebuffer, framebuffer.getColorAttachment(0)->getFullRange(), expectedData, message); } template inline void validateUploadedTextureRange(IDevice& device, ICommandQueue& cmdQueue, const std::shared_ptr& texture, const TextureRangeDesc& range, const ColorType* expectedData, const char* message) { validateTextureRange(device, cmdQueue, texture, false, range, expectedData, message); } template inline void validateUploadedTexture(IDevice& device, ICommandQueue& cmdQueue, const std::shared_ptr& texture, const ColorType* expectedData, const char* message) { validateTextureRange( device, cmdQueue, texture, false, texture->getFullRange(), expectedData, message); } } // namespace igl::tests::util ================================================ FILE: src/igl/tests/util/device/MetalTestDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl { class IDevice; } // namespace igl namespace igl::tests::util::device { /** Create and return an igl::Device that is suitable for running tests against for the specified backend. For OpenGL, a backendApi value of "2.0" will return a GLES2 context. All other values will return a GLES3 context. */ std::unique_ptr createMetalTestDevice(); } // namespace igl::tests::util::device ================================================ FILE: src/igl/tests/util/device/MetalTestDevice.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace igl::tests::util::device { std::unique_ptr createMetalTestDevice() { return metal::createTestDevice(); } } // namespace igl::tests::util::device ================================================ FILE: src/igl/tests/util/device/TestDevice.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include // clang-format off // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // clang-format on // @fb-only #if IGL_METAL_SUPPORTED #include #endif #if IGL_OPENGL_SUPPORTED #include #endif #if IGL_VULKAN_SUPPORTED #include #endif #if IGL_D3D12_SUPPORTED #include #endif // @fb-only // @fb-only // @fb-only namespace igl::tests::util::device { bool isBackendTypeSupported(BackendType backendType) { switch (backendType) { case ::igl::BackendType::Invalid: case ::igl::BackendType::Custom: IGL_DEBUG_ASSERT_NOT_REACHED(); return false; case ::igl::BackendType::Metal: return IGL_METAL_SUPPORTED; case ::igl::BackendType::OpenGL: return IGL_OPENGL_SUPPORTED; case ::igl::BackendType::Vulkan: return IGL_VULKAN_SUPPORTED; case ::igl::BackendType::D3D12: return IGL_D3D12_SUPPORTED; // @fb-only // @fb-only } IGL_UNREACHABLE_RETURN(false) } std::unique_ptr createTestDevice(BackendType backendType, const TestDeviceConfig& config) { if (backendType == ::igl::BackendType::Metal) { #if IGL_METAL_SUPPORTED return createMetalTestDevice(); #else return nullptr; #endif } if (backendType == ::igl::BackendType::OpenGL) { #if IGL_OPENGL_SUPPORTED return opengl::createTestDevice(config.requestedOpenGLBackendVersion); #else return nullptr; #endif } if (backendType == ::igl::BackendType::Vulkan) { #if IGL_VULKAN_SUPPORTED return vulkan::createTestDevice(config.enableVulkanValidationLayers); #else return nullptr; #endif } if (backendType == ::igl::BackendType::D3D12) { #if IGL_D3D12_SUPPORTED IGL_LOG_INFO("[Tests] Creating D3D12 test device (debug layer: enabled)\n"); auto dev = d3d12::createTestDevice(true); if (!dev) { IGL_LOG_ERROR("[Tests] D3D12 test device creation failed\n"); } else { IGL_LOG_INFO("[Tests] D3D12 test device created OK\n"); } return dev; #else return nullptr; #endif } // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only return nullptr; } } // namespace igl::tests::util::device ================================================ FILE: src/igl/tests/util/device/TestDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #if (IGL_PLATFORM_IOS || IGL_PLATFORM_MACOSX || IGL_PLATFORM_MACCATALYST) && IGL_BACKEND_METAL #define IGL_METAL_SUPPORTED 1 #else #define IGL_METAL_SUPPORTED 0 #endif #if !IGL_PLATFORM_MACCATALYST && IGL_BACKEND_OPENGL && !defined(IGL_TESTS_NO_OPENGL) #define IGL_OPENGL_SUPPORTED 1 #else #define IGL_OPENGL_SUPPORTED 0 #endif #if (IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX) && \ IGL_BACKEND_VULKAN && !defined(IGL_UNIT_TESTS_NO_VULKAN) #define IGL_VULKAN_SUPPORTED 1 #else #define IGL_VULKAN_SUPPORTED 0 #endif #if IGL_PLATFORM_WINDOWS && defined(IGL_BACKEND_ENABLE_D3D12) && !defined(IGL_UNIT_TESTS_NO_D3D12) #define IGL_D3D12_SUPPORTED 1 #else #define IGL_D3D12_SUPPORTED 0 #endif namespace igl::tests::util::device { struct TestDeviceConfig { std::optional requestedOpenGLBackendVersion{}; bool enableVulkanValidationLayers = true; // @fb-only // @fb-only // @fb-only // @fb-only }; /** Returns whether or not the specified backend type is supported for test devices. */ bool isBackendTypeSupported(BackendType backendType); #if IGL_D3D12_SUPPORTED constexpr BackendType kDefaultBackendType = BackendType::D3D12; #elif IGL_OPENGL_SUPPORTED constexpr BackendType kDefaultBackendType = BackendType::OpenGL; #elif IGL_VULKAN_SUPPORTED constexpr BackendType kDefaultBackendType = BackendType::Vulkan; #elif IGL_METAL_SUPPORTED constexpr BackendType kDefaultBackendType = BackendType::Metal; #else constexpr BackendType kDefaultBackendType = BackendType::Invalid; #endif /** Create and return an igl::Device that is suitable for running tests against for the specified backend. For OpenGL, a backendApi value of "2.0" will return a GLES2 context. All other values will return a GLES3 context. */ std::unique_ptr createTestDevice(BackendType backendType = kDefaultBackendType, const TestDeviceConfig& config = {}); } // namespace igl::tests::util::device ================================================ FILE: src/igl/tests/util/device/d3d12/TestDevice.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ /* Minimal D3D12 test device factory using a headless context. */ #include "TestDevice.h" #include #include #include #include #include namespace igl::tests::util::device::d3d12 { std::unique_ptr createTestDevice(bool enableDebugLayer) { IGL_LOG_INFO("[Tests] D3D12 test device requested (debug layer: %s)\n", enableDebugLayer ? "enabled" : "disabled"); // Enabling the debug layer happens inside D3D12Context::createDevice() when available. // Build a headless context (no swapchain) suitable for unit tests. auto ctx = std::make_unique(); auto res = ctx->initializeHeadless(256, 256); if (res.code != Result::Code::Ok) { IGL_LOG_ERROR("[Tests] D3D12 headless context init failed: %s\n", res.message.c_str()); return nullptr; } return std::make_unique(std::move(ctx)); } } // namespace igl::tests::util::device::d3d12 ================================================ FILE: src/igl/tests/util/device/d3d12/TestDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::tests::util::device::d3d12 { /** * Create and return an igl::d3d12::Device that is suitable for running tests against. * This creates a headless device without a swapchain, suitable for unit testing. */ std::unique_ptr createTestDevice(bool enableDebugLayer = true); } // namespace igl::tests::util::device::d3d12 ================================================ FILE: src/igl/tests/util/device/metal/TestDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::tests::util::device::metal { /** Create and return an igl::Device that is suitable for running tests against. */ std::unique_ptr createTestDevice(); } // namespace igl::tests::util::device::metal ================================================ FILE: src/igl/tests/util/device/metal/TestDevice.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include namespace igl::tests::util::device::metal { // // createTestDevice // // Used by clients to get an IGL device. The backend is determined by // the IGL_BACKEND_TYPE compiler flag in the BUCK file // std::unique_ptr createTestDevice() { auto mtlDevice = MTLCreateSystemDefaultDevice(); return ::igl::metal::HWDevice().createWithMTLDevice(mtlDevice, nullptr); } } // namespace igl::tests::util::device::metal ================================================ FILE: src/igl/tests/util/device/opengl/TestDevice.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #if IGL_PLATFORM_IOS #include #elif IGL_PLATFORM_MACOSX #include #elif IGL_PLATFORM_ANDROID || IGL_PLATFORM_LINUX_USE_EGL #include #elif IGL_PLATFORM_LINUX #include #elif IGL_PLATFORM_WINDOWS #if defined(FORCE_USE_ANGLE) #include #else #include #endif // FORCE_USE_ANGLE #else #error "Unsupported testing platform" #endif namespace igl::tests::util::device::opengl { namespace { template std::unique_ptr<::igl::opengl::Device> createOffscreenDevice() { THWDevice hwDevice; auto context = hwDevice.createOffscreenContext(640, 380, nullptr); return hwDevice.createWithContext(std::move(context), nullptr); } } // namespace // // createTestDevice // // Used by clients to get an IGL device. The backend is determined by // the IGL_BACKEND_TYPE compiler flag in the BUCK file // std::unique_ptr createTestDevice( std::optional requestedVersion) { std::unique_ptr iglDev = nullptr; #if IGL_PLATFORM_IOS iglDev = requestedVersion ? ::igl::opengl::ios::HWDevice().create(*requestedVersion) : ::igl::opengl::ios::HWDevice().create(); #elif IGL_PLATFORM_MACOSX iglDev = requestedVersion ? ::igl::opengl::macos::HWDevice().create(*requestedVersion) : ::igl::opengl::macos::HWDevice().create(); #elif IGL_PLATFORM_ANDROID || IGL_PLATFORM_LINUX_USE_EGL iglDev = createOffscreenDevice<::igl::opengl::egl::HWDevice>(); #elif IGL_PLATFORM_LINUX iglDev = createOffscreenDevice<::igl::opengl::glx::HWDevice>(); #elif IGL_PLATFORM_WINDOWS #if defined(FORCE_USE_ANGLE) iglDev = createOffscreenDevice<::igl::opengl::egl::HWDevice>(); #else iglDev = createOffscreenDevice<::igl::opengl::wgl::HWDevice>(); #endif // FORCE_USE_ANGLE #else #endif return iglDev; } } // namespace igl::tests::util::device::opengl ================================================ FILE: src/igl/tests/util/device/opengl/TestDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::tests::util::device::opengl { /** Create and return an igl::Device that is suitable for running tests against. */ std::unique_ptr createTestDevice( std::optional requestedVersion = {}); } // namespace igl::tests::util::device::opengl ================================================ FILE: src/igl/tests/util/device/vulkan/TestDevice.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_IOS || \ IGL_PLATFORM_LINUX #include #include #include #endif #if IGL_PLATFORM_MACOSX #include #endif namespace igl::tests::util::device::vulkan { // // createTestDevice // // Used by clients to get an IGL device. // igl::vulkan::VulkanContextConfig getContextConfig(bool enableValidation) { igl::vulkan::VulkanContextConfig config; config.enableValidation = enableValidation; config.enableGPUAssistedValidation = enableValidation; #if IGL_PLATFORM_MACOSX config.terminateOnValidationError = false; #elif IGL_DEBUG config.terminateOnValidationError = enableValidation; #else config.enableValidation = false; config.terminateOnValidationError = false; #endif #ifdef IGL_DISABLE_VALIDATION config.enableValidation = false; config.terminateOnValidationError = false; #endif config.swapChainColorSpace = igl::ColorSpace::SRGB_NONLINEAR; config.enableExtraLogs = enableValidation; return config; } std::unique_ptr createTestDevice( const igl::vulkan::VulkanContextConfig& config) { #if IGL_PLATFORM_MACOSX ::igl::vulkan::setupMoltenVKEnvironment(); #endif std::unique_ptr iglDev = nullptr; Result ret; auto ctx = igl::vulkan::HWDevice::createContext(config, nullptr); std::vector devices = igl::vulkan::HWDevice::queryDevices(*ctx, HWDeviceQueryDesc(HWDeviceType::Unknown), &ret); if (ret.isOk()) { std::vector extraDeviceExtensions; extraDeviceExtensions.emplace_back(VK_KHR_MULTIVIEW_EXTENSION_NAME); igl::vulkan::VulkanFeatures features(config); features.populateWithAvailablePhysicalDeviceFeatures( *ctx, (VkPhysicalDevice)devices[0].guid); // NOLINT(performance-no-int-to-ptr) iglDev = igl::vulkan::HWDevice::create(std::move(ctx), devices[0], 0, // width 0, // height, extraDeviceExtensions.size(), extraDeviceExtensions.data(), &features, "Test Device", &ret); if (!ret.isOk()) { iglDev = nullptr; } } return iglDev; } std::unique_ptr createTestDevice(bool enableValidation) { return createTestDevice(getContextConfig(enableValidation)); } } // namespace igl::tests::util::device::vulkan ================================================ FILE: src/igl/tests/util/device/vulkan/TestDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::tests::util::device::vulkan { /** Configure and return a context configuration. */ igl::vulkan::VulkanContextConfig getContextConfig(bool enableValidation = true); /** Create and return an igl::Device that is suitable for running tests against. */ std::unique_ptr createTestDevice( const igl::vulkan::VulkanContextConfig& config); /** Helper to create a Vulkan device with default configuration and optional validation. */ std::unique_ptr createTestDevice(bool enableValidation = true); } // namespace igl::tests::util::device::vulkan ================================================ FILE: src/igl/tests/util/simdstub.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once namespace simd { struct Float1 { float x; }; struct Float2 { float x, y; }; struct Float3 { float x, y, z; }; struct Float4 { float x, y, z, w; }; struct Int1 { int x; }; struct Int2 { int x, y; }; struct Int3 { int x, y, z; }; struct Int4 { int x, y, z, w; }; struct Float2x2 { Float2 columns[2]; }; struct Float3x2 { Float2 columns[3]; }; struct Float3x3 { Float3 columns[3]; }; struct Float4x4 { Float4 columns[4]; }; // Type aliases for backward compatibility with Apple SIMD API using float1 = Float1; using float2 = Float2; using float3 = Float3; using float4 = Float4; using int1 = Int1; using int2 = Int2; using int3 = Int3; using int4 = Int4; using float2x2 = Float2x2; using float3x2 = Float3x2; using float3x3 = Float3x3; using float4x4 = Float4x4; } // namespace simd ================================================ FILE: src/igl/tests/vulkan/ColorSpace.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace igl::vulkan::tests { TEST(ColorSpaceTest, colorSpaceToVkColorSpace) { ASSERT_EQ(VkColorSpaceKHR::VK_COLOR_SPACE_BT709_LINEAR_EXT, colorSpaceToVkColorSpace(ColorSpace::SRGB_LINEAR)); ASSERT_EQ(VkColorSpaceKHR::VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, colorSpaceToVkColorSpace(ColorSpace::SRGB_NONLINEAR)); ASSERT_EQ(VkColorSpaceKHR::VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT, colorSpaceToVkColorSpace(ColorSpace::DISPLAY_P3_NONLINEAR)); ASSERT_EQ(VkColorSpaceKHR::VK_COLOR_SPACE_DISPLAY_P3_LINEAR_EXT, colorSpaceToVkColorSpace(ColorSpace::DISPLAY_P3_LINEAR)); ASSERT_EQ(VkColorSpaceKHR::VK_COLOR_SPACE_EXTENDED_SRGB_LINEAR_EXT, colorSpaceToVkColorSpace(ColorSpace::EXTENDED_SRGB_LINEAR)); ASSERT_EQ(VkColorSpaceKHR::VK_COLOR_SPACE_DCI_P3_NONLINEAR_EXT, colorSpaceToVkColorSpace(ColorSpace::DCI_P3_NONLINEAR)); ASSERT_EQ(VkColorSpaceKHR::VK_COLOR_SPACE_BT709_LINEAR_EXT, colorSpaceToVkColorSpace(ColorSpace::BT709_LINEAR)); ASSERT_EQ(VkColorSpaceKHR::VK_COLOR_SPACE_BT709_NONLINEAR_EXT, colorSpaceToVkColorSpace(ColorSpace::BT709_NONLINEAR)); ASSERT_EQ(VkColorSpaceKHR::VK_COLOR_SPACE_BT2020_LINEAR_EXT, colorSpaceToVkColorSpace(ColorSpace::BT2020_LINEAR)); ASSERT_EQ(VkColorSpaceKHR::VK_COLOR_SPACE_HDR10_ST2084_EXT, colorSpaceToVkColorSpace(ColorSpace::HDR10_ST2084)); ASSERT_EQ(VkColorSpaceKHR::VK_COLOR_SPACE_DOLBYVISION_EXT, colorSpaceToVkColorSpace(ColorSpace::DOLBYVISION)); ASSERT_EQ(VkColorSpaceKHR::VK_COLOR_SPACE_HDR10_HLG_EXT, colorSpaceToVkColorSpace(ColorSpace::HDR10_HLG)); ASSERT_EQ(VkColorSpaceKHR::VK_COLOR_SPACE_ADOBERGB_LINEAR_EXT, colorSpaceToVkColorSpace(ColorSpace::ADOBERGB_LINEAR)); ASSERT_EQ(VkColorSpaceKHR::VK_COLOR_SPACE_ADOBERGB_NONLINEAR_EXT, colorSpaceToVkColorSpace(ColorSpace::ADOBERGB_NONLINEAR)); ASSERT_EQ(VkColorSpaceKHR::VK_COLOR_SPACE_PASS_THROUGH_EXT, colorSpaceToVkColorSpace(ColorSpace::PASS_THROUGH)); ASSERT_EQ(VkColorSpaceKHR::VK_COLOR_SPACE_EXTENDED_SRGB_NONLINEAR_EXT, colorSpaceToVkColorSpace(ColorSpace::EXTENDED_SRGB_NONLINEAR)); ASSERT_EQ(VkColorSpaceKHR::VK_COLOR_SPACE_DISPLAY_NATIVE_AMD, colorSpaceToVkColorSpace(ColorSpace::DISPLAY_NATIVE_AMD)); /* asserts for IGL_DEBUG_ASSERT_NOT_IMPLEMENTED but would be valid otherwise ASSERT_EQ(VkColorSpaceKHR::VK_COLOR_SPACE_BT709_NONLINEAR_EXT, colorSpaceToVkColorSpace(ColorSpace::BT2020_NONLINEAR)); ASSERT_EQ(VkColorSpaceKHR::VK_COLOR_SPACE_BT709_NONLINEAR_EXT, colorSpaceToVkColorSpace(ColorSpace::BT601_NONLINEAR)); ASSERT_EQ(VkColorSpaceKHR::VK_COLOR_SPACE_BT709_NONLINEAR_EXT, colorSpaceToVkColorSpace(ColorSpace::BT2100_HLG_NONLINEAR)); ASSERT_EQ(VkColorSpaceKHR::VK_COLOR_SPACE_BT709_NONLINEAR_EXT, colorSpaceToVkColorSpace(ColorSpace::BT2100_PQ_NONLINEAR)); ASSERT_EQ(VkColorSpaceKHR::VK_COLOR_SPACE_BT709_NONLINEAR_EXT, colorSpaceToVkColorSpace(ColorSpace::DISPLAY_P3_NONLINEAR));*/ } TEST(ColorSpaceTest, vkColorSpaceToColorSpace) { ASSERT_EQ(ColorSpace::SRGB_NONLINEAR, vkColorSpaceToColorSpace(VkColorSpaceKHR::VK_COLOR_SPACE_SRGB_NONLINEAR_KHR)); ASSERT_EQ(ColorSpace::DISPLAY_P3_NONLINEAR, vkColorSpaceToColorSpace(VkColorSpaceKHR::VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT)); ASSERT_EQ(ColorSpace::EXTENDED_SRGB_LINEAR, vkColorSpaceToColorSpace(VkColorSpaceKHR::VK_COLOR_SPACE_EXTENDED_SRGB_LINEAR_EXT)); ASSERT_EQ(ColorSpace::DISPLAY_P3_LINEAR, vkColorSpaceToColorSpace(VkColorSpaceKHR::VK_COLOR_SPACE_DISPLAY_P3_LINEAR_EXT)); ASSERT_EQ(ColorSpace::DCI_P3_NONLINEAR, vkColorSpaceToColorSpace(VkColorSpaceKHR::VK_COLOR_SPACE_DCI_P3_NONLINEAR_EXT)); ASSERT_EQ(ColorSpace::BT709_LINEAR, vkColorSpaceToColorSpace(VkColorSpaceKHR::VK_COLOR_SPACE_BT709_LINEAR_EXT)); ASSERT_EQ(ColorSpace::BT709_NONLINEAR, vkColorSpaceToColorSpace(VkColorSpaceKHR::VK_COLOR_SPACE_BT709_NONLINEAR_EXT)); ASSERT_EQ(ColorSpace::BT2020_LINEAR, vkColorSpaceToColorSpace(VkColorSpaceKHR::VK_COLOR_SPACE_BT2020_LINEAR_EXT)); ASSERT_EQ(ColorSpace::HDR10_ST2084, vkColorSpaceToColorSpace(VkColorSpaceKHR::VK_COLOR_SPACE_HDR10_ST2084_EXT)); ASSERT_EQ(ColorSpace::DOLBYVISION, vkColorSpaceToColorSpace(VkColorSpaceKHR::VK_COLOR_SPACE_DOLBYVISION_EXT)); ASSERT_EQ(ColorSpace::HDR10_HLG, vkColorSpaceToColorSpace(VkColorSpaceKHR::VK_COLOR_SPACE_HDR10_HLG_EXT)); ASSERT_EQ(ColorSpace::ADOBERGB_LINEAR, vkColorSpaceToColorSpace(VkColorSpaceKHR::VK_COLOR_SPACE_ADOBERGB_LINEAR_EXT)); ASSERT_EQ(ColorSpace::ADOBERGB_NONLINEAR, vkColorSpaceToColorSpace(VkColorSpaceKHR::VK_COLOR_SPACE_ADOBERGB_NONLINEAR_EXT)); ASSERT_EQ(ColorSpace::PASS_THROUGH, vkColorSpaceToColorSpace(VkColorSpaceKHR::VK_COLOR_SPACE_PASS_THROUGH_EXT)); ASSERT_EQ(ColorSpace::EXTENDED_SRGB_NONLINEAR, vkColorSpaceToColorSpace(VkColorSpaceKHR::VK_COLOR_SPACE_EXTENDED_SRGB_NONLINEAR_EXT)); ASSERT_EQ(ColorSpace::DISPLAY_NATIVE_AMD, vkColorSpaceToColorSpace(VkColorSpaceKHR::VK_COLOR_SPACE_DISPLAY_NATIVE_AMD)); } } // namespace igl::vulkan::tests ================================================ FILE: src/igl/tests/vulkan/CommandBufferVulkanTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/TestDevice.h" #include #include #include #include #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX namespace igl::tests { class CommandBufferVulkanTest : public ::testing::Test { public: CommandBufferVulkanTest() = default; ~CommandBufferVulkanTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); iglDev_ = util::createTestDevice(); ASSERT_NE(iglDev_, nullptr); ASSERT_EQ(iglDev_->getBackendType(), BackendType::Vulkan) << "Test requires Vulkan backend"; Result ret; cmdQueue_ = iglDev_->createCommandQueue(CommandQueueDesc{}, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(cmdQueue_, nullptr); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; }; TEST_F(CommandBufferVulkanTest, GetVkCommandBuffer) { Result ret; auto cmdBuf = cmdQueue_->createCommandBuffer(CommandBufferDesc(), &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(cmdBuf, nullptr); auto* vulkanCmdBuf = static_cast(cmdBuf.get()); EXPECT_TRUE(vulkanCmdBuf->getVkCommandBuffer() != nullptr); cmdQueue_->submit(*cmdBuf); } TEST_F(CommandBufferVulkanTest, DebugGroupLabels) { Result ret; auto cmdBuf = cmdQueue_->createCommandBuffer(CommandBufferDesc(), &ret); ASSERT_TRUE(ret.isOk()); ASSERT_NE(cmdBuf, nullptr); cmdBuf->pushDebugGroupLabel("TestGroup", Color(1.0f, 0.0f, 0.0f, 1.0f)); cmdBuf->popDebugGroupLabel(); cmdQueue_->submit(*cmdBuf); } TEST_F(CommandBufferVulkanTest, CopyBuffer) { Result ret; BufferDesc srcDesc; srcDesc.type = BufferDesc::BufferTypeBits::Storage; srcDesc.storage = ResourceStorage::Shared; srcDesc.length = 128; auto srcBuffer = iglDev_->createBuffer(srcDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); BufferDesc dstDesc; dstDesc.type = BufferDesc::BufferTypeBits::Storage; dstDesc.storage = ResourceStorage::Shared; dstDesc.length = 128; auto dstBuffer = iglDev_->createBuffer(dstDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); std::vector srcData(32, 0xCAFEBABE); ret = srcBuffer->upload(srcData.data(), BufferRange(128, 0)); ASSERT_TRUE(ret.isOk()); auto cmdBuf = cmdQueue_->createCommandBuffer(CommandBufferDesc(), &ret); ASSERT_TRUE(ret.isOk()); cmdBuf->copyBuffer(*srcBuffer, *dstBuffer, 0, 0, 128); cmdQueue_->submit(*cmdBuf); auto& device = static_cast(*iglDev_); device.getVulkanContext().waitIdle(); const auto* downloadedData = static_cast(dstBuffer->map(BufferRange(128, 0), &ret)); ASSERT_TRUE(ret.isOk()); for (size_t i = 0; i < 32; ++i) { EXPECT_EQ(downloadedData[i], 0xCAFEBABE); } dstBuffer->unmap(); } TEST_F(CommandBufferVulkanTest, WaitUntilCompleted) { Result ret; auto cmdBuf = cmdQueue_->createCommandBuffer(CommandBufferDesc(), &ret); ASSERT_TRUE(ret.isOk()); ASSERT_NE(cmdBuf, nullptr); cmdQueue_->submit(*cmdBuf); cmdBuf->waitUntilCompleted(); } TEST_F(CommandBufferVulkanTest, CreateComputeCommandEncoder) { Result ret; auto cmdBuf = cmdQueue_->createCommandBuffer(CommandBufferDesc(), &ret); ASSERT_TRUE(ret.isOk()); ASSERT_NE(cmdBuf, nullptr); auto encoder = cmdBuf->createComputeCommandEncoder(); EXPECT_NE(encoder, nullptr); encoder->endEncoding(); cmdQueue_->submit(*cmdBuf); } TEST_F(CommandBufferVulkanTest, GetNextSubmitHandle) { Result ret; auto cmdBuf = cmdQueue_->createCommandBuffer(CommandBufferDesc(), &ret); ASSERT_TRUE(ret.isOk()); auto* vulkanCmdBuf = static_cast(cmdBuf.get()); auto handle = vulkanCmdBuf->getNextSubmitHandle(); EXPECT_FALSE(handle.empty()); cmdQueue_->submit(*cmdBuf); } } // namespace igl::tests #endif // IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX ================================================ FILE: src/igl/tests/vulkan/CommonTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #include #include #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_LINUX namespace igl::tests { // // CommonTest // // Unit tests for Common.cpp // class CommonTest : public ::testing::Test {}; // getResultFromVkResult *********************************************************************** TEST(CommonTest, GetResultFromVkResultTest) { EXPECT_TRUE(igl::vulkan::getResultFromVkResult(VK_SUCCESS).isOk()); EXPECT_EQ(igl::vulkan::getResultFromVkResult(VK_ERROR_LAYER_NOT_PRESENT).code, Result::Code::Unimplemented); EXPECT_EQ(igl::vulkan::getResultFromVkResult(VK_ERROR_EXTENSION_NOT_PRESENT).code, Result::Code::Unimplemented); EXPECT_EQ(igl::vulkan::getResultFromVkResult(VK_ERROR_FEATURE_NOT_PRESENT).code, Result::Code::Unimplemented); EXPECT_EQ(igl::vulkan::getResultFromVkResult(VK_ERROR_INCOMPATIBLE_DRIVER).code, Result::Code::Unsupported); EXPECT_EQ(igl::vulkan::getResultFromVkResult(VK_ERROR_FORMAT_NOT_SUPPORTED).code, Result::Code::Unsupported); EXPECT_EQ(igl::vulkan::getResultFromVkResult(VK_ERROR_OUT_OF_HOST_MEMORY).code, Result::Code::ArgumentOutOfRange); EXPECT_EQ(igl::vulkan::getResultFromVkResult(VK_ERROR_OUT_OF_DEVICE_MEMORY).code, Result::Code::ArgumentOutOfRange); EXPECT_EQ(igl::vulkan::getResultFromVkResult(VK_ERROR_OUT_OF_POOL_MEMORY).code, Result::Code::ArgumentOutOfRange); EXPECT_EQ(igl::vulkan::getResultFromVkResult(VK_ERROR_TOO_MANY_OBJECTS).code, Result::Code::ArgumentOutOfRange); } // setResultFrom *********************************************************************** TEST(CommonTest, SetResultFromTest) { Result result; igl::vulkan::setResultFrom(&result, VK_SUCCESS); EXPECT_TRUE(result.isOk()); igl::vulkan::setResultFrom(&result, VK_ERROR_LAYER_NOT_PRESENT); EXPECT_EQ(result.code, Result::Code::Unimplemented); igl::vulkan::setResultFrom(&result, VK_ERROR_EXTENSION_NOT_PRESENT); EXPECT_EQ(result.code, Result::Code::Unimplemented); igl::vulkan::setResultFrom(&result, VK_ERROR_FEATURE_NOT_PRESENT); EXPECT_EQ(result.code, Result::Code::Unimplemented); igl::vulkan::setResultFrom(&result, VK_ERROR_INCOMPATIBLE_DRIVER); EXPECT_EQ(result.code, Result::Code::Unsupported); igl::vulkan::setResultFrom(&result, VK_ERROR_FORMAT_NOT_SUPPORTED); EXPECT_EQ(result.code, Result::Code::Unsupported); igl::vulkan::setResultFrom(&result, VK_ERROR_OUT_OF_HOST_MEMORY); EXPECT_EQ(result.code, Result::Code::ArgumentOutOfRange); igl::vulkan::setResultFrom(&result, VK_ERROR_OUT_OF_DEVICE_MEMORY); EXPECT_EQ(result.code, Result::Code::ArgumentOutOfRange); igl::vulkan::setResultFrom(&result, VK_ERROR_OUT_OF_POOL_MEMORY); EXPECT_EQ(result.code, Result::Code::ArgumentOutOfRange); igl::vulkan::setResultFrom(&result, VK_ERROR_TOO_MANY_OBJECTS); EXPECT_EQ(result.code, Result::Code::ArgumentOutOfRange); } // stencilOperationToVkStencilOp *********************************************************** TEST(CommonTest, StencilOperationToVkStencilOpTest) { EXPECT_EQ(igl::vulkan::stencilOperationToVkStencilOp(igl::StencilOperation::Keep), VK_STENCIL_OP_KEEP); EXPECT_EQ(igl::vulkan::stencilOperationToVkStencilOp(igl::StencilOperation::Zero), VK_STENCIL_OP_ZERO); EXPECT_EQ(igl::vulkan::stencilOperationToVkStencilOp(igl::StencilOperation::Replace), VK_STENCIL_OP_REPLACE); EXPECT_EQ(igl::vulkan::stencilOperationToVkStencilOp(igl::StencilOperation::IncrementClamp), VK_STENCIL_OP_INCREMENT_AND_CLAMP); EXPECT_EQ(igl::vulkan::stencilOperationToVkStencilOp(igl::StencilOperation::DecrementClamp), VK_STENCIL_OP_DECREMENT_AND_CLAMP); EXPECT_EQ(igl::vulkan::stencilOperationToVkStencilOp(igl::StencilOperation::Invert), VK_STENCIL_OP_INVERT); EXPECT_EQ(igl::vulkan::stencilOperationToVkStencilOp(igl::StencilOperation::IncrementWrap), VK_STENCIL_OP_INCREMENT_AND_WRAP); EXPECT_EQ(igl::vulkan::stencilOperationToVkStencilOp(igl::StencilOperation::DecrementWrap), VK_STENCIL_OP_DECREMENT_AND_WRAP); } // compareFunctionToVkCompareOp ******************************************************** TEST(CommonTest, CompareFunctionToVkCompareOpTest) { EXPECT_EQ(igl::vulkan::compareFunctionToVkCompareOp(igl::CompareFunction::Never), VK_COMPARE_OP_NEVER); EXPECT_EQ(igl::vulkan::compareFunctionToVkCompareOp(igl::CompareFunction::Less), VK_COMPARE_OP_LESS); EXPECT_EQ(igl::vulkan::compareFunctionToVkCompareOp(igl::CompareFunction::Equal), VK_COMPARE_OP_EQUAL); EXPECT_EQ(igl::vulkan::compareFunctionToVkCompareOp(igl::CompareFunction::LessEqual), VK_COMPARE_OP_LESS_OR_EQUAL); EXPECT_EQ(igl::vulkan::compareFunctionToVkCompareOp(igl::CompareFunction::Greater), VK_COMPARE_OP_GREATER); EXPECT_EQ(igl::vulkan::compareFunctionToVkCompareOp(igl::CompareFunction::NotEqual), VK_COMPARE_OP_NOT_EQUAL); EXPECT_EQ(igl::vulkan::compareFunctionToVkCompareOp(igl::CompareFunction::GreaterEqual), VK_COMPARE_OP_GREATER_OR_EQUAL); EXPECT_EQ(igl::vulkan::compareFunctionToVkCompareOp(igl::CompareFunction::AlwaysPass), VK_COMPARE_OP_ALWAYS); } // getVulkanSampleCountFlags ************************************************************** TEST(CommonTest, GetVulkanSampleCountFlagsTest) { EXPECT_EQ(igl::vulkan::getVulkanSampleCountFlags(1u), VK_SAMPLE_COUNT_1_BIT); EXPECT_EQ(igl::vulkan::getVulkanSampleCountFlags(2u), VK_SAMPLE_COUNT_2_BIT); EXPECT_EQ(igl::vulkan::getVulkanSampleCountFlags(4u), VK_SAMPLE_COUNT_4_BIT); EXPECT_EQ(igl::vulkan::getVulkanSampleCountFlags(8u), VK_SAMPLE_COUNT_8_BIT); EXPECT_EQ(igl::vulkan::getVulkanSampleCountFlags(16u), VK_SAMPLE_COUNT_16_BIT); EXPECT_EQ(igl::vulkan::getVulkanSampleCountFlags(32u), VK_SAMPLE_COUNT_32_BIT); EXPECT_EQ(igl::vulkan::getVulkanSampleCountFlags(64u), VK_SAMPLE_COUNT_64_BIT); } // atVkLayer ******************************************************************************* TEST(CommonTest, AtVkLayerTest) { const igl::TextureRangeDesc texRangeDesc = TextureRangeDesc::newCube(0, 0, 1, 1, 0, 1); constexpr uint32_t layerOrFaceId = 7; constexpr TextureType textureTypes[] = { TextureType::Invalid, TextureType::TwoD, TextureType::TwoDArray, TextureType::ThreeD, TextureType::Cube, TextureType::ExternalImage, }; for (const auto textureType : textureTypes) { const auto newTexRangeDesc = igl::vulkan::atVkLayer(textureType, texRangeDesc, layerOrFaceId); EXPECT_EQ(newTexRangeDesc.face, textureType == TextureType::Cube ? layerOrFaceId : 0); EXPECT_EQ(newTexRangeDesc.layer, textureType == TextureType::Cube ? 0 : layerOrFaceId); EXPECT_EQ(newTexRangeDesc.numFaces, textureType == TextureType::Cube ? 1 : 6); EXPECT_EQ(newTexRangeDesc.x, texRangeDesc.x); EXPECT_EQ(newTexRangeDesc.y, texRangeDesc.y); EXPECT_EQ(newTexRangeDesc.z, texRangeDesc.z); EXPECT_EQ(newTexRangeDesc.width, texRangeDesc.width); EXPECT_EQ(newTexRangeDesc.height, texRangeDesc.height); EXPECT_EQ(newTexRangeDesc.depth, texRangeDesc.depth); EXPECT_EQ(newTexRangeDesc.mipLevel, texRangeDesc.mipLevel); EXPECT_EQ(newTexRangeDesc.numMipLevels, texRangeDesc.numMipLevels); EXPECT_EQ(newTexRangeDesc.numLayers, 1); } } // getNumImagePlanes ************************************************************************ TEST(CommonTest, GetNumImagePlanesTest) { EXPECT_EQ(igl::vulkan::getNumImagePlanes(VK_FORMAT_UNDEFINED), 0); EXPECT_EQ(igl::vulkan::getNumImagePlanes(VK_FORMAT_G8_B8R8_2PLANE_420_UNORM), 2); EXPECT_EQ(igl::vulkan::getNumImagePlanes(VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM), 3); EXPECT_EQ(igl::vulkan::getNumImagePlanes(VK_FORMAT_R8G8B8A8_UNORM), 1); EXPECT_EQ(igl::vulkan::getNumImagePlanes(VK_FORMAT_R8G8B8A8_SRGB), 1); EXPECT_EQ(igl::vulkan::getNumImagePlanes(VK_FORMAT_R8G8B8A8_SINT), 1); EXPECT_EQ(igl::vulkan::getNumImagePlanes(VK_FORMAT_R8G8B8A8_UINT), 1); } class CommonWithDeviceTest : public ::testing::Test { public: // Set up common resources. void SetUp() override { // Turn off debug break so unit tests can run igl::setDebugBreakEnabled(false); device_ = igl::tests::util::device::createTestDevice(igl::BackendType::Vulkan); ASSERT_TRUE(device_ != nullptr); auto& device = static_cast(*device_); context_ = &device.getVulkanContext(); ASSERT_TRUE(context_ != nullptr); } protected: std::shared_ptr device_; vulkan::VulkanContext* context_ = nullptr; }; // transitionToGeneral ******************************************************** TEST_F(CommonWithDeviceTest, TransitionToGeneralTest) { Result result; const CommandQueueDesc queueDesc{}; auto commandQueue = device_->createCommandQueue(queueDesc, &result); EXPECT_TRUE(result.isOk()); const CommandBufferDesc cmdBufferDesc{}; const auto cmdBuffer = commandQueue->createCommandBuffer(cmdBufferDesc, &result); EXPECT_TRUE(result.isOk()); const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 1, 1, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Storage); const auto texture = device_->createTexture(texDesc, &result); EXPECT_TRUE(result.isOk()); igl::vulkan::transitionToGeneral( static_cast(cmdBuffer.get())->getVkCommandBuffer(), texture.get()); const igl::vulkan::Texture& tex = static_cast(*texture); const vulkan::VulkanImage& img = tex.getVulkanTexture().image_; EXPECT_EQ(img.imageLayout_, VK_IMAGE_LAYOUT_GENERAL); } } // namespace igl::tests #endif ================================================ FILE: src/igl/tests/vulkan/ComputeCommandEncoderVulkanTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/TestDevice.h" #include #include #include #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX namespace igl::tests { class ComputeCommandEncoderVulkanTest : public ::testing::Test { public: ComputeCommandEncoderVulkanTest() = default; ~ComputeCommandEncoderVulkanTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); iglDev_ = util::createTestDevice(); ASSERT_NE(iglDev_, nullptr); ASSERT_EQ(iglDev_->getBackendType(), BackendType::Vulkan) << "Test requires Vulkan backend"; Result ret; cmdQueue_ = iglDev_->createCommandQueue(CommandQueueDesc{}, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(cmdQueue_, nullptr); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; }; TEST_F(ComputeCommandEncoderVulkanTest, CreateAndEndEncoding) { Result ret; auto cmdBuf = cmdQueue_->createCommandBuffer(CommandBufferDesc(), &ret); ASSERT_TRUE(ret.isOk()); auto encoder = cmdBuf->createComputeCommandEncoder(); ASSERT_NE(encoder, nullptr); encoder->endEncoding(); cmdQueue_->submit(*cmdBuf); } TEST_F(ComputeCommandEncoderVulkanTest, BindPushConstants) { // NOTE: bindPushConstants requires a compute pipeline to be bound first. // Since creating a compute pipeline requires a compute shader, and this is // just testing the encoder API, we skip this test. The push constants // functionality is tested through integration tests that have full pipelines. GTEST_SKIP() << "bindPushConstants requires a bound compute pipeline with a shader"; } TEST_F(ComputeCommandEncoderVulkanTest, DebugGroupLabels) { Result ret; auto cmdBuf = cmdQueue_->createCommandBuffer(CommandBufferDesc(), &ret); ASSERT_TRUE(ret.isOk()); auto encoder = cmdBuf->createComputeCommandEncoder(); ASSERT_NE(encoder, nullptr); encoder->pushDebugGroupLabel("ComputeGroup", Color(0.0f, 1.0f, 0.0f, 1.0f)); encoder->popDebugGroupLabel(); encoder->endEncoding(); cmdQueue_->submit(*cmdBuf); } } // namespace igl::tests #endif // IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX ================================================ FILE: src/igl/tests/vulkan/DescriptorPoolArenaTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../data/ShaderData.h" #include "../data/TextureData.h" #include "../util/Common.h" #include "../util/TestDevice.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX namespace igl::tests { /// @brief Tests for Vulkan DescriptorPoolsArena caching behavior. /// /// The DescriptorPoolsArena is a private class inside VulkanContext.cpp that manages /// VkDescriptorSet allocation and caching. These tests exercise it indirectly through /// the IGL API by issuing draw calls with bound resources, which triggers the /// updateBindingsTextures/Buffers -> arena.getNextDescriptorSet() path. /// /// Code paths exercised: /// 1. New pool path (isNewPool_=true): Fresh descriptor sets allocated and cached /// 2. Cached reuse path (isNewPool_=false): Descriptor sets reused from recycled pools /// 3. Pool exhaustion (numRemainingDSetsInPool_==0): switchToNewDescriptorPool() /// 4. Extinct pool recycling: Pool + cached descriptor sets reused /// 5. allocatedDSet_ save/restore via ExtinctDescriptorPool /// 6. New pool creation fallback: No extinct pool ready, brand-new pool created class DescriptorPoolArenaTest : public ::testing::Test { public: DescriptorPoolArenaTest() = default; ~DescriptorPoolArenaTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); iglDev_ = util::createTestDevice(); ASSERT_NE(iglDev_, nullptr); ASSERT_EQ(iglDev_->getBackendType(), BackendType::Vulkan) << "Test requires Vulkan backend"; Result ret; cmdQueue_ = iglDev_->createCommandQueue(CommandQueueDesc{}, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(cmdQueue_, nullptr); // Offscreen color texture (render target) const auto colorTexDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 4, 4, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); colorTex_ = iglDev_->createTexture(colorTexDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(colorTex_, nullptr); // Framebuffer const FramebufferDesc fbDesc = { .colorAttachments = {{.texture = colorTex_}}, }; framebuffer_ = iglDev_->createFramebuffer(fbDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(framebuffer_, nullptr); // Shader stages std::unique_ptr stages; util::createSimpleShaderStages(iglDev_, stages); shaderStages_ = std::move(stages); ASSERT_NE(shaderStages_, nullptr); // Vertex input state: position (Float4) at location 0, uv (Float2) at location 1 const VertexInputStateDesc inputDesc = { .numAttributes = 2, .attributes = { { .bufferIndex = data::shader::kSimplePosIndex, .format = VertexAttributeFormat::Float4, .offset = 0, .name = std::string(data::shader::kSimplePos), .location = 0, }, { .bufferIndex = data::shader::kSimpleUvIndex, .format = VertexAttributeFormat::Float2, .offset = 0, .name = std::string(data::shader::kSimpleUv), .location = 1, }, }, .numInputBindings = 2, .inputBindings = { {.stride = sizeof(float) * 4}, {.stride = sizeof(float) * 2}, }, }; vertexInputState_ = iglDev_->createVertexInputState(inputDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(vertexInputState_, nullptr); // Render pipeline (Triangle topology) const RenderPipelineDesc trianglePipelineDesc = { .topology = PrimitiveType::Triangle, .vertexInputState = vertexInputState_, .shaderStages = shaderStages_, .targetDesc = {.colorAttachments = {{.textureFormat = colorTex_->getFormat()}}}, .cullMode = igl::CullMode::Disabled, .fragmentUnitSamplerMap = {{0, IGL_NAMEHANDLE(data::shader::kSimpleSampler)}}, }; pipeline_ = iglDev_->createRenderPipeline(trianglePipelineDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(pipeline_, nullptr); // Second pipeline (Line topology) for pipeline-switch test const RenderPipelineDesc linePipelineDesc = { .topology = PrimitiveType::Line, .vertexInputState = vertexInputState_, .shaderStages = shaderStages_, .targetDesc = {.colorAttachments = {{.textureFormat = colorTex_->getFormat()}}}, .cullMode = igl::CullMode::Disabled, .fragmentUnitSamplerMap = {{0, IGL_NAMEHANDLE(data::shader::kSimpleSampler)}}, }; pipelineLine_ = iglDev_->createRenderPipeline(linePipelineDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(pipelineLine_, nullptr); // Sampler state sampler_ = iglDev_->createSamplerState(SamplerStateDesc{}, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(sampler_, nullptr); // Sampled texture (2x2 RGBA, with dummy pixel data) const auto sampledTexDesc = TextureDesc::new2D( TextureFormat::RGBA_UNorm8, 2, 2, TextureDesc::TextureUsageBits::Sampled); sampledTex_ = iglDev_->createTexture(sampledTexDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(sampledTex_, nullptr); ret = sampledTex_->upload(sampledTex_->getFullRange(0), data::texture::kTexRgba2x2.data()); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); // Vertex buffer (single triangle: 3 vertices x Float4) const float verts[] = { 0.0f, 0.5f, 0.0f, 1.0f, -0.5f, -0.5f, 0.0f, 1.0f, 0.5f, -0.5f, 0.0f, 1.0f}; vb_ = iglDev_->createBuffer( BufferDesc{ .type = BufferDesc::BufferTypeBits::Vertex, .data = verts, .length = sizeof(verts), }, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(vb_, nullptr); // UV buffer (3 vertices x Float2) const float uvs[] = {0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f}; uv_ = iglDev_->createBuffer( BufferDesc{ .type = BufferDesc::BufferTypeBits::Vertex, .data = uvs, .length = sizeof(uvs), }, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(uv_, nullptr); // Uniform buffer (256 bytes, for buffer binding test) uniformBuf_ = iglDev_->createBuffer( BufferDesc{ .type = BufferDesc::BufferTypeBits::Uniform, .length = 256, .storage = ResourceStorage::Shared, }, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(uniformBuf_, nullptr); const std::vector uniformData(64, 1.0f); ret = uniformBuf_->upload(uniformData.data(), BufferRange(256, 0)); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); } void TearDown() override {} protected: /// Encode numDraws draw calls in a single command buffer, submit, and wait for completion. void encodeDrawCalls(const uint32_t numDraws, const bool bindBuffer = false, const std::shared_ptr& altPipeline = nullptr, const uint32_t switchAfter = 0) { Result ret; const auto cmdBuf = cmdQueue_->createCommandBuffer(CommandBufferDesc{}, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(cmdBuf, nullptr); const RenderPassDesc rpDesc = { .colorAttachments = {{ .loadAction = LoadAction::Clear, .storeAction = StoreAction::Store, }}, }; const auto encoder = cmdBuf->createRenderCommandEncoder(rpDesc, framebuffer_, {}, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(encoder, nullptr); encoder->bindRenderPipelineState(pipeline_); encoder->bindTexture(0, BindTarget::kFragment, sampledTex_.get()); encoder->bindSamplerState(0, BindTarget::kFragment, sampler_.get()); encoder->bindVertexBuffer(data::shader::kSimplePosIndex, *vb_); encoder->bindVertexBuffer(data::shader::kSimpleUvIndex, *uv_); if (bindBuffer) { encoder->bindBuffer(0, uniformBuf_.get(), 0, 256); } for (uint32_t i = 0; i < numDraws; i++) { if (altPipeline && switchAfter > 0 && i == switchAfter) { encoder->bindRenderPipelineState(altPipeline); } encoder->draw(3); // 3 vertices = 1 triangle } encoder->endEncoding(); cmdQueue_->submit(*cmdBuf); cmdBuf->waitUntilCompleted(); } /// Shorthand: encode N draw calls and wait for GPU completion (one "frame"). void renderFrame(const uint32_t numDraws, const bool bindBuffer = false) { encodeDrawCalls(numDraws, bindBuffer); } std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; std::shared_ptr framebuffer_; std::shared_ptr colorTex_; std::shared_ptr sampledTex_; std::shared_ptr sampler_; std::shared_ptr pipeline_; std::shared_ptr pipelineLine_; std::shared_ptr shaderStages_; std::shared_ptr vertexInputState_; std::unique_ptr vb_; std::unique_ptr uv_; std::unique_ptr uniformBuf_; }; // Test 1: A single draw triggers one getNextDescriptorSet() on a fresh arena (new pool path). TEST_F(DescriptorPoolArenaTest, SingleDrawAllocatesDescriptorSet) { renderFrame(1); } // Test 2: Multiple draws within one command buffer allocate multiple descriptor sets // from the same pool (pool has capacity 64). Exercises repeated new-pool-path allocations. TEST_F(DescriptorPoolArenaTest, MultipleDrawsInSingleCommandBuffer) { renderFrame(10); } // Test 3: 65 draws exhaust the first pool (capacity 64) and trigger switchToNewDescriptorPool(). // Since this is the first frame, no extinct pools exist -> new pool creation fallback (path 6). TEST_F(DescriptorPoolArenaTest, ExhaustDescriptorPool) { renderFrame(65); } // Test 4: Multiple frames exercise extinct pool recycling (path 4) and cached descriptor set // reuse (path 2). Frame 0 creates a fresh pool. Subsequent frames push the previous pool // to extinct and recycle it (if GPU work is done), reusing cached descriptor sets. TEST_F(DescriptorPoolArenaTest, MultipleFramesRecyclesPools) { for (int frame = 0; frame < 4; frame++) { renderFrame(10); } } // Test 5: All paths combined — pool exhaustion + extinct pool recycling + cached reuse. // Each frame exhausts one pool (64 draws) and partially fills a second (6 draws). // On subsequent frames, both extinct pools become candidates for recycling. TEST_F(DescriptorPoolArenaTest, ExhaustAndRecycleAcrossFrames) { for (int frame = 0; frame < 4; frame++) { renderFrame(70); } } // Test 6: Bind both a texture+sampler AND a uniform buffer, exercising both // CombinedImageSamplers and Buffers arenas independently in the same draw. TEST_F(DescriptorPoolArenaTest, MultipleResourceTypesBindings) { for (int frame = 0; frame < 4; frame++) { renderFrame(10, /*bindBuffer=*/true); } } // Test 7: Pipeline switch within a single command buffer. Exercises the pipeline dirty flag // logic and arena lookup when the bound pipeline changes mid-encoding. TEST_F(DescriptorPoolArenaTest, PipelineSwitchWithDraws) { encodeDrawCalls( /*numDraws=*/10, /*bindBuffer=*/false, /*altPipeline=*/pipelineLine_, /*switchAfter=*/5); } // Test 8: 200 draws in one frame exhaust 3 pools (3 x 64 = 192) and partially fill a 4th. // All pools are pushed to the extinct deque within the same submit handle. TEST_F(DescriptorPoolArenaTest, StressPoolExhaustion) { renderFrame(200); } } // namespace igl::tests #endif // IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX ================================================ FILE: src/igl/tests/vulkan/Device.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/TestDevice.h" #include #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX #include #include #include #include #include #include #include #include #include #include #endif namespace igl::tests { class DeviceVulkanTest : public ::testing::Test { public: DeviceVulkanTest() = default; ~DeviceVulkanTest() override = default; // Set up common resources. This will create a device void SetUp() override { // Turn off debug break so unit tests can run igl::setDebugBreakEnabled(false); iglDev_ = util::createTestDevice(); ASSERT_NE(iglDev_, nullptr); } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; }; /// CreateCommandQueue /// Once the backend is more mature, we will use the IGL level test. For now /// this is just here as a proof of concept. TEST_F(DeviceVulkanTest, CreateCommandQueue) { Result ret; CommandQueueDesc desc{}; auto cmdQueue = iglDev_->createCommandQueue(desc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(cmdQueue, nullptr); } TEST_F(DeviceVulkanTest, PlatformDevice) { auto& platformDevice = iglDev_->getPlatformDevice(); auto& vulkanPlatformDevice = static_cast(platformDevice); Result ret; auto depthTexture = vulkanPlatformDevice.createTextureFromNativeDepth(2, 2, &ret); ASSERT_TRUE(ret.isOk()); // ASSERT_TRUE(depthTexture != nullptr); // no swapchain so null auto texture = vulkanPlatformDevice.createTextureFromNativeDrawable(&ret); ASSERT_TRUE(ret.isOk()); // ASSERT_TRUE(texture != nullptr); // no swapchain so null CommandQueueDesc desc{}; auto cmdQueue = iglDev_->createCommandQueue(desc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(cmdQueue, nullptr); auto cmdBuf = cmdQueue->createCommandBuffer(CommandBufferDesc(), &ret); auto submitHandle = cmdQueue->submit(*cmdBuf); // NOLINTNEXTLINE(readability-qualified-auto) auto fence1 = vulkanPlatformDevice.getVkFenceFromSubmitHandle(submitHandle); ASSERT_NE(fence1, VK_NULL_HANDLE); vulkanPlatformDevice.waitOnSubmitHandle(submitHandle); } TEST_F(DeviceVulkanTest, Semaphores) { auto& device = static_cast(*iglDev_); auto& ctx = device.getVulkanContext(); // binary semaphore { auto semaphore = std::make_unique( ctx.vf_, ctx.getVkDevice(), false, "semaphore"); ASSERT_NE(semaphore, nullptr); ASSERT_NE(semaphore->getVkSemaphore(), VK_NULL_HANDLE); ASSERT_EQ(semaphore->getFileDescriptor(), -1); } // timeline semaphore { auto semaphore = std::make_unique( ctx.vf_, ctx.getVkDevice(), 0, false, "timelineSemaphore"); ASSERT_NE(semaphore, nullptr); ASSERT_NE(semaphore->getVkSemaphore(), VK_NULL_HANDLE); ASSERT_EQ(semaphore->getFileDescriptor(), -1); } } TEST_F(DeviceVulkanTest, PlatformDeviceSampler) { Result ret; TextureDesc textureDesc = TextureDesc::new2D( igl::TextureFormat::RGBA_UNorm8, 2, 2, TextureDesc::TextureUsageBits::Sampled); auto texture = iglDev_->createTexture(textureDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_TRUE(texture != nullptr); auto* vulkanTexture = static_cast(texture.get()); auto& innerVulkanTexture = vulkanTexture->getVulkanTexture(); (void)innerVulkanTexture.imageView_; ASSERT_TRUE(innerVulkanTexture.textureId_ != 0); SamplerStateDesc samplerDesc; auto samplerState = iglDev_->createSamplerState(samplerDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); auto* vulkanSamplerState = static_cast(samplerState.get()); auto samplerId = vulkanSamplerState->getSamplerId(); ASSERT_EQ(samplerId, 1); ASSERT_FALSE(vulkanSamplerState->isYUV()); CommandQueueDesc cmdQueueDesc{}; auto cmdQueue = iglDev_->createCommandQueue(cmdQueueDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(cmdQueue, nullptr); auto cmdBuf = cmdQueue->createCommandBuffer(CommandBufferDesc(), &ret); cmdQueue->submit(*cmdBuf); } #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX TEST_F(DeviceVulkanTest, StagingDeviceLargeBufferTest) { Result ret; // create a GPU device-local storage buffer large enough to force Vulkan staging device to upload // it in multiple chunks igl::vulkan::VulkanContext& ctx = static_cast(iglDev_.get())->getVulkanContext(); const VkDeviceSize kMaxStagingBufferSize = ctx.stagingDevice_->getMaxStagingBufferSize(); const std::array kDesiredBufferSizes = {kMaxStagingBufferSize * 2u, kMaxStagingBufferSize + 2u}; size_t maxBufferLength = 0; iglDev_->getFeatureLimits(DeviceFeatureLimits::MaxStorageBufferBytes, maxBufferLength); for (const auto kDesiredBufferSize : kDesiredBufferSizes) { const auto length = std::min(kDesiredBufferSize, maxBufferLength); ASSERT_TRUE(length % 2 == 0); const BufferDesc bufferDesc{ .type = BufferDesc::BufferTypeBits::Storage, .length = static_cast(length), .storage = ResourceStorage::Private, }; const std::shared_ptr buffer = iglDev_->createBuffer(bufferDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_TRUE(buffer != nullptr); // upload { std::vector bufferData(length / 2); uint16_t* data = bufferData.data(); for (size_t i = 0; i != length / 2; i++) { data[i] = uint16_t(i & 0xffff); } ret = buffer->upload(data, BufferRange(length, 0)); ASSERT_EQ(ret.code, Result::Code::Ok); } // download { // map() will create a CPU-copy of data const auto* data = static_cast(buffer->map(BufferRange(length, 0), &ret)); ASSERT_EQ(ret.code, Result::Code::Ok); for (size_t i = 0; i != length / 2; i++) { ASSERT_EQ(data[i], uint16_t(i & 0xffff)); } buffer->unmap(); } ASSERT_EQ(ret.code, Result::Code::Ok); } } TEST_F(DeviceVulkanTest, DestroyEmptyHandles) { igl::destroy(iglDev_.get(), BindGroupTextureHandle{}); igl::destroy(iglDev_.get(), BindGroupBufferHandle{}); igl::destroy(iglDev_.get(), TextureHandle{}); igl::destroy(iglDev_.get(), SamplerHandle{}); igl::destroy(iglDev_.get(), DepthStencilStateHandle{}); } TEST_F(DeviceVulkanTest, CurrentThreadIdTest) { igl::vulkan::VulkanContext& ctx = static_cast(iglDev_.get())->getVulkanContext(); ctx.ensureCurrentContextThread(); } TEST_F(DeviceVulkanTest, EnsureValidation) { GTEST_SKIP() << "Some tests are still running without Validation Layers enabled, so this test " "has been temporarily disabled."; #if !defined(IGL_DISABLE_VALIDATION) // @fb-only // igl::vulkan::VulkanContext& ctx = // static_cast(iglDev_.get())->getVulkanContext(); // ASSERT_TRUE(ctx.areValidationLayersEnabled()); #endif // !defined(IGL_DISABLE_VALIDATION) } TEST_F(DeviceVulkanTest, UpdateGlslangResource) { const igl::vulkan::VulkanContext& ctx = static_cast(iglDev_.get())->getVulkanContext(); ivkUpdateGlslangResource(nullptr, nullptr, nullptr); glslang_resource_t res = {}; const VkPhysicalDeviceProperties& props = ctx.getVkPhysicalDeviceProperties(); ivkUpdateGlslangResource(&res, &props, nullptr); ASSERT_EQ(res.max_vertex_attribs, (int)props.limits.maxVertexInputAttributes); ASSERT_EQ(res.max_clip_distances, (int)props.limits.maxClipDistances); ASSERT_EQ(res.max_compute_work_group_count_x, (int)props.limits.maxComputeWorkGroupCount[0]); ASSERT_EQ(res.max_compute_work_group_count_y, (int)props.limits.maxComputeWorkGroupCount[1]); ASSERT_EQ(res.max_compute_work_group_count_z, (int)props.limits.maxComputeWorkGroupCount[2]); ASSERT_EQ(res.max_compute_work_group_size_x, (int)props.limits.maxComputeWorkGroupSize[0]); ASSERT_EQ(res.max_compute_work_group_size_y, (int)props.limits.maxComputeWorkGroupSize[1]); ASSERT_EQ(res.max_compute_work_group_size_z, (int)props.limits.maxComputeWorkGroupSize[2]); ASSERT_EQ(res.max_vertex_output_components, (int)props.limits.maxVertexOutputComponents); ASSERT_EQ(res.max_geometry_input_components, (int)props.limits.maxGeometryInputComponents); ASSERT_EQ(res.max_geometry_output_components, (int)props.limits.maxGeometryOutputComponents); ASSERT_EQ(res.max_fragment_input_components, (int)props.limits.maxFragmentInputComponents); ASSERT_EQ(res.max_geometry_output_vertices, (int)props.limits.maxGeometryOutputVertices); ASSERT_EQ(res.max_geometry_total_output_components, (int)props.limits.maxGeometryTotalOutputComponents); ASSERT_EQ(res.max_tess_control_input_components, (int)props.limits.maxTessellationControlPerVertexInputComponents); ASSERT_EQ(res.max_tess_control_output_components, (int)props.limits.maxTessellationControlPerVertexOutputComponents); ASSERT_EQ(res.max_tess_evaluation_input_components, (int)props.limits.maxTessellationEvaluationInputComponents); ASSERT_EQ(res.max_tess_evaluation_output_components, (int)props.limits.maxTessellationEvaluationOutputComponents); ASSERT_EQ(res.max_viewports, (int)props.limits.maxViewports); ASSERT_EQ(res.max_cull_distances, (int)props.limits.maxCullDistances); ASSERT_EQ(res.max_combined_clip_and_cull_distances, (int)props.limits.maxCombinedClipAndCullDistances); } TEST_F(DeviceVulkanTest, BufferDeviceAddress) { const igl::vulkan::VulkanContext& ctx = static_cast(iglDev_.get())->getVulkanContext(); if (!ctx.features().has_VK_KHR_buffer_device_address) { return; } Result ret; auto buffer = iglDev_->createBuffer( BufferDesc{ .type = BufferDesc::BufferTypeBits::Uniform, .length = 256, .storage = ResourceStorage::Shared, }, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(buffer, nullptr); if (!buffer) { return; } ASSERT_NE(buffer->gpuAddress(), 0u); } GTEST_TEST(VulkanContext, DescriptorIndexing) { const igl::vulkan::VulkanContextConfig config = { #if IGL_PLATFORM_MACOSX .terminateOnValidationError = false, #elif IGL_DEBUG .terminateOnValidationError = true, #ifdef IGL_DISABLE_VALIDATION .enableValidation = false, #else .enableValidation = true, #endif // IGL_DISABLE_VALIDATION #else .terminateOnValidationError = false, #ifdef IGL_DISABLE_VALIDATION .enableValidation = false, #else .enableValidation = true, #endif // IGL_DISABLE_VALIDATION #endif .enableExtraLogs = true, .enableDescriptorIndexing = true, }; std::unique_ptr iglDev = nullptr; auto ctx = igl::vulkan::HWDevice::createContext(config, nullptr); Result ret; std::vector devices = igl::vulkan::HWDevice::queryDevices(*ctx, HWDeviceQueryDesc(HWDeviceType::Unknown), &ret); ASSERT_TRUE(!devices.empty()); if (ret.isOk()) { igl::vulkan::VulkanFeatures features(config); features.populateWithAvailablePhysicalDeviceFeatures( *ctx, (VkPhysicalDevice)devices[0].guid); // NOLINT(performance-no-int-to-ptr) const VkPhysicalDeviceDescriptorIndexingFeaturesEXT& dif = features.featuresDescriptorIndexing; if (!dif.shaderSampledImageArrayNonUniformIndexing || !dif.descriptorBindingUniformBufferUpdateAfterBind || !dif.descriptorBindingSampledImageUpdateAfterBind || !dif.descriptorBindingStorageImageUpdateAfterBind || !dif.descriptorBindingStorageBufferUpdateAfterBind || !dif.descriptorBindingUpdateUnusedWhilePending || !dif.descriptorBindingPartiallyBound || !dif.runtimeDescriptorArray) { return; } iglDev = igl::vulkan::HWDevice::create(std::move(ctx), devices[0], 0, // width 0, // height, 0, nullptr, &features, "VulkanContext Test", &ret); if (!ret.isOk()) { iglDev = nullptr; } } ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(iglDev, nullptr); if (!iglDev) { return; } const TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 1, 1, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); auto texture = iglDev->createTexture(texDesc, &ret); ASSERT_EQ(ret.code, Result::Code::Ok); ASSERT_NE(texture, nullptr); if (!texture) { return; } ASSERT_NE(texture->getTextureId(), 0u); } TEST_F(DeviceVulkanTest, UniformBlockRingBufferTest) { Result ret; // Create uniform buffer with ring buffer hint const size_t bufferSize = 256; const BufferDesc bufferDesc{ .type = BufferDesc::BufferTypeBits::Uniform, .length = bufferSize, .storage = ResourceStorage::Shared, .hint = BufferDesc::BufferAPIHintBits::Ring | BufferDesc::BufferAPIHintBits::UniformBlock, }; auto buffer = iglDev_->createBuffer(bufferDesc, &ret); ASSERT_TRUE(ret.isOk()); ASSERT_NE(buffer, nullptr); // Upload and verify data std::vector testData(bufferSize / sizeof(uint32_t)); for (unsigned int& i : testData) { i = rand(); } ret = buffer->upload(testData.data(), BufferRange(bufferSize, 0)); ASSERT_TRUE(ret.isOk()); // Create and submit multiple command buffers CommandQueueDesc queueDesc{}; auto cmdQueue = iglDev_->createCommandQueue(queueDesc, &ret); ASSERT_TRUE(ret.isOk()); std::vector bufferHandles; // By default the VulkanContextConfig.maxResourceCount is 3, so we should create at most 3 unique // VkBuffers for (int i = 0; i < 4; i++) { auto cmdBuf = cmdQueue->createCommandBuffer(CommandBufferDesc(), &ret); ASSERT_TRUE(ret.isOk()); auto* vulkanBufferCast = static_cast(buffer.get()); const auto& vulkanBuffer = vulkanBufferCast->currentVulkanBuffer(); bufferHandles.push_back(vulkanBuffer->getVkBuffer()); ASSERT_EQ(vulkanBuffer->getSize(), bufferSize); cmdQueue->submit(*cmdBuf); } // Verify different buffer handles were used for the first 3 for (size_t i = 1; i < 3; i++) { ASSERT_NE(bufferHandles[i], bufferHandles[i - 1]); } // First and last handles should be the same ASSERT_EQ(bufferHandles[3], bufferHandles[0]); } #endif } // namespace igl::tests ================================================ FILE: src/igl/tests/vulkan/DeviceExtendedVulkanTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/TestDevice.h" #include #include #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX namespace igl::tests { class DeviceExtendedVulkanTest : public ::testing::Test { public: DeviceExtendedVulkanTest() = default; ~DeviceExtendedVulkanTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); iglDev_ = util::createTestDevice(); ASSERT_NE(iglDev_, nullptr); ASSERT_EQ(iglDev_->getBackendType(), BackendType::Vulkan) << "Test requires Vulkan backend"; } void TearDown() override {} protected: std::shared_ptr iglDev_; }; TEST_F(DeviceExtendedVulkanTest, CreateDepthStencilState) { Result ret; DepthStencilStateDesc desc; desc.isDepthWriteEnabled = true; desc.compareFunction = CompareFunction::Less; auto state = iglDev_->createDepthStencilState(desc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(state, nullptr); } TEST_F(DeviceExtendedVulkanTest, CreateDepthStencilStateWithStencil) { Result ret; DepthStencilStateDesc desc; desc.isDepthWriteEnabled = true; desc.compareFunction = CompareFunction::LessEqual; desc.frontFaceStencil.stencilCompareFunction = CompareFunction::AlwaysPass; desc.frontFaceStencil.stencilFailureOperation = StencilOperation::Keep; desc.frontFaceStencil.depthFailureOperation = StencilOperation::Keep; desc.frontFaceStencil.depthStencilPassOperation = StencilOperation::Replace; desc.backFaceStencil = desc.frontFaceStencil; auto state = iglDev_->createDepthStencilState(desc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(state, nullptr); } TEST_F(DeviceExtendedVulkanTest, GetShaderVersion) { auto version = iglDev_->getShaderVersion(); EXPECT_GT(version.majorVersion, 0u); } TEST_F(DeviceExtendedVulkanTest, GetBackendVersion) { auto version = iglDev_->getBackendVersion(); EXPECT_GT(version.majorVersion, 0u); } TEST_F(DeviceExtendedVulkanTest, GetCurrentDrawCount) { auto drawCount = iglDev_->getCurrentDrawCount(); EXPECT_EQ(drawCount, 0u); } TEST_F(DeviceExtendedVulkanTest, GetBackendType) { EXPECT_EQ(iglDev_->getBackendType(), BackendType::Vulkan); } TEST_F(DeviceExtendedVulkanTest, HasFeatureTexture3D) { EXPECT_TRUE(iglDev_->hasFeature(DeviceFeatures::Texture3D)); } TEST_F(DeviceExtendedVulkanTest, GetFeatureLimitsMaxTextureDimension) { size_t maxDim = 0; bool result = iglDev_->getFeatureLimits(DeviceFeatureLimits::MaxTextureDimension1D2D, maxDim); EXPECT_TRUE(result); EXPECT_GT(maxDim, 0u); } } // namespace igl::tests #endif // IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX ================================================ FILE: src/igl/tests/vulkan/FramebufferVulkanTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/TestDevice.h" #include #include #include #include #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX namespace igl::tests { class FramebufferVulkanTest : public ::testing::Test { public: FramebufferVulkanTest() = default; ~FramebufferVulkanTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); iglDev_ = util::createTestDevice(); ASSERT_NE(iglDev_, nullptr); ASSERT_EQ(iglDev_->getBackendType(), BackendType::Vulkan) << "Test requires Vulkan backend"; } void TearDown() override {} protected: std::shared_ptr iglDev_; }; TEST_F(FramebufferVulkanTest, CreateWithColorAttachment) { Result ret; TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 8, 8, TextureDesc::TextureUsageBits::Attachment | TextureDesc::TextureUsageBits::Sampled); auto colorTex = iglDev_->createTexture(texDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); FramebufferDesc fbDesc; fbDesc.colorAttachments[0].texture = colorTex; auto fb = iglDev_->createFramebuffer(fbDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(fb, nullptr); auto indices = fb->getColorAttachmentIndices(); EXPECT_FALSE(indices.empty()); EXPECT_NE(fb->getColorAttachment(0), nullptr); } TEST_F(FramebufferVulkanTest, CreateWithColorAndDepth) { Result ret; TextureDesc colorDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 8, 8, TextureDesc::TextureUsageBits::Attachment | TextureDesc::TextureUsageBits::Sampled); auto colorTex = iglDev_->createTexture(colorDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); TextureDesc depthDesc = TextureDesc::new2D(TextureFormat::Z_UNorm24, 8, 8, TextureDesc::TextureUsageBits::Attachment | TextureDesc::TextureUsageBits::Sampled); auto depthTex = iglDev_->createTexture(depthDesc, &ret); if (!ret.isOk()) { depthDesc.format = TextureFormat::Z_UNorm16; depthTex = iglDev_->createTexture(depthDesc, &ret); } ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); FramebufferDesc fbDesc; fbDesc.colorAttachments[0].texture = colorTex; fbDesc.depthAttachment.texture = depthTex; auto fb = iglDev_->createFramebuffer(fbDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(fb, nullptr); EXPECT_NE(fb->getDepthAttachment(), nullptr); } TEST_F(FramebufferVulkanTest, CopyBytesColorAttachment) { Result ret; TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 2, 2, TextureDesc::TextureUsageBits::Attachment | TextureDesc::TextureUsageBits::Sampled); auto colorTex = iglDev_->createTexture(texDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); constexpr uint32_t kColor = 0xFF00FF00; const std::array pixels = {kColor, kColor, kColor, kColor}; ret = colorTex->upload(colorTex->getFullRange(0), pixels.data()); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); FramebufferDesc fbDesc; fbDesc.colorAttachments[0].texture = colorTex; auto fb = iglDev_->createFramebuffer(fbDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); auto cmdQueue = iglDev_->createCommandQueue(CommandQueueDesc{}, &ret); ASSERT_TRUE(ret.isOk()); auto cmdBuf = cmdQueue->createCommandBuffer(CommandBufferDesc(), &ret); ASSERT_TRUE(ret.isOk()); cmdQueue->submit(*cmdBuf); std::array result = {}; fb->copyBytesColorAttachment(*cmdQueue, 0, result.data(), colorTex->getFullRange(0)); for (size_t i = 0; i < 4; ++i) { EXPECT_EQ(result[i], kColor); } } TEST_F(FramebufferVulkanTest, UpdateDrawable) { Result ret; TextureDesc texDesc1 = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 4, 4, TextureDesc::TextureUsageBits::Attachment | TextureDesc::TextureUsageBits::Sampled); auto colorTex1 = iglDev_->createTexture(texDesc1, &ret); ASSERT_TRUE(ret.isOk()); FramebufferDesc fbDesc; fbDesc.colorAttachments[0].texture = colorTex1; auto fb = iglDev_->createFramebuffer(fbDesc, &ret); ASSERT_TRUE(ret.isOk()); ASSERT_NE(fb, nullptr); TextureDesc texDesc2 = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 8, 8, TextureDesc::TextureUsageBits::Attachment | TextureDesc::TextureUsageBits::Sampled); auto colorTex2 = iglDev_->createTexture(texDesc2, &ret); ASSERT_TRUE(ret.isOk()); fb->updateDrawable(colorTex2); EXPECT_EQ(fb->getColorAttachment(0), colorTex2); } TEST_F(FramebufferVulkanTest, MultipleColorAttachments) { Result ret; TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 4, 4, TextureDesc::TextureUsageBits::Attachment | TextureDesc::TextureUsageBits::Sampled); auto colorTex0 = iglDev_->createTexture(texDesc, &ret); ASSERT_TRUE(ret.isOk()); auto colorTex1 = iglDev_->createTexture(texDesc, &ret); ASSERT_TRUE(ret.isOk()); FramebufferDesc fbDesc; fbDesc.colorAttachments[0].texture = colorTex0; fbDesc.colorAttachments[1].texture = colorTex1; auto fb = iglDev_->createFramebuffer(fbDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(fb, nullptr); auto indices = fb->getColorAttachmentIndices(); EXPECT_EQ(indices.size(), 2u); EXPECT_NE(fb->getColorAttachment(0), nullptr); EXPECT_NE(fb->getColorAttachment(1), nullptr); } } // namespace igl::tests #endif // IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX ================================================ FILE: src/igl/tests/vulkan/ImageLayoutTransitionTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/TestDevice.h" #include #include #include #include #include #include #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX namespace igl::tests { class ImageLayoutTransitionTest : public ::testing::Test { public: ImageLayoutTransitionTest() = default; ~ImageLayoutTransitionTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); iglDev_ = util::createTestDevice(); ASSERT_NE(iglDev_, nullptr); ASSERT_EQ(iglDev_->getBackendType(), BackendType::Vulkan) << "Test requires Vulkan backend"; Result ret; cmdQueue_ = iglDev_->createCommandQueue(CommandQueueDesc{}, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(cmdQueue_, nullptr); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; void waitForGpu() { Result ret; auto cmdBuf = cmdQueue_->createCommandBuffer(CommandBufferDesc(), &ret); if (cmdBuf) { cmdQueue_->submit(*cmdBuf); cmdBuf->waitUntilCompleted(); } } }; TEST_F(ImageLayoutTransitionTest, TransitionToColorAttachment) { Result ret; TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 4, 4, TextureDesc::TextureUsageBits::Attachment | TextureDesc::TextureUsageBits::Sampled); auto texture = iglDev_->createTexture(texDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(texture, nullptr); FramebufferDesc fbDesc; fbDesc.colorAttachments[0].texture = texture; auto fb = iglDev_->createFramebuffer(fbDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(fb, nullptr); auto cmdBuf = cmdQueue_->createCommandBuffer(CommandBufferDesc(), &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(cmdBuf, nullptr); RenderPassDesc rpDesc; rpDesc.colorAttachments.resize(1); rpDesc.colorAttachments[0].loadAction = LoadAction::Clear; rpDesc.colorAttachments[0].storeAction = StoreAction::Store; rpDesc.colorAttachments[0].clearColor = {0, 0, 0, 1}; auto encoder = cmdBuf->createRenderCommandEncoder(rpDesc, fb, {}, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(encoder, nullptr); encoder->endEncoding(); cmdQueue_->submit(*cmdBuf); cmdBuf->waitUntilCompleted(); } TEST_F(ImageLayoutTransitionTest, TransitionToDepthStencilAttachment) { Result ret; TextureDesc colorDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 4, 4, TextureDesc::TextureUsageBits::Attachment | TextureDesc::TextureUsageBits::Sampled); auto colorTex = iglDev_->createTexture(colorDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(colorTex, nullptr); TextureDesc depthDesc = TextureDesc::new2D(TextureFormat::Z_UNorm24, 4, 4, TextureDesc::TextureUsageBits::Attachment | TextureDesc::TextureUsageBits::Sampled); auto depthTex = iglDev_->createTexture(depthDesc, &ret); if (!ret.isOk()) { depthDesc.format = TextureFormat::Z_UNorm16; depthTex = iglDev_->createTexture(depthDesc, &ret); } ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(depthTex, nullptr); FramebufferDesc fbDesc; fbDesc.colorAttachments[0].texture = colorTex; fbDesc.depthAttachment.texture = depthTex; auto fb = iglDev_->createFramebuffer(fbDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(fb, nullptr); auto cmdBuf = cmdQueue_->createCommandBuffer(CommandBufferDesc(), &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(cmdBuf, nullptr); RenderPassDesc rpDesc; rpDesc.colorAttachments.resize(1); rpDesc.colorAttachments[0].loadAction = LoadAction::Clear; rpDesc.colorAttachments[0].storeAction = StoreAction::Store; rpDesc.depthAttachment.loadAction = LoadAction::Clear; rpDesc.depthAttachment.storeAction = StoreAction::Store; rpDesc.depthAttachment.clearDepth = 1.0f; auto encoder = cmdBuf->createRenderCommandEncoder(rpDesc, fb, {}, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(encoder, nullptr); encoder->endEncoding(); cmdQueue_->submit(*cmdBuf); cmdBuf->waitUntilCompleted(); } TEST_F(ImageLayoutTransitionTest, TransitionToShaderReadOnly) { Result ret; TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 4, 4, TextureDesc::TextureUsageBits::Sampled); auto texture = iglDev_->createTexture(texDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(texture, nullptr); const std::vector pixels(16, 0xFF0000FF); ret = texture->upload(texture->getFullRange(0), pixels.data()); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); waitForGpu(); } TEST_F(ImageLayoutTransitionTest, TransitionToGeneral) { Result ret; TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 4, 4, TextureDesc::TextureUsageBits::Storage | TextureDesc::TextureUsageBits::Sampled); auto texture = iglDev_->createTexture(texDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(texture, nullptr); waitForGpu(); } } // namespace igl::tests #endif // IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX ================================================ FILE: src/igl/tests/vulkan/PipelineStateTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/TestDevice.h" #include #include #include #include #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX namespace igl::tests { class PipelineStateTest : public ::testing::Test { public: PipelineStateTest() = default; ~PipelineStateTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); iglDev_ = util::createTestDevice(); ASSERT_NE(iglDev_, nullptr); ASSERT_EQ(iglDev_->getBackendType(), BackendType::Vulkan) << "Test requires Vulkan backend"; } void TearDown() override {} protected: std::shared_ptr iglDev_; igl::vulkan::VulkanContext& getVulkanContext() { auto& device = static_cast(*iglDev_); return device.getVulkanContext(); } }; TEST_F(PipelineStateTest, PipelineLayoutCreation) { auto& ctx = getVulkanContext(); EXPECT_TRUE(ctx.getVkDevice() != VK_NULL_HANDLE); EXPECT_TRUE(ctx.pipelineCache_ != VK_NULL_HANDLE); } TEST_F(PipelineStateTest, CreateSamplerState) { Result ret; SamplerStateDesc desc; desc.minFilter = SamplerMinMagFilter::Linear; desc.magFilter = SamplerMinMagFilter::Linear; desc.mipFilter = SamplerMipFilter::Linear; desc.addressModeU = SamplerAddressMode::Repeat; desc.addressModeV = SamplerAddressMode::Repeat; auto sampler = iglDev_->createSamplerState(desc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(sampler, nullptr); } TEST_F(PipelineStateTest, CreateVertexInputState) { Result ret; VertexInputStateDesc desc; desc.numAttributes = 1; desc.attributes[0].format = VertexAttributeFormat::Float4; desc.attributes[0].offset = 0; desc.attributes[0].bufferIndex = 0; desc.attributes[0].name = "position"; desc.attributes[0].location = 0; desc.numInputBindings = 1; desc.inputBindings[0].stride = 16; desc.inputBindings[0].sampleFunction = VertexSampleFunction::PerVertex; auto vis = iglDev_->createVertexInputState(desc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(vis, nullptr); } TEST_F(PipelineStateTest, PipelineCacheExists) { auto& ctx = getVulkanContext(); EXPECT_TRUE(ctx.pipelineCache_ != VK_NULL_HANDLE); } } // namespace igl::tests #endif // IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX ================================================ FILE: src/igl/tests/vulkan/RenderCommandEncoderVulkanTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/TestDevice.h" #include #include #include #include #include #include #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX namespace igl::tests { class RenderCommandEncoderVulkanTest : public ::testing::Test { public: RenderCommandEncoderVulkanTest() = default; ~RenderCommandEncoderVulkanTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); iglDev_ = util::createTestDevice(); ASSERT_NE(iglDev_, nullptr); ASSERT_EQ(iglDev_->getBackendType(), BackendType::Vulkan) << "Test requires Vulkan backend"; Result ret; cmdQueue_ = iglDev_->createCommandQueue(CommandQueueDesc{}, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(cmdQueue_, nullptr); TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 4, 4, TextureDesc::TextureUsageBits::Attachment | TextureDesc::TextureUsageBits::Sampled); colorTex_ = iglDev_->createTexture(texDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(colorTex_, nullptr); FramebufferDesc fbDesc; fbDesc.colorAttachments[0].texture = colorTex_; fb_ = iglDev_->createFramebuffer(fbDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(fb_, nullptr); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; std::shared_ptr colorTex_; std::shared_ptr fb_; std::unique_ptr createEncoder(std::shared_ptr& cmdBuf) { Result ret; cmdBuf = cmdQueue_->createCommandBuffer(CommandBufferDesc(), &ret); if (!ret.isOk() || !cmdBuf) { return nullptr; } RenderPassDesc rpDesc; rpDesc.colorAttachments.resize(1); rpDesc.colorAttachments[0].loadAction = LoadAction::Clear; rpDesc.colorAttachments[0].storeAction = StoreAction::Store; auto encoder = cmdBuf->createRenderCommandEncoder(rpDesc, fb_, {}, &ret); if (!ret.isOk()) { return nullptr; } return encoder; } }; TEST_F(RenderCommandEncoderVulkanTest, BindViewport) { std::shared_ptr cmdBuf; auto encoder = createEncoder(cmdBuf); ASSERT_NE(encoder, nullptr); Viewport vp = { .x = 0.0f, .y = 0.0f, .width = 4.0f, .height = 4.0f, .minDepth = 0.0f, .maxDepth = 1.0f}; encoder->bindViewport(vp); encoder->endEncoding(); cmdQueue_->submit(*cmdBuf); } TEST_F(RenderCommandEncoderVulkanTest, BindScissorRect) { std::shared_ptr cmdBuf; auto encoder = createEncoder(cmdBuf); ASSERT_NE(encoder, nullptr); ScissorRect rect = {.x = 0, .y = 0, .width = 4, .height = 4}; encoder->bindScissorRect(rect); encoder->endEncoding(); cmdQueue_->submit(*cmdBuf); } TEST_F(RenderCommandEncoderVulkanTest, SetStencilReferenceValue) { std::shared_ptr cmdBuf; auto encoder = createEncoder(cmdBuf); ASSERT_NE(encoder, nullptr); encoder->setStencilReferenceValue(128); encoder->endEncoding(); cmdQueue_->submit(*cmdBuf); } TEST_F(RenderCommandEncoderVulkanTest, SetBlendColor) { std::shared_ptr cmdBuf; auto encoder = createEncoder(cmdBuf); ASSERT_NE(encoder, nullptr); encoder->setBlendColor(Color(1.0f, 0.5f, 0.25f, 1.0f)); encoder->endEncoding(); cmdQueue_->submit(*cmdBuf); } TEST_F(RenderCommandEncoderVulkanTest, SetDepthBias) { std::shared_ptr cmdBuf; auto encoder = createEncoder(cmdBuf); ASSERT_NE(encoder, nullptr); encoder->setDepthBias(1.0f, 1.0f, 0.0f); encoder->endEncoding(); cmdQueue_->submit(*cmdBuf); } } // namespace igl::tests #endif // IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX ================================================ FILE: src/igl/tests/vulkan/RenderPipelineStateTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #include #ifdef __ANDROID__ #endif #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_LINUX namespace igl::tests { // // RenderPipelineStateTest // // Unit tests for RenderPipelineState.cpp // class RenderPipelineStateTest : public ::testing::TestWithParam> { void SetUp() override { // Turn off debug break so unit tests can run igl::setDebugBreakEnabled(false); device_ = igl::tests::util::device::createTestDevice(igl::BackendType::Vulkan); ASSERT_TRUE(device_ != nullptr); auto& device = static_cast(*device_); context_ = &device.getVulkanContext(); ASSERT_TRUE(context_ != nullptr); } protected: std::shared_ptr device_; vulkan::VulkanContext* context_ = nullptr; }; // polygonFillModeToVkPolygonMode ********************************************* TEST_P(RenderPipelineStateTest, PolygonFillModeToVkPolygonModeTest) { const auto polygonFillMode = std::get<0>(GetParam()); const auto cullMode = std::get<1>(GetParam()); const auto windingMode = std::get<2>(GetParam()); const auto vertexFormat = std::get<3>(GetParam()); const auto blendOp = std::get<4>(GetParam()); const auto blendFactor = std::get<5>(GetParam()); Result result; VertexInputStateDesc inputDesc; inputDesc.numAttributes = 1; inputDesc.attributes[0].format = vertexFormat; const auto inputState = device_->createVertexInputState(inputDesc, &result); EXPECT_TRUE(result.isOk()); // precision highp float; constexpr const char* codeVS = R"( void main() { gl_Position = vec4(0., 0., 0., 1.0); } )"; constexpr const char* codeFS = R"( layout(location = 0) out vec4 out_FragColor; void main() { out_FragColor = vec4(0., 0., 0., 1.0); } )"; RenderPipelineDesc pipelineDesc; pipelineDesc.polygonFillMode = polygonFillMode; pipelineDesc.cullMode = cullMode; pipelineDesc.frontFaceWinding = windingMode; pipelineDesc.vertexInputState = inputState; pipelineDesc.targetDesc.colorAttachments.resize(1); pipelineDesc.targetDesc.colorAttachments[0].blendEnabled = true; pipelineDesc.targetDesc.colorAttachments[0].textureFormat = TextureFormat::RGBA_UNorm8; pipelineDesc.targetDesc.colorAttachments[0].rgbBlendOp = blendOp; pipelineDesc.targetDesc.colorAttachments[0].srcRGBBlendFactor = blendFactor; pipelineDesc.shaderStages = ShaderStagesCreator::fromModuleStringInput( *device_, codeVS, "main", "", codeFS, "main", "", nullptr); const auto renderPipeline = device_->createRenderPipeline(pipelineDesc, &result); } INSTANTIATE_TEST_SUITE_P( AllFormats, RenderPipelineStateTest, ::testing::Combine(::testing::Values(igl::PolygonFillMode::Line), ::testing::Values(igl::CullMode::Front, igl::CullMode::Back), ::testing::Values(igl::WindingMode::Clockwise), ::testing::Values(VertexAttributeFormat::Float1, VertexAttributeFormat::Float2, VertexAttributeFormat::Float3, VertexAttributeFormat::Float4, VertexAttributeFormat::Byte1, VertexAttributeFormat::Byte2, VertexAttributeFormat::Byte3, VertexAttributeFormat::Byte4, VertexAttributeFormat::UByte1, VertexAttributeFormat::UByte2, VertexAttributeFormat::UByte3, VertexAttributeFormat::UByte4, VertexAttributeFormat::Short1, VertexAttributeFormat::Short2, VertexAttributeFormat::Short3, VertexAttributeFormat::Short4, VertexAttributeFormat::UShort1, VertexAttributeFormat::UShort2, VertexAttributeFormat::UShort3, VertexAttributeFormat::UShort4, VertexAttributeFormat::Byte1Norm, VertexAttributeFormat::Byte2Norm, VertexAttributeFormat::Byte3Norm, VertexAttributeFormat::Byte4Norm, VertexAttributeFormat::UByte1Norm, VertexAttributeFormat::UByte2Norm, VertexAttributeFormat::UByte3Norm, VertexAttributeFormat::UByte4Norm, VertexAttributeFormat::Short1Norm, VertexAttributeFormat::Short2Norm, VertexAttributeFormat::Short3Norm, VertexAttributeFormat::Short4Norm, VertexAttributeFormat::UShort1Norm, VertexAttributeFormat::UShort2Norm, VertexAttributeFormat::UShort3Norm, VertexAttributeFormat::UShort4Norm, VertexAttributeFormat::Int1, VertexAttributeFormat::Int2, VertexAttributeFormat::Int3, VertexAttributeFormat::Int4, VertexAttributeFormat::UInt1, VertexAttributeFormat::UInt2, VertexAttributeFormat::UInt3, VertexAttributeFormat::UInt4, // Half-float VertexAttributeFormat::HalfFloat1, VertexAttributeFormat::HalfFloat2, VertexAttributeFormat::HalfFloat3, VertexAttributeFormat::HalfFloat4, VertexAttributeFormat::Int_2_10_10_10_REV), ::testing::Values(BlendOp::Add), ::testing::Values(BlendFactor::Zero))); INSTANTIATE_TEST_SUITE_P(AllBlendOps, RenderPipelineStateTest, ::testing::Combine(::testing::Values(igl::PolygonFillMode::Line), ::testing::Values(igl::CullMode::Front, igl::CullMode::Back), ::testing::Values(igl::WindingMode::Clockwise), ::testing::Values(VertexAttributeFormat::Float1), ::testing::Values(BlendOp::Add, BlendOp::Subtract, BlendOp::ReverseSubtract, BlendOp::Min, BlendOp::Max), ::testing::Values(BlendFactor::Zero))); INSTANTIATE_TEST_SUITE_P(AllBlendFactors, RenderPipelineStateTest, ::testing::Combine(::testing::Values(igl::PolygonFillMode::Line), ::testing::Values(igl::CullMode::Front, igl::CullMode::Back), ::testing::Values(igl::WindingMode::Clockwise), ::testing::Values(VertexAttributeFormat::Float1), ::testing::Values(BlendOp::Add), ::testing::Values(BlendFactor::Zero, BlendFactor::One, BlendFactor::SrcColor, BlendFactor::OneMinusSrcColor, BlendFactor::DstColor, BlendFactor::OneMinusDstColor, BlendFactor::SrcAlpha, BlendFactor::OneMinusSrcAlpha, BlendFactor::DstAlpha, BlendFactor::OneMinusDstAlpha, BlendFactor::BlendColor, BlendFactor::OneMinusBlendColor, BlendFactor::BlendAlpha, BlendFactor::OneMinusBlendAlpha, BlendFactor::SrcAlphaSaturated, BlendFactor::Src1Color, BlendFactor::OneMinusSrc1Color, BlendFactor::Src1Alpha, BlendFactor::OneMinusSrc1Alpha))); } // namespace igl::tests #endif ================================================ FILE: src/igl/tests/vulkan/ResourcesBinderTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/TestDevice.h" #include #include #include #include #include #include #include #include #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX namespace igl::tests { class ResourcesBinderTest : public ::testing::Test { public: ResourcesBinderTest() = default; ~ResourcesBinderTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); iglDev_ = util::createTestDevice(); ASSERT_NE(iglDev_, nullptr); ASSERT_EQ(iglDev_->getBackendType(), BackendType::Vulkan) << "Test requires Vulkan backend"; Result ret; cmdQueue_ = iglDev_->createCommandQueue(CommandQueueDesc{}, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(cmdQueue_, nullptr); } void TearDown() override {} protected: std::shared_ptr iglDev_; std::shared_ptr cmdQueue_; void waitForGpu() { Result ret; auto cmdBuf = cmdQueue_->createCommandBuffer(CommandBufferDesc(), &ret); if (cmdBuf) { cmdQueue_->submit(*cmdBuf); cmdBuf->waitUntilCompleted(); } } }; TEST_F(ResourcesBinderTest, BindBufferAndDraw) { Result ret; BufferDesc bufDesc; bufDesc.type = BufferDesc::BufferTypeBits::Uniform; bufDesc.storage = ResourceStorage::Shared; bufDesc.length = 256; auto buffer = iglDev_->createBuffer(bufDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(buffer, nullptr); std::vector data(64, 1.0f); ret = buffer->upload(data.data(), BufferRange(256, 0)); ASSERT_TRUE(ret.isOk()); TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 4, 4, TextureDesc::TextureUsageBits::Attachment | TextureDesc::TextureUsageBits::Sampled); auto colorTex = iglDev_->createTexture(texDesc, &ret); ASSERT_TRUE(ret.isOk()); FramebufferDesc fbDesc; fbDesc.colorAttachments[0].texture = colorTex; auto fb = iglDev_->createFramebuffer(fbDesc, &ret); ASSERT_TRUE(ret.isOk()); auto cmdQueue = iglDev_->createCommandQueue(CommandQueueDesc{}, &ret); ASSERT_TRUE(ret.isOk()); auto cmdBuf = cmdQueue->createCommandBuffer(CommandBufferDesc(), &ret); ASSERT_TRUE(ret.isOk()); RenderPassDesc rpDesc; rpDesc.colorAttachments.resize(1); rpDesc.colorAttachments[0].loadAction = LoadAction::Clear; rpDesc.colorAttachments[0].storeAction = StoreAction::Store; auto encoder = cmdBuf->createRenderCommandEncoder(rpDesc, fb, {}, &ret); ASSERT_TRUE(ret.isOk()); ASSERT_NE(encoder, nullptr); encoder->bindBuffer(0, buffer.get(), 0, 256); encoder->endEncoding(); cmdQueue->submit(*cmdBuf); cmdBuf->waitUntilCompleted(); } TEST_F(ResourcesBinderTest, BindTextureAndSamplerAndDraw) { Result ret; TextureDesc sampledTexDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 4, 4, TextureDesc::TextureUsageBits::Sampled); auto sampledTex = iglDev_->createTexture(sampledTexDesc, &ret); ASSERT_TRUE(ret.isOk()); const std::vector pixels(16, 0xFF0000FF); ret = sampledTex->upload(sampledTex->getFullRange(0), pixels.data()); ASSERT_TRUE(ret.isOk()); SamplerStateDesc samplerDesc; samplerDesc.minFilter = SamplerMinMagFilter::Linear; samplerDesc.magFilter = SamplerMinMagFilter::Linear; auto sampler = iglDev_->createSamplerState(samplerDesc, &ret); ASSERT_TRUE(ret.isOk()); ASSERT_NE(sampler, nullptr); TextureDesc colorTexDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 4, 4, TextureDesc::TextureUsageBits::Attachment | TextureDesc::TextureUsageBits::Sampled); auto colorTex = iglDev_->createTexture(colorTexDesc, &ret); ASSERT_TRUE(ret.isOk()); FramebufferDesc fbDesc; fbDesc.colorAttachments[0].texture = colorTex; auto fb = iglDev_->createFramebuffer(fbDesc, &ret); ASSERT_TRUE(ret.isOk()); auto cmdQueue = iglDev_->createCommandQueue(CommandQueueDesc{}, &ret); ASSERT_TRUE(ret.isOk()); auto cmdBuf = cmdQueue->createCommandBuffer(CommandBufferDesc(), &ret); ASSERT_TRUE(ret.isOk()); RenderPassDesc rpDesc; rpDesc.colorAttachments.resize(1); rpDesc.colorAttachments[0].loadAction = LoadAction::Clear; rpDesc.colorAttachments[0].storeAction = StoreAction::Store; auto encoder = cmdBuf->createRenderCommandEncoder(rpDesc, fb, {}, &ret); ASSERT_TRUE(ret.isOk()); ASSERT_NE(encoder, nullptr); encoder->bindTexture(0, sampledTex.get()); encoder->bindSamplerState(0, 0, sampler.get()); encoder->endEncoding(); cmdQueue->submit(*cmdBuf); cmdBuf->waitUntilCompleted(); } } // namespace igl::tests #endif // IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX ================================================ FILE: src/igl/tests/vulkan/SpvConstantSpecializationExtendedTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace igl::tests { namespace { uint32_t floatToWord(float val) { uint32_t result = 0; std::memcpy(&result, &val, sizeof(result)); return result; } uint32_t intToWord(int32_t val) { uint32_t result = 0; std::memcpy(&result, &val, sizeof(result)); return result; } // Same SPIR-V binary as in SpvConstantSpecializationTest.cpp with two int spec constants // at indices 50 and 54 (values 10 and 11 respectively) std::vector getTestSpv() { return { 0x07230203, 0x00010300, 0xdeadbeef, 0x00000011, 0x00000000, 0x00020011, 0x00000001, 0x0003000e, 0x00000000, 0x00000000, 0x0006000f, 0x00000004, 0x00000001, 0x6e69616d, 0x00000000, 0x00000002, 0x00050005, 0x00000003, 0x6e6f436b, 0x6e617473, 0x00003074, 0x00050005, 0x00000004, 0x6e6f436b, 0x6e617473, 0x00003174, 0x00050005, 0x00000002, 0x67617266, 0x6f6c6f43, 0x00000072, 0x00040005, 0x00000001, 0x6e69616d, 0x00000000, 0x00040047, 0x00000003, 0x00000001, 0x00000000, 0x00040047, 0x00000004, 0x00000001, 0x00000001, 0x00040015, 0x00000005, 0x00000020, 0x00000001, 0x00040032, 0x00000005, 0x00000003, 0x0000000a, 0x00040032, 0x00000005, 0x00000004, 0x0000000b, 0x00030016, 0x00000006, 0x00000020, 0x00040017, 0x00000007, 0x00000006, 0x00000004, 0x00040020, 0x00000008, 0x00000003, 0x00000007, 0x0004003b, 0x00000008, 0x00000002, 0x00000003, 0x00020013, 0x00000009, 0x00030021, 0x0000000a, 0x00000009, 0x0004002b, 0x00000006, 0x0000000b, 0x00000000, 0x0004002b, 0x00000006, 0x0000000c, 0x3f800000, 0x00050036, 0x00000009, 0x00000001, 0x00000000, 0x0000000a, 0x000200f8, 0x0000000d, 0x0004006f, 0x00000006, 0x0000000e, 0x00000003, 0x0004006f, 0x00000006, 0x0000000f, 0x00000004, 0x00070050, 0x00000007, 0x00000010, 0x0000000e, 0x0000000f, 0x0000000b, 0x0000000c, 0x0003003e, 0x00000002, 0x00000010, 0x000100fd, 0x00010038, }; } } // namespace TEST(SpvConstantSpecializationExtendedTest, FloatConstantSpecialization) { using namespace vulkan::util; auto spv = getTestSpv(); EXPECT_EQ(spv[50], intToWord(10)); EXPECT_EQ(spv[54], intToWord(11)); const std::vector values = {floatToWord(3.14f), floatToWord(2.71f)}; specializeConstants(spv.data(), spv.size() * sizeof(uint32_t), values); EXPECT_EQ(spv[50], floatToWord(3.14f)); EXPECT_EQ(spv[54], floatToWord(2.71f)); } TEST(SpvConstantSpecializationExtendedTest, MultipleConstantsMixedTypes) { using namespace vulkan::util; auto spv = getTestSpv(); EXPECT_EQ(spv[50], intToWord(10)); EXPECT_EQ(spv[54], intToWord(11)); const std::vector values = {intToWord(100), intToWord(200)}; specializeConstants(spv.data(), spv.size() * sizeof(uint32_t), values); EXPECT_EQ(spv[50], intToWord(100)); EXPECT_EQ(spv[54], intToWord(200)); } TEST(SpvConstantSpecializationExtendedTest, NoSpecConstants) { using namespace vulkan::util; auto spv = getTestSpv(); uint32_t originalVal0 = spv[50]; uint32_t originalVal1 = spv[54]; const std::vector values = {vulkan::util::kNoValue, vulkan::util::kNoValue}; specializeConstants(spv.data(), spv.size() * sizeof(uint32_t), values); EXPECT_EQ(spv[50], originalVal0); EXPECT_EQ(spv[54], originalVal1); } } // namespace igl::tests ================================================ FILE: src/igl/tests/vulkan/SpvConstantSpecializationTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace igl::tests { // GLSL: // // layout(constant_id = 0) const int kConstant0 = 10; // layout(constant_id = 1) const int kConstant1 = 11; // // out vec4 fragColor; // // void main() { // fragColor = vec4(float(kConstant0), float(kConstant1), 0.0, 1.0); // } // SPIR-V: // // OpCapability Shader // OpMemoryModel Logical Simple // OpEntryPoint Fragment %main "main" %fragColor // OpName %kConstant0 "kConstant0" // OpName %kConstant1 "kConstant1" // OpName %fragColor "fragColor" // OpName %main "main" // OpDecorate %kConstant0 SpecId 0 // OpDecorate %kConstant1 SpecId 1 // %int = OpTypeInt 32 1 // %kConstant0 = OpSpecConstant %int 10 // %kConstant1 = OpSpecConstant %int 11 // %float = OpTypeFloat 32 // %v4float = OpTypeVector %float 4 // %ptr_Output_v4float = OpTypePointer Output %v4float // %fragColor = OpVariable %ptr_Output_v4float Output // %void = OpTypeVoid // %func = OpTypeFunction %void // %_0_0f = OpConstant %float 0.0 // %_1_0f = OpConstant %float 1.0 // %main = OpFunction %void None %func // %_1 = OpLabel // %_2 = OpConvertSToF %float %kConstant0 // %_3 = OpConvertSToF %float %kConstant1 // %_4 = OpCompositeConstruct %v4float %_2 %_3 %_0_0f %_1_0f // OpStore %fragColor %_4 // OpReturn // OpFunctionEnd namespace { uint32_t getWord(int32_t val) { return *reinterpret_cast(&val); } } // namespace TEST(SpvConstantSpecializationTest, intSpecialization) { using namespace vulkan::util; std::vector spv = { 0x07230203, 0x00010300, 0xdeadbeef, 0x00000011, 0x00000000, 0x00020011, 0x00000001, 0x0003000e, 0x00000000, 0x00000000, 0x0006000f, 0x00000004, 0x00000001, 0x6e69616d, 0x00000000, 0x00000002, 0x00050005, 0x00000003, 0x6e6f436b, 0x6e617473, 0x00003074, 0x00050005, 0x00000004, 0x6e6f436b, 0x6e617473, 0x00003174, 0x00050005, 0x00000002, 0x67617266, 0x6f6c6f43, 0x00000072, 0x00040005, 0x00000001, 0x6e69616d, 0x00000000, 0x00040047, 0x00000003, 0x00000001, 0x00000000, 0x00040047, 0x00000004, 0x00000001, 0x00000001, 0x00040015, 0x00000005, 0x00000020, 0x00000001, 0x00040032, 0x00000005, 0x00000003, 0x0000000a, 0x00040032, 0x00000005, 0x00000004, 0x0000000b, 0x00030016, 0x00000006, 0x00000020, 0x00040017, 0x00000007, 0x00000006, 0x00000004, 0x00040020, 0x00000008, 0x00000003, 0x00000007, 0x0004003b, 0x00000008, 0x00000002, 0x00000003, 0x00020013, 0x00000009, 0x00030021, 0x0000000a, 0x00000009, 0x0004002b, 0x00000006, 0x0000000b, 0x00000000, 0x0004002b, 0x00000006, 0x0000000c, 0x3f800000, 0x00050036, 0x00000009, 0x00000001, 0x00000000, 0x0000000a, 0x000200f8, 0x0000000d, 0x0004006f, 0x00000006, 0x0000000e, 0x00000003, 0x0004006f, 0x00000006, 0x0000000f, 0x00000004, 0x00070050, 0x00000007, 0x00000010, 0x0000000e, 0x0000000f, 0x0000000b, 0x0000000c, 0x0003003e, 0x00000002, 0x00000010, 0x000100fd, 0x00010038, }; // Specialize kConstant0 to 0 and kConstant1 to 1 const std::vector values = {getWord(0), getWord(1)}; EXPECT_EQ(spv[50], getWord(10)); // 0x0000000a above EXPECT_EQ(spv[54], getWord(11)); // 0x0000000b specializeConstants(spv.data(), spv.size() * sizeof(uint32_t), values); EXPECT_EQ(spv[50], getWord(0)); EXPECT_EQ(spv[54], getWord(1)); } } // namespace igl::tests ================================================ FILE: src/igl/tests/vulkan/SpvReflectionTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../util/SpvModules.h" namespace igl::tests { TEST(SpvReflectionTest, UniformBufferTest) { using namespace vulkan::util; const auto& spvWords = getUniformBufferSpvWords(); SpvModuleInfo spvModuleInfo = getReflectionData(spvWords.data(), spvWords.size() * sizeof(uint32_t)); ASSERT_EQ(spvModuleInfo.buffers.size(), 2); EXPECT_EQ(spvModuleInfo.buffers[0].bindingLocation, 0); EXPECT_EQ(spvModuleInfo.buffers[1].bindingLocation, 3); EXPECT_EQ(spvModuleInfo.buffers[0].isStorage, false); EXPECT_EQ(spvModuleInfo.buffers[1].isStorage, false); } TEST(SpvReflectionTest, TextureTest) { using namespace vulkan::util; const auto& spvWords = getTextureSpvWords(); SpvModuleInfo spvModuleInfo = getReflectionData(spvWords.data(), spvWords.size() * sizeof(uint32_t)); ASSERT_EQ(spvModuleInfo.buffers.size(), 0); EXPECT_EQ(spvModuleInfo.textures.size(), 4); EXPECT_EQ(spvModuleInfo.textures[0].bindingLocation, kNoBindingLocation); EXPECT_EQ(spvModuleInfo.textures[0].descriptorSet, kNoDescriptorSet); EXPECT_EQ(spvModuleInfo.textures[1].bindingLocation, 1); EXPECT_EQ(spvModuleInfo.textures[1].descriptorSet, 0); EXPECT_EQ(spvModuleInfo.textures[2].bindingLocation, kNoBindingLocation); EXPECT_EQ(spvModuleInfo.textures[2].descriptorSet, kNoBindingLocation); EXPECT_EQ(spvModuleInfo.textures[3].bindingLocation, 3); EXPECT_EQ(spvModuleInfo.textures[3].descriptorSet, 0); EXPECT_EQ(spvModuleInfo.textures[0].type, TextureType::TwoD); EXPECT_EQ(spvModuleInfo.textures[1].type, TextureType::TwoD); EXPECT_EQ(spvModuleInfo.textures[2].type, TextureType::TwoD); EXPECT_EQ(spvModuleInfo.textures[3].type, TextureType::TwoD); } TEST(SpvReflectionTest, TextureDescriptorSetTest) { using namespace vulkan::util; const auto& spvWords = getTextureWithDescriptorSetSpvWords(); SpvModuleInfo spvModuleInfo = getReflectionData(spvWords.data(), spvWords.size() * sizeof(uint32_t)); ASSERT_EQ(spvModuleInfo.buffers.size(), 0); EXPECT_EQ(spvModuleInfo.textures.size(), 2); EXPECT_EQ(spvModuleInfo.textures[0].bindingLocation, 1); EXPECT_EQ(spvModuleInfo.textures[0].descriptorSet, 0); EXPECT_EQ(spvModuleInfo.textures[1].bindingLocation, 2); EXPECT_EQ(spvModuleInfo.textures[1].descriptorSet, 1); EXPECT_EQ(spvModuleInfo.textures[0].type, TextureType::TwoD); EXPECT_EQ(spvModuleInfo.textures[1].type, TextureType::TwoD); } TEST(SpvReflectionTest, TinyMeshFragmentShaderTest) { using namespace vulkan::util; const auto& spvWords = getTinyMeshFragmentShaderSpvWords(); SpvModuleInfo spvModuleInfo = getReflectionData(spvWords.data(), spvWords.size() * sizeof(uint32_t)); ASSERT_EQ(spvModuleInfo.buffers.size(), 1); EXPECT_EQ(spvModuleInfo.textures.size(), 2); EXPECT_EQ(spvModuleInfo.buffers[0].bindingLocation, 0); EXPECT_EQ(spvModuleInfo.buffers[0].descriptorSet, 1); EXPECT_EQ(spvModuleInfo.buffers[0].isStorage, false); EXPECT_EQ(spvModuleInfo.textures[0].bindingLocation, 0); EXPECT_EQ(spvModuleInfo.textures[0].descriptorSet, 0); EXPECT_EQ(spvModuleInfo.textures[1].bindingLocation, 4); EXPECT_EQ(spvModuleInfo.textures[1].descriptorSet, 0); } } // namespace igl::tests ================================================ FILE: src/igl/tests/vulkan/Texture.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include namespace igl::tests { class TextureVulkanTest : public ::testing::Test { public: TextureVulkanTest() = default; ~TextureVulkanTest() override = default; // Set up common resources. This will create a device void SetUp() override { // Turn off debug break so unit tests can run igl::setDebugBreakEnabled(false); iglDev_ = util::createTestDevice(); ASSERT_NE(iglDev_, nullptr); } void TearDown() override {} // Member variables protected: std::shared_ptr iglDev_; }; TEST_F(TextureVulkanTest, MipmapGenerationFlagInitialization) { // Create a texture with default TextureDesc const TextureDesc texDesc = igl::TextureDesc::new2D( igl::TextureFormat::RGBA_UNorm8, 2, 2, igl::TextureDesc::TextureUsageBits::Sampled); Result result; auto texture = iglDev_->createTexture(texDesc, &result); ASSERT_EQ(result.code, igl::Result::Code::Ok); ASSERT_NE(texture, nullptr); // Cast to Vulkan texture to access the getMipmapGeneration method auto* vulkanTexture = static_cast(texture.get()); ASSERT_NE(vulkanTexture, nullptr); // Test that the mipmapGeneration flag is initialized to Manual by default ASSERT_EQ(vulkanTexture->getMipmapGeneration(), TextureDesc::TextureMipmapGeneration::Manual); } TEST_F(TextureVulkanTest, AutoGenerateMipmapOnUpload) { Result ret; // Create a texture with AutoGenerateOnUpload flag - similar to existing mipmap tests constexpr uint32_t kNumMipLevels = 2u; constexpr uint32_t kTexWidth = 2u; constexpr uint32_t kTexHeight = 2u; constexpr uint32_t kColor = 0xdeadbeef; constexpr std::array kBaseMipData = {kColor, kColor, kColor, kColor}; constexpr std::array kExpectedMip1Data = {kColor}; // Should be same color after // generation // Create texture with AutoGenerateOnUpload flag TextureDesc textureDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, kTexWidth, kTexHeight, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); textureDesc.numMipLevels = kNumMipLevels; textureDesc.mipmapGeneration = TextureDesc::TextureMipmapGeneration::AutoGenerateOnUpload; auto texture = iglDev_->createTexture(textureDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(texture, nullptr); // Cast to Vulkan texture to access Vulkan-specific methods auto* vulkanTexture = static_cast(texture.get()); ASSERT_NE(vulkanTexture, nullptr); // Verify the texture was created with the correct mipmap generation flag ASSERT_EQ(vulkanTexture->getMipmapGeneration(), TextureDesc::TextureMipmapGeneration::AutoGenerateOnUpload); // Verify the texture has the expected number of mip levels ASSERT_EQ(vulkanTexture->getNumMipLevels(), kNumMipLevels); // Get command queue for validation CommandQueueDesc cmdQueueDesc{}; auto cmdQueue = iglDev_->createCommandQueue(cmdQueueDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(cmdQueue, nullptr); // Upload data to mip level 0 - this should trigger automatic mipmap generation ret = texture->upload(texture->getFullRange(0), kBaseMipData.data()); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); // Validate that mip level 0 contains the uploaded data util::validateUploadedTextureRange(*iglDev_, *cmdQueue, texture, texture->getFullRange(0), kBaseMipData.data(), "AutoGen: Base level (0)"); // Validate that mip level 1 was auto-generated with expected content // The auto-generated mip should contain the same solid color (averaged from base level) util::validateUploadedTextureRange(*iglDev_, *cmdQueue, texture, texture->getFullRange(1), kExpectedMip1Data.data(), "AutoGen: Generated level (1)"); } TEST_F(TextureVulkanTest, ManualMipmapGeneration) { Result ret; constexpr uint32_t kColor = 0xdeadbeef; constexpr std::array kBaseMipData = {kColor, kColor, kColor, kColor}; constexpr std::array kExpectedMip1Data = {kColor}; // Should be same color after // generation // Create a texture with Manual mipmap generation for comparison constexpr uint32_t textureSize = 2; const uint32_t expectedMipLevels = TextureDesc::calcNumMipLevels(textureSize, textureSize); TextureDesc textureDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, textureSize, textureSize, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); textureDesc.numMipLevels = expectedMipLevels; textureDesc.mipmapGeneration = TextureDesc::TextureMipmapGeneration::Manual; auto texture = iglDev_->createTexture(textureDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(texture, nullptr); auto* vulkanTexture = static_cast(texture.get()); ASSERT_NE(vulkanTexture, nullptr); // Verify the texture was created with Manual mipmap generation ASSERT_EQ(vulkanTexture->getMipmapGeneration(), TextureDesc::TextureMipmapGeneration::Manual); const TextureRangeDesc range = TextureRangeDesc::new2D(0, 0, textureSize, textureSize); ret = texture->upload(range, kBaseMipData.data()); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); // With Manual mode, we should be able to call generateMipmap explicitly CommandQueueDesc cmdQueueDesc{}; auto cmdQueue = iglDev_->createCommandQueue(cmdQueueDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); // Validate that mip level 0 contains the uploaded data util::validateUploadedTextureRange(*iglDev_, *cmdQueue, texture, texture->getFullRange(0), kBaseMipData.data(), "AutoGen: Base level (0)"); // This should work with Manual mode const auto fullRange = texture->getFullRange(0, 2); vulkanTexture->generateMipmap(*cmdQueue, &fullRange); // Validate that mip level 1 was auto-generated with expected content // The auto-generated mip should contain the same solid color (averaged from base level) util::validateUploadedTextureRange(*iglDev_, *cmdQueue, texture, texture->getFullRange(1), kExpectedMip1Data.data(), "AutoGen: Generated level (1)"); } } // namespace igl::tests ================================================ FILE: src/igl/tests/vulkan/TextureFormat.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace igl::vulkan::tests { TEST(TextureFormatUtilTest, invertRedAndBlue) { ASSERT_EQ(VK_FORMAT_B8G8R8A8_UNORM, invertRedAndBlue(VK_FORMAT_R8G8B8A8_UNORM)); ASSERT_EQ(VK_FORMAT_R8G8B8A8_UNORM, invertRedAndBlue(VK_FORMAT_B8G8R8A8_UNORM)); ASSERT_EQ(VK_FORMAT_R8G8B8A8_SRGB, invertRedAndBlue(VK_FORMAT_B8G8R8A8_SRGB)); ASSERT_EQ(VK_FORMAT_B8G8R8A8_SRGB, invertRedAndBlue(VK_FORMAT_R8G8B8A8_SRGB)); ASSERT_EQ(VK_FORMAT_A2R10G10B10_UNORM_PACK32, invertRedAndBlue(VK_FORMAT_A2B10G10R10_UNORM_PACK32)); ASSERT_EQ(VK_FORMAT_A2B10G10R10_UNORM_PACK32, invertRedAndBlue(VK_FORMAT_A2R10G10B10_UNORM_PACK32)); } TEST(TextureFormatUtilTest, isTextureFormatRGB) { ASSERT_TRUE(isTextureFormatRGB(VK_FORMAT_R8G8B8A8_UNORM)); ASSERT_TRUE(isTextureFormatRGB(VK_FORMAT_R8G8B8A8_SRGB)); ASSERT_TRUE(isTextureFormatRGB(VK_FORMAT_A2R10G10B10_UNORM_PACK32)); ASSERT_FALSE(isTextureFormatRGB(VK_FORMAT_B8G8R8A8_UNORM)); ASSERT_FALSE(isTextureFormatRGB(VK_FORMAT_B8G8R8A8_SRGB)); ASSERT_FALSE(isTextureFormatRGB(VK_FORMAT_A2B10G10R10_UNORM_PACK32)); } TEST(TextureFormatUtilTest, isTextureFormatBGR) { ASSERT_FALSE(isTextureFormatBGR(VK_FORMAT_R8G8B8A8_UNORM)); ASSERT_FALSE(isTextureFormatBGR(VK_FORMAT_R8G8B8A8_SRGB)); ASSERT_FALSE(isTextureFormatBGR(VK_FORMAT_A2R10G10B10_UNORM_PACK32)); ASSERT_TRUE(isTextureFormatBGR(VK_FORMAT_B8G8R8A8_UNORM)); ASSERT_TRUE(isTextureFormatBGR(VK_FORMAT_B8G8R8A8_SRGB)); ASSERT_TRUE(isTextureFormatBGR(VK_FORMAT_A2B10G10R10_UNORM_PACK32)); } TEST(TextureFormatUtilTest, textureFormatToVkFormat) { ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::Invalid), VK_FORMAT_UNDEFINED); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::A_UNorm8), VK_FORMAT_UNDEFINED); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::L_UNorm8), VK_FORMAT_UNDEFINED); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::R_UNorm8), VK_FORMAT_R8_UNORM); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::R_UNorm16), VK_FORMAT_R16_UNORM); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::R_F16), VK_FORMAT_R16_SFLOAT); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::R_UInt16), VK_FORMAT_R16_UINT); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::B5G5R5A1_UNorm), VK_FORMAT_B5G5R5A1_UNORM_PACK16); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::B5G6R5_UNorm), VK_FORMAT_B5G6R5_UNORM_PACK16); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::ABGR_UNorm4), VK_FORMAT_B4G4R4A4_UNORM_PACK16); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::LA_UNorm8), VK_FORMAT_UNDEFINED); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RG_UNorm8), VK_FORMAT_R8G8_UNORM); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RG_UNorm16), VK_FORMAT_R16G16_UNORM); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::R4G2B2_UNorm_Apple), VK_FORMAT_UNDEFINED); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::R4G2B2_UNorm_Rev_Apple), VK_FORMAT_UNDEFINED); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::R5G5B5A1_UNorm), VK_FORMAT_R5G5B5A1_UNORM_PACK16); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::BGRA_UNorm8), VK_FORMAT_B8G8R8A8_UNORM); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::BGRA_UNorm8_Rev), VK_FORMAT_UNDEFINED); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGBA_UNorm8), VK_FORMAT_R8G8B8A8_UNORM); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGBX_UNorm8), VK_FORMAT_R8G8B8A8_UNORM); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGBA_SRGB), VK_FORMAT_R8G8B8A8_SRGB); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::BGRA_SRGB), VK_FORMAT_B8G8R8A8_SRGB); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RG_F16), VK_FORMAT_R16G16_SFLOAT); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RG_UInt16), VK_FORMAT_R16G16_UINT); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGB10_A2_UNorm_Rev), VK_FORMAT_A2R10G10B10_UNORM_PACK32); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGB10_A2_Uint_Rev), VK_FORMAT_A2R10G10B10_UINT_PACK32); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::BGR10_A2_Unorm), VK_FORMAT_A2B10G10R10_UNORM_PACK32); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::R_F32), VK_FORMAT_R32_SFLOAT); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::R_UInt32), VK_FORMAT_R32_UINT); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RG_F32), VK_FORMAT_R32G32_SFLOAT); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGB_F16), VK_FORMAT_R16G16B16_SFLOAT); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGBA_F16), VK_FORMAT_R16G16B16A16_SFLOAT); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGB_F32), VK_FORMAT_R32G32B32_SFLOAT); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGBA_UInt32), VK_FORMAT_R32G32B32A32_UINT); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGBA_F32), VK_FORMAT_R32G32B32A32_SFLOAT); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGBA_ASTC_4x4), VK_FORMAT_ASTC_4x4_UNORM_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::SRGB8_A8_ASTC_4x4), VK_FORMAT_ASTC_4x4_SRGB_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGBA_ASTC_5x4), VK_FORMAT_ASTC_5x4_UNORM_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::SRGB8_A8_ASTC_5x4), VK_FORMAT_ASTC_5x4_SRGB_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGBA_ASTC_5x5), VK_FORMAT_ASTC_5x5_UNORM_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::SRGB8_A8_ASTC_5x5), VK_FORMAT_ASTC_5x5_SRGB_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGBA_ASTC_6x5), VK_FORMAT_ASTC_6x5_UNORM_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::SRGB8_A8_ASTC_6x5), VK_FORMAT_ASTC_6x5_SRGB_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGBA_ASTC_6x6), VK_FORMAT_ASTC_6x6_UNORM_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::SRGB8_A8_ASTC_6x6), VK_FORMAT_ASTC_6x6_SRGB_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGBA_ASTC_8x5), VK_FORMAT_ASTC_8x5_UNORM_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::SRGB8_A8_ASTC_8x5), VK_FORMAT_ASTC_8x5_SRGB_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGBA_ASTC_8x6), VK_FORMAT_ASTC_8x6_UNORM_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::SRGB8_A8_ASTC_8x6), VK_FORMAT_ASTC_8x6_SRGB_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGBA_ASTC_8x8), VK_FORMAT_ASTC_8x8_UNORM_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::SRGB8_A8_ASTC_8x8), VK_FORMAT_ASTC_8x8_SRGB_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGBA_ASTC_10x5), VK_FORMAT_ASTC_10x5_UNORM_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::SRGB8_A8_ASTC_10x5), VK_FORMAT_ASTC_10x5_SRGB_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGBA_ASTC_10x6), VK_FORMAT_ASTC_10x6_UNORM_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::SRGB8_A8_ASTC_10x6), VK_FORMAT_ASTC_10x6_SRGB_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGBA_ASTC_10x8), VK_FORMAT_ASTC_10x8_UNORM_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::SRGB8_A8_ASTC_10x8), VK_FORMAT_ASTC_10x8_SRGB_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGBA_ASTC_10x10), VK_FORMAT_ASTC_10x10_UNORM_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::SRGB8_A8_ASTC_10x10), VK_FORMAT_ASTC_10x10_SRGB_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGBA_ASTC_12x10), VK_FORMAT_ASTC_12x10_UNORM_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::SRGB8_A8_ASTC_12x10), VK_FORMAT_ASTC_12x10_SRGB_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGBA_ASTC_12x12), VK_FORMAT_ASTC_12x12_UNORM_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::SRGB8_A8_ASTC_12x12), VK_FORMAT_ASTC_12x12_SRGB_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGBA_PVRTC_2BPPV1), VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGB_PVRTC_2BPPV1), VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGBA_PVRTC_4BPPV1), VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGB_PVRTC_4BPPV1), VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGB8_ETC1), VK_FORMAT_UNDEFINED); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGB8_ETC2), VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::SRGB8_ETC2), VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGB8_Punchthrough_A1_ETC2), VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::SRGB8_Punchthrough_A1_ETC2), VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGBA8_EAC_ETC2), VK_FORMAT_UNDEFINED); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::SRGB8_A8_EAC_ETC2), VK_FORMAT_UNDEFINED); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RG_EAC_UNorm), VK_FORMAT_EAC_R11G11_UNORM_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RG_EAC_SNorm), VK_FORMAT_EAC_R11G11_SNORM_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::R_EAC_UNorm), VK_FORMAT_EAC_R11_UNORM_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::R_EAC_SNorm), VK_FORMAT_EAC_R11_SNORM_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::Invalid), VK_FORMAT_UNDEFINED); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGBA_BC7_UNORM_4x4), VK_FORMAT_BC7_UNORM_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::RGBA_BC7_SRGB_4x4), VK_FORMAT_BC7_SRGB_BLOCK); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::Z_UNorm16), VK_FORMAT_D16_UNORM); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::Z_UNorm24), VK_FORMAT_D24_UNORM_S8_UINT); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::Z_UNorm32), VK_FORMAT_D32_SFLOAT); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::S8_UInt_Z24_UNorm), VK_FORMAT_D24_UNORM_S8_UINT); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::S8_UInt_Z32_UNorm), VK_FORMAT_D32_SFLOAT_S8_UINT); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::S_UInt8), VK_FORMAT_S8_UINT); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::YUV_NV12), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM); ASSERT_EQ(textureFormatToVkFormat(igl::TextureFormat::YUV_420p), VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM); } TEST(TextureFormatUtilTest, vkTextureFormatToTextureFormat) { ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_UNDEFINED), igl::TextureFormat::Invalid); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_R8_UNORM), igl::TextureFormat::R_UNorm8); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_R16_UNORM), igl::TextureFormat::R_UNorm16); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_R16_SFLOAT), igl::TextureFormat::R_F16); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_R16_UINT), igl::TextureFormat::R_UInt16); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_B5G5R5A1_UNORM_PACK16), igl::TextureFormat::B5G5R5A1_UNorm); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_B5G6R5_UNORM_PACK16), igl::TextureFormat::B5G6R5_UNorm); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_B4G4R4A4_UNORM_PACK16), igl::TextureFormat::ABGR_UNorm4); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_R8G8_UNORM), igl::TextureFormat::RG_UNorm8); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_R5G5B5A1_UNORM_PACK16), igl::TextureFormat::R5G5B5A1_UNorm); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_B8G8R8A8_UNORM), igl::TextureFormat::BGRA_UNorm8); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_R8G8B8A8_UNORM), igl::TextureFormat::RGBA_UNorm8); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_R8G8B8A8_SRGB), igl::TextureFormat::RGBA_SRGB); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_B8G8R8A8_SRGB), igl::TextureFormat::BGRA_SRGB); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_R16G16_UNORM), igl::TextureFormat::RG_UNorm16); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_R16G16_SFLOAT), igl::TextureFormat::RG_F16); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_R16G16_UINT), igl::TextureFormat::RG_UInt16); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_A2R10G10B10_UNORM_PACK32), igl::TextureFormat::RGB10_A2_UNorm_Rev); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_A2R10G10B10_UINT_PACK32), igl::TextureFormat::RGB10_A2_Uint_Rev); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_A2B10G10R10_UNORM_PACK32), igl::TextureFormat::BGR10_A2_Unorm); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_R32_SFLOAT), igl::TextureFormat::R_F32); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_R32_UINT), igl::TextureFormat::R_UInt32); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_R32G32_SFLOAT), igl::TextureFormat::RG_F32); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_R16G16B16_SFLOAT), igl::TextureFormat::RGB_F16); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_R16G16B16A16_SFLOAT), igl::TextureFormat::RGBA_F16); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_R32G32B32_SFLOAT), igl::TextureFormat::RGB_F32); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_R32G32B32A32_UINT), igl::TextureFormat::RGBA_UInt32); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_R32G32B32A32_SFLOAT), igl::TextureFormat::RGBA_F32); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ASTC_4x4_UNORM_BLOCK), igl::TextureFormat::RGBA_ASTC_4x4); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ASTC_4x4_SRGB_BLOCK), igl::TextureFormat::SRGB8_A8_ASTC_4x4); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ASTC_5x4_UNORM_BLOCK), igl::TextureFormat::RGBA_ASTC_5x4); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ASTC_5x4_SRGB_BLOCK), igl::TextureFormat::SRGB8_A8_ASTC_5x4); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ASTC_5x5_UNORM_BLOCK), igl::TextureFormat::RGBA_ASTC_5x5); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ASTC_5x5_SRGB_BLOCK), igl::TextureFormat::SRGB8_A8_ASTC_5x5); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ASTC_6x5_UNORM_BLOCK), igl::TextureFormat::RGBA_ASTC_6x5); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ASTC_6x5_SRGB_BLOCK), igl::TextureFormat::SRGB8_A8_ASTC_6x5); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ASTC_6x6_UNORM_BLOCK), igl::TextureFormat::RGBA_ASTC_6x6); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ASTC_6x6_SRGB_BLOCK), igl::TextureFormat::SRGB8_A8_ASTC_6x6); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ASTC_8x5_UNORM_BLOCK), igl::TextureFormat::RGBA_ASTC_8x5); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ASTC_8x5_SRGB_BLOCK), igl::TextureFormat::SRGB8_A8_ASTC_8x5); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ASTC_8x6_UNORM_BLOCK), igl::TextureFormat::RGBA_ASTC_8x6); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ASTC_8x6_SRGB_BLOCK), igl::TextureFormat::SRGB8_A8_ASTC_8x6); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ASTC_8x8_UNORM_BLOCK), igl::TextureFormat::RGBA_ASTC_8x8); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ASTC_8x8_SRGB_BLOCK), igl::TextureFormat::SRGB8_A8_ASTC_8x8); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ASTC_10x5_UNORM_BLOCK), igl::TextureFormat::RGBA_ASTC_10x5); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ASTC_10x5_SRGB_BLOCK), igl::TextureFormat::SRGB8_A8_ASTC_10x5); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ASTC_10x6_UNORM_BLOCK), igl::TextureFormat::RGBA_ASTC_10x6); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ASTC_10x6_SRGB_BLOCK), igl::TextureFormat::SRGB8_A8_ASTC_10x6); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ASTC_10x8_UNORM_BLOCK), igl::TextureFormat::RGBA_ASTC_10x8); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ASTC_10x8_SRGB_BLOCK), igl::TextureFormat::SRGB8_A8_ASTC_10x8); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ASTC_10x10_UNORM_BLOCK), igl::TextureFormat::RGBA_ASTC_10x10); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ASTC_10x10_SRGB_BLOCK), igl::TextureFormat::SRGB8_A8_ASTC_10x10); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ASTC_12x10_UNORM_BLOCK), igl::TextureFormat::RGBA_ASTC_12x10); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ASTC_12x10_SRGB_BLOCK), igl::TextureFormat::SRGB8_A8_ASTC_12x10); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ASTC_12x12_UNORM_BLOCK), igl::TextureFormat::RGBA_ASTC_12x12); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ASTC_12x12_SRGB_BLOCK), igl::TextureFormat::SRGB8_A8_ASTC_12x12); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG), igl::TextureFormat::RGBA_PVRTC_2BPPV1); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG), igl::TextureFormat::RGBA_PVRTC_4BPPV1); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK), igl::TextureFormat::RGB8_ETC2); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK), igl::TextureFormat::SRGB8_ETC2); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK), igl::TextureFormat::RGB8_Punchthrough_A1_ETC2); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK), igl::TextureFormat::SRGB8_Punchthrough_A1_ETC2); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_EAC_R11G11_UNORM_BLOCK), igl::TextureFormat::RG_EAC_UNorm); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_EAC_R11G11_SNORM_BLOCK), igl::TextureFormat::RG_EAC_SNorm); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_EAC_R11_UNORM_BLOCK), igl::TextureFormat::R_EAC_UNorm); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_EAC_R11_SNORM_BLOCK), igl::TextureFormat::R_EAC_SNorm); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_D16_UNORM), igl::TextureFormat::Z_UNorm16); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_BC7_UNORM_BLOCK), igl::TextureFormat::RGBA_BC7_UNORM_4x4); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_BC7_SRGB_BLOCK), igl::TextureFormat::RGBA_BC7_SRGB_4x4); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_X8_D24_UNORM_PACK32), igl::TextureFormat::Z_UNorm24); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_D24_UNORM_S8_UINT), igl::TextureFormat::S8_UInt_Z24_UNorm); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_S8_UINT), igl::TextureFormat::S_UInt8); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_D32_SFLOAT_S8_UINT), igl::TextureFormat::S8_UInt_Z32_UNorm); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_D32_SFLOAT), igl::TextureFormat::Z_UNorm32); ASSERT_EQ(util::vkTextureFormatToTextureFormat(VK_FORMAT_R8G8B8A8_UNORM), igl::TextureFormat::RGBA_UNorm8); } } // namespace igl::vulkan::tests ================================================ FILE: src/igl/tests/vulkan/TextureVulkanExtendedTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/TestDevice.h" #include #include #include #include #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX namespace igl::tests { class TextureVulkanExtendedTest : public ::testing::Test { public: TextureVulkanExtendedTest() = default; ~TextureVulkanExtendedTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); iglDev_ = util::createTestDevice(); ASSERT_NE(iglDev_, nullptr); ASSERT_EQ(iglDev_->getBackendType(), BackendType::Vulkan) << "Test requires Vulkan backend"; } void TearDown() override {} protected: std::shared_ptr iglDev_; }; TEST_F(TextureVulkanExtendedTest, Create3D) { if (!iglDev_->hasFeature(DeviceFeatures::Texture3D)) { GTEST_SKIP() << "3D textures not supported."; } Result ret; TextureDesc desc = TextureDesc::new3D( TextureFormat::RGBA_UNorm8, 4, 4, 4, TextureDesc::TextureUsageBits::Sampled); auto texture = iglDev_->createTexture(desc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(texture, nullptr); EXPECT_EQ(texture->getType(), TextureType::ThreeD); } TEST_F(TextureVulkanExtendedTest, CreateCube) { Result ret; TextureDesc desc = TextureDesc::newCube( TextureFormat::RGBA_UNorm8, 4, 4, TextureDesc::TextureUsageBits::Sampled); auto texture = iglDev_->createTexture(desc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(texture, nullptr); EXPECT_EQ(texture->getType(), TextureType::Cube); } TEST_F(TextureVulkanExtendedTest, CreateArray) { if (!iglDev_->hasFeature(DeviceFeatures::Texture2DArray)) { GTEST_SKIP() << "Texture arrays not supported."; } Result ret; TextureDesc desc = TextureDesc::new2DArray( TextureFormat::RGBA_UNorm8, 4, 4, 3, TextureDesc::TextureUsageBits::Sampled); auto texture = iglDev_->createTexture(desc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(texture, nullptr); EXPECT_EQ(texture->getType(), TextureType::TwoDArray); EXPECT_EQ(texture->getNumLayers(), 3u); } TEST_F(TextureVulkanExtendedTest, CreateMSAA) { Result ret; TextureDesc desc = TextureDesc::new2D( TextureFormat::RGBA_UNorm8, 4, 4, TextureDesc::TextureUsageBits::Attachment); desc.numSamples = 4; auto texture = iglDev_->createTexture(desc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(texture, nullptr); EXPECT_EQ(texture->getSamples(), 4u); } TEST_F(TextureVulkanExtendedTest, DepthStencilFormats) { Result ret; TextureDesc desc = TextureDesc::new2D(TextureFormat::Z_UNorm24, 4, 4, TextureDesc::TextureUsageBits::Attachment | TextureDesc::TextureUsageBits::Sampled); auto depthTexture = iglDev_->createTexture(desc, &ret); if (ret.isOk()) { ASSERT_NE(depthTexture, nullptr); } TextureDesc descDS = TextureDesc::new2D(TextureFormat::S8_UInt_Z24_UNorm, 4, 4, TextureDesc::TextureUsageBits::Attachment | TextureDesc::TextureUsageBits::Sampled); auto dsTexture = iglDev_->createTexture(descDS, &ret); if (ret.isOk()) { ASSERT_NE(dsTexture, nullptr); } } TEST_F(TextureVulkanExtendedTest, TextureId) { Result ret; TextureDesc desc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 2, 2, TextureDesc::TextureUsageBits::Sampled); auto texture = iglDev_->createTexture(desc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(texture, nullptr); auto* vulkanTexture = static_cast(texture.get()); ASSERT_NE(vulkanTexture, nullptr); EXPECT_NE(vulkanTexture->getVulkanTexture().textureId_, 0u); } } // namespace igl::tests #endif // IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX ================================================ FILE: src/igl/tests/vulkan/VulkanBufferTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../util/TestDevice.h" #include #include #include #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX namespace igl::tests { class VulkanBufferTest : public ::testing::Test { public: VulkanBufferTest() = default; ~VulkanBufferTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); iglDev_ = util::createTestDevice(); ASSERT_NE(iglDev_, nullptr); ASSERT_EQ(iglDev_->getBackendType(), BackendType::Vulkan) << "Test requires Vulkan backend"; } void TearDown() override {} protected: std::shared_ptr iglDev_; igl::vulkan::VulkanContext& getVulkanContext() { auto& device = static_cast(*iglDev_); return device.getVulkanContext(); } }; TEST_F(VulkanBufferTest, CreateDeviceLocal) { auto& ctx = getVulkanContext(); Result ret; auto buffer = ctx.createBuffer(256, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &ret, "testDeviceLocalBuffer"); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(buffer, nullptr); EXPECT_NE(buffer->getVkBuffer(), VK_NULL_HANDLE); EXPECT_EQ(buffer->getSize(), 256u); EXPECT_TRUE(buffer->getMemoryPropertyFlags() & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); } TEST_F(VulkanBufferTest, CreateHostVisible) { auto& ctx = getVulkanContext(); Result ret; auto buffer = ctx.createBuffer(512, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, &ret, "testHostVisibleBuffer"); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(buffer, nullptr); EXPECT_NE(buffer->getVkBuffer(), VK_NULL_HANDLE); EXPECT_EQ(buffer->getSize(), 512u); EXPECT_TRUE(buffer->isMapped()); EXPECT_NE(buffer->getMappedPtr(), nullptr); } TEST_F(VulkanBufferTest, BufferDeviceAddress) { auto& ctx = getVulkanContext(); if (!ctx.features().has_VK_KHR_buffer_device_address) { GTEST_SKIP() << "VK_KHR_buffer_device_address not supported."; } Result ret; auto buffer = iglDev_->createBuffer( BufferDesc{ .type = BufferDesc::BufferTypeBits::Uniform, .length = 256, .storage = ResourceStorage::Shared, }, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(buffer, nullptr); EXPECT_NE(buffer->gpuAddress(), 0u); } TEST_F(VulkanBufferTest, GetVkBuffer) { auto& ctx = getVulkanContext(); Result ret; auto buffer = ctx.createBuffer(128, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, &ret, "testGetVkBuffer"); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(buffer, nullptr); VkBuffer vkBuf = buffer->getVkBuffer(); EXPECT_NE(vkBuf, VK_NULL_HANDLE); } TEST_F(VulkanBufferTest, HostVisibleBufferSubData) { auto& ctx = getVulkanContext(); Result ret; auto buffer = ctx.createBuffer(256, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, &ret, "testSubData"); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(buffer, nullptr); ASSERT_TRUE(buffer->isMapped()); std::vector srcData(64, 0xDEADBEEF); buffer->bufferSubData(0, srcData.size() * sizeof(uint32_t), srcData.data()); std::vector dstData(64, 0); buffer->getBufferSubData(0, dstData.size() * sizeof(uint32_t), dstData.data()); for (size_t i = 0; i < 64; ++i) { EXPECT_EQ(dstData[i], 0xDEADBEEF); } } TEST_F(VulkanBufferTest, CreateBufferWithInvalidStorageConvertsToPrivate) { Result ret; auto buffer = iglDev_->createBuffer( BufferDesc{ .type = BufferDesc::BufferTypeBits::Uniform, .length = 256, .storage = ResourceStorage::Invalid, }, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(buffer, nullptr); auto& ctx = getVulkanContext(); if (ctx.useStagingForBuffers_) { EXPECT_EQ(buffer->storage(), ResourceStorage::Private); } else { EXPECT_EQ(buffer->storage(), ResourceStorage::Shared); } } } // namespace igl::tests #endif // IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX ================================================ FILE: src/igl/tests/vulkan/VulkanContextExtendedTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/TestDevice.h" #include #include #include #include #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX namespace igl::tests { class VulkanContextExtendedTest : public ::testing::Test { public: VulkanContextExtendedTest() = default; ~VulkanContextExtendedTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); iglDev_ = util::createTestDevice(); ASSERT_NE(iglDev_, nullptr); ASSERT_EQ(iglDev_->getBackendType(), BackendType::Vulkan) << "Test requires Vulkan backend"; } void TearDown() override {} protected: std::shared_ptr iglDev_; igl::vulkan::VulkanContext& getVulkanContext() { auto& device = static_cast(*iglDev_); return device.getVulkanContext(); } }; TEST_F(VulkanContextExtendedTest, WaitIdle) { auto& ctx = getVulkanContext(); Result ret; auto cmdQueue = iglDev_->createCommandQueue(CommandQueueDesc{}, &ret); ASSERT_TRUE(ret.isOk()); auto cmdBuf = cmdQueue->createCommandBuffer(CommandBufferDesc(), &ret); ASSERT_TRUE(ret.isOk()); cmdQueue->submit(*cmdBuf); auto result = ctx.waitIdle(); EXPECT_TRUE(result.isOk()) << result.message.c_str(); } TEST_F(VulkanContextExtendedTest, DeferredTaskExecution) { auto& ctx = getVulkanContext(); bool taskExecuted = false; std::packaged_task task([&taskExecuted]() { taskExecuted = true; }); ctx.deferredTask(std::move(task)); Result ret; auto cmdQueue = iglDev_->createCommandQueue(CommandQueueDesc{}, &ret); ASSERT_TRUE(ret.isOk()); auto cmdBuf = cmdQueue->createCommandBuffer(CommandBufferDesc(), &ret); ASSERT_TRUE(ret.isOk()); cmdQueue->submit(*cmdBuf); ctx.waitDeferredTasks(); } TEST_F(VulkanContextExtendedTest, GetPipelineCacheData) { auto& ctx = getVulkanContext(); auto cacheData = ctx.getPipelineCacheData(); // Cache data may be empty if no pipelines have been created, but the call must not crash SUCCEED(); } TEST_F(VulkanContextExtendedTest, GetVkDevice) { auto& ctx = getVulkanContext(); EXPECT_TRUE(ctx.getVkDevice() != nullptr); } TEST_F(VulkanContextExtendedTest, GetVkPhysicalDevice) { auto& ctx = getVulkanContext(); EXPECT_TRUE(ctx.getVkPhysicalDevice() != nullptr); } TEST_F(VulkanContextExtendedTest, GetVkInstance) { auto& ctx = getVulkanContext(); EXPECT_TRUE(ctx.getVkInstance() != nullptr); } TEST_F(VulkanContextExtendedTest, PhysicalDeviceProperties) { auto& ctx = getVulkanContext(); const auto& props = ctx.getVkPhysicalDeviceProperties(); EXPECT_NE(props.apiVersion, 0u); EXPECT_GT(props.limits.maxImageDimension2D, 0u); } TEST_F(VulkanContextExtendedTest, CurrentSyncIndex) { auto& ctx = getVulkanContext(); EXPECT_LT(ctx.currentSyncIndex(), ctx.config_.maxResourceCount); } } // namespace igl::tests #endif // IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX ================================================ FILE: src/igl/tests/vulkan/VulkanDescriptorSetLayoutTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../util/TestDevice.h" #include #include #include #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX namespace igl::tests { class VulkanDescriptorSetLayoutTest : public ::testing::Test { public: VulkanDescriptorSetLayoutTest() = default; ~VulkanDescriptorSetLayoutTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); iglDev_ = util::createTestDevice(); ASSERT_NE(iglDev_, nullptr); ASSERT_EQ(iglDev_->getBackendType(), BackendType::Vulkan) << "Test requires Vulkan backend"; } void TearDown() override {} protected: std::shared_ptr iglDev_; igl::vulkan::VulkanContext& getVulkanContext() { auto& device = static_cast(*iglDev_); return device.getVulkanContext(); } }; TEST_F(VulkanDescriptorSetLayoutTest, SingleBinding) { auto& ctx = getVulkanContext(); VkDescriptorSetLayoutBinding binding = {}; binding.binding = 0; binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; binding.descriptorCount = 1; binding.stageFlags = VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT; binding.pImmutableSamplers = nullptr; VkDescriptorBindingFlags bindingFlags = 0; auto layout = std::make_unique( ctx, 0, 1, &binding, &bindingFlags, "testSingleBinding"); ASSERT_NE(layout, nullptr); EXPECT_NE(layout->getVkDescriptorSetLayout(), VK_NULL_HANDLE); EXPECT_EQ(layout->numBindings, 1u); } TEST_F(VulkanDescriptorSetLayoutTest, MultipleBindings) { auto& ctx = getVulkanContext(); std::array bindings = {}; bindings[0].binding = 0; bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; bindings[0].descriptorCount = 1; bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT; bindings[1].binding = 1; bindings[1].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; bindings[1].descriptorCount = 1; bindings[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; bindings[2].binding = 2; bindings[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; bindings[2].descriptorCount = 1; bindings[2].stageFlags = VK_SHADER_STAGE_COMPUTE_BIT; std::array bindingFlags = {}; auto layout = std::make_unique( ctx, 0, 3, bindings.data(), bindingFlags.data(), "testMultipleBindings"); ASSERT_NE(layout, nullptr); EXPECT_NE(layout->getVkDescriptorSetLayout(), VK_NULL_HANDLE); EXPECT_EQ(layout->numBindings, 3u); } TEST_F(VulkanDescriptorSetLayoutTest, WithBindingFlags) { auto& ctx = getVulkanContext(); VkDescriptorSetLayoutBinding binding = {}; binding.binding = 0; binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; binding.descriptorCount = 1; binding.stageFlags = VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT; VkDescriptorBindingFlags flags = 0; auto layout = std::make_unique( ctx, 0, 1, &binding, &flags, "testWithFlags"); ASSERT_NE(layout, nullptr); EXPECT_NE(layout->getVkDescriptorSetLayout(), VK_NULL_HANDLE); EXPECT_EQ(layout->numBindings, 1u); } TEST_F(VulkanDescriptorSetLayoutTest, DestructorCleanup) { auto& ctx = getVulkanContext(); VkDescriptorSetLayoutBinding binding = {}; binding.binding = 0; binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; binding.descriptorCount = 1; binding.stageFlags = VK_SHADER_STAGE_VERTEX_BIT; { VkDescriptorBindingFlags bindingFlags = 0; auto layout = std::make_unique( ctx, 0, 1, &binding, &bindingFlags, "testDestructor"); ASSERT_NE(layout, nullptr); EXPECT_NE(layout->getVkDescriptorSetLayout(), VK_NULL_HANDLE); } ctx.waitDeferredTasks(); } } // namespace igl::tests #endif // IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX ================================================ FILE: src/igl/tests/vulkan/VulkanFeaturesTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace igl::tests { // // VulkanFeaturesTest // // Unit tests for VulkanFeatures // // Constructing *********************************************************************** class VulkanFeaturesTest : public ::testing::Test {}; TEST_F(VulkanFeaturesTest, Construct) { const igl::vulkan::VulkanContextConfig config; const igl::vulkan::VulkanFeatures features(config); EXPECT_EQ(features.featuresShaderFloat16Int8.pNext, nullptr); } // Copying *************************************************************************** TEST_F(VulkanFeaturesTest, CopyNotPerformed) { const igl::vulkan::VulkanContextConfig configSrc; EXPECT_FALSE(configSrc.enableDescriptorIndexing); igl::vulkan::VulkanContextConfig configDst; configDst.enableDescriptorIndexing = true; EXPECT_TRUE(configDst.enableDescriptorIndexing); const igl::vulkan::VulkanFeatures featuresSrc(configSrc); igl::vulkan::VulkanFeatures featuresDst(configDst); featuresDst = featuresSrc; // Unchanged EXPECT_TRUE(configDst.enableDescriptorIndexing); } // Enable Default Features **************************************************** TEST_F(VulkanFeaturesTest, EnableDefaultFeatures) { const igl::vulkan::VulkanContextConfig config; igl::vulkan::VulkanFeatures features(config); EXPECT_FALSE(features.featuresShaderFloat16Int8.shaderFloat16); EXPECT_FALSE(features.featuresShaderFloat16Int8.shaderInt8); EXPECT_TRUE(features.vkPhysicalDeviceFeatures2.features.dualSrcBlend); EXPECT_TRUE(features.vkPhysicalDeviceFeatures2.features.shaderInt16); EXPECT_TRUE(features.vkPhysicalDeviceFeatures2.features.multiDrawIndirect); EXPECT_TRUE(features.vkPhysicalDeviceFeatures2.features.drawIndirectFirstInstance); EXPECT_TRUE(features.vkPhysicalDeviceFeatures2.features.depthBiasClamp); #ifdef IGL_PLATFORM_ANDROID // fillModeNonSolid is not well supported on Android, only enable by default when it's not Android EXPECT_FALSE(features.vkPhysicalDeviceFeatures2.features.fillModeNonSolid); #else EXPECT_TRUE(features.vkPhysicalDeviceFeatures2.features.fillModeNonSolid); #endif { const auto& dif = features.featuresDescriptorIndexing; ASSERT_FALSE(config.enableDescriptorIndexing); EXPECT_TRUE(dif.shaderSampledImageArrayNonUniformIndexing); EXPECT_TRUE(dif.descriptorBindingUniformBufferUpdateAfterBind); EXPECT_TRUE(dif.descriptorBindingSampledImageUpdateAfterBind); EXPECT_TRUE(dif.descriptorBindingStorageImageUpdateAfterBind); EXPECT_TRUE(dif.descriptorBindingStorageBufferUpdateAfterBind); EXPECT_TRUE(dif.descriptorBindingUpdateUnusedWhilePending); EXPECT_TRUE(dif.descriptorBindingPartiallyBound); EXPECT_TRUE(dif.runtimeDescriptorArray); EXPECT_TRUE(features.features16BitStorage.storageBuffer16BitAccess); EXPECT_TRUE(features.featuresBufferDeviceAddress.bufferDeviceAddress); EXPECT_TRUE(features.featuresMultiview.multiview); EXPECT_TRUE(features.featuresSamplerYcbcrConversion.samplerYcbcrConversion); EXPECT_TRUE(features.featuresShaderDrawParameters.shaderDrawParameters); } } } // namespace igl::tests ================================================ FILE: src/igl/tests/vulkan/VulkanFenceTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../util/TestDevice.h" #include #include #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX namespace igl::tests { class VulkanFenceTest : public ::testing::Test { public: VulkanFenceTest() = default; ~VulkanFenceTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); iglDev_ = util::createTestDevice(); ASSERT_NE(iglDev_, nullptr); ASSERT_EQ(iglDev_->getBackendType(), BackendType::Vulkan) << "Test requires Vulkan backend"; } void TearDown() override {} protected: std::shared_ptr iglDev_; igl::vulkan::VulkanContext& getVulkanContext() { auto& device = static_cast(*iglDev_); return device.getVulkanContext(); } }; TEST_F(VulkanFenceTest, CreateSignaledFence) { auto& ctx = getVulkanContext(); igl::vulkan::VulkanFence fence( ctx.vf_, ctx.getVkDevice(), VK_FENCE_CREATE_SIGNALED_BIT, false, "testSignaledFence"); EXPECT_NE(fence.vkFence_, VK_NULL_HANDLE); EXPECT_FALSE(fence.exportable()); EXPECT_TRUE(fence.wait(0)); } TEST_F(VulkanFenceTest, CreateUnsignaledFence) { auto& ctx = getVulkanContext(); igl::vulkan::VulkanFence fence(ctx.vf_, ctx.getVkDevice(), 0, false, "testUnsignaledFence"); EXPECT_NE(fence.vkFence_, VK_NULL_HANDLE); EXPECT_FALSE(fence.exportable()); } TEST_F(VulkanFenceTest, ResetFence) { auto& ctx = getVulkanContext(); igl::vulkan::VulkanFence fence( ctx.vf_, ctx.getVkDevice(), VK_FENCE_CREATE_SIGNALED_BIT, false, "testResetFence"); ASSERT_NE(fence.vkFence_, VK_NULL_HANDLE); EXPECT_TRUE(fence.wait(0)); EXPECT_TRUE(fence.reset()); } TEST_F(VulkanFenceTest, ExportableFence) { #if IGL_PLATFORM_LINUX || IGL_PLATFORM_ANDROID auto& ctx = getVulkanContext(); igl::vulkan::VulkanFence fence( ctx.vf_, ctx.getVkDevice(), VK_FENCE_CREATE_SIGNALED_BIT, true, "testExportableFence"); EXPECT_NE(fence.vkFence_, VK_NULL_HANDLE); EXPECT_TRUE(fence.exportable()); #else GTEST_SKIP() << "Exportable fences may not be supported on this platform."; #endif } TEST_F(VulkanFenceTest, MoveConstruction) { auto& ctx = getVulkanContext(); igl::vulkan::VulkanFence original( ctx.vf_, ctx.getVkDevice(), VK_FENCE_CREATE_SIGNALED_BIT, false, "testMoveCtor"); VkFence originalHandle = original.vkFence_; ASSERT_NE(originalHandle, VK_NULL_HANDLE); igl::vulkan::VulkanFence moved(std::move(original)); EXPECT_EQ(moved.vkFence_, originalHandle); // After move, original is in a valid but unspecified state - don't access it } TEST_F(VulkanFenceTest, MoveAssignment) { auto& ctx = getVulkanContext(); igl::vulkan::VulkanFence original( ctx.vf_, ctx.getVkDevice(), VK_FENCE_CREATE_SIGNALED_BIT, false, "testMoveAssign1"); igl::vulkan::VulkanFence target(ctx.vf_, ctx.getVkDevice(), 0, false, "testMoveAssign2"); VkFence originalHandle = original.vkFence_; ASSERT_NE(originalHandle, VK_NULL_HANDLE); target = std::move(original); EXPECT_EQ(target.vkFence_, originalHandle); // After move, original is in a valid but unspecified state - don't access it } } // namespace igl::tests #endif // IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX ================================================ FILE: src/igl/tests/vulkan/VulkanHelpersTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include namespace igl::tests { // // VulkanHelpersTest // // Unit tests for functions in VulkanHelpers.{h|c}. // // ivkGetVulkanResultString ********************************************************************** class GetVulkanResultString : public ::testing::Test {}; TEST_F(GetVulkanResultString, VulkanHelpersTest) { EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_SUCCESS), "VK_SUCCESS") == 0); EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_NOT_READY), "VK_NOT_READY") == 0); EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_TIMEOUT), "VK_TIMEOUT") == 0); EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_EVENT_SET), "VK_EVENT_SET") == 0); EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_EVENT_RESET), "VK_EVENT_RESET") == 0); EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_INCOMPLETE), "VK_INCOMPLETE") == 0); EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_ERROR_OUT_OF_HOST_MEMORY), "VK_ERROR_OUT_OF_HOST_MEMORY") == 0); EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_ERROR_OUT_OF_DEVICE_MEMORY), "VK_ERROR_OUT_OF_DEVICE_MEMORY") == 0); EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_ERROR_INITIALIZATION_FAILED), "VK_ERROR_INITIALIZATION_FAILED") == 0); EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_ERROR_DEVICE_LOST), "VK_ERROR_DEVICE_LOST") == 0); EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_ERROR_MEMORY_MAP_FAILED), "VK_ERROR_MEMORY_MAP_FAILED") == 0); EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_ERROR_LAYER_NOT_PRESENT), "VK_ERROR_LAYER_NOT_PRESENT") == 0); EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_ERROR_EXTENSION_NOT_PRESENT), "VK_ERROR_EXTENSION_NOT_PRESENT") == 0); EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_ERROR_FEATURE_NOT_PRESENT), "VK_ERROR_FEATURE_NOT_PRESENT") == 0); EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_ERROR_INCOMPATIBLE_DRIVER), "VK_ERROR_INCOMPATIBLE_DRIVER") == 0); EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_ERROR_TOO_MANY_OBJECTS), "VK_ERROR_TOO_MANY_OBJECTS") == 0); EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_ERROR_FORMAT_NOT_SUPPORTED), "VK_ERROR_FORMAT_NOT_SUPPORTED") == 0); EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_ERROR_SURFACE_LOST_KHR), "VK_ERROR_SURFACE_LOST_KHR") == 0); EXPECT_TRUE( strcmp(ivkGetVulkanResultString(VK_ERROR_OUT_OF_DATE_KHR), "VK_ERROR_OUT_OF_DATE_KHR") == 0); EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_ERROR_INCOMPATIBLE_DISPLAY_KHR), "VK_ERROR_INCOMPATIBLE_DISPLAY_KHR") == 0); EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_ERROR_NATIVE_WINDOW_IN_USE_KHR), "VK_ERROR_NATIVE_WINDOW_IN_USE_KHR") == 0); EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_ERROR_VALIDATION_FAILED_EXT), "VK_ERROR_VALIDATION_FAILED_EXT") == 0); EXPECT_TRUE( strcmp(ivkGetVulkanResultString(VK_ERROR_FRAGMENTED_POOL), "VK_ERROR_FRAGMENTED_POOL") == 0); EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_ERROR_UNKNOWN), "VK_ERROR_UNKNOWN") == 0); EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_ERROR_OUT_OF_POOL_MEMORY), "VK_ERROR_OUT_OF_POOL_MEMORY") == 0); // 1.1 EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_ERROR_INVALID_EXTERNAL_HANDLE), "VK_ERROR_INVALID_EXTERNAL_HANDLE") == 0); // 1.1 EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_ERROR_FRAGMENTATION), "VK_ERROR_FRAGMENTATION") == 0); // 1.2 EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS), "VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS") == 0); // 1.2 EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_SUBOPTIMAL_KHR), "VK_SUBOPTIMAL_KHR") == 0); // VK_KHR_swapchain EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_ERROR_INVALID_SHADER_NV), "VK_ERROR_INVALID_SHADER_NV") == 0); // VK_NV_glsl_shader #ifdef VK_ENABLE_BETA_EXTENSIONS // Provided by VK_KHR_video_queue EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_ERROR_IMAGE_USAGE_NOT_SUPPORTED_KHR), "VK_ERROR_IMAGE_USAGE_NOT_SUPPORTED_KHR") == 0); #endif #ifdef VK_ENABLE_BETA_EXTENSIONS // Provided by VK_KHR_video_queue EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_ERROR_VIDEO_PICTURE_LAYOUT_NOT_SUPPORTED_KHR), "VK_ERROR_VIDEO_PICTURE_LAYOUT_NOT_SUPPORTED_KHR") == 0); #endif #ifdef VK_ENABLE_BETA_EXTENSIONS // Provided by VK_KHR_video_queue EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR), "VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR") == 0); #endif #ifdef VK_ENABLE_BETA_EXTENSIONS // Provided by VK_KHR_video_queue EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR), "VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR") == 0); #endif #ifdef VK_ENABLE_BETA_EXTENSIONS // Provided by VK_KHR_video_queue EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR), "VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR") == 0); #endif #ifdef VK_ENABLE_BETA_EXTENSIONS // Provided by VK_KHR_video_queue EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_ERROR_VIDEO_STD_VERSION_NOT_SUPPORTED_KHR), "VK_ERROR_VIDEO_STD_VERSION_NOT_SUPPORTED_KHR") == 0); #endif EXPECT_TRUE( strcmp(ivkGetVulkanResultString(VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT), "VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT") == 0); // VK_EXT_image_drm_format_modifier EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_ERROR_NOT_PERMITTED_KHR), "VK_ERROR_NOT_PERMITTED_KHR") == 0); // VK_KHR_global_priority EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT), "VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT") == 0); // VK_EXT_full_screen_exclusive EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_THREAD_IDLE_KHR), "VK_THREAD_IDLE_KHR") == 0); // VK_KHR_deferred_host_operations EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_THREAD_DONE_KHR), "VK_THREAD_DONE_KHR") == 0); // VK_KHR_deferred_host_operations EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_OPERATION_DEFERRED_KHR), "VK_OPERATION_DEFERRED_KHR") == 0); // VK_KHR_deferred_host_operations EXPECT_TRUE(strcmp(ivkGetVulkanResultString(VK_OPERATION_NOT_DEFERRED_KHR), "VK_OPERATION_NOT_DEFERRED_KHR") == 0); // VK_KHR_deferred_host_operations } // ivkGetWriteDescriptorSetImageInfo ******************************* class GetWriteDescriptorSetImageInfoTest : public ::testing::TestWithParam> {}; TEST_P(GetWriteDescriptorSetImageInfoTest, GetWriteDescriptorSet_ImageInfo) { constexpr VkDescriptorSet descSet = VK_NULL_HANDLE; const uint32_t dstBinding = std::get<0>(GetParam()); const VkDescriptorType descType = std::get<1>(GetParam()); const uint32_t numDescs = std::get<2>(GetParam()); const std::array pImageInfo = { VkDescriptorImageInfo{.sampler = VK_NULL_HANDLE, .imageView = VK_NULL_HANDLE, .imageLayout = VK_IMAGE_LAYOUT_UNDEFINED}, VkDescriptorImageInfo{.sampler = VK_NULL_HANDLE, .imageView = VK_NULL_HANDLE, .imageLayout = VK_IMAGE_LAYOUT_UNDEFINED}}; const VkWriteDescriptorSet imageDescSet = ivkGetWriteDescriptorSetImageInfo(descSet, dstBinding, descType, numDescs, pImageInfo.data()); EXPECT_EQ(imageDescSet.sType, VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET); EXPECT_EQ(imageDescSet.pNext, nullptr); EXPECT_EQ(imageDescSet.dstSet, descSet); EXPECT_EQ(imageDescSet.dstBinding, dstBinding); EXPECT_EQ(imageDescSet.dstArrayElement, 0); EXPECT_EQ(imageDescSet.descriptorCount, numDescs); EXPECT_EQ(imageDescSet.descriptorType, descType); EXPECT_EQ(imageDescSet.pImageInfo, pImageInfo.data()); EXPECT_EQ(imageDescSet.pBufferInfo, nullptr); EXPECT_EQ(imageDescSet.pTexelBufferView, nullptr); } INSTANTIATE_TEST_SUITE_P( AllCombinations, GetWriteDescriptorSetImageInfoTest, ::testing::Combine(::testing::Values(0, 1), ::testing::Values(VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE), ::testing::Values(1, 2)), [](const testing::TestParamInfo& info) { const std::string name = std::to_string(std::get<0>(info.param)) + "_" + std::to_string(std::get<1>(info.param)) + "_" + std::to_string(std::get<2>(info.param)); return name; }); // ivkGetWriteDescriptorSetBufferInfo ******************************* class GetWriteDescriptorSetBufferInfoTest : public ::testing::TestWithParam> {}; TEST_P(GetWriteDescriptorSetBufferInfoTest, GetWriteDescriptorSet_BufferInfo) { constexpr VkDescriptorSet descSet = VK_NULL_HANDLE; const uint32_t dstBinding = std::get<0>(GetParam()); const VkDescriptorType descType = std::get<1>(GetParam()); const uint32_t numDescs = std::get<2>(GetParam()); const std::array pBufferInfo = { VkDescriptorBufferInfo{.buffer = VK_NULL_HANDLE, .offset = 0, .range = VK_WHOLE_SIZE}, VkDescriptorBufferInfo{.buffer = VK_NULL_HANDLE, .offset = 0, .range = VK_WHOLE_SIZE}}; const VkWriteDescriptorSet bufferDescSet = ivkGetWriteDescriptorSetBufferInfo( descSet, dstBinding, descType, numDescs, pBufferInfo.data()); EXPECT_EQ(bufferDescSet.sType, VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET); EXPECT_EQ(bufferDescSet.pNext, nullptr); EXPECT_EQ(bufferDescSet.dstSet, descSet); EXPECT_EQ(bufferDescSet.dstBinding, dstBinding); EXPECT_EQ(bufferDescSet.dstArrayElement, 0); EXPECT_EQ(bufferDescSet.descriptorCount, numDescs); EXPECT_EQ(bufferDescSet.descriptorType, descType); EXPECT_EQ(bufferDescSet.pImageInfo, nullptr); EXPECT_EQ(bufferDescSet.pBufferInfo, pBufferInfo.data()); EXPECT_EQ(bufferDescSet.pTexelBufferView, nullptr); } INSTANTIATE_TEST_SUITE_P( AllCombinations, GetWriteDescriptorSetBufferInfoTest, ::testing::Combine(::testing::Values(0, 1), ::testing::Values(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER), ::testing::Values(1, 2)), [](const testing::TestParamInfo& info) { const std::string name = std::to_string(std::get<0>(info.param)) + "_" + std::to_string(std::get<1>(info.param)) + "_" + std::to_string(std::get<2>(info.param)); return name; }); // ivkGetVertexInputBindingDescription ******************************* class GetVertexInputBindingDescriptionTest : public ::testing::TestWithParam> {}; TEST_P(GetVertexInputBindingDescriptionTest, GetVertexInputBindingDescription) { const auto binding = std::get<0>(GetParam()); const auto stride = std::get<1>(GetParam()); const auto inputRate = std::get<2>(GetParam()); const VkVertexInputBindingDescription vtxInputBindingDesc = ivkGetVertexInputBindingDescription(binding, stride, inputRate); EXPECT_EQ(vtxInputBindingDesc.binding, binding); EXPECT_EQ(vtxInputBindingDesc.stride, stride); EXPECT_EQ(vtxInputBindingDesc.inputRate, inputRate); } INSTANTIATE_TEST_SUITE_P( AllCombinations, GetVertexInputBindingDescriptionTest, ::testing::Combine(::testing::Values(0, 1), ::testing::Values(0, 16), ::testing::Values(VK_VERTEX_INPUT_RATE_VERTEX, VK_VERTEX_INPUT_RATE_INSTANCE)), [](const testing::TestParamInfo& info) { const std::string name = std::to_string(std::get<0>(info.param)) + "_" + std::to_string(std::get<1>(info.param)) + "_" + std::to_string(std::get<2>(info.param)); return name; }); // ivkGetVertexInputAttributeDescription ******************************* class GetVertexInputAttributeDescriptionTest : public ::testing::TestWithParam> {}; TEST_P(GetVertexInputAttributeDescriptionTest, GetVertexInputAttributeDescription) { const auto location = std::get<0>(GetParam()); const auto binding = std::get<1>(GetParam()); const auto format = std::get<2>(GetParam()); const auto offset = std::get<3>(GetParam()); const VkVertexInputAttributeDescription vtxInputAttrDesc = ivkGetVertexInputAttributeDescription(location, binding, format, offset); EXPECT_EQ(vtxInputAttrDesc.location, location); EXPECT_EQ(vtxInputAttrDesc.binding, binding); EXPECT_EQ(vtxInputAttrDesc.format, format); EXPECT_EQ(vtxInputAttrDesc.offset, offset); } INSTANTIATE_TEST_SUITE_P( AllCombinations, GetVertexInputAttributeDescriptionTest, ::testing::Combine(::testing::Values(0, 1), ::testing::Values(0, 1), ::testing::Values(VK_FORMAT_R8G8B8_UNORM, VK_FORMAT_R8G8B8_SNORM), ::testing::Values(0, 16)), [](const testing::TestParamInfo& info) { const std::string name = std::to_string(std::get<0>(info.param)) + "_" + std::to_string(std::get<1>(info.param)) + "_" + std::to_string(std::get<2>(info.param)) + "_" + std::to_string(std::get<3>(info.param)); return name; }); } // namespace igl::tests ================================================ FILE: src/igl/tests/vulkan/VulkanImageTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #include #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_LINUX namespace igl::tests { namespace { constexpr uint32_t kWidth = 1024; constexpr uint32_t kHeight = 1024; constexpr VkFormat kFormat = VK_FORMAT_R8G8B8A8_UNORM; } // namespace // // VulkanImageTest // // Unit tests for igl::vulkan::VulkanImage. // class VulkanImageTest : public ::testing::Test { public: // Set up common resources. void SetUp() override { // Turn off debug break so unit tests can run igl::setDebugBreakEnabled(false); device_ = igl::tests::util::device::createTestDevice(igl::BackendType::Vulkan); ASSERT_TRUE(device_ != nullptr); auto& device = static_cast(*device_); context_ = &device.getVulkanContext(); ASSERT_TRUE(context_ != nullptr); } protected: std::shared_ptr device_; vulkan::VulkanContext* context_ = nullptr; }; TEST_F(VulkanImageTest, CreateImageWithExportedMemory) { auto vulkanImage = igl::vulkan::VulkanImage::createWithExportMemory( *context_, VkExtent3D{.width = kWidth, .height = kHeight, .depth = 1}, VK_IMAGE_TYPE_2D, kFormat, 1, /* mipLevels */ 1, /* arrayLayers */ VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, /* createFlags */ VK_SAMPLE_COUNT_1_BIT, "Image: vulkan export memory"); ASSERT_NE(vulkanImage.valid(), false); EXPECT_TRUE(vulkanImage.isExported_); #if IGL_PLATFORM_WINDOWS EXPECT_NE(vulkanImage.exportedMemoryHandle_, nullptr); EXPECT_NE(vulkanImage.getVkImage(), static_cast(VK_NULL_HANDLE)); #elif IGL_PLATFORM_ANDROID || IGL_PLATFORM_LINUX EXPECT_NE(vulkanImage.exportedFd_, -1); EXPECT_NE(vulkanImage.getVkImage(), VK_NULL_HANDLE); #endif } #if IGL_PLATFORM_WINDOWS TEST_F(VulkanImageTest, CreateImageWithImportedMemoryWin32) { auto exportedImage = igl::vulkan::VulkanImage::createWithExportMemory( *context_, VkExtent3D{.width = kWidth, .height = kHeight, .depth = 1}, VK_IMAGE_TYPE_2D, kFormat, 1, /* mipLevels */ 1, /* arrayLayers */ VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, /* createFlags */ VK_SAMPLE_COUNT_1_BIT, "Image: vulkan export memory"); ASSERT_NE(exportedImage.valid(), false); EXPECT_NE(exportedImage.exportedMemoryHandle_, nullptr); auto importedImage = igl::vulkan::VulkanImage(*context_, exportedImage.exportedMemoryHandle_, VkExtent3D{.width = kWidth, .height = kHeight, .depth = 1}, VK_IMAGE_TYPE_2D, kFormat, 1, /* mipLevels */ 1, /* arrayLayers */ VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, /* createFlags */ VK_SAMPLE_COUNT_1_BIT, "Image: vulkan import memory"); EXPECT_TRUE(importedImage.isImported_); EXPECT_NE(importedImage.getVkImage(), static_cast(VK_NULL_HANDLE)); } #endif // IGL_PLATFORM_WINDOWS } // namespace igl::tests #endif // IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_LINUX ================================================ FILE: src/igl/tests/vulkan/VulkanImageViewTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_LINUX namespace igl::tests { namespace { constexpr uint32_t kWidth = 64; constexpr uint32_t kHeight = 64; constexpr VkFormat kFormat = VK_FORMAT_R8G8B8A8_UNORM; } // namespace class VulkanImageViewTest : public ::testing::Test { public: void SetUp() override { igl::setDebugBreakEnabled(false); device_ = igl::tests::util::device::createTestDevice(igl::BackendType::Vulkan); ASSERT_TRUE(device_ != nullptr); auto& device = static_cast(*device_); context_ = &device.getVulkanContext(); ASSERT_TRUE(context_ != nullptr); } protected: std::shared_ptr device_; vulkan::VulkanContext* context_ = nullptr; }; TEST_F(VulkanImageViewTest, ImageViewCreateInfoDefaultValues) { vulkan::VulkanImageViewCreateInfo ci; EXPECT_EQ(ci.image, VK_NULL_HANDLE); EXPECT_EQ(ci.viewType, VK_IMAGE_VIEW_TYPE_2D); EXPECT_EQ(ci.format, VK_FORMAT_UNDEFINED); EXPECT_EQ(ci.components.r, VK_COMPONENT_SWIZZLE_IDENTITY); EXPECT_EQ(ci.components.g, VK_COMPONENT_SWIZZLE_IDENTITY); EXPECT_EQ(ci.components.b, VK_COMPONENT_SWIZZLE_IDENTITY); EXPECT_EQ(ci.components.a, VK_COMPONENT_SWIZZLE_IDENTITY); EXPECT_EQ(ci.subresourceRange.aspectMask, VK_IMAGE_ASPECT_COLOR_BIT); EXPECT_EQ(ci.subresourceRange.baseMipLevel, 0u); EXPECT_EQ(ci.subresourceRange.levelCount, 1u); EXPECT_EQ(ci.subresourceRange.baseArrayLayer, 0u); EXPECT_EQ(ci.subresourceRange.layerCount, 1u); } TEST_F(VulkanImageViewTest, CreateImageViewWithCreateInfo) { vulkan::VulkanImage image(*context_, VkExtent3D{.width = kWidth, .height = kHeight, .depth = 1}, VK_IMAGE_TYPE_2D, kFormat, 1, /* mipLevels */ 1, /* arrayLayers */ VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_SAMPLED_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, /* memFlags */ 0, /* createFlags */ VK_SAMPLE_COUNT_1_BIT, "Test Image"); ASSERT_TRUE(image.valid()); vulkan::VulkanImageViewCreateInfo ci; ci.image = image.getVkImage(); ci.viewType = VK_IMAGE_VIEW_TYPE_2D; ci.format = kFormat; ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; ci.subresourceRange.baseMipLevel = 0; ci.subresourceRange.levelCount = 1; ci.subresourceRange.baseArrayLayer = 0; ci.subresourceRange.layerCount = 1; vulkan::VulkanImageView imageView(*context_, ci, "Test ImageView"); EXPECT_TRUE(imageView.valid()); EXPECT_NE(imageView.getVkImageView(), VK_NULL_HANDLE); EXPECT_EQ(imageView.getVkImageAspectFlags(), VK_IMAGE_ASPECT_COLOR_BIT); } TEST_F(VulkanImageViewTest, CreateImageViewWithVkCreateInfo) { vulkan::VulkanImage image(*context_, VkExtent3D{.width = kWidth, .height = kHeight, .depth = 1}, VK_IMAGE_TYPE_2D, kFormat, 1, /* mipLevels */ 1, /* arrayLayers */ VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_SAMPLED_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, /* memFlags */ 0, /* createFlags */ VK_SAMPLE_COUNT_1_BIT, "Test Image"); ASSERT_TRUE(image.valid()); VkImageViewCreateInfo ci = { .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, .pNext = nullptr, .flags = 0, .image = image.getVkImage(), .viewType = VK_IMAGE_VIEW_TYPE_2D, .format = kFormat, .components = { .r = VK_COMPONENT_SWIZZLE_IDENTITY, .g = VK_COMPONENT_SWIZZLE_IDENTITY, .b = VK_COMPONENT_SWIZZLE_IDENTITY, .a = VK_COMPONENT_SWIZZLE_IDENTITY, }, .subresourceRange = { .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, .baseMipLevel = 0, .levelCount = 1, .baseArrayLayer = 0, .layerCount = 1, }, }; vulkan::VulkanImageView imageView(*context_, ci, "Test ImageView"); EXPECT_TRUE(imageView.valid()); EXPECT_NE(imageView.getVkImageView(), VK_NULL_HANDLE); EXPECT_EQ(imageView.getVkImageAspectFlags(), VK_IMAGE_ASPECT_COLOR_BIT); } } // namespace igl::tests #endif // IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_LINUX ================================================ FILE: src/igl/tests/vulkan/VulkanImmediateCommandsTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../util/TestDevice.h" #include #include #include #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX namespace igl::tests { class VulkanImmediateCommandsTest : public ::testing::Test { public: VulkanImmediateCommandsTest() = default; ~VulkanImmediateCommandsTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); iglDev_ = util::createTestDevice(); ASSERT_NE(iglDev_, nullptr); ASSERT_EQ(iglDev_->getBackendType(), BackendType::Vulkan) << "Test requires Vulkan backend"; } void TearDown() override {} protected: std::shared_ptr iglDev_; igl::vulkan::VulkanContext& getVulkanContext() { auto& device = static_cast(*iglDev_); return device.getVulkanContext(); } }; TEST_F(VulkanImmediateCommandsTest, AcquireCommandBuffer) { auto& ctx = getVulkanContext(); ASSERT_NE(ctx.immediate_, nullptr); const auto& wrapper = ctx.immediate_->acquire(); EXPECT_TRUE(wrapper.cmdBuf != VK_NULL_HANDLE); EXPECT_TRUE(wrapper.isEncoding); ctx.immediate_->submit(wrapper); } TEST_F(VulkanImmediateCommandsTest, SubmitAndWait) { auto& ctx = getVulkanContext(); ASSERT_NE(ctx.immediate_, nullptr); const auto& wrapper = ctx.immediate_->acquire(); ASSERT_TRUE(wrapper.cmdBuf != VK_NULL_HANDLE); auto handle = ctx.immediate_->submit(wrapper); EXPECT_FALSE(handle.empty()); VkResult result = ctx.immediate_->wait(handle); EXPECT_EQ(result, VK_SUCCESS); EXPECT_TRUE(ctx.immediate_->isReady(handle)); } TEST_F(VulkanImmediateCommandsTest, MultipleSubmitsGetUniqueHandles) { auto& ctx = getVulkanContext(); ASSERT_NE(ctx.immediate_, nullptr); std::set submitIds; for (int i = 0; i < 3; ++i) { const auto& wrapper = ctx.immediate_->acquire(); auto handle = ctx.immediate_->submit(wrapper); EXPECT_FALSE(handle.empty()); submitIds.insert(handle.submitId); } EXPECT_EQ(submitIds.size(), 3u); } TEST_F(VulkanImmediateCommandsTest, CommandBufferRecycling) { auto& ctx = getVulkanContext(); ASSERT_NE(ctx.immediate_, nullptr); std::vector handles; for (int i = 0; i < 4; ++i) { const auto& wrapper = ctx.immediate_->acquire(); auto handle = ctx.immediate_->submit(wrapper); handles.push_back(handle); } for (auto& h : handles) { ctx.immediate_->wait(h); } const auto& wrapper = ctx.immediate_->acquire(); EXPECT_TRUE(wrapper.cmdBuf != VK_NULL_HANDLE); EXPECT_TRUE(wrapper.isEncoding); ctx.immediate_->submit(wrapper); } TEST_F(VulkanImmediateCommandsTest, GetLastSubmitHandle) { auto& ctx = getVulkanContext(); ASSERT_NE(ctx.immediate_, nullptr); const auto& wrapper1 = ctx.immediate_->acquire(); ctx.immediate_->submit(wrapper1); const auto& wrapper2 = ctx.immediate_->acquire(); auto handle2 = ctx.immediate_->submit(wrapper2); auto lastHandle = ctx.immediate_->getLastSubmitHandle(); EXPECT_EQ(lastHandle.submitId, handle2.submitId); EXPECT_EQ(lastHandle.bufferIndex, handle2.bufferIndex); } TEST_F(VulkanImmediateCommandsTest, IsReadyOnEmptyHandle) { auto& ctx = getVulkanContext(); ASSERT_NE(ctx.immediate_, nullptr); igl::vulkan::VulkanImmediateCommands::SubmitHandle emptyHandle; EXPECT_TRUE(emptyHandle.empty()); EXPECT_TRUE(ctx.immediate_->isReady(emptyHandle)); } TEST_F(VulkanImmediateCommandsTest, WaitAllCommandBuffers) { auto& ctx = getVulkanContext(); ASSERT_NE(ctx.immediate_, nullptr); std::vector handles; for (int i = 0; i < 4; ++i) { const auto& wrapper = ctx.immediate_->acquire(); auto handle = ctx.immediate_->submit(wrapper); handles.push_back(handle); } ctx.immediate_->waitAll(); for (auto& h : handles) { EXPECT_TRUE(ctx.immediate_->isReady(h)); } } TEST_F(VulkanImmediateCommandsTest, GetNextSubmitHandle) { auto& ctx = getVulkanContext(); ASSERT_NE(ctx.immediate_, nullptr); // Submit one buffer first so getNextSubmitHandle has a valid state const auto& wrapper = ctx.immediate_->acquire(); ctx.immediate_->submit(wrapper); auto nextHandle = ctx.immediate_->getNextSubmitHandle(); EXPECT_GT(nextHandle.submitId, 0u); } TEST_F(VulkanImmediateCommandsTest, SubmitHandleComparison) { igl::vulkan::VulkanImmediateCommands::SubmitHandle h1; h1.bufferIndex = 0; h1.submitId = 1; igl::vulkan::VulkanImmediateCommands::SubmitHandle h2; h2.bufferIndex = 0; h2.submitId = 1; EXPECT_EQ(h1, h2); h2.submitId = 2; EXPECT_NE(h1, h2); } TEST_F(VulkanImmediateCommandsTest, SubmitHandleRoundTrip) { igl::vulkan::VulkanImmediateCommands::SubmitHandle original; original.bufferIndex = 5; original.submitId = 42; uint64_t packed = original.handle(); igl::vulkan::VulkanImmediateCommands::SubmitHandle restored(packed); EXPECT_EQ(restored.bufferIndex, original.bufferIndex); EXPECT_EQ(restored.submitId, original.submitId); } } // namespace igl::tests #endif // IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX ================================================ FILE: src/igl/tests/vulkan/VulkanPipelineBuilderTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../util/TestDevice.h" #include #include #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX namespace igl::tests { class VulkanPipelineBuilderTest : public ::testing::Test { public: VulkanPipelineBuilderTest() = default; ~VulkanPipelineBuilderTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); iglDev_ = util::createTestDevice(); ASSERT_NE(iglDev_, nullptr); ASSERT_EQ(iglDev_->getBackendType(), BackendType::Vulkan) << "Test requires Vulkan backend"; } void TearDown() override {} protected: std::shared_ptr iglDev_; igl::vulkan::VulkanContext& getVulkanContext() { auto& device = static_cast(*iglDev_); return device.getVulkanContext(); } }; TEST_F(VulkanPipelineBuilderTest, DepthBiasEnable) { igl::vulkan::VulkanPipelineBuilder builder; auto& result = builder.depthBiasEnable(true); EXPECT_EQ(&result, &builder); } TEST_F(VulkanPipelineBuilderTest, StencilStateOps) { igl::vulkan::VulkanPipelineBuilder builder; auto& result = builder.stencilStateOps(VK_STENCIL_FACE_FRONT_BIT, VK_STENCIL_OP_KEEP, VK_STENCIL_OP_REPLACE, VK_STENCIL_OP_INCREMENT_AND_CLAMP, VK_COMPARE_OP_ALWAYS); EXPECT_EQ(&result, &builder); } TEST_F(VulkanPipelineBuilderTest, CullModeVariants) { igl::vulkan::VulkanPipelineBuilder builder1; auto& r1 = builder1.cullMode(VK_CULL_MODE_NONE); EXPECT_EQ(&r1, &builder1); igl::vulkan::VulkanPipelineBuilder builder2; auto& r2 = builder2.cullMode(VK_CULL_MODE_FRONT_BIT); EXPECT_EQ(&r2, &builder2); igl::vulkan::VulkanPipelineBuilder builder3; auto& r3 = builder3.cullMode(VK_CULL_MODE_BACK_BIT); EXPECT_EQ(&r3, &builder3); igl::vulkan::VulkanPipelineBuilder builder4; auto& r4 = builder4.cullMode(VK_CULL_MODE_FRONT_AND_BACK); EXPECT_EQ(&r4, &builder4); } TEST_F(VulkanPipelineBuilderTest, PolygonModeLine) { igl::vulkan::VulkanPipelineBuilder builder; auto& result = builder.polygonMode(VK_POLYGON_MODE_LINE); EXPECT_EQ(&result, &builder); } TEST_F(VulkanPipelineBuilderTest, MultipleColorBlendAttachments) { igl::vulkan::VulkanPipelineBuilder builder; std::vector blendStates(3); for (auto& state : blendStates) { state = {}; state.blendEnable = VK_TRUE; state.srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA; state.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; state.colorBlendOp = VK_BLEND_OP_ADD; state.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE; state.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO; state.alphaBlendOp = VK_BLEND_OP_ADD; state.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; } auto& result = builder.colorBlendAttachmentStates(blendStates); EXPECT_EQ(&result, &builder); } TEST_F(VulkanPipelineBuilderTest, PrimitiveTopologyVariants) { igl::vulkan::VulkanPipelineBuilder builder; auto& result = builder.primitiveTopology(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP); EXPECT_EQ(&result, &builder); } TEST_F(VulkanPipelineBuilderTest, DynamicStates) { igl::vulkan::VulkanPipelineBuilder builder; std::vector states = { VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_DEPTH_BIAS}; auto& result = builder.dynamicStates(states); EXPECT_EQ(&result, &builder); } TEST_F(VulkanPipelineBuilderTest, DepthCompareOp) { igl::vulkan::VulkanPipelineBuilder builder; auto& result = builder.depthCompareOp(VK_COMPARE_OP_LESS_OR_EQUAL, true); EXPECT_EQ(&result, &builder); } TEST_F(VulkanPipelineBuilderTest, ComputePipelineBasic) { igl::vulkan::VulkanComputePipelineBuilder builder{}; (void)builder; // Verify construction succeeds EXPECT_GE(igl::vulkan::VulkanComputePipelineBuilder::getNumPipelinesCreated(), 0u); } } // namespace igl::tests #endif // IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX ================================================ FILE: src/igl/tests/vulkan/VulkanQueuePool.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace igl::vulkan { IGL_MAYBE_UNUSED static std::ostream& operator<<(std::ostream& os, const VulkanQueueDescriptor& queue) { return os << "VulkanQueueDescriptor" << "\n\tQueue Index : " << queue.queueIndex << "\n\tQueue Family Index : " << queue.familyIndex; } } // namespace igl::vulkan namespace igl::tests { using namespace vulkan; TEST(VulkanQueuePoolTest, ReturnDedicatedComputeQueueWhenComputeQueueIsRequested) { // Given a dedicated compute queue const VulkanQueueDescriptor computeQueueDescriptor{ .queueFlags = VK_QUEUE_COMPUTE_BIT, .queueIndex = 0, .familyIndex = 1}; const VulkanQueuePool queuePool({computeQueueDescriptor}); // When compute queue is requested auto queueDescriptor = queuePool.findQueueDescriptor(VK_QUEUE_COMPUTE_BIT); // Then return compute queue ASSERT_TRUE(queueDescriptor.isValid()); EXPECT_EQ(queueDescriptor, computeQueueDescriptor); } TEST(VulkanQueuePoolTest, ReturnDedicatedTransferQueueWhenTransferQueueIsRequested) { // Given a dedicated transfer queue const VulkanQueueDescriptor transferQueueDescriptor{ .queueFlags = VK_QUEUE_TRANSFER_BIT, .queueIndex = 0, .familyIndex = 1}; const VulkanQueuePool queuePool({transferQueueDescriptor}); // When transfer queue is requested auto queueDescriptor = queuePool.findQueueDescriptor(VK_QUEUE_TRANSFER_BIT); // Then return transfer queue ASSERT_TRUE(queueDescriptor.isValid()); EXPECT_EQ(queueDescriptor, transferQueueDescriptor); } TEST(VulkanQueuePoolTest, ReturnAllInOneQueueWhenComputeQueueIsRequested) { // Given an all in one queue const VulkanQueueDescriptor allInOneQueueDescriptor{ .queueFlags = VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_TRANSFER_BIT, .queueIndex = 0, .familyIndex = 1}; const VulkanQueuePool queuePool({allInOneQueueDescriptor}); // When compute queue is requested auto queueDescriptor = queuePool.findQueueDescriptor(VK_QUEUE_COMPUTE_BIT); // Then return all in one queue ASSERT_TRUE(queueDescriptor.isValid()); EXPECT_EQ(queueDescriptor, allInOneQueueDescriptor); } TEST(VulkanQueuePoolTest, ReturnAllInOneQueueWhenTransferQueueIsRequested) { // Given an all in one queue const VulkanQueueDescriptor allInOneQueueDescriptor{ .queueFlags = VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_TRANSFER_BIT, .queueIndex = 0, .familyIndex = 1}; const VulkanQueuePool queuePool({allInOneQueueDescriptor}); // When transfer queue is requested auto queueDescriptor = queuePool.findQueueDescriptor(VK_QUEUE_TRANSFER_BIT); // Then return all in one queue ASSERT_TRUE(queueDescriptor.isValid()); EXPECT_EQ(queueDescriptor, allInOneQueueDescriptor); } TEST(VulkanQueuePoolTest, PreferDedicatedComputeQueueOverAllInOneQueue) { // Given a dedicated compute queue and an all in one queue const VulkanQueueDescriptor computeQueueDescriptor{ .queueFlags = VK_QUEUE_COMPUTE_BIT, .queueIndex = 0, .familyIndex = 1}; const VulkanQueueDescriptor allInOneQueueDescriptor{ .queueFlags = VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_TRANSFER_BIT, .queueIndex = 0, .familyIndex = 2}; const VulkanQueuePool queuePool({allInOneQueueDescriptor, computeQueueDescriptor}); // When compute queue is requested auto queueDescriptor = queuePool.findQueueDescriptor(VK_QUEUE_COMPUTE_BIT); // Then return dedicated compute queue ASSERT_TRUE(queueDescriptor.isValid()); EXPECT_EQ(queueDescriptor, computeQueueDescriptor); } TEST(VulkanQueuePoolTest, PreferDedicatedTransferQueueOverAllInOneQueue) { // Given a dedicated transfer queue and an all in one queue const VulkanQueueDescriptor transferQueueDescriptor{ .queueFlags = VK_QUEUE_TRANSFER_BIT, .queueIndex = 0, .familyIndex = 1}; const VulkanQueueDescriptor allInOneQueueDescriptor{ .queueFlags = VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_TRANSFER_BIT, .queueIndex = 0, .familyIndex = 2}; const VulkanQueuePool queuePool({allInOneQueueDescriptor, transferQueueDescriptor}); // When transfer queue is requested auto queueDescriptor = queuePool.findQueueDescriptor(VK_QUEUE_TRANSFER_BIT); // Then return dedicated transfer queue ASSERT_TRUE(queueDescriptor.isValid()); EXPECT_EQ(queueDescriptor, transferQueueDescriptor); } TEST(VulkanQueuePoolTest, IfUnreservedUseSameQueueForQueueRequests) { // Given 2 all in one queues const VulkanQueueDescriptor allInOneQueueDescriptor1{ .queueFlags = VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_TRANSFER_BIT, .queueIndex = 0, .familyIndex = 1}; const VulkanQueueDescriptor allInOneQueueDescriptor2{ .queueFlags = VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_TRANSFER_BIT, .queueIndex = 0, .familyIndex = 2}; const VulkanQueuePool queuePool({allInOneQueueDescriptor1, allInOneQueueDescriptor2}); // When graphics queue and compute queue are requested auto graphicsQueueDescriptor = queuePool.findQueueDescriptor(VK_QUEUE_GRAPHICS_BIT); auto computeQueueDescriptor = queuePool.findQueueDescriptor(VK_QUEUE_COMPUTE_BIT); // Then return same all in one queue ASSERT_TRUE(graphicsQueueDescriptor.isValid()); ASSERT_TRUE(computeQueueDescriptor.isValid()); EXPECT_EQ(graphicsQueueDescriptor, allInOneQueueDescriptor1); EXPECT_EQ(computeQueueDescriptor, allInOneQueueDescriptor1); } TEST(VulkanQueuePoolTest, DoNotUseReservedQueuesForFurtherQueueRequests) { // Given a 2 all in one queues const VulkanQueueDescriptor allInOneQueueDescriptor1{ .queueFlags = VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_TRANSFER_BIT, .queueIndex = 0, .familyIndex = 1}; const VulkanQueueDescriptor allInOneQueueDescriptor2{ .queueFlags = VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_TRANSFER_BIT, .queueIndex = 0, .familyIndex = 2}; VulkanQueuePool queuePool({allInOneQueueDescriptor1, allInOneQueueDescriptor2}); // When the first queue is reserved auto graphicsQueueDescriptor = queuePool.findQueueDescriptor(VK_QUEUE_GRAPHICS_BIT); ASSERT_TRUE(graphicsQueueDescriptor.isValid()); EXPECT_EQ(graphicsQueueDescriptor, allInOneQueueDescriptor1); queuePool.reserveQueue(graphicsQueueDescriptor); auto computeQueueDescriptor = queuePool.findQueueDescriptor(VK_QUEUE_COMPUTE_BIT); // Then return an unreserved queue for further requests ASSERT_TRUE(computeQueueDescriptor.isValid()); EXPECT_EQ(computeQueueDescriptor, allInOneQueueDescriptor2); } TEST(VulkanQueuePoolTest, DoNotReturnQueueCreationInfosIfNothingIsReserved) { // Given a queue const VulkanQueueDescriptor graphicsDescriptor{ .queueFlags = VK_QUEUE_GRAPHICS_BIT, .queueIndex = 0, .familyIndex = 1}; const VulkanQueuePool queuePool({graphicsDescriptor}); // When a queue is requested but not reserved auto queueDescriptor = queuePool.findQueueDescriptor(VK_QUEUE_GRAPHICS_BIT); ASSERT_TRUE(queueDescriptor.isValid()); // Then do not return any creation infos auto qcis = queuePool.getQueueCreationInfos(); ASSERT_TRUE(qcis.empty()); } TEST(VulkanQueuePoolTest, ReturnQueueCreationInfoIfAnyQueueIsReserved) { // Given a queue const VulkanQueueDescriptor graphicsQueueDescriptor{ .queueFlags = VK_QUEUE_GRAPHICS_BIT, .queueIndex = 0, .familyIndex = 1}; VulkanQueuePool queuePool({graphicsQueueDescriptor}); // When a queue is requested and reserved auto queueDescriptor = queuePool.findQueueDescriptor(VK_QUEUE_GRAPHICS_BIT); ASSERT_TRUE(queueDescriptor.isValid()); queuePool.reserveQueue(queueDescriptor); // Then return reserved queue creation info auto qcis = queuePool.getQueueCreationInfos(); ASSERT_EQ(qcis.size(), 1); EXPECT_EQ(qcis[0].sType, VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO); EXPECT_EQ(qcis[0].queueFamilyIndex, graphicsQueueDescriptor.familyIndex); EXPECT_EQ(qcis[0].queueCount, 1); EXPECT_EQ(*qcis[0].pQueuePriorities, 1.0); } TEST(VulkanQueuePoolTest, ReturnSingleQueueCreationInfoForSameQueueFamily) { // Given 2 queues from same family const VulkanQueueDescriptor graphicsQueueDescriptor1{ .queueFlags = VK_QUEUE_GRAPHICS_BIT, .queueIndex = 0, .familyIndex = 1}; const VulkanQueueDescriptor graphicsQueueDescriptor2{ .queueFlags = VK_QUEUE_GRAPHICS_BIT, .queueIndex = 1, .familyIndex = 1}; VulkanQueuePool queuePool({graphicsQueueDescriptor1, graphicsQueueDescriptor2}); // When 2 queues are requested and reserved auto queueDescriptor1 = queuePool.findQueueDescriptor(VK_QUEUE_GRAPHICS_BIT); ASSERT_TRUE(queueDescriptor1.isValid()); queuePool.reserveQueue(queueDescriptor1); auto queueDescriptor2 = queuePool.findQueueDescriptor(VK_QUEUE_GRAPHICS_BIT); ASSERT_TRUE(queueDescriptor2.isValid()); queuePool.reserveQueue(queueDescriptor2); // Then return a single queue creation info with queue count 2 auto qcis = queuePool.getQueueCreationInfos(); ASSERT_EQ(qcis.size(), 1); EXPECT_EQ(qcis[0].queueFamilyIndex, graphicsQueueDescriptor1.familyIndex); EXPECT_EQ(qcis[0].queueCount, 2); } TEST(VulkanQueuePoolTest, ReturnMultipleQueueCreationInfosForDifferentQueueFamilies) { // Given 2 queues from different families const VulkanQueueDescriptor graphicsQueueDescriptor1{ .queueFlags = VK_QUEUE_GRAPHICS_BIT, .queueIndex = 0, .familyIndex = 1}; const VulkanQueueDescriptor graphicsQueueDescriptor2{ .queueFlags = VK_QUEUE_GRAPHICS_BIT, .queueIndex = 0, .familyIndex = 2}; VulkanQueuePool queuePool({graphicsQueueDescriptor1, graphicsQueueDescriptor2}); // When 2 queues are requested and reserved auto queueDescriptor1 = queuePool.findQueueDescriptor(VK_QUEUE_GRAPHICS_BIT); ASSERT_TRUE(queueDescriptor1.isValid()); queuePool.reserveQueue(queueDescriptor1); auto queueDescriptor2 = queuePool.findQueueDescriptor(VK_QUEUE_GRAPHICS_BIT); ASSERT_TRUE(queueDescriptor2.isValid()); queuePool.reserveQueue(queueDescriptor2); // Then return 2 queue creation infos with queue count 1 auto qcis = queuePool.getQueueCreationInfos(); ASSERT_EQ(qcis.size(), 2); EXPECT_EQ(qcis[0].queueFamilyIndex, queueDescriptor1.familyIndex); EXPECT_EQ(qcis[0].queueCount, 1); EXPECT_EQ(qcis[1].queueFamilyIndex, queueDescriptor2.familyIndex); EXPECT_EQ(qcis[1].queueCount, 1); } } // namespace igl::tests ================================================ FILE: src/igl/tests/vulkan/VulkanRenderPassBuilderTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../util/TestDevice.h" #include #include #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX namespace igl::tests { class VulkanRenderPassBuilderTest : public ::testing::Test { public: VulkanRenderPassBuilderTest() = default; ~VulkanRenderPassBuilderTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); iglDev_ = util::createTestDevice(); ASSERT_NE(iglDev_, nullptr); ASSERT_EQ(iglDev_->getBackendType(), BackendType::Vulkan) << "Test requires Vulkan backend"; } void TearDown() override {} protected: std::shared_ptr iglDev_; igl::vulkan::VulkanContext& getVulkanContext() { auto& device = static_cast(*iglDev_); return device.getVulkanContext(); } }; TEST_F(VulkanRenderPassBuilderTest, SingleColorAttachment) { auto& ctx = getVulkanContext(); igl::vulkan::VulkanRenderPassBuilder builder; builder.addColor( VK_FORMAT_R8G8B8A8_UNORM, VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_STORE_OP_STORE); auto rp = ctx.findRenderPass(builder); EXPECT_NE(rp.pass, VK_NULL_HANDLE); } TEST_F(VulkanRenderPassBuilderTest, ColorWithDepthStencil) { auto& ctx = getVulkanContext(); igl::vulkan::VulkanRenderPassBuilder builder; builder.addColor( VK_FORMAT_R8G8B8A8_UNORM, VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_STORE_OP_STORE); builder.addDepthStencil( VK_FORMAT_D24_UNORM_S8_UINT, VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_STORE_OP_STORE); auto rp = ctx.findRenderPass(builder); EXPECT_NE(rp.pass, VK_NULL_HANDLE); } TEST_F(VulkanRenderPassBuilderTest, MultipleColorAttachments) { auto& ctx = getVulkanContext(); igl::vulkan::VulkanRenderPassBuilder builder; builder.addColor( VK_FORMAT_R8G8B8A8_UNORM, VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_STORE_OP_STORE); builder.addColor( VK_FORMAT_R8G8B8A8_UNORM, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE); auto rp = ctx.findRenderPass(builder); EXPECT_NE(rp.pass, VK_NULL_HANDLE); } TEST_F(VulkanRenderPassBuilderTest, WithResolveAttachment) { auto& ctx = getVulkanContext(); igl::vulkan::VulkanRenderPassBuilder builder; builder.addColor(VK_FORMAT_R8G8B8A8_UNORM, VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_SAMPLE_COUNT_4_BIT); builder.addColorResolve( VK_FORMAT_R8G8B8A8_UNORM, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE); auto rp = ctx.findRenderPass(builder); EXPECT_NE(rp.pass, VK_NULL_HANDLE); } TEST_F(VulkanRenderPassBuilderTest, MultiviewRenderPass) { auto& ctx = getVulkanContext(); igl::vulkan::VulkanRenderPassBuilder builder; builder.addColor( VK_FORMAT_R8G8B8A8_UNORM, VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_STORE_OP_STORE); builder.setMultiviewMasks(0x3, 0x3); auto rp = ctx.findRenderPass(builder); EXPECT_NE(rp.pass, VK_NULL_HANDLE); } TEST_F(VulkanRenderPassBuilderTest, HashEquality) { igl::vulkan::VulkanRenderPassBuilder builder1; builder1.addColor( VK_FORMAT_R8G8B8A8_UNORM, VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_STORE_OP_STORE); igl::vulkan::VulkanRenderPassBuilder builder2; builder2.addColor( VK_FORMAT_R8G8B8A8_UNORM, VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_STORE_OP_STORE); igl::vulkan::VulkanRenderPassBuilder::HashFunction hasher; EXPECT_EQ(hasher(builder1), hasher(builder2)); } TEST_F(VulkanRenderPassBuilderTest, HashInequality) { igl::vulkan::VulkanRenderPassBuilder builder1; builder1.addColor( VK_FORMAT_R8G8B8A8_UNORM, VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_STORE_OP_STORE); igl::vulkan::VulkanRenderPassBuilder builder2; builder2.addColor( VK_FORMAT_B8G8R8A8_UNORM, VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_STORE_OP_STORE); igl::vulkan::VulkanRenderPassBuilder::HashFunction hasher; EXPECT_NE(hasher(builder1), hasher(builder2)); } TEST_F(VulkanRenderPassBuilderTest, EqualityOperator) { igl::vulkan::VulkanRenderPassBuilder builder1; builder1.addColor( VK_FORMAT_R8G8B8A8_UNORM, VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_STORE_OP_STORE); igl::vulkan::VulkanRenderPassBuilder builder2; builder2.addColor( VK_FORMAT_R8G8B8A8_UNORM, VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_STORE_OP_STORE); EXPECT_TRUE(builder1 == builder2); igl::vulkan::VulkanRenderPassBuilder builder3; builder3.addColor( VK_FORMAT_R8G8B8A8_UNORM, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE); EXPECT_FALSE(builder1 == builder3); } } // namespace igl::tests #endif // IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX ================================================ FILE: src/igl/tests/vulkan/VulkanSemaphoreExtendedTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include "../util/TestDevice.h" #include #include #include #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX namespace igl::tests { class VulkanSemaphoreExtendedTest : public ::testing::Test { public: VulkanSemaphoreExtendedTest() = default; ~VulkanSemaphoreExtendedTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); iglDev_ = util::createTestDevice(); ASSERT_NE(iglDev_, nullptr); ASSERT_EQ(iglDev_->getBackendType(), BackendType::Vulkan) << "Test requires Vulkan backend"; } void TearDown() override {} protected: std::shared_ptr iglDev_; igl::vulkan::VulkanContext& getVulkanContext() { auto& device = static_cast(*iglDev_); return device.getVulkanContext(); } }; TEST_F(VulkanSemaphoreExtendedTest, BinaryCreation) { auto& ctx = getVulkanContext(); auto semaphore = std::make_unique( ctx.vf_, ctx.getVkDevice(), false, "testBinarySemaphore"); ASSERT_NE(semaphore, nullptr); EXPECT_NE(semaphore->getVkSemaphore(), VK_NULL_HANDLE); EXPECT_FALSE(semaphore->exportable_); EXPECT_EQ(semaphore->getFileDescriptor(), -1); } TEST_F(VulkanSemaphoreExtendedTest, TimelineCreation) { auto& ctx = getVulkanContext(); auto semaphore = std::make_unique( ctx.vf_, ctx.getVkDevice(), 0, false, "testTimelineSemaphore"); ASSERT_NE(semaphore, nullptr); EXPECT_NE(semaphore->getVkSemaphore(), VK_NULL_HANDLE); EXPECT_FALSE(semaphore->exportable_); EXPECT_EQ(semaphore->getFileDescriptor(), -1); } TEST_F(VulkanSemaphoreExtendedTest, ExportableSemaphore) { #if IGL_PLATFORM_LINUX || IGL_PLATFORM_ANDROID auto& ctx = getVulkanContext(); auto semaphore = std::make_unique( ctx.vf_, ctx.getVkDevice(), true, "testExportableSemaphore"); ASSERT_NE(semaphore, nullptr); EXPECT_NE(semaphore->getVkSemaphore(), VK_NULL_HANDLE); EXPECT_TRUE(semaphore->exportable_); #else GTEST_SKIP() << "Exportable semaphores may not be supported on this platform."; #endif } TEST_F(VulkanSemaphoreExtendedTest, MoveConstruction) { auto& ctx = getVulkanContext(); igl::vulkan::VulkanSemaphore original(ctx.vf_, ctx.getVkDevice(), false, "testMoveCtor"); VkSemaphore originalHandle = original.getVkSemaphore(); ASSERT_NE(originalHandle, VK_NULL_HANDLE); igl::vulkan::VulkanSemaphore moved(std::move(original)); EXPECT_EQ(moved.getVkSemaphore(), originalHandle); // After move, original is in a valid but unspecified state - don't access it } TEST_F(VulkanSemaphoreExtendedTest, MoveAssignment) { auto& ctx = getVulkanContext(); igl::vulkan::VulkanSemaphore original(ctx.vf_, ctx.getVkDevice(), false, "testMoveAssign1"); igl::vulkan::VulkanSemaphore target(ctx.vf_, ctx.getVkDevice(), false, "testMoveAssign2"); VkSemaphore originalHandle = original.getVkSemaphore(); ASSERT_NE(originalHandle, VK_NULL_HANDLE); target = std::move(original); EXPECT_EQ(target.getVkSemaphore(), originalHandle); // After move, original is in a valid but unspecified state - don't access it } TEST_F(VulkanSemaphoreExtendedTest, TimelineWithInitialValue) { auto& ctx = getVulkanContext(); auto semaphore = std::make_unique( ctx.vf_, ctx.getVkDevice(), 42, false, "testTimelineInitial"); ASSERT_NE(semaphore, nullptr); EXPECT_NE(semaphore->getVkSemaphore(), VK_NULL_HANDLE); } } // namespace igl::tests #endif // IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX ================================================ FILE: src/igl/tests/vulkan/VulkanStagingDeviceTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "../util/TestDevice.h" #include #include #include #include #include #include #include #include #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX namespace igl::tests { class VulkanStagingDeviceTest : public ::testing::Test { public: VulkanStagingDeviceTest() = default; ~VulkanStagingDeviceTest() override = default; void SetUp() override { igl::setDebugBreakEnabled(false); iglDev_ = util::createTestDevice(); ASSERT_NE(iglDev_, nullptr); ASSERT_EQ(iglDev_->getBackendType(), BackendType::Vulkan) << "Test requires Vulkan backend"; } void TearDown() override {} protected: std::shared_ptr iglDev_; igl::vulkan::VulkanContext& getVulkanContext() { auto& device = static_cast(*iglDev_); return device.getVulkanContext(); } }; TEST_F(VulkanStagingDeviceTest, BufferSubDataSmallUpload) { auto& ctx = getVulkanContext(); ASSERT_NE(ctx.stagingDevice_, nullptr); Result ret; const BufferDesc bufferDesc{ .type = BufferDesc::BufferTypeBits::Storage, .length = 256, .storage = ResourceStorage::Private, }; auto buffer = iglDev_->createBuffer(bufferDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(buffer, nullptr); std::vector srcData(256); for (size_t i = 0; i < srcData.size(); ++i) { srcData[i] = static_cast(i & 0xFF); } ret = buffer->upload(srcData.data(), BufferRange(256, 0)); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); const auto* downloadedData = static_cast(buffer->map(BufferRange(256, 0), &ret)); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); for (size_t i = 0; i < 256; ++i) { EXPECT_EQ(downloadedData[i], srcData[i]); } buffer->unmap(); } TEST_F(VulkanStagingDeviceTest, BufferSubDataLargerThanStaging) { auto& ctx = getVulkanContext(); ASSERT_NE(ctx.stagingDevice_, nullptr); const VkDeviceSize maxStagingSize = ctx.stagingDevice_->getMaxStagingBufferSize(); size_t maxBufferLength = 0; iglDev_->getFeatureLimits(DeviceFeatureLimits::MaxStorageBufferBytes, maxBufferLength); const VkDeviceSize desiredSize = std::min(maxStagingSize * 2, maxBufferLength); if (desiredSize < maxStagingSize) { GTEST_SKIP() << "Max buffer size is smaller than staging buffer, cannot test chunked upload."; } Result ret; const BufferDesc bufferDesc{ .type = BufferDesc::BufferTypeBits::Storage, .length = static_cast(desiredSize), .storage = ResourceStorage::Private, }; auto buffer = iglDev_->createBuffer(bufferDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(buffer, nullptr); std::vector srcData(desiredSize / 2); for (size_t i = 0; i < srcData.size(); ++i) { srcData[i] = static_cast(i & 0xFFFF); } ret = buffer->upload(srcData.data(), BufferRange(desiredSize, 0)); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); const auto* downloadedData = static_cast(buffer->map(BufferRange(desiredSize, 0), &ret)); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); for (size_t i = 0; i < srcData.size(); ++i) { ASSERT_EQ(downloadedData[i], srcData[i]) << "Mismatch at index " << i; } buffer->unmap(); } TEST_F(VulkanStagingDeviceTest, ImageDataUpload) { Result ret; TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 4, 4, TextureDesc::TextureUsageBits::Sampled); auto texture = iglDev_->createTexture(texDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(texture, nullptr); const size_t dataSize = 4 * 4 * 4; std::vector pixelData(dataSize); for (size_t i = 0; i < dataSize; ++i) { pixelData[i] = static_cast(i % 256); } ret = texture->upload(texture->getFullRange(0), pixelData.data()); EXPECT_TRUE(ret.isOk()) << ret.message.c_str(); } TEST_F(VulkanStagingDeviceTest, GetImageData2D) { Result ret; TextureDesc texDesc = TextureDesc::new2D(TextureFormat::RGBA_UNorm8, 2, 2, TextureDesc::TextureUsageBits::Sampled | TextureDesc::TextureUsageBits::Attachment); auto texture = iglDev_->createTexture(texDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(texture, nullptr); constexpr uint32_t kColor = 0xAABBCCDD; const std::array srcData = {kColor, kColor, kColor, kColor}; ret = texture->upload(texture->getFullRange(0), srcData.data()); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); CommandQueueDesc queueDesc{}; auto cmdQueue = iglDev_->createCommandQueue(queueDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); auto cmdBuf = cmdQueue->createCommandBuffer(CommandBufferDesc(), &ret); ASSERT_TRUE(ret.isOk()); cmdQueue->submit(*cmdBuf); std::array downloadedData = {}; auto fbDesc = FramebufferDesc(); fbDesc.colorAttachments[0].texture = texture; auto fb = iglDev_->createFramebuffer(fbDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); fb->copyBytesColorAttachment(*cmdQueue, 0, downloadedData.data(), texture->getFullRange(0)); for (size_t i = 0; i < 4; ++i) { EXPECT_EQ(downloadedData[i], kColor); } } TEST_F(VulkanStagingDeviceTest, PartialBufferUpdate) { Result ret; const BufferDesc bufferDesc{ .type = BufferDesc::BufferTypeBits::Storage, .length = 256, .storage = ResourceStorage::Private, }; auto buffer = iglDev_->createBuffer(bufferDesc, &ret); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); ASSERT_NE(buffer, nullptr); std::vector zeros(256, 0); ret = buffer->upload(zeros.data(), BufferRange(256, 0)); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); std::vector partialData(64, 0xAB); const size_t offset = 64; ret = buffer->upload(partialData.data(), BufferRange(64, offset)); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); const auto* downloadedData = static_cast(buffer->map(BufferRange(256, 0), &ret)); ASSERT_TRUE(ret.isOk()) << ret.message.c_str(); for (size_t i = 0; i < offset; ++i) { EXPECT_EQ(downloadedData[i], 0) << "Non-zero before offset at index " << i; } for (size_t i = offset; i < offset + 64; ++i) { EXPECT_EQ(downloadedData[i], 0xAB) << "Mismatch in partial update region at index " << i; } buffer->unmap(); } TEST_F(VulkanStagingDeviceTest, MaxStagingBufferSizePositive) { auto& ctx = getVulkanContext(); ASSERT_NE(ctx.stagingDevice_, nullptr); EXPECT_GT(ctx.stagingDevice_->getMaxStagingBufferSize(), 0u); } } // namespace igl::tests #endif // IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_MACOSX || IGL_PLATFORM_LINUX ================================================ FILE: src/igl/tests/vulkan/VulkanSwapchainExtendedTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_LINUX #include #include #include #include // IWYU pragma: export #include #include // IWYU pragma: keep namespace igl::tests { namespace { [[maybe_unused]] constexpr uint32_t kWidth = 512; [[maybe_unused]] constexpr uint32_t kHeight = 512; } // namespace class VulkanSwapchainExtendedTest : public ::testing::Test { public: void SetUp() override { #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID GTEST_SKIP() << "Headless surface not supported on this platform."; #else igl::setDebugBreakEnabled(false); igl::vulkan::VulkanContextConfig config = util::device::vulkan::getContextConfig(true); config.headless = true; device_ = igl::tests::util::device::vulkan::createTestDevice(config); ASSERT_TRUE(device_ != nullptr); auto& device = static_cast(*device_); context_ = &device.getVulkanContext(); ASSERT_TRUE(context_ != nullptr); #endif } protected: std::shared_ptr device_; vulkan::VulkanContext* context_ = nullptr; }; TEST_F(VulkanSwapchainExtendedTest, SwapchainFormat) { #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID GTEST_SKIP() << "Headless surface not supported on this platform."; #else auto swapchain = std::make_unique(*context_, kWidth, kHeight); ASSERT_NE(swapchain, nullptr); VkFormat format = swapchain->getFormatColor(); EXPECT_NE(format, VK_FORMAT_UNDEFINED); EXPECT_TRUE(format == VK_FORMAT_R8G8B8A8_UNORM || format == VK_FORMAT_B8G8R8A8_UNORM || format == VK_FORMAT_R8G8B8A8_SRGB || format == VK_FORMAT_B8G8R8A8_SRGB || format == VK_FORMAT_A2B10G10R10_UNORM_PACK32 || format == VK_FORMAT_R16G16B16A16_SFLOAT); #endif } TEST_F(VulkanSwapchainExtendedTest, ImageCount) { #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID GTEST_SKIP() << "Headless surface not supported on this platform."; #else auto swapchain = std::make_unique(*context_, kWidth, kHeight); ASSERT_NE(swapchain, nullptr); uint32_t imageCount = swapchain->getNumSwapchainImages(); EXPECT_GT(imageCount, 0u); EXPECT_LE(imageCount, 8u); #endif } TEST_F(VulkanSwapchainExtendedTest, InitialState) { #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID GTEST_SKIP() << "Headless surface not supported on this platform."; #else auto swapchain = std::make_unique(*context_, kWidth, kHeight); ASSERT_NE(swapchain, nullptr); EXPECT_EQ(swapchain->getWidth(), kWidth); EXPECT_EQ(swapchain->getHeight(), kHeight); const VkExtent2D extent = swapchain->getExtent(); EXPECT_EQ(extent.width, kWidth); EXPECT_EQ(extent.height, kHeight); EXPECT_EQ(swapchain->getCurrentImageIndex(), 0u); const uint32_t numImages = swapchain->getNumSwapchainImages(); EXPECT_EQ(swapchain->getFrameNumber(), numImages); EXPECT_EQ(swapchain->acquireSemaphores.size(), numImages); EXPECT_EQ(swapchain->timelineWaitValues.size(), numImages); EXPECT_NE(swapchain->getSemaphore(), VK_NULL_HANDLE); #endif } TEST_F(VulkanSwapchainExtendedTest, CurrentVulkanTexture) { #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID GTEST_SKIP() << "Headless surface not supported on this platform."; #else auto swapchain = std::make_unique(*context_, kWidth, kHeight); ASSERT_NE(swapchain, nullptr); auto texture = swapchain->getCurrentVulkanTexture(); ASSERT_NE(texture, nullptr); EXPECT_EQ(texture->image_.getVkImage(), swapchain->getCurrentVkImage()); EXPECT_EQ(texture->imageView_.getVkImageView(), swapchain->getCurrentVkImageView()); #endif } TEST_F(VulkanSwapchainExtendedTest, DepthBufferLazyAllocation) { #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID GTEST_SKIP() << "Headless surface not supported on this platform."; #else auto swapchain = std::make_unique(*context_, kWidth, kHeight); ASSERT_NE(swapchain, nullptr); auto depthTexture = swapchain->getCurrentDepthTexture(); ASSERT_NE(depthTexture, nullptr); EXPECT_EQ(depthTexture->image_.getVkImage(), swapchain->getDepthVkImage()); EXPECT_EQ(depthTexture->imageView_.getVkImageView(), swapchain->getDepthVkImageView()); auto depthTextureAgain = swapchain->getCurrentDepthTexture(); EXPECT_EQ(depthTexture, depthTextureAgain); #endif } TEST_F(VulkanSwapchainExtendedTest, AcquireNextImage) { #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID GTEST_SKIP() << "Headless surface not supported on this platform."; #else auto swapchain = std::make_unique(*context_, kWidth, kHeight); ASSERT_NE(swapchain, nullptr); igl::Result result = swapchain->acquireNextImage(); EXPECT_TRUE(result.isOk()) << result.message.c_str(); #endif } } // namespace igl::tests #endif // IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_LINUX ================================================ FILE: src/igl/tests/vulkan/VulkanSwapchainTest.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_LINUX #include #include #include #include // IWYU pragma: export #include #include namespace igl::tests { namespace { [[maybe_unused]] constexpr uint32_t kWidth = 1024; [[maybe_unused]] constexpr uint32_t kHeight = 1024; } // namespace // // VulkanSwapchainTest // // Unit tests for igl::vulkan::VulkanSwapchain // class VulkanSwapchainTest : public ::testing::Test { public: // Set up common resources. void SetUp() override { #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID // @fb-only GTEST_SKIP() << "Fix these tests on Windows and Android, no headless surface support there."; #else igl::setDebugBreakEnabled(false); // Add headless config for creating swapchains without a window igl::vulkan::VulkanContextConfig config = util::device::vulkan::getContextConfig(true); config.headless = true; device_ = igl::tests::util::device::vulkan::createTestDevice(config); ASSERT_TRUE(device_ != nullptr); auto& device = static_cast(*device_); context_ = &device.getVulkanContext(); ASSERT_TRUE(context_ != nullptr); #endif } protected: std::shared_ptr device_; vulkan::VulkanContext* context_ = nullptr; }; TEST_F(VulkanSwapchainTest, CreateVulkanSwapchain) { #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID // @fb-only GTEST_SKIP() << "Fix these tests on Windows and Android, no headless surface support there."; #else auto swapchain = std::make_unique(*context_, kWidth, kHeight); ASSERT_NE(swapchain, nullptr); ASSERT_EQ(swapchain->getWidth(), kWidth); ASSERT_EQ(swapchain->getHeight(), kHeight); const VkExtent2D extent = swapchain->getExtent(); ASSERT_EQ(extent.width, kWidth); ASSERT_EQ(extent.height, kHeight); ASSERT_NE(swapchain->getFormatColor(), VK_FORMAT_UNDEFINED); ASSERT_GT(swapchain->getNumSwapchainImages(), 0); ASSERT_EQ(swapchain->getCurrentImageIndex(), 0); #endif } } // namespace igl::tests #endif // IGL_PLATFORM_WINDOWS || IGL_PLATFORM_ANDROID || IGL_PLATFORM_LINUX ================================================ FILE: src/igl/vulkan/Buffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #include #include namespace igl::vulkan { Buffer::Buffer(const igl::vulkan::Device& device) : device_(device) {} Result Buffer::create(const BufferDesc& desc) { desc_ = desc; if (desc_.storage == igl::ResourceStorage::Invalid) { desc_.storage = igl::ResourceStorage::Private; } const VulkanContext& ctx = device_.getVulkanContext(); if (!ctx.useStagingForBuffers_ && (desc_.storage == ResourceStorage::Private)) { desc_.storage = ResourceStorage::Shared; } /* Use staging device to transfer data into the buffer when the storage is private to the device */ VkBufferUsageFlags usageFlags = (desc_.storage == ResourceStorage::Private) ? VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT : 0; const VkBufferUsageFlags optionalBDA = ctx.features().has_VK_KHR_buffer_device_address ? VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_KHR : 0; if (desc_.type == 0) { return Result(Result::Code::InvalidOperation, "Invalid buffer type"); } if (desc_.type & BufferDesc::BufferTypeBits::Index) { usageFlags |= VK_BUFFER_USAGE_INDEX_BUFFER_BIT; } if (desc_.type & BufferDesc::BufferTypeBits::Vertex) { usageFlags |= VK_BUFFER_USAGE_VERTEX_BUFFER_BIT; } if (desc_.type & BufferDesc::BufferTypeBits::Uniform) { usageFlags |= VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | optionalBDA; } if (desc_.type & BufferDesc::BufferTypeBits::Storage) { usageFlags |= VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | optionalBDA; } if (desc_.type & BufferDesc::BufferTypeBits::Indirect) { usageFlags |= VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT | optionalBDA; } const VkMemoryPropertyFlags memFlags = resourceStorageToVkMemoryPropertyFlags(desc_.storage); // Store the flag that determines if this buffer contains sub-allocations (i.e. is a ring-buffer) isRingBuffer_ = ((desc_.hint & BufferDesc::BufferAPIHintBits::Ring) != 0); bufferCount_ = isRingBuffer_ ? device_.getVulkanContext().config_.maxResourceCount : 1u; buffers_ = std::make_unique[]>(bufferCount_); bufferPatches_ = std::make_unique(bufferCount_); // This is used to generate a unique number for unnamed buffers static uint32_t bufferId = 0; Result result; for (size_t bufferIndex = 0; bufferIndex < bufferCount_; ++bufferIndex) { const std::string subBufferName = bufferCount_ > 1 ? " - sub-buffer " + std::to_string(bufferIndex) : ""; const std::string bufferName = !desc_.debugName.empty() ? IGL_FORMAT("Buffer: {}", desc_.debugName + subBufferName) : IGL_FORMAT("Buffer {}{}", bufferId, subBufferName); buffers_[bufferIndex] = ctx.createBuffer(desc_.length, usageFlags, memFlags, &result, bufferName.c_str()); IGL_DEBUG_ASSERT(result.isOk()); } if (desc_.debugName.empty()) { ++bufferId; } // allocate local data for ring-buffer only if Vulkan Buffers are not mapped to the CPU if (isRingBuffer_ && !buffers_[0]->isMapped()) { // Resize the local copy of the data localData_ = std::make_unique(desc_.length); } return result; } const std::unique_ptr& Buffer::currentVulkanBuffer() const { IGL_DEBUG_ASSERT(buffers_, "There are no sub-allocations available for this buffer"); return buffers_[isRingBuffer_ ? device_.getVulkanContext().currentSyncIndex() : 0u]; } BufferRange Buffer::getUpdateRange() const { size_t start = std::numeric_limits::max(); size_t end = 0; for (uint32_t i = 0; i < bufferCount_; ++i) { const auto& bufferPatch = bufferPatches_[i]; // skip this buffer, if update size is zero if (bufferPatch.size == 0) { continue; } end = std::max(end, bufferPatch.offset + bufferPatch.size); start = std::min(start, bufferPatch.offset); } // If there is no new data, return an empty range to indicate that no data is available if (start == std::numeric_limits::max()) { return {}; } return {end - start, start}; } void Buffer::extendUpdateRange(uint32_t ringBufferIndex, const BufferRange& range) { auto& bufferPatch = bufferPatches_[ringBufferIndex]; const size_t start = std::min(bufferPatch.offset, range.offset); const size_t end = std::max(bufferPatch.offset + bufferPatch.size, range.size + range.offset); bufferPatch.offset = start; bufferPatch.size = end - start; } void Buffer::resetUpdateRange(uint32_t ringBufferIndex, const BufferRange& range) { bufferPatches_[ringBufferIndex] = range; } Result Buffer::upload(const void* data, const BufferRange& range) { IGL_PROFILER_FUNCTION(); if (!IGL_DEBUG_VERIFY(data)) { return Result(); } if (!IGL_DEBUG_VERIFY(range.offset + range.size <= desc_.length)) { return Result(Result::Code::ArgumentOutOfRange, "Out of range"); } // To handle an upload to a ring-buffer, we update the local copy first and upload the entire // local data to the device below const VulkanContext& ctx = device_.getVulkanContext(); if (isRingBuffer_) { // get the current ring buffer index const uint32_t currentBufferIndex = device_.getVulkanContext().currentSyncIndex(); uint8_t* prevDataPtr = nullptr; // pointer to the previous local copy of the data BufferRange currentUpdateRange = range; if (currentBufferIndex != previousBufferIndex_) { prevDataPtr = previousBufferIndex_ < bufferCount_ ? buffers_[previousBufferIndex_]->getMappedPtr() : nullptr; // if the index has changed update the index previousBufferIndex_ = currentBufferIndex; // reset update range at the current index, using input range resetUpdateRange(currentBufferIndex, range); // get full update range for this index, based on updates made in all the other buffers currentUpdateRange = getUpdateRange(); } else { // increase buffer update range at the current index, based on new range extendUpdateRange(currentBufferIndex, range); } // If ring buffer's Vulkan Buffers are CPU mapped if (buffers_[0]->isMapped()) { // if the buffer is mapped // if current updated range differs from the input range, copy data outside of the input range // from previous buffer if ((currentUpdateRange.offset != range.offset || currentUpdateRange.size != range.size) && prevDataPtr) { uint8_t* currDataPtr = currentVulkanBuffer()->getMappedPtr(); // this block is not required for non-mapped buffers, because in that case localData_ always // contains the latest data; and staging device is used to copy data from localData_ to the // device. // this block is needed for mapped buffer, because device buffer data will be updated based // on CPU accessible portion of the currentVulkanBuffer (which is in currDataPtr). And so // data changes outside the input range will be copied from the previous buffer. // this should never happen, but check just in case IGL_DEBUG_ASSERT(currentUpdateRange.offset <= range.offset); // copy data from starting of current update range to range offset const auto frontCopySize = range.offset - currentUpdateRange.offset; if (frontCopySize > 0) { checked_memcpy(currDataPtr + currentUpdateRange.offset, getSizeInBytes() - currentUpdateRange.offset, prevDataPtr + currentUpdateRange.offset, frontCopySize); } // copy data from range end to current update range end const auto rangeEnd = range.offset + range.size; const auto currentUpdateRangeEnd = currentUpdateRange.offset + currentUpdateRange.size; // this should never happen, but check just in case IGL_DEBUG_ASSERT(currentUpdateRangeEnd >= rangeEnd); const auto backCopySize = currentUpdateRangeEnd - rangeEnd; if (backCopySize > 0) { checked_memcpy(currDataPtr + rangeEnd, getSizeInBytes() - rangeEnd, prevDataPtr + rangeEnd, backCopySize); } } currentVulkanBuffer()->bufferSubData(range.offset, range.size, data); } else { // update local data copy checked_memcpy(localData_.get() + range.offset, range.size, (void*)data, range.size); // use staging to upload data to device-local buffers ctx.stagingDevice_->bufferSubData(*currentVulkanBuffer(), currentUpdateRange.offset, currentUpdateRange.size, localData_.get() + currentUpdateRange.offset); } } else { // use staging to upload data to device-local buffers ctx.stagingDevice_->bufferSubData(*currentVulkanBuffer(), range.offset, range.size, data); } return Result(); } size_t Buffer::getSizeInBytes() const { return desc_.length; } uint64_t Buffer::gpuAddress(size_t offset) const { IGL_DEBUG_ASSERT((offset & 7) == 0, "Buffer offset must be 8 bytes aligned as per GLSL_EXT_buffer_reference spec."); return (uint64_t)currentVulkanBuffer()->getVkDeviceAddress() + offset; } VkBuffer Buffer::getVkBuffer() const { return currentVulkanBuffer()->getVkBuffer(); } VkBufferUsageFlags Buffer::getBufferUsageFlags() const { return currentVulkanBuffer()->getBufferUsageFlags(); } void* Buffer::map(const BufferRange& range, Result* outResult) { IGL_DEBUG_ASSERT(!isRingBuffer_, "Buffer::map() operation not supported for ring buffer"); // Sanity check if ((range.size > desc_.length) || (range.offset > desc_.length - range.size)) { Result::setResult(outResult, Result::Code::ArgumentOutOfRange, "Range exceeds buffer length"); // @fb-only // @lint-ignore CLANGTIDY return nullptr; } // If the buffer is currently mapped, then unmap it first if (mappedRange_.size && (mappedRange_.size != range.size || mappedRange_.offset != range.offset)) { IGL_DEBUG_ABORT("Buffer::map() is called more than once without Buffer::unmap()"); unmap(); } mappedRange_ = range; Result::setOk(outResult); const auto& buffer = currentVulkanBuffer(); if (!buffer->isMapped()) { // handle DEVICE_LOCAL buffers tmpBuffer_.resize(range.size); const VulkanContext& ctx = device_.getVulkanContext(); ctx.stagingDevice_->getBufferSubData(*buffer, range.offset, range.size, tmpBuffer_.data()); return tmpBuffer_.data(); } return buffer->getMappedPtr() + range.offset; } void Buffer::unmap() { IGL_DEBUG_ASSERT(!isRingBuffer_, "Buffer::unmap() operation not supported for ring buffer"); IGL_DEBUG_ASSERT(mappedRange_.size, "Called Buffer::unmap() without Buffer::map()"); const auto& buffer = currentVulkanBuffer(); const BufferRange range(tmpBuffer_.size(), mappedRange_.offset); if (!buffer->isMapped()) { // handle DEVICE_LOCAL buffers upload(tmpBuffer_.data(), range); } else if (!buffer->isCoherentMemory()) { buffer->flushMappedMemory(range.offset, range.size); } mappedRange_.size = 0; } BufferDesc::BufferAPIHint Buffer::requestedApiHints() const noexcept { return desc_.hint; } BufferDesc::BufferAPIHint Buffer::acceptedApiHints() const noexcept { if (desc_.type & BufferDesc::BufferTypeBits::Uniform) { return BufferDesc::BufferAPIHintBits::UniformBlock; } return 0; } ResourceStorage Buffer::storage() const noexcept { return desc_.storage; } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/Buffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::vulkan { class Device; class VulkanBuffer; /// @brief Implements the igl::IBuffer interface for Vulkan. Contains one or more VulkanBuffers, /// depending on the type of buffer this class represents. If this class represents a ring buffer, /// then there will be multiple VulkanBuffers, each with its own index. Otherwise it contains only /// one VulkanBuffer object. class Buffer final : public IBuffer { friend class Device; public: explicit Buffer(const igl::vulkan::Device& device); ~Buffer() override = default; Result upload(const void* data, const BufferRange& range) override; void* map(const BufferRange& range, Result* outResult) override; void unmap() override; [[nodiscard]] BufferDesc::BufferAPIHint requestedApiHints() const noexcept override; [[nodiscard]] BufferDesc::BufferAPIHint acceptedApiHints() const noexcept override; [[nodiscard]] ResourceStorage storage() const noexcept override; [[nodiscard]] size_t getSizeInBytes() const override; [[nodiscard]] uint64_t gpuAddress(size_t offset) const override; [[nodiscard]] BufferDesc::BufferType getBufferType() const override { return desc_.type; } [[nodiscard]] VkBuffer getVkBuffer() const; [[nodiscard]] VkBufferUsageFlags getBufferUsageFlags() const; /// @brief Returns the current active VulkanBuffer object managed by this class. Since this class /// may be used as a Ring Buffer, the active buffer is the buffer currently being accessed. [[nodiscard]] const std::unique_ptr& currentVulkanBuffer() const; private: const igl::vulkan::Device& device_; BufferDesc desc_; bool isRingBuffer_ = false; uint32_t previousBufferIndex_ = UINT32_MAX; std::unique_ptr[]> buffers_; std::unique_ptr localData_; std::unique_ptr bufferPatches_; uint32_t bufferCount_ = 0; Result create(const BufferDesc& desc); // Function determines smallest starting and largest ending offset by iterating over all // bufferPatches_, and returns it in the form of buffer range [[nodiscard]] BufferRange getUpdateRange() const; void extendUpdateRange(uint32_t ringBufferIndex, const BufferRange& range); void resetUpdateRange(uint32_t ringBufferIndex, const BufferRange& range); // Used for map/unmap API for DEVICE_LOCAL buffers std::vector tmpBuffer_; BufferRange mappedRange_ = {}; BufferDesc::BufferAPIHint requestedApiHints_ = 0; }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/CMakeLists.txt ================================================ # Copyright (c) Meta Platforms, Inc. and affiliates. # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. # CMake 3.16 can load Vulkan SDK cmake_minimum_required(VERSION 3.19) project(IGLVulkan CXX C) file(GLOB SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp *.c util/*.cpp) file(GLOB HEADER_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.h util/*.h) if(APPLE) file(GLOB APPLE_SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} moltenvk/*.mm) file(GLOB APPLE_HEADER_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} moltenvk/*.h) list(APPEND SRC_FILES ${APPLE_SRC_FILES}) list(APPEND HEADER_FILES ${APPLE_HEADER_FILES}) endif() if(ANDROID) file(GLOB ANDROID_SRC_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} android/*.cpp) file(GLOB ANDROID_HEADER_FILES LIST_DIRECTORIES false RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} android/*.h) list(APPEND SRC_FILES ${ANDROID_SRC_FILES}) list(APPEND HEADER_FILES ${ANDROID_HEADER_FILES}) endif() add_library(IGLVulkan ${SRC_FILES} ${HEADER_FILES}) target_link_libraries(IGLVulkan PRIVATE IGLLibrary IGLGlslang) igl_set_cxxstd(IGLVulkan 20) igl_set_folder(IGLVulkan "IGL") find_package(Vulkan REQUIRED) target_link_libraries(IGLVulkan PUBLIC Vulkan::Vulkan) target_link_libraries(IGLVulkan PUBLIC fmt) target_include_directories(IGLVulkan PUBLIC "${IGL_ROOT_DIR}/third-party/deps/src/fmt/include") target_include_directories(IGLVulkan PUBLIC "${IGL_ROOT_DIR}/third-party/deps/src/volk") target_include_directories(IGLVulkan PUBLIC "${IGL_ROOT_DIR}/third-party/deps/src/vma/include") target_include_directories(IGLVulkan PUBLIC "${IGL_ROOT_DIR}/third-party/deps/src/SPIRV-Headers/include") target_include_directories(IGLVulkan PUBLIC "${IGL_ROOT_DIR}/third-party/deps/src/glslang") if(WIN32) add_definitions("-DVK_USE_PLATFORM_WIN32_KHR=1") add_definitions("-DNOMINMAX") endif() if(UNIX AND NOT APPLE AND NOT ANDROID) add_definitions("-DVK_USE_PLATFORM_XLIB_KHR=1") endif() if(ANDROID) add_definitions("-DVK_USE_PLATFORM_ANDROID_KHR=1") endif() if(APPLE) add_definitions("-DVK_USE_PLATFORM_METAL_EXT=1") target_link_libraries(IGLVulkan PRIVATE "-framework QuartzCore") target_link_libraries(IGLVulkan PRIVATE "-framework Metal") if(MACOSX) target_link_libraries(IGLVulkan PRIVATE "-framework Cocoa") endif() if(IOS) target_link_libraries(IGLVulkan PRIVATE "-framework UIKit") endif() endif() if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") target_compile_options(IGLVulkan PRIVATE "-Wno-nullability-completeness") endif() ================================================ FILE: src/igl/vulkan/CommandBuffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #include #include namespace igl::vulkan { CommandBuffer::CommandBuffer(VulkanContext& ctx, CommandBufferDesc desc) : ICommandBuffer(std::move(desc)), ctx_(ctx), wrapper_(ctx_.immediate_->acquire()) { IGL_DEBUG_ASSERT(wrapper_.cmdBuf != VK_NULL_HANDLE); } std::unique_ptr CommandBuffer::createComputeCommandEncoder() { return std::make_unique(shared_from_this(), ctx_); } std::unique_ptr CommandBuffer::createRenderCommandEncoder( const RenderPassDesc& renderPass, const std::shared_ptr& framebuffer, const Dependencies& dependencies, Result* outResult) { IGL_PROFILER_FUNCTION(); IGL_DEBUG_ASSERT(framebuffer); framebuffer_ = framebuffer; // prepare all the color attachments for (const auto i : framebuffer->getColorAttachmentIndices()) { ITexture* colorTex = framebuffer->getColorAttachment(i).get(); transitionToColorAttachment(wrapper_.cmdBuf, colorTex); // handle MSAA ITexture* colorResolveTex = framebuffer->getResolveColorAttachment(i).get(); transitionToColorAttachment(wrapper_.cmdBuf, colorResolveTex); } // prepare depth attachment const auto depthTex = framebuffer->getDepthAttachment(); if (depthTex) { const auto& vkDepthTex = static_cast(*depthTex); const igl::vulkan::VulkanImage& depthImg = vkDepthTex.getVulkanTexture().image_; IGL_DEBUG_ASSERT(depthImg.imageFormat_ != VK_FORMAT_UNDEFINED, "Invalid depth attachment format"); const VkImageAspectFlags flags = vkDepthTex.getVulkanTexture().image_.getImageAspectFlags(); depthImg.transitionLayout( wrapper_.cmdBuf, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VkImageSubresourceRange{flags, 0, VK_REMAINING_MIP_LEVELS, 0, VK_REMAINING_ARRAY_LAYERS}); } auto encoder = RenderCommandEncoder::create( shared_from_this(), ctx_, renderPass, framebuffer, dependencies, outResult); return encoder; } void CommandBuffer::present(const std::shared_ptr& surface) const { IGL_PROFILER_FUNCTION(); IGL_DEBUG_ASSERT(surface); presentedSurface_ = surface; const auto& vkTex = static_cast(*surface); const VulkanTexture& tex = vkTex.getVulkanTexture(); const VulkanImage& img = tex.image_; // prepare image for presentation if (vkTex.isSwapchainTexture()) { isFromSwapchain_ = true; // the image might be coming from a compute shader const VkPipelineStageFlagBits srcStage = (img.imageLayout_ == VK_IMAGE_LAYOUT_GENERAL) ? VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT : VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; img.transitionLayout( wrapper_.cmdBuf, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, srcStage, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, // wait for all subsequent operations VkImageSubresourceRange{ VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0, VK_REMAINING_ARRAY_LAYERS}); return; } isFromSwapchain_ = false; // transition only non-multisampled images - MSAA images cannot be accessed from shaders if (img.samples_ == VK_SAMPLE_COUNT_1_BIT) { const VkImageAspectFlags flags = vkTex.getVulkanTexture().image_.getImageAspectFlags(); const VkPipelineStageFlags srcStage = vkTex.getProperties().isDepthOrStencil() ? VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT : VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; // set the result of the previous render pass img.transitionLayout( wrapper_.cmdBuf, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, srcStage, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, // wait for subsequent fragment/compute shaders VkImageSubresourceRange{flags, 0, VK_REMAINING_MIP_LEVELS, 0, VK_REMAINING_ARRAY_LAYERS}); } } void CommandBuffer::pushDebugGroupLabel(const char* label, const igl::Color& color) const { IGL_DEBUG_ASSERT(label != nullptr && *label); ivkCmdBeginDebugUtilsLabel(&ctx_.vf_, wrapper_.cmdBuf, label, color.toFloatPtr()); } void CommandBuffer::popDebugGroupLabel() const { ivkCmdEndDebugUtilsLabel(&ctx_.vf_, wrapper_.cmdBuf); } void CommandBuffer::copyBuffer(IBuffer& src, IBuffer& dst, uint64_t srcOffset, uint64_t dstOffset, uint64_t size) { IGL_PROFILER_FUNCTION(); auto& bufSrc = static_cast(src); auto& bufDst = static_cast(dst); ivkBufferBarrier(&ctx_.vf_, wrapper_.cmdBuf, bufSrc.getVkBuffer(), bufSrc.getBufferUsageFlags(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT); ivkBufferBarrier(&ctx_.vf_, wrapper_.cmdBuf, bufDst.getVkBuffer(), bufDst.getBufferUsageFlags(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT); const VkBufferCopy region = { .srcOffset = srcOffset, .dstOffset = dstOffset, .size = size, }; ctx_.vf_.vkCmdCopyBuffer(wrapper_.cmdBuf, bufSrc.getVkBuffer(), bufDst.getVkBuffer(), 1, ®ion); ivkBufferBarrier(&ctx_.vf_, wrapper_.cmdBuf, bufSrc.getVkBuffer(), bufSrc.getBufferUsageFlags(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT); ivkBufferBarrier(&ctx_.vf_, wrapper_.cmdBuf, bufDst.getVkBuffer(), bufDst.getBufferUsageFlags(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT); } void CommandBuffer::copyTextureToBuffer(ITexture& src, IBuffer& dst, uint64_t dstOffset, uint32_t level, uint32_t layer) { auto& texSrc = static_cast(src); auto& bufDst = static_cast(dst); VulkanImage& image = texSrc.getVulkanTexture().image_; const VkImageLayout oldLayout = image.imageLayout_; IGL_DEBUG_ASSERT(oldLayout != VK_IMAGE_LAYOUT_UNDEFINED); ivkBufferBarrier(&ctx_.vf_, wrapper_.cmdBuf, bufDst.getVkBuffer(), bufDst.getBufferUsageFlags(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT); const VkImageAspectFlags aspectMask = image.isDepthFormat_ ? VK_IMAGE_ASPECT_DEPTH_BIT : (image.isStencilFormat_ ? VK_IMAGE_ASPECT_STENCIL_BIT : VK_IMAGE_ASPECT_COLOR_BIT); const VkImageSubresourceRange range = { .aspectMask = aspectMask, .baseMipLevel = level, .levelCount = 1u, .baseArrayLayer = layer, .layerCount = texSrc.getNumFaces() == 6 ? 6u : 1u, }; image.transitionLayout(wrapper_.cmdBuf, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, range); const VkBufferImageCopy region = { .bufferOffset = dstOffset, .bufferRowLength = 0, .bufferImageHeight = 0, .imageSubresource = { .aspectMask = aspectMask, .mipLevel = level, .baseArrayLayer = layer, .layerCount = texSrc.getNumFaces() == 6 ? 6u : 1u, }, .imageOffset = {}, .imageExtent = image.extent_, }; ctx_.vf_.vkCmdCopyImageToBuffer(wrapper_.cmdBuf, texSrc.getVkImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, bufDst.getVkBuffer(), 1u, ®ion); ivkBufferBarrier(&ctx_.vf_, wrapper_.cmdBuf, bufDst.getVkBuffer(), bufDst.getBufferUsageFlags(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT); image.transitionLayout(wrapper_.cmdBuf, oldLayout, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, range); } void CommandBuffer::waitUntilCompleted() { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_WAIT); ctx_.immediate_->wait(lastSubmitHandle_, ctx_.config_.fenceTimeoutNanoseconds); lastSubmitHandle_ = VulkanImmediateCommands::SubmitHandle(); } void CommandBuffer::waitUntilScheduled() {} const std::shared_ptr& CommandBuffer::getFramebuffer() const { return framebuffer_; } const std::shared_ptr& CommandBuffer::getPresentedSurface() const { return presentedSurface_; } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/CommandBuffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::vulkan { class VulkanContext; /// @brief This class implements the igl::ICommandBuffer interface for Vulkan class CommandBuffer final : public ICommandBuffer, public std::enable_shared_from_this { public: /// @brief Constructs a CommandBuffer object, acquires a /// `VulkanImmediateCommands::CommandBufferWrapper` from the context's VulkanImmediateCommands /// object, and stores the CommandBufferDesc structure used to construct the underlying command /// buffer. CommandBuffer(VulkanContext& ctx, CommandBufferDesc desc); /// @brief Creates a ComputeCommandEncoder std::unique_ptr createComputeCommandEncoder() override; /** @brief Creates a RenderCommandEncoder * Before creating a RenderCommandEncoder, this function transitions all images referenced by the * `dependencies` parameter to a shader read only layout. It also transitions all images * referenced by the `framebuffer` parameter to their optimal layout: color and resolve * attachments are transitioned to color attachment optimal layouts; the depth/stencil is * transitioned to depth/stencil attachment optimal layout. Returns * a RenderCommandEncoder object. */ std::unique_ptr createRenderCommandEncoder( const RenderPassDesc& renderPass, const std::shared_ptr& framebuffer, const Dependencies& dependencies, Result* outResult) override; /** @brief Caches the texture passed in to the function for presentation later. If the texture * belongs to a swapchain, this function * transitions the texture to VK_IMAGE_LAYOUT_PRESENT_SRC_KHR layout. Otherwise it transitions the * texture to the VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL layout if the texture's samples is * equal to 1 (it's non multi-sampled). */ void present(const std::shared_ptr& surface) const override; void pushDebugGroupLabel(const char* label, const igl::Color& color) const override; void popDebugGroupLabel() const override; void copyBuffer(IBuffer& src, IBuffer& dst, uint64_t srcOffset, uint64_t dstOffset, uint64_t size) override; void copyTextureToBuffer(ITexture& src, IBuffer& dst, uint64_t dstOffset, uint32_t level, uint32_t layer) override; /// @brief Waits until the command bufer has been executed by the device. void waitUntilCompleted() override; /// @brief Not implemented void waitUntilScheduled() override; VkCommandBuffer getVkCommandBuffer() const { return wrapper_.cmdBuf; } VulkanImmediateCommands::SubmitHandle getNextSubmitHandle() const { return wrapper_.handle; } bool isFromSwapchain() const { return isFromSwapchain_; } const std::shared_ptr& getFramebuffer() const; const std::shared_ptr& getPresentedSurface() const; private: friend class CommandQueue; VulkanContext& ctx_; const VulkanImmediateCommands::CommandBufferWrapper& wrapper_; // was present() called with a swapchain image? mutable bool isFromSwapchain_ = false; std::shared_ptr framebuffer_; mutable std::shared_ptr presentedSurface_; VulkanImmediateCommands::SubmitHandle lastSubmitHandle_ = {}; }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/CommandQueue.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #define IGL_COMMAND_QUEUE_DEBUG_FENCES (IGL_DEBUG && 0) #if IGL_COMMAND_QUEUE_DEBUG_FENCES #include // PRIx3 #include #endif // IGL_COMMAND_QUEUE_DEBUG_FENCES namespace igl::vulkan { CommandQueue::CommandQueue(Device& device, const CommandQueueDesc& /*desc*/) : device_(device) {} std::shared_ptr CommandQueue::createCommandBuffer(const CommandBufferDesc& desc, Result* /*outResult*/) { IGL_PROFILER_FUNCTION(); ++numBuffersLeftToSubmit_; return std::make_shared(device_.getVulkanContext(), desc); } SubmitHandle CommandQueue::submit(const ICommandBuffer& cmdBuffer, bool /* endOfFrame */) { IGL_PROFILER_FUNCTION(); VulkanContext& ctx = device_.getVulkanContext(); incrementDrawCount(cmdBuffer.getCurrentDrawCount()); --numBuffersLeftToSubmit_; auto* vkCmdBuffer = const_cast(static_cast(&cmdBuffer)); #if IGL_COMMAND_QUEUE_DEBUG_FENCES // Create label with Fence handle and Fence FD, if available // A string such as "Submit command buffer (hex: 0x149b90a10, fd: 12345)" has 55 characters char labelName[60]; if (vkCmdBuffer->wrapper_.fence_.exportable()) { std::snprintf(labelName, sizeof(labelName), "Submit command buffer (hex: %#" PRIx64 ", fd: %d)", reinterpret_cast(vkCmdBuffer->wrapper_.fence_.vkFence_), ctx.immediate_->cachedFDFromSubmitHandle(vkCmdBuffer->wrapper_.handle_)); } else { std::snprintf(labelName, sizeof(labelName), "Submit command buffer (hex: %#" PRIx64 ")", reinterpret_cast(vkCmdBuffer->wrapper_.fence_.vkFence_)); } ivkCmdInsertDebugUtilsLabel(&ctx.vf_, vkCmdBuffer->getVkCommandBuffer(), labelName, K_COLOR_COMMAND_BUFFER_SUBMISSION_WITH_FENCE.toFloatPtr()); #endif // IGL_COMMAND_QUEUE_DEBUG_FENCES auto submitHandle = endCommandBuffer(ctx, vkCmdBuffer, true); return submitHandle; } SubmitHandle CommandQueue::endCommandBuffer(VulkanContext& ctx, CommandBuffer* cmdBuffer, bool present) { IGL_PROFILER_FUNCTION(); // Submit to the graphics queue. const bool shouldPresent = ctx.hasSwapchain() && cmdBuffer->isFromSwapchain() && present; if (shouldPresent) { if (ctx.timelineSemaphore_) { // if we are presenting a swapchain image, signal our timeline semaphore const uint64_t signalValue = ctx.swapchain_->getFrameNumber() + ctx.swapchain_->getNumSwapchainImages(); // we wait for this value next time we want to acquire this swapchain image ctx.swapchain_->timelineWaitValues[ctx.swapchain_->getCurrentImageIndex()] = signalValue; ctx.immediate_->signalSemaphore(ctx.timelineSemaphore_->getVkSemaphore(), signalValue); } else { // this can be removed once we switch to timeline semaphores ctx.immediate_->waitSemaphore(ctx.swapchain_->getSemaphore()); } } cmdBuffer->lastSubmitHandle_ = ctx.immediate_->submit(cmdBuffer->wrapper_); if (shouldPresent) { ctx.present(); } ctx.syncMarkSubmitted(cmdBuffer->lastSubmitHandle_); ctx.processDeferredTasks(); ctx.stagingDevice_->mergeRegionsAndFreeBuffers(); return cmdBuffer->lastSubmitHandle_.handle(); } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/CommandQueue.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::vulkan { class CommandBuffer; /** @brief Implements the igl::ICommandQueue interface for Vulkan. Currently, this class only * supports one command buffer active at a time, tracked by an internal flag set to true in * `createCommandBuffer()` and reset in `endCommandBuffer()` (automatically called from `submit()`). */ class CommandQueue final : public ICommandQueue { public: CommandQueue(Device& device, const CommandQueueDesc& desc); ~CommandQueue() override { IGL_DEBUG_ASSERT(numBuffersLeftToSubmit_ == 0); } CommandQueue(const CommandQueue&) = delete; CommandQueue& operator=(const CommandQueue&) = delete; CommandQueue(CommandQueue&&) = delete; CommandQueue& operator=(CommandQueue&&) = delete; /// @brief Create a new command buffer. Sets the internal flag that tracks an active command /// buffer has been created. std::shared_ptr createCommandBuffer(const CommandBufferDesc& desc, Result* outResult) override; /// @brief Submits the `commandBuffer` for execution on the GPU. /// @param cmdBuffer The command buffer to be submitted. /// @param endOfFrame Not used SubmitHandle submit(const ICommandBuffer& cmdBuffer, bool endOfFrame = false) override; /** @brief Ends the current command buffer and resets the internal flag tracking an active command * buffer. Determines if an image should be presented by (1) checking if this instance belongs to * a graphics queue, (2) the context has a swapchain object, (3) the command buffer is from a * swapchain (please refer to CommandBuffer::present), and (4) the present parameter is true. If * so, this function waits for the swapchain semaphore before submitting the command buffer for * execution. After the command buffer is submitted, this function calls VulkanContext::present() * if an image should be presented. Finally, it signals the context to process deferred tasks (for * more details about deferred tasks, please refer to the igl::vulkan::VulkanContext class). */ SubmitHandle endCommandBuffer(VulkanContext& ctx, CommandBuffer* cmdBuffer, bool present); private: Device& device_; /// @brief Counter indicating whether or not there is an active command buffer. C int numBuffersLeftToSubmit_ = 0; }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/Common.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "Common.h" #include #include // clang-format off // NOLINTBEGIN(facebook-unused-include-check) #if defined(VK_USE_PLATFORM_WIN32_KHR) #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #include #else #include #endif // NOLINTEND(facebook-unused-include-check) // clang-format on #include #include #include #include #include #include #include #include namespace igl::vulkan { Result getResultFromVkResult(VkResult result) { if (result == VK_SUCCESS) { return Result(); } Result res(Result::Code::RuntimeError, ivkGetVulkanResultString(result)); switch (result) { case VK_ERROR_LAYER_NOT_PRESENT: case VK_ERROR_EXTENSION_NOT_PRESENT: case VK_ERROR_FEATURE_NOT_PRESENT: res.code = Result::Code::Unimplemented; return res; case VK_ERROR_INCOMPATIBLE_DRIVER: case VK_ERROR_FORMAT_NOT_SUPPORTED: res.code = Result::Code::Unsupported; return res; case VK_ERROR_OUT_OF_HOST_MEMORY: case VK_ERROR_OUT_OF_DEVICE_MEMORY: case VK_ERROR_OUT_OF_POOL_MEMORY: case VK_ERROR_TOO_MANY_OBJECTS: res.code = Result::Code::ArgumentOutOfRange; return res; default:; // skip other Vulkan error codes } return res; } void setResultFrom(Result* outResult, VkResult result) { if (!outResult) { return; } *outResult = getResultFromVkResult(result); } VkFormat invertRedAndBlue(VkFormat format) { switch (format) { case VK_FORMAT_B8G8R8A8_UNORM: return VK_FORMAT_R8G8B8A8_UNORM; case VK_FORMAT_R8G8B8A8_UNORM: return VK_FORMAT_B8G8R8A8_UNORM; case VK_FORMAT_R8G8B8A8_SRGB: return VK_FORMAT_B8G8R8A8_SRGB; case VK_FORMAT_B8G8R8A8_SRGB: return VK_FORMAT_R8G8B8A8_SRGB; case VK_FORMAT_A2R10G10B10_UNORM_PACK32: return VK_FORMAT_A2B10G10R10_UNORM_PACK32; case VK_FORMAT_A2B10G10R10_UNORM_PACK32: return VK_FORMAT_A2R10G10B10_UNORM_PACK32; default: IGL_UNREACHABLE_RETURN(format); } } VkStencilOp stencilOperationToVkStencilOp(StencilOperation op) { switch (op) { case igl::StencilOperation::Keep: return VK_STENCIL_OP_KEEP; case igl::StencilOperation::Zero: return VK_STENCIL_OP_ZERO; case igl::StencilOperation::Replace: return VK_STENCIL_OP_REPLACE; case igl::StencilOperation::IncrementClamp: return VK_STENCIL_OP_INCREMENT_AND_CLAMP; case igl::StencilOperation::DecrementClamp: return VK_STENCIL_OP_DECREMENT_AND_CLAMP; case igl::StencilOperation::Invert: return VK_STENCIL_OP_INVERT; case igl::StencilOperation::IncrementWrap: return VK_STENCIL_OP_INCREMENT_AND_WRAP; case igl::StencilOperation::DecrementWrap: return VK_STENCIL_OP_DECREMENT_AND_WRAP; } IGL_DEBUG_ASSERT_NOT_REACHED(); return VK_STENCIL_OP_KEEP; } VkFormat textureFormatToVkFormat(TextureFormat format) { using TextureFormat = TextureFormat; switch (format) { case TextureFormat::Invalid: return VK_FORMAT_UNDEFINED; case TextureFormat::A_UNorm8: return VK_FORMAT_UNDEFINED; case TextureFormat::L_UNorm8: return VK_FORMAT_UNDEFINED; case TextureFormat::R_UNorm8: return VK_FORMAT_R8_UNORM; case TextureFormat::R_UNorm16: return VK_FORMAT_R16_UNORM; case TextureFormat::R_F16: return VK_FORMAT_R16_SFLOAT; case TextureFormat::R_UInt16: return VK_FORMAT_R16_UINT; case TextureFormat::B5G5R5A1_UNorm: return VK_FORMAT_B5G5R5A1_UNORM_PACK16; case TextureFormat::B5G6R5_UNorm: return VK_FORMAT_B5G6R5_UNORM_PACK16; case TextureFormat::ABGR_UNorm4: return VK_FORMAT_B4G4R4A4_UNORM_PACK16; case TextureFormat::LA_UNorm8: return VK_FORMAT_UNDEFINED; case TextureFormat::RG_UNorm8: return VK_FORMAT_R8G8_UNORM; case TextureFormat::RG_UNorm16: return VK_FORMAT_R16G16_UNORM; case TextureFormat::RGBA_UNorm16: return VK_FORMAT_R16G16B16A16_UNORM; case TextureFormat::R4G2B2_UNorm_Apple: return VK_FORMAT_UNDEFINED; case TextureFormat::R4G2B2_UNorm_Rev_Apple: return VK_FORMAT_UNDEFINED; case TextureFormat::R5G5B5A1_UNorm: return VK_FORMAT_R5G5B5A1_UNORM_PACK16; case TextureFormat::BGRA_UNorm8: return VK_FORMAT_B8G8R8A8_UNORM; case TextureFormat::BGRA_UNorm8_Rev: return VK_FORMAT_UNDEFINED; case TextureFormat::RGBA_UNorm8: case TextureFormat::RGBX_UNorm8: return VK_FORMAT_R8G8B8A8_UNORM; case TextureFormat::RGBA_SRGB: return VK_FORMAT_R8G8B8A8_SRGB; case TextureFormat::BGRA_SRGB: return VK_FORMAT_B8G8R8A8_SRGB; case TextureFormat::RG_F16: return VK_FORMAT_R16G16_SFLOAT; case TextureFormat::RG_UInt16: return VK_FORMAT_R16G16_UINT; case TextureFormat::RGB10_A2_UNorm_Rev: return VK_FORMAT_A2R10G10B10_UNORM_PACK32; case TextureFormat::RGB10_A2_Uint_Rev: return VK_FORMAT_A2R10G10B10_UINT_PACK32; case TextureFormat::BGR10_A2_Unorm: return VK_FORMAT_A2B10G10R10_UNORM_PACK32; case TextureFormat::R_F32: return VK_FORMAT_R32_SFLOAT; case TextureFormat::R_UInt32: return VK_FORMAT_R32_UINT; case TextureFormat::RG_F32: return VK_FORMAT_R32G32_SFLOAT; case TextureFormat::RGB_F16: return VK_FORMAT_R16G16B16_SFLOAT; case TextureFormat::RGBA_F16: return VK_FORMAT_R16G16B16A16_SFLOAT; case TextureFormat::RGB_F32: return VK_FORMAT_R32G32B32_SFLOAT; case TextureFormat::RGBA_UInt32: return VK_FORMAT_R32G32B32A32_UINT; case TextureFormat::RGBA_F32: return VK_FORMAT_R32G32B32A32_SFLOAT; case TextureFormat::RGBA_ASTC_4x4: return VK_FORMAT_ASTC_4x4_UNORM_BLOCK; case TextureFormat::SRGB8_A8_ASTC_4x4: return VK_FORMAT_ASTC_4x4_SRGB_BLOCK; case TextureFormat::RGBA_ASTC_5x4: return VK_FORMAT_ASTC_5x4_UNORM_BLOCK; case TextureFormat::SRGB8_A8_ASTC_5x4: return VK_FORMAT_ASTC_5x4_SRGB_BLOCK; case TextureFormat::RGBA_ASTC_5x5: return VK_FORMAT_ASTC_5x5_UNORM_BLOCK; case TextureFormat::SRGB8_A8_ASTC_5x5: return VK_FORMAT_ASTC_5x5_SRGB_BLOCK; case TextureFormat::RGBA_ASTC_6x5: return VK_FORMAT_ASTC_6x5_UNORM_BLOCK; case TextureFormat::SRGB8_A8_ASTC_6x5: return VK_FORMAT_ASTC_6x5_SRGB_BLOCK; case TextureFormat::RGBA_ASTC_6x6: return VK_FORMAT_ASTC_6x6_UNORM_BLOCK; case TextureFormat::SRGB8_A8_ASTC_6x6: return VK_FORMAT_ASTC_6x6_SRGB_BLOCK; case TextureFormat::RGBA_ASTC_8x5: return VK_FORMAT_ASTC_8x5_UNORM_BLOCK; case TextureFormat::SRGB8_A8_ASTC_8x5: return VK_FORMAT_ASTC_8x5_SRGB_BLOCK; case TextureFormat::RGBA_ASTC_8x6: return VK_FORMAT_ASTC_8x6_UNORM_BLOCK; case TextureFormat::SRGB8_A8_ASTC_8x6: return VK_FORMAT_ASTC_8x6_SRGB_BLOCK; case TextureFormat::RGBA_ASTC_8x8: return VK_FORMAT_ASTC_8x8_UNORM_BLOCK; case TextureFormat::SRGB8_A8_ASTC_8x8: return VK_FORMAT_ASTC_8x8_SRGB_BLOCK; case TextureFormat::RGBA_ASTC_10x5: return VK_FORMAT_ASTC_10x5_UNORM_BLOCK; case TextureFormat::SRGB8_A8_ASTC_10x5: return VK_FORMAT_ASTC_10x5_SRGB_BLOCK; case TextureFormat::RGBA_ASTC_10x6: return VK_FORMAT_ASTC_10x6_UNORM_BLOCK; case TextureFormat::SRGB8_A8_ASTC_10x6: return VK_FORMAT_ASTC_10x6_SRGB_BLOCK; case TextureFormat::RGBA_ASTC_10x8: return VK_FORMAT_ASTC_10x8_UNORM_BLOCK; case TextureFormat::SRGB8_A8_ASTC_10x8: return VK_FORMAT_ASTC_10x8_SRGB_BLOCK; case TextureFormat::RGBA_ASTC_10x10: return VK_FORMAT_ASTC_10x10_UNORM_BLOCK; case TextureFormat::SRGB8_A8_ASTC_10x10: return VK_FORMAT_ASTC_10x10_SRGB_BLOCK; case TextureFormat::RGBA_ASTC_12x10: return VK_FORMAT_ASTC_12x10_UNORM_BLOCK; case TextureFormat::SRGB8_A8_ASTC_12x10: return VK_FORMAT_ASTC_12x10_SRGB_BLOCK; case TextureFormat::RGBA_ASTC_12x12: return VK_FORMAT_ASTC_12x12_UNORM_BLOCK; case TextureFormat::SRGB8_A8_ASTC_12x12: return VK_FORMAT_ASTC_12x12_SRGB_BLOCK; case TextureFormat::RGBA_PVRTC_2BPPV1: return VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG; case TextureFormat::RGB_PVRTC_2BPPV1: return VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG; case TextureFormat::RGBA_PVRTC_4BPPV1: return VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG; case TextureFormat::RGB_PVRTC_4BPPV1: return VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG; case TextureFormat::RGB8_ETC1: return VK_FORMAT_UNDEFINED; case TextureFormat::RGB8_ETC2: return VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK; case TextureFormat::SRGB8_ETC2: return VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK; case TextureFormat::RGB8_Punchthrough_A1_ETC2: return VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK; case TextureFormat::SRGB8_Punchthrough_A1_ETC2: return VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK; case TextureFormat::RGBA8_EAC_ETC2: return VK_FORMAT_UNDEFINED; case TextureFormat::SRGB8_A8_EAC_ETC2: return VK_FORMAT_UNDEFINED; case TextureFormat::RG_EAC_UNorm: return VK_FORMAT_EAC_R11G11_UNORM_BLOCK; case TextureFormat::RG_EAC_SNorm: return VK_FORMAT_EAC_R11G11_SNORM_BLOCK; case TextureFormat::R_EAC_UNorm: return VK_FORMAT_EAC_R11_UNORM_BLOCK; case TextureFormat::R_EAC_SNorm: return VK_FORMAT_EAC_R11_SNORM_BLOCK; case TextureFormat::RGBA_BC7_UNORM_4x4: return VK_FORMAT_BC7_UNORM_BLOCK; case TextureFormat::RGBA_BC7_SRGB_4x4: return VK_FORMAT_BC7_SRGB_BLOCK; case TextureFormat::Z_UNorm16: return VK_FORMAT_D16_UNORM; case TextureFormat::Z_UNorm24: return VK_FORMAT_D24_UNORM_S8_UINT; case TextureFormat::Z_UNorm32: return VK_FORMAT_D32_SFLOAT; case TextureFormat::S8_UInt_Z24_UNorm: return VK_FORMAT_D24_UNORM_S8_UINT; case TextureFormat::S8_UInt_Z32_UNorm: return VK_FORMAT_D32_SFLOAT_S8_UINT; case TextureFormat::S_UInt8: return VK_FORMAT_S8_UINT; case TextureFormat::YUV_NV12: return VK_FORMAT_G8_B8R8_2PLANE_420_UNORM; case TextureFormat::YUV_420p: return VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM; // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only } IGL_UNREACHABLE_RETURN(VK_FORMAT_UNDEFINED) } bool isTextureFormatRGB(VkFormat format) { return format == VK_FORMAT_R8G8B8A8_UNORM || format == VK_FORMAT_R8G8B8A8_SRGB || format == VK_FORMAT_A2R10G10B10_UNORM_PACK32; } bool isTextureFormatBGR(VkFormat format) { return format == VK_FORMAT_B8G8R8A8_UNORM || format == VK_FORMAT_B8G8R8A8_SRGB || format == VK_FORMAT_A2B10G10R10_UNORM_PACK32; } TextureFormat vkFormatToTextureFormat(VkFormat format) { return util::vkTextureFormatToTextureFormat(static_cast(format)); } VkMemoryPropertyFlags resourceStorageToVkMemoryPropertyFlags( ResourceStorage resourceStorage, const VkPhysicalDeviceMemoryProperties* IGL_NULLABLE memProperties) { VkMemoryPropertyFlags memFlags{0}; switch (resourceStorage) { case ResourceStorage::Invalid: IGL_DEBUG_ABORT("Invalid storage type"); break; case ResourceStorage::Private: memFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; break; case ResourceStorage::Shared: memFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; break; case ResourceStorage::Managed: memFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; break; case ResourceStorage::Memoryless: { memFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; if (!memProperties) { break; } constexpr VkMemoryPropertyFlags targetFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT; const auto* const memoryTypesEnd = memProperties->memoryTypes + memProperties->memoryTypeCount; if (std::find_if( memProperties->memoryTypes, memoryTypesEnd, [](const VkMemoryType& memoryType) { return (memoryType.propertyFlags & targetFlags) == targetFlags; }) != memoryTypesEnd) { memFlags |= VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT; } break; } } return memFlags; } VkCompareOp compareFunctionToVkCompareOp(CompareFunction func) { switch (func) { case igl::CompareFunction::Never: return VK_COMPARE_OP_NEVER; case igl::CompareFunction::Less: return VK_COMPARE_OP_LESS; case igl::CompareFunction::Equal: return VK_COMPARE_OP_EQUAL; case igl::CompareFunction::LessEqual: return VK_COMPARE_OP_LESS_OR_EQUAL; case igl::CompareFunction::Greater: return VK_COMPARE_OP_GREATER; case igl::CompareFunction::NotEqual: return VK_COMPARE_OP_NOT_EQUAL; case igl::CompareFunction::GreaterEqual: return VK_COMPARE_OP_GREATER_OR_EQUAL; case igl::CompareFunction::AlwaysPass: return VK_COMPARE_OP_ALWAYS; } IGL_DEBUG_ABORT("CompareFunction value not handled: %d", (int)func); return VK_COMPARE_OP_ALWAYS; } VkColorSpaceKHR colorSpaceToVkColorSpace(ColorSpace colorSpace) { switch (colorSpace) { case ColorSpace::SRGB_LINEAR: return VkColorSpaceKHR::VK_COLOR_SPACE_BT709_LINEAR_EXT; // closest thing to linear srgb case ColorSpace::SRGB_NONLINEAR: return VkColorSpaceKHR::VK_COLOR_SPACE_SRGB_NONLINEAR_KHR; case ColorSpace::DISPLAY_P3_NONLINEAR: return VkColorSpaceKHR::VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT; case ColorSpace::DISPLAY_P3_LINEAR: return VkColorSpaceKHR::VK_COLOR_SPACE_DISPLAY_P3_LINEAR_EXT; case ColorSpace::EXTENDED_SRGB_LINEAR: return VkColorSpaceKHR::VK_COLOR_SPACE_EXTENDED_SRGB_LINEAR_EXT; case ColorSpace::DCI_P3_NONLINEAR: return VkColorSpaceKHR::VK_COLOR_SPACE_DCI_P3_NONLINEAR_EXT; case ColorSpace::BT709_LINEAR: return VkColorSpaceKHR::VK_COLOR_SPACE_BT709_LINEAR_EXT; case ColorSpace::BT709_NONLINEAR: return VkColorSpaceKHR::VK_COLOR_SPACE_BT709_NONLINEAR_EXT; case ColorSpace::BT2020_LINEAR: return VkColorSpaceKHR::VK_COLOR_SPACE_BT2020_LINEAR_EXT; case ColorSpace::HDR10_ST2084: return VkColorSpaceKHR::VK_COLOR_SPACE_HDR10_ST2084_EXT; case ColorSpace::DOLBYVISION: return VkColorSpaceKHR::VK_COLOR_SPACE_DOLBYVISION_EXT; case ColorSpace::HDR10_HLG: return VkColorSpaceKHR::VK_COLOR_SPACE_HDR10_HLG_EXT; case ColorSpace::ADOBERGB_LINEAR: return VkColorSpaceKHR::VK_COLOR_SPACE_ADOBERGB_LINEAR_EXT; case ColorSpace::ADOBERGB_NONLINEAR: return VkColorSpaceKHR::VK_COLOR_SPACE_ADOBERGB_NONLINEAR_EXT; case ColorSpace::PASS_THROUGH: return VkColorSpaceKHR::VK_COLOR_SPACE_PASS_THROUGH_EXT; case ColorSpace::EXTENDED_SRGB_NONLINEAR: return VkColorSpaceKHR::VK_COLOR_SPACE_EXTENDED_SRGB_NONLINEAR_EXT; case ColorSpace::DISPLAY_NATIVE_AMD: return VkColorSpaceKHR::VK_COLOR_SPACE_DISPLAY_NATIVE_AMD; case ColorSpace::BT2020_NONLINEAR: case ColorSpace::BT601_NONLINEAR: case ColorSpace::BT2100_HLG_NONLINEAR: case ColorSpace::BT2100_PQ_NONLINEAR: IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); return VkColorSpaceKHR::VK_COLOR_SPACE_BT709_NONLINEAR_EXT; } IGL_UNREACHABLE_RETURN(VK_COLOR_SPACE_BT709_NONLINEAR_EXT); } ColorSpace vkColorSpaceToColorSpace(VkColorSpaceKHR colorSpace) { switch (colorSpace) { case VK_COLOR_SPACE_SRGB_NONLINEAR_KHR: return ColorSpace::SRGB_NONLINEAR; case VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT: return ColorSpace::DISPLAY_P3_NONLINEAR; case VK_COLOR_SPACE_EXTENDED_SRGB_LINEAR_EXT: return ColorSpace::EXTENDED_SRGB_LINEAR; case VK_COLOR_SPACE_DISPLAY_P3_LINEAR_EXT: return ColorSpace::DISPLAY_P3_LINEAR; case VK_COLOR_SPACE_DCI_P3_NONLINEAR_EXT: return ColorSpace::DCI_P3_NONLINEAR; case VK_COLOR_SPACE_BT709_LINEAR_EXT: return ColorSpace::BT709_LINEAR; case VK_COLOR_SPACE_BT709_NONLINEAR_EXT: return ColorSpace::BT709_NONLINEAR; case VK_COLOR_SPACE_BT2020_LINEAR_EXT: return ColorSpace::BT2020_LINEAR; case VK_COLOR_SPACE_HDR10_ST2084_EXT: return ColorSpace::HDR10_ST2084; case VK_COLOR_SPACE_DOLBYVISION_EXT: return ColorSpace::DOLBYVISION; case VK_COLOR_SPACE_HDR10_HLG_EXT: return ColorSpace::HDR10_HLG; case VK_COLOR_SPACE_ADOBERGB_LINEAR_EXT: return ColorSpace::ADOBERGB_LINEAR; case VK_COLOR_SPACE_ADOBERGB_NONLINEAR_EXT: return ColorSpace::ADOBERGB_NONLINEAR; case VK_COLOR_SPACE_PASS_THROUGH_EXT: return ColorSpace::PASS_THROUGH; case VK_COLOR_SPACE_EXTENDED_SRGB_NONLINEAR_EXT: return ColorSpace::EXTENDED_SRGB_NONLINEAR; case VK_COLOR_SPACE_DISPLAY_NATIVE_AMD: return ColorSpace::DISPLAY_NATIVE_AMD; default: IGL_DEBUG_ASSERT_NOT_REACHED(); return ColorSpace::SRGB_NONLINEAR; } } VkSampleCountFlagBits getVulkanSampleCountFlags(size_t numSamples) { if (numSamples <= 1) { return VK_SAMPLE_COUNT_1_BIT; } if (numSamples <= 2) { return VK_SAMPLE_COUNT_2_BIT; } if (numSamples <= 4) { return VK_SAMPLE_COUNT_4_BIT; } if (numSamples <= 8) { return VK_SAMPLE_COUNT_8_BIT; } if (numSamples <= 16) { return VK_SAMPLE_COUNT_16_BIT; } if (numSamples <= 32) { return VK_SAMPLE_COUNT_32_BIT; } return VK_SAMPLE_COUNT_64_BIT; } uint32_t getVkLayer(TextureType type, uint32_t face, uint32_t layer) { return type == TextureType::Cube ? face : layer; } TextureRangeDesc atVkLayer(TextureType type, const TextureRangeDesc& range, uint32_t vkLayer) { return type == TextureType::Cube ? range.atFace(vkLayer) : range.atLayer(vkLayer); } void transitionToGeneral(VkCommandBuffer cmdBuf, ITexture* texture) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_TRANSITION); if (!texture) { return; } const vulkan::Texture& tex = static_cast(*texture); const vulkan::VulkanImage& img = tex.getVulkanTexture().image_; const vulkan::VulkanImageView& imgView = tex.getVulkanTexture().imageView_; if (!img.isStorageImage()) { IGL_DEBUG_ABORT("Did you forget to specify TextureUsageBits::Storage on your texture?"); return; } // "frame graph" heuristics: if we are already in VK_IMAGE_LAYOUT_GENERAL, wait for the previous // compute shader, otherwise wait for previous attachment writes const VkPipelineStageFlags srcStage = (img.imageLayout_ == VK_IMAGE_LAYOUT_GENERAL) ? VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT : img.isDepthOrStencilFormat_ ? VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT : VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; img.transitionLayout(cmdBuf, VK_IMAGE_LAYOUT_GENERAL, srcStage, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VkImageSubresourceRange{imgView.getVkImageAspectFlags(), 0, VK_REMAINING_MIP_LEVELS, 0, VK_REMAINING_ARRAY_LAYERS}); } void transitionToColorAttachment(VkCommandBuffer cmdBuf, ITexture* colorTex) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_TRANSITION); if (!colorTex) { return; } const auto& vkTex = static_cast(*colorTex); const igl::vulkan::VulkanImage& img = vkTex.getVulkanTexture().image_; if (IGL_DEBUG_VERIFY_NOT(img.isDepthFormat_ || img.isStencilFormat_)) { IGL_DEBUG_ABORT("Color attachments cannot have depth/stencil formats"); IGL_LOG_ERROR("Color attachments cannot have depth/stencil formats"); return; } IGL_DEBUG_ASSERT(img.imageFormat_ != VK_FORMAT_UNDEFINED || vkTex.getVkExtendedFormat() != 0, "Invalid color attachment format"); if (!IGL_DEBUG_VERIFY((img.usageFlags_ & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) != 0)) { IGL_DEBUG_ABORT("Did you forget to specify TextureUsageBit::Attachment usage bit?"); IGL_LOG_ERROR("Did you forget to specify TextureUsageBit::Attachment usage bit?"); } if (img.usageFlags_ & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) { // transition to VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL img.transitionLayout( cmdBuf, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, // wait for all subsequent fragment/compute // shaders VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VkImageSubresourceRange{ VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0, VK_REMAINING_ARRAY_LAYERS}); } } void transitionToDepthStencilAttachment(VkCommandBuffer cmdBuf, ITexture* depthStencilTex) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_TRANSITION); if (!depthStencilTex) { return; } const auto& vkTex = static_cast(*depthStencilTex); const igl::vulkan::VulkanImage& img = vkTex.getVulkanTexture().image_; if (IGL_DEBUG_VERIFY_NOT(!img.isDepthFormat_ && !img.isStencilFormat_)) { IGL_DEBUG_ABORT("Only depth/stencil formats are accepted"); IGL_LOG_ERROR("Only depth/stencil formats are accepted"); return; } IGL_DEBUG_ASSERT(img.imageFormat_ != VK_FORMAT_UNDEFINED, "Invalid color attachment format"); if (!IGL_DEBUG_VERIFY((img.usageFlags_ & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) != 0)) { IGL_DEBUG_ABORT("Did you forget to specify TextureUsageBit::Attachment usage bit?"); IGL_LOG_ERROR("Did you forget to specify TextureUsageBit::Attachment usage bit?"); } if (img.usageFlags_ & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { // transition to VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL VkImageAspectFlags aspectFlags = 0; if (img.isDepthFormat_) { aspectFlags |= VK_IMAGE_ASPECT_DEPTH_BIT; } if (img.isStencilFormat_) { aspectFlags |= VK_IMAGE_ASPECT_STENCIL_BIT; } img.transitionLayout( cmdBuf, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, // wait for all subsequent fragment/compute // shaders VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, VkImageSubresourceRange{ aspectFlags, 0, VK_REMAINING_MIP_LEVELS, 0, VK_REMAINING_ARRAY_LAYERS}); } } void transitionToShaderReadOnly(VkCommandBuffer cmdBuf, ITexture* texture) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_TRANSITION); if (!texture) { return; } const vulkan::Texture& tex = static_cast(*texture); const vulkan::VulkanImage& img = tex.getVulkanTexture().image_; const igl::vulkan::VulkanImageView& imgView = tex.getVulkanTexture().imageView_; const bool isColor = (imgView.getVkImageAspectFlags() & VK_IMAGE_ASPECT_COLOR_BIT) > 0; if (img.usageFlags_ & VK_IMAGE_USAGE_SAMPLED_BIT) { // transition sampled images to VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL img.transitionLayout( cmdBuf, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, isColor ? VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT : VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, // wait for subsequent // fragment/compute shaders VkImageSubresourceRange{ img.getImageAspectFlags(), 0, VK_REMAINING_MIP_LEVELS, 0, VK_REMAINING_ARRAY_LAYERS}); } } void overrideImageLayout(ITexture* texture, VkImageLayout layout) { if (!texture) { return; } const vulkan::Texture* tex = static_cast(texture); tex->getVulkanTexture().image_.imageLayout_ = layout; } void ensureShaderModule(IShaderModule* sm) { IGL_DEBUG_ASSERT(sm); const igl::vulkan::util::SpvModuleInfo& info = static_cast(sm)->getVulkanShaderModule().getSpvModuleInfo(); for (const auto& t : info.textures) { if (!IGL_DEBUG_VERIFY(t.descriptorSet == kBindPoint_CombinedImageSamplers)) { IGL_LOG_ERROR( "Missing descriptor set id for textures: the shader should contain \"layout(set = " "%u, ...)\"", kBindPoint_CombinedImageSamplers); continue; } } for (const auto& b : info.buffers) { if (!IGL_DEBUG_VERIFY(b.descriptorSet == kBindPoint_Buffers)) { IGL_LOG_ERROR( "Missing descriptor set id for buffers: the shader should contain \"layout(set = " "%u, ...)\"", kBindPoint_Buffers); continue; } } for (const auto& i : info.images) { if (!IGL_DEBUG_VERIFY(i.descriptorSet == kBindPoint_StorageImages)) { IGL_LOG_ERROR( "Missing descriptor set id for storage images: the shader should contain \"layout(set = " "%u, ...)\"", kBindPoint_StorageImages); continue; } } } VkComponentMapping componentMappingToVkComponentMapping(const ComponentMapping& mapping) { auto swizzleToVkSwizzle = [](Swizzle swizzle) -> VkComponentSwizzle { switch (swizzle) { case Swizzle_Default: return VK_COMPONENT_SWIZZLE_IDENTITY; case Swizzle_0: return VK_COMPONENT_SWIZZLE_ZERO; case Swizzle_1: return VK_COMPONENT_SWIZZLE_ONE; case Swizzle_R: return VK_COMPONENT_SWIZZLE_R; case Swizzle_G: return VK_COMPONENT_SWIZZLE_G; case Swizzle_B: return VK_COMPONENT_SWIZZLE_B; case Swizzle_A: return VK_COMPONENT_SWIZZLE_A; default: IGL_DEBUG_ASSERT_NOT_REACHED(); return VK_COMPONENT_SWIZZLE_IDENTITY; } }; return VkComponentMapping{ .r = swizzleToVkSwizzle(mapping.r), .g = swizzleToVkSwizzle(mapping.g), .b = swizzleToVkSwizzle(mapping.b), .a = swizzleToVkSwizzle(mapping.a), }; } uint32_t getNumImagePlanes(VkFormat format) { switch (format) { case VK_FORMAT_UNDEFINED: return 0; case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM: return 2; case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM: return 3; default: return 1; } } bool hasDepth(VkFormat format) { return (format == VK_FORMAT_D16_UNORM) || (format == VK_FORMAT_X8_D24_UNORM_PACK32) || (format == VK_FORMAT_D32_SFLOAT) || (format == VK_FORMAT_D16_UNORM_S8_UINT) || (format == VK_FORMAT_D24_UNORM_S8_UINT) || (format == VK_FORMAT_D32_SFLOAT_S8_UINT); } bool hasStencil(VkFormat format) { return (format == VK_FORMAT_S8_UINT) || (format == VK_FORMAT_D16_UNORM_S8_UINT) || (format == VK_FORMAT_D24_UNORM_S8_UINT) || (format == VK_FORMAT_D32_SFLOAT_S8_UINT); } } // namespace igl::vulkan namespace igl::vulkan::functions { namespace { PFN_vkGetInstanceProcAddr getVkGetInstanceProcAddr() { #if defined(FORCE_USE_STATIC_VULKAN_LOADER) && !defined(FORCE_USE_STATIC_VULKAN_LOADER_DISABLED) return nullptr; #elif defined(_WIN32) HMODULE lib = LoadLibraryA("vulkan-1.dll"); if (!lib) { DWORD dw = GetLastError(); LPVOID lpMsgBuf = nullptr; if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL) != 0) { IGL_LOG_ERROR("Failed to open vulkan-1.dll: %s\n", (LPCTSTR)lpMsgBuf); LocalFree(lpMsgBuf); } else { IGL_LOG_ERROR("Failed to open vulkan-1.dll"); } return nullptr; } return (PFN_vkGetInstanceProcAddr)GetProcAddress(lib, "vkGetInstanceProcAddr"); #elif defined(__APPLE__) void* lib = dlopen("libvulkan.dylib", RTLD_NOW | RTLD_LOCAL); IGL_LOG_INFO("Loading libvulkan.dylib\n"); if (!lib) { IGL_LOG_INFO("Opening libvulkan.dylib failed: %s. Loading libvulkan.1.dylib instead\n", dlerror()); lib = dlopen("libvulkan.1.dylib", RTLD_NOW | RTLD_LOCAL); } if (!lib) { IGL_LOG_INFO("Opening libvulkan.1.dylib failed: %s. Loading libMoltenVK.dylib instead\n", dlerror()); lib = dlopen("libMoltenVK.dylib", RTLD_NOW | RTLD_LOCAL); } if (!lib) { IGL_LOG_ERROR("Failed to open libMoltenVK.dylib: %s\n", dlerror()); return nullptr; } return (PFN_vkGetInstanceProcAddr)dlsym(lib, "vkGetInstanceProcAddr"); #else // Preload libraries that Vulkan ICD drivers commonly depend on. // This ensures they're available when the Vulkan loader dlopens() ICD drivers. // Libraries must be preloaded in dependency order (leaf dependencies first). // This is required because Buck2 uses a custom dynamic linker that doesn't search // standard system library paths (/lib64, /usr/lib64). We cannot use LD_LIBRARY_PATH // or RPATH because they would interfere with Buck2's hermetic build environment. #if IGL_PLATFORM_LINUX && !defined(IGL_CMAKE_BUILD) const std::array kPreloadLibs = { // Base system libraries (leaf dependencies) "/lib64/libtinfo.so.6", // Required by libedit "/lib64/liblzma.so.5", // Required by libxml2 "/lib64/libz.so.1", // Required by libLLVM, libxml2, Intel drivers "/usr/lib64/libzstd.so.1", // Required by libLLVM, Intel drivers "/usr/lib64/libffi.so.8", // Required by libLLVM "/lib64/libelf.so.1", // Required by Radeon driver // Mid-level dependencies "/lib64/libedit.so.0", // Required by libLLVM (depends on libtinfo) "/lib64/libxml2.so.2", // Required by libLLVM (depends on liblzma, libz) "/lib64/libexpat.so.1", // Required by Mesa drivers "/lib64/libXau.so.6", // Required by libxcb // X11/XCB libraries (for Intel and other hardware drivers) "/lib64/libxcb.so.1", // Required by Mesa drivers (depends on libXau) "/lib64/libxcb-randr.so.0", // Required by Lavapipe and all drivers "/lib64/libxcb-present.so.0", // Required by all Mesa Vulkan drivers "/lib64/libxcb-sync.so.1", // Required by Mesa drivers "/lib64/libxcb-xfixes.so.0", // Required by Mesa drivers "/lib64/libxcb-shm.so.0", // Required by Mesa drivers "/lib64/libX11-xcb.so.1", // Required by Intel drivers "/lib64/libxshmfence.so.1", // Required by Intel drivers "/lib64/libwayland-client.so.0", // Required by Intel drivers // DRM libraries "/lib64/libdrm.so.2", // Required by all hardware drivers "/usr/lib64/libdrm_amdgpu.so.1", // Required by Radeon driver // High-level dependencies "/lib64/libLLVM.so.20.1", // Required by Lavapipe and Radeon drivers "/lib64/libSPIRV-Tools.so", // Required by Lavapipe "/lib64/libSPIRV-Tools-opt.so", // Required by libVkLayer_khronos_validation // Additional X11 libraries for Intel drivers "/lib64/libxcb-dri3.so.0", // Required by Intel drivers }; for (const char* preload : kPreloadLibs) { // First try loading just the library name (allows LD_LIBRARY_PATH to work) const char* libName = strrchr(preload, '/'); libName = libName ? libName + 1 : preload; const void* handle = dlopen(libName, RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE); if (handle) { IGL_LOG_DEBUG("IGL/Vulkan: preloaded `%s` (via library name).\n", libName); } else { // Fall back to full path if library name didn't work handle = dlopen(preload, RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE); if (handle) { IGL_LOG_DEBUG("IGL/Vulkan: preloaded `%s` (via full path).\n", preload); } else { // Log but continue - not all systems will have all drivers IGL_LOG_DEBUG( "IGL/Vulkan: failed to preload `%s`: %s (not critical).\n", preload, dlerror()); } } } #endif // IGL_PLATFORM_LINUX && !defined(IGL_CMAKE_BUILD) const std::array libs = { "libvulkan.so.1", "libvulkan.so", "/lib64/libvulkan.so.1", "/lib64/libvulkan.so", }; void* lib = nullptr; for (const char* name : libs) { lib = dlopen(name, RTLD_NOW | RTLD_LOCAL); if (lib) { break; } IGL_LOG_INFO("IGL/Vulkan: opening `%s` failed: %s.\n", name, dlerror()); } if (!lib) { IGL_LOG_ERROR("IGL/Vulkan: no Vulkan library was found.\n"); return nullptr; } return (PFN_vkGetInstanceProcAddr)dlsym(lib, "vkGetInstanceProcAddr"); #endif } } // namespace void initialize(VulkanFunctionTable& table) { table.vkGetInstanceProcAddr = getVkGetInstanceProcAddr(); if (!loadVulkanLoaderFunctions(&table, table.vkGetInstanceProcAddr)) { IGL_LOG_ERROR("Failed to load Vulkan loader functions"); abort(); } } void loadInstanceFunctions(VulkanFunctionTable& table, VkInstance instance, bool enableExtDebugUtils) { IGL_DEBUG_ASSERT(table.vkGetInstanceProcAddr != nullptr); loadVulkanInstanceFunctions( &table, instance, table.vkGetInstanceProcAddr, enableExtDebugUtils ? VK_TRUE : VK_FALSE); } void loadDeviceFunctions(VulkanFunctionTable& table, VkDevice device) { IGL_DEBUG_ASSERT(table.vkGetDeviceProcAddr != nullptr); loadVulkanDeviceFunctions(&table, device, table.vkGetDeviceProcAddr); } } // namespace igl::vulkan::functions ================================================ FILE: src/igl/vulkan/Common.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #ifndef IGL_VULKAN_COMMON_H #define IGL_VULKAN_COMMON_H #include // IWYU pragma: export #include // IWYU pragma: export // set to 1 to see very verbose debug console logs with Vulkan commands #define IGL_VULKAN_PRINT_COMMANDS 0 #include // IWYU pragma: export #include // IWYU pragma: export #if IGL_PLATFORM_MACOSX #include // IWYU pragma: export #endif #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export // Enable to use VulkanMemoryAllocator (VMA) #define IGL_VULKAN_USE_VMA 1 // Macro that encapsulates a function call and check its return value against VK_SUCCESS. Prints // location of failure when the result is not VK_SUCCESS, along with a stringified version of the // result value. Asserts at the end of the code block. Expands to void function calls when build // mode is not DEBUG #define VK_ASSERT(func) \ { \ const VkResult vk_assert_result = func; \ if (vk_assert_result != VK_SUCCESS) { \ IGL_DEBUG_ABORT("Vulkan API call failed: %s\n %s\n", \ #func, \ ivkGetVulkanResultString(vk_assert_result)); \ } \ } // Macro that encapsulates a function call and check its return value against VK_SUCCESS. Prints // location of failure when the result is not VK_SUCCESS, along with a stringified version of the // result value. Asserts at the end of the code block. The check remains even in build modes other // than DEBUG #if IGL_DEBUG_ABORT_ENABLED // When IGL_DEBUG_ABORT_ENABLED is 1, VK_ASSERT may assert but will always log so use the existing // macro. #define VK_ASSERT_FORCE_LOG(func) VK_ASSERT(func) #else // When IGL_DEBUG_ABORT_ENABLED is 0, VK_ASSERT will neither log nor assert so need a separate // definition that will explicitly log the result #define VK_ASSERT_FORCE_LOG(func) \ { \ const VkResult vk_assert_result = func; \ if (vk_assert_result != VK_SUCCESS) { \ IGLLog(IGLLogError, \ "Vulkan API call failed: %s:%i\n %s\n %s\n", \ __FILE__, \ __LINE__, \ #func, \ ivkGetVulkanResultString(vk_assert_result)); \ } \ } #endif // IGL_DEBUG_ABORT_ENABLED // Macro that encapsulates a function call and check its return value against VK_SUCCESS. Prints // location of failure when the result is not VK_SUCCESS, along with a stringified version of the // result value. Asserts at the end of the code block. The check remains even in build modes other // than DEBUG. Returns the value passed as a parameter #define VK_ASSERT_RETURN_VALUE(func, value) \ { \ const VkResult vk_assert_result = func; \ if (vk_assert_result != VK_SUCCESS) { \ IGL_DEBUG_ABORT("Vulkan API call failed: %s\n %s\n", \ #func, \ ivkGetVulkanResultString(vk_assert_result)); \ return value; \ } \ } // Calls the function provided as `func`, checks the return value from the function call against // VK_SUCCESS and converts the return value from VkResult to an igl::Result and returns it #define VK_ASSERT_RETURN(func) VK_ASSERT_RETURN_VALUE(func, getResultFromVkResult(vk_assert_result)) // Calls the function provided as `func`, checks the return value from the function call against // VK_SUCCESS and returns VK_NULL_HANDLE #define VK_ASSERT_RETURN_NULL_HANDLE(func) VK_ASSERT_RETURN_VALUE(func, VK_NULL_HANDLE) #define IGL_ENSURE_VULKAN_CONTEXT_THREAD(ctx) (ctx)->ensureCurrentContextThread() namespace igl::vulkan { // The color definitions below are used by debugging utility functions, such as the ones provided by // VK_EXT_debug_utils #define K_COLOR_GENERATE_MIPMAPS igl::Color(1.f, 0.75f, 0.f) #define K_COLOR_UPLOAD_IMAGE igl::Color(1.f, 0.2f, 0.78f) #define K_COLOR_COMMAND_BUFFER_SUBMISSION_WITH_FENCE igl::Color(0.878f, 0.69f, 1.0f) // Mauve // The VulkanContextConfig provides a way to override some of the the default behaviors of the // VulkanContext struct VulkanContextConfig { bool terminateOnValidationError = false; // invoke std::terminate() on any validation error bool enableConcurrentVkDevicesSupport = false; bool enableValidation = true; bool enableGPUAssistedValidation = true; bool enableExtraLogs = true; bool enableDescriptorIndexing = false; bool enableShaderInt16 = true; bool enableShaderDrawParameters = true; bool enableStorageBuffer16BitAccess = true; bool enableDualSrcBlend = true; bool enableGfxReconstruct = false; bool enableMultiviewPerViewViewports = false; ColorSpace swapChainColorSpace = igl::ColorSpace::SRGB_NONLINEAR; TextureFormat requestedSwapChainTextureFormat = igl::TextureFormat::RGBA_UNorm8; // the number of resources to support BufferAPIHintBits::Ring uint32_t maxResourceCount = 3u; // owned by the application - should be alive until initContext() returns const void* pipelineCacheData = nullptr; size_t pipelineCacheDataSize = 0; // This enables fences generated at the end of submission to be exported to the client. // The client can then use the SubmitHandle to wait for the completion of the GPU work. bool exportableFences = false; // Use VK_EXT_headless_surface to create a headless swapchain bool headless = false; // Size for VulkanMemoryAllocator's default pool block size parameter. // Only relevant if VMA is used for memory allocation. // Passing 0 will prompt VMA to a large default value (currently 256 MB). // Using a smaller heap size would increase the chance of memory deallocation and result in less // memory wastage. size_t vmaPreferredLargeHeapBlockSize = 0; // Specifies a default fence timeout value. uint64_t fenceTimeoutNanoseconds = UINT64_MAX; size_t numExtraInstanceExtensions = 0; const char* IGL_NULLABLE* IGL_NULLABLE extraInstanceExtensions = nullptr; const char* engineName = "IGL/Vulkan"; const char* applicationName = "IGL/Vulkan"; }; /** * @brief Encapsulates a handle to a VkSampler. The struct also stores the sampler id, which is used * for bindless rendering (see the ResourcesBinder and VulkanContext classes for more information) */ struct VulkanSampler final { VkSampler vkSampler = VK_NULL_HANDLE; /** * @brief The index into VulkanContext::samplers_. This index is intended to be used with bindless * rendering. Its value is set by the context when the resource is created and added to the vector * of samplers maintained by the VulkanContext. */ uint32_t samplerId = 0; }; // The functions below are convenience functions used to convert to and from Vulkan values to IGL // values Result getResultFromVkResult(VkResult result); void setResultFrom(Result* outResult, VkResult result); VkFormat textureFormatToVkFormat(TextureFormat format); TextureFormat vkFormatToTextureFormat(VkFormat format); VkFormat invertRedAndBlue(VkFormat format); bool isTextureFormatRGB(VkFormat format); bool isTextureFormatBGR(VkFormat format); bool hasDepth(VkFormat format); bool hasStencil(VkFormat format); uint32_t getNumImagePlanes(VkFormat format); VkMemoryPropertyFlags resourceStorageToVkMemoryPropertyFlags( ResourceStorage resourceStorage, const VkPhysicalDeviceMemoryProperties* IGL_NULLABLE memProperties = nullptr); VkCompareOp compareFunctionToVkCompareOp(CompareFunction func); VkStencilOp stencilOperationToVkStencilOp(StencilOperation op); VkSampleCountFlagBits getVulkanSampleCountFlags(size_t numSamples); VkSurfaceFormatKHR colorSpaceToVkSurfaceFormat(ColorSpace colorSpace, bool isBGR); uint32_t getVkLayer(TextureType type, uint32_t face, uint32_t layer); TextureRangeDesc atVkLayer(TextureType type, const TextureRangeDesc& range, uint32_t vkLayer); VkColorSpaceKHR colorSpaceToVkColorSpace(ColorSpace colorSpace); ColorSpace vkColorSpaceToColorSpace(VkColorSpaceKHR colorSpace); VkComponentMapping componentMappingToVkComponentMapping(const ComponentMapping& mapping); /// @brief Transition from the current layout to VK_IMAGE_LAYOUT_GENERAL void transitionToGeneral(VkCommandBuffer cmdBuf, ITexture* texture); /// @brief Transition from the current layout to VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL void transitionToColorAttachment(VkCommandBuffer cmdBuf, ITexture* colorTex); /// @brief Transition from the current layout to VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL void transitionToDepthStencilAttachment(VkCommandBuffer cmdBuf, ITexture* depthStencilTex); /// @brief Transition from the current layout to VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL void transitionToShaderReadOnly(VkCommandBuffer cmdBuf, ITexture* texture); /// @brief Overrides the layout stored in the `texture` with the one in `layout`. This function does /// not perform a transition, it only updates the texture's member variable that stores its current /// layout void overrideImageLayout(ITexture* texture, VkImageLayout layout); /// @brief Ensures that all shader bindings are bound by checking the SPIR-V reflection. If the /// function doesn't assert at some point, the shader bindings are correct. Only for debugging. void ensureShaderModule(IShaderModule* sm); /// @brief Implements the igl::IDepthStencilState interface struct DepthStencilState final : public IDepthStencilState { explicit DepthStencilState(DepthStencilStateDesc desc) : desc(std::move(desc)) {} const DepthStencilStateDesc desc; }; /// @brief Implements the igl::IVertexInputState interface struct VertexInputState final : public IVertexInputState { public: explicit VertexInputState(VertexInputStateDesc desc) : desc(std::move(desc)) {} const VertexInputStateDesc desc; }; } // namespace igl::vulkan namespace igl::vulkan::functions { void initialize(VulkanFunctionTable& table); void loadInstanceFunctions(VulkanFunctionTable& table, VkInstance instance, bool enableExtDebugUtils); void loadDeviceFunctions(VulkanFunctionTable& table, VkDevice device); } // namespace igl::vulkan::functions #endif // IGL_VULKAN_COMMON_H ================================================ FILE: src/igl/vulkan/ComputeCommandEncoder.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #include #include namespace igl::vulkan { ComputeCommandEncoder::ComputeCommandEncoder(const std::shared_ptr& commandBuffer, VulkanContext& ctx) : ctx_(ctx), cmdBuffer_(commandBuffer ? commandBuffer->getVkCommandBuffer() : VK_NULL_HANDLE), binder_(commandBuffer.get(), ctx_, VK_PIPELINE_BIND_POINT_COMPUTE) { IGL_PROFILER_FUNCTION(); IGL_DEBUG_ASSERT(commandBuffer); IGL_ENSURE_VULKAN_CONTEXT_THREAD(&ctx_); ctx_.checkAndUpdateDescriptorSets(); isEncoding_ = true; } void ComputeCommandEncoder::endEncoding() { IGL_PROFILER_FUNCTION(); IGL_ENSURE_VULKAN_CONTEXT_THREAD(&ctx_); if (!isEncoding_) { return; } isEncoding_ = false; for (size_t i = 0; i < numRestoreLayouts_; ++i) { const VulkanImage* img = restoreLayout_[i]; if (img->isSampledImage()) { // only sampled images can be transitioned to VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL img->transitionLayout(cmdBuffer_, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VkImageSubresourceRange{ .aspectMask = restoreLayoutAspectFlags_[i], .baseMipLevel = 0, .levelCount = VK_REMAINING_MIP_LEVELS, .baseArrayLayer = 0, .layerCount = VK_REMAINING_ARRAY_LAYERS, }); } } numRestoreLayouts_ = 0; } void ComputeCommandEncoder::bindComputePipelineState( const std::shared_ptr& pipelineState) { IGL_PROFILER_FUNCTION(); if (!IGL_DEBUG_VERIFY(pipelineState)) { return; } cps_ = static_cast(pipelineState.get()); binder_.bindPipeline(cps_->getVkPipeline(), &cps_->getSpvModuleInfo()); if (ctx_.config_.enableDescriptorIndexing) { VkDescriptorSet dset = ctx_.getBindlessVkDescriptorSet(); #if IGL_VULKAN_PRINT_COMMANDS IGL_LOG_INFO("%p vkCmdBindDescriptorSets(COMPUTE) - bindless\n", cmdBuffer_); #endif // IGL_VULKAN_PRINT_COMMANDS ctx_.vf_.vkCmdBindDescriptorSets(cmdBuffer_, VK_PIPELINE_BIND_POINT_COMPUTE, cps_->getVkPipelineLayout(), kBindPoint_Bindless, 1, &dset, 0, nullptr); } } void ComputeCommandEncoder::processDependencies(const Dependencies& dependencies) { // 1. Process all textures { const Dependencies* deps = &dependencies; while (deps) { for (ITexture* tex : deps->textures) { if (!tex) { break; } igl::vulkan::transitionToGeneral(cmdBuffer_, tex); } deps = deps->next; } } // 2. Process all buffers { const Dependencies* deps = &dependencies; while (deps) { for (IBuffer* buf : deps->buffers) { if (!buf) { break; } const auto* vkBuf = static_cast(buf); ivkBufferBarrier(&ctx_.vf_, cmdBuffer_, vkBuf->getVkBuffer(), vkBuf->getBufferUsageFlags(), VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT); } deps = deps->next; } } } void ComputeCommandEncoder::dispatchThreadGroups(const Dimensions& threadgroupCount, const Dimensions& /*threadgroupSize*/, const Dependencies& dependencies) { IGL_PROFILER_FUNCTION(); IGL_ENSURE_VULKAN_CONTEXT_THREAD(&ctx_); if (!cps_) { IGL_DEBUG_ABORT("Did you forget to call bindComputePipelineState()?"); return; } processDependencies(dependencies); binder_.updateBindings(cps_->getVkPipelineLayout(), *cps_); // threadgroupSize is controlled inside compute shaders ctx_.vf_.vkCmdDispatch( cmdBuffer_, threadgroupCount.width, threadgroupCount.height, threadgroupCount.depth); } void ComputeCommandEncoder::pushDebugGroupLabel(const char* label, const igl::Color& color) const { IGL_DEBUG_ASSERT(label != nullptr && *label); ivkCmdBeginDebugUtilsLabel(&ctx_.vf_, cmdBuffer_, label, color.toFloatPtr()); } void ComputeCommandEncoder::insertDebugEventLabel(const char* label, const igl::Color& color) const { IGL_DEBUG_ASSERT(label != nullptr && *label); ivkCmdInsertDebugUtilsLabel(&ctx_.vf_, cmdBuffer_, label, color.toFloatPtr()); } void ComputeCommandEncoder::popDebugGroupLabel() const { ivkCmdEndDebugUtilsLabel(&ctx_.vf_, cmdBuffer_); } void ComputeCommandEncoder::bindUniform(const UniformDesc& /*uniformDesc*/, const void* /*data*/) { // DO NOT IMPLEMENT! // This is only for backends that MUST use single uniforms in some situations. IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } void ComputeCommandEncoder::bindTexture(uint32_t index, ITexture* texture) { IGL_PROFILER_FUNCTION(); IGL_DEBUG_ASSERT(texture); const igl::vulkan::Texture* tex = static_cast(texture); const igl::vulkan::VulkanTexture& vkTex = tex->getVulkanTexture(); const igl::vulkan::VulkanImage* vkImage = &vkTex.image_; IGL_DEBUG_ASSERT(vkImage); if (vkImage->isStorageImage()) { igl::vulkan::transitionToGeneral(cmdBuffer_, texture); } else if (vkImage->isSampledImage()) { igl::vulkan::transitionToShaderReadOnly(cmdBuffer_, texture); } else { IGL_DEBUG_ASSERT(false, "A texture should be Sampled or Storage"); } IGL_DEBUG_ASSERT(numRestoreLayouts_ < IGL_TEXTURE_SAMPLERS_MAX); restoreLayout_[numRestoreLayouts_] = vkImage; restoreLayoutAspectFlags_[numRestoreLayouts_] = vkTex.imageView_.getVkImageAspectFlags(); numRestoreLayouts_++; binder_.bindTexture(index, static_cast(texture)); } void ComputeCommandEncoder::bindImageTexture(uint32_t index, ITexture* texture, TextureFormat format) { IGL_PROFILER_FUNCTION(); IGL_DEBUG_ASSERT(texture); (void)format; auto* tex = static_cast(texture); const VulkanImage* vkImage = tex ? &tex->getVulkanTexture().image_ : nullptr; IGL_DEBUG_ASSERT(vkImage); if (!vkImage || !vkImage->isStorageImage()) { IGL_DEBUG_ABORT("A texture should be Storage"); return; } igl::vulkan::transitionToGeneral(cmdBuffer_, texture); IGL_DEBUG_ASSERT(numRestoreLayouts_ < IGL_TEXTURE_SAMPLERS_MAX); restoreLayout_[numRestoreLayouts_] = vkImage; restoreLayoutAspectFlags_[numRestoreLayouts_] = tex ? tex->getVulkanTexture().imageView_.getVkImageAspectFlags() : VK_IMAGE_ASPECT_NONE; numRestoreLayouts_++; binder_.bindStorageImage(index, tex); } void ComputeCommandEncoder::bindSamplerState(uint32_t index, ISamplerState* samplerState) { IGL_PROFILER_FUNCTION(); #if IGL_VULKAN_PRINT_COMMANDS IGL_LOG_INFO("%p bindSamplerState(%u)\n", cmdBuffer_, index); #endif // IGL_VULKAN_PRINT_COMMANDS binder_.bindSamplerState(index, static_cast(samplerState)); } void ComputeCommandEncoder::bindBuffer(uint32_t index, IBuffer* buffer, size_t offset, size_t bufferSize) { IGL_PROFILER_FUNCTION(); if (!IGL_DEBUG_VERIFY(buffer != nullptr)) { return; } auto* buf = static_cast(buffer); const bool isUniformBuffer = (buf->getBufferType() & BufferDesc::BufferTypeBits::Uniform) > 0; const bool isStorageBuffer = (buf->getBufferType() & BufferDesc::BufferTypeBits::Storage) > 0; const bool isUniformOrStorageBuffer = isUniformBuffer || isStorageBuffer; if (!IGL_DEBUG_VERIFY(isUniformOrStorageBuffer, "Did you forget to specify igl::BufferDesc::BufferTypeBits::Storage or " "BufferDesc::BufferTypeBits::Uniform on your buffer?")) { return; } binder_.bindBuffer(index, buf, offset, bufferSize); } void ComputeCommandEncoder::bindBytes(uint32_t /*index*/, const void* /*data*/, size_t /*length*/) { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } void ComputeCommandEncoder::bindPushConstants(const void* data, size_t length, size_t offset) { IGL_PROFILER_FUNCTION(); IGL_DEBUG_ASSERT(length % 4 == 0); // VUID-vkCmdPushConstants-size-00369: size must be a multiple // of 4 IGL_DEBUG_ASSERT(cps_, "Did you forget to call bindComputePipelineState()?"); IGL_DEBUG_ASSERT(cps_->pushConstantRange.size, "Currently bound compute pipeline state has no push constants"); IGL_DEBUG_ASSERT(offset + length <= cps_->pushConstantRange.offset + cps_->pushConstantRange.size, "Push constants size exceeded"); #if IGL_VULKAN_PRINT_COMMANDS IGL_LOG_INFO("%p vkCmdPushConstants(%u) - COMPUTE\n", cmdBuffer_, length); #endif // IGL_VULKAN_PRINT_COMMANDS ctx_.vf_.vkCmdPushConstants(cmdBuffer_, cps_->getVkPipelineLayout(), VK_SHADER_STAGE_COMPUTE_BIT, (uint32_t)offset, (uint32_t)length, data); } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/ComputeCommandEncoder.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include namespace igl { class IComputePipelineState; class ISamplerState; namespace vulkan { class ComputePipelineState; class VulkanImage; /// @brief Implements the igl::IComputeCommandEncoder interface for Vulkan class ComputeCommandEncoder : public IComputeCommandEncoder { public: ComputeCommandEncoder(const std::shared_ptr& commandBuffer, VulkanContext& ctx); ~ComputeCommandEncoder() override { IGL_DEBUG_ASSERT(!isEncoding_); // did you forget to call endEncoding()? endEncoding(); } ComputeCommandEncoder(const ComputeCommandEncoder&) = delete; ComputeCommandEncoder& operator=(const ComputeCommandEncoder&) = delete; ComputeCommandEncoder(ComputeCommandEncoder&&) = delete; ComputeCommandEncoder& operator=(ComputeCommandEncoder&&) = delete; void bindComputePipelineState( const std::shared_ptr& pipelineState) override; void dispatchThreadGroups(const Dimensions& threadgroupCount, const Dimensions& threadgroupSize, const Dependencies& dependencies) override; /// @brief Ends encoding for compute commands and transitions all images bound to this encoder /// back to `VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL` void endEncoding() override; void pushDebugGroupLabel(const char* label, const igl::Color& color) const override; void insertDebugEventLabel(const char* label, const igl::Color& color) const override; void popDebugGroupLabel() const override; /// @brief This is only for backends that MUST use single uniforms in some situations. Do not /// implement! void bindUniform(const UniformDesc& uniformDesc, const void* data) override; /// @brief Binds a texture and transitions it to `VK_IMAGE_LAYOUT_GENERAL`. If the texture is not /// a storage texture, this function is a no-op void bindTexture(uint32_t index, ITexture* texture) override; /// @brief Binds an image texture and transitions it to `VK_IMAGE_LAYOUT_GENERAL`. If the texture /// is not a storage texture, this function will assert. void bindImageTexture(uint32_t index, ITexture* texture, TextureFormat format) override; void bindSamplerState(uint32_t index, ISamplerState* samplerState) override; /// @brief Binds a buffer. If the buffer is not a storage buffer, this function is a no-op void bindBuffer(uint32_t index, IBuffer* buffer, size_t offset, size_t bufferSize) override; /// @brief Not implemented void bindBytes(uint32_t index, const void* data, size_t length) override; /// @brief Binds push constants pointed by `data` with `length` bytes starting at `offset`. /// `length` must be a multiple of 4. void bindPushConstants(const void* data, size_t length, size_t offset) override; /// @brief Returns the underlying Vulkan command buffer handle [[nodiscard]] VkCommandBuffer getVkCommandBuffer() const { return cmdBuffer_; } private: void processDependencies(const Dependencies& dependencies); private: VulkanContext& ctx_; VkCommandBuffer cmdBuffer_ = VK_NULL_HANDLE; bool isEncoding_ = false; ResourcesBinder binder_; std::array restoreLayout_{}; std::array restoreLayoutAspectFlags_{}; uint32_t numRestoreLayouts_ = 0; const igl::vulkan::ComputePipelineState* cps_ = nullptr; }; } // namespace vulkan } // namespace igl ================================================ FILE: src/igl/vulkan/ComputePipelineState.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include namespace igl::vulkan { ComputePipelineState::ComputePipelineState(const igl::vulkan::Device& device, ComputePipelineDesc desc) : PipelineState(device.getVulkanContext(), desc.shaderStages.get(), nullptr, 0, desc.debugName.c_str()), device_(device), desc_(std::move(desc)) {} ComputePipelineState ::~ComputePipelineState() { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_DESTROY); if (pipeline_ != VK_NULL_HANDLE) { const auto& ctx = device_.getVulkanContext(); ctx.deferredTask(std::packaged_task( [vf = &ctx.vf_, device = device_.getVulkanContext().getVkDevice(), pipeline = pipeline_]() { vf->vkDestroyPipeline(device, pipeline, nullptr); })); } if (pipelineLayout != VK_NULL_HANDLE) { const auto& ctx = device_.getVulkanContext(); ctx.deferredTask(std::packaged_task( [vf = &ctx.vf_, device = ctx.getVkDevice(), layout = pipelineLayout]() { vf->vkDestroyPipelineLayout(device, layout, nullptr); })); } } VkPipeline ComputePipelineState::getVkPipeline() const { const VulkanContext& ctx = device_.getVulkanContext(); if (ctx.config_.enableDescriptorIndexing) { // the bindless descriptor set layout can be changed in VulkanContext when the number of // existing textures increases if (lastBindlessVkDescriptorSetLayout != ctx.getBindlessVkDescriptorSetLayout()) { // there's a new descriptor set layout - drop the previous Vulkan pipeline VkDevice device = ctx.getVkDevice(); if (pipeline_ != VK_NULL_HANDLE) { ctx.deferredTask(std::packaged_task( [vf = &ctx.vf_, device, pipeline = pipeline_, layout = pipelineLayout]() { vf->vkDestroyPipeline(device, pipeline, nullptr); vf->vkDestroyPipelineLayout(device, layout, nullptr); })); } pipeline_ = VK_NULL_HANDLE; pipelineLayout = VK_NULL_HANDLE; lastBindlessVkDescriptorSetLayout = ctx.getBindlessVkDescriptorSetLayout(); } } if (pipeline_ != VK_NULL_HANDLE) { return pipeline_; } IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); // NOLINTBEGIN(readability-identifier-naming) // NOLINTNEXTLINE(modernize-avoid-c-arrays) const VkDescriptorSetLayout DSLs[] = { dslCombinedImageSamplers->getVkDescriptorSetLayout(), dslBuffers->getVkDescriptorSetLayout(), dslStorageImages->getVkDescriptorSetLayout(), ctx.getBindlessVkDescriptorSetLayout(), }; // NOLINTEND(readability-identifier-naming) const VkPipelineLayoutCreateInfo ci = { .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, .setLayoutCount = static_cast(ctx.config_.enableDescriptorIndexing ? IGL_ARRAY_NUM_ELEMENTS(DSLs) : IGL_ARRAY_NUM_ELEMENTS(DSLs) - 1u), .pSetLayouts = DSLs, .pushConstantRangeCount = info.hasPushConstants ? 1u : 0u, .pPushConstantRanges = info.hasPushConstants ? &pushConstantRange : nullptr, }; VkDevice device = ctx.getVkDevice(); VK_ASSERT(ctx.vf_.vkCreatePipelineLayout(device, &ci, nullptr, &pipelineLayout)); VK_ASSERT( ivkSetDebugObjectName(&ctx.vf_, device, VK_OBJECT_TYPE_PIPELINE_LAYOUT, (uint64_t)pipelineLayout, IGL_FORMAT("Pipeline Layout: {}", desc_.debugName.c_str()).c_str())); const auto& shaderModule = desc_.shaderStages->getComputeModule(); VulkanComputePipelineBuilder() .shaderStage(VkPipelineShaderStageCreateInfo{ .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, .stage = VK_SHADER_STAGE_COMPUTE_BIT, .module = igl::vulkan::ShaderModule::getVkShaderModule(shaderModule), .pName = shaderModule->info().entryPoint.c_str(), }) .build( ctx.vf_, device, ctx.pipelineCache_, pipelineLayout, &pipeline_, desc_.debugName.c_str()); return pipeline_; } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/ComputePipelineState.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::vulkan { class Device; class ComputePipelineState final : public IComputePipelineState, public PipelineState { public: ComputePipelineState(const igl::vulkan::Device& device, ComputePipelineDesc desc); ~ComputePipelineState() override; ComputePipelineState(const ComputePipelineState&) = delete; ComputePipelineState& operator=(const ComputePipelineState&) = delete; ComputePipelineState(ComputePipelineState&&) = delete; ComputePipelineState& operator=(ComputePipelineState&&) = delete; std::shared_ptr computePipelineReflection() override { return nullptr; } VkPipeline getVkPipeline() const; const ComputePipelineDesc& getComputePipelineDesc() const { return desc_; } private: const igl::vulkan::Device& device_; ComputePipelineDesc desc_; // a Vulkan pipeline owned by this ComputePipelineState object mutable VkPipeline pipeline_ = VK_NULL_HANDLE; }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/Device.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // Writes the shader code to disk for debugging. Used in `Device::createShaderModule()` #if IGL_SHADER_DUMP && IGL_DEBUG #include #include #endif // IGL_SHADER_DUMP && IGL_DEBUG namespace { #if IGL_SHADER_DUMP && IGL_DEBUG std::string sanitizeFileName(const std::string& fileName) { std::string result; for (const char c : fileName) { if (std::isalnum(c) || c == '.' || c == '_' || c == '-') { result += c; } else { result += '_'; } } return result; } #endif // IGL_SHADER_DUMP && IGL_DEBUG bool supportsFormat(const VulkanFunctionTable& vf, VkPhysicalDevice physicalDevice, VkFormat format) { VkFormatProperties properties; vf.vkGetPhysicalDeviceFormatProperties(physicalDevice, format, &properties); return properties.bufferFeatures != 0 || properties.linearTilingFeatures != 0 || properties.optimalTilingFeatures != 0; } VkShaderStageFlagBits shaderStageToVkShaderStage(igl::ShaderStage stage) { switch (stage) { case igl::ShaderStage::Vertex: return VK_SHADER_STAGE_VERTEX_BIT; case igl::ShaderStage::Fragment: return VK_SHADER_STAGE_FRAGMENT_BIT; case igl::ShaderStage::Compute: return VK_SHADER_STAGE_COMPUTE_BIT; case igl::ShaderStage::Task: return VK_SHADER_STAGE_TASK_BIT_EXT; case igl::ShaderStage::Mesh: return VK_SHADER_STAGE_MESH_BIT_EXT; }; return VK_SHADER_STAGE_FLAG_BITS_MAX_ENUM; } } // namespace namespace igl::vulkan { Device::Device(std::unique_ptr ctx) : ctx_(std::move(ctx)), platformDevice_(*this) {} std::shared_ptr Device::createCommandQueueInternal(const CommandQueueDesc& desc, Result* IGL_NULLABLE outResult) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); IGL_ENSURE_VULKAN_CONTEXT_THREAD(ctx_); Result::setOk(outResult); auto resource = std::make_shared(*this, desc); return resource; } std::unique_ptr Device::createBufferInternal( // NOLINT(bugprone-exception-escape) const BufferDesc& desc, Result* IGL_NULLABLE outResult) const noexcept { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); IGL_ENSURE_VULKAN_CONTEXT_THREAD(ctx_); auto buffer = std::make_unique(*this); const auto result = buffer->create(desc); if (!IGL_DEBUG_VERIFY(result.isOk())) { return nullptr; } if (!desc.data) { return buffer; } const auto uploadResult = buffer->upload(desc.data, BufferRange(desc.length, 0u)); IGL_DEBUG_ASSERT(uploadResult.isOk()); Result::setResult(outResult, uploadResult); if (hasResourceTracker()) { buffer->initResourceTracker(getResourceTracker(), desc.debugName); } return buffer; } std::shared_ptr Device::createDepthStencilStateInternal( const DepthStencilStateDesc& desc, Result* IGL_NULLABLE outResult) const { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); IGL_ENSURE_VULKAN_CONTEXT_THREAD(ctx_); Result::setOk(outResult); return std::make_shared(desc); } std::unique_ptr Device::createShaderStagesInternal(const ShaderStagesDesc& desc, Result* IGL_NULLABLE outResult) const { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); IGL_ENSURE_VULKAN_CONTEXT_THREAD(ctx_); auto shaderStages = std::make_unique(desc); if (shaderStages == nullptr) { Result::setResult( outResult, Result::Code::RuntimeError, "Could not instantiate shader stages."); } else if (!shaderStages->isValid()) { Result::setResult( outResult, Result::Code::ArgumentInvalid, "Missing required shader module(s)."); } else { Result::setOk(outResult); } if (hasResourceTracker()) { shaderStages->initResourceTracker(getResourceTracker(), desc.debugName); } return shaderStages; } std::shared_ptr Device::createSamplerStateInternal(const SamplerStateDesc& desc, Result* IGL_NULLABLE outResult) const { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); IGL_ENSURE_VULKAN_CONTEXT_THREAD(ctx_); auto samplerState = std::make_shared(const_cast(*this)); Result::setResult(outResult, samplerState->create(desc)); if (hasResourceTracker()) { samplerState->initResourceTracker(getResourceTracker(), desc.debugName); } return samplerState; } std::shared_ptr Device::createTextureInternal( // NOLINT(bugprone-exception-escape) const TextureDesc& desc, Result* IGL_NULLABLE outResult) const noexcept { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); IGL_ENSURE_VULKAN_CONTEXT_THREAD(ctx_); const auto sanitized = sanitize(desc); auto texture = std::make_shared(const_cast(*this), desc.format); const Result res = texture->create(sanitized); if (hasResourceTracker()) { texture->initResourceTracker(getResourceTracker(), desc.debugName); } Result::setResult(outResult, res); return res.isOk() ? texture : nullptr; } std::shared_ptr Device::createTextureView( // NOLINT(bugprone-exception-escape) std::shared_ptr texture, const TextureViewDesc& desc, Result* IGL_NULLABLE outResult) const noexcept { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); IGL_ENSURE_VULKAN_CONTEXT_THREAD(ctx_); if (!IGL_DEBUG_VERIFY(texture)) { Result::setResult(outResult, Result(Result::Code::ArgumentInvalid, "A base texture should be specified")); return {}; } const Texture& baseTexture = static_cast(*texture); auto newTexture = std::make_shared( const_cast(*this), desc.format == TextureFormat::Invalid ? baseTexture.getFormat() : desc.format); const Result res = newTexture->createView(baseTexture, desc); if (hasResourceTracker()) { newTexture->initResourceTracker(getResourceTracker(), desc.debugName); } Result::setResult(outResult, res); return res.isOk() ? newTexture : nullptr; } std::shared_ptr Device::createVertexInputStateInternal( const VertexInputStateDesc& desc, Result* IGL_NULLABLE outResult) const { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); IGL_ENSURE_VULKAN_CONTEXT_THREAD(ctx_); // VertexInputState is compiled into the RenderPipelineState at a later stage. For now, we just // have to store the description. Result::setOk(outResult); return std::make_shared(desc); } std::shared_ptr Device::createComputePipelineInternal( const ComputePipelineDesc& desc, Result* IGL_NULLABLE outResult) const { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); IGL_ENSURE_VULKAN_CONTEXT_THREAD(ctx_); if (IGL_DEBUG_VERIFY_NOT(desc.shaderStages == nullptr)) { Result::setResult(outResult, Result::Code::ArgumentInvalid, "Missing shader stages"); return nullptr; } if (!IGL_DEBUG_VERIFY(desc.shaderStages->getType() == ShaderStagesType::Compute)) { Result::setResult(outResult, Result::Code::ArgumentInvalid, "Shader stages not for compute"); return nullptr; } if (!IGL_DEBUG_VERIFY(desc.shaderStages->getComputeModule())) { Result::setResult(outResult, Result::Code::ArgumentInvalid, "Missing compute shader"); return nullptr; } Result::setOk(outResult); return std::make_shared(*this, desc); } std::shared_ptr Device::createRenderPipelineInternal( const RenderPipelineDesc& desc, Result* IGL_NULLABLE outResult) const { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); IGL_ENSURE_VULKAN_CONTEXT_THREAD(ctx_); if (IGL_DEBUG_VERIFY_NOT(desc.shaderStages == nullptr)) { Result::setResult(outResult, Result::Code::ArgumentInvalid, "Missing shader stages"); return nullptr; } if (!IGL_DEBUG_VERIFY(desc.shaderStages->getType() == ShaderStagesType::Render || desc.shaderStages->getType() == ShaderStagesType::RenderMeshShader)) { Result::setResult(outResult, Result::Code::ArgumentInvalid, "Shader stages not for render"); return nullptr; } const bool hasColorAttachments = !desc.targetDesc.colorAttachments.empty(); const bool hasDepthAttachment = desc.targetDesc.depthAttachmentFormat != TextureFormat::Invalid; const bool hasAnyAttachments = hasColorAttachments || hasDepthAttachment; if (!IGL_DEBUG_VERIFY(hasAnyAttachments)) { Result::setResult(outResult, Result::Code::ArgumentInvalid, "Need at least one attachment"); return nullptr; } if (desc.shaderStages->getType() == ShaderStagesType::Render && !IGL_DEBUG_VERIFY(desc.shaderStages->getVertexModule())) { Result::setResult(outResult, Result::Code::ArgumentInvalid, "Missing vertex shader"); return nullptr; } if (desc.shaderStages->getType() == ShaderStagesType::RenderMeshShader && !IGL_DEBUG_VERIFY(desc.shaderStages->getMeshModule())) { Result::setResult(outResult, Result::Code::ArgumentInvalid, "Missing mesh shader"); return nullptr; } if (!IGL_DEBUG_VERIFY(desc.shaderStages->getFragmentModule())) { Result::setResult(outResult, Result::Code::ArgumentInvalid, "Missing fragment shader"); return nullptr; } return std::make_shared(*this, desc); } std::shared_ptr Device::createShaderModuleInternal(const ShaderModuleDesc& desc, Result* IGL_NULLABLE outResult) const { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); IGL_ENSURE_VULKAN_CONTEXT_THREAD(ctx_); std::shared_ptr vulkanShaderModule; Result result; if (desc.input.type == ShaderInputType::Binary) { vulkanShaderModule = createShaderModule(desc.input.data, desc.input.length, desc.debugName, &result); } else { vulkanShaderModule = createShaderModule(desc.info.stage, desc.input.source, desc.debugName, &result); } if (!result.isOk()) { Result::setResult(outResult, std::move(result)); return nullptr; } Result::setResult(outResult, std::move(result)); auto shaderModule = std::make_shared(desc.info, std::move(vulkanShaderModule)); if (hasResourceTracker()) { shaderModule->initResourceTracker(getResourceTracker(), desc.debugName); } return shaderModule; } std::shared_ptr Device::createShaderModule(const void* IGL_NULLABLE data, size_t length, const std::string& debugName, Result* IGL_NULLABLE outResult) const { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); IGL_ENSURE_VULKAN_CONTEXT_THREAD(ctx_); #if IGL_SHADER_DUMP && IGL_DEBUG uint64_t hash = 0; IGL_DEBUG_ASSERT(length % sizeof(uint32_t) == 0); auto words = reinterpret_cast(data); for (int i = 0; i < (length / sizeof(uint32_t)); i++) { hash ^= std::hash()(words[i]); } const std::string filename = IGL_FORMAT( "{}{}{}.spv", IGL_SHADER_DUMP_PATH, sanitizeFileName(debugName), std::to_string(hash)); IGL_LOG_INFO("Dumping shader to: %s", filename.c_str()); if (!std::filesystem::exists(filename)) { std::ofstream spirvFile; spirvFile.open(filename, std::ios::out | std::ios::binary); for (int i = 0; i < length / (int)sizeof(uint32_t); i++) { spirvFile.write(reinterpret_cast(&words[i]), sizeof(uint32_t)); } spirvFile.close(); } #endif // IGL_SHADER_DUMP && IGL_DEBUG VkShaderModule vkShaderModule = VK_NULL_HANDLE; const VkShaderModuleCreateInfo ci = { .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, .codeSize = length, .pCode = static_cast(data), }; const VkResult result = ctx_->vf_.vkCreateShaderModule(ctx_->getVkDevice(), &ci, nullptr, &vkShaderModule); setResultFrom(outResult, result); if (result != VK_SUCCESS) { return nullptr; } if (!debugName.empty()) { // set debug name VK_ASSERT(ivkSetDebugObjectName(&ctx_->vf_, ctx_->getVkDevice(), VK_OBJECT_TYPE_SHADER_MODULE, (uint64_t)vkShaderModule, debugName.c_str())); } IGL_DEBUG_ASSERT(vkShaderModule != VK_NULL_HANDLE); return std::make_shared( ctx_->vf_, ctx_->getVkDevice(), vkShaderModule, util::getReflectionData(reinterpret_cast(data), length)); } std::shared_ptr Device::createShaderModule(ShaderStage stage, const char* IGL_NULLABLE source, const std::string& debugName, Result* IGL_NULLABLE outResult) const { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); IGL_ENSURE_VULKAN_CONTEXT_THREAD(ctx_); const VkShaderStageFlagBits vkStage = shaderStageToVkShaderStage(stage); IGL_DEBUG_ASSERT(vkStage != VK_SHADER_STAGE_FLAG_BITS_MAX_ENUM); IGL_DEBUG_ASSERT(source); std::string sourcePatched; if (!source || !*source) { Result::setResult(outResult, Result::Code::ArgumentNull, "Shader source is empty"); return nullptr; } if (strstr(source, "#version ") == nullptr) { std::string extraExtensions = ctx_->config_.enableDescriptorIndexing ? "#extension GL_EXT_nonuniform_qualifier : require\n" : ""; // GL_EXT_debug_printf extension if (ctx_->features_.has_VK_KHR_shader_non_semantic_info) { extraExtensions += "#extension GL_EXT_debug_printf : enable\n"; } if (ctx_->features_.featuresShaderFloat16Int8.shaderFloat16 == VK_TRUE) { extraExtensions += "#extension GL_EXT_shader_explicit_arithmetic_types_float16 : require\n"; } if (ctx_->features_.has_VK_KHR_buffer_device_address) { extraExtensions += "#extension GL_EXT_buffer_reference : require\n"; extraExtensions += "#extension GL_EXT_buffer_reference_uvec2 : require\n"; } const std::string bindlessTexturesSource = ctx_->config_.enableDescriptorIndexing ? R"( // everything - indexed by global texture/sampler id layout (set = 3, binding = 0) uniform texture2D kTextures2D[]; layout (set = 3, binding = 1) uniform texture2DArray kTextures2DArray[]; layout (set = 3, binding = 2) uniform texture3D kTextures3D[]; layout (set = 3, binding = 3) uniform textureCube kTexturesCube[]; layout (set = 3, binding = 4) uniform sampler kSamplers[]; layout (set = 3, binding = 5) uniform samplerShadow kSamplersShadow[]; // binding #6 is reserved for STORAGE_IMAGEs: check VulkanContext.cpp )" : ""; // there's no header provided in the shader source, let's insert our own header if (vkStage == VK_SHADER_STAGE_VERTEX_BIT || vkStage == VK_SHADER_STAGE_COMPUTE_BIT) { sourcePatched += R"( #version 460 )" + extraExtensions; } if (vkStage == VK_SHADER_STAGE_FRAGMENT_BIT) { sourcePatched += R"( #version 460 )" + extraExtensions + bindlessTexturesSource; } sourcePatched += source; source = sourcePatched.c_str(); } glslang_resource_t glslangResource = {}; glslangGetDefaultResource(&glslangResource); ivkUpdateGlslangResource(&glslangResource, &ctx_->getVkPhysicalDeviceProperties(), &ctx_->getvkPhysicalDeviceMeshShaderPropertiesEXT()); std::vector spirv; const Result result = glslang::compileShader(stage, source, spirv, &glslangResource); VkShaderModule vkShaderModule = VK_NULL_HANDLE; const VkShaderModuleCreateInfo ci = { .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, .codeSize = spirv.size() * sizeof(uint32_t), .pCode = spirv.data(), }; VK_ASSERT(ctx_->vf_.vkCreateShaderModule(ctx_->getVkDevice(), &ci, nullptr, &vkShaderModule)); Result::setResult(outResult, result); if (!result.isOk()) { return nullptr; } IGL_DEBUG_ASSERT(vkShaderModule != VK_NULL_HANDLE); if (!debugName.empty()) { // set debug name VK_ASSERT(ivkSetDebugObjectName(&ctx_->vf_, ctx_->getVkDevice(), VK_OBJECT_TYPE_SHADER_MODULE, (uint64_t)vkShaderModule, debugName.c_str())); } return std::make_shared( ctx_->vf_, ctx_->getVkDevice(), vkShaderModule, util::getReflectionData(spirv.data(), spirv.size() * sizeof(uint32_t))); } std::shared_ptr Device::createFramebufferInternal(const FramebufferDesc& desc, Result* IGL_NULLABLE outResult) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); IGL_ENSURE_VULKAN_CONTEXT_THREAD(ctx_); auto resource = std::make_shared(*this, desc); Result::setOk(outResult); if (hasResourceTracker()) { resource->initResourceTracker(getResourceTracker(), desc.debugName); } return resource; } base::IFramebufferInterop* IGL_NULLABLE Device::createFramebufferInterop(const base::FramebufferInteropDesc& desc) { auto framebuffer = createFramebufferFromBaseDesc(desc); if (!framebuffer) { return nullptr; } return new (std::nothrow) FramebufferWrapper(std::move(framebuffer)); } const PlatformDevice& Device::getPlatformDeviceInternal() const noexcept { return platformDevice_; } size_t Device::getCurrentDrawCountInternal() const { return ctx_->drawCallCount_; } size_t Device::getShaderCompilationCountInternal() const { return ctx_->shaderCompilationCount_; } std::unique_ptr Device::createShaderLibraryInternal(const ShaderLibraryDesc& desc, Result* IGL_NULLABLE outResult) const { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); IGL_ENSURE_VULKAN_CONTEXT_THREAD(ctx_); ctx_->shaderCompilationCount_++; if (IGL_DEBUG_VERIFY_NOT(desc.moduleInfo.empty())) { Result::setResult(outResult, Result::Code::ArgumentInvalid); return nullptr; } Result result; std::shared_ptr vulkanShaderModule; if (desc.input.type == ShaderInputType::Binary) { vulkanShaderModule = createShaderModule(desc.input.data, desc.input.length, desc.debugName, &result); } else { if (desc.moduleInfo.size() > 1) { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); Result::setResult(outResult, Result::Code::Unsupported); return nullptr; } vulkanShaderModule = createShaderModule( desc.moduleInfo.front().stage, desc.input.source, desc.debugName, &result); } if (!result.isOk()) { Result::setResult(outResult, std::move(result)); return nullptr; } std::vector> modules; modules.reserve(desc.moduleInfo.size()); for (const auto& info : desc.moduleInfo) { modules.emplace_back(std::make_shared(info, vulkanShaderModule)); } Result::setResult(outResult, std::move(result)); auto shaderLibrary = std::make_unique(std::move(modules)); if (hasResourceTracker()) { shaderLibrary->initResourceTracker(getResourceTracker(), desc.debugName); } return shaderLibrary; } bool Device::hasFeatureInternal(DeviceFeatures feature) const { IGL_PROFILER_FUNCTION(); VkPhysicalDevice physicalDevice = ctx_->vkPhysicalDevice_; IGL_DEBUG_ASSERT(physicalDevice != VK_NULL_HANDLE); const VkPhysicalDeviceProperties& deviceProperties = ctx_->getVkPhysicalDeviceProperties(); switch (feature) { case DeviceFeatures::MultiSample: case DeviceFeatures::MultiSampleResolve: return deviceProperties.limits.framebufferColorSampleCounts > VK_SAMPLE_COUNT_1_BIT; case DeviceFeatures::TextureFilterAnisotropic: return deviceProperties.limits.maxSamplerAnisotropy > 1; case DeviceFeatures::MapBufferRange: return true; case DeviceFeatures::MeshShaders: return ctx_->features_.has_VK_EXT_mesh_shader; case DeviceFeatures::MultipleRenderTargets: return deviceProperties.limits.maxColorAttachments > 1; case DeviceFeatures::StandardDerivative: return true; case DeviceFeatures::StandardDerivativeExt: return false; case DeviceFeatures::TextureFormatRG: return supportsFormat(ctx_->vf_, physicalDevice, VK_FORMAT_R8G8_UNORM); case DeviceFeatures::TextureFormatRGB: return supportsFormat(ctx_->vf_, physicalDevice, VK_FORMAT_R8G8B8_SRGB); case DeviceFeatures::ReadWriteFramebuffer: return true; case DeviceFeatures::TextureNotPot: return true; case DeviceFeatures::UniformBlocks: return true; case DeviceFeatures::TextureHalfFloat: return supportsFormat(ctx_->vf_, physicalDevice, VK_FORMAT_R16G16B16A16_SFLOAT) || supportsFormat(ctx_->vf_, physicalDevice, VK_FORMAT_R16_SFLOAT); case DeviceFeatures::TextureFloat: return supportsFormat(ctx_->vf_, physicalDevice, VK_FORMAT_R32G32B32A32_SFLOAT) || supportsFormat(ctx_->vf_, physicalDevice, VK_FORMAT_R32_SFLOAT); case DeviceFeatures::Texture2DArray: case DeviceFeatures::Texture3D: return true; case DeviceFeatures::StorageBuffers: return true; case DeviceFeatures::ShaderTextureLod: return true; case DeviceFeatures::ShaderTextureLodExt: return false; case DeviceFeatures::DepthShaderRead: return true; case DeviceFeatures::DepthCompare: return true; case DeviceFeatures::MinMaxBlend: return true; case DeviceFeatures::TextureExternalImage: return false; case DeviceFeatures::Compute: return true; case DeviceFeatures::CopyBuffer: return true; case DeviceFeatures::ExplicitBinding: return true; case DeviceFeatures::ExplicitBindingExt: return false; case DeviceFeatures::ExternalMemoryObjects: return true; case DeviceFeatures::TextureBindless: return ctx_->vkPhysicalDeviceDescriptorIndexingProperties_ .shaderSampledImageArrayNonUniformIndexingNative == VK_TRUE; case DeviceFeatures::PushConstants: return true; case DeviceFeatures::BufferDeviceAddress: return true; case DeviceFeatures::Multiview: return ctx_->features().featuresMultiview.multiview == VK_TRUE; case DeviceFeatures::MultiViewMultisample: return ctx_->features().featuresMultiview.multiview == VK_TRUE && deviceProperties.limits.framebufferColorSampleCounts > VK_SAMPLE_COUNT_1_BIT; case DeviceFeatures::BindUniform: return false; case DeviceFeatures::TexturePartialMipChain: return true; case DeviceFeatures::BufferRing: return false; case DeviceFeatures::BufferNoCopy: return false; case DeviceFeatures::ShaderLibrary: return true; case DeviceFeatures::BindBytes: return false; case DeviceFeatures::TextureArrayExt: return false; case DeviceFeatures::SRGB: return true; case DeviceFeatures::SRGBSwapchain: return true; // on Metal and Vulkan, the framebuffer pixel format dictates sRGB control. case DeviceFeatures::SRGBWriteControl: return false; case DeviceFeatures::SamplerMinMaxLod: return true; case DeviceFeatures::DrawFirstIndexFirstVertex: return true; case DeviceFeatures::DrawIndexedIndirect: return true; case DeviceFeatures::DrawInstanced: return true; case DeviceFeatures::Indices8Bit: return ctx_->features_.has_VK_EXT_index_type_uint8; case DeviceFeatures::ValidationLayersEnabled: return ctx_->areValidationLayersEnabled(); case DeviceFeatures::TextureViews: return true; case DeviceFeatures::Timers: return false; case DeviceFeatures::TimestampQueries: return false; } IGL_DEBUG_ABORT("DeviceFeatures value not handled: %d", (int)feature); return false; } bool Device::hasRequirementInternal(DeviceRequirement requirement) const { IGL_PROFILER_FUNCTION(); switch (requirement) { case DeviceRequirement::ExplicitBindingExtReq: case DeviceRequirement::StandardDerivativeExtReq: case DeviceRequirement::TextureArrayExtReq: case DeviceRequirement::TextureFormatRGExtReq: case DeviceRequirement::ShaderTextureLodExtReq: return false; }; assert(false); return false; } bool Device::getFeatureLimitsInternal(DeviceFeatureLimits featureLimits, size_t& result) const { IGL_PROFILER_FUNCTION(); const VkPhysicalDeviceLimits& limits = ctx_->getVkPhysicalDeviceProperties().limits; switch (featureLimits) { case DeviceFeatureLimits::MaxTextureDimension1D2D: result = std::min(limits.maxImageDimension1D, limits.maxImageDimension2D); return true; case DeviceFeatureLimits::MaxCubeMapDimension: result = limits.maxImageDimensionCube; return true; case DeviceFeatureLimits::MaxStorageBufferBytes: result = limits.maxStorageBufferRange; return true; case DeviceFeatureLimits::MaxVertexUniformVectors: case DeviceFeatureLimits::MaxFragmentUniformVectors: case DeviceFeatureLimits::MaxUniformBufferBytes: result = limits.maxUniformBufferRange; return true; case DeviceFeatureLimits::MaxPushConstantBytes: result = limits.maxPushConstantsSize; return true; case DeviceFeatureLimits::MaxMultisampleCount: { const VkSampleCountFlags sampleCounts = limits.framebufferColorSampleCounts; if ((sampleCounts & VK_SAMPLE_COUNT_64_BIT) != 0) { result = 64; } else if ((sampleCounts & VK_SAMPLE_COUNT_32_BIT) != 0) { result = 32; } else if ((sampleCounts & VK_SAMPLE_COUNT_16_BIT) != 0) { result = 16; } else if ((sampleCounts & VK_SAMPLE_COUNT_8_BIT) != 0) { result = 8; } else if ((sampleCounts & VK_SAMPLE_COUNT_4_BIT) != 0) { result = 4; } else if ((sampleCounts & VK_SAMPLE_COUNT_2_BIT) != 0) { result = 2; } else { result = 1; } return true; } case DeviceFeatureLimits::PushConstantsAlignment: result = 4; return true; case DeviceFeatureLimits::ShaderStorageBufferOffsetAlignment: result = limits.minStorageBufferOffsetAlignment; return true; case DeviceFeatureLimits::BufferAlignment: result = limits.minUniformBufferOffsetAlignment; return true; case DeviceFeatureLimits::BufferNoCopyAlignment: result = 0; return true; case DeviceFeatureLimits::MaxBindBytesBytes: result = 0; return true; case DeviceFeatureLimits::MaxTextureDimension3D: result = limits.maxImageDimension3D; return true; case DeviceFeatureLimits::MaxComputeWorkGroupSizeX: result = limits.maxComputeWorkGroupSize[0]; return true; case DeviceFeatureLimits::MaxComputeWorkGroupSizeY: result = limits.maxComputeWorkGroupSize[1]; return true; case DeviceFeatureLimits::MaxComputeWorkGroupSizeZ: result = limits.maxComputeWorkGroupSize[2]; return true; case DeviceFeatureLimits::MaxComputeWorkGroupInvocations: result = limits.maxComputeWorkGroupInvocations; return true; case DeviceFeatureLimits::MaxVertexInputAttributes: result = limits.maxVertexInputAttributes; return true; case DeviceFeatureLimits::MaxColorAttachments: result = limits.maxColorAttachments; return true; // D3D12-specific descriptor heap limits - not applicable to Vulkan case DeviceFeatureLimits::MaxDescriptorHeapCbvSrvUav: case DeviceFeatureLimits::MaxDescriptorHeapSamplers: case DeviceFeatureLimits::MaxDescriptorHeapRtvs: case DeviceFeatureLimits::MaxDescriptorHeapDsvs: result = 0; return false; } IGL_DEBUG_ABORT("DeviceFeatureLimits value not handled: %d", (int)featureLimits); result = 0; return false; } ICapabilities::TextureFormatCapabilities Device::getTextureFormatCapabilitiesInternal( TextureFormat format) const { IGL_PROFILER_FUNCTION(); const VkFormat vkFormat = igl::vulkan::textureFormatToVkFormat(format); if (vkFormat == VK_FORMAT_UNDEFINED) { return TextureFormatCapabilityBits::Unsupported; } if (vkFormat == VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG || vkFormat == VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG || vkFormat == VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG || vkFormat == VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG || vkFormat == VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG || vkFormat == VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG || vkFormat == VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG || vkFormat == VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG) { // Deprecated without replacement // https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_IMG_format_pvrtc.html return TextureFormatCapabilityBits::Unsupported; } VkFormatProperties properties; ctx_->vf_.vkGetPhysicalDeviceFormatProperties(ctx_->vkPhysicalDevice_, vkFormat, &properties); const VkFormatFeatureFlags features = properties.optimalTilingFeatures; TextureFormatCapabilities caps = TextureFormatCapabilityBits::Unsupported; if (features & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) { caps |= TextureFormatCapabilityBits::Sampled; } if (features & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) { caps |= TextureFormatCapabilityBits::Storage; } if (features & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) { caps |= TextureFormatCapabilityBits::SampledFiltered; } if (features & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) { caps |= TextureFormatCapabilityBits::Attachment; } if (features & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) { caps |= TextureFormatCapabilityBits::Attachment; } // Special handling for when a format can be sampled AND used as an attachment if (contains(caps, TextureFormatCapabilityBits::Sampled) && contains(caps, TextureFormatCapabilityBits::Attachment)) { caps |= TextureFormatCapabilityBits::SampledAttachment; } return caps; } ShaderVersion Device::getShaderVersionInternal() const { return {.family = ShaderFamily::SpirV, .majorVersion = 1, .minorVersion = 5, .extra = 0}; } BackendVersion Device::getBackendVersionInternal() const { const uint32_t apiVersion = ctx_->vkPhysicalDeviceProperties2_.properties.apiVersion; return { .flavor = BackendFlavor::Vulkan, .majorVersion = static_cast(VK_API_VERSION_MAJOR(apiVersion)), .minorVersion = static_cast(VK_API_VERSION_MINOR(apiVersion)), }; } Holder Device::createBindGroupInternal( const igl::BindGroupTextureDesc& desc, const IRenderPipelineState* IGL_NULLABLE compatiblePipeline, Result* IGL_NULLABLE outResult) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); IGL_DEBUG_ASSERT(ctx_); IGL_DEBUG_ASSERT(!desc.debugName.empty(), "Each bind group should have a debug name"); IGL_ENSURE_VULKAN_CONTEXT_THREAD(ctx_); return {this, ctx_->createBindGroup(desc, compatiblePipeline, outResult)}; } Holder Device::createBindGroupInternal(const igl::BindGroupBufferDesc& desc, Result* IGL_NULLABLE outResult) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); IGL_DEBUG_ASSERT(ctx_); IGL_DEBUG_ASSERT(!desc.debugName.empty(), "Each bind group should have a debug name"); IGL_ENSURE_VULKAN_CONTEXT_THREAD(ctx_); return {this, ctx_->createBindGroup(desc, outResult)}; } std::shared_ptr Device::createTimer(Result* IGL_NULLABLE outResult) const noexcept { if (outResult) { *outResult = Result(Result::Code::Unsupported, "Timer is not supported on Vulkan"); } return nullptr; } void Device::destroyInternal(BindGroupTextureHandle handle) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_DESTROY); IGL_DEBUG_ASSERT(ctx_); IGL_ENSURE_VULKAN_CONTEXT_THREAD(ctx_); ctx_->destroy(handle); } void Device::destroyInternal(BindGroupBufferHandle handle) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_DESTROY); IGL_DEBUG_ASSERT(ctx_); IGL_ENSURE_VULKAN_CONTEXT_THREAD(ctx_); ctx_->destroy(handle); } void Device::destroyInternal(SamplerHandle handle) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_DESTROY); IGL_DEBUG_ASSERT(ctx_); IGL_ENSURE_VULKAN_CONTEXT_THREAD(ctx_); ctx_->destroy(handle); } void Device::setCurrentThreadInternal() { IGL_PROFILER_FUNCTION(); IGL_DEBUG_ASSERT(ctx_); ctx_->setCurrentContextThread(); } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/Device.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include #include #include namespace igl::vulkan { class VulkanShaderModule; /// @brief Implements the igl::IDevice interface for Vulkan class Device final : public IDevice { public: explicit Device(std::unique_ptr ctx); ~Device() override = default; [[nodiscard]] Holder createBindGroup( const BindGroupTextureDesc& desc, const IRenderPipelineState* IGL_NULLABLE compatiblePipeline, Result* IGL_NULLABLE outResult) override; [[nodiscard]] Holder createBindGroup(const BindGroupBufferDesc& desc, Result* IGL_NULLABLE outResult) override; void destroy(BindGroupTextureHandle handle) override; void destroy(BindGroupBufferHandle handle) override; void destroy(SamplerHandle handle) override; // Command Queue [[nodiscard]] std::shared_ptr createCommandQueue(const CommandQueueDesc& desc, Result* IGL_NULLABLE outResult) noexcept override; // Resources [[nodiscard]] std::unique_ptr createBuffer(const BufferDesc& desc, Result* IGL_NULLABLE outResult) const noexcept override; [[nodiscard]] std::shared_ptr createDepthStencilState( const DepthStencilStateDesc& desc, Result* IGL_NULLABLE outResult) const override; [[nodiscard]] std::unique_ptr createShaderStages(const ShaderStagesDesc& desc, Result* IGL_NULLABLE outResult) const override; [[nodiscard]] std::shared_ptr createSamplerState(const SamplerStateDesc& desc, Result* IGL_NULLABLE outResult) const override; [[nodiscard]] std::shared_ptr createTexture(const TextureDesc& desc, Result* IGL_NULLABLE outResult) const noexcept override; [[nodiscard]] std::shared_ptr createTextureView(std::shared_ptr texture, const TextureViewDesc& desc, Result* IGL_NULLABLE outResult) const noexcept override; std::shared_ptr createTimer(Result* IGL_NULLABLE outResult) const noexcept override; [[nodiscard]] std::shared_ptr createVertexInputState( const VertexInputStateDesc& desc, Result* IGL_NULLABLE outResult) const override; // Pipelines [[nodiscard]] std::shared_ptr createComputePipeline( const ComputePipelineDesc& desc, Result* IGL_NULLABLE outResult) const override; [[nodiscard]] std::shared_ptr createRenderPipeline( const RenderPipelineDesc& desc, Result* IGL_NULLABLE outResult) const override; // Shaders [[nodiscard]] std::unique_ptr createShaderLibrary(const ShaderLibraryDesc& desc, Result* IGL_NULLABLE outResult) const override; [[nodiscard]] std::shared_ptr createShaderModule(const ShaderModuleDesc& desc, Result* IGL_NULLABLE outResult) const override; [[nodiscard]] std::shared_ptr createFramebuffer(const FramebufferDesc& desc, Result* IGL_NULLABLE outResult) override; // base::IDeviceBase [[nodiscard]] base::IFramebufferInterop* IGL_NULLABLE createFramebufferInterop(const base::FramebufferInteropDesc& desc) override; // Platform-specific extensions [[nodiscard]] const PlatformDevice& getPlatformDevice() const noexcept override; // ICapabilities [[nodiscard]] bool hasFeature(DeviceFeatures feature) const override; [[nodiscard]] bool hasRequirement(DeviceRequirement requirement) const override; bool getFeatureLimits(DeviceFeatureLimits featureLimits, size_t& result) const override; [[nodiscard]] TextureFormatCapabilities getTextureFormatCapabilities( TextureFormat format) const override; [[nodiscard]] ShaderVersion getShaderVersion() const override; [[nodiscard]] BackendVersion getBackendVersion() const override; [[nodiscard]] BackendType getBackendType() const override; [[nodiscard]] size_t getCurrentDrawCount() const override; [[nodiscard]] size_t getShaderCompilationCount() const override; void setCurrentThread() override; VulkanContext& getVulkanContext() { return *ctx_; } [[nodiscard]] const VulkanContext& getVulkanContext() const { return *ctx_; } [[nodiscard]] void* IGL_NULLABLE getNativeDevice() const override { return ctx_->getVkDevice(); } private: std::shared_ptr createShaderModule(const void* IGL_NULLABLE data, size_t length, const std::string& debugName, Result* IGL_NULLABLE outResult) const; std::shared_ptr createShaderModule(ShaderStage stage, const char* IGL_NULLABLE source, const std::string& debugName, Result* IGL_NULLABLE outResult) const; [[nodiscard]] Holder createBindGroupInternal( const BindGroupTextureDesc& desc, const IRenderPipelineState* IGL_NULLABLE compatiblePipeline, Result* IGL_NULLABLE outResult); [[nodiscard]] Holder createBindGroupInternal( const BindGroupBufferDesc& desc, Result* IGL_NULLABLE outResult); void destroyInternal(BindGroupTextureHandle handle); void destroyInternal(BindGroupBufferHandle handle); void destroyInternal(SamplerHandle handle); // Command Queue std::shared_ptr createCommandQueueInternal(const CommandQueueDesc& desc, Result* IGL_NULLABLE outResult); // Resources std::unique_ptr createBufferInternal(const BufferDesc& desc, Result* IGL_NULLABLE outResult) const noexcept; std::shared_ptr createDepthStencilStateInternal( const DepthStencilStateDesc& desc, Result* IGL_NULLABLE outResult) const; std::unique_ptr createShaderStagesInternal(const ShaderStagesDesc& desc, Result* IGL_NULLABLE outResult) const; std::shared_ptr createSamplerStateInternal(const SamplerStateDesc& desc, Result* IGL_NULLABLE outResult) const; std::shared_ptr createTextureInternal(const TextureDesc& desc, Result* IGL_NULLABLE outResult) const noexcept; std::shared_ptr createVertexInputStateInternal( const VertexInputStateDesc& desc, Result* IGL_NULLABLE outResult) const; // Pipelines std::shared_ptr createComputePipelineInternal( const ComputePipelineDesc& desc, Result* IGL_NULLABLE outResult) const; std::shared_ptr createRenderPipelineInternal(const RenderPipelineDesc& desc, Result* IGL_NULLABLE outResult) const; // Shaders std::unique_ptr createShaderLibraryInternal(const ShaderLibraryDesc& desc, Result* IGL_NULLABLE outResult) const; std::shared_ptr createShaderModuleInternal(const ShaderModuleDesc& desc, Result* IGL_NULLABLE outResult) const; std::shared_ptr createFramebufferInternal(const FramebufferDesc& desc, Result* IGL_NULLABLE outResult); // Platform-specific extensions [[nodiscard]] const PlatformDevice& getPlatformDeviceInternal() const noexcept; // ICapabilities [[nodiscard]] bool hasFeatureInternal(DeviceFeatures feature) const; [[nodiscard]] bool hasRequirementInternal(DeviceRequirement requirement) const; bool getFeatureLimitsInternal(DeviceFeatureLimits featureLimits, size_t& result) const; [[nodiscard]] TextureFormatCapabilities getTextureFormatCapabilitiesInternal( TextureFormat format) const; [[nodiscard]] ShaderVersion getShaderVersionInternal() const; [[nodiscard]] BackendVersion getBackendVersionInternal() const; [[nodiscard]] size_t getCurrentDrawCountInternal() const; [[nodiscard]] size_t getShaderCompilationCountInternal() const; void setCurrentThreadInternal(); std::unique_ptr ctx_; PlatformDevice platformDevice_; }; /// Inline, passthrough implementations of virtual methods to work around mixing rtti and no-rtti /// targets on iOS and Android [[nodiscard]] inline Holder Device::createBindGroup( const BindGroupTextureDesc& desc, const IRenderPipelineState* IGL_NULLABLE compatiblePipeline, Result* IGL_NULLABLE outResult) { return createBindGroupInternal(desc, compatiblePipeline, outResult); } [[nodiscard]] inline Holder Device::createBindGroup( const BindGroupBufferDesc& desc, Result* IGL_NULLABLE outResult) { return createBindGroupInternal(desc, outResult); } void inline Device::destroy(BindGroupTextureHandle handle) { destroyInternal(handle); } void inline Device::destroy(BindGroupBufferHandle handle) { destroyInternal(handle); } void inline Device::destroy(SamplerHandle handle) { destroyInternal(handle); } [[nodiscard]] inline std::shared_ptr Device::createCommandQueue( const CommandQueueDesc& desc, Result* IGL_NULLABLE outResult) noexcept { return createCommandQueueInternal(desc, outResult); } [[nodiscard]] inline std::unique_ptr Device::createBuffer(const BufferDesc& desc, Result* IGL_NULLABLE outResult) const noexcept { return createBufferInternal(desc, outResult); } [[nodiscard]] inline std::shared_ptr Device::createDepthStencilState( const DepthStencilStateDesc& desc, Result* IGL_NULLABLE outResult) const { return createDepthStencilStateInternal(desc, outResult); } [[nodiscard]] inline std::unique_ptr Device::createShaderStages( const ShaderStagesDesc& desc, Result* IGL_NULLABLE outResult) const { return createShaderStagesInternal(desc, outResult); } [[nodiscard]] inline std::shared_ptr Device::createSamplerState( const SamplerStateDesc& desc, Result* IGL_NULLABLE outResult) const { return createSamplerStateInternal(desc, outResult); } [[nodiscard]] inline std::shared_ptr Device::createTexture(const TextureDesc& desc, Result* IGL_NULLABLE outResult) const noexcept { return createTextureInternal(desc, outResult); } [[nodiscard]] inline std::shared_ptr Device::createVertexInputState( const VertexInputStateDesc& desc, Result* IGL_NULLABLE outResult) const { return createVertexInputStateInternal(desc, outResult); } [[nodiscard]] inline std::shared_ptr Device::createComputePipeline( const ComputePipelineDesc& desc, Result* IGL_NULLABLE outResult) const { return createComputePipelineInternal(desc, outResult); } [[nodiscard]] inline std::shared_ptr Device::createRenderPipeline( const RenderPipelineDesc& desc, Result* IGL_NULLABLE outResult) const { return createRenderPipelineInternal(desc, outResult); } [[nodiscard]] inline std::unique_ptr Device::createShaderLibrary( const ShaderLibraryDesc& desc, Result* IGL_NULLABLE outResult) const { return createShaderLibraryInternal(desc, outResult); } [[nodiscard]] inline std::shared_ptr Device::createShaderModule( const ShaderModuleDesc& desc, Result* IGL_NULLABLE outResult) const { return createShaderModuleInternal(desc, outResult); } [[nodiscard]] inline std::shared_ptr Device::createFramebuffer( const FramebufferDesc& desc, Result* IGL_NULLABLE outResult) { return createFramebufferInternal(desc, outResult); } // Platform-specific extensions [[nodiscard]] inline const PlatformDevice& Device::getPlatformDevice() const noexcept { return getPlatformDeviceInternal(); } [[nodiscard]] inline bool Device::hasFeature(DeviceFeatures feature) const { return hasFeatureInternal(feature); } [[nodiscard]] inline bool Device::hasRequirement(DeviceRequirement requirement) const { return hasRequirementInternal(requirement); } inline bool Device::getFeatureLimits(DeviceFeatureLimits featureLimits, size_t& result) const { return getFeatureLimitsInternal(featureLimits, result); } [[nodiscard]] inline ICapabilities::TextureFormatCapabilities Device::getTextureFormatCapabilities( TextureFormat format) const { return getTextureFormatCapabilitiesInternal(format); } [[nodiscard]] inline ShaderVersion Device::getShaderVersion() const { return getShaderVersionInternal(); } [[nodiscard]] inline BackendVersion Device::getBackendVersion() const { return getBackendVersionInternal(); } [[nodiscard]] inline BackendType Device::getBackendType() const { return BackendType::Vulkan; } [[nodiscard]] inline size_t Device::getCurrentDrawCount() const { return getCurrentDrawCountInternal(); } [[nodiscard]] inline size_t Device::getShaderCompilationCount() const { return getShaderCompilationCountInternal(); } inline void Device::setCurrentThread() { setCurrentThreadInternal(); } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/Framebuffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "Framebuffer.h" #include #include #include #include #include #include #include #include #include #include #include namespace igl::vulkan { std::vector Framebuffer::getColorAttachmentIndices() const { std::vector indices; indices.reserve(IGL_COLOR_ATTACHMENTS_MAX); for (size_t i = 0; i != IGL_COLOR_ATTACHMENTS_MAX; i++) { if (desc_.colorAttachments[i].texture || desc_.colorAttachments[i].resolveTexture) { indices.push_back(i); } } return indices; } std::shared_ptr Framebuffer::getColorAttachment(size_t index) const { IGL_DEBUG_ASSERT(index < IGL_COLOR_ATTACHMENTS_MAX); return desc_.colorAttachments[index].texture; } std::shared_ptr Framebuffer::getResolveColorAttachment(size_t index) const { IGL_DEBUG_ASSERT(index < IGL_COLOR_ATTACHMENTS_MAX); return desc_.colorAttachments[index].resolveTexture; } std::shared_ptr Framebuffer::getDepthAttachment() const { return desc_.depthAttachment.texture; } std::shared_ptr Framebuffer::getResolveDepthAttachment() const { return desc_.depthAttachment.resolveTexture; } std::shared_ptr Framebuffer::getStencilAttachment() const { return desc_.stencilAttachment.texture; } void Framebuffer::copyBytesColorAttachment(ICommandQueue& /* Not Used */, size_t index, void* pixelBytes, const TextureRangeDesc& range, size_t bytesPerRow) const { IGL_DEBUG_ASSERT(range.numFaces == 1, "range.numFaces MUST be 1"); IGL_DEBUG_ASSERT(range.numLayers == 1, "range.numLayers MUST be 1"); IGL_DEBUG_ASSERT(range.numMipLevels == 1, "range.numMipLevels MUST be 1"); IGL_PROFILER_FUNCTION(); if (!IGL_DEBUG_VERIFY(pixelBytes)) { return; } const auto& itexture = getColorAttachment(index); if (!IGL_DEBUG_VERIFY(itexture)) { return; } // If we're doing MSAA, we should be using the resolve color attachment const auto& vkTex = static_cast( itexture->getSamples() == 1 ? *itexture : *getResolveColorAttachment(index)); const VkRect2D imageRegion = { .offset = {.x = static_cast(range.x), .y = static_cast(range.y)}, .extent = {.width = range.width, .height = range.height}, }; if (bytesPerRow == 0) { bytesPerRow = itexture->getProperties().getBytesPerRow(range); } // Vulkan uses array layer to represent either cube face or array layer. IGL's TextureRangeDesc // represents these separately. This gets the correct vulkan array layer for the either the // range's cube face or array layer. const auto layer = getVkLayer(itexture->getType(), range.face, range.layer); const VulkanContext& ctx = device_.getVulkanContext(); ctx.stagingDevice_->getImageData2D(vkTex.getVkImage(), range.mipLevel, layer, // Layer is either cube face or array layer imageRegion, vkTex.getProperties(), VK_FORMAT_R8G8B8A8_UNORM, vkTex.getVulkanTexture().image_.imageLayout_, vkTex.getVulkanTexture().imageView_.getVkImageAspectFlags(), pixelBytes, static_cast(bytesPerRow), true); // Flip the image vertically } void Framebuffer::copyBytesDepthAttachment(ICommandQueue& /*cmdQueue*/, void* /*pixelBytes*/, const TextureRangeDesc& /*range*/, size_t /*bytesPerRow*/) const { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } void Framebuffer::copyBytesStencilAttachment(ICommandQueue& /*cmdQueue*/, void* /*pixelBytes*/, const TextureRangeDesc& /*range*/, size_t /*bytesPerRow*/) const { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } void Framebuffer::copyTextureColorAttachment(ICommandQueue& cmdQueue, size_t index, std::shared_ptr destTexture, const TextureRangeDesc& range) const { IGL_PROFILER_FUNCTION(); // Currently doesn't support mipmaps if (!IGL_DEBUG_VERIFY(range.mipLevel == 0 && range.numMipLevels == 1)) { return; } const auto& ctx = device_.getVulkanContext(); // Extract the underlying VkCommandBuffer const CommandBufferDesc cbDesc; const std::shared_ptr buffer = cmdQueue.createCommandBuffer(cbDesc, nullptr); const auto& vulkanBuffer = static_cast(*buffer); VkCommandBuffer cmdBuf = vulkanBuffer.getVkCommandBuffer(); const std::shared_ptr& srcTexture = getColorAttachment(index); if (!IGL_DEBUG_VERIFY(srcTexture)) { return; } // If we're doing MSAA, we should be using the resolve color attachment const igl::vulkan::Texture& srcVkTex = static_cast( srcTexture->getSamples() == 1 ? *srcTexture : *getResolveColorAttachment(index)); if (!IGL_DEBUG_VERIFY(destTexture)) { return; } const igl::vulkan::Texture& dstVkTex = static_cast(*destTexture); // 1. Transition dst into TRANSFER_DST_OPTIMAL ivkImageMemoryBarrier(&ctx.vf_, cmdBuf, dstVkTex.getVkImage(), 0, // srcAccessMask VK_ACCESS_TRANSFER_WRITE_BIT, // dstAccessMask VK_IMAGE_LAYOUT_UNDEFINED, // Discard content since we are writing VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, // Don't wait for anything VK_PIPELINE_STAGE_TRANSFER_BIT, VkImageSubresourceRange{VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}); // 2. Transition src into TRANSFER_SRC_OPTIMAL srcVkTex.getVulkanTexture().image_.transitionLayout( cmdBuf, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, // Wait for all previous operation to // be done VK_PIPELINE_STAGE_TRANSFER_BIT, VkImageSubresourceRange{VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}); // 3. Copy Image const VkImageCopy copy = { .srcSubresource = VkImageSubresourceLayers{VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1}, .srcOffset = {.x = static_cast(range.x), .y = static_cast(range.y), .z = 0}, .dstSubresource = VkImageSubresourceLayers{VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1}, .dstOffset = {.x = static_cast(range.x), .y = static_cast(range.y), .z = 0}, .extent = {.width = range.width, .height = range.height, .depth = 1u}, }; ctx.vf_.vkCmdCopyImage(cmdBuf, srcVkTex.getVkImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstVkTex.getVkImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ©); // 4. Transition images back srcVkTex.getVulkanTexture().image_.transitionLayout( cmdBuf, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_PIPELINE_STAGE_TRANSFER_BIT, // Wait for Copy to be done VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, // Don't start anything until Copy is // done VkImageSubresourceRange{VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}); dstVkTex.getVulkanTexture().image_.transitionLayout( cmdBuf, dstVkTex.isSwapchainTexture() ? VK_IMAGE_LAYOUT_PRESENT_SRC_KHR : VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_PIPELINE_STAGE_TRANSFER_BIT, // Wait for vkCmdCopyImage() VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, // Don't start anything until Copy is // done VkImageSubresourceRange{VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}); cmdQueue.submit(*buffer); } void Framebuffer::updateDrawable(std::shared_ptr texture) { updateDrawableInternal({.color = std::move(texture), .depth = nullptr}, false); } void Framebuffer::updateDrawable(SurfaceTextures surfaceTextures) { updateDrawableInternal(std::move(surfaceTextures), true); } void Framebuffer::updateResolveAttachment(std::shared_ptr texture) { if (getColorAttachment(0) && getResolveColorAttachment(0) != texture) { desc_.colorAttachments[0].resolveTexture = std::move(texture); validateAttachments(); } } void Framebuffer::updateDrawableInternal(SurfaceTextures surfaceTextures, bool updateDepthStencil) { IGL_PROFILER_FUNCTION(); bool updated = false; if (getColorAttachment(0) != surfaceTextures.color) { if (!surfaceTextures.color) { desc_.colorAttachments[0] = {}; } else { desc_.colorAttachments[0].texture = std::move(surfaceTextures.color); } updated = true; } if (updateDepthStencil) { if (surfaceTextures.depth && surfaceTextures.depth->getProperties().hasStencil()) { if (getStencilAttachment() != surfaceTextures.depth) { desc_.stencilAttachment.texture = surfaceTextures.depth; updated = true; } } else { desc_.stencilAttachment.texture = nullptr; updated = true; } if (getDepthAttachment() != surfaceTextures.depth) { desc_.depthAttachment.texture = std::move(surfaceTextures.depth); updated = true; } } if (updated) { validateAttachments(); } } Framebuffer::Framebuffer(const Device& device, FramebufferDesc desc) : device_(device), desc_(std::move(desc)) { validateAttachments(); } void Framebuffer::validateAttachments() { width_ = 0u; height_ = 0u; IGL_PROFILER_FUNCTION(); auto ensureSize = [this](const vulkan::Texture& tex) { const uint32_t attachmentWidth = tex.getDimensions().width; const uint32_t attachmentHeight = tex.getDimensions().height; IGL_DEBUG_ASSERT(attachmentWidth); IGL_DEBUG_ASSERT(attachmentHeight); // Initialize width/height if (!width_ || !height_) { width_ = attachmentWidth; height_ = attachmentHeight; } else { // We expect all subsequent color attachments to have the same size. IGL_DEBUG_ASSERT(width_ == attachmentWidth); IGL_DEBUG_ASSERT(height_ == attachmentHeight); } IGL_DEBUG_ASSERT(tex.getVkFormat() != VK_FORMAT_UNDEFINED || tex.getVkExtendedFormat() != 0, "Invalid texture format: %d", static_cast(tex.getVkFormat())); }; for (const auto& attachment : desc_.colorAttachments) { if (!attachment.texture) { continue; } const auto& colorTexture = static_cast(*attachment.texture); ensureSize(colorTexture); IGL_DEBUG_ASSERT( (colorTexture.getUsage() & TextureDesc::TextureUsageBits::Attachment) != 0, "Did you forget to specify TextureUsageBits::Attachment on your color texture?"); } const auto* depthTexture = static_cast(desc_.depthAttachment.texture.get()); if (depthTexture) { ensureSize(*depthTexture); IGL_DEBUG_ASSERT( (depthTexture->getUsage() & TextureDesc::TextureUsageBits::Attachment) != 0, "Did you forget to specify TextureUsageBits::Attachment on your depth texture?"); } IGL_DEBUG_ASSERT(width_); IGL_DEBUG_ASSERT(height_); } VkFramebuffer Framebuffer::getVkFramebuffer(uint32_t mipLevel, uint32_t layer, VkRenderPass pass) const { IGL_PROFILER_FUNCTION(); // Because Vulkan framebuffers are immutable and we have a method updateDrawable() which can // change an attachment, we have to maintain a collection of attachments and map it into a // VulkanFramebuffer via unordered_map. The vector of attachments is a key in the hash table. Attachments attachments; for (const auto& colorAttachment : desc_.colorAttachments) { // skip invalid attachments if (!colorAttachment.texture) { continue; } IGL_DEBUG_ASSERT(colorAttachment.texture); const auto& colorTexture = static_cast(*colorAttachment.texture); attachments.attachments.push_back( colorTexture.getVkImageViewForFramebuffer(mipLevel, layer, desc_.mode)); // handle color MSAA if (colorAttachment.resolveTexture) { IGL_DEBUG_ASSERT(mipLevel == 0); const auto& colorResolveTexture = static_cast(*colorAttachment.resolveTexture); attachments.attachments.push_back( colorResolveTexture.getVkImageViewForFramebuffer(0, layer, desc_.mode)); } } // depth { const auto* depthTexture = static_cast(desc_.depthAttachment.texture.get()); if (depthTexture) { attachments.attachments.push_back( depthTexture->getVkImageViewForFramebuffer(mipLevel, layer, desc_.mode)); } } // handle depth MSAA { const auto* depthResolveTexture = static_cast(desc_.depthAttachment.resolveTexture.get()); if (depthResolveTexture) { attachments.attachments.push_back( depthResolveTexture->getVkImageViewForFramebuffer(mipLevel, layer, desc_.mode)); } } // now we can find a corresponding framebuffer auto it = framebuffers_.find(attachments); if (it != framebuffers_.end()) { return it->second->getVkFramebuffer(); } const VulkanContext& ctx = device_.getVulkanContext(); const uint32_t fbWidth = std::max(width_ >> mipLevel, 1u); const uint32_t fbHeight = std::max(height_ >> mipLevel, 1u); auto fb = std::make_shared(ctx, ctx.getVkDevice(), fbWidth, fbHeight, pass, (uint32_t)attachments.attachments.size(), attachments.attachments.data(), desc_.debugName.c_str()); framebuffers_[attachments] = fb; return fb->getVkFramebuffer(); } uint64_t Framebuffer::HashFunction::operator()(const Attachments& attachments) const { uint64_t hash = 0; for (const auto& a : attachments.attachments) { hash ^= std::hash()(a); } return hash; } VkRenderPassBeginInfo Framebuffer::getRenderPassBeginInfo(VkRenderPass renderPass, uint32_t mipLevel, uint32_t layer, uint32_t numClearValues, const VkClearValue* clearValues) const { IGL_PROFILER_FUNCTION(); return VkRenderPassBeginInfo{ .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, .renderPass = renderPass, .framebuffer = getVkFramebuffer(mipLevel, layer, renderPass), .renderArea = { .offset = {.x = 0, .y = 0}, .extent = {.width = std::max(width_ >> mipLevel, 1u), .height = std::max(height_ >> mipLevel, 1u)}, }, .clearValueCount = numClearValues, .pClearValues = clearValues, }; } FramebufferMode Framebuffer::getMode() const { return desc_.mode; } bool Framebuffer::isSwapchainBound() const { if (auto tex = getColorAttachment(0)) { return tex->isSwapchainTexture(); } return false; } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/Framebuffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::vulkan { class Device; class VulkanFramebuffer; /// @brief Implements the igl::IFramebuffer interface for Vulkan /// Vulkan framebuffers are immutable and are made of one or more image views. This class keeps /// track of all framebuffers for each combination of mip level, layer, and render pass in an /// unordered map. Framebuffers are lazily created when requested with `getVkFramebuffer()` class Framebuffer final : public IFramebuffer { public: Framebuffer(const Device& device, FramebufferDesc desc); ~Framebuffer() override = default; // Accessors std::vector getColorAttachmentIndices() const override; std::shared_ptr getColorAttachment(size_t index) const override; std::shared_ptr getResolveColorAttachment(size_t index) const override; std::shared_ptr getDepthAttachment() const override; std::shared_ptr getResolveDepthAttachment() const override; std::shared_ptr getStencilAttachment() const override; [[nodiscard]] FramebufferMode getMode() const override; [[nodiscard]] bool isSwapchainBound() const override; /// @brief Copies color attachment to location pointed by `pixelBytes`. This function only /// supports copying one face, one layer, and one mip level at a time. This function is /// synchronous and the data is expected to be available at `pixelBytes` location upon return. void copyBytesColorAttachment(ICommandQueue& /* Not Used */, size_t index, void* pixelBytes, const TextureRangeDesc& range, size_t bytesPerRow = 0) const override; /// @brief Not implemented. void copyBytesDepthAttachment(ICommandQueue& cmdQueue, void* pixelBytes, const TextureRangeDesc& range, size_t bytesPerRow = 0) const override; /// @brief Not implemented. void copyBytesStencilAttachment(ICommandQueue& cmdQueue, void* pixelBytes, const TextureRangeDesc& range, size_t bytesPerRow = 0) const override; /// @brief Copies a range of the color attachment at `index` to destination texture. This /// function is asynchronous and the data may or may not be available at the destination texture /// upon return. void copyTextureColorAttachment(ICommandQueue& cmdQueue, size_t index, std::shared_ptr destTexture, const TextureRangeDesc& range) const override; /// @brief Updates the framebuffer's color attachment at index 0 with the texture passed in as a /// parameter void updateDrawable(std::shared_ptr texture) override; /// @brief Updates the framebuffer's color attachment at index 0 and the depth/stencil attachment /// with the contents of SurfaceTextures passed in as a parameter. If a stencil texture is not /// provided, the stencil attachment is set to null. void updateDrawable(SurfaceTextures surfaceTextures) override; /// @brief Updates the color attachment's resolve texture at index 0 with the texture passed in as /// a parameter void updateResolveAttachment(std::shared_ptr texture) override; /** @brief Returns the underlying Vulkan framebuffer handle for the given mip level, layer, and * render pass. Vulkan framebuffers are immutable and are made of one or more image views. This * class keeps track of all framebuffers for each combination of mip level, layer, and render * pass. When requesting a framebuffer for a mip level, layer, or render pass, this function * looks for an existing framebuffer and returns it, if it exists. Otherwise, it creates a new * framebuffer and stores it in the cache. */ VkFramebuffer getVkFramebuffer(uint32_t mipLevel, uint32_t layer, VkRenderPass pass) const; uint32_t getWidth() const { return width_; } uint32_t getHeight() const { return height_; } IGL_INLINE const FramebufferDesc& getDesc() const { return desc_; } VkRenderPassBeginInfo getRenderPassBeginInfo(VkRenderPass renderPass, uint32_t mipLevel, uint32_t layer, uint32_t numClearValues, const VkClearValue* clearValues) const; /// @brief Structure used as key for unordered map based on all framebuffer attachments struct Attachments { std::vector attachments; bool operator==(const Attachments& other) const { return attachments == other.attachments; } }; struct HashFunction { uint64_t operator()(const Attachments& attachments) const; }; private: void validateAttachments(); void updateDrawableInternal(SurfaceTextures surfaceTextures, bool updateDepthStencil); const igl::vulkan::Device& device_; FramebufferDesc desc_; // attachments uint32_t width_ = 0; uint32_t height_ = 0; /// @brief Cache of framebuffers created from the same set of attachments mutable std::unordered_map, HashFunction> framebuffers_; }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/HWDevice.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "HWDevice.h" #include #include namespace igl::vulkan { std::unique_ptr HWDevice::createContext(const VulkanContextConfig& config, void* IGL_NULLABLE window, void* IGL_NULLABLE display) { // @fb-only // @lint-ignore CLANGTIDY return std::make_unique(config, window, display); } std::vector HWDevice::queryDevices(VulkanContext& ctx, const HWDeviceQueryDesc& desc, Result* IGL_NULLABLE outResult) { std::vector outDevices; Result::setResult(outResult, ctx.queryDevices(desc, outDevices)); return outDevices; } std::unique_ptr HWDevice::create(std::unique_ptr ctx, const HWDeviceDesc& desc, uint32_t width, uint32_t height, size_t numExtraDeviceExtensions, const char* IGL_NULLABLE* IGL_NULLABLE extraDeviceExtensions, const igl::vulkan::VulkanFeatures* IGL_NULLABLE features, const char* IGL_NULLABLE debugName, Result* IGL_NULLABLE outResult) { IGL_DEBUG_ASSERT(ctx); auto result = ctx->initContext(desc, numExtraDeviceExtensions, extraDeviceExtensions, features, debugName); Result::setResult(outResult, result); if (!result.isOk()) { return nullptr; } if (width > 0 && height > 0) { result = ctx->initSwapchain(width, height); Result::setResult(outResult, result); } return result.isOk() ? std::make_unique(std::move(ctx)) : nullptr; } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/HWDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::vulkan { /// @brief This class provides convenience functions to query, and create devices, as well as to /// create a VulkanContext object. class HWDevice final { public: /** @brief Creates a VulkanContext object with the specified configuration and the extensions * provided in the array pointed by `extraInstanceExtensions`. * @param config is the configuration used to create the VulkanContext object * @param window is a pointer to a native window handle. For windows, it should be a pointer to * the Win32 HINSTANCE for the window to associate the surface with. For Android, it should be a * pointer to the ANativeWindow. For Xlib, it should be an Xlib Window. * @param numExtraInstanceExtensions is the number of additional instance extensions to enable. * @param extraInstanceExtensions is a pointer to an array of strings containing the names of the * extensions to enable for the context. * @param display is a pointer to an Xlib Display connection to the X server. Used only when * `VK_USE_PLATFORM_XLIB_KHR` is defined. */ static std::unique_ptr createContext(const VulkanContextConfig& config, void* IGL_NULLABLE window, void* IGL_NULLABLE display = nullptr); static std::vector queryDevices(VulkanContext& ctx, const HWDeviceQueryDesc& desc, Result* IGL_NULLABLE outResult = nullptr); /* * @brief Create a new vulkan::Device * Only 1 device can be created for Vulkan. The new device will take ownership of * VulkanContext. If the process fails, the provided VulkanContext is destroyed. If the width and * height are greater than 0, this functions also initializes the swapchain. */ static std::unique_ptr create( std::unique_ptr ctx, const HWDeviceDesc& desc, uint32_t width, uint32_t height, size_t numExtraDeviceExtensions = 0, const char* IGL_NULLABLE* IGL_NULLABLE extraDeviceExtensions = nullptr, const igl::vulkan::VulkanFeatures* IGL_NULLABLE features = nullptr, const char* IGL_NULLABLE debugName = nullptr, Result* IGL_NULLABLE outResult = nullptr); }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/PipelineState.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "PipelineState.h" #include #include #include #include #include namespace igl::vulkan { void PipelineState::initializeSpvModuleInfoFromShaderStages(const VulkanContext& ctx, IShaderStages* stages) { const ShaderStagesType shaderStagesType = stages->getType(); VkShaderStageFlags pushConstantMask = 0; switch (shaderStagesType) { case igl::ShaderStagesType::Compute: { // compute auto* smComp = static_cast(stages->getComputeModule().get()); ensureShaderModule(smComp); info = smComp->getVulkanShaderModule().getSpvModuleInfo(); if (info.hasPushConstants) { pushConstantMask |= VK_SHADER_STAGE_COMPUTE_BIT; } stageFlags = VK_SHADER_STAGE_COMPUTE_BIT; } break; case igl::ShaderStagesType::Render: { auto* smVert = static_cast(stages->getVertexModule().get()); auto* smFrag = static_cast(stages->getFragmentModule().get()); // vertex/fragment ensureShaderModule(smVert); ensureShaderModule(smFrag); const util::SpvModuleInfo& infoVert = smVert->getVulkanShaderModule().getSpvModuleInfo(); const util::SpvModuleInfo& infoFrag = smFrag->getVulkanShaderModule().getSpvModuleInfo(); if (infoVert.hasPushConstants) { pushConstantMask |= VK_SHADER_STAGE_VERTEX_BIT; } if (infoFrag.hasPushConstants) { pushConstantMask |= VK_SHADER_STAGE_FRAGMENT_BIT; } info = util::mergeReflectionData(infoVert, infoFrag); stageFlags = VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT; } break; case igl::ShaderStagesType::RenderMeshShader: { auto* smTask = static_cast(stages->getTaskModule().get()); auto* smMesh = static_cast(stages->getMeshModule().get()); auto* smFrag = static_cast(stages->getFragmentModule().get()); ensureShaderModule(smMesh); ensureShaderModule(smFrag); const util::SpvModuleInfo& infoMesh = smMesh->getVulkanShaderModule().getSpvModuleInfo(); const util::SpvModuleInfo& infoFrag = smFrag->getVulkanShaderModule().getSpvModuleInfo(); if (infoMesh.hasPushConstants) { pushConstantMask |= VK_SHADER_STAGE_MESH_BIT_EXT; } if (infoFrag.hasPushConstants) { pushConstantMask |= VK_SHADER_STAGE_FRAGMENT_BIT; } info = util::mergeReflectionData(infoMesh, infoFrag); stageFlags = VK_SHADER_STAGE_MESH_BIT_EXT | VK_SHADER_STAGE_FRAGMENT_BIT; if (smTask) { ensureShaderModule(smTask); const util::SpvModuleInfo& infoTask = smTask->getVulkanShaderModule().getSpvModuleInfo(); if (infoTask.hasPushConstants) { pushConstantMask |= VK_SHADER_STAGE_TASK_BIT_EXT; } info = util::mergeReflectionData(info, infoTask); stageFlags |= VK_SHADER_STAGE_TASK_BIT_EXT; } } break; default: IGL_DEBUG_ASSERT_NOT_REACHED(); break; }; if (pushConstantMask) { const VkPhysicalDeviceLimits& limits = ctx.getVkPhysicalDeviceProperties().limits; constexpr uint32_t kPushConstantsSize = 128; if (!IGL_DEBUG_VERIFY(kPushConstantsSize <= limits.maxPushConstantsSize)) { IGL_LOG_ERROR("Push constants size exceeded %u (max %u bytes)", kPushConstantsSize, limits.maxPushConstantsSize); } pushConstantRange = VkPushConstantRange{ .stageFlags = pushConstantMask, .offset = 0u, .size = kPushConstantsSize, }; } } PipelineState::PipelineState( const VulkanContext& ctx, IShaderStages* stages, std::shared_ptr immutableSamplers[IGL_TEXTURE_SAMPLERS_MAX], uint32_t isDynamicBufferMask, const char* debugName) { IGL_DEBUG_ASSERT(stages); initializeSpvModuleInfoFromShaderStages(ctx, stages); // Create all Vulkan descriptor set layouts for this pipeline // 0. Combined image samplers { std::vector bindings; bindings.reserve(info.textures.size()); for (const auto& t : info.textures) { const uint32_t loc = t.bindingLocation; bindings.emplace_back(VkDescriptorSetLayoutBinding{ .binding = loc, .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, .descriptorCount = 1, .stageFlags = stageFlags, }); if (loc < IGL_TEXTURE_SAMPLERS_MAX && immutableSamplers && immutableSamplers[loc]) { auto* sampler = static_cast(immutableSamplers[loc].get()); bindings.back().pImmutableSamplers = &ctx.samplers_.get(sampler->sampler_)->vkSampler; } } std::vector bindingFlags(bindings.size()); dslCombinedImageSamplers = std::make_unique( ctx, VkDescriptorSetLayoutCreateFlags{}, static_cast(bindings.size()), bindings.data(), bindingFlags.data(), IGL_FORMAT("Descriptor Set Layout (COMBINED_IMAGE_SAMPLER): {}", debugName).c_str()); } // 1. Buffers { std::vector bindings; bindings.reserve(info.buffers.size()); for (const auto& b : info.buffers) { const bool isDynamic = (isDynamicBufferMask & (1ul << b.bindingLocation)) != 0; const VkDescriptorType type = b.isStorage ? (isDynamic ? VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC : VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) : (isDynamic ? VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC : VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER); bindings.emplace_back(VkDescriptorSetLayoutBinding{ .binding = b.bindingLocation, .descriptorType = type, .descriptorCount = 1, .stageFlags = stageFlags, }); } std::vector bindingFlags(bindings.size()); dslBuffers = std::make_unique( ctx, VkDescriptorSetLayoutCreateFlags{}, static_cast(bindings.size()), bindings.data(), bindingFlags.data(), IGL_FORMAT("Descriptor Set Layout (BUFFERS): {}", debugName).c_str()); } // 2. Bindless descriptors are managed in VulkanContext // 3. Storage images { std::vector bindings; bindings.reserve(info.images.size()); for (const auto& t : info.images) { const uint32_t loc = t.bindingLocation; bindings.emplace_back(VkDescriptorSetLayoutBinding{ .binding = loc, .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, .descriptorCount = 1, .stageFlags = stageFlags, }); } std::vector bindingFlags(bindings.size()); dslStorageImages = std::make_unique( ctx, VkDescriptorSetLayoutCreateFlags{}, static_cast(bindings.size()), bindings.data(), bindingFlags.data(), IGL_FORMAT("Descriptor Set Layout (STORAGE_IMAGE): {}", debugName).c_str()); } } VkPipelineLayout PipelineState::getVkPipelineLayout() const { IGL_DEBUG_ASSERT(pipelineLayout); return pipelineLayout; } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/PipelineState.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl { class IShaderStages; } // namespace igl namespace igl::vulkan { class VulkanContext; class VulkanDescriptorSetLayout; class PipelineState { public: PipelineState(const VulkanContext& ctx, IShaderStages* stages, std::shared_ptr immutableSamplers[IGL_TEXTURE_SAMPLERS_MAX], uint32_t isDynamicBufferMask, const char* debugName); virtual ~PipelineState() = default; PipelineState(const PipelineState&) = delete; PipelineState(PipelineState&&) = delete; PipelineState& operator=(const PipelineState&) = delete; PipelineState& operator=(PipelineState&&) = delete; VkPipelineLayout getVkPipelineLayout() const; const util::SpvModuleInfo& getSpvModuleInfo() const { return info; } private: void initializeSpvModuleInfoFromShaderStages(const VulkanContext& ctx, IShaderStages* stages); public: igl::vulkan::util::SpvModuleInfo info; VkPushConstantRange pushConstantRange = {}; VkShaderStageFlags stageFlags = 0; mutable VkPipelineLayout pipelineLayout = VK_NULL_HANDLE; // the last seen VkDescriptorSetLayout from VulkanContext::dslBindless_ mutable VkDescriptorSetLayout lastBindlessVkDescriptorSetLayout = VK_NULL_HANDLE; std::unique_ptr dslCombinedImageSamplers; std::unique_ptr dslBuffers; std::unique_ptr dslStorageImages; }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/PlatformDevice.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #if defined(IGL_ANDROID_HWBUFFER_SUPPORTED) #include #include #endif // defined(IGL_ANDROID_HWBUFFER_SUPPORTED) namespace igl::vulkan { PlatformDevice::PlatformDevice(Device& device) : device_(device) {} std::shared_ptr PlatformDevice::createTextureFromNativeDepth(uint32_t width, uint32_t height, Result* outResult) { IGL_PROFILER_FUNCTION(); const auto& ctx = device_.getVulkanContext(); const auto& swapChain = ctx.swapchain_; if (!ctx.hasSwapchain()) { nativeDepthTexture_ = nullptr; Result::setResult(outResult, Result::Code::Ok); return nullptr; }; std::shared_ptr vkTex = swapChain->getCurrentDepthTexture(); if (!IGL_DEBUG_VERIFY(vkTex != nullptr)) { Result::setResult(outResult, Result::Code::InvalidOperation, "Swapchain has no valid texture"); return nullptr; } IGL_DEBUG_ASSERT(vkTex->image_.imageFormat_ != VK_FORMAT_UNDEFINED, "Invalid image format"); const auto iglFormat = vkFormatToTextureFormat(vkTex->image_.imageFormat_); if (!IGL_DEBUG_VERIFY(iglFormat != igl::TextureFormat::Invalid)) { Result::setResult(outResult, Result::Code::RuntimeError, "Invalid surface depth format"); return nullptr; } // allocate new drawable textures if its null or mismatches in size or format if (!nativeDepthTexture_ || width != nativeDepthTexture_->getDimensions().width || height != nativeDepthTexture_->getDimensions().height || iglFormat != nativeDepthTexture_->getFormat()) { const TextureDesc desc = TextureDesc::new2D(iglFormat, width, height, TextureDesc::TextureUsageBits::Attachment | TextureDesc::TextureUsageBits::Sampled, "SwapChain Texture"); nativeDepthTexture_ = std::make_shared(device_, std::move(vkTex), desc); } Result::setResult(outResult, Result::Code::Ok); return nativeDepthTexture_; } std::shared_ptr PlatformDevice::createTextureFromNativeDrawable(Result* outResult) { IGL_PROFILER_FUNCTION(); const auto& ctx = device_.getVulkanContext(); if (!ctx.hasSwapchain()) { nativeDrawableTextures_.clear(); Result::setResult(outResult, Result::Code::Ok); return nullptr; }; const auto& swapChain = ctx.swapchain_; auto vkTex = swapChain->getCurrentVulkanTexture(); if (!IGL_DEBUG_VERIFY(vkTex != nullptr)) { Result::setResult(outResult, Result::Code::InvalidOperation, "Swapchain has no valid texture"); return nullptr; } IGL_DEBUG_ASSERT(vkTex->image_.imageFormat_ != VK_FORMAT_UNDEFINED, "Invalid image format"); const igl::TextureFormat iglFormat = vkFormatToTextureFormat(vkTex->image_.imageFormat_); if (!IGL_DEBUG_VERIFY(iglFormat != igl::TextureFormat::Invalid)) { Result::setResult(outResult, Result::Code::RuntimeError, "Invalid surface color format"); return nullptr; } const auto width = (size_t)swapChain->getWidth(); const auto height = (size_t)swapChain->getHeight(); const auto currentImageIndex = swapChain->getCurrentImageIndex(); // resize nativeDrawableTextures_ pushing null pointers // null pointers will be allocated later as needed if (currentImageIndex >= nativeDrawableTextures_.size()) { nativeDrawableTextures_.resize((size_t)currentImageIndex + 1, nullptr); } const auto result = nativeDrawableTextures_[currentImageIndex]; // allocate new drawable textures if its null or mismatches in size or format if (!result || width != result->getDimensions().width || height != result->getDimensions().height || iglFormat != result->getFormat()) { const TextureDesc desc = TextureDesc::new2D( iglFormat, width, height, TextureDesc::TextureUsageBits::Attachment, "SwapChain Texture"); nativeDrawableTextures_[currentImageIndex] = std::make_shared(device_, std::move(vkTex), desc); } Result::setResult(outResult, Result::Code::Ok); return nativeDrawableTextures_[currentImageIndex]; } #if defined(IGL_ANDROID_HWBUFFER_SUPPORTED) /// returns a android::NativeHWTextureBuffer on platforms supporting it /// this texture allows CPU and GPU to both read/write memory std::shared_ptr PlatformDevice::createTextureWithSharedMemory(const TextureDesc& desc, Result* outResult) const { Result subResult; auto texture = std::make_shared(device_, desc.format); subResult = texture->createHWBuffer(desc, false, false); Result::setResult(outResult, subResult.code, subResult.message); if (!subResult.isOk()) { return nullptr; } return std::move(texture); } std::shared_ptr PlatformDevice::createTextureWithSharedMemory( struct AHardwareBuffer* buffer, Result* outResult) const { Result subResult; AHardwareBuffer_Desc hwbDesc; AHardwareBuffer_describe(buffer, &hwbDesc); auto texture = std::make_shared( device_, igl::android::getIglFormat(hwbDesc.format)); subResult = texture->createWithHWBuffer(buffer); Result::setResult(outResult, subResult.code, subResult.message); if (!subResult.isOk()) { return nullptr; } return std::move(texture); } #endif // defined(IGL_ANDROID_HWBUFFER_SUPPORTED) VkFence PlatformDevice::getVkFenceFromSubmitHandle(SubmitHandle handle) const { return device_.getVulkanContext().getVkFenceFromSubmitHandle(handle); } bool PlatformDevice::waitOnSubmitHandle(SubmitHandle handle, uint64_t timeoutNanoseconds) const { if (handle == 0) { IGL_LOG_ERROR("Invalid submit handle passed to waitOnSubmitHandle"); return false; } const auto& ctx = device_.getVulkanContext(); const auto& immediateCommands = ctx.immediate_; return immediateCommands->wait(VulkanImmediateCommands::SubmitHandle(handle), timeoutNanoseconds) != VK_TIMEOUT; } void PlatformDevice::deferredTask(std::packaged_task&& task, SubmitHandle handle) const { if (!handle) { IGL_LOG_ERROR("Invalid submit handle passed to PlatformDevice::deferredTask()"); return; } device_.getVulkanContext().deferredTask(std::move(task), VulkanImmediateCommands::SubmitHandle(handle)); } int PlatformDevice::getFenceFdFromSubmitHandle(SubmitHandle handle) const { return device_.getVulkanContext().getFenceFdFromSubmitHandle(handle); } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/PlatformDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #if defined(IGL_ANDROID_HWBUFFER_SUPPORTED) struct AHardwareBuffer; #endif // defined(IGL_ANDROID_HWBUFFER_SUPPORTED) namespace igl::vulkan { class Device; /// @brief Implements the igl::IPlatformDevice interface class PlatformDevice : public IPlatformDevice { public: static constexpr igl::PlatformDeviceType kType = igl::PlatformDeviceType::Vulkan; explicit PlatformDevice(Device& device); ~PlatformDevice() override = default; /// Creates a Depth Texture through the underlying VulkanSwapChain /// This currently is for development purposes only and will be removed in /// the future; /// @param outResult optional result /// @return pointer to generated Texture or nullptr std::shared_ptr createTextureFromNativeDepth(uint32_t width, uint32_t height, Result* outResult); /// Creates a texture from a native drawable surface /// @param outResult optional result /// @return pointer to generated Texture or nullptr std::shared_ptr createTextureFromNativeDrawable(Result* outResult); #if defined(IGL_ANDROID_HWBUFFER_SUPPORTED) std::shared_ptr createTextureWithSharedMemory(const TextureDesc& desc, Result* outResult) const; std::shared_ptr createTextureWithSharedMemory(AHardwareBuffer* buffer, Result* outResult) const; #endif // defined(IGL_ANDROID_HWBUFFER_SUPPORTED) /// @param handle The handle to the GPU Fence /// @return The Vulkan fence associated with the handle [[nodiscard]] VkFence getVkFenceFromSubmitHandle(SubmitHandle handle) const; /// Waits on the GPU Fence associated with the handle /// @param handle The handle to the GPU Fence /// @return 'true' when ready or 'false' on time out (can be ignored) // NOLINTNEXTLINE(modernize-use-nodiscard) bool waitOnSubmitHandle(SubmitHandle handle, uint64_t timeoutNanoseconds = UINT64_MAX) const; /// Invoke a task when a SubmitHandle is ready void deferredTask(std::packaged_task&& task, SubmitHandle handle) const; /// Android only for now - Creates the file descriptor for the underlying VkFence /// @param handle The handle to the GPU Fence /// @return The fd for the Vulkan Fence associated with the handle #if defined(IGL_PLATFORM_ANDROID) && defined(VK_KHR_external_fence_fd) [[nodiscard]] int getFenceFdFromSubmitHandle(SubmitHandle handle) const; #endif /// Clear the cached textures void clear() { nativeDrawableTextures_.clear(); nativeDepthTexture_ = nullptr; } protected: [[nodiscard]] bool isType(PlatformDeviceType t) const noexcept override { return t == kType; } private: Device& device_; std::vector> nativeDrawableTextures_; std::shared_ptr nativeDepthTexture_; }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/RenderCommandEncoder.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace { VkAttachmentLoadOp loadActionToVkAttachmentLoadOp(igl::LoadAction a) { using igl::LoadAction; switch (a) { case LoadAction::DontCare: return VK_ATTACHMENT_LOAD_OP_DONT_CARE; case LoadAction::Load: return VK_ATTACHMENT_LOAD_OP_LOAD; case LoadAction::Clear: return VK_ATTACHMENT_LOAD_OP_CLEAR; } IGL_DEBUG_ASSERT_NOT_REACHED(); return VK_ATTACHMENT_LOAD_OP_DONT_CARE; } VkAttachmentStoreOp storeActionToVkAttachmentStoreOp(igl::StoreAction a) { using igl::StoreAction; switch (a) { case StoreAction::DontCare: return VK_ATTACHMENT_STORE_OP_DONT_CARE; case StoreAction::Store: return VK_ATTACHMENT_STORE_OP_STORE; case StoreAction::MsaaResolve: // for MSAA resolve, we have to store data into a special "resolve" attachment return VK_ATTACHMENT_STORE_OP_DONT_CARE; } IGL_DEBUG_ASSERT_NOT_REACHED(); return VK_ATTACHMENT_STORE_OP_DONT_CARE; } } // namespace namespace igl::vulkan { RenderCommandEncoder::RenderCommandEncoder(const std::shared_ptr& commandBuffer, VulkanContext& ctx) : IRenderCommandEncoder::IRenderCommandEncoder(commandBuffer), ctx_(ctx), cmdBuffer_(commandBuffer ? commandBuffer->getVkCommandBuffer() : VK_NULL_HANDLE), binder_(commandBuffer.get(), ctx, VK_PIPELINE_BIND_POINT_GRAPHICS) { IGL_PROFILER_FUNCTION(); IGL_DEBUG_ASSERT(commandBuffer); IGL_DEBUG_ASSERT(cmdBuffer_ != VK_NULL_HANDLE); } void RenderCommandEncoder::initialize(const RenderPassDesc& renderPass, const std::shared_ptr& framebuffer, const Dependencies& dependencies, Result& outResult) { IGL_PROFILER_FUNCTION(); IGL_ENSURE_VULKAN_CONTEXT_THREAD(&ctx_); if (!IGL_DEBUG_VERIFY(cmdBuffer_)) { Result::setResult(&outResult, Result::Code::ArgumentNull); return; } processDependencies(dependencies); framebuffer_ = framebuffer; dependencies_ = dependencies; Result::setOk(&outResult); if (!IGL_DEBUG_VERIFY(framebuffer)) { Result::setResult(&outResult, Result::Code::ArgumentNull); return; } const FramebufferDesc& desc = static_cast((*framebuffer)).getDesc(); std::array clearValues; uint32_t numClearValues = 0; uint32_t mipLevel = 0; uint32_t layer = 0; VulkanRenderPassBuilder builder; if (desc.mode != FramebufferMode::Mono) { if (desc.mode == FramebufferMode::Stereo) { builder.setMultiviewMasks(0x00000003, 0x00000003); } else { IGL_DEBUG_ABORT("FramebufferMode::Multiview is not implemented."); } } for (size_t i = 0; i != IGL_COLOR_ATTACHMENTS_MAX; i++) { const auto& attachment = desc.colorAttachments[i]; if (!attachment.texture) { continue; } const auto& colorTexture = static_cast(*attachment.texture); // Specifically using renderPass.colorAttachments.size() in case we somehow // get into this loop even when renderPass.colorAttachments.empty() == true if (i >= renderPass.colorAttachments.size()) { Result::setResult( &outResult, Result::Code::ArgumentInvalid, "Framebuffer color attachment count larger than renderPass color attachment count"); IGL_DEBUG_ABORT(outResult.message.c_str()); return; } const auto& descColor = renderPass.colorAttachments[i]; clearValues[numClearValues++] = VkClearValue{.color = {.float32 = { descColor.clearColor.r, descColor.clearColor.g, descColor.clearColor.b, descColor.clearColor.a, }}}; const auto colorLayer = getVkLayer(colorTexture.getType(), descColor.face, descColor.layer); if (mipLevel) { IGL_DEBUG_ASSERT(descColor.mipLevel == mipLevel, "All color attachments should have the same mip-level"); } if (layer) { IGL_DEBUG_ASSERT(colorLayer == layer, "All color attachments should have the same face or layer"); } mipLevel = descColor.mipLevel; layer = colorLayer; const auto initialLayout = descColor.loadAction == igl::LoadAction::Load ? colorTexture.getVulkanTexture().image_.imageLayout_ : VK_IMAGE_LAYOUT_UNDEFINED; builder.addColor(textureFormatToVkFormat(colorTexture.getFormat()), loadActionToVkAttachmentLoadOp(descColor.loadAction), storeActionToVkAttachmentStoreOp(descColor.storeAction), initialLayout, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, colorTexture.getVulkanTexture().image_.samples_); // handle MSAA if (descColor.storeAction == StoreAction::MsaaResolve) { IGL_DEBUG_ASSERT(attachment.resolveTexture, "Framebuffer attachment should contain a resolve texture"); const auto& colorResolveTexture = static_cast(*attachment.resolveTexture); builder.addColorResolve(textureFormatToVkFormat(colorResolveTexture.getFormat()), VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE); clearValues[numClearValues++] = VkClearValue{.color = {.float32 = { descColor.clearColor.r, descColor.clearColor.g, descColor.clearColor.b, descColor.clearColor.a, }}}; } } // Process depth attachment const RenderPassDesc::AttachmentDesc descDepth = renderPass.depthAttachment; const RenderPassDesc::AttachmentDesc descStencil = renderPass.stencilAttachment; hasDepthAttachment_ = false; if (framebuffer->getDepthAttachment()) { const auto& depthTexture = static_cast(*(framebuffer->getDepthAttachment())); hasDepthAttachment_ = true; IGL_DEBUG_ASSERT(descDepth.mipLevel == mipLevel, "Depth attachment should have the same mip-level as color attachments"); IGL_DEBUG_ASSERT(getVkLayer(depthTexture.getType(), descDepth.face, descDepth.layer) == layer, "Depth attachment should have the same face or layer as color attachments"); clearValues[numClearValues++] = VkClearValue{.depthStencil = { .depth = descDepth.clearDepth, .stencil = descStencil.clearStencil, }}; const auto initialLayout = descDepth.loadAction == igl::LoadAction::Load ? depthTexture.getVulkanTexture().image_.imageLayout_ : VK_IMAGE_LAYOUT_UNDEFINED; builder.addDepthStencil(depthTexture.getVkFormat(), loadActionToVkAttachmentLoadOp(descDepth.loadAction), storeActionToVkAttachmentStoreOp(descDepth.storeAction), loadActionToVkAttachmentLoadOp(descStencil.loadAction), storeActionToVkAttachmentStoreOp(descStencil.storeAction), initialLayout, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, depthTexture.getVulkanTexture().image_.samples_); // handle MSAA if (renderPass.depthAttachment.storeAction == StoreAction::MsaaResolve) { IGL_DEBUG_ASSERT(framebuffer->getResolveDepthAttachment(), "Framebuffer attachment should contain a resolve depth texture"); const auto& depthResolveTexture = static_cast(*framebuffer->getResolveDepthAttachment()); builder.addDepthStencilResolve(depthResolveTexture.getVkFormat(), VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE, initialLayout, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); clearValues[numClearValues++] = VkClearValue{.depthStencil = { .depth = descDepth.clearDepth, .stencil = descStencil.clearStencil, }}; } } const auto& fb = static_cast(*framebuffer); auto renderPassHandle = ctx_.findRenderPass(builder); dynamicState_.renderPassIndex = renderPassHandle.index; dynamicState_.depthBiasEnable = false; const VkRenderPassBeginInfo bi = fb.getRenderPassBeginInfo( renderPassHandle.pass, mipLevel, layer, numClearValues, clearValues.data()); const uint32_t width = std::max(fb.getWidth() >> mipLevel, 1u); const uint32_t height = std::max(fb.getHeight() >> mipLevel, 1u); const igl::Viewport viewport = {.x = 0.0f, .y = 0.0f, .width = (float)width, .height = (float)height, .minDepth = 0.0f, .maxDepth = +1.0f}; const igl::ScissorRect scissor = {.x = 0, .y = 0, .width = width, .height = height}; bindViewport(viewport); bindScissorRect(scissor); const VkResult vkResult = ctx_.checkAndUpdateDescriptorSets(); if (vkResult != VK_SUCCESS) { IGL_LOG_ERROR("checkAndUpdateDescriptorSets returned a non-successful result: %d", vkResult); Result::setResult(&outResult, Result::Code::RuntimeError, "Failed to update descriptor sets"); return; } ctx_.vf_.vkCmdBeginRenderPass(cmdBuffer_, &bi, VK_SUBPASS_CONTENTS_INLINE); isEncoding_ = true; Result::setOk(&outResult); } std::unique_ptr RenderCommandEncoder::create( const std::shared_ptr& commandBuffer, VulkanContext& ctx, const RenderPassDesc& renderPass, const std::shared_ptr& framebuffer, const Dependencies& dependencies, Result* outResult) { IGL_PROFILER_FUNCTION(); Result ret; // NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks) std::unique_ptr encoder(new RenderCommandEncoder(commandBuffer, ctx)); encoder->initialize(renderPass, framebuffer, dependencies, ret); Result::setResult(outResult, ret); return ret.isOk() ? std::move(encoder) : nullptr; } void RenderCommandEncoder::endEncoding() { IGL_PROFILER_FUNCTION(); IGL_ENSURE_VULKAN_CONTEXT_THREAD(&ctx_); if (!isEncoding_) { return; } isEncoding_ = false; ctx_.vf_.vkCmdEndRenderPass(cmdBuffer_); for (ITexture* IGL_NULLABLE tex : dependencies_.textures) { // TODO: at some point we might want to know in which layout a dependent texture wants to be. We // can implement that by adding a notion of image layouts to IGL. if (!tex) { continue; } // Retrieve the VulkanImage to check its usage const auto& vkTex = static_cast(*tex); const igl::vulkan::VulkanImage& img = vkTex.getVulkanTexture().image_; if (tex->getProperties().isDepthOrStencil()) { // If the texture has not been marked as a depth/stencil attachment // (TextureDesc::TextureUsageBits::Attachment), don't transition it to a depth/stencil // attchment if (img.usageFlags_ & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { transitionToDepthStencilAttachment(cmdBuffer_, tex); } } else { // If the texture has not been marked as a color attachment // (TextureDesc::TextureUsageBits::Attachment), don't transition it to a color attchment if (img.usageFlags_ & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) { transitionToColorAttachment(cmdBuffer_, tex); } } } dependencies_ = {}; // set image layouts after the render pass const FramebufferDesc& desc = static_cast((*framebuffer_)).getDesc(); for (const auto& attachment : desc.colorAttachments) { // the image layouts of color attachments must match the final layout of the render pass, which // is always VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL (check VulkanRenderPassBuilder.cpp) overrideImageLayout(attachment.texture.get(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); overrideImageLayout(attachment.resolveTexture.get(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); transitionToShaderReadOnly(cmdBuffer_, attachment.texture.get()); transitionToShaderReadOnly(cmdBuffer_, attachment.resolveTexture.get()); } // this must match the final layout of the render pass, which is always // VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL (check VulkanRenderPassBuilder.cpp) overrideImageLayout(desc.depthAttachment.texture.get(), VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); transitionToShaderReadOnly(cmdBuffer_, desc.depthAttachment.texture.get()); #if defined(IGL_WITH_TRACY_GPU) TracyVkCollect(ctx_.tracyCtx_, cmdBuffer_); #endif } void RenderCommandEncoder::pushDebugGroupLabel(const char* label, const igl::Color& color) const { IGL_DEBUG_ASSERT(label != nullptr && *label); ivkCmdBeginDebugUtilsLabel(&ctx_.vf_, cmdBuffer_, label, color.toFloatPtr()); } void RenderCommandEncoder::insertDebugEventLabel(const char* label, const igl::Color& color) const { IGL_DEBUG_ASSERT(label != nullptr && *label); ivkCmdInsertDebugUtilsLabel(&ctx_.vf_, cmdBuffer_, label, color.toFloatPtr()); } void RenderCommandEncoder::popDebugGroupLabel() const { ivkCmdEndDebugUtilsLabel(&ctx_.vf_, cmdBuffer_); } void RenderCommandEncoder::bindViewport(const Viewport& viewport) { IGL_PROFILER_FUNCTION(); IGL_PROFILER_ZONE_GPU_VK("bindViewport()", ctx_.tracyCtx_, cmdBuffer_); /** Using the negative viewport height Vulkan feature, we make the Vulkan "top-left" coordinate system to be "bottom-left" as in OpenGL. This way VK_FRONT_FACE_COUNTER_CLOCKWISE and VK_FRONT_FACE_CLOCKWISE use the same winding as in OpenGL. Part of VK_KHR_maintenance1 which is promoted to Vulkan 1.1. More details: https://www.saschawillems.de/blog/2019/03/29/flipping-the-vulkan-viewport/ **/ const VkViewport vp = { .x = viewport.x, .y = viewport.height - viewport.y, .width = viewport.width, .height = -viewport.height, .minDepth = viewport.minDepth, .maxDepth = viewport.maxDepth, }; ctx_.vf_.vkCmdSetViewport(cmdBuffer_, 0, 1, &vp); } void RenderCommandEncoder::bindScissorRect(const ScissorRect& rect) { const VkRect2D scissor = { .offset = {.x = static_cast(rect.x), .y = static_cast(rect.y)}, .extent = {.width = rect.width, .height = rect.height}, }; ctx_.vf_.vkCmdSetScissor(cmdBuffer_, 0, 1, &scissor); } void RenderCommandEncoder::bindRenderPipelineState( const std::shared_ptr& pipelineState) { IGL_PROFILER_FUNCTION(); if (!IGL_DEBUG_VERIFY(pipelineState != nullptr)) { return; } rps_ = static_cast(pipelineState.get()); IGL_DEBUG_ASSERT(rps_); const RenderPipelineDesc& desc = rps_->getRenderPipelineDesc(); if (desc.shaderStages->getType() == igl::ShaderStagesType::Render) { ensureShaderModule(desc.shaderStages->getVertexModule().get()); } else if (desc.shaderStages->getType() == igl::ShaderStagesType::RenderMeshShader) { ensureShaderModule(desc.shaderStages->getMeshModule().get()); } ensureShaderModule(desc.shaderStages->getFragmentModule().get()); const bool hasDepthAttachment = desc.targetDesc.depthAttachmentFormat != TextureFormat::Invalid; if (IGL_DEBUG_VERIFY_NOT(hasDepthAttachment != hasDepthAttachment_)) { IGL_LOG_ERROR( "Make sure your render pass and render pipeline both have matching depth attachments"); } binder_.bindPipeline(VK_NULL_HANDLE, nullptr); } void RenderCommandEncoder::bindDepthStencilState( const std::shared_ptr& depthStencilState) { IGL_PROFILER_FUNCTION(); if (!IGL_DEBUG_VERIFY(depthStencilState != nullptr)) { return; } const igl::vulkan::DepthStencilState* state = static_cast(depthStencilState.get()); const igl::DepthStencilStateDesc& desc = state->desc; dynamicState_.depthWriteEnable = desc.isDepthWriteEnabled; dynamicState_.setDepthCompareOp(compareFunctionToVkCompareOp(desc.compareFunction)); auto setStencilState = [this](VkStencilFaceFlagBits faceMask, const igl::StencilStateDesc& desc) { dynamicState_.setStencilStateOps(faceMask == VK_STENCIL_FACE_FRONT_BIT, stencilOperationToVkStencilOp(desc.stencilFailureOperation), stencilOperationToVkStencilOp(desc.depthStencilPassOperation), stencilOperationToVkStencilOp(desc.depthFailureOperation), compareFunctionToVkCompareOp(desc.stencilCompareFunction)); ctx_.vf_.vkCmdSetStencilCompareMask(cmdBuffer_, faceMask, desc.readMask); ctx_.vf_.vkCmdSetStencilWriteMask(cmdBuffer_, faceMask, desc.writeMask); }; setStencilState(VK_STENCIL_FACE_FRONT_BIT, desc.frontFaceStencil); setStencilState(VK_STENCIL_FACE_BACK_BIT, desc.backFaceStencil); } void RenderCommandEncoder::bindBuffer(uint32_t index, uint8_t target, IBuffer* buffer, size_t bufferOffset, size_t bufferSize) { (void)target; bindBuffer(index, buffer, bufferOffset, bufferSize); } void RenderCommandEncoder::bindBuffer(uint32_t index, IBuffer* buffer, size_t bufferOffset, size_t bufferSize) { IGL_PROFILER_FUNCTION(); IGL_PROFILER_ZONE_GPU_VK("bindBuffer()", ctx_.tracyCtx_, cmdBuffer_); #if IGL_VULKAN_PRINT_COMMANDS IGL_LOG_INFO("%p bindBuffer(%u, %u)\n", cmdBuffer_, index, (uint32_t)bufferOffset); #endif // IGL_VULKAN_PRINT_COMMANDS if (!IGL_DEBUG_VERIFY(buffer != nullptr)) { return; } auto* buf = static_cast(buffer); const bool isUniformBuffer = (buf->getBufferType() & BufferDesc::BufferTypeBits::Uniform) > 0; const bool isStorageBuffer = (buf->getBufferType() & BufferDesc::BufferTypeBits::Storage) > 0; const bool isUniformOrStorageBuffer = isUniformBuffer || isStorageBuffer; if (!IGL_DEBUG_VERIFY(isUniformOrStorageBuffer, "Must be a uniform or a storage buffer")) { return; } binder_.bindBuffer(index, buf, bufferOffset, bufferSize); } void RenderCommandEncoder::bindVertexBuffer(uint32_t index, IBuffer& buffer, size_t bufferOffset) { IGL_PROFILER_FUNCTION(); IGL_PROFILER_ZONE_GPU_VK("bindVertexBuffer()", ctx_.tracyCtx_, cmdBuffer_); #if IGL_VULKAN_PRINT_COMMANDS IGL_LOG_INFO( "%p bindVertexBuffer(%u, %p, %u)\n", cmdBuffer_, index, &buffer, (uint32_t)bufferOffset); #endif // IGL_VULKAN_PRINT_COMMANDS const bool isVertexBuffer = (buffer.getBufferType() & BufferDesc::BufferTypeBits::Vertex) != 0; if (!IGL_DEBUG_VERIFY(isVertexBuffer)) { return; } if (IGL_DEBUG_VERIFY(index < IGL_ARRAY_NUM_ELEMENTS(isVertexBufferBound_))) { isVertexBufferBound_[index] = true; } VkBuffer vkBuf = static_cast(buffer).getVkBuffer(); const VkDeviceSize offset = bufferOffset; ctx_.vf_.vkCmdBindVertexBuffers(cmdBuffer_, index, 1, &vkBuf, &offset); } void RenderCommandEncoder::bindIndexBuffer(IBuffer& buffer, IndexFormat format, size_t bufferOffset) { const auto& buf = static_cast(buffer); IGL_DEBUG_ASSERT(buf.getBufferUsageFlags() & VK_BUFFER_USAGE_INDEX_BUFFER_BIT, "Did you forget to specify BufferTypeBits::Index on your buffer?"); auto indexFormatToVkIndexType = [](IndexFormat fmt, bool has8BitIndices) -> VkIndexType { switch (fmt) { case igl::IndexFormat::UInt8: return IGL_DEBUG_VERIFY(has8BitIndices) ? VK_INDEX_TYPE_UINT8_EXT : VK_INDEX_TYPE_UINT16; case igl::IndexFormat::UInt16: return VK_INDEX_TYPE_UINT16; case igl::IndexFormat::UInt32: return VK_INDEX_TYPE_UINT32; }; IGL_DEBUG_ASSERT_NOT_REACHED(); return VK_INDEX_TYPE_UINT16; }; const VkIndexType type = indexFormatToVkIndexType(format, ctx_.features_.has_VK_EXT_index_type_uint8); ctx_.vf_.vkCmdBindIndexBuffer(cmdBuffer_, buf.getVkBuffer(), bufferOffset, type); } void RenderCommandEncoder::bindBytes(size_t /*index*/, uint8_t /*target*/, const void* /*data*/, size_t /*length*/) { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } void RenderCommandEncoder::bindPushConstants(const void* data, size_t length, size_t offset) { IGL_PROFILER_FUNCTION(); IGL_PROFILER_ZONE_GPU_VK("bindPushConstants()", ctx_.tracyCtx_, cmdBuffer_); IGL_DEBUG_ASSERT(length % 4 == 0); // VUID-vkCmdPushConstants-size-00369: size must be a multiple // of 4 IGL_DEBUG_ASSERT(rps_, "Did you forget to call bindRenderPipelineState()?"); IGL_DEBUG_ASSERT(rps_->pushConstantRange.size, "Currently bound render pipeline state has no push constants"); IGL_DEBUG_ASSERT(offset + length <= rps_->pushConstantRange.offset + rps_->pushConstantRange.size, "Push constants size exceeded"); if (!rps_->pipelineLayout) { // bring a pipeline layout into existence - we don't really care about the dynamic state here (void)rps_->getVkPipeline(dynamicState_); } #if IGL_VULKAN_PRINT_COMMANDS IGL_LOG_INFO("%p vkCmdPushConstants(%u) - GRAPHICS\n", cmdBuffer_, length); #endif // IGL_VULKAN_PRINT_COMMANDS ctx_.vf_.vkCmdPushConstants(cmdBuffer_, rps_->getVkPipelineLayout(), rps_->pushConstantRange.stageFlags, (uint32_t)offset, (uint32_t)length, data); } void RenderCommandEncoder::bindSamplerState(size_t index, uint8_t target, ISamplerState* samplerState) { IGL_PROFILER_FUNCTION(); #if IGL_VULKAN_PRINT_COMMANDS IGL_LOG_INFO("%p bindSamplerState(%u, %u)\n", cmdBuffer_, (uint32_t)index, (uint32_t)target); #endif // IGL_VULKAN_PRINT_COMMANDS if (!IGL_DEBUG_VERIFY(target == igl::BindTarget::kFragment || target == igl::BindTarget::kVertex || target == igl::BindTarget::kAllGraphics, "Invalid sampler target")) { return; } binder_.bindSamplerState(index, static_cast(samplerState)); } void RenderCommandEncoder::bindTexture(size_t index, uint8_t target, ITexture* texture) { IGL_PROFILER_FUNCTION(); IGL_DEBUG_ASSERT(pendingBindGroupTexture_.empty(), "A texture BindGroup was already bound to this command encoder. You can bind " "individual textures again only after a draw call."); #if IGL_VULKAN_PRINT_COMMANDS IGL_LOG_INFO("%p bindTexture(%u, %u)\n", cmdBuffer_, (uint32_t)index, (uint32_t)target); #endif // IGL_VULKAN_PRINT_COMMANDS if (!IGL_DEBUG_VERIFY(target == igl::BindTarget::kFragment || target == igl::BindTarget::kVertex || target == igl::BindTarget::kAllGraphics, "Invalid texture target")) { return; } binder_.bindTexture(index, static_cast(texture)); } void RenderCommandEncoder::bindTexture(size_t index, ITexture* texture) { bindTexture(index, igl::BindTarget::kFragment, texture); } void RenderCommandEncoder::bindUniform(const UniformDesc& /*uniformDesc*/, const void* /*data*/) { // DO NOT IMPLEMENT! // This is only for backends that MUST use single uniforms in some situations. IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); } void RenderCommandEncoder::draw(size_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t baseInstance) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_DRAW); IGL_PROFILER_ZONE_GPU_COLOR_VK("draw()", ctx_.tracyCtx_, cmdBuffer_, IGL_PROFILER_COLOR_DRAW); ctx_.drawCallCount_ += drawCallCountEnabled_; if (vertexCount == 0) { // IGL/OpenGL tests rely on this behavior due to how state caching is organized over there. // If we do not return here, Validation Layers will complain. return; } IGL_DEBUG_ASSERT(rps_, "Did you forget to call bindRenderPipelineState()?"); ensureVertexBuffers(); flushDynamicState(); #if IGL_VULKAN_PRINT_COMMANDS IGL_LOG_INFO("%p vkCmdDraw(%u, %u, %u, %u)\n", cmdBuffer_, (uint32_t)vertexCount, instanceCount, firstVertex, baseInstance); #endif // IGL_VULKAN_PRINT_COMMANDS ctx_.vf_.vkCmdDraw(cmdBuffer_, (uint32_t)vertexCount, instanceCount, firstVertex, baseInstance); } void RenderCommandEncoder::drawIndexed(size_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t baseInstance) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_DRAW); IGL_PROFILER_ZONE_GPU_COLOR_VK( "drawIndexed()", ctx_.tracyCtx_, cmdBuffer_, IGL_PROFILER_COLOR_DRAW); ctx_.drawCallCount_ += drawCallCountEnabled_; if (indexCount == 0) { // IGL/OpenGL tests rely on this behavior due to how state caching is organized over there. // If we do not return here, Validation Layers will complain. return; } IGL_DEBUG_ASSERT(rps_, "Did you forget to call bindRenderPipelineState()?"); ensureVertexBuffers(); flushDynamicState(); #if IGL_VULKAN_PRINT_COMMANDS IGL_LOG_INFO("%p vkCmdDrawIndexed(%u, %u, %u, %i, %u)\n", cmdBuffer_, (uint32_t)indexCount, instanceCount, firstIndex, vertexOffset, baseInstance); #endif // IGL_VULKAN_PRINT_COMMANDS ctx_.vf_.vkCmdDrawIndexed( cmdBuffer_, (uint32_t)indexCount, instanceCount, firstIndex, vertexOffset, baseInstance); } void RenderCommandEncoder::drawMeshTasks(const Dimensions& threadgroupsPerGrid, const Dimensions& /*threadsPerTaskThreadgroup*/, const Dimensions& /*threadsPerMeshThreadgroup*/) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_DRAW); IGL_PROFILER_ZONE_GPU_COLOR_VK( "drawMeshTasks()", ctx_.tracyCtx_, cmdBuffer_, IGL_PROFILER_COLOR_DRAW); if (!ctx_.features().has_VK_EXT_mesh_shader) { IGL_DEBUG_ASSERT(false, "Mesh shaders require VK_EXT_mesh_shader extension."); return; } ctx_.drawCallCount_ += drawCallCountEnabled_; IGL_DEBUG_ASSERT(rps_, "Did you forget to call bindRenderPipelineState()?"); flushDynamicState(); ctx_.vf_.vkCmdDrawMeshTasksEXT( cmdBuffer_, threadgroupsPerGrid.width, threadgroupsPerGrid.height, threadgroupsPerGrid.depth); } void RenderCommandEncoder::multiDrawIndirect(IBuffer& indirectBuffer, size_t indirectBufferOffset, uint32_t drawCount, uint32_t stride) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_DRAW); IGL_PROFILER_ZONE_GPU_COLOR_VK( "multiDrawIndirect()", ctx_.tracyCtx_, cmdBuffer_, IGL_PROFILER_COLOR_DRAW); IGL_DEBUG_ASSERT(rps_, "Did you forget to call bindRenderPipelineState()?"); ensureVertexBuffers(); flushDynamicState(); ctx_.drawCallCount_ += drawCallCountEnabled_; const igl::vulkan::Buffer* bufIndirect = static_cast(&indirectBuffer); ctx_.vf_.vkCmdDrawIndirect(cmdBuffer_, bufIndirect->getVkBuffer(), indirectBufferOffset, drawCount, stride ? stride : sizeof(VkDrawIndirectCommand)); } void RenderCommandEncoder::multiDrawIndexedIndirect(IBuffer& indirectBuffer, size_t indirectBufferOffset, uint32_t drawCount, uint32_t stride) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_DRAW); IGL_PROFILER_ZONE_GPU_COLOR_VK( "multiDrawIndexedIndirect()", ctx_.tracyCtx_, cmdBuffer_, IGL_PROFILER_COLOR_DRAW); IGL_DEBUG_ASSERT(rps_, "Did you forget to call bindRenderPipelineState()?"); ensureVertexBuffers(); flushDynamicState(); ctx_.drawCallCount_ += drawCallCountEnabled_; const igl::vulkan::Buffer* bufIndirect = static_cast(&indirectBuffer); ctx_.vf_.vkCmdDrawIndexedIndirect(cmdBuffer_, bufIndirect->getVkBuffer(), indirectBufferOffset, drawCount, stride ? stride : sizeof(VkDrawIndexedIndirectCommand)); } void RenderCommandEncoder::setStencilReferenceValue(uint32_t value) { IGL_PROFILER_FUNCTION(); ctx_.vf_.vkCmdSetStencilReference( cmdBuffer_, VK_STENCIL_FACE_FRONT_BIT | VK_STENCIL_FACE_BACK_BIT, value); } void RenderCommandEncoder::setBlendColor(const Color& color) { IGL_PROFILER_FUNCTION(); ctx_.vf_.vkCmdSetBlendConstants(cmdBuffer_, color.toFloatPtr()); } void RenderCommandEncoder::setDepthBias(float depthBias, float slopeScale, float clamp) { IGL_PROFILER_FUNCTION(); dynamicState_.depthBiasEnable = true; ctx_.vf_.vkCmdSetDepthBias(cmdBuffer_, depthBias, clamp, slopeScale); } bool RenderCommandEncoder::setDrawCallCountEnabled(bool value) { IGL_PROFILER_FUNCTION(); const auto returnVal = drawCallCountEnabled_ > 0; drawCallCountEnabled_ = static_cast(value); return returnVal; } void RenderCommandEncoder::flushDynamicState() { IGL_PROFILER_FUNCTION(); binder_.bindPipeline(rps_->getVkPipeline(dynamicState_), &rps_->getSpvModuleInfo()); const VkPipelineBindPoint bindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; if (!pendingBindGroupTexture_.empty()) { VkDescriptorSet dset = ctx_.getBindGroupDescriptorSet(pendingBindGroupTexture_); VkPipelineLayout layout = rps_->getVkPipelineLayout(); const uint32_t usageMaskPipeline = rps_->getSpvModuleInfo().usageMaskTextures; const uint32_t usageMaskBindGroup = ctx_.getBindGroupUsageMask(pendingBindGroupTexture_); if (!IGL_DEBUG_VERIFY(usageMaskPipeline == usageMaskBindGroup)) { IGL_LOG_ERROR( "Texture bind group is not compatible with the current IRenderPipelineState '%s'\n", rps_->getRenderPipelineDesc().debugName.c_str()); IGL_LOG_INFO(IGL_FORMAT("Bind group textures mask: {:b}\n", usageMaskBindGroup).c_str()); IGL_LOG_INFO(IGL_FORMAT("Pipeline expects : {:b}\n", usageMaskPipeline).c_str()); return; } #if IGL_VULKAN_PRINT_COMMANDS IGL_LOG_INFO("%p vkCmdBindDescriptorSets(%u) - textures bind group\n", cmdBuffer_); #endif // IGL_VULKAN_PRINT_COMMANDS ctx_.vf_.vkCmdBindDescriptorSets( cmdBuffer_, bindPoint, layout, kBindPoint_CombinedImageSamplers, 1, &dset, 0, nullptr); // This is necessary to support a mix of BindGroups and bindTexture() calls in the same command // encoder. A typical use case for that is running ImGui rendering etc. binder_.isDirtyFlags_ &= ~igl::vulkan::ResourcesBinder::DirtyFlagBits_Textures; pendingBindGroupTexture_ = {}; // reset } if (!pendingBindGroupBuffer_.empty()) { VkDescriptorSet dset = ctx_.getBindGroupDescriptorSet(pendingBindGroupBuffer_); VkPipelineLayout layout = rps_->getVkPipelineLayout(); const uint32_t usageMaskPipeline = rps_->getSpvModuleInfo().usageMaskBuffers; const uint32_t usageMaskBindGroup = ctx_.getBindGroupUsageMask(pendingBindGroupBuffer_); if (!IGL_DEBUG_VERIFY(usageMaskPipeline == usageMaskBindGroup)) { IGL_LOG_ERROR( "Buffer bind group is not compatible with the current IRenderPipelineState '%s'\n", rps_->getRenderPipelineDesc().debugName.c_str()); IGL_LOG_INFO(IGL_FORMAT("Bind group buffers mask: {:b}\n", usageMaskBindGroup).c_str()); IGL_LOG_INFO(IGL_FORMAT("Pipeline expects : {:b}\n", usageMaskPipeline).c_str()); return; } #if IGL_VULKAN_PRINT_COMMANDS IGL_LOG_INFO("%p vkCmdBindDescriptorSets(%u) - buffers bind group\n", cmdBuffer_); #endif // IGL_VULKAN_PRINT_COMMANDS ctx_.vf_.vkCmdBindDescriptorSets(cmdBuffer_, bindPoint, layout, kBindPoint_Buffers, 1, &dset, numDynamicOffsets_, dynamicOffsets_); // This is necessary to support a mix of BindGroups and bindBuffer() calls in the same command // encoder. binder_.isDirtyFlags_ &= ~igl::vulkan::ResourcesBinder::DirtyFlagBits_Buffers; pendingBindGroupBuffer_ = {}; // reset } binder_.updateBindings(rps_->getVkPipelineLayout(), *rps_); if (ctx_.config_.enableDescriptorIndexing) { VkDescriptorSet dset = ctx_.getBindlessVkDescriptorSet(); #if IGL_VULKAN_PRINT_COMMANDS IGL_LOG_INFO("%p vkCmdBindDescriptorSets(GRAPHICS) - bindless\n", cmdBuffer_); #endif // IGL_VULKAN_PRINT_COMMANDS ctx_.vf_.vkCmdBindDescriptorSets(cmdBuffer_, VK_PIPELINE_BIND_POINT_GRAPHICS, rps_->getVkPipelineLayout(), kBindPoint_Bindless, 1, &dset, 0, nullptr); } } void RenderCommandEncoder::ensureVertexBuffers() { IGL_PROFILER_FUNCTION(); if (!IGL_DEBUG_VERIFY(rps_)) { return; } const igl::vulkan::VertexInputState* vi = static_cast(rps_->getRenderPipelineDesc().vertexInputState.get()); if (!vi) { // no vertex input is perfectly valid return; } const VertexInputStateDesc& desc = vi->desc; IGL_DEBUG_ASSERT(desc.numInputBindings <= IGL_ARRAY_NUM_ELEMENTS(isVertexBufferBound_)); for (size_t i = 0; i != desc.numAttributes; i++) { [[maybe_unused]] const size_t index = desc.attributes[i].bufferIndex; IGL_DEBUG_ASSERT(index < IGL_ARRAY_NUM_ELEMENTS(isVertexBufferBound_)); if (!isVertexBufferBound_[index]) { // TODO: fix client apps and uncomment // IGL_DEBUG_ABORT( // "Did you forget to call bindBuffer() for one of your vertex input // buffers?"); IGL_LOG_ERROR_ONCE( "Did you forget to call bindBuffer() for one of your vertex input buffers?"); } } } void RenderCommandEncoder::blitColorImage(const igl::vulkan::VulkanImage& srcImage, const igl::vulkan::VulkanImage& destImage, const igl::TextureRangeDesc& srcRange, const igl::TextureRangeDesc& destRange) { const VkImageSubresourceRange srcResourceRange = { .aspectMask = srcImage.getImageAspectFlags(), .baseMipLevel = srcRange.mipLevel, .levelCount = srcRange.numMipLevels, .baseArrayLayer = srcRange.layer, .layerCount = srcRange.numLayers, }; const VkImageSubresourceRange destSubresourceRange = { .aspectMask = destImage.getImageAspectFlags(), .baseMipLevel = destRange.mipLevel, .levelCount = destRange.numMipLevels, .baseArrayLayer = destRange.layer, .layerCount = destRange.numLayers, }; srcImage.transitionLayout(cmdBuffer_, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, srcResourceRange); destImage.transitionLayout(cmdBuffer_, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, destSubresourceRange); const std::array srcOffsets = {{ {.x = static_cast(srcRange.x), .y = static_cast(srcRange.y), .z = 0}, {.x = static_cast(srcRange.width + srcRange.x), .y = static_cast(srcRange.height + srcRange.y), .z = 1}, }}; const std::array dstOffsets = {{ {.x = static_cast(destRange.x), .y = static_cast(destRange.y), .z = 0}, {.x = static_cast(destRange.width + destRange.x), .y = static_cast(destRange.height + destRange.y), .z = 1}, }}; ivkCmdBlitImage(&ctx_.vf_, cmdBuffer_, srcImage.getVkImage(), destImage.getVkImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, srcOffsets.data(), dstOffsets.data(), VkImageSubresourceLayers{ .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, .mipLevel = srcRange.mipLevel, .baseArrayLayer = 0, .layerCount = 1, }, VkImageSubresourceLayers{ .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, .mipLevel = 0, .baseArrayLayer = 0, .layerCount = 1, }, VK_FILTER_LINEAR); const bool isSampled = (destImage.getVkImageUsageFlags() & VK_IMAGE_USAGE_SAMPLED_BIT) != 0; const bool isStorage = (destImage.getVkImageUsageFlags() & VK_IMAGE_USAGE_STORAGE_BIT) != 0; const bool isColorAttachment = (destImage.getVkImageUsageFlags() & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) != 0; const bool isDepthStencilAttachment = (destImage.getVkImageUsageFlags() & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) != 0; // a ternary cascade... const VkImageLayout targetLayout = isSampled ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : (isStorage ? VK_IMAGE_LAYOUT_GENERAL : (isColorAttachment ? VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL : (isDepthStencilAttachment ? VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_UNDEFINED))); IGL_DEBUG_ASSERT(targetLayout != VK_IMAGE_LAYOUT_UNDEFINED, "Missing usage flags"); // 3. Transition TRANSFER_DST_OPTIMAL into `targetLayout` destImage.transitionLayout(cmdBuffer_, targetLayout, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, destSubresourceRange); destImage.imageLayout_ = targetLayout; } void RenderCommandEncoder::processDependencies(const Dependencies& dependencies) { // 1. Process all textures { const Dependencies* deps = &dependencies; while (deps) { for (ITexture* IGL_NULLABLE tex : deps->textures) { if (!tex) { break; } transitionToShaderReadOnly(cmdBuffer_, tex); } deps = deps->next; } } // 2. Process all buffers { const Dependencies* deps = &dependencies; while (deps) { for (IBuffer* IGL_NULLABLE buf : deps->buffers) { if (!buf) { break; } VkPipelineStageFlags dstStageFlags = VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; const auto* vkBuf = static_cast(buf); const VkBufferUsageFlags flags = vkBuf->getBufferUsageFlags(); if ((flags & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) || (flags & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT)) { dstStageFlags |= VK_PIPELINE_STAGE_VERTEX_INPUT_BIT; } if (flags & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) { dstStageFlags |= VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT; } // compute-to-graphics barrier ivkBufferBarrier(&ctx_.vf_, cmdBuffer_, vkBuf->getVkBuffer(), vkBuf->getBufferUsageFlags(), VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, dstStageFlags); } deps = deps->next; } } } void RenderCommandEncoder::bindBindGroup(BindGroupTextureHandle handle) { IGL_DEBUG_ASSERT(!handle.empty()); pendingBindGroupTexture_ = handle; } void RenderCommandEncoder::bindBindGroup(BindGroupBufferHandle handle, uint32_t numDynamicOffsets, const uint32_t* dynamicOffsets) { IGL_DEBUG_ASSERT(!handle.empty()); pendingBindGroupBuffer_ = handle; numDynamicOffsets_ = numDynamicOffsets; if (numDynamicOffsets) { IGL_DEBUG_ASSERT(dynamicOffsets); IGL_DEBUG_ASSERT(numDynamicOffsets <= IGL_UNIFORM_BLOCKS_BINDING_MAX); checked_memcpy(dynamicOffsets_, sizeof(dynamicOffsets_), dynamicOffsets, numDynamicOffsets * sizeof(uint32_t)); } } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/RenderCommandEncoder.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include #include #include #include #include namespace igl::vulkan { /// @brief This class implements the igl::IRenderCommandEncoder interface for Vulkan class RenderCommandEncoder : public IRenderCommandEncoder { public: static std::unique_ptr create( const std::shared_ptr& commandBuffer, VulkanContext& ctx, const RenderPassDesc& renderPass, const std::shared_ptr& framebuffer, const Dependencies& dependencies, Result* outResult); ~RenderCommandEncoder() override { IGL_DEBUG_ASSERT(!isEncoding_); // did you forget to call endEncoding()? endEncoding(); } /// @brief Ends encoding for render commands and transitions the layouts of all images bound to /// this encoder back to `VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL`. Also transitions all /// dependent textures to `VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL` void endEncoding() override; void pushDebugGroupLabel(const char* label, const igl::Color& color) const override; void insertDebugEventLabel(const char* label, const igl::Color& color) const override; void popDebugGroupLabel() const override; /// @brief Sets the viewport size specified in `viewport`. This function flips the viewport in the /// y-direction but retains the same winding as in OpenGL void bindViewport(const Viewport& viewport) override; void bindScissorRect(const ScissorRect& rect) override; void bindRenderPipelineState(const std::shared_ptr& pipelineState) override; void bindDepthStencilState(const std::shared_ptr& depthStencilState) override; void bindBuffer(uint32_t index, uint8_t target, IBuffer* buffer, size_t bufferOffset, size_t bufferSize) override; void bindBuffer(uint32_t index, IBuffer* buffer, size_t bufferOffset, size_t bufferSize) override; void bindVertexBuffer(uint32_t index, IBuffer& buffer, size_t bufferOffset) override; void bindIndexBuffer(IBuffer& buffer, IndexFormat format, size_t bufferOffset) override; /// @brief Not implemented void bindBytes(size_t index, uint8_t target, const void* data, size_t length) override; /// @brief Binds push constants pointed by `data` with `length` bytes starting at `offset`. /// `length` must be a multiple of 4. void bindPushConstants(const void* data, size_t length, size_t offset) override; void bindSamplerState(size_t index, uint8_t target, ISamplerState* samplerState) override; void bindTexture(size_t index, uint8_t target, ITexture* texture) override; void bindTexture(size_t index, ITexture* texture) override; /// @brief This is only for backends that MUST use single uniforms in some situations. Do not /// implement! void bindUniform(const UniformDesc& uniformDesc, const void* data) override; void bindBindGroup(BindGroupTextureHandle handle) override; void bindBindGroup(BindGroupBufferHandle handle, uint32_t numDynamicOffsets = 0, const uint32_t* dynamicOffsets = nullptr) override; void draw(size_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t baseInstance) override; void drawIndexed(size_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t baseInstance) override; void drawMeshTasks(const Dimensions& threadgroupsPerGrid, const Dimensions& threadsPerTaskThreadgroup, const Dimensions& threadsPerMeshThreadgroup) override; void multiDrawIndirect(IBuffer& indirectBuffer, size_t indirectBufferOffset, uint32_t drawCount, uint32_t stride = 0) override; void multiDrawIndexedIndirect(IBuffer& indirectBuffer, size_t indirectBufferOffset, uint32_t drawCount, uint32_t stride = 0) override; void setStencilReferenceValue(uint32_t value) override; void setBlendColor(const Color& color) override; void setDepthBias(float depthBias, float slopeScale, float clamp) override; [[nodiscard]] VkCommandBuffer getVkCommandBuffer() const { return cmdBuffer_; } ResourcesBinder& binder() { return binder_; } /// @brief Enables or disables the draw call count. If enabled, it will increment the draw call, /// otherwise it won't. This is used to disable the draw call count when we are doing auxiliary /// draw calls. bool setDrawCallCountEnabled(bool value); void blitColorImage(const igl::vulkan::VulkanImage& srcImage, const igl::vulkan::VulkanImage& destImage, const igl::TextureRangeDesc& srcRange, const igl::TextureRangeDesc& destRange); private: RenderCommandEncoder(const std::shared_ptr& commandBuffer, VulkanContext& ctx); /// @brief Ensures that the vertex buffers are bound by performing checks. If the function doesn't /// assert at some point, the vertex buffer(s) is bound correctly. void ensureVertexBuffers(); void flushDynamicState(); void initialize(const RenderPassDesc& renderPass, const std::shared_ptr& framebuffer, const Dependencies& dependencies, Result& outResult); void processDependencies(const Dependencies& dependencies); private: VulkanContext& ctx_; VkCommandBuffer cmdBuffer_ = VK_NULL_HANDLE; bool isEncoding_ = false; bool hasDepthAttachment_ = false; std::shared_ptr framebuffer_; ResourcesBinder binder_; RenderPipelineDynamicState dynamicState_; /* Used to increment the draw call count. Should either be 0 or 1 * 0: When draw call count is disabled during auxiliary draw calls * 1: All other times */ uint32_t drawCallCountEnabled_ = 1u; bool isVertexBufferBound_[IGL_BUFFER_BINDINGS_MAX] = {}; Dependencies dependencies_ = {}; const igl::vulkan::RenderPipelineState* rps_ = nullptr; BindGroupTextureHandle pendingBindGroupTexture_ = {}; BindGroupBufferHandle pendingBindGroupBuffer_ = {}; uint32_t numDynamicOffsets_ = 0; uint32_t dynamicOffsets_[IGL_UNIFORM_BLOCKS_BINDING_MAX] = {}; }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/RenderPipelineReflection.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "RenderPipelineReflection.h" #include namespace igl::vulkan { RenderPipelineReflection::RenderPipelineReflection() = default; RenderPipelineReflection::RenderPipelineReflection(std::vector bufferArguments, std::vector samplerArguments, std::vector textureArguments) : bufferArguments_(std::move(bufferArguments)), samplerArguments_(std::move(samplerArguments)), textureArguments_(std::move(textureArguments)) {} RenderPipelineReflection::~RenderPipelineReflection() = default; const std::vector& RenderPipelineReflection::allUniformBuffers() const { return bufferArguments_; } const std::vector& RenderPipelineReflection::allSamplers() const { return samplerArguments_; } const std::vector& RenderPipelineReflection::allTextures() const { return textureArguments_; } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/RenderPipelineReflection.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::vulkan { /// @brief This is an empty class for now since Vulkan doesn't have a built-in reflection system. It /// implements the igl::IRenderPipelineReflection interface class RenderPipelineReflection final : public IRenderPipelineReflection { public: [[nodiscard]] const std::vector& allUniformBuffers() const override; [[nodiscard]] const std::vector& allSamplers() const override; [[nodiscard]] const std::vector& allTextures() const override; RenderPipelineReflection(); RenderPipelineReflection(std::vector bufferArguments, std::vector samplerArguments, std::vector textureArguments); ~RenderPipelineReflection() override; private: std::vector bufferArguments_; std::vector samplerArguments_; std::vector textureArguments_; }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/RenderPipelineState.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include namespace { VkPrimitiveTopology primitiveTypeToVkPrimitiveTopology(igl::PrimitiveType t) { switch (t) { case igl::PrimitiveType::Point: return VK_PRIMITIVE_TOPOLOGY_POINT_LIST; case igl::PrimitiveType::Line: return VK_PRIMITIVE_TOPOLOGY_LINE_LIST; case igl::PrimitiveType::LineStrip: return VK_PRIMITIVE_TOPOLOGY_LINE_STRIP; case igl::PrimitiveType::Triangle: return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; case igl::PrimitiveType::TriangleStrip: return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP; } IGL_DEBUG_ABORT("Implement PrimitiveType = %u", (uint32_t)t); return VK_PRIMITIVE_TOPOLOGY_MAX_ENUM; } VkPolygonMode polygonFillModeToVkPolygonMode(igl::PolygonFillMode mode) { switch (mode) { case igl::PolygonFillMode::Fill: return VK_POLYGON_MODE_FILL; case igl::PolygonFillMode::Line: return VK_POLYGON_MODE_LINE; } IGL_DEBUG_ABORT("Implement a missing polygon fill mode"); return VK_POLYGON_MODE_FILL; } VkCullModeFlags cullModeToVkCullMode(igl::CullMode mode) { switch (mode) { case igl::CullMode::Disabled: return VK_CULL_MODE_NONE; case igl::CullMode::Front: return VK_CULL_MODE_FRONT_BIT; case igl::CullMode::Back: return VK_CULL_MODE_BACK_BIT; } IGL_DEBUG_ABORT("Implement a missing cull mode"); return VK_CULL_MODE_NONE; } VkFrontFace windingModeToVkFrontFace(igl::WindingMode mode) { switch (mode) { case igl::WindingMode::Clockwise: return VK_FRONT_FACE_CLOCKWISE; case igl::WindingMode::CounterClockwise: return VK_FRONT_FACE_COUNTER_CLOCKWISE; } IGL_DEBUG_ABORT("Wrong winding order (cannot be more than 2)"); return VK_FRONT_FACE_CLOCKWISE; } VkFormat vertexAttributeFormatToVkFormat(igl::VertexAttributeFormat fmt) { using igl::VertexAttributeFormat; switch (fmt) { case VertexAttributeFormat::Float1: return VK_FORMAT_R32_SFLOAT; case VertexAttributeFormat::Float2: return VK_FORMAT_R32G32_SFLOAT; case VertexAttributeFormat::Float3: return VK_FORMAT_R32G32B32_SFLOAT; case VertexAttributeFormat::Float4: return VK_FORMAT_R32G32B32A32_SFLOAT; case VertexAttributeFormat::Byte1: return VK_FORMAT_R8_SINT; case VertexAttributeFormat::Byte2: return VK_FORMAT_R8G8_SINT; case VertexAttributeFormat::Byte3: return VK_FORMAT_R8G8B8_SINT; case VertexAttributeFormat::Byte4: return VK_FORMAT_R8G8B8A8_SINT; case VertexAttributeFormat::UByte1: return VK_FORMAT_R8_UINT; case VertexAttributeFormat::UByte2: return VK_FORMAT_R8G8_UINT; case VertexAttributeFormat::UByte3: return VK_FORMAT_R8G8B8_UINT; case VertexAttributeFormat::UByte4: return VK_FORMAT_R8G8B8A8_UINT; case VertexAttributeFormat::Short1: return VK_FORMAT_R16_SINT; case VertexAttributeFormat::Short2: return VK_FORMAT_R16G16_SINT; case VertexAttributeFormat::Short3: return VK_FORMAT_R16G16B16_SINT; case VertexAttributeFormat::Short4: return VK_FORMAT_R16G16B16A16_SINT; case VertexAttributeFormat::UShort1: return VK_FORMAT_R16_UINT; case VertexAttributeFormat::UShort2: return VK_FORMAT_R16G16_UINT; case VertexAttributeFormat::UShort3: return VK_FORMAT_R16G16B16_UINT; case VertexAttributeFormat::UShort4: return VK_FORMAT_R16G16B16A16_UINT; // Normalized variants case VertexAttributeFormat::Byte1Norm: return VK_FORMAT_R8_SNORM; case VertexAttributeFormat::Byte2Norm: return VK_FORMAT_R8G8_SNORM; case VertexAttributeFormat::Byte3Norm: return VK_FORMAT_R8G8B8_SNORM; case VertexAttributeFormat::Byte4Norm: return VK_FORMAT_R8G8B8A8_SNORM; case VertexAttributeFormat::UByte1Norm: return VK_FORMAT_R8_UNORM; case VertexAttributeFormat::UByte2Norm: return VK_FORMAT_R8G8_UNORM; case VertexAttributeFormat::UByte3Norm: return VK_FORMAT_R8G8B8_UNORM; case VertexAttributeFormat::UByte4Norm: return VK_FORMAT_R8G8B8A8_UNORM; case VertexAttributeFormat::Short1Norm: return VK_FORMAT_R16_SNORM; case VertexAttributeFormat::Short2Norm: return VK_FORMAT_R16G16_SNORM; case VertexAttributeFormat::Short3Norm: return VK_FORMAT_R16G16B16_SNORM; case VertexAttributeFormat::Short4Norm: return VK_FORMAT_R16G16B16A16_SNORM; case VertexAttributeFormat::UShort1Norm: return VK_FORMAT_R16_UNORM; case VertexAttributeFormat::UShort2Norm: return VK_FORMAT_R16G16_UNORM; case VertexAttributeFormat::UShort3Norm: return VK_FORMAT_R16G16B16_UNORM; case VertexAttributeFormat::UShort4Norm: return VK_FORMAT_R16G16B16A16_UNORM; // Integer formats case VertexAttributeFormat::Int1: return VK_FORMAT_R32_SINT; case VertexAttributeFormat::Int2: return VK_FORMAT_R32G32_SINT; case VertexAttributeFormat::Int3: return VK_FORMAT_R32G32B32_SINT; case VertexAttributeFormat::Int4: return VK_FORMAT_R32G32B32A32_SINT; case VertexAttributeFormat::UInt1: return VK_FORMAT_R32_UINT; case VertexAttributeFormat::UInt2: return VK_FORMAT_R32G32_UINT; case VertexAttributeFormat::UInt3: return VK_FORMAT_R32G32B32_UINT; case VertexAttributeFormat::UInt4: return VK_FORMAT_R32G32B32A32_UINT; // Half-float case VertexAttributeFormat::HalfFloat1: return VK_FORMAT_R16_SFLOAT; case VertexAttributeFormat::HalfFloat2: return VK_FORMAT_R16G16_SFLOAT; case VertexAttributeFormat::HalfFloat3: return VK_FORMAT_R16G16B16_SFLOAT; case VertexAttributeFormat::HalfFloat4: return VK_FORMAT_R16G16B16A16_SFLOAT; case VertexAttributeFormat::Int_2_10_10_10_REV: return VK_FORMAT_A2B10G10R10_SNORM_PACK32; } IGL_DEBUG_ASSERT_NOT_REACHED(); return VK_FORMAT_UNDEFINED; } VkBlendOp blendOpToVkBlendOp(igl::BlendOp value) { using igl::BlendOp; switch (value) { case BlendOp::Add: return VK_BLEND_OP_ADD; case BlendOp::Subtract: return VK_BLEND_OP_SUBTRACT; case BlendOp::ReverseSubtract: return VK_BLEND_OP_REVERSE_SUBTRACT; case BlendOp::Min: return VK_BLEND_OP_MIN; case BlendOp::Max: return VK_BLEND_OP_MAX; } IGL_DEBUG_ASSERT_NOT_REACHED(); return VK_BLEND_OP_ADD; } VkBool32 checkDualSrcBlendFactor(igl::BlendFactor value, VkBool32 dualSrcBlendSupported) { if (!dualSrcBlendSupported) { switch (value) { case igl::BlendFactor::Src1Color: case igl::BlendFactor::OneMinusSrc1Color: case igl::BlendFactor::Src1Alpha: case igl::BlendFactor::OneMinusSrc1Alpha: IGL_DEBUG_ASSERT_NOT_REACHED(); return VK_FALSE; default: return VK_TRUE; } } return VK_TRUE; } VkBlendFactor blendFactorToVkBlendFactor(igl::BlendFactor value) { using igl::BlendFactor; switch (value) { case BlendFactor::Zero: return VK_BLEND_FACTOR_ZERO; case BlendFactor::One: return VK_BLEND_FACTOR_ONE; case BlendFactor::SrcColor: return VK_BLEND_FACTOR_SRC_COLOR; case BlendFactor::OneMinusSrcColor: return VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR; case BlendFactor::DstColor: return VK_BLEND_FACTOR_DST_COLOR; case BlendFactor::OneMinusDstColor: return VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR; case BlendFactor::SrcAlpha: return VK_BLEND_FACTOR_SRC_ALPHA; case BlendFactor::OneMinusSrcAlpha: return VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; case BlendFactor::DstAlpha: return VK_BLEND_FACTOR_DST_ALPHA; case BlendFactor::OneMinusDstAlpha: return VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA; case BlendFactor::BlendColor: return VK_BLEND_FACTOR_CONSTANT_COLOR; case BlendFactor::OneMinusBlendColor: return VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR; case BlendFactor::BlendAlpha: return VK_BLEND_FACTOR_CONSTANT_ALPHA; case BlendFactor::OneMinusBlendAlpha: return VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA; case BlendFactor::SrcAlphaSaturated: return VK_BLEND_FACTOR_SRC_ALPHA_SATURATE; case BlendFactor::Src1Color: return VK_BLEND_FACTOR_SRC1_COLOR; case BlendFactor::OneMinusSrc1Color: return VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR; case BlendFactor::Src1Alpha: return VK_BLEND_FACTOR_SRC1_ALPHA; case BlendFactor::OneMinusSrc1Alpha: return VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA; default: IGL_DEBUG_ASSERT_NOT_REACHED(); return VK_BLEND_FACTOR_ONE; // default for unsupported values } } VkColorComponentFlags colorWriteMaskToVkColorComponentFlags(igl::ColorWriteMask value) { VkColorComponentFlags result = 0; if (value & igl::kColorWriteBitsRed) { result |= VK_COLOR_COMPONENT_R_BIT; } if (value & igl::kColorWriteBitsGreen) { result |= VK_COLOR_COMPONENT_G_BIT; } if (value & igl::kColorWriteBitsBlue) { result |= VK_COLOR_COMPONENT_B_BIT; } if (value & igl::kColorWriteBitsAlpha) { result |= VK_COLOR_COMPONENT_A_BIT; } return result; } } // namespace namespace igl::vulkan { RenderPipelineState::RenderPipelineState(const igl::vulkan::Device& device, RenderPipelineDesc desc) : IRenderPipelineState(desc), PipelineState(device.getVulkanContext(), desc.shaderStages.get(), desc.immutableSamplers, desc.isDynamicBufferMask, desc.debugName.c_str()), device_(device), reflection_(std::make_shared()) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); // Iterate and cache vertex input bindings and attributes const igl::vulkan::VertexInputState* vstate = static_cast(desc_.vertexInputState.get()); vertexInputStateCreateInfo_ = {.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO}; if (vstate) { std::array bufferAlreadyBound{}; vkBindings_.reserve(vstate->desc.numInputBindings); for (size_t i = 0; i != vstate->desc.numAttributes; i++) { const VertexAttribute& attr = vstate->desc.attributes[i]; const VkFormat format = vertexAttributeFormatToVkFormat(attr.format); const size_t bufferIndex = attr.bufferIndex; vkAttributes_[i] = VkVertexInputAttributeDescription{ .location = (uint32_t)attr.location, .binding = (uint32_t)bufferIndex, .format = format, .offset = (uint32_t)attr.offset, }; if (!bufferAlreadyBound[bufferIndex]) { bufferAlreadyBound[bufferIndex] = true; const VertexInputBinding& binding = vstate->desc.inputBindings[bufferIndex]; const VkVertexInputRate rate = (binding.sampleFunction == VertexSampleFunction::PerVertex) ? VK_VERTEX_INPUT_RATE_VERTEX : VK_VERTEX_INPUT_RATE_INSTANCE; vkBindings_.emplace_back(VkVertexInputBindingDescription{ .binding = (uint32_t)bufferIndex, .stride = (uint32_t)binding.stride, .inputRate = rate, }); } } vertexInputStateCreateInfo_.vertexBindingDescriptionCount = static_cast(vstate->desc.numInputBindings); vertexInputStateCreateInfo_.pVertexBindingDescriptions = vkBindings_.data(); vertexInputStateCreateInfo_.vertexAttributeDescriptionCount = static_cast(vstate->desc.numAttributes); vertexInputStateCreateInfo_.pVertexAttributeDescriptions = vkAttributes_.data(); } } RenderPipelineState::~RenderPipelineState() { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_DESTROY); const VulkanContext& ctx = device_.getVulkanContext(); VkDevice device = ctx.getVkDevice(); for (const auto& p : pipelines_) { if (p.second != VK_NULL_HANDLE) { device_.getVulkanContext().deferredTask( std::packaged_task([vf = &ctx.vf_, device, pipeline = p.second]() { vf->vkDestroyPipeline(device, pipeline, nullptr); })); } } if (pipelineLayout) { ctx.deferredTask(std::packaged_task( [vf = &ctx.vf_, device = ctx.getVkDevice(), layout = pipelineLayout]() { vf->vkDestroyPipelineLayout(device, layout, nullptr); })); } } VkPipeline RenderPipelineState::getVkPipeline( const RenderPipelineDynamicState& dynamicState) const { const VulkanContext& ctx = device_.getVulkanContext(); if (ctx.config_.enableDescriptorIndexing) { // the bindless descriptor set layout can be changed in VulkanContext when the number of // existing textures increases if (lastBindlessVkDescriptorSetLayout != ctx.getBindlessVkDescriptorSetLayout()) { // there's a new descriptor set layout - drop the previous Vulkan pipeline VkDevice device = ctx.getVkDevice(); for (const auto& p : pipelines_) { if (p.second != VK_NULL_HANDLE) { ctx.deferredTask( std::packaged_task([vf = &ctx.vf_, device, pipeline = p.second]() { vf->vkDestroyPipeline(device, pipeline, nullptr); })); } } if (pipelineLayout) { ctx.deferredTask(std::packaged_task( [vf = &ctx.vf_, device = ctx.getVkDevice(), layout = pipelineLayout]() { vf->vkDestroyPipelineLayout(device, layout, nullptr); })); } pipelines_.clear(); pipelineLayout = VK_NULL_HANDLE; lastBindlessVkDescriptorSetLayout = ctx.getBindlessVkDescriptorSetLayout(); } } const auto it = pipelines_.find(dynamicState); if (it != pipelines_.end()) { return it->second; } IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); if (!pipelineLayout) { // NOLINTNEXTLINE(modernize-avoid-c-arrays) const VkDescriptorSetLayout dsls[] = { dslCombinedImageSamplers->getVkDescriptorSetLayout(), dslBuffers->getVkDescriptorSetLayout(), dslStorageImages->getVkDescriptorSetLayout(), ctx.getBindlessVkDescriptorSetLayout(), }; const VkPipelineLayoutCreateInfo ci = { .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, .setLayoutCount = static_cast(ctx.config_.enableDescriptorIndexing ? IGL_ARRAY_NUM_ELEMENTS(dsls) : IGL_ARRAY_NUM_ELEMENTS(dsls) - 1u), .pSetLayouts = dsls, .pushConstantRangeCount = info.hasPushConstants ? 1u : 0u, .pPushConstantRanges = info.hasPushConstants ? &pushConstantRange : nullptr, }; VkDevice device = ctx.getVkDevice(); VK_ASSERT(ctx.vf_.vkCreatePipelineLayout(device, &ci, nullptr, &pipelineLayout)); VK_ASSERT( ivkSetDebugObjectName(&ctx.vf_, device, VK_OBJECT_TYPE_PIPELINE_LAYOUT, (uint64_t)pipelineLayout, IGL_FORMAT("Pipeline Layout: {}", desc_.debugName.c_str()).c_str())); } const auto& deviceFeatures = ctx.features(); const VkBool32 dualSrcBlendSupported = deviceFeatures.vkPhysicalDeviceFeatures2.features.dualSrcBlend; // build a new Vulkan pipeline VkRenderPass renderPass = ctx.getRenderPass(dynamicState.renderPassIndex).pass; VkPipeline pipeline = VK_NULL_HANDLE; // Not all attachments are valid. We need to create color blend attachments only for active // attachments std::vector colorBlendAttachmentStates; colorBlendAttachmentStates.reserve(desc_.targetDesc.colorAttachments.size()); std::for_each( desc_.targetDesc.colorAttachments.begin(), desc_.targetDesc.colorAttachments.end(), [&colorBlendAttachmentStates, dualSrcBlendSupported = dualSrcBlendSupported](auto attachment) mutable { if (attachment.textureFormat != TextureFormat::Invalid) { // In Vulkan color write bits are part of blending. if (!attachment.blendEnabled && attachment.colorWriteMask == igl::kColorWriteBitsAll) { colorBlendAttachmentStates.push_back(VkPipelineColorBlendAttachmentState{ .srcColorBlendFactor = VK_BLEND_FACTOR_ONE, .dstColorBlendFactor = VK_BLEND_FACTOR_ZERO, .colorBlendOp = VK_BLEND_OP_ADD, .srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE, .dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO, .alphaBlendOp = VK_BLEND_OP_ADD, .colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT, }); } else { checkDualSrcBlendFactor(attachment.srcRGBBlendFactor, dualSrcBlendSupported); checkDualSrcBlendFactor(attachment.dstRGBBlendFactor, dualSrcBlendSupported); checkDualSrcBlendFactor(attachment.srcAlphaBlendFactor, dualSrcBlendSupported); checkDualSrcBlendFactor(attachment.dstAlphaBlendFactor, dualSrcBlendSupported); colorBlendAttachmentStates.push_back(VkPipelineColorBlendAttachmentState{ .blendEnable = VK_TRUE, .srcColorBlendFactor = blendFactorToVkBlendFactor(attachment.srcRGBBlendFactor), .dstColorBlendFactor = blendFactorToVkBlendFactor(attachment.dstRGBBlendFactor), .colorBlendOp = blendOpToVkBlendOp(attachment.rgbBlendOp), .srcAlphaBlendFactor = blendFactorToVkBlendFactor(attachment.srcAlphaBlendFactor), .dstAlphaBlendFactor = blendFactorToVkBlendFactor(attachment.dstAlphaBlendFactor), .alphaBlendOp = blendOpToVkBlendOp(attachment.alphaBlendOp), .colorWriteMask = colorWriteMaskToVkColorComponentFlags(attachment.colorWriteMask), }); } } }); std::vector stages; if (desc_.shaderStages->getType() == igl::ShaderStagesType::Render) { const auto& vertexModule = desc_.shaderStages->getVertexModule(); stages.emplace_back(VkPipelineShaderStageCreateInfo{ .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, .stage = VK_SHADER_STAGE_VERTEX_BIT, .module = igl::vulkan::ShaderModule::getVkShaderModule(vertexModule), .pName = vertexModule->info().entryPoint.c_str(), }); } else { const auto& taskModule = desc_.shaderStages->getTaskModule(); if (taskModule) { stages.emplace_back(VkPipelineShaderStageCreateInfo{ .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, .stage = VK_SHADER_STAGE_TASK_BIT_EXT, .module = igl::vulkan::ShaderModule::getVkShaderModule(taskModule), .pName = taskModule->info().entryPoint.c_str(), }); } const auto& meshModule = desc_.shaderStages->getMeshModule(); stages.emplace_back(VkPipelineShaderStageCreateInfo{ .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, .stage = VK_SHADER_STAGE_MESH_BIT_EXT, .module = igl::vulkan::ShaderModule::getVkShaderModule(meshModule), .pName = meshModule->info().entryPoint.c_str(), }); } const auto& fragmentModule = desc_.shaderStages->getFragmentModule(); stages.emplace_back(VkPipelineShaderStageCreateInfo{ .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, .stage = VK_SHADER_STAGE_FRAGMENT_BIT, .module = igl::vulkan::ShaderModule::getVkShaderModule(fragmentModule), .pName = fragmentModule->info().entryPoint.c_str(), }); VK_ASSERT_RETURN_NULL_HANDLE( igl::vulkan::VulkanPipelineBuilder() .dynamicStates({ // from Vulkan 1.0 VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_DEPTH_BIAS, VK_DYNAMIC_STATE_BLEND_CONSTANTS, VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK, VK_DYNAMIC_STATE_STENCIL_WRITE_MASK, VK_DYNAMIC_STATE_STENCIL_REFERENCE, }) .primitiveTopology(primitiveTypeToVkPrimitiveTopology(desc_.topology)) .depthBiasEnable(dynamicState.depthBiasEnable) .depthCompareOp(dynamicState.getDepthCompareOp(), dynamicState.depthWriteEnable) .depthWriteEnable(dynamicState.depthWriteEnable) .rasterizationSamples(getVulkanSampleCountFlags(desc_.sampleCount)) .polygonMode(polygonFillModeToVkPolygonMode(desc_.polygonFillMode)) .stencilStateOps(VK_STENCIL_FACE_FRONT_BIT, dynamicState.getStencilStateFailOp(true), dynamicState.getStencilStatePassOp(true), dynamicState.getStencilStateDepthFailOp(true), dynamicState.getStencilStateCompareOp(true)) .stencilStateOps(VK_STENCIL_FACE_BACK_BIT, dynamicState.getStencilStateFailOp(false), dynamicState.getStencilStatePassOp(false), dynamicState.getStencilStateDepthFailOp(false), dynamicState.getStencilStateCompareOp(false)) .shaderStages(stages) .cullMode(cullModeToVkCullMode(desc_.cullMode)) .frontFace(windingModeToVkFrontFace(desc_.frontFaceWinding)) .vertexInputState(vertexInputStateCreateInfo_) .colorBlendAttachmentStates(colorBlendAttachmentStates) .build(ctx.vf_, ctx.getVkDevice(), ctx.pipelineCache_, pipelineLayout, renderPass, &pipeline, desc_.debugName.c_str())); IGL_DEBUG_ASSERT(pipeline != VK_NULL_HANDLE); pipelines_[dynamicState] = pipeline; // @fb-only // @lint-ignore CLANGTIDY return pipeline; } int RenderPipelineState::getIndexByName(const igl::NameHandle& name, ShaderStage stage) const { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); (void)name; (void)stage; return 0; } int RenderPipelineState::getIndexByName(const std::string& name, ShaderStage stage) const { IGL_DEBUG_ASSERT_NOT_IMPLEMENTED(); (void)name; (void)stage; return 0; } std::shared_ptr RenderPipelineState::renderPipelineReflection() { return reflection_; } void RenderPipelineState::setRenderPipelineReflection( const IRenderPipelineReflection& renderPipelineReflection) { const auto& vulkanReflection = static_cast(renderPipelineReflection); auto copy = RenderPipelineReflection(vulkanReflection); reflection_ = std::make_shared(std::move(copy)); } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/RenderPipelineState.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include namespace igl::vulkan { class Device; /// @brief This class stores all mutable pipeline parameters as member variables and serves as a /// hash key for the `RenderPipelineState` class class alignas(sizeof(uint64_t)) RenderPipelineDynamicState { uint32_t depthCompareOp_ : 3; // Ignore modernize-use-default-member-init // @lint-ignore CLANGTIDY uint32_t stencilFrontFailOp_ : 3; // Ignore modernize-use-default-member-init // @lint-ignore CLANGTIDY uint32_t stencilFrontPassOp_ : 3; // Ignore modernize-use-default-member-init // @lint-ignore CLANGTIDY uint32_t stencilFrontDepthFailOp_ : 3; // Ignore modernize-use-default-member-init // @lint-ignore CLANGTIDY uint32_t stencilFrontCompareOp_ : 3; // Ignore modernize-use-default-member-init // @lint-ignore CLANGTIDY uint32_t stencilBackFailOp_ : 3; // Ignore modernize-use-default-member-init // @lint-ignore CLANGTIDY uint32_t stencilBackPassOp_ : 3; // Ignore modernize-use-default-member-init // @lint-ignore CLANGTIDY uint32_t stencilBackDepthFailOp_ : 3; // Ignore modernize-use-default-member-init // @lint-ignore CLANGTIDY uint32_t stencilBackCompareOp_ : 3; public: // Ignore modernize-use-default-member-init // @lint-ignore CLANGTIDY uint32_t renderPassIndex : 8; // Ignore modernize-use-default-member-init // @lint-ignore CLANGTIDY uint32_t depthBiasEnable : 1; // Ignore modernize-use-default-member-init // @lint-ignore CLANGTIDY uint32_t depthWriteEnable : 1; RenderPipelineDynamicState() { // memset makes sure all padding bits are zero std::memset(this, 0, sizeof(*this)); // depth and stencil default state values should be based on DepthStencilStateDesc and // StencilStateDesc in graphics/igl/src/igl/DepthStencilState.h depthCompareOp_ = VK_COMPARE_OP_ALWAYS; stencilFrontFailOp_ = VK_STENCIL_OP_KEEP; stencilFrontPassOp_ = VK_STENCIL_OP_KEEP; stencilFrontDepthFailOp_ = VK_STENCIL_OP_KEEP; stencilFrontCompareOp_ = VK_COMPARE_OP_ALWAYS; stencilBackFailOp_ = VK_STENCIL_OP_KEEP; stencilBackPassOp_ = VK_STENCIL_OP_KEEP; stencilBackDepthFailOp_ = VK_STENCIL_OP_KEEP; stencilBackCompareOp_ = VK_COMPARE_OP_ALWAYS; renderPassIndex = 0; depthBiasEnable = false; depthWriteEnable = false; } [[nodiscard]] VkCompareOp getDepthCompareOp() const { return static_cast(depthCompareOp_); } void setDepthCompareOp(VkCompareOp depthCompareOp) { IGL_DEBUG_ASSERT((depthCompareOp & 0x7) == depthCompareOp, "Invalid VkCompareOp for depth."); depthCompareOp_ = depthCompareOp & 0x7; } [[nodiscard]] VkStencilOp getStencilStateFailOp(bool front) const { return static_cast(front ? stencilFrontFailOp_ : stencilBackFailOp_); } [[nodiscard]] VkStencilOp getStencilStatePassOp(bool front) const { return static_cast(front ? stencilFrontPassOp_ : stencilBackPassOp_); } [[nodiscard]] VkStencilOp getStencilStateDepthFailOp(bool front) const { return static_cast(front ? stencilFrontDepthFailOp_ : stencilBackDepthFailOp_); } [[nodiscard]] VkCompareOp getStencilStateCompareOp(bool front) const { return static_cast(front ? stencilFrontCompareOp_ : stencilBackCompareOp_); } void setStencilStateOps(bool front, VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp, VkCompareOp compareOp) { IGL_DEBUG_ASSERT((failOp & 0x7) == failOp, "Invalid VkStencilOp for stencil fail."); IGL_DEBUG_ASSERT((passOp & 0x7) == passOp, "Invalid VkStencilOp for stencil pass."); IGL_DEBUG_ASSERT((depthFailOp & 0x7) == depthFailOp, "Invalid VkStencilOp for depth fail."); IGL_DEBUG_ASSERT((compareOp & 0x7) == compareOp, "Invalid VkCompareOp for stencil compare."); if (front) { stencilFrontFailOp_ = failOp & 0x7; stencilFrontPassOp_ = passOp & 0x7; stencilFrontDepthFailOp_ = depthFailOp & 0x7; stencilFrontCompareOp_ = compareOp & 0x7; } else { stencilBackFailOp_ = failOp & 0x7; stencilBackPassOp_ = passOp & 0x7; stencilBackDepthFailOp_ = depthFailOp & 0x7; stencilBackCompareOp_ = compareOp & 0x7; } } // comparison operator and hash function for std::unordered_map<> bool operator==(const RenderPipelineDynamicState& other) const { return *(uint64_t*)this == *(uint64_t*)&other; } struct HashFunction { uint64_t operator()(const RenderPipelineDynamicState& s) const { return *(const uint64_t*)&s; } }; }; static_assert(sizeof(RenderPipelineDynamicState) == sizeof(uint64_t)); static_assert(alignof(RenderPipelineDynamicState) == sizeof(uint64_t)); /** @brief Implements the igl::IRenderPipelineState interface. In Vulkan, certain render parameters * belong to a pipeline, which is immutable, and changing parameters is not possible once a * pipeline has been created. IGL, on the other hand, allows some pipeline parameters to be changed. * This class manages a hash map internally that automatically tracks all pipeline's instances that * are created based on the original parameters provided during the instantiation of the class. A * Vulkan pipeline object can be retrieved with the `getVkPipeline()` method by providing its * mutable parameters. If a pipeline doesn't exist with those parameters, one is created and * returned. Otherwise an existing pipeline with those settings is returned. This class also tracks * the pipeline layout in the context. If a pipeline layout change is detected, this class purges * all the pipelines that have been created so far. */ class RenderPipelineState final : public IRenderPipelineState, public PipelineState { public: /** @brief Caches the render pipeline parameters passed in `desc` for later use. A pipeline isn't * realized until `getVkPipeline()` is called and all mutable parameters are provided. */ RenderPipelineState(const igl::vulkan::Device& device, RenderPipelineDesc desc); ~RenderPipelineState() override; /** @brief Creates a pipeline with the base parameters provided during construction and all * mutable ones provided in the `dynamicState` parameter. If a pipeline layout change is detected, * all cached pipelines are discarded. */ VkPipeline getVkPipeline(const RenderPipelineDynamicState& dynamicState) const; private: friend class Device; int getIndexByName(const igl::NameHandle& name, ShaderStage stage) const override; int getIndexByName(const std::string& name, ShaderStage stage) const override; std::shared_ptr renderPipelineReflection() override; void setRenderPipelineReflection( const IRenderPipelineReflection& renderPipelineReflection) override; private: const igl::vulkan::Device& device_; VkPipelineVertexInputStateCreateInfo vertexInputStateCreateInfo_{}; std::vector vkBindings_; std::array vkAttributes_{}; // This is empty for now. std::shared_ptr reflection_; mutable std::unordered_map pipelines_; }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/ResourcesBinder.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #include #include namespace igl::vulkan { ResourcesBinder::ResourcesBinder(const CommandBuffer* commandBuffer, VulkanContext& ctx, VkPipelineBindPoint bindPoint) : ctx_(ctx), cmdBuffer_(commandBuffer ? commandBuffer->getVkCommandBuffer() : VK_NULL_HANDLE), bindPoint_(bindPoint), nextSubmitHandle_(commandBuffer ? commandBuffer->getNextSubmitHandle() : VulkanImmediateCommands::SubmitHandle{}) {} void ResourcesBinder::bindBuffer(uint32_t index, Buffer* buffer, size_t bufferOffset, size_t bufferSize) { IGL_PROFILER_FUNCTION(); if (!IGL_DEBUG_VERIFY(index < IGL_UNIFORM_BLOCKS_BINDING_MAX)) { IGL_DEBUG_ABORT("Buffer index should not exceed kMaxBindingSlots"); return; } const bool isUniformBuffer = ((buffer->getBufferType() & BufferDesc::BufferTypeBits::Uniform) != 0); IGL_DEBUG_ASSERT(isUniformBuffer || ((buffer->getBufferType() & BufferDesc::BufferTypeBits::Storage) != 0), "The buffer must be a uniform or storage buffer"); if (bufferOffset) { const auto& limits = ctx_.getVkPhysicalDeviceProperties().limits; const uint32_t alignment = static_cast(isUniformBuffer ? limits.minUniformBufferOffsetAlignment : limits.minStorageBufferOffsetAlignment); if (!IGL_DEBUG_VERIFY((alignment == 0) || (bufferOffset % alignment == 0))) { IGL_LOG_ERROR("`bufferOffset = %u` must be a multiple of `VkPhysicalDeviceLimits::%s = %u`", static_cast(bufferOffset), isUniformBuffer ? "minUniformBufferOffsetAlignment" : "minStorageBufferOffsetAlignment", alignment); return; } } VkBuffer buf = buffer ? buffer->getVkBuffer() : ctx_.dummyUniformBuffer_->getVkBuffer(); VkDescriptorBufferInfo& slot = bindingsBuffers_.buffers[index]; if (slot.buffer != buf || slot.offset != bufferOffset) { slot = { .buffer = buf, .offset = bufferOffset, .range = bufferSize ? bufferSize : VK_WHOLE_SIZE, }; isDirtyFlags_ |= DirtyFlagBits_Buffers; } } void ResourcesBinder::bindSamplerState(uint32_t index, SamplerState* samplerState) { IGL_PROFILER_FUNCTION(); if (!IGL_DEBUG_VERIFY(index < IGL_TEXTURE_SAMPLERS_MAX)) { IGL_DEBUG_ABORT("Invalid sampler index"); return; } VulkanSampler* newSampler = samplerState ? ctx_.samplers_.get(samplerState->sampler_) : nullptr; VkSampler sampler = newSampler ? newSampler->vkSampler : VK_NULL_HANDLE; if (bindingsTextures_.samplers[index] != sampler) { bindingsTextures_.samplers[index] = sampler; isDirtyFlags_ |= DirtyFlagBits_Textures; } } void ResourcesBinder::bindTexture(uint32_t index, Texture* tex) { IGL_PROFILER_FUNCTION(); if (!IGL_DEBUG_VERIFY(index < IGL_TEXTURE_SAMPLERS_MAX)) { IGL_DEBUG_ABORT("Invalid texture index"); return; } if (tex) { const bool isSampled = tex ? (tex->getUsage() & TextureDesc::TextureUsageBits::Sampled) > 0 : false; const bool isStorage = tex ? (tex->getUsage() & TextureDesc::TextureUsageBits::Storage) > 0 : false; if (!IGL_DEBUG_VERIFY(isSampled || isStorage)) { IGL_DEBUG_ABORT( "Did you forget to specify TextureUsageBits::Sampled or " "TextureUsageBits::Storage on your texture? `Sampled` is used for sampling; " "`Storage` is used for load/store operations"); } } VulkanTexture* newTexture = tex ? &tex->getVulkanTexture() : nullptr; #if IGL_DEBUG_ABORT_ENABLED if (newTexture) { const igl::vulkan::VulkanImage& img = newTexture->image_; IGL_DEBUG_ASSERT(img.samples_ == VK_SAMPLE_COUNT_1_BIT, "Multisampled images cannot be sampled in shaders"); if (bindPoint_ == VK_PIPELINE_BIND_POINT_GRAPHICS) { // If you trip this assert, then you are likely using an IGL texture // that was not rendered to by IGL. If that's the case, then make sure // the underlying image is transitioned to // VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL IGL_DEBUG_ASSERT(img.imageLayout_ == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); } else { IGL_DEBUG_ASSERT(img.imageLayout_ == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL || img.imageLayout_ == VK_IMAGE_LAYOUT_GENERAL); } } #endif // IGL_DEBUG_ABORT_ENABLED // multisampled images cannot be directly accessed from shaders const bool isTextureAvailable = (newTexture != nullptr) && ((newTexture->image_.samples_ & VK_SAMPLE_COUNT_1_BIT) == VK_SAMPLE_COUNT_1_BIT); const bool isSampledImage = isTextureAvailable && newTexture->image_.isSampledImage(); VkImageView imageView = isSampledImage ? newTexture->imageView_.vkImageView : VK_NULL_HANDLE; if (bindingsTextures_.textures[index] != imageView) { bindingsTextures_.textures[index] = imageView; isDirtyFlags_ |= DirtyFlagBits_Textures; } } void ResourcesBinder::bindStorageImage(uint32_t index, Texture* tex) { IGL_PROFILER_FUNCTION(); if (!IGL_DEBUG_VERIFY(index < IGL_TEXTURE_SAMPLERS_MAX)) { IGL_DEBUG_ABORT("Invalid texture index"); return; } const bool isStorage = tex ? (tex->getUsage() & TextureDesc::TextureUsageBits::Storage) > 0 : false; if (tex) { if (!IGL_DEBUG_VERIFY(isStorage)) { IGL_DEBUG_ABORT("Did you forget to specify TextureUsageBits::Storage on your texture?"); } } VulkanTexture* newTexture = tex ? &tex->getVulkanTexture() : nullptr; #if IGL_DEBUG_ABORT_ENABLED if (newTexture) { const igl::vulkan::VulkanImage& img = newTexture->image_; IGL_DEBUG_ASSERT(img.samples_ == VK_SAMPLE_COUNT_1_BIT, "Multisampled images cannot be sampled in shaders"); // If you trip this assert, then you are likely using an IGL texture // that was not rendered to by IGL. If that's the case, then make sure // the underlying image is transitioned to // VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL IGL_DEBUG_ASSERT(img.imageLayout_ == VK_IMAGE_LAYOUT_GENERAL); } #endif // IGL_DEBUG_ABORT_ENABLED // multisampled images cannot be directly accessed from shaders const bool isTextureAvailable = (newTexture != nullptr) && ((newTexture->image_.samples_ & VK_SAMPLE_COUNT_1_BIT) == VK_SAMPLE_COUNT_1_BIT); const bool isStorageImage = isTextureAvailable && newTexture->image_.isStorageImage(); VkImageView imageView = isStorageImage ? newTexture->imageView_.vkImageView : VK_NULL_HANDLE; if (bindingsStorageImages_.images[index] != imageView) { bindingsStorageImages_.images[index] = imageView; isDirtyFlags_ |= DirtyFlagBits_StorageImages; } } void ResourcesBinder::updateBindings(VkPipelineLayout layout, const vulkan::PipelineState& state) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_UPDATE); IGL_DEBUG_ASSERT(layout != VK_NULL_HANDLE); if (isDirtyFlags_ & DirtyFlagBits_Textures) { ctx_.updateBindingsTextures(cmdBuffer_, layout, bindPoint_, nextSubmitHandle_, bindingsTextures_, *state.dslCombinedImageSamplers, state.info); } if (isDirtyFlags_ & DirtyFlagBits_Buffers) { ctx_.updateBindingsBuffers(cmdBuffer_, layout, bindPoint_, nextSubmitHandle_, bindingsBuffers_, *state.dslBuffers, state.info); } if (isDirtyFlags_ & DirtyFlagBits_StorageImages) { ctx_.updateBindingsStorageImages(cmdBuffer_, layout, bindPoint_, nextSubmitHandle_, bindingsStorageImages_, *state.dslStorageImages, state.info); } isDirtyFlags_ = 0; } void ResourcesBinder::bindPipeline(VkPipeline pipeline, const util::SpvModuleInfo* info) { IGL_PROFILER_FUNCTION(); if (lastPipelineBound_ == pipeline) { return; } if (info) { // a new pipeline might want a new descriptors configuration if (!info->buffers.empty()) { isDirtyFlags_ |= DirtyFlagBits_Buffers; } if (!info->textures.empty()) { isDirtyFlags_ |= DirtyFlagBits_Textures; } if (!info->images.empty()) { isDirtyFlags_ |= DirtyFlagBits_StorageImages; } } lastPipelineBound_ = pipeline; if (pipeline != VK_NULL_HANDLE) { #if IGL_VULKAN_PRINT_COMMANDS IGL_LOG_INFO("%p vkCmdBindPipeline(%s, %p)\n", cmdBuffer_, bindPoint_ == VK_PIPELINE_BIND_POINT_GRAPHICS ? "GRAPHICS" : "COMPUTE", pipeline); #endif // IGL_VULKAN_PRINT_COMMANDS ctx_.vf_.vkCmdBindPipeline(cmdBuffer_, bindPoint_, pipeline); } } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/ResourcesBinder.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::vulkan { namespace util { struct SpvModuleInfo; } // namespace util class Buffer; class PipelineState; class SamplerState; class Texture; struct BindingsBuffers { VkDescriptorBufferInfo buffers[IGL_UNIFORM_BLOCKS_BINDING_MAX] = {}; }; struct BindingsTextures { VkImageView textures[IGL_TEXTURE_SAMPLERS_MAX] = {}; VkSampler samplers[IGL_TEXTURE_SAMPLERS_MAX] = {}; }; struct BindingsStorageImages { VkImageView images[IGL_TEXTURE_SAMPLERS_MAX] = {}; }; /** @brief Stores uniform and storage buffer bindings, as well as bindings for textures and sampler * states for Vulkan. This class maintains vectors for each type of shader resource available in IGL * and records the association between binding locations (indices) and the Vulkan objects, while * performing specific checks for each type of resource when they are bound. The associations * between indices and resources is kept locally and does not affect the GPU until * `updateBindings()` is called. This class also records which resource types need to be updated * when `updateBindings()` is called and provides a convenience function to update the descriptor * sets on the context for all resource types. It only performs the update for a resource type that * has been modified after the last call to update the bindings. An instance of this class is bound * to one bind point only (VkPipelineBindPoint), which is VK_PIPELINE_BIND_POINT_GRAPHICS by * default. */ class ResourcesBinder final { public: ResourcesBinder(const CommandBuffer* commandBuffer, VulkanContext& ctx, VkPipelineBindPoint bindPoint); /// @brief Binds a uniform buffer with an offset to index equal to `index` void bindBuffer(uint32_t index, Buffer* buffer, size_t bufferOffset, size_t bufferSize); /// @brief Binds a sampler state to index equal to `index` void bindSamplerState(uint32_t index, SamplerState* samplerState); /// @brief Binds a texture to index equal to `index` void bindTexture(uint32_t index, Texture* tex); void bindStorageImage(uint32_t index, Texture* tex); /// @brief Convenience function that updates all bindings in the context for all resource types /// that have been modified since the last time this function was called void updateBindings(VkPipelineLayout layout, const vulkan::PipelineState& state); /// @brief If the pipeline passed in as a parameter is different than the last pipeline bound /// through this class, binds it and cache it as the last pipeline bound. Does nothing otherwise void bindPipeline(VkPipeline pipeline, const util::SpvModuleInfo* info); private: friend class VulkanContext; friend class RenderCommandEncoder; [[nodiscard]] bool isGraphics() const { return bindPoint_ == VK_PIPELINE_BIND_POINT_GRAPHICS; } /* * @brief Bitwise flags for dirty descriptor sets (per each supported resource type) */ enum DirtyFlagBits : uint8_t { // NOLINT DirtyFlagBits_Textures = 1 << 0, // NOLINT DirtyFlagBits_Buffers = 1 << 1, // NOLINT DirtyFlagBits_StorageImages = 1 << 2, // NOLINT }; private: VulkanContext& ctx_; VkCommandBuffer cmdBuffer_ = VK_NULL_HANDLE; VkPipeline lastPipelineBound_ = VK_NULL_HANDLE; uint32_t isDirtyFlags_ = DirtyFlagBits_Textures | DirtyFlagBits_Buffers | DirtyFlagBits_StorageImages; BindingsTextures bindingsTextures_; BindingsBuffers bindingsBuffers_; BindingsStorageImages bindingsStorageImages_; VkPipelineBindPoint bindPoint_ = VK_PIPELINE_BIND_POINT_GRAPHICS; VulkanImmediateCommands::SubmitHandle nextSubmitHandle_ = {}; }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/SamplerState.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace { VkFilter samplerMinMagFilterToVkFilter(igl::SamplerMinMagFilter filter) { switch (filter) { case igl::SamplerMinMagFilter::Nearest: return VK_FILTER_NEAREST; case igl::SamplerMinMagFilter::Linear: return VK_FILTER_LINEAR; } IGL_DEBUG_ABORT("SamplerMinMagFilter value not handled: %d", (int)filter); return VK_FILTER_LINEAR; } VkSamplerMipmapMode samplerMipFilterToVkSamplerMipmapMode(igl::SamplerMipFilter filter) { switch (filter) { case igl::SamplerMipFilter::Disabled: case igl::SamplerMipFilter::Nearest: return VK_SAMPLER_MIPMAP_MODE_NEAREST; case igl::SamplerMipFilter::Linear: return VK_SAMPLER_MIPMAP_MODE_LINEAR; } IGL_DEBUG_ABORT("SamplerMipFilter value not handled: %d", (int)filter); return VK_SAMPLER_MIPMAP_MODE_NEAREST; } VkSamplerAddressMode samplerAddressModeToVkSamplerAddressMode(igl::SamplerAddressMode mode) { switch (mode) { case igl::SamplerAddressMode::Repeat: return VK_SAMPLER_ADDRESS_MODE_REPEAT; case igl::SamplerAddressMode::Clamp: return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; case igl::SamplerAddressMode::MirrorRepeat: return VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT; } IGL_DEBUG_ABORT("SamplerAddressMode value not handled: %d", (int)mode); return VK_SAMPLER_ADDRESS_MODE_REPEAT; } VkSamplerCreateInfo samplerStateDescToVkSamplerCreateInfo(const igl::SamplerStateDesc& desc, const VkPhysicalDeviceLimits& limits) { IGL_DEBUG_ASSERT(desc.mipLodMax >= desc.mipLodMin, "mipLodMax (%d) must be greater than or equal to mipLodMin (%d)", (int)desc.mipLodMax, (int)desc.mipLodMin); VkSamplerCreateInfo ci = { .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, .pNext = nullptr, .flags = 0, .magFilter = samplerMinMagFilterToVkFilter(desc.magFilter), .minFilter = samplerMinMagFilterToVkFilter(desc.minFilter), .mipmapMode = samplerMipFilterToVkSamplerMipmapMode(desc.mipFilter), .addressModeU = samplerAddressModeToVkSamplerAddressMode(desc.addressModeU), .addressModeV = samplerAddressModeToVkSamplerAddressMode(desc.addressModeV), .addressModeW = samplerAddressModeToVkSamplerAddressMode(desc.addressModeW), .mipLodBias = 0.0f, .anisotropyEnable = VK_FALSE, .maxAnisotropy = 0.0f, .compareEnable = desc.depthCompareEnabled ? VK_TRUE : VK_FALSE, .compareOp = desc.depthCompareEnabled ? igl::vulkan::compareFunctionToVkCompareOp(desc.depthCompareFunction) : VK_COMPARE_OP_ALWAYS, .minLod = static_cast(desc.mipLodMin), .maxLod = desc.mipFilter == igl::SamplerMipFilter::Disabled ? 0.0f : static_cast(desc.mipLodMax), .borderColor = VK_BORDER_COLOR_INT_OPAQUE_BLACK, .unnormalizedCoordinates = VK_FALSE, }; if (desc.maxAnisotropic > 1) { const bool isAnisotropicFilteringSupported = limits.maxSamplerAnisotropy > 1; IGL_DEBUG_ASSERT(isAnisotropicFilteringSupported, "Anisotropic filtering is not supported by the device."); ci.anisotropyEnable = isAnisotropicFilteringSupported ? VK_TRUE : VK_FALSE; if (limits.maxSamplerAnisotropy < desc.maxAnisotropic) { IGL_LOG_INFO( "Supplied sampler anisotropic value greater than max supported by the device, setting to " "%.0f", static_cast(limits.maxSamplerAnisotropy)); } ci.maxAnisotropy = std::min((float)limits.maxSamplerAnisotropy, (float)desc.maxAnisotropic); } return ci; } } // namespace namespace igl::vulkan { SamplerState::SamplerState(Device& device) : device_(device) {} Result SamplerState::create(const SamplerStateDesc& desc) { IGL_PROFILER_FUNCTION(); desc_ = desc; const VulkanContext& ctx = device_.getVulkanContext(); Result result; sampler_ = Holder(&device_, ctx.createSampler(samplerStateDescToVkSamplerCreateInfo( desc, ctx.getVkPhysicalDeviceProperties().limits), textureFormatToVkFormat(desc.yuvFormat), &result, desc_.debugName.c_str())); if (!IGL_DEBUG_VERIFY(result.isOk())) { return result; } return sampler_.valid() ? Result() : Result(Result::Code::InvalidOperation, "Cannot create VulkanSampler"); } uint32_t SamplerState::getSamplerId() const { const VulkanSampler* sampler = device_.getVulkanContext().samplers_.get(sampler_); return sampler ? sampler->samplerId : 0; } bool SamplerState::isYUV() const noexcept { return desc_.yuvFormat != igl::TextureFormat::Invalid; } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/SamplerState.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::vulkan { class Device; /** * @brief Encapsulates a VulkanSampler class and its descriptor, along with a vulkan::Device for * creating the resource. It's a friend of the Device, which calls the private create() method when * realizing the resource */ class SamplerState final : public ISamplerState { friend class Device; public: /** * @brief Instantiates an object of the class, but doesn't create the resources on the device. * After instantiation, the object contains a reference to the device for creating the resource, * which can be done by calling the create() method with the desired configuration */ explicit SamplerState(Device& device); ~SamplerState() override = default; SamplerState(const SamplerState&) = delete; SamplerState& operator=(const SamplerState&) = delete; SamplerState(SamplerState&&) = delete; SamplerState& operator=(SamplerState&&) = delete; /** * @brief Returns the ID of the sampler. Its ID is the index of the sampler into the vector of * samplers stored in VulkanContext. The ID is set by the context when the sampler is created and * as soon as the sampler is stored in the vector of samplers maintained there. * This ID is intended for bindless rendering. See the ResourcesBinder and VulkanContext classes * for more information */ [[nodiscard]] uint32_t getSamplerId() const; /** * @brief Returns true if this sampler is a YUV sampler. */ [[nodiscard]] bool isYUV() const noexcept override; private: /** * @brief Creates the internal object instances based on the descriptor passed in as a parameter */ Result create(const SamplerStateDesc& desc); private: friend class PipelineState; friend class ResourcesBinder; friend class VulkanContext; /** @brief The device used to create the resource */ Device& device_; /** @brief The texture sampling configuration for accessing a texture */ SamplerStateDesc desc_; /** @brief The VulkanSampler instance associated with this sampler */ Holder sampler_; }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/ShaderModule.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace igl::vulkan { ShaderModule::ShaderModule(ShaderModuleInfo info, std::shared_ptr shaderModule) : IShaderModule(std::move(info)), module_(std::move(shaderModule)) { IGL_DEBUG_ASSERT(module_); } VkShaderModule ShaderModule::getVkShaderModule(const std::shared_ptr& shaderModule) { const ShaderModule* sm = static_cast(shaderModule.get()); // @fb-only // @lint-ignore CLANGTIDY return sm ? sm->module_->getVkShaderModule() : VK_NULL_HANDLE; } ShaderStages::ShaderStages(ShaderStagesDesc desc) : IShaderStages(std::move(desc)) {} ShaderLibrary::ShaderLibrary(std::vector> modules) : IShaderLibrary(std::move(modules)) {} } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/ShaderModule.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::vulkan { class VulkanShaderModule; /// @brief Implements the igl::IShaderModule interface class ShaderModule final : public IShaderModule { public: ShaderModule(ShaderModuleInfo info, std::shared_ptr shaderModule); ~ShaderModule() override = default; [[nodiscard]] const VulkanShaderModule& getVulkanShaderModule() const { return *module_; } static VkShaderModule getVkShaderModule(const std::shared_ptr& shaderModule); private: std::shared_ptr module_; }; /// @brief Implements the igl::IShaderStages interface class ShaderStages final : public IShaderStages { public: explicit ShaderStages(ShaderStagesDesc desc); ~ShaderStages() override = default; }; /// @brief Implements the igl::IShaderLibrary interface class ShaderLibrary : public IShaderLibrary { public: explicit ShaderLibrary(std::vector> modules); }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/Texture.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #include #include #include namespace igl::vulkan { Texture::Texture(Device& device, TextureFormat format) : ITexture(format), device_(device) { IGL_DEBUG_ASSERT(format != TextureFormat::Invalid); } Result Texture::create(const TextureDesc& desc) { desc_ = desc; const VulkanContext& ctx = device_.getVulkanContext(); const VkFormat vkFormat = getProperties().isDepthOrStencil() ? ctx.getClosestDepthStencilFormat(desc_.format) : textureFormatToVkFormat(desc_.format); const igl::TextureType type = desc_.type; if (!IGL_DEBUG_VERIFY(type == TextureType::TwoD || type == TextureType::TwoDArray || type == TextureType::Cube || type == TextureType::ThreeD)) { IGL_DEBUG_ABORT("Only 1D, 1D array, 2D, 2D array, 3D and cubemap textures are supported"); return Result(Result::Code::Unimplemented); } if (desc_.numMipLevels == 0) { IGL_DEBUG_ABORT("The number of mip levels specified must be greater than 0"); desc_.numMipLevels = 1; } if (desc.numSamples > 1 && desc_.numMipLevels != 1) { IGL_DEBUG_ABORT("The number of mip levels for multisampled images should be 1"); return Result(Result::Code::ArgumentOutOfRange, "The number of mip levels for multisampled images should be 1"); } if (desc.numSamples > 1 && type == TextureType::ThreeD) { IGL_DEBUG_ABORT("Multisampled 3D images are not supported"); return Result(Result::Code::ArgumentOutOfRange, "Multisampled 3D images are not supported"); } if (desc.numLayers > 1 && desc.type != TextureType::TwoDArray) { return Result{Result::Code::Unsupported, "Array textures are only supported when type is TwoDArray."}; } if (!IGL_DEBUG_VERIFY(desc_.numMipLevels <= TextureDesc::calcNumMipLevels(desc_.width, desc_.height, desc_.height))) { return Result(Result::Code::ArgumentOutOfRange, "The number of specified mip levels is greater than the maximum possible " "number of mip levels."); } if (desc_.usage == 0) { IGL_DEBUG_ABORT("Texture usage flags are not set"); desc_.usage = TextureDesc::TextureUsageBits::Sampled; } // a simple heuristic to determine proper storage as the storage type is almost never provided by // existing IGL clients if (desc_.storage == ResourceStorage::Invalid) { desc_.storage = ResourceStorage::Private; } /* Use staging device to transfer data into the image when the storage is private to the device */ VkImageUsageFlags usageFlags = (desc_.storage == ResourceStorage::Private) ? VK_IMAGE_USAGE_TRANSFER_DST_BIT : 0; // On M1 Macs, depth texture has to be ResourceStorage::Private. // On Intel Macs, multisample does not work with shared or managed storage modes if (!ctx.useStagingForBuffers_ && desc_.storage == ResourceStorage::Private && !getProperties().isDepthOrStencil() && desc.numSamples == 1) { desc_.storage = ResourceStorage::Shared; } if (desc_.usage & TextureDesc::TextureUsageBits::Sampled) { usageFlags |= VK_IMAGE_USAGE_SAMPLED_BIT; } if (desc_.usage & TextureDesc::TextureUsageBits::Storage) { IGL_DEBUG_ASSERT(desc_.numSamples <= 1, "Storage images cannot be multisampled"); usageFlags |= VK_IMAGE_USAGE_STORAGE_BIT; } if (desc_.usage & TextureDesc::TextureUsageBits::Attachment) { usageFlags |= getProperties().isDepthOrStencil() ? VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT : VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; if (desc_.storage == igl::ResourceStorage::Memoryless) { usageFlags |= VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT; } } // For now, always set this flag so we can read it back if (desc_.storage != igl::ResourceStorage::Memoryless) { // not supported on transient attachments usageFlags |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT; } IGL_DEBUG_ASSERT(usageFlags != 0, "Invalid usage flags"); const VkMemoryPropertyFlags memFlags = resourceStorageToVkMemoryPropertyFlags(desc_.storage, &ctx.memoryProperties); const std::string debugNameImage = !desc_.debugName.empty() ? IGL_FORMAT("Image: {}", desc_.debugName.c_str()) : ""; const std::string debugNameImageView = !desc_.debugName.empty() ? IGL_FORMAT("Image View: {}", desc_.debugName.c_str()) : ""; VkImageCreateFlags createFlags = 0; uint32_t arrayLayerCount = desc_.numLayers; VkImageViewType imageViewType = VK_IMAGE_VIEW_TYPE_MAX_ENUM; VkImageType imageType = VK_IMAGE_TYPE_2D; VkSampleCountFlagBits samples = VK_SAMPLE_COUNT_1_BIT; switch (desc_.type) { case TextureType::TwoD: imageViewType = VK_IMAGE_VIEW_TYPE_2D; samples = getVulkanSampleCountFlags(desc_.numSamples); break; case TextureType::ThreeD: imageViewType = VK_IMAGE_VIEW_TYPE_3D; imageType = VK_IMAGE_TYPE_3D; break; case TextureType::Cube: imageViewType = VK_IMAGE_VIEW_TYPE_CUBE; arrayLayerCount *= 6; createFlags = VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT; break; case TextureType::TwoDArray: imageViewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY; samples = getVulkanSampleCountFlags(desc_.numSamples); break; default: IGL_DEBUG_ASSERT_NOT_REACHED(); return Result(Result::Code::Unimplemented, "Unimplemented or unsupported texture type."); } const VkImageTiling tiling = desc.tiling == TextureDesc::TextureTiling::Optimal ? VK_IMAGE_TILING_OPTIMAL : VK_IMAGE_TILING_LINEAR; if (getProperties().numPlanes > 1) { // some constraints for multiplanar image formats IGL_DEBUG_ASSERT(imageType == VK_IMAGE_TYPE_2D); IGL_DEBUG_ASSERT(samples == VK_SAMPLE_COUNT_1_BIT); IGL_DEBUG_ASSERT(tiling == VK_IMAGE_TILING_OPTIMAL); IGL_DEBUG_ASSERT(desc.numLayers == 1); IGL_DEBUG_ASSERT(desc.numMipLevels == 1); createFlags |= VK_IMAGE_CREATE_DISJOINT_BIT | VK_IMAGE_CREATE_ALIAS_BIT | VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT; } Result result; VulkanImage image; if (desc_.exportability == TextureDesc::TextureExportability::NoExport) { image = ctx.createImage( imageType, VkExtent3D{(uint32_t)desc_.width, (uint32_t)desc_.height, (uint32_t)desc_.depth}, vkFormat, (uint32_t)desc_.numMipLevels, arrayLayerCount, tiling, usageFlags, memFlags, createFlags, samples, &result, debugNameImage.c_str()); if (!IGL_DEBUG_VERIFY(result.isOk())) { return result; } } else if (desc_.exportability == TextureDesc::TextureExportability::Exportable) { #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_LINUX || IGL_PLATFORM_ANDROID image = igl::vulkan::VulkanImage::createWithExportMemory( ctx, VkExtent3D{.width = (uint32_t)desc_.width, .height = (uint32_t)desc_.height, .depth = (uint32_t)desc_.depth}, imageType, vkFormat, (uint32_t)desc_.numMipLevels, arrayLayerCount, tiling, usageFlags, createFlags, samples, "vulkan export memory image"); #else // IGL_PLATFORM_WINDOWS || IGL_PLATFORM_LINUX || IGL_PLATFORM_ANDROID // Currently only Mac is not supported. return Result(Result::Code::Unimplemented, "Exportable textures are not supported on this platform."); #endif // IGL_PLATFORM_WINDOWS || IGL_PLATFORM_LINUX || IGL_PLATFORM_ANDROID } if (!IGL_DEBUG_VERIFY(image.valid())) { return Result(Result::Code::InvalidOperation, "Cannot create VulkanImage"); } VkImageAspectFlags aspect = 0; if (image.isDepthOrStencilFormat_) { if (image.isDepthFormat_) { aspect |= VK_IMAGE_ASPECT_DEPTH_BIT; } else if (image.isStencilFormat_) { aspect |= VK_IMAGE_ASPECT_STENCIL_BIT; } } else { aspect = VK_IMAGE_ASPECT_COLOR_BIT; } VulkanImageView imageView = image.createImageView(imageViewType, vkFormat, aspect, 0, VK_REMAINING_MIP_LEVELS, 0, arrayLayerCount, debugNameImageView.c_str()); if (!IGL_DEBUG_VERIFY(imageView.valid())) { return Result(Result::Code::InvalidOperation, "Cannot create VulkanImageView"); } texture_ = ctx.createTexture(std::move(image), std::move(imageView), desc.debugName.c_str()); if (aspect == VK_IMAGE_ASPECT_COLOR_BIT && samples == VK_SAMPLE_COUNT_1_BIT && (usageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) != 0 && (usageFlags & VK_IMAGE_USAGE_TRANSFER_DST_BIT) != 0) { // always clear color attachments by default clearColorTexture({0, 0, 0, 0}); } return Result(); } Result Texture::createView(const Texture& baseTexture, const TextureViewDesc& desc) { if (!IGL_DEBUG_VERIFY(baseTexture.texture_)) { return Result(Result::Code::InvalidOperation, "Cannot create a view from an empty texture"); } const VulkanTexture& vulkanTexture = *baseTexture.texture_; desc_ = baseTexture.desc_; desc_.numLayers = desc.numLayers; desc_.numMipLevels = desc.numMipLevels; const igl::TextureType type = desc_.type; if (!IGL_DEBUG_VERIFY(type == TextureType::TwoD || type == TextureType::TwoDArray || type == TextureType::Cube || type == TextureType::ThreeD)) { IGL_DEBUG_ABORT("Only 2D, 2D array, 3D and cubemap base textures are supported"); return Result(Result::Code::Unimplemented); } if (!IGL_DEBUG_VERIFY(desc.type == TextureType::TwoD || desc.type == TextureType::ThreeD)) { IGL_DEBUG_ABORT("Only 2D and 3D texture views are supported"); return Result(Result::Code::Unimplemented); } if (!desc_.numMipLevels) { IGL_DEBUG_ABORT("The number of mip levels specified must be greater than 0"); desc_.numMipLevels = 1; } const std::string debugNameImageView = !desc_.debugName.empty() ? IGL_FORMAT("Image View: {}", desc.debugName.c_str()) : ""; // make a non-owning copy VulkanImage image(vulkanTexture.image_); image.isExternallyManaged_ = true; auto aspectToVkAspectFlags = [](VkImageAspectFlags baseAspectFlags, ImageAspectFlags flags) -> VkImageAspectFlags { if (flags == ImageAspectBits_Invalid) { // use the original flags from the base texture return baseAspectFlags; } if (flags == ImageAspectBits_None) { IGL_SOFT_ERROR( "Image aspect None is not supported in this Vulkan version (requires Vulkan 1.3)"); return VK_IMAGE_ASPECT_NONE; } VkImageAspectFlags aspect = 0; if (flags & ImageAspectBits_Color) { aspect |= VK_IMAGE_ASPECT_COLOR_BIT; } if (flags & ImageAspectBits_Depth) { aspect |= VK_IMAGE_ASPECT_DEPTH_BIT; } if (flags & ImageAspectBits_Stencil) { aspect |= VK_IMAGE_ASPECT_STENCIL_BIT; } if (flags & ImageAspectBits_Plane_0) { aspect |= VK_IMAGE_ASPECT_PLANE_0_BIT; } if (flags & ImageAspectBits_Plane_1) { aspect |= VK_IMAGE_ASPECT_PLANE_1_BIT; } if (flags & ImageAspectBits_Plane_2) { aspect |= VK_IMAGE_ASPECT_PLANE_2_BIT; } return aspect; }; auto textureTypeToVkImageViewType = [](TextureType type) -> VkImageViewType { switch (type) { case TextureType::TwoD: return VK_IMAGE_VIEW_TYPE_2D; case TextureType::ThreeD: return VK_IMAGE_VIEW_TYPE_3D; case TextureType::Cube: return VK_IMAGE_VIEW_TYPE_CUBE; case TextureType::TwoDArray: return VK_IMAGE_VIEW_TYPE_2D_ARRAY; default: IGL_DEBUG_ASSERT_NOT_REACHED(); return VK_IMAGE_VIEW_TYPE_MAX_ENUM; } }; VulkanImageView imageView = image.createImageView( VulkanImageViewCreateInfo{ .viewType = textureTypeToVkImageViewType(desc.type), .format = desc.format == TextureFormat::Invalid ? image.imageFormat_ : textureFormatToVkFormat(desc.format), .components = componentMappingToVkComponentMapping(desc.swizzle), .subresourceRange = {.aspectMask = aspectToVkAspectFlags( vulkanTexture.imageView_.aspectMask, desc.aspect), .baseMipLevel = desc.mipLevel, .levelCount = desc.numMipLevels, .baseArrayLayer = desc.layer, .layerCount = desc.numLayers}, }, debugNameImageView.c_str()); if (!IGL_DEBUG_VERIFY(imageView.valid())) { return Result(Result::Code::InvalidOperation, "Cannot create VulkanImageView"); } const VulkanContext& ctx = device_.getVulkanContext(); texture_ = ctx.createTexture(std::move(image), std::move(imageView), desc.debugName.c_str()); return Result(); } bool Texture::needsRepacking(const TextureRangeDesc& /*range*/, size_t bytesPerRow) const { // Vulkan textures MUST be aligned to a multiple of the texel size or, for compressed textures, // the texel block size. return bytesPerRow != 0 && bytesPerRow % getProperties().bytesPerBlock != 0; } Result Texture::uploadInternal(TextureType /*type*/, const TextureRangeDesc& range, const void* data, size_t bytesPerRow, const uint32_t* IGL_NULLABLE /*mipLevelBytes*/) const { if (!data) { return Result{}; } const igl::vulkan::VulkanImage& vulkanImage = texture_->image_; if (vulkanImage.isMappedPtrAccessible()) { checked_memcpy( vulkanImage.mappedPtr_, vulkanImage.allocatedSize, data, bytesPerRow * range.width); vulkanImage.flushMappedMemory(); return Result(); } const VulkanContext& ctx = device_.getVulkanContext(); const VkImageAspectFlags imageAspectFlags = texture_->imageView_.getVkImageAspectFlags(); ctx.stagingDevice_->imageData( vulkanImage, desc_.type, range, getProperties(), bytesPerRow, imageAspectFlags, data); // Generate mipmaps if requested by the user if (desc_.mipmapGeneration == TextureDesc::TextureMipmapGeneration::AutoGenerateOnUpload) { if (range.mipLevel != 0) { return Result{Result::Code::InvalidOperation, "AutoGenerateOnUpload requires mipLevel to be uploaded to be 0"}; } Result result; const auto cq = device_.createCommandQueue({}, &result); if (!result.isOk()) { return result; } generateMipmap(*cq, nullptr); mipmapsAreAvailableAndUploaded_ = true; } return Result(); } Dimensions Texture::getDimensions() const { return Dimensions{desc_.width, desc_.height, desc_.depth}; } VkFormat Texture::getVkFormat() const { IGL_DEBUG_ASSERT(texture_); return texture_ ? texture_->image_.imageFormat_ : VK_FORMAT_UNDEFINED; } VkImageUsageFlags Texture::getVkUsageFlags() const { IGL_DEBUG_ASSERT(texture_); return texture_ ? texture_->image_.getVkImageUsageFlags() : 0; } uint32_t Texture::getVkExtendedFormat() const { IGL_DEBUG_ASSERT(texture_); return texture_ ? texture_->image_.extendedFormat_ : 0; } uint32_t Texture::getNumLayers() const { return desc_.numLayers; } TextureType Texture::getType() const { return desc_.type; } TextureDesc::TextureUsage Texture::getUsage() const { return desc_.usage; } uint32_t Texture::getSamples() const { return desc_.numSamples; } uint32_t Texture::getNumMipLevels() const { return desc_.numMipLevels; } void Texture::generateMipmap(ICommandQueue& /* unused */, const TextureRangeDesc* IGL_NULLABLE range) const { IGL_DEBUG_ASSERT(texture_); if (texture_ && desc_.numMipLevels > 1) { const auto& ctx = device_.getVulkanContext(); const auto& wrapper = ctx.immediate_->acquire(); texture_->image_.generateMipmap(wrapper.cmdBuf, range ? *range : desc_.asRange()); ctx.immediate_->submit(wrapper); } } void Texture::generateMipmap(ICommandBuffer& cmdBuffer, const TextureRangeDesc* range) const { IGL_DEBUG_ASSERT(texture_); auto& vkCmdBuffer = static_cast(cmdBuffer); texture_->image_.generateMipmap(vkCmdBuffer.getVkCommandBuffer(), range ? *range : desc_.asRange()); } bool Texture::isRequiredGenerateMipmap() const { if (mipmapsAreAvailableAndUploaded_) { return false; } if (!texture_ || desc_.numMipLevels <= 1) { return false; } return texture_->image_.imageLayout_ != VK_IMAGE_LAYOUT_UNDEFINED; } uint64_t Texture::getTextureId() const { const auto& config = device_.getVulkanContext().config_; IGL_DEBUG_ASSERT(config.enableDescriptorIndexing, "Make sure config.enableDescriptorIndexing is enabled."); return texture_ && config.enableDescriptorIndexing ? texture_->textureId_ : 0; } VkImageView Texture::getVkImageView() const { return texture_ ? texture_->imageView_.vkImageView : VK_NULL_HANDLE; } VkImageView Texture::getVkImageViewForFramebuffer(uint32_t mipLevel, uint32_t layer, FramebufferMode mode) const { const bool isStereo = mode == FramebufferMode::Stereo; const auto index = mipLevel * getNumVkLayers() + layer; std::vector& imageViews = isStereo ? imageViewsForFramebufferStereo_ : imageViewsForFramebufferMono_; if (index < imageViews.size() && imageViews[index].valid()) { return imageViews[index].getVkImageView(); } if (index >= imageViews.size()) { imageViews.resize(index + 1); } const VkFormat vkFormat = getProperties().isDepthOrStencil() ? device_.getVulkanContext().getClosestDepthStencilFormat(desc_.format) : textureFormatToVkFormat(desc_.format); const VkImageAspectFlags flags = texture_->image_.getImageAspectFlags(); imageViews[index] = texture_->image_.createImageView( isStereo ? VK_IMAGE_VIEW_TYPE_2D_ARRAY : VK_IMAGE_VIEW_TYPE_2D, vkFormat, flags, mipLevel, 1u, layer, isStereo ? VK_REMAINING_ARRAY_LAYERS : 1u, "Image View: igl/vulkan/Texture.cpp: Texture::getVkImageViewForFramebuffer()"); return imageViews[index].vkImageView; } VkImage Texture::getVkImage() const { return texture_ ? texture_->image_.vkImage_ : VK_NULL_HANDLE; } VulkanTexture& Texture::getVulkanTexture() const { IGL_DEBUG_ASSERT(texture_); return *texture_; } bool Texture::isSwapchainTexture() const { return texture_ ? texture_->image_.isExternallyManaged_ : false; } TextureDesc::TextureMipmapGeneration Texture::getMipmapGeneration() const { return desc_.mipmapGeneration; } uint32_t Texture::getNumVkLayers() const { return desc_.type == TextureType::Cube ? 6u : desc_.numLayers; } void Texture::clearColorTexture(const igl::Color& rgba) { if (!texture_) { return; } const igl::vulkan::VulkanImage& img = texture_->image_; IGL_DEBUG_ASSERT(img.valid()); const auto& wrapper = img.ctx_->stagingDevice_->immediate->acquire(); // There is a memory barrier inserted in clearColorImage(). // The memory barrier is necessary to ensure synchronized access. img.clearColorImage(wrapper.cmdBuf, rgba); img.ctx_->stagingDevice_->immediate->submit(wrapper); } // IAttachmentInterop interface implementation void* Texture::getNativeImage() const { return reinterpret_cast(getVkImage()); } void* Texture::getNativeImageView() const { return reinterpret_cast(getVkImageView()); } const base::AttachmentInteropDesc& Texture::getDesc() const { // Update cached attachment descriptor from IGL TextureDesc attachmentDesc_.width = desc_.width; attachmentDesc_.height = desc_.height; attachmentDesc_.depth = desc_.depth; attachmentDesc_.numLayers = desc_.numLayers; attachmentDesc_.numSamples = desc_.numSamples; attachmentDesc_.numMipLevels = desc_.numMipLevels; attachmentDesc_.type = desc_.type; attachmentDesc_.format = desc_.format; attachmentDesc_.isSampled = (desc_.usage & TextureDesc::TextureUsageBits::Sampled) != 0; return attachmentDesc_; } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/Texture.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include namespace igl::vulkan { class Device; class VulkanTexture; class PlatformDevice; /// @brief Implements the igl::ITexture interface class Texture : public ITexture { friend class Device; friend class PlatformDevice; public: /// @brief Initializes an instance of the class, but does not create the resource on the device /// until `create()` is called Texture(Device& device, TextureFormat format); /// @brief Initializes an instance of the class with an existing VulkanTexture object. Texture(Device& device, std::shared_ptr vkTexture, TextureDesc desc) : Texture(device, desc.format) { texture_ = std::move(vkTexture); desc_ = std::move(desc); } // Accessors Dimensions getDimensions() const override; uint32_t getNumLayers() const override; TextureType getType() const override; TextureDesc::TextureUsage getUsage() const override; uint32_t getSamples() const override; uint32_t getNumMipLevels() const override; void generateMipmap(ICommandQueue& cmdQueue, const TextureRangeDesc* IGL_NULLABLE range = nullptr) const override; void generateMipmap(ICommandBuffer& cmdBuffer, const TextureRangeDesc* IGL_NULLABLE range = nullptr) const override; bool isRequiredGenerateMipmap() const override; uint64_t getTextureId() const override; bool isSwapchainTexture() const override; TextureDesc::TextureMipmapGeneration getMipmapGeneration() const; VkFormat getVkFormat() const; uint32_t getVkExtendedFormat() const; VkImageUsageFlags getVkUsageFlags() const; VkImageView getVkImageView() const; // IAttachmentInterop interface [[nodiscard]] void* IGL_NULLABLE getNativeImage() const override; [[nodiscard]] void* IGL_NULLABLE getNativeImageView() const override; [[nodiscard]] const base::AttachmentInteropDesc& getDesc() const override; /// @brief Specialization of `getVkImageView()` that returns an image view specific to a mip level /// and layer of an image. Used to retrieve image views to be used with framebuffers VkImageView getVkImageViewForFramebuffer(uint32_t mipLevel, uint32_t layer, FramebufferMode mode) const; // framebuffers can render // only into 1 mip-level VkImage getVkImage() const; VulkanTexture& getVulkanTexture() const; uint32_t getNumVkLayers() const; private: [[nodiscard]] bool needsRepacking(const TextureRangeDesc& range, size_t bytesPerRow) const final; /// @brief Uploads the texture's data to the device using the staging device in the context. This /// function is not synchronous and the data may or may not be available to the GPU upon return. Result uploadInternal(TextureType type, const TextureRangeDesc& range, const void* data, size_t bytesPerRow, const uint32_t* IGL_NULLABLE mipLevelBytes) const final; void clearColorTexture(const igl::Color& rgba); protected: Device& device_; TextureDesc desc_; mutable base::AttachmentInteropDesc attachmentDesc_; // Cached for IAttachmentInterop::getDesc() std::shared_ptr texture_; mutable std::vector imageViewsForFramebufferMono_; mutable std::vector imageViewsForFramebufferStereo_; /// @brief Creates the resource on the device given the properties in `desc`. This function should /// only be called by the `Device` class, from its `vulkan::Device::createTexture()` virtual Result create(const TextureDesc& desc); virtual Result createView(const Texture& baseTexture, const TextureViewDesc& desc); /// @brief To record whether mipmaps are available and uploaded to the GPU. This is used by the /// `isRequiredGenerateMipmap()` function mutable bool mipmapsAreAvailableAndUploaded_ = false; }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanBuffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "VulkanBuffer.h" #include #include #include namespace igl::vulkan { VulkanBuffer::VulkanBuffer(const VulkanContext& ctx, VkDevice device, VkDeviceSize bufferSize, VkBufferUsageFlags usageFlags, VkMemoryPropertyFlags memFlags, const char* debugName) : ctx_(ctx), device_(device), bufferSize_(bufferSize), usageFlags_(usageFlags), memFlags_(memFlags) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); IGL_DEBUG_ASSERT(bufferSize > 0); // Initialize Buffer Info const VkBufferCreateInfo ci = { .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, .size = bufferSize, .usage = usageFlags, .sharingMode = VK_SHARING_MODE_EXCLUSIVE, }; if (IGL_VULKAN_USE_VMA) { VmaAllocationCreateInfo ciAlloc = { .usage = VMA_MEMORY_USAGE_AUTO, }; // Initialize VmaAllocation Info if (memFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) { ciAlloc.requiredFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT; ciAlloc.preferredFlags = VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT; ciAlloc.flags = VMA_ALLOCATION_CREATE_MAPPED_BIT | VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT; // Check if coherent buffer is available. VK_ASSERT(ctx_.vf_.vkCreateBuffer(device_, &ci, nullptr, &vkBuffer_)); VkMemoryRequirements requirements = {}; ctx_.vf_.vkGetBufferMemoryRequirements(device_, vkBuffer_, &requirements); ctx_.vf_.vkDestroyBuffer(device, vkBuffer_, nullptr); vkBuffer_ = VK_NULL_HANDLE; if (requirements.memoryTypeBits & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) { ciAlloc.requiredFlags |= VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; isCoherentMemory_ = true; } } const VkResult result = vmaCreateBuffer( (VmaAllocator)ctx_.getVmaAllocator(), &ci, &ciAlloc, &vkBuffer_, &vmaAllocation_, nullptr); if (result != VK_SUCCESS || vmaAllocation_ == nullptr) { // Allocation failed - possibly due to memory pressure from deferred tasks not being // processed. Drain deferred tasks queue to free memory. const_cast(ctx_).waitDeferredTasks(); VK_ASSERT(vmaCreateBuffer((VmaAllocator)ctx_.getVmaAllocator(), &ci, &ciAlloc, &vkBuffer_, &vmaAllocation_, nullptr)); } IGL_DEBUG_ASSERT(vmaAllocation_ != nullptr); if (vmaAllocation_) { vmaSetAllocationName((VmaAllocator)ctx_.getVmaAllocator(), vmaAllocation_, IGL_FORMAT("VMA Allocation: {}", debugName).c_str()); // handle memory-mapped buffers if (memFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) { vmaMapMemory((VmaAllocator)ctx_.getVmaAllocator(), vmaAllocation_, &mappedPtr_); } } } else { // create buffer VK_ASSERT(ctx_.vf_.vkCreateBuffer(device_, &ci, nullptr, &vkBuffer_)); // back the buffer with some memory { VkMemoryRequirements requirements = {}; ctx_.vf_.vkGetBufferMemoryRequirements(device_, vkBuffer_, &requirements); if (requirements.memoryTypeBits & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) { isCoherentMemory_ = true; } VK_ASSERT(ivkAllocateMemory(&ctx_.vf_, ctx_.getVkPhysicalDevice(), device_, &requirements, memFlags, ctx.features().has_VK_KHR_buffer_device_address, &vkMemory_)); VK_ASSERT(ctx_.vf_.vkBindBufferMemory(device_, vkBuffer_, vkMemory_, 0)); VK_ASSERT(ivkSetDebugObjectName(&ctx_.vf_, device_, VK_OBJECT_TYPE_DEVICE_MEMORY, (uint64_t)vkMemory_, IGL_FORMAT("Buffer memory: {}", debugName).c_str())); } // handle memory-mapped buffers if (memFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) { VK_ASSERT(ctx_.vf_.vkMapMemory(device_, vkMemory_, 0, bufferSize_, 0, &mappedPtr_)); } } IGL_DEBUG_ASSERT(vkBuffer_ != VK_NULL_HANDLE); // set debug name VK_ASSERT(ivkSetDebugObjectName( &ctx_.vf_, device_, VK_OBJECT_TYPE_BUFFER, (uint64_t)vkBuffer_, debugName)); // handle shader access if (usageFlags & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_KHR) { const VkBufferDeviceAddressInfo ai = { .sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_KHR, .buffer = vkBuffer_, }; vkDeviceAddress_ = ctx_.vf_.vkGetBufferDeviceAddressKHR(device_, &ai); IGL_DEBUG_ASSERT(vkDeviceAddress_); } } VulkanBuffer::~VulkanBuffer() { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_DESTROY); IGL_ENSURE_VULKAN_CONTEXT_THREAD(&ctx_); if (IGL_VULKAN_USE_VMA) { if (mappedPtr_) { vmaUnmapMemory((VmaAllocator)ctx_.getVmaAllocator(), vmaAllocation_); } ctx_.deferredTask(std::packaged_task( [vma = ctx_.getVmaAllocator(), buffer = vkBuffer_, allocation = vmaAllocation_]() { vmaDestroyBuffer((VmaAllocator)vma, buffer, allocation); })); } else { if (mappedPtr_) { ctx_.vf_.vkUnmapMemory(device_, vkMemory_); } ctx_.deferredTask(std::packaged_task( [vf = &ctx_.vf_, device = device_, buffer = vkBuffer_, memory = vkMemory_]() { vf->vkDestroyBuffer(device, buffer, nullptr); vf->vkFreeMemory(device, memory, nullptr); })); } } void VulkanBuffer::flushMappedMemory(VkDeviceSize offset, VkDeviceSize size) const { if (!IGL_DEBUG_VERIFY(isMapped())) { return; } if (IGL_VULKAN_USE_VMA) { vmaFlushAllocation((VmaAllocator)ctx_.getVmaAllocator(), vmaAllocation_, offset, size); } else { const VkMappedMemoryRange memoryRange = { .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, .memory = vkMemory_, .offset = offset, .size = size, }; ctx_.vf_.vkFlushMappedMemoryRanges(device_, 1, &memoryRange); } } void VulkanBuffer::invalidateMappedMemory(VkDeviceSize offset, VkDeviceSize size) const { if (!IGL_DEBUG_VERIFY(isMapped())) { return; } if (IGL_VULKAN_USE_VMA) { vmaInvalidateAllocation( static_cast(ctx_.getVmaAllocator()), vmaAllocation_, offset, size); } else { const VkMappedMemoryRange memoryRange = { .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, .memory = vkMemory_, .offset = offset, .size = size, }; ctx_.vf_.vkInvalidateMappedMemoryRanges(device_, 1, &memoryRange); } } void VulkanBuffer::getBufferSubData(size_t offset, size_t size, void* data) const { IGL_PROFILER_FUNCTION(); // Only mapped host-visible buffers can be downloaded this way. All other // GPU buffers should use a temporary staging buffer IGL_DEBUG_ASSERT(mappedPtr_); if (!mappedPtr_) { return; } IGL_DEBUG_ASSERT(offset + size <= bufferSize_); if (!isCoherentMemory_) { invalidateMappedMemory(offset, size); } const uint8_t* src = static_cast(mappedPtr_) + offset; checked_memcpy(data, size, src, size); } void VulkanBuffer::bufferSubData(size_t offset, size_t size, const void* data) { IGL_PROFILER_FUNCTION(); // Only mapped host-visible buffers can be uploaded this way. All other GPU buffers should use a // temporary staging buffer IGL_DEBUG_ASSERT(mappedPtr_); if (!mappedPtr_) { return; } IGL_DEBUG_ASSERT(offset + size <= bufferSize_); if (data) { checked_memcpy((uint8_t*)mappedPtr_ + offset, bufferSize_ - offset, data, size); } else { memset((uint8_t*)mappedPtr_ + offset, 0, size); } if (!isCoherentMemory_) { flushMappedMemory(offset, size); } } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanBuffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::vulkan { class VulkanContext; /// @brief A wrapper around a Vulkan Buffer object that provides convenience functions for /// uploading/downloading data to/from the GPU. class VulkanBuffer { public: /** @brief Creates a new VulkanBuffer with a given size, usage flags, memory property flags, and * an optional debug name. Uses VMA if IGL is built with VMA support. If memory flags specify * that the buffer is visible by the host (the CPU), then the buffer's memory will be mapped into * the application's address space and can be accessed directly. */ VulkanBuffer(const VulkanContext& ctx, VkDevice device, VkDeviceSize bufferSize, VkBufferUsageFlags usageFlags, VkMemoryPropertyFlags memFlags, const char* debugName = nullptr); ~VulkanBuffer(); VulkanBuffer(const VulkanBuffer&) = delete; VulkanBuffer& operator=(const VulkanBuffer&) = delete; VulkanBuffer(VulkanBuffer&&) = delete; VulkanBuffer& operator=(VulkanBuffer&&) = delete; /** @brief Uploads the data located at `data` into the buffer on the device with the provided * `offset`. Only mapped host-visible buffers can be uploaded this way. All other GPU buffers * should use a temporary staging buffer. If the buffer's data has not been mapped, this function * is a no-op. This function is synchronous and the data is expected to be available when the * function returns */ void bufferSubData(size_t offset, size_t size, const void* data); /** @brief Downloads the data located at `offset` from the buffer on the device to the location * pointed by `data`. Only mapped host-visible buffers can be downloaded this way. All other GPU * buffers should use a temporary staging buffer. If the buffer's data has not been mapped, this * function is a no-op. This function is synchronous and the data is expected to be available * when the function returns. */ void getBufferSubData(size_t offset, size_t size, void* data) const; [[nodiscard]] uint8_t* getMappedPtr() const { return static_cast(mappedPtr_); } /// @brief Whether the buffer's memory has been mapped. [[nodiscard]] bool isMapped() const { return mappedPtr_ != nullptr; } /// @brief Flushes the mapped memory range to make it visible to the GPU. void flushMappedMemory(VkDeviceSize offset, VkDeviceSize size) const; /// @brief Invalidates the mapped memory range to make it visible to the CPU. void invalidateMappedMemory(VkDeviceSize offset, VkDeviceSize size) const; [[nodiscard]] VkBuffer getVkBuffer() const { return vkBuffer_; } [[nodiscard]] VkDeviceAddress getVkDeviceAddress() const { IGL_DEBUG_ASSERT(vkDeviceAddress_, "Make sure config.enableBufferDeviceAddress is enabled"); return vkDeviceAddress_; } [[nodiscard]] VkDeviceSize getSize() const { return bufferSize_; } [[nodiscard]] VkMemoryPropertyFlags getMemoryPropertyFlags() const { return memFlags_; } [[nodiscard]] VkBufferUsageFlags getBufferUsageFlags() const { return usageFlags_; } [[nodiscard]] bool isCoherentMemory() const { return isCoherentMemory_; } private: const VulkanContext& ctx_; VkDevice device_ = VK_NULL_HANDLE; VkBuffer vkBuffer_ = VK_NULL_HANDLE; VkDeviceMemory vkMemory_ = VK_NULL_HANDLE; VmaAllocation vmaAllocation_ = VK_NULL_HANDLE; VkDeviceAddress vkDeviceAddress_ = 0; VkDeviceSize bufferSize_ = 0; VkBufferUsageFlags usageFlags_ = 0; VkMemoryPropertyFlags memFlags_ = 0; void* mappedPtr_ = nullptr; bool isCoherentMemory_ = false; }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanContext.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include // For vk_mem_alloc.h, define this before including VulkanContext.h in exactly // one CPP file #if defined(IGL_CMAKE_BUILD) #define VMA_IMPLEMENTATION #endif // IGL_CMAKE_BUILD // For volk.h, define this before including volk.h in exactly one CPP file. // @fb-only #if defined(IGL_CMAKE_BUILD) #define VOLK_IMPLEMENTATION #endif // IGL_CMAKE_BUILD #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if IGL_PLATFORM_APPLE #include #endif namespace { [[maybe_unused]] const char* kValidationLayerName = "VK_LAYER_KHRONOS_validation"; const char* kGfxReconstructLayerName = "VK_LAYER_LUNARG_gfxreconstruct"; /* BINDLESS ONLY: these bindings should match GLSL declarations injected into shaders in Device::compileShaderModule(). Same with SparkSL. */ // NOLINTBEGIN(readability-identifier-naming) const uint32_t kBinding_Texture2D = 0; const uint32_t kBinding_Texture2DArray = 1; const uint32_t kBinding_Texture3D = 2; const uint32_t kBinding_TextureCube = 3; const uint32_t kBinding_Sampler = 4; const uint32_t kBinding_SamplerShadow = 5; const uint32_t kBinding_StorageImages = 6; // NOLINTEND(readability-identifier-naming) #if !IGL_PLATFORM_APPLE VKAPI_ATTR VkBool32 VKAPI_CALL vulkanDebugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT msgSeverity, [[maybe_unused]] VkDebugUtilsMessageTypeFlagsEXT msgType, const VkDebugUtilsMessengerCallbackDataEXT* cbData, void* userData) { if (msgSeverity < VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT) { return VK_FALSE; } const bool isError = (msgSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) != 0; auto* ctx = static_cast(userData); #if IGL_LOGGING_ENABLED std::array errorName = {}; int object = 0; void* handle = nullptr; std::array typeName = {}; void* messageID = nullptr; if (sscanf(cbData->pMessage, "Validation Error : [ %127s ] Object %i: handle = %p, type = %127s | MessageID = %p", errorName.data(), &object, &handle, typeName.data(), &messageID) >= 2) { const char* message = strrchr(cbData->pMessage, '|') + 1; IGL_LOG_INFO( "%sValidation layer:\n Validation Error: %s \n Object %i: handle = %p, type = %s\n " "MessageID = %p \n%s \n", isError ? "\nERROR:\n" : "", errorName.data(), object, handle, typeName.data(), messageID, message); #if IGL_VULKAN_VALIDATION_LAYER_ERROR_SUMMARY ctx.validationErrorsSummary_[errorName.data()]++; #endif } else { const bool isWarning = (msgSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) != 0; if (isError || isWarning || ctx->config_.enableExtraLogs) { IGL_LOG_INFO("%sValidation layer:\n%s\n", isError ? "\nERROR:\n" : "", cbData->pMessage); } } #endif if (ctx->config_.terminateOnValidationError) { if (IGL_DEBUG_VERIFY_NOT(isError)) { std::terminate(); } } return VK_FALSE; } #endif // !IGL_PLATFORM_ANDROID std::vector getCompatibleDepthStencilFormats(igl::TextureFormat format) { switch (format) { case igl::TextureFormat::Z_UNorm16: return {VK_FORMAT_D16_UNORM, VK_FORMAT_D16_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D32_SFLOAT}; case igl::TextureFormat::Z_UNorm24: return {VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D32_SFLOAT, VK_FORMAT_D16_UNORM_S8_UINT}; case igl::TextureFormat::Z_UNorm32: return {VK_FORMAT_D32_SFLOAT, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT}; case igl::TextureFormat::S8_UInt_Z24_UNorm: return {VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D16_UNORM_S8_UINT}; case igl::TextureFormat::S8_UInt_Z32_UNorm: return {VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D16_UNORM_S8_UINT}; case igl::TextureFormat::S_UInt8: return {VK_FORMAT_S8_UINT, VK_FORMAT_D16_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT}; // default default: return {VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D32_SFLOAT}; } } bool validateImageLimits(VkImageType imageType, VkSampleCountFlagBits samples, const VkExtent3D& extent, const VkPhysicalDeviceLimits& limits, igl::Result* IGL_NULLABLE outResult) { using igl::Result; if (samples != VK_SAMPLE_COUNT_1_BIT && !IGL_DEBUG_VERIFY(imageType == VK_IMAGE_TYPE_2D)) { Result::setResult( outResult, Result(Result::Code::InvalidOperation, "Multisampling is supported only for 2D images")); return false; } if (imageType == VK_IMAGE_TYPE_1D && !IGL_DEBUG_VERIFY(extent.width <= limits.maxImageDimension1D)) { Result::setResult(outResult, Result(Result::Code::InvalidOperation, "1D texture size exceeded")); return false; } else if (imageType == VK_IMAGE_TYPE_2D && !IGL_DEBUG_VERIFY(extent.width <= limits.maxImageDimension2D && extent.height <= limits.maxImageDimension2D)) { Result::setResult(outResult, Result(Result::Code::InvalidOperation, "2D texture size exceeded")); return false; } else if (imageType == VK_IMAGE_TYPE_3D && !IGL_DEBUG_VERIFY(extent.width <= limits.maxImageDimension3D && extent.height <= limits.maxImageDimension3D && extent.depth <= limits.maxImageDimension3D)) { Result::setResult(outResult, Result(Result::Code::InvalidOperation, "3D texture size exceeded")); return false; } Result::setOk(outResult); return true; } } // namespace namespace igl::vulkan { // @fb-only class DescriptorPoolsArena final { public: DescriptorPoolsArena(const VulkanContext& ctx, VkDescriptorType type, VkDescriptorSetLayout dsl, uint32_t numDescriptorsPerDSet, const char* IGL_NULLABLE debugName) : ctx_(ctx), device_(ctx.getVkDevice()), numTypes_(1), types_{type}, numDescriptorsPerDSet_(numDescriptorsPerDSet), dsl_(dsl) { IGL_DEBUG_ASSERT(debugName); dpDebugName_ = IGL_FORMAT("Descriptor Pool: {}", debugName ? debugName : ""); } DescriptorPoolsArena(const VulkanContext& ctx, VkDescriptorType type0, VkDescriptorType type1, VkDescriptorSetLayout dsl, uint32_t numDescriptorsPerDSet, const char* debugName) : ctx_(ctx), device_(ctx.getVkDevice()), numTypes_(2), types_{type0, type1}, numDescriptorsPerDSet_(numDescriptorsPerDSet), dsl_(dsl) { IGL_DEBUG_ASSERT(debugName); dpDebugName_ = IGL_FORMAT("Descriptor Pool: {}", debugName ? debugName : ""); } DescriptorPoolsArena(const DescriptorPoolsArena&) = delete; DescriptorPoolsArena& operator=(const DescriptorPoolsArena&) = delete; DescriptorPoolsArena(DescriptorPoolsArena&&) = delete; DescriptorPoolsArena& operator=(DescriptorPoolsArena&&) = delete; ~DescriptorPoolsArena() { extinct_.push_back({pool_, {}}); ctx_.deferredTask(std::packaged_task( [extinct = std::move(extinct_), vf = ctx_.vf_, device = device_]() { for (const auto& p : extinct) { vf.vkDestroyDescriptorPool(device, p.pool, nullptr); } })); } [[nodiscard]] VkDescriptorSetLayout getVkDescriptorSetLayout() const { return dsl_; } [[nodiscard]] VkDescriptorSet getNextDescriptorSet( VulkanImmediateCommands& ic, VulkanImmediateCommands::SubmitHandle nextSubmitHandle) { IGL_DEBUG_ASSERT(!nextSubmitHandle.empty()); VkDescriptorSet dset = VK_NULL_HANDLE; if (!numRemainingDSetsInPool_) { switchToNewDescriptorPool(ic, nextSubmitHandle); } VK_ASSERT(ivkAllocateDescriptorSet(&ctx_.vf_, device_, pool_, dsl_, &dset)); numRemainingDSetsInPool_--; return dset; } private: void switchToNewDescriptorPool(VulkanImmediateCommands& ic, VulkanImmediateCommands::SubmitHandle nextSubmitHandle) { numRemainingDSetsInPool_ = kNumDSetsPerPool; if (pool_ != VK_NULL_HANDLE) { extinct_.push_back({pool_, nextSubmitHandle}); } // first, let's try to reuse the oldest extinct pool (never reuse pools that are tagged with the // same SubmitHandle because they have not yet been submitted) if (extinct_.size() > 1 && extinct_.front().handle != nextSubmitHandle) { const ExtinctDescriptorPool p = extinct_.front(); if (ic.isReady(p.handle)) { pool_ = p.pool; extinct_.pop_front(); VK_ASSERT(ctx_.vf_.vkResetDescriptorPool(device_, pool_, VkDescriptorPoolResetFlags{})); return; } } // NOLINTNEXTLINE(modernize-avoid-c-arrays) VkDescriptorPoolSize poolSizes[IGL_ARRAY_NUM_ELEMENTS(types_)]; for (uint32_t i = 0; i != numTypes_; i++) { poolSizes[i] = VkDescriptorPoolSize{ types_[i], numDescriptorsPerDSet_ ? kNumDSetsPerPool * numDescriptorsPerDSet_ : 1u}; } VK_ASSERT(ivkCreateDescriptorPool(&ctx_.vf_, device_, VkDescriptorPoolCreateFlags{}, kNumDSetsPerPool, numTypes_, poolSizes, &pool_)); VK_ASSERT(ivkSetDebugObjectName( &ctx_.vf_, device_, VK_OBJECT_TYPE_DESCRIPTOR_POOL, (uint64_t)pool_, dpDebugName_.c_str())); } private: static constexpr uint32_t kNumDSetsPerPool = 64; const VulkanContext& ctx_; VkDevice device_ = VK_NULL_HANDLE; VkDescriptorPool pool_ = VK_NULL_HANDLE; const uint32_t numTypes_ = 0; VkDescriptorType types_[2] = {VK_DESCRIPTOR_TYPE_MAX_ENUM, VK_DESCRIPTOR_TYPE_MAX_ENUM}; const uint32_t numDescriptorsPerDSet_ = 0; uint32_t numRemainingDSetsInPool_ = 0; std::string dpDebugName_; VkDescriptorSetLayout dsl_ = VK_NULL_HANDLE; // owned elsewhere struct ExtinctDescriptorPool { VkDescriptorPool pool = VK_NULL_HANDLE; VulkanImmediateCommands::SubmitHandle handle = {}; }; std::deque extinct_; }; namespace { struct BindGroupMetadataTextures { // cold BindGroupTextureDesc desc = {}; VkDescriptorPool pool = VK_NULL_HANDLE; // hot VkDescriptorSet dset = VK_NULL_HANDLE; uint32_t usageMask = 0; }; struct BindGroupMetadataBuffers { // cold BindGroupBufferDesc desc = {}; VkDescriptorPool pool = VK_NULL_HANDLE; // hot VkDescriptorSet dset = VK_NULL_HANDLE; uint32_t usageMask = 0; }; } // namespace struct VulkanContextImpl final { std::thread::id contextThread = std::this_thread::get_id(); // Vulkan Memory Allocator VmaAllocator vma = VK_NULL_HANDLE; // :) std::unordered_map> arenaCombinedImageSamplers; std::unordered_map> arenaBuffers; std::unordered_map> arenaStorageImages; std::unique_ptr dslBindless; // everything VkDescriptorPool dpBindless = VK_NULL_HANDLE; VkDescriptorSet dsBindless = VK_NULL_HANDLE; uint32_t currentMaxBindlessTextures = 8; uint32_t currentMaxBindlessSamplers = 8; Pool bindGroupBuffersPool; Pool bindGroupTexturesPool; SamplerHandle dummySampler = {}; TextureHandle dummyTexture = {}; // NOLINTBEGIN(readability-identifier-naming) DescriptorPoolsArena& getOrCreateArena_CombinedImageSamplers(const VulkanContext& ctx, VkDescriptorSetLayout dsl, uint32_t numBindings) // NOLINTEND(readability-identifier-naming) { auto it = arenaCombinedImageSamplers.find(dsl); if (it != arenaCombinedImageSamplers.end()) { return *it->second; } arenaCombinedImageSamplers[dsl] = std::make_unique(ctx, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, dsl, numBindings, "arenaCombinedImageSamplers_"); return *arenaCombinedImageSamplers[dsl].get(); } // NOLINTBEGIN(readability-identifier-naming) DescriptorPoolsArena& getOrCreateArena_StorageImages(const VulkanContext& ctx, VkDescriptorSetLayout dsl, uint32_t numBindings) // NOLINTEND(readability-identifier-naming) { auto it = arenaStorageImages.find(dsl); if (it != arenaStorageImages.end()) { return *it->second; } arenaStorageImages[dsl] = std::make_unique( ctx, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, dsl, numBindings, "arenaStorageImages_"); return *arenaStorageImages[dsl].get(); } // NOLINTBEGIN(readability-identifier-naming) DescriptorPoolsArena& getOrCreateArena_Buffers(const VulkanContext& ctx, VkDescriptorSetLayout dsl, uint32_t numBindings) // NOLINTEND(readability-identifier-naming) { auto it = arenaBuffers.find(dsl); if (it != arenaBuffers.end()) { return *it->second; } arenaBuffers[dsl] = std::make_unique(ctx, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, dsl, numBindings, "arenaBuffers_"); return *arenaBuffers[dsl].get(); } }; VulkanContext::VulkanContext(VulkanContextConfig config, void* IGL_NULLABLE window, void* IGL_NULLABLE display) : tableImpl_(std::make_unique()), // NOLINTBEGIN(clang-diagnostic-missing-designated-field-initializers) vkPhysicalDeviceDescriptorIndexingProperties_({ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT, .pNext = nullptr, }), vkPhysicalDeviceDriverProperties_({ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR, .pNext = &vkPhysicalDeviceDescriptorIndexingProperties_, }), vkPhysicalDeviceProperties2_({ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2, .pNext = &vkPhysicalDeviceDriverProperties_, }), vkPhysicalDeviceMeshShaderPropertiesEXT_({ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_EXT, .pNext = nullptr, }), // NOLINTEND(clang-diagnostic-missing-designated-field-initializers) features_(config), vf_(*tableImpl_), config_(config) { IGL_PROFILER_THREAD("MainThread"); pimpl_ = std::make_unique(); #if defined(IGL_CMAKE_BUILD) const auto result = volkInitialize(); // Do not remove for backward compatibility with projects using global functions. if (result != VK_SUCCESS) { IGL_LOG_ERROR("volkInitialize() failed with error code %d\n", static_cast(result)); abort(); }; #endif // IGL_CMAKE_BUILD vulkan::functions::initialize(*tableImpl_); glslang::initializeCompiler(); createInstance(); if (config_.headless) { IGL_DEBUG_ASSERT(features_.has_VK_EXT_headless_surface, "VK_EXT_headless_surface extension is not supported"); createHeadlessSurface(); } else if (window || display) { createSurface(window, display); } } VulkanContext::~VulkanContext() { IGL_PROFILER_FUNCTION(); if (vkDevice_) { waitIdle(); } #if defined(IGL_WITH_TRACY_GPU) if (tracyCtx_) { TracyVkDestroy(tracyCtx_); vf_.vkDestroyCommandPool(vkDevice_, profilingCommandPool_, nullptr); } #endif dummyStorageBuffer_.reset(); dummyUniformBuffer_.reset(); #if IGL_DEBUG_ABORT_ENABLED for (const auto& t : pimpl_->bindGroupTexturesPool.objects_) { if (t.obj_.dset != VK_NULL_HANDLE) { IGL_DEBUG_ABORT("Leaked texture bind group detected! %s", t.obj_.desc.debugName.c_str()); } } for (const auto& t : pimpl_->bindGroupBuffersPool.objects_) { if (t.obj_.dset != VK_NULL_HANDLE) { IGL_DEBUG_ABORT("Leaked buffer bind group detected! %s", t.obj_.desc.debugName.c_str()); } } #endif // IGL_DEBUG_ABORT_ENABLED // BindGroups can hold shared pointers to textures/samplers/buffers. Release them here. pimpl_->bindGroupTexturesPool.clear(); pimpl_->bindGroupBuffersPool.clear(); destroy(pimpl_->dummySampler); destroy(pimpl_->dummyTexture); pruneTextures(); #if IGL_LOGGING_ENABLED if (textures_.numObjects()) { IGL_LOG_ERROR("Leaked %u textures\n", textures_.numObjects()); } if (samplers_.numObjects()) { IGL_LOG_ERROR("Leaked %u samplers\n", samplers_.numObjects()); } #endif // IGL_LOGGING_ENABLED textures_.clear(); samplers_.clear(); // This will free an internal buffer that was allocated by VMA stagingDevice_.reset(nullptr); if (vkDevice_) { for (auto r : renderPasses_) { vf_.vkDestroyRenderPass(vkDevice_, r, nullptr); } } pimpl_->dslBindless.reset(nullptr); swapchain_.reset(nullptr); // Swapchain has to be destroyed prior to Surface waitDeferredTasks(); immediate_.reset(nullptr); timelineSemaphore_.reset(nullptr); if (vkDevice_) { if (pimpl_->dpBindless != VK_NULL_HANDLE) { vf_.vkDestroyDescriptorPool(vkDevice_, pimpl_->dpBindless, nullptr); } for (auto& p : ycbcrConversionInfos_) { if (p.second.conversion != VK_NULL_HANDLE) { vf_.vkDestroySamplerYcbcrConversion(vkDevice_, p.second.conversion, nullptr); } } pimpl_->arenaCombinedImageSamplers.clear(); pimpl_->arenaStorageImages.clear(); pimpl_->arenaBuffers.clear(); vf_.vkDestroyPipelineCache(vkDevice_, pipelineCache_, nullptr); } if (vkSurface_ != VK_NULL_HANDLE) { vf_.vkDestroySurfaceKHR(vkInstance_, vkSurface_, nullptr); } // Clean up VMA if (IGL_VULKAN_USE_VMA) { vmaDestroyAllocator(pimpl_->vma); } if (vkDevice_) { vf_.vkDestroyDevice(vkDevice_, nullptr); // Device has to be destroyed prior to Instance } #if !IGL_PLATFORM_ANDROID if (vf_.vkDestroyDebugUtilsMessengerEXT != nullptr) { vf_.vkDestroyDebugUtilsMessengerEXT(vkInstance_, vkDebugUtilsMessenger_, nullptr); } #endif // !IGL_PLATFORM_ANDROID if (vf_.vkDestroyInstance != nullptr) { vf_.vkDestroyInstance(vkInstance_, nullptr); } glslang::finalizeCompiler(); #if IGL_LOGGING_ENABLED if (config_.enableExtraLogs) { IGL_LOG_INFO("Vulkan graphics pipelines created: %u\n", VulkanPipelineBuilder::getNumPipelinesCreated()); IGL_LOG_INFO("Vulkan compute pipelines created: %u\n", VulkanComputePipelineBuilder::getNumPipelinesCreated()); } #endif // IGL_LOGGING_ENABLED #if defined(IGL_CMAKE_BUILD) volkFinalize(); #endif #if IGL_VULKAN_VALIDATION_LAYER_ERROR_SUMMARY if (!validationErrorsSummary_.empty()) { IGL_LOG_INFO("Vulkan Validation Layer errors found: %u\n", validationErrorsSummary_.size()); for (const auto& error : validationErrorsSummary_) { IGL_LOG_ERROR("\t%s: %u\n", error.first.c_str(), error.second); } } #endif } void VulkanContext::createInstance() { IGL_DEBUG_ASSERT(vkInstance_ == VK_NULL_HANDLE, "createInstance() is not reentrant"); // Enumerate all instance extensions features_.enumerate(vf_); // NOLINTBEGIN(readability-identifier-naming) features_.enableCommonInstanceExtensions(config_); for (size_t index = 0; index < config_.numExtraInstanceExtensions; ++index) { features_.enable(config_.extraInstanceExtensions[index], VulkanFeatures::ExtensionType::Instance); } // NOLINTEND(readability-identifier-naming) auto instanceExtensions = features_.allEnabled(VulkanFeatures::ExtensionType::Instance); std::vector layers; // @fb-only #if !IGL_PLATFORM_ANDROID && !IGL_PLATFORM_MACOSX if (config_.enableValidation) { layers.emplace_back(kValidationLayerName); } #endif if (config_.enableGfxReconstruct) { layers.emplace_back(kGfxReconstructLayerName); } // Validation Features not available on most Android devices #if !IGL_PLATFORM_ANDROID && !IGL_PLATFORM_MACOSX std::vector valFeatures; if (config_.enableGPUAssistedValidation) { valFeatures.push_back(VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT); } const VkValidationFeaturesEXT features = { .sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT, .enabledValidationFeatureCount = (uint32_t)valFeatures.size(), .pEnabledValidationFeatures = valFeatures.empty() ? nullptr : valFeatures.data(), }; #endif // !IGL_PLATFORM_ANDROID const VkApplicationInfo appInfo = { .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, .pApplicationName = config_.applicationName, .applicationVersion = VK_MAKE_VERSION(1, 0, 0), .pEngineName = config_.engineName, .engineVersion = VK_MAKE_VERSION(1, 0, 0), .apiVersion = VK_API_VERSION_1_2, }; const VkInstanceCreateInfo ci = { .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, #if !IGL_PLATFORM_ANDROID && !IGL_PLATFORM_MACOSX .pNext = config_.enableValidation ? &features : nullptr, #endif .flags = features_.has_VK_KHR_portability_enumeration ? VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR : (VkInstanceCreateFlags)0, .pApplicationInfo = &appInfo, .enabledLayerCount = static_cast(layers.size()), .ppEnabledLayerNames = !layers.empty() ? layers.data() : nullptr, .enabledExtensionCount = (uint32_t)instanceExtensions.size(), .ppEnabledExtensionNames = instanceExtensions.data(), }; { // Prints information about available instance layers uint32_t count = 0; vf_.vkEnumerateInstanceLayerProperties(&count, nullptr); std::vector layerProperties(count); vf_.vkEnumerateInstanceLayerProperties(&count, layerProperties.data()); IGL_LOG_INFO("Found %u Vulkan instance layers\n", count); for ([[maybe_unused]] const auto& layer : layerProperties) { IGL_LOG_INFO("\t%s - %u.%u.%u.%u, %u\n", layer.layerName, VK_API_VERSION_MAJOR(layer.specVersion), VK_API_VERSION_MINOR(layer.specVersion), VK_API_VERSION_VARIANT(layer.specVersion), VK_API_VERSION_PATCH(layer.specVersion), layer.implementationVersion); } } const VkResult result = vf_.vkCreateInstance(&ci, nullptr, &vkInstance_); IGL_DEBUG_ASSERT(result != VK_ERROR_LAYER_NOT_PRESENT, "vkCreateInstance() failed. Did you forget to install the Vulkan SDK?"); VK_ASSERT(result); #if defined(IGL_CMAKE_BUILD) // Do not remove for backward compatibility with projects using global functions. volkLoadInstance(vkInstance_); #endif const bool enableExtDebugUtils = features_.enable(VK_EXT_DEBUG_UTILS_EXTENSION_NAME, VulkanFeatures::ExtensionType::Instance); vulkan::functions::loadInstanceFunctions(*tableImpl_, vkInstance_, enableExtDebugUtils); #if !IGL_PLATFORM_APPLE if (features_.enabled(VK_EXT_DEBUG_UTILS_EXTENSION_NAME)) { VK_ASSERT(ivkCreateDebugUtilsMessenger( &vf_, vkInstance_, &vulkanDebugCallback, this, &vkDebugUtilsMessenger_)); } #endif // !IGL_PLATFORM_APPLE #if IGL_LOGGING_ENABLED if (config_.enableExtraLogs) { // log available instance extensions IGL_LOG_INFO("Vulkan instance extensions:\n"); for (const auto& extension : features_.allAvailableExtensions(VulkanFeatures::ExtensionType::Instance)) { IGL_LOG_INFO(" %s\n", extension.c_str()); } } #endif } void VulkanContext::createHeadlessSurface() { const VkHeadlessSurfaceCreateInfoEXT ci = { .sType = VK_STRUCTURE_TYPE_HEADLESS_SURFACE_CREATE_INFO_EXT, .pNext = nullptr, .flags = 0, }; VK_ASSERT(vf_.vkCreateHeadlessSurfaceEXT(vkInstance_, &ci, nullptr, &vkSurface_)); } void VulkanContext::createSurface(void* IGL_NULLABLE window, void* IGL_NULLABLE display) { [[maybe_unused]] void* layer = nullptr; #if IGL_PLATFORM_APPLE layer = igl::vulkan::getCAMetalLayer(window); #endif VK_ASSERT(ivkCreateSurface(&vf_, vkInstance_, window, display, layer, &vkSurface_)); } Result VulkanContext::queryDevices(const HWDeviceQueryDesc& desc, std::vector& outDevices) { outDevices.clear(); // Physical devices uint32_t deviceCount = 0; if (vf_.vkEnumeratePhysicalDevices == nullptr) { return Result(Result::Code::Unsupported, "Vulkan functions are not loaded"); } VK_ASSERT_RETURN(vf_.vkEnumeratePhysicalDevices(vkInstance_, &deviceCount, nullptr)); std::vector vkDevices(deviceCount); VK_ASSERT_RETURN(vf_.vkEnumeratePhysicalDevices(vkInstance_, &deviceCount, vkDevices.data())); auto convertVulkanDeviceTypeToIGL = [](VkPhysicalDeviceType vkDeviceType) -> HWDeviceType { switch (vkDeviceType) { case VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU: return HWDeviceType::IntegratedGpu; case VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU: return HWDeviceType::DiscreteGpu; case VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU: return HWDeviceType::ExternalGpu; case VK_PHYSICAL_DEVICE_TYPE_CPU: return HWDeviceType::SoftwareGpu; default: return HWDeviceType::Unknown; } }; const HWDeviceType desiredDeviceType = desc.hardwareType; for (uint32_t i = 0; i < deviceCount; ++i) { VkPhysicalDevice physicalDevice = vkDevices[i]; VkPhysicalDeviceProperties deviceProperties; vf_.vkGetPhysicalDeviceProperties(physicalDevice, &deviceProperties); const HWDeviceType deviceType = convertVulkanDeviceTypeToIGL(deviceProperties.deviceType); // filter non-suitable hardware devices if (desiredDeviceType != HWDeviceType::Unknown && deviceType != desiredDeviceType) { continue; } outDevices.emplace_back((uintptr_t)vkDevices[i], deviceType, deviceProperties.vendorID, deviceProperties.deviceName, std::to_string(deviceProperties.vendorID)); } if (outDevices.empty()) { return Result(Result::Code::Unsupported, "No Vulkan devices matching your criteria"); } return Result(); } Result VulkanContext::initContext(const HWDeviceDesc& desc, size_t numExtraDeviceExtensions, const char* IGL_NULLABLE* IGL_NULLABLE extraDeviceExtensions, const VulkanFeatures* IGL_NULLABLE requestedFeatures, const char* IGL_NULLABLE debugName) { IGL_DEBUG_ASSERT(vkDevice_ == VK_NULL_HANDLE); if (desc.guid == 0UL) { IGL_LOG_ERROR("Invalid hardwareGuid(%lu)", desc.guid); return Result(Result::Code::Unsupported, "Vulkan is not supported"); } vkPhysicalDevice_ = (VkPhysicalDevice)desc.guid; // NOLINT(performance-no-int-to-ptr) // Caches the memory types vf_.vkGetPhysicalDeviceMemoryProperties(vkPhysicalDevice_, &memoryProperties); useStagingForBuffers_ = !ivkIsHostVisibleSingleHeapMemory(&memoryProperties); // Get the available physical device features VulkanFeatures availableFeatures(config_); availableFeatures.populateWithAvailablePhysicalDeviceFeatures(*this, vkPhysicalDevice_); // Use the requested features passed to the function (if any) or use the default features if (requestedFeatures) { features_ = *requestedFeatures; } features_.populateWithAvailablePhysicalDeviceFeatures(*this, vkPhysicalDevice_); // ... and check whether they are available in the physical device (they should be) { auto featureCheckResult = features_.checkSelectedFeatures(availableFeatures); if (!featureCheckResult.isOk()) { return featureCheckResult; } } vf_.vkGetPhysicalDeviceProperties2(vkPhysicalDevice_, &vkPhysicalDeviceProperties2_); const uint32_t apiVersion = vkPhysicalDeviceProperties2_.properties.apiVersion; if (config_.enableExtraLogs) { IGL_LOG_INFO("Device: %s\n", debugName ? debugName : "igl/vulkan/VulkanContext.cpp"); IGL_LOG_INFO("Vulkan physical device: %s\n", vkPhysicalDeviceProperties2_.properties.deviceName); IGL_LOG_INFO(" API version: %i.%i.%i.%i\n", VK_API_VERSION_MAJOR(apiVersion), VK_API_VERSION_MINOR(apiVersion), VK_API_VERSION_PATCH(apiVersion), VK_API_VERSION_VARIANT(apiVersion)); IGL_LOG_INFO(" Driver info: %s %s\n", vkPhysicalDeviceDriverProperties_.driverName, vkPhysicalDeviceDriverProperties_.driverInfo); } features_.enumerate(vf_, vkPhysicalDevice_); #if IGL_LOGGING_ENABLED if (config_.enableExtraLogs) { IGL_LOG_INFO("Vulkan physical device extensions:\n"); // log available physical device extensions for (const auto& extension : features_.allAvailableExtensions(VulkanFeatures::ExtensionType::Device)) { IGL_LOG_INFO(" %s\n", extension.c_str()); } } #endif features_.enableCommonDeviceExtensions(config_); // Enable extra device extensions for (size_t i = 0; i < numExtraDeviceExtensions; i++) { features_.enable(extraDeviceExtensions[i], VulkanFeatures::ExtensionType::Device); } if (features_.available(VK_EXT_MESH_SHADER_EXTENSION_NAME, VulkanFeatures::ExtensionType::Device)) { vkPhysicalDeviceDescriptorIndexingProperties_.pNext = &vkPhysicalDeviceMeshShaderPropertiesEXT_; vf_.vkGetPhysicalDeviceProperties2(vkPhysicalDevice_, &vkPhysicalDeviceProperties2_); } VulkanQueuePool queuePool(vf_, vkPhysicalDevice_); // Reserve IGL Vulkan queues auto graphicsQueueDescriptor = queuePool.findQueueDescriptor(VK_QUEUE_GRAPHICS_BIT); auto computeQueueDescriptor = queuePool.findQueueDescriptor(VK_QUEUE_COMPUTE_BIT); if (!graphicsQueueDescriptor.isValid()) { IGL_LOG_ERROR("VK_QUEUE_GRAPHICS_BIT is not supported"); return Result(Result::Code::Unsupported, "VK_QUEUE_GRAPHICS_BIT is not supported"); } if (!computeQueueDescriptor.isValid()) { IGL_LOG_ERROR("VK_QUEUE_COMPUTE_BIT is not supported"); return Result(Result::Code::Unsupported, "VK_QUEUE_COMPUTE_BIT is not supported"); } deviceQueues_.graphicsQueueFamilyIndex = graphicsQueueDescriptor.familyIndex; deviceQueues_.computeQueueFamilyIndex = computeQueueDescriptor.familyIndex; queuePool.reserveQueue(graphicsQueueDescriptor); queuePool.reserveQueue(computeQueueDescriptor); const auto qcis = queuePool.getQueueCreationInfos(); auto deviceExtensions = features_.allEnabled(VulkanFeatures::ExtensionType::Device); VkDevice device = nullptr; VK_ASSERT_RETURN(ivkCreateDevice(&vf_, vkPhysicalDevice_, qcis.size(), qcis.data(), deviceExtensions.size(), deviceExtensions.data(), &features_.vkPhysicalDeviceFeatures2, &device)); // Check that device is not null before proceeding if (device == VK_NULL_HANDLE) { return Result(Result::Code::InvalidOperation, "Failed to create Vulkan device"); } #if defined(IGL_CMAKE_BUILD) if (!config_.enableConcurrentVkDevicesSupport) { // Do not remove for backward compatibility with projects using global functions. volkLoadDevice(device); } #endif // Table functions are always bound to a device. Project using enableConcurrentVkDevicesSupport // should use own copy of function table bound to a device. vulkan::functions::loadDeviceFunctions(*tableImpl_, device); if (features_.has_VK_KHR_buffer_device_address && vf_.vkGetBufferDeviceAddressKHR == nullptr) { return Result(Result::Code::InvalidOperation, "Cannot initialize VK_KHR_buffer_device_address"); } vf_.vkGetDeviceQueue( device, deviceQueues_.graphicsQueueFamilyIndex, 0, &deviceQueues_.graphicsQueue); vf_.vkGetDeviceQueue( device, deviceQueues_.computeQueueFamilyIndex, 0, &deviceQueues_.computeQueue); vkDevice_ = device; VK_ASSERT(ivkSetDebugObjectName(&vf_, vkDevice_, VK_OBJECT_TYPE_DEVICE, (uint64_t)vkDevice_, IGL_FORMAT("Device: VulkanContext::device_ {}", debugName ? debugName : "igl/vulkan/VulkanContext.cpp") .c_str())); VK_ASSERT(ivkSetDebugObjectName( &vf_, vkDevice_, VK_OBJECT_TYPE_QUEUE, (uint64_t)deviceQueues_.graphicsQueue, IGL_FORMAT("Graphics{} queue: {}", deviceQueues_.graphicsQueue == deviceQueues_.computeQueue ? "/compute" : "", debugName ? debugName : "igl/vulkan/VulkanContext.cpp") .c_str())); if (deviceQueues_.graphicsQueue != deviceQueues_.computeQueue) { VK_ASSERT(ivkSetDebugObjectName( &vf_, vkDevice_, VK_OBJECT_TYPE_QUEUE, (uint64_t)deviceQueues_.computeQueue, IGL_FORMAT("Compute queue: {}", debugName ? debugName : "igl/vulkan/VulkanContext.cpp") .c_str())); } immediate_ = std::make_unique(vf_, device, deviceQueues_.graphicsQueueFamilyIndex, config_.exportableFences, features_.has_VK_KHR_timeline_semaphore && features_.has_VK_KHR_synchronization2, "VulkanContext::immediate_"); IGL_DEBUG_ASSERT(config_.maxResourceCount > 0, "Max resource count needs to be greater than zero"); syncSubmitHandles.resize(config_.maxResourceCount); // create Vulkan pipeline cache { const VkPipelineCacheCreateInfo ci = { .sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO, .flags = VkPipelineCacheCreateFlags(0), .initialDataSize = config_.pipelineCacheDataSize, .pInitialData = config_.pipelineCacheData, }; vf_.vkCreatePipelineCache(device, &ci, nullptr, &pipelineCache_); } // Create Vulkan Memory Allocator if (IGL_VULKAN_USE_VMA) { VK_ASSERT_RETURN( ivkVmaCreateAllocator(&vf_, vkPhysicalDevice_, vkDevice_, vkInstance_, apiVersion > VK_API_VERSION_1_3 ? VK_API_VERSION_1_3 : apiVersion, features_.has_VK_KHR_buffer_device_address, (VkDeviceSize)config_.vmaPreferredLargeHeapBlockSize, &pimpl_->vma)); } // Caches the memory types vf_.vkGetPhysicalDeviceMemoryProperties(vkPhysicalDevice_, &memoryProperties); // The staging device will use VMA to allocate a buffer, so this needs // to happen after VMA has been initialized. stagingDevice_ = std::make_unique(*this); // Unextended Vulkan 1.1 does not allow sparse (VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT) // bindings. Our descriptor set layout emulates OpenGL binding slots but we cannot put // VK_NULL_HANDLE into empty slots. We use dummy buffers to stick them into those empty slots. dummyUniformBuffer_ = createBuffer(256, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, nullptr, "Buffer: dummy uniform"); dummyStorageBuffer_ = createBuffer(256, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, nullptr, "Buffer: dummy storage"); // default texture { const VkFormat dummyTextureFormat = VK_FORMAT_R8G8B8A8_UNORM; Result result; auto image = createImage(VK_IMAGE_TYPE_2D, VkExtent3D{1, 1, 1}, dummyTextureFormat, 1, 1, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, 0, VK_SAMPLE_COUNT_1_BIT, &result, "Image: dummy 1x1"); if (!IGL_DEBUG_VERIFY(result.isOk())) { return result; } if (!IGL_DEBUG_VERIFY(image.valid())) { return Result(Result::Code::InvalidOperation, "Cannot create VulkanImage"); } auto imageView = image.createImageView(VK_IMAGE_VIEW_TYPE_2D, dummyTextureFormat, VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0, 1, "Image View: dummy 1x1"); if (!IGL_DEBUG_VERIFY(imageView.valid())) { return Result(Result::Code::InvalidOperation, "Cannot create VulkanImageView"); } pimpl_->dummyTexture = textures_.create(std::make_shared(std::move(image), std::move(imageView))); IGL_DEBUG_ASSERT(textures_.numObjects() == 1); const uint32_t pixel = 0xFF000000; const VkImageAspectFlags imageAspectFlags = (*textures_.get(pimpl_->dummyTexture))->imageView_.getVkImageAspectFlags(); stagingDevice_->imageData( (*textures_.get(pimpl_->dummyTexture))->image_, TextureType::TwoD, TextureRangeDesc::new2D(0, 0, 1, 1), TextureFormatProperties::fromTextureFormat(TextureFormat::RGBA_UNorm8), 0, imageAspectFlags, &pixel); } // default sampler pimpl_->dummySampler = createSampler( { .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, .pNext = nullptr, .flags = 0, .magFilter = VK_FILTER_LINEAR, .minFilter = VK_FILTER_LINEAR, .mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST, .addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT, .addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT, .addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT, .mipLodBias = 0.0f, .anisotropyEnable = VK_FALSE, .maxAnisotropy = 0.0f, .compareEnable = VK_FALSE, .compareOp = VK_COMPARE_OP_ALWAYS, .minLod = 0.0f, .maxLod = 0.0f, .borderColor = VK_BORDER_COLOR_INT_OPAQUE_BLACK, .unnormalizedCoordinates = VK_FALSE, }, VK_FORMAT_UNDEFINED, nullptr, "Sampler: default"); IGL_DEBUG_ASSERT(samplers_.numObjects() == 1); growBindlessDescriptorPool(pimpl_->currentMaxBindlessTextures, pimpl_->currentMaxBindlessSamplers); querySurfaceCapabilities(); #if defined(IGL_WITH_TRACY_GPU) VK_ASSERT(ivkCreateCommandPool(&vf_, vkDevice_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, deviceQueues_.graphicsQueueFamilyIndex, &profilingCommandPool_)); ivkSetDebugObjectName(&vf_, vkDevice_, VK_OBJECT_TYPE_COMMAND_POOL, (uint64_t)profilingCommandPool_, "VulkanContext::profilingCommandPool_ (Tracy)"); profilingCommandBuffer_ = VK_NULL_HANDLE; VK_ASSERT( ivkAllocateCommandBuffer(&vf_, vkDevice_, profilingCommandPool_, &profilingCommandBuffer_)); #if defined(VK_EXT_calibrated_timestamps) if (features_.enabled(VK_EXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME)) { tracyCtx_ = TracyVkContextCalibrated(vkInstance_, getVkPhysicalDevice(), getVkDevice(), deviceQueues_.graphicsQueue, profilingCommandBuffer_, tableImpl_->vkGetInstanceProcAddr, tableImpl_->vkGetDeviceProcAddr); } #endif // VK_EXT_calibrated_timestamps // If VK_EXT_calibrated_timestamps is not available or it has not been enabled, use the // uncalibrated Tracy context if (!tracyCtx_) { tracyCtx_ = TracyVkContext(vkInstance_, getVkPhysicalDevice(), getVkDevice(), deviceQueues_.graphicsQueue, profilingCommandBuffer_, tableImpl_->vkGetInstanceProcAddr, tableImpl_->vkGetDeviceProcAddr); } IGL_DEBUG_ASSERT(tracyCtx_, "Failed to create Tracy GPU profiling context"); #endif // IGL_WITH_TRACY_GPU return Result(); } void VulkanContext::growBindlessDescriptorPool(uint32_t newMaxTextures, uint32_t newMaxSamplers) { // only do allocations if actually enabled if (!config_.enableDescriptorIndexing) { return; } IGL_PROFILER_FUNCTION(); pimpl_->currentMaxBindlessTextures = newMaxTextures; pimpl_->currentMaxBindlessSamplers = newMaxSamplers; #if IGL_VULKAN_PRINT_COMMANDS IGL_LOG_INFO("growBindlessDescriptorPool(%u, %u)\n", newMaxTextures, newMaxSamplers); #endif // IGL_VULKAN_PRINT_COMMANDS // macOS: MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS is required when using this with MoltenVK IGL_DEBUG_ASSERT( newMaxTextures <= vkPhysicalDeviceDescriptorIndexingProperties_ .maxDescriptorSetUpdateAfterBindSampledImages, "Max Textures exceeded: %u (hardware max %u)", newMaxTextures, vkPhysicalDeviceDescriptorIndexingProperties_.maxDescriptorSetUpdateAfterBindSampledImages); // macOS: MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS is required when using this with MoltenVK IGL_DEBUG_ASSERT( newMaxSamplers <= vkPhysicalDeviceDescriptorIndexingProperties_.maxDescriptorSetUpdateAfterBindSamplers, "Max Samplers exceeded %u (hardware max %u)", newMaxSamplers, vkPhysicalDeviceDescriptorIndexingProperties_.maxDescriptorSetUpdateAfterBindSamplers); VkDevice device = getVkDevice(); if (pimpl_->dpBindless != VK_NULL_HANDLE) { deferredTask(std::packaged_task([vf = &vf_, device, dp = pimpl_->dpBindless]() { vf->vkDestroyDescriptorPool(device, dp, nullptr); })); } // create default descriptor set layout which is going to be shared by graphics pipelines constexpr uint32_t kNumBindings = 7; constexpr VkShaderStageFlags stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_COMPUTE_BIT; const std::array bindings = { VkDescriptorSetLayoutBinding{ .binding = kBinding_Texture2D, .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, .descriptorCount = pimpl_->currentMaxBindlessTextures, .stageFlags = stageFlags, }, VkDescriptorSetLayoutBinding{ .binding = kBinding_Texture2DArray, .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, .descriptorCount = pimpl_->currentMaxBindlessTextures, .stageFlags = stageFlags, }, VkDescriptorSetLayoutBinding{ .binding = kBinding_Texture3D, .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, .descriptorCount = pimpl_->currentMaxBindlessTextures, .stageFlags = stageFlags, }, VkDescriptorSetLayoutBinding{ .binding = kBinding_TextureCube, .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, .descriptorCount = pimpl_->currentMaxBindlessTextures, .stageFlags = stageFlags, }, VkDescriptorSetLayoutBinding{ .binding = kBinding_Sampler, .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER, .descriptorCount = pimpl_->currentMaxBindlessSamplers, .stageFlags = stageFlags, }, VkDescriptorSetLayoutBinding{ .binding = kBinding_SamplerShadow, .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER, .descriptorCount = pimpl_->currentMaxBindlessSamplers, .stageFlags = stageFlags, }, VkDescriptorSetLayoutBinding{ .binding = kBinding_StorageImages, .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, .descriptorCount = pimpl_->currentMaxBindlessTextures, .stageFlags = stageFlags, }, }; const uint32_t flags = VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT | VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT | VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT; const std::array bindingFlags = { flags, flags, flags, flags, flags, flags, flags}; IGL_DEBUG_ASSERT(bindingFlags.back() == flags); pimpl_->dslBindless = std::make_unique( *this, VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT, kNumBindings, bindings.data(), bindingFlags.data(), "Descriptor Set Layout: VulkanContext::dslBindless_"); // create default descriptor pool and allocate 1 descriptor set const std::array poolSizes = { VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, pimpl_->currentMaxBindlessTextures}, VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, pimpl_->currentMaxBindlessTextures}, VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, pimpl_->currentMaxBindlessTextures}, VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, pimpl_->currentMaxBindlessTextures}, VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_SAMPLER, pimpl_->currentMaxBindlessSamplers}, VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_SAMPLER, pimpl_->currentMaxBindlessSamplers}, VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, pimpl_->currentMaxBindlessTextures}, }; VK_ASSERT(ivkCreateDescriptorPool(&vf_, device, VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT, 1, static_cast(poolSizes.size()), poolSizes.data(), &pimpl_->dpBindless)); VK_ASSERT(ivkSetDebugObjectName(&vf_, device, VK_OBJECT_TYPE_DESCRIPTOR_POOL, (uint64_t)pimpl_->dpBindless, "Descriptor Pool: dpBindless_")); VK_ASSERT(ivkAllocateDescriptorSet(&vf_, device, pimpl_->dpBindless, pimpl_->dslBindless->getVkDescriptorSetLayout(), &pimpl_->dsBindless)); VK_ASSERT(ivkSetDebugObjectName(&vf_, device, VK_OBJECT_TYPE_DESCRIPTOR_SET, (uint64_t)pimpl_->dsBindless, "Descriptor Set: dsBindless_")); } Result VulkanContext::initSwapchain(uint32_t width, uint32_t height) { IGL_PROFILER_FUNCTION(); if (!vkDevice_ || !immediate_) { IGL_LOG_ERROR("Call initContext() first"); return Result(Result::Code::Unsupported, "Call initContext() first"); } if (swapchain_) { vf_.vkDeviceWaitIdle(vkDevice_); swapchain_ = nullptr; // Destroy old swapchain first } if (!width || !height) { return Result(); } swapchain_ = std::make_unique(*this, width, height); if (features_.has_VK_KHR_timeline_semaphore && features_.has_VK_KHR_synchronization2) { timelineSemaphore_ = std::make_unique( vf_, getVkDevice(), 0, false, "Semaphore: VulkanContext::timelineSemaphore_"); } return swapchain_ ? Result() : Result(Result::Code::RuntimeError, "Failed to create Swapchain"); } VkExtent2D VulkanContext::getSwapchainExtent() const { return hasSwapchain() ? swapchain_->getExtent() : VkExtent2D{0, 0}; } Result VulkanContext::waitIdle() const { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_WAIT); for (auto queue : {deviceQueues_.graphicsQueue, deviceQueues_.computeQueue}) { VK_ASSERT_RETURN(vf_.vkQueueWaitIdle(queue)); } return getResultFromVkResult(VK_SUCCESS); } Result VulkanContext::present() const { if (!hasSwapchain()) { return Result(Result::Code::InvalidOperation, "No swapchain available"); } return swapchain_->present(immediate_->acquireLastSubmitSemaphore()); } std::unique_ptr VulkanContext::createBuffer(VkDeviceSize bufferSize, VkBufferUsageFlags usageFlags, VkMemoryPropertyFlags memFlags, Result* IGL_NULLABLE outResult, const char* IGL_NULLABLE debugName) const { IGL_PROFILER_FUNCTION(); #define ENSURE_BUFFER_SIZE(flag, maxSize) \ if (usageFlags & flag) { \ if (!IGL_DEBUG_VERIFY(bufferSize <= maxSize)) { \ IGL_LOG_INFO("Max size of buffer exceeded " #flag ": %llu > %llu", bufferSize, maxSize); \ Result::setResult(outResult, \ Result(Result::Code::InvalidOperation, "Buffer size exceeded" #flag)); \ return nullptr; \ } \ } const VkPhysicalDeviceLimits& limits = getVkPhysicalDeviceProperties().limits; ENSURE_BUFFER_SIZE(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, limits.maxUniformBufferRange); // any buffer ENSURE_BUFFER_SIZE(VK_BUFFER_USAGE_FLAG_BITS_MAX_ENUM, limits.maxStorageBufferRange); #undef ENSURE_BUFFER_SIZE Result::setOk(outResult); return std::make_unique( *this, vkDevice_, bufferSize, usageFlags, memFlags, debugName); } VulkanImage VulkanContext::createImage(VkImageType imageType, VkExtent3D extent, VkFormat format, uint32_t mipLevels, uint32_t arrayLayers, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkMemoryPropertyFlags memFlags, VkImageCreateFlags flags, VkSampleCountFlagBits samples, Result* IGL_NULLABLE outResult, const char* IGL_NULLABLE debugName) const { IGL_PROFILER_FUNCTION(); if (!validateImageLimits( imageType, samples, extent, getVkPhysicalDeviceProperties().limits, outResult)) { return VulkanImage(); } return {*this, extent, imageType, format, mipLevels, arrayLayers, tiling, usageFlags, memFlags, flags, samples, debugName}; } #if defined(IGL_ANDROID_HWBUFFER_SUPPORTED) std::unique_ptr VulkanContext::createImageFromAndroidHardwareBuffer( AHardwareBuffer* androidHardwareBuffer, uint64_t memoryAllocationSize, VkImageType imageType, VkExtent3D extent, VkFormat format, uint32_t mipLevels, uint32_t arrayLayers, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageCreateFlags flags, VkSampleCountFlagBits samples, igl::Result* IGL_NULLABLE outResult, const char* IGL_NULLABLE debugName) const { if (!validateImageLimits( imageType, samples, extent, getVkPhysicalDeviceProperties().limits, outResult)) { return nullptr; } return std::make_unique(*this, androidHardwareBuffer, memoryAllocationSize, extent, imageType, format, mipLevels, arrayLayers, tiling, usageFlags, flags, samples, debugName); } #endif // defined(IGL_ANDROID_HWBUFFER_SUPPORTED) std::unique_ptr VulkanContext::createImageFromFileDescriptor( int32_t fileDescriptor, uint64_t memoryAllocationSize, VkImageType imageType, VkExtent3D extent, VkFormat format, uint32_t mipLevels, uint32_t arrayLayers, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageCreateFlags flags, VkSampleCountFlagBits samples, Result* IGL_NULLABLE outResult, const char* IGL_NULLABLE debugName) const { if (!validateImageLimits( imageType, samples, extent, getVkPhysicalDeviceProperties().limits, outResult)) { return nullptr; } return std::make_unique(*this, fileDescriptor, memoryAllocationSize, extent, imageType, format, mipLevels, arrayLayers, tiling, usageFlags, flags, samples, debugName); } void VulkanContext::pruneTextures() { // here we remove deleted textures - everything which has only 1 reference is owned by this // context and can be released safely // textures { for (uint32_t i = 1; i < (uint32_t)textures_.objects_.size(); i++) { if (textures_.objects_[i].obj_ && textures_.objects_[i].obj_.use_count() == 1) { textures_.destroy(i); } } } } VkResult VulkanContext::checkAndUpdateDescriptorSets() { if (!awaitingCreation_) { // nothing to update here return VK_SUCCESS; } // newly created resources can be used immediately - make sure they are put into descriptor sets IGL_PROFILER_FUNCTION(); pruneTextures(); // update Vulkan bindless descriptor sets here if (!config_.enableDescriptorIndexing) { return VK_SUCCESS; } uint32_t newMaxTextures = pimpl_->currentMaxBindlessTextures; uint32_t newMaxSamplers = pimpl_->currentMaxBindlessSamplers; while (textures_.objects_.size() > newMaxTextures) { newMaxTextures *= 2; } while (samplers_.objects_.size() > newMaxSamplers) { newMaxSamplers *= 2; } if (newMaxTextures != pimpl_->currentMaxBindlessTextures || newMaxSamplers != pimpl_->currentMaxBindlessSamplers) { growBindlessDescriptorPool(newMaxTextures, newMaxSamplers); } // make sure the guard values are always there IGL_DEBUG_ASSERT(!textures_.objects_.empty()); IGL_DEBUG_ASSERT(!samplers_.objects_.empty()); // 1. Sampled and storage images std::vector infoSampledImages; std::vector infoStorageImages; infoSampledImages.reserve(textures_.objects_.size()); infoStorageImages.reserve(textures_.objects_.size()); // use the dummy texture/sampler to avoid sparse array VkImageView dummyImageView = textures_.objects_[0].obj_->imageView_.getVkImageView(); VkSampler dummySampler = samplers_.objects_[0].obj_.vkSampler; for (const auto& entry : textures_.objects_) { const VulkanTexture* texture = entry.obj_.get(); if (texture) { // multisampled images cannot be directly accessed from shaders const bool isTextureAvailable = (texture->image_.samples_ & VK_SAMPLE_COUNT_1_BIT) == VK_SAMPLE_COUNT_1_BIT; const bool isSampledImage = isTextureAvailable && texture->image_.isSampledImage(); const bool isStorageImage = isTextureAvailable && texture->image_.isStorageImage(); infoSampledImages.push_back( {dummySampler, isSampledImage ? texture->imageView_.getVkImageView() : dummyImageView, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL}); infoStorageImages.push_back(VkDescriptorImageInfo{ VK_NULL_HANDLE, isStorageImage ? texture->imageView_.getVkImageView() : dummyImageView, VK_IMAGE_LAYOUT_GENERAL}); } else { infoSampledImages.push_back( {dummySampler, dummyImageView, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL}); infoStorageImages.push_back( VkDescriptorImageInfo{VK_NULL_HANDLE, dummyImageView, VK_IMAGE_LAYOUT_GENERAL}); } IGL_DEBUG_ASSERT(infoSampledImages.back().imageView != VK_NULL_HANDLE); IGL_DEBUG_ASSERT(infoStorageImages.back().imageView != VK_NULL_HANDLE); } // 2. Samplers std::vector infoSamplers; infoSamplers.reserve(samplers_.objects_.size()); for (const auto& entry : samplers_.objects_) { const VulkanSampler* sampler = &entry.obj_; infoSamplers.push_back( {sampler ? sampler->vkSampler : dummySampler, VK_NULL_HANDLE, VK_IMAGE_LAYOUT_UNDEFINED}); } std::vector write; if (!infoSampledImages.empty()) { // use the same indexing for every texture type for (uint32_t i = kBinding_Texture2D; i != kBinding_TextureCube + 1; i++) { write.push_back(ivkGetWriteDescriptorSetImageInfo(pimpl_->dsBindless, i, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, (uint32_t)infoSampledImages.size(), infoSampledImages.data())); } }; if (!infoSamplers.empty()) { for (uint32_t i = kBinding_Sampler; i != kBinding_SamplerShadow + 1; i++) { write.push_back(ivkGetWriteDescriptorSetImageInfo(pimpl_->dsBindless, i, VK_DESCRIPTOR_TYPE_SAMPLER, (uint32_t)infoSamplers.size(), infoSamplers.data())); } } if (!infoStorageImages.empty()) { write.push_back(ivkGetWriteDescriptorSetImageInfo(pimpl_->dsBindless, kBinding_StorageImages, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, (uint32_t)infoStorageImages.size(), infoStorageImages.data())); }; // do not switch to the next descriptor set if there is nothing to update if (!write.empty()) { #if IGL_VULKAN_PRINT_COMMANDS IGL_LOG_INFO("Updating descriptor set dsBindless_\n"); #endif // IGL_VULKAN_PRINT_COMMANDS VK_ASSERT(immediate_->wait(immediate_->getLastSubmitHandle())); vf_.vkUpdateDescriptorSets( vkDevice_, static_cast(write.size()), write.data(), 0, nullptr); } awaitingCreation_ = false; return VK_SUCCESS; } std::shared_ptr VulkanContext::createTexture( VulkanImage&& image, VulkanImageView&& imageView, [[maybe_unused]] const char* IGL_NULLABLE debugName) const { IGL_PROFILER_FUNCTION(); const TextureHandle handle = textures_.create(std::make_shared(std::move(image), std::move(imageView))); auto texture = *textures_.get(handle); if (!IGL_DEBUG_VERIFY(texture)) { return nullptr; } texture->textureId_ = handle.index(); awaitingCreation_ = true; return texture; } std::shared_ptr VulkanContext::createTextureFromVkImage( VkImage vkImage, VulkanImageCreateInfo imageCreateInfo, VulkanImageViewCreateInfo imageViewCreateInfo, const char* IGL_NULLABLE debugName) const { auto iglImage = VulkanImage(*this, vkImage, imageCreateInfo, debugName); auto imageView = iglImage.createImageView(imageViewCreateInfo, debugName); return createTexture(std::move(iglImage), std::move(imageView), debugName); } SamplerHandle VulkanContext::createSampler(const VkSamplerCreateInfo& ci, VkFormat yuvVkFormat, Result* IGL_NULLABLE outResult, const char* IGL_NULLABLE debugName) const { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); VkSamplerCreateInfo cInfo = ci; VkSamplerYcbcrConversionInfo conversionInfo{}; if (yuvVkFormat != VK_FORMAT_UNDEFINED) { conversionInfo = getOrCreateYcbcrConversionInfo(yuvVkFormat); cInfo.pNext = &conversionInfo; // must be CLAMP_TO_EDGE // https://vulkan.lunarg.com/doc/view/1.3.268.0/windows/1.3-extensions/vkspec.html#VUID-VkSamplerCreateInfo-addressModeU-01646 cInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; cInfo.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; cInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; cInfo.anisotropyEnable = VK_FALSE; cInfo.unnormalizedCoordinates = VK_FALSE; } VkDevice device = getVkDevice(); VulkanSampler sampler; VK_ASSERT(vf_.vkCreateSampler(device, &cInfo, nullptr, &sampler.vkSampler)); VK_ASSERT(ivkSetDebugObjectName( &vf_, device, VK_OBJECT_TYPE_SAMPLER, (uint64_t)sampler.vkSampler, debugName)); const SamplerHandle handle = samplers_.create(static_cast(sampler)); samplers_.get(handle)->samplerId = handle.index(); awaitingCreation_ = true; return handle; } void VulkanContext::querySurfaceCapabilities() { // This is not an exhaustive list. It's only formats that we are using. // NOLINTNEXTLINE(modernize-avoid-c-arrays) const VkFormat depthFormats[] = {VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D16_UNORM_S8_UINT, VK_FORMAT_D32_SFLOAT, VK_FORMAT_D16_UNORM, VK_FORMAT_S8_UINT}; deviceDepthFormats_.reserve(IGL_ARRAY_NUM_ELEMENTS(depthFormats)); for (const auto& depthFormat : depthFormats) { VkFormatProperties formatProps; vf_.vkGetPhysicalDeviceFormatProperties(vkPhysicalDevice_, depthFormat, &formatProps); if (formatProps.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT || formatProps.bufferFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT || formatProps.linearTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) { deviceDepthFormats_.push_back(depthFormat); } } if (vkSurface_ != VK_NULL_HANDLE) { vf_.vkGetPhysicalDeviceSurfaceCapabilitiesKHR( vkPhysicalDevice_, vkSurface_, &deviceSurfaceCaps_); uint32_t formatCount = 0; vf_.vkGetPhysicalDeviceSurfaceFormatsKHR(vkPhysicalDevice_, vkSurface_, &formatCount, nullptr); if (formatCount) { deviceSurfaceFormats_.resize(formatCount); vf_.vkGetPhysicalDeviceSurfaceFormatsKHR( vkPhysicalDevice_, vkSurface_, &formatCount, deviceSurfaceFormats_.data()); } uint32_t presentModeCount = 0; vf_.vkGetPhysicalDeviceSurfacePresentModesKHR( vkPhysicalDevice_, vkSurface_, &presentModeCount, nullptr); if (presentModeCount) { devicePresentModes_.resize(presentModeCount); vf_.vkGetPhysicalDeviceSurfacePresentModesKHR( vkPhysicalDevice_, vkSurface_, &presentModeCount, devicePresentModes_.data()); } } } VkFormat VulkanContext::getClosestDepthStencilFormat(TextureFormat desiredFormat) const { IGL_DEBUG_ASSERT(!deviceDepthFormats_.empty()); // get a list of compatible depth formats for a given desired format // The list will contain depth format that are ordered from most to least closest const std::vector compatibleDepthStencilFormatList = getCompatibleDepthStencilFormats(desiredFormat); // check if any of the format in compatible list is supported for (auto depthStencilFormat : compatibleDepthStencilFormatList) { if (std::find(deviceDepthFormats_.begin(), deviceDepthFormats_.end(), depthStencilFormat) != deviceDepthFormats_.end()) { return depthStencilFormat; } } // no matching found, choose the first supported format return !deviceDepthFormats_.empty() ? deviceDepthFormats_[0] : VK_FORMAT_D24_UNORM_S8_UINT; } VulkanContext::RenderPassHandle VulkanContext::getRenderPass(uint8_t index) const { return RenderPassHandle{.pass = renderPasses_[index], .index = index}; } VulkanContext::RenderPassHandle VulkanContext::findRenderPass( const VulkanRenderPassBuilder& builder) const { IGL_PROFILER_FUNCTION(); auto it = renderPassesHash_.find(builder); if (it != renderPassesHash_.end()) { return RenderPassHandle{.pass = renderPasses_[it->second], .index = it->second}; } VkRenderPass pass = VK_NULL_HANDLE; builder.build(vf_, vkDevice_, &pass); const size_t index = renderPasses_.size(); IGL_DEBUG_ASSERT(index <= 255); renderPassesHash_[builder] = uint8_t(index); // @fb-only // @lint-ignore CLANGTIDY renderPasses_.push_back(pass); return RenderPassHandle{.pass = pass, .index = uint8_t(index)}; } std::vector VulkanContext::getPipelineCacheData() const { size_t size = 0; vf_.vkGetPipelineCacheData(vkDevice_, pipelineCache_, &size, nullptr); std::vector data(size); if (size) { vf_.vkGetPipelineCacheData(vkDevice_, pipelineCache_, &size, data.data()); } return data; } uint64_t VulkanContext::getFrameNumber() const { return swapchain_ ? swapchain_->getFrameNumber() : 0u; } void VulkanContext::updateBindingsTextures(VkCommandBuffer IGL_NONNULL cmdBuf, VkPipelineLayout layout, VkPipelineBindPoint bindPoint, VulkanImmediateCommands::SubmitHandle nextSubmitHandle, const BindingsTextures& data, const VulkanDescriptorSetLayout& dsl, const util::SpvModuleInfo& info) const { IGL_PROFILER_FUNCTION(); DescriptorPoolsArena& arena = pimpl_->getOrCreateArena_CombinedImageSamplers( *this, dsl.getVkDescriptorSetLayout(), dsl.numBindings); VkDescriptorSet dset = arena.getNextDescriptorSet(*immediate_, nextSubmitHandle); // NOLINTNEXTLINE(modernize-avoid-c-arrays) VkDescriptorImageInfo infoSampledImages[IGL_TEXTURE_SAMPLERS_MAX]; // uninitialized uint32_t numImages = 0; // NOLINTNEXTLINE(modernize-avoid-c-arrays) VkWriteDescriptorSet writes[IGL_TEXTURE_SAMPLERS_MAX]; // uninitialized uint32_t numWrites = 0; // make sure the guard value is always there IGL_DEBUG_ASSERT(!textures_.objects_.empty()); IGL_DEBUG_ASSERT(!samplers_.objects_.empty()); // use the dummy texture/sampler to avoid sparse array VkImageView dummyImageView = textures_.objects_[0].obj_->imageView_.getVkImageView(); VkSampler dummySampler = samplers_.objects_[0].obj_.vkSampler; const bool isGraphics = bindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS; for (const util::TextureDescription& d : info.textures) { IGL_DEBUG_ASSERT(d.descriptorSet == kBindPoint_CombinedImageSamplers); const uint32_t loc = d.bindingLocation; IGL_DEBUG_ASSERT(loc < IGL_TEXTURE_SAMPLERS_MAX); VkImageView texture = data.textures[loc]; const bool hasTexture = texture != VK_NULL_HANDLE; if (hasTexture && isGraphics) { IGL_DEBUG_ASSERT(data.samplers[loc], "A sampler should be bound to every bound texture slot"); } VkSampler sampler = data.samplers[loc] ? data.samplers[loc] : dummySampler; writes[numWrites++] = ivkGetWriteDescriptorSetImageInfo( dset, loc, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, &infoSampledImages[numImages]); infoSampledImages[numImages++] = VkDescriptorImageInfo{ .sampler = hasTexture ? sampler : dummySampler, .imageView = hasTexture ? texture : dummyImageView, .imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, }; } if (numWrites) { IGL_PROFILER_ZONE("vkUpdateDescriptorSets()", IGL_PROFILER_COLOR_UPDATE); vf_.vkUpdateDescriptorSets(vkDevice_, numWrites, writes, 0, nullptr); IGL_PROFILER_ZONE_END(); #if IGL_VULKAN_PRINT_COMMANDS IGL_LOG_INFO("%p vkCmdBindDescriptorSets(%u) - textures\n", cmdBuf, bindPoint); #endif // IGL_VULKAN_PRINT_COMMANDS vf_.vkCmdBindDescriptorSets( cmdBuf, bindPoint, layout, kBindPoint_CombinedImageSamplers, 1, &dset, 0, nullptr); } } void VulkanContext::updateBindingsStorageImages( VkCommandBuffer IGL_NONNULL cmdBuf, VkPipelineLayout layout, VkPipelineBindPoint bindPoint, VulkanImmediateCommands::SubmitHandle nextSubmitHandle, const BindingsStorageImages& data, const VulkanDescriptorSetLayout& dsl, const util::SpvModuleInfo& info) const { IGL_PROFILER_FUNCTION(); DescriptorPoolsArena& arena = pimpl_->getOrCreateArena_StorageImages( *this, dsl.getVkDescriptorSetLayout(), dsl.numBindings); VkDescriptorSet dset = arena.getNextDescriptorSet(*immediate_, nextSubmitHandle); // NOLINTNEXTLINE(modernize-avoid-c-arrays) VkDescriptorImageInfo infoStorageImages[IGL_TEXTURE_SAMPLERS_MAX]; // uninitialized uint32_t numStorageImages = 0; // NOLINTNEXTLINE(modernize-avoid-c-arrays) VkWriteDescriptorSet writes[IGL_TEXTURE_SAMPLERS_MAX]; // uninitialized uint32_t numWrites = 0; // make sure the guard value is always there IGL_DEBUG_ASSERT(!textures_.objects_.empty()); // use the dummy texture to avoid sparse array VkImageView dummyImageView = textures_.objects_[0].obj_->imageView_.getVkImageView(); for (const util::ImageDescription& d : info.images) { IGL_DEBUG_ASSERT(d.descriptorSet == kBindPoint_StorageImages); const uint32_t loc = d.bindingLocation; IGL_DEBUG_ASSERT(loc < IGL_TEXTURE_SAMPLERS_MAX); VkImageView imageView = data.images[loc]; writes[numWrites++] = ivkGetWriteDescriptorSetImageInfo( dset, loc, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, &infoStorageImages[numStorageImages]); infoStorageImages[numStorageImages++] = VkDescriptorImageInfo{ .sampler = VK_NULL_HANDLE, .imageView = imageView ? imageView : dummyImageView, .imageLayout = VK_IMAGE_LAYOUT_GENERAL, }; } if (numWrites) { IGL_PROFILER_ZONE("vkUpdateDescriptorSets()", IGL_PROFILER_COLOR_UPDATE); vf_.vkUpdateDescriptorSets(vkDevice_, numWrites, writes, 0, nullptr); IGL_PROFILER_ZONE_END(); #if IGL_VULKAN_PRINT_COMMANDS IGL_LOG_INFO("%p vkCmdBindDescriptorSets(%u) - storage images\n", cmdBuf, bindPoint); #endif // IGL_VULKAN_PRINT_COMMANDS vf_.vkCmdBindDescriptorSets( cmdBuf, bindPoint, layout, kBindPoint_StorageImages, 1, &dset, 0, nullptr); } } void VulkanContext::updateBindingsBuffers(VkCommandBuffer IGL_NONNULL cmdBuf, VkPipelineLayout layout, VkPipelineBindPoint bindPoint, VulkanImmediateCommands::SubmitHandle nextSubmitHandle, BindingsBuffers& data, const VulkanDescriptorSetLayout& dsl, const util::SpvModuleInfo& info) const { IGL_PROFILER_FUNCTION(); DescriptorPoolsArena& arena = pimpl_->getOrCreateArena_Buffers(*this, dsl.getVkDescriptorSetLayout(), dsl.numBindings); VkDescriptorSet dset = arena.getNextDescriptorSet(*immediate_, nextSubmitHandle); // NOLINTNEXTLINE(modernize-avoid-c-arrays) VkWriteDescriptorSet writes[IGL_UNIFORM_BLOCKS_BINDING_MAX]; // uninitialized uint32_t numWrites = 0; for (const util::BufferDescription& b : info.buffers) { IGL_DEBUG_ASSERT(b.descriptorSet == kBindPoint_Buffers); IGL_DEBUG_ASSERT( data.buffers[b.bindingLocation].buffer != VK_NULL_HANDLE, IGL_FORMAT("Did you forget to call bindBuffer() for a buffer at the binding location {}?", b.bindingLocation) .c_str()); writes[numWrites++] = ivkGetWriteDescriptorSetBufferInfo( dset, b.bindingLocation, b.isStorage ? VK_DESCRIPTOR_TYPE_STORAGE_BUFFER : VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &data.buffers[b.bindingLocation]); } if (numWrites) { IGL_PROFILER_ZONE("vkUpdateDescriptorSets()", IGL_PROFILER_COLOR_UPDATE); vf_.vkUpdateDescriptorSets(vkDevice_, numWrites, writes, 0, nullptr); IGL_PROFILER_ZONE_END(); #if IGL_VULKAN_PRINT_COMMANDS IGL_LOG_INFO("%p vkCmdBindDescriptorSets(%u) - buffers\n", cmdBuf, bindPoint); #endif // IGL_VULKAN_PRINT_COMMANDS vf_.vkCmdBindDescriptorSets( cmdBuf, bindPoint, layout, kBindPoint_Buffers, 1, &dset, 0, nullptr); } } void VulkanContext::deferredTask(std::packaged_task&& task, SubmitHandle handle) const { if (handle.empty()) { handle = immediate_->getNextSubmitHandle(); } deferredTasks.emplace_back(std::move(task), handle); deferredTasks.back().frameId = this->getFrameNumber(); } bool VulkanContext::areValidationLayersEnabled() const { return config_.enableValidation; } void* IGL_NULLABLE VulkanContext::getVmaAllocator() const { return pimpl_->vma; } void VulkanContext::processDeferredTasks() const { IGL_PROFILER_FUNCTION(); const uint64_t frameId = getFrameNumber(); constexpr uint64_t kNumWaitFrames = 3u; while (!deferredTasks.empty() && immediate_->isReady(deferredTasks.front().handle)) { if (frameId && frameId <= deferredTasks.front().frameId + kNumWaitFrames) { // do not check anything if it is not yet older than kNumWaitFrames break; } deferredTasks.front().task(); deferredTasks.pop_front(); } } void VulkanContext::waitDeferredTasks() { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_WAIT); for (auto& task : deferredTasks) { immediate_->wait(task.handle, config_.fenceTimeoutNanoseconds); task.task(); } deferredTasks.clear(); } // @fb-only VkFence VulkanContext::getVkFenceFromSubmitHandle(igl::SubmitHandle handle) const noexcept { if (handle == 0) { IGL_LOG_ERROR("Invalid submit handle passed to getVkFenceFromSubmitHandle"); return VK_NULL_HANDLE; } VkFence vkFence = immediate_->getVkFenceFromSubmitHandle(VulkanImmediateCommands::SubmitHandle(handle)); return vkFence; } // @fb-only int VulkanContext::getFenceFdFromSubmitHandle(igl::SubmitHandle handle) const noexcept { int fenceFd = -1; #if defined(IGL_PLATFORM_ANDROID) && defined(VK_KHR_external_fence_fd) if (handle == 0) { IGL_LOG_ERROR("Invalid submit handle passed to getFenceFDFromSubmitHandle"); return -1; } const VkFence vkFence = getVkFenceFromSubmitHandle(handle); IGL_DEBUG_ASSERT(vkFence != VK_NULL_HANDLE); const VkFenceGetFdInfoKHR getFdInfo = { .sType = VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR, .fence = vkFence, .handleType = VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT, }; const VkResult result = vf_.vkGetFenceFdKHR(vkDevice_, &getFdInfo, &fenceFd); if (result != VK_SUCCESS) { IGL_LOG_ERROR("Unable to get fence fd from submit handle: %lu", handle); } immediate_->storeFDInSubmitHandle(VulkanImmediateCommands::SubmitHandle(handle), fenceFd); #endif // defined(IGL_PLATFORM_ANDROID) return fenceFd; } VkDescriptorSetLayout VulkanContext::getBindlessVkDescriptorSetLayout() const { return config_.enableDescriptorIndexing ? pimpl_->dslBindless->getVkDescriptorSetLayout() : VK_NULL_HANDLE; } VkDescriptorSet VulkanContext::getBindlessVkDescriptorSet() const { return config_.enableDescriptorIndexing ? pimpl_->dsBindless : VK_NULL_HANDLE; } VkSamplerYcbcrConversionInfo VulkanContext::getOrCreateYcbcrConversionInfo(VkFormat format) const { auto it = ycbcrConversionInfos_.find(format); if (it != ycbcrConversionInfos_.end()) { return it->second; } if (!IGL_DEBUG_VERIFY(features_.featuresSamplerYcbcrConversion.samplerYcbcrConversion)) { IGL_DEBUG_ABORT("Ycbcr samplers are not supported"); return {}; } VkFormatProperties props; vf_.vkGetPhysicalDeviceFormatProperties(getVkPhysicalDevice(), format, &props); const bool cosited = (props.optimalTilingFeatures & VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT) != 0; const bool midpoint = (props.optimalTilingFeatures & VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT) != 0; if (!IGL_DEBUG_VERIFY(cosited || midpoint)) { IGL_DEBUG_ASSERT(cosited || midpoint, "Unsupported Ycbcr feature"); return {}; } const VkSamplerYcbcrConversionCreateInfo ciYcbcr = { .sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO, .format = format, .ycbcrModel = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709, .ycbcrRange = VK_SAMPLER_YCBCR_RANGE_ITU_FULL, .components = { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, }, .xChromaOffset = midpoint ? VK_CHROMA_LOCATION_MIDPOINT : VK_CHROMA_LOCATION_COSITED_EVEN, .yChromaOffset = midpoint ? VK_CHROMA_LOCATION_MIDPOINT : VK_CHROMA_LOCATION_COSITED_EVEN, .chromaFilter = VK_FILTER_LINEAR, .forceExplicitReconstruction = VK_FALSE, }; VkSamplerYcbcrConversionInfo info = { .sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO, .conversion = VK_NULL_HANDLE, }; vf_.vkCreateSamplerYcbcrConversion(getVkDevice(), &ciYcbcr, nullptr, &info.conversion); // check properties VkSamplerYcbcrConversionImageFormatProperties samplerYcbcrConversionImageFormatProps = { .sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES, .combinedImageSamplerDescriptorCount = 0, }; VkImageFormatProperties2 imageFormatProps = { .sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2, .pNext = &samplerYcbcrConversionImageFormatProps, .imageFormatProperties = {}, }; const VkPhysicalDeviceImageFormatInfo2 imageFormatInfo = { .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2, .format = format, .type = VK_IMAGE_TYPE_2D, .tiling = VK_IMAGE_TILING_OPTIMAL, .usage = VK_IMAGE_USAGE_SAMPLED_BIT, .flags = VK_IMAGE_CREATE_DISJOINT_BIT, }; vf_.vkGetPhysicalDeviceImageFormatProperties2( getVkPhysicalDevice(), &imageFormatInfo, &imageFormatProps); IGL_DEBUG_ASSERT(samplerYcbcrConversionImageFormatProps.combinedImageSamplerDescriptorCount <= 3); ycbcrConversionInfos_[format] = info; return info; } void VulkanContext::freeResourcesForDescriptorSetLayout(VkDescriptorSetLayout dsl) const { pimpl_->arenaBuffers.erase(dsl); pimpl_->arenaCombinedImageSamplers.erase(dsl); pimpl_->arenaStorageImages.erase(dsl); } BindGroupTextureHandle VulkanContext::createBindGroup(const BindGroupTextureDesc& desc, const IRenderPipelineState* IGL_NULLABLE compatiblePipeline, Result* IGL_NULLABLE outResult) { VkDevice device = getVkDevice(); BindGroupMetadataTextures metadata{.desc = desc}; // NOLINTNEXTLINE(modernize-avoid-c-arrays) VkDescriptorSetLayoutBinding bindings[IGL_TEXTURE_SAMPLERS_MAX]; // uninitialized uint32_t numBindings = 0; const VkShaderStageFlags stageFlags = VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT; const uint32_t usageMaskPipeline = compatiblePipeline ? static_cast(*compatiblePipeline) .getSpvModuleInfo() .usageMaskTextures : 0ul; for (uint32_t loc = 0; loc != IGL_ARRAY_NUM_ELEMENTS(desc.textures); loc++) { const bool isInPipeline = (usageMaskPipeline & (1ul << loc)) != 0; if (compatiblePipeline ? isInPipeline : desc.samplers[loc] != nullptr) { IGL_DEBUG_ASSERT(compatiblePipeline || desc.samplers[loc]); bindings[numBindings++] = VkDescriptorSetLayoutBinding{ .binding = loc, .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, .descriptorCount = 1, .stageFlags = stageFlags, }; metadata.usageMask |= 1ul << loc; } } VkDescriptorSetLayout dsl = VK_NULL_HANDLE; { // NOLINTNEXTLINE(modernize-avoid-c-arrays) const VkDescriptorBindingFlags bindingFlags[IGL_TEXTURE_SAMPLERS_MAX] = {}; VK_ASSERT(ivkCreateDescriptorSetLayout(&vf_, device, VkDescriptorSetLayoutCreateFlags{}, numBindings, bindings, bindingFlags, &dsl)); VK_ASSERT(ivkSetDebugObjectName( &vf_, device, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, (uint64_t)dsl, IGL_FORMAT("Descriptor Set Layout (COMBINED_IMAGE_SAMPLER): BindGroup = {}", desc.debugName) .c_str())); const VkDescriptorPoolSize poolSize = VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, numBindings}; VK_ASSERT(ivkCreateDescriptorPool( &vf_, device, VkDescriptorPoolCreateFlags{}, 1u, 1u, &poolSize, &metadata.pool)); VK_ASSERT(ivkSetDebugObjectName( &vf_, device, VK_OBJECT_TYPE_DESCRIPTOR_POOL, (uint64_t)metadata.pool, IGL_FORMAT("Descriptor Pool (COMBINED_IMAGE_SAMPLER): BindGroup = {}", desc.debugName) .c_str())); VK_ASSERT(ivkAllocateDescriptorSet(&vf_, device, metadata.pool, dsl, &metadata.dset)); } // make sure the guard values are always there IGL_DEBUG_ASSERT(!textures_.objects_.empty()); IGL_DEBUG_ASSERT(!samplers_.objects_.empty()); // use the dummy texture to ensure pipeline compatibility VkImageView dummyImageView = textures_.objects_[0].obj_->imageView_.getVkImageView(); // NOLINTNEXTLINE(modernize-avoid-c-arrays) VkDescriptorImageInfo images[IGL_TEXTURE_SAMPLERS_MAX]; // uninitialized // NOLINTNEXTLINE(modernize-avoid-c-arrays) VkWriteDescriptorSet writes[IGL_TEXTURE_SAMPLERS_MAX]; // uninitialized uint32_t numWrites = 0; for (uint32_t loc = 0; loc != IGL_ARRAY_NUM_ELEMENTS(desc.textures); loc++) { if (compatiblePipeline ? (usageMaskPipeline & (1ul << loc)) == 0 : desc.textures[loc] == nullptr) { continue; } const igl::vulkan::VulkanTexture& texture = desc.textures[loc] ? static_cast(desc.textures[loc].get())->getVulkanTexture() : *textures_.objects_[0].obj_; // use a dummy texture when necessary const igl::vulkan::VulkanSampler& sampler = desc.samplers[loc] ? *samplers_.get(static_cast(*desc.samplers[loc]).sampler_) : samplers_.objects_[0].obj_; // use a dummy sampler when necessary // multisampled images cannot be directly accessed from shaders const bool isTextureAvailable = (texture.image_.samples_ & VK_SAMPLE_COUNT_1_BIT) == VK_SAMPLE_COUNT_1_BIT; const bool isSampledImage = isTextureAvailable && texture.image_.isSampledImage(); if (!IGL_DEBUG_VERIFY(isSampledImage)) { IGL_LOG_ERROR("Each bound texture should have TextureUsageBits::Sampled (slot = %u)", loc); continue; } writes[numWrites] = ivkGetWriteDescriptorSetImageInfo( metadata.dset, loc, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, &images[numWrites]); images[numWrites++] = { .sampler = sampler.vkSampler, .imageView = isSampledImage ? texture.imageView_.getVkImageView() : dummyImageView, .imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, }; } if (!IGL_DEBUG_VERIFY(numWrites)) { IGL_LOG_ERROR("Cannot create an empty bind group"); Result::setResult(outResult, Result(Result::Code::RuntimeError, "Cannot create an empty bind group")); return {}; } IGL_PROFILER_ZONE("vkUpdateDescriptorSets() - textures bind group", IGL_PROFILER_COLOR_UPDATE); vf_.vkUpdateDescriptorSets(vkDevice_, numWrites, writes, 0, nullptr); IGL_PROFILER_ZONE_END(); // once a descriptor set has been updated, destroy the DSL vf_.vkDestroyDescriptorSetLayout(device, dsl, nullptr); Result::setOk(outResult); return pimpl_->bindGroupTexturesPool.create(std::move(metadata)); } BindGroupBufferHandle VulkanContext::createBindGroup(const BindGroupBufferDesc& desc, Result* outResult) { VkDevice device = getVkDevice(); BindGroupMetadataBuffers metadata{.desc = desc}; // NOLINTNEXTLINE(modernize-avoid-c-arrays) VkDescriptorSetLayoutBinding bindings[IGL_UNIFORM_BLOCKS_BINDING_MAX]; // uninitialized uint32_t numBindings = 0; // NOLINTNEXTLINE(modernize-avoid-c-arrays) VkDescriptorPoolSize poolSizes[] = { {.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, .descriptorCount = 0}, {.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, .descriptorCount = 0}, {.type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, .descriptorCount = 0}, {.type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, .descriptorCount = 0}, }; const VkShaderStageFlags stageFlags = VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT; for (uint32_t loc = 0; loc != IGL_ARRAY_NUM_ELEMENTS(desc.buffers); loc++) { if (!desc.buffers[loc]) { continue; } auto* buf = static_cast(desc.buffers[loc].get()); const bool isDynamic = (desc.isDynamicBufferMask & (1ul << loc)) != 0; const bool isUniform = ((buf->getBufferType() & BufferDesc::BufferTypeBits::Uniform) != 0); const VkDescriptorType type = isUniform ? (isDynamic ? (poolSizes[0].descriptorCount++, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) : (poolSizes[1].descriptorCount++, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER)) : (isDynamic ? (poolSizes[2].descriptorCount++, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC) : (poolSizes[3].descriptorCount++, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)); if (isDynamic && !desc.size[loc]) { IGL_LOG_ERROR( "A buffer at the binding location '%u' is marked as dynamic but the corresponding size " "value is 0. You have to specify the binding size for all dynamic buffers.", loc); } if (desc.offset[loc]) { const auto& limits = getVkPhysicalDeviceProperties().limits; const uint32_t alignment = static_cast(isUniform ? limits.minUniformBufferOffsetAlignment : limits.minStorageBufferOffsetAlignment); if (!IGL_DEBUG_VERIFY((alignment == 0) || (desc.offset[loc] % alignment == 0))) { IGL_LOG_ERROR( "`desc.offset[loc] = %u` must be a multiple of `VkPhysicalDeviceLimits::%s = %u`", static_cast(desc.offset[loc]), isUniform ? "minUniformBufferOffsetAlignment" : "minStorageBufferOffsetAlignment", alignment); } } bindings[numBindings++] = VkDescriptorSetLayoutBinding{ .binding = loc, .descriptorType = type, .descriptorCount = 1, .stageFlags = stageFlags, }; metadata.usageMask |= 1ul << loc; } // construct a dense array of non-zero VkDescriptorPoolSize elements qsort(poolSizes, IGL_ARRAY_NUM_ELEMENTS(poolSizes), sizeof(VkDescriptorPoolSize), [](const void* a, const void* b) { return ((VkDescriptorPoolSize*)a)->descriptorCount < ((VkDescriptorPoolSize*)b)->descriptorCount ? 1 : 0; }); uint32_t numPoolSizes = 0; while (numPoolSizes < IGL_ARRAY_NUM_ELEMENTS(poolSizes) && poolSizes[numPoolSizes].descriptorCount > 0) { numPoolSizes++; } IGL_DEBUG_ASSERT(numPoolSizes); VkDescriptorSetLayout dsl = VK_NULL_HANDLE; { // NOLINTNEXTLINE(modernize-avoid-c-arrays) const VkDescriptorBindingFlags bindingFlags[IGL_UNIFORM_BLOCKS_BINDING_MAX] = {}; VK_ASSERT(ivkCreateDescriptorSetLayout(&vf_, device, VkDescriptorSetLayoutCreateFlags{}, numBindings, bindings, bindingFlags, &dsl)); VK_ASSERT(ivkSetDebugObjectName( &vf_, device, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, (uint64_t)dsl, IGL_FORMAT("Descriptor Set Layout (BUFFERS): BindGroup = {}", desc.debugName).c_str())); VK_ASSERT(ivkCreateDescriptorPool( &vf_, device, VkDescriptorPoolCreateFlags{}, 1u, numPoolSizes, poolSizes, &metadata.pool)); VK_ASSERT(ivkSetDebugObjectName( &vf_, device, VK_OBJECT_TYPE_DESCRIPTOR_POOL, (uint64_t)metadata.pool, IGL_FORMAT("Descriptor Pool (BUFFERS): BindGroup = {}", desc.debugName).c_str())); VK_ASSERT(ivkAllocateDescriptorSet(&vf_, device, metadata.pool, dsl, &metadata.dset)); } // NOLINTNEXTLINE(modernize-avoid-c-arrays) VkDescriptorBufferInfo buffers[IGL_UNIFORM_BLOCKS_BINDING_MAX]; // uninitialized // NOLINTNEXTLINE(modernize-avoid-c-arrays) VkWriteDescriptorSet writes[IGL_UNIFORM_BLOCKS_BINDING_MAX]; // uninitialized uint32_t numWrites = 0; for (uint32_t loc = 0; loc != IGL_ARRAY_NUM_ELEMENTS(desc.buffers); loc++) { if (!desc.buffers[loc]) { continue; } auto* buf = static_cast(desc.buffers[loc].get()); const bool isDynamic = (desc.isDynamicBufferMask & (1ul << loc)) != 0; const bool isUniform = ((buf->getBufferType() & BufferDesc::BufferTypeBits::Uniform) != 0); const VkDescriptorType type = isUniform ? (isDynamic ? VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC : VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) : (isDynamic ? VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC : VK_DESCRIPTOR_TYPE_STORAGE_BUFFER); writes[numWrites] = ivkGetWriteDescriptorSetBufferInfo(metadata.dset, loc, type, 1, &buffers[numWrites]); buffers[numWrites++] = VkDescriptorBufferInfo{ buf->getVkBuffer(), desc.offset[loc], desc.size[loc] ? desc.size[loc] : VK_WHOLE_SIZE, }; } if (!IGL_DEBUG_VERIFY(numWrites)) { IGL_LOG_ERROR("Cannot create an empty bind group"); Result::setResult(outResult, Result(Result::Code::RuntimeError, "Cannot create an empty bind group")); return {}; } IGL_PROFILER_ZONE("vkUpdateDescriptorSets() - textures bind group", IGL_PROFILER_COLOR_UPDATE); vf_.vkUpdateDescriptorSets(vkDevice_, numWrites, writes, 0, nullptr); IGL_PROFILER_ZONE_END(); // once a descriptor set has been updated, destroy the DSL vf_.vkDestroyDescriptorSetLayout(vkDevice_, dsl, nullptr); Result::setOk(outResult); return pimpl_->bindGroupBuffersPool.create(std::move(metadata)); } void VulkanContext::destroy(BindGroupTextureHandle handle) { if (handle.empty()) { return; } deferredTask(std::packaged_task( [vf = &vf_, device = getVkDevice(), pool = pimpl_->bindGroupTexturesPool.get(handle)->pool] { vf->vkDestroyDescriptorPool(device, pool, nullptr); })); pimpl_->bindGroupTexturesPool.destroy(handle); } void VulkanContext::destroy(BindGroupBufferHandle handle) { if (handle.empty()) { return; } deferredTask(std::packaged_task( [vf = &vf_, device = getVkDevice(), pool = pimpl_->bindGroupBuffersPool.get(handle)->pool] { vf->vkDestroyDescriptorPool(device, pool, nullptr); })); pimpl_->bindGroupBuffersPool.destroy(handle); } void VulkanContext::destroy(SamplerHandle handle) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_DESTROY); if (handle.empty()) { return; } deferredTask(std::packaged_task( [vf = &vf_, device = getVkDevice(), sampler = samplers_.get(handle)->vkSampler]() { vf->vkDestroySampler(device, sampler, nullptr); })); samplers_.destroy(handle); } void VulkanContext::destroy(TextureHandle handle) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_DESTROY); if (handle.empty()) { return; } textures_.destroy(handle); } VkDescriptorSet VulkanContext::getBindGroupDescriptorSet(BindGroupTextureHandle handle) const { return handle.valid() ? pimpl_->bindGroupTexturesPool.get(handle)->dset : VK_NULL_HANDLE; } uint32_t VulkanContext::getBindGroupUsageMask(BindGroupTextureHandle handle) const { return handle.valid() ? pimpl_->bindGroupTexturesPool.get(handle)->usageMask : 0; } VkDescriptorSet VulkanContext::getBindGroupDescriptorSet(BindGroupBufferHandle handle) const { return handle.valid() ? pimpl_->bindGroupBuffersPool.get(handle)->dset : VK_NULL_HANDLE; } uint32_t VulkanContext::getBindGroupUsageMask(BindGroupBufferHandle handle) const { return handle.valid() ? pimpl_->bindGroupBuffersPool.get(handle)->usageMask : 0; } const VulkanFeatures& VulkanContext::features() const noexcept { return features_; } void VulkanContext::syncAcquireNext() noexcept { IGL_PROFILER_FUNCTION(); syncCurrentIndex = (syncCurrentIndex + 1) % config_.maxResourceCount; // Wait for the current buffer to become available immediate_->wait(syncSubmitHandles[syncCurrentIndex], config_.fenceTimeoutNanoseconds); } void VulkanContext::syncMarkSubmitted(VulkanImmediateCommands::SubmitHandle handle) noexcept { IGL_PROFILER_FUNCTION(); syncSubmitHandles[syncCurrentIndex] = handle; syncAcquireNext(); } void VulkanContext::ensureCurrentContextThread() const { IGL_DEBUG_ASSERT( pimpl_->contextThread == std::this_thread::get_id(), "IGL/Vulkan functions can only be accessed by 1 thread at a time. Call " "`setCurrentContextThread()` to mark the current thread as the `owning` thread."); } void VulkanContext::setCurrentContextThread() { pimpl_->contextThread = std::this_thread::get_id(); } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanContext.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined(IGL_ANDROID_HWBUFFER_SUPPORTED) struct AHardwareBuffer; #endif // defined(IGL_ANDROID_HWBUFFER_SUPPORTED) #if defined(IGL_WITH_TRACY_GPU) #include "tracy/TracyVulkan.hpp" #endif #define IGL_VULKAN_VALIDATION_LAYER_ERROR_SUMMARY 0 namespace igl::vulkan { namespace util { struct SpvModuleInfo; } // namespace util class CommandQueue; class ComputeCommandEncoder; class RenderCommandEncoder; class VulkanBuffer; class VulkanDescriptorSetLayout; class VulkanImage; class VulkanImageView; class VulkanSwapchain; class VulkanTexture; struct BindingsBuffers; struct BindingsTextures; struct BindingsStorageImages; struct VulkanContextImpl; struct VulkanImageCreateInfo; struct VulkanImageViewCreateInfo; /* * Descriptor sets: * 0 - combined image samplers * 1 - uniform/storage buffers * 2 - storage images * 3 - bindless textures/samplers <-- optional */ // NOLINTBEGIN(readability-identifier-naming) enum { kBindPoint_CombinedImageSamplers = 0, kBindPoint_Buffers = 1, kBindPoint_StorageImages = 2, kBindPoint_Bindless = 3, }; // NOLINTEND(readability-identifier-naming) struct DeviceQueues { static constexpr uint32_t kInvalid = 0xFFFFFFFF; uint32_t graphicsQueueFamilyIndex = kInvalid; uint32_t computeQueueFamilyIndex = kInvalid; VkQueue IGL_NULLABLE graphicsQueue = VK_NULL_HANDLE; VkQueue IGL_NULLABLE computeQueue = VK_NULL_HANDLE; }; class VulkanContext final { public: VulkanContext(VulkanContextConfig config, void* IGL_NULLABLE window, void* IGL_NULLABLE display = nullptr); ~VulkanContext(); VulkanContext(const VulkanContext&) = delete; VulkanContext(VulkanContext&&) = delete; VulkanContext& operator=(const VulkanContext&) = delete; VulkanContext& operator=(VulkanContext&&) = delete; Result queryDevices(const HWDeviceQueryDesc& desc, std::vector& outDevices); Result initContext(const HWDeviceDesc& desc, size_t numExtraDeviceExtensions = 0, const char* IGL_NULLABLE* IGL_NULLABLE extraDeviceExtensions = nullptr, const VulkanFeatures* IGL_NULLABLE requestedFeatures = nullptr, const char* IGL_NULLABLE debugName = nullptr); Result initSwapchain(uint32_t width, uint32_t height); VkExtent2D getSwapchainExtent() const; VulkanImage createImage(VkImageType imageType, VkExtent3D extent, VkFormat format, uint32_t mipLevels, uint32_t arrayLayers, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkMemoryPropertyFlags memFlags, VkImageCreateFlags flags, VkSampleCountFlagBits samples, Result* IGL_NULLABLE outResult, const char* IGL_NULLABLE debugName = nullptr) const; #if defined(IGL_ANDROID_HWBUFFER_SUPPORTED) std::unique_ptr createImageFromAndroidHardwareBuffer( AHardwareBuffer* androidHardwareBuffer, uint64_t memoryAllocationSize, VkImageType imageType, VkExtent3D extent, VkFormat format, uint32_t mipLevels, uint32_t arrayLayers, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageCreateFlags flags, VkSampleCountFlagBits samples, igl::Result* IGL_NULLABLE outResult, const char* IGL_NULLABLE debugName = nullptr) const; #endif // defined(IGL_ANDROID_HWBUFFER_SUPPORTED) std::unique_ptr createImageFromFileDescriptor( int32_t fileDescriptor, uint64_t memoryAllocationSize, VkImageType imageType, VkExtent3D extent, VkFormat format, uint32_t mipLevels, uint32_t arrayLayers, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageCreateFlags flags, VkSampleCountFlagBits samples, Result* IGL_NULLABLE outResult, const char* IGL_NULLABLE debugName = nullptr) const; std::unique_ptr createBuffer(VkDeviceSize bufferSize, VkBufferUsageFlags usageFlags, VkMemoryPropertyFlags memFlags, Result* IGL_NULLABLE outResult, const char* IGL_NULLABLE debugName = nullptr) const; std::shared_ptr createTexture(VulkanImage&& image, VulkanImageView&& imageView, const char* IGL_NULLABLE debugName) const; std::shared_ptr createTextureFromVkImage( VkImage vkImage, VulkanImageCreateInfo imageCreateInfo, VulkanImageViewCreateInfo imageViewCreateInfo, const char* IGL_NULLABLE debugName) const; SamplerHandle createSampler(const VkSamplerCreateInfo& ci, VkFormat yuvVkFormat, Result* IGL_NULLABLE outResult, const char* IGL_NULLABLE debugName = nullptr) const; void createSurface(void* IGL_NULLABLE window, void* IGL_NULLABLE display); void createHeadlessSurface(); bool hasSwapchain() const noexcept { return swapchain_ != nullptr; } Result waitIdle() const; Result present() const; /// @brief Returns the index of the current resource being used. /// Its range is [0, config.maxResourceCount). [[nodiscard]] uint32_t currentSyncIndex() const noexcept { return syncCurrentIndex; } void syncAcquireNext() noexcept; void syncMarkSubmitted(VulkanImmediateCommands::SubmitHandle handle) noexcept; const VkPhysicalDeviceProperties& getVkPhysicalDeviceProperties() const { return vkPhysicalDeviceProperties2_.properties; } const VkPhysicalDeviceMeshShaderPropertiesEXT& getvkPhysicalDeviceMeshShaderPropertiesEXT() const { return vkPhysicalDeviceMeshShaderPropertiesEXT_; } VkFormat getClosestDepthStencilFormat(TextureFormat desiredFormat) const; struct RenderPassHandle { VkRenderPass pass = VK_NULL_HANDLE; uint8_t index = 0; }; // render passes are owned and managed by the context RenderPassHandle findRenderPass(const VulkanRenderPassBuilder& builder) const; RenderPassHandle getRenderPass(uint8_t index) const; // OpenXR needs Vulkan instance to find physical device VkInstance IGL_NULLABLE getVkInstance() const { return vkInstance_; } VkDevice IGL_NULLABLE getVkDevice() const { return vkDevice_; } VkPhysicalDevice IGL_NULLABLE getVkPhysicalDevice() const { return vkPhysicalDevice_; } VkDescriptorSetLayout getBindlessVkDescriptorSetLayout() const; VkDescriptorSet getBindlessVkDescriptorSet() const; std::vector getPipelineCacheData() const; uint64_t getFrameNumber() const; using SubmitHandle = VulkanImmediateCommands::SubmitHandle; // execute a task some time in the future after the submit handle finished processing void deferredTask(std::packaged_task&& task, SubmitHandle handle = SubmitHandle()) const; bool areValidationLayersEnabled() const; void* IGL_NULLABLE getVmaAllocator() const; VkSamplerYcbcrConversionInfo getOrCreateYcbcrConversionInfo(VkFormat format) const; void freeResourcesForDescriptorSetLayout(VkDescriptorSetLayout dsl) const; const VulkanFeatures& features() const noexcept; [[nodiscard]] const VkSurfaceCapabilitiesKHR& getSurfaceCapabilities() const noexcept { return deviceSurfaceCaps_; } void ensureCurrentContextThread() const; void setCurrentContextThread(); #if defined(IGL_WITH_TRACY_GPU) TracyVkCtx tracyCtx_ = nullptr; VkCommandPool profilingCommandPool_ = VK_NULL_HANDLE; VkCommandBuffer profilingCommandBuffer_ = VK_NULL_HANDLE; #endif void waitDeferredTasks(); /// @param handle The handle to the GPU Fence /// @return The Vulkan fence associated with the handle [[nodiscard]] VkFence getVkFenceFromSubmitHandle(igl::SubmitHandle handle) const noexcept; /// Android only for now - Creates the file descriptor for the underlying VkFence /// @param handle The handle to the GPU Fence /// @return The fd for the Vulkan Fence associated with the handleint [[nodiscard]] int getFenceFdFromSubmitHandle(igl::SubmitHandle handle) const noexcept; private: void createInstance(); VkResult checkAndUpdateDescriptorSets(); void pruneTextures(); void querySurfaceCapabilities(); void processDeferredTasks() const; void growBindlessDescriptorPool(uint32_t newMaxTextures, uint32_t newMaxSamplers); BindGroupTextureHandle createBindGroup(const BindGroupTextureDesc& desc, const IRenderPipelineState* IGL_NULLABLE compatiblePipeline, Result* IGL_NULLABLE outResult); BindGroupBufferHandle createBindGroup(const BindGroupBufferDesc& desc, Result* IGL_NULLABLE outResult); void destroy(BindGroupTextureHandle handle); void destroy(BindGroupBufferHandle handle); void destroy(SamplerHandle handle); void destroy(TextureHandle handle); VkDescriptorSet getBindGroupDescriptorSet(BindGroupTextureHandle handle) const; VkDescriptorSet getBindGroupDescriptorSet(BindGroupBufferHandle handle) const; uint32_t getBindGroupUsageMask(BindGroupTextureHandle handle) const; uint32_t getBindGroupUsageMask(BindGroupBufferHandle handle) const; private: friend class Device; friend class VulkanStagingDevice; friend class VulkanSwapchain; friend class CommandQueue; friend class ComputeCommandEncoder; friend class RenderCommandEncoder; // should be kept on the heap, otherwise global Vulkan functions can cause arbitrary crashes. std::unique_ptr tableImpl_; VkInstance IGL_NULLABLE vkInstance_ = VK_NULL_HANDLE; VkDebugUtilsMessengerEXT vkDebugUtilsMessenger_ = VK_NULL_HANDLE; VkSurfaceKHR vkSurface_ = VK_NULL_HANDLE; VkPhysicalDevice IGL_NULLABLE vkPhysicalDevice_ = VK_NULL_HANDLE; VkPhysicalDeviceDescriptorIndexingPropertiesEXT vkPhysicalDeviceDescriptorIndexingProperties_{}; // Provided by VK_KHR_driver_properties VkPhysicalDeviceDriverPropertiesKHR vkPhysicalDeviceDriverProperties_{}; // Provided by VK_VERSION_1_1 VkPhysicalDeviceProperties2 vkPhysicalDeviceProperties2_{}; // Provided by VK_EXT_mesh_shader VkPhysicalDeviceMeshShaderPropertiesEXT vkPhysicalDeviceMeshShaderPropertiesEXT_{}; std::vector deviceDepthFormats_; std::vector deviceSurfaceFormats_; VkSurfaceCapabilitiesKHR deviceSurfaceCaps_{}; std::vector devicePresentModes_; VulkanFeatures features_; public: // NOLINTBEGIN(readability-identifier-naming) const VulkanFunctionTable& vf_; DeviceQueues deviceQueues_; VkDevice vkDevice_ = VK_NULL_HANDLE; std::unique_ptr swapchain_; std::unique_ptr timelineSemaphore_; std::unique_ptr immediate_; std::unique_ptr stagingDevice_; std::unique_ptr dummyUniformBuffer_; std::unique_ptr dummyStorageBuffer_; // don't use staging on devices with device-local host-visible memory bool useStagingForBuffers_ = true; std::unique_ptr pimpl_; VkPipelineCache pipelineCache_ = VK_NULL_HANDLE; mutable std::unordered_map ycbcrConversionInfos_; // 1. Textures can be safely deleted once they are not in use by GPU, hence our Vulkan context // owns all allocated textures (images+image views). The IGL interface vulkan::Texture does not // delete the underlying VulkanTexture but instead informs the context that it should be // deallocated. The context deallocates textures in a deferred way when it is safe to do so. // 2. Descriptor sets can be updated when they are not in use. mutable Pool> textures_; mutable Pool samplers_; // a texture/sampler was created since the last descriptor set update mutable bool awaitingCreation_ = false; mutable std::atomic drawCallCount_{0}; mutable std::atomic shaderCompilationCount_{0}; // stores an index into renderPasses_ mutable std:: unordered_map renderPassesHash_; mutable std::vector renderPasses_; VulkanContextConfig config_; // NOLINTEND(readability-identifier-naming) void updateBindingsTextures(VkCommandBuffer IGL_NONNULL cmdBuf, VkPipelineLayout layout, VkPipelineBindPoint bindPoint, VulkanImmediateCommands::SubmitHandle nextSubmitHandle, const BindingsTextures& data, const VulkanDescriptorSetLayout& dsl, const util::SpvModuleInfo& info) const; void updateBindingsBuffers(VkCommandBuffer IGL_NONNULL cmdBuf, VkPipelineLayout layout, VkPipelineBindPoint bindPoint, VulkanImmediateCommands::SubmitHandle nextSubmitHandle, BindingsBuffers& data, const VulkanDescriptorSetLayout& dsl, const util::SpvModuleInfo& info) const; void updateBindingsStorageImages(VkCommandBuffer IGL_NONNULL cmdBuf, VkPipelineLayout layout, VkPipelineBindPoint bindPoint, VulkanImmediateCommands::SubmitHandle nextSubmitHandle, const BindingsStorageImages& data, const VulkanDescriptorSetLayout& dsl, const util::SpvModuleInfo& info) const; struct DeferredTask { DeferredTask(std::packaged_task&& task, SubmitHandle handle) : task(std::move(task)), handle(handle) {} std::packaged_task task; SubmitHandle handle; uint64_t frameId = 0; }; mutable std::deque deferredTasks; // sync resources uint32_t syncCurrentIndex = 0u; std::vector syncSubmitHandles; VkPhysicalDeviceMemoryProperties memoryProperties{}; #if IGL_VULKAN_VALIDATION_LAYER_ERROR_SUMMARY std::unordered_map validationErrorsSummary_; #endif }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanDescriptorSetLayout.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "VulkanDescriptorSetLayout.h" #include namespace igl::vulkan { VulkanDescriptorSetLayout::VulkanDescriptorSetLayout(const VulkanContext& ctx, VkDescriptorSetLayoutCreateFlags flags, uint32_t numBindings, const VkDescriptorSetLayoutBinding* bindings, const VkDescriptorBindingFlags* bindingFlags, const char* debugName) : ctx(ctx), numBindings(numBindings) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); VK_ASSERT(ivkCreateDescriptorSetLayout(&ctx.vf_, ctx.getVkDevice(), flags, numBindings, bindings, bindingFlags, &vkDescriptorSetLayout)); VK_ASSERT(ivkSetDebugObjectName(&ctx.vf_, ctx.getVkDevice(), VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, (uint64_t)vkDescriptorSetLayout, debugName)); } VulkanDescriptorSetLayout::~VulkanDescriptorSetLayout() { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_DESTROY); ctx.freeResourcesForDescriptorSetLayout(vkDescriptorSetLayout); ctx.deferredTask(std::packaged_task( [vf = &ctx.vf_, device = ctx.getVkDevice(), layout = vkDescriptorSetLayout] { vf->vkDestroyDescriptorSetLayout(device, layout, nullptr); })); } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanDescriptorSetLayout.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::vulkan { /// @brief A wrapper around a VkDescriptorSetLayout class VulkanDescriptorSetLayout final { public: /** @brief Construct a new VulkanDescriptorSetLayout object with the given context, * descriptor set layout create info, and optional debug name. `bindings` is a pointer to an * array of VkDescriptorSetLayoutBinding and `bindingFlags` is a pointer to an array of * VkDescriptorBindingFlags. The number of elements in each array must be equal to `numBindings`. */ VulkanDescriptorSetLayout(const VulkanContext& ctx, VkDescriptorSetLayoutCreateFlags flags, uint32_t numBindings, const VkDescriptorSetLayoutBinding* bindings, const VkDescriptorBindingFlags* bindingFlags, const char* debugName = nullptr); ~VulkanDescriptorSetLayout(); VulkanDescriptorSetLayout(const VulkanDescriptorSetLayout&) = delete; VulkanDescriptorSetLayout& operator=(const VulkanDescriptorSetLayout&) = delete; VulkanDescriptorSetLayout(VulkanDescriptorSetLayout&&) = delete; VulkanDescriptorSetLayout& operator=(VulkanDescriptorSetLayout&&) = delete; [[nodiscard]] VkDescriptorSetLayout getVkDescriptorSetLayout() const { return vkDescriptorSetLayout; } public: const VulkanContext& ctx; VkDescriptorSetLayout vkDescriptorSetLayout = VK_NULL_HANDLE; uint32_t numBindings = 0; }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanFeatures.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include namespace igl::vulkan { VulkanFeatures::VulkanFeatures(VulkanContextConfig config) noexcept : // Vulkan 1.1 vkPhysicalDeviceFeatures2({ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2, .features = { .dualSrcBlend = config.enableDualSrcBlend ? VK_TRUE : VK_FALSE, .multiDrawIndirect = VK_TRUE, .drawIndirectFirstInstance = VK_TRUE, .depthBiasClamp = VK_TRUE, #ifdef IGL_PLATFORM_ANDROID .fillModeNonSolid = VK_FALSE, // not well supported on Android #else .fillModeNonSolid = VK_TRUE, #endif .shaderInt16 = config.enableShaderInt16 ? VK_TRUE : VK_FALSE, }, }), featuresSamplerYcbcrConversion({ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, .samplerYcbcrConversion = VK_TRUE, }), featuresShaderDrawParameters({ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES, .shaderDrawParameters = config.enableShaderDrawParameters ? VK_TRUE : VK_FALSE, }), featuresMultiview({ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, .multiview = VK_TRUE, .multiviewGeometryShader = VK_FALSE, .multiviewTessellationShader = VK_FALSE, }), featuresBufferDeviceAddress({ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_KHR, .bufferDeviceAddress = VK_TRUE, .bufferDeviceAddressCaptureReplay = VK_FALSE, .bufferDeviceAddressMultiDevice = VK_FALSE, }), featuresDescriptorIndexing({ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, .shaderInputAttachmentArrayDynamicIndexing = VK_FALSE, .shaderUniformTexelBufferArrayDynamicIndexing = VK_FALSE, .shaderStorageTexelBufferArrayDynamicIndexing = VK_FALSE, .shaderUniformBufferArrayNonUniformIndexing = VK_FALSE, .shaderSampledImageArrayNonUniformIndexing = VK_TRUE, .shaderStorageBufferArrayNonUniformIndexing = VK_FALSE, .shaderStorageImageArrayNonUniformIndexing = VK_FALSE, .shaderInputAttachmentArrayNonUniformIndexing = VK_FALSE, .shaderUniformTexelBufferArrayNonUniformIndexing = VK_FALSE, .shaderStorageTexelBufferArrayNonUniformIndexing = VK_FALSE, .descriptorBindingUniformBufferUpdateAfterBind = VK_TRUE, .descriptorBindingSampledImageUpdateAfterBind = VK_TRUE, .descriptorBindingStorageImageUpdateAfterBind = VK_TRUE, .descriptorBindingStorageBufferUpdateAfterBind = VK_TRUE, .descriptorBindingUniformTexelBufferUpdateAfterBind = VK_FALSE, .descriptorBindingStorageTexelBufferUpdateAfterBind = VK_FALSE, .descriptorBindingUpdateUnusedWhilePending = VK_TRUE, .descriptorBindingPartiallyBound = VK_TRUE, .descriptorBindingVariableDescriptorCount = VK_FALSE, .runtimeDescriptorArray = VK_TRUE, }), features16BitStorage({ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, .storageBuffer16BitAccess = config.enableStorageBuffer16BitAccess ? VK_TRUE : VK_FALSE, .uniformAndStorageBuffer16BitAccess = VK_FALSE, .storagePushConstant16 = VK_FALSE, .storageInputOutput16 = VK_FALSE, }), // Vulkan 1.2 featuresShaderFloat16Int8({ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES_KHR, .shaderFloat16 = VK_FALSE, .shaderInt8 = VK_FALSE, }), featuresIndexTypeUint8({ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT, .indexTypeUint8 = VK_FALSE, }), featuresSynchronization2({ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR, .synchronization2 = VK_TRUE, }), featuresTimelineSemaphore({ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR, .timelineSemaphore = VK_TRUE, }), featuresFragmentDensityMap({ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT, .fragmentDensityMap = VK_TRUE, }), featuresVulkanMemoryModel({ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR, .vulkanMemoryModel = VK_TRUE, }), features8BitStorage({ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR, .storageBuffer8BitAccess = VK_TRUE, .uniformAndStorageBuffer8BitAccess = VK_FALSE, .storagePushConstant8 = VK_FALSE, }), featuresUniformBufferStandardLayout({ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR, .uniformBufferStandardLayout = VK_TRUE, }), featuresMultiviewPerViewViewports({ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_VIEWPORTS_FEATURES_QCOM, .multiviewPerViewViewports = VK_TRUE, }), featuresMeshShader({ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT, .taskShader = VK_TRUE, .meshShader = VK_TRUE, }), featuresFragmentShadingRate({ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR, .pipelineFragmentShadingRate = VK_FALSE, .primitiveFragmentShadingRate = VK_FALSE, .attachmentFragmentShadingRate = VK_FALSE, }), config(config) { extensions_.resize(kNumberOfExtensionTypes); enabledExtensions_.resize(kNumberOfExtensionTypes); // All the above get assembled into a feature chain assembleFeatureChain(config); } void VulkanFeatures::populateWithAvailablePhysicalDeviceFeatures( const VulkanContext& context, VkPhysicalDevice physicalDevice) noexcept { // NOLINT(bugprone-exception-escape) IGL_DEBUG_ASSERT(context.vf_.vkGetPhysicalDeviceFeatures2 != nullptr, "Pointer to function vkGetPhysicalDeviceFeatures2() is nullptr"); uint32_t numExtensions = 0; context.vf_.vkEnumerateDeviceExtensionProperties( physicalDevice, nullptr, &numExtensions, nullptr); extensionProps_.resize(numExtensions); context.vf_.vkEnumerateDeviceExtensionProperties( physicalDevice, nullptr, &numExtensions, extensionProps_.data()); assembleFeatureChain(context.config_); context.vf_.vkGetPhysicalDeviceFeatures2(physicalDevice, &vkPhysicalDeviceFeatures2); } bool VulkanFeatures::hasExtension(const char* ext) const { for (const VkExtensionProperties& props : extensionProps_) { if (strcmp(ext, props.extensionName) == 0) { return true; } } return false; } Result VulkanFeatures::checkSelectedFeatures( const VulkanFeatures& availableFeatures) const noexcept { // NOLINT(bugprone-exception-escape) // Stores missing features std::string missingFeatures; // Macros for checking whether a requested feature is present. The macro logs an error if the // feature is requested and not available Based on // https://github.com/corporateshark/lightweightvk/blob/6b5ba5512f0e1ba7b20f4b37d7ec100eb25287c1/lvk/vulkan/VulkanClasses.cpp#L4702 #define ENABLE_VULKAN_FEATURE(requestedFeatureStruct, availableFeatureStruct, feature, version) \ if ((requestedFeatureStruct.feature == VK_TRUE) && \ (availableFeatureStruct.feature == VK_FALSE)) { \ missingFeatures.append("\n " version " " #requestedFeatureStruct "." #feature); \ } #define ENABLE_FEATURE_1_1(availableFeatureStruct, feature) \ ENABLE_VULKAN_FEATURE(vkPhysicalDeviceFeatures2.features, \ availableFeatureStruct.vkPhysicalDeviceFeatures2.features, \ feature, \ "1.1") ENABLE_FEATURE_1_1(availableFeatures, dualSrcBlend) ENABLE_FEATURE_1_1(availableFeatures, shaderInt16) ENABLE_FEATURE_1_1(availableFeatures, multiDrawIndirect) ENABLE_FEATURE_1_1(availableFeatures, drawIndirectFirstInstance) ENABLE_FEATURE_1_1(availableFeatures, depthBiasClamp) ENABLE_FEATURE_1_1(availableFeatures, fillModeNonSolid) #undef ENABLE_FEATURE_1_1 #define ENABLE_FEATURE_1_1_EXT(requestedFeatureStruct, availableFeatureStruct, feature) \ ENABLE_VULKAN_FEATURE(requestedFeatureStruct, availableFeatureStruct, feature, "1.1 EXT") if (config.enableDescriptorIndexing) { ENABLE_FEATURE_1_1_EXT(featuresDescriptorIndexing, availableFeatures.featuresDescriptorIndexing, shaderSampledImageArrayNonUniformIndexing) ENABLE_FEATURE_1_1_EXT(featuresDescriptorIndexing, availableFeatures.featuresDescriptorIndexing, descriptorBindingUniformBufferUpdateAfterBind) ENABLE_FEATURE_1_1_EXT(featuresDescriptorIndexing, availableFeatures.featuresDescriptorIndexing, descriptorBindingSampledImageUpdateAfterBind) ENABLE_FEATURE_1_1_EXT(featuresDescriptorIndexing, availableFeatures.featuresDescriptorIndexing, descriptorBindingStorageImageUpdateAfterBind) ENABLE_FEATURE_1_1_EXT(featuresDescriptorIndexing, availableFeatures.featuresDescriptorIndexing, descriptorBindingStorageBufferUpdateAfterBind) ENABLE_FEATURE_1_1_EXT(featuresDescriptorIndexing, availableFeatures.featuresDescriptorIndexing, descriptorBindingUpdateUnusedWhilePending) ENABLE_FEATURE_1_1_EXT(featuresDescriptorIndexing, availableFeatures.featuresDescriptorIndexing, descriptorBindingPartiallyBound) ENABLE_FEATURE_1_1_EXT(featuresDescriptorIndexing, availableFeatures.featuresDescriptorIndexing, runtimeDescriptorArray) } ENABLE_FEATURE_1_1_EXT( features16BitStorage, availableFeatures.features16BitStorage, storageBuffer16BitAccess) if (has_VK_KHR_buffer_device_address) { ENABLE_FEATURE_1_1_EXT(featuresBufferDeviceAddress, availableFeatures.featuresBufferDeviceAddress, bufferDeviceAddress) } ENABLE_FEATURE_1_1_EXT(featuresMultiview, availableFeatures.featuresMultiview, multiview) ENABLE_FEATURE_1_1_EXT(featuresSamplerYcbcrConversion, availableFeatures.featuresSamplerYcbcrConversion, samplerYcbcrConversion) ENABLE_FEATURE_1_1_EXT(featuresShaderDrawParameters, availableFeatures.featuresShaderDrawParameters, shaderDrawParameters) #undef ENABLE_FEATURE_1_1_EXT #define ENABLE_FEATURE_1_2_EXT(requestedFeatureStruct, availableFeatureStruct, feature) \ ENABLE_VULKAN_FEATURE(requestedFeatureStruct, availableFeatureStruct, feature, "1.2") ENABLE_FEATURE_1_2_EXT( featuresShaderFloat16Int8, availableFeatures.featuresShaderFloat16Int8, shaderFloat16) #undef ENABLE_FEATURE_1_2_EXT #undef ENABLE_VULKAN_FEATURE if (!missingFeatures.empty()) { #if !IGL_PLATFORM_APPLE IGL_DEBUG_ABORT("Missing Vulkan features: %s\n", missingFeatures.c_str()); return Result(Result::Code::RuntimeError); #else IGL_LOG_INFO("Missing Vulkan features: %s\n", missingFeatures.c_str()); // For Vulkan 1.3 and MoltenVK, don't return an error as some 1.3 features are available // via extensions #endif } // Return the value 'Ok' return Result{}; } void VulkanFeatures::assembleFeatureChain(const VulkanContextConfig& contextConfig) noexcept { // Versions 1.0 and 1.1 are always present // Reset all pNext pointers. We might be copying the chain from another VulkanFeatures object, // so we need to reset the pNext pointers to avoid dangling pointers. Some of the extensions' // pointers are guarded by #ifdefs below vkPhysicalDeviceFeatures2.pNext = nullptr; featuresSamplerYcbcrConversion.pNext = nullptr; featuresShaderDrawParameters.pNext = nullptr; featuresMultiview.pNext = nullptr; featuresIndexTypeUint8.pNext = nullptr; featuresSynchronization2.pNext = nullptr; featuresTimelineSemaphore.pNext = nullptr; featuresVulkanMemoryModel.pNext = nullptr; featuresShaderFloat16Int8.pNext = nullptr; features16BitStorage.pNext = nullptr; featuresBufferDeviceAddress.pNext = nullptr; featuresDescriptorIndexing.pNext = nullptr; featuresMultiviewPerViewViewports.pNext = nullptr; featuresFragmentDensityMap.pNext = nullptr; features8BitStorage.pNext = nullptr; featuresUniformBufferStandardLayout.pNext = nullptr; featuresMeshShader.pNext = nullptr; featuresFragmentShadingRate.pNext = nullptr; // Add the required and optional features to the VkPhysicalDeviceFetaures2_ ivkAddNext(&vkPhysicalDeviceFeatures2, &featuresSamplerYcbcrConversion); ivkAddNext(&vkPhysicalDeviceFeatures2, &featuresShaderDrawParameters); ivkAddNext(&vkPhysicalDeviceFeatures2, &featuresMultiview); if (hasExtension(VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME)) { ivkAddNext(&vkPhysicalDeviceFeatures2, &featuresShaderFloat16Int8); } if (hasExtension(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME)) { ivkAddNext(&vkPhysicalDeviceFeatures2, &featuresBufferDeviceAddress); } if (hasExtension(VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME)) { ivkAddNext(&vkPhysicalDeviceFeatures2, &featuresVulkanMemoryModel); } if (hasExtension(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME)) { ivkAddNext(&vkPhysicalDeviceFeatures2, &featuresDescriptorIndexing); } ivkAddNext(&vkPhysicalDeviceFeatures2, &features16BitStorage); if (hasExtension(VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME)) { ivkAddNext(&vkPhysicalDeviceFeatures2, &featuresIndexTypeUint8); } if (hasExtension(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME)) { ivkAddNext(&vkPhysicalDeviceFeatures2, &featuresSynchronization2); } if (hasExtension(VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME)) { ivkAddNext(&vkPhysicalDeviceFeatures2, &featuresTimelineSemaphore); } if (hasExtension(VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME)) { ivkAddNext(&vkPhysicalDeviceFeatures2, &featuresFragmentDensityMap); } if (hasExtension(VK_KHR_8BIT_STORAGE_EXTENSION_NAME)) { ivkAddNext(&vkPhysicalDeviceFeatures2, &features8BitStorage); } if (hasExtension(VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME)) { ivkAddNext(&vkPhysicalDeviceFeatures2, &featuresUniformBufferStandardLayout); } if (contextConfig.enableMultiviewPerViewViewports) { if (hasExtension(VK_QCOM_MULTIVIEW_PER_VIEW_VIEWPORTS_EXTENSION_NAME)) { ivkAddNext(&vkPhysicalDeviceFeatures2, &featuresMultiviewPerViewViewports); } else { IGL_LOG_ERROR("VK_QCOM_multiview_per_view_viewports extension not supported\n"); } } // Fragment shading rate must be added before mesh shader to ensure the dependency is properly // handled when primitiveFragmentShadingRateMeshShader requires primitiveFragmentShadingRate if (hasExtension(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME)) { ivkAddNext(&vkPhysicalDeviceFeatures2, &featuresFragmentShadingRate); } if (hasExtension(VK_EXT_MESH_SHADER_EXTENSION_NAME)) { ivkAddNext(&vkPhysicalDeviceFeatures2, &featuresMeshShader); } } VulkanFeatures& VulkanFeatures::operator=(const VulkanFeatures& other) noexcept { if (this == &other) { return *this; } const bool sameConfiguration = config.enableDescriptorIndexing == other.config.enableDescriptorIndexing; if (!sameConfiguration) { return *this; } vkPhysicalDeviceFeatures2 = other.vkPhysicalDeviceFeatures2; featuresSamplerYcbcrConversion = other.featuresSamplerYcbcrConversion; featuresShaderDrawParameters = other.featuresShaderDrawParameters; featuresMultiview = other.featuresMultiview; featuresBufferDeviceAddress = other.featuresBufferDeviceAddress; featuresDescriptorIndexing = other.featuresDescriptorIndexing; features16BitStorage = other.features16BitStorage; // Vulkan 1.2 featuresVulkanMemoryModel = other.featuresVulkanMemoryModel; featuresShaderFloat16Int8 = other.featuresShaderFloat16Int8; featuresIndexTypeUint8 = other.featuresIndexTypeUint8; featuresSynchronization2 = other.featuresSynchronization2; featuresTimelineSemaphore = other.featuresTimelineSemaphore; featuresFragmentDensityMap = other.featuresFragmentDensityMap; features8BitStorage = other.features8BitStorage; featuresUniformBufferStandardLayout = other.featuresUniformBufferStandardLayout; featuresMultiviewPerViewViewports = other.featuresMultiviewPerViewViewports; featuresMeshShader = other.featuresMeshShader; featuresFragmentShadingRate = other.featuresFragmentShadingRate; extensions_ = other.extensions_; enabledExtensions_ = other.enabledExtensions_; extensionProps_ = other.extensionProps_; assembleFeatureChain(config); return *this; } void VulkanFeatures::enumerate(const VulkanFunctionTable& vf) { uint32_t count = 0; VK_ASSERT(vf.vkEnumerateInstanceExtensionProperties(nullptr, &count, nullptr)); std::vector allExtensions(count); VK_ASSERT(vf.vkEnumerateInstanceExtensionProperties(nullptr, &count, allExtensions.data())); constexpr size_t vectorIndex = (size_t)ExtensionType::Instance; std::transform(allExtensions.cbegin(), allExtensions.cend(), std::back_inserter(extensions_[vectorIndex]), [](const VkExtensionProperties& extensionProperties) { return extensionProperties.extensionName; }); } void VulkanFeatures::enumerate(const VulkanFunctionTable& vf, VkPhysicalDevice device) { uint32_t count = 0; VK_ASSERT(vf.vkEnumerateDeviceExtensionProperties(device, nullptr, &count, nullptr)); std::vector allExtensions(count); VK_ASSERT(vf.vkEnumerateDeviceExtensionProperties(device, nullptr, &count, allExtensions.data())); constexpr size_t vectorIndex = (size_t)ExtensionType::Device; std::transform(allExtensions.cbegin(), allExtensions.cend(), std::back_inserter(extensions_[vectorIndex]), [](const VkExtensionProperties& extensionProperties) { return extensionProperties.extensionName; }); } const std::vector& VulkanFeatures::allAvailableExtensions( ExtensionType extensionType) const { const size_t vectorIndex = (size_t)extensionType; return extensions_[vectorIndex]; } bool VulkanFeatures::available(const char* extensionName, ExtensionType extensionType) const { const size_t vectorIndex = (size_t)extensionType; const std::string extensionNameStr(extensionName); auto result = std::find_if( extensions_[vectorIndex].begin(), extensions_[vectorIndex].end(), [&extensionNameStr](const std::string& extension) { return extension == extensionNameStr; }); return result != extensions_[vectorIndex].end(); } bool VulkanFeatures::enable(const char* extensionName, ExtensionType extensionType) { const size_t vectorIndex = (size_t)extensionType; if (available(extensionName, extensionType)) { enabledExtensions_[vectorIndex].insert(extensionName); return true; } return false; } void VulkanFeatures::enableCommonInstanceExtensions(const VulkanContextConfig& contextConfig) { enable(VK_KHR_SURFACE_EXTENSION_NAME, ExtensionType::Instance); enable(VK_EXT_DEBUG_UTILS_EXTENSION_NAME, ExtensionType::Instance); #if IGL_PLATFORM_WINDOWS enable(VK_KHR_WIN32_SURFACE_EXTENSION_NAME, ExtensionType::Instance); #elif IGL_PLATFORM_ANDROID enable(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, ExtensionType::Instance); #elif IGL_PLATFORM_LINUX enable("VK_KHR_xlib_surface", ExtensionType::Instance); #elif IGL_PLATFORM_MACOSX enable(VK_EXT_METAL_SURFACE_EXTENSION_NAME, ExtensionType::Instance); #endif // https://vulkan.lunarg.com/doc/sdk/1.3.216.0/mac/getting_started.html has_VK_KHR_portability_enumeration = enable(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME, ExtensionType::Instance); #if !IGL_PLATFORM_ANDROID if (contextConfig.enableValidation) { enable(VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME, ExtensionType::Instance); } #endif // !IGL_PLATFORM_ANDROID has_VK_KHR_get_surface_capabilities2 = enable(VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME, ExtensionType::Instance); has_VK_EXT_headless_surface = enable(VK_EXT_HEADLESS_SURFACE_EXTENSION_NAME, ExtensionType::Instance); if (contextConfig.headless) { if (!has_VK_EXT_headless_surface) { IGL_LOG_ERROR("VK_EXT_headless_surface extension not supported\n"); } } if (contextConfig.swapChainColorSpace != igl::ColorSpace::SRGB_NONLINEAR) { const bool enabledExtension = enable(VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME, ExtensionType::Instance); if (!enabledExtension) { IGL_LOG_ERROR("VK_EXT_swapchain_colorspace extension not supported\n"); } } } void VulkanFeatures::enableCommonDeviceExtensions(const VulkanContextConfig& contextConfig) { enable(VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME, ExtensionType::Device); enable(VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME, ExtensionType::Device); enable(VK_KHR_SWAPCHAIN_EXTENSION_NAME, ExtensionType::Device); #if IGL_PLATFORM_ANDROID enable(VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME, ExtensionType::Device); enable(VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME, ExtensionType::Device); enable(VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME, ExtensionType::Device); enable(VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME, ExtensionType::Device); #endif // IGL_PLATFORM_ANDROID #if !IGL_DEBUG has_VK_KHR_shader_non_semantic_info = enable(VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME, ExtensionType::Device); #endif // !IGL_DEBUG // Enable the Portability Subset extension when available (e.g. MoltenVK). // Reset the flag if the extension is not available. if (has_VK_KHR_portability_enumeration) { has_VK_KHR_portability_enumeration = enable("VK_KHR_portability_subset", ExtensionType::Device); } #if IGL_PLATFORM_WINDOWS enable(VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME, ExtensionType::Device); #endif // IGL_PLATFORM_WINDOWS #if IGL_PLATFORM_LINUX enable(VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME, ExtensionType::Device); enable(VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME, ExtensionType::Device); #endif // IGL_PLATFORM_LINUX #if defined(IGL_WITH_TRACY_GPU) enable(VK_EXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME, ExtensionType::Device); #endif // IGL_WITH_TRACY_GPU has_VK_EXT_index_type_uint8 = enable(VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME, ExtensionType::Device); has_VK_EXT_queue_family_foreign = enable(VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME, ExtensionType::Device); has_VK_KHR_timeline_semaphore = enable(VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME, ExtensionType::Device); has_VK_KHR_uniform_buffer_standard_layout = enable(VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME, ExtensionType::Device); has_VK_KHR_synchronization2 = enable(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME, ExtensionType::Device); has_VK_KHR_8bit_storage = enable(VK_KHR_8BIT_STORAGE_EXTENSION_NAME, ExtensionType::Device); has_VK_KHR_buffer_device_address = enable(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME, ExtensionType::Device); has_VK_KHR_vulkan_memory_model = enable(VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME, ExtensionType::Device); has_VK_EXT_descriptor_indexing = enable(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME, ExtensionType::Device); has_VK_EXT_fragment_density_map = enable(VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME, ExtensionType::Device); if (contextConfig.enableMultiviewPerViewViewports) { has_VK_QCOM_multiview_per_view_viewports = enable(VK_QCOM_MULTIVIEW_PER_VIEW_VIEWPORTS_EXTENSION_NAME, ExtensionType::Device); IGL_SOFT_ASSERT(has_VK_QCOM_multiview_per_view_viewports, "VK_QCOM_multiview_per_view_viewports is not supported"); } has_VK_EXT_mesh_shader = enable(VK_EXT_MESH_SHADER_EXTENSION_NAME, ExtensionType::Device); // Enable fragment shading rate extension (required when primitiveFragmentShadingRateMeshShader is // used) enable(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME, ExtensionType::Device); } bool VulkanFeatures::enabled(const char* extensionName) const { return (enabledExtensions_[(size_t)ExtensionType::Instance].count(extensionName) > 0) || (enabledExtensions_[(size_t)ExtensionType::Device].count(extensionName) > 0); } std::vector VulkanFeatures::allEnabled(ExtensionType extensionType) const { const size_t vectorIndex = (size_t)extensionType; std::vector returnList; for (const auto& extension : enabledExtensions_[vectorIndex]) { returnList.emplace_back(extension.c_str()); } return returnList; } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanFeatures.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::vulkan { class VulkanContext; /// @brief Creates and maintains a list of feature structures for checking feature availability and /// feature selection. This class provides a way to quickly enable the default and required /// features. This class also manages instance and device extensions in Vulkan by enumerating all /// extensions available for either object and storing the names of the available ones as /// std::strings. A call to either `enumerate()` or `enumerate(VkPhysicalDevice)` must be performed /// before the class can be used. After enumeration, this class allows users to enable an object's /// extension by name by first checking them against all available extensions of that type. Only /// available extensions are stored as enabled internally. The class also provides helper functions /// to return all available extensions of a type, checking whether an extension is available without /// modifying the internal storage of the object, checking if an extension has been enabled for an /// object and, finally, a method to return a list of all enabled extensions of a type as `const /// char *`, which is accepted by the Vulkan API class VulkanFeatures final { public: /// @brief Helper enumeration to determine which extension is being used. It's converted to a /// size_t internally to help access the right list of enumerations enum class ExtensionType { Instance = 0, Device }; explicit VulkanFeatures(VulkanContextConfig config) noexcept; /// @brief Populates the VkPhysicalDeviceFeatures2 and its pNext chain for a Vulkan context void populateWithAvailablePhysicalDeviceFeatures(const VulkanContext& context, VkPhysicalDevice physicalDevice) noexcept; /// @brief Checks the features enabled in this class against the ones passed /// in as a parameter in 'availableFeatures'. If a requested feature is not present, the class /// logs the message and returns a failure [[nodiscard]] Result checkSelectedFeatures( const VulkanFeatures& availableFeatures) const noexcept; VkPhysicalDeviceFeatures2 vkPhysicalDeviceFeatures2{}; // Vulkan 1.1 VkPhysicalDeviceSamplerYcbcrConversionFeatures featuresSamplerYcbcrConversion{}; VkPhysicalDeviceShaderDrawParametersFeatures featuresShaderDrawParameters{}; VkPhysicalDeviceMultiviewFeatures featuresMultiview{}; VkPhysicalDeviceBufferDeviceAddressFeaturesKHR featuresBufferDeviceAddress{}; VkPhysicalDeviceDescriptorIndexingFeaturesEXT featuresDescriptorIndexing{}; VkPhysicalDevice16BitStorageFeatures features16BitStorage{}; // Vulkan 1.2 VkPhysicalDeviceShaderFloat16Int8Features featuresShaderFloat16Int8{}; VkPhysicalDeviceIndexTypeUint8FeaturesEXT featuresIndexTypeUint8{}; VkPhysicalDeviceSynchronization2FeaturesKHR featuresSynchronization2{}; VkPhysicalDeviceTimelineSemaphoreFeaturesKHR featuresTimelineSemaphore{}; VkPhysicalDeviceFragmentDensityMapFeaturesEXT featuresFragmentDensityMap{}; VkPhysicalDeviceVulkanMemoryModelFeaturesKHR featuresVulkanMemoryModel{}; VkPhysicalDevice8BitStorageFeaturesKHR features8BitStorage{}; VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR featuresUniformBufferStandardLayout{}; VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM featuresMultiviewPerViewViewports{}; VkPhysicalDeviceMeshShaderFeaturesEXT featuresMeshShader{}; VkPhysicalDeviceFragmentShadingRateFeaturesKHR featuresFragmentShadingRate{}; // We need to reassemble the feature chain because of the pNext pointers VulkanFeatures& operator=(const VulkanFeatures& other) noexcept; /// @brief Enumerates all instance extensions and stores their names internally in a vector of /// std::strings void enumerate(const VulkanFunctionTable& vf); /// @brief Enumerates all physical device extensions and stores their names internally in a vector /// of std::strings /// @param The physical device to use as a reference for the enumeration void enumerate(const VulkanFunctionTable& vf, VkPhysicalDevice device); /// @brief Returns all available extensions of a type /// @param extensionType The type of the extensions [[nodiscard]] const std::vector& allAvailableExtensions( ExtensionType extensionType) const; /// @brief Returns true if the extension with name equal to `extensionName` of the type /// `extensionType` is available and false otherwise /// @param extensionName The name of the extension /// @param extensionType The type of the extensions to return bool available(const char* extensionName, ExtensionType extensionType) const; /// @brief Enables the common instance extensions used in IGL. /// @param contextConfig The VulkanContextConfig used to create the VulkanContext void enableCommonInstanceExtensions(const VulkanContextConfig& contextConfig); /// @brief Enables the common device extensions used in IGL. /// @param contextConfig The VulkanContextConfig used to create the VulkanContext void enableCommonDeviceExtensions(const VulkanContextConfig& contextConfig); public: friend class Device; friend class VulkanContext; // A copy of the config used by the VulkanContext VulkanContextConfig config{}; // NOLINTBEGIN(readability-identifier-naming) bool has_VK_EXT_descriptor_indexing = false; // promoted to Vulkan 1.2 bool has_VK_EXT_fragment_density_map = false; bool has_VK_EXT_headless_surface = false; bool has_VK_EXT_index_type_uint8 = false; // promoted to Vulkan 1.4 bool has_VK_EXT_mesh_shader = false; bool has_VK_EXT_queue_family_foreign = false; bool has_VK_KHR_8bit_storage = false; // promoted to Vulkan 1.2 bool has_VK_KHR_buffer_device_address = false; // promoted to Vulkan 1.2 bool has_VK_KHR_get_surface_capabilities2 = false; bool has_VK_KHR_portability_enumeration = false; bool has_VK_KHR_shader_non_semantic_info = false; // promoted to Vulkan 1.3 bool has_VK_KHR_synchronization2 = false; // promoted to Vulkan 1.3 bool has_VK_KHR_timeline_semaphore = false; // promoted to Vulkan 1.2 bool has_VK_KHR_uniform_buffer_standard_layout = false; // promoted to Vulkan 1.2 bool has_VK_KHR_vulkan_memory_model = false; // promoted to Vulkan 1.2 bool has_VK_QCOM_multiview_per_view_viewports = false; // NOLINTEND(readability-identifier-naming) private: static constexpr size_t kNumberOfExtensionTypes = 2; /// @brief a Vector of a vector of strings. The outer vector stores two vectors, one for each /// object type (instance and physical device). The inner vector is the list of all available /// extensions for the type std::vector> extensions_; /// @brief a Vector of unordered_sets of string. The outer vector stores two sets, one for each /// object type (instance and device). The inner set is the list of all extensions enabled for the /// type std::vector> enabledExtensions_; /// @brief Assembles the feature chain for the VkPhysicalDeviceFeatures2 structure by connecting /// the existing/required feature structures and their pNext chain. void assembleFeatureChain(const VulkanContextConfig& contextConfig) noexcept; bool hasExtension(const char* ext) const; /// @brief Enables the extension with name `extensionName` of the type `extensionType` if the /// extension is available. If an instance or physical device deoesn't support the /// extension, this method is a no-op /// @param extensionName The name of the extension /// @param extensionType The type of the extension /// @return True if the extension is available, false otherwise bool enable(const char* extensionName, ExtensionType extensionType); /// @brief Returns true if an extension with name `extensionName` is enabled and false otherwise. /// This method will check the extension against the list of enabled ones for the /// instance and the physical device /// @param extensionName The name of the extension /// @return True if the extension has been enabled, false otherwise [[nodiscard]] bool enabled(const char* extensionName) const; /// @brief Returns a vector of `const char *` of all enabled extensions for an instance or phyical /// device. This method is particularly useful because Vulkan expects an /// array of `const char *` with the names of the extensions to enable /// @param extensionType The type of the extensions /// @return A vector of `const char *` with all enabled extensions of type `extensionType`. The /// return value must not outlive the instance of this class, as the pointers in the returned /// vector point to the strings stored internally in this class [[nodiscard]] std::vector allEnabled(ExtensionType extensionType) const; std::vector extensionProps_; }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanFence.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "VulkanFence.h" #include // std::swap #include namespace igl::vulkan { VulkanFence::VulkanFence(const VulkanFunctionTable& vf, VkDevice device, VkFlags flags, bool exportable, const char* debugName) : vf_(&vf), device_(device), exportable_(exportable) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); const VkExportFenceCreateInfo exportInfo = { .sType = VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO, .handleTypes = VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT, }; const VkFenceCreateInfo ci = { .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, .pNext = exportable ? &exportInfo : nullptr, .flags = flags, }; VK_ASSERT(vf_->vkCreateFence(device_, &ci, nullptr, &vkFence_)); VK_ASSERT( ivkSetDebugObjectName(vf_, device_, VK_OBJECT_TYPE_FENCE, (uint64_t)vkFence_, debugName)); } VulkanFence ::~VulkanFence() { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_DESTROY); if (device_ != VK_NULL_HANDLE) { // lifetimes of all VkFence objects are managed explicitly // we do not use deferredTask() for them vf_->vkDestroyFence(device_, vkFence_, nullptr); } } VulkanFence::VulkanFence(VulkanFence&& other) noexcept { std::swap(vf_, other.vf_); std::swap(device_, other.device_); std::swap(vkFence_, other.vkFence_); std::swap(exportable_, other.exportable_); } VulkanFence& VulkanFence::operator=(VulkanFence&& other) noexcept { VulkanFence tmp(std::move(other)); std::swap(vf_, tmp.vf_); std::swap(device_, tmp.device_); std::swap(vkFence_, tmp.vkFence_); std::swap(exportable_, tmp.exportable_); return *this; } bool VulkanFence::reset() noexcept { const VkResult result = vf_->vkResetFences(device_, 1, &vkFence_); return result == VK_SUCCESS; } bool VulkanFence::wait(uint64_t timeoutNs) noexcept { const VkResult result = vf_->vkWaitForFences(device_, 1, &vkFence_, VK_TRUE, timeoutNs); return result == VK_SUCCESS; } bool VulkanFence::signal(VkQueue queue) { if (queue == VK_NULL_HANDLE) { // protected against invalid submit return false; } const VkResult result = vf_->vkQueueSubmit(queue, 0, nullptr, vkFence_); return result == VK_SUCCESS; } bool VulkanFence::exportable() const noexcept { return exportable_; } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanFence.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::vulkan { /** * @brief Fences are used to synchronize CPU-GPU tasks. The VulkanFence class encapsulates the * creation and destruction of a vulkan fence object (VkFence). It stores an opaque handle for a * newly created fence object and for a device object. */ class VulkanFence final { public: VulkanFence(const VulkanFunctionTable& vf, VkDevice device, VkFlags flags, bool exportable = false, const char* debugName = nullptr); ~VulkanFence(); VulkanFence(VulkanFence&& other) noexcept; VulkanFence& operator=(VulkanFence&& other) noexcept; VulkanFence(const VulkanFence&) = delete; VulkanFence operator=(const VulkanFence&) = delete; bool reset() noexcept; bool wait(uint64_t timeoutNs = UINT64_MAX) noexcept; /** @brief Signals the fence on the provided queue. * * This does not wait for completion of the signal, it merely * executes the vkQueueSubmit with the fence and no actual workload * so that the fence is signaled as soon as the queue workload executes * on the GPU. */ bool signal(VkQueue queue); [[nodiscard]] bool exportable() const noexcept; public: // NOLINTBEGIN(readability-identifier-naming) const VulkanFunctionTable* vf_{}; VkDevice device_ = VK_NULL_HANDLE; VkFence vkFence_ = VK_NULL_HANDLE; bool exportable_ = false; // NOLINTEND(readability-identifier-naming) }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanFramebuffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "VulkanFramebuffer.h" #include "VulkanContext.h" namespace igl::vulkan { VulkanFramebuffer::VulkanFramebuffer(const VulkanContext& ctx, VkDevice device, uint32_t width, uint32_t height, VkRenderPass renderPass, size_t numAttachments, const VkImageView* attachments, const char* debugName) : ctx(ctx), vkDevice(device) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); if (!IGL_DEBUG_VERIFY(renderPass != VK_NULL_HANDLE)) { return; } if (!IGL_DEBUG_VERIFY(attachments)) { return; } VK_ASSERT(ivkCreateFramebuffer( &ctx.vf_, vkDevice, width, height, renderPass, numAttachments, attachments, &vkFramebuffer)); VK_ASSERT(ivkSetDebugObjectName( &ctx.vf_, vkDevice, VK_OBJECT_TYPE_FRAMEBUFFER, (uint64_t)vkFramebuffer, debugName)); } VulkanFramebuffer::~VulkanFramebuffer() { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_DESTROY); ctx.deferredTask( std::packaged_task([vf = &ctx.vf_, device = vkDevice, framebuffer = vkFramebuffer]() { vf->vkDestroyFramebuffer(device, framebuffer, nullptr); })); } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanFramebuffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include namespace igl::vulkan { class VulkanContext; /// @brief A wrapper around a Vulkan Framebuffer object class VulkanFramebuffer final { public: /// @brief Constructs a VulkanFramebuffer object with the parameters provided and an optional /// debug name VulkanFramebuffer(const VulkanContext& ctx, VkDevice device, uint32_t width, uint32_t height, VkRenderPass renderPass, size_t numAttachments, const VkImageView* attachments, const char* debugName = nullptr); /// @brief Queues the destruction of the framebuffer on the Vulkan context via a deferred task. /// For more details about deferred tasks, please refer to the igl::vulkan::VulkanContext class ~VulkanFramebuffer(); VulkanFramebuffer(const VulkanFramebuffer&) = delete; VulkanFramebuffer& operator=(const VulkanFramebuffer&) = delete; VulkanFramebuffer(VulkanFramebuffer&&) = delete; VulkanFramebuffer& operator=(VulkanFramebuffer&&) = delete; [[nodiscard]] VkFramebuffer getVkFramebuffer() const { return vkFramebuffer; } public: const VulkanContext& ctx; VkDevice vkDevice = VK_NULL_HANDLE; VkFramebuffer vkFramebuffer = VK_NULL_HANDLE; }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanFunctionTable.c ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "VulkanFunctionTable.h" #ifdef __cplusplus extern "C" { #endif #if defined(FORCE_USE_STATIC_VULKAN_LOADER) && !defined(FORCE_USE_STATIC_VULKAN_LOADER_DISABLED) extern PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char* pName); #endif int loadVulkanLoaderFunctions(struct VulkanFunctionTable* table, PFN_vkGetInstanceProcAddr load) { /* IGL_GENERATE_LOAD_LOADER_TABLE */ #if defined(FORCE_USE_STATIC_VULKAN_LOADER) && !defined(FORCE_USE_STATIC_VULKAN_LOADER_DISABLED) if (table->vkGetInstanceProcAddr == NULL) { table->vkGetInstanceProcAddr = &vkGetInstanceProcAddr; load = table->vkGetInstanceProcAddr; } #endif if (!load) { return 0; } // VK_VERSION_1_0 table->vkCreateInstance = (PFN_vkCreateInstance)load(NULL, "vkCreateInstance"); table->vkEnumerateInstanceExtensionProperties = (PFN_vkEnumerateInstanceExtensionProperties)load( NULL, "vkEnumerateInstanceExtensionProperties"); table->vkEnumerateInstanceLayerProperties = (PFN_vkEnumerateInstanceLayerProperties)load(NULL, "vkEnumerateInstanceLayerProperties"); // VK_VERSION_1_1 table->vkEnumerateInstanceVersion = (PFN_vkEnumerateInstanceVersion)load(NULL, "vkEnumerateInstanceVersion"); /* IGL_GENERATE_LOAD_LOADER_TABLE */ return 1; } void loadVulkanInstanceFunctions(struct VulkanFunctionTable* table, VkInstance context, PFN_vkGetInstanceProcAddr load, VkBool32 enableExtDebugUtils) { /* IGL_GENERATE_LOAD_INSTANCE_TABLE */ // VK_VERSION_1_0 table->vkCreateDevice = (PFN_vkCreateDevice)load(context, "vkCreateDevice"); table->vkDestroyInstance = (PFN_vkDestroyInstance)load(context, "vkDestroyInstance"); table->vkEnumerateDeviceExtensionProperties = (PFN_vkEnumerateDeviceExtensionProperties)load( context, "vkEnumerateDeviceExtensionProperties"); table->vkEnumerateDeviceLayerProperties = (PFN_vkEnumerateDeviceLayerProperties)load(context, "vkEnumerateDeviceLayerProperties"); table->vkEnumeratePhysicalDevices = (PFN_vkEnumeratePhysicalDevices)load(context, "vkEnumeratePhysicalDevices"); table->vkGetDeviceProcAddr = (PFN_vkGetDeviceProcAddr)load(context, "vkGetDeviceProcAddr"); table->vkGetPhysicalDeviceFeatures = (PFN_vkGetPhysicalDeviceFeatures)load(context, "vkGetPhysicalDeviceFeatures"); table->vkGetPhysicalDeviceFormatProperties = (PFN_vkGetPhysicalDeviceFormatProperties)load(context, "vkGetPhysicalDeviceFormatProperties"); table->vkGetPhysicalDeviceImageFormatProperties = (PFN_vkGetPhysicalDeviceImageFormatProperties)load( context, "vkGetPhysicalDeviceImageFormatProperties"); table->vkGetPhysicalDeviceMemoryProperties = (PFN_vkGetPhysicalDeviceMemoryProperties)load(context, "vkGetPhysicalDeviceMemoryProperties"); table->vkGetPhysicalDeviceProperties = (PFN_vkGetPhysicalDeviceProperties)load(context, "vkGetPhysicalDeviceProperties"); table->vkGetPhysicalDeviceQueueFamilyProperties = (PFN_vkGetPhysicalDeviceQueueFamilyProperties)load( context, "vkGetPhysicalDeviceQueueFamilyProperties"); table->vkGetPhysicalDeviceSparseImageFormatProperties = (PFN_vkGetPhysicalDeviceSparseImageFormatProperties)load( context, "vkGetPhysicalDeviceSparseImageFormatProperties"); // VK_VERSION_1_1 table->vkEnumeratePhysicalDeviceGroups = (PFN_vkEnumeratePhysicalDeviceGroups)load(context, "vkEnumeratePhysicalDeviceGroups"); table->vkGetPhysicalDeviceExternalBufferProperties = (PFN_vkGetPhysicalDeviceExternalBufferProperties)load( context, "vkGetPhysicalDeviceExternalBufferProperties"); table->vkGetPhysicalDeviceExternalFenceProperties = (PFN_vkGetPhysicalDeviceExternalFenceProperties)load( context, "vkGetPhysicalDeviceExternalFenceProperties"); table->vkGetPhysicalDeviceExternalSemaphoreProperties = (PFN_vkGetPhysicalDeviceExternalSemaphoreProperties)load( context, "vkGetPhysicalDeviceExternalSemaphoreProperties"); table->vkGetPhysicalDeviceFeatures2 = (PFN_vkGetPhysicalDeviceFeatures2)load(context, "vkGetPhysicalDeviceFeatures2"); table->vkGetPhysicalDeviceFormatProperties2 = (PFN_vkGetPhysicalDeviceFormatProperties2)load( context, "vkGetPhysicalDeviceFormatProperties2"); table->vkGetPhysicalDeviceImageFormatProperties2 = (PFN_vkGetPhysicalDeviceImageFormatProperties2)load( context, "vkGetPhysicalDeviceImageFormatProperties2"); table->vkGetPhysicalDeviceMemoryProperties2 = (PFN_vkGetPhysicalDeviceMemoryProperties2)load( context, "vkGetPhysicalDeviceMemoryProperties2"); table->vkGetPhysicalDeviceProperties2 = (PFN_vkGetPhysicalDeviceProperties2)load(context, "vkGetPhysicalDeviceProperties2"); table->vkGetPhysicalDeviceQueueFamilyProperties2 = (PFN_vkGetPhysicalDeviceQueueFamilyProperties2)load( context, "vkGetPhysicalDeviceQueueFamilyProperties2"); table->vkGetPhysicalDeviceSparseImageFormatProperties2 = (PFN_vkGetPhysicalDeviceSparseImageFormatProperties2)load( context, "vkGetPhysicalDeviceSparseImageFormatProperties2"); #if defined(VK_VERSION_1_3) table->vkGetPhysicalDeviceToolProperties = (PFN_vkGetPhysicalDeviceToolProperties)load(context, "vkGetPhysicalDeviceToolProperties"); #endif /* defined(VK_VERSION_1_3) */ #if defined(VK_EXT_acquire_drm_display) table->vkAcquireDrmDisplayEXT = (PFN_vkAcquireDrmDisplayEXT)load(context, "vkAcquireDrmDisplayEXT"); table->vkGetDrmDisplayEXT = (PFN_vkGetDrmDisplayEXT)load(context, "vkGetDrmDisplayEXT"); #endif /* defined(VK_EXT_acquire_drm_display) */ #if defined(VK_EXT_acquire_xlib_display) table->vkAcquireXlibDisplayEXT = (PFN_vkAcquireXlibDisplayEXT)load(context, "vkAcquireXlibDisplayEXT"); table->vkGetRandROutputDisplayEXT = (PFN_vkGetRandROutputDisplayEXT)load(context, "vkGetRandROutputDisplayEXT"); #endif /* defined(VK_EXT_acquire_xlib_display) */ #if defined(VK_EXT_calibrated_timestamps) table->vkGetPhysicalDeviceCalibrateableTimeDomainsEXT = (PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT)load( context, "vkGetPhysicalDeviceCalibrateableTimeDomainsEXT"); #endif /* defined(VK_EXT_calibrated_timestamps) */ #if defined(VK_EXT_debug_report) table->vkCreateDebugReportCallbackEXT = (PFN_vkCreateDebugReportCallbackEXT)load(context, "vkCreateDebugReportCallbackEXT"); table->vkDebugReportMessageEXT = (PFN_vkDebugReportMessageEXT)load(context, "vkDebugReportMessageEXT"); table->vkDestroyDebugReportCallbackEXT = (PFN_vkDestroyDebugReportCallbackEXT)load(context, "vkDestroyDebugReportCallbackEXT"); #endif /* defined(VK_EXT_debug_report) */ #if defined(VK_EXT_debug_utils) if (enableExtDebugUtils) { table->vkCmdBeginDebugUtilsLabelEXT = (PFN_vkCmdBeginDebugUtilsLabelEXT)load(context, "vkCmdBeginDebugUtilsLabelEXT"); table->vkCmdEndDebugUtilsLabelEXT = (PFN_vkCmdEndDebugUtilsLabelEXT)load(context, "vkCmdEndDebugUtilsLabelEXT"); table->vkCmdInsertDebugUtilsLabelEXT = (PFN_vkCmdInsertDebugUtilsLabelEXT)load(context, "vkCmdInsertDebugUtilsLabelEXT"); table->vkCreateDebugUtilsMessengerEXT = (PFN_vkCreateDebugUtilsMessengerEXT)load(context, "vkCreateDebugUtilsMessengerEXT"); table->vkDestroyDebugUtilsMessengerEXT = (PFN_vkDestroyDebugUtilsMessengerEXT)load(context, "vkDestroyDebugUtilsMessengerEXT"); table->vkQueueBeginDebugUtilsLabelEXT = (PFN_vkQueueBeginDebugUtilsLabelEXT)load(context, "vkQueueBeginDebugUtilsLabelEXT"); table->vkQueueEndDebugUtilsLabelEXT = (PFN_vkQueueEndDebugUtilsLabelEXT)load(context, "vkQueueEndDebugUtilsLabelEXT"); table->vkQueueInsertDebugUtilsLabelEXT = (PFN_vkQueueInsertDebugUtilsLabelEXT)load(context, "vkQueueInsertDebugUtilsLabelEXT"); table->vkSetDebugUtilsObjectNameEXT = (PFN_vkSetDebugUtilsObjectNameEXT)load(context, "vkSetDebugUtilsObjectNameEXT"); table->vkSetDebugUtilsObjectTagEXT = (PFN_vkSetDebugUtilsObjectTagEXT)load(context, "vkSetDebugUtilsObjectTagEXT"); table->vkSubmitDebugUtilsMessageEXT = (PFN_vkSubmitDebugUtilsMessageEXT)load(context, "vkSubmitDebugUtilsMessageEXT"); } #endif /* defined(VK_EXT_debug_utils) */ #if defined(VK_EXT_direct_mode_display) table->vkReleaseDisplayEXT = (PFN_vkReleaseDisplayEXT)load(context, "vkReleaseDisplayEXT"); #endif /* defined(VK_EXT_direct_mode_display) */ #if defined(VK_EXT_directfb_surface) table->vkCreateDirectFBSurfaceEXT = (PFN_vkCreateDirectFBSurfaceEXT)load(context, "vkCreateDirectFBSurfaceEXT"); table->vkGetPhysicalDeviceDirectFBPresentationSupportEXT = (PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT)load( context, "vkGetPhysicalDeviceDirectFBPresentationSupportEXT"); #endif /* defined(VK_EXT_directfb_surface) */ #if defined(VK_EXT_display_surface_counter) table->vkGetPhysicalDeviceSurfaceCapabilities2EXT = (PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT)load( context, "vkGetPhysicalDeviceSurfaceCapabilities2EXT"); #endif /* defined(VK_EXT_display_surface_counter) */ #if defined(VK_EXT_full_screen_exclusive) table->vkGetPhysicalDeviceSurfacePresentModes2EXT = (PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT)load( context, "vkGetPhysicalDeviceSurfacePresentModes2EXT"); #endif /* defined(VK_EXT_full_screen_exclusive) */ #if defined(VK_EXT_headless_surface) table->vkCreateHeadlessSurfaceEXT = (PFN_vkCreateHeadlessSurfaceEXT)load(context, "vkCreateHeadlessSurfaceEXT"); #endif /* defined(VK_EXT_headless_surface) */ #if defined(VK_EXT_metal_surface) table->vkCreateMetalSurfaceEXT = (PFN_vkCreateMetalSurfaceEXT)load(context, "vkCreateMetalSurfaceEXT"); #endif /* defined(VK_EXT_metal_surface) */ #if defined(VK_EXT_sample_locations) table->vkGetPhysicalDeviceMultisamplePropertiesEXT = (PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT)load( context, "vkGetPhysicalDeviceMultisamplePropertiesEXT"); #endif /* defined(VK_EXT_sample_locations) */ #if defined(VK_EXT_tooling_info) table->vkGetPhysicalDeviceToolPropertiesEXT = (PFN_vkGetPhysicalDeviceToolPropertiesEXT)load( context, "vkGetPhysicalDeviceToolPropertiesEXT"); #endif /* defined(VK_EXT_tooling_info) */ #if defined(VK_FUCHSIA_imagepipe_surface) table->vkCreateImagePipeSurfaceFUCHSIA = (PFN_vkCreateImagePipeSurfaceFUCHSIA)load(context, "vkCreateImagePipeSurfaceFUCHSIA"); #endif /* defined(VK_FUCHSIA_imagepipe_surface) */ #if defined(VK_GGP_stream_descriptor_surface) table->vkCreateStreamDescriptorSurfaceGGP = (PFN_vkCreateStreamDescriptorSurfaceGGP)load(context, "vkCreateStreamDescriptorSurfaceGGP"); #endif /* defined(VK_GGP_stream_descriptor_surface) */ #if defined(VK_KHR_android_surface) table->vkCreateAndroidSurfaceKHR = (PFN_vkCreateAndroidSurfaceKHR)load(context, "vkCreateAndroidSurfaceKHR"); #endif /* defined(VK_KHR_android_surface) */ #if defined(VK_KHR_device_group_creation) table->vkEnumeratePhysicalDeviceGroupsKHR = (PFN_vkEnumeratePhysicalDeviceGroupsKHR)load(context, "vkEnumeratePhysicalDeviceGroupsKHR"); #endif /* defined(VK_KHR_device_group_creation) */ #if defined(VK_KHR_display) table->vkCreateDisplayModeKHR = (PFN_vkCreateDisplayModeKHR)load(context, "vkCreateDisplayModeKHR"); table->vkCreateDisplayPlaneSurfaceKHR = (PFN_vkCreateDisplayPlaneSurfaceKHR)load(context, "vkCreateDisplayPlaneSurfaceKHR"); table->vkGetDisplayModePropertiesKHR = (PFN_vkGetDisplayModePropertiesKHR)load(context, "vkGetDisplayModePropertiesKHR"); table->vkGetDisplayPlaneCapabilitiesKHR = (PFN_vkGetDisplayPlaneCapabilitiesKHR)load(context, "vkGetDisplayPlaneCapabilitiesKHR"); table->vkGetDisplayPlaneSupportedDisplaysKHR = (PFN_vkGetDisplayPlaneSupportedDisplaysKHR)load( context, "vkGetDisplayPlaneSupportedDisplaysKHR"); table->vkGetPhysicalDeviceDisplayPlanePropertiesKHR = (PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR)load( context, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR"); table->vkGetPhysicalDeviceDisplayPropertiesKHR = (PFN_vkGetPhysicalDeviceDisplayPropertiesKHR)load(context, "vkGetPhysicalDeviceDisplayPropertiesKHR"); #endif /* defined(VK_KHR_display) */ #if defined(VK_KHR_external_fence_capabilities) table->vkGetPhysicalDeviceExternalFencePropertiesKHR = (PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR)load( context, "vkGetPhysicalDeviceExternalFencePropertiesKHR"); #endif /* defined(VK_KHR_external_fence_capabilities) */ #if defined(VK_KHR_external_memory_capabilities) table->vkGetPhysicalDeviceExternalBufferPropertiesKHR = (PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR)load( context, "vkGetPhysicalDeviceExternalBufferPropertiesKHR"); #endif /* defined(VK_KHR_external_memory_capabilities) */ #if defined(VK_KHR_external_semaphore_capabilities) table->vkGetPhysicalDeviceExternalSemaphorePropertiesKHR = (PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR)load( context, "vkGetPhysicalDeviceExternalSemaphorePropertiesKHR"); #endif /* defined(VK_KHR_external_semaphore_capabilities) */ #if defined(VK_KHR_fragment_shading_rate) table->vkGetPhysicalDeviceFragmentShadingRatesKHR = (PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR)load( context, "vkGetPhysicalDeviceFragmentShadingRatesKHR"); #endif /* defined(VK_KHR_fragment_shading_rate) */ #if defined(VK_KHR_get_display_properties2) table->vkGetDisplayModeProperties2KHR = (PFN_vkGetDisplayModeProperties2KHR)load(context, "vkGetDisplayModeProperties2KHR"); table->vkGetDisplayPlaneCapabilities2KHR = (PFN_vkGetDisplayPlaneCapabilities2KHR)load(context, "vkGetDisplayPlaneCapabilities2KHR"); table->vkGetPhysicalDeviceDisplayPlaneProperties2KHR = (PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR)load( context, "vkGetPhysicalDeviceDisplayPlaneProperties2KHR"); table->vkGetPhysicalDeviceDisplayProperties2KHR = (PFN_vkGetPhysicalDeviceDisplayProperties2KHR)load( context, "vkGetPhysicalDeviceDisplayProperties2KHR"); #endif /* defined(VK_KHR_get_display_properties2) */ #if defined(VK_KHR_get_physical_device_properties2) table->vkGetPhysicalDeviceFeatures2KHR = (PFN_vkGetPhysicalDeviceFeatures2KHR)load(context, "vkGetPhysicalDeviceFeatures2KHR"); table->vkGetPhysicalDeviceFormatProperties2KHR = (PFN_vkGetPhysicalDeviceFormatProperties2KHR)load(context, "vkGetPhysicalDeviceFormatProperties2KHR"); table->vkGetPhysicalDeviceImageFormatProperties2KHR = (PFN_vkGetPhysicalDeviceImageFormatProperties2KHR)load( context, "vkGetPhysicalDeviceImageFormatProperties2KHR"); table->vkGetPhysicalDeviceMemoryProperties2KHR = (PFN_vkGetPhysicalDeviceMemoryProperties2KHR)load(context, "vkGetPhysicalDeviceMemoryProperties2KHR"); table->vkGetPhysicalDeviceProperties2KHR = (PFN_vkGetPhysicalDeviceProperties2KHR)load(context, "vkGetPhysicalDeviceProperties2KHR"); table->vkGetPhysicalDeviceQueueFamilyProperties2KHR = (PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR)load( context, "vkGetPhysicalDeviceQueueFamilyProperties2KHR"); table->vkGetPhysicalDeviceSparseImageFormatProperties2KHR = (PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR)load( context, "vkGetPhysicalDeviceSparseImageFormatProperties2KHR"); #endif /* defined(VK_KHR_get_physical_device_properties2) */ #if defined(VK_KHR_get_surface_capabilities2) table->vkGetPhysicalDeviceSurfaceCapabilities2KHR = (PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR)load( context, "vkGetPhysicalDeviceSurfaceCapabilities2KHR"); table->vkGetPhysicalDeviceSurfaceFormats2KHR = (PFN_vkGetPhysicalDeviceSurfaceFormats2KHR)load( context, "vkGetPhysicalDeviceSurfaceFormats2KHR"); #endif /* defined(VK_KHR_get_surface_capabilities2) */ #if defined(VK_KHR_performance_query) table->vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR = (PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR)load( context, "vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR"); table->vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR = (PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR)load( context, "vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR"); #endif /* defined(VK_KHR_performance_query) */ #if defined(VK_KHR_surface) table->vkDestroySurfaceKHR = (PFN_vkDestroySurfaceKHR)load(context, "vkDestroySurfaceKHR"); table->vkGetPhysicalDeviceSurfaceCapabilitiesKHR = (PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)load( context, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR"); table->vkGetPhysicalDeviceSurfaceFormatsKHR = (PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)load( context, "vkGetPhysicalDeviceSurfaceFormatsKHR"); table->vkGetPhysicalDeviceSurfacePresentModesKHR = (PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)load( context, "vkGetPhysicalDeviceSurfacePresentModesKHR"); table->vkGetPhysicalDeviceSurfaceSupportKHR = (PFN_vkGetPhysicalDeviceSurfaceSupportKHR)load( context, "vkGetPhysicalDeviceSurfaceSupportKHR"); #endif /* defined(VK_KHR_surface) */ #if defined(VK_KHR_video_queue) table->vkGetPhysicalDeviceVideoCapabilitiesKHR = (PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR)load(context, "vkGetPhysicalDeviceVideoCapabilitiesKHR"); table->vkGetPhysicalDeviceVideoFormatPropertiesKHR = (PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR)load( context, "vkGetPhysicalDeviceVideoFormatPropertiesKHR"); #endif /* defined(VK_KHR_video_queue) */ #if defined(VK_KHR_wayland_surface) table->vkCreateWaylandSurfaceKHR = (PFN_vkCreateWaylandSurfaceKHR)load(context, "vkCreateWaylandSurfaceKHR"); table->vkGetPhysicalDeviceWaylandPresentationSupportKHR = (PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)load( context, "vkGetPhysicalDeviceWaylandPresentationSupportKHR"); #endif /* defined(VK_KHR_wayland_surface) */ #if defined(VK_KHR_win32_surface) table->vkCreateWin32SurfaceKHR = (PFN_vkCreateWin32SurfaceKHR)load(context, "vkCreateWin32SurfaceKHR"); table->vkGetPhysicalDeviceWin32PresentationSupportKHR = (PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)load( context, "vkGetPhysicalDeviceWin32PresentationSupportKHR"); #endif /* defined(VK_KHR_win32_surface) */ #if defined(VK_KHR_xcb_surface) table->vkCreateXcbSurfaceKHR = (PFN_vkCreateXcbSurfaceKHR)load(context, "vkCreateXcbSurfaceKHR"); table->vkGetPhysicalDeviceXcbPresentationSupportKHR = (PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)load( context, "vkGetPhysicalDeviceXcbPresentationSupportKHR"); #endif /* defined(VK_KHR_xcb_surface) */ #if defined(VK_KHR_xlib_surface) table->vkCreateXlibSurfaceKHR = (PFN_vkCreateXlibSurfaceKHR)load(context, "vkCreateXlibSurfaceKHR"); table->vkGetPhysicalDeviceXlibPresentationSupportKHR = (PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)load( context, "vkGetPhysicalDeviceXlibPresentationSupportKHR"); #endif /* defined(VK_KHR_xlib_surface) */ #if defined(VK_MVK_ios_surface) table->vkCreateIOSSurfaceMVK = (PFN_vkCreateIOSSurfaceMVK)load(context, "vkCreateIOSSurfaceMVK"); #endif /* defined(VK_MVK_ios_surface) */ #if defined(VK_MVK_macos_surface) table->vkCreateMacOSSurfaceMVK = (PFN_vkCreateMacOSSurfaceMVK)load(context, "vkCreateMacOSSurfaceMVK"); #endif /* defined(VK_MVK_macos_surface) */ #if defined(VK_NN_vi_surface) table->vkCreateViSurfaceNN = (PFN_vkCreateViSurfaceNN)load(context, "vkCreateViSurfaceNN"); #endif /* defined(VK_NN_vi_surface) */ #if defined(VK_NV_acquire_winrt_display) table->vkAcquireWinrtDisplayNV = (PFN_vkAcquireWinrtDisplayNV)load(context, "vkAcquireWinrtDisplayNV"); table->vkGetWinrtDisplayNV = (PFN_vkGetWinrtDisplayNV)load(context, "vkGetWinrtDisplayNV"); #endif /* defined(VK_NV_acquire_winrt_display) */ #if defined(VK_NV_cooperative_matrix) table->vkGetPhysicalDeviceCooperativeMatrixPropertiesNV = (PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV)load( context, "vkGetPhysicalDeviceCooperativeMatrixPropertiesNV"); #endif /* defined(VK_NV_cooperative_matrix) */ #if defined(VK_NV_coverage_reduction_mode) table->vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV = (PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV)load( context, "vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV"); #endif /* defined(VK_NV_coverage_reduction_mode) */ #if defined(VK_NV_external_memory_capabilities) table->vkGetPhysicalDeviceExternalImageFormatPropertiesNV = (PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV)load( context, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV"); #endif /* defined(VK_NV_external_memory_capabilities) */ #if defined(VK_QNX_screen_surface) table->vkCreateScreenSurfaceQNX = (PFN_vkCreateScreenSurfaceQNX)load(context, "vkCreateScreenSurfaceQNX"); table->vkGetPhysicalDeviceScreenPresentationSupportQNX = (PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX)load( context, "vkGetPhysicalDeviceScreenPresentationSupportQNX"); #endif /* defined(VK_QNX_screen_surface) */ #if (defined(VK_KHR_device_group) && defined(VK_KHR_surface)) || \ (defined(VK_KHR_swapchain) && defined(VK_VERSION_1_1)) table->vkGetPhysicalDevicePresentRectanglesKHR = (PFN_vkGetPhysicalDevicePresentRectanglesKHR)load(context, "vkGetPhysicalDevicePresentRectanglesKHR"); #endif /* (defined(VK_KHR_device_group) && defined(VK_KHR_surface)) || (defined(VK_KHR_swapchain) \ && defined(VK_VERSION_1_1)) */ /* IGL_GENERATE_LOAD_INSTANCE_TABLE */ } void loadVulkanDeviceFunctions(struct VulkanFunctionTable* table, VkDevice context, PFN_vkGetDeviceProcAddr load) { /* IGL_GENERATE_LOAD_DEVICE_TABLE */ // VK_VERSION_1_0 table->vkAllocateCommandBuffers = (PFN_vkAllocateCommandBuffers)load(context, "vkAllocateCommandBuffers"); table->vkAllocateDescriptorSets = (PFN_vkAllocateDescriptorSets)load(context, "vkAllocateDescriptorSets"); table->vkAllocateMemory = (PFN_vkAllocateMemory)load(context, "vkAllocateMemory"); table->vkBeginCommandBuffer = (PFN_vkBeginCommandBuffer)load(context, "vkBeginCommandBuffer"); table->vkBindBufferMemory = (PFN_vkBindBufferMemory)load(context, "vkBindBufferMemory"); table->vkBindImageMemory = (PFN_vkBindImageMemory)load(context, "vkBindImageMemory"); table->vkCmdBeginQuery = (PFN_vkCmdBeginQuery)load(context, "vkCmdBeginQuery"); table->vkCmdBeginRenderPass = (PFN_vkCmdBeginRenderPass)load(context, "vkCmdBeginRenderPass"); table->vkCmdBindDescriptorSets = (PFN_vkCmdBindDescriptorSets)load(context, "vkCmdBindDescriptorSets"); table->vkCmdBindIndexBuffer = (PFN_vkCmdBindIndexBuffer)load(context, "vkCmdBindIndexBuffer"); table->vkCmdBindPipeline = (PFN_vkCmdBindPipeline)load(context, "vkCmdBindPipeline"); table->vkCmdBindVertexBuffers = (PFN_vkCmdBindVertexBuffers)load(context, "vkCmdBindVertexBuffers"); table->vkCmdBlitImage = (PFN_vkCmdBlitImage)load(context, "vkCmdBlitImage"); table->vkCmdClearAttachments = (PFN_vkCmdClearAttachments)load(context, "vkCmdClearAttachments"); table->vkCmdClearColorImage = (PFN_vkCmdClearColorImage)load(context, "vkCmdClearColorImage"); table->vkCmdClearDepthStencilImage = (PFN_vkCmdClearDepthStencilImage)load(context, "vkCmdClearDepthStencilImage"); table->vkCmdCopyBuffer = (PFN_vkCmdCopyBuffer)load(context, "vkCmdCopyBuffer"); table->vkCmdCopyBufferToImage = (PFN_vkCmdCopyBufferToImage)load(context, "vkCmdCopyBufferToImage"); table->vkCmdCopyImage = (PFN_vkCmdCopyImage)load(context, "vkCmdCopyImage"); table->vkCmdCopyImageToBuffer = (PFN_vkCmdCopyImageToBuffer)load(context, "vkCmdCopyImageToBuffer"); table->vkCmdCopyQueryPoolResults = (PFN_vkCmdCopyQueryPoolResults)load(context, "vkCmdCopyQueryPoolResults"); table->vkCmdDispatch = (PFN_vkCmdDispatch)load(context, "vkCmdDispatch"); table->vkCmdDispatchIndirect = (PFN_vkCmdDispatchIndirect)load(context, "vkCmdDispatchIndirect"); table->vkCmdDraw = (PFN_vkCmdDraw)load(context, "vkCmdDraw"); table->vkCmdDrawIndexed = (PFN_vkCmdDrawIndexed)load(context, "vkCmdDrawIndexed"); table->vkCmdDrawIndexedIndirect = (PFN_vkCmdDrawIndexedIndirect)load(context, "vkCmdDrawIndexedIndirect"); table->vkCmdDrawIndirect = (PFN_vkCmdDrawIndirect)load(context, "vkCmdDrawIndirect"); table->vkCmdDrawMeshTasksEXT = (PFN_vkCmdDrawMeshTasksEXT)load(context, "vkCmdDrawMeshTasksEXT"); table->vkCmdEndQuery = (PFN_vkCmdEndQuery)load(context, "vkCmdEndQuery"); table->vkCmdEndRenderPass = (PFN_vkCmdEndRenderPass)load(context, "vkCmdEndRenderPass"); table->vkCmdExecuteCommands = (PFN_vkCmdExecuteCommands)load(context, "vkCmdExecuteCommands"); table->vkCmdFillBuffer = (PFN_vkCmdFillBuffer)load(context, "vkCmdFillBuffer"); table->vkCmdNextSubpass = (PFN_vkCmdNextSubpass)load(context, "vkCmdNextSubpass"); table->vkCmdPipelineBarrier = (PFN_vkCmdPipelineBarrier)load(context, "vkCmdPipelineBarrier"); table->vkCmdPushConstants = (PFN_vkCmdPushConstants)load(context, "vkCmdPushConstants"); table->vkCmdResetEvent = (PFN_vkCmdResetEvent)load(context, "vkCmdResetEvent"); table->vkCmdResetQueryPool = (PFN_vkCmdResetQueryPool)load(context, "vkCmdResetQueryPool"); table->vkCmdResolveImage = (PFN_vkCmdResolveImage)load(context, "vkCmdResolveImage"); table->vkCmdSetBlendConstants = (PFN_vkCmdSetBlendConstants)load(context, "vkCmdSetBlendConstants"); table->vkCmdSetDepthBias = (PFN_vkCmdSetDepthBias)load(context, "vkCmdSetDepthBias"); table->vkCmdSetDepthBounds = (PFN_vkCmdSetDepthBounds)load(context, "vkCmdSetDepthBounds"); table->vkCmdSetEvent = (PFN_vkCmdSetEvent)load(context, "vkCmdSetEvent"); table->vkCmdSetLineWidth = (PFN_vkCmdSetLineWidth)load(context, "vkCmdSetLineWidth"); table->vkCmdSetScissor = (PFN_vkCmdSetScissor)load(context, "vkCmdSetScissor"); table->vkCmdSetStencilCompareMask = (PFN_vkCmdSetStencilCompareMask)load(context, "vkCmdSetStencilCompareMask"); table->vkCmdSetStencilReference = (PFN_vkCmdSetStencilReference)load(context, "vkCmdSetStencilReference"); table->vkCmdSetStencilWriteMask = (PFN_vkCmdSetStencilWriteMask)load(context, "vkCmdSetStencilWriteMask"); table->vkCmdSetViewport = (PFN_vkCmdSetViewport)load(context, "vkCmdSetViewport"); table->vkCmdUpdateBuffer = (PFN_vkCmdUpdateBuffer)load(context, "vkCmdUpdateBuffer"); table->vkCmdWaitEvents = (PFN_vkCmdWaitEvents)load(context, "vkCmdWaitEvents"); table->vkCmdWriteTimestamp = (PFN_vkCmdWriteTimestamp)load(context, "vkCmdWriteTimestamp"); table->vkCreateBuffer = (PFN_vkCreateBuffer)load(context, "vkCreateBuffer"); table->vkCreateBufferView = (PFN_vkCreateBufferView)load(context, "vkCreateBufferView"); table->vkCreateCommandPool = (PFN_vkCreateCommandPool)load(context, "vkCreateCommandPool"); table->vkCreateComputePipelines = (PFN_vkCreateComputePipelines)load(context, "vkCreateComputePipelines"); table->vkCreateDescriptorPool = (PFN_vkCreateDescriptorPool)load(context, "vkCreateDescriptorPool"); table->vkCreateDescriptorSetLayout = (PFN_vkCreateDescriptorSetLayout)load(context, "vkCreateDescriptorSetLayout"); table->vkCreateEvent = (PFN_vkCreateEvent)load(context, "vkCreateEvent"); table->vkCreateFence = (PFN_vkCreateFence)load(context, "vkCreateFence"); table->vkCreateFramebuffer = (PFN_vkCreateFramebuffer)load(context, "vkCreateFramebuffer"); table->vkCreateGraphicsPipelines = (PFN_vkCreateGraphicsPipelines)load(context, "vkCreateGraphicsPipelines"); table->vkCreateImage = (PFN_vkCreateImage)load(context, "vkCreateImage"); table->vkCreateImageView = (PFN_vkCreateImageView)load(context, "vkCreateImageView"); table->vkCreatePipelineCache = (PFN_vkCreatePipelineCache)load(context, "vkCreatePipelineCache"); table->vkCreatePipelineLayout = (PFN_vkCreatePipelineLayout)load(context, "vkCreatePipelineLayout"); table->vkCreateQueryPool = (PFN_vkCreateQueryPool)load(context, "vkCreateQueryPool"); table->vkCreateRenderPass = (PFN_vkCreateRenderPass)load(context, "vkCreateRenderPass"); table->vkCreateSampler = (PFN_vkCreateSampler)load(context, "vkCreateSampler"); table->vkCreateSemaphore = (PFN_vkCreateSemaphore)load(context, "vkCreateSemaphore"); table->vkCreateShaderModule = (PFN_vkCreateShaderModule)load(context, "vkCreateShaderModule"); table->vkDestroyBuffer = (PFN_vkDestroyBuffer)load(context, "vkDestroyBuffer"); table->vkDestroyBufferView = (PFN_vkDestroyBufferView)load(context, "vkDestroyBufferView"); table->vkDestroyCommandPool = (PFN_vkDestroyCommandPool)load(context, "vkDestroyCommandPool"); table->vkDestroyDescriptorPool = (PFN_vkDestroyDescriptorPool)load(context, "vkDestroyDescriptorPool"); table->vkDestroyDescriptorSetLayout = (PFN_vkDestroyDescriptorSetLayout)load(context, "vkDestroyDescriptorSetLayout"); table->vkDestroyDevice = (PFN_vkDestroyDevice)load(context, "vkDestroyDevice"); table->vkDestroyEvent = (PFN_vkDestroyEvent)load(context, "vkDestroyEvent"); table->vkDestroyFence = (PFN_vkDestroyFence)load(context, "vkDestroyFence"); table->vkDestroyFramebuffer = (PFN_vkDestroyFramebuffer)load(context, "vkDestroyFramebuffer"); table->vkDestroyImage = (PFN_vkDestroyImage)load(context, "vkDestroyImage"); table->vkDestroyImageView = (PFN_vkDestroyImageView)load(context, "vkDestroyImageView"); table->vkDestroyPipeline = (PFN_vkDestroyPipeline)load(context, "vkDestroyPipeline"); table->vkDestroyPipelineCache = (PFN_vkDestroyPipelineCache)load(context, "vkDestroyPipelineCache"); table->vkDestroyPipelineLayout = (PFN_vkDestroyPipelineLayout)load(context, "vkDestroyPipelineLayout"); table->vkDestroyQueryPool = (PFN_vkDestroyQueryPool)load(context, "vkDestroyQueryPool"); table->vkDestroyRenderPass = (PFN_vkDestroyRenderPass)load(context, "vkDestroyRenderPass"); table->vkDestroySampler = (PFN_vkDestroySampler)load(context, "vkDestroySampler"); table->vkDestroySemaphore = (PFN_vkDestroySemaphore)load(context, "vkDestroySemaphore"); table->vkDestroyShaderModule = (PFN_vkDestroyShaderModule)load(context, "vkDestroyShaderModule"); table->vkDeviceWaitIdle = (PFN_vkDeviceWaitIdle)load(context, "vkDeviceWaitIdle"); table->vkEndCommandBuffer = (PFN_vkEndCommandBuffer)load(context, "vkEndCommandBuffer"); table->vkFlushMappedMemoryRanges = (PFN_vkFlushMappedMemoryRanges)load(context, "vkFlushMappedMemoryRanges"); table->vkFreeCommandBuffers = (PFN_vkFreeCommandBuffers)load(context, "vkFreeCommandBuffers"); table->vkFreeDescriptorSets = (PFN_vkFreeDescriptorSets)load(context, "vkFreeDescriptorSets"); table->vkFreeMemory = (PFN_vkFreeMemory)load(context, "vkFreeMemory"); table->vkGetBufferMemoryRequirements = (PFN_vkGetBufferMemoryRequirements)load(context, "vkGetBufferMemoryRequirements"); table->vkGetDeviceMemoryCommitment = (PFN_vkGetDeviceMemoryCommitment)load(context, "vkGetDeviceMemoryCommitment"); table->vkGetDeviceQueue = (PFN_vkGetDeviceQueue)load(context, "vkGetDeviceQueue"); table->vkGetEventStatus = (PFN_vkGetEventStatus)load(context, "vkGetEventStatus"); table->vkGetFenceStatus = (PFN_vkGetFenceStatus)load(context, "vkGetFenceStatus"); table->vkGetImageMemoryRequirements = (PFN_vkGetImageMemoryRequirements)load(context, "vkGetImageMemoryRequirements"); table->vkGetImageSparseMemoryRequirements = (PFN_vkGetImageSparseMemoryRequirements)load(context, "vkGetImageSparseMemoryRequirements"); table->vkGetImageSubresourceLayout = (PFN_vkGetImageSubresourceLayout)load(context, "vkGetImageSubresourceLayout"); table->vkGetPipelineCacheData = (PFN_vkGetPipelineCacheData)load(context, "vkGetPipelineCacheData"); table->vkGetQueryPoolResults = (PFN_vkGetQueryPoolResults)load(context, "vkGetQueryPoolResults"); table->vkGetRenderAreaGranularity = (PFN_vkGetRenderAreaGranularity)load(context, "vkGetRenderAreaGranularity"); table->vkInvalidateMappedMemoryRanges = (PFN_vkInvalidateMappedMemoryRanges)load(context, "vkInvalidateMappedMemoryRanges"); table->vkMapMemory = (PFN_vkMapMemory)load(context, "vkMapMemory"); table->vkMergePipelineCaches = (PFN_vkMergePipelineCaches)load(context, "vkMergePipelineCaches"); table->vkQueueBindSparse = (PFN_vkQueueBindSparse)load(context, "vkQueueBindSparse"); table->vkQueueSubmit = (PFN_vkQueueSubmit)load(context, "vkQueueSubmit"); table->vkQueueWaitIdle = (PFN_vkQueueWaitIdle)load(context, "vkQueueWaitIdle"); table->vkResetCommandBuffer = (PFN_vkResetCommandBuffer)load(context, "vkResetCommandBuffer"); table->vkResetCommandPool = (PFN_vkResetCommandPool)load(context, "vkResetCommandPool"); table->vkResetDescriptorPool = (PFN_vkResetDescriptorPool)load(context, "vkResetDescriptorPool"); table->vkResetEvent = (PFN_vkResetEvent)load(context, "vkResetEvent"); table->vkResetFences = (PFN_vkResetFences)load(context, "vkResetFences"); table->vkSetEvent = (PFN_vkSetEvent)load(context, "vkSetEvent"); table->vkUnmapMemory = (PFN_vkUnmapMemory)load(context, "vkUnmapMemory"); table->vkUpdateDescriptorSets = (PFN_vkUpdateDescriptorSets)load(context, "vkUpdateDescriptorSets"); table->vkWaitForFences = (PFN_vkWaitForFences)load(context, "vkWaitForFences"); // VK_VERSION_1_1 table->vkBindBufferMemory2 = (PFN_vkBindBufferMemory2)load(context, "vkBindBufferMemory2"); table->vkBindImageMemory2 = (PFN_vkBindImageMemory2)load(context, "vkBindImageMemory2"); table->vkCmdDispatchBase = (PFN_vkCmdDispatchBase)load(context, "vkCmdDispatchBase"); table->vkCmdSetDeviceMask = (PFN_vkCmdSetDeviceMask)load(context, "vkCmdSetDeviceMask"); table->vkCreateDescriptorUpdateTemplate = (PFN_vkCreateDescriptorUpdateTemplate)load(context, "vkCreateDescriptorUpdateTemplate"); table->vkCreateSamplerYcbcrConversion = (PFN_vkCreateSamplerYcbcrConversion)load(context, "vkCreateSamplerYcbcrConversion"); table->vkDestroyDescriptorUpdateTemplate = (PFN_vkDestroyDescriptorUpdateTemplate)load(context, "vkDestroyDescriptorUpdateTemplate"); table->vkDestroySamplerYcbcrConversion = (PFN_vkDestroySamplerYcbcrConversion)load(context, "vkDestroySamplerYcbcrConversion"); table->vkGetBufferMemoryRequirements2 = (PFN_vkGetBufferMemoryRequirements2)load(context, "vkGetBufferMemoryRequirements2"); table->vkGetDescriptorSetLayoutSupport = (PFN_vkGetDescriptorSetLayoutSupport)load(context, "vkGetDescriptorSetLayoutSupport"); table->vkGetDeviceGroupPeerMemoryFeatures = (PFN_vkGetDeviceGroupPeerMemoryFeatures)load(context, "vkGetDeviceGroupPeerMemoryFeatures"); table->vkGetDeviceQueue2 = (PFN_vkGetDeviceQueue2)load(context, "vkGetDeviceQueue2"); table->vkGetImageMemoryRequirements2 = (PFN_vkGetImageMemoryRequirements2)load(context, "vkGetImageMemoryRequirements2"); table->vkGetImageSparseMemoryRequirements2 = (PFN_vkGetImageSparseMemoryRequirements2)load(context, "vkGetImageSparseMemoryRequirements2"); table->vkTrimCommandPool = (PFN_vkTrimCommandPool)load(context, "vkTrimCommandPool"); table->vkUpdateDescriptorSetWithTemplate = (PFN_vkUpdateDescriptorSetWithTemplate)load(context, "vkUpdateDescriptorSetWithTemplate"); // VK_VERSION_1_2 table->vkCmdBeginRenderPass2 = (PFN_vkCmdBeginRenderPass2)load(context, "vkCmdBeginRenderPass2"); table->vkCmdDrawIndexedIndirectCount = (PFN_vkCmdDrawIndexedIndirectCount)load(context, "vkCmdDrawIndexedIndirectCount"); table->vkCmdDrawIndirectCount = (PFN_vkCmdDrawIndirectCount)load(context, "vkCmdDrawIndirectCount"); table->vkCmdEndRenderPass2 = (PFN_vkCmdEndRenderPass2)load(context, "vkCmdEndRenderPass2"); table->vkCmdNextSubpass2 = (PFN_vkCmdNextSubpass2)load(context, "vkCmdNextSubpass2"); table->vkCreateRenderPass2 = (PFN_vkCreateRenderPass2)load(context, "vkCreateRenderPass2"); table->vkGetBufferDeviceAddress = (PFN_vkGetBufferDeviceAddress)load(context, "vkGetBufferDeviceAddress"); table->vkGetBufferOpaqueCaptureAddress = (PFN_vkGetBufferOpaqueCaptureAddress)load(context, "vkGetBufferOpaqueCaptureAddress"); table->vkGetDeviceMemoryOpaqueCaptureAddress = (PFN_vkGetDeviceMemoryOpaqueCaptureAddress)load( context, "vkGetDeviceMemoryOpaqueCaptureAddress"); table->vkGetSemaphoreCounterValue = (PFN_vkGetSemaphoreCounterValue)load(context, "vkGetSemaphoreCounterValue"); table->vkResetQueryPool = (PFN_vkResetQueryPool)load(context, "vkResetQueryPool"); table->vkSignalSemaphore = (PFN_vkSignalSemaphore)load(context, "vkSignalSemaphore"); table->vkWaitSemaphores = (PFN_vkWaitSemaphores)load(context, "vkWaitSemaphores"); #if defined(VK_VERSION_1_3) table->vkCmdBeginRendering = (PFN_vkCmdBeginRendering)load(context, "vkCmdBeginRendering"); table->vkCmdBindVertexBuffers2 = (PFN_vkCmdBindVertexBuffers2)load(context, "vkCmdBindVertexBuffers2"); table->vkCmdBlitImage2 = (PFN_vkCmdBlitImage2)load(context, "vkCmdBlitImage2"); table->vkCmdCopyBuffer2 = (PFN_vkCmdCopyBuffer2)load(context, "vkCmdCopyBuffer2"); table->vkCmdCopyBufferToImage2 = (PFN_vkCmdCopyBufferToImage2)load(context, "vkCmdCopyBufferToImage2"); table->vkCmdCopyImage2 = (PFN_vkCmdCopyImage2)load(context, "vkCmdCopyImage2"); table->vkCmdCopyImageToBuffer2 = (PFN_vkCmdCopyImageToBuffer2)load(context, "vkCmdCopyImageToBuffer2"); table->vkCmdEndRendering = (PFN_vkCmdEndRendering)load(context, "vkCmdEndRendering"); table->vkCmdPipelineBarrier2 = (PFN_vkCmdPipelineBarrier2)load(context, "vkCmdPipelineBarrier2"); table->vkCmdResetEvent2 = (PFN_vkCmdResetEvent2)load(context, "vkCmdResetEvent2"); table->vkCmdResolveImage2 = (PFN_vkCmdResolveImage2)load(context, "vkCmdResolveImage2"); table->vkCmdSetCullMode = (PFN_vkCmdSetCullMode)load(context, "vkCmdSetCullMode"); table->vkCmdSetDepthBiasEnable = (PFN_vkCmdSetDepthBiasEnable)load(context, "vkCmdSetDepthBiasEnable"); table->vkCmdSetDepthBoundsTestEnable = (PFN_vkCmdSetDepthBoundsTestEnable)load(context, "vkCmdSetDepthBoundsTestEnable"); table->vkCmdSetDepthCompareOp = (PFN_vkCmdSetDepthCompareOp)load(context, "vkCmdSetDepthCompareOp"); table->vkCmdSetDepthTestEnable = (PFN_vkCmdSetDepthTestEnable)load(context, "vkCmdSetDepthTestEnable"); table->vkCmdSetDepthWriteEnable = (PFN_vkCmdSetDepthWriteEnable)load(context, "vkCmdSetDepthWriteEnable"); table->vkCmdSetEvent2 = (PFN_vkCmdSetEvent2)load(context, "vkCmdSetEvent2"); table->vkCmdSetFrontFace = (PFN_vkCmdSetFrontFace)load(context, "vkCmdSetFrontFace"); table->vkCmdSetPrimitiveRestartEnable = (PFN_vkCmdSetPrimitiveRestartEnable)load(context, "vkCmdSetPrimitiveRestartEnable"); table->vkCmdSetPrimitiveTopology = (PFN_vkCmdSetPrimitiveTopology)load(context, "vkCmdSetPrimitiveTopology"); table->vkCmdSetRasterizerDiscardEnable = (PFN_vkCmdSetRasterizerDiscardEnable)load(context, "vkCmdSetRasterizerDiscardEnable"); table->vkCmdSetScissorWithCount = (PFN_vkCmdSetScissorWithCount)load(context, "vkCmdSetScissorWithCount"); table->vkCmdSetStencilOp = (PFN_vkCmdSetStencilOp)load(context, "vkCmdSetStencilOp"); table->vkCmdSetStencilTestEnable = (PFN_vkCmdSetStencilTestEnable)load(context, "vkCmdSetStencilTestEnable"); table->vkCmdSetViewportWithCount = (PFN_vkCmdSetViewportWithCount)load(context, "vkCmdSetViewportWithCount"); table->vkCmdWaitEvents2 = (PFN_vkCmdWaitEvents2)load(context, "vkCmdWaitEvents2"); table->vkCmdWriteTimestamp2 = (PFN_vkCmdWriteTimestamp2)load(context, "vkCmdWriteTimestamp2"); table->vkCreatePrivateDataSlot = (PFN_vkCreatePrivateDataSlot)load(context, "vkCreatePrivateDataSlot"); table->vkDestroyPrivateDataSlot = (PFN_vkDestroyPrivateDataSlot)load(context, "vkDestroyPrivateDataSlot"); table->vkGetDeviceBufferMemoryRequirements = (PFN_vkGetDeviceBufferMemoryRequirements)load(context, "vkGetDeviceBufferMemoryRequirements"); table->vkGetDeviceImageMemoryRequirements = (PFN_vkGetDeviceImageMemoryRequirements)load(context, "vkGetDeviceImageMemoryRequirements"); table->vkGetDeviceImageSparseMemoryRequirements = (PFN_vkGetDeviceImageSparseMemoryRequirements)load( context, "vkGetDeviceImageSparseMemoryRequirements"); table->vkGetPrivateData = (PFN_vkGetPrivateData)load(context, "vkGetPrivateData"); table->vkQueueSubmit2 = (PFN_vkQueueSubmit2)load(context, "vkQueueSubmit2"); table->vkSetPrivateData = (PFN_vkSetPrivateData)load(context, "vkSetPrivateData"); #endif /* defined(VK_VERSION_1_3) */ #if defined(VK_AMD_buffer_marker) table->vkCmdWriteBufferMarkerAMD = (PFN_vkCmdWriteBufferMarkerAMD)load(context, "vkCmdWriteBufferMarkerAMD"); #endif /* defined(VK_AMD_buffer_marker) */ #if defined(VK_AMD_display_native_hdr) table->vkSetLocalDimmingAMD = (PFN_vkSetLocalDimmingAMD)load(context, "vkSetLocalDimmingAMD"); #endif /* defined(VK_AMD_display_native_hdr) */ #if defined(VK_AMD_draw_indirect_count) table->vkCmdDrawIndexedIndirectCountAMD = (PFN_vkCmdDrawIndexedIndirectCountAMD)load(context, "vkCmdDrawIndexedIndirectCountAMD"); table->vkCmdDrawIndirectCountAMD = (PFN_vkCmdDrawIndirectCountAMD)load(context, "vkCmdDrawIndirectCountAMD"); #endif /* defined(VK_AMD_draw_indirect_count) */ #if defined(VK_AMD_shader_info) table->vkGetShaderInfoAMD = (PFN_vkGetShaderInfoAMD)load(context, "vkGetShaderInfoAMD"); #endif /* defined(VK_AMD_shader_info) */ #if defined(VK_ANDROID_external_memory_android_hardware_buffer) table->vkGetAndroidHardwareBufferPropertiesANDROID = (PFN_vkGetAndroidHardwareBufferPropertiesANDROID)load( context, "vkGetAndroidHardwareBufferPropertiesANDROID"); table->vkGetMemoryAndroidHardwareBufferANDROID = (PFN_vkGetMemoryAndroidHardwareBufferANDROID)load(context, "vkGetMemoryAndroidHardwareBufferANDROID"); #endif /* defined(VK_ANDROID_external_memory_android_hardware_buffer) */ #if defined(VK_EXT_buffer_device_address) table->vkGetBufferDeviceAddressEXT = (PFN_vkGetBufferDeviceAddressEXT)load(context, "vkGetBufferDeviceAddressEXT"); #endif /* defined(VK_EXT_buffer_device_address) */ #if defined(VK_EXT_calibrated_timestamps) table->vkGetCalibratedTimestampsEXT = (PFN_vkGetCalibratedTimestampsEXT)load(context, "vkGetCalibratedTimestampsEXT"); #endif /* defined(VK_EXT_calibrated_timestamps) */ #if defined(VK_EXT_color_write_enable) table->vkCmdSetColorWriteEnableEXT = (PFN_vkCmdSetColorWriteEnableEXT)load(context, "vkCmdSetColorWriteEnableEXT"); #endif /* defined(VK_EXT_color_write_enable) */ #if defined(VK_EXT_conditional_rendering) table->vkCmdBeginConditionalRenderingEXT = (PFN_vkCmdBeginConditionalRenderingEXT)load(context, "vkCmdBeginConditionalRenderingEXT"); table->vkCmdEndConditionalRenderingEXT = (PFN_vkCmdEndConditionalRenderingEXT)load(context, "vkCmdEndConditionalRenderingEXT"); #endif /* defined(VK_EXT_conditional_rendering) */ #if defined(VK_EXT_debug_marker) table->vkCmdDebugMarkerBeginEXT = (PFN_vkCmdDebugMarkerBeginEXT)load(context, "vkCmdDebugMarkerBeginEXT"); table->vkCmdDebugMarkerEndEXT = (PFN_vkCmdDebugMarkerEndEXT)load(context, "vkCmdDebugMarkerEndEXT"); table->vkCmdDebugMarkerInsertEXT = (PFN_vkCmdDebugMarkerInsertEXT)load(context, "vkCmdDebugMarkerInsertEXT"); table->vkDebugMarkerSetObjectNameEXT = (PFN_vkDebugMarkerSetObjectNameEXT)load(context, "vkDebugMarkerSetObjectNameEXT"); table->vkDebugMarkerSetObjectTagEXT = (PFN_vkDebugMarkerSetObjectTagEXT)load(context, "vkDebugMarkerSetObjectTagEXT"); #endif /* defined(VK_EXT_debug_marker) */ #if defined(VK_EXT_discard_rectangles) table->vkCmdSetDiscardRectangleEXT = (PFN_vkCmdSetDiscardRectangleEXT)load(context, "vkCmdSetDiscardRectangleEXT"); #endif /* defined(VK_EXT_discard_rectangles) */ #if defined(VK_EXT_display_control) table->vkDisplayPowerControlEXT = (PFN_vkDisplayPowerControlEXT)load(context, "vkDisplayPowerControlEXT"); table->vkGetSwapchainCounterEXT = (PFN_vkGetSwapchainCounterEXT)load(context, "vkGetSwapchainCounterEXT"); table->vkRegisterDeviceEventEXT = (PFN_vkRegisterDeviceEventEXT)load(context, "vkRegisterDeviceEventEXT"); table->vkRegisterDisplayEventEXT = (PFN_vkRegisterDisplayEventEXT)load(context, "vkRegisterDisplayEventEXT"); #endif /* defined(VK_EXT_display_control) */ #if defined(VK_EXT_extended_dynamic_state) table->vkCmdBindVertexBuffers2EXT = (PFN_vkCmdBindVertexBuffers2EXT)load(context, "vkCmdBindVertexBuffers2EXT"); table->vkCmdSetCullModeEXT = (PFN_vkCmdSetCullModeEXT)load(context, "vkCmdSetCullModeEXT"); table->vkCmdSetDepthBoundsTestEnableEXT = (PFN_vkCmdSetDepthBoundsTestEnableEXT)load(context, "vkCmdSetDepthBoundsTestEnableEXT"); table->vkCmdSetDepthCompareOpEXT = (PFN_vkCmdSetDepthCompareOpEXT)load(context, "vkCmdSetDepthCompareOpEXT"); table->vkCmdSetDepthTestEnableEXT = (PFN_vkCmdSetDepthTestEnableEXT)load(context, "vkCmdSetDepthTestEnableEXT"); table->vkCmdSetDepthWriteEnableEXT = (PFN_vkCmdSetDepthWriteEnableEXT)load(context, "vkCmdSetDepthWriteEnableEXT"); table->vkCmdSetFrontFaceEXT = (PFN_vkCmdSetFrontFaceEXT)load(context, "vkCmdSetFrontFaceEXT"); table->vkCmdSetPrimitiveTopologyEXT = (PFN_vkCmdSetPrimitiveTopologyEXT)load(context, "vkCmdSetPrimitiveTopologyEXT"); table->vkCmdSetScissorWithCountEXT = (PFN_vkCmdSetScissorWithCountEXT)load(context, "vkCmdSetScissorWithCountEXT"); table->vkCmdSetStencilOpEXT = (PFN_vkCmdSetStencilOpEXT)load(context, "vkCmdSetStencilOpEXT"); table->vkCmdSetStencilTestEnableEXT = (PFN_vkCmdSetStencilTestEnableEXT)load(context, "vkCmdSetStencilTestEnableEXT"); table->vkCmdSetViewportWithCountEXT = (PFN_vkCmdSetViewportWithCountEXT)load(context, "vkCmdSetViewportWithCountEXT"); #endif /* defined(VK_EXT_extended_dynamic_state) */ #if defined(VK_EXT_extended_dynamic_state2) table->vkCmdSetDepthBiasEnableEXT = (PFN_vkCmdSetDepthBiasEnableEXT)load(context, "vkCmdSetDepthBiasEnableEXT"); table->vkCmdSetLogicOpEXT = (PFN_vkCmdSetLogicOpEXT)load(context, "vkCmdSetLogicOpEXT"); table->vkCmdSetPatchControlPointsEXT = (PFN_vkCmdSetPatchControlPointsEXT)load(context, "vkCmdSetPatchControlPointsEXT"); table->vkCmdSetPrimitiveRestartEnableEXT = (PFN_vkCmdSetPrimitiveRestartEnableEXT)load(context, "vkCmdSetPrimitiveRestartEnableEXT"); table->vkCmdSetRasterizerDiscardEnableEXT = (PFN_vkCmdSetRasterizerDiscardEnableEXT)load(context, "vkCmdSetRasterizerDiscardEnableEXT"); #endif /* defined(VK_EXT_extended_dynamic_state2) */ #if defined(VK_EXT_external_memory_host) table->vkGetMemoryHostPointerPropertiesEXT = (PFN_vkGetMemoryHostPointerPropertiesEXT)load(context, "vkGetMemoryHostPointerPropertiesEXT"); #endif /* defined(VK_EXT_external_memory_host) */ #if defined(VK_EXT_full_screen_exclusive) table->vkAcquireFullScreenExclusiveModeEXT = (PFN_vkAcquireFullScreenExclusiveModeEXT)load(context, "vkAcquireFullScreenExclusiveModeEXT"); table->vkReleaseFullScreenExclusiveModeEXT = (PFN_vkReleaseFullScreenExclusiveModeEXT)load(context, "vkReleaseFullScreenExclusiveModeEXT"); #endif /* defined(VK_EXT_full_screen_exclusive) */ #if defined(VK_EXT_hdr_metadata) table->vkSetHdrMetadataEXT = (PFN_vkSetHdrMetadataEXT)load(context, "vkSetHdrMetadataEXT"); #endif /* defined(VK_EXT_hdr_metadata) */ #if defined(VK_EXT_host_query_reset) table->vkResetQueryPoolEXT = (PFN_vkResetQueryPoolEXT)load(context, "vkResetQueryPoolEXT"); #endif /* defined(VK_EXT_host_query_reset) */ #if defined(VK_EXT_image_drm_format_modifier) table->vkGetImageDrmFormatModifierPropertiesEXT = (PFN_vkGetImageDrmFormatModifierPropertiesEXT)load( context, "vkGetImageDrmFormatModifierPropertiesEXT"); #endif /* defined(VK_EXT_image_drm_format_modifier) */ #if defined(VK_EXT_line_rasterization) table->vkCmdSetLineStippleEXT = (PFN_vkCmdSetLineStippleEXT)load(context, "vkCmdSetLineStippleEXT"); #endif /* defined(VK_EXT_line_rasterization) */ #if defined(VK_EXT_multi_draw) table->vkCmdDrawMultiEXT = (PFN_vkCmdDrawMultiEXT)load(context, "vkCmdDrawMultiEXT"); table->vkCmdDrawMultiIndexedEXT = (PFN_vkCmdDrawMultiIndexedEXT)load(context, "vkCmdDrawMultiIndexedEXT"); #endif /* defined(VK_EXT_multi_draw) */ #if defined(VK_EXT_pageable_device_local_memory) table->vkSetDeviceMemoryPriorityEXT = (PFN_vkSetDeviceMemoryPriorityEXT)load(context, "vkSetDeviceMemoryPriorityEXT"); #endif /* defined(VK_EXT_pageable_device_local_memory) */ #if defined(VK_EXT_private_data) table->vkCreatePrivateDataSlotEXT = (PFN_vkCreatePrivateDataSlotEXT)load(context, "vkCreatePrivateDataSlotEXT"); table->vkDestroyPrivateDataSlotEXT = (PFN_vkDestroyPrivateDataSlotEXT)load(context, "vkDestroyPrivateDataSlotEXT"); table->vkGetPrivateDataEXT = (PFN_vkGetPrivateDataEXT)load(context, "vkGetPrivateDataEXT"); table->vkSetPrivateDataEXT = (PFN_vkSetPrivateDataEXT)load(context, "vkSetPrivateDataEXT"); #endif /* defined(VK_EXT_private_data) */ #if defined(VK_EXT_sample_locations) table->vkCmdSetSampleLocationsEXT = (PFN_vkCmdSetSampleLocationsEXT)load(context, "vkCmdSetSampleLocationsEXT"); #endif /* defined(VK_EXT_sample_locations) */ #if defined(VK_EXT_transform_feedback) table->vkCmdBeginQueryIndexedEXT = (PFN_vkCmdBeginQueryIndexedEXT)load(context, "vkCmdBeginQueryIndexedEXT"); table->vkCmdBeginTransformFeedbackEXT = (PFN_vkCmdBeginTransformFeedbackEXT)load(context, "vkCmdBeginTransformFeedbackEXT"); table->vkCmdBindTransformFeedbackBuffersEXT = (PFN_vkCmdBindTransformFeedbackBuffersEXT)load( context, "vkCmdBindTransformFeedbackBuffersEXT"); table->vkCmdDrawIndirectByteCountEXT = (PFN_vkCmdDrawIndirectByteCountEXT)load(context, "vkCmdDrawIndirectByteCountEXT"); table->vkCmdEndQueryIndexedEXT = (PFN_vkCmdEndQueryIndexedEXT)load(context, "vkCmdEndQueryIndexedEXT"); table->vkCmdEndTransformFeedbackEXT = (PFN_vkCmdEndTransformFeedbackEXT)load(context, "vkCmdEndTransformFeedbackEXT"); #endif /* defined(VK_EXT_transform_feedback) */ #if defined(VK_EXT_validation_cache) table->vkCreateValidationCacheEXT = (PFN_vkCreateValidationCacheEXT)load(context, "vkCreateValidationCacheEXT"); table->vkDestroyValidationCacheEXT = (PFN_vkDestroyValidationCacheEXT)load(context, "vkDestroyValidationCacheEXT"); table->vkGetValidationCacheDataEXT = (PFN_vkGetValidationCacheDataEXT)load(context, "vkGetValidationCacheDataEXT"); table->vkMergeValidationCachesEXT = (PFN_vkMergeValidationCachesEXT)load(context, "vkMergeValidationCachesEXT"); #endif /* defined(VK_EXT_validation_cache) */ #if defined(VK_EXT_vertex_input_dynamic_state) table->vkCmdSetVertexInputEXT = (PFN_vkCmdSetVertexInputEXT)load(context, "vkCmdSetVertexInputEXT"); #endif /* defined(VK_EXT_vertex_input_dynamic_state) */ #if defined(VK_FUCHSIA_buffer_collection) table->vkCreateBufferCollectionFUCHSIA = (PFN_vkCreateBufferCollectionFUCHSIA)load(context, "vkCreateBufferCollectionFUCHSIA"); table->vkDestroyBufferCollectionFUCHSIA = (PFN_vkDestroyBufferCollectionFUCHSIA)load(context, "vkDestroyBufferCollectionFUCHSIA"); table->vkGetBufferCollectionPropertiesFUCHSIA = (PFN_vkGetBufferCollectionPropertiesFUCHSIA)load( context, "vkGetBufferCollectionPropertiesFUCHSIA"); table->vkSetBufferCollectionBufferConstraintsFUCHSIA = (PFN_vkSetBufferCollectionBufferConstraintsFUCHSIA)load( context, "vkSetBufferCollectionBufferConstraintsFUCHSIA"); table->vkSetBufferCollectionImageConstraintsFUCHSIA = (PFN_vkSetBufferCollectionImageConstraintsFUCHSIA)load( context, "vkSetBufferCollectionImageConstraintsFUCHSIA"); #endif /* defined(VK_FUCHSIA_buffer_collection) */ #if defined(VK_FUCHSIA_external_memory) table->vkGetMemoryZirconHandleFUCHSIA = (PFN_vkGetMemoryZirconHandleFUCHSIA)load(context, "vkGetMemoryZirconHandleFUCHSIA"); table->vkGetMemoryZirconHandlePropertiesFUCHSIA = (PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA)load( context, "vkGetMemoryZirconHandlePropertiesFUCHSIA"); #endif /* defined(VK_FUCHSIA_external_memory) */ #if defined(VK_FUCHSIA_external_semaphore) table->vkGetSemaphoreZirconHandleFUCHSIA = (PFN_vkGetSemaphoreZirconHandleFUCHSIA)load(context, "vkGetSemaphoreZirconHandleFUCHSIA"); table->vkImportSemaphoreZirconHandleFUCHSIA = (PFN_vkImportSemaphoreZirconHandleFUCHSIA)load( context, "vkImportSemaphoreZirconHandleFUCHSIA"); #endif /* defined(VK_FUCHSIA_external_semaphore) */ #if defined(VK_GOOGLE_display_timing) table->vkGetPastPresentationTimingGOOGLE = (PFN_vkGetPastPresentationTimingGOOGLE)load(context, "vkGetPastPresentationTimingGOOGLE"); table->vkGetRefreshCycleDurationGOOGLE = (PFN_vkGetRefreshCycleDurationGOOGLE)load(context, "vkGetRefreshCycleDurationGOOGLE"); #endif /* defined(VK_GOOGLE_display_timing) */ #if defined(VK_HUAWEI_invocation_mask) table->vkCmdBindInvocationMaskHUAWEI = (PFN_vkCmdBindInvocationMaskHUAWEI)load(context, "vkCmdBindInvocationMaskHUAWEI"); #endif /* defined(VK_HUAWEI_invocation_mask) */ #if defined(VK_HUAWEI_subpass_shading) table->vkCmdSubpassShadingHUAWEI = (PFN_vkCmdSubpassShadingHUAWEI)load(context, "vkCmdSubpassShadingHUAWEI"); table->vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI = (PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI)load( context, "vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI"); #endif /* defined(VK_HUAWEI_subpass_shading) */ #if defined(VK_INTEL_performance_query) table->vkAcquirePerformanceConfigurationINTEL = (PFN_vkAcquirePerformanceConfigurationINTEL)load( context, "vkAcquirePerformanceConfigurationINTEL"); table->vkCmdSetPerformanceMarkerINTEL = (PFN_vkCmdSetPerformanceMarkerINTEL)load(context, "vkCmdSetPerformanceMarkerINTEL"); table->vkCmdSetPerformanceOverrideINTEL = (PFN_vkCmdSetPerformanceOverrideINTEL)load(context, "vkCmdSetPerformanceOverrideINTEL"); table->vkCmdSetPerformanceStreamMarkerINTEL = (PFN_vkCmdSetPerformanceStreamMarkerINTEL)load( context, "vkCmdSetPerformanceStreamMarkerINTEL"); table->vkGetPerformanceParameterINTEL = (PFN_vkGetPerformanceParameterINTEL)load(context, "vkGetPerformanceParameterINTEL"); table->vkInitializePerformanceApiINTEL = (PFN_vkInitializePerformanceApiINTEL)load(context, "vkInitializePerformanceApiINTEL"); table->vkQueueSetPerformanceConfigurationINTEL = (PFN_vkQueueSetPerformanceConfigurationINTEL)load(context, "vkQueueSetPerformanceConfigurationINTEL"); table->vkReleasePerformanceConfigurationINTEL = (PFN_vkReleasePerformanceConfigurationINTEL)load( context, "vkReleasePerformanceConfigurationINTEL"); table->vkUninitializePerformanceApiINTEL = (PFN_vkUninitializePerformanceApiINTEL)load(context, "vkUninitializePerformanceApiINTEL"); #endif /* defined(VK_INTEL_performance_query) */ #if defined(VK_KHR_acceleration_structure) table->vkBuildAccelerationStructuresKHR = (PFN_vkBuildAccelerationStructuresKHR)load(context, "vkBuildAccelerationStructuresKHR"); table->vkCmdBuildAccelerationStructuresIndirectKHR = (PFN_vkCmdBuildAccelerationStructuresIndirectKHR)load( context, "vkCmdBuildAccelerationStructuresIndirectKHR"); table->vkCmdBuildAccelerationStructuresKHR = (PFN_vkCmdBuildAccelerationStructuresKHR)load(context, "vkCmdBuildAccelerationStructuresKHR"); table->vkCmdCopyAccelerationStructureKHR = (PFN_vkCmdCopyAccelerationStructureKHR)load(context, "vkCmdCopyAccelerationStructureKHR"); table->vkCmdCopyAccelerationStructureToMemoryKHR = (PFN_vkCmdCopyAccelerationStructureToMemoryKHR)load( context, "vkCmdCopyAccelerationStructureToMemoryKHR"); table->vkCmdCopyMemoryToAccelerationStructureKHR = (PFN_vkCmdCopyMemoryToAccelerationStructureKHR)load( context, "vkCmdCopyMemoryToAccelerationStructureKHR"); table->vkCmdWriteAccelerationStructuresPropertiesKHR = (PFN_vkCmdWriteAccelerationStructuresPropertiesKHR)load( context, "vkCmdWriteAccelerationStructuresPropertiesKHR"); table->vkCopyAccelerationStructureKHR = (PFN_vkCopyAccelerationStructureKHR)load(context, "vkCopyAccelerationStructureKHR"); table->vkCopyAccelerationStructureToMemoryKHR = (PFN_vkCopyAccelerationStructureToMemoryKHR)load( context, "vkCopyAccelerationStructureToMemoryKHR"); table->vkCopyMemoryToAccelerationStructureKHR = (PFN_vkCopyMemoryToAccelerationStructureKHR)load( context, "vkCopyMemoryToAccelerationStructureKHR"); table->vkCreateAccelerationStructureKHR = (PFN_vkCreateAccelerationStructureKHR)load(context, "vkCreateAccelerationStructureKHR"); table->vkDestroyAccelerationStructureKHR = (PFN_vkDestroyAccelerationStructureKHR)load(context, "vkDestroyAccelerationStructureKHR"); table->vkGetAccelerationStructureBuildSizesKHR = (PFN_vkGetAccelerationStructureBuildSizesKHR)load(context, "vkGetAccelerationStructureBuildSizesKHR"); table->vkGetAccelerationStructureDeviceAddressKHR = (PFN_vkGetAccelerationStructureDeviceAddressKHR)load( context, "vkGetAccelerationStructureDeviceAddressKHR"); table->vkGetDeviceAccelerationStructureCompatibilityKHR = (PFN_vkGetDeviceAccelerationStructureCompatibilityKHR)load( context, "vkGetDeviceAccelerationStructureCompatibilityKHR"); table->vkWriteAccelerationStructuresPropertiesKHR = (PFN_vkWriteAccelerationStructuresPropertiesKHR)load( context, "vkWriteAccelerationStructuresPropertiesKHR"); #endif /* defined(VK_KHR_acceleration_structure) */ #if defined(VK_KHR_bind_memory2) table->vkBindBufferMemory2KHR = (PFN_vkBindBufferMemory2KHR)load(context, "vkBindBufferMemory2KHR"); table->vkBindImageMemory2KHR = (PFN_vkBindImageMemory2KHR)load(context, "vkBindImageMemory2KHR"); #endif /* defined(VK_KHR_bind_memory2) */ #if defined(VK_KHR_buffer_device_address) table->vkGetBufferDeviceAddressKHR = (PFN_vkGetBufferDeviceAddressKHR)load(context, "vkGetBufferDeviceAddressKHR"); table->vkGetBufferOpaqueCaptureAddressKHR = (PFN_vkGetBufferOpaqueCaptureAddressKHR)load(context, "vkGetBufferOpaqueCaptureAddressKHR"); table->vkGetDeviceMemoryOpaqueCaptureAddressKHR = (PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR)load( context, "vkGetDeviceMemoryOpaqueCaptureAddressKHR"); #endif /* defined(VK_KHR_buffer_device_address) */ #if defined(VK_KHR_copy_commands2) table->vkCmdBlitImage2KHR = (PFN_vkCmdBlitImage2KHR)load(context, "vkCmdBlitImage2KHR"); table->vkCmdCopyBuffer2KHR = (PFN_vkCmdCopyBuffer2KHR)load(context, "vkCmdCopyBuffer2KHR"); table->vkCmdCopyBufferToImage2KHR = (PFN_vkCmdCopyBufferToImage2KHR)load(context, "vkCmdCopyBufferToImage2KHR"); table->vkCmdCopyImage2KHR = (PFN_vkCmdCopyImage2KHR)load(context, "vkCmdCopyImage2KHR"); table->vkCmdCopyImageToBuffer2KHR = (PFN_vkCmdCopyImageToBuffer2KHR)load(context, "vkCmdCopyImageToBuffer2KHR"); table->vkCmdResolveImage2KHR = (PFN_vkCmdResolveImage2KHR)load(context, "vkCmdResolveImage2KHR"); #endif /* defined(VK_KHR_copy_commands2) */ #if defined(VK_KHR_create_renderpass2) table->vkCmdBeginRenderPass2KHR = (PFN_vkCmdBeginRenderPass2KHR)load(context, "vkCmdBeginRenderPass2KHR"); table->vkCmdEndRenderPass2KHR = (PFN_vkCmdEndRenderPass2KHR)load(context, "vkCmdEndRenderPass2KHR"); table->vkCmdNextSubpass2KHR = (PFN_vkCmdNextSubpass2KHR)load(context, "vkCmdNextSubpass2KHR"); table->vkCreateRenderPass2KHR = (PFN_vkCreateRenderPass2KHR)load(context, "vkCreateRenderPass2KHR"); #endif /* defined(VK_KHR_create_renderpass2) */ #if defined(VK_KHR_deferred_host_operations) table->vkCreateDeferredOperationKHR = (PFN_vkCreateDeferredOperationKHR)load(context, "vkCreateDeferredOperationKHR"); table->vkDeferredOperationJoinKHR = (PFN_vkDeferredOperationJoinKHR)load(context, "vkDeferredOperationJoinKHR"); table->vkDestroyDeferredOperationKHR = (PFN_vkDestroyDeferredOperationKHR)load(context, "vkDestroyDeferredOperationKHR"); table->vkGetDeferredOperationMaxConcurrencyKHR = (PFN_vkGetDeferredOperationMaxConcurrencyKHR)load(context, "vkGetDeferredOperationMaxConcurrencyKHR"); table->vkGetDeferredOperationResultKHR = (PFN_vkGetDeferredOperationResultKHR)load(context, "vkGetDeferredOperationResultKHR"); #endif /* defined(VK_KHR_deferred_host_operations) */ #if defined(VK_KHR_descriptor_update_template) table->vkCreateDescriptorUpdateTemplateKHR = (PFN_vkCreateDescriptorUpdateTemplateKHR)load(context, "vkCreateDescriptorUpdateTemplateKHR"); table->vkDestroyDescriptorUpdateTemplateKHR = (PFN_vkDestroyDescriptorUpdateTemplateKHR)load( context, "vkDestroyDescriptorUpdateTemplateKHR"); table->vkUpdateDescriptorSetWithTemplateKHR = (PFN_vkUpdateDescriptorSetWithTemplateKHR)load( context, "vkUpdateDescriptorSetWithTemplateKHR"); #endif /* defined(VK_KHR_descriptor_update_template) */ #if defined(VK_KHR_device_group) table->vkCmdDispatchBaseKHR = (PFN_vkCmdDispatchBaseKHR)load(context, "vkCmdDispatchBaseKHR"); table->vkCmdSetDeviceMaskKHR = (PFN_vkCmdSetDeviceMaskKHR)load(context, "vkCmdSetDeviceMaskKHR"); table->vkGetDeviceGroupPeerMemoryFeaturesKHR = (PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR)load( context, "vkGetDeviceGroupPeerMemoryFeaturesKHR"); #endif /* defined(VK_KHR_device_group) */ #if defined(VK_KHR_display_swapchain) table->vkCreateSharedSwapchainsKHR = (PFN_vkCreateSharedSwapchainsKHR)load(context, "vkCreateSharedSwapchainsKHR"); #endif /* defined(VK_KHR_display_swapchain) */ #if defined(VK_KHR_draw_indirect_count) table->vkCmdDrawIndexedIndirectCountKHR = (PFN_vkCmdDrawIndexedIndirectCountKHR)load(context, "vkCmdDrawIndexedIndirectCountKHR"); table->vkCmdDrawIndirectCountKHR = (PFN_vkCmdDrawIndirectCountKHR)load(context, "vkCmdDrawIndirectCountKHR"); #endif /* defined(VK_KHR_draw_indirect_count) */ #if defined(VK_KHR_dynamic_rendering) table->vkCmdBeginRenderingKHR = (PFN_vkCmdBeginRenderingKHR)load(context, "vkCmdBeginRenderingKHR"); table->vkCmdEndRenderingKHR = (PFN_vkCmdEndRenderingKHR)load(context, "vkCmdEndRenderingKHR"); #endif /* defined(VK_KHR_dynamic_rendering) */ #if defined(VK_KHR_external_fence_fd) table->vkGetFenceFdKHR = (PFN_vkGetFenceFdKHR)load(context, "vkGetFenceFdKHR"); table->vkImportFenceFdKHR = (PFN_vkImportFenceFdKHR)load(context, "vkImportFenceFdKHR"); #endif /* defined(VK_KHR_external_fence_fd) */ #if defined(VK_KHR_external_fence_win32) table->vkGetFenceWin32HandleKHR = (PFN_vkGetFenceWin32HandleKHR)load(context, "vkGetFenceWin32HandleKHR"); table->vkImportFenceWin32HandleKHR = (PFN_vkImportFenceWin32HandleKHR)load(context, "vkImportFenceWin32HandleKHR"); #endif /* defined(VK_KHR_external_fence_win32) */ #if defined(VK_KHR_external_memory_fd) table->vkGetMemoryFdKHR = (PFN_vkGetMemoryFdKHR)load(context, "vkGetMemoryFdKHR"); table->vkGetMemoryFdPropertiesKHR = (PFN_vkGetMemoryFdPropertiesKHR)load(context, "vkGetMemoryFdPropertiesKHR"); #endif /* defined(VK_KHR_external_memory_fd) */ #if defined(VK_KHR_external_memory_win32) table->vkGetMemoryWin32HandleKHR = (PFN_vkGetMemoryWin32HandleKHR)load(context, "vkGetMemoryWin32HandleKHR"); table->vkGetMemoryWin32HandlePropertiesKHR = (PFN_vkGetMemoryWin32HandlePropertiesKHR)load(context, "vkGetMemoryWin32HandlePropertiesKHR"); #endif /* defined(VK_KHR_external_memory_win32) */ #if defined(VK_KHR_external_semaphore_fd) table->vkGetSemaphoreFdKHR = (PFN_vkGetSemaphoreFdKHR)load(context, "vkGetSemaphoreFdKHR"); table->vkImportSemaphoreFdKHR = (PFN_vkImportSemaphoreFdKHR)load(context, "vkImportSemaphoreFdKHR"); #endif /* defined(VK_KHR_external_semaphore_fd) */ #if defined(VK_KHR_external_semaphore_win32) table->vkGetSemaphoreWin32HandleKHR = (PFN_vkGetSemaphoreWin32HandleKHR)load(context, "vkGetSemaphoreWin32HandleKHR"); table->vkImportSemaphoreWin32HandleKHR = (PFN_vkImportSemaphoreWin32HandleKHR)load(context, "vkImportSemaphoreWin32HandleKHR"); #endif /* defined(VK_KHR_external_semaphore_win32) */ #if defined(VK_KHR_fragment_shading_rate) table->vkCmdSetFragmentShadingRateKHR = (PFN_vkCmdSetFragmentShadingRateKHR)load(context, "vkCmdSetFragmentShadingRateKHR"); #endif /* defined(VK_KHR_fragment_shading_rate) */ #if defined(VK_KHR_get_memory_requirements2) table->vkGetBufferMemoryRequirements2KHR = (PFN_vkGetBufferMemoryRequirements2KHR)load(context, "vkGetBufferMemoryRequirements2KHR"); table->vkGetImageMemoryRequirements2KHR = (PFN_vkGetImageMemoryRequirements2KHR)load(context, "vkGetImageMemoryRequirements2KHR"); table->vkGetImageSparseMemoryRequirements2KHR = (PFN_vkGetImageSparseMemoryRequirements2KHR)load( context, "vkGetImageSparseMemoryRequirements2KHR"); #endif /* defined(VK_KHR_get_memory_requirements2) */ #if defined(VK_KHR_maintenance1) table->vkTrimCommandPoolKHR = (PFN_vkTrimCommandPoolKHR)load(context, "vkTrimCommandPoolKHR"); #endif /* defined(VK_KHR_maintenance1) */ #if defined(VK_KHR_maintenance3) table->vkGetDescriptorSetLayoutSupportKHR = (PFN_vkGetDescriptorSetLayoutSupportKHR)load(context, "vkGetDescriptorSetLayoutSupportKHR"); #endif /* defined(VK_KHR_maintenance3) */ #if defined(VK_KHR_maintenance4) table->vkGetDeviceBufferMemoryRequirementsKHR = (PFN_vkGetDeviceBufferMemoryRequirementsKHR)load( context, "vkGetDeviceBufferMemoryRequirementsKHR"); table->vkGetDeviceImageMemoryRequirementsKHR = (PFN_vkGetDeviceImageMemoryRequirementsKHR)load( context, "vkGetDeviceImageMemoryRequirementsKHR"); table->vkGetDeviceImageSparseMemoryRequirementsKHR = (PFN_vkGetDeviceImageSparseMemoryRequirementsKHR)load( context, "vkGetDeviceImageSparseMemoryRequirementsKHR"); #endif /* defined(VK_KHR_maintenance4) */ #if defined(VK_KHR_performance_query) table->vkAcquireProfilingLockKHR = (PFN_vkAcquireProfilingLockKHR)load(context, "vkAcquireProfilingLockKHR"); table->vkReleaseProfilingLockKHR = (PFN_vkReleaseProfilingLockKHR)load(context, "vkReleaseProfilingLockKHR"); #endif /* defined(VK_KHR_performance_query) */ #if defined(VK_KHR_pipeline_executable_properties) table->vkGetPipelineExecutableInternalRepresentationsKHR = (PFN_vkGetPipelineExecutableInternalRepresentationsKHR)load( context, "vkGetPipelineExecutableInternalRepresentationsKHR"); table->vkGetPipelineExecutablePropertiesKHR = (PFN_vkGetPipelineExecutablePropertiesKHR)load( context, "vkGetPipelineExecutablePropertiesKHR"); table->vkGetPipelineExecutableStatisticsKHR = (PFN_vkGetPipelineExecutableStatisticsKHR)load( context, "vkGetPipelineExecutableStatisticsKHR"); #endif /* defined(VK_KHR_pipeline_executable_properties) */ #if defined(VK_KHR_present_wait) table->vkWaitForPresentKHR = (PFN_vkWaitForPresentKHR)load(context, "vkWaitForPresentKHR"); #endif /* defined(VK_KHR_present_wait) */ #if defined(VK_KHR_push_descriptor) table->vkCmdPushDescriptorSetKHR = (PFN_vkCmdPushDescriptorSetKHR)load(context, "vkCmdPushDescriptorSetKHR"); #endif /* defined(VK_KHR_push_descriptor) */ #if defined(VK_KHR_ray_tracing_pipeline) table->vkCmdSetRayTracingPipelineStackSizeKHR = (PFN_vkCmdSetRayTracingPipelineStackSizeKHR)load( context, "vkCmdSetRayTracingPipelineStackSizeKHR"); table->vkCmdTraceRaysIndirectKHR = (PFN_vkCmdTraceRaysIndirectKHR)load(context, "vkCmdTraceRaysIndirectKHR"); table->vkCmdTraceRaysKHR = (PFN_vkCmdTraceRaysKHR)load(context, "vkCmdTraceRaysKHR"); table->vkCreateRayTracingPipelinesKHR = (PFN_vkCreateRayTracingPipelinesKHR)load(context, "vkCreateRayTracingPipelinesKHR"); table->vkGetRayTracingCaptureReplayShaderGroupHandlesKHR = (PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR)load( context, "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR"); table->vkGetRayTracingShaderGroupHandlesKHR = (PFN_vkGetRayTracingShaderGroupHandlesKHR)load( context, "vkGetRayTracingShaderGroupHandlesKHR"); table->vkGetRayTracingShaderGroupStackSizeKHR = (PFN_vkGetRayTracingShaderGroupStackSizeKHR)load( context, "vkGetRayTracingShaderGroupStackSizeKHR"); #endif /* defined(VK_KHR_ray_tracing_pipeline) */ #if defined(VK_KHR_sampler_ycbcr_conversion) table->vkCreateSamplerYcbcrConversionKHR = (PFN_vkCreateSamplerYcbcrConversionKHR)load(context, "vkCreateSamplerYcbcrConversionKHR"); table->vkDestroySamplerYcbcrConversionKHR = (PFN_vkDestroySamplerYcbcrConversionKHR)load(context, "vkDestroySamplerYcbcrConversionKHR"); #endif /* defined(VK_KHR_sampler_ycbcr_conversion) */ #if defined(VK_KHR_shared_presentable_image) table->vkGetSwapchainStatusKHR = (PFN_vkGetSwapchainStatusKHR)load(context, "vkGetSwapchainStatusKHR"); #endif /* defined(VK_KHR_shared_presentable_image) */ #if defined(VK_KHR_swapchain) table->vkAcquireNextImageKHR = (PFN_vkAcquireNextImageKHR)load(context, "vkAcquireNextImageKHR"); table->vkCreateSwapchainKHR = (PFN_vkCreateSwapchainKHR)load(context, "vkCreateSwapchainKHR"); table->vkDestroySwapchainKHR = (PFN_vkDestroySwapchainKHR)load(context, "vkDestroySwapchainKHR"); table->vkGetSwapchainImagesKHR = (PFN_vkGetSwapchainImagesKHR)load(context, "vkGetSwapchainImagesKHR"); table->vkQueuePresentKHR = (PFN_vkQueuePresentKHR)load(context, "vkQueuePresentKHR"); #endif /* defined(VK_KHR_swapchain) */ #if defined(VK_KHR_synchronization2) table->vkCmdPipelineBarrier2KHR = (PFN_vkCmdPipelineBarrier2KHR)load(context, "vkCmdPipelineBarrier2KHR"); table->vkCmdResetEvent2KHR = (PFN_vkCmdResetEvent2KHR)load(context, "vkCmdResetEvent2KHR"); table->vkCmdSetEvent2KHR = (PFN_vkCmdSetEvent2KHR)load(context, "vkCmdSetEvent2KHR"); table->vkCmdWaitEvents2KHR = (PFN_vkCmdWaitEvents2KHR)load(context, "vkCmdWaitEvents2KHR"); table->vkCmdWriteTimestamp2KHR = (PFN_vkCmdWriteTimestamp2KHR)load(context, "vkCmdWriteTimestamp2KHR"); table->vkQueueSubmit2KHR = (PFN_vkQueueSubmit2KHR)load(context, "vkQueueSubmit2KHR"); #endif /* defined(VK_KHR_synchronization2) */ #if defined(VK_KHR_synchronization2) && defined(VK_AMD_buffer_marker) table->vkCmdWriteBufferMarker2AMD = (PFN_vkCmdWriteBufferMarker2AMD)load(context, "vkCmdWriteBufferMarker2AMD"); #endif /* defined(VK_KHR_synchronization2) && defined(VK_AMD_buffer_marker) */ #if defined(VK_KHR_synchronization2) && defined(VK_NV_device_diagnostic_checkpoints) table->vkGetQueueCheckpointData2NV = (PFN_vkGetQueueCheckpointData2NV)load(context, "vkGetQueueCheckpointData2NV"); #endif /* defined(VK_KHR_synchronization2) && defined(VK_NV_device_diagnostic_checkpoints) */ #if defined(VK_KHR_timeline_semaphore) table->vkGetSemaphoreCounterValueKHR = (PFN_vkGetSemaphoreCounterValueKHR)load(context, "vkGetSemaphoreCounterValueKHR"); table->vkSignalSemaphoreKHR = (PFN_vkSignalSemaphoreKHR)load(context, "vkSignalSemaphoreKHR"); table->vkWaitSemaphoresKHR = (PFN_vkWaitSemaphoresKHR)load(context, "vkWaitSemaphoresKHR"); #endif /* defined(VK_KHR_timeline_semaphore) */ #if defined(VK_KHR_video_decode_queue) table->vkCmdDecodeVideoKHR = (PFN_vkCmdDecodeVideoKHR)load(context, "vkCmdDecodeVideoKHR"); #endif /* defined(VK_KHR_video_decode_queue) */ #if defined(VK_KHR_video_encode_queue) table->vkCmdEncodeVideoKHR = (PFN_vkCmdEncodeVideoKHR)load(context, "vkCmdEncodeVideoKHR"); #endif /* defined(VK_KHR_video_encode_queue) */ #if defined(VK_KHR_video_queue) table->vkBindVideoSessionMemoryKHR = (PFN_vkBindVideoSessionMemoryKHR)load(context, "vkBindVideoSessionMemoryKHR"); table->vkCmdBeginVideoCodingKHR = (PFN_vkCmdBeginVideoCodingKHR)load(context, "vkCmdBeginVideoCodingKHR"); table->vkCmdControlVideoCodingKHR = (PFN_vkCmdControlVideoCodingKHR)load(context, "vkCmdControlVideoCodingKHR"); table->vkCmdEndVideoCodingKHR = (PFN_vkCmdEndVideoCodingKHR)load(context, "vkCmdEndVideoCodingKHR"); table->vkCreateVideoSessionKHR = (PFN_vkCreateVideoSessionKHR)load(context, "vkCreateVideoSessionKHR"); table->vkCreateVideoSessionParametersKHR = (PFN_vkCreateVideoSessionParametersKHR)load(context, "vkCreateVideoSessionParametersKHR"); table->vkDestroyVideoSessionKHR = (PFN_vkDestroyVideoSessionKHR)load(context, "vkDestroyVideoSessionKHR"); table->vkDestroyVideoSessionParametersKHR = (PFN_vkDestroyVideoSessionParametersKHR)load(context, "vkDestroyVideoSessionParametersKHR"); table->vkGetVideoSessionMemoryRequirementsKHR = (PFN_vkGetVideoSessionMemoryRequirementsKHR)load( context, "vkGetVideoSessionMemoryRequirementsKHR"); table->vkUpdateVideoSessionParametersKHR = (PFN_vkUpdateVideoSessionParametersKHR)load(context, "vkUpdateVideoSessionParametersKHR"); #endif /* defined(VK_KHR_video_queue) */ #if defined(VK_NVX_binary_import) table->vkCmdCuLaunchKernelNVX = (PFN_vkCmdCuLaunchKernelNVX)load(context, "vkCmdCuLaunchKernelNVX"); table->vkCreateCuFunctionNVX = (PFN_vkCreateCuFunctionNVX)load(context, "vkCreateCuFunctionNVX"); table->vkCreateCuModuleNVX = (PFN_vkCreateCuModuleNVX)load(context, "vkCreateCuModuleNVX"); table->vkDestroyCuFunctionNVX = (PFN_vkDestroyCuFunctionNVX)load(context, "vkDestroyCuFunctionNVX"); table->vkDestroyCuModuleNVX = (PFN_vkDestroyCuModuleNVX)load(context, "vkDestroyCuModuleNVX"); #endif /* defined(VK_NVX_binary_import) */ #if defined(VK_NVX_image_view_handle) table->vkGetImageViewAddressNVX = (PFN_vkGetImageViewAddressNVX)load(context, "vkGetImageViewAddressNVX"); table->vkGetImageViewHandleNVX = (PFN_vkGetImageViewHandleNVX)load(context, "vkGetImageViewHandleNVX"); #endif /* defined(VK_NVX_image_view_handle) */ #if defined(VK_NV_clip_space_w_scaling) table->vkCmdSetViewportWScalingNV = (PFN_vkCmdSetViewportWScalingNV)load(context, "vkCmdSetViewportWScalingNV"); #endif /* defined(VK_NV_clip_space_w_scaling) */ #if defined(VK_NV_device_diagnostic_checkpoints) table->vkCmdSetCheckpointNV = (PFN_vkCmdSetCheckpointNV)load(context, "vkCmdSetCheckpointNV"); table->vkGetQueueCheckpointDataNV = (PFN_vkGetQueueCheckpointDataNV)load(context, "vkGetQueueCheckpointDataNV"); #endif /* defined(VK_NV_device_diagnostic_checkpoints) */ #if defined(VK_NV_device_generated_commands) table->vkCmdBindPipelineShaderGroupNV = (PFN_vkCmdBindPipelineShaderGroupNV)load(context, "vkCmdBindPipelineShaderGroupNV"); table->vkCmdExecuteGeneratedCommandsNV = (PFN_vkCmdExecuteGeneratedCommandsNV)load(context, "vkCmdExecuteGeneratedCommandsNV"); table->vkCmdPreprocessGeneratedCommandsNV = (PFN_vkCmdPreprocessGeneratedCommandsNV)load(context, "vkCmdPreprocessGeneratedCommandsNV"); table->vkCreateIndirectCommandsLayoutNV = (PFN_vkCreateIndirectCommandsLayoutNV)load(context, "vkCreateIndirectCommandsLayoutNV"); table->vkDestroyIndirectCommandsLayoutNV = (PFN_vkDestroyIndirectCommandsLayoutNV)load(context, "vkDestroyIndirectCommandsLayoutNV"); table->vkGetGeneratedCommandsMemoryRequirementsNV = (PFN_vkGetGeneratedCommandsMemoryRequirementsNV)load( context, "vkGetGeneratedCommandsMemoryRequirementsNV"); #endif /* defined(VK_NV_device_generated_commands) */ #if defined(VK_NV_external_memory_rdma) table->vkGetMemoryRemoteAddressNV = (PFN_vkGetMemoryRemoteAddressNV)load(context, "vkGetMemoryRemoteAddressNV"); #endif /* defined(VK_NV_external_memory_rdma) */ #if defined(VK_NV_external_memory_win32) table->vkGetMemoryWin32HandleNV = (PFN_vkGetMemoryWin32HandleNV)load(context, "vkGetMemoryWin32HandleNV"); #endif /* defined(VK_NV_external_memory_win32) */ #if defined(VK_NV_fragment_shading_rate_enums) table->vkCmdSetFragmentShadingRateEnumNV = (PFN_vkCmdSetFragmentShadingRateEnumNV)load(context, "vkCmdSetFragmentShadingRateEnumNV"); #endif /* defined(VK_NV_fragment_shading_rate_enums) */ #if defined(VK_NV_mesh_shader) table->vkCmdDrawMeshTasksIndirectCountNV = (PFN_vkCmdDrawMeshTasksIndirectCountNV)load(context, "vkCmdDrawMeshTasksIndirectCountNV"); table->vkCmdDrawMeshTasksIndirectNV = (PFN_vkCmdDrawMeshTasksIndirectNV)load(context, "vkCmdDrawMeshTasksIndirectNV"); table->vkCmdDrawMeshTasksNV = (PFN_vkCmdDrawMeshTasksNV)load(context, "vkCmdDrawMeshTasksNV"); #endif /* defined(VK_NV_mesh_shader) */ #if defined(VK_NV_ray_tracing) table->vkBindAccelerationStructureMemoryNV = (PFN_vkBindAccelerationStructureMemoryNV)load(context, "vkBindAccelerationStructureMemoryNV"); table->vkCmdBuildAccelerationStructureNV = (PFN_vkCmdBuildAccelerationStructureNV)load(context, "vkCmdBuildAccelerationStructureNV"); table->vkCmdCopyAccelerationStructureNV = (PFN_vkCmdCopyAccelerationStructureNV)load(context, "vkCmdCopyAccelerationStructureNV"); table->vkCmdTraceRaysNV = (PFN_vkCmdTraceRaysNV)load(context, "vkCmdTraceRaysNV"); table->vkCmdWriteAccelerationStructuresPropertiesNV = (PFN_vkCmdWriteAccelerationStructuresPropertiesNV)load( context, "vkCmdWriteAccelerationStructuresPropertiesNV"); table->vkCompileDeferredNV = (PFN_vkCompileDeferredNV)load(context, "vkCompileDeferredNV"); table->vkCreateAccelerationStructureNV = (PFN_vkCreateAccelerationStructureNV)load(context, "vkCreateAccelerationStructureNV"); table->vkCreateRayTracingPipelinesNV = (PFN_vkCreateRayTracingPipelinesNV)load(context, "vkCreateRayTracingPipelinesNV"); table->vkDestroyAccelerationStructureNV = (PFN_vkDestroyAccelerationStructureNV)load(context, "vkDestroyAccelerationStructureNV"); table->vkGetAccelerationStructureHandleNV = (PFN_vkGetAccelerationStructureHandleNV)load(context, "vkGetAccelerationStructureHandleNV"); table->vkGetAccelerationStructureMemoryRequirementsNV = (PFN_vkGetAccelerationStructureMemoryRequirementsNV)load( context, "vkGetAccelerationStructureMemoryRequirementsNV"); table->vkGetRayTracingShaderGroupHandlesNV = (PFN_vkGetRayTracingShaderGroupHandlesNV)load(context, "vkGetRayTracingShaderGroupHandlesNV"); #endif /* defined(VK_NV_ray_tracing) */ #if defined(VK_NV_scissor_exclusive) table->vkCmdSetExclusiveScissorNV = (PFN_vkCmdSetExclusiveScissorNV)load(context, "vkCmdSetExclusiveScissorNV"); #endif /* defined(VK_NV_scissor_exclusive) */ #if defined(VK_NV_shading_rate_image) table->vkCmdBindShadingRateImageNV = (PFN_vkCmdBindShadingRateImageNV)load(context, "vkCmdBindShadingRateImageNV"); table->vkCmdSetCoarseSampleOrderNV = (PFN_vkCmdSetCoarseSampleOrderNV)load(context, "vkCmdSetCoarseSampleOrderNV"); table->vkCmdSetViewportShadingRatePaletteNV = (PFN_vkCmdSetViewportShadingRatePaletteNV)load( context, "vkCmdSetViewportShadingRatePaletteNV"); #endif /* defined(VK_NV_shading_rate_image) */ #if (defined(VK_EXT_full_screen_exclusive) && defined(VK_KHR_device_group)) || \ (defined(VK_EXT_full_screen_exclusive) && defined(VK_VERSION_1_1)) table->vkGetDeviceGroupSurfacePresentModes2EXT = (PFN_vkGetDeviceGroupSurfacePresentModes2EXT)load(context, "vkGetDeviceGroupSurfacePresentModes2EXT"); #endif /* (defined(VK_EXT_full_screen_exclusive) && defined(VK_KHR_device_group)) || \ (defined(VK_EXT_full_screen_exclusive) && defined(VK_VERSION_1_1)) */ #if (defined(VK_KHR_descriptor_update_template) && defined(VK_KHR_push_descriptor)) || \ (defined(VK_KHR_push_descriptor) && defined(VK_VERSION_1_1)) || \ (defined(VK_KHR_push_descriptor) && defined(VK_KHR_descriptor_update_template)) table->vkCmdPushDescriptorSetWithTemplateKHR = (PFN_vkCmdPushDescriptorSetWithTemplateKHR)load( context, "vkCmdPushDescriptorSetWithTemplateKHR"); #endif /* (defined(VK_KHR_descriptor_update_template) && defined(VK_KHR_push_descriptor)) || \ (defined(VK_KHR_push_descriptor) && defined(VK_VERSION_1_1)) || \ (defined(VK_KHR_push_descriptor) && defined(VK_KHR_descriptor_update_template)) */ #if (defined(VK_KHR_device_group) && defined(VK_KHR_surface)) || \ (defined(VK_KHR_swapchain) && defined(VK_VERSION_1_1)) table->vkGetDeviceGroupPresentCapabilitiesKHR = (PFN_vkGetDeviceGroupPresentCapabilitiesKHR)load( context, "vkGetDeviceGroupPresentCapabilitiesKHR"); table->vkGetDeviceGroupSurfacePresentModesKHR = (PFN_vkGetDeviceGroupSurfacePresentModesKHR)load( context, "vkGetDeviceGroupSurfacePresentModesKHR"); #endif /* (defined(VK_KHR_device_group) && defined(VK_KHR_surface)) || (defined(VK_KHR_swapchain) \ && defined(VK_VERSION_1_1)) */ #if (defined(VK_KHR_device_group) && defined(VK_KHR_swapchain)) || \ (defined(VK_KHR_swapchain) && defined(VK_VERSION_1_1)) table->vkAcquireNextImage2KHR = (PFN_vkAcquireNextImage2KHR)load(context, "vkAcquireNextImage2KHR"); #endif /* (defined(VK_KHR_device_group) && defined(VK_KHR_swapchain)) || \ (defined(VK_KHR_swapchain) && defined(VK_VERSION_1_1)) */ /* IGL_GENERATE_LOAD_DEVICE_TABLE */ } #ifdef __cplusplus } #endif ================================================ FILE: src/igl/vulkan/VulkanFunctionTable.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // Vulkan functions tables, supplementary for volk. #pragma once #if !defined(VK_NO_PROTOTYPES) #define VK_NO_PROTOTYPES #endif // !defined(VK_NO_PROTOTYPES) #if defined(IGL_CMAKE_BUILD) #include #else #if defined(VK_USE_PLATFORM_WIN32_KHR) #include #include /* When VK_USE_PLATFORM_WIN32_KHR is defined, instead of including vulkan.h directly, we include * individual parts of the SDK This is necessary to avoid including which is very * heavy * - it takes 200ms to parse without WIN32_LEAN_AND_MEAN and 100ms to parse with it. * vulkan_win32.h only needs a few symbols that are easy to redefine ourselves. */ typedef unsigned long DWORD; typedef const wchar_t* LPCWSTR; typedef void* HANDLE; typedef struct HINSTANCE__* HINSTANCE; typedef struct HWND__* HWND; typedef struct HMONITOR__* HMONITOR; typedef struct _SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES; #include #ifdef VK_ENABLE_BETA_EXTENSIONS #include #endif #else #include // NOLINT(facebook-unused-include-check) #endif #endif #ifdef __cplusplus extern "C" { #endif /** @brief Vulkan function table. On some systems, multiple Vulkan loaders can be executed, which * may cause a different set of functions to be loaded or unloaded after a Vulkan context has been * created. This structure stores one set of functions that can be used to call Vulkan functions * for one session. It is populated by the `loadVulkanLoaderFunctions()` function declared in this * file. */ struct VulkanFunctionTable { /* IGL_GENERATE_FUNCTION_TABLE */ // VK_VERSION_1_0 PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers; PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets; PFN_vkAllocateMemory vkAllocateMemory; PFN_vkBeginCommandBuffer vkBeginCommandBuffer; PFN_vkBindBufferMemory vkBindBufferMemory; PFN_vkBindImageMemory vkBindImageMemory; PFN_vkCmdBeginQuery vkCmdBeginQuery; PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass; PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets; PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer; PFN_vkCmdBindPipeline vkCmdBindPipeline; PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers; PFN_vkCmdBlitImage vkCmdBlitImage; PFN_vkCmdClearAttachments vkCmdClearAttachments; PFN_vkCmdClearColorImage vkCmdClearColorImage; PFN_vkCmdClearDepthStencilImage vkCmdClearDepthStencilImage; PFN_vkCmdCopyBuffer vkCmdCopyBuffer; PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage; PFN_vkCmdCopyImage vkCmdCopyImage; PFN_vkCmdCopyImageToBuffer vkCmdCopyImageToBuffer; PFN_vkCmdCopyQueryPoolResults vkCmdCopyQueryPoolResults; PFN_vkCmdDispatch vkCmdDispatch; PFN_vkCmdDispatchIndirect vkCmdDispatchIndirect; PFN_vkCmdDraw vkCmdDraw; PFN_vkCmdDrawIndexed vkCmdDrawIndexed; PFN_vkCmdDrawIndexedIndirect vkCmdDrawIndexedIndirect; PFN_vkCmdDrawIndirect vkCmdDrawIndirect; PFN_vkCmdDrawMeshTasksEXT vkCmdDrawMeshTasksEXT; PFN_vkCmdEndQuery vkCmdEndQuery; PFN_vkCmdEndRenderPass vkCmdEndRenderPass; PFN_vkCmdExecuteCommands vkCmdExecuteCommands; PFN_vkCmdFillBuffer vkCmdFillBuffer; PFN_vkCmdNextSubpass vkCmdNextSubpass; PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier; PFN_vkCmdPushConstants vkCmdPushConstants; PFN_vkCmdResetEvent vkCmdResetEvent; PFN_vkCmdResetQueryPool vkCmdResetQueryPool; PFN_vkCmdResolveImage vkCmdResolveImage; PFN_vkCmdSetBlendConstants vkCmdSetBlendConstants; PFN_vkCmdSetDepthBias vkCmdSetDepthBias; PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds; PFN_vkCmdSetEvent vkCmdSetEvent; PFN_vkCmdSetLineWidth vkCmdSetLineWidth; PFN_vkCmdSetScissor vkCmdSetScissor; PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask; PFN_vkCmdSetStencilReference vkCmdSetStencilReference; PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask; PFN_vkCmdSetViewport vkCmdSetViewport; PFN_vkCmdUpdateBuffer vkCmdUpdateBuffer; PFN_vkCmdWaitEvents vkCmdWaitEvents; PFN_vkCmdWriteTimestamp vkCmdWriteTimestamp; PFN_vkCreateBuffer vkCreateBuffer; PFN_vkCreateBufferView vkCreateBufferView; PFN_vkCreateCommandPool vkCreateCommandPool; PFN_vkCreateComputePipelines vkCreateComputePipelines; PFN_vkCreateDescriptorPool vkCreateDescriptorPool; PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout; PFN_vkCreateDevice vkCreateDevice; PFN_vkCreateEvent vkCreateEvent; PFN_vkCreateFence vkCreateFence; PFN_vkCreateFramebuffer vkCreateFramebuffer; PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines; PFN_vkCreateImage vkCreateImage; PFN_vkCreateImageView vkCreateImageView; PFN_vkCreateInstance vkCreateInstance; PFN_vkCreatePipelineCache vkCreatePipelineCache; PFN_vkCreatePipelineLayout vkCreatePipelineLayout; PFN_vkCreateQueryPool vkCreateQueryPool; PFN_vkCreateRenderPass vkCreateRenderPass; PFN_vkCreateSampler vkCreateSampler; PFN_vkCreateSemaphore vkCreateSemaphore; PFN_vkCreateShaderModule vkCreateShaderModule; PFN_vkDestroyBuffer vkDestroyBuffer; PFN_vkDestroyBufferView vkDestroyBufferView; PFN_vkDestroyCommandPool vkDestroyCommandPool; PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool; PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout; PFN_vkDestroyDevice vkDestroyDevice; PFN_vkDestroyEvent vkDestroyEvent; PFN_vkDestroyFence vkDestroyFence; PFN_vkDestroyFramebuffer vkDestroyFramebuffer; PFN_vkDestroyImage vkDestroyImage; PFN_vkDestroyImageView vkDestroyImageView; PFN_vkDestroyInstance vkDestroyInstance; PFN_vkDestroyPipeline vkDestroyPipeline; PFN_vkDestroyPipelineCache vkDestroyPipelineCache; PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout; PFN_vkDestroyQueryPool vkDestroyQueryPool; PFN_vkDestroyRenderPass vkDestroyRenderPass; PFN_vkDestroySampler vkDestroySampler; PFN_vkDestroySemaphore vkDestroySemaphore; PFN_vkDestroyShaderModule vkDestroyShaderModule; PFN_vkDeviceWaitIdle vkDeviceWaitIdle; PFN_vkEndCommandBuffer vkEndCommandBuffer; PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties; PFN_vkEnumerateDeviceLayerProperties vkEnumerateDeviceLayerProperties; PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties; PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties; PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices; PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges; PFN_vkFreeCommandBuffers vkFreeCommandBuffers; PFN_vkFreeDescriptorSets vkFreeDescriptorSets; PFN_vkFreeMemory vkFreeMemory; PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements; PFN_vkGetDeviceMemoryCommitment vkGetDeviceMemoryCommitment; PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr; PFN_vkGetDeviceQueue vkGetDeviceQueue; PFN_vkGetEventStatus vkGetEventStatus; PFN_vkGetFenceStatus vkGetFenceStatus; PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements; PFN_vkGetImageSparseMemoryRequirements vkGetImageSparseMemoryRequirements; PFN_vkGetImageSubresourceLayout vkGetImageSubresourceLayout; PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr; PFN_vkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFeatures; PFN_vkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceFormatProperties; PFN_vkGetPhysicalDeviceImageFormatProperties vkGetPhysicalDeviceImageFormatProperties; PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties; PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties; PFN_vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceQueueFamilyProperties; PFN_vkGetPhysicalDeviceSparseImageFormatProperties vkGetPhysicalDeviceSparseImageFormatProperties; PFN_vkGetPipelineCacheData vkGetPipelineCacheData; PFN_vkGetQueryPoolResults vkGetQueryPoolResults; PFN_vkGetRenderAreaGranularity vkGetRenderAreaGranularity; PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges; PFN_vkMapMemory vkMapMemory; PFN_vkMergePipelineCaches vkMergePipelineCaches; PFN_vkQueueBindSparse vkQueueBindSparse; PFN_vkQueueSubmit vkQueueSubmit; PFN_vkQueueWaitIdle vkQueueWaitIdle; PFN_vkResetCommandBuffer vkResetCommandBuffer; PFN_vkResetCommandPool vkResetCommandPool; PFN_vkResetDescriptorPool vkResetDescriptorPool; PFN_vkResetEvent vkResetEvent; PFN_vkResetFences vkResetFences; PFN_vkSetEvent vkSetEvent; PFN_vkUnmapMemory vkUnmapMemory; PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets; PFN_vkWaitForFences vkWaitForFences; // VK_VERSION_1_1 PFN_vkBindBufferMemory2 vkBindBufferMemory2; PFN_vkBindImageMemory2 vkBindImageMemory2; PFN_vkCmdDispatchBase vkCmdDispatchBase; PFN_vkCmdSetDeviceMask vkCmdSetDeviceMask; PFN_vkCreateDescriptorUpdateTemplate vkCreateDescriptorUpdateTemplate; PFN_vkCreateSamplerYcbcrConversion vkCreateSamplerYcbcrConversion; PFN_vkDestroyDescriptorUpdateTemplate vkDestroyDescriptorUpdateTemplate; PFN_vkDestroySamplerYcbcrConversion vkDestroySamplerYcbcrConversion; PFN_vkEnumerateInstanceVersion vkEnumerateInstanceVersion; PFN_vkEnumeratePhysicalDeviceGroups vkEnumeratePhysicalDeviceGroups; PFN_vkGetBufferMemoryRequirements2 vkGetBufferMemoryRequirements2; PFN_vkGetDescriptorSetLayoutSupport vkGetDescriptorSetLayoutSupport; PFN_vkGetDeviceGroupPeerMemoryFeatures vkGetDeviceGroupPeerMemoryFeatures; PFN_vkGetDeviceQueue2 vkGetDeviceQueue2; PFN_vkGetImageMemoryRequirements2 vkGetImageMemoryRequirements2; PFN_vkGetImageSparseMemoryRequirements2 vkGetImageSparseMemoryRequirements2; PFN_vkGetPhysicalDeviceExternalBufferProperties vkGetPhysicalDeviceExternalBufferProperties; PFN_vkGetPhysicalDeviceExternalFenceProperties vkGetPhysicalDeviceExternalFenceProperties; PFN_vkGetPhysicalDeviceExternalSemaphoreProperties vkGetPhysicalDeviceExternalSemaphoreProperties; PFN_vkGetPhysicalDeviceFeatures2 vkGetPhysicalDeviceFeatures2; PFN_vkGetPhysicalDeviceFormatProperties2 vkGetPhysicalDeviceFormatProperties2; PFN_vkGetPhysicalDeviceImageFormatProperties2 vkGetPhysicalDeviceImageFormatProperties2; PFN_vkGetPhysicalDeviceMemoryProperties2 vkGetPhysicalDeviceMemoryProperties2; PFN_vkGetPhysicalDeviceProperties2 vkGetPhysicalDeviceProperties2; PFN_vkGetPhysicalDeviceQueueFamilyProperties2 vkGetPhysicalDeviceQueueFamilyProperties2; PFN_vkGetPhysicalDeviceSparseImageFormatProperties2 vkGetPhysicalDeviceSparseImageFormatProperties2; PFN_vkTrimCommandPool vkTrimCommandPool; PFN_vkUpdateDescriptorSetWithTemplate vkUpdateDescriptorSetWithTemplate; // VK_VERSION_1_2 PFN_vkCmdBeginRenderPass2 vkCmdBeginRenderPass2; PFN_vkCmdDrawIndexedIndirectCount vkCmdDrawIndexedIndirectCount; PFN_vkCmdDrawIndirectCount vkCmdDrawIndirectCount; PFN_vkCmdEndRenderPass2 vkCmdEndRenderPass2; PFN_vkCmdNextSubpass2 vkCmdNextSubpass2; PFN_vkCreateRenderPass2 vkCreateRenderPass2; PFN_vkGetBufferDeviceAddress vkGetBufferDeviceAddress; PFN_vkGetBufferOpaqueCaptureAddress vkGetBufferOpaqueCaptureAddress; PFN_vkGetDeviceMemoryOpaqueCaptureAddress vkGetDeviceMemoryOpaqueCaptureAddress; PFN_vkGetSemaphoreCounterValue vkGetSemaphoreCounterValue; PFN_vkResetQueryPool vkResetQueryPool; PFN_vkSignalSemaphore vkSignalSemaphore; PFN_vkWaitSemaphores vkWaitSemaphores; #if defined(VK_VERSION_1_3) PFN_vkCmdBeginRendering vkCmdBeginRendering; PFN_vkCmdBindVertexBuffers2 vkCmdBindVertexBuffers2; PFN_vkCmdBlitImage2 vkCmdBlitImage2; PFN_vkCmdCopyBuffer2 vkCmdCopyBuffer2; PFN_vkCmdCopyBufferToImage2 vkCmdCopyBufferToImage2; PFN_vkCmdCopyImage2 vkCmdCopyImage2; PFN_vkCmdCopyImageToBuffer2 vkCmdCopyImageToBuffer2; PFN_vkCmdEndRendering vkCmdEndRendering; PFN_vkCmdPipelineBarrier2 vkCmdPipelineBarrier2; PFN_vkCmdResetEvent2 vkCmdResetEvent2; PFN_vkCmdResolveImage2 vkCmdResolveImage2; PFN_vkCmdSetCullMode vkCmdSetCullMode; PFN_vkCmdSetDepthBiasEnable vkCmdSetDepthBiasEnable; PFN_vkCmdSetDepthBoundsTestEnable vkCmdSetDepthBoundsTestEnable; PFN_vkCmdSetDepthCompareOp vkCmdSetDepthCompareOp; PFN_vkCmdSetDepthTestEnable vkCmdSetDepthTestEnable; PFN_vkCmdSetDepthWriteEnable vkCmdSetDepthWriteEnable; PFN_vkCmdSetEvent2 vkCmdSetEvent2; PFN_vkCmdSetFrontFace vkCmdSetFrontFace; PFN_vkCmdSetPrimitiveRestartEnable vkCmdSetPrimitiveRestartEnable; PFN_vkCmdSetPrimitiveTopology vkCmdSetPrimitiveTopology; PFN_vkCmdSetRasterizerDiscardEnable vkCmdSetRasterizerDiscardEnable; PFN_vkCmdSetScissorWithCount vkCmdSetScissorWithCount; PFN_vkCmdSetStencilOp vkCmdSetStencilOp; PFN_vkCmdSetStencilTestEnable vkCmdSetStencilTestEnable; PFN_vkCmdSetViewportWithCount vkCmdSetViewportWithCount; PFN_vkCmdWaitEvents2 vkCmdWaitEvents2; PFN_vkCmdWriteTimestamp2 vkCmdWriteTimestamp2; PFN_vkCreatePrivateDataSlot vkCreatePrivateDataSlot; PFN_vkDestroyPrivateDataSlot vkDestroyPrivateDataSlot; PFN_vkGetDeviceBufferMemoryRequirements vkGetDeviceBufferMemoryRequirements; PFN_vkGetDeviceImageMemoryRequirements vkGetDeviceImageMemoryRequirements; PFN_vkGetDeviceImageSparseMemoryRequirements vkGetDeviceImageSparseMemoryRequirements; PFN_vkGetPhysicalDeviceToolProperties vkGetPhysicalDeviceToolProperties; PFN_vkGetPrivateData vkGetPrivateData; PFN_vkQueueSubmit2 vkQueueSubmit2; PFN_vkSetPrivateData vkSetPrivateData; #else PFN_vkVoidFunction ignoreAlignment4[37]; #endif /* defined(VK_VERSION_1_3) */ #if defined(VK_AMD_buffer_marker) PFN_vkCmdWriteBufferMarkerAMD vkCmdWriteBufferMarkerAMD; #else PFN_vkVoidFunction ignoreAlignment5; #endif /* defined(VK_AMD_buffer_marker) */ #if defined(VK_AMD_display_native_hdr) PFN_vkSetLocalDimmingAMD vkSetLocalDimmingAMD; #else PFN_vkVoidFunction ignoreAlignment6; #endif /* defined(VK_AMD_display_native_hdr) */ #if defined(VK_AMD_draw_indirect_count) PFN_vkCmdDrawIndexedIndirectCountAMD vkCmdDrawIndexedIndirectCountAMD; PFN_vkCmdDrawIndirectCountAMD vkCmdDrawIndirectCountAMD; #else PFN_vkVoidFunction ignoreAlignment7[2]; #endif /* defined(VK_AMD_draw_indirect_count) */ #if defined(VK_AMD_shader_info) PFN_vkGetShaderInfoAMD vkGetShaderInfoAMD; #else PFN_vkVoidFunction ignoreAlignment8; #endif /* defined(VK_AMD_shader_info) */ #if defined(VK_ANDROID_external_memory_android_hardware_buffer) PFN_vkGetAndroidHardwareBufferPropertiesANDROID vkGetAndroidHardwareBufferPropertiesANDROID; PFN_vkGetMemoryAndroidHardwareBufferANDROID vkGetMemoryAndroidHardwareBufferANDROID; #else PFN_vkVoidFunction ignoreAlignment9[2]; #endif /* defined(VK_ANDROID_external_memory_android_hardware_buffer) */ #if defined(VK_EXT_acquire_drm_display) PFN_vkAcquireDrmDisplayEXT vkAcquireDrmDisplayEXT; PFN_vkGetDrmDisplayEXT vkGetDrmDisplayEXT; #else PFN_vkVoidFunction ignoreAlignment10[2]; #endif /* defined(VK_EXT_acquire_drm_display) */ #if defined(VK_EXT_acquire_xlib_display) PFN_vkAcquireXlibDisplayEXT vkAcquireXlibDisplayEXT; PFN_vkGetRandROutputDisplayEXT vkGetRandROutputDisplayEXT; #else PFN_vkVoidFunction ignoreAlignment11[2]; #endif /* defined(VK_EXT_acquire_xlib_display) */ #if defined(VK_EXT_buffer_device_address) PFN_vkGetBufferDeviceAddressEXT vkGetBufferDeviceAddressEXT; #else PFN_vkVoidFunction ignoreAlignment12; #endif /* defined(VK_EXT_buffer_device_address) */ #if defined(VK_EXT_calibrated_timestamps) PFN_vkGetCalibratedTimestampsEXT vkGetCalibratedTimestampsEXT; PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT vkGetPhysicalDeviceCalibrateableTimeDomainsEXT; #else PFN_vkVoidFunction ignoreAlignment13[2]; #endif /* defined(VK_EXT_calibrated_timestamps) */ #if defined(VK_EXT_color_write_enable) PFN_vkCmdSetColorWriteEnableEXT vkCmdSetColorWriteEnableEXT; #else PFN_vkVoidFunction ignoreAlignment14; #endif /* defined(VK_EXT_color_write_enable) */ #if defined(VK_EXT_conditional_rendering) PFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT; PFN_vkCmdEndConditionalRenderingEXT vkCmdEndConditionalRenderingEXT; #else PFN_vkVoidFunction ignoreAlignment15[2]; #endif /* defined(VK_EXT_conditional_rendering) */ #if defined(VK_EXT_debug_marker) PFN_vkCmdDebugMarkerBeginEXT vkCmdDebugMarkerBeginEXT; PFN_vkCmdDebugMarkerEndEXT vkCmdDebugMarkerEndEXT; PFN_vkCmdDebugMarkerInsertEXT vkCmdDebugMarkerInsertEXT; PFN_vkDebugMarkerSetObjectNameEXT vkDebugMarkerSetObjectNameEXT; PFN_vkDebugMarkerSetObjectTagEXT vkDebugMarkerSetObjectTagEXT; #else PFN_vkVoidFunction ignoreAlignment16[5]; #endif /* defined(VK_EXT_debug_marker) */ #if defined(VK_EXT_debug_report) PFN_vkCreateDebugReportCallbackEXT vkCreateDebugReportCallbackEXT; PFN_vkDebugReportMessageEXT vkDebugReportMessageEXT; PFN_vkDestroyDebugReportCallbackEXT vkDestroyDebugReportCallbackEXT; #else PFN_vkVoidFunction ignoreAlignment17[3]; #endif /* defined(VK_EXT_debug_report) */ #if defined(VK_EXT_debug_utils) PFN_vkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabelEXT; PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT; PFN_vkCmdInsertDebugUtilsLabelEXT vkCmdInsertDebugUtilsLabelEXT; PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT; PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT; PFN_vkQueueBeginDebugUtilsLabelEXT vkQueueBeginDebugUtilsLabelEXT; PFN_vkQueueEndDebugUtilsLabelEXT vkQueueEndDebugUtilsLabelEXT; PFN_vkQueueInsertDebugUtilsLabelEXT vkQueueInsertDebugUtilsLabelEXT; PFN_vkSetDebugUtilsObjectNameEXT vkSetDebugUtilsObjectNameEXT; PFN_vkSetDebugUtilsObjectTagEXT vkSetDebugUtilsObjectTagEXT; PFN_vkSubmitDebugUtilsMessageEXT vkSubmitDebugUtilsMessageEXT; #else PFN_vkVoidFunction ignoreAlignment18[11]; #endif /* defined(VK_EXT_debug_utils) */ #if defined(VK_EXT_direct_mode_display) PFN_vkReleaseDisplayEXT vkReleaseDisplayEXT; #else PFN_vkVoidFunction ignoreAlignment19; #endif /* defined(VK_EXT_direct_mode_display) */ #if defined(VK_EXT_directfb_surface) PFN_vkCreateDirectFBSurfaceEXT vkCreateDirectFBSurfaceEXT; PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT vkGetPhysicalDeviceDirectFBPresentationSupportEXT; #else PFN_vkVoidFunction ignoreAlignment20[2]; #endif /* defined(VK_EXT_directfb_surface) */ #if defined(VK_EXT_discard_rectangles) PFN_vkCmdSetDiscardRectangleEXT vkCmdSetDiscardRectangleEXT; #else PFN_vkVoidFunction ignoreAlignment21; #endif /* defined(VK_EXT_discard_rectangles) */ #if defined(VK_EXT_display_control) PFN_vkDisplayPowerControlEXT vkDisplayPowerControlEXT; PFN_vkGetSwapchainCounterEXT vkGetSwapchainCounterEXT; PFN_vkRegisterDeviceEventEXT vkRegisterDeviceEventEXT; PFN_vkRegisterDisplayEventEXT vkRegisterDisplayEventEXT; #else PFN_vkVoidFunction ignoreAlignment22[4]; #endif /* defined(VK_EXT_display_control) */ #if defined(VK_EXT_display_surface_counter) PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT vkGetPhysicalDeviceSurfaceCapabilities2EXT; #else PFN_vkVoidFunction ignoreAlignment23; #endif /* defined(VK_EXT_display_surface_counter) */ #if defined(VK_EXT_extended_dynamic_state) PFN_vkCmdBindVertexBuffers2EXT vkCmdBindVertexBuffers2EXT; PFN_vkCmdSetCullModeEXT vkCmdSetCullModeEXT; PFN_vkCmdSetDepthBoundsTestEnableEXT vkCmdSetDepthBoundsTestEnableEXT; PFN_vkCmdSetDepthCompareOpEXT vkCmdSetDepthCompareOpEXT; PFN_vkCmdSetDepthTestEnableEXT vkCmdSetDepthTestEnableEXT; PFN_vkCmdSetDepthWriteEnableEXT vkCmdSetDepthWriteEnableEXT; PFN_vkCmdSetFrontFaceEXT vkCmdSetFrontFaceEXT; PFN_vkCmdSetPrimitiveTopologyEXT vkCmdSetPrimitiveTopologyEXT; PFN_vkCmdSetScissorWithCountEXT vkCmdSetScissorWithCountEXT; PFN_vkCmdSetStencilOpEXT vkCmdSetStencilOpEXT; PFN_vkCmdSetStencilTestEnableEXT vkCmdSetStencilTestEnableEXT; PFN_vkCmdSetViewportWithCountEXT vkCmdSetViewportWithCountEXT; #else PFN_vkVoidFunction ignoreAlignment24[12]; #endif /* defined(VK_EXT_extended_dynamic_state) */ #if defined(VK_EXT_extended_dynamic_state2) PFN_vkCmdSetDepthBiasEnableEXT vkCmdSetDepthBiasEnableEXT; PFN_vkCmdSetLogicOpEXT vkCmdSetLogicOpEXT; PFN_vkCmdSetPatchControlPointsEXT vkCmdSetPatchControlPointsEXT; PFN_vkCmdSetPrimitiveRestartEnableEXT vkCmdSetPrimitiveRestartEnableEXT; PFN_vkCmdSetRasterizerDiscardEnableEXT vkCmdSetRasterizerDiscardEnableEXT; #else PFN_vkVoidFunction ignoreAlignment25[5]; #endif /* defined(VK_EXT_extended_dynamic_state2) */ #if defined(VK_EXT_external_memory_host) PFN_vkGetMemoryHostPointerPropertiesEXT vkGetMemoryHostPointerPropertiesEXT; #else PFN_vkVoidFunction ignoreAlignment26; #endif /* defined(VK_EXT_external_memory_host) */ #if defined(VK_EXT_full_screen_exclusive) PFN_vkAcquireFullScreenExclusiveModeEXT vkAcquireFullScreenExclusiveModeEXT; PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT vkGetPhysicalDeviceSurfacePresentModes2EXT; PFN_vkReleaseFullScreenExclusiveModeEXT vkReleaseFullScreenExclusiveModeEXT; #else PFN_vkVoidFunction ignoreAlignment27[3]; #endif /* defined(VK_EXT_full_screen_exclusive) */ #if defined(VK_EXT_hdr_metadata) PFN_vkSetHdrMetadataEXT vkSetHdrMetadataEXT; #else PFN_vkVoidFunction ignoreAlignment28; #endif /* defined(VK_EXT_hdr_metadata) */ #if defined(VK_EXT_headless_surface) PFN_vkCreateHeadlessSurfaceEXT vkCreateHeadlessSurfaceEXT; #else PFN_vkVoidFunction ignoreAlignment29; #endif /* defined(VK_EXT_headless_surface) */ #if defined(VK_EXT_host_query_reset) PFN_vkResetQueryPoolEXT vkResetQueryPoolEXT; #else PFN_vkVoidFunction ignoreAlignment30; #endif /* defined(VK_EXT_host_query_reset) */ #if defined(VK_EXT_image_drm_format_modifier) PFN_vkGetImageDrmFormatModifierPropertiesEXT vkGetImageDrmFormatModifierPropertiesEXT; #else PFN_vkVoidFunction ignoreAlignment31; #endif /* defined(VK_EXT_image_drm_format_modifier) */ #if defined(VK_EXT_line_rasterization) PFN_vkCmdSetLineStippleEXT vkCmdSetLineStippleEXT; #else PFN_vkVoidFunction ignoreAlignment32; #endif /* defined(VK_EXT_line_rasterization) */ #if defined(VK_EXT_metal_surface) PFN_vkCreateMetalSurfaceEXT vkCreateMetalSurfaceEXT; #else PFN_vkVoidFunction ignoreAlignment33; #endif /* defined(VK_EXT_metal_surface) */ #if defined(VK_EXT_multi_draw) PFN_vkCmdDrawMultiEXT vkCmdDrawMultiEXT; PFN_vkCmdDrawMultiIndexedEXT vkCmdDrawMultiIndexedEXT; #else PFN_vkVoidFunction ignoreAlignment34[2]; #endif /* defined(VK_EXT_multi_draw) */ #if defined(VK_EXT_pageable_device_local_memory) PFN_vkSetDeviceMemoryPriorityEXT vkSetDeviceMemoryPriorityEXT; #else PFN_vkVoidFunction ignoreAlignment35; #endif /* defined(VK_EXT_pageable_device_local_memory) */ #if defined(VK_EXT_private_data) PFN_vkCreatePrivateDataSlotEXT vkCreatePrivateDataSlotEXT; PFN_vkDestroyPrivateDataSlotEXT vkDestroyPrivateDataSlotEXT; PFN_vkGetPrivateDataEXT vkGetPrivateDataEXT; PFN_vkSetPrivateDataEXT vkSetPrivateDataEXT; #else PFN_vkVoidFunction ignoreAlignment36[4]; #endif /* defined(VK_EXT_private_data) */ #if defined(VK_EXT_sample_locations) PFN_vkCmdSetSampleLocationsEXT vkCmdSetSampleLocationsEXT; PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT vkGetPhysicalDeviceMultisamplePropertiesEXT; #else PFN_vkVoidFunction ignoreAlignment37[2]; #endif /* defined(VK_EXT_sample_locations) */ #if defined(VK_EXT_tooling_info) PFN_vkGetPhysicalDeviceToolPropertiesEXT vkGetPhysicalDeviceToolPropertiesEXT; #else PFN_vkVoidFunction ignoreAlignment38; #endif /* defined(VK_EXT_tooling_info) */ #if defined(VK_EXT_transform_feedback) PFN_vkCmdBeginQueryIndexedEXT vkCmdBeginQueryIndexedEXT; PFN_vkCmdBeginTransformFeedbackEXT vkCmdBeginTransformFeedbackEXT; PFN_vkCmdBindTransformFeedbackBuffersEXT vkCmdBindTransformFeedbackBuffersEXT; PFN_vkCmdDrawIndirectByteCountEXT vkCmdDrawIndirectByteCountEXT; PFN_vkCmdEndQueryIndexedEXT vkCmdEndQueryIndexedEXT; PFN_vkCmdEndTransformFeedbackEXT vkCmdEndTransformFeedbackEXT; #else PFN_vkVoidFunction ignoreAlignment39[6]; #endif /* defined(VK_EXT_transform_feedback) */ #if defined(VK_EXT_validation_cache) PFN_vkCreateValidationCacheEXT vkCreateValidationCacheEXT; PFN_vkDestroyValidationCacheEXT vkDestroyValidationCacheEXT; PFN_vkGetValidationCacheDataEXT vkGetValidationCacheDataEXT; PFN_vkMergeValidationCachesEXT vkMergeValidationCachesEXT; #else PFN_vkVoidFunction ignoreAlignment40[4]; #endif /* defined(VK_EXT_validation_cache) */ #if defined(VK_EXT_vertex_input_dynamic_state) PFN_vkCmdSetVertexInputEXT vkCmdSetVertexInputEXT; #else PFN_vkVoidFunction ignoreAlignment41; #endif /* defined(VK_EXT_vertex_input_dynamic_state) */ #if defined(VK_FUCHSIA_buffer_collection) PFN_vkCreateBufferCollectionFUCHSIA vkCreateBufferCollectionFUCHSIA; PFN_vkDestroyBufferCollectionFUCHSIA vkDestroyBufferCollectionFUCHSIA; PFN_vkGetBufferCollectionPropertiesFUCHSIA vkGetBufferCollectionPropertiesFUCHSIA; PFN_vkSetBufferCollectionBufferConstraintsFUCHSIA vkSetBufferCollectionBufferConstraintsFUCHSIA; PFN_vkSetBufferCollectionImageConstraintsFUCHSIA vkSetBufferCollectionImageConstraintsFUCHSIA; #else PFN_vkVoidFunction ignoreAlignment42[5]; #endif /* defined(VK_FUCHSIA_buffer_collection) */ #if defined(VK_FUCHSIA_external_memory) PFN_vkGetMemoryZirconHandleFUCHSIA vkGetMemoryZirconHandleFUCHSIA; PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA vkGetMemoryZirconHandlePropertiesFUCHSIA; #else PFN_vkVoidFunction ignoreAlignment43[2]; #endif /* defined(VK_FUCHSIA_external_memory) */ #if defined(VK_FUCHSIA_external_semaphore) PFN_vkGetSemaphoreZirconHandleFUCHSIA vkGetSemaphoreZirconHandleFUCHSIA; PFN_vkImportSemaphoreZirconHandleFUCHSIA vkImportSemaphoreZirconHandleFUCHSIA; #else PFN_vkVoidFunction ignoreAlignment44[2]; #endif /* defined(VK_FUCHSIA_external_semaphore) */ #if defined(VK_FUCHSIA_imagepipe_surface) PFN_vkCreateImagePipeSurfaceFUCHSIA vkCreateImagePipeSurfaceFUCHSIA; #else PFN_vkVoidFunction ignoreAlignment45; #endif /* defined(VK_FUCHSIA_imagepipe_surface) */ #if defined(VK_GGP_stream_descriptor_surface) PFN_vkCreateStreamDescriptorSurfaceGGP vkCreateStreamDescriptorSurfaceGGP; #else PFN_vkVoidFunction ignoreAlignment46; #endif /* defined(VK_GGP_stream_descriptor_surface) */ #if defined(VK_GOOGLE_display_timing) PFN_vkGetPastPresentationTimingGOOGLE vkGetPastPresentationTimingGOOGLE; PFN_vkGetRefreshCycleDurationGOOGLE vkGetRefreshCycleDurationGOOGLE; #else PFN_vkVoidFunction ignoreAlignment47[2]; #endif /* defined(VK_GOOGLE_display_timing) */ #if defined(VK_HUAWEI_invocation_mask) PFN_vkCmdBindInvocationMaskHUAWEI vkCmdBindInvocationMaskHUAWEI; #else PFN_vkVoidFunction ignoreAlignment48; #endif /* defined(VK_HUAWEI_invocation_mask) */ #if defined(VK_HUAWEI_subpass_shading) PFN_vkCmdSubpassShadingHUAWEI vkCmdSubpassShadingHUAWEI; PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI; #else PFN_vkVoidFunction ignoreAlignment49[2]; #endif /* defined(VK_HUAWEI_subpass_shading) */ #if defined(VK_INTEL_performance_query) PFN_vkAcquirePerformanceConfigurationINTEL vkAcquirePerformanceConfigurationINTEL; PFN_vkCmdSetPerformanceMarkerINTEL vkCmdSetPerformanceMarkerINTEL; PFN_vkCmdSetPerformanceOverrideINTEL vkCmdSetPerformanceOverrideINTEL; PFN_vkCmdSetPerformanceStreamMarkerINTEL vkCmdSetPerformanceStreamMarkerINTEL; PFN_vkGetPerformanceParameterINTEL vkGetPerformanceParameterINTEL; PFN_vkInitializePerformanceApiINTEL vkInitializePerformanceApiINTEL; PFN_vkQueueSetPerformanceConfigurationINTEL vkQueueSetPerformanceConfigurationINTEL; PFN_vkReleasePerformanceConfigurationINTEL vkReleasePerformanceConfigurationINTEL; PFN_vkUninitializePerformanceApiINTEL vkUninitializePerformanceApiINTEL; #else PFN_vkVoidFunction ignoreAlignment50[9]; #endif /* defined(VK_INTEL_performance_query) */ #if defined(VK_KHR_acceleration_structure) PFN_vkBuildAccelerationStructuresKHR vkBuildAccelerationStructuresKHR; PFN_vkCmdBuildAccelerationStructuresIndirectKHR vkCmdBuildAccelerationStructuresIndirectKHR; PFN_vkCmdBuildAccelerationStructuresKHR vkCmdBuildAccelerationStructuresKHR; PFN_vkCmdCopyAccelerationStructureKHR vkCmdCopyAccelerationStructureKHR; PFN_vkCmdCopyAccelerationStructureToMemoryKHR vkCmdCopyAccelerationStructureToMemoryKHR; PFN_vkCmdCopyMemoryToAccelerationStructureKHR vkCmdCopyMemoryToAccelerationStructureKHR; PFN_vkCmdWriteAccelerationStructuresPropertiesKHR vkCmdWriteAccelerationStructuresPropertiesKHR; PFN_vkCopyAccelerationStructureKHR vkCopyAccelerationStructureKHR; PFN_vkCopyAccelerationStructureToMemoryKHR vkCopyAccelerationStructureToMemoryKHR; PFN_vkCopyMemoryToAccelerationStructureKHR vkCopyMemoryToAccelerationStructureKHR; PFN_vkCreateAccelerationStructureKHR vkCreateAccelerationStructureKHR; PFN_vkDestroyAccelerationStructureKHR vkDestroyAccelerationStructureKHR; PFN_vkGetAccelerationStructureBuildSizesKHR vkGetAccelerationStructureBuildSizesKHR; PFN_vkGetAccelerationStructureDeviceAddressKHR vkGetAccelerationStructureDeviceAddressKHR; PFN_vkGetDeviceAccelerationStructureCompatibilityKHR vkGetDeviceAccelerationStructureCompatibilityKHR; PFN_vkWriteAccelerationStructuresPropertiesKHR vkWriteAccelerationStructuresPropertiesKHR; #else PFN_vkVoidFunction ignoreAlignment51[16]; #endif /* defined(VK_KHR_acceleration_structure) */ #if defined(VK_KHR_android_surface) PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR; #else PFN_vkVoidFunction ignoreAlignment52; #endif /* defined(VK_KHR_android_surface) */ #if defined(VK_KHR_bind_memory2) PFN_vkBindBufferMemory2KHR vkBindBufferMemory2KHR; PFN_vkBindImageMemory2KHR vkBindImageMemory2KHR; #else PFN_vkVoidFunction ignoreAlignment53[2]; #endif /* defined(VK_KHR_bind_memory2) */ #if defined(VK_KHR_buffer_device_address) PFN_vkGetBufferDeviceAddressKHR vkGetBufferDeviceAddressKHR; PFN_vkGetBufferOpaqueCaptureAddressKHR vkGetBufferOpaqueCaptureAddressKHR; PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR vkGetDeviceMemoryOpaqueCaptureAddressKHR; #else PFN_vkVoidFunction ignoreAlignment54[3]; #endif /* defined(VK_KHR_buffer_device_address) */ #if defined(VK_KHR_copy_commands2) PFN_vkCmdBlitImage2KHR vkCmdBlitImage2KHR; PFN_vkCmdCopyBuffer2KHR vkCmdCopyBuffer2KHR; PFN_vkCmdCopyBufferToImage2KHR vkCmdCopyBufferToImage2KHR; PFN_vkCmdCopyImage2KHR vkCmdCopyImage2KHR; PFN_vkCmdCopyImageToBuffer2KHR vkCmdCopyImageToBuffer2KHR; PFN_vkCmdResolveImage2KHR vkCmdResolveImage2KHR; #else PFN_vkVoidFunction ignoreAlignment55[6]; #endif /* defined(VK_KHR_copy_commands2) */ #if defined(VK_KHR_create_renderpass2) PFN_vkCmdBeginRenderPass2KHR vkCmdBeginRenderPass2KHR; PFN_vkCmdEndRenderPass2KHR vkCmdEndRenderPass2KHR; PFN_vkCmdNextSubpass2KHR vkCmdNextSubpass2KHR; PFN_vkCreateRenderPass2KHR vkCreateRenderPass2KHR; #else PFN_vkVoidFunction ignoreAlignment56[4]; #endif /* defined(VK_KHR_create_renderpass2) */ #if defined(VK_KHR_deferred_host_operations) PFN_vkCreateDeferredOperationKHR vkCreateDeferredOperationKHR; PFN_vkDeferredOperationJoinKHR vkDeferredOperationJoinKHR; PFN_vkDestroyDeferredOperationKHR vkDestroyDeferredOperationKHR; PFN_vkGetDeferredOperationMaxConcurrencyKHR vkGetDeferredOperationMaxConcurrencyKHR; PFN_vkGetDeferredOperationResultKHR vkGetDeferredOperationResultKHR; #else PFN_vkVoidFunction ignoreAlignment57[5]; #endif /* defined(VK_KHR_deferred_host_operations) */ #if defined(VK_KHR_descriptor_update_template) PFN_vkCreateDescriptorUpdateTemplateKHR vkCreateDescriptorUpdateTemplateKHR; PFN_vkDestroyDescriptorUpdateTemplateKHR vkDestroyDescriptorUpdateTemplateKHR; PFN_vkUpdateDescriptorSetWithTemplateKHR vkUpdateDescriptorSetWithTemplateKHR; #else PFN_vkVoidFunction ignoreAlignment58[3]; #endif /* defined(VK_KHR_descriptor_update_template) */ #if defined(VK_KHR_device_group) PFN_vkCmdDispatchBaseKHR vkCmdDispatchBaseKHR; PFN_vkCmdSetDeviceMaskKHR vkCmdSetDeviceMaskKHR; PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR vkGetDeviceGroupPeerMemoryFeaturesKHR; #else PFN_vkVoidFunction ignoreAlignment59[3]; #endif /* defined(VK_KHR_device_group) */ #if defined(VK_KHR_device_group_creation) PFN_vkEnumeratePhysicalDeviceGroupsKHR vkEnumeratePhysicalDeviceGroupsKHR; #else PFN_vkVoidFunction ignoreAlignment60; #endif /* defined(VK_KHR_device_group_creation) */ #if defined(VK_KHR_display) PFN_vkCreateDisplayModeKHR vkCreateDisplayModeKHR; PFN_vkCreateDisplayPlaneSurfaceKHR vkCreateDisplayPlaneSurfaceKHR; PFN_vkGetDisplayModePropertiesKHR vkGetDisplayModePropertiesKHR; PFN_vkGetDisplayPlaneCapabilitiesKHR vkGetDisplayPlaneCapabilitiesKHR; PFN_vkGetDisplayPlaneSupportedDisplaysKHR vkGetDisplayPlaneSupportedDisplaysKHR; PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR vkGetPhysicalDeviceDisplayPlanePropertiesKHR; PFN_vkGetPhysicalDeviceDisplayPropertiesKHR vkGetPhysicalDeviceDisplayPropertiesKHR; #else PFN_vkVoidFunction ignoreAlignment61[7]; #endif /* defined(VK_KHR_display) */ #if defined(VK_KHR_display_swapchain) PFN_vkCreateSharedSwapchainsKHR vkCreateSharedSwapchainsKHR; #else PFN_vkVoidFunction ignoreAlignment62; #endif /* defined(VK_KHR_display_swapchain) */ #if defined(VK_KHR_draw_indirect_count) PFN_vkCmdDrawIndexedIndirectCountKHR vkCmdDrawIndexedIndirectCountKHR; PFN_vkCmdDrawIndirectCountKHR vkCmdDrawIndirectCountKHR; #else PFN_vkVoidFunction ignoreAlignment63[2]; #endif /* defined(VK_KHR_draw_indirect_count) */ #if defined(VK_KHR_dynamic_rendering) PFN_vkCmdBeginRenderingKHR vkCmdBeginRenderingKHR; PFN_vkCmdEndRenderingKHR vkCmdEndRenderingKHR; #else PFN_vkVoidFunction ignoreAlignment64[2]; #endif /* defined(VK_KHR_dynamic_rendering) */ #if defined(VK_KHR_external_fence_capabilities) PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR vkGetPhysicalDeviceExternalFencePropertiesKHR; #else PFN_vkVoidFunction ignoreAlignment65; #endif /* defined(VK_KHR_external_fence_capabilities) */ #if defined(VK_KHR_external_fence_fd) PFN_vkGetFenceFdKHR vkGetFenceFdKHR; PFN_vkImportFenceFdKHR vkImportFenceFdKHR; #else PFN_vkVoidFunction ignoreAlignment66[2]; #endif /* defined(VK_KHR_external_fence_fd) */ #if defined(VK_KHR_external_fence_win32) PFN_vkGetFenceWin32HandleKHR vkGetFenceWin32HandleKHR; PFN_vkImportFenceWin32HandleKHR vkImportFenceWin32HandleKHR; #else PFN_vkVoidFunction ignoreAlignment67[2]; #endif /* defined(VK_KHR_external_fence_win32) */ #if defined(VK_KHR_external_memory_capabilities) PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR vkGetPhysicalDeviceExternalBufferPropertiesKHR; #else PFN_vkVoidFunction ignoreAlignment68; #endif /* defined(VK_KHR_external_memory_capabilities) */ #if defined(VK_KHR_external_memory_fd) PFN_vkGetMemoryFdKHR vkGetMemoryFdKHR; PFN_vkGetMemoryFdPropertiesKHR vkGetMemoryFdPropertiesKHR; #else PFN_vkVoidFunction ignoreAlignment69[2]; #endif /* defined(VK_KHR_external_memory_fd) */ #if defined(VK_KHR_external_memory_win32) PFN_vkGetMemoryWin32HandleKHR vkGetMemoryWin32HandleKHR; PFN_vkGetMemoryWin32HandlePropertiesKHR vkGetMemoryWin32HandlePropertiesKHR; #else PFN_vkVoidFunction ignoreAlignment70[2]; #endif /* defined(VK_KHR_external_memory_win32) */ #if defined(VK_KHR_external_semaphore_capabilities) PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR vkGetPhysicalDeviceExternalSemaphorePropertiesKHR; #else PFN_vkVoidFunction ignoreAlignment71; #endif /* defined(VK_KHR_external_semaphore_capabilities) */ #if defined(VK_KHR_external_semaphore_fd) PFN_vkGetSemaphoreFdKHR vkGetSemaphoreFdKHR; PFN_vkImportSemaphoreFdKHR vkImportSemaphoreFdKHR; #else PFN_vkVoidFunction ignoreAlignment72[2]; #endif /* defined(VK_KHR_external_semaphore_fd) */ #if defined(VK_KHR_external_semaphore_win32) PFN_vkGetSemaphoreWin32HandleKHR vkGetSemaphoreWin32HandleKHR; PFN_vkImportSemaphoreWin32HandleKHR vkImportSemaphoreWin32HandleKHR; #else PFN_vkVoidFunction ignoreAlignment73[2]; #endif /* defined(VK_KHR_external_semaphore_win32) */ #if defined(VK_KHR_fragment_shading_rate) PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR; PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR vkGetPhysicalDeviceFragmentShadingRatesKHR; #else PFN_vkVoidFunction ignoreAlignment74[2]; #endif /* defined(VK_KHR_fragment_shading_rate) */ #if defined(VK_KHR_get_display_properties2) PFN_vkGetDisplayModeProperties2KHR vkGetDisplayModeProperties2KHR; PFN_vkGetDisplayPlaneCapabilities2KHR vkGetDisplayPlaneCapabilities2KHR; PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR vkGetPhysicalDeviceDisplayPlaneProperties2KHR; PFN_vkGetPhysicalDeviceDisplayProperties2KHR vkGetPhysicalDeviceDisplayProperties2KHR; #else PFN_vkVoidFunction ignoreAlignment75[4]; #endif /* defined(VK_KHR_get_display_properties2) */ #if defined(VK_KHR_get_memory_requirements2) PFN_vkGetBufferMemoryRequirements2KHR vkGetBufferMemoryRequirements2KHR; PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2KHR; PFN_vkGetImageSparseMemoryRequirements2KHR vkGetImageSparseMemoryRequirements2KHR; #else PFN_vkVoidFunction ignoreAlignment76[3]; #endif /* defined(VK_KHR_get_memory_requirements2) */ #if defined(VK_KHR_get_physical_device_properties2) PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR; PFN_vkGetPhysicalDeviceFormatProperties2KHR vkGetPhysicalDeviceFormatProperties2KHR; PFN_vkGetPhysicalDeviceImageFormatProperties2KHR vkGetPhysicalDeviceImageFormatProperties2KHR; PFN_vkGetPhysicalDeviceMemoryProperties2KHR vkGetPhysicalDeviceMemoryProperties2KHR; PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR; PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR vkGetPhysicalDeviceQueueFamilyProperties2KHR; PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR vkGetPhysicalDeviceSparseImageFormatProperties2KHR; #else PFN_vkVoidFunction ignoreAlignment77[7]; #endif /* defined(VK_KHR_get_physical_device_properties2) */ #if defined(VK_KHR_get_surface_capabilities2) PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR vkGetPhysicalDeviceSurfaceCapabilities2KHR; PFN_vkGetPhysicalDeviceSurfaceFormats2KHR vkGetPhysicalDeviceSurfaceFormats2KHR; #else PFN_vkVoidFunction ignoreAlignment78[2]; #endif /* defined(VK_KHR_get_surface_capabilities2) */ #if defined(VK_KHR_maintenance1) PFN_vkTrimCommandPoolKHR vkTrimCommandPoolKHR; #else PFN_vkVoidFunction ignoreAlignment79; #endif /* defined(VK_KHR_maintenance1) */ #if defined(VK_KHR_maintenance3) PFN_vkGetDescriptorSetLayoutSupportKHR vkGetDescriptorSetLayoutSupportKHR; #else PFN_vkVoidFunction ignoreAlignment80; #endif /* defined(VK_KHR_maintenance3) */ #if defined(VK_KHR_maintenance4) PFN_vkGetDeviceBufferMemoryRequirementsKHR vkGetDeviceBufferMemoryRequirementsKHR; PFN_vkGetDeviceImageMemoryRequirementsKHR vkGetDeviceImageMemoryRequirementsKHR; PFN_vkGetDeviceImageSparseMemoryRequirementsKHR vkGetDeviceImageSparseMemoryRequirementsKHR; #else PFN_vkVoidFunction ignoreAlignment81[3]; #endif /* defined(VK_KHR_maintenance4) */ #if defined(VK_KHR_performance_query) PFN_vkAcquireProfilingLockKHR vkAcquireProfilingLockKHR; PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR; PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR; PFN_vkReleaseProfilingLockKHR vkReleaseProfilingLockKHR; #else PFN_vkVoidFunction ignoreAlignment82[4]; #endif /* defined(VK_KHR_performance_query) */ #if defined(VK_KHR_pipeline_executable_properties) PFN_vkGetPipelineExecutableInternalRepresentationsKHR vkGetPipelineExecutableInternalRepresentationsKHR; PFN_vkGetPipelineExecutablePropertiesKHR vkGetPipelineExecutablePropertiesKHR; PFN_vkGetPipelineExecutableStatisticsKHR vkGetPipelineExecutableStatisticsKHR; #else PFN_vkVoidFunction ignoreAlignment83[3]; #endif /* defined(VK_KHR_pipeline_executable_properties) */ #if defined(VK_KHR_present_wait) PFN_vkWaitForPresentKHR vkWaitForPresentKHR; #else PFN_vkVoidFunction ignoreAlignment84; #endif /* defined(VK_KHR_present_wait) */ #if defined(VK_KHR_push_descriptor) PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR; #else PFN_vkVoidFunction ignoreAlignment85; #endif /* defined(VK_KHR_push_descriptor) */ #if defined(VK_KHR_ray_tracing_pipeline) PFN_vkCmdSetRayTracingPipelineStackSizeKHR vkCmdSetRayTracingPipelineStackSizeKHR; PFN_vkCmdTraceRaysIndirectKHR vkCmdTraceRaysIndirectKHR; PFN_vkCmdTraceRaysKHR vkCmdTraceRaysKHR; PFN_vkCreateRayTracingPipelinesKHR vkCreateRayTracingPipelinesKHR; PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR vkGetRayTracingCaptureReplayShaderGroupHandlesKHR; PFN_vkGetRayTracingShaderGroupHandlesKHR vkGetRayTracingShaderGroupHandlesKHR; PFN_vkGetRayTracingShaderGroupStackSizeKHR vkGetRayTracingShaderGroupStackSizeKHR; #else PFN_vkVoidFunction ignoreAlignment86[7]; #endif /* defined(VK_KHR_ray_tracing_pipeline) */ #if defined(VK_KHR_sampler_ycbcr_conversion) PFN_vkCreateSamplerYcbcrConversionKHR vkCreateSamplerYcbcrConversionKHR; PFN_vkDestroySamplerYcbcrConversionKHR vkDestroySamplerYcbcrConversionKHR; #else PFN_vkVoidFunction ignoreAlignment87[2]; #endif /* defined(VK_KHR_sampler_ycbcr_conversion) */ #if defined(VK_KHR_shared_presentable_image) PFN_vkGetSwapchainStatusKHR vkGetSwapchainStatusKHR; #else PFN_vkVoidFunction ignoreAlignment88; #endif /* defined(VK_KHR_shared_presentable_image) */ #if defined(VK_KHR_surface) PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR; PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR; PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR; PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR; PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR; #else PFN_vkVoidFunction ignoreAlignment89[5]; #endif /* defined(VK_KHR_surface) */ #if defined(VK_KHR_swapchain) PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR; PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR; PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR; PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR; PFN_vkQueuePresentKHR vkQueuePresentKHR; #else PFN_vkVoidFunction ignoreAlignment90[5]; #endif /* defined(VK_KHR_swapchain) */ #if defined(VK_KHR_synchronization2) PFN_vkCmdPipelineBarrier2KHR vkCmdPipelineBarrier2KHR; PFN_vkCmdResetEvent2KHR vkCmdResetEvent2KHR; PFN_vkCmdSetEvent2KHR vkCmdSetEvent2KHR; PFN_vkCmdWaitEvents2KHR vkCmdWaitEvents2KHR; PFN_vkCmdWriteTimestamp2KHR vkCmdWriteTimestamp2KHR; PFN_vkQueueSubmit2KHR vkQueueSubmit2KHR; #else PFN_vkVoidFunction ignoreAlignment91[6]; #endif /* defined(VK_KHR_synchronization2) */ #if defined(VK_KHR_synchronization2) && defined(VK_AMD_buffer_marker) PFN_vkCmdWriteBufferMarker2AMD vkCmdWriteBufferMarker2AMD; #else PFN_vkVoidFunction ignoreAlignment92; #endif /* defined(VK_KHR_synchronization2) && defined(VK_AMD_buffer_marker) */ #if defined(VK_KHR_synchronization2) && defined(VK_NV_device_diagnostic_checkpoints) PFN_vkGetQueueCheckpointData2NV vkGetQueueCheckpointData2NV; #else PFN_vkVoidFunction ignoreAlignment93; #endif /* defined(VK_KHR_synchronization2) && defined(VK_NV_device_diagnostic_checkpoints) */ #if defined(VK_KHR_timeline_semaphore) PFN_vkGetSemaphoreCounterValueKHR vkGetSemaphoreCounterValueKHR; PFN_vkSignalSemaphoreKHR vkSignalSemaphoreKHR; PFN_vkWaitSemaphoresKHR vkWaitSemaphoresKHR; #else PFN_vkVoidFunction ignoreAlignment94[3]; #endif /* defined(VK_KHR_timeline_semaphore) */ #if defined(VK_KHR_video_decode_queue) PFN_vkCmdDecodeVideoKHR vkCmdDecodeVideoKHR; #else PFN_vkVoidFunction ignoreAlignment95; #endif /* defined(VK_KHR_video_decode_queue) */ #if defined(VK_KHR_video_encode_queue) PFN_vkCmdEncodeVideoKHR vkCmdEncodeVideoKHR; #else PFN_vkVoidFunction ignoreAlignment96; #endif /* defined(VK_KHR_video_encode_queue) */ #if defined(VK_KHR_video_queue) PFN_vkBindVideoSessionMemoryKHR vkBindVideoSessionMemoryKHR; PFN_vkCmdBeginVideoCodingKHR vkCmdBeginVideoCodingKHR; PFN_vkCmdControlVideoCodingKHR vkCmdControlVideoCodingKHR; PFN_vkCmdEndVideoCodingKHR vkCmdEndVideoCodingKHR; PFN_vkCreateVideoSessionKHR vkCreateVideoSessionKHR; PFN_vkCreateVideoSessionParametersKHR vkCreateVideoSessionParametersKHR; PFN_vkDestroyVideoSessionKHR vkDestroyVideoSessionKHR; PFN_vkDestroyVideoSessionParametersKHR vkDestroyVideoSessionParametersKHR; PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR vkGetPhysicalDeviceVideoCapabilitiesKHR; PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR vkGetPhysicalDeviceVideoFormatPropertiesKHR; PFN_vkGetVideoSessionMemoryRequirementsKHR vkGetVideoSessionMemoryRequirementsKHR; PFN_vkUpdateVideoSessionParametersKHR vkUpdateVideoSessionParametersKHR; #else PFN_vkVoidFunction ignoreAlignment97[12]; #endif /* defined(VK_KHR_video_queue) */ #if defined(VK_KHR_wayland_surface) PFN_vkCreateWaylandSurfaceKHR vkCreateWaylandSurfaceKHR; PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR vkGetPhysicalDeviceWaylandPresentationSupportKHR; #else PFN_vkVoidFunction ignoreAlignment98[2]; #endif /* defined(VK_KHR_wayland_surface) */ #if defined(VK_KHR_win32_surface) PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR; PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR vkGetPhysicalDeviceWin32PresentationSupportKHR; #else PFN_vkVoidFunction ignoreAlignment99[2]; #endif /* defined(VK_KHR_win32_surface) */ #if defined(VK_KHR_xcb_surface) PFN_vkCreateXcbSurfaceKHR vkCreateXcbSurfaceKHR; PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR vkGetPhysicalDeviceXcbPresentationSupportKHR; #else PFN_vkVoidFunction ignoreAlignment100[2]; #endif /* defined(VK_KHR_xcb_surface) */ #if defined(VK_KHR_xlib_surface) PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR; PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR vkGetPhysicalDeviceXlibPresentationSupportKHR; #else PFN_vkVoidFunction ignoreAlignment101[2]; #endif /* defined(VK_KHR_xlib_surface) */ #if defined(VK_MVK_ios_surface) PFN_vkCreateIOSSurfaceMVK vkCreateIOSSurfaceMVK; #else PFN_vkVoidFunction ignoreAlignment102; #endif /* defined(VK_MVK_ios_surface) */ #if defined(VK_MVK_macos_surface) PFN_vkCreateMacOSSurfaceMVK vkCreateMacOSSurfaceMVK; #else PFN_vkVoidFunction ignoreAlignment103; #endif /* defined(VK_MVK_macos_surface) */ #if defined(VK_NN_vi_surface) PFN_vkCreateViSurfaceNN vkCreateViSurfaceNN; #else PFN_vkVoidFunction ignoreAlignment104; #endif /* defined(VK_NN_vi_surface) */ #if defined(VK_NVX_binary_import) PFN_vkCmdCuLaunchKernelNVX vkCmdCuLaunchKernelNVX; PFN_vkCreateCuFunctionNVX vkCreateCuFunctionNVX; PFN_vkCreateCuModuleNVX vkCreateCuModuleNVX; PFN_vkDestroyCuFunctionNVX vkDestroyCuFunctionNVX; PFN_vkDestroyCuModuleNVX vkDestroyCuModuleNVX; #else PFN_vkVoidFunction ignoreAlignment105[5]; #endif /* defined(VK_NVX_binary_import) */ #if defined(VK_NVX_image_view_handle) PFN_vkGetImageViewAddressNVX vkGetImageViewAddressNVX; PFN_vkGetImageViewHandleNVX vkGetImageViewHandleNVX; #else PFN_vkVoidFunction ignoreAlignment106[2]; #endif /* defined(VK_NVX_image_view_handle) */ #if defined(VK_NV_acquire_winrt_display) PFN_vkAcquireWinrtDisplayNV vkAcquireWinrtDisplayNV; PFN_vkGetWinrtDisplayNV vkGetWinrtDisplayNV; #else PFN_vkVoidFunction ignoreAlignment107[2]; #endif /* defined(VK_NV_acquire_winrt_display) */ #if defined(VK_NV_clip_space_w_scaling) PFN_vkCmdSetViewportWScalingNV vkCmdSetViewportWScalingNV; #else PFN_vkVoidFunction ignoreAlignment108; #endif /* defined(VK_NV_clip_space_w_scaling) */ #if defined(VK_NV_cooperative_matrix) PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV vkGetPhysicalDeviceCooperativeMatrixPropertiesNV; #else PFN_vkVoidFunction ignoreAlignment109; #endif /* defined(VK_NV_cooperative_matrix) */ #if defined(VK_NV_coverage_reduction_mode) PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV; #else PFN_vkVoidFunction ignoreAlignment110; #endif /* defined(VK_NV_coverage_reduction_mode) */ #if defined(VK_NV_device_diagnostic_checkpoints) PFN_vkCmdSetCheckpointNV vkCmdSetCheckpointNV; PFN_vkGetQueueCheckpointDataNV vkGetQueueCheckpointDataNV; #else PFN_vkVoidFunction ignoreAlignment111[2]; #endif /* defined(VK_NV_device_diagnostic_checkpoints) */ #if defined(VK_NV_device_generated_commands) PFN_vkCmdBindPipelineShaderGroupNV vkCmdBindPipelineShaderGroupNV; PFN_vkCmdExecuteGeneratedCommandsNV vkCmdExecuteGeneratedCommandsNV; PFN_vkCmdPreprocessGeneratedCommandsNV vkCmdPreprocessGeneratedCommandsNV; PFN_vkCreateIndirectCommandsLayoutNV vkCreateIndirectCommandsLayoutNV; PFN_vkDestroyIndirectCommandsLayoutNV vkDestroyIndirectCommandsLayoutNV; PFN_vkGetGeneratedCommandsMemoryRequirementsNV vkGetGeneratedCommandsMemoryRequirementsNV; #else PFN_vkVoidFunction ignoreAlignment112[6]; #endif /* defined(VK_NV_device_generated_commands) */ #if defined(VK_NV_external_memory_capabilities) PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV vkGetPhysicalDeviceExternalImageFormatPropertiesNV; #else PFN_vkVoidFunction ignoreAlignment113; #endif /* defined(VK_NV_external_memory_capabilities) */ #if defined(VK_NV_external_memory_rdma) PFN_vkGetMemoryRemoteAddressNV vkGetMemoryRemoteAddressNV; #else PFN_vkVoidFunction ignoreAlignment114; #endif /* defined(VK_NV_external_memory_rdma) */ #if defined(VK_NV_external_memory_win32) PFN_vkGetMemoryWin32HandleNV vkGetMemoryWin32HandleNV; #else PFN_vkVoidFunction ignoreAlignment115; #endif /* defined(VK_NV_external_memory_win32) */ #if defined(VK_NV_fragment_shading_rate_enums) PFN_vkCmdSetFragmentShadingRateEnumNV vkCmdSetFragmentShadingRateEnumNV; #else PFN_vkVoidFunction ignoreAlignment116; #endif /* defined(VK_NV_fragment_shading_rate_enums) */ #if defined(VK_NV_mesh_shader) PFN_vkCmdDrawMeshTasksIndirectCountNV vkCmdDrawMeshTasksIndirectCountNV; PFN_vkCmdDrawMeshTasksIndirectNV vkCmdDrawMeshTasksIndirectNV; PFN_vkCmdDrawMeshTasksNV vkCmdDrawMeshTasksNV; #else PFN_vkVoidFunction ignoreAlignment117[3]; #endif /* defined(VK_NV_mesh_shader) */ #if defined(VK_NV_ray_tracing) PFN_vkBindAccelerationStructureMemoryNV vkBindAccelerationStructureMemoryNV; PFN_vkCmdBuildAccelerationStructureNV vkCmdBuildAccelerationStructureNV; PFN_vkCmdCopyAccelerationStructureNV vkCmdCopyAccelerationStructureNV; PFN_vkCmdTraceRaysNV vkCmdTraceRaysNV; PFN_vkCmdWriteAccelerationStructuresPropertiesNV vkCmdWriteAccelerationStructuresPropertiesNV; PFN_vkCompileDeferredNV vkCompileDeferredNV; PFN_vkCreateAccelerationStructureNV vkCreateAccelerationStructureNV; PFN_vkCreateRayTracingPipelinesNV vkCreateRayTracingPipelinesNV; PFN_vkDestroyAccelerationStructureNV vkDestroyAccelerationStructureNV; PFN_vkGetAccelerationStructureHandleNV vkGetAccelerationStructureHandleNV; PFN_vkGetAccelerationStructureMemoryRequirementsNV vkGetAccelerationStructureMemoryRequirementsNV; PFN_vkGetRayTracingShaderGroupHandlesNV vkGetRayTracingShaderGroupHandlesNV; #else PFN_vkVoidFunction ignoreAlignment118[12]; #endif /* defined(VK_NV_ray_tracing) */ #if defined(VK_NV_scissor_exclusive) PFN_vkCmdSetExclusiveScissorNV vkCmdSetExclusiveScissorNV; #else PFN_vkVoidFunction ignoreAlignment119; #endif /* defined(VK_NV_scissor_exclusive) */ #if defined(VK_NV_shading_rate_image) PFN_vkCmdBindShadingRateImageNV vkCmdBindShadingRateImageNV; PFN_vkCmdSetCoarseSampleOrderNV vkCmdSetCoarseSampleOrderNV; PFN_vkCmdSetViewportShadingRatePaletteNV vkCmdSetViewportShadingRatePaletteNV; #else PFN_vkVoidFunction ignoreAlignment120[3]; #endif /* defined(VK_NV_shading_rate_image) */ #if defined(VK_QNX_screen_surface) PFN_vkCreateScreenSurfaceQNX vkCreateScreenSurfaceQNX; PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX vkGetPhysicalDeviceScreenPresentationSupportQNX; #else PFN_vkVoidFunction ignoreAlignment121[2]; #endif /* defined(VK_QNX_screen_surface) */ #if (defined(VK_EXT_full_screen_exclusive) && defined(VK_KHR_device_group)) || \ (defined(VK_EXT_full_screen_exclusive) && defined(VK_VERSION_1_1)) PFN_vkGetDeviceGroupSurfacePresentModes2EXT vkGetDeviceGroupSurfacePresentModes2EXT; #else PFN_vkVoidFunction ignoreAlignment122; #endif /* (defined(VK_EXT_full_screen_exclusive) && defined(VK_KHR_device_group)) || \ (defined(VK_EXT_full_screen_exclusive) && defined(VK_VERSION_1_1)) */ #if (defined(VK_KHR_descriptor_update_template) && defined(VK_KHR_push_descriptor)) || \ (defined(VK_KHR_push_descriptor) && defined(VK_VERSION_1_1)) || \ (defined(VK_KHR_push_descriptor) && defined(VK_KHR_descriptor_update_template)) PFN_vkCmdPushDescriptorSetWithTemplateKHR vkCmdPushDescriptorSetWithTemplateKHR; #else PFN_vkVoidFunction ignoreAlignment123; #endif /* (defined(VK_KHR_descriptor_update_template) && defined(VK_KHR_push_descriptor)) || \ (defined(VK_KHR_push_descriptor) && defined(VK_VERSION_1_1)) || \ (defined(VK_KHR_push_descriptor) && defined(VK_KHR_descriptor_update_template)) */ #if (defined(VK_KHR_device_group) && defined(VK_KHR_surface)) || \ (defined(VK_KHR_swapchain) && defined(VK_VERSION_1_1)) PFN_vkGetDeviceGroupPresentCapabilitiesKHR vkGetDeviceGroupPresentCapabilitiesKHR; PFN_vkGetDeviceGroupSurfacePresentModesKHR vkGetDeviceGroupSurfacePresentModesKHR; PFN_vkGetPhysicalDevicePresentRectanglesKHR vkGetPhysicalDevicePresentRectanglesKHR; #else PFN_vkVoidFunction ignoreAlignment124[3]; #endif /* (defined(VK_KHR_device_group) && defined(VK_KHR_surface)) || (defined(VK_KHR_swapchain) \ && defined(VK_VERSION_1_1)) */ #if (defined(VK_KHR_device_group) && defined(VK_KHR_swapchain)) || \ (defined(VK_KHR_swapchain) && defined(VK_VERSION_1_1)) PFN_vkAcquireNextImage2KHR vkAcquireNextImage2KHR; #else PFN_vkVoidFunction ignoreAlignment125; #endif /* (defined(VK_KHR_device_group) && defined(VK_KHR_swapchain)) || \ (defined(VK_KHR_swapchain) && defined(VK_VERSION_1_1)) */ /* IGL_GENERATE_FUNCTION_TABLE */ }; #ifdef __cplusplus /* IGL_GENERATE_SIZE_CHECK */ static_assert(sizeof(VulkanFunctionTable) == 544 * sizeof(PFN_vkVoidFunction)); /* IGL_GENERATE_SIZE_CHECK */ #endif /// @brief Populates the `VulkanFunctionTable` structure. Requires a pointer to the /// vkGetInstanceProcAddr function, which is used to retrieve pointers to all non-instance and /// no-device functions defined in the `VulkanFunctionTable` structure. int loadVulkanLoaderFunctions(struct VulkanFunctionTable* table, PFN_vkGetInstanceProcAddr load); /// @brief Populates the instance function pointers in the `VulkanFunctionTable` structure. Requires /// a pointer to the vkGetInstanceProcAddr function, which is used to retrieve pointers to all /// instance functions defined in the `VulkanFunctionTable` structure. void loadVulkanInstanceFunctions(struct VulkanFunctionTable* table, VkInstance context, PFN_vkGetInstanceProcAddr load, VkBool32 enableExtDebugUtils); /// @brief Populates the device function pointers in the `VulkanFunctionTable` structure. Requires a /// pointer to the vkGetInstanceProcAddr function, which is used to retrieve pointers to all device /// functions defined in the `VulkanFunctionTable` structure. void loadVulkanDeviceFunctions(struct VulkanFunctionTable* table, VkDevice context, PFN_vkGetDeviceProcAddr load); #ifdef __cplusplus } #endif ================================================ FILE: src/igl/vulkan/VulkanHelpers.c ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #if defined(VK_USE_PLATFORM_WIN32_KHR) #if !defined(WIN32_LEAN_AND_MEAN) #define WIN32_LEAN_AND_MEAN #endif #include #endif #include "VulkanHelpers.h" #include const char* ivkGetVulkanResultString(VkResult result) { #define RESULT_CASE(res) \ case res: \ return #res switch (result) { RESULT_CASE(VK_SUCCESS); RESULT_CASE(VK_NOT_READY); RESULT_CASE(VK_TIMEOUT); RESULT_CASE(VK_EVENT_SET); RESULT_CASE(VK_EVENT_RESET); RESULT_CASE(VK_INCOMPLETE); RESULT_CASE(VK_ERROR_OUT_OF_HOST_MEMORY); RESULT_CASE(VK_ERROR_OUT_OF_DEVICE_MEMORY); RESULT_CASE(VK_ERROR_INITIALIZATION_FAILED); RESULT_CASE(VK_ERROR_DEVICE_LOST); RESULT_CASE(VK_ERROR_MEMORY_MAP_FAILED); RESULT_CASE(VK_ERROR_LAYER_NOT_PRESENT); RESULT_CASE(VK_ERROR_EXTENSION_NOT_PRESENT); RESULT_CASE(VK_ERROR_FEATURE_NOT_PRESENT); RESULT_CASE(VK_ERROR_INCOMPATIBLE_DRIVER); RESULT_CASE(VK_ERROR_TOO_MANY_OBJECTS); RESULT_CASE(VK_ERROR_FORMAT_NOT_SUPPORTED); RESULT_CASE(VK_ERROR_SURFACE_LOST_KHR); RESULT_CASE(VK_ERROR_OUT_OF_DATE_KHR); RESULT_CASE(VK_ERROR_INCOMPATIBLE_DISPLAY_KHR); RESULT_CASE(VK_ERROR_NATIVE_WINDOW_IN_USE_KHR); RESULT_CASE(VK_ERROR_VALIDATION_FAILED_EXT); RESULT_CASE(VK_ERROR_FRAGMENTED_POOL); RESULT_CASE(VK_ERROR_UNKNOWN); // Provided by VK_VERSION_1_1 RESULT_CASE(VK_ERROR_OUT_OF_POOL_MEMORY); // Provided by VK_VERSION_1_1 RESULT_CASE(VK_ERROR_INVALID_EXTERNAL_HANDLE); // Provided by VK_VERSION_1_2 RESULT_CASE(VK_ERROR_FRAGMENTATION); // Provided by VK_VERSION_1_2 RESULT_CASE(VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS); // Provided by VK_KHR_swapchain RESULT_CASE(VK_SUBOPTIMAL_KHR); // Provided by VK_NV_glsl_shader RESULT_CASE(VK_ERROR_INVALID_SHADER_NV); #ifdef VK_ENABLE_BETA_EXTENSIONS // Provided by VK_KHR_video_queue RESULT_CASE(VK_ERROR_IMAGE_USAGE_NOT_SUPPORTED_KHR); #endif #ifdef VK_ENABLE_BETA_EXTENSIONS // Provided by VK_KHR_video_queue RESULT_CASE(VK_ERROR_VIDEO_PICTURE_LAYOUT_NOT_SUPPORTED_KHR); #endif #ifdef VK_ENABLE_BETA_EXTENSIONS // Provided by VK_KHR_video_queue RESULT_CASE(VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR); #endif #ifdef VK_ENABLE_BETA_EXTENSIONS // Provided by VK_KHR_video_queue RESULT_CASE(VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR); #endif #ifdef VK_ENABLE_BETA_EXTENSIONS // Provided by VK_KHR_video_queue RESULT_CASE(VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR); #endif #ifdef VK_ENABLE_BETA_EXTENSIONS // Provided by VK_KHR_video_queue RESULT_CASE(VK_ERROR_VIDEO_STD_VERSION_NOT_SUPPORTED_KHR); #endif // Provided by VK_EXT_image_drm_format_modifier RESULT_CASE(VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT); // Provided by VK_KHR_global_priority RESULT_CASE(VK_ERROR_NOT_PERMITTED_KHR); // Provided by VK_EXT_full_screen_exclusive RESULT_CASE(VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT); // Provided by VK_KHR_deferred_host_operations RESULT_CASE(VK_THREAD_IDLE_KHR); // Provided by VK_KHR_deferred_host_operations RESULT_CASE(VK_THREAD_DONE_KHR); // Provided by VK_KHR_deferred_host_operations RESULT_CASE(VK_OPERATION_DEFERRED_KHR); // Provided by VK_KHR_deferred_host_operations RESULT_CASE(VK_OPERATION_NOT_DEFERRED_KHR); default: return "Unknown VkResult Value"; } #undef RESULT_CASE } VkResult ivkCreateCommandPool(const struct VulkanFunctionTable* vt, VkDevice device, VkCommandPoolCreateFlags flags, uint32_t queueFamilyIndex, VkCommandPool* outCommandPool) { const VkCommandPoolCreateInfo ci = { .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, .pNext = NULL, .flags = flags, .queueFamilyIndex = queueFamilyIndex, }; return vt->vkCreateCommandPool(device, &ci, NULL, outCommandPool); } VkResult ivkAllocateCommandBuffer(const struct VulkanFunctionTable* vt, VkDevice device, VkCommandPool commandPool, VkCommandBuffer* outCommandBuffer) { const VkCommandBufferAllocateInfo ai = { .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, .pNext = NULL, .commandPool = commandPool, .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY, .commandBufferCount = 1, }; return vt->vkAllocateCommandBuffers(device, &ai, outCommandBuffer); } VkResult ivkAllocateMemory(const struct VulkanFunctionTable* vt, VkPhysicalDevice physDev, VkDevice device, const VkMemoryRequirements* memRequirements, VkMemoryPropertyFlags props, bool enableBufferDeviceAddress, VkDeviceMemory* outMemory) { assert(memRequirements); const VkMemoryAllocateFlagsInfo memoryAllocateFlagsInfo = { .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO, .flags = enableBufferDeviceAddress ? VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR : 0, }; VkPhysicalDeviceMemoryProperties memProperties; vt->vkGetPhysicalDeviceMemoryProperties(physDev, &memProperties); const VkMemoryAllocateInfo ai = { .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, .pNext = &memoryAllocateFlagsInfo, .allocationSize = memRequirements->size, .memoryTypeIndex = ivkFindMemoryType(&memProperties, memRequirements->memoryTypeBits, props), }; return vt->vkAllocateMemory(device, &ai, NULL, outMemory); } VkResult ivkAllocateMemory2(const struct VulkanFunctionTable* vt, VkPhysicalDevice physDev, VkDevice device, const VkMemoryRequirements2* memRequirements, VkMemoryPropertyFlags props, bool enableBufferDeviceAddress, VkDeviceMemory* outMemory) { assert(memRequirements); const VkMemoryAllocateFlagsInfo memoryAllocateFlagsInfo = { .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO, .flags = enableBufferDeviceAddress ? VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR : 0, }; VkPhysicalDeviceMemoryProperties memProperties; vt->vkGetPhysicalDeviceMemoryProperties(physDev, &memProperties); const VkMemoryAllocateInfo ai = { .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, .pNext = &memoryAllocateFlagsInfo, .allocationSize = memRequirements->memoryRequirements.size, .memoryTypeIndex = ivkFindMemoryType( &memProperties, memRequirements->memoryRequirements.memoryTypeBits, props), }; return vt->vkAllocateMemory(device, &ai, NULL, outMemory); } bool ivkIsHostVisibleSingleHeapMemory(const VkPhysicalDeviceMemoryProperties* memProps) { if (memProps->memoryHeapCount != 1) { return false; } const uint32_t flag = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; for (uint32_t i = 0; i < memProps->memoryTypeCount; i++) { if ((memProps->memoryTypes[i].propertyFlags & flag) == flag) { return true; } } return false; } uint32_t ivkFindMemoryType(const VkPhysicalDeviceMemoryProperties* memProps, uint32_t memoryTypeBits, VkMemoryPropertyFlags flags) { for (uint32_t i = 0; i < memProps->memoryTypeCount; i++) { const bool hasProperties = (memProps->memoryTypes[i].propertyFlags & flags) == flags; if ((memoryTypeBits & (1 << i)) && hasProperties) { return i; } } assert(false); return 0; } void ivkAddNext(void* node, const void* next) { if (!node || !next) { return; } VkBaseInStructure* cur = (VkBaseInStructure*)node; while (cur->pNext) { cur = (VkBaseInStructure*)cur->pNext; } cur->pNext = next; } VkResult ivkCreateDevice(const struct VulkanFunctionTable* vt, VkPhysicalDevice physicalDevice, size_t numQueueCreateInfos, const VkDeviceQueueCreateInfo* queueCreateInfos, size_t numDeviceExtensions, const char** deviceExtensions, const VkPhysicalDeviceFeatures2* supported, VkDevice* outDevice) { assert(numQueueCreateInfos >= 1); const VkPhysicalDeviceFeatures deviceFeatures10 = { .dualSrcBlend = supported ? supported->features.dualSrcBlend : VK_TRUE, .multiDrawIndirect = supported ? supported->features.multiDrawIndirect : VK_TRUE, .drawIndirectFirstInstance = supported ? supported->features.drawIndirectFirstInstance : VK_TRUE, .depthBiasClamp = supported ? supported->features.depthBiasClamp : VK_TRUE, .fillModeNonSolid = supported ? supported->features.fillModeNonSolid : VK_TRUE, .shaderInt16 = supported ? supported->features.shaderInt16 : VK_TRUE, .samplerAnisotropy = supported ? supported->features.samplerAnisotropy : VK_TRUE, }; VkDeviceCreateInfo ci = { .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, .queueCreateInfoCount = (uint32_t)numQueueCreateInfos, .pQueueCreateInfos = queueCreateInfos, .enabledExtensionCount = (uint32_t)numDeviceExtensions, .ppEnabledExtensionNames = deviceExtensions, .pEnabledFeatures = &deviceFeatures10, }; // Append all feature structs being requested for this device ci.pNext = supported->pNext; return vt->vkCreateDevice(physicalDevice, &ci, NULL, outDevice); } #if !IGL_PLATFORM_MACCATALYST #define VK_EXT_DEBUG_UTILS_SUPPORTED 1 #else #define VK_EXT_DEBUG_UTILS_SUPPORTED 0 #endif #if VK_EXT_DEBUG_UTILS_SUPPORTED VkResult ivkCreateDebugUtilsMessenger(const struct VulkanFunctionTable* vt, VkInstance instance, PFN_vkDebugUtilsMessengerCallbackEXT callback, void* logUserData, VkDebugUtilsMessengerEXT* outMessenger) { // Some Android devices don't have the VK_EXT_debug_utils functions available, even though the // extension is supported and has been enabled if (vt->vkCreateDebugUtilsMessengerEXT == NULL) { return VK_SUCCESS; } const VkDebugUtilsMessengerCreateInfoEXT ci = { .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT, .messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT, .messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT, .pfnUserCallback = callback, .pUserData = logUserData, }; return vt->vkCreateDebugUtilsMessengerEXT(instance, &ci, NULL, outMessenger); } #else // VK_EXT_DEBUG_UTILS_SUPPORTED // Stub version VkResult ivkCreateDebugUtilsMessenger(const struct VulkanFunctionTable* vt, VkInstance instance, PFN_vkDebugUtilsMessengerCallbackEXT callback, void* logUserData, VkDebugUtilsMessengerEXT* outMessenger) { return VK_SUCCESS; } #endif // VK_EXT_DEBUG_UTILS_SUPPORTED #if defined(VK_EXT_debug_report) VkResult ivkCreateDebugReportMessenger(const struct VulkanFunctionTable* vt, VkInstance instance, PFN_vkDebugReportCallbackEXT callback, void* logUserData, VkDebugReportCallbackEXT* outMessenger) { VkDebugReportCallbackCreateInfoEXT ci = { .sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT, .flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_DEBUG_BIT_EXT, .pfnCallback = callback, .pUserData = logUserData, }; return vt->vkCreateDebugReportCallbackEXT(instance, &ci, NULL, outMessenger); } #else // defined(VK_EXT_debug_report) // Stub version VkResult ivkCreateDebugReportMessenger(VkInstance instance, PFN_vkDebugReportCallbackEXT callback, void* logUserData, VkDebugReportCallbackEXT* outMessenger) { return VK_SUCCESS; } #endif // defined(VK_EXT_debug_report) VkResult ivkCreateSurface(const struct VulkanFunctionTable* vt, VkInstance instance, void* window, void* display, void* layer, VkSurfaceKHR* outSurface) { #if !defined(VK_USE_PLATFORM_METAL_EXT) (void)layer; #endif #if defined(VK_USE_PLATFORM_WIN32_KHR) const VkWin32SurfaceCreateInfoKHR ci = { .sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR, .hinstance = GetModuleHandle(NULL), .hwnd = (HWND)window, }; return vt->vkCreateWin32SurfaceKHR(instance, &ci, NULL, outSurface); #elif defined(VK_USE_PLATFORM_ANDROID_KHR) const VkAndroidSurfaceCreateInfoKHR ci = { .sType = VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR, .pNext = NULL, .flags = 0, .window = window, }; return vt->vkCreateAndroidSurfaceKHR(instance, &ci, NULL, outSurface); #elif defined(VK_USE_PLATFORM_METAL_EXT) const VkMetalSurfaceCreateInfoEXT ci = { .sType = VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT, .pNext = NULL, .flags = 0, .pLayer = layer, }; return vt->vkCreateMetalSurfaceEXT(instance, &ci, NULL, outSurface); #elif defined(VK_USE_PLATFORM_XLIB_KHR) const VkXlibSurfaceCreateInfoKHR ci = { .sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR, .pNext = NULL, .flags = 0, .dpy = (Display*)display, .window = (Window)window, }; return vt->vkCreateXlibSurfaceKHR(instance, &ci, NULL, outSurface); #else (void)instance; (void)window; (void)outSurface; // TODO: implement for other platforms return VK_NOT_READY; #endif } VkResult ivkCreateSwapchain(const struct VulkanFunctionTable* vt, VkDevice device, VkSurfaceKHR surface, uint32_t minImageCount, VkSurfaceFormatKHR surfaceFormat, VkPresentModeKHR presentMode, const VkSurfaceCapabilitiesKHR* caps, VkImageUsageFlags imageUsage, uint32_t queueFamilyIndex, uint32_t width, uint32_t height, VkSwapchainKHR* outSwapchain) { assert(caps); const bool isCompositeAlphaOpaqueSupported = (caps->supportedCompositeAlpha & VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR) != 0; const VkSwapchainCreateInfoKHR ci = { .sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR, .surface = surface, .minImageCount = minImageCount, .imageFormat = surfaceFormat.format, .imageColorSpace = surfaceFormat.colorSpace, .imageExtent = {.width = width, .height = height}, .imageArrayLayers = 1, .imageUsage = imageUsage, .imageSharingMode = VK_SHARING_MODE_EXCLUSIVE, .queueFamilyIndexCount = 1, .pQueueFamilyIndices = &queueFamilyIndex, .preTransform = caps->currentTransform, .compositeAlpha = isCompositeAlphaOpaqueSupported ? VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR : VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR, .presentMode = presentMode, .clipped = VK_TRUE, .oldSwapchain = VK_NULL_HANDLE, }; return vt->vkCreateSwapchainKHR(device, &ci, NULL, outSwapchain); } VkResult ivkCreateFramebuffer(const struct VulkanFunctionTable* vt, VkDevice device, uint32_t width, uint32_t height, VkRenderPass renderPass, size_t numAttachments, const VkImageView* attachments, VkFramebuffer* outFramebuffer) { const VkFramebufferCreateInfo ci = { .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, .renderPass = renderPass, .attachmentCount = (uint32_t)numAttachments, .pAttachments = attachments, .width = width, .height = height, .layers = 1, }; return vt->vkCreateFramebuffer(device, &ci, NULL, outFramebuffer); } VkResult ivkCreateDescriptorSetLayout(const struct VulkanFunctionTable* vt, VkDevice device, VkDescriptorSetLayoutCreateFlags flags, uint32_t numBindings, const VkDescriptorSetLayoutBinding* bindings, const VkDescriptorBindingFlags* bindingFlags, VkDescriptorSetLayout* outLayout) { // Do not enable VK_EXT_descriptor_indexing for Android until // we fix the extension enumeration crash when the validation layer is enabled #if !IGL_PLATFORM_ANDROID const VkDescriptorSetLayoutBindingFlagsCreateInfo setLayoutBindingFlagsCI = { .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT, .bindingCount = numBindings, .pBindingFlags = bindingFlags, }; #endif // !IGL_PLATFORM_ANDROID const VkDescriptorSetLayoutCreateInfo ci = { .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, #if !IGL_PLATFORM_ANDROID .pNext = bindingFlags ? &setLayoutBindingFlagsCI : NULL, .flags = flags, #endif .bindingCount = numBindings, .pBindings = bindings, }; return vt->vkCreateDescriptorSetLayout(device, &ci, NULL, outLayout); } VkResult ivkAllocateDescriptorSet(const struct VulkanFunctionTable* vt, VkDevice device, VkDescriptorPool pool, VkDescriptorSetLayout layout, VkDescriptorSet* outDescriptorSet) { const VkDescriptorSetAllocateInfo ai = { .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, .descriptorPool = pool, .descriptorSetCount = 1, .pSetLayouts = &layout, }; return vt->vkAllocateDescriptorSets(device, &ai, outDescriptorSet); } VkResult ivkCreateDescriptorPool(const struct VulkanFunctionTable* vt, VkDevice device, VkDescriptorPoolCreateFlags flags, uint32_t maxDescriptorSets, uint32_t numPoolSizes, const VkDescriptorPoolSize* poolSizes, VkDescriptorPool* outDescriptorPool) { const VkDescriptorPoolCreateInfo ci = { .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, .flags = flags, .maxSets = maxDescriptorSets, .poolSizeCount = numPoolSizes, .pPoolSizes = poolSizes, }; return vt->vkCreateDescriptorPool(device, &ci, NULL, outDescriptorPool); } VkSubmitInfo ivkGetSubmitInfo(const VkCommandBuffer* buffer, uint32_t numWaitSemaphores, const VkSemaphore* waitSemaphores, const VkPipelineStageFlags* waitStageMasks, const VkSemaphore* releaseSemaphore) { const VkSubmitInfo si = { .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO, .waitSemaphoreCount = numWaitSemaphores, .pWaitSemaphores = numWaitSemaphores ? waitSemaphores : NULL, .pWaitDstStageMask = waitStageMasks, .commandBufferCount = 1, .pCommandBuffers = buffer, .signalSemaphoreCount = releaseSemaphore ? 1 : 0, .pSignalSemaphores = releaseSemaphore, }; return si; } VkWriteDescriptorSet ivkGetWriteDescriptorSetImageInfo(VkDescriptorSet dstSet, uint32_t dstBinding, VkDescriptorType descriptorType, uint32_t numDescriptors, const VkDescriptorImageInfo* pImageInfo) { const VkWriteDescriptorSet set = { .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, .pNext = NULL, .dstSet = dstSet, .dstBinding = dstBinding, .dstArrayElement = 0, .descriptorCount = numDescriptors, .descriptorType = descriptorType, .pImageInfo = pImageInfo, .pBufferInfo = NULL, .pTexelBufferView = NULL, }; return set; } VkWriteDescriptorSet ivkGetWriteDescriptorSetBufferInfo(VkDescriptorSet dstSet, uint32_t dstBinding, VkDescriptorType descriptorType, uint32_t numDescriptors, const VkDescriptorBufferInfo* pBufferInfo) { const VkWriteDescriptorSet set = { .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, .pNext = NULL, .dstSet = dstSet, .dstBinding = dstBinding, .dstArrayElement = 0, .descriptorCount = numDescriptors, .descriptorType = descriptorType, .pImageInfo = NULL, .pBufferInfo = pBufferInfo, .pTexelBufferView = NULL, }; return set; } VkResult ivkCreateGraphicsPipeline(const struct VulkanFunctionTable* vt, VkDevice device, VkPipelineCache pipelineCache, uint32_t numShaderStages, const VkPipelineShaderStageCreateInfo* shaderStages, const VkPipelineVertexInputStateCreateInfo* vertexInputState, const VkPipelineInputAssemblyStateCreateInfo* inputAssemblyState, const VkPipelineTessellationStateCreateInfo* tessellationState, const VkPipelineViewportStateCreateInfo* viewportState, const VkPipelineRasterizationStateCreateInfo* rasterizationState, const VkPipelineMultisampleStateCreateInfo* multisampleState, const VkPipelineDepthStencilStateCreateInfo* depthStencilState, const VkPipelineColorBlendStateCreateInfo* colorBlendState, const VkPipelineDynamicStateCreateInfo* dynamicState, VkPipelineLayout pipelineLayout, VkRenderPass renderPass, VkPipeline* outPipeline) { const VkGraphicsPipelineCreateInfo ci = { .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, .pNext = NULL, .flags = 0, .stageCount = numShaderStages, .pStages = shaderStages, .pVertexInputState = vertexInputState, .pInputAssemblyState = inputAssemblyState, .pTessellationState = tessellationState, .pViewportState = viewportState, .pRasterizationState = rasterizationState, .pMultisampleState = multisampleState, .pDepthStencilState = depthStencilState, .pColorBlendState = colorBlendState, .pDynamicState = dynamicState, .layout = pipelineLayout, .renderPass = renderPass, .subpass = 0, .basePipelineHandle = VK_NULL_HANDLE, .basePipelineIndex = -1, }; return vt->vkCreateGraphicsPipelines(device, pipelineCache, 1, &ci, NULL, outPipeline); } VkResult ivkCreateComputePipeline(const struct VulkanFunctionTable* vt, VkDevice device, VkPipelineCache pipelineCache, const VkPipelineShaderStageCreateInfo* shaderStage, VkPipelineLayout pipelineLayout, VkPipeline* outPipeline) { const VkComputePipelineCreateInfo ci = { .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, .pNext = NULL, .flags = 0, .stage = *shaderStage, .layout = pipelineLayout, .basePipelineHandle = VK_NULL_HANDLE, .basePipelineIndex = -1, }; return vt->vkCreateComputePipelines(device, pipelineCache, 1, &ci, NULL, outPipeline); } void ivkImageMemoryBarrier(const struct VulkanFunctionTable* vt, VkCommandBuffer buffer, VkImage image, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkImageLayout oldImageLayout, VkImageLayout newImageLayout, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkImageSubresourceRange subresourceRange) { const VkImageMemoryBarrier barrier = { .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, .srcAccessMask = srcAccessMask, .dstAccessMask = dstAccessMask, .oldLayout = oldImageLayout, .newLayout = newImageLayout, .image = image, .subresourceRange = subresourceRange, }; vt->vkCmdPipelineBarrier(buffer, srcStageMask, dstStageMask, 0, 0, NULL, 0, NULL, 1, &barrier); } void ivkBufferBarrier(const struct VulkanFunctionTable* vt, VkCommandBuffer cmdBuffer, VkBuffer buffer, VkBufferUsageFlags usageFlags, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask) { VkBufferMemoryBarrier barrier = { .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, .srcAccessMask = 0, .dstAccessMask = 0, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .buffer = buffer, .offset = 0, .size = VK_WHOLE_SIZE, }; if (srcStageMask & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) { barrier.srcAccessMask |= VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT; } if (srcStageMask & VK_PIPELINE_STAGE_TRANSFER_BIT) { barrier.srcAccessMask |= VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT; } if (srcStageMask & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) { barrier.srcAccessMask |= VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT; } if (dstStageMask & VK_PIPELINE_STAGE_TRANSFER_BIT) { barrier.dstAccessMask |= VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT; } if (dstStageMask & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) { barrier.dstAccessMask |= VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT; } if (dstStageMask & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) { barrier.dstAccessMask |= VK_ACCESS_INDIRECT_COMMAND_READ_BIT; } if (dstStageMask & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) { barrier.dstAccessMask |= VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT; } if (usageFlags & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) { barrier.dstAccessMask |= VK_ACCESS_INDEX_READ_BIT; } if (usageFlags & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) { barrier.dstAccessMask |= VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT; } vt->vkCmdPipelineBarrier(cmdBuffer, srcStageMask, dstStageMask, 0, 0, NULL, 1, &barrier, 0, NULL); } void ivkBufferMemoryBarrier(const struct VulkanFunctionTable* vt, VkCommandBuffer cmdBuffer, VkBuffer buffer, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkDeviceSize offset, VkDeviceSize size, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask) { const VkBufferMemoryBarrier barrier = { .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, .srcAccessMask = srcAccessMask, .dstAccessMask = dstAccessMask, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .buffer = buffer, .offset = offset, .size = size, }; vt->vkCmdPipelineBarrier(cmdBuffer, srcStageMask, dstStageMask, 0, 0, NULL, 1, &barrier, 0, NULL); } void ivkCmdBlitImage(const struct VulkanFunctionTable* vt, VkCommandBuffer buffer, VkImage srcImage, VkImage dstImage, VkImageLayout srcImageLayout, VkImageLayout dstImageLayout, const VkOffset3D* srcOffsets, const VkOffset3D* dstOffsets, VkImageSubresourceLayers srcSubresourceRange, VkImageSubresourceLayers dstSubresourceRange, VkFilter filter) { const VkImageBlit blit = { .srcSubresource = srcSubresourceRange, .srcOffsets = {srcOffsets[0], srcOffsets[1]}, .dstSubresource = dstSubresourceRange, .dstOffsets = {dstOffsets[0], dstOffsets[1]}, }; vt->vkCmdBlitImage(buffer, srcImage, srcImageLayout, dstImage, dstImageLayout, 1, &blit, filter); } VkResult ivkSetDebugObjectName(const struct VulkanFunctionTable* vt, VkDevice device, VkObjectType type, uint64_t handle, const char* name) { // Some Android devices don't have the VK_EXT_debug_utils functions available, even though the // extension is supported and has been enabled if (!name || !*name || vt->vkSetDebugUtilsObjectNameEXT == NULL) { return VK_SUCCESS; } #if VK_EXT_DEBUG_UTILS_SUPPORTED const VkDebugUtilsObjectNameInfoEXT ni = { .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT, .objectType = type, .objectHandle = handle, .pObjectName = name, }; return vt->vkSetDebugUtilsObjectNameEXT(device, &ni); #else return VK_SUCCESS; #endif // VK_EXT_DEBUG_UTILS_SUPPORTED } void ivkCmdBeginDebugUtilsLabel(const struct VulkanFunctionTable* vt, VkCommandBuffer buffer, const char* name, const float colorRGBA[4]) { #if VK_EXT_DEBUG_UTILS_SUPPORTED // Some Android devices don't have the VK_EXT_debug_utils functions available, even though the // extension is supported and has been enabled if (!name || !*name || vt->vkCmdBeginDebugUtilsLabelEXT == NULL) { return; } const VkDebugUtilsLabelEXT label = { .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT, .pNext = NULL, .pLabelName = name, .color = {colorRGBA[0], colorRGBA[1], colorRGBA[2], colorRGBA[3]}, }; vt->vkCmdBeginDebugUtilsLabelEXT(buffer, &label); #endif // VK_EXT_DEBUG_UTILS_SUPPORTED } void ivkCmdInsertDebugUtilsLabel(const struct VulkanFunctionTable* vt, VkCommandBuffer buffer, const char* name, const float colorRGBA[4]) { #if VK_EXT_DEBUG_UTILS_SUPPORTED // Some Android devices don't have the VK_EXT_debug_utils functions available, even though the // extension is supported and has been enabled if (!name || !*name || vt->vkCmdInsertDebugUtilsLabelEXT == NULL) { return; } const VkDebugUtilsLabelEXT label = { .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT, .pNext = NULL, .pLabelName = name, .color = {colorRGBA[0], colorRGBA[1], colorRGBA[2], colorRGBA[3]}, }; vt->vkCmdInsertDebugUtilsLabelEXT(buffer, &label); #endif // VK_EXT_DEBUG_UTILS_SUPPORTED } void ivkCmdEndDebugUtilsLabel(const struct VulkanFunctionTable* vt, VkCommandBuffer buffer) { #if VK_EXT_DEBUG_UTILS_SUPPORTED // Some Android devices don't have the VK_EXT_debug_utils functions available, even though the // extension is supported and has been enabled if (vt->vkCmdEndDebugUtilsLabelEXT != NULL) { vt->vkCmdEndDebugUtilsLabelEXT(buffer); } #endif // VK_EXT_DEBUG_UTILS_SUPPORTED } VkVertexInputBindingDescription ivkGetVertexInputBindingDescription(uint32_t binding, uint32_t stride, VkVertexInputRate inputRate) { const VkVertexInputBindingDescription desc = { .binding = binding, .stride = stride, .inputRate = inputRate, }; return desc; } VkVertexInputAttributeDescription ivkGetVertexInputAttributeDescription(uint32_t location, uint32_t binding, VkFormat format, uint32_t offset) { const VkVertexInputAttributeDescription desc = { .location = location, .binding = binding, .format = format, .offset = offset, }; return desc; } VkResult ivkVmaCreateAllocator(const struct VulkanFunctionTable* vt, VkPhysicalDevice physDev, VkDevice device, VkInstance instance, uint32_t apiVersion, bool enableBufferDeviceAddress, VkDeviceSize preferredLargeHeapBlockSize, VmaAllocator* outVma) { const VmaVulkanFunctions funcs = { .vkGetInstanceProcAddr = vt->vkGetInstanceProcAddr, .vkGetDeviceProcAddr = vt->vkGetDeviceProcAddr, .vkGetPhysicalDeviceProperties = vt->vkGetPhysicalDeviceProperties, .vkGetPhysicalDeviceMemoryProperties = vt->vkGetPhysicalDeviceMemoryProperties, .vkAllocateMemory = vt->vkAllocateMemory, .vkFreeMemory = vt->vkFreeMemory, .vkMapMemory = vt->vkMapMemory, .vkUnmapMemory = vt->vkUnmapMemory, .vkFlushMappedMemoryRanges = vt->vkFlushMappedMemoryRanges, .vkInvalidateMappedMemoryRanges = vt->vkInvalidateMappedMemoryRanges, .vkBindBufferMemory = vt->vkBindBufferMemory, .vkBindImageMemory = vt->vkBindImageMemory, .vkGetBufferMemoryRequirements = vt->vkGetBufferMemoryRequirements, .vkGetImageMemoryRequirements = vt->vkGetImageMemoryRequirements, .vkCreateBuffer = vt->vkCreateBuffer, .vkDestroyBuffer = vt->vkDestroyBuffer, .vkCreateImage = vt->vkCreateImage, .vkDestroyImage = vt->vkDestroyImage, .vkCmdCopyBuffer = vt->vkCmdCopyBuffer, #if VMA_VULKAN_VERSION >= 1001000 .vkGetBufferMemoryRequirements2KHR = vt->vkGetBufferMemoryRequirements2, .vkGetImageMemoryRequirements2KHR = vt->vkGetImageMemoryRequirements2, .vkBindBufferMemory2KHR = vt->vkBindBufferMemory2, .vkBindImageMemory2KHR = vt->vkBindImageMemory2, .vkGetPhysicalDeviceMemoryProperties2KHR = vt->vkGetPhysicalDeviceMemoryProperties2, #endif #if VMA_VULKAN_VERSION >= 1003000 .vkGetDeviceBufferMemoryRequirements = vt->vkGetDeviceBufferMemoryRequirements, .vkGetDeviceImageMemoryRequirements = vt->vkGetDeviceImageMemoryRequirements, #endif }; const VmaAllocatorCreateInfo ci = { .flags = enableBufferDeviceAddress ? VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT : 0, .physicalDevice = physDev, .device = device, .preferredLargeHeapBlockSize = preferredLargeHeapBlockSize, .pAllocationCallbacks = NULL, .pDeviceMemoryCallbacks = NULL, .pHeapSizeLimit = NULL, .pVulkanFunctions = &funcs, .instance = instance, .vulkanApiVersion = apiVersion, }; return vmaCreateAllocator(&ci, outVma); } void ivkUpdateGlslangResource(glslang_resource_t* res, const VkPhysicalDeviceProperties* props, const VkPhysicalDeviceMeshShaderPropertiesEXT* meshShaderProps) { const VkPhysicalDeviceLimits* limits = props ? &props->limits : NULL; if (!limits || !res) { return; } res->max_vertex_attribs = (int)limits->maxVertexInputAttributes; res->max_clip_distances = (int)limits->maxClipDistances; res->max_compute_work_group_count_x = (int)limits->maxComputeWorkGroupCount[0]; res->max_compute_work_group_count_y = (int)limits->maxComputeWorkGroupCount[1]; res->max_compute_work_group_count_z = (int)limits->maxComputeWorkGroupCount[2]; res->max_compute_work_group_size_x = (int)limits->maxComputeWorkGroupSize[0]; res->max_compute_work_group_size_y = (int)limits->maxComputeWorkGroupSize[1]; res->max_compute_work_group_size_z = (int)limits->maxComputeWorkGroupSize[2]; res->max_vertex_output_components = (int)limits->maxVertexOutputComponents; res->max_geometry_input_components = (int)limits->maxGeometryInputComponents; res->max_geometry_output_components = (int)limits->maxGeometryOutputComponents; res->max_fragment_input_components = (int)limits->maxFragmentInputComponents; res->max_geometry_output_vertices = (int)limits->maxGeometryOutputVertices; res->max_geometry_total_output_components = (int)limits->maxGeometryTotalOutputComponents; res->max_tess_control_input_components = (int)limits->maxTessellationControlPerVertexInputComponents; res->max_tess_control_output_components = (int)limits->maxTessellationControlPerVertexOutputComponents; res->max_tess_evaluation_input_components = (int)limits->maxTessellationEvaluationInputComponents; res->max_tess_evaluation_output_components = (int)limits->maxTessellationEvaluationOutputComponents; res->max_viewports = (int)limits->maxViewports; res->max_cull_distances = (int)limits->maxCullDistances; res->max_combined_clip_and_cull_distances = (int)limits->maxCombinedClipAndCullDistances; if (meshShaderProps) { res->max_mesh_output_vertices_ext = meshShaderProps->maxMeshOutputVertices; res->max_mesh_output_primitives_ext = meshShaderProps->maxMeshOutputPrimitives; res->max_mesh_work_group_size_x_ext = meshShaderProps->maxMeshWorkGroupSize[0]; res->max_mesh_work_group_size_y_ext = meshShaderProps->maxMeshWorkGroupSize[1]; res->max_mesh_work_group_size_z_ext = meshShaderProps->maxMeshWorkGroupSize[2]; res->max_task_work_group_size_x_ext = meshShaderProps->maxTaskWorkGroupSize[0]; res->max_task_work_group_size_y_ext = meshShaderProps->maxTaskWorkGroupSize[1]; res->max_task_work_group_size_z_ext = meshShaderProps->maxTaskWorkGroupSize[2]; res->max_mesh_view_count_ext = meshShaderProps->maxMeshMultiviewViewCount; } } ================================================ FILE: src/igl/vulkan/VulkanHelpers.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // This is a very low-level C wrapper of the Vulkan API to make it slightly less painful to use. #pragma once #include #include #include #include #ifdef __cplusplus extern "C" { #endif /// @brief Adds a node to the linked list of next nodes void ivkAddNext(void* node, const void* next); const char* ivkGetVulkanResultString(VkResult result); /// @brief Creates a Debug Utils Messenger if the VK_EXT_debug_utils extension is available and the /// platform is not Android or Mac Catalyst. Otherwise the function is defined as a no-op that /// always returns VK_SUCCESS VkResult ivkCreateDebugUtilsMessenger(const struct VulkanFunctionTable* vt, VkInstance instance, PFN_vkDebugUtilsMessengerCallbackEXT callback, void* logUserData, VkDebugUtilsMessengerEXT* outMessenger); // This function uses VK_EXT_debug_report extension, which is deprecated by VK_EXT_debug_utils. // However, it is available on some Android devices where VK_EXT_debug_utils is not available. VkResult ivkCreateDebugReportMessenger(const struct VulkanFunctionTable* vt, VkInstance instance, PFN_vkDebugReportCallbackEXT callback, void* logUserData, VkDebugReportCallbackEXT* outMessenger); /** @brief Creates a platform specific VkSurfaceKHR object. The surface creation functions * conditionally-compiled and guarded by their respective platform specific extension macros defined * by the Vulkan API. The current supported platforms, and their macros, are: * - Windows: VK_USE_PLATFORM_WIN32_KHR * - Linux: VK_USE_PLATFORM_XLIB_KHR * - MacOS: VK_USE_PLATFORM_METAL_EXT * - Android: VK_USE_PLATFORM_ANDROID_KHR */ VkResult ivkCreateSurface(const struct VulkanFunctionTable* vt, VkInstance instance, void* window, void* display, void* layer, VkSurfaceKHR* outSurface); /** @brief Creates a Vulkan device from the given physical device. The physical device features * (VkPhysicalDeviceFeatures) conditionally enabled, based on the provided supported physical device * features, are `dualSrcBlend`, `multiDrawIndirect`, `drawIndirectFirstInstance`, `depthBiasClamp`, * `fillModeNonSolid`, and `shaderInt16`. * The validation layers enabled are defined in `kDefaultValidationLayers` * If descriptor indexing is enabled, then the following descriptor indexing features * (VkPhysicalDeviceDescriptorIndexingFeaturesEXT) are enabled: * `shaderSampledImageArrayNonUniformIndexing`, `descriptorBindingUniformBufferUpdateAfterBind`, * `descriptorBindingSampledImageUpdateAfterBind`, `descriptorBindingStorageImageUpdateAfterBind`, * `descriptorBindingStorageBufferUpdateAfterBind`, `descriptorBindingUpdateUnusedWhilePending`, * `descriptorBindingPartiallyBound`, `runtimeDescriptorArray`. * If 16-bit shader floats are enabled, then the following shader float 16 features are enabled: * VkPhysicalDevice16BitStorageFeatures::storageBuffer16BitAccess * VkPhysicalDeviceShaderFloat16Int8Features::shaderFloat16 * If the `VK_KHR_buffer_device_address` extension is available, then * VkPhysicalDeviceBufferDeviceAddressFeaturesKHR::bufferDeviceAddress is enabled If multiview is * enabled, then VkPhysicalDeviceMultiviewFeatures::multiview is enabled */ VkResult ivkCreateDevice(const struct VulkanFunctionTable* vt, VkPhysicalDevice physicalDevice, size_t numQueueCreateInfos, const VkDeviceQueueCreateInfo* queueCreateInfos, size_t numDeviceExtensions, const char** deviceExtensions, const VkPhysicalDeviceFeatures2* supported, VkDevice* outDevice); VkResult ivkCreateSwapchain(const struct VulkanFunctionTable* vt, VkDevice device, VkSurfaceKHR surface, uint32_t minImageCount, VkSurfaceFormatKHR surfaceFormat, VkPresentModeKHR presentMode, const VkSurfaceCapabilitiesKHR* caps, VkImageUsageFlags imageUsage, uint32_t queueFamilyIndex, uint32_t width, uint32_t height, VkSwapchainKHR* outSwapchain); VkResult ivkCreateFramebuffer(const struct VulkanFunctionTable* vt, VkDevice device, uint32_t width, uint32_t height, VkRenderPass renderPass, size_t numAttachments, const VkImageView* attachments, VkFramebuffer* outFramebuffer); VkResult ivkCreateCommandPool(const struct VulkanFunctionTable* vt, VkDevice device, VkCommandPoolCreateFlags flags, uint32_t queueFamilyIndex, VkCommandPool* outCommandPool); VkResult ivkAllocateCommandBuffer(const struct VulkanFunctionTable* vt, VkDevice device, VkCommandPool commandPool, VkCommandBuffer* outCommandBuffer); VkResult ivkAllocateMemory(const struct VulkanFunctionTable* vt, VkPhysicalDevice physDev, VkDevice device, const VkMemoryRequirements* memRequirements, VkMemoryPropertyFlags props, bool enableBufferDeviceAddress, VkDeviceMemory* outMemory); VkResult ivkAllocateMemory2(const struct VulkanFunctionTable* vt, VkPhysicalDevice physDev, VkDevice device, const VkMemoryRequirements2* memRequirements, VkMemoryPropertyFlags props, bool enableBufferDeviceAddress, VkDeviceMemory* outMemory); bool ivkIsHostVisibleSingleHeapMemory(const VkPhysicalDeviceMemoryProperties* memProps); uint32_t ivkFindMemoryType(const VkPhysicalDeviceMemoryProperties* memProps, uint32_t memoryTypeBits, VkMemoryPropertyFlags flags); VkResult ivkCreateGraphicsPipeline(const struct VulkanFunctionTable* vt, VkDevice device, VkPipelineCache pipelineCache, uint32_t numShaderStages, const VkPipelineShaderStageCreateInfo* shaderStages, const VkPipelineVertexInputStateCreateInfo* vertexInputState, const VkPipelineInputAssemblyStateCreateInfo* inputAssemblyState, const VkPipelineTessellationStateCreateInfo* tessellationState, const VkPipelineViewportStateCreateInfo* viewportState, const VkPipelineRasterizationStateCreateInfo* rasterizationState, const VkPipelineMultisampleStateCreateInfo* multisampleState, const VkPipelineDepthStencilStateCreateInfo* depthStencilState, const VkPipelineColorBlendStateCreateInfo* colorBlendState, const VkPipelineDynamicStateCreateInfo* dynamicState, VkPipelineLayout pipelineLayout, VkRenderPass renderPass, VkPipeline* outPipeline); VkResult ivkCreateComputePipeline(const struct VulkanFunctionTable* vt, VkDevice device, VkPipelineCache pipelineCache, const VkPipelineShaderStageCreateInfo* shaderStage, VkPipelineLayout pipelineLayout, VkPipeline* outPipeline); VkResult ivkCreateDescriptorSetLayout(const struct VulkanFunctionTable* vt, VkDevice device, VkDescriptorSetLayoutCreateFlags flags, uint32_t numBindings, const VkDescriptorSetLayoutBinding* bindings, const VkDescriptorBindingFlags* bindingFlags, VkDescriptorSetLayout* outLayout); VkResult ivkAllocateDescriptorSet(const struct VulkanFunctionTable* vt, VkDevice device, VkDescriptorPool pool, VkDescriptorSetLayout layout, VkDescriptorSet* outDescriptorSet); VkResult ivkCreateDescriptorPool(const struct VulkanFunctionTable* vt, VkDevice device, VkDescriptorPoolCreateFlags flags, uint32_t maxDescriptorSets, uint32_t numPoolSizes, const VkDescriptorPoolSize* poolSizes, VkDescriptorPool* outDescriptorPool); /// @brief Creates a VkSubmitInfo structure with an optional semaphore, used to signal when the /// command buffer for this batch have completed execution VkSubmitInfo ivkGetSubmitInfo(const VkCommandBuffer* buffer, uint32_t numWaitSemaphores, const VkSemaphore* waitSemaphores, const VkPipelineStageFlags* waitStageMasks, const VkSemaphore* releaseSemaphore); VkWriteDescriptorSet ivkGetWriteDescriptorSetImageInfo(VkDescriptorSet dstSet, uint32_t dstBinding, VkDescriptorType descriptorType, uint32_t numDescriptors, const VkDescriptorImageInfo* pImageInfo); VkWriteDescriptorSet ivkGetWriteDescriptorSetBufferInfo(VkDescriptorSet dstSet, uint32_t dstBinding, VkDescriptorType descriptorType, uint32_t numDescriptors, const VkDescriptorBufferInfo* pBufferInfo); void ivkImageMemoryBarrier(const struct VulkanFunctionTable* vt, VkCommandBuffer buffer, VkImage image, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkImageLayout oldImageLayout, VkImageLayout newImageLayout, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkImageSubresourceRange subresourceRange); void ivkBufferMemoryBarrier(const struct VulkanFunctionTable* vt, VkCommandBuffer cmdBuffer, VkBuffer buffer, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkDeviceSize offset, VkDeviceSize size, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask); void ivkBufferBarrier(const struct VulkanFunctionTable* vt, VkCommandBuffer cmdBuffer, VkBuffer buffer, VkBufferUsageFlags usageFlags, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask); void ivkCmdBlitImage(const struct VulkanFunctionTable* vt, VkCommandBuffer buffer, VkImage srcImage, VkImage dstImage, VkImageLayout srcImageLayout, VkImageLayout dstImageLayout, const VkOffset3D* srcOffsets, const VkOffset3D* dstOffsets, VkImageSubresourceLayers srcSubresourceRange, VkImageSubresourceLayers dstSubresourceRange, VkFilter filter); /// @brief Adds a name for the Vulkan object with handle equals to `handle` and type equals to /// `type`. This function is a no-op if `VK_EXT_DEBUG_UTILS_SUPPORTED` is not defined VkResult ivkSetDebugObjectName(const struct VulkanFunctionTable* vt, VkDevice device, VkObjectType type, uint64_t handle, const char* name); /// @brief Opens a command buffer debug region. This function is a no-op if /// `VK_EXT_DEBUG_UTILS_SUPPORTED` is not defined void ivkCmdBeginDebugUtilsLabel(const struct VulkanFunctionTable* vt, VkCommandBuffer buffer, const char* name, const float colorRGBA[4]); /// @brief Inserts a debug label into a command buffer. This function is a no-op if /// `VK_EXT_DEBUG_UTILS_SUPPORTED` is not defined void ivkCmdInsertDebugUtilsLabel(const struct VulkanFunctionTable* vt, VkCommandBuffer buffer, const char* name, const float colorRGBA[4]); /// @brief Closes a command buffer debug region. This function is a no-op if /// `VK_EXT_DEBUG_UTILS_SUPPORTED` is not defined void ivkCmdEndDebugUtilsLabel(const struct VulkanFunctionTable* vt, VkCommandBuffer buffer); VkVertexInputBindingDescription ivkGetVertexInputBindingDescription(uint32_t binding, uint32_t stride, VkVertexInputRate inputRate); VkVertexInputAttributeDescription ivkGetVertexInputAttributeDescription(uint32_t location, uint32_t binding, VkFormat format, uint32_t offset); VkResult ivkVmaCreateAllocator(const struct VulkanFunctionTable* vt, VkPhysicalDevice physDev, VkDevice device, VkInstance instance, uint32_t apiVersion, bool enableBufferDeviceAddress, VkDeviceSize preferredLargeHeapBlockSize, VmaAllocator* outVma); void ivkUpdateGlslangResource(glslang_resource_t* res, const VkPhysicalDeviceProperties* props, const VkPhysicalDeviceMeshShaderPropertiesEXT* meshShaderProps); #ifdef __cplusplus } #endif ================================================ FILE: src/igl/vulkan/VulkanImage.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "VulkanImage.h" #include #include #include #include #include #ifndef VK_USE_PLATFORM_WIN32_KHR #include #endif // any image layout transition causes a full barrier #define IGL_DEBUG_ENFORCE_FULL_IMAGE_BARRIER 0 namespace { uint32_t ivkGetMemoryTypeIndex(const VkPhysicalDeviceMemoryProperties& memProps, const uint32_t typeBits, VkMemoryPropertyFlags requiredProperties) { // Search memory types to find the index with the requested properties. for (uint32_t type = 0; type < memProps.memoryTypeCount; type++) { if ((typeBits & (1 << type)) != 0) { // Test if this memory type has the required properties. const VkFlags propertyFlags = memProps.memoryTypes[type].propertyFlags; if ((propertyFlags & requiredProperties) == requiredProperties) { return type; } } } if (requiredProperties & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) { // there's no DEVICE_LOCAL memory heap here - look again requiredProperties &= ~VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; for (uint32_t type = 0; type < memProps.memoryTypeCount; type++) { if ((typeBits & (1 << type)) != 0) { // Test if this memory type has the required properties. const VkFlags propertyFlags = memProps.memoryTypes[type].propertyFlags; if ((propertyFlags & requiredProperties) == requiredProperties) { return type; } } } } IGL_LOG_ERROR("Memory type %d with properties %d not found.", typeBits, requiredProperties); return 0; } // VkImage export and import is only implemented on Windows, Linux and Android platforms. #if IGL_PLATFORM_WINDOWS constexpr auto kHandleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT; #elif IGL_PLATFORM_LINUX || IGL_PLATFORM_ANDROID constexpr auto kHandleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT; #endif } // namespace namespace igl::vulkan { VulkanImage::VulkanImage(const VulkanContext& ctx, VkImage image, const char* debugName, VkImageUsageFlags usageFlags, bool isExternallyManaged, VkExtent3D extent, VkImageType type, VkFormat imageFormat, uint32_t mipLevels, uint32_t arrayLayers, VkSampleCountFlagBits samples, bool isImported) : ctx_(&ctx), physicalDevice_(ctx.getVkPhysicalDevice()), device_(ctx.getVkDevice()), vkImage_(image), usageFlags_(usageFlags), isExternallyManaged_(isExternallyManaged), extent_(extent), type_(type), imageFormat_(imageFormat), mipLevels_(mipLevels), arrayLayers_(arrayLayers), samples_(samples), isDepthFormat_(hasDepth(imageFormat)), // NOLINT(readability-identifier-naming) isStencilFormat_(hasStencil(imageFormat)), // NOLINT(readability-identifier-naming) isDepthOrStencilFormat_(isDepthFormat_ || isStencilFormat_), isImported_(isImported) { setName(debugName); VK_ASSERT(ivkSetDebugObjectName( &ctx_->vf_, device_, VK_OBJECT_TYPE_IMAGE, (uint64_t)vkImage_, debugName)); ctx_->vf_.vkGetPhysicalDeviceFormatProperties(physicalDevice_, imageFormat_, &formatProperties_); } VulkanImage::VulkanImage(const VulkanContext& ctx, VkImage image, const VulkanImageCreateInfo& createInfo, const char* debugName) : VulkanImage(ctx, image, debugName, createInfo.usageFlags, createInfo.isExternallyManaged, createInfo.extent, createInfo.type, createInfo.imageFormat, createInfo.mipLevels, createInfo.arrayLayers, createInfo.samples, createInfo.isImported) {} VulkanImage::VulkanImage(const VulkanContext& ctx, VkExtent3D extent, VkImageType type, VkFormat format, uint32_t mipLevels, uint32_t arrayLayers, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkMemoryPropertyFlags memFlags, VkImageCreateFlags createFlags, VkSampleCountFlagBits samples, const char* debugName) : ctx_(&ctx), physicalDevice_(ctx.getVkPhysicalDevice()), device_(ctx.getVkDevice()), usageFlags_(usageFlags), extent_(extent), type_(type), imageFormat_(format), mipLevels_(mipLevels), arrayLayers_(arrayLayers), samples_(samples), isDepthFormat_(hasDepth(format)), // NOLINT(readability-identifier-naming) isStencilFormat_(hasStencil(format)), // NOLINT(readability-identifier-naming) isDepthOrStencilFormat_(isDepthFormat_ || isStencilFormat_), isCubemap_((createFlags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) != 0), tiling_(tiling) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); IGL_DEBUG_ASSERT(mipLevels_ > 0, "The image must contain at least one mip level"); IGL_DEBUG_ASSERT(arrayLayers_ > 0, "The image must contain at least one layer"); IGL_DEBUG_ASSERT(imageFormat_ != VK_FORMAT_UNDEFINED, "Invalid VkFormat value"); IGL_DEBUG_ASSERT(samples_ > 0, "The image must contain at least one sample"); setName(debugName); const bool isDisjoint = (createFlags & VK_IMAGE_CREATE_DISJOINT_BIT) != 0; const VkImageCreateInfo ci = { .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, .flags = createFlags, .imageType = type, .format = imageFormat_, .extent = extent_, .mipLevels = mipLevels_, .arrayLayers = arrayLayers_, .samples = samples, .tiling = tiling, .usage = usageFlags, .sharingMode = VK_SHARING_MODE_EXCLUSIVE, .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, }; if (IGL_VULKAN_USE_VMA && !isDisjoint) { const bool isHostVisible = (memFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0; const bool isLazilyAllocated = (memFlags & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) != 0; const VmaAllocationCreateInfo ciAlloc = { .flags = 0, .usage = isHostVisible ? VMA_MEMORY_USAGE_CPU_TO_GPU : VMA_MEMORY_USAGE_AUTO, // For lazily allocated (memoryless) images, require the flag so VMA picks GMEM-backed // memory on TBDR GPUs. For other non-host-visible cases, pass memFlags as a preference // to guide VMA without causing hard allocation failures. .requiredFlags = isLazilyAllocated ? memFlags : static_cast(0), .preferredFlags = (!isHostVisible && !isLazilyAllocated) ? memFlags : static_cast(0), }; const VkResult result = vmaCreateImage( (VmaAllocator)ctx_->getVmaAllocator(), &ci, &ciAlloc, &vkImage_, &vmaAllocation_, nullptr); if (result != VK_SUCCESS || vmaAllocation_ == nullptr) { IGL_LOG_INFO( "vmaCreateImage failed: error result: %d, memflags: %d, imageformat: %d. Retrying after " "draining deferred tasks.\n", result, memFlags, imageFormat_); // Allocation failed - possibly due to memory pressure from deferred tasks not being // processed. Drain deferred tasks queue to free memory and retry. const_cast(*ctx_).waitDeferredTasks(); const VkResult retryResult = vmaCreateImage((VmaAllocator)ctx_->getVmaAllocator(), &ci, &ciAlloc, &vkImage_, &vmaAllocation_, nullptr); if (retryResult != VK_SUCCESS || vmaAllocation_ == nullptr) { IGL_LOG_INFO( "vmaCreateImage retry failed: error result: %d, memflags: %d, imageformat: %d. " "Continuing with null allocation.\n", retryResult, memFlags, imageFormat_); } else { IGL_LOG_INFO( "vmaCreateImage retry succeeded: memflags: %d, imageformat: %d after draining " "deferred tasks.\n", memFlags, imageFormat_); } } if (vmaAllocation_) { VkMemoryRequirements memRequirements; ctx_->vf_.vkGetImageMemoryRequirements(device_, vkImage_, &memRequirements); // handle memory-mapped buffers if (memFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) { vmaMapMemory((VmaAllocator)ctx_->getVmaAllocator(), vmaAllocation_, &mappedPtr_); if (memRequirements.memoryTypeBits & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) { isCoherentMemory_ = true; } } vmaSetAllocationName((VmaAllocator)ctx_->getVmaAllocator(), vmaAllocation_, IGL_FORMAT("VMA Allocation: {}", debugName).c_str()); VmaAllocationInfo allocationInfo; vmaGetAllocationInfo((VmaAllocator)ctx_->getVmaAllocator(), vmaAllocation_, &allocationInfo); allocatedSize = allocationInfo.size; } } else { // create a disjoint image - TODO: merge it with the VMA code path above VK_ASSERT(ctx_->vf_.vkCreateImage(device_, &ci, nullptr, &vkImage_)); VkMemoryRequirements2 memRequirements[3] = { {.sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2}, {.sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2}, {.sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2}, }; // back the image with some memory { const uint32_t numPlanes = igl::vulkan::getNumImagePlanes(format); IGL_DEBUG_ASSERT(numPlanes > 0 && numPlanes <= kMaxImagePlanes); // NOLINTNEXTLINE(modernize-avoid-c-arrays) const VkImagePlaneMemoryRequirementsInfo planes[kMaxImagePlanes] = { {.sType = VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO, .planeAspect = VK_IMAGE_ASPECT_PLANE_0_BIT}, {.sType = VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO, .planeAspect = VK_IMAGE_ASPECT_PLANE_1_BIT}, {.sType = VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO, .planeAspect = VK_IMAGE_ASPECT_PLANE_2_BIT}, }; // NOLINTNEXTLINE(modernize-avoid-c-arrays) const VkImageMemoryRequirementsInfo2 imgRequirements[kMaxImagePlanes] = { {.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2, .pNext = isDisjoint && numPlanes > 0 ? &planes[0] : nullptr, .image = vkImage_}, {.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2, .pNext = isDisjoint && numPlanes > 1 ? &planes[1] : nullptr, .image = vkImage_}, {.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2, .pNext = isDisjoint && numPlanes > 2 ? &planes[2] : nullptr, .image = vkImage_}, }; for (uint32_t p = 0; p != numPlanes; p++) { ctx_->vf_.vkGetImageMemoryRequirements2(device_, &imgRequirements[p], &memRequirements[p]); VK_ASSERT(ivkAllocateMemory2(&ctx_->vf_, physicalDevice_, device_, &memRequirements[p], memFlags, false, &vkMemory_[p])); VK_ASSERT(ivkSetDebugObjectName(&ctx_->vf_, device_, VK_OBJECT_TYPE_DEVICE_MEMORY, (uint64_t)vkMemory_[p], IGL_FORMAT("Memory [{}]: {}", p, debugName).c_str())); } // NOLINTNEXTLINE(modernize-avoid-c-arrays) const VkBindImagePlaneMemoryInfo bindImagePlaneMemoryInfo[kMaxImagePlanes] = { {.sType = VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO, .planeAspect = VK_IMAGE_ASPECT_PLANE_0_BIT}, {.sType = VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO, .planeAspect = VK_IMAGE_ASPECT_PLANE_1_BIT}, {.sType = VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO, .planeAspect = VK_IMAGE_ASPECT_PLANE_2_BIT}, }; // NOLINTNEXTLINE(modernize-avoid-c-arrays) const VkBindImageMemoryInfo bindInfo[kMaxImagePlanes] = { {.sType = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO, .pNext = isDisjoint ? &bindImagePlaneMemoryInfo[0] : nullptr, .image = vkImage_, .memory = vkMemory_[0]}, {.sType = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO, .pNext = &bindImagePlaneMemoryInfo[1], .image = vkImage_, .memory = vkMemory_[1]}, {.sType = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO, .pNext = &bindImagePlaneMemoryInfo[2], .image = vkImage_, .memory = vkMemory_[2]}, }; VK_ASSERT(ctx_->vf_.vkBindImageMemory2(device_, numPlanes, bindInfo)); allocatedSize = memRequirements[0].memoryRequirements.size + memRequirements[1].memoryRequirements.size + memRequirements[2].memoryRequirements.size; } // handle memory-mapped images if (memFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) { // map only the first image plane VK_ASSERT(ctx_->vf_.vkMapMemory(device_, vkMemory_[0], 0, VK_WHOLE_SIZE, 0, &mappedPtr_)); const uint32_t memoryTypeBits = memRequirements[0].memoryRequirements.memoryTypeBits; if (memoryTypeBits & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) { isCoherentMemory_ = true; } } } VK_ASSERT(ivkSetDebugObjectName( &ctx_->vf_, device_, VK_OBJECT_TYPE_IMAGE, (uint64_t)vkImage_, debugName)); // Get physical device's properties for the image's format ctx_->vf_.vkGetPhysicalDeviceFormatProperties(physicalDevice_, imageFormat_, &formatProperties_); } #if defined(IGL_ANDROID_HWBUFFER_SUPPORTED) VulkanImage::VulkanImage(const VulkanContext& ctx, AHardwareBuffer* hwBuffer, uint64_t memoryAllocationSize, VkExtent3D extent, VkImageType type, VkFormat format, uint32_t mipLevels, uint32_t arrayLayers, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageCreateFlags createFlags, VkSampleCountFlagBits samples, const char* debugName) : ctx_(&ctx), physicalDevice_(ctx.getVkPhysicalDevice()), device_(ctx.getVkDevice()), usageFlags_(usageFlags), extent_(extent), type_(type), imageFormat_(format), mipLevels_(mipLevels), arrayLayers_(arrayLayers), samples_(samples), isDepthFormat_(hasDepth(format)), isStencilFormat_(hasStencil(format)), isDepthOrStencilFormat_(isDepthFormat_ || isStencilFormat_), isImported_(true), tiling_(tiling) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); IGL_DEBUG_ASSERT(hwBuffer != nullptr); IGL_DEBUG_ASSERT(mipLevels_ > 0, "The image must contain at least one mip level"); IGL_DEBUG_ASSERT(arrayLayers_ > 0, "The image must contain at least one layer"); IGL_DEBUG_ASSERT(imageFormat_ != VK_FORMAT_UNDEFINED, "Invalid VkFormat value"); IGL_DEBUG_ASSERT(samples_ > 0, "The image must contain at least one sample"); setName(debugName); const VkExternalMemoryImageCreateInfo extImgMem = { .sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO, .handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID}; const VkImageCreateInfo ci = { .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, .pNext = &extImgMem, .flags = createFlags, .imageType = type, .format = imageFormat_, .extent = extent_, .mipLevels = mipLevels_, .arrayLayers = arrayLayers_, .samples = samples, .tiling = tiling, .usage = usageFlags, .sharingMode = VK_SHARING_MODE_EXCLUSIVE, .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, }; VK_ASSERT(ctx_->vf_.vkCreateImage(device_, &ci, nullptr, &vkImage_)); VK_ASSERT(ivkSetDebugObjectName( &ctx_->vf_, device_, VK_OBJECT_TYPE_IMAGE, (uint64_t)vkImage_, debugName)); // NOTE: Importing a hardware buffer causes Vulkan to acquire a reference to // the hardware buffer, which it releases when the allocated memory is freed. const VkImportAndroidHardwareBufferInfoANDROID hwBufferInfo = { .sType = VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID, .buffer = hwBuffer, }; VkMemoryDedicatedAllocateInfo dedicatedAllocateInfo = { .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO, .pNext = &hwBufferInfo, .image = vkImage_, .buffer = VK_NULL_HANDLE, }; VkAndroidHardwareBufferPropertiesANDROID hwBufferProperties{ .sType = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID, }; VK_ASSERT(ctx_->vf_.vkGetAndroidHardwareBufferPropertiesANDROID( device_, hwBuffer, &hwBufferProperties)); const VkMemoryAllocateInfo memoryAllocateInfo = { .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, .pNext = &dedicatedAllocateInfo, .allocationSize = hwBufferProperties.allocationSize, .memoryTypeIndex = ivkGetMemoryTypeIndex(ctx_->memoryProperties, hwBufferProperties.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)}; IGL_LOG_INFO("Imported texture has requirements %d, ends up index %d", hwBufferProperties.memoryTypeBits, memoryAllocateInfo.memoryTypeIndex); VK_ASSERT(ctx_->vf_.vkAllocateMemory(device_, &memoryAllocateInfo, nullptr, &vkMemory_[0])); VK_ASSERT(ctx_->vf_.vkBindImageMemory(device_, vkImage_, vkMemory_[0], 0)); ctx_->vf_.vkGetPhysicalDeviceFormatProperties(physicalDevice_, imageFormat_, &formatProperties_); } #endif // defined(IGL_ANDROID_HWBUFFER_SUPPORTED) VulkanImage::VulkanImage(const VulkanContext& ctx, int32_t undupedFileDescriptor, uint64_t memoryAllocationSize, VkExtent3D extent, VkImageType type, VkFormat format, uint32_t mipLevels, uint32_t arrayLayers, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageCreateFlags createFlags, VkSampleCountFlagBits samples, const char* debugName) : ctx_(&ctx), physicalDevice_(ctx.getVkPhysicalDevice()), device_(ctx.getVkDevice()), usageFlags_(usageFlags), extent_(extent), type_(type), imageFormat_(format), mipLevels_(mipLevels), arrayLayers_(arrayLayers), samples_(samples), isDepthFormat_(hasDepth(format)), // NOLINT(readability-identifier-naming) isStencilFormat_(hasStencil(format)), // NOLINT(readability-identifier-naming) isDepthOrStencilFormat_(isDepthFormat_ || isStencilFormat_), isImported_(true), tiling_(tiling) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); IGL_DEBUG_ASSERT(mipLevels_ > 0, "The image must contain at least one mip level"); IGL_DEBUG_ASSERT(arrayLayers_ > 0, "The image must contain at least one layer"); IGL_DEBUG_ASSERT(imageFormat_ != VK_FORMAT_UNDEFINED, "Invalid VkFormat value"); IGL_DEBUG_ASSERT(samples_ > 0, "The image must contain at least one sample"); #ifdef VK_USE_PLATFORM_WIN32_KHR IGL_DEBUG_ABORT("You can only import a VulkanImage on non-windows environments"); #endif setName(debugName); VkExternalMemoryImageCreateInfo extImgMem = { .sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO, .handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT, }; const VkImageCreateInfo ci = { .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, .pNext = &extImgMem, .flags = createFlags, .imageType = type, .format = imageFormat_, .extent = extent_, .mipLevels = mipLevels_, .arrayLayers = arrayLayers_, .samples = samples, .tiling = tiling, .usage = usageFlags, .sharingMode = VK_SHARING_MODE_EXCLUSIVE, .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, }; // create image.. importing external memory cannot use VMA VK_ASSERT(ctx_->vf_.vkCreateImage(device_, &ci, nullptr, &vkImage_)); VK_ASSERT(ivkSetDebugObjectName( &ctx_->vf_, device_, VK_OBJECT_TYPE_IMAGE, (uint64_t)vkImage_, debugName)); int importedFd = -1; #ifndef VK_USE_PLATFORM_WIN32_KHR importedFd = dup(undupedFileDescriptor); #endif IGL_DEBUG_ASSERT(importedFd >= 0); // NOTE: Importing memory from a file descriptor transfers ownership of the fd from the // app to the Vk implementation. The app must not perform any operations on the fd after // a successful import. // Vulkan implementation is responsible for closing the fds // // Apps can import the same underlying memory into: // - multiple instances of vk // - same instance from which it was exported // - multiple times into a given vk instance. // in all cases, each import operation must create a distinct VkDeviceMemory object const VkImageMemoryRequirementsInfo2 memoryRequirementInfo = { .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2, .image = vkImage_, }; VkMemoryRequirements2 memoryRequirements = { .sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2, }; ctx_->vf_.vkGetImageMemoryRequirements2(device_, &memoryRequirementInfo, &memoryRequirements); // TODO_VULKAN: Verify the following from the spec: // the memory from which fd was exported must have been created on the same physical device // as device. VkImportMemoryFdInfoKHR fdInfo = { .sType = VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR, .handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT, .fd = importedFd, }; const VkMemoryAllocateInfo memoryAllocateInfo = { .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, .pNext = &fdInfo, .allocationSize = memoryAllocationSize, .memoryTypeIndex = ivkGetMemoryTypeIndex(ctx_->memoryProperties, memoryRequirements.memoryRequirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT), }; IGL_LOG_INFO("Imported texture has requirements %d, ends up index %d", memoryRequirements.memoryRequirements.memoryTypeBits, memoryAllocateInfo.memoryTypeIndex); // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only // @fb-only VK_ASSERT(ctx_->vf_.vkAllocateMemory(device_, &memoryAllocateInfo, nullptr, &vkMemory_[0])); VK_ASSERT(ctx_->vf_.vkBindImageMemory(device_, vkImage_, vkMemory_[0], 0)); // @fb-only VK_ASSERT(ivkSetDebugObjectName(&ctx_->vf_, device_, VK_OBJECT_TYPE_DEVICE_MEMORY, (uint64_t)vkMemory_[0], IGL_FORMAT("Memory: {}", debugName).c_str())); ctx_->vf_.vkGetPhysicalDeviceFormatProperties(physicalDevice_, imageFormat_, &formatProperties_); } #if IGL_PLATFORM_WINDOWS VulkanImage::VulkanImage(const VulkanContext& ctx, void* windowsHandle, VkExtent3D extent, VkImageType type, VkFormat format, uint32_t mipLevels, uint32_t arrayLayers, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageCreateFlags createFlags, VkSampleCountFlagBits samples, const char* debugName) : ctx_(&ctx), physicalDevice_(ctx.getVkPhysicalDevice()), device_(ctx.getVkDevice()), usageFlags_(usageFlags), extent_(extent), type_(type), imageFormat_(format), mipLevels_(mipLevels), arrayLayers_(arrayLayers), samples_(samples), isDepthFormat_(hasDepth(format)), isStencilFormat_(hasStencil(format)), isDepthOrStencilFormat_(isDepthFormat_ || isStencilFormat_), isImported_(true), tiling_(tiling) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); IGL_DEBUG_ASSERT(mipLevels_ > 0, "The image must contain at least one mip level"); IGL_DEBUG_ASSERT(arrayLayers_ > 0, "The image must contain at least one layer"); IGL_DEBUG_ASSERT(imageFormat_ != VK_FORMAT_UNDEFINED, "Invalid VkFormat value"); IGL_DEBUG_ASSERT(samples_ > 0, "The image must contain at least one sample"); const VkExternalMemoryImageCreateInfo extImgMem = { .sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO, .handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT, }; const VkImageCreateInfo ci = { .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, .pNext = &extImgMem, .flags = createFlags, .imageType = type, .format = imageFormat_, .extent = extent_, .mipLevels = mipLevels_, .arrayLayers = arrayLayers_, .samples = samples, .tiling = tiling, .usage = usageFlags, .sharingMode = VK_SHARING_MODE_EXCLUSIVE, .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, }; // create image. importing external memory cannot use VMA VK_ASSERT(ctx_->vf_.vkCreateImage(device_, &ci, nullptr, &vkImage_)); VK_ASSERT(ivkSetDebugObjectName( &ctx_->vf_, device_, VK_OBJECT_TYPE_IMAGE, (uint64_t)vkImage_, debugName)); const VkImageMemoryRequirementsInfo2 memoryRequirementInfo = { .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2, .image = vkImage_, }; VkMemoryRequirements2 memoryRequirements = {.sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2}; ctx_->vf_.vkGetImageMemoryRequirements2(device_, &memoryRequirementInfo, &memoryRequirements); const VkImportMemoryWin32HandleInfoKHR handleInfo = { .sType = VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR, .handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT, .handle = windowsHandle, }; const VkMemoryAllocateInfo memoryAllocateInfo = { .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, .pNext = &handleInfo, .allocationSize = memoryRequirements.memoryRequirements.size, .memoryTypeIndex = ivkGetMemoryTypeIndex(ctx_->memoryProperties, memoryRequirements.memoryRequirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT), }; IGL_LOG_INFO("Imported texture has memoryAllocationSize %" PRIu64 ", requirements 0x%08X, ends up index 0x%08X", memoryRequirements.memoryRequirements.size, memoryRequirements.memoryRequirements.memoryTypeBits, memoryAllocateInfo.memoryTypeIndex); VK_ASSERT(ctx_->vf_.vkAllocateMemory(device_, &memoryAllocateInfo, nullptr, &vkMemory_[0])); VK_ASSERT(ctx_->vf_.vkBindImageMemory(device_, vkImage_, vkMemory_[0], 0)); VK_ASSERT(ivkSetDebugObjectName(&ctx_->vf_, device_, VK_OBJECT_TYPE_DEVICE_MEMORY, (uint64_t)vkMemory_[0], IGL_FORMAT("Memory: {}", debugName).c_str())); ctx_->vf_.vkGetPhysicalDeviceFormatProperties(physicalDevice_, imageFormat_, &formatProperties_); } #endif // IGL_PLATFORM_WINDOWS #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_LINUX || IGL_PLATFORM_ANDROID VulkanImage VulkanImage::createWithExportMemory(const VulkanContext& ctx, VkExtent3D extent, VkImageType type, VkFormat format, uint32_t mipLevels, uint32_t arrayLayers, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageCreateFlags createFlags, VkSampleCountFlagBits samples, const char* debugName) { const VkPhysicalDeviceExternalImageFormatInfo externaInfo = { .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO, .handleType = kHandleType, }; const VkPhysicalDeviceImageFormatInfo2 formatInfo2 = { .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2, .pNext = &externaInfo, .format = format, .type = VK_IMAGE_TYPE_2D, .tiling = tiling, .usage = usageFlags, .flags = createFlags, }; VkExternalImageFormatProperties externalImageFormatProperties = { .sType = VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES, }; VkImageFormatProperties2 imageFormatProperties2 = { .sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2, .pNext = &externalImageFormatProperties, }; const auto result = ctx.vf_.vkGetPhysicalDeviceImageFormatProperties2( ctx.getVkPhysicalDevice(), &formatInfo2, &imageFormatProperties2); if (result != VK_SUCCESS) { IGL_LOG_ERROR( "External memory is not supported. format: %d image_tiling: %d usage: %d flags: %d", format, tiling, usageFlags, createFlags); return VulkanImage(); } const auto& externalFormatProperties = externalImageFormatProperties.externalMemoryProperties; if (!(externalFormatProperties.externalMemoryFeatures & VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT)) { IGL_LOG_ERROR( "External memory cannot be exported. format: %d image_tiling: %d usage: %d flags: %d", format, tiling, usageFlags, createFlags); return VulkanImage(); } VkExternalMemoryHandleTypeFlags compatibleHandleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_FLAG_BITS_MAX_ENUM; IGL_DEBUG_ASSERT(externalFormatProperties.compatibleHandleTypes & kHandleType); compatibleHandleTypes = kHandleType; return {ctx, extent, type, format, mipLevels, arrayLayers, tiling, usageFlags, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, createFlags, samples, compatibleHandleTypes, debugName}; } VulkanImage::VulkanImage(const VulkanContext& ctx, VkExtent3D extent, VkImageType type, VkFormat format, uint32_t mipLevels, uint32_t arrayLayers, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkMemoryPropertyFlags memFlags, VkImageCreateFlags createFlags, VkSampleCountFlagBits samples, VkExternalMemoryHandleTypeFlags compatibleHandleTypes, const char* debugName) : ctx_(&ctx), physicalDevice_(ctx.getVkPhysicalDevice()), device_(ctx.getVkDevice()), usageFlags_(usageFlags), extent_(extent), type_(type), imageFormat_(format), mipLevels_(mipLevels), arrayLayers_(arrayLayers), samples_(samples), isDepthFormat_(hasDepth(format)), // NOLINT(readability-identifier-naming) isStencilFormat_(hasStencil(format)), // NOLINT(readability-identifier-naming) isDepthOrStencilFormat_(isDepthFormat_ || isStencilFormat_), isExported_(true), tiling_(tiling) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); IGL_DEBUG_ASSERT(mipLevels_ > 0, "The image must contain at least one mip level"); IGL_DEBUG_ASSERT(arrayLayers_ > 0, "The image must contain at least one layer"); IGL_DEBUG_ASSERT(imageFormat_ != VK_FORMAT_UNDEFINED, "Invalid VkFormat value"); IGL_DEBUG_ASSERT(samples_ > 0, "The image must contain at least one sample"); const VkExternalMemoryImageCreateInfo externalImageCreateInfo = { .sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO, .handleTypes = compatibleHandleTypes, }; const VkImageCreateInfo ci = { .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, .pNext = &externalImageCreateInfo, .flags = createFlags, .imageType = type, .format = imageFormat_, .extent = extent_, .mipLevels = mipLevels_, .arrayLayers = arrayLayers_, .samples = samples, .tiling = tiling, .usage = usageFlags, .sharingMode = VK_SHARING_MODE_EXCLUSIVE, .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, }; // create VkImage importing external memory cannot use VMA VK_ASSERT(ctx_->vf_.vkCreateImage(device_, &ci, nullptr, &vkImage_)); VK_ASSERT(ivkSetDebugObjectName( &ctx_->vf_, device_, VK_OBJECT_TYPE_IMAGE, (uint64_t)vkImage_, debugName)); // For Android we need a dedicated allocation for exporting the image, otherwise // the exported handle is not generated properly. #if IGL_PLATFORM_ANDROID VkMemoryDedicatedAllocateInfo dedicatedAllocateInfo = { .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO, .pNext = nullptr, .image = vkImage_, .buffer = VK_NULL_HANDLE, }; #endif // IGL_PLATFORM_ANDROID const VkExportMemoryAllocateInfo externalMemoryAllocateInfo = { .sType = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO, #if IGL_PLATFORM_ANDROID .pNext = &dedicatedAllocateInfo, #endif // IGL_PLATFORM_ANDROID .handleTypes = compatibleHandleTypes, }; std::array bindImagePlaneMemoryInfo{}; std::array bindInfo{}; const uint32_t numPlanes = igl::vulkan::getNumImagePlanes(format); IGL_DEBUG_ASSERT(numPlanes > 0 && numPlanes <= kMaxImagePlanes); for (uint32_t p = 0; p != numPlanes; p++) { auto imagePlaneMemoryRequirementsInfo = VkImagePlaneMemoryRequirementsInfo{ .sType = VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO, .planeAspect = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_PLANE_0_BIT << p), }; const VkImageMemoryRequirementsInfo2 imageMemoryRequirementInfo = { .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2, .pNext = numPlanes > 1 ? &imagePlaneMemoryRequirementsInfo : nullptr, .image = vkImage_, }; VkMemoryRequirements2 memoryRequirements = {.sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2}; ctx_->vf_.vkGetImageMemoryRequirements2( device_, &imageMemoryRequirementInfo, &memoryRequirements); const VkMemoryAllocateInfo memoryAllocateInfo = { .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, .pNext = &externalMemoryAllocateInfo, .allocationSize = memoryRequirements.memoryRequirements.size, .memoryTypeIndex = ivkGetMemoryTypeIndex( ctx_->memoryProperties, memoryRequirements.memoryRequirements.memoryTypeBits, memFlags), }; IGL_LOG_INFO("Creating image to be exported with memoryAllocationSize %" PRIu64 ", requirements 0x%08X, ends up index 0x%08X", memoryRequirements.memoryRequirements.size, memoryRequirements.memoryRequirements.memoryTypeBits, memoryAllocateInfo.memoryTypeIndex); VK_ASSERT(ctx_->vf_.vkAllocateMemory(device_, &memoryAllocateInfo, nullptr, &vkMemory_[p])); VK_ASSERT(ivkSetDebugObjectName(&ctx_->vf_, device_, VK_OBJECT_TYPE_DEVICE_MEMORY, (uint64_t)vkMemory_[p], IGL_FORMAT("Memory [{}]: {}", p, debugName).c_str())); bindImagePlaneMemoryInfo[p] = VkBindImagePlaneMemoryInfo{ .sType = VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO, .planeAspect = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_PLANE_0_BIT << p), }; bindInfo[p] = VkBindImageMemoryInfo{ .sType = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO, .pNext = numPlanes > 1 ? &bindImagePlaneMemoryInfo[p] : nullptr, .image = vkImage_, .memory = vkMemory_[p], }; } VK_ASSERT(ctx_->vf_.vkBindImageMemory2(device_, numPlanes, bindInfo.data())); #if IGL_PLATFORM_WINDOWS const VkMemoryGetWin32HandleInfoKHR getHandleInfo{ .sType = VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR, .memory = vkMemory_[0], .handleType = kHandleType, }; VK_ASSERT(ctx_->vf_.vkGetMemoryWin32HandleKHR(device_, &getHandleInfo, &exportedMemoryHandle_)); #else const VkMemoryGetFdInfoKHR getFdInfo{ .sType = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR, .memory = vkMemory_[0], .handleType = kHandleType, }; VK_ASSERT(ctx_->vf_.vkGetMemoryFdKHR(device_, &getFdInfo, &exportedFd_)); #endif } #endif // IGL_PLATFORM_WINDOWS || IGL_PLATFORM_LINUX || IGL_PLATFORM_ANDROID VulkanImage::~VulkanImage() { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_DESTROY); destroy(); } void VulkanImage::destroy() { if (!valid()) { return; } IGL_ENSURE_VULKAN_CONTEXT_THREAD(ctx_); if (!isExternallyManaged_) { if (vkMemory_[1] == VK_NULL_HANDLE) { if (vmaAllocation_) { if (mappedPtr_) { vmaUnmapMemory((VmaAllocator)ctx_->getVmaAllocator(), vmaAllocation_); } ctx_->deferredTask(std::packaged_task( [vma = ctx_->getVmaAllocator(), image = vkImage_, allocation = vmaAllocation_]() { vmaDestroyImage((VmaAllocator)vma, image, allocation); })); } else { if (mappedPtr_) { ctx_->vf_.vkUnmapMemory(device_, vkMemory_[0]); } ctx_->deferredTask(std::packaged_task( [vf = &ctx_->vf_, device = device_, image = vkImage_, memory = vkMemory_[0]]() { vf->vkDestroyImage(device, image, nullptr); if (memory != VK_NULL_HANDLE) { vf->vkFreeMemory(device, memory, nullptr); } })); } } else { // this never uses VMA if (mappedPtr_) { ctx_->vf_.vkUnmapMemory(device_, vkMemory_[0]); } ctx_->deferredTask(std::packaged_task([vf = &ctx_->vf_, device = device_, image = vkImage_, memory0 = vkMemory_[0], memory1 = vkMemory_[1], memory2 = vkMemory_[2]]() { vf->vkDestroyImage(device, image, nullptr); vf->vkFreeMemory(device, memory0, nullptr); vf->vkFreeMemory(device, memory1, nullptr); vf->vkFreeMemory(device, memory2, nullptr); })); } } ctx_ = nullptr; vkImage_ = VK_NULL_HANDLE; } VulkanImageView VulkanImage::createImageView(VkImageViewType type, VkFormat format, VkImageAspectFlags aspectMask, uint32_t baseLevel, uint32_t numLevels, uint32_t baseLayer, uint32_t numLayers, const char* debugName) const { const VulkanImageViewCreateInfo ci = { .image = vkImage_, .viewType = type, .format = format, .subresourceRange = VkImageSubresourceRange{.aspectMask = aspectMask, .baseMipLevel = baseLevel, .levelCount = numLevels, .baseArrayLayer = baseLayer, .layerCount = numLayers}, }; return VulkanImageView{*ctx_, ci, debugName}; } VulkanImageView VulkanImage::createImageView(VulkanImageViewCreateInfo createInfo, const char* debugName) const { createInfo.image = vkImage_; return VulkanImageView{*ctx_, createInfo, debugName}; } void VulkanImage::transitionLayout(VkCommandBuffer cmdBuf, VkImageLayout newImageLayout, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, const VkImageSubresourceRange& subresourceRange) const { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_TRANSITION); VkAccessFlags srcAccessMask = 0; VkAccessFlags dstAccessMask = 0; if (imageLayout_ == VK_IMAGE_LAYOUT_UNDEFINED) { // we do not need to wait for any previous operations in this case srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; } const VkPipelineStageFlags doNotRequireAccessMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT | VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; VkPipelineStageFlags srcRemainingMask = srcStageMask & ~doNotRequireAccessMask; VkPipelineStageFlags dstRemainingMask = dstStageMask & ~doNotRequireAccessMask; if (srcStageMask & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) { srcAccessMask |= VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; srcRemainingMask &= ~VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; } if (srcStageMask & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) { srcAccessMask |= VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; srcRemainingMask &= ~VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; } if (srcStageMask & VK_PIPELINE_STAGE_TRANSFER_BIT) { srcAccessMask |= VK_ACCESS_TRANSFER_WRITE_BIT; srcRemainingMask &= ~VK_PIPELINE_STAGE_TRANSFER_BIT; } if (srcStageMask & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) { srcAccessMask |= VK_ACCESS_SHADER_READ_BIT; srcAccessMask |= VK_ACCESS_SHADER_WRITE_BIT; srcRemainingMask &= ~VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT; } if (srcStageMask & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) { srcAccessMask |= VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT; srcAccessMask |= VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; srcRemainingMask &= ~VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT; } if (srcStageMask & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) { srcAccessMask |= VK_ACCESS_SHADER_READ_BIT; srcRemainingMask &= ~VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; } (void)srcRemainingMask; IGL_DEBUG_ASSERT( srcRemainingMask == 0, "Automatic access mask deduction is not implemented (yet) for this srcStageMask = %u", srcRemainingMask); if (dstStageMask & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) { dstAccessMask |= VK_ACCESS_SHADER_READ_BIT; dstAccessMask |= VK_ACCESS_SHADER_WRITE_BIT; dstRemainingMask &= ~VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT; } if (dstStageMask & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) { dstAccessMask |= VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; dstRemainingMask &= ~VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; } if (dstStageMask & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) { dstAccessMask |= VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT; dstAccessMask |= VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; dstRemainingMask &= ~VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT; } if (dstStageMask & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) { dstAccessMask |= VK_ACCESS_SHADER_READ_BIT; dstRemainingMask &= ~VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; } if (dstStageMask & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) { dstAccessMask |= VK_ACCESS_SHADER_READ_BIT; dstRemainingMask &= ~VK_PIPELINE_STAGE_VERTEX_SHADER_BIT; } if (dstStageMask & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) { dstAccessMask |= VK_ACCESS_INDEX_READ_BIT; dstAccessMask |= VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT; dstRemainingMask &= ~VK_PIPELINE_STAGE_VERTEX_INPUT_BIT; } if (dstStageMask & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) { dstAccessMask |= VK_ACCESS_INDIRECT_COMMAND_READ_BIT; dstRemainingMask &= ~VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT; } if (dstStageMask & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) { dstAccessMask |= VK_ACCESS_COLOR_ATTACHMENT_READ_BIT; dstAccessMask |= VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; dstRemainingMask &= ~VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; } if (dstStageMask & VK_PIPELINE_STAGE_TRANSFER_BIT) { dstAccessMask |= VK_ACCESS_TRANSFER_READ_BIT; dstAccessMask |= VK_ACCESS_TRANSFER_WRITE_BIT; dstRemainingMask &= ~VK_PIPELINE_STAGE_TRANSFER_BIT; } (void)dstRemainingMask; IGL_DEBUG_ASSERT( dstRemainingMask == 0, "Automatic access mask deduction is not implemented (yet) for this dstStageMask = %u", dstRemainingMask); #if IGL_DEBUG_ENFORCE_FULL_IMAGE_BARRIER // full image barrier srcAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT; dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT; srcStageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; dstStageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; #endif // IGL_DEBUG_ENFORCE_FULL_IMAGE_BARRIER ivkImageMemoryBarrier(&ctx_->vf_, cmdBuf, vkImage_, srcAccessMask, dstAccessMask, imageLayout_, newImageLayout, srcStageMask, dstStageMask, subresourceRange); imageLayout_ = newImageLayout; } void VulkanImage::clearColorImage(VkCommandBuffer commandBuffer, const igl::Color& rgba, const VkImageSubresourceRange* subresourceRange) const { IGL_DEBUG_ASSERT(usageFlags_ & VK_IMAGE_USAGE_TRANSFER_DST_BIT); IGL_DEBUG_ASSERT(samples_ == VK_SAMPLE_COUNT_1_BIT); IGL_DEBUG_ASSERT(!isDepthOrStencilFormat_); const VkImageLayout oldLayout = imageLayout_; VkClearColorValue value; value.float32[0] = rgba.r; value.float32[1] = rgba.g; value.float32[2] = rgba.b; value.float32[3] = rgba.a; const VkImageSubresourceRange defaultRange{ .aspectMask = getImageAspectFlags(), .baseMipLevel = 0, .levelCount = VK_REMAINING_MIP_LEVELS, .baseArrayLayer = 0, .layerCount = VK_REMAINING_ARRAY_LAYERS, }; transitionLayout(commandBuffer, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, subresourceRange ? *subresourceRange : defaultRange); ctx_->vf_.vkCmdClearColorImage(commandBuffer, getVkImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &value, 1, subresourceRange ? subresourceRange : &defaultRange); const VkImageLayout newLayout = oldLayout == VK_IMAGE_LAYOUT_UNDEFINED ? (usageFlags_ & VK_IMAGE_USAGE_SAMPLED_BIT ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) : oldLayout; transitionLayout(commandBuffer, newLayout, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, subresourceRange ? *subresourceRange : defaultRange); } VkImageAspectFlags VulkanImage::getImageAspectFlags() const { VkImageAspectFlags flags = 0; if (isDepthFormat_) { flags |= VK_IMAGE_ASPECT_DEPTH_BIT; } if (isStencilFormat_) { flags |= VK_IMAGE_ASPECT_STENCIL_BIT; } if (!isDepthOrStencilFormat_) { flags |= VK_IMAGE_ASPECT_COLOR_BIT; } return flags; } void VulkanImage::generateMipmap(VkCommandBuffer commandBuffer, const TextureRangeDesc& range) const { IGL_PROFILER_FUNCTION(); // Check if device supports downscaling for color or depth/stencil buffer based on image format { const uint32_t formatFeatureMask = (VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT); const bool hardwareDownscalingSupported = ((formatProperties_.optimalTilingFeatures & formatFeatureMask) == formatFeatureMask); if (!IGL_DEBUG_VERIFY(hardwareDownscalingSupported)) { IGL_DEBUG_ABORT(IGL_FORMAT("Doesn't support hardware downscaling of this image format: {}", uint32_t(imageFormat_)) .c_str()); return; } } // Choose linear filter for color formats if supported by the device, else use nearest filter // Choose nearest filter by default for depth/stencil formats const VkFilter blitFilter = [](bool isDepthOrStencilFormat, bool imageFilterLinear) { if (isDepthOrStencilFormat) { return VK_FILTER_NEAREST; } if (imageFilterLinear) { return VK_FILTER_LINEAR; } return VK_FILTER_NEAREST; }(isDepthOrStencilFormat_, (formatProperties_.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) != 0u); const VkImageAspectFlags imageAspectFlags = getImageAspectFlags(); ivkCmdBeginDebugUtilsLabel( &ctx_->vf_, commandBuffer, "Generate mipmaps", K_COLOR_GENERATE_MIPMAPS.toFloatPtr()); IGL_SCOPE_EXIT { ivkCmdEndDebugUtilsLabel(&ctx_->vf_, commandBuffer); }; const VkImageLayout originalImageLayout = imageLayout_; IGL_DEBUG_ASSERT(originalImageLayout != VK_IMAGE_LAYOUT_UNDEFINED); IGL_DEBUG_ASSERT(!isCubemap_ || arrayLayers_ % 6u == 0, "Cubemaps must have a multiple of 6 array layers!"); const uint32_t multiplier = isCubemap_ ? arrayLayers_ / 6u : 1u; // 0: Transition the first mip-level - all layers - to VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL transitionLayout( commandBuffer, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, VkImageSubresourceRange{ imageAspectFlags, range.mipLevel, range.numMipLevels, 0, VK_REMAINING_ARRAY_LAYERS}); for (uint32_t arrayLayer = range.layer; arrayLayer < (range.layer + range.numLayers); ++arrayLayer) { for (uint32_t face = range.face; face < (range.face + range.numFaces); ++face) { const uint32_t layer = arrayLayer * multiplier + face; int32_t mipWidth = extent_.width > 1 ? (int32_t)extent_.width >> (range.mipLevel) : 1; int32_t mipHeight = extent_.height > 1 ? (int32_t)extent_.height >> (range.mipLevel) : 1; for (uint32_t i = (range.mipLevel + 1); i < (range.mipLevel + range.numMipLevels); ++i) { // 1: Transition the i-th level to VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL // It will be copied into from the (i-1)-th layer ivkImageMemoryBarrier(&ctx_->vf_, commandBuffer, vkImage_, 0, /* srcAccessMask */ VK_ACCESS_TRANSFER_WRITE_BIT, /* dstAccessMask */ VK_IMAGE_LAYOUT_UNDEFINED, /* oldImageLayout */ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, /* newImageLayout */ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, /* srcStageMask */ VK_PIPELINE_STAGE_TRANSFER_BIT, /* dstStageMask */ VkImageSubresourceRange{imageAspectFlags, i, 1, layer, 1}); const int32_t nextLevelWidth = mipWidth > 1 ? mipWidth / 2 : 1; const int32_t nextLevelHeight = mipHeight > 1 ? mipHeight / 2 : 1; const std::array srcOffsets = { VkOffset3D{0, 0, 0}, VkOffset3D{mipWidth, mipHeight, 1}, }; const std::array dstOffsets = { VkOffset3D{0, 0, 0}, VkOffset3D{nextLevelWidth, nextLevelHeight, 1}, }; // 2: Blit the image from the prev mip-level (i-1) (VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL) // to the current mip level (i) (VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL) #if IGL_VULKAN_PRINT_COMMANDS IGL_LOG_INFO("%p vkCmdBlitImage()\n", commandBuffer); #endif // IGL_VULKAN_PRINT_COMMANDS ivkCmdBlitImage(&ctx_->vf_, commandBuffer, vkImage_, vkImage_, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, srcOffsets.data(), dstOffsets.data(), VkImageSubresourceLayers{imageAspectFlags, i - 1, layer, 1}, VkImageSubresourceLayers{imageAspectFlags, i, layer, 1}, blitFilter); // 3: Transition i-th level to VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL as it will be read // from in the next iteration ivkImageMemoryBarrier(&ctx_->vf_, commandBuffer, vkImage_, VK_ACCESS_TRANSFER_WRITE_BIT, /* srcAccessMask */ VK_ACCESS_TRANSFER_READ_BIT, /* dstAccessMask */ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, /* oldImageLayout */ VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, /* newImageLayout */ VK_PIPELINE_STAGE_TRANSFER_BIT, /* srcStageMask */ VK_PIPELINE_STAGE_TRANSFER_BIT /* dstStageMask */, VkImageSubresourceRange{imageAspectFlags, i, 1, layer, 1}); // Compute the size of the next mip-level mipWidth = nextLevelWidth; mipHeight = nextLevelHeight; } } } // 4: Transition all levels and layers/faces to their final layout ivkImageMemoryBarrier( &ctx_->vf_, commandBuffer, vkImage_, VK_ACCESS_TRANSFER_WRITE_BIT, // srcAccessMask 0, // dstAccessMask VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // oldImageLayout originalImageLayout, // newImageLayout VK_PIPELINE_STAGE_TRANSFER_BIT, // srcStageMask VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, // dstStageMask VkImageSubresourceRange{ imageAspectFlags, range.mipLevel, range.numMipLevels, 0, VK_REMAINING_ARRAY_LAYERS}); imageLayout_ = originalImageLayout; } void VulkanImage::setName(std::string name) noexcept { // NOLINT(bugprone-exception-escape) #if IGL_DEBUG name_ = std::move(name); #else (void)name; #endif } bool VulkanImage::valid() const { return ctx_ != nullptr; } VulkanImage& VulkanImage::operator=(VulkanImage&& other) noexcept { destroy(); ctx_ = other.ctx_; physicalDevice_ = other.physicalDevice_; device_ = other.device_; vkImage_ = other.vkImage_; usageFlags_ = other.usageFlags_; vmaAllocation_ = other.vmaAllocation_; formatProperties_ = other.formatProperties_; mappedPtr_ = other.mappedPtr_; isExternallyManaged_ = other.isExternallyManaged_; extent_ = other.extent_; type_ = other.type_; imageFormat_ = other.imageFormat_; mipLevels_ = other.mipLevels_; arrayLayers_ = other.arrayLayers_; samples_ = other.samples_; isDepthFormat_ = other.isDepthFormat_; isStencilFormat_ = other.isStencilFormat_; isDepthOrStencilFormat_ = other.isDepthOrStencilFormat_; allocatedSize = other.allocatedSize; imageLayout_ = other.imageLayout_; isImported_ = other.isImported_; isCubemap_ = other.isCubemap_; isExported_ = other.isExported_; exportedMemoryHandle_ = other.exportedMemoryHandle_; exportedFd_ = other.exportedFd_; #if IGL_DEBUG name_ = std::move(other.name_); #endif tiling_ = other.tiling_; isCoherentMemory_ = other.isCoherentMemory_; extendedFormat_ = other.extendedFormat_; samplerYcbcrConversionCreateInfo_ = other.samplerYcbcrConversionCreateInfo_; for (size_t i = 0; i != IGL_ARRAY_NUM_ELEMENTS(vkMemory_); i++) { vkMemory_[i] = other.vkMemory_[i]; } other.ctx_ = nullptr; other.vkImage_ = VK_NULL_HANDLE; return *this; } void VulkanImage::flushMappedMemory() const { if (!isMappedPtrAccessible() || isCoherentMemory()) { return; } if (vmaAllocation_) { vmaFlushAllocation((VmaAllocator)ctx_->getVmaAllocator(), vmaAllocation_, 0, VK_WHOLE_SIZE); } else { const VkMappedMemoryRange memoryRange = { .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, .memory = vkMemory_[0], .offset = 0, .size = VK_WHOLE_SIZE, }; ctx_->vf_.vkFlushMappedMemoryRanges(device_, 1, &memoryRange); } } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanImage.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include struct AHardwareBuffer; namespace igl::vulkan { class VulkanContext; struct VulkanImageCreateInfo { VkImageUsageFlags usageFlags = 0; bool isExternallyManaged = true; VkExtent3D extent = VkExtent3D{0, 0, 0}; VkImageType type = VK_IMAGE_TYPE_MAX_ENUM; VkFormat imageFormat = VK_FORMAT_UNDEFINED; uint32_t mipLevels = 1; uint32_t arrayLayers = 1; VkSampleCountFlagBits samples = VK_SAMPLE_COUNT_1_BIT; bool isImported = false; }; /** * @brief Encapsulates a Vulkan Image object (`VkImage`) along with some of its properties */ class VulkanImage final { public: explicit VulkanImage() = default; /** * @brief Constructs a `VulkanImage` object from a `VkImage` object. If a debug name is provided, * the constructor will assign it to the `VkImage` object. No other Vulkan functions are called */ VulkanImage(const VulkanContext& ctx, VkImage image, const char* debugName = nullptr, VkImageUsageFlags usageFlags = 0, bool isExternallyManaged = true, VkExtent3D extent = VkExtent3D{0, 0, 0}, VkImageType type = VK_IMAGE_TYPE_MAX_ENUM, VkFormat imageFormat = VK_FORMAT_UNDEFINED, uint32_t mipLevels = 1, uint32_t arrayLayers = 1, VkSampleCountFlagBits samples = VK_SAMPLE_COUNT_1_BIT, bool isImported = false); /** * @brief Constructs a `VulkanImage` object from a `VkImage` object. If a debug name is provided, * the constructor will assign it to the `VkImage` object. No other Vulkan functions are called */ VulkanImage(const VulkanContext& ctx, VkImage image, const VulkanImageCreateInfo& createInfo, const char* debugName = nullptr); /** * @brief Constructs a `VulkanImage` object and a `VkImage` object. Except for the debug name, all * other parameters are required. The debug name, if provided, is associated with the newly * created `VkImage` object. * * The image must contain at least one mip level, one array layer and one sample * (`VK_SAMPLE_COUNT_1_BIT`). The format cannot be undefined (`VK_FORMAT_UNDEFINED`). * * If the image is host-visible (`memFlags` contains `VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT`), then * it is memory mapped until the object's destruction. */ VulkanImage(const VulkanContext& ctx, VkExtent3D extent, VkImageType type, VkFormat format, uint32_t mipLevels, uint32_t arrayLayers, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkMemoryPropertyFlags memFlags, VkImageCreateFlags createFlags, VkSampleCountFlagBits samples, const char* debugName = nullptr); #if defined(IGL_ANDROID_HWBUFFER_SUPPORTED) /** * @brief Constructs a `VulkanImage` object and a `VkImage` object from an `AHardwareBuffer`. The * `VkImage` object is backed by external memory. * * This constructor does not support VMA. * * Except for the debug name, all other parameters are required. The debug name, if provided, is * associated with the newly created `VkImage` object. * * The image must contain at least one mip-level, one array layer and one sample * (`VK_SAMPLE_COUNT_1_BIT`). The format cannot be undefined (`VK_FORMAT_UNDEFINED`). * * If the image is host-visible (`memFlags` contains `VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT`), then * it is memory mapped until the object's destruction. * * This constructor is only supported on Android environments. * * NOTE: Importing a hardware buffer causes Vulkan to acquire a reference to the hardware buffer, * which it releases when the allocated memory is freed. Destroying a VulkanImage does not * necessarily guarantee that the underlying hardware buffer is also freed, as the application may * retain additional references to the hardware buffer. */ VulkanImage(const VulkanContext& ctx, AHardwareBuffer* ahb, uint64_t memoryAllocationSize, VkExtent3D extent, VkImageType type, VkFormat format, uint32_t mipLevels, uint32_t arrayLayers, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageCreateFlags createFlags, VkSampleCountFlagBits samples, const char* debugName = nullptr); #endif // defined(IGL_ANDROID_HWBUFFER_SUPPORTED) /** * @brief Constructs a `VulkanImage` object and a `VkImage` object from a file descriptor. The * `VkImage` object is backed by external memory. The handle type of the external memory used is * `VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR`. * * This constructor does not support VMA. * * Except for the debug name, all other parameters are required. The debug name, if provided, is * associated with the newly created VkImage object. * * The image must contain at least one mip level, one array layer and one sample * (`VK_SAMPLE_COUNT_1_BIT`). The format cannot be undefined (`VK_FORMAT_UNDEFINED`). * * If the image is host-visible (`memFlags` contains `VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT`), then * it is memory mapped until the object's destruction. * * This constructor is only supported on non-Windows environments. * * NOTE: Importing memory from a file descriptor transfers ownership of the descriptor from the * application to the Vulkan implementation. The application must not perform any operations on * the file descriptor after a successful import. The file descriptors are closed on object's * destruction automatically. */ VulkanImage(const VulkanContext& ctx, int32_t undupedFileDescriptor, uint64_t memoryAllocationSize, VkExtent3D extent, VkImageType type, VkFormat format, uint32_t mipLevels, uint32_t arrayLayers, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageCreateFlags createFlags, VkSampleCountFlagBits samples, const char* debugName = nullptr); #if IGL_PLATFORM_WINDOWS /** * @brief Creates a `VulkanImage` with memory imported from a Windows handle. * NOTE: * 1. This should only be called on Windows and will crash on other platforms. * 2. The implementation currently only supports handleType * `VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT`, which means the handle must be created * by Vulkan API, not other graphics API. */ VulkanImage(const VulkanContext& ctx, void* windowsHandle, VkExtent3D extent, VkImageType type, VkFormat format, uint32_t mipLevels, uint32_t arrayLayers, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageCreateFlags createFlags, VkSampleCountFlagBits samples, const char* debugName = nullptr); #endif // IGL_PLATFORM_WINDOWS #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_LINUX || IGL_PLATFORM_ANDROID /** * @brief Creates a `VulkanImage` object whose memory can be exported externally. * On Windows, the exported `HANDLE` will be stored in `exportedMemoryHandle_`. * On Linux/Android, the exported file descriptor will be stored in `exportedFd_`. */ static VulkanImage createWithExportMemory(const VulkanContext& ctx, VkExtent3D extent, VkImageType type, VkFormat format, uint32_t mipLevels, uint32_t arrayLayers, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageCreateFlags createFlags, VkSampleCountFlagBits samples, const char* debugName = nullptr); #endif // IGL_PLATFORM_WINDOWS || IGL_PLATFORM_LINUX || IGL_PLATFORM_ANDROID ~VulkanImage(); VulkanImage(const VulkanImage&) = default; VulkanImage& operator=(const VulkanImage&) = delete; VulkanImage(VulkanImage&& other) noexcept { *this = std::move(other); } VulkanImage& operator=(VulkanImage&& other) noexcept; VkImage getVkImage() const { return vkImage_; } /** * @brief Returns true if the object is valid */ bool valid() const; VkImageUsageFlags getVkImageUsageFlags() const { return usageFlags_; } bool isSampledImage() const { return (usageFlags_ & VK_IMAGE_USAGE_SAMPLED_BIT) > 0; } bool isStorageImage() const { return (usageFlags_ & VK_IMAGE_USAGE_STORAGE_BIT) > 0; } /** * @brief Creates a `VkImageView` object from the `VkImage` stored in the object. * * Setting `numLevels` to a non-zero value will override `mipLevels_` value from the original * vulkan image, and can be used to create image views with different number of levels */ VulkanImageView createImageView(VkImageViewType type, VkFormat format, VkImageAspectFlags aspectMask, uint32_t baseLevel, uint32_t numLevels = VK_REMAINING_MIP_LEVELS, uint32_t baseLayer = 0, uint32_t numLayers = 1, const char* debugName = nullptr) const; VulkanImageView createImageView(VulkanImageViewCreateInfo createInfo, const char* debugName = nullptr) const; void generateMipmap(VkCommandBuffer commandBuffer, const TextureRangeDesc& range) const; /** * @brief Transitions the `VkImage`'s layout from the current layout (stored in the object) to the * `newImageLayout` by recording an Image Memory Barrier into the commandBuffer. * * The source and destination access masks for the transition are automatically deduced based on * the `srcStageMask` and the `dstStageMask` parameters. Not not all `VkPipelineStageFlags` are * supported. */ void transitionLayout(VkCommandBuffer cmdBuf, VkImageLayout newImageLayout, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, const VkImageSubresourceRange& subresourceRange) const; void clearColorImage(VkCommandBuffer commandBuffer, const igl::Color& rgba, const VkImageSubresourceRange* subresourceRange = nullptr) const; VkImageAspectFlags getImageAspectFlags() const; bool isMappedPtrAccessible() const { return (mappedPtr_ != nullptr) && ((tiling_ & VK_IMAGE_TILING_LINEAR) != 0); } bool isCoherentMemory() const { return isCoherentMemory_; } void flushMappedMemory() const; public: // Vulkan as for v1.3.210 supports max 3 planes for multi-plane images. static constexpr uint8_t kMaxImagePlanes = 3; const VulkanContext* ctx_ = nullptr; VkPhysicalDevice physicalDevice_ = VK_NULL_HANDLE; VkDevice device_ = VK_NULL_HANDLE; VkImage vkImage_ = VK_NULL_HANDLE; VkImageUsageFlags usageFlags_ = 0; // Separate VkDeviceMemory objects to support disjoint multiplanar images // NOLINTNEXTLINE(modernize-avoid-c-arrays) VkDeviceMemory vkMemory_[kMaxImagePlanes] = {VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE}; VmaAllocation vmaAllocation_ = VK_NULL_HANDLE; VkFormatProperties formatProperties_{}; void* mappedPtr_ = nullptr; bool isExternallyManaged_ = false; VkExtent3D extent_ = {0, 0, 0}; VkImageType type_ = VK_IMAGE_TYPE_MAX_ENUM; VkFormat imageFormat_ = VK_FORMAT_UNDEFINED; uint32_t mipLevels_ = 1; uint32_t arrayLayers_ = 1; VkSampleCountFlagBits samples_ = VK_SAMPLE_COUNT_1_BIT; bool isDepthFormat_ = false; bool isStencilFormat_ = false; bool isDepthOrStencilFormat_ = false; VkDeviceSize allocatedSize = 0; mutable VkImageLayout imageLayout_ = VK_IMAGE_LAYOUT_UNDEFINED; // current image layout bool isImported_ = false; bool isExported_ = false; bool isCubemap_ = false; void* exportedMemoryHandle_ = nullptr; // windows handle int exportedFd_ = -1; // linux fd uint32_t extendedFormat_ = 0; // defined by VkAndroidHardwareBufferFormatPropertiesANDROID VkSamplerYcbcrConversionCreateInfo samplerYcbcrConversionCreateInfo_ = {}; #if IGL_DEBUG std::string name_; #endif private: VkImageTiling tiling_ = VK_IMAGE_TILING_OPTIMAL; bool isCoherentMemory_ = false; #if IGL_PLATFORM_WINDOWS || IGL_PLATFORM_LINUX || IGL_PLATFORM_ANDROID /** * @brief Constructs a `VulkanImage` object and a `VkImage` object. Except for the debug name, all * other parameters are required. The debug name, if provided, is associated with the newly * created `VkImage` object. * * This version is only supported on Windows, Linux and Android environments and accepts both * `VkExternalMemoryImageCreateInfoKHR` and `VkExportMemoryAllocateInfoKHR` pre-filled structures. * * On Windows, the external memory handle is stored in `exportedMemoryHandle_`. On Linux and * Android the external memory handle is stored in `exportedFd_`. * * The image must contain at least one mip level, one array layer and one sample * (`VK_SAMPLE_COUNT_1_BIT`). The format cannot be undefined (`VK_FORMAT_UNDEFINED`). * * If the image is host-visible (`memFlags` contains `VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT`), then * it is memory mapped until the object's destruction. */ VulkanImage(const VulkanContext& ctx, VkExtent3D extent, VkImageType type, VkFormat format, uint32_t mipLevels, uint32_t arrayLayers, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkMemoryPropertyFlags memFlags, VkImageCreateFlags createFlags, VkSampleCountFlagBits samples, VkExternalMemoryHandleTypeFlags compatibleHandleTypes, const char* debugName); #endif // IGL_PLATFORM_WINDOWS || IGL_PLATFORM_LINUX || IGL_PLATFORM_ANDROID // No-op in all builds except DEBUG void setName(std::string name) noexcept; void destroy(); }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanImageView.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "VulkanImageView.h" #include #include namespace igl::vulkan { VulkanImageView::VulkanImageView(const VulkanContext& ctx, const VulkanImageViewCreateInfo& ci, const char* debugName) : VulkanImageView(ctx, VkImageViewCreateInfo{ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, .pNext = nullptr, .flags = 0, .image = ci.image, .viewType = ci.viewType, .format = ci.format, .components = ci.components, .subresourceRange = ci.subresourceRange, }, debugName) {} VulkanImageView::~VulkanImageView() { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_DESTROY); destroy(); } VulkanImageView::VulkanImageView(const VulkanContext& ctx, const VkImageViewCreateInfo& ci, const char* debugName) : ctx(&ctx), aspectMask(ci.subresourceRange.aspectMask) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); VkImageViewCreateInfo ciCopy(ci); VkSamplerYcbcrConversionInfo info{}; if (!ci.pNext && igl::vulkan::getNumImagePlanes(ci.format) > 1) { info = ctx.getOrCreateYcbcrConversionInfo(ci.format); ciCopy.pNext = &info; } VkDevice device = this->ctx->getVkDevice(); VK_ASSERT(this->ctx->vf_.vkCreateImageView(device, &ci, nullptr, &vkImageView)); VK_ASSERT(ivkSetDebugObjectName( &this->ctx->vf_, device, VK_OBJECT_TYPE_IMAGE_VIEW, (uint64_t)vkImageView, debugName)); } VulkanImageView& VulkanImageView::operator=(VulkanImageView&& other) noexcept { destroy(); ctx = other.ctx; vkImageView = other.vkImageView; aspectMask = other.aspectMask; other.ctx = nullptr; other.vkImageView = VK_NULL_HANDLE; other.aspectMask = 0; return *this; } [[nodiscard]] bool VulkanImageView::valid() const { return ctx != nullptr; } void VulkanImageView::destroy() { if (!valid()) { return; } IGL_ENSURE_VULKAN_CONTEXT_THREAD(ctx); ctx->deferredTask(std::packaged_task( [vf = &ctx->vf_, device = ctx->getVkDevice(), imageView = vkImageView]() { vf->vkDestroyImageView(device, imageView, nullptr); })); vkImageView = VK_NULL_HANDLE; ctx = nullptr; } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanImageView.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::vulkan { class VulkanContext; struct VulkanImageViewCreateInfo { VkImage image = VK_NULL_HANDLE; VkImageViewType viewType = VK_IMAGE_VIEW_TYPE_2D; VkFormat format = VK_FORMAT_UNDEFINED; VkComponentMapping components = { .r = VK_COMPONENT_SWIZZLE_IDENTITY, .g = VK_COMPONENT_SWIZZLE_IDENTITY, .b = VK_COMPONENT_SWIZZLE_IDENTITY, .a = VK_COMPONENT_SWIZZLE_IDENTITY, }; VkImageSubresourceRange subresourceRange = { .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, .baseMipLevel = 0, .levelCount = 1, .baseArrayLayer = 0, .layerCount = 1, }; }; /** * @brief VulkanImageView is a RAII wrapper for VkImageView. * The device member is not managed by this class (it is used to destroy the imageView). */ class VulkanImageView final { public: explicit VulkanImageView() = default; /** * @brief Creates the VulkanImageView object which stores a handle to a newly created VkImageView. * The imageView is created from the device, image, and other parameters with a name that can be * used for debugging. */ VulkanImageView(const VulkanContext& ctx, const VulkanImageViewCreateInfo& ci, const char* debugName = nullptr); VulkanImageView(const VulkanContext& ctx, const VkImageViewCreateInfo& ci, const char* debugName = nullptr); ~VulkanImageView(); VulkanImageView(const VulkanImageView&) = delete; VulkanImageView& operator=(const VulkanImageView&) = delete; VulkanImageView(VulkanImageView&& other) noexcept { *this = std::move(other); } VulkanImageView& operator=(VulkanImageView&& other) noexcept; /** * @brief Returns Vulkan's opaque handle to the imageView object */ [[nodiscard]] VkImageView getVkImageView() const { return vkImageView; } /** * @brief Returns true if the object is valid */ [[nodiscard]] bool valid() const; /** * @brief Returns the VkImageAspectFlags used to create the imageView */ [[nodiscard]] VkImageAspectFlags getVkImageAspectFlags() const { return aspectMask; } public: const VulkanContext* ctx = nullptr; VkImageView vkImageView = VK_NULL_HANDLE; VkImageAspectFlags aspectMask = 0; private: void destroy(); }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanImmediateCommands.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "VulkanImmediateCommands.h" #include #include namespace igl::vulkan { VulkanImmediateCommands::VulkanImmediateCommands(const VulkanFunctionTable& vf, VkDevice device, uint32_t queueFamilyIndex, bool exportableFences, bool useTimelineSemaphoreAndSynchronization2, const char* debugName) : vf_(vf), device_(device), debugName_(debugName), lastSubmitSemaphore_({ .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO, .semaphore = VK_NULL_HANDLE, .value = 0ull, .stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, .deviceIndex = 0ul, }), waitSemaphore_({ .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO, .semaphore = VK_NULL_HANDLE, .value = 0ull, .stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, .deviceIndex = 0ul, }), signalSemaphore_({ .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO, .semaphore = VK_NULL_HANDLE, .value = 0ull, .stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, .deviceIndex = 0ul, }), useTimelineSemaphoreAndSynchronization2_(useTimelineSemaphoreAndSynchronization2) { IGL_PROFILER_FUNCTION(); vf_.vkGetDeviceQueue(device_, queueFamilyIndex, 0, &queue_); VK_ASSERT(ivkCreateCommandPool(&vf_, device_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, queueFamilyIndex, &commandPool_)); ivkSetDebugObjectName(&vf_, device, VK_OBJECT_TYPE_COMMAND_POOL, (uint64_t)commandPool_, IGL_FORMAT("Command Pool: {}", debugName).c_str()); buffers_.reserve(kMaxCommandBuffers); for (uint32_t i = 0; i != kMaxCommandBuffers; i++) { buffers_.emplace_back( VulkanFence(vf_, device_, VkFenceCreateFlagBits{}, exportableFences, IGL_FORMAT("Fence: commandBuffer #{}", i).c_str()), VulkanSemaphore( vf_, device_, false, IGL_FORMAT("Semaphore: {} ({})", debugName, i).c_str())); VK_ASSERT(ivkAllocateCommandBuffer(&vf_, device_, commandPool_, &buffers_[i].cmdBufAllocated)); buffers_[i].handle.bufferIndex = i; } } VulkanImmediateCommands::~VulkanImmediateCommands() { waitAll(); vf_.vkDestroyCommandPool(device_, commandPool_, nullptr); } void VulkanImmediateCommands::purge() { IGL_PROFILER_FUNCTION(); for (auto& buf : buffers_) { if (buf.cmdBuf == VK_NULL_HANDLE || buf.isEncoding) { continue; } const VkResult result = vf_.vkWaitForFences(device_, 1, &buf.fence.vkFence_, VK_TRUE, 0); if (result == VK_SUCCESS) { VK_ASSERT(vf_.vkResetCommandBuffer(buf.cmdBuf, VkCommandBufferResetFlags{0})); VK_ASSERT(vf_.vkResetFences(device_, 1, &buf.fence.vkFence_)); buf.cmdBuf = VK_NULL_HANDLE; numAvailableCommandBuffers_++; } else { if (result != VK_TIMEOUT) { VK_ASSERT(result); } } } } const VulkanImmediateCommands::CommandBufferWrapper& VulkanImmediateCommands::acquire() { IGL_PROFILER_FUNCTION(); if (!numAvailableCommandBuffers_) { purge(); } while (!numAvailableCommandBuffers_) { IGL_LOG_INFO("Waiting for command buffers...\n"); IGL_PROFILER_ZONE("Waiting for command buffers...", IGL_PROFILER_COLOR_WAIT); purge(); IGL_PROFILER_ZONE_END(); } VulkanImmediateCommands::CommandBufferWrapper* current = nullptr; // we are ok with any available buffer for (auto& buf : buffers_) { if (buf.cmdBuf == VK_NULL_HANDLE) { current = &buf; break; } } // make clang happy assert(current); IGL_DEBUG_ASSERT(numAvailableCommandBuffers_, "No available command buffers"); IGL_DEBUG_ASSERT(current, "No available command buffers"); IGL_DEBUG_ASSERT(current->cmdBufAllocated != VK_NULL_HANDLE); current->handle.submitId = submitCounter_; numAvailableCommandBuffers_--; current->cmdBuf = current->cmdBufAllocated; current->isEncoding = true; current->fd = -1; const VkCommandBufferBeginInfo bi = { .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, .flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, }; VK_ASSERT(vf_.vkBeginCommandBuffer(current->cmdBuf, &bi)); nextSubmitHandle_ = current->handle; return *current; } VkResult VulkanImmediateCommands::wait(const SubmitHandle handle, uint64_t timeoutNanoseconds) { if (isReady(handle)) { return VK_SUCCESS; } if (!IGL_DEBUG_VERIFY(!buffers_[handle.bufferIndex].isEncoding)) { // we are waiting for a buffer which has not been submitted - this is probably a logic error // somewhere in the calling code return VK_ERROR_UNKNOWN; } IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_WAIT); const VkResult fenceResult = vf_.vkWaitForFences( device_, 1, &buffers_[handle.bufferIndex].fence.vkFence_, VK_TRUE, timeoutNanoseconds); if (fenceResult == VK_TIMEOUT) { return VK_TIMEOUT; } if (fenceResult != VK_SUCCESS) { IGL_LOG_ERROR_ONCE( "VulkanImmediateCommands::wait - Waiting for command buffer fence failed with error %i", int(fenceResult)); // Intentional fallthrough: we must purge so that we can release command buffers. } purge(); return fenceResult; } void VulkanImmediateCommands::waitAll() { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_WAIT); // @lint-ignore CLANGTIDY VkFence fences[kMaxCommandBuffers]; uint32_t numFences = 0; for (const auto& buf : buffers_) { if (buf.cmdBuf != VK_NULL_HANDLE && !buf.isEncoding) { fences[numFences++] = buf.fence.vkFence_; } } if (numFences) { VK_ASSERT(vf_.vkWaitForFences(device_, numFences, fences, VK_TRUE, UINT64_MAX)); } purge(); } bool VulkanImmediateCommands::isRecycled(SubmitHandle handle) const { IGL_DEBUG_ASSERT(handle.bufferIndex < kMaxCommandBuffers); if (handle.empty()) { // a null handle return true; } // already recycled and reused by another command buffer return buffers_[handle.bufferIndex].handle.submitId != handle.submitId; } bool VulkanImmediateCommands::isReady(const SubmitHandle handle) const { IGL_DEBUG_ASSERT(handle.bufferIndex < kMaxCommandBuffers); if (handle.empty()) { // a null handle return true; } const CommandBufferWrapper& buf = buffers_[handle.bufferIndex]; if (buf.cmdBuf == VK_NULL_HANDLE) { // already recycled and not yet reused return true; } if (buf.handle.submitId != handle.submitId) { // already recycled and reused by another command buffer return true; } return vf_.vkWaitForFences(device_, 1, &buf.fence.vkFence_, VK_TRUE, 0) == VK_SUCCESS; } VulkanImmediateCommands::SubmitHandle VulkanImmediateCommands::submit( const CommandBufferWrapper& wrapper) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_SUBMIT); IGL_DEBUG_ASSERT(wrapper.isEncoding); VK_ASSERT(vf_.vkEndCommandBuffer(wrapper.cmdBuf)); if (useTimelineSemaphoreAndSynchronization2_) { // @lint-ignore CLANGTIDY VkSemaphoreSubmitInfo waitSemaphores[] = {{}, {}}; uint32_t numWaitSemaphores = 0; if (waitSemaphore_.semaphore) { waitSemaphores[numWaitSemaphores++] = waitSemaphore_; } if (lastSubmitSemaphore_.semaphore) { waitSemaphores[numWaitSemaphores++] = lastSubmitSemaphore_; } // @lint-ignore CLANGTIDY const VkSemaphoreSubmitInfo signalSemaphores[] = { VkSemaphoreSubmitInfo{ .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO, .semaphore = wrapper.semaphore.getVkSemaphore(), .stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, }, signalSemaphore_, }; const VkCommandBufferSubmitInfo bufferSI = { .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO, .commandBuffer = wrapper.cmdBuf, }; const VkSubmitInfo2 si = { .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO_2, .waitSemaphoreInfoCount = numWaitSemaphores, .pWaitSemaphoreInfos = waitSemaphores, .commandBufferInfoCount = 1u, .pCommandBufferInfos = &bufferSI, .signalSemaphoreInfoCount = signalSemaphore_.semaphore ? 2u : 1u, .pSignalSemaphoreInfos = signalSemaphores, }; IGL_PROFILER_ZONE("vkQueueSubmit2KHR()", IGL_PROFILER_COLOR_SUBMIT); #if IGL_VULKAN_PRINT_COMMANDS IGL_LOG_INFO("%p vkQueueSubmit2KHR()\n\n", wrapper.cmdBuf); #endif // IGL_VULKAN_PRINT_COMMANDS VK_ASSERT(vf_.vkQueueSubmit2KHR(queue_, 1u, &si, wrapper.fence.vkFence_)); IGL_PROFILER_ZONE_END(); } else { // @lint-ignore CLANGTIDY const VkPipelineStageFlags waitStageMasks[] = {VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT}; // @lint-ignore CLANGTIDY VkSemaphore waitSemaphores[] = {VK_NULL_HANDLE, VK_NULL_HANDLE}; uint32_t numWaitSemaphores = 0; if (waitSemaphore_.semaphore) { waitSemaphores[numWaitSemaphores++] = waitSemaphore_.semaphore; } if (lastSubmitSemaphore_.semaphore) { waitSemaphores[numWaitSemaphores++] = lastSubmitSemaphore_.semaphore; } const VkSubmitInfo si = ivkGetSubmitInfo(&wrapper.cmdBuf, numWaitSemaphores, waitSemaphores, waitStageMasks, &wrapper.semaphore.vkSemaphore_); // @lint-ignore CLANGTIDY const VkFence vkFence = wrapper.fence.vkFence_; IGL_PROFILER_ZONE("vkQueueSubmit()", IGL_PROFILER_COLOR_SUBMIT); #if IGL_VULKAN_PRINT_COMMANDS IGL_LOG_INFO("%p vkQueueSubmit()\n\n", wrapper.cmdBuf); #endif // IGL_VULKAN_PRINT_COMMANDS VK_ASSERT(vf_.vkQueueSubmit(queue_, 1u, &si, vkFence)); IGL_PROFILER_ZONE_END(); } lastSubmitSemaphore_.semaphore = wrapper.semaphore.vkSemaphore_; lastSubmitHandle_ = wrapper.handle; waitSemaphore_.semaphore = VK_NULL_HANDLE; signalSemaphore_.semaphore = VK_NULL_HANDLE; // reset const_cast(wrapper).isEncoding = false; submitCounter_++; if (!submitCounter_) { // skip the 0 value - when uint32_t wraps around (null SubmitHandle) submitCounter_++; } nextSubmitHandle_ = {}; return lastSubmitHandle_; } void VulkanImmediateCommands::waitSemaphore(VkSemaphore semaphore) { IGL_DEBUG_ASSERT(waitSemaphore_.semaphore == VK_NULL_HANDLE); waitSemaphore_.semaphore = semaphore; } void VulkanImmediateCommands::signalSemaphore(VkSemaphore semaphore, uint64_t signalValue) { IGL_DEBUG_ASSERT(signalSemaphore_.semaphore == VK_NULL_HANDLE); signalSemaphore_.semaphore = semaphore; signalSemaphore_.value = signalValue; } VkSemaphore VulkanImmediateCommands::acquireLastSubmitSemaphore() { return std::exchange(lastSubmitSemaphore_.semaphore, VK_NULL_HANDLE); } VulkanImmediateCommands::SubmitHandle VulkanImmediateCommands::getLastSubmitHandle() const { return lastSubmitHandle_; } VulkanImmediateCommands::SubmitHandle VulkanImmediateCommands::getNextSubmitHandle() const { return nextSubmitHandle_.empty() ? lastSubmitHandle_ : nextSubmitHandle_; } VkFence VulkanImmediateCommands::getVkFenceFromSubmitHandle(SubmitHandle handle) { IGL_DEBUG_ASSERT(handle.bufferIndex < buffers_.size()); if (isRecycled(handle)) { return VK_NULL_HANDLE; } return buffers_[handle.bufferIndex].fence.vkFence_; } void VulkanImmediateCommands::storeFDInSubmitHandle(SubmitHandle handle, int fd) noexcept { IGL_DEBUG_ASSERT(handle.bufferIndex < buffers_.size()); buffers_[handle.bufferIndex].fd = fd; } int VulkanImmediateCommands::cachedFDFromSubmitHandle(SubmitHandle handle) const noexcept { IGL_DEBUG_ASSERT(handle.bufferIndex < buffers_.size()); return buffers_[handle.bufferIndex].fd; } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanImmediateCommands.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include namespace igl::vulkan { /// @brief This class provides a simplified interface for obtaining and submitting Command Buffers, /// while providing features to help manage their synchronization. class VulkanImmediateCommands final { public: // The maximum number of command buffers which can simultaneously exist in the system; when we run // out of buffers, we stall and wait until an existing buffer becomes available static constexpr uint32_t kMaxCommandBuffers = 32; /** @brief Creates an instance of the class for a specific queue family and whether the fences * created for each command buffer are exportable (see VulkanFence for more details about the * exportable flag). The optional `debugName` parameter can be used to name the resource to make * it easier for debugging * The constructor initializes the vector of `CommandBufferWrapper` structures with * a total of `kMaxCommandBuffers` */ VulkanImmediateCommands(const VulkanFunctionTable& vf, VkDevice device, uint32_t queueFamilyIndex, bool exportableFences, bool useTimelineSemaphoreAndSynchronization2, const char* debugName); ~VulkanImmediateCommands(); VulkanImmediateCommands(const VulkanImmediateCommands&) = delete; VulkanImmediateCommands& operator=(const VulkanImmediateCommands&) = delete; /** @brief A structure that encapsulates synchronization information about command buffers and * that is used by the `VulkanImmediateCommands` class to manage command buffer acquisition and * reuse. * A `SubmitHandle` is composed of two 32-bit integers, a buffer index (`bufferIndex_`) and a * submit id (`submitId_`). The buffer index is associated with the location of the command buffer * in the vector in which they are stored in `VulkanImmediateCommands` class. The submit id is a * monotonically increasing index that is incremented every time we `submit()` a command buffer * for execution (any command buffer). A handle is a combination of those two values into a 64-bit * integer: the submit id is shifted and occupies the 32 most significant bits of the handle, * while the buffer index occupies the least significant 32 bits */ struct SubmitHandle { uint32_t bufferIndex = 0; uint32_t submitId = 0; SubmitHandle() = default; /// @brief Creates a SubmitHandle object from an existing handle explicit SubmitHandle(uint64_t handle) : bufferIndex(uint32_t(handle & 0xffffffff)), submitId(uint32_t(handle >> 32)) { IGL_DEBUG_ASSERT(submitId); } /// @brief Checks whether the structure is empty and has not been associates with a command /// buffer submission yet [[nodiscard]] bool empty() const { return submitId == 0; } /// @brief Returns a unique identifiable handle, which is made of the `submitId_` and the /// `bufferIndex_` member variables [[nodiscard]] uint64_t handle() const { return (uint64_t(submitId) << 32) + bufferIndex; } [[nodiscard]] bool operator==(const SubmitHandle& rhs) const { return bufferIndex == rhs.bufferIndex && submitId == rhs.submitId; } [[nodiscard]] bool operator!=(const SubmitHandle& rhs) const { return !(*this == rhs); } }; /// Ensures that the `SubmitHandle` structure size is not larger than a `uint64_t` static_assert(sizeof(SubmitHandle) == sizeof(uint64_t)); /// @brief The CommandBufferWrapper structure encapsulates all the information needed to manage /// the synchronization of a command buffer along with a command buffer struct CommandBufferWrapper { CommandBufferWrapper(VulkanFence&& fence, VulkanSemaphore&& semaphore) : fence(std::move(fence)), semaphore(std::move(semaphore)) {} /// @brief The command buffer handle. It is initialied to VK_NULL_HANDLE. The command buffer /// handle stored in `cmdBufAllocated_` is copied into `cmdBuf_` when the command buffer is /// acquired for recording VkCommandBuffer cmdBuf = VK_NULL_HANDLE; /// @brief Stores the command buffer handle allocated during initialization VkCommandBuffer cmdBufAllocated = VK_NULL_HANDLE; /// @brief the SubmitHandle object used to synchronize this command buffer SubmitHandle handle = {}; /// @brief A VulkanFence object that is associated with the submission of the command buffer. It /// is used to check whether a command buffer is still executing or for waiting the command /// buffer to finish execution by the GPU VulkanFence fence; /// @brief A VulkanSemaphore object associated with the submission of the command buffer for /// execution. VulkanSemaphore semaphore; bool isEncoding = false; /// @brief The file descriptor for the underlying VkFence. It's only populated if an FD is set /// explicitly using VulkanImmediateCommands::storeFDInSubmitHandle(). It's reset in `acquire()` int fd = -1; }; /// @brief Returns a `CommandBufferWrapper` object with the current command buffer (creates one if /// it does not exist) and its associated synchronization objects const CommandBufferWrapper& acquire(); /** @brief Submits a command buffer (stored in a `CommandBufferWrapper` object) for submission and * returns the `SubmitHandle` associated with the command buffer. Caches the semaphore associated * with the command buffer bineg submitted as the last submitted semaphore * (`lastSubmitSemaphore_`). Caches the SubmitHandle associated with the command buffer being * submitted for execution in `lastSubmitHandle_`. Resets the current wait semaphore member * variable (`waitSemaphore_`). * Submitting a command buffer also marks the `CommandBufferWrapper::encoding_` variable to * `false` */ SubmitHandle submit(const CommandBufferWrapper& wrapper); /// @brief Stores the semaphore as the current wait semaphore (`waitSemaphore_`) void waitSemaphore(VkSemaphore semaphore); /// @brief Inject one timeline semaphore to be signalled (`signalSemaphore_`) void signalSemaphore(VkSemaphore semaphore, uint64_t signalValue); /// @brief Returns the last semaphore (`lastSubmitSemaphore_`) and reset the member variable to /// `VK_NULL_HANDLE` VkSemaphore acquireLastSubmitSemaphore(); /// @brief Returns the last SubmitHandle, which was submitted when `submit()` was last called [[nodiscard]] SubmitHandle getLastSubmitHandle() const; [[nodiscard]] SubmitHandle getNextSubmitHandle() const; /** @brief Checks whether a SubmitHandle is ready. A SubmitHandle is ready if it is recycled or * empty. If it has not been recycled and is not empty, a SubmitHandle is ready if the fence * associated with the command buffer referred by the SubmitHandle structure has been signaled. * Note that this function does not wait for a fence to be signaled if it has not been signaled. * It merely checks the fence status */ [[nodiscard]] bool isReady(SubmitHandle handle) const; /// @brief If the SubmitHandle is not ready, this function waits for the fence associated with the /// command buffer referred by the handle to become signaled. The default wait time is /// `UINT64_MAX` nanoseconds. Returns a result code if the wait was successful or not. VkResult wait(SubmitHandle handle, uint64_t timeoutNanoseconds = UINT64_MAX); /// @brief Wait for _all_ fences for all command buffers stored in `VulkanImmediateCommands` to /// become signaled. The maximum wait time is `UINT64_MAX` nanoseconds void waitAll(); /// @brief Returns the fence associated with the handle if the handle has not been recycled. /// Returns `VK_NULL_HANDLE` otherwise. VkFence getVkFenceFromSubmitHandle(SubmitHandle handle); /// @brief Stores the file descriptor in the `CommandBufferWrapper` object associated with the /// handle. Chceks for bounds, but does not check for validity. void storeFDInSubmitHandle(SubmitHandle handle, int fd) noexcept; /// @brief Returns the file descriptor associated with the handle and its underlying VkFence. If /// the FD has not been explicitly set with `storeFDInSubmitHandle()`, it returns -1. This /// function DOES NOT retrieve the FD from the Vulkan implementation [[nodiscard]] int cachedFDFromSubmitHandle(SubmitHandle handle) const noexcept; private: /// @brief Resets all commands buffers and their associated fences that are valid, are not being /// encoded, and have completed execution by the GPU (their fences have been signaled). Resets the /// number of available command buffers. void purge(); /// @brief Checks whether the SubmitHandle is recycled. A recycled SubmitHandle is a handle that /// has a submit id greater than the submit id associated with the same command buffer stored /// internally in `VulkanImmediateCommands`. A SubmitHandle handle is also recycled if it's empty [[nodiscard]] bool isRecycled(SubmitHandle handle) const; private: const VulkanFunctionTable& vf_; VkDevice device_ = VK_NULL_HANDLE; VkQueue queue_ = VK_NULL_HANDLE; VkCommandPool commandPool_ = VK_NULL_HANDLE; std::string debugName_; std::vector buffers_; /// @brief The last submitted handle. Updated on `submit()` SubmitHandle lastSubmitHandle_ = SubmitHandle(); SubmitHandle nextSubmitHandle_ = SubmitHandle(); /// @brief The semaphore submitted with the last command buffer. Updated on `submit()` VkSemaphoreSubmitInfo lastSubmitSemaphore_{}; /// @brief A semaphore to be associated with the next command buffer to be submitted. Can be used /// with command buffers that present swapchain images. VkSemaphoreSubmitInfo waitSemaphore_{}; // an extra "signal" timeline semaphore VkSemaphoreSubmitInfo signalSemaphore_{}; uint32_t numAvailableCommandBuffers_ = kMaxCommandBuffers; // @brief The submission counter. Incremented on `submit()` uint32_t submitCounter_ = 1; bool useTimelineSemaphoreAndSynchronization2_ = false; }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanPipelineBuilder.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "VulkanPipelineBuilder.h" namespace igl::vulkan { uint32_t VulkanPipelineBuilder::numPipelinesCreated = 0; uint32_t VulkanComputePipelineBuilder::numPipelinesCreated = 0; VulkanPipelineBuilder::VulkanPipelineBuilder() : vertexInputState_({.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO}), inputAssembly_({ .sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, .topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, .primitiveRestartEnable = VK_FALSE, }), rasterizationState_({ .sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, .polygonMode = VK_POLYGON_MODE_FILL, .cullMode = VK_CULL_MODE_NONE, .frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE, .lineWidth = 1.0f, }), multisampleState_({ .sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, .rasterizationSamples = VK_SAMPLE_COUNT_1_BIT, .minSampleShading = 1.0f, }), depthStencilState_({ .sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, .depthCompareOp = VK_COMPARE_OP_LESS, .front = { .failOp = VK_STENCIL_OP_KEEP, .passOp = VK_STENCIL_OP_KEEP, .depthFailOp = VK_STENCIL_OP_KEEP, .compareOp = VK_COMPARE_OP_NEVER, }, .back = { .failOp = VK_STENCIL_OP_KEEP, .passOp = VK_STENCIL_OP_KEEP, .depthFailOp = VK_STENCIL_OP_KEEP, .compareOp = VK_COMPARE_OP_NEVER, }, .maxDepthBounds = 1.0f, }) {} VulkanPipelineBuilder& VulkanPipelineBuilder::depthBiasEnable(bool enable) { rasterizationState_.depthBiasEnable = enable ? VK_TRUE : VK_FALSE; return *this; } VulkanPipelineBuilder& VulkanPipelineBuilder::depthWriteEnable(bool enable) { depthStencilState_.depthWriteEnable = enable ? VK_TRUE : VK_FALSE; return *this; } VulkanPipelineBuilder& VulkanPipelineBuilder::depthCompareOp(VkCompareOp compareOp, bool writeDepthEnable) { depthStencilState_.depthTestEnable = static_cast(compareOp != VK_COMPARE_OP_ALWAYS || writeDepthEnable); depthStencilState_.depthCompareOp = compareOp; return *this; } VulkanPipelineBuilder& VulkanPipelineBuilder::dynamicState(VkDynamicState state) { dynamicStates_.push_back(state); return *this; } VulkanPipelineBuilder& VulkanPipelineBuilder::dynamicStates( const std::vector& states) { dynamicStates_.insert(std::end(dynamicStates_), std::begin(states), std::end(states)); return *this; } VulkanPipelineBuilder& VulkanPipelineBuilder::primitiveTopology(VkPrimitiveTopology topology) { inputAssembly_.topology = topology; return *this; } VulkanPipelineBuilder& VulkanPipelineBuilder::rasterizationSamples(VkSampleCountFlagBits samples) { multisampleState_.rasterizationSamples = samples; return *this; } VulkanPipelineBuilder& VulkanPipelineBuilder::cullMode(VkCullModeFlags mode) { rasterizationState_.cullMode = mode; return *this; } VulkanPipelineBuilder& VulkanPipelineBuilder::frontFace(VkFrontFace mode) { rasterizationState_.frontFace = mode; return *this; } VulkanPipelineBuilder& VulkanPipelineBuilder::polygonMode(VkPolygonMode mode) { rasterizationState_.polygonMode = mode; return *this; } VulkanPipelineBuilder& VulkanPipelineBuilder::vertexInputState( const VkPipelineVertexInputStateCreateInfo& state) { vertexInputState_ = state; return *this; } VulkanPipelineBuilder& VulkanPipelineBuilder::colorBlendAttachmentStates( std::vector& states) { colorBlendAttachmentStates_ = std::move(states); return *this; } VulkanPipelineBuilder& VulkanPipelineBuilder::shaderStage(VkPipelineShaderStageCreateInfo stage) { shaderStages_.push_back(stage); return *this; } VulkanPipelineBuilder& VulkanPipelineBuilder::shaderStages( const std::vector& stages) { shaderStages_.insert(std::end(shaderStages_), std::begin(stages), std::end(stages)); return *this; } VulkanPipelineBuilder& VulkanPipelineBuilder::stencilStateOps(VkStencilFaceFlags faceMask, VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp, VkCompareOp compareOp) { depthStencilState_.stencilTestEnable = static_cast(static_cast(depthStencilState_.stencilTestEnable) || failOp != VK_STENCIL_OP_KEEP || passOp != VK_STENCIL_OP_KEEP || depthFailOp != VK_STENCIL_OP_KEEP || compareOp != VK_COMPARE_OP_ALWAYS); if (faceMask & VK_STENCIL_FACE_FRONT_BIT) { VkStencilOpState& front = depthStencilState_.front; front.failOp = failOp; front.passOp = passOp; front.depthFailOp = depthFailOp; front.compareOp = compareOp; } if (faceMask & VK_STENCIL_FACE_BACK_BIT) { VkStencilOpState& back = depthStencilState_.back; back.failOp = failOp; back.passOp = passOp; back.depthFailOp = depthFailOp; back.compareOp = compareOp; } return *this; } VkResult VulkanPipelineBuilder::build(const VulkanFunctionTable& vf, VkDevice device, VkPipelineCache pipelineCache, VkPipelineLayout pipelineLayout, VkRenderPass renderPass, VkPipeline* outPipeline, const char* debugName) noexcept { const VkPipelineDynamicStateCreateInfo dynamicState = { .sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, .dynamicStateCount = (uint32_t)dynamicStates_.size(), .pDynamicStates = dynamicStates_.data(), }; // viewport and scissor are always dynamic const VkPipelineViewportStateCreateInfo viewportState = { .sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, .viewportCount = 1, .scissorCount = 1, }; const VkPipelineColorBlendStateCreateInfo colorBlendState = { .sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, .attachmentCount = uint32_t(colorBlendAttachmentStates_.size()), .pAttachments = colorBlendAttachmentStates_.data(), }; const auto result = ivkCreateGraphicsPipeline(&vf, device, pipelineCache, (uint32_t)shaderStages_.size(), shaderStages_.data(), &vertexInputState_, &inputAssembly_, nullptr, &viewportState, &rasterizationState_, &multisampleState_, &depthStencilState_, &colorBlendState, &dynamicState, pipelineLayout, renderPass, outPipeline); if (!IGL_DEBUG_VERIFY(result == VK_SUCCESS)) { return result; } numPipelinesCreated++; // set debug name return ivkSetDebugObjectName( &vf, device, VK_OBJECT_TYPE_PIPELINE, (uint64_t)*outPipeline, debugName); } VulkanComputePipelineBuilder& VulkanComputePipelineBuilder::shaderStage( VkPipelineShaderStageCreateInfo stage) { shaderStage_ = stage; return *this; } VkResult VulkanComputePipelineBuilder::build(const VulkanFunctionTable& vf, VkDevice device, VkPipelineCache pipelineCache, VkPipelineLayout pipelineLayout, VkPipeline* outPipeline, const char* debugName) noexcept { const VkResult result = ivkCreateComputePipeline( &vf, device, pipelineCache, &shaderStage_, pipelineLayout, outPipeline); if (!IGL_DEBUG_VERIFY(result == VK_SUCCESS)) { return result; } numPipelinesCreated++; // set debug name return ivkSetDebugObjectName( &vf, device, VK_OBJECT_TYPE_PIPELINE, (uint64_t)*outPipeline, debugName); } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanPipelineBuilder.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::vulkan { class VulkanPipelineBuilder final { public: VulkanPipelineBuilder(); ~VulkanPipelineBuilder() = default; VulkanPipelineBuilder& depthBiasEnable(bool enable); VulkanPipelineBuilder& depthWriteEnable(bool enable); VulkanPipelineBuilder& depthCompareOp(VkCompareOp compareOp, bool writeDepthEnable); VulkanPipelineBuilder& dynamicState(VkDynamicState state); VulkanPipelineBuilder& dynamicStates(const std::vector& states); VulkanPipelineBuilder& primitiveTopology(VkPrimitiveTopology topology); VulkanPipelineBuilder& rasterizationSamples(VkSampleCountFlagBits samples); VulkanPipelineBuilder& shaderStage(VkPipelineShaderStageCreateInfo stage); VulkanPipelineBuilder& shaderStages(const std::vector& stages); VulkanPipelineBuilder& stencilStateOps(VkStencilFaceFlags faceMask, VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp, VkCompareOp compareOp); VulkanPipelineBuilder& cullMode(VkCullModeFlags mode); VulkanPipelineBuilder& frontFace(VkFrontFace mode); VulkanPipelineBuilder& polygonMode(VkPolygonMode mode); VulkanPipelineBuilder& vertexInputState(const VkPipelineVertexInputStateCreateInfo& state); VulkanPipelineBuilder& colorBlendAttachmentStates( std::vector& states); [[nodiscard]] VkResult build(const VulkanFunctionTable& vf, VkDevice device, VkPipelineCache pipelineCache, VkPipelineLayout pipelineLayout, VkRenderPass renderPass, VkPipeline* outPipeline, const char* debugName = nullptr) noexcept; static uint32_t getNumPipelinesCreated() { return numPipelinesCreated; } private: std::vector dynamicStates_; std::vector shaderStages_; VkPipelineVertexInputStateCreateInfo vertexInputState_; VkPipelineInputAssemblyStateCreateInfo inputAssembly_; VkPipelineRasterizationStateCreateInfo rasterizationState_; VkPipelineMultisampleStateCreateInfo multisampleState_; VkPipelineDepthStencilStateCreateInfo depthStencilState_; std::vector colorBlendAttachmentStates_; static uint32_t numPipelinesCreated; }; class VulkanComputePipelineBuilder final { public: VulkanComputePipelineBuilder() = default; ~VulkanComputePipelineBuilder() = default; VulkanComputePipelineBuilder& shaderStage(VkPipelineShaderStageCreateInfo stage); VkResult build(const VulkanFunctionTable& vf, VkDevice device, VkPipelineCache pipelineCache, VkPipelineLayout pipelineLayout, VkPipeline* outPipeline, const char* debugName = nullptr) noexcept; static uint32_t getNumPipelinesCreated() { return numPipelinesCreated; } private: VkPipelineShaderStageCreateInfo shaderStage_; static uint32_t numPipelinesCreated; }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanQueuePool.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "VulkanQueuePool.h" #include namespace igl::vulkan { namespace { std::set enumerateQueues(const VulkanFunctionTable& vf, VkPhysicalDevice physicalDevice) { uint32_t queueFamilyCount = 0; vf.vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, &queueFamilyCount, nullptr); std::vector properties(queueFamilyCount); vf.vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, &queueFamilyCount, properties.data()); std::set descriptors; for (uint32_t i = 0; i != properties.size(); i++) { for (uint32_t j = 0; j != properties[i].queueCount; j++) { const VulkanQueueDescriptor descriptor = { .queueFlags = properties[i].queueFlags, .queueIndex = j, .familyIndex = i, }; descriptors.insert(descriptor); } } return descriptors; } } // namespace VulkanQueuePool::VulkanQueuePool(const VulkanFunctionTable& vf, VkPhysicalDevice physicalDevice) : VulkanQueuePool(enumerateQueues(vf, physicalDevice)) {} VulkanQueuePool::VulkanQueuePool(std::set availableDescriptors) : availableDescriptors_(std::move(availableDescriptors)) {} VulkanQueueDescriptor VulkanQueuePool::findQueueDescriptor(VkQueueFlags flags) const { auto findDedicatedQueue = [&](VkQueueFlags required, VkQueueFlags avoid) -> VulkanQueueDescriptor { if (flags & required) { for (const auto& queueDescriptor : availableDescriptors_) { const bool isSuitable = (queueDescriptor.queueFlags & flags) != 0; const bool isDedicated = (queueDescriptor.queueFlags & avoid) == 0; if (isSuitable && isDedicated) { return queueDescriptor; } } } return {}; }; VulkanQueueDescriptor queueDescriptor; // try to find a dedicated queue for compute queueDescriptor = findDedicatedQueue(VK_QUEUE_COMPUTE_BIT, VK_QUEUE_GRAPHICS_BIT); if (queueDescriptor.isValid()) { return queueDescriptor; } // try to find a dedicated queue for transfer operations queueDescriptor = findDedicatedQueue(VK_QUEUE_TRANSFER_BIT, VK_QUEUE_GRAPHICS_BIT); if (queueDescriptor.isValid()) { return queueDescriptor; } // any suitable queue queueDescriptor = findDedicatedQueue(flags, 0); if (queueDescriptor.isValid()) { return queueDescriptor; } // Compute and graphics queues support transfer operations, and it is optional to report // VK_QUEUE_TRANSFER_BIT on those. So let's check them if no result is found if (flags & VK_QUEUE_TRANSFER_BIT) { const VkQueueFlags clearFlags = flags & ~VK_QUEUE_TRANSFER_BIT; queueDescriptor = findDedicatedQueue(clearFlags | VK_QUEUE_COMPUTE_BIT, 0); if (queueDescriptor.isValid()) { return queueDescriptor; } queueDescriptor = findDedicatedQueue(clearFlags | VK_QUEUE_GRAPHICS_BIT, 0); if (queueDescriptor.isValid()) { return queueDescriptor; } } IGL_LOG_ERROR("No suitable queue found"); return {}; } void VulkanQueuePool::reserveQueue(const VulkanQueueDescriptor& queueDescriptor) { if (availableDescriptors_.erase(queueDescriptor) != 0) { reservedDescriptors_.insert(queueDescriptor); } } std::vector VulkanQueuePool::getQueueCreationInfos() const { std::map> queues; for (const auto& queue : reservedDescriptors_) { queues[queue.familyIndex].push_back(queue); } static constexpr float kQueuePriority = 1.0f; std::vector qcis; qcis.reserve(queues.size()); for (const auto& [family, descriptors] : queues) { qcis.emplace_back(VkDeviceQueueCreateInfo{ .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, .queueFamilyIndex = family, .queueCount = static_cast(descriptors.size()), .pQueuePriorities = &kQueuePriority, }); } return qcis; } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanQueuePool.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::vulkan { struct VulkanQueueDescriptor { constexpr static uint32_t kInvalid = 0xFFFFFFFF; VkQueueFlags queueFlags = 0; uint32_t queueIndex = kInvalid; uint32_t familyIndex = kInvalid; [[nodiscard]] bool isValid() const { return queueIndex != kInvalid && familyIndex != kInvalid; } /* familyIndex and queueIndex are sufficient to uniquely identify a VulkanQueueDescriptor. */ bool operator==(const VulkanQueueDescriptor& other) const { return (familyIndex == other.familyIndex && queueIndex == other.queueIndex); } bool operator<(const VulkanQueueDescriptor& other) const { if (familyIndex == other.familyIndex) { return queueIndex < other.queueIndex; } return familyIndex < other.familyIndex; } }; class VulkanQueuePool final { public: VulkanQueuePool(const VulkanFunctionTable& vf, VkPhysicalDevice physicalDevice); explicit VulkanQueuePool(std::set availableDescriptors); /* Find a queue descriptor that conforms to give queue flags. */ [[nodiscard]] VulkanQueueDescriptor findQueueDescriptor(VkQueueFlags flags) const; /* Reserve the given queue. Reserved queues will not be visible in future * find requests and they will participate in resulting queue creation infos. */ void reserveQueue(const VulkanQueueDescriptor& queueDescriptor); /* Create the queue creation infos for reserved queues. */ [[nodiscard]] std::vector getQueueCreationInfos() const; private: std::set availableDescriptors_; std::set reservedDescriptors_; }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanRenderPassBuilder.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "VulkanRenderPassBuilder.h" // this cannot be put into namespace #define CMP(field) (a.field == b.field) bool operator==(const VkAttachmentDescription2& a, const VkAttachmentDescription2& b) { return CMP(sType) && CMP(pNext) && CMP(flags) && CMP(format) && CMP(samples) && CMP(loadOp) && CMP(storeOp) && CMP(stencilLoadOp) && CMP(stencilStoreOp) && CMP(initialLayout) && CMP(finalLayout); } bool operator==(const VkAttachmentReference2& a, const VkAttachmentReference2& b) { return CMP(sType) && CMP(pNext) && CMP(attachment) && CMP(layout) && CMP(aspectMask); } #undef CMP namespace igl::vulkan { VkResult VulkanRenderPassBuilder::build(const VulkanFunctionTable& vf, VkDevice device, VkRenderPass* outRenderPass, const char* debugName) const noexcept { IGL_DEBUG_ASSERT( refsColorResolve2_.empty() || (refsColorResolve2_.size() == refsColor2_.size()), "If resolve attachments are used, there should be one color resolve attachment for each " "color attachment"); const bool hasDepthStencilAttachment = refDepth2_.layout != VK_IMAGE_LAYOUT_UNDEFINED; #if IGL_VULKAN_HAS_LEGACY_RENDERPASS const VkSubpassDescription subpass = { .flags = 0, .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS, .colorAttachmentCount = (uint32_t)refsColor_.size(), .pColorAttachments = refsColor_.data(), .pResolveAttachments = refsColorResolve_.data(), .pDepthStencilAttachment = hasDepthStencilAttachment ? &refDepth_ : nullptr, }; const VkSubpassDependency dep = { .srcSubpass = 0, .dstSubpass = VK_SUBPASS_EXTERNAL, .srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, .dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, .srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, .dstAccessMask = VK_ACCESS_SHADER_READ_BIT, }; const VkRenderPassMultiviewCreateInfo renderPassMultiview = { .sType = VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO, .subpassCount = 1, .pViewMasks = &viewMask_, .correlationMaskCount = 1, .pCorrelationMasks = &correlationMask_, }; const VkRenderPassCreateInfo ci = { .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, .pNext = viewMask_ ? &renderPassMultiview : nullptr, .attachmentCount = (uint32_t)attachments_.size(), .pAttachments = attachments_.data(), .subpassCount = 1, .pSubpasses = &subpass, .dependencyCount = 1, .pDependencies = &dep, }; #endif // IGL_VULKAN_HAS_LEGACY_RENDERPASS const bool hasDepthStencilResolve = refDepthResolve2_.layout != VK_IMAGE_LAYOUT_UNDEFINED; const VkSubpassDescriptionDepthStencilResolve depthStencilResolve = { .sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE, .pNext = nullptr, .depthResolveMode = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT, .stencilResolveMode = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT, .pDepthStencilResolveAttachment = hasDepthStencilResolve ? &refDepthResolve2_ : nullptr, }; const VkSubpassDescription2 subpass2 = { .sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2, .pNext = hasDepthStencilResolve ? &depthStencilResolve : nullptr, .flags = 0, .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS, .viewMask = viewMask_, .colorAttachmentCount = (uint32_t)refsColor2_.size(), .pColorAttachments = refsColor2_.data(), .pResolveAttachments = refsColorResolve2_.data(), .pDepthStencilAttachment = hasDepthStencilAttachment ? &refDepth2_ : nullptr, }; const VkSubpassDependency2 dep2 = { .sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2, .srcSubpass = 0, .dstSubpass = VK_SUBPASS_EXTERNAL, .srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, .dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, .srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, .dstAccessMask = VK_ACCESS_SHADER_READ_BIT, .dependencyFlags = 0, .viewOffset = 0, }; const VkRenderPassCreateInfo2 ci2 = { .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2, .flags = 0, .attachmentCount = (uint32_t)attachments2_.size(), .pAttachments = attachments2_.data(), .subpassCount = 1, .pSubpasses = &subpass2, .dependencyCount = 1, .pDependencies = &dep2, .correlatedViewMaskCount = viewMask_ ? 1u : 0u, .pCorrelatedViewMasks = viewMask_ ? &correlationMask_ : nullptr, }; const VkResult result = #if IGL_VULKAN_HAS_LEGACY_RENDERPASS vf.vkCreateRenderPass2 ? vf.vkCreateRenderPass2(device, &ci2, nullptr, outRenderPass) : vf.vkCreateRenderPass(device, &ci, nullptr, outRenderPass); #else vf.vkCreateRenderPass2(device, &ci2, nullptr, outRenderPass); #endif // IGL_VULKAN_HAS_LEGACY_RENDERPASS if (!IGL_DEBUG_VERIFY(result == VK_SUCCESS)) { return result; } // set debug name return ivkSetDebugObjectName( &vf, device, VK_OBJECT_TYPE_RENDER_PASS, (uint64_t)*outRenderPass, debugName); } VulkanRenderPassBuilder& VulkanRenderPassBuilder::addColor(VkFormat format, VkAttachmentLoadOp loadOp, VkAttachmentStoreOp storeOp, VkImageLayout initialLayout, VkImageLayout finalLayout, VkSampleCountFlagBits samples) { IGL_DEBUG_ASSERT(format != VK_FORMAT_UNDEFINED, "Invalid color attachment format"); if (!refsColor2_.empty()) { IGL_DEBUG_ASSERT(attachments2_[refsColor2_.back().attachment].samples == samples, "All non-resolve attachments should have the sample number of samples"); } #if IGL_VULKAN_HAS_LEGACY_RENDERPASS refsColor_.push_back(VkAttachmentReference{ .attachment = (uint32_t)attachments_.size(), .layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, }); attachments_.push_back(VkAttachmentDescription{ .flags = 0, .format = format, .samples = samples, .loadOp = loadOp, .storeOp = storeOp, .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE, .stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE, .initialLayout = initialLayout, .finalLayout = finalLayout, }); #endif // IGL_VULKAN_HAS_LEGACY_RENDERPASS refsColor2_.push_back(VkAttachmentReference2{ .sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2, .attachment = (uint32_t)attachments2_.size(), .layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, }); attachments2_.push_back(VkAttachmentDescription2{ .sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2, .flags = 0, .format = format, .samples = samples, .loadOp = loadOp, .storeOp = storeOp, .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE, .stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE, .initialLayout = initialLayout, .finalLayout = finalLayout, }); return *this; } VulkanRenderPassBuilder& VulkanRenderPassBuilder::addColorResolve(VkFormat format, VkAttachmentLoadOp loadOp, VkAttachmentStoreOp storeOp, VkImageLayout initialLayout, VkImageLayout finalLayout) { IGL_DEBUG_ASSERT(format != VK_FORMAT_UNDEFINED, "Invalid color resolve attachment format"); #if IGL_VULKAN_HAS_LEGACY_RENDERPASS refsColorResolve_.push_back(VkAttachmentReference{ .attachment = (uint32_t)attachments_.size(), .layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, }); attachments_.push_back(VkAttachmentDescription{ .flags = 0, .format = format, .samples = VK_SAMPLE_COUNT_1_BIT, .loadOp = loadOp, .storeOp = storeOp, .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE, .stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE, .initialLayout = initialLayout, .finalLayout = finalLayout, }); #endif // IGL_VULKAN_HAS_LEGACY_RENDERPASS refsColorResolve2_.push_back(VkAttachmentReference2{ .sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2, .attachment = (uint32_t)attachments2_.size(), .layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, }); attachments2_.push_back(VkAttachmentDescription2{ .sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2, .flags = 0, .format = format, .samples = VK_SAMPLE_COUNT_1_BIT, .loadOp = loadOp, .storeOp = storeOp, .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE, .stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE, .initialLayout = initialLayout, .finalLayout = finalLayout, }); return *this; } VulkanRenderPassBuilder& VulkanRenderPassBuilder::addDepthStencil( VkFormat format, VkAttachmentLoadOp loadOp, VkAttachmentStoreOp storeOp, VkAttachmentLoadOp stencilLoadOp, VkAttachmentStoreOp stencilStoreOp, VkImageLayout initialLayout, VkImageLayout finalLayout, VkSampleCountFlagBits samples) { IGL_DEBUG_ASSERT(refDepth2_.layout == VK_IMAGE_LAYOUT_UNDEFINED, "Can have only 1 depth attachment"); IGL_DEBUG_ASSERT(format != VK_FORMAT_UNDEFINED, "Invalid depth attachment format"); if (!refsColor2_.empty()) { IGL_DEBUG_ASSERT(attachments2_[refsColor2_.back().attachment].samples == samples, "All non-resolve attachments should have the sample number of samples " "(including a depth attachment)"); } #if IGL_VULKAN_HAS_LEGACY_RENDERPASS refDepth_ = VkAttachmentReference{ .attachment = (uint32_t)attachments_.size(), .layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, }; attachments_.push_back(VkAttachmentDescription{ .flags = 0, .format = format, .samples = samples, .loadOp = loadOp, .storeOp = storeOp, .stencilLoadOp = stencilLoadOp, .stencilStoreOp = stencilStoreOp, .initialLayout = initialLayout, .finalLayout = finalLayout, }); #endif // IGL_VULKAN_HAS_LEGACY_RENDERPASS refDepth2_ = VkAttachmentReference2{ .sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2, .attachment = (uint32_t)attachments2_.size(), .layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, .aspectMask = (hasDepth(format) ? VK_IMAGE_ASPECT_DEPTH_BIT : VkImageAspectFlags(0)) | (hasStencil(format) ? VK_IMAGE_ASPECT_STENCIL_BIT : VkImageAspectFlags(0)), }; attachments2_.push_back(VkAttachmentDescription2{ .sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2, .flags = 0, .format = format, .samples = samples, .loadOp = loadOp, .storeOp = storeOp, .stencilLoadOp = stencilLoadOp, .stencilStoreOp = stencilStoreOp, .initialLayout = initialLayout, .finalLayout = finalLayout, }); return *this; } VulkanRenderPassBuilder& VulkanRenderPassBuilder::addDepthStencilResolve( VkFormat format, VkAttachmentLoadOp loadOp, VkAttachmentStoreOp storeOp, VkAttachmentLoadOp stencilLoadOp, VkAttachmentStoreOp stencilStoreOp, VkImageLayout initialLayout, VkImageLayout finalLayout) { IGL_DEBUG_ASSERT(refDepthResolve2_.layout == VK_IMAGE_LAYOUT_UNDEFINED, "Can have only 1 depth resolve attachment"); IGL_DEBUG_ASSERT(format != VK_FORMAT_UNDEFINED, "Invalid depth resolve attachment format"); #if IGL_VULKAN_HAS_LEGACY_RENDERPASS refDepthResolve_ = VkAttachmentReference{ .attachment = (uint32_t)attachments_.size(), .layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, }; attachments_.push_back(VkAttachmentDescription{ .flags = 0, .format = format, .samples = VK_SAMPLE_COUNT_1_BIT, .loadOp = loadOp, .storeOp = storeOp, .stencilLoadOp = stencilLoadOp, .stencilStoreOp = stencilStoreOp, .initialLayout = initialLayout, .finalLayout = finalLayout, }); #endif // IGL_VULKAN_HAS_LEGACY_RENDERPASS refDepthResolve2_ = VkAttachmentReference2{ .sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2, .attachment = (uint32_t)attachments2_.size(), .layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, .aspectMask = (hasDepth(format) ? VK_IMAGE_ASPECT_DEPTH_BIT : VkImageAspectFlags(0)) | (hasStencil(format) ? VK_IMAGE_ASPECT_STENCIL_BIT : VkImageAspectFlags(0)), }; attachments2_.push_back(VkAttachmentDescription2{ .sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2, .flags = 0, .format = format, .samples = VK_SAMPLE_COUNT_1_BIT, .loadOp = loadOp, .storeOp = storeOp, .stencilLoadOp = stencilLoadOp, .stencilStoreOp = stencilStoreOp, .initialLayout = initialLayout, .finalLayout = finalLayout, }); return *this; } VulkanRenderPassBuilder& VulkanRenderPassBuilder::setMultiviewMasks( const uint32_t viewMask, const uint32_t correlationMask) { viewMask_ = viewMask; correlationMask_ = correlationMask; return *this; } bool VulkanRenderPassBuilder::operator==(const VulkanRenderPassBuilder& other) const { return attachments2_ == other.attachments2_ && refsColor2_ == other.refsColor2_ && refsColorResolve2_ == other.refsColorResolve2_ && refDepth2_ == other.refDepth2_ && refDepthResolve2_ == other.refDepthResolve2_ && viewMask_ == other.viewMask_ && correlationMask_ == other.correlationMask_; } uint64_t VulkanRenderPassBuilder::HashFunction::operator()( const VulkanRenderPassBuilder& builder) const { uint64_t hash = 0; for (const auto& a : builder.attachments2_) { hash ^= std::hash()(a.flags); hash ^= std::hash()(a.format); hash ^= std::hash()(a.samples); hash ^= std::hash()(a.loadOp); hash ^= std::hash()(a.storeOp); hash ^= std::hash()(a.stencilLoadOp); hash ^= std::hash()(a.stencilStoreOp); hash ^= std::hash()(a.initialLayout); hash ^= std::hash()(a.finalLayout); } for (const auto& r : builder.refsColor2_) { hash ^= std::hash()(r.attachment); hash ^= std::hash()(r.layout); hash ^= std::hash()(r.aspectMask); } for (const auto& r : builder.refsColorResolve2_) { hash ^= std::hash()(r.attachment); hash ^= std::hash()(r.layout); hash ^= std::hash()(r.aspectMask); } hash ^= std::hash()(builder.refDepth2_.attachment); hash ^= std::hash()(builder.refDepth2_.layout); hash ^= std::hash()(builder.refDepth2_.aspectMask); hash ^= std::hash()(builder.refDepthResolve2_.attachment); hash ^= std::hash()(builder.refDepthResolve2_.layout); hash ^= std::hash()(builder.refDepthResolve2_.aspectMask); hash ^= std::hash()(builder.viewMask_); hash ^= std::hash()(builder.correlationMask_); return hash; } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanRenderPassBuilder.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #define IGL_VULKAN_HAS_LEGACY_RENDERPASS 1 #include #include bool operator==(const VkAttachmentDescription2& a, const VkAttachmentDescription2& b); bool operator==(const VkAttachmentReference2& a, const VkAttachmentReference2& b); namespace igl::vulkan { /// @brief A helper class to build VkRenderPass objects. class VulkanRenderPassBuilder final { public: VulkanRenderPassBuilder() = default; ~VulkanRenderPassBuilder() = default; VulkanRenderPassBuilder& addColor( VkFormat format, VkAttachmentLoadOp loadOp, VkAttachmentStoreOp storeOp, VkImageLayout initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, VkImageLayout finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VkSampleCountFlagBits samples = VK_SAMPLE_COUNT_1_BIT); VulkanRenderPassBuilder& addColorResolve( VkFormat format, VkAttachmentLoadOp loadOp, VkAttachmentStoreOp storeOp, VkImageLayout initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, VkImageLayout finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); VulkanRenderPassBuilder& addDepthStencil( VkFormat format, VkAttachmentLoadOp loadOp, VkAttachmentStoreOp storeOp, VkAttachmentLoadOp stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE, VkAttachmentStoreOp stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE, VkImageLayout initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, VkImageLayout finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VkSampleCountFlagBits samples = VK_SAMPLE_COUNT_1_BIT); VulkanRenderPassBuilder& addDepthStencilResolve( VkFormat format, VkAttachmentLoadOp loadOp, VkAttachmentStoreOp storeOp, VkAttachmentLoadOp stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE, VkAttachmentStoreOp stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE, VkImageLayout initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, VkImageLayout finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); VulkanRenderPassBuilder& setMultiviewMasks(uint32_t viewMask, uint32_t correlationMask); // comparison operator and a hash function for std::unordered_map<> bool operator==(const VulkanRenderPassBuilder& other) const; struct HashFunction { uint64_t operator()(const VulkanRenderPassBuilder& builder) const; }; private: // Only VulkanContext is allowed to create actual render passes. Use // VulkanContext::findRenderPass() friend class VulkanContext; VkResult build(const VulkanFunctionTable& vf, VkDevice device, VkRenderPass* outRenderPass, const char* debugName = nullptr) const noexcept; private: #if IGL_VULKAN_HAS_LEGACY_RENDERPASS // old code path for vkCreateRenderPass() - to be removed later std::vector attachments_; std::vector refsColor_; std::vector refsColorResolve_; VkAttachmentReference refDepth_ = {}; VkAttachmentReference refDepthResolve_ = {}; #endif // IGL_VULKAN_HAS_LEGACY_RENDERPASS // new code path for vkCreateRenderPass2() std::vector attachments2_; std::vector refsColor2_; std::vector refsColorResolve2_; VkAttachmentReference2 refDepth2_ = {}; VkAttachmentReference2 refDepthResolve2_ = {}; uint32_t viewMask_ = 0; uint32_t correlationMask_ = 0; }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanSemaphore.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "VulkanSemaphore.h" #include namespace igl::vulkan { VulkanSemaphore::VulkanSemaphore(const VulkanFunctionTable& vf, VkDevice device, bool exportable, const char* debugName) : vf_(&vf), device_(device), exportable_(exportable) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); const VkExportSemaphoreCreateInfo exportInfo = { .sType = VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO, .handleTypes = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT, }; const VkSemaphoreCreateInfo ci = { .sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, .pNext = exportable ? &exportInfo : nullptr, .flags = 0, }; VK_ASSERT(vf_->vkCreateSemaphore(device_, &ci, nullptr, &vkSemaphore_)); VK_ASSERT(ivkSetDebugObjectName( vf_, device_, VK_OBJECT_TYPE_SEMAPHORE, (uint64_t)vkSemaphore_, debugName)); } VulkanSemaphore::VulkanSemaphore(const VulkanFunctionTable& vf, VkDevice device, uint64_t initialValue, bool exportable, const char* debugName) : vf_(&vf), device_(device), exportable_(exportable) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); const VkExportSemaphoreCreateInfo exportInfo = { .sType = VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO, .handleTypes = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT, }; const VkSemaphoreTypeCreateInfo semaphoreTypeCreateInfo = { .sType = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO, .pNext = exportable ? &exportInfo : nullptr, .semaphoreType = VK_SEMAPHORE_TYPE_TIMELINE, .initialValue = initialValue, }; const VkSemaphoreCreateInfo ci = { .sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, .pNext = &semaphoreTypeCreateInfo, .flags = 0, }; VK_ASSERT(vf_->vkCreateSemaphore(device_, &ci, nullptr, &vkSemaphore_)); VK_ASSERT(ivkSetDebugObjectName( vf_, device_, VK_OBJECT_TYPE_SEMAPHORE, (uint64_t)vkSemaphore_, debugName)); } VulkanSemaphore ::~VulkanSemaphore() { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_DESTROY); if (device_ != VK_NULL_HANDLE) { // lifetimes of all VkSemaphore objects are managed explicitly // we do not use deferredTask() for them vf_->vkDestroySemaphore(device_, vkSemaphore_, nullptr); } } VulkanSemaphore::VulkanSemaphore(VulkanSemaphore&& other) noexcept { std::swap(vf_, other.vf_); std::swap(device_, other.device_); std::swap(vkSemaphore_, other.vkSemaphore_); std::swap(exportable_, other.exportable_); } VulkanSemaphore& VulkanSemaphore::operator=(VulkanSemaphore&& other) noexcept { VulkanSemaphore tmp(std::move(other)); std::swap(vf_, tmp.vf_); std::swap(device_, tmp.device_); std::swap(vkSemaphore_, tmp.vkSemaphore_); std::swap(exportable_, other.exportable_); return *this; } VkSemaphore VulkanSemaphore::getVkSemaphore() const noexcept { return vkSemaphore_; } // Exportable semaphores are not used right now, so exclude from coverage // FIXME_DEPRECATED_COVERAGE_EXCLUDE_START int VulkanSemaphore::getFileDescriptor() const noexcept { if (!exportable_) { return -1; } const VkSemaphoreGetFdInfoKHR fdInfo = { .sType = VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR, .pNext = nullptr, .semaphore = vkSemaphore_, .handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT, }; int fd = -1; const VkResult ok = vf_->vkGetSemaphoreFdKHR(device_, &fdInfo, &fd); if (ok == VK_SUCCESS) { return fd; } return -1; } // FIXME_DEPRECATED_COVERAGE_EXCLUDE_END } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanSemaphore.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace igl::vulkan { /** * @brief Semaphores are used to synchronize GPU-GPU tasks. The VulkanSemaphore class encapsulates * the creation and destruction of a vulkan semaphore object (VkSemaphore). It stores an opaque * handle for a newly created semaphore object and for a device object. */ class VulkanSemaphore final { public: explicit VulkanSemaphore(const VulkanFunctionTable& vf, VkDevice device, bool exportable = false, const char* debugName = nullptr); /// Create a timeline semaphore explicit VulkanSemaphore(const VulkanFunctionTable& vf, VkDevice device, uint64_t initialValue, bool exportable = false, const char* debugName = nullptr); ~VulkanSemaphore(); VulkanSemaphore(VulkanSemaphore&& other) noexcept; VulkanSemaphore& operator=(VulkanSemaphore&& other) noexcept; VulkanSemaphore(const VulkanSemaphore&) = delete; VulkanSemaphore& operator=(const VulkanSemaphore&) = delete; [[nodiscard]] VkSemaphore getVkSemaphore() const noexcept; // Exportable semaphores are not used right now, so exclude from coverage // FIXME_DEPRECATED_COVERAGE_EXCLUDE_START [[nodiscard]] int getFileDescriptor() const noexcept; // FIXME_DEPRECATED_COVERAGE_EXCLUDE_END public: // NOLINTBEGIN(readability-identifier-naming) const VulkanFunctionTable* vf_{}; VkDevice device_ = VK_NULL_HANDLE; VkSemaphore vkSemaphore_ = VK_NULL_HANDLE; bool exportable_ = false; // NOLINTEND(readability-identifier-naming) }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanShaderModule.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include namespace igl::vulkan { VulkanShaderModule::VulkanShaderModule(const VulkanFunctionTable& vf, VkDevice device, VkShaderModule shaderModule, util::SpvModuleInfo&& moduleInfo) : vf_(vf), device_(device), vkShaderModule_(shaderModule), moduleInfo_(std::move(moduleInfo)) {} VulkanShaderModule::~VulkanShaderModule() { vf_.vkDestroyShaderModule(device_, vkShaderModule_, nullptr); } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanShaderModule.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::vulkan { /** * @brief RAII wrapper for a Vulkan shader module. */ class VulkanShaderModule final { public: /** @brief Instantiates a shader module wrapper with the module and the device that owns it */ VulkanShaderModule(const VulkanFunctionTable& vf, VkDevice device, VkShaderModule shaderModule, util::SpvModuleInfo&& moduleInfo); ~VulkanShaderModule(); VulkanShaderModule(const VulkanShaderModule&) = delete; VulkanShaderModule& operator=(const VulkanShaderModule&) = delete; VulkanShaderModule(VulkanShaderModule&&) = delete; VulkanShaderModule& operator=(VulkanShaderModule&&) = delete; /** @brief Returns the underlying Vulkan shader module */ [[nodiscard]] VkShaderModule getVkShaderModule() const { return vkShaderModule_; } [[nodiscard]] const util::SpvModuleInfo& getSpvModuleInfo() const { return moduleInfo_; } private: const VulkanFunctionTable& vf_; VkDevice device_ = VK_NULL_HANDLE; VkShaderModule vkShaderModule_ = VK_NULL_HANDLE; util::SpvModuleInfo moduleInfo_ = {}; }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanStagingDevice.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include #define IGL_VULKAN_DEBUG_STAGING_DEVICE 0 using VulkanSubmitHandle = igl::vulkan::VulkanImmediateCommands::SubmitHandle; constexpr VkDeviceSize kMinStagingBufferSize = static_cast(1024u) * 1024u; namespace igl::vulkan { VulkanStagingDevice::VulkanStagingDevice(VulkanContext& ctx) : ctx_(ctx) { IGL_PROFILER_FUNCTION(); const auto& limits = ctx_.getVkPhysicalDeviceProperties().limits; // Use value of 256MB (limited by some architectures), and clamp it to the max limits maxStagingBufferSize_ = std::min(limits.maxStorageBufferRange, 256u * 1024u * 1024u); immediate = std::make_unique( ctx_.vf_, ctx_.getVkDevice(), ctx_.deviceQueues_.graphicsQueueFamilyIndex, ctx_.config_.exportableFences, ctx_.features_.has_VK_KHR_timeline_semaphore && ctx_.features_.has_VK_KHR_synchronization2, "VulkanStagingDevice::immediate_"); IGL_DEBUG_ASSERT(immediate.get()); } void VulkanStagingDevice::bufferSubData(VulkanBuffer& buffer, size_t dstOffset, size_t size, const void* data) { IGL_PROFILER_FUNCTION(); if (buffer.isMapped()) { buffer.bufferSubData(dstOffset, size, data); return; } uint32_t chunkDstOffset = dstOffset; void* copyData = const_cast(data); #if IGL_VULKAN_DEBUG_STAGING_DEVICE IGL_LOG_INFO("Upload requested for data with %u bytes\n", size); #endif while (size) { // finds a free memory block to store the data in the staging buffer MemoryRegion memoryChunk = nextFreeBlock(size, false); const VkDeviceSize copySize = std::min(static_cast(size), memoryChunk.size); #if IGL_VULKAN_DEBUG_STAGING_DEVICE IGL_LOG_INFO("\tUploading %u bytes\n", copySize); #endif auto& stagingBuffer = stagingBuffers_[memoryChunk.stagingBufferIndex]; // copy data into the staging buffer stagingBuffer->bufferSubData(memoryChunk.offset, copySize, copyData); // do the transfer const VkBufferCopy copy = { .srcOffset = memoryChunk.offset, .dstOffset = chunkDstOffset, .size = copySize, }; const auto& wrapper = immediate->acquire(); ctx_.vf_.vkCmdCopyBuffer( wrapper.cmdBuf, stagingBuffer->getVkBuffer(), buffer.getVkBuffer(), 1, ©); memoryChunk.handle = immediate->submit(wrapper); // store the submit handle with the allocation regions_.push_back(memoryChunk); size -= copySize; copyData = (uint8_t*)copyData + copySize; chunkDstOffset += copySize; } } void VulkanStagingDevice::mergeRegionsAndFreeBuffers() { uint32_t regionIndex = 0; while (regionIndex < regions_.size() && immediate->isReady(regions_[regionIndex].handle)) { auto& currRegion = regions_[regionIndex]; // set empty handle for a region, if it has finished processing // so handle.empty() check can be done later if (!currRegion.handle.empty() && immediate->isReady(currRegion.handle)) { currRegion.handle = VulkanImmediateCommands::SubmitHandle(); freeStagingBufferSize_ += currRegion.size; } // if a next region exist and is not busy if ((regionIndex + 1) < regions_.size() && regions_[regionIndex + 1].handle.empty()) { auto& nextRegion = regions_[regionIndex + 1]; // if current and next region are parts of the same buffer if (currRegion.stagingBufferIndex == nextRegion.stagingBufferIndex) { // if current and next region are adjacent memory blocks, merge them into one const bool adjacentRegions = (currRegion.size + currRegion.offset) == nextRegion.offset || (nextRegion.size + nextRegion.offset) == currRegion.offset; if (adjacentRegions) { const MemoryRegion newRegion = { .offset = std::min(currRegion.offset, nextRegion.offset), .size = currRegion.size + nextRegion.size, .alignedSize = currRegion.alignedSize, .handle = VulkanImmediateCommands::SubmitHandle(), .stagingBufferIndex = currRegion.stagingBufferIndex, }; nextRegion = newRegion; regions_.erase(regions_.begin() + regionIndex); continue; } } else { // if current and next region are not parts of the same buffer // move region with smaller staging buffer index first, so regions would eventually line up // if they have been split if (currRegion.stagingBufferIndex > nextRegion.stagingBufferIndex) { std::swap(currRegion, nextRegion); } } } // if a staging buffer is completely recovered if (currRegion.size == currRegion.alignedSize) { freeStagingBufferSize_ -= currRegion.size; // free the staging buffer stagingBuffers_[currRegion.stagingBufferIndex].reset(); // remove the region regions_.erase(regions_.begin() + regionIndex); // remove trailing empty staging buffers while (!stagingBuffers_.empty() && stagingBuffers_.back().get() == nullptr) { stagingBuffers_.pop_back(); } continue; } regionIndex++; } #if IGL_VULKAN_DEBUG_STAGING_DEVICE IGL_LOG_INFO("Regions: %d Staging buffers: %d Free space: %d\n", regions_.size(), stagingBuffers_.size(), freeStagingBufferSize_); #endif } VulkanStagingDevice::MemoryRegion VulkanStagingDevice::nextFreeBlock(VkDeviceSize size, bool contiguous) { IGL_PROFILER_FUNCTION(); const VkDeviceSize requestedAlignedSize = getAlignedSize(size); if (shouldAllocateStagingBuffer(requestedAlignedSize, contiguous)) { allocateStagingBuffer(nextSize(requestedAlignedSize)); } IGL_DEBUG_ASSERT(!regions_.empty()); #if IGL_VULKAN_DEBUG_STAGING_DEVICE IGL_LOG_INFO("nextFreeBlock() with %u bytes, aligned %u bytes\n", size, requestedAlignedSize); #endif VkDeviceSize allocatedSize = 0; // at this point, there should be a free region that can fit the requested size auto regionItr = regions_.begin(); while (regionItr != regions_.end()) { // if requested size is available or if contiguous memory is not requested if ((regionItr->size >= requestedAlignedSize || !contiguous) && (immediate->isReady(regionItr->handle))) { allocatedSize = std::min(regionItr->size, requestedAlignedSize); break; } regionItr++; } IGL_DEBUG_ASSERT(allocatedSize); if (allocatedSize) { const uint32_t newSize = regionItr->size - allocatedSize; const uint32_t newOffset = regionItr->offset + allocatedSize; const uint32_t stagingBufferIndex = regionItr->stagingBufferIndex; const MemoryRegion allocatedRegion = { .offset = regionItr->offset, .size = allocatedSize, .alignedSize = regionItr->alignedSize, .handle = VulkanImmediateCommands::SubmitHandle(), .stagingBufferIndex = stagingBufferIndex, }; // Return this region and add the remaining unused size to the regions_ deque IGL_SCOPE_EXIT { if (newSize > 0) { *regionItr = { .offset = newOffset, .size = newSize, .alignedSize = regionItr->alignedSize, .handle = VulkanImmediateCommands::SubmitHandle(), .stagingBufferIndex = stagingBufferIndex, }; } else { regions_.erase(regionItr); } }; freeStagingBufferSize_ -= allocatedSize; return allocatedRegion; } #if IGL_VULKAN_DEBUG_STAGING_DEVICE IGL_LOG_INFO( "Could not find an available block. Waiting for the staging device to become fully " "available\n"); #endif // Nothing was available. Let's wait for the entire staging buffer to become free waitAndReset(); // try to allocate a new staging buffer allocateStagingBuffer(nextSize(requestedAlignedSize)); IGL_DEBUG_ASSERT(!regions_.empty()); if (!regions_.empty()) { // if a valid region is available, return it freeStagingBufferSize_ -= requestedAlignedSize; return regions_.front(); } return {}; } void VulkanStagingDevice::getBufferSubData(const VulkanBuffer& buffer, size_t srcOffset, size_t size, void* data) { IGL_PROFILER_FUNCTION(); if (buffer.isMapped()) { buffer.getBufferSubData(srcOffset, size, data); return; } #if IGL_VULKAN_DEBUG_STAGING_DEVICE IGL_LOG_INFO("Download requested for data with %u bytes\n", size); #endif size_t chunkSrcOffset = srcOffset; auto* dstData = static_cast(data); const size_t bufferSize = size; while (size) { const MemoryRegion memoryChunk = nextFreeBlock(size, false); const VkDeviceSize copySize = std::min(static_cast(size), memoryChunk.size); // do the transfer const VkBufferCopy copy = { .srcOffset = chunkSrcOffset, .dstOffset = memoryChunk.offset, .size = copySize, }; const auto& wrapper = immediate->acquire(); auto& stagingBuffer = stagingBuffers_[memoryChunk.stagingBufferIndex]; ctx_.vf_.vkCmdCopyBuffer( wrapper.cmdBuf, buffer.getVkBuffer(), stagingBuffer->getVkBuffer(), 1, ©); // Wait for command to finish immediate->wait(immediate->submit(wrapper), ctx_.config_.fenceTimeoutNanoseconds); // Copy data into data const uint8_t* src = stagingBuffer->getMappedPtr() + memoryChunk.offset; checked_memcpy(dstData, bufferSize - chunkSrcOffset, src, copySize); size -= copySize; dstData = (uint8_t*)dstData + copySize; chunkSrcOffset += copySize; regions_.push_back(memoryChunk); } } void VulkanStagingDevice::imageData(const VulkanImage& image, TextureType type, const TextureRangeDesc& range, const TextureFormatProperties& properties, uint32_t bytesPerRow, VkImageAspectFlags aspectFlags, const void* data) { IGL_PROFILER_FUNCTION(); const bool is420 = (image.imageFormat_ == VK_FORMAT_G8_B8R8_2PLANE_420_UNORM) || (image.imageFormat_ == VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM); const uint32_t storageSize = is420 ? image.extent_.width * image.extent_.height * 3u / 2u : static_cast(properties.getBytesPerRange(range, bytesPerRow)); IGL_DEBUG_ASSERT(storageSize); // We don't support uploading image data in small chunks. If the total upload size exceeds the // the maximum allowed staging buffer size, we can't upload it IGL_DEBUG_ASSERT(storageSize <= maxStagingBufferSize_, "Image size exceeds maximum size of staging buffer"); #if IGL_VULKAN_DEBUG_STAGING_DEVICE IGL_LOG_INFO("Image upload requested for data with %u bytes\n", storageSize); #endif // get next staging buffer free offset MemoryRegion memoryChunk = nextFreeBlock(storageSize, true); IGL_DEBUG_ASSERT(memoryChunk.size >= storageSize); auto& stagingBuffer = stagingBuffers_[memoryChunk.stagingBufferIndex]; // 1. Copy the pixel data into the host visible staging buffer stagingBuffer->bufferSubData(memoryChunk.offset, storageSize, data); const auto& wrapper = immediate->acquire(); const uint32_t initialLayer = getVkLayer(type, range.face, range.layer); const uint32_t numLayers = getVkLayer(type, range.numFaces, range.numLayers); std::vector copyRegions; copyRegions.reserve(range.numMipLevels); if (is420) { // this is a prototype support implemented for a couple of multiplanar image formats IGL_DEBUG_ASSERT(range.face == 0 && range.layer == 0 && range.mipLevel == 0); IGL_DEBUG_ASSERT(range.numFaces == 1 && range.numLayers == 1 && range.numMipLevels == 1); IGL_DEBUG_ASSERT(range.x == 0 && range.y == 0 && range.z == 0); IGL_DEBUG_ASSERT(image.type_ == VK_IMAGE_TYPE_2D); IGL_DEBUG_ASSERT(image.extent_.width == range.width && image.extent_.height == range.height); const uint32_t w = image.extent_.width; const uint32_t h = image.extent_.height; ivkCmdBeginDebugUtilsLabel(&ctx_.vf_, wrapper.cmdBuf, "VulkanStagingDevice::imageData (upload YUV image data)", K_COLOR_UPLOAD_IMAGE.toFloatPtr()); VkImageAspectFlags imageAspect = VK_IMAGE_ASPECT_PLANE_0_BIT; // Luminance (1 plane) copyRegions.emplace_back(VkBufferImageCopy{ .bufferOffset = memoryChunk.offset, .imageSubresource = VkImageSubresourceLayers{ .aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT, .mipLevel = 0, .baseArrayLayer = 0, .layerCount = 1, }, .imageOffset = {0, 0, 0}, .imageExtent = {w, h, 1u}, }); // Chrominance (in 1 or 2 planes, 420 subsampled) const VkDeviceSize planeSize0 = static_cast(w) * static_cast(h); const VkDeviceSize planeSize1 = planeSize0 / 4; // subsampled if (image.imageFormat_ == VK_FORMAT_G8_B8R8_2PLANE_420_UNORM) { imageAspect |= VK_IMAGE_ASPECT_PLANE_1_BIT; copyRegions.emplace_back(VkBufferImageCopy{ .bufferOffset = memoryChunk.offset + planeSize0, .imageSubresource = VkImageSubresourceLayers{ .aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT, .mipLevel = 0, .baseArrayLayer = 0, .layerCount = 1, }, .imageOffset = {0, 0, 0}, .imageExtent = {w / 2, h / 2, 1u}, }); } else if (image.imageFormat_ == VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM) { imageAspect |= VK_IMAGE_ASPECT_PLANE_1_BIT | VK_IMAGE_ASPECT_PLANE_2_BIT; copyRegions.emplace_back(VkBufferImageCopy{ .bufferOffset = memoryChunk.offset + planeSize0, .imageSubresource = VkImageSubresourceLayers{ .aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT, .mipLevel = 0, .baseArrayLayer = 0, .layerCount = 1, }, .imageOffset = {0, 0, 0}, .imageExtent = {w / 2, h / 2, 1u}, }); copyRegions.emplace_back(VkBufferImageCopy{ .bufferOffset = memoryChunk.offset + planeSize0 + planeSize1, .imageSubresource = VkImageSubresourceLayers{ .aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT, .mipLevel = 0, .baseArrayLayer = 0, .layerCount = 1, }, .imageOffset = {0, 0, 0}, .imageExtent = {w / 2, h / 2, 1u}, }); } else { IGL_DEBUG_ABORT("Unimplemented multiplanar image format"); return; } const VkImageSubresourceRange subresourceRange = { .aspectMask = imageAspect, .baseMipLevel = 0, .levelCount = VK_REMAINING_MIP_LEVELS, .baseArrayLayer = 0, .layerCount = VK_REMAINING_ARRAY_LAYERS, }; // 1. Transition initial image layout into TRANSFER_DST_OPTIMAL ivkImageMemoryBarrier(&ctx_.vf_, wrapper.cmdBuf, image.getVkImage(), 0, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, subresourceRange); // 2. Copy the pixel data from the staging buffer into the image #if IGL_VULKAN_PRINT_COMMANDS IGL_LOG_INFO("%p vkCmdCopyBufferToImage()\n", wrapper.cmdBuf); #endif // IGL_VULKAN_PRINT_COMMANDS ctx_.vf_.vkCmdCopyBufferToImage(wrapper.cmdBuf, stagingBuffer->getVkBuffer(), image.getVkImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, static_cast(copyRegions.size()), copyRegions.data()); const VkImageLayout targetLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; // 3. Transition TRANSFER_DST_OPTIMAL into `targetLayout` ivkImageMemoryBarrier(&ctx_.vf_, wrapper.cmdBuf, image.getVkImage(), VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, targetLayout, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, subresourceRange); image.imageLayout_ = targetLayout; ivkCmdEndDebugUtilsLabel(&ctx_.vf_, wrapper.cmdBuf); // Store the allocated block with the SubmitHandle at the end of the deque memoryChunk.handle = immediate->submit(wrapper); regions_.push_back(memoryChunk); return; // end of VK_FORMAT_G8_B8R8_2PLANE_420_UNORM code path } // vkCmdCopyBufferToImage() can have only one single bit set for image aspect flags (IGL has no // way to distinguish between Depth and Stencil for combined depth/stencil image formats) const VkImageAspectFlags aspectMask = image.isDepthFormat_ ? VK_IMAGE_ASPECT_DEPTH_BIT : (image.isStencilFormat_ ? VK_IMAGE_ASPECT_STENCIL_BIT : aspectFlags); ivkCmdBeginDebugUtilsLabel(&ctx_.vf_, wrapper.cmdBuf, "VulkanStagingDevice::imageData (upload image data)", K_COLOR_UPLOAD_IMAGE.toFloatPtr()); for (auto mipLevel = range.mipLevel; mipLevel < range.mipLevel + range.numMipLevels; ++mipLevel) { const auto mipRange = range.atMipLevel(mipLevel); const uint32_t offset = static_cast(properties.getSubRangeByteOffset(range, mipRange, bytesPerRow)); const uint32_t texelsPerRow = bytesPerRow / static_cast(properties.bytesPerBlock); if (image.type_ == VK_IMAGE_TYPE_2D) { copyRegions.emplace_back(VkBufferImageCopy{ .bufferOffset = memoryChunk.offset + offset, .bufferRowLength = texelsPerRow, .imageSubresource = VkImageSubresourceLayers{ .aspectMask = aspectMask, .mipLevel = static_cast(mipLevel), .baseArrayLayer = initialLayer, .layerCount = numLayers, }, .imageOffset = {static_cast(mipRange.x), static_cast(mipRange.y), 0}, .imageExtent = {static_cast(mipRange.width), static_cast(mipRange.height), 1u}, }); } else { copyRegions.emplace_back( VkBufferImageCopy{.bufferOffset = memoryChunk.offset + offset, .bufferRowLength = texelsPerRow, .bufferImageHeight = 0, .imageSubresource = VkImageSubresourceLayers{ .aspectMask = aspectMask, .mipLevel = static_cast(mipLevel), .baseArrayLayer = initialLayer, .layerCount = numLayers, }, .imageOffset = VkOffset3D{static_cast(mipRange.x), static_cast(mipRange.y), static_cast(mipRange.z)}, .imageExtent = VkExtent3D{static_cast(mipRange.width), static_cast(mipRange.height), static_cast(mipRange.depth)}}); } } // image memory barriers should have combined image aspect flags (depth/stencil) const VkImageSubresourceRange subresourceRange = { .aspectMask = aspectFlags, .baseMipLevel = 0, .levelCount = VK_REMAINING_MIP_LEVELS, .baseArrayLayer = initialLayer, .layerCount = numLayers, }; // 1. Transition initial image layout into TRANSFER_DST_OPTIMAL ivkImageMemoryBarrier(&ctx_.vf_, wrapper.cmdBuf, image.getVkImage(), 0, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, subresourceRange); // 2. Copy the pixel data from the staging buffer into the image #if IGL_VULKAN_PRINT_COMMANDS IGL_LOG_INFO("%p vkCmdCopyBufferToImage()\n", wrapper.cmdBuf); #endif // IGL_VULKAN_PRINT_COMMANDS ctx_.vf_.vkCmdCopyBufferToImage(wrapper.cmdBuf, stagingBuffer->getVkBuffer(), image.getVkImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, static_cast(copyRegions.size()), copyRegions.data()); const bool isSampled = (image.getVkImageUsageFlags() & VK_IMAGE_USAGE_SAMPLED_BIT) != 0; const bool isStorage = (image.getVkImageUsageFlags() & VK_IMAGE_USAGE_STORAGE_BIT) != 0; const bool isColorAttachment = (image.getVkImageUsageFlags() & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) != 0; const bool isDepthStencilAttachment = (image.getVkImageUsageFlags() & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) != 0; // a ternary cascade... const VkImageLayout targetLayout = isSampled ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : (isStorage ? VK_IMAGE_LAYOUT_GENERAL : (isColorAttachment ? VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL : (isDepthStencilAttachment ? VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_UNDEFINED))); IGL_DEBUG_ASSERT(targetLayout != VK_IMAGE_LAYOUT_UNDEFINED, "Missing usage flags"); const VkAccessFlags dstAccessMask = isSampled ? VK_ACCESS_SHADER_READ_BIT : (isStorage ? VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT : (isColorAttachment ? VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT : (isDepthStencilAttachment ? VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT : 0))); // Priority ordering mirrors the targetLayout/dstAccessMask cascades above: when multiple usage // bits are set (e.g. SAMPLED | STORAGE), isSampled wins and the layout becomes // SHADER_READ_ONLY_OPTIMAL. The image will require a subsequent transition before use as an // attachment or storage, so covering only the shader stages is correct for the post-upload case. const VkPipelineStageFlags dstStageMask = isSampled ? VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT : (isStorage ? VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT : (isColorAttachment ? VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT : (isDepthStencilAttachment ? VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT : VK_PIPELINE_STAGE_ALL_COMMANDS_BIT))); // 3. Transition TRANSFER_DST_OPTIMAL into `targetLayout` ivkImageMemoryBarrier(&ctx_.vf_, wrapper.cmdBuf, image.getVkImage(), VK_ACCESS_TRANSFER_WRITE_BIT, dstAccessMask, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, targetLayout, VK_PIPELINE_STAGE_TRANSFER_BIT, dstStageMask, subresourceRange); image.imageLayout_ = targetLayout; ivkCmdEndDebugUtilsLabel(&ctx_.vf_, wrapper.cmdBuf); // Store the allocated block with the SubmitHandle at the end of the deque memoryChunk.handle = immediate->submit(wrapper); regions_.push_back(memoryChunk); } void VulkanStagingDevice::getImageData2D(VkImage srcImage, const uint32_t level, const uint32_t layer, const VkRect2D& imageRegion, TextureFormatProperties properties, VkFormat /*format*/, VkImageLayout layout, VkImageAspectFlags aspectFlags, void* data, uint32_t bytesPerRow, bool flipImageVertical) { IGL_PROFILER_FUNCTION(); IGL_DEBUG_ASSERT(layout != VK_IMAGE_LAYOUT_UNDEFINED); const bool mustRepack = bytesPerRow != 0 && bytesPerRow % properties.bytesPerBlock != 0; const auto range = TextureRangeDesc::new2D(0, 0, imageRegion.extent.width, imageRegion.extent.height); const uint32_t storageSize = static_cast( properties.getBytesPerRange(range.atMipLevel(0), mustRepack ? 0 : bytesPerRow)); // We don't support uploading image data in small chunks. If the total upload size exceeds the // the maximum allowed staging buffer size, we can't upload it IGL_DEBUG_ASSERT(storageSize <= maxStagingBufferSize_, "Image size exceeds maximum size of staging buffer"); #if IGL_VULKAN_DEBUG_STAGING_DEVICE IGL_LOG_INFO("Image download requested for data with %u bytes\n", storageSize); #endif // get next staging buffer free offset const MemoryRegion memoryChunk = nextFreeBlock(storageSize, true); IGL_DEBUG_ASSERT(memoryChunk.size >= storageSize); const auto& wrapper1 = immediate->acquire(); // 1. Transition to VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL ivkImageMemoryBarrier(&ctx_.vf_, wrapper1.cmdBuf, srcImage, 0, // srcAccessMask VK_ACCESS_TRANSFER_READ_BIT, // dstAccessMask layout, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, // wait for any previous operation VK_PIPELINE_STAGE_TRANSFER_BIT, // dstStageMask VkImageSubresourceRange{ .aspectMask = aspectFlags, .baseMipLevel = level, .levelCount = 1, .baseArrayLayer = layer, .layerCount = 1, }); auto& stagingBuffer = stagingBuffers_[memoryChunk.stagingBufferIndex]; // 2. Copy the pixel data from the image into the staging buffer const VkBufferImageCopy copy = { .bufferOffset = memoryChunk.offset, .bufferRowLength = mustRepack ? 0 : bytesPerRow / static_cast(properties.bytesPerBlock), .imageSubresource = VkImageSubresourceLayers{ .aspectMask = aspectFlags, .mipLevel = level, .baseArrayLayer = layer, .layerCount = 1, }, .imageOffset = {imageRegion.offset.x, imageRegion.offset.y, 0}, .imageExtent = {imageRegion.extent.width, imageRegion.extent.height, 1u}, }; ctx_.vf_.vkCmdCopyImageToBuffer(wrapper1.cmdBuf, srcImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, stagingBuffer->getVkBuffer(), 1, ©); // Wait for command to finish immediate->wait(immediate->submit(wrapper1), ctx_.config_.fenceTimeoutNanoseconds); // 3. Copy data from staging buffer into data if (!IGL_DEBUG_VERIFY(stagingBuffer->getMappedPtr())) { return; } const uint8_t* src = stagingBuffer->getMappedPtr() + memoryChunk.offset; uint8_t* dst = static_cast(data); // Vulkan only handles cases where row lengths are multiples of texel block size. // Must repack the data if the output data does not conform to this. if (mustRepack) { // Must repack the data. ITexture::repackData(properties, range, src, 0, dst, bytesPerRow, flipImageVertical); } else { if (flipImageVertical) { ITexture::repackData(properties, range, src, bytesPerRow, dst, bytesPerRow, true); } else { checked_memcpy(dst, storageSize, src, storageSize); } } // 4. Transition back to the initial image layout const auto& wrapper2 = immediate->acquire(); ivkImageMemoryBarrier(&ctx_.vf_, wrapper2.cmdBuf, srcImage, VK_ACCESS_TRANSFER_READ_BIT, // srcAccessMask 0, // dstAccessMask VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, layout, VK_PIPELINE_STAGE_TRANSFER_BIT, // srcStageMask VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, // dstStageMask VkImageSubresourceRange{ .aspectMask = aspectFlags, .baseMipLevel = level, .levelCount = 1, .baseArrayLayer = layer, .layerCount = 1, }); // the data should be available as we get out of this function immediate->wait(immediate->submit(wrapper2), ctx_.config_.fenceTimeoutNanoseconds); regions_.push_back(memoryChunk); freeStagingBufferSize_ += memoryChunk.size; } VkDeviceSize VulkanStagingDevice::getAlignedSize(VkDeviceSize size) const { constexpr VkDeviceSize kStagingBufferAlignment = 16; // updated to support BC7 compressed image return (size + kStagingBufferAlignment - 1) & ~(kStagingBufferAlignment - 1); } void VulkanStagingDevice::waitAndReset() { IGL_PROFILER_FUNCTION(); for (const auto region : regions_) { immediate->wait(region.handle, ctx_.config_.fenceTimeoutNanoseconds); } regions_.clear(); stagingBuffers_.clear(); freeStagingBufferSize_ = 0; } bool VulkanStagingDevice::shouldAllocateStagingBuffer(VkDeviceSize sizeNeeded, bool contiguous) const noexcept { if (regions_.empty()) { return true; } // if contiguous memory is not requested if (!contiguous) { // return true if there is no free space return freeStagingBufferSize_ == 0; } // if contiguous memory is requested and we have enough free space if (sizeNeeded <= freeStagingBufferSize_) { // loop over empty regions to find a block that is large enough auto regionItr = regions_.begin(); while (regionItr != regions_.end()) { if (regionItr->size >= sizeNeeded && regionItr->handle.empty()) { return false; } regionItr++; } } // return true if no single block can hold the requested size return true; } VkDeviceSize VulkanStagingDevice::nextSize(VkDeviceSize requestedSize) const { return std::min(std::max(getAlignedSize(requestedSize), kMinStagingBufferSize), maxStagingBufferSize_); } void VulkanStagingDevice::allocateStagingBuffer(VkDeviceSize minimumSize) { IGL_PROFILER_FUNCTION(); IGL_DEBUG_ASSERT(minimumSize <= maxStagingBufferSize_); #if IGL_VULKAN_DEBUG_STAGING_DEVICE IGL_LOG_INFO("Allocating a new staging buffer of size %u bytes\n", minimumSize); #endif const auto stagingBufferSize = minimumSize; // Increment the id used for naming the staging buffer ++stagingBufferCounter_; // Create a new staging buffer with the new size stagingBuffers_.emplace_back(std::make_unique( ctx_, ctx_.getVkDevice(), stagingBufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, IGL_FORMAT("Buffer: staging buffer #{} with {}B", stagingBufferCounter_, stagingBufferSize) .c_str())); IGL_DEBUG_ASSERT(stagingBuffers_.back().get()); // Add region that represents the entire buffer regions_.push_front({ .offset = 0, .size = stagingBufferSize, .alignedSize = stagingBufferSize, .handle = VulkanImmediateCommands::SubmitHandle(), .stagingBufferIndex = static_cast(stagingBuffers_.size()) - 1, }); freeStagingBufferSize_ += stagingBufferSize; } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanStagingDevice.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include namespace igl::vulkan { class VulkanBuffer; class VulkanContext; class VulkanImage; /** @brief Manages data transfers between the CPU and the GPU. * This class automatically allocates and uses a staging buffer when transferring data between the * CPU and device-local resources. Transfers between the CPU and host-visible resources are copied * directly to the device, without the intermediary copy to the staging buffer. The staging buffer * is lazily allocated and grows as needed when the uploaded data cannot be transferred in small * chunks and is larger than the current staging buffer's size. The maximum size of the buffer is * determined at runtime and is the minimum between VkPhysicalDeviceLimits::VkPhysicalDeviceLimits * and 256 MB. Some architectures limit the size of staging buffers to 256MB (buffers that are both * host and device visible). */ class VulkanStagingDevice final { public: explicit VulkanStagingDevice(VulkanContext& ctx); ~VulkanStagingDevice() = default; VulkanStagingDevice(const VulkanStagingDevice&) = delete; VulkanStagingDevice& operator=(const VulkanStagingDevice&) = delete; std::unique_ptr immediate; /** @brief Uploads the data at location `data` with the provided size (in bytes) to the * VulkanBuffer object on the device at offset `dstOffset`. The upload operation is asynchronous * and the data may or may not be available to the GPU when the function returns */ void bufferSubData(VulkanBuffer& buffer, size_t dstOffset, size_t size, const void* data); /** @brief Downloads the data with the provided size (in bytes) from the VulkanBuffer object on * the device, and at the offset provided, to the location referenced by the pointer `data`. The * function is synchronous and the data donwloaded from the device is expected to be available in * the location pointed by `data` upon return */ void getBufferSubData(const VulkanBuffer& buffer, size_t srcOffset, size_t size, void* data); /// @brief Uploads the texture data pointed by `data` to the VulkanImage object on the device. The /// data may span the entire texture or just part of it. The upload operation is asynchronous and /// the data may or may not be available to the GPU when the function returns void imageData(const VulkanImage& image, TextureType type, const TextureRangeDesc& range, const TextureFormatProperties& properties, uint32_t bytesPerRow, VkImageAspectFlags aspectFlags, const void* data); /** @brief Downloads the texture data from the VulkanImage object on the device to the location * pointed by `data`. The data requested may span the entire texture or just part of it. The * download operation is synchronous and the data is expected to be available at location `data` * upon return */ void getImageData2D(VkImage srcImage, uint32_t level, uint32_t layer, const VkRect2D& imageRegion, TextureFormatProperties properties, VkFormat format, VkImageLayout layout, VkImageAspectFlags aspectFlags, void* data, uint32_t bytesPerRow, bool flipImageVertical); /// @brief Returns the size of staging buffer available for use [[nodiscard]] VkDeviceSize getFreeStagingBufferSize() const { return freeStagingBufferSize_; } /// @brief Returns the maximum possible size of the staging buffer in bytes [[nodiscard]] VkDeviceSize getMaxStagingBufferSize() const { return maxStagingBufferSize_; } /// @brief Function to merge regions of the staging buffer that are contiguous, and deallocate /// unused staging buffers. void mergeRegionsAndFreeBuffers(); private: struct MemoryRegion { VkDeviceSize offset = 0u; VkDeviceSize size = 0u; VkDeviceSize alignedSize = 0u; VulkanImmediateCommands::SubmitHandle handle; uint32_t stagingBufferIndex = 0u; }; /** * @brief Searches for an available block in the staging buffer that is as large as the size * requested. If the only contiguous block of memory available is smaller than the requested size, * the function returns the amount of memory it was able to find. * * @param contiguous * if true, the function will return a region big enough to accommodate full requested size. * if false, the function may return a region smaller than the requested size. * @return The offset of the free memory block on the staging buffer and the size of the block * found. */ [[nodiscard]] MemoryRegion nextFreeBlock(VkDeviceSize size, bool contiguous); [[nodiscard]] VkDeviceSize getAlignedSize(VkDeviceSize size) const; /// @brief Waits for all memory blocks to become available and resets the staging device's /// internal state void waitAndReset(); /** * @brief Returns true if the staging buffer cannot store the size requested * @param sizeNeeded the size of the memory block requested * @param contiguous if true, the function returns true if a contiguous block of memory cannot * accommodate sizeNeeded **/ [[nodiscard]] bool shouldAllocateStagingBuffer(VkDeviceSize sizeNeeded, bool contiguous) const noexcept; /// @brief Returns the next size to allocate for the staging buffer given the requested size [[nodiscard]] VkDeviceSize nextSize(VkDeviceSize requestedSize) const; /// @brief Allocates a new staging buffer to a size that is at least as large as the requested /// size void allocateStagingBuffer(VkDeviceSize minimumSize); private: VulkanContext& ctx_; std::vector> stagingBuffers_; /// @brief available free memory in staging buffer VkDeviceSize freeStagingBufferSize_ = 0; /// @brief Maximum staging buffer size, limited by some architectures VkDeviceSize maxStagingBufferSize_ = 0; /// @brief Used to track the current staging buffer's id. Updated every time the staging buffer /// grows, it is used as the debug name for the staging buffer for easily tracking it during /// debugging uint32_t stagingBufferCounter_ = 0; /** * @brief Stores the used and unused blocks of memory in the staging buffer. There is no * distinction between used and unused blocks in the deque, as we always `wait` on each block * before using them. Older blocks are stored at the front of the deque, while used/busy * ones are stored at the end. Older blocks have a higher chance of being unused (not waiting for * the associated command buffer to finish) */ std::deque regions_; }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanSwapchain.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "VulkanSwapchain.h" #include #include #include #include namespace { struct SwapchainCapabilities { VkSurfaceCapabilitiesKHR caps = {}; std::vector formats; std::vector modes; }; uint32_t chooseSwapImageCount(const VkSurfaceCapabilitiesKHR& caps) { const uint32_t desired = caps.minImageCount + 1; const bool exceeded = caps.maxImageCount > 0 && desired > caps.maxImageCount; return exceeded ? caps.maxImageCount : desired; } bool isNativeSwapChainBGR(const std::vector& formats) { for (const auto& format : formats) { // The preferred format should be the one which is closer to the beginning of the formats // container. If BGR is encountered earlier, it should be picked as the format of choice. If RGB // happens to be earlier, take it. if (igl::vulkan::isTextureFormatRGB(format.format)) { return false; } if (igl::vulkan::isTextureFormatBGR(format.format)) { return true; } } return false; } VkSurfaceFormatKHR chooseSwapSurfaceFormat(const std::vector& formats, igl::TextureFormat textureFormat, igl::ColorSpace colorSpace) { IGL_DEBUG_ASSERT(!formats.empty()); const bool isNativeSwapchainBGR = isNativeSwapChainBGR(formats); auto vulkanTextureFormat = igl::vulkan::textureFormatToVkFormat(textureFormat); const bool isRequestedFormatBGR = igl::vulkan::isTextureFormatBGR(vulkanTextureFormat); if (isNativeSwapchainBGR != isRequestedFormatBGR) { vulkanTextureFormat = igl::vulkan::invertRedAndBlue(vulkanTextureFormat); } const auto preferred = VkSurfaceFormatKHR{vulkanTextureFormat, igl::vulkan::colorSpaceToVkColorSpace(colorSpace)}; for (const auto& curFormat : formats) { if (curFormat.format == preferred.format && curFormat.colorSpace == preferred.colorSpace) { return curFormat; } } // if we can't find a matching format and color space, fallback on matching only format for (const auto& curFormat : formats) { if (curFormat.format == preferred.format) { return curFormat; } } IGL_LOG_INFO( "The system could not find a native swap chain format that matched our designed swapchain " "format. Defaulting to first supported format.\n"); // fall back to first supported device color format. On Quest 2 it'll be VK_FORMAT_R8G8B8A8_UNORM return formats[0]; } VkPresentModeKHR chooseSwapPresentMode(const std::vector& modes) { if (std::find(modes.cbegin(), modes.cend(), VK_PRESENT_MODE_IMMEDIATE_KHR) != modes.cend()) { return VK_PRESENT_MODE_IMMEDIATE_KHR; } // On Android (Quest 2), FIFO prevents VK_ERROR_OUT_OF_DATE_KHR #if !IGL_PLATFORM_ANDROID if (std::find(modes.cbegin(), modes.cend(), VK_PRESENT_MODE_MAILBOX_KHR) != modes.cend()) { return VK_PRESENT_MODE_MAILBOX_KHR; } #endif // !IGL_PLATFORM_ANDROID return VK_PRESENT_MODE_FIFO_KHR; } VkImageUsageFlags chooseUsageFlags(const VulkanFunctionTable& vf, VkPhysicalDevice pd, VkSurfaceKHR surface, VkFormat format, VkSurfaceCapabilitiesKHR& caps) { VkImageUsageFlags usageFlags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT; VK_ASSERT(vf.vkGetPhysicalDeviceSurfaceCapabilitiesKHR(pd, surface, &caps)); const bool isStorageSupported = (caps.supportedUsageFlags & VK_IMAGE_USAGE_STORAGE_BIT) > 0; VkFormatProperties props = {}; vf.vkGetPhysicalDeviceFormatProperties(pd, format, &props); const bool isTilingOptimalSupported = (props.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) > 0; if (isStorageSupported && isTilingOptimalSupported) { usageFlags |= VK_IMAGE_USAGE_STORAGE_BIT; } return usageFlags; } } // namespace namespace igl::vulkan { VulkanSwapchain::VulkanSwapchain(VulkanContext& ctx, uint32_t width, uint32_t height) : ctx_(ctx), graphicsQueue_(ctx.deviceQueues_.graphicsQueue), width_(width), height_(height) { surfaceFormat_ = chooseSwapSurfaceFormat(ctx.deviceSurfaceFormats_, ctx.config_.requestedSwapChainTextureFormat, ctx.config_.swapChainColorSpace); IGL_LOG_DEBUG( "Swapchain format: %s; colorSpace: %s\n", TextureFormatProperties::fromTextureFormat(vkFormatToTextureFormat(surfaceFormat_.format)) .name, colorSpaceToString(vkColorSpaceToColorSpace(surfaceFormat_.colorSpace))); IGL_DEBUG_ASSERT( ctx.vkSurface_ != VK_NULL_HANDLE, "You are trying to create a swapchain but your OS surface is empty. Did you want to " "create an offscreen rendering context? If so, set 'width' and 'height' to 0 when you " "create your igl::IDevice"); VkBool32 queueFamilySupportsPresentation = VK_FALSE; VK_ASSERT( ctx_.vf_.vkGetPhysicalDeviceSurfaceSupportKHR(ctx.getVkPhysicalDevice(), ctx.deviceQueues_.graphicsQueueFamilyIndex, ctx.vkSurface_, &queueFamilySupportsPresentation)); IGL_DEBUG_ASSERT(queueFamilySupportsPresentation == VK_TRUE, "The queue family used with the swapchain does not support presentation"); const VkImageUsageFlags usageFlags = chooseUsageFlags(ctx.vf_, ctx.getVkPhysicalDevice(), ctx.vkSurface_, surfaceFormat_.format, ctx.deviceSurfaceCaps_); { const uint32_t requestedSwapchainImageCount = chooseSwapImageCount(ctx.deviceSurfaceCaps_); VK_ASSERT(ivkCreateSwapchain(&ctx_.vf_, ctx.getVkDevice(), ctx.vkSurface_, requestedSwapchainImageCount, surfaceFormat_, chooseSwapPresentMode(ctx.devicePresentModes_), &ctx.deviceSurfaceCaps_, usageFlags, ctx.deviceQueues_.graphicsQueueFamilyIndex, width, height, &swapchain_)); } VK_ASSERT(ctx.vf_.vkGetSwapchainImagesKHR( ctx.getVkDevice(), swapchain_, &numSwapchainImages_, nullptr)); std::vector swapchainImages(numSwapchainImages_); swapchainImages.resize(numSwapchainImages_); VK_ASSERT(ctx.vf_.vkGetSwapchainImagesKHR( ctx.getVkDevice(), swapchain_, &numSwapchainImages_, swapchainImages.data())); IGL_DEBUG_ASSERT(numSwapchainImages_ > 0); // Prevent underflow when doing (frameNumber_ - numSwapchainImages_). // Every resource submitted in the frame (frameNumber_ - numSwapchainImages_) or earlier is // guaranteed to be processed by the GPU in the frame (frameNumber_). frameNumber_ = numSwapchainImages_; // create images, image views and framebuffers swapchainTextures_ = std::make_unique[]>(numSwapchainImages_); for (uint32_t i = 0; i < numSwapchainImages_; i++) { auto image = VulkanImage(ctx_, swapchainImages[i], IGL_FORMAT("Image: swapchain #{}", i).c_str()); image.extent_ = {.width = width, .height = height, .depth = 1}; // set usage flags for retrieved images image.usageFlags_ = usageFlags; image.imageFormat_ = surfaceFormat_.format; auto imageView = image.createImageView(VK_IMAGE_VIEW_TYPE_2D, surfaceFormat_.format, VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0, 1, IGL_FORMAT("Image View: swapchain #{}", i).c_str()); swapchainTextures_[i] = std::make_shared(std::move(image), std::move(imageView)); } // create semaphores and fences for swapchain images for (uint32_t i = 0; i < numSwapchainImages_; ++i) { timelineWaitValues.emplace_back(0); acquireSemaphores.emplace_back(ctx_.vf_, ctx_.getVkDevice(), false, IGL_FORMAT("Semaphore: swapchain-acquire #{}", i).c_str()); if (!ctx_.timelineSemaphore_) { // this can be removed once we switch to timeline semaphores acquireFences.emplace_back(ctx_.vf_, ctx_.getVkDevice(), VK_FENCE_CREATE_SIGNALED_BIT, false, IGL_FORMAT("Fence: swapchain-acquire #{}", i).c_str()); } } } VkImage VulkanSwapchain::getDepthVkImage() const { if (!depthTexture_) { lazyAllocateDepthBuffer(); } return depthTexture_->image_.getVkImage(); } VkImageView VulkanSwapchain::getDepthVkImageView() const { if (!depthTexture_) { lazyAllocateDepthBuffer(); } return depthTexture_->imageView_.getVkImageView(); } void VulkanSwapchain::lazyAllocateDepthBuffer() const { IGL_DEBUG_ASSERT(!depthTexture_); const VkFormat depthFormat = #if IGL_PLATFORM_APPLE VK_FORMAT_D32_SFLOAT; #else VK_FORMAT_D24_UNORM_S8_UINT; #endif const VkImageAspectFlags aspectMask = #if IGL_PLATFORM_APPLE VK_IMAGE_ASPECT_DEPTH_BIT; #else VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT; #endif auto depthImage = VulkanImage(ctx_, VkExtent3D{width_, height_, 1}, VK_IMAGE_TYPE_2D, depthFormat, 1, 1, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, 0, VK_SAMPLE_COUNT_1_BIT, "Image: swapchain depth"); auto depthImageView = depthImage.createImageView( VK_IMAGE_VIEW_TYPE_2D, depthFormat, aspectMask, 0, 1, 0, 1, "Image View: swapchain depth"); depthTexture_ = std::make_shared(std::move(depthImage), std::move(depthImageView)); } VkSemaphore VulkanSwapchain::getSemaphore() const noexcept { return acquireSemaphores[currentSemaphoreIndex_].vkSemaphore_; } VulkanSwapchain::~VulkanSwapchain() { for (auto& fence : acquireFences) { // this can be removed once we switch to timeline semaphores fence.wait(); } ctx_.vf_.vkDestroySwapchainKHR(ctx_.getVkDevice(), swapchain_, nullptr); } Result VulkanSwapchain::acquireNextImage() { IGL_PROFILER_FUNCTION(); VkResult acquireResult = VK_SUCCESS; if (ctx_.timelineSemaphore_) { const VkSemaphoreWaitInfo waitInfo = { .sType = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO, .semaphoreCount = 1, .pSemaphores = &ctx_.timelineSemaphore_->vkSemaphore_, .pValues = &timelineWaitValues[currentImageIndex_], }; VK_ASSERT(ctx_.vf_.vkWaitSemaphoresKHR(ctx_.getVkDevice(), &waitInfo, UINT64_MAX)); VkSemaphore acquireSemaphore = acquireSemaphores[currentImageIndex_].getVkSemaphore(); // when timeout is set to UINT64_MAX, we wait until the next image has been acquired acquireResult = ctx_.vf_.vkAcquireNextImageKHR(ctx_.getVkDevice(), swapchain_, UINT64_MAX, acquireSemaphore, VK_NULL_HANDLE, ¤tImageIndex_); currentSemaphoreIndex_ = currentImageIndex_; // remove `currentSemaphoreIndex_` once we switch to timeline semaphores // (use `currentImageIndex_` instead) getNextImage_ = false; ctx_.immediate_->waitSemaphore(acquireSemaphore); } else { // this entire branch can be removed once we switch to timeline semaphores // Check whether the semaphore can be used for acquiring by waiting on the acquireFence_ // If semaphore is not VK_NULL_HANDLE it must not have any uncompleted signal or wait // operations pending // (https://vulkan.lunarg.com/doc/view/1.3.275.0/windows/1.3-extensions/vkspec.html#VUID-vkAcquireNextImageKHR-semaphore-01779) acquireFences[currentImageIndex_].wait(); acquireFences[currentImageIndex_].reset(); currentSemaphoreIndex_ = currentImageIndex_; // when timeout is set to UINT64_MAX, we wait until the next image has been acquired acquireResult = ctx_.vf_.vkAcquireNextImageKHR(ctx_.getVkDevice(), swapchain_, UINT64_MAX, acquireSemaphores[currentImageIndex_].vkSemaphore_, acquireFences[currentImageIndex_].vkFence_, ¤tImageIndex_); } if (acquireResult == VK_SUBOPTIMAL_KHR) { IGL_LOG_INFO_ONCE( "vkAcquireNextImageKHR returned VK_SUBOPTIMAL_KHR. The Vulkan swapchain is no longer " "compatible with the surface"); } else { VK_ASSERT_RETURN(acquireResult); } return Result(); } Result VulkanSwapchain::present(VkSemaphore waitSemaphore) { IGL_PROFILER_FUNCTION(); IGL_PROFILER_ZONE("vkQueuePresentKHR()", IGL_PROFILER_COLOR_PRESENT); const VkPresentInfoKHR pi = { .sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR, .waitSemaphoreCount = 1u, .pWaitSemaphores = &waitSemaphore, .swapchainCount = 1u, .pSwapchains = &swapchain_, .pImageIndices = ¤tImageIndex_, }; const VkResult presentResult = ctx_.vf_.vkQueuePresentKHR(graphicsQueue_, &pi); if (presentResult == VK_SUBOPTIMAL_KHR) { IGL_LOG_INFO_ONCE( "vkQueuePresentKHR() returned VK_SUBOPTIMAL_KHR. The Vulkan swapchain is no longer " "compatible with the surface"); } else { VK_ASSERT_RETURN(presentResult); } IGL_PROFILER_ZONE_END(); // Ready to call acquireNextImage() on the next getCurrentVulkanTexture(); getNextImage_ = true; frameNumber_++; IGL_PROFILER_FRAME(nullptr); return Result(); } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanSwapchain.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include #include #include namespace igl::vulkan { class VulkanContext; class VulkanSemaphore; class VulkanSwapchain final { public: VulkanSwapchain(VulkanContext& ctx, uint32_t width, uint32_t height); ~VulkanSwapchain(); VulkanSwapchain(const VulkanSwapchain&) = delete; VulkanSwapchain& operator=(const VulkanSwapchain&) = delete; VulkanSwapchain(VulkanSwapchain&&) = delete; VulkanSwapchain& operator=(VulkanSwapchain&&) = delete; Result acquireNextImage(); Result present(VkSemaphore waitSemaphore); VkImage getCurrentVkImage() const { if (IGL_DEBUG_VERIFY(currentImageIndex_ < numSwapchainImages_)) { return swapchainTextures_[currentImageIndex_]->image_.getVkImage(); } return VK_NULL_HANDLE; } VkImageView getCurrentVkImageView() const { if (IGL_DEBUG_VERIFY(currentImageIndex_ < numSwapchainImages_)) { return swapchainTextures_[currentImageIndex_]->imageView_.getVkImageView(); } return VK_NULL_HANDLE; } std::shared_ptr getCurrentDepthTexture() { if (!depthTexture_) { lazyAllocateDepthBuffer(); } return depthTexture_; } std::shared_ptr getCurrentVulkanTexture() { if (getNextImage_) { acquireNextImage(); getNextImage_ = false; } if (IGL_DEBUG_VERIFY(currentImageIndex_ < numSwapchainImages_)) { return swapchainTextures_[currentImageIndex_]; } return nullptr; } VkImage getDepthVkImage() const; VkImageView getDepthVkImageView() const; uint32_t getWidth() const { return width_; } uint32_t getHeight() const { return height_; } VkExtent2D getExtent() const { return VkExtent2D{width_, height_}; } VkFormat getFormatColor() const { return surfaceFormat_.format; } uint32_t getNumSwapchainImages() const { return numSwapchainImages_; } uint32_t getCurrentImageIndex() const { return currentImageIndex_; } [[nodiscard]] VkSemaphore getSemaphore() const noexcept; uint64_t getFrameNumber() const { return frameNumber_; } private: void lazyAllocateDepthBuffer() const; public: std::vector acquireSemaphores; // Used to check whether the acquire semaphore can be used for acquiring // Based on // https://github.com/corporateshark/lightweightvk/blob/36597fae5c79ad6b310e4ed8c00e8acfa38b5aca/lvk/vulkan/VulkanClasses.h#L146 std::vector acquireFences; // this can be removed once we switch to timeline // semaphores std::vector timelineWaitValues; private: const VulkanContext& ctx_; VkQueue graphicsQueue_; uint32_t width_ = 0; uint32_t height_ = 0; uint32_t numSwapchainImages_ = 0; uint32_t currentImageIndex_ = 0; // Because the next acquired image's index is obtained _after_ requesting it (along with // semaphores and fences), the index of the semaphore and fence used to synchronize the current // swapchain image is different than the `currentImageIndex_` uint32_t currentSemaphoreIndex_ = 0; uint64_t frameNumber_ = 0; // increasing continuously without bound bool getNextImage_ = true; VkSwapchainKHR swapchain_{}; std::unique_ptr[]> swapchainTextures_; mutable std::shared_ptr depthTexture_; VkSurfaceFormatKHR surfaceFormat_{}; }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanTexture.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "VulkanTexture.h" namespace igl::vulkan { VulkanTexture::VulkanTexture(VulkanImage&& image, VulkanImageView&& imageView) : image_(std::move(image)), imageView_(std::move(imageView)) { IGL_PROFILER_FUNCTION_COLOR(IGL_PROFILER_COLOR_CREATE); IGL_DEBUG_ASSERT(image_.valid()); IGL_DEBUG_ASSERT(imageView_.valid()); } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanTexture.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::vulkan { class VulkanTexture final { public: VulkanTexture(VulkanImage&& image, VulkanImageView&& imageView); ~VulkanTexture() = default; VulkanTexture(const VulkanTexture&) = delete; VulkanTexture& operator=(const VulkanTexture&) = delete; VulkanTexture(VulkanTexture&&) noexcept = default; VulkanTexture& operator=(VulkanTexture&&) noexcept = default; public: VulkanImage image_; VulkanImageView imageView_; // an index into VulkanContext::textures_ uint32_t textureId_ = 0; }; } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/VulkanVma.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once /* The following defines tell VMA to load Vulkan functions dynamically * For this to work, we need to provide pointers to vkGetInstanceProcAddr and vkGetDeviceProcAddr to * VMA using the functions VmaVulkanFunctions::vkGetInstanceProcAddr and * VmaVulkanFunctions::vkGetDeviceProcAddr */ #undef VMA_STATIC_VULKAN_FUNCTIONS #undef VMA_DYNAMIC_VULKAN_FUNCTIONS #define VMA_STATIC_VULKAN_FUNCTIONS 0 #define VMA_DYNAMIC_VULKAN_FUNCTIONS 1 /* Do not load Vulkan function prototypes, as we are loading the functions dynamically using Volk */ #if !defined(VK_NO_PROTOTYPES) #define VK_NO_PROTOTYPES #endif // !defined(VK_NO_PROTOTYPES) #if defined(IGL_CMAKE_BUILD) /* Configuration defines for vk_mem_alloc.h */ #define VMA_VULKAN_VERSION 1003000 #include #else #include #endif // IGL_CMAKE_BUILD ================================================ FILE: src/igl/vulkan/android/NativeHWBuffer.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only // @fb-only #include "NativeHWBuffer.h" #if defined(IGL_ANDROID_HWBUFFER_SUPPORTED) #include #include #include #include #include #include namespace igl::vulkan::android { namespace { uint32_t ivkGetMemoryTypeIndex(const VkPhysicalDeviceMemoryProperties& memProps, const uint32_t typeBits, const VkMemoryPropertyFlags requiredProperties) { // Search memory types to find the index with the requested properties. for (uint32_t type = 0; type < memProps.memoryTypeCount; type++) { if ((typeBits & (1 << type)) != 0) { // Test if this memory type has the required properties. const VkFlags propertyFlags = memProps.memoryTypes[type].propertyFlags; if ((propertyFlags & requiredProperties) == requiredProperties) { return type; } } } return 0; } } // namespace NativeHWTextureBuffer::NativeHWTextureBuffer(igl::vulkan::Device& device, TextureFormat format) : Super(device, format) {} NativeHWTextureBuffer::~NativeHWTextureBuffer() {} Result NativeHWTextureBuffer::create(const TextureDesc& desc) { return createHWBuffer(desc, false, false); } Result NativeHWTextureBuffer::createTextureInternal(AHardwareBuffer* hwBuffer) { if (hwBuffer == nullptr) { return Result(Result::Code::RuntimeError, "null buffer passed to create texture"); } AHardwareBuffer_Desc hwbDesc; AHardwareBuffer_describe(hwBuffer, &hwbDesc); auto& ctx = device_.getVulkanContext(); auto device = device_.getVulkanContext().getVkDevice(); VkImageCreateFlags create_flags = 0; if (hwbDesc.usage & AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT) { create_flags |= VK_IMAGE_CREATE_PROTECTED_BIT; } VkImageUsageFlags usage_flags = 0; if (hwbDesc.usage & AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE) { usage_flags |= VK_IMAGE_USAGE_SAMPLED_BIT; } if (hwbDesc.usage & AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT) { usage_flags |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; } if (hwbDesc.usage & AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER) { usage_flags |= VK_IMAGE_USAGE_STORAGE_BIT; } VkAndroidHardwareBufferFormatPropertiesANDROID ahb_format_props = { .sType = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID, .pNext = nullptr, }; VkAndroidHardwareBufferPropertiesANDROID ahb_props = { .sType = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID, .pNext = &ahb_format_props, }; VK_ASSERT(ctx.vf_.vkGetAndroidHardwareBufferPropertiesANDROID(device, hwBuffer, &ahb_props)); VkExternalFormatANDROID external_format = { .sType = VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID, }; if (ahb_format_props.format == VK_FORMAT_UNDEFINED) { external_format.externalFormat = ahb_format_props.externalFormat; } VkExternalMemoryImageCreateInfo external_memory_image_info = { .sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO, .pNext = &external_format, .handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID, }; auto desc = TextureDesc::newNativeHWBufferImage( igl::vulkan::vkFormatToTextureFormat(ahb_format_props.format), igl::android::getIglBufferUsage(hwbDesc.usage), hwbDesc.width, hwbDesc.height); VkImage vk_image; VkImageCreateInfo vk_image_info = {.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, .pNext = &external_memory_image_info, .flags = create_flags, .imageType = VK_IMAGE_TYPE_2D, .format = ahb_format_props.format, .extent = VkExtent3D{(uint32_t)desc.width, (uint32_t)desc.height, 1}, .mipLevels = 1, .arrayLayers = 1, .samples = VK_SAMPLE_COUNT_1_BIT, .tiling = VK_IMAGE_TILING_OPTIMAL, .usage = usage_flags, .sharingMode = VK_SHARING_MODE_EXCLUSIVE, .queueFamilyIndexCount = 0, .pQueueFamilyIndices = nullptr, .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED}; // Create Vk Image. VK_ASSERT(ctx.vf_.vkCreateImage(device, &vk_image_info, nullptr, &vk_image)); if (vk_image == VK_NULL_HANDLE) { IGL_LOG_ERROR("failed to create image view format is %d and external format is %d", vk_image_info.format, external_format.externalFormat); return Result(Result::Code::RuntimeError, "Failed to create vulkan image"); } // To import memory created outside of the current Vulkan instance from an // Android hardware buffer, add a VkImportAndroidHardwareBufferInfoANDROID // structure to the pNext chain of the VkMemoryAllocateInfo structure. VkImportAndroidHardwareBufferInfoANDROID ahb_import_info = { .sType = VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID, .pNext = nullptr, .buffer = hwBuffer}; // If the VkMemoryAllocateInfo pNext chain includes a // VkMemoryDedicatedAllocateInfo structure, then that structure includes a // handle of the sole buffer or image resource that the memory can be bound // to. VkMemoryDedicatedAllocateInfo dedicated_alloc_info = { .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO, .pNext = &ahb_import_info, .image = vk_image, .buffer = VK_NULL_HANDLE}; // Find the memory type that supports the required properties. uint32_t memory_type_bits = ahb_props.memoryTypeBits; uint32_t type_index = ivkGetMemoryTypeIndex( ctx.memoryProperties, memory_type_bits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); // An instance of the VkMemoryAllocateInfo structure defines a memory import // operation. VkMemoryAllocateInfo mem_alloc_info = { .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, .pNext = &dedicated_alloc_info, // If the parameters define an import operation and the external handle type // is VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID, // allocationSize must be the size returned by // vkGetAndroidHardwareBufferPropertiesANDROID for the Android hardware // buffer. .allocationSize = ahb_props.allocationSize, .memoryTypeIndex = type_index}; // A Vulkan device operates on data in device memory via memory objects that // are represented in the API by a VkDeviceMemory handle. // Allocate memory. VkDeviceMemory vk_device_memory; VK_ASSERT(ctx.vf_.vkAllocateMemory(device, &mem_alloc_info, nullptr, &vk_device_memory)); // Attach memory to the image object. VK_ASSERT(ctx.vf_.vkBindImageMemory(device, vk_image, vk_device_memory, 0)); auto vulkanImage = VulkanImage(ctx, vk_image, "Image: videoTexture", usage_flags, false, vk_image_info.extent, vk_image_info.imageType, vk_image_info.format, vk_image_info.mipLevels, vk_image_info.arrayLayers, VK_SAMPLE_COUNT_1_BIT, true); vulkanImage.vkMemory_[0] = vk_device_memory; vulkanImage.extendedFormat_ = external_format.externalFormat; VkImageViewCreateInfo viewInfo = { .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, .image = vk_image, .viewType = VK_IMAGE_VIEW_TYPE_2D, .format = vk_image_info.format, .components = { .r = VK_COMPONENT_SWIZZLE_IDENTITY, .g = VK_COMPONENT_SWIZZLE_IDENTITY, .b = VK_COMPONENT_SWIZZLE_IDENTITY, .a = VK_COMPONENT_SWIZZLE_IDENTITY, }, .subresourceRange = {.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, .baseMipLevel = 0, .levelCount = vk_image_info.mipLevels, .baseArrayLayer = 0, .layerCount = 1}, }; viewInfo.pNext = nullptr; VkSamplerYcbcrConversionInfo conversionInfo = { .sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO, .pNext = nullptr, .conversion = VK_NULL_HANDLE, }; if (ahb_format_props.format == VK_FORMAT_UNDEFINED && external_format.externalFormat) { viewInfo.pNext = &conversionInfo; vulkanImage.samplerYcbcrConversionCreateInfo_ = { .sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO, .pNext = &external_format, .format = ahb_format_props.format, .ycbcrModel = ahb_format_props.suggestedYcbcrModel, .ycbcrRange = ahb_format_props.suggestedYcbcrRange, .components = { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, }, .xChromaOffset = ahb_format_props.suggestedXChromaOffset, .yChromaOffset = ahb_format_props.suggestedYChromaOffset, .chromaFilter = VK_FILTER_LINEAR, .forceExplicitReconstruction = VK_FALSE}; ctx.vf_.vkCreateSamplerYcbcrConversion(device, &vulkanImage.samplerYcbcrConversionCreateInfo_, nullptr, &conversionInfo.conversion); IGL_LOG_DEBUG("created sampler ycbcr conversion at %x with %d %d %d and %d", conversionInfo.conversion, ahb_format_props.suggestedYcbcrModel, ahb_format_props.suggestedYcbcrRange, ahb_format_props.suggestedXChromaOffset, ahb_format_props.suggestedYChromaOffset); } else if (igl::vulkan::getNumImagePlanes(ahb_format_props.format) > 1) { auto createInfo = ctx.getOrCreateYcbcrConversionInfo(VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM); conversionInfo.conversion = createInfo.conversion; } VulkanImageView vulkanImageView(ctx, viewInfo, "Image View: videoTexture"); auto vkTexture = device_.getVulkanContext().createTexture( std::move(vulkanImage), std::move(vulkanImageView), "SurfaceTexture"); if (!vkTexture) { return Result(Result::Code::RuntimeError, "Failed to create vulkan texture"); } desc_ = desc; // Field within the Texture class textureDesc_ = desc; // Field within the NativeHWTextureBuffer class texture_ = std::move(vkTexture); return Result{Result::Code::Ok}; } } // namespace igl::vulkan::android #endif // defined(IGL_ANDROID_HWBUFFER_SUPPORTED) ================================================ FILE: src/igl/vulkan/android/NativeHWBuffer.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @fb-only // @fb-only #pragma once #include #if defined(IGL_ANDROID_HWBUFFER_SUPPORTED) #include struct AHardwareBuffer; namespace igl::vulkan::android { typedef void AHardwareBufferHelper; // TextureBuffer encapsulates Vulkan textures class NativeHWTextureBuffer : public igl::android::INativeHWTextureBuffer, public Texture { friend class igl::vulkan::PlatformDevice; using Super = Texture; public: NativeHWTextureBuffer(igl::vulkan::Device& device, TextureFormat format); ~NativeHWTextureBuffer() override; protected: // Texture overrides Result create(const TextureDesc& desc) override; Result createTextureInternal(AHardwareBuffer* buffer) override; }; } // namespace igl::vulkan::android #endif // defined(IGL_ANDROID_HWBUFFER_SUPPORTED) ================================================ FILE: src/igl/vulkan/moltenvk/MoltenVkHelpers.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once namespace igl::vulkan { void* getCAMetalLayer(void* nsWindow); void setupMoltenVKEnvironment(); } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/moltenvk/MoltenVkHelpers.mm ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // @MARK:COVERAGE_EXCLUDE_FILE #include #if TARGET_OS_OSX #import #elif TARGET_OS_IPHONE // NOLINTNEXTLINE(facebook-unused-include-check) #import #endif #import #import #import #include #include // We store ICD files and the Frameworks in the app bundle for apps and the test bundle for XCTests. // Meanwhile Vulkan Loader uses `CFBundleGetMainBundle` to locate those ICD files // (in Vulkan-Loader/loader/loader.c). This works good with bundled Mac apps and even auxiliary // binaries in the app bundle. However for XCTest instances - the main bundle would be the bundle of // the test runner but not the actual bundle with test code. Hence we need to add this dummy // Objective-C class here in order to use `+[NSBundle bundleForClass:]` to locate the test bundle // packaged with Vulkan's manifest files, and then provide paths to the Vulkan loader by ENVs. @interface IGLVulkanBundleAccessor : NSObject @end @implementation IGLVulkanBundleAccessor @end namespace igl::vulkan { namespace { // These constants are defined in Vulkan-Loader/loader/vk_loader_platform.h constexpr const char* kVulkanResourcesDirectoryName = "vulkan"; constexpr const char* kVulkanAdditionalDriverFilesEnvKey = "VK_ADD_DRIVER_FILES"; constexpr const char* kVulkanAdditionalLayerFilesEnvKey = "VK_ADD_LAYER_PATH"; constexpr const char* kVulkanDriverConfigFileDirectoryName = "icd.d"; constexpr const char* kVulkanLayerConfigFileDirectoryName = "explicit_layer.d"; enum class VulkanConfigFileType { Driver, Layer, }; auto getAdditionalConfigFileDirectoryEnvKey(VulkanConfigFileType configFileType) { switch (configFileType) { case VulkanConfigFileType::Driver: return kVulkanAdditionalDriverFilesEnvKey; case VulkanConfigFileType::Layer: return kVulkanAdditionalLayerFilesEnvKey; } } auto getConfigFileDirectoryName(VulkanConfigFileType configFileType) { switch (configFileType) { case VulkanConfigFileType::Driver: return kVulkanDriverConfigFileDirectoryName; case VulkanConfigFileType::Layer: return kVulkanLayerConfigFileDirectoryName; } } NSString* _Nullable getVulkanConfigFileDirectoryPath(NSBundle* _Nonnull bundle, VulkanConfigFileType configFileType) { return [bundle pathForResource:@(getConfigFileDirectoryName(configFileType)) ofType:nil inDirectory:@(kVulkanResourcesDirectoryName)]; } void setEnvForAdditionalVulkanConfigFileDirectory(NSBundle* _Nonnull bundle, VulkanConfigFileType configFileType) { NSString* directoryPath = getVulkanConfigFileDirectoryPath(bundle, configFileType); if (!directoryPath) { return; } const auto* envKey = getAdditionalConfigFileDirectoryEnvKey(configFileType); const auto* envValue = directoryPath.UTF8String; ::setenv(envKey, envValue, 0 /* override */); } } // namespace void* getCAMetalLayer(void* window) { #if TARGET_OS_OSX auto* object = (__bridge NSObject*)window; if ([object isKindOfClass:[CAMetalLayer class]]) { return window; } auto layer = [CAMetalLayer layer]; NSView* view = nil; if ([object isKindOfClass:[NSView class]]) { view = (NSView*)object; } else if ([object isKindOfClass:[NSWindow class]]) { auto* nsWindow = (__bridge NSWindow*)window; auto contentView = nsWindow.contentView; layer.delegate = contentView; view = nsWindow.contentView; } else { IGL_DEBUG_ASSERT_NOT_REACHED(); return window; } view.layer = layer; view.wantsLayer = YES; NSScreen* screen = [NSScreen mainScreen]; CGFloat factor = [screen backingScaleFactor]; layer.contentsScale = factor; return (__bridge void*)layer; #elif TARGET_OS_IPHONE auto* uiView = (__bridge UIView*)window; return (__bridge void*)uiView.layer; #endif } void setupMoltenVKEnvironment() { @autoreleasepool { NSBundle* bundle = [NSBundle bundleForClass:IGLVulkanBundleAccessor.class]; setEnvForAdditionalVulkanConfigFileDirectory(bundle, VulkanConfigFileType::Driver); setEnvForAdditionalVulkanConfigFileDirectory(bundle, VulkanConfigFileType::Layer); } } } // namespace igl::vulkan ================================================ FILE: src/igl/vulkan/util/SpvConstantSpecialization.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #define IGL_COMMON_SKIP_CHECK #include #include #include #include namespace igl::vulkan::util { namespace { uint32_t makeOpCode(uint32_t opCode, uint32_t wordCount) { return opCode | (wordCount << SpvWordCountShift); } } // namespace void specializeConstants(uint32_t* spirv, size_t numBytes, const std::vector& values) { const uint32_t bound = spirv[3]; const size_t size = numBytes / sizeof(uint32_t); if (!IGL_DEBUG_VERIFY(bound < 1024 * 1024)) { return; } if (!IGL_DEBUG_VERIFY(spirv[0] == SpvMagicNumber)) { return; } std::vector idToValue(bound, kNoValue); uint32_t* instruction = spirv + 5; while (instruction < spirv + size) { const uint16_t instructionSize = static_cast(instruction[0] >> SpvWordCountShift); const uint16_t opCode = static_cast(instruction[0] & SpvOpCodeMask); switch (opCode) { case SpvOpDecorate: { constexpr uint32_t kOpDecorateTargetId = 1; constexpr uint32_t kOpDecorateDecoration = 2; constexpr uint32_t kOpDecorateOperandIds = 3; IGL_DEBUG_ASSERT(instruction + kOpDecorateDecoration <= spirv + size, "OpDecorate out of bounds"); const uint32_t decoration = instruction[kOpDecorateDecoration]; const uint32_t targetId = instruction[kOpDecorateTargetId]; IGL_DEBUG_ASSERT(targetId < bound); switch (decoration) { case SpvDecorationSpecId: { IGL_DEBUG_ASSERT(instruction + kOpDecorateOperandIds <= spirv + size, "OpDecorate out of bounds"); const uint32_t specId = instruction[kOpDecorateOperandIds]; idToValue[targetId] = values.size() > specId ? values[specId] : kNoValue; break; } default: break; } break; } case SpvOpSpecConstantFalse: case SpvOpSpecConstantTrue: { constexpr uint32_t kOpSpecConstantTrueResultId = 2; const uint32_t resultId = instruction[kOpSpecConstantTrueResultId]; const uint32_t specializedValue = idToValue[resultId]; if (specializedValue == kNoValue) { break; } instruction[0] = makeOpCode(specializedValue ? SpvOpConstantTrue : SpvOpConstantFalse, instructionSize); break; } case SpvOpSpecConstant: { constexpr uint32_t kOpSpecConstantResultId = 2; constexpr uint32_t kOpSpecConstantValue = 3; const uint32_t resultId = instruction[kOpSpecConstantResultId]; const uint32_t specializedValue = idToValue[resultId]; if (specializedValue == kNoValue) { break; } instruction[0] = makeOpCode(SpvOpConstant, instructionSize); instruction[kOpSpecConstantValue] = specializedValue; break; } default: break; } IGL_DEBUG_ASSERT(instruction + instructionSize <= spirv + size); instruction += instructionSize; } } } // namespace igl::vulkan::util ================================================ FILE: src/igl/vulkan/util/SpvConstantSpecialization.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::vulkan::util { constexpr uint32_t kNoValue = 0xffffffff; // Specializes integer, float and boolean constants in-place in the given SPIR-V binary. The value // at the given index corrosponds the specialization constants constantId. Note that while we can't // specialize OpSpecConstantOp, we could specialize OpSpecConstantComposite, but we would need // support for variable size spec-constant values. void specializeConstants(uint32_t* spirv, size_t numBytes, const std::vector& values); } // namespace igl::vulkan::util ================================================ FILE: src/igl/vulkan/util/SpvReflection.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #define IGL_COMMON_SKIP_CHECK #include namespace igl::vulkan::util { namespace { struct SpirvId { uint32_t opCode = 0; uint32_t typeId = 0; uint32_t storageClass = 0; uint32_t binding = kNoBindingLocation; uint32_t dset = kNoDescriptorSet; TextureType type = TextureType::Invalid; bool isStorageImage = false; uint32_t imageFormat = SpvImageFormatUnknown; }; struct ImageDimensionality { enum : uint32_t { kDim1d = 0, kDim2d = 1, kDim3d = 2, kDimCube = 3, kDimRect = 4, kDim2dExternal = 666, // Doesn't exist in SPIR-V, but needed for Android. kDim2dExternalYuv = 667, // Doesn't exist in SPIR-V, but needed for Android. }; }; TextureType getIGLTextureType(uint32_t dim, bool isArrayed) { switch (dim) { case ImageDimensionality::kDim2d: return isArrayed ? TextureType::TwoDArray : TextureType::TwoD; case ImageDimensionality::kDim3d: return TextureType::ThreeD; case ImageDimensionality::kDimCube: return TextureType::Cube; case ImageDimensionality::kDim2dExternal: case ImageDimensionality::kDim2dExternalYuv: return TextureType::ExternalImage; case ImageDimensionality::kDimRect: case ImageDimensionality::kDim1d: default: return TextureType::Invalid; } } } // namespace SpvModuleInfo getReflectionData(const uint32_t* spirv, size_t numBytes) { if (!IGL_DEBUG_VERIFY(spirv)) { return {}; } // go from bytes to SPIR-V words const size_t size = numBytes / sizeof(uint32_t); constexpr uint32_t kSpvBoundOffset = 3; constexpr uint32_t kSpvHeaderSize = 5; // initial pre-checks { if (size <= kSpvHeaderSize) { return {}; } if (spirv[0] != SpvMagicNumber) { IGL_DEBUG_ABORT("Invalid SPIR-V magic word"); return {}; } } // SPIR-V spec: "all s in this module are guaranteed to satisfy: 0 < id < kBound" const uint32_t kBound = spirv[kSpvBoundOffset]; // some reasonable upper bound so that we don't try to allocate a lot of memory in case the SPIR-V // header is broken if (!IGL_DEBUG_VERIFY(kBound < 1024 * 1024)) { return {}; } std::vector ids(kBound); SpvModuleInfo info = {}; const uint32_t* words = spirv + kSpvHeaderSize; while (words < spirv + size) { const uint16_t instructionSize = uint16_t(words[0] >> SpvWordCountShift); const uint16_t opCode = uint16_t(words[0] & SpvOpCodeMask); switch (opCode) { case SpvOpDecorate: { constexpr uint32_t kOpDecorateTargetId = 1; constexpr uint32_t kOpDecorateDecoration = 2; constexpr uint32_t kOpDecorateOperandIds = 3; IGL_DEBUG_ASSERT(words + kOpDecorateDecoration <= spirv + size, "OpDecorate out of bounds"); const uint32_t decoration = words[kOpDecorateDecoration]; const uint32_t targetId = words[kOpDecorateTargetId]; IGL_DEBUG_ASSERT(targetId < kBound); switch (decoration) { case SpvDecorationBinding: { IGL_DEBUG_ASSERT(words + kOpDecorateOperandIds <= spirv + size, "OpDecorate out of bounds"); ids[targetId].binding = words[kOpDecorateOperandIds]; break; } case SpvDecorationDescriptorSet: { IGL_DEBUG_ASSERT(words + kOpDecorateOperandIds <= spirv + size, "OpDecorate out of bounds"); ids[targetId].dset = words[kOpDecorateOperandIds]; break; } default: break; } break; } case SpvOpTypeStruct: case SpvOpTypeImage: case SpvOpTypeSampler: case SpvOpTypeSampledImage: { constexpr uint32_t kOpTypeResultId = 1; IGL_DEBUG_ASSERT(words + kOpTypeResultId <= spirv + size, "OpTypeImage out of bounds"); const uint32_t targetId = words[kOpTypeResultId]; IGL_DEBUG_ASSERT(targetId < kBound); IGL_DEBUG_ASSERT(ids[targetId].opCode == 0); ids[targetId].opCode = opCode; if (opCode == SpvOpTypeSampledImage) { constexpr uint32_t kOpTypeSampledImageImageTypeId = 2; ids[targetId].typeId = words[kOpTypeSampledImageImageTypeId]; } else if (opCode == SpvOpTypeImage) { constexpr uint32_t kOpTypeImageTypeId = 1; constexpr uint32_t kOpTypeImageDim = 3; constexpr uint32_t kOpTypeImageArrayed = 5; IGL_DEBUG_ASSERT(words + kOpTypeImageArrayed <= spirv + size, "OpTypeImage out of bounds"); const uint32_t imageTypeId = words[kOpTypeImageTypeId]; const uint32_t dim = words[kOpTypeImageDim]; const bool isArray = words[kOpTypeImageArrayed] == 1u; const TextureType textureType = getIGLTextureType(dim, isArray); ids[imageTypeId].type = textureType; // The spec: https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#OpTypeImage constexpr uint32_t kOpTypeImageSampledField = 7; constexpr uint32_t kOpTypeImageFormatField = 8; const uint32_t sampledValue = (instructionSize > kOpTypeImageSampledField) ? words[kOpTypeImageSampledField] : 0; // default if missing // If sampledValue == 2, this is a storage image ids[targetId].isStorageImage = sampledValue == 2; if (instructionSize > kOpTypeImageFormatField) { ids[targetId].imageFormat = words[kOpTypeImageFormatField]; } else { ids[targetId].imageFormat = SpvImageFormatUnknown; } } break; } case SpvOpTypePointer: { constexpr uint32_t kOpTypePointerTargetId = 1; constexpr uint32_t kOpTypePointerStorageClassId = 2; constexpr uint32_t kOpTypePointerObjectTypeId = 3; IGL_DEBUG_ASSERT(words + kOpTypePointerObjectTypeId <= spirv + size, "OpTypePointer out of bounds"); const uint32_t targetId = words[kOpTypePointerTargetId]; IGL_DEBUG_ASSERT(targetId < kBound); IGL_DEBUG_ASSERT(ids[targetId].opCode == 0); ids[targetId].opCode = opCode; ids[targetId].typeId = words[kOpTypePointerObjectTypeId]; ids[targetId].storageClass = words[kOpTypePointerStorageClassId]; break; } case SpvOpConstant: { constexpr uint32_t kOpConstantTypeId = 1; constexpr uint32_t kOpConstantTargetId = 2; IGL_DEBUG_ASSERT(words + kOpConstantTargetId <= spirv + size, "OpTypePointer out of bounds"); const uint32_t targetId = words[kOpConstantTargetId]; IGL_DEBUG_ASSERT(targetId < kBound); IGL_DEBUG_ASSERT(ids[targetId].opCode == 0); ids[targetId].opCode = opCode; ids[targetId].typeId = words[kOpConstantTypeId]; break; } case SpvOpVariable: { constexpr uint32_t kOpVariableTypeId = 1; constexpr uint32_t kOpVariableTargetId = 2; constexpr uint32_t kOpVariableStorageClass = 3; IGL_DEBUG_ASSERT(words + kOpVariableStorageClass <= spirv + size, "OpVariable out of bounds"); const uint32_t targetId = words[kOpVariableTargetId]; IGL_DEBUG_ASSERT(targetId < kBound); IGL_DEBUG_ASSERT(ids[targetId].opCode == 0); ids[targetId].opCode = opCode; ids[targetId].typeId = words[kOpVariableTypeId]; ids[targetId].storageClass = words[kOpVariableStorageClass]; break; } default: break; } IGL_DEBUG_ASSERT(words + instructionSize <= spirv + size); words += instructionSize; } for (auto& id : ids) { const bool isStorage = id.storageClass == SpvStorageClassStorageBuffer; const bool isUniform = id.storageClass == SpvStorageClassUniform || id.storageClass == SpvStorageClassUniformConstant; if (id.opCode == SpvOpVariable && (isStorage || isUniform)) { IGL_DEBUG_ASSERT(ids[id.typeId].opCode == SpvOpTypePointer); IGL_DEBUG_ASSERT(ids[id.typeId].typeId < kBound); const uint32_t opCode = ids[ids[id.typeId].typeId].opCode; switch (SpvOp(opCode)) { case SpvOpTypeStruct: info.buffers.push_back({id.binding, id.dset, isStorage}); break; case SpvOpTypeImage: { const TextureType tt = ids[ids[id.typeId].typeId].type; // dimension IGL_DEBUG_ASSERT(tt != TextureType::Invalid); const bool isStorageImage = ids[ids[id.typeId].typeId].isStorageImage; if (isStorageImage) { uint32_t imgFmt = ids[ids[id.typeId].typeId].imageFormat; info.images.push_back({id.binding, id.dset, tt, imgFmt}); } else { info.textures.push_back({id.binding, id.dset, tt}); } break; } case SpvOpTypeSampler: break; case SpvOpTypeSampledImage: { IGL_DEBUG_ASSERT(ids[ids[id.typeId].typeId].typeId < kBound); IGL_DEBUG_ASSERT(ids[ids[ids[id.typeId].typeId].typeId].opCode == SpvOpTypeImage); const TextureType tt = ids[ids[ids[id.typeId].typeId].typeId].type; IGL_DEBUG_ASSERT(tt != TextureType::Invalid); info.textures.push_back({id.binding, id.dset, tt}); break; } default: break; } } if (id.opCode == SpvOpVariable && id.storageClass == SpvStorageClassPushConstant) { info.hasPushConstants = true; } } for (const auto& desc : info.buffers) { if (desc.bindingLocation != kNoBindingLocation) { info.usageMaskBuffers |= 1ul << desc.bindingLocation; } } for (const auto& desc : info.textures) { if (desc.bindingLocation != kNoBindingLocation) { info.usageMaskTextures |= 1ul << desc.bindingLocation; } } return info; } namespace { template void combineDescriptions(std::vector& out, const std::vector& c1, const std::vector& c2) { out = c1; for (const auto& desc : c2) { auto it = std::find_if(out.begin(), out.end(), [loc = desc.bindingLocation](const auto& d) { return d.bindingLocation == loc; }); if (it == out.end()) { out.emplace_back(desc); } else { IGL_DEBUG_ASSERT(desc.descriptorSet == it->descriptorSet); } } } } // namespace SpvModuleInfo mergeReflectionData(const SpvModuleInfo& info1, const SpvModuleInfo& info2) { SpvModuleInfo result; combineDescriptions(result.buffers, info1.buffers, info2.buffers); combineDescriptions(result.textures, info1.textures, info2.textures); result.hasPushConstants = info1.hasPushConstants || info2.hasPushConstants; result.usageMaskBuffers = info1.usageMaskBuffers | info2.usageMaskBuffers; result.usageMaskTextures = info1.usageMaskTextures | info2.usageMaskTextures; return result; } } // namespace igl::vulkan::util ================================================ FILE: src/igl/vulkan/util/SpvReflection.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include namespace igl::vulkan::util { constexpr uint32_t kNoBindingLocation = 0xffffffff; constexpr uint32_t kNoDescriptorSet = 0xffffffff; struct TextureDescription { uint32_t bindingLocation = kNoBindingLocation; uint32_t descriptorSet = kNoDescriptorSet; TextureType type = TextureType::Invalid; }; struct ImageDescription { uint32_t bindingLocation = kNoBindingLocation; uint32_t descriptorSet = kNoDescriptorSet; TextureType type = TextureType::Invalid; uint32_t imageFormat = 0; }; struct BufferDescription { uint32_t bindingLocation = kNoBindingLocation; uint32_t descriptorSet = kNoDescriptorSet; bool isStorage = false; }; struct SpvModuleInfo { std::vector buffers; std::vector textures; std::vector images; bool hasPushConstants = false; uint32_t usageMaskBuffers = 0; uint32_t usageMaskTextures = 0; }; SpvModuleInfo getReflectionData(const uint32_t* spirv, size_t numBytes); SpvModuleInfo mergeReflectionData(const SpvModuleInfo& info1, const SpvModuleInfo& info2); } // namespace igl::vulkan::util ================================================ FILE: src/igl/vulkan/util/TextureFormat.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #define IGL_COMMON_SKIP_CHECK namespace igl::vulkan::util { // @fb-only // NOLINTBEGIN(readability-identifier-naming) // Vulkan Defines #define VK_FORMAT_UNDEFINED 0 #define VK_FORMAT_R8_UNORM 9 #define VK_FORMAT_R16_UNORM 70 #define VK_FORMAT_R16_SFLOAT 76 #define VK_FORMAT_R16_UINT 74 #define VK_FORMAT_B5G5R5A1_UNORM_PACK16 7 #define VK_FORMAT_B5G6R5_UNORM_PACK16 5 #define VK_FORMAT_B4G4R4A4_UNORM_PACK16 3 #define VK_FORMAT_R8G8_UNORM 16 #define VK_FORMAT_R5G5B5A1_UNORM_PACK16 6 #define VK_FORMAT_B8G8R8A8_UNORM 44 #define VK_FORMAT_R8G8B8A8_UNORM 37 #define VK_FORMAT_R8G8B8A8_SRGB 43 #define VK_FORMAT_B8G8R8A8_SRGB 50 #define VK_FORMAT_R16G16_UNORM 77 #define VK_FORMAT_R16G16_SFLOAT 83 #define VK_FORMAT_R16G16_UINT 81 #define VK_FORMAT_R16G16B16A16_UNORM 91 #define VK_FORMAT_A2R10G10B10_UNORM_PACK32 58 #define VK_FORMAT_A2R10G10B10_UINT_PACK32 62 #define VK_FORMAT_A2B10G10R10_UNORM_PACK32 64 #define VK_FORMAT_R32_UINT 98 #define VK_FORMAT_R32_SFLOAT 100 #define VK_FORMAT_R32G32_SFLOAT 103 #define VK_FORMAT_R16G16B16_SFLOAT 90 #define VK_FORMAT_R16G16B16A16_SFLOAT 97 #define VK_FORMAT_R32G32B32_SFLOAT 106 #define VK_FORMAT_R32G32B32A32_UINT 107 #define VK_FORMAT_R32G32B32A32_SFLOAT 109 #define VK_FORMAT_ASTC_4x4_UNORM_BLOCK 157 #define VK_FORMAT_ASTC_4x4_SRGB_BLOCK 158 #define VK_FORMAT_ASTC_5x4_UNORM_BLOCK 159 #define VK_FORMAT_ASTC_5x4_SRGB_BLOCK 160 #define VK_FORMAT_ASTC_5x5_UNORM_BLOCK 161 #define VK_FORMAT_ASTC_5x5_SRGB_BLOCK 162 #define VK_FORMAT_ASTC_6x5_UNORM_BLOCK 163 #define VK_FORMAT_ASTC_6x5_SRGB_BLOCK 164 #define VK_FORMAT_ASTC_6x6_UNORM_BLOCK 165 #define VK_FORMAT_ASTC_6x6_SRGB_BLOCK 166 #define VK_FORMAT_ASTC_8x5_UNORM_BLOCK 167 #define VK_FORMAT_ASTC_8x5_SRGB_BLOCK 168 #define VK_FORMAT_ASTC_8x6_UNORM_BLOCK 169 #define VK_FORMAT_ASTC_8x6_SRGB_BLOCK 170 #define VK_FORMAT_ASTC_8x8_UNORM_BLOCK 171 #define VK_FORMAT_ASTC_8x8_SRGB_BLOCK 172 #define VK_FORMAT_ASTC_10x5_UNORM_BLOCK 173 #define VK_FORMAT_ASTC_10x5_SRGB_BLOCK 174 #define VK_FORMAT_ASTC_10x6_UNORM_BLOCK 175 #define VK_FORMAT_ASTC_10x6_SRGB_BLOCK 176 #define VK_FORMAT_ASTC_10x8_UNORM_BLOCK 177 #define VK_FORMAT_ASTC_10x8_SRGB_BLOCK 178 #define VK_FORMAT_ASTC_10x10_UNORM_BLOCK 179 #define VK_FORMAT_ASTC_10x10_SRGB_BLOCK 180 #define VK_FORMAT_ASTC_12x10_UNORM_BLOCK 181 #define VK_FORMAT_ASTC_12x10_SRGB_BLOCK 182 #define VK_FORMAT_ASTC_12x12_UNORM_BLOCK 183 #define VK_FORMAT_ASTC_12x12_SRGB_BLOCK 184 #define VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG 1000054000 #define VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG 1000054001 #define VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG 1000054002 #define VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG 1000054003 #define VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG 1000054004 #define VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG 1000054005 #define VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG 1000054006 #define VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG 1000054007 #define VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK 147 #define VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK 148 #define VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK 149 #define VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK 150 #define VK_FORMAT_EAC_R11G11_UNORM_BLOCK 155 #define VK_FORMAT_EAC_R11G11_SNORM_BLOCK 156 #define VK_FORMAT_EAC_R11_UNORM_BLOCK 153 #define VK_FORMAT_EAC_R11_SNORM_BLOCK 154 #define VK_FORMAT_D16_UNORM 124 #define VK_FORMAT_BC7_UNORM_BLOCK 145 #define VK_FORMAT_BC7_SRGB_BLOCK 146 #define VK_FORMAT_X8_D24_UNORM_PACK32 125 #define VK_FORMAT_D24_UNORM_S8_UINT 129 #define VK_FORMAT_S8_UINT 127 #define VK_FORMAT_D32_SFLOAT_S8_UINT 130 #define VK_FORMAT_D32_SFLOAT 126 // NOLINTEND(readability-identifier-naming) TextureFormat vkTextureFormatToTextureFormat(int32_t vkFormat) { switch (vkFormat) { case VK_FORMAT_UNDEFINED: return TextureFormat::Invalid; case VK_FORMAT_R8_UNORM: return TextureFormat::R_UNorm8; case VK_FORMAT_R16_UNORM: return TextureFormat::R_UNorm16; case VK_FORMAT_R16_SFLOAT: return TextureFormat::R_F16; case VK_FORMAT_R16_UINT: return TextureFormat::R_UInt16; case VK_FORMAT_B5G5R5A1_UNORM_PACK16: return TextureFormat::B5G5R5A1_UNorm; case VK_FORMAT_B5G6R5_UNORM_PACK16: return TextureFormat::B5G6R5_UNorm; case VK_FORMAT_B4G4R4A4_UNORM_PACK16: return TextureFormat::ABGR_UNorm4; case VK_FORMAT_R8G8_UNORM: return TextureFormat::RG_UNorm8; case VK_FORMAT_R5G5B5A1_UNORM_PACK16: return TextureFormat::R5G5B5A1_UNorm; case VK_FORMAT_B8G8R8A8_UNORM: return TextureFormat::BGRA_UNorm8; case VK_FORMAT_R8G8B8A8_UNORM: return TextureFormat::RGBA_UNorm8; case VK_FORMAT_R8G8B8A8_SRGB: return TextureFormat::RGBA_SRGB; case VK_FORMAT_B8G8R8A8_SRGB: return TextureFormat::BGRA_SRGB; case VK_FORMAT_R16G16_UNORM: return TextureFormat::RG_UNorm16; case VK_FORMAT_R16G16_SFLOAT: return TextureFormat::RG_F16; case VK_FORMAT_R16G16_UINT: return TextureFormat::RG_UInt16; case VK_FORMAT_R16G16B16A16_UNORM: return TextureFormat::RGBA_UNorm16; case VK_FORMAT_A2R10G10B10_UNORM_PACK32: return TextureFormat::RGB10_A2_UNorm_Rev; case VK_FORMAT_A2R10G10B10_UINT_PACK32: return TextureFormat::RGB10_A2_Uint_Rev; case VK_FORMAT_A2B10G10R10_UNORM_PACK32: return TextureFormat::BGR10_A2_Unorm; case VK_FORMAT_R32_SFLOAT: return TextureFormat::R_F32; case VK_FORMAT_R32_UINT: return TextureFormat::R_UInt32; case VK_FORMAT_R32G32_SFLOAT: return TextureFormat::RG_F32; case VK_FORMAT_R16G16B16_SFLOAT: return TextureFormat::RGB_F16; case VK_FORMAT_R16G16B16A16_SFLOAT: return TextureFormat::RGBA_F16; case VK_FORMAT_R32G32B32_SFLOAT: return TextureFormat::RGB_F32; case VK_FORMAT_R32G32B32A32_UINT: return TextureFormat::RGBA_UInt32; case VK_FORMAT_R32G32B32A32_SFLOAT: return TextureFormat::RGBA_F32; case VK_FORMAT_ASTC_4x4_UNORM_BLOCK: return TextureFormat::RGBA_ASTC_4x4; case VK_FORMAT_ASTC_4x4_SRGB_BLOCK: return TextureFormat::SRGB8_A8_ASTC_4x4; case VK_FORMAT_ASTC_5x4_UNORM_BLOCK: return TextureFormat::RGBA_ASTC_5x4; case VK_FORMAT_ASTC_5x4_SRGB_BLOCK: return TextureFormat::SRGB8_A8_ASTC_5x4; case VK_FORMAT_ASTC_5x5_UNORM_BLOCK: return TextureFormat::RGBA_ASTC_5x5; case VK_FORMAT_ASTC_5x5_SRGB_BLOCK: return TextureFormat::SRGB8_A8_ASTC_5x5; case VK_FORMAT_ASTC_6x5_UNORM_BLOCK: return TextureFormat::RGBA_ASTC_6x5; case VK_FORMAT_ASTC_6x5_SRGB_BLOCK: return TextureFormat::SRGB8_A8_ASTC_6x5; case VK_FORMAT_ASTC_6x6_UNORM_BLOCK: return TextureFormat::RGBA_ASTC_6x6; case VK_FORMAT_ASTC_6x6_SRGB_BLOCK: return TextureFormat::SRGB8_A8_ASTC_6x6; case VK_FORMAT_ASTC_8x5_UNORM_BLOCK: return TextureFormat::RGBA_ASTC_8x5; case VK_FORMAT_ASTC_8x5_SRGB_BLOCK: return TextureFormat::SRGB8_A8_ASTC_8x5; case VK_FORMAT_ASTC_8x6_UNORM_BLOCK: return TextureFormat::RGBA_ASTC_8x6; case VK_FORMAT_ASTC_8x6_SRGB_BLOCK: return TextureFormat::SRGB8_A8_ASTC_8x6; case VK_FORMAT_ASTC_8x8_UNORM_BLOCK: return TextureFormat::RGBA_ASTC_8x8; case VK_FORMAT_ASTC_8x8_SRGB_BLOCK: return TextureFormat::SRGB8_A8_ASTC_8x8; case VK_FORMAT_ASTC_10x5_UNORM_BLOCK: return TextureFormat::RGBA_ASTC_10x5; case VK_FORMAT_ASTC_10x5_SRGB_BLOCK: return TextureFormat::SRGB8_A8_ASTC_10x5; case VK_FORMAT_ASTC_10x6_UNORM_BLOCK: return TextureFormat::RGBA_ASTC_10x6; case VK_FORMAT_ASTC_10x6_SRGB_BLOCK: return TextureFormat::SRGB8_A8_ASTC_10x6; case VK_FORMAT_ASTC_10x8_UNORM_BLOCK: return TextureFormat::RGBA_ASTC_10x8; case VK_FORMAT_ASTC_10x8_SRGB_BLOCK: return TextureFormat::SRGB8_A8_ASTC_10x8; case VK_FORMAT_ASTC_10x10_UNORM_BLOCK: return TextureFormat::RGBA_ASTC_10x10; case VK_FORMAT_ASTC_10x10_SRGB_BLOCK: return TextureFormat::SRGB8_A8_ASTC_10x10; case VK_FORMAT_ASTC_12x10_UNORM_BLOCK: return TextureFormat::RGBA_ASTC_12x10; case VK_FORMAT_ASTC_12x10_SRGB_BLOCK: return TextureFormat::SRGB8_A8_ASTC_12x10; case VK_FORMAT_ASTC_12x12_UNORM_BLOCK: return TextureFormat::RGBA_ASTC_12x12; case VK_FORMAT_ASTC_12x12_SRGB_BLOCK: return TextureFormat::SRGB8_A8_ASTC_12x12; case VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG: return TextureFormat::RGBA_PVRTC_2BPPV1; case VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG: return TextureFormat::RGBA_PVRTC_4BPPV1; case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK: return TextureFormat::RGB8_ETC2; case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK: return TextureFormat::SRGB8_ETC2; case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK: return TextureFormat::RGB8_Punchthrough_A1_ETC2; case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK: return TextureFormat::SRGB8_Punchthrough_A1_ETC2; case VK_FORMAT_EAC_R11G11_UNORM_BLOCK: return TextureFormat::RG_EAC_UNorm; case VK_FORMAT_EAC_R11G11_SNORM_BLOCK: return TextureFormat::RG_EAC_SNorm; case VK_FORMAT_EAC_R11_UNORM_BLOCK: return TextureFormat::R_EAC_UNorm; case VK_FORMAT_EAC_R11_SNORM_BLOCK: return TextureFormat::R_EAC_SNorm; case VK_FORMAT_D16_UNORM: return TextureFormat::Z_UNorm16; case VK_FORMAT_BC7_UNORM_BLOCK: return TextureFormat::RGBA_BC7_UNORM_4x4; case VK_FORMAT_BC7_SRGB_BLOCK: return TextureFormat::RGBA_BC7_SRGB_4x4; case VK_FORMAT_X8_D24_UNORM_PACK32: return TextureFormat::Z_UNorm24; case VK_FORMAT_D24_UNORM_S8_UINT: return TextureFormat::S8_UInt_Z24_UNorm; case VK_FORMAT_S8_UINT: return TextureFormat::S_UInt8; case VK_FORMAT_D32_SFLOAT_S8_UINT: return TextureFormat::S8_UInt_Z32_UNorm; case VK_FORMAT_D32_SFLOAT: return TextureFormat::Z_UNorm32; default: IGL_DEBUG_ABORT("VkFormat value not handled: %d", (int)vkFormat); } return TextureFormat::Invalid; } } // namespace igl::vulkan::util ================================================ FILE: src/igl/vulkan/util/TextureFormat.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include namespace igl::vulkan::util { /// Converts Vulkan texture format to an IGL TextureFormat. /// @return The corresponding IGL format if known; otherwise returns TextureFormat::Invalid. TextureFormat vkTextureFormatToTextureFormat(int32_t vkFormat); } // namespace igl::vulkan::util ================================================ FILE: src/igl/win/LogDefault.cpp ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #if !IGL_PLATFORM_WINDOWS #error This file should only be compiled on Windows targets #endif // !IGL_PLATFORM_WINDOWS #include #include #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #include IGL_API int IGLWinLogDefaultHandler(IGLLogLevel logLevel, const char* IGL_RESTRICT format, va_list ap) { if (IsDebuggerPresent()) { char str[10240]; const size_t kStrSize = sizeof(str) / sizeof(str[0]); int result = vsnprintf(str, kStrSize, format, ap); OutputDebugStringA(str); if (result >= kStrSize) { OutputDebugStringA("(...message truncated.)" IGL_NEWLINE); } } // Log to non-debugger console return IGLLogDefaultHandler(logLevel, format, ap); } ================================================ FILE: src/igl/win/LogDefault.h ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #ifdef __cplusplus extern "C" { #endif // At startup, install a Win-specific log handler, so logging shows up in Visual Studio debugger: // ``` // IGLLogSetHandler(IGLWinLogDefaultHandler); // ``` IGL_API int IGLWinLogDefaultHandler(IGLLogLevel logLevel, const char* IGL_RESTRICT format, va_list ap); #ifdef __cplusplus } #endif ================================================ FILE: third-party/.gitignore ================================================ content/ deps/ .bootstrap-content.json .bootstrap-deps.json ================================================ FILE: third-party/bootstrap-content.json ================================================ [ { "name": "bistro/PropTextures", "source": { "type": "archive", "url": "https://casual-effects.com/g3d/data10/research/model/bistro/PropTextures", "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36" } }, { "name": "bistro/OtherTextures", "source": { "type": "archive", "url": "https://casual-effects.com/g3d/data10/research/model/bistro/OtherTextures", "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36" } }, { "name": "bistro/BuildingTextures", "source": { "type": "archive", "url": "https://casual-effects.com/g3d/data10/research/model/bistro/BuildingTextures", "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36" } }, { "name": "bistro/Interior", "source": { "type": "archive", "url": "https://casual-effects.com/g3d/data10/research/model/bistro/Interior.zip", "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36" } }, { "name": "bistro/Exterior", "source": { "type": "archive", "url": "https://casual-effects.com/g3d/data10/research/model/bistro/Exterior.zip", "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36" } }, { "name": "skybox_hdr", "source": { "type": "sourcefile", "url": "https://github.com/PacktPublishing/3D-Graphics-Rendering-Cookbook/raw/master/data/immenstadter_horn_2k.hdr", "user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36" } }, { "name": "glTF-Sample-Models", "source": { "type": "git", "url": "https://github.com/KhronosGroup/glTF-Sample-Models.git", "revision": "db9ff67c1116cfe28eb36320916bccd8c4127cc1" } } ] ================================================ FILE: third-party/bootstrap-deps.json ================================================ [ { "name": "meshoptimizer", "source": { "type": "git", "url": "https://github.com/zeux/meshoptimizer.git", "revision": "v1.0" } }, { "name": "glslang", "source": { "type": "git", "url": "https://github.com/KhronosGroup/glslang.git", "revision": "15.3.0" } }, { "name": "SPIRV-Headers", "source": { "type": "git", "url": "https://github.com/KhronosGroup/SPIRV-Headers.git", "revision": "cca08c63cefa129d082abca0302adcb81610b465" } }, { "name": "tinyobjloader", "source": { "type": "git", "url": "https://github.com/tinyobjloader/tinyobjloader.git", "revision": "3bb554cf74428d7db13418b4aca1b9752a1d2be8" } }, { "name": "glfw", "source": { "type": "git", "url": "https://github.com/glfw/glfw.git", "revision": "3.3.8" } }, { "name": "glew", "source": { "type": "archive", "url": "https://github.com/nigels-com/glew/releases/download/glew-2.2.0/glew-2.2.0.zip", "sha1": "f1d3f046e44a4cb62d09547cf8f053d5b16b516f" }, "postprocess": { "type": "script", "file": "glew.py" } }, { "name": "stb", "source": { "type": "git", "url": "https://github.com/nothings/stb.git", "revision": "8b5f1f37b5b75829fc72d38e7b5d4bcbf8a26d55" } }, { "name": "3D-Graphics-Rendering-Cookbook", "source": { "type": "git", "url": "https://github.com/PacktPublishing/3D-Graphics-Rendering-Cookbook.git", "revision": "9b44e0b5dc0328e635bd30edc8f4f2ba1e79be38" } }, { "name": "bc7enc", "source": { "type": "git", "url": "https://github.com/richgel999/bc7enc.git", "revision": "f66c2e489b07138f2673a2fb3d27c1aa1d565c48" }, "postprocess": { "type": "script", "file": "bc7enc.py" } }, { "name": "glm", "source": { "type": "git", "url": "https://github.com/g-truc/glm.git", "revision": "0.9.9.8" } }, { "name": "taskflow", "source": { "type": "git", "url": "https://github.com/taskflow/taskflow.git", "revision": "v3.10.0" } }, { "name": "fmt", "source": { "type": "git", "url": "https://github.com/fmtlib/fmt.git", "revision": "10.2.1" } }, { "name": "imgui", "source": { "type": "git", "url": "https://github.com/ocornut/imgui.git", "revision": "v1.91.7" } }, { "name": "volk", "source": { "type": "git", "url": "https://github.com/zeux/volk", "revision": "1.4.304" } }, { "name": "DirectX-Headers", "source": { "type": "git", "url": "https://github.com/microsoft/DirectX-Headers.git", "revision": "v1.614.0" } }, { "name": "vma", "source": { "type": "git", "url": "https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git", "revision": "v3.2.0" } }, { "name": "tracy", "source": { "type": "git", "url": "https://github.com/wolfpld/tracy.git", "revision": "v0.12.2" } }, { "name": "gtest", "source": { "type": "git", "url": "https://github.com/google/googletest.git", "revision": "v1.14.0" } }, { "name": "EGL", "source": { "type": "git", "url": "https://github.com/McNopper/EGL.git", "revision": "f20cdac3745a0d45ce8a8358ea40389278ae91e5" } }, { "name": "ios-cmake", "source": { "type": "git", "url": "https://github.com/leetal/ios-cmake.git", "revision": "04d91f6675dabb3c97df346a32f6184b0a7ef845" } }, { "name": "spark-sl", "source": { "type": "archive", "url": "https://github.com/facebook/igl/releases/download/SparkSL/SparkSL_Compiler-v0.0.1.zip", "sha1": "d636517b5fd3103f7aeca2ed6d4c9ad3e2e97964" } }, { "name": "ktx-software", "source": { "type": "git", "url": "https://github.com/KhronosGroup/KTX-Software.git", "revision": "v4.3.1", "recursive": false } }, { "name": "openxr-sdk", "source": { "type": "git", "url": "https://github.com/KhronosGroup/OpenXR-SDK.git", "sha1": "be392bf6949adeeabad5082aa79d12aacbda781f" } }, { "name": "SPIRV-Cross", "source": { "type": "git", "url": "https://github.com/KhronosGroup/SPIRV-Cross.git", "revision": "vulkan-sdk-1.4.321.0" } }, { "name": "gfxreconstruct", "source": { "type": "git", "url": "https://github.com/facebook/gfxreconstruct.git", "revision": "99a2ac03e7386c9773804c7b25a3712fd867f458" } } ] ================================================ FILE: third-party/bootstrap.py ================================================ #!/usr/bin/python3 # # https://github.com/corporateshark/bootstrapping.git # sk@linderdaum.com # # The MIT License (MIT) # Copyright (c) 2016-2025, Sergey Kosarevsky # # --- # Based on https://bitbucket.org/blippar/bootstrapping-external-libs # # The MIT License (MIT) # Copyright (c) 2016 Blippar.com Ltd # # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. from __future__ import print_function import platform import os import sys import io import shutil import subprocess import zipfile import tarfile import hashlib import json import getopt import traceback import urllib import ssl import ctypes ssl._create_default_https_context = ssl._create_unverified_context try: from urllib.request import urlparse from urllib.request import urlunparse from urllib.request import quote except ImportError: from urlparse import urlparse from urlparse import urlunparse from urllib import URLopener from urllib import quote try: import paramiko import scp scp_available = True except: scp_available = False print("WARNING: Please install the Python packages [paramiko, scp] for full script operation.") try: import lzma lzma_available = True except: print("WARNING: Python lzma library not available; extraction of .tar.xz files may not be supported.") print("Installation on Ubuntu:") print("> apt-get install python-lzma") print("Installation on Mac OS X:") print("> brew install xz") print("> pip install pyliblzma") lzma_available = False BOOTSTRAP_VERSION = "1.0.7 (2025)" class Colors: GREEN = '\033[92m' WARNING = '\033[91m' NORMAL = '\033[0m' SRC_DIR_BASE = "src" ARCHIVE_DIR_BASE = "archives" SNAPSHOT_DIR_BASE = "snapshots" BASE_DIR = os.getcwd() SRC_DIR = os.path.join(BASE_DIR, SRC_DIR_BASE) ARCHIVE_DIR = os.path.join(BASE_DIR, ARCHIVE_DIR_BASE) SNAPSHOT_DIR = os.path.join(BASE_DIR, SNAPSHOT_DIR_BASE) DEFAULT_PNUM = 3 DEBUG_OUTPUT = False FALLBACK_URL = "" USE_TAR = False USE_UNZIP = False TOOL_COMMAND_PYTHON = sys.executable if not " " in sys.executable else '"{}"'.format(sys.executable) TOOL_COMMAND_GIT = "git" TOOL_COMMAND_HG = "hg" TOOL_COMMAND_SVN = "svn" TOOL_COMMAND_PATCH = "patch" TOOL_COMMAND_TAR = "tar" TOOL_COMMAND_UNZIP = "unzip" ansi_console = True if platform.system() == "Windows": os.environ['CYGWIN'] = "nodosfilewarning" ansi_console = False if sys.getwindowsversion().major >= 10: ansi_console = True kernel32 = ctypes.windll.kernel32 handle = kernel32.GetStdHandle(-11) mode = ctypes.c_uint32() kernel32.GetConsoleMode(handle, ctypes.byref(mode)) kernel32.SetConsoleMode(handle, mode.value | 0x0004) if not sys.version_info[0] >= 3: raise ValueError("I require Python 3.0 or a later version") def log(string): print("--- " + string) def warning(string): if ansi_console: print(Colors.WARNING, "--- " + string, Colors.NORMAL) else: print("--- " + string) def dlog(string): if DEBUG_OUTPUT: print("*** " + string) def executeCommand(command, printCommand = False, quiet = False): printCommand = printCommand or DEBUG_OUTPUT out = None err = None if quiet: out = open(os.devnull, 'w') err = subprocess.STDOUT if printCommand: if DEBUG_OUTPUT: dlog(">>> " + command) else: log(">>> " + command) return subprocess.call(command, shell = True, stdout=out, stderr=err); def dieIfNonZero(res): if res != 0: raise ValueError("Command returned non-zero status: " + str(res)); def escapifyPath(path): if path.find(" ") == -1: return path if platform.system() == "Windows": return "\"" + path + "\"" return path.replace("\\ ", " ") def cloneRepository(type, url, target_name, revision, try_only_local_operations = False, recursive = True): target_dir = escapifyPath(os.path.join(SRC_DIR, target_name)) target_dir_exists = os.path.exists(target_dir) log("Cloning " + url + " to " + target_dir) if type == "hg": repo_exists = os.path.exists(os.path.join(target_dir, ".hg")) if not repo_exists: if try_only_local_operations: raise RuntimeError("Repository for " + target_name + " not found; cannot execute local operations only") if target_dir_exists: dlog("Removing directory " + target_dir + " before cloning") shutil.rmtree(target_dir) dieIfNonZero(executeCommand(TOOL_COMMAND_HG + " clone " + url + " " + target_dir)) elif not try_only_local_operations: log("Repository " + target_dir + " already exists; pulling instead of cloning") dieIfNonZero(executeCommand(TOOL_COMMAND_HG + " pull -R " + target_dir)) if revision is None: revision = "" dieIfNonZero(executeCommand(TOOL_COMMAND_HG + " update -R " + target_dir + " -C " + revision)) dieIfNonZero(executeCommand(TOOL_COMMAND_HG + " purge -R " + target_dir + " --config extensions.purge=")) elif type == "git": repo_exists = os.path.exists(os.path.join(target_dir, ".git")) if not repo_exists: if try_only_local_operations: raise RuntimeError("Repository for " + target_name + " not found; cannot execute local operations only") if target_dir_exists: dlog("Removing directory " + target_dir + " before cloning") shutil.rmtree(target_dir) if recursive: dieIfNonZero(executeCommand(TOOL_COMMAND_GIT + " clone --recursive " + url + " " + target_dir)) else: dieIfNonZero(executeCommand(TOOL_COMMAND_GIT + " clone " + url + " " + target_dir)) elif not try_only_local_operations: log("Repository " + target_dir + " already exists; fetching instead of cloning") if recursive: dieIfNonZero(executeCommand(TOOL_COMMAND_GIT + " -C " + target_dir + " fetch --recurse-submodules")) else: dieIfNonZero(executeCommand(TOOL_COMMAND_GIT + " -C " + target_dir + " fetch")) if revision is None: revision = "HEAD" dieIfNonZero(executeCommand(TOOL_COMMAND_GIT + " -C " + target_dir + " reset --hard " + revision)) dieIfNonZero(executeCommand(TOOL_COMMAND_GIT + " -C " + target_dir + " clean -fxd")) elif type == "svn": if not try_only_local_operations: # we can't do much without a server connection when dealing with SVN if target_dir_exists: dlog("Removing directory " + target_dir + " before cloning") shutil.rmtree(target_dir) dieIfNonZero(executeCommand(TOOL_COMMAND_SVN + " checkout " + url + " " + target_dir)) if revision is not None and revision != "": raise RuntimeError("Updating to revision not implemented for SVN.") else: raise ValueError("Cloning " + type + " repositories not implemented.") def decompressTarXZFile(src_filename, dst_filename): if not lzma_available: raise RuntimeError("lzma extraction not available; please install package lzma (pyliblzma) and try again") try: fs = open(src_filename, "rb") if not fs: raise RuntimeError("Opening file " + src_filename + " failed") fd = open(dst_filename, "wb") if not fd: raise RuntimeError("Opening file " + dst_filename + " failed") decompressed = lzma.decompress(fs.read()) fd.write(decompressed) finally: fs.close() fd.close() def extractFile(filename, target_dir): if os.path.exists(target_dir): shutil.rmtree(target_dir) log("Extracting file " + filename) stem, extension = os.path.splitext(os.path.basename(filename)) if extension == ".zip" or extension == "": zfile = None try: zfile = zipfile.ZipFile(filename) except zipfile.BadZipFile: warning("WARNING: Invalid ZIP file '" + filename + "'") if os.path.exists(filename) and os.path.getsize(filename) == 0: warning("WARNING: Zero-sized file was deleted. Run the script again.") os.remove(filename) else: warning("WARNING: Try deleting the cached file and run the script again.") raise RuntimeError("Invalid ZIP file '" + filename + "'") from None extract_dir = os.path.commonprefix(zfile.namelist()) hasFolder = False for fname in zfile.namelist(): if fname.find('/') != -1: hasFolder = True extract_dir_local = "" if not hasFolder: # special case, there are no folders in the archive extract_dir = "" if extract_dir == "": # deal with stupid zip files that don't contain a base directory extract_dir, extension2 = os.path.splitext(os.path.basename(filename)) extract_dir_local = extract_dir extract_dir_abs = os.path.join(SRC_DIR, extract_dir_local) try: os.mkdirs(extract_dir_abs) except: pass if not USE_UNZIP: zfile.extractall(extract_dir_abs) zfile.close() else: zfile.close() dieIfNonZero(executeCommand(TOOL_COMMAND_UNZIP + " " + filename + " -d " + extract_dir_abs)) elif extension == ".tar" or extension == ".gz" or extension == ".bz2" or extension == ".xz": if extension == ".xz":# and not lzma_available: stem2, extension2 = os.path.splitext(os.path.basename(stem)) if extension2 == ".tar": # we extract the .tar.xz file to a .tar file before we uncompress that tar_filename = os.path.join(os.path.dirname(filename), stem) decompressTarXZFile(filename, tar_filename) filename = tar_filename else: raise RuntimeError("Unable to extract .xz file that is not a .tar.xz file.") tfile = tarfile.open(filename) extract_dir = os.path.commonprefix(tfile.getnames()) extract_dir_local = "" if extract_dir == "": # deal with stupid tar files that don't contain a base directory extract_dir, extension2 = os.path.splitext(os.path.basename(filename)) extract_dir_local = extract_dir extract_dir_abs = os.path.join(SRC_DIR, extract_dir_local) try: os.mkdirs(extract_dir_abs) except: pass if not USE_TAR: tfile.extractall(extract_dir_abs) tfile.close() else: tfile.close() dieIfNonZero(executeCommand(TOOL_COMMAND_TAR + " -x -f " + filename + " -C " + extract_dir_abs)) else: raise RuntimeError("Unknown compressed file format " + extension) if platform.system() == "Windows": extract_dir = extract_dir.replace( '/', '\\' ) target_dir = target_dir.replace( '/', '\\' ) if extract_dir[-1::] == '\\': extract_dir = extract_dir[:-1] # rename extracted folder to target_dir extract_dir_abs = os.path.join(SRC_DIR, extract_dir) needRename = True if platform.system() == "Windows": needRename = extract_dir_abs.lower() != target_dir.lower() if needRename: os.rename(extract_dir_abs, target_dir) def createArchiveFromDirectory(src_dir_name, archive_name, delete_existing_archive = False): if delete_existing_archive and os.path.exists(archive_name): dlog("Removing snapshot file " + archive_name + " before creating new one") os.remove(archive_name) archive_dir = os.path.dirname(archive_name) if not os.path.isdir(archive_dir): os.mkdir(archive_dir) with tarfile.open(archive_name, "w:gz") as tar: tar.add(src_dir_name, arcname = os.path.basename(src_dir_name)) def downloadSCP(hostname, username, path, target_dir): if not scp_available: warning("ERROR: missing Python packages [paramiko, scp]; cannot continue.") raise RuntimeError("Missing Python packages [paramiko, scp]; cannot continue.") ssh = paramiko.SSHClient() ssh.load_system_host_keys() ssh.connect(hostname = hostname, username = username) scpc = scp.SCPClient(ssh.get_transport()) scpc.get(path, local_path = target_dir); def downloadProgress(cur_size, total_size): percent = int((cur_size / total_size)*100) print("[", end = "") for i in range(int(percent/2)): print("*", end = "") for i in range(int(percent/2), 50): print(".", end = "") print("] " + str(percent) + "% --- ", end = "") print("%.2f" % (cur_size / (1024*1024)), "Mb", end = "\r") def computeFileHash(filename): blocksize = 65536 hasher = hashlib.sha1() with open(filename, 'rb') as afile: buf = afile.read(blocksize) while len(buf) > 0: hasher.update(buf) buf = afile.read(blocksize) return hasher.hexdigest() def downloadFile(url, download_dir, target_dir_name, sha1_hash = None, force_download = False, user_agent = None): if not os.path.isdir(download_dir): os.mkdir(download_dir) p = urlparse(url) url = urlunparse([p[0], p[1], quote(p[2]), p[3], p[4], p[5]]) # replace special characters in the URL path filename_rel = os.path.split(p.path)[1] # get original filename target_filename = os.path.join(download_dir, filename_rel) # check SHA1 hash, if file already exists if os.path.exists(target_filename) and sha1_hash is not None and sha1_hash != "": hash_file = computeFileHash(target_filename) if hash_file != sha1_hash: log("Hash of " + target_filename + " (" + hash_file + ") does not match expected hash (" + sha1_hash + "); forcing download") force_download = True # download file if (not os.path.exists(target_filename)) or force_download: log("Downloading " + url + " to " + target_filename) if p.scheme == "ssh": downloadSCP(p.hostname, p.username, p.path, download_dir) else: opener = urllib.request.build_opener() if user_agent is not None: opener.addheaders = [('User-agent', user_agent)] f = open(target_filename, 'wb') with opener.open(url) as response: Length = response.getheader('content-length') BlockSize = 128*1024 # default value if Length: Length = int(Length) BlockSize = max(BlockSize, Length // 1000) Size = 0 while True: Buffer = response.read(BlockSize) if not Buffer: break f.write(Buffer) Size += len(Buffer) downloadProgress(Size, Length) print(); else: f.write(response.read()) f.close() else: log("Skipping download of " + url + "; already downloaded") # check SHA1 hash if sha1_hash is not None and sha1_hash != "": hash_file = computeFileHash(target_filename) if hash_file != sha1_hash: errorStr = "Hash of " + target_filename + " (" + hash_file + ") differs from expected hash (" + sha1_hash + ")" log(errorStr) raise RuntimeError(errorStr) return target_filename def downloadAndExtractFile(url, download_dir, target_dir_name, sha1_hash = None, force_download = False, user_agent = None): target_filename = downloadFile(url, download_dir, target_dir_name, sha1_hash, force_download, user_agent) extractFile(target_filename, os.path.join(SRC_DIR, target_dir_name)) def applyPatchFile(patch_name, dir_name, pnum): # we're assuming the patch was applied like in this example: # diff --exclude=".git" --exclude=".hg" -rupN ./src/AGAST/ ./src/AGAST_patched/ > ./patches/agast.patch # where the first given location is the unpatched directory, and the second location is the patched directory. log("Applying patch to " + dir_name) patch_dir = os.path.join(BASE_DIR, "patches") arguments = "-d " + os.path.join(SRC_DIR, dir_name) + " -p" + str(pnum) + " < " + os.path.join(patch_dir, patch_name) argumentsBinary = "-d " + os.path.join(SRC_DIR, dir_name) + " -p" + str(pnum) + " --binary < " + os.path.join(patch_dir, patch_name) res = executeCommand(TOOL_COMMAND_PATCH + " --dry-run " + arguments, quiet = True) if res != 0: arguments = argumentsBinary res = executeCommand(TOOL_COMMAND_PATCH + " --dry-run " + arguments, quiet = True) if res != 0: warning("ERROR: patch application failure; has this patch already been applied?") executeCommand(TOOL_COMMAND_PATCH + " --dry-run " + arguments, printCommand = True) exit(255) else: dieIfNonZero(executeCommand(TOOL_COMMAND_PATCH + " " + arguments, quiet = True)) def runPythonScript(script_name): log("Running Python script " + script_name) patch_dir = os.path.join(BASE_DIR, "patches") filename = os.path.join(patch_dir, script_name) dieIfNonZero(executeCommand(TOOL_COMMAND_PYTHON + " " + escapifyPath(filename), False)); def findToolCommand(command, paths_to_search, required = False): command_res = command found = False for path in paths_to_search: command_abs = os.path.join(path, command) if os.path.exists(command_abs): command_res = command_abs found = True break; if required and not found: warning("WARNING: command " + command + " not found, but required by script") dlog("Found '" + command + "' as " + command_res) return command_res def readJSONData(filename): try: json_data = open(filename).read() except: warning("ERROR: Could not read JSON file: " + filename) return None try: data = json.loads(json_data) except json.JSONDecodeError as e: warning("ERROR: Could not parse JSON document: {}\n {} (line {}:{})\n".format(filename, e.msg, e.lineno, e.colno)) return None except: warning("ERROR: Could not parse JSON document: " + filename) return None return data def writeJSONData(data, filename): with open(filename, 'w') as outfile: json.dump(data, outfile) def listLibraries(data): for library in data: name = library.get('name', None) if name is not None: print(name) def printOptions(): print("--------------------------------------------------------------------------------") print(BOOTSTRAP_VERSION) print("--------------------------------------------------------------------------------") print("Downloads external libraries, and applies patches or scripts if necessary.") print("If the --name argument is not provided, all available libraries will be") print("downloaded.") print("") print("Options:") print(" --list, -l List all available libraries") print(" --name, -n Specifies the name of a single library to be") print(" downloaded") print(" --name-file, -N Specifies a file that contains a (sub)set of libraries") print(" to be downloaded. One library name per line; lines") print(" starting with '#' are considered comments.") print(" --skip Specifies a name of a single library to be skipped") print(" --clean, -c Remove library directory before obtaining library") print(" --clean-all, -C Implies --clean, and also forces re-download of cached") print(" archive files") print(" --base-dir, -b Base directory, if script is called from outside of") print(" its directory") print(" --bootstrap-file Specifies the file containing the canonical bootstrap") print(" JSON data (default: bootstrap.json)") print(" --local-bootstrap-file Specifies the file containing local bootstrap JSON") print(" data (e.g. for a particular project). The data in this") print(" file will have higher precedence than the data from") print(" the canonical bootstrap file.") print(" --use-tar Use 'tar' command instead of Python standard library") print(" to extract tar archives") print(" --use-unzip Use 'unzip' command instead of Python standard library") print(" to extract zip archives") print(" --repo-snapshots Create a snapshot archive of a repository when its") print(" state changes, e.g. on a fallback location") print(" --fallback-url Fallback URL that points to an existing and already") print(" bootstrapped `external` repository that may be used to") print(" retrieve otherwise unobtainable archives or") print(" repositories. The --repo-snapshots option must be") print(" active on the fallback server. Allowed URL schemes are") print(" file://, ssh://, http://, https://, ftp://.") print(" --force-fallback Force using the fallback URL instead of the original") print(" sources") print(" --debug-output Enables extra debugging output") print(" --break-on-first-error Terminate script once the first error is encountered") print(" --version Print the script version") print("--------------------------------------------------------------------------------") def main(argv): global BASE_DIR, SRC_DIR, ARCHIVE_DIR, DEBUG_OUTPUT, FALLBACK_URL, USE_TAR, USE_UNZIP global TOOL_COMMAND_PYTHON, TOOL_COMMAND_GIT, TOOL_COMMAND_HG, TOOL_COMMAND_SVN, TOOL_COMMAND_PATCH, TOOL_COMMAND_TAR, TOOL_COMMAND_UNZIP try: opts, args = getopt.getopt( argv, "ln:N:cCb:h", ["list", "name=", "name-file=", "skip=", "clean", "clean-all", "base-dir", "bootstrap-file=", "local-bootstrap-file=", "use-tar", "use-unzip", "repo-snapshots", "fallback-url=", "force-fallback", "debug-output", "help", "break-on-first-error", "version"]) except getopt.GetoptError: printOptions() return 0 opt_names = [] name_files = [] skip_libs = [] opt_clean = False opt_clean_archives = False list_libraries = False default_bootstrap_filename = "bootstrap.json" bootstrap_filename = os.path.abspath(os.path.join(BASE_DIR, default_bootstrap_filename)) local_bootstrap_filename = "" create_repo_snapshots = False force_fallback = False break_on_first_error = False base_dir_path = "" for opt, arg in opts: if opt in ("-h", "--help"): printOptions() return 0 if opt in ("--version"): print(BOOTSTRAP_VERSION) return 0 if opt in ("-l", "--list"): list_libraries = True if opt in ("-n", "--name"): opt_names.append(arg) if opt in ("-N", "--name-file"): name_files.append(os.path.abspath(arg)) if opt in ("--skip",): skip_libs.append(arg) if opt in ("-c", "--clean"): opt_clean = True if opt in ("-C", "--clean-all"): opt_clean = True opt_clean_archives = True if opt in ("-b", "--base-dir"): base_dir_path = os.path.abspath(arg) BASE_DIR = base_dir_path SRC_DIR = os.path.join(BASE_DIR, SRC_DIR_BASE) ARCHIVE_DIR = os.path.join(BASE_DIR, ARCHIVE_DIR_BASE) bootstrap_filename = os.path.join(BASE_DIR, default_bootstrap_filename) log("Using " + arg + " as base directory") if opt in ("--bootstrap-file",): bootstrap_filename = os.path.abspath(arg) log("Using main bootstrap file " + bootstrap_filename) if opt in ("--local-bootstrap-file",): local_bootstrap_filename = os.path.abspath(arg) log("Using local bootstrap file " + local_bootstrap_filename) if opt in ("--use-tar",): USE_TAR = True if opt in ("--use-unzip",): USE_UNZIP = True if opt in ("--repo-snapshots",): create_repo_snapshots = True log("Will create repository snapshots") if opt in ("--fallback-url",): FALLBACK_URL = arg if opt in ("--force-fallback",): force_fallback = True log("Using fallback URL to fetch all libraries") if opt in ("--break-on-first-error",): break_on_first_error = True if opt in ("--debug-output",): DEBUG_OUTPUT = True if platform.system() != "Windows": # Unfortunately some IDEs do not have a proper PATH environment variable set, # so we search manually for the required tools in some obvious locations. paths_to_search = os.environ["PATH"].split(":") + ["/usr/local/bin", "/opt/local/bin", "/usr/bin"] TOOL_COMMAND_PYTHON = findToolCommand(TOOL_COMMAND_PYTHON, paths_to_search, required = True) TOOL_COMMAND_GIT = findToolCommand(TOOL_COMMAND_GIT, paths_to_search, required = True) TOOL_COMMAND_HG = findToolCommand(TOOL_COMMAND_HG, paths_to_search, required = True) TOOL_COMMAND_SVN = findToolCommand(TOOL_COMMAND_SVN, paths_to_search, required = True) TOOL_COMMAND_PATCH = findToolCommand(TOOL_COMMAND_PATCH, paths_to_search, required = True) TOOL_COMMAND_TAR = findToolCommand(TOOL_COMMAND_TAR, paths_to_search, required = USE_TAR) TOOL_COMMAND_UNZIP = findToolCommand(TOOL_COMMAND_UNZIP, paths_to_search, required = USE_UNZIP) if base_dir_path: os.chdir(base_dir_path) if name_files: for name_file in name_files: try: with open(name_file) as f: opt_names_local = [l for l in (line.strip() for line in f) if l] opt_names_local = [l for l in opt_names_local if l[0] != '#'] opt_names += opt_names_local dlog("Name file contains: " + ", ".join(opt_names_local)) except: warning("ERROR: cannot parse name file '" + name_file + "'") return -1 if force_fallback and not FALLBACK_URL: warning("Error: cannot force usage of the fallback location without specifying a fallback URL") return -1; state_filename = os.path.join(os.path.dirname(os.path.splitext(bootstrap_filename)[0]), \ "." + os.path.basename(os.path.splitext(bootstrap_filename)[0])) \ + os.path.splitext(bootstrap_filename)[1] dlog("bootstrap_filename = " + bootstrap_filename) dlog("state_filename = " + state_filename) # read canonical libraries data data = readJSONData(bootstrap_filename) if data is None: return -1; # some sanity checking for library in data: if library.get('name', None) is None: warning("ERROR: Invalid schema: library object does not have a 'name'") return -1 # read local libraries data, if available local_data = None if local_bootstrap_filename: local_data = readJSONData(local_bootstrap_filename) if local_data is None: return -1; # some sanity checking for local_library in local_data: if local_library.get('name', None) is None: warning("ERROR: Invalid schema: local library object does not have a 'name'") return -1 # merge canonical and local library data, if applicable; local libraries take precedence if local_data is not None: for local_library in local_data: local_name = local_library.get('name', None) found_canonical_library = False for n, library in enumerate(data): name = library.get('name', None) if local_name == name: data[n] = local_library # overwrite library found_canonical_library = True if not found_canonical_library: data.append(local_library) if list_libraries: listLibraries(data) return 0 sdata = [] if os.path.exists(state_filename): sdata = readJSONData(state_filename) # create source directory if not os.path.isdir(SRC_DIR): log("Creating directory " + SRC_DIR) os.mkdir(SRC_DIR) # create archive files directory if not os.path.isdir(ARCHIVE_DIR): log("Creating directory " + ARCHIVE_DIR) os.mkdir(ARCHIVE_DIR) failed_libraries = [] for library in data: name = library.get('name', None) source = library.get('source', None) post = library.get('postprocess', None) predicate = library.get('predicate', None) if (skip_libs) and (name in skip_libs): continue if (opt_names) and (not name in opt_names): continue if predicate is not None: log("Running predicate code for '" + name + "'") if eval(predicate) is not True: log("Predicate is not True for '" + name + "'; skipping library") continue lib_dir = os.path.join(SRC_DIR, name) lib_dir = lib_dir.replace(os.path.sep, '/') dlog("********** LIBRARY " + name + " **********") dlog("lib_dir = " + lib_dir + ")") # compare against cached state cached_state_ok = False if not opt_clean: for slibrary in sdata: sname = slibrary.get('name', None) if sname is not None and sname == name and slibrary == library and os.path.exists(lib_dir): cached_state_ok = True break if cached_state_ok: log("Cached state for '" + name + "' equals expected state; skipping library") continue else: # remove cached state for library sdata[:] = [s for s in sdata if not (lambda s, name : s.get('name', None) is not None and s['name'] == name)(s, name)] # create library directory, if necessary if opt_clean: log("Cleaning directory for " + name) if os.path.exists(lib_dir): shutil.rmtree(lib_dir) if not os.path.exists(lib_dir): os.makedirs(lib_dir) try: # download source if source is not None: if 'type' not in source: warning("ERROR: Invalid schema for '" + name + "': 'source' object must have a 'type'") return -1 if 'url' not in source: warning("ERROR: Invalid schema for '" + name + "': 'source' object must have a 'url'") return -1 src_type = source['type'] src_url = source['url'] if src_type == "sourcefile": sha1 = source.get('sha1', None) user_agent = source.get('user-agent', None) try: if force_fallback: raise RuntimeError downloadFile(src_url, ARCHIVE_DIR, name, sha1, force_download = opt_clean_archives, user_agent = user_agent) filename_rel = os.path.basename(src_url) shutil.copyfile( os.path.join(ARCHIVE_DIR, filename_rel), os.path.join(lib_dir, filename_rel) ) except: if FALLBACK_URL: if not force_fallback: log("WARNING: Downloading of file " + src_url + " failed; trying fallback") p = urlparse(src_url) filename_rel = os.path.split(p.path)[1] # get original filename p = urlparse(FALLBACK_URL) fallback_src_url = urlunparse([p[0], p[1], p[2] + "/" + ARCHIVE_DIR_BASE + "/" + filename_rel, p[3], p[4], p[5]]) downloadFile(fallback_src_url, ARCHIVE_DIR, name, sha1, force_download = True) shutil.copyfile( os.path.join(ARCHIVE_DIR, filename_rel), os.path.join(lib_dir, filename_rel) ) else: shutil.rmtree(lib_dir) raise elif src_type == "archive": sha1 = source.get('sha1', None) user_agent = source.get('user-agent', None) try: if force_fallback: raise RuntimeError downloadAndExtractFile(src_url, ARCHIVE_DIR, name, sha1, force_download = opt_clean_archives, user_agent = user_agent) except: if FALLBACK_URL: if not force_fallback: log("WARNING: Downloading of file " + src_url + " failed; trying fallback") p = urlparse(src_url) filename_rel = os.path.split(p.path)[1] # get original filename p = urlparse(FALLBACK_URL) fallback_src_url = urlunparse([p[0], p[1], p[2] + "/" + ARCHIVE_DIR_BASE + "/" + filename_rel, p[3], p[4], p[5]]) downloadAndExtractFile(fallback_src_url, ARCHIVE_DIR, name, sha1, force_download = True) else: raise else: revision = source.get('revision', None) recursive = source.get('recursive', True) archive_name = name + ".tar.gz" # for reading or writing of snapshot archives if revision is not None: archive_name = name + "_" + revision + ".tar.gz" try: if force_fallback: raise RuntimeError cloneRepository(src_type, src_url, name, revision, False, recursive) if create_repo_snapshots: log("Creating snapshot of library repository '" + name + "'") repo_dir = os.path.join(SRC_DIR, name) archive_filename = os.path.join(SNAPSHOT_DIR, archive_name) dlog("Snapshot will be saved as " + archive_filename) createArchiveFromDirectory(repo_dir, archive_filename, revision is None) except: if FALLBACK_URL: if not force_fallback: log("WARNING: Cloning of repository " + src_url + " failed; trying fallback") # copy archived snapshot from fallback location p = urlparse(FALLBACK_URL) fallback_src_url = urlunparse([p[0], p[1], p[2] + "/" + SNAPSHOT_DIR_BASE + "/" + archive_name, p[3], p[4], p[5]]) dlog("Looking for snapshot " + fallback_src_url + " of library repository " + name) # create snapshots files directory downloadAndExtractFile(fallback_src_url, SNAPSHOT_DIR, name, force_download = True) # reset repository state to particular revision (only using local operations inside the function) cloneRepository(src_type, src_url, name, revision, True, True) else: raise else: # set up clean directory for potential patch application shutil.rmtree(lib_dir) os.mkdir(lib_dir) # post-processing if post is not None: if 'type' not in post: warning("ERROR: Invalid schema for '" + name + "': 'postprocess' object must have a 'type'") return -1 if 'file' not in post: warning("ERROR: Invalid schema for '" + name + "': 'postprocess' object must have a 'file'") return -1 post_type = post['type'] post_file = post['file'] if post_type == "patch": applyPatchFile(post_file, name, post.get('pnum', DEFAULT_PNUM)) elif post_type == "script": runPythonScript(post_file) else: warning("ERROR: Unknown post-processing type '" + post_type + "' for " + name) return -1 # add to cached state sdata.append(library) # write out cached state writeJSONData(sdata, state_filename) except urllib.error.URLError as e: warning("ERROR: Failure to bootstrap library '" + name + "' (urllib.error.URLError: reason " + str(e.reason) + ")") if break_on_first_error: exit(-1) traceback.print_exc() failed_libraries.append(name) except: warning("ERROR: Failure to bootstrap library '" + name + "' (reason: " + str(sys.exc_info()[0]) + ")") if break_on_first_error: exit(-1) traceback.print_exc() failed_libraries.append(name) if failed_libraries: warning("***************************************") warning("FAILURE to bootstrap the following libraries:") warning(', '.join(failed_libraries)) warning("***************************************") return -1 log("Finished") # touch the state cache file os.utime(state_filename, None); return 0 if __name__ == "__main__": sys.exit(main(sys.argv[1:]))